1. 程式人生 > >使用Busybox'建立根目錄檔案系統以及製作ext2格式的映象

使用Busybox'建立根目錄檔案系統以及製作ext2格式的映象

1.第一步去busybox官網(點選開啟連結)下載最新版本的busybox,我使用的是1.24版本的。

2.修改busybox原始碼的Makefile 檔案:

ARCH = arm								  (架構)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-     (交叉編譯工具鏈的地址)
3.make menuconfig進行配置主要的配置專案如下
Busybox Settings--->

	Build Options--->
		[*]Build BusyBox as a static binary(no shared libs)
Busybox Library Tuning--->
	[*]vi-style line editing commands
	[*]Fancy shell prompts
Linux Module Utilities--->
	[ ]Simplified modutils
	[*]insmod
	[*]rmmod
	[*]lsmod
	[*]modprobe
	[*]depmod
Linux System Utilities--->[*]mdev
	[*]Support /etc/mdev.conf
	[*]Support subdirs/symlinks
	[*]Support regular expressions substitutions when renaming dev
	[*]Support command execution at device addition/removal
	[*]Support loading of firmwares
配置安裝路徑:
What kind of applet links to install (as soft-links)  --->
4.make進行編譯並且make install進行安裝。(如果make的時候出現錯誤並且錯誤並不是關鍵的地方那麼就找對應。c檔案所在的Kbuild中並看這個檔案與什麼配置相關,然後去make menuconfig中吧這個配置取消掉即可)(連結中有幾種問題的解決方案。http://www.cnblogs.com/softhal/p/5769121.html   http://blog.csdn.net/leon1741/article/details/54838924)

5.make install之後就可以看到對應路徑中有_install資料夾中有
/bin  /linuxrc  /sbin  /usr四個資料夾。這時候去開發板中掛載執行的話會發現雖然能夠啟動並且輸出命令列,但是會一直提示無法開啟tty裝置檔案等問題。

6.建立/etc資料夾並建立inittab檔案。
這個檔案很重要,通過這個檔案可以設定linux開機後要做什麼事情。具體的描述請看另一個文章。/etc/inittab檔案詳解

我在自己的實驗中寫入的內容如下

#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
7.由於inittab中第一句會執行/etc/init.d/rcS檔案所以需要創建出這個檔案
/etc/init.d/rcS檔案詳解

我在這個檔案中寫入的簡單內容如下
#!/bin/sh
	PATH=/sbin:/bin:/usr/sbin:/usr/bin		//配置環境變數:可以不用通過全路徑而直接使用程式名稱
	runlevel=S					//設定系統執行在何種狀態下
	prevlevel=N
	umask 022	//許可權的基本碼-umask(遮蔽位),資料夾的基本碼(777),檔案的基本碼(666)umask的值在檔案中有設定,預設情況下是022
	export PATH runlevel prevlevel
	mount -a					//掛載所有的虛擬檔案系統 
	echo /sbin/mdev > /proc/sys/kernel/hotplug	//udev和mdev和linux裝置驅動相關。
	mdev -s
	/bin/hostname -F /etc/sysconfig/HOSTNAME	//設定主機名稱
	ifconfig eth0 192.168.1.10			//設定ip地址非常重要,一定要跟伺服器的地址再同一個網段

8.此時用這個根檔案去執行時會出現以下錯誤

mount: mounting proc on /proc failed: No such file or directory
mount: mounting sysfs on /sys failed: No such file or directory
mount: mounting tmpfs on /var failed: No such file or directory
mount: mounting tmpfs on /tmp failed: No such file or directory
mount: mounting tmpfs on /dev failed: No such file or directory

那是因為/etc/init.d/rcS這個檔案中的mount -a被執行時是去掛載所有的應該被掛載的檔案系統,在busybox中mount -a時busybox會去查詢一個檔案/etc/fstab檔案,這個檔案按照一定的格式列出來所有應該被掛載的檔案系統(包括了虛擬檔案系統)簡單的內容如下(一般不用改)

# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# 	<file system> 	<mount point> 	<type> 	<options> 	<dump> 	<pass>
	proc 			/proc 			proc 	defaults 	0 		0
	sysfs 			/sys 			sysfs 	defaults 	0 		0
	tmpfs 			/var 			tmpfs 	defaults 	0 		0
	tmpfs 			/tmp 			tmpfs 	defaults 	0 		0
	tmpfs 			/dev 			tmpfs 	defaults 	0 		0
9.此時用這個根檔案去執行會出現錯誤如下

hostname: can't open '/etc/sysconfig/HOSTNAME': No such file or directory

那是因為在rcS檔案中會執行/bin/hostname -F /etc/sysconfig/HOSTNAME來為這臺機子命名一個名字。而名字是從/etc/sysconfig/HOSTNAME這個檔案中來的。所以需要去建立這個檔案。然後直接寫入你想要命名的名字即可

10.此時就不會出現任何非錯誤資訊了,但是會發現剛才寫入的hostname好像沒用似的,並不會出現在命令列的最前面,這是因為我們沒有給busybox一個顯示命令列最前面字元的格式檔案。這個檔案的路徑是/etc/profile一個簡單的profile的內容如下

# Ash profile
# vim: syntax=sh

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

USER="`id -un`"
LOGNAME=$USER
PS1='[\[email protected]\h \W]\# '
PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH

放入這個個檔案之後就能夠在命令列的最前方看到hostname了。

11.使用者登入實現。

這個功能就需要涉及到之前提到的inittab檔案了

(1)因為我們之前intttab中有一個配置項 ::askfirst:-/bin/sh,這個配置項作用就是當系統啟動後就去執行/bin/sh,執行這個就會出現命令列。因此我們這樣的安排就會直接進入命令列而不會出現登入介面。所以我們要出現登入介面,就不能直接執行/bin/sh,而應該執行一個負責出現登入介面並且負責管理使用者名稱和密碼的一個程式,busybox中也集成了這個程式(就是/bin/login和/sbin/gettty),因此我們要在inittab中用/bin/login或者/sbin/getty去替代/bin/sh。

12.使用者名稱和密碼的設定

(1)使用者名稱和密碼的設定是和登入程式有關聯的,但是/bin/login和/sbin/getty在使用者名稱和密碼的管理上是一樣的。其實常見的所有的linux系統的使用者名稱和密碼的管理幾乎都是一樣的。

(2)密碼一般都是用加密文字的,而不是用明文。意思就是系統中的密碼肯定是在系統中的一個專門用來存密碼的檔案中儲存的,用明文存密碼有風險,因此linux系統都是用密文來儲存密碼的。linux系統中用來描述使用者名稱和密碼的檔案是passwd和shadow檔案,這兩個檔案都在etc目錄下。passwd檔案中儲存的是使用者的密碼設定,shadow檔案中儲存的是加密後的密碼。

(3)我們直接複製ubuntu系統中的/etc/passwd和/etc/shadow檔案到當前製作的rootfs目錄下,然後再做修改即可。

(4)busybox中因為沒有普通使用者,所以做法是:預設root使用者如果加密口令是空的則預設無密碼直接登入。等我們登陸了之後還是可以用passwd root給root使用者設定密碼

(5)注意事項:

  1. 但是實際上用的時候我發現使用/sbin/getty是會有問題的。但是換成/bin/login就可以正常使用了。
  2. 由於/etc/passwd檔案是從ubuntu中複製過來的所以檔案中的語句是在登陸之後去執行的是root:x:0:0:root:/root:/bin/sh由此可知當輸入正確的密碼正確登陸之後回去執行bash開啟命令列,但是很可惜busybox中並沒有支援bash而只有sh所以要將bash更改成sh才能正常使用。

13.動態連結庫的拷貝

在busybox生成的根檔案系統中有很多動態共享庫是沒有的,這樣會導致一個問題就是明明在ubuntu中用交叉編譯工具動態連結鏈編譯成功的可執行檔案到了機子上執行會提示缺少檔案,只有將可執行檔案編譯成靜態連結的可執行檔案才能正常使用。

這裡的原因其實就是因為根檔案系統中的/lib中的動態連結檔案缺少造成的所以我們需要將交叉編譯工具鏈中的動態連結庫複製到根檔案系統中才可以。

  1. 編譯靜態連結檔案指令arm-linux-gcc hello.c -o hello_satic -static(其實就是在最後加-static)
  2. 我用的arm-2009q3這個交叉編譯工具鏈的動態連結庫在/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib目錄下。其他的一些交叉編譯工具鏈中動態連結庫的目錄不一定在這裡,要去找一下。
  3. 複製動態連結庫到/lib目錄(這個目錄需要自己建立)下。複製時要注意引數用-rdf,主要目的就是符號連結複製過來還是符號連結。

14.使用strip工具去掉庫中符號資訊

動態連結庫so檔案中包含了除錯符號資訊,這些符號資訊在執行時是沒用的(除錯時用的),這些符號會佔用一定空間。在傳統的嵌入式系統中flash空間是有限的,為了節省空間常常把這些符號資訊去掉。這樣節省空間並且不影響執行。

去掉符號命令:arm-linux-strip *so*

實際操作後發現庫檔案由3.8M變成了3.0M,節省了0.8M的空間。


15、修改rcS實現開機自啟動

(1)開機自啟動指的是讓一些應用程式能夠開機後自動執行

(2)開機自啟動的實現原理就是在開機會自動執行的指令碼rcS中新增上執行某個程式的語句程式碼即可

16.製作ext2格式的映象並燒錄啟動

  1. dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240//rootfs.ext2指的是創建出來後的ext格式的根檔案系統檔名稱。bs指的是block size count指的是使用多少個block也就是說由bs乘以count來決定ext檔案的大小這裡為了方便直接使用10M大小。
    losetup  /dev/loop1 rootfs.ext2//這裡的rootfs.ext2名稱要與第一行相同,
    mke2fs -m 0 /dev/loop1 10240//這裡的count大小10240要與第一行相同
    mount -t ext2 /dev/loop1 ./ext2_rootfs///ext2_rootfs這個資料夾是指ext格式根檔案系統掛載的資料夾。可以隨便命名
  2. 向./ext2_rootfs(被掛載的資料夾)中複製我們已經建立好的根檔案系統,用cp ../rootfs/* ./ -rf
  3. umount /dev/loop1//取消掛載,取消掛載後我們複製進去的根檔案系統就已經存在於.ext檔案中了。
    losetup -d /dev/loop1
  4. 完成後得到的rootfs.ext2就是我們做好的rootfs映象。拿去燒錄即可。

相關推薦

使用Busybox'建立根目錄檔案系統以及製作ext2格式映象

1.第一步去busybox官網(點選開啟連結)下載最新版本的busybox,我使用的是1.24版本的。 2.修改busybox原始碼的Makefile 檔案: ARCH = arm (架構) CROSS_COMPILE = /usr/local/arm/

kubernetes高階之建立只讀檔案系統以及只讀asp.net core容器

系列目錄 使用docker建立只讀檔案系統 容器化部署對應用的運維帶來了極大的方便,同時也帶來一些新的安全問題需要考慮.比如黑客入侵到容器內,對容器內的系統級別或者應用級別檔案進行修改,會造成難以估量的損失.(比如修改hosts檔案導致dns解析異常,修改web資源導致網站被嵌入廣告,後端邏輯被更改導致許

DOCKER學習_010:Docker的檔案系統以及製作映象

一 檔案系統簡介 1.1 Linux檔案系統 LInux空間組成分為核心空間和使用者空間(使用rootfs) linux檔案系統由 bootes和 rootfs組成, bootes主要包含boot1 oader和 kernel, bootloader主要是引導載入 kernel,當 kernel被載入到記憶體

cramfs檔案系統製作以及移植

[ [email protected] yangzheng ]# boot NANDread: device 0 offset 0x100000, size 0x27d800  2611200 bytes read: OK ##Booting kernel from Legacy Image at

busybox的安裝和配置/最小根檔案系統製作

1.瞭解uImage和zImage: linux核心經過編譯後會生成一個elf格式的可執行程式,叫做vmlinux或vmlinuz,這個是原始的未經任何處理加工的原版核心elf檔案,嵌入式系統部署時燒錄一般不是這個vmlinux,而是要用objcopy工具去製

jffs2檔案系統製作以及移植

[ [email protected] yangzheng ]# boot NANDread: device 0 offset 0x100000, size 0x27c800  2607104 bytes read: OK ##Booting kernel from Legacy Image a

linux的檔案系統以及使用者組等概念

一、Linux檔案結構及基本資料夾 目錄 描述 / 根目錄 /bin 做為基礎系統所需要的最基礎的命令就是放在這裡。比如 ls、cp、mkdir等命令;功能和

Ubuntu下建立XFS檔案系統的LVM

[email protected]:~# fdisk -lDisk /dev/sdb: 605 GiB, 649613803520 bytes, 1268776960 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/p

Docker 檔案系統以及啟動容器的檔案系統變化

轉載自如下連結 http://www.widuu.com/archives/10/1230.html 本文主要介紹一下 Docker 基礎的東西,先介紹一下我的實現環境: 1. windows 10 正式版 1. Docker Toolbox 1. Docker v

initramfs檔案系統製作和移植

  initramfs檔案系統——基於RAM的檔案系統 initramfs在編譯核心的同時被編譯並與核心生成一個映像檔案,可以壓縮也可以不壓縮,但是目前只支援cpio包格式。它是根檔案系統製作和製作的一種非常簡單的方法,由於initramfs使用cpio包格式,所以很容易

如何建立網路檔案系統_檔案儲存服務

Amazon Web Services 誠聘精英。 Amazon Web Services (AWS) 是 Amazon.com 的一個充滿活力、不斷壯大的業務部門。我們現誠聘軟體開發工程師、產品經理、客戶經理、解決方案架構師、支援工程師、系統工程師以及設計師等人才。請訪問我

檔案系統以及硬碟分割槽概念

更多內容:本人部落格 檔案系統和硬碟分割槽基本概念介紹 檔案系統:是作業系統用於明確儲存裝置(常見的是磁碟,也有基於NAND Flash的固態硬碟)或分割槽上的檔案的方法和資料結構;即在儲存裝置上組織檔案的方法。 從系統角度來看,檔案系統是對檔案儲存裝置的

linux-2.6.21核心中建立jffs2檔案系統(mtd分割槽的使用)

本文主要介紹如何在AT91SAM9261EK板子上製作和使用jffs2檔案系統,使用的是linux-2.6.21核心。 首先配置MTD $ make menuconfig 進入 Memory Technology Devices (MTD)

VMware安裝Linux,出現錯誤-未找到要在其中建立檔案系統的有效裝置

問題:         VMware裡安裝RedHat Linux時出現:出現錯誤-未找到要在其中建立新檔案系統的有效裝置。請檢查您的硬體以找到問題的起因。 原因:         VM預設硬碟是SCSI硬碟(安裝VMware安裝的時候選擇Custom安裝是可以選擇),而SC

檔案製作(一):根檔案系統樹 和 Initramfs檔案系統製作

 根檔案系統樹製作 首先要明白的是“什麼是檔案系統”,檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制。 這種機制有利於使用者和作業系統的互動。 根檔案系統之所以在前面加一個”根“,說明它是載入其它檔案系統的”根“,既然是根的話,那麼如果沒有這個根,其它的檔案

Linux重新計算根目錄檔案系統大小

Linux系統通過LVM擴大邏輯卷磁碟空間之後,需要重新計算相關目錄檔案系統大小。在增加檔案系統空間時,需要針對不同的檔案系統格式採用不同的方式。 由於CentOS6和CentOS7在預設根檔案系統的檔案系統格式存在差異,需要判斷檔案系統格式是否為xfs,如果

Linux檔案系統以及目錄結構簡介

Linux和Windows作業系統中的檔案系統些不同,在學習使用Linux之前,能夠了解這個不同之處助於後續的學習。本文先對Windows和Linux上面檔案系統的一些概念進行區分,然後介紹一些Linux檔案系統相關的原理,最後較為詳細地介紹了Linux系統的目

Yaffs2檔案系統製作和mkdosfs等命令工具的增加

2.1移植環境     核心版本:Linux-2.6.22.6;交叉編譯器版本:gcc-3.4.5-glibc-2.3.6;作業系統平臺:Ubuntu14;開發板平臺:S3C2440A;使用的工具:B

在NAND FLASH上建立YAFFS2檔案系統

針對於flash的檔案系統有很多,據我瞭解有jffs(1,2,3),yaffs(1,2)。還有商業的三星開發的RFS(健壯檔案系統),專門針對三星自己的nand和onenand,從底層驅動到上層檔案系統一條龍服務,而且號稱和fat格式100%相容。當時看得我直流口水,心裡把三星恨的咬牙切齒。 下面主要介紹一下

MIDI檔案介紹以及和raw格式的區別

一、MIDI是什麼? MIDI是英語Music Instrument Digital Interface 的縮寫,翻譯過來就是“數字化樂器介面”,也就是說它的真正涵義是一個供不同裝置進行訊號傳輸的介面的名稱。我們如今的MIDI音樂製作全都要靠這個介面,在這個介面之間傳送的資訊