以下是学习过程记录:

学习环境使用VMware虚拟机,宿主机使用centos6.10,内核源码linux-3.0.1,busybox-1.22.0,dropbear-2020.81。

1、目标硬盘分区与挂载:

我新建了5G的磁盘,其实很小就可以。使用fdisk分区1+4G过程略。两个分区分别挂载至宿主机。

mount /dev/sdb1 /mnt/boot;mount /dev/sdb2 /mnt/root

2、BootLoader(grub):

grub-install --root-directory=/mnt /dev/sdb

vim /mnt/boot/grub/grub.conf

default=0
        timeout=2
        title Mini Linux
            root (hd0,0)
            kernel /bzImage ro root=/dev/sda2 init=/sbin/init

待会儿我的内核就编译为bzImage非模块化方式。

3、编译内核:

很多文章都说内核源码放置/usr/src,这只是沿用了系统默认的文件部署形式。其实无所谓的,进入源码根目录。

make allnoconfig(初始化最小配置。)

lscpu;lspci(查看当前系统硬件情况,因为是虚拟机,虚拟的硬件环境一样,参考用。)

make menuconfig是tui界面,会根据内核版本不同而有区别。我总结了几个我认为主要的选项。主要是针对:架构,模块,处理器,pci总线,执行文件,设备驱动(磁盘、键盘、鼠标、/dev、network),fs。
        [*] Enable loadable module support  --->
            [*]   Module unloading
        Processor type and features  --->
            [*] Symmetric multi-processing support
            [*] Multi-core scheduler support
        Bus options (PCI etc.)  --->
            [*] PCI support
        Executable file formats / Emulations  --->
            [*] Kernel support for ELF binaries  
            [*] Write ELF core dumps with partial segments
        -*- Networking support  --->
            Networking options  --->[*] TCP/IP networking
        Device Drivers  --->
            Generic Driver Options  --->
                [*] Maintain a devtmpfs filesystem to mount at /dev
                [*]   Automount devtmpfs at /dev, after the kernel mounted the rootfs
            SCSI device support  --->
                <*> SCSI device support
                <*> SCSI disk support
                [*] SCSI low-level drivers  --->
            [*] Fusion MPT device support  --->
                <*>   Fusion MPT ScsiHost drivers for SPI
                <*>   Fusion MPT ScsiHost drivers for FC
                <*>   Fusion MPT ScsiHost drivers for SAS
                <*>   Fusion MPT misc device (ioctl) driver
            [*] Network device support  --->
                [*]   Ethernet (1000 Mbit)  ---><M>   Intel(R) PRO/1000 Gigabit Ethernet support
                (网卡选择为<M>稍后编译成模块)
            Input device support  --->
                Keyboards  --->
                [*]   Mice  --->
            [*] USB support  --->
        File systems  --->
            <*> Second extended fs support
            <*> Ext3 journalling file system support
            <*> The Extended 4 (ext4) filesystem
        网卡驱动非模块化方式:
            直接编译进内核,不需要后期加载驱动模块。
        网卡驱动模块化方式:
            modinfo e1000 (查看有无depend项,有的话一并复制)
    编译内核:        
        make -j 4 bzImage:非模块化式编译,不含网卡。编译完成会提示生成位置arch/x86/boot/bzImage 
        cp arch/x86_64/boot/bzImage /mnt/boot (符号链接x86_64-->x86)
        chmod +x /mnt/boot/bzImage
    编译网卡驱动:
        make M=drivers/net/e1000 (编译单个模块:make M=path/to/dir)          
        mkdir /mnt/root/lib/modules
        cp drivers/net/e1000/e1000.ko /mnt/root/lib/modules
        驱动的具体位置需要从源码目录中找到,可以参考宿主机的/lib/modules,
        理论上安装位置可以任意指定,加载模块时指定即可。系统原有路径很长,这里就简化处理。

4、busybox编译:

tar -xf busybox-1.22.0.tar.bz2(试过1.35版本编译出错,也许是版本不兼容)
    cd busybox-1.22.0
    使用静态编译,不依赖动态库文件,把库编译进可执行文件,依赖于glibc-static包
    make menuconfig (其中有重要选项,用于设置为静态模式,如下列出)
            --- Build Options
                [*] Build static binary (no shared libs)
            --- Installation Options ("make install" behavior) 
                (./_install) Destination path for 'make install' (NEW)
    make -j 4 && make install
    cp -a _install/* /mnt/root
    mkdir -p boot root home usr var tmp etc bin sbin lib lib64 mnt media dev proc sys(16个常用目录补全)

另外我写了一个脚本用于移植文件:(其实也可以写得很简洁,我习惯这样写)

#!/bin/bash#sDestDir="/root/mytest/tmp"
sDestDir="/mnt/root"
sCmdName=""
sFunction=""
case $1 in"")#installsFunction="install";;e)#erasesFunction="remove";;*)echo "The arguments must be e|none."exit 2;;
esacf_chkInput(){#read inputread -p "Enter a name of command:" sCmdNamesCmdName=${sCmdName//[[:space:]]}if [ -z $sCmdName ];thenreturn 1 #input nullelif [[ $sCmdName == "quit" || $sCmdName == "exit" ]];thenreturn 2 #input 'quit' or 'exit'elif (! which $sCmdName &>/dev/null);thenecho "Command not found,or it is a shell builtin."return 3 #command wrong#elsefiecho $sCmdName
}f_getCmdPath(){echo $(which $1 | egrep -o '(/[^/]+)+$')
}f_getDependList(){echo $(ldd $1 | egrep -o '(/[^/]+)+[[:space:]]')
}f_InstallOrRemove(){#Create tmp directoryinstall -d $sDestDir#copy filesarrFile=($@)sNewFilesList=""iCount=0for ((i=0;i<${#arrFile[*]};i++));dosBaseName=${arrFile[$i]##*/}sDirName=${arrFile[$i]%/*}sNewDir="${sDestDir}${sDirName}"if [ $sFunction == "install" ];theninstall -d $sNewDir#if (install ${arrFile[$i]} $sNewDir);thenif ([ -f ${sNewDir}/${sBaseName} ] || cp ${arrFile[$i]} $sNewDir);thenif ((i>0));thensNewFilesList+="\n"fisNewFilesList+="${sFunction} ${sNewDir}/${sBaseName}"let iCount++fielseif ([ -f ${sNewDir}/${sBaseName} ] && rm -f $sNewDir/${sBaseName});thenif ((i>0));thensNewFilesList+="\n"fisNewFilesList+="${sFunction} ${sNewDir}/${sBaseName}"let iCount++fifidonesNewFilesList="-------------------------------------\n"${sNewFilesList}echo -e $sNewFilesList >> "${sDestDir}/myinstall.log"echo "$sNewFilesList\n$iCount files done."
}while true;dosInputResult=$(f_chkInput)case $? in1)#input nullcontinue;;2)#input quitexit 0;;3)#command wrongecho $sInputResultcontinue;;esacsCmdName=$sInputResultsCmdPath=$(f_getCmdPath $sCmdName)sDependList=$(f_getDependList $sCmdPath)declare -a arrFilearrFile=($sCmdPath $sDependList)echo -e $(f_InstallOrRemove ${arrFile[*]})
done

使用的时候可以在代码中指定目标目录,也可以给参数“e”,就表示卸载。我是给自己用的,没想那么多,就是用ldd判断依赖关系而已,卸载的时候比较暴力,有些共享的库可能会被删除,不过我不在乎,哪个程序有问题,再移植一下就行了。以后再完善这个脚本。

我使用这个脚本移植了bash过去。

bash myinstall.sh

在提示符下输入bash就可以自动移植完成。

5、etc/inittab:

格式:id:runlevel:action:program

    ::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

6、etc/rc.d/rc.sysinit:

cd /mnt/root;mkdir etc/rc.d;vim etc/rc.d/rc.sysinit

 #!/bin/shecho -e "Welcome to \033[33mMini\033[0m Linux"echo "scan /sys to /dev..."mdev -secho "make dir..."mkdir var/run dev/ptsecho "mount filesystem..."mount -a #mount from fstabmount -o remount,rw /echo "Load driver ..."insmod /lib/modules/e1000.ko #(需要在内核源码中编译网卡驱动)echo "Initializing ethernet card..."ifconfig eth0 192.168.0.61 upifconfig lo 127.0.0.1 up[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network[ -z $HOSTNAME -o $HOSTNAME == "(none)" ] && HOSTNAME="localhost"hostname $HOSTNAMEchmod +x etc/rc.d/rc.sysinit

7、etc/fstab:

 /dev/sda1   /boot       ext4    defaults    0   0/dev/sda2  /           ext4    defaults    0   0devpts     /dev/pts    devpts  mode=620   0   0sysfs      /sys        sysfs   defaults    0   0proc       /proc       proc    defaults    0   0

8、用户验证:

head -1 /etc/passwd > etc/passwd;head -1 /etc/group > etc/group;head -1 /etc/shadow > etc/shadow(我这是比较懒的做法,把宿主机的root信息复制一份过去)

其中shadow里面密码的加密串很长,minilinux可能不支持,实测,本地登录可以,使用ssh不行。解决方法很简单,chroot或者进入minilinux,更改一下密码就可以了。因为它使用自己支持的格式再生成的密码串,当然没问题。

9、dropbear:

我虽然下载了源码,但没有编译使用,只是看了一下其中的说明问题,就是要那几个key文件就行了。因为随后要使用我写的脚本向目标位置移植dropbear,dropbearkey,dbclient三个程序,所以我使用yum安装的epel源当中的dropbear。

cd /mnt/root
mkdir etc/dropbear
cd etc/dropbear
dropbearkey -t rsa -s 2048 -f dropbear_rsa_host_key
dropbearkey -t dss -f dropbear_dss_host_key
dropbearkey -t ecdsa -f dropbear_ecdsa_host_key
dropbearkey -t ed25519 -f dropbear_ed25519_host_key

最后一个ed25519它不支持,也就不考虑了,可以不要这个。

10、几个文件:

新建etc/issue,登录提示文本,内容如下:
        kernel \r

新建etc/shells,内容如下:
         /bin/sh
        /bin/ash
        /bin/hush
        /bin/bash
        /sbin/nologin.

新建etc/nsswitch.conf,用于解析用户名到id,内容如下:

passwd:files
        group:files
        shadow:files
        hosts:files dns

mkdir -p usr/lib64
        cp -d /lib64/libnss_file* lib64/
        cp -d /usr/lib64/libnss3.so usr/lib64/
        cp -d /usr/lib64/libnssutil3.so usr/lib64/
        cp -d /usr/lib64/libnss_file* usr/lib64/

新建etc/sysconfig/network,用于指定主机名,内容如下:

HOSTNAME=nxMINI

新建root/.bash_profile,内容如下:
        export PS1='[\u@\h \W]\$ '  #(命令行提示符)
        export PATH=$PATH:/usr/local/bin:/usr/local/sbin #(dropbear程序所在目录加入环境变量)
新建etc/profile,内容如下:
         [ $UID -eq 0 ] && export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

11、测试:

启动dropbear:

dropbear -FE

使用ssh登录成功即可。

本文完。

编译内核+busybox+dropbear,ssh登录相关推荐

  1. 编译内核,busybox,dropbear组装linux小系统

    应用程序使用以下软件 busybox提供命令环境 dropbear提供ssh服务实现远程管理. 查看本物理机的硬件,来确认编译内核时选择相应的驱动.硬件信息获取方法: cat /proc/cpuinf ...

  2. 由Linux内核bug引起SSH登录缓慢问题的排查与解决

    快杰云主机是UCloud推出的具备优秀性能与极高性价比的新一代主机,网络最高可达 1000 万 PPS,存储最高可达 120 万 IOPS.为了提升产品综合表现,Host内核.KVM和Guest内核等 ...

  3. Linux下编译内核配置选项简介

    Code maturity level options 代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未 ...

  4. LINUX 编译内核选项 向作者致敬

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

  5. 嵌入式Linux下Dropbear SSH配置优化

    By Toradex秦海 1). 简介 嵌入式 Linux  由于运行平台通常资源受限同时对稳定性要求高,因此需要比较精简,那么针对 SSH 服务器/客户端应用,通常也不使用庞大的 OpenSSH,而 ...

  6. Linux下使用Google Authenticator配置SSH登录动态验证码

    说明: 1.一般ssh登录服务器,只需要输入账号和密码. 2.本教程的目的:在账号和密码之间再增加一个 验证码,只有输入正确的验证码之后,再输入 密码才能登录.这样就增强了ssh登录的安全性. 3.账 ...

  7. 手机远程ssh登录Linux,Linux SSH(远程登录)到Milestone手机

    手机类型是MOTO Milestone 2.0,手机没有sshd服务,可以用Dropbear代替. 当然首先要获得root权限,可以从网上下载包,拷到sdcard的根目录下,在recovery 模式下 ...

  8. Ubuntu下编译内核

    一.下载源代码和编译软件的准备  下载内核源代码:http://www.kernel.org/  注意,点击2.6.25内核的F版,即完整版.  如果你懒得去网站点联接,运行下列命令: 代码: $cd ...

  9. 编译linux内核分区,Ubuntu编译内核及grub的一些笔记

    最近心态不稳定,不怎么想发表文章,但看了看之前写了的笔记,想想还是整理出来吧,其实我写文章,也有一部分原因是为了心里的慰藉--当年游戏打不过别人,关注点便转向其它方面.这里整理的是以前编译内核.引导启 ...

最新文章

  1. Object类中有哪些方法
  2. JZOJ 5794. 2018.08.10【2018提高组】模拟A组省选 旅行
  3. python3类的继承详解_python3中类的继承以及self和super的区别详解
  4. java如何加载lambda_Java 8 lambda表达式引入及简单使用
  5. 德国软件巨头SAP旗下风投基金募集10亿美元 专门投资科技初创公司
  6. python中的单例模式_Python单例模式
  7. 访问数据库时如何解决并发问题
  8. 两个三维图像互信息python_两的解释|两的意思|汉典“两”字的基本解释
  9. 深度装机大师一键重装_教你使用深度装机大师重装win10系统
  10. c语言实验——G-鞍点计算
  11. 微信小程序---选项卡
  12. ssh登录极路由后台_OpenWrt刷机详细流程(极路由)
  13. MyBatis 极速入门
  14. CTF Crypto---RSA N不互素
  15. GlusterFS元数据机制分析
  16. OpenLayers 3实践与原理探究1-ol2 VS ol3
  17. PHP抓取页面的几种方式
  18. FlexRay总线协议快速入门、深度剖析与应用示例
  19. BLAM源码解析(四)—— 基于ICP的位姿更新
  20. PID file not written; -detached was passed,安装rabbitmq启动失败

热门文章

  1. 位操作符(按位与,按位或,按位异或)
  2. 程序猿 常规SQL面试题
  3. 阿里四面总结-200215
  4. 【调剂】北京石油化工学院招收环境科学与工程、资源与环境硕士研究生
  5. Ext.encode与Ext.decode的JSON转换
  6. vue项目中使用cesium且使用geoserver服务,实现条件查询及拿到过滤之后的json数据
  7. backtrader:基于信号的策略开发及参数优化
  8. 微信小程序案例__简易计算器实现+源代码+注释(二十三)
  9. Gartner最新报告:低代码应用开发平台在国内的发展
  10. 云服务器中获取文件代码,从云服务器中获取文件