LoginSignup
15
13

More than 5 years have passed since last update.

[メモ] (らずぱい) rootfsをF2FS(Flash-Friendly File System)へ

Last updated at Posted at 2016-06-08

F2FSとは?

Wikipedia - F2FS(英語)より 

F2FS (Flash-Friendly File System) is a flash file system initially developed by Samsung Electronics for the Linux kernel.

=> F2FS(フラッシュフレンドリーファイルシステム)は、最初にLinuxカーネルのためにサムスン電子が開発したフラッシュファイルシステムです。(google翻訳)

SSDとかeMMCとか、SDカードみたいな、NANDフラッシュベースの特性を考慮して作られたファイルシステムらしいですよ。

簡単な概要

  • microSD 2枚 - 1枚目(rootfs=ext4)で起動作業して、USBカードリーダに挿した2枚目 に(rootfs=f2fs)を作る

    pi@raspberrypi:~$ mount | grep mmc
    /dev/mmcblk0p2 on / type f2fs (rw,noatime,background_gc=on,user_xattr,acl,inline_data,extent_cache,active_logs=6)
    /dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
    pi@raspberrypi:~$
    

# これやると、WindowsのExtFS使ってマウントできないよー =>関連:(らずぱい)Windows上から固定IP設定

環境

  • Raspberry Pi : ひとつ (RPi2とRPi3で確認)
  • microSD: 2枚: 2016-05-10-raspbian-jessie-lite.img を焼く
  • USB microSDカードリーダ(ライタ) : ひとつ
  • (jessieのimg書き込み用パソコン: Windows 7x64)

手順

あとで、2016-05-10-raspbian-jessie-lite.imgをループバックでマウントするのでアクセスできるように. (SD_ext4のmicroSDへコピーとか、USB-HDDをつなぐとか、NFSとか)

  1. 2016-05-10-raspbian-jessie-lite.imgを2枚のmicroSDへ焼く
  2. SD_f2fsカード(f2fs用): 起動してsudo shutdown -h now (rootfsパーティションが拡大される)
  3. SD_ext4カード(作業用): に差し替えて起動。
  4. ツールインストール: sudo apt-get install f2fs-tools
  5. SD_f2fsカード: USBカードリーダにいれて、Raspberry Piへ挿す。 (/dev/sdaとして認識されました)

    こんな感じ
    pi@raspberrypi:~ $ sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL
    NAME        FSTYPE  SIZE MOUNTPOINT LABEL
    sda                 7.4G
    ├─sda1      vfat     63M            boot
    └─sda2      ext4    7.4G
    mmcblk0             7.4G
    ├─mmcblk0p1 vfat     63M /boot      boot
    └─mmcblk0p2 ext4    7.4G /
    pi@raspberrypi:~ $
    
  6. sdaのマウントポイントを作成して、マウント。sda2f2fsでフォーマット

    sudo mkdir /media/boot_fs
    sudo mkdir /media/root_fs
    sudo mount -t vfat /dev/sda1 /media/boot_fs
    sudo mkfs.f2fs /dev/sda2
    sudo mount -t f2fs /dev/sda2 /media/root_fs
    
  7. 2016-05-10-raspbian-jessie-lite.imgをループバックでマウントする

    1. imgのgeometryを取得 (sfdisk -uS -l ./2016-05-10-raspbian-jessie-lite.img)

      imgのgeometryを取得
      pi@raspberrypi:/media/RPi $ sfdisk -uS -l ./2016-05-10-raspbian-jessie-lite.img
      sfdisk: Disk ./2016-05-10-raspbian-jessie-lite.img: cannot get geometry
      Disk ./2016-05-10-raspbian-jessie-lite.img: 168 cylinders, 255 heads, 63 sectors/track
      Units: sectors of 512 bytes, counting from 0
      Device Boot    Start       End   #sectors  Id  System
      ./2016-05-10-raspbian-jessie-lite.img1          8192    137215     129024   c  W95 FAT32 (LBA)
      ./2016-05-10-raspbian-jessie-lite.img2        137216   2707455    2570240  83  Linux
      ./2016-05-10-raspbian-jessie-lite.img3             0         -          0   0  Empty
      ./2016-05-10-raspbian-jessie-lite.img4             0         -          0   0  Empty
      pi@raspberrypi:/media/RPi $
      
    2. loopbackでマウント 上で取得した 137216を使う
      sudo mount -o loop,offset=$((512*137216)) 2016-05-10-raspbian-jessie-lite.img /media/raspimg/root

      mount後、lsで確認
      pi@raspberrypi:/media/RPi $ sudo mount -o loop,offset=$((512*137216)) 2016-05-10-raspbian-jessie-lite.img /media/raspimg/root
      pi@raspberrypi:/media/rasp/RPi $ ls  /media/raspimg/root/
      bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
      
      • いまのところ以下のどれも137216のようです。
        • 2016-05-10-raspbian-jessie-lite.img
        • 2016-05-27-raspbian-jessie-lite.img
        • 2016-05-27-raspbian-jessie.img
  8. コピーする
    sudo cp -a /media/raspimg/root/* /media/root_fs/

  9. 設定を編集: ext4=> f2fsへ、/etc/fstab/boot/cmdline.txt

    1. sudo vi /media/root_fs/etc/fstab

      /media/root_fs/etc/fstab
      ...
      /dev/mmcblk0p1  /boot           vfat    defaults          0       2
      /dev/mmcblk0p2  /               f2fs    defaults,noatime  0       1
      ...
      
    2. sudo vi /media/boot_fs/cmdline.txt : rootfstype=f2fs

      /media/boot_fs/cmdline.txt
      dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=f2fs elevator=deadline fsck.repair=yes rootwait
      
  10. syncして、sudo shutdown -h nowでシャットダウン。

  11. SD_f2fsカードをらずぱいに挿して、起動。

  12. 起動後、ツールをインストール
    sudo apt-get install f2fs-tools

Windowsのファイル共有で、jessieのimgをマウント

  1. Windowsでフォルダ共有して、rpi_shareと名前をつける
  2. ラズパイで、

    1. sudo apt-get install cifs-utils
    2. マウントするフォルダ作成:
      sudo mkdir /media/img
    3. マウント:
      sudo mount -t cifs //<windowsのIPアドレス>/rpi_share /media/img -o user=username, dom=domain,pass=passoword
      ユーザ/ドメイン/パスワードは、必要なものを。pass=がなければ、きかれる。
    4. ls /media/img
    5. loopbackマウント

      export RASPBIAN_IMG=/media/img/2016-05-27-raspbian-jessie-lite.img
      export PART_START1=$(parted $RASPBIAN_IMG -ms unit s p | grep "^1" | cut -f 2 -d: | sed 's/[^0-9]//g')
      export PART_START2=$(parted $RASPBIAN_IMG -ms unit s p | grep "^2" | cut -f 2 -d: | sed 's/[^0-9]//g')
      sudo mkdir -p /media/raspimg/{boot,root}
      sudo mount -o loop,offset=$((512*$PART_START1)) $RASPBIAN_IMG /media/raspimg/boot
      sudo mount -o loop,offset=$((512*$PART_START2)) $RASPBIAN_IMG /media/raspimg/root
      # 確認.
      ls /media/raspimg/root
      

一気にやる

  • 書き込み先のカードには、jessieを書き込まなくてよい
  • 環境変数を2つ設定して、こぴぺする。
    • 書き込み先(USBカードリーダ)のmicroSD: DEV_NEW_SD=/dev/sda
    • Raspbianイメージファイル: export RASPBIAN_IMG=/media/img/2016-05-27-raspbian-jessie-lite.img
bashコマンドラインにこぴぺ
#
# DEV_NEW_SD: microSD on USB card reader
#
export DEV_NEW_SD=/dev/sda
export RASPBIAN_IMG=/media/img/2016-05-27-raspbian-jessie-lite.img
#
# Mount Raspbian img
export PART_START1=$(parted $RASPBIAN_IMG -ms unit s p | grep "^1" | cut -f 2 -d: | sed 's/[^0-9]//g')
export PART_START2=$(parted $RASPBIAN_IMG -ms unit s p | grep "^2" | cut -f 2 -d: | sed 's/[^0-9]//g')
sudo mkdir -p /media/raspimg/{boot,root}
sudo mount -o loop,offset=$((512*$PART_START1)) $RASPBIAN_IMG /media/raspimg/boot
sudo mount -o loop,offset=$((512*$PART_START2)) $RASPBIAN_IMG /media/raspimg/root

#
# Clear Parition info(MBR : 1st sector)
sudo dd if=/dev/zero of=${DEV_NEW_SD} bs=512 count=1
# Create partition
sudo fdisk ${DEV_NEW_SD} <<EOF
p
n
p
1
8192
137215
n
p
2
137216

t
1
c
p
w
EOF


#
# Format partitions
sudo mkfs.vfat ${DEV_NEW_SD}1
sudo mkfs.f2fs ${DEV_NEW_SD}2
#
# Mount Dest Partition
sudo mkdir /media/{boot_fs,root_fs}
sudo mount -t vfat ${DEV_NEW_SD}1 /media/boot_fs
sudo mount -t f2fs ${DEV_NEW_SD}2 /media/root_fs
mount | grep ${DEV_NEW_SD}
#
# Copy files
time sudo cp -a /media/raspimg/boot/* /media/boot_fs/
time sudo cp -a /media/raspimg/root/* /media/root_fs/
#
# Edit cmdline.txt and fstab (ext4 to f2fs)
sudo sed -i 's/ quiet init=.*$//' /media/boot_fs/cmdline.txt
sudo sed -i 's/rootfstype=ext4/rootfstype=f2fs/' /media/boot_fs/cmdline.txt
sudo sed -i 's/ext4/f2fs/g' /media/root_fs/etc/fstab
#
# Sync
sync
sleep 5


# Unmount Dest drive
sudo umount ${DEV_NEW_SD}1
sudo umount ${DEV_NEW_SD}2
sudo rmdir /media/{boot_fs,root_fs}

# Unmount Raspbian img
sudo umount /media/raspimg/boot
sudo umount /media/raspimg/root
sudo rmdir /media/raspimg/{boot,root,}

参考にした(というかそのまま..)ページ

pi@raspberrypi:~$ sfdisk -uS -l ./2016-05-10-raspbian-jessie-lite.img
sfdisk: Disk ./2016-05-10-raspbian-jessie-lite.img: cannot get geometry

Disk ./2016-05-10-raspbian-jessie-lite.img: 168 cylinders, 255 heads, 63 sectors/track
Units: sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
./2016-05-10-raspbian-jessie-lite.img1          8192    137215     129024   c  W95 FAT32 (LBA)
./2016-05-10-raspbian-jessie-lite.img2        137216   2707455    2570240  83  Linux
./2016-05-10-raspbian-jessie-lite.img3             0         -          0   0  Empty
./2016-05-10-raspbian-jessie-lite.img4             0         -          0   0  Empty
pi@raspberrypi:~$ sfdisk -uS -l ./2016-05-27-raspbian-jessie-lite.img
sfdisk: Disk ./2016-05-27-raspbian-jessie-lite.img: cannot get geometry

Disk ./2016-05-27-raspbian-jessie-lite.img: 168 cylinders, 255 heads, 63 sectors/track
Units: sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
./2016-05-27-raspbian-jessie-lite.img1          8192    137215     129024   c  W95 FAT32 (LBA)
./2016-05-27-raspbian-jessie-lite.img2        137216   2709503    2572288  83  Linux
./2016-05-27-raspbian-jessie-lite.img3             0         -          0   0  Empty
./2016-05-27-raspbian-jessie-lite.img4             0         -          0   0  Empty
pi@raspberrypi:~$ sfdisk -uS -l ./2016-05-27-raspbian-jessie.img
sfdisk: Disk ./2016-05-27-raspbian-jessie.img: cannot get geometry

Disk ./2016-05-27-raspbian-jessie.img: 488 cylinders, 255 heads, 63 sectors/track
Units: sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
./2016-05-27-raspbian-jessie.img1          8192    137215     129024   c  W95 FAT32 (LBA)
./2016-05-27-raspbian-jessie.img2        137216   7849983    7712768  83  Linux
./2016-05-27-raspbian-jessie.img3             0         -          0   0  Empty
./2016-05-27-raspbian-jessie.img4             0         -          0   0  Empty
pi@raspberrypi:~$ 
15
13
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13