SONiCのファイルシステムレイアウト

# はじめに

SONiCは通常よくあるPC向けLinux distributionと同様に、ストレージにインストールされ、それを`mount`して動作します。ディレクトリ構造も同様です。しかし、その内訳となるファイルシステムのありかたはやや特殊です。知っていてもあまり役に立たないかもしれませんが、主要なものをだらだら紹介します。

例示しているテキストはSONiC-VS(仮想マシン)のものなので、実機だとデバイス名など(`/dev/vda3`とか)微妙に異なることがあります。予めご了承ください。

# `/`

SONiCの各種バイナリファイルはsquashfsのイメージファイル内にあります。これをread onlyで`/`に`mount`してさらにoverlayfsでストレージの読み書き可能ディレクトリを重ねて`mount`しています。

```:dmesg
[    0.000000] Command line: BOOT_IMAGE=/image-master.0-329fcfae2/boot/vmlinuz-4.19.0-9-2-amd64 root=UUID=d1113aaf-6c15-4ca0-82f5-c215b2844078 rw console=tty0 console=ttyS0,115200n8 quiet net.ifnames=0 biosdevname=0 loop=image-master.0-329fcfae2/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor varlog_size=4096 usbcore.autosuspend=-1
```

```:mount
root-overlay on / type overlay (rw,relatime,lowerdir=/root,upperdir=/root/host/image-master.0-329fcfae2/rw,workdir=/root/host/image-master.0-329fcfae2/work)
```

# `/host`

各種の生ファイルは`/host`の下に集められています。`sonic-installer`コマンドを使うとストレージ上に2つのバージョンのSONiCを置くことができるのですが(起動時にGRUBで選択可能)、ブートしなかったほうのSONiCで作成していたファイルも`/host`に格納されていてアクセスが可能です。

```:mount
/dev/vda3 on /host type ext4 (rw,relatime)
```
前述したsquashfsのイメージも`/host`の下に置かれています。
`/host`にファイルを置いておくと`sonic-installer`コマンドによるイメージ更新時にも消去されないので、ちょっとした対比領域として便利に使えます。`/etc/config-setup`設定によるイメージ更新時のバックアップ・リストアにも使われます。

なお、`/`に重ねて`mount`されている読み書き可能ディレクトリは`/host/image-バージョン文字列/rw/`になります。

# `/var/log`

ログファイルを格納する/`var/log`ディレクトリはイメージ更新後も継続して参照できるようになっています。

```:mount
/host/disk-img/var-log.ext4 on /var/log type ext4 (rw,relatime)
```
# 標準的なLinuxのあれこれ

<details><summary>`/proc`, `/sys`, `/dev`といったディレクトリはSONiCでもふつうに`mount`されています。(長いので折りたたみ)</summary><div>

\```:mount
sysfs on /sys type sysfs (rw,relatime)
proc on /proc type proc (rw,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1005900k,nr_inodes=251475,mo
de=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmod
e=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204312k,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relat
ime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,
nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xa
ttr,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=30,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=11102)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
tracefs on /sys/kernel/debug/tracing type tracefs (rw,relatime)
\```

</div></details>

# `/var/lib/docker`

SONiCは各種機能をdockerコンテナ上で動かすのですが、専用領域として`/var/lib/docker`を用意しています。

```:mount
/dev/vda3 on /var/lib/docker type ext4 (rw,relatime)
```

<details><summary>コンテナ設定 (無意味に長いので折りたたみ)</summary><div>

\```
$ sudo ls /var/lib/docker/containers
0e063bc7b036bf5a395d98a51415ab59a0f3f8aac21c221bf8029bdea905c602
114c7dcc61aa07ce26a64bf1c7e4b0bf884b61c60b4e9e10ba96830e48acd487
32719356aae22e6044b1c03999976c8cf6332c2bf0a26d97f9f26aa693d58265
5a3b049561202bf79fce56542b92394c4bc06cff40891933c29a0bbcf14c627a
5e1b027404a9ce07a473b9116259d2739ae2b3d2e4bc01042070837c66092686
6817e874550a4ee3ac4a47e6e992bb8ae2e51816cec7e2a99738e0c76d1e3a7e
785abd190d98c61dcb3ea1964f73f253e35a179069587edb751a2b5bf66912be
7f532cd0da490b1341ca5a6cf34128d79f188361355fdd0b4491f26fed837484
b71c6536e18f570f6af84b4746d600d328970c92ade46161a92aed35e37db74e
c3b3bb5bbcdb43a8de1a55c233c5d6ed233a188325f636c6cc6df19fc27c12a8
cdc23150e7e5ce3112ac184e17faf0340ecf04137ae86134fb6f2f7de2add006
d25722a28e82b3f186a360206b65d8e1610d7ec6b9687328a856941a5d5df2cc
f0c53e238be406db65af81b0ad30a9f481ec5952ed9cd991969d1367079eeeb3
ffacc142b2e4388b3140df27b143a68a5528ad799658204088f4adfca1693aaf
\```

</div></details>

<details><summary>オーバーレイファイルシステム (無意味に長いので折りたたみ)</summary><div>

\```
$ sudo ls /var/lib/docker/overlay2
07e02732532df6da26e2e3911c50efdedd71e925a0ebe6b280bd9973e52f8499
08ae910c8ab3db21b5db24725b72f7435c29372e751d4270aee8380a6d1136a3
0a78c7fbfe38b83eec1c339bd4f8f9958ac412130d05565ed4327b6f85ef06b1
0a78c7fbfe38b83eec1c339bd4f8f9958ac412130d05565ed4327b6f85ef06b1-init
151510f3c7b5eca106617c94ffb8982907abef05c56c67384292b28ab5c48cc9
1acf21d8331977ac0a89e8594bcdffcadba356bca955684d4e1a6c3f4e1e9f06
23ce3a658d154122a79bf5843952f25c4d80e5fe3bc40652a95654459d16b9e3
23ce3a658d154122a79bf5843952f25c4d80e5fe3bc40652a95654459d16b9e3-init
24072f2cadcc58fe694918db2ab2a5ccbe1e52f10f69528df4989ef1ce103334
24072f2cadcc58fe694918db2ab2a5ccbe1e52f10f69528df4989ef1ce103334-init
32d655064a873b3b8fd3b67100310f3e9c408db1d4f8011f9d883e2183a422d9
3d5c975f1b3f52c1672c143efa4092fd622106ff05d2f331564b30062d839d67
3da6f4e71f3674497899444df2bcbed38e79e07ea7feaa4e1bdc134154a53bb1
3da6f4e71f3674497899444df2bcbed38e79e07ea7feaa4e1bdc134154a53bb1-init
4514b1183eb0310464761c546e75544d00ae76a5d632a04ddf831f5cc1e10274
4cf6acae7488d8f848b9ceba754ddcf850aea0a53b027c29b35446f079126768
52577e407eb0e8f68c04ee0ba0672690a63e0cedeedcde83702e8bc839ea06fb
68d12880487b6454ae888f41c4ce0b9e0d3a9d729c94680c6be1fdde580c62c6
69b32fc4f5f161ffe19773c1682dc12955d43bf7b85ddbb92bbee1d16968c449
69b32fc4f5f161ffe19773c1682dc12955d43bf7b85ddbb92bbee1d16968c449-init
6efb83d708bf748aec411f306fe0e5a3e1d54f23aa93c4981abb51701eaaba6e
72d64ba9d855c66ebd0ecdbb7e6388ee9ffc5f2a4696faafdb2751e3eeeb433b
72d64ba9d855c66ebd0ecdbb7e6388ee9ffc5f2a4696faafdb2751e3eeeb433b-init
7ca1b34b5326ff5c4aed38515016a62b02dedb89cbadb4b57c0587ae64fb958a
7da97c73a2a215de8df628a490e6324eb07ddeba87cd546c542ece109abc9828
7f8c53223b5da7d29d921d48d158ed371ed0807b2f58ee26d4a4a9a138d525c2
7f8c53223b5da7d29d921d48d158ed371ed0807b2f58ee26d4a4a9a138d525c2-init
90f042454b9dad58566a197a1a06aba37f9c51b26c476bcb48686b6d5a89ccbe
90f042454b9dad58566a197a1a06aba37f9c51b26c476bcb48686b6d5a89ccbe-init
997b2e86faba0b7708a521bdbdaf042599bf81c25ad90532e140115b94afe8db
997b3f2bd46e44decc3bfecfdf7f38531f068cfad2c11f1ccfb5ef551c08c1bb
9b62e7415e775e68adaaeb642852b2fa061789afad07e6c8f8af8f5c748b79bb
9b62e7415e775e68adaaeb642852b2fa061789afad07e6c8f8af8f5c748b79bb-init
b80bd1956e10ee96b28ef303f8a78135ddfe01fa1205c006ebb3f235a23df7d7
b80bd1956e10ee96b28ef303f8a78135ddfe01fa1205c006ebb3f235a23df7d7-init
bccd95d1d59fca2d5e8dce9f977aac92f798715d515136bc2078b7a25fbf6d69
c19fc0b7f905d89553568fa73848c2c74fe647cc888913d8b3d096987e5f422a
c23aaeca95843488d91490f8f80cf84a92213b077eaff1662fe014dc4a1dafa4
c7c7c7af057f83e7a7b3294bc713053dac8ec0e0da65313118e87045310824c6
c83063ed31e1423210db4df93849006b4bf76ac79dfa0a9216eb59f1c7d77de8
c83063ed31e1423210db4df93849006b4bf76ac79dfa0a9216eb59f1c7d77de8-init
d08c5aa8e47793dde8b44e948c1a2af3e503ea6cbaa7aec6176e7f34198f8d41
d08c5aa8e47793dde8b44e948c1a2af3e503ea6cbaa7aec6176e7f34198f8d41-init
da2f682045f63e1b66d2476e6938c437dd0b6138b9905bfb62ab3be20b530c3a
e8f68d0d732106557aede501a87f9bb17eb41dd96b9378517fe9b3993b5722fd
ec3b16704233ab79f7e54db1749de73b7d2e34030391efdecc111e08275486d1
f34731aa6b8334f97d89a02ca51c618af5eb1109cbb172b5c65ff0c7e2377ae9
f34731aa6b8334f97d89a02ca51c618af5eb1109cbb172b5c65ff0c7e2377ae9-init
f82e47e4f326b2e3c956e875581d7d3e40478e8cb68cffa5e7aa98d02ec1c1e5
f82e47e4f326b2e3c956e875581d7d3e40478e8cb68cffa5e7aa98d02ec1c1e5-init
l
\```

</div></details>


他にもdocker関連の設定などが置かれています。

# まとめ

`/host`だけ覚えておけば、あとはあまり考えなくていいと思います。