在前面的《Linux系统-小倒腾之Linux DIY定制裁剪(附带简单网络功能)o_o(一)》博文中,我通过对一个Linux系统的裁剪,最终制作出来了一个带有网络功能的微型Linux系统;其实它就是由一个Kernel+根文件系统+外围的一些模块组成,将他们拼凑在一起而已,所以这些并不算什么高大上的事情,最终没目的还是为了更加了解Linux!所以大家看标题应该知道,本文将会再次对Linux进行裁剪,并实现nginx与dropbear这两个应用服务在我裁剪的Linux上面运行;下面我说一下实验的大概步骤(实验环境与上一次一样):

       1.准备Target使用的磁盘

       2.对磁盘分区格式化,并挂载

       3.对Target磁盘安装grub程序

       4.编译内核(选择一些必备的功能)提供bzImage

       5.编译busybox应用程序(下面介绍)提供busybox应用程序

       6. 为init提供配置文件

       7.配置主机名和banner

       8.基本测试

       9.提供dropbear应用程序(另外一种SSH服务程序)

       10.提供nginx应用程序

       11.综合测试

       以上是本文博客实验的大概步骤,其中前面的3步已经在《Linux系统-小倒腾之Linux DIY定制裁剪(附带简单网络功能)o_o(一)》中演示过了,再此我就不再贴出步骤啦,我直接从第4步开始;9-11步我将放在下篇博文中进行;如果各位看官有问题,请留言,Thanks!


前提条件:

       以下实验中请提前安装好各开发包组,否则编译会报错!

[root@station10 ~]# yum groupinstall -y "Development tools"
[root@station10 ~]# yum groupinstall -y "Desktop Platform Development"
[root@station10 ~]# yum groupinstall -y "Server Platform Development"

================编译Linux kernel/提供bzImage================

1.解压kernel源码包

