さくらのVPSプラン乗り換え計画(5)

Ubuntu はやめて CentOS6 でやってみることにした。こっちは「標準OSインストール」でインストールしてもちゃんとログインできる。
ssh でログインしたら、まずは yum update

[root@tk2-254-36564 ~]# yum update
読み込んだプラグイン:fastestmirror, security
更新処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.riken.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
更新と設定されたパッケージがありません。

特に必要なかったみたいだ。

作業用のユーザーの作成。

[root@tk2-254-36564 ~]# useradd takatoh
[root@tk2-254-36564 ~]# passwd takatoh
ユーザー takatoh のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
[root@tk2-254-36564 ~]# usermod -G wheel takatoh

wheel グループに sudo する権利をつける。visudo コマンドで開いたファイルの次の行をアンコメントする。

%wheel ALL=(ALL) ALL

いったんログアウトして、新しく作ったユーザーでログイン。

takatoh@envelopes $ ssh [email protected]
[email protected]'s password: 

SAKURA Internet [Virtual Private Server SERVICE]

パスワード認証をやめて、公開鍵での認証に切り替える。公開鍵を配置。

[takatoh@tk2-254-36564 ~]$ mkdir .ssh
[takatoh@tk2-254-36564 ~]$ chmod 700 .ssh
[takatoh@tk2-254-36564 ~]$ cd .ssh
[takatoh@tk2-254-36564 .ssh]$ wget -O authorized_keys https://github.com/takatoh.keys
--2017-05-04 16:29:25--  https://github.com/takatoh.keys
github.com をDNSに問いあわせています... 192.30.255.113, 192.30.255.112
github.com|192.30.255.113|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/plain]
`authorized_keys' に保存中

    [ <=>                                   ] 381         --.-K/s 時間 0.003s  

2017-05-04 16:29:26 (136 KB/s) - `authorized_keys' へ保存終了 [381]

[takatoh@tk2-254-36564 .ssh]$ chmod 600 authorized_keys
[takatoh@tk2-254-36564 .ssh]$ ls -al
合計 12
drwx------ 2 takatoh takatoh 4096  5月  4 16:29 2017 .
drwx------ 3 takatoh takatoh 4096  5月  4 16:28 2017 ..
-rw------- 1 takatoh takatoh  381  5月  4 16:29 2017 authorized_keys

もう一度ログアウトして、公開鍵認証ができるか試してみる。

[takatoh@tk2-254-36564 .ssh]$ exit
logout
Connection to 160.16.224.68 closed.
takatoh@envelopes $ ssh [email protected]
Last login: Thu May  4 16:27:31 2017 from fntsitm001026.sitm.fnt.ngn.ppp.infoweb.ne.jp

SAKURA Internet [Virtual Private Server SERVICE]

大丈夫みたいだ。

それじゃつぎは ssh の設定。編集するのは /etc/ssh/sshd_config ファイルの3箇所。

Port 60000
PasswordAuthentication no
PermitRootLogin no

それぞれ、ポートの変更、パスワード認証の禁止、root でのログイン禁止。
設定を反映するために sshd をリスタート。

[takatoh@tk2-254-36564 ~]$ sudo service sshd restart
[sudo] password for takatoh: 
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

そしてファイアウォールの設定。/etc/sysconfig/iptables ファイルをつぎのように編集。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 60000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

4,5 行目は ACCEPT を DROP に変更、10行目はポート番号を変更。で、これを反映。

[takatoh@tk2-254-36564 ~]$ sudo service iptables start

再びログアウトして、ちゃんと新しいポートでログインできるか試してみる。

takatoh@envelopes $ ssh -p 60000 [email protected]
Last login: Thu May  4 17:00:05 2017 from fntsitm001026.sitm.fnt.ngn.ppp.infoweb.ne.jp

SAKURA Internet [Virtual Private Server SERVICE]

OK。ここでいったん休憩。

さくらのVPSプラン乗り換え計画(4)

MySQL のインストール。

takatoh@tk2-254-36564:~$ sudo apt install mysql-server

途中で root のパスワードを訊かれるので入力(2回)。
バージョンの確認。

takatoh@tk2-254-36564:~$ mysql --version
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper

設定ファイルは /etc/mysql/my.cnf。

takatoh@tk2-254-36564:~$ cd /etc/mysql
takatoh@tk2-254-36564:/etc/mysql$ cat my.cnf
#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
# 
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

