ramdisk和initramfs文件系统制作V1.1
- 格式:pdf
- 大小:399.50 KB
- 文档页数:8
制作ramdisk文件系统制作一个最基本的文件系统(这里采用busybox1.1.0:准备:Busybox1.1.0源码;交叉编译工具链gcc-3.4.6;Linux2.6源码包;下面开始制作:一:建立交叉编译环境,将gcc-3.4.6解压到/opt下二:解压busybox-1.1.0.tar.bz2:busybox-1.1.0.tar.bz2jxf#tar三:进入解压后的目录busybox-1.1.0,开始进行busybox的编译配置:1.运行#make menuconfig后,选择Build Options2.选上选项:”Do you want to build BusyBox with a cross compiler?”(让它采用交叉编译工具链进行编译)选择要使用的工具链的路径:(./_install)BusyBox installation prefix:指定生成的文件的路径.4.再在其它的选项里选择好你要编译入文件系统的命令,保存退出!5.编译:#make clean allinstall#make这样,就在/busybox-1.1.0/_install下生成了bin,sbin,linuxrc四.开始制作文件系统:建立文件夹:mkdir bin dev home proc sbin tmp var boot etc lib mnt root sys usr etc/init.d u sr/etc___________________________________________________________mknod -m 600 dev/console c 5 1mknod -m 666 dev/null c 1 3___________________________________________________________vi etc/profile#!/bin/sh#/etc/profile:system-wide .profile file for the Bourne shellsechoecho -n "Processing /etc/profile......"# Set search library pathexport LD_LIBRARY_PATH=/lib:/usr/lib# set user pathexport PATH=/bin:/sbin:/usr/bin:/usr/sbin#Set PS1USER = "`id -un`"LOGNAME=$USERPS1='[\u@\h\W]\$'PATH=$PATHecho "Done!"___________________________________________________vi etc/init.d/rcS#!/bin/sh# set hostname, needed host file in /etc directory#./etc/hosthostname `cat /etc/host`# mount all filesystem defined in "fstab"echo "#mount all......."/bin/mount -a#+yangdk/bin/chmod 0666 /dev/nullecho "# starting mdev...."/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s/usr/etc/initecho "******************************************" echo " Guoguifu linux-2.6.24.4 boot " echo " 2008-12-15 "echo " grandchips "echo "******************************************" ______________________________________________vi etc/fstabproc /proc proc defaults 0 0none /tmp ramfs defaults 0 0none /var ramfs defaults 0 0mdev /dev ramfs defaults 0 0sysfs /sys sysfs defaults 0 0________________________________________________vi etc/inittab::sysinit:/etc/init.d/rcS::respawn:-/bin/shtty2::askfirst:-/bin/sh::ctrlaltdel:/bin/umount -a -r::shutdown:/bin umount -a -r::shutdown:/sbin/swapoff -a_________________________________________________ vi usr/etc/init#!/bin/shifconfig eth0 192.168.3.111 upifconfig lo 127.0.0.1_________________________________________________ vi mdev.conf (空的)_________________________________________________将下列几个必须库从工具链gcc-3.4.6的目录:gcc-3.4.6/mipsel-linux/lib拷贝到lib目录.ld.so.1, ld.-2.3.6.so, libcrypt.so.1, libc.so.6, libdl.so.2, libgcc_s.so.1, , libm.so.6, libpthread.so.o, libstdc++.so.6cp /opt/gcc-3.4.6/mipsel-linux/lib/库 lib/至此,文件系统制作完成!!五.将制作好的文件系统ramdisk放到linux2.6源码包的目录:linux26_3210/arch/mips/下,再回到linux26_3210根目录下进行内核配置,让内核采用ramdisk文件系统:1.进入:Device Driver->Block devices,选上”RAM disk support”选项,并在下面的三个ramdisk大小等参数进行配置,如下图所示:2.进入General setup,在”initramfs source file” 里输入ramdisk的路径:arch/mips/ramdisk,如下图所示:保存退出,完成内核配置!编译linux后,这个linux内核就选择ramdisk文件系统启动了,启动后可以看到刚做的简单文件系统在板上跑☺。
initramfs文件系统initramfs文件系统Linux内核加载根文件系统执行/sbin/init程序前,需要找到根设备位置,如果根设备需要驱动的支持,内核有可能无能为力,通过提供一个过渡的临时根文件系统可以使得内核的设计更灵活简单.通常过渡的临时根文件系统基本上是内存文件系统.常见的内存文件系统有:rootfs,ramfs,ramdisk,tmpfs1. rootfs:内核启动的初始始根文件系统,大部分linux系统正常运行后都会安装另外的文件系统,然后忽略rootfs2. ramfs:基于内存的文件系统.ramfs文件系统没有容量大小的限制,它可以根据需要动态增加容量.直接利用了内核的磁盘高速缓存3. ramdisk:基于ram的块设备,占据一块固定的内存,事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统驱动来读写其上的文件空间固定导致容量有限,要想装入更多的文件需要重新格式化.Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项),导致内存浪费,它可能不停的动态增长直到耗尽系统的全部内存,所以只有root或授权用户允许使用ramfs4. tmpfs:增加了容量大小的限制 + 允许把数据写入交换分区.由于增加了这两个特性,tmpfs允许普通用户使用过渡根文件系统机制:将加载真正的根文件系统需要的设备驱动、工具以及初始化程序先加载到内存运行.1. initrd: initial Ramdisk/linuxrc文件,基于ramdisk技术,文件系统(ext2等)镜像文件————> cpio格式镜像文件在内核启动完成后把它复制到/dev/ram块设备中, 作为内核加载真正根文件系统的过渡根文件系统2. initramfs: initial RAM file systeminit文件,cpio格式镜像文件在内核启动完成后把它复制到rootfs中,作为内核初始的根文件系统,完成挂载系统真正的根文件系统initramfs制作与使用:我们学习都是从输出一个hello world开始的,所以这里就用过渡根文件系统输出hello world来说明.1.编写程序#include <stdio.h>int main(int argc, char *argv[]){printf("Hello world Initramfs!\n");sleep(999999999);}交叉编译:arm-linux-gcc -static hello.c -o init2. 打包initramfs镜像find .|cpio -o -H newc|gzip > ~/myinitramfs.cpio.gz在内核中选择使用: 注意选择initramfs的压缩格式3. 解包initramfs镜像cpio -i -F myinitramfs.cpio --no-absolute-filenameszcat myinitramfs.cpio.gz | cpio -i -d -H newc --no-absolute-filenames4. 内核initramfs的构建General setup --->[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support(/rootfs_dir) Initramfs source file(s)Built-in initramfs compression mode (None) ---> [] None [] GZIP然后烧录的时候将文件系统烧录即可分类: 系统移植之文件系统。
1、拷贝s3c2440_recover.tar.bz2到我们的目标文件夹下解压cp /mnt/hgfs/share/s3c2440_recover.tar.bz2 /home/opt/cd /home/opttar jxvf s3c2440_recover.tar.bz2cd s3c2440_recover2、裁剪rm *.tar.gz –rfcd librm *.a –rf 删除静态库rm debug/ -rf 可以不用debugcd ../bin/rm udev* -rf sbin 中有了3、mkdir /home/opt/rootfscd /home/opt/rootfsdd if=/dev/zero of=/home/opt/rootfs/ramdisk.img bs=1024 count=12000mke2fs -F -m 0 -b 1024 ramdisk.img 格式化mount -t ext2 -o loop ./ramdisk.img ./root/cp /home/opt/s3c2440_recover/* ./root/ -rfumount ./rootgzip -vf9 ramdisk.imgcp ramdisk.img.gz /tftpcd /home/opt/ utu-linux_for_s3c2440_V1.5.3/make cleanmake menuconfig选device drivers ——>block drivers 选中,以下选项如下设置<*> Loopback device support<*> RAM disk support(2)Default number of RAM disks(可改)(16368) Default RAM disk size (kbytes) (大于12M即可)[*] Initial RAM disk (initrd) support启动开发板,开启超级终端进入bootloader敲printenvutu-bootloader=>>>printenvinstall-bootloader=tftp 30000000 u-boot.bin;nand erase 0 40000;nand write 30000000 0 0install-kernel=tftp 30000000 uImage;nand erase 60000 200000;nand write.i 30000000 60000 0install-filesystem=tftp 30000000 filesystem.yaffs;nand erase 260000 3d9c000;nandwrite.yaffs1 30000000 260000 0erase-env=nand erase 40000 20000bootargs=root=/dev/mtdblock2 rw console=ttySAC0,115200 bootcmd=nand read.i 0x32000000 0x60000 0x200000; bootm bootdelay=1baudrate=115200ethaddr=00:0c:20:02:0a:5bipaddr=192.168.1.168netmask=255.255.255.0serverip=192.168.1.3stdin=serialstdout=serialstderr=serialEnvironment size: 591/131068 bytes保存下,下次还会用到的接着set bootargs 'root=/dev/ram rw initrd=0x30800000,6M ramdisk_size=12288 console=ttySAC0,115200't 32000000 uImaget 30800000 ramdisk.img.gzbootm 32000000结果如下:[root@bit /]# lsbin home lost+found root usrdev lib mnt sbin varetc linuxrc proc sys成功。
制作ramfs文件系统
1)准备
要有一个已经可以使用的文件系统,假设目录为/rootfs
Linux内核需要支持ext2文件系统及ramdisk支持(fs相应的选项要勾上)
2)在pc上制作ramdisk镜像
(1)dd if=/dev/zero of=ramdisk.img bs=1k count=4096 这样制作的镜像有4MB,可以根据自己的需要修改
(2)mkfs.ext2 -m0 ramdisk.img
将ramdisk.img格式化为ext2格式
(3)mount -o loop ramdisk.img /mnt/ramdisk/
将ramdisk.img挂载到/mnt/ramdisk目录
(4)cp -a /rootfs /mnt/ramdisk
将自己的文件系统全部拷贝到/mnt/ramdisk目录去
(5)umount /mnt/ramdisk
卸载ramdisk挂载
此时生成可用的ramdisk.img镜像
(6)gzip -v9 ramdisk.img
压缩镜像,我没试过加载压缩的镜像,应该也可以
3)修改开发板bootargs,添加 initrd=0x31000000,4096000 这里0x3100000是ramfs文件系统的加载地址,4096000是大小
重启开发板,应该正常加载ramfs文件系统。
制作根文件系统有两种方法1、利用开发板提供的映像文件制作ramdisk2、利用busybox制作根文件系统(制作过程复杂)采用第一种方法制作需要的ramdisk1、拷贝已有的uramdisk.image.gz 到新建的tmp/下,cp uramdisk.image.gz tmp/2、去掉mkimage生成的64 bytes 的文件头,生成新的ramdisk.image.gz$ dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=13、 gunzip解压ramdisk.image.gz 生成ramdisk.image$ gunzip ramdisk.image.gz4、新建挂载目录“ramdisk”,并将ramdisk.image挂载$ sudo mount -o loop,rwramdisk.imageramdisk5、接下来,只需要将ramdisk目录下的内容全部拷贝到rootfs下即可cp -R ramdisk /* rootfs这样就有了自己的rootfs,省去利用busybox制作的麻烦了有了制作好的rootfs,下面就开始制作映像文件了1、创建镜像文件ramdisk8M.image,并设置大小为8M,文件系统格式为ext2$dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192$mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0$tune2fs ramdisk8M.image -i 0$chmod 777 ramdisk8M.image大小可以按照需要自己调整,但是最好不要超过32M,创建ramdisk目录,将ramdisk8M.image 挂载到该目录下$mkdirramdisk$mount -o loop ramdisk8M.image ramdisk/接下来,只需要将rootfs目录下的内容全部拷贝到ramdisk下即可$cp -R rootfs/* ramdisk注意,这里cp的参数一定是R而非r。
制作ramdisk类型文件系统ramdisk也就是内存盘的意思。
所谓的RAM驱动器,实际上是把系统内存划出頒分当做硬盘使用。
对于操作系统来讲内存的存取速度远远大于机械磁盘,所以RAM驱动器肯定要比机械的硬盘快得多。
你可以把整个应用程序都安装在ramdisk的驱动器中,然后用内存的速度运行它。
使用RAM驱动器技术对于延长笔记本电脑电池使用时间也是十分有利的,因为这样做可以减少访问〃耗电大户”的次飢Ram:内存,Disk :磁盘,在Linux中可以将一部份内存当做分区来使用,称之为Ramdisk。
对于一些时常被访问、并且不会被更改的文件,可以将它们通过Ramdisk 放在内存中,能够明显地提高系统性能。
Ramdisk工作于虚拟文件系统(VFS )层,不能格式化,但可以创建多个Ramdisk。
虽然现在硬盘价钱越来越便宜,但对于一些我们想让其访问速度很高的情况下,Ramdisk还是很好用的。
如果对计算速度要求很高,可以通过增加内存来实现,使用ramdisk技术。
一个A Ramdisk 就是把内存假设为一个硬盘驱动器,并且在它的上面存储文件,假设有几个文件要频繁的使用,如果将它们加到内存之中,程序运行速度会大幅度提高,因为内存的读写速度远高于硬盘。
划出部份内存提高整体性能,不亚于更换新的CPU。
像Web服务器这样的计算机,需要大量读取和交换特定的文件。
因此,在Web服务器上建立Ramdisk会大大提高网络读取速度。
从制作Ramdisk根文件系统的方法上来说,是很简单的。
1 .配置Linux内核支拮Ramdisk类型的文件系统。
2.制作好根文件系统,使用之前实验案例制作好的根文件系统。
3.将制作好的根文件系统制作成Ramdisk类型文件系统。
4.下载到TPAD上使用测试。
实现1 .对内核进行配置,使得内核能够支持Ramdisk类型的文件系统,如图・9 ,图・10 ,图•11。
$ cd /home/tarena/workdir/tools/linux-2.6.35.7$ make menuconfig$ make zlmage$ cp arch/arm/boot/zlmage /tftpboot图・9S-10config • Linux Kernel V2.6.35.7 ConfigurationArrow keys navigate the nenu. <Enter> selects submenus Highlighted letters are hotkeys. Pressing <Y> includes9 <N> excludes, <M> nodulartzes features. Press <Esc><Esc> to exit, <?> for Help.</> for Search. Legend: [w] built-in [ ] excluded <M> module < ><w> M nory Technology Device <HTD) support <xarelLeL uoiLt s|[w] BLock devicesI■j HI>c uevxce><> ATA/ATAPI/MFM/RLL support (DEPRECATED)CSI device support -•<> serial ATA and Parallel ,] M IttpXe devices driver ♦] N twork device support]ISDN support > ATA drivers —> support (RAID and LVM)Select Exit > < Help >图・11config - Ltn ConArrow keys navigate the nenu. <Enter> selects subnenus --->• Highlighted letters are hotkeys.Pressing <Y> includes f <N> excludes, <M> nodulartzes features. Press <Esc><Esc> to exit. <?> for Help. <f> for Search. Legend: [*] built-in [ ] excluded <M> module < >•・・ DRBD disabled because PROOFS f INET or CONNECTOR not se < > N twork block device support<*^^^A^DiocKaevlcesup^rt (16) default number of RAM disks2.制作Ramdisk文件系统的过程,如图・12 ,图・13 ,图・14 ,图・15 ,图・16所$ cd /home/tarena/workdir/tools/busybox-1.19.4/_lnstall/dev$ sudo mknod console c 5 1$ sudo mknod null c 1 3$ cd /home/tarena/workdir/tools/busybox-1.19.4$ dd if=/dev/zero of=initrd.img bs=lk count=8192$ sudo mkfs.ext2 -F initrd.img$ sudo mkdir /mnt/initrd$ sudo mount -t ext2 -o loop initrd.img /mnt/initrd$ sudo cp Jnstall/* /mnt/initrd -a$ sudo amount /mnt/initrd$ gzip -best -c initrd.img > ramdisk.img$ sudo chmod 777 ramdisk.img$ cp ramdisk.img /tftpboot图・12consoke^tQQls libbb ______ util^ltnux记県丫8192♦。
initramfs 生成过程initramfs 是一个用于引导 Linux 系统的初始内存文件系统。
它包含了用于引导过程中所需的关键文件和工具,例如驱动程序、文件系统工具等。
initramfs 的生成过程可以分为几个关键步骤。
首先,生成 initramfs 的过程通常是由操作系统安装程序或者更新程序自动完成的。
在安装或更新 Linux 内核时,系统会自动构建 initramfs。
但是,如果需要手动生成 initramfs,可以通过以下步骤完成:1. 收集必要的文件和工具,生成 initramfs 首先需要收集引导过程中所需的文件和工具,包括设备驱动程序、文件系统工具、初始化脚本等。
这些文件通常位于系统的 /lib 目录下。
2. 创建临时目录,在生成 initramfs 的过程中,需要创建一个临时目录来存放生成的文件系统内容。
3. 打包文件系统,将收集到的文件和工具打包成一个 cpio 归档文件。
这个归档文件将会成为 initramfs 的内容。
4. 压缩归档文件,对生成的 cpio 归档文件进行压缩,通常使用 gzip 或者 xz 等压缩工具进行压缩,以减小 initramfs 的体积。
5. 将压缩后的归档文件重命名为 initramfs 文件,生成的压缩归档文件需要被重命名为 initramfs 文件,并放置在系统的/boot 目录下。
需要注意的是,生成 initramfs 的具体步骤可能会因不同的Linux 发行版而有所差异,例如使用不同的打包工具或压缩工具。
因此,在手动生成 initramfs 时,最好参考所使用 Linux 发行版的官方文档或者社区指南,以确保按照正确的步骤进行操作。
总的来说,生成 initramfs 的过程涉及到文件收集、打包、压缩和命名等步骤,最终生成的 initramfs 文件将会包含引导 Linux 系统所需的关键文件和工具,以确保系统能够成功引导到正常运行状态。
1dd命令的解释dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
参数注释:if=文件名:输入文件名,缺省为标准输入。
即指定源文件。
of=文件名:输出文件名,缺省为标准输出。
即指定目的文件。
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=conversion:用指定的参数转换文件。
ascii:转换ebcdic为asciiebcdic:转换ascii为ebcdicibm:转换ascii为alternateebcdicblock:把每一行转换为长度为cbs,不足部分用空格填充unblock:使每一行的长度都为cbs,不足部分用空格填充lcase:把大写字符转换为小写字符ucase:把小写字符转换为大写字符swab:交换输入的每对字节noerror:出错时不停止notrunc:不截短输出文件sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
2制作文件系统2.1步骤一在磁盘中分配固定大小的空文件ramdiskdd if=/dev/zero of=ramdiskbs=1M count=20格式化为某一文件系统sudo mkfs.ext3 -m 0 -F -N 5000 -b 4096 ./ramdisk将该文件挂载至某一目录下sudo mount -t ext3 -o loop ./ramdisk./tmp将所需文件复制到该目录下,即将所需文件打包成一个文件ramdisksudocp -dpR $(ROOTFS_DIR)/* ./tmp(此处ROOTFS_DIR一般是busybox和一些ubi必要的文件系统的工具)sudoumount./tmp2.2步骤二ramdisk.gz与ramdisk相互转换ramdisk压缩成ramdisk.gzgzip -f9 ramdiskramdisk.gz解压出ramdiskgzip -d ramdisk.gz2.3步骤三uRamdisk.gz与ramdisk.gz相互转换ramdisk.gz生成uRamdisk.gzmkimage -A ppc -O linux -T ramdisk -C gzip -n "Linux ramdisk" -d ramdisk.gz uRamdisk.gzuRamdisk.gz生成ramdisk.gzsudodd if=./uRamdisk.gz of=./ramdisk.gz bs=64 skip=12.4补充最后生成的uRamdisk.gz即为edd_uRamdisk文件,复制过程中重命名即可cp uRamdisk.gz $(TARGET_DIR)/edd_uRamdisk。
教你如何用U盘或手机存储卡制作启动盘再重装系统制作启动盘是一项非常有用的技能,它可以帮助你在需要时重新安装操作系统。
使用U盘或手机存储卡制作启动盘非常方便,只需几个简单的步骤即可完成。
在本篇文章中,我将向你介绍如何使用U盘或手机存储卡制作启动盘。
1. 使用Windows制作启动盘:-插入U盘到电脑上。
-选择U盘,并点击“开始”按钮开始制作启动盘。
2. 使用Mac制作启动盘:- 插入U盘到Mac电脑上。
-打开“磁盘工具”应用程序。
-在左侧导航栏中找到你的U盘,并点击它。
- 选择“擦除”选项,并选择“Mac OS Extended (Journaled)”格式。
-完成擦除后,点击“恢复”选项。
3. 使用Linux制作启动盘:-插入U盘到电脑上。
-打开终端应用程序。
- 输入以下命令以查找你的U盘设备名称:sudo fdisk -l- 找到你的U盘,通常以/dev/sdx的形式显示(x为设备号,可能是a、b、c等)。
- 输入以下命令将操作系统镜像写入U盘:sudo ddif=/path/to/iso/file of=/dev/sdx bs=4M一旦你完成了这些步骤,启动盘制作过程就完成了。
你现在可以将U盘或手机存储卡插入要重新安装操作系统的计算机中,然后在计算机启动时选择从U盘或存储卡启动。
需要注意的是,在重新安装操作系统之前,请确保备份你的重要文件,因为重新安装操作系统将清除计算机上的所有数据。
总结:制作启动盘是一项非常有用的技能,可以帮助你重新安装操作系统。
使用U盘或手机存储卡制作启动盘非常简单,只需几个简单的步骤即可完成。
选择正确的操作系统镜像文件,然后按照不同操作系统的步骤进行制作。
完成后,将U盘或手机存储卡插入计算机,选择从启动盘启动,然后按照屏幕上的提示重新安装操作系统。
记得在重新安装前备份你的重要文件。
祝你成功!。
在Linux系统下制作RamDisk简介RamDisk就是将内存(Ram)的一部分当做硬盘(Disk)来使用。
RamDisk有固定的大小,可以像正常硬盘分区那样去使用。
就操作时间来讲,RamDisk比真实的物理硬盘快很多,当系统关闭或断电时,保存在RamDisk中的数据会全部丢失。
RamDisk可以成为一个存放临时数据的好地方。
1. 查看系统已创建RamDiskRedHat默认创建16个RamDisk,虽然它们没有激活或使用任何Ram。
系统列出的设备是ram0~ram15。
使用下面的命令可用检出这些块设备:现在,用grep在dmesg的输出中找出RamDisk的大小你可以看到,RamDisk默认只有16MB。
我想要一个16MB的RamDisk,所以,下一步要配置Linux,使得在启动过程中使用一个更大的RamDisk。
2. 修改RamDisk的大小RamDisk的大小是被一个命令行选项控制的,这个选项会在系统启动时传给内核。
由于RedHat9的默认bootloader是GRUB,我将用新的选项修改/etc/grub.conf,RamDisk大小的内核选项是:ramdisk_size=xxxxx ,xxxxx是指大小为1024-Byte的块的个数。
下面是我要添加到/etc/grub.conf的内容,它将RamDisk配置为1GB:将文件保存后,你需要重启系统。
重启后,通过查看dmesg的输出来确认修改已经生效:3. 格式化RamDisk无需将RamDisk格式化为日志文件系统,我们将使用EXT2文件系统。
我只想使用一个RamDisk,所以我只格式化ram0。
4. 新建一个挂载点并挂载RamDisk你已经格式化了RamDisk,现在要为它新建一个挂载点。
然后就可以挂载你的RamDisk并使用它。
我们将会使用/mnt/rd文件夹。
检测新挂载的RamDisk5. 使用RamDiskRamDisk已经创建成功,现在,你可以像在物理硬盘分区那样,在RamDisk上复制、移动、删除、编辑或列出文件。
转帖从ramdisk根文件系统启动Linux成功,总结一下今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下。
其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆)。
开发环境:Fedora 9交叉编译工具链:arm-linux-gcc 4.3.2 with E ABI嵌入式Linux内核版本:2.6.29.4-FriendlyARM。
昨天写贴子的时候具体记不清了,今天起来启动开发板用uname -r查一下,就是叫做2.6.29.4-FriendlyARM,帖子已经改好了。
本文就是友善之臂的2.6.29.4-FriendlyARM的那个版本的内核的基础上改的。
其它版本的应该也类似,仅供参考。
开发板:mini2440-128M Nand FlashBootloader:u-boot-2009.11具体步骤如下:1.解压内核源码树解压linux-2.6.29-mini2440-20090708.tgz到自己的工作目录,会生成一个友善之臂修改过的并且有几个mini2440默认配置文件的内核源码目录linux-2.6.29。
具体步骤参照友善之臂mini2440开发板用户手册,具体不详述了。
2.修改内核配置选项进入内核源码目录linux-2.6.29目录#cp config_mini2440_t35 .config#make menuconfig ARCH=arm打开配置菜单,修改两个配置项,分别是:a):General setup-->选择Initial RAM filesystem and RAM disk...... 项b):Device Drivers-->Block devices-->选择RAM block device support 项并检查Optimize for si z e是否被选中,如果没有则选中,此项优化内核大小,根据需要进行配置。
●建立新的ramdisk盘在PC上以超级用户的身份键入以下命令:1.mkdir /mnt/loop该命令建立了loop设备的临时挂接点;2.dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=10240该命令建立了一个大小为10M的临时文件;北京恒颐高科技术有限公司 (86-10)62121051 31 恒颐高科注意可以根据自己的需要建立大小合适的文件系统,改变count=大小。
3./sbin/losetup /dev/loop0 /tmp/loop_tmp将设备与临时文件联系起来。
如果出现“ioctl: LOOP_SET_FD: 设备或资源忙”的提示,说明设备还和一文件联系,可以用/sbin/losetup /dev/loop0来看,并可用-d来删除;4./sbin/mke2fs –m 0 /dev/loop0将loop0格式化为ext2文件系统;注意可以改变文件系统的格式,推荐使用ext2;5.mount /dev/loop0 /mnt/loop –t ext2把虚拟盘挂在节点/mnt/loop上;6.用cp –af 命令将所需文件拷到虚拟盘上一般要拷贝/bin,/sbin,/usr,/dev,/etc等;7.umount /mnt/loop,卸载此文件系统,得到的/tmp/loop_tmp就是ramdisk 8.gzip - v9 /tmp/loop_tmp,这样一个内存映像文件就生成了●如何建立ramdisk相应的目录1.可以在网上找一个ramdisk,然后拷贝相应的目录。
如果从零做起,则/bin /sbin/usr/bin /usr/sbin下的程序需要编译busybox,然后拷贝busybox下的对应目录到ramdisk。
/etc下的文件可以参考redhat下的配置文件/etc,一般需要inittab, rc.d等2.在linux上mount已经做好的ramdisk:(Mount ramdisk images)#mkdir /mnt/tmp#mount -o loop ramdisk /mnt/tmp将目录copy到新件的ramdisk下●可以直接将已经做好的ramdisk,mount到一个文件下,#mount -o loop ramdisk/mnt/tmp ,修改,压缩,即可。
一、busybox的编译首先是交叉编译设置,打开busybox根目录下的Makefile,进行修改一般情况下,为了让busybox能够独立于其他的库文件而可以单独运行,需要将busybox 编译成静态的。
1.#make menuconfig2.Busybox Settings --->3. Build Options --->4.Build BusyBox as a static binary (no sharedlibs) //静态5. Installation Options --->6.Don't use /usr //make install的时候不会安装到根目录,而是安装到./_install7.Linux System Utilities --->8. mdev //相当于udev9. Support /etc/mdev.conf10. Support command execution at device addition/removal11.Shells --->12. Choose your default shell (msh) //具有ash没有的功能,比如支持tab补齐,历史纪录等等的高级功能复制代码而编译成静态的分为glibc和uclibc,如果系统没有安装uclibc的话,那就会报下面的错解决办法是打开 applets/applets.c 将其中的错误注释掉其他的busybox选项根据需要进行选择!1.#make2.#make install复制代码这样就在./_install目录下生成了busybox二、ramdisk文件系统生成上图中首先创见了一个10M的文件系统映象然后使用losetup命令将此镜像与块设备/dev/loop0进行挂接如果出现"ioctl: LOOP_SET_FD:设备或资源忙",说明/dev/loop0设备还和一文件联系,可用losetup /dev/loop0查看地,并可用-d 删除上图是用命令mke2fs来格式化此块设备/dev/loop0,其实就是格式化我们刚生成的那个文件系统镜像,ext2格式上图是挂载文件系统镜像,可见经过刚才格式化之后的文件系统镜像里面只有lost+foun 这个文件夹之后可以将步骤一中生成的_install目录下的所有文件拷贝进来即/et/inittab文件如下修改Console::sysinit:/etc/init.d/rcSttyS0 :respawn :-/bin/shtty2 ::askfirst :-/bin/shtty0 ::askfirst :-/bin/shtty3 ::askfirst :-/bin/shtty4 ::askfirst :-/bin/sh::restart:/sbin/init::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount –a –r::shutdown:/sbin/swapoff –afstab内容如下:/dev/fd0 / ext2 defaults 0 0none /proc proc defaults0 0none /dev/pts devpts mode=06220 0group内容如下:root::0:rootissue内容如下:Sunny AT91RM9200EK (2007-06-07)passwd内容如下:root::0:0:root:/root:/bin/ashprofile内容如下:export PS1=”[“$USER” @ \h]# “echo “Done”PATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATHresolv.conf内容如下:nameserver 127.0.0.1search localhostinit.d目录下rcS文件内容:#! /bin/shMount –o remount, rw //sbin/ifconfig lo 127.0.0.1ln –s /dev/tts/0 /dev/ttyS0ln –s /dev/vc/0 /dev/tty0ln –s /dev/vc/1 /dev/tty1ln –s /dev/vc/2 /dev/tty2/bin/mount –a>/etc/mtabechoecho “………….Welcom to AT91RM9200EK …………..”echohostname AT91RM9200EK使用chmod a+x rcS 将此文件改为可执行文件5. 将ramdisk.gz 和uImage通过tftp下载到板子上,使用bootm命令就可运行。
1、什么是initrd以及为什么要用initrd在早期的Linux系统中,一般就只有软盘或者硬盘被用来作为Linux的根文件系统,因此很容易把这些设备的驱动程序集成到内核中。
但是现在根文件系统可能保存在各种存储设备上,包括SCSI, SATA, U盘等等。
因此把这些设备驱动程序全部编译到内核中显得不太方便。
我们看到利用udevd可以实现实现内核模块的自动加载,因此我们希望根文件系统的设备驱动程序也能够实现自动加载。
但是这里有一个矛盾,udevd是一个可执行文件,在根文件系统被挂载前,是不可能执行udevd的,但是如果udevd 没有启动,那就无法自动加载根根据系统设备的驱动程序,同时也无法在/dev目录下建立相应的设备节点。
为了解决这个矛盾,于是出现了initrd(boot loader initialized RAM disk)。
initrd是一个被压缩过的小型根目录,这个目录中包含了启动阶段中必须的驱动模块,可执行文件和启动脚本。
包括上面提到的udevd,当系统启动的时候,booload会把initrd文件读到内存中,然后把initrd的起始地址告诉内核。
内核在运行过程中会解压initrd,然后把 initrd挂载为根目录,然后执行根目录中的/initrc 脚本,您可以在这个脚本中运行initrd中的udevd,让它来自动加载设备驱动程序以及在/dev目录下建立必要的设备节点。
在udevd自动加载磁盘驱动程序之后,就可以mount真正的根目录,并切换到这个根目录中。
启动时用到initrd来mount根文件系统。
其实ramdisk只是在ram上实现的块设备,initrd可以说是启动过程中用到的一种机制2、Ramdisk与initrd区别ramdisk 是一种基于内存的虚拟文件系统,就好像你又有一个硬盘,你可以对它上面的文件添加修改删除等等操作。
但是一掉电,就什么也没有了。
无法保存。
initrd 是boot loader initialized RAM disk 顾名思义,是在系统初始化引导时候用的ramdisk。
嵌入式Linux根文件系统Ramdisk的制作过程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。
一、在一个已建好的文件系统上进行修改设已建立好的文件系统压缩文件为ramdisk.gz1、解压#cd ramdisk.gz 所在目录#gunzip ramdisk.gz 在解压后,得到文件系统镜象文件ramdisk,覆盖了原来的压缩文件2、镜象文件挂载镜象文件必须经过挂载后才能看到文件系统中的各个目录和详细内容#mkdir /mnt/loop/mnt/loop 是文件系统要挂载到的目录#mount –o loop ramdisk /mnt/loop3、在挂载目录/mnt/loop 下对文件系统进行操作#cd /mnt/loop 根据需要增加、删减或是修改文件系统的内容4、卸装文件系统跳到/mnt/loop 目录外,否则无法卸装,提示busy#cdramdisk 所在目录#umount /mnt/loop5、压缩文件系统#gzip –v9 ramdisk /*生成ramdisk.gz 压缩文件这样就可以测试ramdisk.gz 了。
二、自己建立根文件系统1.建立loop 设备的临时挂载点#mkdir /mnt/loop2.建立文件系统映象#dd if=/dev/zero of=/tmp/ramdisk bs=1k count=123003.mke2fs –F –v –m 0 /tmp/ramdisk 此处-F 选项将可迫使mke2fs 在文件上运行。
Linuxramdisk根文件系统的移植Linux ramdisk根文件系统的移植一、移植前准备处理器平台:powerpc交叉编译工具:powerpc64-fsl-linux-gccBusyBox源码:busybox-1.23.2.tar.bz2ramdisk文件系统映像生成工具:genext2fs二、构建根文件系统2.1 建立根文件系统目录架构在当前用户目录下创建所要移植的根文件系统根目录,并命名为rootfs。
在该目录下,创建FHS标准(Filesystem Hierarchy Standard,文件系统科学分类标准)下Linux根文件系统的常用子目录,诸如dev、etc、home、bin、sbin、mnt、lib等。
rootfs及其相关子目录的创建由脚本create_rootfs.sh完成,create_rootfs.sh内容如下:#!/bin/shecho "------Create rootfs directons......"cd ~mkdir rootfscd rootfsecho "--------Create root,dev......"mkdir root dev etc bin sbin mnt sys proc lib home tmp var usrmkdir usr/sbin usr/bin usr/lib usr/modulesmkdir etc/init.d#mkdir mnt/usb mnt/nfs#mkdir lib/modulesecho "-------make direction done---------"2.2 构建dev目录建立dev目录有两种方法:静态构建和动态构建,其中动态构建由mdev设备管理工具构建。
1)静态构建所谓静态构建,就是根据预先知道的所要挂载的驱动,用mknod 命令逐一构建各种设备节点。
linux initrd 制作及使用一, RamdiskRam Disk 就是将内存中的一块区域作为物理磁盘来使用的一种技术。
使用时内核配置:两个选项:第一个设定Ramdisk个数,默认16个;第二个是设定Ramdisk的大小,设定16MDevice Drivers --->[*] Block devices ---><*> RAM block device support(16) Default number of RAM disks(16384) Default RAM disk size (kbytes)另外:设置RAM disk 支持General setup --->[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support二, initrdinitrd全称是 initial RAM disk ,它提供一种让核心可以简单使用Ramdisk的能力,简单的说,这些能力包括:格式化一个 Ramdisk;加载文件系统内容到Ramdisk;将Ramdisk作为根文件系统;而Linux启动阶段的Ramdisk相当于一个未格式化的硬盘分区,核心可以直接将initrd的内容释放到一个未初始化的Ramdisk里,这个过程与Ghost恢复一个分区的过程十分相似。
于是,相应的内容被加载到相应的Ramdisk中,同时,这个Ramdisk也被格式化成某种由initrd格式所表达的分区格式。
initrd支持的格式· Romfs文件系统;· Ext2文件系统;· cramfs文件系统;· minix文件系统;三, Gzip支持如果核心选择了Gzip支持(通常这是默认的,在init/do_mounts_rd.c中定义的BUILD_CRAMDISK宏)还可以使用Gzip压缩的initrd。
Ramdisk和initramfs文件系统制作一、实验环境操作系统:Ubuntu Linux2.6.38-8内核源代码:Linux2.6.32实验前准备:用Busybox制作好的rootfs文件夹(包含文件系统中的基本文件etc,lib,dev等,可以使用NFS挂载文件系统测试制作的rootfs是否能用)二、ramdisk文件系统制作1.重新为NAND Flash分区在内核源码\linux-03.00.00.04\arch\arm\mach-omap2\board-am3517evm.c 中修改:static struct mtd_partition am3517evm_nand_partitions[]={/*All the partition sizes are listed in terms of NAND block size*/{.name="xloader-nand",.offset=0,.size=4*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="uboot-nand",.offset=MTDPART_OFS_APPEND,.size=15*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="params-nand",.offset=MTDPART_OFS_APPEND,.size=1*(SZ_128K)},{.name="linux-nand",//存放内核.offset=MTDPART_OFS_APPEND,.size=32*(SZ_128K)},#if0{.name="ubifs-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},#else//ramdisk+jffs2{.name="ramdisk-nand",//存放制作好的ramdisk文件系统.size=64*(SZ_128K),//8M.offset=MTDPART_OFS_APPEND,},{.name="data-nand",//数据区,用于保存数据.size=128*(SZ_128K),//16M.offset=MTDPART_OFS_APPEND,},#endif{.name="other-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},};分区后Nand Flash地址范围:0x00000000-0x00080000xloader-nand0x00080000-0x00260000uboot-nand0x00260000-0x00280000params-nand0x00280000-0x00680000linux-nand0x00680000-0x00E80000ramdisk-nand0x00E80000-0x1E800000data-nand0x1E800000-others-nand2.配置内核(1)拷贝配置文件cp arch/arm/configs/omap3_soc8200_defconfig.config (2)make menuconfig1)在General setup--->选中2)在Device Drivers--->Block devices选中配置完成,选择保存退出(3)编译内核makemake uImage在arch/arm/boot生成uImage系统镜像3.制作ramdisk文件系统(1).建立loop设备的临时挂载点#mkdir/mnt/loop(2).建立文件系统映象#dd if=/dev/zero of=/tmp/ramdisk bs=1k count=12300(3).mke2fs–F–v–m0/tmp/ramdisk此处-F选项将可迫使mke2fs在文件上运行。
否则mke2fs会抱怨/tmp/ramdisk 不是个块设备(/tmp/ramdisk文件映象必须是块设备文件)。
-v选项指出mke2fs 应该以verbose模式执行,-m0指出不必在文件系统上为“超级用户”保留任何区块,因为在嵌入式系统中通常是单用户系统,为“超级用户”保留区块没有意义。
(4).挂载映象文件#munt–o loop/tmp/ramdisk/mnt/loop挂载后,在/mnt/loop下就可以对文件系统的内容进行操作。
(5).cp操作将需要的文件等复制到目录下。
(6).卸载映象文件#umount/mnt/loop(7).压缩映象文件#gzip–v9/tmp/ramdisk生成ramdisk.img.gz注:可以使用ramdisk制作工具genext2fs,自动生成ramdisk.img,然后再压缩映像文件。
4.制作jffs2格式的文件内核启动后将Nand的数据分区(0x00E80000-0x1E800000 data-nand)挂载到系统某一目录,为了使该分区可以读写,需要烧写一个jffs2或者yaff2格式的文件,在这里选择jffs2格式。
用到的工具是mkfs.jffs2,操作过程如下:将mkfs.jffs2(可在网上下载)放到/usr/sbin目录下,这样就可以使用它了。
执行下面的命令:mkfs.jffs2-s0x800-e0x20000-p1000000-d data/-o data.jffs2–n参数说明:-s,--pagesize=SIZE节点页大小(默认:4KiB)要根据使用的Nand Flash的型号来确定,在这里是0x800,是因为使用的nand的页大小是2k.-e,--eraseblock=SIZE设定擦除块的大小为(默认:64KiB).使用的nand的块大小是128K(0x20000)-p,jffs2分区的总大小,16M-d,要制作成jffs2文件格式的源文件路径。
-o,指定生成的镜像文件的路径名。
-n,--no-cleanmarkers指明不添加清楚标记(nand flash有自己的校检块,存放相关的信息。
)如果挂载后会出现类似:CLEANMARKER node found at0x0042c000has totlen0xc!=normal0x0的警告,则加上-n就会消失。
最后生成data.jffs2的镜像文件5.烧写镜像文件到Nand Flash在U-boot调试模式下,使用tftp方式来烧写镜像。
(1)烧写kerneltftp80300000uImagenand erase280000400000nand write.i80300000280000(uImage的大小)(2)烧写ramdisktftp81000000ramdisk.img.gznand erase680000800000nand write.i81000000680000(ramdisk.img.gz的大小)(3)烧写jffs2文件tftp82000000data.jffs2nand erase e80000nand write.i82000000e80000(data.jffs2的大小)6.设置启动参数setenv bootargs"console=ttyS2,115200n8root=/dev/ram0rwinitrd=0x81000000,30M"其中initrd=0x81000000表明内核会在该地址加载文件系统,所以系统启动时要从nand把ramdisk.img.gz读取到0x81000000开始的内存setenv bootcmd"nand read.i80300000280000300000;nand read.i81000000680000 1000000;bootm80300000"这样制作ramdisk文件系统的就已经完成,重启开发板就可启动。
三、initramfs文件系统制作1.重新修改Nand Flash分区static struct mtd_partition am3517evm_nand_partitions[]={/*All the partition sizes are listed in terms of NAND block size*/{.name="xloader-nand",.offset=0,.size=4*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="uboot-nand",.offset=MTDPART_OFS_APPEND,.size=15*(SZ_128K),.mask_flags=MTD_WRITEABLE},{.name="params-nand",.offset=MTDPART_OFS_APPEND,.size=1*(SZ_128K)},{.name="kernel-ramdisk-nand",//12M.offset=MTDPART_OFS_APPEND,.size=96*(SZ_128K)},#if0{.name="ubifs-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},#endif//delete by xiaoqi2013.12.16{.name="data-nand",//add for store data50M.offset=MTDPART_OFS_APPEND,.size=400*(SZ_128K)},{.name="others-nand",.size=MTDPART_SIZ_FULL,.offset=MTDPART_OFS_APPEND,},};分区后nand的地址范围为:0x000000000000-0x000000080000:"xloader-nand"0x000000080000-0x000000260000:"uboot-nand"0x000000260000-0x000000280000:"params-nand"0x000000280000-0x000000e80000:"kernel-ramdisk-nand"0x000000e80000-0x000004080000:"data-nand"0x000004080000-0x000010000000:"others-nand"因为内核和文件系统编译在一起会比较大,所以加大了kernel-ramdisk-nand 的大小。