Building a Custom UNetbootin Version
This process may be somewhat difficult for some; for an easier approach, see Command-line Options (for building scripts), Bundling together a script, a disk image, and UNetbootin into a single executable, and Building a UNetbootin Plugin.
Getting the Source
First, you will need to get the latest source release, by installing bzr and running:
bzr branch lp:unetbootin
Defining a distribution
Code Examples
From unetbootin.h:
This is for Elive:
#ifdef ELIVE #define UNETBOOTINB "Elive USB Installer" #define NOMANUAL #define NOFLOPPY //#define USBINSTALL #endif
This is for Auto Super Grub Disk:
#ifdef AUTOSUPERGRUBDISK #define UNETBOOTINB "Auto Super Grub Disk" #define NOEXTERN //#define NOISO #define HDDINSTALL #endif
Adding a selection entry into the menu
Code Examples
From unetbootin.cpp:
This is for EeePCLinuxOS:
#ifdef EEEPCLOS
distroselect->addItem("EeePCLinuxOS", (QStringList() << "pre2008_Live" <<
tr("<img src=\":/eeepclos.png\" /><br/>"
"<b>Homepage:</b> <a href=\"http://www.eeepclinuxos.com/\">http://www.eeepclinuxos.com</a><br/>"
"<b>Description:</b> EeePCLinuxOS is a user-friendly PCLinuxOS based distribution for the EeePC.<br/>"
"<b>Install Notes:</b> Make sure install media is empty and formatted before proceeding with install.") <<
"pre2008_Live"));
#endif
This is for Ubuntu:
distroselect->addItem("Ubuntu", (QStringList() << "8.04_Live" <<
tr("<b>Homepage:</b> <a href=\"http://www.ubuntu.com/\">http://www.ubuntu.com</a><br/>"
"<b>Description:</b> Ubuntu is a user-friendly Debian-based distribution. It is currently the most popular Linux desktop distribution.<br/>"
"<b>Install Notes:</b> The Live version allows for booting in Live mode, from which the installer can optionally be launched. The NetInstall version allows for installation over FTP, and can install Kubuntu and other official Ubuntu derivatives.") <<
"6.06_NetInstall" << "6.06_NetInstall_x64" << "6.06_Live" << "6.06_Live_x64" << "6.10_NetInstall" << "6.10_NetInstall_x64" << "6.10_Live" << "6.10_Live_x64" << "7.04_NetInstall" << "7.04_NetInstall_x64" << "7.04_Live" << "7.04_Live_x64" << "7.10_NetInstall" << "7.10_NetInstall_x64" << "7.10_Live" << "7.10_Live_x64" << "8.04_NetInstall" << "8.04_NetInstall_x64" << "8.04_Live" << "8.04_Live_x64"));
Adding a download location
Code Examples
From distrolst.cpp:
This is for Ubuntu Eee:
#ifdef EEEUBUNTU
if (nameDistro == "Ubuntu Eee")
{
downloadfile(QString("http://lubi.sourceforge.net/ubuntu-eee-%1.iso").arg(relname), isotmpf);
extractiso(isotmpf, targetPath);
}
#endif
This is for Auto Super Grub Disk:
#ifdef AUTOSUPERGRUBDISK
if (nameDistro == "Auto Super Grub Disk")
{
instIndvfl("memdisk", QString("%1ubnkern").arg(targetPath));
instIndvfl("asgd.img", QString("%1ubninit").arg(targetPath));
}
#endif
This is for Elive:
#ifdef ELIVE
if (nameDistro == "Elive")
{
downloadfile(fileFilterNetDir(QStringList() <<
"http://elive.leviathan-avc.com/development/" <<
"http://elive.cmhacks.com/development/" <<
"http://elive.icedslash.com/isos/development/"
, 524288000, 1048576000, QList<QRegExp>() <<
QRegExp(".iso$", Qt::CaseInsensitive) <<
QRegExp("elive\\S{0,}.iso$", Qt::CaseInsensitive)
), isotmpf);
extractiso(isotmpf, targetPath);
}
#endif
This is for NetBSD:
if (nameDistro == "NetBSD")
{
if (isarch64)
{
cpuarch = "amd64";
}
else
{
cpuarch = "i386";
}
downloadfile(QString("http://ftp.netbsd.org/pub/NetBSD/NetBSD-%1/%2/binary/kernel/netbsd-INSTALL.gz").arg(relname, cpuarch), QString("%1ubnkern").arg(targetPath));
kernelParam = "--type=netbsd";
initrdLine = "";
initrdOpts = "";
initrdLoc = "";
}
This is for FreeBSD:
if (nameDistro == "FreeBSD")
{
if (isarch64)
{
cpuarch = "-x64";
}
else
{
cpuarch = "";
}
instIndvfl("memdisk", QString("%1ubnkern").arg(targetPath));
downloadfile(QString("http://downloads.sourceforge.net/sourceforge/lubi/freebsd-%1%2.img.gz").arg(relname, cpuarch), QString("%1ubninit").arg(targetPath));
}
This is for NTPasswd:
if (nameDistro == "NTPasswd")
{
downloadfile(QString("http://downloads.sourceforge.net/sourceforge/lubi/ntpasswd-%1-kernel").arg(relname), QString("%1ubnkern").arg(targetPath));
downloadfile(QString("http://downloads.sourceforge.net/sourceforge/lubi/ntpasswd-%1-initrd.gz").arg(relname), QString("%1ubninit").arg(targetPath));
kernelOpts = "rw vga=1 init=/linuxrc";
}
This is for Ubuntu:
if (nameDistro == "Ubuntu")
{
if (isarch64)
{
cpuarch = "amd64";
}
else
{
cpuarch = "i386";
}
if (islivecd)
{
downloadfile(fileFilterNetDir(QStringList() <<
"http://releases.ubuntu.com/"+relname <<
"http://releases.ubuntu.com/releases/"+relname <<
"ftp://releases.ubuntu.com/releases/.pool/" <<
"http://mirrors.gigenet.com/ubuntu/"+relname <<
"http://mirrors.easynews.com/linux/ubuntu-releases/"+relname <<
"http://www.gtlib.gatech.edu/pub/ubuntu-releases/"+relname <<
"http://ftp.wayne.edu/linux_distributions/ubuntu/"+relname <<
"http://ubuntu.mirrors.proxad.net/"+relname
, 524288000, 1048576000, QList<QRegExp>() <<
QRegExp(".iso$", Qt::CaseInsensitive) <<
QRegExp(cpuarch+".iso$", Qt::CaseInsensitive) <<
QRegExp("desktop-"+cpuarch+".iso$", Qt::CaseInsensitive) <<
QRegExp("desktop-"+cpuarch+".iso$", Qt::CaseInsensitive) <<
QRegExp("ubuntu\\S{0,}"+relname+"\\S{0,}desktop\\S{0,}"+cpuarch+"\\S{0,}.iso$", Qt::CaseInsensitive) <<
QRegExp("ubuntu-"+relname+"\\S{0,}-desktop-"+cpuarch+".iso$", Qt::CaseInsensitive)
), isotmpf);
extractiso(isotmpf, targetPath);
}
else
{
relname.replace("8.04", "hardy").replace("7.10", "gutsy").replace("7.04", "feisty").replace("6.10", "edgy").replace("6.06", "dapper");
downloadfile(QString("http://archive.ubuntu.com/ubuntu/dists/%1/main/installer-%2/current/images/netboot/ubuntu-installer/%2/linux").arg(relname, cpuarch), QString("%1ubnkern").arg(targetPath));
downloadfile(QString("http://archive.ubuntu.com/ubuntu/dists/%1/main/installer-%2/current/images/netboot/ubuntu-installer/%2/initrd.gz").arg(relname, cpuarch), QString("%1ubninit").arg(targetPath));
kernelOpts = "vga=normal";
}
}
This is for Frugalware:
if (nameDistro == "Frugalware")
{
if (isarch64)
{
cpuarch = "x86_64";
}
else
{
cpuarch = "i686";
}
QStringList frugalwaremirrorsL = QStringList() <<
// "ftp://ftp5.frugalware.org/packages/frugalware/pub/frugalware-"+relname+"/boot/" <<
// "http://www5.frugalware.org/packages/frugalware/pub/frugalware-"+relname+"/boot/" <<
"ftp://ftp8.frugalware.org/distro/frugalware/frugalware-"+relname+"/boot/" <<
"http://www8.frugalware.org/distro/frugalware/frugalware-"+relname+"/boot/" <<
"ftp://ftp10.frugalware.org/pub/linux/frugalware/frugalware-"+relname+"/boot/" <<
"http://www10.frugalware.org/pub/linux/frugalware/frugalware-"+relname+"/boot/" <<
"ftp://ftp12.frugalware.org/mirrors/ftp.frugalware.org/pub/frugalware/frugalware-"+relname+"/boot/" <<
"http://www12.frugalware.org/mirrors/ftp.frugalware.org/pub/frugalware/frugalware-"+relname+"/boot/" <<
"ftp://ftp4.frugalware.org/pub/linux/distributions/frugalware/frugalware-"+relname+"/boot/" <<
"http://www4.frugalware.org/pub/linux/distributions/frugalware/frugalware-"+relname+"/boot/" <<
"ftp://ftp2.frugalware.org/frugalware/pub/frugalware/frugalware-"+relname+"/boot/" <<
"ftp://ftp3.frugalware.org/mirrors/frugalware/pub/frugalware/frugalware-"+relname+"/boot/";
downloadfile(fileFilterNetDir(frugalwaremirrorsL
, 307200, 104857600, QList<QRegExp>() <<
QRegExp("vmlinuz", Qt::CaseInsensitive) <<
QRegExp("^vmlinuz-", Qt::CaseInsensitive) <<
QRegExp(cpuarch, Qt::CaseInsensitive) <<
QRegExp("-"+cpuarch+"$", Qt::CaseInsensitive) <<
QRegExp("^vmlinuz-\\S{1,}-"+cpuarch+"$", Qt::CaseInsensitive)
), QString("%1ubnkern").arg(targetPath));
downloadfile(fileFilterNetDir(frugalwaremirrorsL
, 3145728, 1048576000, QList<QRegExp>() <<
QRegExp("initrd", Qt::CaseInsensitive) <<
QRegExp("^initrd-", Qt::CaseInsensitive) <<
QRegExp(cpuarch, Qt::CaseInsensitive) <<
QRegExp("-"+cpuarch+".img", Qt::CaseInsensitive) <<
QRegExp("-"+cpuarch+".img.gz$", Qt::CaseInsensitive) <<
QRegExp("^initrd-\\S{0,}"+cpuarch+".img.gz$", Qt::CaseInsensitive)
), QString("%1ubninit").arg(targetPath));
kernelOpts = "load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=100000 rw root=/dev/ram quiet vga=791";
}
Creating a Build Script
Code Examples
From build-eeeubuntu:
#!/bin/sh mingwb="$(ls /usr/ | grep mingw32 | head --lines 1)" rvern="$(./vcs-revno)" make clean rm Makefile* rm release/* lupdate-qt4 unetbootin.pro lrelease-qt4 unetbootin.pro ./qmake-windows "DEFINES += EEEUBUNTU" "RESOURCES += unetbootin-eeeubuntu.qrc" make $mingwb-strip --strip-all release/unetbootin.exe mv release/unetbootin.exe release/unetbootin-eeeubuntu-windows-$rvern.exe ./upx --lzma release/unetbootin-eeeubuntu-windows-$rvern.exe ./qmake-linux "DEFINES += EEEUBUNTU" "RESOURCES += unetbootin-eeeubuntu.qrc" make $mingwb-strip --strip-all unetbootin mv unetbootin release/unetbootin-eeeubuntu-linux-$rvern ./upx --lzma release/unetbootin-eeeubuntu-linux-$rvern qmake-qt4 -spec linux-g++-32 "RESOURCES += unetbootin-linux.qrc"
Adding Logos and Custom Resources (Optional)
Code Examples
From unetbootin-autosupergrubdisk.qrc:
<RCC>
<qresource prefix="/" >
<file>asgd_en.htm</file>
<file>asgd_es.htm</file>
<file>asgd.img</file>
<file>asgd1.png</file>
<file>asgd2.png</file>
<file>asgd3.png</file>
<file>asgd4.png</file>
<file>asgd5.png</file>
<file>asgd6.png</file>
<file>asgd7.png</file>
<file>asgd8.png</file>
<file>asgd9.png</file>
<file>asgd10.png</file>
<file>asgd11.png</file>
<file>asgd12.png</file>
</qresource>
</RCC>
From unetbootin-eeeubuntu.qrc:
<RCC>
<qresource prefix="/" >
<file>eeeubuntu.png</file>
</qresource>
</RCC>
Embedding disk images (Optional)
Embedding a disk image will significantly increase the size of your generated unetbootin executable, but will save the user the need to download anything.
You will first want to add the disk image filename (*.iso or *.img) to the .qrc file and place the actual file in the same directory; for example:
From unetbootin-autosupergrubdisk.qrc:
<RCC>
<qresource prefix="/" >
<file>asgd.img</file>
</qresource>
</RCC>
Now you will want to edit distrolist.cpp to have it use the embedded disk image; the file (in this example "mydistro.iso") is accessible via ":/mydistro.iso" when using QFile, or can be coped to another path via instIndvfl("mydistro.iso", targetpath).
If you embedded a floppy disk image, just have it copy it and memdisk to the target drive:
This is for Auto Super Grub Disk:
#ifdef AUTOSUPERGRUBDISK
if (nameDistro == "Auto Super Grub Disk")
{
instIndvfl("memdisk", QString("%1ubnkern").arg(targetPath));
instIndvfl("asgd.img", QString("%1ubninit").arg(targetPath));
}
#endif
If you embedded an iso file as mydistro.iso, use the following code:
#ifdef MYDISTRO
if (nameDistro == "MyDistro")
{
instIndvfl("mydistro.iso", isotmpf);
extractiso(isotmpf, targetPath);
QFile::remove(isotmpf);
}
#endif
Claiming it as your own (Optional)
Code Examples
From ubnembed.rc:
#define RT_MANIFEST 24
#define APP_MANIFEST 1
APP_MANIFEST RT_MANIFEST unetbootin.exe.manifest
1 VERSIONINFO
FILEVERSION 1,1,1,1
PRODUCTVERSION 1,1,1,1
{
BLOCK "StringFileInfo"
{
BLOCK "040904E4"
{
VALUE "CompanyName", "Geza Kovacs"
VALUE "FileVersion", " "
VALUE "FileDescription", "UNetbootin - Universal Netboot Installer - http://unetbootin.sourceforge.net"
VALUE "InternalName", "UNetbootin - Universal Netboot Installer"
VALUE "LegalCopyright", "Copyright - Geza Kovacs - License - GNU GPL v2+"
VALUE "LegalTrademarks", " "
VALUE "OriginalFilename", "unetbootin.exe"
VALUE "ProductName", "UNetbootin - Universal Netboot Installer"
VALUE "ProductVersion", " "
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 1033, 1252
}
}
Compiling
Now, you're ready to compile and distribute your custom version of UNetbootin. See the compiling page for instructions. Once you're done, make sure to add your customized version to the list of custom UNetbootin versions and derivatives.
See Also
Building a UNetbootin Plugin
List of Custom UNetbootin Versions and Plugins (publicly editable)