前言
随着接触Linux的慢慢深刻、对Linux也有了一个基本认识了吧,慢慢的接触系统内核、系统配置文件、在了解Linux的系统启动流程后,如今来总结一下一个简单的Linux系统的裁减方法和步骤,一个只有内核文件和几个简单的命令的小Linux系统,如今就开始如下裁减:
正文
首先在一个虚拟机上新增一块硬盘、这样等裁减好了以后能够把这块硬盘挂载到别的虚拟机上去、运行自已裁减的那个Linux系统;linux
添加完硬盘后就启动虚拟机了; shell
查找一下刚才添加的硬盘:
# fdisk -l /dev/sd[a-z]vim
添加完硬盘以后就应该分区格式化硬盘了;
# fdisk /dev/sdbwindows
这里就本身分区好了、很简单的、比windows简单多了!!!
分区完后就给这两个分区格式化了;
格式化指定文件系统类型为ext4
# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2bash
格式化完了以后就看到刚才分的两个分区列表了;
然后在/mnt目录下建立两个目录分别挂载到刚分好的那两个分区上去:
# mkdir -pv /mnt/{boot,sysroot}网络
挂载目录/mnt/boot到/dev/sdb1分区上去;
挂载目录/mnt/sysroot到/dev/sdb2分区上去;
# mount /dev/sdb1 /mnt/boot/
# mount /dev/sdb2 /mnt/sysroot/ide
然后就往sdb上安装grub;
建立的boot在哪就指定到哪一个路径下去,而后再指定安装在哪块硬盘上,grub安装完以后就会生成/mnt/boot/grub/目录、grub目录下就会生成相关的文件
# grub-install --root-directory=/mnt /dev/sdbui
如今咱们把宿主机里的内核文件给sdb拷贝一份到/mnt/boot/目录下,名字咱们就叫mvlinuz、版本号咱们就不带了、init文件也拷贝一份到/mnt/boot/目录下,名字就简单的改成initramfs.img
# cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
# cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.imgspa
完整的linux有哪些目录呢、那咱们就得来建立一下这些个目录了;以前咱们挂载的那个sysroot的目录都没有到、那咱们就在这个目录下建立这些目录、切换到/mnt/sysroot/下:
# mkdir -pv /etc/rc.d root boot dev proc sys tmp var usr srv lib lib64 bin sbin home mnt media3d
到这里了、若是咱们的第二块硬盘上再有个可执行程序是否是就能够运行了呢、那咱们不仿移植一些程序到咱们的第二块硬盘上去、咱们以前写了一个移植可执行程序的脚本、包括程序所依赖的库文件也一并移植过去了、代码以下:
#!/bin/bash
#
#定义目标目录、也就是要拷贝到的那个目录
target=
/mnt/sysroot
#声明清理命令的方法
clearCmd() {
#判断命令是否存在、若是不存在就提示没有找到命令
if
which
$cmd &>
/dev/null
;
then
#获取命令的路径
cmdPath=`
which
--skip-
alias
$cmd`
else
echo
"No such command"
return
5
fi
}
#定义拷贝命令的方法
cmdCopy() {
#获取命令路径、只取目录部分
cmdDir=`
dirname
$1`
#判断目录是否存在、不否在就建立
[ -d ${target}${cmdDir} ] ||
mkdir
-p ${target}${cmdDir}
#判断要拷贝的命令否存在在、不存在就拷贝
[ -f ${target}${1} ] ||
cp
$1 ${target}${cmdDir}
}
#定义拷贝库文件的方法
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
echo
"quit"
exit
0
fi
#调用清理命令方法
clearCmd $cmd
[ $? -
eq
5 ] &&
continue
#调用拷贝命令和库文件的方法
cmdCopy $cmdPath
libCopy $cmdPath
done
接着切换到/mnt/sysroot/bin/目录下、给bash建立一个软连接、由于系统默认找shell都是找sh
# ln -sv bash sh
如今咱们切换到/mnt/sysroot/目录试一下看就知道了:
# chroot /mnt/sysroot/
看、咱们的小根能够用了
这里咱们再提供一个init脚本给这个小系统,在/sbin/目录下,这个init要经过调用/etc/inittab这个配置文件,而后再去执行/etc/rc.d/rc.sysinit下的初始化脚本、这样的话那咱们就把初始化脚本的内容拿到init里来执行;
这个脚本到底要作哪些操做呢:
# vim /mnt/sysroot/sbin/init
#!/bin/bash
#
#打印欢迎信息
echo
-e
"\tWecome to \033[34m Mini Linux-2.6 OS\033[0m"
#挂载两个伪文件系统;-t后面跟文件系统类型
mount
-n -t proc proc
/proc
mount
-n -t sysfs sysfs
/sys
#启动后再以读写方式从新挂载/dev/sda2上,这样的话就要把宿主机关机再后再新运行这个小系统了
mount
-n -o remount,rw
/dev/sda2
/
#运行bin下的bash
/bin/bash
保存退出后给init一个可执行权限:
chmod +x /mnt/sysroot/sbin/init
此时咱们就要给这块硬盘上的小系统提供一个grub的配置文件了,若是不写这个配置文件也能够启动、但一进入就会进到grub小shell中让你配置系统的grub信息;
# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title Mini Linux OS
root(hd0,0)
kernel
/vmlinuz
ro root=
/dev/sda2
selinux=0 init=
/sbin/init
initrd
/initramfs
.img
OK,保存退出!
同步一下到对应的磁盘上:
# sync
通过以上的操做、下面咱们就来建立一个新的虚拟机、而后选择虚拟机使用咱们刚才装小系统的那块硬盘、CentOS_SecondSCSI.vmdk;
好了、咱们把已经运行的虚拟机都挂载起,运行咱们刚才建立好的那个有CentOS_SecondSCSI.vmdk磁盘的虚拟机,到这里咱们就看到咱们裁减的小系统跑起来了、看到咱们本身定义的Min Linux-2.6 OS了!
进到咱们的小系统里去了:
接下来咱们要在小系统里装载网卡、可是要确保被装载的网卡驱动没有使用、咱们能够用lsmod这个命令查看一下:这里以e1000为例来讲明问题、我这里的虚拟机上已经装有了、那我就先卸载了再装载上去:
在宿主机上查看当前内核装载的模块信息:
# lsmod
卸载e1000网卡驱动:
# modprobe -r e1000
要装载的话用下面命令便可:
# modprobe e1000
那怎么样把e1000的内核模块拷贝到咱们的小系统里面里、让他装上去、而且启用网络功能呢、首先确保咱们系统中的piv4没有作成模块,这里咱们的ipv4没有作成模块、那就去移植这个模块吧:
首先给他建立一个目录、切换到/mnt/sysroot/lib目录中:
# mkdir modules
再拷贝咱们系统上的内核模块到这个目录里去
# cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/
再移植一些所须要用到的命令:insmod、rmmod、ifconfig、ip、ping
OK、同步一下咱们就能够从新启动小系统了
# sync
进到小系统里、敲命令吧;
# insmod /lib/modules/e1000.ko
# ifocnfig eth0 176.16.251.100/16
# ping -c 3 176.16.251.100
好了、到这里咱们就基本完成了小系统的裁减了、要想装载更多的功能、后面能够本身再添加、想装什么就装什么、要想系统启动就有网络那能够在init中设置一下、在init中加上ifconfig eth0 176.16.251.100/16就能够了、init要写得更好本身后期再慢慢改吧、加慢判断和显示颜色什么的等等:
结语: 好像东西不少的样子、其实也不是不少了、可能我比较啰嗦、噼里啪啦的写了一大堆吧、其实操做也很少、就是要理清步骤就很清晰了、不是吗、好吧、就到此结束吧、人无完人、有错或有什么不妥还望大神指点哦!