raspberrypi 官網 raspberrypi 官網

互動 IoT 系統應用 - 上課教材

互動 IoT 系統應用 > 課程內容 > 第 02 章 - 樹莓派系統操作與設定

第 02 章 - 樹莓派系統操作與設定

上次更新日期 2022/09/16

樹莓派其實就是個小型主機,裡面有個 Linux 作業系統,相關的動作都是 Linux 指令啊! 因為樹莓派的硬體資源不是太好,所以,老是啟用圖形界面是不太妥當的!因此,需要有些額外的設定, 讓系統進入變成文字界面,之後再來慢慢調整。沒有要大家學太多 Linux 指令,但是基礎的,還是得要知道才行!

學習目標:

  1. 設定 ~/.bashrc 的內容
  2. 了解 sudo 的操作
  3. 建立一般帳號
  4. 使用文字界面 raspi-config 進行樹莓派設定
  5. 查看與修改系統時間及網路自動校時
  6. 軟體的查詢、安裝
  7. 使用 vim 取代 nano 編輯器 (update-alternatives...)

2.1: 建立基本操作環境 ~/.bashrc

既然是指令列模式,所以,需要了解一下指令下達的方式:

rasppi@raspberrypi:~ $ 指令 [-選項] [參數]

rasppi@raspberrypi:~ $ ls -l /home
總用量 4
drwxr-xr-x 18 rasppi rasppi 4096  9月 15 14:05 rasppi

一串指令裡面,通常用空白鍵隔開,最前面一定是指令,後面如果開頭是減號或兩個減號,就是選項部份,如果沒有帶減號, 通常就是指令的參數,或者是選項的參數。上面的 ls 指令功能是『看檔名』,而 -l 是長串列出, /home 則是查看家目錄位置。

  • 通用指令查詢方式 --help

一般來說,如果你想要知道某個指令的用法,只要輸入『 指令 --help 』就可以看到指令用法!相當簡單,例如上面談到的 ls 這個指令:

rasppi@raspberrypi:~ $ ls --help
用法:ls [選項]... [檔案]...
列出指定檔案(預設為目前目錄)的訊息。
如果不指定 -cftuvSUX 中任意一個或--sort 選項,則根據字母大小排序。

必要參數對長短選項皆適用。
  -a, --all                  不隱藏任何以 . 開始的項目
  -A, --almost-all           列出除 . 及 .. 以外的任何項目
      --author               與 -l 同時使用時,列出每個檔案的作者
  -b, --escape               以 C 風格的跳脫序列表示不可列印的字元
....
  -l                            使用較長格式列出訊息
....
例題 2.1.1:熟悉一下 --help 的用法,並記憶一下指令功能!
  1. 列出 free 的相關用法,找到上週的 -m 是什麼意思?另外 -h 又是什麼意思?
  2. 列出 date 的相關用法,並嘗試找出 date +%Y-%m-%d 的意義為何?
  3. 承上,嘗試找出 date +%x' '%X 的意義為何?
  • 使用命令別名建立 ll 等別名指令

如果慣用 RHEL 相關產品的用戶來說,樹莓派沒有 ll 真的很討厭!那可以加入 ll 嘛?可以的,那就是 alias 的功能! 直接透過編輯 ~/.bashrc 即可!

rasppi@raspberrypi:~ $ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias ls='ls --color=auto'

rasppi@raspberrypi:~ $ nano ~/.bashrc
# 大概在 90 行附近
alias ll='ls -l'
alias rm='rm -i'
alias mv='mv =i'
# 按下 [ctrl]-x 就可以儲存退出

rasppi@raspberrypi:~ $ source ~/.bashrc
rasppi@raspberrypi:~ $ ll
總用量 80
drwxr-xr-x 2 rasppi rasppi  4096  9月  7 05:43 Bookshelf
drwxr-xr-x 2 rasppi rasppi  4096  9月 15 10:49 Desktop
-rw-r--r-- 1 rasppi rasppi 39056  9月 15 14:50 raspinfo.txt
-rw-r--r-- 1 rasppi rasppi   372  9月 15 11:03 rpdiags.txt
drwxr-xr-x 2 rasppi rasppi  4096  9月 15 10:49 下載
....

