定制 proxmox VE 4.4 , 并制作安装镜像

目前工作需要对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安装流程简单介绍(个人理解,如有不正请大家批评指正)

 

 

 

定制 proxmox VE 4.4 , 并制作安装镜像_第1张图片

各个模块之间的对应关系如下

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 !!!!! ......"
}

 

请大家批评指正!!!!

 

你可能感兴趣的:(虚拟化)