如果您的電腦是 FreeBSD 與 VFAT (Windows95/98) 或是 NTFS (Windows NT/2000) 並存, 而且又須要存取 DOS 檔案系統或是 NTFS 檔案系統的中文檔名, 或是需要讀取 Joliet (CDROM) 內的中文, 請依照以下的步驟進行。 由於 cd9660, ntfs 等都是以 16-bit Unicode (UCS-2) 作為系統編碼, 因此要顯示的時候必須轉為目前的環境編碼(Big5), 因此在顯示前必須多一層的轉碼動作才能在 Big5 的環境底下看到中文。
它會安裝三個 kernel 模組, cd9660.ko, msdos.ko(msdosfs.ko) 和 ntfs.ko, 將可以讓使用者讀取在 Joliet, VFAT 和 NTFS 檔案系統上的 中文檔名。
必須把 kernel 中的 options MSDOSFS 與 options CD9660 comment 掉,並重新 make kernel 後,並且重新開機後,才能安裝 big5fs。 因為上面的 kernel 選項會和這個 port 所安裝的 kernel 模組有衝突, 而 kernel 選項會比 kernel 模組優先, 也沒辦法關閉這些選項來讓 kernel 使用 kernel 模組, 所以就一定得重編 kernel。 不然當安裝完後,執行 big5fs.sh 就會出現 kldload: can't load cd9660: File exists 或是 module_register: module cd9660 already exists! linker_file_sysinit "cd9660.ko" failed to register! 17 之類的錯誤訊息,代表著模組有衝突,可能是已經設定為 kernel 選項, 或是已經用 kldload 載入了。
--- GENERIC.orig Fri May 16 17:39:13 2003 +++ GENERIC Wed May 28 03:37:52 2003 @@ -38,8 +38,8 @@ options MD_ROOT #MD is a potential root device options NFS #Network Filesystem options NFS_ROOT #NFS usable as root device, NFS required -options MSDOSFS #MSDOS Filesystem -options CD9660 #ISO 9660 Filesystem +#options MSDOSFS #MSDOS Filesystem +#options CD9660 #ISO 9660 Filesystem options CD9660_ROOT #CD-ROM usable as root, CD9660 required options PROCFS #Process filesystem options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!]
在安裝前先檢查 /usr/src/sys 目錄要已有了, 若沒可用 /stand/sysinstall 和安裝光碟安裝。 由於 kernel 模組和系統有相依性, 必須取得您當時安裝時的 kernel 版本才行。
安裝 chinese/big5fs。
安裝好後,執行 /usr/local/etc/rc.d/big5fs.sh 就會載入上述的模組, 好讓 mount 指令能使用這些模組,通常也會在開機時自動執行, 以防 mount 指令直接讀取了 /modules 底下的 kernel 模組。
如果不確定那些分割區可以 mount,可以用 /stand/sysinstall 的 Configure -> Label 取得。
以筆者為例,筆者有個 ad0s3 的分割區,所以先 mkdir -p /mnt/ad0s3,然後用 mount -t msdos /dev/ad0s3 /mnt/ad0s3 將該分割區 mount 起來測試看看, 如果確定可以的話,寫入 /etc/fstab:
/dev/ad0s3 /mnt/ad0s3 msdos ro,noauto 0 0
然後加個 /usr/local/etc/rc.d/big5mount.sh ,裡面按照 rc.d 的規則在 start 的地方執行 mount /mnt/ad0s3 就可以了, 也可以在 stop 時候加上相對應的指令來 umount。 注意 rc.d 裡的 *.sh 會依字母順序執行,所以新的 xx.sh 一定要在 big5fs.sh 後面, 才能確定已經載入 kernel 模組。
本來考慮使用 mount_msdos 的方式並修改該 table,不過因為 table 太小,沒辦法容納如此多的中文字元所以沒辦法實行。
The following example fstab(5) entry enables support for Russian filenames in mounted MS-DOS filesystems: /dev/ad0s2 /dos/c msdos rw,-W=koi2dos,-L=ru_RU.KOI8-R 0 0 See mount_msdos(8) for a detailed description of the -W and -L options.
5-CURRENT 已經有 kiconv,也有熱心的日本人弄了 I18N 修補檔, 就不用裝這個 port,只要設定好參數就能正常的用中文。 也就是說 mount_cd9660(8), mount_ntfs(8) 等工具支援 -C 來指定目前的字集,用來轉換 Unicode 檔名, 而 mount_msdosfs(8) 則要用 -D 來指定 MS-DOS codepage,並用 -L 來指定目前的字集。
# mount_msdosfs -D CP950 -L zh_TW.Big5 /dev/ad0s1 /mnt/disk # mount_ntfs -C Big5 /dev/ad0s2 /mnt/win # mount_cd9660 -C Big5 /dev/acd0 /cdrom
# /etc/fstab /dev/ad0s1 /mnt/disk msdos rw,-D=CP950,-L=zh_TW.Big5,noauto 0 0 /dev/ad0s2 /mnt/win ntfs ro,-C=Big5,noauto 0 0 /dev/acd0 /cdrom cd9660 ro,-C=GBK,noauto 0 0
在 GNU/Linux 底下也是類似的做法:
# mount -t vfat -o iocharset=big5,codepage=950 /dev/hdb5 /mnt/disk # mount -t ntfs -o codepage=950 /dev/hdb6 /mnt/win
不過在 zh_TW.UTF-8 的 locale 底下就要改成:
# mount -t vfat -o iocharset=utf8,codepage=950 /dev/hdb5 /mnt/disk