Proxmox VE (PVE) is an open source Linux distribution of server virtualization environments based on Debian and using a custom kernel given to Ubuntu. Compared with other virtualization platforms, PVE does not require a master node. After installation, multiple nodes can be clustered without special configuration.

Due to engineering requirements, pves need to be deployed on a large scale on physical servers, so it is necessary to customize images.

Customization objectives include

(1) Modify the prompt message of the init script in the initrd

(2) Delete unnecessary options from the GRUB screen and go to the installation screen

(3) Add pre-installed software

(4) Personalize the software during the installation process

(5) Modify the PVE installation page and set the default text for all input boxes on the PVE installation page

Proxmox VE Mirroring analysis

Download the Proxmox VE 6.4 image, mount it, and observe the file structure

Tree - L $2. ├ ─ ─ the boot │ ├ ─ ─ the boot. The cat │ ├ ─ ─ grub │ ├ ─ ─ the initrd. Img │ ├ ─ ─ linux26 │ └ ─ ─ memtest86 +. Bin ├ ─ ─ COPYING ├ ─ ─ ├── bass Exercises ── bass Exercises ── proxmox │ Bass Exercises ── country ├ ─ ─ packages │ └ ─ ─ pve - base. CNT ├ ─ ─ pve - base. Squashfs ├ ─ ─ pve - installer. Squashfs ├ ─ ─ the TXT └ ─ ─ System └ ─ ─ the Library 9 directories, 14 filesCopy the code

Among them:

Grub folder: Contains the files used to boot the GRUB program. Initrd. img: image used for system initialization. It contains a minimal system, including many basic directories such as /dev, /etc, /bin, and the key init program, which is responsible for driver loading and file system initialization. Linux26: Linux 2.6 kernel Efi. img: system boot image, including boot.efi, bootia32.efi, and bootx64.efi. Proxmox folder: Directory for storing preinstalled packages The default PVE root system installation packages are stored in the proxmox folder. You can place preinstalled packages and their dependencies in this folder as long as the proxmox dependencies are not damaged. PVE preinstalls deBs in proxmox/ Packages on a round-robin basis, and then decompresses and configs them so that there are no dependencies that may cause deBs to fail. Pve-base. squashfs: indicates the root system, which is the final system. Pve-installer: indicates the system required for installationCopy the code

Proxmox VE Installation process

The PVE installation process consists of the following four steps:

(1) Boot Loader: the BIOS loads the kernel and initrd to the memory. PVE uses UEFI mode, but it is not UEFI in the traditional sense. It uses BIOS to load kernel and initRD into memory, jumps to UEFI partition, executes the Efi. img file, and calls proxInstall to enter the system installation interface. Then mount pVE-base. Squashfs for system installation.)

(2) kernel: provides a basic operating environment for initrd operation, corresponding to the linux26 file in the boot directory

(3) Initrd: detects and loads various drivers and runs init. The initrd.img file in the boot directory is displayed

(4) Rootfs: root file system. All user operations are based on the last loaded file system, which corresponds to pVE-base.squashfs

Proxmox VE Mirrors are customized

ISO decompression and compression

In the original ISO Master as the tool to decompress ISO, the generated ISO file can be directly started as CDROm, but after being burned to USB devices, MBR and other important parts are missing, so it cannot be started, so command line decompression is used instead.

(1) ISO extraction

First mount the image file.

$ mount -o loop Desktop/proxmox-ve_6.4-1.iso cby/
Copy the code

The files in the mount point directory are read-only and need to be synchronized to the working directory.

$ cd cby
$ sudo rsync -av /home/cby/cby/ /home/cby/
Copy the code

After synchronization, you can modify the files in the ISO.

