【Linux】ファイルシステム(Ext4)・Macでfuse-ext2によるアクセス
とあるLinuxの組み込みシステムを扱う際に、SDカードが通常と異なり「ext4」であった。ファイルシステムに関して、調べた内容を備忘録として残しておく。
ファイルシステムとは
ファイルシステムとは、OSが提供する機能の一つであり、記憶装置に保存されたデータを管理し、操作するために必要な機能である。
通常OSを操作する上で、データが物理的にどのように格納されているかを意識することなく、ファイルという抽象化されたものを操作することで利用することができる。
ファイルシステムは、ファイルを操作するためのインターフェースを提供する。ファイルを階層構造に格納してラベルをつけ、必要な時にファイルを使えるようにする。
フォーマット(初期化)とは
記憶装置にデータを書き込むためには、まずそのデータを格納するためのスペースが必要となる。そして、空いているスペースにそのままデータを適当に格納した場合、いざ必要な時に取り出すのが大変になってしまう。そのため、データを出し入れしやすくするために、スペースを細かく区切って、番号を設定して格納できるようにする。
OSのファイルシステムに合わせて、記憶領域を区切り、番号を設定することを「フォーマット(初期化)」という。フォーマットで作成する区切りをクラスタという。クラスタはファイルを保存するための最小単位であり、ファイルシステム毎に単位が決まっている。現在使われているファイルシステムでは全て4Kバイト(8セクター)以上が最小単位のクラスターサイズとなっているのが一般的である。
- クラスタ:ファイルの最小単位
- セクタ:データの最小単位(1セクタ=512B, 4KB...)
ファイルシステムの種類
FAT
FAT(File Allocation Table)はMicrosoftが開発したもので、Windowsより前のM S-DOSから採用されているファイルシステム。
- ファイルの位置情報を記録する
-
- 最大ファイルサイズ:2GiB
- 最大ボリュームサイズ:2GiB
- FAT32
- 最大ファイルサイズ:4GiB
- 最大ボリュームサイズ:2TiB
NTFS
NTFS(NT File System)はFATを進化させた、現在のWindowsの主流となっているファイルシステム。
- 業務用OS「Windows NT(N-Ten / New Tecnology)」で導入された
- ファイルの変更履歴などの情報を保存するジャーナリング機能があり、FATよりも高機能で堅牢なシステム
- 圧縮機能、ファイル単位の暗号化機能など
HFS+
HFS+(Hierarchical File System)はHFSの拡張版であり、1998年からMac OS8.1で導入されたシステム。
APFS
APFS(Apple File System)は2016年にAppleが発表した新しいファイルシステム。
XFS
XFS(Extents File System)はUNIX系OSで用いられているファイルシステム。
- 管理領域の一貫性を維持するジャーナリング機能(ファイル管理情報であるメタデータを書き換える際に、一旦ジャーナルと呼ばれる領域に時系列で変更内容を保存してから書き換えを行う)を搭載しているので堅牢性は高い
- (デメリット)一度削除したファイルを復元することができない
ext
ext(extended file system)はLinuxで標準的に利用されるファイルシステム。
- ext1
- 最大ファイルサイズ:64MB
- 実用上はあまり普及していない
- ext2
- 最大ファイルサイズ:4TB
- 最大ボリュームサイズ:16TB
- エラー発生時の整合性チェック(fsck)などに長時間かかる問題あり
- ext3
- ext4
- 最大ファイルサイズ:16TB
- 最大ボリュームサイズ:1EB
- 最大サブディレクトリ数が32000から無制限に改良
VFS(Virtual File System)
Linuxでは全てをファイルとして扱うようになっている。
全ての対象は、データファイルだけではない、HDD、マウスなどの様々なデバイスもファイルとして扱う仕組みになっている。この仕組みを提供するのがVFS(Virtual File System)という仮想的なファイルシステムである。
仮想ファイルシステムはどのようなファイルシステムにも共通して実装されているような、基本的なファイルやディレクトリへのアクセスや操作を行う機能の呼び出し規約(API, Application Programming Interface)を提供する。このためユーザーが実行するプログラムはファイルシステムの差異を意識する必要がなく、統一的なアクセス方法で基本的な操作が可能となる。
LinuxではHDDを複数のパーティションに分割して、それぞれにファイルシステムを作成する。そして、各ファイルシステムをディレクトリツリーのルート(/
)以下にマウントすることで利用できるようにする。Linuxのファイルシステムはツリー構造になっており、OSから対象となるハードウェアをソフトウェア的に接続する操作をマウントするという。
LinuxではHDDなどのストレージのハードウェアが認識されても、それだけではファイルシステムとして利用することができない。Linux上ではハードウェアの認識とファイルシステムとしての利用可能であるかは別の問題であり、ファイルシステムとして利用可能にするためには任意であれ、自動であれマウントすることが必要不可欠である。
Mac で SDカード(Ext4)を操作する
利用パッケージ
インストール方法
引用: https://github.com/alperakcan/fuse-ext2#macos
install osxfuse
brew install --cask osxfuse
-
vim /tmp/ext4/script.sh
#!/bin/sh export PATH=/opt/gnu/bin:$PATH export PKG_CONFIG_PATH=/opt/gnu/lib/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH mkdir fuse-ext2.build cd fuse-ext2.build if [ ! -d fuse-ext2 ]; then git clone https://github.com/alperakcan/fuse-ext2.git fi # m4 if [ ! -f m4-1.4.17.tar.gz ]; then curl -O -L http://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz fi tar -zxvf m4-1.4.17.tar.gz cd m4-1.4.17 ./configure --prefix=/opt/gnu make -j 16 sudo make install cd ../ # autoconf if [ ! -f autoconf-2.69.tar.gz ]; then curl -O -L http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz fi tar -zxvf autoconf-2.69.tar.gz cd autoconf-2.69 ./configure --prefix=/opt/gnu make sudo make install cd ../ # automake if [ ! -f automake-1.15.tar.gz ]; then curl -O -L http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz fi tar -zxvf automake-1.15.tar.gz cd automake-1.15 ./configure --prefix=/opt/gnu make sudo make install cd ../ # libtool if [ ! -f libtool-2.4.6.tar.gz ]; then curl -O -L http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz fi tar -zxvf libtool-2.4.6.tar.gz cd libtool-2.4.6 ./configure --prefix=/opt/gnu make sudo make install cd ../ # e2fsprogs if [ ! -f e2fsprogs-1.43.4.tar.gz ]; then curl -O -L https://www.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v1.43.4/e2fsprogs-1.43.4.tar.gz fi tar -zxvf e2fsprogs-1.43.4.tar.gz cd e2fsprogs-1.43.4 ./configure --prefix=/opt/gnu --disable-nls make sudo make install sudo make install-libs sudo cp /opt/gnu/lib/pkgconfig/* /usr/local/lib/pkgconfig cd ../ # fuse-ext2 export PATH=/opt/gnu/bin:$PATH export PKG_CONFIG_PATH=/opt/gnu/lib/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH cd fuse-ext2 ./autogen.sh CFLAGS="-idirafter/opt/gnu/include -idirafter/usr/local/include/osxfuse/" LDFLAGS="-L/opt/gnu/lib -L/usr/local/lib" ./configure make sudo make install
script.shの権限変更
chmod +x /tmp/ext4/script.sh
-
/tmp/ext4/script.sh
SDカードをマウントする
- MacにExt4にフォーマットされているSDカードを挿入する
SDカードがどのディスクで認識されているか確認する
$ diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *2.0 TB disk0 1: EFI EFI 314.6 MB disk0s1 2: Apple_APFS Container disk1 1000.0 GB disk0s2 3: Microsoft Basic Data Linux 300.0 GB disk0s3 4: Microsoft Basic Data BOOTCAMP 700.8 GB disk0s4 /dev/disk1 (synthesized): #: TYPE NAME SIZE IDENTIFIER 0: APFS Container Scheme - +1000.0 GB disk1 Physical Store disk0s2 1: APFS Volume Macintosh HD 15.3 GB disk1s1 2: APFS Snapshot com.apple.os.update-... 15.3 GB disk1s1s1 3: APFS Volume Macintosh HD - Data 61.6 GB disk1s2 4: APFS Volume Preboot 328.5 MB disk1s3 5: APFS Volume Recovery 622.1 MB disk1s4 6: APFS Volume VM 20.5 KB disk1s5 /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *15.7 GB disk2 1: Windows_FAT_32 15.6 GB disk2s1
disk0とdisk1は、Macの内部なので、externalであるdisk2がSDカードであることがわかる。
Windows_FAT_32
であるdisk2s1
をマウントすることで、SDカードの中にアクセスすることができる。SDカードをマウントしたいフォルダをDesktopに作成する
mkdir ~/Desktop/ext4
SDカードをマウントする
sudo mount -t fuse-ext2 /dev/disk2s1 /User/<-username->/Desktop/ext4
デスクトップに以下のようなフォルダが表示される。
内部を確認することで、SDカードの中身を確認することができる。
SDカードをアンマウントする
開いているフォルダなどは全て閉じて、以下を実行する。
sudo umount /User/<-username->/Desktop/ext4
フォルダを開いていたり、フォルダにアクセスしていると、以下のエラーが出る。
$ sudo umount /Users/yuki.seri/Desktop/ext4 umount(/Users/yuki.seri/Desktop/ext4): Resource busy -- try 'diskutil unmount'
(おまけ)ext4fuse
ext4fuse はRead-Onlyで書き込みができない。それでも良ければ、使ってみてください。
インストール
brew install ext4fuse
するとError: ext4fuse has been disabled because it requires FUSE!
となったので、以下で対応してインストール実施。
brew install --cask osxfuse brew install --formula --build-from-source ./ext4fuse.rb
マウント/アンマウント
# マウント sudo ext4fuse /dev/disk2s1 /path_to_your_mountpoint -o allow_other # アンマウント sudo umount /path_to_your_mountpoint
まとめ
ファイルシステムに関して、知識を整理することができた。MacでもLinuxのExt4のファイルシステムを操作ができるようになった。