环境

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使用的命令是:

  1. kernel_dir=./linux-4.14.
  2. kernel_image=${kernel_dir}/arch/arm/boot/zImage
  3. dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb
  4.  
  5. sudo qemu-system-arm \
  6. -M vexpress-a9 \
  7. -m 1024M \
  8. -smp \
  9. -kernel ${kernel_image} \
  10. -append "noinitrd root=/dev/vda1 rw rootfstype=ext4 console=ttyAMA0,115200" \
  11. -dtb ${dtb_image} \
  12. -drive if=none,file=./ubuntu_rootfs/ubuntu.fulldisk,id=hd0 \
  13. -device virtio-blk-device,drive=hd0 \
  14. -nic tap \
  15. -serial stdio

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

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

  1. kernel_dir=./linux-4.14.
  2. kernel_image=${kernel_dir}/arch/arm/boot/zImage
  3. dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb
  4.  
  5. sudo qemu-system-arm \
  6. -M vexpress-a9 \
  7. -m 1024M \
  8. -smp \
  9. -kernel ${kernel_image} \
  10. -dtb ${dtb_image} \
  11. -drive if=none,file=./ubuntu_rootfs/ubuntu.fulldisk,id=hd0 \
  12. -device virtio-blk-device,drive=hd0 \
  13. -append "root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0 init=/linuxrc ignore_loglevel" \
  14. -initrd ./rootfs/ramdisk.img \
  15. -nic tap \
  16. -serial stdio

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

  1. .
  2. ├── bin
  3.    ├── busybox
  4.    ├── cd -> busybox
  5.    ├── chroot -> busybox
  6.    ├── echo -> busybox
  7.    ├── exec -> busybox
  8.    ├── mdev -> busybox
  9.    ├── mkdir -> busybox
  10.    ├── mount -> busybox
  11.    ├── pivot_root -> busybox
  12.    ├── sh -> busybox
  13.    └── umount -> busybox
  14. ├── dev
  15. ├── linuxrc
  16. └── sys

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

  1. #!/bin/sh
  2.  
  3. echo "hello world"
  4.  
  5. echo "mount -t sysfs sysfs /sys"
  6. mount -t sysfs sysfs /sys
  7.  
  8. echo "mdev -s"
  9. mdev -s
  10.  
  11. echo "mkdir /newroot"
  12. mkdir /newroot
  13.  
  14. echo "mount -t ext4 /dev/vda1 /newroot"
  15. mount -t ext4 /dev/vda1 /newroot
  16.  
  17. echo "sys"
  18. umount /sys
  19.  
  20. echo "cd /newroot"
  21. cd /newroot
  22.  
  23. echo "mkdir -p oldroot"
  24. mkdir -p oldroot
  25.  
  26. echo "pivot_root . oldroot"
  27. pivot_root . oldroot
  28.  
  29. echo "exec chroot . /sbin/init <dev/console >dev/console 2>&1"
  30. exec chroot . /sbin/init <dev/console >dev/console >&

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

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

  制作ramdisk镜像的命令:

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

  下面是启动log:

完。

使用ramdisk启动ubuntu文件系统的更多相关文章

  1. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  2. ramdisk作为根文件系统的配置

    ramdisk作为根文件系统的配置 http://wenku.baidu.com/link?url=oKj45hKtIANfoVzmoFAmWEvESHiqgWysxPASelpzaXk35gWb1I ...

  3. 【Ubuntu 16】深入Ubuntu文件系统

    Ubuntu文件系统的设计目的就是把文件有序地组织在一起,提供一个从逻辑上组织文件的文件系统.除了文件的组织外,文件安全也是文件系统的设计要点,所以文件的访问权限是文件系统不可缺少的组成部分 Ubun ...

  4. I.MX6 使用Ubuntu文件系统

    /********************************************************************************* * I.MX6 使用Ubuntu文 ...

  5. Vmware启动ubuntu 出现错误。

    Vmware启动ubuntu 出现错误“以独占方式锁定此配置文件失败. 可能其它正在运行VMware进程在使用此配置文件”. 在网上查找了很多方法,法(1)试过在启动任务管理器中“结束与VMware有 ...

  6. 使用Qemu运行Ubuntu文件系统 —— 搭建SVE学习环境(2)

    开发环境 PC:ubuntu18.04 Qemu:4.1 Kernel:Linux-5.2 概述 由于要学习ARM的SVE技术,但是目前还没有支持SVE指令的板子,所以只能用Qemu来模拟,但是发现Q ...

  7. 启动Ubuntu的时候出现黑屏的情况

    在启动Ubuntu的时候出现黑屏的情况,是因为升级了内核导致显卡不兼容,启动的时候应该告诉内核不要加载显卡: 在进入系统选择时按e进入编辑 在quiet splash 后面添加 nomodeset 再 ...

  8. 启动ubuntu就直接进入GRUB2.02的命令行界面的问题

    问题:启动ubuntu就直接进入GRUB2.02的命令行界面原因:grub2引导出现问题. 解决方法:图形方法,引导修复 (1)电脑上插入Ubuntu系统启动引导U盘(如果没有引导U盘,就到官网下载一 ...

  9. docker启动ubuntu的桌面环境

    一.概述 由于最近一段时间在家办公,国内服务器在阿里云,国外站点在aws.家里的移动宽带比较差,无法访问aws. 所以尝试在阿里云启动docker,找到一个lxde桌面环境的ubuntu镜像. 二.启 ...

随机推荐

  1. C - Roads in the North DFS+树的直径

    Building and maintaining roads among communities in the far North is an expensive business. With thi ...

  2. 【论文研读】强化学习入门之DQN

    最近在学习斯坦福2017年秋季学期的<强化学习>课程,感兴趣的同学可以follow一下,Sergey大神的,有英文字幕,语速有点快,适合有一些基础的入门生. 今天主要总结上午看的有关DQN ...

  3. Git敏捷开发--rebase命令

    git rebase是git下比较常用的命令,以下记录自己遇到较多的使用场景. 合并分支 在多人协作的项目中,拉分支是很常见的事情,经常需要同步自己的分支与远端master分支一致,有两种方式: gi ...

  4. weblogic漏洞(一)----CVE-2017-10271

    WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271) 0x01 漏洞原因: Weblogic的WLS Security组件对外提供webservice服务,其中使用了XM ...

  5. 常见web漏洞整理之进击吧xss!!!

    XSS在线测试环境: http://xss-quiz.int21h.jp/ https://brutelogic.com.br/xss.php 这两个站对xss的理解很有帮助!!! 参考链接: htt ...

  6. cgi、fastCGI、php-fpm、 php-CGI的区别

    cgi.fastCGI.php-fpm. php-CGI的区别 作为面试的高频热点问题,必须来一波记录: 我们发送一个请求到收到响应之间的一个过程是什么? 如果客户端请求的是 index.html,那 ...

  7. tensorflow1.0 placeholder占位符

    import tensorflow as tf #(tf.float32,[2,2]) input1 = tf.placeholder(tf.float32) input2 = tf.placehol ...

  8. js前端加密,php后端解密(crypto-js,openssl_decrypt)

    来源:https://blog.csdn.net/morninghapppy/article/details/79044026 案例:https://blog.csdn.net/zhihua_w/ar ...

  9. application/x-www-form-urlencoded ,multipart/form-data, text/plain

    APPLICATION/X-WWW-FORM-URLENCODED MULTIPART/FORM-DATA TEXT/PLAIN 后台返回的数据响应的格式类型 application/x-www-fo ...

  10. 虚拟化KVM之概述(一)

    云计算基本概述 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源能够被快速提供,只需投入很 ...