Difference between revisions of "How to use overlayfs on Linux/zh"
(updated by API) |
(updated by API) |
||
(8 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
==什么是OverlayFS== | ==什么是OverlayFS== | ||
− | Overlayfs是Linux下的一种堆叠文件系统,通俗地讲,根文件系统虽然在逻辑仍然是一个分区,但物理上被拆分成了两个分区来存储,其中,一个分区只读存放固化的系统数据(rootfs分区),另一个分区存储写入的数据( | + | Overlayfs是Linux下的一种堆叠文件系统,通俗地讲,根文件系统虽然在逻辑仍然是一个分区,但物理上被拆分成了两个分区来存储,其中,一个分区只读存放固化的系统数据(rootfs分区),另一个分区存储写入的数据(userdata分区),优点如下:<br /> |
− | 1) | + | 1) 方便恢复出厂设置,格式化userdata分区即可;<br /> |
− | 2) | + | 2) 避免重复掉电或异常掉电导致userdata分区挂载异常无法进入系统,由于rootfs是只读的,此时仍可以进入系统,方便维护升级;<br /> |
==哪些平台与系统支持OverlayFS== | ==哪些平台与系统支持OverlayFS== | ||
===支持的硬件平台=== | ===支持的硬件平台=== | ||
− | H3, H5, S5P4418, S5P6818, | + | H3, H5, S5P4418, S5P6818, RK3399, RK3328, RK3568, RK3588系列开发板 |
===支持的软件平台=== | ===支持的软件平台=== | ||
− | + | 所有基于Linux的系统 | |
+ | ===本文档的适用范围=== | ||
+ | 本文仅适用于Rockchip平台的产品,如果你是其他平台,请点击此链接:[[How to use overlayfs on S5Pxxxx,H3,H5 platform/zh]] | ||
==如何鉴别系统是否工作在OverlayFS== | ==如何鉴别系统是否工作在OverlayFS== | ||
执行df命令,如果/分区挂载类型为 overlay,表示OverlayFS正在工作: | 执行df命令,如果/分区挂载类型为 overlay,表示OverlayFS正在工作: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | pi@NanoPi- | + | pi@NanoPi-R6C:/etc$ df -h |
− | Filesystem | + | Filesystem Size Used Avail Use% Mounted on |
− | + | tmpfs 792M 2.2M 790M 1% /run | |
− | tmpfs | + | overlay 25G 13G 11G 53% / |
− | overlay | + | tmpfs 3.9G 0 3.9G 0% /dev/shm |
− | tmpfs | + | tmpfs 5.0M 4.0K 5.0M 1% /run/lock |
− | tmpfs | + | tmpfs 793M 116K 793M 1% /run/user/1000 |
− | tmpfs | + | |
− | + | ||
− | + | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==使用OverlayFS时的分区布局== | ==使用OverlayFS时的分区布局== | ||
− | + | 用户数据将由rootfs分区与userdata分区组成,对应的映像文件是rootfs.img和userdata.img. <br /> | |
+ | 使下如下命令查看分区布局: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | 查看eMMC分区布局: sudo parted -s /dev/mmcblk2 unit MiB print | |
− | + | 查看SD卡分区布局: sudo parted -s /dev/mmcblk0 unit MiB print | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 输出信息如下所示: | |
− | + | ||
− | + | ||
− | + | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | sudo | + | pi@NanoPi-R6C:/etc$ sudo apt install parted |
+ | pi@NanoPi-R6C:/etc$ sudo parted /dev/mmcblk0 print | ||
+ | Model: SD SR32G (sd/mmc) | ||
+ | Disk /dev/mmcblk0: 31.9GB | ||
+ | Sector size (logical/physical): 512B/512B | ||
+ | Partition Table: gpt | ||
+ | Disk Flags: | ||
+ | |||
+ | Number Start End Size File system Name Flags | ||
+ | 1 8389kB 12.6MB 4194kB uboot | ||
+ | 2 12.6MB 16.8MB 4194kB misc | ||
+ | 3 16.8MB 21.0MB 4194kB dtbo | ||
+ | 4 21.0MB 37.7MB 16.8MB resource | ||
+ | 5 37.7MB 79.7MB 41.9MB kernel | ||
+ | 6 79.7MB 113MB 33.6MB boot | ||
+ | 7 113MB 147MB 33.6MB recovery | ||
+ | 8 147MB 4173MB 4027MB ext4 rootfs | ||
+ | 9 4173MB 31.9GB 27.7GB ext4 userdata | ||
+ | </syntaxhighlight> | ||
+ | 其中,rootfs分区是只读挂载的,userdata是可读写挂载的, rootfs分区存放固化的系统数据,后续对根目录的写入,都会写入到userdata分区, 因此格式化userdata也就相当于恢复出厂设置。<br /> | ||
+ | |||
+ | ==常用操作== | ||
+ | '''注意事项: '''<br/> | ||
+ | * 这些操作会擦除用户数据,需要预先备份好数据<br> | ||
+ | * 需要将固件更新至2023/03/14或之后的版本,或者单独更新boot.img<br> | ||
+ | * 命令中出现的/dev/mmcblkX设备节点是虚构的节点,需要改成真实的设备,eMMC的设备节点是/dev/mmcblk2,TF卡的设备节点是/dev/mmcblk0<br> | ||
+ | ===查看当前的分区布局=== | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo apt update | ||
+ | sudo apt install parted | ||
+ | export DEV=/dev/mmcblkX # 需要改成真实的设备 | ||
+ | sudo parted -s ${DEV} unit MiB print | ||
+ | </syntaxhighlight> | ||
+ | ===禁用OverlayFS特性=== | ||
+ | 在根目录下创建一个名为“.init_wipedata”的文件,内容为“overlayfs=disable”,然后重启,命令如下所示: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo passwd root # 为root用户创建密码,如果之前没有做 | ||
+ | su - root -c 'echo "overlayfs=disable" > /.init_wipedata' | ||
sudo reboot | sudo reboot | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | === | + | ===调整userdata分区大小并创建一个额外分区=== |
+ | * 查看当前的分区布局 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | sudo | + | sudo apt update |
+ | sudo apt install parted fdisk | ||
+ | export DEV=/dev/mmcblkX # 需要改成真实的设备 | ||
+ | sudo parted -s ${DEV} unit MiB print | ||
+ | </syntaxhighlight> | ||
+ | * 调整userdata分区的大小 | ||
+ | 这里以调整为8G大小为例,在根目录下创建一个名为“.init_wipedata”的文件,内容为“overlayfs=enable userdata=8096”,然后重启,其中userdata=后跟新的userdata分区大小,单位为MB,命令如下所示: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | su - root -c 'echo "overlayfs=enable userdata=8096" > /.init_wipedata' | ||
sudo reboot | sudo reboot | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 重启后, 正常情况下,可以看到userdata分区已调整为8GB: | |
− | == | + | <syntaxhighlight lang="bash"> |
− | + | export DEV=/dev/mmcblkX # 需要改成真实的设备 | |
+ | sudo parted -s ${DEV} unit MiB print | ||
+ | </syntaxhighlight> | ||
+ | * 创建新分区并格式化 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | (echo n; echo ""; echo ""; echo ""; echo w) | sudo fdisk ${DEV} | ||
+ | NUM=$(sudo parted ${DEV} print | awk 'NF > 1 {p = $1} END {print p}') # 获取最后一个分区的序号 | ||
+ | sudo mkfs.ext4 ${DEV}p${NUM} | ||
+ | </syntaxhighlight> | ||
+ | * 挂载新分区到指定目录 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo mkdir -p /oem | ||
+ | sudo blkid ${DEV}p${NUM} | ||
+ | # 记下UUID | ||
+ | # 配置开机自动挂载新创建的分区 | ||
+ | sudo vi /etc/fstab | ||
+ | # 在文件末尾加入如下内容(其中UUID需替换为真实的) | ||
+ | UUID=bbb06fe1-df52-4c7c-b2eb-926b14605fe4 /oem ext4 suid,dev,exec,auto,nouser,async,noatime,nofail 0 0 | ||
+ | # 输入以下命令挂载分区 | ||
+ | sudo mount /oem | ||
+ | </syntaxhighlight> | ||
+ | ===恢复出厂设置(清空userdata数据)=== | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | su - root -c 'echo "overlayfs=enable" > /.init_wipedata' | ||
+ | sudo reboot | ||
+ | </syntaxhighlight> | ||
+ | 下次启动到ramdisk阶段,会对userdata分区进行格式化,/var/.init_wipedata 文件也会被清除。 | ||
+ | ===调试=== | ||
+ | 如发现分区未变化,可能是出现了错误,用以下命令检查是否有错误信息打印: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | dmesg | grep initfs | ||
+ | </syntaxhighlight> |
Latest revision as of 02:36, 17 May 2023
Contents
1 什么是OverlayFS
Overlayfs是Linux下的一种堆叠文件系统,通俗地讲,根文件系统虽然在逻辑仍然是一个分区,但物理上被拆分成了两个分区来存储,其中,一个分区只读存放固化的系统数据(rootfs分区),另一个分区存储写入的数据(userdata分区),优点如下:
1) 方便恢复出厂设置,格式化userdata分区即可;
2) 避免重复掉电或异常掉电导致userdata分区挂载异常无法进入系统,由于rootfs是只读的,此时仍可以进入系统,方便维护升级;
2 哪些平台与系统支持OverlayFS
2.1 支持的硬件平台
H3, H5, S5P4418, S5P6818, RK3399, RK3328, RK3568, RK3588系列开发板
2.2 支持的软件平台
所有基于Linux的系统
2.3 本文档的适用范围
本文仅适用于Rockchip平台的产品,如果你是其他平台,请点击此链接:How to use overlayfs on S5Pxxxx,H3,H5 platform/zh
3 如何鉴别系统是否工作在OverlayFS
执行df命令,如果/分区挂载类型为 overlay,表示OverlayFS正在工作:
pi@NanoPi-R6C:/etc$ df -h Filesystem Size Used Avail Use% Mounted on tmpfs 792M 2.2M 790M 1% /run overlay 25G 13G 11G 53% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 793M 116K 793M 1% /run/user/1000
4 使用OverlayFS时的分区布局
用户数据将由rootfs分区与userdata分区组成,对应的映像文件是rootfs.img和userdata.img.
使下如下命令查看分区布局:
查看eMMC分区布局: sudo parted -s /dev/mmcblk2 unit MiB print 查看SD卡分区布局: sudo parted -s /dev/mmcblk0 unit MiB print
输出信息如下所示:
pi@NanoPi-R6C:/etc$ sudo apt install parted pi@NanoPi-R6C:/etc$ sudo parted /dev/mmcblk0 print Model: SD SR32G (sd/mmc) Disk /dev/mmcblk0: 31.9GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 8389kB 12.6MB 4194kB uboot 2 12.6MB 16.8MB 4194kB misc 3 16.8MB 21.0MB 4194kB dtbo 4 21.0MB 37.7MB 16.8MB resource 5 37.7MB 79.7MB 41.9MB kernel 6 79.7MB 113MB 33.6MB boot 7 113MB 147MB 33.6MB recovery 8 147MB 4173MB 4027MB ext4 rootfs 9 4173MB 31.9GB 27.7GB ext4 userdata
其中,rootfs分区是只读挂载的,userdata是可读写挂载的, rootfs分区存放固化的系统数据,后续对根目录的写入,都会写入到userdata分区, 因此格式化userdata也就相当于恢复出厂设置。
5 常用操作
注意事项:
- 这些操作会擦除用户数据,需要预先备份好数据
- 需要将固件更新至2023/03/14或之后的版本,或者单独更新boot.img
- 命令中出现的/dev/mmcblkX设备节点是虚构的节点,需要改成真实的设备,eMMC的设备节点是/dev/mmcblk2,TF卡的设备节点是/dev/mmcblk0
5.1 查看当前的分区布局
sudo apt update sudo apt install parted export DEV=/dev/mmcblkX # 需要改成真实的设备 sudo parted -s ${DEV} unit MiB print
5.2 禁用OverlayFS特性
在根目录下创建一个名为“.init_wipedata”的文件,内容为“overlayfs=disable”,然后重启,命令如下所示:
sudo passwd root # 为root用户创建密码,如果之前没有做 su - root -c 'echo "overlayfs=disable" > /.init_wipedata' sudo reboot
5.3 调整userdata分区大小并创建一个额外分区
- 查看当前的分区布局
sudo apt update sudo apt install parted fdisk export DEV=/dev/mmcblkX # 需要改成真实的设备 sudo parted -s ${DEV} unit MiB print
- 调整userdata分区的大小
这里以调整为8G大小为例,在根目录下创建一个名为“.init_wipedata”的文件,内容为“overlayfs=enable userdata=8096”,然后重启,其中userdata=后跟新的userdata分区大小,单位为MB,命令如下所示:
su - root -c 'echo "overlayfs=enable userdata=8096" > /.init_wipedata' sudo reboot
重启后, 正常情况下,可以看到userdata分区已调整为8GB:
export DEV=/dev/mmcblkX # 需要改成真实的设备 sudo parted -s ${DEV} unit MiB print
- 创建新分区并格式化
(echo n; echo ""; echo ""; echo ""; echo w) | sudo fdisk ${DEV} NUM=$(sudo parted ${DEV} print | awk 'NF > 1 {p = $1} END {print p}') # 获取最后一个分区的序号 sudo mkfs.ext4 ${DEV}p${NUM}
- 挂载新分区到指定目录
sudo mkdir -p /oem sudo blkid ${DEV}p${NUM} # 记下UUID # 配置开机自动挂载新创建的分区 sudo vi /etc/fstab # 在文件末尾加入如下内容(其中UUID需替换为真实的) UUID=bbb06fe1-df52-4c7c-b2eb-926b14605fe4 /oem ext4 suid,dev,exec,auto,nouser,async,noatime,nofail 0 0 # 输入以下命令挂载分区 sudo mount /oem
5.4 恢复出厂设置(清空userdata数据)
su - root -c 'echo "overlayfs=enable" > /.init_wipedata' sudo reboot
下次启动到ramdisk阶段,会对userdata分区进行格式化,/var/.init_wipedata 文件也会被清除。
5.5 调试
如发现分区未变化,可能是出现了错误,用以下命令检查是否有错误信息打印:
dmesg | grep initfs