20190529のLinuxに関する記事は10件です。

Windowsクライアントを使って、クラウド上のLinuxサーバでGUIアプリを実行したい(2)

1. 今回は設定編

前回は代表的な実現方法と、それぞれの特徴について説明した。今回はXサーバ「VcXsrv」での設定方法や使い方を説明する。

1-2. 作業の流れ

設定手順は以下の通り。1から2がLinuxサーバでの手順で、3から6がWindowsクライアントの手順である。今回はPuTTYを使用するが、Tera Termでも同じことができる。

Linuxサーバで実施:
 1. X11フォワーディングに必要なライブラリをLinuxにインストールする
 2. X11フォワーディングするようにsshdを設定する
Windowsクライアントで実施:
 3. VcXsrvをWindowsクライアントにインストールする
 4. VcXsrvを起動する
 5. sshクライアント(PuTTY)をX11フォワーディング用に設定する
 6. sshクライアント(PuTTY)でLinuxサーバに接続する

1-3. 使用環境

今回は以下の環境を使用している。またOracle Cloud Infrastructureを使用しているが、他のクラウドでもほとんど同じはずだ。

  • CentOS 7 / Oracle Linux 7
  • CentOS 6 / Oracle Linux 6

1-4. 前提条件

  • WindowsクライアントにPuTTYがインストール済みで、Linuxサーバに接続可能な状態になっていること。Tera Termについては説明しないので、他の記事を参考にしてほしい。

2. Linuxサーバにライブラリをインストールする

X11フォワーディング(画面転送)を使用するときは、Linuxサーバに完全なデスクトップ環境は不要である。しかし必要最小限のライブラリ群は必要になる。

2-1. Linuxサーバに必要なライブラリ

X11フォワーディングに必要なライブラリは以下の通り。一般にはxorg-x11-xauthだけで十分だ。しかし以前使ったGUIツール(WebLogicのインストーラ)ではライブラリが不足していて起動できないことがあった。

  • xorg-x11-xauthxauth
  • libXtst
  • libXrender

たいした大きさでもないし、不足していたときのトラブルシュートが意外と大変なので、念のためlibXtstlibXrenderを追加している。

2-2. ライブラリをインストールする

以下のコマンドでインストールする。

注目して欲しいのが、末尾のInstalled sizeである。GNOMEデスクトップのインストールには数百MBytesのパッケージが必要になるが、今回のライブラリは5MBytesにも満たない。

#  yum install xauth libXtst libXrender -y
---以下コマンドの実行結果---
★中略★
================================================================================
 Package              Arch         Version               Repository        Size
================================================================================
Installing:
 libXrender           x86_64       0.9.10-1.el7          ol7_latest        25 k
 libXtst              x86_64       1.2.3-1.el7           ol7_latest        20 k
 xorg-x11-xauth       x86_64       1:1.0.9-1.el7         ol7_latest        29 k
Installing for dependencies:
 libICE               x86_64       1.0.9-9.el7           ol7_latest        66 k
 libSM                x86_64       1.2.2-2.el7           ol7_latest        39 k
 libX11               x86_64       1.6.5-2.el7           ol7_latest       606 k
 libX11-common        noarch       1.6.5-2.el7           ol7_latest       163 k
 libXau               x86_64       1.0.8-2.1.el7         ol7_latest        28 k
 libXext              x86_64       1.3.3-3.el7           ol7_latest        38 k
 libXi                x86_64       1.7.9-1.el7           ol7_latest        40 k
 libXmu               x86_64       1.1.2-2.el7           ol7_latest        70 k
 libXt                x86_64       1.1.5-3.el7           ol7_latest       172 k
 libxcb               x86_64       1.13-1.el7            ol7_latest       213 k

Transaction Summary
================================================================================
Install  3 Packages (+10 Dependent packages)
Total download size: 1.5 M
Installed size: 4.6 M ★とてもサイズが小さい
★以下省略

2-3. xeyesをインストールする

動作確認用のGUIアプリケーションxeyesをインストールする。xeyesxorg-x11-appsに含まれるプログラムなので、以下のような実行結果になっている。それにしてもxeyesは懐かしいですなあ。X端末時代が思い出される。

# yum install xeyes -y
---以下コマンドの実行結果---
★中略★
================================================================================
 Package              Arch          Version             Repository         Size
================================================================================
Installing:
 xorg-x11-apps        x86_64        7.7-7.el7           ol7_latest        307 k
Installing for dependencies:
 libXcursor           x86_64        1.1.15-1.el7        ol7_latest         30 k
 libXfixes            x86_64        5.0.3-1.el7         ol7_latest         18 k
 libXxf86vm           x86_64        1.1.4-1.el7         ol7_latest         17 k
 libfontenc           x86_64        1.1.3-3.el7         ol7_latest         30 k
 libxkbfile           x86_64        1.0.9-3.el7         ol7_latest         82 k

Transaction Summary
================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 484 k
Installed size: 1.1 M

★以下省略★

3. Linuxサーバのsshdを設定する

X11フォワーディングできるようにsshdを設定する。設定値を確認して、設定が不足していれば変更する。

3-1. X11フォワーディングで設定するパラメータ

確認するパラメータは以下の通り。

  • X11Forwarding yesであること
  • X11UseLocalhostはコメントアウトされているかnoであること
  • AddressFamily inetであること(IPv6が無効化されている環境のみ)。それ以外はデフォルトのanyでも問題ない

それぞれのパラメータの意味はman sshd_configで確認できる。

3-2. 現在のsshdパラメータを確認する

sshdの設定ファイル/etc/ssh/sshd_configに設定されている値を確認する。

# grep -e X11UseLocalhost -e X11Forwarding -e AddressFamily /etc/ssh/sshd_config
---以下コマンドの実行結果---
#AddressFamily any
#X11Forwarding no
X11Forwarding yes
#X11UseLocalhost yes
#       X11Forwarding no

3-3. sshdのパラメータを変更する

どの値を変更するかは各自の状況に応じて判断して欲しい。当然エディタで変更してもかまわない。今回はAddressFamilyanyからinetに変更する。

# sed -i -e "s/^\#AddressFamily any/AddressFamily inet/" /etc/ssh/sshd_config

今回一番ハマったのがAddressFamilyの値である。デフォルトのanyでも問題ないはずだが、Oracle Cloud Infrastructure Computeの2019年5月OSイメージでは、これが原因で接続できなかった。

半年以上前に以下のホワイトペーパー通りに試したときには問題なかった気がするのだが…。Oracle Cloud Infrastructureを使用していなくても、IPv6が無効化されているときは変更した方がいいかもしれない。

今回は↓のエントリを参考にさせていただきました。ora_gonsuke777さん、ありがとうございます。

IPv6が無効化の確認方法:
IPv6が無効化されていることはipコマンドで判別できる。以下のようにinetで始まる行だけで、inet6で始まる行がないときはIPv6が無効化されている可能性がある。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:00:13:0c brd ff:ff:ff:ff:ff:ff
    inet 10.5.0.2/24 brd 10.5.0.255 scope global dynamic ens3
       valid_lft 81375sec preferred_lft 81375sec

3-4. パラメータが正しく設定されていることを確認する

最後にもう一度、正しく設定されていることを確認する。

# grep -e X11UseLocalhost -e X11Forwarding -e AddressFamily /etc/ssh/sshd_config
---以下コマンドの実行結果---
AddressFamily inet
X11Forwarding yes
#X11UseLocalhost yes
#       X11Forwarding no

3-5. sshdのパラメータを有効化する

パラメータを有効にするためにsshdを再起動する。

 CentOS 7 / Oracle Linux 7 の場合

# systemctl restart sshd

 CentOS 6 / Oracle Linux 6 の場合

# service sshd restart

これでLinuxサーバ側の作業はおわりだ。次にWindowsクライアント側で設定する。

3-6. まとめ版(7系Linux OS用)

コピペ用のまとめ版。使用環境よって/etc/ssh/sshd_configの内容は異なるので、grepの結果を確認すること。

# 必要ライブラリのインストール
yum install xauth libXtst libXrender -y
yum install xeyes -y

# AddressFamilyの変更
sed -i -e "s/^\#AddressFamily any/AddressFamily inet/" /etc/ssh/sshd_config

# 設定値の確認。X11UseLocalhostが
grep -e X11UseLocalhost -e X11Forwarding -e AddressFamily /etc/ssh/sshd_config

# sshd再起動
systemctl restart sshd

4. VcXsrvをインストールする

ここからはWindowsクライアントでの作業になる。

  1. VcXsrv公式サイト(SourceForge)からインストーラをダウンロードして実行する。これ以降は基本的にデフォルトのままでよい。
    SnapCrab_VcXsrv Setup Installation Options_2019-5-23_17-57-28_No-00.png

  2. インストール先フォルダが表示されるので、このままでよいときは[Install]をクリックする。
    SnapCrab_VcXsrv Setup Installation Folder_2019-5-23_17-57-41_No-00.png

  3. Completedと表示されたら、[Close]をクリックしてインストーラを終了する。
    SnapCrab_VcXsrv Setup Completed_2019-5-23_17-58-4_No-00.png

5. VcXsrvを起動する

X11フォワーディングで画面を転送できるようにVcXsrvを起動する。

  1. WindowsデスクトップのXLaunchアイコンをクリックしてVcXsrvを起動する。
    SnapCrab_NoName_2019-5-23_17-59-38_No-00.png
    なおVcXsrvとXmingの両方をインストールしているときは、アイコンも名前も同じで区別しづらい。名前を変えたほうがいいだろう。

  2. どれを選んでもよいが、デフォルトのまま[次へ]をクリックする
    SnapCrab_Display settings_2019-5-23_18-1-46_No-00.png

  3. まだPuTTYを起動していないので、[start no client]を選択してから[次へ]をクリックする。
    SnapCrab_Client startup_2019-5-23_18-59-33_No-00.png

  4. デフォルトのまま[次へ]をクリックする。
    SnapCrab_Extra settings_2019-5-23_18-3-14_No-00.png

  5. これで設定は終了である。今後も同じ設定を利用するときは[Save configuration]をクリックする。
    SnapCrab_Finish configuration_2019-5-23_18-3-24_No-00.png

  6. 起動に成功するとデスクトップ右下のタスクバーにアイコンが表示される。これ以降、Windowsをシャットダウンしたり、VcXsrvを明示的に停止したりしない限り、起動したままになっている。
    xserver03.PNG

6. PuTTYを設定する

PuTTYはLinuxサーバに接続する設定があることを前提に、それをカスタマイズする。

  1. PuTTYを起動して、使用する接続情報をロードする。

  2. 左側のツリーから[Connection]-[SSH]-[X11]を選択し、X11フォワーディングを有効化する。
    SnapCrab_PuTTY Configuration_2019-5-23_18-8-42_No-00.png

  3. 必須項目でないが圧縮を有効化する。
    SnapCrab_PuTTY Configuration_2019-5-23_18-21-24_No-00.png

  4. 最後に左側ツリーの[Session]に戻り、変更した設定を保存する。これを忘れると変更が消えるので注意すること。

  5. これで設定は終了である。次から実際にLinuxサーバに接続する。

7. Linuxサーバに接続する(基本編)

まずは基本編として、踏み台なしでLinuxサーバに接続する。

  1. 右下のタスクバーで、VcXsrvが起動していることを確認する。アイコンが無いときは起動する。
    xserver03.PNG

  2. 前のステップで保存した設定を利用し、PuTTYでLinuxサーバに接続する。

  3. DISPLAY環境変数が設定されているか確認する。sshdとPuTTYを正しく設定していれば、自動的に設定されているはずである。

$ echo $DISPLAY
localhost:10.0

4.動作確認のためxeyesを起動する。デスクトップに以下の目玉が表示されれば成功している。

$ xeyes &

xeyes.PNG

8. 次回は?

事前にsshで接続できていれば、驚くほど簡単な作業だったかもしれない。次回は踏み台経由の接続方法を説明する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux基礎①

『ゼロからはじめるLINUXサーバ構築・運用ガイド 動かしながら学ぶWEBサーバーの作り方』を参考に、Linuxについての学びを記録します。

UNIXとLinux

UNIXはLinuxに先立ち20年以上も前に開発がスタートしたOSで、大学や研究機関などを中心に使われてきた。

現在はUNIXは様々なものに枝分かれしていて、UNIXという単一のOSはなく、Appleが開発してMacのOSとして使われているOS XやOracleのUNIXであるSokarisがある。

Linuxはフィンランドの大学生だったリーナス・トーバルズ氏が開発したUNIXっぽいOSとして作り上げたもの。

公開当初はごくシンプルなOSだったが、多くの開発者の協力で高機能なOSへと発展した。

UNIXとLinuxは異なるOSであるものの、LinuxはUNIXの標準仕様に準拠して開発されているためUNIX系OSなどと呼ばれている。