…と思ったら、何やら追加の設定は別のファイルに書くらしい。/etc/mysql/conf.d と /etc/mysql/mysql.conf.d の下に .cnf ファイルを置けば読み込んでくれるってことでいいのかな。2つのディレクトリの下にはファイルが用意されている。

takatoh@tk2-254-36564:/etc/mysql$ ls conf.d
mysql.cnf  mysqldump.cnf
takatoh@tk2-254-36564:/etc/mysql$ ls mysql.conf.d
mysqld.cnf  mysqld_safe_syslog.cnf

日本語を扱えるようにデフォルトの charset を utf-8 にするため、それぞれのファイルに次のように設定してみた(色を付けたところが追記したところ)。

[mysql]
default-character-set=utf8
[/crayon]
[crayon title="etc/mysql/conf.d/mysqldump.cnf" mark="5"]
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
default-character-set=utf8
(前略)
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engin=InnoDB
(後略)

これでいいはず。
MySQL を再起動してみよう。

takatoh@tk2-254-36564:/etc/mysql$ sudo systemctl restart mysqld
Failed to restart mysqld.service: Unit mysqld.service not found.

あれ?だめだ。Unit ファイルがないってか?

takatoh@tk2-254-36564:/etc/mysql$ sudo /etc/init.d/mysql restart
[....] Restarting mysql (via systemctl): mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
 failed!

/etc/init.d/mysql を直接叩いてもダメだ。メッセージに従って詳細を見てみよう。

takatoh@tk2-254-36564:/etc/mysql$ systemctl status mysql.service
* mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: activating (start-post) (Result: exit-code) since Thu 2017-05-04 12:59:31 JST; 21s ago
  Process: 8060 ExecStart=/usr/sbin/mysqld (code=exited, status=1/FAILURE)
  Process: 8051 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 8060 (code=exited, status=1/FAILURE);         : 8061 (mysql-systemd-s)
   CGroup: /system.slice/mysql.service
           `-control
             |-8061 /bin/bash /usr/share/mysql/mysql-systemd-start post
             `-8125 sleep 1

May 04 12:59:01 tk2-254-36564 systemd[1]: Starting MySQL Community Server...
May 04 12:59:04 tk2-254-36564 systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE

なんかエラー?

takatoh@tk2-254-36564:/etc/mysql$ journalctl -xe

こちらの出力は長くて載せられないけど、やっぱりエラーになってるらしい。
mysql.servece ファイルが無いとの事なので調べげ見ると、/etc/systemd/system にはないけど、/lib/systemd/system にはあることがわかった。てことは、リンクを張ればいいのかな。

takatoh@tk2-254-36564:/etc/mysql$ cd
takatoh@tk2-254-36564:~$ sudo ln -s /lib/systemd/system/mysql.service /etc/systemd/system/mysql.service
takatoh@tk2-254-36564:~$ ls -l /etc/systemd/system
total 32
drwxr-xr-x 2 root root 4096 May  4 10:01 default.target.wants
drwxr-xr-x 2 root root 4096 May  4 10:00 getty.target.wants
drwxr-xr-x 2 root root 4096 May  4 10:20 graphical.target.wants
drwxr-xr-x 2 root root 4096 May  4 11:47 multi-user.target.wants
lrwxrwxrwx 1 root root   33 May  4 13:08 mysql.service -> /lib/systemd/system/mysql.service
drwxr-xr-x 2 root root 4096 May  4 10:01 network-online.target.wants
drwxr-xr-x 2 root root 4096 May  4 10:22 sockets.target.wants
lrwxrwxrwx 1 root root   31 May  4 10:23 sshd.service -> /lib/systemd/system/ssh.service
drwxr-xr-x 2 root root 4096 May  4 10:23 sysinit.target.wants
lrwxrwxrwx 1 root root   35 May  4 10:01 syslog.service -> /lib/systemd/system/rsyslog.service
drwxr-xr-x 2 root root 4096 May  4 10:01 timers.target.wants

これでどうだ。

takatoh@tk2-254-36564:~$ sudo systemctl restart mysql
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.

だめか。
Unit ファイルのなかを覗いてみる。

# MySQL systemd service file

[Unit]
Description=MySQL Community Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
PermissionsStartOnly=true
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
ExecStart=/usr/sbin/mysqld
ExecStartPost=/usr/share/mysql/mysql-systemd-start post
TimeoutSec=600
Restart=on-failure
RuntimeDirectory=mysqld
RuntimeDirectoryMode=755

