【转】浅谈编译kernel+busybox构建拥有远程ssh登录和web功能最小linux系统(一)
转自:http://www.178linux.com/8237
实验环境win7+VM11.1
大致过程总揽
1,硬件准备以及查看硬件设备型号(不用担心,这些都是VM虚拟出来的)
2,编译环境的配置以及下载内核源码以及编译内核
3,编译busybox,以及提供系统正常运行的配置文件,初步运行linux系统
4,编译安装dropbear提供ssh服务
5,安装nginx;提供web服务
一,硬件准备以及查看硬件设备型号
由于编译后的系统占用的空间很小,所以不需要多大的空间。
(注意添加虚拟磁盘的时候,一定要选择创建单个文件,不然之后你将这块硬盘添加到另一个寄生机的时候,会不好选择,如上右图)
硬件准备完毕。接下来查看参数
1
2
3
4
5
6
7
8
9
10
|
[root@mysql ~] # lspci 00:00.0 Host bridge: Intel Corporation 440BX /ZX/DX - 82443BX /ZX/DX Host bridge (rev 01) 00:01.0 PCI bridge: Intel Corporation 440BX /ZX/DX - 82443BX /ZX/DX AGP bridge (rev 01) 00:07.0 ISA bridge: Intel Corporation 82371AB /EB/MB PIIX4 ISA (rev 08) 00:07.1 IDE interface: Intel Corporation 82371AB /EB/MB PIIX4 IDE (rev 01) 00:07.3 Bridge: Intel Corporation 82371AB /EB/MB PIIX4 ACPI (rev 08) 00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10) 00:0f.0 VGA compatible controller: VMware SVGA II Adapter 00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01) 00:11.0 PCI bridge: VMware PCI bridge (rev 02) |
大概了解下就可以。我们只是走一下步骤。因为这是虚拟机,设备都是假的。但是在真实环境这一步还是很重要的。
分区格式化挂载以及安装grub
1,分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[root@mysql linux] # fdisk /dev/sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-130, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): +200M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (27-130, default 27): Using default value 27 Last cylinder, +cylinders or +size{K,M,G} (27-130, default 130): Using default value 130 Command (m for help): w The partition table has been altered! |
2,格式化
1
2
|
[root@mysql linux] # mke2fs -t ext4 /dev/sdb1 [root@mysql linux] # mke2fs -t ext4 /dev/sdb2 |
3,创建挂载目录并且挂载之创建目录
1
2
3
4
5
|
[root@mysql linux] # mkdir -pv /mnt/{boot,sysroot} mkdir : 已创建目录 "/mnt/boot" mkdir : 已创建目录 "/mnt/sysroot" [root@mysql linux] # mount /dev/sdb1 /mnt/boot/ [root@mysql linux] # mount /dev/sdb2 /mnt/sysroot/ |
4,安装grub(grub2--转者注)
1
2
3
4
5
6
7
8
9
10
|
[root@mysql linux] # grub-install --root-directory=/mnt/ /dev/sdb Probing devices to guess BIOS drives. This may take a long time . Installation finished. No error reported. This is the contents of the device map /mnt//boot/grub/device .map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub- install '. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb |
为了验证我们bootloader是否安装成功了对此检验一下。
1
2
3
|
[root@mysql mnt] # cd /mnt/boot/ [root@mysql boot] # ls grub lost+found |
可以得知已经安装成功
二,编译环境的配置以及下载内核源码以及编译内核
1, yum安装编译环境
1
|
yum groupinstall -y "Development Tools" |
2,为了防止在编译安装配置.config文件时无法启用tui界面,同时也要安装ncurses,以及ncurses-devel
1
|
yum install -y ncurses ncurses-devel |
3,下载内核源码包和解压到/usr/src目录并且通过软连接的形式链接到linux
1
2
3
4
5
|
[root@mysql ~] # tar xf linux-3.13.6.tar.xz -C /usr/src/ [root@mysql ~] # cd /usr/src/ [root@mysql src] # ln -sv linux-3.13.6/ linux "linux" -> "linux-3.13.6/" [root@mysql src] # cd linux |
4,清空所有配置选择,
1
2
3
4
5
6
7
8
9
10
11
|
[root@mysql linux] # make allnoconfig HOSTCC scripts /basic/fixdep HOSTCC scripts /kconfig/conf .o SHIPPED scripts /kconfig/zconf .tab.c SHIPPED scripts /kconfig/zconf .lex.c SHIPPED scripts /kconfig/zconf . hash .c HOSTCC scripts /kconfig/zconf .tab.o HOSTLD scripts /kconfig/conf scripts /kconfig/conf --allnoconfig Kconfig # # configuration written to .config |
5,执行内核配置(注意,我们是直接将系统功能驱动都是直接编译进内核的,所以,我们配置选项都是选择*号)
1
|
[root@mysql linux] # make menuconfig |
简单介绍下我们用到的配置选项
1,第一项,此项设置该系统为64位的操作系统(此项必须选择,如果编译32位系统,那么库文件可能出现不兼容的现象)
2,第二项,为通用设置选择并且进入进行配置,配置方式如下
选项一表示自定义系统内核的名称,(回车后就可以进入设置了,我定义了终结者的型号T800,你懂的)
选项二表示支持进程间通信。这个也是必须开启的
3,第三项,为启动加载模块支持选项。进入并且选择。相应选项。选项如下图。
意思是支持模块卸载以及强制卸载模块(这里解释一下,为什么要支持这个功能,我们明明都是将所有功能都直接配置到了内核为什么还要启动这个模块功能呢,答案是为了以后可以更好的扩展,假如有新的硬件添加进来呢,那我们岂不是有点难为自己了,又要重新编译内核一遍。)
4,第四项,此项表示开启块设备支持,此项默认打开。其他版本的内核源码默认没有打开,需要自己打开。不然的话,无法支持块存储设备。比如我们接下来要设置的scsi接口的块存储设备。
5,第五项,此项表示选择cpu的架构以及调整一些cpu的参数。
第一项是开启对称多处理器
第二项是cpu的型号选择回车如下图,表示cpu是英特尔酷睿系列的,当然了你要是amd的cpu就依靠自己了
第三项是第一项一旦开启此项就会默认开启,此项便是开启多核心调度
6,第六项,总线支持的配置选择并进入
这三项分别代表的意思是,开启pci总线支持,开启pci-e的支持。这个不要多做解释,你懂的,我想。
7,第七项,表示默认可执行文件的格式。(这项很重要,不开启那么就ELF二进制程序就不支持)
主要选择这三项,如果选择第一项,默认第二项会被选择
解释一下,第一项和第二项表示内核支持ELF二进制可执行程序,第三项,(这个很重要)这个表示支持以#!开头脚本文件。其实就是shell脚本。没有这个,你的脚本写出来,内核无法理解。
8,第八项,表示网络功能的开启。这项是支持网络功能的必备选项。linux系统最强大的功能之一网络功能。这项也是非常重要的。空格键选中为*号,回车进入配置内核网络功能。
第一项,是网络功能的选项,等会进入进行设置,主要是开启tcp/ip的支持。
第二项,这个无线网的支持,默认是开启的,但是我们要把它关闭,因为咱们这个是虚拟机,没有无线网卡,开启这个选项,很增加编译负担,既然是最小化编译,那么就应该只买合用的不买没有的。
进入第一项的二级子目录,开始配置tcp/ip的支持。
下面开始做一下简介:
第一项,这是必须的,肯定要支持,tcp/ip networking
第二项,此项表示支持,开启路由扩展支持
第三项,此项表示,是对路由扩展功能的设置,这里我们选择的是,支持策略路由。
第四项,此项表示,在内核上支持,网络属性的自动配置,旗下有很多的子选项,可以看见,dhcp协议,bootp协议的支持等等。但是这项我们并不开启,我只是做个简单的介绍,我们可是动手能力非常强的攻城狮,为什么要autoconfig呢。本着,内核最小化的原则。所以还是不要选择了。
第五项,此项表示支持,tcp syn的支持,
第六项,此项表示,去掉ipv6的支持。因为不需要支持ipv6、
第七项,此项表示,开启基于UNIX域的进程通信。不同主机进程利用tcp/ip 来支持通信,而内部则是利用UNIX domain来实现。因为内部的进程通信如果还是基于tcp/ip 那么未必有点,二逼了,消耗系统资源不说,还降低了进程的通信的效率。
我们跳过第九项先来介绍第十项,为什么呢,因为前八项都是属于,内核功能的配置,第九项属于,硬件驱动的配置。我们还是归一下类,容易区分和理解。
10,第十项,这是开启内核对于文件系统的支持。
这里我们开启对ext4文件系统的支持。
9,第九项,配置内核支持,各种硬件设备,选择回车进入查看,配置相应的设备对应的驱动程序。
分别进行介绍
第一项,通用设置进入后选择如下选项,
选择第一项表示,自动生成设备文件,在内核挂载根文件系统之后,同时挂载设备文件系统到/dev目录下。
第二项,表示支持,scsi设备的支持,进入后选择
第三项,开启对 FUSION MPT设备的支持,这主要是对scsi硬盘一些功能上的支持。
表示支持主机驱动的spi。以及启用Fusion MPT logging facility"。MPT代表"Message Passing Technology"(消息传递技术)。Fusion驱动是由LSI Logic公司开发。MPT一种进程间使用的特定消息策略。
第四项,主要是网络设备的支持。选择进入,关闭wireless,只选择以太网设备的驱动,选择如下图。
操作如图,没有什么好解释的,默认配置不要动,只需要把这些贴出来的图,你选中就可以了。
第五项,主要是输入设备的设备配置,没有什么好解释的,直接上图
第六项,主要是usb接口的设置,直接上图。
到此内核编译的配置过程已经ok了。
然后
1
|
[root@host linux] #make bzImage ##只编译核心 |
1
2
3
4
5
6
7
8
|
[root@mysql linux] # cp arch/x86/boot/bzImage /mnt/boot/ #把内核拷贝到boot目录下 [root@mysql ~] # cd /mnt/boot/grub/ [root@mysql grub] # vim grub.conf ##配置grub.conf文件 timeout 5 default 0 title T800.1 root (hd0,0) kernel /bzImage ro root= /dev/sda2 |
三,编译busybox,以及提供系统正常运行的一些配置文件,初步运行linux系统
一,安装配置编译环境,这里需要glibc-static包的支持,还有libmcrpt-devel的支持,以及下载busybox解压源码包
实施安装过程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
[root@mysql ~] # yum install -y libmcrypt-devel glibc-static [root@mysql ~] # tar xf busybox-1.21.1.tar.bz2 -C /usr/src/ [root@mysql ~] # cd !$/busybox-1.21.1/ [root@mysql busybox] make menuconfig ##过程与内核是否有点相似。 Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) #只要配置这一项就可以了,其他的都不要动。这个表示编译成静态可执行程序, #简单说就是不需要依赖系统上的#一些库,因为我们是最小化的系统, #这个系统很多库文件是没有的。如果不设置这个选项,依赖动态库的话,这 #个程序很有可能因为系统上缺少某类库而无法正常运行,甚至是不能运行。 [root@mysql busybox-1.21.1] # make && make install -------------------------------------------------- You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly. -------------------------------------------------- #以上表示编译成功 [root@mysql busybox-1.21.1] # cp -a -d _install/* /mnt/sysroot/ [root@mysql busybox-1.21.1] # cd !$ [root@mysql sysroot] # ls bin linuxrc lost+found sbin usr [root@mysql sysroot] # rm -f linuxrc #因为这是链接文件,在sbin目录下,有个init文件同样也是链接指向busybox的, #所以这个不需要。我们只需要init就可以做系统启动时所要的文件了。 [root@mysql sysroot] # mkdir -pv dev home lib64 media root sys boot \ etc/{rc.d,sysconfig} lib mnt proc var tmp #创建系统所需的常用目录。 [root@mysql grub] #vim grub.cfg #开始测试一下busybox是否可用 set timeout=15 menuentry 'Storm Platform'{ [root@mysql grub] #sync;sync;sync;sync #同步文件到磁盘上,最好是同步后等个一两秒, #再执行如下图操作不然磁盘损坏基本是要格式化这个分区然后重来一遍,你懂的。 |
挂起虚拟机,同时把宿主机的硬盘挂载到寄生机上,开启。(这步骤就补贴图了,很简单和创建一个虚拟机的过程一样,只不过在创建硬盘的时候,选择已有硬盘就可以,不需要新建)初步效果图如下,
看基本的命令都可以使用了,ls,ifconifg,等等常用命令都是可以的了。说明我们的busybox已经可以使用了,但是执行ifconfig的时候出现了一个错误,这是网络设备在内核中没有生成,后面我们会设置通过mdev -s来自动生成设备文件。
接下来进行一下简单的系统配置,grub.conf,fstab,inittab,rc.d/rc.sysinit,
首先重新配置一下。grub.conf的文件初始化脚本去掉init这个选项,我们自己编写了rc.sysinit初始化脚本程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[root@mysql etc] # vim /mnt/boot/grub/grub.conf timeout 5 default 0 title T800.1 root (hd0,0) kernel /bzImage ro root= /dev/sda2 # 去掉init选项利用下面的rc.sysinit来初始化 [root@mysql etc] # vim 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 [root@mysql etc] # cat rc.d/rc.sysinit ###配置开机初始化,脚本 #!/bin/bash # mount -n -o remount,rw /dev/sda2 / mount -a mdev -s # 自动生成设备文件 [root@mysql etc] # chmod +x rc.d/rc.sysinit ###因为是开机初始化脚本程序,所以必须给与执行权限。 [root@mysql ~] # bash bincp.sh ###这是一个脚本程序,这个程序的功能是复制可执行程序同时也会复制依赖 Plz enter a command : bash ###的库 Plz enter a command : quit ###这里表示移植bash程序。busybox里面是没有bash的但是兼容bash, ###默认支持的是ash,所以bash还是要移植的。此脚本会在后面贴出来 |
为了检验一下使用环境有木有什么错误,那就来测试一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@mysql mnt] # chroot sysroot/ bash -4.1 # pwd / bash -4.1 # ls bin dev home lib64 media proc sbin tmp var boot etc lib lost+found mnt root sys usr bash -4.1 # ifconfig ifconfig : /proc/net/dev : No such file or directory eth0 Link encap:Ethernet HWaddr 00:0C:29:CF:89:47 inet addr:192.168.199.137 Bcast:192.168.199.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 bash -4.1 # exit 从以上测试来看,应该是没有问题的。 |
好了,在挂起宿主机,开始测试系统运行情况。
到了这一步,我们已经完成了构建了一个可以运行的linux小系统了。而且可以支持网络。
四 ,编译安装dropbear提供远程ssh登录方式。
一 ,实现ssh登录的前提,你最起码要支持本地登录吧。所以首先得实现本地登录。配置如下
你要有passwd,shadow,group这些关乎民生东西都没有还登录个毛线。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
[root@mysql etc] # touch passwd shadow group [root@mysql etc] # vim passwd root:x:0:0:root: /root : /bin/bash mayershi:x:500:500:shisheng: /home/shisheng : /bin/bash [root@mysql etc] # openssl passwd -1 -salt `openssl rand -hex 4` Password: $1$70b57fe2$A6awWahj8sdzQtzdI7hhu. ###生成用户密码,基于md5加密的。 [root@mysql etc] # vim shadow root:$1$70b57fe2$A6awWahj8sdzQtzdI7hhu.:16690:0:99999:7::: mayershi:$1$70b57fe2$A6awWahj8sdzQtzdI7hhu.:16690:0:99999:7::: [root@mysql etc] #chmod go= shadow [root@mysql etc] # vi sysconfig/network #添加主机名 HOSTNAME=www #test#com ##### #代表. [root@mysql etc] # vi inittab ####添加控制台程序, ::sysinit: /etc/rc .d /rc .sysinit ::respawn: /sbin/getty 19200 tty1 ####必须调用getty实现login登录。 ::respawn: /sbin/getty 19200 tty2 ::respawn: /sbin/getty 19200 tty3 ::respawn: /sbin/getty 19200 tty4 ::respawn: /sbin/getty 19200 tty5 ::respawn: /sbin/getty 19200 tty6 ::ctrlaltdel: /sbin/reboot :: shutdown : /bin/umount -a -r |
详情见下我下一篇博文