RHEL 10.0 で epel-release を有効にする
sudo dnf update -y
sudo subscription-manager repos --enable codeready-builder-for-rhel-10-x86_64-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
sudo dnf update -y
sudo subscription-manager repos --enable codeready-builder-for-rhel-10-x86_64-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
公式ページから AMI を入手します。
https://rockylinux.org/ja-JP/download
インスタンスに設定するアーキテクチャー (ARM (aarch64)) を選び、 Cloud Images の AWS AMI を選択。

バージョン番号でフィルターを掛け、条件にあったものを探す。

AMI ID はコピーできないので、デプロイボタンをクリックし、AWS コンソールからコピーする。
AMI ID で検索を掛けると、でてくる

所有者でフィルタリングしたほうが良いかも。
所有者 = 792107900819

ssh-keygen -t ed25519 コマンドを実行て公開鍵を作成し、.ssh/id_ed25519.pub をキーペアにインポートしておくNAT ゲートウェイよりも、パブリック IP アドレスのほうが安いので、Elastic IP を作成。
図にするとこんな感じで建てる。


EC2 Instance Connect エンドポイントを作成することで AWS CLI からログインできる。
というわけで、以下の条件で建てた。
PC のターミナルを開き、以下を実行。
aws ec2-instance-connect ssh --private-key-file .ssh/id_ed25519 --os-user rocky --instance-id i-*****************
Rocky Linux の AMI イメージには、Instance Connect パッケージがなく、マネジメントコンソールからの接続ができない。 そのため、パッケージをインストールする。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html を参考にパッケージをダウンロード。
curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect.rhel8.rpm -o /tmp/ec2-instance-connect.rpm
curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux.noarch.rpm -o /tmp/ec2-instance-connect-selinux.rpm
sudo dnf install -y /tmp/ec2-instance-connect.rpm /tmp/ec2-instance-connect-selinux.rpm
インストールが完了すると、マネコン上からアクセスできるようになる

CDK 作ったので載せておく。参考までに。
keyName (キーペア) の名前は変えておく。
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
export interface RockyLinuxStackProps extends cdk.StackProps {
}
export class RockyLinuxStack extends cdk.Stack {
public constructor(scope: cdk.App, id: string, props: RockyLinuxStackProps = {}) {
super(scope, id, props);
// Resources
const ec2dhcpOptions = new ec2.CfnDHCPOptions(this, 'EC2DHCPOptions', {
domainName: 'ap-south-1.compute.internal',
domainNameServers: [
'AmazonProvidedDNS',
],
],
});
ec2dhcpOptions.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2InternetGateway = new ec2.CfnInternetGateway(this, 'EC2InternetGateway', {
{
value: 'igw',
key: 'Name',
},
],
});
ec2InternetGateway.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2vpc = new ec2.CfnVPC(this, 'EC2VPC', {
cidrBlock: '10.0.0.0/16',
enableDnsSupport: true,
instanceTenancy: 'default',
enableDnsHostnames: true,
{
value: 'vpc',
key: 'Name',
},
],
});
ec2vpc.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2VPCGatewayAttachment = new ec2.CfnVPCGatewayAttachment(this, 'EC2VPCGatewayAttachment', {
vpcId: ec2vpc.ref,
internetGatewayId: ec2InternetGateway.ref,
});
ec2VPCGatewayAttachment.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2NetworkAcl = new ec2.CfnNetworkAcl(this, 'EC2NetworkAcl', {
vpcId: ec2vpc.ref,
],
});
ec2NetworkAcl.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2RouteTable = new ec2.CfnRouteTable(this, 'EC2RouteTable', {
vpcId: ec2vpc.ref,
});
ec2RouteTable.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2SecurityGroup = new ec2.CfnSecurityGroup(this, 'EC2SecurityGroup', {
groupDescription: 'launch-wizard-1 created 2025-04-27T00:11:58.641Z',
groupName: 'launch-wizard-1',
vpcId: ec2vpc.ref,
securityGroupIngress: [
{
cidrIp: '0.0.0.0/0',
ipProtocol: 'tcp',
fromPort: 22,
toPort: 22,
},
{
cidrIp: '0.0.0.0/0',
ipProtocol: 'icmp',
fromPort: 8,
toPort: -1,
},
],
securityGroupEgress: [
{
cidrIp: '0.0.0.0/0',
ipProtocol: '-1',
fromPort: -1,
toPort: -1,
},
],
});
ec2SecurityGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2Subnet = new ec2.CfnSubnet(this, 'EC2Subnet', {
vpcId: ec2vpc.ref,
mapPublicIpOnLaunch: false,
enableDns64: false,
availabilityZoneId: 'aps1-az1',
privateDnsNameOptionsOnLaunch: {
EnableResourceNameDnsARecord: false,
HostnameType: 'ip-name',
EnableResourceNameDnsAAAARecord: false,
},
cidrBlock: '10.0.0.0/20',
ipv6Native: false,
{
value: 'subnet-public1-ap-south-1a',
key: 'Name',
},
],
});
ec2Subnet.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2InstanceConnectEndpoint = new ec2.CfnInstanceConnectEndpoint(this, 'EC2InstanceConnectEndpoint', {
preserveClientIp: false,
securityGroupIds: [
ec2SecurityGroup.attrGroupId,
],
subnetId: ec2Subnet.attrSubnetId,
});
ec2InstanceConnectEndpoint.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2vpcdhcpOptionsAssociation = new ec2.CfnVPCDHCPOptionsAssociation(this, 'EC2VPCDHCPOptionsAssociation', {
vpcId: ec2vpc.ref,
dhcpOptionsId: ec2dhcpOptions.ref,
});
ec2vpcdhcpOptionsAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2RouteHg = new ec2.CfnRoute(this, 'EC2RouteHG', {
routeTableId: ec2RouteTable.ref,
destinationCidrBlock: '0.0.0.0/0',
gatewayId: ec2InternetGateway.ref,
});
ec2RouteHg.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2SubnetNetworkAclAssociation = new ec2.CfnSubnetNetworkAclAssociation(this, 'EC2SubnetNetworkAclAssociation', {
networkAclId: ec2NetworkAcl.ref,
subnetId: ec2Subnet.ref,
});
ec2SubnetNetworkAclAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2SubnetRouteTableAssociation = new ec2.CfnSubnetRouteTableAssociation(this, 'EC2SubnetRouteTableAssociation', {
routeTableId: ec2RouteTable.ref,
subnetId: ec2Subnet.ref,
});
ec2SubnetRouteTableAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2Instance = new ec2.CfnInstance(this, 'EC2Instance', {
tenancy: 'default',
instanceInitiatedShutdownBehavior: 'stop',
cpuOptions: {
threadsPerCore: 1,
coreCount: 2,
},
blockDeviceMappings: [
{
ebs: {
volumeType: 'gp3',
iops: 3000,
volumeSize: 10,
encrypted: false,
deleteOnTermination: true,
},
deviceName: '/dev/sda1',
},
],
availabilityZone: 'ap-south-1a',
privateDnsNameOptions: {
enableResourceNameDnsARecord: false,
hostnameType: 'ip-name',
enableResourceNameDnsAaaaRecord: false,
},
ebsOptimized: true,
disableApiTermination: false,
keyName: 'hikari',
sourceDestCheck: true,
placementGroupName: '',
networkInterfaces: [
{
privateIpAddresses: [
{
privateIpAddress: '10.0.3.59',
primary: true,
},
],
secondaryPrivateIpAddressCount: 0,
deviceIndex: '0',
groupSet: [
ec2SecurityGroup.ref,
],
ipv6Addresses: [
],
subnetId: ec2Subnet.ref,
associatePublicIpAddress: true,
deleteOnTermination: true,
},
],
imageId: 'ami-0415efd8380284dc4',
instanceType: 't4g.medium',
monitoring: false,
],
creditSpecification: {
cpuCredits: 'unlimited',
},
});
ec2Instance.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2ElasticIp = new ec2.CfnEIP(this, 'EC2ElasticIp', {
domain: 'vpc',
{
key: 'Name',
value: 'elastic-ip',
},
],
});
ec2ElasticIp.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2EipAssociation = new ec2.CfnEIPAssociation(this, 'EC2EipAssociation', {
eip: ec2ElasticIp.ref,
instanceId: ec2Instance.ref,
});
ec2EipAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
}
}
「名前付きパイプ」を選択し、パイプ名を「COM1」に設定

sudo nano /etc/default/grub で GRUB の設定ファイルを開き、
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0,115200n8"
に変更する。
保存後、
sudo update-grub
で GRUB の設定を適用する。
シリアルポートでログインできるようにサービスを設定する。
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
管理者権限で起動する

管理者権限で起動する
| Serial line | Speed | Connection type: |
|---|---|---|
| \.\pipe\COM1 | 115200 | Serial |
に設定。


