SDカードの使用効率(多分延命も)向上のため、F2FSを使用する。ルートファイルシステムはext4のままで、/var と/home を F2FS上に引っ越す。(201602)

概要と方針

書き換えの多い/var を F2FSのパーティションに置き、起動時にマウントするようにする。 /homeも/var/homeに移す。

ブート中のローカルマウントの段階で、/lib/modulesが使用されるので、f2fsがモジュールに含まれていればok。 もしルートファイルシステムをf2fsにするなら、モジュールでなくカーネルにf2fsを組み込んでおく必要があると思われる(それかinitramfsのように/bootパーティションに置く)。カーネルに組み込まれていた。cmdline.txtの root= で渡されたパーティションが f2fsでもext4でも、対応してくれる。

環境

  • Raspberry pi model A+
  • Arch Linux ARM
  • カーネルは 4.1.17-2-ARCH

準備

var用のファイルシステム構築

作業はmicroSDカードを別のlinuxマシン(bokan)に挿して行った。

  • rpiのルートファイルシステム(sdg2, ext4)をマウント

    (bokan)# mkdir /mnt/rpi
    (bokan)# mount /dev/sdg2 /mnt/rpi/
    
  • 先に/homeを/varへ移動 /homeはsymlinkにする。

    (bokan)# mv /mnt/rpi/home /mnt/rpi/var/home
    (bokan)# ln -s /var/home /mnt/rpi/home
    
  • パーティションsdg3を確保、f2fsでフォーマットする

    (bokan)# cfdisk /dev/sdg    # rpiでは mmcblk0
     ( sdg3 を作成する。 83 Linuxにする必要はある? )
    (bokan)# partprobe # パーティション読み直し
    (bokan)# mkfs.f2fs  -l "var_with_f2fs" /dev/sdg3
    

    sdg3はrpiでは mmcblk0p3である。

  • 旧/var の中身をF2FSファイルシステムへコピー

    一応、/varを別名で保存しておく。

    (bokan)# mv /mnt/rpi/var /mnt/rpi/_var_old
    

    /var に先ほどのF2FSをマウントし、_var_oldから全コピー

    (bokan)# mkdir /mnt/rpi/var
    (bokan)# mount /dev/sdg3 /mnt/rpi/var
    (bokan)# rsync -av --one-file-system /mnt/rpi/var_onroot/ /mnt/rpi/var/
    
  • fstabの調整

    上記の/varマウントをrpi起動時に行うよう、/etc/fstabを修正する。

      :
    /dev/mmcblk0p2 /       ext4  noatime,commit=7200             0  0
    /dev/mmcblk0p1 /boot   vfat  defaults                        0  0
    /dev/mmcblk0p3 /var    f2fs  relatime,fastboot,flush_merge   0  0
      :
    

    / と /boot はインストール後のまま。

    ext4で使用していたオプション commit=<秒数> は使えない。マウント時の処理を少なくするfastboot, 複数のflushコマンドを統合するflush_mergeを指定。

  • 後始末

    (bokan)# umount /mnt/rpi/var
    (bokan)# umount /mnt/rpi
    

rpi を起動して確認

$ mount | grep mmc
/dev/mmcblk0p2 on / type ext4 (rw,noatime,commit=7200,data=ordered)
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
/dev/mmcblk0p3 on /var type f2fs (rw,relatime,background_gc=on,user_xattr,acl,inline_data,flush_merge,fastboot,active_logs=6)

f2fsのステータスは f2fstat

# 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
 :
   3 1811 12112  871    23     7       0  509    1    0   0   3 2259  7  3   0 101  2702 2296  184
   3 1811 12112  871    23     7       0    4    1    0   0   3 2259  7  2   0 101   694  308  176
 :