nfs/livecd install hack

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi All:

	I've been playing around with both anaconda and the live-cd, and I had
an idea to kind of merge the two. I took advantage up the RHupdates
override on a nfs install, to have anaconda use a squashfs.img that is
on the nfs server in /LiveOS/,(this could use a bit of work...) creating
the same device name as the the live-cd install is looking for. Once
that is done, anaconda uses a patched livecd.py to install to the
harddrive. This is more of a proof of concept them prime code..   ;)
First I altered fedora.py in installclass, flags.py, bootloader.py,
livecd.py, and added a new one called livefs.py, adding them in
/RHupdates/ to incorporate my changes with out really having to play
with the loader.

dmc:

	I like where you are going with the reboot-less install, looking
forward to your progress.


Jerry



--- /home/cvsroot/anaconda/installclasses/fedora.py	2007-02-06 10:14:43.000000000 -0600
+++ installclasses/fedora.py	2007-06-19 17:44:46.000000000 -0500
@@ -45,22 +45,12 @@
 	anaconda.dispatch.skipStep("partition")
 
     def getMethod(self, methodstr):
+        if os.access("/mnt/source/RHupdates/livefs.py", os.R_OK):
+            import livefs
+            import livecd
+            return livecd.LiveCDImageMethod
+
         if methodstr.startswith("livecd://"):
             import livecd
             return livecd.LiveCDImageMethod
+	    
         return BaseInstallClass.getMethod(self, methodstr)
 
     def getBackend(self, methodstr):
+        if os.access("/mnt/source/RHupdates/livefs.py", os.R_OK):
+            import livecd
+            return livecd.LiveCDCopyBackend
+
         if methodstr.startswith("livecd://"):
             import livecd
             return livecd.LiveCDCopyBackend

--- /home/cvsroot/anaconda/flags.py	2006-10-18 16:33:24.000000000 -0500
+++ flags.py	2007-06-17 20:11:23.000000000 -0500
@@ -66,6 +66,7 @@
         self.__dict__['flags']['cmdline'] = self.createCmdlineDict()
         self.__dict__['flags']['useIPv4'] = True
         self.__dict__['flags']['useIPv6'] = True
+        self.__dict__['flags']['livefs'] = 0
         # for non-physical consoles like some ppc and sgi altix,
         # we need to preserve the console device and not try to
         # do things like bogl on them.  this preserves what that

--- /home/cvsroot/anaconda/bootloader.py	2007-01-16 13:58:13.000000000 -0600
+++ bootloader.py	2007-07-02 15:43:20.000000000 -0500
@@ -37,7 +37,7 @@
         return
 
     # FIXME: this is a hack...
-    if flags.livecd:
+    if flags.livecd or flags.livefs:
         return 
 
     if anaconda.id.ksdata:

--- /home/cvsroot/anaconda/livecd.py	2007-07-02 14:05:21.000000000 -0500
+++ livecd.py	2007-07-11 20:49:18.000000000 -0500
@@ -86,9 +75,12 @@
 class LiveCDImageMethod(installmethod.InstallMethod):
     def __init__(self, method, rootpath, intf):
         """@param method livecd://live-block-device"""
-        installmethod.InstallMethod.__init__(self, method, rootpath, intf)
 
+        installmethod.InstallMethod.__init__(self, method, rootpath, intf)
         self.osimg = method[8:]
+        if flags.livefs:
+            log.info("livefs mode - changing os.img")
+            self.osimg = "/dev/live-osimg"
         if not stat.S_ISBLK(os.stat(self.osimg)[stat.ST_MODE]):
             intf.messageWindow(_("Unable to find image"),
                                _("The given location isn't a valid %s "
@@ -316,9 +295,72 @@
         f.close()        
 
         # rebuild the initrd(s)
-        vers = self.kernelVersionList()
-        for (n, arch, tag) in vers:
-            packages.recreateInitrd(n, anaconda.rootPath)
+        if flags.livefs:
+            log.info("livefs mode - need bootloader")
+            log.info("livefs mode - need to find kernel")
+            # guaranteed to only have one kernel installed at this point
+
+            kver = subprocess.Popen(["/usr/bin/ls", "%s/lib/modules/"%anaconda.rootPath], stdout=subprocess.PIPE).communicate()[0].strip()
+            print "Kernel version is %s"%kver
+            log.info("Kernel version is %s" %(kver))
+
+            # create new initramfs
+            os.system("/usr/sbin/chroot %s /sbin/mkinitrd -v -f /boot/initrd-%s.img %s"%(anaconda.rootPath, kver, kver))
+            log.info("livefs mode - rebuild initrd")
+        # Figure out grub device name
+ ##HACK
+            diskDeviceFile="/dev/sda"
+#            grubDevNumber=int(rootDeviceFile[diskDeviceFile.__len__():]) - 1
+#            grubDev="(hd0,%s)"%grubDevNumber
+            grubDev="(hd0,0)"
+            osName="Fedora"
+
+            log.info("livefs mode - need to write grub.conf")
+        # create grub.conf (see above how grubDev is computed)
+            grub = open(anaconda.rootPath + "/boot/grub/grub.conf", "w")
+            grub.write("default=0\n")
+            grub.write("timeout=5\n")
+            grub.write("splashimage=%s/grub/splash.xpm.gz\n"%grubDev)
+            grub.write("hiddenmenu\n")
+            grub.write("title %s (%s)\n"%(osName, kver))
+            grub.write("    root %s\n"%grubDev)
+            #grub.write("    kernel /boot/vmlinuz-%s ro quiet root=UUID=%s\n"%(kver, uuid))
+            grub.write("    kernel /vmlinuz-%s ro root=LABEL=%s\n"%(kver, "/"))
+            grub.write("    initrd /initrd-%s.img\n"%kver)
+            grub.close()
+
+            os.system("rm -f %s/etc/grub.conf"%anaconda.rootPath)
+            os.system("ln -s ../boot/grub/grub.conf %s/etc/grub.conf"%anaconda.rootPath)
+            os.system("cat %s/etc/grub.conf"%anaconda.rootPath)
+
+
+            # copy necessary grub files
+            log.info("livefs mode - need to write MBR")
+            os.system("cp %s/usr/share/grub/i386-redhat/*stage* %s/boot/grub/"%(anaconda.rootPath, anaconda.rootPath))
+            # install grub
+#            if useMBR:
+#                grubMbrParam = "(hd0)"
+#            else:
+#                grubMbrParam = grubDev
+### FIXME hardcode
+#            f = os.popen("/usr/sbin/chroot %s /sbin/grub  --verbose --batch --device-map=/dev/null", "w"%(anaconda.rootPath))
+            f = os.popen("/usr/sbin/chroot /mnt/sysimage /sbin/grub  --verbose --batch --device-map=/dev/null", "w")
+            f.write("device (hd0) %s\n"%diskDeviceFile)
+            f.write("root %s\n"%grubDev)
+#            f.write("setup --stage2=/boot/grub/stage2 --prefix=/boot/grub (hd0)\n")
+#            f.write("setup --stage2=/grub/stage2 --prefix=/grub (hd0)\n")
+            f.write("setup (hd0)\n")
+            f.write("quit\n")
+            f.flush()
+            f.close()
+            log.info("livefs mode - DONE")
+
+        else:
+
+        # rebuild the initrd(s)
+            vers = self.kernelVersionList()
+            for (n, arch, tag) in vers:
+                packages.recreateInitrd(n, anaconda.rootPath)
 
     def writeConfiguration(self):
         pass

livefs.py:

#Jerry's anaconda init

import os,sys
import isys
import string
import iutil

from flags import flags

# Lets get some loops

isys.makeDevInode("loop1", "/tmp/loop1")
isys.makeDevInode("loop2", "/tmp/loop2")
isys.makeDevInode("loop3", "/tmp/loop3")
isys.makeDevInode("loop4", "/tmp/loop4")

# set livefs flag
flags.livefs = "1"

# Look for squash
#imgpath = None
#imglist = [ "/mnt/source/LiveOS/squashfs.img", "/mnt/source/squashfs.img" ]
#for p in imglist:
#     if (os.access(p, os.X_OK)):
#          imgpath =  p
#if os.access("/mnt/source/LiveOS/squashfs.img", os.R_OK)  
#     imgpath = "/mnt/source/LiveOS/squashfs.img" 
#if os.access("/mnt/source/squashfs.img", os.R_OK):
#     imgpath = "/mnt/source/squashfs.img" 

# found squash HACK hard code.... Got to work on those skills.....
 
#          isys.losetup("/tmp/loop3", "%s", readOnly = 1 %imgpath)
          isys.losetup("/tmp/loop3", "/mnt/source/LiveOS/squashfs.img", readOnly = 1)
          os.mkdir("/squashfs")
          isys.mount("/tmp/loop3", "/squashfs", fstype = 'squashfs', readOnly = 1)
          isys.losetup("/tmp/loop4", "/squashfs/os.img", readOnly = 1)
          os.system("ln -s /tmp/loop4 /dev/live-osimg")
          break

# Look for ext3
#imgpath = None
#imglist = [ "/mnt/source/LiveOS/ext3fs.img", "/mnt/source/ext3fs.img" ]
#for p in imglist:
#     if (os.access(p, os.X_OK)):
#          imgpath =  p
#          break
#if os.access("/mnt/source/LiveOS/ext3fs.img", os.R_OK)  
#     imgpath = "/mnt/source/LiveOS/ext3fs.img" 
#if os.access("/mnt/source/ext3fs.img", os.R_OK):
#     imgpath = "/mnt/source/ext3fs.img" 

# found ext3 for sysroot
#     isys.losetup("/tmp/loop4", imgpath , readOnly = 1) 
#     isys.losetup("/tmp/loop4", "/mnt/source/ext3fs.img", readOnly = 1) 
#     os.system("ln -s /tmp/loop4 /dev/live-osimg")


[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux