從零開始製作rootfs

2021-09-06 23:46:00 字數 3580 閱讀 1872

1、什麼是rootfs,為什麼需要rootfs?

核心啟動後會開啟三個程序,分別是:

程序0(idle程序),空閒程序,也就是死迴圈

程序1(init程序),掛載根檔案系統,並執行linuxrc這個應用程式從核心態轉為使用者態,開啟使用者態的程序1(init程序),逐步開啟其他程序

程序2(kthreadd程序)linux核心的守護程序,負責提供作業系統的核心功能(程序排程、記憶體管理、裝置管理、檔案體統)的實現 

總結根檔案系統的作用:

(1)init程序的應用程式(linuxrc)在根檔案系統上

(2)根檔案系統提供了根目錄/

(3)核心啟動後的應用層配置(etc目錄)在根檔案系統上。幾乎可以認為:發行版=核心+rootfs

(4)shell命令程式在根檔案系統上。譬如ls、cd等命令

(5)/lib目錄下的庫檔案等

所以:一套linux體系,只有核心本身是不能工作的,必須要rootfs

2、製作乙個最小根檔案系統

首先要明白映象格式的根檔案系統具有一定的格式,格式是內化的,我們這裡以ext2格式的為例

我們首先製作資料夾形式的根檔案系統,使用nfs掛載的方式來啟動,最後再將我們製作的資料夾格式的跟檔案系統使用mke2fs工具製作成ext2格式的映象檔案進行燒錄。

2.1、搭建nfs伺服器,自己的版本不同,搭建方法會有所差異,參考:《嵌入式開發環境搭建-基於14.04》

2.2、設定nfs啟動方式的bootargs:

root=/dev/nfs nfsroot=192.168.1.141:/root/fs/rootfs ip=192.168.1.20:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off  init=/linuxrc console=ttysac2,115200

2.3、在menuconfig中配置支援nfs啟動方式,參考《210支援nfs作為根檔案系統啟動》

實驗結果:掛載成功,執行/linuxrc(也就是busybox)成功,但是因為找不到/etc/init.d/rcs和/dev/tty2等檔案所以一直在列印錯誤提示資訊,但是其實有進入命令列。

2.5、新增乙個典型的inittab

上面的問題是因為shell程式在執行時需要執行時的配置環境,所以我們要為其提供/etc目錄下的執行時配置。

inittab的工作原理就是被/linuxrc(也就是busybox)執行時所呼叫起作用。

每一行的配置項都是由3個冒號分隔開的4個配置值共同確定的(有些配置值可以空缺)。這四個配置值就是id:runlevels:action:process。當滿足action的條件時就會執行process這個程式。

inittab檔案內容:略

實驗結果:成功進入命令列介面,但是提示rcs檔案找不到

2.6、新增/etc/init.d/rcs

改檔案是linux的執行時配置檔案中最重要的乙個,其他的一些配置都是由這個檔案引出來的。乙個複雜專案中配置項很多,會分為好幾類,rcs檔案會呼叫這些檔案幹活。

rcs檔案內容及解釋如下:

path=/sbin:/bin:/usr/sbin:/usr/bin

runlevel=s

prevlevel=n

umask 022 

export path runlevel prevlevel //這幾行定義了幾個「環境變數」

mount -a //掛載所有的應該被掛載的檔案系統(根據/etc/fstab檔案的格式)

//我們要自己提前建好fstab檔案中的空資料夾

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s //配合linux驅動生成相應的/dev目錄下的裝置檔案

/bin/hostname -f /etc/sysconfig/hostname //定義了主機名,可以在命令列中顯示

ifconfig eth0 192.168.1.20 //定義了ip位址,這兩行的內容都可以開機後指定

實驗結果:path runlevel prevlevel這幾行定義了幾個「環境變數」,可以成功列印出來,虛擬檔案系統掛在成功,裝置驅動檔案生成成功,但是命令列下hostname命令查到的host名字確實是aston210。但是問題就是命令列的提示符是沒有顯示的。

2.7、新增profile檔案

profile檔案也是被busybox(init程序)自動呼叫的,所以是認名字的。

實驗結果:命令列提示符前面顯示:[@aston210]#,登入使用者名稱沒顯示出來。原因就是我們直接進入了命令列而沒有做登入。

2.8、新增使用者登陸

之前intttab中有乙個配置項::askfirst:-/bin/sh,這個配置項作用就是當系統啟動後就去執行/bin/sh,執行這個就會出現命令列。因此我們這樣的安排就會直接進入命令列而不會出現登入介面。

我們要出現登入介面,就不能直接執行/bin/sh,而應該執行乙個負責出現登入介面並且負責管理使用者名稱和密碼的乙個程式,busybox中也整合了這個程式(就是/bin/login和/sbin/gettty),因此我們要在inittab中用/bin/login或者/sbin/getty去替代/bin/sh。(改為s3c2410_serial2::sysinit:/bin/login)

實驗結果:成功出現使用者登入介面,但是死活密碼不對。

2.9、設定使用者登入密碼

出現上述問題的原因在於我們並沒有設定密碼。

我們直接移植ubuntu裡的/etc/passwd和/etc/shadow檔案到當前製作的rootfs目錄下(passwd檔案中存放的是命名的設定,shadow中存放的是密碼的密文),然後再做修改即可,修改時注意一些細節要和我們的開發板對應,如/bin/bash改為/bin/sh。以及登陸後進入的目錄等。

移植後我們的使用者名稱和密碼就和我們的開發板上是一樣的,如果要修改密碼直接把shadow檔案中的密文刪除,然後登陸時就可以不用密碼直接進入,然後我們使用passwd root給root使用者設定密碼。

至此我們乙個最小的根檔案系統就完成了。專案中使用者登入使用getty會比較多,直接改為( s3c2410_serial2::sysinit:/sbin/getty -l s3c2410_serial2 115200 vt100)即可

3、製作映象形式的rootfs並燒錄執行

3.1、製作映象形式的rootfs

(1)新建乙個用於掛在的檔案這裡是ext2_rootfs,這裡的count值一定要夠用

dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240

losetup  /dev/loop1 rootfs.ext2

ke2fs -m 0 /dev/loop1 10240

mount -t ext2 /dev/loop1 ./ext2_rootfs/

(2)向ext2_rootfs中複製內容

(3)解除安裝

umount /dev/loop1

losetup -d /dev/loop1

看待rootfs.ext2則製作成功

3.2、設定合適的bootargs並燒錄映象

bootargs為:set bootargs console=ttysac2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2

從零開始製作留言板01

資料庫知識點 1 字串型別 常用 char固定長度 char列的長度固定為建立表時宣告的長度。長度可以為0到255的任何值 eg 5 假如錄入ab則後面會用空格補上但只顯示ab不顯示空格 varchar可變長度 varchar列中的值為可變長字串。長度可以指定為0到65535之間的值 eg varc...

Docker 從零開始製作基礎映象 centos

這裡有個統計,docker 官方和個人發布的映象由於版本等各種原因,漏洞較多,那我們如何自己從頭開始做個定製的映象呢?對,找官方文件 這裡說明的很清楚了 試驗如下 在centos7 機器上做 centos映象 直接參考這個指令碼 mkimage yum.sh y etc yum.conf cento...

Django 從零開始

方法1 pip install django 1.6.5 測試是否安裝成功 python import django 1,6,5,final 0 django 使用了 python 標準的 distutils 安裝法,在 linux 平台可能包括如下步驟 tar xzvf django tar.gz...