自定制Linux微型系统

本节我们将通过编译内核源码来搭建一个自定制的微型Linux系统,并且配上一个busybox来实现一些最基本的内容,最后我们在这基础上加上一个远程登录的功能。好了废话不多说,下面我们就来开始介绍吧。

 

准备工作

1、在宿主机中安装开发环境

[root@localhost ~]# yum -y groupinstall "Development tools" "Server Platform Development"
[root@localhost ~]# yum -y install "ncurses-devel"

2、在宿主服务器添加一块磁盘,作为微型Linux系统的主磁盘。

这里我添加了一块10G的磁盘/dev/sdb

首先创建2个分区(具体的操作过程这里就不给了,讲的实在太多了)

创建好之后对分区进行格式化

[root@localhost ~]# mke2fs -t ext4 /dev/sdb1
[root@localhost ~]# mke2fs -t ext4 /dev/sdb2

并创建挂载点进行挂载:在/mnt下创建boot和sysroot目录

[root@localhost ~]# mount  /dev/sdb1 /mnt/boot
[root@localhost ~]# mount  /dev/sdb2 /mnt/sysroot

创建grub

[root@localhost ~]# grub-install  --root-directory=/mnt  /dev/sdb

创建grub配置文件

[root@localhost ~]# vim /mnt/boot/grub/grub.conf
timeout=5
default=0
title Linux 8
    root (hd0,0)
    kernel /bzImage ro root=/dev/sda2 init=/sbin/init

OK,环境就先准备这些。

 

编译内核

首先要到网络去下载内核源码,这里我用的是linux-3.13.6的版本进行编译的

解压内核源码

[root@localhost ~]# tar xf linux-3.13.6.tar.xz -C /usr/src/

创建软连接

[root@localhost src]# ln -sv linux-3.13.6/  linux
[root@localhost src]# cd linux/

配置内核模块参数

[root@localhost linux]# make allnoconfig
[root@localhost linux]# make menuconfig

编译内核模块参数

先来一张整体的截图

1、选择64位内核

2、General setup --> Local Version - append to kernel release --> 自定义版本号

删除字符需要使用Ctrl+Backspace

 

General setup --> System V IPC    进程间通信的

3、支持动态装卸载模块

Enable loadable module support --> Module unloading

       

4、支持使用块层

Enable the block layer --> Block layer SG support v4

  

5、Processor类型和特性

Processor type and features

--> Processor family (Core2/newer Xeno) 处理器

--> Symetric muliti-processing support 对称多处理器

--> Muliti-core scheduler support 多核调度支持

6、总线

Bus options(PCI etc.)

-->PCI support

7、可支持文件类型和格式

Exectuable file formats /Emulations

--> Kernel support for ELF binaries 支持ELF格式

--> Kernel support for scripts starting with #! 支持以#!开头的脚本格式

8、网络

Networking support

    -->Networking options

        -->TCP/IP networking

9、驱动

Device Drivers

支持临时挂载文件系统

Device Driver Options

-->Maintain a devtmpfs filesystem to mount at /dev

--> Automount devtmpfs at /dev,after the kernel mount... 并自动挂载

 

硬盘相关

-->SCSI device support

    -->SCSI device support

        -->SCSI disk support

MTP相关

-->Fusion MPT device support

    -->Fusion MPT ScsiHost drivers for SPI

    -->Fusion MPT logging facility

 

USB接口配置

-->Input device support 键盘鼠标 

-->USB support

  -->xHCI HCD (USB3.0) support

  -->EHCI HCD (USB2.0) support

  -->OHCI HCD (USB1.1) support

  -->UHCI HCD (most Intel and VIA) support

-->Mouse interface 鼠标接口

-->Keyboards 键盘

-->Mice-->PS/2 mouse ps2的鼠标

网卡驱动 (注意这里一定要与自己的主机的环境一致,不然网卡无法驱动)

Device Drivers

    -->Network device support

        -->Network core driver support 网络核心驱动支持

        -->Ethernet driver support 以太网驱动支持

10.文件系统

File systems

-->The Extended 4 (ext4) filesystem 支持ext4文件系统

 

好了可以进行编译了

[root@localhost linux]#make –j  4

编译好之后

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

 


编译安装busybox

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

下面我们进行编译安装

[root@localhost ~]# tar xf busybox-1.22.1.tar.bz2

使用静态编译的模式,将依赖于glibc-static

[root@localhost ~]# yum -y install glibc-static,libcrypt
[root@localhost ~]# cd  busybox-1.22.1
[root@localhost busybox-1.22.1]# make menuconfig

只需要修改一项

BusyBox Settings

    Build BusyBox as a static binary (no shared libs) 编译成为一个静态

[root@localhost busybox-1.22.1]# make && make install

会生成一个_install目录

将此目录中的所有复制到/mnt/sysroot目录中

cp -a * /mnt/sysroot

在/mnt/sysroot中创建根文件系统需要的一些目录

[root@localhost sysroot]# mkdir /mnt/sysroot/{proc,sys,dev,home,boot,root,tmp,var,lib64,mnt,media,etc}

 

提供相应的配置文件

/mnt/sysroot/etc/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
devpts  /dev/pts devpts  defaults  0 0

 


 

