Linux磁盤和文件系統管理進階(swap、磁盤配額、RAID、LVM、btrfs)

概述:

    上篇已經介紹了一些磁盤和文件系統管理的基礎概念,對磁盤的硬件構造,文件系統的基礎概念部分有了一個大致的了解。本篇就分享一些關于磁盤和文件系統管理的一些高級應用,具體包含:

    1、swap交換分區的管理

    2、掛載移動介質及dd及相關命令的補充

    3、磁盤配額的管理

    4、RAID管理

    5、LVM邏輯卷管理

    6、btrfs文件系統管理

    7、高級磁盤管理實戰演練

第一章    swap交換分區管理

    交換分區是用于當物理內存空間不夠用時,將內存中的數據,按照LSU算法,將最近最少使用的一些數據展示存儲到交換分區里面,充當內存的補充,inux上的交換分區必須使用獨立的文件系統,且文件系統的system ID 必須為82

    1、交換分區的創建:

        利用fdisk命令,創建一個分區,并將分區類型修改為82,也就是swap類型,出于讀寫速度考慮,建議將交換分區創建為一個獨立磁盤的起始柱面開始的分區(一般為第一個分區),因為按照磁盤物理結構來看,起始柱面處于盤片的最外圈,讀寫速率相對較高

        1.png

    2、格式化交換分區

        創建了交換分區之后,可利用mkswap命令來創建文件系統,格式為:mkswap DEVICE

        blob.png

        

    3、啟用禁用交換分區       

        啟用: swapon

            swapon [OPTION]… [DEVICE]

                -a:激活所有的交換分區,實際是去讀/etc/fstab文件

                -s  顯示swap的分區狀況

                -p PRIORITY:指定優先級

        blob.png      

        禁用:swapoff  /DEVICE

        blob.png

    4、掛載交換分區,讓交換分區能夠開啟自動掛載

        編輯/etc/fstab文件添加關于swap分區的掛載條目

        blob.png

        3.png

  

    5、管理交換分區

        交換分區的優先級:

            用戶可以給某個swap指定一個0到32767的優先級

            如果用戶沒有指定,那么核心會自動給swap指定一個優先級,這個優先級從-1開始,每加入一個新的沒有用戶指定優先級的swap,會給這個優先級減一。

            先添加的swap的缺省優先級比較高,除非用戶自己指定一個優先級,而用戶指定的優先級(是正數)永遠高于核心缺省指定的優先級(是負數)。

        調整swap優先級的方法:

           1、 在swapon -p 指定優先級(重啟后失效)

        blob.png 

          2、  在fstab中默認掛載選項中定義pri=優先級(永久有效,要想立即生效,需要swapoff,然后再swapon)

        blob.png

        blob.png

    6、利用文件(而不是分區)當做交換分區使用

        先創建一個合適大小的文件,然后mkswap格式化為swap的文件系統,然后啟用之

        blob.png

        也支持將配置寫入/etc/fstab文件,讓其自動掛載,只是掛載選項那里注意要加上loop選項

