CentOS7 PostgreSQL

MySQLの記事はたくさんあるので、PostgreSQLを入れてみます。

インストールから。ついでなので -devel も入れました。

[root@guest1 ~]# yum install postgresql postgresql-devel postgresql-server

サービス名は postgresql ですか。

[root@guest1 ~]# systemctl list-unit-files| grep postgresql
postgresql.service                          disabled

起動する前にDBを作成します。スクリプトがくっついてきてるんですね。

[root@guest1 ~]# postgresql-setup initdb
Initializing database ... OK

これで起動するはず。enableにもしておきます。

[root@guest1 ~]# systemctl enable postgresql
ln -s '/usr/lib/systemd/system/postgresql.service' '/etc/systemd/system/multi-user.target.wants/postgresql.service'
[root@guest1 ~]# systemctl start postgresql
[root@guest1 ~]# 

DBにログインするには初期設定では postgres ユーザになる必要があります。

[root@guest1 ~]# su - postgres
-bash-4.2$ psql
psql (9.2.7)
Type "help" for help.

postgres=# \q

Ruby on Rails から使えるように、一般ユーザ向けのスキーマを作成してみました。

postgres=# CREATE USER sugimura ENCRYPTED PASSWORD 'XXXXXXXX';
CREATE ROLE
postgres=#
postgres=# CREATE DATABASE railsdb OWNER sugimura 
postgres-# TEMPLATE template0
postgres-# ENCODING 'UTF-8' LC_COLLATE 'ja_JP.UTF8' LC_CTYPE 'ja_JP.UTF8'
postgres-# ;
CREATE DATABASE
postgres=#

無事作成できたので、sugimuraユーザからアクセスしてみます。

[sugimura@guest1 ~]$ psql -U sugimura -d railsdb -W
ユーザ sugimura のパスワード: 
psql (9.2.7)
"help" でヘルプを表示します.

railsdb=> 

 

CentOS7 で Rails

gem install rails でインストールして rails new → rails server すれば起動というのはもう省略しときます。

[sugimura@guest1 sample]$ rails server
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-01-23 12:07:08] INFO  WEBrick 1.3.1
[2015-01-23 12:07:08] INFO  ruby 2.2.0 (2014-12-25) [x86_64-linux]
[2015-01-23 12:07:08] INFO  WEBrick::HTTPServer#start: pid=11897 port=3000

問題なのはfirewallですね。iptables の上に firewalld というのがかぶさっているようです。まずは firewalld が動いていることを確認。

