设为首页 收藏本站
查看: 799|回复: 0

[经验分享] busybox diy mini linux

[复制链接]

尚未签到

发表于 2018-5-19 14:06:30 | 显示全部楼层 |阅读模式
  系统: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文件:
  

  [root@localhost 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
  [root@localhost sysroot]# cat  > etc/inittab <<EOF
  > ::sysinit:/etc/rc.d/rc.sysinit
  > console::respawn:-/bin/sh
  > ::ctrlaltdel:/sbin/reboot
  > ::shutdown:/bin/umount -a -r
  > EOF
  

  [root@localhost 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  和内核
  [root@localhost 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 创建登陆用户
  

  [root@localhost sysroot]# vi  etc/passwd
  内容为: root:x:0:0:root:/root:/bin/sh   (这里要修改shell,因为busybox没有bash,或者给sh创建个软连接为bash)
  

  [root@localhost sysroot]# vi  etc/shadow
  内容为: root:$1$gm6zfnou$Zpndu0pK3qCsiTHAM8kJP.:16909:0:99999:7::: (这里可以根据自己需要手动生成)
  

  [root@localhost 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/

  
  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-462060-1-1.html 上篇帖子: linux QT 配置 下篇帖子: linux ifconfig命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表