zoukankan      html  css  js  c++  java
  • linux基础之Mini Linux制作

    一、编译一个简单的linux步骤如下:

    # yum groupinstall ""Development Tools" "Server Platform Development" -y    //安装开发包组
    # tar xf linux-3.10.65.tar.xz  //下载内核这里就不介绍了
    # cd /usr/src
    # ln -sv linux-3.10.15 linux  
    # cd linux
    
    # make help
    # make allnoconfig
    # make menuconfig
    这里简单介绍下这次编译到的选项:
    内核核心模块相关的:
    [*]64-bit kernel  //内核编译成64位的
    [*]enable loadable module support --> [*]Module uploading   //允许装卸载模块,这里都是编译进内核的,不借助ramdisk装载模块,先选中吧
       Processor type and features  --->  [*]Symmetric multi-processing support   //支持多处理器,linux上多处理器和多核心是一个意思
                                          Processor family (Generic-x86-64)  ---> (X) Generic-x86-64  //选通用的就可以     
       Bus options (PCI etc.)  --->  [*] PCI support    //PCI相关的
       Device Drivers  --->   SCSI device support  ----> [*]SCSI device support  //SCSI设备的支持
                                                         [*]SCSI disk support  //SCSI硬盘支持
                              [*] Fusion MPT device support  --->  [*] Fusion MPT ScsiHost drivers for SPI  //lspci命令可以查看到本机pci的信息    
                                                                   (*) Fusion MPT misc device (ioctl) drivers 
    文件系统相关的:
    File systems  ---> <*> Second extended fs support    
                       <*> Ext3 journalling file system support                                     
                                 [*]   Default to 'data=ordered' in ext3 (NEW)                               
                                 [*]   Ext3 extended attributes (NEW)  
                                 <*> The Extended 4 (ext4) filesystem         
    
    Executable file formats / Emulations  ---> [*] Kernel support for ELF binaries
                                               [*] Write ELF core dumps with partial segments (NEW)
                                               <*> Kernel support for scripts starting with #!

    键盘鼠标usb相关的

    Device Drivers  ---> Input device support  --->  [*]Keyboards  ---> 
                                                     [*]   Mice  ---> 
                                                     <*>   Mouse interface  
                         [*] USB support  ---> <*>   Support for Host-side USB 
                                                     <*>     xHCI HCD (USB 3.0) support
                                                     <*>     EHCI HCD (USB 2.0) support    
                                                     <*>     OHCI HCD support 
                                                     <*>     UHCI HCD (most Intel and VIA) Support

    udev相关的:

    Device Drivers --> Generic Driver Options --> Mintain a devtmpfs filesystem to mount at /dev  //识别到的设备都挂载到/dev目录
                               [*]   Automount devtmpfs at /dev, after the kernel mounted the rootfs  
    # make -j 4 bzImage //只编译内核文件
    # fdisk /dev/sdb  //在现有系统上添加一块盘,分两个区,一个用来做boot,一个用来做根目录
    
    # mke2fs -t ext4 /dev/sdb1
    # mke2fs -t ext4 /dev/sdb2
    # mkdir /mnt/{boot,sysroot}
    # mkdir -pv etc dev proc sys bin usr/{lib,bin,sbin,lin64} lib64 lib/modules home var/{log,run,lock} tmp mnt media root    # mount /dev/sdb1 /mnt/boot/ # mount /dev/sdb2 /mnt/sysroot
    # grub-install --root-directory=/mnt /dev/sdb    
    # cd /usr/src/linux
    # cp arch/x86/boot/bzImage /mnt/boot/bzImage
    # file /mnt/boot/bzImage
    # vim /mnt/boot/grub/grub.conf
        default=0
        timeout=5
        title Mini Linux (3.10.67)
        root (hd0,0)
        kernel /bzImage ro root=/dev/sda2 init=/bin/bash
    写一个脚本bincp复制命令及依赖库到sysroot下
        #!/bin/bash
        #
        target=/mnt/sysroot
        [ -d $target ] || mkdir /mnt/sysroot
    
        read -p "A command:" command
    
        libcp(){
          for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
            libdir=$(dirname $lib)
            [ -d $target$libdir ] || mkdir -p $target$libdir
            [ -f $target$lib ] || cp $lib $target$lib
          done
        }
    
        while [ "$command" != 'q' -a "$command" != 'quit' ]; do
          if !which $command &> /dev/null;then
            read -p "No such command,enter again:" command
            continue
          fi
          command=$(which --skip-alias $command)
          cmnddir=$(dirname $command)

           [ -d $target$cmnddir ] || mkdir -p $target$cmnddir
           [ -f $target$command ] || cp $command $target$command
            libcp $command
            read -p "Another command(quit):" command
          done

     

    新建虚拟机Mini Linux使用上面的sdb硬盘
    重启Mini Linux,可以在bash命令行进行一些命令的操作,比如cd,ls,mount等

    也可以新建init程序让系统开机运行

    新建脚本init: /mnt/sysroot/sbin/init
                    #!/bin/bash
                    #
                    echo -e "	welcome to 33[32mMini33[0m linux"
                    mount -n -t proc proc /proc
                    mount -n -t sysfs /sys
                    mount -n -o remount,rw /dev/sda2 /
                    /bin/bash
            # chmod +x /mnt/sysroot/sbin/init

    二、结合busybox+dropbear制作linux

    静态编译busybox:

    下载busybox:https://busybox.net/downloads/ 

    # wget https://busybox.net/downloads/
    # tar xf busybox-1.22.1.tar.bz2 # cd busybox-1.22.1 # yum install glibc-static //静态编译busybox依赖到的库
    # make menuconfig  //配置下面两项,其他默认就可以了
        Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)   
        Installation Options ("make install" behavior) ---> What kind of applet links to install (as soft-links) ---> (X) as soft-links //安装完成后文件链接类型
                                        (./_install) BusyBox installation prefix (NEW) //安装完成在什么位置,默认当前编译路径下,默认就好
    # make && make install  //安装busybox
    # cd /mnt/sysroot
    # rm -rf ./*    //删掉之前在sysroot中创建的目录,busybox会自动创建
    # cd busybox-1.22.1  
    # tree _install  //可以看一下busybox安装后生成了哪些文件
    # cp -a _install/* /mnt/sysroot/  //复制_install中所有文件到sysroot中
    # cd /mnt/sysroot
    # rm linuxrc  //删掉busybox模拟的init程序,"ls /sbin | grep init"中的init就够用了 
    修改grub配置文件:
    default=0
    timeout=3
    title Mini Linux (3.10.67)
            root (hd0,0)
            kernel /bzImage ro root=/dev/sda2 init=/sbin/init  //修改init就好
    # mkdir -pv etc lib lib64 proc sys dev root home boot mnt media tmp var  //在sysroot下创建其他缺少的目录

      busybox默认模拟的是CentOS5的init程序,它会去读取inittab文件,所以我们创建一个/sysroot/etc/inittab,内容如下:

    # vim /sysroot/etc/inittab
      ::sysinit:/etc/rc.d/rc.sysinit  //完成系统初始化 tty1::askfirst:/bin/sh        //启动几个终端
    tty2::askfirst:/bin/sh
    tty3::askfirst:/bin/sh
    tty4::askfirst:/bin/sh   ::ctrlaltdel:/sbin/reboot  //ctrl+alt+del组合键就重启   ::shutdown:/bin/umount -a -r  //关机前卸载所有文件系统

    接下来创建初始化脚本:/sysroot/etc/rc.d/rc.sysinit

      #!/bin/sh
      #
      echo -e " Welcome to 33[32mMini33[0m Linux"
      mount -t proc porc /proc    //如果不能挂载,换成绝对路径
      mount -t sysfs sysfs /sys  

      echo "scan /sys and to populatte to /dev..."
      mdev -s            //系统启动时自动输出所有文件到/dev目录下

      mount -o remount,rw /dev/sda2 /

      echo "mouting all filesystems.."
      mount -a          //挂载剩余的所有文件系统

    # chmod +x etc/rc.d/rc.sysinit 

     将网络相关功能编译进内核:

    # cd /usr/src/linux
    # make menuconfig

      -*- Networking support ---> Networking options ---> [*] TCP/IP networking
                                      [*] IP: multicasting
                                      [*] IP: advanced router
                                      [*] IP: kernel level autoconfiguration
      Device Drivers --->[*] Network device support ---> [*] Ethernet driver support (NEW) --->[*] Intel devices (NEW)
                                                             <*> Intel(R) PRO/1000 Gigabit Ethernet support

    # make  bzImage
    # cp arch/x86/boot/bzImage /mnt/boot

    重启Mini Linux测试网络功能

    # ifconfig -a    //查看网卡
    # ifconfig eth0 192.168.2.20 up
    # ifconfig lo 127.0.0.1 up
    # ping 192.168.2.1  

     假设把上面的网络功能编译为模块

    Device Drivers --->[*] Network device support ---> [*] Ethernet driver support (NEW) --->  <M> Intel(R) PRO/1000 Gigabit Ethernet support 
    # cp arch/x86/boot/bzImage /mnt/boot
    # sync  

     编译网卡e1000,将.ko文件复制到/mnt/sysroot/lib/modules下

    # cd /usr/src/linux
    # make M=drivers/net/ethernet/intel/e1000
    # mkdir /mnt/sysroot/lib/modules -pv
    # cp drivers/net/ethernet/intel/e1000/e1000.ko /mnt/sysroot/lib/modules/

    重启Mini Linux,装载进e1000网卡模块

    # insmod /lib/modules/e1000.ko

    设置系统初始化的时候加载网卡模块,并初始化

    # vim /etc/rc.d/rc.sysinit
        echo "Load driver for e1000..."     insmod /lib/modules/e1000.ko     echo "Initializing ethernet card..."     ifconfig eth0 192.168.2.20 up     ifconfig lo 127.0.0.1 up     [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network     [ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME='lcoalhost'      hostname $HOSTNAME 

    设置主机名

    # mkdir etc/sysconfig
    # vim etc/sysconfig/network
        HOSTNAME=mini.alen.com

    给Mini Linux添加账号和密码

    # vim etc/passwd
      root:x:0:0::/root:/bin/bash
    # vim etc/group
      root:x:0:
    # vim etc/shadow
    或者直接追加宿主机上的:# head -1 /etc/shadow > etc/shadow
    # chmod 400 etc/shadow

    sha密码可能不支持,换成md5的吧

    # openssl passwd -1 -salt $(openssl rand -hex 4)

    添加模拟终端:

    修改etc/initab文件:

    # vim etc/insttab

        ::sysinit:/etc/rc.d/rc.sysinit
        ::respawn:/sbin/getty 9600 tty1  //修改这几个模拟终端,getty开机时会自动调用login程序
        ::respawn:/sbin/getty 9600 tty2  //
        ::respawn:/sbin/getty 9600 tty3  //
        ::ctrlaltdel:/sbin/reboot
        ::shutdown:/bin/umount -a -r

    添加issue文件,修改终端显示信息

    # vim etc/issue
         Welcome to alen Linux
         Kernel 
            

    添加ssh服务 

    下载dropbear源码:https://matt.ucc.asn.au/dropbear/releases/dropbear-2019.78.tar.bz2

    默认编译安装就可以了

    复制dropbear命令到sysroot下

    # bash bincp.sh 
            dropbear,dropbearkey,dbclient  //添加这几个就可以了

    添加存放远程终端文件的目录dev/pts

    # mkdir dev/pts
    # vim etc/fstab
    devpts /dev/pts    devpts  mode=620  0 0   //挂载pts

     为dropbear生成密钥文件

    # mkdir etc/dropbear
    # cd etc/dropbear
    # dropbearkey -t rsa -s 2048 -f dropbear_rsa_host_key
    # dropbearkey -t dss -f dropbear_dss_host_key

    添加安全shell

    # vim etc/shells
        比如: /bin/sh /bin/ash /bin/hush /bin/bash /sbin/nologin

    添加nsswitch服务:网络服务转换

    # vim etc/nsswitch.conf
          passwd: files
          group: files
          shadow: files
          hosts: files dns

    复制nsswitch的库文件到sysroot下

    # mkdir usr/lib64
    # cp -d /lib64/libnss_files* lib64/  
    # cp -d /usr/lib64/libnss3.so usr/lib64/
    # cp -d /usr/lib64/libnssutil3.so usr/lib64/
    # cp -d /usr/lib64/libnss_files* usr/lib64/

    重启Mini Linux,测试

    # vim .bash_profile
    设置PS1环境变量   export PS1='[u@h w]$'
      export PATH=$PATH:/usr/local/bin:/usr/local/sbin  
    添加dropbear的pid存放路径
    # mkdir /var/run
    # dropbear -F -E  //让dropbear工作于前台
    # mkdir /dev/pts
    # mount -t devpts devpts /dev/pts

    # vi /etc/profile
    [ $UID -eq 0 ] && export PATH=/bin:/sbin:/usr/bin:/usr/sbin

    至此,一个迷你型的linux就编译好了

     

     

     

     

     

     

  • 相关阅读:
    AE数据加载
    30.概述strust2中的拦截器
    mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
    29.OGNL与ValueStack(VS)-总结OGNL[重点]
    28.OGNL与ValueStack(VS)-总结$ # %的区别
    27.OGNL与ValueStack(VS)-获取Stack Context中的信息
    26.OGNL与ValueStack(VS)-N语法top语法
    25.OGNL与ValueStack(VS)-集合对象进阶
    24.OGNL与ValueStack(VS)-集合对象初步
    23.OGNL与ValueStack(VS)-调用普通类的构造方法
  • 原文地址:https://www.cnblogs.com/ckh2014/p/10823127.html
Copyright © 2011-2022 走看看