您好,登錄后才能下訂單哦!
一、rootfs制作:
根文件系統(tǒng)是Linux啟動時使用的第一個文件系統(tǒng),就像PC機上的文件目錄
1.創(chuàng)建根文件系統(tǒng)的目錄(目錄名隨便?。?/span>
mkdir rootfs
cd rootfs
mkdir bin dev etc lib home proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules
2.創(chuàng)建設(shè)備文件
cd dev/
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
二、配置busybox
解壓busybox,進入busybox根目錄
make menuconfig
選擇需要使用的工具
進入 busybox settings->build option->
選中 “build busybox as a static binary”,靜態(tài)鏈接
更改Cross Compiler prefix 為(arm-linux-)
三、編譯安裝busybox
把相關(guān)的命令/文件拷貝到這個正在創(chuàng)建的文件系統(tǒng)
1.在busybox根目錄下
修改Makefile
ARCH=arm
CROSS_COMPILE=arm-linux-
make
make install
cp -rf _install/* rootfs
由于/root/rootfs/linuxrc 和/root/rootfs/sbin/init 是同一個程序,可以把linuxrc刪除,以節(jié)省空間,ln -s /sbin/init init
[root@RSM-2 rootfs]# ls
bin dev etc home lib init mnt root proc sbin sys tmp usr var
2.創(chuàng)建etc下的目錄文件
cd etc
cp -a /root/busybox-1.20.2/examples/bootfloppy/etc/* .
[root@RSM-2 etc]# ls
fstab init.d inittab profile
3.修改這些文件
修改inittab
原始文件:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:/bin/sh
::ctrlaltdel:/bin/umount -a -r
修改后:開機免登陸直接打開shell(前面數(shù)字代表行號)
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
修改后:開機需要登陸(前面數(shù)字代表行號)
::sysinit:/etc/init.d/rcS
::respawn:-/bin/login
::ctrlaltdel:/bin/umount -a -r
修改fstab
proc /proc proc defaults 0 0
none /var ramfs defaults 0 0
none /sys sysfs default 0 0
none /dev/pts devpts default 0 0
修改profile
# /etc/profile: system-wide .profile file for the Bourne shells
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=/lib:/usr/lib
/bin/hostname test
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[\u@\h \W]# '
echo "All done!" echo
4.修改/etc/init.d/rcS
echo "Starting rcS..."
echo "++ Mounting filesystem..."
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys
echo "++ Setting up mdev..."
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
mount -a
echo "++ Starting telnet daemon..."
telnetd -l /bin/sh
echo "++ Set network..."
/sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0
/sbin/ifconfig eth9 192.168.3.1
/sbin/ifconfig eth9 netmask 255.255.255.0
echo "rcS Complete"
5.從本機拷貝passwd、shadow、group文件。
[root@vm-dev etc]# cp /etc/passwd .
[root@vm-dev etc]# cp /etc/shadow .
[root@vm-dev etc]# cp /etc/group .
[root@vm-dev etc]# cp /etc/localtime .
echo "root::0:0:root:/root:/bin/sh" > /etc/passwd
echo "root:x:0:root" > /etc/group
echo "root:$1$3jZ93Mwq$oaeef6lWIuThavs8wD0Wh2:0:0:99999:7:::" > /etc/shadow
用戶名為root,密碼為123456。
6.拷貝交叉編譯器里***/lib/***.so庫(根據(jù)自己系統(tǒng)需要的)到/lib目錄下
[root@vm-dev lib]# cp ***/lib/***.so . -a
到此文件系統(tǒng)制作完
四、制作initramfs
刪除.config
cp linux-2.6.26/arch/mips/configs/xxxxx_config linux-2.6.26/.config
修改Makefile
ARCH=mips
CROSS_COMPILE=mipsel-linux-
步驟1.make menuconfig打開配置菜單
General setup-->選擇 Initial RAM filesystem and RAM disk...... ;[*] Compress ramdisk by lzma instead of gzip ,原因很簡單,我們使用的是initramfs,而不是ramdisk,所以不用配置ramdisk的驅(qū)動支持項Device Drivers-->Block devices-->RAM block device support 項,相應(yīng)的之后的(4096)Default RAM disk size kbytes等相關(guān)默認配置選項就不會再出現(xiàn)了。
另外initramfs技術(shù)和ramdisk技術(shù)的另一個重要的區(qū)別就是initramfs并不是在內(nèi)存中模擬出一個磁盤,所以也就不在需要ramdisk中所需的ext2驅(qū)動支持。所以,F(xiàn)ile systems菜單下的ext2文件系統(tǒng)支持< > Second extended fs support選項就可以取消了。
在這一步還有一個重要的區(qū)別就是需要在General setup-->Initial RAM filesystem and RAM disk...... 項的相關(guān)項(/root/rootfs) Initramfs source file(s)中填寫你要制作成initramfs格式的根文件系統(tǒng)目錄,在這里我要做的根文件系統(tǒng)的目錄是/root/rootfs。
步驟2.制作initramfs根文件系統(tǒng)
制作最小系統(tǒng)根文件系統(tǒng)的步驟和以前制作ramdisk根文件系統(tǒng)的步驟基本一致,這里只說明最后一步有何不同。
另外就是我們制作ramdisk根文件系統(tǒng)鏡像的時候使用的是genext2fs工具,在此我們制作initramfs根文件系統(tǒng)鏡像時,并不需要額外的步驟,而是在你編譯Linux內(nèi)核的時候就自動生成了。自動生成的initramfs根文件系統(tǒng)鏡像在Linux源碼樹的usr目錄下。名字叫initramfs_data.cpio.gz,它是gz格式的壓縮文件
這樣就有一個問題,在編譯可以使用initramfs啟動的內(nèi)核的時候,它的配置選項有一個相關(guān)項,就是要在(/root/rootfs) Initramfs source file(s)中填寫你要制作成initramfs格式的根文件系統(tǒng)目錄。這樣就要求我們在編譯內(nèi)核的時候,首先先把根文件系統(tǒng)做好。值得注意的是我們按照這個方法制作出來的內(nèi)核鏡像實際上比原來的大了許多,這是因為我們在做這一步的時候,實際上是將initramfs根文件系統(tǒng)直接合并到內(nèi)核鏡像里邊了。這樣,合二為一的鏡像就不再需要單獨燒寫根文件系統(tǒng)鏡像了,相應(yīng)的,啟動內(nèi)核時的參數(shù)就不需要添加initrd=……來指定initramfs的位置了。
步驟3.編譯安裝內(nèi)核
cd Linux 2.6.26
make modules_install INSTALL_MOD_PATH=/***/rootfs //生成 rootfs/lib/modules/2.6.26
步驟4.修改makefile編譯
objcopy 工具參數(shù)介紹
#使用 -O binary (或--out-target=binary) 輸出為原始的二進制文件
#使用 -R .note (或--remove-section) 輸出文件中不要.note這個section,縮小了文件尺寸
#使用 -S (或 --strip-all) 輸出文件中不要重定位信息和符號信息,縮小了文件尺寸
由于使用u-boot啟動,所以內(nèi)核要制作成uImage,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息,vmlinux是最原始的沒有經(jīng)過壓縮的內(nèi)核文件。
COMP=lzma(壓縮方式)p_w_picpath: mkp_w_picpath
$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S $(ROOTDIR)/$(LINUXDIR)/vmlinux $(KERNELZ)
cd $(IMAGEDIR) ; rm -f $(KERNELZ).*; $(COMP) -9 -f -S .$(COMP) $(KERNELZ)
cd $(IMAGEDIR) ; $(CUR_DIR)/mkp_w_picpath -A mips -O linux -T kernel -C $(COMP) -a 80000000 -e $(shell readelf -h $(ROOTDIR)/$(LINUXDIR)/vmlinux | grep "Entry" | awk '{print $$4}') -n "Linux Kernel Image" -d $(KERNELZ).$(COMP) $(IMAGE)
make以后生成的uImage就是initramfs啟動的文件系統(tǒng)
五、嵌入式Linux支持的文件系統(tǒng):
jffs2,yaffs,cramfs,ramdisk,ramfs
jffs2:用于NorFlash上,可讀寫,支持數(shù)據(jù)壓縮
yaffs2:用于NandFlash上,不支持數(shù)據(jù)壓縮,可讀寫
cramfs:既可以用于NorFlash上,又可以用于NandFlash上,只讀,支持數(shù)據(jù)壓縮
ramdisk:用一部分固定大小的內(nèi)存作為分區(qū)來使用,并非是一個實際的文件系統(tǒng),方便內(nèi)核啟動
NFS:文件系統(tǒng)在PC機上,通過網(wǎng)絡(luò)共享
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。