linux overlay目录作用,配置overlay(overlayfs)根目录挂载构建deb

本文介绍了如何利用overlayfs在Linux系统中构建无盘工作站,通过TFTP+PXE启动,结合overlayfs挂载根目录,实现了轻量级的启动环境。在debian发行版中,通过修改initrd脚本,加载overlay、squashfs和tmpfs模块,创建overlay目录结构,并从远程服务器接收squash镜像挂载为只读层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置overlay(overlayfs)根目录挂载构建deb

发布时间:2020-02-27 09:47:21

来源:51CTO

阅读:9628

作者:btvnlue

据wikipedia描述overlayfs在2014年融入linux内核,其轻量和易用特性已在openwrt中应用,但在debian发行版本中还没有直接使用overlayfs挂载根目录的启动选项。增加启动选项需对启动initrd进行相应改造,debian的initrt脚本已经预留了应用接口,使得应用overlayfs和无盘(或简盘)工作变得相对简单。

构建无盘工作站使用

TFTP+PXE启动服务器 <=== QEMU客户端

进行改造和测试

因需要在已安装系统中改造initrd,首先分析mkinitramfs脚本,可以得到启动脚本模板init使用的是/usr/share/initramfs-tools/init,进而分析该init脚本。

init脚本中挂载根目录片段:

:log_begin_msg "Mounting root file system"

# Always load local and nfs (since these might be needed for /etc or

# /usr, irrespective of the boot script used to mount the rootfs).

. /scripts/local

. /scripts/nfs

. /scripts/${BOOT}

parse_numeric ${ROOT}

maybe_break mountroot

mount_top

mount_premount

mountroot

log_end_msg

:

:

由此,在启动服务器上构建TFTP和PXE启动环境,配置PXE脚本启动部分可以使用BOOT参数传递应用overlay

在scripts子目录下需要增加overlay脚本文件,其中定义mountroot函数。

无盘工作使用tmpfs内存文件作为根目录。:

:

#Use general mapping functions

. /scripts/functions

#Load related kernel modules

modprobe overlay

modprobe squashfs

modprobe tmpfs

#Setup overlay base directory

mkdir –p /overlay

mount –t tmpfs tmpfs /overlay –o size=4G

:

:

overlay需要底层根目录作为只读的基础结构,在openwrt中使用flash区块,而在无盘环境内可以考虑多种选择,直接使用initrt的根目录,nfs挂载,本地squash镜像,远程squash镜像。

为保证无盘环境,而因initrd镜像的系统功能是不完整的,因debian的initrt环境下已有tftp客户端,在这里使用远程squash镜像方式。

(在单网卡环境下,nfs根挂载和overlayfs存在耦合性问题,并造成操作系统网络连接和应用系统存在配置干扰,造成系统网络不完整或不稳定,如需nfs根挂载,需使用至少双网卡方式,减少基础系统连接和应用网络的依赖和影响。因此种方式增加配置复杂程度且与overlay主题无关,不选择使用)

可以将squash镜像放置在pxe的tftp服务器上,debian(stretch)的最简安装系统后大约使用1.5G硬盘,squash镜像可以压缩到200M,在100M网络环境下传输30s左右。

补充后续脚本:

:

#Setup overlay mapping directories

mkdir -p /overlay/lower

mkdir -p /overlay/upper

mkdir -p /overlay/work

:

:#Recieve squash image and mount

tftp –g –l /overlay/$SQUASHIMAGE –r $REMOTESQUASHIMAGE $PXEHOST

mount –t squashfs /overlay/$SQUASHIMAGE /overlay/lower

:

:

debian的initrd环境中使用/root作为根挂载的准备目录,后续/dev,/proc,/sys等系统配置已有相应脚本,所以仅在overlay脚本中映射挂载/root即可:

:mount –t overlay overlay /root –o lowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/work

:

:

问题记录:

- 制作squash镜像的时候需要将原来系统的/etc/fstab的根目录和swap条目删除,stretch版本系统使用systemd,虽不影响使用,缺失映射盘会有很长超时等待

