Select Page

資料庫-每日自動備份-Ubuntu-MariaDB

今天來實做一個備份任務,要在 Ubuntu 上設定每日凌晨 4:00 自動備份 MariaDB 中的所有資料庫,我們可以使用 cron 和一個自定義的 Shell 腳本來完成這個任務,以下是詳細步驟和代碼:

步驟 1:創建備份腳本

先創建一個備份 Shell Script,這個腳本將備份所有資料庫並分開儲存。

1.在 /usr/local/bin 目錄下創建一個新的 Shell 腳本:

    sudo nano /usr/local/bin/backup_mariadb.sh

    2. Script 的內容指令如下

    #!/bin/bash
    
    # 設定資料庫的用戶名和密碼
    DB_USER="your_db_user"
    DB_PASSWORD="your_db_password"
    DB_HOST="10.0.0.1"
    
    # 設定備份儲存目錄
    BACKUP_DIR="/path/to/backup/dir"
    mkdir -p $BACKUP_DIR
    
    # 獲取當前日期和時間
    CURRENT_DATE=$(date +%Y-%m-%d-%H-%M-%S)
    
    # 獲取所有資料庫名稱
    DATABASES=$(mysql -h$DB_HOST -u$DB_USER -p$DB_PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
    
    # 備份每個資料庫
    for DB in $DATABASES; do
      if [[ "$DB" != "information_schema" && "$DB" != "performance_schema" && "$DB" != "mysql" && "$DB" != "sys" ]]; then
        BACKUP_FILE="$BACKUP_DIR/$CURRENT_DATE-$DB.sql"
        mysqldump  -h$DB_HOST -u$DB_USER -p$DB_PASSWORD --databases $DB > $BACKUP_FILE
      fi
    done

    其中要修改的有

    • DB_HOST : 要改成自己的
    • your_db_user : 資料庫中有備份權限的使用者 ID
    • your_db_password : 密碼
    • BACKUP_DIR=”/path/to/backup/dir” : 要改成你要存放的路徑,像是 /var/backup_db/

    3.將 .sh 變成可執行擋

    sudo chmod +x /usr/local/bin/backup_mariadb.sh

    步驟 2:設置 Cron 任務

    1.打開 cron

    crontab -e

    2.加入設定內容,要注意的是實間是主機時間,通常主機是 UTC+0 的時區,要注意轉換,才會是正確的當地時間,可以參考這篇

    0 4 * * * /usr/local/bin/backup_mariadb.sh

    這樣就會在每天的早上四點去備份資料庫了

    加入每一個SQL檔案都可以被壓縮的功能

    程式碼區塊要改成下面這一個

    # 備份每個資料庫並壓縮
    for DB in $DATABASES; do
      if [[ "$DB" != "information_schema" && "$DB" != "performance_schema" && "$DB" != "mysql" && "$DB" != "sys" ]]; then
        BACKUP_FILE="$BACKUP_DIR/$CURRENT_DATE-$DB.sql"
        ZIP_FILE="$BACKUP_DIR/$CURRENT_DATE-$DB.zip"
        mysqldump -h$DB_HOST -u$DB_USER -p$DB_PASSWORD --databases $DB > $BACKUP_FILE
        zip $ZIP_FILE $BACKUP_FILE
        rm $BACKUP_FILE
      fi
    done

    刪除舊資料

    可以利用下面的指令,放在程式碼的最後面

    # 刪除兩天前的備份文件
    find $BACKUP_DIR -type f -name "*.zip" -mtime +2 -exec rm {} \;

    需要改時間的話,只要修正 -mtime +2 ,把+2改成自己需要的時間

    參考資料

    https://help.ubuntu.com/community/CronHowto

    將你windows中的Ubuntu(WSL)的IP對外

    預設在你的windows下的 Linux 系統會取得一個 IP,通常是172.19開頭的,這是因為用的是 Hyper-V 架構導致的,變成你再 WSL 內開發的服務都很難對外,但其實只要利用 windows 內建的 Netsh interface portproxy 即可

    設定 NAT Proxy

    透過 netsh interface portproxy 來作設定

    netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname) -I)

    其中

    listenport 和 connectport 通常設定一樣,也就是你的服務的 port

    listenaddress=0.0.0.0 (固定)

    connectaddress 要記得是填入你 ubuntu 的IP喔,可以透過 wsl hostname -I 找出 IP

    wsl hostname -I

    假設你有一個服務是運行在 port 3001,ubuntu 的 ip 172.19.227.52,修改後的你指令應該要長成

    netsh interface portproxy add v4tov4 listenport=3001 listenaddress=0.0.0.0 connectport=3001 connectaddress=172.19.227.5

    最後記得要打開對應的防火牆的設定喔

    加碼演出

    關於 netsh 的控制指令說明

    顯示目前所有的設定

    netsh interface portproxy show all

    重新設定 netsh

    netsh interface portproxy reset

    參考資料

    https://learn.microsoft.com/zh-tw/windows/wsl/networking

    手把手教學安裝 anything-llm (不使用 docker)

    手把手教學安裝 anything-llm (不使用 docker)

    AnythingLLM是一款全功能的應用程序,支持使用商業或開源的大語言模型(LLM)和向量數據庫建構私有ChatGPT。用戶可以在本地或遠端運行該系統,並利用已有文檔進行智能對話。此應用將文檔分類至稱為工作區的容器中,確保不同工作區間的資料隔離,保持清晰的上下文管理。

    特點:多用戶支持、權限管理、內置智能代理(可執行網頁瀏覽、代碼運行等功能)、可嵌入到網站的聊天窗口、多種文檔格式支持、向量數據庫的簡易管理界面、聊天和查詢兩種對話模式、引用文檔內容的展示,以及完善的API支持客戶端定制整合。此外,該系統支持100%雲端部署,Docker部署,且在處理超大文檔時效率高,成本低。

    安裝 Anything llm

    注意,以下要用 linux 平台安裝,windows 用戶可以用 WSL,推薦用 Ubuntu OS

    在自己的 home 目錄下,到 GitHub 中下載原始碼

    git clone https://github.com/Mintplex-Labs/anything-llm.git

    利用 yarn 作設定資源

    cd anything-llm
    yarn setup

    把環境變數建立起來,後端主機是 NodeJS express

    cp server/.env.example server/.env
    nano server/.env

    密文需要最少12位的字元,檔案的存放路徑也記得改成自己的

    JWT_SECRET="my-random-string-for-seeding"
    STORAGE_DIR="/your/absolute/path/to/server/storage"

    前端的環境變數,先把/api打開即可

    # VITE_API_BASE='http://localhost:3001/api' # Use this URL when developing locally
    # VITE_API_BASE="https://$CODESPACE_NAME-3001.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN/api" # for Github Codespaces
    VITE_API_BASE='/api' # Use this URL deploying on non-localhost address OR in docker.

    如果你在設定的時候,遇到更新請求,可以跟我著我下面的方法作

    把 prisma 更新好

    yarn add --dev prisma@latest
    yarn add @prisma/client@latest

    前端的程式碼

    先編譯前端程式碼,前端是由 viteJS + React

    cd frontend && yarn build

    將編譯好的資料放到 server 的目錄下

    cp -R frontend/dist/* server/public/

    選項,如果需要用到本地端的 LLM 模型,就把 llama-cpp 下載下來

    cd server && npx --no node-llama-cpp download

    把資料庫建立好

    cd server && npx prisma generate --schema=./prisma/schema.prisma
    cd server && npx prisma migrate deploy --schema=./prisma/schema.prisma

    Server端是用來處理 api 以及進行向量資料庫的管理以及跟 LLM 交互

    Collector 是一個 NodeJS express server,用來作UI處理和解析文檔

    cd server && NODE_ENV=production node index.js &
    cd collector && NODE_ENV=production node index.js &

    更新的指令碼

    現在 anything llm 更新速度超快,把這一段指令碼複製起來,方便未來作更新的動作

    #!/bin/bash
    
    cd $HOME/anything-llm &&\
    git checkout . &&\
    git pull origin master &&\
    echo "HEAD pulled to commit $(git log -1 --pretty=format:"%h" | tail -n 1)"
    
    echo "Freezing current ENVs"
    curl -I "http://localhost:3001/api/env-dump" | head -n 1|cut -d$' ' -f2
    
    echo "Rebuilding Frontend"
    cd $HOME/anything-llm/frontend && yarn && yarn build && cd $HOME/anything-llm
    
    echo "Copying to Sever Public"
    rm -rf server/public
    cp -r frontend/dist server/public
    
    echo "Killing node processes"
    pkill node
    
    echo "Installing collector dependencies"
    cd $HOME/anything-llm/collector && yarn
    
    echo "Installing server dependencies & running migrations"
    cd $HOME/anything-llm/server && yarn
    cd $HOME/anything-llm/server && npx prisma migrate deploy --schema=./prisma/schema.prisma
    cd $HOME/anything-llm/server && npx prisma generate
    
    echo "Booting up services."
    truncate -s 0 /logs/server.log # Or any other log file location.
    truncate -s 0 /logs/collector.log
    
    cd $HOME/anything-llm/server
    (NODE_ENV=production node index.js) &> /logs/server.log &
    
    cd $HOME/anything-llm/collector
    (NODE_ENV=production node index.js) &> /logs/collector.log &
    用 wpa_cli 控制你的 WIFI (無線網路)

    用 wpa_cli 控制你的 WIFI (無線網路)

    wpa_cli 是一個用於與 wpa_supplicant 交互的命令行界面工具,當然也支持在 command line 下直接使用命令控制 WIFI,可以用來管理無線網絡接口的設定和運行狀態。這個工具非常強大,支持多種操作,如掃描無線網絡、連接到網絡、變更設定等,而我都用python 透過 wpa_cli 來控制 WIFI。

    首先掃描無線網路

    打開終端,並且記得要用 root 權限來執行 wpa_cli

    sudo wpa_cli -i wlan1 scan
    sleep 5  # 給予一些時間來完成掃描
    sudo wpa_cli -i wlan1 scan_results

    回應如下圖

    加一個網路配置

    利用 ssid 和 paswword 來連線到一個已知的無線網路上,可以將下面的指令編寫成 wpa_cli_add_network.sh ,並且執行她,也可以直接使用,執行後取得的 network id 通常是一個 int 的數字,把她記起來,之後就可以透過這個 network id 來連接網路,和斷開網路

    # 添加新的網絡配置
    network_id=$(wpa_cli -i wlan1 add_network | awk '{print $NF}')
    
    # 設置SSID和密碼
    wpa_cli -i wlan1 set_network $network_id ssid '"你的SSID"'
    wpa_cli -i wlan1 set_network $network_id psk '"你的密碼"'
    
    # 啟用該網絡
    wpa_cli -i wlan1 enable_network $network_id
    
    # 保存配置
    wpa_cli -i wlan1 save_config

    連接網路以及斷開網路

    # 重新連線
    wpa_cli -i wlan1 reconnect
    
    #斷開連線
    wpa_cli -i wlan1 disconnect

    刪除網路配置

    wpa_cli -i wlan1 remove_network $network_id

    檢查連線是否存在

    wpa_cli -i wlan1 status

    得到的輸出通常如下

    其中,檢查是否有連線成功,可以看 wpa_state 是否為 COMPLETED

    檢查已經存在的網路設定

    sudo wpa_cli -i wlan1 list_networks

    輸出如下

    可以用 flags CURRENT 來檢查現在是連線到那一個 network ,也可以取得 network id ,並且用他來連線

    最佳化你的 NFS 效能,讓檔案伺服器也會飛

    最佳化你的 NFS 效能,讓檔案伺服器也會飛


    調整NFS(Network File System)的效能可以從多個角度進行,包括調整NFS伺服器和客戶端的參數、網絡配置、以及文件系統的選擇。

    調整 NFS 參數:

    NFS Server 端

    • 使用 NFSv4: NFSv4 提供更好的效能和安全性。
    • 根據工作負載調整 rpc.mountd.port 和 rpc.nfsd.port 參數的值。
    • 調整 nfsd.minthreads 和 nfsd.maxthreads 參數的值,以優化執行緒數量。
    • 調整 nfs.readahead 和 nfs.writebehind 參數的值,以優化讀寫緩衝區大小。

    範例如下

    我的主機是 4VPU,4G RAM來設計

    修改 /etc/nfs.conf 文件(或你系統中相對應的配置文件),設置最小執行緒數為 8,最大執行緒數為 64

    調整邏輯,將 nfsd.minthreads 和 nfsd.maxthreads 參數設置為與 CPU 核心的數量相同或是略高一些

    [nfsd]
    threads=8 64

    編輯 /etc/sysctl.conf

    # NFS Setup
    nfsd.minthreads =8
    nfsd.maxthreads = 64
    nfs.readahead = 65536
    nfs.writebehind = 262144

    重啟主機

    sudo service nfs-kernel-server start

    NFS Client 端

    • 使用 NFSv4: NFSv4 提供更好的效能和安全性。
    • 調整 mount.nfs.rsize 和 mount.nfs.wsize 參數的值,以優化讀寫緩衝區大小。
    • 調整 mount.nfs.mountd_port 和 mount.nfs.nfsd_port 參數的值。

    調整邏輯,將 mount.nfs.rsize 和 mount.nfs.wsize 參數設置為與 TCP MTU 相同或是略低一點

    範例如下

    sudo /etc/fstab

    /etc/fstab

    server:/path/to/share /mnt/nfs nfs rw,nfsvers=4,noatime,rsize=32768,wsize=32768 0 0

    提高讀取的性能

    mount -o async,noac,rsize=1048576 nfs://server/share /mnt

    兼顧安全性以及效能的設定可以參考

    mount -o async,noac,noatime,nodev,noexec,norecovery,rsize=1048576,tcp,nfsvers=4 nfs://server/share /mnt

    讀取大型文件,如影音,透過 readahead 來幫助提高性能,這裡將 readahead 設置為 128 塊(每塊的大小依賴於系統配置,通常是 4KB)

    sudo mount -t nfs -o rsize=32768,wsize=32768,readahead=128 server:/path/to/share /mnt/nfs

    調整網路配置:

    • 使用高性能網路設備。
    • 調整 TCP/IP 參數,例如 tcp_keepalive 和 tcp_window_size

    常見的 NFS 掛載選項

    • async: 允許 NFS 客户端在將數據寫入磁碟之前將其發送到伺服器。這可以提高寫入性能,但可能會導致數據丟失。
    • bg: 在後台掛載 NFS 共享。
    • intr: 允許 NFS 客户端在伺服器無響應時中斷操作。
    • noac: 不使用 NFS 屬性緩衝區。這可以提高性能,但可能會導致文件屬性不一致。
    • noatime: 不更新文件的訪問時間。這可以提高性能,但可能會導致文件元數據不準確。
    • nodev: 不將 NFS 共享上的設備映射到本地設備。
    • noexec: 不允許在本地執行 NFS 共享上的可執行文件。
    • norecovery: 在 NFS 伺服器發生故障時不嘗試重新掛載共享。
    • ro: 以唯讀模式掛載 NFS 共享。
    • rsize: 設置 NFS 客户端每次讀取操作從伺服器接收的最大數據量。
    • rw: 以讀寫模式掛載 NFS 共享。
    • soft: 在 NFS 伺服器無響應時允許 NFS 客户端重試操作。
    • tcp: 使用 TCP 而不是 UDP 進行 NFS 通信。
    • timeo: 設置 NFS 客户端在伺服器無響應之前等待的時間。
    • nfsvers: 指定 NFS 協議版本

    其中最常用到的是 async, noac, noatime, rsize, nfsvers.

    noatime

    多數情況下,禁用對文件訪問時間的更新可以提升性能,因為它減少了對伺服器的寫操作。

    rsize和wsize:

    對於現代網絡,32768(32KB)或65536(64KB)是比較常見的設定值,能夠提供良好的效能。你可以從這個基點開始,進行實際的性能測試來找到最適合你環境的值。

    NFS 版本的比較說明 (nfsvers)

    • NFSv4 比較新,提供了更好的安全性(如Kerberos身份驗證)和效能優化,包括更高效的文件鎖定機制和狀態保持功能。
    • NFSv3 在一些舊系統上仍然很流行,對於不需要v4的安全性增強的環境來說,可能仍是一個好選擇。在某些情況下,它可能由於其無狀態性而提供更好的效能。

    監控與調整

    使用 nfsstat 這樣的工具來監控 NFS 伺服器的性能,然後根據實際運行情況進行調整。

    sudo apt install nfsstat

    之後就可以輸入 nfsstat 取得相關資訊

    nfsstat

    高效能伺服器

    使用 NFS Ganesha: NFS Ganesha 高性能的 NFS 代理伺服器

    實戰教學:實現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

    延伸閱讀