2019-11-26

[CentOS 8] Eginx の設定

Nginx /ˌɛndʒɪnˈɛks/ は、フリーでオープンソースな Web サーバです。処理性能・高い並行性・少ないメモリ使用量に焦点を当てて開発されており、HTTP, HTTPS, SMTP, POP3, IMAPリバースプロキシの機能や、ロードバランサHTTP キャッシュなどの機能も持っています。

Wikipedia より抜粋・編集

W3Techs の Web サーバーの利用状況調査(Usage Statistics and Market Share of Web Servers)によると、Nginx は首位の Apache HTTP Server に次いで二番目に多く使われている Web サーバです。2019 年 11 月のレポートでは Apache が 43.0%、Eginx が 30.7% という利用状況でした。

動機

Linux を使い始めて 20 年以上経ちますが、ずっと Apache HTTP Server を使ってきました。

Web サーバーの設定についての記事をインターネットで検索すると、Nginx を扱っている記事が多くなってきたことを実感しますが、自分が Web サーバーを使う用途では高負荷下での利用がないので様子見を決め込んでいました。ところが最近、実務で Apache のロードバランサが高負荷下で効果的に動作しないことを経験して、高負荷下での動作に強いと言われる Nginx に興味を持つようになりました。

そこで、自宅で 24 時間運用を始めた CentOS 8 のサーバーに Nginx をインストールしましたので、その設定内容を備忘録にしました

使用した OS は前述のとおり、CentOS 8 です。

OS
CentOS Linux release 8.0.1905 (Core) x86_64

Nginx のインストール

CentOS で Nginx の rpm パッケージを利用する方法は二つあります。

一つ目はもちろん CentOS 公式のパッケージをインストールする方法です。Nginx のバージョンは最新ではありません。しかし、エンタープライズ用途で使用しており、パッケージのバージョンアップで生じるかもしれない影響を避けたい場合にはこの方法がオススメです。

もうひとつは、Nginx のサイトで公開されている最新の rpm パッケージをインストールする方法です。

今回は、家庭内 LAN で稼働しているサーバーが対象なので、Nginx の勉強も兼ねて最新の Eginx を使うことにしました。

レポジトリ設定用の RPM パッケージ

参考サイト [1] は Nginx のサイトですが、ここに dnf/yum 用のレポジトリ設定の方法が記載されています。nginx.repo といった名前でファイルを生成して、参考サイト [1] に記載されている内容をコピペ、所定のディレクトリ /etc/yum.repos.d/ に保存するだけです。難しい操作ではありませんが、なにかの折に毎回同じ作業するのは面倒です。もしかすると、既にどなたかが作っていて、それを知らないのは自分だけなのかもしれませんが、nginx.repo をインストールする RPM ファイルを作ってしまいました [2]

※ CentOS 7用には、同等のパッケージが Nginx のサイトに用意されています。→ http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

この RPM ファイルをダウンロード、インストールしてから Nginx をインストールすることにします。

まず上記からダウンロードした nginx-repo RPM パッケージをインストールします。

$ sudo dnf install nginx-repo-1.0-1.el8.noarch.rpm

安定板/開発版のレポジトリ選択

参考サイト [1] に示されている dnf/yum 用のレポジトリ設定では、Nginx の stable 版(安定板)と mainline 版(開発版)のレポジトリの設定が記載されていますが、stable 版(安定板)のレポジトリだけ有効になっています。mainline 版のレポジトリも有効にしたい場合は、インストールされた /etc/yum.repos.d/nginx.repo を直接変更しても良いのですが、yum-config-manager コマンドを使って変更することもできます。

Nginx のバージョン番号

Nginx のバージョンは X.Y.Z(X, Y, Z は整数) という 3 つの番号で定義され、X はメインバージョン、 Y はマイナーバージョン、Z はバグフィックスなどのパッチバージョンと捉えることができます。さらに Y の番号の偶奇で安定板と開発版に区別されています。Y が更新されるタイミングは毎年 4 月であるとのことです [3]

stable
安定版:Y は常に偶数で、前の開発版の最後の版をフォークします。mainline で追加された機能は、後になって追加されます。
mainline
開発版:Y は常に奇数で安定板の Y よりひとつ大きい整数になります。4–6 週間の頻度でリリースされ、.Z の部分が更新されます。

CentOS の場合、yum-config-managerdnf-utils というパッケージに含まれていますので、これをインストールして、mainline 版のレポジトリを有効にすることにします。

$ sudo dnf install dnf-utils
...
(途中省略)
...
インストール済み:
  dnf-utils-4.0.2.2-3.el8.noarch                                                

完了しました!
$ sudo yum-config-manager --enable nginx-mainline

mainline 版のバージョン番号は stable 版より大きいので、最新のパッケージをインストールする場合、常に mainline 版の nginx が選択されることになります。

Nginx パッケージのインストール

準備が整ったので、Nginx をインストールします。最初のインストール時には GPG 鍵がインポートされます。

$ sudo dnf install nginx
...
(途中省略)
...
トランザクションの概要
==============================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 800 k
インストール済みのサイズ: 2.9 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード中です:
nginx-1.17.6-1.el8.ngx.x86_64.rpm                             185 kB/s | 800 kB     00:04    
----------------------------------------------------------------------------------------------
合計                                                          185 kB/s | 800 kB     00:04     
警告: /var/cache/dnf/nginx-mainline-f354473966140c6b/packages/nginx-1.17.6-1.el8.ngx.x86_64.rpm:
 ヘッダー V4 RSA/SHA1 Signature、鍵 ID 7bd9bf62: NOKEY
nginx mainline repo                                           775  B/s | 1.5 kB     00:02    
GPG 鍵 0x7BD9BF62 をインポート中:
 Userid     : "nginx signing key "
 Fingerprint: 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
 From       : https://nginx.org/keys/nginx_signing.key
これでよろしいですか? [y/N]: y
鍵のインポートに成功しました
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                      1/1 
  scriptletの実行中: nginx-1:1.17.6-1.el8.ngx.x86_64                                      1/1 
  Installing       : nginx-1:1.17.6-1.el8.ngx.x86_64                                      1/1 
  scriptletの実行中: nginx-1:1.17.6-1.el8.ngx.x86_64                                      1/1 
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* http://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

----------------------------------------------------------------------

  検証             : nginx-1:1.17.6-1.el8.ngx.x86_64                                      1/1 

インストール済み:
  nginx-1:1.17.6-1.el8.ngx.x86_64                                                             

完了しました!
$ 

Nginx のサービス起動

Nginx のサービスを起動 (start) します。また、システムの再起動後に自動起動 (enable) するようにもしておきます。

$ sudo systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: http://nginx.org/en/docs/
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
$ sudo systemctl status nginx
 nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-11-26 20:30:09 JST; 42s ago
     Docs: http://nginx.org/en/docs/
 Main PID: 9240 (nginx)
    Tasks: 2 (limit: 26213)
   Memory: 5.6M
   CGroup: /system.slice/nginx.service
           ├─9240 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           └─9241 nginx: worker process

11月 26 20:30:09 centos-pc systemd[1]: Starting nginx - high performance web server...
11月 26 20:30:09 centos-pc systemd[1]: Started nginx - high performance web server.
$ 

ファイアーウォールの設定

まず、現在のファイアーウォールの設定を確認します。

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 3389/tcp 8787/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
 
$ 

とりあえず http と https のサービスを追加して、設定をロードし直します。

$ sudo firewall-cmd --zone=public --permanent --add-service=http
[sudo] bitwalk のパスワード:
success
$ sudo firewall-cmd --zone=public --permanent --add-service=https
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0
  sources: 
  services: cockpit dhcpv6-client http https ssh
  ports: 3389/tcp 8787/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
 
$ 

LAN 内の他の PC から、Nginx がインストールされたサーバ (192.168.0.25) へ http でアクセスしてみると、Nginx の Welcome ページが表示されました。

とりあえず Nginx のサービスが動作することを確認できました。ここまでの設定では SELinux からアクセス制御エラーは出ませんでした。SELinux をできるだけ無効にせずにシステムを利用したいと考えていますので、エラーが出れば、その対応についてもまとめていきたいです。

今後、Django などの Web アプリケーションをデプロイする際の設定や問題をまとめてブログ記事にする予定です。

参考サイト

  1. nginx: Linux packages
  2. nginx-repo Wiki - OSDN
  3. Introducing NGINX 1.16 and 1.17 - NGINX

ブログランキング・にほんブログ村へにほんブログ村

