欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 15_03 _Linux系统裁减之四 自定义内核及busybox完成系统定制【攻城狮论坛の免费分享】 有大用

https://busybox.net/

image.png

内核编译:

busybox:  二进制程序,能够模拟许多命令

安卓手机就是手机内核加上busybox来进行工作的,

只不过默认情况下没有给root,也看不到busybox,也登录不进去

但事实上好多命令都有,好多工具都有

在自己手机上挂载一个系统,通过这种方式可以实现,

自己编译一个内核,交叉编译一个内核,导进手机里面去

编译一个busybox到手机里面去,完全可以把手机当作linux来工作,

甚至可以在里面提供一个服务器

如果在手机里面提供一个网卡,提供一个网线的话,在网上能够工作起来

草莓派,就是这样工作的,完全可以在里面装一个内核,装一个busybox,

当服务器插上网线,照样能工作

在骨灰级玩家里面,还是非常热的

只要手机能够被正常驱动,完全可以在当前主机编译内核

当然要交叉编译,看下手机什么硬件,主板类型.各种接口类型,把驱动都能够编译进去,

事实上这一切操作都可以在手机上能够实现(可能会把手机弄坏)

安卓手机就是一个kernel+busybox,在busybox上启动了一个java虚拟机

安卓系统本身就是一个java虚拟机,就是一个java程序而已


kernel+busybox 就能够完全模拟出一个功能比较齐备的操作系统了

busybox 就是一个根文件系统,能够提供给我们模拟出一个根文件系统(ROOTFS)

这个根文件系统能够提供给我们的

包括init程序,包括其它所需要的一切程序


kernel+initrd(ramdisk)

initrd(ramdisk) 本身就是一个完整的小系统,这个小系统的目的就是装载内核所需要的依赖的

额外的模块;这一切的功能完全可以使用busybox来实现的

在 Debian , ubuntu 系统上用的不是nash,而是busybox,来引导整个系统的启动过程,

而不是红帽系列(redhat)的initrd所展开的nash所构成的一个微型的ramdisk(ramfs)


kernel+

busybox-->做成一个initrd,我们完全可以从头来进行定制,不需要从前的那种initrd了

它很小,压缩下估计连1M都不到,而我们所有的功能,包括,装载ext3这样的内核模块完全可以实现

(我们以前 的真正的根文件系统,复制init,复制bash,提供各种配置文件,提供各种命令,体积会越来越庞大)


由此我们使用 

kernel+busybox做initrd

          +busybox做真正的根文件系统

完全可以实现


kernel+initrd(依赖busybox制作出来的)+rootfs(busybox)

(busybox提供了ash,hush,但是就是没有bash)

(把bash移植过来,照样可以跑起来)

(busybox很小,可能不够用,如果不够用,可以移植busybox没有提供的命令进来)


我们接下来的过程

依赖于当前系统所提供的内核,再加上自己手动编译的busybox,再使用busybox制作一个根文件系统

完全可以制作一个看上去体积更小,但命令更完善的linux


kernel内核可以手动编译出来

 自己编译kernel,定制各种属性,把不需要的功能通通移除,把需要的功能做成内核,甚至不需要任何额外的模块,也能跑起来


今天演示怎么实现结合系统自有的内核(redhat5),

加上自己编译的busybox,提供initrd

再加上busybox,提供rootfs,看能不能跑起来

redhat5.8+initrd(busybox)+roofts(busybox)

(马哥的是redhat5.8 32位) (我用的是redhat5.10 32位) 

明天实现 自己手动编译的内核+initrd(busybox)+roofts(busybox),

而且让它能有主机名,能让用户登录,能配置网络功能

(我们将来自己编译一个网络程序,把它导入小系统里面,就可以提供网络服务了)


(自己编译的内核可以1M以下)

(busybox压缩以后1M以下)

(根文件系统2-3M左右,加上任何我们所需要的其它的服务程序)

所以5M完全可以跑起来(还带网络服务)



查看本机硬件设备信息

1, 查看cpu信息   

         cat /proc/cpuinfo   (还有其它命令)

2, 查看usb接口 列出本机的usb属性信息

        lsusb

3,查看所有pci总线设备信息

        lspci


4,查看硬件更详细的信息

        hal-device  (Hardware Abstract Layer硬件抽象层 )



模块如果直接编译进内核,它的装载速度比较快,但是会使内核体积增大的(用不着,也装进内核)

所以根据需要来选择

一般来说 核心硬件,比如硬盘驱动,最好做进内核

像网卡这样的驱动,最好做成模块

IDE做成内核,scsi的做成模块,因为scsi大一点

lvm的更要做成模块

核心文件系统 ext2要做进内核

ext3 ext4 raiser等等可以做成模块



编译内核的步骤 (先要准备好源)

然后: 

1),配置 (到底要编译哪些功能,不要编译哪些功能)

        make menuconfig 

        make gconfig

        make kconfig

        常用的就上面三种,最常用的就是在字符界面下的第一种 make menuconfig 

        (还有 make allyesconfig ,make allnoconfig,make randconfig)  (rand random随机的)

        (make  oldconfig 根据当前系统上所用的版本来进行编译(在红帽上不支持,在debian上支持))

        (因为make  oldconfig需要依赖 /proc下面的config.gz这个文件,而红帽好像不提供了,所以需要复制

        boot下面的config文件过来,命名成.config才行?这个不太理解)

        make config 遍历的,假如有一万个条目手动配置的话,一万个条目都问你一遍要不要

不管哪一种,最后会保存为.config这个文件


2)

    make     

    make modules_install

    make install

模块安装位置: /lib/modules/KERNEL_VERSION/

上面的make命令  会编译所有内核及所选的模块

但是 make 可以只编译内核,也可以只编译模块(可以只编译一个模块)(可以只编译某个子目录下的所有模块,都可以实现)


如何实现部分编译

1,只编译某个子目录下的相关代码

    make dir/[subdir]

            (比如make arch/ 表示只编译arch下面的模块,它表示的是内核核心,跟硬件平台相关的内核核心,就是除了模块以外的所有内容)(编译核心也会编译模块的,哪些选了,哪些没选,我的内核支持哪些模块,都得让它知道,它会遍历一次所有模块的,这些模块可能不会编译,也可能不会安装,但是make arch/ 它将会编译核心)

            (比如make drivers/ 只编译驱动)

            (make drivers/net 只编译跟网络相关的驱动程序)


2,只编译部分模块

        (make drivers/net  编译后有时没法拿来直接用,很多时候,会编译为不是 .ko文件 而是.o文件?没听懂)

        make M=dir/

        (比如 make M=drivers/net/  这表示把drivers/net下的所有功能都编译成ko模块,可以拿来直接用的)

        (事实上 M 不写大多数情况下也可以用了)


3,只编译某一个模块

        (比如  make drivers/net/pcnet32.ko 这样就实现了只编译一个模块了)


4,将编译完成的结果放置于别的目录中

        (不然的话,编译好了之后,直接放到当前目录下了)

        (比如 make O=/tmp/kernel 编译好的结果放到/tmp/kernel 目录下)


如何编译busybox:


(可以把库文件编译到命令程序里面,体积会变大,但是拿到哪里都能运行,因为依赖的库都做进它本身了,,这叫静态方式)

(编译busybox的时候,为了移植过程尽可能简化,所以直接编译busybox的时候,把它编译成静态方式,不做动态链接了,

直接把它所依赖的库编译进busybox)


IDE:

/dev/hda1: ext3        /boot 用来放内核和initrd文件和grub

/dev/hda2: ext3        /         (rootfs 真正的根)

[root@localhost busybox-1.20.2]# make install

这里可能会报错,因为最新版本的busybox依赖于更新的内核头文件

我们的内核版本不具备新版的busybox所提供的某些功能,所以编译很可能会出错

如果出错的话,我们要下载更新的内核版本,比如2.6.28以上的版本










https://busybox.net

image.png

image.png

要想编译软件,开发环境要准备好   Development Tools   Development libraries 





[root@localhost ~]# which busybox

/sbin/busybox

[root@localhost ~]#


# cd /tmp/busybox

# ls sbin/

image.png


安装busybox后 

# cd 

# /mnt/sysroot

# cd bin/image.png

image.png   

busybox是命令

其它文件都是busybox的符号链接 能够模拟实现 sed awk su 几乎上百个常见命令

甚至可以模拟 ash,hush 这些shell ,,,,,,ip,ipaddr,ifconfig,route等等

image.png


# cd ..

