微型系统制作:具有IP地址、有虚拟终端、有主机名、能ssh远程登录

简介:

 

微型系统制作:具有IP地址、有虚拟终端、有主机名、能ssh远程登录;
 
首先是思路:
       Kernel + initrd(busybox制作,提供ext3文件系统模块) + ROOTFS (busybox制作)
       首先要提供一个内核kernel,提供一个initrd,以便它能够加载根文件系统,由busybox制作,其提供ext3文件系统模块.然后加载rootfs,其也是有busybox制作,
              PS:虽然busybox很小,但是其支持的命令很多。
      
 
大体思路步骤
       1、这里只编译内核的核心
              #make arch/
       2、编译完内核要将其核心复制出来
              如果是x86系列的,则其内核在/arch/x86/boot/bzImage将其复制到/mnt/boot/命名为linuz
                     这里需要注意:不必要的硬件驱动不需要在这里编入到initrd,如网卡驱动等、其由rc.sysinit来完成。所以其仅需要提供内核访问真正的根文件系统所在设备需要的驱动,存储设备和文件系统相关的模块;系统初始化rc.sysinit: 初始其它硬件的驱动程序;
       3、制作ROOTFS
              如果想在其中使用bash,因为busybox没有提供bash而只有hush和ash,只需要将bash移动过去。并且其中的init不支持运行级别,如果想支持,也需要复制init过去,另外/etc/inittab中的格式也不相同。所以如果移植了init那么系统上的inittab也要符合这种格式。
             
       所以结合移植方式和busybox方式来组合微型linux。
      
前提:
       1、一个作为宿主机的Linux;本文使用的是Redhat Enterprise Linux 5.8;
       2、在宿主机上提供一块额外的硬盘作为新系统的存储盘,为了降低复杂度,这里添加使用一块IDE接口的新硬盘;
       3、Linux内核源码,busybox源码;本文使用的是目前最新版的linux-2.6.38.5和busybox-1.20.2。
 
一、为系统上的新硬盘建立分区,这里根据需要先建立一个大小为100M的主分区作为新建系统的boot分区和一个512M的分区作为目标系统(即正在构建的新系统,后面将沿用此名称)的根分区;100M的分区格式化后将其挂载至/mnt/boot目录下;512M的分区格式化后将挂载至/mnt/sysroot目录;
 
 
 
 
  1. #mount /dev/hda1 /mnt/boot/  
  2. #mount /dev/hda2 /mnt/sysroot/  
  3. #mount -a  
      
 
二、编译内核源代码,为新系统提供一个所需的内核(本例中的源代码包都位于/usr/src目录中)
       1、编译内核源代码
 
 
 
 
  1. # cd /usr/src  
  2. # tar jxvf linux-2.6.38.5.tar.bz2   
  3. # ln -sv linux-2.6.38.5 linux  
  4. # cd linux  

在这里要为其提供一个内核文件.conf,
 

       然后到ftp下载ftp://172.16.0.1/pub/Sources/kernel/kernel-2.6.38.1-i686.cfg至当前目录中,并重命名为.config。
(因为本人不在ftp的网络中,所以事先准备好的文件在主目录下,为了便于大家理解所以这个图为在实验室中的图,这里借用)
 

这里复制这个文件到linux文件中改名.conf(2个步骤只是用1个即可)
 

       # make menuconfig
根据您的实际和规划选择所需要的功能;本实例计划制作一个具有网络的功能的微型linux且不打算使用内核模块,因此,这里选择把本机对应的网卡驱动直接编译进了内核。作者使用的是vmware Workstation虚拟机,所以,所需的网上驱动是pcnet32的,其它的均可按需要进行选择。选择完成后需要保存至当前目录下.config文件中。
              提示:为了实现后面的功能,请务必将文件系统中的ext3和网卡的驱动程序直接编译进内核;否则,就需要手动装载这些相关文件系统的模块;
 
 
 
  1. # make SUBDIR=arch/  
  2. # cp arch/x86/boot/bzImage /mnt/boot  
  3.  
  4. # make menuconfig  
             

