Mini Linux编译过程
linux系统内核非常的精简,而且基于一切皆文件的思想,使得我们可以再现有系统上挂载一个空硬盘,利用现有系统编译一个内核和相关程序文件并拷贝到空硬盘上。我们就可以用空硬盘来单独运行一个精简的linux系统,这对于依赖于注册表的windows系统来说是不可能实现的。本文简要介绍一下一个mini linux的安装制作过程
实现的基本换进:vmware workstation
实现的基本思想:kernel+busybox
软件包:kernel www.kernel.org busybox www.busybox.net
一、基本实现
1、在现有系统上添加一块独立硬盘,以便装载mini linux
fdisk /dev/sdc
n
p
+100M
n
p
+2G w (分两个主分区)
mke2fs -t ext4 /dev/sdc1
mke2fs -t ext4 /dev/sdc2
mkdir /mnt/{boot,sysroot}
mount /dev/sdc1 /mnt/boot
mount /dev/sdc2 /mnt/sysroot
#先安装开发环境:yum -y groupinstall "Development tools" "Server Platform Development"
yum -y install bc
2、下载kernel到/usr/src并解压包tar xf linux-4.5.2.tar.xz, 创建inux-4.5.2的链接linux:
ln -sv inux-4.5.2 linux
3、make allnoconfig 先生成一个纯净的.config
可能出错情况说明
[root@node1 linux]# make allnoconfig
make: Warning: File `arch/x86/Makefile' has modification time 2.7e+06 s in the future
make[1]: Warning: File `scripts/Makefile.host' has modification time 2.7e+06 s in the future
这个是由于系统时间不对引起 date -s设置系统时间 或者使用ntpdate同步系统时间 netdate ntpserver
4、make menuconfig配置需要的编译项目
可能出错情况说明
[root@node1 linux]# make menuconfig
scripts/kconfig/lxdialog/dialog.h:38:20: error: curses.h: No such file or directory
In file included from scripts/kconfig/mconf.c:23:
这个是由于ncurses-devel模块,yum安装一下,ncurses提供字符终端处理库,包括面板和菜单。
5、选择基础的需要的配置项目:
由于要在现有平台直接移植一些功能,所以基础平台需要选择一样的:
64-bit kernel

cpu 类型


支持多核心

支持pci

硬盘驱动编入:


fusion mpt是scsi的中层驱动,等于是通讯层驱动,还要选择物理层驱动:
scsi device support—scsi device support scsi disk support

输入设备驱动选择:

6、基础的功能都选择完毕,可以先编译一次看看:
make -j 4 bzImage —-只编译内核
编译完成后,会显示编译好的内核的大小和路劲

7、安装grub,以便新系统启动引导:
gurb-install –root-directory=/mnt /dev/sdc

编辑grub配置文件:
vim /mnt/boot/grub/grub.conf

8、将编译好的文件拷贝到boot中

随时按sync同步

至此,最基本的配置及文件准备完成,我们用此硬盘作为一个新虚拟机的硬盘启动系统,会发现如下提示:


单独放个文件夹

可以看到,虽然硬盘被识别,但是文件系统并未被识别驱动,为此我们需要选择内核支持的文件系统并重新编译。
9、在file system中选择需要加载的文件系统的格式:

同时,选择支持的可执行程序的格式,因为我们加载文件系统,就需要运行上面的程序

10、编译完成后我们重新启动新的主机,发现文件系统可以识别了,但是没有init程序,系统还是无法正常启动。

我们可以查看/usr/src/linux2/init/main.c中查看系统默认启动时查找应用程序顺序:

我们还是先移一个bash到sysroot中,以便启动系统。
对于一个根文件系统,我们先创建基本的目录

下面我们要复制程序,复制程序除了复制程序本身,还要复制程序文件所依赖的库文件,我们需要建立一个脚本,以实现程序的复制
vim cpcmd.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 $rarget$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 $cmnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
read -p "Another command(quit):" command
done
通过此脚本将bash,ls拷贝到/mnt/sysroot,可以通过chroot来测试一下

此时bash已经拷贝完成,我们编辑一下/mnt/boot/grub/grub.conf,明确告诉系统init程序


再启动新主机,会发现系统已经可以运转

到此,我们实现了一个简单的MINI LINUX。
二、下面我们将演示如何使用busybox构建。
BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。
为了方便我们拷贝使用,我们采用静态编译的方式编译busybox,而不是采用共享库方式。
要实现静态编译,我们要依赖于glibc库中的glibc-static支持,首先需要安装glibc-static

