zoukankan      html  css  js  c++  java
  • Mini Linux 制作

    Mini linux 制作过程
         Linux启动流程:
            Centos6:POST(加电自检)→BootSequence(BIOS)→ BootLoader(引导加载器)→ Kernel(ramdisk)→/sbin/init
            Centos7:POST(加电自检)→BootSequence(BIOS)→ BootLoader(引导加载器)→ Kernel(ramdisk)→/sbin/systemd
                POST:开机检查硬件信息;
                BootSequence:根据BIOS中设置的启动顺序,自上而下寻找拥有启动程序的设备(以硬盘为例,就是去寻找具有MBR的设备,并且其中装载了具有BootLoader的硬盘设备);
                BootLoader: 用于装载指定设备上的内核和ramdisk;
                    lilo:最古老的引导器,下载广泛用于安卓手机中;
                    grub legacy:用于centos6中;
                    grub2:用于centos7中;
                        grub将引导加载的过程分成了两个阶段(也可以看成是2.5个阶段):
                            stage1:在MBR中实现;
                            stage1.5:提供对分区上的文件系统的支持;
                            stage2:grub主程序;
                Kernel:加载内核,内核会进行初始化,重新探测各种硬件信息,然后以只读方式挂载文件系统,接着执行根文件系统中的第一个应用程序(init);但是kernel未必能直接识别根文件系统所在的磁盘设备,如果不能识别就需要借助ramdisk,才可以加载根文件系统,如果能识别那么ramdisk就是可有可无的;
                    ramdisk:(有点类似于win pe)是一个小的linux,提供一个虚根,借助它来装载磁盘设备的驱动程序,进而去加载真正的根文件系统,然后从虚根切换到真正的根;它是只读的;
                /sbin/init:可以看成是一个脚本文件,借助bash解释器完成向内核提交个进程启动请求;
                    对于Centos5来说是读取/etc/inittab这个文件;
                    对于Centos6来说是读取/etc/init/*.conf这些文件;
                        它俩实现的功能是类似的:
                            1.设置默认运行级别;
                            2.运行系统初始化脚本:/etc/rc.d/rc.sysinit;
                                /etc/rc.d/rc $runlevel
                            3.启动终端,并运行login
                            4.如果是level5的话,就会启动图形终端
                /sbin/systemd:不需要借助任何bash脚本,是一套完整的自成体系的服务启动程序;
            Centos6通过编写服务脚本和编辑upstart配置文件来实现服务的管理;
            Centos7也可以通过编写服务脚本来管理服务,但是它已经不再使用upstart了,而是使用全新的systemd来管理服务,因为systemd使用更方便,功能更强大;
        内核编译:
            make menuconfig → 生成.config文件
            make [-j #] → 指明编译时启动的线程数
            make modules_install → 安装模块
            make install 
        
        mini linux制作步骤:
            0.bootloader:grub
            1.手动编译一个内核(以非模块化编译,也就是将所有需要的功能都编译进内核,所以ramdisk就用不到了);
            2.提供一个根文件系统:busybox,它可以模拟用户空间当中所需要的各种常见应用程序;
            操作步骤:(下面的操作会有反复的重启和各种错误以及修补这些错误,所以可能会造成极度的不适,请做好心里准备;)
                1.首先安装开发工具;
                    yum groupinstall "Development Tools" "Server Platform Development" -y
                2.在内核官网下载内核源码,将其解压到/usr/src/中,并且创建软连接linux连接到刚才解压的目录上;
                    tar xf linux-3.18.98.tar.xz  -C /usr/src/
                    ln -sv linux-3.18.98/ linux
                    make help                                 获取帮助信息
                3.因为我们要编译一个非常精简的内核所以要将内核中默认提供的所有可选择的选项都关掉;
                    make allnoconfig
                    我使用的内核版本在执行完这个操作进入编译界面以后,发现在选择关于scsi的信息的时候,里面没有选项,我也没有找到可以将它的选项显示出来的关联选项;所以我使用的是默认的配置,然后一条一条的将没有用的选项手动去掉的,一般为模块(M)的都可以去掉;你可能会发现我下面写的步骤中,有的你已经支持了并且可以运行,但是我希望你能做完,这会对你有很大的帮助;
                4.编译内核前需要检查硬件信息:比如硬盘接口信息,CPU型号等信息
                    lscpu                                          查看cpu类型
                    lspci                                           查看各种接口类型
                     SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
                5.根据输出的信息编译内核;
                    make menuconfig
                        [*] 64-bit kernel             因为本机是64位的,一会还要将本机的一些命令复制到mini linux中所以我们也要将内核编译为64位,为了兼容;
                        [*] Enable loadable module support  --->     支持加载模块
                            [*]   Module unloading     支持动态卸载模块
                            [  ]   Module signature verification   这一项是实现对模块进行签名验证,是为了提高安全性,可以想像我们装载一个来路不明的模块,如果这个模块是被人动了手脚的,那么导致的结果就是连最基础的内核都被人黑了,还有什么安全可言,可能唯有重装系统才可以解决了吧,但是我们完全是自己做个小linux玩,所以就不启动了;
                            Processor type and features  ---> 
                                [*] Symmetric multi-processing support  配置cpu支持多核心;
                                [*] Multi-core scheduler support 
                                [*] Sparse Memory virtual memmap
                                Processor family (Generic-x86-64)  --→ 选择与平台相兼容的cpu接口类型;根据实际情况选择即可;
                                    (X) Generic-x86-64        实在不知道就选择这个通用的;
                            Bus options (PCI etc.)  --->   pci总线功能;
                                [*] PCI support    启动pci总线功能;
                            Device Drivers  --->    硬件驱动;
                                SCSI device support  --->   SCSI设备支持选项;SCSI即是一种存储协议,也是一种存储接口类型,还是一种存储总线,而这种存储协议只能工作在这种存储接口和这种存储总线上;
                                    <*> SCSI disk support    支持SCSI硬盘    
                                [*] Fusion MPT device support  --→   支持相应的硬盘接口驱动程序;
                                    <*>   Fusion MPT ScsiHost drivers for SPI   SCSI接口
                                    <*>   Fusion MPT ScsiHost drivers for SAS  SAS接口 
                                    <*>   Fusion MPT misc device (ioctl) drive    MPT设备驱动
                                    [*]   Fusion MPT logging facility                    日志
                        选择我们要编译进内核的功能:包括对底层硬件的支持,识别各种硬盘接口什么的;
                6.添加一个存放这个内核文件的硬盘,并且安装grub;
                    关闭虚拟机,添加一块磁盘,大小5G,类型为scsi,然后存放到一个你可以找到的位置即可;(我使用的是vmware)
                7.开机,将刚才添加的磁盘分区;一般在linux中至少要有三个分区(/,swap,boot(其实boot可以不分区,与根在一起也行));
                    gdisk /dev/sdc
                        Number  Start (sector)    End (sector)  Size       Code  Name
                           1            2048          206847   100.0 MiB   8300  Linux filesystem
                           2          206848         4401151   2.0 GiB     8300  Linux filesystem
                    mkfs.ext4 /dev/sdc1
                    mkfs.ext4 /dev/sdc2
                    mkfs.ext4 /dev/sdc1
                    mount /dev/sdc1 /mnt/boot/
                    mount /dev/sdc2 /mnt/sysroot/
                    grub-install --root-directory=/mnt /dev/sdc
                    cp /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/
                    chmod +x /mnt/boot/bzImage 
                    file boot/bzImage 
                        boot/bzImage: Linux kernel x86 boot executable bzImage, version 3.18.98 (root@Centos6) #1 SMP S, RO-rootFS, swap_dev 0x3, Normal VGA
                    vim  boot/grub/grub.conf
                        default=0
                        timeout=3
                        title Mini Linux(3.18.98)
                              root (hd0,0)
                            kernel /bzImage ro root=/dev/sda2
                8.将此虚拟机挂起,然后添加一个新的虚拟机,类型为centos6,内存大小为256M,使用现有的虚拟机(就是我们直线创建的那个磁盘的存储位置);
                9.然后开机,然后恭喜你成功捕获一个kernel panic;


                    内核恐慌的原因是:无法挂载根文件系统,这是因为我们在编译内核的时候并没有 进行支持某种文件系统的编译;所以你懂的!
                10.关闭新添加的虚拟机,开启原虚拟机;添加我们会使用到的文件系统,然后再次编译内核;
                    make menuconfig
                        File systems  --->      关于文件系统的选项;
                            <*> Second extended fs support    支持ext2文件系统
                            <*> Ext3 journalling file system support    支持ext3文件系统                                     
                            [*]   Default to 'data=ordered' in ext3                                    
                            [*]   Ext3 extended attributes      
                            <*> The Extended 4 (ext4) filesystem         支持ext4文件系统                                                    
                             [*]   Ext4 POSIX Access Control Lists        持文件的访问控制列表                                                 
                            [*]   Ext4 Security Labels    
                             <*> XFS filesystem support                         支持xfs文件系统                                                
                            [*]   XFS Quota support                                                                          
                            [*]   XFS POSIX ACL support  
                        Executable file formats / Emulations  --->      二进制应用程序的各种格式选项;
                            [*] Kernel support for ELF binaries     支持ELF格式的二进制可执行程序;                                                  
                            [*] Write ELF core dumps with partial segments                                                   
                            <*> Kernel support for scripts starting with #! 支持以#!开头的shell脚本文件;
                    make -j 2 bzImage
                    cp /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/
                    chmod +x /mnt/boot/bzImage
                    sync
                    sync
                11.挂起此虚拟机,开启新添加的那个虚拟机;然后还要恭喜你,又获得一个kernel painc;


                    这一次内核恐慌的原因是:没有发现init程序;因为我们的根中什么都没有嘛;
                     if (!try_to_run_init_process("/sbin/init") ||
                        !try_to_run_init_process("/etc/init")  ||
                        !try_to_run_init_process("/bin/init")  ||
                        !try_to_run_init_process("/bin/sh"))
                    这段代码是内核中的一段源码(内核源码目录中init/main.c),它的作用是指明系统启动后如何加载init程序,执行过程是当内核挂载根文件系统后,首先会寻找/sbin/init,如果没有就依次向下寻找;如果都没有就报错;或者使用init手动指定一个;比如init=/bin/bash;
                12.常规关闭这个新建的虚拟机,开启原虚拟机;给minilinux创建根中的目录;
                    mkdir -pv etc dev home proc sys usr lib lib64 usr/lib usr/local usr/lib64 usr/bin usr/sbin bin sbin lib/modules var/{log,run,lock} tmp mnt media root 
                13.复制当前系统的bash程序;
                    linux中的程序复制,可不是直接将二进制文件复制过去就可以运行,每个程序运行都是要依赖各种各样的库的,所以我们要将库一并复制过去,使用ldd命令就可以查看程序所依赖的库,但是程序依赖的库实在是太多了,所以我们来写个脚本吧;
                    vim lddcp.sh            
                        #!/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" != '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
                    chmod +x lddcp.sh
                    运行脚本文件,将bash,ls,touch,ps,top,mount,df,du,lsblk,blkid等命令添加进去;有的命令你可能发现运行不了,可以通过绝对路径来执行;
                14.编辑/mnt/boot/grub/grub.conf
                    在kernel所在行的末尾添加init=/bin/bash
                    sync
                    sync
                15.挂起虚拟机,开启新添加的虚拟机,然后你还是一脸懵逼,因为你还是无法输入啊,按键盘根本没有反应,是不是没成功,实则不然,没有反应是因为我们编译内核的时候没有将输入输出设备的驱动编译进内核,所以你懂的!;
                16.添加我们会用到的输入输出设备的驱动,然后重新编译内核;
                    lsusb
                        Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
                        Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
                        Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
                        Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
                    make menuconfig
                        Device Drivers  --->   
                            Input device support  --->    输入设备支持
                                [*]   Keyboards  --->     键盘
                                    <*>   AT keyboard  AT键盘
                                [*] USB support  --->    支持usb,因为vmware虚拟的就是usb类型;
                                    <*>   Support for Host-side USB   
                                    <*>     EHCI HCD (USB 2.0) support 
                                    <*>     xHCI HCD (USB 3.0) support
                                    <*>     OHCI HCD (USB 1.1) support  
                                        <*>       OHCI support for PCI-bus USB controllers 
                                    <*>     UHCI HCD (most Intel and VIA) support    
                                <*>   Mouse interface     启动鼠标接口
                                [*]   Mice  --->                鼠标选项
                    make -j 2 bzImage
                    cp /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/
                    chmod +x /mnt/boot/bzImage
                17.挂起虚拟机,开启新添加的虚拟机;
                    接下来就可以使用shell了!
                18.基本上差不多了,这时候我们大可歇一会了!
                    玩一玩mini linux的shell,其实也没什么好玩的,假装一下吧!
                19.好了,差不多休息了三秒钟,我们继续!
                20.添加一个 开机后立即执行的脚本(/sbin/init)
                21.关闭新添加的虚拟机,开启原虚拟机,编写init;
                    vim /mnt/sysroot/sbin/init
                        #!/bin/bash
                        #
                        #
                        #
                        echo -e " Welcome to 33[32mlinuxs33[0m world!"
                        mount -n -t proc proc /proc
                        mount -n -t sysfs sysfs /sys
                        mount -n -o remount,rw /dev/sda2 /
                        /bin/bash
                    chmod +x /mnt/sysroot/sbin/init
                    sync
                    sync
                22.挂起虚拟机,开启新添加的虚拟机;
                    可以正常获取shell,但是查看/dev时会发现其中没有任何设备文件,根还是只读的;
                    原因是我们编译内核的时候并没有将内核可以自动识别设备并产生设备文件的功能编译进内核,所以…;
                23.关闭新添加的虚拟机,开启原虚拟机;
                    make menuconfig
                        Generic Driver Options  --->   通用设备选项
                            [*] Maintain a devtmpfs filesystem to mount at /dev   将内核识别的所有设备文件导出至/dev中;内核识别不了的只能靠我们以后加载udev模块来添加了;
                            [*]   Automount devtmpfs at /dev, after the kernel mounted the rootfs  自动将devtmpfs挂载至/dev中;
                    make -j 2 bzImage
                    cp /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/
                    chmod +x /mnt/boot/bzImage
                24.挂起虚拟机,开启新添加的虚拟机;
                    你会发现dev中已经产生了各种设备文件,所以我们到此还没有完成,哈哈哈!!!
                    我们编写的/sbin/init其实没有执行,虽然内核会在启动之后自动寻找这个文件,并执行它,但是因为我们编译的内核,自带的环境变量PATH中没有/sbin这个目录所以不会执行init,所以它会向下继续寻找要执行的文件,就会找到/bin/bash,所以会直接给我们提供shell;因为init没有执行,所以我们在init中挂载的文件系统并没有挂载成功,所以只能手动挂载了,抱歉!
                    第二天发现,init之所以没有执行是因为/mnt/boot/grub/grub.conf中我们init指向的是/bin/bash,将他改成/sbin/init即可;跟环境变量没有关系,但是上面我也不删了,留着当个错误提示吧!


        看见绿色的linux了吗?说明已经成功了!
        
        BusyBox:
            这次我们使用busybos来实现linux中的大多数命令(ls,touch,mount等),所以我们就不需要/mnt/sysroot/中的任何文件了,你可以选择将其中的内容全部删除然后继续使用那个分区,或者再创建一个分区,将这个分区作为未来的根目录;
            busybox就像有七十二变一样,只要你将某个命令创建成软链接,然后指向busybos,busybox就可以变成那个命令,实现那个命令所能做的操作;并且创建链接这一步是不需要我们手动创建的,在编译busybos的时候就可以自动生成;
            1.在busybox官网下载软件包,然后解压;
                tar xf busybox-1.22.1.tar.bz2 
            2.编译安装busybos;
                为了方便起见,我们会把busybox以静态编译的方式进行编译;因为如果以共享库的方式进行编译的话,我们就需要移植各种库到minilinux上,太麻烦了!而静态编译可以将其所依赖的各种库文件都编译到程序内部来,我们到时候直接将编译后的文件复制到minilinux中就可以了;
                因为静态编译busybox时会用到一个被依赖的glibc库,所以我们先安装它;
                yum install glibc-static -y
                cd  cd busybox-1.22.1/
                make menuconfig
                    Busybox Settings  --->      
                        General Configuration  --->     
                        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)  ---> 选择各种命令的连接方式:硬连接,软连接等;
                            (./_install) BusyBox installation prefix (NEW)    选择安装的路径;
                    --- Applets        指定使用busybox模拟哪些应用程序;
                    Archival Utilities  --->       归档工具;
                    Coreutils  --->                     核心工具;
                    等等…………
                make ; make install
                cp -a _install/* /mnt/ssroot/
                chroot /mnt/ssroot/ /bin/sh           切换到根目录看看
                    exit
                cd /mnt/ssroot
                rm -f linuxrc
            3.创建根中的目录,并添加相关的配置文件;
                mkdir -pv home root proc sys etc var lib lib64  dev mnt media boot tmp 
                busybox是依赖于/etc/inittab的,模拟了类似Centos5的机制;所以我们要提供这个inittab文件;
                vim /mnt/ssroot/etc/inittab
                    ::sysinit:/etc/rc.d/rc.sysinit
                    console::respawn:-/bin/sh
                    ::ctrlaltdel:/sbin/reboot
                    ::shutdown:/bin/umount -a -r
                    内容解释:
                        id(用来唯一标识此行):运行级别:指令:所执行的文件或程序
                        sysinit:表示后面的文件是一个系统初始化脚本;
                        console:控制台;
                        respawn:循环显示,就是我们平时登出的时候,它还会给我们一个提示登陆的提示符一样;
                        ctrlaltdel:就是ctrl+del的快捷键;
                        shutdown:关机
                vim /mnt/ssroot/etc/rc.d/rc.sysinit
                    #!/bin/sh
                    #
                    #
                    #
                    echo -e ' Welcome to 33[32mMini 33[0m Linux'
                    mount -n -t proc proc /proc
                    mount -n -t sysfs sysfs /sys
                    mount -o remount,rw /dev/sda3 /
                    busybos支持udev功能,但是不叫udev,而是叫mdev,所以我们不需要挂载devtmpfs;
                chmod +x etc/rc.d/rc.sysinit 
            4.挂起此虚拟机,开启新添加的虚拟机;


            图中已经看见绿色的Mini了,说明我们已经成功了;
            5.关闭新添加的虚拟机,开启原虚拟机;添加一个fstab文件,实现开机自动挂载;
                在/mnt/ssroot/etc/rc.d/rc.sysinit添加几项:
                vim etc/rc.d/rc.sysinit 
                    #!/bin/sh
                    #
                    #
                    #
                    echo -e ' Welcome to 33[32mMini 33[0m Linux'
                    mount  -n -t proc proc /proc
                    mount  -n -t sysfs sysfs /sys

                    echo "scan /sys and to populate to /dev..."
                    mdev -s

                    mount  -o remount,rw /dev/sda3 /

                    echo "mounting all filesystems..."
                    mount -a
                vim /mnt/ssroot/etc/fstab
                    sysfs              /sys     sysfs    defaults        0 0
                    proc               /proc   proc     defaults        0 0
                    /dev/sda1       /boot   ext4     defaults        0 0
                    /dev/sda3       /          ext4     defaults        0 0
                添加三个虚拟终端,不使用前一步的控制台了,让他更像我们使用的centos系统;
                    vim /mnt/ssroot/etc/inittab
                        ::sysinit:/etc/rc.d/rc.sysinit
                        tty1::askfirst:/bin/sh
                        tty2::askfirst:/bin/sh
                        tty3::askfirst:/bin/sh
                        ::ctrlaltdel:/sbin/reboot
                        ::shutdown:/bin/umount -a -r
                可以启动mini linux玩玩;
            6.编译进内核方式:添加网卡驱动(先编译进内核,然后再以模块方式编译一下);
                首先回到原虚拟机;
                lspci           查看网卡类型;
                    02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
                    02:02.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
                    02:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (re
                modinfo e1000      查看原虚拟主机网卡模块;得知网卡模块位置,然后去内核中编译;
                    filename:   /lib/modules/2.6.32-754.9.1.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
                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 -j 2 bzImage
                cp arch/x86/boot/bzImage /mnt/boot/
                sync
                sync
            7.挂起虚拟机,开启新添加的虚拟机;
                ifconfig eth0 up
                ifconfig lo up
                ifconfig eth0 192.168.0.7
                ping 同段主机地址
            8.以模块方式:添加网卡驱动;
                make menuconfig
                Device Drivers  --->  
                        [*] Network device support  --->    
                            [*]   Ethernet driver support (NEW)  --->   
                                [*]   Intel devices (NEW)
                                <M>     Intel(R) PRO/1000 Gigabit Ethernet support  
                make bzImage            将之前的网卡驱动去掉
                cp arch/x86/boot/bzImage /mnt/boot/
                我们编辑单个模块的时候可以指定模块目录进行编译:
                make M=drivers/net/ethernet/intel/e1000       → 网卡驱动所在的目录
                mkdir /mnt/ssroot/lib/modules
                cp drivers/net/ethernet/intel/e1000/e1000.ko /mnt/ssroot/lib/modules/
            9.挂起虚拟机,开启新添加的虚拟机;
                insmod /lib/modules/e1000.ko
                ifconfig eth0 up
                ifconfig lo up
                ifconfig eth0 192.168.0.7
                ping 同段主机地址
            10.关闭新添加的虚拟机,开启原虚拟机;
                添加一些配置:
                vim /mnt/ssroot/etc/rc.d/rc.sysinit
                    #!/bin/sh
                    #
                    #
                    #
                    echo -e ' Welcome to 33[32mMini 33[0m Linux'
                    mount  -n -t proc proc /proc
                    mount  -n -t sysfs sysfs /sys
                    echo "scan /sys and to populate to /dev..."
                    mdev -s
                    mount -t ext4  -o remount,rw /dev/sda3 /
                    echo "mounting all filesystems..."
                    mount -a
                    echo "Load driver for e1000..."
                    insmod /lib/modules/e1000.ko             自动添加网卡驱动模块

                    ifconfig eth0 192.168.0.66 up                配置ip地址
                    ifconfig lo 127.0.0.1 up

                    [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network   配置主机名
                    [ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME='localhost'
                    hostname $HOSTNAME
                mkdir /mnt/ssroot/etc/sysconfig/
                vim /mnt/ssroot/etc/sysconfig/network
                    HOSTNAME=minilinux
                添加帐号认证功能
                vim /mnt/ssroot/etc/passwd
                    root:x:0:0::/root:/bin/bash
                vim /mnt/ssroot/etc/group
                    root:x:0:
                head -1 /etc/shadow > /mnt/ssroot/etc/shadow
                cat /mnt/ssroot/etc/shadow 
    root:$6$K2A1yHTr8On86bPU$Xj0HAYZIkUmvcYGl/n96QCjF4Sma3Rw02nqOYPUGgtJ3sUb1kOPROw3fzK8TMgJvpQtRHT..3q.EEbo9OMiAe1:17872:0:99999:7:::
                chmod 400 etc/shadow
                添加终端程序,使其打印登陆提示符:
                vim /mnt/ssroot/etc/inittab 
                    ::sysinit:/etc/rc.d/rc.sysinit
                    ::respawn:/sbin/getty 9600 tty1
                    ::respawn:/sbin/getty 9600 tty2
                    ::respawn:/sbin/getty 9600 tty3
                    ::ctrlaltdel:/sbin/reboot
                    ::shutdown:/bin/umount -a -r
                    getty会自动调用login程序,打印登陆提示符,进行用户的认证;
                因为虚拟主机中/etc/shadow密码是使用sha1 521加密的,为了避免我们组建的mini lnux无法识别sha1 521加密后的字串,所以我们还是将它换成简单易识别的;
                openssl passwd -1 -salt $(openssl rand -hex 4)            然后输入密码
                    $1$84066c2f$N9tHd9auawIE1hkL4TjTS0          生成的加密字符串
                vim /mnt/ssroot/etc/shadow
                    root:$1$84066c2f$N9tHd9auawIE1hkL4TjTS0:17872:0:99999:7:::
                通过lddcp.sh脚本将bash移植到nimi linux中,如果你换过目录了,就要将脚本中target变量修改为你现在的目录;
            11.挂起虚拟机,开启新添加的虚拟机;
                键入回车,然后切换到tty2(不知道是什么原因tty1不好使),输入用户名和密码就行;


            网卡已经启动,并且设置好了;
            12.关闭新添加的虚拟机,开启原虚拟机;
                添加ssh功能,并且上图中终端提示符太不方便了,也没有平时使用的好看,所以我们给它美化一下;
                vim /mnt/ssroot/etc/issue
                    Welcome to www.guowei.com
                    Kernel
                编译安装dropbear,使之支持ssh
                tar xf dropbear-2017.75.tar.bz2 
                cd dropbear-2017.75/
                ./configure 
                make
                make install
                运行lddcp.sh将dropbear,dbclient以及dropbearkey复制的到mini linux中;
                因为我们要使用远程连接,所以dev目录中需要有pts目录,默认是没有的,我们自己创建并且pts还要挂载一个伪文件系统;
                mkdir /mnt/ssroot/dev/pts
                vim /mnt/ssroot/etc/fstab 
                    添加一行 :devpts          /dev/pts     devpts   mode=620  0 0
                生成dropbear密钥文件:
                mkdir /mnt/ssroot/etc/dropbear
                cd /mnt/ssroot/etc/dropbear
                    dropbearkey -t rsa -s 2048 -f dropbear_rsa_host_key
                    dropbearkey -t dss -f dropbear_dss_host_key 
                为ssh添加安全shell,否则无法使用ssh登陆;
                vim /mnt/ssroot/etc/shells
                    /bin/sh
                    /bin/ash
                    /bin/hush
                    /bin/bash
                    /sbin/nologin
                系统登陆时,dropbear在系统登陆时,会将用户名传换成ID号,然后检查用户的帐号信息;所以我们需要开启nsswitch功能,使它完整转换;
                vim /mnt/ssroot/etc/nsswitch.conf
                    passwd:files
                    group:files
                    shadow:files
                    hosts:files dns
                nsswitch想要完成文件解析需要使用nsswitch解析时的专用文件,所以我们也要将它们复制到mini linux中;
                mkdir /mnt/ssroot/usr/lib64
                cp -d  /lib64/libnss* /mnt/ssroot/lib64/
                cp -d /usr/lib64/libnss3.so /mnt/ssroot/usr/lib64/
                cp -d /usr/lib64/libnssutil3.so /mnt/ssroot/usr/lib64/
                cp -d /usr/lib64/libnss_file* /mnt/ssroot/usr/lib64/
            13.关闭虚拟机,开启新添加的虚拟机;
                设置终端提示符以及添加环境变量,使之支持drpobear:
                vi .bash_profile
                    export PS1=’[u@h W]$’
                    export PATH=$PATH:/usr/local/bin:/usr/local/sbin
                . .bash_profile
                启动dropbear服务;
                dropbear -h
                mkdir /var/run
                dropbear -F -E
                打开终端tty3
                netstat -tnl


                以监听在22号端口;
                因为写在fstab中的devpts          /dev/pts     devpts   mode=620  0 0   并没有挂载成功,所以我们手动挂载一下,mount -t devpts devpts /dev/pts
            14.现在可以使用ssh连接mini linux了;
                因为ssh默认禁止root用户登陆,所以我们需要再创建一个普通用户:
                adduser guowei
                然后在另一台主机上使用guowei登陆即可;
                ssh guowei@192.168.0.66
                

             注:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删;

  • 相关阅读:
    [转]ASP.NET中JSON的序列化和反序列化
    [转]JavaScriptSerializer中日期序列化
    [转]国外英语教学网页
    [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
    [转]Business Model Canvas(商业模式画布):创业公司做头脑风暴和可行性测试的一大利器
    [转]sql server transaction
    CentOS7安装配置PostgreSQL9.6
    使用struts的同步令牌避免form的重复提交
    Flink初探-为什么选择Flink
    jdbc三种常见用法
  • 原文地址:https://www.cnblogs.com/guowei-Linux/p/11072873.html
Copyright © 2011-2022 走看看