# ls -l sbin/

image.png

在 sbin 目录下 可以模拟实现众多的其它命令

reboot halt mkfs

image.png

# ls -lh bin/  (很小,它只有1.6M)

image.png





[root@localhost ~]# lsusb

Bus 001 Device 001: ID 0000:0000

Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse

Bus 002 Device 001: ID 0000:0000

Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub

[root@localhost ~]#


IDE口 scsi口 VGA口 这些都是pci总线设备

[root@localhost ~]# lspci

image.png



[root@localhost ~]# hal-device        (会显示所有的硬件信息)

image.png

 

hal-device  还有个图形化的命令(马哥忘了,反正以hal开头的命令),类似于windows的设备管理器

在一个窗口里面能够显示每一个硬件


马哥 从ftp 下载了  busybox

# lftp 172.16.0.1


image.png

image.png

# ls 

# tar xf busybox-1.20.2.tar.bz2

image.png

我的做法 

[root@localhost ~]# wget https://busybox.net/downloads/busybox-1.20.2.tar.bz2

image.png


[root@localhost ~]# wget https://busybox.net/downloads/busybox-1.20.2.tar.bz2 --no-check-certificate

image.png


[root@localhost ~]# tar xf busybox-1.20.2.tar.bz2

[root@localhost ~]# cd busybox-1.20.2

跟编译内核一样 进行配置

[root@localhost busybox-1.20.2]# make menuconfig

image.png

里面各种命令 选法与内核一样

image.png



image.png

image.png

image.png

image.png


make install的时候 装在哪里了 (应该装在/mnt/sysroot 下面吧,但这里没有改)

image.png


保存退出

image.png


[root@localhost busybox-1.20.2]# make install  (这里 make install 就相当于编译内核的时个 make 和 make install吧)

image.png




[root@localhost ~]# uname -r

2.6.18-371.el5

[root@localhost ~]#


使用 linux-2.6.38.5.tar.gz 的功能

[root@localhost ~]# wget https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.5.tar.gz

image.png

[root@localhost ~]# tar xf linux-2.6.38.5.tar.gz


[root@localhost ~]# mv linux-2.6.38.5.tar.gz /usr/src

[root@localhost ~]# mv linux-2.6.38.5/ /usr/src

[root@localhost ~]# cd /usr/src

[root@localhost src]# ls

debug  kernels  linux-2.6.38.5  linux-2.6.38.5.tar.gz  redhat

[root@localhost src]#

[root@localhost src]# cd linux-2.6.38.5

[root@localhost linux-2.6.38.5]# ls

arch     Documentation  init     lib          README          sound

block    drivers        ipc      MAINTAINERS  REPORTING-BUGS  tools

COPYING  firmware       Kbuild   Makefile     samples         usr

CREDITS  fs             Kconfig  mm           scripts         virt

crypto   include        kernel   net          security

[root@localhost linux-2.6.38.5]#

[root@localhost linux-2.6.38.5]# cd include/

[root@localhost include]# ls

acpi         drm     linux     mtd     rdma   sound   video

asm-generic  Kbuild  math-emu  net     rxrpc  target  xen

crypto       keys    media     pcmcia  scsi   trace

[root@localhost include]#

[root@localhost include]# pwd

/usr/src/linux-2.6.38.5/include

[root@localhost include]#

[root@localhost mtd]# ls            (只需要  ubi-user.h 这个文件 make install 就不会报错了 )

inftl-user.h  Kbuild  mtd-abi.h  mtd-user.h  nftl-user.h  ubi-user.h

[root@localhost mtd]#



[root@localhost mtd]# cd /root/busybox-1.20.2

[root@localhost busybox-1.20.2]# ls

applets     console-tools  findutils  loginutils       modutils    selinux

applets_sh  coreutils      include    mailutils        networking  shell

arch        debianutils    init       Makefile         printutils  sysklogd

archival    docs           INSTALL    Makefile.custom  procps      testsuite

AUTHORS     e2fsprogs      libbb      Makefile.flags   README      TODO

Config.in   editors        libpwdgrp  Makefile.help    runit       TODO_unicode

configs     examples       LICENSE    miscutils        scripts     util-linux

[root@localhost busybox-1.20.2]#


[root@localhost busybox-1.20.2]# cd include/

[root@localhost include]# pwd

