一)从linux本身系统上裁剪出来一个小系统。
博客目的和实现功能:
从本身存在的系统上新添加一块硬盘,做一个grub引导,然后把新加的硬盘做好后,加上网卡驱动,放到其余的主机上能正常进入使用,ping通外网即可。
1)先挂载一个新的磁盘――》给磁盘分区-》格式化-》挂载。
/dev/sdb1 1 14 112423+ 83 Linux /dev/sdb2 15 146 1060290 83 Linux
mke2fs -t ext4 /dev/sdb1 mke2fs -t ext4 /dev/sdb2
2)创建两个目录,挂载使用。
mkdir /mnt/{boot,sysroot} mount /dev/sdb1 /mnt/boot/ mount /dev/sdb2 /mnt/sysroot/
3)安装grub到目标磁盘。
[root@station106 ~]# grub-install --root-directory=/mnt /dev/sdb 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 /mnt/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/sda (hd1) /dev/sdb
4)复制源主机上的引导程序到目标磁盘上。
cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img
5)创建一些文件放到根系统上。
[root@station106 ~]# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys, dev, lib, lib64, bin, sbin, boot, srv, mnt, media, home, root} mkdir: created directory `/mnt/sysroot/{etc' mkdir: created directory `/mnt/sysroot/{etc/rc.d,usr,var,proc,sys,' mkdir: created directory `dev,' mkdir: created directory `lib,' mkdir: created directory `lib64,' mkdir: created directory `bin,' mkdir: created directory `sbin,' mkdir: created directory `boot,' mkdir: created directory `srv,' mkdir: created directory `mnt,' mkdir: created directory `media,' mkdir: created directory `home,' mkdir: created directory `root}'
6)移植bash和一些需要的命令道根系统中。让裁剪好的小系统也能正常使用。
我这里用的脚本实现的。
#!/bin/bash target=/mnt/sysroot(定义一个变量) read -p "enter a command:" cmd(交互模式) clearcmd() { (定义个函数,函数名字为clearcmd) if which $cmd &> /dev/null;then (如果输出的命令存在则放到位桶) cmdpath=`which --skip-alias $cmd` (这里特殊用法--skip-alias是为了跳出别名) else (不存在就显示not,则以退出码为5退出) echo "Not such command" exit 5 fi } cmdcopy() { (在定义一个函数,函数名为cmdcopy) cmddir=`dirname $cmdpath` (截取命令的头文件) [ -d ${target}{cmddir} ] || mkdir -p ${target}${cmddir} 判断/mnt/sysroot下的截取的命令头文件是否存在。或者创建。 [ -f ${target}${1} ] || cp $1 ${target}${cmddir} 检测文件是否存在$1传递的是cmdpath。 } libcopy() { (定义一个函数,名字为,libcopy) for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do (循环命令库文件) libdir=`dirname $lib` (定义解出来的库目录) [ -d ${target}${libdir} ] || mkdir -p ${target}${libdir} [ -f ${target}${lib} ] || cp $lib ${target}${libdir} done } while true;do 为真进入循环 read -p "enter a command:" cmd if [ "$cmd" == 'quit' ];then 等于quit就退出。 echo "quit" exit 6 fi clearcmd $cmd 调用第一个函数。为5就是不存在跳出循环 [ $? -eq 5 ] && continue cmdcopy $cmdpath 调用函数 libcopy $cmdpath调用函数 done
执行这个脚本bash cp.sh复制过去一些需要的命令和库文件,需要用到mount,ls,ifconfig,route,ping。
7)提供grub配置文件。
vim /mnt/boot/grub/grub.conf default=0 默认启动第一个内核 timeout=5 启动显示时间 title shunzi Linux 标题 root (hd0,0) 第一个磁盘的第一个分区 kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash 内核文件 initrd /initramfs.img 额外驱动文件。
8)添加init程序。实现模块加载能ping通外网。
vim /mnt/sysroot/sbin/init #!/bin/bash echo -e "welcome to \033[34 lixianshun Tiny\033[0m Linux" mount -n -t proc proc /proc mount -n -t sysfs sysfs /sys insmod /lib/modules/e1000.ko [ $? -eq 0 ] && echo -e "Load e1000 module succeeded [\033[32mOK\033[0m ]" ifconfig lo 127.0.0.1/8 ifconfig eth0 192.168.1.10/24 route add -net 0.0.0.0 gw 192.168.1.253 mount -n -o remount,rw /dev/sda2 / /bin/bash
添加权限chmod +x sbin/init
添加过init程序后,grub.conf里的init=/bin/bash改为/sbin/init,不改默认也会需找init。
9)把源主机上的网卡驱动复制已到目主机。
mkdir -p /mnt/sysroot/lib/modules/ cp /lib/modules/2.6.32358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/
10)关闭源系统,启动另一台宿主机,把做好的这个硬盘放上,直接启动。进入到了bash界面,里面能用的命令比较少,因为这里取决于你添加的命令。可以测试ping外网。和查看路由。发现都是ok的。