Linux學習筆記(0):寫在Linux 學習筆記之前

[2018/04/20]
早在個人電腦還是386、486的時代,那時執行的作業系統是 DOS,網路是用電話撥接的 MODEM數據機,最常使用的文字編輯器是 PE2,常被用來寫程式的語言是Basic,使用的資料庫稱做 DBASE,還有一套試算表叫做 Lotus 1-2-3 ...,有很多過去個人電腦發展的回憶

1994年剛好有個機會參加交大的校園網路研討會,會議上發了一份光碟,稱做「雲觀」,這也開啟我後來學習使用 Linux 的起源。那時撥接的網路時代,有電子布告欄BBS,也有個瀏覽文件的通訊協定稱做Gopher,後來都被WWW的服務取代了,檔案傳輸使用FTP,還有個線上遊戲稱做泥巴(Mud)...,都是在當時非常先進的東西。

不知是否有人知道這片光碟?內容有 FreeBSD跟SlackWare 2.0.0兩套 Linux的作業系統。這套光碟的封面跟內頁是這樣:



光碟的封面印有「雲觀」兩個大字:


光碟內的目錄檔案:



這片光碟在現在的電腦可能已經無法安裝了,我一直保存著這片光碟,過去的二十幾年,雖然持續使用 Linux 作為公司伺服器架設用,我卻沒有留下相關筆記跟記錄,說來有點慚愧。最近利用時間在學習 ELK (Elasticsearch、Logstash及Kibana的簡稱) 的同時,努力紀錄一下學習的筆記,因而寫了這段緣起的文章,希望持續有新的文章產出。

[參考資料]


[修訂紀錄]
2018.04.20 初稿




Raspberry Pi 筆記(四十六):安裝流量圖形顯示 MRTG

[2018/03/28]
公司最近在發展的系統之一就是將設備的syslog收集起來,作為查詢、儀表板及報表用,但是最近要將SNMP跟Netflow的資料加到系統中。利用樹莓派先瞭解一下SNMP (簡單網路管理協定 Simple Network Management Protocol)的設定方式,到時可跟工程師討論作法。這裡我們實作一下將SNMP的資料,呈現到 MRTG(Multi Router Traffic Grapher)網頁。

MRTG流量圖常被用來作為網路流量使用,除此也可以將CPU、記憶體以及磁碟用量等透過網頁呈現。若要經由網頁顯示,就需要有Web Server,如Apache、Nginx、Lighttpd 都可以用來作為顯示MRTG流量的網頁伺服器。本實作以Lighttpd來提供網頁服務,安裝過程可自行更換成喜好的Web Server。流量顯示圖如下:


MRTG的安裝有好幾個方式,可以執行下載壓縮檔安裝,或是直接從套件庫進行安裝,指令如下:
$ sudo apt-get -y install mrtg snmp snmpd

安裝過程會出現一個視窗畫面,如果要設定讀取SNMP資料的權限,可以設定為YES,只有 root 才能讀取 /etc/mrtg.cfg,但是如果要用RRD Tool 來畫圖的話,需要設成NO。


設定SNMP
這裡先設定基本的 SNMP,讓SNMP可以運作,重新啟動前先編輯SNMP Daemon設定檔:
$ sudo nano /etc/snmp/snmpd.conf

將這兩行
    agentAddress  udp:127.0.0.1:161
    #rocommunity public  localhost

改成
    agentAddress  udp:161
    rocommunity public localhost

重新啟動 snmpd 服務。
$ sudo service snmpd restart

安裝 Web Server
使用以下指令安裝lighttpd 套件:
$ sudo apt-get install lighttpd

Lighttpd的工作目錄首頁在 /var/www/html,在該目錄下建立一個 mrtg目錄,作為存放mrtg的網頁使用
$ sudo mkdir /var/www/html/mrtg

設定 MRTG
產生一個新的 MRTG 設定檔,放在 /etc目錄下:
$ sudo cfgmaker --output /etc/mrtg.cfg public@localhost

修改mrtg.cfg的工作目錄,從 /var/www/mrtg 改成 /var/www/html/mrtg :
$ sudo nano /etc/mrtg.cfg



