实验环境:现有的centos6系统,挂载一个VMware的虚拟磁盘,对此磁盘分为两个分区,分别对应要制作的linux的根和 启动所需的boot。拷贝vmlinuz,initramfs到boot下等等,具体如下
实验:自制linux
说明:利用一个硬盘(虚拟机添加一个单个文件的磁盘20G)和一个现有的centos6系统,在硬盘里面创建/boot(/dev/sdb1))和/(/dev/sdb2)及必要的文件
1、在centos6上面加一个硬盘20G
2、利用现有的linux分区
4、拷贝vmlinuz及initramfs
1、 自制linux,在一个分区里利用/mnt/boot 和命令gurb-install –root-directroy=/mnt /dev/sdb ,在分区/mnt/boot/(磁盘分区/deb/sdb1挂载其上)上生成/dev/sdb/的MBR前446字节grubstage1,/dev/sdb1/stage1_5,stage2。
2、 在手动创建/dev/sdb1/grub/grub.conf,把vmlinuz和initramfs复制一份放到/dev/sdb1/下,由grub.conf里面指定的uuid即磁盘分区/dev/sdb2,第一个初始化脚本init /bin/bash和initrd initramfs即/dev/sdb2所在系统根(/)的ext4驱动模块,即完成一个简单的自制linux。
3、 结合自制linux开机后,在/var下有grub即vmlinuz,initramfs等,猜测第4步
*******************不同的根目录和boot目录,同上基本相同************************************
1.添加磁盘
2.虚拟机VMware识别磁盘的方法
4.格式化文件系统
脚本第一行的路径改为此路径ch_root="/mnt/sysimage"
9.拷贝网卡模块文件
****************拷贝命令及其依赖库的简单脚本*******
实验:自制linux
说明:利用一个硬盘(虚拟机添加一个单个文件的磁盘20G)和一个现有的centos6系统,在硬盘里面创建/boot(/dev/sdb1))和/(/dev/sdb2)及必要的文件
1、在centos6上面加一个硬盘20G
2、利用现有的linux分区
[root@centos6 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan
[root@centos6 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 3.7G 0 rom /media/CentOS_6.9_Final
sda 8:0 0 400G 0 disk
├─sda1 8:1 0 200M 0 part /boot
├─sda2 8:2 0 19.5G 0 part /
├─sda3 8:3 0 19.5G 0 part /app
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 4G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
[root@centos6 ~]# fdisk /dev/sdb
[root@centos6 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 3.7G 0 rom /media/CentOS_6.9_Final
sda 8:0 0 400G 0 disk
├─sda1 8:1 0 200M 0 part /boot
├─sda2 8:2 0 19.5G 0 part /
├─sda3 8:3 0 19.5G 0 part /app
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 4G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 203.9M 0 part
└─sdb2 8:18 0 19.8G 0 part
3、格式化文件系统
[root@centos6 ~]# mkfs.ext4 /dev/sdb1;mkfs.ext4 /dev/sdb2
[root@centos6 ~]# blkid 确认ext4文件系统
[root@centos6 ~]# mkdir /mnt/boot/ #此处的boot和要制作的linux中的/boot无任何关系
[root@centos6 ~]# mount /dev/sdb1 /mnt/boot
4、生成grub
[root@centos6 ~]# grub-install --root-directory=/mnt /dev/sdb #此处必须为分区/dev/sdb1的boot的父目录mnt
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
[root@centos6 ~]# hexdump -C -n 512 -v /dev/sdb #已经生成数据
4、拷贝vmlinuz及initramfs
[root@centos6 ~]# cp /boot/vmlinuz-2.6.32-696.el6.x86_64 vmlinuz
[root@centos6 ~]# cp /boot/initramfs-2.6.32-696.el6.x86_64.img initramfs.img
[root@centos6 ~]# mv vmlinuz initramfs.img /mnt/boot
[root@centos6 ~]# ls /mnt/boot
grub initramfs.img lost+found vmlinuz
5、编辑grub.conf
[root@centos6 ~]# cat > /mnt/boot/grub/grub.conf
default=0
timeout=5
title linux ======UUID为根/的blkid===============================
kernel /vmlinuz root=UUID=ddec90ce-771c-448d-982f-c9755ee6b645 selinux=0 init=/bin/bash
initrd /initramfs.img
6、拷贝必要的命令(脚本见本文最下面)(bash,ls,cat,ifconfig,insmod,ping,lsblk,mount,vim,vi,insmod),挂载/dev/sdb2
[root@centos6 ~]# mkdir /mnt/rootfs
[root@centos6 ~]# mount /dev/sdb2 /mnt/rootfs
[root@centos6 ~]# bash copy.sh
[root@centos6 ~]# tree /mnt/rootfs
[root@centos6 lib64]# mkdir /mnt/rootfs/{dev,etc,lib,proc,sys,usr,var,lib,boot,mnt,home,root,tmp} -v
[root@centos6 lib64]# modinfo e1000
[root@centos6 lib64]# cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/rootfs/lib
[root@centos6 lib64]# sync
7、利用制作的启动盘,启动后
insmod /lib/e1000.ko
ifconfig eth0 192.168.30.16/24,可以ping
****************************总结**********************************
1、 自制linux,在一个分区里利用/mnt/boot 和命令gurb-install –root-directroy=/mnt /dev/sdb ,在分区/mnt/boot/(磁盘分区/deb/sdb1挂载其上)上生成/dev/sdb/的MBR前446字节grubstage1,/dev/sdb1/stage1_5,stage2。
2、 在手动创建/dev/sdb1/grub/grub.conf,把vmlinuz和initramfs复制一份放到/dev/sdb1/下,由grub.conf里面指定的uuid即磁盘分区/dev/sdb2,第一个初始化脚本init /bin/bash和initrd initramfs即/dev/sdb2所在系统根(/)的ext4驱动模块,即完成一个简单的自制linux。
3、 结合自制linux开机后,在/var下有grub即vmlinuz,initramfs等,猜测第4步
*******************不同的根目录和boot目录,同上基本相同************************************
1.添加磁盘
2.虚拟机VMware识别磁盘的方法
echo '- - -' > /sys/class/scsi_host/host2/scan
3.分区
4.格式化文件系统
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
[root@centos6 ~]# mkdir /mnt/sysimage
[root@centos6 ~]# mount /dev/sdb2 /mnt/sysimage/
[root@centos6 ~]# mkdir /mnt/sysimage/boot
[root@centos6 ~]# mount /dev/sdb1 /mnt/sysimage/boot/
5.安装grub
grub-install --root-directory=/mnt/sysimage /dev/sdb #----------------boot父目录
[root@centos6 ~]# cp /boot/vmlinuz-2.6.32-696.el6.x86_64 /mnt/sysimage/boot/
[root@centos6 ~]# cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/sysimage/boot/
[root@centos6 boot]# ls -R
编写grub.conf
default=0
timeout=5
title redhat
root (hd0,0) root(hd0,0) #可要可不要
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=4aa06589-fccb-4acd-b406-219347f5ad2d rhgb q
uiet selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-696.el6.x86_64.img
7.编写拷贝程序和对应库文件的脚本
脚本第一行的路径改为此路径ch_root="/mnt/sysimage"
9.拷贝网卡模块文件
cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysimage/lib64/
10.创建根下的其他目录
mkdir /mnt/sysimage/{etc,dev,proc,sys,home,var,mnt,media,root,tmp,lib}
sync #以防万一机器未及时同步数据到磁盘,命令同步数据到磁盘
12.启动后配置网卡
insmod /lib64/e1000.ko
ifconfig eth0 xxx.xxx.xxx.xxx/16
****************拷贝命令及其依赖库的简单脚本*******
#!/bin/bash
ch_root="/mnt/rootfs"
[ ! -d $ch_root ] && mkdir $ch_root
bincopy() {
if which $1 &>/dev/null;then
local cmd_path=`which --skip-alias $1`
local bin_dir=`dirname $cmd_path`
[ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
[ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}
return 0
else
echo "Command not found"
return 1
fi
}
libcopy() {
local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
for loop in $lib_list;do
local lib_dir=`dirname $loop`
[ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir}
[ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}
done
}
read -p "Please input a command: " command
while [[ ! "$command" =~ quit|q|Q ]];do
if bincopy $command;then
libcopy $command
fi
read -p "Please input a command or quit: " command
done