Proxmox VE 安裝至USB隨身碟

Proxmox VE 安裝至USB隨身碟

Proxmox VE on USB

現在的主機板都支援使用USB開機,加上作業系統也要配合,Proxmox VE(後面稱PVE)基於Debian當然也支援,安裝系統時就能選擇安裝至USB隨身碟位置,但避免太過頻繁存取而減短它的壽命,安裝後需要將過於頻繁存取的目錄移至傳統硬碟之中。

系統配置

PVE安裝於隨身碟中會使用lvm的方式配置系統,執行lsblk命令看一下機器上的磁碟結構

root@pve3:~# lsblk
NAME               MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                  8:0    0 149.1G  0 disk 
├─sda1               8:1    0   149G  0 part 
└─sda9               8:9    0     8M  0 part 
sdb                  8:16   0 153.4G  0 disk 
sdc                  8:32   1  14.5G  0 disk 
├─sdc1               8:33   1     1M  0 part 
├─sdc2               8:34   1   256M  0 part 
└─sdc3               8:35   1  14.2G  0 part 
  ├─pve-swap       253:0    0   1.8G  0 lvm  [SWAP]
  ├─pve-root       253:1    0   3.5G  0 lvm  /
  ├─pve-data_tmeta 253:2    0     8M  0 lvm  
  │ └─pve-data     253:4    0   7.2G  0 lvm  
  └─pve-data_tdata 253:3    0   7.2G  0 lvm  
    └─pve-data     253:4    0   7.2G  0 lvm  
root@pve3:~# 

上圖執行結果於sdc為PVE安裝於隨身碟的磁碟代號,其中的pve-swap用於系統交換檔,是首先必需要替換的,之後還有位於/var/log/var/lib/vz/var/cache會陸續說明。

檔案系統

丹尼PVE環境使用2顆160GB傳統硬體,並使用zfs檔案格式建立1個鏡像(mirror)儲存池(storage pool)名稱為rpool

zpool create -f -o ashift=12 rpool mirror /dev/sda /dev/sdb

查看一下建立結果

root@pve3:~# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
rpool       0.1G   136G    96K  /rpool

下章節會使用rpool儲存池來說明替換系統配置的過程。

替換系統配置

要替換配置,像交換檔(pve-swap)、紀錄檔(/var/log)、快取(/var/cache)、虛擬機檔案(/var/lib/vz)、映像檔(/var/lib/vz)都是必要,丹尼會將它們位置指向rpool儲存池。

SWAP

SWAP必需要使用到Linux的區塊裝置(block devie),ZFS檔案系統中指的就是ZFS Volume,下面例子提供建立SWAP需要用到指令及參數

zfs create -V 8G -b $(getconf PAGESIZE) -o compression=zle \
      -o logbias=throughput -o sync=always \
      -o primarycache=metadata -o secondarycache=none \
      -o com.sun:auto-snapshot=false [POOL NAME]/swap 

  • b $(getconf PAGESIZE) 利用getconf PAGESIZE取得BLOCK大小
  • -V 8G Volume大小
  • -o compression=zle 使用zle的壓縮方式
  • -o logbias=throughput 不使用ZFS Log裝置
  • -o sync=always 同步方式選擇寫入後就同步
  • -o primarycache=metadata 主要快取方式
  • -o secondarycache=none 第二階快取方式
  • -o com.sun:auto-snapshot=false 自動快照功能取消,細節至Managing Automatic ZFS Snapshots這篇閱讀
  • [POOL NAME]/swap 檔案系統名稱

建立名稱為swap的ZFS Volumerpool,指令只需要替換[POOL NAME],這裡替換成rpool

zfs create -V 8G -b $(getconf PAGESIZE) -o compression=zle \
      -o logbias=throughput -o sync=always \
      -o primarycache=metadata -o secondarycache=none \
      -o com.sun:auto-snapshot=false rpool/swap

建立完成使用zfs list查結果

root@pve3:~# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
rpool       8.50G   136G    96K  /rpool
rpool/swap  8.50G   144G    64K  -
root@pve3:~# 

ZFS Volume建立完成會於/dev/zvol/中產生對應的區塊裝置的名稱,結構為/dev/zvol/[pool名稱]/[zfs 檔案系統名稱]

root@pve3:~# ls /dev/zvol/rpool/
swap

格式化為專用的SWAP格式

root@pve3:~# mkswap -f /dev/zvol/rpool/swap
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=6bca43c9-8edc-4908-98cd-07928f76f38f
root@pve3:~# 

開機立即掛載命令增加至fstab檔案中

echo /dev/zvol/rpool/swap none swap defaults 0 0 >> /etc/fstab

開啟fstab檔案準備編輯

nano /etc/fstab

fstab的內容,也包含剛剛加入的命令

# <file system> <mount point> <type> <options> <dump> <pass>
/dev/pve/root / ext4 errors=remount-ro 0 1
/dev/pve/swap none swap sw 0 0
proc /proc proc defaults 0 0
/dev/zvol/rpool/swap none swap defaults 0 0

註解開機自動掛載隨身碟中的交換檔/dev/pve/swap none swap sw 0 0命令,讓它不再自動掛載

# <file system> <mount point> <type> <options> <dump> <pass>
/dev/pve/root / ext4 errors=remount-ro 0 1
#/dev/pve/swap none swap sw 0 0
proc /proc proc defaults 0 0
/dev/zvol/rpool/swap none swap defaults 0 0

重開機後會立即生效,執行swapon查看狀態

root@pve3:/etc/apt# swapon
NAME     TYPE      SIZE USED PRIO
/dev/zd0 partition   8G   0B   -1
root@pve3:/etc/apt# 

Log

Linux 中所有記錄檔將會存於/var/log,這些算是小檔案且存取超頻繁動作的一區,丹尼將它移至rpool。於rpool中建立log名稱的ZFS檔案系統

zfs create rpool/log

建立完一樣查看結果

root@pve3:~# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
rpool       8.50G   136G    96K  /rpool
rpool/log     96K   136G    96K  /rpool/log
rpool/swap  8.50G   144G    64K  -
root@pve3:~# 

rpool/log設定壓縮演算法,ZFS中能設定每個ZFS檔案系統的壓縮方式

zfs set compression=lz4 rpool/log

rsync將原先檔案同步rpool/log