/root/busybox-1.20.2/include

[root@localhost include]#

[root@localhost include]# mkdir mtd


(只要复制 ubi-user.h 过来 就不会报错了)

[root@localhost include]# cp /usr/src/linux-2.6.38.5/include/mtd/ubi-user.h mtd/

[root@localhost include]# cd mtd/

[root@localhost mtd]# ls

ubi-user.h

[root@localhost mtd]# pwd

/root/busybox-1.20.2/include/mtd


[root@localhost mtd]# cd ../../

[root@localhost busybox-1.20.2]# pwd

/root/busybox-1.20.2

[root@localhost busybox-1.20.2]#


要注意目录 必须回到 busybox-1.20.2这个目录下 

进行编译安装

[root@localhost busybox-1.20.2]# make install  (此时没有错了)

image.png

[root@localhost busybox-1.20.2]# ls

applets                 console-tools  libbb            printutils

applets_sh              coreutils      libpwdgrp        procps

arch                    debianutils    LICENSE          README

archival                docs           loginutils       runit

AUTHORS                 e2fsprogs      mailutils        scripts

busybox                 editors        Makefile         selinux

busybox.links           examples       Makefile.custom  shell

busybox_unstripped      findutils      Makefile.flags   sysklogd

busybox_unstripped.map  include        Makefile.help    testsuite

busybox_unstripped.out  init           miscutils        TODO

Config.in               _install       modutils         TODO_unicode

configs                 INSTALL        networking       util-linux


(这里应该没有make 只有make install , (就是 make install  既包括编译,又包括安装吧) )

(在当前目录下创建了一个 _install 文件夹 所有安装好的文件都在这里面)

(我们就以  _install 为蓝本,创建一些我们所需要的功能 )

1)创建initrd文件

2)创建真正的根文件系统


创建initrd的时候,给它一个临时目录

[root@localhost busybox-1.20.2]#


[root@localhost busybox-1.20.2]# cp _install  /tmp/busybox -a (复制 _install 文件夹为 busybox)

[root@localhost busybox-1.20.2]#


[root@localhost busybox-1.20.2]# cd /tmp/busybox/

[root@localhost busybox]# ls

bin  linuxrc  sbin  usr

[root@localhost busybox]#


[root@localhost busybox]# ls

bin  linuxrc  sbin  usr

[root@localhost busybox]# rm linuxrc        (这个链接文件用不着)

rm:是否删除 符号链接 “linuxrc”? y

[root@localhost busybox]#


[root@localhost busybox]# ls

bin  sbin  usr

[root@localhost busybox]#

创建需要的目录

[root@localhost busybox]# mkdir proc sys etc dev lib/modules -pv

mkdir: 已创建目录 “proc”

mkdir: 已创建目录 “sys”

mkdir: 已创建目录 “dev”

mkdir: 已创建目录 “sysroot”

mkdir: 已创建目录 “lib”

mkdir: 已创建目录 “lib/modules”

[root@localhost busybox]#

[root@localhost busybox]# ls

bin  dev  etc  lib  proc  sbin  sys  sysroot  usr

[root@localhost busybox]#

我们打算使用红帽给我们提供的内核,但这个内核不支持 ext3

我们 要使用 initrd装载 ext3 模块


[root@localhost busybox]# modinfo ext3   (依赖 jbd)

filename:       /lib/modules/2.6.18-371.el5/kernel/fs/ext3/ext3.ko

license:        GPL

description:    Second Extended Filesystem with journaling extensions

author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others

srcversion:     A07FB612EC252393B4BD8AC

depends:        jbd

vermagic:       2.6.18-371.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

module_sig:     883f35052292e7d46baa9dea8c302c112da7e0a0921924ee755ebceffb916e12fe806abcb767da0a0c3e8ae5f1bc278aa233ec91ed4fa3a402becfe

[root@localhost busybox]#


[root@localhost busybox]# modinfo jbd

filename:       /lib/modules/2.6.18-371.el5/kernel/fs/jbd/jbd.ko

license:        GPL

srcversion:     D2A70FA9B767749DCC352F3

depends:

vermagic:       2.6.18-371.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

module_sig:     883f35052292e7e46baa9dea8c302c11223bf09f5f7979878afe441bdf7ca315b7d8132e60cda109f7f8f27936a23f60257cfcf0c0a3bb8c7aaae847