管理者権限で起動する

[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::InputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
plink.exe -serial \\.\pipe\COM1 -sercfg 115200,8,n,1,N
Ctrl + C で終了
nmcli connection: すべての接続を表示pi@raspberrypi:~ $ nmcli connection
NAME UUID TYPE DEVICE
preconfigured 1b29633c-51a7-42a8-8357-a23ddbb791b9 wifi wlan0
lo 37334688-5c87-47fc-87d3-8c4e31934dd2 loopback lo
有線接続 1 0df9157e-b1a9-3026-9bd5-f05234e1cf4b ethernet --
nmcli device: デバイスと状態を表示pi@raspberrypi:~ $ nmcli device
DEVICE TYPE STATE CONNECTION
wlan0 wifi 接続済み preconfigured
lo loopback 接続済み (外部) lo
p2p-dev-wlan0 wifi-p2p 切断済み --
eth0 ethernet 利用不可 --
nmcli connection show ...: プロパティを表示nmcli connection show プロファイル名 を実行し、プロパティを表示できる。
pi@raspberrypi:~ $ nmcli connection show <プロファイル名>
connection.id: <プロファイル名>
connection.uuid: 1b29633c-51a7-42a8-8357-a23ddbb791b9
connection.stable-id: --
connection.type: 802-11-wireless
connection.interface-name: --
connection.autoconnect: はい
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (default)
connection.multi-connect: 0 (default)
connection.auth-retries: -1
connection.timestamp: 1710955164
connection.read-only: いいえ
connection.permissions: --
connection.zone: --
connection.master: --
connection.slave-type: --
connection.autoconnect-slaves: -1 (default)
connection.secondaries: --
connection.gateway-ping-timeout: 0
connection.metered: 不明
connection.lldp: default
connection.mdns: -1 (default)
connection.llmnr: -1 (default)
connection.dns-over-tls: -1 (default)
lines 1-24
pi@raspberrypi:~ $ nmcli connection show <プロファイル名> | grep ipv4.addresses
ipv4.addresses: 192.168.10.113/24
以下の例では、IP アドレスを 192.168.10.113、プレフィックス長を 24 に設定。
sudo nmcli connection modify <プロファイル名> ipv4.addresses 192.168.10.113/24
pi@raspberrypi:~ $ nmcli connection show <プロファイル名> | grep ipv4.dns:
ipv4.dns: 192.168.10.1
以下の例では、DNS サーバーを 192.168.10.1 に設定
sudo nmcli connection modify <プロファイル名> ipv4.dns 192.168.10.1
sudo nmcli connection down <プロファイル名>
sudo nmcli connection up <プロファイル名>
sudo nmtui
Linux のプロンプトを日本語化する方法を紹介します。
次に、日本語のロケールが存在しない場合は、それをインストールします。以下のコマンドを実行します。
sudo apt update
sudo apt install language-pack-ja
日本語のロケールを設定します。以下のコマンドを実行します。
sudo update-locale LANG=ja_JP.UTF8
最後に、システムを再起動します。これにより、新しいロケール設定が反映されます。
sudo reboot
以上で、Linux プロンプトが日本語化されます。
sudo apt update
sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
参考: pyenv/pyenv-installer: This tool is used to install pyenv and friends.
curl https://pyenv.run | bash
# ~/.bashrc を開く
code ~/.bashrc
以下を書き込みます。
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
pyenv install -l
Python 3.12.2 をインストールします。
pyenv install 3.12.2
デフォルトのバージョンを Python 3.12.2 に設定します。
pyenv global 3.12.2
python -V # Python 3.12.2
参考: パッケージ マネージャーを使用せずに Linux に .NET をインストールする - .NET | Microsoft Learn
wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x ./dotnet-install.sh
./dotnet-install.sh
./dotnet-install.sh --version latest
$HOME/.bashrc を開き、以下を追記
export DOTNET_ROOT=$HOME/.dotnet
export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools
sudo apt update
sudo apt install autoconf patch build-essential rustc libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev -y
# rbenv と ruby-build をインストール
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash
# 起動時に rbenv を読み込み
echo 'eval "$($HOME/.rbenv/bin/rbenv init - bash)"' | tee -a ~/.bashrc
source ~/.bashrc # rbenv を初期化 (WSL 再ログインでも可)
rbenv install 3.3.0 # Ruby 3.3.0 のインストール
rbenv global 3.3.0 # Ruby 3.3.0 を規定に設定
https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository の日本語訳です。
:::important Docker Desktop for Linux Docker Desktop を使用すると、Linux と同様に、 Mac と Windows 上でコンテナを簡単に構築、共有、実行できます。 Docker Desktop for Linux が一般提供版となったことをお伝えできることを嬉しく思います。 詳細については、Docker Desktop for Linuxを参照してください。 :::
Ubuntu で Docker Engine を使い始めるには、 前提条件を満たしていることを確認してから、 Docker をインストールしてください。
Docker Engine をインストールするには、 次のいずれかの Ubuntu バージョン (64 bit) が必要です。
Docker Engine は、x86_64 (または amd64)、armhf、arm64 及び s390x アーキテクチャでサポートされています。
古いバージョンの Docker は docker、docker.io、docker-engine と呼ばれていました。 これらがインストールされている場合は、アンインストールします。
$ sudo apt-get remove docker docker-engine docker.io containerd runc
apt-get がこれらのパッケージのどれもインストールされていないと報告すれば問題ありません。
イメージ、コンテナ、ボリューム、ネットワークなどの /var/lib/docker/ のコンテンツは保存されます。
既存のデータを保存する必要がなく、クリーンインストールから開始したい場合は、このページの下にある(Docker Engine のアンインストール](#)セクションを参照してください。
Docker Engine は、必要に応じてさまざまな方法でインストールできます。
Docker Engine を新しいホストマシンに初めてインストールする前に、Docker リポジトリをセットアップする必要があります。 その後、リポジトリから Docker をインストールして更新することができます。
apt パッケージインデックスを更新してパッケージをインストールし、apt が HTTPS 経由でリポジトリを使用できるようにします。
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
Docker の公式 GPG キーを追加します。
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
リポジトリを設定するには、次のコマンドを使用します。
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt パッケージインデックスを更新し、最新バージョンの Docker Engine、containerd、Docker Compose をインストールするか、次のステップに進んで特定のバージョンをインストールします。
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
:::important apt-get update の実行時に GPG エラーが発生しますか?
デフォルトの umask が正しく設定されていない可能性があります。
これにより、リポジトリの公開鍵ファイルが検出されなくなります。次のコマンドを実行してリポジトリを再度更新してください。
sudo chmod a+r /etc/apt/keyrings/docker.gpg
:::
Docker Engine の特定のバージョンをインストールするには、リポジトリにある利用可能なバージョンのリストから選択してインストールします。
a. リポジトリで利用可能なバージョンをリストします。
$ apt-cache madison docker-ce
b. 2番目のカラムのバージョン文字列 (5:20.10.16~3-0~ubuntu-jammy など) を使用して特定のバージョンをインストールします。
$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
hello-world イメージを実行して、Docker Engine が正しくインストールされていることを確認します。
$ sudo docker run hello-world
このコマンドは、テスト・イメージをダウンロードし、コンテナ内で実行します。コンテナが実行されると、メッセージを出力して終了します。
Docker Engine がインストールされて実行されています。
docker グループは作成されますが、ユーザは追加されません。
Docker コマンドを実行するには sudo を使用する必要があります。
特権のないユーザが Docker コマンドを実行できるようにするには、Linux の postinstall を続行します。
その他のオプションの設定手順も実行できます。
Docker Engine をアップグレードするには、
まず sudo apt-get update を実行し、
インストール手順に従ってインストールする新しいバージョンを選択します。
Docker のリポジトリを使用して Docker Engine をインストールできない場合は、
リリース用の .debファイルをダウンロードして手動でインストールすることができる。
Docker をアップグレードするたびに、新しいファイルをダウンロードする必要がある。
https://download.docker.com/linux/ubuntu/dists/ に行き Ubuntu バージョンを選択して、pool/stable/ をブラウズして amd64、armhf、arm64、または s390x を選択し、インストールしたい Docker Engine バージョンの .deb ファイルをダウンロードします。$ sudo dpkg -i /path/to/package.deb
hello-world イメージを実行して、Docker Engine が正しくインストールされていることを確認します。
$ sudo docker run hello-world
Docker Engine がインストールされて実行されています。
docker グループは作成されますが、ユーザは追加されません。
sudo を使用してDockerコマンドを実行する必要があります。
特権のないユーザが Docker コマンドを実行できるようにするための Linux のインストール後の手順と、その他のオプションの設定手順に進みます。
Docker Engine をアップグレードするには、新しいパッケージファイルをダウンロードし、新しいファイルを指定してインストール手順を繰り返します。
Docker は、get.docker.com で、
Docker を開発環境に迅速かつ非インタラクティブにインストールするための便利なスクリプトを提供しています。
便利なスクリプトはプロダクション環境には推奨されていませんが、
ユーザのニーズに合わせたプロビジョニングスクリプトを作成するための例として使用することができます。パッケージリポジトリを使用してインストールするためのインストール手順については、リポジトリを使用したインストール手順も参照してください。
スクリプトのソースコードはオープンソースであり、
GitHub の docker-install リポジトリにあります。
ローカルで実行する前に、インターネットからダウンロードしたスクリプトを必ず確認してください。 インストールする前に、便利スクリプトの潜在的なリスクと制限についてよく理解してください。
:::important ヒント: 実行前にスクリプトステップをプレビューする
DRY_RUN=1 オプションを指定してスクリプトを実行すると、インストール時にスクリプトが実行するステップを確認できます。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ DRY_RUN=1 sh ./get-docker.sh
:::
次の例では、get.docker.com からスクリプトをダウンロードして実行し、Dockerの最新の安定リリースをLinuxにインストールします。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
Docker がインストールされている。Docker サービスは Debian ベースのディストリビューションで自動的に起動します。 CentOS、Fedora、RHEL、SLES などの RPM ベースのディストリビューションでは、 適切な systemctl または service コマンドを使用して手動で起動する必要があります。 メッセージが示すように、root 以外のユーザはデフォルトで Docker コマンドを実行できません。
:::important 非特権ユーザとして Docker を使用するか、ルートレスモードでインストールするには?
インストールスクリプトには、Docker をインストールして使用するために root 権限または sudo 権限が必要です。
root 以外のユーザに Docker へのアクセスを許可したい場合は、
Linux のインストール後の手順を参照してください。
Docker は、root 権限なしでインストールすることも、
root なしモードで実行するように設定することもできます。
Docker を root なしモードで実行する方法については、
root 以外のユーザとして Docker デーモンを実行する (root なしモード)を参照してください。
:::
Docker は test.docker.com で、Docker のプレリリースを Linux にインストールするための便利なスクリプトも提供しています。
このスクリプトは get.docker.com のスクリプトと同じですが、Docker の安定版とプレリリース (ベータバージョン、リリース候補) の両方を含むパッケージリポジトリから "test" チャネルを有効にするようにパッケージマネージャを設定します。
このスクリプトを使用して、新しいリリースに早期にアクセスし、安定版としてリリースされる前にテスト環境で評価します。
"test" チャネルから Linux に最新バージョンの Docker をインストールするには、次のコマンドを実行します。
$ curl -fsSL https://test.docker.com -o test-docker.sh
$ sudo sh test-docker.sh
便利スクリプトを使用して Docker をインストールした場合は、 パッケージマネージャを直接使用して Docker をアップグレードする必要があります。 便利スクリプトを再実行するメリットはなく、 ホストマシンにすでに追加されているリポジトリを再追加しようとすると問題が発生する可能性があります。
Docker Engine、CLI、Containerd、Docker Compose パッケージのアンインストール
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
ホスト上のイメージ、コンテナ、ボリュームまたはカスタマイズされた構成ファイルは、自動的には削除されません。すべてのイメージ、コンテナおよびボリュームを削除する手順は、次のとおりです。
$ sudo rm -rf /var/lib/docker
$ sudo rm -rf /var/lib/containerd
編集した設定ファイルは手動で削除する必要があります。
/ の中、ファイルシステムイメージ) を展開mksquashfs コマンド)xorriso コマンドを使用)この流れで、Ubuntu の改造ディストリビューションを作成できます。
sudo apt install cd-boot-images-amd64 xorriso
パッケージがないとかでインストールができない場合は以下を実行し再度実行してください。
echo "deb http://cz.archive.ubuntu.com/ubuntu jammy main" | sudo tee -a /etc/apt/sources.list
sudo apt update
# DISK_IMAGE はディスクイメージのパスです。
DISK_IMAGE=/mnt/d/ubuntu-22.04-desktop-amd64.iso
# RELEASENOTE_URL はリリースノートの URL です。
RELEASENOTE_URL="http://"
# 作業ディレクトリーの作成
mkdir ~/my-distribution
cd ~/my-distribution
# ディスクイメージのシンボリックリンクを作成します。
ln -s $DISK_IMAGE image.iso
# ディスクイメージをマウント
# 警告が出ますが無視してください。
mkdir mnt
sudo mount -o loop image.iso mnt
# ディスクイメージのコピー
# マウントした場所は書き換えができないのでコピーします。
# ただし、ディストリビューションのファイルシステムである /casper/filesystem.squashfs は除外してコピーします。
mkdir disk
rsync -P -a --exclude=/casper/filesystem.squashfs mnt/ disk
# ファイルシステムイメージのマウント
mkdir mntfs
sudo mount -t squashfs -o loop mnt/casper/filesystem.squashfs mntfs
# ファイルシステムをコピー
# マウントした場所は書き換えできないので、コピーします。
mkdir squashfs
sudo rsync -P -a mntfs/ squashfs
# マウントは不要になったのでアンマウントします。
sudo umount mntfs
sudo umount mnt
rm -r mntfs mnt
# シンボリックリンクも不要なので削除します
rm image.iso
# リリースノートの URL を設定します。
echo $RELEASENOTE_URL | sudo tee disk/.disk/release_notes_url
# ディスク情報を設定します。
today=$(date +"%Y%m%d")
echo -n "MyDistribution 22.04 LTS \"Jammy Jellyfish\" - Release amd64 ($today)" | tee
echo -n "MyDistribution 22.04 LTS \"Jammy Jellyfish\" - Release amd64 ($today)" | sudo tee disk/.disk/info
# インストーラーの言語を日本語に設定します。
cat | sudo tee -a disk/preseed/ubuntu.seed <<EOF
d-i debian-installer/language string ja
d-i debian-installer/locale string ja_JP.UTF-8
d-i keyboard-configuration/layoutcode string jp
d-i keyboard-configuration/modelcode jp106
d-i keyboard-configuration/layout select Japanese
d-i keyboard-configuration/variant select Japanese
EOF
# grub.cfg の日本語化
splash=$(echo "splash --- debian-installer/language=ja" \
"debian-installer/locale=ja_JP.UTF-8" \
"keyboard-configuration/layoutcode?=jp" \
"keyboard-configuration/modelcode?=pc105")
sudo sed -i "s#splash ---#$splash#" disk/boot/grub/grub.cfg
# MyDistribution.sh は Ubuntu をカスタマイズするスクリプトです。
chroot squashfs /bin/bash MyDistribution.sh
# パッケージ一覧を書き込み
sudo chroot squashfs/ dpkg-query -W --showformat='${binary:Package}\t${Version}\n' |\
tee disk/casper/filesystem.manifest
# ファイルシステムのサイズを書き込み
sudo du -B 1 -s squashfs/ | cut -f1 | sudo tee disk/casper/filesystem.size
# ファイルシステムのイメージ化
sudo mksquashfs squashfs/ disk/casper/filesystem.squashfs -xattrs -comp xz
sudo rm disk/casper/filesystem.squashfs.gpg
# md5sum.txt を出力
cd disk
find . -type f -not -name 'md5sum.txt' -not -path './boot/*' -not -path './EFI/*' -print0 | xargs -0 md5sum | sudo tee md5sum.txt
md5sum ./boot/memtest86+.bin | sudo tee -a md5sum.txt
md5sum ./boot/grub/*.cfg | sudo tee -a md5sum.txt
cd ..
VOLUME_ID="MyDistribution"
OUTPUT_ISO="mydistribution-22.04-desktop-amd64.iso"
xorriso \
-as mkisofs \
-volid "$VOLUME_ID" \
-o "$OUTPUT_ISO" \
-J -joliet-long -l \
-b boot/grub/i386-pc/eltorito.img \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--grub2-boot-info \
--grub2-mbr /usr/share/cd-boot-images-amd64/images/boot/grub/i386-pc/boot_hybrid.img \
-append_partition 2 0xef /usr/share/cd-boot-images-amd64/images/boot/grub/efi.img \
-appended_part_as_gpt \
--mbr-force-bootable \
-eltorito-alt-boot \
-e --interval:appended_partition_2:all:: \
-no-emul-boot \
-partition_offset 16 \
-r \
disk/
sudo apt install -y qemu-system-x86
sudo qemu-system-x86_64 -m 4G -cdrom mydistribution-22.04-desktop-amd64.iso -boot d --enable-kvm -usb -smp 6
qemu-img create -f qcow2 disk.qcow2 32G
sudo qemu-system-x86_64 -hda disk.qcow2 -m 4G -cdrom mydistribution-22.04-desktop-amd64.iso -boot d --enable-kvm -usb -smp 6