在运维工作中很多时候我们需要裁剪Linux系统,减少系统性能的消耗,提升系统服务的性能,以往通过光盘安装的Linux都是比较臃肿的,但出现这样的需求后,我可以对Linux进行重新编译再busybox工具移植即可实现,接下来我们一步一步实现kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务:
实现过程如下:
一.规划子主机的磁盘存储规划
1.添加一个大小为10G的硬盘
2.查询系统硬件信息参数:
# 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)
#在真实生产环境中执行内核编译之前我们必须了解系统硬件参数信息。
3.分区格式化挂载以及安装grub
创建3个分区大小为:50M 512M 256M(swap)
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1305, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +50M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (8-1305, default 8): Using default value 8 Last cylinder, +cylinders or +size{K,M,G} (8-1305, default 1305): +512M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 3 First cylinder (74-1305, default 74): Using default value 74 Last cylinder, +cylinders or +size{K,M,G} (74-1305, default 1305): +256M Command (m for help): t Partition number (1-4): 3 Hex code (type L to list codes): 82 Changed system type of partition 3 to 82 (Linux swap / Solaris)
格式化分区
# mke2fs -t ext4 /dev/sdb1 # mke2fs -t ext4 /dev/sdb2 # mkswap /dev/sdb3
创建挂载目录并挂载
# mkdir -p /mnt/{boot,sysroot} # mount /dev/sdb1 /mnt/boot/ # mount /dev/sdb2 /mnt/sysroot/ # cd /mnt/sysroot/ # mkdir -p etc/rc.d/init.d bin sbin root home dev proc sys lib lib64 var/log usr/{local,share} boot etc/sysconfig media mnt tmp
安装grub
# 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是否安装成功
# cd /mnt/boot/ # ls grub lost+found
有以上文件证明安装成功。
二.内核编译环境的配置以及下载内核源码包至系统中编译内核
1.yum安装编译环境开发组包
# yum -y groupinstall "Development tools"
2.防止在编译安装配置.config文件时无法启用tui界面,同时也要安装ncurses,以及ncurses-devel
# yum -y install ncurses-devel
3.解压内核源码至/usr/src目录并且创建软连接为linux,方便后期编译使用
# tar xf linux-3.13.6.tar.xz -C /usr/src/ # cd /usr/src/ # ln -sv linux-3.13.6 linux `linux‘ -> `linux-3.13.6‘ # cd linux
4.清空内核编译所有配置选择
# 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.编译内核选择配置
# make menuconfig
内核编译选项介绍:
1.第【1】项,此项设置该系统为64位的操作系统(此项必须选择,如果编译32位系统,那么库文件可能会出现不兼容的现象)
2.第【2】项,为通用设置选择并进入进行配置,配置如下:
选项1表示自定义系统内核的名称,(回车后就可以进入设置了,我定义了opensamlee-201109)
选项2表示支持进程间通信。这个也是必须开启的
3.第【3】项,为启动加载模块支持选项。进入并且选择。相应选项。选项如下:
意思是支持模块卸载以及强制卸载模块(这里解释一下,为什么要支持这个功能,我们明明都是将所有功能都直接配置到了内核为什么还要启动这个模块功能呢,答案是为了以后可以更好的扩展,假如有新的硬件添加进来呢,那我们岂不是有点难为自己了,又要重新编译内核一遍)
4.第【4】项,此项表示开启块设备支持,此项默认打开。其他版本的内核源码默认没有打开,需要自己打开。不然的话,无法支持块存储设备。比如我们接下来要设置的scsi接口的块存储设备。
5.第【5】项,此项表示选择cpu的架构以及调整一些cpu的参数。
选项1是开启对称多处理器支持
选项2是cpu的型号品牌选择进入选择如下图,表示cpu是AMD系列的,如果不清楚cpu类型及品牌就可以选择"Generic-x86-64" (操作系统版本为:64所示)
选项3是第一项一旦开启此项就会默认开启,此项便是开启多核心调度
6.第【6】项是总线支持的配置选择并进入
这3项分别代表的意思是,开启pci总线支持,开启pci-e的支持
7,第【7】项,表示默认可执行文件的格式。(这项很重要,不开启那么就ELF二进制程序就不支持)
## 主要选择这三项,如果选择第一项,默认第二项会被选择
## 第一项和第二项表示内核支持ELF二进制可执行程序,
## 第三项,(这个很重要)这个表示支持以#!开头脚本文件。
## 其实就是shell脚本。没有选择这个,你的脚本写出来,内核无法解释。
8.第【8】项,表示网络功能的开启。这项是支持网络功能的必备选项。
第1项,是网络功能的选项,等会进入进行设置,主要是开启tcp/ip的支持。
第2项,这个无线网的支持,默认是开启的,但是我们要把它关闭,因为咱们这个是虚拟机,没有无线网卡,开启这个选项,很增加编译负担,既然是最小化编译,那么就应该只买合用的不买没有的。
进入第一项的二级子目录,开始配置tcp/ip的支持。
选项1:开启基于UNIX域的进程通信。不同主机进程利用tcp/ip 来支持通信,而内部则是利用UNIX domain来实现。
选项2:开启tcp/ip networking网络支持。
选项3:开启路由扩展支持
选项4:是对路由扩展功能的设置,这里我们选择的是,支持策略路由。
选项5:在内核上支持,网络属性的自动配置,旗下有很多的子选项,可以看见,dhcp协议,bootp协议的支持。
选项6:开启tcp syn的支持
选项7:关闭ipv6协议支持
9.第【9】项,配置内核支持各种硬件设备。
选项1:通用设置进入后如下所示:
选项1:自动生成设备文件,在内核挂载根文件系统之后,同时挂载设备文件系统到/dev目录下。
选项2:开启支持scsi设备的支持,进入选项后如下:
选项3:开启对 Fusion MPT设备的支持,这主要是对scsi硬盘一些功能上的支持。
表示支持主机驱动的spi。以及启用Fusion MPT logging facility"。MPT代表"Message Passing Technology"(消息传递技术)。Fusion驱动是由LSI Logic公司开发。MPT一种进程间使用的特定消息策略。
选项4:主要是网络设备的支持。选择进入,关闭wireless,只选择以太网设备的驱动,选择如下:
选项5:主要是输入设备的设备配置。
选项6:主要是usb接口的设置
10.第【10】项,这是开启内核对于文件系统的支持。
到此内核编译的配置过程已经好了!
开始编译过程:
# make bzImage #只编译核心
配置子主机配置文件:
# cp arch/x86/boot/bzImage /mnt/boot/ #把内核复制到boot目录下 # cd /mnt/boot/grub/ #建立grub配置文件 # vim grub.conf default=0 timeout=3 title opensamlee-201109 root (hd0,0) kernel /bzImage ro root=/dev/sda2
三,编译busybox,以及提供系统正常运行的一些配置文件,运行子linux系统:
安装配置编译环境,这里需要glibc-static包的支持,还有libmcrpt-devel的支持,以及下载busybox解压源码包
实现过程如下:
# yum -y install libmcrypt-devel glibc-static # tar xf busybox-1.22.1.tar.bz2 -C /usr/src/ # cd /usr/src/busybox-1.22.1/ # make menuconfig Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) #只要配置这一项就可以了,其他的都不要动。这个表示编译成静态可执行程序, #简单说就是不需要依赖系统上的#一些库,因为我们是最小化的系统, #这个系统很多库文件是没有的。如果不设置这个选项,依赖动态库的话,这 #个程序很有可能因为系统上缺少某类库而无法正常运行,甚至是不能运行。 # make && make install -------------------------------------------------- You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly. ------------------------------------- #以上表示编译成功 # cp -a -d _install/* /mnt/sysroot/ # cd !$ # ls bin linuxrc lost+found sbin usr # rm -f linuxrc #因为这是链接文件,在sbin目录下,有个init文件同样也是链接指向busybox的, #所以这个不需要。我们只需要init就可以做系统启动时所要的文件了。 # vim /mnt/boot/grub/grub.conf #开始测试一下busybox是否可用 timeout 5 default 0 title T800-kernel.1.version root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init #sync;sync;sync;sync #同步文件到磁盘上
挂起主机,启动子主机测试:
子主机启动结果如下:
##基本的命令都可以使用,ls,ifconifg,等等常用命令都是可以的了。说明我们的busybox已经可以使用了,但是执行ifconfig的时候出现了一个错误,这是网络设备在内核中没有生成,后面我们会设置通过mdev -s来自动生成设备文件。
接下来我们通过创建系统配置文件:grub.conf,fstab,inittab,rc.d/rc.sysinit,完善子系统功能:
编辑grub.conf的文件去掉init这个选项,再编写了rc.sysinit初始化脚本程序:
[root@mysql etc]# vim /mnt/boot/grub/grub.conf default=0 timeout=3 title opensamlee-201109 root (hd0,0) kernel /bzImage ro root=/dev/sda2 # 去掉init选项利用下面的rc.sysinit来初始化 # vim /mnt/sysroot/etc/fstab ###配置开机挂载文件系统 /dev/sda1 /boot ext4 defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 /dev/sda2 / ext4 defaults 0 0 /dev/sda3 swap swap defaults 0 0
创建子主机系统配置文件及系统初始化脚本:
# vim /mnt/sysroot/etc/rc.d/rc.sysinit #!/bin/sh # echo -e "\tWelcome to \033[34mopensamlee Mini System\033[0m Linux" echo "mounting sysfs filesystem....." mount -n -o remount,rw /dev/sda2 / echo "mounting proc filesystem....." mount -t proc proc /proc echo "mounting sysfs filesystem....." mount -t sysfs sysfs /sys mdev -s # 自动生成设备文件 ifconfig lo 127.0.0.1 ifconfig eth0 172.16.100.8 mount -a mount # chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit #赋予执行权限
创建系统初始化配置inittab文件:
# vim /mnt/sysroot/etc/inittab ::sysinit:/etc/rc.d/rc.sysinit console::respawn:-/bin/sh ::ctrlaltdel:/bin/reboot ::shutdown:/bin/umount -a -r
创建脚本复制程序命令脚本,用于复制命令至子系统中:
脚本内容如下:
[root@localhost ~]# vim bincp.sh #!/bin/bash # target=/mnt/sysroot clearCmd() { if which $cmd &> /dev/null; then cmdPath=`which --skip-alias $cmd` else echo "No such command" return 5 fi } cmdCopy() { cmdDir=`dirname $1` [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir} [ -f ${target}${1} ] || cp $1 ${target}${cmdDir} } libCopy() { for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do libDir=`dirname $lib` [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir} [ -f ${target}${lib} ] || cp $lib ${target}${libDir} done } while true; do read -p "Enter a command: " cmd if [ "$cmd" == ‘quit‘ ] ;then echo "quit" exit 0 fi clearCmd $cmd [ $? -eq 5 ] && continue cmdCopy $cmdPath libCopy $cmdPath done # ./bincp.sh #这是一个脚本程序,这个程序的功能是复制可执行程序同时也会复制依赖 Enter a command: bash #bash的库 Enter a command: quit #这里表示移植bash程序。busybox里面是没有bash的但是兼容bash #默认支持的是ash,所以bash还是要移植的。
检测子主机使用环境是否有错误:
# chroot /mnt/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:23:35:1B inet addr:172.16.100.7 Bcast:172.16.255.255 Mask:255.255.0.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:16436 Metric:1 bash-4.1# exit exit #以上检测无错误显示,说明是正常的!
启动子主机,如下所示:
看到此景,证明我们已经完成了一个简单Linux系统定制了!嘻嘻
编译安装dropbear提供远程ssh登录方式
1.实现ssh登录的前提,你最起码要支持本地登录吧。所以首先得实现本地登录。配置如下:
#创建用户数据库文件:passwd,密码影子文件:shadow,用户组文件:group
# touch /mnt/sysroot/etc/{passwd,shadow,group} # vim /mnt/sysroot/etc/passwd root:x:0:0:root:/root:/bin/bash opensamlee:x:500:500:samlee test:/home/samlee:/bin/bash #生成用户密码 # openssl passwd -1 -salt `openssl rand -hex 4` Password: $1$c4a375d4$e53cXyHuwv4E3O.MI07de0 # openssl passwd -1 -salt `openssl rand -hex 4` Password: $1$44b86f2b$8FzshSRcyoI9RtOZsmvL/. # vim /mnt/sysroot/etc/shadow root:$1$c4a375d4$e53cXyHuwv4E3O.MI07de0:16690:0:99999:7::: opensamlee:$1$44b86f2b$8FzshSRcyoI9RtOZsmvL/.:16990:0:99999:7::: # chmod go= /mnt/sysroot/etc/shadow # vim /mnt/sysroot/etc/group root:x:0: opensamlee:x:500 # vim /mnt/sysroot/etc/sysconfig/network #设置主机名 HOSTNAME=www#samlee#com # #号代表. # vim /mnt/sysroot/etc/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:/bin/reboot ::shutdown:/bin/umount -a -r
设置PS1变量,在命令行显示主机名:
# echo "export PS1=$PS1" > /mnt/sysroot/etc/profile # vim /mnt/sysroot/etc/profile export PS1=[\u@\h \W]\$ # vim /mnt/sysroot/etc/rc.d/rc.sysinit #!/bin/sh # echo -e "\tWelcome to \033[34mopensamlee Mini System\033[0m Linux" echo "mounting sysfs filesystem....." mount -n -o remount,rw /dev/sda2 / echo "mounting proc filesystem....." mount -t proc proc /proc echo "mounting sysfs filesystem....." mount -t sysfs sysfs /sys mdev -s ifconfig lo 127.0.0.1 ifconfig eth0 172.16.100.8 mount -a [ -r /etc/sysconfig/network ] && source /etc/sysconfig/network [ -z "$HOSTNAME" -o "$HOSTNAME" == ‘(none)‘ ] && hostname localhost || hostname $HOSTNAME #倒数一二行表示,开机读取主机名的脚本
本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1768791
使用kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务的迷你主机
原文地址:http://gzsamlee.blog.51cto.com/9976612/1768791