除了工作目錄要設定,還有另一個部分要修改,您會看到 /etc/mrtg.cfg 檔案內,有lo、eth0跟wlan0幾段看起來像html語法的段落,這是稍後要產生index.html的設定檔,因我的樹莓派使用無線網路連接,我就將wlan0那段的 # 全刪掉,前幾行設定如下:
Target[localhost_3]: 3:public@localhost:
SetEnv[localhost_3]: MRTG_INT_IP="192.168.0.106" MRTG_INT_DESCR="wlan0"
MaxBytes[localhost_3]: 12500000
Title[localhost_3]: Traffic Analysis for 3 -- raspberrypi

使用indexmaker指令產生 MRTG 首頁:
$ sudo indexmaker --output=/usr/www/html/mrtg/index.html /etc/mrtg.cfg

連結至樹莓派 Web Server,就可以看到 MRTG 流量圖。剛啟動時,不會有流量,要過1-2個小時之後,才會產生流量:
http://192.168.0.106/mrtg/index.html

點下首頁的流量圖(這是過了一天的紀錄),可再細分日、週、月、年的流量分析。


以上只是實作網路的流量記錄,如要紀錄CPU、記憶體還要再進行設定。

[CPU使用量、溫度及記憶體用量]

若要得知CPU 的可用率,可用 snmpget 指令查詢受監控CPU的可用率,指令如下:
$ snmpget -v 1 -c public localhost .1.3.6.1.4.1.2021.11.11.0
傳回以下值:
iso.3.6.1.4.1.2021.11.11.0 = INTEGER: 99
.1.3.6.1.4.1.2021.11.11.0 是 cpu的 OID (Object Identifier),99表示目前可用率。

若要得知CPU的溫度,可以 cat /sys/class/thermal/thermal_zone0/temp 這個檔案,這裡紀錄CPU的溫度,寫一個批次執行檔來取得:
$ nano snmp-cpu-temp.sh
#!/bin/bash
if [ "$1" = "-g" ]
then
        echo .1.3.6.1.2.1.25.1.8
        echo gauge
        cat /sys/class/thermal/thermal_zone0/temp
fi
exit 0

將文字檔改成執行檔:
$ chmod +x snmp-cpu-temp.sh

執行指令時,用 -g 帶入參數:
$ ./snmp-cpu-temp.sh -g

得到以下結果,溫度為攝氏 41.160度:
.1.3.6.1.2.1.25.1.8
gauge
41160

接著將這個批次指令設定到 snmpd.conf  :
$ sudo nano /etc/snmp/snmpd.conf

加入以下設定:
pass     .1.3.6.1.2.1.25.1.8 /bin/sh /home/pi/snmp-cpu-temp.sh

修改完設定檔後,重新啟動snmpd服務:
$ sudo /etc/init.d/snmpd restart

透過snmp取得cpu溫度:
$ snmpget -v 1 -c public localhost .1.3.6.1.2.1.25.1.8
得到以下結果:
iso.3.6.1.2.1.25.1.8 = Gauge32: 41160

接著編輯 MRTG 設定檔,加上CPU使用率、溫度跟記憶體使用量:
$ su nano /etc/mrtg.cfg
在設定檔中增加以下這段設定:
LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt

Target[CPU]: 100 - .1.3.6.1.4.1.2021.11.11.0&.1.3.6.1.4.1.2021.11.11.0:public@localhost 
Options[CPU]: integer, gauge, nopercent, growright, unknaszero, noo 
MaxBytes[CPU]: 100 
YLegend[CPU]: CPU % 
ShortLegend[CPU]: % 
LegendI[CPU]: CPU 
Legend1[CPU]: CPU usage 
Title[CPU]: Raspberry Pi CPU load 
PageTop[CPU]: <H1>Raspberry Pi - CPU load</H1>

