web-dev-qa-db-ja.com

EFI署名済みカーネルを安全にパージできますか? (または、署名のないカーネルを削除できますか?)

Ubuntu 16.10(yakkety)インストールからlinux-signed*パッケージを安全にアンインストールして削除できますか?

これを検討している理由は、UEFI BIOSがセキュアブートを使用せず、ブートパーティションが200 MiB(約210 MB)しかないためです。残りのパーティションは暗号化されていますが、ブートパーティションを拡張するためにパーティションのサイズを変更したくありません。

残念ながら、200 MiBは3つのカーネルを保持するには小さすぎます。現在のカーネルはそれぞれ約61 MiBになります(これにはabi、config、initrd、mapに加えて、署名付きおよび署名なしのカーネルバイナリが含まれます)。 grub、memtest、およびパーティションテーブルを追加すると、約198にプッシュされます。これは、aptがカーネルを更新するための十分な空き領域ではないようです。通常、2つのカーネル(現在+最後)のみを保持しますが、明らかに、更新プロセス中に3分の1のスペースが必要です。署名されたカーネル(それぞれ7.2 MiB)がなければ、私は大丈夫でしょう。

今日の時点で、カーネル4.8.0のビルドバージョン41、45、および46がインストールされています。

次は私のシステムを壊しますか?

apt-get purge linux-signed*
grub-mkconfig -o /boot/grub/grub.cfg

(ubfan1のコメントの後に追加された2行目、以下を参照)

次のカーネルパッケージを削除し、新しい署名付きカーネルがインストールされないようにする必要があると思います。

linux-signed-generic
linux-signed-image-4.8.0-41-generic
linux-signed-image-4.8.0-45-generic
linux-signed-image-4.8.0-46-generic
linux-signed-image-generic

これらのパッケージの通常(署名なし)バージョンがすべてインストールされています。

副質問として、unicode.pf2ファイル(2.3 MiB)が/boot/grub/boot/grub/fontsの両方に表示される理由を誰もが知っていますか?ファイルを比較したところ、まったく同じです。これはgrubメニューで使用されているフォントであると思いますが、なぜ同じパーティションに2回表示されるのですか? 2.3 MiBについて口論しているように感じますが、それは私の特定のケースで大きな違いを生む可能性もあります。

ありがとう!

.efi.signedカーネルは、/boot/grub/grub.cfgのすべてのメニューエントリに表示されます。私のuefiファームウェア(biosはもはや正しい用語ではないと思います)はセキュアブートを使用しないことを知っていますが、grub構成ファイルはそれを行うと考えているようです。明らかに私のシステムは署名されたカーネルを正常に起動するので、代わりにnsignedカーネルを消去できますか?

これらの行がどこから来たかを見つけるために/etc/grub.d/10_linuxを掘り下げ、次のコードを見つけました。

if test -d /sys/firmware/efi && test -e "${linux}.efi.signed"; then
    sed "s/^/$submenu_indentation/" << EOF
    linux   ${rel_dirname}/${basename}.efi.signed
      root=${linux_root_device_thisversion} ro ${args}
EOF
  else
    sed "s/^/$submenu_indentation/" << EOF
    linux   ${rel_dirname}/${basename}
      root=${linux_root_device_thisversion} ro ${args}
EOF
  fi

私はbashの専門家ではありませんが、擬似コードでこれに従うと思います

if /sys/firmware/efi AND /boot/vmlinuz-x.x.x-xx.efi.signed exist
  echo linux vmlinuz-x.x-xx-generic.efi.signed to /boot/grub/grub.cfg
else
  echo linux vmlinuz-x.x.x-xx-generic to /boot/grub/grub.cfg

したがって、署名済みのカーネルパッケージをパージしてからgrub-mkconfigを再実行すると、通常の署名されていないカーネルがgrub.cfgに入れられるはずですよね?

4
James Duvall

すべてのヘルプとリンクをありがとう。私はこの週末に数時間を過ごし、次のことを確認しました

短い答え

  1. はい、すべてのlinux-signed*パッケージを消去できますが、自動カーネル更新を引き続き適切に機能させるには、linux-genericをインストールする必要があります。 grub、カーネル、およびinitramfsの再構成はすべて自動的に処理されます。カーネルインストールスクリプトは、問題なくすべてを処理します。
    apt-get purge linux-signed* linux-generic+
  2. はい、署名されていないカーネルを悪影響なしで取り除くことができますが、カーネルの更新後もそれらは戻ってきます。これはパッケージを管理しても解決できませんが、短いスクリプトで簡単に修正できます。

    #!/bin/sh
    #
    # user script: 
    /etc/kernel/postinst.d/zzz-remove-unsigned-kernel
    #
    # after a new signed kernel image is installed, this script removes
    # the unsigned image
    #
    if [ -e "$2.efi.signed" ]; then
        echo "/etc/kernel/postinst.d/zzz-remove-unsigned-kernel: removing $2"
        rm "$2";
    fi
    

より長い答え

