<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on ポンコツ地方エンジニアの技術ブログ</title><link>https://blog.ponkotools.com/tags/linux/</link><description>Recent content in Linux on ポンコツ地方エンジニアの技術ブログ</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Thu, 09 Jul 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://blog.ponkotools.com/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>Codex のレート制限リセット権の有効期限の確認方法</title><link>https://blog.ponkotools.com/posts/2026/07/09/codex/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/07/09/codex/</guid><description>&lt;p&gt;Codex で付与されたレート制限リセット権は有効期限が30日間となっていますが、現状、有効期限がいつまでかを簡単に確認する術がないようです。&lt;br&gt;
以下に Windows 環境で確認するためのスクリプトが記載されていたので、これを参考に Ubuntu 用のスクリプトを作成しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://note.com/moz_ai_tech/n/n84feff773b79" target="_blank" rel="noopener"
 &gt;https://note.com/moz_ai_tech/n/n84feff773b79&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="スクリプトの作成"&gt;&lt;a href="#%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;スクリプトの作成
&lt;/h2&gt;&lt;p&gt;ファイル名は何でもよいですが、例えば &lt;code&gt;check_codex_reset_credits.sh&lt;/code&gt; として、以下の内容を保存してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -euo pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.codex/auth.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://chatgpt.com/backend-api/wham/rate-limit-reset-credits&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="nb"&gt;command&lt;/span&gt; -v jq &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: jq が見つかりません。先にインストールしてください。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; sudo apt update &amp;amp;&amp;amp; sudo apt install -y jq&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="nb"&gt;command&lt;/span&gt; -v curl &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: curl が見つかりません。先にインストールしてください。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; sudo apt update &amp;amp;&amp;amp; sudo apt install -y curl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: 認証ファイルが見つかりません: &lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Codex にログイン済みか確認してください。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;jq -r &lt;span class="s1"&gt;&amp;#39;.tokens.access_token // empty&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;jq -r &lt;span class="s1"&gt;&amp;#39;.tokens.account_id // empty&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: access_token が取得できませんでした。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt; の形式が想定と異なるか、Codex の認証状態が無効です。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TMP_RESPONSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rm -f &amp;#34;$TMP_RESPONSE&amp;#34;&amp;#39;&lt;/span&gt; EXIT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;HTTP_CODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -sS &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;OpenAI-Beta: codex-1&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;originator: Codex Desktop&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;ChatGPT-Account-ID: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --max-time &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$API_URL&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;HTTP_CODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -sS &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;OpenAI-Beta: codex-1&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;originator: Codex Desktop&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --max-time &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$API_URL&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HTTP_CODE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: API 呼び出しに失敗しました。HTTP status: &lt;/span&gt;&lt;span class="nv"&gt;$HTTP_CODE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;レスポンス:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq -r &lt;span class="s1"&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; def fmt_time:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; if . == null or . == &amp;#34;&amp;#34; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;不明&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; # jq の fromdateiso8601 は小数秒つき ISO8601 で失敗することがあるため除去する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; sub(&amp;#34;\\.[0-9]+Z$&amp;#34;; &amp;#34;Z&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | fromdateiso8601
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | localtime
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | strftime(&amp;#34;%Y-%m-%d %H:%M:%S %Z&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; end;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;利用可能なリセット権: \(.available_count // 0) 個&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;状態\t付与日時\t有効期限&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.credits // [])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | map([
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.status // &amp;#34;不明&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.granted_at | fmt_time),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.expires_at | fmt_time)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; ])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | .[]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | @tsv
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; column -t -s &lt;span class="s1"&gt;$&amp;#39;\t&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行手順"&gt;&lt;a href="#%e5%ae%9f%e8%a1%8c%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;実行手順
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y curl jq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x check_codex_reset_credits.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./check_codex_reset_credits.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="注意"&gt;&lt;a href="#%e6%b3%a8%e6%84%8f" class="header-anchor"&gt;&lt;/a&gt;注意
&lt;/h2&gt;&lt;p&gt;このスクリプトは、参照記事の PowerShell 版と同じく、&lt;code&gt;~/.codex/auth.json&lt;/code&gt; から &lt;code&gt;access_token&lt;/code&gt; と &lt;code&gt;account_id&lt;/code&gt; を読み取り、&lt;code&gt;https://chatgpt.com/backend-api/wham/rate-limit-reset-credits&lt;/code&gt; に GET します。&lt;/p&gt;
&lt;p&gt;注意点として、この方法は公式に公開された安定 API ではなく、参照記事でも「内部APIを使った非公式な確認方法」と説明されています。&lt;br&gt;
Codex 側の仕様変更で動かなくなる可能性があります。&lt;/p&gt;</description></item><item><title>OCI や AWS EC2 でセッション切断後も処理を止めないよう tmux を使う</title><link>https://blog.ponkotools.com/posts/2026/05/30/tmux/</link><pubDate>Sat, 30 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/30/tmux/</guid><description>&lt;p&gt;OCI や AWS EC2 で作業していると、SSH セッションを閉じたタイミングで実行中のプログラムが止まってしまうことがあります。&lt;/p&gt;
&lt;p&gt;この問題は、tmux の「セッションを切り離す（detach）」を使うだけでほぼ解決できます。&lt;br&gt;
私は今回初めて tmux を使ったため、必要な操作に限定してメモしておきます。&lt;/p&gt;
&lt;h2 id="先にまとめ"&gt;&lt;a href="#%e5%85%88%e3%81%ab%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;先にまとめ
&lt;/h2&gt;&lt;p&gt;「SSH を閉じても処理を動かし続ける」目的なら、tmux は以下だけで運用できます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SSH ログイン後に tmux セッションを作る&lt;/li&gt;
&lt;li&gt;tmux 内でプログラムを起動する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;d&lt;/code&gt; で切り離す&lt;/li&gt;
&lt;li&gt;SSH を切断しても処理は継続する&lt;/li&gt;
&lt;li&gt;再ログイン後に tmux へ再接続する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;コマンドだけ見ると以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# セッション作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux new -s app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# （tmux 内で）プログラム実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python main.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 切り離し: Ctrl+b, d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# いまあるセッション確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 再接続&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux attach -t app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tmux-のインストール"&gt;&lt;a href="#tmux-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;tmux のインストール
&lt;/h2&gt;&lt;p&gt;Ubuntu 系なら以下で入ります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y tmux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;確認（バージョン表示）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まずは-1-回動かしてみる"&gt;&lt;a href="#%e3%81%be%e3%81%9a%e3%81%af-1-%e5%9b%9e%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;まずは 1 回動かしてみる
&lt;/h2&gt;&lt;h3 id="1-セッションを作る"&gt;&lt;a href="#1-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e4%bd%9c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. セッションを作る
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux new -s app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;app&lt;/code&gt; はセッション名です。&lt;br&gt;
あとで再接続するときに使うので、用途が分かる名前を付けると楽です。&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;tmux だけ打った場合、もし tmux サーバーがまだ動いていなければ、新しいセッションを作って接続します（デフォルト名で作成）。&lt;br&gt;
すでに tmux が動いていて接続済みでない場合は、最近使われたセッションにアタッチします（新しいセッションは作成されません）。
上記のコマンドは明示的に新規の名前付きセッションを作るコマンドになります。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="2-プログラムを起動する"&gt;&lt;a href="#2-%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. プログラムを起動する
&lt;/h3&gt;&lt;p&gt;tmux の画面の中で、普段どおりコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python main.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;たとえば API サーバーなら、以下のように常駐するコマンドでも同じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvicorn app:app --host 0.0.0.0 --port &lt;span class="m"&gt;8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-セッションを切り離すdetach"&gt;&lt;a href="#3-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e5%88%87%e3%82%8a%e9%9b%a2%e3%81%99detach" class="header-anchor"&gt;&lt;/a&gt;3. セッションを切り離す（detach）
&lt;/h3&gt;&lt;p&gt;以下の順でキーを押します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl+b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで tmux の外に戻ります。&lt;br&gt;
プログラムは tmux セッション内でそのまま動き続けますので、SSH 自体を切断して問題ありません。&lt;br&gt;
再ログイン後に tmux へ戻れます。&lt;/p&gt;
&lt;h3 id="4-再接続するattach"&gt;&lt;a href="#4-%e5%86%8d%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8battach" class="header-anchor"&gt;&lt;/a&gt;4. 再接続する（attach）
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;tmux ls&lt;/code&gt; でセッション一覧を見て、名前を確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のコマンドで再接続します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux attach -t app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="セッションを終了して抜けるプロセスを停止してセッションを閉じる"&gt;&lt;a href="#%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e7%b5%82%e4%ba%86%e3%81%97%e3%81%a6%e6%8a%9c%e3%81%91%e3%82%8b%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e5%81%9c%e6%ad%a2%e3%81%97%e3%81%a6%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e9%96%89%e3%81%98%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;セッションを終了して抜ける（プロセスを停止してセッションを閉じる）
&lt;/h2&gt;&lt;p&gt;tmux をデタッチせずにそのままセッションを終了して抜けたい場合は、主に次の方法があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;セッション内から終了する（推奨 — プロセスを安全に停止）&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;tmux attach -t &amp;lt;セッション名&amp;gt;&lt;/code&gt; でセッションに戻る&lt;/li&gt;
&lt;li&gt;実行中のプロセスを &lt;code&gt;Ctrl+C&lt;/code&gt; などで停止する&lt;/li&gt;
&lt;li&gt;シェルで &lt;code&gt;exit&lt;/code&gt; または &lt;code&gt;Ctrl+D&lt;/code&gt; を押すとウィンドウが閉じ、最後のウィンドウが閉じるとセッションは終了します&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;外からセッションを強制的に終了する（注意: プロセスが強制終了される）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tmux kill-session -t &amp;lt;セッション名&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;全てのセッションを終了する場合は &lt;code&gt;tmux kill-server&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意: セッションを閉じると、そのセッション内で動いていたプロセスは終了します。処理を継続させたい場合はデタッチしてください。&lt;/p&gt;
&lt;h2 id="今回の用途で最低限覚えるコマンド"&gt;&lt;a href="#%e4%bb%8a%e5%9b%9e%e3%81%ae%e7%94%a8%e9%80%94%e3%81%a7%e6%9c%80%e4%bd%8e%e9%99%90%e8%a6%9a%e3%81%88%e3%82%8b%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;今回の用途で最低限覚えるコマンド
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;用途&lt;/th&gt;
 &lt;th&gt;コマンド&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;新規セッション作成&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tmux new -s app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション一覧&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tmux ls&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション再接続&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tmux attach -t app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション削除（停止）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tmux kill-session -t app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="alert alert-tip"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;💡&lt;/span&gt;
 &lt;span class="alert-title"&gt;ヒント&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;セッション内で動いているプロセスを止めたいときは、まず tmux に再接続して &lt;code&gt;Ctrl+c&lt;/code&gt; で停止するのが安全です。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h2 id="キー操作の最小セット"&gt;&lt;a href="#%e3%82%ad%e3%83%bc%e6%93%8d%e4%bd%9c%e3%81%ae%e6%9c%80%e5%b0%8f%e3%82%bb%e3%83%83%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;キー操作の最小セット
&lt;/h2&gt;&lt;p&gt;tmux は &lt;code&gt;Ctrl+b&lt;/code&gt; を押したあとに次のキーを押す操作が基本です（prefix キー）。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;コマンド&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;セッション切り離し&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;c&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;新しいウィンドウ作成&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;次のウィンドウへ移動&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;前のウィンドウへ移動&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;,&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ウィンドウ名を変更&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最初は &lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;d&lt;/code&gt; だけ覚えれば十分です。&lt;/p&gt;
&lt;h2 id="よくあるハマりどころ"&gt;&lt;a href="#%e3%82%88%e3%81%8f%e3%81%82%e3%82%8b%e3%83%8f%e3%83%9e%e3%82%8a%e3%81%a9%e3%81%93%e3%82%8d" class="header-anchor"&gt;&lt;/a&gt;よくあるハマりどころ
&lt;/h2&gt;&lt;h3 id="ssh-を切ったら止まった"&gt;&lt;a href="#ssh-%e3%82%92%e5%88%87%e3%81%a3%e3%81%9f%e3%82%89%e6%ad%a2%e3%81%be%e3%81%a3%e3%81%9f" class="header-anchor"&gt;&lt;/a&gt;SSH を切ったら止まった
&lt;/h3&gt;&lt;p&gt;tmux の中で起動せず、通常シェルで起動している可能性があります。&lt;br&gt;
&lt;code&gt;tmux attach -t app&lt;/code&gt; で戻って、そこで起動し直してください。&lt;/p&gt;
&lt;h3 id="tmux-attach-でno-sessionsになる"&gt;&lt;a href="#tmux-attach-%e3%81%a7no-sessions%e3%81%ab%e3%81%aa%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;tmux attach&lt;/code&gt; で「no sessions」になる
&lt;/h3&gt;&lt;p&gt;セッションが存在しない状態です。新しく作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux new -s app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="セッション名を忘れる"&gt;&lt;a href="#%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e5%90%8d%e3%82%92%e5%bf%98%e3%82%8c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;セッション名を忘れる
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一覧を出して、その名前で attach すれば戻れます。&lt;/p&gt;</description></item><item><title>OCI の Ubuntu インスタンスの初期設定</title><link>https://blog.ponkotools.com/posts/2026/05/29/oci-ubuntu/</link><pubDate>Fri, 29 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/29/oci-ubuntu/</guid><description>&lt;h2 id="swap-の設定"&gt;&lt;a href="#swap-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;swap の設定
&lt;/h2&gt;&lt;p&gt;以下のように、Ubuntu のイメージにはスワップがありません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: &lt;span class="m"&gt;954&lt;/span&gt; &lt;span class="m"&gt;343&lt;/span&gt; &lt;span class="m"&gt;225&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;538&lt;/span&gt; &lt;span class="m"&gt;610&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2GB のスワップファイル（Swap）を追加します。&lt;br&gt;
すべてのコマンドは、管理者権限（&lt;code&gt;sudo&lt;/code&gt;）を付けてターミナルで実行します。&lt;/p&gt;
&lt;h3 id="1-スワップファイルの作成"&gt;&lt;a href="#1-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;1. スワップファイルの作成
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;dd&lt;/code&gt; または &lt;code&gt;fallocate&lt;/code&gt; コマンドで 2GB のファイルを作成します。ここでは確実かつ高速な &lt;code&gt;fallocate&lt;/code&gt; を使用します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo fallocate -l 2G /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="alert alert-warning"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;⚠️&lt;/span&gt;
 &lt;span class="alert-title"&gt;警告&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;もし「fallocate failed: Operation not supported」のようなエラーが出た場合は、以下の &lt;code&gt;dd&lt;/code&gt; コマンドを代わりに試してください。&lt;br&gt;
&lt;code&gt;sudo dd if=/dev/zero of=/swapfile bs=1M count=2048&lt;/code&gt;&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="2-適切な権限の設定"&gt;&lt;a href="#2-%e9%81%a9%e5%88%87%e3%81%aa%e6%a8%a9%e9%99%90%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;2. 適切な権限の設定
&lt;/h3&gt;&lt;p&gt;セキュリティのため、スワップファイルは root ユーザーのみが読み書きできるように権限を &lt;code&gt;600&lt;/code&gt; に制限します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;600&lt;/span&gt; /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-スワップ領域の初期化"&gt;&lt;a href="#3-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e9%a0%98%e5%9f%9f%e3%81%ae%e5%88%9d%e6%9c%9f%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;3. スワップ領域の初期化
&lt;/h3&gt;&lt;p&gt;作成したファイルをスワップ領域としてフォーマットします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkswap /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-スワップの有効化"&gt;&lt;a href="#4-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4. スワップの有効化
&lt;/h3&gt;&lt;p&gt;システムにスワップファイルを認識させ、有効化します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapon /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-設定の確認"&gt;&lt;a href="#5-%e8%a8%ad%e5%ae%9a%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;5. 設定の確認
&lt;/h3&gt;&lt;p&gt;スワップが正しく有効化されたか確認します。2GB（約 2.0GiB）のスワップが表示されていれば成功です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapon --show
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# または&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="6-再起動後も自動で有効化する設定"&gt;&lt;a href="#6-%e5%86%8d%e8%b5%b7%e5%8b%95%e5%be%8c%e3%82%82%e8%87%aa%e5%8b%95%e3%81%a7%e6%9c%89%e5%8a%b9%e5%8c%96%e3%81%99%e3%82%8b%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;6. 再起動後も自動で有効化する設定
&lt;/h3&gt;&lt;p&gt;上記の設定だけでは、インスタンスを再起動するとスワップが解除されてしまいます。再起動後も自動的に有効化されるよう、&lt;code&gt;/etc/fstab&lt;/code&gt; に追記します。&lt;/p&gt;
&lt;h4 id="6-1-fstab-のバックアップ推奨"&gt;&lt;a href="#6-1-fstab-%e3%81%ae%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97%e6%8e%a8%e5%a5%a8" class="header-anchor"&gt;&lt;/a&gt;6-1. fstab のバックアップ（推奨）
&lt;/h4&gt;&lt;p&gt;念のため、設定ファイルをバックアップしておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /etc/fstab /etc/fstab.bak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="6-2-設定の追記"&gt;&lt;a href="#6-2-%e8%a8%ad%e5%ae%9a%e3%81%ae%e8%bf%bd%e8%a8%98" class="header-anchor"&gt;&lt;/a&gt;6-2. 設定の追記
&lt;/h4&gt;&lt;p&gt;以下のコマンドを実行して、&lt;code&gt;/etc/fstab&lt;/code&gt; の末尾に設定を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/swapfile none swap sw 0 0&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="おまけカーネルパラメータの最適化推奨"&gt;&lt;a href="#%e3%81%8a%e3%81%be%e3%81%91%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf%e3%81%ae%e6%9c%80%e9%81%a9%e5%8c%96%e6%8e%a8%e5%a5%a8" class="header-anchor"&gt;&lt;/a&gt;【おまけ】カーネルパラメータの最適化（推奨）
&lt;/h3&gt;&lt;p&gt;Linux には、メモリがどれくらい減ったらスワップを開始するかを決める &lt;code&gt;swappiness&lt;/code&gt; という値があります。&lt;br&gt;
初期値は &lt;code&gt;60&lt;/code&gt; であることが多いですが、クラウド環境（特に SSD ストレージ）では **&lt;code&gt;10&lt;/code&gt;〜&lt;code&gt;20**&lt;/code&gt; 程度に下げて、できるだけ物理メモリを優先して使うように設定するのが一般的です。&lt;/p&gt;
&lt;h4 id="1-現在の-swappiness-を確認"&gt;&lt;a href="#1-%e7%8f%be%e5%9c%a8%e3%81%ae-swappiness-%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;1. 現在の swappiness を確認
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/sys/vm/swappiness
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-一時的に-10-に変更"&gt;&lt;a href="#2-%e4%b8%80%e6%99%82%e7%9a%84%e3%81%ab-10-%e3%81%ab%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;2. 一時的に &lt;code&gt;10&lt;/code&gt; に変更
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl vm.swappiness&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-永続的に反映"&gt;&lt;a href="#3-%e6%b0%b8%e7%b6%9a%e7%9a%84%e3%81%ab%e5%8f%8d%e6%98%a0" class="header-anchor"&gt;&lt;/a&gt;3. 永続的に反映
&lt;/h4&gt;&lt;p&gt;再起動後もこの設定を維持するため、&lt;code&gt;/etc/sysctl.conf&lt;/code&gt; の末尾に追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vm.swappiness=10&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;これで 2GB のスワップ設定はすべて完了です！&lt;/p&gt;
&lt;h2 id="タイムゾーンの変更"&gt;&lt;a href="#%e3%82%bf%e3%82%a4%e3%83%a0%e3%82%be%e3%83%bc%e3%83%b3%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;タイムゾーンの変更
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在のタイムゾーンを確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# JST に変更&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo timedatectl set-timezone Asia/Tokyo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変更されたことを確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nano-のインストール"&gt;&lt;a href="#nano-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;nano のインストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y nano
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-のインストール"&gt;&lt;a href="#git-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;git のインストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="glab-のインストールと認証"&gt;&lt;a href="#glab-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8%e8%aa%8d%e8%a8%bc" class="header-anchor"&gt;&lt;/a&gt;glab のインストールと認証
&lt;/h2&gt;&lt;p&gt;諸事情で GitHub ではなく GitLab を使っているので、glab をインストールします。&lt;/p&gt;
&lt;h3 id="1-ダウンロード"&gt;&lt;a href="#1-%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;1. ダウンロード
&lt;/h3&gt;&lt;p&gt;apt でインストールできるバージョンは古いので、公式リリースからダウンロードしてインストールします。&lt;/p&gt;
&lt;p&gt;詳細は以下を参照してください。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.ponkotools.com/posts/2026/05/10/glab/" target="_blank" rel="noopener"
 &gt;https://blog.ponkotools.com/posts/2026/05/10/glab/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-gitlab-でのアクセストークンpatの発行"&gt;&lt;a href="#2-gitlab-%e3%81%a7%e3%81%ae%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3pat%e3%81%ae%e7%99%ba%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;2. GitLab でのアクセストークン（PAT）の発行
&lt;/h3&gt;&lt;p&gt;CLI から GitLab にアクセスするために、事前にブラウザ側（GitLab のウェブ画面）で Personal Access Token（個人用アクセストークン） を発行しておく必要があります。&lt;br&gt;
WSL を使っているからか、web での認証ではうまくいきませんでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitLab にログインします（SaaS 版の gitlab.com または社内などのオンプレミス版）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;面左上の自分のアイコン ＞ Preferences（設定） ＞ 左メニューの Access Tokens の順に開きます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add new token をクリックし、以下のように入力します：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Token name: 任意の名前（例: oci-ubuntu-cli）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expiration date: 空欄（無期限）または任意の有効期限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scopes（権限）: CLI をフル活用するために、&lt;code&gt;api&lt;/code&gt; と &lt;code&gt;write_repository&lt;/code&gt;以下にチェックを入れます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create personal access token をクリックします。&lt;/p&gt;
&lt;p&gt;画面に一度だけトークン（glpat-xxxx&amp;hellip;）が表示されるので、必ずコピーして手元に控えておきます。（画面を閉じると二度と見られなくなります）&lt;/p&gt;
&lt;h3 id="3-cli-の認証設定ログイン"&gt;&lt;a href="#3-cli-%e3%81%ae%e8%aa%8d%e8%a8%bc%e8%a8%ad%e5%ae%9a%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;3. CLI の認証設定（ログイン）
&lt;/h3&gt;&lt;p&gt;OCI の Ubuntu ターミナルに戻り、以下のコマンドを実行して対話型セットアップを開始します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glab auth login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると、いくつか質問されるので以下のように回答していきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ What GitLab instance &lt;span class="k"&gt;do&lt;/span&gt; you want to sign in to?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ GitLab Self-Managed or GitLab Dedicated instance
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gitLab.com（本家）を使っている場合は、そのまま gitLab.com を選択して Enter。&lt;br&gt;
自社サーバーなどの場合は GitLab Self-Managed or GitLab Dedicated instance を選択し、その後 URL（例: &lt;a class="link" href="https://gitlab.example.com" target="_blank" rel="noopener"
 &gt;https://gitlab.example.com&lt;/a&gt;）を入力します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Signing into gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ How would you like to sign in?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Token を選択します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Signing into gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ What domains does this host use &lt;span class="k"&gt;for&lt;/span&gt; the container registry and image dependency proxy?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; gitlab.com,gitlab.com:443,registry.gitlab.com 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そのまま Enter を押します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The minimum required scopes are &lt;span class="s1"&gt;&amp;#39;api&amp;#39;&lt;/span&gt; and &lt;span class="s1"&gt;&amp;#39;write_repository&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generate a personal access token at https://gitlab.com/-/user_settings/personal_access_tokens?scopes&lt;span class="o"&gt;=&lt;/span&gt;api,write_repository
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Paste your authentication token:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先ほど GitLab 画面でコピーしたトークン（glpat-xxxx&amp;hellip;）を貼り付けて Enter を押します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Choose default Git protocol:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ SSH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; HTTPS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ HTTP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTTPS を選択します。&lt;/p&gt;
&lt;p&gt;セットアップが完了したら、以下のコマンドで無事にログインできているか確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glab auth status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ご自身のユーザー名や「Logged in to gitlab.com」といったステータスが表示されれば、GitLab CLI の設定はすべて完了です！&lt;/p&gt;
&lt;h2 id="tmux-のインストール"&gt;&lt;a href="#tmux-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;tmux のインストール
&lt;/h2&gt;&lt;p&gt;セッションが切れても実行中のプログラムが停止しないよう tmux を使うためにインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y tmux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-のインストール"&gt;&lt;a href="#docker-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;docker のインストール
&lt;/h2&gt;&lt;h3 id="1-インストール"&gt;&lt;a href="#1-%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;1. インストール
&lt;/h3&gt;&lt;p&gt;公式ドキュメントの Install using the apt repository に従って最新版の docker をインストールします。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-docker-の権限を設定-sudo-を不要にする"&gt;&lt;a href="#2-docker-%e3%81%ae%e6%a8%a9%e9%99%90%e3%82%92%e8%a8%ad%e5%ae%9a-sudo-%e3%82%92%e4%b8%8d%e8%a6%81%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. docker の権限を設定 (sudo を不要にする)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gpasswd -a &lt;span class="k"&gt;$(&lt;/span&gt;whoami&lt;span class="k"&gt;)&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chgrp docker /var/run/docker.sock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="不要なサービスの停止"&gt;&lt;a href="#%e4%b8%8d%e8%a6%81%e3%81%aa%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e5%81%9c%e6%ad%a2" class="header-anchor"&gt;&lt;/a&gt;不要なサービスの停止
&lt;/h2&gt;&lt;p&gt;参考: &lt;a class="link" href="https://qiita.com/ynott/items/4312cb34611d2e462779" target="_blank" rel="noopener"
 &gt;https://qiita.com/ynott/items/4312cb34611d2e462779&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;systemctl | grep running&lt;/code&gt; で稼働中のサービス一覧を出力し、そのうち不要なものを AI に尋ねた結果が以下です。&lt;/p&gt;
&lt;h3 id="確実に停止無効化して良いサービス"&gt;&lt;a href="#%e7%a2%ba%e5%ae%9f%e3%81%ab%e5%81%9c%e6%ad%a2%e7%84%a1%e5%8a%b9%e5%8c%96%e3%81%97%e3%81%a6%e8%89%af%e3%81%84%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9" class="header-anchor"&gt;&lt;/a&gt;確実に停止・無効化して良いサービス
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;サービス名&lt;/th&gt;
 &lt;th&gt;役割と停止して良い理由&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ModemManager.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;3G/4G/5G などのモバイルモデムを管理するサービス。クラウドのサーバーでモデムを使うことはないため、完全に不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fwupd.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;マザーボードやデバイスのファームウェアをアップデートするデーモン。仮想マシン（VM）のファームウェアは OCI 側が管理するため不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rpcbind.servicerpcbind.socket&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;NFSv3（ネットワークファイルシステム）などで使われる古いポートマップサービス。NFS でストレージをマウントする予定がなければ不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iscsid.serviceiscsid.socket&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;iSCSI ストレージに接続するためのクアドラント。OCI のブロック・ボリュームを iSCSI 経由で直接マウント（手動アタッチなど）していない限り、標準の準仮想化（Paravirtualized）アタッチであれば不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;udisks2.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;主にデスクトップ環境で USB メモリなどのディスクを自動認識・マウントするためのサービス。サーバー用途では不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;停止・無効化のコマンド例&lt;/strong&gt;&lt;br&gt;
単に stop するだけだと再起動時にまた動いてしまうので、disable &amp;ndash;now で自動起動の解除と停止を同時に行います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable --now ModemManager fwupd rpcbind rpcbind.socket iscsid iscsid.socket udisks2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="条件付きで停止削除できるサービス効果大"&gt;&lt;a href="#%e6%9d%a1%e4%bb%b6%e4%bb%98%e3%81%8d%e3%81%a7%e5%81%9c%e6%ad%a2%e5%89%8a%e9%99%a4%e3%81%a7%e3%81%8d%e3%82%8b%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e5%8a%b9%e6%9e%9c%e5%a4%a7" class="header-anchor"&gt;&lt;/a&gt;条件付きで停止・削除できるサービス（効果大）
&lt;/h3&gt;&lt;p&gt;環境によっては不要、あるいは別の手段に切り替えることで大幅に軽量化できる重要ポイントです。&lt;/p&gt;
&lt;h4 id="snapdservice--snaporacle-cloud-agent-メモリ節約効果大"&gt;&lt;a href="#snapdservice--snaporacle-cloud-agent-%e3%83%a1%e3%83%a2%e3%83%aa%e7%af%80%e7%b4%84%e5%8a%b9%e6%9e%9c%e5%a4%a7" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;snapd.service&lt;/code&gt; / &lt;code&gt;snap.oracle-cloud-agent...&lt;/code&gt; （メモリ節約効果：大）
&lt;/h4&gt;&lt;p&gt;Ubuntu のパッケージ管理システム「Snap」と、OCI の管理エージェントです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断基準&lt;/strong&gt;&lt;br&gt;
OCI のダッシュボードからインスタンスのメトリック（CPU使用率のグラフなど）を見たり、OS の診断機能を使ったりしない、かつ自分で snap コマンドを使ったアプリ（Nextcloud などの Snap版）を動かす予定がない場合。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解説&lt;/strong&gt;&lt;br&gt;
oracle-cloud-agent は便利ですが、メモリが 1GB 以下の環境ではかなりの重荷になります。これらを Snap ごと削除すると、数十MB〜100MB 以上のメモリが浮きます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完全に削除する場合のコマンド&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap remove oracle-cloud-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt purge snapd -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メモリ使用量の変化"&gt;&lt;a href="#%e3%83%a1%e3%83%a2%e3%83%aa%e4%bd%bf%e7%94%a8%e9%87%8f%e3%81%ae%e5%a4%89%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;メモリ使用量の変化
&lt;/h3&gt;&lt;p&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" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 954Mi 360Mi 72Mi 4.9Mi 677Mi 594Mi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 21Mi 2.0Gi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;サービス停止後&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 954Mi 299Mi 313Mi 4.9Mi 483Mi 655Mi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 10Mi 2.0Gi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>OCI Bastion 経由でプライベート・サブネット内のインスタンスに SSH で接続</title><link>https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/</link><pubDate>Tue, 26 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/</guid><description>&lt;p&gt;日本語では &lt;strong&gt;要塞&lt;/strong&gt; と訳されています。&lt;/p&gt;
&lt;p&gt;手元の PC からこの Bastion（踏み台の役割）を経由させることで、インスタンス自体にパブリックIPを一切持たせないまま、手元の PC のターミナルから直接 SSH 接続できるようになります。&lt;/p&gt;
&lt;p&gt;設定には、ネットワーク（VCN）の構築段階からいくつか重要なポイント（ルーターやセキュリティ・リストの設定など）があり、結構はまったのでメモとして残しておきます。&lt;/p&gt;
&lt;h2 id="仕組みとメリット"&gt;&lt;a href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%81%a8%e3%83%a1%e3%83%aa%e3%83%83%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;仕組みとメリット
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;完全無料で、自分で踏み台用のサーバー（EC2など）を1台管理・維持する必要がありません。&lt;/li&gt;
&lt;li&gt;接続が必要なときだけ、手元のPCから「3時間だけ有効な一時的な接続セッション（トンネル）」を発行して侵入します。時間が経てば自動で完全に閉じられるため、セキュリティが非常に強固です。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ホストPC: Ubuntu 22.04&lt;/li&gt;
&lt;li&gt;インスタンス: Oracle Linux 9&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;インスタンスが Oracle Linux の場合と、Ubuntu などの他の OS の場合とで方法が一部異なります。&lt;br&gt;
今回は Oracle Linux 9 の場合で、Ubuntu についてはまた別で書きます。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h2 id="step1-vcn-とサブネットの作成"&gt;&lt;a href="#step1-vcn-%e3%81%a8%e3%82%b5%e3%83%96%e3%83%8d%e3%83%83%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step1: VCN とサブネットの作成
&lt;/h2&gt;&lt;p&gt;まずは土台となる仮想クラウド・ネットワーク（VCN）を作成します。&lt;br&gt;
手動で細かく作ることもできますが、「VCNウィザード」を使うのが一番簡単で確実です。&lt;br&gt;
インターネットに出るための「インターネット・ゲートウェイ」だけでなく、プライベートVMがアップデート等で外と通信するための「NATゲートウェイ」や「サービス・ゲートウェイ」も自動で作成・紐付けされます。&lt;/p&gt;
&lt;p&gt;OCIコンソールメニューから 「ネットワーキング」 &amp;gt; 「仮想クラウド・ネットワーク」 に移動します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="535" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-1.webp" width="683"&gt;&lt;/p&gt;
&lt;p&gt;アクションから「VCNウィザードの起動」 をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="535" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-2.webp" width="683"&gt;&lt;/p&gt;
&lt;p&gt;「インターネット接続性を持つVCNの作成」 を選択し、「VCNウィザードの起動」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="420px" data-flex-grow="175" height="677" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-3_hu_eeb952604ff3b7e5.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-3.webp 1187w" width="1187"&gt;&lt;/p&gt;
&lt;p&gt;以下の情報を入力・確認して「次へ」進み、作成します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;VCN名&lt;/td&gt;
 &lt;td&gt;任意の名前（例: my-bastion-vcn）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;VCNの構成 CIDRブロック&lt;/td&gt;
 &lt;td&gt;10.0.0.0/16（デフォルトのままでOK）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;パブリック・サブネットのCIDR&lt;/td&gt;
 &lt;td&gt;10.0.0.0/24&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;プライベート・サブネットのCIDR&lt;/td&gt;
 &lt;td&gt;10.0.1.0/24&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="step2-インスタンスの作成"&gt;&lt;a href="#step2-%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step2: インスタンスの作成
&lt;/h2&gt;&lt;p&gt;次に、パブリックIPを持たない接続先のインスタンスを作成します。&lt;br&gt;
「コンピュート」 &amp;gt; 「インスタンス」 から 「インスタンスの作成」 をクリックします。&lt;br&gt;
インスタンスの作成については別記事でも書いているので詳細は割愛しますが、イメージは &lt;strong&gt;Oracle Linux 9&lt;/strong&gt; を選びます。&lt;/p&gt;
&lt;p&gt;そして、ネットワーキングセクションで以下を選択します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベート・サブネット（Step 1で作成したもの）を選択。&lt;/li&gt;
&lt;li&gt;「パブリックIPアドレスの割当て」 で 「パブリックIPなし」 を選択。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="270px" data-flex-grow="112" height="1047" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-1_hu_650111b0751cc4fc.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-1.webp 1178w" width="1178"&gt;&lt;/p&gt;
&lt;p&gt;SSHキーのセクションでは、ご自身のPCで作成した公開鍵（.pub）をアップロード、または新規で生成して秘密鍵を保存してください。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="679px" data-flex-grow="282" height="329" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-2_hu_9c0e80c630669994.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-2.webp 931w" width="931"&gt;&lt;/p&gt;
&lt;p&gt;設定したら「作成」をクリックします。&lt;/p&gt;
&lt;h2 id="stes3-bastion-プラグインの有効化-oracle-linux-の場合のみ"&gt;&lt;a href="#stes3-bastion-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96-oracle-linux-%e3%81%ae%e5%a0%b4%e5%90%88%e3%81%ae%e3%81%bf" class="header-anchor"&gt;&lt;/a&gt;Stes3: Bastion プラグインの有効化 (Oracle Linux の場合のみ)
&lt;/h2&gt;&lt;p&gt;作成したインスタンスの詳細画面に入り、管理タブの「Oracle Cloud エージェント」で要塞を探し、有効化します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="470px" data-flex-grow="196" height="709" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/03.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/03_hu_3bf5c1beaa28ef3d.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/03.webp 1391w" width="1391"&gt;&lt;/p&gt;
&lt;p&gt;要塞のステータスが停止済となります。&lt;br&gt;
OSの内部でプログラムのダウンロードや配置が行われており、ステータスが「実行中」になるまでには5分〜10分ほどかかることがあります。&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;ここで要塞を有効にしておかないと、後述の管理対象SSHセッションの作成で API エラーとなります。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h2 id="step4-bastionの作成"&gt;&lt;a href="#step4-bastion%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step4: Bastionの作成
&lt;/h2&gt;&lt;p&gt;「アイデンティティとセキュリティ」 &amp;gt; 「要塞」（Bastion）に移動します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="715px" data-flex-grow="298" height="560" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1_hu_982245cf6ad2724f.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1_hu_36b79f883301d695.webp 1600w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1.webp 1669w" width="1669"&gt;&lt;/p&gt;
&lt;p&gt;「要塞の作成」 をクリックし、以下のように設定します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;要塞名&lt;/td&gt;
 &lt;td&gt;任意の名前&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット仮想クラウド・ネットワーク&lt;/td&gt;
 &lt;td&gt;Step 1で作成したVCN&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット・サブネット&lt;/td&gt;
 &lt;td&gt;ターゲットVMがいる「プライベート・サブネット」 を選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CIDRブロックの許可リスト&lt;/td&gt;
 &lt;td&gt;0.0.0.0/0 （特定のIPだけに絞るとより安全です）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="435px" data-flex-grow="181" height="532" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-2_hu_e3bf1741c390b50c.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-2.webp 965w" width="965"&gt;&lt;/p&gt;
&lt;p&gt;「要塞の作成」をクリックします（アクティブになるまで数分かかります）。&lt;/p&gt;
&lt;h2 id="step5-セッションの作成"&gt;&lt;a href="#step5-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step5: セッションの作成
&lt;/h2&gt;&lt;p&gt;作成した Bastion の詳細画面に入り、「セッションの作成」 をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="322px" data-flex-grow="134" height="481" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-1.webp" width="646"&gt;&lt;/p&gt;
&lt;p&gt;以下のように設定します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション・タイプ&lt;/td&gt;
 &lt;td&gt;Oracle Linux の場合は &lt;strong&gt;管理対象SSHセッション&lt;/strong&gt; を選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ユーザー名&lt;/td&gt;
 &lt;td&gt;Oracle Linux の場合は &lt;code&gt;opc&lt;/code&gt; です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット・コンピュート・インスタンス&lt;/td&gt;
 &lt;td&gt;Step2 で作成したプライベートVMを選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSHキー&lt;/td&gt;
 &lt;td&gt;ご自身のPCにある SSH 公開鍵をアップロード or ペーストするか、新規に生成します。VM作成時に使ったものと同じ、またはペアになるものをアップロードしても OK です（後述）。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="295px" data-flex-grow="123" height="739" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-2_hu_bdf974789b8dc277.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-2.webp 911w" width="911"&gt;&lt;/p&gt;
&lt;p&gt;「セッションの作成」をクリックします。&lt;br&gt;
状態が作成中となり、しばらく経つとアクティブになります。&lt;/p&gt;
&lt;h2 id="step6-ssh接続の実行"&gt;&lt;a href="#step6-ssh%e6%8e%a5%e7%b6%9a%e3%81%ae%e5%ae%9f%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;Step6: SSH接続の実行
&lt;/h2&gt;&lt;p&gt;セッションが「アクティブ」になったら、いよいよ接続です。
作成したセッションの右側にある「3つの点」メニューから 「SSHコマンドのコピー」 をクリックします。&lt;/p&gt;
&lt;p&gt;コピーされるコマンドは以下のような形をしています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i &amp;lt;privateKey&amp;gt; -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i &amp;lt;privateKey&amp;gt; -W %h:%p -p 22 ocid1.bastionsession.oc1...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;privateKey&amp;gt;&lt;/code&gt; 2箇所ありますので、それぞれ VM インスタンス作成時の秘密鍵、Bastion セッション作成時の秘密鍵のパスに変更して実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/VM用の秘密鍵 -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/Bastion用の秘密鍵 -W %h:%p ...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;セッション作成時の SSH キーを VM 作成時と同じものにした場合は、2箇所とも同じ秘密鍵のパスを指定します。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;Linux のルールとして、秘密鍵の権限が緩いままだとSSH接続が拒否されてしまいます。この場合、以下のコマンドでパーミッションを変更します。&lt;br&gt;
&lt;code&gt;chmod 600 ssh-key-xxxx.key&lt;/code&gt;&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;p&gt;実行すると、Bastionを経由してパブリックIPのないプライベートVMに直接SSHログインが完了します。&lt;/p&gt;
&lt;h2 id="ssh-キーについての補足"&gt;&lt;a href="#ssh-%e3%82%ad%e3%83%bc%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e3%81%ae%e8%a3%9c%e8%b6%b3" class="header-anchor"&gt;&lt;/a&gt;SSH キーについての補足
&lt;/h2&gt;&lt;p&gt;セッション作成時のSSHキーはVM作成時と同じでも別のものでも大丈夫です。&lt;/p&gt;
&lt;p&gt;OCI の Bastion サービスは、接続時に「2枚の壁（認証）」を通過するイメージになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bastionセッション作成時のSSHキー（壁1：入口の鍵）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカルPCから、OCIのBastionサービス（要塞）に侵入するための鍵です。&lt;/li&gt;
&lt;li&gt;Bastionサービス自体が「あなたは本当にこのセッションを作った本人ですか？」を確かめるために使います。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;VM作成時のSSHキー（壁2：奥の部屋の鍵）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bastionを通り抜けたあと、ターゲットのプライベートVMにログインするための鍵です。&lt;/li&gt;
&lt;li&gt;VM（OS）側が「あなたはログインを許可されたユーザーですか？」を確かめるために使います。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このように鍵の役割が独立しています。&lt;br&gt;
ただ、「同じ鍵」を使った場合と「別の鍵」を使った場合で、最後に実行するSSHコマンドの書き換え方が少し変わります。&lt;/p&gt;
&lt;h3 id="-同じ鍵を使った場合一番シンプル"&gt;&lt;a href="#-%e5%90%8c%e3%81%98%e9%8d%b5%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e5%a0%b4%e5%90%88%e4%b8%80%e7%95%aa%e3%82%b7%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;① 同じ鍵を使った場合（一番シンプル）
&lt;/h3&gt;&lt;p&gt;すべて1つの秘密鍵（例: id_rsa）で開くので、コピーしたコマンド内の2箇所の &lt;code&gt;&amp;lt;privateKey&amp;gt;&lt;/code&gt; に同じ秘密鍵のパスを指定すればOKです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/id_rsa -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/id_rsa -W %h:%p ...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="-別の鍵を使った場合それぞれ指定が必要"&gt;&lt;a href="#-%e5%88%a5%e3%81%ae%e9%8d%b5%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e5%a0%b4%e5%90%88%e3%81%9d%e3%82%8c%e3%81%9e%e3%82%8c%e6%8c%87%e5%ae%9a%e3%81%8c%e5%bf%85%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;② 別の鍵を使った場合（それぞれ指定が必要）
&lt;/h3&gt;&lt;p&gt;コマンドの「前半」と「後半」で、それぞれの秘密鍵を指定する必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前半の -i: VM作成時の秘密鍵を指定&lt;/li&gt;
&lt;li&gt;中間の ProxyCommand内の -i: Bastionセッション作成時の秘密鍵を指定&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/VM用の秘密鍵 -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/Bastion用の秘密鍵 -W %h:%p ...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;管理やコマンドの書き換えをシンプルにしたい場合は、「同じ鍵（ペア）」を使ってしまうのが一番迷わなくてラクです。&lt;/p&gt;
&lt;h3 id="セキュリティ的な問題は"&gt;&lt;a href="#%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3%e7%9a%84%e3%81%aa%e5%95%8f%e9%a1%8c%e3%81%af" class="header-anchor"&gt;&lt;/a&gt;セキュリティ的な問題は？
&lt;/h3&gt;&lt;p&gt;個人開発や一般的な社内検証環境レベルであれば、同じ鍵を使い回しても実用上のセキュリティリスクは非常に低い（実質的に問題ない）と言えます。&lt;/p&gt;
&lt;p&gt;ただし、厳格なエンタープライズ（企業）の運用基準や、セキュリティの理想論（ベストプラクティス）の観点から見ると、いくつか「知っておくべきリスクと理由」があります。&lt;br&gt;
なぜ分けるのが理想とされるのか、その理由は以下です。&lt;/p&gt;
&lt;h4 id="1-鍵が漏洩した際の影響範囲爆発半径が広がる"&gt;&lt;a href="#1-%e9%8d%b5%e3%81%8c%e6%bc%8f%e6%b4%a9%e3%81%97%e3%81%9f%e9%9a%9b%e3%81%ae%e5%bd%b1%e9%9f%bf%e7%af%84%e5%9b%b2%e7%88%86%e7%99%ba%e5%8d%8a%e5%be%84%e3%81%8c%e5%ba%83%e3%81%8c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. 鍵が漏洩した際の影響範囲（爆発半径）が広がる
&lt;/h4&gt;&lt;p&gt;これが最も大きな理由です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;鍵を分けている場合：&lt;/strong&gt;
もしBastion用の鍵が外部に漏れても、攻撃者はBastionの入り口までしか来られません。ターゲットVMの鍵が無事なら、中のデータにはアクセスできません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同じ鍵を使っている場合：&lt;/strong&gt;
その1つの秘密鍵が漏洩した瞬間、Bastionの突破からターゲットVMへのログインまで、すべての防御壁が同時に崩壊します。&lt;/p&gt;
&lt;p&gt;ひとつの鍵にすべての権限を持たせることは、セキュリティの世界で嫌がられる「単一障害点（Single Point of Failure）」を作ることになってしまいます。&lt;/p&gt;
&lt;h4 id="2-誰がどこにアクセスしたかの監査ログが曖昧になる"&gt;&lt;a href="#2-%e8%aa%b0%e3%81%8c%e3%81%a9%e3%81%93%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%97%e3%81%9f%e3%81%8b%e3%81%ae%e7%9b%a3%e6%9f%bb%e3%83%ad%e3%82%b0%e3%81%8c%e6%9b%96%e6%98%a7%e3%81%ab%e3%81%aa%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. 「誰が・どこに」アクセスしたかの監査（ログ）が曖昧になる
&lt;/h4&gt;&lt;p&gt;本番環境やチーム開発において重要な視点です。&lt;/p&gt;
&lt;p&gt;Bastion（要塞）の本来の目的は、「いつ、誰が、どのサーバーに入ったか」を厳密に記録・コントロールすることです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bastion用の鍵： 「あなたがクラウド環境のネットワークに入った」ことを証明する&lt;/li&gt;
&lt;li&gt;VM用の鍵： 「あなたが特定のサーバーの opc ユーザーとしてログインした」ことを証明する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらを同じ鍵にしてしまうと、鍵の管理者が同一人物である前提になってしまい、「Bastionを通過した人と、実際にVMを操作した人が本当に同一人物か？」という厳密なトレース（監査ログの信頼性）が担保しにくくなります。&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/" target="_blank" rel="noopener"
 &gt;https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techblog.ap-com.co.jp/entry/2025/03/19/132232" target="_blank" rel="noopener"
 &gt;https://techblog.ap-com.co.jp/entry/2025/03/19/132232&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://oci-tech.jp/connect-private-compute-via-oci-bastion/" target="_blank" rel="noopener"
 &gt;https://oci-tech.jp/connect-private-compute-via-oci-bastion/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/rieto/items/3fcdd5d5157ecb406719" target="_blank" rel="noopener"
 &gt;https://qiita.com/rieto/items/3fcdd5d5157ecb406719&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OCI (Oracle Cloud Infrastructure) で VM インスタンスを作成する</title><link>https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/</link><pubDate>Thu, 21 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/</guid><description>&lt;h2 id="oci-oracle-cloud-infrastructure"&gt;&lt;a href="#oci-oracle-cloud-infrastructure" class="header-anchor"&gt;&lt;/a&gt;OCI (Oracle Cloud Infrastructure)
&lt;/h2&gt;&lt;p&gt;OCI には &lt;strong&gt;Always Free（永久無料枠）&lt;/strong&gt; という非常に強力な特典があり、&lt;strong&gt;4 OCPU / 24 GB メモリ&lt;/strong&gt; という、他社クラウドであれば有料級のハイスペックな Arm サーバー（Ampere A1）を無料で 24時間365日動かすことができます。&lt;/p&gt;
&lt;h3 id="oci-のコンピュート環境vm-とコンテナインスタンスの違い"&gt;&lt;a href="#oci-%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%83%88%e7%92%b0%e5%a2%83vm-%e3%81%a8%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e9%81%95%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;OCI のコンピュート環境：VM とコンテナインスタンスの違い
&lt;/h3&gt;&lt;p&gt;OCI でアプリケーションを動かすアプローチとして、主に &lt;strong&gt;「VM Compute（仮想マシン）」&lt;/strong&gt; と &lt;strong&gt;「コンテナインスタンス（Container Instances）」&lt;/strong&gt; の 2つがあります。&lt;/p&gt;
&lt;p&gt;どちらも Docker コンテナを動かせますが、その管理レイヤーと仕様には明確な違いがあります。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;比較項目&lt;/th&gt;
 &lt;th style="text-align: left"&gt;VM Compute (仮想マシン)&lt;/th&gt;
 &lt;th style="text-align: left"&gt;コンテナインスタンス&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;管理の単位&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;OS（Linux / Windows）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;コンテナ（Dockerイメージなど）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;インフラ管理&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;必要&lt;/strong&gt;（OSアップデート、SSH管理）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;不要&lt;/strong&gt;（サーバーレス。オラクルが基盤を管理）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;起動スピード&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;数分（OSのブート時間必要）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;数秒&lt;/strong&gt;（コンテナの起動のみ）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;永続ストレージ&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ブロック・ボリュームを自由に追加・マウント可能&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エフェメラル（一時的。再起動でデータ消滅）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;永久無料枠&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;あり（4 OCPU / 24 GBメモリまで無料）&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;なし（秒単位の従量課金）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="どちらを選ぶべきか"&gt;&lt;a href="#%e3%81%a9%e3%81%a1%e3%82%89%e3%82%92%e9%81%b8%e3%81%b6%e3%81%b9%e3%81%8d%e3%81%8b" class="header-anchor"&gt;&lt;/a&gt;どちらを選ぶべきか？
&lt;/h3&gt;&lt;p&gt;コンテナインスタンスはサーバーレスで運用が手軽ですが、永久無料枠（Always Free）の対象外となります。また、コンテナの再起動によって内部のデータが消去される特性を持ちます。&lt;/p&gt;
&lt;p&gt;そのため、&lt;strong&gt;「24時間いつでも無料で動かし続けたい」「生成されるログやデータをローカルディスクに安全に保持（永続化）したい」という場合は、VM Compute を選択するのが最適&lt;/strong&gt;です。&lt;/p&gt;
&lt;h2 id="oci-への登録"&gt;&lt;a href="#oci-%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;OCI への登録
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.oracle.com/jp/cloud/free/" target="_blank" rel="noopener"
 &gt;https://www.oracle.com/jp/cloud/free/&lt;/a&gt; にアクセスして「無料で始める」をクリックして各種情報を入力します。&lt;br&gt;
ちょっとした注意事項として、住所は英語で入力する必要があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tzang.net/ja/oci-apply/" target="_blank" rel="noopener"
 &gt;https://tzang.net/ja/oci-apply/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techblog.ap-com.co.jp/entry/2024/09/06/093000" target="_blank" rel="noopener"
 &gt;https://techblog.ap-com.co.jp/entry/2024/09/06/093000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kamimachi06/items/c72ac35600c0597d4524" target="_blank" rel="noopener"
 &gt;https://qiita.com/kamimachi06/items/c72ac35600c0597d4524&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インスタンスの作成"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;インスタンスの作成
&lt;/h2&gt;&lt;p&gt;ホームより &lt;strong&gt;インスタンス&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="607px" data-flex-grow="253" height="472" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01_hu_e693b17eecf5f133.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01.webp 1195w" width="1195"&gt;&lt;/p&gt;
&lt;p&gt;ホームにない場合は、左上のメニューから &lt;strong&gt;コンピュート &amp;gt; インスタンス&lt;/strong&gt; でも OK です。&lt;/p&gt;
&lt;p&gt;続いて &lt;strong&gt;インスタンスの作成&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="599" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02_hu_2a5b52be3f71e459.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02.webp 1005w" width="1005"&gt;&lt;/p&gt;
&lt;h3 id="基本情報"&gt;&lt;a href="#%e5%9f%ba%e6%9c%ac%e6%83%85%e5%a0%b1" class="header-anchor"&gt;&lt;/a&gt;基本情報
&lt;/h3&gt;&lt;h4 id="イメージ"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;イメージ
&lt;/h4&gt;&lt;p&gt;デフォルトでは Oracle linux になっています。&lt;br&gt;
Oracle Linux は Red Hat Enterprise Linux（RHEL）をベースにした OS だそうです。&lt;/p&gt;
&lt;p&gt;セキュリティの「保護インスタンス」は、仮想マシン（VM）の乗っ取りや、悪意のあるプログラムによるOS改ざんを防ぐための「セキュリティ強化機能が有効になっている状態」を指すそうですので、保護インスタンスになっているものを選択しておいたほうが良さそうです。&lt;/p&gt;
&lt;h4 id="シェイプ"&gt;&lt;a href="#%e3%82%b7%e3%82%a7%e3%82%a4%e3%83%97" class="header-anchor"&gt;&lt;/a&gt;シェイプ
&lt;/h4&gt;&lt;p&gt;Always Free 対象のものとして以下の２つがあります。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;Ampere (A1.Flex)&lt;/th&gt;
 &lt;th&gt;AMD (E2.1.Micro)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;最大リソース&lt;/td&gt;
 &lt;td&gt;4 OCPU / 24 GB（分配可能）&lt;/td&gt;
 &lt;td&gt;1 OCPU / 1 GB × 2台&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;アーキテクチャ&lt;/td&gt;
 &lt;td&gt;Arm (aarch64)&lt;/td&gt;
 &lt;td&gt;x86_64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;主な用途&lt;/td&gt;
 &lt;td&gt;開発環境、Docker、高負荷な処理、Webサーバー&lt;/td&gt;
 &lt;td&gt;軽量なスクリプト実行、VPNサーバー、検証用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;VM.Standard.A1.Flex&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;現在OCIで提供されている中で最もハイスペックかつ使い勝手の良い無料枠インスタンスです。&lt;br&gt;
&lt;strong&gt;Ampere&lt;/strong&gt; を選択し、&lt;strong&gt;VM.Standard.A1.Flex&lt;/strong&gt; をチェックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="467px" data-flex-grow="194" height="666" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1_hu_f43726e3dff82e49.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1.webp 1296w" width="1296"&gt;&lt;/p&gt;
&lt;p&gt;シェイプ名横の ▼ を押すと CPU と RAM の設定ができます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="455px" data-flex-grow="189" height="570" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3_hu_cb161b4a08e3cb5b.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3.webp 1082w" width="1082"&gt;&lt;/p&gt;
&lt;p&gt;「4 OCPU / 24 GB」までは無料で使えるらしいです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VM.Standard.E2.1.Micro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ampere A1 は人気のため、空きがなくて作成できないことが多いです。&lt;br&gt;
また、システムが Arm（Aarch64）アーキテクチャに対応しておらず、どうしても従来の x86_64 環境が必要な場合もあったりします。&lt;br&gt;
そのような場合はこちらを選びます。&lt;br&gt;
ただし、スペックは Ampere A1 に比べて大幅に低くなります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;専門と前世代&lt;/strong&gt; を選択し、&lt;strong&gt;VM.Standard.E2.1.Micro&lt;/strong&gt; をチェックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="411px" data-flex-grow="171" height="762" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2_hu_948bb4cca6084069.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2.webp 1306w" width="1306"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;上記のうち好きな方を選び、次へを押します。&lt;/p&gt;
&lt;h3 id="セキュリティ"&gt;&lt;a href="#%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3" class="header-anchor"&gt;&lt;/a&gt;セキュリティ
&lt;/h3&gt;&lt;p&gt;保護インスタンスの設定ができますが、予期せぬエラーや「動かない」トラブルの原因になりやすいそうなので、今回は OFF のままとしました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="506px" data-flex-grow="211" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05_hu_5e0e0a49f3828ea0.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05.webp 1157w" width="1157"&gt;&lt;/p&gt;
&lt;h3 id="ネットワーキング"&gt;&lt;a href="#%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%ad%e3%83%b3%e3%82%b0" class="header-anchor"&gt;&lt;/a&gt;ネットワーキング
&lt;/h3&gt;&lt;h4 id="プライマリvnic"&gt;&lt;a href="#%e3%83%97%e3%83%a9%e3%82%a4%e3%83%9e%e3%83%aavnic" class="header-anchor"&gt;&lt;/a&gt;プライマリVNIC
&lt;/h4&gt;&lt;p&gt;初めて OCI を使うので、まだ「既存のネットワーク」が存在しないため、新しく &lt;strong&gt;新規仮想クラウド・ネットワーク&lt;/strong&gt; を選択します。
サブネットも自動的に &lt;strong&gt;新規パブリック・サブネットの作成&lt;/strong&gt; に切り替わり、名前などが自動入力されます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="392px" data-flex-grow="163" height="708" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1_hu_8ff9b9a5a1b5b81a.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1.webp 1158w" width="1158"&gt;&lt;/p&gt;
&lt;p&gt;２回目は既存のネットワークを選択すれば OK です。&lt;/p&gt;
&lt;h4 id="パブリックipv4アドレス割当て"&gt;&lt;a href="#%e3%83%91%e3%83%96%e3%83%aa%e3%83%83%e3%82%afipv4%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e5%89%b2%e5%bd%93%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;パブリックIPv4アドレス割当て
&lt;/h4&gt;&lt;p&gt;今回は外部からの通信（インバウンド）を受ける必要はないため、 &lt;strong&gt;パブリックIPv4アドレスの割当て&lt;/strong&gt; は &lt;strong&gt;OFF&lt;/strong&gt; にしておきました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="879" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2_hu_2a95284a5cafcb5f.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2.webp 1162w" width="1162"&gt;&lt;/p&gt;
&lt;h4 id="sshキーの追加"&gt;&lt;a href="#ssh%e3%82%ad%e3%83%bc%e3%81%ae%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;SSHキーの追加
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;キー・ペアを自動で生成&lt;/strong&gt; を選択し、&lt;strong&gt;秘密キーのダウンロード&lt;/strong&gt; を押して秘密鍵をダウンロードしておきます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="714px" data-flex-grow="297" height="330" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3_hu_65217d3dc1d492e2.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3.webp 982w" width="982"&gt;&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;SSH キーなしを選択すると、後述するように Cloud Shell からもインスタンスにアクセスできませんでした。
外部から SSH でアクセスする予定がなくても SSH キーは作成しておかないといけないようです。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="ストレージ"&gt;&lt;a href="#%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;ストレージ
&lt;/h3&gt;&lt;p&gt;ここは全てデフォルトのままとしました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="449px" data-flex-grow="187" height="631" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07_hu_950aba20468a9cd0.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07.webp 1182w" width="1182"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「カスタム・ブート・ボリューム・サイズ&amp;hellip;」について&lt;/strong&gt;
チェックがOFF（デフォルト）の場合、標準サイズである 46.6 GB のディスクが自動で割り当てられます。&lt;br&gt;
OCIの無料枠では最大で合計200GBまでストレージが使え、ここにチェックを入れて数値を 100 や 200 に増やすことも可能です。&lt;br&gt;
ただ、後からでもディスクサイズは簡単に拡張できるため、最初はデフォルトのままで様子見するのが安全です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「転送中暗号化の使用」について&lt;/strong&gt;
デフォルトでONになっていますが、これは「仮想マシンとストレージの間の通信を暗号化して盗聴を防ぐ」というインフラ側の高度な保護機能です。&lt;br&gt;
パフォーマンスへの影響も無視できるレベルですので、ON（今の状態）のままにしておきましょう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「自分が管理するキーでこのボリュームを暗号化」について&lt;/strong&gt;
チェックがOFF（デフォルト）の場合、Oracleが管理する標準の暗号鍵で自動的にディスクが暗号化されます。&lt;br&gt;
個人開発で自前の鍵管理（Vault/KMSなど）を入れると管理コストが増えて複雑になるため、OFFのままで問題ありません。&lt;/p&gt;
&lt;h3 id="作成"&gt;&lt;a href="#%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;作成
&lt;/h3&gt;&lt;p&gt;次へ進み、&lt;strong&gt;「作成」&lt;/strong&gt; を押すとインスタンスが作成されます。&lt;br&gt;
しばらく待つとインスタンスが作成されます（ステータス表示が &lt;strong&gt;実行中&lt;/strong&gt; に変わります）。&lt;/p&gt;
&lt;h3 id="api-エラーが発生した場合"&gt;&lt;a href="#api-%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e7%99%ba%e7%94%9f%e3%81%97%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;API エラーが発生した場合
&lt;/h3&gt;&lt;p&gt;これは設定の間違いではなく、「現在、Oracleのデータセンター側で、無料枠用のArmサーバー（Ampere）の在庫が一時的に切れている」 という、OCIの無料枠で最も頻繁に発生する有名な現象です。&lt;br&gt;
世界中で無料枠のAmpereは非常に人気があるため、椅子取りゲームのようになっています。&lt;/p&gt;
&lt;p&gt;解決策は以下です。&lt;/p&gt;
&lt;h4 id="1x86のamd枠に切り替えて即時作成する確実おすすめ"&gt;&lt;a href="#1x86%e3%81%aeamd%e6%9e%a0%e3%81%ab%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%81%a6%e5%8d%b3%e6%99%82%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e7%a2%ba%e5%ae%9f%e3%81%8a%e3%81%99%e3%81%99%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;1：x86の「AMD枠」に切り替えて即時作成する（確実・おすすめ）
&lt;/h4&gt;&lt;p&gt;Arm（Ampere）の在庫がなくても、もう1つの無料枠であるAMD（VM.Standard.E2.1.Micro）であれば、在庫に余裕がありすんなり作成できるケースが非常に多いです。&lt;/p&gt;
&lt;h4 id="2フォルトドメインを変更して再トライする"&gt;&lt;a href="#2%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%97%e3%81%a6%e5%86%8d%e3%83%88%e3%83%a9%e3%82%a4%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2：「フォルト・ドメイン」を変更して再トライする
&lt;/h4&gt;&lt;p&gt;同じAmpere（Arm）のまま、サーバーが置かれる物理的な区画（フォルト・ドメイン）を変更することで、運よく在庫が引っかかることがあります。&lt;/p&gt;
&lt;h4 id="3数日数週間時間を変えてクリックし続ける"&gt;&lt;a href="#3%e6%95%b0%e6%97%a5%e6%95%b0%e9%80%b1%e9%96%93%e6%99%82%e9%96%93%e3%82%92%e5%a4%89%e3%81%88%e3%81%a6%e3%82%af%e3%83%aa%e3%83%83%e3%82%af%e3%81%97%e7%b6%9a%e3%81%91%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;3：数日〜数週間、時間を変えてクリックし続ける
&lt;/h4&gt;&lt;p&gt;どうしても強力な「Arm（4 OCPU / 24 GBを狙いたいなど）」が良い場合、誰かがインスタンスを削除して在庫が空くのを待つことになります。&lt;/p&gt;
&lt;h2 id="インスタンスの起動"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;インスタンスの起動
&lt;/h2&gt;&lt;p&gt;コンピュートの画面から &lt;strong&gt;インスタンス&lt;/strong&gt; を選択し、該当のインスタンスをクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="591px" data-flex-grow="246" height="438" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1_hu_4c5916a94a5f5af9.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1.webp 1080w" width="1080"&gt;&lt;/p&gt;
&lt;p&gt;右上から起動を押します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="593px" data-flex-grow="247" height="327" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2_hu_341b4d1921dff504.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2.webp 808w" width="808"&gt;&lt;/p&gt;
&lt;p&gt;これでしばらく待つとインスタンスが起動します。&lt;/p&gt;
&lt;h2 id="インスタンスへ接続cloud-shell-で接続"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%b8%e6%8e%a5%e7%b6%9acloud-shell-%e3%81%a7%e6%8e%a5%e7%b6%9a" class="header-anchor"&gt;&lt;/a&gt;インスタンスへ接続（Cloud Shell で接続）
&lt;/h2&gt;&lt;p&gt;OCI 上から Cloud Shell でインスタンスに接続してみます。&lt;/p&gt;
&lt;h3 id="cloud-shell-の起動"&gt;&lt;a href="#cloud-shell-%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;Cloud Shell の起動
&lt;/h3&gt;&lt;p&gt;画面右上の &lt;strong&gt;開発者ツール&lt;/strong&gt; をクリックし、&lt;strong&gt;Cloud Shell&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="483px" data-flex-grow="201" height="141" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-1.webp" width="284"&gt;&lt;/p&gt;
&lt;p&gt;画面下に端末が表示されますが、まだインスタンスの中には入っていません。&lt;br&gt;
Cloud Shell が単体で起動しただけです。&lt;/p&gt;
&lt;h3 id="ネットワークの変更"&gt;&lt;a href="#%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;ネットワークの変更
&lt;/h3&gt;&lt;p&gt;端末上部の「ネットワーク：パブリック」と表示されたプルダウンから「エフェメラル・プライベートネット・・・」を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="192" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-2.webp" width="322"&gt;&lt;/p&gt;
&lt;p&gt;インスタンス作成時に作成した VCN とサブネットを選択し、&lt;strong&gt;アクティブなネットワークとして使用&lt;/strong&gt; を押します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="273px" data-flex-grow="114" height="538" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-3.webp" width="614"&gt;&lt;/p&gt;
&lt;h3 id="秘密鍵ファイルのアップロード"&gt;&lt;a href="#%e7%a7%98%e5%af%86%e9%8d%b5%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;秘密鍵ファイルのアップロード
&lt;/h3&gt;&lt;p&gt;先程ダウンロードした秘密鍵ファイルを端末上にドラッグ＆ドロップしてアップロードします。&lt;/p&gt;
&lt;p&gt;Linux のルールとして、秘密鍵の権限が緩いままだとSSH接続が拒否されてしまうため、以下のコマンドでパーミッションを変更します。
（※ファイル名はご自身のものに書き換えてください）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod 600 ssh-key-xxxx.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ssh-コマンドでログインする"&gt;&lt;a href="#ssh-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;SSH コマンドでログインする
&lt;/h3&gt;&lt;p&gt;以上で準備は完了です。&lt;br&gt;
以下のコマンドで Cloud Shell インスタンスへと接続します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ssh-key-xxxx.key &amp;lt;username&amp;gt;@&amp;lt;private_ip_address&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; は、インスタンスのデフォルトのユーザー名です。&lt;br&gt;
Oracle Linux および Redhat Enterprise Linux 互換イメージの場合、デフォルトのユーザー名は &lt;code&gt;opc&lt;/code&gt;、Ubuntu イメージの場合、デフォルトのユーザー名は &lt;code&gt;ubuntu&lt;/code&gt; だそうです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;private_ip_address&amp;gt;&lt;/code&gt; は接続先インスタンスのプライベートIPアドレスです。&lt;br&gt;
&lt;strong&gt;コンピュート &amp;gt; インスタンス&lt;/strong&gt; で確認できます。&lt;code&gt;10.0.x.x&lt;/code&gt; のような数字を入れてください。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px"&gt;&lt;/p&gt;
&lt;p&gt;コマンド入力後、&lt;code&gt;Are you sure you want to continue connecting (yes/no)?&lt;/code&gt; と聞かれたら、 &lt;code&gt;yes&lt;/code&gt; と入力してEnterを押します。&lt;/p&gt;
&lt;p&gt;無事にプロンプトが &lt;code&gt;&amp;lt;username&amp;gt;@instance-xxxx:~$&lt;/code&gt; に切り替われば、インスタンスに接続できています。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;とりあえずはここまで。&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.clinks.jp/column/oci/1983/" target="_blank" rel="noopener"
 &gt;https://www.clinks.jp/column/oci/1983/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance/" target="_blank" rel="noopener"
 &gt;https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.reqtc.com/blog/oci-ssh.html" target="_blank" rel="noopener"
 &gt;https://www.reqtc.com/blog/oci-ssh.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu のユーザー名を変更する</title><link>https://blog.ponkotools.com/posts/2024/04/02/ubuntu/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2024/04/02/ubuntu/</guid><description>&lt;p&gt;Ubuntu 20.04 で確認しました。&lt;/p&gt;
&lt;h2 id="新しいユーザーを作成する"&gt;&lt;a href="#%e6%96%b0%e3%81%97%e3%81%84%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;新しいユーザーを作成する
&lt;/h2&gt;&lt;p&gt;ログインユーザー自身のユーザー名は変更できないので、一時的に管理者権限を持ったユーザーを作成します。&lt;/p&gt;
&lt;p&gt;Ubuntu の場合は以下のように GUI で簡単に追加できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定 &amp;gt; ユーザー &amp;gt; ユーザーを追加&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ユーザー名とグループ名の変更"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e5%90%8d%e3%81%a8%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e5%90%8d%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;ユーザー名とグループ名の変更
&lt;/h2&gt;&lt;p&gt;作成した新しいユーザーでログインして行います。&lt;/p&gt;
&lt;h3 id="ユーザー名の変更"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e5%90%8d%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;ユーザー名の変更
&lt;/h3&gt;&lt;p&gt;以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo usermod -l new_username -d /home/new_username -m old_username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、&lt;code&gt;usermod&lt;/code&gt; コマンドの &lt;code&gt;-g&lt;/code&gt; オプションでグループ名も一緒に変更できるような記述も見つけましたが、私の場合、&lt;code&gt;usermod: グループ 'new_username' は存在しません&lt;/code&gt; のエラーが表示されてできなかったため、ユーザー名とグループ名の変更を分けて行いました。&lt;/p&gt;
&lt;h3 id="グループ名の変更"&gt;&lt;a href="#%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e5%90%8d%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;グループ名の変更
&lt;/h3&gt;&lt;p&gt;以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo groupmod -n new_username old_username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上で、変更後のユーザーでログインして問題なく使えることを確認しました。&lt;br&gt;
ただ、唯一、ユーザーのアイコン画像だけがクリアされていました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/creationup2u/articles/1d863f40fec16a" target="_blank" rel="noopener"
 &gt;https://zenn.dev/creationup2u/articles/1d863f40fec16a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://minory.org/linux-usermod.html" target="_blank" rel="noopener"
 &gt;https://minory.org/linux-usermod.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Windows と Ubuntu でマウスとキーボードを共有する</title><link>https://blog.ponkotools.com/posts/2024/01/26/barrier/</link><pubDate>Fri, 26 Jan 2024 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2024/01/26/barrier/</guid><description>&lt;p&gt;Barrier というソフトを使って、マウスとキーボードを共有します。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Windows 10
&lt;ul&gt;
&lt;li&gt;barrier 2.4.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ubuntu 20.04
&lt;ul&gt;
&lt;li&gt;barrier 2.3.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Barrier を使う場合、どちらかをサーバーとして設定する必要がありますが、今回は Windows をサーバーとしました。&lt;/p&gt;
&lt;h2 id="windows-側"&gt;&lt;a href="#windows-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Windows 側
&lt;/h2&gt;&lt;h3 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/debauchee/barrier/releases" target="_blank" rel="noopener"
 &gt;GitHub の Releases&lt;/a&gt; から最新の exe をダウンロードしてインストールします。&lt;br&gt;
Bonjourというソフトをインストールするかどうか聞かれますが、インストールしませんでした。&lt;/p&gt;
&lt;h3 id="設定"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;設定
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;「サーバー」にチェックを入れる&lt;/li&gt;
&lt;li&gt;「サーバーの構成設定」を選択し、「モニタの結びつき」で任意のマスをクリックして、クライアント側のモニターを追加する
&lt;ul&gt;
&lt;li&gt;モニター名を後述のクライアント側の名前に合わせて入力する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メニューバーから、「Barrier &amp;gt; 設定の変更」を選択し、「SSL を使用」のチェックを外す。&lt;/li&gt;
&lt;li&gt;開始を押す&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ubuntu-側"&gt;&lt;a href="#ubuntu-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Ubuntu 側
&lt;/h2&gt;&lt;h3 id="インストール-1"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab-1" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h3&gt;&lt;p&gt;以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install barrier
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定-1"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a-1" class="header-anchor"&gt;&lt;/a&gt;設定
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;「クライアント」にチェックを入れる&lt;/li&gt;
&lt;li&gt;「サーバーIP」にIPアドレスを入力する&lt;/li&gt;
&lt;li&gt;メニューバーから、「Barrier &amp;gt; Change Settings」を選択し、「Enable SSL」のチェックを外す。&lt;/li&gt;
&lt;li&gt;開始を押す&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="追加の設定"&gt;&lt;a href="#%e8%bf%bd%e5%8a%a0%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;追加の設定
&lt;/h2&gt;&lt;p&gt;ログイン画面（ロック画面）になるとマウスとキーボードが効かなくなるので、以下の設定も行いました。&lt;/p&gt;
&lt;h3 id="windows-サーバー-側"&gt;&lt;a href="#windows-%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Windows (サーバー) 側
&lt;/h3&gt;&lt;p&gt;Barrier の設定で、権限昇格を「常に」に変更しました。&lt;br&gt;
恐らくセキュリティ的によろしくないので、やるなら自己責任でお願いします。&lt;/p&gt;
&lt;h3 id="ubuntu-クライアント-側"&gt;&lt;a href="#ubuntu-%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Ubuntu (クライアント) 側
&lt;/h3&gt;&lt;p&gt;Ubuntu 20.04 を使用している場合、GNOME デスクトップ環境がデフォルトで採用されているため、GDM (GNOME Display Manager) の設定を変更しました。&lt;/p&gt;
&lt;p&gt;まず、GDMの設定ファイルを開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/gdm3/custom.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;[daemon] セクションに以下を追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;daemon&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Greeter-setup-script&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/numlockx on
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変更を有効にするためにGDMを再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service gdm restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、セキュリティ的にはよろしくないので、やるなら自己責任でお願いします。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://nanjib.com/archives/1587" target="_blank" rel="noopener"
 &gt;https://nanjib.com/archives/1587&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ossyaritoori.hatenablog.com/entry/2019/09/26/Barrier%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AEPC%E9%96%93%E3%81%A7%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%BB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E5%85%B1%E6%9C%89" target="_blank" rel="noopener"
 &gt;https://ossyaritoori.hatenablog.com/entry/2019/09/26/Barrier%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AEPC%E9%96%93%E3%81%A7%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%BB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E5%85%B1%E6%9C%89&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>systemd で環境変数を展開する</title><link>https://blog.ponkotools.com/posts/2023/06/14/systemd/</link><pubDate>Wed, 14 Jun 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/06/14/systemd/</guid><description>&lt;p&gt;環境変数を参照する Python アプリを systemd でサービス化したときにかなりはまってしまいました。&lt;/p&gt;
&lt;p&gt;systemd はユーザーの環境変数を参照しないようなので、ユニット定義ファイルで環境変数を設定する必要があるそうで、&lt;code&gt;Environment&lt;/code&gt; で記述したり、外部ファイルに定義して &lt;code&gt;EnvironmentFile&lt;/code&gt; で読み込む方法があるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://note.com/meiburg/n/n5cd098a8c744" target="_blank" rel="noopener"
 &gt;https://note.com/meiburg/n/n5cd098a8c744&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yasushi-jp/items/97057509e96919c35f64" target="_blank" rel="noopener"
 &gt;https://qiita.com/yasushi-jp/items/97057509e96919c35f64&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、上記だと変数を展開することができないので、そのような場合には以下のように &lt;code&gt;ExecStartPre&lt;/code&gt; で &lt;code&gt;systemctl&lt;/code&gt; の &lt;code&gt;set-environment&lt;/code&gt; を使う方法などがあるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb" target="_blank" rel="noopener"
 &gt;https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただ、今回の私の場合は、シェル変数 &lt;code&gt;HOSTNAME&lt;/code&gt; を環境変数に export して参照したかったのですが、systemd にはホスト名を表す特殊な変数として &lt;code&gt;%H&lt;/code&gt; があるようなので、これを使って以下のようにすれば解決できました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Description=My Python App
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ExecStart=/path/to/your/python/app.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment=&amp;#34;HOSTNAME=%H&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ja.stackoverflow.com/questions/62360/systemd-%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABhome%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84" target="_blank" rel="noopener"
 &gt;https://ja.stackoverflow.com/questions/62360/systemd-%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABhome%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb" target="_blank" rel="noopener"
 &gt;https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/37864999/referencing-other-environment-variables-in-systemd" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/37864999/referencing-other-environment-variables-in-systemd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux で端末にリアルタイムに日時を表示する</title><link>https://blog.ponkotools.com/posts/2023/02/02/linux/</link><pubDate>Thu, 02 Feb 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/02/02/linux/</guid><description>&lt;p&gt;&lt;code&gt;watch&lt;/code&gt; コマンドと &lt;code&gt;date&lt;/code&gt; コマンドを組み合わせると簡単にできます。&lt;/p&gt;
&lt;p&gt;例えば以下のような感じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ watch -t -n 0.01 date +%T.%N
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;watch&lt;/code&gt; は引数で指定したコマンドを一定間隔ごとに繰り返し実行するコマンドです。&lt;br&gt;
&lt;code&gt;-t&lt;/code&gt; はヘッダを非表示にします。&lt;br&gt;
&lt;code&gt;-n&lt;/code&gt; はコマンドを実行する間隔（秒）です。&lt;br&gt;
ここでは &lt;code&gt;date&lt;/code&gt; コマンドを 0.01 秒ごとに実行しています。&lt;br&gt;
&lt;code&gt;+%T.%N&lt;/code&gt; は日時の書式です。&lt;br&gt;
例えば、以下のようにすれば日付も表示されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ watch -t -n 0.01 &amp;#34;date &amp;#39;+%Y/%m/%d %T.%N&amp;#39;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;書式にスペースを含む場合、シングルコーテーションやダブルコーテーションで括る必要があります。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ikesato/items/4e1d2ff5251f6805b2a0" target="_blank" rel="noopener"
 &gt;https://qiita.com/ikesato/items/4e1d2ff5251f6805b2a0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://hydrocul.github.io/wiki/commands/date.html" target="_blank" rel="noopener"
 &gt;https://hydrocul.github.io/wiki/commands/date.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu の Emergency Mode で日本語配列のキーボードを使う</title><link>https://blog.ponkotools.com/posts/2022/12/02/ubuntu/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/12/02/ubuntu/</guid><description>&lt;p&gt;Ubuntu 18.04 が emergency mode で起動した時に、キーボードの配列が日本語配列になっていなくて困ったのでメモです。&lt;/p&gt;
&lt;p&gt;以下を実行すれば日本語配列のキーボードが使えるようになりました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;loadkeys&lt;/span&gt; &lt;span class="n"&gt;jp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、上記のコマンドを入力するために、私の環境では以下のようにキーを押す必要がありました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;入力したい文字&lt;/th&gt;
 &lt;th style="text-align: center"&gt;実際に押したキー&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;k&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;左下の ctrl&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;k&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;j&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;e&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;e&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;y&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;y&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;スペース&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;j&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;h&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これが何の配列になっていたのかはわかりませんでした。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kledgeb.blogspot.com/2016/05/ubuntu-1604-60.html" target="_blank" rel="noopener"
 &gt;https://kledgeb.blogspot.com/2016/05/ubuntu-1604-60.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>overlayroot の有効無効をシェルスクリプト化</title><link>https://blog.ponkotools.com/posts/2022/10/18/overlayroot/</link><pubDate>Tue, 18 Oct 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/10/18/overlayroot/</guid><description>&lt;p&gt;overlayroot を使ってファイルシステムを読み取り専用にしましたが、現在読み取り専用になっているのかどうかのチェックと、有効無効を簡単に切り替えられるようなスクリプトを作成してみました。&lt;/p&gt;
&lt;p&gt;overlayroot のインストールや設定方法については以下の記事を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-が有効か無効かをチェック"&gt;&lt;a href="#overlayroot-%e3%81%8c%e6%9c%89%e5%8a%b9%e3%81%8b%e7%84%a1%e5%8a%b9%e3%81%8b%e3%82%92%e3%83%81%e3%82%a7%e3%83%83%e3%82%af" class="header-anchor"&gt;&lt;/a&gt;overlayroot が有効か無効かをチェック
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;overlayroot on / type overlay&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot enabled&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;amp;&amp;gt; /dev/null&lt;/code&gt; は標準出力と標準エラー出力の破棄です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea" target="_blank" rel="noopener"
 &gt;https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;$?&lt;/code&gt; は直前に実行したコマンドの終了値です（0は成功、1は失敗）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337" target="_blank" rel="noopener"
 &gt;https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-を無効にする"&gt;&lt;a href="#overlayroot-%e3%82%92%e7%84%a1%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;overlayroot を無効にする
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo overlayroot-chroot rm /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;overlayroot-chroot&lt;/code&gt; で一時的に書き込み可能状態にして &lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除しているだけです。&lt;/p&gt;
&lt;h2 id="overlayroot-を有効にする"&gt;&lt;a href="#overlayroot-%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;overlayroot を有効にする
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を作成して &lt;code&gt;overlayroot=&amp;quot;tmpfs:recurse=0&amp;quot;&lt;/code&gt; を記述しているだけです。&lt;/p&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;以上を踏まえて作成してみたのが以下のスクリプトです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh disable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在の overlayroot の状態を取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;overlayroot on / type overlay&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;overlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;overlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; disable &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# overlayroot を無効にする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$overlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;disable overlayroot...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo overlayroot-chroot rm /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nReboot after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot already disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# overlayroot を有効にする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$overlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot already enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;enable overlayroot...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nReboot after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nCloses after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/copergit/automations/blob/a258017fd4c25a1704ba711e5921aa8c1bbc7c62/scripts/overlay/overlayroot" target="_blank" rel="noopener"
 &gt;https://github.com/copergit/automations/blob/a258017fd4c25a1704ba711e5921aa8c1bbc7c62/scripts/overlay/overlayroot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea" target="_blank" rel="noopener"
 &gt;https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337" target="_blank" rel="noopener"
 &gt;https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker Volume をコピー（複製）する</title><link>https://blog.ponkotools.com/posts/2022/10/14/docker/</link><pubDate>Fri, 14 Oct 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/10/14/docker/</guid><description>&lt;p&gt;Linux だと &lt;code&gt;/var/lib/docker/volumes/&amp;lt;volume_name&amp;gt;&lt;/code&gt; に保存されているため、基本的にはこれを &lt;code&gt;cp&lt;/code&gt; コマンドでコピーするだけで OK です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -p to preserve permissions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cp -rp /var/lib/docker/volumes/source_volume /var/lib/docker/volumes/target_volume
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/ciffelia/articles/docker-volume-backup-restore" target="_blank" rel="noopener"
 &gt;https://zenn.dev/ciffelia/articles/docker-volume-backup-restore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/67567986/copy-docker-volumes" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/67567986/copy-docker-volumes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] コンテナ内の実行ユーザーをホストのユーザーと合わせる</title><link>https://blog.ponkotools.com/posts/2022/08/30/docker/</link><pubDate>Tue, 30 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/30/docker/</guid><description>&lt;p&gt;Docker コンテナにホストのディレクトリをマウントしている場合、コンテナ内の実行ユーザーとホストのユーザーが一致していないと、コンテナ内で作成されたファイルにアクセス権限がなくて困ることがあります。&lt;/p&gt;
&lt;p&gt;これはコンテナ内の実行ユーザーをホストのユーザーと合わせることで解決できますが、じゃあユーザーの指定はどうするのが一番良いか？
ということで、以下の記事がとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yohm/items/047b2e68d008ebb0f001" target="_blank" rel="noopener"
 &gt;https://qiita.com/yohm/items/047b2e68d008ebb0f001&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ほとんどの場合、以下で上手く行くそうです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/group:/etc/group:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/passwd:/etc/passwd:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -u &lt;span class="k"&gt;$(&lt;/span&gt;id -u &lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:&lt;span class="k"&gt;$(&lt;/span&gt;id -g &lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ubuntu bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;私の場合もこれで上手く行きました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yohm/items/047b2e68d008ebb0f001" target="_blank" rel="noopener"
 &gt;https://qiita.com/yohm/items/047b2e68d008ebb0f001&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>シェルスクリプトをダブルクリックで端末内で実行する</title><link>https://blog.ponkotools.com/posts/2022/08/23/shell/</link><pubDate>Tue, 23 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/23/shell/</guid><description>&lt;p&gt;Ubuntu 20.04 にて、デスクトップに置いたシェルスクリプトファイルをダブルクリックで実行し、かつ端末内で実行する方法です。&lt;br&gt;
結構はまったのでメモしておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gnome-terminal -- bash -c &lt;span class="s2"&gt;&amp;#34;echo sample;sleep 5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;端末がすぐ閉じるのを防ぐために &lt;code&gt;sleep 5&lt;/code&gt; を入れています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gnome-terminal -- bash -c &lt;span class="s2"&gt;&amp;#34;/home/username/sample.sh;sleep 5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/1259265/make-gnome-terminal-request-user-confirmation-before-close" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/1259265/make-gnome-terminal-request-user-confirmation-before-close&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>overlayroot 環境内で docker を使う方法</title><link>https://blog.ponkotools.com/posts/2022/08/19/overlayroot/</link><pubDate>Fri, 19 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/19/overlayroot/</guid><description>&lt;p&gt;overlayroot でルートファイルシステムを読み取り専用にしたところ、docker が使えなくなりました。&lt;/p&gt;
&lt;p&gt;OS は Ubuntu 20.04 です。&lt;br&gt;
overlayroot を有効にする方法などについては以前の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="問題点"&gt;&lt;a href="#%e5%95%8f%e9%a1%8c%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;問題点
&lt;/h2&gt;&lt;p&gt;Docker がインストールされている環境で、overlayroot でルートファイルシステムを読み取り専用にした場合、docker コマンドを実行すると以下のようなエラーが発生します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いろいろ調べてみた結果、基本的に overlayroot が有効な状態では docker は使えないようです。&lt;br&gt;
一応以下にあるやり方で docker コンテナを立ち上げるところまではできました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link" target="_blank" rel="noopener"
 &gt;https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/for-linux/issues/775" target="_blank" rel="noopener"
 &gt;https://github.com/docker/for-linux/issues/775&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかし、そもそも Docker ボリュームには DB のデータなどを逐次格納していっているので、tmpfs 上（＝メモリ上）だとメモリがすぐ枯渇してしまいそうです。&lt;br&gt;
また、Docker コンテナ・イメージをアップデートしたい場合にも困ります。&lt;/p&gt;
&lt;p&gt;というわけで、少なくとも &lt;code&gt;/var/lib/docker&lt;/code&gt; の領域はパーティションを分けるしかないじゃないかというところに行き着きました。&lt;br&gt;
以下のページでも書き込み可能としたい場合はパーティションを分ける方法が紹介されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/index.php/blog/10899/8648" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/index.php/blog/10899/8648&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、Docker に関するベストプラクティスでも、コンテナ用にパーティションを分けるとあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.creationline.com/lab/aquasecurity/43087" target="_blank" rel="noopener"
 &gt;https://www.creationline.com/lab/aquasecurity/43087&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その上で、Docker コンテナも read-only で起動すれば、ルートファイルシステムだけでなく Docker コンテナも保護できそうです。&lt;/p&gt;
&lt;h2 id="対処方法"&gt;&lt;a href="#%e5%af%be%e5%87%a6%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;対処方法
&lt;/h2&gt;&lt;p&gt;とりあえず以下のようにパーティションを分けることで overlayroot と docker の共存ができました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;パス&lt;/th&gt;
 &lt;th&gt;マウントポイント&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda1&lt;/td&gt;
 &lt;td&gt;EFI システムパーティション&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda2&lt;/td&gt;
 &lt;td&gt;/&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda3&lt;/td&gt;
 &lt;td&gt;/var&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この状態で overlayroot をインストールし、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;tmpfs:recurse=0&amp;quot;&lt;/code&gt; を記載します。
コマンド一発でやる場合は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;overlayroot のインストールや設定については以前の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はルートファイルシステムのみを読み取り専用にするので、&lt;code&gt;tmpfs:recurse=0&lt;/code&gt; を指定するらしいです。&lt;br&gt;
以下が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、&lt;code&gt;/var&lt;/code&gt; は読み書き可能な状態となります。&lt;br&gt;
docker も普通に使えました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link" target="_blank" rel="noopener"
 &gt;https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/for-linux/issues/775" target="_blank" rel="noopener"
 &gt;https://github.com/docker/for-linux/issues/775&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/index.php/blog/10899/8648" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/index.php/blog/10899/8648&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/forum/armadillo/7894" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/forum/armadillo/7894&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/" target="_blank" rel="noopener"
 &gt;https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kurosute.com/raspberrypi-overlayroot/" target="_blank" rel="noopener"
 &gt;https://kurosute.com/raspberrypi-overlayroot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b" target="_blank" rel="noopener"
 &gt;https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>WSL2 上の Docker コンテナに外部からアクセスする</title><link>https://blog.ponkotools.com/posts/2022/07/29/wsl-docker/</link><pubDate>Fri, 29 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/29/wsl-docker/</guid><description>&lt;p&gt;Ubuntu で Docker を使っている場合はホストとコンテナのポートマッピングさえ行えば外部からアクセスできました。&lt;br&gt;
しかし、WSL2 を使っている場合は Windows と WSL2(Ubuntu) のポートフォワーディングの設定を行わないと外部からはアクセスできません。&lt;/p&gt;
&lt;p&gt;尚、タイトルには「Docker コンテナに外部からアクセス」と書きましたが、Windows と WSL2 の話なので、Docker は関係ありません。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ホスト: Windows 10&lt;/li&gt;
&lt;li&gt;WSL2: Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定方法"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;設定方法
&lt;/h2&gt;&lt;h3 id="wsl2-の-ip-アドレスを調べる"&gt;&lt;a href="#wsl2-%e3%81%ae-ip-%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;WSL2 の IP アドレスを調べる
&lt;/h3&gt;&lt;p&gt;まずは WSL2 上で以下のコマンドを実行し、eth0 の IP アドレスを調べます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ip addr show dev eth0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;または &lt;code&gt;hostname -I&lt;/code&gt; でも調べられます。&lt;/p&gt;
&lt;h3 id="windows-と-wsl2-のポートフォワーディング設定"&gt;&lt;a href="#windows-%e3%81%a8-wsl2-%e3%81%ae%e3%83%9d%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9%e3%83%af%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Windows と WSL2 のポートフォワーディング設定
&lt;/h3&gt;&lt;p&gt;コマンドプロンプトまたは PowerShell で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; netsh interface portproxy add v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt; &lt;span class="nv"&gt;connectaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;WSL2のIPアドレス&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで外部からアクセス可能になります。&lt;br&gt;
設定ができているか確認したい場合は以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; netsh interface portproxy show v4tov4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipv4 をリッスンする: ipv4 に接続する:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address Port Address Port
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--------------- ---------- --------------- ----------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* &lt;span class="m"&gt;5001&lt;/span&gt; 172.20.93.38 &lt;span class="m"&gt;5001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定を削除したい場合は以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; netsh interface portproxy delete v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設定の自動化"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%ae%e8%87%aa%e5%8b%95%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;設定の自動化
&lt;/h2&gt;&lt;p&gt;WSL2 の IP アドレスは起動の度に変わるので、Windows 起動時に自動で設定するようにします。&lt;/p&gt;
&lt;h3 id="windows-上で-wsl2-の-ip-アドレスを取得"&gt;&lt;a href="#windows-%e4%b8%8a%e3%81%a7-wsl2-%e3%81%ae-ip-%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%82%92%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;Windows 上で WSL2 の IP アドレスを取得
&lt;/h3&gt;&lt;p&gt;PowerShell で以下を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nv"&gt;$IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; wsl -d Ubuntu-20.04 &lt;span class="nb"&gt;exec&lt;/span&gt; hostname -I
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、私の環境では複数の IP アドレスが表示されてしまいました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nv"&gt;$IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;172.20.93.38 172.17.0.1 172.18.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なので、以下のようにスペースで区切って最初の IP アドレスだけを取得できるようにしました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nv"&gt;$IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;wsl -d Ubuntu-20.04 &lt;span class="nb"&gt;exec&lt;/span&gt; hostname -I&lt;span class="o"&gt;)&lt;/span&gt;.split&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;0&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="スクリプトファイルの作成と実行"&gt;&lt;a href="#%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90%e3%81%a8%e5%ae%9f%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;スクリプトファイルの作成と実行
&lt;/h3&gt;&lt;p&gt;以上を踏まえ、以下のようなスクリプトファイルを作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;wsl -d Ubuntu-20.04 &lt;span class="nb"&gt;exec&lt;/span&gt; hostname -I&lt;span class="o"&gt;)&lt;/span&gt;.split&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;0&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh interface portproxy delete v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh interface portproxy add v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt; &lt;span class="nv"&gt;connectaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとはこれをタスクスケジューラーでログオン時に実行するようにすれば OK です。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yabeenico/items/15532c703974dc40a7f5" target="_blank" rel="noopener"
 &gt;https://qiita.com/yabeenico/items/15532c703974dc40a7f5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gunmagisgeek.com/blog/other/7171" target="_blank" rel="noopener"
 &gt;https://gunmagisgeek.com/blog/other/7171&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://scratchpad.jp/ubuntu-on-windows11-13/" target="_blank" rel="noopener"
 &gt;https://scratchpad.jp/ubuntu-on-windows11-13/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ImageMagick で画像を一括で変換</title><link>https://blog.ponkotools.com/posts/2022/07/27/imagemagick/</link><pubDate>Wed, 27 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/27/imagemagick/</guid><description>&lt;p&gt;Ubuntu で大量の画像ファイルを一括で変換したいときは、ImageMagick のコマンドを使うと便利です。&lt;/p&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;p&gt;私の環境では最初からインストールされていましたが、ない場合は以下でインストールできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install imagemagick
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="画像の変換"&gt;&lt;a href="#%e7%94%bb%e5%83%8f%e3%81%ae%e5%a4%89%e6%8f%9b" class="header-anchor"&gt;&lt;/a&gt;画像の変換
&lt;/h2&gt;&lt;p&gt;例えば、全ての png 画像を jpg に変更したい場合は以下のようにしします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -format jpg *.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;元のファイルは残ったままです。&lt;/p&gt;
&lt;h2 id="リサイズ"&gt;&lt;a href="#%e3%83%aa%e3%82%b5%e3%82%a4%e3%82%ba" class="header-anchor"&gt;&lt;/a&gt;リサイズ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;jpg&lt;/code&gt; ファイルを全てリサイズしたい場合、以下のようにします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -resize 100x100 *.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、この場合アスペクト比は維持されます。
なので、例えば、640x360 の画像を上記のコマンドでリサイズすると、100x56 のサイズになります。&lt;/p&gt;
&lt;p&gt;アスペクト比を無視して強制的にリサイズしたい場合は &lt;code&gt;!&lt;/code&gt; をつけます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -resize 100x100! *.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、割合で指定したい場合は以下のようにします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -resize 50% *.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://analyzegear.co.jp/blog/1561" target="_blank" rel="noopener"
 &gt;https://analyzegear.co.jp/blog/1561&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://liginc.co.jp/394506" target="_blank" rel="noopener"
 &gt;https://liginc.co.jp/394506&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://minoru.okinawa/archives/2995" target="_blank" rel="noopener"
 &gt;https://minoru.okinawa/archives/2995&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker-compose.yml で HOSTNAME が参照できない？</title><link>https://blog.ponkotools.com/posts/2022/06/30/docker-compose/</link><pubDate>Thu, 30 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/30/docker-compose/</guid><description>&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; で &lt;code&gt;$HOSTNAME&lt;/code&gt; と記述すると以下のようなエラーが表示され、かなりはまってしまいました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The HOSTNAME variable is not set. Defaulting to a blank string
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ubuntu では &lt;code&gt;HOSTNAME&lt;/code&gt; が export されていないそうなので、環境変数として参照できないようです。&lt;br&gt;
どうやらかなり昔からの仕様のようですが、Ubuntu 20.04 でも状況は変わっていません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntuforums.org/archive/index.php/t-898924.html" target="_blank" rel="noopener"
 &gt;https://ubuntuforums.org/archive/index.php/t-898924.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私は誤解していましたが、&lt;code&gt;HOSTNAME&lt;/code&gt; は環境変数ではなくシェル変数です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569" target="_blank" rel="noopener"
 &gt;https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.linux-beginner.com/linux_kihon170.html" target="_blank" rel="noopener"
 &gt;http://www.linux-beginner.com/linux_kihon170.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そして、export されていないから環境変数として yml からは参照できないと。&lt;br&gt;