うん、わからん。
PermissionsStartOnly=true って行が気になる。start だけってことなのかな。サーバ自体を再起動してみるか。

うーん、再起動してもダメだなあ。
とりあえずここまでにしよう。後で追記する。

[追記]

いったん MySQL サーバをアンインストールして、再インストールしたらどうかと思ってやってみたら、今度はインストールすらエラーが出るようになってしまった。
こりゃダメか。最初からやり直しだな。

さくらのVPSプラン乗り換え計画(3)

Ruby と Git をインストール。
まず Ruby。

takatoh@tk2-254-36564:~$ sudo apt install ruby ruby-dev
takatoh@tk2-254-36564:~$ ruby -v
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

bundler が入っていないのでインストール。

takatoh@tk2-254-36564:~$ sudo gem install bundler

つぎは Git。

takatoh@tk2-254-36564:~$ sudo apt install git
takatoh@tk2-254-36564:~$ git --version
git version 2.7.4

さくらのVPSプラン乗り換え計画(1)

タイトルの通り、プランの乗り換えにチャレンジ。

VPS の OS は標準の CentOS じゃなくて、使い慣れた Ubuntu にしたかったので、OS の再インストールをした。ところが、用意されている「標準OS」の Ubuntu 16.04 をインストールしてみたけど、ログインができない。パスワードを間違えたのかと思って何度かやり直し(インストール自体のやり直しも含めて)やってみたけどダメ。CentOS6 をインストールすると何故か大丈夫。なんでだ?
仕方がないので「カスタムOS」の Ubuntu 16.04 をインストールしたら(インストールに時間はかかったけど)無事、ログインに成功した。ユーザー名は takatoh。

VPS のページから、コンソールを選んでサーバに接続する。
まずは ssh の設定。/etc/ssh/sshd_config ファイルを編集する。

$ sudo vi /etc/ssh/sshd_config

ポートを変更。

Port 60000

root でのログインを禁止。

PermitRootLogin no

設定を反映するために sshd を再起動。

$ sudo systemctl restart sshd

次にファイアウォールの設定。

$ sudo ufw enable
$ sudo ufw default DENY
$ sudo ufw allow 60000

これで、ローカルの PC から ssh でアクセスできるようになったはず。試してみよう。

takatoh@envelopes $ ssh -p 60000 [email protected]
[email protected]'s password: 
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Thu May  4 10:48:04 2017
takatoh@tk2-254-36564:~$

OK。
それじゃこんどはパスワード認証をやめて、公開鍵での認証に切り替える。

takatoh@tk2-254-36564:~$ pwd
/home/takatoh
takatoh@tk2-254-36564:~$ mkdir .ssh
takatoh@tk2-254-36564:~$ chmod 700 .ssh
takatoh@tk2-254-36564:~$ cd .ssh
takatoh@tk2-254-36564:~/.ssh$ wget -O authorized_keys https://github.com/takatoh.keys
--2017-05-04 11:08:43--  https://github.com/takatoh.keys
Resolving github.com (github.com)... 192.30.255.113, 192.30.255.112
Connecting to github.com (github.com)|192.30.255.113|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: 'authorized_keys'

authorized_keys         [ <=>                ]     381  --.-KB/s    in 0.001s  

2017-05-04 11:08:43 (309 KB/s) - 'authorized_keys' saved [381]

takatoh@tk2-254-36564:~/.ssh$ ls -al
total 12
drwx------ 2 takatoh takatoh 4096 May  4 11:08 .
drwxr-xr-x 4 takatoh takatoh 4096 May  4 11:08 ..
-rw-rw-r-- 1 takatoh takatoh  381 May  4 11:08 authorized_keys
takatoh@tk2-254-36564:~/.ssh$ chmod 600 authorized_keys
takatoh@tk2-254-36564:~/.ssh$ ls -al
total 12
drwx------ 2 takatoh takatoh 4096 May  4 11:08 .
drwxr-xr-x 4 takatoh takatoh 4096 May  4 11:08 ..
-rw------- 1 takatoh takatoh  381 May  4 11:08 authorized_keys

ここでいったんログアウトして、鍵認証でログインできるか試してみる。

takatoh@envelopes $ ssh -p 60000 [email protected]
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Thu May  4 11:05:11 2017 from 58.1.225.90