最初のケースでは、解決策は本当に簡単です。あなたが一見すると思うようにそれはほとんど動作します。それでも、カーネルのubuntuパッケージ構造について、いくつかの有用なことを学びました。副作用や結果を理解したかどうかを確認したかったのですが、物事がどのように構築されているかを確認したいだけです。念のため、汎用カーネルを使用しますが、genericlowlatencyまたはvirtualと交換するだけです。また、ここのすべては16.10(yakkety)に基づいています。カーネルパッケージ階層は次のとおりです。 kernel package hierarchy

  • linux-signed-genericメタパッケージです。つまり、コードが含まれていません。依存関係のリストだけがあり、常に最新のカーネルアップデートの完全なインストールが含まれています。 「完全」とは、すべてのカーネルヘッダー、カーネルイメージ、(分離された)イメージ署名、およびubuntuがサポ​​ートできるほぼすべてのデバイスの追加のカーネルモジュールを意味します。

  • linux-genericは、イメージ署名を除く同じ実パッケージをすべて含む別のメタパッケージです。実際のカーネルイメージは、linux-image-x.x.x-yyパッケージに含まれているonlyです。 linux-signed-image-x.x.x-yyパッケージには分離された署名が含まれているだけで、ビルドスクリプトはこのsigを/boot/vmlinuz-x.x.x.yy-genericにアタッチして/boot/vmlinuz-x.x.x.yy-generic.efi.signedを作成します。スクリプトは、署名されていないイメージをクリーンアップしません。

  • カーネルパッケージの/etc/kernelには、デフォルトのapt自動削除動作を変更する特別なスクリプトがあります。通常、linux-signed-genericを削除すると、すべてのダウンストリームパッケージに自動削除のフラグが付けられますが、カーネルパッケージでは、同じバージョンの新しいビルドが2つ作成されるまで、これは発生しません。

2番目のケース(署名付きカーネルイメージのみを保持しようとする場合)では、インストールの完了後に/boot/vmlinuz-x.x.x.yy-genericを削除しても影響はないようです。 2つのカーネルイメージは、署名を除いてまったく同じであり、すべて同じモジュールと構成ファイルを共有します。ただし、更新されたカーネルがインストールされるとすぐに、署名されていないイメージが残ります。幸いなことに、新しいカーネルがインストールされるたびにスクリプトを実行する簡単なフックがありました。 /etc/kernel/postinst.d内のすべてのスクリプトは、run-partsによって実行され、2つの引数を使用します$1はカーネルバージョンで、$2はイメージのフルパスです(つまり、/boot/vmlinuz-x.x.x-yy-generic

唯一の小さな注意点は、署名されていないイメージを削除する必要があることですaftergrubがgrub.cfgの更新を終了します。 /boot/vmlinuz-x.x.x-yy-generic.efi.signedが存在する場合、grubはその画像をgrub.cfgに追加し、署名されていない画像を無視します。ただし、grubは署名なしのイメージを適切に構成できないため、未署名のイメージを期待するプロセスのどこかにある必要があります。 GRUB設定を開始するスクリプトは/etc/kernel/postinst.d/zz-update-grubです。スクリプトにzzz-remove-unsigned-kernelという名前を付けて、他のすべてが終了した後にrun-partsが実行するようにしました。

編集:私はこのスクリプトをいくつかのカーネルビルドの更新で使用しましたが、すべてがうまくいくようです。上記のオプション2を使用しています(署名のないカーネルを削除します)。これを正解としてマークします。

4
James Duvall

知る限り、.efi.signedカーネルは通常のカーネルと同じですが、CanonicalのEFIセキュアブートキーで署名されている点が異なります。そのため、セキュアブートをアクティブにして起動していない場合は、.efi.signedカーネルを安全に削除できます。パッケージ情報を正しく解析している場合は、linux-signed-image-genericおよびlinux-signed-genericパッケージを削除して、署名されたカーネルの将来の更新もインストールされないようにする必要があります。

とは言っても、長期的には、/bootパーティションのサイズを増やすことをお勧めします。特にLVMまたはソフトウェアRAIDを使用している場合、これは苦痛であり、データにとっても危険です。ただし、詳細は現在のディスクレイアウトと、他の理由でそのレイアウトを変更する計画に大きく依存します。レイアウトによっては、最初からデータパーティションを縮小しようとするよりも、最後からデータパーティションを縮小し、現在縮小しているデータパーティションの後に大きな/bootパーティションを作成する方が望ましい場合があることに注意してください。 /bootパーティションが成長するためのスペースを作成します。

最後に、/boot/grubディレクトリツリー内の重複ファイルを見ている数メガバイトを解放するのに十分なほど必死であれば、GRUBから完全に離れることを検討するかもしれません。他のほとんどのブートローダーは、GRUBが必要とするほど/bootのファイルの方法を必要としません。 EFIモードで起動している場合、自分の rEFInd起動マネージャ をインストールするのが最も簡単である可能性が高いため、USBドライブまたはCD-Rで試して、いじる前の状態を確認できますハードディスクで。 BIOSモードで起動している場合、LILO、SYSLINUX、およびGRUB Legacyもすべてのオプションですが、それらをインストールする方法に関する指示へのポインタはありません。

2
Rod Smith

..signedカーネルは少し大きいので、セキュアブートを有効にして実行しておらず、スペースを節約しようとしている場合は、unsignedを使用して署名を削除します。私もgrubを再構築するあなたのアプローチがうまくいくと思います。 grub.cfgを再構築する前に電源を落とす必要がある場合は、いつでも古いgrubメニューを編集して、署名された部分を削除できます。もちろん、1つの署名済みバージョン(最新)を残して、他のバージョンを削除して、期待どおりに動作するかどうかを確認し、最後のバージョンでもう一度実行します。 unicode.pf2ファイルについては、私のシステムにも存在します。片方をもう片方へのリンクで置き換えてみてください(リンクがある場所にファイルを戻す必要がある場合に便利なブートメディアを使用して)。

0
ubfan1