수동 상호 작용이나 자동화 소프트웨어 없이 최소한의 안전한 Linux 변형을 사용하여 VirtualBox 이미지를 생성, 시작 및 구성하는 셸 스크립트를 만들고 싶습니다.
VirtualBox 이미지를 생성하는 것은 쉽지만 처음 부팅한 후 SSH를 통해 나머지 구성 스크립트를 실행하려면 현재 다음을 입력해야 합니다.
setup-alpine
reboot
ifconfig eth1 192.168.56.101
adduser joe
호스트에서 파일을 복사하거나 스크립트를 실행하여 이 문제를 해결할 수 있다고 생각했지만 현재 선택한 Alpine Linux에서는 사용할 수 없는 "게스트 추가"가 필요한 것 같습니다.
초기 스크립트가 실행되면 수동 상호 작용 없이 이 프로세스를 어떻게 완전히 자동화할 수 있습니까?
답변1
마지막에 사용자 정의 명령을 추가하는 것이 좋습니다.
/etc/rc.local
배포가 시작될 때 실행되는 첫 번째 파일입니다.
답변2
귀하의 작업은 Linux 배포판 설치를 자동화하는 것으로 보입니다. 설치 이미지를 수정하고 자동화된 스크립트를 통합하는 것이 더 효율적일 수 있습니다.
다른 옵션:
- 어떻게든 직렬 콘솔을 구하고 로그인 셸을 사용할 수 있기를 바랍니다. 그런 다음
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를 사용하면 가상 머신의 네트워킹을 쉽게 관리할 수 있을 뿐만 아니라 가상 머신 설정 방법을 쉽게 정의할 수 있습니다. 그리고 이제 VM을 정의하는 Vagrantfile이 있으므로 바이너리 OVA 또는 이에 상응하는 것보다 더 쉽게 다른 사람과 공유하거나 백업(예: Git과 같은 소스 제어 시스템)할 수 있습니다.
관찰하기 시작하면 더 흥미로워집니다.여러 기계모든 손님이 서로 소통할 수 있는 설정이 필요합니다.
Alpine을 사용하고 싶다면 확인해 보세요.vagrant-alpine
끼워 넣다.