系統裁剪centos6.8具有網絡功能

安裝環境:centos6.8,kernel:2.6.32-642.4.2.el6.x86_64

目標主機:最小化的自制的linux主機

宿主機:在那臺linux主機中製作的自制最小化的linux主機,以下皆在宿主機中進行

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

7CCC6D22E5A745D4A83980EE2B06E9C6

9E0D0D6822FA43D59C7916A9BD89576E

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主機新添加的磁盤相同

95DB749BEE49428FAA4B3CBCABAF6EEE

11、使用init配置文件並且網絡配置成功

23A2BD93EAA047D68A56A5F66C56B556

使用腳本一鍵執行

這裏使用的宿主機根目錄爲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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章