Target[Memory]: .1.3.6.1.2.1.25.2.3.1.6.1&.1.3.6.1.2.1.25.2.3.1.6.3:public@localhost 
Options[Memory]: integer, gauge, nopercent, growright, unknaszero, noo 
MaxBytes[Memory]: 100524288 
YLegend[Memory]: Mem - 1K pages 
Factor[Memory]: 1024 
ShortLegend[Memory]: B 
LegendI[Memory]: Physical 
LegendO[Memory]: Virtual 
Legend1[Memory]: Physical 
Legend2[Memory]: Virtual Memory 
Title[Memory]: Raspberry Pi Memory Usage 
PageTop[Memory]: <H1>Raspberry Pi - Memory Usage</H1>

Target[CPU-temp]: .1.3.6.1.2.1.25.1.7.0&.1.3.6.1.2.1.25.1.8:public@localhost 
Options[CPU-temp]: integer, gauge, nopercent, growright, unknaszero, noi 
Factor[CPU-temp]: 0.001 
MaxBytes[CPU-temp]: 100000 
Title[CPU-temp]: CPU temperature on Raspberry Pi 
YLegend[CPU-temp]: Temperature °C 
ShortLegend[CPU-temp]: °C 
Legend2[CPU-temp]: CPU temperature in °C 
LegendO[CPU-temp]: CPU temperature
PageTop[CPU-temp]: <H1>Raspberry Pi - CPU Temperature</H1>

接著設定將 MRTG 加到樹莓派啟動時就自動執行,產生一個 mrtg 啟動檔於 /etc/init.d
$ sudo nano /etc/init.d/mrtg
開機批次執行檔如下:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
DAEMON="/usr/bin/mrtg" 
PARAM=" --user=root /etc/mrtg.cfg --logging /var/log/mrtg.log" 
NAME="MRTG" 
DESC="Multi Router Traffic Grapher Daemon"

test -f $DAEMON || exit 0 
set -e 
case "$1" in 
start) 
        echo -n "Starting $DESC: " 
        env LANG=C $DAEMON $PARAM 
        echo "$NAME." 
        ;; 
stop) 
        echo -n "Stopping $DESC: " 
        killall -9 mrtg 
        echo "$NAME." 
        ;; 
restart|force-reload) 
        echo -n "Restarting $DESC: " 
        killall -9 mrtg 
        sleep 1 
        env LANG=C $DAEMON $PARAM 
        echo "$NAME." 
        ;; 
*) 
        N=/etc/init.d/$NAME 
        echo "Usage: $N {start|stop|restart|force-reload}" 
        exit 1 
        ;; 
esac 
exit 0 

設定為可執行的檔案後,啟動服務:
$ sudo chmod +x /etc/init.d/mrtg
$ sudo /etc/init.d/mrtg start

就可以看到如本頁最上方的流量圖了。

[參考資料]

• MRTG Home: oss.oetiker.ch/mrtg/
Khurram Aziz : Monitoring Raspberry Pi


4位元數位電子時鐘 AT89C2051套件

[2018/03/20]
好久沒有用Arduino或是Raspberry Pi製作相關電子實驗,剛好兩三個星期前,一位好同事問到最近怎麼沒有再繼續寫部落格,才瞭解還是有人默默在關心這個園地。先前有很多個想做的實驗沒繼續完成,有了好友的支持,繼續打起精神。首先先到網路上買幾個感測元件,繼續實作相關實驗,這一切要先從簡單的電子鐘套件開始說起:

高中時代,對於電子套件非常著迷,有時就會買個好玩的套件自行焊接組裝,如拍手聲控自走車、測謊機等散裝零件,自己再照圖組裝焊接零件到電路版上,待成品完成時,非常有成就感。由於國中時,下課要幫忙家裡做手工,需要焊接燈泡的兩個錫點,對於焊槍的使用,很有把握。這次購買零件的商家,正好有賣電子時鐘套件,想要再回憶一下自行焊接組裝的樂趣,因此買了一個套件,利用今晚有空的時間組裝,焊接的結果好或不好就留給各位自行評斷。

這個套件有兩個設定的按鍵,擔心時間久了,找不到套件的操作方法。因此將操作方法稍微整理一下,記錄在本篇文章中。

[功能]

1.秒校正(用於精確校時)
2.可切換到分秒獨立顯示介面
3.整點報時(8-20點整點報時3秒鐘,可關閉)
4.兩路鬧鐘設置(可關閉鬧鐘功能)

