2012/06/10

Raspberry Pi基本設定、編譯核心、上網

這一篇要記錄一下,Raspberry Pi裝上作業系統並可開機後(我裝的是debian6-19-04-2012.img,可到官方下載頁面取得),接下來該進行哪些設定。

我並不打算將Raspberry Pi(簡稱為rpi)當做獨立的電腦使用,不會接螢幕鍵盤滑鼠,只接電源、網路線、SD記憶卡,目標是讓它成為連上網路的伺服器,可以SSH登入,然後再做其他打算。

我不是linux專家,這篇也不是什麼教學文,只是把我作過的步驟記下來,如此而已,將會很簡略。如果有說錯缺漏的地方,還請留言指教。


首先是一些基本的設定,除了一定要接的SD記憶卡、網路線與電源外,此時還需要把螢幕與鍵盤接上,我不使用X Window,所以不接滑鼠。

開機登入後,會看到如下圖的訊息,建議我們設定日期時間,這是因為rpi沒有即時時鐘,所以斷電重開機後,日期時間的紀錄就會不正確了。可以下指令:
$ sudo date --set="2012-06-07 14:00"
來設定日期時間,不過每次都要手動設定很煩。之後有網路連線後,可以自動到網路上查詢並設定。


對了,記得執行指令
$ passwd
將預設密碼改掉。

接下來要設定locale,出廠預設為GB英國,所以需要修改。下指令
$ sudo dpkg-reconfigure locales
後,會出現下圖。請不要選All locales,那將耗去很漫長的時間。我選了en_US與zh_TW,UTF-8編碼最好一定要選,其他編碼就看你了。
注意,以"空白鍵"進行選取的動作,而不是以Enter鍵。


然後會要我們選擇系統預設的locale,我選了en_US.UTF-8。


當你在打字時,會發現有些鍵打出的字元怪怪的(譬如說打"出現@,打@出現"),這是因為出廠預設的鍵盤對應表為英國用的。請下指令
$ sudo dpkg-reconfigure keyboard-configuration
並選取適當的鍵盤配置。

我選了Generic 105 key。


Keyboard layout部分,先選Other。


然後選USA。


然後選USA。


然後繼續進行鍵盤的設定。
AltGr?這什麼啊,我選No AltGr key。


啥?Comose Key?我選了No compose key。


要不要以Ctrl+Alt+Backspace代表終止X server。我選No。


接下來設定時區,指令為:
$ sudo dpkg-reconfigure tzdata
我住在亞洲Asia。


我住在台北。


然後,我想要新增使用者帳號,並且讓他能使用sudo。以指令
$ sudo adduser yehnan
新增使用者。(注意:請把yehnan換成你的名字。)

然後執行
$ sudo visudo
出現如下畫面,將
yehnan    ALL=(ALL) ALL
放到相似的那幾行底下,將權限賦予此帳號。


以上為一些基本設定,參考資料為
RPi Beginners:講解rpi初次開機後需要進行的一些設定,包括locale、鍵盤、時區、新增能sudo的使用者、等等。
我的 Raspberry Pi 系统配置实战:在命令列下聽音樂、安裝輸入法、掛載USB隨身碟、等等。
Andy Bold的First steps with Raspberry Pi


接下來是讓rpi連上區域網路,這樣我就能拔掉螢幕與鍵盤,透過SSH登入。

首先,我想將出廠預設的主機名稱(raspberry)改掉,以$sudo nano /etc/hostname改掉裡面的名稱,然後以$sudo nano /etc/hosts改掉裡面相關的部份,最後以$sudo /etc/init.d/hostname.sh start更新主機名稱(或是重開機)。

$ dmesg | grep net檢查網路卡驅動程式是否存在,已經內建了,還好,我就不需要操心了。

為了讓rpi加入我的區域網路(我的區域網路裡有一台Windows與一台Mac),以$sudo nano /etc/network/interfaces編輯網路設定,加入如下內容:
auto eth0
iface eth0 inet static
address 192.168.2.8
netmask 255.255.255.0

其中192.168.2.8是我指定給rpi的內部IP。

然後以$ sudo /etc/init.d/networking restart重新啟動網路。

然後可以指令$ sudo /etc/init.d/ssh start將ssh server啟動,但我還希望每次重開機後ssh server都能自動啟動,作法如下(參考資料):
(我使用的映像檔是debian squeeze那個)
將/boot下的boot_enable_ssh.rc改名為boot.rc。

如此即可。

成功後,就能在區域網路內從別台機器以SSH登入rpi了。耶,可以拔掉螢幕與鍵盤囉。

下圖是我在Windows上以Cygwin的ssh指令登入rpi的樣子。只要做好設定(公鑰、私鑰),就能直接登入無需輸入密碼。


接下來要讓rpi上網,最終目標是安裝PPPoE,輸入帳號密碼上網。

我是HiNet的用戶,原本有8個浮動IP,所以我先到http://service.hinet.net/2004/adslstaticip.php申請,改成1個固定IP加8個浮動IP。

首先要編譯Linux核心,主要參考文件為RPi Kernel Compilation,另外,有人也在PPPoE的部份遇到問題,相關討論在這裡這裡

(我本來是在Mac OS X裡安裝VirtualBox,然後再安裝Ubuntu,以此環境編譯核心,但後來發現我不知道該如何把檔案傳到rpi上,所以放棄。)

我是在Mac OS X 10.6.8上編譯核心。

取得rpi修改過的Linux核心原始碼:
$ git clone git://github.com/raspberrypi/linux.git

$ git clone https://github.com/raspberrypi/linux.git