[root@guest1 ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Thu 2015-01-22 15:05:23 JST; 24h ago
 Main PID: 535 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─535 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Jan 22 15:05:23 localhost.localdomain systemd[1]: Started firewalld - dynamic...
Hint: Some lines were ellipsized, use -l to show in full.
[root@guest1 ~]# 

設定は firewall-cmd で行います。

[root@guest1 ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

この services に追加していくみたいですね。定義ファイルに書いてから追加のようです。/usr/lib/firewalld/services/ 以下にXMLで作ります。ここでは rails-webrick.xml として 3000/tcp を定義するように作ってみました。

[root@guest1 ~]# cat /usr/lib/firewalld/services/rails-webrick.xml 


  Ruby on Rails (WEBrick)
  Ruby on Rails (WEBrick)
  

[root@guest1 ~]# 

定義ファイルを書いたら、reload すると一覧に出てきます。

[root@guest1 ~]# firewall-cmd --reload
success
[root@guest1 ~]# firewall-cmd --get-services
amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps
ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp
openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rails-webrick rpc-bind samba
samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
[root@guest1 ~]# 

有効にしてみます。

[root@guest1 ~]# firewall-cmd --add-service=rails-webrick --permanent
success
[root@guest1 ~]# firewall-cmd --reload
success
[root@guest1 ~]# firewall-cmd --list-service
dhcpv6-client rails-webrick ssh
[root@guest1 ~]# 

iptables でも確認することができます。

[root@guest1 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
...
INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0  
...
Chain INPUT_ZONES (1 references)
target     prot opt source               destination         
IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto] 
IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto] 
...
Chain IN_public (2 references)
target     prot opt source               destination         
IN_public_log  all  --  0.0.0.0/0            0.0.0.0/0           
IN_public_deny  all  --  0.0.0.0/0            0.0.0.0/0           
IN_public_allow  all  --  0.0.0.0/0            0.0.0.0/0   
...
Chain IN_public_allow (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3000 ctstate NEW
...

ここまで設定できれば、ブラウザからアクセスしてみるといつものWEBrickの画面になることが確認できるかと思います。

CentOS7-Rails

(参考文献)

 

CentOS7 で Ruby

CentOS6.4の頃 とほとんど同じですね。git は Development Tools に入っているようです。まずはrootにてパッケージをインストール。必要なライブラリに libffi-devel が追加になっています。

[root@guest1 ~]# yum groupinstall "Development Tools"
[root@guest1 ~]# yum install zlib-devel openssl-devel readline-devel libffi-devel

今回もRubyは一般ユーザで入れてみます。

[sugimura@guest1 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/sugimura/.rbenv'...
remote: Counting objects: 2002, done.
remote: Total 2002 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (2002/2002), 318.89 KiB | 161.00 KiB/s, done.
Resolving deltas: 100% (1249/1249), done.
[sugimura@guest1 ~]$
[sugimura@guest1 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/home/sugimura/.rbenv/plugins/ruby-build'...
remote: Counting objects: 4319, done.
remote: Total 4319 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4319/4319), 771.35 KiB | 253.00 KiB/s, done.
Resolving deltas: 100% (2228/2228), done.
[sugimura@guest1 ~]$ echo 'PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[sugimura@guest1 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

login し直して rbenv を叩きます。install にはしばらく時間がかかります。build のログは /tmp/ruby-build.*.log に出ているので、眺めていてもいいでしょう。

[sugimura@guest1 ~]$ rbenv install 2.2.0
[sugimura@guest1 ~]$ rbenv rehash
[sugimura@guest1 ~]$ rbenv global 2.2.0
[sugimura@guest1 ~]$ ruby --version
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
[sugimura@guest1 ~]$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

KVM

libvirt 管理下にある KVM の場合、virsh で仮想マシンを扱います。よく使うのはこんな感じ。

  • virsh list … 起動中の仮想マシンの一覧
  • virsh list –all … すべての仮想マシンの一覧
  • virsh start [VM名] … 起動
  • virsh shutdown [VM名] … 停止
  • virsh reboot [VM名] … 再起動
  • virsh console [VM名]  … コンソール接続
  • virsh edit [VM名] … 設定ファイルの編集
  • virsh undefine [VM名] … 定義削除 

実際の例を挙げてみます。

[root@centos7 ~]# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 3     guest1                         実行中

[root@centos7 ~]# virsh console guest1
ドメイン guest1 に接続しました
エスケープ文字は ^] です

CentOS Linux 7 (Core)
Kernel 3.10.0-123.13.2.el7.x86_64 on an x86_64

localhost login: sugimura
Password: 
Last login: Thu Jan 22 15:00:15 on ttyS0
[sugimura@localhost ~]$ 

仮想マシンの定義ファイルは /etc/libvirt/qemu/ の下に XML ファイルで置いてあるんですが、直接編集したときは libvirtd を再起動しないと有効にならないようです。virsh edit [VM名] ならすぐ反映されます。

この定義ファイルの最初に <domain type=’kvm’> となっている場所があります。CentOS5で試したときはこれが type=’qemu’ になってしまうことがあり、動作がかなり遅くなって困りました。いまはデフォルトで type=’kvm’ になっているようです。

 

 

 

CentOS7 KVM

KVMで遊んでみます。

[root@centos7 ~]# yum install qemu-kvm
[root@centos7 ~]# yum install libvirt
[root@centos7 ~]# yum install virt-install

カーネルモジュールを確認します。

[root@centos7 ~]# lsmod | grep kvm
kvm_intel             138567  0 
kvm                   441119  1 kvm_intel

libvirtd を有効にします。CentOS7 からsystemdなので、流儀が違いますね。/usr/lib/systemd/system 以下に起動スクリプトが入っているそうなのですが、設定ファイル風なので慣れるまでは時間がかかりそうです。

サービスの一覧を取得して確認し、enabled にします。

[root@centos7 ~]# systemctl list-unit-files | grep libvirt
libvirt-guests.service                      disabled
libvirtd.service                            disabled
[root@centos7 ~]# systemctl enable libvirt-guests.service
ln -s '/usr/lib/systemd/system/libvirt-guests.service' '/etc/systemd/system/multi-user.target.wants/libvirt-guests.service'
[root@centos7 ~]# systemctl enable libvirtd.service
ln -s '/usr/lib/systemd/system/libvirtd.service' '/etc/systemd/system/multi-user.target.wants/libvirtd.service'
[root@centos7 ~]# systemctl list-unit-files | grep libvirt
libvirt-guests.service                      enabled 
libvirtd.service                            enabled 

起動しておきますか。

[root@centos7 ~]# systemctl start libvirtd.service
[root@centos7 ~]# systemctl start libvirt-guests.service

systemd周りはまだよくわからないので、後でまとめておきます。

KVMではゲストOSのネットワークにブリッジを使うので、あらかじめ設定します。これもだいぶ流儀が違いますね。

[root@centos7 ~]# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
接続 'br0' (96d8e039-89a5-4cc3-bcf3-a7580550ec7a) が正常に追加されました。
[root@centos7 ~]# nmcli connection modify br0 ipv4.addresses "192.168.0.230/24 192.168.0.1"
[root@centos7 ~]# nmcli connection modify br0 ipv4.method manual
[root@centos7 ~]# nmcli connection modify br0 ipv4.dns 192.168.0.1

既存のネットワークインタフェースを消して繋ぎ直します。まず ip addr でインタフェース名を取得します。いまどきは ifconfig は使わないんですよね。

[root@centos7 ~]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno16777736:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8d:5a:36 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.230/24 brd 192.168.0.255 scope global eno16777736
       valid_lft forever preferred_lft forever
(以下略)

eth0 とかではなく eno16777736 なんですね。なんでこんなことになってるのかわかりませんが、これを削除して後から繋ぎ直します。remoteから入っているときはここで切れちゃうので要注意です。

[root@centos7 ~]# nmcli connection delete eno16777736
[root@centos7 ~]# nmcli connection add type bridge-slave autoconnect yes con-name eno16777736 ifname eno16777736 master br0
Connection 'eno16777736' (fc4ccf45-8356-4a81-9bf0-9b44b260b139) successfully added.
[root@centos7 ~]# systemctl restart NetworkManager
[root@centos7 ~]#

再度 ip addr で確認してみます。br0 にアドレスが付いていて、インタフェース側は master br0 となっていればOKです。

[root@centos7 ~]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno16777736:  mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
    link/ether 00:0c:29:8d:5a:36 brd ff:ff:ff:ff:ff:ff
3: virbr0:  mtu 1500 qdisc noqueue state DOWN 
    link/ether a2:e3:ba:1b:b9:79 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: br0:  mtu 1500 qdisc noqueue state UP 
    link/ether 00:0c:29:8d:5a:36 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.230/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2001:c90:8224:afe:20c:29ff:fe8d:5a36/64 scope global dynamic 
       valid_lft 2591762sec preferred_lft 604562sec
    inet6 fe80::20c:29ff:fe8d:5a36/64 scope link 
       valid_lft forever preferred_lft forever

これでまた外からsshで繋げられるようになったので、作業もやりやすくなります。

ようやく仮想マシンを作成できるようになりました。あとはこれまでのやり方と同じですね。

[root@centos7 ~]# virt-install --name guest1 --ram 1024 \
> --disk path=/var/lib/libvirt/images/guest1.img,size=8 \
> --vcpus 1 \
> --os-type=linux --os-variant rhel7 \
> --network bridge=br0 \
> --graphics none \
> --console 'pty,target_type=serial' \
> --location 'http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64' \
> --extra-args 'console=ttyS0,115200n8 serial'

(参考文献)

いったんここまで。