第二章    掛載移動介質和dd及相關命令補充

    1、移動介質掛載使用(光盤、U盤)

        掛載意味著使外來的文件系統看起來如同是主目錄樹的一部分

        訪問前、介質必須被掛載

        摘除時,介質必須被卸載

        按照默認設置,非根用戶只能掛載某些設備(光盤、 DVD、軟盤、 USB等等)掛載點通常在/media 或/mnt下

        光盤:

            手工掛載,如:mount /dev/cdrom /mnt/

            eject命令卸載或彈出磁盤

            創建ISO文件,如:

                cp /dev/cdrom /root/centos7.iso

                mkisofs -r -o /root/etc.iso /etc

            刻錄光盤

                wodim –v –eject centos.iso

        USB介質:

            被內核探測為SCSI設備,/dev/sdaX、 /dev/sdbX、或類似的設備文件

            手動掛載:mount /dev/sdb1 /mnt

    2、dd命令詳解

        dd命令:convert and copy a file

        用法:

            dd if=/PATH/FROM/SRC of=/PATH/TO/DEST

            bs=#: block size, 復制單元大小

            count=#:復制多少個bs

            of=file 寫到所命名的文件而不是到標準輸出

            if=file 從所命名文件讀取而不是從標準輸入

            bs=size 指定塊大?。仁鞘莍bs也是obs)

            ibs=size 一次讀size個byte

            obs=size 一次寫size個byte

            cbs=size 一次轉化size個byte

            skip=blocks 從開頭忽略blocks個ibs大小的塊

            seek=blocks 從開頭忽略blocks個obs大小的塊

            conv=conversion[,conversion…] 用指定的參數轉換文件

                轉換參數:

                    block 轉換為長度為 cbs 的記錄,不足部分用空格填充。

                    unblock 替代cbs長度的每一行尾的空格為新行

                    lcase 把大寫字符轉換為小寫字符

                    ucase 把小寫字符轉換為大寫字符

                    swab 交換輸入的每對字節。

                    nocreat  輸出的文件不存在,不默認創建

                    noerror 出錯時不停止

                    notrunc 不截短輸出文件。

                    sync 把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊

        用法示例:

            磁盤拷貝: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=64 count=1 seek=446

            備份:

                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

                將壓縮的備份文件恢復到指定盤

            拷貝內存資料到硬盤

                dd if=/dev/mem of=/root/mem.bin bs=1024

                將內存里的數據拷貝到root目錄下的mem.bin文件

            從光盤拷貝iso鏡像

                dd if=/dev/cdrom of=/root/cd.iso

                拷貝光盤數據到root文件夾下,并保存為cd.iso文件

            銷毀磁盤數據

                dd if=/dev/urandom of=/dev/sda1

                利用隨機的數據填充硬盤,在某些必要的場合可以用來銷毀數據。執行此操作以后, /dev/sda1將無法掛載,創建和拷貝操作無法執行。

            得到最恰當的block size

                dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

                dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

                dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file

                dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

                通過比較dd指令輸出中所顯示的命令執行時間,即可確定系統最佳的block size大小

            測試硬盤讀寫速度

                dd if=/root/1Gb.file bs=64k | dd of=/dev/null

                dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

                通過上兩個命令輸出的執行時間,可以計算出測試硬盤的讀/寫速度

            修復硬盤

                dd if=/dev/sda of=/dev/sda

                當硬盤較長時間(比如1, 2年)放置不使用后,磁盤上會產生消磁點。當磁頭讀到這些區域時會遇到困難,并可能導致I/O錯誤。當這種情況影響到硬盤的第一個扇區時,可能導致硬盤報廢。上邊的命令有可能使這些數據起死回生。且這個過程是安全,高效的。

    3、磁盤管理其他相關命令

        內存空間使用狀態:

            free [OPTION]

                -m: 以MB為單位

                -g: 以GB為單位

        文件系統空間占用等信息的查看工具:

            df [OPTION]… [FILE]…

                -H 以1000為單位

                -T 文件系統類型

                -h: human-readable

                -i:不以塊顯示磁盤空間占用情況,而是以inode的數量顯示占用情況

                -P: 以Posix兼容的格式輸出

        查看某目錄總體空間占用狀態:顯示出來默認是K為單位

            du [OPTION]… DIR

                -h: human-readable

                -s: summary

                du -sh /*  顯示根下每個目錄的大小

        blob.png       

        blob.png

第三章    磁盤配額的管理

    Linux是多用戶的操作系統,同一時間可能有多個用戶登錄到系統上進行相關操作,用戶在操作的時候,可能會寫入很多數據,占用大量磁盤空間,導致其他用戶想寫數據的時候,沒有磁盤空間可用,如何限定某個用戶對磁盤的使用空間大小,以及可使用的inode多少,也就是限定可創建多少個文件,這就是磁盤配額管理的作用。

    磁盤配額管理的是針對一個獨立的分區文件系統進行管理,不能跨分區,如果我們希望對某個目錄進行磁盤配額管理,則需要將該目錄單獨掛載至某個獨立的分區

    磁盤配額管理的設定流程:

        1、啟用分區掛載選項usrquota、grpquota,根據需要,只針對用戶啟用或只針對組啟用,也可以兩個都啟用

            注意修改掛載選項后執行重新掛載

        quo1.png

        qu2.png

        2、初始化quota數據庫

            quotacheck -cu|-cg|-cug  /DIR

            針對某個分區的掛載目錄初始化quota數據庫,可以針對用戶創建、針對組創建、或者兩個都創建,看第一步掛載選項啟用的那些都創建那些

        qu3.png

        初始化數據塊后,會在被執行磁盤配額的目錄下生成相關的數據庫文件,該文件無法通過vi等編輯器查看

        3、啟用磁盤配額功能

            quotaon /DIR

            關閉用 quotaoff

            quotaon -p  /DIR  查看某目錄磁盤配額是否啟用

        blob.png

        4、編輯具體配額信息

            edquota USERNAME 進入交互式界面定義配額

            或setquota USERNAME  軟容量  硬容量  軟數量  硬數量  /DIR

            或根據現有用戶的配置來設置別的用戶

                edquota -p USER1  USER2  根據user1設置user2

        qu4.png

        blob.png

        blob.png

        5、驗證配額情況

            quota USERNAME  查看某用戶配額信息

            repquota  /DIR  查看掛載點的整體配額信息

            quotaon -p  /DIR  查看某目錄磁盤配額是否啟用

        blob.png

第四章    RAID管理

    1、RAID概述:

        多個磁盤合成一個“陣列”來提供更好的性能、冗余,或者兩者都提供

        提高IO能力:磁盤并行讀寫

        提高耐用性;磁盤冗余來實現

        RAID級別:多塊磁盤組織在一起的工作方式有所不同

        RAID實現的方式:

            外接式磁盤陣列:通過擴展卡提供適配能力

            內接式RAID:主板集成RAID控制器,安裝OS前在BIOS里配置

            Software RAID:利用軟件實現RAID功能

    2、常見RAID級別及其相關屬性

        RAID的級別僅僅代表磁盤組織方式的不同,不代表先進性

        0:代表條帶技術(一份分成多分存儲,提升讀寫速率)

            性能表現:讀寫性能提升

            冗余能力(容錯能力):無

            空間利用率:n倍,每個raid0存儲量取決于幾塊盤中最小的容量

            至少2塊盤

        blob.png

        1:代表鏡像技術(一份復制多分存儲,提升容錯率)

            性能表現:寫下降,讀提升

            冗余能力:有

            空間利用率:1/2,每個raid1存儲量取決于幾塊盤中最小的容量

            至少2塊盤

        blob.png

        5:校驗碼技術

            性能表現:讀寫提升

            冗余能力:有,只能同時壞一塊盤

            空間利用率:(n-1)/n,每個raid5存儲量取決于幾塊盤中最小的容量

            至少3塊盤

        blob.png

        01:先做0,后做1

            性能表現:讀寫提升

            冗余能力:有

            空間利用率:1/2

            至少4塊盤

        blob.png

        10:先做1,后做0;實際公司一般用這種,實用性比01好(底層是1,上層是0)

            性能表現:讀寫提升

            冗余能力:有,每組鏡像對多只能壞一塊

            空間利用率:1/2,每個raid10存儲量取決于幾塊盤中最小的容量

            至少4塊盤

        blob.png

        50:

            性能表現:讀寫提升

            冗余能力:有

            空間利用率:(n-2)/2

            至少6塊盤

        blob.png

        JBOD技術:將多塊盤組成一個大的盤,不提升讀寫速率,不提供冗余

        常用級別:raid-0,raid-1,raid5,raid10,raid50,JBOD

    

    3、軟件RAID的實現:mdadm  (實際效果演示見本文第七章)  

        md:(內核中支持軟件RAID的模塊) 

        mdadm:模式化的工具,支持的RAID級別:LINEAR, RAID0, RAID1, RAID4,RAID5, RAID6, RAID10

            將任何塊設備做成RAID,支持將磁盤的某個分區、也支持整個磁盤創建為RAID設備,利用分區創建的時候,需要將分區類型修改為fd,利用整個磁盤創建時,則直接指定磁盤即可

        語法:命令的語法格式: mdadm [mode] <raiddevice> [options] <component-devices>

            模式mode:

                創建: -C(注意在同一個磁盤上的不同分區創建是沒有意義的,因為RAID本身是為了防止物理損壞,而創建在同一個磁盤上的不同分區,磁盤壞了,RAID的各個分區也壞了)

                裝配: -A

                監控: -F

                管理: -f, -r, -a

                <raiddevice>: /dev/md#

                <component-devices>: 任意塊設備

            創建模式-C:

                -n #: 使用#個塊設備來創建此RAID

                -l #:指明要創建的RAID的級別

                -a {yes|no}:自動創建目標RAID設備的設備文件

                -c CHUNK_SIZE: 指明塊大小,2^n,單位K,默認為512K

                -x #: 指明空閑盤的個數

                例如:創建一個10G可用空間的RAID5

                    mdadm -C /dev/md1 -n 3 -x 1 -l 5 -a yes /dev/sd{b,c,d,e}1

            顯示RAID的詳細信息:mdadm -D /dev/md#

            觀察RAID的狀態:cat /proc/mdstat

            創建好raid設備后,要利用mdadm -Ds >> /etc/mdadm.conf  保存到配置文件,否則下次啟動或利用mdadm -A裝配時,會找不到raid設備

            管理模式:

                -f: 標記指定磁盤為損壞

                -a: 添加磁盤

                -r: 移除磁盤

            停止RAID設備:

                mdadm -S /dev/md#

            軟RAID管理:

                生成配置文件: mdadm –D –s >> /etc/mdadm.conf

            激活: mdadm –A –s /dev/md0 激活

                注意,停止想激活,前提是生成過配置文件

            刪除raid信息: mdadm –zero-superblock /dev/sdb1

            增長模式:當創建某raid時,指定的磁盤個數為N,后面想增加磁盤個數時用到此模式

                mdadm –G /dev/md0 –n4 -a /dev/sdf1

        注意:

            raid創建完成后,如果用UUID掛載,則需要用blkid看到的UUID進行掛載,而不應該用mdadm -D /dev/md0看到的UUID

            停止RAID后,如果發現分區沒有被清除干凈,需要用mdadm –zero-superblock  /dev/sdb1將每個分區信息刪除

        總結:

            創建RAID過程:

            1、fdisk創建分區,修改類型為fd

            2、創建raid設備: mdadm -C /dev/md# -n 設備個數 -x 空閑盤個數 -l RAID級別  -c CHUNK大小 -a yes  /DEVICES…

            3、如果有必要,將raid信息導出:mdadm -Ds >> /etc/mdadm.conf

            4、格式化創建文件系統:mke2fs -t FILESYSTEM_TYPE /dev/md#

            5、掛載:mount /dev/md# /MOUNT_POINT

            6、掛載寫入配置文件,實現自動掛載 vim /etc/fstab

                注意,要用blkid查看到的UUID進行掛載,因為重啟后raid設備名稱會發生變更

            

            測試:

            1、手工損壞某個磁盤:mdadm /dev/md# -f /DEVICE

            2、觀察md設備的狀態:cat /proc/mdstat  或 mdadm -D /dev/md#

            3、移除認為損壞的設備,添加新的設備

                    mdadm /dev/md# -r /DEVICE

                    mdadm /dev/md# -a /DEVICE

            4、增加raid設備的磁盤數量(增長模式)

                    mdadm -G /dev/md# -n # -a /DEVICE

                    -n指定要增長到幾塊磁盤,-a指定增加進去的磁盤

            5、停用RAID設備:

                    mdadm -S /dev/md#

            6、重新啟用之前停用的RAID設備(前提是導出過配置文件)

                    mdadm -As /dev/md#

            完全刪除停止raid設備:

            1、停用RAID設備:mdadm -S /dev/md#

            2、刪除保存過的RAID配置文件:rm -f /etc/mdadm.conf

            3、刪除創建過RAID分區:fdisk 命令

            4、如果發現無法完全刪除分區信息,利用mdadm –zero-superblock /DEVICE 將每個分區信息刪除

        

第五章    LVM邏輯卷管理

    1、LVM的基礎概念

       可以基于任何塊設備,包括磁盤的某個分區,或整個磁盤,甚至包括raid設備來創建

        dm:device mapper  將一個或多個底層塊設備組織成一個邏輯設備的模塊

        創建后的設備文件是:/dev/dm-#

        由于以上的表達方式不方便記憶和調用,故有/dev/VG_NAME/LV_NAME和/dev/mapper/VG_NAME-LV_NAME這兩個鏈接文件指向了真實文件

    

        PV:(physical volume物理卷):提供物理空間的磁盤或分區

        PE:(physical extend 物理盤區):類似塊的概念

        VG:(volume group 卷組):類似擴展分區的概念

        LV:(logical volume 邏輯卷):真正提供訪問的邏輯空間

        LE:(logical extend 邏輯盤區):PE映射到LV上面的就叫LE

        blob.png

    2、PV管理工具,利用分區創建pv時,需要將分區類型改為8e

        PV管理工具:(pv只有在加入vg后才能會有PE塊大小,才能進行分配)

            pvs  簡要顯示pv信息

            pvdisplay [DEVICE] 顯示指定塊設備的pv詳細信息,不指定默認顯示全部pv信息

            pvcreate /dev/DEVICE  將指定的設備創建為pv

                例如:pvcreate /dev/sda3  /dev/sdb

            pvremove /dev/DEVICE  將指定的設備從pv中移除

            pvmove /dev/DEVICE  當縮減VG大小時,需要先將被縮減的設備上的文件移動到同一個VG上面的其他設備上,此時需要用pvmove來實現數據的轉移

        blob.png

        pv1.png

        blob.png

    4、VG管理工具

        vgs  簡要顯示vg信息

        vgdisplay  [VG_NAME] 顯示指定VG的詳細信息,不指定默認顯示全部的VG信息

        vgcreate [-s PE_SIZE] VG_NAME  /dev/DEVICE…

            -s PE_SIZE  指定PE大小,單位可以有KMGT…默認為4M,PE的大小一旦vg創建完成就不能更改

            /dev/DEVICE  指定用哪個PV設備創建該VG

            例如:vgcreat -s 2M myvg  /dev/sda3

        vgextend  VG_NAME  /dev/DEVICE  將指定的pv設備加入到vg

            例如:

                pvcreate /dev/sda5

                vgextend myvg /dev/sda5

        vgreduce  VG_NAME  /dev/DEVICE  將指定的pv設備從vg移除,移除pv前要先將pv的數據移走,然后再從vg中移除該pv 

            例如: 

                pvmove /dev/sda5

                vgreduce myvg /dev/sda5

            注意:移除pv時,要將pv上的數據移動到改vg組內的其他pv上

        vgremove VG_NAME  移除指定的整個VG

        vg1.png

        blob.png

        blob.png

        blob.png

    5、LV管理工具:

        lvs  簡要顯示lv信息

        lvdisplay [/dev/VG_NAME/LV_NAME] 顯示指定lv的詳細信息,不指定則默認顯示全部lv的信息

        lvcreate [OPTION]… -n LV_NAME VG_NAME

            -L SIZE :指明lv的大小,支持的單位MGT等;指明的大小在指明的VG中有足夠的空間分配

            -n LV_NAME  指明lv的名稱

            VG_NAME   指明在哪個VG上創建

            例如:lvcreate -L 2G -n mylv myvg

            創建完成lv后,設備文件名一般是/dev/VG_NAME/LV_NAME

        lvremove /dev/VG_NAME/LV_NAME  可以實現刪除指定的lv

        blob.png

        擴展LV:(先擴展物理邊界,也就是lv,再擴展邏輯邊界 resize2fs)支持在線擴展

            lvextend -L [+]SIZE  /dev/VG_NAME/LV_NAME

                -L [+]SIZE 指明擴展多大的空間,可以是MGT等

                    -L SIZE  表示增加到多大,表示lv的總的空間大小

                    -L +SIZE  表示在原有基礎上增加多少

                例如:lvextend -L +5G /dev/myvg/mylv

            注意:擴展完成lv大小后,只是擴展了物理上的存儲大小,但是文件系統的大小還是沒有改變,所以在擴展完lv大小后,要重置指定分區的文件系統大小,方法如下:(實際是擴展邏輯邊界)

            resize2fs /dev/myvg/mylv (該命令只適用于ext系列文件系統)

        lv1.png

        lv2.png

        注意:

            擴展lv時,如果文件系統是xfs時,不能用resize2fs(專用用ext系列) ,而要用xfs_growfs /dev/VG_NAME/LV_NAME

            擴展時如果使用的lvextend -r -l 100%FREE /dev/nwc_vg/nwc_lv 表示將剩余空間全部擴展,則不需要進行文件系統邊界擴展,也就是不需要執行resize2fs

            xfs文件系統只能擴展,不能縮減,但ext系列的可以擴展,也可以縮減

        縮減LV:(縮減不能在線進行,縮減lv要先卸載,先縮減邏輯邊界,也就是文件系統邊界,再縮減物理邊界,也就是lv)縮減LV有丟失數據風險,需要謹慎

            umount /dev/VG_NAME/LV_NAME  卸載

            e2fsck -f /dev/VG_NAME/LV_NAME    強制檢查文件系統

            resize2fs /dev/VG_NAME/LV_NAME  SIZE  縮減邏輯邊界至多大,單位MGT等

                如:resize2fs /dev/myvg/mylv 3G

            lvreduce  -L [-]SIZE /dev/VG_NAME/LV_NAME   縮減物理lv大小

                -L SIZE  表示縮減到多大

                -L -SIZE  表示在原有基礎上縮減多少

            mount /dev/VG_NAME/LV_NAME  /DIR   縮減完成,重新掛載

            注意:縮減LV有丟失數據風險,需要謹慎

        333.png

        當lv創建完成后,需要進行格式化創建文件系統,并掛載,才能使用

        例如:

            mke2fs -t ext4 -b 1024 -L LVTEST -o acl /dev/myvg/mylv

            mount /dev/myvg/mylv  /testdir/lvdir

    6、快照卷

        <1>快照卷原理:

        快照卷是對處于同一個vg下的lv創建一個快照邏輯卷,目的是為了對某個lv的數據進行備份,快照卷與邏輯卷一定要處于同一卷組,在創建完快照卷后,如果邏輯卷內的內容發生變化,則會把原始為發生變化的數據存放到快照卷中,這樣就保證了快照卷中的內容都處于創建快照卷那一刻的數據的狀態,然后對快照卷內的內容用copy或其他備份方式進行備份,這樣就實現了數據的備份。

        雖然我們說快照卷內的內容都是創建快照卷之后,邏輯卷中變化過的內容,但是在實際操作的過程中,會發現即使邏輯卷的數據沒有發生變化,但切換到快照卷的掛載目錄時,仍然能夠看到有與邏輯卷內的數據一樣的內容。其實,對于那些沒有變化的數據,快照卷內看到的文件的存儲位置依然是在邏輯卷內,為了起到備份的效果,映射到了快照卷內。但是對于創建快照卷之后,發生變化的數據,則原始數據會存儲在快照卷的存儲空間內,而變化后的數據存儲在了邏輯卷的存儲空間內。如此,即保證了快照卷的數據即是創建快照卷那一刻文件的狀態。

        通過上述快照卷的實現方式,可以得知,快照卷的大小,只需要保證從快照卷創建,到備份快照卷里面的數據這段時間內,原始數據可能發生變化的數據的大小,最大即為跟原始邏輯卷一樣大。

        

        <2>創建快照卷:

            lvcreate -L SIZE -p r -s -n SNAPSHOT_NAME  ORIGINAL_LV_NAME

                -L SIZE  指明快照卷的大小(在做備份這段時間可能發生的改變的數據量),可接受的單位是MGT等

                -p r   表示快照卷的屬性是只讀,一般快照卷用來做備份,備份過程中,快照卷不允許可寫

                -s  標明是在做快照卷

                -n  SNAPSHOT_NAME   標明快照卷的名稱

                ORIGINAL_LV_NAME   標明是對那個原卷做快照,如/dev/myvg/mylv

        例如:對之前的mylv做快照

            lvreate -L 2G -p r -s -n mysnap /dev/myvg/mylv

        <3>快照卷的掛載使用

            創建完快照卷,需要掛載才能使用

            mount /dev/myvg/mysnap  /testdir/testsnap

            比如原卷掛載在/backup中,snap掛載在/testdir/testsnap下,一旦快照卷創建完成,在原卷的掛載點中改變的文件,在快照卷的掛載點中是不會有的,此時就可以利用快照卷的掛載點里面的內容做備份了,如

            cp -pa /testdir/snapdir /nwc/back

            備份完成后,快照卷的使命完成,就可以卸載并刪除快照卷了

                umount /testdir/snapdir

                lvremove /dev/myvg/mysnap

        1.png

第六章    btrfs文件系統管理

    1、btrfs核心特性:

        多物理卷支持:一個文件系統,可以由多個底層物理卷組成,支持RAID,支持以聯機“增加”“修改”“刪除”

        寫時復制更新機制(CoW):復制、更新及替換指針,而非“就地”更新

        數據及元數據校驗碼機制:checksum

        子卷:sub_volume

        快照:支持快照的快照,增量快照機制

        透明壓縮機制

    2、創建btrfs文件系統:mkfs.btrfs(一般在多塊磁盤上創建btrfs,而不是在一塊磁盤的不同分區上創建)

        格式:mkfs.btrfs [OPTIONS] DEVICE

            -L LABEL 指定卷標

            -m raid0|raid1|raid5|raid10|single|dup 指明元數據存儲方式,由于btrfs底層默認支持raid,故可以定義元數據的存儲方式,是raid還是只存儲一份,還是做冗余存儲,默認是single

            -d raid0|raid1|raid5|raid10|single 指明數據存儲方式,由于btrfs底層默認支持raid,故可以定義數據的存儲方式,是raid還是只存儲一份,默認是single

            -O FEATURE1,FEATURE2…  指明創建文件系統時時,默認開啟哪些特性,可利用mkfs.btrfs -O list-all來查看支持的特性列表

        例如:mkfs.btrfs -L MyBtrfsTest /dev/sdb /dev/sdc

            btrfs filesystem show 可以查看當前系統上的btrfs文件系統的信息

    3、查看btrfs文件系統:btrfs filesystem 

        格式:btrfs filesystem <subcommand> <args>

        subcommand:

            df /PATH  顯示btrfs文件系統中掛載點的空間占用情況

            show [–mounted|–all-devices|PATH|UUID|DEVICE|LABEL] 顯示指定的文件系統相關信息,如已掛載的信息,所有設備的信息等,默認不指名,則顯示所有的

            label /DEVICE  [NEWLABEL] 顯示或修改設備的卷標,不加NEWLABEL則為顯示,如果指明NEWLABEL則為修改

            resize DEVICE:SIZE   可實現調整文件系統大小,支持的單位有KMG

        查看時,如果指明DEVICE,則指明創建文件系統時的任何一個設備都可以,因為他們都屬于同一個文件系統

        例如:btrfs filesystem show

        btrfs filesystem resize -10G  /testdir/btrfstest

        btrfs filesystem resize +10G  /testdir/btrfstest

        btrfs filesystem resize max  /testdir/btrfstest

        btrfs filesystem df /testdir/btrfstest

    4、掛載btrfs文件系統:mount

        mount -t btrfs DEVICE  /MOUNT_POINT

        DEVICE:為任意一個創建文件系統時的設備

        例如:mount -t btrfs /dev/sdb /testdir/btrfstest

        可利用掛載選項,啟用btrfs透明壓縮機制:

        mount -o compress={lzo|zlib}  /dev/sdb /testdir/btrfstest

    5、添加刪除底層磁盤進btrfs文件系統:btrfs device

        格式:btrfs device <subcommand> <args>

        subcommand:

            add   添加一塊設備到btrfs,支持在線進行

            delete   從btrfs里面刪除設備,支持在線進行

            scan   掃描設備

            ready   將設備標記為可用狀態

            stats

        例如:btrfs device add /dev/sdd /testdir/btrfstest

        btrfs device delete /dev/sdb  /testdir/btrfstest

    6、將btrfs的底層設備均衡存儲數據:btrfs balance

        格式: btrfs balance <subcommand>|<args>

        subcommand:

            start  :啟動均衡存儲

            stop :停止均衡存儲

            status :查看均衡存儲的狀態信息

            pause :暫停均衡存儲

            resume :繼續實施均衡存儲

        例如:btrfs balance start /testdir/btrfstest

    7、修改元數據和數據存儲的組織方式:(mkfs.btrfs里面-m和-d的相關信息的修改)

        語法:btrfs balance start {-d|-m|-s}convert=FILTER /MOUNT_POINT

            -d  表示修改數據的存儲組織方式,支持在線進行

            -m  表示修改元數據的存儲組織方式,支持在線進行

            -s  表示修改系統存儲的組織方式,支持在線進行

            FILTER:

                raid0、raid1、raid5、raid10、single、dup

            改變raid級別時,前提要有對應的多少塊磁盤,raid0 2塊,raid1 2塊,raid5 3塊,raid10 4塊 

        例如:btrfs balance start -dconvert=raid5 /testdir/btrfstest

    8、在btrfs上管理子卷:btrfs subvolume

        可理解為在現有的btrfs上在創建一個btrfs文件系統,單獨掛載使用

        格式:btrfs subvolume <subcommand> [args]

        subcommand:

            create:創建子卷

            btrfs subvolume  create /testdir/btrfstest/subdir

            相當于在父卷掛載點上創建一個子目錄

            上述例子表示創建一個名為subdir的子卷

            list:列出子卷

                btrfs subvolume list /testdir/btrfstest

            snapshot:做快照

            set-default:設置默認子卷

            get-default:查看默認子卷

        掛載子卷:

            當掛載時,如果指明的是父卷的掛載路徑,則父卷下屬的所有子卷都會被自動掛載,訪問時通過父卷的掛載點下的對應子目錄進行訪問,如果要單獨掛載某些子卷,則創建完子卷后,卸載父卷,然后再掛載子卷

            如果掛載父卷,則所有子卷下的內容都能被訪問到,但是如果單獨掛載子卷,則父卷上的內容就沒辦法正常訪問

            mount -o subvol=SUBVOLUME_NAME /DEVICE  /MOUNT_POINT

                 /DEVICE  :創建父卷時的任意一個設備都可以

                 /MOUNT_POINT: 掛載點不需與父卷在相同目錄下

            例如:mount -o subvol=subdir  /dev/sdc  /mnt/test

        查看子卷的詳細信息:

            show:查看給定子卷的詳細信息

            btrfs subvolume show /SUB_MOUNT_POINT

            例如:btrfs subvolume show /mnt/test

        刪除子卷:刪除子卷后,子卷上的數據就不能訪問了

            前提是要掛載父卷之后,才能刪除子卷

            例如:btrfs subvolume delete  /testdir/btrfstest/subdir

        對子卷創建快照:

            創建快照卷的時候,需要快照卷與子卷在同一個父卷下

            例如:btrfs subvolume snapshot  /testdir/btrfstest/subdir  /testdir/btrfstest/subdir_snapshot

                表示對/testdir/btrfstest/subdir,也就是subdir子卷,創建一個名為subdir_snapshot的快照卷

        當備份完成后,就可以刪除快照卷了

            btrfs subvolume delete /testdir/btrfstest/subdir_snapshot

    9、在btrfs文件系統上,對單個文件創建快照

        創建的位置最好在當前卷下屬的某個路徑上

        例如:卷下有個文件是test.txt,對該文件創建快照

            cp –reflink test.txt  test.txt_snap

    10、如何將ext4或ext3文件系統轉換成btrfs(不影響原有數據的情況下)

        <1>先將需要轉的ext文件系統umount,假設為/dev/sdc1

        <2>強制檢查文件系統,fsck -f  /dev/sdc1

        <3>轉換btrfs-convert /dev/sdc1

        <4>然后就可以利用 btrfs filesystem show來查看是否已經轉換成功

        <5>最后,正常進行掛載使用  mount /dev/sdc1  /test

        <6>正常使用原有文件

    11、將轉換后的btrfs再換回ext4文件系統

        btrfs-convert -r  /dev/sdc1

        再掛載,即可使用

第七章    高級磁盤管理實戰演練

    1、寫一個腳本,完成如下功能:
        (1) 列出當前系統識別到的所有磁盤設備
        (2) 如磁盤數量為1,則顯示其空間使用信息
        否則,則顯示最后一個磁盤上的空間使用信息

    #!/bin/bash    
    # Autor: nwc
    # Version: 2.0
    # CreateTime: 2016-08-24
    # Description: 
    
    disks=(`lsblk|grep -o "^sd[a-z]"|sort`)
    echo -e "\033[35msystem disk list is : ${disks[@]}\033[0m"
    i=$[${#disks[@]}-1]
    fdisk -l /dev/${disks[$i]}

    執行效果如下:

    blob.png  

    2、創建一個可用空間為1G的RAID1設備,文件系統為ext4,有一個空閑盤,開機可自動掛載至/backup目錄

        步驟:

        <1>fdisk創建三個大小為1G的分區,修改分區類型為fd,過程略過,結果如下

    blob.png

        <2>利用mdadm -C /dev/md2 -n 2 -x 1 -l 1 -a yes /dev/sd{b,c,d}1

    blob.png

    blob.png

        <3>導出raid配置文件

    blob.png

        <4>格式化創建文件系統

    blob.png

        <5>掛載,寫入/etc/fstab,注意要使用blkid看到的UUID進行掛載

    111.png

    3、創建由三塊硬盤組成的可用空間為2G的RAID5設備,要求其chunk大小為256k,文件系統為ext4,開機可自動掛載至/mydata目錄

        步驟:

        <1>fdisk創建3個1G的磁盤,更改分區格式為fd,過程略過,效果如下:

    blob.png

        <2>mdadm -C /dev/md5 -n 3 -l 5 -c 256 -a yes /dev/sd{b,c,d}1  創建raid設備

    blob.png

        <3>導出raid的配置文件,放置系統重啟或停止raid后重載raid時無法識別

    blob.png 

        <4>格式化文件系統

    blob.png

        <5>編輯開機自動掛載配置文件,實現自動掛載,注意用blkid識別到的UUID進行掛載

    blob.png

    

    4、創建和擴展邏輯卷

        環境:centos6.8,利用sdb1和sdc一個分區,一個完成的磁盤組建pv

        步驟:

        <1>利用fdisk對sdb進行分區,將分區類型改為8e

    blob.png

        <2>創建pv

    blob.png

        <3>創建vg

    blob.png

        <4>創建lv

    blob.png

        <5>格式化創建文件系統

    blob.png

        <6>掛載使用

    blob.png

        <7>擴展邏輯卷(支持在線擴展,確保vg里面有空間供lv擴展,否則就要加pv,擴展vg再擴展lv)

            先擴展邏輯卷大小

    blob.png

            再擴展邏輯卷上文件系統大小

    blob.png

        

    5、創建一個至少有兩個PV組成的大小為20G的名為testvg的VG;要求PE大小為16MB, 而后在卷組中創建大小為5G的邏輯卷testlv;掛載至/users目錄

    [root@localhost ~]# lsblk    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0     11:0    1 1024M  0 rom  
    sdb      8:16   0   20G  0 disk 
    └─sdb1   8:17   0    5G  0 part 
    sda      8:0    0   20G  0 disk 
    ├─sda1   8:1    0  200M  0 part /boot
    ├─sda2   8:2    0    2G  0 part /home
    ├─sda3   8:3    0    2G  0 part /var
    ├─sda4   8:4    0    1K  0 part 
    ├─sda5   8:5    0 1000M  0 part [SWAP]
    └─sda6   8:6    0 14.9G  0 part /
    sdd      8:48   0   10G  0 disk 
    sdc      8:32   0   10G  0 disk 
    sde      8:64   0   10G  0 disk 
    [root@localhost ~]# 
    [root@localhost ~]# pvcreate /dev/sd{c,d}   //利用sdc、sdd兩塊磁盤做pv,如果用分區,需要改分區類型為8e
      Physical volume "/dev/sdc" successfully created
      Physical volume "/dev/sdd" successfully created
    [root@localhost ~]# pvs
      PV         VG   Fmt  Attr PSize  PFree 
      /dev/sdc        lvm2 ---- 10.00g 10.00g
      /dev/sdd        lvm2 ---- 10.00g 10.00g
    [root@localhost ~]# vgcreate -s 16M testvg /dev/sdc /dev/sdd   //創建vg,指定PE大小為16M
      Volume group "testvg" successfully created
    [root@localhost ~]# vgs
      VG     #PV #LV #SN Attr   VSize  VFree 
      testvg   2   0   0 wz--n- 19.97g 19.97g
    [root@localhost ~]# vgdisplay 
      --- Volume group ---
      VG Name               testvg
      System ID             
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  2
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                1
      Open LV               1
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               19.97 GiB
      PE Size               16.00 MiB
      Total PE              1278
      Alloc PE / Size       320 / 5.00 GiB
      Free  PE / Size       958 / 14.97 GiB
      VG UUID               K2QPzO-Vp6T-DeIV-PWqS-9soO-uSKA-ooc9eN
    [root@localhost ~]# lvcreate -L 5G -n testlv testvg   //創建lv,大小為5G
      Logical volume "testlv" created.
    [root@localhost ~]# lvs
      LV     VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      testlv testvg -wi-a----- 5.00g                                                    
    [root@localhost ~]# mkdir /testdir/users
    [root@localhost ~]# mke2fs -t ext4 -L "TESTLV" /dev/testvg/testlv     //格式化lv創建文件系統
    mke2fs 1.41.12 (17-May-2010)
    文件系統標簽=TESTLV
    操作系統:Linux
    塊大小=4096 (log=2)
    分塊大小=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    327680 inodes, 1310720 blocks
    65536 blocks (5.00%) reserved for the super user
    第一個數據塊=0
    Maximum filesystem blocks=1342177280
    40 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
    
    正在寫入inode表: 完成                            
    Creating journal (32768 blocks): 完成
    Writing superblocks and filesystem accounting information: 完成
    
    This filesystem will be automatically checked every 21 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    [root@localhost ~]# mount /dev/testvg/testlv /testdir/users/       //掛載
    [root@localhost ~]# df -h      //驗證是否掛載成功
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda6              15G  2.9G   11G  21% /
    tmpfs                 491M     0  491M   0% /dev/shm
    /dev/sda1             190M   33M  147M  19% /boot
    /dev/sda2             1.9G   62M  1.8G   4% /home
    /dev/sda3             1.9G  191M  1.7G  11% /var
    /dev/mapper/testvg-testlv
                          4.8G   10M  4.6G   1% /testdir/users
    [root@localhost ~]#

    6、新建用戶archlinux,要求其家目錄為/users/archlinux,而后su切換至archlinux用戶,復制/etc/pam.d目錄至自己的家目錄

    [root@localhost ~]# useradd archlinux -d /testdir/users/archlinux     //創建用戶,指定家目錄
    [root@localhost ~]# tail -1 /etc/passwd
    archlinux:x:516:4336::/testdir/users/archlinux:/bin/bash
    [root@localhost ~]# su - archlinux
    [archlinux@localhost ~]$ cp -r /etc/pam.d .
    [archlinux@localhost ~]$ ls
    pam.d
    [archlinux@localhost ~]$ ls -a
    .  ..  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [archlinux@localhost ~]$

    7、擴展testlv至7G,要求archlinux用戶的文件不能丟失

    [root@localhost ~]# lvextend -L 7G /dev/testvg/testlv      //擴展lv大小
      Size of logical volume testvg/testlv changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents).
      Logical volume testlv successfully resized.
    [root@localhost ~]# resize2fs /dev/testvg/testlv    //擴展文件系統大小
    resize2fs 1.41.12 (17-May-2010)
    Filesystem at /dev/testvg/testlv is mounted on /testdir/users; on-line resizing required
    old desc_blocks = 1, new_desc_blocks = 1
    Performing an on-line resize of /dev/testvg/testlv to 1835008 (4k) blocks.
    The filesystem on /dev/testvg/testlv is now 1835008 blocks long.
    
    [root@localhost ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda6              15G  2.9G   11G  21% /
    tmpfs                 491M     0  491M   0% /dev/shm
    /dev/sda1             190M   33M  147M  19% /boot
    /dev/sda2             1.9G   62M  1.8G   4% /home
    /dev/sda3             1.9G  191M  1.7G  11% /var
    /dev/mapper/testvg-testlv
                          6.8G   12M  6.5G   1% /testdir/users
    [root@localhost ~]# su - archlinux    //驗證文件是否被破壞
    [archlinux@localhost ~]$ ls -a
    .   .bash_history  .bash_profile  .gnome2
    ..  .bash_logout   .bashrc        pam.d
    [archlinux@localhost ~]$

    8、收縮testlv至3G,要求archlinux用戶的文件不能丟失

    [root@localhost ~]# du -sh /testdir/users/   //驗證掛載目錄的大小是否小于希望縮減到的大小
    192K	/testdir/users/
    [root@localhost ~]# cp -a /testdir/users/ /backup/           //縮減lv時,建議先將lv里面的內容進行備份
    [root@localhost ~]# ls -a /backup/users/archlinux/
    .   .bash_history  .bash_profile  .gnome2
    ..  .bash_logout   .bashrc        pam.d
    [root@localhost ~]# umount /dev/testvg/testlv          //卸載,縮減lv必須先卸載
    [root@localhost ~]# fsck -f /dev/testvg/testlv         //強制檢查,縮減lv必須強制檢查文件系統
    fsck from util-linux-ng 2.17.2
    e2fsck 1.41.12 (17-May-2010)
    第一步: 檢查inode,塊,和大小
    第二步: 檢查目錄結構
    第3步: 檢查目錄連接性
    Pass 4: Checking reference counts
    第5步: 檢查簇概要信息
    TESTLV: 59/458752 files (0.0% non-contiguous), 64490/1835008 blocks
    [root@localhost ~]# resize2fs /dev/testvg/testlv 3G                 //縮減文件系統大小
    resize2fs 1.41.12 (17-May-2010)
    Resizing the filesystem on /dev/testvg/testlv to 786432 (4k) blocks.
    The filesystem on /dev/testvg/testlv is now 786432 blocks long.
    
    [root@localhost ~]# lvreduce -L 3G /dev/testvg/testlv              //縮減lv大小
      WARNING: Reducing active logical volume to 3.00 GiB.
      THIS MAY DESTROY YOUR DATA (filesystem etc.)
    Do you really want to reduce testvg/testlv? [y/n]: y
      Size of logical volume testvg/testlv changed from 7.00 GiB (448 extents) to 3.00 GiB (192 extents).
      Logical volume testlv successfully resized.
    [root@localhost ~]# mount /dev/testvg/testlv /testdir/users/          //重新掛載
    [root@localhost ~]# su - archlinux
    [archlinux@localhost ~]$ ls -a                 //驗證文件是否被損壞
    .   .bash_history  .bash_profile  .gnome2
    ..  .bash_logout   .bashrc        pam.d
    [archlinux@localhost ~]$

    9、對testlv創建快照,并嘗試基于快照備份數據,驗正快照的功能

    [root@localhost ~]# lvcreate -L 500M -s -n testlv_snap -p r /dev/testvg/testlv      //創建快照卷
      Rounding up size to full physical extent 512.00 MiB
      Logical volume "testlv_snap" created.
    [root@localhost ~]# lvdisplay /dev/testvg/testlv_snap    //查看快照卷詳情
      --- Logical volume ---
      LV Path                /dev/testvg/testlv_snap
      LV Name                testlv_snap
      VG Name                testvg
      LV UUID                tuewoS-utZq-tIfv-KOLn-hhbl-g847-VIgcu3
      LV Write Access        read only
      LV Creation host, time localhost.localdomain, 2016-08-31 14:14:36 +0800
      LV snapshot status     active destination for testlv
      LV Status              available
      # open                 0
      LV Size                3.00 GiB
      Current LE             192
      COW-table size         512.00 MiB
      COW-table LE           32
      Allocated to snapshot  0.00%
      Snapshot chunk size    4.00 KiB
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:3
       
    [root@localhost ~]# mount /dev/testvg/testlv_snap  /backup/     //掛載快照卷,注意快照卷掛載時,不需要實現格式化
    mount: block device /dev/mapper/testvg-testlv_snap is write-protected, mounting read-only
    [root@localhost ~]# ls -a /testdir/users/archlinux/       //驗證初始時快照卷與原卷內容
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [root@localhost ~]# ls -a /backup/archlinux/
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [root@localhost ~]# rm -rf /testdir/users/archlinux/pam.d/      //破壞原卷內容,驗證快照卷是否發生變化
    [root@localhost ~]# ls -a /testdir/users/archlinux/
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2
    [root@localhost ~]# ls -a /backup/archlinux/
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [root@localhost ~]#

原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/41824

(2)
M20-1倪文超M20-1倪文超
上一篇 2016-08-30 15:18
下一篇 2016-08-30 15:48

相關推薦

  • Ansible 詳細用法說明

    Ansible 一、概述 運維工具按需不需要有代理程序來劃分的話分兩類: agent(需要有代理工具):基于專用的agent程序完成管理功能,puppet, func, zabbix agentless(無須代理工具):基于ssh服務完成管理,ansible, fabric 二、簡介   Ansible是一個簡單的自動化運維管理工具,基于Python語言實現…

    2016-11-07
  • keepalive

    HA Cluster: 集群類型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP SPoF: Single Point of Failure 系統可用性的公式:A=MTBF/(MTBF+MTTR)(0,1), 95%幾個9(指標): 99%, …, 99.999%,99.9999%;99%:…

    Linux干貨 2017-05-22
  • 系統管理之網絡管理

    今天給大家分享一些網絡方面的知識,,這塊的知識很重要哦,都是涉及網絡最底層的鏈路和協議,是我們學習大型服務的基礎,和前提.希望大家努力理解這方面的內容,今天的內容大概有這幾方面: 1.計算機網絡概念 2.計算機網絡體系結構 3.物理層 4.數據鏈路層 5.網絡層 6.IP地址及子網 7.傳輸層 8.應用層 計算機網絡概念 計算機網絡是個發展中的概念和技術,具…

    Linux干貨 2016-09-05
  • Linux下btrfs子卷的掛載

        對btrfs文件系統的補充:     btrfs文件手動掛載自不必多說,但若想btrfs文件系統開機自動掛載,該如何實現呢?     其實只需添加掛載選項即可,如下: UUID=c99895c8-5b14-4276-80c7-ecf…

    Linux干貨 2015-12-19
  • Hadoop hdfs 分布式文件系統

    Hadoop簡介:一個分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件…

    Linux干貨 2017-04-19

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-09-01 12:17

    文章對當天所學的知識進行了詳細的總結與梳理,通過練習鞏固了學到的東西,整篇博客能讓人看到很多專業性所在,也能看出很用心的地方,革命尚未成功,同志仍需努力啊,加油!

欧美性久久久久