模擬機, 虛擬機, 容器, 應用環境閒聊

最近在練習使用 Docker 跟 LXC 建立 PHP + MariaDB 環境.

雖然聽說 Docker 一到兩年, 不過以前虛擬環境都是用 VirtualBox 跑 Windows 居多, Linux 大多是較舊的實體機直接上線.

到一年多前, 開始用 Proxmox VE , 在桌上型電腦裝常態性的虛擬機用. 這幾個月在公司用某台實體 Windows 電腦裝 XAMPP 寫一些監測程式, 想說監測也需要一些 SMTP 跟 SNMP 功能, 還是弄個 Linux 虛擬環境, 看到 Proxmox VE 有支援 Docker 跟 LXC , 就試試看.

而跟虛擬機不同的, 是虛擬的"層"不同:
模擬機: 是對於完全不同的 CPU 跟機械語言都能夠模擬, 例如在 x86 個人電腦執行模擬 6502 的 CPU , 然後在上面執行遊戲軟體.
虛擬機: 產生相近的 CPU 環境, 一般是特別指 x86 的 CPU , 在兩大業者分別支援 VT 跟 AMD-V 虛擬層級的功能後, 許多雲端業者也開始使用 VMware 賣虛擬機, 很多公司也逐漸將多台實體電腦縮減成 3 台(或多一點), 架成 Cluster , Server 都虛擬化了.
容器: 以前 Linux 就有 chroot , 建立沙盒(sandbox)來避免執行中的環境有問題, 而 Linux 核心(kernel)也把沙盒這個概念, 做成容器(Container)的方式, 只要一些管理程式, 就可以直接創造出一套相近的環境. 以電影來說, 就有點像 #奇異博士 的 #鏡中世界 .
應用環境: 和 LXC 是對 Linux 建立虛擬環境不同, 還有很多軟體有各自的虛擬應用, 例如: 虛擬站台(Virtual Host), 同一套軟體對不同業者提供不同功能, 靠登入帳號區隔等. 而在 Linux 環境, 許多軟體的設定檔, 都是用純文字格式, 所以把一些軟體的應用環境檔案整理好, 就可以快速部署成新的應用環境, 而 Docker 就是最普遍的專案, 建立一個 Docker 引擎, 把需要的檔案包裝整理起來. 而有不少 Linux 發行套件(distribution)或包含軟體的環境, 都有 Docker 版本, 只要下載現成的 Docker 檔案, 就可以很快做出一個應用環境, 甚至可以修改後, 再存成自己要用的 Docker 檔案.

大概的分層概念就是這樣, 而看到許多業者也把 Docker 列為預先提供的選項, 在想微軟要跟 Ubuntu 合作, 還提供了 .Net , MSSQL Linux 版, 大概也是想盡快搶進這個應用市場, 讓個人用戶習慣, 商業用就可以賣授權跟虛擬機, 也可以推廣單機版吧.

LINE Notify 在 PVE + LXC + Ubuntu 筆記

之前使用 LINE Notify 是安裝在 Windows 的 XAMPP , 為了測試在 Linux 的功能, 安裝了 Proxmox VE + Ubuntu ( LXC 封裝), 大約步驟:

  1. Proxmox VE 6.1-1 ISO 檔, 用 Lubuntu 的 Disks 做成 USB 隨身碟開機.
  2. 下載 PVE 準備的 Ubuntu 18.04 LXC 封裝檔.
  3. 做成 CT 虛擬環境

然後在虛擬機內進行以下動作:

  1. 開一個戶頭, 給予 sudo 權限
  2. sudo apt-get update ; sudo apt-cache upgrade
  3. 安裝 php7.2
  4. 安裝 MariaDB , 執行初步設定, 新增 MariaDB 新帳號給最高權限.
  5. 安裝 phpMySQL
基本作業就這樣, 接下來是對於特定服務需要的工具:
  1. net-tools
  2. libsmbclient , php-smbclient : 未來透過網路芳鄰抓資料用;
    可能會再考慮裝 smbclient 與 mount.cifs 以便自動撈取資料備份等功能.
  3. curl , php-curl : 之前的 LINE Notify 透過 curl 送出 http 連線訊息.
大致上環境就這樣, 測試送英文訊息沒問題; 漢字輸入會變成 ^G^V 這樣, 用 ssh 進去或透過 PVE 介面都出現一樣的亂碼, 下次再測試 export LANG= 這部分看看.

