如何在 Linux 上建立和使用交換檔案

2019-09-14 19:07:00

本教學討論了 Linux 中交換檔案的概念,為什麼使用它以及它相對於傳統交換分割區的優勢。你將學習如何建立交換檔案和調整其大小。

什麼是 Linux 的交換檔案?

交換檔案允許 Linux 將磁碟空間模擬為記憶體。當你的系統開始耗盡記憶體時,它會使用交換空間將記憶體的一些內容交換到磁碟空間上。這樣釋放了記憶體,為更重要的進程服務。當記憶體再次空閒時,它會從磁碟交換回資料。我建議閱讀這篇文章,了解 Linux 上的交換空間的更多內容

傳統上,交換空間是磁碟上的一個獨立分割區。安裝 Linux 時,只需建立一個單獨的分割區進行交換。但是這種趨勢在最近幾年發生了變化。

使用交換檔案,你不再需要單獨的分割區。你會根目錄下建立一個檔案,並告訴你的系統將其用作交換空間就行了。

使用專用的交換分割區,在許多情況下,調整交換空間的大小是一個可怕而不可能的任務。但是有了交換檔案,你可以隨意調整它們的大小。

最新版本的 Ubuntu 和其他一些 Linux 發行版已經開始 預設使用交換檔案。甚至如果你沒有建立交換分割區,Ubuntu 也會自己建立一個 1GB 左右的交換檔案。

讓我們看看交換檔案的更多資訊。

檢查 Linux 的交換空間

在你開始新增交換空間之前,最好檢查一下你的系統中是否已經有了交換空間。

你可以用Linux 上的 free 命令檢查它。就我而言,我的戴爾 XPS有 14GB 的交換容量。

free -h              total        used        free      shared  buff/cache   availableMem:           7.5G        4.1G        267M        971M        3.1G        2.2GSwap:           14G          0B         14G

free 命令給出了交換空間的大小,但它並沒有告訴你它是真實的交換分割區還是交換檔案。swapon 命令在這方面會更好。

swapon --showNAME           TYPE       SIZE USED PRIO/dev/nvme0n1p4 partition 14.9G   0B   -2

如你所見,我有 14.9GB 的交換空間,它在一個單獨的分割區上。如果是交換檔案,型別應該是 file 而不是 partition

swapon --showNAME      TYPE SIZE USED PRIO/swapfile file   2G   0B   -2

如果你的系統上沒有交換空間,它應該顯示如下內容:

free -h              total        used        free      shared  buff/cache   availableMem:           7.5G        4.1G        267M        971M        3.1G        2.2GSwap:           0B          0B         0B

swapon 命令不會顯示任何輸出。

在 Linux 上建立交換檔案

如果你的系統沒有交換空間,或者你認為交換空間不足,你可以在 Linux 上建立交換檔案。你也可以建立多個交換檔案。

讓我們看看如何在 Linux 上建立交換檔案。我在本教學中使用 Ubuntu 18.04,但它也應該適用於其他 Linux 發行版本。

步驟 1:建立一個新的交換檔案

首先,建立一個具有所需交換空間大小的檔案。假設我想給我的系統增加 1GB 的交換空間。使用fallocate 命令建立大小為 1GB 的檔案。

sudo fallocate -l 1G /swapfile

建議只允許 root 使用者讀寫該交換檔案。當你嘗試將此檔案用於交換區域時,你甚至會看到類似“不安全許可權 0644,建議 0600”的警告。

sudo chmod 600 /swapfile

請注意,交換檔案的名稱可以是任意的。如果你需要多個交換空間,你可以給它任何合適的名稱,如 swap_file_1swap_file_2 等。它們只是一個預定義大小的檔案。

步驟 2:將新檔案標記為交換空間

你需要告訴 Linux 系統該檔案將被用作交換空間。你可以用 mkswap 工具做到這一點。

sudo mkswap /swapfile

你應該會看到這樣的輸出:

Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)no label, UUID=7e1faacb-ea93-4c49-a53d-fb40f3ce016a