[root@localhost busybox]#


把 ext3模块复制过来

[root@localhost busybox]# cp /lib/modules/2.6.18-371.el5/kernel/fs/ext3/ext3.ko lib/modules/

[root@localhost busybox]# cp /lib/modules/2.6.18-371.el5/kernel/fs/jbd/jbd.ko lib/modules/

[root@localhost busybox]# pwd

/tmp/busybox

[root@localhost busybox]#


[root@localhost busybox]# vim init    (#!/bin/sh 是个链接,指向 hush 的)



[root@localhost ~]# cd /tmp/busybox

[root@localhost busybox]# ls

bin  dev  etc  lib  proc  sbin  sys  sysroot  usr

[root@localhost busybox]# ls bin

addgroup  delgroup       hostname  lsattr      pipe_progress  stat

adduser   deluser        hush      lzop        powertop       stty

ash       df             ionice    makemime    printenv       su

base64    dmesg          iostat    mkdir       ps             sync

busybox   dnsdomainname  ip        mknod       pwd            tar

cat       dumpkmap       ipaddr    mktemp      reformime      touch

catv      echo           ipcalc    more        rev            true

chattr    ed             iplink    mount       rm             umount

chgrp     egrep          iproute   mountpoint  rmdir          uname

chmod     false          iprule    mpstat      rpm            usleep

chown     fdflush        iptunnel  mt          run-parts      vi

conspy    fgrep          kill      mv          scriptreplay   watch

cp        fsync          linux32   netstat     sed            zcat

cpio      getopt         linux64   nice        setarch

cttyhack  grep           ln        pidof       setserial

date      gunzip         login     ping        sh

dd        gzip           ls        ping6       sleep

[root@localhost busybox]#


[root@localhost busybox]# ls sbin

acpid       freeramdisk  init      mke2fs       reboot             sysctl

adjtimex    fsck         insmod    mkfs.ext2    rmmod              syslogd

arp         fsck.minix   klogd     mkfs.minix   route              tunctl

blkid       getty        loadkmap  mkfs.vfat    runlevel           udhcpc

blockdev    halt         logread   mkswap       setconsole         vconfig

bootchartd  hdparm       losetup   modinfo      slattach           watchdog

depmod      hwclock      lsmod     modprobe     start-stop-daemon  zcip

devmem      ifconfig     makedevs  nameif       sulogin

fbsplash    ifdown       man       pivot_root   swapoff

fdisk       ifenslave    mdev      poweroff     swapon

findfs      ifup         mkdosfs   raidautorun  switch_root

[root@localhost busybox]#


[root@localhost busybox]# sbin/mdev  (加上-s 就能够扫描(初始化) /sys  来获取所有的硬件设备,然后在 dev目录下产生设备)



BusyBox v1.20.2 (2018-11-23 19:58:24 CST) multi-call binary.


Usage: mdev [-s]


mdev -s is to be run during boot to scan /sys and populate /dev.


Bare mdev is a kernel hotplug helper. To activate it:

        echo /sbin/mdev >/proc/sys/kernel/hotplug


It uses /etc/mdev.conf with lines

        [-]DEVNAME UID:GID PERM [>|=PATH]|[!] [@|$|*PROG]

where DEVNAME is device name regex, @major,minor[-minor2], or

environment variable regex. A common use of the latter is

to load modules for hotplugged devices:

        $MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"


If /dev/mdev.seq file exists, mdev will wait for its value

to match $SEQNUM variable. This prevents plug/unplug races.

To activate this feature, create empty /dev/mdev.seq at boot.




[root@localhost busybox]# chmod +x init

[root@localhost busybox]# ls

bin  dev  etc  init  lib  proc  sbin  sys  sysroot  usr

[root@localhost busybox]#

image.png

vim init 这里少了引导模块 insmod   jdb 和  ext3 

image.png


[root@localhost busybox]# mkdir mnt/sysroot -pv  (这个mnt/sysroot  本质上是小根initrd 里面/mnt/sysroot ? 是为了在小根 vim init挂载用的)

mkdir: 已创建目录 “mnt”

mkdir: 已创建目录 “mnt/sysroot”

[root@localhost busybox]# ls

bin  dev  etc  init  lib  mnt  proc  sbin  sys  sysroot  usr

