From Fedora Project Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Newbie on the anaconda team

Personal homepage

Maintainer of:


Anaconda Development

Development System

  • Fedora 12
  • squid proxy to cache packages
  • lighttpd to serve up updates.img
  • tftpd to serve up pxe boot images
  • mock + pungi for building

mock setup

  • yum install mock
  • Edit the /etc/mock/site-defaults.cfg file to bind your working directories inside the mock root. This keeps mock from wiping those directories on --init
config_opts['plugin_conf']['bind_mount_enable'] = True
config_opts['plugin_conf']['bind_mount_opts']['dirs'].append(('/home/user/projs/anaconda', '/root/anaconda' ))
config_opts['plugin_conf']['bind_mount_opts']['dirs'].append(('/local/repo', '/repo' ))
config_opts['plugin_conf']['bind_mount_opts']['dirs'].append(('/local/pungi', '/pungi' ))
  • Edit the /etc/mock/ file for the distribution or copy it to a new name and edit
    • Add proxy=http://proxy.home:3128 to the main section.
    • comment out mirrorlist entries
    • Open up the mirror list url(s) in a browser and pick a mirror, use the same one for base and updates
    • Add baseurl=<mirror url> in each section instead of mirrorlist
    • Do this for each section with a mirrorlist
  • Setup the initial mock environment, replace the fedora-13-i386 with the mock file edited above
    • mock -r fedora-13-i386 --init
    • mock -r fedora-13-i386 --no-clean --install pungi
  • Enter the chroot - mock -r fedora-13-i386 --shell
    • Edit /usr/lib/anaconda-runtime/buildinstall
    • Edit /usr/lib/python2.6/site-packages/pypungi/__init__.py to add:
diff --git a/src/pypungi/__init__.py b/src/pypungi/__init__.py
index e57e72a..d30eefa 100644
--- a/src/pypungi/__init__.py
+++ b/src/pypungi/__init__.py
@@ -206,6 +206,8 @@ class Pungi(pypungi.PungiBase):
                 thisrepo.cost = repo.cost
             if repo.ignoregroups:
                 thisrepo.enablegroups = 0
+            if repo.proxy:
+                thisrepo.proxy = repo.proxy
             self.ayum.repos.add(thisrepo)
             self.ayum.repos.enableRepo(thisrepo.id)
             self.ayum._getRepos(thisrepo=thisrepo.id, doSetup = True)
-- 
1.6.6.1

This patch should be in the next release of pungi, but check to make sure just to be safe.

Now you have a mock chroot environment setup that will use the proxy cache for packages.

Building boot images

Use the compose and pungi.ks files below, place them into /root/ in the mock to be built. Replace REPO_URL_HERE with the same repo you selected for the mock's yum.conf file.

  • pungi.ks
# un-comment the applicable repo

repo --name=fedora --baseurl=REPO_URL_HERE --proxy=http://proxy.home:3128

# Very small install footprint
%packages
@base
kernel
syslinux
nomtools
anaconda
%end
  • compose
#!/bin/bash
echo "*** Running pungi --force --nosource --nodebuginfo --nosplitmedia -G -C -B -c /root/pungi.ks --ver=13"

pungi --cachedir=/pungi/cache --force --nosource --nodebuginfo --nosplitmedia -G -C -B -c /root/pungi.ks --ver=13
echo "*** Done."
  • chmod a+x compose
  • exit
  • mock -r fedora-13-i386 --chroot "/root/compose"

Change the --ver to match whichever release you are building for

Building updates

Anaconda includes the ability to update itself by passing updates=http://path/to/update.img to the kernel at boot time. This allows you to use the same boot media and test changes to stage2 of the installer.

  • This assumes a working mock chroot (ie. I built boot images with this one first)
  • You need a git repo of Anaconda, I branch for the build so I don't clutter up master with build by-products.
  • bind the anaconda directory to the mock being used by editing /etc/mock/site-defaults.cfg as described above.
    • NOTE: DO NOT use mount -o bind to mount directories inside the mock. They will be obliterated the next time --init is run.
  • enter the chroot
    • mock -v -r fedora-13-i386 --shell
    • Install the development tools group
      • yum groupinstall "development tools"
    • grab a copy of the current anaconda*src.rpm from someplace and install the dependencies with:
      • yum-builddep anaconda*src.rpm
    • now build anaconda
      • ./autogen.sh
      • ./configure
      • make updates
    • exit
  • copy the updates.img over to the updates directory and optionally rename it
    • cp /var/lib/mock/fedora-13-i386/root/root/anaconda/updates.img /home/tftpboot/images/updates/

You can skip installing development tools and anaconda deps for subsequent iterations.

Now add updates=http://proxy.home/updates/updates.img to the kernel parameters when booting the install media.

Build with a test anaconda.rpm

NOTE: This doesn't actually seem to work when the released anaconda version matches that in the branch. buildinstall isn't letting the local repo override the one in the repo

Normally when a punji build is done it pulls anaconda from the repo/proxy cache. Instead you want it to use your new build (ie. when doing stage1 development which cannot be updated by updates= being passed to the kernel)

  • mount -o bind /home/bcl/Red_Hat/projs/anaconda/ /var/lib/mock/fedora-13-i386/root/root/anaconda/
  • mock -v -r fedora-13-i386-proxy --shell
  • cd /root/anaconda
  • Removed the cached files. Otherwise it pull pull from there and not update to the latest
    • rm -rf /13
    • rm -rf /extra/released/pungi/cache/local
  • ./autogen.sh
  • ./configure
  • make scratch
  • rpmbuild -ts --nodeps anaconda...tar.gz
  • yum-builddep /builddir/build/SRPMS/anaconda...src.rpm
  • rpmbuild --rebuild /builddir/build/SRPMS/anaconda...src.rpm
  • mkdir /repo
  • cp /builddir/build/RPMS/anaconda...rpm /repo
  • createrepo /repo
  • edit /root/pungi.ks and add
    • repo --name=local --baseurl=file:///repo/
  • exit
  • mock -v -r fedora-13-i386 --chroot "/root/compose"
  • rsync -avc /var/lib/mock/fedora-13-i386/root/13/i386/os/images/ /home/tftpboot/images/fedora/13/i386/

Boot with the pxe image and see what happens.

NOTE: The removal of the local repo cache is needed because yum gets confused by its presence.

Update boot.iso with new anaconda rpm

After you have a working boot.iso you can easily update it with the files from the new anaconda rpm you built above. Use the [| upd_bootiso] script to do this:

upd_bootiso boot.iso anaconda-13.35-1.fc13.i686.rpm

This will extract the files from initrd.img and install.img on the boot.iso, update the files and then re-build the boot.iso

This is considerably faster than using mock + pungi to compose a whole new iso from scratch.

Note, this script currently only works with x86 due to the fact that I borrowed part of it from the mk-images.x86 script and haven't built on other architectures yet.