2.6.1 /etc/inittab initab 被 init 使用 2.6.1.1 老平台 inittab文件内容 2.6.1.1 gpephone 官方的inittab 文件(与redhat,federo差不多) 2.6.1.1 ubuntu中没有inittab文件 ================= 2.6.1.1 老平台 inittab文件内容 ----------------------------------------- ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a ----------------------------------------- 2.6.1.2 gpephone 官方的inittab 文件(与redhat,federo差不多 ----------------------------------------- # /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin 1:2345:respawn:/sbin/getty 38400 tty1 ------------------------------------------- 2.6.1.3 ubuntu中没有inittab文件 在unbutu系统中我们没看到此文件,是因为ubuntu用的是 upstart ,lfs中使用的是 sysvinit ,嵌入式系统中 一般使用的是 busybox 中的 init ,android 系统使用的是 system/core/init init: main() init_main() read_inittab(); gdm运行后 /etc/rc5.d/S30gdm -> ../init.d/gdm /etc/init.d/gdm:19:DAEMON=/usr/sbin/gdm /etc/init.d/gdm:24: SSD_ARG="--startas $DAEMON" /etc/init.d/gdm:27: SSD_ARG="--exec $DAEMON" 启动gdm: log_begin_msg "Starting GNOME Display Manager..." start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --name gdm $SSD_ARG -- $CONFIG_FILE >/dev/null ================ 2.6.2 /etc/init.d/rcS ------------------- #!/bin/sh 挂在 /etc/fstab 中的文件系统 /bin/mount -a . /etc/default/rcS #环境变量 . /etc/profile #屏幕叫准备 . /etc/X11/run-calibrate #启动X . /etc/X11/Xserver . /etc/scripts/testd-bus.sh #启动dbus消息总线 #启动gpephone ------------------- ubuntu 系统 --------------- exec /etc/init.d/rc S --------------- 会依此执行 /etc/rcS.d/ 下以 S01mountkernfs.sh S02hostname.sh S10udev S11mountdevsubfs.sh S20checkroot.sh S22mtab.sh S30checkfs.sh S35mountall.sh S40networking S43portmap S55bootmisc.sh ./rc3.d/S30gdm ./rc2.d/S30gdm ./rc4.d/S30gdm ./rc5.d/S30gdm /etc/rcS.d/S35mountall.sh -> ../init.d/mountall.sh mount -a -t nonfs,nfs4,smbfs,cifs,ncp,ncpfs,coda,ocfs2,gfs,gfs2 -O no_netdev mount命令的一些解析: mount -a [-t|-O] ... : mount all stuff from /etc/fstab mount -t type dev dir : ordinary mount command ================ 2.6.3 /etc/fstab 文件 Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,打开 tty 端口和得到内核消息 arch 报告机器的体系结构 blockdev 在命令行中调用块设备的ioctl cal 显示一个简单的日历。 cfdisk 处理指定设备的分区表 column 把输出格式化为几列 ctrlaltdel 设置CTRL+ALT+DEL组合键的功能为硬重启或软重启 dmesg 显示内核的启动信息 fdisk 磁盘分区管理程序 fsck.cramfs 对Cramfs文件系统的一致性进行检查 getopt 在给出的命令行进行选项和参数解析 hexdump 用用户指定的方式(包括ASCII, 十进制, 十六进制, 八进制)显示一个文件或者标准输入的数据 hwclock 查询和设置硬件时钟(也被称为RTC或BIOS时钟)。 ipcrm 删除给定的进程间通信(IPC)资源 mkfs 在一个设备(通常是一个硬盘分区)设备上建立文件系统 mkfs.cramfs 创建cramfs文件系统 mkswap 初始化指定设备或文件,以用做交换分区 more 分屏显示文件,但没有less好用 mount 把一个文件系统从一个设备挂载到一个目录 ramsize 显示或者改变 RAM disk 的大小 raw 将一个原始的Linux字符设备绑定到一个块设备 rdev 查询和设置内核的根设备和其他信息 readprofile 显示内核侧写文件/proc/profile的信息 rename 对文件进行重命名 renice 修改正在运行进程的优先级 sfdisk 磁盘分区表管理工具 umount 卸载一个被挂载的文件系统 mount挂载与/etc/fstab mount 源目录 目的目录 mount -a 自动挂载/etc/fstab中的文件系统 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。 其它 mount point 必须为已建立的目录﹐可任意指定﹐ 但一定要遵守必须的系统目录架构原则 所有 mount point 在同一时间之内﹐只能挂载一次。 所有 partition 在同一时间之内﹐ 只能挂载一次。 如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。 /etc/fstab 第一列:label 第二列:挂载点 第三列:分区的文件系统 第四列:文件系统挂载选项,看附件啦 第五列:是否被dump作用。0代表不要做dump 备份,1代表要每天进行dump的动作。 2 也代表其它不定日期的dump备份动作,通常这个数值不是0就是1啦! 第六列:是否以fsck检查分区(开机时候检查分区)0为不检查,1为开机的时候检查,2为在稍后的时间检查 /dev/sda8 on / type ext3 (rw,relatime,errors=remount-ro) /proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620) /dev/sda7 on /boot type ext3 (rw,relatime) /dev/sda11 on /home type ext3 (rw,relatime) /dev/sdb5 on /opt type ext3 (rw,relatime) /dev/sda9 on /usr/local type ext3 (rw,relatime) /dev/sda1 on /windows/c type vfat (rw,utf8,umask=007,gid=1000) /dev/sda5 on /windows/d type vfat (rw,utf8,umask=007,gid=1000) /dev/sda6 on /windows/e type vfat (rw,utf8,umask=007,gid=1000) 可以在/etc/fstab 中进行指定 proc /proc proc defaults 0 0 none /tmp ramfs defaults 0 0 sysfs /sys sysfs defaults 0 0 none /dev/pts devpts defaults 0 0 ./util-linux-2.12r/mount/mount.c main() result = do_mount_all (types, options, test_opts); mount --help 可以知道 mount -a 是mount所有/etc/fstab mount -a [-t|-O] ... : mount all stuff from /etc/fstab ====================== 2.7 制作文件系统 2.7.1 原始方式 2.7.2 通过scratchbox等工具 2.7.3 通过 android 源码集成开发环境 2.7.1 原始方式 创建基本文件系统标准目录(根据不同的linux系统,ubuntu跟android目录结构就完全不同) lfs中的标准目录: 创建修改必要的配置文件 /scratchbox/source2/source/busybox/busybox-1.1.2/examples/bootfloppy/etc/ vim ${CLFS_ROOTFS_DIR}/etc/profile vim ${CLFS_ROOTFS_DIR}/etc/inittab vim ${CLFS_ROOTFS_DIR}/etc/fstab vim ${CLFS_ROOTFS_DIR}/etc/init.d/rcS 创建账号以及密码文件 sudo vim ${CLFS_ROOTFS_DIR}/passwd 拷贝必须的动态库文件 cd ${CLFS_ROOTFS_DIR}/lib cp -d $COMPILER_LIB/ld* ./ cp $COMPILER_LIB/libc-2.3.5.so ./ cp -d $COMPILER_LIB/libc.so.6 ./ cp $COMPILER_LIB/libm-* ./ cp -d $COMPILER_LIB/libm.s* ./ cp $COMPILER_LIB/libcrypt-* ./ cp -d $COMPILER_LIB/libcrypt.s* ./ 拷贝可选的动态库文件 如果需要域名解析: 1)增加/etc/resolv.conf [root@lqm /etc]#cat resolv.conf nameserver 192.168.x.x //加入域名解析器 2)增加相应动态库的支持 增加如下: libnss_files libnss_dns libresolv.so find find . -name "libnss*" $COMPILER_LIB/ ./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.2 find . -name "libresolv*" /scratchbox/compilers/arm-linux-gcc-3.4.4-glibc-2.3.5/arm-unknown-linux-gnu/lib/ ./libresolv.so ./libresolv.so.2 ./libresolv-2.3.2.so 2.7.2 通过scratchbox等工具 =================== 2.7.3 通过 android 源码集成开发环境 环境搭建问题: 1.为什么拷贝 cupcake 编译结果 out/target/product/littleton/root/ 到内核顶层目录? 2.cupcake-jianping/make_image15.sh中的choosecombo是什么作用? 3.make_image15.sh 与 make_env15.sh只差一句make -j2? 4.补充shell脚本知识。 ===================== 2.7.4 配置android网络文件系统 下面是曾经用过的几种开发板的命令行参数: S3C2410 启动参数: noinitrd root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs ip=192.168.2.188:192.168.2.56:192.168.2.56:255.255.255.0::eth0:on console=ttySAC0 S3C2440 启动参数: setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs ip=192.168.2.175:192.168.2.56:192.168.2.201:255.255.255.0::eth0:on mem=64M init=/init marvell 310 启动参数: boot root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs,rsize=1024,wsize=1024 ip=192.168.2.176:192.168.2.201:192.168.2.201:255.255.255.0::eth0:-On console=ttyS2,115200 mem=64M init=/init 当前android内核的.config文件中的命令行参数: CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.1.100:/nfsroot/rootfs,rsize=1024,wsize=1024 ip=192.168.1.101:192.168.1.100:192.168.1.100:255.255.255.0::usb0:on console=ttyS1,115200 mem=128M init=/init android uart_dma=1" `root=' 参数 此参数告诉内核启动时以那个设备作为根文件系统使用。我的pc根文件系统: /dev/sda8 9614116 6522156 2603588 72% / ubuntu 的/boot/grub/menu.lst参数: kernel /vmlinuz-2.6.27-4-generic root=UUID=2ffa7dc6-2dc5-4b66-8661-1226c086951a ro locale=zh_CN quiet splash initrd /initrd.img-2.6.27-4-generic 其中 root可以设置为:root=/dev/sda8 /dev/nfs, 这并非真的是个设备, 而是一个告诉核心经由网络取得根文件系统 lfs的/boot/grub/menu.lst参数: title LFS 6.4 root (hd1,1) kernel /boot/lfskernel-2.6.27.4 root=/dev/sdb1 `nfsroot=' 参数 这个参数告诉内核到哪台pc的哪个目录读取根文件系统。此参数的格式如下: nfsroot=[:][,] --pc机的ip地址,如果此字段没给值,那么将使用由 nfsaddrs 变量(见下面)所决定的值。 -- pc服务端上要作为根挂入的目录域名(/nfsroot/rootfs) -- 标准的网络文件系统选项。所有选项都以逗号分开。如果没有给定此选项字段则使用下列的缺省值: port = as given by server portmap daemon rsize = 1024 wsize = 1024 timeo = 7 retrans = 3 acregmin = 3 acregmax = 60 acdirmin = 30 acdirmax = 60 flags = hard, nointr, noposix, cto, ac `init=' 参数 内核启动时缺省执行 `init' 程序,内核将会到/sbin/, /bin/ 等目录下查找默认的init,如果没有找到那么就报告出错。 而最后它会去试 /bin/sh (可能在 /etc/rc )。如果说,例如,如果你的 init 程序坏掉了,只要使用 init=/bin/sh 这个启动参数就能让你在启动时直接跳到解译环境(shell),使你能够换掉坏掉的程序。 `ip=' 参数 nfsaddrs=:::::: ip=192.168.1.101:192.168.1.100:192.168.1.100:255.255.255.0::usb0:on ip=192.168.2.175:192.168.2.56:192.168.2.201:255.255.255.0::eth0:on -- 板子的ip 使用何种协议端视配置核心时打开的选项以及 参数而定。如果设定此参数,就不会使用反向地址解析协议或启动协议。 -- 网络文件系统服务端之互联网地址。 -- 网关(gateway), -- 本地网络界面的网络掩码。如果为空白,则网络掩码由客户端的互联网地址导出,除非由启动协议接收到值。 -- 客户端的域名。如果空白,则使用客户端互联网地址之 ASCII-标记法,或由启动协议接收的值。 -- 要使用的网络设备域名。 -- 用以作为自动配置的方法。 参考文档: ramfs, rootfs, initrd and initramfs http://blog./u2/89923/showart_1890405.html 嵌入式系统文件系统比较 http://blog.sina.com.cn/s/blog_53ad41a50100eptc.html LINUX系统性能调谐 http://www./article/server/00 ... 3755_2.htm 怎样限制或者修改/dev/shm的大小 http://www./html/65/t-665.html ==================================================================== ==================================================================== 3. 制作交叉工具链 3.1 什么是工具链 3.2 获取交叉工具链的几种途径 3.3 android工具链与gnu工具链的比较 每一个软件,在编译的过程中,都要经过一系列的处理,才能从源代码变成可执行的目标代码。这一系列处理包括:预编译,高级语言编译, 汇编,连接及重定位。这一套流程里面用到的每个工具和相关的库组成的集合,就称为工具链(tool chain)。以GNU的开发工具GCC为例, 它就包括了预编译器cpp,c编译器gcc,汇编器as,和连接器ld等。在GNU自己对工具链定义中,还加进了一套额外的用于处理二进制包的 工具包binutils,整个工具链应该是GCC+binutils+Glibc, binutils其实与Glibc关系不是很大,它可以被独立安装的,所以GNU工具 链也可以狭义地被理解为GCC+Glibc。 要构建出一个交叉工具链,需要解决三个问题。一是这个工具链必须是可以运行在原工作站平台上的。二是我们需要更换一个与目标平台对应的 |
|
来自: shaobin0604@1... > 《Android》