[root@station10 ~]# tar -xf linux-3.13.6.tar.xz -C /usr/src/
[root@station10 ~]# cd /usr/src/
[root@station10 src]# ln -sv linux-3.13.6 linux
`linux' -> `linux-3.13.6'
[root@station10 src]# cd linux
[root@station10 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
#
[root@station10 linux]# make menuconfig #→此命令执行后会会出现以下这些提示信息并马上会弹出一个Kernel配置界面出来
[root@station10 linux]# make menuconfig
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/mconf.o
  HOSTLD  scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig

wKiom1M64rHSOP51AAPckgCCUwU825.jpg

通过该配置文件我选择了基本的一些功能(具体项请下载附件)

选定基本的项目后退出(系统提示会将选择的这些项目保存到该路径下的.config文件中)


2.cp该目录下的.config文件到/root/到/root目录下留作备份使

[root@station10 linux]# cp .config /root/config-3.13.6-x86_64

3.执行make bzImage,编译开始

经过漫长的等待,编译完成;将生成的内核文件拷贝至Target的boot分区(即/mnt/boot)

注意:在前一次的博文中我只做了两个分区作为Target的boot分区以及根分区,此次我将多分出一个区作为swap分区

[root@station10 linux]# cp arch/x86_64/boot/bzImage /mnt/boot/

===============编译busybox应用程序提供busybox应用程序===============

       什么是busybox?

       BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。

       BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一个比较完善的环境,可以适用于任何小的或嵌入式系统。

       下面就去动手操作一下吧

1.解压获取到的busybox压缩包

[root@station10 ~]# tar -xf busybox-1.22.1.tar.bz2 -C /usr/src/
[root@station10 ~]# cd /usr/src/busybox-1.22.1/
[root@station10 busybox-1.22.1]#

2.执行make menuconfig(与内核编译时相似,会出现一个配置界面)

wKioL1M6-fuRf4xjAANvwZrpZYc350.jpg

由于它需要手动改变的项目很少,所以只需要按照以下步骤去做即可:

#Busybox Settings  --->
##General Configuration  --->
###[*] Build BusyBox as a static binary (no shared libs)

选择此项,是将该应用程序编译成静态二进制格式程序,这就意味着它所依赖的库文件不再以动态方式去链接,它也就没有库文件,因为在编译时直接就编译到自身了,这样就使得它的空间和性能得到很好的提升,故此这里选择该项.完成后退出

3.执行执行make

[root@station10 busybox-1.22.1]# make

OH! make命令执行过程中报错了...

wKiom1M7AT3wxl3-AACiaDouDkY118.jpg

原因:上面在编译busybox时选择了静态编译模式;而在静态编译程序时就会用到glibc-static这个程序包,所以安装上这个包即可顺利通过(包位置在第二张系统盘内)

[root@station10 busybox-1.22.1]# yum install -y glibc-static
#再一次make
[root@station10 busybox-1.22.1]# make
#完成后make install

OK!编译完成后在当前目录的_install目录下就生成了一些文件

wKioL1M9Y2-yVrjFAACZdUaCcZ8363.jpg

其中的三个目录中就提供包含了一个Linux系统应有的绝大多数常用命令

4.移植busybox应用程序

#将busybox应用程序文件copy至Target的根目录
[root@station10 busybox-1.22.1]# cp -a _install/* /mnt/sysroot/
[root@station10 busybox-1.22.1]# ls /mnt/sysroot/
bin  linuxrc  lost+found  sbin  usr
#补全所需的其他目录
[root@station10 busybox-1.22.1]# mkdir -p etc/rc.d var/{log,run} root home lib64 dev proc sys boot mnt media tmp srv usr/lib64
[root@station10 busybox-1.22.1]# cd /mnt/sysroot/
[root@station10 sysroot]# ls
bin  boot  dev  etc  home  lib64  lost+found  media  mnt  proc  root  sbin  srv  sys  tmp  usr  var
bin  linuxrc  lost+found  sbin  usr
[root@station10 sysroot]# rm -rf linuxrc
[root@station10 sysroot]# ls sbin/
acpid       fbsplash     halt       insmod    loadkmap  mkfs.ext2   poweroff     start-stop-daemon  udhcpc
adjtimex    fdisk        hdparm     ip        logread   mkfs.minix  raidautorun  sulogin            vconfig
arp         findfs       hwclock    ipaddr    losetup   mkfs.vfat   reboot       swapoff            watchdog
blkid       freeramdisk  ifconfig   iplink    lsmod     mkswap      rmmod        swapon             zcip
blockdev    fsck         ifdown     iproute   makedevs  modinfo     route        switch_root
bootchartd  fsck.minix   ifenslave  iprule    mdev      modprobe    runlevel     sysctl
depmod      fstrim       ifup       iptunnel  mkdosfs   nameif      setconsole   syslogd
devmem      getty        init       klogd     mke2fs    pivot_root  slattach     tunctl
[root@station10 sysroot]#

5.配置grub.conf引导文件

[root@station10 sysroot]# vim ../boot/grub/grub.conf
default=0
timeout=2
title Larry Linux (1.0)
        root (hd0,0)
        kernel /bzImage ro root=/dev/sda2 init=/sbin/init quiet
[root@station10 sysroot]# sync

6.第一次尝试启动(Target的创建我在这里就不说了请看上次博文第9步)

启动时

wKiom1M9a43jGClyAAFObBpcEzE119.jpg

启动后

wKioL1M9awCzHSRqAANys1k6xJE673.jpg

ok,busybox应用程序现在已经安装完成,再进一步的去完它

====================为定制Linux创建所需文件====================

1.为init提供配置文件

(1)创建/etc/rc.sysinit文件

[root@station10 ~]# cd /mnt/sysroot/etc/
[root@station10 etc]# vim rc.d/rc.sysinit
#!/bin/sh
#
#欢迎短语
echo -e "\tWelcome to \033[34mLarry\033[0m Linux"
#判断、设置主机名
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost
/bin/hostname $HOSTNAME
#设置命令提示符
str=$"(Repair filesystem)"
PS1="$str \# # "; export PS1
#挂载伪文件系统
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
#虚拟终端所需目录
mkdir /dev/pts
#在grub中根是只读的,将其重新挂载为读写
mount -o remount,rw /
#设置IP,实现初始化系统时配置上IP地址
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.41.200
mount -a
[root@station10 etc]# chmod +x rc.d/rc.sysinit

(2)创建/etc/inittab文件,提供虚拟终端

[root@station10 etc]# vim inittab
::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 19200 tty1
::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

2.为定制Linux系统提供passwd, group, shadow文件

#++++++++++++++++++++++++用户帐号文件++++++++++++++++++++++++
[root@station10 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@station10 ~]# head -1 /etc/passwd > /mnt/sysroot/etc/passwd
[root@station10 ~]# tail -1 /etc/passwd
guomaoqiu:x:500:500::/home/guomaoqiu:/bin/bash
[root@station10 ~]# tail -1 /etc/passwd >> /mnt/sysroot/etc/passwd
[root@station10 ~]# tail /mnt/sysroot/etc/passwd
root:x:0:0:root:/root:/bin/bash
guomaoqiu:x:500:500::/home/guomaoqiu:/bin/bash
[root@station10 ~]#
#++++++++++++++++++++++++用户组文件++++++++++++++++++++++++
[root@station10 ~]# head -1 /etc/group
root:x:0:
[root@station10 ~]# head -1 /etc/group > /mnt/sysroot/etc/group
[root@station10 ~]# tail -1 /etc/group
guomaoqiu:x:500:
[root@station10 ~]# tail -1 /etc/group >> /mnt/sysroot/etc/group
[root@station10 ~]# tail /mnt/sysroot/etc/group
root:x:0:
guomaoqiu:x:500:
[root@station10 ~]#
#++++++++++++++++++++++++用户密码文件++++++++++++++++++++++++
[root@station10 ~]# head -1 /etc/shadow
root:$6$BjOvO9nU$D8yuO9WIByQTEoKlUyFeCx9DWrkWNWzmHg4uUvarpE47nrHheJlOUNeZl***7hmQjKHGX8fCOANfCXjUSyL31.:16161:0:99999:7:::
[root@station10 ~]# head -1 /etc/shadow > /mnt/sysroot/etc/shadow
[root@station10 ~]# tail -1 /etc/shadow
guomaoqiu:$6$caU3ijAy$Mdb2bSG7km9mg4e5TwgJCkhnYMGcglXt4x90YBKwcLnq4Uw2iOBPBXIzvxY4Bz0Re3nBUYiAVaTlbnoqJEsHN/:16161:0:99999:7:::
[root@station10 ~]# tail -1 /etc/shadow >> /mnt/sysroot/etc/shadow
[root@station10 ~]# tail /mnt/sysroot/etc/shadow
root:$6$BjOvO9nU$D8yuO9WIByQTEoKlUyFeCx9DWrkWNWzmHg4uUvarpE47nrHheJlOUNeZl***7hmQjKHGX8fCOANfCXjUSyL31.:16161:0:99999:7:::
guomaoqiu:$6$caU3ijAy$Mdb2bSG7km9mg4e5TwgJCkhnYMGcglXt4x90YBKwcLnq4Uw2iOBPBXIzvxY4Bz0Re3nBUYiAVaTlbnoqJEsHN/:16161:0:99999:7:::
[root@station10 ~]#
#由于busybox对于sha512的加密没有很好的兼容性,所以这里才用md5的加密密码去替换即可
[root@station10 ~]# openssl passwd -1 #用openssl命令生成
Password:
Verifying - Password:
$1$44JNhWzY$dvFrjxxOHgdA7O2Rz9c0Z0
[root@station10 ~]# vim /mnt/sysroot/etc/shadow
root:$1$44JNhWzY$dvFrjxxOHgdA7O2Rz9c0Z0:16161:0:99999:7:::
guomaoqiu:$1$44JNhWzY$dvFrjxxOHgdA7O2Rz9c0Z0:16161:0:99999:7:::
[root@station10 ~]# chmod 400 /mnt/sysroot/etc/shadow

3.为定制版Linux定义主机名文件

[root@station10 etc]# mkdir sysconfig
[root@station10 etc]# vim sysconfig/network
HOSTNAME=statino20.example.com
[root@station10 etc]#

4.为定制版Linux定义banner

[root@station10 etc]# vim issue
Larry Linux
Kernel \r on an \m
[root@station10 etc]#

Ok!现在我尝试启动一下,

还是老规矩啦,挂起宿主机,开启Target

Picture-1(登录界面)

wKiom1M9k6iQl7xIAAELvES-5Z0036.jpg

Picture-2(登录后)

wKiom1M9lUXDSTVIAADbNSYznWw675.jpg

Picture-3(网络信息)

wKiom1M9lm3Qw7TIAALxI2Pt1q8014.jpg

Picture-4(普通用户登录尝试)

wKiom1M9mJyA607jAADv2YuLnyo127.jpg

OK! 至此一个定制版的Linux系统已经差不多搭建完成

接下来的内容我将完成从宿主机上面移植两个应用程序到Target的实验;有兴趣的请关注下篇博客!