$ sudo umount /home/cby/cby $ ll total 386672 dr-xr-xr-x 10 root root 4096 Apr 27 04:26 ./ dr-xr-xr-x 23 root root 4096 May 19 18:56 .. / dr-xr-xr-x 3 root root 4096 Apr 27 04:26 boot/ -r--r--r-- 1 root root 89 Apr 27 04:26 .cd-info -r--r--r-- 1 root root 32386 Apr 27 04:26 COPYING -r--r--r-- 1 root root 955 Apr 27 04:26 COPYRIGHT lrwxrwxrwx 1 root root 1 Apr 27 04:26 debian -> ./ dr-xr-xr-x 3 root root 4096 Apr 27 04:26 dists/ -r--r--r-- 1 root root 2949120 Apr 27 04:26 efi.img -r--r--r-- 1 root root 4470 Apr 27 04:26 EULA -r--r--r-- 1 root root 0 Apr 27 04:26 mach_kernel dr-xr-xr-x 3 root root 4096 Apr 27 04:26 proxmox/ dr-xr-xr-x 2 root root 4096 Apr 27 04:26 .pve-base/ -r--r--r-- 1 root root 101306368 Apr 27 04:26 pve-base.squashfs -r--r--r-- 1 root root 37 Apr 27 04:26 .pve-cd-id.txt dr-xr-xr-x 2 root root 4096 Apr 27 04:26 .pve-installer/ dr-xr-xr-x 2 root root 4096 Apr 27 04:26 .pve-installer-mp/ -r--r--r-- 1 root root 291586048 Apr 27 04:26 pve-installer.squashfs -r--r--r-- 1 root root 15792 Apr 27 04:26 Release.txt dr-xr-xr-x 3 root root 4096 Apr 27 04:26 System/ dr-xr-xr-x 2 root root 4096 Apr 27 04:26 .workdir/Copy the code

(2) ISO compression

Use the MBR of the original image (the first 512 bytes) as the MBR of the custom image

$sudo dd if=/home/cby/proxmox-ve_6.4-1. Iso bs=512 count=1 of=proxmox. MBR 1+0 records in 1+0 records out 512 bytes Copied, 0.000134541 s, 3.8 MB/sCopy the code

Packing an ISO Image

Iso-r -V 'inspur' --grub2-mbr proxmox. MBR --protective MSdos-label. $sudo xorriso -as mkisofs-o proxmox-ve_6 -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. xorriso 1.5.2: RockRidge Filesystem, libburnia project. Drive current: -outdev 'stdio:proxmox-ve_6.4-1. Iso 'Media current: stdio file, overwriteable Media status : is blank Media summary: 0 sessions, 0 data blocks, 0 data, 80.6g free Xorriso: WARNING: -volid text does not comply to ISO 9660 / ECMA 119 rules Added to ISO image: directory '/'='/home/cby/chenby' xorriso : UPDATE : 1421 files added in 1 seconds xorriso : UPDATE : 1421 files added in 1 seconds xorriso : NOTE : Copying to System Area: 512 bytes from the file '/ home/cby/chenby/proxmox MBR' xorriso: UPDATE: 1.00% done xorriso: UPDATE: 42.39% done xorriso: UPDATE: 86.68% done ISO image produced: 453265 sectors Written to medium: 453265 sectors at LBA 0 Writing to 'stdio:proxmox-ve_6.4-1. Iso 'completed successfully.Copy the code

Modify the initrd

Initrd. img is in the boot directory of the original image. The purpose of modifying the initrd is to modify the output text during the installation. This part is special.

Boot Loader Initialized RAM disk, which is a RAM disk initialized by the Boot Loader. The original purpose of the initRD was to divide the kernel startup into two phases: Keep the minimum startup code in the kernel, and then put support for various hardware devices in the initrd as modules, so that during startup the required modules can be loaded from the root file system mounted by the initrd. One advantage of this is that the contents of the initrd can be modified to support different hardware while keeping the kernel unchanged. At the end of the boot process, the root file system can be remounted to another device. That is, since the initrd virtualizes a file system in memory, you can then load different drivers for different hardware without having to recompile the entire core. As a result, most distributions load drivers this way.

After the initrd is introduced, the Linux boot process becomes the following.

(1) Boot Loader loads the kernel and initrd file to a specific location in memory.

(2) The kernel determines the initrd file format, if it is CPIO format.

(3) Release the initrd contents to rootFS.

(4) Execute the /init file in initrd. At this point, all the work of the kernel is finished and the /init file is completely handled.

Depending on the core version, initrd files come in two formats: image and CPIO. ** Kernel 2.4 only uses the image format, while kernel 2.6 supports both formats. ** They are not only different in format, but also have completely different operating mechanisms and processes, and even different production methods. The KERNEL version of PVE is 2.6, so only cPIO initrd is described here.

Initrd decompression, modification, and compression process:

1. Decompress proxmox-ve_6.4-1. Iso. The initrd.img file in the boot directory is in gz format

(2) Back up initrd.img, rename it initrd.org.img, and decompress the file

$ sudo gzip -d -S ".img" ./initrd.org.img
Copy the code

View the format after executing file

$ sudo file initrd.org
initrd.org: ASCII cpio archive (SVR4 with no CRC)
Copy the code

(3) Create the initrd. TMP directory to store the restored files, and run the cPIO command to restore the files

$ sudo mkdir initrd.tmp $ cd initrd.tmp $ sudo cpio -id < .. /initrd.org 241820 blocks $ ls bin dev devfs etc init lib lib64 mnt proc sbin sys tmp usrCopy the code

Remove GRUB screen

The PVE uses GRUB2 during installation. To remove GRUB, find the boot/ GRUB /grub. CFG file in the original image, add set timeout=0, and then switch to the default Install Proxmox VE mode. We can also modify the default options to directly enter other modes if necessary.

$ vim grub.cfg 
$ cat grub.cfg
insmod gzio
insmod iso9660
insmod png

loadfont /boot/grub/unicode.pf2

set gfxmode=640x400
# set kernel parameter vga=791
# do not specify color depth here (else efifb can fall back to 800x600)
set gfxpayload=1024x768
#set gfxmode=auto
#set gfxpayload=keep

set timeout=0

insmod all_video
insmod gfxterm

set theme=/boot/grub/pvetheme/theme.txt

...
Copy the code

Custom pre-installed software

All pre-installed Proxmox VE software is stored in mirrored Proxmox/Packages. These packages are installed during PVE installation and are then configured to avoid dependency problems.

For custom preinstalled software, simply place the required DEB packages in the Proxmox/Packages directory, and the PVE will be automatically installed and configured by default.

Configure the preinstallation program

Pve only uses the default configuration to configure the software. If we want to configure the software in the desired form, we need to modify the usr/bin/proxInstall file in pVE-Installer. squashfs. Pve-installer. squashfs is a system loaded by the initrd during PVE installation. During the installation, ProxInstall is responsible for all the service logic, and the code for software configuration is as follows:

# needed for postfix postinst in case no other NIC is active syscmd("chroot $targetdir ifup lo"); 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, "you $1"); }});Copy the code

.

# set apt mirror
if (my $mirror = $cmap->{country}->{$country}->{mirror}) {
    my $fn = "$targetdir/etc/apt/sources.list";
    syscmd ("sed -i 's/ftp\\.debian\\.org/$mirror/' '$fn'");
}

# create extended_states for apt (avoid cron job warning if that
# file does not exist)
write_config ('', "$targetdir/var/lib/apt/extended_states");

# allow ssh root login
syscmd(['sed', '-i', 's/^#\?PermitRootLogin.*/PermitRootLogin yes/', "$targetdir/etc/ssh/sshd_config"]);
Copy the code

It can be seen that PVE is also a part of the program for personalized configuration, so the configuration file editing code only need to imitate the latter, use syscMD function, modify the command as a parameter, write after the former.

Customizing the Installation Interface

The create_main_window function in usr/bin/ proxInstall in pVE-Installer. squashfs is used to create various components in the GUI window. The structure of the installation UI can be obtained by analyzing this function.

The image at the top, the HTMLView window in the center, and the CMdBox below make up the look we see. Only image and htmlView are modified here.

Customizing the Installation Interface

The create_main_window function in usr/bin/ proxInstall in pVE-Installer. squashfs is used to create various components in the GUI window. The structure of the installation UI can be obtained by analyzing this function.

The image at the top, the HTMLView window in the center, and the CMdBox below make up the look we see. Only image and htmlView are modified here.

The image at the top is done by loading var/lib/ pVE-installer/pVE-banner.png under pVE-installer at line 1785, so you only need to replace it with an image of the same size 1024X164.

The htmlView in the center is loaded by calling display_html in each create_* function. The loaded HTML file is located in the var/lib/ pVE-installer/HTML folder. You only need to change the appearance of each HTML file.

In addition, because the language setting of openBox is not Chinese by default, garbled characters will appear when using Chinese characters. Therefore, HTML can load pictures containing Chinese characters to display Chinese characters.

To change the default input information, simply find the corresponding input box in ProxInstall and modify the default text.

Run the unsquashfs command to decompress the unsquashfs image

$ sudo unsquashfs pve-installer.squashfs Parallel unsquashfs: Using 16 processors 20078 inodes (25826 blocks) to write [===========================================================\] 25826/25826 100% created 19247 files created 2620 directories created 819 symlinks created 0 devices created 0 fifos $ ll total 3256748 dr-xr-xr-x 12 root root 4096 May 19 19:55 ./ dr-xr-xr-x 24 root root 4096 May 19 19:29 .. / -rw-r--r-- 1 root root 348389376 May 19 19:42 pve-installer.squashfs drwxr-xr-x 17 root root 4096 Apr 27 04:23 squashfs-root/ ...Copy the code

After the decompression is complete, the squashfs-root/ folder of the pVE-Installer. squashfs mirror disk is displayed. You can access this folder to view the boot system during installation

$ ll total 68 drwxr-xr-x 11 root root 4096 Mar 19 03:08 ./ dr-xr-xr-x 12 root root 4096 May 19 19:55 .. / drwxr-xr-x 2 root root 4096 Mar 19 03:08 boot/ drwxr-xr-x 2 root root 4096 Apr 27 04:25 cdrom/ drwxr-xr-x 2 root root 4096 Apr 27 04:25 devfs/ drwxr-xr-x 40 root root 4096 Apr 27 04:25 etc/ drwxr-xr-x 2 root root 4096 Apr 27 04:25 rpool/ -rwxr-xr-x 1 root root 376 Apr 26 09:53 .spice-vdagent.sh* drwxr-xr-x 2 root root 4096 Apr 27 04:25 target/ drwxr-xr-x 2  root root 4096 Apr 27 04:25 tmp/ drwxr-xr-x 8 root root 4096 Mar 19 03:08 usr/ drwxr-xr-x 5 root root 4096 Apr 26 09:53  var/ -rw-r--r-- 1 root root 87 Apr 26 09:53 .Xdefaults -rw-r--r-- 1 root root 140 Apr 26 09:53 .xinitrcCopy the code

Replace the prepared picture

$ sudo cp /home/cby/Desktop/pve-banner.png .
Copy the code

After decompressing the pve-base. Squashfs mirror disk, the squashfs-root/ folder is displayed

$ sudo unsquashfs pve-base.squashfs 
Parallel unsquashfs: Using 16 processors
12892 inodes (14248 blocks) to write

[===========================================================-] 14248/14248 100%

created 10856 files
created 1385 directories
created 2024 symlinks
created 9 devices
created 0 fifos

Copy the code

Enter this folder to view the system root directory after the installation

$ ll total 68 drwxr-xr-x 17 root root 4096 Apr 27 04:23 ./ dr-xr-xr-x 12 root root 4096 May 19 19:55 .. / lrwxrwxrwx 1 root root 7 Apr 27 04:22 bin -> usr/bin/ drwxr-xr-x 3 root root 4096 Apr 27 04:23 boot/ drwxr-xr-x 5 root  root 4096 Apr 27 04:23 dev/ drwxr-xr-x 57 root root 4096 Apr 27 04:23 etc/ drwxr-xr-x 2 root root 4096 Mar 19 16:44 home/ lrwxrwxrwx 1 root root 7 Apr 27 04:22 lib -> usr/lib/ lrwxrwxrwx 1 root root 9 Apr 27 04:22 lib32 -> usr/lib32/ lrwxrwxrwx 1 root root 9 Apr 27 04:22 lib64 -> usr/lib64/ lrwxrwxrwx 1 root root 10 Apr 27 04:22 libx32 -> usr/libx32/ drwxr-xr-x 2 root root 4096 Apr 27 04:22 media/ drwxr-xr-x 2 root root 4096 Apr 27 04:22 mnt/ drwxr-xr-x 2 root root 4096 Apr 27 04:22 opt/ drwxr-xr-x 2 root root 4096 Mar 19 16:44 proc/ drwx------ 2 root root 4096 Apr 27 04:23 root/ drwxr-xr-x 5 root root 4096 Apr 27 04:23 run/ lrwxrwxrwx 1 root root 8 Apr 27 04:22 sbin -> usr/sbin/ drwxr-xr-x 2 root root 4096 Apr 27 04:22 srv/ drwxr-xr-x 2 root root 4096 Mar 19 16:44 sys/ drwxrwxrwt 2 root root 4096 Apr 27 04:23 tmp/ drwxr-xr-x 13 root root 4096 Apr 27 04:22 usr/ drwxr-xr-x 11 root root 4096 Apr 27 04:22 var/Copy the code