提示:敲入命令screen,会创建一个跑着shell的单一窗口,这里面,你可以跑你所需要的程序,然后Ctrl+a d退出刚创建的窗口(回到进入screen前的环境),然后再敲入命令screen创建新的终端窗口,就这样,你可以建立多个有shell的窗口(这些窗口里都可以跑你自己的应用),这样就是你退出远程管理窗口(进入screen的环境),你的screen窗间的窗口都不会关闭,里面跑得应用自然也不会当掉,用screen -ls可以看所有的screen sessions,用screen -r sessionid可以进sessionid指定的特定的screen session,最后screen session不再使用的时候,screen -r sessionid进去,exit退出即可
 
       2、安装grub
 

 
 
  1. # grub-install --root-directory=/mnt /dev/hda  
 
              接下来为grub建立配置文件:
              # vim /mnt/boot/grub/grub.conf
 
              添加类似如下内容:
 
 
 
  1. default        0  
  2. timeout        3  
  3. color    light-green/black light-magenta/black  
  4. title    MageEdu Linux (2.6.38.5)  
  5.        root (hd0,0)  
  6.        kernel /bzImage ro root=/dev/hda2 quiet  
  7.        initrd /initrd.gz  
 
三、编译busybox
        
 
 
 
  1. # tar -jxvf busybox-1.20.2.tar.bz2  
  2. # cd busybox-1.20.2  
  3. # mkdir include/mtd   
  4. # cp /usr/src/linux/include/mtd/ubi-user.h include/mtd/  
  5. # make menuconfig  

 
              说明:
              1、此处需要选择 Busybox Settings --> Build Options --> Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;但你也可以不选择此项,而完成编译后把其依赖的共享库复制至目标系统上的/lib目录中即可;这里采用后一种办法。
              2、修改安装位置为/mnt/sysroot;方法为:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,修改其值为/mnt/sysroot。
 
 
四、制作initrd
 
 
  1. #mkdir /tmp/initrd  
  2. #cp _install/* /tmp/initrd/ -a  
  3. # cd /tmp/initrd/  
 
       1、建立rootfs:
 
 
 
  1. # mkdir -pv proc sys etc/init.d tmp dev mnt/sysroot  

 
       2、创建两个必要的设备文件:
 
 
 
  1. # mknod dev/console c 5 1  
  2. # mknod dev/null c 1 3  

       3、为initrd制作init程序,此程序的主要任务是实现rootfs的切换,因此,可以以脚本的方式来实现它:
 
 
 
  1. # rm linuxrc  
  2. # vim init  
              添加如下内容:
 
 
  1. #!/bin/sh  
  2. mount -t proc proc /proc  
  3. mount -t sysfs sysfs /sys  
  4. insmod /lib/modules/jbd.ko  
  5. insmod /lib/modules/ext3.ko  
  6. mdev -s  
  7. mount -t ext3 /dev/hda2 /mnt/sysroot  
  8. exec switch_root /mnt/sysroot /sbin/init  
 
              给此脚本执行权限:
              chmod +x init
 
       4、制作initrd
      
 
 
 
  1. # cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko lib/modules/  
  2. # cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko lib/modules/  

              # find . | cpio --quiet -H newc -o | gzip -9 -n > /mnt/boot/initrd.gz
 
