初级根系统的制作.doc_第1页
初级根系统的制作.doc_第2页
初级根系统的制作.doc_第3页
初级根系统的制作.doc_第4页
初级根系统的制作.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本来想把文件系统制作的过程系统的整理一下,发现离最终目的还有一段距离。所以,还是采取边实验边修改,尝试可能情况,最终完成常用的所有功能的移植。这样,在具体应用中只需要做相应的裁减就可以了。为了搞清楚每一个功能部件的依赖关系,要从最小的功能出发,逐步添加功能。 Linux的启动阶段分为两大阶段。第一个阶段从bootloader引导内核,至内核挂载root fs成功为止,这个阶段的一个标志就是如下打印信息: VFS: Mounted root (jffs2 filesystem).Freeing init memory: 100K 第二个阶段分为如下顺序:init - getty - login - shell四个阶段。而成功的打印信息: rootlistentec # 当然,根据你设定的shell的PS1,显示也会有所不同。但最终成功都会打印出shell prompt。 init现在力求统一标准,最为常用的还是system V init和busybox init。system V init是host上常用的,也是redhat的默认init。system V init是比较复杂的,支持多级别启动。相对于嵌入式系统来说,有些复杂。busybox只支持一个级别,相对来说,更适合嵌入式系统应用。 login在选择上也有busybox login和tinylogin。而tinylogin要支持的好一点。 shell的选择上有busybox ash,也可以交叉编译出一个bash,这样的话bash的功能要强一点。 原来没有细细整理笔记,现在整理时,看到Tekkaman Ninja已经整理得比较详细了,具体见:/u1/34474/showart_485837.html,现在就参考Tekkaman Ninja的笔记,再附上自己的理解,算作是根文件系统制作的第一个阶段总结。 (1)创建根文件系统的基本目录结构 这个肯定要参考FHS。最初制作的时候,我认为直接用root用户创建就可以了,这个与host还是比较一致的。 armlinuxlqm basicfs1$ tree -L 1.|- bin|- dev|- etc|- home|- lib|- mnt|- proc|- root|- rootfs|- sbin|- sys|- tmp|- usr- var 也写了小的脚本: armlinuxlqm fs$ cat mkrootfs.sh#!/bin/bash# make the basic root file system# set the target documentationROOTFS=rootfsTRUE=1FALSE=0# check whether the user is the rootis_root() if id -u = 0 ; then return $TRUE else return $FALSE fi# must be the rootif is_root; then echo Must be root to run this script. exit 1fi# create the rootfsmkdir $ROOTFS; cd $ROOTFSmkdir -p bin dev etc lib/modules proc sbin sys usr/bin usr/lib usr/sbin tmp# create the basic devmknod -m 600 dev/console c 5 1mknod -m 666 dev/null c 1 3# copy libcp -av ./simple_fs/libcp -av ./simple_fs/etc/* etc/ 这个制作过程并不复杂。只是在最小的组织上还是有待考虑的。 (2)编译busybox 主要就是修改ARCH和CROSS,然后menuconfig,最后指定路径安装。这里有一个版本对应问题,我是选择了cross-3.4.1,编译没有问题。 文件: busybox.rar 大小: 0KB 下载: 下载 (3)编译tinylogin 这里需要注意的是,不采用tinylogin自带的加密算法。需要改动的地方是: diff -urN tinylogin-1.4.orig/Makefile tinylogin-1.4/Makefile- tinylogin-1.4.orig/Makefile 2003-01-03 18:56:33.000000000 +0800+ tinylogin-1.4/Makefile 2008-03-19 11:00:01.000000000 +0800 -49,12 +49,12 # this adds just 1.4k to the binary size (which is a _lot_ less then glibc NSS # costs). Note that if you want hostname resolution to work with glibc, you # still need the libnss_* libraries.-USE_SYSTEM_PWD_GRP = true+USE_SYSTEM_PWD_GRP = false # Setting this to true will cause tinylogin to directly use the systems # shadow password functions. If you leave this off, tinylogin will use its # own (probably smaller) shadow password functions.-USE_SYSTEM_SHADOW = true+USE_SYSTEM_SHADOW = false # This enables compiling with dmalloc ( / ) # which is an excellent public domain mem leak and malloc problem -73,7 +73,7 # If you are running a cross compiler, you may want to set this # to something more interesting, like powerpc-linux-.-CROSS =+CROSS = /usr/local/arm/3.4.1/bin/arm-linux- CC = $(CROSS)gcc AR = $(CROSS)ar STRIPTOOL = $(CROSS)strip 这样就可以使用host的/etc/group /etc/passwd /etc/shadow了。 (3)/etc/下基本配置文件的探讨 如果你在bootloader的命令行参数中没有指定init=filename,那么首先init默认执行的是/sbin/init,而该程序现在采用的busybox的init,具体的流程为: 为init设置信号处理流程 初始化控制台 剖析inittab文件,/etc/inittab 根据/etc/inittab文件的设置来进行初始化,缺省情况首先执行/etc/init.d/rcS。 执行所有会导致init暂停的inittab命令(动作类型:wait) 执行所有仅执行一次的inittab命令(动作类型:once) 一旦完成,init进程就会循环执行如下工作: 执行所有终止时必须重新启动的inittab命令(动作类型:respawn) 执行所有终止时必须重新启动但启动前必须先询问用户的inittab命令(动作类型:askfirst) 其实简单的说,就是找到init,然后读取inittab脚本来执行。如果没有inittab脚本,busybox会按照默认的值进行操作。 这里多说几句的是,no init的错误是很普遍的。主要的原因有:一是没有找到init;二是找了了执行的init,但是没有执行权限,所以还是无法执行;三是找到了init,并且可执行,但是如果是动态编译,对应的共享库有问题的话,也是无法执行程序的。基本的原因就这三个,你当然可以按照最小的文件系统的功能进行测试,只需要一个bin文件(内含sh),一个dev文件夹(内含console),还有一个init脚本,指定exac /bin/sh。测试成功的话,说明你的基本流程可以走通,然后就应该逐步增加功能了。 当然因为后续功能添加的时候,dev中还必须包含null。其他的设备文件则可以通过udev的简化版本mdev来实现了。这个地方需要注意的是mdev对应脚本加载时的初始化顺序是非常重要的,并非随便写。在后面telnet server移植设定的时候就遇到了这个问题。建议读一下mdev.txt,按照上面的流程来写,就没有问题。 /etc/inittab 这是init读取的第一个文件,语法是比较晦涩的,功能的易读性上也不好。所以它只是提供了一个动作的入口,具体的功能实现都在执行的操作里。 armlinuxlqm etc$ cat inittab:sysinit:/etc/init.d/rcS:respawn:-/bin/login:restart:/sbin/init:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a -r:shutdown:/sbin/swapoff -a /etc/init.d/rcS 就是shell脚本了,所有的初始化信息都可以逐步加在这里。初步的rcS参考Tekkaman Ninja的就可以了。这个是我后来完成的一个,仍然是初级脚本。 armlinuxlqm etc$ cat init.d/rcS#!/bin/sh# Initial Environment# mount /etc/fstab spcified device/bin/mount -a# mount devpts in order to use telnetd/bin/mkdir /dev/pts/bin/mount -t devpts devpts /dev/pts# read the busybox docs: mdev.txt/bin/mount -t sysfs sysfs /sys/bin/echo /sbin/mdev /proc/sys/kernel/hotplug/sbin/mdev -s# when mdev is mounted, /sys can be umounted/bin/umount /sys# Hostname Setting/bin/hostname listentec# Network Setting/sbin/ifconfig lo /sbin/ifconfig eth0 00 netmask /sbin/route add default gw # Adjust Time/usr/sbin/ntpdate 4# NFS client/bin/mount -o nolock,wsize=1024,rsize=1024 06:/home/armlinux/nfs /mnt/nfs/bin/echo NFS client is on now and the mounted point is /mnt/nfs# Print the author information/bin/echo/bin/echo */bin/echo made by lqm /bin/echo */bin/echo /etc/mdev.conf 这个可以为空,也可以根据mdev的配置语法来编写。但是必须要有,否则就会报错。 /etc/fstab 这是mount -a要读取的文本。根据需要编写。 armlinuxlqm etc$ cat fstabproc /proc proc defaults 0 0mdev /dev tmpfs defaults 0 0 关于login的还有/etc/passwd, /etc/group, /etc/shadow,直接从host拷贝就可以了。 U-Boot 1.3.0 (Mar 18 2008 - 15:25:30)U-Boot code: 21F00000 - 21F16EA4 BSS: - 21F34004RAM Configuration:Bank #0: 20000000 32 MBFlash: 8 MBIn: serialOut: serialErr: serialHit any key to stop autoboot: 0 # Booting image at 21000000 . Image Name: RAM disk Image Type: ARM Linux Kernel Image (gzip compressed) Data Size: 1149858 Bytes = 1.1 MB Load Address: 20008000 Entry Point: 20008000 Verifying Checksum . OK Uncompressing Kernel Image . OKStarting kernel .Linux version 2.6.20 (armlinuxlqm) (gcc version 3.4.1) #1 Tue Mar 18 16:53:40 CST 2008CPU: ARM920T 41129200 revision 0 (ARMv4T), cr=c0003177Machine: Jinan ListenTec Co. LTD AT91RM9200DKMemory policy: ECC disabled, Data cache writebackClocks: CPU 179 MHz, master 59 MHz, main 18.432 MHzCPU0: D VIVT write-back cacheCPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 setsCPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 setsBuilt 1 zonelists. Total pages: 8128Kernel command line: noinitrd root=/dev/mtdblock3 rw rootfstype=jffs2 console=ttySAC0,115200 mem=32MAT91: 128 gpio irqs in 4 banksPID hash table entries: 128 (order: 7, 512 bytes)Console: colour dummy device 80x30Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)Memory: 32MB = 32MB totalMemory: 30012KB available (2108K code, 223K data, 100K init)Mount-cache hash table entries: 512CPU: Testing write buffer coherency: okNET: Registered protocol family 16NET: Registered protocol family 2IP route cache hash table entries: 1024 (order: 0, 4096 bytes)TCP established hash table entries: 1024 (order: 0, 4096 bytes)TCP bind hash table entries: 512 (order: -1, 2048 bytes)TCP: Hash tables configured (established 1024 bind 512)TCP reno registeredNetWinder Floating Point Emulator V0.97 (double precision)JFFS2 version 2.2. (NAND) (SUMMARY) (C) 2001-2006 Red Hat, Inc.io scheduler noop registeredio scheduler anticipatory registered (default)AT91 Watchdog Timer enabled (5 seconds, nowayout)atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIALatmel_usart.1: ttyS1 at MMIO 0xfffc0000 (irq = 6) is a ATMEL_SERIALatmel_usart.2: ttyS2 at MMIO 0xfffc4000 (irq = 7) is a ATMEL_SERIALRAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksizeloop: loaded (max 8 devices)nbd: registered device at major 43PPP generic driver version 2.4.2PPP Deflate Compression module registeredPPP BSD Compression module registeredPPP MPPE Compression module registeredat91_ether: Your bootloader did not configure a MAC address.eth0: Link now 10-HalfDuplexeth0: AT91 ethernet at 0xfefbc000 int=24 10-HalfDuplex (36:b9:04:00:24:80)eth0: Davicom 9161 PHY (Copper)AT91RM9200-NOR:0x00800000 at 0x10000000NOR flash on AT91RM9200DK: Found 1 x16 devices at 0x0 in 16-bit bank Intel/Sharp Extended Query Table at 0x0031Using buffer write methodcfi_cmdset_0001: Erase suspend on write enabledAT91RM9200-NOR:using static partition definitionCreating 5 MTD partitions on NOR flash on AT91RM9200DK:0x00000000-0x00020000 : U-boot0x00020000-0x00220000 : Kernel0x00220000-0x00520000 : RootFS0x00520000-0x007e0000 : Jffs20x007e0000-0x00800000 : Parametersat91_cf: irqs det #64, io #0mice: PS/2 mouse device common for all miceTCP cubic registeredNET: Registered protocol family 1NET: Registered protocol family 17JFFS2 notice: (1) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.VFS: Mounted root (jffs2 filesystem).Freeing init memory: 100Kinit started: BusyBox v1.9.1 (2008-03-20 14:53:52 CST)starting pid 710, tty : /etc/init.d/rcSeth0: Link now 10-HalfDuplex22 Mar 08:46:50 ntpdate722: step time server 4 offset 1206146805.770447 secNFS client is on now and the mounted point is /mnt/nfs* made by lqm *starting pid 732, tty : /sbin/telnetdstarting pid 733, tty : /bin/loginlistentec login: rootlogin733: root login on console 我的引导信息(后来制作的,最初的还没有备份)。 发表于: 2008-03-22,修改于: 2008-03-22 10:27,已浏览103次,有评论7条 推荐 投诉 网友评论 网友: piaoxiang 时间:2008-03-22 10:32:21 IP地址:122.4.41. 问题1:平台搭建好之后,可以ping通内网ip和外网ip,但是ping不通域名。解决办法:1)增加/etc/resolv.confrootlqm /etc#cat resolv.conf nameserver /加入域名解析器2)增加相应动态库的支持增加如下:libnss_fileslibnss_dnslibresolv.sorootlqm /lib#find . -name libnss*./libnss_files.so.2./libnss_files.so./libnss_dns-2.3.2.so./libnss_dns.so./libnss_files-2.3.2.so./libnss_dns.so.2rootlqm /lib#find . -name libresolv*./libresolv.so./libresolv.so.2./libresolv-2.3.2.so这样就解决了。效果如下:rootlqm #lsrootlqm #ping PING (): 56 data bytes64 bytes from : seq=0 ttl=58 time=24.994 ms64 bytes from : seq=1 ttl=58 time=24.994 ms64 bytes from : seq=2 ttl=58 time=24.871 ms- ping statistics -3 packets transmitted, 3 packets received, 0% packet lossround-trip min/avg/max = 24.871/24.953/24.994 ms 网友: piaoxiang 时间:2008-03-22 10:34:29 IP地址:122.4.41. 问题2:通过nfs下载文件,容量较大时,出现nfs: server xxx.xxx.xxx.xxx not responding, still

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论