以下省略!

タイダルウ(ry ほぼ毎日1記事執筆運動実施中。 ※記事に広告(アフィリエイト)リンクを掲載している場合があります。

Raspberry PiのSDカード(rootfs)のファイルシステムをf2fsにしてみた

https://rita.xyz/blog/irasutoya/computer_sdcard-w200-fs8-zf.pngRaspberry PiのSDカードのファイルシステム(OSが入っているルートパーティション。以下rootfsとする)をNANDフラッシュメモリ向けに最適化されたF2FSにしてみたのは秘密。これによってSDカードの寿命延びるかな?この記事ではRaspberry PiのOSがRaspbian(stretch)であり(パーティションがデフォルトのままであることを想定)、母艦PCがUbuntuの場合の手順(SDカードをもう1枚用意する必要がない)を書いている。

長いので続きを読むから。

目次

手順

前準備

RasPi側でF2FSのツールを入れておき、同時にlsblkなどでboot,rootfsのパーティションを確認しておく。以下の例では/dev/mmcblk0p1がboot、/dev/mmcblk0p2がrootfsとなる。NOOBSを使用してOSをインストールしている場合は若干異なるので注意。
確認したらRasPiをシャットダウンし、電源ケーブルを抜いておく。

(raspberrypi) $ sudo apt install f2fs-tools
(raspberrypi) $ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    1 119.1G  0 disk 
└─sda1        8:1    1 119.1G  0 part /mnt/usb
mmcblk0     179:0    0   7.7G  0 disk 
├─mmcblk0p1 179:1    0  43.9M  0 part /boot
└─mmcblk0p2 179:2    0   7.7G  0 part /
zram0       254:0    0 200.5M  0 disk [SWAP]
(raspberrypi) $ sudo shutdown -h now
母艦でSDカードをマウント

母艦PC側にもF2FSのツールを入れておいてから、SDカードリーダーにRasPiで使用しているSDカードを入れマウントする。以下は自動的にマウントされなかった場合の手動操作であり、筆者環境では自動的にマウントされているのでマウント操作は不要(この場合、次の手順以降ではマウントされているパスなど(/media/username/rootfsなど)に読み替える)。

(ubuntu) $ sudo apt install f2fs-tools
〜dmesgやlsblkでSDカードのデバイス名等を確認する。〜
〜ここでは/dev/sdc1をboot、/dev/sdc2をrootfsとする〜
(ubuntu) $ sudo mkdir /mnt/boot
(ubuntu) $ sudo mkdir /mnt/rootfs
(ubuntu) $ sudo mount /dev/sdc1 /mnt/boot
(ubuntu) $ sudo mount /dev/sdc2 /mnt/rootfs
rootfsを退避

rootfsの内容を母艦側にコピーし、rootfsをアンマウントする。

(ubuntu) $ cd /mnt/rootfs
(ubuntu) $ sudo tar czvf ~/raspi-rootfs.tar.gz .
(ubuntu) $ cd ..
(ubuntu) $ sudo umount /mnt/rootfs
f2fs化・rootfsを書き戻す

rootfsをf2fsでフォーマットする。この時点で一旦SDカードのrootfsの中身が消える。フォーマット完了後、再度マウントしコピーしたrootfsの内容を書き戻す。

(ubuntu) $ sudo mkfs.f2fs -f -l rootfs /dev/sdc2
(ubuntu) $ sudo mount /dev/sdc2 /mnt/rootfs
(ubuntu) $ cd /mnt/rootfs
(ubuntu) $ sudo tar xzvpf ~/raspi-rootfs.tar.gz
fstabの書き換え

rootfsの/etc/fstabにあるext4をf2fsに書き換える。またパーティションがPARTUUIDで指定されていたので、先程確認したパーティション(デバイス指定)に書き換えてみた(PARTUUIDのままでいいかもしれないが)。

(ubuntu) $ sudo vi /mnt/rootfs/etc/fstab
(ubuntu) $ cat /mnt/rootfs/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               f2fs    defaults,noatime  0       1
〜
cmdline.txtの書き換え

bootにあるcmdline.txtも同様に書き換える。sudoはいらないかも。完了したらアンマウント。

(ubuntu) $ sudo vi /mnt/boot/cmdline.txt
(ubuntu) $ cat /mnt/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=f2fs elevator=deadline fsck.repair=yes rootwait quiet
(ubuntu) $ cd
(ubuntu) $ sudo umount /mnt/boot
(ubuntu) $ sudo umount /mnt/rootfs
いざ起動

SDカードをRasPi側に戻し、RasPiの電源を入れる。うまくOSが立ち上がれば大丈夫。
mountコマンドなりでf2fsとしてマウントされているか確認する。

(raspberrypi) $ mount | grep mmcblk
/dev/mmcblk0p2 on / type f2fs (rw,noatime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,fsync_mode=posix)
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

おまけ

f2fstatをroot権限で実行するとF2FS全体での様々な状況が1秒更新で繰り返し表示される。

(raspberrypi) $ sudo f2fstat
    |------------main segments------------|------page/slab caches-----|-cp/gc-|---blks---|------memory------|
util node  data   free valid dirty prefree node dent meta sit nat fnid cp  gc  ssr lfs    total  node   meta 
  27 71086 456799 2852   958    78       0    0    0    0   0   0 8545 681 410   0 283349 166053 162348 2044
  27 71086 456799 2852   958    78       0    0    0    0   0   0 8545 681 410   0 283349 166053 162348 2044
  27 71086 456799 2852   958    78       0    0    0    0   0   0 8545 681 410   0 283349 166053 162348 2044
…