After modifying the file system to be customized, use the following command to package the file system

$ sudo mksquashfs squashfs-root/ pve-installer.squashfs Parallel mksquashfs: Using 16 Processors Creating 4.0 filesystem on pve-installer. Squashfs -, block size 131072. [===========================================================\] 25008/25008 100% Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072 compressed data, compressed metadata, compressed fragments, compressed xattrs, Compressed IDS duplicates are removed Filesystem size 340223.99 Kbytes (332.25 Mbytes) 33.70% of uncompressed Filesystem Size (1009698.26 Kbytes) Inode table size 225637 bytes (220.35 Kbytes) 29.06% of uncompressed Inode table size (776542) Bytes) Directory table size 235667 bytes (230.14kbytes) 38.69% of uncompressed Directory table size (609117 bytes) Xattr table size 673 bytes (0.66 Kbytes) 7.40% of uncompressed Xattr table size (9096 bytes) Number of duplicate files found 853 Number of inodes 22686 Number of files 19247 Number of fragments 1982 Number of symbolic links 819 Number of device nodes 0 Number of fifo nodes 0 Number of socket nodes 0 Number of directories 2620 Number of ids (unique uids + gids) 9 Number of uids 3 root (0) man (6) syslog (104) Number of gids 7 root (0) shadow (42) bluetooth (112) utmp (43) staff (50) man (12) tss (111)Copy the code

Use this name to create an ISO mirror disk

Iso-r -V 'inspur' --grub2-mbr proxmox. MBR --protective MSdos-label. $sudo xorriso -as mkisofs-o proxmox-ve_6 -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. xorriso 1.5.2: RockRidge Filesystem, libburnia project. Drive current: -outdev 'stdio:proxmox-ve_6.4-1. Iso 'Media current: stdio file, overwriteable Media status : is blank Media summary: 0 sessions, 0 data blocks, 0 data, 78.0g free Xorriso: WARNING: -volid text does not comply to ISO 9660 / ECMA 119 rules Added to ISO image: directory '/'='/home/cby/chenby' xorriso : UPDATE : 32892 files added in 1 seconds xorriso : UPDATE : 32892 files added in 1 seconds xorriso : NOTE : Copying to System Area: 512 bytes from file '/home/cby/chenby/proxmox.mbr' libisofs: NOTE : Automatically adjusted MBR geometry to 1021/155/32 xorriso: UPDATE: 0.66% done xorriso: UPDATE: 8.03% done xorriso: UPDATE: 19.34% done xorriso: UPDATE: 34.06% done, estimate finish Wed May 19 19:46:25 2021 Xorriso: UPDATE: 48.84% done, estimate finish Wed May 19 19:46:24 2021 Xorriso: UPDATE: 61.72% done, estimate finish Wed May 19 19:46:24 2021 Xorriso: UPDATE: 73.41% done, estimate finish Wed May 19 19:46:25 2021 Xorriso: UPDATE: 82.19% done, estimate finish Wed May 19 19:46:25 2021 Xorriso: UPDATE: 92.15% done xorriso: UPDATE: 97.28% done ISO image produced: 1264917 sectors Written to medium: 1264917 sectors at LBA 0 Writing to 'stdio:proxmox-ve_6.4-1. Iso 'completed successfully.Copy the code

After the newly created ISO image disk is used to start the SYSTEM, the modified background image is displayed. By modifying the root directory file, you can implement a fully customized PVE system.

