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とか)
-
2016-05-10-raspbian-jessie-lite.img
を2枚のmicroSDへ焼く - SD_f2fsカード(f2fs用): 起動して
sudo shutdown -h now
(rootfsパーティションが拡大される) - SD_ext4カード(作業用): に差し替えて起動。
- ツールインストール:
sudo apt-get install f2fs-tools
-
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:~ $
-
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
-
2016-05-10-raspbian-jessie-lite.img
をループバックでマウントする-
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 $
-
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
- いまのところ以下のどれも
-
コピーする
sudo cp -a /media/raspimg/root/* /media/root_fs/
-
設定を編集:
ext4
=>f2fs
へ、/etc/fstab
と/boot/cmdline.txt
-
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 ...
-
sudo vi /media/boot_fs/cmdline.txt
: rootfstype=f2fs/media/boot_fs/cmdline.txtdwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=f2fs elevator=deadline fsck.repair=yes rootwait
-
sync
して、sudo shutdown -h now
でシャットダウン。SD_f2fsカードをらずぱいに挿して、起動。
起動後、ツールをインストール
sudo apt-get install f2fs-tools
Windowsのファイル共有で、jessieのimgをマウント
- Windowsでフォルダ共有して、
rpi_share
と名前をつける -
ラズパイで、
sudo apt-get install cifs-utils
- マウントするフォルダ作成:
sudo mkdir /media/img
- マウント:
sudo mount -t cifs //<windowsのIPアドレス>/rpi_share /media/img -o user=username, dom=domain,pass=passoword
ユーザ/ドメイン/パスワードは、必要なものを。pass=
がなければ、きかれる。 ls /media/img
-
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:~$