## 背景
本教程主要针对中国石油大学(华东)计算机操作系统课程设计中的Floppylinux作业。
当时老师给的教程让人难受。也可能是我太渣了,自己走了不少弯路。希望你做这个作业时不要再像我一样难受。
以下内容参考李永老师给的《Floppylinux实现》文档。并增加一些自己的理解和注释。希望对你有所帮助。
首先说明,按照以下步骤可以完成floppylinux实验,但是有些步骤是否是必要的(例如在根目录下新建floppylinux文件夹)本人不清楚。我懂得不多,还需要学习。
(步骤1为将busybox-1.00.tar.bz2拷贝到虚拟机中。步骤2为为虚拟机新建软盘,若读者已完成此步骤、可以跳过)
1、首先打开RedHat虚拟机,将老师给的busybox-1.00.tar.bz2文件拷贝到虚拟机中。
可以使用挂在U盘的方法将busybox-1.00.tar.bz2拷贝到虚拟机中(不过我的虚拟挂载U盘会出错,我也不知道为啥)。
如果你的电脑也不可以使用U盘将文件拷贝到虚拟机中,那么你可以使用挂载CDROM的方法将文件拷贝到虚拟机中,在这个链接中有详细教程,不再赘述。
结果截图:
2、为虚拟机增加虚拟软盘
在VMWare中选择:虚拟机(M)->设置。
界面左侧''硬件"->"软盘"->"设备状态"中,将 已连接(C)、启动时链接(O) 选上。
''硬件"->"软盘"->"链接"中,选择 使用软盘映像文件(M) 。
之后点击 "创建(T)",新建一个软盘,按照自己的喜好命名。
结果如下图(图中我新建的软盘命名为floppy.flp)。完成后点击确定。
若新建软盘成功,将鼠标放到VMWare左下软盘图标处会显示 “软盘:正在使用floppy.flp”。如图所示:
至此,我们已经完成了前期的准备工作。
3、在软盘上安装引导器(grub)。
(此步骤为老师给的教程中的步骤1)
a. 首先对软盘建立ex2文件系统
[root@localhost root]#mke2fs /dev/fd0
b. 之后将系统中grub目录下的引导文件stage1,stage2复制到软盘中
[root@localhost root]#mount /dev/fd0 /mnt/floppy
按回车之后桌面上会显示出来软盘的图标,如图所示:
[root@localhost root]# cd /mnt/floppy/
[root@localhost floppy]# mkdir boot
[root@localhost floppy]# mkdir boot/grub
[root@localhost floppy]# cp /boot/grub/stage1 /mnt/floppy/boot/grub/
[root@localhost floppy]# cp /boot/grub/stage2 /mnt/floppy/boot/grub/
[root@localhost floppy]# ls boot/grub/
stage1 stage2
c. 最后配置grub信息
[root@localhost floppy]# grub
Probing devices to guess BIOS drives. This may take a long time.
GRUB version 0.93 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.]
grub> root (fd0)
Filesystem type is ext2fs, using whole disk
grub> setup (fd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... no
Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p /boot/grub/grub.conf "... succeeded
Done.
grub> quit
至此,引导盘安装完成!
4、配置busybox相关选项
a.在根目录下新建floppylinux目录,floppylinux下再新建floppylinux,将busybox-1.00.tar.bz2复制到第二个floppylinux下。
(此处新建两个floopylinux可能没有必要,但是为了和老师给的教程文档中命令对应,才多新建了一个floppylinux文件夹,具体为啥别管,听话照着做就对了,乖)
目录结构如下:
解压busybox-1.00.tar.bz2文件
[root@localhost floppylinux]# tar -xjvf busybox-1.00.tar.bz2
解压后floppylinux文件夹下会多出一个busybox-1.00文件夹,如图所示:
b.进入busybox-1.00文件夹
[root@localhost floppylinux]# cd busybox-1.00
[root@localhost busybox-1.00]# pwd
/floppylinux/floppylinux/busybox-1.00
[root@localhost busybox-1.00]# make menuconfig
之后进入配置界面。
General Configuration --->中配置如下:
Build Option --->中配置如下:
Installation Options --->中配置如下:
c.其他选项遵从linux基本命令默认选项,配置好保存退出。
5、编译并安装busybox
[root@localhost busybox-1.00]# make
[root@localhost busybox-1.00]# make install
编译好后,在busybox目录下生成子目录_install
[root@localhost busybox-1.00]# cd _install/
[root@localhost _install]# ll
总用量 8
drwxr-xr-x 2 root root 4096 10月 31 22:29 bin
lrwxrwxrwx 1 root root 11 10月 31 22:29 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 10月 31 22:29 sbin
6、建立临时目录,该目录为软盘的文件系统
在/floppylinux/floppylinux/下新建文件夹floppyImage
[root@localhost _install]# mkdir /floppylinux/floppylinux/floppyImage
[root@localhost floppyImage]# pwd
/floppylinux/floppylinux/floppyImage
将busybox下的_install目录下的文件复制过来
[root@localhost floppyImage]# cp /floppylinux/floppylinux/busybox-1.00/_install/* /floppylinux / floppylinux/ floppyImage/ -r
[root@localhost floppyImage]# ls
bin linuxrc sbin
[root@localhost floppyImage]# mkdir dev etc etc/init.d proc mnt tmp var
[root@localhost floppyImage]# chmod 755 dev etc etc/init.d bin mnt tmp var
[root@localhost floppyImage]# chmod 555 proc
7、建立设备列表
[root@localhost floppyImage]# cd dev
[root@localhost dev]# mknod tty c 5 0
[root@localhost dev]# mknod console c 5 1
[root@localhost dev]# chmod 666 tty console
[root@localhost dev]# mknod tty0 c 4 0
[root@localhost dev]# chmod 666 tty0
[root@localhost dev]# mknod ram0 b 1 0
[root@localhost dev]# chmod 600 ram0
[root@localhost dev]# mknod fd0 b 2 0
[root@localhost dev]# chmod 600 fd0
[root@localhost dev]# mknod null c 1 3
[root@localhost dev]# chmod 666 null
[root@localhost dev]# ll
显示结果如下图所示(处理文件的建立时间之外,其他必须相同)
8、建立启动配置文件
[root@localhost dev]# cd /floppylinux/floppylinux/floppyImage/
[root@localhost floppyImage]# cd etc/
[root@localhost etc]# vi inittab
inittab内容为:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
[root@localhost etc]# vi fstab
fstab内容为(注意里面是defaults不是defalut):
proc /proc proc defaults 0 0
[root@localhost etc]# cd init.d/
[root@localhost init.d]# vi rcS
rcS内容为:
#!/bin/sh
mount –a
# chmod 755 rc.sysinit
[root@localhost init.d]# cd /mnt/floppy/
[root@localhost floppy]# ls
boot lost+found
[root@localhost floppy]# cd boot/grub
[root@localhost grub]# vi grub.conf
grub.conf内容为:
timeout 0
default 10
title FloppyLinux
root (fd0)
kernel /boot/bzImage
initrd /initrd.img.gz
之后建立连接文件menu.lst(注意该文件后缀为 lst,不是1st)
[root@localhost grub]# ln -s grub.conf menu.lst
[root@localhost grub]# ls
grub.conf menu.lst stage1 stage2
9、制作镜像文件initrd.img
[root@localhost grub]# cd /mnt/floppy/boot/
[root@localhost boot]# dd if=/dev/zero of=/dev/ram1
dd: 正在写入 ‘/dev/ram1’: 设备上没有空间
读入了 8193+0 个块
输出了 8192+0 个块
[root@localhost boot]# mke2fs -m0 /dev/ram1
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1024 inodes, 4096 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost boot]# mkdir /mnt/ram
[root@localhost boot]# mount /dev/ram1 /mnt/ram/
将先前做好的floppylinux根文件系统拷贝到ram1上
[root@localhost boot]# cp -R /floppylinux/floppylinux/floppyImage/* /mnt/ram/
[root@localhost boot]# umount /dev/ram1
[root@localhost boot]# dd if=/dev/ram1 of=/floppylinux/floppylinux/floppyImage/initrd.img
读入了 8192+0 个块
输出了 8192+0 个块
[root@localhost boot]# file /floppylinux/floppylinux/floppyImage/initrd.img
/floppylinux/floppylinux/floppyImage/initrd.img: Linux rev 1.0 ext2 filesystem data
10、检查initrd.img,用loop设备来把他重新挂载到文件系统里,之后压缩initrd.img镜像文件
[root@localhost boot]# cd /floppylinux/floppylinux/floppyImage/
[root@localhost floppyImage]# mount -o loop initrd.img /mnt/ram/
[root@localhost floppyImage]# ls /mnt/ram/
bin dev etc linuxrc lost+found mnt proc sbin tmp var
[root@localhost floppyImage]# umount /mnt/ram/
[root@localhost floppyImage]# gzip -v9 initrd.img
initrd.img: 90.2% -- replaced with initrd.img.gz
查看压缩之后的大小
[root@localhost floppyImage]# ls -lh initrd.img.gz
-rw-r--r-- 1 root root 403K 10月 31 22:57 initrd.img.gz
只有403k大小(其实我做时有时404k有时402k,总之在403k大小左右)
11.编译linux系统内核
(说明一下,该步骤的目的是生成一个654k左右大小的bzImage文件,该步骤与前面的步骤没有任何关系,即,你可以先做该步骤将生成的bzImage文件保存下来,再次做floppylinux时时候(或者传给同学)。。。)
若使用的是李永老师给的虚拟机可以直接进入linux源代码目录:
[root@localhost floppyImage]# /usr/src/linux-2.4
清理源代码树:
[root@localhost linux-2.4]# make mrproper
运行配置程序:
[root@localhost linux-2.4]# make menuconfig
进入配置界面,具体配置信息如下:
Code maturity level options--->
里面就一个选项 Prompt for development..... 先选择N
Loadable module support--->
里面有三个选项,选择N。(将第一个选N之后剩下的两个自动消失)。
Processor type and featurres--->
第二行(Pentium-ProCeleron/Pentium-II) Processor family 中选择 386
第一行到最后一行全部选N。其中第四行CPU Frequency scling --->选项进不去,不管他。倒数第七行(4GB) High Memory Support使用默认值。
General setup--->
选Y的有 networking support,PCI support ,System V ipc ,systrl support,kernel support for ELF binaries
(Any)PCI access mode使用默认值,倒数第五行Kernel core (/proc/kcore) fromat选择ELF
其他选项都选N。
Memory Technology Devices(MTD)--->
选N。
Parallel port support --->
选N(第一个选项选N后剩下的两个会自动消失)。
Plug and Play configuration --->
选N(第一个选项选N后第二个会自动消失)。
Block devices --->
选Y的有 Normal floppy disk support ,Loopback device support ,RAM disk support ,initial RAM disk (initrd) support ,Per partition statics in /proc/partitions。
倒数第三行 Default RAM disk size 使用默认值(4096)。
Multi-devices support (RAID and LVM) --->
全部使用默认值。
Cryptography support (CrytoAPI) --->
就一个选项 CryptoAPI support,选N。
Networking options --->
选择Y的有: Packet socket ,Packet socket: mmapped IO ,TCP/IP networking(其中TCP/IP networking下的选项都选N如图所示)
其他的选项都选N,需要注意的是,倒数第一项(Network testing)倒数第二项(QoS and/or fair queueing)和倒数第五项(Appletalk devices)需要点进去,把里面的选项都选N。(Appletalk devices好像点不进去。。。)。
Telephony Support --->
就一项,选N。
ATA/IDE/MFM/RLL support --->
第一项 ATA/IDE/MFM/RLL support选Y,然后下面的IDE,ATA and ATAPI Block Devices 就被激活,进入IDE,ATA and ATAPI Block Devices--->之后,其中选择Y的有:Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support ,Include IDE/ATA-2 DISK support ,Auto-Geometry Resizing support ,Include IDE/ATA CDROM support(共4项)
SCSI support --->
选N。(第一项选N后其他项会自动消失)
Fusion MPT device supprot --->
选N。(其实我做的时候并不能选择进入)
I2O device support --->
就一项,选N。
Network device support --->
第一行选Y,然后其他行(除了Ethernet (10 or 100Mbit)--->)都选N(是子目录选项的也要回车进入将里面的选项选N。)。
再进入Ethernet (10 or 100Mbit)--->,里面选Y的有:第一行Ethernet (10 or 100Mbit)、EISA VLB PCI and on board controllers和RealTek RTL-8139 PCI Fast Ethernet Adapter support 。
Amateur Radio support --->
选N。(第一项选N后其他项会自动消失)
IrDA (infrared) support --->
选N。(第一项选N后其他项会自动消失)
ISDN subsystem --->
全选N。
Input core support --->
选N。
Character devices --->
选择Y的有:Virtual terminal和 Support for console on virtual terminal。
剩下的全选N。(这句话的意思是,如果某选项为子菜单,即最后为 --->,可以选择进入,那么也要进入该子菜单将里面的内容选为N)
Multimedia devices --->
全部选N。(其实就三项,将第一项选N后剩下的会自动消失)
Crypto Hardware support --->
选N。
File systems --->
选择Y的有:ISO 9660 CDROM file support,Microsoft Joliet CDROM extensions,/proc file system support和Second extended fs support。
其他的全部选N(最后三项Network File Systems,Partition Types和Native Language Support需要回车进入,将里面的所有选项都选N)。
Console drivers --->
首先回到第一大项 Code maturity level options,将其选Y。
然后回到Console drivers这一项,将前三行(VGA text console,Video mode selection support和Ignore bad video mode selection)选Y,第四行选N。然后进入第五行Fram-buffer support --->,里面选Y的有:Support for frame buffer devices (EXPERIMENTAL)、VESA VGA graphics console和Support only 8 pixels wide fonts。其他都选N。
返回主目录后找到会多出来一项IEEE 1394(FireWire)support (EXPERIMENTAL)--->,选N。
剩下的Sound--->、USB support--->、Additional device driver support --->、Bluetooth support --->、Profiling support--->、Kernel hacking --->和Library routines--->都选N!!!都选N!!!有子目录也要回车进入把里面的选项选N。
最后回到第一大项 Code maturity level options,将其选N
到这里就完成的配置,然后运行以下命令(执行时间可能有点长):
[root@localhost linux-2.4]# make dep
[root@localhost linux-2.4]# make bzImage
可以看到我生成的bzImage文件大小为654k,路径为/usr/src/linux-2.4.20-8/arch/i386/boot。(生成的文件大小可能不同,可能690k也可能657k都可以)。
12、整合启动盘
[root@localhost linux-2.4]# cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /mnt/floppy/boot/
[root@localhost linux-2.4]# cp /floppylinux/floppylinux/floppyImage/initrd.img.gz /mnt/floppy/
现在/mnt/floppy/的文件树结构如下:
[root@localhost linux-2.4]# init 6
重启电脑过一会之后会显示
Please press Enter to activate this console
输入回车即可输入linux的命令,进入floppylinux
成功截图如下: