lsof交叉编译_20-3.自制小型LINUX系统,内核编译,busybox介绍

自制小型linux系统

分析得知:

引导grub,内核和initramfs三样不可缺少。

执行的第一个进程/sbin/init因为需要的配置文件太多也没必要,我们可以直接进入系统后第一个进程改为bash shell(让/sbin/init指向它)

安装(拷贝)需要的软件程序到这个linux系统中(包括它需要的库文件等),这样一个简单的liunx系统便完成了。

具体步骤

分区并创建文件系统

fdisk /dev/sdb

分两个必要的分区

/dev/sdb1对应/boot /dev/sdb2对应根 /

mkfs.ext4 /dev/sdb1

mkfs.ext4 /dev/sdb2

(mkswap /dev/sdb3)

挂载boot

mkdir /mnt/boot

子目录的目录名必须为boot,父目录没要求但下面要指明父目录(因为要用--root,详细查看man帮助grub)

mount /dev/sdb1 /mnt/boot (可以不挂载根/dev/sdb2)

安装grub

grub-install --root-directory=/mnt /dev/sdb

恢复内核和initramfs文件

也可以kernel安装包安装,rpm --root=/dev/sdb2 --nodeps,不过这样会没有initramfs文件,因为脚本会执行错误,所以还得手动生成它,不如直接拷贝

- 或者更好的方法是yum --installroot=/dev/sdb2 install kernel.x86_64 ,前提是配置了yum源,这样做不仅能装好根和initramfs等,还能创建好许多必要的文件夹。

cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/

cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot

建立grub.conf

vim /mnt/boot/grub/grub.conf

注意有细微的几项差别,以及注意了在这里写的root是sda2(虽然当前是sdb2,但是拆掉此设备到其他机器上时就是sda2了)

title simple_linux

root (hd0,0)

kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2

selinux=0 :selinux关闭

init=/bin/bash :指定bash

initrd /initramfs-2.6.32-642.el6.x86_64.img

chroot /mnt/sysroot

创建一级目录

mkdir /mnt/sysroot

mount /dev/sdb2 /mnt/sysroot

mkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

复制bash和相关库文件(利用编写的cpcmd脚本)

复制相关命令及相关库文件

如:ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid等

注意复制的时候也是要创建一个文件夹,然后把将来要作为根分区的分区(sdb2)挂载上去,然后把cpcmd脚本中的目标目录改为此文件夹,进行拷贝即可。

当然最好还是用busybox。

注意点

还是用yum安装内核的方式比较好,因为它会把所有的模块也给安装上,这样的话网络功能也能够启用,只需要进入bash shell之后把网络驱动给载入即可(可以尝试下用init启动)。

insmod e1000.ko 命令来加载模块,注意要提前拷贝这个模块。

如果想要开机之后能把除了根之外的boot分区挂载上(包括其他分区),以及启动网络功能进行各种初始化操作。可以直接在grub.conf中的init=/bin/bash中自己写一个bash脚本,然后添加上各种初始化设置,让init指向它即可(当然也要把原本的bash给添加到这个脚本里面,就相当于再原来的bash脚本基础上增添一些操作)

内核编译

单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制

内核组成部分:

kernel:内核核心,一般为bzImage,通常在/boot目录下名称为 vmlinuz-VERSION-RELEASE

kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/

[ ]: N :代表不启用此功能

[M]: M :启用此功能但是会把模块放在lib/modules中

[*]: Y :启用功能并将模块放在vmlinuz中

辅助文件:ramdisk

initrd

initramfs

前提:

(1) 准备好开发环境

(2) 获取目标主机上硬件设备的相关信息

(3) 获取目标主机系统功能的相关信息

例如:需要启用相应的文件系统

(4) 获取内核源代码包

www.kernel.org

开发环境准备

包组

Development Tools

目标主机硬件设备相关信息

CPU:

cat /proc/cpuinfo

x86info -a

lscpu

硬件设备

PCI设备:

lspci

-v

-vv

lsusb

-v

-vv

lsblk 块设备

了解全部硬件设备信息

hal-device:CentOS 6

安装系统

安装开发包组

下载源码文件

.config:准备文本配置文件

make menuconfig:配置内核选项

