Virtualbox

如何在具有共享根文件系統的 VM 中使用唯一主機名?甚至推薦這種方法嗎?

  • January 8, 2021

背景

我正在創建幾個 VirtualBox 實例以用作 Web 開發環境(Arch 主機/Debian 來賓),我希望它們共享大多數文件,但每台機器都有一個額外的驅動器,安裝在/mnt. 這比簡單地複製整個磁碟更節省記憶體,並且允許我跨系統安裝工具,而無需在使用相同程序、文件等的其他項目上重新安裝。我知道兩台機器不會的限制不能同時工作,但我不經常切換上下文,所以這對我來說不是問題。

例如,在每台機器上,/etc/hostnameand/etc/hosts文件被替換為指向單個驅動器上相應文件的符號連結,並安裝在/mnt每個項目特定的其他有用目錄中。這允許我在使用相同的基本文件系統的同時為不同的項目更換驅動器。

localhost ~ > ls -la /mnt/etc/host*
-rw-r--r-- 1 root root  16 Dec 10 08:04 /mnt/etc/hostname
-rw-r--r-- 1 root root 128 Jan  6 07:20 /mnt/etc/hosts
localhost ~ > ls -la /etc/host*
-rw-r--r-- 1 root root   9 Aug  7  2006 /etc/host.conf
lrwxrwxrwx 1 root root  17 Jan  5 22:36 /etc/hostname -> /mnt/etc/hostname
lrwxrwxrwx 1 root root  14 Jan  5 22:34 /etc/hosts -> /mnt/etc/hosts
-rw-r--r-- 1 root root 411 Dec  9 21:25 /etc/hosts.allow
-rw-r--r-- 1 root root 711 Dec  9 21:25 /etc/hosts.deny

問題和程式碼

但是,我看到我的 shell 提示符不尊重hostnameor中的值hosts,而是預設為localhost. 這些文件需要為每個 VM 包含不同的主機名值,否則我很容易忘記我正在使用哪台機器。以下是文件:

/mnt/etc/hosts

# Static table lookup for hostnames.
# See hosts(5) for details.

127.0.1.1 mc-development.localdomain mc-development
127.0.0.1 localhost

/mnt/etc/主機名

mc-development

編輯 1

這是輸出hostnamectl

localhost ~ > hostnamectl
  Static hostname: mc-development
Transient hostname: localhost
        Icon name: computer-vm
          Chassis: vm
       Machine ID: …
          Boot ID: …
   Virtualization: oracle
 Operating System: Debian GNU/Linux 10 (buster)
           Kernel: Linux 4.19.0-13-amd64
     Architecture: x86-64

我認為也許我符號連結到不同驅動器的方式是主機名定義問題的原因,但根據此輸出,它正在讀取文件就好了。因此,當我希望它顯示靜態主機名時,Fish 似乎正在尊重**臨時主機名。

關於如何做到這一點的任何想法?兩種主機名類型之間的主要區別是什麼?

順便說一句,這也出現在 Bash 中。

localhost ~ > bash
matt@localhost:~$ 

我試過的

我認為也許驅動器的安裝順序可能會有所不同,因為如果作業系統讀取到尚未載入的文件的連結,則可能會導致這樣的問題。但是,更改fstab條目的順序並沒有幫助。

編輯 2

正如對 Ljm Dullaart 的回答的評論中提到的那樣,複製/usr目錄似乎不起作用。我的 Debian 盒子在啟動時抱怨它缺少來自/bin和的程序/sbin,包括/bin/init.

以下是我採取的步驟:

1. 引導至實時映像並安裝驅動器,在來賓內部共享。

# mount /dev/sda1 /mnt
# mount /dev/sdb1 /mnt/mnt

2. 將整個usr目錄移動到共享驅動器。

# mv /mnt/usr /mnt/mnt

3. 創建符號連結。

# ln -s /mnt/mnt/usr /mnt/usr

4. 開機,然後……

錯誤資訊

不,不推薦。

通常,您將擁有許多可以共享的文件系統(有些甚至是只讀的),但根文件系統不是其中之一。系統引導過程使用此文件系統。

在你的情況下,我會分享/usr一個可能的/opt. 您將在 rootfs 上將每台機器分開(大小在我的機器上;只是為了給您一個記憶體使用的印象):

15M     bin
94M     boot
34M     etc
778M    lib
28M     lib64

您可能會在每台機器上分開

4.9G    var

那是因為日誌保存在這裡。您不應該以這種方式混合您的實例的日誌記錄。

你仍然會分享

22G     usr
4.7G    opt
426G    home

根據編輯 2 _

您執行的此連結將不起作用。你讓/usron/dev/sda1點到/mnt/mnt/usr。不是/usr在 sdb1 上,而是在/mnt/mnt/usr.

但是,您做了更多的事情;/sbin必須仍然在 rootfs 上。它不存在的事實是錯誤的。

您需要做的是使用完全相同的安裝介質和相同的選項重新安裝兩台機器(抱歉)。

機器1:

當分區編輯器出現時,選擇一個分區如下:

  • /dev/sda1: 根文件系統 ( /)
  • /dev/sdb1:/usr
  • /dev/sdb2:/home
  • /dev/sdb3:/opt

然後,安裝很多。

當機器 1 啟動並執行時,將其關閉。

接下來,對於機器 2:完全相同。確保 sda 是它自己的磁碟,而 sdb 是共享磁碟。

請注意,升級和更新將是一個 PITA,但由於這是一個虛擬環境,您可以選擇不時重新安裝。

____ 又一個編輯 _____

因為 debian 使用systemd,所以描述的方法不再可行。請參閱 https://fedoraproject.org/wiki/Features/UsrMove了解原因。(Fedora,但適用於所有 systemd 發行版)

引用自:https://unix.stackexchange.com/questions/627847