安装环境:centos6.8,kernel:2.6.32-642.4.2.el6.x86_64

目标主机:最小化的自制的linux主机

宿主机:在那台linux主机中制作的自制最小化的linux主机,以下皆在宿主机中进行

新添加的磁盘配置信息如下:

系统裁剪centos6.8具有网络功能_linux

系统裁剪centos6.8具有网络功能_Linux_02

1、在虚拟机中新添加一个硬盘,并且记住该硬盘存放位置,以便待会使用,分两个区,分别用于boot和/

# echo -n"

n

p

1

+500M

n

p

2

+5G

w"|fdisk /dev/sdb

mkfs.ext4 /dev/sdb1

mkfs.ext4 /dev/sdb2

2、挂载分区,挂载位置没有应先创建

# mount /dev/sdb1 /mnt/boot

# mount /dev/sdb2 /mnt/sysroot

3、复制linux内核,和initramfs.img至/mnt/boot/下

# cp /boot/vmlinuz-`uname -r`/mnt/boot/vmlinuz

# cp /boot/initramfs-`uname -r`.img /mnt/boot/initramfs.img

4、安装grub至/dev/sdb中

# grub-install --root-directory=/mnt /dev/sdb

注:因为这里是挂载至/mnt目录下,所以将mnt当成grub的根

5、复制一些命令至裁剪的系统中,通过bincp.sh脚本

# bash /root/scripts/bincp.sh

bash

mount

insmod

cat

vim

ls

cd

ifconfig

mkdir

touch

umount

ping

tree

quit

6、将网卡驱动复制过去

查看所有驱动,e1000则是网卡驱动

# lsmod

查看e1000驱动的详细信息,查看该驱动文件位置

# modinfo e1000

# mkdir /mnt/sysroot/lib/modules/ -pv

# cp /lib/modules/`uname -r`/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/

注:lib/modules文件夹没有应事先创建

7、创建目标主机根下相应目录

# mkdir -pv /mnt/sysroot/{etc,etc/rc.d,boot,dev,bin,lib,sbin,home,root,var,usr,tmp,mnt,media,proc,sys}

8、为目标主机建立grub配置文件,让系统能够引导

# vim /mnt/boot/grub/grub.conf

default=0

timeout=3

title siyu

root (hd0,0)

kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init

initrd initramfs.img

注:这里initrd指令和kernel的值应该与第4步的文件名相同,因为这里init值是/sbin/init,所以需要创建/sbin/init文件并添加相应系统初始化命令,如果不想使用init文件,则改为init=/bin/bash即可,但无法实现网络功能

9、初始化系统文件init,并且赋予执行权限

# vim /mnt/sysroot/sbin/init

#!/bin/bash

echo -e "\t \033[34m linux \033[3m"

mount -n -t proc proc /proc

mount -n -t sysfs sysfs /sys

insmod /lib/modules/e1000.ko

ifconfig eth0 192.168.1.4/24

ifconfig lo 127.0.0.0/8

mount -n -t remount,rw /dev/sda2 /

/bin/bash

# chmod +x /mnt/sysroot/sbin/init

10、将sdb硬盘移植进入别的虚拟机中测试

新建一个虚拟机,结果如下,磁盘文件要与host主机新添加的磁盘相同

系统裁剪centos6.8具有网络功能_linux_03

11、使用init配置文件并且网络配置成功

系统裁剪centos6.8具有网络功能_linux_04

使用脚本一键执行

这里使用的宿主机根目录为sysroot,挂载至mnt下;boot分区为boot,挂载至/mnt/boot

# vim createsys.sh

#!/bin/bash

disk() {

echo -n '

n

p

1

+500M

n

p

2

+5G

wq'| fdisk "$1"

sleep 3

kpartx -l "$1"

kpartx -af "$1"

partx -a "$1"

dmsetup remove_all

mke2fs -t ext4 "$1"1

mke2fs -t ext4 "$1"2

}

mounts() {

[ -d /mnt/boot/ ] || mkdir /mnt/boot

[ -d /mnt/sysroot/ ] || mkdir /mnt/sysroot

mount "$disk"1 /mnt/boot

mount "$disk"2 /mnt/sysroot

}

cpkernel() {

cp /boot/vmlinuz-`uname -r`  /mnt/boot/vmlinuz

cp /boot/initramfs-`uname -r`.img /mnt/boot/initramfs.img

grub-install --root-directory=/mnt /dev/sdb

}

cpcmd() {

bash /root/scripts/bincp.sh #bincp.sh In the /root/scripts/  Next

}

cpnetwork() {

[ -d /mnt/sysroot/lib/modules/ ] || mkdir /mnt/sysroot/lib/modules/ -pv

cp /lib/modules/`uname -r`/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/e1000.ko

}

mkdirs() {

mkdir -pv /mnt/sysroot/{etc,etc/rc.d,boot,dev,bin,lib,sbin,home,root,var,usr,tmp,mnt,media,proc,sys}

}

creategrub() {

echo "

default=0

timeout=3

title siyu

root (hd0,0)

kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init

initrd /initramfs.img" >> /mnt/boot/grub/grub.conf

}

inits(){

cat  >> /mnt/sysroot/sbin/init  <<  EOF

#!/bin/bash

echo -e "\t \033[34m linux \033[0m"

mount -n -t proc proc /proc

mount -n -t sysfs sysfs /sys

insmod /lib/modules/e1000.ko

ifconfig eth0 $1

ifconfig lo 127.0.0.0/8

mount -n -t remount,rw /dev/sda2 /

/bin/bash

EOF

chmod +x /mnt/sysroot/sbin/init

}

read -p "input a disk : " disk

disk "$disk"

mounts

cpkernel

cpcmd

mkdirs

cpnetwork

creategrub

read -p "input a ip/netmask: " network

inits "$network"

bincp脚本如下:

#!/bin/bash

#copy command and need so ---> /mnt/sysroot

target=/mnt/sysroot

main() {

if which $1 &> /dev/null ; then

echo "command such "

else

echo "no such command"

return 4

fi

}

 

bincommand() {

cmdpath=`which --skip-alias $1`

dirpath=`dirname $cmdpath`

[ -d $target ] || mkdir -p $target

[ -d ${target}${dirpath} ] || mkdir -p ${target}${dirpath}

[ -f ${target}${cmdpath} ] || cp $cmdpath ${target}${dirpath}

}

 

binlib() {

for i in `ldd $cmdpath | grep -o "/[^[:space:]]\{1,\}"` ; do

libdir=`dirname $i`

[ -d ${target}${libdir} ] || mkdir -p ${target}${libdir}

[ -f ${target}${i} ] || cp $i ${target}${libdir}

done

}

 

while true ; do

read -p "input a command: " cmd

if [[ "$cmd" == 'quit' ]]; then

echo "quitting"

exit 0

fi

if [ $? -ne 0 ] ; then

echo "worng command"

continue

fi

main $cmd

bincommand $cmd

binlib

done