步驟 3:啟用交換檔案

現在,你的系統知道檔案 swapfile 可以用作交換空間。但是還沒有完成。你需要啟用該交換檔案,以便系統可以開始使用該檔案作為交換。

sudo swapon /swapfile

現在,如果你檢查交換空間,你應該會看到你的 Linux 系統會識別並使用它作為交換空間:

swapon --showNAME       TYPE   SIZE USED PRIO/swapfile  file 1024M   0B   -2

步驟 4:讓改變持久化

迄今為止你所做的一切都是暫時的。重新啟動系統,所有更改都將消失。

你可以通過將新建立的交換檔案新增到 /etc/fstab 檔案來使更改持久化。

/etc/fstab 檔案進行任何更改之前,最好先進行備份。

sudo cp /etc/fstab /etc/fstab.back

現在將以下行新增到 /etc/fstab 檔案的末尾:

/swapfile none swap sw 0 0

你可以使用命令列文字編輯器手動操作,或者使用以下命令:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

現在一切都準備好了。即使在重新啟動你的 Linux 系統後,你的交換檔案也會被使用。

調整 swappiness 引數

swappiness 引數決定了交換空間的使用頻率。swappiness 值的範圍從 0 到 100。較高的值意味著交換空間將被更頻繁地使用。

Ubuntu 桌面的預設的 swappiness 是 60,而伺服器的預設 swappiness 是 1。你可以使用以下命令檢查 swappiness

cat /proc/sys/vm/swappiness

為什麼伺服器應該使用低的 swappiness 值?因為交換空間比記憶體慢,為了獲得更好的效能,應該盡可能多地使用記憶體。在伺服器上,效能因素至關重要,因此 swappiness 應該盡可能低。

你可以使用以下系統命令動態更改 swappiness

sudo sysctl vm.swappiness=25

這種改變只是暫時的。如果要使其永久化,可以編輯 /etc/sysctl.conf 檔案,並在檔案末尾新增swappiness 值:

vm.swappiness=25

在 Linux 上調整交換空間的大小

在 Linux 上有幾種方法可以調整交換空間的大小。但是在你看到這一點之前,你應該了解一些關於它的事情。

當你要求系統停止將交換檔案用於交換空間時,它會將所有資料(確切地說是記憶體頁)傳輸回記憶體。所以你應該有足夠的空閒記憶體,然後再停止交換。

這就是為什麼建立和啟用另一個臨時交換檔案是一個好的做法的原因。這樣,當你關閉原來的交換空間時,你的系統將使用臨時交換檔案。現在你可以調整原來的交換空間的大小。你可以手動刪除臨時交換檔案或留在那裡,下次啟動時會自動刪除(LCTT 譯註:存疑?)。

如果你有足夠的可用記憶體或者建立了臨時交換空間,那就關閉你原來的交換檔案。

sudo swapoff /swapfile

現在你可以使用 fallocate 命令來更改檔案的大小。比方說,你將其大小更改為 2GB:

sudo fallocate -l 2G /swapfile

現在再次將檔案標記為交換空間:

sudo mkswap /swapfile

並再次啟用交換檔案:

sudo swapon /swapfile

你也可以選擇同時擁有多個交換檔案。

刪除 Linux 中的交換檔案

你可能有不在 Linux 上使用交換檔案的原因。如果你想刪除它,該過程類似於你剛才看到的調整交換大小的過程。

首先,確保你有足夠的空閒記憶體。現在關閉交換檔案:

sudo swapoff /swapfile

下一步是從 /etc/fstab 檔案中刪除相應的條目。

最後,你可以刪除該檔案來釋放空間:

sudo rm /swapfile

你用了交換空間了嗎?

我想你現在已經很好地理解了 Linux 中的交換檔案概念。現在,你可以根據需要輕鬆建立交換檔案或調整它們的大小。

如果你對這個話題有什麼要補充的或者有任何疑問,請在下面留下評論。