首頁 > 軟體

Linux中建立大檔案並作為檔案系統使用

2020-06-16 16:33:37

  在Linux系統的使用過程中,有時候會遇到諸如某個磁碟分割區的大小不夠用了,導致其下的檔案系統不能正常寫入資料。亦或者是系統swap分割區太小,不夠用或者不滿足條件而導致的其他一系列問題。如果我們系統上掛載的有富餘的磁碟空間,這樣就簡單多了,直接在現成的磁碟上劃出一個分割區,格式化並掛載就完事了。但是也有些時候限於條件,沒有富餘的磁碟空間,怎麼辦的呢?我們可以在現有的系統中,看看有沒有其他分割區的空間比較大,並且分出去一部分後,仍然不影響改分割區系統的正常使用。如果存在這種情況,就可以實現間接的擴充套件磁碟空間了。

  1,我們需要先在有富餘空間的磁碟分割區上建立一個大檔案,檔案的大小根據你的實際需要和所要劃出空間分割區實際大小來決定。建立大檔案,可以使用如下3個命令:

    1.1 dd

      建立大檔案首選的會是dd命令,dd是 device driver 的縮寫,可以用來讀取裝置、檔案中的內容,並原封不動地複製到指定位置。因此dd本質上是copy一個檔案副本,

    它強制你編寫每個資料塊,並初始化檔案內容,但是初始化會佔用大量的I / O時間,因此使用dd命令建立大檔案的速度是比較緩慢的。使用dd建立大檔案的命令如下:

      dd if=/dev/zero of=/home/disk0 bs=2G count=1

    這個命令將在/home根目錄下建立一個名為disk0的空檔案,其中用到了如下四個選項:

      if=檔名:指定輸入檔名或者裝置名,如果省略“if=檔名”,則表示從標準輸入讀取。

      of=檔名:指定輸出檔名或者裝置名,如果省略“of=檔名”,則表示寫到標準輸出。

      bs:指定單個檔案的塊block大小。

      count:想要建立檔案的個數。

    1.2 fallocate

      fallocate的功能是為檔案預分配物理空間,而不是生成一個空洞檔案,fallocate分配的空間在磁碟的磁區上是連續的,它減少後續寫入和讀取檔案時的磁碟尋道開銷;

    並且是迅速直接佔用空間,而不是想空洞檔案那樣“假裝”戰=佔有那麼多空間,這樣就可以保證隨著磁碟空間的使用,而不會出現該段磁碟空間不足。由於fallocate

    並不是標準的posix介面,並不是所有的檔案系統都是支援的,目前主流的ext4和xfs都是可以的。

      fallocate -l 20G /home/disk00

      -l:--length,指定分配檔案的長度,即檔案的大小;

      disk00:所分配檔名稱

    1.3 truncate

      truncate和lseek是將檔案的末尾位置“擴充套件到”一個固定位置而生成的一個空洞檔案,也即是稀疏檔案。該檔案並不佔用實際磁碟空間,只是邏輯上看起來那麼大而已。

    使用ls -l命令可以檢視其邏輯大小,即你希望分配的大小。使用du命令可以看到其實際占用的磁碟空間大小。使用od -c命令可以看到檔案中間是用“”填充的。

      truncate -s 10G /home/disk000

      -s:指定檔案的大小

  2,將第一步中得到的大檔案進行格式化並掛載到檔案系統

    由上述可知,如果所要分配的檔案大小不大,比如2G以下,我們可以優選dd命令,當檔案大小非常大時,就可以使用fallocate了,由於truncate命令生成的檔案並不是看起

  來那麼大,如果非必要,我們還是盡量不選它。

    比如我們使用dd或者fallocate建立一個1G大小的檔案:
    dd -if=/dev/zero of=/home/disk00 bs=1024 count=1000000

    fallocate -l 1G /home/disk00

    2.1 擴充套件一般的檔案系統空間

      2.1.1 格式化

      以格式化為ext4檔案系統為例

      mkfs.ext4 /home/disk00      ----執行該命令後,系統會提示“disk00 is not a block special device”,直接輸入“y”確認繼續就行。

      2.1.2 掛載到檔案系統

      由於disk00並不是一個block device,所以掛載到檔案系統時並不能像普通磁碟分割區、格式化後那樣直接掛在,我們需要用到loop偽裝置。在執行loop掛載前,我們需要

    確認系統中有哪些loopback裝置,並且那些是已經被使用的。

      確認系統中有那些loopback裝置:

        ls -l /dev/loop*

      確認那些loopback是已經被使用的:

        cat /proc/mount

      確認上述兩個事項後,就可以執行如下掛在命令:

        mount -o loop=/dev/loop0 /home/disk00 /opt/backup_DB

        -o loop=:使用 loop 模式用來將一個檔案當成硬碟分割掛上系統

      2.1.3 將掛載關係寫入/etc/fstab,防止系統重新啟動後掛載關係丟失。

        echo "/home/disk00 /opt/backup_DB ext4 defaults,loop 0 0" >> /etc/fstab

    2.2 掛載交換分割區

      2.2.1 格式化,將其變成一個swap檔案

        mkswap /home/disk00

      2.2.2 啟用這個swap檔案

        swapon /home/disk00

      2.2.3 寫入/etc/fstab,在系統重新啟動時能夠自動掛載

        echo "/home/disk00 swap swap defaults 0 0" >> /etc/fstab

  3,操作範例

    下面以我一個專案中的實際操作為例進行說明:

    我們的MySQL資料庫安裝在/home分割區下,該分割區大小為3.5T,由於我們沒有外掛磁陣,也沒有獨立的備份伺服器,所以只能將資料庫的備份存放在本地,遵循備份和原始

  資料不能放在同一分割區,我們把備份放在了/opt分割區,該分割區大小為50G。我們庫目前大小為12G,每天產生的資料量為350-400M之間,每兩週資料總量大致增加1G。備份策

  略是每週一全備,然後週二到週日都是基於週一的全備進行增量(這樣的目的是恢復時方便)。備份的保留策略是全備保留3週,之前的全備進行刪除;每週的增量在下一週一

  全備前打包壓縮轉移到/home/old_DB_backup下。由於資料量不斷增多,大概到每週的週六時/opt的占用量就已經達到接近90%了,所以我們考慮將/opt下暫時存放增量備份的

  目錄進行單獨掛載一個分割區進行擴容,減輕/opt分割區的空間壓力,方案操作如下:

    3.1 由於/home分割區的目錄非常大,所以選取/home分割區做為分割物件。考慮到後續資料量增加,給予30G空間擴充套件:

      fallocate -l 30G /home/old_DB_backup/backup_disk/disk0_in

    3.2 我們的檔案系統為ext4,所以將改資料檔案格式化為ext4

      mkfs.ext4 /home/old_DB_backup/backup_disk/disk0_in

    3.3 掛載到待增加獨立空間的增量備份目錄

      mount -o loop=/dev/loop0 /home/old_DB_backup/backup_disk/disk0_in /opt/DB_backup/incremental_backup

    3.4 掛載關係寫入/etc/fstab

      echo "/home/old_DB_backup/backup_disk/disk0_in /opt/DB_backup/incremental_backup ext4 defaults,loop, 0 0" >> /etc/fstab


IT145.com E-mail:sddin#qq.com