Difference between revisions of "How to use overlayfs on Linux/zh"

From FriendlyELEC WiKi
Jump to: navigation, search
(updated by API)
(updated by API)
 
(5 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
 
==什么是OverlayFS==
 
==什么是OverlayFS==
Overlayfs是Linux下的一种堆叠文件系统,通俗地讲,根文件系统虽然在逻辑仍然是一个分区,但物理上被拆分成了两个分区来存储,其中,一个分区只读存放固化的系统数据(rootfs分区),另一个分区存储写入的数据(data分区),优点如下:<br />
+
Overlayfs是Linux下的一种堆叠文件系统,通俗地讲,根文件系统虽然在逻辑仍然是一个分区,但物理上被拆分成了两个分区来存储,其中,一个分区只读存放固化的系统数据(rootfs分区),另一个分区存储写入的数据(userdata分区),优点如下:<br />
1) 方便恢复出厂设置,格式化data分区即可;<br />
+
1) 方便恢复出厂设置,格式化userdata分区即可;<br />
2) 避免重复掉电或异常掉电导致data分区挂载异常无法进入系统,由于rootfs是只读的,此时仍可以进入系统,方便维护升级;<br />
+
2) 避免重复掉电或异常掉电导致userdata分区挂载异常无法进入系统,由于rootfs是只读的,此时仍可以进入系统,方便维护升级;<br />
 
==哪些平台与系统支持OverlayFS==
 
==哪些平台与系统支持OverlayFS==
 
===支持的硬件平台===
 
===支持的硬件平台===
H3, H5, S5P4418, S5P6818, RK3399系列开发板
+
H3, H5, S5P4418, S5P6818, RK3399, RK3328, RK3568, RK3588系列开发板
 
===支持的软件平台===
 
===支持的软件平台===
FriendlyCore, FriendlyDesktop, Lubuntu
+
所有基于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-M1-Plus:~$ df
+
pi@NanoPi-R6C:/etc$ df -h
Filesystem     1K-blocks    Used Available Use% Mounted on
+
Filesystem     Size  Used Avail Use% Mounted on
udev              474848      0    474848  0% /dev
+
tmpfs           792M  2.2M  790M   1% /run
tmpfs             102304    3564    98740   4% /run
+
overlay         25G   13G  11G  53% /
overlay         28925547 1315493  26112465   5% /
+
tmpfs           3.9G    0 3.9G   0% /dev/shm
tmpfs             511512      0   511512   0% /dev/shm
+
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs               5120      4     5116   1% /run/lock
+
tmpfs           793M 116K  793M   1% /run/user/1000
tmpfs             511512      0    511512  0% /sys/fs/cgroup
+
/dev/mmcblk0p1    40862  11852    29010 30% /boot
+
tmpfs            102304      0    102304   0% /run/user/1000
+
 
</syntaxhighlight>
 
</syntaxhighlight>
 
==使用OverlayFS时的分区布局==
 
==使用OverlayFS时的分区布局==
会有三个分区,分别为 rootfs分区、data分区与boot分区,对应映像文件rootfs.img, userdata.img 和 boot.img:
+
用户数据将由rootfs分区与userdata分区组成,对应的映像文件是rootfs.img和userdata.img. <br />
 +
使下如下命令查看分区布局:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
root@NanoPi-M1-Plus:~# lsblk /dev/mmcblk0
+
查看eMMC分区布局: sudo parted -s /dev/mmcblk2 unit MiB print
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
+
查看SD卡分区布局: sudo parted -s /dev/mmcblk0 unit MiB print
mmcblk0    179:0    0 29.7G  0 disk
+
|-mmcblk0p2 179:2    0  1.2G  0 part
+
|-mmcblk0p3 179:3    0 28.5G  0 part
+
`-mmcblk0p1 179:1    0  40M  0 part /boot
+
 
</syntaxhighlight>
 
</syntaxhighlight>
其中,rootfs分区存放固化的系统数据,所有对根目录的数据写入,都会写入到 data分区。
+
输出信息如下所示:
==使用OverlayFS实现恢复出厂设置功能==
+
<syntaxhighlight lang="bash">
 +
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 />
  
===方法1: 手动清除user data分区数据===
+
==常用操作==
挂载data分区并重命名相关目录:
+
'''注意事项: '''<br/>
 +
* 这些操作会擦除用户数据,需要预先备份好数据<br>
 +
* 需要将固件更新至2023/03/14或之后的版本,或者单独更新boot.img<br>
 +
* 命令中出现的/dev/mmcblkX设备节点是虚构的节点,需要改成真实的设备,eMMC的设备节点是/dev/mmcblk2,TF卡的设备节点是/dev/mmcblk0<br>
 +
===查看当前的分区布局===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
mount /dev/mmcblk0p3 /media/ && cd /media/
+
sudo apt update
mv root/ deleteme.root
+
sudo apt install parted
mv work/ deleteme.work
+
export DEV=/dev/mmcblkX # 需要改成真实的设备
reboot
+
sudo parted -s ${DEV} unit MiB print
 
</syntaxhighlight>
 
</syntaxhighlight>
重启完成后,删除目录:
+
===禁用OverlayFS特性===
 +
在根目录下创建一个名为“.init_wipedata”的文件,内容为“overlayfs=disable”,然后重启,命令如下所示:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
mount /dev/mmcblk0p3 /media/ && rm -rf /media/deleteme.*
+
sudo passwd root  # 为root用户创建密码,如果之前没有做
 +
su - root -c 'echo "overlayfs=disable" > /.init_wipedata'
 +
sudo reboot
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
===调整userdata分区大小并创建一个额外分区===
===方法2: 通过命令行参数恢复出厂设置===
+
* 查看当前的分区布局
====S5P4418 & S5P6818平台====
+
在内核命令行参数中加入 wipedata=yes,S5P4418与S5P6818平台可以在系统运行时进行修改:
+
=====执行恢复出厂设置=====
+
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
sudo fw_setenv bootargs "`sed 's/ wipedata=yes//g;s/ wipedata=no//g' /proc/cmdline` wipedata=yes"
+
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>
下次开机时会抹掉data分区的数据。
+
重启后, 正常情况下,可以看到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">
 
<syntaxhighlight lang="bash">
sudo fw_setenv bootargs "`sed 's/ wipedata=yes//g;s/ wipedata=no//g' /proc/cmdline` wipedata=no"
+
su - root -c 'echo "overlayfs=enable" > /.init_wipedata'
 
sudo reboot
 
sudo reboot
 
</syntaxhighlight>
 
</syntaxhighlight>
====RK3399平台====
+
下次启动到ramdisk阶段,会对userdata分区进行格式化,/var/.init_wipedata 文件也会被清除。
 +
===调试===
 +
如发现分区未变化,可能是出现了错误,用以下命令检查是否有错误信息打印:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
echo wipedata=yes > /var/.init_wipedata; sync; reboot
+
dmesg | grep initfs
 
</syntaxhighlight>
 
</syntaxhighlight>
下次启动到ramdisk阶段,会对data分区进行格式化,/var/.init_wipedata 文件也会被清除。
 
==临时禁用OverlayFS==
 
可以做完TF启动卡之后,用 fdisk 操作TF卡,删除 data 分区。
 

Latest revision as of 02:36, 17 May 2023

English

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