- 制作initrd镜像时,如需对镜像内容确认,可以恢复至本地文件夹,但最近版initrd使用了合成模式(不太明白原因),导致如果单纯做cpio的输出仅包含kernel/x86/microcode下面的内容,使用合成命令(cpio -id ; zcat | cpio -id) < ../$OUTFILE可以解析所有内容

``` ./configure -prefix /home/user/3588/qt-3588-6.8.2/ \ -opensource \ -confirm-license \ -release \ -strip \ -shared \ -xplatform linux-aarch64-gnu-g++ \ -optimized-qmake \ -c++std c++11 \ --rpath=no \ -pch \ -skip qt3d \ -skip qtactiveqt \ -skip qtandroidextras \ -skip qtcanvas3d \ -skip qtconnectivity \ -skip qtdatavis3d \ -skip qtdoc \ -skip qtgamepad \ -skip qtlocation \ -skip qtmacextras \ -skip qtnetworkauth \ -skip qtpurchasing \ -skip qtremoteobjects \ -skip qtscript \ -skip qtscxml \ -skip qtsensors \ -skip qtspeech \ -skip qtsvg \ -skip qttools \ -skip qttranslations \ -skip qtwayland \ -skip qtwebengine \ -skip qtwebview \ -skip qtwinextras \ -skip qtx11extras \ -skip qtxmlpatterns \ -make libs \ -make examples \ -nomake tools -nomake tests \ -gui \ -widgets \ -dbus-runtime \ --glib=no \ --iconv=no \ --pcre=qt \ --zlib=qt \ -no-openssl \ --freetype=qt \ --harfbuzz=qt \ -opengl es2 \ -egl \ -eglfs \ -qpa eglfs \ -linuxfb \ --xcb=no \ --libpng=qt \ --libjpeg=qt \ --sqlite=qt \ -plugin-sql-sqlite \ -I /home/user/3588/tslib-1.21/aarch64-tslib/include \ -L /home/user/3588/tslib-1.21/aarch64-tslib/lib \ -device-option CROSS_COMPILE=aarch64-none-linux-gnu \ -recheck-all```user@user:~/3588$ cd linux5.10/debian/ user@user:~/3588/linux5.10/debian$ ls -l 总计 3773880 drwxr-xr-x 23 root root 4096 3月 20 12:02 binary drwxrwxr-x 4 user user 4096 3月 17 15:39 customer lrwxrwxrwx 1 user user 44 3月 18 17:20 'linaro-bullseye-alip-*.tar.gz' -> linaro-bullseye-desktop-alip-20250318.tar.gz lrwxrwxrwx 1 user user 29 3月 18 17:20 linaro-bullseye-arm64.tar.gz -> 'linaro-bullseye-alip-*.tar.gz' -rw-rw-rw- 1 user user 644043081 3月 18 17:12 linaro-bullseye-desktop-alip-20250318.tar.gz -rw-r--r-- 1 root root 3461349376 3月 20 12:02 linaro-rootfs.img -rwxrwxr-x 1 user user 1041 3月 7 15:16 mk-base-debian.sh -rwxrwxr-x 1 user user 716 3月 7 15:16 mk-image.sh -rwxrwxr-x 1 user user 4554 3月 7 15:16 mk-iso-debian.sh -rwxrwxr-x 1 user user 10403 3月 7 15:16 mk-rootfs-bullseye-HAILO.sh -rwxrwxr-x 1 user user 7069 3月 7 15:16 mk-rootfs-bullseye.sh -rwxrwxr-x 1 user user 10957 3月 18 15:51 mk-rootfs-bullseye-YZ.sh -rwxrwxr-x 1 user user 87 3月 7 15:16 mk-rootfs.sh drwxrwxr-x 4 user user 4096 3月 7 15:16 overlay drwxrwxr-x 4 user user 4096 3月 7 15:16 overlay-debug drwxrwxr-x 3 user user 4096 3月 7 15:16 overlay-firmware drwxrwxr-x 3 user user 4096 3月 7 15:16 overlay-zeiet drwxrwxr-x 4 user user 4096 3月 7 15:16 packages drwxrwxr-x 7 user user 4096 3月 7 15:16 packages-patches -rwxrwxr-x 1 user user 2483 3月 7 15:16 post-build.sh -rw-rw-r-- 1 user user 2373 3月 7 15:16 readme.md drwxrwxr-x 4 user user 4096 3月 7 15:16 scripts drwxrwxr-x 12 user user 4096 3月 7 15:16 ubuntu-build-service我的编译环境目标系统目录这样,没找到有包含/usr/lib、/usr/include等关键目录结构
03-25
<think>好的,我现在需要帮助用户解决他们在编译环境中目标系统目录缺少/usr/lib和/usr/include等关键结构的问题。用户提供的配置脚本和目录结构显示他们可能在交叉编译Qt,特别是针对AArch64架构的RK3588平台。用户执行了./configure命令,并指定了前缀路径,但生成的目录中似乎没有预期的系统目录。 首先,我应该先理解用户的环境。用户运行的是Debian系统,目录在~/3588/linux5.10/debian/下。执行ls -l后,列出了很多文件和子目录,如binary、customer、tar.gz文件、各种脚本等。但用户指出没有找到/usr/lib、/usr/include这些目录,这可能影响后续的编译和库的链接。 接下来,我需要分析用户提供的configure命令参数。prefix设置为/home/user/3588/qt-3588-6.8.2/,这意味着Qt会被安装到这个目录下。然而,目标系统的根文件系统可能位于其他地方,比如用户提到的linaro-rootfs.img,这个镜像文件可能包含目标系统的目录结构。用户可能没有正确挂载或解压这个镜像,导致无法看到里面的/usr/lib等目录。 用户可能混淆了Qt的安装目录和目标系统的根目录。Qt的prefix是安装Qt库的位置,而目标系统的根文件系统应该包含操作系统的标准目录结构。需要检查linaro-rootfs.img是否已正确解压或挂载,以确认其中是否包含所需的目录。 此外,用户在configure命令中指定了-I和-L参数指向tslib的头文件和库路径,这可能用于触摸屏支持。但目标系统的库和头文件通常位于sysroot中,用户是否在配置时指定了正确的sysroot?查看configure参数中没有--sysroot选项,这可能导致编译器找不到目标系统的标准头文件和库。 另一个可能性是用户在构建Qt时没有正确设置sysroot,因此编译系统无法定位目标系统的/usr/lib和include目录。在交叉编译时,通常需要通过-sysroot参数指定目标系统的根文件系统路径,这样编译器才能找到必要的依赖。 用户提供的目录列表中有一个linaro-rootfs.img文件,这可能是一个镜像文件,需要挂载后才能访问其中的目录结构。用户可能需要挂载该镜像到某个目录,例如使用mount命令,然后检查其中是否包含/usr/lib等目录。如果镜像中没有这些目录,可能需要重新构建根文件系统,或者在配置Qt时指定正确的sysroot路径。 此外,用户可能没有正确生成目标系统的根文件系统,或者生成过程中遗漏了某些部分。用户运行了一些脚本如mk-rootfs-bullseye.sh等,这些脚本是否成功执行并生成了完整的目录结构?需要检查这些脚本的执行日志,确认是否有错误发生。 总结来说,可能的解决步骤包括: 1. 确认linaro-rootfs.img是否正确包含目标系统的目录结构,挂载并检查。 2. 在Qt的configure命令中添加--sysroot参数,指向目标系统的根文件系统路径。 3. 确保交叉编译工具链正确配置,能够找到目标系统的库和头文件。 4. 检查构建根文件系统的脚本是否正确执行,是否遗漏了关键目录的创建。 接下来,我需要将这些思路整理成结构化的回答,帮助用户逐步排查问题,并提供具体的操作建议,例如如何挂载镜像文件,如何配置sysroot等。同时,要提醒用户注意路径的正确性,以及确保交叉编译工具链的兼容性。</think>根据你的描述,你正在为RK3588平台交叉编译Qt 6.8.2,但目标系统目录中缺少关键系统目录结构(如/usr/lib、/usr/include)。以下是逐步排查和解决方案: --- ### **1. 确认根文件系统镜像内容** 从`ls -l`输出中可以看到存在`linaro-rootfs.img`(3.4GB),这是预编译的根文件系统镜像。需挂载检查其内部结构: ```bash # 创建挂载点 sudo mkdir -p /mnt/linaro-rootfs # 挂载镜像(可能需要计算偏移量,建议用loop设备) sudo mount -o loop linaro-rootfs.img /mnt/linaro-rootfs # 检查目录结构 ls -l /mnt/linaro-rootfs/usr/lib /mnt/linaro-rootfs/usr/include ``` --- ### **2. 配置Qt时缺少sysroot参数** 你的`./configure`命令中未指定`-sysroot`参数,导致编译系统无法定位目标系统的库和头文件。应补充: ```bash -sysroot /path/to/target/sysroot ``` 假设已挂载镜像到`/mnt/linaro-rootfs`,则应改为: ```bash -sysroot /mnt/linaro-rootfs ``` --- ### **3. 交叉编译环境配置建议** 完整的Qt交叉编译配置应包含以下关键参数: ```bash -device-option CROSS_COMPILE=aarch64-none-linux-gnu \ -sysroot /mnt/linaro-rootfs \ -prefix /usr/local/qt6 \ # 建议安装到目标系统路径 -extprefix /home/user/3588/qt-3588-6.8.2 # 主机上的输出路径 ``` --- ### **4. 关键参数解析** | 参数 | 作用 | 你的配置可能的问题 | |------|------|-------------------| | `-prefix` | Qt安装到目标系统的路径 | 应设为目标系统的绝对路径(如`/usr/local/qt6`) | | `-extprefix` | 主机上编译结果的输出路径 | 你当前设置的`-prefix`实际应作为`-extprefix` | | `-sysroot` | 目标系统的根文件系统 | 未指定,导致找不到库和头文件 | --- ### **5. 重建根文件系统** 若镜像中确实缺少关键目录,需检查构建脚本: ```bash # 检查根文件系统构建脚本 nano mk-rootfs-bullseye.sh ``` 确保脚本中调用了`debootstrap`或包含以下关键步骤: ```bash debootstrap --arch=arm64 bullseye $ROOTFS_DIR http://deb.debian.org/debian # 安装基础开发库 chroot $ROOTFS_DIR apt install -y libc6-dev libstdc++-10-dev ``` --- ### **6. 验证交叉编译工具链** 确保交叉编译器能正确找到头文件和库: ```bash # 使用环境变量指定sysroot export SYSROOT=/mnt/linaro-rootfs aarch64-none-linux-gnu-gcc -print-sysroot # 测试头文件查找 echo '#include <stdio.h>' | aarch64-none-linux-gnu-gcc -E -x c - -I $SYSROOT/usr/include ``` --- ### **7. 建议的完整配置命令** ```bash ./configure \ -prefix /usr/local/qt6 \ -extprefix /home/user/3588/qt-3588-6.8.2 \ -sysroot /mnt/linaro-rootfs \ -opensource -confirm-license -release \ -xplatform linux-aarch64-gnu-g++ \ -device-option CROSS_COMPILE=aarch64-none-linux-gnu \ -c++std c++11 \ -opengl es2 -eglfs \ -I /home/user/3588/tslib-1.21/aarch64-tslib/include \ -L /home/user/3588/tslib-1.21/aarch64-tslib/lib \ # 其他参数保持不变... ``` --- ### **8. 后续操作建议** 1. 完成配置后执行 `make -j$(nproc)` 2. 安装到extprefix路径:`make install` 3. 将`qt-3588-6.8.2`目录整体拷贝到目标系统的`/usr/local/`目录 通过以上步骤,可确保Qt正确链接到目标系统的库和头文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值