なので、以下のようにすれば参照できるようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; HOSTNAME &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-compose up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;毎回 export するのが面倒な場合は &lt;code&gt;.bashrc&lt;/code&gt; に書いておくのがいいかもしれません。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntuforums.org/archive/index.php/t-898924.html" target="_blank" rel="noopener"
 &gt;https://ubuntuforums.org/archive/index.php/t-898924.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569" target="_blank" rel="noopener"
 &gt;https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.linux-beginner.com/linux_kihon170.html" target="_blank" rel="noopener"
 &gt;http://www.linux-beginner.com/linux_kihon170.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] ログドライバーでログの出力先を syslog に設定する</title><link>https://blog.ponkotools.com/posts/2022/06/23/docker/</link><pubDate>Thu, 23 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/23/docker/</guid><description>&lt;p&gt;Docker コンテナで標準出力されているログを syslog に記録するようにログドライバーを設定します。&lt;/p&gt;
&lt;p&gt;Docker のログドライバーで設定できるものには他にもいろいろあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/configure/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/configure/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;オプションはログドライバーによって異なるようで、syslog の場合は以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/syslog/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/syslog/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上を踏まえ、docker-compose でログドライバーを設定する例が以下になります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;syslog&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;my-app-name&amp;#39;&lt;/span&gt;&lt;span class="w"&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;appname&lt;/code&gt; がコンテナIDになって分かりづらいので、&lt;code&gt;tag&lt;/code&gt; で設定しています。&lt;/p&gt;
&lt;h2 id="余談"&gt;&lt;a href="#%e4%bd%99%e8%ab%87" class="header-anchor"&gt;&lt;/a&gt;余談
&lt;/h2&gt;&lt;p&gt;コンテナ内で動かしている Python のアプリケーションでは、もともと logging モジュールで syslog に記録するよう設定していました。&lt;br&gt;
これを標準出力にし、Docker のログドライバーで設定できるようにすれば、コンテナを使う側が出力先を決められて便利かなと思いました。&lt;/p&gt;
&lt;p&gt;しかし、Python 側では5段階に分けられていたログレベルが、標準出力を介すことで、Info (stdout) と Error (stderr) の2レベルに平坦化されてしまうことが分かり、結局 Python 側で syslog に記録するようにしました。&lt;/p&gt;
&lt;p&gt;もしかしたから何か上手いやり方があるのかもしれませんが・・・。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Esfahan/items/5e5a9ae7882bb0eaaf5f" target="_blank" rel="noopener"
 &gt;https://qiita.com/Esfahan/items/5e5a9ae7882bb0eaaf5f&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] コンテナ内からホストにアクセスする</title><link>https://blog.ponkotools.com/posts/2022/06/17/docker/</link><pubDate>Fri, 17 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/17/docker/</guid><description>&lt;p&gt;コンテナ内では &lt;code&gt;localhost&lt;/code&gt; はコンテナ自身を指すので使えません。&lt;br&gt;
かといってホストの IP アドレスを直接参照すると、IP アドレスが変わったときに困ります。&lt;/p&gt;
&lt;p&gt;このような場合、&lt;code&gt;host.docker.internal&lt;/code&gt; を使います。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;host.docker.internal&lt;/code&gt; はもともと Windows と Mac でしか使えなかったようですが、Docker 20.10 からLinux でも使えるようになったそうです。&lt;br&gt;
この機能を有効化するには &lt;code&gt;--add-host&lt;/code&gt; で &lt;code&gt;host.docker.internal:host-gateway&lt;/code&gt; を指定する必要があるようです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it --rm &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --add-host&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker-compose の場合は &lt;code&gt;extra_hosts&lt;/code&gt; で指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;extra_hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;host.docker.internal:host-gateway&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/skobaken/items/03a8b9d0e443745862ac" target="_blank" rel="noopener"
 &gt;https://qiita.com/skobaken/items/03a8b9d0e443745862ac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66" target="_blank" rel="noopener"
 &gt;https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://uepon.hatenadiary.com/entry/2021/06/02/002613" target="_blank" rel="noopener"
 &gt;https://uepon.hatenadiary.com/entry/2021/06/02/002613&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%2Fdocker%2F%E8%A6%9A%E6%9B%B8" target="_blank" rel="noopener"
 &gt;https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%2Fdocker%2F%E8%A6%9A%E6%9B%B8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] コンテナ内からホストにアクセスする</title><link>https://blog.ponkotools.com/posts/2022/06/16/docker-traefik/</link><pubDate>Thu, 16 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/16/docker-traefik/</guid><description>&lt;p&gt;ググってもなかなかサンプルが見当たらずかなりはまりました。&lt;/p&gt;