[套件特點]

A.採用0.56寸時鐘專用紅色數碼管作顯示
B.進口AT89C2051作主控晶片
C.1.2mm厚PCB由軍工級FR-4板材製成
D.走時精准,走時誤差範圍為每24小時誤差-1~+1秒.

[電子零件]

電子零件的主要IC為AT89C2051,買來的時候,程式已經燒路在IC內。其他還包括四位數七段顯示器、按鍵、蜂鳴器等。


焊接好的成品:正面


焊接好的成品:背面 (有點不太清楚),自覺焊接已經生疏許多。


供電後的情況:


[時鐘操作設定]

供電後顯示12:59的走時介面,預設兩路鬧鐘均開啟,且第一路鬧鐘設定在13:01;第二路鬧鐘設定在13:02。

供電後短按S2,可在時分走時介面和 分秒走時介面之間切換;長按S1鍵,進入系統選單設定,共有A-I 九個選項,短按S1,選項設定跳往下一個字母,最後回到走時介面。九個設定說明如下:

子選項
功能
操作方法
A
校正小時
S2,數字加1;調好後短按S1保存,退出本選項進入B選項。
B
校正分鐘
S2,數字加1;調好後短按S1保存,退出本選項進入C選項。
C
調整報時開關
預設狀態為ON(8點到20點整點報時開關),按S2可在ONOFF(關閉整點報時)之間切換;調好後短按S1保存,退出本選項進入D選項。
D
第一路鬧鐘設定
預設狀態為ON(第一路鬧鐘開啟),按S2可在ONOFF(關閉第一路鬧鐘)之間切換。若設為ON,短按S1保存退出本選項進入E選項;若設為OFF,短按S1保存退出後,直接進入G選項。
E
第一路鬧鐘小時設定
S2,數字加1;調好後短按S1保存,退出本選項進入F選項。
F
第一路鬧鐘分鐘設定
S2,數字加1;調好後短按S1保存,退出本選項進入G選項。
G
第二路鬧鐘設定
預設狀態為ON(第二路鬧鐘開啟),按S2可在ONOFF(關閉第二路鬧鐘)之間切換。若設為ON,短按S1保存退出本選項進入H選項;若設為OFF,短按S1保存退出後,直接回到走時介面。
H
第二路鬧鐘小時設定
S2,數字加1;調好後短按S1保存,退出本選項進入I選項。
I
第二路鬧鐘分鐘設定
S2,數字加1;調好後短按S1保存,退出本選項回到走時介面。

Raspberry Pi 筆記(四十五):安裝R語言及互動介面的 Shiny Server

[2017/12/14]
只要有學過統計的人,對於R語言並不陌生。R語言,一種自由軟體程式語言與操作環境,主要用於統計分析、繪圖、資料探勘。R本來是由來自紐西蘭奧克蘭大學的羅斯·伊哈卡和羅伯特·傑特曼開發(也因此稱為R),現在由「R開發核心團隊」負責開發。R基於S語言的一個GNU計劃專案,所以也可以當作S語言的一種實現,通常用S語言編寫的代碼都可以不作修改的在R環境下執行。[維基百科]




Shiny Server是一個快速可將 R 統計結果,呈現在網頁上的伺服主機程式。Shiny是 Rstudio 這家公司開發的產品,自2012年推出後,廣受大家好評與喜愛,讓不懂網頁程式的 R語言使用者,可以輕鬆的部署互動式的統計資料在網頁上。



[R語言安裝程序]

編輯套件更新的來源 URL,編輯 /etc/apt/sources.list
$ sudo nano /etc/apt/sources.list

將以下這行加到 sources.list 最後一行:
deb http://archive.raspbian.org/raspbian/ stretch main

執行更新及安裝 R語言
$ sudo apt-get update
$ sudo apt-get install r-base r-base-core r-base-dev

到這裡,R語言已經安裝完成,可輸入 R 啟動程式,q() 退出程式。
$ R

[安裝 Shiny-Server]

