码迷,mamicode.com
首页 > Web开发 > 详细

使用kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务的迷你主机

时间:2016-04-29 01:59:07      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:linux   主机   迷你   

    在运维工作中很多时候我们需要裁剪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服务的迷你主机

标签:linux   主机   迷你   

原文地址:http://gzsamlee.blog.51cto.com/9976612/1768791

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!