您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
bash脚本编程之十二(Linux系统裁减之二) 系统函数库-利用当前系统内核精简一个小系统
发布时间:2018-10-13 14:02:54编辑:雪饮阅读()
(1)接入新硬盘准备并创建boot分区和根分区
分区:
接入一个新的ide硬盘(貌似虚拟机关机状态才能接入ide硬盘)
fdisk /dev/hda
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 44384.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-44384, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-44384, default 44384): +100M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (209-44384, default 209):
Using default value 209
Last cylinder or +size or +sizeM or +sizeK (209-44384, default 44384): +1G
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
格式化
[root@localhost ~]# mke2fs -j /dev/hda1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
24576 inodes, 98248 blocks
4912 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
12 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]# mke2fs -j /dev/hda2
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
122368 inodes, 244282 blocks
12214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=251658240
8 block groups
32768 blocks per group, 32768 fragments per group
15296 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
创建根分区与boot分区对应目录并挂载:
mkdir /mount
mkdir /mount/boot
mkdir /mount/sysroot
mount /dev/hda1 /mount/boot/
mount /dev/hda2 /mount/sysroot/
(2)使用内核创建boot引导
[root@localhost ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mount/boot/vmlinuz
[root@localhost ~]# mkdir /root/test
You have mail in /var/spool/mail/root
[root@localhost ~]# cd /root/test
[root@localhost test]# zcat /boot/initrd-2.6.18-308.el5.img | cpio -id
17855 blocks
[root@localhost test]# ls
bin dev etc init lib proc sbin sys sysroot
zcat:
zcat命令用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。zcat命令用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。zcat命令用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。
cpio:
cpio 可以从 cpio 或 tar 格式的归档包中存入和读取文件, 归档包是一种包含其他文件和有关信息的文件。 有关信息包括:文件名, 属主, 时标(timestamp), 和访问权限。 归档包可以是磁盘上的 其他文件, 也可以是磁带或管道。
-i, --extract: 进入 copy-in 模式,也就是 解压。
-d, --make-directories: 在需要的地方创建开始目录。
-H:使用归档格式
newc 新型 (SVR4) 跨平台格式(按照新规范保持源文件目录结构), 支持大于 65536 i节点的文件系统,该归档格式最大支持51200个文件。
--quiet:静默模式
-o:创建归档文件
vim init
[root@localhost test]# cat init
#!/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/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/urandom c 1 9
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 ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
echo "Loading ohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loading uhci-hcd.ko module"
insmod /lib/uhci-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 libata.ko module"
insmod /lib/libata.ko
echo "Loading ata_piix.ko module"
insmod /lib/ata_piix.ko
echo "Loading ahci.ko module"
insmod /lib/ahci.ko
echo "Loading dm-mod.ko module"
insmod /lib/dm-mod.ko
echo "Loading dm-log.ko module"
insmod /lib/dm-log.ko
echo "Loading dm-mirror.ko module"
insmod /lib/dm-mirror.ko
echo "Loading dm-zero.ko module"
insmod /lib/dm-zero.ko
echo "Loading dm-snapshot.ko module"
insmod /lib/dm-snapshot.ko
echo "Loading dm-mem-cache.ko module"
insmod /lib/dm-mem-cache.ko
echo "Loading dm-region_hash.ko module"
insmod /lib/dm-region_hash.ko
echo "Loading dm-message.ko module"
insmod /lib/dm-message.ko
echo "Loading dm-raid45.ko module"
insmod /lib/dm-raid45.ko
echo Waiting for driver initialization.
stabilized --hash --interval 1000 /proc/scsi/scsi
mkblkdevs
echo Scanning and configuring dmraid supported devices
echo Scanning logical volumes
lvm vgscan --ignorelockingfailure
echo Activating logical volumes
lvm vgchange -ay --ignorelockingfailure VolGroup00
resume /dev/VolGroup00/LogVol01
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/hda2
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot
编辑好清空不需要的模块
rm -rf ./lib/dm*
重新打包回去
find . | cpio -H newc --quiet -o | gzip -9 > /mount/boot/initrd.gz
(3)创建grub
grub-install --root-directory=/mount /dev/hda
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mount/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/hda
(hd1) /dev/sda
vi /mount/boot/grub/grub.cnf
[root@localhost sysroot]# cat /mount/boot/grub/grub.cnf
default=0
timeout=10
title MageEdu Linux(2.6.18)
root (hd0,0)
kernel /vmlinuz
initrd /initrd.gz
[root@localhost sysroot]#
(4)创建必备目录与inittab配置
[root@localhost test]# cd /mount/sysroot
[root@localhost sysroot]# ls
[root@localhost sysroot]# mkdir etc/rc.d/init.d bin sbin proc sys dev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home opt boot -pv
mkdir: created directory `etc'
mkdir: created directory `etc/rc.d'
mkdir: created directory `etc/rc.d/init.d'
mkdir: created directory `bin'
mkdir: created directory `sbin'
mkdir: created directory `proc'
mkdir: created directory `sys'
mkdir: created directory `dev'
mkdir: created directory `lib'
mkdir: created directory `root'
mkdir: created directory `mnt'
mkdir: created directory `media'
mkdir: created directory `var'
mkdir: created directory `var/log'
mkdir: created directory `var/run'
mkdir: created directory `var/lock'
mkdir: created directory `var/lock/subsys'
mkdir: created directory `var/tmp'
mkdir: created directory `usr'
mkdir: created directory `usr/bin'
mkdir: created directory `usr/sbin'
mkdir: created directory `usr/local'
mkdir: created directory `tmp'
mkdir: created directory `home'
mkdir: created directory `opt'
mkdir: created directory `boot'
配置inittab
inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。
id:runlevels:action:process 其中某些部分可以为空,下面我们逐一介绍。
id: 1~2个字符,配置行的唯一标识,在配置文件中不能重复。
runlevels:
配置行适用的运行级别,在这里可填入多个运行级别,比如12345或者35等。
Linux有7个运行级别,如下:
0:关机。
1:单用户字符界面。
2:不具备网络文件系统(NFS)功能的多用户字符界面。
3:具有网络功能的多用户字符界面。
4: 保留不用。
5:具有网络功能的图形用户界面。
6:重新启动系统。
action:
init有如下几种行为, init行为:
行为 |
描述 |
respawn |
启动并监视第4项指定的process,若process终止则重启它 |
wait |
执行第4项指定的process,并等待它执行完毕 |
once |
执行第4项指定的process |
boot |
不论在哪个执行等级,系统启动时都会运行第4项指定的process |
bootwait |
不论在哪个执行等级,系统启动时都会运行第4项指定的process,且一直等它执行完备 |
off |
关闭任何动作,相当于忽略该配置行 |
ondemand |
进入ondemand执行等级时,执行第4项指定的process |
initdefault |
系统启动后进入的执行等级,该行不需要指定process |
sysinit |
不论在哪个执行等级,系统会在执行boot 及bootwait之前执行第4项指定的process |
powerwait |
当系统的供电不足时执行第4项指定的 process,且一直等它执行完毕 |
powerokwait |
当系统的供电恢复正常时执行第4项指定的process,且一直等它执行完毕 |
powerfailnow |
当系统的供电严重不足时执行第4项指定的process |
ctrlaltdel |
当用户按下【Ctrl+Alt+Del】时执行的操作 |
kbrequest |
当用户按下特殊的组合键时执行第4项指定的process,此组合键需在keymaps文件定义 |
process:
所要执行的shell命令。任何合法的shell语法均适用于该字段。
vi /mount/sysroot/etc/inittab
[root@localhost sysroot]# cat etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
创建上面inittab所需sysinit脚本
[root@localhost sysroot]# vi etc/rc.d/rc.sysinit
[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysinit
[root@localhost sysroot]# cat etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to \033[34mMageEdu\0330m Linux"
/bin/bash
(5)命令移植
bash是内核最基本的一个命令,这个命令无论如何都得有
mkdir bin
cp /bin/bash ./bin/bash
[root@localhost sysroot]# ldd /bin/bash
libtermcap.so.2 => /lib64/libtermcap.so.2 (0x0000003a16e00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a17200000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a16a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a16600000)
mkdir lib64
cp /lib64/libtermcap.so.2 ./lib64/libtermcap.so.2
cp /lib64/libdl.so.2 ./lib64/libdl.so.2
cp /lib64/libc.so.6 ./lib64/libc.so.6
cp /lib64/ld-linux-x86-64.so.2 ./lib64/ld-linux-x86-64.so.2
同理按照以上步骤将/sbin/init命令也需要移植
常用命令ls:
cp /bin/ls ./bin/
cp /lib64/librt.so.1 ./lib64/
cp /lib64/libacl.so.1 ./lib64/
cp /lib64/libpthread.so.0 ./lib64/
cp /lib64/libattr.so.1 ./lib64/
(6)chroot内核测试
[root@localhost sysroot]# chroot /mount/sysroot/
bash-3.2#
(7)建立新虚拟机进行测试
在chroot测试没有问题后,就建立新的虚拟机将刚才新加入的这个硬盘接入到新的虚拟机中进行测试,接入新虚拟机前最好运行下sync命令,以使得内存数据落地。
关键字词:内核,系统,linux