Allow pinning kernel versions to work around hardware / driver issues
authorMatt Amos <zerebubuth@gmail.com>
Thu, 27 Aug 2015 18:29:59 +0000 (19:29 +0100)
committerTom Hughes <tom@compton.nu>
Thu, 27 Aug 2015 18:29:59 +0000 (19:29 +0100)
Sometimes hardware issues or driver issues are fixed or broken in
specific kernel versions, so it's handy to be able to pin the
version to a known-working one while the problem is sorted out or
a proper fix is found.

This does this by ensuring that the particular kernel version package
is installed and that the grub configuration boots that as the default.

For context, see https://github.com/openstreetmap/operations/issues/45

cookbooks/hardware/attributes/default.rb
cookbooks/hardware/recipes/default.rb
cookbooks/hardware/templates/default/grub.erb
roles/pummelzacken.rb

index f80e6a528d6bf2476d45dea3331733da95a1a8dc..26f126abd6124d88cb1a2637ba6842d964eb06f1 100644 (file)
@@ -1,5 +1,6 @@
 default[:hardware][:modules] = %w(loop lp rtc)
 default[:hardware][:grub][:cmdline] = %w(nomodeset)
+default[:hardware][:grub][:kernel] = :latest
 default[:hardware][:sensors] = {}
 
 if node[:dmi] && node[:dmi][:system]
index 3c2f84a681472fdcf64b34ff85ffd959482e989a..620c7d58bb686507dd3321732037f5f2c311871c 100644 (file)
@@ -120,6 +120,16 @@ unless unit.nil?
   end
 end
 
+# if we need a different / special kernel version to make the hardware
+# work (e.g: https://github.com/openstreetmap/operations/issues/45) then
+# ensure that we have the package installed. the grub template will
+# make sure that this is the default on boot.
+unless node[:hardware][:grub][:kernel] == :latest
+  package "linux-image-#{node[:hardware][:grub][:kernel]}-generic"
+  package "linux-image-extra-#{node[:hardware][:grub][:kernel]}-generic"
+  package "linux-headers-#{node[:hardware][:grub][:kernel]}-generic"
+end
+
 if File.exist?("/etc/default/grub")
   execute "update-grub" do
     action :nothing
index 1c19cf684a2f1814e9965d1179ef3eb01ed7934f..d69a870b9cf862874bc3d69abe4b2bb92b670f8d 100644 (file)
@@ -1,7 +1,23 @@
 # DO NOT EDIT - This file is being maintained by Chef
 
-# Boot the first entry by default
+# Boot the first entry by default, unless we have configured
+# it to boot a specific version.
+<% if node[:hardware][:grub][:kernel] == :latest %>
 GRUB_DEFAULT="0"
+<% else
+  df = Mixlib::ShellOut.new("df /boot/grub/grub.cfg | tail -n 1 | awk '{print $1;}'")
+  df.run_command
+  df.error!
+  root=df.stdout
+
+  blkid = Mixlib::ShellOut.new("blkid -o value -s UUID #{root}")
+  blkid.run_command
+  blkid.error!
+  uuid=blkid.stdout
+
+  version="#{node[:hardware][:grub][:kernel]}-generic" %>
+GRUB_DEFAULT="gnulinux-advanced-<%= uuid %>>gnulinux-<%= version %>-advanced-<%= uuid %>"
+<% end %>
 
 # Wait two seconds before booting the default entry
 GRUB_TIMEOUT="2"
index 5d4647130748794fbae198049ccf6d11b460d664..d7ae5cd6bbba3c6d9a63b775394aca2e4a5674f7 100644 (file)
@@ -52,6 +52,14 @@ default_attributes(
     :redirects => {
       :reverse => "poldi.openstreetmap.org"
     }
+  },
+  :hardware => {
+    :grub => {
+      # lock kernel to 3.16.0-46 due to some issue with igb driver
+      # see https://github.com/openstreetmap/operations/issues/45
+      # for more information.
+      :kernel => "3.16.0-46"
+    }
   }
 )