目前工作需要对proxmox VE 4.4 进行定制,网上资料少之又少,自己进坑也较多。所以写这篇帖子的目的是帮大家填坑,希望能帮到大家!!!
1、首先说一下proxmox VE的结构吧:
这是将pve的ISO解开之后的iso结构,对其中几个重要的文件介绍一下
efi.img是系统引导镜像(pve只支持UEFI的引导方式)
proxmox是系统预安装包的存放目录
pve-base.squashfs是系统安装的基系统
pve-installer.squashfs是系统安装时需要的系统
将iso内容解压的函数如下:
sync_pve_iso() {
echo "......mount $ISO_NAME to $PVE_MNT_PATH"
mount -o loop $PVE_ISO $PVE_MNT_PATH
echo "......ok !!!!!!......"
echo "......sync $PVE_MNT_PATH to $PVE_ISO_PATH......."
echo "......doing......"
cd $PVE_MNT_PATH
rsync -av . $PVE_ISO_PATH > /dev/null
echo "......ok !!!!!!......"
cd $PVE_ISO_PATH
umount $PVE_MNT_PATH
}
2、pve安装流程简单介绍(个人理解,如有不正请大家批评指正)
各个模块之间的对应关系如下
Boot Loader:由 BIOS 加载,用于将后续的 Kernel 和 initrd 的装载到内存中
(这里重点说一下,pve安装时使用的是uefi模式的安装,但是又不是传统意义上的UEFI,它先是使用了bios加载hernel和initrd到内存,然后又跳到uefi分区执行img.efi
文件,调用proxinstaller进入到系统安装界面,然后是挂载pve-base进行系统安装)--------->>>>>个人理解!!!!!!!!!!!!!!!!
geremlijie
kernel:为 initrd 运行提供基础的运行环境,对应boot目录下的linux26文件
initrd:检测并加载各种驱动程序,对应boot目录下的initrd.img文件
rootfs:根文件系统,用户的各种操作都是基于这个被最后加载的文件系统,这里对应了pve-base.squashfs
PVE系统安装过程中的调用顺序是 Boot Loader->kernel->initrd->pve-installer.squashfs->pve-base.squashfs。
3、pve custom
pve的安装界面是使用perl+gtk3+openbox实现的
pve的基系统默认安装包是在proxmox文件夹下的,只要不破坏其依赖关系,可以将需要预安装的包及其依赖丢到这个文件夹下。
下面这段代码是proxinstall中的源码,说明pve预安装包ed时候使用的是循环读取proxmox/packages中的deb,然后使用的安装方法是先解压然后在配置,这样不会产生依赖关系而导致装不上deb的问题。
my $pkgdir = $opt_testmode ? "packages" : "/cdrom/proxmox/packages";
my $pkg_count = 0;
while (<$pkgdir/*.deb>) { $pkg_count++ };
# btrfs/dpkg is extremely slow without --force-unsafe-io
my $dpkg_opts = $use_btrfs ? "--force-unsafe-io" : "";
$count = 0;
while (<$pkgdir/*.deb>) {
chomp;
my $path = $_;
my ($deb) = $path =~ m/$pkgdir\/(.*\.deb)/;
# if ($deb =~ m/^grub-efi-/ && $deb !~ m/^grub-${grub_plattform}/) {
# $count++;
# next;
# }
update_progress ($count/$pkg_count, 0.5, 0.75, "extracting $deb");
print "extracting: $deb\n";
syscmd ("cp $path $targetdir/tmp/$deb") == 0 ||
die "installation of package $deb failed\n";
syscmd ("chroot $targetdir dpkg $dpkg_opts --force-depends --no-triggers --unpack /tmp/$deb") == 0 ||
die "installation of package $deb failed\n";
update_progress ((++$count)/$pkg_count, 0.5, 0.75);
}
display_html ("extract4-virus.htm");
my $cmd = "chroot $targetdir dpkg $dpkg_opts --force-confold --configure -a";
$count = 0;
run_command ($cmd, sub {
my $line = shift;
if ($line =~ m/Setting up\s+(\S+)/) {
update_progress ((++$count)/$pkg_count, 0.75, 0.95,
"configuring $1");
}
});
4、定制代码如下(只需要在解压和打包直接写上自己的代码就ok):
#**************************
# 5.Custom PVE_base
#***************************
custom_pve_base() {
echo "......custom pve base ......"
echo "......doing......"
cd $PVE_ISO_PATH
unsquashfs -f -dest $PVE_BASE_PATH -i $PVE_ISO_PATH/pve-base.squashfs //解压文件系统
cd $PVE_BASE_PATH
#custom //定制,自己随意发挥啦!!!
#... ....
# Compress pve-base
cd ..
#mksquashfs pve_base/ pve-base.squashfs -noappend -always-use-fragments -all-root -noF //生成文系统,不做压缩
mksquashfs pve_base/ pve-base.squashfs -b 128K -comp xz //生成文系统,压缩
rm -f $PVE_ISO_PATH/pve-base.squashfs
mv ./pve-base.squashfs $PVE_ISO_PATH
echo "......PVE base Done!!!......"
}
5、废话不多说了直接上最终生成iso的代码吧:
create_iso() {
echo "......create iso......"
echo "......doing !!!!......"
cd $PVE_ISO_PATH
cd ..
if [ -f proxmox.mbr ]; then
echo
echo "......the MBR file exits......"
else
echo
echo "......make MBR file......"
dd if=proxmox-ve_4.4-eb2d6f1e-2.iso bs=512 count=1 of=proxmox.mbr //需要用原来的iso中的前512字节做系统mbr
echo "......doing......"
fi
cd -
xorriso -as mkisofs -o ../$MY_ISO -r -V 'inspur' --grub2-mbr ../proxmox.mbr --protective-msdos-label \
-efi-boot-part --efi-boot-image -c '/boot/boot.cat' -b '/boot/grub/i386-pc/eltorito.img' \
-no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot -e '/efi.img' -no-emul-boot . //最终打包ISO的命令,xorriso版本需要>=1.3.8,否则好多参数找不到哦
echo "......create complete !!!!! ......"
}
请大家批评指正!!!!