Raspberry 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 …