VMware上のUbuntuをマルチディスプレイにする

VMware上で起動しているUbuntuを、マルチディスプレイで使用する方法を記録しました。



Introduction

私はUbuntu18.04.1 LTS を、Windows10の上にVMware Workstation Playerによって構築した仮想環境で使用しています1

これまでは一つのモニタで作業を行っていましたが、マルチディスプレイで作業がしたくなりました。

そこで今回は、VMware上のUbuntuをマルチディスプレイ(デュアルディスプレイ)に設定する方法を記録します。


Results

最終目的: "複数のモニタを循環" をONにすること

"複数のモニタを循環"をONにすれば、マルチディスプレイを使用することができます。 "複数のモニタを循環"のボタンは、

VMwareツールバー > "複数のモニタを循環"マーク

あるいは

VMwareツールバー > Player(P) > 複数のモニタをサイクル(C)

にあります。
※前提として、フルスクリーンモードにしてある必要があります。

しかし、いきなりこれを押すと次のようなエラーを吐かれてしまいました。

-仮想マシンに最新のVMware Toolsがインストールされて、
稼働している必要があります。

そこで、VMware Toolsのインストールを試みました。


VMware Toolsと言われるものには、どうやら2つのものがあるようです。

VMware側が配布している"VMware Tools"と、
OS(Ubuntu)側が配布しているVMware Toolsのオープンソース版"open-vm-tools"です。

推奨されているのは"open-vm-tools"です。 インストール手順も、圧倒的に"open-vm-tools"のほうが簡単でした。


※私は"VMware Tools"をインストールしようとして、そのインストーラー起動時に"open-vm-tools"を推奨する警告を受け取り、"open-vm-tools"をインストールしたという経緯があります。


そこで、まずは"open-vm-tools"のインストール手順を記録します。


open-vm-toolsのインストール: 推奨

こちらは極めて簡単です。 ただopen-vm-toolsをaptインストールすれば済みます。

$ sudo apt install open-vm-tools


VMware Toolsのインストール: 非推奨

つぎに、VMware Toolsのインストール手順の記録を、一応残します。 ただし、VMware Toolsのインストールは手順が面倒な上に、インストール直前にはopen-vm-toolsのインストールを公式に勧められます。 素直にopen-vm-toolsをインストールするべきでしょう。

Perlがインストールされているかを確認する

VMware Toolsのインストールを始める前に、Perlがインストールされているかを確認します。 VMware Tools インストーラが Perl で書かれているためです。 ターミナルでperl -verionを実行して確認しました。

$ perl -version

This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64-linux-gnu-thread-multi
(with 67 registered patches, see perl -V for more detail)

Copyright 1987-2017, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

こんな感じになっていれば、perlはすでにインストールされています。

もしインストールされていなければ、aptインストールします。

$ sudo apt install perl


VMware Toolsをインストールする

それではVMware Toolsをインストールしていきます。
VMware Toolsは、仮想CD-ROMからインストールする形をとるようです。

VMwareツールバー > Player(P) > 管理(M) > VMware Tools のインストール(T)...

とすると、仮想CD-ROMがマウントされます。

"Files"から確認すると、CDメディアの欄に"VMware Tools"が挿入されているのが確認できます。
あるいはlsコマンドで挿入メディアを確認すると、

$ ls /media/<user name>
'VMware Tools'

"VMware Tools"の挿入が確認できます。


つぎに、この仮想CD-ROMにある圧縮ファイルを解凍し、インストーラを実行します。

解凍する場所は、/tmpディレクトリとしました。 /tmpディレクトリは、一定期間後に中のファイルが自動的に削除される一時的な作業ディレクトリです。

/tmpディレクトリに移動し、仮想CD-ROMの圧縮ファイル(VMwareTools-10.3.2-9925305.tar.gzのようなもの)を解凍します。

$ cd /tmp
$ tar -zxpf '/media/<user name>/VMware Tools/VMwareTools-10.3.2-9925305.tar.gz'

これで、解凍フォルダ"vmware-tools-distrib"が作成されました。

つぎに、この"vmware-tools-distrib"フォルダの中にあるインストーラ"vmware-install.pl"を、管理者権限sudoで実行します。

$ sudo ./vmware-install.pl
[sudo] password for <user name>: 
open-vm-tools packages are available from the OS vendor and VMware recommends 
using open-vm-tools packages. See http://kb.vmware.com/kb/2073803 for more 
information.
Do you still want to proceed with this installation? [no] 

するとこのように、公式にopen-vm-toolsのインストールを勧められます。 なので私は、open-vm-toolsを上記のようにしてインストールしました。


"複数のモニタを循環" をONにする

VMware Tools(open-vm-tools)のインストールが完了したので、"複数のモニタを循環" をONにします。

VMwareツールバー > "複数のモニタを循環" をクリック

遂にこれで、マルチディスプレイが使用できるようになりました。


Discussion

今回は、VMware上のUbuntuをマルチディスプレイで使用する方法を記録しました。

蓋を開けてみればopen-vm-toolsの簡単なインストールだけで済む話でした。

しかし、私はVMwareドキュメントを参考に作業したおかげで、open-vm-toolsの存在を知らないまま、面倒なVMware Toolsのインストール手順を進めてしまいました。

私と同じ道を歩む人が少しでも減るよう、願います。


See also

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work


Reference

1 つの仮想マシンでの複数モニタの使用

Linux 仮想マシンへの VMware Tools の手動インストール

Ubuntuでpip / pip3がインストールできないときの対処法 | Python2 / 3

Ubuntuでは、Pythonのpip / pip3がインストールされていませんでした。 pip / pip3のインストールに予想外にもつまずいたので、記録を残します。



Introduction

Pythonにパッケージをインストールするときには、pipコマンドが便利です。 しかし、UbuntuにデフォルトでインストールされているPythonには、pipがインストールされていませんでした。

試しにpandasをpipインストールしてみると、

$ pip install pandas

Command 'pip' not found, but can be installed with:

sudo apt install python-pip

エラーが表示され、代わりにpipのインストール手順が示されました。

しかし、この提示されたインストール手順も、はじめはうまく機能しませんでした。

試行錯誤の結果、pip / pip3のインストールに成功しましたので、記録を残します。


Material

Ubuntu18.04.1 LTS を
Windows10の上に、VMwareによって構築した仮想環境で起動しています。
www.bioerrorlog.work


Results

pipとpip3は違う

まず、前提として私が勘違いしていたのは、pipとpip3の違いについてです。

どうやら、pipはPython2、pip3はPython3、のpipコマンドのようです。

teratail.com

私はpipコマンドはすべてpipで、pip3はおまけのようなものだと思っていましたが、UbuntuのようにPython2とPython3が両方インストールされている場合には、この違いが無視できません。 pipと打てばPython2の、pip3と打てばPython3のpipとして機能するようです。

逆に、Python2かPython3のどちらか片方しかインストールしていない場合は、どちらもpipで大丈夫らしいです。

まさに、Pythonプログラムを実行する時のpython/python3コマンドと同じでしょう。 Pyhon3で実行するときはpython3を用い、単にpythonで実行すれば、Python2で実行されます。

つまり今回は、pipとpip3をそれぞれ別々にインストールする必要があるわけです。


はじめはapt installが機能しなかった
: pip× / pip3×

それでは、pipとpip3をインストールしてみます。

上述したように、pipを使おうとすると、次のようなインストール手順が提示されます。

pip:sudo apt install python-pip

$ pip install pandas

Command 'pip' not found, but can be installed with:

sudo apt install python-pip


pip3:sudo apt install python3-pip

$ pip3 install pandas

Command 'pip3' not found, but can be installed with:

sudo apt install python3-pip


しかし、このどちらもエラーを吐かれてしまい、上手くいきませんでしたので、とりあえず別の方法を探しました。


"get-pip.py"からpipをインストールする
: pip○ / pip3×

しばらく解決方法を探していると、pipをインストールする他の方法を見つけました。

www.liquidweb.com

このサイトよると、"get-pip.py"をあるURLから取得して、実行すればいいようです。

URLから"get-pip.py"ファイルを取得するにはcurlコマンドを使いますが、デフォルトではインストールされていないので、aptでインストールしました。

$ sudo apt install curl

インストールが終わったら、次のようにして"get-pip.py"ファイルを取得します。

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"

これで、"get-pip.py"ファイルが出力されました。

そうしたら、この"get-pip.py"をpythonで実行します。

$ sudo python get-pip.py

これで、pipがインストールされました。

pipがちゃんとインストールされたかを--versionで確認すると、

$ pip --version
pip 19.0.3 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

確かにpipがインストールされています。


次は、pip3のインストールを試みます。 "get-pip.py"のコードの中身を少し読んでみるとPython2とPython3の両方の環境に対応していたため、pipと同じ要領で"get-pip.py"をpython3で実行してみます。

$ sudo python3 get-pip.py 
~
ModuleNotFoundError: No module named 'distutils.util'

しかし、エラーを吐かれてしまい、pip3についてはこのやり方が上手くいきませんでした。

apt updateしてからapt installする
: pip○ / pip3○

解決策を探して長いこと右往左往していましたが、実に単純な操作で解決しました。 apt installする前にアップデートしてみたら、上手くいったのです。

アップデートは次のふたつの手順で行いました。

$ sudo apt update
~
$ sudo apt upgrade
~

アップデート終了後に再びpip3をインストールしてみると、

$ sudo apt install python3-pip

見事、今度はエラーなくインストールに成功しました。

pip3がちゃんとインストールされたかを--versionで確認すると、

$ pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

確かにpip3がインストールされていることが分かります。


Conclusion:アップデートしてからapt installすべし

まず行うべきはアップデートです。

$ sudo apt update
$ sudo apt upgrade

ただし、このupdate/upgradeの両方が必要なのか、updateだけで大丈夫なのか、私にはいまいち理解できていません1


その後、pipとpip3をそれぞれapt installします。

$ sudo apt install python-pip
$ sudo apt install python3-pip


上手くいかなければ、"get-pip.py"からpipとpip3をそれぞれインストールします。

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo python3 get-pip.py

Discussion

今回は、Ubuntuでpip / pip3をインストールときの試行錯誤を記録しました。

蓋を開ければ解決方法は単純で、インストール前にアップデートしておくというものです。 これはpip / pip3のインストールのみならず、他の多くのパッケージでも適応できる教訓だと思うので、肝に銘じておきます。

ところで、updateとupgradeは具体的にどのような操作を行っているのでしょうか。 漠然とイメージが掴めるばかりに、実際の処理を私は理解できていません。

知らないことが増えていくのは、楽しいことです。


  1. 多くのネット上の情報で助言されているのは、updateのみでした。

実験 | Ubuntuディスプレイ解像度を"1x1"に設定してみたい

Ubuntuディスプレイの解像度を、最小の"1x1"に設定できるのか、検証してみました。



Introduction

以前、Ubuntuディスプレイ解像度を1920x1080に設定した時のこと、xrandrコマンドを実行すると大変面白そうな記述に出会いました。

$ xrandr
Screen 0: minimum 1 x 1, current 800 x 600, maximum 8192 x 8192
~

ここで、解像度maximum 8192 x 8192はまだわかります。 しかし、minimum 1 x 1とは一体どういうことでしょうか。

これは是非とも試してみたいです。

ディスプレイ解像度を変更するやり方は、過去の記事で既に把握しています。

www.bioerrorlog.work

さっそく、本当にディスプレイ解像度を1x1に設定できるのか、試してみます。


※注意※
操作不能になっても構わない仮想環境で試しました。 PCに直接インストールしているOSでは試さない方がよいと思います。


Material

Ubuntu18.04.1 LTS を
Windows10の上に、VMwareによって構築した仮想環境で起動しています。
www.bioerrorlog.work


Results

1x1解像度のパラメータを取得する | cvt

とりあえず、解像度を1920x1080に変更したときの手順に則って進めていきます。

まずはcvtコマンドでディスプレイパラメータを取得します。

$ cvt 1 1
# 8x1 0.00 Hz (CVT) hsync: 0.00 kHz; pclk: 0.00 MHz
Modeline "8x1_60.00"    0.00  8 16 8 8  1 4 14 17 -hsync +vsync

少しおかしなことが起きました。 解像度1x1を渡したはずなのに、帰ってきたのは8x1解像度です。

解せませんが、とりあえず8x1解像度でもいいので、進めていきます。


解像度を追加する | xrandr

次に、xrandrコマンドを使って、解像度を設定に追加していきます。 cvtコマンドで得たパラメータを用いて、次のように解像度8x1を追加しました。

$ xrandr --newmode "8x1_60.00"    0.00  8 16 8 8  1 4 14 17 -hsync +vsync

次に、ディスプレイVirtual1に8x1解像度を追加します。

$ xrandr --addmode Virtual1 8x1_60.00

ここで、一旦解像度がデフォルトの小さいサイズに変わりますが、焦る必要はありません。 xrandrコマンドで確認します。

$ xrandr
Screen 0: minimum 1 x 1, current 800 x 600, maximum 8192 x 8192
Virtual1 connected primary 800x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   800x600       60.00*+  60.32  
   2560x1600     59.99  
   1920x1440     60.00  
~
   640x480       59.94  
   8x1_60.00      0.00  

ディスプレイVirtual1に解像度8x1が追加されました。

さて、ここからが本番です。


解像度を変更する

設定から手動で変更

ここまでは過去記事にならって解像度の変更手順を踏んできましたが、ここからはいよいよ解像度を変更していきます。

まずは、解像度を設定から手動で変更します。


左上の「Activities」から「Displays」を検索

「Resolusion」から"8x1"を選択


すると、画面が真っ暗になりました。 解像度の変更に失敗したのか、解像度変更に成功したが目視出来ていないのか、これでは判断がつきません。

もっと悪いことに、この解像度の変更は20秒でもとに戻ってしまいます。 20秒以内に"Keep Changes"ボタンを押さなくてはならないからです(Fig. 1)。

f:id:BioErrorLog:20190318220758j:plain
Fig. 1 通常の解像度に手動で変更するときに表示されるウィンドウ。20秒以内に"Keep Changes"を押さなくてはならない。

8x1のウィンドウの中でこの操作を試みるのはあまり気が進みません。 他の解像度の変更方法を探します。


コマンドで変更

手動ではなく、コマンドでも解像度を変更できることを見つけました。 コマンドでの変更なら、上述の厄介なウィンドウは表示されません。

早速実行してみます。

$ xrandr --output Virtual1 --mode 8x1_60.00

見事、真っ暗な画面が表示されました(Fig. 2)。 20秒でもとに戻ることもありません。

f:id:BioErrorLog:20190318223934j:plain
Fig. 2 解像度8x1に変更した後の仮想環境ウィンドウ。完全な真っ暗に見える。


さて、ここからは、この全くの無に見えるディスプレイが、果たしてちゃんと機能し続けているのか、検証します。

Ubuntuは機能し続けているのか

スクリーンショットから目視で検証する

まずは、虚無に見えるこのウィンドウの中に、8x1のディスプレイが本当に存在しているのか、目視で確認してみます。 このウィンドウの画像をスクリーンショットで撮影し(Fig. 2)、1pxサイズが十分に見える倍率までズームして、8x1ディスプレイを探します。

しかし、頑張って探してもなかなか暗闇の中にUbuntuディスプレイらしきものを見つけることができませんでした。

せっかく生み出した8x1ディスプレイなのに、目に見えないというのは悔しいことです。

操作音を確認する

次に、Ubuntuの操作音を確認してみました。

Ubuntuは、例えばターミナルのスクロールが限界まで来ると"ビープ音"が鳴ります。 こいつを聞くことができれば、Ubuntuがまだ機能し続けていると言えるでしょう。

早速、この暗闇のウィンドウにカーソルを当てて、下カーソルボタン"↓"を押し続けると、

ビープ音が鳴りました!

まだ、このUbuntuは生き続けていると、そう確信できた瞬間です。


Discussion

今回は、Ubuntuディスプレイを1x1に設定しようと試みました。

結果としては、解像度1x1は設定できず、8x1に設定することはできましたが、機能し続けているものの、ディスプレイを目視することは出来ませんでした。

今回頑張って設定した解像度は、冷静になると明らかに無意味なものでしょう。 しかし、機械の限界を試すというのは、未知への憧れが掻き立てられて、なかなか良いものです。

それにしても、8x1ディスプレイを目視出来なかったことは悔しいです。 本当に表示されていないのでしょうか。 だとしたら、どのくらいの解像度までは表示されるのでしょう。

まだまだ、気になることばかりです。


See also

www.bioerrorlog.work

www.bioerrorlog.work

UbuntuにAtomをインストールする | Atom公式推奨の手順を読み解く

Atom公式の推奨する手順に従って、AtomをUbuntuにインストールしました。

結論を言うと、次の4行のコマンドを実行しました。

$ wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list'
$ sudo apt update
$ sudo apt install atom


このそれぞれのコマンドで行っている処理内容を、詳細に読み解いていきます。



Introduction

Linuxではエディタとしてvimを使っています。 使いこなせばとても優秀なエディタだそうですが、初心者としては使いにくい部分があるのは事実です。

そこでとりあえず、Windowsでいつも私が使っているエディタAtomを、Ubuntuにもインストールしてみました。

インストール方法がAtom公式ホームページで解説されていましたが、初心者である私にとってその処理内容は謎ばかりでした。 今回は、その一つ一つの手順を読み解いていきます。

↓Atom公式のインストール方法ヘルプ flight-manual.atom.io


Material

Ubuntu18.04.1 LTS を
Windows10の上に、VMwareによって構築した仮想環境で起動しています。
www.bioerrorlog.work


Results

1行目 | 認証キーのダウンロード・登録

$ wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add -

wgetコマンドをとあるURLに対して実行し、その結果をパイプでsudo apt-key add -に渡しているようです。

まずはwgetコマンドとそのオプション-pOの機能について、マニュアルから調べます。

$man wget
NAME
       Wget - The non-interactive network downloader.

~
-q
--quiet
    Turn off Wget's output.

~
-O file
--output-document=file
    The documents will not be written to the appropriate files, but all will be
    concatenated together and written to file.  If - is used as file, documents will be
    printed to standard output, disabling link conversion.  (Use ./- to print to a file
    literally named -.)

    Use of -O is not intended to mean simply "use the name file instead of the one in the
    URL;" rather, it is analogous to shell redirection: wget -O file http://foo is
    intended to work like wget -O - http://foo > file; file will be truncated immediately,
    and all downloaded content will be written there.

wgetコマンドはネットワークダウンローダーであり、オプション-pはただ出力を表示しないという意味みたいです。

面白いのは次の出力オプション-Oで、出力ファイルとして-を指定すると、結果が標準出力にプリントされると書いてあります。 今回実行するwgetコマンドの前半部分は$ wget -qO - <URL>ですので、まさにURLからダウンロードした結果の出力先に-が指定されており、標準出力として後半のsudo apt-key add -へとパイプされることになります。


さて、次はダウンロードするURLhttps://packagecloud.io/AtomEditor/atom/gpgkeyを調べてみます。 まずはこのURLにブラウザからアクセスしてみました。 するとダウンローダーが立ち上がり、”AtomEditor-atom-4C6E74D6C0A35108.pub.gpg”というファイルのダウンロードを提示されました。 先のwgetコマンドではこのファイルをダウンロードし、sudo apt-key add -へとパイプしたわけでしょう。

さっそくこのファイルを手動でダウンロードし、中身を調べてみます。

まずはfileコマンドでファイルタイプを調べます。

$ file AtomEditor-atom-4C6E74D6C0A35108.pub.gpg
AtomEditor-atom-4C6E74D6C0A35108.pub.gpg: PGP public key block Public-Key (old)

ファイルタイプは"PGP public key block Public-Key"とあります。 これは暗号化でよく聞く公開鍵というやつでしょう。
"PGP"をwikipediaで調べてみると1

Pretty Good Privacy (PGP) is an encryption program that provides cryptographic privacy and authentication for data communication.

やはりデータ通信のための暗号化プログラムのようです。

実際に"AtomEditor-atom-4C6E74D6C0A35108.pub.gpg"ファイルの中身を見てみると、

$ cat AtomEditor-atom-4C6E74D6C0A35108.pub.gpg 
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)

mQINBFo0Ix8BEADWFvFinBKSD+0OTCGrY4F+GxdXdZm3tCT0YxSc54phh6JaDGvs
7gkNYNl4nbGPMK7jfN0X859BOFqBUUZ7A49C3fMVtjT7Q5SIrRCRyuHxy+RHs/gi
1+veNxJU5kQLM2RHC0kzOFczGc83JJvuyecDLfRp9DzpgNFG8BunazByfqz5WhFu
~中略~
z2PiG8U/1G4rcGyRaYbh0YA2GzsM9iGLds7YaMRGhMDytNqZOairMdZJRc5u7x4i
Md1AC6VBgFkelmdqGxyFIFqL3OjzgnCA5xjtKyHctxUldkIVPB/Tuso2pWeybzbt
geP9xVV2t32y5Vnm184J09woo9YPSkdHtwhACy8KUFjcTr+gPK4MuDPi
=xIV1
-----END PGP PUBLIC KEY BLOCK-----

膨大な文字列が記載されています。
これが公開鍵、はじめて出会いました。


さて次は、このダウンロードされた公開鍵がsudo apt-key add -へと渡されています。 apt-keyをマニュアルで調べてみると、

DESCRIPTION
       apt-key is used to manage the list of keys used by apt to authenticate
       packages. Packages which have been authenticated using these keys will
       be considered trusted.
~
COMMANDS
       add filename
           Add a new key to the list of trusted keys. The key is read from the
           filename given with the parameter filename or if the filename is -
           from standard input.

パッケージを認証するための鍵リストを管理する機能があるようです。 今回のケースでは”AtomEditor-atom-4C6E74D6C0A35108.pub.gpg”を新たな認証キーとして登録するということなのでしょう。 add -とすることで、標準入力から読み込むことができるようです。


以上より、1行目では新たな認証キーをダウンロード・登録していることが分かりました。


2行目 | aptにAtomリポジトリを登録

それでは2行目に移ります。

$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list'

sh ~からはじまる前半部分の結果が、/etc/apt/sources.list.d/atom.listへと、sudo権限のもとで出力されています。

まずはshコマンドのマニュアルを調べます。

$ man sh
NAME
     dash — command interpreter (shell)
~
-c       Read commands from the command_string operand instead of from the
         standard input.  Special parameter 0 will be set from the
         command_name operand and the positional parameters ($1, $2, etc.)
         set from the remaining argument operands.

dashコマンドのマニュアルに飛びました。 Ubuntuではshdashという名前だそうです2

dashはコマンドインタプリタで、シェルスクリプトの実行などに使われるもののようです。 しかし、ここで-cオプションを与えると、指定したコマンド文字列を実行させることができます。 今回のケースでは'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list'が実行される訳です。

こいつは大変面白い工夫です。

例えば今回のこのコマンドをsh -cを使わずに実行してみたとすると、

$ sudo echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list

となりますが、これはうまく行きません。 リダイレクト> /etc/apt/sources.list.d/atom.listsudo権限が及んでいないため、出力ができないからです。

そこで、echo ~以下のコマンドをすべてひとまとまりとし、sh -cに渡してsudo権限で実行することで、/etc/apt/sources.list.d/atom.listへの出力までを実現できるということでしょう。 実によくできていると思います。

ちなみに、/etc/apt/sources.list.d/atom.listの中身を確認してみると、

$ cat /etc/apt/sources.list.d/atom.list 

deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main

たしかに指定した文字列が書き込まれていました。

この書き込まれたURLを見ると、Atomのpackagecloudリポジトリ3が指定されています。 ここからAtomパッケージをダウンロードできます。

つまりこの行では、aptディレクトリにAtomパッケージのリポジトリを登録した、ということになります。


3-4行目 | aptインストール

$ sudo apt update
$ sudo apt install atom

3-4行目でやっていることは、普段aptでパッケージをインストールするのと変わりありません。

aptをアップデートした後、Atomをインストールしています。

以上によって、Atomをインストールできました。


Discussion

今回は、Atom公式の推奨するインストール手順を読み解いてきました。

無事Atomもインストールできましたし、それぞれのコマンド処理内容もとりあえず把握できましたが、まだまだわからないことだらけです。

登録した公開鍵は実際どのようにして、何の認証に使われているのでしょうか。 そもそも、aptインストールとはつまるところ何を行っているのでしょうか。

単なるAtomのインストール作業から、思いもよらぬ謎が豊富に湧き上がってきました。
こういうのも、なかなか面白いことです。


See also

www.bioerrorlog.work

www.bioerrorlog.work

gdbをデフォルトでintel記法にする | 初期化処理の仕組み

gdbシンタックスをデフォルトでintel記法にする方法と、その仕組みを調べます。



Introduction

GNUデバッガgdbのアセンブラ表記は、AT&T記法とintel記法の2つがあり、それぞれ見た目は次のような感じになっています。

AT&T記法

Dump of assembler code for function main:
   0x00000000000006da <+0>:  push   %rbp
   0x00000000000006db <+1>:  mov    %rsp,%rbp
   0x00000000000006de <+4>:  sub    $0x10,%rsp
   0x00000000000006e2 <+8>:  mov    %edi,-0x4(%rbp)
   0x00000000000006e5 <+11>: mov    %rsi,-0x10(%rbp)
   0x00000000000006e9 <+15>: cmpl   $0x2,-0x4(%rbp)


intel記法

Dump of assembler code for function main:
   0x00000000000006da <+0>:  push   rbp
   0x00000000000006db <+1>:  mov    rbp,rsp
   0x00000000000006de <+4>:  sub    rsp,0x10
   0x00000000000006e2 <+8>:  mov    DWORD PTR [rbp-0x4],edi
   0x00000000000006e5 <+11>: mov    QWORD PTR [rbp-0x10],rsi
   0x00000000000006e9 <+15>: cmp    DWORD PTR [rbp-0x4],0x2

intel記法のほうが右の部分がスッキリしていて見やすいので、私はintel記法のほうが好きです。

しかし、gdbはデフォルトではAT&T記法に設定されているため、intel記法に変更するには次のコマンドを打つ必要があります1

(gdb) set disassembly-flavor intel

gdbを立ち上げるたびに毎回このコマンドを打つのは面倒です。 そこで、デフォルトでintel記法に設定する方法と、その仕組みを調べました。


Material

Ubuntu18.04.1 LTS を
Windows10の上に、VMwareによって構築した仮想環境で起動しています。
www.bioerrorlog.work


Results

ホームディレクトリ直下で".gdbinit"にコマンドを書き込む

やり方を検索してみると、すでに多くの方々が解決策を示していました。 bttb.s1.valueserver.jp

ホームディレクトリに".gdbinit"というファイルを作成し、そこに実行させたいコマンドを書き込むだけでいいようです。 さっそく".gdbinit"を作成し、

set disassembly-flavor intel

とだけ書き込みました。 これを保存し、gdbで確認すると、

(gdb) disas main
Dump of assembler code for function main:
   0x00000000000006da <+0>:  push   rbp
   0x00000000000006db <+1>:  mov    rbp,rsp
   0x00000000000006de <+4>:  sub    rsp,0x10
   0x00000000000006e2 <+8>:  mov    DWORD PTR [rbp-0x4],edi
   0x00000000000006e5 <+11>: mov    QWORD PTR [rbp-0x10],rsi
   0x00000000000006e9 <+15>: cmp    DWORD PTR [rbp-0x4],0x2

たしかにデフォルトでintel記法になっており、ひとまず目的を達成しました。

しかし、なぜ".gdbinit"というファイル名が認識され、コマンドが自動で実行されるのでしょうか。

まるで見当がつきません。 ここを調べていきます。

"."からはじまるドットファイルの意味

まずは、"."からはじまるファイル(ドットファイル)の意味について。

前々から、lsコマンドではドットファイルは表示されず、ls -aとしなければ表示されないことは経験として認識していましたが、その意味はいまいち分かりませんでした。 このドットファイルが隠しファイルである理由については、面白い情報があったので添えておきます。 qiita.com


次に、ドットファイルの役割について調べてみました。 すると、ドットファイルは設定を書き込んで読み込ませるためのファイルとして利用されるようです2。 まさに今回".gdbinit"で行ったような用途で使われるというわけです。

しかし、このドット自体に何か特別な機能が付与されているわけではなく、あくまで設定ファイルを取り扱うための表記のようです。 これだけでは、".gdbinit"というファイルがgdbによって実行される理由にはなりません。

gdbドキュメントから調べる

わからなくなったときは、公式のドキュメントやマニュアルを読むのが結局一番早い、というのが私の経験則です。 gdbについては、オンラインドキュメントがありました。

sourceware.org

これを調べてみると、gdbの初期化処理についての記述がありました。 まとめると、次のように39つの初期化処理が順番に実行されるようです。

2.1.3 What GDB Does During Startup
Here’s the description of what GDB does during session startup:

1. Sets up the command interpreter as specified by the command line.
2. Reads the system-wide init file and executes all the commands in that file.
3. Reads the init file in your home directory and executes all the commands in that file.
4. Executes commands and command files specified by the ‘-iex’ and ‘-ix’ options in their specified order.
5. Processes command line options and operands.
6. Reads and executes the commands from init file in the current working directory.
7. If the command line specified a program to debug, or a process to attach to, or a core file, GDB loads any auto-loaded scripts provided for the program or for its loaded shared libraries.
8. Executes commands and command files specified by the ‘-ex’ and ‘-x’ options in their specified order.
9. Reads the command history recorded in the history file.

ここで着目すべきは3番目の処理です。

3. Reads the init file in your home directory and executes all the commands in that file.

ホームディレクトリにある初期化ファイルを読み込み、コマンドをすべて実行する、とあります。 まさしく、今回私は".gdbinit"をホームディレクトリに置いたので、この処理過程において実行されたというのであれば、納得がいきます。 あとは、".gdbinit"が初期化ファイルとしてgdbに認識されていればいい訳です。

初期化ファイルの定義について調べてみると、いくつか記述を見つけました。

2.1.3 What GDB Does During Startup
~
The GDB init files are normally called .gdbinit.

または、

2.1.2 Choosing Modes
~
~/.gdbinit
This is the init file in your home directory.

など。

ここまでわかってくれば、さすがに納得できます。

まとめると、
・gdb初期化処理は9つのステップが用意されている。
・そのうち3つ目のステップではホームディレクトリ直下の初期化ファイルが処理される。
・ホームディレクトリ直下の初期化ファイルは".gdbinit"という名前を持つことになっている。

ということになります。


Discussion

gdbをデフォルトでintel記法にする方法と、その仕組みを記録しました。

今回行った方法はホームディレクトリ直下に".gdbinit"を置くやり方ですが、面白いのはこれ以外にも8つの初期化ステップがgdbに用意されているということです。 Google検索でヒットする解決策が概ねひとつの方法に収束されている今回のような場合でも、ドキュメントを辿ってみるとそれ以外の多くのやり方が開発者から用意されている、というのはなかなか奥ゆかしいことです。

とはいえ、多くの方々が実践しているやり方というのが、最も効率的な方法である場合がほとんどでしょう。 効率性と好奇心のバランスを、上手いこと回すのが大切かもしれません。


  1. 逆アセンブル解析 - gdb | はじめてのリバースエンジニアリング#2 - 生物系がゼロから始めるIT技術も参考に。

  2. DotFiles - Debian WikiまたはDotfiles - ArchWikiなど

  3. 原文からここで不要と思われる部分をカットして載せています。

Linuxコマンドまとめ | 使用例とマニュアル

私が使ったLinuxコマンドを、一覧としてまとめていきます。

ネット上には良質なLinuxコマンドのまとめがたくさんありますが1、自分が覚えておきたいコマンドの一覧は、やはり自分で作るしかありません。

この記事は備忘録として使うので、これからも順次更新していきます。



基本コマンド

man

マニュアルを表示します。

使用例:

$ man ls

これでlsコマンドのマニュアルが表示されます。

詳しくは別途記事にしました。
www.bioerrorlog.work

manコマンドのマニュアル: man(1) - Arch manual pages


cd

ディレクトリを移動します。

使用例#1:

$ cd ./Desktop

"./"は相対パスで、カレントディレクトリを示します。
つまりこの例では、カレントディレクトリ直下にある"Desktop"ディレクトリに移動します。

使用例#2:

$ cd

引数を与えないと、ホームディレクトリに戻ります。

使用例#3:

$ cd ../

"../"は相対パスで、一つ上の親ディレクトリを示します。
よって"../"を引数に渡すと、一つ上のディレクトリに移動します。

使用例#4:

$ cd /

"/"を引数に渡すと、ルートディレクトリに移動します。

cdコマンドのマニュアル: cd(1p) - Arch manual pages


ls

ディレクトリに含まれるファイルを表示します。

使用例#1:

$ ls

これでカレントディレクトリにあるファイルが列挙されます。
カレントディレクトリ以外のファイルは、パスを引数に渡すことで調べることができます。

使用例#2:

$ ls -l

長いリスト形式でファイルが表示され、より多くの情報が得られます。
ここで得られるパーミッション情報については、別途記事にしました。
www.bioerrorlog.work

使用例#3:

$ ls -a

隠しファイルを含め、ディレクトリ下にあるすべてのファイルを表示します。

なお、上記のオプションは ls -la のように組み合わせることも可能です。

lsコマンドのマニュアル: ls(1) - Arch manual pages


cat

ファイルの中身を表示します。

使用例#1:

$ cat test.txt

カレントディレクトリ直下のファイル名(test.txt)を指定した場合、ファイルの中身が表示されます。
カレントディレクトリ以外のファイルは、パスを指定することで中身を見ることができます。

catコマンドのマニュアル: cat(1) - Arch manual pages


echo

文字列を表示します。

使用例:

$ echo Hello, Lain.
Hello, Lain.

文字列Hello, Lain.が出力されました。

echoコマンドのマニュアル: echo(1) - Arch manual pages


pwd

カレントディレクトリを表示します。

使用例:

$ pwd

例えば /home/user/Desktop のように、カレントディレクトリが表示されます。

pwdコマンドのマニュアル: pwd(1) - Arch manual pages


touch

新規ファイルを作成します。

使用例:

$ touch test.txt

これで、空のファイル"test.txt"が作成されます。

touchコマンドのマニュアル: touch(1) - Arch manual pages


mkdir

新規ディレクトリを作成します。

使用例:

$ mkdir testdir

これで、空のディレクトリ"testdir"が作成されます。

mkdirコマンドのマニュアル: mkdir(1) - Arch manual pages

rm

ファイルやディレクトリを削除します。

使用例#1:

$ rm test.txt

ファイル(test.txt)が削除されます。

使用例#2:

$ rm -r test
#testはディレクトリ

ディレクトリ(test)が削除されます。

rmコマンドのマニュアル: rm(1) - Arch manual pages


入出力制御

" | " パイプ

|の左側のコマンドの出力を、|の右側のコマンドの入力として渡します。

使用例:

$ man ls | grep all
       Sort entries alphabetically if none of -cftuvSUX nor --sort  is  speci‐
       -a, --all
       -A, --almost-all
              print the allocated size of each file, in blocks
       -X     sort alphabetically by entry extension
       Written by Richard M. Stallman and David MacKenzie.
       or available locally via: info '(coreutils) ls invocation'

man lsコマンドの結果を、grep allコマンドに渡したことで、lsコマンドマニュアルから"all"という文字列を含む列が検索されました。


" > " リダイレクト

>の左側の出力を、>の右側に渡します。

使用例:

$ echo Hello, Lain. > hello.txt
#hello.txt
Hello, Lain.

Hello, Lain.という文字列が、hello.txtファイルとして出力されました。


ファイル分析

file

ファイルの形式を表示します。

使用例:

$ file your_pass
your_pass: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=92e8f5e9bc90478dfdcb5fc4bd6c63f414ed2f6e, not stripped

"your_pass"という名前のファイルの形式が表示されました。 たとえば、実行ファイル形式ELF 64-bitであることなどがわかります。

fileコマンドのマニュアル: file(1) - Arch manual pages


tree

ディレクトリ内容を木構造で表示します。

使用例:

$ tree radare2
radare2
├── AUTHORS.md
├── autogen.sh
├── binr
│   ├── blob
│   │   ├── main.c
│   │   ├── Makefile
│   │   └── version.c
│   ├── Makefile
│   ├── preload
│   │   ├── alloc.c
│   │   ├── libr2.c
│   │   ├── Makefile
│   │   ├── trap-darwin-x86-32.asm
│   │   ├── trap-darwin-x86-64.asm
│   │   ├── trap-linux-x86-32.asm
│   │   └── trap-linux-x86-64.asm
│   ├── r2agent
│   │   ├── index.h
│   │   ├── Makefile
│   │   ├── meson.build
│   │   ├── r2agent
│   │   ├── r2agent.c
│   │   ├── r2agent.d
│   │   └── r2agent.o
│   ├── r2bb
│   │   ├── Makefile
│   │   └── r2bb.c
│   ├── r2pm
│   │   ├── meson.build
│   │   └── r2pm
#以下略

radare2ディレクトリの構造が視覚的に分かりやすく表示されました。

なお、デフォルトではインストールされていないので、自分でインストールする必要があります。

$ sudo apt install tree

treeコマンドのマニュアル: tree(1) - Arch manual pages


ファイル検索系

locate

ファイルを名前で検索します。

使用例:

$ locate gdbinit
/etc/gdb/gdbinit
/home/nori/.gdbinit
/usr/share/gdb/system-gdbinit
/usr/share/gdb/system-gdbinit/elinos.py
/usr/share/gdb/system-gdbinit/wrs-linux.py

"gdbinit"を含むファイルを検索し、その結果が出力されました。

※findコマンドとの違い:
locateはupdatedbによって予め作成されたデータベースから検索されます。 findはリアルタイムにファイルが検索されます。 個人的には、findコマンドの挙動がいまいち把握できていないので、locateコマンドを使っています。

locateコマンドのマニュアル: locate(1) - Arch manual pages


grep

与えたパターンにマッチした行を出力します。

使用例:

$ man ls | grep help
       --help display this help and exit
       GNU coreutils online help: <http://www.gnu.org/software/coreutils/>

lsコマンドのマニュアルのなかで、"help"という文字列がある行が2つ抽出されました。
あらゆるコマンドの後に| grep <key>と付け加えて検索できるので、大変重宝しています。

grepコマンドのマニュアル: grep(1) - Arch manual pages

whereis

コマンドのバイナリファイル、ソースファイル、マニュアルページファイルのパスを表示します。

使用例:

$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

lsコマンドを渡したことで、lsコマンドのバイナリファイルとマニュアルページファイルのパス
ls: /bin/ls /usr/share/man/man1/ls.1.gz
が表示されました。

whreisコマンドのマニュアル: whereis(1) - Arch manual pages


which

コマンドのパスを表示します。

使用例:

$ which ls
/bin/ls

whichコマンドのマニュアル: which(1) - Arch manual pages


OS関連

gnome-system-monitor | システムモニターの起動

システムモニター(Windowsのタスクマネージャーのようなもの)を起動します。

使用例:

$ gnome-system-monitor

システムモニターのヘルプ: System Monitor - GNOME Library


free

メモリの使用状況を表示します。

使用例#1:

$ free

freeコマンドを実行すると、次のようにメモリ使用量が表示されます。

              total        used        free      shared  buff/cache   available
Mem:        5934616      962216     3785240        3132     1187160     4686364
Swap:        969960           0      969960

メモリとスワップ領域について、使用中・未使用のメモリサイズが表示されます。

使用例#2:

$ free -h

"-h"オプションをつけると見やすくなります。

              total        used        free      shared  buff/cache   available
Mem:           5.7G        972M        3.4G        5.1M        1.3G        4.4G
Swap:          947M          0B        947M

freeコマンドのマニュアル: free(1) - Arch manual pages


df

ディスクの使用状況を表示します。

使用例:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           580M  1.8M  578M   1% /run
/dev/sda1        20G  7.3G   12G  40% /
tmpfs           2.9G  4.0K  2.9G   1% /dev/shm
~
#以下略


dfコマンドのマニュアル: df(1) -Arch manual pages


ps

処理しているプロセスの状況を表示します。

使用例#1:

$ ps
   PID TTY          TIME CMD
  1769 pts/0    00:00:00 bash
  4424 pts/0    00:00:00 ps

このPID, TTY, TIME, CMDは、psコマンドのマニュアルによると、

PID: the process ID (プロセスID)
TTY: the terminal associated with the process (プロセスを行っているターミナル)
TIME: the cumulated CPU time (累積CPU使用時間)
CMD: the executable name (実行コマンド)

(括弧内は私の意訳)
ということでした。

使用例#2:

$ ps aux

プロセスに関して、すべての情報が表示されます。

psコマンドのマニュアル: ps(1) - Arch manual pages

uname

OSの情報を表示します。

使用例:

$ uname -a
Linux my-virtual-machine 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

64bitなのか、32bitなのか等も、ここで表示されています。

unameコマンドのマニュアル: uname(1) - Arch manual pages


Web関連

curl

URLからデータを移行します。

使用例:

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"

Pythonのpipパッケージをインストールする際に行った操作。 URL"https://bootstrap.pypa.io/get-pip.py"のデータを取得し、"get-pip.py"として出力されました。

curlコマンドのマニュアル: curl(1) - Arch manual pages


  1. 例えばCore utilities - ArchWikiは、とてもお世話になっている記事です。

はじめてのC言語 | Linux環境構築 - vim

はじめてLinuxでC言語の初歩的なプログラミングをやったので、手順のノートを残します。

UbuntuにはもともとC言語が入っているので、 vimとgccをインストールすれば、
vimでテキストの作成、
gccでコンパイル、
ディレクトリの指定で実行、という手順で一連のプログラミングができるようになりました。



Introduction

Linuxを入れたばかり1だと、そもそもテキストファイルをどうやって作成するのか、どうやってプログラミングをすればよいのか、いまいちわかりません。

もちろん、Linuxでも好みのエディタを導入してプログラミングできると思いますが、今回はターミナルで完結する簡単な環境構築手順を記録します。


Results

vimのインストール

まずはテキストエディタvimをインストールします。 インストールする前に、とりあえずターミナルにvimについて聞いてみます。

$ vim
Command 'vim' not found, but can be installed with:

sudo apt install vim       
sudo apt install vim-gtk3  
sudo apt install vim-tiny  
sudo apt install neovim    
sudo apt install vim-athena
sudo apt install vim-gtk   
sudo apt install vim-nox  

vimのインストール方法を教えてくれました。 さっそくインストールします。

$ sudo apt install vim     

これでvimのインストールが完了です

vimでテキストの編集

vimを使ってC言語用の".c"ファイルを作成します。

$ vim test.c

このようにすると、test.cファイルのvimエディット画面に移行します。
vimのエディット画面は、いくらか慣れない挙動でした。

まず、"i"を押すことで"-- INSERT --"モードになり、普通に文字を編集することができます。
例えば、次のようにしてコードを書きます。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Hello, Lain.\n");
    return 0;
}

ごちゃごちゃと文字を書きましたが、とりあえずはprintf("Hello, Lain.\n");によって文字列”Hello, Lain.”が出力される、ということでよしとします。

書き終わったら、”Esc”を押して"-- INSERT --"モードを終了します。
この状態で":"を押すと、オプションを受けつけるようになります。
例えば、

:wで保存、
:qでvimの終了、
:wqと組み合わせると保存して終了、です。

他にも色々あるのでしょうが、今はこれがあれば十分でしょう。

ちなみに作成したファイルは、ターミナル上で削除できます。

$ rm test.c

これで先ほど作成したtest.cファイルが削除されました。

gccでコンパイルする

C言語で書かれたソースファイルは、コンパイルして実行ファイルを生成する必要があります。
gccは、そのコンパイラの一つです。 マニュアルを読む2と、

~
NAME
       gcc - GNU project C and C++ compiler
~

CとC++のコンパイラであることがわかります。 ちなみにこのgccマニュアルは、様々な拡張子の解説なども載っていて、なかなかに趣深いものでした。

vimと同じように、まずはインストールします。

$ sudo apt install gcc

インストールが完了したら、さっそく先程作成したtest.cをコンパイルします。

$ gcc test.c -o test

これは、test.cをコンパイルして、testという実行ファイルを作成する、というコマンドになります。
これで、コンパイル完了です。

ファイルの実行

ファイルを実行するには、実行ファイルのディレクトリをターミナルに打ち込みます。

$ ./test
Hello, Lain.

記念すべきはじめての文字列が表示されました。

ちなみに今回のtestファイルでは意味がありませんが、実行時に引数を与えることで、

$ ./test arg

testの実行時に引数argを渡して実行させることができます。

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

今回、vimやgccをインストールしましたが、このパッケージをアンインストールする方法を記しておきます。

インストール時に使用したaptコマンドのマニュアルを読みます。

~
           Removing a package removes all packaged data, but leaves usually small
           (modified) user configuration files behind, in case the remove was an
           accident. Just issuing an installation request for the accidentally removed
           package will restore its function as before in that case. On the other hand
           you can get rid of these leftovers by calling purge even on already removed
           packages. Note that this does not affect any data or configuration stored in
           your home directory.
~

removeはユーザーの設定ファイルを残してアンインストールするのに対し、purgeはすべてのファイルをアンインストールするようです。
使い方はそれぞれ次の通り。

$ sudo apt remove vim
$ sudo apt purge vim


Discussion

C言語でプログラミングするための簡単な環境構築、実行する手順を記録しました。

ここ最近はターミナル上のコマンドを使っていろいろと遊んでいましたが、いよいよプログラミング関係もやっていきたいと思っています。

気になるのは、やはりコンパイル後の実行ファイルに何が書かれているのか、という類のことです。

どうやってプログラミングするのか、という情報はたくさん目にしますが、どうやってプログラミングされているのか、という情報はあまり御目にかかれません。
LiveOverflow氏のバイナリハッキング動画3などを参考にしながら、そういう方向の理解を進めていきたいと思います。

manコマンドを理解する | Linuxコマンド

manコマンドについて、ノートを残します。

manコマンドを使えば、マニュアルを表示させることができます。
使い方の例

$ man ls

これでlsコマンドのマニュアルが表示されます。

また、セクションの指定をすることによって複数種類のマニュアルを読むこともできます。



Introduction

manコマンドは、一番使う最重要コマンドです。
これさえあれば、コマンドの使い方がわからなくてもマニュアルを調べることができます。

もちろん、googleで検索すればコマンドの使い方を解説する記事など溢れるほど出てきますが、やはり偉大な製作陣の手によるマニュアルが一番情報量が多く正確です。
また、著者が有名人ばかりなのも面白い。 lsコマンドのマニュアルで"Richard M. Stallman"に遭遇した時は興奮してしまいました。


Results

manのマニュアルを読む

まずはmanコマンド自身のマニュアルを読んでみます。

$ man man
~
DESCRIPTION
       man is the system's manual pager.  Each page argument given to man is
       normally the name of a program, utility or function.  The manual page
       associated with each of these arguments is then found and  displayed.
~

プログラムやユーティリティ、関数の名前などをmanに渡せば、関連するマニュアルページを表示してくれるそうです。
マニュアルは"q"を押せば終了されます。

例えばlsのマニュアルを表示するには、

$ man ls

とすれば、lsについてのマニュアルが表示されます。

LS(1)                           User Commands                          LS(1)

NAME
       ls - list directory contents
~

さて、ここで面白いのがこのマニュアル、よく見ると最初の行にLS(1)とあります。
(1)があるのなら、(2)など他のものもあるのでしょうか。 気になります。

マニュアルのセクションを指定できる

調べてみると、どうやらこのLS(1)の(1)は、セクションを示しているようです。 再びmanのマニュアルを読み進めます。

~
       A  section, if provided, will direct man to look only in that section
       of the manual.  
~
EXAMPLES
~
       man man.7
           Display the manual page for macro package man from section 7.
~

セクションを指定してmanを実行すれば、そのセクションのマニュアルが表示される、ということです。
上の例man man.7では、manコマンドのマニュアルの、セクション7を指定しています。

そしてこのセクション、1から9までそれぞれ内容が決まっているようです。
manマニュアルにその内容が記載されています。

~
       1   Executable programs or shell commands
       2   System calls (functions provided by the kernel)
       3   Library calls (functions within program libraries)
       4   Special files (usually found in /dev)
       5   File formats and conventions eg /etc/passwd
       6   Games
       7   Miscellaneous  (including  macro  packages and conventions), e.g.
           man(7), groff(7)
       8   System administration commands (usually only for root)
       9   Kernel routines [Non standard]
~

この中では、1: シェルコマンドについてのマニュアルしか今は読んだことがないのですが、他にもたくさん面白そうなものがあります。
6: Gamesなんてものもあって驚きました。

ところで、それぞれのマニュアルにセクションが1から9まですべて存在しているわけではありません。
1から9までのうち、必要な内容に即したセクションが存在しています。

