Linux磁盤管理
I/O Ports: I/O裝置位址;
一切皆檔案:
open(), read(), write(), close()
塊裝置:block,存取機關“塊”,磁盤
字元裝置:char,存取機關“字元”,鍵盤
裝置檔案:關聯至一個裝置驅動程式,進而能夠跟與之對應硬體裝置進行通信;
裝置号碼:
主裝置号:major number, 辨別裝置類型
次裝置号:minor number, 辨別同一類型下的不同裝置
硬碟接口類型:
并行:
IDE:133MB/s
SCSI:640MB/s
序列槽:
SATA:6Gbps
SAS:6Gbps
USB:480MB/s
rpm: rotations per minute
/dev/DEV_FILE
磁盤裝置的裝置檔案命名:
IDE: /dev/hd
SCSI, SATA, SAS, USB: /dev/sd
不同裝置:a-z
/dev/sda, /dev/sdb, ...
同一裝置上的不同分區:1,2, ...
/dev/sda1, /dev/sda5
機械式硬碟:
track:磁道
cylinder: 柱面
secotr: 扇區
512bytes
如何分區:
按柱面
0磁道0扇區:512bytes
MBR: Master Boot Record
446bytes: boot loader
64bytes:分區表
16bytes: 辨別一個分區
2bytes: 55AA
4個主分區;
3主分區+1擴充(N個邏輯分區)
邏輯分區
問題:UEFI, GPT?
分區管理工具:fdisk, parted, sfdisk
fdisk:對于一塊硬碟來講,最多隻能管理15分區;
# fdisk -l [-u] [device...]
# fdisk device
子指令:管理功能
p: print, 顯示已有分區;
n: new, 建立
d: delete, 删除
w: write, 寫入磁盤并退出
q: quit, 放棄更新并退出
m: 擷取幫助
l: 清單所分區id
t: 調整分區id
檢視核心是否已經識别新的分區:
# cat /proc/partations
通知核心重新讀取硬碟分區表:
partx -a /dev/DEVICE
-n M:N
kpartx -a /dev/DEVICE
-f: force
CentOS 5: 使用partprobe
partprobe [/dev/DEVICE]
Linux檔案系統管理:
Linux檔案系統: ext2, ext3, ext4, xfs, btrfs, reiserfs, jfs, swap
swap: 交換分區
CD光牒:iso9660
Windows:fat32, ntfs
Unix: FFS, UFS, JFS2
網絡檔案系統:NFS, CIFS
叢集檔案系統:GFS2, OCFS2
分布式檔案系統:ceph,
moosefs, mogilefs, GlusterFS, Lustre
根據其是否支援"journal"功能:
日志型檔案系統: ext3, ext4, xfs, ...
非日志型檔案系統: ext2, vfat
檔案系統的組成部分:
核心中的子產品:ext4, xfs, vfat
使用者空間的管理工具:mkfs.ext4, mkfs.xfs, mkfs.vfat
Linux的虛拟檔案系統:VFS
建立檔案系統:
mkfs指令:
(1) # mkfs.FS_TYPE /dev/DEVICE
ext4
xfs
btrfs
vfat
(2) # mkfs -t FS_TYPE /dev/DEVICE
-L 'LABEL': 設定卷标
mke2fs:ext系列檔案系統專用管理工具
-t {ext2|ext3|ext4}
-b {1024|2048|4096}
-L 'LABEL'
-j: 相當于 -t ext3
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i #: 為資料空間中每多少個位元組建立一個inode;此大小不應該小于block的大小;
-N #:為資料空間建立個多少個inode;
-m #: 為管理人員預留的空間占據的百分比;
-O FEATURE[,...]:啟用指定特性
-O ^FEATURE:關閉指定特性
mkswap:建立交換分區
mkswap [options] device
-L 'LABEL'
前提:調整其分區的ID為82;
其它常用工具:
blkid:塊裝置屬性資訊檢視
blkid [OPTION]... [DEVICE]
-U UUID: 根據指定的UUID來查找對應的裝置
-L LABEL:根據指定的LABEL來查找對應的裝置
e2label:管理ext系列檔案系統的LABEL
# e2label DEVICE [LABEL]
tune2fs:重新設定ext系列檔案系統可調整參數的值
-l:檢視指定檔案系統超級塊資訊;super block
-L 'LABEL':修改卷标
-m #:修預留給管理者的空間百分比
-j: 将ext2更新為ext3
-O: 檔案系統屬性啟用或禁用
-o: 調整檔案系統的預設挂載選項
-U UUID: 修改UUID号;
dumpe2fs:
-h:檢視超級塊資訊
檔案系統檢測:
fsck: File System CheCk
fsck.FS_TYPE
fsck -t FS_TYPE
-a: 自動修複錯誤
-r: 互動式修複錯誤
Note: FS_TYPE一定要與分區上已經檔案類型相同;
e2fsck:ext系列檔案專用的檢測修複工具
-y:自動回答為yes;
-f:強制修複;
vfs: xfs, ext{2|3|4}, btrfs
檔案系統管理:
将額外檔案系統與根檔案系統某現存的目錄建立起關聯關系,進而使得此目錄做為其它檔案通路入口的行為稱之為挂載;
解除此關聯關系的過程稱之為解除安裝;
把裝置關聯挂載點:Mount Point
mount
解除安裝時:可使用裝置,也可以使用挂載點
umount
注意:挂載點下原有檔案在挂載完成後會被臨時隐藏;
挂載方法:mount DEVICE MOUNT_POINT
mount:通過檢視/etc/mtab檔案顯示目前系統已挂載的所有裝置
mount [-fnrsvw] [-t vfstype] [-o options] device dir
device:指明要挂載的裝置;
(1) 裝置檔案:例如/dev/sda5
(2) 卷标:-L 'LABEL', 例如 -L 'MYDATA'
(3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 僞檔案系統名稱:proc, sysfs, devtmpfs, configfs
dir:挂載點
事先存在;建議使用空目錄;
程序正在使用中的裝置無法被解除安裝;
常用指令選項:
-t vsftype:指定要挂載的裝置上的檔案系統類型;
-r: readonly,隻讀挂載;
-w: read and write, 讀寫挂載;
-n: 不更新/etc/mtab;
-a:自動挂載所有支援自動挂載的裝置;(定義在了/etc/fstab檔案中,且挂載選項中有“自動挂載”功能)
-L 'LABEL': 以卷标指定挂載裝置;
-U 'UUID': 以UUID指定要挂載的裝置;
-B, --bind: 綁定目錄到另一個目錄上;
注意:檢視核心追蹤到的已挂載的所有裝置:cat /proc/mounts
-o options:(挂載檔案系統的選項)
async:異步模式;
sync:同步模式;
atime/noatime:包含目錄和檔案;
diratime/nodiratime:目錄的通路時間戳
auto/noauto:是否支援自動挂載
exec/noexec:是否支援将檔案系統上應用程式運作為程序
dev/nodev:是否支援在此檔案系統上使用裝置檔案;
suid/nosuid:
remount:重新挂載
ro:
rw:
user/nouser:是否允許普通使用者挂載此裝置
acl:啟用此檔案系統上的acl功能
注意:上述選項可多個同時使用,彼此使用逗号分隔;
預設挂載選項:defaults
rw, suid, dev, exec, auto, nouser, and async
解除安裝指令:
# umount DEVICE
# umount MOUNT_POINT
檢視正在通路指定檔案系統的程序:
# fuser -v MOUNT_POINT
終止所有在正通路指定的檔案系統的程序:
# fuser -km MOUNT_POINT
挂載交換分區:
啟用:swapon
swapon [OPTION]... [DEVICE]
-a:激活所有的交換分區;
-p PRIORITY:指定優先級;
禁用:swapoff [OPTION]... [DEVICE]
記憶體空間使用狀态:
free [OPTION]
-m: 以MB為機關
-g: 以GB為機關
檔案系統空間占用等資訊的檢視工具:
df:
-h: human-readable
-i:inodes instead of blocks
-P: 以Posix相容的格式輸出;
檢視某目錄總體空間占用狀态:
du:
du [OPTION]... DIR
-h: human-readable
-s: summary
指令總結:mount, umount, free, df, du, swapon, swapoff, fuser
檔案挂載的配置檔案:/etc/fstab
每行定義一個要挂載的檔案系統;
要挂載的裝置或僞檔案系統 挂載點 檔案系統類型 挂載選項 轉儲頻率 自檢次序
要挂載的裝置或僞檔案系統:
裝置檔案、LABEL(LABEL="")、UUID(UUID="")、僞檔案系統名稱(proc, sysfs)
挂載選項:
defaults
轉儲頻率:
0:不做備份
1:每天轉儲
2:每隔一天轉儲
自檢次序:
0:不自檢
1:首先自檢;一般隻有rootfs才用1;
...
檔案系統上的其它概念:
Inode: Index Node, 索引節點
位址指針:
直接指針:
間接指針:
三級指針:
inode bitmap:對位辨別每個inode空閑與否的狀态資訊;
連結檔案:
硬連結:
不能夠對目錄進行;
不能跨分區進行;
指向同一個inode的多個不同路徑;建立檔案的硬連結即為為inode建立新的引用路徑,是以會增加其引用計數;
符号連結:
可以對目錄進行;
可以跨分區;
指向的是另一個檔案的路徑;其大小為指向的路徑字元串的長度;不增加或減少目标檔案inode的引用計數;
ln [-sv] SRC DEST
-s:symbolic link
-v: verbose
檔案管理操作對檔案的影響:
檔案删除:
檔案複制:
檔案移動:
練習:
1、建立一個20G的檔案系統,塊大小為2048,檔案系統ext4,卷标為TEST,要求此分區開機後自動挂載至/testing目錄,且預設有acl挂載選項;
(1) 建立20G分區;
(2) 格式化:
mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE
(3) 編輯/etc/fstab檔案
LABEL='TEST' /testing ext4 defaults,acl 0 0
2、建立一個5G的檔案系統,卷标HUGE,要求此分區開機自動挂載至/mogdata目錄,檔案系統類型為ext3;
3、寫一個腳本,完成如下功能:
(1) 列出目前系統識别到的所有磁盤裝置;
(2) 如磁盤數量為1,則顯示其空間使用資訊;
否則,則顯示最後一個磁盤上的空間使用資訊;
if [ $disks -eq 1 ]; then
fdisk -l /dev/[hs]da
else
fdisk -l $(fdisk -l /dev/[sh]d[a-z] | grep -o "^Disk /dev/[sh]d[a-]" | tail -1 | cut -d' ' -f2)
fi
RAID:
Redundant Arrays of Inexpensive Disks
Independent
Berkeley: A case for Redundent Arrays of Inexpensive Disks RAID
提高IO能力:
磁盤并行讀寫;
提高耐用性;
磁盤備援來實作
級别:多塊磁盤組織在一起的工作方式有所不同;
RAID實作的方式:
外接式磁盤陣列:通過擴充卡提供适配能力
内接式RAID:主機闆內建RAID控制器
Software RAID:
級别:level
RAID-0:0, 條帶卷,strip;
RAID-1: 1, 鏡像卷,mirror;
RAID-2
..
RAID-5:
RAID-6
RAID10
RAID01
RAID-0:
讀、寫性能提升;
可用空間:N*min(S1,S2,...)
無容錯能力
最少磁盤數:2, 2+
RAID-1:
讀性能提升、寫性能略有下降;
可用空間:1*min(S1,S2,...)
有備援能力
RAID-4:
1101, 0110, 1011
讀、寫性能提升
可用空間:(N-1)*min(S1,S2,...)
有容錯能力:1塊磁盤
最少磁盤數:3, 3+
RAID-6:
可用空間:(N-2)*min(S1,S2,...)
有容錯能力:2塊磁盤
最少磁盤數:4, 4+
混合類型
RAID-10:
讀、寫性能提升
可用空間:N*min(S1,S2,...)/2
有容錯能力:每組鏡像最多隻能壞一塊;
最少磁盤數:4, 4+
RAID-01:
RAID-50、RAID7
JBOD:Just a Bunch Of Disks
功能:将多塊磁盤的空間合并一個大的連續空間使用;
可用空間:sum(S1,S2,...)
常用級别:RAID-0, RAID-1, RAID-5, RAID-10, RAID-50, JBOD
實作方式:
硬體實作方式
軟體實作方式
CentOS 6上的軟體RAID的實作:
結合核心中的md(multi devices)
mdadm:模式化的工具
指令的文法格式:mdadm [mode] <raiddevice> [options] <component-devices>
支援的RAID級别:LINEAR, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10;
模式:
建立:-C
裝配: -A
監控: -F
管理:-f, -r, -a
<raiddevice>: /dev/md#
<component-devices>: 任意塊裝置
-C: 建立模式
-n #: 使用#個塊裝置來建立此RAID;
-l #:指明要建立的RAID的級别;
-a {yes|no}:自動建立目标RAID裝置的裝置檔案;
-c CHUNK_SIZE: 指明塊大小;
-x #: 指明空閑盤的個數;
例如:建立一個10G可用空間的RAID5;
-D:顯示raid的詳細資訊;
mdadm -D /dev/md#
管理模式:
-f: 标記指定磁盤為損壞;
-a: 添加磁盤
-r: 移除磁盤
觀察md的狀态:
cat /proc/mdstat
停止md裝置:
mdadm -S /dev/md#
watch指令:
-n #: 重新整理間隔,機關是秒;
watch -n# 'COMMAND'
練習1:建立一個可用空間為10G的RAID1裝置,要求其chunk大小為128k,檔案系統為ext4,有一個空閑盤,開機可自動挂載至/backup目錄;
練習2:建立一個可用空間為10G的RAID10裝置,要求其chunk大小為256k,檔案系統為ext4,開機可自動挂載至/mydata目錄;
部落格作業:raid各級别特性;
LVM2:
LVM: Logical Volume Manager, Version: 2
dm: device mapper,将一個或多個底層塊裝置組織成一個邏輯裝置的子產品;
/dev/dm-#
/dev/mapper/VG_NAME-LV_NAME
/dev/mapper/vol0-root
/dev/VG_NAME/LV_NAME
/dev/vol0/root
pv管理工具:
pvs:簡要pv資訊顯示
pvdisplay:顯示pv的詳細資訊
pvcreate /dev/DEVICE: 建立pv
vg管理工具:
vgs
vgdisplay
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
先做pvmove
vgremove
lv管理工具:
lvs
lvdisplay
lvcreate -L #[mMgGtT] -n NAME VolumeGroup
lvremove /dev/VG_NAME/LV_NAME
擴充邏輯卷:
# lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
# resize2fs /dev/VG_NAME/LV_NAME
縮減邏輯卷:
# umount /dev/VG_NAME/LV_NAME
# e2fsck -f /dev/VG_NAME/LV_NAME
# resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
# lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
# mount
快照:snapshot
lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name
練習1:建立一個至少有兩個PV組成的大小為20G的名為testvg的VG;要求PE大小為16MB, 而後在卷組中建立大小為5G的邏輯卷testlv;挂載至/users目錄;
練習2: 建立使用者archlinux,要求其家目錄為/users/archlinux,而後su切換至archlinux使用者,複制/etc/pam.d目錄至自己的家目錄;
練習3:擴充testlv至7G,要求archlinux使用者的檔案不能丢失;
練習4:收縮testlv至3G,要求archlinux使用者的檔案不能丢失;
練習5:對testlv建立快照,并嘗試基于快照備份資料,驗正快照的功能;
檔案系統挂載使用:
挂載CD光牒裝置:
CD光牒裝置檔案:
IDE: /dev/hdc
SATA: /dev/sr0
符号連結檔案:
/dev/cdrom
/dev/cdrw
/dev/dvd
/dev/dvdrw
mount -r /dev/cdrom /media/cdrom
umount /dev/cdrom
dd指令:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 複制單元大小;
count=#:複制多少個bs;
磁盤拷貝:
dd if=/dev/sda of=/dev/sdb
備份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破壞MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=256 count=1
兩個特殊裝置:
/dev/null: 資料黑洞;
/dev/zero:吐零機;
部落格作業:lvm基本應用,擴充及縮減實作;
回顧:lvm2, dd
lvm: 邊界動态擴充或收縮;快照;
pv --> vg --> lv
PE:
LE:
dd: 複制
btrfs檔案系統:
技術預覽版
Btrfs (B-tree, Butter FS, Better FS), GPL, Oracle, 2007, CoW;
ext3/ext4, xfs
核心特性:
多實體卷支援:btrfs可由多個底層實體卷組成;支援RAID,以聯機“添加”、“移除”,“修改”;
寫時複制更新機制(CoW):複制、更新及替換指針,而非“就地”更新;
資料及中繼資料校驗碼:checksum
子卷:sub_volume
快照:支援快照的快照;
透明壓縮:
檔案系統建立:
mkfs.btrfs
-d <type>: raid0, raid1, raid5, raid6, raid10, single
-m <profile>: raid0, raid1, raid5, raid6, raid10, single, dup
-O <feature>
-O list-all: 列出支援的所有feature;
屬性檢視:
btrfs filesystem show
挂載檔案系統:
mount -t btrfs /dev/sdb MOUNT_POINT
透明壓縮機制:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT