詹总 發表於 2022-5-24 19:14:00

Ubuntu 20.04 升级最新内核、安装指定内核版本

<h1 id="articleContentId" class="title-article">Ubuntu 20.04 升级最新内核、安装指定内核版本</h1>
<p>https://cdmana.com/2021/12/202112290531351544.html</p>
<p>查看目前版本</p>
<pre><code class="prism language-bash">uname -rs</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/1008336/202205/1008336-20220524191212654-1065985221.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>#查看当前内核版本<br>uname -r<br>#查看软件库中可下载的内核<br>sudo apt list | grep linux-generic*</p>
<p><img src="https://img2022.cnblogs.com/blog/1008336/202205/1008336-20220524192708805-2070407134.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>#下载最新的内核(不用和我一样,但我的这个版本可以支持,具体版本以你的软件库中为准)<br>sudo apt-get install linux-generic-hwe-20.04-edge/focal-updates<br><br></p>
<p><img src="https://img2022.cnblogs.com/blog/1008336/202205/1008336-20220524192734400-1955754487.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2022.cnblogs.com/blog/1008336/202205/1008336-20220524192834716-1725896968.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;更新之后,打开电脑设置后可以发现显示出了第二个屏幕,并且可以手动选择功能。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>下载ubuntu-mainline-kernel脚本</p>
<pre><code class="prism language-bash"> <span class="token function">wget https://raw.githubusercontent.com/pimlie/ubuntu-mainline-kernel.sh/master/ubuntu-mainline-kernel.sh<br><br><span style="color: rgba(255, 0, 0, 1)">下载不了看后面脚本</span><br><img src="https://img2022.cnblogs.com/blog/1008336/202205/1008336-20220524191302127-1623315307.png" alt="" loading="lazy"></span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre><code class="prism language-bash"><span class="token function"><br><br></span></code></pre>
<p>将脚本放在可执行路径中</p>
<pre><code class="prism language-bash"><span class="token function">sudo <span class="token function">install ubuntu-mainline-kernel.sh /usr/local/bin/
</span></span></code></pre>
<p>检查最新的可用内核版本</p>
<pre><code class="prism language-bash">ubuntu-mainline-kernel.sh -c
</code></pre>
<p>获得最新版本并确认这就是您想要安装在系统上的版本之后,运行</p>
<pre><code class="prism language-bash"> <span class="token function">sudo ubuntu-mainline-kernel.sh -i<br><img src="https://img2022.cnblogs.com/blog/1008336/202205/1008336-20220524191144822-281943517.png" alt="" loading="lazy"></span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>重新启动系统并检查内核版本</p>
<pre><code class="prism language-bash"><span class="token function">uname -rs<br><br><br><span style="color: rgba(255, 0, 0, 1)">安装结束</span></span></code></pre>
<p>卸载最新的Linux Kernel</p>
<pre><code class="prism language-bash"> <span class="token function">sudo ubuntu-mainline-kernel.sh -u
</span></code></pre>
<p>首先重启系统,然后运行以下命令:</p>
<pre><code class="prism language-bash"><span class="token function">uname -rs
</span></code></pre>
<h1>参考安装脚本</h1>
<p>ubuntu-mainline-kernel.sh</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">#!/usr/bin/env bash

# shellcheck disable=SC1117

# Ubuntu Kernel PPA info
ppa_host="kernel.ubuntu.com"
ppa_index="/~kernel-ppa/mainline/"
ppa_key="17C622B0"

# If quiet=1 then no log messages are printed (except errors)
quiet=0

# If check_signature=0 then the signature of the CHECKSUMS file will not be checked
check_signature=1

# If check_checksum=0 then the checksums of the .deb files will not be checked
check_checksum=1

# If doublecheckversion=1 then also check the version specific ppa page to make
# sure the kernel build was successful
doublecheckversion=1

# Connect over http or https to ppa (only https works)
use_https=1

# Path to sudo command, empty by default
sudo=""
#sudo=$(command -v sudo) # Uncomment this line if you dont want to sudo yourself

# Path to wget command
wget=$(command -v wget)

#####
## Below are internal variables of which most can be toggled by command options
## DON'T CHANGE THESE MANUALLY
#####

# (internal) If cleanup_files=1 then before exiting all downloaded/temporaryfiles
# are removed
cleanup_files=1

# (internal) If do_install=0 downloaded deb files will not be installed
do_install=1

# (internal) If use_lowlatency=1 then the lowlatency kernel will be installed
use_lowlatency=0

# (internal) If use_lpae=1 then the lpae kernel will be installed
use_lpae=0

# (internal) If use_snapdragon=1 then the snapdragon kernel will be installed
use_snapdragon=0

# (internal) If use_rc=1 then release candidate kernel versions are also checked
use_rc=0

# (internal) If assume_yes=1 assume yes on all prompts
assume_yes=0

# (internal) How many files we expect to retrieve from the ppa
# checksum, signature, header-all, header-arch, image(-unsigned), modules
expected_files_count=6

# (internal) Which action/command the script should run
run_action="help"

# (internal) The workdir where eg the .deb files are downloaded
workdir="/tmp/$(basename "$0")/"

# (internal) The stdio where all detail output should be sent
debug_target="/dev/null"

# (internal) Holds all version numbers of locally installed ppa kernels
LOCAL_VERSIONS=()

# (internal) Holds all version numbers of available ppa kernels
REMOTE_VERSIONS=()

# (internal) The architecture of the local system
arch=$(dpkg --print-architecture)

# (internal) The text to search for to check if the build was successfully
# NOTE: New succeed text since v5.6.18
build_succeeded_text="(Build for ${arch} succeeded|Test ${arch}/build succeeded)"

# (internal) The pid of the child process which checks download progress
monitor_pid=0

# (internal) The size of the file which is being downloaded
download_size=0

action_data=()

#####
## Check if we are running on an Ubuntu-like OS
#####

# shellcheck disable=SC1091,SC2015
[ -f "/etc/os-release" ] &amp;&amp; {
    source /etc/os-release
    [[ "$ID" == "ubuntu" ]] || [[ "$ID_LIKE" =~ "ubuntu" ]]
} || {
    OS=$(lsb_release -si 2&gt;&amp;-)
    [[ "$OS" == "Ubuntu" ]] || [[ "$OS" == "LinuxMint" ]]|| [[ "$OS" == "neon" ]] || {
      echo "Abort, this script is only intended for Ubuntu-like distros"
      exit 2
    }
}

#####
## helper functions
#####

single_action () {
    [ "$run_action" != "help" ] &amp;&amp; {
      err "Abort, only one argument can be supplied. See -h"
      exit 2
    }
}

log () {
    [ $quiet -eq 0 ] &amp;&amp; echo "$@"
}

logn () {
    [ $quiet -eq 0 ] &amp;&amp; echo -n "$@"
}

warn () {
    [ $quiet -eq 0 ] &amp;&amp; echo "$@" &gt;&amp;2
}

err () {
    echo "$@" &gt;&amp;2
}

#####
## Simple command options parser
#####

while (( "$#" )); do
    argarg_required=0

    case $1 in
      -c|--check)
            single_action
            run_action="check"
            ;;
      -l|--local-list)
            single_action
            run_action="local-list"
            argarg_required=1
            ;;
      -r|--remote-list)
            single_action
            run_action="remote-list"
            argarg_required=1
            ;;
      -i|--install)
            single_action
            run_action="install"
            argarg_required=1
            ;;
      -u|--uninstall)
            single_action
            run_action="uninstall"
            argarg_required=1
            ;;
      -p|--path)
            if [ -z "$2" ] || [ "${2##-}" != "$2" ]; then
                err "Option $1 requires an argument."
                exit 2
            else
                workdir="$(realpath "$2")/"
                shift

                if [ ! -d "$workdir" ]; then
                  mkdir -p "$workdir";
                fi

                if [ ! -d "$workdir" ] || [ ! -w "$workdir" ]; then
                  err "$workdir is not writable"
                  exit 1
                fi

                cleanup_files=0
            fi
            ;;
      -ll|--lowlatency|--low-latency)
            [[ "$arch" != "amd64" ]] &amp;&amp; [[ "$arch" != "i386" ]] &amp;&amp; {
                err "Low-latency kernels are only available for amd64 or i386 architectures"
                exit 3
            }

            use_lowlatency=1
            ;;
      -lpae|--lpae)
            [[ "$arch" != "armhf" ]] &amp;&amp; {
                err "Large Physical Address Extension (LPAE) kernels are only available for the armhf architecture"
                exit 3
            }

            use_lpae=1
            ;;
      --snapdragon)
            [[ "$arch" != "arm64" ]] &amp;&amp; {
                err "Snapdragon kernels are only available for the arm64 architecture"
                exit 3
            }

            use_snapdragon=1
            ;;
      --rc)
            use_rc=1
            ;;
      -s|--signed)
            log "The option '--signed' is not yet implemented"
            ;;
      --yes)
            assume_yes=1
            ;;
      -q|--quiet)
            [ "$debug_target" == "/dev/null" ] &amp;&amp; { quiet=1; }
            ;;
      -do|--download-only)
            do_install=0
            cleanup_files=0
            ;;
      -ns|--no-signature)
            check_signature=0
            ;;
      -nc|--no-checksum)
            check_checksum=0
            ;;
      -d|--debug)
            debug_target="/dev/stderr"
            quiet=0
            ;;
      -h|--help)
            run_action="help"
            ;;
      *)
            run_action="help"
            err "Unknown argument $1"
            ;;
    esac

    if [ $argarg_required -eq 1 ]; then
      [ -n "$2" ] &amp;&amp; [ "${2##-}" == "$2" ] &amp;&amp; {
            action_data+=("$2")
            shift
      }
    elif [ $argarg_required -eq 2 ]; then
      # shellcheck disable=SC2015
      [ -n "$2" ] &amp;&amp; [ "${2##-}" == "$2" ] &amp;&amp; {
            action_data+=("$2")
            shift
      } || {
            err "Option $1 requires an argument"
            exit 2
      }
    fi

    shift
done

#####
## internal functions
#####

containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] || [[ "$e" =~ $1- ]] &amp;&amp; return 0; done
return 1
}

download () {
    host=$1
    uri=$2

    if [ $use_https -eq 1 ]; then
      $wget -q --save-headers --output-document - "https://$host$uri"
    else
      exec 3&lt;&gt;/dev/tcp/"$host"/80
      echo -e "GET $uri HTTP/1.0\r\nHost: $host\r\nConnection: close\r\n\r\n" &gt;&amp;3
      cat &lt;&amp;3
    fi
}

monitor_progress () {
    local msg=$1
    local file=$2

    download_size=-1
    printf "%s: " "$msg"
    (while :; do for c in / - \\ \|; do
      [[ -f "$file" ]] &amp;&amp; {
            # shellcheck disable=SC2015
            [[ $download_size -le 0 ]] &amp;&amp; {
                download_size=$(($(head -n20 "$file" | grep -aoi -E "Content-Length: +" | cut -d" " -f2) + 0))
                printf ' %d%% %s' 0 "$c"
                printf '\b%.0s' {1..5}
            } || {
                filesize=$(( $(du -b "$file" | cut -f1) + 0))
                progress="$((200*filesize/download_size % 2 + 100*filesize/download_size))"

                printf ' %s%% %s' "$progress" "$c"
                length=$((4 + ${#progress}))
                printf '\b%.0s' $(seq 1 $length)
            }
      }
      sleep 1
    done; done) &amp;
    monitor_pid=$!
}

end_monitor_progress () {
    { kill $monitor_pid &amp;&amp; wait $monitor_pid; printf '100%%   \n'; } 2&gt;/dev/null
}

remove_http_headers () {
    file="$1"
    nr=0
    while(true); do
      nr=$((nr + 1))
      line=$(head -n$nr "$file" | tail -n 1)

      if [ -z "$(echo "$line" | tr -cd '\r\n')" ]; then
            tail -n +$nr "$file" &gt; "${file}.tmp"
            mv "${file}.tmp" "${file}"
            break
      fi

      [ $nr -gt 100 ] &amp;&amp; {
            err "Abort, could not remove http headers from file"
            exit 3
      }
    done
}

load_local_versions() {
    local version
    if [ ${#LOCAL_VERSIONS[@]} -eq 0 ]; then
      IFS=$'\n'
      for pckg in $(dpkg -l linux-image-* | cut -d " " -f 3 | sort -V); do
            # only match kernels from ppa
            if [[ "$pckg" =~ linux-image-+\.+\.+-{6} ]]; then
                version="v"$(echo "$pckg" | cut -d"-" -f 3,4)

                LOCAL_VERSIONS+=("$version")
            fi
      done
      unset IFS
    fi
}

latest_local_version() {
    load_local_versions 1

    if [ ${#LOCAL_VERSIONS[@]} -gt 0 ]; then
      local sorted
      mapfile -t sorted &lt; &lt;(echo "${LOCAL_VERSIONS[*]}" | tr ' ' '\n' | sort -t"." -k1V,3)

      lv="${sorted[${#sorted[@]}-1]}"
      echo "${lv/-rc/-rc}"
    else
      echo "none"
    fi
}

remote_html_cache=""
parse_remote_versions() {
    local line
    while read -r line; do
      if [[ $line =~ DIR.*href=\"(v[[:digit:]]+\.[[:digit:]]+(\.[[:digit:]]+)?)(-(rc[[:digit:]]+))?/\" ]]; then
            line="${BASH_REMATCH}"
            if [[ -z "${BASH_REMATCH}" ]]; then
                line="$line.0"
            fi
            # temporarily substitute rc suffix join character for correct version sort
            if [[ -n "${BASH_REMATCH}" ]]; then
                line="$line~${BASH_REMATCH}"
            fi
            echo "$line"
      fi
    done &lt;&lt;&lt;"$remote_html_cache"
}

load_remote_versions () {
    local line

    [[ -n "$2" ]] &amp;&amp; {
      REMOTE_VERSIONS=()
    }

    if [ ${#REMOTE_VERSIONS[@]} -eq 0 ]; then
      if [ -z "$remote_html_cache" ]; then
          [ -z "$1" ] &amp;&amp; logn "Downloading index from $ppa_host"
          remote_html_cache=$(download $ppa_host $ppa_index)
          [ -z "$1" ] &amp;&amp; log
      fi

      IFS=$'\n'
      while read -r line; do
            # reinstate original rc suffix join character
            if [[ $line =~ ^([^~]+)~([^~]+)$ ]]; then
                [[ $use_rc -eq 0 ]] &amp;&amp; continue
                line="${BASH_REMATCH}-${BASH_REMATCH}"
            fi
            [[ -n "$2" ]] &amp;&amp; [[ ! "$line" =~ $2 ]] &amp;&amp; continue
            REMOTE_VERSIONS+=("$line")
      done &lt; &lt;(parse_remote_versions | sort -V)
      unset IFS
    fi
}

latest_remote_version () {
    load_remote_versions 1 "$1"
    echo "${REMOTE_VERSIONS[${#REMOTE_VERSIONS[@]}-1]}"
}

check_environment () {
    if [ $use_https -eq 1 ] &amp;&amp; [ -z "$wget" ]; then
      err "Abort, wget not found. Please apt install wget"
      exit 3
    fi
}

guard_run_as_root () {
if [ "$(id -u)" -ne 0 ]; then
    echo "The '$run_action' command requires root privileges"
    exit 2
fi
}

# execute requested action
case $run_action in
    help)
      echo "Usage: $0 -c|-l|-r|-u

Download &amp; install the latest kernel available from $ppa_host$ppa_uri

Arguments:
-c               Check if a newer kernel version is available
-i    Install kernel VERSION, see -l for list. You don't have to prefix
                   with v. E.g. -i 4.9 is the same as -i v4.9. If version is
                   omitted the latest available version will be installed
-l       List locally installed kernel versions. If an argument to this
                   option is supplied it will search for that
-r       List available kernel versions. If an argument to this option
                   is supplied it will search for that
-u    Uninstall the specified kernel version. If version is omitted,
                   a list of max 10 installed kernel versions is displayed
-h               Show this message

Optional:
-s, --signed         Only install signed kernel packages (not implemented)
-p, --path DIR       The working directory, .deb files will be downloaded into
                     this folder. If omitted, the folder /tmp/$(basename "$0")/
                     is used. Path is relative from \$PWD
-ll, --low-latency   Use the low-latency version of the kernel, only for amd64 &amp; i386
-lpae, --lpae      Use the Large Physical Address Extension kernel, only for armhf
--snapdragon         Use the Snapdragon kernel, only for arm64
-do, --download-only Only download the deb files, do not install them
-ns, --no-signatureDo not check the gpg signature of the checksums file
-nc, --no-checksum   Do not check the sha checksums of the .deb files
-d, --debug          Show debug information, all internal command's echo their output
--rc               Also include release candidates
--yes                Assume yes on all questions (use with caution!)
"
      exit 2
      ;;

    check)
      check_environment

      logn "Finding latest version available on $ppa_host"
      latest_version=$(latest_remote_version)
      log ": $latest_version"

      logn "Finding latest installed version"
      installed_version=$(latest_local_version)
      installed_version=${installed_version%-*}
      log ": $installed_version"

      # Check if build was successful
      if [ $doublecheckversion -gt 0 ]; then
            ppa_uri=$ppa_index${latest_version%\.0}"/"
            ppa_uri=${ppa_uri/\.0-rc/-rc}

            index=$(download $ppa_host "$ppa_uri")
            if [[ ! $index =~ $build_succeeded_text ]]; then
               log "A newer kernel version ($latest_version) was found but the build was not successful"

                [ -n "$DISPLAY" ] &amp;&amp; [ -x "$(command -v notify-send)" ] &amp;&amp; notify-send --icon=info -t 12000 \
                  "Kernel $latest_version available" \
                  "A newer kernel version ($latest_version) is\navailable but the build was not successful"
                exit 1
            fi
      fi

      # Check installed minor branch
      latest_minor_text=""
      latest_minor_notify=""
      latest_minor_version=""
      if [ -n "${installed_version}" ] &amp;&amp; [ "${installed_version}" != "none" ] &amp;&amp; [ "${latest_version%.*}" != "${installed_version%.*}" ]; then
            latest_minor_version=$(latest_remote_version "${installed_version%.*}")

            if [ "$installed_version" != "$latest_minor_version" ]; then
            latest_minor_text=", latest in current branch is ${latest_minor_version}"
            latest_minor_notify="Version ${latest_minor_version} is available in the current ${installed_version%.*} branch\n\n"
            fi
      fi

      if [ "$installed_version" != "$latest_version" ] &amp;&amp; [ "$installed_version" = "$(echo -e "$latest_version\n$installed_version" | sort -V | head -n1)" ]; then
            log "A newer kernel version ($latest_version) is available${latest_minor_text}"

            [ -n "$DISPLAY" ] &amp;&amp; [ -x "$(command -v notify-send)" ] &amp;&amp; notify-send --icon=info -t 12000 \
                "Kernel $latest_version available" \
                "A newer kernel version ($latest_version) is available\n\n${latest_minor_notify}Run '$(basename "$0") -i' to update\nor visit $ppa_host$ppa_uri"
            exit 1
      fi
      ;;
    local-list)
      load_local_versions

      # shellcheck disable=SC2015
      [[ -n "$(command -v column)" ]] &amp;&amp; { column="column -x"; } || { column="cat"; }

      (for version in "${LOCAL_VERSIONS[@]}"; do
            if [ -z "${action_data}" ] || [[ "$version" =~ ${action_data} ]]; then
                echo "$version"
            fi
      done) | $column
      ;;
    remote-list)
      check_environment
      load_remote_versions

      # shellcheck disable=SC2015
      [[ -n "$(command -v column)" ]] &amp;&amp; { column="column -x"; } || { column="cat"; }

      (for version in "${REMOTE_VERSIONS[@]}"; do
            if [ -z "${action_data}" ] || [[ "$version" =~ ${action_data} ]]; then
                echo "$version"
            fi
      done) | $column
      ;;
    install)
      # only ensure running if the kernel files should be installed
      [ $do_install -eq 1 ] &amp;&amp; guard_run_as_root

      check_environment
      load_local_versions

      if [ -z "${action_data}" ]; then
            logn "Finding latest version available on $ppa_host"
            version=$(latest_remote_version)
            log

            if containsElement "$version" "${LOCAL_VERSIONS[@]}"; then
                logn "Latest version is $version but seems its already installed"
            else
                logn "Latest version is: $version"
            fi

            if [ $do_install -gt 0 ] &amp;&amp; [ $assume_yes -eq 0 ];then
                logn ", continue? (y/N) "
                [ $quiet -eq 0 ] &amp;&amp; read -rsn1 continue
                log

                [ "$continue" != "y" ] &amp;&amp; [ "$continue" != "Y" ] &amp;&amp; { exit 0; }
            else
                log
            fi
      else
            load_remote_versions

            version=""
            if containsElement "v${action_data#v}" "${REMOTE_VERSIONS[@]}"; then
                version="v"${action_data#v}
            fi

            [[ -z "$version" ]] &amp;&amp; {
                err "Version '${action_data}' not found"
                exit 2
            }
            shift

            if [ $do_install -gt 0 ] &amp;&amp; containsElement "$version" "${LOCAL_VERSIONS[@]}" &amp;&amp; [ $assume_yes -eq 0 ]; then
                logn "It seems version $version is already installed, continue? (y/N) "
                [ $quiet -eq 0 ] &amp;&amp; read -rsn1 continue
                log

                [ "$continue" != "y" ] &amp;&amp; [ "$continue" != "Y" ] &amp;&amp; { exit 0; }
            fi
      fi

      [ ! -d "$workdir" ] &amp;&amp; {
            mkdir -p "$workdir" 2&gt;/dev/null
      }
      [ ! -x "$workdir" ] &amp;&amp; {
            err "$workdir is not writable"
            exit 1
      }

      cd "$workdir" || exit 1

      [ $check_signature -eq 1 ] &amp;&amp; [ -z "$(command -v gpg)" ] &amp;&amp; {
            check_signature=0

            warn "Disable signature check, gpg not available"
      }

      IFS=$'\n'

      ppa_uri=$ppa_index${version%\.0}"/"
      ppa_uri=${ppa_uri/\.0-rc/-rc}

      index=$(download $ppa_host "$ppa_uri")

      if [[ ! $index =~ $build_succeeded_text ]]; then
          err "Abort, the ${arch} build has not succeeded"
          exit 1
      fi

      index=${index%%*&lt;table}

      FILES=()

      found_arch=0
      uses_subfolders=0
      section_end="^[[:space:]]*&lt;br&gt;[[:space:]]*$"
      for line in $index; do
            if [[ $line =~ $build_succeeded_text ]]; then
            found_arch=1
            continue
            elif [ $found_arch -eq 0 ]; then
            continue
            elif [[ $line =~ $section_end ]]; then
            break
            fi

            [[ "$line" =~ linux-(image(-(un)?signed)?|headers|modules)-+\.+\.+-{6}.*?_(${arch}|all).deb ]] || continue

            [ $use_lowlatency -eq 0 ] &amp;&amp; [[ "$line" =~ "-lowlatency" ]] &amp;&amp; continue
            [ $use_lowlatency -eq 1 ] &amp;&amp; [[ ! "$line" =~ "-lowlatency" ]] &amp;&amp; [[ ! "$line" =~ "_all" ]] &amp;&amp; continue
            [ $use_lpae -eq 0 ] &amp;&amp; [[ "$line" =~ "-lpae" ]] &amp;&amp; continue
            [ $use_lpae -eq 1 ] &amp;&amp; [[ ! "$line" =~ "-lpae" ]] &amp;&amp; [[ ! "$line" =~ "_all" ]] &amp;&amp; continue
            [ $use_snapdragon -eq 0 ] &amp;&amp; [[ "$line" =~ "-snapdragon" ]] &amp;&amp; continue
            [ $use_snapdragon -eq 1 ] &amp;&amp; [[ ! "$line" =~ "-snapdragon" ]] &amp;&amp; [[ ! "$line" =~ "_all" ]] &amp;&amp; continue

            line=${line##*href=\"}
            line=${line%%\"&gt;*}

            if [ $uses_subfolders -eq 0 ] &amp;&amp; [[ $line =~ ${arch}/linux ]]; then
            uses_subfolders=1
            fi

            FILES+=("$line")
      done
      unset IFS

      if [ $check_signature -eq 1 ]; then
            if [ $uses_subfolders -eq 0 ]; then
            FILES+=("CHECKSUMS" "CHECKSUMS.gpg")
            else
            FILES+=("${arch}/CHECKSUMS" "${arch}/CHECKSUMS.gpg")
            fi
      fi

      if [ ${#FILES[@]} -ne $expected_files_count ]; then
            if [ $assume_yes -eq 0 ]; then
                logn "Expected to need to download $expected_files_count files but found ${#FILES[@]}, continue? (y/N)"
                read -rsn1 continue
                echo ""
            else
                continue="y"
            fi

            [ "$continue" != "y" ] &amp;&amp; [ "$continue" != "Y" ] &amp;&amp; { exit 0; }
      fi

      debs=()
      log "Will download ${#FILES[@]} files from $ppa_host:"
      for file in "${FILES[@]}"; do
            workfile=${file##*/}
            monitor_progress "Downloading $file" "$workdir$workfile"
            download $ppa_host "$ppa_uri$file" &gt; "$workdir$workfile"

            remove_http_headers "$workdir$workfile"
            end_monitor_progress

            if [[ "$workfile" =~ \.deb ]]; then
                debs+=("$workfile")
            fi
      done

      if [ $check_signature -eq 1 ]; then
            if ! gpg --list-keys ${ppa_key} &gt;$debug_target 2&gt;&amp;1; then
                logn "Importing kernel-ppa gpg key "

                if gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv ${ppa_key} &gt;$debug_target 2&gt;&amp;1; then
                  log "ok"
                else
                  logn "failed"
                  warn "Unable to check signature"
                  check_signature=0
                fi
            fi

            if [ $check_signature -eq 1 ]; then
                if gpg --verify CHECKSUMS.gpg CHECKSUMS &gt;$debug_target 2&gt;&amp;1; then
                  log "Signature of checksum file has been successfully verified"
                else
                  err "Abort, signature of checksum file is NOT OK"
                  exit 4
                fi
            fi
      fi

      if [ $check_checksum -eq 1 ]; then
            shasums=( "sha256sum" "sha1sum" )

            for shasum in "${shasums[@]}"; do
                xshasum=$(command -v "$shasum")
                if [ -n "$xshasum" ] &amp;&amp; [ -x "$xshasum" ]; then
                  # shellcheck disable=SC2094
                  shasum_result=$($xshasum --ignore-missing -c CHECKSUMS 2&gt;&gt;$debug_target | tee -a $debug_target | wc -l)

                  if [ "$shasum_result" -eq 0 ] || [ "$shasum_result" -ne ${#debs[@]} ]; then
                        err "Abort, $shasum returned an error $shasum_result"
                        exit 4
                  else
                        log "Checksums of deb files have been successfully verified with $shasum"
                  fi

                  break
                fi
            done
      fi

      if [ $do_install -eq 1 ]; then
            if [ ${#debs[@]} -gt 0 ]; then
                log "Installing ${#debs[@]} packages"
                $sudo dpkg -i "${debs[@]}" &gt;$debug_target 2&gt;&amp;1
            else
                warn "Did not find any .deb files to install"
            fi
      else
            log "deb files have been saved to $workdir"
      fi

      if [ $cleanup_files -eq 1 ]; then
            log "Cleaning up work folder"
            rm -f "$workdir"*.deb
            rm -f "$workdir"CHECKSUM*
            rmdir "$workdir"
      fi
      ;;
    uninstall)
      guard_run_as_root
      load_local_versions

      if [ ${#LOCAL_VERSIONS[@]} -eq 0 ]; then
            echo "No installed mainline kernels found"
            exit 1
      elif [ -z "${action_data}" ]; then
            echo "Which kernel version do you wish to uninstall?"
            nr=0
            for version in "${LOCAL_VERSIONS[@]}"; do
                echo "[$nr]: $version"
                nr=$((nr + 1))

                [ $nr -gt 9 ] &amp;&amp; break
            done

            echo -n "type the number between []: "
            read -rn1 index
            echo ""

            uninstall_version=${LOCAL_VERSIONS[$index]}
      elif containsElement "v${action_data#v}" "${LOCAL_VERSIONS[@]}"; then
            uninstall_version="v"${action_data#v}
      else
            err "Kernel version ${action_data} not installed locally"
            exit 2
      fi

      if [ $assume_yes -eq 0 ]; then
            echo -n "Are you sure you wish to remove kernel version $uninstall_version? (y/N)"
            read -rsn1 continue
            echo ""
      else
            continue="y"
      fi

      if [ "$continue" == "y" ] || [ "$continue" == "Y" ]; then
            IFS=$'\n'

            pckgs=()
            for pckg in $(dpkg -l linux-{image,image-?signed,headers,modules}-"${uninstall_version#v}"* 2&gt;$debug_target | cut -d " " -f 3); do
                # only match kernels from ppa, they have 6 characters as second version string
                if [[ "$pckg" =~ linux-headers-+\.+\.+-{6} ]]; then
                  pckgs+=("$pckg:$arch")
                  pckgs+=("$pckg:all")
                elif [[ "$pckg" =~ linux-(image(-(un)?signed)?|modules)-+\.+\.+-{6} ]]; then
                  pckgs+=("$pckg:$arch")
                fi
            done

            if [ ${#pckgs[@]} -eq 0 ]; then
                warn "Did not find any packages to remove"
            else
                echo "The following packages will be removed: "
                echo "${pckgs[@]}"

                if [ $assume_yes -eq 0 ]; then
                  echo -n "Are you really sure? Do you still have another kernel installed? (y/N)"

                  read -rsn1 continue
                  echo ""
                else
                  continue="y"
                fi

                if [ "$continue" == "y" ] || [ "$continue" == "Y" ]; then
                  if $sudo env DEBIAN_FRONTEND=noninteractive dpkg --purge "${pckgs[@]}" 2&gt;$debug_target &gt;&amp;2; then
                        log "Kernel $uninstall_version successfully purged"
                        exit 0
                  fi
                fi
            fi
      fi
      ;;
esac

exit 0
</pre>
</div>
<p>  </p><br><br>
来源:https://www.cnblogs.com/gooutlook/p/16306803.html
頁: [1]
查看完整版本: Ubuntu 20.04 升级最新内核、安装指定内核版本