天天看點

檔案系統分區及磁盤管理

1.描述GPT是什麼,如何使用

Linux的檔案系統分區結構一般有2種,MBR和GPT

MBG,Master Boot Record,主引導記錄
  • MBR是位于磁盤最前邊的一段引導(Loader)代碼,在磁盤的0磁道0扇區。它負責磁盤作業系統對磁盤進行讀寫時分區合法性的判别、分區引導資訊的定位,它由磁盤作業系統在對硬碟進行初始化時産生的。
  • MBR所在扇區大小為512bytes,專門用來存儲MBR,MBR分為三部分:引導代碼、MBR分區表、MBR結束标志

    引導代碼:占MBR分區的前446位元組,負責整個系統啟動。如果引導代碼被破壞,系統将無法啟動。

    MBR分區表:引導代碼後的64個位元組,是整個硬碟的分區表。有四張分區表

    MBR結束标志:占MBR扇區最後2個位元組,值為“55 AA”

    擴充分區
    由于MBR僅僅為分區表保留了64位元組的存儲空間,而每個分區則占用16位元組的空間,也就是隻能分4個分區,而4個分區在實際情況下往往是不夠用的,是以就有了擴充分區.
  • 擴充分區中的每個邏輯分區的分區資訊都存在一個類似MBR的擴充引導記錄(簡稱EBR)中,擴充引導記錄包括分區表和結束标志“55 AA”,沒有引導代碼部分。也就是EBR中的前446個位元組是空的。
  • EBR中分區表的第一項描述第一個邏輯分區,第二項指向下一個邏輯分區的EBR。如果下一個邏輯分區不存在,第二項就不需要了。

    需要注意的是,當磁盤容量超過2T的時候,現在的MBR機制是沒辦法識别2T以後的磁盤空間的,此時就需要使用GPT機制來進行分區。

GPT

GPT磁盤分區結構解決了MBR隻能分4個主分區的的缺點,理論上說,GPT磁盤分區結構對分區的數量好像是沒有限制的。但某些作業系統可能會對此有限制。

  • 保護MBR

    保護MBR位于GPT磁盤的第一扇區,也就是0号扇區,有磁盤簽名,MBR磁盤分區表和結束标志組成,沒有引導代碼。而且分區表内隻有一個分區表項,這個表項GPT根本不用,隻是為了讓系統認為這個磁盤是合法的。

  • GPT頭

    GPT頭位于GPT磁盤的第二個扇區,也就是1号扇區,該扇區是在建立GPT磁盤時生成,其作用是定義分區表的位置和大小。GPT頭還包含頭和分區表的校驗和,這樣就可以及時發現錯誤。

  • 分區表

    分區表位于GPT磁盤的2-33号扇區,一共占用32個扇區,能夠容納128個分區表項。每個分區表項大小為128位元組。因為每個分區表項管理一共分區,是以允許GPT磁盤建立128個分區。

    每個分區表項中記錄着分區的起始,結束位址,分區類型的GUID,分區的名字,分區屬性和分區GUID。

  • 分區區域

    GPT分區區域就是使用者使用的分區,也是使用者進行資料存儲的區域。分區區域的起始位址和結束位址由GPT分區表定義。

  • GPT頭備份

    GPT頭有一個備份,放在GPT磁盤的最後一個扇區,但這個GPT頭備份并非完全GPT頭備份,某些參數有些不一樣。複制的時候根據實際情況更改一下即可。

  • 分區表備份

    分區區域結束後就是分區表備份,其位址在GPT頭備份扇區中有描述。分區表備份是對分區表32個扇區的完整備份。如果分區表被破壞,系統會自動讀取分區表備份,也能夠保證正常識别分區。

GPT的分區結構相對于MBR要簡單許多,并且分區表以及GPT頭都有備份。