2019-11-24

Linux ディストロ探訪(10) 〜 Fedora Silverblue 〜

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 へのシンボリックリンクになっています。

 Silverblue のルートディレクトリ 

rpm-ostree

OSTree が管理するファイルシステムツリー(= OS 環境)は書き換えることができないため、セキュリティ的には非常に堅牢ですが、従来の rpm や deb によるパッケージ単位の管理に比べれば制約が大きく不便になります。そこで、OSTree の機能と、rpm によるパッケージ管理機能を組み合わせたシステムが rpm-ostree です。rpm-ostree で管理するシステムは OSTree による OS のイメージ管理と rpm によるパッケージ管理を併せ持つので、ハイブリッドシステムと呼ばれています。

コマンドラインのヘルプと参考資料 [4] を元にして、rpm-ostree コマンドの概略をまとめました。

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 とタイプして起動しているイメージの情報を表示しました。

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 を使わずに実行できました。

rpm-ostree upgrade の使用例 
[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 とタイプして起動しているイメージの情報を確認すると二種類のイメージが存在していることがわかります。

rpm-ostree status の使用例 (2) 
[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 とタイプして、ロールバックしてみました。

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 とタイプして起動しているイメージの情報を確認すると最初のイメージが有効になっていることを確認できます。

rpm-ostree status の使用例 (3) 
[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 はインストールされていませんでした。

rpm コマンドでパッケージ確認 
[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 で再起動です。

rpm-ostree install の使用例 
[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 と、追加したパッケージの情報が別に記載されています。

rpm-ostree status の使用例 (4) 
[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 を実行してインストールしておきました。

dnf および rpm によるローカル rpm パッケージのインストール(失敗例) 
[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 コマンドでインストールしました。

rpm-ostree によるローカル rpm パッケージのインストール例 
[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 パッケージの情報が別に記載されています。

rpm-ostree status の使用例 (5) 
[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 をインストールした後、アプリがアプリケーション・ビューに登録され、問題なく起動できることを確認しました。

 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 remotes
Name    Options
fedora  system,oci
flathub system
$ 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 search gimp
Name                                               Description                                                      Application ID                         Version             Branch             Remotes
GIMP (GNU Image Manipulation Program)              画像の作成と写真の編集を行います                                                 org.gimp.GIMP                          2.10.14             stable             fedora,flathub
Glimpse                                            画像の作成と写真の編集を行います                                                 org.glimpse_editor.Glimpse             0.1.0               stable             flathub
Scans to PDF                                       Create small, searchable PDFs from scanned documents             com.github.unrud.djpdf                 0.1.0               stable             flathub
$ 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 install gimp
Looking for matches…
Remotes found with refs similar to ‘gimp’:

   1) ‘fedora’ (system)
   2) ‘flathub’ (system)

Which do you want to use (0 to abort)? [0-2]: 2
Found ref ‘app/org.gimp.GIMP/x86_64/stable’ in remote ‘flathub’ (system).
Use this ref? [Y/n]: y
Required runtime for org.gimp.GIMP/x86_64/stable (runtime/org.gnome.Platform/x86_64/3.32) found in remote flathub
Do you want to install it? [Y/n]: y

org.gimp.GIMP permissions:
    ipc                   network        x11       file access [1]
    dbus access [2]       tags [3]

    [1] /tmp, host, xdg-config/GIMP, xdg-config/gtk-3.0
    [2] org.freedesktop.FileManager1, org.gtk.vfs, org.gtk.vfs.*
    [3] stable
        ID                                           Arch          Branch        Remote         Download
 1. [✓] org.gnome.Platform                           x86_64        3.32          flathub        360.0 MB / 374.0 MB
 2. [✓] org.gnome.Platform.Locale                    x86_64        3.32          flathub          1.8 MB / 320.0 MB
 3. [✓] org.freedesktop.Platform.html5-codecs        x86_64        18.08         flathub          3.2 MB / 3.3 MB
 4. [✓] org.gimp.GIMP                                x86_64        stable        flathub        106.5 MB / 108.9 MB

Installation complete.
$ flatpak run org.gimp.GIMP
アプリケーション ID を run コマンドで実行します。
ただし 多くの場合はアイコンをクリックしてアプリケーションを起動できます。
$ flatpak update
インストールされているアプリケーションとランタイムを最新のものに更新します。
$ flatpak list
$ flatpak list --app
インストールされているアプリケーションとランタイムの一覧を表示します。
アプリケーションの一覧のみを表示したい場合は、--app を付加します。
$ flatpak list
Name                   Application ID              Version Branch Installation
html5-codecs           …ktop.Platform.html5-codecs         18.08  system
GIMP (GNU Image Manip… org.gimp.GIMP               2.10.14 stable system
GNOME Application Pla… org.gnome.Platform                  3.32   system
$ flatpak list --app
Name                                Application ID Version Branch Installation
GIMP (GNU Image Manipulation Progr… org.gimp.GIMP  2.10.14 stable system
$ 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 によるインストール履歴を表示します。
$ flatpak history
Time            Change         Application                           Branch Installation                                                                           Remote
11月 24 09:52:42 add remote                                                  system                                                                                 flathub
11月 24 10:04:07 pull           org.gnome.Platform                    3.32   /var/tmp/flatpak-cache-G91WB0/org.gnome.Platform-E84WB0/repo-fm0dQv                    flathub
11月 24 10:04:41 pull local     org.gnome.Platform                    3.32   system                                                                                 /var/lib/flatpak/repo/tmp/flatpak-cache-JJ1TB0/repo-fm0dQv
  ...
(途中省略)
  ...
11月 24 10:06:06 deploy install org.gimp.GIMP                         stable system                                                                                 flathub

Fedora Toolbox

Fedora Toolbox は開発者のためにユーザーアカウント単位でコンテナ環境を提供するコマンドラインツールです。toolbox enter コマンドでコンテナ環境に入り、ユーザーアカウントのディレクトリにアクセスできます。また、dnf コマンドがここでは利用できます。

Silverblue ではデフォルトで Toolbox がインストールされていたので、Silverblue 固有なツールと思っていましたが、通常の Fedora 31 Workstation でも利用できます。

コマンド例 説  明
toolbox create [--container <name>]
  toolbox 用のコンテナを作成します。デフォルトで Fedora のイメージが OCI 標準に準拠した形式でダウンロードされます。
$ toolbox create
Image required to create toolbox container.
Download registry.fedoraproject.org/f31/fedora-toolbox:31 (500MB)? [y/N]: y
Created container: fedora-toolbox-31
Enter with: toolbox enter
toolbox enter [--container <name>]
  toolbox のコンテナに入って、インタラクティブに設定などをします。
[bitwalk@localhost ~]$ toolbox enter

Welcome to the Toolbox; a container where you can install and run
all your tools.

 - Use DNF in the usual manner to install command line tools.
 - To create a new tools container, run 'toolbox create'.

For more information, see the documentation.

⬢[bitwalk@toolbox ~]$ sudo dnf install htop

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Fedora Modular 31 - x86_64                      715 kB/s | 5.2 MB     00:07    
Fedora Modular 31 - x86_64 - Updates            1.4 MB/s | 3.1 MB     00:02    
Fedora 31 - x86_64 - Updates                    3.9 MB/s |  12 MB     00:03    
Fedora 31 - x86_64                              6.1 MB/s |  71 MB     00:11    
Last metadata expiration check: 0:00:01 ago on Sun Nov 24 12:08:55 2019.
Dependencies resolved.
================================================================================
 Package        Architecture     Version                 Repository        Size
================================================================================
Installing:
 htop           x86_64           2.2.0-6.fc31            fedora           112 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 112 k
Installed size: 250 k
Is this ok [y/N]: y
Downloading Packages:
htop-2.2.0-6.fc31.x86_64.rpm                    648 kB/s | 112 kB     00:00    
--------------------------------------------------------------------------------
Total                                           142 kB/s | 112 kB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : htop-2.2.0-6.fc31.x86_64                               1/1 
  Running scriptlet: htop-2.2.0-6.fc31.x86_64                               1/1 
  Verifying        : htop-2.2.0-6.fc31.x86_64                               1/1 

Installed:
  htop-2.2.0-6.fc31.x86_64                                                      

Complete!
⬢[bitwalk@toolbox ~]$ rpm -qa | grep htop
htop-2.2.0-6.fc31.x86_64
⬢[bitwalk@toolbox ~]$ exit
logout
[bitwalk@localhost ~]$
toolbox list
  ローカルにある toolbox のイメージとコンテナの一覧を表示します。
[bitwalk@localhost ~]$ toolbox list
IMAGE ID      IMAGE NAME                                        CREATED
a198bc8c3cda  registry.fedoraproject.org/f31/fedora-toolbox:31  2 weeks ago

CONTAINER ID  CONTAINER NAME     CREATED         STATUS             IMAGE NAME
91406a7a66dd  fedora-toolbox-31  23 minutes ago  Up 14 minutes ago  registry.fedoraproject.org/f31/fedora-toolbox:31
[bitwalk@localhost ~]$ 
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 デスクトップがもっと普及するようになるかもしれません。オープンソースの世界は多様性に富んでいますから、まだ flatpak がデファクトスタンダードになるかどうかは未知です。しかし、rpm とか deb というようなパッケージ管理の違いを超えて、アプリケーションの仮想化の時代に突入したといえます。

Siliverblue が現行の Fedora Workstation に置き換わるとすれば、flatpak が今後どこまで普及するかどうかにかかっているように思います。

参考サイト

  1. An Introduction to Fedora Atomic Workstation — Project Atomic
  2. What is Silverblue? - Fedora Magazine [2019-07-12]
  3. Team Silverblue — Download
  4. rpm-ostree command man page | ManKier
  5. Applications—Linux Apps on Flathub
  6. 2019年7月2日 Xからの脱却 ―Fedora,次バージョンでのデスクトップ改善ポイントを提示:Linux Daily Topics|gihyo.jp … 技術評論社 [2019-07-02]
  7. bitWalk's: Fedora Silverblue と Toolbox [2020-11-03]

ブログランキング・にほんブログ村へ
にほんブログ村

2019-11-09

R Shiny のプロットにツールチップを表示する (2)

Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.R と、内部動作を司る server.R の二つの R 言語スクリプトで、サーバーサイドのコンテンツを作成できることが大きな特徴です。

RjpWiKi より引用

UI のレイアウトを変えるとツールチップの表示がズレる!

ブログ記事 [1] で、プロットされたデータ点にマウスのポインタを近づけると、データ点に関係する情報をツールチップで表示する、という機能が実装できて喜んだのも束の間、問題を出ました。

 ツールチップを表示した例(参考サイト [1]) 

レイアウトを変えてプロットの上にウィジェットを配置すると、ツールチップが表示される位置がとんでもなくズレてしまうのです(下図)。

 レイアウトを変えてツールチップを表示した例 

改良版

マウスのポインタの座標を取得する仕組みを理解できておらず、どのようにすれば解決できるのかが皆目判らなかったので、とにかく他の方々がどのようにツールチップを表示させているのかをインターネットで探し続けると、参考サイト [2] にヒントがありました。

ui.R を下記に示しました。プロットを表示するブロックに、CSS のスタイル position: relative; を加えることでズレを解消できました。

リスト:ui.R 
fluidPage(
    fluidRow(
        titlePanel("Iris explorer"),
        selectInput(
            inputId = "varX",
            label = "Select the X variable",
            choices = get.choices()),
        selectInput(
            inputId = "varY",
            label = "Select the Y variable",
            choices = get.choices(), selected = 2)
    ),
    hr(),
    fluidRow(
        style = "position: relative;",
        plotOutput(
            outputId = "plot",
            dblclick = "plot_dblclick",
            brush = brushOpts(
                id = "plot_brush",
                resetOnNew = TRUE
            ),
            hover = hoverOpts("plot_hover", delay = 100, delayType = "debounce")
        ),
        uiOutput("hover_info")
    )
)

server.R を下記に示しました(参考サイト [1] と同じ)。

リスト:server.R 
function(input, output) {
    ranges <- reactiveValues(x = NULL, y = NULL)
    var.x <- reactive(iris[, as.numeric(input$varX)])
    var.y <- reactive(iris[, as.numeric(input$varY)])
    label.x <- reactive(names(iris[as.numeric(input$varX)]))
    label.y <- reactive(names(iris[as.numeric(input$varY)]))
    
    output$plot <- renderPlot({
        ggplot(iris, aes(x = var.x(), y = var.y(), colour = Species)) +
            xlab(label.x()) + ylab(label.y()) + 
            coord_cartesian(xlim = ranges$x, ylim = ranges$y, expand = FALSE) +
            geom_point(size = 4) + gtheme
    })
    
    observeEvent(input$plot_dblclick, {
        brush <- input$plot_brush
        if (!is.null(brush)) {
            ranges$x <- c(brush$xmin, brush$xmax)
            ranges$y <- c(brush$ymin, brush$ymax)
        } else {
            ranges$x <- NULL
            ranges$y <- NULL
        }
    })
    
    output$hover_info <- renderUI({
        hover <- input$plot_hover
        point <- nearPoints(iris, hover, xvar = label.x(), yvar = label.y(), threshold = 5, maxpoints = 1, addDist = TRUE)
        if (nrow(point) == 0) return(NULL)
        
        wellPanel(
            style = get.style(hover),
            p(HTML(paste0("<b> Species: </b>", point$Species, "<br/>",
                          "<b> ", label.x(), ": </b>", point[, label.x()], "<br/>",
                          "<b> ", label.y(), ": </b>", point[, label.y()], "<br/>")))
        )
    })
}

global.R を下記に示しました(参考サイト [1] と同じ)。

リスト:global.R 
library(shiny)
library(ggplot2)

gtheme <- theme(
    axis.title = element_text(size = 16),
    axis.text = element_text(size = 16),
    axis.line = element_line(),
    legend.title =  element_text(size = 14),
    legend.text = element_text(size = 14),
    panel.grid.major = element_line(colour="grey",size = rel(0.5)), 
    panel.grid.minor = element_blank(), 
    panel.background = element_rect(fill = "whitesmoke")
)

get.choices <- function() {
    part.iris <- list()
    for (item in names(iris)) {
        if (item != "Species") {
            part.iris[[item]] <- grep(item, names(iris))
        }
    }
    return(part.iris)
}

get.left_px <-  function(hover) {
    left_pct <- (hover$x - hover$domain$left) / (hover$domain$right - hover$domain$left)
    left_px <- hover$range$left + left_pct * (hover$range$right - hover$range$left)
    return(left_px)
}

get.top_px <-  function(hover) {
    top_pct <- (hover$domain$top - hover$y) / (hover$domain$top - hover$domain$bottom)
    top_px <- hover$range$top + top_pct * (hover$range$bottom - hover$range$top)
    return(top_px)
}

get.style <- function(hover) {
    style <- paste0("position: absolute; z-index: 100; ",
                    "left:", get.left_px(hover) + 2, "px; ",
                    "top:", get.top_px(hover) + 2, "px; ",
                    "background-color: rgba(245, 245, 245, 0.75); ",
                    "font-family: monospace;")
    return(style)
}

下記に実行例を示しました。

 ツールチップを表示した例(改良版) 

無事解決できましたが、正直、なんとなくコツをつかめたというレベルです。

参考サイト

  1. bitWalk's: R Shiny のプロットにツールチップを表示する [2019-10-10]
  2. Shiny でマウスの位置に応じてプロットにツールチップを表示する | Atusy's blog [2019-08-06]

 

 

ブログランキング・にほんブログ村へにほんブログ村

2019-11-05

【備忘録】Python で case 文相当の処理

他のプログラミング言語にあって python に無いもののひとつに switch 文があります。代替案として辞書型を使う方法が多くのサイトで紹介されていますが、switch 文でそれぞれ別のメソッドに処理を移したい時に却って使いづらいと感じ、結局、if-elif-else を使う方法を採っていました。

ところが、参考サイト [1] に別の方法が紹介されていました。例えば、変数の値 1, 2, ... に対して、メソッド method_1. method_2, ... を用意しておき、getattr を使って、文字列からメソッドオブジェクトを取得して、実行するという方法です。これは使える!と思い、以下にその部分を引用し、備忘録としました。

class Switcher(object):
    def numbers_to_months(self, argument):
        """Dispatch method"""
        method_name = 'month_' + str(argument)
        # Get the method from 'self'. Default to a lambda.
        method = getattr(self, method_name, lambda: "Invalid month")
        # Call the method as we return it
        return method()
 
    def month_1(self):
        return "January"
 
    def month_2(self):
        return "February"
 
    def month_3(self):
        return "March"
 
    ...

参考サイト

  1. How to implement a switch-case statement in Python - JAXenter

 

ブログランキング・にほんブログ村へにほんブログ村