制作ramdisk根文件系统大家说

制作ramdisk根文件系统大家说 来源: ChinaUnix博客  日期: 2008.02.14 10:45 (共有0条评论) 我要评论 隐逸桃源说: 1、ramdisk是一个最小的linux rootfs系统,它包含了除内核以外的所有linux系统在引导和管理时需要的工具,包含如下目录:bin,dev,etc,home,lib,mnt,proc,sbin,usr,var。还需要有一些基本的工具:sh,ls,cp,mv……(位于/bin目录中);必要的配置文件:inittab,rc,fstab……位于(/etc目录种);必要的设备文件:/dev/tty*,/dev /console,/dev/men……(位于/dev目录中);sh,ls等工具必要的运行库:glibc。 2、首先建立一个空的ramdisk image文件: xuxian@omap1:~$cd /home/xuxian/fsys xuxian@omap1:~$dd if=/dev/zero of=rootfs bs=1M count=16 ramdisk image文件名为rootfs,大小为16M。 把它格式化为你需要的文件系统,比如 ext2 ,ext3等。 比如ext3 : xuxian@omap1:~$mkfs.ext3 -m 0 -N 2000 ./rootfs 这里的-N 2000表示最大的node数为2000。因为linux的设备也是基于文件系统的,需要占用文件系统的node,如果数目建立的太少,以后可能会不够用。 然后把它mount到某个目录: xuxian@omap1:~$mkdir ramdisk xuxian@omap1:~$mount -t ext3 -o loop ./rootfs ./ramdisk xuxian@omap1:~$cd ramdisk xuxian@omap1:~$ls xuxian@omap1:~$lost+found 通过这一步,已经得到一个空的ramdisk image文件了。 3、建立各个目录: xuxian@omap1:~/fsys/ramdisk$mkdir dev xuxian@omap1:~/fsys/ramdisk$mkdir proc xuxian@omap1:~/fsys/ramdisk$mkdir etc xuxian@omap1:~/fsys/ramdisk$mkdir sbin xuxian@omap1:~/fsys/ramdisk$mkdir bin xuxian@omap1:~/fsys/ramdisk$mkdir lib xuxian@omap1:~/fsys/ramdisk$mkdir mnt xuxian@omap1:~/fsys/ramdisk$mkdir usr xuxian@omap1:~/fsys/ramdisk$mkdir tmp xuxian@omap1:~/fsys/ramdisk$mkdir root xuxian@omap1:~/fsys/ramdisk$mkdir home xuxian@omap1:~/fsys/ramdisk$mkdir var xuxian@omap1:~/fsys/ramdisk$mkdir usr/bin xuxian@omap1:~/fsys/ramdisk$mkdir usr/sbin xuxian@omap1:~/fsys/ramdisk$mkdir usr/lib 对单用户来说,home和root不是必须的。 4、/dev目录: omap1:/home/xuxian/fsys/ramdisk/dev$mknod -m 600 console c 5 1 omap1:/home/xuxian/fsys/ramdisk/dev$mknod -m 666 tty c 5 0 omap1:/home/xuxian/fsys/ramdisk/dev$mknod -m 600 tty0 c 4 0 omap1:/home/xuxian/fsys/ramdisk/dev$mknod -m 600 ttyS0 c 4 64 也可以用一种简单的方法来创建/dev里面的文件:首先你要下载一个文件系统 omap1:/home/xuxian/fsys/ramdisk/dev$cp -dpR /home/xuxian/osk/rootfs2.6/dev/* . 这个命令把下载的文件系统的/dev目录拷贝到ramdisk的/dev中。dp参数表示符号连接拷贝为符号连接,不拷贝连接的符号,并且拷贝源文件的所有属性。 5、/lib目录: 下面是arm-linux的动态库,可以选择一些必须的拷贝到ramdisk的lib下。 omap1:/home/iaadoa/work/crosstool/gcc-3.3.2-glibc-2.3.2/arm-linux/arm-linux/l ib# ls crt1.o libc_nonshared.a libmcheck.a libnss_hesiod.so.2 librt.a crti.o libcrypt-2.3.2.so libmemusage.so libnss_nis-2.3.2.so librt.so crtn.o libcrypt.a libm.so libnss_nisplus-2.3.2.so librt.so.1 gconv libcrypt.so libm.so.6 libnss_nisplus.so libSegFault.so gcrt1.o libcrypt.so.1 libnsl-2.3.2.so libnss_nisplus.so.2 libstdc++.a ld-2.3.2.so libc.so libnsl.a libnss_nis.so libstdc++.la ld-linux.so.2 libc.so.6 libnsl.so libnss_nis.so.2 libstdc++.so ldscripts libc.so_orig libnsl.so.1 libpcprofile.so libstdc++.so.5 libanl-2.3.2.so libdl-2.3.2.so libnss_compat-2.3.2.so libpthread-0.10.so libstdc++.so.5.0.5 libanl.a libdl.a libnss_compat.so libpthread.a libsupc++.a libanl.so libdl.so libnss_compat.so.2 libpthread_nonshared.a libsupc++.la libanl.so.1 libdl.so.2 libnss_dns-2.3.2.so libpthread.so libthread_db-1.0.so libBrokenLocale-2.3.2.so libg.a libnss_dns.so libpthread.so.0 libthread_db.so libBrokenLocale.a libgcc_s.so libnss_dns.so.2 libpthread.so_orig libthread_db.so.1 libBrokenLocale.so libgcc_s.so.1 libnss_files-2.3.2.so libresolv-2.3.2.so libutil-2.3.2.so libBrokenLocale.so.1 libiberty.a libnss_files.so libresolv.a libutil.a libbsd-compat.a libieee.a libnss_files.so.2 libresolv.so libutil.so libc-2.3.2.so libm-2.3.2.so libnss_hesiod-2.3.2.so libresolv.so.2 libutil.so.1 libc.a libm.a libnss_hesiod.so librt-2.3.2.so Mcrt1.o 以下这些是必须的: ld-2.3.2.so libmemusage.so libnss_nisplus.so.2 ld-linux.so.2 libm.so.6 libnss_nis.so.2 libanl-2.3.2.so libnsl-2.3.2.so libpcprofile.so libanl.so.1 libnsl.so.1 libpthread-0.10.so libBrokenLocale-2.3.2.so libnss_compat-2.3.2.so libpthread.so.0 libBrokenLocale.so.1 libnss_compat.so.2 libresolv-2.3.2.so libc-2.3.2.so libnss_dns-2.3.2.so libresolv.so.2 libcrypt-2.3.2.so libnss_dns.so.2 librt-2.3.2.so libcrypt.so.1 libnss_files-2.3.2.so librt.so.1 libc.so.6 libnss_files.so.2 libSegFault.so libdl-2.3.2.so libnss_hesiod-2.3.2.so libthread_db-1.0.so libdl.so.2 libnss_hesiod.so.2 libthread_db.so.1 libgcc_s.so.1 libnss_nis-2.3.2.so libutil-2.3.2.so libm-2.3.2.so libnss_nisplus-2.3.2.so libutil.so.1 拷贝到ramdisk的lib目录下就行了。 6、安装busybox: 下载busybox-1.01 xuxian@omap1:~/osk$tar -xjvf busybox-1.01.tar.bz2 xuxian@omap1:~/osk/busybox-1.01$make TARGET_ARCH=arm CROSS=arm-linux- PREFIX=/home/xuxian/fsys/ramdisk menuconfig xuxian@omap1:~/osk/busybox-1.01$make TARGET_ARCH=arm CROSS=arm-linux- PREFIX=/home/xuxian/fsys/ramdisk dep xuxian@omap1:~/osk/busybox-1.01$make TARGET_ARCH=arm CROSS=arm-linux- PREFIX=/home/xuxian/fsys/ramdisk xuxian@omap1:~/osk/busybox-1.01$make TARGET_ARCH=arm CROSS=arm-linux- PREFIX=/home/xuxian/fsys/ramdisk inatall xuxian@omap1:~/fsys/ramdisk/bin$ls addgroup chown dmesg gzip login netstat sed true adduser cp echo hostname ls pidof sh umount ash date egrep ip mkdir ping sleep uname busybox dd false ipaddr mknod ps su usleep cat delgroup fgrep iproute more pwd sync vi chgrp deluser grep kill mount rm tar zcat chmod df gunzip ln mv rmdir touch 这些就是可用的命令。 7、/etc下系统配置文件说明: xuxian@omap1:~/fsys/ramdisk/etc/$vi inittab # # This is run first except when booting in single-user mode #指定初始化文件 ::sysinit:/etc/init.d/rcS # /bin/sh # # Start an "askfirst" shell on the console (whatever that may be) #启动时执行的shell ::askfirst:-/bin/sh # Stuff to do when restarting the init process #重启动作 ::restart:/sbin/init # Stuff to do before rebooting ::ctrlaltdel:/sbin/reboot #关机时动作,卸载所有文件系统 ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a 再来编写rcS脚本: xuxian@omap1:~/fsys/ramdisk/etc/$mkdir init.d xuxian@omap1:~/fsys/ramdisk/etc/$cd init.d xuxian@omap1:~/fsys/ramdisk/etc/init.d$vi rcS 脚本如下: #!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin HOSTNAME=OMAP5912OSK hostname $HOSTNAME echo "" echo "******************************************" echo "Starting System Init for $HOSTNAME" echo "******************************************" # goto the init.d directory cd /etc/init.d # Mount the default file systems mount -a # Mount the default file systems # Configure network #/sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0 broadcast 127.255.255.255 #/sbin/ifconfig eth0 128.247.75.151 netmask 255.255.254.0 broadcast 128.247.75.255 #/sbin/route add default gw 128.247.74.1 eth0 然后时rcS2脚本: xuxian@omap1:~/fsys/ramdisk/etc/init.d$vi rcS2 #!/bin/sh /bin/mount -n -o remount,rw / /bin/mount -a echo Starting Network #modprobe i2c-core #modprobe i2c-algo-bit #modprobe i2c-omap1510 #modprobe soundcore #modprobe omap-audio #modprobe omap1510-aic23 /sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0 broadcast 127.255.255.255 /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo /sbin/ifconfig eth0 10.1.3.3 netmask 255.255.0.0 broadcast 10.1.255.255 /sbin/route add default gw 10.1.0.100 eth0 ~ ~ 最后时编写fstab脚本,我的很简单: xuxian@omap1:~/fsys/ramdisk/etc$vi fstab proc /proc proc defaults 0 0 8、用nfs检查根文件系统: 做完以上这些就可以用nfs来启动目标系统了。编辑/etc/exports加入/home/xuxian/fsy s/ramdisk 192.168.4.190(rw,sync,no_root_squash,no_all_squash)其中192.168.4.19 0是目标板的ip。 连接目标板用tftp或者串口线下载u-boot和kernel,在u-boot的环境变量中加入:seten v bootargs console=ttyS0,115200n8 noinitrd rw ip=dhcp root=/dev/nfs nfsroot=192.168.0.11:/home/xuxian/fsys/ramdisk,nolock mem=30M其中192.168.0.11 是主机ip,/home/xuxian/fsys/ramdisk为ramdisk目录。 9、通过烧写flash检查文件系统 最后如果想生成image文件烧到flash中可以执行如下命令: xuxian@omap1:~/fsys$umount ramdisk xuxian@omap1:~/fsys$gzip -v9 rootfs 这样就生成了rootfs.gz文件,可以连同u-boot,kernel一起烧到flash中了。 儒雅说: # vi mkinitrd.sh -- 脚本好 ---------------------------------------- #!/bin/bash #------------- make file system cd /tftpboot rm -fr ramdisk &> /dev/null umount /mnt &> /dev/null dd if=/dev/zero of=ramdisk bs=1k count=8192 &>/dev/null mkfs.ext2 -F ramdisk &> /dev/null mount -o loop ramdisk /mnt &> /dev/null #------------- make directory cd /mnt rm -r * mkdir lib dev proc etc mnt usr bin sbin tmp sys #------------- cp lib cd /usr/local/arm/3.4.1/arm-linux/lib for file in libc libcrypt libdl libm libpthread libresolv libutil do cp $file-*.so /mnt/lib cp -d $file.so.[*0-9] /mnt/lib done cp -d ld*.so* /mnt/lib #------------- cp busybox cd /home/zxl/s3c2410/source/busybox/busybox-1.7.0 cp -rf _install/* /mnt/ cp -r examples/bootfloppy/etc/init.d/ /mnt/etc/ #------------- edit /etc/init.d/rcS (0) echo "echo /sbin/mdev > /proc/sys/kernel/hotplug" >>/mnt/etc/init.d/rcS echo "/sbin/mdev -s" >>/mnt/etc/init.d/rcS #------------- make device file (1) cd /mnt/dev mknod -m 660 console c 5 1 mknod -m 660 null c 1 3 #------------- make etc file cat > /mnt/etc/inittab /mnt/etc/fstab /dev/null gzip -9 ramdisk (0) 配置mdev (1) 由于2.6.19中已经不包含devfs,所以还需要在root filesystem中配置console和null设备,否则将不能进入交互界面(不会出现提示符#) # vi mkinitrd.sh -- 脚本好 ---------------------------------------- #!/bin/bash #------------- make file system cd /tftpboot rm -fr ramdisk &> /dev/null umount /mnt &> /dev/null dd if=/dev/zero of=ramdisk bs=1k count=8192 &>/dev/null mkfs.ext2 -F ramdisk &> /dev/null mount -o loop ramdisk /mnt &> /dev/null #------------- make directory cd /mnt rm -r * mkdir lib dev proc etc mnt usr bin sbin tmp sys #------------- cp lib cd /usr/local/arm/3.4.1/arm-linux/lib for file in libc libcrypt libdl libm libpthread libresolv libutil do cp $file-*.so /mnt/lib cp -d $file.so.[*0-9] /mnt/lib done cp -d ld*.so* /mnt/lib #------------- cp busybox cd /home/zxl/s3c2410/source/busybox/busybox-1.7.0 cp -rf _install/* /mnt/ cp -r examples/bootfloppy/etc/init.d/ /mnt/etc/ #------------- edit /etc/init.d/rcS (0) echo "echo /sbin/mdev > /proc/sys/kernel/hotplug" >>/mnt/etc/init.d/rcS echo "/sbin/mdev -s" >>/mnt/etc/init.d/rcS #------------- make device file (1) cd /mnt/dev mknod -m 660 console c 5 1 mknod -m 660 null c 1 3 #------------- make etc file cat > /mnt/etc/inittab /mnt/etc/fstab /dev/null gzip -9 ramdisk (0) 配置mdev (1) 由于2.6.19中已经不包含devfs,所以还需要在root filesystem中配置console和null设备,否则将不能进入交互界面(不会出现提示符#) 我也说: 内容有时间更新...... 利用busybox制作ramdisk (1)下载busybox,可以从 www.busybox.net 上下载到最新版本。 (2)解压压缩文件,进入busybox目录。 (3)配置busybox,make menuconfig。 ①Busybox Settings(busybox配置组) Busybox Settings ---> General Configuration ---> Build Options ---> # Build BusyBox as a static binary (no shared libs) [ ] Build shared libbusybox Debugging Options ---> Installation Options ---> # Don't use /usr Applets links (as soft-links) ---> (./_install) BusyBox installation prefix Busybox Library Tuning ---> # 代表必选项: # Build BusyBox as a static binary (no shared libs)表示应用静态库, 在嵌入式工作时一般首选,它不应用动态库,可以节省空间,在创建的ramdisk 的lib目录中可以加入动态库支持; [ ] Build shared libbusybox 表示应用动态库,这样会耗费空间。 # Don't use /usr这个选项也一定要选,否则make install 后busybox将安装 在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install 后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接. ② --- Applets (命令配置组) Archival Utilities ---> 文档选项 例如:压缩文件tar、gzip等命令; Coreutils ---> 常用命令选项 一般/bin下的命令的选择点; # Allow use of color to identify file types # Produce colored ls output by default 这两个可选,在控制台将会根据文件的类型有颜色区分与提示; Console Utilities ---> 控制台选项 例如:清屏命令clear等; Debian Utilities ---> Debian命令选项组; Editors ---> 文档编辑选项组,例如:vi编辑器; Finding Utilities ---> 查找选项组; Init Utilities ---> 系统初始化选项; Login/Password Management Utilities ---> 登录管理; Linux Ext2 FS Progs ---> Ext2 文件系统选项 例如:longin、passwd; Linux Module Utilities ---> 模块选项,例如:lsmod、insmod; Linux System Utilities ---> 系统选项,例如:mount、dmesg; Miscellaneous Utilities ---> 其他命令选项; Networking Utilities ---> 网络功能选项,例如:ifconfig; Process Utilities ---> 进程选项; Shells ---> Shell选项; Choose your default shell (msh) ---> 选择默认的shell ( ) ash ( ) hush (X) msh ( ) none System Logging Utilities ---> 系统日志选项; Runit Utilities ---> 即刻运行选项; ipsvd utilities ---> ip服务进程; ③保存与载入配置文件选项组 Load an Alternate Configuration File Save Configuration to an Alternate File (4)配置busybox后保存配置,然后修改Makefile文件,在文件中找到这一行 CROSS_COMPILE ?=,这一行用于指定交叉编译器的位置与类型,修改为系统中 交叉编译器的绝对路径;例如本系统在交叉编译器/eldk/usr/bin/中, CROSS_COMPILE ?=/eldk/usr/bin/ppc_8xx- (5)如果有ulibc,跳过这一步。 修改busybox目录下面applets/applets.c,注释掉下面的内容: #if ENABLE_STATIC && defined(__GLIBC__) && !defined(__UCLIBC__) #warning Static linking against glibc produces buggy executables #warning (glibc does not cope well with ld --gc-sections). #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400 #warning Note that glibc is unsuitable for static linking anyway. #warning If you still want to do it, remove -Wl,--gc-sections #warning from scripts/trylink and remove this warning. #error Aborting compilation. #endif 这些内容用于提示你用ulibc以减少空间消耗,而不是用glibc。 (6)编译安装: [guo@localhost busybox]$ make [guo@localhost busybox]$ make install 编译安装后会在busybox目录下生成_install目录,它包括bin、sbin、linuxrc: [guo@localhost _install]$ ls bin linuxrc sbin (7)建立ramdisk文件系统 [guo@localhost ~]$ dd if=/dev/zero of=rootfs bs=1M count=5 用dd命令建立了一个名为rootfs的ramdisk基本文件; [guo@localhost ~]$ mke2fs -m 0 -N 3500 rootfs 在rootfs上面建立ext2文件系统。 [guo@localhost ~]$ mount -o loop rootfs /mnt/ramdisk 把rootfs文件系统挂载到/mnt/ramdisk目录下面(可随意指定一个目录); [guo@localhost busybox]$ cp -dpR ./_install/* /mnt/ramdisk 把busybox目录下面_install目录下面的所有文件拷贝到/mnt/ramdisk下面; [guo@localhost ~]$ cd /mnt/ramdisk 转到/mnt/ramdisk目录进行操作; [guo@localhost ~]$ mkdir dev proc etc mnt usr lib 建立基本文件目录; 下面拷贝各要目录的内容: ①dev目录 直接从本机/dev目录下面拷贝所需内容即可; 以下是我认为需要的设备名: console hda12 hda6 mouse ptyp6 ptypf ram15 ram9 tty15 ttyp3 ttypc ttyS13 ttyS7 fb hda13 hda7 null ptyp7 ram ram16 rtc tty16 ttyp4 ttypd ttyS14 ttyS8 fb0 hda14 hda8 psaux ptyp8 ram0 ram2 tty0 tty6 ttyp5 ttype ttyS15 ttyS9 fd0 hda15 hda9 ptyp0 ptyp9 ram1 ram3 tty1 tty7 ttyp6 ttypf ttyS16 zero full hda16 initctl ptyp1 ptypa ram10 ram4 tty10 tty8 ttyp7 ttyS0 ttyS2 tty5 hda hda2 kmem ptyp2 ptypb ram11 ram5 tty11 tty9 ttyp8 ttyS1 ttyS3 tty4 hda1 hda3 loop0 ptyp3 ptypc ram12 ram6 tty12 ttyp0 ttyp9 ttyS10 ttyS4 tty3 hda10 hda4 loop1 ptyp4 ptypd ram13 ram7 tty13 ttyp1 ttypa ttyS11 ttyS5 tty2 hda11 hda5 mem ptyp5 ptype ram14 ram8 tty14 ttyp2 ttypb ttyS12 ttyS6 tty ②etc目录 以下是我认为需要的设备名: busybox.conf inetd.conf inittab mtab profile xinetd.d fstab init.d motd nsswitch.conf xinetd.conf 可能根据busybox的配置不同会有不同要求,但有些是必须的: inittab、init.d、fstab、profile。其中init.d、fstab、profile可从这里拷贝: [guo@localhost busybox]$ cp -R examples/bootflopyp/etc/init.d /mnt/ramdisk/etc (8)卸载 umount /mnt/ramdisk (9)生成压缩文件 [guo@localhost ~]# gzip -v9 rootfs rootfs: 65.1% -- replaced with rootfs.gz (10)在开发板上测试 ①[guo@localhost ~]# /eldk/usr/bin/mkimage -A PPC -O linux -T ramdisk -C gzip -n dog_en -d rootfs.gz /tftpboot/rootfs 利用该命令在/tftpboot下面生成映像文件 ②在开发板上跑程序 APC2004=>tftp 下载内存地址 映像文件 APC2004=>bootm 内核地址 ramdisk地址 (11)小结 根据需求不同则配置busybox的情况不同,所以系统所需选择的设备文件、 命令文件也不同。 /bin:linux必需命令目录; /sbin:系统常用命令目录; /dev:设备文件目录; /etc:系统启动与运行所需文件目录; /proc:proc文件系统mount目录; /mnt:用户mount目录; /lib:库文件存放处; /usr:其他工具与用户程序的存放处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值