ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

LinuxでexFATを利用する

LinuxでexFATのマウントはかつてはネイティブにサポートされずFUSEのようなサードパーティのモジュールを介して利用する必要がありましたが、Linux Kernel 5.4でLinuxにexFATのサポートがマージされました。

Linux Kernel 5.4はLinux Kernelにおける長期サポート版のKernelです。Ubuntu 20.04はKernel 5.4が利用されています。 というわけで、早速LinuxでexFATを使ってみました。

LinuxでexFATを使えるメリット

シンプルに言えば、他のOSからデータを持ち込んだり持ち出すときに便利なところです。 FAT32なんかもありますが、ファイルシステムやファイルのサイズ制限があるので使いづらい感じでした。これがexFATが使えるようになると便利になります。

これまでのバージョンでもFUSEを使えばexFATを利用できましたが、ネイティブにサポートされることでパフォーマンスや安定性の向上、モジュールなどの追加インストールが不要になるというメリットがあります(つまりあのパッケージ、どこのリポジトリーで提供されているんだっけと悩んだり、独自にソフトウェアのビルドが不要になるというわけです)。

各Linuxディストリビューションで利用してみた

全てのディストリビューションで試したわけではありませんが、私がよく使うLinuxディストリビューションでexFATを使ってみました。 カーネルのバージョンが5.4以降でも、カーネルビルドオプションの都合でexFATが利用できない場合もあるようです。

OS 対応状況
Ubuntu 18.04 Ubuntuカーネルを5.4以降にするかexfat-fuseを入れて対処(現時点のHWEカーネルはv5.3)
Ubuntu 20.04 ネイティブサポート(5.4) 。モジュール追加なしに利用可能
Fedora 32 カーネル再ビルドするか、RPM Fusionのfuse-exfatが必要
RHEL ネイティブには実行不可 参考: https://access.redhat.com/solutions/70050
CentOS 同上。RPM Fusionのfuse-exfatを使う方法もあり
Oracle Linux UEK Release 6のv5.4カーネルで利用可能(OL8は標準カーネルのv4.14、OL7はUEK Release 5のv4.14なので注意)

ちなみに、Linux Kernel 5.4でexFAT対応がマージされましたが、Linux Kernel 5.7でよりパフォーマンスが向上されたexFATコードがコミットされたそうです。

早速exFATを使ってみる

  • とりあえずexFATフォーマットしたUSBメモリモジュールを接続します
  • 対象のシステムで dmesg コマンドを実行して、認識されたことを確認します
...
[  428.519782] usb-storage 1-1:1.0: USB Mass Storage device detected
[  428.519842] scsi host3: usb-storage 1-1:1.0
[  428.519890] usbcore: registered new interface driver usb-storage
[  428.521701] usbcore: registered new interface driver uas
[  429.591967] scsi 3:0:0:0: Direct-Access     UFD 2.0  Silicon-Power16G PMAP PQ: 0 ANSI: 4
[  429.592904] scsi 3:0:0:0: Attached scsi generic sg2 type 0
[  429.608265] sd 3:0:0:0: [sdb] 30283008 512-byte logical blocks: (15.5 GB/14.4 GiB)
[  429.617991] sd 3:0:0:0: [sdb] Write Protect is off
[  429.617994] sd 3:0:0:0: [sdb] Mode Sense: 23 00 00 00
[  429.627926] sd 3:0:0:0: [sdb] No Caching mode page found
[  429.627951] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[  429.703299]  sdb: sdb1 sdb2
[  429.761130] sd 3:0:0:0: [sdb] Attached SCSI removable disk

フォーマットの方法によって、sdb1だけだったりsdb1 sdb2のようにデバイスが分かれていたりします。 ちなみにsdb1はEFIデバイスが見えているようです。

f:id:ytooyama:20200603224107p:plain

  • マウントポイントを作成します
# mkdir /data
  • マウントします
# mount /dev/sdb2  /data

これで /dataに対してファイルの読み書きが可能になります。

  • 作業終了し不要になったら、umountします
# umount /data

exFATボリュームを永続マウント設定

最後に永続マウントする方法も一応書いておきます。

  • マウントの永続化をする場合は /etc/fstab などに記述します(ディストリビューションごとの適切な方法に従ってください)。
/dev/sdb2 /data exfat defaults 1 1
  • 再起動して自動マウントされることを確認します
# reboot
...
# dmesg
...
[    4.093093]  sdb: sdb1 sdb2
[    4.129987] sd 3:0:0:0: [sdb] Attached SCSI removable disk
[    5.183790] exfat: module is from the staging directory, the quality is unknown, you have been warned.
[    5.184339] exFAT: Version 1.3.0
[    5.190173] [EXFAT] trying to mount...
[    6.520828] [EXFAT] mounted successfully

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。