欢迎各位兄弟 发布技术文章
这里的技术是共享的
内核编译:
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以上的版本
要想编译软件,开发环境要准备好 Development Tools Development libraries
[root@localhost ~]# which busybox
/sbin/busybox
[root@localhost ~]#
# cd /tmp/busybox
# ls sbin/
安装busybox后
# cd
# /mnt/sysroot
# cd bin/
busybox是命令
其它文件都是busybox的符号链接 能够模拟实现 sed awk su 几乎上百个常见命令
甚至可以模拟 ash,hush 这些shell ,,,,,,ip,ipaddr,ifconfig,route等等
# cd ..
# ls -l sbin/
在 sbin 目录下 可以模拟实现众多的其它命令
reboot halt mkfs
# ls -lh bin/ (很小,它只有1.6M)
[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
[root@localhost ~]# hal-device (会显示所有的硬件信息)
hal-device 还有个图形化的命令(马哥忘了,反正以hal开头的命令),类似于windows的设备管理器
在一个窗口里面能够显示每一个硬件
马哥 从ftp 下载了 busybox
# lftp 172.16.0.1
# ls
# tar xf busybox-1.20.2.tar.bz2
我的做法
[root@localhost ~]# wget https://busybox.net/downloads/busybox-1.20.2.tar.bz2
[root@localhost ~]# wget https://busybox.net/downloads/busybox-1.20.2.tar.bz2 --no-check-certificate
[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
里面各种命令 选法与内核一样
make install的时候 装在哪里了 (应该装在/mnt/sysroot 下面吧,但这里没有改)
保存退出
[root@localhost busybox-1.20.2]# make install (这里 make install 就相当于编译内核的时个 make 和 make install吧)
[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
[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 (此时没有错了)
[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]#
vim init 这里少了引导模块 insmod jdb 和 ext3
[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]#
[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
[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]#
[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吧
弹出上面的错 以及 虚拟机弹出窗口
大约两个原因
1) 是由于 把 存在 busybox 的情况下 这样复制的
(相当于把 _install 作为 busybox的子目录了,这是不对的,应该 _install 就是busybox目录)
cp -a /root/busybox-1.20.2/_install/ /tmp/busybox/
2) 还有一个原因吧 就是 grub-install --root-directory=/mnt/ /dev/hda (这里应该是磁盘,不是分区,因为一个磁盘上只能安装一个boot引导 而我刚开始写成了 /dev/hda2,所以报上面的错吧)
弹出上面这个错是 由于 grub.conf文件中写错了 内核名称 应该是 vmlinuz 而我写成了 vmliunz
报上面的错 (mount: mouting /dev/hda2 on /mnt/sysroot failed:no such file or directory) 就是
为什么系统认为 盘是 hdc 而不是hda呢
难道是因为下图的原因
[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