make [-j #]

make modules_install:安装模块

make install :安装内核相关文件

安装bzImage为/boot/vmlinuz-VERSION-RELEASE

生成initramfs文件

编辑grub的配置文件

编译内核示例

tar xf linux-VERSION.tar.xz -C /usr/src

cd /usr/src

#n -sv linux-4.20.2 linux

cd /usr/src/linux-VERSION

cp /boot/config-$(uname -r) ./.config

make help

make menuconfig :需要安装一些包才能执行此命令

make -j 2

make modules_install

make install

reboot

编译内核

配置内核选项

支持“更新”模式进行配置:make help

(a) make config:基于命令行以遍历的方式配置内核中可配置的每个选项

(b) make menuconfig:基于curses的文本窗口界面

(c) make gconfig:基于GTK (GNOME)环境窗口界面

(d) make xconfig:基于QT(KDE)环境的窗口界面

支持“全新配置”模式进行配置

(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置

(b) make allyesconfig: 所有选项均回答为“yes“

(c) make allnoconfig: 所有选项均回答为“no“

编译

全编译:make [-j #]

编译内核的一部分功能:

(a) 只编译某子目录中的相关代码

cd /usr/src/linux

make dir/

(b) 只编译一个特定的模块

cd /usr/src/linux

make dir/file.ko

示例:只为e1000编译驱动:

make drivers/net/ethernet/intel/e1000/e1000.ko

如何交叉编译内核:

编译的目标平台与当前平台不相同

make ARCH=arch_name

要获取特定目标平台的使用帮助

make ARCH=arch_name help

示例:

make ARCH=arm help

在已经执行过编译操作的内核源码树做重新编译

需要事先清理操作:

make clean:清理大多数编译生成的文件,但会保留config文件等

make mrproper: 清理所有编译生成的文件、 config及某些备份文件

make distclean:mrproper、清理patches以及编辑器备份文件

卸载内核

删除/lib/modules/目录下不需要的内核(对应内核的module)库文件

(删除/usr/src/linux/目录下不需要的内核源码:根据自己装的源码位置来删除)

删除/boot目录下启动的内核和内核映像文件

更改grub的配置文件,删除不需要的内核启动列表(6中手写title的项目删除,而7中在完成了前面步骤之后直接grub2-mkconfig重新生成就会自动删除掉去掉的内核项)

注意点:

内核因为配置项太多,因此用菜单模式来选择。我们可以参考已有的文本配置文件来生成菜单并进行修改。

这个已有的文本配置文件就是在已经编译安装好的linux内核中boot文件夹中的config_VERSION文件

其中y代表打入内核,m代表模块中,not set并注释就代表没有启动此功能。

将此已经存在的配置文件拷贝并命名为.config作为参考来执行下一步的make menuconfig

自己编译内核可将NTFS文件系统功能给启用,修改的时候用菜单方式修改(需要利用1中说的参考的文本配置文件,不然项目太多一个一个改也麻烦也不现实)

安装时分为安装模块和安装内核两步。

一个linux系统中可以同时装多个内核,因此直接编译安装新内核即可。

之前做过rpm安装内核包的实验,boot中会出现两个内核文件和相对应的initramfs.img,以及lib/modules中也会出现两个内核版本文件夹。

开机的时候选择载入哪个内核即可,(如果是手动添加的内核,当然这需要修改grub.conf中的设置,新加一个title即可。用命令make modules_install和make install命令添加的自动就会添加到grub.conf(或grub.cfg)文件中)

make menuconfig需要安装一些依赖的包才能执行,根据提示一个一个装

基于最小化的安装包环境(装包组的话太多了)

yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel

openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree screen lsof tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils

menu通用设置中的local version可以自己书写一下,其中写的就是内核中前面主版本号后面写的内容。注意最开头处加上横杠-比较好,比如-myversion-1.0.

修改需要修改的项目比如NTFS之后保存,然后就会修改掉.config文件。之后便会根据它进行编译。可以查看一下它是否确实修改了。

之后make -j N && echo -e "\a"进行编译 即可(最好session或者nohup).如果报错需要某些文件包则先装好,然后再尝试。

如果只为了NTFS,NTFS文件格式的支持在epel源中有包可以进行操作。会多一个mount.ntfs命令,对NTFS格式文件系统的分区进行挂载之后便可可读可写。

Busybox

定制小型的Linux操作系统:linux内核+busybox(安卓手机就是类似如此)

官方网站:https://busybox.net/

busybox命令可能选项比较少,不过也基本够用。同时它还集成了库文件,不用再另外安装拷贝了。

Busybox使用

busybox 的编译过程与Linux内核的编译类似

busybox的使用有三种方式:

busybox后直接跟命令,如 busybox ls

直接将busybox重命名,如 cp busybox tar

创建符号链接,如 ln -s busybox rm

busybox的安装

以上方法中,第三种方法最方便,但为busybox中每个命令都创建一个软链接,相当费事,busybox提供自动方法:busybox编译成功后,执行make install,则会产生一个_install目录,其中包含了busybox及每个命令的软链接

编译Busybox

yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel libmcrypt-devel glibc-static ncurses-devel

wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2

tar xvf busybox-1.30.0.tar.bz2

cd busybox-1.30.0/

make menuconfig

注意,在menu中按下面选择,把busybox编译成静态二进制、不用共享库,这样的话这些二进制文件所需要的库文件就会被打包集成在busybox中了而不是在当前操作系统的lib中

busybox本身就是一个程序,只不过功能众多而已,被视为多个程序的组合。实质上就是一个程序,要理解静态编译在这里的作用)

此时直接拷贝在其它机器上这个busybox也能执行了:

Busybox Settings -->Build Options -->[*] Build BusyBox as a static binary (no shared libs)

然后继续下面命令

make :只生成二进制文件不生成软链接

make install :把软链接也生成,以后执行命令就方便了

- 如果出错,执行make clean后,重新执行上面命令

mkdir /mnt/sysroot/

cp -a _install/* /mnt/sysroot/ :真正的busybox就在_install/bin/busybox 其他的在此目录内的命令都是软链接

Busybox也可直接下载编译好的二进制,在官网上有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值