OSS-DB Silverのための環境構築 #2/5_事前準備1-CentOS7上にPostgreSQLを操作するユーザーアカウントを作成

#はじめに

OSS-DB Silverの学習のために、Windowsパソコン上に環境構築をしました。

OSS-DB Silverは既にプログラマとして働いている方向けの資格なのか、プログラミング初心者が書いた記事が見当たりません。私のように "**プログラミング初心者 で OSS-DB Silver取得に向けて学習している人**" に向けて、参考にしてもらえたら良いなと思って記事にしました。シンプルに環境構築の方法をまとめた、というよりも、手間取ったところや、混乱したところの自分の思考も合わせてごちゃごちゃと書き連ねております。

前回は、WindowsPCにLinux環境(仮想環境)を構築しました。
「[OOSS-DB Silverのための環境構築 #1_VirtualBox/VagrantでLinux環境(CentOS7 仮想環境)をつくる](https://qiita.com/ume-san/items/6187346b40de39ad7450)」

今回は、その次の作業に進みます。
「構築したLinux環境に、PostgreSQLを操作するユーザアカウントを作成する」

教科書該当箇所＝『[OSS教科書 OSS-DB Silver Ver2.0対応（緑本）](https://www.amazon.co.jp/OSS%E6%95%99%E7%A7%91%E6%9B%B8-OSS-DB-Silver-Ver2-0%E5%AF%BE%E5%BF%9C-%E7%A6%8F%E5%B2%A1/dp/4798162558/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)』) 3章-インストール「事前準備(p48)」

**【つまずいたポイント】
・CentOS7(Linux)の使い方。どこにどうやってコマンドを記述すれば良い？コマンドのオプションって何？
・CentOS7(Linux)の使い方。rootユーザと一般ユーザの使い分けはどのようにすれば良い？**


#作業：PostgreSQL操作用のユーザアカウントを作成する

教科書(p48)にこうありました。
>//3-1-1事前準備//　
最初に、PostgreSQLを操作するユーザアカウントを作成します。本書では、一般的によく使われるpostgresユーザを作成します。（以下コマンド参照）　本書では、シャープ(#)で始まるコマンド行はrootユーザで実行します。ドルマーク($)で始まるコマンド行は一般ユーザーで実行します。

【コマンド】

```
$ su - 
# useradd -m -d /home/postgres postgres
# passwd postgres
# su - postgres
```

PostgreSQLを操作するためのユーザーを作成していきます。

ここで作る「ユーザー」とは、OS(CentOS7)が管理するユーザーです。ミドルウェア(PostgreSQL)が管理するユーザーではありません。混合しないように注意します。

ここまで読んで疑問が浮かんだので、ひとつずつ調べていきます。

**ユーザとは？**
Linuxを使用するときにログインするユーザアカウントのことをLinuxユーザという。Linuxは一般的なOSと同じで、実際に使用するにはユーザとしてログインする必要がある。ログインに必要なものは 「ユーザ名、パスワード」　の二つ。
（参考：「[【初心者でもわかる！】Linuxのユーザとは？](https://eng-entrance.com/linux-user-what)」）

**rootユーザとは？**
Linux等の管理者。管理者権限。一番偉いユーザ。セキュリティ上、最も守らなくてはならないユーザ。必要な時(※下記)だけroot権限を借りるようにする。自分自身を削除するコマンドも受け付けてしまうらしい。恐ろしい。使用注意！！
　※必要なとき
　　・インストール後の初期設定、および設定変更時
　　・パッケージインストール時
　　・ログの確認時
　　上記3つのとき以外は基本的には一般ユーザで操作をおこなう方がいい。
（参考：「[【完全初心者向け】Linuxのrootユーザとは？](https://eng-entrance.com/linux-root)」）

**一般ユーザーとは？**
Linuxの場合インストールをおこなった管理者自身も一般ユーザを別に作成し、必要な時だけrootの権限を借りて操作するのが習慣となっている。一般ユーザの場合自分専用のディレクトリが割り当てられ、その中で作業をすることになる。もし一時的にroot権限を借りたい場合は「su」や「sudo」といったコマンドを使用することになる。その場合、一時的とはいえ管理者の権限を借りるので慎重に操作しなくてはならない。
（ちなみに、教科書では 一般は「ユーザー」、他は「ユーザ」表記になっているのが気になった。何か使い分けているのか？　参考記事では「一般ユーザ、rootユーザ」と書かれていた。）
（参考：「[【初心者でもわかる！】Linuxのユーザとは？](https://eng-entrance.com/linux-user-what)」）

また、教科書に「本書では**(#)で始まるコマンド行はrootユーザ、($)で始まるコマンド行は一般ユーザーで実行**する」と書かれていましたが、**どうやってユーザを使い分けて記述すれば良いのでしょうか？**　「postgreSQL　ユーザ　作成」等でググってみましたが、既にPostgreSQLがインストールされている環境においてユーザ作成をする方法ばかりがヒットします。教科書のようにpostgreSQLインストールの前にPostgreSQLユーザアカウントを作成するという方法を取っている記事が見当たりませんでした。
→以下でコマンドの意味を読み取る中で解決しました。**コマンドでユーザーの切り替えを指示していました**。

##コマンドの意味を読み解く

教科書には、上記4行のコマンドが提示されてはいましたが、それが何をするコマンドなのかは説明されていませんでした。ひとつひとつ読み解いていきます。

最終的に読み取った内容がこちら。「」内がコマンドの意味、()内はメモです。
($) で始まるコマンド行は一般ユーザー、(#) で始まるコマンド行はrootユーザー、です。

```
（一般ユーザーで実行）
$ su -
「OSのユーザーをrootユーザーに変更せよ」
（ここで一般ユーザーからrootユーザーに切り替わる）
（以下はそのままrootユーザーで実行）
# useradd -m -d /home/postgres postgres
「新規ユーザー登録をせよ」
「ユーザーのホームディレクトリ（ログインしたときのディレクトリ）が存在しない場合、作成せよ」
「新規に作成するユーザーのホームディレクトリを /home/postgres postgres と指定せよ」
# passwd postgres
「ユーザーpostgres のパスワードを変更せよ」
# su - postgres
「OSのユーザーをpostgresユーザーに変更せよ」
```

以下は詳細です。

①**$ su -**
suコマンドは「ユーザー切替をする」という命令。「-」は「切替先のユーザー名はrootです」という命令。つまり、「ユーザーをrootユーザーに変更せよ」という意味。
なぜ「su root」ではなく「su -」なのか？ → rootユーザーへ切替する回数が多いので、省略して表現できるようにしている。
（参考：「[su - コマンド ルートユーザーになる](https://tokyo-teacher.com/article/sj-pg/sj-pg-6-lx/sj-pg-lx-215-su/)」）

②**# useradd -m -d /home/postgres postgres**

・**useradd**=「新規ユーザーを登録」のコマンド。ここでは「useradd [オプション] 新規ユーザー名」の形(書式)で使われている。

・**オプション**＝コマンドの引数(後に続く文字列)が ハイフン"-"、"--" で始まる場合、その引数はオプション。つまりここでは「-m」「-d」がオプション。（参考：「[Linux系システムのコマンドラインオプションについて調べたメモ](https://qiita.com/rubytomato@github/items/2ee2fd4127eadc1f1193)」）　　オプションの書き方には短いものと長いものがあるらしい。 具体的な例は以下「-m」等を参照。

・**-m**=オプション。意味は「ユーザーのホームディレクトリ（ログインしたときのディレクトリ）が存在しない場合、作成する」　短いオプション。長いオプションは「--create-home」（参考：[【 useradd 】コマンド――新規ユーザーを作成する](https://www.atmarkit.co.jp/ait/articles/1811/02/news035.html)）

・**-d**=オプション。意味は「新規に作成するユーザーのホームディレクトリを指定する」（参考：「[Linuxコマンド【 useradd 】新規ユーザーの作成](https://webkaru.net/linux/useradd-command/)」）

・**/home/postgres postgres**＝指定したいホームディレクトリ。

③**# passwd postgres**＝「ユーザー postgres のパスワードを変更」（参考：「[ユーザーとパスワードの設定](http://db-study.com/archives/121)」）

④**# su - postgres**＝「OSのpostgresユーザーにスイッチする」（参考：「[ユーザーとパスワードの設定](http://db-study.com/archives/121)」）　→**疑問：この「-」は「root」を意味しないのか？**「$ su -」について調べた時、「“-”はrootユーザーのこと」だったはず。



##作業開始
各用語については何となく理解できたので、いよいよ作業に入ります。

まずはPCのスタート画面から Oracle VM VirtualBox をクリック。
Oracle VM VirtualBoxマネージャーが立ち上がる。
trainingをクリック。
起動をクリック。
仮想CentOS7が起動する。

起動した画面がこちら。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/a5d3318d-6026-77d8-2a08-b67d3d8a052b.png)


ここで手が止まりました。いったい、**どこに上記コマンドを記述すれば良いのでしょうか？**

また、この黒い画面をQiitaに貼るために「Windowsキー + PrtSc」でスクリーンショットをしようとしたのですが、このCentOS7の黒い画面を選択しているとこの操作ではスクリーンショットできませんでした。ホストOSの他のウィンドウを選択して、その背景としてCentOS7の黒い画面を表示させていれば、それは同じ操作でスクリーンショットできました。OSが違っているのだから当然といえば当然なのかな。

さらに、黒い画面のコマンドをマウスで選択してコピーしようとしましたが、黒い画面上ではマウスが効きませんでした。これもCentOS7自体の設定を変えてマウスを指定すればマウスを読み取るようになるのでしょうか。調べるとGuestAddtionsというものを使った方法等がヒットしました。が、今はとりあえずスルーして前へ進みます。

どこにコマンドを記述すれば良いのか？　

まずは、「$ su - 」を「Ctrl+C」でコピーして、表示されている画面に「Ctrl+V」で張り付けてみます。
→「^」と表示されました。
もう一度「Ctrl+V」。
→「U」と表示されました。
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/81471591-6983-5937-afb6-98aebec06f74.png)

^U^U^U^U^U^　・・・。
なるほど。
「ホストOS(Windows10)上のものをコピーして、ゲストOS(CentOS7)上にペースト」という
OSをまたいだ作業はできないようです。これも何かしらの方法がありそうですが、今はスルーします。

次は普通にキーボードで打ってみます。
CentOS7を再起動して、キーボードで「su-」と打ち込み、Enter。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/f3cf214b-9cb2-ac3b-64c1-224812d1e6f1.png)
"Password:"と表示されました。

次は
CentOS7を再起動して、キーボードで「$su-」と打ち込み、Enter。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/5c84d904-af7a-e3e4-290b-d4e9660057da.png)

またもや"Password:"と表示されました。
「$」は有っても無くても、動作は同じですね。
因みに、しばらくすると画面が勝手にこんなふうになっていました。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/e7cbfe2a-a5c6-ad78-5ebe-0b5e59b1b9f2.png)

？？
なぜ勝手に画面が変わったのでしょうか？
そして、“Localhost Login:”とは？

調べると、“Localhost Login:”とは、CentOS7へログインを求めるコマンドとのこと。
その際、CentOS7インストール時に設定したパスワードを打ち込む必要があるとのこと。
・・・パスワード、設定していません。インストールの際に、パスワード設定を求められませんでした。今から設定する必要があるということでしょうか？

そうこうしている間に、黒い画面上のコマンドが全て消え、何も表示されていない真っ黒な画面に変わっていました。なんでーーーー！？？？何もせずに時間が経つと、勝手にコマンドたちは消えてしまうのでしょうか？
もう、PostgreSQLの設定の以前に、CentOS7の使い方自体を学んだほうが良い気がしてきました…。

（真っ黒になった画面は、キーボードを打ったら、先ほどまで表示されていたコマンドが元通りに表示されました。何もせずに時間が経つと、画面だけ黒くなるようです。）

何個か記事を読んで、[この記事:「Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する
](https://qiita.com/ozawan/items/160728f7c6b10c73b97e)」を参考に
**ユーザー：vagrant
パスワード：vagrant**
と入力してみたところ、うまくいきました。
vagrantでCentOS7を構築したときに入力したコマンドの中には
特に「password」の文字は見当たりません。
どの段階でこのパスワードが設定されたのか、謎のままです。
が、今はこの謎は解けなかったのでスルーして進みます。

とにかく一般ユーザー(ユーザー名：vagrant パスワード：vagrant)でCentOS7にログインできました。

一番下の行に「[vagrant@localhost ~]$」と表示されたので
そこに続けて「su-」と入力しました。
「$」は自分で入力しなくても、勝手に表示されるのですね。
Enter。
「-bash: su-: command not found（改行）[vagrant@localhost ~]$」と表示されました。
su と - の間に半角スペースを入れてみます。
「**su -**」Enter。
「Password:」と表示されました。
うまくいきました！スペースが大切なのですね。

さて、またもや設定した覚えのないパスワードを求めらました。
先ほどと同じく こちらの記事「[Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する
](https://qiita.com/ozawan/items/160728f7c6b10c73b97e)」を参考にしてみます。
ユーザー：root
**パスワード：vagrant**
記事にあったこちらを使ってみます。

「Password:」の右に「vagrant」と打ってみますが、何も表示されません。カーソルも動きません。ですが、ここまで見てきた記事でパスワード入力の際には何も表示されないが、OSは認識しているので大丈夫だと書かれているのを見た覚えがあります。このままEnter。Passwordは表示されないままですが、OSは反応し、最終行に「[root@localhost ~]#」と表示されました。成功です！
教科書に「本書では、シャープで始まるコマンド行はrootユーザで実行します」とありました。OS上でもrootユーザは「#」で表示されるようです。

これでコマンドの1行目(4行中)完了です。

続いて2行目(4行中)です。
「useradd -m -d /home/postgres postgres」、Enter。
「passwd postgres」、Enter。
ここで「Changing password for user postgres.（改行）New password:」と表示されました。

教科書に書かれていない文です。「passwd postgres」の意味は「ユーザーpostgres のパスワードを変更せよ」だから、そのことが英文で表示されたということでしょうか。まだパスワードを設定していないのに「Changing」とは変な感じがします。が、とりあえず任意のパスワードを設定してみます。

「postgres」(←OS上には表示されない)、Enter。
→「BAD PASSWORD: The password contains the user name in some form (改行) Retype new password:」と表示されました。パスワードに、postgresを含んではいけないのですね。

では、
「vagrant、Enter。
→「Sorry,passwords do not match. (改行) New password:」と表示されました。まだパスワードを設定していないのに「一致しません」って、どういうことでしょうか。。。

一旦手を止めて調べます。「passwd postgres、CentOS Postgres ソース」等でググりました。
が、ここの部分について解説された記事を見つけることはできませんでした。
[OSS-DB公式の解説ページ](https://oss-db.jp/dojo/dojo_info_01)ではこの事前準備については全く触れられていませんし、[ドキュメント](https://www.postgresql.jp/document/9.5/html/installation.html)でも触れられていませんでした。

やけくそです。
「pspsp」、Enter。
→「BAD PASSWORD: The password is a palindrome (改行) Retype new password:」と表示されました。
palindrome=回文(前から読んでも後から読んでも同じように読める語句や文)　だそうです。回文はダメなのね。

何なら良いんだ！
「pos10」、Enter。
→「Sorry,passwords do not match. (改行) New password:」と表示されました。
→また「一致しません」。これ、もしかして、直前に打ったパスワードを再確認されているのか？

「pos10」、Enter。
→「Retype new password:」と表示されました。やはり再確認されているだけなのかも！
→「pos10」、Enter。
→「passwd: all authentication tokens updated successfully.(改行)[root@localhost ~]#」と表示されました。

わーーー！成功です！
単純に「パスワードの再確認」をされていたんですね。どこにつまずいているんだよ、という感じですね。でもとにかく、この段階を通過できました。

次のコマンドを打ちます。
「su - postgres」、Enter。
→「[postgres@localhost ~]$」と表示されました。
OSのユーザーがpostgresユーザーに変更されました。

やっと、教科書にあったコマンド4行、完了です。

##まとめ
CentOS7を立ち上げてから教科書のコマンド4行を実行するまでにした作業を全てまとめます。

```
(Virtual Boxの該当OSを選択し「起動」をクリック)
(「(前略)eth1: link becomes ready」と表示される)
vagrant
(と打ち込み、Enterをクリック。「Password:」と表示される)
vagrant
(と打ち込み(画面上表示はされない)、Enterをクリック。「Last login:（省略）[vagrant@localhost ~]$」と表示される。一般ユーザーの状態。)
su -
(と打ち込み、Enterをクリック。「Password:」と表示される)
(意味＝「OSのユーザーをrootユーザーに変更せよ」。ここで一般ユーザーからrootユーザーに切り替わる)
vagrant
(と打ち込み(画面上表示はされない)、Enterをクリック。「Last login:（省略）[root@localhost ~]#」と表示される) 
useradd -m -d /home/postgres postgres
(と打ち込み、Enterをクリック)
(意味＝「新規ユーザー登録をせよ」「ユーザーのホームディレクトリ（ログインしたときのディレクトリ）が存在しない場合、作成せよ」「新規に作成するユーザーのホームディレクトリを /home/postgres postgres と指定せよ」)
passwd postgres
(と打ち込み、Enterをクリック。「Changing password for user postgres.New password:」と表示される)
(意味＝「ユーザーpostgres のパスワードを変更せよ」)
任意のパスワード
(を打ち込み、Enterをクリック。「Retype new password:」と表示される)
設定した任意のパスワード
(を打ち込み、Enterをクリック。「passwd: all authentication tokens updated successfully.(改行)[root@localhost ~]#」と表示される)
su - postgres
(と打ち込み、Enterをクリック。「[postgres@localhost ~]$」と表示される)
(意味＝「OSのユーザーをpostgresユーザーに変更せよ」)
(OSのユーザーがpostgresユーザーに変更されました)
```

#アカウント作成について
作業中の疑問：PostgreSQLのアカウント作成でググると、「PostgreSQLをインストールした後でPostgreSQLのユーザーアカウントを作成」している記事ばかりがヒット。教科書のやり方は、「インストール前に先にユーザーアカウントを作成」するやり方。「先にインストールして、その後ユーザーアカウント作成」の方が自然な流れだと思う。なぜ教科書は先にアカウント作成なのか？
解決：今回設定したユーザーは、OS（CentOS7）が管理するユーザー。インストール後に設定するユーザーはミドルウェアであるPostgreSQLが管理するユーザー。2つのユーザーを混同しないよう注意！（参考：「[ユーザーとパスワードの設定](http://db-study.com/archives/121)」）
ドキュメントに、「PostgreSQLは、非特権ユーザ、つまり、スーパーユーザ（root）権限を必要とすることなく、インストールできます。（引用：[PostgreSQL 8.2.6文書](https://www.postgresql.jp/document/8.2/html/tutorial-install.html)）」　とあって、最初はこの文章の意味がよくわからなかった。が、今回の作業で最終的に一般ユーザーに切り替えたから、この後のソースコードの取得は一般ユーザー(＝非特権ユーザ)でおこなうということ。なんとなくだけど、意味がわかった。

#CentOS7使い方メモ
##ユーザー切り替え方法
**●$(一般ユーザー) →　#(rootユーザー)　**

```
$ su -
```
切り替えるために求められるPasswordは
**vagrant**




#おわりに
・これでPostgreSQLを操作するCentOS7のユーザーアカウントを作ることができました。

・教科書に書かれた4行のコマンドを実行するのに、16日(12/23(水)~1/8(金)の大晦日以外）も要してしまいました。作業時間は0.5~3時間/日と、日によってまちまち。その時間のほとんどが、ググる時間でした。

・コマンドの基本的な知識が無い状態なので、調べる最中、ひとつひとつの記事に何が書いてあるのかを読み取るのに時間がかかりました。今回のコマンドを実行するために直接には関係ない記事を読む時間も多かったです。そうして調べていく中で周辺知識を付けて、そのときに必要なことが書かれている記事なのかどうかを素早く判断できるようになることで、情報収集のスピードも上がりそうだと思いました。今はかなり時間がかかる…。

・自分の疑問や調べたいこと自体が不明瞭なので、調べながら自分の疑問の輪郭をはっきりさせていく感覚がありました。今は知らないことが多すぎて、この「疑問が何か」をはっきりさせるのにも時間がかかります。
今回だと、例えば「アカウント作成について」にまとめた内容のこととか。
「OSのユーザーとPostgreSQLのユーザーの2種類がある」ということを知らなかったために、ググるときの前提条件が定まらず、疑問を解くのに時間を要しました。ユーザーは2種類あるということを知っていれば、最初からもっと情報を絞り込めたはずです。調べていく中で、前提条件がおかしいのではないか？という自分への疑いが生まれて、で、その疑いを持ちながら更に調べていく中で、2種類あったんかーい！ってことに気づけました。
問題解決のためには「何がわからないのか」をなるべく早くハッキリさせる必要があるし、そのためは知識が必要だと、あらためて感じました。

・次は事前準備第二弾。「PostgreSQLをソースコードからインストールするために必要な各種ソフトウェアパッケージをインストールする」に進みます。まだまだ事前準備が続きます。早く本題に入りたいーー！


#未解決事項
・「# su - postgres」の「-」は「root」を意味しないのか？「$ su -」について調べた時、「“-”はrootユーザーのこと」だったはず。

・vagrantでCentOS7を構築した際に、どの段階でrootユーザー&一般ユーザーのユーザ名&パスワードの設定がされたのか？


#参考
・書籍：『[OSS教科書 OSS-DB Silver Ver2.0対応](https://www.amazon.co.jp/OSS%E6%95%99%E7%A7%91%E6%9B%B8-OSS-DB-Silver-Ver2-0%E5%AF%BE%E5%BF%9C-%E7%A6%8F%E5%B2%A1/dp/4798162558/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)』
・ドキュメント：[PostgreSQL 8.2.6文書](https://www.postgresql.jp/document/8.2/html/tutorial-install.html)
・「[３分間で人に説明できるようになるUnixとLinuxの違い](https://eng-entrance.com/unix_linux)」-エンジニアの入り口-2020/10/12
・「[GNUとは](http://e-words.jp/w/GNU.html)」-IT用語辞典e-Words-2018/07/30更新記事
・「[自動化のためのGNU Make入門講座](http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/gnu-make.html)」-オブラブ-2003/01/05
・「[【完全初心者向け】Linuxのrootユーザとは？](https://eng-entrance.com/linux-root)」-エンジニアの入り口-2018/08/30
・「[【初心者でもわかる！】Linuxのユーザとは？](https://eng-entrance.com/linux-user-what)」-エンジニアの入り口-2016/12/09
・「[【初心者用】Linuxのコマンドとは？とコマンドラインの表示方法](https://eng-entrance.com/linux-what-is-command)」-エンジニアの入り口-2018/08/30
・「[su - コマンド ルートユーザーになる](https://tokyo-teacher.com/article/sj-pg/sj-pg-6-lx/sj-pg-lx-215-su/)」-東京先生
・「[Linux系システムのコマンドラインオプションについて調べたメモ](https://qiita.com/rubytomato@github/items/2ee2fd4127eadc1f1193)」-Qiita -@rubytomato@githubさんの記事
・「[【 useradd 】コマンド――新規ユーザーを作成する](https://www.atmarkit.co.jp/ait/articles/1811/02/news035.html)」-2018/11/02記事
・「[Linuxコマンド【 useradd 】新規ユーザーの作成](https://webkaru.net/linux/useradd-command/)」
・「[ユーザーとパスワードの設定](http://db-study.com/archives/121)」-PostgreSQLではじめるDB入門—2016/05/07
・「[Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する](https://qiita.com/ozawan/items/160728f7c6b10c73b97e)」-Qiita -@ozawanさんの記事