Raspbian Stretch Lite の root filesystem を read only にする
Raspbian Stretch Lite の root filesystem を read only にする方法を試してみました。
以下メモ。
$ sudo bash
# cd /usr/share/initramfs-tools
# nano hook-functions
(497行目付近:赤字=追記)
for arg in "$@" ; do
case "$arg" in
base)
modules="$modules btrfs ext2 ext3 ext4 ext4dev overlay"
modules="$modules isofs jfs reiserfs udf xfs"
# cd scripts
# cp local overlay
# cp -rp local-premount overlay-premount
# cp -rp local-bottom overlay-bottom #存在せずエラーになる場合は無視
# nano overlay
(変更箇所=赤字)
local_premount
# if [ "${readonly}" = "y" ]; then
roflag=-r
# else
# roflag=-w
# fi
# FIXME This has no error checking
modprobe ${FSTYPE}
checkfs ${ROOT} root
# FIXME This has no error checking
# Mount root
mkdir /upper /lower
if [ "${FSTYPE}" != "unknown" ]; then
mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /lower
else
mount ${roflag} ${ROOTFLAGS} ${ROOT} /lower
fi
modprobe overlay
mount -t tmpfs tmpfs /upper
mkdir /upper/data /upper/work
mount -t overlay \
-olowerdir=/lower,upperdir=/upper/data,workdir=/upper/work \
overlay ${rootmnt}
}
カーネルのバージョンを確認
# uname -r
4.x.xx-v7+
(ここで、4.x.xx-v7+ のように v7 が付く場合は、以下のままでよいが、v7 が付かない場合は、赤字で示した 7 の部分を除いてタイプ。)
# update-initramfs -c -k $(uname -r)
# cd /boot
# mv initrd.img-$(uname -r) initrd7.img
(ファイル /boot/config.txt を編集。末尾に以下を追加。v7 が付かない場合は、赤字で示した 7 の部分を除いてタイプ。)
# sudo nano /boot/config.txt
kernel=kernel7.img
initramfs initrd7.img
(ファイル /boot/cmdline.txt の赤字の部分を追加&修正。)
# sudo nano /boot/cmdline.txt
boot=overlay dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
(再起動)
# reboot
ログイン
$ mount | fgrep ' / '
以下のようなメッセージが表示されれば成功。
overlay on / type overlay (rw,noatime,lowerdir=/lower,upperdir=/upper/data,workdir=/upper/work)
(書き込み可能に戻すには?)
"/boot/cmdline.txt" の先頭にある " boot=overlay" を削除して reboot
以上。
----+----+----+----+----+----
参考
FIRMLOGICS:Raspbian OSのSDカードをリードオンリー化する(initrd 編)
以下メモ。
$ sudo bash
# cd /usr/share/initramfs-tools
# nano hook-functions
(497行目付近:赤字=追記)
for arg in "$@" ; do
case "$arg" in
base)
modules="$modules btrfs ext2 ext3 ext4 ext4dev overlay"
modules="$modules isofs jfs reiserfs udf xfs"
# cd scripts
# cp local overlay
# cp -rp local-premount overlay-premount
# cp -rp local-bottom overlay-bottom #存在せずエラーになる場合は無視
# nano overlay
(変更箇所=赤字)
local_premount
# if [ "${readonly}" = "y" ]; then
roflag=-r
# else
# roflag=-w
# fi
# FIXME This has no error checking
modprobe ${FSTYPE}
checkfs ${ROOT} root
# FIXME This has no error checking
# Mount root
mkdir /upper /lower
if [ "${FSTYPE}" != "unknown" ]; then
mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /lower
else
mount ${roflag} ${ROOTFLAGS} ${ROOT} /lower
fi
modprobe overlay
mount -t tmpfs tmpfs /upper
mkdir /upper/data /upper/work
mount -t overlay \
-olowerdir=/lower,upperdir=/upper/data,workdir=/upper/work \
overlay ${rootmnt}
}
カーネルのバージョンを確認
# uname -r
4.x.xx-v7+
(ここで、4.x.xx-v7+ のように v7 が付く場合は、以下のままでよいが、v7 が付かない場合は、赤字で示した 7 の部分を除いてタイプ。)
# update-initramfs -c -k $(uname -r)
# cd /boot
# mv initrd.img-$(uname -r) initrd7.img
(ファイル /boot/config.txt を編集。末尾に以下を追加。v7 が付かない場合は、赤字で示した 7 の部分を除いてタイプ。)
# sudo nano /boot/config.txt
kernel=kernel7.img
initramfs initrd7.img
(ファイル /boot/cmdline.txt の赤字の部分を追加&修正。)
# sudo nano /boot/cmdline.txt
boot=overlay dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
(再起動)
# reboot
ログイン
$ mount | fgrep ' / '
以下のようなメッセージが表示されれば成功。
overlay on / type overlay (rw,noatime,lowerdir=/lower,upperdir=/upper/data,workdir=/upper/work)
以下のようなメッセージであれば失敗。
/dev/mmcblk0p2 on / type ext4 (rw,noatime,data=ordered)
(書き込み可能に戻すには?)
"/boot/cmdline.txt" の先頭にある " boot=overlay" を削除して reboot
以上。
----+----+----+----+----+----
参考
FIRMLOGICS:Raspbian OSのSDカードをリードオンリー化する(initrd 編)