创建一个MiniLinux:

通过对RamDisk(Initrd)分析,现在了解了initrd的主要原理及工作流程,为了加深对该过程的理解,下面使用initrd创建一个微型的linux系统,也更加深对linux开机过程的原理性了解:并用脚本实现该过程;

环境:宿主机:RedHat 5.4 内核:2.6.18

要求:首先实现最基本的启动,正常启动后给用户一个shell;后期拓展,需要实现将根文件系统挂载为RW,实现命令:mount、umount、vi、ls、touch、mkdir等。也可以后期按照需求添加各项功能,逐渐丰富;

1. 配置所需的环境:新增硬盘/dev/sdb(大小512M~1G绰余)、建立所需目录(这里假定新增的硬盘为sdb)

# mkdir  -v  /mnt/sysroot

# mkdir  -v  /mnt/boot

# mkdir  -v  /tmp/init

注:在虚拟机里面添加硬盘时将硬盘放到自己容易找到的位置,最好不用默认位置;

2. 对新硬盘分区,格式化后挂载到/mnt目录下的适当位置

# fdisk  /dev/sdb   (将硬盘分为两个区,第一个100M作为boot分区,第二个作为根分区)

# partproble  /dev/sdb

# mkfs -t ext3 /dev/sdb1

# mkfs -t ext3 /dev/sdb2

# mount /dev/sdb1 /mnt/boot

# mount /dev/sdb2 /mnt/sysroot

# mount  (查看挂载是否成功)

3. 拷贝内核文件到相应的位置,并且解包initrd

# cp /boot/vmlinuz-`uname -r`.img /mnt/boot/vmlinuz

# cd /tmp/init

# zcat /boot/initrd.2.6.18-164.el5.img | cpio -id  &> /dev/null

4. 修改RamDisk内容:

# sed -i s/\(mkrootdev.*ro[[:space:]]\).*/\1sda2/g /tmp/init

上步骤中将RanDisk解压出来init文件中的”mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00”项修改为”mkrootdev -t ext3 -o defaults,ro sda2”;并且可以根据实际需求,将该文件中不需要加载的dm-mirror、dm-zero、dm-snapshrot项注释或删掉;当然为了更加精简镜像文件的大小,可以到对应的/lib文件夹下删除相应的文件;

initrd文件修改后示例:

#!/bin/nash

mount -t proc /proc /proc

setquiet

echo Mounting proc filesystem

echo Mounting sysfs filesystem

mount -t sysfs /sys /sys

echo Creating /dev

mount -o mode=0755 -t tmpfs /dev /dev

mkdir /dev/pts

mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts

mkdir /dev/shm

mkdir /dev/mapper

echo Creating initial device nodes

mknod /dev/nullc 1 3

mknod /dev/zero c 1 5

mknod /dev/systty c 4 0

mknod /dev/tty c 5 0

mknod /dev/console c 5 1

mknod /dev/ptmx c 5 2

mknod /dev/rtc c 10 135

mknod /dev/tty0 c 4 0

mknod /dev/tty1 c 4 1

mknod /dev/tty2 c 4 2

mknod /dev/tty3 c 4 3

mknod /dev/tty4 c 4 4

mknod /dev/tty5 c 4 5

mknod /dev/tty6 c 4 6

mknod /dev/tty7 c 4 7

mknod /dev/tty8 c 4 8

mknod /dev/tty9 c 4 9

mknod /dev/tty10 c 4 10

mknod /dev/tty11 c 4 11

mknod /dev/tty12 c 4 12

mknod /dev/ttyS0 c 4 64

mknod /dev/ttyS1 c 4 65

mknod /dev/ttyS2 c 4 66

mknod /dev/ttyS3 c 4 67

echo Setting up hotplug.

hotplug

echo Creating block device nodes.

mkblkdevs

echo "Loading uhci-hcd.ko module"

insmod /lib/uhci-hcd.ko

echo "Loading ohci-hcd.ko module"

insmod /lib/ohci-hcd.ko

echo "Loading ehci-hcd.ko module"

insmod /lib/ehci-hcd.ko

mount -t usbfs /proc/bus/usb /proc/bus/usb

echo "Loading jbd.ko module"

insmod /lib/jbd.ko

echo "Loading ext3.ko module"

insmod /lib/ext3.ko

