磁盤管理
1 磁盤的結構
設備文件
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
硬盤存儲術語
head:磁頭 ?
track:磁道 ?
cylinder: 柱面 ?
secotr: 扇區,512bytes
磁盤分區
使用分區空間
? 設備識別 ?
設備分區 ?
創建文件系統 ?
標記文件系統 ?
在/etc/fstab文件中創建條目 ?
掛載新的文件系統
為什么要分區?
1優化I/O性能
2實現磁盤空間配額限制
3提高修復速度
4隔離系統和程序
5安裝多個OS
分區種類
? 兩種分區方式:
MBR,GPT ?
MBR: Master Boot Record,1982年,使用32位表示扇區 數,分區不超過2T ?
如何分區:按柱面 ?
0磁道0扇區:
512bytes
446bytes: boot loader 64bytes:分區表
16bytes: 標識一個分區
2bytes: 55AA ?
4個主分區;3主分區+1擴展(N個邏輯分區)
GPT分區
GPT:GUID patition table 支持128個分區,使用64位,支 持8Z( 512Byte/block )64Z ( 4096Byte/block) ? 使用128位UUID 表示磁盤和分區 GPT分區表自動備份在頭 和尾兩份,并有CRC校驗位 ?UEFI (統一擴展固件接口)硬件支持GPT
管理分區
列出塊設備
blkid ?
創建分區使用:
fdisk 創建MBR分區,也支持GPT,對于一塊硬盤,最多只能管 理15分區
gdisk 創建GPT分區 GNU parted 高級分區操作(創建、復制、調整大小等等) ?partprobe-重新設置內存中的內核分區表版本
分區工具fdisk和gdisk
fdisk /dev/sdb ?
gfisk /dev/sdb ?
fdisk -l [-u] [device…] ?
子命令: ?
p 分區列表 ?
t 更改分區類型 ?
n 創建新分區 ?
d 刪除分區 ?
w 保存并退出 ?
q 不保存并退出
同步分區表
查看內核是否已經識別新的分區:
cat /proc/partations ?
通知內核重新讀取硬盤分區表
新增分區用
partx -a -n M:N /dev/DEVICE
kpartx -a /dev/DEVICE -f: force
刪除分區用
partx -d -n M:N /dev/DEVICE
centos6: –nr N-M ?
CentOS 5,7: 使用partprobe ?
partprobe [/dev/DEVICE]
parted命令 ?parted的操作都是實時生效的,小心使用 ?
用法:parted [選項]… [設備 [命令 [參數]…]…]
parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print
parted /dev/sdb mkpart primary 1 200 (默認M)
parted /dev/sdb rm 1
parted -l
文件系統
? 文件系統是操作系統用于明確存儲設備或分區上的文件的方 法和數據結構;即在存儲設備上組織文件的方法。操作系統 中負責管理和存儲文件信息的軟件結構稱為文件管理系統, 簡稱文件系統。 ?
從系統角度來看,文件系統是對文件存儲設備的空間進行組 織和分配,負責文件存儲并對存入的文件進行保護和檢索的 系統。具體地說,它負責為用戶建立文件,存入、讀出、修 改、轉儲文件,控制文件的存取,安全控制,日志,壓縮, 加密等。
文件系統類型
?Linux文件系統: ext2, ext3, ext4, xfs(SGI), btrfs( Oracle), reiserfs, jfs(AIX), swap
swap: 交換分區
光盤:iso9660 ?
Windows:fat32, ntfs ?
Unix: FFS(fast), UFS(unix), JFS2 ?
網絡文件系統:NFS, CIFS ?
集群文件系統:GFS2, OCFS2(oracle) ?
分布式文件系統:ceph, moosefs, mogilefs, glusterfs, Lustre ?
RAW:未經處理或者未經格式化產生的文件系統
文件系統分類
? 根據其是否支持"journal"功能:
日志型文件系統: ext3, ext4, xfs, …
非日志型文件系統: ext2, vfat ?
文件系統的組成部分:
內核中的模塊:ext4, xfs, vfat
用戶空間的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat ?
Linux的虛擬文件系統:VFS ?
查前支持的文件系統:cat /proc/filesystems
創建文件系統
?mkfs命令:
(1) mkfs.FS_TYPE /dev/DEVICE
ext4
xfs
btrfs
vfat
(2) mkfs -t FS_TYPE /dev/DEVICE
-L 'LABEL': 設定卷標
創建ext文件系統 ?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:關閉指定特性
文件系統標簽
? 指向設備的另一種方法 ?
與設備無關 ?
blkid:塊設備屬性信息查看
blkid [OPTION]… [DEVICE]
-U UUID: 根據指定的UUID來查找對應的設備
-L LABEL:根據指定的LABEL來查找對應的設備 ?
e2label:管理ext系列文件系統的LABEL
e2label DEVICE [LABEL] ?
findfs :查找分區
findfs [options] LABEL=<label>
findfs [options] UUID=<uuid>
tune2fs
tune2fs:重新設定ext系列文件系統可調整參數的值
-l:查看指定文件系統超級塊信息;super block
-L 'LABEL':修改卷標
-m :修預留給管理員的空間百分比
-j: 將ext2升級為ext3
-O: 文件系統屬性啟用或禁用,
–O ^has_journal
-o: 調整文件系統的默認掛載選項,
–o ^acl -U UUID: 修改UUID號 ?dumpe2fs:
-h:查看超級塊信息(分組信息),分區用分組管理
文件系統檢測和修復
? 常發生于死機或者非正常關機之后 ?
掛載為文件系統標記為“dirty” ?
fsck: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
-a: 自動修復錯誤
-r: 交互式修復錯誤 ?
注意: FS_TYPE一定要與分區上已經文件類型相同; ?
e2fsck:ext系列文件專用的檢測修復工具
-y:自動回答為yes
-f:強制修復
掛載mount ?
掛載:將額外文件系統與根文件系統某現存的目錄建立起關聯 關系,進而使得此目錄做為其它文件訪問入口的行為 ? 卸載:為解除此關聯關系的過程 ?
把設備關聯掛載點:mount Point mount ?
卸載時:可使用設備,也可以使用掛載點 umount ?
掛載點下原有文件在掛載完成后會被臨時隱藏 ? 掛載點目錄一般為空
用mount命令掛載文件系統 ?
掛載方法: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-43f145e7-85c0-a126711d406e'
(4) 偽文件系統名稱:proc, sysfs, devtmpfs, configfs
dir:掛載點
事先存在;建議使用空目錄
進程正在使用中的設備無法被卸載
mount常用命令選項 ?
-t vsftype:指定要掛載的設備上的文件系統類型 ?
-r: readonly,只讀掛載 ?
-w: read and write, 讀寫掛載 ?
-n: 不更新/etc/mtab,相當于#mount ?
-a:自動掛載所有支持自動掛載的設備(定義在了/etc/fstab 文件中,且掛載選項中有auto功能) ?
-L 'LABEL': 以卷標指定掛載設備 ?
-U 'UUID': 以UUID指定要掛載的設備 ?
-B, –bind: 綁定目錄到另一個目錄上 ?
查看內核追蹤到的已掛載的所有設備: cat /proc/mounts
mount常用命令選項
? -o options:(掛載文件系統的選項),多個選項使用逗號分隔
async:異步模式
sync:同步模式,內存更改時,同時寫磁盤
atime/noatime:包含目錄和文件
diratime/nodiratime:目錄的訪問時間戳
auto/noauto:是否支持自動掛載,是否支持-a選項
exec/noexec:是否支持將文件系統上運行應用程序
dev/nodev:是否支持在此文件系統上使用設備文件
suid/nosuid:不否支持suid和sgid權限
remount:重新掛載
ro:只讀
rw:讀寫
user/nouser:是否允許普通用戶掛載此設備,默認管理員才能掛載
acl:啟用此文件系統上的acl功能 ?
Defaults:相當于rw, suid, dev, exec, auto, nouser, async
卸載命令
查看掛載情況:
findmnt MOUNT_POINT ?
查看正在訪問指定文件系統的進程:
lsof MOUNT_POINT
fuser -v MOUNT_POINT ?
終止所有在正訪問指定的文件系統的進程:
fuser -km MOUNT_POINT ?
卸載:
umount DEVICE
umount MOUNT_POINT
冒泡排序練習題:
1、輸入若干個數值存入數組中,采用冒泡算法進行升序或降序排序
#/bin/bash
declare -a rand
rand=($@)
i=$[${#rand[@]}-1]
for n in `seq 1 $i`
do
for j in `seq 1 $i`
do
[ ${rand[$j]} -lt ${rand[$[$j-1]]} ] && c=${rand[$j]} && rand[$j]=${rand[$[$j-1]]} && rand[$[$j-1]]=$c
done
done
echo ${rand[@]}
[root@localhost rpm]# /root/bin/maopao2.sh 2343 64 5 656 756758 56 4 356 261 284 8657 67 45 848
4 5 45 56 64 67 261 284 356 656 848 2343 8657 756758
2、編寫腳本/root/bin/copycmd.sh (1) 提示用戶輸入一個可執行命令名稱 (2) 獲取此命令所依賴到的所有庫文件列表 (3) 復制命令至某目標目錄(例如/mnt/sysroot)下的對應路徑下; 如:/bin/bash ==> /mnt/sysroot/bin/bash /usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd (4) 復制此命令依賴到的所有庫文件至目標目錄下的對應路徑下: 如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ldlinux-x86-64.so.2 (5)每次復制完成一個命令后,不要退出,而是提示用戶鍵入新的要復制的命 令,并重復完成上述功能;直到用戶輸入quit退出
#!/bin/bash
ch_root="/mnt/sysroot"
[ ! -d $ch_root ] && mkdir $ch_root
bincopy() {
if which $1 &>/dev/null; then
local cmd_path=`which –skip-alias $1`
local bin_dir=`dirname $cmd_path`
[ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
[ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}
return 0
else
echo "Command not found."
return 1
fi
}
libcopy() {
local lib_list=$(ldd `which –skip-alias $1` | grep -Eo '/[^[:space:]]+')
for loop in $lib_list;do
local lib_dir=`dirname $loop`
[ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir}
[ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}
done
}
read -p "Please input a command or quit: " command
while [ "$command" != "quit" ];do
if bincopy $command ;then
libcopy $command
fi
read -p "Please input a command or quit: " command
done
原創文章,作者:a1215276209,如若轉載,請注明出處:http://www.www58058.com/40144