星期五, 7月 03, 2020

硬碟空間不足?用OverlayFS來整合新硬碟空間

想到昨天還前天朋友問的,說伺服器的硬碟空間沒了,買了新的硬碟來用,有沒有辦法用一個比較便利的方法來掛載使用。我那時回答是說,得掛載到新的資料夾,再使用 symbolic link 方式去處理,今天看到 overlayfs,覺得應該可以用,就研究了一下。

主要是看了這三篇

第一篇側重於原理,第二篇很簡單,我覺得第三篇比較清楚。

是這樣的,本來看完第一篇跟第二篇,在嘗試的時候 (我是用 dd 做磁碟映像來掛載),一直遇到 wrong fs type, bad option, bad superblock on overlay 的問題,掛載不起來。看完第三篇,才知道自己錯在哪裡,就是 upperdir 必須要跟 workdir 在同個磁碟上,這樣掛載才不會有問題。

下面就開始實作,建立 olddisk,這裡把它當作是舊的 /home

dd if=/dev/zero of=olddisk bs=1024 count=1024
mkfs.ext4 olddisk

如果是真實情況的話,那麼這原本是掛載到 /home,這裡就把它改掛載到 /mnt/home。

sudo mkdir -p /mnt/home
sudo mount olddisk /mnt/home
sudo chown -R $USER:$USER /mnt/home

建立使用者目錄,盡可能模擬真實狀況,在真實狀況下,這步驟不用做

mkdir -p /mnt/home/user{1,2,3,4,5}

然後重新掛載為唯讀,模擬為以後都不去動的狀態

sudo mount -o remount,ro /mnt/home

建立 newdisk ,也就是模擬為新的硬碟

dd if=/dev/zero of=newdisk bs=1024 count=8192
mkfs.ext4 newdisk

掛載到 /mnt/newdisk

sudo mkdir -p /mnt/newdisk
sudo mount newdisk /mnt/newdisk
sudo chown -R $USER:$USER /mnt/newdisk

在新磁碟上建立兩個目錄,一個 home,一個 workdir。home 是 upperdir,workdir 還是 workdir,至於什麼是 upperdir,什麼是 workdir ,這裡就不多做說明了。

mkdir -p /mnt/newdisk/{home,workdir}

好,開始來掛載 overlay,這裡是掛載到 /home1,實際狀況會是 /home

sudo mount -t overlay none -o lowerdir=/mnt/home,upperdir=/mnt/newdisk/home,workdir=/mnt/newdisk/workdir /home1

看看 /home1

ls /home1
# 結果:
# lost+found  user1  user2  user3  user4  user5

建立新的使用者資料夾看看

mkdir -p /home1/user{6,7,8,9,10}

再來看看 /home1 有什麼變化

ls /home1
# 結果:
# lost+found  user1  user10  user2  user3  user4  user5  user6  user7  user8  user9

這時可以看到有確實的增加了 user6, user7, user8, user9, user10 這些資料夾,然後來看看新的硬碟裡怎麼樣了

ls /mnt/newdisk/home
# 結果:
# user10  user6  user7  user8  user9

這時可以看到新的使用者資料夾在這邊了,那 workdir 呢?

ls /mnt/newdisk/workdir
# 結果:
# work 

會發現只有 work,看來這是 kernel 工作用的目錄,可以忽略。那如果去原來在舊磁碟的使用者資料夾裡新增或修改檔案,會怎麼樣呢?

cd /home1/user1
touch {x,y}.md
cd /home1/user2
touch z.md

看舊磁碟上有沒有變化

ls /mnt/home/user1
# 結果:
#

會發現一樣是空的。來看看新磁碟

ls /mnt/newdisk/home/user1
# 結果:
# x.md  y.md

至此,存取一樣都在 /home1,但新的資料都會被放在新磁碟上了。

整理一下,在實際情況時的處置

  1. 接上新硬碟,分割、格式化好之後,掛載到 /mnt/newdisk ,建立兩個資料夾:home, workdir
  2. 如果 /home 是在分割區的話,先卸載,改掛載到 /oldhome;如果是跟 / 在一起的話,改個名字,例如 /oldhome
  3. 掛載:sudo mount -t overlay none -o lowerdir=/oldhome,upperdir=/mnt/newdisk/home,workdir=/mnt/newdisk/workdir /home
  4. 修改 /etc/fstab ,這樣下次開機時,才會生效。修改重點有三,一是原來的 /home,二是掛載新的磁碟,三是加入 overlay 的處理。

沒有留言: