[kexec-tools/f18] firstboot: add automatic and manual memory reservation for rhel
Dave Young
yangrr at fedoraproject.org
Tue Aug 28 08:29:07 UTC 2012
commit e02ec8b7e86df5356425de8dfd16da31484c6306
Author: Dave Young <dyoung at redhat.com>
Date: Tue Aug 28 16:22:35 2012 +0800
firstboot: add automatic and manual memory reservation for rhel
Add two radiobuttons for user to select automatic/manual memory reserve
For fedora they will not be added.
When switching from manual configure to auto reserve, the memory size and
summary widgets will be dimmed.
Testing below cases on virtual machine, all cases need reboot and verify:
Fedora:
1. Enable/Disable kdump
2. change reserve size
3. change kdump.conf content
4. Auto -> Manual
5. Manual -> Auto
RHEL:
modify the /etc/redhat-release and install the rhel7 kernel rpm in fedora vm.
1. auto reservation
2. manual specify reserve mem size
3. enable/disable kdump
4. change kdump.conf content
Vivek: label with text "Memory To Be Reserved"
Signed-off-by: Dave Young <dyoung at redhat.com>
Reviewed-by: Vivek Goyal <vgoyal at redhat.com>
firstboot_kdump.py | 148 ++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 115 insertions(+), 33 deletions(-)
---
diff --git a/firstboot_kdump.py b/firstboot_kdump.py
index bb4af10..85ed868 100755
--- a/firstboot_kdump.py
+++ b/firstboot_kdump.py
@@ -71,13 +71,28 @@ class moduleClass(Module):
return self.reboot
# toggle sensitivity of kdump config bits
- def showHide(self, status):
- self.totalMem.set_sensitive(status)
+ def showHideReserve(self, status):
+ self.labelKdump.set_sensitive(status)
self.kdumpMemspin.set_sensitive(status)
+ self.totalMem.set_sensitive(status)
self.systemUsableMem.set_sensitive(status)
self.labelTotal.set_sensitive(status)
- self.labelKdump.set_sensitive(status)
self.labelSys.set_sensitive(status)
+
+ # toggle sensitivity of kdump config bits
+ def showHide(self, status):
+ show_kdumpmem = status
+ if self.distro == 'rhel':
+ show_autoreserve = self.buttonAuto.get_active()
+ if status == True:
+ if self.buttonAuto.get_active() == True:
+ show_kdumpmem = False
+ self.buttonAuto.set_active(show_autoreserve)
+ self.buttonManual.set_active(not show_autoreserve)
+ self.labelReserve.set_sensitive(status)
+ self.buttonAuto.set_sensitive(status)
+ self.buttonManual.set_sensitive(status)
+ self.showHideReserve(show_kdumpmem)
self.labelReserved.set_sensitive(status)
self.labelReservedMemsize.set_sensitive(status)
self.kdumpEnabled = status
@@ -87,8 +102,17 @@ class moduleClass(Module):
showHideStatus = self.enableKdumpCheck.get_active()
self.showHide(showHideStatus)
+ def on_auto_toggled(self, *args):
+ if self.distro == 'rhel':
+ self.showHideReserve(not self.buttonAuto.get_active())
+
+ def on_manual_toggled(self, *args):
+ if self.distro == 'rhel':
+ self.showHideReserve(self.buttonManual.get_active())
+
def updateAvail(self, widget, spin):
- self.remainingMem = self.availMem - spin.get_value_as_int()
+ self.reserveMem = eval(string.strip(self.kdumpMemspin.get_text()))
+ self.remainingMem = self.availMem - self.reserveMem
self.systemUsableMem.set_text("%s" % self.remainingMem)
def getBootloader(self):
@@ -122,11 +146,12 @@ class moduleClass(Module):
# Fedora or RHEL?
releaseFile = '/etc/redhat-release'
- self.distro = 'rhel'
lines = open(releaseFile).readlines()
for line in lines:
if line.find("Fedora") != -1:
self.distro = 'fedora'
+ else:
+ self.distro = 'rhel'
# Ascertain how much memory is in the system
memInfo = open("/proc/meminfo").readlines()
@@ -146,26 +171,32 @@ class moduleClass(Module):
self.kdumpEnabled = True
self.kdumpMemInitial = 0
+ crashString = ""
kexec_crash_size = open("/sys/kernel/kexec_crash_size").read()
self.reservedMem = int(kexec_crash_size)/(1024*1024)
- self.kdumpMem = 0
if cmdLine.find("crashkernel") != -1:
crashString = filter(lambda t: t.startswith("crashkernel="),
cmdLine.split())[0].split("=")[1]
+ self.origCrashKernel = "crashkernel=%s" % (crashString)
if self.doDebug:
print "crashString is %s" % crashString
if crashString.find("@") != -1:
- (self.kdumpMem, self.kdumpOffset) = [int(m[:-1]) for m in crashString.split("@")]
+ (self.kdumpMemInitial, self.kdumpOffset) = [int(m[:-1]) for m in crashString.split("@")]
else:
- self.kdumpMem=int(crashString[:-1])
+ #kdumpMemInitial = -1 means auto reservation
+ if self.distro == 'rhel' and self.origCrashKernel == 'crashkernel=auto':
+ self.kdumpMemInitial=-1
+ else:
+ self.kdumpMemInitial=int(crashString[:-1])
self.kdumpOffset = 0
+ if self.kdumpMemInitial != 0:
self.availMem += self.reservedMem
- self.origCrashKernel = "%dM" % (self.kdumpMem)
- self.kdumpMemInitial = self.kdumpMem
self.kdumpEnabled = True
else:
self.kdumpEnabled = False
+ if self.origCrashKernel.find("crashkernel=") != -1:
+ self.kdumpEnabled = True
self.initialState = self.kdumpEnabled
@@ -193,11 +224,11 @@ class moduleClass(Module):
self.enoughMem = False
# Set spinner to lowerBound unless already set on kernel command line
- if self.kdumpMem == 0:
- self.kdumpMem = lowerBound
+ if self.kdumpMemInitial == 0 or self.kdumpMemInitial == -1:
+ self.kdumpMemInitial = lowerBound
else:
# round down to a multiple of step value
- self.kdumpMem = self.kdumpMem - (self.kdumpMem % step)
+ self.kdumpMemInitial = self.kdumpMemInitial - (self.kdumpMemInitial % step)
# kdump enable/disable checkbox
self.enableKdumpCheck = gtk.CheckButton(_("_Enable kdump?"))
@@ -210,12 +241,12 @@ class moduleClass(Module):
self.labelTotal.set_width_chars(32)
# how much ram to reserve for kdump
- self.memAdjustment = gtk.Adjustment(self.kdumpMem, lowerBound, upperBound, step, step, 0)
+ self.memAdjustment = gtk.Adjustment(self.kdumpMemInitial, lowerBound, upperBound, step, step, 0)
self.kdumpMemspin = gtk.SpinButton(self.memAdjustment, 0, 0)
self.kdumpMemspin.set_update_policy(gtk.UPDATE_IF_VALID)
self.kdumpMemspin.set_numeric(True)
self.memAdjustment.connect("value_changed", self.updateAvail, self.kdumpMemspin)
- self.labelKdump = gtk.Label(_("_Kdump Memory (MB):"))
+ self.labelKdump = gtk.Label(_("Memory To Be _Reserved (MB):"))
self.labelKdump.set_use_underline(True)
self.labelKdump.set_mnemonic_widget(self.kdumpMemspin)
self.labelKdump.set_alignment(0.0, 0.5)
@@ -231,6 +262,25 @@ class moduleClass(Module):
self.labelReservedMemsize=gtk.Label(_("%s" % self.reservedMem))
self.labelReserved.set_alignment(0.0, 0.5)
+ # rhel crashkernel=auto handling
+ if self.distro == 'rhel':
+ self.labelReserve = gtk.Label(_("Kdump Memory Reservation:"))
+ self.buttonAuto = gtk.RadioButton(None, _("_Automatic"))
+ self.buttonManual = gtk.RadioButton(self.buttonAuto, _("_Manual"))
+ self.buttonAuto.connect("toggled", self.on_auto_toggled, None)
+ self.buttonManual.connect("toggled", self.on_manual_toggled, None)
+ self.buttonAuto.set_use_underline(True)
+ self.buttonManual.set_use_underline(True)
+ self.labelReserve.set_alignment(0.0, 0.5)
+ if self.origCrashKernel == 'crashkernel=auto':
+ self.buttonAuto.set_active(True)
+ self.buttonManual.set_active(False)
+ else:
+ self.buttonAuto.set_active(False)
+ self.buttonManual.set_active(True)
+ self.autoinitial = self.buttonAuto.get_active()
+
+
# Add an advanced kdump config text widget
inputbuf = open("/etc/kdump.conf", "r")
self.AdvConfig = gtk.TextView()
@@ -268,30 +318,46 @@ class moduleClass(Module):
label.set_size_request(500, -1)
internalVBox.pack_start(label, False, True)
- table = gtk.Table(2, 100)
-
- table.attach(self.enableKdumpCheck, 0, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5)
-
- table.attach(self.labelTotal, 0, 1, 1, 2, gtk.FILL)
- table.attach(self.totalMem, 1, 2, 1, 2, gtk.SHRINK, gtk.FILL, 5, 5)
+ if self.distro == 'rhel':
+ table = gtk.Table(3, 100)
+ table.attach(self.enableKdumpCheck, 0, 3, 0, 1, gtk.FILL, gtk.FILL, 5, 5)
+ table.attach(self.labelReserve, 0, 1, 1, 2, gtk.FILL)
+ table.attach(self.buttonAuto, 1, 2, 1, 2, gtk.FILL, gtk.FILL, 5, 5)
+ table.attach(self.buttonManual, 2, 3, 1, 2, gtk.FILL, gtk.FILL, 5, 5)
+ table.attach(self.labelReserved, 0, 1, 2, 3, gtk.FILL)
+ table.attach(self.labelReservedMemsize, 2, 3, 2, 3, gtk.SHRINK, gtk.FILL, 5, 5)
+ table.attach(self.labelKdump, 0, 1, 3, 4, gtk.FILL)
+ table.attach(self.kdumpMemspin, 2, 3, 3, 4, gtk.SHRINK, gtk.FILL, 5, 5)
+ table.attach(self.labelTotal, 0, 1, 4, 5, gtk.FILL)
+ table.attach(self.totalMem, 2, 3, 4, 5, gtk.SHRINK, gtk.FILL, 5, 5)
+ table.attach(self.labelSys, 0, 1, 5, 6, gtk.FILL)
+ table.attach(self.systemUsableMem, 2, 3, 5, 6, gtk.SHRINK, gtk.FILL, 5, 5)
+ table.attach(self.AdvConfLabel, 0, 1, 6, 7, gtk.FILL)
+ table.attach(self.AdvWindow, 0, 3, 7, 100, gtk.FILL, gtk.FILL, 5, 5)
+ else:
+ table = gtk.Table(2, 100)
+ table.attach(self.enableKdumpCheck, 0, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5)
+ table.attach(self.labelTotal, 0, 1, 1, 2, gtk.FILL)
+ table.attach(self.totalMem, 1, 2, 1, 2, gtk.SHRINK, gtk.FILL, 5, 5)
- table.attach(self.labelKdump, 0, 1, 2, 3, gtk.FILL)
- table.attach(self.kdumpMemspin, 1, 2, 2, 3, gtk.SHRINK, gtk.FILL, 5, 5)
+ table.attach(self.labelKdump, 0, 1, 2, 3, gtk.FILL)
+ table.attach(self.kdumpMemspin, 1, 2, 2, 3, gtk.SHRINK, gtk.FILL, 5, 5)
- table.attach(self.labelReserved, 0, 1, 3, 4, gtk.FILL)
- table.attach(self.labelReservedMemsize, 1, 2, 3, 4, gtk.SHRINK, gtk.FILL, 5, 5)
+ table.attach(self.labelReserved, 0, 1, 3, 4, gtk.FILL)
+ table.attach(self.labelReservedMemsize, 1, 2, 3, 4, gtk.SHRINK, gtk.FILL, 5, 5)
- table.attach(self.labelSys, 0, 1, 4, 5, gtk.FILL)
- table.attach(self.systemUsableMem, 1, 2, 4, 5, gtk.SHRINK, gtk.FILL, 5, 5)
+ table.attach(self.labelSys, 0, 1, 4, 5, gtk.FILL)
+ table.attach(self.systemUsableMem, 1, 2, 4, 5, gtk.SHRINK, gtk.FILL, 5, 5)
- table.attach(self.AdvConfLabel, 0, 1, 6, 7, gtk.FILL)
- table.attach(self.AdvWindow, 0, 2, 7, 100, gtk.FILL, gtk.FILL, 5, 5)
+ table.attach(self.AdvConfLabel, 0, 1, 6, 7, gtk.FILL)
+ table.attach(self.AdvWindow, 0, 2, 7, 100, gtk.FILL, gtk.FILL, 5, 5)
# disable until user clicks check box, if not already enabled
if self.initialState is False:
self.showHide(False)
else:
self.enableKdumpCheck.set_active(True)
+ self.showHide(True)
internalVBox.pack_start(table, True, 15)
@@ -303,6 +369,17 @@ class moduleClass(Module):
def grabFocus(self):
self.enableKdumpCheck.grab_focus()
+ def configChanged(self):
+ if self.initialState == self.kdumpEnabled and self.initialState == False:
+ return False
+ if self.initialState != self.kdumpEnabled \
+ or (self.distro == 'rhel' and self.autoinitial != self.buttonAuto.get_active()) \
+ or (self.distro == 'rhel' and self.buttonManual.get_active() == True and self.reserveMem != self.kdumpMemInitial) \
+ or (self.distro != 'rhel' and self.reserveMem != self.kdumpMemInitial):
+ return True
+ return False
+
+
def apply(self, *args):
if self.kdumpEnabled:
self.reserveMem = self.kdumpMemspin.get_value_as_int()
@@ -348,7 +425,7 @@ class moduleClass(Module):
return RESULT_FAILURE
# Don't alert if nothing has changed
- if self.initialState != self.kdumpEnabled or self.reserveMem != self.kdumpMemInitial:
+ if self.configChanged() == True:
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
gtk.BUTTONS_YES_NO,
_("Changing Kdump settings requires rebooting the "
@@ -375,11 +452,16 @@ class moduleClass(Module):
# Are we adding or removing the crashkernel param?
if self.kdumpEnabled:
- grubbyCmd = "/sbin/grubby --%s --update-kernel=ALL --args=crashkernel=%iM" \
- % (self.bootloader, self.reserveMem)
+ _reserves = "%iM" % (self.reserveMem)
+ if self.distro == 'rhel':
+ if self.buttonAuto.get_active() == True:
+ _reserves = 'auto'
+
+ grubbyCmd = "/sbin/grubby --%s --update-kernel=ALL --args=crashkernel=%s" \
+ % (self.bootloader, _reserves)
chkconfigStatus = "enable"
else:
- grubbyCmd = "/sbin/grubby --%s --update-kernel=ALL --remove-args=crashkernel=%s" \
+ grubbyCmd = "/sbin/grubby --%s --update-kernel=ALL --remove-args=%s" \
% (self.bootloader, self.origCrashKernel)
chkconfigStatus = "disable"
More information about the scm-commits
mailing list