一.lorax生成
lorax是红帽主导开发的RH系发行版生成工具,可以生成Fedora、RHEL、OpenEuler、Rocky等各种RH系发行版。
以下是利用lorax生成Fedora的方法:
如果程序报错,直接按下ctrl+c退出。在再次运行工具之前,需要删除刚刚的文件夹 例如:出现2026-06-16 18:45:12,362: Running anaconda failed: process '['unshare', '--pid', '--kill-child', '--mount', '--propagation', 'unchanged', 'anaconda', '--kickstart', '/home/hank/output.ks', '--cmdline', '--dirinstall', '--remotelog', '127.0.0.1:48443']' exited with status 1 一类的话,这就说明这将会失败。
现在,只要ks配置无误,工具便会开始生成了:)(在配置的时候,可能会有与selinux相关的气泡产生,这是正常现象)
优点:傻瓜式 缺点:只能在RH系上制作、即将过时
二.利用一些工具手搓
方法:
1.创建文件夹
2.用dnf向文件夹里安装所需的包(必须安装:@core @anaconda-tools anaconda-install-env-deps dracut-live anaconda-live glibc-all-langpacks kernel-modules-extra kernel-modules livesys-scripts kernel),命令:dnf install 【包】-y --installroot 【文件夹的绝对路径】
3.把宿主系统的resolv.conf和dnf源移动到系统内,并挂载proc、tmp、sys、dev、run
4.依次向制作好的系统内运行以下命令:
systemctl enable livesys-late.service livesys.service tmp.mount (自启live组件、tmpfs)
/usr/bin/mandb(更新man手册的缓存)
rm -f chroot/var/lib/rpm/__db* chroot/core* chroot/var/lib/systemd/random-seed chroot/boot/-rescue chroot/etc/machine-id (删除无用文件) touch chroot/etc/machine-id
cat >> chroot/etc/fstab << EOF vartmp /var/tmp tmpfs defaults 0 0 EOF(挂tmp)
如果你还需要安装桌面,则需要运行:sed -i 's/^livesys_session=.*/livesys_session="【桌面】"/' chroot/etc/sysconfig/livesys
然后利用以下命令生成initrd:dracut -v --force --no-hostonly --no-hostonly-cmdline --add "dmsquash-live network-manager overlayfs" --kernel-cmdline "systemd.log_level=debug systemd.log_target=console rd.shell=0" --modules "bash systemd dracut-systemd i18n plymouth drm kernel-modules dmsquash-live network-manager overlayfs rootfs-block fs-lib" --install "/bin/mount /bin/umount /bin/journalctl" initrd.img --kver 【内核版本】
5.然后卸载rootfs系统的proc、tmp、sys、dev、run后制作squashfs
6.写grub配置文件
7.把grub配置文件移动到一个新的文件夹的boot/grub(或boot/grub2,取决于你的宿主机系统)文件夹,把squashfs移动到那个新的文件夹的新的LiveOS文件夹中,还得把你创建的新的initrd与rootfs系统的/boot的mlinuz文件移动到一个文件夹里,这个你就随意,名字合法即可
8。利用grub-mkrescue打包
以下是完整的命令:
#!/bin/bash
mkdir chroot
dnf install @core @anaconda-tools anaconda-install-env-deps dracut-live anaconda-live glibc-all-langpacks kernel-modules-extra kernel-modules livesys-scripts kernel -y --installroot $(realpath chroot)
mount --bind /run chroot/run mount --bind /sys chroot/sys mount --bind /tmp chroot/tmp mount --bind /proc chroot/proc mount --bind /dev chroot/dev rm -r chroot/etc/resolv.conf cp -r /etc/resolv.conf chroot/etc/resolv.conf rm -r chroot/etc/yum.repos.d cp -r /etc/yum.repos.d chroot/etc
chroot ./chroot dnf install plasma-desktop konsole dolphin plasma-discover plasma-camera gwenview kate vlc timeshift plasma-login-manager plasma-setup kde-l10n @guest-desktop-agents kcalc plymouth-theme-spinner plasma-nm fcitx5 kinfocenter -y chroot ./chroot systemctl enable livesys-late.service livesys.service tmp.mount chroot ./chroot /usr/bin/mandb KERN_VER=$(ls -1 "chroot/lib/modules/" | head -1) chroot ./chroot dracut -v --force --no-hostonly --no-hostonly-cmdline --add "dmsquash-live network-manager overlayfs" --kernel-cmdline "systemd.log_level=debug systemd.log_target=console rd.shell=0" --modules "bash systemd dracut-systemd i18n plymouth drm kernel-modules dmsquash-live network-manager overlayfs rootfs-block fs-lib" --install "/bin/mount /bin/umount /bin/journalctl" initrd.img --kver ${KERN_VER} cat >> chroot/etc/locale.conf << "EOF" LANG=zh_CN.UTF-8 LC_TIME=zh_CN.UTF-8 LC_MESSAGES=zh_CN.UTF-8 LC_CTYPE=zh_CN.UTF-8 LC_NUMERIC=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 EOF source /etc/locale.conf timedatectl set-timezone Asia/Shanghai sudo localectl set-x11-keymap us,cn pc105 "" grp:win_space_toggle
cp -r include/* chroot/
umount -l chroot/tmp chroot/run chroot/sys chroot/proc chroot/dev chroot/sys
rm -f chroot/var/lib/rpm/__db* chroot/core* chroot/var/lib/systemd/random-seed chroot/boot/-rescue chroot/etc/machine-id touch chroot/etc/machine-id cat >> chroot/etc/fstab << EOF vartmp /var/tmp tmpfs defaults 0 0 EOF sed -i 's/^livesys_session=.*/livesys_session="kde"/' chroot/etc/sysconfig/livesys
mkdir iso mkdir iso/{boot,LiveOS} mv chroot/initrd.img iso/LiveOS cp chroot/boot/vmlinuz* iso/LiveOS/vmlinuz mkdir iso/boot/grub cat >> iso/boot/grub/grub.cfg << EOF set default="0"
function load_video { insmod all_video }
load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod ext2 insmod chain
set timeout=60
END /etc/grub.d/00_header
search --no-floppy --set=root -l 'NirvanaOS-53'
BEGIN /etc/grub.d/10_linux
menuentry 'Start NirvanaOS' --class fedora --class gnu-linux --class gnu --class os { linux /LiveOS/vmlinuz root=live:CDLABEL=NirvanaOS-53 rd.live.image quiet rhgb selinux=0 initrd /LiveOS/initrd.img } menuentry 'Test this media & start NirvanaOS' --class fedora --class gnu-linux --class gnu --class os { linux /LiveOS/vmlinuz root=live:CDLABEL=NirvanaOS-53 rd.live.image rd.live.check quiet selinux=0 initrd /LiveOS/initrd.img } menuentry 'Start NirvanaOS in basic graphics mode' --class fedora --class gnu-linux --class gnu --class os { linux /LiveOS/vmlinuz root=live:CDLABEL=NirvanaOS-53 rd.live.image nomodeset vga=791 quiet rhgb selinux=0 initrd /LiveOS/initrd.img } EOF
umount -l chroot/tmp chroot/run chroot/sys chroot/proc chroot/dev chroot/sys mksquashfs chroot squashfs.img -comp xz -Xbcj x86 -b 1M -noappend mv squashfs.img ./iso/LiveOS grub-mkrescue -o result.iso -V "NirvanaOS-53" iso -iso-level 3 -J -R
优点:不受发行版的约束,只要你的发行版能安装dnf、grub工具、squashfs工具等即可,并且自由度更高,你随时可以停止在某一步
缺点:复杂,对新手小白不友好
注:该方法还适用于打包虚拟机内的Fedora系统,从第4步骤开始即可,只不过你需要根据环境而变换
其他方法有kiwi、osbuild等,都是很高效的办法,可以自己研究
(因为步骤简单,所以我才不把某个发行版看作宝)
基本都是一样的原理
是的,原理大差不差,用相似的原理同样可以作ArchLinux、Debian等
Featured Collection
Popular Events
一.lorax生成
lorax是红帽主导开发的RH系发行版生成工具,可以生成Fedora、RHEL、OpenEuler、Rocky等各种RH系发行版。
以下是利用lorax生成Fedora的方法:
sudo dnf install pykickstart lorax
通过git:git clone https://pagure.io/fedora-kickstarts.git -b f43
(为什么是43:Fedora在44时全面使用了其他工具,所以不再维护ks文件了;但是不要怕,只需要为releasever定义为最新版本即可)
具体命令:ksflatten -c xxx -o xxx
现在ks已经合并好了,让我们来修改吧!具体怎么修改,可以看看redhat等提供的相关文档
让我们来看看最少有哪些参数是我们所需要的:
--make-iso:生成iso,不需要赋值
--ks:定义ks,需要赋值,定义ks的路径
--iso-name 生成的iso名字,需要赋值,只需要随便定义一个名字
--resultdir 结果的输出目录,需要赋值 需要定义绝对路径,并且定义的文件夹原来是不存在的(不要自己手动生成文件夹,否则会报错)
--image-size-align rootfs空间大小,需要赋值(这个为了防止rootfs过大)
--no-virt 不用虚拟化软件,无需赋值
--releasever 生成的系统的版本,需要赋值
这里是我给出的示例: sudo livemedia-creator --make-iso --iso-name 1.iso --ks output.ks --resultdir /home/hank/Videos/test --no-virt --image-size-align=10240 --releasever 44
如果程序报错,直接按下ctrl+c退出。在再次运行工具之前,需要删除刚刚的文件夹
例如:出现2026-06-16 18:45:12,362: Running anaconda failed: process '['unshare', '--pid', '--kill-child', '--mount', '--propagation', 'unchanged', 'anaconda', '--kickstart', '/home/hank/output.ks', '--cmdline', '--dirinstall', '--remotelog', '127.0.0.1:48443']' exited with status 1 一类的话,这就说明这将会失败。
现在,只要ks配置无误,工具便会开始生成了:)(在配置的时候,可能会有与selinux相关的气泡产生,这是正常现象)
优点:傻瓜式 缺点:只能在RH系上制作、即将过时
二.利用一些工具手搓
方法:
1.创建文件夹
2.用dnf向文件夹里安装所需的包(必须安装:@core @anaconda-tools anaconda-install-env-deps dracut-live anaconda-live glibc-all-langpacks kernel-modules-extra kernel-modules livesys-scripts kernel),命令:dnf install 【包】-y --installroot 【文件夹的绝对路径】
3.把宿主系统的resolv.conf和dnf源移动到系统内,并挂载proc、tmp、sys、dev、run
4.依次向制作好的系统内运行以下命令:
systemctl enable livesys-late.service livesys.service tmp.mount (自启live组件、tmpfs)
/usr/bin/mandb(更新man手册的缓存)
rm -f chroot/var/lib/rpm/__db* chroot/core* chroot/var/lib/systemd/random-seed chroot/boot/-rescue chroot/etc/machine-id (删除无用文件)
touch chroot/etc/machine-id
cat >> chroot/etc/fstab << EOF
vartmp /var/tmp tmpfs defaults 0 0
EOF(挂tmp)
如果你还需要安装桌面,则需要运行:sed -i 's/^livesys_session=.*/livesys_session="【桌面】"/' chroot/etc/sysconfig/livesys
然后利用以下命令生成initrd:dracut -v --force --no-hostonly --no-hostonly-cmdline --add "dmsquash-live network-manager overlayfs" --kernel-cmdline "systemd.log_level=debug systemd.log_target=console rd.shell=0" --modules "bash systemd dracut-systemd i18n plymouth drm kernel-modules dmsquash-live network-manager overlayfs rootfs-block fs-lib" --install "/bin/mount /bin/umount /bin/journalctl" initrd.img --kver 【内核版本】
5.然后卸载rootfs系统的proc、tmp、sys、dev、run后制作squashfs
6.写grub配置文件
7.把grub配置文件移动到一个新的文件夹的boot/grub(或boot/grub2,取决于你的宿主机系统)文件夹,把squashfs移动到那个新的文件夹的新的LiveOS文件夹中,还得把你创建的新的initrd与rootfs系统的/boot的mlinuz文件移动到一个文件夹里,这个你就随意,名字合法即可
8。利用grub-mkrescue打包
以下是完整的命令:
#!/bin/bash
mkdir chroot
dnf install @core @anaconda-tools anaconda-install-env-deps dracut-live anaconda-live glibc-all-langpacks kernel-modules-extra kernel-modules livesys-scripts kernel -y --installroot $(realpath chroot)
mount --bind /run chroot/run
mount --bind /sys chroot/sys
mount --bind /tmp chroot/tmp
mount --bind /proc chroot/proc
mount --bind /dev chroot/dev
rm -r chroot/etc/resolv.conf
cp -r /etc/resolv.conf chroot/etc/resolv.conf
rm -r chroot/etc/yum.repos.d
cp -r /etc/yum.repos.d chroot/etc
chroot ./chroot dnf install plasma-desktop konsole dolphin plasma-discover plasma-camera gwenview kate vlc timeshift plasma-login-manager plasma-setup kde-l10n @guest-desktop-agents kcalc plymouth-theme-spinner plasma-nm fcitx5 kinfocenter -y
chroot ./chroot systemctl enable livesys-late.service livesys.service tmp.mount
chroot ./chroot /usr/bin/mandb
KERN_VER=$(ls -1 "chroot/lib/modules/" | head -1)
chroot ./chroot dracut -v --force --no-hostonly --no-hostonly-cmdline --add "dmsquash-live network-manager overlayfs" --kernel-cmdline "systemd.log_level=debug systemd.log_target=console rd.shell=0" --modules "bash systemd dracut-systemd i18n plymouth drm kernel-modules dmsquash-live network-manager overlayfs rootfs-block fs-lib" --install "/bin/mount /bin/umount /bin/journalctl" initrd.img --kver ${KERN_VER}
cat >> chroot/etc/locale.conf << "EOF"
LANG=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_MESSAGES=zh_CN.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_COLLATE=en_US.UTF-8
EOF
source /etc/locale.conf
timedatectl set-timezone Asia/Shanghai
sudo localectl set-x11-keymap us,cn pc105 "" grp:win_space_toggle
cp -r include/* chroot/
umount -l chroot/tmp chroot/run chroot/sys chroot/proc chroot/dev chroot/sys
rm -f chroot/var/lib/rpm/__db* chroot/core* chroot/var/lib/systemd/random-seed chroot/boot/-rescue chroot/etc/machine-id
touch chroot/etc/machine-id
cat >> chroot/etc/fstab << EOF
vartmp /var/tmp tmpfs defaults 0 0
EOF
sed -i 's/^livesys_session=.*/livesys_session="kde"/' chroot/etc/sysconfig/livesys
mkdir iso
mkdir iso/{boot,LiveOS}
mv chroot/initrd.img iso/LiveOS
cp chroot/boot/vmlinuz* iso/LiveOS/vmlinuz
mkdir iso/boot/grub
cat >> iso/boot/grub/grub.cfg << EOF
set default="0"
function load_video {
insmod all_video
}
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
insmod chain
set timeout=60
END /etc/grub.d/00_header
search --no-floppy --set=root -l 'NirvanaOS-53'
BEGIN /etc/grub.d/10_linux
menuentry 'Start NirvanaOS' --class fedora --class gnu-linux --class gnu --class os {
linux /LiveOS/vmlinuz root=live:CDLABEL=NirvanaOS-53 rd.live.image quiet rhgb selinux=0
initrd /LiveOS/initrd.img
}
menuentry 'Test this media & start NirvanaOS' --class fedora --class gnu-linux --class gnu --class os {
linux /LiveOS/vmlinuz root=live:CDLABEL=NirvanaOS-53 rd.live.image rd.live.check quiet selinux=0
initrd /LiveOS/initrd.img
}
menuentry 'Start NirvanaOS in basic graphics mode' --class fedora --class gnu-linux --class gnu --class os {
linux /LiveOS/vmlinuz root=live:CDLABEL=NirvanaOS-53 rd.live.image nomodeset vga=791 quiet rhgb selinux=0
initrd /LiveOS/initrd.img
}
EOF
umount -l chroot/tmp chroot/run chroot/sys chroot/proc chroot/dev chroot/sys
mksquashfs chroot squashfs.img -comp xz -Xbcj x86 -b 1M -noappend
mv squashfs.img ./iso/LiveOS
grub-mkrescue -o result.iso -V "NirvanaOS-53" iso -iso-level 3 -J -R
优点:不受发行版的约束,只要你的发行版能安装dnf、grub工具、squashfs工具等即可,并且自由度更高,你随时可以停止在某一步
缺点:复杂,对新手小白不友好
注:该方法还适用于打包虚拟机内的Fedora系统,从第4步骤开始即可,只不过你需要根据环境而变换
其他方法有kiwi、osbuild等,都是很高效的办法,可以自己研究
(因为步骤简单,所以我才不把某个发行版看作宝)