使用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镜像. 二.启 ...
随机推荐
- C - Roads in the North DFS+树的直径
Building and maintaining roads among communities in the far North is an expensive business. With thi ...
- 【论文研读】强化学习入门之DQN
最近在学习斯坦福2017年秋季学期的<强化学习>课程,感兴趣的同学可以follow一下,Sergey大神的,有英文字幕,语速有点快,适合有一些基础的入门生. 今天主要总结上午看的有关DQN ...
- Git敏捷开发--rebase命令
git rebase是git下比较常用的命令,以下记录自己遇到较多的使用场景. 合并分支 在多人协作的项目中,拉分支是很常见的事情,经常需要同步自己的分支与远端master分支一致,有两种方式: gi ...
- weblogic漏洞(一)----CVE-2017-10271
WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271) 0x01 漏洞原因: Weblogic的WLS Security组件对外提供webservice服务,其中使用了XM ...
- 常见web漏洞整理之进击吧xss!!!
XSS在线测试环境: http://xss-quiz.int21h.jp/ https://brutelogic.com.br/xss.php 这两个站对xss的理解很有帮助!!! 参考链接: htt ...
- cgi、fastCGI、php-fpm、 php-CGI的区别
cgi.fastCGI.php-fpm. php-CGI的区别 作为面试的高频热点问题,必须来一波记录: 我们发送一个请求到收到响应之间的一个过程是什么? 如果客户端请求的是 index.html,那 ...
- tensorflow1.0 placeholder占位符
import tensorflow as tf #(tf.float32,[2,2]) input1 = tf.placeholder(tf.float32) input2 = tf.placehol ...
- js前端加密,php后端解密(crypto-js,openssl_decrypt)
来源:https://blog.csdn.net/morninghapppy/article/details/79044026 案例:https://blog.csdn.net/zhihua_w/ar ...
- application/x-www-form-urlencoded ,multipart/form-data, text/plain
APPLICATION/X-WWW-FORM-URLENCODED MULTIPART/FORM-DATA TEXT/PLAIN 后台返回的数据响应的格式类型 application/x-www-fo ...
- 虚拟化KVM之概述(一)
云计算基本概述 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源能够被快速提供,只需投入很 ...