免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1297 | 回复: 0
打印 上一主题 下一主题

制作U盘linux [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-20 10:42 |只看该作者 |倒序浏览
 首先要到合适的编译路径,一般路径都在/usr/src/Linux,RH9的路径是在/usr/src/Linux-2.4,只有在这个路径你的命令才会生效。否则会显示
make: *** No rule to make target 'config' , stop的错误提示.
  如果你以前编译过内核,那应当先执行#make mrproper 这个命令,它可以删除以前的建构的痕迹。如果你没有编译过,可以不执行它。
  接下来执行#make menuconfig 开始配置内核,把你认为不需要的东西都不要编译到内核,比如业余电台,csi,I20,IrDA,isdn,bluetooth.最后保存为.config后退出。
再接下来就依次执行以下命令:
#make dep (设置依赖关系)
#make clean (准备要建构的源码树)
#make bzImage (建构内核 )
#make modules ( 配置模块)
#make modules_install (使用配置的模块)
#make install (把新的内核和相关文件复制到正确的目录)
  执行到这里,在/boot下会看到名字为vmlinuz-2.4.22custom的文件。这就是我们编译得到的内核。如果它的size大于 1.44M,那就得重新编译,再去掉一些不需要的东西,直到内核小于1.44M,为了便于记忆,我们不妨将它重新命名为newkernel,接下来我们紧接着制作根文件系统。
根文件系统的制作
  制作根文件系统前,我们先要解决一个问题:因为一个根文件系统要实现基本的功能,必须包括一些常用工具:如:sh,ls,cd,cat…… 但是常用工具会占用很多空间,要是用原来系统中的这些命令,就是全部用静态编译,不是用动态连接库,大概也要有2MB~3MB,放不进软盘。因此我们我们的解决的方案是使用BusyBox工具。BusyBox 它包含了七十多种 Linux 上标准的工具程序,只需要的磁盘空间仅仅几百 k 。在嵌入式系统上常用到它 (例如 Linux Router Project 和 Debian boot floppy就使用到它)
建立 BusyBox
首先我们从官方网站上下载BusyBox的最新版本:busybox-1.00-rc3.tar.gz并且解开
#tar zxvf busybox-1.00-rc3.tar.gz
为了压缩空间,我们采用静态编译,修改 Makefile 中的 DOSTATIC 参数为true
DOSTATIC=true
然后修改 BusyBox 中的 init.c,设定系统要执行的第一个程序为: /etc/rc.d/rc.sysinit
#define INIT_SRCIPT \"/etc/rc.d/rc.sysinit\"
开始编译BusyBox
#make
#make install
到这一步我们就得到了可执行命令busybox
解决了这个问题后,我们可以开始制作根文件系统
制作根文件系统
首先为根文件系统建一个目录叫做 floppy-Linux,然后进入 floppy-Linux 目录内
# mkdir floppy-Linux
# cd floppy-Linux
然后为 root filesystem 建立一些标准的目录
# mkdir dev etc etc/rc.d bin proc mnt tmp var
# chmod 755 dev etc etc/rc.d bin mnt tmp var
# chmod 555 proc
# ln -s sbin bin
然后进入 /dev 目录下建立根文件系统必须的一些设备文件。
建立一般终端机设备
# mknod tty c 5 0
# mkdir console c 5 1
# chmod 666 tty console
建立 VGA Display 虚拟终端机设备
# mknod tty0 c 4 0
# chmod 666 tty0
建立 RAM disk 设备
# mknod ram0 b 1 0
# chmod 600 ram0
建立 floppy 设备
# mknod fd0 b 2
# chmod 600 fd0
建立 null 设备
# mknod null c 1 3
# chmod 666 null
到这里我们就有了一个初步的小型根文件系统,但是还需要配置一些有关的 shell script来完善它。
编辑有关的 shell script
首先进入到 /floppy-Linux/etc/ 这个目录下编辑 inittab,rc.d/rc.sysinit,fstab这三个文件 ,内容分别如下:
inittab
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh
rc.sysinit
#!/bin/sh
mount –a
fstab
proc /proc proc defaults 0 0
然后修改inittab,rc.sysinit,fstab这三个文件的权限
# chmod 644 inittab
# chmod 755 rc.sysinit
# chmod 644 fstab
配置完shell script后,我们注意到这些shell script会使用一些 /bin目录下的命令,但是我们的/bin目录下是空的。现在我们就使用BusyBox来制作这些常用命令。
使用BusyBox制作常用命令
将busybox 复制到软盘的/bin目录下,并且改名为init
# cp busybox /floppy-Linux/bin/init
然后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。
ln -s busybox ls
ln -s init cp
ln -s init mount
ln -s init umount
ln -s init more
ln -s init ps
ln -s init sh
现在我们就有了所需的常用命令。
  到这里我们的根文件系统就制作完成了,但是和内核一样,要把根文件系统部分放到一张1.44MB的软盘上去,也要进行压缩,下面我们就着手压缩它。
压缩根文件系统
  一般我们会采取 RAM Disk 的方式实现。简单的来说就是将准备好的根文件系压缩成为Ramdisk的镜像文件,当用软盘启动时,再把镜像文件解压到内存中,形成一个虚拟盘(RAMDISK),通过RAMDISK控制系统启动。
我们现在制作Ramdisk的镜像文件
# dd if=/dev/zero of=/tmp/tmp_loop bs=1k count=2048
# losetup /dev/loop0 /tmp/tmp_loop
# mke2fs -m 0 /dev/loop0
# mount -t ext2 /dev/loop0 /mnt
# cp -a /floppy-Linux /mnt
# umount /mnt
# losetup -d /dev/loop0
# dd if=/tmp/tmp_loop | gzip -9 > /tmp/Image.gz
# rm -f /tmp/tmp_loop
# sync
这样我们就得到了压缩过的根文件系统也就是Ramdisk的镜像文件Image.gz。
目前为止我们已经有了内核和压缩过的根文件系统.现在剩下的就是把它们整合在一张软盘里面。
整合核心和根文件系统
根据引导的方式不同,有以下三种整合方案:
用grub引导
依次执行:
# mke2fs /dev/fd0
# mount /dev/fd0 /mnt/floppy
# mkdir /mnt/floppy/boot
# mkdir /mnt/floppy/boot/grub
# cp /boot/grub/stage1 /mnt/floppy/boot/grub
# cp /boot/grub/stage2 /mnt/floppy/boot/grub
#grub
在 grub> 提示符处,输入:
grub> root (fd0)
grub> setup (fd0)
grub> quit
#cp newkernel /mnt/floppy/boot
#cp Image.gz /mnt/floppy/boot
#cp /boot/grub/grub.conf /mnt/floppy/boot/grub
编辑grub.conf, 内容如下:
timeout 10
default 0
title My little Linux
  root (fd0)
  kernel /boot/newkernel ro root=/dev/ram0
  initrd /boot/ Image.gz
然后制作grub.conf的link文件menu.lst
#ln -s /mnt/floppy/boot/grub/grub.conf /mnt/floppy/boot/grub/menu.lst
#umount /mnt/floppy
整合完成!
用sysLinux引导
依次执行:
# mkdosfs /dev/fd0
# sysLinux /dev/fd0
编辑 sysLinux 的组态档 sysLinux.cfg,内容如下
TIMEOUT 20
DEFAULT Linux
LABEL Linux
KERNEL newkernel
APPEND root=/dev/ram0 ro initrd=Image.gz
然后将 sysLinux.cfg、newkernel、Image.gz 拷贝到磁盘中
# mount /dev/fd0 /mnt/floppy
# cp newkernel /mnt/floppy
# cp Image.gz /mnt/floppy
# cp sysLinux.cfg /mnt/floppy
#umount /mnt/floppy
整合完成!
直接引导
依次执行:
# dd if=newkernel of=/dev/fd0 bs=1k
252+1 records in
252+1 records out
在这个例子中,dd 写入了 252 个完整记录(records) + 1个partial record ,所以内核占用了 253 个软盘的 blocks 。这个数字称为 KERNEL_BLOCKS ,请记得它,这个数字还要使用.
#rdev /dev/fd0 /dev/fd0
#rdev -R /dev/fd0 0
#rdev -r /dev/fd0 VALUE
在这里这个VALUE的值应为16384+ KERNEL_BLOCKS(上一步dd 命令所产生的数值)
所以本例应为:
#rdev -r /dev/fd0 16637
#dd if= root system file of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS
在这里这个KERNEL_BLOCKS就是上一步dd 命令所产生的数值
所以本例应为:dd if= Image.gz of=/dev/fd0 bs=1k seek=253
整合完成!
  现在我们就拥有了一张可以自激活到Linux环境的软盘。对于本例来讲,想要执行AMD官方测试软件Maxpower64,只要将Maxpower64这个可执行文件复制到 /bin目录就可以了。我们可以在“使用BusyBox制作常用命令“这个阶段来完成它.
# cp Maxpower64 /floppy-Linux/bin
这张软盘会自激活到linux环境下,并显示“#”命令提示符,我们只要执行Maxpower64就可以了。
#/bin/Maxpower64
如果希望系统一开机就直接执行Maxpower64,则需要在“编辑有关的 shell script”这个阶段编辑rc.sysinit文件为:
#!/bin/sh
mount –a
/bin/Maxpower64
这样软盘引导进入linux后会直接执行Maxpower64而不再显示“#”命令提示符。
小结
  除了以上的方法,我们也可以通过引导器给内核传递参数来实现内核和根文件系统分别放置在不同的软盘上,这样内核就可以再大一些,支持的功能也就越多。总之制作一张包含小型linux的软盘并不困难,关键是要细心和耐心,此外最好能够了解BusyBox和RAMDISK的工作原理,这对于更好的完善系统是有很大帮助的。
科技进步到今天,软驱开始慢慢退出市场,取而代之的是优盘。优盘和软盘相比,不但在容量上要大很多,而且在速度上也快了许多。以往建在软盘上的Linux 由于受限于1.4MB的容量,所以多数被用来做小型路由器、防火墙之类的应用。而今天有了几十MB、几百MB甚至上GB的优盘后,就完全可以提供小型的 HTTP、邮件等需要更大存储空间的服务了。想想看用户只要把这个特制的优盘插入电脑的USB接口,就可以启动一个小型的Linux系统。这个系统已经有了路由、HTTP和邮件等功能,只需快速设置一下IP等参数就可以开始工作了。这就相当于用户随身带着一台Linux服务器,方便极了。
要制作优盘Linux,首先在硬件上要满足以下条件:
1.优盘带有启动功能;
2.主板支持USB设备启动(如USBZip启动)。
有了合适的硬件条件后,用户就可以开始动手制作优盘Linux了。以下所有工作都在Linux环境下完成,笔者的软硬件环境如下:
软件环境:Federa Linux 1.0,系统采用GRUB做引导程序;
硬件环境:P42.0GHz、主板Intel 845、内存512MB、两个80GB硬盘(hda、hdb)和带启动功能的128MB优盘。
下面就开始介绍优盘Linux的制作过程。
分区和格式化
首先,将已经设置为带启动功能的优盘插入USB接口,使用下面的命令对其进行分区和格式化:
# fdisk /dev/sda
其中/dev/sda设备指用户的优盘。如果用户的机器中还有其它的SCSI设备,那么可能是/dev/sdb等。用户使用“fdisk”删除优盘原来的所有分区,并将128MB的空间都分成一个Linux基本分区。接下来用户要将其格式化为Ext2文件系统,可以使用以下命令:
# mkfs.ext2 /dev/sda1
安装GRUB
有了已经格式化好的Ext2的文件系统,接下来用户就可以在这个文件系统上安装Linux的引导程序GRUB了。
首先,要将格式化好的优盘上的文件系统挂载到当前的Linux系统中。命令如下:
# mount /dev/sda1 /usb
接着,要建立GRUB所需要的目录,并将当前使用的Linux系统中的GRUB相关文件(/boot/grub/目录下的stage1和stage2)复制到优盘的/usb/boot/grub下。命令如下:
# mkdir /usb
# mkdir /usb/boot
# mkdir /usb/boot/grub
# cp /boot/grub/stage* /usb/boot/grub/
然后,使用“grub”命令将GRUB引导程序安装在优盘上。具体可以参考如下:
grub> root (hd2,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd2)
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 (hd2) /boot/
grub/stage2 p /boot/grub/grub.conf”... succeeded
Done.
grub>quit
上面操作中的像“(hd2)”这样的参数可能随用户机器的硬盘数量和分布情况的差异会有所不同。在安装完GRUB后,还要对其进行配置。用户在优盘的/usr/boot/grub目录下创建grub.conf文件,命令如下:
# vi /usb/boot/grub/grub.conf
grub.conf文件的内容如下:
default=0
timeout=10
title My USB Linux
root (hd0,0)
kernel /vmlinuz
保存退出,GRUB配置完成。此时可以测试用优盘启动机器,会看到GRUB的启动画面和选项“My USB Linux”了。
注意在测试优盘启动时,将两个硬盘的电源线都要拔掉,因为在上面的grub.conf中设定的根分区是hd0。
编译内核
首先用户要根据用途考虑使用哪一个版本的内核。比如要使用Iptables来建立防火墙,那就一定要选择2.4以上的版本。但要记住,版本并不是越高越好。选定内核的版本后,从kernel.org上下载对应的源码。在动手配置内核之前,还要对内核的源码做一个小小的修改。从内核的源码树中找到init目录下的do_mounts.c文件,请根据自己的源码版本做类似下面的修改:
* Allow the user to distinguish between failed open
* and bad superblock on root device.
*/
-  printk (“VFS: Cannot open root device“%s”or %s”,
+  printk (“VFS: Cannot open root device“%s”or %s”,
   retrying in 1 second.", root_device_name, kdevname (ROOT_DEV));
-  printk (“Please append a correct “root=”boot option”);
-  panic(“VFS: Unable to mount root fs on %s”,
-  kdevname(ROOT_DEV));
+  printk (“You may need to append a correct“root=”boot option”);
+  printk (“or wait for the root device to become ready.”);
+
+  /* wait 1 second and try again,
+  * allowing time for hubs/devices to become ready */
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ);
+ goto retry;
        )
  panic(“VFS: Unable to mount root fs on %s”, kdevname(ROOT_DEV));
做这一步修改是考虑到,通常在Linux启动过程中,内核解压运行完成后,会加载root分区,然后执行root分区上的init脚本。当用户使用硬盘时,硬盘的初始化速度很快。在内核运行完成之前,因为硬盘已经准备就绪了,所以内核可以顺利加载硬盘上的root分区。然而优盘初始化速度要比硬盘慢多了。这样就会出现内核启动完成后,因优盘还没有完成初始化而导致root分区无法被加载的现象。所以要想使用优盘启动Linux就需要延长内核加载root分区的等待时间,办法就是对系统内核初始化代码do_mounts.c作类似上面的修改。
当然还有其它的解决办法,比如在内核启动时,先将一个临时的root分区设在RAM disk上,然后等待几秒钟,在优盘差不多初始化完成后再继续启动。这种方法就要选上对“RAM disk”的支持,而且还要修改initrd.img文件等。所以除非用户想同时用RAM disk做一些其它的用途(如运行特定程序或加载其它的驱动),否则就不建议使用这种方法。
在完成源码的修改后,就可以开始配置内核了。在配置过程中将所有需要的功能和驱动都编译进内核中去。注意要将一些不必要的模块去掉,比如声卡和显卡驱动等。还要特别注意对网络方面的支持要广泛一些,要尽量将可能遇到的网卡的驱动编译进内核。
常见的USB芯片类型有EHCI、OHCI和UHCI三种。因为对于常见的PC机主板来说一般使用的是UHCI芯片的USB控制器,所以在USB设备的配置中,要对应的选上对“UHCI Alternate Driver (JE) support”的支持。另外,还要选上“Preliminary USB device filesystem”。因为在Linux中,优盘等类似设备都是被模拟成SCSI硬盘而进行访问。以下是执行“make menuconfig”命令配置内核时关于USB的选项实例,可供参考:
Support for USB
[ ]   USB verbose debug messages
--- Miscellaneous USB options
  •    Preliminary USB device filesystem
    --- USB Host Controller Drivers
       UHCI Alternate Driver (JE) support
       OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
    --- USB Device Class drivers
       USB Mass Storage support
    [ ]     USB Mass Storage verbose debug
    [ ]     Freecom USB/ATAPI Bridge support
    [ ]     ISD-200 USB/ATA Bridge support
    [ ]     Microtech CompactFlash/SmartMedia support
    细心完成内核配置后,最后就是编译内核了。内核的编译方法大家应该很熟悉了,通常是使用“make mrproper”、“make menuconfig”、“make dep”、“make clean”和“make bzImage”等指令来编译。
    编译完成后,新的内核就是arch/i386/boot/目录中的bzImage文件,将其复制到优盘上,命名如下:
    # cp arch/i386/boot/bzImage /usb/vmlinuz
    编译成功的内核通常不会超过1MB。在实际制作优盘Linux的过程中,定制内核是非常关键的。很多人失败在这个地方。通常要多次尝试,才能生成适合的内核。
    目录和文件
    内核启动后,要加载root文件系统。在Linux中,root文件系统中包含了系统必须的目录、设备文件、可执行文件和配置文件等。
    首先创建系统必需的目录,示意如下:
    # mkdir bin etc etc/rc.d proc tmp var dev mnt
    # chmod 755 bin etc etc/rc.d tmp var dev mnt
    # chmod 555 proc
    接着要用“mknod”命令在dev目录下建立一些基本的设备文件,不可从原系统/dev目录中复制。具体请参考下列实例命令:
    cd dev
    mknod tty c 5 0
    mknod console c 5 1
    chmod 666 tty console
    mknod tty0 c 4 0
    chmod 666 tty0
    mknod ram0 b 1 0
    chmod 600 ram0
    然后生成一些常用命令和工具,比如sh、ls、cd和ifconfig等。用户可以使用原来系统中的这些命令,不过要对应地将其所用到的动态连接库也复制到优盘上,或者是重新进行静态编译,然后将二进制文件复制到优盘上。这些过程都不轻松,如果想研究Linux,或者是想在优盘Linux上使用Glibc的话,可以自己动手来做一下。对于大多数人,可以使用BusyBox工具箱来做这件事。BusyBox提供了一个很小的可执行程序busybox。用户通过链接它可以为系统提供ls、rm、cp和init等多种命令。busybox的安装过程很简单。在Fedora Linux中已经自带,用户也可以自行下载源码来编译安装。安装完后,可以将busybox产生的文件复制到优盘中,具体可以参考其官方网站http: // www.busybox.net上的说明。
    最后,还要建立一些配置文件,比如/etc/rc.d/inittab、/etc/rc.d/rc.sysinit和/etc/fstab等。下面是这几个文件的简单实例,仅供参考:
    1./etc/rc.d/inittab
    ::sysinit:/etc/rc.d/rc.sysinit
    ::askfirst:/bin/sh
    2./etc/rc.d/rc.sysinit
    #!/bin/sh
    mount -a
    3./etc/fstab
    proc /proc proc defaults 0 0
    完成上面这些工作之后,就可以测试这个小型的优盘Linux了。
    在启动时,先是GRUB引导,接下来就是内核解压和初始化,然后调用/sbin/init,由init来调用/etc/inittab中的各种程序运行(比如加挂各种分区等),最后在console上启动一个Shell程序,这样就完成了启动。如果在启动中遇到问题,还要反复进行修改和测试,这中间的过程就要靠自己去摸索了。
    优盘Linux的应用
    创建和定制完Linux系统所需的目录结构和文件之后,就已经完成了一个小型的Linux系统了。这个小型的Linux系统主要可以有以下几个方面的应用。
    做为应急盘
    当Linux系统故障时,可以用这个优盘启动系统,然后将原系统的硬盘挂进文件系统,进行诊断和修复。盘中可以放入一些常用的诊断工具和软件。
    提供应用服务
    此时这个小型的Linux系统本身已经可以提供路由和防火墙等功能了。不过用户还可以加入其它的应用服务,这要视用户自己的需要而定。比如一个Web开发人员,可以装上MySQL、Apache、PHP和CVS等服务。这些服务可以先在其它的Linux上静态编译好,然后将其复制到优盘上。
    其它
    优盘还可以有其它的用途,比如作为密匙盘,为Linux的启动或应用程序提供访问控制认证等。(T111)
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/24071/showart_173872.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP