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:~ $
-
sda
のマウントポイントを作成して、マウント。sda2
をf2fs
でフォーマット
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
- 書き込み先(USBカードリーダ)のmicroSD:
#
# 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
- Mounting a raspbian image file as loop device
- aaa
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:~$