/mnt/sysroot/etc/inittab   提供初始化脚本的指定,开启伪终端的指定,定义ctrl+alt+del

::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 19200 tty1
::respawn:/sbin/getty 19200 tty2
::respawn:/sbin/getty 19200 tty3
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

 

/mnt/sysroot/etc/shells   提供安全的shell环境

/bin/sh
/bin/ash
/bin/tcsh
/bin/bash
/sbin/nologin

 

/mnt/sysroot/etc/rc.d/rc.sysinit      系统进一步初始化脚本

#!/bin/sh  
 #    
 echo -e "Welcome to MiniLinux"    
 echo "Remouting root filesystem"    
 mount -n -o remount,rw /dev/sda2  /    #创建远程连接虚拟终端需要的pts文件夹    
 mkdir /dev/pts    #挂载fstab文件中的所有设备文件    
 mount -a    #创建设备文件    mdev -s
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network

[ -z "$HOSTNAME" -o "$HOSTNAME" == ‘(none)‘ ] && hostname localhost || hostname $HOSTNAME    主机名相关 
ifconfig eth0 172.16.106.254           配置网卡信息   
ifconfig lo 127.0.0.1
for i in /etc/rc.start/*            
do           
    $i start     
done

 

/mnt/sysroot/etc/passwd提供账号

root:x:0:0::/root:/bin/sh

 

/mnt/sysroot/etc/shadow    提供密码

openssl passwd -1 -salt `openssl rand -hex 4`    生成密码

root:密码:..........

 

/mnt/sysroot/etc/profile    环境变量

export PS1=‘[\u@\h \W]\$‘   
export PATH=‘/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin‘

以上步骤完成之后一个简单的可以基于tty登录的微型系统就OK了。

我们可以验证一下:

 

 

提供远程连接服务

在安装之前提供相应的名称解析库

其中基于文件的名称解析,所依赖的共享库文件有

/lib64/libnss_files-2.12.so

/lib64/libnss_files.so.2

/usr/lib64/libnss3.so

/usr/lib64/libnsspem.so

/usr/lib64/libnsssysinit.so

/usr/lib64/libnssutil3.so


创建目录并复制程序

# cp -a -d /lib64/libnss_files* /mnt/sysroot/lib64
# mkdir /mnt/sysroot/usr/lib64
# cp -a -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64
# cp -a -d /usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64

提供nsswitch.conf配置文件

# cp /etc/nsswitch.conf /mnt/sysroot/etc/
passwd:     files   
shadow:     files    
group:      files
#hosts:     db files nisplus nis dns   
hosts:      files dns

 

编译安装dropbear

安装dropbear可以查看帮助文档

less INSTALL

安装步骤:

[root@localhost ~]# tar xf dropbear-2013.58.tar.bz2
[root@localhost ~]# cd dropbear-2013.58/

直接装在MiniLinux

./configure

注:

默认安装在/usr/local,可以自定义指定安装后的目录

如果需要配置在编译之前可以修改安装目录下的options.h

make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

 

使用bincp.sh将dropbear相关命令移植到MiniLinux中

先提供bincp.sh的脚本

#!/bin/bash  
#    
target=/mnt/sysroot/

[ -d $target ] || mkdir $target

preCommand() {  
    if which $1 &> /dev/null; then    
    commandPath=`which --skip-alias $1`    
    return 0    
    else    
    echo "No such command."    
    return 1    
    fi    
}

commandCopy() {  
    commandDir=`dirname $1`    
    [ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}    
    [ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}    
}

libCopy() {  
    for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do    
    libDir=`dirname $lib`    
    [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}    
    [ -f ${target}${lib} ] || cp $lib ${target}${libDir}    
    done    
}

read -p "Plz enter a command: " command

until [ "$command" == ‘quit‘ ]; do

  if preCommand $command ; then  
    commandCopy $commandPath    
    libCopy $commandPath    
  fi

  read -p "Plz enter a command: " command  
done

 

 

 

dropbear的使用:启动dropbear

选项:

    -d dsskeyfile

    -r rsakeyfile

    -F 在前台运行

    -E 指定错误输出位置为标准错误输出

    -s 禁止基于密码的认证,只能基于密钥的认证

    -P 指定pid文件位置,默认/var/run/dropbear.pid

    -p 指定家庭的地址和端口 [address:]port

    -h 查看帮助

dropbearkey命令:创建dropbear所需的密钥文件

选项:

    -t 加密算法    dss、rsa

    -s 密码长度

    -f 密钥位置

    -h 查看帮助

注:密钥权限默认为600

创建目录

# mkdir -p /mnt/sysroot/etc/dropbear    #dropbear的密钥文件存放位置
# mkdir -p /mnt/sysroot/var/run    #pid文件所在的目录

创建dss形式的密钥文件

# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key

创建rsa形式的密钥文件,指定密钥长度为2048

# dropbearkey -t rsa -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key


 

好了这些完成之后我们的远程接入功能也应该可以实现了。可以测试一下

OK,登录成功。

 

本节的内容就讲到这里,欢迎大家批评指正!

本文出自 “linux菜鸟的IT之路丶” 博客,请务必保留此出处http://wiggin.blog.51cto.com/8733640/1544960

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。