编译内核+busybox+dropbear,ssh登录
以下是学习过程记录:
学习环境使用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登录相关推荐
- 编译内核,busybox,dropbear组装linux小系统
应用程序使用以下软件 busybox提供命令环境 dropbear提供ssh服务实现远程管理. 查看本物理机的硬件,来确认编译内核时选择相应的驱动.硬件信息获取方法: cat /proc/cpuinf ...
- 由Linux内核bug引起SSH登录缓慢问题的排查与解决
快杰云主机是UCloud推出的具备优秀性能与极高性价比的新一代主机,网络最高可达 1000 万 PPS,存储最高可达 120 万 IOPS.为了提升产品综合表现,Host内核.KVM和Guest内核等 ...
- Linux下编译内核配置选项简介
Code maturity level options 代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未 ...
- LINUX 编译内核选项 向作者致敬
Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...
- 嵌入式Linux下Dropbear SSH配置优化
By Toradex秦海 1). 简介 嵌入式 Linux 由于运行平台通常资源受限同时对稳定性要求高,因此需要比较精简,那么针对 SSH 服务器/客户端应用,通常也不使用庞大的 OpenSSH,而 ...
- Linux下使用Google Authenticator配置SSH登录动态验证码
说明: 1.一般ssh登录服务器,只需要输入账号和密码. 2.本教程的目的:在账号和密码之间再增加一个 验证码,只有输入正确的验证码之后,再输入 密码才能登录.这样就增强了ssh登录的安全性. 3.账 ...
- 手机远程ssh登录Linux,Linux SSH(远程登录)到Milestone手机
手机类型是MOTO Milestone 2.0,手机没有sshd服务,可以用Dropbear代替. 当然首先要获得root权限,可以从网上下载包,拷到sdcard的根目录下,在recovery 模式下 ...
- Ubuntu下编译内核
一.下载源代码和编译软件的准备 下载内核源代码:http://www.kernel.org/ 注意,点击2.6.25内核的F版,即完整版. 如果你懒得去网站点联接,运行下列命令: 代码: $cd ...
- 编译linux内核分区,Ubuntu编译内核及grub的一些笔记
最近心态不稳定,不怎么想发表文章,但看了看之前写了的笔记,想想还是整理出来吧,其实我写文章,也有一部分原因是为了心里的慰藉--当年游戏打不过别人,关注点便转向其它方面.这里整理的是以前编译内核.引导启 ...
最新文章
- Object类中有哪些方法
- JZOJ 5794. 2018.08.10【2018提高组】模拟A组省选 旅行
- python3类的继承详解_python3中类的继承以及self和super的区别详解
- java如何加载lambda_Java 8 lambda表达式引入及简单使用
- 德国软件巨头SAP旗下风投基金募集10亿美元 专门投资科技初创公司
- python中的单例模式_Python单例模式
- 访问数据库时如何解决并发问题
- 两个三维图像互信息python_两的解释|两的意思|汉典“两”字的基本解释
- 深度装机大师一键重装_教你使用深度装机大师重装win10系统
- c语言实验——G-鞍点计算
- 微信小程序---选项卡
- ssh登录极路由后台_OpenWrt刷机详细流程(极路由)
- MyBatis 极速入门
- CTF Crypto---RSA N不互素
- GlusterFS元数据机制分析
- OpenLayers 3实践与原理探究1-ol2 VS ol3
- PHP抓取页面的几种方式
- FlexRay总线协议快速入门、深度剖析与应用示例
- BLAM源码解析(四)—— 基于ICP的位姿更新
- PID file not written; -detached was passed,安装rabbitmq启动失败
热门文章
- 位操作符(按位与,按位或,按位异或)
- 程序猿 常规SQL面试题
- 阿里四面总结-200215
- 【调剂】北京石油化工学院招收环境科学与工程、资源与环境硕士研究生
- Ext.encode与Ext.decode的JSON转换
- vue项目中使用cesium且使用geoserver服务,实现条件查询及拿到过滤之后的json数据
- backtrader:基于信号的策略开发及参数优化
- 微信小程序案例__简易计算器实现+源代码+注释(二十三)
- Gartner最新报告:低代码应用开发平台在国内的发展
- 云服务器中获取文件代码,从云服务器中获取文件