したがって、マニュアルのどのセクションが存在しているのか、検索できると便利です。

マニュアルを検索できる | man -k

manコマンドには、マニュアルを検索する便利なオプション"-k"があります。
manマニュアルより、

       man -k printf
           Search  the short descriptions and manual page names for the key‐
           word printf  as  regular  expression.   Print  out  any  matches.

オプション"-k"を渡せば、検索してマッチしたものを表示してくれるそうです。

ちなみにこの例ではman -k printfで"printf"のマニュアルを検索しています。
"printf"の検索結果は"printf (1)"一つのみですが、複数のセクションを持ったものを検索すれば、ターミナル上に複数表示されるわけです。


Discussion

manコマンドの使い方を記録しました。

manコマンドにはお世話になっております。
思わぬ記述やオプションが見つかった時など、大層満たされた気持ちになります。

とはいえ、英語の記述を素早く読めるかといいますと、なかなかそうはいきません。
昔だれかが、最も重要なプログラミング言語は英語である、と言っていたのを思い出しました。
実際、wikipediaなどのネット上の情報も、日本語ページより英語ページの方が圧倒的に情報量が多いことがほとんど。
なるべく早く、英語にも慣れていきたいものです。

パーミッションを理解する | [ ls -l ] Linuxコマンド

パーミッションとは、ファイルやディレクトリへの操作権限のことです。
今回、Linuxでのパーミッションの調べ方を記録しました。


Introduction

前回の記事1では、書き込みが許されていないディレクトリ"/etc/profile.d"に遭遇し、パーミッションという概念を思い知らされました。
パーミッションのことを知っておかなければ、Linuxの中を自由に探索することができません。

そこで今回は、パーミッションとは何か、どうやって調べるのかを記録しました。


Results

パーミッションとは

パーミッションとは、Archwikiによると2

File systems use permissions and attributes to regulate the level of interaction that system processes can have with files and directories.

つまり、ファイルに対する操作権限を制御するもの、だそうです。

例えば、前回私はOS起動時の自動操作を設定するため、"/etc/profile.d"ディレクトリに新しくファイルを追加しようとしました。
しかし、その時表示されたエラーは、

E212: Can't open file for writing

つまり、あなたはファイルに書き込めませんよ、と言われてしまったわけです。
このように、読み込みや書き込みの権限は、ファイルごとに決まっています。
これがパーミッションです。


パーミッションの調べ方 | ls -l

次に、どうすればパーミッションを見ることができるのかを調べました。
すると、どうやらlsコマンドのオプション-lでパーミッションを見れるようです。

それでは"/etc/profile.d"ディレクトリのパーミッションを確認してみます。

/etc$ ls -l
~
drwxr-xr-x  2 root root    4096 Jan 15 22:33 profile.d
~

とても面白そうな文字列が表示されましたが、何を意味しているのかさっぱりわかりません。
lsコマンドのマニュアル3から、" -l "オプションで表示される情報を調べました。

If the -l option is specified, the following information shall be written for files other than character special and block special files:
"%s %u %s %s %u %s %s\n", [file mode], [number of links], [owner name], [group name], [size], [date and time], [pathname]

つまり、ls -lコマンドを実行すると、左から順に
[ファイルモード]、[リンク数]、[オーナー名]、[グループ名]、[サイズ]、[日時]、[パス名]
が表示されるということです。

ここで着目すべきは「ファイルモード」と「オーナー名」、「グループ名」です。
「ファイルのモード」は、最初の文字列 "drwxr-xr-x" のことで、まさしくファイルに対する操作権限を示しています。
"drwxr-xr-x"の文字列は、4つに分けて捉えます。

d / rwx / r-x / r-x

これらは左から順に、
ファイル種類 / オーナーの権限 / グループの権限 / その他ユーザーの権限
を示しています。
一番左の"ファイル種類"は今はあまり重要ではありません。"d"とあればディレクトリ、"-"とあれば普通のファイルだそうです。

大事なのは3つの"rwx"の文字列です。
"r"は読み込み、
"w"は書き込み、
"x"は実行、の権限を示しています。

例えば
"rwx"は読み込み、書き込み、実行のすべてが許可されていることを意味し、
"r-x"では書き込みが許可されていません。
この権限がオーナー、グループ、その他ユーザーに割り当てられています。

オーナーとグループの定義は
drwxr-xr-x 2 root root 4096 Jan 15 22:33 profile.d
この左から3、4つ目のかたまりがそれぞれ[オーナー名]、[グループ名]を定義しています。 この場合は、オーナーが"root"、グループが"root"グループということなので、許可されている権限は、

"root" : rwx
"root"グループ : r-x
その他ユーザー : r-x

ということになります。
つまり、書き込み"w"が許可されているのは"root"権限のみであるわけです。

もしもこのディレクトリに書き込みを行いたいのであれば、
$ sudo vim XXX.txt
のように、sudoコマンドでroot権限を取得する必要があります。


Discussion

今回は、ls -lコマンドによるパーミッションの調べ方を記録しました。

Linuxの中のファイルを探索して回るときには、私はよくls -lを使用するので、パーミッションに目を向けてみるのも面白そうです。

また、このパーミッションですが、どうやら変更させることもできるようです。
気が向いたときにもっと深くまで遊んでみたいと思います。

Ubuntuディスプレイ解像度をデフォルトで1920x1080にする

Ubuntuのディスプレイ解像度の変更を、OS起動時のデフォルト設定にする方法を記録します。

結論から言うと、"/etc/profile.d"ディレクトリ下に、拡張子".sh"を持つファイルをroot権限で作成し、

xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
xrandr --addmode Virtual1 1920x1080_60.00

この2行のコマンドを書き込む。
そして、一回目だけ手動で1920x1080解像度を設定すれば、次から自動的に1920x1080に設定されるようになりました。

この初期化処理に必要な"/etc/profile.d"ディレクトリの役割から、詳しく解析していきます。



Introduction

Ubuntuをインストールした直後はデフォルトのディスプレイ解像度が小さく、使い勝手がよくありませんでした。
そこで前回は、ディスプレイ解像度を変更するやり方を記録しました1
しかし、これだけの操作ではシャットダウンによって変更がリセットされてしまいます。

そこで今回は、シャットダウンした後も同じディスプレイ解像度を持続させる方法を探りました。


Results

"profile"ファイルの解析

シャットダウン後もディスプレイ解像度を持続させるというのは、つまりOS起動時にディスプレイ解像度を自動的に変更させればよいでしょう。

OS起動時の自動化について少し調べると、どうやら"profile"というファイルがカギとなるみたいです。
早速whereisコマンドをつかって"profile"ファイルを探します。

$ whereis profile

profile: /etc/profile.d /etc/profile

どうやらprofileと名のつくファイルが2つ"/etc"ディレクトリにあるようです。
cdコマンドを使って"/etc"ディレクトリに行き、
catコマンドを使ってファイルの中身を見てみます。

$ cd /etc
/etc$ cat profile.d
cat: profile.d: Is a directory

"profile.d"はファイルではなくディレクトリですよと怒られてしまいました。
ここで".d"という拡張子はディレクトリを意味するのかと思って検索してみましたが、D言語のソースコードであるという解説が多く、いまいち要領を得ません。

ここではあまり気にせず、"profile.d"ディレクトリに入って"ls"コマンドでディレクトリの中身を見てみます。

/etc$ cd ./profile
/etc/profile.d$ ls
01-locale-fix.sh  bash_completion.sh     input-method-config.sh  xdg_dirs_desktop_session.sh
apps-bin-path.sh  cedilla-portuguese.sh  vte-2.91.sh

なにやら面白そうなファイルがたくさんいらっしゃいます。
まず目についたのは、どのファイルも".sh"の拡張子を持っていることです。
反射的にマニュアルを見てみました。

$ man sh

~
NAME
     dash — command interpreter (shell)
~

dashというコマンドのマニュアルが表示されてしまいました。
今調べている".sh"拡張子についての情報は得られないだろうと思ってこのマニュアルを流し読みしていると、予想外にもここで"profile"についての記述を見つけました。

~
     A login shell first reads commands from the files /etc/profile and .profile if they exist.
     If the environment variable ENV is set on entry to an interactive shell, or is set in the
     .profile of a login shell, the shell next reads commands from the file named in ENV. 
~

これによるとログイン後に、先程見つけた"/etc/profile"と、”.profile”というファイルが読み込まれ、コマンドが実行されるようです。

".profile"もすごく興味深いですが、ひとまず"/etc/profile"の解析に移ります。

$ cd /etc
/etc$ cat profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

すごそうな文字列が表示されました。
意味のわかりそうなところから読んでいきます。

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
~

システムワイドな".profile"、とはどういう意味でしょうか。 ".profile"より広域に作用を及ぼせるのでしょうか。
よくわかりません。
先を読み進めます。

~
if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

