首页 > 代码库 > 订制linux微型系统
订制linux微型系统
获取系统内核编译文件
[root@php5_6 src]# pwd 将包解压到/usr/src目录下
/usr/src
[root@php5_6 src]# ln -sv linux-3.13.6/ linux
[root@php5_6 src]# ls
debug kernels linux linux-3.13.6 ==>创建一个软链接
进入linux目录,创建一个 .config文件,
[root@php5_6 linux]# make allnoconfig
最小化配置
[root@php5_6 linux]# make menuconfig
1,配置系统信息
定义版本信息, 主机名, 支持systemv风格的进程通讯
2,支持动态装载模块,进入后选择动态卸载模块
支持动态卸载模块
3,支持使用块层
选择
4 处理器类型和特性 [cpu]
画圈处进入选择, 我的电脑是intel的,所以选择下面一项
5选择总线控制
选择支持PCI总线
6,可执行文件类型和格式
让其支持 ELF,以及#!的脚本文件
7网络支持
选择tcp/ip ,里面的具体需要,具体选择, 比如tpc多播,高级路由等 Unix domain sockets ==>支持套接字地址
8,设置驱动
1)配置网卡驱动
网络支持要有
以太网驱动支持也要有
我的是intel的网卡,所以只保留intel的 pro/1000, 不确定是PCI OR PCI-E ,所以都编译进来
无线网不要
2) SCSI硬盘驱动
3)SCSI相关
4)支持USB驱动
USB驱动选择如下
5)输入设备选择
选择鼠标,键盘
9,文件系统支持
1)
选择ext4编译到系统内核
2)支持挂载设备
选择完毕,开始编译
将硬盘分区
[root@php5_6 ~]# fdisk /dev/sdb
sdb1 50M sdb2 512M
[root@php5_6 ~]# mke2fs -t ext4 /dev/sdb1
[root@php5_6 ~]# mke2fs -t ext4 /dev/sdb2
mnt上新建两目录
[root@php5_6 ~]# mkdir /mnt/{boot,sysroot}
将刚才分的两个区,分别挂载到新建的目录下
[root@php5_6 ~]# mount /dev/sdb1 /mnt/boot [root@php5_6 ~]# mount /dev/sdb2 /mnt/sysroot
建立grub引导, --root-directory所指的目录下,一定要有一个boot的目录, 并指定建立在哪块磁盘上
[root@php5_6 linux]# grub-install --root-directory=/mnt /dev/sdb
操作系统需要用到各种操作命令,我们使用一个busybox的东西来模拟提供
下载busybox,
编译busybox需要用到 glibc-static 的库
[root@php5_6 busybox-1.22.1]# yum install glibc-static -y
配置编译菜单
[root@php5_6 busybox-1.22.1]# make menuconfig
上述内容选择好了以后,执行make make install执行安装
[root@php5_6 busybox-1.22.1]# make
[root@php5_6 busybox-1.22.1]# make install
[root@php5_6 _install]# pwd
/root/busybox-1.22.1/_install ==>编译安装完成后,把生成的_install目录下的所有文件都拷到/mnt/sysroot目录中
[root@php5_6 _install]# cp -a ./* /mnt/sysroot
很幸运,能启动
继续完善
[root@php5_6 sysroot]# vim etc/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
因为 busybox模拟的,只有getty 这一种终端,没办法,只好选择这个.
意思是说tty将会启动 /bin/login 的程序,让你输入用户名密码,进行登陆认证
[root@php5_6 sysroot]# vim etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[root@php5_6 sysroot]# vim etc/rc.d/rc.sysinit ==>中间缺少一个目录,可以先创建
#!/bin/sh
#
echo -e "welcome to custom linux"
echo "remounting root filesystem"
mount -n -o remount ,rw /dev/sda2 / # ==>让其支持以读写方式挂载文件系统
手动添加 etc/passwd 文件 etc/shadow文件 etc/group文件
[root@php5_6 sbin]# openssl passwd -l -salt `openssl rand -hex 4`
创建 /etc/profile 文件
加入一个环境变量,就能让控制的字符界面更好看些,以显示用户名,主机名,以及现在所处的操作路径
export PS1="[\u@\h \W]\\$"
用户要使用 bash要依赖于一些库文件 [bash 是 依赖于 nsswitch 文件中的库提供名称解析的]
注: nsswitch 是一个名称解析框架
包括
/lib64/libnss_files-2.12.so /lib64/libnss_files.so.2 -> libnss_files-2.12.so =>这是当前目录下的一个链接s
把这个文件和它的链接一并拷到 制作的系统下来
还有/usr/lib64 下也有要依赖的库文件,也一并拷过去
/usr/lib64/libnss3.so
/usr/lib64/libnss_files.so -> ../../lib64/libnss_files.so.2 ==>这个链接文件,链接到刚才拷到lib64的目录下了
/usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so
将这5个文件,拷到 /mnt/sysroot/usr/lib64 目录下
[root@php5_6 lib64]# cp -a -d /usr/lib64/libnss3.so /usr/lib64/libnss_files.so /usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so ../usr/lib64/
拷贝 /etc/nsswitch 到 /mnt/sysroot/etc/nsswitch
在文件中,这些内容之后的内容可以删除 [当然保留也没问题 ]
passwd: files shadow: files group: files #hosts: db files nisplus nis dns hosts: files dns
一切准备工作完成,挂起宿主机,开启定制的系统登陆, 非常顺利,OK了!
这仅能在本地登陆,要实现远程登陆,要为其提供 sshd服务,但是sshd所依赖的库太多,会使系统变得很大,
为节约资源空间,我们使用dropbeer,可用资源少,这是一个很好的解决方案
dropbear: 更小环境下,提供简单ssh远程连接服务,不仅如此,和ssh一样,可以加密的在主机之间进行交互,
通讯的安全也能得到保证
我们在宿主机上,下载dropbear,解压到/tmp目录下
[root@php5_6 dropbear-2013.58]# less INSTALL ==>查看安装说明文档
(If using a non-tarball copy, "autoconf; autoheader")
./configure (optionally with --disable-zlib or --disable-syslog, or --help for other options)
Now compile:
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" =>安全通讯所使用到的make选项
[root@php5_6 dropbear-2013.58]# ./configure =>配置及检测编译环境
[root@php5_6 dropbear-2013.58]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" 执行编译
其实上面一步已经是编译好了的 , 下面一步只是把编译好的文件移个位置,并修改权限
[root@php5_6 dropbear-2013.58]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
安装好dropbear后,使用它的dropbearkey工具生成 密钥文件
[root@php5_6 bin]# dropbearkey -t dss -f /etc/dropbear/ddh_key
[root@php5_6 bin]# dropbearkey -t rsa 2048 -f /etc/dropbear/drh_key
[root@php5_6 sbin]# dropbear -p 22022 =>启动dropbear, 因为22号端口已让ssh占用,所以要换一个端口启动服务
[root@php5_6 sbin]# ss -tnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.16.26.6:22022 172.16.26.176:51977 users:(("dropbear",5635,5)) ==>经查看,22022端口已启动
另开一个窗口,远程连接试试
OK,没问题, 那么我们可以把这个程序利用脚本拷到自定义的系统上了
注脚本会将程序文件所要依赖的库一并拷到自定义的系统相应位置, 查看程序文件需要的库,用命令 ldd 如 "ldd dropbear"
[root@php5_6 ~]# ls /usr/local/bin/ dbclient dropbearconvert dropbearkey scp =>文件需要拷到相应的位置上 /mnt/sysroot/usr/local/bin
[root@php5_6 ~]# ls /usr/local/sbin/ dropbear =>文件需要拷到相应的位置上 /mnt/sysroot/usr/local/sbin
[root@php5_6 ~]# ./cpsh.sh dbclient [root@php5_6 ~]# ./cpsh.sh dropbear [root@php5_6 ~]# ./cpsh.sh dropbearkey
[root@php5_6 ~]# ldd /usr/local/bin/scp ==>因为ssh本身也有一个scp程序, 我们单独查看一下它所依赖的库是什么, linux-vdso.so.1 => (0x00007fffdd56a000) libc.so.6 => /lib64/libc.so.6 (0x0000003809800000) /lib64/ld-linux-x86-64.so.2 (0x0000003809000000) =>很幸运,这些库我们的自定义系统上,在前面的操作中,都提供了
为目标系统创建 dropbear密钥文件
[root@php5_6 ~]# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
[root@php5_6 ~]# dropbearkey -t rsa -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
因为在目标系统上,dropbear运行时,需要在/etc/run创建一个pid文件,我们得在目标系统上,为其创建一个目录
[root@php5_6 ~]# mkdir /mnt/sysroot/var/run
需要注意的是dropbear运行,要依赖于 libnss 库,不过我们在为用户提供bash时,已经将这个问题解决,如果没有提供,拷贝解决,
请参照上面为用户提供bash时,解决libnss的过程
在dropbear远程登陆时,会检查用户所使用的shell是否为安全shell, 安全shell是 在系统 /etc/shells文件中所列出来的shell,
才认为是安全shell,我们将这个文件拷到目标系统上
[root@php5_6 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
远程登陆需要一个伪终端, 伪终端是由devpts控制的, 是在/dev/pts下 提供一个数字文件实现的,所以我们要在系统自动挂载项里,添加这一项
在目录系统中添加如下一行
devpts /dev/pts devpts defaults 0 0
但是要挂载文件系统,需要有相应的目录,现在创建在系统启动时,会执行mdev -s 以创建/dev, 又会将 /dev/pts隐藏,
所以这执行的先后次序很关键,
#!/bin/sh # echo -e "welcome to custom linux" echo "remounting root filesystem" mount -n -o remount ,rw /dev/sda2 / # create dev file echo "create dev file" mdev -s ==>创建 /dev文件系统 1
# mount all syssb echo "mount sys" mkdir /dev/pts =>创建/dev/pts [与伪终端相关的目录] 2
mount -a ==>挂载开机需要自动挂载的目录 3
ifconfig lo 127.0.0.1 netmask 255.0.0.0 ==>为网卡添加ip地址
ifconfig eth0 172.16.26.50 netmask 255.255.0.0 =>以方便工作
提供ngnix服务
在解压目录中进行编译配置
[root@php5_6 nginx-1.4.7]# useradd nginx =>首先创建nginx用户,等会指定nginx以这个用户名来运行[如不指定,会以nobody身份来运行]
[root@php5_6 nginx-1.4.7]# ./configure --user=nginx --group=nginx --conf-path=/etc/nginx/nginx.conf --without-pcre --without-http_rewrite_module
[root@php5_6 nginx-1.4.7]# make && make install
[root@php5_6 nginx-1.4.7]# cp /etc/nginx/ /mnt/sysroot/etc/nginx/
[root@php5_6 nginx-1.4.7]# cp /usr/local/nginx/ /mnt/sysroot/usr/local/nginx/
[root@php5_6 nginx-1.4.7]# vim /mnt/sysroot/etc/passwd =>手动在该文件下添加用户 nginx
nginx:x:500:500:nginx:/nginx:/sbin/nologin
[root@php5_6 nginx-1.4.7]# vim /mnt/sysroot/etc/group ==>手动在该文件下添加用户组 nginx
nginx:x:500:
关闭宿主机, 开启自定义系统主机,登陆后,执行nginx主程序,
[root@custom ~]# /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin
ok,完成
订制linux微型系统