系统:centos 5.8 64bit
软件版本:busybox-1.21.1.tar.bz2
dropbear-2016.73.tar.bz2
参考:http://os.51cto.com/art/201403/431943.htm
1.编译 busybox-1.21.1.tar.bz2
make menuconfig
(Busybox Settings-->Build Options-->Build BusyBox as a static binary (no shared libs)
选上这个静态编译,去掉Build with Large File Support (for accessing files > 2 GB)
make && make install
2.制作initrd文件
mkdir initrd
cp busybox-1.21.1/_install/* initrd/ -rp
cd initrd/
mkdir -pv proc sys etc/init.d tmp dev mnt/sysroot
mknod dev/console c 5 1
mknod dev/null c 1 3
rm linuxrc
编辑init文件:
[[email protected] initrd]# cat > init << EOF
> #!/bin/sh
> mount -t proc proc /proc
> mount -t sysfs sysfs /sys
> insmod /lib/modules/jbd.ko
> insmod /lib/modules/ext3.ko
> insmod /lib/modules/scsi_mod.ko
> insmod /lib/modules/sd_mod.ko
> insmod /lib/modules/scsi_transport_spi.ko
> insmod /lib/modules/mptbase.ko
> insmod /lib/modules/mptscsih.ko
> insmod /lib/modules/mptspi.ko
> mdev -s
> mount -t ext3 /dev/sda2 /mnt/sysroot
> exec switch_root /mnt/sysroot /sbin/init
> EOF
chmod +x init
这里因为没有把ext3编译进内核,所以需要挂载ext3模块,而ext3依赖于jbd模块,所以需要先加载jbd.ko,具体可以通过modinfo ext3查看,
因为我在虚拟机用的是scsi硬盘,所以还要加载scsi驱动,scsi_mod.ko、sd_mod.ko等就是对应模块,模块要事先拷贝到对应路径,过程如下:
mkdir lib/modules -pv
modinfo ext3
cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko lib/modules
cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/drivers/scsi/scsi_mod.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/drivers/scsi/sd_mod.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/drivers/scsi/scsi_transport_spi.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/drivers/message/fusion/mptbase.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/drivers/message/fusion/mptscsih.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/drivers/message/fusion/mptspi.ko lib/modules/
find . | cpio --quiet -H newc -o | gzip -9 -n > /mnt/boot/initrd.gz
内核编译比较繁琐,下次有时间另起一篇
3.建立根文件系统
cp busybox-1.21.1/_install/* /mnt/sysroot/ -rp
cd /mnt/sysroot
mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib
mknod dev/console c 5 1
mknod dev/null c 1 3
mkdir lib/modules -pv
cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko lib/modules/
4.提供初始化脚本:
cat >etc/rc.d/rc.sysinit <<EOF
> echo -e "\tWelcome to \033[31mlinzb‘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 ..."
> insmod /lib/modules/mii.ko
> insmod /lib/modules/pcnet32.ko
> ifconfig lo 127.0.0.1
> ifconfig eth0 192.168.2.227
> EOF
chmod +x etc/rc.d/rc.sysinit
rm -f linuxrc
5.提供inittab和fstab
[[email protected] sysroot]# cat > etc/inittab <<EOF
> ::sysinit:/etc/rc.d/rc.sysinit
> console::respawn:-/bin/sh
> ::ctrlaltdel:/sbin/reboot
> ::shutdown:/bin/umount -a -r
> EOF
[[email protected] sysroot]# vi etc/fstab
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/sda1 /boot ext3 defaults 0 0
/dev/sda2 / ext3 defaults 1 1
注意:用scsi硬盘做实验的时候就算你挂载的是sdb,minilinux识别的时候也是sda,这个是自己试验的结论,
大家可以多试一下。
6、由于在rc.sysinit文件中启动了日志进程,因此系统在运行中会产生大量日志并将其显示于控制台;这将会
经常性的打断正在进行的工作,为了避免这种情况,我们这里为日志进程建立配置文件,为其指定将日志发送
至/var/log/messages文件;
# vim etc/syslog.conf
添加如下一行:
*.info /var/log/messages
7.安装grub
grub-install --root-directory=/mnt/ /dev/sdb
注意:这里的sdb是mini linux所在的硬盘
8.提供grub.conf 和内核
[[email protected] sysroot]# vim /mnt/boot/grub/grub.conf
default 0
timeout 1
color light-green/black light-magenta/black
title my mini Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 quiet
initrd /initrd.gz
cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
######################################################
9.为新构建的miniLinux启用虚拟控制台
这个可以通过宿主机来实现,也可以直接启动刚构建成功的小Linux进行配置。我们这里采用通过宿主机的方式(重新启动宿主机):
# cd /mnt/sysroot
将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rc.sysinit
tty1::askfirst:/bin/sh
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
tty5::askfirst:/bin/sh
tty6::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
10.为mini linux 创建登陆用户
[[email protected] sysroot]# vi etc/passwd
内容为: root:x:0:0:root:/root:/bin/sh (这里要修改shell,因为busybox没有bash,或者给sh创建个软连接为bash)
[[email protected] sysroot]# vi etc/shadow
内容为: root:$1$gm6zfnou$Zpndu0pK3qCsiTHAM8kJP.:16909:0:99999:7::: (这里可以根据自己需要手动生成)
[[email protected] sysroot]# vi etc/group
内容为: root:x:0:root
将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rc.sysinit (这里记得先把rc.d ln -s 到init.d)
tty1::respawn:/sbin/getty 9600 tty1
tty2::respawn:/sbin/getty 9600 tty2
tty3::respawn:/sbin/getty 9600 tty3
tty4::respawn:/sbin/getty 9600 tty4
tty5::respawn:/sbin/getty 9600 tty5
tty6::respawn:/sbin/getty 9600 tty6
::shutdown:/bin/umount -a -r
::ctrlaltdel:/sbin/reboot
11.通过dropbear为系统提供ssh远程连接服务
<1>编译安装dropbear
tar xf dropbear-2016.73.tar.bz2
cd dropbear-2016.73
./configure
make
make install
<2>移植dropbear
which dropbear 查找到命令所在位置
ldd dropbear查看命令依赖的庫,并cp可执行程序和库到目标对应目录中
可以自己写个脚本cp比较方便,内容如下:(仅供参考)
#!/bin/bash
#
function cp_command(){
COMMAND=`which $1|grep -v "^alias\>"`
LIB=`ldd $COMMAND |cut -d ‘(‘ -f1 |grep -o "\/.*\/.*so.*"`
ROOTDIR=/mnt/sysroot
for i in $LIB
do
[ ! -e $ROOTDIR${i%/*} ]&& mkdir -p $ROOTDIR/${i%/*}
cp $i $ROOTDIR${i%/*} -f && echo "cp $i success"||echo -e "\033[31mfailed cp !\033[0m"
done
[ ! -e $ROOTDIR${COMMAND%/*} ]&& mkdir -p $ROOTDIR/${COMMAND%/*}
cp $COMMAND $ROOTDIR${COMMAND%/*} -f && echo "cp $COMMAND success"||echo -e "\033[31mfailed cp !\033[0m"
}
while : ; do
read -p " please input a command (q means quit) : " a
[ $a == "q" ]&& exit 0
which $a && cp_command $a ||echo "Usage: `basename $0` CMD ; q means quit"
done
需要拷贝dropbear、dropbearkey和dbclient三个命令
<3>为远程登录的用户提供伪终端设备文件
编辑/mnt/sysroot/etc/fstab,添加如下一行:
devpts/dev/ptsdevptsmode=6200 0
<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 /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key -s 2048
dropbearkey -t rsa -f /mnt/sysroot/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/
7、测试
启动目标主机,设定好网络属性后,使用如下命令启动dropbear服务即可。
# /usr/local/sbin/dropbear
debug:
busybox编译:
报错:miscutils/ubi_tools.c:67:26: error: mtd/ubi-user.h: No such file or directory
这是一个Linux下新支持的UBI文件系统,需要手工加入。从Linux内核源码包的include\mtd\ubi-user.h拷贝到busybox下的include\mtd下,
如果 busybox下的include没有mtd文件夹,那就先建立一个mtd文件夹,然后复制
dropbear可以到登陆界面,但是连不上,查看messages日志,报错:Login attempt for nonexistent user from 192.168.2.106:50307
解决方法:搞定了,复制库复制错了,因为我的系统是64位,所以拷贝nsswitch库的时候应该是:
cp -d /lib64/libnss_* /mnt/sysroot/lib64/
cp -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64/