2012年11月28日 星期三

如何抓取 rootfs

如何抓取 rootfs

1. 使用 losetup 來掛載 arm.img 至 /mnt 目錄

2. 建立一個 rootfs 目錄

mkdir rootfs

3. 切換至 rootfs 目錄

cd rootfs

4. 複製 arm.img 中之 rootfs

rsync -av /mnt/* .

複製完畢後我們即可以開始進行 rootfs 瘦身,以利存入虛擬 SD card。

** 請注意,複製完畢後我們即可將 /mnt 解除掛載,以免不小心刪錯檔案 **

*** 弄清楚 cp 與 rsync 指令不同處 ? ***

5. rootfs 如何瘦身 ?

6. 壓縮 rootfs 以供之後使用

請在 rootfs 目錄中執行底下指令:

rootfs # tar cfva ../rootfs.tar.bz2 *

2012年11月21日 星期三

安裝 qemu arm 版 Debian Linux

在 Qemu 安裝 ARM 環境

準備

1. ARM iso 檔 - http://debian.nctu.edu.tw/debian-cd/6.0.6/armel/iso-cd/debian-6.0.6-armel-CD-1.iso

2. ARM installer 檔案
a. http://debian.nctu.edu.tw/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/initrd.gz
b. http://debian.nctu.edu.tw/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/vmlinuz-2.6.32-5-versatile

3. ARM 安裝 img 檔,自行建立,指令如下:

qemu-img create arm.img 1G

目錄配置:

~/qemu-arm/arm.img         
                /initrd.img-2.6.32-5-versatile
                /vmlinuz-2.6.32-5-versatile
                /install/initrd.gz
                /install/vmlinuz-2.6.32-5-versatile
                /install/debian-6.0.6-armel-CD-1.iso

執行安裝

請在 ~/qemu-arm 目錄執行底下指令:

qemu-system-arm -M versatilepb \
 -kernel ./install/vmlinuz-2.6.32-5-versatile \
 -initrd ./install/initrd.gz \
 -cdrom  ./install/debian-6.0.6-armel-CD-1.iso \
 -hda arm.img \
 -m 1024

請注意安裝流程中硬碟分割區只要一個即可。安裝完畢重新開機後會進入安裝畫面,請執原始指令終端機按 Ctrl+C 將 qemu中斷。接著我們可以萃取「正常開機核心」。

萃取「正常開機核心」。

安裝完後以 losetup 將 arm.img 掛載,然而複製 /boot 底下的

initrd.img-2.6.32-5-versatile
vmlinuz-2.6.32-5-versatile

出來,然後執行底下指令即可開機:

qemu-system-arm -M versatilepb -m 512 -boot c \
        -kernel vmlinuz-2.6.32-5-versatile \
        -initrd initrd.img-2.6.32-5-versatile \
        -hda arm.img \
        -append "root=/dev/sda1"

2012年11月12日 星期一

如何更換 IP ?


假設我們執行 Linux 時換主機啟動,由於網路鎖定網卡的關係無法連上網路,因此我們必須更換網卡 IP,其步驟如下:

1. 修改 /etc/network/interfaces 這個檔案,將舊主機的 IP 換成新主機的 IP
2. 將 /etc/udev/rules.d/70-persistent-net.rules 檔案刪除
3. 重開機

此時即可更換新 IP。

Q: 為何要刪 /etc/udev/rules.d/70-persistent-net.rules 檔案 ?
A: 因為此檔中有 eth0 的卡號設定,但是我們換主機後 eth0 的卡號也跟著換掉,因此新主機的網卡會變成 eth1,這樣會跟  /etc/network/interfaces 的設定不符。為了避免此問題,我們要將此檔刪除,讓 udev 在重新開機時自動再偵測一次。

觀看網路設定


要觀看網路設定請以 root 權限執行底下指令:

# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:24:1d:12:5c:c7
          inet addr:120.117.72.71  Bcast:120.117.72.127  Mask:255.255.255.128
          inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:54421646 errors:0 dropped:0 overruns:0 frame:0
          TX packets:39035331 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2028090082 (1.8 GiB)  TX bytes:403858794 (385.1 MiB)
          Interrupt:43 Base address:0xa000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3524016 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3524016 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:238745206 (227.6 MiB)  TX bytes:238745206 (227.6 MiB)

我們可以看到 eth0 及 lo 這兩個網路卡介面,其中 eth0 是我們真正連接至外部
網路之網路介面,而 lo 則為 loopback 裝置。從 eth0 的資料我們可以看到以下
資訊:

1. HWaddr       -> 網路卡卡號為 00:24:1d:12:5c:c7
2. inet addr    -> 我們所設定的網址為 120.117.72.71
3. Bcast        -> 區網廣播網址為 120.117.72.127
4. Mask         -> 子網路遮罩為 255.255.255.128
5. RX           -> Receive      (收封包)
   TX           -> Transmit     (傳封包)

至於 lo 之 inet addr 為 127.0.0.1,這個 IP 也就是表示自己的 IP。

2012年11月4日 星期日

期末上機考題

1. 架構嵌入式 Debian Linux 開發環境,包括可在 X86 平台上進行 Cross Compile 之 ARM tool chain。
2. 自行下載並安裝最新版本之 Qemu Linaro 版,以便使用 PC 平台模擬嵌入式 ARM 開發環境。

接下來是使用 Qemu 來進行嵌入式系統建構
3. 使用 Qemu 來安裝 Debian Linux,並使其能正常開機,我們將以此虛擬機器之 / 作為接下來之 rootfs。
4. 自行下載 Linux 3.2.XX 系列 Long Term Support 核心,並以 Beagle Board 為目標 (Target) 來編譯此核心。
5. 自行下載最新版之 U-boot,並
以 Beagle Board 為目標 (Target) 來編譯 U-boot。
6. 將第 3 至第 5 點之 bootloader、Linux Kernal 以及自定之 rootfs 整合至虛擬 SDCARD 中,並以 Qemu 開機。

接下來是使用 Devkit 800 來進行實際嵌入式系統開發
7. 承 4. 請以 Devkit 8000 為目標來編譯 Linux 核心。
8. 承 5. 請以 Devkit 8000 為目標來編譯 U-boot。
9. 請將 bootloader、Linux 核心以及 rootfs 放置至實體 SDCARD 中,其規劃如下:
    第1分割區:80 MB、FAT 16 or FAT 32 檔案系統。
    第2分割區:剩下空間(1GB 以上)、ext 3 檔案系統。
10. 請將實體 SDCARD 插入 Devkit 8000 之 SD 插槽中,並能以 SDCARD 開機。

2012年11月2日 星期五

Rootfs 的改造

Rootfs 的改造

1. 瘦身
Q. 那些檔案可以宰 ?

在  $ROOTFS 目錄下執行

du -sh *

以觀看每個目錄所佔空間。

$ROOTFS/usr/share/man    -> 清除 man manual
$ROOTFS/usr/share/doc    -> 沒人看的文件
$ROOTFS/usr/share/locale -> 語系設定檔 (翻譯檔),僅留 en_US (+ zh_TW) 即可。

請移除舊版核心模組,並複製新版核心模組至此目錄

$ROOTFS/lib/modules                     -> 舊核心之驅動程式模組目錄
$ROOTFS/lib/modules/2.6.32-5-versatile  -> 移除
$ROOTFS/lib/modules/3.2.30              -> 新增
$ROOTFS/boot                            -> 舊版核心檔案,請全部清掉

$ROOTFS/var     ->
$ROOTFS/var/log -> 日誌檔目錄,可完全清除
$ROOTFS/var/cache/apt 目錄有套件的快取資料,可清除

2. 複製新檔案回去

a. 複製新 Linux 核心模組
   (不需要放 Linux 核心,因為其核心檔案放置至 sdcard 之第 1 個分割區)

3. 加入我們想要的設定

a. $ROOTFS/etc/fstab

proc            /proc        proc    defaults           0   0
/dev/mmcblk0p2   /           auto   errors=remount-ro   0   1
/dev/mmcblk0p1   /boot       auto   defaults            0   0

b. $ROOTFS/etc/inittab
最後一行加上:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102

3. 複製至真正的 sdcard 中

請使用 fdisk 分割 sdcard (2 GB 以上),其中第 1 個分割區為 80 MB,剩下為第 2 個分割區。並依以下方式掛載:

/mnt/sdcard1 -> 第 1 個分割區,FAT 16/32 格式,有打開開機旗標。
/mnt/sdcard2 -> 第 2 個分割區,ext3 格式。

a. 複製核心、bootloader 及 uEnv.txt 至 /mnt/sdcard1,裡面內容如下:
-rwxr-xr-x 1 root root   45128 2012-10-30 22:19 MLO
-rwxr-xr-x 1 root root 1215711 2012-10-30 22:19 u-boot
-rwxr-xr-x 1 root root  294672 2012-10-30 22:19 u-boot.bin
-rwxr-xr-x 1 root root  294736 2012-10-30 22:19 u-boot.img
-rwxr-xr-x 1 root root       1 2012-10-30 23:29 uEnv.txt
-rwxr-xr-x 1 root root 2475616 2012-10-30 22:15 uImage


b. 複製 rootfs 至 /mnt/sdcard2,請使用 rsync 來複製

rsync -av $ROOTFS/* /mnt/sdcard2

4. 作完收工,可以至 devkit 8000 開機

minicom 使用說明

先前設定

minicom 是一個序列數據連線程式,可以拿來跟數據機連線,也可以拿來跟我們要使用的 ARM 板連線,要使用 minicom 請安裝 minicom 套件。

apt-get install minicom

當我們將 ARM 板連接線接至 USB 埠時,會出現一個新的裝置叫 /dev/ttyUSBN 的裝置,N 是數字,通常為 0,若連接第 2 次的話會變成 1。我們要將 /dev/ttyUSB0 連結至 /dev/modem:

ln -s /dev/ttyUSB0 /dev/modem

我們可以執行底下指令來確認:

ls -l /dev/ttyUSB0 /dev/modem

lrwxrwxrwx 1 root root        12 2012-11-01 10:44 /dev/modem -> /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 2012-11-01 10:39 /dev/ttyUSB0

請注意 /dev/ttyUSB0 的 owner 為 root,群組為 dialout,因此我們所使用的帳號必須要是 dialout 群組才可以對 ttyUSB0 進行操作。

Q1: 請問我如何查看我是否為 dialout 群組中的成員
A: id

uid=1000(herman) gid=1000(herman) groups=1000(herman),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(bluetooth),111(netdev)

Q2: 若我不是 dialout 群組中之成員,該如何加入 ?
A: 最簡單方式,直接編輯 /etc/group 檔案,將帳號輸入至 dialout 群組之後即可,修改完還必須重新登錄才行。加完後 /etc/group 檔案有關 dialout 群組之資訊如下所示:

dialout:x:20:herman


啟動 minicom

請以「一般使用者」權限執行:

minicom

此時會出現 minicom 畫面,我們要進行一下設定,請按

Ctrl+A o 叫出設定畫面,如以下所示:
===============================================================================
歡迎使用 minicom 2.4

選項: I18n
編譯於 Sep  5 2010, 09:23:03.
Port /dev/modem

按 CTRL-A Z 說明特殊鍵

                                               機   |
            +----[設定]----+
            | 檔名和路徑      |
            | 檔案傳輸協定     |
            | 序列埠設定      |
            | 數據機和撥接     |
            | 螢幕和鍵盤      |
            | 儲存設定為 dfl  |
            | 另存設定為..    |
            | 離開本畫面      |
            +------------+




 CTRL-A Z 說    明 |  115200 8N1   NOR Minicom 2.4    |   VT102           離線  
===============================================================================

請選擇「序列埠設定」將底下設定改為我們所要的參數:

A -    序 列  設 備       : /dev/modem
F - 硬  體  Flow  控  制  : 否                                             |  | G - 軟  體  Flow  控  制  : 否

修改完設定後,請按 \Enter 回到前一畫面,接著再選

「儲存設定為 dfl」

最後選「離開本畫面」即可準備連線。

2012年11月1日 星期四

目錄結構說明


視窗作業系統底下的目錄結構:

C:\

D:\

E:\

..

依此類推,其中 \ (backslash 又稱之為反斜線) 是指 C/D/E 最上層目錄。

但是所有的 Unix 最上層目錄為 / (slash 又稱之為斜線) 是指我們的根目錄。

目錄/檔案指令操作說明:


pwd -> 目前目錄

cd <目錄名稱> -> 切換至某個目錄,例如:

cd \Enter -> 切換至家目錄
~ -> 此目錄即為家目錄

cd / -> 切換至 / 目錄

ls -> 觀看目前目錄內容

ls -l -> 觀看目前目錄內容以及屬性,其輸出如下所示:

drwxr-xr-x   2 root root  4096 2012-09-18 10:32 bin
drwxr-xr-x   3 root root  4096 2012-10-08 09:43 boot
drwxr-xr-x  16 root root  3420 2012-10-28 06:47 dev
drwxr-xr-x 149 root root 12288 2012-10-29 04:42 etc
drwxr-xr-x   2 root root  4096 2012-03-28 16:33 hd2
drwxr-xr-x  65 root root  4096 2012-09-11 15:25 home
lrwxrwxrwx   1 root root    35 2011-04-25 10:18 initrd.img -> boot/initrd.img-2.6.32-5-686-bigmem
lrwxrwxrwx   1 root root    28 2011-04-21 19:25 initrd.img.old -> boot/initrd.img-2.6.32-5-686
drwxr-xr-x  14 root root 16384 2012-10-08 09:42 lib
drwx------   2 root root 16384 2011-04-21 19:21 lost+found
drwxr-xr-x   4 root root  4096 2011-04-21 19:21 media
drwxr-xr-x   2 root root  4096 2010-12-15 05:54 mnt
drwxr-xr-x  11 root root  4096 2011-12-01 14:47 opt
dr-xr-xr-x 138 root root     0 2012-09-10 08:40 proc
drwx------  33 root root  4096 2012-10-25 17:44 root
drwxr-xr-x   2 root root  4096 2012-10-08 09:42 sbin
drwxr-xr-x   2 root root  4096 2010-07-21 14:55 selinux
drwxr-xr-x   2 root root  4096 2011-04-21 19:22 srv
drwxr-xr-x  12 root root     0 2012-09-10 08:40 sys
drwxrwxrwt  14 root root  4096 2012-10-29 09:21 tmp
drwxr-xr-x  13 root root  4096 2012-04-25 15:56 usr
drwxr-xr-x  14 root root  4096 2011-06-23 19:40 var
lrwxrwxrwx   1 root root    32 2011-04-25 10:18 vmlinuz -> boot/vmlinuz-2.6.32-5-686-bigmem
lrwxrwxrwx   1 root root    25 2011-04-21 19:25 vmlinuz.old -> boot/vmlinuz-2.6.32-5-686


以 /bin 目錄來說,其輸出如下:

drwxr-xr-x   2 root root  4096 2012-09-18 10:32 bin
^^^^^^^^^^

上述標示處即為其屬性,以此例來說,第一個字元為 d 表示為目錄,之後

rwxr-xr-x 表示三種不同的存取權限,

rwxr-xr-x 第一個是 owner (檔案所有人),有可讀、可寫、可執行之權限
^^^
rwxr-xr-x 第二個是 groups (同一群組所有人),有可讀、不可寫、可執行之權限
   ^^^
rwxr-xr-x 第三個是 others (其它人),有可讀、不可寫、可執行之權限
      ^^^

另一個例子為 initrd.img 連結檔,其中出如下:

lrwxrwxrwx   1 root root    28 2011-04-21 19:25 initrd.img.old -> boot/initrd.img-2.6.32-5-686

其中第一個字元為 l 表示連結檔 (link file),其意義等同於 Windows 底下的捷徑,
這個檔案連結至 boot/initrd.img-2.6.32-5-686 這個檔案,
其餘屬性請自行參考上述說明。

C:\Programming Files\
C:\Windows

盡信書,不如無書

若資料可以在 cache 中找到,稱之為 hit,若找不到則稱為 miss。