本节我们将通过编译内核源码来搭建一个自定制的微型Linux系统,并且配上一个busybox来实现一些最基本的内容,最后我们在这基础上加上一个远程登录的功能。好了废话不多说,下面我们就来开始介绍吧。
准备工作
1、在宿主机中安装开发环境
[[email protected] ~]# yum -y groupinstall "Development tools" "Server Platform Development" [[email protected] ~]# yum -y install "ncurses-devel"
2、在宿主服务器添加一块磁盘,作为微型Linux系统的主磁盘。
这里我添加了一块10G的磁盘/dev/sdb
首先创建2个分区(具体的操作过程这里就不给了,讲的实在太多了)
创建好之后对分区进行格式化
[[email protected] ~]# mke2fs -t ext4 /dev/sdb1 [[email protected] ~]# mke2fs -t ext4 /dev/sdb2
并创建挂载点进行挂载:在/mnt下创建boot和sysroot目录
[[email protected] ~]# mount /dev/sdb1 /mnt/boot [[email protected] ~]# mount /dev/sdb2 /mnt/sysroot
创建grub
[[email protected] ~]# grub-install --root-directory=/mnt /dev/sdb
创建grub配置文件
[[email protected] ~]# vim /mnt/boot/grub/grub.conf timeout=5 default=0 title Linux 8 root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init
OK,环境就先准备这些。
编译内核
首先要到网络去下载内核源码,这里我用的是linux-3.13.6的版本进行编译的
解压内核源码
[[email protected] ~]# tar xf linux-3.13.6.tar.xz -C /usr/src/
创建软连接
[[email protected] src]# ln -sv linux-3.13.6/ linux [[email protected] src]# cd linux/
配置内核模块参数
[[email protected] linux]# make allnoconfig [[email protected] linux]# make menuconfig
编译内核模块参数
先来一张整体的截图
1、选择64位内核
2、General setup --> Local Version - append to kernel release --> 自定义版本号
删除字符需要使用Ctrl+Backspace
General setup --> System V IPC 进程间通信的
3、支持动态装卸载模块
Enable loadable module support --> Module unloading
4、支持使用块层
Enable the block layer --> Block layer SG support v4
5、Processor类型和特性
Processor type and features
--> Processor family (Core2/newer Xeno) 处理器
--> Symetric muliti-processing support 对称多处理器
--> Muliti-core scheduler support 多核调度支持
6、总线
Bus options(PCI etc.)
-->PCI support
7、可支持文件类型和格式
Exectuable file formats /Emulations
--> Kernel support for ELF binaries 支持ELF格式
--> Kernel support for scripts starting with #! 支持以#!开头的脚本格式
8、网络
Networking support
-->Networking options
-->TCP/IP networking
9、驱动
Device Drivers
支持临时挂载文件系统
Device Driver Options
-->Maintain a devtmpfs filesystem to mount at /dev
--> Automount devtmpfs at /dev,after the kernel mount... 并自动挂载
硬盘相关
-->SCSI device support
-->SCSI device support
-->SCSI disk support
MTP相关
-->Fusion MPT device support
-->Fusion MPT ScsiHost drivers for SPI
-->Fusion MPT logging facility
USB接口配置
-->Input device support 键盘鼠标
-->USB support
-->xHCI HCD (USB3.0) support
-->EHCI HCD (USB2.0) support
-->OHCI HCD (USB1.1) support
-->UHCI HCD (most Intel and VIA) support
-->Mouse interface 鼠标接口
-->Keyboards 键盘
-->Mice-->PS/2 mouse ps2的鼠标
网卡驱动 (注意这里一定要与自己的主机的环境一致,不然网卡无法驱动)
Device Drivers
-->Network device support
-->Network core driver support 网络核心驱动支持
-->Ethernet driver support 以太网驱动支持
10.文件系统
File systems
-->The Extended 4 (ext4) filesystem 支持ext4文件系统
好了可以进行编译了
[[email protected] linux]#make –j 4
编译好之后
[[email protected] linux]#cp arch/x86_64/boot/bzImage /mnt/boot
编译安装busybox
BusyBox 是将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一个比较完善的环境,可以适用于任何小的嵌入式系统。
下面我们进行编译安装
[[email protected] ~]# tar xf busybox-1.22.1.tar.bz2
使用静态编译的模式,将依赖于glibc-static
[[email protected] ~]# yum -y install glibc-static,libcrypt [[email protected] ~]# cd busybox-1.22.1 [[email protected] busybox-1.22.1]# make menuconfig
只需要修改一项
BusyBox Settings
Build BusyBox as a static binary (no shared libs) 编译成为一个静态
[[email protected] busybox-1.22.1]# make && make install
会生成一个_install目录
将此目录中的所有复制到/mnt/sysroot目录中
cp -a * /mnt/sysroot
在/mnt/sysroot中创建根文件系统需要的一些目录
[[email protected] sysroot]# mkdir /mnt/sysroot/{proc,sys,dev,home,boot,root,tmp,var,lib64,mnt,media,etc}
提供相应的配置文件
/mnt/sysroot/etc/fstab 开机自动挂载文件
/dev/sda2 / ext4 defaults 0 0 /dev/sda1 /boot ext4 defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 devpts /dev/pts devpts defaults 0 0
/mnt/sysroot/etc/inittab 提供初始化脚本的指定,开启伪终端的指定,定义ctrl+alt+del
::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty 19200 tty1 ::respawn:/sbin/getty 19200 tty2 ::respawn:/sbin/getty 19200 tty3 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r
/mnt/sysroot/etc/shells 提供安全的shell环境
/bin/sh /bin/ash /bin/tcsh /bin/bash /sbin/nologin
/mnt/sysroot/etc/rc.d/rc.sysinit 系统进一步初始化脚本
#!/bin/sh # echo -e "Welcome to MiniLinux" echo "Remouting root filesystem" mount -n -o remount,rw /dev/sda2 / #创建远程连接虚拟终端需要的pts文件夹 mkdir /dev/pts #挂载fstab文件中的所有设备文件 mount -a #创建设备文件 mdev -s [ -r /etc/sysconfig/network ] && source /etc/sysconfig/network [ -z "$HOSTNAME" -o "$HOSTNAME" == ‘(none)‘ ] && hostname localhost || hostname $HOSTNAME 主机名相关 ifconfig eth0 172.16.106.254 配置网卡信息 ifconfig lo 127.0.0.1 for i in /etc/rc.start/* do $i start done
/mnt/sysroot/etc/passwd提供账号
root:x:0:0::/root:/bin/sh
/mnt/sysroot/etc/shadow 提供密码
openssl passwd -1 -salt `openssl rand -hex 4` 生成密码
root:密码:..........
/mnt/sysroot/etc/profile 环境变量
export PS1=‘[\[email protected]\h \W]\$‘ export PATH=‘/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin‘
以上步骤完成之后一个简单的可以基于tty登录的微型系统就OK了。
我们可以验证一下:
提供远程连接服务
在安装之前提供相应的名称解析库
其中基于文件的名称解析,所依赖的共享库文件有
/lib64/libnss_files-2.12.so
/lib64/libnss_files.so.2
/usr/lib64/libnss3.so
/usr/lib64/libnsspem.so
/usr/lib64/libnsssysinit.so
/usr/lib64/libnssutil3.so
创建目录并复制程序
# cp -a -d /lib64/libnss_files* /mnt/sysroot/lib64 # mkdir /mnt/sysroot/usr/lib64 # cp -a -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64 # cp -a -d /usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64
提供nsswitch.conf配置文件
# cp /etc/nsswitch.conf /mnt/sysroot/etc/ passwd: files shadow: files group: files #hosts: db files nisplus nis dns hosts: files dns
编译安装dropbear
安装dropbear可以查看帮助文档
less INSTALL
安装步骤:
[[email protected] ~]# tar xf dropbear-2013.58.tar.bz2
[[email protected] ~]# cd dropbear-2013.58/
直接装在MiniLinux
./configure
注:
默认安装在/usr/local,可以自定义指定安装后的目录
如果需要配置在编译之前可以修改安装目录下的options.h
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
使用bincp.sh将dropbear相关命令移植到MiniLinux中
先提供bincp.sh的脚本
#!/bin/bash
#
target=/mnt/sysroot/
[ -d $target ] || mkdir $target
preCommand() {
if which $1 &> /dev/null; then
commandPath=`which --skip-alias $1`
return 0
else
echo "No such command."
return 1
fi
}
commandCopy() {
commandDir=`dirname $1`
[ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}
[ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}
}
libCopy() {
for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
read -p "Plz enter a command: " command
until [ "$command" == ‘quit‘ ]; do
if preCommand $command ; then
commandCopy $commandPath
libCopy $commandPath
fi
read -p "Plz enter a command: " command
done
dropbear的使用:启动dropbear
选项:
-d dsskeyfile
-r rsakeyfile
-F 在前台运行
-E 指定错误输出位置为标准错误输出
-s 禁止基于密码的认证,只能基于密钥的认证
-P 指定pid文件位置,默认/var/run/dropbear.pid
-p 指定家庭的地址和端口 [address:]port
-h 查看帮助
dropbearkey命令:创建dropbear所需的密钥文件
选项:
-t 加密算法 dss、rsa
-s 密码长度
-f 密钥位置
-h 查看帮助
注:密钥权限默认为600
创建目录
# mkdir -p /mnt/sysroot/etc/dropbear #dropbear的密钥文件存放位置 # mkdir -p /mnt/sysroot/var/run #pid文件所在的目录
创建dss形式的密钥文件
# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
创建rsa形式的密钥文件,指定密钥长度为2048
# dropbearkey -t rsa -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
好了这些完成之后我们的远程接入功能也应该可以实现了。可以测试一下
OK,登录成功。
本节的内容就讲到这里,欢迎大家批评指正!