系统构建--从sdcard中加载根文件系统

本文介绍如何使用QEMU模拟硬件加载分区block设备作为嵌入式Linux系统的根文件系统,包括创建ext3格式的rootfs,以及通过u-boot和qemu进行加载测试的方法。

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

本文介绍的是使用分区block设备作为根文件系统的加载方法,使用QEMU来模拟硬件来进行讲解。
github仓库:https://github.com/rikeyone/qemu-linux-system.git

制作嵌入式Linux系统的rootfs

cd rootfs/
sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=50
sudo mkfs.ext3 rootfs.ext3
sudo mount -t ext3 rootfs.ext3 /mnt -o loop
sudo cp _install/* /mnt -fra
sudo umount /mnt
sudo chmod 666 rootfs.ext3

最后会生成一个名字为rootfs.ext3的文件,这个就是我们想要的一个rootfs,文件系统格式为ext3,可以使用qemu进行测试。

qemu加载

qemu-system-arm -M vexpress-a9 \
    -smp 4 \
    -m 1024m \
    -kernel linux-4.0/arch/arm/boot/zImage \
    -append "root=/dev/mmcblk0 rw console=ttyAMA0 loglevel=8" \
    -dtb linux-4.0/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
    -sd rootfs/rootfs.ext3 \
    -nographic

关键是传入“root=/dev/mmcblk0 rw”的cmdline,以及对应的qemu选项“-sd rootfs/rootfs.ext3”。

u-boot加载

如果我们在实际硬件上使用,并且使用uboot作为bootloader,我们只需要有对应的emmc外设即可,并且在外设提前烧录rootfs中的内容即可。传递的cmdline还和上面qemu测试时一致:

root=/dev/mmcblk0 rw
<think>我们参考引用的信息,但用户的需求是在RK3506上构建Ubuntu文件系统。引用中提到了RK356X/RK3588以及RK3568构建Ubuntu根文件系统的方法,我们可以借鉴这些步骤,但需要针对RK3506进行适配。由于RK3506与RK3568等芯片同属Rockchip平台,很多步骤是类似的。 构建Ubuntu根文件系统的主要步骤包括: 1. 下载Ubuntu base镜像 2. 解压镜像并进入目标目录 3. 安装必要的工具和软件包 4. 配置系统(包括网络、用户、时区等) 5. 安装RK3506的特定驱动(如GPU、VPU等) 6. 制作根文件系统镜像 由于RK3506的驱动可能需要从Rockchip官方获取,我们假设已经获得了相应的驱动包(如内核模块、固件等)。 具体步骤: ### 1. 下载Ubuntu base镜像 从Ubuntu官网下载Ubuntu base镜像(这里以Ubuntu 22.04为例): ```bash wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-arm64.tar.gz ``` ### 2. 创建并解压根文件系统目录 ```bash sudo su mkdir rk3506-ubuntu tar -xzf ubuntu-base-22.04-base-arm64.tar.gz -C rk3506-ubuntu ``` ### 3. 安装qemu-user-static用于模拟arm64环境 ```bash sudo apt install qemu-user-static cp /usr/bin/qemu-aarch64-static rk3506-ubuntu/usr/bin/ ``` ### 4. 准备挂载脚本 创建挂载脚本`mount.sh`(用于挂载必要的系统目录): ```bash #!/bin/bash mnt() { echo "MOUNTING" sudo mount -t proc /proc ${2}proc sudo mount -t sysfs /sys ${2}sys sudo mount -o bind /dev ${2}dev sudo mount -o bind /dev/pts ${2}dev/pts sudo chroot ${2} } umnt() { echo "UNMOUNTING" sudo umount ${2}proc sudo umount ${2}sys sudo umount ${2}dev/pts sudo umount ${2}dev } if [ "$1" == "-m" ] && [ -n "$2" ]; then mnt $1 $2 elif [ "$1" == "-u" ] && [ -n "$2" ]; then umnt $1 $2 else echo "" echo "Either 1'st, 2'nd or both parameters missing" echo "" echo "1'st parameter can be one of these: -m(mount) OR -u(umount)" echo "2'nd parameter is the full path of rootfs directory" echo "" echo "For example: ch-mount -m /media/sdcard/" echo "" echo 1st parameter : ${1} echo 2nd parameter : ${2} fi ``` 给脚本执行权限: ```bash chmod +x mount.sh ``` ### 5. 挂载并进入根文件系统 ```bash ./mount.sh -m rk3506-ubuntu/ ``` 此时会进入chroot环境。 ### 6. 在chroot环境中配置系统 设置DNS(避免网络问题): ```bash echo "nameserver 8.8.8.8" > /etc/resolv.conf ``` 更新软件源(这里使用清华源): ```bash cat > /etc/apt/sources.list <<EOF deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse EOF ``` 更新软件包: ```bash apt update apt upgrade ``` 安装基础软件包: ```bash apt install sudo vim net-tools ethtool ifupdown network-manager iputils-ping openssh-server bash-completion resolvconf ``` 设置root密码: ```bash passwd ``` 创建新用户(例如rock): ```bash useradd -s /bin/bash -m -G sudo rock passwd rock ``` 设置主机名: ```bash echo "rk3506" > /etc/hostname ``` 配置时区: ```bash ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ``` 退出chroot环境(先退出shell,再卸载): ```bash exit ./mount.sh -u rk3506-ubuntu/ ``` ### 7. 安装RK3506的驱动 这一步需要RK3506的SDK支持,通常包括内核模块和固件。假设我们已经编译好了RK3506的内核,并生成了模块。 将内核模块安装到根文件系统: ```bash cd /path/to/rk3506-kernel make ARCH=arm64 INSTALL_MOD_PATH=/path/to/rk3506-ubuntu modules_install ``` 拷贝设备树文件(dtb)到根文件系统的/boot目录(如果使用): ```bash cp /path/to/rk3506-kernel/arch/arm64/boot/dts/rockchip/rk3506-evb.dtb /path/to/rk3506-ubuntu/boot/ ``` 拷贝内核镜像(Image)到根文件系统的/boot目录: ```bash cp /path/to/rk3506-kernel/arch/arm64/boot/Image /path/to/rk3506-ubuntu/boot/ ``` 另外,还需要一些固件文件(如WiFi、蓝牙等),根据具体硬件从SDK中获取并放入根文件系统的`/lib/firmware`目录。 ### 8. 配置fstab 编辑`rk3506-ubuntu/etc/fstab`,添加必要的挂载点,例如: ``` # <file system> <mount point> <type> <options> <dump> <pass> /dev/mmcblk0p1 /boot ext4 defaults 0 2 /dev/mmcblk0p2 / ext4 defaults 0 1 ``` ### 9. 制作根文件系统镜像 使用以下命令创建ext4格式的镜像文件: ```bash dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048 mkfs.ext4 ubuntu-rootfs.img mkdir rootfs-mount sudo mount ubuntu-rootfs.img rootfs-mount sudo cp -rfp rk3506-ubuntu/* rootfs-mount/ sudo umount rootfs-mount e2fsck -p -f ubuntu-rootfs.img resize2fs -M ubuntu-rootfs.img ``` 这样,我们就得到了一个名为`ubuntu-rootfs.img`的根文件系统镜像,可以烧录到RK3506开发板的相应分区。 > **注意**:以上步骤需要根据RK3506的具体硬件配置进行调整,特别是驱动部分。如果RK3506有GPU、VPU等,还需要安装对应的用户空间库。 ### 相关问题 1. 如何为RK3506编译Linux内核? 2. 如何将构建好的Ubuntu根文件系统烧录到RK3506开发板? 3. RK3506的GPU驱动如何安装? 4. 如何配置RK3506的启动引导(如U-Boot)以启动Ubuntu?</think>### 在RK3506上构建Ubuntu文件系统的完整步骤 #### 1. **基础环境准备** ```bash # 进入root环境避免权限问题 sudo -i mkdir ~/rk3506-ubuntu && cd ~/rk3506-ubuntu ``` #### 2. **下载Ubuntu base镜像** 从官网获取ARM64架构的Ubuntu base镜像: ```bash wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-arm64.tar.gz ``` #### 3. **解压并准备根文件系统** ```bash # 创建解压目录 mkdir rootfs tar -xzf ubuntu-base-22.04-base-arm64.tar.gz -C rootfs # 安装必要工具 apt install qemu-user-static debootstrap cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/ ``` #### 4. **配置网络与软件源** ```bash # 配置DNS echo "nameserver 8.8.8.8" > rootfs/etc/resolv.conf # 替换为国内源(以清华源为例) cat > rootfs/etc/apt/sources.list <<EOF deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse EOF ``` #### 5. **挂载系统并进入chroot环境** 创建挂载脚本: ```bash cat > mount.sh <<'EOF' #!/bin/bash function mnt() { mount -t proc /proc ${2}proc mount -t sysfs /sys ${2}sys mount -o bind /dev ${2}dev mount -o bind /dev/pts ${2}dev/pts chroot ${2} } function umnt() { umount ${2}proc umount ${2}sys umount ${2}dev/pts umount ${2}dev } case "$1" in -m) mnt $1 $2 ;; -u) umnt $1 $2 ;; *) echo "Usage: $0 {-m|-u} MOUNT_POINT" ;; esac EOF chmod +x mount.sh ``` 挂载并进入: ```bash ./mount.sh -m rootfs/ ``` #### 6. **在chroot环境中配置系统** ```bash # 更新系统 apt update && apt upgrade -y # 安装基础软件 apt install sudo net-tools ethtool ifupdown network-manager ssh vim bash-completion # 设置root密码 passwd # 创建新用户 useradd -m -s /bin/bash rock passwd rock usermod -aG sudo rock # 设置主机名 echo "rk3506" > /etc/hostname # 配置时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ``` #### 7. **安装RK3506专用驱动** ```bash # 从SDK获取驱动(需提前准备) cp -r /path/to/rk3506-drivers/* / # 配置fstab(示例) cat >> /etc/fstab <<EOF /dev/mmcblk0p1 /boot auto defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 EOF ``` #### 8. **优化系统配置** ```bash # 缩短开机等待时间 systemctl mask systemd-udev-settle.service sed -i 's/TimeoutStartSec=90s/TimeoutStartSec=5s/' /lib/systemd/system/*.service # 启用终端补全 echo "source /etc/bash_completion" >> /etc/bash.bashrc ``` #### 9. **制作根文件系统镜像** 退出chroot环境后执行: ```bash ./mount.sh -u rootfs/ # 卸载 # 创建EXT4镜像 dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048 mkfs.ext4 ubuntu-rootfs.img # 填充内容 mkdir tmp-mount mount -o loop ubuntu-rootfs.img tmp-mount cp -a rootfs/* tmp-mount/ umount tmp-mount e2fsck -p -f ubuntu-rootfs.img resize2fs -M ubuntu-rootfs.img ``` #### 10. **烧录到开发板** ```bash # 通过USB或TF烧录 rkdeveloptool write-partition 0x400000 ubuntu-rootfs.img ``` > **关键注意事项**: > 1. 驱动需从RK3506 SDK获取,路径通常在`kernel/drivers/gpu/arm`和`kernel/drivers/video/rockchip`[^2] > 2. 首次启动需通过串口调试,使用`dmesg | grep -i error`检查驱动加载 > 3. 推荐使用Ubuntu 22.04 LTS保证长期支持 ### 常见问题解决 - **WiFi/BT无法使用**:检查`/lib/firmware/brcm`中的固件文件 - **显示异常**:确认Mali GPU驱动是否正确安装 - **启动住**:检查`/boot/extlinux/extlinux.conf`内核参数 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值