然後要取得.config檔,根據參考文件,可複製arch/arm/configs/bcmrpi_cutdown_defconfig當範本,另一種方式則為取得目前rpi裡使用的.config,啟動rpi後,以指令$ zcat /proc/config.gz > .config可取得,然後再複製到Linux核心原始碼目錄的最上層。

修改.config,加入對PPPoE的支援
CONFIG_PPP_FILTER=y
CONFIG_PPPOE=y
(也可以用m)。

接下來要安裝編譯工具組,首先安裝Xcode,然後要安裝一套GNU ARM toolchain,根據參考文件所說,可用yagarto,但不知為何我裝不起來,另一種方式為安裝MacPorts裡的arm-none-eabi-binutils與arm-none-eabi-gcc。

首先到MacPorts網站, 下載安裝MacPorts本身。然後以底下指令安裝:
$ sudo port install arm-none-eabi-binutils
$ sudo port install arm-none-eabi-gcc
這些是GNU ARM toolchain。

參考文件說若發生"找不到elf.h"的錯誤訊息,就需要進行底下步驟:
$ sudo port install libelf
$ sudo ln -s /opt/local/include/libelf /usr/include/libelf

然後到這裡下載elf.h,到這裡下載elftypes.h,將這兩支檔案放進/usr/include,編輯elf.h檔加入如下內容:
#define R_386_NONE        0
#define R_386_32          1
#define R_386_PC32        2
#define R_ARM_NONE        0
#define R_ARM_PC24        1
#define R_ARM_ABS32       2
#define R_MIPS_NONE       0
#define R_MIPS_16         1
#define R_MIPS_32         2
#define R_MIPS_REL32      3
#define R_MIPS_26         4
#define R_MIPS_HI16       5
#define R_MIPS_LO16       6

如此一來,核心原始碼ok了,工具部分也ok了。接下來要進行編譯了。

下指令讀取.config組態設定。
$ make ARCH=arm CROSS_COMPILE=/opt/local/bin/arm-none-eabi- oldconfig

下指令進行建置(編譯、連結、等等)。
$ make ARCH=arm CROSS_COMPILE=/opt/local/bin/arm-none-eabi-

成功後在arch/arm/boot裡會出現Image。

然後下指令產生出模組。
$ mkdir /tmp/modules
$ make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules

參考文件說rpi新版韌體可以直接吃Image,我不知道我的rpi的韌體部分是新的還是舊的,所以採用比較保險的方式。

下載轉檔工具:
$ git clone git://github.com/raspberrypi/tools
or
$ git clone https://github.com/raspberrypi/tools

在裡頭的mkimage子目錄下有支工具imagetool-uncompressed.py(python腳本檔),以底下指令把Image轉成rpi可用的kernel.img。

$ python imagetool-uncompressed.py path/to/linux/arch/arm/boot/Image

完成了,接下來就是把kernel.img放到記憶卡/boot(第一分割區)裡,把模組部分放到記憶卡根目錄(第二分割區)的/lib/modules裡,如此即可。

(其實這部份我搞了好久,參考文件使用sshfs的方式,於是我為了在rpi上安裝sshfs,於是需要安裝FUSE,連帶地還要安裝pkg-config,而且太新的0.26還不行,必須裝0.25,然後還要安裝glib,最後終於有了sshfs後,用起來怪怪的,雖可掛載,但卻不能進入目錄裡,哇哩咧。最後以scp複製檔案的方式完成。)

重新開機確定核心支援PPPoE後,安裝底下兩支軟體,
pppdrp-pppoe,作了些設定,將帳號密碼填入後,耶,可以上網囉。

下圖是從Windows的Cygwin以ssh指令登入rpi後,再以telnet指令上ptt.cc,嗯,亂碼。


還好,若以PieTTY登入rpi,然後再以telnet上ptt.cc,哇,中文正常顯示囉。


有網路連線後,我用的映像檔(debian6-19-04-2012.img)預設會啟動NTP daemon,它會自動去網路上抓日期時間,太好囉。

PS:rp-pppoe詢問我DNS伺服器的IP address,覆寫了/etc/resolv.conf。我以$sudo nano /etc/resolv.conf編輯,把我想要的設定寫回去,各家ISP的DNS伺服器的IP address,到網路上找一找就有,譬如說,HiNet的為168.95.192.1與168.95.1.1,或是也可使用OpenDNS的208.67.222.222與208.67.220.220。


參考資料:


後話
你一定覺得我寫的很簡略,orz,我搞了好久頭昏眼花,也沒有詳實記錄每一步驟的細節,如果各位高手發現我有寫錯缺漏的地方,還請不吝指教。

5 comments:

  1. 你好
    我最近也買了raspberry pi
    目前遇到一個問題
    就是用其它電腦ssh登入raspberry pi時
    只能用pi這個帳號登入

    用其他帳號卻不行

    我確定我有建立其他帳號了

    我檢查了一下log
    其它帳號的確有順利ssh登入
    但是隨即就被斷線了

    請問你有遇到類似的問題嗎?

    ReplyDelete
    Replies
    1. 請問log的訊息是什麼?螢幕上出現了什麼訊息?

      我有建立新帳號並以ssh登入,並無問題。

      Delete
    2. 檢查看看/etc/hosts.allow與/etc/hosts.deny。
      檢查看看/etc/ssh/sshd_config。
      公鑰私鑰都弄好了嗎?

      Delete
  2. 請問我跟著您的步驟裝了語言 可是還是有部分字出現亂碼??

    這是設定的問題嗎??

    ReplyDelete
    Replies
    1. 請參考這一篇http://yehnan.blogspot.tw/2012/08/raspberry-pi.html

      Delete