欢迎各位兄弟 发布技术文章
这里的技术是共享的
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]#
以 这个.config作为蓝本来进行修改
我没有马哥的这个文件 只能 自己 在 本来的 内核上进行 make menuconfig了
[root@localhost linux]# make menuconfig
修改 linux 的本地名称
下面交叉编译就不做了
esc 返回到初始界面
进 SCSI device support
SCSI 不必做进内核 甚至SCSI tape support 给去掉
esc 返回上一步
sada IDE 都在这里,这里必须要支持 做进内核
sada IDE 都在这里,这里必须要支持 做进内核 所以 M全部改成*
esc 返回上一级
在 VMware使用scsi
Fusion MPT device support 必须要编译
在 VMware使用scsi scsi transports , scsi low-level driver 要支持
(马哥说在 scsi device suport 下面(里面)有个 lsa 要支持,可是我这边 lsa 没看到 )
如果要支持 sisc 设备的话 上面要记得找 记得改
esc 返回最上级
看看网卡
千兆网卡 和万兆网卡 没有意义 可以去掉
(但是我这边千兆网卡无法去掉)
wireless LAN (无线网卡) 和 PCMCIA network device support 也去掉吧
返回到 上上级吧(还是上一级)
看看文件系统
ext2 ext3 ext4 全部做进内核吧
(ext3做进内核后,就不用在init中提供内核模块了)
下面这三个文件系统(Reiserfs JFS XFS ) 用不着,也去掉吧
ex4 用不着,也去掉吧
再看看网卡驱动
esc 返回上一步
进 10兆 百兆网卡看看
pcnet32编译成模块 (为了以后看看 如何在 rc.sysinit 来看看如何装载,所以弄成模块吧)
3com 用不着去掉
下面这些用不着 都去掉吧
最后 esc 保存退出吧
马哥的警告提示
我的警告提示
生成了.config
为了让.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 进行编译)
[root@localhost linux]# modinfo drivers/net/pcnet32.ko
自己编译的 不再依赖于其它的模块了
系统的 它就依赖于mii
[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/
我为什么编译的这么快 (而马哥编译的太慢了)
(安装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
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
我们只需要改下编译选项, (不使用动态库,使用静态二进制库文件)
esc 跳到上一步 进去改下安装路径 (可以改成 /mnt/sysroot 但是这里就不改了)
esc 返回上一步(还是两步) 看下shell 是否需要改 (ash,hush如果不需要都可以去掉,但这里没有去掉)
最后按 esc 到最后一步 保存一下
直接执行 make install ( 这里的 make install 相当于 一般情况下的 make 和 make install ,即相当于编译和安装)
[root@localhost busybox-1.20.2]# make install
马哥 打开另一个窗口,看编译好了没有
[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
[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)
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
::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
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
看到 下面的
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
mount: mouting /dev/hda2 on /mnt/sysroot failed: no such file or directory
应该是探测不到硬件吧 mdev -s # vim /tmp/initrd/init 这一行代码 mdev -s 没加
mount: mounting /dev/hda1 on /boot failed: no such file or directory
看下 此时的/dev 目录 没有发现 /dev/hda1
关机 poweroff
[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
poweroff 关小linux
看来 这里的 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
# ls /proc
# ls /sys
这些信息都看到了
下面看看如何让它有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 )
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 文件)
这图中间省略了许多
[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 了
我们几乎可以做任何事 几乎任何命令 甚至格式化硬盘 提供交换分区
关闭小linux ,恢复源linux
配置一下用户登录吧
这里的login程序 没有依赖于 libnss 库
::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来提供显示的
直接复制 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 (果然挂了)
(ctrl+)alt (从F1到F6,可以切换,它们之间是一一对应的) 切换终端吧 可以切换 (好像这里只有切换终端,才能 进行登录,好像是的)
关掉小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通了
下面的目的是换内核,不过我没有成功,也许配置文件不对吧
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 ~]#
挂起源虚拟机,打开小虚拟机
最后还是报这种错 我实在无法解决了