Linux学习笔记<二十一>——busybox制作小系统

制作流程:

kernel->initrd(busybox)->rootfs(busybox)

kernel:直接利用/boot/vmlinuz-`uname -r`内核镜像或手动编译生成

initrd:编译busybox,在busybox的基础上建立initrd

rootfs:同样在busybox的基础上建立rootfs

一、为小系统上的新硬盘建立分区并挂载在宿主机的相应目录,以便创建修改文件。

/dev/hda1    100M    boot分区    挂载在/mnt/boot

/dev/hda2    512M    根分区     挂载在/mnt/sysroot

二、编译内核源代码,为新系统提供一个所需的内核(假设源代码包位于/usr/src目录中)

①直接利用/boot/vmlinuz-`uname -r`内核镜像

cp /boot/vmlinuz-`uname -r` /mnt/boot/bzImage

②手动编译生成内核镜像

# cd  /usr/src

# tar jxvf linux-2.6.38.5.tar.bz2

# cd linux-2.6.38.5

# make menuconfig

根据实际和规划选择所需要的功能;本实例计划制作一个具有网络的功能的微型linux且不打算使用内核模块,因此,这里选择把本机对应的网卡驱动直接编译进了内核。因为使用的是vmware Workstation虚拟机,所以所需的网上驱动是pcnet32的,其它的均可按需要进行选择。选择完成后需要保存至当前目录下.config文件中。

# make  SUBDIR=arch/

# cp arch/x86/boot/bzImage  /mnt/boot

提示:为了实现后面的功能,请务必将文件系统中的ext3和网卡的驱动程序直接编译进内核;否则,就需要手动装载这些相关文件系统的模块;

三、编译busybox

(假设busybox源代码在/usr/src目录中)

# cd /usr/src

# tar  -jxvf  busybox-1.20.2.tar.bz2

# cd  busybox-1.20.2

# mkdir include/mtd

# cp  /usr/src/linux-2.6.38.5/include/mtd/ubi-user.h  include/mtd/

# make menuconfig

说明:

1、此处需要选择 Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;但你也可以不选择此项,而完成编译后把其依赖的共享库复制至目标系统上的/lib目录中即可;这里采用后一种办法。

2、修改安装位置,方法为:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix。安装后的文件均位于选定的安装位置目录中;

# make  install

需要复制一份刚安装在/usr/src/busybox-1.20.2/_install下的busybox至/mnt/sysroot,以实现initrd和rootfs的分开制作。

# cp /usr/src/busybox-1.20.2/_install/* /mnt/sysroot -a

四、制作initrd

# cd /usr/src/busybox-1.20.2/_install

1、建立initrd中的rootfs:

# mkdir -pv  proc  sys  etc/init.d  tmp  dev  mnt/sysroot

2、创建两个必要的设备文件:

# mknod  dev/console  c  5  1

# mknod  dev/null  c  1  3

3、为initrd制作init程序,此程序的主要任务是实现rootfs的切换,因此,可以以脚本的方式来实现:

# rm  linuxrc

# vim  init

添加如下内容:

#!/bin/sh

mount -t proc proc /proc

mount -t sysfs sysfs /sys

insmod /lib/modules/jbd.ko

insmod /lib/modules/ext3.ko

mdev -s

mount -t ext3 /dev/hda2  /mnt/sysroot

exec  switch_root  /mnt/sysroot  /sbin/init

给此脚本执行权限:

chmod  +x  init

4、制作initrd

# find  .  | cpio  --quiet  -H newc  -o  | gzip  -9 -n > /mnt/boot/initrd.gz

五、为小系统创建所需的引导程序

# grub-install  --root-directory=/mnt  /dev/hda

说明:此处的/dev/hda为目标系统所在的那块新磁盘;

接下来为grub建立配置文件:

# vim  /mnt/boot/grub/grub.conf

添加类似如下内容:

default        0

timeout        3

title    CQY‘ Linux (2.6.38.5)

root (hd0,0)

kernel /bzImage ro root=/dev/hda2 quiet

initrd /initrd.gz

六、创建真正的根文件系统

# cd  /mnt/sysroot

1、建立rootfs:

# mkdir -pv  proc  sys  etc/rc.d/init.d  tmp  dev/pts  boot  var/log  usr/lib

2、创建两个必要的设备文件:

# mknod  dev/console  c  5  1

# mknod  dev/null  c  1  3

3、建立系统初始化脚本文件

# vim  etc/rc.d/rc.sysinit

添加如下内容:

#!/bin/sh

echo -e "\tWelcome to  \033[31mCQY‘s\033[0m Linux"

echo -e "Remounting the root filesystem ..."

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mount -o  remount,rw  /

echo -e "Creating the files of device ..."

mdev -s

echo -e "Mounting the filesystem ..."

mount -a

swapon -a

echo -e "Starting the log daemon ..."

syslogd

klogd

echo -e "Configuring loopback interface ..."

ifconfig  lo  127.0.0.1/24

ifconfig eth0 192.168.0.111/24

# END

而后让此脚本具有执行权限:

chmod +x  etc/init.d/rc.sysinit

4、配置init及其所需要inittab文件

# cd  /mnt/sysroot

# rm  -f  linuxrc

为init进程提供配置文件:

# vim  etc/inittab

添加如下内容:

::sysinit:/etc/rc.d/rc.sysinit

console::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

5、为系统准备一个“文件系统表”配置文件/etc/fstab

# vim  etc/fstab

添加如下内容:

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/hda1               /boot                   ext3    defaults        0 0

/dev/hda2               /                       ext3    defaults        1 1

6、由于在rc.sysinit文件中启动了日志进程,因此系统在运行中会产生大量日志并将其显示于控制台;这将会经常性的打断正在进行的工作,为了避免这种情况,我们这里为日志进程建立配置文件,为其指定将日志发送至/var/log/messages文件;

# vim  etc/syslog.conf

添加如下一行:

*.info    /var/log/messages

七、为系统添加用户账号(基于宿主机内的用户信息)

1、为目标主机建立passwd帐号文件

# cd /mnt/sysroot

# vim etc/passwd

添加如下内容:

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

而后为root用户创建“家”目录:

# mkdir root

2、为目标主机建立group帐号文件

# vim  etc/group

添加如下内容:

root:x:0:

3、为目标主机建立shadow影子口令文件,这里采用直接复制宿主机的shadow文件中关于root口令行的行来实现

# grep  "^root"  /etc/shadow  > etc/shadow

注:等目标主机启动时,root用户的口令也是宿主机的root用户的口令。您可以在目标主机启动以后再动手更改root用户的口令。

4、将 etc/inittab文件改为如下内容:

::sysinit:/etc/init.d/rc.sysinit

::respawn:/sbin/getty 9600 tty1

::respawn:/sbin/getty 9600 tty2

::shutdown:/bin/umount -a -r

::ctrlaltdel:/sbin/reboot

八、在系统登录时提供banner信息

# vim  /mnt/sysroot/etc/issue

添加如下内容:

Welcome to CQY‘s Linux...

Kernel \r

九、在系统启动时为系统提供主机名称

1、创建保存主机名称的配置文件

# mkdir /mnt/sysroot/etc/sysconfig

# vim  /etc/sysconfig/network

添加如下内容:

HOSTNAME=marion.example.com

2、编辑系统初始化脚本,实现开机过程中设定主机名称

# vim /mnt/sysroot/etc/init.d/rc.sysinit

在文件尾部添加如下行:

HOSTNAME=

[ -e  /etc/sysconfig/network  && -r /etc/sysconfig/network ] && source /etc/sysconfig/network

[ -z ${HOSTNAME} ] && HOSTNAME="localhost"

/bin/hostname  ${HOSTNAME}

十、在系统登录时提供banner信息

这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:

# vi  /etc/issue

添加如下内容:

Welcome to MageEdu Linux(http://www.magedu.com)...

Kernel \r

十一、在系统启动时为系统提供主机名称

这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:

1、创建保存主机名称的配置文件

# mkdir /etc/sysconfig

# vi  /etc/sysconfig/network

添加如下内容:

HOSTNAME=marion.example.com

2、编辑系统初始化脚本,实现开机过程中设定主机名称

# vi /etc/init.d/rc.sysinit

在文件尾部添加如下行:

HOSTNAME=

[ -e  /etc/sysconfig/network  && -r /etc/sysconfig/network ] && source /etc/sysconfig/network

[ -z ${HOSTNAME} ] && HOSTNAME="localhost"

/bin/hostname  ${HOSTNAME}

十一、通过dropbear为系统提供ssh远程连接服务

1、编译安装dropbear (假设dropbear源代码在/usr/src/内)

# cd /usr/src

# tar xf dropbear-2013.56.tar.bz2

# cd dropbear-2013.56

# ./configure

# make

# make install

2、移植dropbear至目标系统

移植二进制程序及其依赖的库文件,方能实现其在目标系统上正常运行。建议使用脚本进行(这里将其保存为cpso.sh),其会自动移植指定的命令及依赖的库文件。

#!/bin/bash

#

DEST=/mnt/sysroot

libcp() {

LIBPATH=${1%/*}

[ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH

[ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."

}

bincp() {

CMDPATH=${1%/*}

[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH

[ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH

for LIB in  `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do

libcp $LIB

done

}

read -p "Your command: " CMD

until [ $CMD == ‘q‘ ]; do

! which $CMD &> /dev/null && echo "Wrong command" && read -p "Input again:" CMD && \ continue

COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`

bincp $COMMAND

echo "copy $COMMAND finished."

read -p "Continue: " CMD

done

接下来运行此脚本,分别输入dropbear、dropbearkey和dbclient即可;这些命令和命令所依赖的库文件会被存储于目标系统的对应目录中。

3、为远程登录的用户提供伪终端设备文件

编辑/mnt/sysroot/etc/fstab,添加如下一行:

devpts /dev/pts devpts mode=620 0 0

创建所需要的目录:

# mkdir /mnt/sysroot/dev/pts

4、为目标系统的dropbear生成主机密钥

默认情况下,dropbear到/etc/dropbear目录中查找使用的rsa格式主机密钥(默认名称为dropbear_rsa_host_key)和dss格式的主机密钥(默认名称为dropbear_dss_host_key)。其中,rsa格式可使用不同长度的密钥,但dss格式只使用1024位的密钥。

# mkdir /mnt/sysroot/etc/dropbear

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

# dropbearkey -t rsa -f /etc/dropbear/dropbear_dss_host_key

在生成rsa格式的key时,其长度指定部分-s 2048可以省略,也可以为其指定为其它长度,但长度需要为8的整数倍。

说明:此步骤也可以在目标主机上进行,但路径要做相应的修改。

5、定义安全shell

安全起见,dropbear默认情况下仅允许其默认shell出现在/etc/shells文件中的用户远程登录,因此,这里还需要创建/etc/shells文件,并添加所有允许的shell。

# cat >> /mnt/sysroot/etc/shells << EOF

/bin/sh

/bin/ash

/bin/hush

/bin/bash

EOF

6、为目标主机提供网络服务转换机制

在宿主机上使用默认选项编译的dropbear将依赖nsswitch实现用户名称解析,因此,还需要为目标主机提供nss相关的库文件及配置文件。

# cat >> /mnt/sysroot/etc/nsswitch.conf << EOF

passwd:     files

shadow:     files

group:      files

hosts:      files dns

EOF

复制所需要的库文件:

# cp -d /lib/libnss_files*  /mnt/sysroot/lib/

# cp -d /usr/lib/libnss3.so /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/

时间: 2024-08-03 18:14:19

Linux学习笔记<二十一>——busybox制作小系统的相关文章

Linux学习笔记二:Linux的文件处理命令

1.文件处理命令:ls 作用:显示目录文件 语法:ls [选项] [文件或目录] [选项]:-a 显示所有文件,包括隐藏文件   -l 显示详细信息 -d 查看目录属性 [文件或目录]:当省略时默认将当前路径作为参数 实例: · ls 显示当前文件夹下所有文件(不包括隐藏文件)的信息 · ls -l 显示当前文件夹下所有文件(不包括隐藏文件)的详细信息 · ls -ld  显示当前文件夹的详细信息 技巧:要查看文件夹的信息,必须加-d参数:要查看详细参数,必须加-l参数. 2.文件的属性 使用”

马哥学习笔记二十一——LVS DR模型

kernel parameter: arp_ignore: 定义接收到ARP请求时的响应级别: 0:只要本地配置的有相应地址,就给予响应: 1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应: arp_announce:定义将自己地址向外通告时的通告级别: 0:将本地任何接口上的任何地址向外通告: 1:试图仅向目标网络通告与其网络匹配的地址: 2:仅向与本地接口上地址匹配的网络进行通告: curl命令选项: --cacert <file> CA证书 (SSL) --capath &l

linux学习笔记二:硬盘信息查询

在linux管理中,硬盘管理是很重要的一部分.包括阵列,分区,逻辑卷等操作,在对硬盘操作前,需要充分的了解硬盘的信息.常用的硬盘查询有以下几种: 1.df  查看文件系统空间使用情况: linux-lszd-db:~ # dfFilesystem     1K-blocks     Used Available Use% Mounted on/dev/sda6      809262496 37615092 770825244   5% /udev             8076412    

linux学习笔记二:linux文件系统

各大linux的版本都遵循着FHS(Filesystem Hierarchy Standard)文件系统目录标准,是一个树形结构的组织文件.在此简要记录各目录. linux下所有文件都处在/文件下. 树形结构图: /boot:  系统启动相关的文件 主要文件 1.vmliunx:内核    2.initramfs:磁盘映像文件   3.grub(bootloader) /dev:设备文件 块设备:随机访问设备. 字符设备:线性设备,顺序访问.按字符为单位.键盘.鼠标. 设备号:主设备号(majo

Linux学习笔记——硬盘分区和安装双系统

1.前言 假设电脑上已经安装了windows XP或者windows7.试图在使用windows的同时,在电脑上安装ubuntu. 假设电脑上已经存在C盘.D盘.E盘和F盘,且E盘和F盘的剩余空间较大. 假设ubuntu系统需要40G空间.     [使用软件]傲梅分区助手     [最终目标]为安装ubuntu系统节省出40G左右的空闲空间.40G空间来自于E盘空闲部分和F盘空闲部分.     [步骤简述] [1]从E盘节省出20G空间. [2]从F盘也节省出20G空间. [3]在E盘节省出的

kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记

本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6.x系列操作系统下KVM优化的点,有很多都是默认支持开启了的,除了采用virtio方式的磁盘IO,与网络IO接口优化之外,其它真是无需太多优化. 1. CPU性能优化 (1) 服务器或宿主机主板BIOS中开启Intel Virtualization Technology(简称VT), 如果主板支持In

Linux学习笔记(二)——主机规划及磁盘分区

最近进行系统性的学习Linux系统,读了鸟哥的Linux私房菜,摘录学习笔记如下: 1)  在Linux系统中,每个装置都被当成一个档案来对待,每个装置都会有装置文件名. 2)  磁盘的装置文件名主要分为IDE接口的/dev/hd[a-d]及 SATA/SCSI/USB界面的/dev/sd[a-p]两种: 3)  整颗磁盘的第一个扇区非常重要,因为他记录了整颗磁盘的重要信息!磁盘的第一个扇区主要记录了两个重要的信息,分别是: 主要启动记录区(Master Boot Record, MBR):可以

(转)【D3D11游戏编程】学习笔记二十一:Cube Mapping及其应用之一:天空盒的实现

(注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 这一节讨论有关纹理映射的进阶内容:Cube Mapping. 1. 简介 单从名字上,就大概可以看出点端倪了,翻译成中文为立方体映射,因此肯定跟立方体有关系.确实,Cube Mapping就是使用六张正方形的图片来进行纹理映射的.这六张图片分别对应了一个立方体中的六个面.由于这个立方体是轴对齐的,因此每个面可以用坐标系中的六个轴方向来惟

Linux学习笔记 第十一课 shell基础知识

一.shell特性 1.history !! !$ !n !str 2.tab 命令补全 3.alias 和 unalias 4.通配符 * ?  [ ] 5.输入输出重定向 >, >>, <, << , 2>, 2>>, &>,&>> 二.变量      1.系统变量 set  env export 2.变量命名规则 3.取消变量  unset 4.变量引用:``  ' '  " " 三.系统和个