让 Linux 在初始启动时进行自配置

让 Linux 在初始启动时进行自配置

我想创建一个 shell 脚本,它使用最小且安全的 Linux 变体创建、启动和配置 VirtualBox 映像,无需手动交互或自动化软件。

创建 VirtualBox 映像很容易,但在第一次启动后,我目前被迫输入以下内容,然后才能通过 SSH 运行配置脚本的其余部分:

setup-alpine
reboot
ifconfig eth1 192.168.56.101
adduser joe

我以为我可以通过从主机复制文件或执行脚本来解决这个问题,但这似乎需要“来宾添加”,而这对于我当前的选择 Alpine Linux 来说是不可用的。

启动初始脚本后,如何完全自动化此过程而无需任何手动交互?

答案1

我建议在末尾添加您的自定义命令:

/etc/rc.local

这是发行版启动后运行的第一个文件。

答案2

您的任务似乎是 Linux 发行版安装的自动化。修改安装映像并合并自动化脚本可能会更有效。

其他选项:

  • 以某种方式获取串行控制台并希望有可用的登录 shell。然后expect等待控制台出现并发出您手动键入的命令。 (使用 QEMU 可以做到这一点,我不知道 VBox 如何处理这个。)
  • 创建一个小磁盘来保存脚本和依赖项。然后你需要输入如下内容:

    mount /dev/sdb1 /mnt && /mnt/script.sh
    
  • 确保您的虚拟机中有一些本地网络连接,并执行以下操作:

    curl 192.168.56.1 | sh
    

某些发行版的安装介质从内核命令行读取配置 URL。有关详细信息,请参阅您的发行版的文档。

答案3

假设您有一组可以执行的脚本来按照您想要的方式配置机器,您可以按照 ebal 的建议,在 /etc/rc.local (或您的发行版的等效版本)末尾运行它们。该脚本在引导过程结束时执行,就在 init 生成 getty 之前。

我建议您在 /etc/rc.local 末尾添加如下内容:

test -x /sbin/system-setup-step1.sh && /sbin/system-setup-step1.sh && reboot
test -x /sbin/system-setup-step2.sh && /sbin/system-setup-step2.sh && reboot
test -x /sbin/system-setup-step3.sh && /sbin/system-setup-step3.sh && reboot
# ... for however many steps are needed for your use case

然后,在每个脚本的末尾,删除执行位,以表明不再需要执行它(但将脚本保留在磁盘上,以防用户想查看它做了什么),并存储某处的脚本,然后检查序列中下一个脚本顶部的先前执行的脚本。例如,如下所示system-setup-step2.sh

#!/bin/bash

test $(cat /var/tmp/last-system-setup-step) = "system-setup-step1.sh" || exit 1

# ... do stuff ...

# indicate that this doesn't need to run again
/bin/chmod -x "$0"
printf '%s' $(basename "$0") > /var/tmp/last-system-setup-step
# finished successfully
exit 0

调整每个脚本顶部附近的测试条件。

这样,无论需要多少次,系统都会重新启动,最后将直接通过所有这些test条件并到达登录提示(或您可能配置的任何其他内容),因为没有任何脚本会设置执行位。如果出现问题,配置和重新启动过程将停止。

在原始图像中,确保 /var/tmp/last-system-setup-step 存在且为空,以避免出现恼人的错误。

请注意,上面的内容未经测试(在浏览器中编写),但应该可以理解要点。

答案4

如果您尝试设置虚拟机(特别是在 VirtualBox 中),您可能需要考虑使用流浪汉

您可以在简单的文本文件中定义虚拟机,如下所示:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

    # Specify the base image or "box"
    config.vm.box = "ubuntu/xenial64"

    # Define networking
    config.vm.network "private_network", ip: "192.168.50.4"

    # Share folders between the host and the guest
    config.vm.synced_folder "../shared", "/shared"

    # Run "provisioners" that change the guest
    config.vm.provision :shell, :inline, "touch hello_world"
    config.vm.provision "shell", path: "script.sh"

    # You can even use tools like Ansible or Puppet:
    config.vm.provision "ansible" do |ansible|
        ansible.playbook = "playbook.yml"
    end
end

Vagrant 尤其可以轻松管理虚拟机上的网络,还可以轻松定义您想要如何设置虚拟机。而且,由于您现在有一个 Vagrantfile 来定义您的 VM,因此与二进制 OVA 或同等文件相比,您可以更轻松地与其他人共享或备份(例如存储到 Git 等源代码控制系统中)。

当你开始观察时,它会变得更加有趣多机您需要所有客人都能够相互交流的设置。

如果你想使用 Alpine 那么你会想看看vagrant-alpine插入

相关内容