用busybox搭建最簡單的Linux檔案系統
最近自己也用busybox製作了一個ramdisk的檔案系統,並還用mkimage工具做成了ramdisk-uboot.img,掛載到三星4412的板子上跑了起來。中途出了很多問題:
1、ramdisk的檔案系統核心載入時說ramdisk format wrong,看用fastboot燒錄的時候ramdisk的格式是ramdisk-uboot.img,於是又編譯u-boot原始碼,在tools目錄下生成了mkimage工具,再把他拷貝到/usr/bin目錄下,利用一下命令生成ramdisk-uboot.img:
mkimage -A arm -O linux -T ramdisk -C none -a 0x40008000 -n "ramdisk" -d ramdisk.img ramdisk-uboot.img
2、u-oot啟動引數bootargs和bootcmd的設定
在這裡折騰了好久,要麼啟動不了,要麼,啟動了,然後不停的重複載入核心。
我以為是核心的問題,在公司的伺服器上下載了核心原始碼,放到公司的伺服器上去編譯,make menuconfig又用不了,說缺少檔案,但缺少的什麼makefile就在哪裡,我又放到自己的虛擬機器裡面編,好像有的地方要用sudo來執行,可能在伺服器上用不了sudo,所以編不了。
其實核心裡面make menuconfig只需要設定Devices Drivers——【*】Block devices——<*>RAM block device support,只要核心支援ramdisk檔案系統就行,當然還有可能核心預設的ramdisk的大小太小了,你的ramdisk超過了,也可能出問題,我的ramdisk大小超不多2M,核心預設的是8M,所以夠用,核心是沒問題的。
那就只可能是u-boot的啟動引數設定了,經過不斷的嘗試,最後得出這樣的設定才能有效:
setenv bootargs root=/dev/ram rw init=/linuxrc console=ttySAC2,115200n8
saveenv
setbootcmd setddrV 77;movi r k 0 40008000;movi r rootfs 0 41000000 300000;bootm 40008000 41000000
這個bootcmd只能臨時設定起效,要想徹底修改,得修改u-boot原始碼中的smdk4412.h檔案,再編譯後生成u-boot.bin。
在這裡其中movi r rootfs 0 41000000 300000引數最開始最後面的引數是100000,也就是載入的檔案系統是1M,但是我的檔案系統大於1M,所以老是載入不起來,核心不斷重啟,改成3M後就好了。
這裡,這篇轉載的文章還是極具參考意義的,至於我的詳細製作過程,有時間再整理出來。
Linux檔案系統不僅包含著檔案中的資料而且還有檔案系統的結構,所有Linux使用者和程式看到的檔案、目錄、軟連線及檔案保護資訊等都儲存在其中。有了檔案系統,使用者就可以很方便的和Linux裝置進行資料互動了。 隨著實際需求的不斷提高,Linux檔案系統也變得越來越龐大。無論它如何千變萬化,歸根結底,都是基於最基本的linux檔案系統不斷豐富而來。因此,我們完全有必要了解最基本的檔案系統的搭建過程,更加複雜的檔案系統可以舉一反三,各個擊破,真正做到一通百通。下面我們將逐步講解最簡單的linux檔案系統的製作方法。 第一步:在ubuntu的使用者目錄下新建一個檔案系統的總目錄,如rootfs_x4412:- mkdir rootfs_x4412
-
CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
- ARCH ?= arm
在busybox根目錄下執行make menuconig配置busybox:
進入Busybox Settings目錄,
再進入Build Options目錄,
-
make
- make install
- arm-none-linux-gnueabi-readelf -d busybox
- There is no dynamic section in this file.
-
PATH=/usr/local/arm/arm-2009q3/bin:$PATH
- export PATH
- source ~/.bashrc
-
cp -a _install/bin ../rootfs_x4412
- cp -a _install/sbin ../rootfs_x4412
- mkdir dev etc lib mnt proc sys tmp usr var
-
cd etc
-
mkdir init.d
-
cd init.d
-
touch rcS
- chmod 777 rcS
-
#!/bin/sh
-
/bin/mount -a #mount all stuff from /etc/fstab
-
/sbin/ifconfig eth0 192.168.1.15 up #開機自動設定eth0的IP地址
- /sbin/ifconfig eth1 192.168.1.16 up #開機自動設定eth1的IP地址
- none /proc proc defaults 0 0
-
#!/bin/sh
-
/bin/mount -t proc proc /proc
-
/bin/mount -t sysfs sysfs /sys
-
/sbin/mdev -s
- exec /sbin/init
- mdev: /etc/mdev.conf: No such file or directory
- touch mdev.conf
-
mknod console c 5 1
-
mknod null c 1 3
-
mknod /dev/tty2 c 4 2
-
mknod /dev/tty3 c 4 3
- mknod /dev/tty4 c 4 4
- mkdir -p rootfs_tmp
- dd if=/dev/zero of=rootfs.ext4 bs=1024 count=12288
- mkfs.ext4 rootfs.ext4
- sudo mount -o loop rootfs.ext4 ./rootfs_tmp
- cp rootfs_x4412/* ./rootfs_tmp -ar
- sudo umount ./rootfs_tmp
執行到如下語句,說明檔案系統已經掛載起來了。
- Please press enter to activate this console
-
# Description : Build linux filesystem Script.
-
# Authors : lqm
-
# Version : 0.01
-
# Notes : None
-
#
-
# must root user
-
echo "making ext4 rootfs now,wait a moment..."
-
if [ -d rootfs_tmp ]; then
-
rm -rf rootfs_tmp
-
fi
-
if [ -f rootfs.ext4 ]; then
-
rm -rf rootfs.ext4
-
fi
-
mkdir -p rootfs_tmp
-
dd if=/dev/zero of=rootfs.ext4 bs=1024 count=12288
-
mkfs.ext4 rootfs.ext4
-
mount -o loop rootfs.ext4 ./rootfs_tmp
-
cp ./rootfs_x4412/* ./rootfs_tmp -ar
-
umount ./rootfs_tmp
-
rm -rf rootfs_tmp
- echo "^_^ make x4412 rootfs.ext4 successful!"
博主的還有利用buildroot製作檔案系統也值得一試呀。
另外製作好的ramdisk-uboot.img的檔案系統也是可以解包、編輯後,再打包成ramdisk-uboot.img的。