GPT的使用
[root@centos7 ~]#parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)           
  • align-check TYPE N 檢查分區N的類型(最小|opt)是否對齊
  • help [COMMAND] 列印一般幫助,或按指令列印幫助
  • mklabel,mktable LABEL-TYPE 建立一個新的磁盤标簽(分區表)
  • mkpart PART-TYPE [FS-TYPE] START END 做一個分區
  • name NUMBER NAME 将分區号作為名稱
  • print [devices|free|list,all|NUMBER] 顯示分區表、可用裝置、空閑空間、所有找到的分區或特定的分區
  • quit 退出程式
  • rescue START END 在開始和結束附近挽救丢失的分區
  • resizepart NUMBER END 調整分區号
  • rm NUMBER 删除分區号
  • select DEVICE 選擇要編輯的裝置
  • disk_set FLAG STATE 更改標明裝置上的标志
  • disk_toggle [FLAG] 切換標明裝置上的标志狀态
  • set NUMBER FLAG STATE 更改分區号上的标志
  • toggle [NUMBER [FLAG]] 切換分區号上的标志狀态
  • unit UNIT 将預設單元設定為單元

建立GPT分區步驟

1、使用parted工具:parted /dev/sdb

2、輸入:mklabel gpt 切換分區模式,print檢視是否成功

3、輸入:mkpart

建立一個10G的分區,并格式化為ext4檔案系統。

[root@centos7 ~]#fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xc5f2d556.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-20971519, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): 
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@centos7 ~]#
[root@centos7 ~]#fdisk -l

Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xc5f2d556

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20971519    10484736   83  Linux

[root@centos7 ~]#mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621184 blocks
131059 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

[root@centos7 ~]#           
要求

(1)block大小為2048,預留白間20%,卷标為MYDATA

mke2fs -b 2048 -t ext4 -m 20 -L MYDATA /dev/sdb1           
[root@centos7 ~]#mount -o noexec -o noatime /dev/sdb1 /mydata
[root@centos7 ~]#mount | grep sdb
/dev/sdb1 on /mydata type ext4 (rw,noexec,noatime,seclabel,data=ordered)
[root@centos7 ~]#           
[root@centos7 ~]#vim /etc/fstab
LABEL='MYDATA'      /mydata         ext4        noexec,noatime  0   0           

建立一個大小為1G的swap分區,并啟用

[root@centos7 ~]#fdisk /dev/sdb
    Command (m for help): n
    Command (m for help): t
    Selected partition 1
    Hex code (type L to list all codes): 82
    Changed type of partition 'Linux' to 'Linux swap / Solaris'

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    Syncing disks.
[root@centos7 ~]#
[root@centos7 ~]#mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=11ef8a8c-bd90-4a92-9c2c-e97301b0c537
[root@centos7 ~]#cat /proc/meminfo | grep SwapTotal
SwapTotal:       4194300 kB
[root@centos7 ~]#swapon /dev/sdb1
[root@centos7 ~]#cat /proc/meminfo | grep SwapTotal
SwapTotal:       5242872 kB
[root@centos7 ~]#           

編寫腳本計算/etc/passwd檔案中第10個使用者和第20個使用者id号之和

#!/bin/bash
#
uid10=$(head -10 /etc/passwd | tail -1 | cut -d: -f3)
uid20=$(head -20 /etc/passwd | tail -1 | cut -d: -f3)

sumuid=$[$uid10+$uid20]
echo "User No.10 and No.20 uidsum="$sumuid           
#!/bin/bash
#
hostname=$(hostname)
if [ -z "$hostname" -o "$hostname" == "localhost.localdomain" ]; then
        echo "hostname is wrong. Change it."
        hostname www.magedu.com
else
        echo "hostname is right."
fi           

編寫腳本,通過指令行參數傳入一個使用者名,判斷id号是偶數還是奇數

#!/bin/bash
#
if [ $# -lt 1 ]; then
        echo "At least one username"
        exit 1
fi
judgeuid=$(id $1)
if [ $? != 0 ]; then
        echo "No such user."
        exit 2
fi
uid=$(id -u $1)
if [ $[$uid%2] -eq 0 ]; then
        echo $1" uid is Even number."
else
        echo $1" uid is Odd number."
fi           

lvm基本應用及擴充縮減實作