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

## F2FSとは？

[Wikipedia - F2FS(英語)](https://en.wikipedia.org/wiki/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)を作る

    ```shell-session
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設定](http://qiita.com/mt08/item/2da1cce534dfdc84f5e3)

## 環境
- 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`として認識されました)

    ```shell-session:こんな感じ
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`のマウントポイントを作成して、マウント。`sda2`を`f2fs`でフォーマット

    ```shell-session
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`)

        ```shell-session: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`

        ```shell-session: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. コピーする <br>`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`

        ```txt:/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

        ```txt:/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. 起動後、ツールをインストール<br>`sudo apt-get install f2fs-tools`

### Windowsのファイル共有で、jessieのimgをマウント
1. Windowsでフォルダ共有して、`rpi_share`と名前をつける
2. ラズパイで、
    1. `sudo apt-get install cifs-utils`
    2. マウントするフォルダ作成:<br>`sudo mkdir /media/img`
    3. マウント:<br>`sudo mount -t cifs //<windowsのIPアドレス>/rpi_share  /media/img -o user=username, dom=domain,pass=passoword` <br>ユーザ/ドメイン/パスワードは、必要なものを。`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
```

### 一気にやる
- 書き込み先のカードには、<font color='red'>**jessieを書き込まなくてよい**</font>。
- 環境変数を2つ設定して、こぴぺする。
    - 書き込み先(USBカードリーダ)のmicroSD: `DEV_NEW_SD=/dev/sda`
    - Raspbianイメージファイル: `export RASPBIAN_IMG=/media/img/2016-05-27-raspbian-jessie-lite.img`

```bash: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,}
```


## 参考にした(というかそのまま..)ページ
- [HOWTO: Replace the micro SD card's ext4 root partition by f2fs on the Raspberry PI](http://whitehorseplanet.org/gate/topics/documentation/public/howto_ext4_to_f2fs_root_partition_raspi.html)
- [Mounting a raspbian image file as loop device](http://www.grosshans.biz/WordPress/?p=19)
- aaa

```shell-session
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:~$ 
```