Select Page

實戰教學:實現Ubuntu環境中高效的硬碟共享

在Ubuntu中要分享硬碟給另一台電腦,通常有兩種方法:使用網絡文件系統(NFS)與 Linux 或使用 Samba 與 Windows 共享。

以下是這兩種方法的步驟:

方法1:使用NFS(適合Linux系統)

安裝NFS服務器:

在提供共享的電腦上,打開終端並輸入以下命令安裝NFS服務器:

sudo apt update
sudo apt install nfs-kernel-server

配置共享目錄:

編輯/etc/exports文件來添加你想要共享的目錄。例如,如果你想共享/srv/nfs目錄,可以添加如下行:

sudo nano /etc/exports
/srv/nfs    *(rw,sync,no_subtree_check)

其中*表示所有人都可以訪問,rw表示讀寫權限,sync表示同步寫入硬碟,no_subtree_check是速度比較快的選項。

重啟NFS服務:

sudo systemctl restart nfs-kernel-server

在客戶端電腦上安裝NFS客戶端

sudo apt install nfs-common

掛載共享目錄:

sudo mount server_ip:/srv/nfs /mnt

記得把 server_ip 換成你分享主機的 IP

方法2:使用Samba(適用於Windows和Linux系統)

安裝Samba:

在提供共享的電腦上,安裝Samba:

sudo apt install samba

配置Samba共享:

輯Samba配置文件/etc/samba/smb.conf,在文件末尾添加如下配置:

sudo nano /etc/samba/smb.conf
[ShareName]
path = /srv/samba
read only = no
browsable = yes

請記得替換 ShareName 為你的共享名,/srv/samba 為你想共享的目錄。

重啟Samba服務:

sudo systemctl restart smbd

在另一台Ubuntu上訪問Samba共享:

可以在文件管理器的地址欄輸入 smb://server_ip/ShareName 來訪問共享,其中 server_ip 是Samba服務器的IP地址,ShareName是你設置的共享名。

Windows 上則是用檔案總管,並且在文字框內輸入 \\server_ip\ShareName

no_subtree_check 參數說明

no_subtree_check 是 NFS(網絡檔案系統)配置中的一個參數,用於改善NFS服務的性能。這個參數的作用與含義如下:

  1. 子樹檢查(Subtree Checking): 在NFS中,子樹檢查是一個安全特性,用來確保客戶端訪問的檔案仍然是它最初打開時的那個檔案。這是通過檢查檔案所在的目錄結構來實現的。如果檔案在檔案系統中被移動或重命名,NFS會通過子樹檢查來識別這些改變。
  2. no_subtree_check 的作用: 啟用 no_subtree_check 參數會禁用這種子樹檢查。這意味著NFS服務器不會檢查檔案是否被移動或重命名。這樣做可以提高性能,因為減少了服務器的檢查負擔。在大多數情況下,這是安全的,特別是在檔案不太可能在訪問期間被移動或重命名的環境中。
  3. 應用場景: 在許多常規的NFS使用情況下,子樹檢查是不必要的,因為檔案的移動並不頻繁。在這些情況下,禁用子樹檢查可以提供更佳的性能表現,尤其是在處理大量的檔案請求時。

分享文件的安全性設定

要限制特定IP地址的主機才能连接NFS共享,您需要在NFS的配置文件 /etc/exports 中明确指定允许的IP地址。以下是具体步骤:

編輯/etc/exports檔案:

sudo nano /etc/exports

指定允許的IP地址:

/etc/exports檔案中,您可以為每個共享目錄指定允許訪問的IP地址,我們要做的事情是把前面的*號替換成主機的IP。例如,如果您想只允許IP地址為192.168.1.100的主機訪問名為/srv/nfs的共享目錄,您可以這樣寫

/srv/nfs 192.168.1.100(rw,sync,no_subtree_check)

這行配置表示僅有IP地址為192.168.1.100的主機可以讀寫(rw)訪問/srv/nfs目錄。

您可以精確控制哪些IP地址的主機被允許訪問NFS共享。如果需要允許多個特定的IP地址,只需在/etc/exports檔案中的相應行裡添加這些IP地址,每個地址用空格分開。例如:

/srv/nfs 192.168.1.100(rw,sync,no_subtree_check) 192.168.1.101(rw,sync,no_subtree_check)

重啟NFS服務:

sudo systemctl restart nfs-kernel-server

開機時自動建立 NFS 連接

可以將 NFS 掛載點添加到客戶端主機的 /etc/fstab 文件中。/etc/fstab 文件用於在系統啟動時自動掛載文件系統。以下是一般步驟:

編輯 /etc/fstab 文件:

sudo nano /etc/fstab

添加 NFS 掛載條目:

[NFS 伺服器 IP]:/[遠端共享目錄] [本地掛載點] nfs defaults 0 0

如果 NFS 伺服器的 IP 是 192.168.1.100,遠端共享目錄是 /exported/folder,本地掛載點是 /mnt/nfs,則添加:

192.168.1.100:/exported/folder /mnt/nfs nfs defaults 0 0

測試掛載: 為了檢查是否有語法錯誤,您可以手動掛載所有未掛載的 fstab 條目

sudo mount -a

其中在 /etc/fstab 文件中,每個掛載點的條目都包含一系列的字段,其中 defaults 0 0 是其中的兩個字段,意思如下

  1. defaults 這是掛載選項字段。defaults 代表一組預設的掛載選項。對於大多數文件系統,這包括了 rw(可讀寫)、suid(允許執行 suid 程序)、dev(解析字符和塊特殊裝置)、exec(允許執行二進制文件)、auto(允許自動掛載)、nouser(阻止普通用戶掛載文件系統)、和 async(進行異步 I/O)等選項。如果需要特定的選項,可以用逗號分隔,直接在這個位置列出。
  2. 第一個 0 這是 dump 字段。dump 是一個備份實用程序,用來決定文件系統是否需要被備份。如果這個值設置為 0,則 dump 將忽略這個文件系統。如果設置為 1 或更高的數字,它表示文件系統的備份頻率。
  3. 第二個 0 這是 fsck(文件系統檢查)的順序字段。這個數字決定了在啟動時檢查文件系統的順序。如果設為 0,系統啟動時將不會對這個文件系統進行 fsck 檢查。如果是根文件系統,這個值通常設為 1;其他文件系統則設為 2 或更高,或者保留為 0

總的來說,defaults 0 0 是一個常見的配置,

要將掛載好的硬碟卸載的話

要卸載已經掛載的硬碟,您可以使用 umount 命令

確定掛載點:

df -h

卸載硬碟:

例如,如果硬碟掛載在 /mnt/mydisk,則命令為:

sudo umount /mnt/mydisk

檢查卸載狀態:

可以再次使用 df -hmount 命令來確認硬碟已經被卸載。

解決權限無法讀寫的問題

兩台主機間有不同的帳號,A主機帳號usera,B主機帳號userb,要再b主機修改a主機的資源的話,你會遇到無法執行的問題

可以選擇兩種策略

1.使用群組權限

如果 userauserb 的 UID/GID 不同,您可以通過將它們都加入到同一個群組,並對該群組授予適當的權限來解決問題。

在 A 和 B 主機上創建相同的群組

sudo groupadd sharedgroup

userauserb 添加到該群組:

在 A 和 B 主機上分別執行:

sudo usermod -a -G sharedgroup usera
sudo usermod -a -G sharedgroup userb

更改共享目錄的群組權限:

在 A 主機上設置共享目錄的群組為 sharedgroup,並確保群組具有讀寫權限:

sudo chown usera:sharedgroup /path/to/shared/directory
sudo chmod 2770 /path/to/shared/directory

2. 使用 NFS 伺服器選項映射 UID/GID

可以在 NFS 伺服器的 /etc/exports 文件中使用 all_squash, anonuid, 和 anongid 選項來映射所有客戶端用戶到特定的 UID 和 GID。

編輯 /etc/exports 文件

在 A 主機(NFS 伺服器)上編輯此文件,為共享目錄添加以下選項:

/path/to/shared/directory B主機的IP(rw,sync,no_subtree_check,all_squash,anonuid=UID,anongid=GID)

其中,將 UIDGID 替換為在 A 主機上 usera 的 UID 和 GID。

UID 和GID的查詢方法如下

id usera

就會取得像是 uid=0(root) gid=0(root) groups=0(root)

重啟 NFS 服務:

sudo systemctl restart nfs-server

這樣配置後,所有從 B 主機存取 A 主機共享目錄的操作都將以指定的 UID 和 GID 來執行,從而繞過 UID/GID 不匹配的問題。


GCP 連接外部硬碟

先看配置 df -h ,在用 lsblk 找出要配置的硬碟,通常在 GCP 中新掛的第一顆硬碟代號會是 sdb

df -h
lsblk

如果是全新的硬碟要先格式化他

sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,discard /dev/sdb

格式化後,可以開始準備掛載目錄,以及提升權限和下指令掛載

sudo mkdir -p /mnt/data
sudo chmod a+w /mnt/data
sudo mount -o discard,defaults /dev/sdb /mnt/data

最後記得要設定每次開機自動掛載,先用 blkid 找出硬碟的 UUID ,記錄下來後再把他填到 /etc/fstab 中

sudo blkid /dev/sdb
sudo nano /etc/fstab

將設定檔寫入 fstab

UUID=1535732s45-a52a-4e22-a258-7bsedgaw3e41 /mnt/data ext4 discard,defaults 0 2

存檔完畢後,測試一下是否有成功

sudo mount -a

延伸閱讀

如何定時打開和關閉 GCP VM Nginx WEB 達到省錢目的

如何定時打開和關閉 GCP VM Nginx WEB 達到省錢目的

建立一個會自動開機和關閉虛擬機器的排程

值得注意的事項:

  • 主機時間都是 UTC 時間,設定的時候,要記得處理這邊,例如台灣時區是+8,所以設定時間的時候要-8

1.首先設定一個 Compute Engine 的 「執行個體排程」如圖所示

2.建立一個新的執行個體排程

設定在每天18:00到23:00最忙碌的時候多開一台主機

3.將要執行的 VM 個體加入到此排程中

記得建立好排程後,要把適用這個規則的 VM 個體都加入,GCP 的排程才會去處理 VM 的開關

4.執行排程的權限設定

如果你之前沒做過權限設定,那肯定會遇到權限不足的錯誤訊息,這時候要來到 IAM 與管理 -> 身分與存取權管理,並且先勾選「包含 Google 提供的角色授權」,然後選擇「授予存取權」

然後主體要選擇你自己的 compute-system.iam 指派角色則是選擇 Compute 執行個體管理員(v1),如圖所示

建立 Ubuntu or Debian 的 Shell Script 定時執行開關機

1.建立自動開關設定的 Script

#!/bin/bash

SOURCE_CONF="/path/to/a.conf"
TARGET_CONF="/path/to/nginx/nginx.conf"

# 使用 sudo 執行需要 root 權限的命令
sudo cp "$SOURCE_CONF" "$TARGET_CONF"
sudo nginx -s reload

2.可以使用 crontab 命令來檢查和管理定時任務(cron jobs)

sudo crontab -e

加入執行時間、程式碼等設定

# 分 鐘 小時 日期 月份 星期 命令
0 23 * * * /path/to/update_nginx_conf.sh

這樣就可以利用 root 權限運行 Script

其中:

  • 分鐘:分鐘(0-59)
  • 小時:小時(0-23,採24小時制)
  • 日期:一個月中的某天(1-31)
  • 月份:月份(1-12)
  • 星期:星期幾(0-7,其中0和7都代表星期日)
  • 命令:要執行的命令或腳本的絕對路徑

例如,如果您希望每天凌晨 3 點執行一個名為 script.sh 的腳本,您應該這樣寫:

檢查

檢查 crontab 列表:輸入 crontab -l 來確認您的任務已被添加到 crontab 列表中。

其他方法

at 指令

例如要讓指令碼在明天的 10:00執行,可以執行下面的指令

at 10:00 AM tomorrow /path/to/script.sh

systemd (System and Service Manager)

  1. 創建一個 systemd 定時任務檔案。
  2. 在定時任務檔案中指定要執行的命令或腳本以及執行時間。
  3. 啟用定時任務。

例如:每一分鐘都要執行一次 script.sh

[Unit]
Description=My Script

[Timer]
OnCalendar=*-*-* *:* *

[Service]
ExecStart=/path/to/script.sh

錯誤處理

如果有遇到無法執行權限的話,可以參考下面的文章解決權限問題

結語

這樣設定完成後,GCP自己就會在晚上11點關機、晚上6點開機,而我的腳本則是在晚上11:00 關閉 Nginx 的 upstream,在18:15開啟 upstream server

Ubuntu 20 用 Speedtest 測網速

Ubuntu 20 用 Speedtest 測網速

如果OS有圖形化的介面,可以透過瀏覽器瀏覽 speedtest.net 去測試網速,但來到了 Linux base 的 Ubuntu command line 上頭,就需要安裝 SpeedTest 的 Script 腳本,透過腳本來檢查網速。

安裝 Python

因為 SpeedTest 是用 Python 寫的,所以先打開終端機,先把 Python3 pip 裝起來

sudo apt-get install python3-pip

安裝 SpeedTest

透過 pip3 安裝 SpeedTest

sudo pip3 install speedtest-cli

用 SpeedTest 測試網速

speedtest-cli

用 SpeedTest 測試網速並且分享

speedtest-cli --share

結果會是

https://www.speedtest.net/result/13144792277.png

Pi-Hole – Raspberry Pi 上程式開發以及阻擋廣告用的 DNS SERVER

Pi-Hole – Raspberry Pi 上程式開發以及阻擋廣告用的 DNS SERVER

很多時候為了內部程式開發方便或是安裝 wordpress 時候會需要不同的 DNS 名稱,你也可以編修自己電腦中的 host 名單,讓你開發者可以利用 Domain 去安裝 wordpress,或是也可以自己架設一個 DNS SERVER 來處理這件事情,但現在有比較好的選擇,可以兼顧程式開發以及去除廣告的好處,設定又很容易,且還可以安裝在小巧的 Raspberry Pi 上,可以不用透過外面的 DNS 去做繁瑣的設定,非常的加分。

Pi-hole 安裝方法

Pi-hole的安裝很簡單,在 Raspberry Pi 中只要一行,其他的就看圖片精靈回答問題即可

curl -sL "https://install.pi-hole.net/" | sudo bash
初始安裝畫面
告訴你安裝了 Pi-hole 就可以幫你去除煩人的廣告
Pi-hole 別忘了,有能力的人要貢獻點小費,施比受有福
Pi-hole 選擇你上層的 DNS SERVER 台灣建議用 Google 即可
Pi-hole 選擇廣告阻擋清單的供應者,目前也只有一個可以選擇
Pi-hole 是否要安裝管理的介面,為了以後方便,預設把它裝起來吧
Pi-hole 這一段是問要不要安裝 lighttpd 和 PHP 模組,當然你也可以用自己的 web server ,但為了方便起見,用預設的 web server 即可,他不會佔用太多的硬碟空間。
Pi-hole 是否要有記錄檔,當然要囉
Pi-hole privacy mode , https://docs.pi-hole.net/ftldns/privacylevels/,用預設不隱藏任何東西,所有統計數據都可用即可
看到這個畫面就完成安裝,可以將電腦中的 DNS 指向畫面中的 IP ,需要進入管理介面的輸入 http://pi.hole/admin
國外網友超專業教學

Raspberry Pi 多種應用

PiHole官網 – https://pi-hole.net/

PiHole替代品 AdGuard,https://github.com/AdguardTeam/,AdGrard 安裝在 Raspberry Pi 上的說明,https://github.com/AdguardTeam/AdGuardHome/wiki/Raspberry-Pi

如何在 Ubuntu 20.04 上用 VSCODE 對掛在 Nginx 的 PHP 8.0 除錯

如何在 Ubuntu 20.04 上用 VSCODE 對掛在 Nginx 的 PHP 8.0 除錯

假設你已經在 Ubuntu 上安裝好了 Nginx 、 Php8.0、 VSCODE,那麼我們就可以專注在如何讓你的 VSCODE 可以對 PHP 除錯

  1. 先安裝 php-xdebug 套件
sudo apt install php-xdebug

對應 Php8.0 的環境下,會安裝對應不同 php 版本的 mods ,我的環境下安裝的是 PHP 8.1 版本,路徑是 /etc/php/8.1/mods-available/

2. 更改 xdebug.ini 的設定

sudo /etc/php/8.1/mods-available/xdebug.ini

3. 將 xdebug.ini 內容改成

zend_extension = xdebug.so
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_handler = dbgp
xdebug.remote_host = 172.17.0.1     ;指定vscode所在的IP
xdebug.remote_connect_back = 1      ;如果為1,則會忽略remote_host
xdebug.remote_port = 9000

xdebug.remote_log = "/var/log/xdebug.log"

4. 重新啟動服務

sudo systemctl start php8.0-fpm
sudo systemctl start nginx

5. 要讓 VSCODE 支援 PHP Debug ,要先安裝 php debug

6. 安裝完畢後,在 PHP 的專案目錄下要建立 launch.json 讓除錯器知道要連線到那裏

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9000
    }
  ]
}

到這裡,就可以用你的 VSCODE 去除錯你的 PHP CODE 了

如何在 Ubuntu 20 中啟用免費的 https 憑證,使用 Let’s Encrypt 以及 Nginx

現在網站沒有支援 https ,肯定是扣分項目,並且想要支援 https 已經不像是以往,一定需要去購買 SSL 憑證,大多數應用下會採用 Let’s Encrypt 的服務,本文是要介紹 Ubuntu 下替 Nginx 安裝 SSL 憑證的方法。


安裝憑證的準備工作

首先確認是否有網域名稱,也就是在DNS伺服器中擁有對應的 A Record,舉例如下:

  • A Record rain.tips XXX.XXX.XXX.XXX
  • A Record www.rain.tips XXX.XXX.XXX.XXX

並且在 Nginx 中已經設定好該網站,可以在瀏覽器中打入 rain.tips 後可以正常瀏覽


安裝 Let’s Encrypt

首先安裝憑證機器人 certbot 來支援安裝 SSL 憑證

sudo apt install certbot python3-certbot-nginx

利用 Certbot 取得憑證

找出的你主機名稱,也就是在 Nginx 中的 conf 檔案內定義的 Server Name,像我的是rain.tips,然後利用下面的指令建立憑證,-d 後面要帶入網域的名稱

sudo certbot --nginx -d rain.tips -d www.rain.tips

接下來就可以跟著交談視窗一步一步建立起憑證

  • 輸入 Email
  • 同意合約
  • 是否要公開 EMAIL
  • 設定 http 是否要轉址到 https,建議一般情況下是設定 Redirect

到此就大功告成了,有防火牆的記得要去開啟下


檢查 Certbot 的自動更新是否正常

因為 Let’s Encrypt 每三個月要 renew 一次,現在的 Certbot 都會自動的啟用自動更新,但避免出意外,可以利用下面指令確認下是否有設定正常。

sudo systemctl status certbot.timer

到此就大功告成,參考資料如下

How To Secure Nginx with Let’s Encrypt on Ubuntu 20.04

How to Secure Nginx with Let’s Encrypt On Ubuntu 20.04 / 18.04