1. 程式人生 > >Liunx磁盤存儲和文件系統

Liunx磁盤存儲和文件系統

兩種 數據 不可 kernel 足夠 保存 主分區 實現 硬盤分區

Liunx--總結

磁盤存儲和文件系統

磁盤存儲

機械硬盤:盤片,磁頭,盤片轉軸及控制電機,磁頭控制器,數據轉換器,接口,緩存等幾個部分組成
固態硬盤:用固態電子存儲芯片陣列而制成的硬盤,由控制單元和存儲單元(FLASH芯片、DRAM芯片)組成

一、硬盤存儲術語
head:磁頭
track:磁道
cylinder:柱面--同一磁道稱為柱
sector:扇區,512bytes

fdisk -l /dev/sd#--觀察硬盤指標

CHS用24bit位尋址
其中前10位表示cylinder柱面,中間8位表示head,後面6位表示sector 扇區
早期用chs方式尋址最大尋址空間8GB 512 2^6

2^8*2^10

LBA(logical block addressing)
?LBA是一個整數,通過轉換成CHS格式完成磁盤具體尋址
?ATA-1規範中定義了28位尋址模式,以每扇區512位組來計算,ATA-1所定義的28位LBA上限達到128 GiB。2002年ATA-6規範采用48位LBA,同樣以每扇區512位組計算容量上限可達128 Petabytes

二、磁盤兩種分區方式:MBR,GPT

MBR分區中一塊硬盤最多有4個主分區,也可以3主分區+1擴展(N個邏輯分區)
MBR分區結構
硬盤主引導記錄MBR由4個部分組成(0磁道0扇區512byte)
1.主引導程序(偏移地址0000H--0088H),它負責從活動分區中裝載,並運行系統引導程序

出錯信息數據區,偏移地址0089H--00E1H為出錯信息,00E2H--01BDH全為0字節
2.分區表(DPT,Disk|Partition|Table)含4個分區項,偏移地址01BEH--01FDH,每個分區表項長16個字節,共64字節為分區項1、分區項2、分區項3、分區項4
3.結束標誌字,偏移地址01FE--01FF的2個字節值為結束標誌55AA

GPT分區:GPT:GUID(Globals Unique Identifiers) partition|table(分區表)支持128個分區,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)

使用128位UUID(Universally Unique Identifier) 表示磁盤和分區,GPT分區表自動備份在頭和尾兩份,並有CRC校驗位

hexdump -C -n 512 /dev/sd#--查看硬盤前512字節
dd if=/dev/sda of=/data/mbr bs=1 count=64--dd備份分區表(分區表放在它處)

。。。分區工具
parted命令的操作都是實時生效的,小心使用
用法:parted [選項]... [設備 [命令 [參數]...]...]
parted /dev/sdb mklabel gpt|msdos--打標記然後進行分區gpt|msdos
parted -l 查看partition Table:gpt列出分區信息
parted /dev/sdb print打印分區信息
parted /dev/sdb mkpart primary 1 200 (默認M)--分區連續分區不要跳著分
parted /dev/sdb rm 1 刪除分區

fdisk mbr和gdisk gpt--命令格式基本相同不做贅述
fdisk /dev/sd# 交互式管理分區
p 分區列表
t 更改分區類型改id
n 創建新分區-p主(1-4)e擴展 默認1開始自設+2M\G\K
--分區需要註意連續分區,不要跳著分
d 刪除分區 對應分區數字 分區數字易改變
v 校驗分區
u 轉換單位
w 保存並退出 出去立馬執行才會更改
q 不保存並退出

。。分過區可能會出現內存中未加載新分區的信息
lsblk
ll /dev/sdb*
cat /proc/partitions--到這都是看內存中的硬盤信息
fdisk -l /dev/sd#--看到某硬盤的所有分區狀態
partprobe同步硬盤信息 entOS 5,7
。。。。
centos6 partx -a /dev/DEVICE 創建時同步
partx -d --nr 6-7 /dev/DEVICE 刪除時同步


文件系統

文件系統是操作系統用於明確存儲設備或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件結構稱為文件管理系統,簡稱文件系統

查看系統支持的文件系統:/lib/modules/uname –r/kernel/fs
各種文件系統:
https://en.wikipedia.org/wiki/Comparison_of_file_systems

ext4:是ext文件系統的最新版。提供了很多新的特性,包括納秒級時間戳、創建和使用巨型文件(16TB)、最大1EB的文件系統,以及速度的提升
xfs:SGI,支持最大8EB的文件系統
btrfs(Oracle), reiserfs, jfs(AIX), swap
光盤:iso9660
Windows:FAT32, exFAT,NTFS
Unix: FFS(fast), UFS(unix), JFS2
網絡文件系統:NFS, CIFS
集群文件系統:GFS2, OCFS2(oracle)
分布式文件系統: fastdfs,ceph, moosefs,mogilefs, glusterfs, Lustre
RAW:未經處理或者未經格式化產生的文件系統

lsblk -f 查看文件系統
一、創建文件系統命令 (下面命令兩兩一組,每組的選項基本通用)
mkfs命令
(1) mkfs.FS_TYPE /dev/DEVICE
ext4-xfs-btrfs-vfat
(2) mkfs -t FS_TYPE /dev/DEVICE
-L ‘LABEL‘ 設定卷標
-f 強制對已經存在xfs重裝
mkfs -b 設置快大小以快為單位
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
-I 一個inode記錄占用的磁盤空間大小,128---4096
-m # 默認5%,為管理人員預留空間占總空間的百分比
-O FEATURE[,...] 啟用指定特性
-O ^FEATURE 關閉指定特性

tune2fs 設定ext系列文本系統可調整參數的值
-l 查看指定文件系統超級塊信息;super block
-L ‘LABEL’ 修改卷標
-m # 修預留給管理員的空間百分比
-j 將ext2升級為ext3
-O 文件系統屬性啟用或禁用, –O ^has_journal
-o 調整文件系統的默認掛載選項,–o ^acl
-U UUID 修改UUID號
dumpe2fs:將磁盤塊分組管理
-h:查看超級塊信息,不顯示分組信息

文件系統檢測和修復:常發生於死機或者非正常關機之後
掛載為文件系統標記為“no clean”
註意:一定不要在掛載狀態下修復
fsck: File System Check--fsck /dev/sdb3 -y(自動回答)修復數據任然丟失
fsck.FS_TYPE
fsck -t FS_TYPE
-p 自動修復錯誤
-r 交互式修復錯誤
FS_TYPE 一定要與分區上已經文件類型相同
e2fsck:ext系列文件專用的檢測修復工具
-y 自動回答為yes
-f 強制修復
。。。
centos6 etx4 後續添加硬盤分區沒有acl權限
fdisk n e +100M
mkfs.etx4 /dev/sda6
tune2fs -l /de/sda6
掛載 進入磁盤設置acl權限
tune2fs -o acl /dev/sdb6 添加acl權限
tune2fs -o ^acl /dev/sdb6 去

文件系統標簽:指向設備的另一種方法-與設備無關
blkid [OPTION] [DEVICE]--塊設備屬性信息查看 -U UUID 根據指定的UUID來查找對應的設備
-L LABEL 根據指定的LABEL來查找對應的設備
e2label:管理ext系列文件系統的LABEL e2label DEVICE [LABEL]
findfs :查找分區
findfs [options] LABEL=<label> findfs [options] UUID=<uuid>

二、mount掛載

將額外文件系統與根文件系統某現存的目錄建立起關聯關系,進而使得此目錄做為其它文件訪問入口的行為
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:掛載點
事先存在,建議使用空目錄
進程正在使用中的設備無法被卸載
mount常用命令選項 --通過mount命令查看掛載設備
-t vsftype 指定要掛載的設備上的文件系統類型
-r readonly,只讀掛載
-w read and write, 讀寫掛載
-n 不更新/etc/mtab,6mount不可見 cat /etc/mtab
cat /proc/mounts查看內核追蹤到的已掛載的所有設備
centos6 /etc/mtab /proc/mounts
-a自動掛載所有支持自動掛載的設備(定義在了/etc/fstab文件中,且掛載選項中有auto功能)
-L ‘LABEL‘ 以卷標指定掛載設備
-U ‘UUID‘ 以UUID指定要掛載的設備
-B, --bind 綁定目錄到另一個目錄上(掛載目錄)
-當兩個文件inode一樣時可能是目錄掛載
-mount -B /boot/grub2 /mnt/grub2

卸載命令
findmnt MOUNT_POINT|device--查看文件是否以掛載 $?的值判斷
查看正在訪問指定文件系統的進程
lsof MOUNT_POINT--查看誰在訪問
fuser -v MOUNT_POINT--查看誰在訪問
終止所有在正訪問指定的文件系統的進程
fuser -km MOUNT_POINT
卸載 umount DEVICE umount MOUNT_POINT

mount /dev/sda /mnt /sda--uuid或卷標都可掛 uuid掛載好有唯一性

文件系統空間占用等信息的查看工具
df [OPTION]... [FILE]...
-H 以10為單位 -T 文件系統類型 -h human-readable -i inodes instead of blocks
-P 以Posix兼容的格式輸出
查看某目錄總體空間占用狀態
du [OPTION]... DIR -h human-readable -s summary 總和
--max-depth=# 指定最大目錄層級
。。。
空洞文件或稀疏
dd if=/dev/zero of=/data/bigfile bs=1M count=1023 seek=2048
ls -h bigfile 3G --看到的邏輯大小
du -sh bigfile 1G --只占用1G df/data看到的都是實際大小
loop設備關聯文件
ll /dev/loop c6查看loop設備默認0-78個
dd if=/dev/zero of=/data/bigfile bs=1M count=1023 seek=2048
mkfs.ext4 /data/bigfile
losetup /dev/loop6 /data/bigfile--設備關聯
losetup -a
losetup -d
。。。。
mknod創建特殊文件基本什麽都可以創建
mknod /dev/loop100 b 7 8 --創建loop設備
rm -rf loop100
/boot/grub/grub.conf 下面可以 max_loop=100 重啟
ll /devloop

mount -o ptions:多個選項使用逗號分隔
async.異步模式sync.同步模式,內存更改時,同時寫磁盤
atime/noatime包含目錄和文件(存放時間超過一天才會更新或mtime>atime時間
diratime/nodiratime 目錄的訪問時間戳
auto/noauto 是否支持自動掛載,是否支持- a選項
exec/noexec 是否支持將文件系統上運行應用程序
dev/nodev 是否支持在此文件系統上使用設備文件
suid/nosuid 是否支持suid和sgid權限
remount 重新掛載
ro 只讀 rw 讀寫
user/nouser 是否允許普通用戶掛載此設備,/etc/ fstab使用
acl 啟用此文件系統上的acl功能
loop 使用loop設備

文件掛載配置文件
/etc/fstab每行定義一個要掛載的文件系統
1、要掛載的設備或偽文件系統
設備文件 LABEL:LABEL="" UUID:UUID=""
偽文件系統名稱:proc, sysfs
2、掛載點
3、文件系統類型:ext4,xfs,iso9660,nfs,none
4、掛載選項:defaults ,acl,bind -o 的選項
5、轉儲頻率:0:不做備份 1:每天轉儲 2:每隔一天轉儲
6、fsck檢查的文件系統的順序:允許的數字是0 1 2
0:不自檢
1:首先自檢;一般只有rootfs才用
2:非rootfs使用
。。。
/dev/sdr6 /mnt/sda6 ext4 defaults 0 3
空洞文件用uuid在fstab寫入掛載
/boot /mnt/boot none bind 0 0 文件掛文件配置

mount-a自動掛載所有支持自動掛載的設備且掛載選項中有auto功能

三、swap
交換分區是系統RAM的補充,Swap分區支持虛擬內存。當沒有足夠的RAM保存系統處理的數據時會將數據寫入 swap 分區
當系統缺乏swap空間時,內核會因RAM內存耗盡而終止進程。配置過多swap空間會造成存儲設備處於分配狀態但閑置,造成浪費,過多 swap 空間還會掩蓋內存泄露

掛載交換分區--基本設置包括:?創建交換分區或者文件
?使用mkswap寫入特殊簽名?在/etc/fstab文件中添加適當的條目?使用swapon -a 激活交換空間
?啟用:swapon
swapon [OPTION]... [DEVICE]
-a:激活所有的交換分區
-p PRIORITY:指定優先級
/etc/fstab 在第4列中:pri=value
禁用:swapoff [OPTION]... [DEVICE]
SWAP的優先級
可以指定swap分區0到32767的優先級,值越大優先級越高
如果用戶沒有指定,那麽核心會自動給swap指定一個優先級,這個優先級從-1開始,每加入一個新的沒有用戶指定優先級的swap,會給這個優先級減一
先添加的swap的缺省優先級比較高,除非用戶自己指定一個優先級,而用戶指定的優先級(是正數)永遠高於核心缺省指定的優先級(是負數)
優化性能:分布存放,高性能磁盤存放
。。。
分swap分區 free -h 看內存使用情況
fdisk /dev/sdc p m t L 19 改分區盤id w (gpt)
mkswap 創建swap文件系統=mkswap/dev/sdc1
寫到fstab文件 free -h 沒看到
swapon -a 開啟swap free -h
cat /proc/swaps 查看swap分區具體有多少=swapon -s
swapoff /dev/sdc1禁用


補充

dd 命令:convert and copy a file
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
if=file 從所命名文件讀取而不是從標準輸入
of=file 寫到所命名的文件而不是到標準輸出
ibs=size 一次讀size個byte
obs=size 一次寫size個byte
bs=size block size, 指定塊大小(既是是ibs也是obs)
cbs=size 一次轉化size個byte
skip=blocks 從開頭忽略blocks個ibs大小的塊
seek=blocks 從開頭忽略blocks個obs大小的塊
count=n 復制n個bs
conv=conversion[,conversion...]用指定的參數轉換文件 轉換參數:
dd if=/data/file of=fstab conv=ucase
ascii 轉換 EBCDIC 為 ASCII
ebcdic 轉換 ASCII 為 EBCDIC
lcase 把大寫字符轉換為小寫字符
ucase 把小寫字符轉換為大寫字符
nocreat 不創建輸出文件
noerror 出錯時不停止
notrunc 不截短輸出文件
sync把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊
fdatasync寫完成前,物理寫入輸出文件,判斷讀寫速度

備份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破壞MBR中的bootloader
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
有一個大與2K的二進制文件fileA。現在想從第64個字節位置開始讀取,需要讀取的大小是128Byts。又有fileB,想把上面讀取到的128Bytes寫到第32個字節開始的位置,替換128Bytes,實現如下
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

1、備份:
dd if=/dev/sdx of=/dev/sdy
將本地的/dev/sdx整盤備份到/dev/sdy
dd if=/dev/sdx of=/path/to/image
將/dev/sdx全盤數據備份到指定路徑的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz
備份/dev/sdx全盤數據,並利用gzip壓縮,保存到指定路徑
恢復:
dd if=/path/to/image of=/dev/sdx
將備份文件恢復到指定盤
gzip -dc /path/to/image.gz | dd of=/dev/sdx
將壓縮的備份文件恢復到指定盤

2、拷貝內存資料到硬盤
dd if=/dev/mem of=/root/mem.bin bs=1024
將內存裏的數據拷貝到root目錄下的mem.bin文件

3、從光盤拷貝iso鏡像
dd if=/dev/cdrom of=/root/cd.iso
拷貝光盤數據到root文件夾下,並保存為cd.iso文件

4、銷毀磁盤數據
dd if=/dev/urandom of=/dev/sda1
利用隨機的數據填充硬盤,在某些必要的場合可以用來銷毀數據,執行此操作以後,/dev/sda1將無法掛載,創建和拷貝操作無法執行

5、得到最恰當的block size
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000
通過比較dd指令輸出中命令的執行時間,即可確定系統最佳的block size大小

6、測試硬盤寫速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000 conv=fdatasync
測試硬盤讀速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null conv=fdatasync

Liunx磁盤存儲和文件系統