In proxmox/ Packages, find the DEB installation package for PVE-Manager.

$ls | grep manager pve - ha - manager_3. 1-1 _amd64. Deb pve - manager_6. 4-4 _amd64. DebCopy the code
$mkdir extract/DEBIAN, $mkdir extract/DEBIAN $sudo dpkg-x./ pVE-manager_6.4-4_amd64. deb extract/ $sudo dpkg-x./ pVE-manager_6.4-4_amd64. deb extract/Copy the code

After modifying the required code in the decompressed package, import the control information of the Debian package, which can be packaged again into a DEB package using commands.

$sudo DpkG-deb-e./ pVE-Manager_6.4-4_amd64. deb extract/DEBIAN/ $ls extract/DEBIAN/ conffiles control md5sums postinst  postrm preinst prerm triggers $ sudo dpkg-deb -b ./extract 123.deb dpkg-deb: building package 'pve-manager' in '123.deb'. $ ll 123.deb -rw-r--r-- 1 root root 2042764 May 19 21:54 123.debCopy the code

View deb package details.

$dpkg-deb -i 123.deb new Debian package, version 2.0. size 2042764 bytes: control archive=16976 bytes. 320 bytes, 10 lines conffiles 1532 bytes, 15 lines control 56553 bytes, 574 lines md5sums 3246 bytes, 101 lines * postinst #! /bin/sh 1645 bytes, 44 lines * postrm #! /bin/sh 192 bytes, 5 lines * preinst #! /bin/sh 626 bytes, 24 lines * prerm #! /bin/sh 33 bytes, 1 Lines Triggers Package: PVE-Manager Version: 6.4-4 Architecture: AMD64 Maintainer: Proxmox Support Team <[email protected]> Installed-Size: 9876 Depends: Apt - transport - HTTPS | apt (> = 1.5), ca - certificates, cstream, dtach, fonts - the font - awesome, gdisk, hdparm, Ifenslave (> = 2.6) | ifupdown2 (> = + pve8 2.0.1-1), libapt - PKG - perl, libc6 (> = 2.14), libcrypt ssleay - perl, Libfile readbackwards - perl, libfilesys - df - perl, libjs - extjs (> = the 6.0.1), libjson - perl, liblwp - protocol - HTTPS - perl, Libnet-dns-perl, libproxmox-acme-perl, libpve-access-control (>= 6.0-6), libpve-cluster-api-perl, libproxmox-acme-perl, libpve-access-control (>= 6.0-6), libpve-cluster-api-perl, Libpve-cluster-perl (>= 6.1-6), libpve-common-perl (>= 6.2-2), libpve-guest-common-perl (>= 3.1-5), Libpve-http-server-perl (>= 3.2-1), libpve-storage-perl (>= 6.3-6), librados2-perl, libtemplate-perl, Libterm -readline-gnu-perl, liburi-perl, libuuid-perl, libwww-perl (>= 6.04-1), logrotate, lsb-base, lzop, ZSTD, Novnc - pve, pciutils, perl (> = 5.10.0-19), postfix | mail - transport - agent, proxmox - mini - journalreader, Proxmox-widget-toolkit (>= 2.5-2), PVE-Cluster (>= 6.0-4), pVE-Container (>= 2.0-21), pVE-docs, pVE-firewall, proxmox-Widget-Toolkit (>= 2.5-2), pVE-Cluster (>= 6.0-4), pVE-Container (>= 2.0-21), Pve-ha-manager, PVE-I18N (>= 1.0-3), PVE-XtermJS (>= 0.1-1), qEMU-Server (>= 6.2-17), rsync, SpiceTerm, SystemD, Vncterm, wget Suggests: libpve-network-perl (>= 0.5-1) Conflicts: VLAN, vzdump Breaks: Libpve-network-perl (<< 0.5-1) Replaces: VLAN, vzdump Provides: VLAN, vzdump Section: admin Priority: optional Description: Proxmox Virtual Environment Management Tools This package contains the Proxmox Virtual Environment management tools.Copy the code

The deb package will be put back to the original directory, in ISO packaging, so that after installing the system image can be customized pages.

This article uses the article synchronization assistant to synchronize