引言

   Linux一大亮点就是开源,相对于Windows我们可以在Linux上发挥更大的想象力,来亲手打造拥有自己特色的Linux系统,前提是你必须对Linux运行元素有基本的了解,最起码要对Linux启动过程有所认识,有了这样的前提,才有可能打造属于自己风格的Linux系统。想了解启动过程的朋友可参阅本人博文,这里不在傲述,废话不说直入正题。http://soulboy1990116.blog.51cto.com/4007306/1266162

准备环境

制作机系统为RHEL5.8,有两块硬盘,其中一块是IDE,这里为了便于读者区分,创建独立VM虚拟硬盘这里不再掩饰过程,请确保如图:

自动化打造个人Linux_自动化打造个人Linux


测试机只有一块IDE硬盘,此硬盘待制作机完成制作之后,即可当做自己的启动盘使用,如图:

自动化打造个人Linux_自动化打造个人Linux_02


动化脚本分析

#!/bin/bash
#This script can complete the creation of the Linux
#Segment display function
###########create partition &&  file system ext3#########
#根据用户输入,在其设备创建三个分区并格式化为ext3文件系统类型。
echo "Initial a disk..."
echo -e "\033[31mWarning: \033[0m"
fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]"
read -p "your choice:" PARTDISK
if [ $PARTDISK == 'quit' ]; then
    echo "quit"
    exit 5
fi
until fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK" &> /dev/null;do
read -p "Wrong option,Your choice aging:" PARTDISK
done
read -p "Will destroy all data,continue:" CHOICE
until [ $CHOICE == 'y' -o $CHOICE == 'n' ]; do
    read -p "Will destroy all data,continue:" CHOICE
done
if [ $CHOICE == 'n' ]; then
    echo "Quit"
    exit 6
else
    for I in `mount | grep "$PARTDISK" | awk '{print $1}'`; do
    fuser -km $I
    umount $I
    echo "$I umount ok."
