Linux とは本来 Linux カーネルのことを指しています。しかし、カーネルだけでは OSとして動作させることはできません。そこで、OS に関連するツールやアプリケーションなどをまとめて、インストールし易く、インストール後にすぐ利用できるような配布形態にしたものを「ディストリビューション(略してディストロ)」と呼んでいます。
本シリーズ記事は、Linux ディストリビューションをピックアップ、仮想マシン(あるいは実機)にインストールして紹介します[不定期]。
Fedora Silverblue とは
Fedora Silverblue はデスクトップ用途の immutableな OS で、以前は Fedora Atomic Workstation [1]と呼ばれていたのですが、Fedora 29 から Silverblue にブランド名が変更されました。OS は、rpm-ostree を活用して生成されたイメージを使用しています。一方、GUI を伴うデスクトップアプリケーションの管理には Flatpak が採用されています。将来、Silverblue が通常の Fedora Workstation に置き換わる可能性がありますが、そうなるのはまだまだ先とのことです [2]。
immutable, rpm-ostree, flatpak については後述するとして、仮想環境にインストールしてみました。
仮想環境へのインストール
Silverblue のダウンロードサイト [3] から最新の iso イメージ (Fedora-Silverblue-ostree-x86_64-31-1.9.iso)をダウンロードして、仮想環境 (GNOME Boxes) にインストールしました。
インストールの手順や見た目は、通常の Fedora Workstationと同じです。
インストール後、再起動してアカウントを作成します。
インストールプロセスは、通常の Fedora 31 Workstation とほとんど区別が付きませんでした。インストール後のアプリケーションの一覧を見ると、インターネットブラウザ (Firefox) や端末エミュレータなど最低限のものしかありません。
rpm-ostree による OS 管理
OSTree
OSTree は、ファイルシステムツリー(= OS 環境)を管理するツールです。OS 環境をイメージで管理すると捉えることができます。このファイルシステムは起動可能で immutable(変更されない = read only)です。ファイルシステムツリーのイメージは Gitのような使い方でバージョン管理をすることができます。そのため(再起動が必要になりますが)OSTree では、複数のファイルシステムツリーを切り替えて利用することができます。
OSTree で扱う OS 環境は書き換えることができませんが、/var内のみ変更・保存ができます。そのため、例えば従来の /homeディレクトリは /var/homeへのシンボリックリンクになっています。
rpm-ostree
OSTree が管理するファイルシステムツリー(= OS 環境)は書き換えることができないため、セキュリティ的には非常に堅牢ですが、従来の rpm や deb によるパッケージ単位の管理に比べれば制約が大きく不便になります。そこで、OSTree の機能と、rpm によるパッケージ管理機能を組み合わせたシステムが rpm-ostree です。rpm-ostree で管理するシステムは OSTree による OS のイメージ管理と rpm によるパッケージ管理を併せ持つので、ハイブリッドシステムと呼ばれています。
コマンドラインのヘルプと参考資料 [4]を元にして、rpm-ostree コマンドの概略をまとめました。
rpm-ostree [OPTION…] COMMAND | ||
ビルトインコマンド | 説 明 | |
---|---|---|
compose | OS ツリーを構成するコマンドです。 | |
cleanup | キャッシュされている、あるいは処理保留中のデータを消去します。 | |
db | RPM のデータベースにクエリを発行するコマンドです。 【用法】 rpm-ostree db [OPTION…] COMMAND | |
diff | 前後のコミットにおけるパッケージの差分(バージョンの違い、追加、削除)を表示します。 | |
list | コミットされたパッケージの一覧を表示します。 | |
version | コミットされたパッケージの rpmdb バージョンを表示します。 | |
deploy | 特定のコミットをデプロイします。 | |
rebase | 別の OS ツリーに切り替えます。 | |
rollback | 以前ブートした OS ツリーに戻します。 | |
status | 起動しているシステムのバージョンを取得します。 | |
upgrade | システムのアップグレードを実行します。 | |
reload | コンフィギュレーションを再ロードします。 | |
usroverlay | 一時的な上書き用ファイルシステム (overlayfs) を /usr に適用します。 | |
cancel | アクティブなトランザクション(例えば upgrade)を中止します。 | |
initramfs | ローカルでの initramfs 再生成を有効または無効にします。 initramfs は、メモリ上に展開可能な,小さなサイズのルートファイルシステムです。ここにルートファイルシステムをマウントするために必要なカーネルモジュールやスクリプトが保存されています。 | |
install | 追加のパッケージを書き込みます。 | |
uninstall | 追加して書き込んだパッケージを削除します。 | |
override | ベースパッケージのオーバーライドを管理します。 【用法】 rpm-ostree override [OPTION…] COMMAND | |
replace | ベースレイヤーのパッケージを置き換えます。 | |
remove | ベースレイヤーからパッケージを削除します。 | |
reset | 現在アクティブなパッケージのオーバーライドをリセットします。 | |
reset | 全ての変異 (muation) を削除します。 | |
refresh-md | rpm リポジトリのメタデータを生成します。 | |
kargs | カーネルに渡す引数のクエリまたは編集をします。 |
rpm-ostree の使用例
Silverblue のインストール後、端末エミュレータ上で rpm-ostree statusとタイプして起動しているイメージの情報を表示しました。
[bitwalk@localhost ~]$ rpm-ostree status
State: busy
AutomaticUpdates: disabled
Transaction: upgrade (download only)
Initiator: client(id:gnome-software dbus:1.278 unit:gnome-session-manager@gnome.service uid:1000)
Deployments:
● ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.1.9 (2019-10-23T21:44:48Z)
Commit: c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
さらに rpm-ostree upgradeとタイプして OS 環境のアップグレードを実施しました。アップグレード後は systemctl rebootで再起動します。どちらも sudoを使わずに実行できました。
[bitwalk@localhost ~]$ rpm-ostree upgrade
1 metadata, 0 content objects fetched; 569 B transferred in 2 seconds
Staging deployment... done
Upgraded:
NetworkManager 1:1.20.4-1.fc31 -> 1:1.20.6-1.fc31
NetworkManager-adsl 1:1.20.4-1.fc31 -> 1:1.20.6-1.fc31
...
(途中省略)
...
perl-threads-shared 1.60-443.module_f31+5982+3dad29a3 -> 1.60-440.fc31
python3-setools 4.2.2-1.module_f31+4996+814a25d3 -> 4.2.2-1.fc31
Removed:
libdnet-1.12-31.fc31.x86_64
tpm2-abrmd-2.2.0-2.fc31.x86_64
tpm2-abrmd-selinux-2.1.0-3.fc31.noarch
tpm2-tools-3.2.0-3.fc31.x86_64
Added:
perl-Digest-1.17-439.fc31.noarch
perl-Digest-MD5-2.55-439.fc31.x86_64
...
(途中省略)
...
perl-URI-1.76-5.fc31.noarch
perl-libnet-3.11-440.fc31.noarch
Run "systemctl reboot" to start a reboot
[bitwalk@localhost ~]$ systemctl reboot
再起動後、再び rpm-ostree statusとタイプして起動しているイメージの情報を確認すると二種類のイメージが存在していることがわかります。
[bitwalk@localhost ~]$ rpm-ostree status
State: idle
AutomaticUpdates: disabled
Deployments:
● ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.20191123.0 (2019-11-23T00:39:51Z)
Commit: 2c0cb651d74ad99eaaeff4929dbeb707bb8fc66d5f655e1bb777b9762037cdab
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.1.9 (2019-10-23T21:44:48Z)
Commit: c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
[bitwalk@localhost ~]$
OS イメージのロールバック
rpm-ostree rollbackとタイプして、ロールバックしてみました。
[bitwalk@localhost ~]$ rpm-ostree rollback
Moving 'c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4.0' to be first deployment
Transaction complete; bootconfig swap: yes; deployment count change: 0
c-ares 1.15.0-4.fc31 -> 1.15.0-4.module_f31+5271+b9c46c4d
perl-Carp 1.50-439.fc31 -> 1.50-443.module_f31+5982+3dad29a3
...
(途中省略)
...
perl-threads-shared 1.60-440.fc31 -> 1.60-443.module_f31+5982+3dad29a3
python3-setools 4.2.2-1.fc31 -> 4.2.2-1.module_f31+4996+814a25d3
Downgraded:
NetworkManager 1:1.20.6-1.fc31 -> 1:1.20.4-1.fc31
NetworkManager-adsl 1:1.20.6-1.fc31 -> 1:1.20.4-1.fc31
...
(途中省略)
...
zlib 1.2.11-20.fc31 -> 1.2.11-19.fc31
zlib-devel 1.2.11-20.fc31 -> 1.2.11-19.fc31
Removed:
perl-Digest-1.17-439.fc31.noarch
perl-Digest-MD5-2.55-439.fc31.x86_64
...
(途中省略)
...
perl-URI-1.76-5.fc31.noarch
perl-libnet-3.11-440.fc31.noarch
Added:
libdnet-1.12-31.fc31.x86_64
tpm2-abrmd-2.2.0-2.fc31.x86_64
tpm2-abrmd-selinux-2.1.0-3.fc31.noarch
tpm2-tools-3.2.0-3.fc31.x86_64
Run "systemctl reboot" to start a reboot
[bitwalk@localhost ~]$ systemctl reboot
再起動後、再々度 rpm-ostree statusとタイプして起動しているイメージの情報を確認すると最初のイメージが有効になっていることを確認できます。
[bitwalk@localhost ~]$ rpm-ostree status
State: busy
AutomaticUpdates: disabled
Transaction: upgrade (check only)
Initiator: client(id:gnome-software dbus:1.232 unit:gnome-session-manager@gnome.service uid:1000)
Deployments:
● ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.1.9 (2019-10-23T21:44:48Z)
Commit: c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.20191123.0 (2019-11-23T00:39:51Z)
Commit: 2c0cb651d74ad99eaaeff4929dbeb707bb8fc66d5f655e1bb777b9762037cdab
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
[bitwalk@localhost ~]$
再度 rpm-ostree upgradeとタイプしてアップグレード後、systemctl rebootで再起動しました。
dnf のインストール
rpm のクエリコマンドが使えるかどうか試したところ、ちゃんと使えました。なお、dnf はインストールされていませんでした。
[bitwalk@localhost ~]$ rpm -qa
NetworkManager-openconnect-1.2.6-2.fc31.x86_64
libglvnd-gles-1.1.1-5.fc31.x86_64
gnome-shell-extension-background-logo-3.34.0-1.fc31.noarch
...
(途中省略)
...
at-spi2-core-2.34.0-1.fc31.x86_64
mesa-libglapi-19.2.4-1.fc31.x86_64
[bitwalk@localhost ~]$
そこで、rpm-ostree installで dnf をインストールしてみました。dnf のインストールはできましたが、またまた systemctl rebootで再起動です。
[bitwalk@localhost ~]$ rpm-ostree install dnf
Checking out tree 2c0cb65... done
Enabled rpm-md repositories: updates fedora
rpm-md repo 'updates' (cached); generated: 2019-11-23T00:45:22Z
rpm-md repo 'fedora' (cached); generated: 2019-10-23T22:52:47Z
Importing rpm-md... done
Resolving dependencies... done
Will download: 18 packages (4.4 MB)
Downloading from 'updates'... done
Downloading from 'fedora'... done
Importing packages... done
Checking out packages... done
Running pre scripts... done
Running post scripts... done
Running posttrans scripts... done
Writing rpmdb... done
Writing OSTree commit... done
Staging deployment... done
Added:
deltarpm-3.6.2-2.fc31.x86_64
dnf-4.2.15-2.fc31.noarch
dnf-data-4.2.15-2.fc31.noarch
...
(途中省略)
...
unbound-libs-1.9.4-1.fc31.x86_64
Run "systemctl reboot" to start a reboot
[bitwalk@localhost ~]$
再起動後、毎度になりますが rpm-ostree statusとタイプして起動しているイメージの情報を確認すると、LayeredPackages: dnfと、追加したパッケージの情報が別に記載されています。
[bitwalk@localhost ~]$ rpm-ostree status
State: busy
AutomaticUpdates: disabled
Transaction: upgrade (download only)
Initiator: client(id:gnome-software dbus:1.231 unit:gnome-session-manager@gnome.service uid:1000)
Deployments:
● ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.20191123.0 (2019-11-23T00:39:51Z)
BaseCommit: 2c0cb651d74ad99eaaeff4929dbeb707bb8fc66d5f655e1bb777b9762037cdab
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
LayeredPackages: dnf
ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.20191123.0 (2019-11-23T00:39:51Z)
Commit: 2c0cb651d74ad99eaaeff4929dbeb707bb8fc66d5f655e1bb777b9762037cdab
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
[bitwalk@localhost ~]$
dnf および rpm コマンドでインストールできない
rpm-ostree で dnf をインストールできましたので、R の開発環境 RStudio をインストールしようと、サイトから rpm パッケージをダウンロードして、まず dnf コマンドでインストールしてみましたが、/(ルート)の領域不足というエラーでインストールできませんでした。念の為、rpm でもインストールしましたが、今度はロックファイルが作成できないという理由でインストールできませんでした。
※ R の環境は、あらかじめ rpm-ostree install R-core-develを実行してインストールしておきました。
[bitwalk@localhost ダウンロード]$ ls
rstudio-1.2.5019-x86_64.rpm
[bitwalk@localhost ダウンロード]$ sudo dnf install rstudio-1.2.5019-x86_64.rpm
[sudo] bitwalk のパスワード:
Fedora 31 - x86_64 - Updates 13 kB/s | 6.5 kB 00:00
メタデータの期限切れの最終確認: 0:00:01 時間前の 2019年11月24日 00時31分06秒 に実施しました。
依存関係が解決しました。
================================================================================
Package Architecture Version Repository Size
================================================================================
インストール:
rstudio x86_64 1.2.5019-1 @commandline 115 M
トランザクションの概要
================================================================================
インストール 1 パッケージ
合計サイズ: 115 M
インストール済みのサイズ: 583 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
エラー: Transaction test error:
パッケージ rstudio-1.2.5019-1.x86_64 のインストールには 618MB の領域が / ファイルシステム上に必要です。
[bitwalk@localhost ダウンロード]$ sudo rpm -ivh rstudio-1.2.5019-x86_64.rpm
警告: rstudio-1.2.5019-x86_64.rpm: ヘッダー V4 RSA/SHA256 Signature、鍵 ID e331692f: NOKEY
エラー: トランザクション ロックを(/var/lib/rpm/.rpm.lock 上に)作成できません。(Read-only file system)
[bitwalk@localhost ダウンロード]$
rpm-ostree install でローカルの rpm ファイルをインストール
結局、RStudio の rpm パッケージは rpm-ostree installコマンドでインストールしました。
[bitwalk@localhost ダウンロード]$ rpm-ostree install rstudio-1.2.5019-x86_64.rpm
Checking out tree 2c0cb65... done
Enabled rpm-md repositories: updates fedora
Updating metadata for 'updates'... done
rpm-md repo 'updates'; generated: 2019-11-23T00:45:22Z
Updating metadata for 'fedora'... done
rpm-md repo 'fedora'; generated: 2019-10-23T22:52:47Z
Importing rpm-md... done
Resolving dependencies... done
Checking out packages... done
Running pre scripts... done
Running post scripts... done
Running posttrans scripts... done
Writing rpmdb... done
Writing OSTree commit... done
Staging deployment... done
Added:
rstudio-1.2.5019-1.x86_64
Run "systemctl reboot" to start a reboot
[bitwalk@localhost ダウンロード]$
再起動後、rpm-ostree statusとタイプして起動しているイメージの情報を確認すると、LocalPackages: rstudio-1.2.5019-1.x86_64と、ローカルで追加した rpm パッケージの情報が別に記載されています。
[bitwalk@localhost ~]$ rpm-ostree status
State: idle
AutomaticUpdates: disabled
Deployments:
● ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.20191123.0 (2019-11-23T00:39:51Z)
BaseCommit: 2c0cb651d74ad99eaaeff4929dbeb707bb8fc66d5f655e1bb777b9762037cdab
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
LayeredPackages: R-core-devel dnf
LocalPackages: rstudio-1.2.5019-1.x86_64
ostree://fedora:fedora/31/x86_64/silverblue
Version: 31.20191123.0 (2019-11-23T00:39:51Z)
BaseCommit: 2c0cb651d74ad99eaaeff4929dbeb707bb8fc66d5f655e1bb777b9762037cdab
GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
LayeredPackages: R-core-devel dnf
[bitwalk@localhost ~]$
RStudio をインストールした後、アプリがアプリケーション・ビューに登録され、問題なく起動できることを確認しました。
Flatpak によるデスクトップアプリケーション管理
Flatpakとは、Linux デスクトップ向けのソフトウェアデプロイメント・パッケージ管理・アプリケーション仮想化(アプリケーション・コンテナ)を行うユーティリティソフトウェアです。ユーザーがアプリケーションとシステムを分離して実行することができるサンドボックスを提供しています。
前述した通り rpm-ostree でも rpm のパッケージ管理はできますが、インストールなどで OS 環境に変更を加える度に再起動が必要となり、いささか不便です。Silverblue では、Flackpak のリポジトリからデスクトップアプリケーション(GUI アプリケーション)をインストールする仕組みが用意されています。
Silverblue をインストール後、デフォルトで利用可能な Flatpak リポジトリは Fedora のものだけですが、あまりアプリケーションが登録されていません。Flathub [5]のリポジトリを登録することで、主要なオープンソースのディスクトップアプリケーションを利用できるようになります。
※ さらにアプリケーション開発者は、 https://github.com/flathub/flathub/wiki/App-Submissionにサブミットしてアプリを配布することができます。
コマンド例 | 説 明 |
---|---|
$ flatpak remotes | |
現在、システムに登録されているリモートリポジトリ (remote) の一覧を表示します。
| |
$ flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo | |
リモートリポジトリ (remote) flathubを追加します。 追加後、ソフトウェアリポジトリが追加されるので、「ソフトウェア」上にも反映されます。 | |
$ flatpak remote-delete flathub | |
リモートリポジトリ (remote) flathubを削除します。 | |
$ flatpak search gimp | |
リモートリポジトリ (remote) で、gimpにマッチするアプリケーションを検索します。
| |
$ flatpak install flathub org.gimp.GIMP | |
$ flatpak install https://flathub.org/repo/appstream/org.gimp.GIMP.flatpakref | |
$ flatpak install gimp | |
リモートリポジトリ (remote) flathub から、ID が org.gimp.GIMPのアプリケーションをインストールします。
| |
$ flatpak run org.gimp.GIMP | |
アプリケーション ID を run コマンドで実行します。 ただし 多くの場合はアイコンをクリックしてアプリケーションを起動できます。 | |
$ flatpak update | |
インストールされているアプリケーションとランタイムを最新のものに更新します。 | |
$ flatpak list | |
$ flatpak list --app | |
インストールされているアプリケーションとランタイムの一覧を表示します。 アプリケーションの一覧のみを表示したい場合は、--appを付加します。
| |
$ flatpak uninstall org.gimp.GIMP | |
$ flatpak uninstall --unused | |
インストールされている ID が org.gimp.GIMP(アプリケーション)をアンインストール(削除)します。 また、ID の代わりに --unusedを付加すると、使用されていないランタイムを削除します。 | |
$ flatpak repair | |
インストールされているパッケージの矛盾を解決します。 | |
$ flatpak permission-reset org.gimp.GIMP | |
インストールされている ID が org.gimp.GIMP(アプリケーション)のパーミッションをリセットします。 | |
$ flatpak history | |
Flatpak によるインストール履歴を表示します。
|
Fedora Toolbox
Fedora Toolbox は開発者のためにユーザーアカウント単位でコンテナ環境を提供するコマンドラインツールです。toolbox enterコマンドでコンテナ環境に入り、ユーザーアカウントのディレクトリにアクセスできます。また、dnf コマンドがここでは利用できます。
Silverblue ではデフォルトで Toolbox がインストールされていたので、Silverblue 固有なツールと思っていましたが、通常の Fedora 31 Workstation でも利用できます。
コマンド例 | 説 明 |
---|---|
toolbox create [--container <name>] | |
toolbox 用のコンテナを作成します。デフォルトで Fedora のイメージが OCI標準に準拠した形式でダウンロードされます。
| |
toolbox enter [--container <name>] | |
toolbox のコンテナに入って、インタラクティブに設定などをします。
| |
toolbox list | |
ローカルにある toolbox のイメージとコンテナの一覧を表示します。
| |
toolbox rm [--force] <name> | |
toolbox のコンテナを削除します。 | |
toolbox rmi [--force] <name> | |
toolbox のイメージを削除します。 |
rpm でパッケージを確認すると、toolbox-0.0.16-1.fc31.noarchとなっており、まだ開発が始まったばかりのパッケージです。コンテナ環境を簡単に扱えますが、今のところ機能的にもとてもシンプルです。ユーザーアカウントで開発用のコンテナを簡単に用意できるので、案外利用価値が多いかもしれません。
まとめ
項目 | 説明 |
---|---|
ディストリビューション | Fedora Silverblue |
プロジェクトサイト | https://silverblue.fedoraproject.org/ |
デスクトップ環境 | GNOME |
対応プラットフォーム | x86_64 |
パッケージ管理 | rpm-ostree + flatpak (一応、rpm ベース) |
日本語入力 | Ibus, kkc(デフォルト) |
更新頻度 サポート期間 | 一年に二回という Fedora のバージョン更新頻度に準じています。あるバージョンについて 2 つ先のバージョンがリリースされてから 1ヶ月後にメンテナンスが終了します。主要パッケージの定期的な更新頻度は二週間に一回程度か? |
寸評 | 利便性を犠牲にしても immutable な OS を使うニーズは、セキュリティ面から考えて今後ますます高くなるでしょう。そのため OSTree から派生した rpm-ostree のようなシステムは、それなりに採用分野が広がると思います。 デスクトップアプリケーションを flatpak で管理する限り、デスクトップ用途において、どの Linux を使っても同じ UX(ユーザーエクスペリエンス)を実現することになります。そうなればエンタープライズなデスクトップ用途において、Linux デスクトップがもっと普及するようになるかもしれません。オープンソースの世界は多様性に富んでいますから、まだ flakpak がデファクトスタンダードになるかどうかは未知です。しかし、rpm とか deb というようなパッケージ管理の違いを超えて、アプリケーションの仮想化の時代に突入したといえます。 Siliverblue が現行の Fedora Workstation に置き換わるとすれば、flatpak が今後どこまで普及するかどうかにかかっているように思います。 |
参考サイト
- An Introduction to Fedora Atomic Workstation — Project Atomic
- What is Silverblue? - Fedora Magazine [2019-07-12]
- Team Silverblue — Download
- rpm-ostree command man page | ManKier
- Applications—Linux Apps on Flathub
- 2019年7月2日 Xからの脱却 ―Fedora,次バージョンでのデスクトップ改善ポイントを提示:Linux Daily Topics|gihyo.jp … 技術評論社 [2019-07-02]

にほんブログ村