---
# System prepended metadata

title: Linux
tags: [Network Management 2023 Spring]

---

---
tags: Network Management 2023 Spring
---

# Linux

<!-- {%hackmd hackmd-dark-theme %} -->

> 國立成功大學 網路管理 [IM7021E] 2023 Spring 筆記整理
課程使用之Linux Distribution：Fedora 10
Fedora 10安裝：https://hackmd.io/@cpt/Bk6qbqiNn
Apache Web Server相關設定：https://hackmd.io/@cpt/By1mHRlUn

## Linux Common Directory

<!-- {%hackmd BJrTq20hE %} -->

- `/`: root directory
- `/boot`: files needed to read when system start (存放系統啟動時必須讀取的檔案)
- `/etc`: system profile folder (系統設定最重要的目錄) (存放系統指令相關的設定檔)
- `/home`: user file directory
- `/mnt`: to save information of CD or FDD (存取光碟或軟碟片的資料) (掛載設備的地方)
    - 在Windows沒有掛載的概念，Windows是給所有設備一個代號
    - Linux，所有設備都是一個目錄，磁碟機一個目錄，印表機也是一個目錄，螢幕也是一個目錄.etc，新增的設備都建議掛載在`/mnt`
- `/root`: directory for system manager (系統管理者專屬的目錄)
- `/tmp`: directory for all user (供全部使用者"暫時"放置檔案的目錄)

## Switch from GUI to Console (Text) Mode

:::info
<!-- 資管系電腦教室Fedora密碼：`nbhgyt65` -->
VMware叫出滑鼠：`ctrl`+`alt`
:::

```bash!
// 執行以下指令以切換至Console mode

$ su    # Fedora系統用su指令，不是用sudo su (這是Ubuntu的指令!)
# su指令全名是set user
# 老師的講義是su -
> <enter password>
# 這樣就變成root user

$ vi /etc/inittab
# 將"id:5:initdefault"改成"id:3:initdefault"
$ reboot    # 重開機，即會進入text mode

# 重開機會要求登入，打root就可以登入成root user
> login <root>
> <enter password>

# 若要回到GUI介面，用以下指令
$ startx
```

![](https://hackmd.io/_uploads/Sk-Bs3tN3.png)
:::info
可以看到預設是`id:5:initdefault:`
把它改成`id:3:initdefault:`，這樣重開機就進入Console Mode
:::

![](https://hackmd.io/_uploads/B1yJz4Dr2.png)
![](https://hackmd.io/_uploads/SJAJzVvHn.png)


### 快捷鍵切換到Console mode

一台機器有許多終端機可以連進去，若其中一個終端機壞掉，那就可以換到另一個終端機

`ctrl` + `alt` + `F2`: change to terminal 2 (`tty2`)

`tty1`: terminal 1
`tty2`: terminal 2
其他編號依此類推

:::info
這些不同的virtual terminal (`tty1`~`tty6`)，其實就相當於Mac系統開啟多個分頁的terminal
:::

:::info
在Linux裡面有個東西叫做X Server (aka X Window)，GUI是跑在X Server上，X是一個project，讓使用者可以透過圖形介面執行程式，X Server有許多介面，可依據自己熟悉的界面安裝自己熟悉的界面，ex.麥金塔的介面或類Windows介面等等
老師在這裡不想要用GUI介面，想回到Console mode，所以要讓他啟動時不要啟動圖形介面
若要強制終止X Server，可用快捷鍵：`ctrl`+`alt`+`backspace`。這個指令強制砍掉X Server後，他會重新啟動，但重新啟動是要啟動什麼是依據`/etc/inittab`的內容所決定
:::

:::info
老師講義的東西

If in different terminal, to start the second Xwindow：
```bash!
$ startx -- :1
# -和:之間要有空格
```

Forced to stop XWindow：`ctrl` + `alt` + `backspace`
:::

## Ubuntu 20.04 (on VirtualBox)

### 切換virtual terminal/切換至console mode

:::danger
Ubuntu並沒有`/etc/inittab`，所以無法透過修改此檔案切換至Console mode
:::

`ctr`+`alt`+`F1`~`F6`：Ubuntu用快捷鍵切換不同virtual terminal
`F1`~`F6`相當於virtual terminal `tty1`~`tty6`
:::info
Mac的按鍵：`fn`+`control`+`option`+`F1`~`F6`
這樣才能切換安裝在VirtualBox的Ubuntu

`tty1`在Ubuntu預設是GUI介面
`tty2`~`tty6`則是Ubuntu的console mode
:::

亦可使用以下指令將`tty1`切換到console mode：
```bash!
$ sudo systemctl isolate multi-user.target

VirtualBox-P76101623 login: <輸入使用者名稱>   # cpt1020
Password: <輸入密碼>
```
![](https://hackmd.io/_uploads/r1VX1LKE2.png)

若要切換回GUI介面，用以下指令：

```bash!
$ sudo systemctl isolate graphical.target
```

### Root User in Ubuntu

Ubuntu系統，建議使用`sudo su`來切換到root user，而不要用`su`指令切換到root user

1. `sudo su`
    - 執行此指令，會要求輸入當前用戶的密碼，並在驗證成功後切換到root用戶的環境
    - 使用`sudo su`可以提供臨時的root用戶權限，而不需要知道root密碼，這是因為`sudo`命令使用的是當前用戶的密碼來進行驗證
2. `su`
    - 這個指令是單獨使用的，用於切換到其他用戶環境，包括root用戶
    - 執行`su`命令後，如果未指定用戶名，將預設切換到root用戶環境，並要求輸入root密碼。輸入密碼後，將切換到root用戶的環境
    - 與`sudo su`不同，`su`命令要求root密碼，並且必須提供正確的密碼才能切換到root環境
3. `sudo su`和`su`都可以切換到root用戶環境，但`sudo su`使用了 `sudo`命令的特權，而`su`則需要知道root密碼才能使用。建議在Ubuntu系統中優先使用`sudo`命令，以提高安全性和細緻的權限控制
4. 在預設的Ubuntu安裝中，root用戶是禁用的，並且不會要求設定root密碼。若需設定root密碼，可依照以下步驟：
    - `sudo su`：先切換到root user
    - `passwd`：在root環境下執行此命令以設定root密碼

## Vi

```bash!
$ vi <file_name>    // 用vi開啟該檔案
```

有三種mode：`command mode`、`last line mode`、`insert mode`

![](https://hackmd.io/_uploads/rktAYctNh.png)

### Command Mode <=> Insert Mode

若要插入字元，要從command mode進入insert mode，在insert mode才能打字
從commnad mode換到insert mode的指令：`i`, `a`
- `i`: 在cursor前面insert
- `a`: 在cursor後面insert

從insert mode到command mode: `esc`

### Command Mode <=> Last Line Mode

從command mode到last line mode: any key-stoke
從last line mode回到command mode: `:`

### Command Mode

#### Cursor Movement

- `1` or `0`: move to the front of the line
- `$`: move to the back of the line
- `<#>G`: move to #th line
- `G`: move to the last line

#### Switch to Insert Mode

- `a`: insert after cursor
- `A`: insert at the end of the line
- `i`: insert before cursor
- `I`: insert before this row
- `o`: insert on the last line

#### Edit Command

- `yy`: whole line copy
- `<#>yy`: copy # lines and put in buffer
- `p`: paste buffer content
- `<#>x`: delete # letter after cursro
- `<#>dd`: delete # lines

### Last Line Mode

- `:q`: leave without saving file content (file content unchanged)(內容沒被變更過才能使用此指令)
- `:q!`: leave without saving file content (file content changed)(內容若有被變更過就必須使用此指令離開此檔案)
- `:wq <filename>`: save file content and leave (並不需要filename呀?!🤔)
- `:w <filename>`: save the file
- `:.=`: show which line the cursor is
- `:=`: show file lines
- `:set nu`: rows show
- `:set nonu`: cancel rows show
- `:n,ms/str1/str2/<opt>`: search n to m, and replace the word `str1` as `str2`
    - `opt=g`: all replace
    - `opt=c`: ensure and replace
- `:e <filename>`: edit another file
- `:/<string>`: downward search `string`
- `:?<string>`: upward search `string`
- `:u`: undo last command
- `:.`: repeat last command 

## Commands for Files & Directories

- `ls`: list files
- `cd`: change directory
- `mkdir`: build directory
- `rmdir`: delete directory
- `cp`: copy file
- `rm`: delete file/directory
- `more`: show suspended screen
- `man <指令>`: 查看某個指令的manual，要離開的話就打`q`
- `mv`: move or rename
- `pwd`: print working directory
- `grep`: search string

`vi ~/.bashrc`: 可以編輯bash shell的一些預設東西

### `ls`

- show the conten of current directory
- `ls -al`
    - `-l`: show details
    - `-a`: show system (hidden) files
    - `.<file_name>`，檔名前面有個`.`就是hidden file

### `df`

- 沒有參數的話可以查看硬碟空間使用量
- 有多少disk，和partition number，以及多少空間available

![](https://hackmd.io/_uploads/HJdbMzPr2.png)

- `df -i`
    - show the number of inode，看inode被用掉多少
    - User若要惡意破壞這個系統的話，只要一直`touch`生出檔案，把inode用光，系統就會掛掉，所以才要用`quota`限制使用量

![](https://hackmd.io/_uploads/rJ6uzoKN3.png)

### `dumpe2fs`

- `dumpe2fs`: show how many file blocks in hard disk partition
- `dumpe2fs /dev/hda1 > dumpe2fs.txt`
    - 把某個disk的資料輸出成txt
    - `> /dev/monitor`: 輸出到螢幕

### Link

分成hard link和soft link

#### Hard Link

- 不會產生新的inode，是使用相同的inode指向相同的檔案
- 只能在同個partition中建立
- can't link to different kind of file system
- 只能連結檔案，不能連結目錄
- read the same data block as the original data block

```bash!
$ ln <原始文件路徑> <hard link文件路徑>
```

假如有`file.txt`此文件，想建立一個`hardlink.txt`：

```bash!
$ ln file.txt hardlink.txt
```

#### Soft Link

- 又稱作Symbolic link
- 相當於Windows的捷徑
- can link to different kind of file system
- 可以連結到不同的檔案型態，ex. 可連結到folder or file
- 會產生新的inode，這個inode會連結到original file table
- 一旦刪掉original file table，就找不到了，但是hard link在這種狀況還是可以找到

```bash!
$ ln -s <原始文件路徑> <soft link文件路徑>
```

例如，建立一個`softlink.txt`指向`file.txt`：
```bash!
$ ln -s file.txt softlink.txt
```

#### Example

![](https://hackmd.io/_uploads/rkw-ya1S3.png)
- 可以看到一開始創建`file.txt`時，只有一個連結指向該檔案
`-rw-rw-r-- 1 cpt1020 cpt1020    0 2023-05-15 22:16 file.txt`
- 建立hard link後，原本檔案的連結數以及hard link的連結數都是2
`-rw-rw-r-- 2 cpt1020 cpt1020    0 2023-05-15 22:16 file.txt`
`-rw-rw-r-- 2 cpt1020 cpt1020    0 2023-05-15 22:16 hardlink.txt`
- 建立soft link之後，原本檔案的連接數以及hard link的連接數不變；Soft link連接數是1
`-rw-rw-r-- 2 cpt1020 cpt1020    0 2023-05-15 22:16 file.txt`
`-rw-rw-r-- 2 cpt1020 cpt1020    0 2023-05-15 22:16 hardlink.txt`
`lrwxrwxrwx 1 cpt1020 cpt1020    0 2023-05-15 22:16 softlink.txt -> file.txt`
- 此外，注意soft link的file type是`l`，hard link的file type是`-`

![](https://hackmd.io/_uploads/rkFm16yS3.png)
- 使用`ll -i`指令可以看到inode編號(老師講義用的是`ls -il`指令)
- 可以看到hard link跟原本檔案的inode編號一樣(不會產生新的inode)；soft link則不一樣(有自己的inode)
`1147026 -rw-rw-r-- 2 cpt1020 cpt1020    0 2023-05-15 22:16 file.txt`
`1147026 -rw-rw-r-- 2 cpt1020 cpt1020    0 2023-05-15 22:16 hardlink.txt`
`1147028 lrwxrwxrwx 1 cpt1020 cpt1020    0 2023-05-15 22:16 softlink.txt -> file.txt`

![](https://hackmd.io/_uploads/B1vBeakB2.png)
- 不管對檔案本身，或對hard link、soft link做更改，都可以看到會改變

![](https://hackmd.io/_uploads/ryCtW6JH2.png)
- 把原本的檔案刪除了，hard link還是有原本的內容，soft link則顯示找不到檔案
- 必須要將原本的檔案& hard link都刪除(也就是連結數變成0)，才能真正刪掉檔案

:::info
$References$
- https://linux.vbird.org/linux_basic/centos7/0230filesystem.php#link
- https://medium.com/algorithm-solving/linux-hard-links-and-soft-links-9a15460aadc4
:::

### `chmod`

設定檔案的權限。可以用數字設定，也可以用字母設定

#### ++用字母設定++

對象：
- `u`：owner
- `g`：group
- `o`：others

權限：
- `r`：read
- `w`：write
- `x`：execute

```bash!
$ chmod ug+rwx file.txt
# 讓owner和group對file.txt有read，write，以及execute的權限

$ chmod u-x file.txt
# 讓owner失去對file.txt的execute權限
```

#### ++用數字設定++

當使用`ls -al`時，可看到以下畫面：
![](https://hackmd.io/_uploads/r1IWHcyr2.png)

以下是每列左半邊10個digit的意思：
- 第一個digit是file type，若是`d`，則代表是directory；若是`-`則代表一般的檔案；`l`則是symbolic link
- 第二到第四個digit：代表owner的權限
    - 若是`rwx`，則代表owner有read write execute權限
    - 若是`rw-`，則owner僅有read write權限
    - 其他組合依此類推
- 第五道第七個digit：代表group的權限
- 第八到第十個digit：代表others的權限

用數字組出想要的權限組合：
- read：4
- write：2
- execute：1

看以下例子說明：
```bash!
$ chmod 754 file.txt
```
- 754這三個數字，分別代表owner、group、others的權限
- 第一個數字，代表owner的權限，7是由4+2+1而來，所以owner有read, write, execute的權限
- 第二個數字，代表group的權限，5是由4+1而來，所以group有read和execute的權限
- 第三個數字，代表others的權限，4，所以others僅有read的權限

++把某資料夾內的東西權限都變成一樣++

```bash!
$ chmod -R 740 folder
# folder裡面的東西權限都變成740
```

### `chown`

- 更改檔案的擁有者，此指令要root user才可使用

```bash!
chown [選項] 新所有者[:新群組] 文件或目錄
```

選項：
- R：遞迴地修改目錄及其下的文件和子目錄的擁有者
- v：顯示每個修改的文件或目錄的詳細資訊
- c：僅在發生更改時顯示詳細資訊

新所有者可以是用户名或用户的用户ID (UID)，新所屬群組可以是群組名或群組的群組ID (GID)。

以下是 chown 命令的一些常见用法和示例：

將`file.txt`的owner改成`newuser`：
```bash!
$ chown newuser file.txt
```

將`file.txt`的所有者更改為`newuser`，所屬群組更改為`newgroup`：

```bash!
$ chown newuser:newgroup file.txt
```

將directory目錄及其下的所有檔案和子目錄的所有者都更改為`newuser`：
```bash!
$ chown -R newuser directory/
```

```bash!
$ su
> # enter password

$ chown iim.iim <file_name>
# 把檔案擁有者改成其他人
# iim.iim是指user_name.group_name
# 其實應該這樣就可以了：chown <new_owner> <file_name>

$ chown usr_name file_name
```

### `cd`

- Change Directory
- `cd ..`: 回到上一層
- `cd /`: 換到root directory
- `cd ~`: change directory to home directory
    - 若是只有`cd`，也會跳到home directory (可以去`/etc/passwd`去修改home directory，也就是修改下圖反白的部分)
![](https://hackmd.io/_uploads/H1hRrPqE3.png)
- `cd -`: change directory to you were previously in
- `cd /home/Music`: 用absolute path換到Music資料夾

### `mkdir`

- `mkdir <directory_name>`
- 若資料夾名稱有空格，則用`mkdir "directory name"`

### `rmdir`

- 刪除空的資料夾(必須要是空的folder才可以刪除)

### `rm`

- 刪除檔案或資料夾
- Recursive delete：
    - `rm -r folder` 或 `rm -R folder`
    - 即使資料夾裡面有東西，用這指令還是可以刪除該folder
- `rm -rf folder`
    - `-f`：forced to delete 不會向你確認是否真的要刪除

### `cp`

- copy files and directories
- `cp -v -R * backup`
    - `-R`: recursive copy，把資料夾內的檔案和資料夾都copy一份

### `more`

- 瀏覽檔案`more <file_name>`
- 若檔案有好幾頁，只能往下，不能往回看

:::info
建議用`less`去瀏覽檔案，可以往前也可以往後，比`more`有彈性
:::

### `mv`

- 移動檔案或rename

### `pwd`

- Print Working Directory

:::danger
要死記的指令是到這裡
:::

### `whoami`

- 我目前是哪個user

## Commands for User/Group Management

### User

|          | System Administrator | Common User |
| -------- | -------- | -------- |
| Name of Account | root | created by root |
| Home Dir | `/root` | `/home/user_name` |
| 檔案的權限 | can read, modify all files, directories, and access right of files or directories | can read, modify authorized files adn directories only |
| 指令執行的權限 | 可以執行所有的指令 | 可執行authorized commands |

- 有兩種user，第一種是root，user id是0；另一種是一般使用者，user id >= 500
- 使用者的資料都存在`/etc/passwd`這個檔案內

![](https://hackmd.io/_uploads/H1iOqbDB2.png)
![](https://hackmd.io/_uploads/SJ75cbPHh.png)


<!-- ![](https://hackmd.io/_uploads/SymkIbvBn.png) -->
<!-- ![](https://hackmd.io/_uploads/rkXaBbwH2.png) -->

- 可以看到root的user id是0 (user ID是0，就是super user，所以可以在`/etc/passwd`裡面把super user的名稱從root改成別的，這樣駭客才不容易入侵)
- user id < 500：系統軟體使用者
- user id 1~100：system user
- user id >= 500：一般user

:::info
`/etc/passwd`檔案中每一列代表一個用戶帳戶，並且由冒號分隔成不同的欄位
以下是<b>Ubuntu</b>的`/etc/passwd`的每個欄位的說明：
- 用戶名（Username）：這是用戶帳戶的名稱，用於識別用戶。
- 密碼（Password）：在舊版本的系統中，此欄位存儲加密的用戶密碼。在新的 Ubuntu 系統中，密碼已經被移至`/etc/shadow`檔案中，而這個欄位則標記為`x`或`*`，該檔案只能由系統管理員讀取
    - ++若將密碼這個欄位的值`x`刪掉，則登入該使用者帳號就不需要使用密碼++
- 用戶ID（User ID）：這是用戶的唯一識別號（UID）。每個用戶都有一個唯一的數字 ID，用於系統識別該用戶。一般用戶的 UID 大於等於500。
- 群組ID（Group ID）：這是用戶所屬的主要群組的群組識別號（GID）。該群組通常與用戶的名稱相同，並且用於定義用戶的主要群組。
- 用戶資訊（User Information）：這是一個包含用戶相關資訊的欄位，如用戶的全名或描述。這個欄位可以是空的或包含其他資訊。
- 家目錄（Home Directory）：這是用戶的家目錄的路徑，即用戶登入後的初始工作目錄。會從硬碟切割一塊給這個user去使用，每個user對自己的home directory有完全的權限
- 登入shell（Login Shell）：這是用戶登入後使用的預設shell程式的路徑。一般用戶的預設shell是`/bin/bash`
:::

### Password

建立使用者後要用以下指令設定該user的密碼

```bash!
$ passwd user_name
# 若無user_name則是更改目前使用者的密碼
```

密碼會存在`/etc/shadow`，裡面的值都有被加密過，若要查看該檔案必須要有root的權限，因此Fedora使用者要先用`su`登入root才能查看該檔案，Ubuntu使用者則必須用`sudo vi /etc/shadow`才能處理該檔案

![](https://hackmd.io/_uploads/BJoicWPBn.png)
![](https://hackmd.io/_uploads/SyDn5bwS3.png)

<!-- ![](https://hackmd.io/_uploads/ryATu-wH2.png)
![](https://hackmd.io/_uploads/SJ2RuWDr3.png) -->

<!-- ![](https://hackmd.io/_uploads/H1dQRucEn.png)
![](https://hackmd.io/_uploads/Hyd4C_qNh.png) -->

:::info
`/etc/shadow`各欄位說明：
1. 用戶名（Username）：這是用戶帳戶的名稱，與 /etc/passwd 中的用戶名相對應。
2. 加密密碼（Encrypted Password）：這個欄位存儲了用戶的加密密碼。密碼以加密形式存儲，無法直接讀取。通常以哈希函數的形式儲存，例如使用 MD5 或 SHA 等演算法進行加密。
3. 密碼最後修改時間（Last Password Change）：這是密碼上次被更改的日期。該值表示自 1970 年 1 月 1 日以來的天數。
4. 密碼過期時間（Password Expiration）：這是密碼過期的日期。該值表示自 1970 年 1 月 1 日以來的天數。如果密碼過期，用戶需要更改密碼。
5. 密碼過期提前警告天數（Password Expiration Warning）：這個欄位指定在密碼過期前的天數，發出警告通知用戶需要更改密碼。
6. 密碼失效期限（Password Inactivity Period）：這是密碼失效之前的不活動天數。如果用戶在指定天數內沒有登入，則密碼失效。
7. 帳戶失效日期（Account Expiration Date）：這是用戶帳戶失效的日期。該值表示自 1970 年 1 月 1 日以來的天數。一旦帳戶失效，用戶將無法登入。
8. 保留字段（Reserved Field）：此欄位目前沒有特定的用途，通常保留為空。
:::

### Root User

- Root user會有自己專屬的home directory
    - `/root`

### 新增User

++新增使用者++
```bash!
$ useradd <user_name>
# 要有root權限才可新增
# 一旦新增了使用者，/etc/passwd和/etc/shadow的內容就會更改
# 其實也可以自己手動去這兩個檔案做更改新增/刪除使用者
# 更改該兩個檔案都要root user才可以，且/etc/shadow可能只有read權限，所以要用chmod來得到write權限
```

++設定密碼++
```bash!
$ passwd <user_name>
# 若無user_name則是更改目前使用者的密碼
```

### Switch User

```bash!
$ su <user_name>
# 若沒user_name，就是登入root user

$ su - <user_name>
# 若沒user_name，就是登入root user
```
:::info
++`su`和`su -`的差異++
`su`指令是切換用戶的指令，而`su -`指令則是切換用戶並同時讀取其環境變數和配置文件。以下是兩者之間的主要差異：
1. `su`指令：`su`是 "switch user" 的縮寫，用於切換到其他用戶。當您執行`su`指令時，您將被要求輸入目標用戶的密碼，然後您將切換到該用戶的身份。但是，環境變數和配置文件（如`.bashrc`、`.profile`）並不會讀取目標用戶的設定，而是保留了您原始用戶的環境。
2. `su -`指令：`su -`指令不僅切換到目標用戶，還將讀取目標用戶的環境變數和配置文件。當您執行`su -`指令時，您將被要求輸入目標用戶的密碼，然後您將切換到該用戶的身份並讀取其環境設定。這意味著您將使用目標用戶的環境變數和配置文件，例如它們的家目錄、路徑設定和別名等。
3. 總結來說，`su -`是一個更完整的切換用戶的方式，它還讀取目標用戶的環境設定，使您可以完全以目標用戶的身份運行指令。如果您需要切換到另一個用戶並使用其完整的環境設定，則應該使用`su -`指令。
:::

### Disable User

編輯`/etc/passwd`檔案，在該使用者該列最前方加入`#`即可disable該帳號

![](https://hackmd.io/_uploads/SyFX75c4n.png)
![](https://hackmd.io/_uploads/SyrDXq94h.png)

:::info
從這兩張圖可看到我將usr1和usr2都disable了，所以我無法切換到這兩個使用者，但我可以切換到usr3
:::

### Delete User

++刪除帳號++

```bash!
$ userdel <user_name>
```
- 用此指令刪除帳號(要用root權限)
- 用此指令刪除帳號後，其home directory仍然存在，不會被刪除，`cd /home`就可以看到

++連home directory一起刪除++

```bash!
$ userdel -r <user_name>
```
- 加上`-r`就可以連home directory一起刪除

:::warning
++刪除使用者帳號時要注意幾點++

- 刪除background program，確認該使用者沒有在執行任何program，可用以下指令確認該使用者是否有在執行任何program
    - `ps aux | grep <user_name>`
老師示範的是`ps -au` (Note. `ps au`跟`ps -au`是一樣的)
`ps aux`跑出來的東西很多，`ps au`跑出來的東西較少
    - 找到正在執行的指令的PID後，用`kill <PID>`刪除該process
    - 可以用`kill -9 <PID>`，這是有最高權限的刪除
- Delete timer by `crontab -u`，使用者可能有設置排程來啟動program，所以要檢查使用者是否有設置任何排程
    - 用此指令刪除該使用者的排程：`crontab -u <user_name> -l`
:::

### Group

++Assign password to group_name++

```bash!
$ gpasswd <group_name>
```

++Assgin user to be the group manager++

```bash!
$ gpasswd -A <user> -M <group_name>
```

++Add user into group_name++

```bash!
$ gpasswd -a <user> <group_name>
# 老師示範是用 gpasswd -a <user> -g <group_name>
```

:::warning
PS. 以上三個指令都只有super user才能用
:::

++為什麼要群組?++

- 可以設置硬碟空間的使用quota，看是對一個使用者設置，也可以是對一個群組設置
    - 譬如說有個群組有兩個使用者，對這個群組設置1.5g的硬碟空間quota，若其中一個使用者用了1g的空間，則另一個使用者就只剩0.5g可使用
- 群組的成員可以有特殊的權限存取檔案

#### `/etc/group`

- 這個檔案有群組的資訊。每當我們建立一個使用者，系統也會預設建立一個給該使用者的群組

![](https://hackmd.io/_uploads/ByQyibvS3.png)
![](https://hackmd.io/_uploads/Syyli-Dr2.png)


#### 其他跟群組有關的指令(老師沒教)

++新增群組&使用者++

```bash!
$ groupadd <group_name>
$ useradd -g <group_name> <user_name>
```

++刪除使用者和群組++

```bash!
$ delgroup <group_name>
$ deluser <user_name>
```

++檢查在哪個群組++

```bash!
$ groups <user_name>
```

++更改檔案所屬群組++

```bash!
$ chgrp <group_name> <file_name>
```

## Disk Space Management

磁碟空間管理大概可分成以下步驟：
1. 編輯`/etc/fstab`，在要管制的partition加上`usrquota`、`grpquota`字樣
2. 在要管制的partition的目錄下產生`aquota.user`和`aquota.group`
3. `reboot`
4. 用`quotacheck -ugavm`計算使用量(root用此指令才有效果)
5. `edquota <user_name>`設定使用者的使用量
6. `edquota -t`設定grace time
7. `quotaon -ugav`啟動管制
8. 查看使用報告
9. `quotaoff -ugav`關閉管制

### `/etc/fstab`

`/etc/fstab`（File System Table）是一個在 Linux 系統中用於配置檔案系統的重要檔案。它存儲了系統開機時需要自動掛載的檔案系統的相關資訊。

每列`/etc/fstab`檔案代表一個檔案系統的設定，其欄位由空格或制表符分隔。以下是`/etc/fstab`檔案的典型欄位：
1. 檔案系統裝置：這是檔案系統所在的裝置或分割區的路徑。例如，`/dev/sda1`或 `/dev/nvme0n1p2`。
2. 掛載點(mount point)：這是檔案系統將被掛載到的目錄路徑。例如，`/`表示根目錄，`/home`表示home目錄。
3. 檔案系統類型：這是檔案系統的類型，如 ext4、ntfs、vfat 等。
4. options：這是用於指定檔案系統的掛載選項，如 rw（可讀寫）、ro（唯讀）、noexec（不執行可執行檔）等。
5. dump：這個欄位通常設置為 0，表示不需要備份。
6. fsck：這個欄位通常設置為 0 或 2，用於指定系統檢查檔案系統的順序。0 表示不需要檢查，1 表示先檢查，2 表示後檢查。

以下是`/etc/fstab`檔案的一個範例：

```bash!
/dev/sda1   /        ext4   defaults   0  1
/dev/sda2   /home    ext4   defaults   0  2
```

這個範例中，第一行表示將`/dev/sda1`分割區上的ext4檔案系統掛載到根目錄`/`，並使用默認的掛載選項。第二行表示將`/dev/sda2`分割區上的ext4檔案系統掛載到家目錄 /home，同樣使用默認的掛載選項。

下圖是Fedora 10的`/etc/fstab`：

![](https://hackmd.io/_uploads/rk-MV4PHn.png)

### 設定Disk Space Managment

- 啟動時，會決定哪個partition掛載到哪個目錄上，所以要指定哪些partition要計算使用者用了多少空間，若沒指定，他不會幫你算
- 以下動作都要root權限才行
- 假如我們要計算某個partition，group的使用量，就要在`/etc/fstab`該partion的`option`欄位加上`grpquota`；若是要計算使用者的使用量，則是加上`usrquota`
    - ex. `defaults,usrquota,grpquota`
    - <b>注意，逗號後不可有空格，也不能打錯字，否則系統會無法重啟</b>

![](https://hackmd.io/_uploads/H1evV4DHh.png)
- 如上圖，假設要管制`/home`這個partition，就改成`defaults,usrquota,grpquota`
- 接下來，到你要管制的partition的directory下，即`/home`，建立`aquota.user`和`aquota.group`這兩個檔案
- `reboot`重開機
- 用root執行`quotacheck -ugavm`計算當前使用量
:::info
```bash!
$ quotacheck -ugavm
```
- `-u`: calculate directories and files UID occupied quota 針對使用者
- `-g`: calculate directories and files GID occupied quota 針對group
- `-a`: scan the partition quota set in `fstab` file
- `-v`: show the executing process of command
- `-m`: enforce executino
:::

![](https://hackmd.io/_uploads/Hklur4vH2.png)

:::warning
若此時用`quotacheck -ugavm`出現上面圖片的訊息`Your kernel probably supports journaled quota but you are not using it. ...`，依照以下步驟處理：
1. 將`defaults,usrquota,grpquota`改成：
`defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0`
注意是jqfmt不是jpfmt，不要打錯
2. `reboot`
3. `quotacheck -ugavm`
:::

![](https://hackmd.io/_uploads/r1Nx_g5Bh.png)

![](https://hackmd.io/_uploads/SyD3wecBh.png)
用前述設定方法，重啟後執行`quotacheck -ugavm`就不會再出現那段訊息了

### Another Case

假設我要管理`/`和`/home`這兩個partition的硬碟使用量，首先就是在`/etc/fstab`檔案的`/`和`/home`都做修改，如下圖

![](https://hackmd.io/_uploads/S1sa_lqrh.png)

接下來，到受到管理的partition的目錄下產生`aquota.user`和`aquota.group`，所以這個例子要到`/`和`/home`分別產生這兩個檔案，如下圖：

![](https://hackmd.io/_uploads/HkeDtgcHn.png)

:::info
用`ls -l`指令可以看到所建立出的來`aquota`檔案，others是有Read權限的！
若沒有主動生出這檔案，雖然系統會自己建立，但系統建立的檔案others就沒有read權限，會導致後續一般user執行`quota`和`quota -v`出問題
:::

`reboot`後用root執行`quotacheck -ugavm`，再用`quota -v`即可看到`/`和`/home`的使用量，如下圖：
![](https://hackmd.io/_uploads/BkxbcgqHh.png)

一般的user用`quota -v`也會有結果跑出來，而不會跑出`Permission denied`的訊息，如下圖
![](https://hackmd.io/_uploads/r1s6ox9S2.png)

:::warning
我如果只有要記錄`/home`的使用量，我就在`/home`底下建立`aquota.user`和`aquota.group`

假如我只有要記錄`/home`，但我卻是在`/`底下建立`aquota.user`和`aquota.group`，這樣到時候用`quota -v`時，只有root用這指令有用，一般user用這指令會沒有權限開啟`/home/aquota.user`和`/home/aquota.group`
因為系統會在`/home`底下生出兩個aquota檔案，這兩個檔案，others都沒有read的權限。必須要一開始就在`/home`底下建立`aquota.user`和`aquota.group`才會有read的權限

我一開始不知道，我以為都是只要在`/`底下建立`aquota.user`和`aquota.group`就好了，結果一般使用者就一直沒辦法用`quota -v`，一直出現下圖的訊息，我一直弄好久才知道問題出在哪= =

![](https://hackmd.io/_uploads/HJiIiG9Sh.png)

![](https://hackmd.io/_uploads/SyQ9sM5H3.png)
上圖的`aquota.user`和`aquota.group`是系統自己建立的，用`ls -al`可看到那兩個檔案other都沒有任何權限
:::

### 設定使用者使用量

用以下指令設定某使用者的使用量

```bash!
$ edquota <user_name>
$ edquota -u <user_name>
# 兩個指令效果一樣，輸入後會進入設定的畫面，設定完按esc，輸入:wq離開
# edquota後不用重新開機
```

對一個一個使用者做設定很慢，也可以先設定好一個使用者，然後把該使用者的設定都套用到全部的使用者身上

```bash!
$ cd /home
$ edquota -p <user_name> *
# 把某個使用者(user_name)的disk limit都套用到/home裡面的其他使用者
```

quota的限制分成容量限制(block)或檔案數量限制(inode)：
- 限制inode：限制使用者可以建立的檔案數量
- 限制block：限制使用者磁碟容量的限制

![](https://hackmd.io/_uploads/BJPITf5B3.png)
- `/dev/sda1`是`/` root directory
- `/dev/sda2`是`/home` home directory
- 以上的設定就是限制user1在`/home`的檔案數量不能超過10個

:::info
單位說明：
Block quotas can be specified in bytes (B), kilobytes (K), megabytes (M), terabytes (T), petabytes (P), or exabytes (E). If no units are specified, kilobytes are assumed. 
Inode quotas can be specified in kiloinodes (K), megainodes (M), terainodes (T), petainodes (P), or exainodes (E). If no units are specified, the number of inodes specified are used.

- https://unix.stackexchange.com/questions/140310/what-is-the-unit-measurement-used-in-edquota
- http://c.biancheng.net/view/3751.html
:::

:::info
欄位說明：
可看到六個欄位 blocks, soft, hard, inodes, soft, hard
前三個欄位是data block，後三個欄位是inode
![](https://hackmd.io/_uploads/SJWd8PiNh.png)
![](https://hackmd.io/_uploads/BkfhIvoEn.png)
Note: 每當產生一個檔案或資料夾，就會用掉一個inode，以及多個data block

所以我們可以針對data block和inode做限制，而limit又分成hard和soft，hard的值要大於等於soft (否則就相當於只有設定Hard Limit)
- Hard Limit：硬限制是一個嚴格的限制，指定了使用者在磁碟配額中所能使用的最大資源數量（例如磁碟空間的 blocks 數量或 inodes 數量）。一旦硬限制被設定，使用者無法超過這個限制。超過硬限制的操作通常會被拒絕，並且會產生錯誤或警告訊息。
- Soft Limit：軟限制也是一個限制，但是比硬限制更寬鬆一些。軟限制指定了一個建議的資源使用上限，但允許使用者在一段時間內(grace time)超過這個限制。超過軟限制的操作通常會被記錄下來，但不會立即拒絕。然而，超過軟限制一段時間後，使用者可能會受到警告或限制，並被要求減少資源使用。

簡單來說，硬限制是一個強制限制，一旦設定就無法超越，而軟限制是一個可彈性調整的限制，可以在一定時間(grace time)內超過，但可能會導致後續的警告或限制。
:::

### Grace Time

當使用者用超過Soft limit，我們可以設置Grace Time，要求在怎樣的時間內要讓空間使用量不超過Soft limit，預設的grace time是7天，若超過時間則資料會被清掉

設置Grace time for all users
```bash!
$ edquota -t
```

![](https://hackmd.io/_uploads/By_VWnYB3.png)

設置Grace time for all groups
```bash!
$ edquota -gt
```

### 關閉/啟用硬碟使用空間限制

這些使用空間的控管都是由`quotaon`這個program負責的(預設上，當系統啟動，`quotaon`就會啟動)，若要關閉這個功能，就執行`quotaoff -ugav`指令，若後續要再啟動，就執行`quotaon -ugav`指令即可(PS. 在執行quotaon之前要記得先執行`quotacheck -ugavm`去計算，因為off之後就不會計算了，所以要重新計算)

### 查看使用量

查詢自己被設定的限制：

```bash!
$ quota
```

查詢自己目前的使用狀況：

```bash!
$ quota -v
```

![](https://hackmd.io/_uploads/BkdV7QqH2.png)

### 查看所有使用者/群組的使用量

Root可用以下兩個指令查看所有的使用者和群組是否超過限制：
```bash!
$ repquota -ag
# 查看所有的group

$ repquota -au
# 查看所有的使用者
```

![](https://hackmd.io/_uploads/rJqKM2tB2.png)
圖中的`+`代表超過了，然後還有六天的時間可以去處理

## Redirection & Pipe

```bash!
$ ls -al > dir.txt
```
- 這樣會把`ls -al`的結果輸入到`dir.txt`
- 若原本`dir.txt`已經有內容，會直接被覆蓋掉

```bash!
$ cat data1.txt >> data2.txt
```
- 用`>>`則不會覆蓋掉原本的內容，而是接在原本內容的後面

```bash!
$ ls | grep "conf"
```
- `|`是pipe，會把左邊的結果導到右邊，執行右邊的指令
- `grep`指令會搜尋特定的字串，這例子是搜尋`conf`這個字串

```bash!
$ grep string *.txt
```
- 搜尋所有含有string字樣的txt檔案

![](https://hackmd.io/_uploads/r1xttmPB2.png)
只顯示`iim`的quota report

## 檔案壓縮和打包

`tar`、`zip`、`gzip`和`bzip2`是在Linux和Unix系統中常見的壓縮和封裝工具，它們有不同的壓縮算法和功能。

1. `tar` (Tape Archive)：`tar`是一種將多個文件和目錄打包成單一文件的工具，常用於將多個文件和目錄進行壓縮和備份。`tar` ++不會++對文件進行壓縮，只是將它們打包成一個檔案。通常與其他壓縮工具（如`gzip`或`bzip2`）結合使用，以實現壓縮效果。
    - `tar -xf filename.tar`：解壓縮
2. `zip`：`zip`是一種廣泛使用的壓縮工具，它可以將多個文件和目錄壓縮成一個zip檔案。zip使用DEFLATE壓縮算法，能夠有效地減少文件的大小。`zip`可以壓縮並保留目錄結構，並且支援密碼保護和加密。
    - `unzip filename.zip`：解壓縮
3. `gzip`：`gzip`是一種廣泛使用的壓縮工具，它使用DEFLATE壓縮算法對單個文件進行壓縮。`gzip`壓縮後的檔案保留原始文件的副檔名，並將其更改為`.gz`。`gzip`壓縮的文件不會保留目錄結構，只壓縮單個文件。
    - `gunzip filename.gz`：解壓縮
    - `gzip -d filename.gz`：解壓縮
4. `bzip2`：`bzip2`是一種壓縮工具，使用Burrows-Wheeler Transform（BWT）和Huffman編碼進行壓縮。`bzip2`可以產生比`gzip`更小的壓縮檔案，但壓縮和解壓縮的速度通常比較慢。`bzip2`壓縮的文件具有`.bz2`副檔名，並且不保留目錄結構，只壓縮單個文件。
    - `bunzip2 filename.bz2`：解壓縮
    - `bzip2 -d filename.bz2`：解壓縮

總結來說，`tar`是打包工具，用於將多個文件和目錄打包成一個文件。`zip`、`gzip`和`bzip2`則是壓縮工具，用於將單個文件進行壓縮。`zip`提供了壓縮和打包的功能，而`gzip`和`bzip2`只進行壓縮。

`tar`
- `-c`: build a new tar file
- `-v`: show the information of process
- `-f`: assign file name
- `-z`: use `gzip` to zip
- `-t`: examine zip file content
- `-x`: open tar file

```bash!
$ tar cvf data.tar *
# 把當前所在資料夾中的檔案和資料夾都打包成data.tar

$ tar cvzf data.tar.gz *
# 把當前所在資料夾中的檔案和資料夾都打包並壓縮成data.tar.gz
# -z：壓縮檔案
# 習慣上若有壓縮的話，會在副檔名加上.gz提醒說這個檔案有壓縮

$ tar tvf data.tar
# 查閱data.tar有哪些檔案

$ tar xvf data.tar
# 把data.tar打開

$ tar -xzvf foo.tar.gz
# 用-z來打開.tar.gz檔案

# 用-Z來assign不同壓縮工具
$ tar -cZvf picture.tar.Z *.tif    # 把所有.rig檔都壓縮起來
$ tar -Zxvf picture.tar.Z    # 解壓縮
```

## 排程

排程可以分成個人的排程和系統的排程

### 個人排程

每個使用者都可以有自己的crontab設定，每個使用者的crontab設定儲存在`/var/spool/cron/`目錄中以使用者名稱命名的檔案中。

若要編輯個人的crontab，則登入自己的使用者帳戶之後，用以下指令：
```bash!
$ crontab -e
```
這指令會開啟編輯器，這時就可以設定自己的crontab，每一列都是一個排程，以下是crontab的格式：
```bash!
分鐘(0-59) 小時(0-23) 日(1-31) 月份(1-12) 星期(0-7) 動作
```

譬如說，我想要每天中午十二點，把當下的日期時間記錄在`date.txt`檔案內，我就這樣寫：
```bash!
0 12 * * * date >> /home/cpt1020/Documents/date.txt
```

使用以下指令可以查看當前使用者所設定的個人crontab:

```bash!
$ crontab -l
```

![](https://hackmd.io/_uploads/SkSHBh2Vh.png)

用以下指令可把當前使用者的crontab都刪除

```bash!
$ crontab -r
```

### 特殊符號
- `*`：任何時間都接受的意思
- `,`：代表分隔的時段
    - 譬如說，某個工作是每天3:00, 6:00, 9:00, 12:00，那就寫成：
`0 3,6,9,12 * * * command`
- `-`：代表一段時間範圍內
    - 譬如說，8點到12點的每小時的20分都執行某工作：
`20 8-12 * * * command`
- `/n`：`n`是代表數字，`/n`代表每隔幾n個單位的時間的意思
    - 例如，每10分鐘就執行某工作：
`*/10 * * * * command`

### 查看`cron`日誌檔案(老師沒教這個)

cron的log通常會存在`/var/log/cron`或`/var/log/syslog`，Fedora10的是存在`/var/log/cron`。可以查看此檔案的內容看cron是否有被執行

:::info
++排程設定`echo`工作++

我一開始練習時，crontab的工作是設定`echo "hello world"`，但時間到了之後我的終端機都沒顯示`hello world`，但我去查`/var/log/cron`又看到系統在那個時間點有執行我設定的這個工作。

接下來，我就測試crontab，工作設定為`echo "hello world" > result.txt`，時間到了之後就真的有這個檔案，且有hello world的字樣，所以確認真的有執行這個工作。

之後才發現在crontab設定中執行的指令預設是不會將輸出顯示在終端上的，因為crontab是在背景執行的。

若想要將結果顯示在當前的終端上(ex. 假如目前是在`tty1`)，可以將crontab設定中的指令導向到終端。例如，將`echo "good morning"`改為`echo "good morning" > /dev/tty1`，這會將輸出導向到`tty1`

另外，很重要的一點是，由於存取`/dev/tty1`要有root權限，因此要登入root並在root的個人crontab設定此指令才行，否則在一般使用者的個人crontab設定此指令並不會將結果輸出到終端機上
:::

### 系統性crontab

系統性的crontab是全域的設定，適用於整個系統。它使用的 crontab 檔案通常位於 `/etc/crontab` 或 `/etc/cron.d/` 目錄中 (Fedora 10是 `/etc/crontab`)。

![](https://hackmd.io/_uploads/SJDAsbvBh.png)

與個人的crontab不同，系統性的crontab檔案有額外的欄位，指定要執行該cron任務的使用者名稱。

編輯系統性的crontab檔案需要使用root權限才能使用編輯器打開`/etc/crontab`檔案進行編輯。每列系統性 crontab 的格式如下：

```bash!
* * * * * username command
```

若想要每天早上八點要求user1, user2, user3執行某工作：
```bash!
0 8 * * * user1,user2,user3 command
```

<!-- ![](https://hackmd.io/_uploads/B1j9CXPB3.png) -->


<!-- ![](https://hackmd.io/_uploads/HkgaxVwBn.png) -->


## New Disk/Partition Mount

通常在新增硬碟到Linux系統時，可以按照以下步驟進行：

1. 建立分割區 (Partition)：使用工具如`fdisk`或`parted`，對硬碟進行分割，建立一個或多個分割區。
2. 格式化分割區：對每個分割區進行格式化，以便能夠在其上建立檔案系統。常見的格式化工具有`mke2fs`(用於 ext2、ext3、ext4 檔案系統)、`mkfs.xfs`(用於 XFS 檔案系統) 等。
3. 建立目標目錄 (Mount Point)：決定要將分割區掛載的目標目錄，通常是在根目錄下的一個子目錄。例如，你可以建立一個目錄`/mnt/newdrive`作為掛載點。
4. 掛載分割區：使用`mount`指令將格式化後的分割區掛載到目標目錄上。例如，使用指令`mount /dev/sdb1 /mnt/newdrive`將`/dev/sdb1`分割區掛載到`/mnt/newdrive`。

這樣就可以在目標目錄上存取並操作新的硬碟了。這些步驟通常需要使用root或具有相應權限的使用者執行。在完成後，也可以將相關設定寫入`/etc/fstab`檔案中，使系統在開機時自動掛載該分割區。

PS. 這幾個步驟基本上都要有`root`權限

以下依序說明各個步驟(假設都是在已登入root的情況下下指令)：

### Partition 切割

使用`fdisk`對新的硬碟進行分割：

```bash!
$ fdisk /dev/sdb
```

這會進入`fdisk`的互動模式。在此模式下，你可以使用不同的指令來進行分割，例如：
- `m`：顯示主選單。輸入`m`可以獲取所有可用指令的簡要說明。
- `p`：顯示當前分割區表。這會列出目前硬碟上的所有分割區。
- `n`：新增一個新的分割區。這將引導你進一步指定分割區的類型、起始和結束位置等。
- `d`：刪除分割區。你可以選擇要刪除的分割區號碼。
- `t`：更改分割區的類型。你可以選擇要更改類型的分割區號碼，然後輸入新的分割區類型代碼。
- `l`：列出所有可用的分割區類型代碼。這將顯示不同檔案系統類型的代碼。
- `w`：將分割區表寫入硬碟並退出。這將保存你所做的所有變更。
- `q`：退出`fdisk`而不保存任何變更。

可以根據需要來進行分割區的配置。完成後，輸入`w`來寫入分割表並退出`fdisk`。

### Format 格式化

使用`mke2fs`工具來格式化分割區為ext3檔案系統(老師是用以下這個指令)：

```bash!
$ mke2fs -j /dev/hdb1
```

另外，也可用以下指令：

```bash!
$ mke2fs -t ext3 /dev/sdb1
```

:::info
`mke2fs -j /dev/hdb1`指令中的`-j`參數實際上是指定要創建ext3檔案系統。在ext3檔案系統中，使用日誌（journal）來提供更好的資料一致性和快速恢復功能。因此，`-j`參數告訴`mke2fs`工具要創建一個 ext3 檔案系統。

如果不使用`-j`參數，則`mke2fs`將創建一個傳統的ext2檔案系統，該系統不包含日誌功能。因此，如果你想要創建ext3檔案系統，可以使用`mke2fs -j`或`mkfs.ext3`指令，兩者是等效的。
:::

以下是一些常見的`mke2fs`參數：
- `-t`或`--type`：指定要建立的檔案系統類型，例如ext2、ext3或ext4。
- `-b`或`--block-size`：指定檔案系統的區塊大小。
- `-L`或`--label`：為檔案系統指定標籤（標籤是用於識別檔案系統的可讀性名稱）。
- `-c`或`--check`：在建立檔案系統之後進行一致性檢查。
- `-j`或`--journal`：為 ext3 檔案系統建立日誌功能。
- `-T`或`--test-filesystem`：在建立檔案系統之前執行測試。
- `-m`或`--reserved-percentage`：設定保留區塊的百分比。
- `-N`或`--nodiscard`：不執行保留區塊的檢查。

其他更詳細的說明可參閱`man mke2fs`

### Mount 掛載

當有新的儲存裝置，像是新的硬碟、或插入usb隨身碟，必須要做掛載(mount)的動作，把硬碟中的檔案系統掛載到系統的目錄結構中。

掛載是指將檔案系統與特定的目錄關聯起來，使得該目錄可以訪問該檔案系統中的檔案和資料。當在系統中添加新的硬碟或儲存設備時，需要將該硬碟上的檔案系統掛載到系統的目錄結構中，以便可以進行檔案的存取和操作。

掛載硬碟的過程可以理解為將該硬碟上的檔案系統與系統的目錄結構進行連接。當您將硬碟掛載到系統後，系統就能夠認識該硬碟上的檔案系統，並將其作為一個目錄結構的一部分來使用。

掛載的步驟如下：

1. 確定硬碟的識別符號：在Linux系統中，硬碟通常會被識別為`/dev/sdX`（其中`X`是一個字母，例如`/dev/sda`、`/dev/sdb`等）。
2. 創建掛載點：在系統中選擇一個目錄作為掛載點（Mount Point），這個目錄將用於訪問硬碟上的檔案和資料。
3. 使用`mount`指令進行掛載：執行`mount`指令，指定硬碟的識別符號和掛載點，例如`mount /dev/sdb1 /mnt`。這將把`/dev/sdb1`上的檔案系統掛載到`/mnt`目錄。

掛載硬碟後，您就可以通過掛載點（例如`/mnt`）來訪問硬碟上的檔案和資料，就像訪問本地檔案系統的內容一樣。

掛載硬碟的目的是讓系統能夠識別和使用新添加的硬碟，並將其整合到系統的檔案系統中。這樣您就可以在新的硬碟上存儲檔案、執行應用程式、進行備份等操作。

:::info
若沒有做掛載的動作，就無法拜訪硬碟上的檔案。

當硬碟上的檔案系統沒有被掛載時，系統並不知道該硬碟上的檔案系統的存在。掛載硬碟就是將硬碟上的檔案系統與系統的目錄進行關聯，這樣系統就能夠識別該硬碟上的檔案系統並將其作為一個目錄來使用。

我們也沒辦法直接用`cd /dev/sdb1`去拜訪尚未掛載的儲存裝置，因為`/dev/sdb1`是硬碟設備文件，而不是一個可以直接進入的目錄。
:::

以下是簡單的步驟：

1. 創建一個目錄，例如`/mnt/mydisk`，作為掛載點：

```bash!
$ mkdir /mnt/mydisk
```

2. 使用`mount`命令將硬碟`/dev/sdb1`掛載到掛載點：

```bash!
$ mount /dev/sdb1 /mnt/mydisk
```

3. 接下來就可以進入`/mnt/mydisk`目錄，訪問該硬碟上的檔案和資料：

```bash!
$ cd /mnt/mydisk
```

4. 完成操作後記得用`umount`卸載儲存裝置，將硬碟從系統中移除，這樣才能安全地拔除硬碟(類似Windows的安全的移除裝置)：

```bash!
$ umonut /mnt/mydisk
```

:::info
`mount`是用在系統啟動後才要掛載的時候，才用這指令
如果想在每次系統啟動時就自動掛載，則可以將相關設定加入`/etc/fstab`檔案中
:::

老師在示範新增新硬碟、切割、格式化的時候，老師用的掛載是以下指令：

```bash!
$ mount -t ext3 /dev/hdb1 /home1
```

:::info
Q1：
我前面已經用了`mke2fs -j /dev/hdb1`這個指令，為什麼這個`mount`指令還要指定是`ext3`？以及`-t`是什麼意思？

Ans：
當你使用`mount`指令掛載分割區時，需要指定分割區的檔案系統類型。在這種情況下，你已經使用`mke2fs -j /dev/hdb1`創建了ext3檔案系統，因此在`mount`指令中指定`-t ext3`表示你要將`/dev/hdb1`分割區掛載為ext3檔案系統。

`-t`參數用於指定要掛載的分割區的檔案系統類型。它告訴`mount`指令要使用哪種檔案系統驅動程式來解析和存取該分割區的內容。在這個情況下，`-t ext3`告訴`mount`指令使用ext3檔案系統的驅動程式。

總結起來，`mount -t ext3 /dev/hdb1 /home1`指令的作用是將 `/dev/hdb1`分割區掛載到`/home1`目錄下，並使用ext3檔案系統進行存取。

Q2：
如果我的`mount`指令只有`mount /dev/hdb1 /home1`，而沒有`-t ext3`，這樣會出錯嗎？

Ans：
如果你在`mount`指令中沒有指定檔案系統類型（例如`-t ext3`），系統將會嘗試自動檢測並使用適合的檔案系統類型。在大多數情況下，這種自動檢測是有效的，並且能夠正確識別分割區的檔案系統類型。

因此，如果你使用`mount /dev/hdb1 /home1`命令而沒有指定`-t ext3`，並且`/dev/hdb1`確實是 ext3 檔案系統，那麼系統通常能夠自動檢測並採用正確的檔案系統類型。這種情況下，你的命令應該能夠成功執行。

但是，為了確保正確性和明確性，建議在`mount`指令中指定適當的檔案系統類型，尤其是在不確定分割區檔案系統類型時。這樣可以避免潛在的問題並確保正確的掛載。
:::

### DEMO

### DEMO-插入USB隨身碟，查看device資訊

插入USB隨身碟，會顯示以下畫面，可以看到是`sdb`：
![](https://hackmd.io/_uploads/HJlPbOirn.png)

另外也可以用`fdisk -l`來查看USB隨身碟device資訊：
![](https://hackmd.io/_uploads/By6xfdorh.png)
<!-- ![](https://hackmd.io/_uploads/ry4-Pxor2.png) -->

也可以用`dmesg | tail`來查看：
![](https://hackmd.io/_uploads/HkE8DljSh.png)

### DEMO-Partition

知道是在`/dev/sdb`後，接下來就可以開始partition，輸入`fdisk /dev/sdb`：
![](https://hackmd.io/_uploads/HJIIz_jrh.png)

以下是依老師示範的順序輸入：
```bash!
# 先輸入d
Command (m for help): d

# 再輸入n，然後輸入p (primary partition)，再輸入1 (partition number)
# First cylinder和Last cylinder都直接按enter，會直接帶入default value
Command (m for help): n
> p
Partition number (1-4): 1

# 輸入p，顯示當前分割區表。這會列出目前硬碟上的所有分割區
Command (m for help): p
```
![](https://hackmd.io/_uploads/r1DKfuoS2.png)

最後輸入`w`，寫入並退出：
![](https://hackmd.io/_uploads/SJJ2zdoSn.png)

### DEMO-Format

用`mke2fs -j /dev/sdb1`格式化，這裡會花比較多時間
![](https://hackmd.io/_uploads/Syk-7_iH3.png)

格式化完畢
![](https://hackmd.io/_uploads/Hk894_sS2.png)

### DEMO-Mount

用以下指令將設備掛載：
```bash!
$ mount -t ext3 /dev/sdb1 /mnt/usb
```
![](https://hackmd.io/_uploads/BJmxHuiBh.png)

用`df`檢查，確認有掛載上去：
![](https://hackmd.io/_uploads/Hyp0L_jHn.png)

### DEMO-設定開機自動掛載

先用`blkid`查詢UUID，也可以用`blkid /dev/sdb1`查詢UUID，此外，這指令也可以知道file system type
![](https://hackmd.io/_uploads/rkYpduiBn.png)

編輯`/etc/fstab`
![](https://hackmd.io/_uploads/r1d0o_oH2.png)

重開機後就可以看到有掛載的訊息了
![](https://hackmd.io/_uploads/rkvms_orh.png)

用`df`檢查可以看到有掛載
![](https://hackmd.io/_uploads/B1-Pouorn.png)

### DEMO-設定系統排程自動掛載、備份、卸載

去`/etc/crontab`內做系統排程輸入以下訊息：
```bash!
13 13 * * * root mount /dev/sdb1 /mnt/usb
# 13:13時，root執行這個掛載的指令

14 13 * * * root tar czvf /mnt/usb/backup.tar.gz /root/Documents/*
# 13:14時，root將/root/Documents內的東西打包壓縮到/mnt/usb內

15 13 * * * root umount /mnt/usb
# 13:15時，root將/mnt/usb卸載
```

`/etc/fstab`的內容：
![](https://hackmd.io/_uploads/r1zyWtsrn.png)

時間到了之後就看到有掛載的訊息自動出現，用`df`也可以確認有掛載：
![](https://hackmd.io/_uploads/Sk9IkKsS3.png)

時間到了之後用`df`檢查就發現已經卸載了：
![](https://hackmd.io/_uploads/BkEfgKjH2.png)

去檢查確認真的有備份的檔案：
![](https://hackmd.io/_uploads/B1wjeKsr2.png)

:::danger
Linux第二個考試的重點：
- 怎麼新增使用者
- 怎麼維護群組內的使用者
- 怎麼assign user quota和group quota
- 怎麼建立schedule去備份file
- 備份file的話要mount media device, ex. flash memory
:::

:::info
In Linux, the device names for hard drives typically follow the following pattern:
- `/dev/sda`: Represents the first hard drive
- `/dev/sdb`: Represents the second hard drive
- `/dev/sdc`: Represents the third hard drive
...

When you create a new partition on `/dev/sdb`, it will be identified as`/dev/sdb1`, indicating the first partition of the `sdb` device. Similarly, if you create a second partition, it will be identified as`/dev/sdb2`, and so on.

This is because in Linux, the hard drive devices (such as `/dev/sdb`) and their partitions (such as `/dev/sdb1`) are separate entities. Partitions are logical subdivisions of a physical hard drive used for organizing and managing data. Therefore, each partition is assigned a unique identifier for recognition and access within the operating system.

Please note that this naming convention is specific to Linux, and different operating systems may have different naming conventions.
:::

## Short Summary (`/etc/`內的設定檔)

老師這次有提到的`/etc/`內的設定檔：
- `inittab`：設定是否要GUI mode或text mode
- `passwd`：使用者資訊，包含UID、GID、home directory, etc
- `shadow`：使用者密碼相關設定檔
- `group`：群組的相關資訊
- `fstab`：可以設定外接式裝置在開機時自動掛載，或者設定哪些partition要做disk space management
- `crontab`：設定系統的排程，必須指定哪些使用者執行這些工作

## 其他補充(跟課程內容無關)

### 關機的指令
```bash!
$ sudo shutdown now
```

### 檢查目前在哪個tty

若要查看自己在哪個tty，可使用以下三個指令：`tty`、`w`、`who`

![](https://hackmd.io/_uploads/HJjaF3hE3.png)

### 為什麼要Partition

分割硬碟成多個區域（分割）的主要目的是在單個硬碟上建立多個獨立的區域，以便可以將不同的檔案系統、資料或作業系統安裝在不同的區域中。下面是一些分割硬碟的主要原因：

1. 資料管理和組織： 分割硬碟使您能夠組織和管理不同類型的資料。例如，您可以將系統檔案系統放在一個分割中，用於作業系統和程式檔案，並將用於資料儲存的分割保留給用戶檔案。
2. 多重作業系統： 分割硬碟可讓您在同一台電腦上安裝和運行多個作業系統。每個作業系統可以位於不同的分割上，以實現獨立的作業系統環境。
3. 性能和安全性： 分割硬碟可以提供更好的性能和安全性。例如，您可以將根檔案系統（/）和系統檔案分割放在較小但較快的硬碟區域中，將用於資料儲存的分割放在較大的硬碟區域中。此外，分割硬碟也可以提供更好的故障隔離，如果某個區域損壞，其他區域仍然可用。
4. 方便備份和重建： 分割硬碟可以使備份和重建更加方便。您可以針對不同的分割進行備份，這樣在需要恢復時，您只需恢復特定的分割而不是整個硬碟。
5. 容量利用： 分割硬碟可以根據需要分配和利用可用的儲存容量。如果您有一個大容量硬碟，但只需使用一部分容量，您可以將其分割並僅使用需要的部分。

### Patition & File System

此外，我們也可以在不同的partition上使用不同的檔案系統。檔案系統是用於組織和儲存資料的方法，並且不同的檔案系統具有不同的功能和特性。Linux 中常見的檔案系統包括 ext4、ext3、ext2、XFS、Btrfs 等，而 Windows 系統則常使用 NTFS 或 FAT 檔案系統。

透過將硬碟分割為不同的區域，您可以選擇在每個區域上使用不同的檔案系統。例如，您可以在一個分割上使用 ext4 檔案系統作為 Linux 的根檔案系統，同時在另一個分割上使用 NTFS 檔案系統，以便在同一台電腦上使用 Windows。

請注意，當您在分割上使用不同的檔案系統時，需要確保您的作業系統支援相應的檔案系統。此外，跨平台存取不同檔案系統可能需要額外的驅動程式或套件支援。

### Partition Type

![](https://hackmd.io/_uploads/Hyegjakr3.png)

https://linux.vbird.org/linux_basic/centos7/0130designlinux.php