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

这里的技术是共享的

You are here

马哥 16_02 _Linux系统裁减之五 有大用


kernel + initrd(busybox制作,提供ext3文件系统) + ROOTFS (busybox制作)

make arch 

            arch/x86/boot/bzImage


make arch/ (只编译内核的核心)只编译对应目录下的所有的内容,所有的源程序,arch/依赖于或者说紧密结合于各模块,(所以仍然会遍历各个模块的,所以编译过程可能会长一点, 但肯定比直接完全编译要快得多),编译完成之后,把内核复制出来就可以 了

        arch/x86/boot/bzImage (假设32位)编译后在arch/x86/boot/bzImage 这表示以bz方式压缩之后的映像文件,把 arch/x86/boot/bzImage 复制到/mnt/boot下命名为 vmlinuz就可以了

        硬件驱动: initrd

                 initrd: 仅需要提供内核访问真正的根文件系统所在的设备 所需要的驱动

                        存储设备和文件系统相关的模块

                 系统初始化脚本rc.sysinit:提供剩余的硬件驱动程序(初始化其它硬件的驱动)

        ROOTFS: 假如使用 busybox ,busybox模拟的init不支持运行级别的概念 (想使用的话,移植借助于,移植系统自带的init程序)

busybox 默认有ash,hush(没有bash)

我们可以移植bash过来


busybox 的 init 使用的/etc/inittab 的格式 与普通的红帽 /etc/inittab 的格式 不一样

 init 与 /etc/inittab 是对应的,提供哪个init,就使用哪种格式的 /etc/inittab

(提供busybox默认的 init 就使用busybox所认定的/etc/inittab格式 )

(提供系统的 init 就使用 系统认定的 /etc/inittab 的格式 )


内核:

我们需要的的内核是 2.6.38

而我们的虚拟机内核是2.6.18-371.el5

内核不一样,所以要重新编译


内核编译 

    make SUBDIR=arch/

    make arch/x86/


先不使用新内核,使用我自己的linux的内核 (IDE默认支持 ext2支持,但ext3不支持)

/boot/vmlinuz (ext3, IDE)   


/mnt/boot: /dev/hda1

/mnt/sysroot: /dev/hda2


1,安装grub















[root@localhost src]# pwd

/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]# ln -s linux-2.6.38.5 linux

[root@localhost src]# cd linux

[root@localhost linux]# pwd

/usr/src/linux

[root@localhost linux]#

image.png

image.png

以 这个.config作为蓝本来进行修改



我没有马哥的这个文件  只能 自己 在 本来的 内核上进行  make menuconfig了 


[root@localhost linux]# make menuconfig

image.png

image.png

修改 linux 的本地名称

image.png


下面交叉编译就不做了 

image.png


esc 返回到初始界面

image.png

进 SCSI device support

image.png

SCSI 不必做进内核  甚至SCSI tape support 给去掉

image.png

esc 返回上一步

sada IDE 都在这里,这里必须要支持  做进内核

image.png


sada IDE 都在这里,这里必须要支持  做进内核 所以 M全部改成*

image.png

 esc 返回上一级

在 VMware使用scsi 

Fusion MPT device support 必须要编译


image.png


在 VMware使用scsi   scsi transports , scsi low-level driver 要支持

(马哥说在 scsi device suport 下面(里面)有个  lsa 要支持,可是我这边 lsa 没看到 )

image.png

image.png

如果要支持 sisc 设备的话 上面要记得找 记得改

esc 返回最上级

image.png


看看网卡

image.png

千兆网卡 和万兆网卡  没有意义 可以去掉 

(但是我这边千兆网卡无法去掉)

image.png

wireless LAN (无线网卡) 和 PCMCIA network device support 也去掉吧

image.png


返回到 上上级吧(还是上一级)

看看文件系统

image.png


ext2 ext3 ext4 全部做进内核吧

(ext3做进内核后,就不用在init中提供内核模块了)

image.png


下面这三个文件系统(Reiserfs JFS XFS  ) 用不着,也去掉吧


image.png


ex4  用不着,也去掉吧 

image.png


再看看网卡驱动

esc  返回上一步

image.png

image.png


进 10兆 百兆网卡看看

image.png

pcnet32编译成模块 (为了以后看看 如何在 rc.sysinit 来看看如何装载,所以弄成模块吧)

image.png


3com 用不着去掉

image.png


下面这些用不着 都去掉吧 


image.png


最后 esc 保存退出吧


马哥的警告提示

image.png



我的警告提示

image.png

生成了.config 

image.png

为了让.config 以后多次用的话,就复制到 外面吧 

[root@localhost linux]# cp .config /root/cofig-2.6.28.5-i686.cfg



[root@localhost linux]# make drivers/net/pcnet32.ko        (把 pcnet32.c 就成 pcnet32.ko 进行编译)

image.png



[root@localhost linux]# modinfo drivers/net/pcnet32.ko

自己编译的 不再依赖于其它的模块了

image.png

系统的 它就依赖于mii

image.png


[root@localhost linux]# make drivers/net  (表示我们所有选择的网卡模块都会编译 )  (这里未执行)