五、建立真正的根文件系统
 
              # cd /mnt/sysroot
 
       1、建立rootfs:
 
 
  1. # mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib  
 
       2、创建两个必要的设备文件:
 
 
  1. # mknod dev/console c 5 1  
  2. # mknod dev/null c 1 3  
 
       3、建立系统初始化脚本文件
 
 
 
  1. # vim etc/rc.d/rc.sysinit  
 
                     添加如下内容:
 
  
 
 
  1. #!/bin/sh  
  2.   echo -e "\tWelcome to \033[31mMageEdu\033[0m Linux"  
  3.  
  4.   echo -e "Remounting the root filesystem ..."  
  5.   mount -t sysfs sysfs /sys  
  6.   mount -o remount,rw /   
  7.  
  8.   echo -e "Creating the files of device ..."  
  9.   mdev -s   
  10.  
  11.   echo -e "Mounting the filesystem ..."  
  12.   mount -a  
  13.   swapon -a  
  14.  
  15.   echo -e "Starting the log daemon ..."  
  16.   syslogd  
  17.   klogd  
  18.  
  19.   echo -e "Configuring loopback interface ..."  
  20.   ifconfig lo 127.0.0.1/24  
  21.   ifconfig eth0 172.16.100.9/16  
 
  
              而后让此脚本具有执行权限:
  
 
 
  1. chmod +x etc/init.d/rc.sysinit  
 
       4、配置init及其所需要inittab文件
 
 
 
  1. #cd /mnt/sysroot  
  2. # rm -f linuxrc  
  3.  
  4. 为init进程提供配置文件:  
  5. # vim etc/inittab  
  6.  
  7. 添加如下内容:  
  8. ::sysinit:/etc/rc.d/rc.sysinit  
  9. console::respawn:-/bin/sh  
  10. ::ctrlaltdel:/sbin/reboot  
  11. ::shutdown:/bin/umount -a -r  
 
       5、为系统准备一个“文件系统表”配置文件/etc/fstab
 
 
  1. # vim etc/fstab  
  2.  
  3.        添加如下内容:  
  4. sysfs                   /sys                    sysfs   defaults        0 0  
  5. proc                    /proc                   proc    defaults        0 0  
  6. /dev/hda1               /boot                   ext3    defaults        0 0  
  7. /dev/hda2               /                       ext3    defaults        1 1  
 
       6、由于在rc.sysinit文件中启动了日志进程,因此系统在运行中会产生大量日志并将其显示于控制台;这将会经常性的打断正在进行的工作,为了避免这种情况,我们这里为日志进程建立配置文件,为其指定将日志发送至/var/log/messages文件;
 
 
 
  1. # vim etc/syslog.conf  
  2.  
  3.  
  4. *.info    /var/log/messages   
五、建立真正的根文件系统
      
 
 
 
  1. # cd /mnt/sysroot  
  2. ## cp busybox-1.20.2/_install/* /mnt/sysroot/ -a  
       1、建立rootfs:
 
 
  1. # mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib  
 
       2、创建两个必要的设备文件:
 
 
  1. # mknod dev/console c 5 1  
  2. # mknod dev/null c 1 3  
3、配置init及其所需要inittab文件
 
 
  1. #cd /mnt/sysroot  
  2.               # rm -f linuxrc  
  3.    
  4.               为init进程提供配置文件:  
  5.               # vim etc/inittab  
  6.    
  7.               添加如下内容:  
  8.               ::sysinit:/etc/rc.d/rc.sysinit  
  9. console::respawn:-/bin/sh  
  10.               ::ctrlaltdel:/sbin/reboot  
  11.               ::shutdown:/bin/umount -a -r   