[root@localhost busybox]# rm -rf sysroot/        (用不着) (刚刚在/tmp/busybox 下面建的这个目录)


马哥说通过脚本创建也行(initrd里面的init脚本吧),因为每次开机 每次创建是不是不合适?(但马哥说可以)

(主次设备号是预先系统设定好的,不能乱改)

在dev 目录下创建一个设备console ,c表示字符设备,主设备号是5,次设备号是1

[root@localhost busybox]# mknod dev/console c 5 1

在dev 目录下创建一个设备null ,c表示字符设备,主设备号是1,次设备号是3

[root@localhost busybox]# mknod dev/null c 1 3


[root@localhost busybox]# tree dev/

dev/

|-- console

`-- null


0 directories, 2 files

[root@localhost busybox]#

[root@localhost busybox]# mkdir tmp



[root@localhost busybox]# vim init        

(#!/bin/sh 是个链接,指向 hush 的)

(装载额外的其它硬件,红帽中用的是udev吧,这里busybox用的是mdev)

(mount -a 需要依赖于 /etc/fstab 文件)


#!/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


[root@localhost busybox]# find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz

[root@localhost busybox]# ls -lh /mnt/boot/initrd.gz

-rw-r--r-- 1 root root 958K 11-24 20:36 /mnt/boot/initrd.gz

[root@localhost busybox]#

把内核复制过去

[root@localhost busybox]# cp /boot/vmlinuz-2.6.18-371.el5 /mnt/boot/vmlinuz


[root@localhost ~]# grub-install --root-directory=/mnt /dev/hda  (是设备是磁盘,不是分区,因为一个磁盘上只能安装一个boot引导)

Probing devices to guess BIOS drives. This may take a long time.

Installation finished. No error reported.

This is the contents of the device map /mnt/boot/grub/device.map.

Check if this is correct or not. If any of the lines is incorrect,

fix it and re-run the script `grub-install'.


(fd0)   /dev/fd0

(hd0)   /dev/hda

(hd1)   /dev/sda

[root@localhost ~]# ls /mnt/boot

grub  initrd.gz  lost+found  vmliunz

[root@localhost ~]#

[root@localhost ~]# vim /mnt/boot/grub/grub.conf

default=0

timeout=3

title MageEdu Linux (2.6.18)

  root(hd0,0)

  kernel /vmlinuz ro root=/dev/hda2

  initrd /initrd.gz


[root@localhost ~]# ls /mnt/boot/

grub  initrd.gz  lost+found  vmliunz

[root@localhost ~]#

[root@localhost ~]# cd busybox-1.20.2

[root@localhost busybox-1.20.2]# pwd

/root/busybox-1.20.2

[root@localhost busybox-1.20.2]# ls

applets                 console-tools  libbb            printutils

applets_sh              coreutils      libpwdgrp        procps

arch                    debianutils    LICENSE          README

archival                docs           loginutils       runit

AUTHORS                 e2fsprogs      mailutils        scripts

busybox                 editors        Makefile         selinux

busybox.links           examples       Makefile.custom  shell

busybox_unstripped      findutils      Makefile.flags   sysklogd

busybox_unstripped.map  include        Makefile.help    testsuite

busybox_unstripped.out  init           miscutils        TODO

Config.in               _install       modutils         TODO_unicode

configs                 INSTALL        networking       util-linux


现在是处理真正的根

[root@localhost busybox-1.20.2]# cp -a _install/* /mnt/sysroot/

[root@localhost busybox-1.20.2]# cd /mnt/sysroot

[root@localhost sysroot]# pwd

/mnt/sysroot

[root@localhost sysroot]# ls

bin  linuxrc  sbin  usr

[root@localhost sysroot]# rm -f linuxrc

[root@localhost sysroot]# ls

bin  sbin  usr

[root@localhost sysroot]#


[root@localhost sysroot]# mkdir -pv  etc/rc.d/init.d proc sys dev tmp var/{log,lock,run} lib/modules root boot mnt media

mkdir: 已创建目录 “proc”

mkdir: 已创建目录 “sys”

mkdir: 已创建目录 “dev”

mkdir: 已创建目录 “tmp”

mkdir: 已创建目录 “var”

mkdir: 已创建目录 “var/log”

mkdir: 已创建目录 “var/lock”

mkdir: 已创建目录 “var/run”