只编译核心

[root@localhost linux]# make arch/  或者  make   arch/x86/  (这里未执行)

不指的话 会根据当前系统的操作系统版本平台版本进行选择

所以执行 make arch/ 就行了

(我们打开 screen 吧 )


[root@localhost linux]# screen        

[root@localhost linux]# make arch/

  CHK     include/linux/version.h

  CHK     include/generated/utsrelease.h

  CALL    scripts/checksyscalls.sh

scripts/Makefile.build:44: /usr/src/linux-2.6.38.5/arch/Makefile: 没有那个文件或目录

make[1]: *** 没有规则可以创建目标“/usr/src/linux-2.6.38.5/arch/Makefile”。 停止 。

make: *** [arch/] 错误 2


看来还要加上 x86  (它自己不会选择,我们给它手动指定x86)

(直接执行 make arch/x86/ 是没有问题的)

(以前直接执行 make arch/ 是没有问题的)

(或者使用 make SUBDIR=arch/ 应该是没有问题的)

[root@localhost linux]#

[root@localhost linux]# make  arch/x86/

image.png我为什么编译的这么快 (而马哥编译的太慢了)



(安装grub)

[root@localhost linux]# grub-install --root-directory=/mnt /dev/hda

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/hdb

(hd2)   /dev/sda

[root@localhost linux]#

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

grub  lost+found  

[root@localhost linux]#

(复制本系统的原来的linux核心)

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


下载 busybox

image.png


busybox 所依赖的有一个头文件 2.6.18是没有提供的

[root@localhost ~]# uname -r

2.6.18-371.el5

[root@localhost ~]#


[root@localhost ~]# mkdir busybox-1.20.2/include/mtd/  (以前已创建,所以这里未执行)

(复制一个这个头文件ubi-user.h 过来,以前已复制,这里未执行)

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

(切换到busybox)

[root@localhost ~]# pwd

/root

[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]#

[root@localhost busybox-1.20.2]# make menuconfig

image.png

image.png

image.png


我们只需要改下编译选项, (不使用动态库,使用静态二进制库文件)


esc 跳到上一步 进去改下安装路径 (可以改成 /mnt/sysroot 但是这里就不改了)

image.png

image.png


esc 返回上一步(还是两步) 看下shell 是否需要改 (ash,hush如果不需要都可以去掉,但这里没有去掉)

image.png

最后按 esc 到最后一步 保存一下


直接执行 make install ( 这里的 make install 相当于 一般情况下的 make 和 make install ,即相当于编译和安装)

[root@localhost busybox-1.20.2]# make install


马哥 打开另一个窗口,看编译好了没有

image.png


[root@localhost busybox-1.20.2]# cd /usr/src

[root@localhost src]# cd linux

[root@localhost linux]# pwd

/usr/src/linux

[root@localhost linux]#

[root@localhost linux]# ls arch/x86/boot/

(没有bzimage文件,难道应该有吗?)

a20.c        copy.S                  main.c          printf.c   video-bios.c

apm.c        cpu.c                   Makefile        regs.c     video.c

bioscall.S   cpucheck.c              mca.c           setup.ld   video.h

bitops.h     ctype.h                 memory.c        string.c   video-mode.c

boot.h       early_serial_console.c  mkcpustr.c      tools      video-vesa.c

cmdline.c    edd.c                   mtools.conf.in  tty.c      video-vga.c

code16gcc.h  header.S                pm.c            version.c

compressed   install.sh              pmjump.S        vesa.h

[root@localhost linux]#



[root@localhost linux]# cd arch/x86/boot/

[root@localhost boot]# pwd

/usr/src/linux/arch/x86/boot

[root@localhost boot]# ls    (这里应该是马哥讲到23-25分钟左右)

a20.c        copy.S                  main.c          printf.c   video-bios.c

apm.c        cpu.c                   Makefile        regs.c     video.c

bioscall.S   cpucheck.c              mca.c           setup.ld   video.h

bitops.h     ctype.h                 memory.c        string.c   video-mode.c

boot.h       early_serial_console.c  mkcpustr.c      tools      video-vesa.c

cmdline.c    edd.c                   mtools.conf.in  tty.c      video-vga.c

code16gcc.h  header.S                pm.c            version.c

compressed   install.sh              pmjump.S        vesa.h

[root@localhost boot]#

(没有bzImage文件,难道应该有吗? 看来直接指定目录,没法给我们编译成目标模块)


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

[root@localhost linux]# pwd

/usr/src/linux

[root@localhost linux]#

[root@localhost linux]# make clean   (它会清空配置文件 .config )     (这里应该是马哥讲到23-25分钟左右)

  CLEAN   .

  CLEAN   arch/x86/kernel/acpi/realmode

  CLEAN   arch/x86/kernel/cpu

  CLEAN   arch/x86/kernel

  CLEAN   arch/x86/vdso

  CLEAN   .tmp_versions

[root@localhost linux]#