4、建立系统初始化脚本文件
 
 
 
  1. # vim etc/rc.d/rc.sysinit  
  2.  
  3.        添加如下内容:  
  4.  
  5. #!/bin/sh  
  6. echo -e "\tWelcome to \033[31mMageEdu\033[0m Linux"  
  7.  
  8. echo -e "Remounting the root filesystem ..."  
  9. mount -t sysfs sysfs /sys  
  10. mount -o remount,rw /   
  11.  
  12. echo -e "Creating the files of device ..."  
  13. mdev -s   
  14.  
  15. echo -e "Mounting the filesystem ..."  
  16. mount -a  
  17. swapon -a  
  18.  
  19. echo -e "Starting the log daemon ..."  
  20. syslogd  
  21. klogd  
  22.  
  23. echo -e "Configuring loopback interface ..."  
  24. ifconfig lo 127.0.0.1/24  
  25. ifconfig eth0 172.16.100.9/16  
       5、为系统准备一个“文件系统表”配置文件/etc/fstab
 
 
 
  1. # vim etc/fstab  
  2.  
  3.         添加如下内容:  
  4.  sysfs                   /sys                    sysfs   defaults        0 0  
  5.  proc                    /proc                   proc    defaults        0 0  
  6.  /dev/hda1               /boot                   ext3    defaults        0 0  
  7.  /dev/hda2               /                       ext3    defaults        1 1  
       6、将bash命令拷贝过来
       回到宿主机执行脚本bincp.sh(此命令为事先编译好的复制命令的脚本)
      

六、为新构建的ToyLinux启用虚拟控制台
 
              这个可以通过宿主机来实现,也可以直接启动刚构建成功的小Linux进行配置。我们这里采用通过宿主机的方式(重新启动宿主机):
 
 
  1. # cd /mnt/sysroot  
  2.  
  3. 将 etc/inittab文件改为如下内容:  
  4. ::sysinit:/etc/init.d/rc.sysinit  
  5. tty1::askfirst:/bin/sh  
  6. tty2::askfirst:/bin/sh  
  7. tty3::askfirst:/bin/sh  
  8. tty4::askfirst:/bin/sh  
  9. tty5::askfirst:/bin/sh  
  10. tty6::askfirst:/bin/sh  
  11. ::ctrlaltdel:/sbin/reboot  
  12. ::shutdown:/bin/umount -a -r  
 
                     好了,接下来就可以测试验正六个虚拟控制台的使用了。
七、尽管上述第七步已经实现了虚拟控制台,但其仍是直接进入系统,且系统没有用户帐号等安全设施,这将不利于系统的安全性。因此,接下来的这步实现为系统添加用户帐号(这里仍然基于宿主机实现)。
 
 
 
  1. 1、为目标主机建立passwd帐号文件  
  2.        # cd /mnt/sysroot  
  3.        # vim etc/passwd  
  4.  
  5.        添加如下内容:  
  6.        root:x:0:0::/root:/bin/sh  
  7.        而后为root用户创建“家”目录:  
  8.        # mkdir root  
  9.  
  10. 2、为目标主机建立group帐号文件  
  11.        # vim etc/group  
  12.  
  13.        添加如下内容:  
  14.        root:x:0:  
  15.  
  16. 3、为目标主机建立shadow影子口令文件,这里采用直接复制宿主机的shadow文件中关于root口令行的行来实现  
  17.        # grep "^root" /etc/shadow > etc/shadow  
 

                     注:等目标主机启动时,root用户的口令也是宿主机的root用户的口令。您可以在目标主机启动以后再动手更改root用户的口令。
 
       4、将 etc/inittab文件改为如下内容:
 
 
  1. ::sysinit:/etc/init.d/rc.sysinit  
  2. ::respawn:/sbin/getty 9600 tty1  
  3. ::respawn:/sbin/getty 9600 tty2  
  4. ::respawn:/sbin/getty 9600 tty3  
  5. ::respawn:/sbin/getty 9600 tty4  
  6. ::respawn:/sbin/getty 9600 tty5  
  7. ::respawn:/sbin/getty 9600 tty6  
  8. ::shutdown:/bin/umount -a -r  
  9. ::ctrlaltdel:/sbin/reboot  
 
              好了,接下来就可以重新启动目标主机进行验正了。
 
创建主机名:
# vim /mnt/sysroot/etc/hostname
# vim /mnt/sysroot/etc/rc.d/rc.sysinit
       在其中加入
 
