[メモ] RaspberryPi: リードオンリーRoot-FS (overlayfs使用)




## 概要

- [Read-only Root-FS with overlayfs for Raspian](https://github.com/josepsanzcamp/root-ro)<br>https://github.com/josepsanzcamp/root-ro

- rootfsをroにしてしまおう
	- 再起動で、元に戻る
	- 書き込まれる部分は、RAM上の`tmpfs`(実体:`/mnt/root-rw`)となるので、書込容量制限あるし、メモリも圧迫する

		```shell-session:例
		pi@rpi2:~$ free
					 total       used       free     shared    buffers     cached
		Mem:        947732     385056     562676      55264      19504     263544
		-/+ buffers/cache:     102008     845724
		Swap:            0          0          0
		pi@rpi2:~$ cat /dev/zero > aa
		cat: write error: No space left on device
		pi@rpi2:~$ free
					 total       used       free     shared    buffers     cached
		Mem:        947732     824960     122772     495276      19504     703556
		-/+ buffers/cache:     101900     845832
		Swap:            0          0          0
		pi@rpi2:~$ ls -l aa
		-rw-r--r-- 1 pi pi 450564096 Apr  5 19:01 aa
		pi@rpi2:~$ rm aa
		```
	- microSDに書き込みを行わない(ハズ)なので、組み込み機器などにいいかと。
	- GUIありでも、いける。
- 以前、[[メモ] Raspberry Piで OverlayFS (組み込み向け設定・スクリプト)](http://qiita.com/mt08/items/24510d9845b77ef28d8b)
という記事を書いたが、これのほうが導入もメンテもラクチンな感じ？



- 追記: 2017-11-16 
最近のラズビアンでは、`/dev/mmcblk0~~` ではなく、`PARTUUID=~~`を使ってるが、これだと、うまく`root-ro`のスクリプトが動かない。
`cmdline.txt`と`/etc/fstab`の該当箇所を、`/dev/mmcblk0p1`と`/dev/mmcblk0p2`に書き換えてから、`root-ro`を入れると、動く。



	```txt:/boot/cmdline.txt 
	変更前: dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=b14b2030-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
	変更後: dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2       rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
	```

	```txt:/etc/fstab 
...
	# 変更前
	PARTUUID=b14b2030-01  /boot           vfat    defaults          0       2
	PARTUUID=b14b2030-02  /               ext4    defaults,noatime  0       1
	
	# 変更後
	/dev/mmcblk0p1        /boot           vfat    defaults          0       2
	/dev/mmcblk0p2        /               ext4    defaults,noatime  0       1
...
	```



## 環境
- Raspberry Pi 2
- Raspbian:
    - 2017-03-02-raspbian-jessie.img (GUIあり)
    - 2017-03-02-raspbian-jessie-lite.img (軽量版)

## 手順

1. いつも通りの初期設定
    - Raspbianを焼いて、
    - sudo apt-get update && sudo apt-get upgrade -y
2. 使う環境まで、セットアップ

3. root-ro化 
    - 上記githubサイトに書かれてる手順どおり行う

	```bash:手順
	cd /home/pi
	# rootになる。
	sudo bash

	# 必要なパッケージ類
	echo Installing all dependencies
	apt-get install git subversion rsync gawk busybox bindfs

	# swapを使用しないように
	echo Disabling swap
	dphys-swapfile swapoff
	dphys-swapfile uninstall
	update-rc.d dphys-swapfile disable
	systemctl disable dphys-swapfile

	#gitクローン
	echo Cloning repository
	git clone https://github.com/josepsanzcamp/root-ro.git

	# 設定
	echo Doing the setup
	rsync -va root-ro/etc/initramfs-tools/* /etc/initramfs-tools/
	mkinitramfs -o /boot/initrd.gz
	echo initramfs initrd.gz >> /boot/config.txt

	# 再起動
	echo Restarting RPI
	reboot
	```



4. 元のように`rw`に戻すには、`/boot/config.txt`の最後に追加された、`initramfs initrd.gz`をコメントアウトして再起動する


    ```bash
sudo mount -o remount,rw /dev/mmcblk0p1
sudo vi /mnt/boot-ro/config.txt
#
#
sudo reboot
```



## その他
- 構成

	```shell-session
	pi@rpi2:~ $ mount | grep /mnt/root
	/dev/mmcblk0p2 on /mnt/root-ro type ext4 (ro,relatime,data=ordered)
	tmpfs on /mnt/root-rw type tmpfs (rw,relatime)
	overlay on / type overlay (rw,relatime,lowerdir=/mnt/root-ro,upperdir=/mnt/root-rw/upper,workdir=/mnt/root-rw/work)
	pi@rpi2:~ $ mount | grep /mnt/boot
	tmpfs on /mnt/boot-rw type tmpfs (rw,relatime)
	/dev/mmcblk0p1 on /mnt/boot-ro type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
	bindfs on /mnt/boot-ro2 type fuse.bindfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)
	overlay on /boot type overlay (rw,relatime,lowerdir=/mnt/boot-ro2,upperdir=/mnt/boot-rw/upper,workdir=/mnt/boot-rw/work)
	pi@rpi2:~ $
	```

- テラテイル: https://teratail.com/questions/71314 で回答を調べてる最中、発見した。