编写制作Linux启动盘的shell脚本程序
一、实验目的
通过编写Linux shell脚本启动程序,了解Linux系统的引导启动过程。二、实验内容
应用所学的shell脚本编程技术编写一个制作boot盘和root盘的shell脚本。
当遇到硬盘启动故障时,我们经常会使用软盘启动系统来检测故障原因。根据我们了解了Linux系统的引导启动过程。Linux启动盘正是在软盘上包括了启动过程中所需的一些基本文件,实现如同从完整的硬盘启动的功能。启动盘并非仅仅包括启动时必需的内核映像,它一般还包括基本的系统文件及一些工具程序。根据其功能我们通常将它们分为四种类型:l boot盘包括能用于启动的内核映像的软盘。我们可以用它引导内核并从其它盘上加载根文件系统。在boot盘中的内核必须被告知从哪里寻并加载根文件系统。
通常我们从另一张软盘上加载根文件系统,当然也能配置成加载硬盘上的根文件系
统。我们可以使用这一方法测试新的内核,在内核源代码目录使用“make zdisk”
便能自动生产这样的boot盘。
l root盘包括运行Linux系统所必需的文件的软盘。它用于在内核引导完成后被加载为系统的根文件系统。 root盘通常会被复制到ramdisk(在内存中模拟的磁盘)
中以加快读写速度。
l boot/root盘既包括内核又包括根文件系统的软盘。它包含了引导和运行Linux系统必需的文件。但随者内核越来越大,将这些必需的文件压缩在一张软盘中也越发
困难了。
l utility盘包含一个文件系统的软盘,但此文件系统不像root盘被用于加载为根文件系统。它只是个附加的数据盘,用于保存一些工具程序等。
下面大致分析一下root盘和boot盘的手工制作步骤,详细关于制作启动盘的技术可以参考The Linux Bootdisk HOWTO文件。
1.root盘制作步骤
根文件系统包括运行Linux系统必需的每个文件。通常以下是必须包括的最低要求:l基本文件系统结构(The basic file system structure)
l必需的目录: /dev, /proc, /bin, /etc, /lib, /usr, /tmp
l基本的工具命令: sh, ls, cp, mv, 等
l必需的系统配置文件: rc, inittab, fstab,等
l必要的设备文件: /dev/hd*, /dev/tty*, /dev/fd0, 等
l运行基本命令所需的运行库文件(Runtime library)
因此,通常制作root盘需要先在系统中建立一个文件系统并复制以上所列的必需文件、改写配置文件,最后使用dd命令写入软盘。具体实现见后面的shell脚本。
2.boot盘制作步骤
我们在此将不使用lilo引导,制作root盘首先将内核映像写到软盘上并指定从软盘加载根文件系统和根文件系统为可读写。最后使用rdev命令写入内核映像中的ramdisk字。ramdisk 字用于指定从哪里能寻根文件系统及ramdisk选项。其结构如表2-7所示:
表2-7 ramdisk字结构
位描述
0-10 磁盘上根文件系统所在位置的偏移量
11-13 保留未用
14 是否加载ramdisk的标志位
15 加载根文件系统前是否提示的标志位
对于我们将根文件系统放在单独的一张root盘中,偏移量为0,两个标志为均为1。因此,写入值为0+2^14+2^15=49152。其详细实现见后面的shell脚本。
3.用shell脚本实现
根据上两小节分析的制作步骤,我们可以运用shell脚本实现自动制作启动盘的程序。运行此shell脚本将依次提示用户插入root盘和boot盘,完成启动盘制作。下面是这个shell 脚本的示例程序:
#!/bin/bash
linuxshell脚本怎么运行### root盘准备工作###
echo "Here begin "
echo "NOTE:You shall be a root to run this shellscript"
rm -rf /myroot #去除旧的RAMDISK挂载根目录
mkdir /myroot #建立新的(空)RAMDISK挂载根目录
DEV=/dev/ramdisk #设定DEV
dd if=/dev/zero of=$DEV bs=1k count=4096 #清空RAMDISK
mke2fs -m 0 -i 2000 $DEV #在RAMDISK中建立EXT2文件系统
mount -t ext2 $DEV /myroot #将RAMDISK挂载到新的挂载目录
### 改变工作目录,进入RAMDISK挂载目录###
cd /myroot
### 创建RAMDISK中的/dev 子目录及内容###
mkdir dev
cp -dpR /dev/console dev
cp -dpR /dev/kmem dev
cp -dpR /dev/mem dev
cp -dpR /dev/null dev
cp -dpR /dev/ramdisk dev
cp -dpR /dev/ram0 dev
cp -dpR /dev/tty1 dev
cp -dpR /dev/tty2 dev
### 创建RAMDISK中的/etc 子目录及内容###
mkdir etc
echo -e "#!/bin/bash \n /bin/mount -av" > etc/rc
chmod +x rc
echo "/dev/ram0 / ext2 defaults" > etc/fstab
echo "/dev/fd0 / ext2 defaults" >> etc/fstab
echo "/proc /proc proc defaults" >> etc/fstab
echo "id:2:initdefault:" > etc/inittab
echo "si::sysinit:/etc/rc" >> etc/inittab
echo "1:2345:respawn:/sbin/mingetty tty1" >> etc/inittab
echo "2:23:respawn:/sbin/mingetty tty2" >> etc/inittab
### 创建RAMDISK中的/bin 子目录及内容###
mkdir bin
cp /bin/login bin
cp /bin/mount bin
### 创建RAMDISK中的/etc 子目录及内容###
mkdir sbin
cp /sbin/init sbin
cp /sbin/mingetty sbin
### 创建RAMDISK中的/lib 子目录及内容###
mkdir lib
objcopy --strip-debug /lib/libcrypt.so.1 lib/libcrypt.so.1
objcopy --strip-debug /lib/libpam.so.0 lib/libpam.so.0
objcopy --strip-debug /lib/libdl.so.2 lib/libdl.so.2
objcopy --strip-debug /lib/libpam_misc.so.0 /lib/libpam_misc.so.0
mkdir lib/i686
objcopy --strip-debug /lib/i686/libc.so.6 lib/i686/libc.so.6
objcopy --strip-debug /lib/ld-linux.so.2 lib/ld-linux.so.2
### 创建RAMDISK中的/etc 子目录及内容###
mkdir -p var/{log,run}
touch var/run/utmp
ldconfig -r /myroot # 创建RAMDISK文建系统中的ld.so.cache文件,用于动态链接库
cd / # 使根目录成为当前工作目录,以便卸载挂载在/myroot的RAMDISK umount /myroot # 卸载挂载在/myroot的RAMDISK
echo "Insert your diskette without write-protect,then " # 提示用户放入一用以制作根文件盘的软盘echo "press any key "
read anykey #读入任意键
dd if=$DEV bs=1k | gzip -v9 > / # 将RAMDISK中的内容压缩成一个文件 dd if=/ of=/dev/fd0 bs=1k # 将传到软盘上,此软盘即成为根文件系统盘
### 根文件系统盘创建完成的提示###
echo “The root disk has been successily created!”
### 制作boot盘###
echo "Here begin "
echo "Insert your diskette,then press any key to continue." #提示用户放入软盘以制作boot盘read anykey #读取任意键
dd if=/boot/vmlinuz-2.4.2-2 of=/dev/fd0 bs=1k #将内核映象传到软盘
rdev /dev/fd0 /dev/fd0 #告诉软盘中的内核根文件系统在软盘(根文件系统盘)上
rdev -R /dev/fd0 0 #设定根文件系统盘可读可写
rdev -r /dev/fd0 49152 #设定ramdisk字
### boot盘创建完成的提示###
echo “The boot disk has been successily created!”
上面的shell脚本只是实现了制作启动盘最基本的步骤,您可以在此基础上制作符合自己要求的启动盘。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论