Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I try to update my Ubuntu 12.04 and I have this error, then it update kernel. Any clue what I can do to fix this?

sudo apt-get -f install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
4 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up linux-image-3.2.0-25-generic (3.2.0-25.40) ...
Running depmod.
update-initramfs: deferring update (hook will be called later)
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 3.2.0-25-generic /boot/vmlinuz-3.2.0-25-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.2.0-25-generic /boot/vmlinuz-3.2.0-25-generic
update-initramfs: Generating /boot/initrd.img-3.2.0-25-generic
Warning: No support for locale: en_US.utf8
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.2.0-25-generic /boot/vmlinuz-3.2.0-25-generic
run-parts: executing /etc/kernel/postinst.d/update-notifier 3.2.0-25-generic /boot/vmlinuz-3.2.0-25-generic
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.2.0-25-generic /boot/vmlinuz-3.2.0-25-generic
Generating grub.cfg ...
/etc/grub.d/10_linux: 24: .: Can't open /usr/share/grub/grub-mkconfig_lib
run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 2
Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-3.2.0-25-generic.postinst line 1010.
dpkg: error processing linux-image-3.2.0-25-generic (--configure):
 subprocess installed post-installation script returned error exit status 2
dpkg: dependency problems prevent configuration of linux-image-generic:
 linux-image-generic depends on linux-image-3.2.0-25-generic; however:
  Package linux-image-3.2.0-25-generic is not configured yet.
dpkg: error processing linux-image-generic (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of linux-generic:
 linux-generic depends on linux-image-generic (= 3.2.0.25.27); however:
  Package linux-image-generic is not configured yet.
dpkg: error processing linux-generic (--configure):
 dependency problems - leaving unconfigured
Setting up plymouth-theme-kubuntu-logo (1:12.04ubuntu4) ...
No apport report written because the error message indicates its a followup error from a previous failure.
                                                                                                          No apport report written because the error message indicates its a followup error from a previous failure.
                                                                                               update-initramfs: deferring update (trigger activated)
Generating grub.cfg ...
/etc/grub.d/10_linux: 24: .: Can't open /usr/share/grub/grub-mkconfig_lib
dpkg: error processing plymouth-theme-kubuntu-logo (--configure):
 subprocess installed post-installation script returned error exit status 2
No apport report written because MaxReports is reached already
                                                              Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-3.2.0-25-generic
Warning: No support for locale: en_US.utf8
Errors were encountered while processing:
 linux-image-3.2.0-25-generic
 linux-image-generic
 linux-generic
 plymouth-theme-kubuntu-logo
E: Sub-process /usr/bin/dpkg returned an error code (1)
share|improve this question
    
Does the file /usr/share/grub/grub-mkconfig_lib exist? Is it readable? –  Samik Jun 25 '12 at 13:01
    
No, file didn't exists –  ShockwaveNN Jun 25 '12 at 13:34
1  
So that's the problem, if you believe that you've not accidentally delete that file then please make a bug report. –  Samik Jun 25 '12 at 14:16
    
Is there any way to fix this error? I can't make a bug report, because I have no idea when this error started, bug report will be very misleading –  ShockwaveNN Jun 26 '12 at 6:25

1 Answer 1

up vote 1 down vote accepted

I've pasted the content of /usr/share/grub/grub-mkconfig_lib underneath (pastebin was deleted as apparent from comment below). You can download it and place it in appropriate place, then retry.

Also, look for the file /usr/lib/grub/grub-mkconfig_lib. Generally, it's a symbolic link to /usr/share/grub/grub-mkconfig_lib. But do check if the original file is there. If in your case /usr/lib/grub/grub-mkconfig_lib is the original file then open the file /etc/grub.d/10_linux and change its 21st line from datarootdir="${prefix}/share" to datarootdir="${prefix}/lib" then complete the upgrade.

# Helper library for grub-mkconfig
# Copyright (C) 2007,2008,2009,2010  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

transform="s,x,x,"

prefix="/usr"
exec_prefix="${prefix}"
datarootdir="${prefix}/share"
datadir="${datarootdir}"
bindir="${exec_prefix}/bin"
sbindir="${exec_prefix}/sbin"
pkgdatadir="${datadir}/grub"

if test "x$grub_probe" = x; then
  grub_probe="${sbindir}/`echo grub-probe | sed "${transform}"`"
fi
if test "x$grub_mkrelpath" = x; then
  grub_mkrelpath="${bindir}/`echo grub-mkrelpath | sed "${transform}"`"
fi

if which gettext >/dev/null 2>/dev/null; then
  :
else
  gettext () {
     printf "%s" "$@"
  }
fi

grub_warn ()
{
  echo "$(gettext "Warning:")" "$@" >&2
}

make_system_path_relative_to_its_root ()
{
  "${grub_mkrelpath}" "$1"
}

is_path_readable_by_grub ()
{
  path="$1"

  # abort if path doesn't exist
  if test -e "$path" ; then : ;else
    return 1
  fi

  # abort if file is in a filesystem we can't read
  if "${grub_probe}" -t fs "$path" > /dev/null 2>&1 ; then : ; else
    return 1
  fi

  # ... or if we can't figure out the abstraction module, for example if
  # memberlist fails on an LVM volume group.
  if abstractions="`"${grub_probe}" -t abstraction "$path"`" 2> /dev/null ; then 
      :
  else
    return 1
  fi

  if [ x$GRUB_CRYPTODISK_ENABLE = xy ]; then
      return 0
  fi

  for abstraction in $abstractions; do
      if [ "x$abstraction" = xcryptodisk ]; then
      return 1
      fi
  done

  return 0
}

convert_system_path_to_grub_path ()
{
  path="$1"

  grub_warn "convert_system_path_to_grub_path() is deprecated.  Use prepare_grub_to_access_device() instead."

  # abort if GRUB can't access the path
  if is_path_readable_by_grub "${path}" ; then : ; else
    return 1
  fi

  if drive="`"${grub_probe}" -t drive "$path"`" ; then : ; else
    return 1
  fi

  if relative_path="`make_system_path_relative_to_its_root "$path"`" ; then : ; else
    return 1
  fi

  echo "${drive}${relative_path}"
}

save_default_entry ()
{
  if [ "x${GRUB_SAVEDEFAULT}" = "xtrue" ] ; then
    cat << EOF
savedefault
EOF
  fi
}

prepare_grub_to_access_device ()
{
  device="$1"

  partmap="`"${grub_probe}" --device "${device}" --target=partmap`"
  for module in ${partmap} ; do
    case "${module}" in
      netbsd | openbsd)
        echo "insmod part_bsd";;
      *)
        echo "insmod part_${module}";;
    esac
  done

  loop_file=
  case ${device} in
    /dev/loop/*|/dev/loop[0-9])
      grub_loop_device="${device#/dev/}"
      loop_file=`losetup "${device}" | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
      case $loop_file in
        /dev/*) ;;
        *)
          loop_device="${device}"
          device=`"${grub_probe}" --target=device "${loop_file}"` || return 0
        ;;
      esac
    ;;
  esac

  if dmsetup status $device 2>/dev/null | grep -q 'crypt[[:space:]]$'; then
    grub_warn \
      "$device is a crypto device, which GRUB cannot read directly.  Some" \
      "necessary modules may be missing from /boot/grub/grub.cfg.  You may" \
      "need to list them in GRUB_PRELOAD_MODULES in /etc/default/grub.  See" \
      "http://bugs.debian.org/542165 for details."
    return 0
  fi

  # Abstraction modules aren't auto-loaded.
  abstraction="`"${grub_probe}" --device "${device}" --target=abstraction`"
  for module in ${abstraction} ; do
    echo "insmod ${module}"
  done

  fs="`"${grub_probe}" --device "${device}" --target=fs`"
  for module in ${fs} ; do
    echo "insmod ${module}"
  done

  if [ x$GRUB_CRYPTODISK_ENABLE = xy ]; then
      for uuid in "`"${grub_probe}" --device "${device}" --target=cryptodisk_uuid`"; do
      echo "cryptomount -u $uuid"
      done
  fi

  # If there's a filesystem UUID that GRUB is capable of identifying, use it;
  # otherwise set root as per value in device.map.
  fs_hint="`"${grub_probe}" --device "${device}" --target=compatibility_hint`"
  if [ "x$fs_hint" != x ]; then
    echo "set root='$fs_hint'"
  fi
  if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then
    hints="`"${grub_probe}" --device "${device}" --target=hints_string 2> /dev/null`" || hints=
    echo "if [ x\$feature_platform_search_hint = xy ]; then"
    echo "  search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
    echo "else"
    echo "  search --no-floppy --fs-uuid --set=root ${fs_uuid}"
    echo "fi"
  fi

  if [ "x${loop_file}" != x ]; then
    loop_mountpoint="$(awk '"'${loop_file}'" ~ "^"$2 && $2 != "/" { print $2 }' /proc/mounts | tail -n1)"
    if [ "x${loop_mountpoint}" != x ]; then
      echo "loopback ${grub_loop_device} ${loop_file#$loop_mountpoint}"
      echo "set root=(${grub_loop_device})"
    fi
  fi
}

grub_get_device_id ()
{
  device="$1"
  if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then
    echo "$fs_uuid";
  else
    echo "$device"
  fi
}

grub_file_is_not_garbage ()
{
  if test -f "$1" ; then
    case "$1" in
      *.dpkg-*) return 1 ;; # debian dpkg
      *.rpmsave|*.rpmnew) return 1 ;;
      README*|*/README*)  return 1 ;; # documentation
    esac
  else
    return 1
  fi
  return 0
}

version_sort ()
{
  case $version_sort_sort_has_v in
    yes)
      LC_ALL=C sort -V;;
    no)
      LC_ALL=C sort -n;;
    *)
      if sort -V </dev/null > /dev/null 2>&1; then
        version_sort_sort_has_v=yes
    LC_ALL=C sort -V
      else
        version_sort_sort_has_v=no
        LC_ALL=C sort -n
      fi;;
   esac
}

version_test_numeric ()
{
  version_test_numeric_a="$1"
  version_test_numeric_cmp="$2"
  version_test_numeric_b="$3"
  if [ "$version_test_numeric_a" = "$version_test_numeric_b" ] ; then
    case "$version_test_numeric_cmp" in
      ge|eq|le) return 0 ;;
      gt|lt) return 1 ;;
    esac
  fi
  if [ "$version_test_numeric_cmp" = "lt" ] ; then
    version_test_numeric_c="$version_test_numeric_a"
    version_test_numeric_a="$version_test_numeric_b"
    version_test_numeric_b="$version_test_numeric_c"
  fi
  if (echo "$version_test_numeric_a" ; echo "$version_test_numeric_b") | version_sort | head -n 1 | grep -qx "$version_test_numeric_b" ; then
    return 0
  else
    return 1
  fi
}

version_test_gt ()
{
  version_test_gt_sedexp="s/[^-]*-//;s/[._-]\(pre\|rc\|test\|git\|old\|trunk\)/~\1/g"
  version_test_gt_a="`echo "$1" | sed -e "$version_test_gt_sedexp"`"
  version_test_gt_b="`echo "$2" | sed -e "$version_test_gt_sedexp"`"
  version_test_gt_cmp=gt
  if [ "x$version_test_gt_b" = "x" ] ; then
    return 0
  fi
  case "$version_test_gt_a:$version_test_gt_b" in
    *.old:*.old) ;;
    *.old:*) version_test_gt_a="`echo -n "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;;
    *:*.old) version_test_gt_b="`echo -n "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;;
  esac
  dpkg --compare-versions "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b"
  return "$?"
}

version_find_latest ()
{
  version_find_latest_a=""
  for i in "$@" ; do
    if version_test_gt "$i" "$version_find_latest_a" ; then
      version_find_latest_a="$i"
    fi
  done
  echo "$version_find_latest_a"
}

# One layer of quotation is eaten by "" and the second by
# sed; so this turns ' into \'.  Note that you must use the output of
# this function in a printf format string.

grub_quote () {
  sed "s/'/'\\\\''/g"
}

gettext_quoted () {
  gettext "$@" | grub_quote
}

# Run the first argument through gettext, and then pass that and all
# remaining arguments to printf.  This is a useful abbreviation and tends to
# be easier to type.
gettext_printf () {
  gettext_printf_format="$1"
  shift
  printf "$(gettext "$gettext_printf_format")" "$@"
}

uses_abstraction () {
  device="$1"

  abstraction="`"${grub_probe}" --device "${device}" --target=abstraction`"
  for module in ${abstraction}; do
    if test "x${module}" = "x$2"; then
      return 0
    fi
  done
  return 1
}

print_option_help () {
  if test x$print_option_help_wc = x; then
      if wc -L  </dev/null > /dev/null 2>&1; then
      print_option_help_wc=-L
      elif wc -m  </dev/null > /dev/null 2>&1; then
      print_option_help_wc=-m
      else
      print_option_help_wc=-b
      fi
  fi
  if test x$grub_have_fmt = x; then
      if fmt -w 40  </dev/null > /dev/null 2>&1; then
      grub_have_fmt=y;
      else
      grub_have_fmt=n;
      fi
  fi
  print_option_help_lead="  $1"
  print_option_help_lspace="$(echo "$print_option_help_lead" | wc $print_option_help_wc)"
  print_option_help_fill="$((26 - print_option_help_lspace))"
  printf "%s" "$print_option_help_lead"
  if test $print_option_help_fill -le 0; then
      print_option_help_nl=y
      echo
  else
      print_option_help_i=0;
      while test $print_option_help_i -lt $print_option_help_fill; do
      printf " "
      print_option_help_i=$((print_option_help_i+1))
      done
      print_option_help_nl=n
  fi
  if test x$grub_have_fmt = xy; then
      print_option_help_split="$(echo "$2" | fmt -w 50)"
  else
      print_option_help_split="$2"
  fi
  if test x$print_option_help_nl = xy; then
      echo "$print_option_help_split" | awk \
      '{ print "                          " $0; }'
  else
      echo "$print_option_help_split" | awk 'BEGIN   { n = 0 }
  { if (n == 1) print "                          " $0; else print $0; n = 1 ; }'
  fi
}

grub_fmt () {
  if test x$grub_have_fmt = x; then
      if fmt -w 40 < /dev/null > /dev/null; then
      grub_have_fmt=y;
      else
      grub_have_fmt=n;
      fi
  fi

  if test x$grub_have_fmt = xy; then
      fmt
  else
      cat
  fi
}
share|improve this answer
1  
Thanks, your solution works. And I found already existed bug on launchpad bugs.launchpad.net/linuxmint/+bug/1006772 –  ShockwaveNN Jun 26 '12 at 12:45
    
The pastebin provided in this answer no longer exists. Therefore, this answer is currently incomplete. –  Thomas W. Jul 20 '13 at 3:56
    
@ThomasW. pasted the content here now. –  Samik Jul 20 '13 at 8:38

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.