我想編寫一個 bash 腳本,該腳本使用自訂的 kickstart 檔案建立 Scientific Linux 7.2 iso,建立一個新的 VirtualBox VM,並將該 iso 安裝到該 VM 上。
我有兩個腳本,installBaseOS.sh
並且createKSISO.sh
.以下是兩者:
installBaseOS.sh
:
#!/bin/sh
set -e
../src/sh/createKSISO.sh
VM='testVM'
ISO=test/boot.iso
VBoxManage createhd --filename=test/$VM.vdi --size=16000 >> test/install.log 2>&1
VBoxManage createvm --name=$VM --ostype="Linux_64" --register >> test/install.log 2>&1
VBoxManage storagectl $VM --name "SATA Controller" --add sata --controller IntelAHCI
VBoxManage storageattach $VM --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium test/$VM.vdi
VBoxManage storagectl $VM --name "IDE Controller" --add ide
VBoxManage storageattach $VM --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium $ISO
VBoxManage modifyvm $VM --ioapic on
VBoxManage modifyvm $VM --boot1 dvd --boot2 disk --boot3 none --boot4 none
VBoxManage modifyvm $VM --memory 1024 --vram 128
VBoxManage modifyvm $VM --nic1 bridged --bridgeadapter1 wlo1
VBoxHeadless -s $VM >> test/install.log 2>&1
和createKSISO.sh
:
#!/bin/sh
mkdir test/bootiso
sudo mount -o loop ../bin/SL-72.iso test/bootiso
mkdir test/bootisoks
cp -r test/bootiso/* test/bootisoks/
sudo umount test/bootiso && rmdir test/bootiso
chmod -R u+w test/bootisoks
cp ../src/cfg/ks.cfg test/bootisoks/isolinux
sed -i 's/append\ initrd\=initrd0.img/append initrd=initrd0.img\ ks\=cdrom:\/ks.cfg/' test/bootisoks/isolinux/isolinux.cfg
cd test/bootisoks && mkisofs -o ../boot.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -r -J -v -T isolinux/. .
cd ../..
rm -r test/bootisoks
最後是我的啟動檔ks.cfg
:
auth --enableshadow --enablemd5
install
reboot --eject
eula --agreed
cmdline
ignoredisk --only-use=sda
keyboard --vckeymap=us --xlayouts='us'
lang en_US.UTF-8
logging --level=debug
rootpw testpass
timezone US/New_York
bootloader --location=mbr --boot-drive=sda
clearpart --all --initlabel
part pv.0 --size=1 --grow
volgroup rootvg01 pv.0
logvol / --fstype=ext4 --name=lv01 --vgname=rootvg01 --size=1 --grow
services --enable=NetworkManager,sshd
%packages
@base
@core
%end
如果我註解掉其中的sed
命令,createKSISO.cfg
以便引導過程不會查找 kickstart 文件,則 VM 會毫無問題地引導到 Live CD,因此我相當確定我正在正確地建立 ISO(大部分情況下)。
如果我將 ks=/ks.cfg 加入啟動中,會發生什麼情況,啟動日誌上會出現 3 行:
[ OK ] Started Show Plymouth Boot Screen.
[ OK ] Reached target Paths.
[ OK ] Reached target Basic System.
然後它掛起幾分鐘,然後我開始收到dracut-initqueue
超時警告。之後,我進入dracut
控制台,它告訴我查看/run/initramfs/rdsosreport.txt
.我沒有任何方法從虛擬機器中獲取該文件,它有幾百行長,但我已經在警告出現之前直接複製了幾行dracut-initqueue
:
localhost kernel: sda: unknown partition table
localhost kernel: sd 0:0:0:0: [sda] Attached SCSI disk
localhost systemd[1]: Received SIGRTMIN+20 from PID 357 (plymouthd)
最後一個 SIGRTMIN 在大約 3 秒內出現 4 次,然後大約 1.5 分鐘後出現逾時警告。
我認為我的問題是由錯誤的啟動文件或未正確找到該文件引起的。我嘗試了一些來自網路的 RHEL 7 kickstart 範例文件,試圖確定這是否是第一個問題,但沒有任何運氣。我想知道的是下一步調試虛擬機啟動失敗的原因,或者我的問題是什麼。一旦我有一些東西可以工作,我計劃編輯 kickstart 檔案以最終獲得我真正想要的系統,但我必須先讓一些東西工作。
答案1
事實證明這是一個相當簡單(愚蠢)的錯誤。在文件內部,在中的命令isolinux.cfg
修改的同一行上,有一個鍵/值對。在我在網路上找到的有關建立啟動 ISO 的大約一半教程中,該命令包含選項或類似的內容,但沒有解釋此選項的重要性。我不在乎我的 CD 叫什麼,因為它是暫時的,所以我忽略了它。sed
createKSISO.sh
root=live:CDLABEL=SL-72-x86_64-LiveCD
mkisofs
-V "Your CD Name Here"
但是,要使已建立的 ISO 可引導,root
標籤和 CD 名稱必須相符。如果不是,isolinux 啟動將無法找到要從 Live CD 啟動的作業系統。對此的快速解決方法是我只需將已存在於腳本中的選項isolinux.cfg
的名稱提供給我即可。更合適的答案是建立一個自訂名稱,然後在.-V
createKSISO
sed
isolinux.cfg
更改此設定後,新建立的 ISO 啟動以及腳本中其他位置所做的修改都可以在檔案系統中看到。