定制属于自己的 linux 内核(Step 2)
在上次的话题中我们通过安装引导MBR与移植主要二进制文件(bash),完成了
最基础的linux内核定制初步的工作,至此我们也可以总结一下linux的启动流程
为接下来的更为自助化的定制打下基础.
用一张图来关注一下流程:
用一张表来了解一下每个方块的作用
我们接下来的步骤将会围绕这两幅图来展开, 我们将会以宿主机添加磁盘定制
之后实验机装载磁盘的方式进行测试工作
1. 整理磁盘分区操作
# 此段遵循 上一篇文章 前 (8 步的操作
# 安装grub文件
grub-install root-directory=/mnt /dev/sdb
# 编写grub.conf文件
default=0 timeout=5 title "Mini Linux" root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init
2. 编译内核
# 下载内核源码 请 内核下载
tar xf linux-3.13.6.tar.xz -C /usr/src cd /usr/src # 创建链接 ln -sv linux-3.13.6 linux cd linux # 安装开发包组 yum groupinstall "Development Tools" make allnoconfig make menuconfig
# 进入到内核选择将所有项编译进内核,符号 * , 选项如下, 缩进即为选项的层次关系
-> 64 bit kernel (64位支持) -> gerernal setup -> local version (当前编译版本号) -> Enable loadable modual support (允许模块加载) -> Progressor type and features -> Processor Family(Core2) (架构类型) -> Symmetric multi-processing support(多核支持) -> SMT (超线程 可选) -> Bus Options(PCI etc.) -> PCI support (pci总线支持) -> Device Drivers -> SCSI device support -> SCSI deveice support -> SCSI disk support -> Fusion MPT device support (虚拟磁盘支持) -> Fusion MPT logging facility (虚拟磁盘日志 可选) -> Fusion MPT ScsiHost drivers for SPI (虚拟磁盘) -> Fusion MPT misc device (ioctl) driver (磁盘可做初始化) -> Input Device support -> Keyboards (键盘支持) -> Mice (ps/2支持) -> Mouse interface (鼠标接口 可选) -> USB support -> Support for Host-side USB -> EHCI HCD (USB 2.0) support (usb 2.0) -> xHCI HCD (USB 3.0) support (usb 3.0可选) -> OHCI HCD (USB 1.1) support (usb 1.1) -> UHCI HCD (most Intel and VIA) support (可选) -> Gernal Driver Options -> Maintain a devtmpfs filesystem to mount at /dev (使用devtmpfs机制挂载设备文件) -> Automount devtmpfs at /dev, after the kernel mounted the rootfs (内核自动探测自动挂载) -> Network device support -> Network core driver support (网络核心驱动程序) -> Ethernet driver support (以太网卡驱动程序) -> Intel devices -> Intel(R) PRO/1000 Gigabit Ethernet support () -> Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support (板载网卡驱动) -> File system -> The Extended 4 (ext) filesystem -> Executable file formats / Emulations (可执行文件系统) -> Kernel support for ELF binaries (支持ELF二进制程序) -> Kernel support for scripts starting with #! (支持bash脚本) -> Networking support -> Networking options -> Unix domain sockets -> UNIX: socket monitoring interface -> TCP/IP networking -> IP: multicasting (ip多播协议) -> IP: advanced router (高级路由协议) -> IP: kernel level autoconfiguration (内核级别配置) -> IP: DHCP support (DHCP服务) -> IP: BOOTP support (早起DHCP服务) -> IP: RARP Support (局域网ip,mac转换协议) -> IP: TCP syncookie support (tcp同步状态支持)
# 选择结束后,make menuconfig会生成.config文件在当前目录下
# 仅编译内核,使用4线程编译 make bzImage -j 4 # 编译完毕,拷贝内核到/mnt/boot中,这将是未来我们要使用的新内核 cp /usr/src/linux/arch/x86_64/boot/bzImage /mnt/boot/
3. 安装busybox
# 下载busybox, 请 busybox下载
# 依赖环境 glibc-static 下载 , 请 http://rpmfind.net/linux/rpm2html/search.php?query=glibc-static&submit=Search+...
# 为busybox安装解决依赖 rpm -ivh glibc-static.rpm # 解压busybox到当前目录 tar xf busybox-1.21.1.tar.bz2 # 类似与内核的选择框,需要选择 * Busybox Settings ---> Build Options ---> ---> Build BusyBox as a static binary (no shared libs) # 选择完毕退出后安装busybox make && make install
# 在安装完毕后busybox当前目录会生成 _install 文件
# 完成后将当前目录 _install 中所有文件复制到 /mnt/sysroot 中 cp -rd _install/* /mnt/sysroot # 由最开始的图中我们知道,精简内核的运行依靠 busybox, 那busybox运行 # 需要依赖某些二进制文件及库文件,因此可以使用 上一篇 10步骤的脚本移植 # busybox 的二进制及库文件
4. 依次提供下列文件,为精简内核的运行做准备 etc/inittab etc/rc.d/rc.sysinit etc/fstab
[root@King200 sysroot]# cat etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 swap swap defaults 0 0
[root@King200 sysroot]# cat etc/rc.d/rc.sysinit #!/bin/sh # echo -n "\t Welcome to \033[33m Mini \033[0m Linux" [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network [ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost /bin/hostname $HOSTNAME echo "proc filesystem" mount -t proc proc /proc echo "sysfs filesystem" mount -t sysfs sysfs /sys mdev -s ifconfig lo 127.0.0.1 ifconfig eth0 172.16.43.1 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts if [ -f /etc/profile.d/.bashrc ]; then . /etc/profile.d/.bashrc fi vim /etc/profile.d/.bashrc export PS1="[\u@\h \w]$ " export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" # 注意此文件编译完毕,要更改权限 chmod +x etc/rc.d/rc.sysinit
[root@King200 sysroot]# cat etc/rc.d/rc.sysinit #!/bin/sh # echo -n "\t Welcome to \033[33m Mini \033[0m Linux" [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network [ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost /bin/hostname $HOSTNAME echo "proc filesystem" mount -t proc proc /proc echo "sysfs filesystem" mount -t sysfs sysfs /sys mdev -s ifconfig lo 127.0.0.1 ifconfig eth0 172.16.43.1 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts if [ -f /etc/profile.d/.bashrc ]; then . /etc/profile.d/.bashrc fi vim /etc/profile.d/.bashrc export PS1="[\u@\h \w]$ " export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
[root@King200 sysroot]# cat 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
5. 提供 密码,shadow,group信息 还有nsswitch文件及库文件(登陆准备)
[root@King200 /]# head -1 /etc/passwd > /mnt/sysroot/etc/passwd [root@King200 /]# tail -1 /etc/passwd >> /mnt/sysroot/etc/passwd [root@King200 /]# head -1 /etc/group > /mnt/sysroot/etc/group [root@King200 /]# tail -1 /etc/group >> /mnt/sysroot/etc/group [root@King200 /]# head -l /etc/shadow > /mnt/sysroot/etc/shadow [root@King200 /]# head -1 /etc/shadow > /mnt/sysroot/etc/shadow [root@King200 /]# tail -1 /etc/shadow >> /mnt/sysroot/etc/shadow
[root@King200 lib64]# ls libnss # /usr/lib64 libnss3.so libnssdbm3.so libnss_nisplus.so libnssutil3.so libnssckbi.so libnss_dns.so libnss_nis.so libnss_winbind.so libnss_compat.so libnss_files.so libnsspem.so libnss_wins.so libnssdbm3.chk libnss_hesiod.so libnsssysinit.so [root@King200 lib64]# cp libnss3.so /mnt/sysroot/usr/lib64/ [root@King200 lib64]# cp libnssutil3.so /mnt/sysroot/usr/lib64/ [root@King200 lib64]# cp libnss_files.so /mnt/sysroot/usr/lib64/ [root@King200 lib64]# cp -d /lib64/libnss_files* /mnt/sysroot/lib64/
6. 最后检查是否已准备好所有所需文件
cp /etc/issue /mnt/sysroot/etc/ cp /etc/shells /mnt/sysroot/etc/
# etc 下这些文件或目录请确保完备
fstab inittab nsswitch.conf shadow sysconfig
group issue passwd rc.d shells
7. 为定制的内核中安装第一个服务dropbear用于远程登陆
#下载dropbear 请 dropbear下载
# 编译安装 ./configure make PROGRAMS="dropbear dbclient dropbearkey scp" make PROGRAMS="dropbear dbclient dropbearkey scp" install # 使用移植脚本将 dropbear dbclient dropbearkey scp 二进制文件及 # 库文件全部移植到 /mnt/sysroot下
# dropbear生成密钥
mkdir /mnt/sysroot/etc/dropbear dropbearkey -t rsa -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key -s 2048 dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
8. 将当前宿主机关闭,开始测试
# 我们可以看到定制的欢迎界面和登陆后开启dropbear服务器的端口信息
9) 开机启动dropbear
# 在 /mnt/sysroot/etc/rs.c/rs.sysinit 最后一行加入 /etc/rc.d/rc3.d/*.start start mkdir /mnt/sysroot/var/lock/subsys -p mkdir /mnt/sysroot/etc/rc.d/init.d # 编写服务脚本 vim /mnt/sysroot/etc/rc.d/init.d/dropbear
服务脚本如下:
#!/bin/sh # # description: dropbear ssh daemon # chkconfig: 2345 66 33 # dsskey=/etc/dropbear/dropbear_dss_host_key rsakey=/etc/dropbear/dropbear_rsa_host_key lockfile=/var/lock/subsys/dropbear dropbear=/usr/local/sbin/dropbear dropbearkey=/usr/local/bin/dropbearkey keysize=1024 port=22 gendsskey() { [ -d /etc/dropbear ] || mkdir /etc/dropbear echo "Starting generate the dss key: " $dropbearkey -t dss -f $dsskey &> /dev/null RETVAL=$? if [ $RETVAL -eq 0 ]; then return 0 else return 1 fi } genrsakey() { [ -d /etc/dropbear ] || mkdir /etc/dropbear echo "Starting generate the rsa key: " $dropbearkey -t rsa -s $keysize -f $rsakey &> /dev/null RETVAL=$? if [ $RETVAL -eq 0 ]; then return 0 else return 1 fi } start() { [ -e $dsskey ] || gendsskey [ -e $rsakey ] || genrsakey if [ -e $lockfile ]; then echo "dropbear is already running: " exit 0 fi echo -n "Starting dropbear: " $dropbear -p $port -d $dsskey -r $rsakey RETVAL=$? echo if [ $RETVAL -eq 0 ]; then touch $lockfile return 0 else rm -f $lockfile return 1 fi } stop() { if [ ! -e $lockfile ]; then echo "dropbear service is stopped: " exit 1 fi echo "Stopping dropbear daemon: " killproc dropbear RETVAL=$? echo if [ $RETVAL -eq 0 ]; then rm -f $pidfile return 0 else return 1 fi } status() { if [ -e $lockfile ]; then echo "dropbear is running..." else echo "dropbear is stopped..." fi } usage() { echo "Usage: dropbear {start|stop|restart|status|gendsskey|genrsakey}" } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; gendsskey) gendsskey ;; genrsakey) genrsakey ;; *) usage ;; esac
# 将服务脚本链接为 dropbear.start dropbear.stop 实现开机关机启动与关闭 mkdir /mnt/sysroot/etc/rc.d/rc3.d ln -sv /mnt/sysroot/etc/rc.d/init.d/dropbear /mnt/sysroot/etc/rc.d/rc3.d/dropbear.start ln -sv /mnt/sysroot/etc/rc.d/init.d/dropbear /mnt/sysroot/etc/rc.d/rc3.d/dropbear.stop chmod +x /mnt/sysroot/etc/rc.d/init.d/dropbear
最终开机如8) 图所示,可以实现在精简内核上服务的开机启动
接下来的事情计划:
Step3 交叉编译将Centos跑在 Raspberry pi 上
Step4 编译安卓源码,定制个性化的android 上
Step5 完成异构平台的并行计算
本文出自 “Apprentice” 博客,请务必保留此出处http://apprentice.blog.51cto.com/2214645/1389340
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。