您好,登錄后才能下訂單哦!
一、rootfs制作:
根文件系統是Linux啟動時使用的第一個文件系統,就像PC機上的文件目錄
1.創建根文件系統的目錄(目錄名隨便取)
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.創建設備文件
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”,靜態鏈接
更改Cross Compiler prefix 為(arm-linux-)
三、編譯安裝busybox
把相關的命令/文件拷貝到這個正在創建的文件系統
1.在busybox根目錄下
修改Makefile
ARCH=arm
CROSS_COMPILE=arm-linux-
make
make install
cp -rf _install/* rootfs
由于/root/rootfs/linuxrc 和/root/rootfs/sbin/init 是同一個程序,可以把linuxrc刪除,以節省空間,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.創建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(前面數字代表行號)
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
修改后:開機需要登陸(前面數字代表行號)
::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庫(根據自己系統需要的)到/lib目錄下
[root@vm-dev lib]# cp ***/lib/***.so . -a
到此文件系統制作完
四、制作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的驅動支持項Device Drivers-->Block devices-->RAM block device support 項,相應的之后的(4096)Default RAM disk size kbytes等相關默認配置選項就不會再出現了。
另外initramfs技術和ramdisk技術的另一個重要的區別就是initramfs并不是在內存中模擬出一個磁盤,所以也就不在需要ramdisk中所需的ext2驅動支持。所以,File systems菜單下的ext2文件系統支持< > Second extended fs support選項就可以取消了。
在這一步還有一個重要的區別就是需要在General setup-->Initial RAM filesystem and RAM disk...... 項的相關項(/root/rootfs) Initramfs source file(s)中填寫你要制作成initramfs格式的根文件系統目錄,在這里我要做的根文件系統的目錄是/root/rootfs。
步驟2.制作initramfs根文件系統
制作最小系統根文件系統的步驟和以前制作ramdisk根文件系統的步驟基本一致,這里只說明最后一步有何不同。
另外就是我們制作ramdisk根文件系統鏡像的時候使用的是genext2fs工具,在此我們制作initramfs根文件系統鏡像時,并不需要額外的步驟,而是在你編譯Linux內核的時候就自動生成了。自動生成的initramfs根文件系統鏡像在Linux源碼樹的usr目錄下。名字叫initramfs_data.cpio.gz,它是gz格式的壓縮文件
這樣就有一個問題,在編譯可以使用initramfs啟動的內核的時候,它的配置選項有一個相關項,就是要在(/root/rootfs) Initramfs source file(s)中填寫你要制作成initramfs格式的根文件系統目錄。這樣就要求我們在編譯內核的時候,首先先把根文件系統做好。值得注意的是我們按照這個方法制作出來的內核鏡像實際上比原來的大了許多,這是因為我們在做這一步的時候,實際上是將initramfs根文件系統直接合并到內核鏡像里邊了。這樣,合二為一的鏡像就不再需要單獨燒寫根文件系統鏡像了,相應的,啟動內核時的參數就不需要添加initrd=……來指定initramfs的位置了。
步驟3.編譯安裝內核
cd Linux 2.6.26
make modules_install INSTALL_MOD_PATH=/***/rootfs //生成 rootfs/lib/modules/2.6.26
步驟4.修改makefile編譯
objcopy 工具參數介紹
#使用 -O binary (或--out-target=binary) 輸出為原始的二進制文件
#使用 -R .note (或--remove-section) 輸出文件中不要.note這個section,縮小了文件尺寸
#使用 -S (或 --strip-all) 輸出文件中不要重定位信息和符號信息,縮小了文件尺寸
由于使用u-boot啟動,所以內核要制作成uImage,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息,vmlinux是最原始的沒有經過壓縮的內核文件。
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啟動的文件系統
五、嵌入式Linux支持的文件系統:
jffs2,yaffs,cramfs,ramdisk,ramfs
jffs2:用于NorFlash上,可讀寫,支持數據壓縮
yaffs2:用于NandFlash上,不支持數據壓縮,可讀寫
cramfs:既可以用于NorFlash上,又可以用于NandFlash上,只讀,支持數據壓縮
ramdisk:用一部分固定大小的內存作為分區來使用,并非是一個實際的文件系統,方便內核啟動
NFS:文件系統在PC機上,通過網絡共享
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。