busybox的编译方法和内核的编译方法类似,可以采用make menuconfig配置编译选项

在Busybox Settings-build options中选择采用静态编译方式:

busybox settings-installation options中可以选择采用什么样的链接安装,默认采用软链接方式

执行make && make install,默认安装在当前目录的_install目录下。
清空原有的/mnt/sysroot目录
拷贝安装后的busybox到/mnt/sysroot/目录中
cp -a _install/* /mnt/sysroot/

可以看到,ash已经可以运行
修改grub的conf文件:

由于目前sysroot目录下只有bin,sbin,usr目录,我们再创建相关目录补全(少了boot)

目前系统依赖于init,所以我们需要编辑inittab,告知系统如何初始化:
vim /mnt/sysroot/etc/inittab

第一项:说明系统初始化脚本
第二项:说明控制台
第三项:说明重启
第四项:说明关机时卸载所有挂载文件
再创建rc.sysinit脚本
mkdir /mnt/sysroot/etc/rc.d
vim /mnt/sysroot/etc/rc.d/rc.sysinit

chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
至此,我们可以尝试启动新的mini linux
(注意,如果系统提示没有/dev/console文件,则编译内核需要选择:
device drivers–Generic device option中自动装在devtmpfs到dev目录

三、我们对上述的简单的Mini Linux做相应的补充:
1、创建fstab文件以开机自动挂载文件系统:
vim etc/fstab

2、在rc.sysinit中指明执行mount -a(mount -a就是挂载fstab文件中所有的文件)

3、启动时候我们只是采用了控制台console,我们可以使用虚拟终端,编辑inittab文件:

完成以上几步后我们再启动Mini Linux,可以看到我们可以通过ctrl+alt+F123里切换中断了。
同时可以看到开机要求的挂载的系统也都已经自动挂载上
4、我们用模块方式加载网卡的驱动:
如果lspci没安装,yum安装pciutils yum -y install pciutils
lspci 查看网卡类型

我们要重新编译内核,首先编译网络支持模块打开网络功能
networking support–networking options中:

在编译网卡驱动:

上面我们是将网卡编译进了内核,那么我们如何用模块编译呢?
修改内核编译配置 ethernet driver support

此时我们对内核编译就拆除了对网卡驱动的支持
我们对单独的网卡驱动模块编译:
网卡模块所在位置:由于我们之前编译进内核过,所以现在只有.O的文件,一般来说都是.c的文件:

单独编译内核模块:
make M=path/to/somedir/
#make M=drivers/net/ethernet/intel/e1000/

然后将编译好的ko文件拷贝到/mnt/sysroot/lib/modules目录下:

完成后我们进入Mini Linux中会发现网卡已经没有了,需要手动装在网卡模块

如果要自动装在,需要写脚本自动扫描所有硬件并安装合适的驱动。
简单一点我们可以在rc.sysinit中用命令实现开机自动装载
5、我们还可以为系统创建登录
创建passwd,group,shadow文件:

chroot到minilinux中采用useradd添加root,并对文件作相应修改

vim etc/passwd

vim etc/group

将目前系统的root密码传递过来

修改inittab文件

以上配置即可
6、配置为minilinux提供ssh服务支持
vim etc/issue—显示ssh登录的提示

编译安装dropbear
tar xf dropbear-2016.72.tar.bz2
cd dropbear-2016.72
./configure(需要openssl-devel包支持)
make && make install
使用命令复制脚本将dropbear,dropbearkey,dbclient


为目标系统的dropbear生成密钥文件

注意:key文件放的位置可以查看options.h获得(在编译路径下)
通过远程ssh登录时,登陆者使用的shell必须为安全shell,在etc/shells文件中定义:

系统上nsswitch服务支持(dropbear在登录认证是需要将用户名转换成对应的用户id号)
vim etc/nsswitch.conf

将相关的库文件拷贝到对应目录下

注意:可以将passwd文件中用户最后对应的shell修改为该用户想启用的shell
编辑/root/.bash_profile(只争对bash有效)

创建/vra/run目录 (创建pid file需要)
启动dropbear :dropbear -E -F
发现dropbear已经可以正常启动(注:新版本dropbear禁止使用root登录)
以上就是mini linux制作的全部内容,可以加深对于linux操作系统的理解。

浙公网安备 33010602011771号