rsync -avx /var/log/* /rpool/log

rsync是一個很好的同步檔案工具,加上參數-avx會在同步檔案時也將權限同步過去

root@pve3:~# rsync -avx /var/log/* /rpool/log
sending incremental file list
alternatives.log
auth.log
boot
btmp
daemon.log
debug
dpkg.log
faillog
fontconfig.log
kern.log
lastlog
mail.info
mail.log
messages
pve-firewall.log
pveam.log
syslog
user.log
wtmp
apt/
ceph/
corosync/
corosync/.empty
glusterfs/
lxc/
lxc/lxc-monitord.log
pve/
pve/tasks/
pve/tasks/.active.lock
pve/tasks/active
pve/tasks/index
pve/tasks/9/
pve/tasks/9/UPID:pve3:0000043F:0000093A:59835139:startall::root@pam:
pveproxy/
pveproxy/access.log
samba/

sent 22,119,218 bytes  received 554 bytes  44,239,544.00 bytes/sec
total size is 22,111,469  speedup is 1.00
root@pve3:~# 


整個同步完成後,要將rpool/log掛載至相對應的路徑,因很多Linux上的套件都會將紀錄檔存至/var/log這個路徑,直接掛載至/var/log

zfs set mountpoint=/var/log rpool/log

掛載過程中可能會出現類似的錯誤

root@pve3:~# zfs set mountpoint=/var/log rpool/log
cannot mount '/var/log': directory is not empty
property may be set but unable to remount filesystem

這只是代表你要掛載的位置目錄已經存在,將它刪除

rm -rf /var/log

刪除後再繼續掛載就會成功

zfs set mountpoint=/var/log rpool/log

查看一下結果

root@pve3:/# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
rpool       8.51G   136G    96K  /rpool
rpool/log    440K   136G   440K  /var/log
rpool/swap  8.50G   144G    64K  -
root@pve3:/# 

結果中有一欄MOUNTPOINT顯示出掛載的位置,建立好的ZFS檔案系統是可以不需要指定掛載位置,像之前建立的SWAP因是區塊裝置,並不需要指定掛載位置。

替換/var/log配置方式在後面要替換的目錄是一樣的,所以丹尼一樣會將過程貼出來,但並不會做太多的說明。

VZ

/var/lib/vz存放著PVE的相關設定及映像檔、安裝的ISO…等,先查看一下它有什麼樣的目錄結構

root@pve3:/var/lib/vz# du
1   ./root
1   ./dump
1   ./template/iso
1   ./template/qemu
1   ./template/cache
2   ./template
1   ./images
1   ./private
13  .
root@pve3:/var/lib/vz# 

我們建立rpool/vz來取代它

zfs create rpool/vz

查看結果

root@pve3:/# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
rpool       8.50G   136G    96K  /rpool
rpool/log    440K   136G   440K  /var/log
rpool/swap  8.50G   144G    64K  -
rpool/vz      96K   136G    96K  /rpool/vz

設定壓縮方式

zfs set compression=lz4 rpool/vz

同步/var/lib/vz下檔案至rpool/vz

rsync -avx /var/lib/vz/* /rpool/vz

同步的過程如下

root@pve3:/# rsync -avx /var/lib/vz/* /rpool/vz
sending incremental file list
dump/
images/
private/
root/
template/
template/cache/
template/iso/
template/qemu/

sent 205 bytes  received 44 bytes  498.00 bytes/sec
total size is 0  speedup is 0.00

同步完成後刪除原先目錄及檔案內容

rm -rf /var/lib/vz

rpool/vz掛載至/var/lig/vz

zfs set mountpoint=/var/lib/vz rpool/vz

查看掛載路徑是否正確

root@pve3:/# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
rpool       8.51G   136G    96K  /rpool
rpool/log    440K   136G   440K  /var/log
rpool/swap  8.50G   144G    64K  -
rpool/vz     104K   136G   104K  /var/lib/vz
root@pve3:/# 


CACHE

快取路徑/var/cache是Linux系統中應用程式需要置放快取時都會將路徑指至此,像aptsamba或是你用man查看一些手冊時也會產生快取,下面命令為建立要取代原先快取目錄的ZFS檔案系統rpool/cache

zfs create rpool/cache

同樣查看rpool/cache是否建立完成

root@pve3:~# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
rpool        8.51G   136G    96K  /rpool
rpool/cache    96K   136G    96K  /rpool/cache
rpool/log     440K   136G   440K  /var/log
rpool/swap   8.50G   144G    64K  -
rpool/vz      104K   136G   104K  /var/lib/vz

設定壓縮演算法為lz4

zfs set compression=lz4 rpool/cache

同步快取內的檔案至rpool/cache

rsync -avx /var/cache/* /rpool/cache

同步過程供參考

root@pve3:/# rsync -avx /var/cache/* /rpool/cache
sending incremental file list
created directory /rpool/cache
apparmor/
apt/
apt/pkgcache.bin
apt/srcpkgcache.bin
apt/archives/
apt/archives/partial/
debconf/
debconf/config.dat
debconf/config.dat-old
debconf/passwords.dat
debconf/templates.dat
debconf/templates.dat-old
fontconfig/
fontconfig/087e1975ba9a574b140bb1df193bf770-le64.cache-4
fontconfig/2bae36bb929c5b1290cc66cecf2b11b0-le64.cache-4
fontconfig/3830d5c3ddfd5cd38a049b759396e72e-le64.cache-4
fontconfig/4c599c202bc5c08e2d34565a40eac3b2-le64.cache-4
fontconfig/573ec803664ed168555e0e8b6d0f0c7f-le64.cache-4
fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-le64.cache-4
fontconfig/8a687c406b77f27d99abfeeba937fcce-le64.cache-4
fontconfig/CACHEDIR.TAG
fontconfig/c277e94e32b20404286a1ddafa5a80f0-le64.cache-4
fontconfig/c4f8cd936e32aa63d90660cbbf4d74a0-le64.cache-4
fontconfig/cba07694886bf8bbc441deea9dc5842f-le64.cache-4
fontconfig/cdd862819a105ebd84444cb99c7fc194-le64.cache-4
fontconfig/d589a48862398ed80a3d6066f4f56f4c-le64.cache-4
fontconfig/e0c1a6ba06fd9ea781faace1ebc0ffdd-le64.cache-4
ldconfig/
ldconfig/aux-cache
lxc/
man/
man/CACHEDIR.TAG
man/index.db
man/cs/
man/cs/CACHEDIR.TAG
man/cs/index.db
:
:
:
samba/

sent 8,072,913 bytes  received 1,697 bytes  16,149,220.00 bytes/sec
total size is 8,064,549  speedup is 1.00

刪除原有的快取目錄及檔案

rm -rf /var/cache

設定要取代的rpool/cache掛載路徑

zfs set mountpoint=/var/cache rpool/cache

查看設定結果

root@pve3:/# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
rpool        8.51G   136G  8.30M  /rpool
rpool/cache    96K   136G    96K  /var/cache
rpool/log     440K   136G   440K  /var/log
rpool/swap   8.50G   144G    64K  -
rpool/vz      104K   136G   104K  /var/lib/vz

掛載狀態

以上為設定掛載路徑,但必需要查看掛載狀態才能確定是否已掛載

root@pve:/rpool# zfs get mounted
NAME         PROPERTY  VALUE    SOURCE
rpool        mounted   yes      -
rpool/cache  mounted   yes      -
rpool/log    mounted   yes      -
rpool/swap   mounted   -        -
rpool/vz     mounted   yes      -
root@pve:/rpool# 

如果未掛載成功時,VALUEno,如下

root@pve:/rpool# zfs get mounted
NAME         PROPERTY  VALUE    SOURCE
rpool        mounted   yes      -
rpool/cache  mounted   yes      -
rpool/log    mounted   yes      -
rpool/swap   mounted   -        -
rpool/vz     mounted   no       -

一般設定好後會自動掛載,如果發生無法掛載的方式進行手動掛載確定問題在哪?

zfs mount [zfs pool]

以掛載rpool/vz至/var/lib/vz為例

zfs mount rpool/vz

發生問題的話或許會出現訊息

cannot mount '/rpool/vz': directory is not empty

上面訊息告訴我們其掛載目錄並非空目錄,此時將它的內容清空再重新掛載就能解決

rm -rf /var/lib/vz
zfs mount rpool/vz

問題排除後再次查看掛載狀態

root@pve:/rpool# zfs get mounted
NAME         PROPERTY  VALUE    SOURCE
rpool        mounted   yes      -
rpool/cache  mounted   yes      -
rpool/log    mounted   yes      -
rpool/swap   mounted   -        -
rpool/vz     mounted   yes      -
root@pve:/rpool# 

註:/var/lib/vz會由pvestatd管理,可能會刪除vz後會自動建立目錄,如果無法掛載成功時請自行將服務停止

systemctl stop pvestatd

處理掛載問題後再重新啟動

systemctl start pvestatd

結語

這篇提到的是如何將存取頻繁的目錄、區塊裝置、分割表從Flash中移至傳統硬碟,傳統硬碟在一般觀念中是比較可以承受這種讀寫,在其他平台也是會有此類似的文章,不過這篇另一個重點是使用ZFS檔案系統來替換這些配置,其中有提到ZFS Storage PoolZFS VolumeZFS File System是後續要去了解,或是事先就要略懂。

參考資料

更新日誌

日期 內容
2017/10/18 新增掛載狀態章節
2017/08/04 初版

關鍵字

  • PVE on USB
  • PVE USB Boot
  • Proxmox VE on USB
  • Proxmox VE 5.0 4.4