<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Gnu-Linux on よ〜んの雑記</title><link>https://mu7889yoon.github.io/tags/gnu-linux/</link><description>Recent content in Gnu-Linux on よ〜んの雑記</description><generator>Hugo</generator><language>ja-jp</language><lastBuildDate>Wed, 06 May 2026 17:13:04 +0900</lastBuildDate><atom:link href="https://mu7889yoon.github.io/tags/gnu-linux/index.xml" rel="self" type="application/rss+xml"/><item><title>Kernel Live Patching ってなんだ？</title><link>https://mu7889yoon.github.io/posts/al2023-kernel-live-patch/</link><pubDate>Wed, 06 May 2026 17:13:04 +0900</pubDate><guid>https://mu7889yoon.github.io/posts/al2023-kernel-live-patch/</guid><description>&lt;p&gt;よ〜んです。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mu7889yoon.github.io/posts/learn-the-finer-points-of-amazon-linux/"&gt;AL2023 Deep Dive シリーズ&lt;/a&gt;の一環…なんですが、今回はちょっと毛色を変えて &lt;strong&gt;Kernel Live Patching&lt;/strong&gt; の話です。Amazon Linux 2023 そのものの深掘りというより、Amazon Linux 2023でも使えるLinuxカーネルのお話になります。&lt;/p&gt;
&lt;p&gt;最近クリティカルな CVE が多いですね。カーネルの更新となると再起動を伴うわけですが、本番で動いてるサーバーを気軽に再起動できるわけもなく、かといってセキュリティパッチを放置するのも気持ち悪い。&lt;/p&gt;
&lt;p&gt;そんなときに使えるのが Kernel Live Patching ですね。&lt;/p&gt;
&lt;h2 id="kernel-live-patching"&gt;Kernel Live Patching&lt;/h2&gt;
&lt;p&gt;一言でいうと、&lt;strong&gt;動いてるカーネルに対して、再起動なしでパッチを当てる仕組み&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;Linux カーネル 4.0 から入った &lt;code&gt;livepatch&lt;/code&gt; という機能がベースになっていて、内部的には &lt;strong&gt;functoin tracer(ftrace)&lt;/strong&gt; を使ってカーネル関数の呼び出し先を差し替えます。&lt;/p&gt;
&lt;p&gt;つまり、脆弱性のある関数が呼ばれたとき、ftrace が「いや、こっちの修正済み関数を使ってね」と差し替えてくれるわけですね、素晴らしい&lt;/p&gt;
&lt;h2 id="パッチ適用後当該環境は不安定にならないのか"&gt;パッチ適用後、当該環境は不安定にならないのか。&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kernel Live Patchingはあくまで「再起動までの繋ぎ」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;パッチが蓄積していくとカーネル内部の関数リダイレクトが増えていくので、長期間再起動なしで運用し続けるのは推奨されていません。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AWS は、AL2023 カーネルバージョンのリリースから 3 か月間、カーネルライブパッチを提供します。その後、カーネルライブパッチを引き続き入手するには、新しいカーネルバージョンに更新する必要があります。
&lt;a href="https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/live-patching.html"&gt;Kernel Live Patching on AL2023 - Amazon Linux 2023&lt;/a&gt; より&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とあるので、「3 ヶ月目安でカーネルを更新してね」というサイクル推奨しているように見えます。&lt;/p&gt;
&lt;h2 id="al2023-での-live-patching"&gt;AL2023 での Live Patching&lt;/h2&gt;
&lt;p&gt;AL2023 でも &lt;a href="https://docs.aws.amazon.com/linux/al2023/ug/live-patching.html"&gt;Kernel Live Patching&lt;/a&gt; が公式にサポートされています。&lt;/p&gt;
&lt;h3 id="対応環境"&gt;対応環境&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;アーキテクチャ&lt;/strong&gt;: x86_64 / ARM64&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;動作環境&lt;/strong&gt;: EC2、オンプレミスの VM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コスト&lt;/strong&gt;: 追加料金なし（ここ大事）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに他の OS だとライブパッチは有料だったりします。Ubuntu は &lt;a href="https://ubuntu.com/security/livepatch"&gt;Livepatch&lt;/a&gt; が Ubuntu Pro（商用利用は有料）の一部の機能だったりします、AL2023 なら追加料金なしで使えるのはありがたいですね。&lt;/p&gt;</description></item><item><title>systemd timer が結構いい</title><link>https://mu7889yoon.github.io/posts/systemd-timer-is-pretty-good/</link><pubDate>Tue, 17 Mar 2026 20:00:46 +0900</pubDate><guid>https://mu7889yoon.github.io/posts/systemd-timer-is-pretty-good/</guid><description>&lt;p&gt;お久しぶりです、よ〜んです。&lt;/p&gt;
&lt;p&gt;UNIXやGNU/Linuxのジョブの定時実行といえば&lt;code&gt;cron&lt;/code&gt;ですが、Amazon Linux 2023 （AL2023）では定時実行を&lt;code&gt;systemd timer&lt;/code&gt;で行うことが推奨されているようです。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/deprecated-al2023.html#deprecated-crona"&gt;AL2023 で廃止 - Amazon Linux 2023&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="なぜsystemd-timer-が推されているのか"&gt;なぜ&lt;code&gt;systemd timer&lt;/code&gt; が推されているのか&lt;/h2&gt;
&lt;p&gt;GNU/Linuxでは、サービス管理、起動順序、ログ、失敗時の扱いが&lt;code&gt;systemd&lt;/code&gt; に集約されています。&lt;/p&gt;
&lt;p&gt;だったら、定期実行も同じ世界に載せたほうが運用しやすい、ということだと私は考えます。&lt;/p&gt;
&lt;h3 id="デフォルトでログが記録される"&gt;デフォルトでログが記録される&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cron&lt;/code&gt;はログを保存しません。&lt;/p&gt;
&lt;p&gt;なので、ログを残す場合、以下のような&lt;strong&gt;おまじない&lt;/strong&gt;をしてあげる必要がありました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* * * * * command &amp;gt;&amp;gt; /var/log/job.log 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;コーディングエージェントが良くやるやつですね&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="ステートがある"&gt;ステートがある&lt;/h3&gt;
&lt;p&gt;もちろん&lt;code&gt;cron&lt;/code&gt;でもログを残したり、終了したらDBに状態を格納したり、Discordなどに通知する仕組みを入れておくことで状態を持たせることは可能です。&lt;/p&gt;
&lt;p&gt;一方、&lt;code&gt;systemd timer&lt;/code&gt;(というか&lt;code&gt;systemd&lt;/code&gt;)では、↑のような一手間を加えずに状態を持ちます。&lt;/p&gt;
&lt;h3 id="リトライがある"&gt;リトライがある&lt;/h3&gt;
&lt;p&gt;そして、&lt;code&gt;systemd&lt;/code&gt;側で状態を持っているということは、リトライが可能になります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cron&lt;/code&gt;でも実行するジョブ側に自前実装でリトライさせることは可能です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;systemd service&lt;/code&gt; (NOT &lt;code&gt;systemd timer&lt;/code&gt;)なら、失敗時の扱いを記述し、リトライさせることが可能です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Restart&lt;span style="color:#f92672"&gt;=&lt;/span&gt;on-failure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RestartSec&lt;span style="color:#f92672"&gt;=&lt;/span&gt;30s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OnFailure&lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;systemd timer&lt;/code&gt;の機能の一つである&lt;code&gt;Persistent&lt;/code&gt; を使うことで、例えば10時に実行するjobがあったときに、ジョブ実行を行なっている計算機がシャットダウンしていても、計算機起動後にジョブを実行してくれます。&lt;/p&gt;
&lt;p&gt;実行時間に厳密である必要はないが、大体このぐらいの時間に実行してほしいといったパターンにめっちゃ便利だなと思いました。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;上記のような点から、&lt;code&gt;systemd timer&lt;/code&gt;では&lt;code&gt;cron&lt;/code&gt;で自前実装・不便だったポイントが標準で揃っていることがわかりました。&lt;/p&gt;
&lt;h2 id="cronからsystemd-timerに移行するには"&gt;&lt;code&gt;cron&lt;/code&gt;から&lt;code&gt;systemd timer&lt;/code&gt;に移行するには&lt;/h2&gt;
&lt;p&gt;たとえば、こういう &lt;code&gt;cron&lt;/code&gt; があったとします。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cron" data-lang="cron"&gt;0 3 * * * /usr/local/bin/daily.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;まずは&lt;strong&gt;何を実行するか&lt;/strong&gt; を &lt;code&gt;.service&lt;/code&gt; に、&lt;strong&gt;いつ実行するか&lt;/strong&gt; を &lt;code&gt;.timer&lt;/code&gt; に書いていきます。&lt;/p&gt;</description></item></channel></rss>