---
# System prepended metadata

title: Linux Disk  & File Systems Management

---

# Linux Disk  & File Systems Management


[TOC]


## ls (list)

### inode (Index Node)

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


類Linux Data Structure

Describing the file system object

包含文件或目錄的「元信息」

- file 
- socket 
- pipe
- directory 
- device

```
ls -i "filename"
```

可以查看 directory info 


# Simple File Systems Operation 

## df 

https://blog.gtwang.org/linux/linux-df-command-check-disk-space-usage-tutorial-script-example/

Superblock 會記錄 磁碟的整體資料
inode 記錄 各別檔案的容量


df 
-> Display the amount of disk space available on the file system each of the file name 
-> 列出檔案系統的整體磁碟使用量

Mounted on -> 掛載點

```
user@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           394M  6.2M  388M   2% /run
/dev/sda1        97G   37G   55G  40% /
tmpfs           2.0G  164K  2.0G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           394M   28K  394M   1% /run/user/1000

```

查看本地 Local Disk space  
```
[root@localhost dev]# df -l
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs         1914852       0   1914852   0% /dev
tmpfs            1930632       0   1930632   0% /dev/shm
tmpfs            1930632   12812   1917820   1% /run
tmpfs            1930632       0   1930632   0% /sys/fs/cgroup
/dev/sda3       79474776 6157424  73317352   8% /
/dev/sda1         303780  166916    136864  55% /boot
tmpfs             386128      20    386108   1% /run/user/1000
tmpfs             386128       0    386128   0% /run/user/0
/dev/sdb1       20960256   32992  20927264   1% /home/centos/xfs
```

Centos 7 file systems(xfs)

```
[centos@localhost scirpt]$ df -t xfs
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda3       79474776 5811968  73662808   8% /
/dev/sda1         303780  166916    136864  55% /boot

```

-t: type: File Systems


### 取出 Disk Name 跟 Disk space 
```
[centos@localhost scirpt]$ df -t xfs | awk '{print $1 " " $5 }'
Filesystem Use%
/dev/sda3 8%
/dev/sda1 55%

```

### 取出Disk Name

```
df -t xfs | awk '{print $1 " " $5 }' | awk '{ print $1}'
Filesystem
/dev/sda3
/dev/sda1

```

### 取出使用量
```
[root@localhost scirpt]# df -t xfs | awk '{print $1 " " $5 }' | awk '{ print $2}' | cut -d % -f 1
Use
8
55

```

-d, --delimiter 界定符
-f, --fields   第幾個欄位

### Script

```
#!/bin/sh
df -t xfs | tail -n +2 | awk '{ print $5 " " $1 }' | while read output;
do
  # 取出使用量（百分比）
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1  )

  # 檔案系統
  partition=$(echo $output | awk '{ print $2 }' )

  # 若用量大於 90% 則用 Email 發出警告訊息
  if [ $usep -ge 90 ]; then
    echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
      mail -s "Alert: Almost out of disk space $usep%" meowhecker@gmail.com
  fi
done
```
Script for Centos7 

定期檢Disk用量

## du

du 到檔案系統內去搜尋所有的檔案資料






列出目前目錄下的所有檔案容量


```
du 
```

```
[root@localhost etc]# du -h --max-depth 1 /home/centos/
0	/home/centos/.mozilla
3.8M	/home/centos/.cache
4.0K	/home/centos/.dbus
108K	/home/centos/.config

```

第一層 directory space 跟 File

```
[root@localhost etc]# du -h --max-depth 2 /home/centos/
0	/home/centos/.mozilla/extensions
0	/home/centos/.mozilla/plugins

```

第二層 directory

### 找佔用最大容量的次目錄

```
[root@localhost dev]# du -smh /*
0	/bin
148M	/boot
0	/dev
263M	/etc
4.3M	/home
0	/lib
0	/lib64
0	/media
0	/mnt
0	/opt
du: cannot access ‘/proc/4336/task/4336/fd/3’: No such file or directory
du: cannot access ‘/proc/4336/task/4336/fdinfo/3’: No such file or directory
du: cannot access ‘/proc/4336/fd/3’: No such file or directory
du: cannot access ‘/proc/4336/fdinfo/3’: No such file or directory
0	/proc
120K	/root
du: cannot access ‘/run/user/1000/gvfs’: Permission denied
13M	/run
0	/sbin
0	/srv
0	/sys
1.1M	/tmp
3.9G	/usr
1.7G	/var

```


## Hard Link & Symbol Link： ln


### Hard Link

#### SHow index number of the file 

ll = ls -l

ll -i -> inode(print index number of the each file) 

```
[root@localhost ~]# ll -i /etc/crontab
67675075 -rw-r--r--. 1 root root 451 Jun  9  2014 /etc/crontab

or 

[root@localhost ~]# ls -l -i /etc/crontab 
67675075 -rw-r--r--. 1 root root 451 Jun  9  2014 /etc/crontab
```
#### Create Hard LINk


我們能發現 兩個不同file 都指向 67675075 這個Index 
```
[root@localhost ~]# ln /etc/crontab .
[root@localhost ~]# ll -i /etc/crontab crontab 
67675075 -rw-r--r--. 2 root root 451 Jun  9  2014 crontab
67675075 -rw-r--r--. 2 root root 451 Jun  9  2014 /etc/crontab
```
![](https://hackmd.io/_uploads/BkK1X_sLh.png)
表示有2兩個file 指向他
![](https://hackmd.io/_uploads/rJCLxus83.png)

1 或 2 的目錄之 inode 指定的 block 找到兩個不同的檔名

不管使用哪個檔名均可以指到 real 那個 inode 去讀取到最終資料

如果你將任何一個『檔名』刪除，其實 inode 與 block 都還是存在

使用 hard link 設定連結檔時，磁碟的空間與 inode 的數目都不會改變 -> 只是block 關聯增加而已

### hard Link limited

-   不能跨 Filesystem；
-   不能 link 目錄。 (會有死結問題)

### Symbolic Link 

類似Windows 捷徑, 類似 pointer 

檔案會讓資料的讀取指向他 link 的那個檔案的檔名

當來源檔被刪除之後，symbolic link 的檔案會 開不了


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

```
[root@localhost ~]# ln -s /etc/crontab crontab2
[root@localhost ~]# ll -i /etc/crontab crontab2
137310340 lrwxrwxrwx  1 root root  12 Jun  5 07:48 crontab2 -> /etc/crontab
 67675075 -rw-r--r--. 2 root root 451 Jun  9  2014 /etc/crontab

```

Symbolic link 所建立的檔案為一個獨立的新的檔案，所以會佔用掉 inode 與 block 


# 磁碟的分割、格式化、檢驗與掛載

## 在VMware New 一個 Virtual Disk 

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

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

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

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

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

![](https://hackmd.io/_uploads/Sk-FoEiUn.png)

### dmesg 

dmesg 會將開機時的資訊顯示出來

Check Net virtual disk 在不在

sdb -> 為我們新增的SCSI 硬碟

```
[centos@localhost ~]$ dmesg | grep sdb
[    9.013114] sd 0:0:1:0: [sdb] 41943040 512-byte logical blocks: (21.4 GB/20.0 GiB)
[    9.013256] sd 0:0:1:0: [sdb] Write Protect is off
[    9.013260] sd 0:0:1:0: [sdb] Mode Sense: 61 00 00 00
[    9.013464] sd 0:0:1:0: [sdb] Cache data unavailable
[    9.013466] sd 0:0:1:0: [sdb] Assuming drive cache: write through
[    9.071108] sd 0:0:1:0: [sdb] Attached SCSI disk

```




## Disk Partition

### fdisk 


```
[root@localhost dev]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x9f7432da.

```


### Command Action 

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

p -> print partition table 



### New a partition 
```
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
Partition number (1-4, default 1): 
First sector (2048-41943039, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): 
Using default value 41943039
Partition 1 of type Linux and of size 20 GiB is set

```

### Write (save)
Action 
```
w
```

### quit 
```
q
```
quit

---


## Disk 格式化(建置檔案系統)

對割好的 Partition 進行File Systems 的格式化

### mkfs 

make file systems 

mkfs -t xfs == mkfs.xfs 

格式化 Partition 

e.g. /dev/sdb1

```
mdfs.xfs /dev/sdb1
or 
mdfs -t xfs /dve/sdb1
```

## 檔案系統掛載與卸載

### Notice:

- Mount point <----＞　file systems 通常是一對一 
- 要作為掛載點的目錄，理論上會是空目錄

如果 掛載點的目錄 有東西 會暫時處於 Hided status

在VM 新增一個虛擬DISK



掛載方式

### 檔名mount 
```
[root@study ~]# mount  UUID=''  掛載點  喔！
[root@study ~]# mount  裝置檔名  掛載點
```

```
[root@localhost dev]# mount ./sdb1 /home/centos/xfs/
```

### UUID mount (blkid )

blkid

可以用來找file systems UUID

```
[root@localhost dev]# blkid sdb1
sdb1: UUID="4bd1fc19-3dbc-4831-9eb9-749c7bc43726" TYPE="xfs" 


[root@localhost dev]# mount UUID='4bd1fc19-3dbc-4831-9eb9-749c7bc43726' /home/centos/xfs/
```

```
[root@localhost dev]# df -h /home/centos/xfs/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        20G   33M   20G   1% /home/centos/xfs

```


### 產生測試檔案
生出 666M 的 File 
```
[root@meowhecker mountdir]# dd if=/dev/zero of=666M bs=1M count=666
666+0 records in
666+0 records out

```


## 重新掛載根目錄

在單人維護時 / direcotry -> only Read 狀態

可以透過重新 mount 來改變root 權限

```
mount -o remount,rw,auto /
```

## 目錄與目錄的 mount 

```
[root@study ~]# mkdir /data/var
[root@study ~]# mount --bind /var /data/var
```

## umount

要退出 USB 與 Disk 這種 Storage Device 要先 umount

```
umoumt "跨載點"
```