done
dd if=/dev/zero of=$PARTDISK bs=512 count=1
sync
sleep 3
echo 'n
p
1
+20M
n
p
2
+512M
n
p
3
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
+128M
t
3
82
w' | fdisk $PARTDISK &> /dev/null
partprobe $PARTDISK
sync
sleep 5
mke2fs -j ${PARTDISK}1 &> /dev/null
mke2fs -j ${PARTDISK}2 &> /dev/null
mkswap ${PARTDISK}3 &> /dev/null
fi
sync
sleep 3
#############install grub && mount {boot,sysroot}#################
#安装引导程序grub、挂载boot和ysroot目录
mkdir /mnt/{boot,sysroot} &> /dev/null
mount ${PARTDISK}1 /mnt/boot/
mount ${PARTDISK}2 /mnt/sysroot/
grub-install --root-directory=/mnt /dev/hda
sync
sleep 2
###################create grub.conf###########################
#创建grub配置文件
echo -e "default=0\ntimeout=5\ntitle Test Linux (Soulboy)\n   root (hd0,0)\n   kernel /vmlinuz\n   initrd /initrd.gz" > /mnt/boot/grub/grub.conf
sync
sleep 1
##########################create kernel##########################
#创建内核
cp /boot/vmlinuz-2.6*  /mnt/boot/vmlinuz
#########################create initrd.gz########################
#创建initrd.gz
mkdir /mnt/iso -p &> /dev/null
cd /mnt/iso
zcat /boot/initrd-2.6*  | cpio -id
sed -i  -e 's@^\(re.*\)@#\1@' -e "s@\(.*\)/dev/VolGroup00/LogVol00@\1$PARTDISK$22@" init
sync
sleep 2
find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz
sync
sleep 3
cd /
######################create directory######################
#创建基本目录结构
cd /mnt/sysroot/
mkdir proc sys dev etc/rc.d lib lib64 bin sbin boot home var/log usr/{bin,sbin} root tmp -pv
cd /
sync
sleep 4
####################copy init and bash#####################
#复制init和bash
cp /sbin/init /mnt/sysroot/sbin/
cp /bin/bash /mnt/sysroot/bin/
sync
sleep 4
###################copy /sbin/init library file##############
#复制init和bash所依赖的库到相应位置
DEST=/mnt/sysroot
libcp() {
        LIBPATH=${1%/*}
        [ ! -d $DEST$LIBPAT ] && mkdir -p $DEST$LIBPATH
        [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished"
}
bincp() {
        CMDPATH=${1%/*}
        [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
        [ ! -e $DEST{1} ] && cp $1 $DEST$CMDPATH
for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
        libcp   $LIB
done
}
COMMAND=`which /sbin/init | grep -v "alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
COMMAND=`which /bin/bash | grep -v "alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
sync
sleep 3
########################create inittab file#####################
#创建inittab文件
echo -e "id:3:initdefault:\nsi::sysinit:/etc/rc.d/rc.sysinit" > /mnt/sysroot/etc/inittab
######################create /etc/rc.d/rc.sysinit#############
#创建rc.sysinit脚本    最后一个执行的脚本
echo -e '#!/bin/bash\necho -e Welcome to my linux\n/bin/bash' > /mnt/sysroot/etc/rc.d/rc.sysinit
sync
sleep 2
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
echo "linux finished"


挂起制作机器

自动化打造个人Linux_自动化打造个人Linux_03


启动测试机器(grub.conf生效)

自动化打造个人Linux_自动化打造个人Linux_04


Init进程启动Bash生效

自动化打造个人Linux_自动化打造个人Linux_05

注释:此时只有BASH的内置命令,如需外置命令需手动添加。


脚本添加外置命令(挂起测试机,切换制作机)

#!/bin/bash
DEST=/mnt/sysroot
libcp() {
        LIBPATH=${1%/*}
        [ ! -d $DEST$LIBPAT ] && mkdir -p $DEST$LIBPATH
        [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished"
}
libcp /lib/librt.so.1
bincp() {
        CMDPATH=${1%/*}
        [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
        [ ! -e $DEST{1} ] && cp $1 $DEST$CMDPATH
for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
        libcp   $LIB
done
}
read -p "Your command:" CMD
until [ $CMD == 'q' ]; do
         ! which $CMD  && echo "Wrong command" && read -p "Input againe" CMD && continue
        COMMAND=`which $CMD | grep -v "alias" | grep -o "[^[:space:]]\{1,\}"`
        bincp $COMMAND
        echo "copy $COMMAND finished."
        read -p "Continue:" CMD
done

运行脚本批量添加外置命令

自动化打造个人Linux_自动化打造个人Linux_06


挂起制作机,切换测机器重启

自动化打造个人Linux_自动化打造个人Linux_07


what is busybox?

BusyBox是一个集成了一百多个最常用linux命令和工具的软件。它包含了一些简单的工具,例如ls、cat、echo等等,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。有些人将它称为Linux 工具里的瑞士×××。简单的说它就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了Android系统的自带的shell。

   BusyBox将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils,shellutils等工具,它提供了一个比较完善的环境,可以适用于任何小的或嵌入式系统。

思路:

硬件

         /dev/hda1     ext3    /boot

         /dev/hda2     ext3    /sysroot

软件

         内核         ---->     RHEL5.8

         initrd       ---->     busybox

         rootfs      ---->     busybox

         ssh          ---->     dropbear

一、编译安装busybox

tarxf busybox-1.20.2.tar.bz2
cdbusybox-1.20.2
makemenuconfig
请选择以静态方式编译,如下图:

自动化打造个人Linux_自动化打造个人Linux_08

由于最版busybox依赖新版内核的头文件,因此我们必须为其提新版内核的文件,否则编译会出错:

tarxf linux-2.6.38.5.tar.bz2 -C /usr/src
mkdirbusybox-1.20.2/include/mtd
cp/usr/src/linux-2.6.38.5/include/mtd/ubi-user.h  /busybox-1.20.2/include/mtd/
makeinstall

二、制作initrd

1、创建临时目录并复制ext3依赖的库文件

cp_install/ /tmp/busybox-a    穿件临时目录
cd/tmp/busybox/
rmlinuxrc
modinfo ext3    查看依赖的库
modinfo jbd     查看依赖的库
cp/lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko lib/modules/
cp/lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko lib/modules/

2、建立根文件系统

mkdirproc sys etc dev lib/modulesmnt/sysroottmp -pv

3、创建两个必要的设备文件

mknoddev/consolec 5 1
mknoddev/nullc 1 3

4、为initrd制作init程序,主要任务是实现rootfs的切换

vim init
#!/bin/sh
#
mount-t proc proc /proc
mount-t sysfs sysfs /sys
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
mdev -s
mount-t ext3 /dev/hda2/mnt/sysroot
execswitch_root /mnt/sysroot/sbin/init
chmod+x init

5、生成initrd文件

find. | cpio  -H newc --quiet -o | gzip-9 > /mnt/boot/initrd.gz

三、复制内核并安装grub

1、复制内核

cp/boot/vmlinuz-2.6.18-308.el5  /mnt/boot/vmlinuz

2、安装grub

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

3、创建grub.conf文件

vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title SoulBoy Linux (2.6.18)
root (hd0,0)
kernel /vmlinuzro root=/dev/hda2
initrd /initrd.gz

四、准备sysroot

1、切换目录复制

cd/busybox-1.20.2
cp_install/* /mnt/sysroot/-a
cd/mnt/sysroot/
rmlinuxrc

2、创建基本文件系统、inittab、fstab

mkdirproc sys dev tmp var/{log,lock,run} lib/modulesetc/rc.d/init.d root boot mnt media -pv
vim etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount-a -r
vim etc/fstab
sysfs   /syssysfs   defaults        0       0
proc    /procproc    defaults        0       0
/dev/hda1/bootext3    defaults        0       0
/dev/hda2/       ext3    defaults        1       1

3、创建必要设备文件

mknoddev/consolec 5 1
mknoddev/nullc 1 3

4、创建rc.sysinit文件

vim etc/rc.d/rc.sysinit
#!/bin/sh
echo"Welcome to MiNi Linux"
echo"Remounting the root filesystem...."
mount-t proc proc /proc
mount-t sysfs sysfs /sys
mount-o remount,rw /
echo"Creating the files of device...."
mdev -s
echo"Mounting the filesystem....."
mount-a
swapon -a
chmod+x etc/rc.d/rc.sysinit

注意请务必多次sync同步写入,如果切换主机过可能会出现文件系统崩溃,如果文件系统崩溃可启用一下方式修复

cd/mnt/sysroot
find. | cpio -H newc --quiet -o | gzip> /root/sysroot.gz    导出
umount/dev/hda2
fuser -km /mnt/sysroot
umount/dev/hda2
e2fsck -f /dev/hda2检查修复或者格式化
yes
mount/dev/hda2/mnt/sysroot
cd/mnt/sysroot/
zcat /root/sysroot.gz | cpio -id导入

此时挂起宿主机查看测试机结果:

自动化打造个人Linux_自动化打造个人Linux_09


自动化打造个人Linux_自动化打造个人Linux_10

此时微型Linux没有bash、没有登录提示、没有网络、没有ssh,当依然可以跑起来,而且busybox提供了足够丰富的命令


五、完善系统安装dropbear

 Dropbear是一个相对较小的SSH服务器和客户端。它运行在一个基于POSIX的各种平台。 Dropbear是开源软件,在麻省理工学院式的许可证。 Dropbear是特别有用的“嵌入”式的Linux(或其他Unix)系统,如无线路由器。

1、编译安装dropbear

tarxf dropbear-2013.56.tar.bz2
cddropbear-2013.56
./configure
make
makeinstall

2、移植bash

移植脚本如下:
#!/bin/bash
DEST=/mnt/sysroot
libcp() {
LIBPATH=${1%/*}
[ ! -d $DEST$LIBPATH ] && mkdir-pv $DEST$LIBPATH
[ ! -e $DEST${1} ] && cp$1 $DEST$LIBPATH && echo"copy lib $1 finished"
}
bincp() {
CMDPATH=${1%/*}
[ ! -d $DEST$CMDPATH ] && mkdir-p $DEST$CMDPATH
[ ! -e $DEST{1} ] && cp$1 $DEST$CMDPATH
forLIB in`ldd $1 | grep-o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp   $LIB
done
}
read-p "Your command:"CMD
until[ $CMD == 'q']; do
! which$CMD  && echo"Wrong command"&& read-p "Input againe"CMD && continue
COMMAND=`which$CMD | grep-v"alias"| grep-o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo"copy $COMMAND finished."
read-p "Continue:"CMD
done

自动化打造个人Linux_自动化打造个人Linux_11

3、为系统提供登录凭证

grep-E "^root:"/etc/passwd> /mnt/sysroot/etc/passwd
grep-E "^root:"/etc/shadow> /mnt/sysroot/etc/shadow
grep-E "^root:"/etc/group> /mnt/sysroot/etc/group
修改/mnt/sysroot/etc/inittab为如下:
vim /mnt/sysroot/etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty9600 tty1
::respawn:/sbin/getty9600 tty2
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount-a

4、提供为文件系统

vim etc/fstab
sysfs   /syssysfs   defaults        0       0
proc    /procproc    defaults        0       0
devpts  /dev/ptsdevpts  mode=620        0       0
/dev/hda1/bootext3    defaults        0       0
/dev/hda2/       ext3    defaults        1       1

5、创建所需要目录和文件

cd/mnt/sysroot/
mkdirdev/pts
mkdiretc/dropbear
mkdirusr/lib
vim etc/shells提供默认shell文件
/bin/sh
/bin/bash
/bin/ash
/bin/hash
vim /mnt/sysroot/etc/nsswitch.conf     提供nsswitch配置文件
passwd:     files
shadow:     files
group:      files
hosts:      files dns
创建秘钥文件
dropbearkey -t rsa -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key-s 2048
dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
cp-d /lib/libnss_files* /mnt/sysroot/lib
cp-d /usr/lib/libnss3.so  /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/
cp/etc/nsswitch.conf  /mnt/sysroot/etc/

多次sync之后开始测试主机验证结果:

自动化打造个人Linux_自动化打造个人Linux_12

此时登录需要凭证、默认为bash、网络功能可用。

开启dropbear,用其他机器尝试登录

自动化打造个人Linux_自动化打造个人Linux_13

至此试验结束,欢迎各大虾指正试验中的错误。