Changing the default codepage of VFAT without rebuilding Linux kernel

Since freedesktop.org has moved its disk management facility from HAL to DeviceKit-disks (devkit-disks), I could not override the default codepage of a VFAT USB storage device. DevKit does not allow to mount VFAT with the codepage option, and it was a problem to me because I use UTF-8 as the default codepage of the Linux partitions while most VFAT partiitions and USB disks were using CP949 (codepage 949).

A known workaround for this issue is to specify the mount options in /etc/fstab explicitly, but it does not scale because USB disks change its device path very often, especially when many USB devices are plugged in.

Consequently, I wrote a simple script that puts a watch on /etc/mtab file and remount VFAT with an explicit codepage option if necessary. I start up this watcher script in my /etc/rc.local so that I don’t need to care about codepage issues anymore.

#!/bin/sh
# /usr/local/bin/vfat-watch
# Exit if running already.
if [ "x`pgrep -of 'vfat-watch'`" != "x$$" ]; then
    exit 1
fi
while true; do
  cat /etc/mtab | grep vfat | grep -v codepage | cut -d' ' -f1 | while read -r FS; do
    # Choose your preferred codepage.  949 = Korean
    mount -o remount,codepage=949 "$FS"
  done
  sleep 1
done &

Because this script scans for the mtab file every second, you might see some problem when you perform some operation on the mounted VFAT too soon, but it shouldn’t be a problem for most cases.

리눅스 커널을 리빌드하지 않고 VFAT 디폴트 코드페이지 바꾸기

Freedesktop.org 가 디스크 관리 기능 제공자를 HAL 에서 DeviceKit-disks (devkit-disks) 로 변경하여 더 이상 USB 디스크의 기본 코드페이지를 지정할 수 없게 되었습니다. DevKit 은 VFAT 을 마운트할 때 codepage 옵션을 전혀 주지 않습니다. 때문에 리눅스 기본 문자셋은 UTF-8 으로 VFAT 문자셋은 CP949 (코드페이지 949) 로 사용하는 경우에는 문제가 됩니다.

알려진 해결책은 /etc/fstab 에 마운트 옵션을 직접 적어 주는 것이 있으나, 많은 USB 장치가 연결되어 있는 경우 장치의 경로가 자주 바뀌기 때문에 유연하지가 못합니다.

그래서 /etc/mtab 를 모니터링하고 있다가 필요한 경우 codepage 옵션을 명시해 VFAT 을 다시 마운트해 주는 스크립트를 작성했습니다. 저는 이 감시 스크립트를 /etc/rc.local 에서 시작해서 코드페이지 이슈를 더 이상 신경쓸 일이 없도록 했습니다.

#!/bin/sh
# /usr/local/bin/vfat-watch
# Exit if running already.
if [ "x`pgrep -of 'vfat-watch'`" != "x$$" ]; then
    exit 1
fi
while true; do
  cat /etc/mtab | grep vfat | grep -v codepage | cut -d' ' -f1 | while read -r FS; do
    # Choose your preferred codepage.  949 = Korean
    mount -o remount,codepage=949 "$FS"
  done
  sleep 1
done &

이 스크립트는 mtab 파일을 1 초에 한 번씩 스캔하므로 마운트된 VFAT 에 너무 일찍 접근하려 할 때 문제가 생길 수 있습니다. 하지만 대부분의 경우에는 별 문제가 안 될 듯 하네요.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.