こいつは大変おもしろい記述です。
先程探索した"/etc/profile.d"について、
for i in /etc/profile.d/*.sh; do
つまりファイル名の最後に".sh"のつくファイルを順番に"do"する、という意味でしょう。
確かに、"/etc/profile.d"に入っているファイルはすべて".sh"がついていました。

だんだんと各profileファイルの機能が明らかになってきました。
一度、整理します。

"/etc/profile" :
 ログイン後に読まれる。
 "/etc/profile.d"に入っている".sh"のつくファイルを実行する。

"/etc/profile.d" :
 ".sh"のつくファイルが入っている。

".profile" :
 ログイン後に読まれる。


"/etc/profile.d"に新しい".sh"ファイルを置く

ここまでの結果から考えると、"/etc/profile.d"に新しく自分で書いた".sh"ファイルを置いておけば、そこに記述されたコマンドがログイン後に実行される、ということが期待できます。

ファイルを作るためには、"vim"というテキストエディタを使いました。
インストールされていない場合は、$ sudo apt install vimでインストールできます。
vimの使い方についてはそのうち備忘録を書く予定です。

さっそくvimをつかって、"/etc/profile.d"ディレクトリに".sh"ファイルを作成してみます。

$ cd /etc/profile.d
/etc/profile.d$ vim test.sh

しかし、ここで問題が発生しました。
"test.sh"というファイルをvimで作成し、"/etc/profile.d"ディレクトリの中に保存しようとしたのですが、エラーを吐かれてしましました。

"test.sh" E212: Can't open file for writing

これは由々しき問題です。 ファイルの書き込みはできない、と怒られてしまったわけです。
これでは"/etc/profile.d"ディレクトリの中に独自の".sh"ファイルを作成する、という戦術が成り立ちません。

ここでしばらく解決策を模索していると、面白い概念を発見しました。
"パーミッション"という考え方です。

Archwikiによると2

File systems use permissions and attributes to regulate the level of interaction that system processes can have with files and directories.

ファイルやディレクトリは、やり取りできるレベルが"パーミッション"によって制御されているそうです。
どのようにしてパーミッションを調べられるのかについてここで書くとあまりに長くなってしまうので、それは別の機会に詳述しようと思います3

ところで、先程書き込みができなかった"/etc/profile.d"ディレクトリですが、このパーミッションを調べてみると、書き込みが許可されているのは"root"のみとなっていました。

つまり、"root"の権限を持ってすれば、"/etc/profile.d"ディレクトリに書き込みができそうです。

sudoコマンドを用いて、root権限のもとでファイルを作成してみます。

/etc/profile.d$ sudo vim my_commands.sh

すると、見事この"my_commands.sh"というファイルを"/etc/profile.d"ディレクトリに作成することができました。


コマンドを".sh"ファイルに書き込む

あとは、"/etc/profile.d"ディレクトリに作成した".sh"ファイルに、自分が実行させたいコマンドを書き込めば、うまくいくはずです。

ディスプレイ解像度を変更するコマンドは、前回の記事4で判明しました。
先程"/etc/profile.d"ディレクトリに作成した"my_commands.sh"に、それらのコマンドを書き込んでいきます。

xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
xrandr --addmode Virtual1 1920x1080_60.00
xrandr --output Virtual1 --mode 1920x1080_60.00

しかし、これで再起動しても、なぜか解像度は1920x1080にはなりません。私の場合、再起動直前に設定していた1680x1050になってしまいました。

いろいろと試行錯誤をして、わかったことがいくつかあります。

まず、ディスプレイ解像度が1920x1080になっていなくとも、設定の中に1920x1080は追加されているということ。
ここで、シャットダウン前に解像度を1920x1080に設定しておくと、再起動後も1920x1080になるということ。
そのためには、コマンド3行目xrandr --output Virtual1 --mode 1920x1080_60.00は必要ないということ。

つまり、一度手動で解像度1920x1080にしてしまえば、"my_commands.sh"に書き込むコマンドは、

xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
xrandr --addmode Virtual1 1920x1080_60.00

この2行のみで、自動的に解像度が1920x1080に設定されるようになる、ということがわかりました。


Discussion

今回、OS起動後に自動的に解像度1920x1080が設定される方法を記録しました。

しかし、正直クールな解決方法とは言い難いです。
解像度の出力を変更するコマンド
xrandr --output Virtual1 --mode 1920x1080_60.00
が機能せず、一度手動で解像度を変更する必要があったからです。
なんで機能しなかったんでしょうか。 気が向いたときに追求することにします。

ところで、、"/etc/profile.d"に入っていたほかの.shファイルや、".profile"はどんな操作を実行しているのでしょうか。 書き換えても問題ないものなのでしょうか。
きっと問題があるからrootしか書き込みが許可されていないのでしょうね。 いじってみるのも面白そうです。

しかし、こうしてUbuntuをいじり倒しているうちに、段々とコマンドの使い方を覚えてきました。 忘れないためにも、そのうち記録を残したいと思っています。


See also

www.bioerrorlog.work

www.bioerrorlog.work

Ubuntuディスプレイ解像度の変更 | 1920x1080

Ubuntuは、デフォルトで1920x1080の解像度が設定できませんでした。
好きな解像度を設定する手順を記録します。

結論を言うと、次のコマンドの実行で1920x1080の解像度になりました。

$ xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
$ xrandr --addmode Virtual1 1920x1080_60.00
$ xrandr --output Virtual1 --mode 1920x1080_60.00

これらそれぞれのコマンドの処理を読み解いていきます。



Introduction

前回、Ubuntuをはじめてインストールしました1

しかし、ウィンドウの大きさがすごく小さく、使い勝手がよろしくありません。 解像度をディスプレイに合わせる操作など簡単かに思えましたが、コマンド操作に慣れていなかったこともあり、なかなか手間取りました。
わかった手順を記録しておきます。


Results

既存の解像度に設定する

コマンド操作を使わずとも、ディスプレイ解像度を変更することはできます。
左上の「Activities」から「Displays」を検索

「Resolusion」から好きな解像度を選択
ここで少し手間取ったのは、インストール時のデフォルト解像度ではウィンドウ右上にある「Apply」ボタンがウィンドウ外に見切れていたため、変更を適応できなかったことです。落ち着いてDisplaysウィンドウを視野内に移動させれば「Apply」ボタンをクリックできます。

しかし、この既存の解像度の中には1920x1080がありませんでした。 とりあえず1680x1050などに設定しておいて、1920x1080を設定する方法を探りました。

すると、どうやら二段階の手順で新しい解像度を追加できるようです。
1つめは、追加したい解像度のパラメータを取得すること。
2つめは、取得したパラメータを使って、設定に新しい解像度を追加すること、です。

新しい解像度のパラメータを取得する | cvt

cvt というコマンドを使えば、ディスプレイ解像度を設定するための諸々のパラメータを取得できるようです。
さっそくcvtのマニュアルを読んでみます。

$ man cvt
~
NAME
       cvt - calculate VESA CVT mode lines

SYNOPSIS
       cvt [-v|--verbose] [-r|--reduced] h-resolution v-resolution [refresh]

DESCRIPTION
       Cvt  is  a utility for calculating VESA Coordinated Video Timing modes.
       Given the desired  horizontal  and  vertical  resolutions,  a  modeline
       adhering  to the CVT standard is printed. This modeline can be included
       in Xorg xorg.conf(5)
~

どうやら好みの解像度を渡してあげることで "VESA Coordinated Video Timing modes" なるものを表示してくれるようです。
しかし、私は"VESA Coordinated Video Timing modes"など全く知りませんので、調べてみます。

まずは"VESA"について、wikipedia曰く2

VESA (/ˈviːsə/), formally known as Video Electronics Standards Association, is a technical standards organization for computer display standards. The organization was incorporated in California in July 1989[1] and has its office in San Jose, California. It claims a membership of over 225 companies.

ディスプレイについて、歴史の長い標準化団体といった感じでしょう。

続いて"Coordinated Video Timing (CVT)"について調べると3

Coordinated Video Timings (CVT; VESA-2013-3 v1.2[1]) is a standard by VESA which defines the timings of the component video signal. Initially intended for use by computer monitors and video cards, the standard made its way into consumer televisions.
The parameters defined by standard include horizontal blanking and vertical blanking intervals, horizontal frequency and vertical frequency (collectively, pixel clock rate or video signal bandwidth), and horizontal/vertical sync polarity.

ディスプレイ表示用のシグナルを送るタイミングを制御するパラメータ、みたいなものだそうですが、私はハード面についても詳しくないので、よくわかりません。
あまり深堀せずに先へ行きます。

それではcvtに1920x1080を渡します。

$ cvt 1920 1080
# 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync

何やら面白そうな文字列がたくさん出てきました。
"Hz", "Modeline", "hsync", "vsync"など、さっきwikipediaで見たような文字列が複数登場しているところを見るに、ちゃんとあるべきパラメータを出力してくれたみたいです。

次は、このパラメータを使って1920x1080解像度を設定に追加します。

取得したパラメータを使って解像度を追加する | xrandr

設定に解像度を追加するには、xrandrコマンドを使うようです。
マニュアルを読みます。

$ man xrandr
~
DESCRIPTION
       Xrandr is used to set the size, orientation and/or  reflection  of  the
       outputs for a screen. It can also set the screen size.
~

まさしく、スクリーン出力をセットするコマンドみたいです。
早速使っていきます。

$ xrandr
Screen 0: minimum 1 x 1, current 1680 x 1050, maximum 8192 x 8192
Virtual1 connected primary 1680x1050+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   800x600       60.00 +  60.32
   2560x1600     59.99
   1920x1440     60.00
   1856x1392     60.00
   1792x1344     60.00
   1920x1200     59.88
   1600x1200     60.00
   1680x1050     59.95*
   1400x1050     59.98
   1280x1024     60.02
   1440x900      59.89
   1280x960      60.00
   1360x768      60.02
   1280x800      59.81
   1152x864      75.00
   1280x768      59.87
   1024x768      60.00
   640x480       59.94
Virtual2 disconnected (normal left inverted right x axis y axis)
Virtual3 disconnected (normal left inverted right x axis y axis)
Virtual4 disconnected (normal left inverted right x axis y axis)
Virtual5 disconnected (normal left inverted right x axis y axis)
Virtual6 disconnected (normal left inverted right x axis y axis)
Virtual7 disconnected (normal left inverted right x axis y axis)
Virtual8 disconnected (normal left inverted right x axis y axis)

いまは "Virtual1" というディスプレイが接続されているようです。 仮想環境でUbuntuを起動しているため、このような名前なのでしょう。
そして、"Virtual1"の解像度の中に1920x1080がないことがわかります。

ちなみにディスプレイは潜在的に "Virtual8" までありますね。 8枚まではディスプレイを増やせるということでしょうか。

それでは"Virtual1"に1920x1080を追加します。 このあたりの流れはArchWikiのxrandr解説4を参考にしました。

$ xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync

ここの--newmodeのあとの長々しい文字列は、先程のcvtコマンド出力を貼り付けただけです。
このコマンドを実行した後、再びxrandrを実行すると、

$ xrandr
~
Virtual6 disconnected (normal left inverted right x axis y axis)
Virtual7 disconnected (normal left inverted right x axis y axis)
Virtual8 disconnected (normal left inverted right x axis y axis)
  1920x1080_60.00 (0x288) 173.000MHz -HSync +VSync
        h: width  1920 start 2048 end 2248 total 2576 skew    0 clock  67.16KHz
        v: height 1080 start 1083 end 1088 total 1120           clock  59.96Hz

最後尾に解像度1920x1080が追加されています。

それでは、この1920x1080を"Virtual1"に追加します。

$ xrandr --addmode Virtual1 1920x1080_60.00

このコマンドを実行すると、一旦解像度がデフォルトの小さいサイズに変わりますが、焦る必要はありません。
xrandrコマンドで確認します。

$ xrandr
Screen 0: minimum 1 x 1, current 800 x 600, maximum 8192 x 8192
Virtual1 connected primary 800x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   800x600       60.00*+  60.32
   2560x1600     59.99
   1920x1440     60.00
   1856x1392     60.00
   1792x1344     60.00
   1920x1200     59.88
   1600x1200     60.00
   1680x1050     59.95
   1400x1050     59.98
   1280x1024     60.02
   1440x900      59.89
   1280x960      60.00
   1360x768      60.02
   1280x800      59.81
   1152x864      75.00
   1280x768      59.87
   1024x768      60.00
   640x480       59.94
   1920x1080_60.00  59.96
Virtual2 disconnected (normal left inverted right x axis y axis)
Virtual3 disconnected (normal left inverted right x axis y axis)
~

見事、"Virtual1"に解像度1920x1080が追加されました。

あとは1920x1080を選択してやれば良いだけです。
最初にやったように、
左上の「Activities」から「Displays」を検索

「Resolusion」から1920x1080を選択
で完了です。

あるいはコマンドからも設定できるようです。

$ xrandr --output Virtual1 --mode 1920x1080_60.00

フルスクリーン表示に切り替えれば、画面ぴったりでUbuntuが使えます。


Discussion

今回は、Ubuntuにおける解像度の設定方法を記録しました。

しかし、今回のやり方は注意が必要で、単純に今回の手順を繰り返すだけだと、一度シャットダウンした時にリセットされてしまいます。
シャットダウンしても解像度が維持されるやり方があるので、後日記録します5

なお本題とは関係ありませんが、$ xrandrの出力結果は大変面白そうな香りがしました。
出力をよく見てみると、
Screen 0: minimum 1 x 1, current 800 x 600, maximum 8192 x 8192
とあります。

ここで、maximum 8192 x 8192はまだわかります。
しかし、minimum 1 x 1とは一体どういうことでしょうか。
1x1のディスプレイを設定してしまったら、この先どうやって生きていけばよいのでしょう。

ぜひ試してみたいです。


See also

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

Windowsの上にUbuntuをインストールする | 仮想環境構築

Windows上にVMwareで仮想環境を構築し、Linux(Ubuntu)をインストールしました。



Introduction

Linuxなるものを使ってみたいと思い立ちました。
普段はWindowsかMacをつかっているので、OSごとの違いにも興味があります1

そこで、LiveOverflow氏の動画2を参考にしながら、数あるLinuxディストリビューションのひとつ"Ubuntu"を、仮想環境でインストールしました。


Results

Linuxのいいところ

まず、LinuxのいいところはOSがどう動いていているのかを理解しやすいことです。
WindowsやMacでは、技術的な部分を理解するのが難しい。例えば、Linuxではカーネルのソースコード見ることができますが、WindowsやMacはできません。
しかし、当然私はカーネルが何なのかよく理解してませんので、このメリットを実感するのはいつになるやら。

もう一つのいいところは、LiveOverflow氏曰く、
"It will be cool to learn something new."
いや本当におっしゃるとおり。
理由はこれだけで十分です。

どのLinuxを選ぶか

Linuxはオープンソースで配布されているOSです。 多様なディストリビューション(配布形態)が世に出回ってます。

Kali Linux:
たくさんの侵入テスト用ツールがあらかじめインストールされているLinuxディストリビューション。システムの仕組みを理解するのには面白そうだけど、初心者にはちょっと怖い。

Ubuntu:
標準的なデスクトップとしていい感じのLinuxディストリビューション。初心者にもいい感じ。

Debian:
Webサイトのサーバーとしてよく使われるらしい。その道の人には有名なLinuxディストリビューション。

Red Hat Enterprise Linux:
サポートサービス付きのLinuxディストリビューション。保証が必要な企業には魅力的。たぶん有料。

Archlinux:
これを使えば、自分でLinuxを構築できるらしい。いつか自分で作ることができたら最高に楽しそう。

今回はここで深掘りはせず、LiveOverflow氏にしたがって、初心者である私にも使いやすいUbuntuを選びました。

VMwareで仮想環境を作れる

仮想環境とは、コンピュータの中にもう一つコンピュータを作るようなものです。私のWindowsの上で仮想環境を作れば、別のOSを走らせることができます。
ライオンのいる檻の中にもう一つ小さな檻を作り、そこでトラを飼う、というイメージでしょうか。

この仮想環境を構築してくれる便利なソフトの一つがVMware3です。無償版の"VMware Workstation Player"4をダウンロード、インストールしました。
ちなみにMacの場合はVMwareは有料なので、Virtual Boxがおすすめだそうです。


Ubuntuを仮想環境上で起動

VMwareによって仮想環境を構築、その上でUbuntuを起動していきます。
まずはVMwareを起動して仮想環境を構築します。

「新規仮想マシンの作成(N)」

「後でOSをインストール(S)」

インストールするOSの選択。

「仮想マシン名(V)」、「場所(L)」ともにデフォルト。

そのまま「次へ」

「完了」
これでOSの入っていない仮想環境が構築されました。

つぎに、この仮想環境上で走らせたいOSをダウンロードします。 今回はUbuntuのLTSバージョンをダウンロードしました。LTSとはLong Term Supportのことで、長期的にサポートされる安定版のことです。
"ubuntu-18.04.1-desktop-amd64.iso"というファイルがダウンロードされました。

ここでこのファイル名、よく見てみると" .iso "という謎の拡張子がついています。ファイル種類は"ISO Image File"です。聞いたこともありません。
wikipediaで調べてみると5

ISOイメージは、国際標準化機構 (ISO) の定義した形式の光ディスク用アーカイブファイル(ディスクイメージ)。このフォーマットは多くのソフトウェアベンダーがサポートしている。ISOイメージファイルの拡張子は .iso とされることが多い。ISO と呼ばれるのは、CD-ROM媒体で使われる ISO 9660 ファイルシステム に由来するが、ISO 9660 を拡張し互換性を保持しているUDFファイルシステムもISOイメージに格納できる。

つまり、CDみたいなディスクのためのデータフォーマット、ということでしょうか。確かにこれは合点がいきます。
LinuxのようなOSを、仮想環境ではなく普通のコンピュータ(例えば自作PC)にインストールするとき、OSデータの入ったCDを挿入して起動する、と聞いたことがあります。
今回私は仮想環境という名の新しいコンピュータにOSをインストールしようとしてますが、ここでも同じことをしようとしているわけでしょう。つまりCDのかわりにISOファイルを仮想環境に挿入し、OSを起動させるわけです。
手順は次の通り。

「仮想マシン設定の編集(D)」

「ハードウェア」タブの「CD/DVD(SATA)」

「接続」欄の「ISOイメージファイルを使用する(M):」を選択し、「参照」からダウンロードしたUbuntuのISOファイルを指定して「OK」。
これでISOファイルが仮想環境に挿入されたことになります。

これで「仮想マシンの再生(L)」を押せば、挿入したISOファイルをもとにしてUbuntuが起動しました。

Ubuntuを仮想環境上にインストールする

一回目の起動時に、Ubuntuを仮想環境にインストールします。
一回目の起動では、ISOファイルを仮想環境に挿入し、それをもとにして起動しています。このISOファイルに書かれたUbuntuを仮想環境にインストールすることで、次回からは挿入したISOファイルではなく、仮想環境そのものからUbuntuを起動することができる、ということなのでしょう。

一回目の起動時に立ち上がるUbuntuのウィンドウで、「Install Ubuntu」を選びます。
このときは好みで言語が選べます。日本語もあります。

数々の設定。言語とキーボードの指定以外は気にせずデフォルトでよいです。

インストールが終わったら再起動します。ここで「今すぐ再起動する」を押した後に、仮想マシン起動設定を変更します。あるいは再起動ではなく仮想マシンを終了(ウィンドウを閉じる)してから変更し、起動しても大丈夫でした。先ほど 「ISOイメージファイルを使用する(M):」からISOファイルを指定しましたが、今度はそれを元に戻します。たったいま仮想環境にUbuntuをインストールしたので、次回からは仮想環境の物理ドライブからUbuntuを起動できるわけです。

VMwareウィンドウ右上のツールバーから、CD/DVDのマークを右クリック
(あるいは先ほどと同じく「仮想マシン設定の編集(D)」)

「設定」

「ハードウェア」タブの「CD/DVD(SATA)」

「物理ドライブを使用する」(自動検出)を選択

一度シャットダウンした場合は「仮想マシンの再生(L)」で起動します。この状態で起動が成功すれば、ついに仮想環境へのUbuntuインストールが完了。これで存分に遊べます。

Discussion

今回、Windows上に仮想環境を構築し、Ubuntuをインストールすることに成功しました。
仮想環境というのは面白いもので、恐らくぶっ壊してしまってもまた作り直せばいいだけです。なんでもできます。LiveOverflow氏も言ってましたが、そのような性質もあってセキュリティ関連の操作ではよく仮想環境が使われるのだそうです。

それにしても、LiveOverflow氏の動画は本当に面白い。私のように完全な独学でやろうとしている人種にとって、彼のような動画は本当にありがたいものです。

現代のインターネット社会に感謝します。