最终目标:使用存储在内部网站上的 kickstart 配置文件为 CentOS 创建自动安装磁盘。
我做了什么:创建了一个脚本
- 下载 ISO
- 解开它
isolinux.cfg
使用我自己的菜单选项更新文件- 使用以下方法重新创建 ISO:
genisoimage
所有这些都有效,并且 ISO 重新创建时没有任何错误。但是,当我尝试使用 ISO 启动安装时,系统总是死机在:
"new value non-existent xfs filesystem is not valid as a default fs type"
Pane is dead
不同于这个问题,我的错误发生在安装前,而且我已经在使用 lang = en_US.UTF-8
。我甚至尝试过en_US
,但并没有什么不同。
我添加到文件中的行isolinux.cfg
:
label install
menu label ^Kickstart Installation
menu default
kernel vmlinuz
append initrd=initrd.img text ramdisk=100000 lang=en_US.UTF-8 keymap=us ipv6.disable=1 ip=dhcp install inst.ks=cdrom:/kickstart.cfg
我在网上搜索了错误原因,很多评论似乎与 init 和内核版本不匹配或文件损坏有关。我没有替换任何文件,我所做的唯一更改是配置文件isolinux.cfg
。没有混合来自不同版本/DVD/映像的文件。
有没有人遇到过/看到过上述情况,对我下一步该尝试什么有什么想法?我尝试过尝试放入文件中的选项,但似乎没有什么效果。
其他信息
原始图像:CentOS 7.2 - DVD ISO
系统状态:
编辑
根据要求,我正在编写的脚本:
#!/bin/bash
#############################################################
function prepare {
rm -rf ${ISO_EXTRACTION_DIR}
if [ -d ${ISO_MOUNT_DIR} ]
then
umount ${ISO_MOUNT_DIR} 2>&1 || true
rm -rf ${ISO_MOUNT_DIR}
fi
mkdir -p ${ISO_MOUNT_DIR} ${ISO_EXTRACTION_DIR}
}
function extract_iso {
echo "Extracting ISO"
cd $(dirname ${ISO_MOUNT_DIR})
cp -pRf ${ISO_MOUNT_DIR}/* ${ISO_EXTRACTION_DIR}
echo "Extracted $(ls ${ISO_EXTRACTION_DIR} | wc -l) files and directories from ISO"
}
function update_config {
echo "Updating configuration"
cd ${ISO_EXTRACTION_DIR}
if [ -d "isolinux" ]
then
isolinux_cfg_file="${ISO_EXTRACTION_DIR}/isolinux/isolinux.cfg"
else
isolinux_cfg_file="${ISO_EXTRACTION_DIR}/isolinux.cfg"
fi
sed -i 's/timeout 600/timeout 50/' ${isolinux_cfg_file} # Shorten timeout
sed -i '/menu default/d' ${isolinux_cfg_file} # Delete existing menu default
echo "label linux" >> ${isolinux_cfg_file}
echo " menu default" >> ${isolinux_cfg_file}
echo " kernel vmlinuz" >> ${isolinux_cfg_file}
echo " append initrd=initrd.img text ramdisk=100000 lang=en_US.UTF-8 keymap=us ipv6.disable=1 ip=dhcp install inst.ks=cdrom:/kickstart.cfg" >> ${isolinux_cfg_file}
}
function repackage_iso {
echo "Repackaging ISO"
cd ${ISO_EXTRACTION_DIR}
volume_id="${LINUX_DISTRO}-${LINUX_VERSION}-bootable"
if [ -d "isolinux" ]
then
boot_cat_file="isolinux/boot.cat"
isolinux_bin_file="isolinux/isolinux.bin"
else
boot_cat_file="boot.cat"
isolinux_bin_file="isolinux.bin"
fi
iso_file_name="$(echo $(basename ${IMAGE_FILENAME}) | cut -d '.' -f 1)-bootable.iso"
genisoimage \
-U -r -v -T -J -joliet-long \
-V 'CentOS 7 x86_64' \
-volset "${LINUX_DISTRO}-${LINUX_VERSION}" \
-A "${LINUX_DISTRO}-${LINUX_VERSION}" \
-b ${isolinux_bin_file} \
-c ${boot_cat_file} \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-eltorito-alt-boot \
-e images/efiboot.img \
-no-emul-boot \
-o "${IMAGE_DIR}/${iso_file_name}" .
}
prepare
check_input
mount_iso
extract_iso
unmount_iso
update_config
repackage_iso
答案1
我遇到了完全相同的问题,直到我意识到我没有通过从 centos/7/os/x86_64/isolinux/ 复制 Centos-7.5 版本的文件来更新我的 pxe tftpboot 环境以与最新的 Centos 7.5 媒体一致。
答案2
几天前我让它工作了,但忘了在这里发帖(抱歉!)。回答我自己的问题,希望它能帮助别人。
我没有替换整个菜单选项,而是必须sed
修改部分菜单选项才能达到我想要的效果。虽然不太干净,但确实达到了我想要的效果,所以我就让它这样吧:
sed -i 's/timeout 600/timeout 50/' ${isolinux_cfg_file}
sed -i '/menu default/d' ${isolinux_cfg_file}
sed -i '/label linux/a\
menu default' ${isolinux_cfg_file} # this line is badly indented on purpose. Do not change it.
sed -i 's/quiet//' ${isolinux_cfg_file}
我认为部分原因是线路stage2
上缺少选项append
。
我不会“接受”这个答案,以防别人有更好的解释为什么这个方法有效而不是创建一个新的菜单选项。