1. 磁盤分區
硬盤邏輯上被划分成塊、磁道、磁柱和分區
- 塊:是盤片上尋址(訪問)的最小單位,一個塊可以存儲一定字節的數據
- 磁道:是一系列頭尾相連的塊租場的圓圈
- 磁柱:是由一疊磁道,由在相同半徑上每個盤面的磁道所組成
虛擬機添加虛擬硬盤:
設置 —— 選擇硬盤 —— 添加 —— 創建一個新的虛擬磁盤 —— 磁盤類型 SCSI —— 一直下一步即可
硬盤分區可分為主分區、拓展分區和邏輯分區,一個硬盤最多划分出 4 個主分區,一個 block 等於 8 * 512 b
每個硬盤上支持分區的數量有一點限制:
- SCSI 硬盤:最多 15 個
- IDE 硬盤:63 個
各種設備在 Linux 中的文件名:
設備 | 設備在Linux中的文件名 |
---|---|
IDE 硬盤 | /dev/hd[a-d] |
SCSI 硬盤 | /dev/sd[a-p] |
U 盤 | /dev/sd[a-p] 與 SCSI 硬盤一樣 |
CDROM | /dev/sr0 |
[root@hj ~]# ls /dev/sd # tab 鍵
sda sda1 sda2 sda3 sda4 sda5 sdb
[root@hj ~]# fdisk -l /dev/sdb # 查看硬盤 sdb
Disk /dev/sdb: 21.5 GB, 21474836480 bytes # 硬盤名、硬盤大小
255 heads, 63 sectors/track, 2610 cylinders # 磁頭、扇區、柱面
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes # 扇區大小(邏輯/物理都是 512 b)
I/O size (minimum/optimal): 512 bytes / 512 bytes # 讀/取(最小/優化)
Disk identifier: 0x00000000
1.1 fdisk 命令
管理磁盤分區
語法:
fdisk [磁盤名稱]
參數 | 作用 |
---|---|
m | 查看全部可用的參數 |
n | 添加新的分區 |
d | 刪除某個分區信息 |
l | 列出所有可用的分區類型 |
t | 改變某個分區的類型 |
p | 查看分區信息 |
w | 保存並退出 |
q | 不保存直接退出 |
示例:
首先輸入命令 fdisk /dev/sdb
,嘗試管理硬盤 sdb,看到提示信息,提示輸入 m 獲得幫助:
[root@hj ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x2707982c.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
輸入 n 創建一個新的分區,系統會提示你是輸入 p 創建主分區,還是 e 創建拓展分區,這里輸入 p 來創建一個主分區:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
在輸入 p 確定創建一個主分區后,系統要求確定分區編號(范圍 1 ~ 4),以及扇區的大小,在這里直接輸入大小即可(如 + 5G):
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G
創建分區成功后,輸入 p 查看分區,輸入 w 保存退出:
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x98527a04
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
1.2 partprobe 命令
重新初始化內存中內核的分區表(手動將分區信息同步到內核,建議輸入兩次),最后輸入 partprobe 更新分區列表:
[root@hj ~]# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (設備或資源忙). As a result, it may not reflect all of your changes until after reboot.
Warning: 無法以讀寫方式打開 /dev/sr0 (只讀文件系統)。/dev/sr0 已按照只讀方式打開。
Warning: 無法以讀寫方式打開 /dev/sr0 (只讀文件系統)。/dev/sr0 已按照只讀方式打開。
Error: 無效的分區表 - /dev/sr0 出現遞歸分區。
[root@hj ~]# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (設備或資源忙). As a result, it may not reflect all of your changes until after reboot.
Warning: 無法以讀寫方式打開 /dev/sr0 (只讀文件系統)。/dev/sr0 已按照只讀方式打開。
Warning: 無法以讀寫方式打開 /dev/sr0 (只讀文件系統)。/dev/sr0 已按照只讀方式打開。
Error: 無效的分區表 - /dev/sr0 出現遞歸分區。
分區類型
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
/dev/sdb2 655 1308 5253255 83 Linux
/dev/sdb3 1309 1962 5253255 83 Linux
/dev/sdb4 1963 2610 5205060 5 Extended
/dev/sdb5 1963 2094 1060258+ 83 Linux
/dev/sdb6 2095 2356 2104483+ 83 Linux
主分區加拓展分區最多四個分區,拓展分區不能寫入數據,只能包含邏輯分區,后面的邏輯分區是在拓展分區上拓展的。
- 主分區:最多只能有 4 個分區
- 拓展分區:
- 最多只能有1個
- 主分區加拓展分區最多有4個
- 不能寫入數據,只能包含邏輯分區
- 邏輯分區
總結:創建分區流程:fdisk /dev/sdx —— 創建分區(n)—— 分區類型(p/n) —— 分區編號(1 ~ 4)—— 分區大小(+xG)—— 保存退出(w)—— 更新分區列表(partprobe)
2. 格式化與掛載分區
上述創建硬盤分區后,還不能立即使用,還需要創建文件系統,即格式化
格式化就是將分區中的硬盤空間划分成大小相等的一些數據塊(Block),以及設定這個分區中多少個 i 節點可以使用等。
文件系統是操作系統用於明確磁盤或分區上的文件的方法和數據結構,即在磁盤上組織文件的方法,常見的文件系統類型:
文件系統類型 | 說明 | 系統 |
---|---|---|
ext2 | Linux 系統中標准的文件系統 | Linux |
ext3 | 一種日志式文件系統 | Linux |
ext4 | 一種針對 ext3 系統的擴展日志式文件系統 | Linux |
lvm | 邏輯盤卷管理 | Linux |
iso9660 | 目前唯一的通用的光盤文件系統 | Linux/Winows |
NTFS | Windows 上的一種文件系統 | Windows |
2.1 mkfs 命令
mkfs(make filesystem)格式化磁盤,拓展分區不能格式化
語法:
mkfs.文件系統 分區
mkfs.ext4 /dev/sdb1
2.2 mount 命令
mount 命令將存儲設備與掛載點進行關聯(即將磁盤上的分區與掛載點直接的映射)
掛載是分配盤符的過程,掛載點相當於盤符,具體步驟如下:
首先創建一個掛載設備的掛載點目錄,然后使用 mount 命令將存儲設備與掛載點進行關聯
mount 磁盤分區 掛載點目錄
mount /dev/sdb1 /sdb1 # 把磁盤 sdb 的第一個分區掛載到 /sdb1 目錄下
示例:
[root@hj ~]# mkdir /sdb/sdb1 # 創建一個掛載目錄
[root@hj ~]# mount /dev/sdb1 /sdb/sdb1 # 將 sdb1 掛載到 /sdb/sdb1
2.3 df 命令
查看掛載狀態和硬盤使用量信息
語法:
df
-a # 顯示所有磁盤
-h # 單位轉換,也可用於查看硬盤/分區使用情況
-T # 查看已掛載的的分區和文件系統類型
-i # 查看 i 結點
mount # 也可以使用 mount 命令查看具體的掛載參數
[root@hj ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 24G 3.8G 19G 17% /
tmpfs 1002M 80K 1002M 1% /dev/shm
/dev/sda1 477M 39M 413M 9% /boot
/dev/sda3 1.9G 3.1M 1.8G 1% /home
/dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final
/dev/sdb1 4.9G 11M 4.6G 1% /sdb/sdb1
/dev/sdb2 4.9G 11M 4.6G 1% /sdb/sdb2
/dev/sdb3 4.9G 11M 4.6G 1% /sdb/sdb3
/dev/sdb5 988M 1.3M 935M 1% /sdb/sdb5
/dev/sdb6 2.0G 3.1M 1.9G 1% /sdb/sdb6
2.4 du 命令
du 命令用於查看文件數據占用量
語法:
du [選項] [文件]
du -sh /newFS/ # 查看 newFS目錄下所有文件的大小
du -sh /* # 查看根目錄下所有一級目錄分別占用空間大小
2.5 總結
磁盤從分區,到最后能使用總共分為四步,其步驟如下:
- 創建分區:
fdisk /dev/sdb
- 更新分區表:
partprobe
- 格式化制作文件系統:
mkfs.ext4 /dev/sdb{1..3}
- 掛載:
mount /dev/sdb1 /sdb/sdb1
3. 文件系統的掛載與卸載
ext2/3/4 是日志文件系統,其過程是在寫入文件內容時,首先寫入到日志中,再由日志存儲到硬盤中,這樣有利於后期的查看設備運行情況。
ext 文件系統的缺點是僅適用於存儲量比較小的情況,對現在的大量數據情況並不適用,目前比較流行且適用海量數據的文件系統是 xfs
3.1 掛載
掛載是指講一個設備(通常指存儲設備)掛接到一個已存在的目錄上,掛載命令 mount
同一個分區可以掛載到幾個目錄下,即可以有幾個掛載點,原分區下的文件刪除新建修改,掛載目錄下的文件也將被修改
# 幾個掛載點
mount /dev/sdb1 /test1
mount /dev/sdb1 /test2
mount /dev/sdb1 /test3
3.2 卸載
umount 命令實現文件系統的卸載
語法:
umount 掛載點(目錄)
-l # 強制卸載
umount /test1
首先將 sdb1 掛載到 /spt,然后新建一個文件 ddd,再卸載 /spt/,再查看 /spt 目錄會發現目錄下的文件 ddd 消失了,造成這種情況的原因是:
目錄只是相當於一個水管,是連接掛載設備與掛載目錄的 水管,如上面的例子,當卸載掉 /spt/ 目錄后,再新建文件到其目錄下,因為已經卸載掉 /spt 目錄與掛載設備 sdb1 的映射,所有文件被存儲到 /spt 目錄的上一級目錄根目錄的掛載設備上,即 sda5。
再將 /spt 與 sdb1 掛載,查看 /spt ,發現 ddd 又出現了。
這也叫造成了 ddd 被存儲到 sdb1中,a.txt 被存儲到 sda5 中(關於根目錄的掛載設備是哪個,可以使用 df -T查看)
[root@hj ~]# mkdir /spt
[root@hj ~]# mount /dev/sdb1 /spt/
[root@hj ~]# mkdir /spt/ddd
[root@hj ~]# ls /spt/
ddd lost+found
[root@hj ~]# umount /spt/
[root@hj ~]# touch /spt/a.txt
[root@hj ~]# ls /spt/
a.txt
[root@hj ~]# mount /dev/sdb1 /spt/
[root@hj ~]# ls /spt/
ddd lost+found
3.3 掛載后重啟失效問題
使用 mount 命令掛載分區后重啟就會失效,因為這個掛載是臨時的,需要修改配置文件 /etc/fstab
,在最下方添加掛載分區信息:
vim /etc/fstab
/dev/sdb1 /sdb/sdb1 ext4 defaults 0 0 # 分別為掛載設備 掛載點 文件系統類型 等
4. 磁盤用滿的兩種情況
4.1i 節點
每個文件在創建的時候,都會有一個 i 節點,里面存儲了文件的一些基本信息(如權限信息、創建日期、大小等),這些信息被稱為 —— 元數據。
inode ,i 節點是一個數據結構,存儲普通文件、目錄或其他文件的基本信息(如權限信息、創建日期、大小等)即元數據。
查看一個文件的 i 節點號:
[root@hj tmp]# ls -i test/1.txt
403954 test/1.txt # i 節點號
查看目錄 i 結點號:
ls -di test/ # 查看目錄的 i 的號
查看分區的 i 節點使用情況:
[root@hj tmp]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 1550400 103540 1446860 7% /
tmpfs 256285 5 256280 1% /dev/shm
/dev/sda1 128016 39 127977 1% /boot
/dev/sda3 128000 30 127970 1% /home
/dev/sr0 0 0 0 - /media/CentOS_6.8_Final
/dev/sdb1 328656 12 328644 1% /sdb/sdb1
/dev/sdb2 328656 11 328645 1% /sdb/sdb2
/dev/sdb3 328656 11 328645 1% /sdb/sdb3
/dev/sdb5 66384 11 66373 1% /sdb/sdb5
/dev/sdb6 131648 11 131637 1% /sdb/sdb6 # 總共可以存儲131648 個 i 節點,也就是 131648 個文件
4.2 磁盤存滿的兩種情況
磁盤用滿有兩種情況:
- 磁盤空間未滿,但是文件數目超出了限制,即 i 節點不夠用
- 磁盤空間滿
個人電腦很少出現 i 節點滿情況,服務器上比較多,主要是日志文件(access.log);當日志很大時就需要日志切割:
mv access.log access.log1 # 日志切割
長此以往,本地硬盤空間逐漸增大,就需要備份原來的日志文件,備份日志文件需要注意的是,首先要打包日志文件,再進行備份,以免出現 i 結點不夠的情況。
5. 文件系統
[root@hj tmp]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 24G 3.8G 19G 17% /
tmpfs 1002M 80K 1002M 1% /dev/shm
/dev/sda1 477M 39M 413M 9% /boot
/dev/sda3 1.9G 3.1M 1.8G 1% /home
/dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final
/dev/sdb1 4.9G 11M 4.6G 1% /sdb/sdb1
/dev/sdb2 4.9G 11M 4.6G 1% /sdb/sdb2
/dev/sdb3 4.9G 11M 4.6G 1% /sdb/sdb3
/dev/sdb5 988M 1.3M 935M 1% /sdb/sdb5
/dev/sdb6 2.0G 3.1M 1.9G 1% /sdb/sdb6
查看上面的分區容量使用情況發現,分區還未使用便已經有一定空間被使用(如/dev/sdb6 被使用 3.1M),這些被使用的空間存儲的是 文件系統信息
對每個分區來說,最小的存儲單位 block,一個 block = 8 * 512 b = 4 K
文件創建過程:
- super block:監控 i 節點狀態(活躍、忙碌),同時也要分配 i 節點
- inode block:inode 號,元數據
- directory block:目錄塊,存儲文件名和對應的 i 節點
當文件被創建時,首先找到的是其根目錄的 i 結點,再通過指針找到 directory block 中的文件 i 節點,如果沒有則新建,新建好之后再把數據存儲到相應位置。
刪除文件操作:
將文件的 i 節點通過 super block 標記為 free(活躍狀態)
5.1 ln 命令
ln 命令用於創建鏈接文件,其語法如下:
ln [選項] 源文件 鏈接文件
選項:
- -s:創建軟鏈接(不帶 s 則默認創建硬鏈接)
- -f:強制創建文件或目錄的鏈接
- -i:覆蓋前先詢問
- -v:顯示創建鏈接的過程
5.1 軟鏈接(symbolic link)
ln -s 源文件 鏈接文件 # 軟鏈接
示例:
[root@hj ~]# ln -s /a/source.txt /b/des.txt
[root@hj ~]# ll /b/des.txt
lrwxrwxrwx. 1 root root 13 10月 20 22:11 /b/des.txt -> /a/source.txt # l 表示為軟鏈接
[root@hj ~]# ls -i /a/source.txt # i 節點不同
1308106 /a/source.txt
[root@hj ~]# ls -i /b/des.txt
1308107 /b/des.txt
特點:
- 相當於 Windows 上的快捷方式
- 刪除鏈接文件,源文件無影響
- 刪除源文件,鏈接文件失效
- 修改源文件\鏈接文件,內容都將會改變
- i 節點不同
- 軟鏈接可以跨分區(因為它指向的是文件而非 inode,每個分區相同文件名是可以存在的
5.2 硬鏈接(hard link)
- i 節點相同
- ln 源路徑 目標路徑
- 刪除鏈接文件,源文件無影響
- 刪除源文件,鏈接文件無影響
- 修改源文件\鏈接文件,內容都將改變
- 硬鏈接不a可以跨分區,因為它指向的 inode 號,而不是 文件本身
- 【.】是當前目錄的硬鏈接,【..】是上一級目錄的硬鏈接
ln 源文件 鏈接文件