第3章 外部のカーネルパラメーターに対する重要な変更

本章では、システム管理者向けに、Red Hat Enterprise Linux 7.7 に同梱されるカーネルにおける重要な変更の概要について説明します。変更には、proc エントリー、sysctl および sysfs のデフォルト値、boot パラメーター、カーネル設定オプションの追加や更新、注目すべき動作の変更などが含まれます。

新しいカーネルパラメーター

usbcore.quirks = [USB]

このパラメーターは、ビルトイン usb コア quirk リストを拡張する quirk エントリーの一覧を提供します。

エントリーはコンマで区切られます。各エントリーの形式は VendorID:ProductID:Flags です。

ID は 4 桁の 16 進数で、Flags は文字のセットです。各文字は、組み込みの quirk を変更します。クレデンシャルが設定されると、明確で消去された場合は設定を行います。文字には、以下の意味があります。

  • a = USB_QUIRK_STRING_FETCH_255 (文字列記述子は 255 バイトの読み取りを使用して取得しないでください)。
  • b = USB_QUIRK_RESET_RESUME (デバイスは正しく再開できないため、代わりにリセットできません)。
  • c = USB_QUIRK_NO_SET_INTF (デバイスは Set-Interface requests) を処理できません。
  • d = USB_QUIRK_CONFIG_INTF_STRINGS (デバイスは設定またはインターフェイスの文字列を処理できません)。
  • e = USB_QUIRK_RESET (デバイスをリセットできない(morph デバイスなど)、リセットは使用しないでください)。
  • f = USB_QUIRK_HONOR_BNUMINTERFACES (デバイスには bNumInterfaces の数よりも多くのインターフェイスの説明があり、これらのインターフェイスとの通信を処理できません)。
  • g = USB_QUIRK_DELAY_INIT (デバイスの初期化中にデバイスにはデバイス記述子を読み取った後) を一時停止する必要があります。
  • h = USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL (高速およびスーパー速度割り込みエンドポイントの場合) では、USB 2.0 および USB 3.0 仕様では、マイクロフレームの間隔 (1 マイクロフレーム = 125 マイクロ秒) を interval = 2 ^ (bInterval-1) として計算する必要があります。この quirk を持つデバイスは、計算で使用されるexponent 変数の代わりに、この計算の結果として bInterval を報告します。
  • i = USB_QUIRK_DEVICE_QUALIFIER (デバイスは device_qualifier 記述子リクエストを処理できません)
  • j = USB_QUIRK_IGNORE_REMOTE_WAKEUP (デバイスは偽のウェイクアップを生成し、リモートウェイクアップ機能を無視します)
  • k = USB_QUIRK_NO_LPM (デバイスはリンク電源管理を処理できません);
  • l = USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL (デバイスは、USB 2.0 計算ではなくリニアフレームとして bInterval を報告します)
  • m = USB_QUIRK_DISCONNECT_SUSPEND (誤ったウェイクアップを防ぐために、サスペンドの前にデバイスを切断する必要があります)
  • n = USB_QUIRK_DELAY_CTRL_MSG (デバイスはすべての制御メッセージの後に一時停止する必要があります);

    エントリーの例を以下に示します。

    quirks=0781:5580:bk,0a5c:5834:gij
ppc_tm = [PPC]

ハードウェアトランザクションメモリーを無効にします。

形式: {"off"}

cgroup.memory = [KNL]

cgroup メモリーコントローラーにオプションを渡します。

形式は、<文字列> です。

nokmem EOF-jiffies このオプションは、カーネルメモリーアカウンティングを無効にします。

mds = [X86,INTEL]

Micro-architectural Data Sampling (MDS) 脆弱性の軽減策を制御します。

特定の CPU は、CPU の内部のバッファーに対する悪用から影響を受けやすく、特定の条件で開示ガジェットに情報が転送される可能性があります。

脆弱なプロセッサーでは、攻撃者が直接アクセス権を持たないデータにアクセスするために、キャッシュ側のチャネル攻撃で、予測的に転送されるデータを利用できます。

オプションは次のとおりです。

  • full - 脆弱な CPU で MDS 軽減策を有効にします。
  • full,nosmt - 脆弱な CPU で MDS 軽減策を有効にし、同時マルチスレッド (SMT) を無効にします。
  • off - MDS 軽減策を無条件に無効にします。

    このオプションを指定しないことは、mds=full と同等です。

mitigations = [X86,PPC,S390]

CPU 脆弱性に対するオプションの軽減策を制御します。これは、既存のアーキテクチャー固有のオプションの集約となる、一連の、アーキテクチャーに依存しないオプションです。

オプションは次のとおりです。

  • off - オプションの CPU 軽減策をすべて無効にします。これによりシステムパフォーマンスが向上しますが、ユーザーを複数の CPU の脆弱性にさらす可能性もあります。

    以下に相当します。

    • nopti [X86,PPC]
    • nospectre_v1 [PPC]
    • nobp=0 [S390]
    • nospectre_v2 [X86,PPC,S390]
    • spec_store_bypass_disable=off [X86,PPC]
    • l1tf=off [X86]
    • mds=off [X86]
  • auto (デフォルト) - すべての CPU 脆弱性を軽減しますが、脆弱な場合でも SMT (Simultaneous multithreading) を有効にしたままにしておきます。これは、カーネルのアップグレードで SMT が自動的に無効化されないようにしたいユーザーや、SMT ベースの攻撃を他の方法で回避できるユーザーを対象にしています。

    以下に相当します。

    • (デフォルトの動作)
  • auto,nosmt - すべての CPU 脆弱性を軽減し、必要に応じて SMT (Simultaneous multithreading) を無効にします。これは、SMT が失われることを意味する場合でも、常に完全な軽減を求めるユーザーを対象としています。

    以下に相当します。

    • l1tf=flush,nosmt [X86]
    • mds=full,nosmt [X86]
watchdog_thresh = [KNL]

ハードロックアップ検出検出ストール期間のしきい値を秒単位で設定します。

ソフトロックアップ検出のしきい値は、値の 2 倍に設定されます。

値が 0 の場合は、両方のロックアップ検出が無効になります。デフォルトは 10 秒です。

novmcoredd [KNL,KDUMP]

デバイスダンプを無効にします。デバイスダンプを使用すると、ドライバーがダンプデータを vmcore に追加できるため、ドライバーが指定したデバッグ情報を収集できます。

ドライバーは無制限にデータを追加でき、このデータはメモリーに保存されるため、メモリーに大きな負荷がかかる可能性があります。

デバイスダンプを無効にするとメモリーを節約できますが、ドライバーのデバッグデータは利用できなくなります。

このパラメーターは、CONFIG_PROC_VMCORE_DEVICE_DUMP が設定されている場合にのみ利用できます。

更新されたカーネルパラメーター

resource_alignment

アライメント、およびアライメントされたメモリーリソースを再割り当てするデバイスを指定します。

書式は以下のようになります。

  • [<order of align>@][<domain>:]<bus>:<slot>.<func>[; …​]
  • [<order of align>@]pci:<vendor>:<device>\[:<subvendor>:<subdevice>][; …​]

<order of align> が指定されていない場合は、PAGE_SIZE がアライメントとして使用されます。リソースウィンドウを拡張する必要がある場合は、PCI-PCI ブリッジを指定できます。

irqaffinity = [SMP]

デフォルトの irq アフィニティーマスクを設定します。

書式は以下のようになります。

  • <CPU number>,…​,<cpu number>
  • <cpu number>-<cpu number>
  • ドライバー (昇順で正の範囲である必要があります)
  • mixture & lt;cpu number>,…​,<cpu number>-<cpu number>

    ドライバーは、すべて を CPU0 に配置する代わりに、デフォルトの割り込み割り当てにドライバーのアフィニティーマスクを使用します。

オプションは次のとおりです。

  • auto (デフォルト) - すべての CPU 脆弱性を軽減しますが、脆弱な場合でも SMT (Simultaneous multithreading) を有効にしたままにしておきます。これは、カーネルのアップグレードで SMT が自動的に無効化されないようにしたいユーザーや、SMT ベースの攻撃を他の方法で回避できるユーザーを対象にしています。

    同等: (デフォルトの動作)

  • auto,nosmt - すべての CPU 脆弱性を軽減し、必要に応じて SMT (Simultaneous multithreading) を無効にします。これは、SMT が失われることを意味する場合でも、常に完全な軽減を求めるユーザーを対象としています。

    以下に相当します。

    • l1tf=flush,nosmt [X86]
    • mds=full,nosmt [X86]

新しい /proc/sys/net/core パラメーター

bpf_jit_kallsyms

Berkeley Packet Filter Just in Time コンパイラーが有効になっている場合、コンパイルされたイメージはカーネルへの不明なアドレスです。これは、トレースや /proc/kallsyms ファイルには表示されません。これにより、デバッグ/トレースに使用できるこれらのアドレスのエクスポートが有効になります。bpf_jit_harden パラメーターが有効になっている場合、この機能は無効になります。

可能な値は次のとおりです。

0 - Just in Time (JIT) kallsyms export (デフォルト値) を無効にします。

1 - 特権ユーザーに対してのみ Just in Time (JIT) kallsyms エクスポートを有効にします。

更新された/proc/sys/fs パラメーター

dentry-state

Dentries の割り当ておよび割当解除は動的に行われます。

linux/include/linux/dcache.h から:

struct dentry_stat_t dentry_stat {
        int nr_dentry;
        int nr_unused;
        int age_limit;         (age in seconds)
        int want_pages;        (pages requested by system)
        int nr_negative;       (# of unused negative dentries)
        int dummy;             (Reserved for future use)
};

nr_dentry 番号は、割り当てられた dentry の総数 (active + unused) を示します。

nr_unused - 数値は、あまり使用されていない Dentry の数を表示しますが、今後再利用できるように最近一番使用されていないもの (LRU) に保存されます。

age_limit 番号は、メモリーが短い場合に dcache エントリーを回収できるようになるまでの経過時間 (秒単位) で、shrink_dcache_pages() 関数が呼び出され、dcache がまだプルーニングされていない場合に want_pages 番号はゼロ以外になります。

nr_negative - 数値は未使用の dentry の数を表示します。この数は、どのファイルにもマッピングされていない負の場合もあります。代わりに、ユーザーから提供された存在しないファイルの拒否にかかる時間を短縮できます。