mkdir: 已创建目录 “lib”

mkdir: 已创建目录 “lib/modules”

mkdir: 已创建目录 “ect”

mkdir: 已创建目录 “ect/rc.d”

mkdir: 已创建目录 “ect/rc.d/init.d”

mkdir: 已创建目录 “root”

mkdir: 已创建目录 “boot”

mkdir: 已创建目录 “mnt”

mkdir: 已创建目录 “media”

[root@localhost sysroot]#

[root@localhost sysroot]# ls

bin  boot  dev  etc  lib  media  mnt  proc  root  sbin  sys  tmp  usr  var

[root@localhost sysroot]#



[root@localhost sysroot]# ls sbin        (里面有 init )

acpid       freeramdisk  init      mke2fs       reboot             sysctl

adjtimex    fsck         insmod    mkfs.ext2    rmmod              syslogd

arp         fsck.minix   klogd     mkfs.minix   route              tunctl

blkid       getty        loadkmap  mkfs.vfat    runlevel           udhcpc

blockdev    halt         logread   mkswap       setconsole         vconfig

bootchartd  hdparm       losetup   modinfo      slattach           watchdog

depmod      hwclock      lsmod     modprobe     start-stop-daemon  zcip

devmem      ifconfig     makedevs  nameif       sulogin

fbsplash    ifdown       man       pivot_root   swapoff

fdisk       ifenslave    mdev      poweroff     swapon

findfs      ifup         mkdosfs   raidautorun  switch_root

[root@localhost sysroot]#


image.png

[root@localhost sysroot]# vim etc/inittab

busybox   不再支持涉及到级别的所有概念

/bin/umount -a -r 卸载所有的文件系统

 -r     In case unmounting fails, try to remount read-only.



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

console::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot

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



[root@localhost sysroot]# 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



主次设备号是预先系统设定好的,不能乱改

[root@localhost sysroot]# mknod dev/console c 5 1

[root@localhost sysroot]# mknod dev/null c 1 3

image.png


[root@localhost sysroot]# vim etc/rc.d/rc.sysinit

(swapon -a 就是挂载所有的swap分区)


#!/bin/sh

echo -e "\tWelcome to \033[34mMageEdu \033[0m Linux"


echo -e "Remounting the root filesystem ..........[   \033[32mOK\033[0m  "

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mount -o remount,rw /


echo -e "Creating the files of device .........[  \033[32mOk\033[0m   ]"

mdev -s


echo -e "Mounting the filesystem ..............[ \033[32mOK\033[0m   ]"

mount -a

swapon -a


[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysinit

[root@localhost sysroot]#

image.png


image.png

image.png

[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# cd

[root@localhost ~]#


挂起源linux (现在用的是32位的版本) 建一个小linux吧




image.png

弹出上面的错 以及 虚拟机弹出窗口 image.png

大约两个原因

1) 是由于 把 存在 busybox 的情况下 这样复制的

(相当于把 _install 作为 busybox的子目录了,这是不对的,应该 _install 就是busybox目录)

image.png

cp -a  /root/busybox-1.20.2/_install/ /tmp/busybox/


2) 还有一个原因吧 就是 grub-install --root-directory=/mnt/  /dev/hda  (这里应该是磁盘,不是分区,因为一个磁盘上只能安装一个boot引导   而我刚开始写成了 /dev/hda2,所以报上面的错吧)




image.png

弹出上面这个错是 由于  grub.conf文件中写错了 内核名称 应该是 vmlinuz 而我写成了 vmliunz



image.png

报上面的错 (mount: mouting /dev/hda2 on /mnt/sysroot failed:no such file or directory) 就是

image.png

为什么系统认为 盘是 hdc 而不是hda呢

难道是因为下图的原因

image.png




[root@localhost busybox]# vim init

#!/bin/sh

#

mount -t proc proc /proc

mount -t sysfs sysfs /sys


mdev -s


insmod /lib/modules/jbd.ko

insmod /lib/modules/ext3.ko

[ -b /dev/hda2 ] && echo "block is exist"

[ -d /mnt/sysroot  ] && echo "directory is exist"

ls -lda /dev/h*

ls -lda /dev/s*

ls -lda /dev/*d*



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


exec switch_root /mnt/sysroot /sbin/init






image.png











普通分类: