2013年2月20日 星期三

自序

算一算,自民國 83 年起至現在,筆者玩 Linux 已經超過 17 年了,當初玩 Linux 曾經有裝過五十幾片磁碟片的,後來出了雲觀光碟可以一次搞定安裝 Slackware,再後來出了 Redhat Linux,一直到現在玩的 Debian 作業系統。我還記得當初為了要在 Linux 上看中文字得從倚天中文字形轉成 Linux 可用的格式,而 chdrv 更是當初不可或缺的工具。一開始玩 Linux 作業系統時,Linux 被眾多作業系統大廠笑稱之為「高級玩具作業系統」。的確,那時候的 Linux 比上 (Solaris、HP Unix、IBM AIX ..) 不足,比下 (Dos、 Minix ) 有餘。然而物換星移到了今天,當初許多的作業系統大廠已經消失了,而這個當年的「玩具作業系統」卻登堂入室,成為高科技產業不可或缺的一部份,從伺服器架設,Android 手機/平板、嵌入式系統乃至於機器人控制 .. 等在在可看見 Linux 的身影。

這本書是筆者累積這幾年教學經驗所整理的教學內容,其主要目的是以 Debian Linux 為基礎教導讀者一步步從文字介面安裝、設定乃至於完整的中文桌面環境,再至程式設計環境架設等。筆者希望本書可以讓一般學生在一個學期內完成本書的內容,以此書學習到的內容為基礎,讀者可以在進入 Linux 伺服器管理甚至是嵌入式 Linux/Android 系統開發等領域都會變得比較容易。

由於這本書主要是寫給 Linux 入門的初學者看的,因此筆者盡可能把安裝過程螢幕上的資訊一一截取下來,讓初學者能按圖索驥以利學習,希望藉此降低初學者安裝、學習過程中遇到問題卻無法解決的困境。

本書「不保證」你能順利安裝 Linux,亦「不保證」你的主機不會因此受到損壞(包括硬體損壞及軟體損壞或資料毀損)。從另一方面來說,由於筆者學識不足能力有限,書裡錯誤疏漏之處在所難免,望請各位多多海涵。

李博明 謹誌 於南台科技大學 電子系

推薦序


2013年1月17日 星期四

如何在 RPI 板子上編譯 Quake 3 程式


http://www.raspberrypi.org/phpBB3/viewtopic.php?f=78&t=18853

1. 下載必要套件

# apt-get install git gcc build-essential libsdl1.2-dev

2. 下載 quake3 的程式碼

請以 pi 權限執行

git clone https://github.com/raspberrypi/quake3.git

或至 ftp 下載解壓縮 quake3.tar.xz

下載完畢後我們會有一個目錄叫 quake3

3. 編譯設定檔

請切換至 quake3 目錄,編譯 build.sh,修改以下部份:

ARM_LIBS=/opt/bcm-rootfs/opt/vc/lib
改成
ARM_LIBS=/opt/vc/lib

INCLUDES="-I/opt/bcm-rootfs/opt/vc/include -I/opt/bcm-rootfs/opt/vc/include/interface/vcos/pthreads"
改成
INCLUDES="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads"

CROSS_COMPILE=bcm2708-
改成
#CROSS_COMPILE=bcm2708-

修改完畢後可以開始編譯

4. 編譯 quake3

請執行

time sh ./build.sh

即可開始編譯,如果你的環境設定都沒問題的話經過約一個小時後會編譯完 quake3。
編譯完畢後,我們可以在 ~/quake3/build/release-linux-arm/
看到 ioquake3.arm 這個可執行檔。在執行此檔案前,我們要先將 q3 的地圖檔放
至 ~/quake3/build/release-linux-arm/baseq3 目錄。

5. 放地圖檔

請下載 quake3 Demo 檔案,指令如下:

wget http://dl.dropbox.com/u/1816557/Q3%20Demo%20Paks.zip

執行完畢後會下載一個檔案名為 Q3 Demo Paks.zip,請執行 unzip 解開

unzip "Q3 Demo Paks.zip"

此時會解開 baseq3 的目錄,底下有 pak0.pk3 ~ pak8.pk3 這 9 個檔案。

將 baseq3 目錄下的檔案移至 ~/quake3/build/release-linux-arm/baseq3

接著再執行 ioquake3.arm 檔案即可進入 quake3。

如何建立 Raspberry Pi SD Card

1. 下載 2013-02-09-wheezy-raspbian.zip
  a. 從官方網站下載 - http://www.raspberrypi.org/downloads
  b. 從我的映像站下載

2. 解開 2013-02-09-wheezy-raspbian.zip

