标签:linux学习 小系统 busybox dropbear
制作流程:
kernel->initrd(busybox)->rootfs(busybox)
kernel:直接利用/boot/vmlinuz-`uname -r`内核镜像或手动编译生成
initrd:编译busybox,在busybox的基础上建立initrd
rootfs:同样在busybox的基础上建立rootfs
一、为小系统上的新硬盘建立分区并挂载在宿主机的相应目录,以便创建修改文件。
/dev/hda1 100M boot分区 挂载在/mnt/boot
/dev/hda2 512M 根分区 挂载在/mnt/sysroot
二、编译内核源代码,为新系统提供一个所需的内核(假设源代码包位于/usr/src目录中)
①直接利用/boot/vmlinuz-`uname -r`内核镜像
cp /boot/vmlinuz-`uname -r` /mnt/boot/bzImage
②手动编译生成内核镜像
# cd /usr/src
# tar jxvf linux-2.6.38.5.tar.bz2
# cd linux-2.6.38.5
# make menuconfig
根据实际和规划选择所需要的功能;本实例计划制作一个具有网络的功能的微型linux且不打算使用内核模块,因此,这里选择把本机对应的网卡驱动直接编译进了内核。因为使用的是vmware Workstation虚拟机,所以所需的网上驱动是pcnet32的,其它的均可按需要进行选择。选择完成后需要保存至当前目录下.config文件中。
# make SUBDIR=arch/
# cp arch/x86/boot/bzImage /mnt/boot
提示:为了实现后面的功能,请务必将文件系统中的ext3和网卡的驱动程序直接编译进内核;否则,就需要手动装载这些相关文件系统的模块;
三、编译busybox
(假设busybox源代码在/usr/src目录中)
# cd /usr/src
# tar -jxvf busybox-1.20.2.tar.bz2
# cd busybox-1.20.2
# mkdir include/mtd
# cp /usr/src/linux-2.6.38.5/include/mtd/ubi-user.h include/mtd/
# make menuconfig
说明:
1、此处需要选择 Busybox Settings --> Build Options --> Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;但你也可以不选择此项,而完成编译后把其依赖的共享库复制至目标系统上的/lib目录中即可;这里采用后一种办法。
2、修改安装位置,方法为:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix。安装后的文件均位于选定的安装位置目录中;
# make install
需要复制一份刚安装在/usr/src/busybox-1.20.2/_install下的busybox至/mnt/sysroot,以实现initrd和rootfs的分开制作。
# cp /usr/src/busybox-1.20.2/_install/* /mnt/sysroot -a
四、制作initrd
# cd /usr/src/busybox-1.20.2/_install
1、建立initrd中的rootfs:
# mkdir -pv proc sys etc/init.d tmp dev mnt/sysroot
2、创建两个必要的设备文件:
# mknod dev/console c 5 1
# mknod dev/null c 1 3
3、为initrd制作init程序,此程序的主要任务是实现rootfs的切换,因此,可以以脚本的方式来实现:
# rm linuxrc
# 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
exec switch_root /mnt/sysroot /sbin/init
给此脚本执行权限:
chmod +x init
4、制作initrd
# find . | cpio --quiet -H newc -o | gzip -9 -n > /mnt/boot/initrd.gz
五、为小系统创建所需的引导程序
# grub-install --root-directory=/mnt /dev/hda
说明:此处的/dev/hda为目标系统所在的那块新磁盘;
接下来为grub建立配置文件:
# vim /mnt/boot/grub/grub.conf
添加类似如下内容:
default 0
timeout 3
title CQY‘ Linux (2.6.38.5)
root (hd0,0)
kernel /bzImage ro root=/dev/hda2 quiet
initrd /initrd.gz
六、创建真正的根文件系统
# cd /mnt/sysroot
1、建立rootfs:
# mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib
2、创建两个必要的设备文件:
# mknod dev/console c 5 1
# mknod dev/null c 1 3
3、建立系统初始化脚本文件
# vim etc/rc.d/rc.sysinit
添加如下内容:
#!/bin/sh
echo -e "\tWelcome to \033[31mCQY‘s\033[0m Linux"
echo -e "Remounting the root filesystem ..."
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /
echo -e "Creating the files of device ..."
mdev -s
echo -e "Mounting the filesystem ..."
mount -a
swapon -a
echo -e "Starting the log daemon ..."
syslogd
klogd
echo -e "Configuring loopback interface ..."
ifconfig lo 127.0.0.1/24
ifconfig eth0 192.168.0.111/24
# END
而后让此脚本具有执行权限:
chmod +x etc/init.d/rc.sysinit
4、配置init及其所需要inittab文件
# cd /mnt/sysroot
# rm -f linuxrc
为init进程提供配置文件:
# vim etc/inittab
添加如下内容:
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、为系统准备一个“文件系统表”配置文件/etc/fstab
# vim etc/fstab
添加如下内容:
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
/dev/hda2 / ext3 defaults 1 1
6、由于在rc.sysinit文件中启动了日志进程,因此系统在运行中会产生大量日志并将其显示于控制台;这将会经常性的打断正在进行的工作,为了避免这种情况,我们这里为日志进程建立配置文件,为其指定将日志发送至/var/log/messages文件;
# vim etc/syslog.conf
添加如下一行:
*.info /var/log/messages
七、为系统添加用户账号(基于宿主机内的用户信息)
1、为目标主机建立passwd帐号文件
# cd /mnt/sysroot
# vim etc/passwd
添加如下内容:
root:x:0:0::/root:/bin/sh
而后为root用户创建“家”目录:
# mkdir root
2、为目标主机建立group帐号文件
# vim etc/group
添加如下内容:
root:x:0:
3、为目标主机建立shadow影子口令文件,这里采用直接复制宿主机的shadow文件中关于root口令行的行来实现
# grep "^root" /etc/shadow > etc/shadow
注:等目标主机启动时,root用户的口令也是宿主机的root用户的口令。您可以在目标主机启动以后再动手更改root用户的口令。
4、将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rc.sysinit
::respawn:/sbin/getty 9600 tty1
::respawn:/sbin/getty 9600 tty2
::shutdown:/bin/umount -a -r
::ctrlaltdel:/sbin/reboot
八、在系统登录时提供banner信息
# vim /mnt/sysroot/etc/issue
添加如下内容:
Welcome to CQY‘s Linux...
Kernel \r
九、在系统启动时为系统提供主机名称
1、创建保存主机名称的配置文件
# mkdir /mnt/sysroot/etc/sysconfig
# vim /etc/sysconfig/network
添加如下内容:
HOSTNAME=marion.example.com
2、编辑系统初始化脚本,实现开机过程中设定主机名称
# vim /mnt/sysroot/etc/init.d/rc.sysinit
在文件尾部添加如下行:
HOSTNAME=
[ -e /etc/sysconfig/network && -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z ${HOSTNAME} ] && HOSTNAME="localhost"
/bin/hostname ${HOSTNAME}
十、在系统登录时提供banner信息
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
# vi /etc/issue
添加如下内容:
Welcome to MageEdu Linux(http://www.magedu.com)...
Kernel \r
十一、在系统启动时为系统提供主机名称
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
1、创建保存主机名称的配置文件
# mkdir /etc/sysconfig
# vi /etc/sysconfig/network
添加如下内容:
HOSTNAME=marion.example.com
2、编辑系统初始化脚本,实现开机过程中设定主机名称
# vi /etc/init.d/rc.sysinit
在文件尾部添加如下行:
HOSTNAME=
[ -e /etc/sysconfig/network && -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z ${HOSTNAME} ] && HOSTNAME="localhost"
/bin/hostname ${HOSTNAME}
十一、通过dropbear为系统提供ssh远程连接服务
1、编译安装dropbear (假设dropbear源代码在/usr/src/内)
# cd /usr/src
# tar xf dropbear-2013.56.tar.bz2
# cd dropbear-2013.56
# ./configure
# make
# make install
2、移植dropbear至目标系统
移植二进制程序及其依赖的库文件,方能实现其在目标系统上正常运行。建议使用脚本进行(这里将其保存为cpso.sh),其会自动移植指定的命令及依赖的库文件。
#!/bin/bash
#
DEST=/mnt/sysroot
libcp() {
LIBPATH=${1%/*}
[ ! -d $DEST$LIBPATH ] && 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
}
read -p "Your command: " CMD
until [ $CMD == ‘q‘ ]; do
! which $CMD &> /dev/null && echo "Wrong command" && read -p "Input again:" CMD && \ continue
COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
read -p "Continue: " CMD
done
接下来运行此脚本,分别输入dropbear、dropbearkey和dbclient即可;这些命令和命令所依赖的库文件会被存储于目标系统的对应目录中。
3、为远程登录的用户提供伪终端设备文件
编辑/mnt/sysroot/etc/fstab,添加如下一行:
devpts /dev/pts devpts mode=620 0 0
创建所需要的目录:
# mkdir /mnt/sysroot/dev/pts
4、为目标系统的dropbear生成主机密钥
默认情况下,dropbear到/etc/dropbear目录中查找使用的rsa格式主机密钥(默认名称为dropbear_rsa_host_key)和dss格式的主机密钥(默认名称为dropbear_dss_host_key)。其中,rsa格式可使用不同长度的密钥,但dss格式只使用1024位的密钥。
# mkdir /mnt/sysroot/etc/dropbear
# dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
# dropbearkey -t rsa -f /etc/dropbear/dropbear_dss_host_key
在生成rsa格式的key时,其长度指定部分-s 2048可以省略,也可以为其指定为其它长度,但长度需要为8的整数倍。
说明:此步骤也可以在目标主机上进行,但路径要做相应的修改。
5、定义安全shell
安全起见,dropbear默认情况下仅允许其默认shell出现在/etc/shells文件中的用户远程登录,因此,这里还需要创建/etc/shells文件,并添加所有允许的shell。
# cat >> /mnt/sysroot/etc/shells << EOF
/bin/sh
/bin/ash
/bin/hush
/bin/bash
EOF
6、为目标主机提供网络服务转换机制
在宿主机上使用默认选项编译的dropbear将依赖nsswitch实现用户名称解析,因此,还需要为目标主机提供nss相关的库文件及配置文件。
# cat >> /mnt/sysroot/etc/nsswitch.conf << EOF
passwd: files
shadow: files
group: files
hosts: files dns
EOF
复制所需要的库文件:
# cp -d /lib/libnss_files* /mnt/sysroot/lib/
# cp -d /usr/lib/libnss3.so /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/
标签:linux学习 小系统 busybox dropbear
原文地址:http://chenqiyi.blog.51cto.com/8125763/1685452