若還有其他需求,就自行加入相關的 bash 功能吧!

2.2: 了解 sudo 的指令用法與建立用戶

登入樹莓派的時候,預設的帳號就是第一次使用樹莓派時,所建立的用戶就是了。問題是,那個帳號並不是系統管理員, 系統管理員的帳號名稱只能是『 root 』我們沒有這個帳號的密碼。

不過不要緊,當初建立一般帳號時,由於有給 sudo 這個群組,因此我們可以透過『 sudo 指令』來操作指令, sudo 後面接的指令,就可以使用 root 的身份來處理。讓我們來查詢看看:

rasppi@raspberrypi:~ $ whoami
rasppi

rasppi@raspberrypi:~ $ sudo whoami
root

whoami 就如同字面的意思,系統會告訴你目前身份是誰。當我們使用 sudo 在前面時,就可以發現身份變成 root 了! 讓我們測試一下,一般用戶建立其他帳號是怎麼回事?

rasppi@raspberrypi:~ $ useradd -G sudo user1
useradd: Permission denied.
useradd:無法鎖定 /etc/passwd;請稍候再試。

系統會告知你,其實是無法執行的 (Permission denied)。那如果在前面加上 sudo 呢?

rasppi@raspberrypi:~ $ sudo useradd -G sudo user1

rasppi@raspberrypi:~ $ id user1
使用者id=1001(user1) id群組=1001(user1) 組=1001(user1),27(sudo)

這個帳號就建立了。但是,預設的情況下,這個帳號不會有家目錄!所以,建立帳號時,還是得要額外增加一些參數才行! 可以這樣做看看:

rasppi@raspberrypi:~ $ sudo useradd -G sudo -m user2

rasppi@raspberrypi:~ $ id user2
使用者id=1002(user2) id群組=1002(user2) 組=1002(user2),27(sudo)

rasppi@raspberrypi:~ $ ll /home
drwxr-xr-x 18 rasppi rasppi 4096  9月 15 15:04 rasppi
drwxr-xr-x  2 user2  user2  4096  9月 15 15:26 user2

你會發現到家了 -m 的參數後,使用者的家目錄才會建立起來!否則就會失敗啦!那登入時,還需要密碼,設定密碼的方式為:

rasppi@raspberrypi:~ $ sudo passwd user1
新 密碼:
再次輸入新的 密碼:
passwd:密碼成功變更

密碼得要重複輸入兩次才會成功!最終看到變更成功,才是真的有該密碼的存在喔!那剛剛兩個帳號建立後,想說只是測試用, 所以要刪除了,該如何處理?可以用 userdel -r 來處理!

rasppi@raspberrypi:~ $ sudo userdel -r user1
userdel:找不到 user1 mail spool (/var/mail/user1)
userdel:找不到 user1 的家目錄 (/home/user1)

rasppi@raspberrypi:~ $ sudo userdel -r user2
userdel:找不到 user2 mail spool (/var/mail/user2)

rasppi@raspberrypi:~ $ id user1
id: 「user1」:無此使用者
rasppi@raspberrypi:~ $ id user2
id: 「user2」:無此使用者
例題 2.2.1: 收集你組員的帳號 (英文或者是學號均可),使用英文小寫搭配數字即可,不要用中文喔!
  1. 建立組員的帳號,要注意,組員必須要有家目錄才行
  2. 設計組員的密碼,讓組員自己輸入密碼 (記得密碼長度要夠!至少 8 個字元!可以用身份證)

2.3: 使用 raspi-config 設定系統 - SSH

除了直接使用 systemctl 來控制系統服務之外,樹莓派本身作業系統提供了 raspi-config 進行一些額外的設定! 挺有趣的!在指令列模式直接輸入『 sudo raspi-config 』即可進入『類圖形界面』的畫面, 如果從外部連進來,會有點像這樣:

rasppi@raspberrypi:~ $ sudo raspi-config
樹莓派類圖形設定環境
  • 1. 進階設定項目: Advancede Options

在系統效能的改善方面,你用方向鍵到『 Advanced Options 』的地方,然後按下 Enter 之後,會有幾個簡單項目可以選擇:

  • A1 Expaned Filesystem: 可以將你的 SD 卡容量完整放大!
  • A2 GL Driver: 可以選擇 G2 GL (Full KMS) 的項目來完整支援 OpenGL,圖形界面會有比較好的展示
  • AA Network Config: 建議選擇 2 NetworkManager,之後我們可以來自己設定網路喔!
  • 2. 界面設定: Interface Options

一開始還真的看不懂這啥東西!後來點進去才知道,原來是各個界面的連線方式,其實,可以說是遠端連線協定設計啦! 因為我們已經提供了用戶帳密,接下來就得要讓使用者可以登入系統才行!目前建議使用有加密的 SSH 來連線! 因此,點選 Interface Options 之後,進入 I2 SSH 的項目,並按下『是』,系統會給你『不好的密碼規則會讓你的樹莓派很危險』的展示... 記得要注意使用者的密碼長度才行!

大致上的設定就是這樣!有興趣的同學再自己慢慢摸索~其實設定挺有趣的!最後用 [tab] 按鈕到『 finish 』的按鈕上, 就可以離開了。如果你剛剛的設定有比較重要的,那系統會提示你得要重新開機!那你就重新開機吧!如果是遠端登入的同學要重新開機, 可能得要從指令列下達『 sudo reboot 』才行喔!

例題 2.3.1:確認使用 ssh 登入樹莓派:
  1. 使用 sudo netstat -tlnp 指令,看看有沒有 0.0.0.0:22 字樣的輸出,若有,代表 ssh 啟動了
  2. 使用 ifconfig eth0 會得到你的樹莓派 IP 位址
  3. 在 windows 的執行,輸入 cmd 指令,會跳出 DOS 視窗
  4. 在 cmd 環境下,使用 ssh user@your.pi.ip 來登入到樹莓派
  5. 若 cmd 的游標不見了,可以透過拉動視窗大小,就可以重新繪出游標。
  6. 使用 w 就可以看到登入系統的用戶們

2.4: 進行時間校正

因為樹莓派不像一般主機,主機板上面通常有個小電池,可以提供一點點電力,以維護系統時間的紀錄與正確性。 樹莓派沒有這顆電池,所以,重新開機之後,在沒有網路的情況下,樹莓派的時間都會是錯誤的!那如何觀察時間呢? 如果在沒有圖形界面的情況下,我們可以使用 date 指令來查看時間:

rasppi@raspberrypi:~ $ date
西元2022年09月16日 (週五) 11時12分02秒 CST

你會發現,咦!時間沒有問題啊!這是因為我們上課所使用的樹莓派環境有網路啦!而樹莓派會主動的通過 NTP (Network Time Protocal) 協定, 自動的跑去網路上找到正確的時間伺服器,進行時間的校正。讓我們來查看下目前的時區與時間校正主機吧!

rasppi@raspberrypi:~ $ timedatectl
               Local time: 五 2022-09-16 11:14:00 CST  <==目前本地時間
           Universal time: 五 2022-09-16 03:14:00 UTC  <==格林威治標準時間
                 RTC time: n/a
                Time zone: Asia/Taipei (CST, +0800)    <==目前系統的所在時區
System clock synchronized: yes                         <==網路校時是成功的! (yes)
              NTP service: active                      <==目前有網路校時功能 (active)
          RTC in local TZ: no
  • 查看目前的時間伺服器設定狀態

既然目前的時間是正常的,表示我們有規劃好時間伺服器才對,那麼這個時間伺服器的設定為何?我們依舊可以透過 timedatectl 來查看:

rasppi@raspberrypi:~ $ timedatectl show-timesync
FallbackNTPServers=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org ...
ServerName=0.debian.pool.ntp.org
ServerAddress=118.163.81.62
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=34min 8s
NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=2, Precision=-25, RootDelay=442us, ...
Frequency=78074

rasppi@raspberrypi:~ $ timedatectl timesync-status
       Server: 118.163.81.62 (0.debian.pool.ntp.org)
Poll interval: 34min 8s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 2
    Reference: C0A80002
    Precision: 1us (-25)
Root distance: 32.813ms (max: 5s)
       Offset: -1.180ms
        Delay: 7.434ms
       Jitter: 1.188ms
 Packet count: 44
    Frequency: +1.191ppm

很簡單的發現了使用的 Server 來自於『0.debian.pool.ntp.org』這個時間伺服器主機名稱。但是某些情況下, 你的主機指定的時間伺服器,需要是工作單位內的 IP 才可以!舉例來說,崑山科大建議校內的所有伺服器, 其時間伺服器需要指定到 ntp.ksu.edu.tw 這台才可以!所以,我們得要修改一下這個設定值。

  • 使用 root 權限進行時間伺服器修改

修改時間伺服器位址,需要有 root 權限才行!需要修改設定檔喔!假設大家尚未學過 vim 這個工具 那麼至少得要會 nano 這個編輯軟體才行。修改的設定檔在 /etc 底下,處理方法有點像這樣:

# 1. 先修改設定檔:
rasppi@raspberrypi:~ $ sudo nano /etc/systemd/timesyncd.conf
[Time]
#NTP=
FallbackNTP=ntp.ksu.edu.tw
#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org...
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

# 2. 重新啟動時間同步的服務
rasppi@raspberrypi:~ $ sudo systemctl restart systemd-timesyncd.service

# 3. 觀察時間伺服器有沒有更新?
rasppi@raspberrypi:~ $ timedatectl timesync-status
       Server: 120.114.100.1 (ntp.ksu.edu.tw)
Poll interval: 1min 4s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 3
    Reference: 76A3513E
    Precision: 4us (-18)
Root distance: 87.951ms (max: 5s)
       Offset: +5.696ms
        Delay: 752us
       Jitter: 0
 Packet count: 1
    Frequency: +15.092ppm

這樣就確定時間更新來源是在你的樹莓派附近!

2.5: 軟體安裝與查詢

在有網路存在的情況下,我們可以簡單的透過樹莓派官網提供的軟體倉儲系統,很快速的找到、安裝我們所需要的軟體喔! 所需要的指令也只有 apt-cache 以及 apt-get 兩個而已!

  • 使用 apt-cache 搜尋軟體

基本上,在樹莓派上面的所有軟體都會有軟體名稱、軟體簡介、軟體說明等資料,我們可以透過關鍵字來找到軟體名稱~ 例如,我們想要知道有沒有軟體跟 GPIO 這個關鍵字有關時,可以這樣做:

rasppi@raspberrypi:~ $ apt-cache search gpio
airspyhf - HF+VHF software defined radio receiver - user runtime
ledmon - Enclosure LED Utilities
....
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)
raspi-gpio - Dump the state of the BCM270x GPIOs
raspi-gpio-dbgsym - debug symbols for raspi-gpio

上面出現的訊息,主要是『軟體名稱 - 軟體簡介』而已,詳細的軟體說明並沒有輸出!所以,你才會看到前面兩行, 例如 airspyhf 軟體顯示上,並沒有出現任何 GPIO 的關鍵字啊!如果,你確定只要輸出軟體名稱含有 GPIO 的關鍵字, 而不要找尋軟體說明的內容,那可以加上 --names-only 來搜尋即可:

rasppi@raspberrypi:~ $ apt-cache --names-only search gpio
gpiod - Tools for interacting with Linux GPIO character device - binary
libgpiod-dev - C library for interacting with Linux GPIO device - static libraries and headers
....
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)
raspi-gpio - Dump the state of the BCM270x GPIOs
raspi-gpio-dbgsym - debug symbols for raspi-gpio

你就會發現到,軟體名稱一定會有 GPIO 的關鍵字存在囉!

  • 使用 apt-get 進行安裝/升級等行為

要安裝軟體,直接用 apt-get 來處理即可!apt-get 常用的功能主要有:

  • apt-get upgrade : 全系統自動升級
  • apt-get install [軟體名稱] : 安裝某個軟體
  • apt-get remove [軟體名稱] : 移除某個軟體
例題 2.5.1:全系統升級與安裝 vim 軟體
  1. 進行一次全系統升級
  2. 嘗試找出軟體名稱含有 vim 的軟體
  3. 安裝 vim 這個軟體

2.6: 簡易的 vim 編輯器

與 nano 不同的是,使用 vim 可以進行『程式編輯器』的功能!尤其 vim 可以進行一些設定檔的處置時, 會有顏色的變化,在編輯上面,會比較輕鬆愉快!基本上,操作 vim 你一定要知道的是,vim 一定要接檔名! 否則,會出現黑壓壓的一片~另外,按下 i 可以進入編輯,按下 [esc] 可以離開編輯,按下 : 可以進入指令列模式, 指令列模式 :w, :q 可以儲存、可以離開,使用 :q! 可以不儲存離開等等!

首先,我們使用 vim 來編輯之前曾經用 nano 打開的檔案,看看內容長怎樣呢?

rasppi@raspberrypi:~ $ vim /etc/systemd/timesyncd.conf
使用 vim

先看左下角,因為我們使用的是一般帳號,因此這裡會出現『唯讀』的字樣。另外,因為 # 符號後面的資料是註解, 因此,就會出現成為藍色特殊字體~沒有問題的地方就會是正常文字。離開 vim 時,輸入 :q 即可!相當簡單!常見的 vim 按鈕如下:

  • i:進入編輯模式
  • [esc]:離開編輯模式
  • :q:離開 vim
  • :w:寫入檔案
  • :q!:不儲存強迫離開
  • u:復原前一個動作
例題 2.6.1: 簡易操作 vim
  1. 使用 vim 打開你的 ~/.bashrc 檔案
  2. 前往 92 行左右,看一下我們之前編輯過的內容,使用 alias 的功能
  3. 進入編輯模式,並讓 vi 使用 vim
  4. 離開編輯模式
  5. 儲存檔案
  6. 離開 vim
  • 修改預設編輯器

當我們需要用到編輯器的時候,系統會用『預設的編輯器』提供給妳使用!而 Linux 有很多的編輯器, 預設就有 nano, vi, vim 等等。樹莓派預設的編輯器 (editor) 應該是 nano 喔!查詢的方法有許多種, 我們先來測試看看:

# 1. 直接查詢連結檔
rasppi@raspberrypi:~ $ ll /etc/alternatives/editor
lrwxrwxrwx 1 root root 9  9月  7 05:33 /etc/alternatives/editor -> /bin/nano

# 2. 使用 update-alternatives 查詢:
rasppi@raspberrypi:~ $ update-alternatives --display editor
editor - 自動模式
  連結的最佳版本為「/bin/nano」
  目前連結指向 /bin/nano
  editor 連結現為 /usr/bin/editor
   editor.1.gz 從屬連結為 /usr/share/man/man1/editor.1.gz
....

都可以看到 editor 編輯器為 nano 的!那如果我想要改成 vim (/usr/bin/vim.basic) 呢?可以這樣做看看:

rasppi@raspberrypi:~ $ sudo update-alternatives --set editor /usr/bin/vim.basic
update-alternatives: 在手動模式下以 /usr/bin/vim.basic 來提供 /usr/bin/editor (editor)

rasppi@raspberrypi:~ $ ll /etc/alternatives/editor
lrwxrwxrwx 1 root root 18  9月 16 14:13 /etc/alternatives/editor -> /usr/bin/vim.basic

這樣未來系統就會以 vim 作為基本的編輯器了!

2.7: 當週實做

  1. 讓 clear 指令執行時,其實是執行 clear -x
  2. 讓 cls 指令執行時,也會執行 clear -x
  3. 建立名為 myunit2 的帳號,不用給密碼,但是要建立家目錄
  4. 查詢目前使用的 NTP 伺服器的 IP (timedatectl 輸出)
  5. 嘗試找出軟體名稱具有 x11 關鍵字的軟體
  6. 嘗試安裝 x11-apps 這個軟體
  7. 嘗試在樹莓派本身上面啟動 xeyes 這個軟體,以及 xclock 這個軟體

...