安裝 Shiny 前需要先安裝以下套件:
•  python 2.6 or 2.7 (3.x 目前尚不支援)
•  cmake (需 2.8.10之後版本),如要安裝 cmake 套件的話,可執行以下指令進行安裝:
$ sudo apt-get install cmake

•  gcc (需 4.8或更新版本)
•  g++ ( 需 4.8或更新版本)
•  git
•  R-base-devel (請參考前面安裝方法)


(1) 安裝 R 的 Shiny套件
$ sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\"" 

(2) 從 GitHub 下載程式
$ git clone https://github.com/rstudio/shiny-server.git

(3) 建立一個暫存的目錄 Get into a temporary directory in which we'll build the project
$ cd shiny-server
$ mkdir tmp
$ cd tmp

(4) 增加 bin 目錄到路徑中
$ DIR=`pwd`
$ PATH=$DIR/../bin:$PATH

(5) 用以下指令檢查 Python 版本是否為 2.6.x 或 2.7.x
$ PYTHON=`which python`
$ $PYTHON --version

(6) 使用 cmake 作為 make 的前置設定,如果要將程式安裝在不同路徑下,可修改"--DCMAKE_INSTALL_PREFIX" 參數
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DPYTHON="$PYTHON" ../

(7) 假使這裡有錯誤,檢查一下 python 版本是否正確?編譯時間會花比較多時間,大約要將近一個多小時,要稍微耐心等候。
$ make
$ mkdir ../build
$ (cd .. && ./bin/npm --python="$PYTHON" install)
$ (cd .. && ./bin/node ./ext/node/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js --python="$PYTHON" rebuild)

(8) 安裝軟體到預設位置
$ sudo make install

(9) 建立 shiny-server 執行檔捷徑,放置於 /usr/bin
$ sudo ln -s /usr/local/shiny-server/bin/shiny-server /usr/bin/shiny-server

(10)建立 shiny 使用者
$ sudo useradd -r -m shiny

(11) 建立日誌、設定及應用程式目錄
$ sudo mkdir -p /var/log/shiny-server
$ sudo mkdir -p /srv/shiny-server
$ sudo mkdir -p /var/lib/shiny-server
$ sudo chown shiny /var/log/shiny-server
$ sudo mkdir -p /etc/shiny-server

(12) 下載預設的設定檔
Shiny Server 安裝完成後,是沒有設定檔的,設定檔名為 shiny-server.conf,存放在 /etc/shiny-server/ 目錄下,假使沒有這個檔案,就會使用預設值當作設定。可以到以下網站下載預設的設定檔:
$ cd /etc/shiny-server/
$ sudo wget http://withr.me/misc/shiny-server.conf

(13) 執行程式
$ sudo shiny-server


(14) 使用瀏覽器進行連線,我的 Pi IP為192.168.1.103,連線方式要帶 Port 號:3838

http://192.168.1.103:3838

(15) 建立 server.R 及 ui.R 程式
瀏覽器看到的是空白對嗎?主要是因為安裝完成後,Shiny Server沒有網頁程式可呈現,需自行將放置在 /srv/shiny-server 目錄內,先建立一個目錄,再將 server.R 及 ui.R兩程式放在目錄內。


• 方法一:自行建立 server.R 及 ui.R,以 hello為範例
$ cd /srv/shiny-server
$ mkdir hello_shiny
$ cd hello_shiny

分別建立 server.R 及 ui.R,我參考官方教學說明,列出程式範例:

server.R
library(shiny)
# Define server logic required to draw a histogram
shinyServer(function(input, output) {

  # Expression that generates a histogram. The expression is
  # wrapped in a call to renderPlot to indicate that:
  #
  #  1) It is "reactive" and therefore should re-execute automatically
  #     when inputs change
  #  2) Its output type is a plot
  output$distPlot &le- renderPlot({
    x    &le- faithful[, 2]  # Old Faithful Geyser data
    bins &le- seq(min(x), max(x), length.out = input$bins + 1)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
})


ui.R
library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(

  # Application title
  titlePanel("Hello Shiny!"),

  # Sidebar with a slider input for the number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot")
    )
  )
))


• 方法二:下載網路上的程式
網友 Huidong Tian 在以下網站放了 server & ui 的程式,可供下載:

