17.4自制及其简单的linux

实验环境:现有的centos6系统,挂载一个VMware的虚拟磁盘,对此磁盘分为两个分区,分别对应要制作的linux的根和            启动所需的boot。拷贝vmlinuz,initramfs到boot下等等,具体如下

实验:自制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





猜你喜欢

转载自blog.csdn.net/csdn_immortal/article/details/80875007