logo
Loading...

02 - Linux 常用指令教學 - AIOT 邊緣運算工作坊 - Cupoy

知識地圖 – Raspberry PI 介紹 重要知識點 Raspberry PI 系統管理指令 df 、date、 sudo、raspi-config、apt、systemctl、cron、...

知識地圖 – Raspberry PI 介紹 重要知識點 Raspberry PI 系統管理指令 df 、date、 sudo、raspi-config、apt、systemctl、cron、/etc/crontab Linux 的檔案管理、權限控制、裝置掛載、檔案下載 pwd、mkdir、cd、rmdir、cp、rm、chmod、uptime、top、mount、wget Linux 檔案文字編輯器 vi、nano、joe Linux 檔案壓縮 tar、bzip2 Linux 網路設定 ip、/etc/wpa_supplicant/wpa_supplicant.conf 顯示 Linux 裝置容量 用 df -h 來觀察目前系統各個硬碟跟裝置掛載使用量。 顯示系統版本、系統目前時間 uname -a:顯示系統核心的版本與編號 cat /etc/os-release:顯示作業系統版本 Linux 的 sudo 指令 Linux 使用者登入系統之後,並沒有辦法執行系統管理者所擁有權限的指令,為了方便管理者管理一般使用者執行特定指令的安全性,系統管理者可以在 /etc/sudoers 設定,哪一個使用者可以採用 sudo 的方式來取得系統管理者的權限,執行需要安全性權限的指令。 在系統安全性執行的管理上,一般使用者要取得系統管理者權限,執行具有與管理者相同權限的動作,可以透過 sudo 指令取得系統管理者權限後,開始執行相關後續的指令。 只有超級使用者有權限編輯 /etc/sudoers 文件,一般會用 visudo 來編輯 /etc/sudoers 文件,避免一些潛在的語法錯誤。 /etc/sudoers 檔案範例 /etc/sudoers 檔案說明 看檔案中 root 有所有權限,參考 root 的例子就行,在下面加一行 (最好用 Tab 作為空白),例子中加入了一個 aiot 帳號身分的使用者具有使用 sudo 指令的設定。 上面的設定可以讓 aiot 使用 sudo 指令時,權限跟 root 一樣,如果感覺權限太大,可以限制使用者可以使用 sudo 時候可以執行的指令。 那三個 ALL 到底是什麼意思。第一個 ALL 指網路中的機器名稱,可以把它改成某台機器名。第二個括弧裏的 ALL 是指哪一個身份可以執行命令。最後一個 ALL 是哪一個命令可以執行,如果是全部都可以就寫 ALL。 /etc/sudoers 檔案更改需要注意的事項 例如,我們想讓 aiot 用戶在主機上不用輸入密碼,又可以執行 /bin/cat 以及 /bin/ls 這些指令,可以按照這樣寫 要注意的是 /etc/sudoers 的內容一定要全部都是正確的狀態,否則會造成之後無法從遠端登入使用 sudo 指令的狀態,同時也無法從遠端修復 /etc/sudoers 內容的錯誤 (因為無法再透過 sudo 命令列切換 root 身分) 嚴格的說,/etc/sudoers 錯誤之後,將會產生無法線上處理修復的狀態,這個情況在每次修改 /etc/sudoers 的時候,需要非常小心撰寫設定檔案,因為錯了就無法遠端修復了。 Raspberry PI 系統設定指令 (raspi-config) raspi-config 需要超級使用者身分才能使用 要先執行 sudo su 的指令,將使用者身分切換為超級使用者,密碼為使用者登入的密碼 底下是 raspi-config 提供系統的設定選項。 raspi-config 設定 pi 各種基礎環境工作模式 raspi-config 是 pi 特有的系統設定指令,讓使用者可以很容易的設定 pi 的工作方式,使用者可以透過 raspi-config 設定管理者的密碼、系統工作的模式(視窗模式、純文字模式)、登入無線網路基地台的帳號密碼等。 raspi-config 常用的系統運作設定在系統的語系、時區、鍵盤配置設定,以及硬體接腳設定等部分。 raspi-config 硬體接腳設定在 Interfacing Options 選項中,因為 pi 避免在板子上面做太多的跳線開關,一方面省下跳線接腳占用的主板空間,另外一方面直接用軟體設定相對方便許多,因此提供了軟體設定接腳在各種狀態下的設定,如啟動 i2c、spi、RX/TX 接腳介面的設定。 raspi-config 內 Display Options 選項 raspi-config 第二個選項的 Display Options,提供各種顯示解析度給使用者選擇,這個選項的設定對於沒有外接顯示器的情況下,可以強迫軟體使用固定的解析度輸出,對於使用者在沒有實體螢幕但要用 VNC 遠端連線時非常重要。 raspi-config 內 Interfacing Options 選項 Camera:如果有用板子上的攝影鏡頭傳輸線,需要將這個選項點選啟動。 SSH:啟動 ssh 伺服器,讓其他的電腦可以使用 ssh 遠端連線至 pi。 VNC:啟動 vnc server,客戶端可以用 RealVNC 連接至 pi。 SPI:系統啟動時自動載入 SPI 的核心模組。 I2C:系統啟動時自動載入 I2C 核心模組。 Serial:使用 RX/TX 接腳作為核心訊息傳遞。 1-Wire:啟動 1-Wire 感測器接腳的運作模式。 Remote GPIO:啟動遠端存取 GPIO 接腳的模式。 Debian 升級套件指令 apt APT 是 Debian 及其衍生的 Linux 軟體包管理器。apt 最主要的用途在安裝以及升級各種的軟體套件。 Apt 主要是透過一個軟體更新列表,提供目前最新的軟體版本狀態,平常需使用 apt update 進行更新軟體版本列表。 透過 apt 可以方便的安裝例如 ffmpeg(影片壓縮)、imagemagic(影像格式轉換)、mplayer(媒體撥放器)、joe(文字編輯器)等程式。 apt install ffmpeg:安裝 ffmpeg 程式 apt install mplayer:安裝 mplayer 媒體撥放程式 apt remove ffmpeg:移除 ffmpeg 程式 apt search ffmpeg:搜尋可以安裝跟 ffmpeg 相關的軟體 systemctl 設定 pi 開機時自動啟動背景服務 開機時可以啟動各種服務,例如自動取得 ip、網路芳鄰(samba)、週期性服務(cron)、遠端連線(ssh)等,都可以用 systemctl 來設定或更改啟動狀態,以及關閉各種目前啟動的服務。 systemctl 操作指令 服務名稱,需要注意 systemctl 需要在 root 的權限下才能使用,因此常搭配 sudo 使用。例如 ssh 服務: systemctl start ssh:啟動 ssh 服務(可以遠端連線至 pi) systemctl stop ssh:停止 ssh 服務(這樣就斷線了,小心) systemctl restart ssh:重新啟動 ssh 服務 systemctl status ssh:目前 ssh 服務的狀態(啟動或關閉) cron 設定週期執行指令 自動化週期設定,可以讓我們在某一個設定好的時間,自動的讓系統可以執行某一個程式,這對於 pi 而言,可以大幅度的提升各種時間搭配環境的應用。 cron 透過 systemctl 可以設定開機之後就自動執行,並且將 /etc/crontab 的設定載入至記憶體中,然後觀察目前的時間點,需要啟動哪一個程式開始執行。 我們可以透過 /etc/crontab 設定固定多少分鐘執行一次指令,或者多少小時或多少天之後自動執行我們需要的動作,這樣只要專心的將各個單獨功能的程式寫好,時間到了 cron 就會依據 /etc/crontab 裡面設定好的時間條件,幫我們自動執行所需要的功能。 /etc/crontab 設定週期工作排程內容 Linux 的檔案管理指令 檔案的建立、顯示、複製、搬移、刪除、搜尋是最常用的部分 顯示檔案內容:cat 檔案內容 顯示目前路徑所含有的檔案:ls –al * 複製檔案:cp 來源檔案名稱或目錄名稱 目的檔案名稱或目錄名稱 搬移檔案:mv 來源檔案名稱 目的檔案路徑 刪除檔案:rm 檔案名稱 搜尋檔案:find ./ -name “*aiot*”  找尋目前所在目錄內,含各子目錄內有 *aiot* 檔案名稱 補充資料:Setting up your Raspberry Pi Linux 檔案命令範例 pwd:顯示目前的工作路徑 mkdir piaiot:在目前所在路徑的子目錄,建立 piaiot 子目錄 cd piaiot:切換至 piaiot 子目錄 ls -al:顯示目前工作目錄(aiot)的所有檔案 cp *aiot* /tmp:將名稱包含 aiot 的檔案複製到 /tmp 底下 chmod 755 *:將目錄內所有檔案權限設定為 +rwxr-xr-x rm *aiot*:將名稱包含 aiot 檔案刪除(要小心,刪除無法復原) uptime:目前系統從開機到現在已經經過多久的時間(這可以觀察是否 pi 運作的過程中,是否有不穩定重開機的現象) top:系統運作的狀態,可以觀察記憶體與 cpu 的使用量 Linux 掛載外部周邊裝置(mount) Linux 許多的周邊裝置都是用檔案的概念來做為存取資源的途徑。在 linux 使用 mount 指令來掛載許多外部的資源。 一般使用 mount 指令掛載 device,最常見方式像這樣 mount -t type device dir 例如掛載光碟映像 .iso 檔案至某一個子目錄之下 mount -t iso9660 -o loop /home/seal/myiso.iso /mnt/myiso 如果想查看系統中所有設備掛載的狀況,可以直接執行 mount 指令不加任何參數。 要卸載目前掛載的資源, 可以使用 umount 掛載目錄,例如上面卸載的指令為 umount /mnt/myiso。 Linux 壓縮、解壓縮指令 有各式各樣的壓縮軟體可以在 linux 底下執行 最常用的是tar,近年來常用的有 bzip2 以及 xz, windows 上常用的 zip 在 linux 上也有支援,7z 需要用 apt install p7zip-full 來安裝。 tar cvf pi.tar /home/pi : 將/home/pi打包成為 pi.tar (無壓縮)。 tar zcvf pi.tar.gz /home/pi:將 /home/pi 壓縮成 pi.tar.gz 檔案。 bzip2 pi.tar : 將 pi.tar 用 bzip2 壓縮為 pi.tar.bz2。  tar zxvf pi.tar.gz:將 pi.tar.gz 解壓縮至目前工作的目錄。 tar jxvf pi.tar.bz2:解壓縮 pi.tar.bz2 至目前工作的目錄。 Linux 的文字編輯器 大部分 linux 內建文字編輯器為 vi。 近年來有輕量級的文字編輯器 nano。 另外可以透過 apt 指令安裝如 joe、emacs、sublime、vscode 等文字編輯器。 各編輯器的操作方式都不太一樣,vi 需要背一些常用的操作指令,目前大都使用 vi 的新版 vim,來做為內建的文字編輯器軟體。 用 ip 指令來觀察跟設定 ip 位址 ip 指令整合 ifconfig 與 route 這兩個指令,同時能 進行額外的 IP 協定設定,包括多 IP 設定。 ip address show:顯示目前的 ip 設定 ip link set wlan0 down:關閉網路介面(斷網, 要在單機測試) ip link set wlan0 address cc:cc:cc:cc:cc: 更改 wlan0 的 mac  ip address add 192.168.50.50/24 broadcast 255.255.255.0 dev wlan0 label wlan0:test (新增一個子網路設定) ip address del 192.168.50.50/24 dev wlan0:test  (刪除 wlan0:test 設定) 用 ip 指令來觀察跟設定 ip 路由 ip route show:顯示目前網路卡的路由 ip route add 192.168.5.0/24 dev wlan0:test ip route add 192.168.10.0/24 via 192.168.50.50 dev wlan0  (增加對 192.168.10.0/24 的路由, 必須由 192.168.50.50 轉發) ip route add default via 192.168.1.254 dev wlan0 (wlan0 的預設 gateway,記得 default gateway 只能有一個) Pi 如何設定無線網路 Pi 無線設定在 /etc/wpa_supplicant/wpa_supplicant.conf,這個檔案內包含連線時的 ssid 以及連線用的密碼。 按照格式修改 ssid(無線基地台名稱)與 psk(無線基地台的密碼),可以設定很多個基地台的資料,方便在不同場地自動登入。 知識點回顧 可以設定 /etc/sudoers,讓一般使用者能夠使用 sudo 指令切換為 root 的身分,透過 apt 指令來進行 pi 軟體的升級。 擁有 root 身分之後,可以使用 systemctl 來設定各種的系統服務,以及 cron 來執行特定或週期時間的各種指令。 pwd 可顯示目前工作的路徑,之後使用 mkdir 可建立子目錄,cd 切換工作路徑,cp 複製檔案,rm 刪除檔案或子目錄。chmod 可以更改檔案的權限,在安裝系統或程式的時候需要注意權限的正確性。 uptime 可以顯示目前 pi 從開機到現在已經工作多久,top 可以顯示目前那些程式使用 cpu 以及記憶體的狀態。 mount 指令可以掛載 usb 的硬碟,以及各種外部的裝置。 ip指令能夠設定網路卡 ip 的設定以及 route 路由的設定,相對過去 ifconfig 以及 route 相對方便許多。 /etc/wpa_supplicant/wpa_supplicant.conf 可以設定多個 ap 的 ssid 跟密碼,方便之後切換不同場地時的無線網路連線。 作業 請參閱作業範例 : 作業1 : 使用 raspi-config 更改 root 的密碼,設定連線的無線基地台,開啟 ssh 伺服器,確定可以用遠端連線進入 pi。 作業2 : 切換至 /opt 路徑,建立一個 /opt/aiot 子目錄,切換至 /opt/aiot 子目錄,用 wget 指令下載一個網路上的檔案,下載完成後用 ls –al 指令,確定下載的檔案存在。 作業3 : 切換至 / 根目錄(指令: cd /),壓縮 /opt 子目錄進行備份,使用 tar zcvf opt.tar.gz  /opt,以及bzip2 opt.tar.gz 壓縮成 bz2 格式,最後將 opt.tar.gz 用 tar zxvf opt.tar.gz 指令練習解壓,或者將 opt.tar.gz 解壓至 /tmp 之下,確定 /opt 子目錄有壓縮備份成功 。 參考資料 一次做好 Raspberry Pi 3B+ 系統安裝 ( 沒螢幕 沒鍵盤 沒滑鼠 ) 本文件講解有關 raspi-config 的操作設定,內含如何設定不用滑鼠、鍵盤、螢幕的 pi 遠端控制安裝模式。 Ubuntu apt 安裝指令 本篇是常用 apt 指令的簡易說明,可以方便常用只會用最簡單的指令。 15 Examples of How to Use New Advanced Package Tool (APT) in Ubuntu/Debian 想要瞭解深入的 apt 指令各種參數的範例,可以看這一篇文件,偶爾在 apt 出現一些問題時,可以參考用來修復一些可能的 apt 問題。 Linux systemd 系統服務管理基礎教學與範例 本篇介紹如何在各種 Linux 下使用 systemctl 指令管理 Systemd 的系統服務。 傳統上的 Linux 都是靠 System V 的 init 來啟動各項系統服務,而後來新的 Systemd 出現之後,許多主流的 Linux 發行版都改用 Systemd 來管理系統服務,新的 Systemd 跟傳統 System V 的 init 相比,開機速度更快、效能更好、具有相依性檢查功能。 Linux 設定 crontab 例行性工作排程教學與範例 本篇介紹如何在 Linux 系統上使用 crontab 工作排程,設定讓系統定時自動執行指定的指令或程式。 Linux 的管理者或使用者如果需要定期執行某些指令或程式,最常見的方式就是使用 cron 來幫忙管理例行性工作排程,只要設定好 crontab 設定檔之後,系統就會自動依照設定的時間,定期執行重複性的工作。 External storage configuration 掛載一個週邊裝置是很重要的概念,Unix 所有的周邊裝置都是使用檔案形式來做為存取的進入點。 Linux 檔案系統掛載(mount)使用教學與範例 這裡將介紹在 Linux 中常用的掛載方式,也就是 mount 與 umount 兩個指令的使用方式 GNU/Linux各種壓縮與解壓縮指令 壓縮軟體是系統備份重要的工具,最主要要參考的是不同壓縮軟體的壓縮與解壓縮參數,本文可以當作一個快速提示的參考。 讓 Ubuntu 可以壓縮/解壓縮 RAR 檔案 linux 剛安裝的時候是不能解壓 rar 檔案的,只有在安裝瞭解壓工具之後,才可以解壓 rar。 apt install rar。 apt install unrar。 每個開發者都應該要會用的編輯器 – vim Vim 是大部分系統都有內建的編輯器,所以當你打開一個全新的電腦,或是用任何人的電腦,他們不一定會裝你熟悉的 sublime 或是 vs code,但是一定有 vim 可以用。再者,它可以直接在 terminal 介面裡面操作,當你只是需要快速修改某個檔案,或是握一些簡單的編輯又不想開肥大的 IDE 時,vim 是個非常方便的選擇。 設定 pi 的無線網路 講述如何透過 raspi-config 直接設定網路的方法,相對需要更多設定的時候,會需要 /etc/wpa_supplicant/wpa_supplicant.conf 相關的設定,可以參考官方文件的做法。 [基礎] 命令列設置無線網路 這一篇是中文版本的文件,包含了無密碼方式的設定,以及 wep 的密碼設定方式。 修復/etc/sudoers 如果你的 /etc/sudoers 壞掉了,最簡單的方法是把你的 sdcard 拔下來,另外稍一片 sdcard 可以開機的狀態下,將原始的 sdcard 掛在 pi 上面當作另外一個硬碟來使用,這樣就會可以修改另外一個硬碟的內容。 重新編輯 /etc/sudoers 完成存檔後,可以關機,然後把修好的 sdcard 插在 pi 上開機,這樣的方式與 ubuntu 失敗的過程修復方式是相同的。 How to Fix “Username is not in the sudoers file. This incident will be reported” in Ubuntu