$ cd /srv/shiny-server
$ mkdir kmeans; cd kmeans
$ wget http://withr.me/misc/kmeans/ui.R
$ wget http://withr.me/misc/kmeans/server.R



這裡有一些範例可下載參考: rstudio/shiny-examples
使用 Shiny,官方有相關教學說明:https://shiny.rstudio.com/tutorial/

[問題]

第一次安裝完成時,執行 shiny-server,透過Web連線時會出現以下錯誤訊息:

Error: An error has occured. Check your logs or contact the app author for clarification.

發現是寫log 檔案的問題,修正方式是要在 shiny-server.config 設定檔中,加入開啟 Log保留的設定:

$ cd /etc/shiny-server
$ sudo nano shiny-server.conf

在檔案內加入以下一行,網頁就可以正常執行,如下圖:
preserve_logs true;



[參考資料]
• Huidong Tian:Install Shiny Server on Raspberry Pi
• RStudio:shiny gallery
• https://github.com/rstudio/shiny-server/wiki/Building-Shiny-Server-from-Source

Raspberry Pi 筆記(四十四): 使用群暉Synology 雲端裝置儲存Webcam 錄影資料

[2017/12/12]
最近有朋友問到一些樹莓派上使用WebCam的問題,如果要看即時動態資料,只要樹莓派連接到網際網路,就可以透過瀏覽器看到即時影像。如果要將影像存檔的話,就需要透過其他的系統進行儲存。

我有一個群暉Synology的NAS DS214 Play,系統上可以安裝 Surveillance Station來對 IP CAM的裝置進行錄影存檔的功能,如果使用 DDNS機制,還可隨時連線至家裡的群暉主機,看到即時的影像。以下就來看看如何進行設定:

(圖片取自網路)
 

[安裝影像軟體 Motion]

有關Motion 的安裝與設定可以參考我的另一篇文章:Raspberry Pi 筆記(十九): Webcam 拍照與瀏覽串流媒體 。

(1)先檢查插在USB的 Webcam 是否已經驅動:
$ sudo lsusb
Bus 001 Device 006: ID 046d:081b Logitech, Inc. Webcam C310
...

(2)安裝 motion 軟體
$ sudo apt-get install motion

(3)安裝完成後,修改設定檔 motion.conf ,將DAEMON OFF改為ON,設定為自動啟動 motion,Webcam_localhost ON改為 OFF,不從Raspberry Pi連線至Webcam:
$ sudo vi /etc/motion/motion.conf
daemon on
steam_localhost off

# Web連線使用8081 Port
webcam_port 8081

# 管理用的連線使用8080 Port
control_port 8080

#如果要修改畫面大小,可修改
# 影像寬度 (pixels). 預設: 320
width 640

# 影像高度 (pixels). 預設: 240
height 480

# 影像品質(百分比). 預設: 75
webcam_quality 100

(4)修改 /etc/default/motion 將 start_motion_daemon=no 改為 yes
$ sudo vi /etc/default/motion
start_motion_daemon=yes

(5)重新啟動motion服務
$ sudo service motion restart

[設定群暉Synology DSM進行監視錄影]

(1) 安裝 Surveillance Station 套件
登入群暉NAS管理介面 DSM,登入後桌面上有一個「套件中心」,點選左方的「商務」選項,找到 Surveillance Station進行安裝:


(2) 安裝設定網路攝影機
執行 Surveillance Station,開始安裝攝影機:選擇「網路攝影機」,再按「新增」。

選擇「完整設定」,再按「下一步」:

這時會看到以下畫面,輸入 Raspberry Pi IP及Port 8081,選擇「MJPEG」格式,如以下畫面:

接著按「下一步」,出現以下畫面:

再按「下一步」,出現以下畫面:設定錄影畫質及儲存NAS位置。

再按「下一步」,出現以下畫面:設定錄影排程。

按下「完成後」,就可以透過 synology的DSM介面看到影像,並進行錄影存檔的動作。如果要管理影像可按「錄影」,進行管理作業:

亦可按「即時影像」看目前攝影機的畫面: