Linux系统中创建大文件,并作为文件系统使用
在LInux系統(tǒng)的使用過程中,有時候會遇到諸如某個磁盤分區(qū)的大小不夠用了,導(dǎo)致其下的文件系統(tǒng)不能正常寫入數(shù)據(jù)。亦或者是系統(tǒng)swap分區(qū)太小,不夠用或者不滿足條件而導(dǎo)致的其他一系列問題。如果我們系統(tǒng)上掛載的有富余的磁盤空間,這樣就簡單多了,直接在現(xiàn)成的磁盤上劃出一個分區(qū),格式化并掛載就完事了。但是也有些時候限于條件,沒有富余的磁盤空間,怎么辦的呢?我們可以在現(xiàn)有的系統(tǒng)中,看看有沒有其他分區(qū)的空間比較大,并且分出去一部分后,仍然不影響改分區(qū)系統(tǒng)的正常使用。如果存在這種情況,就可以實現(xiàn)間接的擴展磁盤空間了。
1,我們需要先在有富余空間的磁盤分區(qū)上創(chuàng)建一個大文件,文件的大小根據(jù)你的實際需要和所要劃出空間分區(qū)實際大小來決定。創(chuàng)建大文件,可以使用如下3個命令:
1.1 dd
創(chuàng)建大文件首選的會是dd命令,dd是 device driver 的縮寫,可以用來讀取設(shè)備、文件中的內(nèi)容,并原封不動地復(fù)制到指定位置。因此dd本質(zhì)上是copy一個文件副本,
它強制你編寫每個數(shù)據(jù)塊,并初始化文件內(nèi)容,但是初始化會占用大量的I / O時間,因此使用dd命令創(chuàng)建大文件的速度是比較緩慢的。使用dd創(chuàng)建大文件的命令如下:
dd if=/dev/zero of=/home/disk0 bs=2G count=1
這個命令將在/home根目錄下創(chuàng)建一個名為disk0的空文件,其中用到了如下四個選項:
if=文件名:指定輸入文件名或者設(shè)備名,如果省略“if=文件名”,則表示從標(biāo)準(zhǔn)輸入讀取。
of=文件名:指定輸出文件名或者設(shè)備名,如果省略“of=文件名”,則表示寫到標(biāo)準(zhǔn)輸出。
bs:指定單個文件的塊block大小。
count:想要創(chuàng)建文件的個數(shù)。
1.2 fallocate
fallocate的功能是為文件預(yù)分配物理空間,而不是生成一個空洞文件,fallocate分配的空間在磁盤的扇區(qū)上是連續(xù)的,它減少后續(xù)寫入和讀取文件時的磁盤尋道開銷;
并且是迅速直接占用空間,而不是想空洞文件那樣“假裝”戰(zhàn)=占有那么多空間,這樣就可以保證隨著磁盤空間的使用,而不會出現(xiàn)該段磁盤空間不足。由于fallocate
并不是標(biāo)準(zhǔn)的posix接口,并不是所有的文件系統(tǒng)都是支持的,目前主流的ext4和xfs都是可以的。
fallocate -l 20G /home/disk00
-l:--length,指定分配文件的長度,即文件的大小;
disk00:所分配文件名稱
1.3 truncate
truncate和lseek是將文件的末尾位置“擴展到”一個固定位置而生成的一個空洞文件,也即是稀疏文件。該文件并不占用實際磁盤空間,只是邏輯上看起來那么大而已。
使用ls -l命令可以查看其邏輯大小,即你希望分配的大小。使用du命令可以看到其實際占用的磁盤空間大小。使用od -c命令可以看到文件中間是用“\0”填充的。
truncate -s 10G /home/disk000
-s:指定文件的大小
2,將第一步中得到的大文件進行格式化并掛載到文件系統(tǒng)
由上述可知,如果所要分配的文件大小不大,比如2G以下,我們可以優(yōu)選dd命令,當(dāng)文件大小非常大時,就可以使用fallocate了,由于truncate命令生成的文件并不是看起
來那么大,如果非必要,我們還是盡量不選它。
比如我們使用dd或者fallocate創(chuàng)建一個1G大小的文件:
dd -if=/dev/zero of=/home/disk00 bs=1024 count=1000000
fallocate -l 1G /home/disk00
2.1 擴展一般的文件系統(tǒng)空間
2.1.1 格式化
以格式化為ext4文件系統(tǒng)為例
mkfs.ext4 /home/disk00? ? ? ?----執(zhí)行該命令后,系統(tǒng)會提示“disk00 is not a block special device”,直接輸入“y”確認(rèn)繼續(xù)就行。
2.1.2 掛載到文件系統(tǒng)
由于disk00并不是一個block device,所以掛載到文件系統(tǒng)時并不能像普通磁盤分區(qū)、格式化后那樣直接掛在,我們需要用到loop偽設(shè)備。在執(zhí)行l(wèi)oop掛載前,我們需要
確認(rèn)系統(tǒng)中有哪些loopback設(shè)備,并且那些是已經(jīng)被使用的。
確認(rèn)系統(tǒng)中有那些loopback設(shè)備:
ls -l /dev/loop*
確認(rèn)那些loopback是已經(jīng)被使用的:
cat /proc/mount
確認(rèn)上述兩個事項后,就可以執(zhí)行如下掛在命令:
mount -o loop=/dev/loop0 /home/disk00 /opt/backup_DB
-o loop=:使用 loop 模式用來將一個檔案當(dāng)成硬盤分割掛上系統(tǒng)
2.1.3 將掛載關(guān)系寫入/etc/fstab,防止系統(tǒng)重啟后掛載關(guān)系丟失。
echo "/home/disk00 /opt/backup_DB ext4 defaults,loop 0 0" >> /etc/fstab
2.2 掛載交換分區(qū)
2.2.1 格式化,將其變成一個swap文件
mkswap /home/disk00
2.2.2 啟用這個swap文件
swapon /home/disk00
2.2.3 寫入/etc/fstab,在系統(tǒng)重啟時能夠自動掛載
echo "/home/disk00 swap swap defaults 0 0" >> /etc/fstab
3,操作實例
下面以我一個項目中的實際操作為例進行說明:
我們的MySQL數(shù)據(jù)庫安裝在/home分區(qū)下,該分區(qū)大小為3.5T,由于我們沒有外掛磁陣,也沒有獨立的備份服務(wù)器,所以只能將數(shù)據(jù)庫的備份存放在本地,遵循備份和原始
數(shù)據(jù)不能放在同一分區(qū),我們把備份放在了/opt分區(qū),該分區(qū)大小為50G。我們庫目前大小為12G,每天產(chǎn)生的數(shù)據(jù)量為350-400M之間,每兩周數(shù)據(jù)總量大致增加1G。備份策
略是每周一全備,然后周二到周日都是基于周一的全備進行增量(這樣的目的是恢復(fù)時方便)。備份的保留策略是全備保留3周,之前的全備進行刪除;每周的增量在下一周一
全備前打包壓縮轉(zhuǎn)移到/home/old_DB_backup下。由于數(shù)據(jù)量不斷增多,大概到每周的周六時/opt的占用量就已經(jīng)達到接近90%了,所以我們考慮將/opt下暫時存放增量備份的
目錄進行單獨掛載一個分區(qū)進行擴容,減輕/opt分區(qū)的空間壓力,方案操作如下:
3.1 由于/home分區(qū)的目錄非常大,所以選取/home分區(qū)做為分割對象??紤]到后續(xù)數(shù)據(jù)量增加,給予30G空間擴展:
fallocate -l 30G /home/old_DB_backup/backup_disk/disk0_in
3.2 我們的文件系統(tǒng)為ext4,所以將改數(shù)據(jù)文件格式化為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 掛載關(guān)系寫入/etc/fstab
echo "/home/old_DB_backup/backup_disk/disk0_in?/opt/DB_backup/incremental_backup ext4 defaults,loop, 0 0" >> /etc/fstab
轉(zhuǎn)載于:https://www.cnblogs.com/Clonglegs/p/11189714.html
總結(jié)
以上是生活随笔為你收集整理的Linux系统中创建大文件,并作为文件系统使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AttributeError: 'dic
- 下一篇: SQL*Plus 系统变量之15 - D