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

来源:互联网 发布:风暴大陆神器进阶数据 编辑:程序博客网 时间:2024/05/21 17:02

目前工作需要对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-iomy $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  //生成文系统  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 !!!!! ......"}


请大家批评指正!!!!

1 0
原创粉丝点击