echo "Loading scsi_mod.ko module"

insmod /lib/scsi_mod.ko

echo "Loading sd_mod.ko module"

insmod /lib/sd_mod.ko

echo "Loading scsi_transport_spi.ko module"

insmod /lib/scsi_transport_spi.ko

echo "Loading mptbase.ko module"

insmod /lib/mptbase.ko

echo "Loading mptscsih.ko module"

insmod /lib/mptscsih.ko

echo "Loading mptspi.ko module"

insmod /lib/mptspi.ko

echo "Loading dm-mod.ko module"

insmod /lib/dm-mod.ko

echo Waiting fordriver initialization.

stabilized --hash --interval 250 /proc/scsi/scsi

echo Making device-mapper control node

mkdmnod

mkblkdevs

echo Creating root device.

mkrootdev -t ext3 -o defaults,ro /dev/sda2  (这里请按照自己使用的情况进行修改,我的下一步实验环境为单盘,但是如实验者的环境非但盘,请依照次序进行调整)

echo Mounting root filesystem.

mount /sysroot

echo Setting up other filesystems.

setuproot

echo Switching to newroot and running init.

switchroot

5. 重新打包修改好的镜像到相应位置:

# find . | cpio --quiet -H newc -o |gzip -9 -n > /mnt/boot/initrd.gz

# cd /mnt/boot/ ; ls    (查看生成镜像)

命令解释:找本目录下修改好的的全部文件,用管道送给cpio进行打包,使用静默模式,-H制定创建的归档文件类型为newc(是一种支持的文件个数的inode号大于65535的文件模型),并且用 -o 进行输出,输出的流用gzip压缩,使用最大压缩比9,创建出的压缩文件输出至/mnt/boot路径下

6. 安装grub到新加的硬盘上:

# grub-install --root-directory=/mnt  /dev/sdb

注: --root-directory指定安装的位置,并且命令会自己寻找目录下的boot目录来进行安装;

7. 编辑生成grub配置文件

安装后缺少grub.conf文件,需要手动建立,也可以将宿主机上的文件拷贝后进行相应的修改:

格式如下:

timeout=5

default=0

title MyLinux

root (hd0,0)

kernel /vmlinuz ro root=/dev/sda2

initrd /initrd.gz

8. 在根分区sysroot目录下创建基本目录:

# cd /mnt/sysroot

# mkdir -pv bin dev etc lib sbin sys tmp proc tmp

# chmod 1777 ./tmp

9.  拷贝基本的/sbin/init及/bin/bash文件到相应的位置(这两个是最基本的,也可附加其他的命令,自己扩展):

# cp /bin/bash  /mnt/sysroot/bin

# cp /sbin/init  /mnt/sysroot/sbin

10. 拷贝相应命令的lib库文件:

(注意某些库文件是链接文件,需要将链接及源文件一块拷过去。)

# ldd /bin/bash

# ldd /sbin/init

# cp -d /lib/libsepol.so.1 /mnt/sysroot/lib/

如下ldd命令显示的信息:其中有库文件的全路径;根据路径拷贝库文件:

注:linux-gate.so.1 是一个虚拟的库标志,所以不需要拷贝;

cp命令的 -d 参数可以拷贝指定的原文件(区别源文件),若拷贝的是一个链接,则拷贝的是该链接文件;若拷贝链接文件时不加-d参数会使拷贝的时库链接的源文件,这样可能造成某些共享性库的错误;

拷贝后,查看,发现有源文件需要拷贝,再拷贝链接文件指向的源文件:

在库完全链接正确后不会再有颜色显示警告;

上面只是拷贝一部分库的实例,在拷贝时需要对照拷贝进去所有的库文件;

11. 建立init的配置文件/etc/inittab (bash脚本文件注意给予相应的权限)

#  vim /mnt/sysroot/etc/inittab

文件编辑格式如下:

id:3:initdefault:  (设置系统默认运行级别)

si::sysinit:/etc/rc.d/rc.sysinit  (置系统初始化脚本位置)

12. 建立系统调用系统初始化时需要的/etc/rc.d/rc.sysinit脚本:

# vim  /mnt/sysroot/etc/rc.d/rc.sysinit

编辑文件格式如下:

#!/bin/bash

echo -e “\tWelcome to \033[31mMyLinux\033[0m.”

/bin/bash

:设置进入系统初始化界面需要的东西。可以不输出信息,但是需要运行bash,进入bash环境

注:在实际系统中init读取inittab文件,按照文件中的配置依次进行下面工作:

inittdefault   定义系统默认运行级别;

rc.sysint    初始化系统的网络,文件系统等

/etc/rc.d/rc N  执行相应的运行相应级别下的服务脚本

mingetty    提供用户登陆认证,在认证成功后自动调用/bin/bash,为用户提供接口

/etc/X11/prefdm -nodeamon 如果有设置,开启X界面

但是在该小型linux中,没有登录认证功能,所以需要在系统初始化完成后显式的为用户提供shell。

13. 关闭宿主机系统;新建一个虚拟机,硬盘选为刚才创建的硬盘,开机测试;

用shell脚本实现上述创建过程:

系统环境跟上述描述一致,需要先新建硬盘,并且过程中使用了我文章《

#!/bin/bash

#Author: Mo

#Date & Time: 2011-03-10 20:19:20

#Description: auto create a minilinux

#Version : 1.2.1

tmpdir=`mktemp -d /tmp/init.XXXX`

disk=/dev/sdb

sysroot=/mnt/sysroot

sysboot=/mnt/boot

# Partition the disk

echo "n

p

1

1

13

n

p

2

14

+1000M

W" | fdisk ${disk} &>/dev/null

wait

#update /proc/partitions

/sbin/partprobe ${disk}

sleep 5

# making file system

/sbin/mkfs -t ext3 ${disk}1

wait

/sbin/mkfs -t ext3 ${disk}2

wait

mkdir -pv ${sysboot} ${sysroot}

#update /proc/partitions

/sbin/partprobe &> /dev/null

sleep 5

#mount disk

/bin/mount -t ext3 ${disk}1  ${sysboot}

/bin/mount -t ext3 ${disk}2  ${sysroot}

wait

#kernel;

cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz

sync

#create initrd;

cd ${tmpdir}

/bin/zcat /boot/initrd-*.img | cpio -id  &>/dev/null

sed -i  s@mkrootdev.*@'mkrootdev -t ext3 -o defaults,ro /dev/sda2'@  ./init

sync

find . | cpio --quiet -H newc -o | gzip -9 -n >/mnt/boot/initrd.gz

wait

#grub

grub-install --root-directory=/mnt ${disk} &>/dev/null

touch ${sysboot}/grub.conf

echo "default=0

timeout=2

title  MyLinux

root (hd0,0)

kernel  /vmlinuz

initrd  /initrd.gz" > /mnt/boot/grub/grub.conf

sync

#create basic directorys in sysroot

mkdir  -p $sysroot/{etc/rc.d,dev,lib,bin,sbin,proc,sys,tmp}  &>/dev/null

chmod 1777 ${sysroot}/tmp

wait

#cp libs

#bash ls mount bash vi

autolib.sh  -s init

sleep 1

/root/bin/autolib.sh -s bash

sleep 1

autolib.sh  -s ls

sleep 1

#/tmp/autolib.sh  -s vim

autolib.sh  -s mount

sleep 1

autolib.sh  -s umount

sleep 1

chmod a+x ${sysroot}/{bin,sbin}/*

wait

#create file /etc/inittab

echo "id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit" >${sysroot}/etc/inittab

#create file  /etc/rc.d/rc.sysinit

echo '#!/bin/bash

mount -n -o remount,rw /dev/sda2 /

echo -e "\tWelcome to \033[31mMy Linux\033[0m"

/bin/bash' > ${sysroot}/etc/rc.d/rc.sysinit

chmod a+x ${sysroot}/etc/rc.d/rc.sysinit

echo "All Done.......

Then you can test the miniLinix."

拓展参考:

整理过程,难免出错,希望共同探讨;

安装linux系统initrd,修改initrd,创建一个微型的linux系统相关推荐

  1. ubuntu 安装GPU黑屏 修改GRUB_手把手教你Windows+Linux双系统的安装与卸载

    公众号关注 "菜鸟要飞" 设为 "星标",和12万程序员一起成长! Windows+Linux双系统的安装 1. 准备工作 1.1 U盘启动盘的制作 准备一个 ...

  2. 云计算|OpenStack|社区版OpenStack安装部署文档(九--- 创建一个虚拟机实例---Rocky版)

    官方文档: Launch an instance - Installation Guide documentation 如果neutron创建的时候使用的是provider network网络模型,只 ...

  3. linux系统内核制作,编译内核制作一个小型的linux系统

    前言 今天我将会给大家带来如何定制一个属于自己linux系统,也就是编译内核,那为什么要编译内核呢? 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统管理,决定着系 ...

  4. 在kaldi工具包使用小数字语料库创建一个简单的ASR系统(番外篇)

    相信很多人已经看过kaldi英文官网上关于该系统的搭建流程.虽然官方已经写的很通俗易懂,但是第一次接触的话还是不可避免的会碰到许多坑.恰巧最近实践了一下,把整个实践过程写了下来.一是方便自己后续回顾本 ...

  5. linux如何给脚本等创建一个桌面启动图标

    本文主要讲述的是linux中如何给应用程序创建一个快速启动图标,话不多说,我们来看实际的操作步骤: 本文的实例是给celipse创建一个启动图标 1.我们需要通过下列命令,来创建一个启动的脚本: ge ...

  6. hypermill后处理构造器安装_UG如何用后处理构造器创建一个新的后处理文件?

    UG如何用后处理构造器创建一个新的后处理文件? 大家好,我是乐乐老师! 今天跟大家分享UG如何用后处理构造器创建一个新的后处理文件 在使用UG处理NC加工程序时,往往需要根据设备的不同而定制后处理文件 ...

  7. 创建一个坚固的备份系统

    在Foreach,我们拥有Synology RS815 +来存储所有备份. 这些备份来自我们网络中的不同来源,例如路由器,交换机,数据库服务器,Web服务器,应用程序日志文件,邮件服务器等等. Syn ...

  8. linux touch 源码,一天一个shell命令 linux文本操作系列-touch命令用法

    之前我们学过dd创建测试文件,如果不需要考虑文件大小,创建一个空白文件的话,不妨试试 touch: 将每个文件的访问时间和修改时间改为当前时间. 不存在的文件将会被创建为空文件,除非使用-c 或-h ...

  9. linux虚拟机模板部署模板,创建和部署基于 Linux 的虚拟机模板

    适用于: System Center 2012 SP1 - Virtual Machine Manager 通过使用 Virtual Machine Manager (VMM) 中 System Ce ...

最新文章

  1. 科研指导:深度学习的应用研究课程
  2. 漫步者煲耳机软件_它是苹果AirPods的“真香替身”——漫步者lolliPods开箱体验...
  3. 代码下移快捷键_Intellij IDEA 快捷键大全
  4. spring boot (3.自动配置@enableautoconfiguration)
  5. wyh 的 Code Style
  6. python中三种分支结构的_python 运算符与分支结构
  7. 配置Spring的用于解决懒加载问题的过滤器
  8. 架构 - 洋葱图架构
  9. paip.输入法编程---词库多意义条目分割 python实现.
  10. 29、java中阻塞队列
  11. 校园网规划与设计(附加完整word文档和pkt文件)
  12. 思科 Packet Tracer 实验七 DHCP基本配置
  13. 【转载】等波纹滤波器中density factor参数的解释
  14. 指南针经纬度分秒格式转换10进制经纬度
  15. 非常规应用之PNP三级管倒置使用
  16. html 一键复制 ios,h5实现一键复制到粘贴板 兼容ios
  17. linux关闭firefox进程,Firefox 68+ 怎样关闭多进程
  18. Android 软件行为监控系统 的原理 主要是利用binder机制原理添加一个filter
  19. JavaScript刷LeetCode拿offer-贪心算法
  20. You called this URL via POST, but the URL doesn't end in a slash and you hav。。。

热门文章

  1. 安卓开发之IPC机制详解
  2. 用Odoo实现企业数字化转型有什么好的?
  3. laravel repository模式使用
  4. AP计算机A自学笔记:Comparable接口
  5. Neo4j(二) Neo4j中的入门CRUD操作(小猪佩奇关系网)
  6. 平板的尺寸统计用于屏幕适配
  7. 商业插画前景好 商业插画如何分类
  8. 随机抽奖程序_某个知乎想法抽奖程序随机更新。jpg
  9. 浏览器中如何快速下载SVG图片?
  10. Win 11有个选择任务栏的远角以显示桌面是什么意思?