15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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設定](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:~ $
  1. 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`)

        ```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

一気にやる

  • 書き込み先のカードには、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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?