&lt;p&gt;最終的には以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker + Traefik の基本的な設定は以前の記事をご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/06/docker-traefik.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/06/docker-traefik.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;li&gt;Traefik v2.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="イメージ図"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e5%9b%b3" class="header-anchor"&gt;&lt;/a&gt;イメージ図
&lt;/h2&gt;&lt;p&gt;やりたいことは以下のような感じです。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1007px" data-flex-grow="419" height="121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/06/16/docker-traefik/image.png" width="508"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;ホストのURL&amp;gt;/api1/&lt;/code&gt; へのアクセスはポート3000へ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;ホストのURL&amp;gt;/api2/&lt;/code&gt; へのアクセスはポート4000へ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;簡単な解説をコメントに書いています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.enable=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo という名前のルーターを定義し、エントリーポイント http と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# リクエストパス /api1 とマッチするよう指定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.rule=PathPrefix(`/api1{regex:$$|/.*}`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-middleware という名前のミドルウェアを定義し、ルーター foo と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.middlewares=foo-middleware&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サービスにリクエストを行う前にリクエストパスの先頭の /api1 を取り除くように指定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.middlewares.foo-middleware.stripprefix.prefixes=/api1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service という名前のサービスを定義し、ルーター foo と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.service=foo-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service へのアクセスをポート3000 へ飛ばす&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.foo-service.loadbalancer.server.port=3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.rule=PathPrefix(`/api2{regex:$$|/.*}`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.middlewares=bar-middleware&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.middlewares.bar-middleware.stripprefix.prefixes=/api2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.service=bar-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.bar-service.loadbalancer.server.port=4000&lt;/span&gt;&lt;span class="w"&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;ports&lt;/code&gt; でホストのポートとマッピングしていますが、実際には &lt;code&gt;expose&lt;/code&gt; でコンテナ側のポートを開けるだけのほうがよいと思います。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2" target="_blank" rel="noopener"
 &gt;https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker + Traefik で複数のポートを公開しているコンテナのルーティングを行う</title><link>https://blog.ponkotools.com/posts/2022/06/15/docker-traefik/</link><pubDate>Wed, 15 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/15/docker-traefik/</guid><description>&lt;p&gt;ググってもなかなかサンプルが見当たらずかなりはまりました。&lt;/p&gt;
&lt;p&gt;最終的には以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2" target="_blank" rel="noopener"
 &gt;https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker + Traefik の基本的な設定は以前の記事をご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/06/docker-traefik.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/06/docker-traefik.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;li&gt;Traefik v2.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="イメージ図"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e5%9b%b3" class="header-anchor"&gt;&lt;/a&gt;イメージ図
&lt;/h2&gt;&lt;p&gt;やりたいことは以下のような感じです。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1007px" data-flex-grow="419" height="121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/06/15/docker-traefik/image.png" width="508"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api1.localhost&lt;/code&gt; へのアクセスはポート3000へ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api2.localhost&lt;/code&gt; へのアクセスはポート4000へ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;簡単な解説をコメントに書いています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.enable=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo という名前のルーターを定義し、&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# エントリーポイント http (traefik側で設定した任意の名前) と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ルーター foo のホスト名を &amp;#34;api1.localhost&amp;#34; に設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.rule=Host(`api1.localhost`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service という名前のサービスを定義し、ルーター foo と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.service=foo-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service へのアクセスをポート3000 へ飛ばす&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.foo-service.loadbalancer.server.port=3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.rule=Host(`api2.localhost`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.service=bar-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.bar-service.loadbalancer.server.port=4000&lt;/span&gt;&lt;span class="w"&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;ports&lt;/code&gt; でホストのポートとマッピングしていますが、実際には &lt;code&gt;expose&lt;/code&gt; でコンテナ側のポートを開けるだけのほうがよいと思います。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2" target="_blank" rel="noopener"
 &gt;https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker + Traefik でリバースプロキシサーバーを立てる</title><link>https://blog.ponkotools.com/posts/2022/06/14/docker-traefik/</link><pubDate>Tue, 14 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/14/docker-traefik/</guid><description>&lt;p&gt;最初 nginx でリバースプロキシサーバーを構築していたのですが、いろいろ調べていく中で Traefik というサーバーの存在を知りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://doc.traefik.io/traefik/" target="_blank" rel="noopener"
 &gt;https://doc.traefik.io/traefik/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公式ではエッジルーターという言い方がされていますが、要はリバースプロキシ＋ロードバランサーという感じらしいです。&lt;br&gt;
nginx より後発で、Docker との親和性が高いとのことで試しに使ってみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker: 20.10.12&lt;/li&gt;
&lt;li&gt;Traefik: v2.7&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Traefik 自身も Docker で動かします。&lt;/p&gt;
&lt;h2 id="docker-network-の作成"&gt;&lt;a href="#docker-network-%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;docker network の作成
&lt;/h2&gt;&lt;p&gt;アプリと Traefik で共通で使用するネットワークを作成しておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker network create sample-network
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="traefik-の設定"&gt;&lt;a href="#traefik-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Traefik の設定
&lt;/h2&gt;&lt;p&gt;Traefik の設定は &lt;code&gt;/etc/traefik/traefik.yml&lt;/code&gt; に記述する方法と、&lt;code&gt;docker-compose.yml&lt;/code&gt; で指定する方法があるようです。&lt;br&gt;
前者の例が多いですが、後者の方が &lt;code&gt;docker-compose.yml&lt;/code&gt; 一つで設定が完結して良いと思うのは私だけでしょうか？&lt;/p&gt;
&lt;h3 id="設定ファイルに記述する例"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e8%a8%98%e8%bf%b0%e3%81%99%e3%82%8b%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;設定ファイルに記述する例
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;traefik.yml&lt;/code&gt; というファイルを作成して、以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Providers config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Docker との連携を有効にする&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# false に指定することで Label 付けしていない docker コンテナを Traefik が無視するようになる&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;exposedByDefault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 使用するネットワーク&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sample-network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;entryPoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# http という任意の名前のエントリーポイントを定義し、80番ポートをリッスンするよう指定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:80&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# API/Dashboard config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# WebUI にアクセスできるように設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;insecure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Trafik を起動します。&lt;br&gt;
ネットには docker-compose を使った例が多いですが、とりあえず &lt;code&gt;docker run&lt;/code&gt; で動かしてみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it --rm &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name reverse-proxy &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --network sample-network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/traefik.yml:/etc/traefik/traefik.yml &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 80:80 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8080:8080 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; traefik:v2.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とりあえずこれで、http://localhost:8080 にアクセスすると Traefik の WebUI が表示されるかと思います。&lt;/p&gt;
&lt;h3 id="docker-composeyml-で設定する例"&gt;&lt;a href="#docker-composeyml-%e3%81%a7%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml で設定する例
&lt;/h3&gt;&lt;p&gt;上記の設定を &lt;code&gt;docker-compose.yml&lt;/code&gt; のみで行った場合の例です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.9&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;reverse-proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;traefik:v2.7&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ファイルで設定する場合は以下&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#- type: bind&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# source: ./traefik.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# target: /etc/traefik/traefik.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;sample-network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# traefik.yml の代わりに command で設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;providers.docker.exposedByDefault=false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;providers.docker.network=sample-network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entryPoints.http.address=:80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entryPoints.https.address=:443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;api.insecure=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sample-network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アプリケーション側の設定"&gt;&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e5%81%b4%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;アプリケーション側の設定
&lt;/h2&gt;&lt;p&gt;ルーティングの設定などは全てコンテナのラベルで設定します。
他のサーバーだとサーバー側の設定を変更する必要がありますが、 Traefik+Docker だとコンテナの増減に対して対応しやすいなと思いました。&lt;/p&gt;
&lt;p&gt;とりあえず &lt;code&gt;docker run&lt;/code&gt; で動かしてみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it --rm &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --network sample-network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -l &lt;span class="s2"&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -l &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.api.entrypoints=http&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -l &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.api.rule=Host(\&amp;#34;api.localhost\&amp;#34;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sample_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで &lt;a class="link" href="http://api.localhost/" target="_blank" rel="noopener"
 &gt;http://api.localhost/&lt;/a&gt; に該当のアプリにアクセスすれば繋がると思います。&lt;br&gt;
解説は次に書いてあります。&lt;/p&gt;
&lt;h3 id="docker-compose-での例"&gt;&lt;a href="#docker-compose-%e3%81%a7%e3%81%ae%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;docker-compose での例
&lt;/h3&gt;&lt;p&gt;上記の設定は、&lt;code&gt;docker-compose.yml&lt;/code&gt; で以下のように設定します。&lt;br&gt;
コメントで簡単な解説をつけておきました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Traefik の有効化(exposedByDefault:false に設定した場合に必要)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.enable=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# api という名前のルーターを定義し、&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# エントリーポイント http (traefik.yml で定義した名前) と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.api.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ルーター api のホスト名を &amp;#34;api.localhost&amp;#34; に設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.api.rule=Host(`api.localhost`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本は以上です。&lt;br&gt;
他の詳細な設定については追々記事を書こうかなと思っています。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://coders-shelf.com/traefik-intro/" target="_blank" rel="noopener"
 &gt;https://coders-shelf.com/traefik-intro/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/adwin/items/ccc34ef5f4c88d8fa02c" target="_blank" rel="noopener"
 &gt;https://qiita.com/adwin/items/ccc34ef5f4c88d8fa02c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/navitime_tech/items/7566bdf80b5a34a86ca8" target="_blank" rel="noopener"
 &gt;https://qiita.com/navitime_tech/items/7566bdf80b5a34a86ca8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://big.tm.land.to/tips/traefik/setup/" target="_blank" rel="noopener"
 &gt;http://big.tm.land.to/tips/traefik/setup/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker コンテナ内から Docker コマンドを使う</title><link>https://blog.ponkotools.com/posts/2022/05/26/docker/</link><pubDate>Thu, 26 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/26/docker/</guid><description>&lt;p&gt;Docker コンテナ内のアプリケーションから Docker コンテナの操作をしたかったので、やってみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dind-と-dood"&gt;&lt;a href="#dind-%e3%81%a8-dood" class="header-anchor"&gt;&lt;/a&gt;DinD と DooD
&lt;/h2&gt;&lt;p&gt;Docker コンテナ内から Docker を扱う方法としては以下の２つがあるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DinD: Docker in Docker
&lt;ul&gt;
&lt;li&gt;Docker コンテナの中で Docker デーモンを動かす&lt;/li&gt;
&lt;li&gt;コンテナの中にコンテナを作成したりできる&lt;/li&gt;
&lt;li&gt;非推奨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DooD: Docker outside of Docker
&lt;ul&gt;
&lt;li&gt;ホストの docker.sock をコンテナにマウントし、Docker デーモンを共有する&lt;/li&gt;
&lt;li&gt;ホスト上の Docker コンテナを操作できる&lt;/li&gt;
&lt;li&gt;基本的にこちらを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここらへん以下のページが分かりやすかったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d" target="_blank" rel="noopener"
 &gt;https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DinD は Docker の開発用途のためのものらしく、セキュリティリスクなどもあることから非推奨で、基本的には DooD のほうを使うべきだそうです。&lt;br&gt;
今回の用途的にも DooD のほうなので、DooD を試してみました。&lt;/p&gt;
&lt;h2 id="dood-サンプル"&gt;&lt;a href="#dood-%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;DooD サンプル
&lt;/h2&gt;&lt;p&gt;ググってみると以下のようなサンプルが多いです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;確かにこれでコンテナ内で docker コマンドが使えました。&lt;br&gt;
この場合では &lt;code&gt;docker&lt;/code&gt; という Docker 一式が入ったイメージを使っているので、&lt;code&gt;/var/run/docker.sock&lt;/code&gt; をマウントするだけで使えています。&lt;/p&gt;
&lt;p&gt;しかし、実際にはアプリケーションのランタイムイメージをベースとすることが多いと思います。&lt;br&gt;
試しに Ubuntu のイメージを使うと、以下のようにエラーになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:20.04
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# docker ps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash: docker: &lt;span class="nb"&gt;command&lt;/span&gt; not found
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker クライアントがインストールされていないからです。&lt;/p&gt;
&lt;p&gt;この場合、コンテナ内で &lt;code&gt;docker.io&lt;/code&gt; をインストールすれば docker コマンドが使えるようになります。&lt;br&gt;
ついでに &lt;code&gt;docker-compose&lt;/code&gt; もインストールしています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y docker.io docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というわけで、DooD では&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/var/run/docker.sock&lt;/code&gt; をマウント&lt;/li&gt;
&lt;li&gt;ベースイメージに Docker クライアントがインストールされていなければインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;で、コンテナ内から Docker コマンドが使えるようになります。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d" target="_blank" rel="noopener"
 &gt;https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/minamijoyo/items/c937fb4f646dc1ff064a" target="_blank" rel="noopener"
 &gt;https://qiita.com/minamijoyo/items/c937fb4f646dc1ff064a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.mtioutput.com/entry/docker-outside-of" target="_blank" rel="noopener"
 &gt;https://www.mtioutput.com/entry/docker-outside-of&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://devblog.pirika.org/entry/2021/10/05/113000" target="_blank" rel="noopener"
 &gt;https://devblog.pirika.org/entry/2021/10/05/113000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu の IP アドレスを固定化する</title><link>https://blog.ponkotools.com/posts/2022/05/20/ubuntu/</link><pubDate>Fri, 20 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/20/ubuntu/</guid><description>&lt;p&gt;いつもは GUI で設定するのですが、あるとき IP アドレスを変更しても再起動後に元に戻ってしまうという現象が発生して悩んでいました。&lt;br&gt;
調べたら他の人が IP アドレスを固定化してたのが原因だとわかったので、ついでにそのやり方をメモしておきます。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定方法"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;設定方法
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/netplan/&lt;/code&gt; に yaml ファイルを作成します。&lt;/p&gt;
&lt;p&gt;ここに作成したファイルが名前順に読み込まれ、後に読み込まれた内容のほうが優先されるようです。&lt;/p&gt;
&lt;p&gt;Ubuntu Desktop の場合、デフォルトで &lt;code&gt;01-network-manager-all.yaml&lt;/code&gt; があり、ネットワークマネージャーでの設定が反映されるようになっています。&lt;/p&gt;
&lt;p&gt;IP アドレスを固定化したい場合は、&lt;code&gt;/etc/netplan/99_config.yaml&lt;/code&gt; など、後に読み込まれるようなファイル名でファイルを作成し、設定を上書きしてやるそうです。&lt;br&gt;
yaml ファイルの書き方なども含め、公式ドキュメントは以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntu.com/server/docs/network-configuration" target="_blank" rel="noopener"
 &gt;https://ubuntu.com/server/docs/network-configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば以下のような感じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;192.168.1.10&lt;/span&gt;&lt;span class="l"&gt;/24&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gateway4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntu.com/server/docs/network-configuration" target="_blank" rel="noopener"
 &gt;https://ubuntu.com/server/docs/network-configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tarufu.info/how_to_assign_static_ip_address_on_ubuntu/" target="_blank" rel="noopener"
 &gt;https://tarufu.info/how_to_assign_static_ip_address_on_ubuntu/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E8%A8%88%E7%AE%97%E6%A9%9F:%E5%9B%BA%E5%AE%9Aip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A" target="_blank" rel="noopener"
 &gt;http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E8%A8%88%E7%AE%97%E6%A9%9F:%E5%9B%BA%E5%AE%9Aip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Jetson Xavier NX でルートファイルシステムを overlayroot で読み込み専用に設定する</title><link>https://blog.ponkotools.com/posts/2022/04/26/jetson-overlayroot/</link><pubDate>Tue, 26 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/26/jetson-overlayroot/</guid><description>&lt;p&gt;以前、Ubuntu で overlayroot を使ってルートファイルシステムを読み込み専用にしてみたのですが、Jetson Xavier NX で同じように試してみたところ、それだけではだめでした。&lt;/p&gt;
&lt;p&gt;恐らくですが、ブートローダーが EXTLINUX であることが原因のような気がしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jetson Xavier NX ではどうやってやればいいのかググってみると、NVIDIA のフォーラムで議論されているのが見つかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その中で、解決策として提示されていたのが以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/negachov/overlayroot-jetpack" target="_blank" rel="noopener"
 &gt;https://github.com/negachov/overlayroot-jetpack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Jetson Xavior NX&lt;/li&gt;
&lt;li&gt;Ubuntu 18.04&lt;/li&gt;
&lt;li&gt;JetPack 4.5.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-のインストールと有効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot のインストールと有効化
&lt;/h2&gt;&lt;p&gt;以下の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jetson Xavier NX ではこれに加え、次のことが必要でした。&lt;/p&gt;
&lt;h2 id="bootinitrd-の置き換え"&gt;&lt;a href="#bootinitrd-%e3%81%ae%e7%bd%ae%e3%81%8d%e6%8f%9b%e3%81%88" class="header-anchor"&gt;&lt;/a&gt;/boot/initrd の置き換え
&lt;/h2&gt;&lt;p&gt;GitHub にスクリプトが公開されているので、まずこれをクローンします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/negachov/overlayroot-jetpack
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは以下を実行するだけです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; overlayroot-jetpack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ./update-initramfs-jetpack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、再起動後に overlayroot が有効になっていました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/jetson/l4t/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/jetson/l4t/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/tunefs/articles/288d3a069f0cb3" target="_blank" rel="noopener"
 &gt;https://zenn.dev/tunefs/articles/288d3a069f0cb3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu のファイルシステムを overlayroot で読み込み専用にする</title><link>https://blog.ponkotools.com/posts/2022/04/25/overlayroot/</link><pubDate>Mon, 25 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/25/overlayroot/</guid><description>&lt;p&gt;電源ブチ切り対策の一環として、overlayroot で Ubuntu の rootfs を read only にしてみました。&lt;/p&gt;
&lt;p&gt;やり方はいろいろググってみましたが、以下のサイトがとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/tunefs/articles/288d3a069f0cb3" target="_blank" rel="noopener"
 &gt;https://zenn.dev/tunefs/articles/288d3a069f0cb3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04 (デスクトップ版)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="現在の状態を確認"&gt;&lt;a href="#%e7%8f%be%e5%9c%a8%e3%81%ae%e7%8a%b6%e6%85%8b%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;現在の状態を確認
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;mount&lt;/code&gt; コマンドで確認してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抜粋ですが、以下の状態が確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda2 on / &lt;span class="nb"&gt;type&lt;/span&gt; ext4 &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,errors&lt;span class="o"&gt;=&lt;/span&gt;remount-ro&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overlayroot-のインストール"&gt;&lt;a href="#overlayroot-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;overlayroot のインストール
&lt;/h2&gt;&lt;p&gt;サーバー版には最初からインストールされているそうですが、デスクトップ版にはインストールされていないので、apt でインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install overlayroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overlayroot-の有効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot の有効化
&lt;/h2&gt;&lt;p&gt;overlayroot を有効化するには、以下のいずれかの対応が必要だそうです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カーネルパラメーターに &lt;code&gt;overlayroot=XXX&lt;/code&gt; を指定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;XXX&amp;quot;&lt;/code&gt; を指定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/overlayroot.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;XXX&amp;quot;&lt;/code&gt; を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設定内容は上位のほうが優先されるそうです。&lt;br&gt;
今回は &lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に設定を追加します。&lt;br&gt;
まずはエディタで開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gedit /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;overlayroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tmpfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンド一発でやるなら以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tmpfs はメモリ上に作成ファイルシステムで、一時的にデータを格納するために使われます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://linuc.org/study/knowledge/441/" target="_blank" rel="noopener"
 &gt;https://linuc.org/study/knowledge/441/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux ではマウントするファイルシステムの情報が &lt;code&gt;/etc/fstab&lt;/code&gt; に書かれていますが、ここが overlayroot における下位レイヤーとなり、読み込み専用レイヤーとなります。&lt;br&gt;
そして、先ほど追記した &lt;code&gt;tempfs&lt;/code&gt; が上位レイヤーとなり、書き込み可能レイヤーとなります。&lt;br&gt;
ここらへんは後述するように &lt;code&gt;mount&lt;/code&gt; コマンドで確認可能です。&lt;/p&gt;
&lt;p&gt;ただし、tmpfs はメモリ上に作成されたファイルシステムなので、再起動時にはデータは消えます。&lt;/p&gt;
&lt;h3 id="ルートファイルシステムのみを読み取り専用にする"&gt;&lt;a href="#%e3%83%ab%e3%83%bc%e3%83%88%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e3%81%bf%e3%82%92%e8%aa%ad%e3%81%bf%e5%8f%96%e3%82%8a%e5%b0%82%e7%94%a8%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;ルートファイルシステムのみを読み取り専用にする
&lt;/h3&gt;&lt;p&gt;パーティションを分けている場合などで、ルートファイルシステムのみを読み取り専用にするためには、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;tmpfs:recurse=0&lt;/code&gt; を指定するらしいです。&lt;br&gt;
コマンド一発でやる場合は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39; | sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、他のパーティションは読み書き可能な状態となります。&lt;/p&gt;
&lt;h2 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h2&gt;&lt;p&gt;先ほどと同じように &lt;code&gt;mount&lt;/code&gt; コマンドで確認してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抜粋ですが、以下の状態が確認できました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda2 on /media/root-ro &lt;span class="nb"&gt;type&lt;/span&gt; ext4 &lt;span class="o"&gt;(&lt;/span&gt;ro,relatime&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmpfs-root on /media/root-rw &lt;span class="nb"&gt;type&lt;/span&gt; tmpfs &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,inode64&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overlayroot on / &lt;span class="nb"&gt;type&lt;/span&gt; overlay &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,lowerdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-ro,upperdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-rw/overlay,workdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-rw/overlay-workdir/_&lt;span class="o"&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;/media/root-ro&lt;/code&gt; に読み込み専用(ro)の下位レイヤー(lowerdir) として設定され、tmpfs が &lt;code&gt;/media/root-rw/overlay&lt;/code&gt; に書き込み可能(rw)な上位レイヤー(upperdir) して設定されているのが確認できます。&lt;/p&gt;
&lt;h3 id="ファイルが消えることを確認"&gt;&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%8c%e6%b6%88%e3%81%88%e3%82%8b%e3%81%93%e3%81%a8%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;ファイルが消えることを確認
&lt;/h3&gt;&lt;p&gt;ついでに、ホームディレクトリに適当にファイルを作成し、再起動時にファイルが消えていることを確認します。&lt;/p&gt;
&lt;h2 id="overlayroot-の無効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e7%84%a1%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot の無効化
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除するか、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を編集して中身を &lt;code&gt;overlayroot=&amp;quot;&amp;quot;&lt;/code&gt; に変更すれば、overlayroot の無効化されます。&lt;/p&gt;
&lt;p&gt;しかし、現在は overlayroot が有効化になっている状況なので、このまま変更しても再起動後にはまた元に戻ってしまいます。&lt;br&gt;
そのため、この変更は一時的に書き込みを許可した状態で行う必要があります。&lt;br&gt;
一時的に書き込み可能な状態にするには以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo overlayroot-chroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除するか、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を編集して中身を &lt;code&gt;overlayroot=&amp;quot;&amp;quot;&lt;/code&gt; に変更します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rm /etc/overlayroot.local.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;exit&lt;/code&gt; でシェルから抜ければ書き込み可能状態は終了します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動後、overlayroot が無効状態になっています。&lt;/p&gt;
&lt;h2 id="grub-メニューで時間がかかることの対策"&gt;&lt;a href="#grub-%e3%83%a1%e3%83%8b%e3%83%a5%e3%83%bc%e3%81%a7%e6%99%82%e9%96%93%e3%81%8c%e3%81%8b%e3%81%8b%e3%82%8b%e3%81%93%e3%81%a8%e3%81%ae%e5%af%be%e7%ad%96" class="header-anchor"&gt;&lt;/a&gt;GRUB メニューで時間がかかることの対策
&lt;/h2&gt;&lt;p&gt;overlayroot を有効にした状態で再起動すると、GRUB メニューが表示され、30秒ほど待たされるようになります。&lt;br&gt;
詳細は以下をご参照ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;起動が30秒も遅くなるのは困るので、以下を参考にして GRUB の設定を変更しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/" target="_blank" rel="noopener"
 &gt;https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/" target="_blank" rel="noopener"
 &gt;https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;※以下は overlayroot を無効にした状態で行う必要があります！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/default/grub&lt;/code&gt; をエディタで開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/default/grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定を反映するために以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo grub-mkconfig -o /boot/grub/grub.cfg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで overlayroot を有効にしても起動時間は変わらなくなりました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/" target="_blank" rel="noopener"
 &gt;https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/" target="_blank" rel="noopener"
 &gt;https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu に GitLab-Runner を直接インストールする</title><link>https://blog.ponkotools.com/posts/2022/04/14/gitlab-runner/</link><pubDate>Thu, 14 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/14/gitlab-runner/</guid><description>&lt;p&gt;docker で GitLab-Runner を動かしたことはありましたが、今回初めてホストに直接インストールしました。&lt;/p&gt;
&lt;p&gt;公式ドキュメントは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;h3 id="apt-でインストール"&gt;&lt;a href="#apt-%e3%81%a7%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;apt でインストール
&lt;/h3&gt;&lt;p&gt;まずはリポジトリを追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -L &lt;span class="s2"&gt;&amp;#34;https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;apt でインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install gitlab-runner
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、この方法でインストールしたら結構古いバージョン (11.2.0) がインストールされてしまいました。&lt;br&gt;
最新のバージョンは 14.9.1 のはずなんですが・・・。&lt;/p&gt;
&lt;p&gt;今動かしている GitLab と互換性がなく上手く動かなったので、最終的には次に示すように deb パッケージからインストールしました。&lt;/p&gt;
&lt;h3 id="deb-パッケージからインストール"&gt;&lt;a href="#deb-%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%81%8b%e3%82%89%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;deb パッケージからインストール
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/linux-manually.html" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/linux-manually.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドキュメントだと curl を使うようになっていますが、上手くダウンロードできなかったのと、環境変数 &lt;code&gt;arch&lt;/code&gt; が空だったので、以下のコマンドでダウンロードしました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget &lt;span class="s2"&gt;&amp;#34;https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のコマンドでインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ dpkg -i gitlab-runner_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gitlab-への登録"&gt;&lt;a href="#gitlab-%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;GitLab への登録
&lt;/h2&gt;&lt;p&gt;インストールが完了したら Gitlab-Runner を GitLab に登録します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#linux" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/register/index.html#linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gitlab-runner register
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;対話形式で入力していきます。&lt;/p&gt;
&lt;p&gt;まず、GitLab の URL を指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci coordinator URL &lt;span class="o"&gt;(&lt;/span&gt;e.g. https://gitlab.com/&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://gitlab.example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にトークンを入力します。&lt;br&gt;
トークンは GitLab に管理者でログインし、Menu &amp;gt; Admin &amp;gt; Runner で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci token for this runner:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;U6YYzWyiQYzzfCdDH1dv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ランナーの詳細を入力します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci description &lt;span class="k"&gt;for&lt;/span&gt; this runner:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ランナーを識別するためのタグを指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci tags &lt;span class="k"&gt;for&lt;/span&gt; this runner &lt;span class="o"&gt;(&lt;/span&gt;comma separated&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次はオプションなので何も入力せず進みました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter optional maintenance note &lt;span class="k"&gt;for&lt;/span&gt; the runner:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後にスクリプトの実行方法を指定します。&lt;br&gt;
今回はホスト上で直接実行させたかったので、&lt;code&gt;shell&lt;/code&gt; を指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the executor: virtualbox, docker+machine, docker, docker-ssh, parallels, kubernetes, shell, ssh, docker-ssh+machine:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GitLab の Menu &amp;gt; Admin &amp;gt; Runner で登録されたことが確認できます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/linux-manually.html" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/linux-manually.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#linux" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/register/index.html#linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu に SSD をマウント</title><link>https://blog.ponkotools.com/posts/2022/04/09/ubuntu/</link><pubDate>Sat, 09 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/09/ubuntu/</guid><description>&lt;p&gt;Ubuntu 20.04 のマシンに 2.5インチの SSD を追加し、起動時に自動でマウントするようにしました。&lt;/p&gt;
&lt;p&gt;以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/suisuina/items/7b55a640fdd6b299aa46" target="_blank" rel="noopener"
 &gt;https://qiita.com/suisuina/items/7b55a640fdd6b299aa46&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="手順"&gt;&lt;a href="#%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;手順
&lt;/h2&gt;&lt;h2 id="uuid-の確認"&gt;&lt;a href="#uuid-%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;UUID の確認
&lt;/h2&gt;&lt;h3 id="gui-で確認"&gt;&lt;a href="#gui-%e3%81%a7%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;GUI で確認
&lt;/h3&gt;&lt;p&gt;Ubuntu の場合、メニューから &lt;code&gt;disks&lt;/code&gt; を起動すれば、GUI で確認可能です。&lt;/p&gt;
&lt;h3 id="コマンドで確認"&gt;&lt;a href="#%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;コマンドで確認
&lt;/h3&gt;&lt;p&gt;まずは以下のコマンドでウントしたい SSD のパスを探します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo fdisk -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Boot Start End Sectors Size Id Type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda1 &lt;span class="m"&gt;2048&lt;/span&gt; &lt;span class="m"&gt;312580095&lt;/span&gt; &lt;span class="m"&gt;312578048&lt;/span&gt; 149.1G &lt;span class="m"&gt;83&lt;/span&gt; Linux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回は &lt;code&gt;/dev/sda1&lt;/code&gt; でした。&lt;br&gt;
次に以下のコマンドで UUID を確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo blkid /dev/sda1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda1: &lt;span class="nv"&gt;LABEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssd&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;74172d4c-526a-42ac-9215-b6ea2dd93d9e&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ext4&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;PARTUUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cb5573bc-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="起動時にマウントするように設定"&gt;&lt;a href="#%e8%b5%b7%e5%8b%95%e6%99%82%e3%81%ab%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e3%81%99%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;起動時にマウントするように設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/fstab&lt;/code&gt; を編集します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;XXXXX /mnt/ssd auto defaults &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回マウント先は &lt;code&gt;/mnt/ssd&lt;/code&gt; としました。&lt;/p&gt;
&lt;p&gt;再起動して確認します。&lt;/p&gt;</description></item><item><title>Docker イメージの保存先を変更</title><link>https://blog.ponkotools.com/posts/2022/04/08/docker/</link><pubDate>Fri, 08 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/08/docker/</guid><description>&lt;p&gt;ストレージの容量が少ない場合など、新たに SSD を接続し、そちらに Docker イメージを保存する方法です。&lt;/p&gt;
&lt;p&gt;以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/atinfinity/lab/wiki/change_docker_image_directory" target="_blank" rel="noopener"
 &gt;https://github.com/atinfinity/lab/wiki/change_docker_image_directory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 18.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="手順"&gt;&lt;a href="#%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;手順
&lt;/h2&gt;&lt;h3 id="docker-サービスの停止"&gt;&lt;a href="#docker-%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e5%81%9c%e6%ad%a2" class="header-anchor"&gt;&lt;/a&gt;Docker サービスの停止
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="既存データの退避"&gt;&lt;a href="#%e6%97%a2%e5%ad%98%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e9%80%80%e9%81%bf" class="header-anchor"&gt;&lt;/a&gt;既存データの退避
&lt;/h3&gt;&lt;p&gt;既存のデータは &lt;code&gt;/var/lib/docker&lt;/code&gt; にあるので、これを外部ストレージに移動します。&lt;br&gt;
SSD は &lt;code&gt;/mnt/ssd&lt;/code&gt; にマウントしており、そこに &lt;code&gt;docker&lt;/code&gt; というディレクトリを作成してデータを移動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo mkdir /mnt/ssd/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rsync -aXS /var/lib/docker/. /mnt/ssd/docker/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定変更"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;設定変更
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; を開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/docker/daemon.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を記述して、保存先を &lt;code&gt;/mnt/ssd/docker&lt;/code&gt; に設定します．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;graph&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mnt/ssd/docker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定の反映"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%ae%e5%8f%8d%e6%98%a0" class="header-anchor"&gt;&lt;/a&gt;設定の反映
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="動作確認"&gt;&lt;a href="#%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;動作確認
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker info &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;Docker Root Dir&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Root Dir: /mnt/ssd/docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="古いデータを削除"&gt;&lt;a href="#%e5%8f%a4%e3%81%84%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;古いデータを削除
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/var/lib/docker&lt;/code&gt; を削除します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rm -rf /var/lib/docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="error-creating-overlay-mount-to-というエラーが表示される"&gt;&lt;a href="#error-creating-overlay-mount-to-%e3%81%a8%e3%81%84%e3%81%86%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;error creating overlay mount to&lt;/code&gt; というエラーが表示される
&lt;/h2&gt;&lt;p&gt;Docker コンテナを作成しようとした際に、&lt;code&gt;error creating overlay mount to&lt;/code&gt; みたいなエラーが表示されました。&lt;br&gt;
私の場合はファイルシステムが NTFS だったことが原因でした。&lt;br&gt;
EXT4 でフォーマットすれば正常にできました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/atinfinity/lab/wiki/change_docker_image_directory" target="_blank" rel="noopener"
 &gt;https://github.com/atinfinity/lab/wiki/change_docker_image_directory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>nvidia-docker2 (nvidia-container-toolkit) のインストール</title><link>https://blog.ponkotools.com/posts/2022/03/31/nvidia-docker/</link><pubDate>Thu, 31 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/31/nvidia-docker/</guid><description>&lt;p&gt;Docker コンテナ内で GPU を使うためには NVIDIA Container Toolkit をインストールする必要があります。&lt;/p&gt;
&lt;p&gt;公式ドキュメントは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール方法"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;インストール方法
&lt;/h2&gt;&lt;p&gt;上記のページにインストール手順も書いてあります。&lt;br&gt;
（以下は見やすくするためにコマンドを分割しています。）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;distribution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ID$VERSION_ID&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s -L https://nvidia.github.io/libnvidia-container/&lt;span class="nv"&gt;$distribution&lt;/span&gt;/libnvidia-container.list &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y nvidia-docker2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;nvidia-docker2&lt;/code&gt; がトップレベルのパッケージらしいので、インストールするときは &lt;code&gt;nvidia-container-toolkit&lt;/code&gt; ではなく &lt;code&gt;nvidia-docker2&lt;/code&gt; を指定するようです。&lt;br&gt;
ここらへん以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tkusumi/items/f275f0737fb5b261a868" target="_blank" rel="noopener"
 &gt;https://qiita.com/tkusumi/items/f275f0737fb5b261a868&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まぁ公式ドキュメントが &lt;code&gt;nvidia-docker2&lt;/code&gt; をインストールするようになっていますし、それに従えばよいかと。&lt;/p&gt;
&lt;p&gt;また、古い記事では &lt;code&gt;nvidia-docker&lt;/code&gt; と書いてあったりしますが、ここらへんの変遷は以下が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ksasaki/items/b20a785e1a0f610efa08" target="_blank" rel="noopener"
 &gt;https://qiita.com/ksasaki/items/b20a785e1a0f610efa08&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="動作確認"&gt;&lt;a href="#%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;動作確認
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nvidia-container-cli&lt;/code&gt; で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-container-cli --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cli-version: 1.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lib-version: 1.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build date: 2022-02-14T12:02+00:00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build revision: abd4e14d8cb923e2a70b7dcfee55fbc16bffa353
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build compiler: x86_64-linux-gnu-gcc-7 7.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build platform: x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build flags: -D_GNU_SOURCE -D_FORTIFY_SOURCE&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; -DNDEBUG -std&lt;span class="o"&gt;=&lt;/span&gt;gnu11 -O2 -g -fdata-sections -ffunction-sections -fplan9-extensions -fstack-protector -fno-strict-aliasing -fvisibility&lt;span class="o"&gt;=&lt;/span&gt;hidden -Wall -Wextra -Wcast-align -Wpointer-arith -Wmissing-prototypes -Wnonnull -Wwrite-strings -Wlogical-op -Wformat&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; -Wmissing-format-attribute -Winit-self -Wshadow -Wstrict-prototypes -Wunreachable-code -Wconversion -Wsign-conversion -Wno-unknown-warning-option -Wno-format-extra-args -Wno-gnu-alignof-expression -Wl,-zrelro -Wl,-znow -Wl,-zdefs -Wl,--gc-sections
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-container-cli info
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NVRM version: 470.103.01
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CUDA version: 11.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Index: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Minor: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Model: NVIDIA GeForce RTX &lt;span class="m"&gt;3080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Brand: GeForce
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GPU UUID: GPU-565ac97c-fe71-f49b-1ac0-7ac93c7dab8d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus Location: 00000000:01:00.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Architecture: 8.6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://takake-blog.com/ubuntu-2004-install-nvidiacontainertoolkit/" target="_blank" rel="noopener"
 &gt;https://takake-blog.com/ubuntu-2004-install-nvidiacontainertoolkit/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tkusumi/items/f275f0737fb5b261a868" target="_blank" rel="noopener"
 &gt;https://qiita.com/tkusumi/items/f275f0737fb5b261a868&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ksasaki/items/b20a785e1a0f610efa08" target="_blank" rel="noopener"
 &gt;https://qiita.com/ksasaki/items/b20a785e1a0f610efa08&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gangannikki.hatenadiary.jp/entry/2020/09/26/200000" target="_blank" rel="noopener"
 &gt;https://gangannikki.hatenadiary.jp/entry/2020/09/26/200000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu 20.04 に古い NVIDIA Driver と CUDA をインストール</title><link>https://blog.ponkotools.com/posts/2022/03/30/ubuntu-nvidia/</link><pubDate>Wed, 30 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/30/ubuntu-nvidia/</guid><description>&lt;p&gt;古いグラフィックボードが手に入ったので、それに対応した NVIDIA Driver および CUDA をインストールしたときのメモです。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;GPU：NVIDIA Quadro 2000&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nvidia-driver-のインストール"&gt;&lt;a href="#nvidia-driver-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;NVIDIA Driver のインストール
&lt;/h2&gt;&lt;p&gt;以下のコマンドでインストールするドライバーのバージョンがわかります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ubuntu-drivers devices
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;または、以下のページで必要なドライバーのバージョンを調べることもできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.nvidia.com/Download/index.aspx" target="_blank" rel="noopener"
 &gt;https://www.nvidia.com/Download/index.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上より必要なドライバーは 390 だとわかりました。&lt;br&gt;
ドライバーは上記のページからダウンロードできますが、Ubuntu の場合は apt でインストールしたほうが楽です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt -y install nvidia-driver-390
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一度再起動し、&lt;code&gt;nvidia-smi&lt;/code&gt; でドライバーが正しくインストールされたか確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tue Mar &lt;span class="m"&gt;15&lt;/span&gt; 13:51:47 &lt;span class="m"&gt;2022&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; NVIDIA-SMI 390.144 Driver Version: 390.144 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU Name Persistence-M&lt;span class="p"&gt;|&lt;/span&gt; Bus-Id Disp.A &lt;span class="p"&gt;|&lt;/span&gt; Volatile Uncorr. ECC &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Fan Temp Perf Pwr:Usage/Cap&lt;span class="p"&gt;|&lt;/span&gt; Memory-Usage &lt;span class="p"&gt;|&lt;/span&gt; GPU-Util Compute M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;===============================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; Quadro &lt;span class="m"&gt;2000&lt;/span&gt; Off &lt;span class="p"&gt;|&lt;/span&gt; 00000000:01:00.0 On &lt;span class="p"&gt;|&lt;/span&gt; N/A &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; 30% 48C P12 N/A / N/A &lt;span class="p"&gt;|&lt;/span&gt; 577MiB / 964MiB &lt;span class="p"&gt;|&lt;/span&gt; 0% Default &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Processes: GPU Memory &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU PID Type Process name Usage &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=============================================================================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1193&lt;/span&gt; G /usr/lib/xorg/Xorg 141MiB &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2102&lt;/span&gt; G /usr/lib/xorg/Xorg 220MiB &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2276&lt;/span&gt; G /usr/bin/gnome-shell 206MiB &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cuda-のインストール"&gt;&lt;a href="#cuda-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;CUDA のインストール
&lt;/h2&gt;&lt;p&gt;NVIDIA Driver と CUDA のバージョンの関係は以下で確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回インストールした NVIDIA Driver は 390.144 なので、CUDA は 9.1 インストールします。&lt;/p&gt;
&lt;p&gt;CUDA のインストール方法ですが、以下でプラットフォームに応じた方法を調べることができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.nvidia.com/cuda-downloads" target="_blank" rel="noopener"
 &gt;https://developer.nvidia.com/cuda-downloads&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu 20.04 では以下が表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo add-apt-repository &lt;span class="s2"&gt;&amp;#34;deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get -y install cuda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、このコマンドでは CUDA のバージョンが指定されていないため、実行してしまうと最新の CUDA がインストールされてしまいます。&lt;br&gt;
なので、次に示すように、バージョン 9.1 を指定してインストールしてやります。&lt;/p&gt;
&lt;h2 id="cuda-91-のインストール"&gt;&lt;a href="#cuda-91-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;CUDA 9.1 のインストール
&lt;/h2&gt;&lt;p&gt;CUDA 9.1 をインストールしたいところですが、apt でインストールできる CUDA の一覧を見てみても 9.1 はありません。&lt;br&gt;
なので、以下を参考に Ubuntu 16.04 用のパッケージをインストールしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yukoba/items/3692f1cb677b2383c983" target="_blank" rel="noopener"
 &gt;https://qiita.com/yukoba/items/3692f1cb677b2383c983&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e" target="_blank" rel="noopener"
 &gt;https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -sL http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt --fix-broken install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install cuda-toolkit-9-1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rm cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意点として、apt で &lt;code&gt;cuda-9-1&lt;/code&gt; をインストールすると NVIDIA Driver も最新に更新されてしまうので、&lt;code&gt;cuda-toolkit-9-1&lt;/code&gt; をインストールする必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/takeshita/articles/a02402e59d72a7" target="_blank" rel="noopener"
 &gt;https://zenn.dev/takeshita/articles/a02402e59d72a7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インストールが完了したら、&lt;code&gt;~/.bashrc&lt;/code&gt; の末尾に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/cuda/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/cuda/lib64:&lt;/span&gt;&lt;span class="nv"&gt;$LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで再起動します。&lt;/p&gt;
&lt;h3 id="cuda-バージョンの確認"&gt;&lt;a href="#cuda-%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;CUDA バージョンの確認
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; で確認できるはずなのですが、私の環境では何も表示されました。&lt;br&gt;
ただ、&lt;code&gt;nvcc&lt;/code&gt; では確認できたので、インストールはされているんじゃないかと。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvcc -V
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvcc: NVIDIA &lt;span class="o"&gt;(&lt;/span&gt;R&lt;span class="o"&gt;)&lt;/span&gt; Cuda compiler driver
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 2005-2017 NVIDIA Corporation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Built on Fri_Nov__3_21:07:56_CDT_2017
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cuda compilation tools, release 9.1, V9.1.85
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、以下でも確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /usr/local/cuda/version.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CUDA Version 9.1.85
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="cuda-のインストール後に-nvidia-driver-がおかしくなってしまった場合"&gt;&lt;a href="#cuda-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e5%be%8c%e3%81%ab-nvidia-driver-%e3%81%8c%e3%81%8a%e3%81%8b%e3%81%97%e3%81%8f%e3%81%aa%e3%81%a3%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;CUDA のインストール後に NVIDIA Driver がおかしくなってしまった場合
&lt;/h3&gt;&lt;p&gt;前述したように、NVIDIA Driver と CUDA のバージョンが合っていなければ動作がおかしくなります。&lt;/p&gt;
&lt;p&gt;以下を参考に NVIDIA Driver と CUDA を削除してからインストールをやり直す必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/not_charge/items/dce7512544a7ead04bca" target="_blank" rel="noopener"
 &gt;https://qiita.com/not_charge/items/dce7512544a7ead04bca&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get --purge remove nvidia-*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get --purge remove cuda-*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-コンテナ内で-gpu-が使えるか確認しようとして諦めた"&gt;&lt;a href="#docker-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e5%86%85%e3%81%a7-gpu-%e3%81%8c%e4%bd%bf%e3%81%88%e3%82%8b%e3%81%8b%e7%a2%ba%e8%aa%8d%e3%81%97%e3%82%88%e3%81%86%e3%81%a8%e3%81%97%e3%81%a6%e8%ab%a6%e3%82%81%e3%81%9f" class="header-anchor"&gt;&lt;/a&gt;docker コンテナ内で GPU が使えるか確認しようとして諦めた
&lt;/h2&gt;&lt;p&gt;せっかく CUDA がインストールできたので、機械学習で GPU が使えそうか確認します。&lt;br&gt;
まず pytorch を使い、ホスト上で以下のコードで確認してみました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると、以下のようにエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;UserWarning: CUDA initialization: The NVIDIA driver on your system is too old &lt;span class="o"&gt;(&lt;/span&gt;found version 9010&lt;span class="o"&gt;)&lt;/span&gt;. Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. &lt;span class="o"&gt;(&lt;/span&gt;Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:115.&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; torch._C._cuda_getDeviceCount&lt;span class="o"&gt;()&lt;/span&gt; &amp;gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PyTorch のバージョンも CUDA に合わせる必要があるようです。&lt;br&gt;
以下のページを参考に pytorch のバージョンを指定してインストールしてみます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://varhowto.com/install-pytorch-cuda-9-1/" target="_blank" rel="noopener"
 &gt;https://varhowto.com/install-pytorch-cuda-9-1/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すると以下のエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pip3 install &lt;span class="nv"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;1.1.0 &lt;span class="nv"&gt;torchvision&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.3.0 -f https://download.pytorch.org/whl/cu90/torch_stable.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Looking in links: https://download.pytorch.org/whl/cu90/torch_stable.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/share/python-wheels/urllib3-1.25.8-py2.py3-none-any.whl/urllib3/connectionpool.py:999: InsecureRequestWarning: Unverified HTTPS request is being made to host &lt;span class="s1"&gt;&amp;#39;172.20.16.253&amp;#39;&lt;/span&gt;. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR: Could not find a version that satisfies the requirement &lt;span class="nv"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;1.1.0 &lt;span class="o"&gt;(&lt;/span&gt;from versions: 1.4.0, 1.5.0, 1.5.1, 1.6.0, 1.7.0, 1.7.1, 1.8.0, 1.8.1, 1.9.0, 1.9.1, 1.10.0, 1.10.1, 1.10.2, 1.11.0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR: No matching distribution found &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;1.1.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここらへんから面倒になり、先に docker コンテナを作ることにしました。&lt;br&gt;
まずは NVIDIA Container Toolkit をインストールしようと以下のページを見ると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;動作要件が以下のようになっていました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GNU/Linux x86_64 with kernel version &amp;gt; 3.10&lt;/li&gt;
&lt;li&gt;Docker &amp;gt;= 19.03 (recommended, but some distributions may include older versions of Docker. The minimum supported version is 1.12)&lt;/li&gt;
&lt;li&gt;NVIDIA GPU with Architecture &amp;gt;= Kepler (or compute capability 3.0)&lt;/li&gt;
&lt;li&gt;NVIDIA Linux drivers &amp;gt;= 418.81.07 (Note that older driver releases or branches are unsupported.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;というわけでここで諦めました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.nvidia.com/Download/index.aspx" target="_blank" rel="noopener"
 &gt;https://www.nvidia.com/Download/index.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e" target="_blank" rel="noopener"
 &gt;https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/porizou1/items/74d8264d6381ee2941bd" target="_blank" rel="noopener"
 &gt;https://qiita.com/porizou1/items/74d8264d6381ee2941bd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/abetomo/items/a114a3c423f110460549" target="_blank" rel="noopener"
 &gt;https://qiita.com/abetomo/items/a114a3c423f110460549&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://shiba6v.hatenablog.com/entry/2018/10/18/021749" target="_blank" rel="noopener"
 &gt;https://shiba6v.hatenablog.com/entry/2018/10/18/021749&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www-home.htwg-konstanz.de/~MFERTIG/files/tools/NVIDIA_CUDA_Toolkit_9_1_Ubuntu_20_04_2021.txt" target="_blank" rel="noopener"
 &gt;http://www-home.htwg-konstanz.de/~MFERTIG/files/tools/NVIDIA_CUDA_Toolkit_9_1_Ubuntu_20_04_2021.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Windows PC から NAS に接続できなくなった</title><link>https://blog.ponkotools.com/posts/2022/03/19/windows-nas/</link><pubDate>Sat, 19 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/19/windows-nas/</guid><description>&lt;p&gt;ちょっと古めの NAS を持っているのですが、Windows 10 の PC からアクセスできなくなりました。&lt;/p&gt;
&lt;p&gt;以前はアクセスできていたはずなのですが、いつの間にかアクセスできなくなっていました。
スマホからはアクセスできているので機器の故障ではなく、またネットワークに問題がないことも確認済みです。&lt;/p&gt;
&lt;p&gt;んで、いろいろ調べていたのですが、どうやらその NAS には SMB1 のプロトコルでアクセスする必要があるみたいで、Windows 10 では機能を有効化しないといけないようです。&lt;/p&gt;
&lt;p&gt;上述したように以前はアクセスできていたはずなんですけど・・・、Windows Update かなんかで設定が変わったんですかね？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[スタート]-[Windows システム ツール]-[コントロール パネル] を開く&lt;/li&gt;
&lt;li&gt;[プログラム]-[プログラムと機能] を開く&lt;/li&gt;
&lt;li&gt;[Windows の機能の有効化または無効化] をクリック&lt;/li&gt;
&lt;li&gt;「SMB 1.0/CIFS ファイル共有のサポート」の「SMB 1.0/CIFS クライアント」にチェックを入れて [OK] をクリック&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvBkFniSF_x1RQXALeUAKTtCCXzOmuLyx44Dhabi8ZyiIgVTjqsAVhlsM_pOdUjUO-rdebPkwFXm9AXMC9MMVo14BAFM7Gx0U9tEQpYMTuHqxiCPy3xDHPuvLNyZIqMQWvwf9ALz-yDSR5dnelIov7m7xDRTZVJOytFEislqf6yM9TK7WWSxU5Ue08/s694/smb.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" width="320" data-original-height="615" data-original-width="694" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvBkFniSF_x1RQXALeUAKTtCCXzOmuLyx44Dhabi8ZyiIgVTjqsAVhlsM_pOdUjUO-rdebPkwFXm9AXMC9MMVo14BAFM7Gx0U9tEQpYMTuHqxiCPy3xDHPuvLNyZIqMQWvwf9ALz-yDSR5dnelIov7m7xDRTZVJOytFEislqf6yM9TK7WWSxU5Ue08/s320/smb.png"/&gt;&lt;/a&gt;&lt;/div&gt;
1. [今すぐ再起動]をクリックする。
&lt;p&gt;再起動後にアクセスできるようになりました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.iodata.jp/support/qanda/answer/s30023.htm" target="_blank" rel="noopener"
 &gt;https://www.iodata.jp/support/qanda/answer/s30023.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.iodata.jp/support/qanda/answer/s30381.htm" target="_blank" rel="noopener"
 &gt;https://www.iodata.jp/support/qanda/answer/s30381.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu にリモートデスクトップ接続する</title><link>https://blog.ponkotools.com/posts/2022/03/13/ubuntu/</link><pubDate>Sun, 13 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/13/ubuntu/</guid><description>&lt;p&gt;Windows から Ubuntu にリモートデスクトップで接続する方法です。&lt;/p&gt;
&lt;h2 id="ubuntu-側"&gt;&lt;a href="#ubuntu-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Ubuntu 側
&lt;/h2&gt;&lt;p&gt;Xrdp サーバーをインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt -y install xrdp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windows-側"&gt;&lt;a href="#windows-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Windows 側
&lt;/h2&gt;&lt;p&gt;リモートデスクトップで Ubuntu の IP アドレスを入力して接続します。&lt;/p&gt;
&lt;h3 id="画面が真っ暗な場合"&gt;&lt;a href="#%e7%94%bb%e9%9d%a2%e3%81%8c%e7%9c%9f%e3%81%a3%e6%9a%97%e3%81%aa%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;画面が真っ暗な場合
&lt;/h3&gt;&lt;p&gt;同じユーザーで既に Ubuntu にログイン済みの場合、真っ暗な画面が表示されます。&lt;/p&gt;
&lt;p&gt;Ubuntu 側で一度ログアウトするか、別途 SSH などで Ubuntu に接続し、以下のコマンドで gnome-session を終了させます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pkill gnome-session
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.server-world.info/query?os=Ubuntu_20.04&amp;amp;p=desktop&amp;amp;f=6" target="_blank" rel="noopener"
 &gt;https://www.server-world.info/query?os=Ubuntu_20.04&amp;p=desktop&amp;f=6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://bracket.hatenablog.com/entry/2020/10/05/031057" target="_blank" rel="noopener"
 &gt;https://bracket.hatenablog.com/entry/2020/10/05/031057&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntuでデスクトップにアプリのショートカットを作る（デスクトップエントリ）</title><link>https://blog.ponkotools.com/posts/2022/02/12/ubuntu/</link><pubDate>Sat, 12 Feb 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/02/12/ubuntu/</guid><description>&lt;p&gt;今までやったことなかったのでメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="desktop-ファイルの作成"&gt;&lt;a href="#desktop-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;.desktop ファイルの作成
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;.desktop&lt;/code&gt; という拡張子でファイルを作成し、デスクトップに配置します。&lt;br&gt;
内容は以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env xdg-open
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Entry&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/user/run.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application Name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Test Application
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/user/Pictures/icon.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内容については省略します。&lt;/p&gt;
&lt;h2 id="実行権限の付与"&gt;&lt;a href="#%e5%ae%9f%e8%a1%8c%e6%a8%a9%e9%99%90%e3%81%ae%e4%bb%98%e4%b8%8e" class="header-anchor"&gt;&lt;/a&gt;実行権限の付与
&lt;/h2&gt;&lt;p&gt;このファイルに実行権限を与えます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;755&lt;/span&gt; test.desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;デスクトップでこのファイルをダブルクリックすると、「起動を許可」というメニューがあるので、それを選択します。&lt;br&gt;
すると、アイコンが変わり、ダブルクリックでアプリケーションが起動するようになります。&lt;/p&gt;
&lt;h2 id="起動の許可が表示されないテキストエディタが起動する場合"&gt;&lt;a href="#%e8%b5%b7%e5%8b%95%e3%81%ae%e8%a8%b1%e5%8f%af%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%81%aa%e3%81%84%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e3%81%8c%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;起動の許可が表示されない、テキストエディタが起動する場合
&lt;/h2&gt;&lt;p&gt;私の場合の例ですが、&lt;code&gt;.desktop&lt;/code&gt; ファイルの &lt;code&gt;Exec&lt;/code&gt; の項目でシェルスクリプトファイルを指定していた場合に、この状況が発生しました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Exce&lt;/code&gt; で指定しているシェルスクリプトファイルにも実行権限を与えてやると解決しました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://appcel.sblo.jp/article/187826978.html" target="_blank" rel="noopener"
 &gt;http://appcel.sblo.jp/article/187826978.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker-compose での環境変数の参照方法</title><link>https://blog.ponkotools.com/posts/2021/10/29/docker-compose/</link><pubDate>Fri, 29 Oct 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/10/29/docker-compose/</guid><description>&lt;p&gt;docker コンテナ内でホストと同じユーザーIDを指定するために、ホストの環境変数を参照していました。&lt;/p&gt;
&lt;p&gt;例えば、docker コンテナ内でホストと同じユーザーIDを指定するために以下のように記述していましたが、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e LOCAL_UID=$(id -u $USER) \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e LOCAL_GID=$(id -g $USER) \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hoge:0 bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを docker-compose.yml ではどう書けばいいのか？
結果的には以下のように記述することで上手くいきました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;environment: 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - LOCAL_UID=${id:-u ${USER}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - LOCAL_GID=${id:-g ${USER}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/reflet/items/a96752b4cd3838ea6932" target="_blank" rel="noopener"
 &gt;https://qiita.com/reflet/items/a96752b4cd3838ea6932&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>RabbitVCS のインストール</title><link>https://blog.ponkotools.com/posts/2021/07/01/rabbit-vcs/</link><pubDate>Thu, 01 Jul 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/07/01/rabbit-vcs/</guid><description>&lt;p&gt;Windows では TortoiseSVN と TortoiseGit を使っていたので、Linux でも GUI で良いのがないかなと探していたら、RabbitVCS というのが Tortoise に似た感じだったので、インストールしてみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;p&gt;以下に説明があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://wiki.rabbitvcs.org/wiki/install/ubuntu" target="_blank" rel="noopener"
 &gt;http://wiki.rabbitvcs.org/wiki/install/ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下のコマンドを実行するだけでインストールできました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install rabbitvcs-nautilus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これ一つで &lt;code&gt;RabbitVCS SVN&lt;/code&gt; &lt;code&gt;RabbitVCS Git&lt;/code&gt; &lt;code&gt;RabbitVCS Hg&lt;/code&gt; が使えるようになるっぽい。&lt;/p&gt;
&lt;p&gt;あとはファイル比較用の Meld とかいうツールも勝手に入ってました。&lt;/p&gt;
&lt;p&gt;再起動後には Tortoise と同じように、フォルダにアイコンが表示されるようになっていました。&lt;/p&gt;
&lt;h2 id="所感"&gt;&lt;a href="#%e6%89%80%e6%84%9f" class="header-anchor"&gt;&lt;/a&gt;所感
&lt;/h2&gt;&lt;p&gt;まだ全然使っていませんが、とりあえず最新のコードをプルしたりだとか、コミットログを見たりだとか、ファイルの差分を閲覧する分には困っていません。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://wiki.rabbitvcs.org/wiki/install/ubuntu" target="_blank" rel="noopener"
 &gt;http://wiki.rabbitvcs.org/wiki/install/ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ameblo.jp/mizuhokuzuhara/entry-12581847170.html" target="_blank" rel="noopener"
 &gt;https://ameblo.jp/mizuhokuzuhara/entry-12581847170.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux で USB メモリをマウントする</title><link>https://blog.ponkotools.com/posts/2021/06/16/linux/</link><pubDate>Wed, 16 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/16/linux/</guid><description>&lt;p&gt;Ubuntu とかだと USB メモリを挿したら自動でマウントされるので何も意識しなくもいいのですが、いざ他の Linux で USB メモリを挿したときにマウントってどうやるんだっけ？となったのでメモしておきます。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Wind River Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="マウント方法"&gt;&lt;a href="#%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;マウント方法
&lt;/h2&gt;&lt;p&gt;USB メモリを挿すと、&lt;code&gt;/dev/sda&lt;/code&gt; とか &lt;code&gt;/dev/sdb&lt;/code&gt; とかいうファイル名で認識されます。&lt;br&gt;
これを &lt;code&gt;/mnt/usb&lt;/code&gt; にマウントしてやります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir /mnt/usb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount /dev/sdb /mnt/usb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アンマウント方法"&gt;&lt;a href="#%e3%82%a2%e3%83%b3%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;アンマウント方法
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ umount /mnt/usb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>[python] ログを syslog に出力する</title><link>https://blog.ponkotools.com/posts/2021/06/15/python-syslog/</link><pubDate>Tue, 15 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/15/python-syslog/</guid><description>&lt;p&gt;python でログをファイルに出力する記事を書きましたが、Linux には syslog があるので、アプリケーションのログも syslog に出力してみます。&lt;/p&gt;
&lt;p&gt;ちなみに前回の記事は&lt;a class="link" href="https://kuttsun.blogspot.com/2021/06/python.html" target="_blank" rel="noopener"
 &gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;python 3.8.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="とりあえず簡単にやりたいなら"&gt;&lt;a href="#%e3%81%a8%e3%82%8a%e3%81%82%e3%81%88%e3%81%9a%e7%b0%a1%e5%8d%98%e3%81%ab%e3%82%84%e3%82%8a%e3%81%9f%e3%81%84%e3%81%aa%e3%82%89" class="header-anchor"&gt;&lt;/a&gt;とりあえず簡単にやりたいなら
&lt;/h2&gt;&lt;p&gt;以下で OK です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;This is a test message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LOG_INFO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Test message at INFO priority&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、これだと syslog 固定なので、ログの出力先を変更したい場合に大変です。&lt;br&gt;
なので、logger を使って抽象化したほうが良いと思います。&lt;/p&gt;
&lt;h2 id="logger-の出力先を-syslog-にする"&gt;&lt;a href="#logger-%e3%81%ae%e5%87%ba%e5%8a%9b%e5%85%88%e3%82%92-syslog-%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;logger の出力先を syslog にする
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DEBUG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SysLogHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/dev/log&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#basicConfig(level=DEBUG, handlers=[handlers.SysLogHandler(address=(&amp;#34;127.0.0.1&amp;#34;,514))])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;MyLogger&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this is info&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this is debug&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;critical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this is critical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="標準出力にも出力したい"&gt;&lt;a href="#%e6%a8%99%e6%ba%96%e5%87%ba%e5%8a%9b%e3%81%ab%e3%82%82%e5%87%ba%e5%8a%9b%e3%81%97%e3%81%9f%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;標準出力にも出力したい
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;handlers&lt;/code&gt; に &lt;code&gt;StreamHandler&lt;/code&gt; を追加すれば OK です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;StreamHandler&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SysLogHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/dev/log&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#basicConfig(level=DEBUG, handlers=[StreamHandler(), handlers.SysLogHandler(address=(&amp;#34;127.0.0.1&amp;#34;,514))])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;MyLogger&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this is info&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this is debug&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;critical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;this is critical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-コンテナ内のアプリのログをホストの-syslog-に追加する"&gt;&lt;a href="#docker-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e5%86%85%e3%81%ae%e3%82%a2%e3%83%97%e3%83%aa%e3%81%ae%e3%83%ad%e3%82%b0%e3%82%92%e3%83%9b%e3%82%b9%e3%83%88%e3%81%ae-syslog-%e3%81%ab%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;Docker コンテナ内のアプリのログをホストの syslog に追加する
&lt;/h2&gt;&lt;p&gt;以下の記事で書いています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/12/python-syslog.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/12/python-syslog.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.python.org/ja/3/library/logging.html" target="_blank" rel="noopener"
 &gt;https://docs.python.org/ja/3/library/logging.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/3968669/how-to-configure-logging-to-syslog-in-python" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/3968669/how-to-configure-logging-to-syslog-in-python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/amedama/items/b856b2f30c2f38665701" target="_blank" rel="noopener"
 &gt;https://qiita.com/amedama/items/b856b2f30c2f38665701&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.python.org/ja/3/library/syslog.html" target="_blank" rel="noopener"
 &gt;https://docs.python.org/ja/3/library/syslog.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Git で HTTPS を使う場合のアカウント情報を記憶させる</title><link>https://blog.ponkotools.com/posts/2021/06/01/git/</link><pubDate>Tue, 01 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/01/git/</guid><description>&lt;p&gt;毎回打つのが面倒なので。&lt;/p&gt;
&lt;h2 id="windows-の場合"&gt;&lt;a href="#windows-%e3%81%ae%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;Windows の場合
&lt;/h2&gt;&lt;p&gt;クローンするときにユーザー名とパスワードが聞かれますが、一度入力すると資格情報マネージャーに登録されるので、２回目以降はユーザー名とパスワードの入力が不要になります。&lt;br&gt;
もし入力間違いをしてしまった場合は、資格情報マネージャーで削除すれば OK です。&lt;/p&gt;
&lt;h2 id="linux-の場合"&gt;&lt;a href="#linux-%e3%81%ae%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;Linux の場合
&lt;/h2&gt;&lt;p&gt;Ubuntu 20.04 で確認しました。&lt;br&gt;
&lt;code&gt;libsecret&lt;/code&gt; をインストールして、&lt;code&gt;credential.helper&lt;/code&gt; に設定してやります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install libsecret-1-0 libsecret-1-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd /usr/share/doc/git/contrib/credential/libsecret
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、一度ユーザー名とパスワードを入力したら、次回以降は入力不要になります。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.katsubemakito.net/git/git-config-1st" target="_blank" rel="noopener"
 &gt;https://blog.katsubemakito.net/git/git-config-1st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Tebasaki314/items/da230ccc9ac891f4ba25" target="_blank" rel="noopener"
 &gt;https://qiita.com/Tebasaki314/items/da230ccc9ac891f4ba25&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>