这是一些学习笔记,存在不足之处,请指正。
平台:vmware 12 操作系统:centos5.1
- 硬盘
准备硬盘,20G
分区
fdisk /dev/sdb
格式化分区
mke2fs -j /dev/sdb1
mkswap /dev/sdb2
mke2fs -j /dev/sdb3
挂载硬盘
mkdir /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot
mount /dev/sdb3 /mnt/sysroot
生成grub
grub-install --root-directory=/mnt /dev/sdb1
/mnt:可以理解为根分区
/dev/sdb1:挂在到/mnt/boot下的分区
ls -l /mnt/boot
drwxr-xr-x 2 root root 1024 Aug 3 07:45 grub
drwx------ 2 root root 12288 Aug 3 07:42 lost+found
- 内核相关配置
vmlinuz
此处为了方便,不编译内核,,直接复制现有的内核
cp /boot/vmlinuz-2.6.18-398.el5 /mnt/boot/vmlinuz
initrd
initrd是在内存上加载的驱动根目录文件系统的一个文件,要在现有的/boot/initrd-2.6.18-398.el5.img稍作修改即可
file initrd-2.6.18-398.el5.img
initrd-2.6.18-398.el5.img: gzip compressed data, from Unix, last modified: Wed Jul 20 15:23:58 2011, max compression
initrd-2.6.18-398.el5.img为压缩文件,先复制为gzip可以识别的格式,再解压
cp /boot/initrd-2.6.18-398.el5.img /~/initrd-2.6.18-164.el5.img.gz
cd
gunzip initrd-2.6.18-164.el5.img.gz
说明:
initrd也可以这样操作,更加简便。在/root/test下
zcat /boot/initrd-2.6.18-398.el5.img | cpio -id
然后就可以看到文件的内容:
ls
bin dev etc init lib proc sbin sys sysroot
initrd-2.6.18-398.el5.img为cpio归档文件
file initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5.img: ASCII cpio archive (SVR4 with no CRC)
mkdir test
cd !$
在一个单独的文件夹下进行解压
cpio -id < initrd-2.6.18-164.el5.img
修改init文件
vim init
找到
mkrootdev -t ext3 -o defaults,ro /dev/vol0/root
改为
mkrootdev -t ext3 -o defaults,ro /dev/sda3
说明:当硬盘挂载到新的虚拟机上时,/根所在分区会被识别为/dev/sda3
重新打包,并放到/mnt/boot下
find . | cpio -H newc -o --quiet | gzip -9 > /mnt/boot/initrd.gz
- 建立系统启动相关文件
在/mnt/sysroot/创建/根下的文件夹
mkdir -pv bin,sbin,usr/{bin,sbin},proc,sys,home,root,mnt,media,var,lib,etc,dev,boot,tmp
init
系统启动需要/sbin/init
cp /sbin/init /mnt/sysroot/sbin/
init还需要一些库文件的支持
ldd /sbin/init
linux-vdso.so.1 => (0x00007fff3adc4000)
libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003f67a00000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003f67600000)
libc.so.6 => /lib64/libc.so.6 (0x0000003f5f800000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003f60000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f5f400000)
这样复制命令和库文件较为麻烦,因此写了如下的脚本,只要将需要复制的命令名称输入,即可复制对应命令库文件
#!/bin/bash
#
dst=/mnt/sysroot
libcp(){
lib_path=${1%/*}
[ ! -d $dst$lib_path ] && mkdir -p $dst$lib_path
[ ! -e $dst$1 ] && cp $1 $dst$lib_path && echo "copy $1 finished."
}
bincp(){
cmd_path=${1%/*}
[ ! -d $dst$cmd_path ] && mkdir -p $dst$cmd_path
[ ! -e $dst$1 ] && cp $1 $dst$cmd_path
for lib in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp $lib
done
}
read -p "Enter the command that you want to copy: " user_cmd
until [ $user_cmd == "q" ]; do
! which $user_cmd && echo -e "\e[31;5m\tWrong Command!\e[0m" && read -p "Enter the command that you want to copy: " user_cmd && continue
cmd_real_path=`which $user_cmd | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $cmd_real_path
echo "Command $user_cmd copy finished."
echo -e "\e[32m##########################################################\e[0m"
read -p "Enter the command that you want to copy: " user_cmd
done
在这里我复制的命令有ls、mkdir、rm、ln、chown,chmod、ping、mount、insmod、modprobe等
到此处,可以使用chroot /mnt/sysroot/ 切换到其中,可以发现,刚才复制的命令都可以使用。
inittab
cd /mnt/sysroot/etc/
vim inittab
#在里面写入:
id:3:initdefault
si::sysinit:/etc/rc.d/rc.sysinit
这定义了开机之后以第3中模式(即命令行模式进入系统),并启动系统sysinit
rc.sysinit
- vim /etc/rc.d/
rc
.sysinit
#!/bin/bash
echo -e "===================================="
echo -e " \e[31;5mWelcome to MY Linux\3[0m"
echo -e " \e[32m`date`\e[0m"
echo -e "===================================="
insmod /lib/modules/mii.ko
insmod /lib/modules/pcnet32.ko
ifconfig eth0 192.168.8.61/16
ifconfig lo 127.0.0.1
/bin/bash
定义了系统启动后好后,显示的内容,以及启用的shell,这里是/bin/bash
说明:这两个模块和网络驱动相关
insmod /lib/modules/mii.ko
insmod /lib/modules/pcnet32.ko
增加执行权限
chmod +x rc.sysinit
grub.conf
进入/mnt/boot/grub下,找到grub.conf,编辑
default=0
timeout=5
title My Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3
initrd /initrd.gz
这个文件定义了开机加电自检之后,系统读取了MBR中bootloarder,如何去加载内核等相关信息
到此,制作完成。
在vmware中新建一个虚拟机,使用刚才制作的硬盘启动,OK。