八、在系统登录时提供banner信息
 
              这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
 

 

 
 
 
  1. # vi /etc/issue  
  2. 添加如下内容:  
  3. Welcome to MageEdu Linux(http://www.magedu.com)...  
  4. Kernel \r  
 
              注:这里的内容可以根据你的需要进行修改。
             
      九、在系统启动时为系统提供主机名称:
 
              这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
 
       1、创建保存主机名称的配置文件
 
 
  1. # mkdir /etc/sysconfig  
  2. # vi /etc/sysconfig/network  
  3. 添加如下内容:  
  4. HOSTNAME=marion.example.com  
 
       2、编辑系统初始化脚本,实现开机过程中设定主机名称
 
 
  1. # vi /etc/init.d/rc.sysinit  
  2. 在文件尾部添加如下行:  
  3.  
  4. HOSTNAME=  
  5. [ -e /etc/sysconfig/network && -r /etc/sysconfig/network ] && source /etc/sysconfig/network  
  6. [ -z ${HOSTNAME} ] && HOSTNAME="localhost" 
  7. /bin/hostname ${HOSTNAME}  
 
十一、通过dropbear为系统提供ssh远程连接服务
 
              注:以下过程在宿主机上实现。
 
       1、编译安装dropbear
 
 
  1. # tar xf dropbear-2013.56.tar.bz2   
  2. # cd dropbear-2013.56  
  3. # ./configure   
  4. # make  
  5. # make install  
 
       2、移植dropbear至目标系统
 
              移植二进制程序及其依赖的库文件,方能实现其在目标系统上正常运行。建议使用脚本进行(这里将其保存为bincp.sh),其会自动移植指定的命令及依赖的库文件。
 
 
  1. #!/bin/bash  
  2. #  
  3. read -t 30 -p "Target System Directory[/mnt/sysroot]: " DEST  
  4. DEST=${DEST:-/mnt/sysroot}  
  5.  
  6. libcp() {  
  7.        LIBPATH=${1%/*}  
  8.        [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH  
  9.        [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."  
  10. }  
  11.  
  12. bincp() {  
  13.        CMDPATH=${1%/*}  
  14.        [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH  
  15.        [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH  
  16.  
  17. for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do  
  18.        libcp $LIB  
  19. done  
  20. }  
  21.  
  22. read -p "Your command: " CMD  
  23. until [ $CMD == 'q' ]; do  
  24.        ! which $CMD && echo "Wrong command" && read -p "Input again:" CMD && continue  
  25.        COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`  
  26. bincp $COMMAND  
  27.        echo "copy $COMMAND finished."  
  28.        read -p "Continue: " CMD  
  29. done  
              接下来运行此脚本,分别输入dropbear、dropbearkey和dbclient即可;这些命令会被存储于目标系统的/usr/local/sbin或/usr/local/bin目录中。
 
       3、为远程登录的用户提供伪终端设备文件
 
 
 
  1. 编辑/mnt/sysroot/etc/fstab,添加如下一行:  
  2. devpts            /dev/pts          devpts     mode=620      0 0  
  3.  
  4. 创建所需要的目录:  
  5. # mkdir /mnt/sysroot/dev/pts  
       4、为目标系统的dropbear生成主机密钥
 
              默认情况下,dropbear到/etc/dropbear目录中查找使用的rsa格式主机密钥(默认名称为dropbear_rsa_host_key)和dss格式的主机密钥(默认名称为dropbear_dss_host_key)。其中,rsa格式可使用不同长度的密钥,但dss格式只使用1024位的密钥。
 
 
 
  1. # mkdir /mnt/sysroot/etc/dropbear  
  2. # dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048  
  3. # dropbearkey -t rsa -f /etc/dropbear/dropbear_dss_host_key  
              在生成rsa格式的key时,其长度指定部分-s 2048可以省略,也可以为其指定为其它长度,但长度需要为8的整数倍。
 
              说明:此步骤也可以在目标主机上进行,但路径要做相应的修改。
 
       5、定义安全shell
 
              安全起见,dropbear默认情况下仅允许其默认shell出现在/etc/shells文件中的用户远程登录,因此,这里还需要创建/etc/shells文件,并添加所有允许的shell。
 
 
 
  1. # cat >> /mnt/sysroot/etc/shells << EOF 
  2. /bin/sh  
  3. /bin/ash  
  4. /bin/hush  
  5. /bin/bash  
  6. EOF  
       6、为目标主机提供网络服务转换机制
 
              在宿主机上使用默认选项编译的dropbear将依赖nsswitch实现用户名称解析,因此,还需要为目标主机提供nss相关的库文件及配置文件。
 
 
 
  1. # cat >> /mnt/sysroot/etc/nsswitch.conf << EOF 
  2. passwd:     files  
  3. shadow:     files  
  4. group:      files  
  5. hosts:      files dns  
  6. EOF  
  7.  
  8. 复制所需要的库文件:  
  9. # cp -d /lib/libnss_files* /mnt/sysroot/lib/  
  10. # cp -d /usr/lib/libnss3.so /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/  
 
 
       7、测试
 
              启动目标主机,设定好网络属性后,使用如下命令启动dropbear服务即可。
              # /usr/local/sbin/dropbear
 
              接下来就可以远程进行连接测试了。









本文转自 陈延宗 51CTO博客,原文链接:http://blog.51cto.com/407711169/1167936,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
Ubuntu 安全 网络安全
百度搜索:蓝易云【Ubuntu系统SSH服务端配置】
现在,你已经成功在Ubuntu系统上配置了SSH服务端。这将允许其他计算机通过SSH协议连接到你的Ubuntu系统,并进行远程管理和操作。请注意,远程访问有安全风险,建议在生产环境中采取必要的安全措施来保护系统。
40 3
|
3月前
|
Ubuntu 网络协议 网络安全
如何在外SSH远程连接Ubuntu系统【无公网IP】
如何在外SSH远程连接Ubuntu系统【无公网IP】
66 0
|
5月前
|
Shell 网络安全 数据安全/隐私保护
debian安装ssh(傻瓜教程)+证书免密登录
debian安装ssh(傻瓜教程)+证书免密登录
363 0
|
2月前
|
存储 安全 Shell
windows 系统 c 盘 .ssh 文件夹里的 known_hosts 文件的作用
windows 系统 c 盘 .ssh 文件夹里的 known_hosts 文件的作用
69 0
|
2月前
|
安全 Shell 网络安全
windows 系统 c 盘 .ssh 文件夹里的 id_rsa 文件的作用
windows 系统 c 盘 .ssh 文件夹里的 id_rsa 文件的作用
40 0
|
2月前
|
安全 算法 网络安全
windows 系统 c 盘 .ssh 文件夹里的 id_rsa.pub 文件的作用
windows 系统 c 盘 .ssh 文件夹里的 id_rsa.pub 文件的作用
40 0
|
7天前
|
存储 网络协议 Linux
如何使用内网穿透工具实现远程SSH访问Deepin系统
如何使用内网穿透工具实现远程SSH访问Deepin系统
|
5月前
|
网络安全
SNETCracker.exe 2022/1/26 31:13:29----检查12.26.20.1:SSH登录发生异常!未能加载文件或程序集“ChilkatDotNet4.dll”或它的某一个依赖项
SNETCracker.exe 2022/1/26 31:13:29----检查12.26.20.1:SSH登录发生异常!未能加载文件或程序集“ChilkatDotNet4.dll”或它的某一个依赖项
146 0
|
5月前
|
网络协议 Linux 网络安全
suse 12 配置ip,dns,网关,hostname,ssh以及关闭防火墙
suse 12 配置ip,dns,网关,hostname,ssh以及关闭防火墙
150 0
|
2月前
|
安全 网络协议 Linux