[root@localhost linux]# make mrproper  (再清理一下,这个不懂)

  CLEAN   scripts/basic

  CLEAN   scripts/genksyms

  CLEAN   scripts/kconfig

  CLEAN   scripts/mod

  CLEAN   scripts/selinux/genheaders

  CLEAN   scripts/selinux/mdp

  CLEAN   scripts

  CLEAN   include/config include/generated

  CLEAN   .config include/linux/version.h Module.symvers

[root@localhost linux]#

马哥 复制一下配置文件 我没得复制 # cp /root/config-2.6.38.5-i686.cfg .config

image.png


[root@localhost linux]# make SUBDIR=arch/  (用这种方式编译)  (难道要先编译内核,再编译模块?)



[root@localhost ~]# mkdir /tmp/initrd   


[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]#

[root@localhost busybox-1.20.2]# cp -a _install/* /tmp/initrd/


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

[root@localhost initrd]# ls

bin  linuxrc  sbin  usr

[root@localhost initrd]#


[root@localhost initrd]# 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 initrd]# ls usr/bin

[          deallocvt   hd        lzopcat    realpath      strings      unlzma

[[         diff        head      md5sum     remove-shell  sum          unlzop

add-shell  dirname     hexdump   mesg       renice        sv           unxz

arping     dos2unix    hostid    microcom   reset         tac          unzip

awk        du          id        mkfifo     resize        tail         uptime

basename   dumpleases  ifplugd   mkpasswd   rpm2cpio      tcpsvd       users

beep       eject       install   nc         rtcwake       tee          uudecode

bunzip2    env         ipcrm     nmeter     runsv         telnet       uuencode

bzcat      envdir      ipcs      nohup      runsvdir      test         vlock

bzip2      envuidgid   kbd_mode  nslookup   rx            tftp         volname

cal        ether-wake  killall   od         script        tftpd        wall

chat       expand      killall5  openvt     seq           time         wc

chpst      expr        last      passwd     setkeycodes   timeout      wget

chrt       fdformat    less      patch      setsid        top          which

chvt       fgconsole   logger    pgrep      setuidgid     tr           who

cksum      find        logname   pkill      sha1sum       traceroute   whoami

clear      flock       lpq       pmap       sha256sum     traceroute6  whois

cmp        fold        lpr       printf     sha512sum     tty          xargs

comm       free        lsof      pscan      showkey       ttysize      xz

crontab    ftpget      lspci     pstree     smemcap       udpsvd       xzcat

cryptpw    ftpput      lsusb     pwdx       softlimit     unexpand     yes

cut        fuser       lzcat     readahead  sort          uniq

dc         groups      lzma      readlink   split         unix2dos

[root@localhost initrd]#



[root@localhost initrd]# ls usr/sbin/  (甚至可以模拟web服务器httpd,  dhcp服务器 udhcpd, 时间服务器 ntpd, ftp服务器 ftpd,

dns服务器 dnsd,dhs的中断功能服务器 dhcprelay , telnet服务器 telnetd     ) 

brctl      fakeidentd  lpd         rdate        svlogd     ubirsvol

chpasswd   fbset       nanddump    rdev         telnetd    ubiupdatevol

chroot     ftpd        nandwrite   readprofile  ubiattach  udhcpd

crond      httpd       nbd-client  sendmail     ubidetach

dhcprelay  inetd       ntpd        setfont      ubimkvol

dnsd       loadfont    popmaildir  setlogcons   ubirmvol

[root@localhost initrd]#

除了bash ,基本上所有的命令都有


[root@localhost initrd]# mkdir proc sys mnt/sysroot dev tmp lib/modules etc -pv

mkdir: 已创建目录 “proc”

mkdir: 已创建目录 “sys”

mkdir: 已创建目录 “mnt”

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

mkdir: 已创建目录 “dev”

mkdir: 已创建目录 “tmp”

mkdir: 已创建目录 “lib”

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

mkdir: 已创建目录 “etc”

[root@localhost initrd]#

[root@localhost initrd]# ls

bin  dev  etc  lib  linuxrc  mnt  proc  sbin  sys  tmp  usr

[root@localhost initrd]#


[root@localhost initrd]# ls -la

总计 100

drwxr-xr-x 12 root root 4096 12-14 21:36 .

drwxrwxrwt 12 root root 4096 12-14 21:36 ..

drwxr-xr-x  2 root root 4096 12-14 20:48 bin

drwxr-xr-x  2 root root 4096 12-14 21:36 dev

drwxr-xr-x  2 root root 4096 12-14 21:36 etc

drwxr-xr-x  3 root root 4096 12-14 21:36 lib

lrwxrwxrwx  1 root root   11 12-14 21:18 linuxrc -> bin/busybox

drwxr-xr-x  3 root root 4096 12-14 21:36 mnt

drwxr-xr-x  2 root root 4096 12-14 21:36 proc

drwxr-xr-x  2 root root 4096 12-14 20:48 sbin

drwxr-xr-x  2 root root 4096 12-14 21:36 sys

drwxr-xr-x  2 root root 4096 12-14 21:36 tmp

drwxr-xr-x  4 root root 4096 11-23 20:45 usr

[root@localhost initrd]#

[root@localhost initrd]# rm -f linuxrc   (删除这个链接文件)

[root@localhost initrd]#

创建两个设备文件

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

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

[root@localhost initrd]#

[root@localhost initrd]# ls dev -l

总计 8

crw-r--r-- 1 root root 5, 1 12-14 21:38 console

crw-r--r-- 1 root root 1, 3 12-14 21:39 null

[root@localhost initrd]#

创建 init脚本

[root@localhost initrd]# vim init  (这是sh,(ash 或 hush ,是默认提供给我们的)里面还没有bash)

image.png

image.png

proc  (伪文件系统,虚拟文件系统 ) 文件系统  是挂载内核映像

sys   (伪文件系统,虚拟文件系统 ) 文件系统  是输出硬件信息

这个地方必须挂载,不然内核无法正常工作的,(不然内核无法探测其它 硬件)(不然内核也无法将自己的信息输出给用户空间的)

insmod /lib/modules/jbd.ko

insmode /lib/moules/ext3.ko

这两个模块是为了 ext3的,如果 /dev/hda2 本身是 ext2,就不必引入(因为内核支持 ext2)

mdev -s  (busybox 模拟的,它能够探测,通知内核(通过sys目录)去读,去输出所有的硬件信息给用户空间的,所以它是通过sys目录来访问所有的硬件的)(访问硬件的主要目的是在dev目录下给它动态的创建设备文件的,跟 红帽上的 udev相近,不然的话所有的其它设备都无法访问,不然的话hda1,hda2,hda这些设备都无法访问,只是dev/console dev/null 需要提前使用,即这两个文件要提前创建)

mount -t ext3 /dev/hda2 /mnt/sysroot (挂载根文件系统 /mnt/sysroot 这个目录是我们刚才创建的)

exec switch_root /mnt/sysroot /sbin/init  (切换根,switch_root 是busybox提供给我们的,是sh提供给我们的一个内建命令,表示把根切换到  /mnt/sysroot ,并且执行 /sbin/init 命令 )



[root@localhost linux]# cd /root/busybox-1.20.2/_install/

[root@localhost _install]# pwd

/root/busybox-1.20.2/_install

[root@localhost _install]# sbin  按下两次 tab键 就可以看到 sbin (所以两次tab是补全吧)

sbin

[root@localhost _install]# sbin/  按下两次 tab键,可以看到sbin/目录下的所有, (所以两次tab是补全吧)

acpid              hdparm             mkdosfs            setconsole

adjtimex           hwclock            mke2fs             slattach

arp                ifconfig           mkfs.ext2          start-stop-daemon

blkid              ifdown             mkfs.minix         sulogin

blockdev           ifenslave          mkfs.vfat          swapoff

bootchartd         ifup               mkswap             swapon

depmod             init               modinfo            switch_root

devmem             insmod             modprobe           sysctl

fbsplash           klogd              nameif             syslogd

fdisk              loadkmap           pivot_root         tunctl

findfs             logread            poweroff           udhcpc

freeramdisk        losetup            raidautorun        vconfig

fsck               lsmod              reboot             watchdog

fsck.minix         makedevs           rmmod              zcip

getty              man                route

halt               mdev               runlevel

[root@localhost _install]# 

[root@localhost _install]# sbin/switch_root --help

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


Usage: switch_root [-c /dev/console] NEW_ROOT NEW_INIT [ARGS]


Free initramfs and switch to another root fs:

chroot to NEW_ROOT, delete all in /, move NEW_ROOT to /,

execute NEW_INIT. PID must be 1. NEW_ROOT must be a mountpoint.


        -c DEV  Reopen stdio to DEV after switch


[root@localhost _install]#

[root@localhost initrd]# vim init

(mount -t ext3 /dev/hda2 /mnt/sysroot 这里一定要给它指定文件系统 ext3,红帽上从来不用指定,因为红帽上使用blkid命令来自动探测,而这里探测不到)


#!/bin/sh

#

echo "mouting proc and sys"

mount -t proc proc /proc

mount -t sysfs sysfs /sys


echo "Load ext3 module..."

insmod /lib/modules/jbd.ko

insmod /lib/modules/ext3.ko

mdev -s  

echo "Mount real rootfs to /mnt/sysroot..."

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


echo "Switch to real rootfs ..."

exec switch_root /mnt/sysroot /sbin/init



[root@localhost initrd]# chmod +x init

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

[root@localhost initrd]# 

[root@localhost initrd]# ll -h /mnt/boot

总计 2.8M

drwxr-xr-x 2 root root 1.0K 12-14 20:25 grub

-rw-r--r-- 1 root root 958K 12-15 19:01 initrd.gz

drwx------ 2 root root  12K 12-06 20:05 lost+found

-rw-r--r-- 1 root root 1.9M 12-14 20:27 vmlinuz

哦忘了复制模块了


[root@localhost initrd]#



[root@localhost initrd]# 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 initrd]# modinfo ext3

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 initrd]#


模块与内核版本一定要匹配 (换内核了模块一定不能用)

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

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

重新生成一下 initrd.gz 文件

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

[root@localhost initrd]#


[root@localhost initrd]# ll -h /mnt/boot

总计 2.8M

drwxr-xr-x 2 root root 1.0K 12-14 20:25 grub

-rw-r--r-- 1 root root 958K 12-15 19:08 initrd.gz

drwx------ 2 root root  12K 12-06 20:05 lost+found

-rw-r--r-- 1 root root 1.9M 12-14 20:27 vmlinuz

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

(下面的ro指的是以只读方式挂载)

default=0

timeout=3

title MageEdu Tiny Linux (2.6.186)

        root(hd0,0)

        kernel /vmlinuz ro root=/dev/hda2

        initrd /initrd.gz

~

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

[root@localhost ~]# cd /mnt/sysroot/

[root@localhost sysroot]#

[root@localhost sysroot]# pwd

/mnt/sysroot

[root@localhost sysroot]# mount

/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

/dev/sda1 on /boot type ext3 (rw)

tmpfs on /dev/shm type tmpfs (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

.host:/ on /mnt/hgfs type vmhgfs (rw,ttl=1)

none on /proc/fs/vmblock/mountPoint type vmblock (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

/dev/hda1 on /mnt/boot type ext3 (rw)

/dev/hda2 on /mnt/sysroot type ext3 (rw)

[root@localhost sysroot]#

[root@localhost sysroot]# ls

bin  linuxrc  lost+found  sbin  usr

[root@localhost sysroot]# rm -f linuxrc

[root@localhost sysroot]#

[root@localhost sysroot]# ls

bin  lost+found  sbin  usr

[root@localhost sysroot]#


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

mkdir: 已创建目录 “boot”

mkdir: 已创建目录 “root”

mkdir: 已创建目录 “etc”

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

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

mkdir: 已创建目录 “var”

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

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

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

mkdir: 已创建目录 “proc”

mkdir: 已创建目录 “sys”

mkdir: 已创建目录 “dev”

mkdir: 已创建目录 “lib”

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

mkdir: 已创建目录 “tmp”

mkdir: 已创建目录 “home”

mkdir: 已创建目录 “mnt”

mkdir: 已创建目录 “media”

[root@localhost sysroot]#


[root@localhost sysroot]# ll

总计 46

drwxr-xr-x 2 root root  3072 12-14 20:48 bin

drwxr-xr-x 2 root root  1024 12-15 19:35 boot

drwxr-xr-x 2 root root  1024 12-15 19:35 dev

drwxr-xr-x 3 root root  1024 12-15 19:35 etc

drwxr-xr-x 2 root root  1024 12-15 19:35 home

drwxr-xr-x 3 root root  1024 12-15 19:35 lib

drwx------ 2 root root 12288 12-06 20:01 lost+found

drwxr-xr-x 2 root root  1024 12-15 19:35 media

drwxr-xr-x 2 root root  1024 12-15 19:35 mnt

drwxr-xr-x 2 root root  1024 12-15 19:35 proc

drwxr-xr-x 2 root root  1024 12-15 19:35 root

drwxr-xr-x 2 root root  3072 12-14 20:48 sbin

drwxr-xr-x 2 root root  1024 12-15 19:35 sys

drwxr-xr-x 2 root root  1024 12-15 19:35 tmp

drwxr-xr-x 4 root root  1024 11-23 20:45 usr

drwxr-xr-x 5 root root  1024 12-15 19:35 var

[root@localhost sysroot]#

[root@localhost sysroot]# ls

bin   dev  home  lost+found  mnt   root  sys  usr

boot  etc  lib   media       proc  sbin  tmp  var

[root@localhost sysroot]#

(马哥说创建设备文件应该是 未必是必须的,可能切换真正根的时候,原来的 dev/ 下面的所有的东西都会挪过来的?后来经测试,不是能挪过来的)

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

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

[root@localhost sysroot]#

[root@localhost sysroot]# ls

bin   dev  home  lost+found  mnt   root  sys  usr

boot  etc  lib   media       proc  sbin  tmp  var


[root@localhost sysroot]# vim etc/inittab

image.png

image.png


::sysinit:/etc/rc.d/rc.sysinit      这里id没有写,id可以不用写

console::respawn:-/bin/sh      控制台 直接执行一下/bin/sh 说明没有虚拟终端

::ctrlaltdel:/sbin/reboot           ctrl+alt+del 表示重启系统

::shutdown:/bin/umount -a -r 必须要卸载所有的文件系统 -a (all )表示要卸载/etc/mtab 里面的所有,-r (readolny)表示如果卸载不掉的话,就只读挂载

[root@localhost sysroot]# vim etc/inittab

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

console::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot

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


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

image.png

mount -t proc proc /proc 

mount -t sysfs sysfs /sys

这两个在initrd中已经挂载过了,还需要挂载吗? 马哥说应该不需要(因为initrd 切换过来的时候,

这两个也会切换过来?后为经测试,是需要挂载的)

mdev -s 创建设备所需要的设备文件,其实这一步并非是必须的,因为小系统中已经创建过了,马哥说应该也会切换过来的,后来经测试,是需要的

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

swapon -a 挂载swap 交换分区 硬盘模拟的虚拟内存  



mount -o remount,rw  /  根需要重新挂载为可读写的方式

mount -t ext3 -o remount,rw /dev/hda2 /          /dev/hda2 可以不用写,但前提是要提供/etc/fstab文件 

 

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

#!/bin/sh

#

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


echo "Remount the rooffs..."

mount -t ext3 -o remount,rw /dev/hda2 /


echo "Mount the other filesystem..."

mount -a


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

[root@localhost sysroot]#

[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]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# cd

[root@localhost ~]#


建个小系统看看

报这个错 insmod: can't insert '/lib/modules/ext3.ko': unknown symbol in module or in parameter 

是因为我把 模块名  lib/modules/jbd.ko 错写成了 lib/modules/jdb.ko ;正确的应该是  lib/modules/jbd.ko

image.png


看到 下面的 

ext3-fs warning (device hda2): ext3 clear_journal_err:Filesystem error recorded from previous mount: IO failure 

ext3-fs warning (device hda2):ext3_clear_journal_err:marking fs in need of filesystem check.

ext3-fs error (device hda2): ext3_lookup: unlinked innode 这些错,

就知道这个盘又坏了  处理一下吧 见 /node-admin/12754

image.png



mount: mouting /dev/hda2 on /mnt/sysroot failed: no such file or directory 

应该是探测不到硬件吧  mdev -s     # vim /tmp/initrd/init 这一行代码  mdev -s 没加

image.png


mount: mounting /dev/hda1 on /boot failed: no such file or directory 

看下 此时的/dev 目录 没有发现 /dev/hda1

image.png


关机 poweroff

image.png



[root@localhost sysroot]# pwd

/mnt/sysroot


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

#!/bin/sh

#

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


echo "Remount the rooffs..."

mount -t ext3 -o remount,rw /dev/hdb2 /


echo "Detect and export hardware information ..."

mdev -s


echo "Mount the other filesystem..."

mount -a


挂起源系统,打开小linux系统


此时仍然不有看到 /dev/hda1

image.png

poweroff 关小linux

image.png


看来 这里的 switch_root 与红帽的根切换命令 chroot 不一样, switch_root 没办法将小系统的 proc sys 和 dev 通通搬过来,

在红帽上的chroot 是可以的 ,所以 这里 还要修改 etc/rc.d/rc.sysinit



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


#!/bin/sh

#

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


echo "mount proc and sys ..."

mount -t proc proc /proc

mount -t sysfs sysfs /sys


echo "Remount the rooffs..."

mount -t ext3 -o remount,rw /dev/hdb2 /


echo "Detect and export hardware information ..."

mdev -s


echo "Mount the other filesystem..."

mount -a

~


挂起源linux,打开小linux 现在正常了 ,正常后执行  # ls /dev

image.png

image.png

image.png

# ls /proc                      

# ls /sys 

这些信息都看到了

image.png


下面看看如何让它有bash的功能  (把bash移植过来就可以了)

关闭小linux ,恢复源linux



[root@localhost ~]# ./bincopy.sh

Your command:bash

/bin/bash

copy lib /lib/libtermcap.so.2 finished.

copy lib /lib/libdl.so.2 finished.

copy lib /lib/libc.so.6 finished.

copy lib /lib/ld-linux.so.2 finished.

copy /bin/bash finished.

Continue:q

[root@localhost ~]#



[root@localhost ~]# chroot /mnt/sysroot          

  ( chroot 默认是找bash的 # man chroot )

image.png

bash-3.2# ls

bin         etc         lost+found  root        tmp

boot        home        mnt         sbin        usr

dev         lib         proc        sys         var

bash-3.2# exit

exit

[root@localhost ~]#


[root@localhost ~]# cd /mnt/sysroot

[root@localhost sysroot]# ls

bin   dev  home  lost+found  proc  sbin  tmp  var

boot  etc  lib   mnt         root  sys   usr

[root@localhost sysroot]# cd bin

[root@localhost bin]# pwd

/mnt/sysroot/bin

[root@localhost bin]# ls -la                ( 我们的小系统默认的  sh 是链接到  busybox )

(把链接删了 然后链接到 bash就可以了,因为刚刚bash复制过来了 ,但不建议这么做(除了所有脚本都用bash来执行) ,建议改 etc/inittab 文件)

image.png

这图中间省略了许多

image.png



[root@localhost bin]# cd ..

[root@localhost sysroot]# pwd

/mnt/sysroot

[root@localhost sysroot]# vim etc/inittab

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

console::respawn:-/bin/bash

::ctrlaltdel:/sbin/reboot

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


[root@localhost sysroot]# sync

[root@localhost sysroot]# cd

[root@localhost ~]# sync

[root@localhost ~]# sync

[root@localhost ~]# sync

挂起源linux 打开小linux

由下图可见 ,可以运行 bash 了

image.png


我们几乎可以做任何事 几乎任何命令 甚至格式化硬盘 提供交换分区

image.png


image.png

image.png


关闭小linux ,恢复源linux 

配置一下用户登录吧


这里的login程序 没有依赖于 libnss 库 


image.png


image.pngimage.png

::respawn:/sbin/getty 9600 tty1            # 这里 9600 是速率




[root@localhost ~]# grep "^root:" /etc/passwd

root:x:0:0:root:/root:/bin/bash

[root@localhost ~]# grep "^root:" /etc/passwd > /mnt/sysroot/etc/passwd

[root@localhost ~]#

[root@localhost ~]# grep "^root:" /etc/shadow > /mnt/sysroot/etc/shadow

[root@localhost ~]# grep "^root:" /etc/group > /mnt/sysroot/etc/group


[root@localhost ~]# ls /mnt/sysroot/etc/

fstab  group  inittab  passwd  rc.d  shadow

[root@localhost ~]#

( 看 /mnt/sysroot/etc/passwd 默认是  bash ,如果没有移植bash的话,这里就要改了 )

[root@localhost ~]# vim /mnt/sysroot/etc/passwd

root:x:0:0:root:/root:/bin/bash



[root@localhost ~]# vim /mnt/sysroot/etc/inittab   (它会自动(打印?)login程序,而且要求登录的) (此时不使用控制台,使用虚拟终端)

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

#console::respawn:-/bin/bash

::respawn:/sbin/getty 9600 tty1

::respawn:/sbin/getty 9600 tty2


::ctrlaltdel:/sbin/reboot

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



 我们(在登录之前?) 设置个主机名

[root@localhost ~]# vim /mnt/sysroot/etc/hostname

HOSTNAME=tiny.magedu.com


引入这个主机名的文件,设置主机名

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

#!/bin/sh

#

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


echo "Set the hostname"

[ -f /etc/hostname ] && . /etc/hostname

[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost

hostname $HOSTNAME



echo "mount proc and sys ..."

mount -t proc proc /proc

mount -t sysfs sysfs /sys


echo "Remount the rooffs..."

mount -t ext3 -o remount,rw /dev/hdb2 /


echo "Detect and export hardware information ..."

mdev -s


echo "Mount the other filesystem..."

mount -a

~


在登录之前显示的一段信息,是由  /etc/issue来提供显示的

image.png


直接复制 issue 过来吧

[root@localhost ~]# cp /etc/issue /mnt/sysroot/etc/ 

[root@localhost ~]#

可能要挂 ,先备份一下吧

[root@localhost sysroot]# du -sh /mnt/sysroot        (看下它有多大)

4.2M    /mnt/sysroot

[root@localhost sysroot]#


挂起源linux, 开启小linux   (果然挂了)

image.png

(ctrl+)alt (从F1到F6,可以切换,它们之间是一一对应的) 切换终端吧 可以切换 (好像这里只有切换终端,才能 进行登录,好像是的)

image.png

关掉小linux,恢复源linux

既然挂了,处理一下吧 见 /node-admin/12754

处理好后 ,增加网卡的功能吧


[root@localhost sysroot]# modinfo mii

filename:       /lib/modules/2.6.18-371.el5/kernel/drivers/net/mii.ko

license:        GPL

description:    MII hardware support library

author:         Jeff Garzik <jgarzik@pobox.com>

srcversion:     16DCEDEE4B5629C222C352D

depends:

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

module_sig:     883f35052292e6446baa9dea8c302c1128b70a0c2e3ad51582041af9a8a880c314aa72c7f6192b09f51ca3d13f6f0e1a750bbb06f72128864c3ded41b

[root@localhost sysroot]# modinfo pcnet32

filename:       /lib/modules/2.6.18-371.el5/kernel/drivers/net/pcnet32.ko

license:        GPL

description:    Driver for PCnet32 and PCnetPCI based ethercards

author:         Thomas Bogendoerfer

srcversion:     F81443556AAE169CBF80F55

alias:          pci:v00001023d00002000sv*sd*bc02sc00i*

alias:          pci:v00001022d00002000sv*sd*bc*sc*i*

alias:          pci:v00001022d00002001sv*sd*bc*sc*i*

depends:        mii

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

parm:           debug:pcnet32 debug level (int)

parm:           max_interrupt_work:pcnet32 maximum events handled per interrupt (int)

parm:           rx_copybreak:pcnet32 copy breakpoint for copy-only-tiny-frames (int)

parm:           tx_start_pt:pcnet32 transmit start point (0-3) (int)

parm:           pcnet32vlb:pcnet32 Vesa local bus (VLB) support (0/1) (int)

parm:           options:pcnet32 initial option setting(s) (0-15) (array of int)

parm:           full_duplex:pcnet32 full duplex setting(s) (1) (array of int)

parm:           homepna:pcnet32 mode for 79C978 cards (1 for HomePNA, 0 for Ethernet, default Ethernet (array of int)

module_sig:     883f35052292e5e46baa9dea8c302c11282a609d1ddcc2da13a7a0c122bfce028f33fe4d3aad5d009f76adf340fd5e708a2897e52593d6cdb1bcaaba2

[root@localhost sysroot]#

[root@localhost sysroot]# cp /lib/modules/2.6.18-371.el5/kernel/drivers/net/mii.ko lib/modules/

[root@localhost sysroot]# cp /lib/modules/2.6.18-371.el5/kernel/drivers/net/pcnet32.ko lib/modules/

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

#!/bin/sh

#

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


echo "Set the hostname"

[ -f /etc/hostname ] && . /etc/hostname

[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost

hostname $HOSTNAME



echo "mount proc and sys ..."

mount -t proc proc /proc

mount -t sysfs sysfs /sys


echo "Remount the rooffs..."

mount -t ext3 -o remount,rw /dev/hdb2 /


echo "Detect and export hardware information ..."

mdev -s


echo "Mount the other filesystem..."

mount -a


echo "Load ethernet card module ..."

insmod /lib/modules/mii.ko

insmod /lib/modules/pcnet32.ko


ifconfig eth0 192.168.1.47/24

ifconfig lo 127.0.0.1/8



[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# cd

[root@localhost ~]# sync

[root@localhost ~]# sync

[root@localhost ~]# sync

[root@localhost ~]#


视频到此结束了    ethernet card (以太网网卡)


挂起源linux,打开小linux后,可以ping通了

image.png



下面的目的是换内核,不过我没有成功,也许配置文件不对吧


 2.6.38 编译好后,产生了 bzImage 文件


[root@localhost linux]# pwd

/usr/src/linux

[root@localhost linux]#

[root@localhost linux]# ls arch/x86/boot/

a20.c        cpu.c                   Makefile        regs.o        video.h

a20.o        cpucheck.c              mca.c           setup.bin     video-mode.c

apm.c        cpucheck.o              mca.o           setup.elf     video-mode.o

apm.o        cpu.o                   memory.c        setup.ld      video.o

bioscall.o   cpustr.h                memory.o        string.c      video-vesa.c

bioscall.S   ctype.h                 mkcpustr        string.o      video-vesa.o

bitops.h     early_serial_console.c  mkcpustr.c      tools         video-vga.c

boot.h       early_serial_console.o  mtools.conf.in  tty.c         video-vga.o

bzImage      edd.c                   pm.c            tty.o         vmlinux.bin

cmdline.c    edd.o                   pmjump.o        version.c     voffset.h

cmdline.o    header.o                pmjump.S        version.o     zoffset.h

code16gcc.h  header.S                pm.o            vesa.h

compressed   install.sh              printf.c        video-bios.c

copy.o       main.c                  printf.o        video-bios.o

copy.S       main.o                  regs.c          video.c

[root@localhost linux]# 


把 bzImage 复制到小系统 命名为 vmlinuz

[root@localhost linux]# cp arch/x86/boot/bzImage /mnt/boot/vmlinuz

cp:是否覆盖“/mnt/boot/vmlinuz”? y

同时把 2.6.38 编译好后 pcnet32.ko 复制过去

[root@localhost linux]# find . -name "pcnet32.ko"

./drivers/net/pcnet32.ko

[root@localhost linux]# cp drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/

cp:是否覆盖“/mnt/sysroot/lib/modules/pcnet32.ko”? y


[root@localhost linux]#

本来它就是支持 ext3 的,所以我们去掉引入 ext3 吧 ,然后删除jbd.ko 和 ext3.ko(然后把这个 initrd 打包送到  /mnt/boot 目录下



[root@localhost initrd]# cd /tmp/initrd/

[root@localhost initrd]#

[root@localhost initrd]# vim init

#!/bin/sh

#

echo "mouting proc and sys"

mount -t proc proc /proc

mount -t sysfs sysfs /sys


echo "Load ext3 module..."

#insmod /lib/modules/jbd.ko

#insmod /lib/modules/ext3.ko

mdev -s

echo "Mount real rootfs to /mnt/sysroot..."

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

echo "Switch to real rootfs ..."

exec switch_root /mnt/sysroot /sbin/init

~



[root@localhost initrd]# rm -f /tmp/initrd/lib/modules/ext3.ko

[root@localhost initrd]# rm -f /tmp/initrd/lib/modules/jbd.ko

[root@localhost initrd]#

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

[root@localhost initrd]#




[root@localhost linux]#

再改下 etc/rc.d/rc.sysinit 去掉不依赖的 mii

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

#!/bin/sh

#

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

echo "Remount the rootfs..."


[ -f /etc/hostname ] && . /etc/hostname

[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost

hostname $HOSTNAME


echo "mount proc and sys ... "

mount -t proc proc /proc

mount -t sysfs sysft /sys



mount -t ext3 -o remount,rw /dev/hda2 /


echo "Detect and export hardward information ..."

mdev -s


echo "Mount the other filesystem..."

mount -a



echo "Load ethernet card module ..."


#insmod /lib/modules/mii.ko


insmod /lib/modules/pcnet32.ko



ifconfig eth0 192.168.0.57/24


ifconfig lo 127.0.0.1/8


[root@localhost sysroot]# sync

[root@localhost sysroot]# sync

[root@localhost sysroot]# cd

[root@localhost ~]#


挂起源虚拟机,打开小虚拟机

image.png

最后还是报这种错 我实在无法解决了



普通分类: