磁盤管理

 磁盤管理


 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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章