Raspberry Piのinitramfsを更新する方法

ユアスタンド株式会社所属

筆者は[ユアスタンド株式会社](https://yourstand-ev.com/)のインターン生です。

ユアスタンド株式会社では電気自動車（EV）の充電器をマンションを中心に導入し、自社開発のアプリによる運用に取り組んでいます。

本記事では、実際の業務で使用されていたRaspberryPiのRead-Only, Root-FSのシステムを更新した時の記録となっております。

## はじめに
公式サービス(raspi-config)にアップデートする前,Raspberry PiをRead-Only Root-FSにするには、josepsanzcamp氏が作成したリポジトリ[1]にあるドキュメントを参考にする方法[2][3]が一般的でした。
​
本記事では、josepsanzcamp氏の作成したシステムから公式のシステムに移行する方法を紹介します。
​
ファイルなど[github](https://github.com/moffy-Black/initramfs-update)に置いてあります。
## 目次
​
1. [Read-Onlyの解除](#Chapter1)
2. [initramfsの更新](#Chapter2)
3. [reference](#reference)
​
<a id="#Chapter1"></a>
# Read-Onlyの解除
⚠︎前提として、RaspberryPiはjosepsanzcamp氏の作成したシステムのRead-Only(以下ro)を適用している状態です。
​
⚠︎roが設定されているかどうか確認したい場合は,/boot/config.txtの最終行にinitramfsinitrd.gzが記述されていることを確認してください。
​
### roを解除します
​
roはinitramfsinitrd.gzをコメントアウトすることで解除することができます。
​

```shell.
$ sudo mount -o remount,rw /mnt/boot-ro
$ sudo sed -i "s/^\(i\)\(nitramfs [[:blank:]]*initrd.gz\)[[:blank:]]*$/#\1\2/" /mnt/boot-ro/config.txt #コメンアウト
$ sudo reboot
```
​
​
<a id="#Chapter2"></a>
# initramfsの更新
​
### initramfsとは?
Linuxのディストリビューションでは、ミニルートと呼ばれる小さいサイズのルートファイルシステムを持っています。Initramfsはミニルートのファイルフォーマットの一種です。RaspberryPiを起動する場合,SDカード(/dev/mmcblk0p2)に保存されている大元のルートファイルシステムをマウントするために、このinitramfsを一度RAM上に展開します。そこでroの設定を行なっています。[4]
​
initramfsの設定は/etc/initramfs-toolsfフォルダ直下に記述されています。
​
### 新たなフォルダを作成します
​

```
    initramfs-tools/
        ├scripts/
        ├initramfs.conf
        ├modules
        └update-initramfs.conf
```
​
scriptsはからのフォルダです
ファイルの構成は以下です
​

```initramfs.conf
#
# initramfs.conf
# Configuration file for mkinitramfs(8). See initramfs.conf(5).
#
# Note that configuration options from this file can be overridden
# by config files in the /etc/initramfs-tools/conf.d directory.
​
#
# MODULES: [ most | netboot | dep | list ]
#
# most - Add most filesystem and all harddrive drivers.
#
# dep - Try and guess which modules to load.
#
# netboot - Add the base modules, network modules, but skip block devices.
#
# list - Only include modules from the 'additional modules' list
#
​
MODULES=most
​
#
# BUSYBOX: [ y | n | auto ]
#
# Use busybox shell and utilities.  If set to n, klibc utilities will be used.
# If set to auto (or unset), busybox will be used if installed and klibc will
# be used otherwise.
#
​
BUSYBOX=auto
​
#
# KEYMAP: [ y | n ]
#
# Load a keymap during the initramfs stage.
#
​
KEYMAP=n
​
#
# COMPRESS: [ gzip | bzip2 | lz4 | lzma | lzop | xz ]
#
​
COMPRESS=gzip
​
#
# NFS Section of the config.
#
​
#
# DEVICE: ...
#
# Specify a specific network interface, like eth0
# Overridden by optional ip= or BOOTIF= bootarg
#
​
DEVICE=
​
#
# NFSROOT: [ auto | HOST:MOUNT ]
#
​
NFSROOT=auto
​
#
# RUNSIZE: ...
#
# The size of the /run tmpfs mount point, like 256M or 10%
# Overridden by optional initramfs.runsize= bootarg
#
​
RUNSIZE=10%
```
​

```modules.
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
```
​

```update-initramfs.conf
#
# Configuration file for update-initramfs(8)
#
​
#
# update_initramfs [ yes | all | no ]
#
# Default is yes
# If set to all update-initramfs will update all initramfs
# If set to no disables any update to initramfs beside kernel upgrade
​
update_initramfs=yes
​
#
# backup_initramfs [ yes | no ]
#
# Default is no
# If set to no leaves no .bak backup files.
​
backup_initramfs=no
```
​
### initramfsを更新します
​

```shell.
$ sudo rm -rf /etc/initramfs-tools #initramfsの設定を削除
$ sudo cp -r ~/initramfs-tools /etc/initramfs-tools #作成したフォルダをコピー
$ sudo update-initramfs -u -k all #initramfsの更新
$ sudo reboot
```
​
以上でinitramfsシステムの更新が完了します。
​
更新した後、/boot/config.txtの最終行に#initramfsinitrd.gzが残っていますが、以下のコマンドのいずれかを実行することで削除されます。
​

```RAMディスク有効.
$ sudo raspi-config nonint enable_overlayfs
$ sudo systemctl reboot
```
​

```RAMディスク無効.
$ sudo raspi-config nonint disable_overlayfs
$ sudo systemctl reboot
```
​
<a id="#reference"></a>
# 参考文献
- [1][josepsanzcamp/root-ro](https://github.com/josepsanzcamp/root-ro)
- [2][Raspberry Pi OSのrootfs ROM 化 ― RAMディスク化しつつ、好きなパッケージを後から追加する方法](https://qiita.com/ma2shita/items/45818f0872472ecacac1)
- [3][Raspberry PiをRead-Only Root-FSにする & メモリがいっぱいになったらどうする](https://moznion.hatenadiary.com/entry/2021/02/03/102200)
- [4][Ubuntu Weekly Recipe第384回 Initramfsのしくみ](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0384)