使用ramdisk启动ubuntu文件系统
环境
Qemu 4.1
vexpress-ca9
概述
为了减小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.
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 \
-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.
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 \
-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 >&
如果ramdisk里有需要加载的flash驱动,需要先insmod,然后才能看到/dev/vda1。
ubuntu文件系统中/sbin/init是一个软连接,实际指向的是/lib/systemd/systemd。
制作ramdisk镜像的命令:
#!/bin/bash sudo dd if=/dev/zero of=ramdisk bs=1M count=
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:

完。
使用ramdisk启动ubuntu文件系统的更多相关文章
- linux内核启动以及文件系统的加载过程
Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...
- ramdisk作为根文件系统的配置
ramdisk作为根文件系统的配置 http://wenku.baidu.com/link?url=oKj45hKtIANfoVzmoFAmWEvESHiqgWysxPASelpzaXk35gWb1I ...
- 【Ubuntu 16】深入Ubuntu文件系统
Ubuntu文件系统的设计目的就是把文件有序地组织在一起,提供一个从逻辑上组织文件的文件系统.除了文件的组织外,文件安全也是文件系统的设计要点,所以文件的访问权限是文件系统不可缺少的组成部分 Ubun ...
- I.MX6 使用Ubuntu文件系统
/********************************************************************************* * I.MX6 使用Ubuntu文 ...
- Vmware启动ubuntu 出现错误。
Vmware启动ubuntu 出现错误“以独占方式锁定此配置文件失败. 可能其它正在运行VMware进程在使用此配置文件”. 在网上查找了很多方法,法(1)试过在启动任务管理器中“结束与VMware有 ...
- 使用Qemu运行Ubuntu文件系统 —— 搭建SVE学习环境(2)
开发环境 PC:ubuntu18.04 Qemu:4.1 Kernel:Linux-5.2 概述 由于要学习ARM的SVE技术,但是目前还没有支持SVE指令的板子,所以只能用Qemu来模拟,但是发现Q ...
- 启动Ubuntu的时候出现黑屏的情况
在启动Ubuntu的时候出现黑屏的情况,是因为升级了内核导致显卡不兼容,启动的时候应该告诉内核不要加载显卡: 在进入系统选择时按e进入编辑 在quiet splash 后面添加 nomodeset 再 ...
- 启动ubuntu就直接进入GRUB2.02的命令行界面的问题
问题:启动ubuntu就直接进入GRUB2.02的命令行界面原因:grub2引导出现问题. 解决方法:图形方法,引导修复 (1)电脑上插入Ubuntu系统启动引导U盘(如果没有引导U盘,就到官网下载一 ...
- docker启动ubuntu的桌面环境
一.概述 由于最近一段时间在家办公,国内服务器在阿里云,国外站点在aws.家里的移动宽带比较差,无法访问aws. 所以尝试在阿里云启动docker,找到一个lxde桌面环境的ubuntu镜像. 二.启 ...
随机推荐
- Word文档创建目录
一.以设置两级目录为例: 1.设置两个标题,标题1对应第一级目录,标题2对应第二级目录. 点击标题1,点击修改: 设置好样式和格式: 同理设置标题2. 2.创建多级目录: 选择级别1,关联到标题1,设 ...
- Daily Scrum 1/12/2016
Zhaoyang & Yandong: Optimize the speech input interface Fuchen: Code refactor in the NLP module ...
- 编写高质量Python程序(四)库
本系列文章为<编写高质量代码--改善Python程序的91个建议>的精华汇总. 按需选择 sort() 或者 sorted() Python 中常用的排序函数有 sort() 和 sort ...
- Shell脚本日志关键字监控+告警
最近小张的爬虫程序越来越多,可当爬虫程序报错,不能及时的发现,从而造成某些重要信息不能及时获取的问题,更有甚者,遭到领导的批评.于是就在想有没有一种方法,当爬取信息报错的时候,可以通过邮件或者短信的方 ...
- VMware15 安装Mac 10.14系统/苹果系统
安装环境 Windows专业版 VMware Workstation Pro 15 所需资源 VMware Workstation Pro 15.0.0 Build 10134415 官网下载地址:h ...
- 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥
P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...
- Springboot:员工管理之删除员工及退出登录(十(9))
springboot2.2.6 delete请求报错,降至2.1.11功能可用 原因未知 构建员工删除请求 com\springboot\controller\EmployeeController.j ...
- 最新VMware虚拟机安装Linux系统-CentOS(详细教程)
一.前言 最近有网友反应初学Linx不会安装,找了许多教程不是太全面,总会遇到一些要不是启动不了,要不是连不上网,各种问题,为了让大家能够顺利的安装,小乐写了一个非常详细的教程,让大家少入坑. 二.背 ...
- ADO.NET(二)
对Command的拓展延伸 执行SQL语句. Command 对象需要取得将要执行的SQL语句,通过调用该类的多种方法,向数据库提交SQL语句. ExecuteNonQuery(),ExecuteR ...
- 优质中文NLP资源集合,做项目一定用得到!
今天要给大家在推荐 Github 上一个优质的中文 NLP 工具和资源集合项目——funNLP,已经获得了 5.3k Stars,1k+ Forks. 项目作者 杨洋,一枚水博&互联网民工,目 ...