---
# System prepended metadata

title: linux 各種好用的工具
tags: [linux]

---

## crontab
參考資料 : https://linux.vbird.org/linux_basic/centos7/0430cron.php
* -u  ：只有 root 才能進行這個任務，亦即幫其他使用者建立/移除 crontab 工作排程；
* -e  ：編輯 crontab 的工作內容
* -l  ：查閱 crontab 的工作內容
* -r  ：移除所有的 crontab 的工作內容，若僅要移除一項，請用 -e 去編輯。

![](https://hackmd.io/_uploads/SJq-59D5h.png)


## screen
參考資料 : https://ithelp.ithome.com.tw/articles/10191930
https://hackmd.io/@NCUmsplab/Bk6BsFP3D
* screen -S {screenName}： 幫 screen 命名
* screen -ls ：查看所有在背景執行的screen
* screen -r 3966559 ：載入編號為 3966559 的 screen
* Ctrl + a 與 d ：將screen放到背景執行
:::spoiler
``` 
說明
-c file
使定使用的設定檔（預設為 $HOME/.screenrc）
-d [pid.tty.host]
強制將指定的 screen 工作環境卸離
-L
開啟自動紀錄功能
-ls 或 -list
列出目前所有執行中的 screen 工作環境
-r [pid.tty.host]
重新連接執行中的 screen 工作環境
-R
重新連接最近卸離的 screen 工作環境
-U
以 UTF-8 模式執行
-wipe [match]
將廢棄的 screen 工作環境清除


screen 操作指令表：
screen 參數
說明
Ctrl + a 與 c
建立新 screen 視窗
Ctrl + a 與 Ctrl+ a
切換至上一個 screen 視窗
Ctrl + a 與數字鍵 0 到 9
切換至指定編號的 screen 視窗
Ctrl + a 與 n
切換至下一個的 screen 視窗
Ctrl + a 與 p
切換至下一個的 screen 視窗
Ctrl + a 與 w
列出目前所有的 screen 視窗
Ctrl + a 與 "
列出目前所有的 screen 視窗，並可用上下鍵選擇要切換的設窗
Ctrl + a 與 k
關閉目前的 screen 視窗
Ctrl + a 與 d
卸離 screen 工作環境
Ctrl + a 與 Esc鍵（或 Ctrl + a 與 [）
進入複製模式（copy mode），可用方向鍵操作捲軸，或用 / 與 ? 來搜尋，按下空白鍵開始選取要複製的內容，選取完成後再按下第二次空白鍵，即可複製，隨後使用 Ctrl + ] 可貼上複製的內容。
Ctrl + a 與 S
將畫面分割成上下兩個區域
Ctrl + a 與 Q
關閉分割畫面
Ctrl + a 與 Tab鍵
切換分割畫面
Ctrl + a 與 t
顯示目前系統的時間與負載狀況
Ctrl + a 與 a
送出 Ctrl + a
Ctrl + a 與 ?
顯示說明
Ctrl + a 與 v
顯示版本資訊
Ctrl + a 與 x
鎖定 screen 螢幕
Ctrl + a 與 H
開啟或結束 screen 紀錄功能
Ctrl + a 與 C
清除 screen 視窗中的內容
Ctrl + a、D 與 D
強力卸離，卸離 screen 工作環境之後，直接登出
Ctrl + a 與 Ctrl+ g
視覺化鈴聲（visual bell）切換
Ctrl + a 與 i
顯示目前 screen 視窗的資訊
Ctrl + a 與 l
重繪目前 screen 視窗的內容
```
:::
## netstat -tlnp|grep 8778
> OSError: [Errno 98] error while attempting to bind on address ('140.115.70.218', 8778): address already in use
> 
![image](https://hackmd.io/_uploads/HJOR5_ln6.png)


# linux 權限相關

## linux 更改主機名稱
sudo hostname {{slurm-login}}
sudo hostnamectl set-hostname 新的主機名稱
https://magiclen.org/linux-change-hostname/

## linux chmod 設定存取權限
- 777 : 讓任何使用者可以讀與寫入
- -Ｒ: 一次讓所有子物件都有相同的權限設定
![image](https://hackmd.io/_uploads/H1KhOqntR.png)

## linux chown 更改檔案擁有者
sudo chown 901:901 /etc/munge/munge.key
![image](https://hackmd.io/_uploads/SybcqC-qC.png)



# linux 升級 Ubuntu 版本
參考資料: https://www.kwchang0831.dev/dev-env/ubuntu/upgrade-from-20.04-to-22.04
:::spoiler
> lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal

> sudo apt update -y && sudo apt upgrade -y
> sudo apt dist-upgrade
> sudo apt autoremove

安裝 **updrate-manager-core** 套件
> sudo apt install update-manager-core
> sudo reboot

> sudo do-release-upgrade --check-dist-upgrade-only
> sudo do-release-upgrade 

> lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:        22.04
Codename:       jammy

> sudo apt update -y && sudo apt upgrade -y
> sudo apt --purge autoremove
> sudo apt autoclean
:::

# linux 儲存空間相關

## 查看該目錄下「第一層」資料夾的用量
``` 
du -h --max-depth=1 /workplace/zyxu
```
- 這會列出 /workplace/zyxu 底下每個資料夾的大小，方便你抓出佔用空間的元兇。

## 查看資料夾大小：```du -sh```
•	`du`：disk usage（磁碟使用量）
•	`-s`：summary，僅顯示總和
•	`-h`：human readable，以 KB/MB/GB 顯示更直觀

## 查看已掛載檔案系統的磁碟使用情況：```df -h```
![image](https://hackmd.io/_uploads/rJsaZYb1kg.png)
```linux=
# 查看根目錄（/）下 使用空間前20大的檔案位置
du -ahx / | sort -rh | head -n 20
```
```linux=
nlplab@as-1:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 63.9M  1 loop /snap/core20/2318
loop1                       7:1    0   87M  1 loop /snap/lxd/29351
loop2                       7:2    0 38.8M  1 loop /snap/snapd/21759
sda                         8:0    0  1.7T  0 disk 
├─sda1                      8:1    0    1G  0 part /boot/efi
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0  1.7T  0 part 
  └─ubuntu--vg-ubuntu--lv 253:0    0  1.7T  0 lvm  /
sdb                         8:16   1    0B  0 disk 
sr0                        11:0    1 1024M  0 rom 
```
## 查看記憶體使用情況： ```nvidia-smi```
![image](https://hackmd.io/_uploads/HyntMFWyJl.png)


## 查看 memory 大小：  ```free -h```
https://pin-yi.me/blog/other/linux-clear-swap/
![image](https://hackmd.io/_uploads/H16Hd-g11e.png)

* Mem：記憶體的使用資訊
* Swap：交換空間的使用資訊
* total：系統總共的可用實體記憶體大小
* used：已被使用的實體記憶體大小
* free：還剩下多少可用的實體記憶體
* shared：被共享使用的實體記憶體大小
* buff/cache：被 buffer 和 cache 使用的實體記憶體大小
* available：可被 應用程式 使用的實體記憶體大小

## 清除 Swap 使用空間
 > [!Note] 清除 Swap 使用空間
 > sync
 > swapoff -a && swapon -a



# linux 使用者相關
## linux 新增使用者
https://blog.gtwang.org/linux/linux-useradd-command-tutorial-examples/#google_vignette
```linux=
useradd test2 -p test2 -d /home/test2 -u 1302 -s /bin/bash
```
## linux 修改密碼
    passwd test2

## linux 刪除使用者
    userdel -r test2

## linux 查看使用者id
https://officeguide.cc/linux-id-command-tutorial-examples/
```linux=
# 查詢目前使用者的帳號 ID 與各群組 ID 資訊
id
```
> uid=1600(zyxu) gid=1600(zyxu) groups=1600(zyxu

```linux=
# 查看所有使用者
cat /etc/passwd
```

### 修改使用者 uid 與 gid
```linux=
usermod -u 1600 zyxu
groupmod -g 1600 zyxu
```

# NFS(網絡文件系統）共享
可以讓不同機器存取同個資料夾

### 使用 NFS（網絡文件系統）共享
* 在 **sm-1**（要共享的主機）上設定：
    * 安裝 NFS 服務端 : ```sudo apt install nfs-kernel-server```
    * 配置要共享的目錄 : ```sudo nano /etc/exports```
    * 輸入： /llm_model 140.113.30.219(rw,sync,no_subtree_check)
    :::info
    * /llm_model: 要共享的資料夾目錄。
    * 140.113.30.219： 要共享的主機IP
    * rw: 允許讀寫。
    * sync: 確保寫入操作立即同步到磁盤。
    * no_subtree_check: 避免子目錄檢查，提升性能。
    :::
    * 重新啟動 NFS 服務 :
        ```
        sudo exportfs -a
        sudo systemctl restart nfs-kernel-server
        ```
    * 檢查 NFS 共享狀態 : ```sudo exportfs -v```
    ![image](https://hackmd.io/_uploads/ryVrhLlkkl.png)
* 在其他台主機上設定：
    * 安裝 NFS 客戶端： ```sudo apt install nfs-common```
    * 掛載共享目錄 : ( 140.113.30.218為 **sm-1** 的 IP )
        ```
        sudo mkdir -p /llm_model
        sudo mount 140.113.30.218:/llm_model /llm_model
        ```
    * 驗證掛載 使用 ```df -h``` 確認共享目錄是否成功掛載：```df -h```
    * 永久掛載 : 在 ```vi /etc/fstab``` 中添加:
        ```
        140.113.30.218:/llm_model /llm_model nfs defaults 0 0
        ```
        
        
# NAS 掛載方法

更新 nas ip
```bash=
sudo umount -l /workplace
vi /etc/fstab
sudo mount -a
```

## 相同區域網域下：
```
# Linux 掛載 NFS 分享
sudo mount -t nfs NAS_IP:/export/path /mnt/point
sudo mount -t nfs 140.113.30.206:/volume1/homes /workplace 
```

輸入：
```
vi /etc/fstab
```
之後加上
```
140.113.30.220:/volume1/homes    /workplace      nfs      defaults      0      0
140.113.30.206:/volume1/homes    /workplace      nfs      defaults      0      0
```

## 不同區域網域下
讓不同的機器能連結到固定ip的NAS
```
sudo mount -t cifs //140.113.30.220/homes /workplace -o username=NAS帳號,password=NAS密碼
```

你的指令  
```bash
sudo mount -t cifs //NAS_IP/share /workplace -o username=帳號,password=密碼,vers=3.0,iocharset=utf
```
**只會在此開機階段有效**，**重開機後就會自動消失（解除掛載）**。

### 為什麼？
- mount 指令直接掛載（不論 nfs/cifs/ext4 都一樣），只是「暫時」的。
- Linux 系統每次開機都會重新建立掛載點，必須靠 `/etc/fstab` 來維持永久掛載設定。
- 除非有寫進 systemd 自動掛載服務、crontab 或桌面自動掛載軟體，否則手動 mount 只在這次開機有效。

## 如何「開機自動掛載」？

**要讓檔案系統每次自動掛載，請編輯 `/etc/fstab` 加入一行設定：**

1. 用 sudo 權限編輯 `/etc/fstab`
    ```bash
    sudo nano /etc/fstab
    ```
2. 追加一行（將以下資訊根據實際情況改掉）：
    ```
    //NAS_IP/share /workplace cifs username=帳號,password=密碼,vers=3.0,iocharset=utf8 0 0
    ```
    - iocharset 用 utf8 沒錯！（最後不要打成 utf）
    - 若有安全顧慮，密碼區塊建議寫成 credentials=/path/to/你的密碼檔 ，參見下方補充
3. 儲存離開
4. 重新掛載（驗證語法沒打錯）：
    ```bash
    sudo mount -a
    ```

## 補充：密碼隱私寫法

不要在 fstab 直接寫明密碼，可用 credentials 檔：  
建立一個檔案 `/home/你的用戶/.nas-cred`：
```
username=你的帳號
password=你的密碼
```
然後 fstab 寫：
```
 //NAS_IP/share /workplace cifs credentials=/home/你的用戶/.nas-cred,vers=3.0,iocharset=utf8 0 0
```
**設檔案權限避免其他人讀到：**
```bash
chmod 600 /home/你的用戶/.nas-cred
```

## 小結
- 用 mount 指令手動掛載，重開機就會消失。
- 寫進 /etc/fstab，重開機自動掛載（若掛載失敗不用緊張，會顯示開機警告）。
- 推薦用 credentials 檔案寫帳密，提高安全性。
- 語法建議用 iocharset=utf8（不要少 8）。

如需範例或特殊參數（如 nofail、自動絡斷重連等），再告知你的需求即可！