Ubuntu 18.04 + MariaDB + phpMyAdmin root 密碼 認證 登入

 之前為了快速建立開發環境, 使用 Windows + XAMPP , Windows 的權限與 XAMPP 基本上是分開的.

而最近在試用 Proxmox VE + LXC + Ubuntu 安裝 MariaDB + PHP + phpMyAdmin , 由於 Linux 環境下, MariaDB 的管理員 root 認證, 預設是使用 Linux 本身的認證, 而 Ubuntu Linux 的 root 預設是只有本機才能連線, 造成 phpMyAdmin 連線時, 預設無法使用 root 登入.

解法: (技術方式不列)
1. 第一次於本機使用 root 登入, 建立另一組帳號, 給予各種權限.
2. 修改 MariaDB 的認證方式, 把 root 的認證由 Linux 認證改為 phpMyAdmin 認證.

用指標概念簡化程式架構

產線有感應器會每分鐘紀錄環境狀況, 為了更快發現環境是否有變化, 就可以透過程式分析紀錄的數值.
上週已經用移動平均的概念, 撈取最近一筆資料, 再比對往前一小時的平均值, 如果超過幾個標準差, 就通知工程師留意.
而實作上, 基本的功能就是用陣列, 再撈取指定的欄位, 以及最近的筆數來計算. 大概的步驟是:
  1. 設定撈取筆數, 分為平均用的筆數(例如: 60 )與比對用的筆數(例如: 3 , 因為分析程式每 3 分鐘執行一次, 所以比對最近 3 筆)
  2. 依目前時間, 將環境資料檔(.csv)讀入陣列, 因為每日會切割檔案, 所以凌晨 0:00~1:13 , 會讀兩個檔(當日與前一日), 用 60 + 3 再考慮電腦傳檔的誤差 10 分鐘. 這邊基本上還沒過濾, 因為檔案讀入陣列是一個 function 的設計, 不介入資料類型.
  3. 讀入陣列後, 用迴圈比對資料陣列, 挑出特定欄位, 直到滿足需要的筆數為止; 而這邊的設計就是可以考慮用指標, 或再產生一組新陣列存放真正需要的資料. 而選擇用指標, 是因為不同環境數值產生的陣列樣式不太一樣, 為了不同環境數值要寫幾次類似但不同的程式, 用指標只要紀錄對應原始陣列的哪幾列跟哪幾欄就好.
  4. 找到指標後, 就可以把預定算平均的欄位挑出來, 再把指定筆數(跳過 3 筆, 再往前抓 60 筆)計算出平均跟標準差.
  5. 然後再針對目前要處理的這一項, 比對最近的 3 筆, 與移動平均差了幾個標準差, 如果差太多, 就先紀錄在預定通知的陣列.
  6. 而全部的項目都執行過之後, 再來整理預定通知的陣列, 把需要通知的項目都轉成文字說明, 合併為同一串要傳送的文字.
  7. 最後檢查有需要通知的項目, 再把文字跟傳送對象, 轉給 LINE Notify function , 視情況也可以改成呼叫 mail 或其他通知方式.
除了用指標的方式, 也可以先定義好要撈取的欄位, 開檔案後直接邊撈邊比對, 但是考慮環境資料驗證的功能, 與讀檔案是否會造成 lock 的情況, 還是先複製一份, 之後直接把符合的筆數建立指標陣列處理.
https://www.linkedin.com/pulse/%25E7%2594%25A8%25E6%258C%2587%25E6%25A8%2599%25E6%25A6%2582%25E5%25BF%25B5%25E7%25B0%25A1%25E5%258C%2596%25E7%25A8%258B%25E5%25BC%258F%25E6%259E%25B6%25E6%25A7%258B-%25E8%2590%258A%25E5%25A7%2586-%25E5%258F%25B2
假日在宿舍測試 pve + ct 架 ubuntu mail relay ....

上班試試產線怎樣把錯誤直接 mail relay , 不然 php 要排程跑有時候反應比較慢.

postfix 當 mail relay , 因為公司是用 office 365 沒有內部 server , 產線也頂多連到辦公室不能對外.

所以在想產線旁架個偵測主機再送到辦公室
O365 只要用 smtp 寄我個人信箱就好.

目前比較怕公司防火牆連 smtp 都鎖

如果公司擋再申請, 或 mail 主機再轉發到 line notify (line notify 沒鎖)

目前是php + line notify , 只是想看看有沒有其他方法可以更好.

https://www.linkedin.com/posts/%E8%90%8A%E5%A7%86-%E5%8F%B2-778b40146_php-linenotify-ubuntu-activity-6628314428876128256-iJDL