使用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镜像. 二.启 ...
随机推荐
- 【Java】抽象类、接口
什么是抽象类? 特点: - 抽象类几乎普通类一样,除了不能实例化 - 不能实例化不代表没有构造器,依然可以声明构造器,便于子类实例化调用 - 具有抽象方法的类,一定是抽象类 abstract 抽象的 ...
- x86汇编之栈与子程序调用
什么是栈 栈与普通数据结构所说的栈的概念是相似的,遵循后进先出原则.不同的是汇编中所说的栈是一个在内存中连续的保存数据的区域,也即是实际存在的内存区域,进栈和出栈遵循后进先出原则. 在x86架构中,栈 ...
- Pet BFS
一天早上小明醒来时发现他的宠物仓鼠不见了. 他在房间寻找但是没找到仓鼠. 他想用奶酪诱饵去找回仓鼠. 他把奶酪诱饵放在房间并且等待了好几天. 但是可怜的小明除了老鼠和蟑螂没见到任何东西. 他找到学校的 ...
- codeforces Equalizing by Division (easy version)
output standard output The only difference between easy and hard versions is the number of elements ...
- java文件上传、下载、图片预览
多文件保存到本地: @ResponseBody @RequestMapping(value = "/uploadApp",produces = { "applica ...
- 关于JS垃圾回收机制
一.垃圾回收机制的必要性 由于字符串.对象和数组没有固定大小,所以当它们的大小已知时,才能对它们进行动态的存储分配.JavaScript程序每次创建字符串.数组或对象时,解释器都必须分配内存来存储那个 ...
- XSS语义分析的阶段性总结(一)
本文作者:Kale 前言 由于X3Scan的研发已经有些进展了,所以对这一阶段的工作做一下总结!对于X3Scan的定位,我更加倾向于主动+被动的结合.主动的方面主要体现在可以主动抓取页面链接并发起请求 ...
- Java 创建 Excel 数据透视表
Excel 数据透视表具有强大的数据处理功能,能够使表格中的数据更加直观化.使用Excel 数据透视表,能方便用户快速的排序. 筛选各种数据,同时也能满足用户对不同数据汇总的需求.本文将介绍如何在Ja ...
- Web前端三大主流框架是什么?Web前端前景与就业形势
近十年以来,IT行业发展火热,衍生了很多新职业,例如UI设计师.开发工程师.软件测试工程师等等,在众多备受瞩目的新生职业中,Web前端工程师是其中的一员.那么Web前端三大主流框架是什么呢? 一.We ...
- Android应用程序开机开机启动
有很过情况都需要Android程序开机自启,也就是在手机开机之后马上执行相应的Android程序. 实现的方法就是,在手机开机的时候接受相应的广播,在Android程序中接受相应的广播. 第1步:建立 ...