上海新闻娱乐频道:使用ramdisk启动ubuntu文件系统

2020-05-10 6 views 0

扫一扫用手机浏览

环境

Qemu 4.1

vexpress-ca9

 

概述

  为了减小linux内核的巨细,可以把一些外设驱动编译成内核模块,然则在启动ubuntu的时刻,需要读取flash,然则此时flash的驱动模块存放在ubuntu文件系统中。为了解决这样的问题,可以使用ramdisk内存文件系统,将必备的驱动模块,好比这里的flash驱动模块放到ramdisk中,当uboot指导linux时,可以将ramdisk和内核镜像先加载到内存,启动内核时,会将ramdisk在内存中的内存地址传给内核。

  当内核启动后,会先将ramdisk作为根文件系统,然后使用insmod加载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 sT.I.

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

  现在,若是使用ramdisk的话,修改启动下令:

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:

 

 

完。

,

sunbet

sunbet是Sunbet www.sunbet.xyz指定的Sunbet官网,Sunbet提供Sunbet(Sunbet)、Sunbet、申博代理合作等业务。

Sunbet内容转载自互联网,如有侵权,联系Sunbet删除。

本文链接地址:http://www.chongqichengbaotoy.com/post/1125.html

相关文章

发表评论