そのためUNIX系OSで多くのコマンドが共通して利用できるほか、多くのUNIX向けソフトウェアもLinuxで利用できる。

Linuxカーネル

カーネルとはOSの中核となるプログラムのこと。

カーネルとシェル(利用者とカーネルの仲介役)、様々なプログラムを組み合わせることでOSとなる。

ディストリビューション

開発コミュニティ等がLinuxカーネルとシェルや多数のソフトウェアを組み合わせてインストーラと一緒に配布するようになり、これがディストリビューションと呼ばれる。

「Linux OS」はこのディストリビューションを指す。

Linuxのディストリビューションは数多くあるが、RedHat系とDebian系の2つに大別される。

Red Hat系ディストリビューション

Red Hat社はクラウド技術を中心にサービス展開する企業で、オープンソースソフトウェアを利用したビジネスを展開する米国企業です。

Linuxのカスタム・ディストリビューションで成功を収め、現在も様々なオープンソースコミュニティを利用したサービスを展開するほか、コミュニティへの貢献も積極的に行う世界的企業です。

Fedora: 先進的なディストリビューション

最新の技術を積極的に取り入れるディストリビューション。

Red Hat社が強力にサポートしていて、半年に1度のペースで新しいバージョンがリリースされる。

安定よりも最新技術を取り入れる志向が強く、企業の導入はあまりなく、個人ユーザに人気が高い。

Red Hat Enterprise Linux: 企業向けディストリビューション

Red Hat社が開発している企業向けのディストリビューション。

安定よりも最新技術を取り入れる指向が強いFedoraに対して、Fedoraの成果を取り込み安定してソフトウェアを取り入れる。

Red Hat社とサブスクリプション契約することで常に最新バージョンを利用できる。

CentOS: Red Hat Enterprise Linuxをもとに再ビルドしたディストリビューション

Red Hat Enterprise Linuxを構成するソフトウェアのほとんどはオープンソースで、ライセンスに基づいてソースコードが公開されている。

Red Hat Enterprise Linuxも同様にソースコードは公開されており、このコードを再ビルドしたディストリビューションがCentOSになる。

Red Hat社のサポートは受けられないが、Red Hat Enterprise Linuxとほぼ同じものを無償で使えるため、Red Hat社のサポートを必要としない企業や個人から人気になっている。

ちなみにこのCentOSの開発コミュニティもRed Hat社がサポートしている。

Debian系ディストリビューション

Debian はコミュニティによって作られる
「自由なオペレーティングシステム(OS)」です。
引用: Debian JP Project

Debian GNU/Linux

GNU ツール・Linux カーネル・その他の重要なフリーソフトウェアとを組み合わせることで作られるディストリビューション。

コミュニティベースで開発され、無償で利用できる。

Ubuntu(ウブントゥ)

Debian GNU/Linuxをベースにしたディストリビューションで、コミュニティによって開発されている。

Canonical社も開発をサポートしている。

Fedora同様に新しいバージョンのリリースが早く、また2年に一度LTS(Long Term Support)版という長期サポートがあるバージョンがリリースされる。

Ubuntuの場合、バージョン表記は「年.月」で表示されるため、2019年4月リリースのバージョンは「Ubuntu 19.04」となる。

Lubuntu(ルブントゥ)

Debian GNU/Linuxから派生したUbuntuから、さら派生したディストリビューションの1つ。

低スペックでも軽快に動作するよう作られており、Ubuntuを動かすのが厳しいパソコンでも快適に利用できる。

Linux Mint

DebianおよびUbuntuをベースとしたディストリビューションで、Ubuntuに次いで人気が高い。

30000を超える全てのソフトウェアが無料で利用でき、セキュリティ性も高いディストリビューションです。

Linuxディストリビューションの構成

LinuxディストリビューションはLinuxカーネル/シェル/コマンド/各種ライブラリに加えて、サーバーソフトウェア、クライアントソフトウェア、GUIから構成されている。

カーネル

OSの中核となるプログラムで、ハードウェアやシステム上で動作するプログラムを管理する。

2019年5月現在のLinuxカーネルの最新バージョンは「4.20」で、新機能追加で2つ目の数字が上がり、不具合修正で3つ目の数字が上がる。

Linuxカーネルは通常、リーナス・トーバルズ氏が公開しているものを指すが、Linuxディストリビューションで使用されているカーネルはさらに改修をを加えたものが利用されることが多い。

シェル

カーネルと利用者を仲介するプログラム。
OSユーザのためにインタフェースを提供するソフトウェアで、コマンド入力を受け付けて実行したりする。

コマンド

Linuxで利用できる実行形式のプログラムで、シェルにコマンド名を入力することで対応するプログラムが実行される。

ライブラリ

プログラムの共通部品となるもので、よく使用されるプログラムの共通部分を抜き出し、他のプログラムから利用できるようにしたもの。

GUI(Graphical User Interface)

WindowsやOS Xのようなウィンドウを表示してマウスで操作するようなインターフェースをGUIと呼び、コマンドを入力してその結果を文字で受け取るのがCUI(Character User Interface)と呼ぶ。

Linuxディストリビューションでは、この部分はLinuxカーネルとは別のプログラム群で構成されていて、X Window Systemおよびウィンドウマネージャというプログラム群で作られている。

クライアントソフトウェア

Webブラウザやゲームソフトなどのクライアントソフトウェアを指す。

ChromeやFirefoxなどのブラウザのLinux版も提供されている。

サーバーソフトウェア

Apache HTTP Server

世界中で使用されているWebサーバーソフトウェアで、世界一のシェアを持つ。

2017年4月時点では全世界で約50%のシェアを占めていて、大規模な商用サイトや公的サイト、自宅サーバまで幅広く利用されている。

nginx(エンジンエックス)

大量の接続があるWebサイトではApacheよりもパフォーマンスが良く、大量の処理をするのに向いている。

その他サーバーソフトウェア

・Postfix: Linux標準のメールサーバー
・Dovecot: メールサーバーに届いたメールをダウンロードするためメールクライアントが接続するIMAPとPOPのサーバ
・BIND: ホスト名・ドメイン名とIPアドレスの対応付けを行うDNSサービスを提供するDNSサーバー
・Samba: Windowsのファイルサーバー機能やActive Directoryのドメインコントローラーを実現するサーバー
・Squid: 社内から社外へWebアクセスするときに社内のクライアントに変わってWebサーバーへ代理でアクセスするプロキシサーバー

*プロキシサーバー:内部のネットワークとインターネットの境界で動作し、両者間のアクセスを代理して行うもの(引用:https://www.idcf.jp/words/proxy-server.html)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuxにVirtualbox経由でネットワークで接続する

仮想マシンを起動する前に、ネットワーク設定を変更
*名前のところはEithernetかWiFi経由の場合はそちらを選択すること

image.png

linuxにログインしたら、ssh経由でアクセスするsshがあるか確認

ps -ef | grep sshd

sshではなくてsshdなのは、ssh daemonだから、-efのオプションは全てのプロセスを表示。詳しくはこちらを確認→ Linuxの環境変数とプロセス制御

もしない場合はインストールが必要。DEB環境であれば、
dkpg -l | grep ssh-serverで検索できる。
red hatなどであれば、rpm -qa | grep ssh-server
sudo apt-get updateをした後、
sudo apt-get install openssh-server openssh-clientでインストールしておこう。
centosやred hatはsudo yum install openssh-server openssh-clientでインストール。

無事インストールされれば先ほどの確認コマンドで表示される。

image.png

sshをスタートしてネットワークを確認

$ sudo service sshd start
$ /sbin/ip addr

lo, eth0, virbr0, virbr0-nic
の4つのネットワークインターフェースが出てくる。
loは127.0.0.1のループでeth0は先ほど設定したネットワークで、ここで表示されたinetのIPアドレスをメモ。X.X.X.X。

MacOSのterminalでSSH

$ssh adminuser@X.X.X.X
#アクセス確認されるのでyesで答えadminuserのパスを入れれば接続
[adminuser@localhost ~]$ 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxでソフトウェアをインストール

Packageとは、ファイルの集合体で、データやメタデータを含んでおり、パッケージの内容や、バージョン、Dependenciesなどが含まれる。

Packageを管理するのにPackage Managerを使うが、

packageのinstall, upgrade, deleteを行い、dependenciesを管理し、何がインストールされているかなどをメンテするもの。

yum search string #stringを検索
yum info [package] #infoを表示
yum install [-y] pacakage #packageをインストール
yum remove package #packageを削除

rpmマネジャー

rpm -qa #インストールされたpacakgesを全て表示
rpm -qf /path/to/file #ファイルのpackageを表示
rpm -ql package #パッケージのファイルを表示
rpm -ivh package .rpm #packageをインストール

image.png

su -でsuperユーザーになり
yum install inkscapeインストールしてみる。

image.png

途中「y/n」で聞かれたりするのが面倒な時は、yum install -yで答えを全てyesでスキップすることができる。ソフトウェアによってはdependenciesを別途インストールしたりする。

yumにパッケージがないソフトウェアをインストールしたい時は、直接公式サイトでrpmファイルをダウンロードし、rpm -ivhでインストールできる。

yumでインストールできないとき。

rpmを閲覧したいときは
rpm -qaで表示し、別途ページごとに見たい時は
rpm -qa | lessで見られるが、表示順がまばらなので、
rpm -wa | sort | lessで綺麗に閲覧できる。

whichを使って、どこに入っているかは確認できる。
which whichwhichがどこに入っているか確認でき、そのwhichの全ファイルは
rpm -ql whichで確認できる。

DebianやUbuntuなどのLinuxのディストリビューションを使っている時のインストールはaptを使う。sudoを忘れずに。

apt-cache search string #stringを検索
apt-get install [-y] package #packageをインストール
apt-get remove package #packageをアンインストール
apt-get purge package #packageとその構成ファイルを削除する
apt-cache show package #packageの情報を閲覧できる

DEBファイルからインストールしたい時はdpkgを使う。

dpkg -l #packageを一覧できる
dpkg -S /path/to/file #パッケージのファイルを一覧
dpkg -L package #packageの中のファイルを一覧
dpkg -i package.deb #packageをインストール
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】過去に実行したコマンドの一覧を取得するコマンド

備忘録として残します。

■やり方

#絞込なし
history
#絞込あり
history |grep 検索キーワード
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Arch Linux快適デスクトップ環境の構築 2019

前置き

今回のコンセプトは Mini-ITX の小型機に Ryzen 7 2700X を積む、だ。
( Ryzen 3000 は待てなかった…)
具体的な構成とお値段は以下。いずれも2019年5月時点。

分類 部品名 価格
ケース Metis Plus 5,378
CPU AMD Ryzen 7 2700X BOX (※M/B とセット価格) ※40,581
M/B GIGABYTE B450 I AORUS PRO WIFI -
メモリ Patriot PSD432G2666KH (288Pin/DDR4-2666/16GBx2) 18,981
SSD WD M.2-2280 / 500GB / WD Blue 3D / SATA3.0 6,980
電源 CORSAIR SFX600 Platinum 16,020
CPUファン 虎徹 MarkⅡ(SCKTT-2000) 3,132
追加ケースファン サイズ Kaze Flex 120 PWM 989
グラボ Palit NE5105T018G1-1070F(GTX1050Ti 4G GDR5 STORMX) 14,601

上記とアイネックス ナノダイヤモンドグリス JP-DX1(1,225円)を合わせて、都合 108,556 円。

上記を組み立てインストールの儀式へと入っていった。

以降、Arch Wiki を参照しながら進めていくが、リンクは(原典な気がするので)英語版を基本的に用い、日本語版にしかないコンテンツであればそちらを貼ることとした。
英語版でもサイドペインの「日本語」リンクをクリックすればすぐに日本語版記事に飛べるので、適宜そちらも参照するとよい。

OS インストール

基本は公式インストールガイドに従う。

インストールの準備

署名の検証

これは旧 Arch 機から行なった。
今回は archlinux-2019.05.02-x86_64.iso を用いたが、バージョンはその時最新のものを指定しよう。

$ wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2019.05.02/archlinux-2019.05.02-x86_64.iso
$ wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2019.05.02/archlinux-2019.05.02-x86_64.iso.sig
$ sudo pacman-key -v archlinux-2019.05.02-x86_64.iso.sig

今回は CD-R が余っていたので、Brasero により ISO イメージを焼いた。
前回 USB メモリを使って失敗した形跡があるので、CD はまあ無難な選択かもしれない、

ライブ環境の起動

新マシンで上記 CD からライブ環境を起動する。

キーボードレイアウト

公式ガイドでは日本語に変更する方法が書いてあるが、自分は英語のままでよいので何もせず。

起動モードの確認

今回のマシンは BIOS ではなく UEFI である。
以下のディレクトリが存在しその中身があれば UEFI なので、念のためこれで UEFI であることを確定させておこう。

# ls /sys/firmware/efi/efivars

パーティション

ディスクは 1 つしか積んでいない、デュアルブートの予定もなし、という前提のもとでポイントは 3 つ。

  1. UEFI なので EFI パーティションを作成する必要がある
  2. 上記以外はパーティションを分けない
  3. LVM を用いる

パーティションについては、UEFI なので /boot を 512MB FAT32 で切る。
それ以外についてだが、まず swap は swap ファイルを使うので不要。
//home を分離してリカバリを容易にする作戦もあるが、/home の重要なものはクラウドサービスや自宅 NAS に逃がせば個人的に十分なので、再インストールは痛手ではない。
(ちなみに HDD であれば /home を切ることで速くなるようだが、今回のマシンは SSD である)
また /var の増加によるディスク食い潰しも起きるとも思えないので、パーティションは切らずに広くディスクを使える方が利が大きい。
この辺は人それぞれのポリシーがあると思うので、各々の判断で実施してもらいたい。

LVM については、以前のマシンでディスク容量不足に陥いった時に、SSD 追加で簡単に容量の拡張ができて助かった経験があるため今回も採用した。
マシン特性的にこれ以上 SSD を積みたくないのが本音だし、その手の作業が発生しないよう自分の用途に対して十分な容量にしたつもりだが、まあお守りだ。

なおファイルシステムの選定だが、SSD のパフォーマンス劣化防止のため SSD Trim を有効にすることと、swap ファイルを使うことを考えると、現時点では選択肢が ext4, JFS, XFS になるだろうか。
なお Btrfs では swap ファイルが使えない
ファイルシステム事情には疎いのだが、JFS は 日本語 ArchWiki

ext シリーズや ReiserFS ほどは広くサポートされていませんが

とあるので却下。
定番の ext4 か、RHEL で標準となった XFS かだが…今回も無難そうな ext4 を用いることとした。

さて作業開始にあたり、まずはブロックデバイスを確認してみる。

root@archiso ~ # lsblk
NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0  7:0     0 496.6M  1 loop /run/archiso/airootfs
sda    8:0     0 465.8G  0 disk
sr0   11:0     1   609M  0 rom  /run/archiso/bootmnt

というわけで今回は /dev/sda がお目当てのブロックデバイスだ。
対象が確認できたところでパーティションを切ろう。

# fdisk /dev/sda

fdisk の詳細は割愛するが、m でヘルプが出るのでそれを見ながらパーティションを設定していく、
まずは、fdisk の ヘルプから「create a new empty GTP partition table」を見つけてそのコマンドを打つ。
これにより GPT のパーティションテーブルが作成できる。

続いて、UEFI なので ESP (EFI System Partition) を作成する。
ESP の詳細が知りたければこちら
fdisk のヘルプから「add a new partition」を見つけてそのコマンドを打つ。
そこで設定した内容は以下である。

  • Partition number に 1 を指定
  • First Sector には、指定可能な最小値を設定
    • 2048 だった
  • Last Sector には、512MB 相当のセクタ数を指定
    • fdisk が「Units: sectors of 1 * 512 = 512 bytes」とか表示してくれる
    • というわけで +512M を指定した。+ を忘れない

同様に「create a new empty GTP partition table」により、残り全のセクタを Partition number 2 に割り当てる。

続いて「change partition type」よりパーティションタイプを指定する。
Partition number 1 には EFI System を設定したいのだが、悲しいことに指定可能なタイプ一覧はモニタサイズによっては見切れてしまい、何を指定すれば EFI System になるか分からなかったりする。
今回は 1 を選択するのが正解であった。

同様に Partition number 2 に対して change partition type を行い、今度は Linux LVM を設定する。

最後は「write table to disk and exit」を行なう。

LVM の設定

https://wiki.archlinux.org/index.php/LVM#Installing_Arch_Linux_on_LVM

LVM の物理ボリュームの作成を行なう。
先ほどのパーティショニングにより /dev/sda2 が対象の領域となったため、以下のコマンドを実行する。

# pvcreate /dev/sda2

以下のコマンドで /dev/sda2 が表示されれば成功だ。

# pvdisplay

続いて LVM のボリュームグループを作成する。
VolGroup00 は別の名前でも構わないはずなので、任意で変更すること。

# vgcreate VolGroup00 /dev/sda2

次のコマンドで VolGroup00 が存在しているか確認する。

# vgdisplay

作成したボリュームグループを全て、lvolroot という名前で / へ割り当てる。

# lvcreate -l +100%FREE VolGroup00 -n lvolroot

そして以下のコマンドを打ち、/dev/VolGroup00/lvolroot が想定したボリュームサイズ、つまり /boot を除く全容量 で作成されていることを確認する。

$ lvdisplay

パーティションのフォーマット

# mkfs.vfat -F32 /dev/sda1
# mkfs.ext4 /dev/mapper/VolGroup00-lvolroot

パーティションのマウント

作成したパーティションをマウントする。

# mount /dev/mapper/VolGroup00-lvolroot /mnt
# mkdir -p /mnt/boot
# mount /dev/sda1 /mnt/boot

インターネットへの接続

有線接続であればライブ環境起動時に接続できるようになっているはずなので ping 1.1.1.1 でも打って確認してみる。
接続できなければ公式のガイドを見ながら設定すること。

システムクロックの更新

以下でシステムクロックを正確にする。

# timedatectl set-ntp treu

インストール

ミラーの選択

/etc/pacman.d/mirrorlist を開き利用したいミラーをアンコメントするの…というわけではなく、全てが最初からアンコメントされている方式なので、以下のようにした。

# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
# grep -A 1 Japan /etc/pacman.d/mirrorlist | grep Server > /etc/pacman.d/mirrorlist

なおこのミラーリストは上から順に優先されることになる。

ベースシステムのインストール

ではいよいよインストールだ。
これで必要なパケージ群が入る。

# pacstrap /mnt base base-devel

システムの設定

fstab の生成

# genfstab -U /mnt >> /mnt/etc/fstab

/mnt/etc/fstab の中身は念のため確認しておく。

chroot

新しくインストールしたシステムに chroot する。

# arch-chroot /mnt

タイムゾーン

日本在住なので日本にする。

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

加えてハードウェアクロックが UTC であれば、以下により /etc/adjtime を設定する。

# hwclock --systohc --utc

ロケール

/etc/locale.gen を編集し、en_US.UTF-8 UTF-8ja_JP.UTF-8 UTF-8 をアンコメントする。
続いて以下のコマンドを実行する。

# locale-gen

最後にロケールの設定をするが、ここでは日本語ではなく英語を指定する。
CLI 環境で日本語が出てくると辛いため。

ホストネーム

# echo お好みのほすとねーむ > /etc/hostname

/etc/hosts にも同様の名前を設定する。

127.0.0.1   localhost
::1     localhost
127.0.1.1   お好みのほすとねーむ.localdomain  お好みのほすとねーむ

ネットワーク設定

この時点で設定されなくなっている状況もあるようだが、ping 1.1.1.1 したら通ったので何もしなかった。

Initramfs

LVM のためにまずは /etc/mkinitcpio.conf を編集する。
https://wiki.archlinux.org/index.php/LVM#Configure_mkinitcpio

HOOK において、base の後に udev を、block の後に lvm2 を追加する。
udevlvm2 ではなく systemdsd-lvm2 を追加するという方式もあるようだが、udev がデフォルトで含まれていたので今回はそちらにした。

その後、以下を実行する。

# mkinitcpio -p linux

Root パスワード

任意のものを設定する。

# passwd

ブートローダー

UEFI なので systemd-boot を用いる。
以前は gumiboot を使っていたのだが、それはこの systemd-boot の旧名らしい。
以下でインストールする。

# bootctl --path=/boot install

続いて、AMD の CPU なのでマイクロコードのインストールを行なう。
https://wiki.archlinux.org/index.php/Microcode

# pacman -S amd-ucode

最後に、systemd-boot の設定ファイルを記述する。
まずは /boot/loader/loader.conf に以下を設定する。

default  arch
timeout  4
console-mode max
editor   no

各値はこちらを見つつ変えてよいが、editor はセキュリティ上 no にすることが推奨されている。

続いて /boot/loader/entries/arch.conf に以下を設定する。

title   Arch Linux
linux   /vmlinuz-linux
initrd  /amd-ucode.img
initrd  /initramfs-linux.img
options root=root=/dev/mapper/VolGroup00-lvolroot rw

initrd /amd-ucode.img により、先ほどインストールしたマイクロコードの自動更新がされるようになる。

再起動

# exit
# umount -R /mnt
# reboot

リブート時にインストールメディアを取り除くこと。
そして Arch Linux が起動すれば成功。

デスクトップ機化への道のり

Arch Linux を起動したら root でログインする。
起動できなかったら上記の OS インストールに失敗している可能性があるので残念ながら原因を探しつつ修正する必要がある。

個人ユーザ作成

ひとまず個人ユーザを作り、root での作業をやめる。

# useradd -m {username}
# passwd {username}
# pacman -S sudo
# visudo

作成したユーザが sudo で作用ができるよう、visudo では以下を追記する。

{username} ALL=(ALL) ALL

ここまで終わったら exit し、作成したユーザでログインし直す。

ネットワークの有効化

今回は有線なので以下で済ませた。
@ の後はネットワーク I/F 名になるので、それは ip a コマンドで調べる。

$ systemctl enable dhcpcd@enp8s0
$ systemctl start dhcpcd@enp8s0

(ちなみに今回のマザボは WiFi を搭載しているがとりあえず使わない)

パッケージの更新

$ sudo pacman -Syu

Yay のインストール

AUR のパッケージを使いたくなるシーンがよくあるので、AUR ヘルパーである Yay を入れる。

$ sudo pacman -S git
$ git clone https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg -si
$ rm -rf yay

以降は pacman より yay の方がタイプ数が少ないので、yay を使っていく。
sudo も省略できるし。

systemd-boot の自動更新

Yay が入り AUR が簡単に使えるようになったので、AUR にある systemd-boot 自動更新用パッケージを入れる。

$ yay -S systemd-boot-pacman-hook

systemd-boot は先程のインストール手順により導入されたが、/boot に入ったため通常の pacman 系更新コマンドでは更新されない。
そこで上記パッケージを導入することで pacman の更新にフックして systemd-boot も更新されるようにしておくのが吉。

Wayland を諦めた

さて GUI 環境の構築開始だ。
RHEL 8 が Wayland を採用したし、Arch ユーザとしては負けるわけにはいかねえ! と思ったのだが諦めた。
グラボが NVIDIA じゃなければ採用したのだが…。

ウィンドウマネージャに i3wm を使ってみたいと思っており、ちょうど 1.0 がリリースされた i3wm 互換の Wayland 用 ウィンドウマネージャ Sway に興味を持っていた。
が、Sway と NVIDIA は相性が悪いようだ…。

参考

「機械学習って CUDA 使えた方が有利なのかね? 申し訳程度に NVIDIA にしておくか」と思って熟慮せず選んだパーツだったが、少々悔しい。
何年も前にリーナス御大が中指を立てていたことを知らなかったわけではないが、自分はその意味をよく理解していなかったのだ…。

仕方なく Xorg の導入

ここでは nvidia パッケージを入れているが、必要なドライバはグラボのベンダーや世代によって変わるので注意すること。

$ yay -S nvidia
$ yay -S xorg-server
$ sudo nvidia-xconfig

ちなみに自分の環境では nvidia を入れると CUI の解像度が低くなるという問題が起きており、対応は保留中…。

ディスプレイマネージャの導入

Xorg の起動にあたりディスプレイマネージャを導入する。
今回は LightDM を採用した。
以前は SLiM を使っていたが開発が終了したので、他の軽量なものを選んだ。

$ yay -S lightdm lightdm-webkit2-greeter
$ sudo systemctl enable lightdm

合わせてインストールしている lightdm-webkit2-greeter は Greeter と呼ばれるログイン情報入力 GUI である。
これにはいくつか選択肢があるので好みのものを使うとよい。
そしてインストールした Greeter を設定する。
/etc/lightdm/lightdm.conf において、以下を記述する。

[Seat:*]
…
greeter-session=lightdm-webkit2-greeter

なおここで設定可能な Greeter 名は /usr/share/xgreeters を見れば分かる。

さて LightDM の設定は色々変更できそうだが、今回は割愛する。

ウィンドウマネージャの導入

では早速 Xorg を起動! とはせずに、ウィンドウマネージャを入れよう。
これまで GNOME、Openbox、Xmonad と変遷してきたが、今回は i3wm にした。
ターミナルには従前より利用している Terminator を選んだ。
やはりタイル型はなじむ。実になじむ。

$ yay -S i3-wm i3status terminator
$ sudo reboot

これで成功すれば LigthDM のログイン画面が表示される。
そこで i3 のセッションを選択、id/pw を入力してログインしよう。
すると i3 のデフォルト設定がないから作るよと表示されるのでウィザードに従って作成する。

あとは mod + enter でターミナルが起動する。
i3 は空気を読んで未設定でも Terminator を使ってくれるようだ。

さて i3wm の設定もやりがいがありそうだが、今回は割愛する。

フォント

日本語フォントの導入

AUR に Nerd Fonts パッチ適用済みの Ricty が上がっているのでありがたく使う。

$ yay -S nerd-fonts-ricty

あるいは好みであれば Cica フォントを入れてもいいかも知れない。

$ yay -S ttf-cica

絵文字

Symbola を使う。

$ yay -S ttf-symbola

日本語入力

Fctix + Mozc を使う。
本当は IBus の IM 切り替えのモッサリ感が好きではない。
Fctix は母音が変な位置に出る問題があるので一度は諦めていたが、軽く触ってみたところ修正されているようだったので改めて採用した。
なお Nimf という新興の IM フレームワークもあるが、どうも Anthy 縛りっぽいので見送った。

まずは ~/.xprofile に環境変数および自動起動の設定をする。

export LC_CTYPE=ja_JP.utf-8

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

fcitx &

LC_TYPE で行なっているロケールの設定を忘れると、Fcitx に Mozc をはじめとした日本語 IM が追加されないので注意する。
なおこの設定は /etc/locale.conf でやることもできるが、その場合はシステムグローバルに日本語になり、CLI でのトラブルシューティングが辛くなるのでやらない。
ここで一旦、再ログインする。

そして必要なパッケージを入れる。

$ yay -S fcitx-mozc fcitx-configtool fcitx-im

なお前述のロケール設定を忘れて Fcitx を起動すると Mozc が現れなくなるが、この場合は ~/.config/fcitx を消して Fcitx を再起動すれば直るようだ。

あとはタスクトレイにいる Fcitx のアイコンをクリックして Configure を選び、次の設定をして個人的な好みにした。

  • インライン入力
    • Addon
      • Advanced にチェックを入れる
      • Fcitx XIM Frontend を選択し、Configure ボタンを押す
      • Use On The Spot Style for XIM にチェックを入れる
      • タスクトレイのアイコンを右クリックし、restart
  • ホットキーの変更
    • Global Config -> Hotkey -> Trigger Input Method
      • Ctrl + Space は Emacs とぶつかるので Ctrl + \ に変更

ブラウザの導入

好きなものを入れれば良いが、とりあえず Chromium を入れた。
ちなみに yay ならば Vivaldi も入れられる。

$ yay -S chromium

パスワードマネージャの導入

もし OSS のもを使うなら KeePassXC、あるいは後発の Bitwarden も良さそうだ。
この辺はお好みで。

$ yay -S keepassxc

# あるいは
$ yay -S bitwarden

必要なデータベースファイルやキーファイルは、何らかの手段でこの Arch 機のローカルまで持ってこよう。

さてここまでくれば、「とりあえず使えるぜ」感が出るだろう。

SSH 鍵

GitHub などへの鍵登録用。

$ yay -S openssh
$ ssh-keygen -t ed25519

$ yay -S pulseaudio pavucontrol volumeicon

volumeicon を起動し、右クリックから Status Icon を開く。
そして External mixier に pavucontrol を指定する。

続いて PulseAudio と pavucontrol を起動する。
たった今設定したように、pavucontrol はタスクトレイの volumeicon を右クリックして表示させてもいい。

$ pulseaudio --start
$ pavucontrol &

なお PulseAudio は次回から手動で起動しなくてもよい…はず。

そして画面から適当にミュートを解除して音が出ることを確認する。
ここでブラウザで音を出そうとして出ない場合は、一度ブラウザを再起動すると直る可能性がある。

ちなみに volumeicon も初期起動するよう設定しておこう。

$ echo 'volumeicon &' >> .xprofile

Swap

次節のハイバネートで必要になるのでこの時点で作成する。
Swap のサイズについては RedHat の記事に従って決めると良さそうだ。
今回は 34GB になる。

また、Swap はパーティションではなく Swap ファイルとして作成する。

作成とマウントには systemd-swap を使っても良さそうだったが、手動でやっても大した手間ではないので以下のように手動でやった。
最後の tee コマンドで -a オプションを忘れると面倒なことになるので気をつけること。

$ sudo fallocate -l 34G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ echo '/swapfile none swap defaults 0 0' | tee -a /etc/fstab

ハイバネート

カーネルパラメータの設定が必要になる。
まずは以下を実行して表示される physical_offset の最初の値を確認する。
以下の出力例においては 10074112 である。

$ sudo filefrag -v /swapfile | head -n 5

Filesystem type is: ef53
File size of /swapfile is 36507222016 (8912896 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:   10074112..  10074112:      1:            
   1:        1..   10239:   10074113..  10084351:  10239:             unwritten

続いて /boot/loader/entries/arch.conf にある option の値を変更する。
ここまでの設定では以下のようになっているはずだ。

options root=/dev/mapper/VolGroup00-lvolroot rw

これにハイバネート用のパラメータ resume および resume_offset を付け足す。
resume にはスワップファイルの載っているデバイスファイルのパス、あるいは UUID を指定する。
あくまでデバイスファイルの情報であり、Swap ファイルそのもののパス (今回は /swapfile) を指定しないこと。
resume_offset は先程取得した数字を指定する。
今回の例では以下のようになる。

options root=/dev/mapper/VolGroup00-lvolroot rw resume=/dev/mapper/VolGroup00-lvolroot resume_offset=10074112

続いて initramfs の設定をする。
/etc/mkinitcpio.confHOOKS の中に base が含まれている場合 (Arch はデフォルトで含まれている) resumefilesystem の前に追加する必要がある。
なお今回のように LVM を使っている場合は lvm2 の後ろでもある必要がある。

HOOKS=(base udev autodetect modconf block lvm2 resume filesystems keyboard fsck)

そして initramfs を再生成する。

$ sudo mkinitcpio -p linux

ではハイバネートしてみよう。
(ブート時のパラメータをいじってるので、もしかしたら一度再起動してからでないとダメかも知れない…自信なし)

$ systemctl hibernate

なおこのハイバネート用コマンドは、後述のランチャーである Rofi に登録しておくと便利である。

さて、ここでハイバネートから復帰すると気づくことがあるだろう。
認証なしで元の状態に復帰するので危険だぞ…と。
これは次のセクションで解消する。

スクリーンロック

というわけで、ハイバネートからの復帰時や、ちょっとトイレに行ってくる間にスクリーンロックをかけられるようにする。

$ yay -S xss-lock i3lock

xss-lock はハイバネートやサスペンドにフックしてロックを呼び出してくれる機構であり、ロックそのものではない。
i3lock はロックであり、今回は i3wm であるため選択した。他の選択肢としては xsecurelock など複数あるので、i3wm 以外を使うのであれば調査して好きなものを入れること。

xss-lock による見張りを開始するには以下のコマンドを打つ。

$ xss-lock -- i3lock &

起動スクリプトへの登録しておこう。

$ echo 'env LC_CTYPE="" xss-lock -- i3lock &' >> ~/.xprofile

なおここで LC_CTYPE 環境変数の設定をしているのは、i3lock が以下のエラーを吐くためだ。

xkbcommon: ERROR: couldn't find a Compose file for locale "ja_JP.utf-8"                                                          
[i3lock] xkb_compose_table_new_from_locale failed

ちなみにスタンバイ状態にしてスクリーンロックをかけるコマンドは、自分は以下を使っている。
これも後述のランチャーから呼び出せるようにすると便利だ。

$ xset dpms force standby

ランチャー

Rofi を使っている。便利。
Mac で言うところの Spotlight っぽいやつ。
自前のスクリプトを仕込んだり、SSH の候補を選んだり、アクティブなウィンドウの切り替えなんかにも使える。

$ yay -S rofi

この記事では前述の、ハイバネートとスタンバイをここから呼び出す設定を以下に書いておく。
必要なファイルは 2 つだ。
もっと色々設定できるが、それは Rofi について掘り下げている他の記事に譲る。

~/.config/rofi/config
rofi.modi:  window,run,drun,system:~/.config/rofi/rofi_system.sh
rofi.sidebar-mode: true
rofi.hide-scrollbar: true
rofi.kb-cancel: Escape
rofi.theme: /usr/share/rofi/themes/glue_pro_blue.rasi
~/.config/rofi/rofi_system.sh
#!/usr/bin/env bash

set -euCo pipefail

function main() {
  # can not use some special charactors
  # e.g. ( )
  local -Ar menu=(
    ['Standby']='xset dpms force standby'
    ['Hibernate']='systemctl hibernate'
  )

  local -r IFS=$'\n'
  # with some arguments:  execute a command mapped to $1
  # without any arguments show keys
  [[ $# -ne 0 ]] && eval "${menu[$1]}" || echo "${!menu[*]}"
}

main $@

さてこの Rofi をどうやって呼び出すかだが… i3 にショートキーで呼び出す設定を入れるのが良いだろう。
個人的な好みは alt + space だ。
起動オプションは任意だが、例としては以下を i3 の設定ファイルに追記すればよい。

~/.config/i3/config
bindsym Mod1+space exec rofi -combi-modi -font "hack 10" -show

ちなみに、同設定ファイルを見ると、$mod+d に類似のランチャーである dmenu がデフォルトで割当てられている。
が、Rofi が dmenu replacement を謳っているためそちらは出番なし。

ナイトモード

夜間はブルーライトをカットし、眠りの質を多少でも上げたい。
そもそも PC なんぞやってないで早く寝ろというのは正論だが対応が難しいため、小手先の手法で何とかしたいのが人情である。

そんなニーズに応えてくれるのが Redshift である。

$ yay -S redshift

引数なしで redshift コマンドにより起動すると、緯度経度を取得しにいってそれをベースに計算してモニタの色合いを調整してくれるようだ。
とはいえ緯度経度を毎度取得しては欲しくないので、あらかじめ /.config/redshift.conf に記入しておくのがよい。

[redshift]
location-provider=manual

# これはハンブルグの緯度経度である
# 修正して使うこと
[manual]
lat=48.1
lon=11.6

このパッケージには、redshift-gtk という GUI フロントエンドも含まれている。
これを使うためには以下のパッケージを追加する。

$ yay -S python-gobject python-xdg librsvg

起動するとタスクトレイに常駐する。
このアイコンを右クリックして Autostart にチェックを入れておくとよい。

redshift-gtk も自動起動にも加えておく。

$ echo 'redshift-gtk &' >> ~/.xprofile

デスクトップ通知

Dunst を入れる。
Dzen2 という選択肢もあるが、見た目が気に入らず却下した記憶がある。
他にもっといいのがあれば試したい。

$ yay -S dunst
$ mkdir -p ~/.config/dunst
$ cp /usr/share/dunst/dunstrc ~/.config/dunst/dunstrc

この dunstrc はカスタムして好みの見た目に仕上げるわけだが、icon-path の値は適切にしておかないと、通知時にこんなエラーが出る。

WARNING: No icon found in path: 'dialog-information'

dialog-information.png ファイルがあるアイコンテーマのパスを指定すればよく、自分の環境では以下がすでにインストールされていたのでいったん設定した。

~/.config/dunst/dunstrc
icon_path = /usr/share/icons/Adwaita/16x16/legacy

好みのアイコンセットが各々あると思うので、好きなものを入れてパスを設定すること。

では起動の設定だ。

echo 'dunst &' >> ~/.xprofile

ちなみに起動が成功したかどうかのテストには以下のようなコマンドを打てば良い。
起動できていれば通知が出る。

$ notify-send 'subject' 'this is test'

温度やファンの回転数を見る

PC を自作する以上は重要。
温度が高すぎるならエアフローを見直す必要がある。

ツールとしては lm_sensors を使う。
https://wiki.archlinux.org/index.php/Lm_sensors

$ yay -S lm_sensors
$ sudo sensors-detect

sensors-detect ではいろいろ質問されるが、すべて Enter を入力すれば無難なセットアップになるようだ。

さて温度などを見る方法だが、sensors コマンドを使って CUI で見てもいいし、GUI フロントエンドである xsensors または psensor を使ってもいい。
個人的には psensor の方が詳細で好きだ。アラーム機能もあり、タスクトレイに常駐させることもできる。

$ yay -S psensor
$ psensor &
$ psensor & >> .xprofile

Web カメラ

ドライバの都合で使える Web カメラとそうでないものがあるようなので、まずはここを眺めて使えそうなものをピックアップする。

自分は Logicool C270 を選んだ。
この Web カメラに対応するドライバ linux-uvc であり、カーネルモジュール uvcvideo がロードされていればよいようだ。
以下で確認したらすでにロード済みのようだったので、PC にカメラを接続してみたら見事に使えた。
めでたし。

$ modprobe -c | grep uvcvideo

CLI ツール群

何を入れるか、どう設定するかは他に詳しい記事がいくらでもありそうなのでそちらに譲るが、現時点で個人的に使っているツールの中で基本的なものをざっと書いておく。
作業効率を考えれば、これらはこの一連のインストール作業の序盤で入れておくべきだったかも知れない。

  • fish + fisherman
  • tmux + tpm
  • fzf
  • ag
  • fd
  • alias ls='lsd'
  • alias diff='colordiff'

最近は alias cat='bat' も検討中。

Arch Linux 特有のもの

$ yay -Ss pacman-contrib pkg-tools

見た目を整える

壁紙

Nitrogen を使う。
先に好きな壁紙を用意しておくのをお忘れなく。

$ yay -S nitrogen
$ nitrogen /path/to/壁紙画像のあるディレクトリ

これで GUI が起動するので好みに設定し、Apply してから終了する。

そして起動時に壁紙を表示するように以下を行う。

$ echo 'nitrogen --restore &' >> ~/.xprofile

背景透過

Compton を使う。

$ yay -S compton

起動オプションは適宜調べて好みに設定すればよいが、バックグラウンド起動は -b でできるので最低限このオプションだけつけておけばいいだろう。

$ compton -b
$ echo 'compton -b' >> ~/.xprofile

各種テーマの導入

今のところやってない(いずれ対応してこの記事に書くかも…)。
アイコンだけでなく、複数バージョンの GTKQt に対応し、かつ両者の統一感まで考え出すと面倒。
とりあえず i3 や dunst 等の見た目を整えた時点でそれっぽいやつを適宜導入していけばいいかと思った。

ちなみに、アイコンや GTK のテーマを拾ってくる場所として以前は https://www.gnome-look.org/ を使っていたので、今回もお世話になりそう。

Steam

まずは Multilib を有効化する。
/etc/pacman.conf の以下をアンコメントする。

/etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist

続いて以下を実行する。

$ yay -Syy

そして 32 bit の NVIDIA ドライバと Steam を導入する。

$ yay -S lib32-nvidia-utils steam

あとは steam コマンドで起動すればよい…のだが、この起動でけっこうトラブることがある。
そんな時は Arch Wiki の Steam トラブルシューティング記事なんかを見ながら粘る。
粘る…。

チューニング

とりあえず Arch Wiki にあるもののうち Disk I/O 関連だけやっておいた。
https://wiki.archlinux.org/index.php/Improving_performance

SSD

TRIM

速度劣化を防止するため TRIM を有効化する。

まずは TRIM がサポートされているかを先に確認すること。

$ yay -S hdparm
$ sudo hdparm -I /dev/sda |grep TRIM                                                                                               
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
$ yay -Rs hdparm

supoprted とあるので fstrim を有効にする。

$ sudo systemctl enable fstrim.timer
$ sudo systemctl start fstrim.timer

ちなみに日本語版の Arch Wiki にしか書いてなさそうだったのだが、/etc/fstabdiscard フラグを追加することによる TRIM の有効化は推奨されないらしい

また、今回のように LMV を使っている場合は上記に加えて /etc/lvm/lvm.confissue_discards の値を 1 に変更すること。

atime

atime 情報の更新を止めて高速化を図る
/etc/fstabrelatime オプションを付与する。
最速は noatime オプションを使って完全に atime の更新を止めることなのだが、atime が全く更新されなくなると上手く動作しないアプリケーションが一部あるようなので、ファイル書き込み時だけは更新してくれる relatime を妥協案として使うのが現実解になりそうだ。

そして /etc/fstab を変更したので再起動…と思ったら、以下のコマンドを打てばよいようだ。

$ sudo mount -a

I/O スケジューラ

SSD の場合は伝統的な CFQ では遅いという話があり、変更を試みた。

$ cat /sys/block/sda/queue/scheduler                                                                                              
[mq-deadline] kyber bfq none

というわけでもともと mq-deadline になっていたのでこのまま行ってみることにした。

ちなみに LVM を使っている都合で dm-0 というブロックデバイスもあるが

$ cat /sys/block/dm-0/queue/scheduler                                                                                              
none

これは…このままでいいいのかな?
none になっていたら調整するなという記事も見かけたので。

ちなみにこの dm-X が何かというのはこちらのスクリプトで判明する。

Swap

swappiness を 10 にする。0 にはしない。
参考: https://qiita.com/rarul/items/a96b61b1fb535dea5fe3
RAM は 32GB と多く積みはしたが、正直 swappiness の挙動をちゃんと理解できておらず、0 にするのが本当に適切なのかは怪しい…。
というわけで Red Had の推奨値である 10 を設定することとした。
まあこの推奨値も、Oracle DB では、という枕詞があるわけだが…。

まずはデフォルト値である 60 が設定されていることを確認しておく。

$ cat /proc/sys/vm/swappiness
60

というわけで 10 まで下げる。
現在のセッションで swappiness を一時的に変更するのと、永続化設定を両方入れるのでコマンドは 2 つ。

$ sudo sysctl vm.swappiness=10
$ echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-sysctl.conf
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Arch Linux 快適デスクトップ環境の構築 2019

前置き

今回のコンセプトは Mini-ITX の小型機に Ryzen 7 2700X を積む、だ。
( Ryzen 3000 は待てなかった…)
具体的な構成とお値段は以下。いずれも2019年5月時点。

分類 部品名 価格
ケース Metis Plus 5,378
CPU AMD Ryzen 7 2700X BOX (※M/B とセット価格) ※40,581
M/B GIGABYTE B450 I AORUS PRO WIFI -
メモリ Patriot PSD432G2666KH (288Pin/DDR4-2666/16GBx2) 18,981
SSD WD M.2-2280 / 500GB / WD Blue 3D / SATA3.0 6,980
電源 CORSAIR SFX600 Platinum 16,020
CPUファン 虎徹 MarkⅡ(SCKTT-2000) 3,132
追加ケースファン サイズ Kaze Flex 120 PWM 989
グラボ Palit NE5105T018G1-1070F(GTX1050Ti 4G GDR5 STORMX) 14,601

上記とアイネックス ナノダイヤモンドグリス JP-DX1(1,225円)を合わせて、都合 108,556 円。

上記を組み立てインストールの儀式へと入っていった。

以降、Arch Wiki を参照しながら進めていくが、リンクは(原典な気がするので)英語版を基本的に用い、日本語版にしかないコンテンツであればそちらを貼ることとした。
英語版でもサイドペインの「日本語」リンクをクリックすればすぐに日本語版記事に飛べるので、適宜そちらも参照するとよい。

OS インストール

基本は公式インストールガイドに従う。

インストールの準備

署名の検証

これは旧 Arch 機から行なった。
今回は archlinux-2019.05.02-x86_64.iso を用いたが、バージョンはその時最新のものを指定しよう。

$ wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2019.05.02/archlinux-2019.05.02-x86_64.iso
$ wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2019.05.02/archlinux-2019.05.02-x86_64.iso.sig
$ sudo pacman-key -v archlinux-2019.05.02-x86_64.iso.sig

今回は CD-R が余っていたので、Brasero により ISO イメージを焼いた。
前回 USB メモリを使って失敗した形跡があるので、CD はまあ無難な選択かもしれない、

ライブ環境の起動

新マシンで上記 CD からライブ環境を起動する。

キーボードレイアウト

公式ガイドでは日本語に変更する方法が書いてあるが、自分は英語のままでよいので何もせず。

起動モードの確認

今回のマシンは BIOS ではなく UEFI である。
以下のディレクトリが存在しその中身があれば UEFI なので、念のためこれで UEFI であることを確定させておこう。

# ls /sys/firmware/efi/efivars

パーティション

ディスクは 1 つしか積んでいない、デュアルブートの予定もなし、という前提のもとでポイントは 3 つ。

  1. UEFI なので EFI パーティションを作成する必要がある
  2. 上記以外はパーティションを分けない
  3. LVM を用いる

パーティションについては、UEFI なので /boot を 512MB FAT32 で切る。
それ以外についてだが、まず swap は swap ファイルを使うので不要。
//home を分離してリカバリを容易にする作戦もあるが、/home の重要なものはクラウドサービスや自宅 NAS に逃がせば個人的に十分なので、再インストールは痛手ではない。
(ちなみに HDD であれば /home を切ることで速くなるようだが、今回のマシンは SSD である)
また /var の増加によるディスク食い潰しも起きるとも思えないので、パーティションは切らずに広くディスクを使える方が利が大きい。
この辺は人それぞれのポリシーがあると思うので、各々の判断で実施してもらいたい。

LVM については、以前のマシンでディスク容量不足に陥いった時に、SSD 追加で簡単に容量の拡張ができて助かった経験があるため今回も採用した。
マシン特性的にこれ以上 SSD を積みたくないのが本音だし、その手の作業が発生しないよう自分の用途に対して十分な容量にしたつもりだが、まあお守りだ。

なおファイルシステムの選定だが、SSD のパフォーマンス劣化防止のため SSD Trim を有効にすることと、swap ファイルを使うことを考えると、現時点では選択肢が ext4, JFS, XFS になるだろうか。
なお Btrfs では swap ファイルが使えない
ファイルシステム事情には疎いのだが、JFS は 日本語 ArchWiki

ext シリーズや ReiserFS ほどは広くサポートされていませんが

とあるので却下。
定番の ext4 か、RHEL で標準となった XFS かだが…今回も無難そうな ext4 を用いることとした。

さて作業開始にあたり、まずはブロックデバイスを確認してみる。

root@archiso ~ # lsblk
NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0  7:0     0 496.6M  1 loop /run/archiso/airootfs
sda    8:0     0 465.8G  0 disk
sr0   11:0     1   609M  0 rom  /run/archiso/bootmnt

というわけで今回は /dev/sda がお目当てのブロックデバイスだ。
対象が確認できたところでパーティションを切ろう。

# fdisk /dev/sda

fdisk の詳細は割愛するが、m でヘルプが出るのでそれを見ながらパーティションを設定していく、
まずは、fdisk の ヘルプから「create a new empty GTP partition table」を見つけてそのコマンドを打つ。
これにより GPT のパーティションテーブルが作成できる。

続いて、UEFI なので ESP (EFI System Partition) を作成する。
ESP の詳細が知りたければこちら
fdisk のヘルプから「add a new partition」を見つけてそのコマンドを打つ。
そこで設定した内容は以下である。

  • Partition number に 1 を指定
  • First Sector には、指定可能な最小値を設定
    • 2048 だった
  • Last Sector には、512MB 相当のセクタ数を指定
    • fdisk が「Units: sectors of 1 * 512 = 512 bytes」とか表示してくれる
    • というわけで +512M を指定した。+ を忘れない

同様に「create a new empty GTP partition table」により、残り全のセクタを Partition number 2 に割り当てる。

続いて「change partition type」よりパーティションタイプを指定する。
Partition number 1 には EFI System を設定したいのだが、悲しいことに指定可能なタイプ一覧はモニタサイズによっては見切れてしまい、何を指定すれば EFI System になるか分からなかったりする。
今回は 1 を選択するのが正解であった。

同様に Partition number 2 に対して change partition type を行い、今度は Linux LVM を設定する。

最後は「write table to disk and exit」を行なう。

LVM の設定

https://wiki.archlinux.org/index.php/LVM#Installing_Arch_Linux_on_LVM

LVM の物理ボリュームの作成を行なう。
先ほどのパーティショニングにより /dev/sda2 が対象の領域となったため、以下のコマンドを実行する。

# pvcreate /dev/sda2

以下のコマンドで /dev/sda2 が表示されれば成功だ。

# pvdisplay

続いて LVM のボリュームグループを作成する。
VolGroup00 は別の名前でも構わないはずなので、任意で変更すること。

# vgcreate VolGroup00 /dev/sda2

次のコマンドで VolGroup00 が存在しているか確認する。

# vgdisplay

作成したボリュームグループを全て、lvolroot という名前で / へ割り当てる。

# lvcreate -l +100%FREE VolGroup00 -n lvolroot

そして以下のコマンドを打ち、/dev/VolGroup00/lvolroot が想定したボリュームサイズ、つまり /boot を除く全容量 で作成されていることを確認する。

$ lvdisplay

パーティションのフォーマット

# mkfs.vfat -F32 /dev/sda1
# mkfs.ext4 /dev/mapper/VolGroup00-lvolroot

パーティションのマウント

作成したパーティションをマウントする。

# mount /dev/mapper/VolGroup00-lvolroot /mnt
# mkdir -p /mnt/boot
# mount /dev/sda1 /mnt/boot

インターネットへの接続

有線接続であればライブ環境起動時に接続できるようになっているはずなので ping 1.1.1.1 でも打って確認してみる。
接続できなければ公式のガイドを見ながら設定すること。

システムクロックの更新

以下でシステムクロックを正確にする。

# timedatectl set-ntp treu

インストール

ミラーの選択

/etc/pacman.d/mirrorlist を開き利用したいミラーをアンコメントするの…というわけではなく、全てが最初からアンコメントされている方式なので、以下のようにした。

# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
# grep -A 1 Japan /etc/pacman.d/mirrorlist | grep Server > /etc/pacman.d/mirrorlist

なおこのミラーリストは上から順に優先されることになる。

ベースシステムのインストール

ではいよいよインストールだ。
これで必要なパケージ群が入る。

# pacstrap /mnt base base-devel

システムの設定

fstab の生成

# genfstab -U /mnt >> /mnt/etc/fstab

/mnt/etc/fstab の中身は念のため確認しておく。

chroot

新しくインストールしたシステムに chroot する。

# arch-chroot /mnt

タイムゾーン

日本在住なので日本にする。

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

加えてハードウェアクロックが UTC であれば、以下により /etc/adjtime を設定する。

# hwclock --systohc --utc

ロケール

/etc/locale.gen を編集し、en_US.UTF-8 UTF-8ja_JP.UTF-8 UTF-8 をアンコメントする。
続いて以下のコマンドを実行する。

# locale-gen

最後にロケールの設定をするが、ここでは日本語ではなく英語を指定する。
CLI 環境で日本語が出てくると辛いため。

ホストネーム

# echo お好みのほすとねーむ > /etc/hostname

/etc/hosts にも同様の名前を設定する。

127.0.0.1   localhost
::1     localhost
127.0.1.1   お好みのほすとねーむ.localdomain  お好みのほすとねーむ

ネットワーク設定

この時点で設定されなくなっている状況もあるようだが、ping 1.1.1.1 したら通ったので何もしなかった。

Initramfs

LVM のためにまずは /etc/mkinitcpio.conf を編集する。
https://wiki.archlinux.org/index.php/LVM#Configure_mkinitcpio

HOOK において、base の後に udev を、block の後に lvm2 を追加する。
udevlvm2 ではなく systemdsd-lvm2 を追加するという方式もあるようだが、udev がデフォルトで含まれていたので今回はそちらにした。

その後、以下を実行する。

# mkinitcpio -p linux

Root パスワード

任意のものを設定する。

# passwd

ブートローダー

UEFI なので systemd-boot を用いる。
以前は gumiboot を使っていたのだが、それはこの systemd-boot の旧名らしい。
以下でインストールする。

# bootctl --path=/boot install

続いて、AMD の CPU なのでマイクロコードのインストールを行なう。
https://wiki.archlinux.org/index.php/Microcode

# pacman -S amd-ucode

最後に、systemd-boot の設定ファイルを記述する。
まずは /boot/loader/loader.conf に以下を設定する。

default  arch
timeout  4
console-mode max
editor   no

各値はこちらを見つつ変えてよいが、editor はセキュリティ上 no にすることが推奨されている。

続いて /boot/loader/entries/arch.conf に以下を設定する。

title   Arch Linux
linux   /vmlinuz-linux
initrd  /amd-ucode.img
initrd  /initramfs-linux.img
options root=root=/dev/mapper/VolGroup00-lvolroot rw

initrd /amd-ucode.img により、先ほどインストールしたマイクロコードの自動更新がされるようになる。

再起動

# exit
# umount -R /mnt
# reboot

リブート時にインストールメディアを取り除くこと。
そして Arch Linux が起動すれば成功。

デスクトップ機化への道のり

Arch Linux を起動したら root でログインする。
起動できなかったら上記の OS インストールに失敗している可能性があるので残念ながら原因を探しつつ修正する必要がある。

個人ユーザ作成

ひとまず個人ユーザを作り、root での作業をやめる。

# useradd -m {username}
# passwd {username}
# pacman -S sudo
# visudo

作成したユーザが sudo で作用ができるよう、visudo では以下を追記する。

{username} ALL=(ALL) ALL

ここまで終わったら exit し、作成したユーザでログインし直す。

ネットワークの有効化

今回は有線なので以下で済ませた。
@ の後はネットワーク I/F 名になるので、それは ip a コマンドで調べる。

$ systemctl enable dhcpcd@enp8s0
$ systemctl start dhcpcd@enp8s0

(ちなみに今回のマザボは WiFi を搭載しているがとりあえず使わない)

パッケージの更新

$ sudo pacman -Syu

Yay のインストール

AUR のパッケージを使いたくなるシーンがよくあるので、AUR ヘルパーである Yay を入れる。

$ sudo pacman -S git
$ git clone https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg -si
$ rm -rf yay

以降は pacman より yay の方がタイプ数が少ないので、yay を使っていく。
sudo も省略できるし。

systemd-boot の自動更新

Yay が入り AUR が簡単に使えるようになったので、AUR にある systemd-boot 自動更新用パッケージを入れる。

$ yay -S systemd-boot-pacman-hook

systemd-boot は先程のインストール手順により導入されたが、/boot に入ったため通常の pacman 系更新コマンドでは更新されない。
そこで上記パッケージを導入することで pacman の更新にフックして systemd-boot も更新されるようにしておくのが吉。

Wayland を諦めた

さて GUI 環境の構築開始だ。
RHEL 8 が Wayland を採用したし、Arch ユーザとしては負けるわけにはいかねえ! と思ったのだが諦めた。
グラボが NVIDIA じゃなければ採用したのだが…。

ウィンドウマネージャに i3wm を使ってみたいと思っており、ちょうど 1.0 がリリースされた i3wm 互換の Wayland 用 ウィンドウマネージャ Sway に興味を持っていた。
が、Sway と NVIDIA は相性が悪いようだ…。

参考

「機械学習って CUDA 使えた方が有利なのかね? 申し訳程度に NVIDIA にしておくか」と思って熟慮せず選んだパーツだったが、少々悔しい。
何年も前にリーナス御大が中指を立てていたことを知らなかったわけではないが、自分はその意味をよく理解していなかったのだ…。

仕方なく Xorg の導入

ここでは nvidia パッケージを入れているが、必要なドライバはグラボのベンダーや世代によって変わるので注意すること。

$ yay -S nvidia
$ yay -S xorg-server
$ sudo nvidia-xconfig

ちなみに自分の環境では nvidia を入れると CUI の解像度が低くなるという問題が起きており、対応は保留中…。

ディスプレイマネージャの導入

Xorg の起動にあたりディスプレイマネージャを導入する。
今回は LightDM を採用した。
以前は SLiM を使っていたが開発が終了したので、他の軽量なものを選んだ。

$ yay -S lightdm lightdm-webkit2-greeter
$ sudo systemctl enable lightdm

合わせてインストールしている lightdm-webkit2-greeter は Greeter と呼ばれるログイン情報入力 GUI である。
これにはいくつか選択肢があるので好みのものを使うとよい。
そしてインストールした Greeter を設定する。
/etc/lightdm/lightdm.conf において、以下を記述する。

[Seat:*]
…
greeter-session=lightdm-webkit2-greeter

なおここで設定可能な Greeter 名は /usr/share/xgreeters を見れば分かる。

さて LightDM の設定は色々変更できそうだが、今回は割愛する。

ウィンドウマネージャの導入

では早速 Xorg を起動! とはせずに、ウィンドウマネージャを入れよう。
これまで GNOME、Openbox、Xmonad と変遷してきたが、今回は i3wm にした。
ターミナルには従前より利用している Terminator を選んだ。
やはりタイル型はなじむ。実になじむ。

$ yay -S i3-wm i3status terminator
$ sudo reboot

これで成功すれば LigthDM のログイン画面が表示される。
そこで i3 のセッションを選択、id/pw を入力してログインしよう。
すると i3 のデフォルト設定がないから作るよと表示されるのでウィザードに従って作成する。

あとは mod + enter でターミナルが起動する。
i3 は空気を読んで未設定でも Terminator を使ってくれるようだ。

さて i3wm の設定もやりがいがありそうだが、今回は割愛する。

フォント

日本語フォントの導入

AUR に Nerd Fonts パッチ適用済みの Ricty が上がっているのでありがたく使う。

$ yay -S nerd-fonts-ricty

あるいは好みであれば Cica フォントを入れてもいいかも知れない。

$ yay -S ttf-cica

絵文字

Symbola を使う。

$ yay -S ttf-symbola
$ fc-cache -f -v

このあと、ブラウザやターミナルエミュレータ等の GUI アプリケーションは再起動することで絵文字が表示されるようになる。

日本語入力

Fctix + Mozc を使う。
本当は IBus の IM 切り替えのモッサリ感が好きではない。
Fctix は母音が変な位置に出る問題があるので一度は諦めていたが、軽く触ってみたところ修正されているようだったので改めて採用した。
なお Nimf という新興の IM フレームワークもあるが、どうも Anthy 縛りっぽいので見送った。

まずは ~/.xprofile に環境変数および自動起動の設定をする。

export LC_CTYPE=ja_JP.utf-8

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

fcitx &

LC_TYPE で行なっているロケールの設定を忘れると、Fcitx に Mozc をはじめとした日本語 IM が追加されないので注意する。
なおこの設定は /etc/locale.conf でやることもできるが、その場合はシステムグローバルに日本語になり、CLI でのトラブルシューティングが辛くなるのでやらない。
ここで一旦、再ログインする。

そして必要なパッケージを入れる。

$ yay -S fcitx-mozc fcitx-configtool fcitx-im

なお前述のロケール設定を忘れて Fcitx を起動すると Mozc が現れなくなるが、この場合は ~/.config/fcitx を消して Fcitx を再起動すれば直るようだ。

あとはタスクトレイにいる Fcitx のアイコンをクリックして Configure を選び、次の設定をして個人的な好みにした。

  • インライン入力
    • Addon
      • Advanced にチェックを入れる
      • Fcitx XIM Frontend を選択し、Configure ボタンを押す
      • Use On The Spot Style for XIM にチェックを入れる
      • タスクトレイのアイコンを右クリックし、restart
  • ホットキーの変更
    • Global Config -> Hotkey -> Trigger Input Method
      • Ctrl + Space は Emacs とぶつかるので Ctrl + \ に変更

ブラウザの導入

好きなものを入れれば良いが、とりあえず Chromium を入れた。
ちなみに yay ならば Vivaldi も入れられる。

$ yay -S chromium

パスワードマネージャの導入

もし OSS のもを使うなら KeePassXC、あるいは後発の Bitwarden も良さそうだ。
この辺はお好みで。

$ yay -S keepassxc

# あるいは
$ yay -S bitwarden

必要なデータベースファイルやキーファイルは、何らかの手段でこの Arch 機のローカルまで持ってこよう。

さてここまでくれば、「とりあえず使えるぜ」感が出るだろう。

SSH 鍵

GitHub などへの鍵登録用。

$ yay -S openssh
$ ssh-keygen -t ed25519

$ yay -S pulseaudio pavucontrol volumeicon

volumeicon を起動し、右クリックから Status Icon を開く。
そして External mixier に pavucontrol を指定する。

続いて PulseAudio と pavucontrol を起動する。
たった今設定したように、pavucontrol はタスクトレイの volumeicon を右クリックして表示させてもいい。

$ pulseaudio --start
$ pavucontrol &

なお PulseAudio は次回から手動で起動しなくてもよい…はず。

そして画面から適当にミュートを解除して音が出ることを確認する。
ここでブラウザで音を出そうとして出ない場合は、一度ブラウザを再起動すると直る可能性がある。

ちなみに volumeicon も初期起動するよう設定しておこう。

$ echo 'volumeicon &' >> .xprofile

Swap

次節のハイバネートで必要になるのでこの時点で作成する。
Swap のサイズについては RedHat の記事に従って決めると良さそうだ。
今回は 34GB になる。

また、Swap はパーティションではなく Swap ファイルとして作成する。

作成とマウントには systemd-swap を使っても良さそうだったが、手動でやっても大した手間ではないので以下のように手動でやった。
最後の tee コマンドで -a オプションを忘れると面倒なことになるので気をつけること。

$ sudo fallocate -l 34G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ echo '/swapfile none swap defaults 0 0' | tee -a /etc/fstab

ハイバネート

カーネルパラメータの設定が必要になる。
まずは以下を実行して表示される physical_offset の最初の値を確認する。
以下の出力例においては 10074112 である。

$ sudo filefrag -v /swapfile | head -n 5

Filesystem type is: ef53
File size of /swapfile is 36507222016 (8912896 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:   10074112..  10074112:      1:            
   1:        1..   10239:   10074113..  10084351:  10239:             unwritten

続いて /boot/loader/entries/arch.conf にある option の値を変更する。
ここまでの設定では以下のようになっているはずだ。

options root=/dev/mapper/VolGroup00-lvolroot rw

これにハイバネート用のパラメータ resume および resume_offset を付け足す。
resume にはスワップファイルの載っているデバイスファイルのパス、あるいは UUID を指定する。
あくまでデバイスファイルの情報であり、Swap ファイルそのもののパス (今回は /swapfile) を指定しないこと。
resume_offset は先程取得した数字を指定する。
今回の例では以下のようになる。

options root=/dev/mapper/VolGroup00-lvolroot rw resume=/dev/mapper/VolGroup00-lvolroot resume_offset=10074112

続いて initramfs の設定をする。
/etc/mkinitcpio.confHOOKS の中に base が含まれている場合 (Arch はデフォルトで含まれている) resumefilesystem の前に追加する必要がある。
なお今回のように LVM を使っている場合は lvm2 の後ろでもある必要がある。

HOOKS=(base udev autodetect modconf block lvm2 resume filesystems keyboard fsck)

そして initramfs を再生成する。

$ sudo mkinitcpio -p linux

ではハイバネートしてみよう。
(ブート時のパラメータをいじってるので、もしかしたら一度再起動してからでないとダメかも知れない…自信なし)

$ systemctl hibernate

なおこのハイバネート用コマンドは、後述のランチャーである Rofi に登録しておくと便利である。

さて、ここでハイバネートから復帰すると気づくことがあるだろう。
認証なしで元の状態に復帰するので危険だぞ…と。
これは次のセクションで解消する。

スクリーンロック

というわけで、ハイバネートからの復帰時や、ちょっとトイレに行ってくる間にスクリーンロックをかけられるようにする。

$ yay -S xss-lock i3lock

xss-lock はハイバネートやサスペンドにフックしてロックを呼び出してくれる機構であり、ロックそのものではない。
i3lock はロックであり、今回は i3wm であるため選択した。他の選択肢としては xsecurelock など複数あるので、i3wm 以外を使うのであれば調査して好きなものを入れること。

xss-lock による見張りを開始するには以下のコマンドを打つ。

$ xss-lock -- i3lock &

起動スクリプトへの登録しておこう。

$ echo 'env LC_CTYPE="" xss-lock -- i3lock &' >> ~/.xprofile

なおここで LC_CTYPE 環境変数の設定をしているのは、i3lock が以下のエラーを吐くためだ。

xkbcommon: ERROR: couldn't find a Compose file for locale "ja_JP.utf-8"                                                          
[i3lock] xkb_compose_table_new_from_locale failed

ちなみにスタンバイ状態にしてスクリーンロックをかけるコマンドは、自分は以下を使っている。
これも後述のランチャーから呼び出せるようにすると便利だ。

$ xset dpms force standby

ランチャー

Rofi を使っている。便利。
Mac で言うところの Spotlight っぽいやつ。
自前のスクリプトを仕込んだり、SSH の候補を選んだり、アクティブなウィンドウの切り替えなんかにも使える。

$ yay -S rofi

この記事では前述の、ハイバネートとスタンバイをここから呼び出す設定を以下に書いておく。
必要なファイルは 2 つだ。
もっと色々設定できるが、それは Rofi について掘り下げている他の記事に譲る。

~/.config/rofi/config
rofi.modi:  window,run,drun,system:~/.config/rofi/rofi_system.sh
rofi.sidebar-mode: true
rofi.hide-scrollbar: true
rofi.kb-cancel: Escape
rofi.theme: /usr/share/rofi/themes/glue_pro_blue.rasi
~/.config/rofi/rofi_system.sh
#!/usr/bin/env bash

set -euCo pipefail

function main() {
  # can not use some special charactors
  # e.g. ( )
  local -Ar menu=(
    ['Standby']='xset dpms force standby'
    ['Hibernate']='systemctl hibernate'
  )

  local -r IFS=$'\n'
  # with some arguments:  execute a command mapped to $1
  # without any arguments show keys
  [[ $# -ne 0 ]] && eval "${menu[$1]}" || echo "${!menu[*]}"
}

main $@

さてこの Rofi をどうやって呼び出すかだが… i3 にショートキーで呼び出す設定を入れるのが良いだろう。
個人的な好みは alt + space だ。
起動オプションは任意だが、例としては以下を i3 の設定ファイルに追記すればよい。

~/.config/i3/config
bindsym Mod1+space exec rofi -combi-modi -font "hack 10" -show

ちなみに、同設定ファイルを見ると、$mod+d に類似のランチャーである dmenu がデフォルトで割当てられている。
が、Rofi が dmenu replacement を謳っているためそちらは出番なし。

ナイトモード

夜間はブルーライトをカットし、眠りの質を多少でも上げたい。
そもそも PC なんぞやってないで早く寝ろというのは正論だが対応が難しいため、小手先の手法で何とかしたいのが人情である。

そんなニーズに応えてくれるのが Redshift である。

$ yay -S redshift

引数なしで redshift コマンドにより起動すると、緯度経度を取得しにいってそれをベースに計算してモニタの色合いを調整してくれるようだ。
とはいえ緯度経度を毎度取得しては欲しくないので、あらかじめ /.config/redshift.conf に記入しておくのがよい。

[redshift]
location-provider=manual

# これはハンブルグの緯度経度である
# 修正して使うこと
[manual]
lat=48.1
lon=11.6

このパッケージには、redshift-gtk という GUI フロントエンドも含まれている。
これを使うためには以下のパッケージを追加する。

$ yay -S python-gobject python-xdg librsvg

起動するとタスクトレイに常駐する。
このアイコンを右クリックして Autostart にチェックを入れておくとよい。

redshift-gtk も自動起動にも加えておく。

$ echo 'redshift-gtk &' >> ~/.xprofile

デスクトップ通知

Dunst を入れる。
Dzen2 という選択肢もあるが、見た目が気に入らず却下した記憶がある。
他にもっといいのがあれば試したい。

$ yay -S dunst
$ mkdir -p ~/.config/dunst
$ cp /usr/share/dunst/dunstrc ~/.config/dunst/dunstrc

この dunstrc はカスタムして好みの見た目に仕上げるわけだが、icon-path の値は適切にしておかないと、通知時にこんなエラーが出る。

WARNING: No icon found in path: 'dialog-information'

dialog-information.png ファイルがあるアイコンテーマのパスを指定すればよく、自分の環境では以下がすでにインストールされていたのでいったん設定した。

~/.config/dunst/dunstrc
icon_path = /usr/share/icons/Adwaita/16x16/legacy

好みのアイコンセットが各々あると思うので、好きなものを入れてパスを設定すること。

では起動の設定だ。

echo 'dunst &' >> ~/.xprofile

ちなみに起動が成功したかどうかのテストには以下のようなコマンドを打てば良い。
起動できていれば通知が出る。

$ notify-send 'subject' 'this is test'

温度やファンの回転数を見る

PC を自作する以上は重要。
温度が高すぎるならエアフローを見直す必要がある。

ツールとしては lm_sensors を使う。
https://wiki.archlinux.org/index.php/Lm_sensors

$ yay -S lm_sensors
$ sudo sensors-detect

sensors-detect ではいろいろ質問されるが、すべて Enter を入力すれば無難なセットアップになるようだ。

さて温度などを見る方法だが、sensors コマンドを使って CUI で見てもいいし、GUI フロントエンドである xsensors または psensor を使ってもいい。
個人的には psensor の方が詳細で好きだ。アラーム機能もあり、タスクトレイに常駐させることもできる。

$ yay -S psensor
$ psensor &
$ psensor & >> .xprofile

Web カメラ

ドライバの都合で使える Web カメラとそうでないものがあるようなので、まずはここを眺めて使えそうなものをピックアップする。

自分は Logicool C270 を選んだ。
この Web カメラに対応するドライバ linux-uvc であり、カーネルモジュール uvcvideo がロードされていればよいようだ。
以下で確認したらすでにロード済みのようだったので、PC にカメラを接続してみたら見事に使えた。
めでたし。

$ modprobe -c | grep uvcvideo

CLI ツール群

何を入れるか、どう設定するかは他に詳しい記事がいくらでもありそうなのでそちらに譲るが、現時点で個人的に使っているツールの中で基本的なものをざっと書いておく。
作業効率を考えれば、これらはこの一連のインストール作業の序盤で入れておくべきだったかも知れない。

  • fish + fisherman
  • tmux + tpm
  • fzf
  • ag
  • fd
  • alias ls='lsd'
  • alias diff='colordiff'

最近は alias cat='bat' も検討中。

Arch Linux 特有のもの

$ yay -Ss pacman-contrib pkg-tools

見た目を整える

壁紙

Nitrogen を使う。
先に好きな壁紙を用意しておくのをお忘れなく。

$ yay -S nitrogen
$ nitrogen /path/to/壁紙画像のあるディレクトリ

これで GUI が起動するので好みに設定し、Apply してから終了する。

そして起動時に壁紙を表示するように以下を行う。

$ echo 'nitrogen --restore &' >> ~/.xprofile

背景透過

Compton を使う。

$ yay -S compton

起動オプションは適宜調べて好みに設定すればよいが、バックグラウンド起動は -b でできるので最低限このオプションだけつけておけばいいだろう。

$ compton -b
$ echo 'compton -b' >> ~/.xprofile

各種テーマの導入

今のところやってない(いずれ対応してこの記事に書くかも…)。
アイコンだけでなく、複数バージョンの GTKQt に対応し、かつ両者の統一感まで考え出すと面倒。
とりあえず i3 や dunst 等の見た目を整えた時点でそれっぽいやつを適宜導入していけばいいかと思った。

ちなみに、アイコンや GTK のテーマを拾ってくる場所として以前は https://www.gnome-look.org/ を使っていたので、今回もお世話になりそう。

Steam

まずは Multilib を有効化する。
/etc/pacman.conf の以下をアンコメントする。

/etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist

続いて以下を実行する。

$ yay -Syy

そして 32 bit の NVIDIA ドライバと Steam を導入する。

$ yay -S lib32-nvidia-utils steam

あとは steam コマンドで起動すればよい…のだが、この起動でけっこうトラブることがある。
そんな時は Arch Wiki の Steam トラブルシューティング記事なんかを見ながら粘る。
粘る…。

チューニング

とりあえず Arch Wiki にあるもののうち Disk I/O 関連だけやっておいた。
https://wiki.archlinux.org/index.php/Improving_performance

SSD

TRIM

速度劣化を防止するため TRIM を有効化する。

まずは TRIM がサポートされているかを先に確認すること。

$ yay -S hdparm
$ sudo hdparm -I /dev/sda |grep TRIM                                                                                               
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
$ yay -Rs hdparm

supoprted とあるので fstrim を有効にする。

$ sudo systemctl enable fstrim.timer
$ sudo systemctl start fstrim.timer

ちなみに日本語版の Arch Wiki にしか書いてなさそうだったのだが、/etc/fstabdiscard フラグを追加することによる TRIM の有効化は推奨されないらしい

また、今回のように LMV を使っている場合は上記に加えて /etc/lvm/lvm.confissue_discards の値を 1 に変更すること。

atime

atime 情報の更新を止めて高速化を図る
/etc/fstabrelatime オプションを付与する。
最速は noatime オプションを使って完全に atime の更新を止めることなのだが、atime が全く更新されなくなると上手く動作しないアプリケーションが一部あるようなので、ファイル書き込み時だけは更新してくれる relatime を妥協案として使うのが現実解になりそうだ。

そして /etc/fstab を変更したので再起動…と思ったら、以下のコマンドを打てばよいようだ。

$ sudo mount -a

I/O スケジューラ

SSD の場合は伝統的な CFQ では遅いという話があり、変更を試みた。

$ cat /sys/block/sda/queue/scheduler                                                                                              
[mq-deadline] kyber bfq none

というわけでもともと mq-deadline になっていたのでこのまま行ってみることにした。

ちなみに LVM を使っている都合で dm-0 というブロックデバイスもあるが

$ cat /sys/block/dm-0/queue/scheduler                                                                                              
none

これは…このままでいいいのかな?
none になっていたら調整するなという記事も見かけたので。

ちなみにこの dm-X が何かというのはこちらのスクリプトで判明する。

Swap

swappiness を 10 にする。0 にはしない。
参考: https://qiita.com/rarul/items/a96b61b1fb535dea5fe3
RAM は 32GB と多く積みはしたが、正直 swappiness の挙動をちゃんと理解できておらず、0 にするのが本当に適切なのかは怪しい…。
というわけで Red Had の推奨値である 10 を設定することとした。
まあこの推奨値も、Oracle DB では、という枕詞があるわけだが…。

まずはデフォルト値である 60 が設定されていることを確認しておく。

$ cat /proc/sys/vm/swappiness
60

というわけで 10 まで下げる。
現在のセッションで swappiness を一時的に変更するのと、永続化設定を両方入れるのでコマンドは 2 つ。

$ sudo sysctl vm.swappiness=10
$ echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-sysctl.conf
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【目的別】Github手順書【初心者向け】

当記事の目的

以下の悩みを解決

  • GitHubのコマンドが書いてあるページはたくさんあるけど、現状に合わせてどう組み合わせて使ったらいいか分からない
  • はじめてGitHub触るけどぶっちゃけ何から手を付けたらいいか分からない

前提条件

  • 構成管理システムの概念的な話は一切触れません
  • GitHubのコマンドをインストール済みで、Linux上でGitHubにアクセスすることを想定
  • fetchとは何か、mergeとは何か、ローカルリポジトリとは?originとは?みたいな話は別のまとめを見てください。気が向いたら参考ページ張ります
  • 筆者がGitHubに慣れていくにつれ加筆されていきます

Windows環境の人は、インストールについてはそれなりに手間なので、【Windows】Gitの環境構築を参考にしてください。Linux環境の人はデフォルトでインストールされていることがほとんどですが、なければsudo apt-get install gitしてください。

インデックスを見ながら、自分に合った目的をお探しください

GitHubコマンド手順

case1 : 開発チームに入ったぞ!早速ローカルのフォルダにリモートのソースコードをクローンしてこよう!

手順

  • 自分のリポジトリにアクセス
    画像

  • Clone or downloadをクリックし、表示されたURLを控える(https://github.com/自分のリポジトリ.gitとする)

  • ローカルリポジトリを作成したいフォルダに移動

  • $ git clone https://github.com/自分のリポジトリ.git -b branch_name local_folder_name

    • branch_nameは、リモートのどのブランチをクローンするか指定
    • local_folder_nameは、作成するローカルリポジトリの名称(デフォルトはリモートURL-ブランチ名
  • ユーザID、パスワード入力を求められるため、GitHubにログインする際のユーザ名とパスワードを入力する

詰まりそうな点

case2 : ブランチを分けてカスタマイズをするぞ!まずはブランチを分けよう!

手順

  • gitクローンされた、ローカルリポジトリ下にいることを確認
  • $ git branchでブランチの状態を確認
shun@shun-VirtualBox:~/xxx/yyy$ git branch
* original_branch_name
  • $ git checkout -b new_branch_name original_branch_nameで新ブランチ作成
    • new_branch_nameは、作成する新しいブランチの名称
    • original_branch_nameは、基にするローカルのブランチ名称
    • リモートからチェックアウトする場合は$ git checkout -b branch_name origin/branch_name
      • origin/branch_nameがリモート、branch_nameがローカル
  • $ git branchでブランチの状態を確認
shun@shun-VirtualBox:~/xxx/yyy$ git branch
  original_branch_name
* new_branch_name

case3 : カスタマイズが終わったから、分岐したローカルブランチに対してコミットしよう!

  • gitクローンされた、ローカルリポジトリ下にいることを確認
  • $ git statusでチェックアウトしてからの変更情報を確認
    • deleted: moved_file.pyは、消去されたファイル(実際にはファイル移動)
    • modified: changed_file.pyは、変更が加えられたファイル
    • deleted: deleted_file.pyは、消去されたファイル
    • new_file.pyは、新規で作成されたファイル
    • new_folder/moved_file.pyは、新規で作成されたファイル(実際にはファイル移動)
shun@shun-VirtualBox:~/xxx/yyy$ git status
ブランチ new_branch_name
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
    deleted:    moved_file.py
    deleted:    deleted_file.py
    modified:   changed_file.py


追跡されていないファイル:
  (use "git add <file>..." to include in what will be committed)

    new_folder/moved_file.py
    new_file.py

no changes added to commit (use "git add" and/or "git commit -a")
  • この状態を想定して、まずはaddしていく
    • $ git add moved_file.py
    • $ git add deleted_file.py
    • $ git add changed_file.py
    • $ git add new_folder/moved_file.py
    • $ git add new_file.py
  • $ git statusでaddした後の状態を確認
    • それぞれがrenamed, modified, deleted, new fileとしてコミット予定の発射台に乗っていることを確認する
shun@shun-VirtualBox:~/xxx/yyy$ git status
ブランチ new_branch_name

コミット予定の変更点:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    moved_file.py -> new_folder/moved_file.py
    modified:   changed_file.py
    deleted:    deleted_file.py
    new file:   new_file.py

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)


追跡されていないファイル:
  (use "git add <file>..." to include in what will be committed)

no changes added to commit (use "git add" and/or "git commit -a")
  • $ git commit -m 'message'でコミットを実行
    • messageは任意のコミットメッセージを入力

詰まりそうな点

  • 間違えてaddして、取り消したい場合は$ git reset HEAD added_fileを実行。$ git reset HEADまでは固定。renameの場合は、変更前のファイルと変更後のファイルに対して両方resetする必要がある
  • 一括でadd取り消したい場合は$ git reset HEAD
  • commit時にメッセージは必須で、-m以降を入力しないとvimが開いてしまう

case4 : ローカルのブランチにコミットしたぞ!リモートブランチにも反映しよう!

手順

  • $ git push origin new_branch_name
    • originは固定値
    • new_branch_nameはリモートに反映させたいブランチ名称
    • new_branch_nameがリモートにない場合は、新規に作られる

詰まりそうな点

  • リモートに同一名称のブランチがない場合は、new_branch_nameが新規作成される

case5 : ローカルのブランチを、リモートのブランチの状態に合わせたい!

ローカルで色々更新したんだけど、やり直したい場合を想定。同一名称のリモートブランチに別のマージが入っている場合は、以下のやり方ではなく素直$ git pull origin developでプルをする。

手順

  • $ git fetch origin
    • [new branch]となっているブランチは、ローカルには無いけどリモートに存在するブランチ
    • original_branch_nameは、ローカルにもリモートにも存在するブランチ
shun@shun-VirtualBox:~/xxx/yyy$ git fetch origin
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From https://github.com/自分のリポジトリ
 * [new branch]      new_branch   -> origin/new_branch
   c5996a4..47d6cc0  original_branch_name    -> origin/original_branch_name
  • $ git reset --hard origin/original_branch_name
    • git reset --hard origin/までは固定、original_branch_nameは、合わせたいブランチ名称
    • fetchしてきたリモートのブランチを、ローカルの同一名称ブランチに反映させますよ!という命令
  • $ git checkout original_branch_nameで、reset後のブランチに移動する
  • $ git clean -df .で余分なファイルを削除する
    • ここまでの命令では、あくまで更新情報/新規作成情報のみをリモートから取得できるが、不要ファイルの削除をしてあげる必要がある
    • ここまで実行することで、リモートブランチと全く同じ状態になる

詰まりそうな点

  • fetchって何?と思う人は、リモートリポジトリとローカルリポジトリの中間層があると思えばよい。そこを「origin」と呼んでおり、リモートをoriginに反映させる処理をfetchと呼ぶ。originを使ってローカルリポジトリをどうするかが、reset以降のコマンド【入門者向け】Gitのfetchコマンドについて図を用いて解説

case6 : 1つ1つaddするのめんどくさいから一括でaddしたい!

手順

  • $ git add -u

    • トラッキング(バージョン管理)されているファイルについて、すべてaddされる
    • つまり、「削除されたファイル」、「変更されたファイル」はaddされ、「新規作成されたファイル」はaddされない
  • $ git add -A

    • トラッキング(バージョン管理)されていないファイルも含めて、すべてaddされる
    • つまり、「削除されたファイル」、「変更されたファイル」、「新規作成されたファイル」がaddされる
  • $ git add .

    • カレントディレクトリ以下に対して、$git add -Aを実行する

case7 : プルリクも承認されたし、不要ブランチを削除するぞ!

手順

まずはローカルのブランチから削除していく

  • % git branch
    • まずは現在のブランチの状態を確認
    • developにマージが完了しており、updateDevelopを削除したいとする
shun@shun-VirtualBox:~/workspace/global$ git branch
  develop
* updateDevelop
  • $ git checkout develop
    • このままでは削除できないので、developブランチに移動する

マージが完了している場合

  • $ git branch --delete updateDevelop
    • 不要ブランチを削除する

マージが完了していないが削除したい場合

  • $ git branch -D updateDevelop
    • 不要ブランチをマージをせずに削除する
    • ※これまで反映したcommitは削除されるので注意

次にリモートブランチを削除する

  • % git branch --remote
    • まずは現在のリモートのブランチの状態を確認
    • ローカルでは削除したupdateDevelopが残っている
shun@shun-VirtualBox:~/workspace/global$ git branch --remote
  origin/HEAD -> origin/master
  origin/develop
  origin/updateDevelop
  • $ git push --delete origin updateDevelop
    • 不要ブランチを削除する

もしくは以下のコマンドでも可能

  • $ git push origin :updateDevelop

最終的なブランチの状態を確認する

  • $ git branch --all
shun@shun-VirtualBox:~/workspace/global$ git branch --all* develop
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/develop

case8 : 親ブランチにされたコミットを、今の作業ブランチに反映させたい!

手順

developブランチで作業している際に、masterブランチにコミットが入りました。そんな時はrebaseを使います。

ブランチの状態は以下の通りで、origin/maseterにコミットが加えられている

shun@shun-VirtualBox:~/workspace/global$ git branch -a
  master* 
 develop
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/develop
  • $ git checkout -b master origin/master

    • まずはローカルに、masterブランチをcheckoutします
  • $ git pull origin

    • リモートmasterブランチへの反映を、ローカルのmasterブランチにも行います
  • $ git checkout develop

    • 元々作業していたdevelopブランチに移動します
  • $ git rebase master

    • masterブランチへのコミットを、現在の作業ブランチに反映ささせます

現時点のブランチの状態は以下の通りで、ローカルのmasterとdevelopは同じ状態

shun@shun-VirtualBox:~/workspace/global$ git branch -a
  master
 develop* 
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/develop

リモートにも反映させる場合は、プッシュをしてあげればOK

  • $ git push origin develop

case9 : リモートブランチに反映された内容をローカルの同名ブランチにも反映させたい!

手順

現在のブランチの構成は以下の状態とし、リモートのdevelopに反映されたコミットをローカルdevelopにも反映させたいとします

shun@shun-VirtualBox:~/workspace/global$ git branch -a
  master
 develop* 
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/develop

一発で反映させたい場合は、以下のコマンド

  • $ git pull origin develop
    • origin(追跡ブランチ)に、リモートのdevelopを反映させる(フェッチ)
    • また、originからローカルのdevelopブランチに統合する(マージ)

上記の手順を別コマンドで行うと以下のようになる

  • $ git fetch origin develop
    • origin(追跡ブランチ)に、リモートのdevelopを反映させる
  • $ git merge FETCH_HEAD
    • originのFETCH_HEADからローカルのdevelopブランチに統合する

続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C言語でファイルの更新日をナノ秒まで表示する方法

※ 2017年の自分の記事を移転しました。

C言語でファイルの更新日時をナノ秒まで表示する方法です。
用途としては、ファイルの定期的な更新確認ですかね。

環境について

・Linuxカーネル2.5.48以上
・ファイルシステム XFS, JFS, Btrfs, ext4
上記以外のファイルシステムは、ナノ秒は0で表示される可能性があります。

ソース

nsec_show.c
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int i;
    struct stat st;
    char date_str[256];

    /* argc check */
    if (argc != 2) {
        printf("USAGE:%s <FILE PATH>\n", argv[0]);
        return 1;
    }

    /* get stat */
    if (stat(argv[1], &st) != 0) {
        printf("%s\n", strerror(errno));
        return 1;
    }

    /* show */
    strftime(date_str, 255, "%Y%m%d%H%I%M%S", localtime(&st.st_mtime));
    printf("%s.%09ld\n",date_str, st.st_mtim.tv_nsec);

    return 0;
}

動作確認

コンパイル後、実行すると以下のような形で表示されます。

$ gcc nsec_show.c  -o nsec_show
$ ./nsec_show ./nsec_show.c
20170305063637.656058532

ちなみに、lsコマンドで表示されるナノ秒と一致しています。

$ ls ./nsec_show.c --full-time
-rw-rw-r--. 1 miyabi miyabi 581 2017-03-05 06:36:37.656058532 +0900 ./nsec_show.c

参考文献

STAT
CLOCK_GETRES

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【備忘録】MD5のハッシュ値確認と照合について

装置A、装置Bが存在しているのが前提。

装置Aから装置Bにmd5sum_testディレクトリごとコピーする。
md5sum_testディレクトリにはファイルが入っている。

1.装置Aで下記コマンド

$ find /home/pi/md5sum_test/1/ -type f -exec md5sum {} \; > 1_A.md5sum

2.装置Aで下記コマンドで内容確認。

$ cat 1_A.md5sum
372e25f23b5a8ae33c7ba203412ace30  /home/pi/md5sum_test/1/file2
60b725f10c9c85c70d97880dfe8191b3  /home/pi/md5sum_test/1/file1

3.装置Bに手順1で作成したファイルを転送。

4.装置Bで下記コマンド実施。

$ md5sum -c /tmp/1_A.md5sum
/home/pi/md5sum_test/1/file2: 完了
/home/pi/md5sum_test/1/file1: 完了

※失敗すると下記のようになる。

/home/pi/md5sum_test/2/file2: 完了
/home/pi/md5sum_test/2/file1: 失敗
md5sum: 警告: 1 個の計算したチェックサムが一致しませんでした

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む