背景
我正在创建几个 VirtualBox 实例用作 Web 开发环境(Arch 主机/Debian 来宾),我希望它们共享大多数文件,但为每台计算机提供一个附加驱动器,安装在/mnt
.这比简单地克隆整个磁盘更节省内存,并且允许我跨系统安装工具,而无需在使用相同程序、文件等的其他项目上重新安装。我知道两台机器不会的限制无法同时工作,但我不会经常切换环境,所以这对我来说不是问题。
例如,在每台计算机上,/etc/hostname
和/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 提示符不遵循hostname
or中的值hosts
,而是默认为localhost
。这些文件需要包含每个虚拟机的不同主机名值,否则我很容易就会忘记我正在使用哪台计算机。以下是文件:
/mnt/etc/主机
# 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. 启动,然后……
答案1
不,不推荐。
一般来说,您将拥有许多可以共享的文件系统(有些甚至是只读的),但根文件系统不是其中之一。系统引导过程使用该文件系统。
对于你的情况,我会分享/usr
一个可能的/opt
.您可以在 rootfs 上将每台机器分开(大小在我的机器上;只是为了让您了解内存使用情况):
15M bin
94M boot
34M etc
778M lib
28M lib64
您可能会将每台机器分开
4.9G var
那是因为日志保存在这里。您不应该希望以这种方式混合实例的日志记录。
你依然会分享
22G usr
4.7G opt
426G home
按照编辑2_
您所做的此链接将不起作用。你让/usr
我们/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-distro)