經過busybox製做根文件系統能夠自定義選項,在製做的根文件系統中添加須要的命令,指定生成的根文件系統到相應的目錄下。linux
一. 根文件系統的獲取方式--->官網:shell
https://busybox.net/downloads/網絡
二. 使用busybox製做根文件系統架構
第一步 生成基本命令工具
1. 解壓 【 tar -xvf busybox-1.30.0.tar.bz2 】this
2. 配置交叉編譯工具 打開busybox的頂層目錄spa
(1) Vi Makefile.net
(2) 修改內容: (不修改內容編譯時就要指定這兩個變量的值,如 make ARCH=arm CROSS_COMPILE=arm-linux-)命令行
164行 CROSS_COMPILE ?= 改成:CROSS_COMPILE ?= arm-linux- 190行 ARCH ?= $(SUBARCH) 改成:ARCH ?= arm
表示修改交叉工具鏈爲arm-linux- 架構支持arm架構3d
3. 默認配置:導出配置文件【 make defconfig 】
或者指定輸出目錄 make defconfig O=../output 指定的輸出目錄output須要本身事先建立
4. 自定義選項配置 圖形化配置界面 啓動命令:【 make menuconfig 】
(1)添加 insmod rmmod modinfo等命令,在配置界面中找到「Linux Module Utilities」而後選中相應的命令
(2) 配置工具生成到指定的目錄
Busybox Setting -------->
Installation Options ("make install" behavior) --->
(./_install) BusyBox installation prefix
5. 編譯
$ make 或者 make all -j4 V=1 PC機下linux中多核編譯
$ make install
6. 清除編譯過程的文件及配置
【make clean 】 清除 .o .bin 文件
【make mrproper】 清除 .o .bin 配置文件
【make distclean】 清除 .o .bin 配置文件
第二步 構建基礎文件和目錄 -- 根文件系統製做
2. 在_install目錄下建立根文件系統所須要的目錄: _install $ mkdir dev etc home lib mnt proc root sys tmp var -p
3. 在建立的根文件系統的 etc目錄下建立inittab文件:_install $ touch etc/inittab
#this is run first except when booting in single-user mode. ::sysinit:/etc/init.d/rcS # /bin/sh invocations on selected ttys ::respawn:-/bin/sh # 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 ::shutdown:/sbin/swapoff -a
4. 繼續建立目錄及文件以下:
(1) _install $ mkdir etc/init.d/ -p
(2) _install $ touch etc/init.d/rcS
(3) _install $ gedit etc/init.d/rcS 在此文件內添加內容以下
#!/bin/sh #This is the first script called by init process /bin/mount -a echo /sbin/mdev>/proc/sys/kernel/hotplug mdev -s
5. _install $ touch etc/fstab
_install $ gedit etc/fstab 文件中添加內容以下:
#device mount-point type options dump fsck order proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
6. _install $ touch etc/profile
_install $ gedit etc/profile 文件中添加內容以下:
#!/bin/sh export HOSTNAME=farsight export USER=root export HOME=root export PS1="[$USER@$HOSTNAME \W]\# " #export PS1="[\[\033[01;32m\]$USER@\[\033[00m\]\[\033[01;34m\]$HOSTNAME\[\033[00m\ \W]\$ " PATH=/bin:/sbin:/usr/bin:/usr/sbin LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH export PATH LD_LIBRARY_PATH
7. 添加動態庫支持 // 查看命令在哪一個目錄下面 which arm-none-linux-gnueabi-gcc
(1) 查看命令依賴的庫文件 :arm-none-linux-gnueabi-readelf -d /bin/ls
(2) _install $ cp /opt/gcc-4.9.4/arm-none-linux-gnueabi/sysroot/lib/* lib -ra 表示把相應目錄下的全部文件拷貝到製做的根文件系統的 lib目錄下
(3) 爲了減小體積刪除靜態庫 _install/lib $ rm lib/*.a
(4) 剝離動態庫的調試信息,符號表等等 du -h 查看文件大小;瘦身_install/lib $ arm-linux-strip * 注意操做的目錄;若是沒有權限把全部的文件權限修改 chmod 777 *
而後把製做的根文件系統目錄壓縮便可,並修改權限
8. 經過 eMMC 掛載根文件系統
首先(使用SD卡啓動uboot)經過網絡掛載根文件系統,經過tftp服務把uboot和linux內核鏡像分別下載到內存0x41000000地址處而後經過mmc命令把uboot和linux內核鏡像燒寫到eMMC中,把剩餘的部分分區設置爲根文件系統使用。
Uboot下操做:基於s5p6818 移植
在uboot命令行下把tftp 0x41000000 win-uboot.bin ----> mmc dev 2----> mmc write 0x41000000 0 0x300 把0x41000000地址處寫入eMMc中從第0塊開始寫,寫入0x300塊;接着在把內核鏡像燒寫到eMMC中,步驟如上,只是下載和燒寫的是uImage。(dev 2表示切換到emmc下,dev 0 表示切換到SD下)
啓動系統後操做:
(1)先進入系統後使用分區命令: fdisk /dev/mmcblk0 表示把emmc分區
(2)格式化分區:mkfs.ext2 /dev/mmcblk0p1 # 格式化分區爲ext2類型文件系統
(3)目標板掛載文件系統到 /mnt :mount -t ext2 /dev/mmcblk0p1 /mnt
(4)把製做的根文件系統拷到nfs目錄下,而後在目標板上把製做的根文件系統壓縮包拷貝到掛載點處
(5)解除掛載:umount /mnt
(6)設置uboot的bootargs啓動參數
set bootargs 「root=/dev/mmcblk0p1 rw rootfstype=ext2 init=/linuxrc console=ttySAC0,115200 ip=192.168.3.132」 # 最後的ip爲宿主機ip
(7)設置啓動地址:
set bootcmd "mmc dev 2;mmc read 0x41000000 500 3000; bootm 0x41000000"
(8)啓動開發板 掛載成功
****************************************************************************************************************************
*****************************************************************************************************************************
*****************************************************************************************************************************
ramdisk 製做cramfs (只讀文件系統)
1. 按照給的 Makefile 文件製做 ramdisk.img
2. 修改內核配置 make menuconfig
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(16) Default number of RAM disks
(51200) Default RAM disk size (kbytes)
$ make uImage
$ cp arch/arm/boot/uImage ~/tftpboot
3. FS6818# set bootcmd "tftp 0x41000000 uImage;tftp 0x42000000 ramdisk.img; bootm 0x41000000 0x42000000"
FS6818# set bootargs "root=/dev/ram rw initrd=0x42000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200"
經過 fatload 獲取 uImage ramdisk.img
1. uboot 也支持文件系統 能夠識別 vfat 文件系統
2. FS6818# set bootargs "root=/dev/ram rw initrd=0x42000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200"
FS6818# set bootcmd "fatload mmc 0 0x41000000 uImage;fatload mmc 0 0x42000000 ramdisk.img; bootm 41000000 42000000"
1. 啓動linux內核 進入命令行(正常掛載根文件系統)
2. fdisk /dev/mmcblk1 分區命令
3. Command (m for help): n
4. Partition number (1-4): 1
5. First cylinder (1-241152, default 1): 600
6. Last cylinder or +size or +sizeM or +sizeK (600-241152, default 241152): 241152
7. Command (m for help): w
8. mkfs.vfat /dev/mmcblk1p1
9. mount -t vfat /dev/mmcblk1p1 /mnt/
10. cp ramdisk.img uImage /mnt/
11. sync
12. umount /mnt/
以上 命令 都是在 開發板 linux 內核中 執行
1. 重啓開發板 進入 uboot 命令行 配置uboot 環境變量
FS6818# set bootargs "root=/dev/ram rw initrd=0x42000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200"
FS6818# set bootcmd "fatload mmc 0 0x41000000 uImage;fatload mmc 0 0x42000000 ramdisk.img; bootm 41000000 42000000"
2. 執行 boot 命令,開始解析 bootcmd 環境變量
FS6818# boot