OK。それじゃもう一度 /etc/ssh/sshd_config を編集して、パスワード認証をしないことにする。

PasswordAuthentication no

sshd の再起動。

takatoh@tk2-254-36564:~$ sudo systemctl restart sshd

とりあえずここまで。

Rails 4.2.8にしたら外部からアクセスできなくなった

Rails を 4.1.4 から 4.2.8(4.2 系の最新版)にアップデートしたら、rails s で起動したサーバに外部(ほかの PC)からアクセスできなくなっていた。4.2 で挙動が変わったらしい。

 cf. rails sで起動したサーバにブラウザからアクセスできない – Qiita

上の参考ページにあるように、-b オプションをつければいい。

takatoh@envelopes $ bundle exec rails s -b 0.0.0.0

Elixir 練習問題 ControlFlow-3

こんな感じでいいかな。

defmodule OK do
  def ok!({:ok, data}), do: data
  def ok!(_), do: raise("Error occured.")
end

file = OK.ok! File.open("somefile")
^o^ > elixir practice_12_3.exs
warning: variable file is unused
  practice_12_3.exs:6

** (RuntimeError) Error occured.
    practice_12_3.exs:3: OK.ok!/1
    (elixir) lib/code.ex:363: Code.require_file/2

ちなみに、somefile の代わりに存在するファイルで試してみると次のようになる。

^o^ > elixir practice_12_3.exs
warning: variable file is unused
  practice_12_3.exs:6

エラーは起きない。警告が出てるのは file 変数を使ってないからだね。

Elixir 練習問題 ControlFlow-1

気が付けば前回の Elixir のエントリからひと月も経ってしまった。
ま、気を取り直して。FizzBuzz を case を使って書け、と。

defmodule FizzBuzz do
  def fizzbuzz(n) do
    case {rem(n, 3), rem(n, 5), n} do
      {0, 0, _} -> "FizzBuzz"
      {0, _, _} -> "Fizz"
      {_, 0, _} -> "Buzz"
      {_, _, m} -> to_string(m)
    end
  end
end

(1..20)
  |> Enum.each(&IO.puts(FizzBuzz.fizzbuzz(&1)))
^o^ > elixir practice_12_1.exs
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

結局PCを買い換えた

先週の金曜日に起動しなくなってしまったメインマシン(apostrophe)、土曜日に DELL のサポートに電話してやり取りした結果、DELL に送って修理が必要ということになった。で、どのくらいかかるのかときいたら、期間にして2週間、費用にして3〜4万円(サポート期間が過ぎているので有償)という回答だった。
少し考えたけど、そんなにかかるなら買ってしまったほうがいい。DELL の即納モデルなら1週間もすれば届くだろうし、ちょうど春の割引キャンペーンをやっているので本体だけなら4万円をちょっと超えるくらいだ。
というわけで、一昨日届いた。昨日は時間がなかったので、今日セットアップ。プリインストールの Windows 10 のリカバリメディア(何故か USB フラッシュメモリしか選べないので急いで買ってきた)を作っておいて、Windows はさっくり削除して Ubuntu 16.04 LTS をインストールした。とりあえずは最低限のセットアップが終わったところ。あとは時間を見て環境を整えていこう。
あ、ホスト名は envelopes にした。
それにしても出費が続くなぁ。

メインマシン(Ubuntu)が起動しなくなった

今朝のこと。Ubuntu 16.04 のメインマシン(apostrophe)を見るとソフトウェアのアップデートが表示されていたので、アップデートした。すると、アップデートを完了するにはマシンの再起動が必要だというので、再起動したところ、起動しなくなってしまった。DELL のロゴマークが表示された状態で止まっていて、それっきり動きがない。
ともかく朝で時間がないので、そのまま様子を見ることにして(つまりほうっておいて)出かけたわけだ。
で、今帰ってきてみたら今朝と同じ状態のまま。マシンの電源を切ったり入れたりしてみるも変化がない。どういうわけだ。明日明後日と用事があってまとまった時間が取れそうにないんだけど、最悪再インストールかも。どうしたもんかね。

[追記]

Ubuntu のインストールディスクを入れて起動してみたけどダメだった。というか、DELL のロゴマークが表示されている状態で止まってるってここは、OS 以前の BIOS の途中で止まってるってことじゃなかろうか。こりゃダメかな。