2012年4月25日 星期三

如何在 Debian Linux 安裝/設定 Arduino 環境

自編 Linux 核心

為什麼要自己編 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
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)
            -> 當機(以舊版核心重開,設法解決問題)