使用ramdisk启动ubuntu文件系统(pivot_root)

简介: 使用ramdisk启动ubuntu文件系统(pivot_root)

环境

Qemu 4.1

vexpress-ca9

 

参考

Using the initial RAM disk (initrd)

pivot_root - change the root filesystem

 

概述

  为了减小linux内核的大小,可以把一些外设驱动编译成内核模块,但是在启动ubuntu的时候,需要加载存放在ubuntu文件系统中的flash驱动,而ubuntu文件系统本身也存放在flash中。为了解决这样的问题,可以使用ramdisk内存文件系统,将必备的驱动模块,比如这里的flash驱动模块放到ramdisk中,当uboot引导linux时,可以将ramdisk和内核镜像先加载到内存,启动内核时,会将ramdisk在内存中的内存地址传给内核。

  当内核启动后,会先将ramdisk作为根文件系统,然后使用insmod加载存放在ramdisk文件系统中的flash驱动,就可以访问存放有ubuntu文件系统的块设备节点,最后再通过命令将根文件系统切换为ubuntu文件系统。

 

正文

  这里为了简单起见,没有把存储器驱动编译成内核模块,只是演示一下从ramdisk切到ubuntu的过程。

  原先直接启动ubuntu使用的命令是:

kernel_dir=./linux-4.14.13
kernel_image=${kernel_dir}/arch/arm/boot/zImage
dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb
sudo qemu-system-arm \
    -M vexpress-a9 \
    -m 1024M \
    -smp 4 \
    -kernel ${kernel_image} \
    -append "noinitrd root=/dev/vda1 rw rootfstype=ext4 console=ttyAMA0,115200" \
    -dtb ${dtb_image} \
    -drive if=none,file=./ubuntu_rootfs/ubuntu.fulldisk,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -nic tap \
    -serial stdio

  其中vda是一个虚拟磁盘,它的第一个分区中存放的是ubuntu根文件系统。

  现在,如果使用ramdisk启动ubuntu的话,修改启动命令:

kernel_dir=./linux-4.14.13
kernel_image=${kernel_dir}/arch/arm/boot/zImage
dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb
sudo qemu-system-arm \
    -M vexpress-a9 \
    -m 1024M \
    -smp 4 \
    -kernel ${kernel_image} \
    -dtb ${dtb_image} \
    -drive if=none,file=./ubuntu_rootfs/ubuntu.fulldisk,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -append "root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0 init=/linuxrc ignore_loglevel" \
    -initrd ./rootfs/ramdisk.img \
    -nic tap \
    -serial stdio

 为此,需要修改ramdisk的内容,原先我用的ramdisk中的根文件系统是用busybox编译生成的,/linuxrc是指向/bin/busybox的软连接。需要对此进行修改,修改后的ramdisk内容如下(为了简单明了,我仅保留必备的一些命令):

.
├── bin
│   ├── busybox
│   ├── cd -> busybox
│   ├── chroot -> busybox
│   ├── echo -> busybox
│   ├── exec -> busybox
│   ├── mdev -> busybox
│   ├── mkdir -> busybox
│   ├── mount -> busybox
│   ├── pivot_root -> busybox
│   ├── sh -> busybox
│   └── umount -> busybox
├── dev
├── linuxrc
└── sys

  其中linuxrc是一个shell脚本,内容如下:

#!/bin/sh
echo "hello world"
echo "mount -t sysfs sysfs /sys"
mount -t sysfs sysfs /sys
echo "mdev -s"
mdev -s
echo "mkdir /newroot"
mkdir /newroot
echo "mount -t ext4 /dev/vda1 /newroot"
mount -t ext4 /dev/vda1 /newroot
echo "sys"
umount /sys
echo "cd /newroot"
cd /newroot
echo "mkdir -p oldroot"
mkdir -p oldroot
echo "pivot_root .  oldroot"
pivot_root .  oldroot
echo "exec chroot . /sbin/init <dev/console >dev/console 2>&1"
exec chroot . /sbin/init <dev/console >dev/console 2>&1

  如果ramdisk里有需要加载的flash驱动,需要先insmod,然后才能看到/dev/vda1。

  ubuntu文件系统中/sbin/init是一个软连接,实际指向的是/lib/systemd/systemd。

  制作ramdisk镜像的命令:

#!/bin/bash
sudo dd if=/dev/zero of=ramdisk bs=1M count=32
sudo mkfs.ext4 -F ramdisk
sudo mkdir -p tmpfs
sudo mount -t ext4 ramdisk ./tmpfs/  -o loop
sudo cp -raf rootfs/*  tmpfs/
sudo umount tmpfs
sudo gzip --best -c ramdisk > ramdisk.gz
sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

 

  下面是启动log:

 

完。

相关文章
|
2月前
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
149 0
|
4月前
|
Ubuntu 网络协议 搜索推荐
Ubuntu系统上定制文件系统
基于全志T507H处理器设计研发的OKT507-C开发板为例进行介绍。 Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统
|
6月前
|
Ubuntu 网络协议 搜索推荐
在Ubuntu系统上定制文件系统
在Ubuntu上定制全志T507H开发板的文件系统,包括解压文件系统、安装QEMU、修改配置、挂载文件系统、安装软件及打包文件系统。使用QEMU模拟器来挂载和操作文件系统,通过`apt-get`在线安装所需软件,例如minicom。最后,将定制的文件系统打包成新的ISO镜像,用于烧录到开发板,实现预装软件的自动化流程,简化批量生产中的系统配置步骤。
|
6月前
|
Ubuntu
蓝易云 - 解决ubuntu文件系统变成只读的方法
请注意,上述操作可能会导致数据丢失,所以在操作前最好备份重要数据。如果问题依然存在,可能需要考虑更深入的系统诊断或者重装系统。
233 1
|
7月前
|
Ubuntu 网络协议 搜索推荐
Ubuntu系统上定制文件系统
基于全志T507H处理器设计研发的OKT507-C开发板为例进行介绍。 Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统
|
7月前
|
Ubuntu 网络协议 搜索推荐
如何在Ubuntu系统上定制文件系统
该文介绍了如何在基于全志T507H处理器的OKT507-C开发板上定制Ubuntu文件系统。首先,通过解压文件系统到指定目录。接着,安装QEMU模拟器并修改配置,包括复制QEMU静态文件和DNS配置到文件系统,以及更新下载源。然后,挂载文件系统并使用shell脚本进行挂载和卸载,接着在挂载的文件系统中通过apt-get安装所需软件,如minicom。最后,打包文件系统为tar.gz格式,替换旧的文件系统压缩包,重新编译生成新的镜像烧录到开发板。通过这种方法,可以方便地批量定制和预装软件到开发板,提高生产效率。
|
7月前
|
Ubuntu Linux 芯片
Linux(2)ubuntu rootfs根文件系统制作
Linux(2)ubuntu rootfs根文件系统制作
212 0
|
Ubuntu 安全
Ubuntu 20.04 搭建NFS文件系统
Ubuntu 20.04 搭建NFS文件系统
398 0
|
Ubuntu
嵌入式实践教程--ubuntu18.04-armhf根文件系统移植
嵌入式实践教程--ubuntu18.04-armhf根文件系统移植
|
Ubuntu Unix Linux
Linux (Ubuntu)文件系统结构(入门必看)
Linux (Ubuntu)文件系统结构(入门必看)