unzip 2013-02-09-wheezy-raspbian.zip

此時會解開出一個 2013-02-09-wheezy-raspbian.img 的影像檔,我們可以使用之前所介紹掛載 sdcard.img 的方式來掛載此檔以觀察其內容。

3. 掛載 2013-02-09-wheezy-raspbian.img 檔案

a. 請先切換至 root 權限 (su)

b. # losetup /dev/loop0 2013-02-09-wheezy-raspbian.img

   此指令是將 2013-02-09-wheezy-raspbian.img "連接" 至 /dev/loop0 這個裝置

   # losetup -a -> 觀察連接的結果,其輸出如下:

/dev/loop0: [0805]:999425 (/home/herman/raspberry/2013-02-09-wheezy-raspbian.img)

我們可以得知 /dev/loop0 已經跟 2013-02-09-wheezy-raspbian.img 連接在一起。接著我們可以執行 fdisk -lu 來觀察 /dev/loop0 這個裝置,請執行底下指令:

   # fdisk -lu /dev/loop0

其輸出如下:

Disk /dev/loop0: 1939 MB, 1939865600 bytes
255 heads, 63 sectors/track, 235 cylinders, total 3788800 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
Disk identifier: 0x00017b69

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
Partition 1 does not end on cylinder boundary.
/dev/loop0p2          122880     3788799     1832960   83  Linux
Partition 2 does not end on cylinder boundary.

c. 將 2013-02-09-wheezy-raspbian.img 的第一分割區"連接"至 /dev/loop1,其指令如下:

losetup -o `expr 8192 \* 512` /dev/loop1 /dev/loop0

我們可以執行 losetup -a 來觀察連接結果,其輸出如下:

/dev/loop0: [0805]:999425 (/home/herman/raspberry/2013-02-09-wheezy-raspbian.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 4194304

接著將 2013-02-09-wheezy-raspbian.img 的第二分割區"連接"至 /dev/loop2,其指令如下:

losetup -o `expr 122880 \* 512` /dev/loop2 /dev/loop0

我們可以執行 losetup -a 來觀察連接結果,其輸出如下:

/dev/loop0: [0805]:999425 (/home/herman/raspberry/2013-02-09-wheezy-raspbian.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 4194304
/dev/loop2: [0005]:1312 (/dev/loop0), offset 62914560

這表示 /dev/loop1 及 /dev/loop2 都連接至正確的分割區,接著就可以進行掛載。

d. 將 /dev/loop1 掛載至 /mnt/sdcard1 目錄


#  mount /dev/loop1 /mnt/sdcard1

將 /dev/loop2 掛載至 /mnt/sdcard2 目錄

#  mount /dev/loop2 /mnt/sdcard2

若無 /mnt/sdcard1 /mnt/sdcard2 目錄的話,請先執行底下建立:

#   mkdir -p /mnt/sdcard1 /mnt/sdcard2

掛載完後請執行 df -h 來觀察是否已掛載成功,其輸出如下:

檔案系統              Size  Used Avail Use% 掛載點
/dev/loop1             56M   17M   40M  30% /mnt/sdcard1
/dev/loop2            1.8G  1.4G  315M  82% /mnt/sdcard2


e. 切換至 /mnt/sdcard1 /mnt/sdcard2 目錄來觀察其內容。

   cd /mnt/sdcard1
   ls -l

   我們可以看到此分割區為 bootloader 及 kernel 之目錄,其輸出如下:
-rwxr-xr-x 1 root root   17764 2012-10-29 01:40 bootcode.bin
-rwxr-xr-x 1 root root     142 2012-12-16 01:43 cmdline.txt
-rwxr-xr-x 1 root root    1180 2012-12-16 01:43 config.txt
-rwxr-xr-x 1 root root    2020 2012-10-29 01:40 fixup_cd.dat
-rwxr-xr-x 1 root root    5282 2012-10-29 01:40 fixup.dat
-rwxr-xr-x 1 root root     137 2012-12-17 03:51 issue.txt
-rwxr-xr-x 1 root root 2104952 2012-10-29 01:40 kernel_cutdown.img
-rwxr-xr-x 1 root root 9522048 2012-10-29 01:40 kernel_emergency.img
-rwxr-xr-x 1 root root 2695192 2012-10-29 01:40 kernel.img
-rwxr-xr-x 1 root root  523144 2012-10-29 01:40 start_cd.elf
-rwxr-xr-x 1 root root 2347828 2012-10-29 01:40 start.elf

   cd /mnt/sdcard2
   ls -l

我們可以看到此分割區為 rootfs 之目錄,其輸出如下:

drwxr-xr-x  2 root root  4096 2012-12-16 02:16 bin
drwxr-xr-x  2 root root  4096 2012-12-16 01:43 boot
drwxr-xr-x  3 root root  4096 2012-12-16 02:16 dev
drwxr-xr-x 95 root root  4096 2012-12-17 03:39 etc
drwxr-xr-x  3 root root  4096 2012-12-17 03:39 home
drwxr-xr-x 12 root root  4096 2012-12-16 02:05 lib
drwx------  2 root root 16384 2012-12-16 01:28 lost+found
drwxr-xr-x  2 root root  4096 2012-12-16 01:31 media
drwxr-xr-x  2 root root  4096 2012-09-03 01:08 mnt
drwxr-xr-x  3 root root  4096 2012-12-16 01:42 opt
drwxr-xr-x  2 root root  4096 2012-09-03 01:08 proc
drwx------  2 root root  4096 2012-12-16 01:31 root
drwxr-xr-x  7 root root  4096 2012-12-17 03:37 run
drwxr-xr-x  2 root root  4096 2012-12-16 02:16 sbin
drwxr-xr-x  2 root root  4096 2012-06-20 17:23 selinux
drwxr-xr-x  2 root root  4096 2012-12-16 01:31 srv
drwxr-xr-x  2 root root  4096 2012-11-27 17:13 sys
drwxrwxrwt  2 root root  4096 2012-09-03 01:08 tmp
drwxr-xr-x 10 root root  4096 2012-12-16 01:31 usr
drwxr-xr-x 11 root root  4096 2012-12-16 01:31 var

4. 解除掛載

a. 解除掛載 目錄

   # umount /mnt/sdcard1
   # umount /mnt/sdcard2
   使用 df -h 來觀察是否已解除掛載

b. 解除 loop 連接

   # losetup -d /dev/loop2
   # losetup -d /dev/loop1
   # losetup -d /dev/loop0

   使用 losetup -a 來觀察是否已解除連接




** 將 2013-02-09-wheezy-raspbian.img 下載至 sdcard **

1. 首先將 SD card 放入讀卡機,並接上電腦,然後執行 dmesg 觀察最後面輸出之
   SD card 的代號,例如:

[11237833.478264] sd 4:0:0:0: [sdb] 7673856 512-byte logical blocks: (3.92 GB/3.65 GiB)
[11237833.478885] sd 4:0:0:1: [sdc] Attached SCSI removable disk
[11237833.479635] sd 4:0:0:2: [sdd] Attached SCSI removable disk
[11237833.480265] sd 4:0:0:3: [sde] Attached SCSI removable disk
[11237833.481313] sd 4:0:0:0: [sdb] Write Protect is off
[11237833.481317] sd 4:0:0:0: [sdb] Mode Sense: 03 00 00 00
[11237833.482161] sd 4:0:0:0: [sdb] No Caching mode page present
[11237833.482165] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[11237833.486012] sd 4:0:0:0: [sdb] No Caching mode page present
[11237833.486017] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[11237833.488435]  sdb: sdb1 sdb2
[11237833.491524] sd 4:0:0:0: [sdb] No Caching mode page present
[11237833.491529] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[11237833.491533] sd 4:0:0:0: [sdb] Attached SCSI removable disk

從上面訊息我們可以得知 SD card 是 /dev/sdb 這個裝置,其容量為 3.92 GB = 4 GB

2. 將 2013-02-09-wheezy-raspbian.img 植入 SD card
   請先切換至 root 權限,再執行:

   # dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdb bs=1024k

   經過 N 分鐘後會完成植入流程,N 自 5 ~ 8 不等,看記憶卡的速度。執行完畢後之輸出如下:

1850+0 records in
1850+0 records out
1939865600 bytes (1.9 GB) copied, 656.276 s, 3.0 MB/s



3. 掛載實體 SD card

# mount /dev/sdb1 /mnt/sdcard1
# mount /dev/sdb2 /mnt/sdcard2

使用 df -h 來觀察其輸出,如下所示:

檔案系統              Size  Used Avail Use% 掛載點
/dev/sdb1              56M   17M   40M  30% /mnt/sdcard1
/dev/sdb2             1.8G  1.4G  315M  82% /mnt/sdcard2

4. 觀察 SD card

   cd /mnt/sdcard1 目錄觀察
   cd /mnt/sdcard2 目錄觀察



5. 修改開機參數

   cd /mnt/sdcard1
   vi config.txt

   將
#hdmi_safe=1 改為
hdmi_safe=1

接著我們就可以拿 SD card 至 raspberry pi 板子上開機。

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 在重新開機時自動再偵測一次。