⑴ 用base-fs做nfs的根文件系统怎么不行
使用NFS挂载根文件系统,在开发阶段有很多的好处,对根文件系统进行修改后不用每次都下载到NandFlash中,可以把制作的根文件系统放到主机中的NFS输出目录中,在正式成为产品以后在烧写到开发板中,这样可以方便很多,也可以把编译生成的内核也放到NFS输出目录中这样也可以引导内核,很是方便,还等什么开始吧! NFS服务器端的配置已经在上一篇文章中写到过了。U-boot中使用tftp协议也在另一篇文章中。按道理来说NFS命令也是可以是使用的,因为都是基于网卡的,只要网卡驱动移植的没有问题,NFS也就直接可以使用了,不过在我这里可是行不通,在使用NFS传输文件中,一直出现下面的错误类型,提示挂载不上:[email protected]]#nfs 0x30000000 10.27.10.48:/home/ubuntu/kernel/fs/u-boot.bin dm9000 i/o: 0x20000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 08:00:3e:26:0a:5b operating at 100M full plex mode Using dm9000 device File transfer via NFS from server 10.27.10.48; our IP address is 10.27.10.23 Filename '/home/ubuntu/kernel/fs/u-boot.bin'. Load address: 0x30000000 Loading: *** ERROR: Cannot mount //仅仅提示挂载不上可还有下面的错误:[[email protected]]#nfs 0x30000000 10.27.10.48:/home/ubuntu/kernel/fs/u-boot.bin dm9000 i/o: 0x20000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 08:00:3e:26:0a:5b operating at 100M full plex mode Using dm9000 device File transfer via NFS from server 10.27.10.48; our IP address is 10.27.10.23 Filename '/home/ubuntu/kernel/fs/u-boot.bin'. Load address: 0x30000000 Loading: *** ERROR: Cannot mount *** ERROR: Cannot umount //这里还提示了不能卸载 在网上查找资料,出现 Cannot umount错误的解决方法是修改u-boot-2009.08/net/nfs.c文件,在大约453行附近的位置:static intnfs_umountall_reply (uchar *pkt, unsigned len){ struct rpc_t rpc_pkt; debug("%s\n", __func__); memcpy ((unsigned char *)&rpc_pkt, pkt, len); //if (ntohl(rpc_pkt.u.reply.id) != rpc_id) //原来的这一行修改成下面的一行 if ((ntohl(rpc_pkt.u.reply.id)+1) != rpc_id) return -1; if (rpc_pkt.u.reply.rstatus || ………………} 可是在我这里修改完以后还是不可以使用,一样出现上面的错误。这是就想到了是不是和tftp时出现的错误是一样的,也是因为超时的原因,虽然这里面没有出现超时的提示,不管怎么样还是先改了再说;还是在/nfs.c文件中修改下面的超时的宏定义:#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */#define NFS_RETRY_COUNT 30#define NFS_TIMEOUT (30*2000UL) //把原来的2000UL改成 30*2000UL, 修改完上面的宏定义以后,再使用NFS传输文件,一开始有几次还是不成功,不过后面再使用时大部分情况下都是成功的,不再像上面一次也没有成功过:[[email protected]]#nfs 0x30000000 10.27.10.48:/home/zfz/kernel/fs/u-boot.bin dm9000 i/o: 0x20000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 08:00:3e:26:0a:5b operating at 100M full plex mode Using dm9000 device File transfer via NFS from server 10.27.10.48; our IP address is 10.27.10.23 Filename '/home/zfz/kernel/fs/u-boot.bin'. Load address: 0x30000000 Loading: ############################### done Bytes transferred = 155016 (25d88 hex) 既然NFS可以使用了,那就可以用NFS挂载根文件系统了。根文件系统的制作在另一篇文章中也已经写了,这里就还是使用上次的根文件系统,只是不再用工具制作成Yaffs2的镜像了,直接使用Busybox,制作成功的noot_nfs目录下的各个文件就可以了,如果要下载到NandFlash中,再使用Yaffs2格式的镜像文件。可以先用NFS把linux内核下载到内存中,然后设置传递给内核的参数,在u-boot-2009.08/include/configs/mini2440.h文件中,修改原来使用nand read 方式,修改成使用NFS方式的;//#define CONFIG_BOOTCOMMAND "nand read 0x32000000 0x60000 0x560000;bootm 0x32000000" //把上面的注释掉,修改成下面的方式#define CONFIG_BOOTCOMMAND "nfs 0x30000800 10.27.10.48:/home/zfz/kernel/fs/uImage.img;bootm" 这样,在用U-boot引导时就可以把Linux的内核首先复制到内存中了,这样也不用把Linux 内核下载到开发板中了。然后在修改传递给内核的参数,修改为下面的://#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M" //把上面的修改成下面的这句#define CONFIG_BOOTARGS "noinitrd root=/dev/nfs rw nfsroot=10.27.10.48:/home/ubuntu/kernel/fs/root_nfs ip=10.27.10.23:10.27.10.48::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M"
⑵ 如何制作Linux根文件系统
根文件系统一直以来都是所有类Unix操作系统的一个重要组成部分,也可以认为是嵌入式Linux系统区别于其他一些传统嵌入式操作系统的重要特征,它给Linux带来了许多强大和灵活的功能,同时也带来了一些复杂性。我们需要清楚的了解根文件系统的基本结构,以及细心的选择所需要的系统库、内核模块和应用程序等,并配置好各种初始化脚本文件,以及选择合适的文件系统类型并把它放到实际的存储设备的合适位置。Linux的根文件系统以树型结构组织,包含内核和系统管理所需要的各种文件和程序,一般说来根目录”/”下的顶层目录都有一些比较固定命名和用途。下面列出了一个Linux根文件系统中的比较常见的目录结构:/bin 存放二进制可执行命令的目录该目录下存放所有用户都可以使用的、基本的命令,这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。/bin目录下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,m knod,[,test等“[”命令其实就是test命令,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。/dev 存放设备文件的目录该目录下存放的是设备文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过"dev/ttySAC0"文件可以操作串口0,通过"/dev/mtdblock1"可以访问MTD设备的第2个分区。/etc 存放系统管理和配置文件的目录该目录下存放着各种配置文件,对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。/home 用户主目录,比如用户user的主目录就是/home/user,可以用~user表示用户目录,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。/lib 存放动态链接共享库的目录该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。/sbin存放系统管理员使用的管理程序的目录该目录下存放系统命令,即只有管理员能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基 本的系统命令,它们用于启动系统,修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。/sbin目录下常用的命令有:shutdown reboot fdisk fsck等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。/tmp 公用的临时文件存储点用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。/root 系统管理员的主目录根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。/mnt 系统提供这个目录是让用户临时挂载其他的文件系统。用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、硬盘。/proc 虚拟文件系统,可直接访问这个目录来获取系统信息。这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。/var 某些大文件的溢出区与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。———————————————————————一、移植环境:1、 Ubuntu 10.10发行版2、 u-boot.bin3、 目标机:FS_S5PC100平台4、 交叉编译器 arm-cortex_a8-linux-gnueabi-gcc———————————————————————二、移植步骤1、 源码下载我们选择的版本是busybox-1.17.3.tar.bz2下载路径为:http://busybox.net/downloads/2、 解压源码$ tar xvf busybox-1.17.3.tar.bz23、 进入源码目录$ cd busybox-1.17.34、 配置源码$ make menuconfigBusybox Settings —> Build Options —> [*] Build BusyBox as a static binary (no shared libs) [ ] Force NOMMU build [ ] Build with Large File Support (for accessing files > 2 GB) (arm-cortex_a8-linux-gnueabi-) Cross Compiler prefix () Additional CFLAGS5、 编译$ make6、 安装busybox默认安装路径为源码目录下的_install$ make install7、 进入安装目录下$ cd _install$ lsbin linuxrc sbin usr8、 创建其他需要的目录$ mkdir dev etc mnt proc var tmp sys root9、 添加库在_install目录下创建一个lib文件夹,将工具链中的库拷贝到lib目录下$ mkdir lib$ cp /home/linux/x-tools/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/lib/* ./lib/删除lib下的所有目录、.o文件和.a文件,对库进行瘦身以减小文件系统的大小$ rm *.o *.a$ arm-cortex_a8-linux-gnueabi-strip lib/*10、 添加系统启动文件在etc下添加文件inittab$ vim /etc/inittab文件内容如下:#this is run first except when booting in single-user mode.:: sysinit:/etc/init.d/rcS# /bin/sh invocations on selected ttys# Start an "askfirst" shell on the console (whatever that may be)::askfirst:-/bin/sh# Stuff to do when restarting the init process::restart:/sbin/init# Stuff to do before rebooting::ctrlaltdel:/sbin/reboot在etc下添加文件fstab$ vim /etc/fstab文件内容如下:#device mount-point type options mp fsck orderproc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /dev tmpfs defaults 0 0这里我们挂在的文件系统有三个proc、sysfs和tmpfs,在内核中proc和sysfs默认都支持,而tmpfs是没有支持的,我们需要添加tmpfs的支持修改内核配置:$ make menuconfigFile systems —> Pseudo filesystems —> [*] Virtual memory file system support (former shm fs) [*] Tmpfs POSIX Access Control Lists重新编译内核$ make zImage在etc下创建init.d目录,并在init.d下创建rcS文件$ mkdir /etc/init.d -p$ vim /etc/init.d/rcSrcS文件内容为:#!/bin/sh# This is the first script called by init process/bin/mount -a为rcS添加可执行权限:$ chmod +x init.d/rcS在etc下添加profile文件$ vim /etc/profile文件内容为:#!/bin/shexport HOSTNAME=farsightexport USER=rootexport HOME=root#export PS1="\[\[email protected]\h \W\]\$ "export PS1="[[email protected]$HOSTNAME \W]\# "PATH=/bin:/sbin:/usr/bin:/usr/sbinLD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATHexport PATH LD_LIBRARY_PATH11、 设备文件创建根文件系统中有一个设备节点是必须的,在dev下创建console节点$ mknod dev/console c 5 1重要:新制作的文件系统尺寸若超出8M,删除不需要的库文件。
⑶ 什么是根文件系统
根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。
在Linux中,必须要有一个根文件系统的概念。根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。
mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了。 目前mount已经不仅仅局限于Linux了。在Windows系统下的应用也越来越广了,多用在虚拟光驱类软件上,比如Clone CD,Daemon tool,WinMount等。
根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/linuxrc.等其执行完后。切换根目录,再挂载具体的根文件系统.根文件系统执行完之后,也就是到了Start_kernel()函数的最后,执行init的进程,也就第一个用户进程。对系统进行各种初始化的操作。
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。
⑷ 有了linux裁剪的内核和根文件系统如何来制作linux安装盘,还需要什么谢谢了
能这么问的,估计对Linux也了解不到多少……光盘不能随机寻址,所以最好版将根文件权系统做成一个文件(在系统启动时挂载为ROOT)。这时还需要另外一个虚拟内存盘文件(initrd),其中的启动脚本可以参考现成的Linux安装盘,需要注意的就是最后要将光盘上的一个文件挂载为ROOT,而不是把光盘挂载为ROOT,根文件系统采用的文件系统格式模块必须编译进内核或放进initrd文件。最后一步就是在光盘(或光盘映像)上部署引导程序了。想做这个,C编程不是太重要(能会更好),脚本能力一定要够强!
⑸ 制作linux根文件系统时编译busyboxs后生成的_install/bin/sh内容怎么说乱码呀
-/bin/sh: -un钬欌€? not found-/bin/sh: W]#钬? not found-/bin/sh: Expert: not found是因为有系统抄未识别的命令或者符号,请检查你的rcS等脚本里面,有没有不可识别的符号 另外的 “~ #”问题,应该是你在busybox没有设置命令行提示名称 ,是编译busybox里哪个选项有点忘记了。
⑹ Linux 根文件系统制作
用grub 4 dos里面的grldr引导其实是最方便的把grldr直接放到C:在windows的引导菜单里加入内C:\grldr="GRUB"重启进入grub就可以用来引导linux了不过容要有一定的基础至于安装时要不要解压ISO这个要看用的是什么LINUX了susu是要解压的RH类, den类就不用了你用的那个是怎样的就不知道了, 不过要引导linux的ISO(安装文件),当然要用引导器解释磁盘的方法输入地址啦在grub里就是 hda* hdb*进入内核就是 /dev/hda* /dev/hdb* /dev/sda*等等类似的地址啦不过不知道你看不看得明白上面的东东呢
⑺ mkimage 命令可以制作根文件系统镜像么
bootm命令是用来引导经过u-boot的工具mkimage打包后的kernel image的,什么叫做经过u-boot的工具mkimage打包后的kernel image,这个就要看mkimage的代码,看看它做了些什么,虽然我很希望大家不要偷懒,认真地去看看,但是我知道还是有很多人懒得去做这件,那么我就j将分析mkimage代码后得到的总结告诉大家,mkimage做了些什么,怎么用这个工具。mkimage的用法uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么[email protected]:/tftpboot# ./mkimageUsage: ./mkimage -l image-l ==> list image header information./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file…] image-A ==> set architecture to 'arch'-O ==> set operating system to 'os'-T ==> set image type to 'type'-C ==> set compression type 'comp'-a ==> set load address to 'addr' (hex)-e ==> set entry point to 'ep' (hex)-n ==> set image name to 'name'-d ==> use image data from 'datafile'-x ==> set XIP (execute in place)参数说明:-A 指定CPU的体系结构:取值 表示的体系结构alpha Alphaarm ARMx86 Intel x86ia64 IA64mips MIPSmips64 MIPS 64 Bitppc PowerPCs390 IBM S390sh SuperHsparc SPARCsparc64 SPARC 64 Bitm68k MC68000-O 指定操作系统类型,可以取以下值:openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos-T 指定映象类型,可以取以下值:standalone、kernel、ramdisk、multi、firmware、script、filesystem-C 指定映象压缩方式,可以取以下值:none 不压缩gzip 用gzip的压缩方式bzip2 用bzip2的压缩方式-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)-n 指定映象名-d 指定制作映象的源文件mkimage 解压内核源码包,编辑Makefile 设置 cross_compile:=[编译器的绝对路径] ;这个绝对路径既上面2.95.3放到的路径 进入内核文件夹,执行下面命令 [[email protected]]# make clean [[email protected]]# make dep [[email protected]]# make [[email protected]]# [编译器的绝对路径]/bin/arm-linux-obj -O binary -S vmlinux linux.bin ;编译器的绝对路径也是上面说到的路径 [[email protected]]# gzip linux.bin下面的比较重要了,主要是u-boot的安装,这个在H9200的手册上说的很不清楚 [[email protected]]# tar xzvf u-boot-1.0.0.tar.gz ;解压u-boot [[email protected]]# cd u-boot-1.0.0 [[email protected]]# make distclean [[email protected]]# make at91rm9200dk_config [[email protected]]# make all 然后在/usr/local下建立uboot文件夹将u-boot-1.0.0下的所有文件都复制到uboot下 [[email protected]]# [uboot的绝对路径]/tools/mkimage -A arm -O linux -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage ;这里的绝对路径是/usr/local/ubootvmlinux linux.bin linux.bin.gz uImage(uboot制作的image)mkimage -a -e-a参数后是内核的运行地址,-e参数后是入口地址。1)如果我们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。QUESTIONS1. I have built a vmlinux image but I can boot it.2: The mkimage tool, ARMboot's tftp command, and the bootm command require certain load and entry addresses. I'm confused which ones to chose.ANSWERS1. I have built a vmlinux image but I can boot it.————————————————–ARMboot is designed to boot Images as created by the mkimage tool, thatcomes with ARMboot and is automatically built, too. You cannot directly loadthe vmlinux image, as it expects a number of prerequisits such as specialregister contents etc.2. The mkimage tool, ARMboot's tftp command, and the bootm command require certain load and entry addresses. I'm confused which ones to chose.————————————————————————–Well, there are 3 different addresses:1. Kernel Load Address. This is the address, where the kernel was linked to when you built the vmlinux and can be found in arch/arm/Makefile. The default for it is: ifeq ($(CONFIG_CPU_32),y) PROCESSOR = armv TEXTADDR = 0xC0008000 LDSCRIPT = arch/arm/vmlinux-armv.lds.in endif Provide this as "-a" parameter to mkimage.2. Kernel Entry Point. This is the address, where ARMboot jumps to to enter the Kernel. It usually is the same as the kernel load address. Provide this as "-e" parameter to mkimage.3. The Network Download Address. This is where you download the mkimage File. This address MUST BE different to the Kernel Load Address, and should be sufficiently far away to allow ARMboot to relocate the image to the final Kernel Load Address. Loading to the 5th MB within the RAM is usually a good idea, eg. if the RAM begins at 0xc0000000, you can do this: LART # tftp c0400000 linux.img ARP broadcast 1 eth addr: 00:02:03:04:05:06 TFTP from server 192.168.1.1; our IP address is 192.168.1.2 Filename 'image.img'. Load address: 0xc0400000 Loading: ##################################################################done Bytes transferred = 567252 (8a7d4 hex) LART # bootm c0400000 Image Name: Linux 2.4.18 Created: Mon Jun 24 12:00:01 2002 Image Type: ARM Linux Kernel Image (gzip compressed) Data Size: 567188 Bytes = 553 kB = 0 MB Load Address: 0xc0008000 Entry Point: 0xc0008000 Verifying Checksum … OK Loading Kernel Image … OK Starting kernel … Linux version 2.4.18 ([email protected]) (gcc version 2.95.3 20010315 (release)) #4 Mon Jun 17 20:35:32 CST 2002
⑻ 有了linux内核和根文件系统如何来制作安装盘
( 小于700兆)光盘上,是因为多个版本中有好多文件是相同的。这样有一些光盘制作工具能够能够调整,多个原本一样文件在光盘上实际是只存储了一份。如今的年头都是DVD了,所以即使在多点版本也能作出来。具体windows怎么做的可以参考 (版权归原作者啊…)但linux来讲,多个版本系统虽然都是linux 内核,但每个公司的都或多或少有自己的特点,里面的二进制文件都有点差别,比如redhat 最早做的RPM包 ,opensuse也是RPM包加YAST管理器(openSUSE安装过程就调用yast安装的样子)这两家的软件包都是RPM,但互相之间未必能完全兼容,因为软件安装时有一些系统路径,软件依赖桌面菜单配置等等之类的差别),debian的包是*.deb 的格式 采用DPKG管理,包的整体组织是pool的形式,还有别的linux版本,slackware 包的格式还不一样,是tar.gz格式,所以基本上想像早期的多个文件存储一份,控制整体体积存在一张光盘上的可能性好像就没了。但如果考虑,每个版本只选基本能安装系统的CD(比如debian只要第一张cd盘就能安装好系统)这样每个版本选好盘,最终做在一张DVD上,应该是有可能性的。那么怎么做呢?很早以前(好像距今5年吧)我做过一张系统多引导盘,其实就是winpe dragonBSD grub引导盘 dos引导盘之类的放在一张光盘里(后来发现网上有个叫深山红叶系统盘的,做出来就根那个差不多,只是我做的都是命令行的,没有界面)其实原理上是这样的,系统光盘都有个引导区域,制作一个引导区具有这样的功能1.读取别的光盘的引导区 讲其他光盘(A)的引导区读出来,作为一个文件,引到程序能载入这个文件,载入以后机器的内存 CPU寄存器之类的就根用A光盘启动后一样,就像你插入了debian盘,启动了一样。2.将其他的引导盘直接读入内存里,建立虚拟文件系统。3.能够当命令行工具,执行简单其他程序。关于1.有个补充点,既然这时候内存,cpu就像你用了debian盘启动了一样,那么最终像制作的光盘里面的目录结构应当具有debian盘的结构。即假如原本有个文件 iso/a/b.deb 那么最终的DVD也得有这个文件,不然安装程序肯定找不到文件报错。或者要修改debian盘的安装程序一般是isolinux的样子,使他知道最终的文件在哪里。很难三言两语说清,我找到了很久前我参考的部分文章,你可以看看。参考 (这个我以前没看过)PS:其实 /quote“关于1.有个补充点,既然这时候内存,cpu就像你用了debian盘启动了一样,那么最终像制作的光盘里面的目录结构应当具有debian盘的结构。即假如原本有个文件 iso/a/b.deb 那么最终的DVD也得有这个文件,不然安装程序肯定找不到文件报错。或者要修改debian盘的安装程序一般是isolinux的样子,使他知道最终的文件在哪里。”/quote 是很难解决的,因为多个linux盘可能确实就有很多同一个位置同一个文件名字的,而且两个还不一样,这时只能调节linux盘的引导了,这要参考版本发行商的引导制作方法调整了。
⑼ 什么时候要重新制作Linux的根文件系统谢谢
首先要理解什么是根文件系统,如果你不是做应用开发如嵌入式等等话,就不需要修改。1. 根文件系统文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。注:对于我们应用开发来说,购买开发板的时候,厂家会提供好现成的根文件系统和BootLoader等,如果需要,我们可以改变其中的命令而无需从头开始制作一个新的根文件系统。不过这儿的制作过程可以让我们更深一点理解Linux的文件系统。2.主要的根文件系统* Linux 中,rootfs 是必不可少的。PC 上主要实现有 ramdisk 和直接挂载 HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从 HD 启动,而是从 Flash 启动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,稍复杂的就是 直接从Flash 读取的 Cramfs,更复杂的是在 Flash 上分区,并构建 JFFS2 等文件系统。* RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load 到RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在linux系统中,ramdisk有二种,一种就是可以格式化并加载,在linux内核2.0/2.2就已经支持,其不足之处是大小固定;另一种是 2.4的内核才支持,通过,ramfs来实现,他不能被格式化,但用起来方便,其大小随所需要的空间增加或减少,是目前linux常用的ramdisk技术.* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大简化了 Linux 的启动过程,附合 Linux 的基本哲学:Keep it simple, stupid(KISS). 不过cpio-initrd 作为新的格式,还没有经过广泛测试,嵌入式 Linux 中主要采用的还是 image-initrd。* Cramfs 是 Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从 Flash 上运行,不须 load 到 RAM 中,因此节约了 RAM。但是 Cramfs 是只读的,对于需要运行时修改的目录(如: /etc, /var, /tmp)多有不便,因此,一般将这些目录做成ramfs 等可写的 fs。* SquashFS 是对 Cramfs 的增强。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有优势。不过,据开发者介绍,在性能上可能不如 Cramfs。这也是一种新方法,在嵌入式系统采用之前,需要经过更多的测试。3.Ramdisk制作RAMDisk的制作方法如下:(1) 在PC机的Linux操作系统环境下,生成可以虚拟成块设备的文件,假设文件名为init.img。$ dd if=/dev/zero of=init.img bs=4096 count=1024其中bs*count为块设备大小(单位:字节),生成init.img文件以后,还必须对该文件进行格式化。$ mke2fs –m0 –F init.img(2) 新建一个文件夹ram,并将init.img挂接到ram目录。$ mkdir ram$ mount init.img ram/ -o loop这时,读写ram目录,等效于读写init.img文件。用户可以将根文系统所需的文件写入到ram目录中。往ram目录写完文件以后,还需要使用umount ram命令卸载init.img,才能将已写入的文件保存到init.img中。(3)添加完毕,需要umount ram4. Cramfs制作CramFS(Compressed Rom File System)是Linux Torvalds在Transmeta任职时,所参与开发的文件系统。它是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统,采用了 zlib 压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取,Linux系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为Cramfs不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先要把Flash上的映像文件解压缩到内存中,构造起RAMDISK环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在Flash中占据了空间(以压缩后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。使用CramFS文件系统就是一种解决这个问题的方式。CramFS是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在CramFS中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS中的解压缩以及解压缩之后的内存中数据存放位置都是由CramFS文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。但是Cramfs也有其缺点:延迟、小于16MB、不支持写,只支持PAGE_CREATE_SIZE=4096的内核。制作的命令:(root文件夹中存放着文件系统)#mkcramfs root cramfs.img5. 其他根文件系统的制作制作yaffs文件系统: mkyaffsimage myroots myroots.img制作squashfs: mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI6. BusyBox编译以及移植(根文件系统内命令的制作移植)建立目标板空根目录文件夹及根目录下的文件夹:[[email protected] friendly-arm]# mkdir myroots[[email protected] friendly-arm]#pwd/friendly-arm/myroots[[email protected] friendly-arm]#cd myroots[[email protected] myroots]# mkdir bin sbin usr lib dev mnt opt root etc home proc tmp var[[email protected] myroots]# mkdir etc/init.d进入etc/init.d目录下,建立一个脚本文件,并命名为rcS,用gedit打开,添加如下内容:#! /bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:runlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel## Trap CTRL-C &c only in this shell so we can interrupt subprocesses.#trap ":" INT QUIT TSTP创建 dev 中的节点如果使用“linux 2.6.xx”的内核,应该事先创建节点“console”、“null”。否则在系统启动时内容会提示以下错误:Warning: unable to open an initial console.Kernel panic – not syncing: Attempted to kill init!创建节点的命令如下:# mknod dev/console c 5 1# mknod dev/null c 1 3移植Busybox:进入到压缩文件存放的目录下,并解压。然后进入解压后的busybox目录文件夹,随后配置busybox 。[[email protected] busybox-1.2.0]# make menuconfig由于每个版本的配置选项组织有所不同。不管怎样,我们注意以下选项就行了:1) Support for devfs2) Build BusyBox as a static binary ( no shared libs ) //将busybox编译成静态链接3) Do you want to build busybox with a Cross Compile?(/usr/local/arm/3.3.2/bin/arm-linux-) Cross Compile prefix //指定交叉编译器4) init5) Support reading an inittab file //支持init读取/etc/inittab 配置文件6) (X) ash选中ash //建立的rcS脚本才能执行7)ash8)cp cat ls mkdir mv //可执行命令工具的选择,自己看着办吧,需要用到的就选上9) mount10) umount11) Support loopback mounts12) Support for the old /etc/mtab file13) insmod14) Support version 2.2.x to 2.4.x Linux kernels15) Support version 2.6.x Linux kernels16) vi17)don’t use user以上内容必须选上,其他可按默认值;如果要支持其他功能,如网络支持等,可按需选择,英语不是很烂的话,这些都没有问题。配置好之后,保存退出。然后对其编译和安装到刚才建立的根文件系统目录下:[[email protected] busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install安装好之后,将相应的二进制文件拷贝到根文件系统相应的目录下:* 拷贝一些管理员控制程序到/sbin目录下,最重要的就是要包含一个init命令;* 拷贝应用程序运行时所需要的库到/lib,库文件可以从PC机上的交叉编译工具安装目录下拷贝,如libc-2.2.2.so、libcryt- 2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so等,为部分相应库建立快捷方式,提供一些应用程序按快捷方式名称调用。
未经允许不得转载:山九号 » 根文件系统制作|如何制作Linux根文件系统