如何抓取 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月28日 星期三
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"
準備
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 開機。
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 開機
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」
最後選「離開本畫面」即可準備連線。
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。
2012年10月29日 星期一
如何使用 Xcircuit
1. 放大/縮小:Z/z
2. 增加格點間隔:Shift + =
減少格點間隔:-
3. 畫線工具:
滑鼠左鍵:增加轉折點
滑鼠右鍵:刪除轉折點
滑鼠中鍵:結束目前所畫線段(確定目前所畫線段)
4. 點選元件:
方法一、在沒有畫圖的情況下將滑鼠遊標移至要點選的圖案上,再按滑鼠中鍵
方法二、在沒有畫圖的情況下將按滑鼠中鍵拖曳出一個方框,方框中的元件皆
會被選取
5. 複製元件:
先點選元件,再按 c 複製元件,接著按滑鼠左鍵貼上元件(蓋印章),
若按滑鼠中鍵則只貼上一次,滑鼠右鍵取消目前行動。
6. 刪除元件:
先點選元件,再按 Del 鍵即可將被點選之元件刪除。
7. 移動元件:
先點選元件,再按滑鼠左鍵拖曳即可移動元件。
8. 再次編輯元件:
先點選元件,再按 e 即可再次編輯元件
9. 移動畫面:
上/下/左/右鍵可以移動畫面
10. 置中畫面:
將滑鼠移到要置中的地方,然後按 p
11. 畫連接點(鼻屎)
方法一、從元件庫裡點選
方法二、按英文句點
2012年10月19日 星期五
uEnv.txt
請參考 Das U-boot 之 manual
http://www.denx.de/wiki/DULG/UBootCmdGroupEnvironment
baudrate=115200
beaglerev=C4
optargs="consoleblank=0"
bootargs=console=ttyO2,115200n8 mpurate=auto buddy=none camera=none vram=12M omapfb.mode=dvi:640x480MR-16@60 omapdss.def_disp=dvi root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
bootcmd=if mmc rescan ${mmcdev}; then if run userbutton; then setenv bootenv uEnv.txt;else setenv bootenv user.txt;fi;echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loaduimage; then run mmcboot;fi;fi;run nandboot;
bootdelay=3
bootenv=uEnv.txt
bootfile=uImage.beagle
buddy=none
camera=none
console=ttyO2,115200n8
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x80200000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz
loaduimage=fatload mmc ${mmcdev}:1 ${loadaddr} /uImage
loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
mpurate=auto
nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr}
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
usbtty=cdc_acm
userbutton=if gpio input 173; then run userbutton_xm; else run userbutton_nonxm; fi;
userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;
vram=12M
http://www.denx.de/wiki/DULG/UBootCmdGroupEnvironment
baudrate=115200
beaglerev=C4
optargs="consoleblank=0"
bootargs=console=ttyO2,115200n8 mpurate=auto buddy=none camera=none vram=12M omapfb.mode=dvi:640x480MR-16@60 omapdss.def_disp=dvi root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
bootcmd=if mmc rescan ${mmcdev}; then if run userbutton; then setenv bootenv uEnv.txt;else setenv bootenv user.txt;fi;echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loaduimage; then run mmcboot;fi;fi;run nandboot;
bootdelay=3
bootenv=uEnv.txt
bootfile=uImage.beagle
buddy=none
camera=none
console=ttyO2,115200n8
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x80200000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz
loaduimage=fatload mmc ${mmcdev}:1 ${loadaddr} /uImage
loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
mpurate=auto
nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr}
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
usbtty=cdc_acm
userbutton=if gpio input 173; then run userbutton_xm; else run userbutton_nonxm; fi;
userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;
vram=12M
如何自行建立 rootfs (舊版, 2014)
如何自行建立 rootfs
0. 請確定你已經有使用 qemu arm 版建立起來的 arm.img
1. 備份 arm.img -> arm2.img
cp arm.img arm2.img
2. 將 arm.img 掛載至 /mnt 目錄,請先確定兩個魔術數字:2048 512
mount -o loop,offset=`expr 2048 \* 512` arm.img /mnt -t ext3
ext4
此時 /mnt 目錄下的檔案即為我們要截取的 rootfs,但是我們要先修改一下。
3. 清除檔案:
a. /mnt/lib/modules/* -> 此目錄中為舊版 Linux 核心模組,我們已自行編譯
linux-3.4.X 核心,因此我們應該清掉舊版核心模組,改放新版核心模組。
b. /mnt/boot -> 舊版 Linux 核心,我們可以清掉。
c. /mnt/dev/.udev -> 清除不必要的 udev 檔案
4. 設定檔案:
a. /mnt/lib/modules/ -> 放回 linux-3.4.X 之模組檔案。
cp -a DIR/modules/lib/modules/* /mnt/lib/modules
^^^^^^^^^^^^^^^^^^^^^^^^^
b. /mnt/etc/fstab 請改成以下內容:
/dev/mmcblk0p2 / ext3 errors=remount-ro 0 1
/dev/mmcblk0p1 /boot vfat defaults 0 0
c. 接著請編輯 /mnt/etc/inittab 檔案,修改最後一行成為底下內容:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
d. 檢查 /mnt/etc/network/interfaces 檔案,看其內容是否如下:
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
5. 將 rootfs 截取成為 rootfs.tar.xz 以便 deploy (部屬至虛擬 sdcard.img)
/mnt# tar cfva /root/rootfs.tar.xz .
6. 解除掛載 arm.img
當我們將 rootfs 截取出來後,/mnt 目錄即不再需要使用,此時可以解除掛載,請執行
底下指令:
umount /mnt
7. 將 sdcard.img 掛載至 /mnt/sdcard1 /mnt/sdcard2 目錄
8. 複製 bootloader、Linux 核心及 uEnv.txt 至 /mnt/sdcard1,其檔案如下:
-rwxr-xr-x 1 root root 45444 2012-10-08 00:28 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-08 00:29 u-boot
-rwxr-xr-x 1 root root 344872 2012-10-08 00:29 u-boot.bin
-rwxr-xr-x 1 root root 344936 2012-10-08 00:29 u-boot.img
-rwxr-xr-x 1 root root 2400 2012-10-08 00:29 uEnv.txt
-rwxr-xr-x 1 root root 2475288 2012-10-08 00:29 uImage
9. 將 rootfs.tar.xz deploy 至 /mnt/sdcard2 目錄
tar xfva rootfs.tar.xz -C /mnt/sdcard2
10. 將 sdcard.img 解除掛載
11. 執行 qemu
qemu-system-arm -M beagle -m 512 -sd ./sdcard.img -clock unix -serial stdio \
-device usb-mouse -device usb-kbd
如何確保開機正常!!
1. 核心編譯時要加入正確參數,特別是:
ext2 ext3 ext4 vfat 均要加入編譯選項,而且要為 <*>
<M> -> 模組,核心載入後才有作用
<*> -> 內建至核心中,無需載入即有作用
2. uEnv.txt 中的 uenvcmd 要設定正確,特別是要加上
run mmcargs;fatload mmc 0:1 0x8000000 uImage; bootm 0x8000000
3. 將新編之核心、uEnv.txt、MLO、u-boot.* 等檔案放入 sdcard 的第一個分割區
將修改過之 rootfs 放入 sdcard 的第二個分割區
4. 第一個分割區一定要設定 boot 旗標
0. 請確定你已經有使用 qemu arm 版建立起來的 arm.img
1. 備份 arm.img -> arm2.img
cp arm.img arm2.img
2. 將 arm.img 掛載至 /mnt 目錄,請先確定兩個魔術數字:2048 512
mount -o loop,offset=`expr 2048 \* 512` arm.img /mnt -t ext3
ext4
此時 /mnt 目錄下的檔案即為我們要截取的 rootfs,但是我們要先修改一下。
3. 清除檔案:
a. /mnt/lib/modules/* -> 此目錄中為舊版 Linux 核心模組,我們已自行編譯
linux-3.4.X 核心,因此我們應該清掉舊版核心模組,改放新版核心模組。
b. /mnt/boot -> 舊版 Linux 核心,我們可以清掉。
c. /mnt/dev/.udev -> 清除不必要的 udev 檔案
4. 設定檔案:
a. /mnt/lib/modules/ -> 放回 linux-3.4.X 之模組檔案。
cp -a DIR/modules/lib/modules/* /mnt/lib/modules
^^^^^^^^^^^^^^^^^^^^^^^^^
b. /mnt/etc/fstab 請改成以下內容:
/dev/mmcblk0p2 / ext3 errors=remount-ro 0 1
/dev/mmcblk0p1 /boot vfat defaults 0 0
c. 接著請編輯 /mnt/etc/inittab 檔案,修改最後一行成為底下內容:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
d. 檢查 /mnt/etc/network/interfaces 檔案,看其內容是否如下:
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
5. 將 rootfs 截取成為 rootfs.tar.xz 以便 deploy (部屬至虛擬 sdcard.img)
/mnt# tar cfva /root/rootfs.tar.xz .
6. 解除掛載 arm.img
當我們將 rootfs 截取出來後,/mnt 目錄即不再需要使用,此時可以解除掛載,請執行
底下指令:
umount /mnt
7. 將 sdcard.img 掛載至 /mnt/sdcard1 /mnt/sdcard2 目錄
8. 複製 bootloader、Linux 核心及 uEnv.txt 至 /mnt/sdcard1,其檔案如下:
-rwxr-xr-x 1 root root 45444 2012-10-08 00:28 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-08 00:29 u-boot
-rwxr-xr-x 1 root root 344872 2012-10-08 00:29 u-boot.bin
-rwxr-xr-x 1 root root 344936 2012-10-08 00:29 u-boot.img
-rwxr-xr-x 1 root root 2400 2012-10-08 00:29 uEnv.txt
-rwxr-xr-x 1 root root 2475288 2012-10-08 00:29 uImage
9. 將 rootfs.tar.xz deploy 至 /mnt/sdcard2 目錄
tar xfva rootfs.tar.xz -C /mnt/sdcard2
10. 將 sdcard.img 解除掛載
11. 執行 qemu
qemu-system-arm -M beagle -m 512 -sd ./sdcard.img -clock unix -serial stdio \
-device usb-mouse -device usb-kbd
如何確保開機正常!!
1. 核心編譯時要加入正確參數,特別是:
ext2 ext3 ext4 vfat 均要加入編譯選項,而且要為 <*>
<M> -> 模組,核心載入後才有作用
<*> -> 內建至核心中,無需載入即有作用
2. uEnv.txt 中的 uenvcmd 要設定正確,特別是要加上
run mmcargs;fatload mmc 0:1 0x8000000 uImage; bootm 0x8000000
3. 將新編之核心、uEnv.txt、MLO、u-boot.* 等檔案放入 sdcard 的第一個分割區
將修改過之 rootfs 放入 sdcard 的第二個分割區
4. 第一個分割區一定要設定 boot 旗標
2012年10月17日 星期三
如何建立虛擬 SD card
#2020/04/20 改版
如何建立虛擬 SD card
0. 目標:建立一個 sdcard.img,將其分割為二個分割區
part1: 80 M
part2: 920 M
並將第一個分割區以 vfat 方式格式化,第二個分割區以 ext4 方式格式化,而且兩個分割區都要能掛載。
1. 使用 dd 指令建立 1G 之 sdcard.img
dd if=/dev/zero of=sdcard.img bs=1M count=1024
作完後之輸出如下所示:
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.8515 s, 60.1 MB/s
我們可以使用 file 及 hexdump 這兩個指令來檢視 sdcard.img,其操作如下:
file sdcard.img
其輸出為:
# fdisk -lu /dev/loop0
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5e072a5
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 2048 165887 163840 80M b W95 FAT32
/dev/loop0p2 165888 2097151 1931264 943M 83 Linux
4.1 格式化與掛載
我們統一將第 1 個分割區格式化為 fat 格式,第 2 個分割區格式化為 ext4 格式以便 u-boot 載入系統核心並掛載 rootfs。在格式化前我們需注意每一個分割區的 sector 數目,例如第 1 個分割區的 Sectors 為 163840,而第 2 個分割區則為 1931264。這兩個數字將分別應用在格式化上,但是在格式化前,我們要將第 1 個分割區連接至 /dev/loop1,第 2 個分割區連接至 /dev/loop2,請執行底下指令連接 /dev/loop1:
losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0
接著再執行底下指令連接 /dev/loop2:
losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0
上述指令都有使用到 expr 這個命令,expr 可以拿來作簡單的四則運算,例如:
expr 1 + 1 其輸出為 2
expr 2 - 1 其輸出為 1
但若要進行乘法的話必須使用 \* 而非 *,因為 * 是特殊字元。
expr 2 * 3 -> expr: 格式錯誤
expr 2 \* 3 -> 6
至於除法範例如下:
expr 6 / 2 -> 2
expr 6 / 4 -> 1 (沒有餘數)
`expr a \* b` 表示「傳回」 a * b 之值。
當我們要連接 /dev/loop1 (第 1 個分割區) 及 /dev/loop2 (第 2 個分割區)時,必須跳過相對應的 offset,這個 offset 就由 expr 來替我們作運算。當 /dev/loop1 及 /dev/loop2 都連接上時,我們可以執行:
losetup -a
此時會出現底下輸出,告訴我們 /dev/loop1 及 /dev/loop2 都完成連接。
/dev/loop0: [0805]:2540233 (/home/herman/qemu_image/arm/sdcard.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 32256
/dev/loop2: [0005]:1312 (/dev/loop0), offset 90478080
接著我們即可真正對 /dev/loop1 及 /dev/loop2 進行格式化:
mkfs.msdos -s 2 /dev/loop1 81920
mkfs.ext4 /dev/loop2 965632 -> 此指令不用,以免 u-boot 無法掛載
mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2 -> 改用這個指令來分割虛擬 sdcard
格式化完畢後我們可以進行掛載以便待會複製檔案,我們統一掛載至
/mnt/sdcard1 及 /mnt/sdcard2 目錄。
Q: 若以上兩個目錄不存在,該如何建立 ?
mkdir -p /mnt/sdcard1 /mnt/sdcard2
建好目錄後可以進行掛載,指令如下:
mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2
我們可以執行 df -h 來檢查是否有正確掛載,其輸出如下:
檔案系統 Size Used Avail Use% 掛載點
/dev/loop1 87M 0 87M 0% /mnt/sdcard1
/dev/loop2 919M 18M 855M 2% /mnt/sdcard2
接下來,我們可以針對虛擬 SDCARD 開始複製檔案以便使用 Qemu 開機模擬。
4.2 解掛
4.2.1 解掛目錄
# umount /mnt/sdcard1 /mnt/sdcard2
4.2.2 解掛 loop,注意:順序要跟掛 loop 反過來作。
# losetup -d /dev/loop2
# losetup -d /dev/loop1
# losetup -d /dev/loop0
檢查是否完全解開:
# losetup -a
5. 植入 bootloader、kernel 以及 rootfs
5.1 bootloader 所需檔案
MLO
u-boot
u-boot.bin
u-boot.img
uEnv.txt -> 開機設定檔
5.2 kernel 所需檔案
uImage
請將上述檔案複製至 /mnt/sdcard1 目錄
5.3 如何建立 rootfs
Q: 請問什麼是 rootfs ?
a. 最簡單的作法:將 qemu 中的 rootfs 拿來改,但是要記得瘦身。
b. 另一個簡單的作法:拿現成的來用,網路上有一位高手叫 Robert Nelson,
他所提供的下載網址在:
http://rcn-ee.net/deb/minfs/
目前最新的下載檔案是:
http://rcn-ee.net/deb/minfs/wheezy/debian-7.7-minimal-armel-2014-11-10.tar.xz
c. 修改 rootfs
要將 rootfs 植入 /mnt/sdcard2 中請完成底下工作:
c.1 將 rootfs 存入 /mnt/sdcard2
c.2 將核心模組存入 /mnt/sdcard2/lib/modules 目錄
c.3 修改設定檔,修改內容如下:
c.3.a 將 /etc/inittab 存入 /mnt/sdcard2/etc 中,並將最後一行改為
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
c.3.b 將 /mnt/sdcard2/etc/fstab 修改如下:
proc /proc proc defaults 0 0
/dev/mmcblk0p2 / auto errors=remount-ro 0 1
/dev/mmcblk0p1 /boot auto defaults 0 0
c.3.c 將 /mnt/sdcard2/etc/network/interfaces 修改如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
c.3.d 將 /etc/sdcard2/etc/hostname 修改如下:
leenix
c.3.e 將 /etc/resolv.conf 修改如下:
nameserver 8.8.8.8
6. 當所有檔案完成複製後,我們必須將 sdcard.img 解除掛載及解除連接,請執行以下指令:
umount /mnt/sdcard1 /mnt/sdcard2 -> 先解除目錄掛載
losetup -d /dev/loop2 -> 再依順序解除 loop 連接,請依後進先出的原則來解除
losetup -d /dev/loop1
losetup -d /dev/loop0 -> 至此全部解除連接,我們可以執行
losetup -a 來確認。
7. 測試虛擬 sdcard.img
當我們都完成檔案複製後,我們可以使用 qemu 來測試所完成之虛擬 sdcard.img,測試指令如下:
qemu-system-arm -M beagle -m 512 -nographic -sd ./test.img -clock unix \
-device usb-mouse -device usb-kbd \
-usb -device usb-net,netdev=mynet -netdev user,id=mynet
如何建立虛擬 SD card
0. 目標:建立一個 sdcard.img,將其分割為二個分割區
part1: 80 M
part2: 920 M
並將第一個分割區以 vfat 方式格式化,第二個分割區以 ext4 方式格式化,而且兩個分割區都要能掛載。
1. 使用 dd 指令建立 1G 之 sdcard.img
dd if=/dev/zero of=sdcard.img bs=1M count=1024
作完後之輸出如下所示:
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.8515 s, 60.1 MB/s
我們可以使用 file 及 hexdump 這兩個指令來檢視 sdcard.img,其操作如下:
file sdcard.img
其輸出為:
sdcard.img: data
hexdump sdcard.img
其輸出為:
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
40000000
以上輸出表示此檔案之內容為 00 (也就是 ASCII 表中之 Null 字元),其位址從 0x0000000 一直至 0x40000000 也就是 1G。
到此為止,我們已完成一個空的 sdcard.img。接著我們要使用 losetup 來連接此檔案至 /dev/loop0 裝置以便進行分割及格式化。
2. 使用 losetup 指令
要使用 losetup 指令,請先切換至 root 權限,我們先看目前是否有 /dev/loop 裝置,其指令如下所示:
# losetup -a
理論上目前沒有任何輸出。接著請執行底下指令將 /dev/loop0 與 sdcard.img 「連接」在一起。
# losetup /dev/loop0 sdcard.img
此時我們即將 sdcard.img 「連接」至 /dev/loop0 這個裝置。
3. 使用 fdisk 分割 /dev/loop0
將第一個分割區切成 80 MB
將第二個分割區切成剩下空間 (920 MB)
作完後將分割區狀況存入並退出 fdisk,我們可以執行底下指令來觀看 /dev/loop0 狀態。
fdisk -lu /dev/loop0
其輸出如下所示:
# fdisk -lu /dev/loop0
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5e072a5
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 2048 165887 163840 80M b W95 FAT32
/dev/loop0p2 165888 2097151 1931264 943M 83 Linux
在存分割表 (w 指令)時如果出現底下訊息要將 /dev/loop0 與 sdcard.img 分離,再重新連接才可以繼續往下作。
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 22: 不適用的引數.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 22: 不適用的引數.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
** 使用 losetup 將 /dev/loop0 與 sdcard.img 分離 **
# losetup -d /dev/loop0
我們可以執行 losetup -a 來看是否已解除連接。若要重新連接請執行以下指令:
# losetup /dev/loop0 sdcard.img
連接完可以執行
fdisk -lu /dev/loop0
來觀察其輸出是否如上所示。
# losetup /dev/loop0 sdcard.img
連接完可以執行
fdisk -lu /dev/loop0
來觀察其輸出是否如上所示。
4. 格式化/掛載/解掛/解除連結
4.1 格式化與掛載
我們統一將第 1 個分割區格式化為 fat 格式,第 2 個分割區格式化為 ext4 格式以便 u-boot 載入系統核心並掛載 rootfs。在格式化前我們需注意每一個分割區的 sector 數目,例如第 1 個分割區的 Sectors 為 163840,而第 2 個分割區則為 1931264。這兩個數字將分別應用在格式化上,但是在格式化前,我們要將第 1 個分割區連接至 /dev/loop1,第 2 個分割區連接至 /dev/loop2,請執行底下指令連接 /dev/loop1:
losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0
接著再執行底下指令連接 /dev/loop2:
losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0
上述指令都有使用到 expr 這個命令,expr 可以拿來作簡單的四則運算,例如:
expr 1 + 1 其輸出為 2
expr 2 - 1 其輸出為 1
但若要進行乘法的話必須使用 \* 而非 *,因為 * 是特殊字元。
expr 2 * 3 -> expr: 格式錯誤
expr 2 \* 3 -> 6
至於除法範例如下:
expr 6 / 2 -> 2
expr 6 / 4 -> 1 (沒有餘數)
`expr a \* b` 表示「傳回」 a * b 之值。
當我們要連接 /dev/loop1 (第 1 個分割區) 及 /dev/loop2 (第 2 個分割區)時,必須跳過相對應的 offset,這個 offset 就由 expr 來替我們作運算。當 /dev/loop1 及 /dev/loop2 都連接上時,我們可以執行:
losetup -a
此時會出現底下輸出,告訴我們 /dev/loop1 及 /dev/loop2 都完成連接。
/dev/loop0: [0805]:2540233 (/home/herman/qemu_image/arm/sdcard.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 32256
/dev/loop2: [0005]:1312 (/dev/loop0), offset 90478080
接著我們即可真正對 /dev/loop1 及 /dev/loop2 進行格式化:
mkfs.msdos -s 2 /dev/loop1 81920
mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2 -> 改用這個指令來分割虛擬 sdcard
格式化完畢後我們可以進行掛載以便待會複製檔案,我們統一掛載至
/mnt/sdcard1 及 /mnt/sdcard2 目錄。
Q: 若以上兩個目錄不存在,該如何建立 ?
mkdir -p /mnt/sdcard1 /mnt/sdcard2
建好目錄後可以進行掛載,指令如下:
mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2
我們可以執行 df -h 來檢查是否有正確掛載,其輸出如下:
檔案系統 Size Used Avail Use% 掛載點
/dev/loop1 87M 0 87M 0% /mnt/sdcard1
/dev/loop2 919M 18M 855M 2% /mnt/sdcard2
接下來,我們可以針對虛擬 SDCARD 開始複製檔案以便使用 Qemu 開機模擬。
4.2 解掛
4.2.1 解掛目錄
# umount /mnt/sdcard1 /mnt/sdcard2
4.2.2 解掛 loop,注意:順序要跟掛 loop 反過來作。
# losetup -d /dev/loop2
# losetup -d /dev/loop1
# losetup -d /dev/loop0
檢查是否完全解開:
# losetup -a
5. 植入 bootloader、kernel 以及 rootfs
5.1 bootloader 所需檔案
MLO
u-boot
u-boot.bin
u-boot.img
uEnv.txt -> 開機設定檔
5.2 kernel 所需檔案
uImage
請將上述檔案複製至 /mnt/sdcard1 目錄
5.3 如何建立 rootfs
Q: 請問什麼是 rootfs ?
a. 最簡單的作法:將 qemu 中的 rootfs 拿來改,但是要記得瘦身。
b. 另一個簡單的作法:拿現成的來用,網路上有一位高手叫 Robert Nelson,
他所提供的下載網址在:
http://rcn-ee.net/deb/minfs/
目前最新的下載檔案是:
http://rcn-ee.net/deb/minfs/wheezy/debian-7.7-minimal-armel-2014-11-10.tar.xz
c. 修改 rootfs
要將 rootfs 植入 /mnt/sdcard2 中請完成底下工作:
c.1 將 rootfs 存入 /mnt/sdcard2
c.2 將核心模組存入 /mnt/sdcard2/lib/modules 目錄
c.3 修改設定檔,修改內容如下:
c.3.a 將 /etc/inittab 存入 /mnt/sdcard2/etc 中,並將最後一行改為
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
c.3.b 將 /mnt/sdcard2/etc/fstab 修改如下:
proc /proc proc defaults 0 0
/dev/mmcblk0p2 / auto errors=remount-ro 0 1
/dev/mmcblk0p1 /boot auto defaults 0 0
c.3.c 將 /mnt/sdcard2/etc/network/interfaces 修改如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
c.3.d 將 /etc/sdcard2/etc/hostname 修改如下:
leenix
c.3.e 將 /etc/resolv.conf 修改如下:
nameserver 8.8.8.8
6. 當所有檔案完成複製後,我們必須將 sdcard.img 解除掛載及解除連接,請執行以下指令:
umount /mnt/sdcard1 /mnt/sdcard2 -> 先解除目錄掛載
losetup -d /dev/loop2 -> 再依順序解除 loop 連接,請依後進先出的原則來解除
losetup -d /dev/loop1
losetup -d /dev/loop0 -> 至此全部解除連接,我們可以執行
losetup -a 來確認。
7. 測試虛擬 sdcard.img
當我們都完成檔案複製後,我們可以使用 qemu 來測試所完成之虛擬 sdcard.img,測試指令如下:
qemu-system-arm -M beagle -m 512 -nographic -sd ./test.img -clock unix \
-device usb-mouse -device usb-kbd \
-usb -device usb-net,netdev=mynet -netdev user,id=mynet
2012年10月7日 星期日
在 Linux 底下玩遊戲
在 Linux 底下玩遊戲
mame -> 大型電玩模擬器
1. 下載模擬器
apt-get install xmame-sdl
2. 下載遊戲檔
http://boneash.oldgame.tw/MAME/mame.html
3. 執行
/usr/games/xmame.SDL -rp . twincobr.zip
mame -> 大型電玩模擬器
1. 下載模擬器
apt-get install xmame-sdl
2. 下載遊戲檔
http://boneash.oldgame.tw/MAME/mame.html
3. 執行
/usr/games/xmame.SDL -rp . twincobr.zip
使用 ntpdate 來更新時間
使用 ntpdate 來更新時間
1. 安裝 ntpdate 套件
apt-get install ntpdate
2. 在 /etc/default/ntpdate 中觀察結果,可選擇要不要加入台灣的伺服器
http://www.stdtime.gov.tw/Time/ntp/NTPClockOperatingManualRelease1.21.html
3. 以 root 權限執行底下指令更新系統時間(請注意網路連線必須沒有問題才行)
ntpdate time.stdtime.gov.tw
1. 安裝 ntpdate 套件
apt-get install ntpdate
2. 在 /etc/default/ntpdate 中觀察結果,可選擇要不要加入台灣的伺服器
http://www.stdtime.gov.tw/Time/ntp/NTPClockOperatingManualRelease1.21.html
3. 以 root 權限執行底下指令更新系統時間(請注意網路連線必須沒有問題才行)
ntpdate time.stdtime.gov.tw
架設 ssh 伺服器
架設 ssh 伺服器
Linux 是多人多工的作業系統,因此可以同時容納多人在同一台主機裡進行操作,要讓使用者能遠端連線進入我們的主機,我們必須架設 ssh 伺服器。
請執行
apt-get install openssh-server
來安裝 ssh 伺服器。當我們已經在 163.26.xx.xx 裝好 ssh 伺服器,該主機即可遠端連線,連線指令如下:
ssh -l 使用者帳號 163.26.xx.xx
不管是正常連線或是錯誤連線,我們都可以在 /var/log/auth.log 看到連線結果。
例如:
May 8 17:56:44 pc-6 sshd[1639]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.125.243.59 user=root
May 8 17:56:44 pc-6 sshd[1639]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.125.243.59 user=root
May 8 17:56:46 pc-6 sshd[1639]: Failed password for root from 118.125.243.59 port 17448 ssh2
上面錯誤訊息為:
1. 有個人從 118.125.243.59 連到我的機器
2. 他用 root 的帳號,但是沒有正確密碼
3. 入侵時間為 5/8 下午 5:56:44
要避免我們的機器被玩,我們要設定自動偵測錯誤連線並加入阻擋 IP 之機制,因此要安裝以下套件:
denyhosts
openssh-blacklist
openssh-blacklist-extra
在 /etc/hosts.deny 檔案中記錄我們那些主機要擋下來,這是正面表列。我們可以使用
nslookup IP 來查 IP 之 domain name
小結:
ssh 登錄是一個相當重要的程式,它可以讓遠端使用者連至我們所架設的伺服器來進行操作,一旦我們主機的帳號/密碼外露,有可能讓惡意使用者自全世界連線至我們的電腦。使用 denyhosts 套件可以有效降低惡意試帳/密的情況出現,並將惡意連線之 IP 登錄在 /etc/hosts.deny 檔案,如此一來此 IP 將無法再進行連線。
** 聽 MP3 **
1. 安裝音效驅動程式 - alsa
2. 安裝混音程式
3. 安裝 mp3 播放程式
4. 聽 mp3
2012年10月5日 星期五
編譯 ARM Linux 核心
編譯 ARM Linux 核心
檔案位置:
~/qemu_image/ -> 所有虛擬 ARM 檔案目錄
/kernel/ -> 編譯 ARM Linux 核心目錄
/modules -> 編譯 ARM Linux 核心模組目錄
0. 判別我們所要使用之 ARM CPU
我們的模擬目標為 Beagle Board,其 CPU 為 OMAP 3530,有關 Beagle Board 的詳細規格可以參考官方網站 (http://beagleboard.org/),而 OMAP 3530 是由德洲儀洲所生產之 ARM CPU,其資料可以參考德儀網站 (http://www.ti.com/product/omap3530?247SEM)。
OMAP 3530 是一顆 Cortex A8 的 ARM CPU,目前已被 Qemu ARM 完整支援,我們可以使用
qemu-system-arm -cpu ?
來觀看 Qemu ARM 版所支援之 CPU 清單,如下所示:
Available CPUs:
arm1026
arm1136
arm1136-r2
arm1176
arm11mpcore
arm926
arm946
cortex-a15
cortex-a8
cortex-a9
cortex-m3
pxa250
pxa255
pxa260
pxa261
pxa262
pxa270
pxa270-a0
pxa270-a1
pxa270-b0
pxa270-b1
pxa270-c0
pxa270-c5
sa1100
sa1110
ti925t
any
因此我們可以使用 Qemu 來模擬 beagle board 平台,底下將介紹如何編譯 Linux 核心:
1. 下載 & 解壓縮
請切換至 ~/qemu_image/kernel 目錄,進行底下操作:
wget ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/linux-3.2.30.tar.xz
tar xfva linux-3.2.30.tar.xz
此時會出現 linux-3.2.30 目錄
2. 設定編譯參數
cd linux-3.2.30
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap2plus_defconfig
** ARM 版之核心設定參數檔在 linux-3.2.30/arch/arm/configs 目錄 **
此時會出現以下訊息:
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
這表示我們已經完成基本參數設定,接著我們要作細部微調。請執行:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
如果出現底下錯誤的話,表示我們還沒有安裝 libncurses5-dev 這個函式庫:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2
請以底下指令安裝 libncurses5-dev 函式庫:
apt-get install libncurses5-dev
然後再重新執行底下指令即可:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
請設定以下部份:
General setup ---> Kernel compression mode (Gzip) --->XZ
System Type ---> TI OMAP2/3/4 Specific Features --->
[*] OMAP3 BEAGLE board
[*] DEVKIT8000 board
File systems --->
<*> The Extended 4 (ext4) filesystem
設定完畢後請跳出 Linux 設定畫面,如此一來我們即完成 Linux 核心設定。
3. 編譯核心及核心模組
a. 編譯核心
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j 4
假設在編譯時有底下訊息:
make: arm-linux-gnueabi-gcc: Command not found
scripts/kconfig/conf --silentoldconfig Kconfig
make: arm-linux-gnueabi-gcc: Command not found
WRAP arch/arm/include/generated/asm/auxvec.h
WRAP arch/arm/include/generated/asm/bitsperlong.h
WRAP arch/arm/include/generated/asm/cputime.h
WRAP arch/arm/include/generated/asm/emergency-restart.h
WRAP arch/arm/include/generated/asm/errno.h
WRAP arch/arm/include/generated/asm/ioctl.h
WRAP arch/arm/include/generated/asm/irq_regs.h
WRAP arch/arm/include/generated/asm/kdebug.h
WRAP arch/arm/include/generated/asm/local.h
WRAP arch/arm/include/generated/asm/local64.h
WRAP arch/arm/include/generated/asm/percpu.h
WRAP arch/arm/include/generated/asm/poll.h
WRAP arch/arm/include/generated/asm/resource.h
WRAP arch/arm/include/generated/asm/sections.h
WRAP arch/arm/include/generated/asm/siginfo.h
WRAP arch/arm/include/generated/asm/sizes.h
CHK include/linux/version.h
UPD include/linux/version.h
HOSTCC scripts/dtc/checks.o
HOSTCC scripts/dtc/data.o
SHIPPED scripts/dtc/dtc-lexer.lex.c
SHIPPED scripts/dtc/dtc-parser.tab.h
SHIPPED scripts/dtc/dtc-parser.tab.c
HOSTCC scripts/dtc/dtc.o
HOSTCC scripts/dtc/flattree.o
CHK include/generated/utsrelease.h
UPD include/generated/utsrelease.h
Generating include/generated/mach-types.h
CC kernel/bounds.s
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[1]: *** [kernel/bounds.s] Error 127
make: *** [prepare0] Error 2
make: *** Waiting for unfinished jobs....
HOSTCC scripts/dtc/fstree.o
HOSTCC scripts/dtc/livetree.o
HOSTCC scripts/genksyms/genksyms.o
HOSTCC scripts/dtc/srcpos.o
HOSTCC scripts/dtc/treesource.o
SHIPPED scripts/genksyms/lex.lex.c
SHIPPED scripts/genksyms/keywords.hash.c
SHIPPED scripts/genksyms/parse.tab.h
SHIPPED scripts/genksyms/parse.tab.c
HOSTCC scripts/genksyms/lex.lex.o
HOSTCC scripts/dtc/util.o
HOSTCC scripts/dtc/dtc-lexer.lex.o
HOSTCC scripts/dtc/dtc-parser.tab.o
HOSTCC scripts/genksyms/parse.tab.o
HOSTLD scripts/dtc/dtc
CC scripts/mod/empty.o
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[2]: *** [scripts/mod/empty.o] Error 127
make[1]: *** [scripts/mod] Error 2
make[1]: *** Waiting for unfinished jobs....
HOSTLD scripts/genksyms/genksyms
make: *** [scripts] Error 2
real 0m3.743s
user 0m4.576s
sys 0m0.304s
上面錯誤訊息是因為 arm-linux-gnueabi-gcc 這個指令找不到,我們可以切換至 /usr/bin 目錄來觀察 gcc cpp g++ 三個指令,如下所示:
root@debian:/usr/src# cd /usr/bin
root@debian:/usr/bin# ls -l arm-linux-gnueabi-gcc-4.7 arm-linux-gnueabi-cpp-4.7 arm-linux-gnueabi-g++-4.7
-rwxr-xr-x 1 root root 559672 10月 12 2012 arm-linux-gnueabi-cpp-4.7
-rwxr-xr-x 1 root root 562936 10月 12 2012 arm-linux-gnueabi-g++-4.7
-rwxr-xr-x 1 root root 558840 10月 12 2012 arm-linux-gnueabi-gcc-4.7
這個錯誤是因為編譯指令要的是 arm-linux-gnueabi-gcc、arm-linux-gnueabi-cpp 以及 arm-linux-gnueabi-g++ 三個檔案,而目前系統沒有,因此我們要手動建立連結:
root@debian:/usr/bin# ln -s arm-linux-gnueabi-cpp-4.7 arm-linux-gnueabi-cpp
root@debian:/usr/bin# ln -s arm-linux-gnueabi-g++-4.7 arm-linux-gnueabi-g++
root@debian:/usr/bin# ln -s arm-linux-gnueabi-gcc-4.7 arm-linux-gnueabi-gcc
接著再執行剛剛沒有成功的指令來編譯核心:
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j 4
若是編譯過程中出現底下錯誤:
SHIPPED arch/arm/boot/compressed/ashldi3.S
AS arch/arm/boot/compressed/lib1funcs.o
AS arch/arm/boot/compressed/ashldi3.o
AS arch/arm/boot/compressed/piggy.xzkern.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2
這表示編譯程式找不到 mkimage 這個指令,我們可以上 packages.debian.org 來查詢,得知此檔案在 u-boot-tools 套件中,因此要再安裝 u-boot-tools 套件,然後再下編譯指令。編譯完畢後會出現以下訊息,告訴我們 uImage 已經編譯完成。
Image Name: Linux-3.2.30
Created: Fri Oct 5 15:43:49 2012
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2475104 Bytes = 2417.09 kB = 2.36 MB
Load Address: 0x80008000
Entry Point: 0x80008000
Image arch/arm/boot/uImage is ready
我們可以執行底下指令來看 /arch/arm/boot/uImage 的屬性:
file arch/arm/boot/uImage
其輸出如底下所示:
file uImage
uImage: u-boot legacy uImage, Linux-3.2.30, Linux/ARM, OS Kernel Image (Not compressed), 2475104 bytes, Fri Oct 5 15:43:49 2012, Load Address: 0x80008000, Entry Point: 0x80008000, Header CRC: 0x3A120CB2, Data CRC: 0x1508ED43
b. 編譯核心模組
核心要正常工作必須要有相對應的核心模組,否則無法載入驅動程式,
# Compile Kernel Modules
time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules -j $CPU_CORE
# Install Kernel Modules
time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=../modules/ -j $CPU_CORE
cd ../modules
time tar cfa ../modules-$KERNEL_VERSION.tar.xz lib
編譯完成後我們會有一個名為 modules-核心編號.tar.xz 的檔案,此檔案可以用來取代原始 rootfs 中 /lib/modules 目錄中舊版的驅動核心模組。因此我們必須將舊版驅動核心模組移除,再放入我們剛剛編完之驅動核心模組。
4. 準備虛擬 SD card -> 請看講義
5. 將 /dev/loop1 掛載至 /mnt/sdcard1 目錄
mount /dev/loop1 /mnt/sdcard1
將以下檔案複製至 /mnt/sdcard1 目錄:
-rwxr-xr-x 1 root root 45444 2012-10-05 16:52 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-05 16:52 u-boot
-rwxr-xr-x 1 root root 344872 2012-10-05 16:52 u-boot.bin
-rwxr-xr-x 1 root root 344936 2012-10-05 16:52 u-boot.img
-rwxr-xr-x 1 root root 2475168 2012-10-05 16:54 uImage
6.
qemu-system-arm -M beagle -m 256 -nographic -sd sdcard.img
此時即可看到 qemu 使用虛擬 sdcard 開機。
檔案位置:
~/qemu_image/ -> 所有虛擬 ARM 檔案目錄
/kernel/ -> 編譯 ARM Linux 核心目錄
/modules -> 編譯 ARM Linux 核心模組目錄
0. 判別我們所要使用之 ARM CPU
我們的模擬目標為 Beagle Board,其 CPU 為 OMAP 3530,有關 Beagle Board 的詳細規格可以參考官方網站 (http://beagleboard.org/),而 OMAP 3530 是由德洲儀洲所生產之 ARM CPU,其資料可以參考德儀網站 (http://www.ti.com/product/omap3530?247SEM)。
OMAP 3530 是一顆 Cortex A8 的 ARM CPU,目前已被 Qemu ARM 完整支援,我們可以使用
qemu-system-arm -cpu ?
來觀看 Qemu ARM 版所支援之 CPU 清單,如下所示:
Available CPUs:
arm1026
arm1136
arm1136-r2
arm1176
arm11mpcore
arm926
arm946
cortex-a15
cortex-a8
cortex-a9
cortex-m3
pxa250
pxa255
pxa260
pxa261
pxa262
pxa270
pxa270-a0
pxa270-a1
pxa270-b0
pxa270-b1
pxa270-c0
pxa270-c5
sa1100
sa1110
ti925t
any
因此我們可以使用 Qemu 來模擬 beagle board 平台,底下將介紹如何編譯 Linux 核心:
1. 下載 & 解壓縮
請切換至 ~/qemu_image/kernel 目錄,進行底下操作:
wget ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/linux-3.2.30.tar.xz
tar xfva linux-3.2.30.tar.xz
此時會出現 linux-3.2.30 目錄
2. 設定編譯參數
cd linux-3.2.30
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap2plus_defconfig
** ARM 版之核心設定參數檔在 linux-3.2.30/arch/arm/configs 目錄 **
此時會出現以下訊息:
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
這表示我們已經完成基本參數設定,接著我們要作細部微調。請執行:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
如果出現底下錯誤的話,表示我們還沒有安裝 libncurses5-dev 這個函式庫:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2
請以底下指令安裝 libncurses5-dev 函式庫:
apt-get install libncurses5-dev
然後再重新執行底下指令即可:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
請設定以下部份:
General setup ---> Kernel compression mode (Gzip) --->XZ
System Type ---> TI OMAP2/3/4 Specific Features --->
[*] OMAP3 BEAGLE board
[*] DEVKIT8000 board
File systems --->
<*> The Extended 4 (ext4) filesystem
設定完畢後請跳出 Linux 設定畫面,如此一來我們即完成 Linux 核心設定。
3. 編譯核心及核心模組
a. 編譯核心
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j 4
假設在編譯時有底下訊息:
make: arm-linux-gnueabi-gcc: Command not found
scripts/kconfig/conf --silentoldconfig Kconfig
make: arm-linux-gnueabi-gcc: Command not found
WRAP arch/arm/include/generated/asm/auxvec.h
WRAP arch/arm/include/generated/asm/bitsperlong.h
WRAP arch/arm/include/generated/asm/cputime.h
WRAP arch/arm/include/generated/asm/emergency-restart.h
WRAP arch/arm/include/generated/asm/errno.h
WRAP arch/arm/include/generated/asm/ioctl.h
WRAP arch/arm/include/generated/asm/irq_regs.h
WRAP arch/arm/include/generated/asm/kdebug.h
WRAP arch/arm/include/generated/asm/local.h
WRAP arch/arm/include/generated/asm/local64.h
WRAP arch/arm/include/generated/asm/percpu.h
WRAP arch/arm/include/generated/asm/poll.h
WRAP arch/arm/include/generated/asm/resource.h
WRAP arch/arm/include/generated/asm/sections.h
WRAP arch/arm/include/generated/asm/siginfo.h
WRAP arch/arm/include/generated/asm/sizes.h
CHK include/linux/version.h
UPD include/linux/version.h
HOSTCC scripts/dtc/checks.o
HOSTCC scripts/dtc/data.o
SHIPPED scripts/dtc/dtc-lexer.lex.c
SHIPPED scripts/dtc/dtc-parser.tab.h
SHIPPED scripts/dtc/dtc-parser.tab.c
HOSTCC scripts/dtc/dtc.o
HOSTCC scripts/dtc/flattree.o
CHK include/generated/utsrelease.h
UPD include/generated/utsrelease.h
Generating include/generated/mach-types.h
CC kernel/bounds.s
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[1]: *** [kernel/bounds.s] Error 127
make: *** [prepare0] Error 2
make: *** Waiting for unfinished jobs....
HOSTCC scripts/dtc/fstree.o
HOSTCC scripts/dtc/livetree.o
HOSTCC scripts/genksyms/genksyms.o
HOSTCC scripts/dtc/srcpos.o
HOSTCC scripts/dtc/treesource.o
SHIPPED scripts/genksyms/lex.lex.c
SHIPPED scripts/genksyms/keywords.hash.c
SHIPPED scripts/genksyms/parse.tab.h
SHIPPED scripts/genksyms/parse.tab.c
HOSTCC scripts/genksyms/lex.lex.o
HOSTCC scripts/dtc/util.o
HOSTCC scripts/dtc/dtc-lexer.lex.o
HOSTCC scripts/dtc/dtc-parser.tab.o
HOSTCC scripts/genksyms/parse.tab.o
HOSTLD scripts/dtc/dtc
CC scripts/mod/empty.o
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[2]: *** [scripts/mod/empty.o] Error 127
make[1]: *** [scripts/mod] Error 2
make[1]: *** Waiting for unfinished jobs....
HOSTLD scripts/genksyms/genksyms
make: *** [scripts] Error 2
real 0m3.743s
user 0m4.576s
sys 0m0.304s
上面錯誤訊息是因為 arm-linux-gnueabi-gcc 這個指令找不到,我們可以切換至 /usr/bin 目錄來觀察 gcc cpp g++ 三個指令,如下所示:
root@debian:/usr/src# cd /usr/bin
root@debian:/usr/bin# ls -l arm-linux-gnueabi-gcc-4.7 arm-linux-gnueabi-cpp-4.7 arm-linux-gnueabi-g++-4.7
-rwxr-xr-x 1 root root 559672 10月 12 2012 arm-linux-gnueabi-cpp-4.7
-rwxr-xr-x 1 root root 562936 10月 12 2012 arm-linux-gnueabi-g++-4.7
-rwxr-xr-x 1 root root 558840 10月 12 2012 arm-linux-gnueabi-gcc-4.7
這個錯誤是因為編譯指令要的是 arm-linux-gnueabi-gcc、arm-linux-gnueabi-cpp 以及 arm-linux-gnueabi-g++ 三個檔案,而目前系統沒有,因此我們要手動建立連結:
root@debian:/usr/bin# ln -s arm-linux-gnueabi-cpp-4.7 arm-linux-gnueabi-cpp
root@debian:/usr/bin# ln -s arm-linux-gnueabi-g++-4.7 arm-linux-gnueabi-g++
root@debian:/usr/bin# ln -s arm-linux-gnueabi-gcc-4.7 arm-linux-gnueabi-gcc
接著再執行剛剛沒有成功的指令來編譯核心:
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j 4
若是編譯過程中出現底下錯誤:
SHIPPED arch/arm/boot/compressed/ashldi3.S
AS arch/arm/boot/compressed/lib1funcs.o
AS arch/arm/boot/compressed/ashldi3.o
AS arch/arm/boot/compressed/piggy.xzkern.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2
這表示編譯程式找不到 mkimage 這個指令,我們可以上 packages.debian.org 來查詢,得知此檔案在 u-boot-tools 套件中,因此要再安裝 u-boot-tools 套件,然後再下編譯指令。編譯完畢後會出現以下訊息,告訴我們 uImage 已經編譯完成。
Image Name: Linux-3.2.30
Created: Fri Oct 5 15:43:49 2012
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2475104 Bytes = 2417.09 kB = 2.36 MB
Load Address: 0x80008000
Entry Point: 0x80008000
Image arch/arm/boot/uImage is ready
我們可以執行底下指令來看 /arch/arm/boot/uImage 的屬性:
file arch/arm/boot/uImage
其輸出如底下所示:
file uImage
uImage: u-boot legacy uImage, Linux-3.2.30, Linux/ARM, OS Kernel Image (Not compressed), 2475104 bytes, Fri Oct 5 15:43:49 2012, Load Address: 0x80008000, Entry Point: 0x80008000, Header CRC: 0x3A120CB2, Data CRC: 0x1508ED43
b. 編譯核心模組
核心要正常工作必須要有相對應的核心模組,否則無法載入驅動程式,
# Compile Kernel Modules
time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules -j $CPU_CORE
# Install Kernel Modules
time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=../modules/ -j $CPU_CORE
cd ../modules
time tar cfa ../modules-$KERNEL_VERSION.tar.xz lib
編譯完成後我們會有一個名為 modules-核心編號.tar.xz 的檔案,此檔案可以用來取代原始 rootfs 中 /lib/modules 目錄中舊版的驅動核心模組。因此我們必須將舊版驅動核心模組移除,再放入我們剛剛編完之驅動核心模組。
4. 準備虛擬 SD card -> 請看講義
5. 將 /dev/loop1 掛載至 /mnt/sdcard1 目錄
mount /dev/loop1 /mnt/sdcard1
將以下檔案複製至 /mnt/sdcard1 目錄:
-rwxr-xr-x 1 root root 45444 2012-10-05 16:52 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-05 16:52 u-boot
-rwxr-xr-x 1 root root 344872 2012-10-05 16:52 u-boot.bin
-rwxr-xr-x 1 root root 344936 2012-10-05 16:52 u-boot.img
-rwxr-xr-x 1 root root 2475168 2012-10-05 16:54 uImage
6.
qemu-system-arm -M beagle -m 256 -nographic -sd sdcard.img
此時即可看到 qemu 使用虛擬 sdcard 開機。
2012年10月3日 星期三
u boot 下載、編譯:
u boot 下載、編譯:
0 toolchain 安裝
/etc/apt/sources.list 請加入以下設定:
deb http://www.emdebian.org/debian/ squeeze main
接著執行
apt-get update
apt-get install gcc-4.4-arm-linux-gnueabi cpp-4.4-arm-linux-gnueabi g++-4.4-arm-linux-gnueabi
即可完成 toolchain 安裝。
1. U-boot 是使用在嵌入式系統的 bootloader,所謂的 bootloader 是指開機時載入
的一個小程式,在開機階段作好系統初始化並導入系統 (Linux) 核心,最後完成開機
流程將權限交給作業系統。
U-boot 的官方網頁如下:
http://www.denx.de/wiki/U-Boot
下載網址在:
ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2
下載完畢後會出現 u-boot-latest.tar.bz2 這個檔案,之後我們就可以準備解壓縮。
tar xfva u-boot-latest.tar.bz2
解開完畢後會出現 u-boot-2013.10 (最新版) 之目錄,請切換至此目錄準備編譯。
2. 編譯 u-boot
u-boot-2013.10 目錄底下有個 boards.cfg 檔案,裡面內建「所有」支援 ARM 開發板之設定,請看該檔內容,我們會看到其中有一行如下:
omap3_beagle arm armv7 beagle ti omap3
以上資訊告訴我們 u-boot 有支援 beagle 板,請執行底下指令設定編譯參數。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap3_beagle_config
此時會出現底下訊息:
Configuring for omap3_beagle board...
接著請執行底下指令編譯:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all -j 8
編完之後會出現幾個檔案:
MLO
u-boot
u-boot.bin
u-boot.img
3. 測試
請執行底下指令將所開機必要檔案轉至 sd.img 這個檔案
cat MLO u-boot u-boot.bin u-boot.img > sd.img
接著執行:
qemu-system-arm -M beagle -nographic -sd sd.img
我們會看到 U-boot 2012.07 已經啟動,但是因為沒有核心所以無法開機並且會在此處
當掉,我們會在之後的教學中進行說明如何繼續往下作。
U-Boot SPL 2012.07 (Oct 04 2012 - 11:43:34)
Texas Instruments Revision detection unimplemented
OMAP SD/MMC: 0
mmc_init_stream: timedout waiting for cc!
spl: mmc init failed: err - -19
### ERROR ### Please RESET the board ###
請按 Ctrl+a x 跳出 Qemu
ARM Qemu 的使用:
ARM Qemu 的使用:
0. 看 Qemu 的 Help
qemu-system-arm -help
會跑出一堆 Qemu 的使用說明,請參考原廠手冊
http://wiki.qemu.org/Manual
1. 看 Qemu 的版本
qemu-system-arm -version
QEMU emulator version 0.14.1, Copyright (c) 2003-2008 Fabrice Bellard
2. 看 Qemu 所支援的 ARM 平台
qemu-system-arm -M ?
Supported machines are:
z2 Zipit Z2 (PXA27x)
xilinx-zynq-a9 Xilinx Zynq Platform Baseboard for Cortex-A9
vexpress-a9 ARM Versatile Express for Cortex-A9
vexpress-a15 ARM Versatile Express for Cortex-A15
versatilepb ARM Versatile/PB (ARM926EJ-S)
versatileab ARM Versatile/AB (ARM926EJ-S)
tosa Tosa PDA (PXA255)
lm3s811evb Stellaris LM3S811EVB
lm3s6965evb Stellaris LM3S6965EVB
akita Akita PDA (PXA270)
spitz Spitz PDA (PXA270)
borzoi Borzoi PDA (PXA270)
terrier Terrier PDA (PXA270)
realview-eb ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8 ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9 ARM RealView Platform Baseboard Explore for Cortex-A9
cheetah Palm Tungsten|E aka. Cheetah PDA (OMAP310)
overo Gumstix Overo board (OMAP3530)
sx1 Siemens SX1 (OMAP310) V2
sx1-v1 Siemens SX1 (OMAP310) V1
n800 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810 Nokia N810 tablet aka. RX-44 (OMAP2420)
n900 Nokia N900 (OMAP3)
musicpal Marvell 88w8618 / MusicPal (ARM926EJ-S)
mainstone Mainstone II (PXA27x)
kzm ARM KZM Emulation Baseboard (ARM1136)
integratorcp ARM Integrator/CP (ARM926EJ-S) (default)
highbank Calxeda Highbank (ECX-1000)
connex Gumstix Connex (PXA255)
verdex Gumstix Verdex (PXA270)
nuri Samsung NURI board (Exynos4210)
smdkc210 Samsung SMDKC210 board (Exynos4210)
collie Collie PDA (SA-1110)
beagle Beagle board (OMAP3530)
beaglexm Beagle board XM (OMAP3630)
none empty machine
但是官方版 qemu 沒有支援 beagle 平台,因此我們要自行安裝 qemu linaro 版。
其網址如下:
https://launchpad.net/qemu-linaro
而下載網址如下:
https://launchpad.net/qemu-linaro/trunk/2012.09/+download/qemu-linaro-1.2.0-2012.09.tar.gz
請下載此檔案,然後依據上次編譯流程來編譯 Qemu linaro 版,並安裝在自己主機上。
安裝完畢後請執行
qemu-system-arm -M ?
看有沒有支援 beagle 平台。
2012年9月26日 星期三
qemu 下載與安裝
1. 下載:
Qemu 下載網頁 - http://wiki.qemu.org/Download
2. 解壓縮:
tar xfva qemu-2.5.0.tar.bz2
解開後會出現 qemu-2.5.0 目錄
3. 設定前安裝套件:
libtool
zlib1g-dev
pkg-config
libsdl1.2-dev
libcurl4-openssl-dev
libsasl2-dev
libaio-dev
libvde-dev
libvdeplug2-dev
uuid-dev
libcap-ng-dev
4. 設定:
在 qemu-2.5.0 目錄下執行:
./configure
請注意底下兩個參數一定要設定成功:
SDL support yes
KVM support yes
如果有類似底下訊息時:
lzo support no
bzip2 support no
我們可以編輯 configure 這個檔案,搜尋 bzip2 與 lzo 這兩個關鍵字,此時會發現有底下片段,分別是:
if test "$bzip2" = "yes"; then
feature_not_found "libbzip2" "Install libbzip2 devel"
fi
以及
if test "$lzo" = "yes"; then
feature_not_found "liblzo2" "Install liblzo2 devel"
fi
這表示我們的系統中沒有安裝 bzip2 devel 以及 lzo devel 套件,在 Debian 底下,此兩個套件的名稱為:
libbz2-dev
liblzo2-dev
將上述兩個套件安裝,再執行 ./configure 後會發現 lzo 及 bzip2 都已支援,其訊息如下:
lzo support yes
bzip2 support yes
其它找不到套件的訊息依此類推來解決,理論上可以作到的訊息如下:
./configure
Disabling libtool due to broken toolchain support
Install prefix /usr/local
BIOS directory /usr/local/share/qemu
binary directory /usr/local/bin
library directory /usr/local/lib
module directory /usr/local/lib/qemu
libexec directory /usr/local/libexec
include directory /usr/local/include
config directory /usr/local/etc
local state directory /usr/local/var
Manual directory /usr/local/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path /home/herman/tmp/qemu/qemu-2.5.0
C compiler cc
Host C compiler cc
C++ compiler c++
Objective-C compiler cc
ARFLAGS rv
CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g
QEMU_CFLAGS -I/usr/include/pixman-1 -fPIE -DPIE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/include/libpng12 -I/usr/local/include/spice-server -I/usr/local/include/cacard -I/usr/local/include -I/usr/local/include/spice-1 -I/usr/include/nss -I/usr/include/nspr -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/local/include/cacard -I/usr/include/nss -I/usr/include/nspr -I/usr/local/include/libusb-1.0 -I/usr/local/include
LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g
make make
install install
python python -B
smbd /usr/sbin/smbd
module support no
host CPU x86_64
host big endian no
target list aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblaze-softmmu microblazeel-softmmu mips-softmmu mips64-softmmu mips64el-softmmu mipsel-softmmu moxie-softmmu or32-softmmu ppc-softmmu ppc64-softmmu ppcemb-softmmu s390x-softmmu sh4-softmmu sh4eb-softmmu sparc-softmmu sparc64-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensa-softmmu xtensaeb-softmmu aarch64-linux-user alpha-linux-user arm-linux-user armeb-linux-user cris-linux-user i386-linux-user m68k-linux-user microblaze-linux-user microblazeel-linux-user mips-linux-user mips64-linux-user mips64el-linux-user mipsel-linux-user mipsn32-linux-user mipsn32el-linux-user or32-linux-user ppc-linux-user ppc64-linux-user ppc64abi32-linux-user ppc64le-linux-user s390x-linux-user sh4-linux-user sh4eb-linux-user sparc-linux-user sparc32plus-linux-user sparc64-linux-user tilegx-linux-user unicore32-linux-user x86_64-linux-user
tcg debug enabled no
gprof enabled no
sparse enabled no
strip binaries yes
profiler no
static build no
pixman system
SDL support yes
GTK support yes
GTK GL support no
GNUTLS support no
GNUTLS hash no
libgcrypt yes
nettle no ()
libtasn1 yes
VTE support yes
curses support yes
virgl support no
curl support yes
mingw32 support no
Audio drivers oss
Block whitelist (rw)
Block whitelist (ro)
VirtFS support no
VNC support yes
VNC SASL support yes
VNC JPEG support yes
VNC PNG support yes
xen support no
brlapi support yes
bluez support yes
Documentation yes
PIE yes
vde support yes
netmap support no
Linux AIO support yes
ATTR/XATTR support yes
Install blobs yes
KVM support yes
RDMA support no
TCG interpreter no
fdt support yes
preadv support yes
fdatasync yes
madvise yes
posix_madvise yes
sigev_thread_id yes
uuid support yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
Trace backends nop
spice support yes (0.12.7/0.12.5)
rbd support yes
xfsctl support yes
smartcard support yes
libusb yes
usb net redir yes
OpenGL support no
libiscsi support yes
libnfs support no
build guest agent yes
QGA VSS support no
QGA w32 disk info no
QGA MSI support no
seccomp support yes
coroutine backend ucontext
coroutine pool yes
GlusterFS support no
Archipelago support no
gcov gcov
gcov enabled no
TPM support yes
libssh2 support yes
TPM passthrough yes
QOM debugging yes
vhdx yes
lzo support yes
snappy support no
bzip2 support yes
NUMA host support no
tcmalloc support no
jemalloc support no
5. 編譯 qemu
請在設定完成後執行:
make -j 8 (8 核)
6. 安裝
請以 root 權限執行底下指令:
make install
將 qemu 安裝在 /usr/local/bin 目錄下
7. 測試
X86 版本:
請執行底下指令:
$ qemu-system-x86_64 -version
qemu-system-x86_64: error while loading shared libraries: libiscsi.so.1: cannot open shared object file: No such file or directory
我們會看到 qemu-system-x86_64 抱怨找不到 libiscsi.so.1,這最主要的原因目前的 libiscsi 這個動態連結函式庫的檔名已經是 libiscsi.so.2 了,所以 qemu 找不到 libiscsi.so.1,要解決此問題,我們要手動新增這個檔案,請以 root 權限切換至 /usr/lib/x86_64-linux-gnu 目錄,執行:
/usr/lib/x86_64-linux-gnu# ls -l libiscsi.so*
lrwxrwxrwx 1 root root 18 Jul 31 2014 libiscsi.so -> libiscsi.so.2.1.12
lrwxrwxrwx 1 root root 18 Jul 31 2014 libiscsi.so.2 -> libiscsi.so.2.1.12
-rw-r--r-- 1 root root 143344 Jul 31 2014 libiscsi.so.2.1.12
可以看到目前只有 libiscsi.so.2 這個檔案,在此目錄中要再新增 libiscsi.so.1 連結檔,指令如下:
/usr/lib/x86_64-linux-gnu# ln -s libiscsi.so.2.1.12 libiscsi.so.1
之後可以再執行 ls 確認一下連結檔是否已建立成功:
/usr/lib/x86_64-linux-gnu# ls -l libiscsi*
-rw-r--r-- 1 root root 223084 Jul 31 2014 libiscsi.a
lrwxrwxrwx 1 root root 18 Jul 31 2014 libiscsi.so -> libiscsi.so.2.1.12
lrwxrwxrwx 1 root root 18 Mar 25 10:43 libiscsi.so.1 -> libiscsi.so.2.1.12
lrwxrwxrwx 1 root root 18 Jul 31 2014 libiscsi.so.2 -> libiscsi.so.2.1.12
-rw-r--r-- 1 root root 143344 Jul 31 2014 libiscsi.so.2.1.12
此時再執行 qemu 即沒有問題:
$ qemu-system-x86_64 -version
QEMU emulator version 2.5.0, Copyright (c) 2003-2008 Fabrice Bellard
qemu-system-arm -M ?
可以看到 qemu arm 模擬器的資訊
qemu-system-arm -version
可以看到 qemu 模擬器版本資訊
QEMU emulator version 1.2.0, Copyright (c) 2003-2008 Fabrice Bellard
2012年6月12日 星期二
暑假作業
暑假作業
1. 課本看到第 15 章,並作每一個作業,自己寫不要看解答。
以下作業自行 Google
-------------------------------------
0. 建立 Linux 底下程式開發環境 -> 使用我講義中的流程
1. 將暑假作業全部以 Linux 環境來開發
2. 弄清楚 C 的結構該如定義
3. 寫基本貪食蛇程式 -> 以 X 視窗的繪圖函式庫來撰寫
4. 迷官貪食蛇
迷宮大小為 400x400 個點
貪食蛇的點為 5x5,初始長度為 5(五個點排在一起)
有三顆食物,以亂數方式出現,當其中一個被吃掉時,會在另一個地方出現,
但是不得在:牆壁、另二顆食物、貪食蛇身體出現。
按 P 暫停、按 Q 結束、按 S 重來。上、下、左、右 鍵控制貪食蛇移動。
-------------------------------------
俄羅斯方塊 (Optional)
-------------------------------------
讀以下網頁
http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/AlgorithmGossip.htm
google 資料結構 樹
1. 什麼是樹
2. 樹的應用
3. 如何搜尋
2012年5月30日 星期三
安裝執行 Blender
1. 請至 blender 網頁下載 Blender 檔案:
http://www.blender.org/download/get-blender/
下載 blender-2.63a-linux-glibc27-i686.tar.bz2
2. 將此檔案解壓縮至 /usr/local
/usr/local# tar jxfv 目錄/blender-2.63a-linux-glibc27-i686.tar.bz2
此時會解開一個 blender-2.63a-linux-glibc27-i686 目錄,其完整路徑為
/usr/local/blender-2.63a-linux-glibc27-i686
3. 在 /usr/local/bin 建一個 blender 之連結
/usr/local/bin# ln -s /usr/local/blender-2.63a-linux-glibc27-i686/blender .
4. 呼叫 Blender
在選單中啟動 Blender 或是直接輸入 blender,看是不是最新的 2.63a 版
5. 畫薑餅人
http://wiki.blender.org/index.php/Doc:2.4/Manual/Your_First_Animation/1.A_static_Gingerbread_Man
5. 畫薑餅人
http://wiki.blender.org/index.php/Doc:2.4/Manual/Your_First_Animation/1.A_static_Gingerbread_Man
2012年5月23日 星期三
自編 Linux 核心
自編 Linux 核心
為什麼要自己編 Linux 核心 ?
缺點:程度還沒到那邊的人,編出來的核心有時候開機會當機。
優點:
1. 修正舊核心的 bug
2. 支援新的硬體
3. 針對自己主機的硬體進行最佳化
4. 關閉不必要的核心模組,精簡編譯完之核心大小
如何挑核心
Linux 有一個存放核心的官方網站 (https://www.kernel.org/),在此網站中會有各個版本的最新核心,我們為了要調整自己使用機器之效能,因此必須要自行編譯核心,在核心官方網站中有三個種類的核心可下載,分別是:
- mainline - 目前開發版本,主要目的是加入新功能及測試,不建議在伺服器/嵌入式系統中使用,以免有未修正之 bug 導致機器不穩。
- stable - 穩定版核心,可提供日常使用
- longterm - 此版核心又稱為 LTS (Long Term Support - 長期支援) 核心,主要目的在於修正已知 bug,非常適合伺服器/嵌入式系統中使用。
如何編核心
1. 安裝程式編譯環境
2. 安裝核心編譯環境
3. 下載核心
4. 編譯核心
5. 安裝核心
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
1. 安裝程式編譯環境
編譯 Linux 核心主要會使用到 GCC,在安裝 GCC 之前,我們可以看一下目前系統的 Linux 核心是由那一版的 GCC 所編譯完成,請執行:
$ dmesg | more
可以看到底下片段:
[ 0.000000] Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01
-17)
此訊息告訴我們 Linux 核心是由 gcc 4.8.4 所編譯完成,因此如果我們安裝 GCC 的話,以 4.8.4 (以上) 為主。
編譯 Linux 核心主要會使用到 GCC,在安裝 GCC 之前,我們可以看一下目前系統的 Linux 核心是由那一版的 GCC 所編譯完成,請執行:
$ dmesg | more
可以看到底下片段:
[ 0.000000] Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01
-17)
此訊息告訴我們 Linux 核心是由 gcc 4.8.4 所編譯完成,因此如果我們安裝 GCC 的話,以 4.8.4 (以上) 為主。
請安裝
gcc-4.8
cpp-4.8
g++-4.8
這三個套件,其中每個套件各有兩個版本:
gcc
gcc-4.8
gcc-4.9
cpp
cpp-4.8
cpp-4.9
g++
g++-4.8
g++-4.9
我們可以在 /usr/bin 目錄中看到目前的版本為何,或是執行以下指令:
gcc -v
cpp -v
g++ -v
如果我們至 /usr/bin 目錄下執行
ls -l gcc* cpp* g++*
會看到以下輸出:
lrwxrwxrwx 1 root root 7 3月 4 10:05 cpp -> cpp-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 cpp-4.8
-rwxr-xr-x 1 root root 833080 12月 26 2014 cpp-4.9
lrwxrwxrwx 1 root root 7 3月 4 10:05 g++ -> g++-4.8
-rwxr-xr-x 1 root root 776696 12月 20 2014 g++-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 gcc -> gcc-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 gcc-4.8
-rwxr-xr-x 1 root root 24736 12月 20 2014 gcc-ar-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-nm-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-ranlib-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 cpp -> cpp-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 cpp-4.8
-rwxr-xr-x 1 root root 833080 12月 26 2014 cpp-4.9
lrwxrwxrwx 1 root root 7 3月 4 10:05 g++ -> g++-4.8
-rwxr-xr-x 1 root root 776696 12月 20 2014 g++-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 gcc -> gcc-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 gcc-4.8
-rwxr-xr-x 1 root root 24736 12月 20 2014 gcc-ar-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-nm-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-ranlib-4.8
這表示上述三個命令都聯結到 4.8 版,全部的聯結版本都要一致才行。檢查方式是執行:
$ gcc -v
$ g++ -v
$ cpp -v
$ gcc -v
$ g++ -v
$ cpp -v
來觀看版本編號,安裝完畢後請編譯 hello.c,指令如下:
gcc hello.c -o hello
再執行
./hello
如果出現 Hello world!! 即代表我們的程式編譯環境安裝 OK!!
2. 安裝核心編譯環境
請安裝以下套件才可編譯核心
kernel-package
libncurses5-dev
bzip2
xz-utils
3. 下載核心
國內 Linux 核心映站在:
linux.cdpa.nsysu.edu.tw (與底下那台合併了)
ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v4.x/
ftp.isu.edu.tw
請將 Linux 核心下載至 /usr/src 目錄,我們以 4.4.23 為例,請下載
linux-4.4.23.tar.xz
附帶一提:xz 格式是目前壓縮率最高之非失真壓縮演算法
(失真壓縮演算法->jpg)
3.5 解壓縮
請在 /usr/src 目錄執行:
/usr/src/ # tar xfva linux-4.4.23.tar.xz
此時會出現一個 linux-4.4.23 的目錄,我們要建一個 link
/usr/src/ # ln -s linux-4.4.23 linux
4. 編譯核心
a. /usr/src # cd linux
a.5 複製已存在核心編譯參數,注意那個點!!
/usr/src/linux # cp /boot/config-3.16.0-4-amd64 .config
b. 設定編譯核心參數
/usr/src/linux # make menuconfig
General setup --->
Kernel compression mode (XZ) --->
Processor type and features --->
Processor family (Core 2/newer Xeon) --->
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) ---
IP: Netfilter Configuration ---> M
IPv6: Netfilter Configuration ---> M
修改完畢後退出 Linux 核心編譯的設定畫面。
/usr/src/linux # make menuconfig
General setup --->
Kernel compression mode (XZ) --->
Processor type and features --->
Processor family (Core 2/newer Xeon) --->
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) ---
IP: Netfilter Configuration ---> M
IPv6: Netfilter Configuration ---> M
c. time make-kpkg --initrd --revision=1.0.lpm kernel_image -j8
編譯完成後,你會有一個檔案叫:
/usr/src/linux-image-4.4.23_1.0.lpm_amd64.deb
我們再來安裝此檔即可,安裝指令如下:
/usr/src # dpkg -i linux-image-4.4.23_1.0.lpm_amd64.deb
/usr/src # dpkg -i linux-image-4.4.23_1.0.lpm_amd64.deb
d. 我們編譯到一半如果出現錯誤的話,該如何解決 ? 例如:
H16TOFW firmware/matrox/g200_warp.fw
H16TOFW firmware/matrox/g400_warp.fw
make[1]: Leaving directory `/usr/src/linux-3.3.7'
/usr/bin/make -j2 ARCH=i386 \
-C Documentation/lguest
make: *** Documentation/lguest: 沒有此一檔案或目錄. Stop.
make: *** [debian/stamp/build/kernel] Error 2
real 38m37.627s
user 65m58.119s
sys 5m21.180s
上述的問題是 LGUEST 不存在,因此我們看 .config 這檔案,將裡面的 LGUEST 設定
完全註記,再重新執行一次 make menuconfig (回到步驟 b)。
5. 安裝核心
/usr/src# dpkg -i linux-image-4.1.18_1.0.lpm_amd64.deb
其畫面如下:
選取了原先未選的套件 linux-image-4.1.18。
(讀取資料庫 ... 目前共安裝了 79198 個檔案和目錄。)
Preparing to unpack linux-image-4.1.18_1.0.lpm_amd64.deb ...
Done.
Unpacking linux-image-4.1.18 (1.0.lpm) ...
設定 linux-image-4.1.18 (1.0.lpm) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.1.18 /boot/vmlinuz-4.1.18
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.1.18 /boot/vmlinuz-4.1.18
update-initramfs: Generating /boot/initrd.img-4.1.18
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.1.18 /boot/vmlinuz-4.1.18
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.1.18
Found initrd image: /boot/initrd.img-4.1.18
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
/usr/src# dpkg -i linux-image-4.1.18_1.0.lpm_amd64.deb
其畫面如下:
選取了原先未選的套件 linux-image-4.1.18。
(讀取資料庫 ... 目前共安裝了 79198 個檔案和目錄。)
Preparing to unpack linux-image-4.1.18_1.0.lpm_amd64.deb ...
Done.
Unpacking linux-image-4.1.18 (1.0.lpm) ...
設定 linux-image-4.1.18 (1.0.lpm) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.1.18 /boot/vmlinuz-4.1.18
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.1.18 /boot/vmlinuz-4.1.18
update-initramfs: Generating /boot/initrd.img-4.1.18
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.1.18 /boot/vmlinuz-4.1.18
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.1.18
Found initrd image: /boot/initrd.img-4.1.18
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
如果安裝過程中有一些 missing firmware 的訊息,這是表示某些 firmware 沒有裝的意思,請直接安裝此套件,再重裝一次核心即可修正。
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
2012年5月16日 星期三
如何架設 www 伺服器 ?
1. 有那些 web server 程式 ?
在 aptitude 底下找 httpd,我們會發現這是一個 v 的套件,按 Enter 看其內容。我們可以看到目前有許多 www 伺服器套件,如下所示:
p nginx 0.7.67-3+squeeze2
p monkey 0.9.3-1
p boa 0.94.14rc21-3.1
p cherokee 1.0.8-5+squeeze1
p nginx-naxsi 1.1.19-1~bpo60+1
p nginx-light 1.1.19-1~bpo60+1
p nginx-full 1.1.19-1~bpo60+1
p nginx-extras 1.1.19-1~bpo60+1
p dhttpd 1.02a-18
p ocsigen 1.3.3-1squeeze1
p lighttpd 1.4.28-2+squeeze1
p mathopd 1.5p6-1.1
p tntnet 1.6.3-4
p mini-httpd 1.19-9.2
p webfs 1.21+ds1-8
p yaws 1.88-2
i A apache2-mpm-worker 2.2.16-6+squeeze7
p apache2-mpm-prefork 2.2.16-6+squeeze7
p apache2-mpm-itk 2.2.16-6+squeeze7
p apache2-mpm-event 2.2.16-6+squeeze7
p thttpd 2.25b-11
p aolserver4-daemon 4.5.1-12
p aolserver4-core 4.5.1-12
p micro-httpd 20051212-12
p bozohttpd 20100621-1
p ebhttpd 1:1.0.dfsg.1-4.1
以上套件只要安裝一個就可以啟動 www 伺服器功能,以 RHCE 來說,所採用之 web server 為 apache。
2. 安裝 apache
# apt-get install apache2
即可安裝,安裝完後請以 firefox 開啟 http://127.0.0.1
3. 設定 Virtual Host
假設我們所架的 www 伺服器要能夠支援三個網域的服務,分別如下所示:
www.debian.example.com.tw
wyvern.example.com
localhost
那麼我們該如何設定 ?
3.1 設定 /etc/hosts 如以下所示:
192.168.1.21 wyvern.example.com wyvern
192.168.1.21 www.debian.example.com.tw
(上面的 IP 請改為自己的 IP),改完 /etc/hosts 後可以 ping 看看能不能 ping 到主機。
3.2 設定 /etc/apache2/httpd.conf 如下所示:
NameVirtualHost 192.168.1.21
<VirtualHost www.debian.example.com.tw>
DocumentRoot /home/debian
ServerName www.debian.example.com.tw
</VirtualHost>
<VirtualHost wyvern.example.com>
DocumentRoot /home/wyvern
ServerName wyvern.example.com
</VirtualHost>
3.3 設定 index.html -> 開啟網頁預定之檔案。
/home/debian/index.html 之內容如下:
This is debian.
/home/wyvern/index.html 之內容如下:
This is wyvern.
4. 重新載入 web 設定:
/etc/init.d/apache2 reload
5. 測試:
5.1 以 localhost 開啟網頁看結果如何 ?
5.2 以 www.debian.example.com.tw 開啟網頁看結果如何 ?
5.3 以 wyvern.example.com 開啟網頁看結果如何 ?
6. 收工
在 aptitude 底下找 httpd,我們會發現這是一個 v 的套件,按 Enter 看其內容。我們可以看到目前有許多 www 伺服器套件,如下所示:
p nginx 0.7.67-3+squeeze2
p monkey 0.9.3-1
p boa 0.94.14rc21-3.1
p cherokee 1.0.8-5+squeeze1
p nginx-naxsi 1.1.19-1~bpo60+1
p nginx-light 1.1.19-1~bpo60+1
p nginx-full 1.1.19-1~bpo60+1
p nginx-extras 1.1.19-1~bpo60+1
p dhttpd 1.02a-18
p ocsigen 1.3.3-1squeeze1
p lighttpd 1.4.28-2+squeeze1
p mathopd 1.5p6-1.1
p tntnet 1.6.3-4
p mini-httpd 1.19-9.2
p webfs 1.21+ds1-8
p yaws 1.88-2
i A apache2-mpm-worker 2.2.16-6+squeeze7
p apache2-mpm-prefork 2.2.16-6+squeeze7
p apache2-mpm-itk 2.2.16-6+squeeze7
p apache2-mpm-event 2.2.16-6+squeeze7
p thttpd 2.25b-11
p aolserver4-daemon 4.5.1-12
p aolserver4-core 4.5.1-12
p micro-httpd 20051212-12
p bozohttpd 20100621-1
p ebhttpd 1:1.0.dfsg.1-4.1
以上套件只要安裝一個就可以啟動 www 伺服器功能,以 RHCE 來說,所採用之 web server 為 apache。
2. 安裝 apache
# apt-get install apache2
即可安裝,安裝完後請以 firefox 開啟 http://127.0.0.1
3. 設定 Virtual Host
假設我們所架的 www 伺服器要能夠支援三個網域的服務,分別如下所示:
www.debian.example.com.tw
wyvern.example.com
localhost
那麼我們該如何設定 ?
3.1 設定 /etc/hosts 如以下所示:
192.168.1.21 wyvern.example.com wyvern
192.168.1.21 www.debian.example.com.tw
(上面的 IP 請改為自己的 IP),改完 /etc/hosts 後可以 ping 看看能不能 ping 到主機。
3.2 設定 /etc/apache2/httpd.conf 如下所示:
NameVirtualHost 192.168.1.21
<VirtualHost www.debian.example.com.tw>
DocumentRoot /home/debian
ServerName www.debian.example.com.tw
</VirtualHost>
<VirtualHost wyvern.example.com>
DocumentRoot /home/wyvern
ServerName wyvern.example.com
</VirtualHost>
3.3 設定 index.html -> 開啟網頁預定之檔案。
/home/debian/index.html 之內容如下:
This is debian.
/home/wyvern/index.html 之內容如下:
This is wyvern.
4. 重新載入 web 設定:
/etc/init.d/apache2 reload
5. 測試:
5.1 以 localhost 開啟網頁看結果如何 ?
5.2 以 www.debian.example.com.tw 開啟網頁看結果如何 ?
5.3 以 wyvern.example.com 開啟網頁看結果如何 ?
6. 收工
2012年5月2日 星期三
在 Debian 底下建置 Android 開發環境
1. 請至 Eclipse 網站下載最新版之 Eclipse 軟體,其下載位置如下:
http://www.eclipse.org/downloads/
下載 eclipse-jee-indigo-SR2-linux-gtk.tar.gz
tar xfvz eclipse-jee-indigo-SR2-linux-gtk.tar.gz
將此檔案解開至 eclipse 目錄,並執行
mv eclipse ~/
將 eclipse 移至家目錄
2. 啟動 eclipse
~/eclipse $ ./eclipse
3. 下載 android SDK
http://developer.android.com/sdk/index.html
下載最新版,目前最新版為 android-sdk_r18-linux.tgz
在 ~/ 下建立 android 目錄,並將 android-sdk_r18-linux.tgz 放至此目錄。
~/android $ tar xfvz android-sdk_r18-linux.tgz
此時會解開一個 android-sdk-linux 目錄
4. 安裝 android 開發環境
在 eclipse 的選單中,選擇 Help -> Install New Software...
然後按 Add 按鍵,在 Add 視窗出現時,請在
Name 欄位填 ADT Plugin
Location 欄位填 https://dl-ssl.google.com/android/eclipse/
然後按 OK
5. http://developer.android.com/sdk/eclipse-adt.html
6. Android SDK -> 請在 Window -> Android SDK Manager 中設定,並下載 Android SDK。等一段時間後,SDK 會安裝完畢。
7. AVD Manager -> 請在 Window -> AVD Manager 去新增一個 Android Device,並按 Start 啟動 Android 虛擬機器。
以上流程為 Android 開發環境建置說明。
8 網路上 Android 程式開發資源:
Android 教學| 孫傳雄研究室| Android 教學
蓋索林的Android 空間
http://www.eclipse.org/downloads/
下載 eclipse-jee-indigo-SR2-linux-gtk.tar.gz
tar xfvz eclipse-jee-indigo-SR2-linux-gtk.tar.gz
將此檔案解開至 eclipse 目錄,並執行
mv eclipse ~/
將 eclipse 移至家目錄
2. 啟動 eclipse
~/eclipse $ ./eclipse
3. 下載 android SDK
http://developer.android.com/sdk/index.html
下載最新版,目前最新版為 android-sdk_r18-linux.tgz
在 ~/ 下建立 android 目錄,並將 android-sdk_r18-linux.tgz 放至此目錄。
~/android $ tar xfvz android-sdk_r18-linux.tgz
此時會解開一個 android-sdk-linux 目錄
4. 安裝 android 開發環境
在 eclipse 的選單中,選擇 Help -> Install New Software...
然後按 Add 按鍵,在 Add 視窗出現時,請在
Name 欄位填 ADT Plugin
Location 欄位填 https://dl-ssl.google.com/android/eclipse/
然後按 OK
5. http://developer.android.com/sdk/eclipse-adt.html
6. Android SDK -> 請在 Window -> Android SDK Manager 中設定,並下載 Android SDK。等一段時間後,SDK 會安裝完畢。
7. AVD Manager -> 請在 Window -> AVD Manager 去新增一個 Android Device,並按 Start 啟動 Android 虛擬機器。
以上流程為 Android 開發環境建置說明。
8 網路上 Android 程式開發資源:
Android 教學| 孫傳雄研究室| Android 教學
蓋索林的Android 空間
安裝 FTP (File Transfer Protocal) 套件
安裝 FTP (File Transfer Protocal) 套件:
1. 請以 root 權限安裝
proftpd-basic 套件
安裝完畢後,其設定檔在 /etc/proftpd 目錄中
2. 啟動/停止/重啟 ftp
/etc/init.d/proftpd start/stop/restart
3. 開啟暱名權限
開啟公共檔案在 FTP 伺服器上以供暱名帳號連線,不需特別的帳號/密碼。要開啟暱名權限,請編輯 /etc/proftpd/proftpd.conf 這個設定檔,找到以下段落:
# <Anonymous ~ftp>
# User ftp
# Group nogroup
..
..
# </Anonymous>
將前面的 # 移除掉,並執行
# /etc/init.d/proftpd restart
重新啟動 proftpd 伺服器,並在 firefox 中開啟:ftp://127.0.0.1 或是 ftp://localhost 看能否開啟 ftp 目錄而且無需帳號/密碼。
/home/ftp -> ftp 開放目錄
如何連線至 FTP 主機 ?
要連線至 FTP 必須使用 FTP Client,常見的 Windows 版 FTP Client 有 Cuteftp 以及 Filezilla,其中 Filezilla 是自由軟體,因此推薦各位使用。至於在 Linux 底下的 FTP Client 有 gftp 以及命令列的 ncftp。以下說明以命令列的 ncftp 為主:
1. 一般帳號如何連線
ncftp -u 使用者 主機 -> ncftp -u herman localhost
此時會出現以下畫面:
NcFTP 3.2.4 (Apr 07, 2010) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 127.0.0.1...
ProFTPD 1.3.3a Server (Debian) [::ffff:127.0.0.1]
Logging in...
Password requested by 127.0.0.1 for user "herman".
Password required for herman
Password:
我們要輸入密碼以便連線,連線成功後,我們可以使用命令模式來進行操作。以下介紹幾個指令:
cd 目錄 -> 切換目錄
bi -> 切換至 2 進位模式 (傳 rar、zip、avi、mp3 .. 等檔案用)
as -> 切換至 ascii 模式 (傳純文字檔使用)
get -> 自遠端主機下載資料
put -> 將本機的資料上傳至遠端主機(先確定我們有上傳權限)
lls、lcd、lpwd -> 自機端之 ls、cd、pwd (local ls、local cd、lpwd)
by -> 離開 ftp
練習:
1. a. 新增帳號 hunter、密碼 hunter123、家目錄在 /home/hunter
hunter 目錄下有三個檔案,其檔名為 a、b、c,內容為:
This is file a/b/c
b. 架設 proftp 伺服器軟體,開放 hunter 登入
c. 二二一組,以 hunter 帳號登入對方主機,並練習抓檔案、上傳檔案
1. 請以 root 權限安裝
proftpd-basic 套件
安裝完畢後,其設定檔在 /etc/proftpd 目錄中
2. 啟動/停止/重啟 ftp
/etc/init.d/proftpd start/stop/restart
3. 開啟暱名權限
開啟公共檔案在 FTP 伺服器上以供暱名帳號連線,不需特別的帳號/密碼。要開啟暱名權限,請編輯 /etc/proftpd/proftpd.conf 這個設定檔,找到以下段落:
# <Anonymous ~ftp>
# User ftp
# Group nogroup
..
..
# </Anonymous>
將前面的 # 移除掉,並執行
# /etc/init.d/proftpd restart
重新啟動 proftpd 伺服器,並在 firefox 中開啟:ftp://127.0.0.1 或是 ftp://localhost 看能否開啟 ftp 目錄而且無需帳號/密碼。
/home/ftp -> ftp 開放目錄
如何連線至 FTP 主機 ?
要連線至 FTP 必須使用 FTP Client,常見的 Windows 版 FTP Client 有 Cuteftp 以及 Filezilla,其中 Filezilla 是自由軟體,因此推薦各位使用。至於在 Linux 底下的 FTP Client 有 gftp 以及命令列的 ncftp。以下說明以命令列的 ncftp 為主:
1. 一般帳號如何連線
ncftp -u 使用者 主機 -> ncftp -u herman localhost
此時會出現以下畫面:
NcFTP 3.2.4 (Apr 07, 2010) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 127.0.0.1...
ProFTPD 1.3.3a Server (Debian) [::ffff:127.0.0.1]
Logging in...
Password requested by 127.0.0.1 for user "herman".
Password required for herman
Password:
我們要輸入密碼以便連線,連線成功後,我們可以使用命令模式來進行操作。以下介紹幾個指令:
cd 目錄 -> 切換目錄
bi -> 切換至 2 進位模式 (傳 rar、zip、avi、mp3 .. 等檔案用)
as -> 切換至 ascii 模式 (傳純文字檔使用)
get -> 自遠端主機下載資料
put -> 將本機的資料上傳至遠端主機(先確定我們有上傳權限)
lls、lcd、lpwd -> 自機端之 ls、cd、pwd (local ls、local cd、lpwd)
by -> 離開 ftp
練習:
1. a. 新增帳號 hunter、密碼 hunter123、家目錄在 /home/hunter
hunter 目錄下有三個檔案,其檔名為 a、b、c,內容為:
This is file a/b/c
b. 架設 proftp 伺服器軟體,開放 hunter 登入
c. 二二一組,以 hunter 帳號登入對方主機,並練習抓檔案、上傳檔案
2012年4月25日 星期三
如何在 Debian Linux 安裝/設定 Arduino 環境
自編 Linux 核心
為什麼要自己編 Linux 核心 ?
缺點:程度還沒到那邊的人,編出來的核心有時候開機會當機。
優點:
1. 修正舊核心的 bug
2. 支援新的硬體
3. 針對自己主機的硬體進行最佳化
如何編核心
1. 安裝程式編譯環境
2. 安裝核心編譯環境
3. 下載核心
4. 編譯核心
5. 安裝核心
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
2. 安裝核心編譯環境
請安裝以下套件才可編譯核心
kernel-package
libncurses5-dev
bzip2
xz-utils
3. 下載核心
國內 Linux 核心映站在:
linux.cdpa.nsysu.edu.tw (與底下那台合併了)
ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/
ftp.isu.edu.tw
請將 Linux 核心下載至 /usr/src 目錄,我們以 3.3.7 為例,請下載
linux-3.3.7.tar.xz
d. 我們編譯到一半如果出現錯誤的話,該如何解決 ? 例如:
H16TOFW firmware/matrox/g200_warp.fw
H16TOFW firmware/matrox/g400_warp.fw
make[1]: Leaving directory `/usr/src/linux-3.3.7'
/usr/bin/make -j2 ARCH=i386 \
-C Documentation/lguest
make: *** Documentation/lguest: 沒有此一檔案或目錄. Stop.
make: *** [debian/stamp/build/kernel] Error 2
real 38m37.627s
user 65m58.119s
sys 5m21.180s
上述的問題是 LGUEST 不存在,因此我們看 .config 這檔案,將裡面的 LGUEST 設定
完全註記,再重新執行一次 make menuconfig (回到步驟 b)。
為什麼要自己編 Linux 核心 ?
缺點:程度還沒到那邊的人,編出來的核心有時候開機會當機。
優點:
1. 修正舊核心的 bug
2. 支援新的硬體
3. 針對自己主機的硬體進行最佳化
如何編核心
1. 安裝程式編譯環境
2. 安裝核心編譯環境
3. 下載核心
4. 編譯核心
5. 安裝核心
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
1. 安裝程式編譯環境
請安裝
gcc
cpp
g++
這三個套件,其中每個套件各有兩個版本:
gcc
gcc-4.3
gcc-4.4
cpp
cpp-4.3
cpp-4.4
g++
g++-4.3
g++-4.4
我們可以在 /usr/bin 目錄中看到目前的版本為何,或是執行以下指令:
gcc -v
cpp -v
g++ -v
如果我們至 /usr/bin 目錄下執行
ls -l gcc* cpp* g++*
會看到以下輸出:
lrwxrwxrwx 1 root root 7 2011-04-21 20:25 cpp -> cpp-4.4
-rwxr-xr-x 1 root root 209192 2010-09-21 21:43 cpp-4.3
-rwxr-xr-x 1 root root 218540 2010-11-14 20:30 cpp-4.4
lrwxrwxrwx 1 root root 7 2011-04-21 20:31 g++ -> g++-4.4
-rwxr-xr-x 1 root root 210376 2010-09-21 21:43 g++-4.3
-rwxr-xr-x 1 root root 219628 2010-11-14 20:30 g++-4.4
lrwxrwxrwx 1 root root 7 2011-04-21 20:31 gcc -> gcc-4.4
-rwxr-xr-x 1 root root 208232 2010-09-21 21:44 gcc-4.3
-rwxr-xr-x 1 root root 217068 2010-11-14 20:31 gcc-4.4
這表示上述三個命令都聯結到 4.4 版,全部的聯結版本都要一致才行。
安裝完畢後請編譯 hello.c,指令如下:
gcc hello.c -o hello
再執行
./hello
如果出現 Hello world!! 即代表我們的程式編譯環境安裝 OK!!
2. 安裝核心編譯環境
請安裝以下套件才可編譯核心
kernel-package
libncurses5-dev
bzip2
xz-utils
3. 下載核心
國內 Linux 核心映站在:
linux.cdpa.nsysu.edu.tw (與底下那台合併了)
ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/
ftp.isu.edu.tw
請將 Linux 核心下載至 /usr/src 目錄,我們以 3.3.7 為例,請下載
linux-3.3.7.tar.xz
附帶一提:xz 格式是目前壓縮率最高之非失真壓縮演算法
(失真壓縮演算法->jpg)
3.5 解壓縮
請在 /usr/src 目錄執行:
/usr/src/ # xz -dc linux-3.3.7.tar.xz | tar xfv -
此時會出現一個 linux-3.3.7 的目錄,我們要建一個 link
/usr/src/ # ln -s linux-3.3.7 linux
4. 編譯核心
a. /usr/src/ # cd linux
a.5 複製已存在核心編譯參數
/usr/src/ # cp /boot/config-2.6.xx .config
b. make menuconfig
c. time make-kpkg --initrd --revision=lpm.1.0 kernel_image -j 2
編譯完成後,你會有一個檔案叫:
linux-image-3.3.7_lpm.1.0_i386.deb
我們再來安裝此檔即可。
d. 我們編譯到一半如果出現錯誤的話,該如何解決 ? 例如:
H16TOFW firmware/matrox/g200_warp.fw
H16TOFW firmware/matrox/g400_warp.fw
make[1]: Leaving directory `/usr/src/linux-3.3.7'
/usr/bin/make -j2 ARCH=i386 \
-C Documentation/lguest
make: *** Documentation/lguest: 沒有此一檔案或目錄. Stop.
make: *** [debian/stamp/build/kernel] Error 2
real 38m37.627s
user 65m58.119s
sys 5m21.180s
上述的問題是 LGUEST 不存在,因此我們看 .config 這檔案,將裡面的 LGUEST 設定
完全註記,再重新執行一次 make menuconfig (回到步驟 b)。
5. 安裝核心
/usr/src# dpkg -i linux-image-3.3.7_lpm.1.0_i386.deb
其畫面如下:
選取了原先未被選取的套件 linux-image-3.3.7。
(正在讀取資料庫 ... 207468 files and directories currently installed.)
正在解開 linux-image-3.3.7 (從 linux-image-3.3.7_lpm.1.0_i386.deb)...
Examining /etc/kernel/preinst.d/
Done.
正在設定 linux-image-3.3.7 (lpm.1.0) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 3.3.7 /boot/vmlinuz-3.3.7
dkms: running auto installation service for kernel 3.3.7:
virtualbox-ose (3.2.10)...failed.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.3.7 /boot/vmlinuz-3.3.7
update-initramfs: Generating /boot/initrd.img-3.3.7
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-2.fw for module r8169
/usr/src# dpkg -i linux-image-3.3.7_lpm.1.0_i386.deb
其畫面如下:
選取了原先未被選取的套件 linux-image-3.3.7。
(正在讀取資料庫 ... 207468 files and directories currently installed.)
正在解開 linux-image-3.3.7 (從 linux-image-3.3.7_lpm.1.0_i386.deb)...
Examining /etc/kernel/preinst.d/
Done.
正在設定 linux-image-3.3.7 (lpm.1.0) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 3.3.7 /boot/vmlinuz-3.3.7
dkms: running auto installation service for kernel 3.3.7:
virtualbox-ose (3.2.10)...failed.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.3.7 /boot/vmlinuz-3.3.7
update-initramfs: Generating /boot/initrd.img-3.3.7
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-1.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8105e-1.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-3.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-1.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-1.fw for module r8169
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.3.7 /boot/vmlinuz-3.3.7
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.3.7 /boot/vmlinuz-3.3.7
Generating grub.cfg ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-3.3.7
Found initrd image: /boot/initrd.img-3.3.7
Found linux image: /boot/vmlinuz-3.0.4
Found initrd image: /boot/initrd.img-3.0.4
Found linux image: /boot/vmlinuz-2.6.39.4
Found initrd image: /boot/initrd.img-2.6.39.4
Found linux image: /boot/vmlinuz-2.6.38.4
Found initrd image: /boot/initrd.img-2.6.38.4
Found linux image: /boot/vmlinuz-2.6.32-5-686-bigmem
Found initrd image: /boot/initrd.img-2.6.32-5-686-bigmem
Found linux image: /boot/vmlinuz-2.6.32-5-686
Found initrd image: /boot/initrd.img-2.6.32-5-686
done
正在進行 readahead-fedora 的觸發程式 ...
安裝過程中有一些 missing firmware 的訊息,這是表示 firmware-realtek 沒有裝的意思,請直接安裝此套件,再重裝一次核心即可修正。
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
2012年3月28日 星期三
在 Linux 架設 NFS 伺服器
目的:自建 NFS 伺服器,提供給其它主機用。
1. 安裝 NFS 伺服器相關套件
apt-get install nfs-kernel-server
2. 修改 NFS 設定
NFS 設定檔在 /etc/exports 檔案,其內容如下:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
5. 掛載遠端 NFS 資料夾
mount -t nfs 163.26.229.xx:/hd2 /mnt
6. 開機即掛載遠端 NFS 資料夾
How ?
在 /etc/fstab 中新增一行:
192.168.10.1:/srv/ftp /home/ftp nfs ro,sync 1 2
新增完之後請以 root 權限執行:
# mount -a
看看有沒有錯誤訊息,如果沒有錯誤訊息表示可以正常掛載。
7. 我們建置虛擬網路環境,最麻煩的問題是套件都要透過網路下載,使用自建 NFS 站可以解決這個問題。其流程如下:
7.1 自建 NFS 伺服器,並將 debian 鏡像目錄分享出來
7.2 在 PXE 伺服器中掛載 NFS 目錄
7.3 將 PXE 伺服器的 /etc/apt/sources.list 中所有下載來源全部改成自有目錄,其語法如下:
deb file:///home/ftp/debian/ jessie main contrib non-free
deb file:///home/ftp/debian/ jessie-updates main
1. 安裝 NFS 伺服器相關套件
apt-get install nfs-kernel-server
2. 修改 NFS 設定
NFS 設定檔在 /etc/exports 檔案,其內容如下:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
其中 # 是註解,底下的
/srv/homes hostname1(rw,sync,no_subtree_check)
是 NFS 設定,其語法如下:
要開放之目錄 可存取之網域(存取權限)
/hd2 163.26.229.0/24(ro,sync,no_subtree_check)
163.26.229.0/24 是什麼意思 ? 指 163.26.229.* 之 IP 都可存取我們的 NFS 伺服器
255.255.255.0
11111111.11111111.11111111.00000000 -> 255.255.255.0
AND 10100011.00011010.11100101.00000000 -> 163.26.229.0
------------------------------------------------------
3. 啟動 / 重新載入 NFS 伺服器
當我們完成 NFS 設定檔案的修改後,我們必須啟動或重新載入 NFS 伺服器,以便我們將剛剛修改之設定啟用。
啟動 NFS 伺服器之設定檔指令如下:
/etc/init.d/nfs-kernel-server start
關閉 NFS 伺服器之設定檔指令如下:
/etc/init.d/nfs-kernel-server stop
重新載入 NFS 伺服器之設定檔指令如下:
/etc/init.d/nfs-kernel-server reload
觀看 NFS 伺服器目前狀態之指令如下:
/etc/init.d/nfs-kernel-server status
4. 觀看本機 NFS 伺服器分享狀態
# showmount -e localhost
IP
5. 掛載遠端 NFS 資料夾
mount -t nfs 163.26.229.xx:/hd2 /mnt
6. 開機即掛載遠端 NFS 資料夾
How ?
在 /etc/fstab 中新增一行:
192.168.10.1:/srv/ftp /home/ftp nfs ro,sync 1 2
新增完之後請以 root 權限執行:
# mount -a
看看有沒有錯誤訊息,如果沒有錯誤訊息表示可以正常掛載。
7. 我們建置虛擬網路環境,最麻煩的問題是套件都要透過網路下載,使用自建 NFS 站可以解決這個問題。其流程如下:
7.1 自建 NFS 伺服器,並將 debian 鏡像目錄分享出來
7.2 在 PXE 伺服器中掛載 NFS 目錄
7.3 將 PXE 伺服器的 /etc/apt/sources.list 中所有下載來源全部改成自有目錄,其語法如下:
deb file:///home/ftp/debian/ jessie main contrib non-free
deb file:///home/ftp/debian/ jessie-updates main
2012年2月20日 星期一
20120221 PMOS/NMOS 推導
PMOS 與 NMOS 的特色:
1. PMOS 輸入 0 開啟,輸入 1 關閉
NMOS 輸入 1 開啟,輸入 0 關閉
口訣:PINO
InOut
2. 一般來說 PMOS 接 VDD,NMOS 接 GND,因為 PMOS 可以傳遞好 1 的訊號,NMOS 可以傳遞好 0 的訊號。
什麼是 CMOS ? (金屬互補半導體)
什麼是互補 ?
1. 有 PMOS 就有 NMOS,PMOS 的數量跟 NMOS 的數量相同
2. PMOS 若為併聯,則 NMOS 為串聯,反之亦然
nor2 之真值表如下:
1. PMOS 輸入 0 開啟,輸入 1 關閉
NMOS 輸入 1 開啟,輸入 0 關閉
口訣:PINO
InOut
2. 一般來說 PMOS 接 VDD,NMOS 接 GND,因為 PMOS 可以傳遞好 1 的訊號,NMOS 可以傳遞好 0 的訊號。
什麼是 CMOS ? (金屬互補半導體)
什麼是互補 ?
1. 有 PMOS 就有 NMOS,PMOS 的數量跟 NMOS 的數量相同
2. PMOS 若為併聯,則 NMOS 為串聯,反之亦然
nor2 之真值表如下:
in1 in2 or nor and nand xor2
0 0 0 1 0 1 0
0 1 1 0 0 1 1
1 0 1 0 0 1 1
1 1 1 0 1 0 0
訂閱:
文章 (Atom)