定制Linux系统
简单回顾下系统启动的相关内容
编译过程:编译内核、busybox
为系统上的新硬盘建立分区,这里根据需要先建立一个大小为200M的主分区作为新建系统的boot分区和一个512M的分区作为目标系统(即正在构建的新系统,后面将沿用此名称)的根分区;200M的分区格式化后将其挂载至/mnt/boot目录下;512M的分区格式化后将挂载至/mnt/sysroot目录;两个分区的文件系统均为ext4。
此处还可以添加第三个分区用于swap,大小为256MB或其它你喜欢的空间额度。记得使用mkswap将其创建为swap分区。
一、编译Linux内核
1.获取内核源码,解压至/usr/src
# tar xflinux-3.13.6.tar.xz -C /usr/src/
2.创建软链接
[root@station75 src]#ln -sv linux-3.13.6/ linux
3.生成配置文件
[root@station75linux]# make allnoconfig
4.配置
[root@station75linux]# make menuconfig
主要的配置选项
64位系统支持 |
[*] 64-bit kernel |
设置版本信息 |
General setup --->() Local version - append to kernel release |
选择cpu类型 |
Processor type and features --->Processor family (Generic-x86-64) --->(X) Core 2/newer Xeon |
支持多核心 |
Processor type and features --->[*] Symmetric multi-processing support |
支持动态模块加载 |
[*] Enable loadable module support ---> |
PCI总线支持(cpu需要总线与其他模块沟通) |
Bus options (PCI etc.) --->[*] PCI support |
scsi硬盘驱动 (lspci查看硬盘类型) |
Device Drivers ---> SCSI device support ---> <*> SCSI device supportà<*> SCSI disk support 另:Device Drivers ---> [*] Fusion MPT device support ---> <*> Fusion MPT ScsiHost drivers for SPI <*> Fusion MPT misc device (ioctl) driver |
文件系统 |
File systems ---> <*> The Extended 4 (ext4) filesystem |
支持ELF(可执行文件) |
Executable file formats / Emulations à [*] Kernel support for ELF binaries <*> Kernel support for scripts starting with #! |
I/O驱动 |
Device Drivers ---> Input device support ---> [*] Keyboards ---> [*] Mice ---> 支持USB驱动Device Drivers ---> [*] USB support ---> <*> Support for Host-side USB à <*> EHCI HCD (USB 2.0) support <*> UHCI HCD (most Intel and VIA) support <*> OHCI HCD (USB 1.1) support |
实时时钟 |
Device Drivers ---> [*] Real Time Clock ---> |
devtmfs |
Device Drivers ---> Generic Driver Options --> [*] Maintain a devtmpfs filesystem to mount at /dev |
网卡 |
协议[*] Networking support ---> Networking options ---> [*] TCP/IP networking <*> Unix domain sockets 驱动Device Drivers ---> [*] Network device support ---> [*] Ethernet driver support (NEW) ---> <*> Intel(R) PRO/1000 Gigabit Ethernet support/ <*> Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support |
5.编译成bzImage
make bzImage �Cj # 指定使用几个进程编译
6.准备分区
准备分区 sda1 sda2 分别挂在至/mnt/boot/mnt/sysroot
/dev/sdb1 |
50M /mnt/boot |
/dev/sdb2 |
512M /mnt/sysroot |
swap |
256M mkswap (82) |
7.安装grub程序
grub-install--root-directory=/mnt /dev/sdb
8.
二、编译busybox
解决依赖关系:需要先安装glibc-staticfor centos(cd 2 中)
1.获取源码,解压
2.编译安装
make menuconfig
配置选项
静态编译 (不使用动态库) |
Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) |
3.编译安装
make && make install
三、定制
1.复制bzImage到 /mnt/boot下
[root@station75linux]# cp arch/x86/boot/bzImage /mnt/boot/
2.拷贝编译好的文件_install至/mnt/sysroot
[[email protected]]# cp -a _install/* /mnt/sysroot/
3.创建文件系统
主要是在/mnt/sysroot目录下创建完整的目录结构
[root@station75sysroot]# mkdir -pv etc/rc.d var/log root home lib64 dev proc sys boot mntmedia tmp srv
4.配置grub配置文件
vim/mnt/boot/grub/grub.conf
default=0 timeout=5 title Mini Linux root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init quiet |
5.初始化
/etc/inittab /sbin/init的配置文件
::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:/etc/rc.d/rc.sysdown 指定关机脚本 |
/etc/rc.d/rc.sysinit 初始化脚本
#!/bin/sh echo "Welcome" [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network [ -z "$HOSTNAME" -o "HOSTNAME" =="none" ] && HOSTNAME=localhost /bin/hostname $HOSTNAME 设置主机名 mdev �Cs mkdir /dev/pts ifconfig lo 127.0.0.1 ifconfig eth0 172.16.37.11 mount �Ca /etc/rc.d/*.start start |
/etc/fstab 自动挂载
/dev/sda1 /boot ext4 defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 devtpts /dev/pts devpts mode=620 0 0 /dev/sda2 / ext4 defaults 0 0 /dev/sda3 swap swap defaults 0 0 |
6.设定主机名
主机名设置在/etc/sysconfig/network内,创建这个目录,建立文件,
mkdir/mnt/sysroot/etc/sysconfig/network 在启动脚本中也需要读取整个文件
HOSTNAME=Mini-Linux |
7.banner信息
创建文件/mnt/sysroot/ect/issue
Welcome to the world of linux Kernel \r |
8.设置PS1信息
#export PS1='[\u@\h \W]\$' |
四、远程登录
使用dropbear远程登录(在host主机上实现),用虚拟终端登录时用户需要有家目录
1、获取源码,编译安装
./config 默认安装在usr/local下
# makePROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
# makePROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
2、移植dropbear到目标机
使用bincp.sh移植命令dropbeardropbearkey dbclient scp
这些命令会被存储于目标系统的/usr/local/sbin或/usr/local/bin目录中
3、dropbear登陆需要验证用户名,需名称解析
在宿主机上使用默认选项编译的dropbear将依赖nsswitch实现用户名称解析,因此,还需要为目标主机提供nss相关的库文件及配置文件
# cp -d /lib64/libnss_files* /mnt/sysroot/lib64/ # cp -d /usr/lib64/libnss3.so /usr/lib64/libnss_files.so /mnt/sysroot/usr/lib64/ |
配置文件
[root@station75 ~]# cp /etc/nsswitch.conf /mnt/sysroot/etc/ [root@station75 ~]# vim /mnt/sysroot/etc/nsswitch.conf passwd: files shadow: files group: files hosts: files dns ~ |
4、设置安全shell
安全起见,dropbear默认情况下仅允许其默认shell出现在/etc/shells文件中的用户远程登录,因此,这里还需要创建/etc/shells文件,并添加所有允许的shell
/bin/sh /bin/hush /bin/ash /sbin/nologin /bin/bash |
5、生成密钥文件
在目标机上生成dropbearkey文件
mkdir/mnt/sysroot/etc/dropbear
[root@station75sysroot]# dropbearkey -t rsa -s 2048 -f etc/dropbear/dropbear_rsa_host_key
[root@station75sysroot]# dropbearkey -t dss -f etc/dropbear/dropbear_dss_host_key
6、准备一些目录
mkdir/mnt/sysroot/var/run 提供pid文件存放路径
mkdir/mnt/syroot/var/lock
7、为远程登录的用户提供伪终端设备文件
编辑/mnt/sysroot/etc/fstab,添加如下一行:
devtpts /dev/pts devpts mode=620 0 0
创建目录 /# mkdir /mnt/sysroot/dev/pts
此处这样做无法正确生成会被覆盖,因此在初始化脚本中生成
8、测试调试
dropbear -F -E 运行在前端
dev/pts为什么没有
9、使dropbear开机自动启动,关机关闭
提供服务脚本,放置在/etc/rc.d/init.d(需手工创建)下见附件
复制function函数
# cp/etc/rc.d/init.d/functions /mnt/sysroot/etc/rc.d/init.d/
创建目录/etc/rc.d/rc3.d 链接 dropbear启动脚本至该目录
[[email protected]]# ln -sv ../init.d/dropbear S70dropbear 路径很重要
[root@station75 rc.d]# ln -sv init.d/dropbear dropbear.start `dropbear.start' -> `init.d/dropbear' [root@station75 rc.d]# ln -sv init.d/dropbear dropbear.stop `dropbear.stop' -> `init.d/dropbear' 到rc.sysinit中执行 |
关机脚本,在inittab中执行
#!/bin/sh sync sleep 2 sync /etc/rc.d*.stop stop /bin/umount -a -r poweroff |
五、Nginx
1、在宿主机编译安装nginx-1.2.5
实现安装pcre
# tar nginx-1.2.5.tar.gz # cd nginx-1.2.5 # ./configure --prefix=/usr/local --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --user=nginx --group=nginx --http-log-path=/var/log/nginx/access.log --without-pcre --without-http_rewrite_module --without-http_geo_module --without-http_fastcgi_module --without-http_uwsgi_module --without-http_scgi_module --without-http_memcached_module --without-http_upstream_ip_hash_module --without-http_upstream_least_conn_module --without-http_upstream_keepalive_module --http-log-path=/var/log/nginx # make # make install |
2、移植二进制程序及其依赖的库文件,方能实现其在目标系统上正常运行。建议使用前面的bincp.sh脚本进行
3、移植配置文件至目标系统
# mkdir /mnt/sysroot/etc/nginx/
# cp /etc/nginx/ /mnt/sysroot/etc/nginx/
4、移植测试页面至目标系统,当然,也可以不采用下面的步骤而在目标系统上直接创建
# mkdir/mnt/sysroot/usr/local/html
设置测页index.html
5、提供服务脚本
脚本见附件,具体步骤见dropbear
[root@station75 init.d]# ln -sv ../init.d/nginx nginx.start `nginx.start' -> `../init.d/nginx' [root@station75 init.d]# ln -sv ../init.d/nginx nginx.stop `nginx.stop' -> `../init.d/nginx' |
6、提供用户
使用输出重定向将nginx用户添加到目标主机的passwd和group文件中
7、
8、测试
启动目标主机,首先配置好网络属性,并使用adduser为其添加nginx用户和nginx组。
然后使用如下命令启动nginx,即可通过浏览器测试访问。