7839

雑草魂エンジニアブログ

【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から採用されているファイルシステム

  • ファイルの位置情報を記録する
  • 現在の主流は「FAT16」、「FAT32

  • FAT16

    • 最大ファイルサイズ: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で導入されたシステム。

  • ファイルとして扱える容量が8EBと大容量のファイルに対応している(1EB=100万TB)
  • ディレクトリ構造を導入したHFSにジャーナリング機能を追加した堅牢なシステム
  • MacOSにしか対応していない

APFS

APFS(Apple File System)は2016年にAppleが発表した新しいファイルシステム

  • ファイルコピーの速度が(見かけ上)高速化している
  • MacOS High Sierra 10.13以降で標準的に用いられている

XFS

XFS(Extents File System)はUNIX系OSで用いられているファイルシステム

  • 管理領域の一貫性を維持するジャーナリング機能(ファイル管理情報であるメタデータを書き換える際に、一旦ジャーナルと呼ばれる領域に時系列で変更内容を保存してから書き換えを行う)を搭載しているので堅牢性は高い
  • (デメリット)一度削除したファイルを復元することができない

ext

ext(extended file system)はLinuxで標準的に利用されるファイルシステム

  • ext1
    • 最大ファイルサイズ:64MB
    • 実用上はあまり普及していない
  • ext2
    • 最大ファイルサイズ:4TB
    • 最大ボリュームサイズ:16TB
    • エラー発生時の整合性チェック(fsck)などに長時間かかる問題あり
  • ext3
    • 最大ファイルサイズ:4TB
    • 最大ボリュームサイズ:16TB
    • ジャーナリング機能を追加し、障害発生時に迅速に復旧できるように改良
    • ファイルなどのタイムスタンプとして西暦2038年の特定の日時以降を正しく扱えない、2038年問題がある
  • 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

  1. install osxfuse

     brew install --cask osxfuse
    
  2. FUSE-Ext2インストール用のscriptファイル作成

     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
    

  3. script.shの権限変更

     chmod +x /tmp/ext4/script.sh
    
  4. FUSE-Ext2のインストールscript実行

     /tmp/ext4/script.sh
    

SDカードをマウントする

  1. MacExt4にフォーマットされているSDカードを挿入する
  2. 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カードの中にアクセスすることができる。

  3. SDカードをマウントしたいフォルダをDesktopに作成する

     mkdir ~/Desktop/ext4
    
  4. 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でもLinuxExt4ファイルシステムを操作ができるようになった。