このエントリーをはてなブックマークに追加

CentOS7.5のインストール

CentOS7の入手

まずはCentOSの公式サイトに行きます。
https://www.centos.org/

GET CENTOSをクリックします。


DVD ISOをクリックします。


これは、どのサーバーからダウンしても良いんですけど、大抵は一番上で良いでしょう。ただ、一番上はおそらくみんながみんな押すでしょうから、あんまし重いようなら2番目、3番目も試してみてください。


終わったら、.isoファイルをNEROやImgBurn等のランディングソフトでDVD-Rに書き込んでください。

CentOS7のインストール

焼いたDVDをサーバー機にセットして電源を入れます。当然ですが、あらかじめBIOSでDVDからブートするように設定しておいてください。デルのサーバーの場合、大抵は起動時にF11を押すと、BIOSの設定を変更することなく、一時的にブートするデバイスを選択できるので便利です。







言語の選択になります。日本人なら日本語が良いと思います。


データーセンターでによってはディスプレイを借りられる場合がありますが、困ったことにVGA(640x480)の表示能力しかないものしか借りられない場合があります。その場合、日本語が表示されると文字化けして読めなくなる事があるので、そういう場合は仕方なく英語にします。

まあ、最近はサーバーメンテナンス用の小型ディスプレイも出てますし、データーセンターに行く場合でもディスプレイぐらいは持参するのが良いかと思われます。

タイムゾーンは日本ならば東京に設定します。


インストールパッケージは、開発およびクリエイティブワークステーションを選択します。


アドオンは、DNSネームサーバー、開発ツール、メールサーバーを選択します。


ところが、ちょっと待ってください。この状態で最後までインストールを終えて、本稼働のためにIPをグローバグIPにしてリブートしたところ、二度とブートしなくなってしまいました。


どうやら、Login Serviceの起動に失敗しているようです。Login ServiceというのはGUIでユーザーIDを聞いてくる画面の事だと思うんですけど、なぜ??

考えられる事は3つ。

(1)CentOS7.4そのものがバグってる
(2)ファイルシステムをext4にしてソフトRAIDにすると大事なファイルが壊れる
(3)GUI起動に必要なファイルを壊してしまった

もし、(1)や(2)であれば今頃大騒ぎになっているはずなのですが、検索してもそんな話は出てこないので、おそらくそれはないかと。

(3)については、途中で、DB4、GD2、Fontconfig、Freetype等のアプリをDVDに入っているバージョンは使わずに、ソースをコンパイルしてインストールしたが、これらはGUIを起動するために必要なもので、かつ、DVDに最初から入ってるものを上書きしてはいけなかったのかもしれません。

これらはソースからコンパイルしてインストールしないと、PHPの./configureが通らなかったので仕方なかったのですが、やはり--prefix=/usrを指定して/usr直接入れたのはマズかったのかもしれません。

しかし、問題を切り分けているヒマはないので、疑わしい(1)(2)(3)をまとめて避ける事にします。

(1)については、ちょうどCentOS7.5が公開になったので、それを使う事にします。というか、このタイミングで7.5が公開されるところがけっこう怪しかったりもします。

(2)については、次はext4ではなくxfsでフォーマットする事にします。これまでずっとext4派だったのですが、またやり直しになるのではかなわないので。

(3)については、DB4、GD2は/usr/localにインストールする事にして、最初から入っている/usr直下のライブラリを上書きしないようにします。また、FreetypeとFontconfigはDVDに入っているバージョンでもPHPのコンパイルが通るようなのでDVDに入ってるRPMを使う事にします。

また、「開発およびクリエイティブワークステーション」はやめて、「最小インストール」にして、GUIは起動しないようにします。サーバーなのでGUIは必要ありませんし、最悪GD2やDB4を上書きしてしまっても、GUIを使わなければLogin Serviceが起動せずに止まってしまう事もないでしょう。

また、アドオンは「開発ツール」だけにします。あまり多くのアドオンを入れようとしても、「インストール後セットアップ作業の実行中」から先に進まなくなります。実際、CSヤクルト対巨人のプレイボール時に「インストール後セットアップ作業の実行中」になってから、試合終了になってまだ終わりませんでした。つまり、3時間半ずっと止まったままです。

サーバーをインストールしないといけない時ってのは、わりと緊急事態が多いため、インストールだけで3時間も4時間もかけるわけにはいきません。DVDからは最小インストールにしておき、必要なものは都度 RPMコマンドで入れる事にします。

サーバー機で操作

インストールが終わったらリブートがかかると思います。リブート後はハードディスクから起動して、CUIのログイン画面になると思います。(DVDから起動してしまう場合は、BIOSのブート設定を変更してください。)そしたら、サーバー機にrootでログインします。

Linuxのセットアップはサーバー機ではなく、Windows端末からPoderosaでログインした方がコピペができて楽なのですが、Windows端末からログインできる状態になるまではサーバー機で作業しなければなりません。

・ソフトRAIDの定期チェックをやめる
デフォルトの状態では、日曜の01:00にソフトRAIDのチェックがかかります。しかし、このチェックがかかっている間はサーバーが激重になるので、定期チェックを止めます。
vi /etc/sysconfig/raid-check

ENABLED=no

「こんな事をして大丈夫なのか?」と思うかもしれませんが、それとは別にバックアップ用に別のハードディスクをつけて、crontabで定期バックアップを入れています。これから設置するのは商用のサーバーではないので、クラッシュしても1日前の状態まで戻せれば十分だと思います。

・SELinuxをオフ
こんなのが動いていると、いくらやってもWindows端末からログインできない。そもそもこれが何なのか、どう設定すればいいのか、いくら検索しても私の脳みそでも理解できる説明をしてくれているサイトがどこにもない。というわけで、オフにします。

vi /etcv/sysconfig/selinux

SELINUX=disabled

不要なデーモンを止める

ここからはWindows端末からPoderosaで接続します。 デフォルトの状態では、sshdが単体で動いているので、Poderosaからsshで接続できると思います。

といっても、firewalldの設定が終わるまでは、しくじるとWindowsからログインできなくなるので、サーバー機はまだディスプレイとキーボードはつけたままにしておいてください。

インストール直後はサーバーの稼働に必要のないデーモンが多数起動しています。デーモンはできる限り少ない方がルート権限を乗っ取られるリスクが下がるため、不要なデーモンは起動時に起動しないようにします。

サーバー起動時に自動起動するデーモンを調べます。
ls -1 /etc/systemd/system/multi-user.target.wants/

この中から必要のないデーモンは、サーバー起動時に自動起動しないようにします。syslogdやcrondは止めないほうが良いでしょう。

例)
systemctl disable ModemManager.service
systemctl disable NetworkManager.service
systemctl disable abrt-ccpp.service
systemctl disable abrt-oops.service
systemctl disable abrt-vmcore.service
systemctl disable abrt-xorg.service
systemctl disable abrtd.service
systemctl disable atd.service
systemctl disable auditd.service
systemctl disable avahi-daemon.service
systemctl disable cups.path
systemctl disable cups.service
systemctl disable initial-setup-reconfiguration.service
systemctl disable irqbalance.service
systemctl disable kdump.service
systemctl disable ksm.service
systemctl disable ksmtuned.service
systemctl disable libstoragemgmt.service
systemctl disable libvirtd.service
systemctl disable nfs-client.target
systemctl disable postfix.service
systemctl disable remote-fs.target
systemctl disable rhel-configure.service
systemctl disable rngd.service
systemctl disable rpcbind.service
systemctl disable smartd.service
systemctl disable sysstat.service
systemctl disable tuned.service
systemctl disable vdo.service
systemctl disable vmtoolsd.service

これはあくまで例です。お使いの環境に応じて読み替えてください。終わったら、rebootコマンドでリブートします。

firewalldの設定

初期状態では、外部からのtelnetやftp、http接続が遮断されています。これではサービスを提供できなくなるため、必要なサービスを外部から接続できるようにします。

▽ここを参考にしました。ありがとうございました。
https://www.server-memo.net/centos-settings/firewalld/firewalld.html
https://eng-entrance.com/linux-centos-firewall
http://www.atmarkit.co.jp/ait/articles/1602/18/news019_4.html
http://hylom.net/firewalld-change-interface-permanent-can-not-affect-on-centos-7

・NICをpublicにする
NetworkManagerが動作している環境では、
firewall-cmd --zone=public --change-interface=em1 --permanent
と指定しても、サーバー起動時にNetworkManagerがゾーンを変更してしまうようです。この場合、nmcliコマンドで変更します。
nmcli connection modify em1 connection.zone public

しかし、今回は先の「不要なデーモンを止める」の設定でNetworkManagerを止めているため、firewall-cmdコマンドで設定する事にします。
firewall-cmd --zone=public --change-interface=em1
firewall-cmd --zone=public --change-interface=em1 --permanent

ネットワーク再起動
systemctl restart network

うまくいったかどうか確認
firewall-cmd --get-active-zones

・http、https、telnet、FTP、sendmail、pop3を許可
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --zone=public --add-service=telnet --permanent
firewall-cmd --zone=public --add-service=ftp --permanent
firewall-cmd --zone=public --add-service=smtp --permanent
firewall-cmd --zone=public --add-service=smtps --permanent
firewall-cmd --zone=public --add-service=pop3 --permanent
firewall-cmd --zone=public --add-service=dns --permanent
firewall-cmd --zone=public --add-service=ntp --permanent

dhcpv6を削除
firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

・サブミッションポートを有効にする
vi /usr/lib/firewalld/services/submission.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
 <short>submission</short>
 <description>mail transfer service</description>
 <port protocol="tcp" port="587"/>
</service>

firewall-cmd --zone=public --add-service=submission --permanent
ここで、
Error: INVALID_SERVICE: 'submission' not among existing services
と出てしまう場合は、10秒待ってから再度
firewall-cmd --zone=public --add-service=submission --permanent

・設定を有効にする
firewall-cmd --reload

・有効になったかどうか確認
firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: em1
  sources: 
  services: ssh http https telnet ftp smtp smtps pop3 dns ntp submission
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

・telnet,ftp,sshを内部LAN(192.168.0.xx)からのみにする場合
・telnet,ftp,ssh全許可のルールを廃止
firewall-cmd --zone=public --remove-service=ssh --permanent
firewall-cmd --zone=public --remove-service=telnet --permanent
firewall-cmd --zone=public --remove-service=ftp --permanent

・リッチルールを追加
▽ここを参考にしました。ありがとうございました。
https://rin-ka.net/rich-rules/
https://dan-project.blog.so-net.ne.jp/2015-09-13-1

firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.0.0/24 service name=telnet accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.0.0/24 service name=ssh accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.0.0/24 service name=ftp accept"

ここではローカルIPのみ接続を許可していますが、データーセンターに設置する場合は、ローカルIPではなく会社の固定IPからの接続を許可すると良いでしょう。ただし、外部からの直接接続を許可せずデーターセンターの同じラック内に踏み台用のサーバーを設置する場合、ローカルIPも引き続き許可しておきます。

・うまくいったか確認
firewall-cmd --list-all --zone=public --permanent

public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: http https smtp pop3 submission dns ntp smtps
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="192.168.0.0/24" service name="telnet" accept
    rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept
    rule family="ipv4" source address="192.168.0.0/24" service name="ftp" accept

全部終わったらリロード。
firewall-cmd --reload

設定のリロードは、設定が全て終わった後にやりましょう。じゃないと、telnetやsshのルールを削除した後に設定のリロードをすると現在の接続が切れてしまいます。最悪の場合、データーセンターに行かないといけなくなります。

・裏技
データーセンターは行くのも時間がかかるだけでなく、入館の手続きも面倒です。それに、できればサーバー室などという劣悪な環境の場所には入りたくありません。

そこで、firewalldの設定をいじる前にcrontabで、5分おきぐらいにfirewalldを止めるコマンドを入れておき、うまくいったらfirewalldを止めるコマンドをcrontabから外すという手もあります。ただし、firewall-cmdコマンドはfirewalldが止まっていると受け付けないので、設定は5分以内に済ませましょう。

・POP3について
この例ではPOP3は全開けになっています。POP3もLAN内部からしない時は別途tcp-wrapperやxinetd.d/pop3でアクセス制限しましょう。

NetworkManagerの設定

これまでCentOS4では、

・IPアドレスの変更
vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.0.4
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255

・デフォルトゲートウェイの変更
vi /etc/sysconfig/network
GATEWAY=192.168.0.2

・ネームサーバーの変更
vi /etc/resolv.conf
nameserver 192.168.0.2
search aufheben.info

ホスト名の変更
hostname www.aufheben.info

のように、設定ファイルを直接書き換えて行っていました。しかし、NetworkManagerが動作中の環境では、NetworkManagerが独自に設定値を持っており(どこに記録されてるのかわかりませんが)、
/etc/sysconfig/network
/etc/sysconfig/network/script/ifcfg-em1
/etc/resolv.conf
等の設定はファイルはNetworkManagerがサーバー起動時に書き換えてしまいます。したがって、NetworkManagerではこれらの設定ファイルを直接編集するのではなく、mncliコマンドで設定します。

・NetworkManagerを起動する
systemctl start NetworkManager.service
systemctl enable NetworkManager.service

・NICに割り当てられている名前の確認
NetworkManagerでは、NICは名前で指定します。なので、まず名前を調べます。
nmcli connection

NAME   UUID                                 TYPE     DEVICE
enp3s0 9a1aa7c5-c8fe-43b9-a699-cf08efbc559e ethernet enp3s0

この名前はCentOSインストール時に自動的に設定されます。今回はNICの名前はenp3s0のようです。

・nicに割り当てられているゾーンの変更
NetworkManagerが動作していない環境では、
firewall-cmd --zone=public --change-interface=enp3s0 --permanent
として変更するのですが、NetworkManager環境下ではいくらfirewalldで設定してもNetworkManagerが変更してしまいます。なので、nmcliコマンドで変更します。

▽ここを参考にしました。ありがとうございました。
http://hylom.net/firewalld-change-interface-permanent-can-not-affect-on-centos-7

・現在の設定を確認
firewall-cmd --get-active-zones

public
      interfaces: enp3s0

・NICをinternalに変更してみる。
nmcli connection modify enp3s0 connection.zone internal
・変更されたかどうか確認する
firewall-cmd --get-active-zones

internal
      interfaces: enp3s


・ホスト名の設定
▽ここを参考にしました。ありがとうございました。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_host_names_using_nmcli

CentOS4では、一時的にも恒久的にも同じようにhostname コマンドで変更していましたが、NetworkManager環境下では、nmcli general hostnameコマンドで変更します。

・現在のホスト名の確認
nmcli general hostname

・ホスト名の変更
nmcli general hostname www.aufheben.info
注意:これはあくまで例です。丸写しして本当に「www.aufheben.info」にしないように。

・IPv4関係の設定の変更
ここからは、IPアドレスやネットマスク、デフォルトゲートウェイ等のIPv4に関する設定を変更します。これらの設定はコマンドを入力した時点で即有効になるわけではなく、最後にupコマンド(後述)を発動させた時点で有効になります。

▽ここを参考にしました。ありがとうございました。
https://qiita.com/taro0219/items/8d3be39c5cb882d1ba5d
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/nmcli/
http://www.atmarkit.co.jp/ait/articles/1502/11/news001.html
http://te2u.hatenablog.jp/entry/2015/07/10/014214
https://go-journey.club/archives/4124
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/nmcli/

・ipv4関係の設定の確認
nmcli --fields ipv4 connection show enp3s0

ipv4.method:                            manual
ipv4.dns:                               192.168.0.2
ipv4.dns-search:                        aufheben.info
ipv4.dns-options:                       ""
ipv4.dns-priority:                      0
ipv4.addresses:                         192.168.0.5/24
ipv4.gateway:                           192.168.0.2
ipv4.routes:                            --
ipv4.route-metric:                      -1
ipv4.route-table:                       0 (unspec)
ipv4.ignore-auto-routes:                いいえ
ipv4.ignore-auto-dns:                   いいえ
ipv4.dhcp-client-id:                    --
ipv4.dhcp-timeout:                      0 (default)
ipv4.dhcp-send-hostname:                はい
ipv4.dhcp-hostname:                     --
ipv4.dhcp-fqdn:                         --
ipv4.never-default:                     いいえ
ipv4.may-fail:                          はい
ipv4.dad-timeout:                       -1 (default)

これらの設定を変更する場合、
nmcli connection modify enp3s0 ipv4.項目名 値
として変更します。

・IPを固定にする
nmcli connection modify enp3s0 ipv4.method manual
ここで、第5引数はstatic、dynamicではなく、manual、autoなので注意。

・IPアドレス、サブネットマスクを変更
たとえば、192.168.0.13/255.255.255.0に変更する場合、
nmcli connection modify enp3s0 ipv4.addresses 192.168.0.13/24
とします。ここで、サブネットマスクは255.255.255.0ではなく24と指定します。

・デフォルトゲートウェイを変更
例えば、192.168.0.1に変更する場合、
nmcli connection modify enp3s0 ipv4.gateway 192.168.0.1

・DNSを変更する
例えば、192.168.0.254に変更する場合、
nmcli connection modify enp3s0 ipv4.dns 192.168.0.254
DNSが複数ある場合は、
nmcli connection modify enp3s0 ipv4.dns "192.168.0.253 192.168.0.254"
というふうに""でくくった上でスペースで区切って指定します。

また、現在の設定を上書きせずに追加する時は、
+ipv4.dns
削除する時は、
-ipv4.dns
というコマンドも使えるみたいです。

▽ここを参考にしました。ありがとうございました。
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/nmcli/

・DNSのsearchの変更
nmcli connection modify enp3s0 ipv4.dns-search aufheben.net

・設定の反映
nmcli connection up enp3s0
とすると、NetworkManagerが/etc/以下の各種設定ファイルを更新した上で、IPアドレスやネットマスクを変更してくれます。IPアドレスを変更すると、sshから抜けてしまうので、Poderosaでもう1回新しいIPで入り直してください。

telnetとsshをxinetd経由で接続できるようにする

・DVD-ROMをマウントする
サーバー機の光学ドライブに、CentOSのインストールDVDを入れておいてください。
mount /dev/cdrom /mnt
以下は、/mntにDVDがマウントされているものとして話を進めますので、リブートした場合は必ずマウントしておいてください。

・wgetのインストール
cd /mnt/Packages
rpm -ivh wget-1.14-15.el7_4.1.x86_64.rpm

・locate、updatedbのインストール
rpm -ivh mlocate-0.26-8.el7.x86_64.rpm

・xinetdのインストール
rpm -ivh xinetd-2.3.15-13.el7.x86_64.rpm
xinetdを起動します。
systemctl start xinetd.service
サーバー起動時にxinetを起動させます。
systemctl enable xinetd.service

・telnetのインストール
cd /mnt/Packages
rpm -ivh telnet-0.17-64.el7.x86_64.rpm telnet-server-0.17-64.el7.x86_64.rpm

vi /etc/xinetd.d/telnet

# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
        only_from       = 192.168.0.0/24
        only_from      += 127.0.0.1
        only_from      += ::1
}

この例ではローカルIPからの接続のみを許可していますが、データーセンターに設置する場合は、192.168.0.0/24の部分は自分の会社のIP等にします。

xinetdを再起動します。
systemctl restart xinetd.service

・sshをxinetd経由に変更する
初期状態では、sshdが単体で常駐しています。しかし、sshdは過去に色々と脆弱性が問題になった事があるため、ここではxinetd経由で起動させるようにします。もちろん、xinetd経由にすれば必ずしも安全というわけではありません。どこからも接続がない時にsshdが常駐しなくなる事で脆弱性をつかれにくくなるだけです。もしxinetdに脆弱性が発見されれば、xinetd経由にした事でかえって危険になる場合もあります。

vi /etc/ssh/sshd_config

PermitRootLogin no
PermitEmptyPasswords no

vi /etc/xinetd.d/ssh

# default: on
# description: The ssh server serves ssh sessions; it uses \
# unencrypted username/password pairs for authentication.
service ssh
{
        disable         = no
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/sshd
        server_args     = -i
        log_on_failure += USERID
        only_from       = 192.168.0.0/24
        only_from      += 127.0.0.1
        only_from      += ::1
}

sshdを止めます。といっても、現在の接続は終わるまでは維持されます。
systemctl stop sshd.service
systemctl disable sshd.service
ここでうっかりPoderosaから抜けてしまうともう入れないので、サーバー機で
systemctl start sshd.service
と入力して再度Poderosaでログインしてやり直してください。

xinetdを再起動します。
systemctl restart xinetd.service

ここでPoderosaでログアウトして、実機で
ps ax | grep sshd
と入力してみてください。sshdというプロセスが起動してなければ、sshdは止まっています。止まってない場合は、サーバー機で
systemctl stop sshd.service
としてみてください、

この後、Poderosaからsshで接続してみてください。これで入れれば、sshdは正しくxinetd配下で起動しています。

vsftpdの設定

・vsftpdのインストール
cd /mnt/Packages/
rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm
rpm -ivh ftp-0.17-67.el7.x86_64.rpm

・設定ファイルの変更
vi /etc/vsftpd/vsftpd.conf

anonymous_enable=NO ←NOにする
chroot_local_user=YES ←コメントアウトを解除
listen=NO ←NOにする
listen_ipv6=NO ←NOにする
allow_writeable_chroot=YES ←ひな形にないので最後に追加

・xinetd経由で起動するようにする
vi /etc/xinetd.d/ftp

# default: on
# description: The ftp server serves ftp sessions; it uses \
# unencrypted username/password pairs for authentication.
service ftp
{
	instances       = 200
	flags           = REUSE
	socket_type     = stream
	wait            = no
	user            = root
	server          = /usr/sbin/vsftpd
	server_args     = /etc/vsftpd/vsftpd.conf
	log_on_failure += USERID
	disable         = no
        only_from       = 192.168.0.0/24
        only_from      += 127.0.0.1
        only_from      += ::1
}

systemctl restart xinetd.service

ここではローカルIPからの接続のみを許可していますが、レンタルサーバー等でftpを一般に公開するサーバーの時は、only_from行は記述しません。また、データーセンターに設置する時は、ローカルIPではなく会社の固定IPにしておきます。

シスログローテーションの設定

vi /etc/logrotate.conf

rotate 30 ←4を30に変更
compress ←コメントアウト解除

ここでは30としましたが、今はハードディスクにも余裕がかなりあるので、もっと長くても良いかもしれません。

エラーにならない事を確認
logrotate -d /etc/logrotate.conf

[注意] logrotate.confや、logrotate.conf.d以下を変更した時は、必ずエラーがない事を確認します。でないと、最悪apacheのログが2Gを越えてapacheが止まってしまいます。

sendmailの設定

sendmailをセッティングする前に、やらなければならない事があります。それは、ホスト名をドメイン名を含めたフルで指定する事です。
hostname ホスト名.ドメイン名
vi /etc/hostname

ホスト名.ドメイン名   

また、bindが起動していない場合は、bindなしでこのホスト名でIPが引けるようにしておかなければなりません。
vi /etc/hosts

192.168.0.5 ホスト名.ドメイン名      

これをやっておかないと、sendmailの起動が死ぬほど遅くなるので注意が必要です。なぜかは不明です。グリーティングメッセージで使うためか、ホスト名をどうにかして引こうとするためかもしれません。

・postfixを止める
別にpostfixが嫌いなわけではありません。仕事の都合でsendmailの設定の方がpostfixやqmailよりも詳しくなってしまったので、sendmailを使っているだけです。
systemctl stop postfix.service
systemctl disable postfix.service

・sendmailをインストール
cd /mnt/Packages
rpm -ivh sendmail-8.14.7-5.el7.x86_64.rpm sendmail-cf-8.14.7-5.el7.noarch.rpm \
cyrus-sasl-2.1.26-23.el7.x86_64.rpm \
hesiod-3.2.1-3.el7.x86_64.rpm \
procmail-3.22-36.el7_4.1.x86_64.rpm

・mailxをインストール
これを入れないと、mailコマンドで動作テストができなくなります。
rpm -ivh mailx-12.5-19.el7.x86_64.rpm

・開始
systemctl start sendmail.service
systemctl enable sendmail.service

・デリバリーモードをiからqにする
初期設定では、デリバリーモードはinteractive(即配信)となっています。普通はこれでも良いのですが、スパムメール・・・じゃなくて、メルマガ配信など一度に大量のメールを配信するサーバーの場合、デリバリーモードはqueue(キューにためてから配信)にした方が良いです。

しかし、現バージョンではCentOS4にあった、
define(`confDELIVERY_MODE', `q')dnl
が通用しません。現バージョンでは、デリバリーモードはsendmail起動時に引数で指定します。引数は、/etc/sysconfig/sendmailに設定しておくと、sendmail起動時に自動的に指定されます。

vi /etc/sysconfig/sendmail

SENDMAIL_OPTS="-q16s -ODeliveryMode=q"

sendmailの引数は大文字小文字にうるさいので注意。全部小文字だと無視されます。大文字小文字を間違えずにDeliveryModeと記述しましょう。

▽ここを参考にしました。ありがとうございました。
https://qiita.com/nntsugu/items/8f721a71c35241e3f2f6

・sendmailの起動、自動起動の設定
systemctl start sendmail.service
systemctl enable sendmail.service

・動作テスト
cd /var/spool/mqueue
mail root
Subject: test
test
.
ls
ここで、16秒後に再びlsとしてキューがなくなる事を確認します。

・受信するドメインの設定
sendmailでは、local-host-namesに記載されたドメイン宛のメールが来たら自分宛だと判断し、それ以外の宛先なら指定された宛先に配信します。

ここで注意しなければならないのは、お客さんに「バーチャルホストを追加してください」と依頼された場合、大抵はapacheの設定しか思いつかず、ブラウザからアクセスできれば良いと判断してしまいがちです。しかし、お客さんはそのドメインでもメールも届くであろうと思って依頼してますので、ちゃんとlocal-host-namesにも新ドメイン名を追加しておきましょう。

vi /etc/local-host-names

ここに受信するドメイン名を記述します。
複数記述する時は改行で区切ります。

・中継許可の設定
sendmailでは、local-host-namesに記載されたドメイン宛以外のメールが来た場合、アドレスの@の後ろをdnsに問い合わせて、そこに配信します。しかし、これでは悪意を持った第三者に大量の迷惑メールの配信するための踏み台にされてしまいます。実際、sendmailの初期バージョンではそうなっていました。

そこで、現バージョンのsendmailでは、他のサーバー宛のメールは/etc/mail/accessに記載されたアドレスからのみ受け付けるようになっています。

cd /etc/mail
vi access

Connect:localhost.localdomain           RELAY
Connect:localhost                       RELAY
Connect:127.0.0.1                       RELAY
Connect:192.168.0                       RELAY

初期設定では 自分自身からのメールからしか外部送信をしない設定になっています。ここに、192.168.0を追加する事で、内部LANからのメールを受けるけるようにします。

/etc/accessは実際にはハッシュの方(access.db)が使われるため、ハッシュを作成しておきます。
makemap hash access < access

STARTTLSを有効にする

▽ここを参考にしました。ありがとうございました。
https://blog.apar.jp/linux/8587/
https://server-setting.info/centos/private-ca-cert.html

・プライベート証明局の作成
cd /etc/pki/tls/
cp openssl.cnf openssl.cnf_org
cp openssl.cnf openssl-ca.cnf
vi openssl-ca.cnf

[ usr_cert ]
basicConstraints=CA:TRUE ←TRUEにする
[ v3_ca ]
nsCertType = sslCA, emailCA ←コメントアウトを外す

シリアル番号を設定
echo '1000' > /etc/pki/CA/serial

cd /etc/pki/tls/
export SSLEAY_CONFIG="-config /etc/pki/tls/openssl-ca.cnf"
/etc/pki/tls/misc/CA -newca

Enter PEM pass phrase:1234
Verifying - Enter PEM pass phrase:1234
(あとは設問に従って答える)
Enter pass phrase for /etc/pki/CA/private/./cakey.pem:1234

しかし、CAコマンドは同じ事を2回やろうとすると2回目はスカになってしまいます。特に入力はバックスペースが効かないので、入力をミスるとやり直すしかないのに、やり直そうとしても2回目がスカで何もせずに抜けてしまうので困ったもんです。これを作った人はヒューマンエラーを何だと思ってるんでしょう?

もし間違えてやり直す場合は
/etc/pki/CA/newcerts/
/etc/pki/CA/private/
以下のファイルを消してからやり直しましょう。

間違えずに無事プライベート証明局を作成できた場合は、
cd /etc/pki/CA/
mkdir /etc/mail/cert
cp cacert.pem /etc/mail/cert

ここで、
cacert.pem はプライベート証明局
careq.pem はプライベート証明局を作った時に使ったCSR
private/cakey.pem は、はプライベート証明局を作った時に使った秘密鍵
です。

・自己証明書の作成
cd /etc/pki/tls/
cp openssl.cnf openssl-server.cnf
vi openssl-server.cnf

[ usr_cert ]
nsCertType = server ←コメントアウトを外す

cd /etc/pki/tls/
export SSLEAY_CONFIG="-config /etc/pki/tls/openssl-server.cnf"
/etc/pki/tls/misc/CA -newreq

Enter PEM pass phrase:1234
Verifying - Enter PEM pass phrase:1234
(後は設問に従って答える)

例によって間違えると2回目からはスカになってしまうので、もし間違えてやり直す場合は
/etc/pki/CA/newcerts/
/etc/pki/CA/private/
以下のファイルを消してからやり直しましょう。

ls
newkey.pem は秘密鍵
newreq.pem はCSR

cp newkey.pem /etc/mail/cert/key.pem
cd /etc/pki/tls/
export SSLEAY_CONFIG="-config /etc/pki/tls/openssl-server.cnf"
/etc/pki/tls/misc/CA -sign

Enter pass phrase for /etc/pki/CA/private/cakey.pem:1234

間違えた場合は2回目からスカになってしまうので(以下略)。つか、入力をミスると2回目からスカになるのをどうにかしてくれないかと。(どういう理由で起動しないのか、というエラーメッセージすら出ない)

ls
newcert.pem は自己証明書

もしここで、
failed to update database
TXT_DB error number 2
と表示された場合はどこかに操作ミスがあります。この場合、
cd /etc/pki/CA
rm index.txt
touch index.txt
としてからやり直します。

▽ここを参考にしました。ありがとうございました。
http://www.goofoo.jp/2012/06/2026
https://qiita.com/nao-otsu/items/a7b87baa34c6a086fd64

自己証明書のサイズが0でなければ、自己証明書のコピーします。
cp newcert.pem /etc/mail/cert/cert.pem

・秘密鍵からパスフレーズを削除
cd /etc/mail/cert/
openssl rsa -in key.pem -out key.pem

Enter pass phrase for key.pem: 1234

・秘密鍵を第三者に見えなくする
chmod 600 key.pem

これで準備は完了ですが、STARTTLSは次のSMTP-AUTHと一緒に起動させる必要があるため、動作テストは次の項目で一緒にやります。

SMTP-AUTHを有効にする

▽ここを参考にしました。ありがとうございました。
https://server-setting.info/centos/sendmail_2_submission_port.html

・SASLのインストール
sendmail.mcに、Please remember that saslauthd needs to be running for AUTH.(認証のためにsaslauthdを走らせる必要がある事を思い出せ)とあるので、起動させる。

cd /mnt/Packages
rpm -ivh \
cyrus-sasl-md5-2.1.26-23.el7.x86_64.rpm \
cyrus-sasl-plain-2.1.26-23.el7.x86_64.rpm \
cyrus-sasl-scram-2.1.26-23.el7.x86_64.rpm
systemctl start saslauthd
systemctl enable saslauthd

・SASLの設定
cd /etc/sasl2
cp Sendmail.conf Sendmail.conf_org
cp smtpd.conf smtpd.conf_org
vi Sendmail.conf

pwcheck_method:auxprop

vi smtpd.conf

pwcheck_method:auxprop


・DIGEST-MD5、CRAM-MD5を有効にする
cd /etc/mail
vi sendmail.mc

頭のdnlを消してコメントアウトを解除する
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl

初期状態では自分自身からのメールしか受け取らない設定になっているので、Addr=127.0.0.1,を消す。

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
↓
DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl


・逆引きが一致しないアドレスからのメールも受け取る
初期の状態だと、相手のSMTPサーバーの名乗ってきたドメインと、IPの逆引き名が一致しないアドレスから来たメールを、「550 Relaying denied. IP name possibly forged」(リレー拒否。IP逆引き名はおそらく詐称) と言って拒否してしまいます。しかし、逆引き名が複数設定してあるサーバーの場合、相手が名乗ってきたドメインと一致するドメインを逆引きできない場合もあり、この設定はすべきではありません。

なので、ここでは逆引きが一致しないアドレスからのメールも受け取る設定に変更します。

vi /usr/share/sendmail-cf/m4/proto.m4

dnl R<FORGED> $#error $@ 5.7.1 $: "550 Relaying denied. IP name possibly forged " $&{client_name}

・sendmailのバージョンを隠す
sendmailのバージョンを隠す方法として、今まではずっとsendmail.cfを直接書き換えていました。しかし、その方法だとsendmail.mcに何か変更があった時に、

m4 sendmail.mc > sendmail.cf

ってやるたびに、sendmail.cfの該当箇所が元に戻ってしまうので、そのたびにまたやり直しになってしまいました。ところが、Google検索したところ、sendmail.mcに手を加える事でバージョンを隠す事ができるみたいです。

▽ここを参考にしました。ありがとうございました。
http://www.atmarkit.co.jp/ait/articles/0710/19/news137_2.html

つまり、SMTP_LOGIN_MSGと、RECEVIER_HEADERという変数に25番ポート接続時の挨拶や、メールのヘッダー情報を定義してあげれば良いみたいです。では、さっそくやってみましょう。(ちなみに、参照サイトでは、一部`が'になっている所があったので、こちらでは修正してあります。)

cd /etc/mail
vi sendmail.mc

dnl define(`confSMTP_LOGIN_MSG', `$j Sendmail; $b')dnl
の下に以下を追加
define(`confSMTP_LOGIN_MSG',`unknown')dnl
define(`confRECEIVED_HEADER',`$?sfrom $s $.$?_($?s$|from $.$_) $.$?{auth_type}(authenticated)$.by $j(unknown)$?r with $r$. id $i$?ufor $u; $|;$.$b')dnl

m4 sendmail.mc > sendmail.cf
systemctl restart saslauthd
systemctl restart sendmail

・うまくいったかどうか確認する
telnet localhost 587
EHLO localhost

250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN

この行があれば成功

・STARTTLSを有効にする
▽ここを参考にしました。ありがとうございました。
https://server-setting.info/centos/sendmail_4_smtps_ssltls.html

vi sendmail.mc

以下の頭のdnlを消してコメントアウトを解除した上で、パスを書き換える
define(`confCACERT_PATH', `/etc/mail/cert')dnl
define(`confCACERT',      `confCACERT_PATH/cacert.pem')dnl
define(`confSERVER_CERT', `confCACERT_PATH/cert.pem')dnl
define(`confSERVER_KEY',  `confCACERT_PATH/key.pem')dnl

以下の頭のdnlを消してコメントアウトを解除する
DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl

m4 sendmail.mc > sendmail.cf
systemctl restart saslauthd.service
systemctl restart sendmail.service

・うまくいったか確認する
telnet localhost 587
EHLO localhost
とやってみて、表示されるリストに
250-STARTTLS
があれば成功です。

・うまくいかなかった場合
もしEHLOコマンドに
250-STARTTLS
がない場合、シスログを確認してみてください。
cat /var/log/maillog
STARTTLS=server: file /etc/mail/cert/key.pem unsafe: Group readable file
とあった場合、「秘密鍵が第三者に丸見えだぞー」という意味なので、パーミッションを変更します。
cd /etc/mail/cert
chmod 600 key.pem

STARTTLS=server, error: SSL_CTX_use_certificate_file(/etc/mail/cert/cert.pem) failed
とあった場合、自己証明書そのものが壊れています。自己証明書の作成からやり直してください。

・SASLにユーザの登録
/usr/sbin/saslpasswd2 -u ドメイン名 ユーザー名
パスワードを2回入れます。

この場合、メールソフトに入力するユーザー名が「ユーザー名@ドメイン名」となります。ユーザー名だけではないので注意が必要です。(@も含めてフルで指定します。)


・不正中継チェック
サーバーをグローバルIPに切り替えた後で、
https://mxtoolbox.com/diagnostic.aspx
にアクセスして、Mail Serverの欄に新サーバーのアドレスを入れます。

viをカラーにする

viをカラーにするためには、vim-enhancedというパッケージをインストールする必要があります。
rpm -ivh vim-enhanced-7.4.160-4.el7.x86_64.rpm \
vim-common-7.4.160-4.el7.x86_64.rpm \
vim-filesystem-7.4.160-4.el7.x86_64.rpm \
gpm-libs-1.20.7-5.el7.x86_64.rpm

・オートインデントオフ
このままでは、Poderosaからサーバーのviにコピペする際に勝手にインデントされてしまい、行がどんどんズレてしまうので、オートインデントをオフにします。といいますか、なぜにオートインデントが標準なのでしょう?そもそも、サーバー上でプログラム作りませんって。普通はWindows機で作ってFTPでうpするでしょ?

vi /etc/vimrc

set nocompatible " Use Vim defaults (much better!)
set bs=indent,eol,start " allow backspacing over everything in insert mode
の下に以下を足す
set paste
set ruler

set rulerはすぐ上に set ruler " show the cursor position all the time という行があるのですが、右側にコメントあるせいで有効になってないので、すぐ下に足します。どうも、set rulerコマンドはコメントが使えない(「余分が文字が右側にあります」というエラーになる)のに、/etc/vimrcファイルを作った人がそれを知らなかったようです。

・vi2というコマンドを新設する
/usr/bin/vim -u /etc/vimrc /usr/local/bin/vi2

#!/bin/sh
/usr/bin/vim -u /etc/vimrc $1

chmod 755 /usr/local/bin/vi2

・起動時にvi=vi2と定義する
vi /etc/profile.d/vi2.sh

alias vi=vi2

いったんPoderosaから抜けて、ログインし直します。

・うまくいったか確認
vi /etc/aliases
カラーになれば成功。

NTPのインストール

cd /mnt/Packages
rpm -ivh ntp-4.2.6p5-28.el7.centos.x86_64.rpm \
autogen-libopts-5.18-5.el7.x86_64.rpm \
ntpdate-4.2.6p5-28.el7.centos.x86_64.rpm

cd /etc
mv ntp.conf ntp.conf_org
vi /etc/ntp.conf

restrict default ignore
restrict localhost
restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery

server 210.173.160.27 # MFEED(ntp1.jst.mfeed.ad.jp)
server 210.173.160.57 # MFEED(ntp2.jst.mfeed.ad.jp)
server 210.173.160.87 # MFEED(ntp3.jst.mfeed.ad.jp)

driftfile /etc/ntp/drift
authenticate no
broadcastdelay  0.008

touch /etc/ntp/drift
touch /etc/ntp/drift.TEMP
chmod 666 /etc/ntp/drift
chmod 666 /etc/ntp/drift.TEMP
systemctl start ntpd.service
systemctl enable ntpd.service

従来は、restrict 127.0.0.1と書いていましたが、どういうわけかこれだと動作しません。原因はよくわかりませんが、IPv6環境で自分自身に対して制限なしで許可したい場合は、localhostもしくは::1と書かないとダメみたいです。

うまくいったか確認します。
ntpq -p

QPOPPERのインストール

・ソースディレクトリを作成
どこでも良いのですが、サーバー上にソースをコンパイルするためのディレクトリを作成します。
例)
mkdir /usr/local/src/targz
ここからは/usr/local/src/targzを「ソースディレクトリ」と呼びます。

・ソースのコンパイルとインストール
cd ソースディレクトリ
wget https://fossies.org/linux/misc/old/qpopper4.1.0.tar.gz
tar xvzf qpopper4.1.0.tar.gz
cd qpopper4.1.0
./configure --enable-special-auth --enable-log-login --enable-shy
make
make install

引数の意味
--enable-special-auth shadowパスワードに対応させます。
--enable-log-login ログにログイン情報を残します。
--enable-shy POP3接続時にバージョンを隠します。

・xinetd経由で起動するようにする
vi /etc/xinetd.d/popper

# default: on
# description: The wu-ftpd FTP server serves FTP connections. It uses \
# normal, unencrypted usernames and passwords for authentication.
service pop3
{
        disable = no
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/local/sbin/popper
        server_args             = -t /var/log/pop3.log -R
        only_from               = 192.168.0.0/24
        only_from              += 127.0.0.1
        only_from              += ::1
}

server_argsの意味
-s ログをsyslogに入れる
-t ファイル名 ログをシスログではなく指定されたファイルに入れる
-R ログに逆引き名を入れない

逆引きをしていない回線からのアクセスがあった場合、qpopperはまず逆引きを試みた後、逆引きができない場合は仕方なくIPアドレスをログに記録します。しかしながら、逆引きしてないIPからのアクセスでは、逆引きを試みてからタイムアウトするまでが非常に時間がかかるため、広く公開するサーバー(レンタルサーバーなど)では-Rを入れたほうが良いかと思われます。

ここではローカルIPからの接続のみを許可していますが、広く一般に公開するサーバーの時はonly_from行は記述しません。

・xinetdの再起動
systemctl restart xinetd.service
telnetから抜けてしまうと思うので、Poderosaで入り直します。

・うまくいったか確認
telnet localhost 110
user ユーザー名
pass パスワード
+OKと出れば成功
quit

BINDのインストール

cd /mnt/Packages
rpm -ivh \
bind-9.9.4-61.el7.x86_64.rpm \
bind-libs-9.9.4-61.el7.x86_64.rpm \
bind-utils-9.9.4-61.el7.x86_64.rpm
systemctl start named
systemctl enable named

次にチェンジルートの指定を解除します・・・といいたい所ですが、CentOS7ではnamedとchrootは別々のサービスで動いているようです。したがって、チェンジルートサービスを別途インストールさえしなければ、特に何もしなくてもチェンジルートされないようです。

▽ここを参考にしました。ありがとうございました。
https://www.aozorawaon.com/?p=109

・named.confのオリジナルを保存
大幅に設定をミスって最初の状態に戻したい場合がよくあるので、最初から入っているファイルは残しておく方が無難です。
cd /etc
cp named.conf named.conf_org

・ローカルネットからのlookupを有効にする
vi named.conf

頭にこれを追加
acl localnet {
        192.168.0.0/24;
        127.0.0.1;
};

allow-query     { localhost; };
を
allow-query     { localnet; };
に変更。


listen-on port 53 { 127.0.0.1; };
を
listen-on port 53 { 127.0.0.1; 192.168.0.5; };
に変更。ただし192.168.0.5は例です。実際にはお使いのサーバーのIPアドレスにしてください。

・前バージョンからの変更
今までは、 IN NSで指定したネームサーバーのIPアドレスが設定されてなくても特にエラーにはならなかったのですが、現バージョンではネームサーバーのIPが存在しないとエラーになってしまいます。

▽ここを参考にしました。ありがとうございました。
http://kazuminkun.hatenablog.com/entry/2015/05/31/094623

なので、きちんとネームサーバーのIPアドレスにもAレコードつきでIPアドレスを設定しておきます。本当は今までもそうじゃないといけなかったのですが、現バージョンではエラーのチェックがより厳密になったという事でしょう。

・IPアドレスを切り替える場合の注意
サーバーセッティング中はローカルIPにしておき、本稼働させる時はグローバルIP(もしくは、NATでグローバルIPに接続されているIP)に切り替えると思います。

IPを切り替えた時は、/etc/named.confのlisten-on port 53 {・・・ の項目も変更しておかないと、外部(自分自身以外)からの問い合わせを受け付けなくなるので注意してください。よく忘れがちなので注意してください。

・IPv6非対応にする
上位のルーターがIPv6に対応してない場合に、/var/log/messagesに大量にエラーが記録されてしまうので、IPv6非対応にします。ただし、この記事を書いている2019年1月2日時点ではそれでも良いのですが、近い将来IPv6が当たり前になる日も来るかもしれないので、その場合はこの設定はしないでください。

▽ここを参考にしました。ありがとうございました。
http://maeken.hateblo.jp/entry/2014/11/03

vi /etc/sysconfig/named

# BIND named process options
# ~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# OPTIONS="whatever"     --  These additional options will be passed to named
#                            at startup. Don't add -t here, enable proper
#                            -chroot.service unit file.
#                            Use of parameter -c is not supported here. Extend
#                            systemd named*.service instead. For more
#                            information please read the following KB article:
#                            https://access.redhat.com/articles/2986001
#
# DISABLE_ZONE_CHECKING  --  By default, service file calls named-checkzone
#                            utility for every zone to ensure all zones are
#                            valid before named starts. If you set this option
#                            to 'yes' then service file doesn't perform those
#                            checks.
OPTIONS="-4"   ←追記する

systemctl restart named

apacheのインストール

RPMで入れてしまえば一発なのですが、apache、PostgreSQL、PHPに関してはコンパイルオプションに独自にものを使いたいのと、脆弱性が発見される毎に頻繁にバージョンアップさせたいので、ソースからコンパイルしてインストールします。特にapacheに関してはDVDに標準で入っているバージョンは攻撃を受けやすいため、できる限り避けます。

しかし、なにもapacheが必要とするライブラリまでソースからコンパイルする必要もないでしょうから、apache、PostgreSQL、PHP以外はできる限りRPMを使う事にします。

・lynxのインストール
mount /dev/cdrom /mnt
cd /mnt/Packages
rpm -ivh lynx-2.8.8-0.3.dev15.el7.x86_64.rpm \
centos-indexhtml-7-9.el7.centos.noarch.rpm

・apr-devel、apr-util-develのインストール
rpm -ivh \
apr-devel-1.4.8-3.el7_4.1.x86_64.rpm \
apr-util-devel-1.5.2-6.el7.x86_64.rpm \
expat-devel-2.1.0-10.el7_3.x86_64.rpm \
libdb-devel-5.3.21-24.el7.x86_64.rpm \
openldap-devel-2.4.44-13.el7.x86_64.rpm \
cyrus-sasl-devel-2.1.26-23.el7.x86_64.rpm

・pcre-develのインストール
rpm -ivh pcre-devel-8.32-17.el7.x86_64.rpm

・openssl-develのインストール
cd /mnt/Packages
rpm -ivh openssl-devel-1.0.2k-12.el7.x86_64.rpm \
krb5-devel-1.15.1-18.el7.x86_64.rpm \
zlib-devel-1.2.7-17.el7.x86_64.rpm \
keyutils-libs-devel-1.5.8-3.el7.x86_64.rpm \
libcom_err-devel-1.42.9-11.el7.x86_64.rpm \
libselinux-devel-2.5-12.el7.x86_64.rpm \
libverto-devel-0.2.5-4.el7.x86_64.rpm \
libsepol-devel-2.5-8.1.el7.x86_64.rpm \
libkadm5-1.15.1-18.el7.x86_64.rpm

・apache2.4.35のインストール
ここからはソースをコンパイルします。

cd ソースディレクトリ
wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.35.tar.gz
tar xvzf httpd-2.4.35.tar.gz
cd httpd-2.4.35
./configure \
--enable-modules=all \
--enable-so \
--enable-ssl \
--enable-rewrite \
--with-apr=/usr \
--with-expat=builtin

make
make install

・SSLキー作成
cd /usr/local/apache2/conf
mkdir sslkey
cd sslkey
openssl md5 /var/log/messages > rand.dat
openssl genrsa -rand rand.dat -des3 1024 > key.pem
(パスフレーズは123456)
cp key.pem key_in_pass.pem
openssl rsa -in key.pem -out key.pem
(パスフレーズは123456)

・CSRの作成
openssl req -new -days 365 -key key.pem -out csr.pem
自己証明の時は、質問事項は全部Enterキーで飛ばしてください。商用サーバーの時は、真面目にちゃんと質問された項目を正確に入力してください。バックスペースキーが効かないので慎重に。

・自己証明書の作成
openssl x509 -in csr.pem -out jiko_cert.pem -req -signkey key.pem -days 365
ただ、今どき(2018年現在)のブラウザで自己証明書なんか使ってたら、まず警告が出てアクセスできません。

商用サーバーの場合、CSRの質問事項に対して真面目に入力して、ベリサイン等の公的な証明機関に送って正しい証明書を発行してもらう必要があります。当然ですが、その際にはCSRで入力した会社名が実在するかどうかの審査があります。ベリサインの場合、登記簿謄本の提出を求められます。

・ログディレクトリ作成と、ローテーションの設定
mkdir /var/log/apache
chown apache.apache /var/log/apache
vi /etc/logrotate.d/apache

/var/log/apache/*log {
        create 0644 apache apache
        missingok
        sharedscripts
        postrotate
                /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
        endscript
}

終わったらエラーにならない事を確認します。ここでエラーがあるようだと、ログのローテーションが行われずにログが2Gを越えてapacheが止まったりしますので、注意が必要です。
logrotate -d /etc/logrotate.conf

・自動起動スクリプトの作成
▽ここを参考にしました。ありがとうございました。
http://d.hatena.ne.jp/rougeref/20170815

vi /usr/lib/systemd/system/apache.service

[Unit]
Description=The Apache HTTP Server (/usr/local/apache2)
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecReload=/usr/local/apache2/bin/apachectl restart
ExecStop=/usr/local/apache2/bin/apachectl stop
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

・起動
systemctl start apache.service
systemctl enable apache.service

・チューニング
vi /usr/local/apache2/conf/httpd.conf

User apache
Group apache
ServerAdmin 管理者のメールアドレス
ServerName ホスト名

<IfModule dir_module>
     DirectoryIndex index.html index.php index.cgi
</IfModule>

AddType application/x-httpd-php .php .html

ErrorLog "/var/log/apache/error.log"
CustomLog "/var/log/apache/access.log" combined
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

▽以下はコメントアウトを解除
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule socache_dbm_module modules/mod_socache_dbm.so
LoadModule socache_memcache_module modules/mod_socache_memcache.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule rewrite_module modules/mod_rewrite.so
Include conf/extra/httpd-ssl.conf
Include conf/extra/httpd-vhosts.conf

・CGIが動かない場合
従来のapacheではmod_cgid.soなしでも標準でCGIが稼働したのですが、現バージョンではmod_cgid.soがないとCGIが動作せずにソースが表示されてしまうようです。

▽ここを参考にしました。ありがとうございました。
http://blog.netandfield.com/shar/2012/08/mod-cgid.html

vi /usr/local/apache2/conf/httpd.conf

▽以下コメントアウトを外します。
LoadModule cgid_module modules/mod_cgid.so

▽以下Scriptsock cgisockのコメントアウトを外します。
<IfModule cgid_module>
    #
    # ScriptSock: On threaded servers, designate the path to the UNIX
    # socket used to communicate with the CGI daemon of mod_cgid.
    #
    Scriptsock cgisock
</IfModule>

以下はコメントアウトします。
    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"

apacheにmod_なんとか.soを追加(=コメントアウトを解除)した時は、restartでは追加モジュールは読み込まれず、いったん止めて再起動しないとダメみたいです。
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
ls /usr/local/apache2/logs/
cgisock.4300
これが作られていれば成功です。

▽ここを参考にしました。ありがとうございました。
http://www1.txt-nifty.com/blog/2012/12/apache-242cgi-d.html
http://d.hatena.ne.jp/rougeref/20120521
http://kotsukotsublog.blogspot.com/2013/03/apachecgidunable-to-connect-to-cgi.html

・SSLを動かす
vi /usr/local/apache2/conf/extra/httpd-ssl.conf

SSLCertificateFile /usr/local/apache2/conf/sslkey/jiko_cert.pem
SSLCertificateKeyFile /usr/local/apache2/conf/sslkey/key.pem
ServerAdmin 管理者のメールアドレス
ServerName ホスト名
ErrorLog "/var/log/apache/ssl-error.log"
TransferLog "/var/log/apache/ssl-access.log"
CustomLog "/var/log/apache/ssl_request_log" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

もっとも、自己証明書なのでSSLが動いたところでブラウザが拒否するでしょうけど・・・。

・バーチャルホストを有効にする
vi /usr/local/apache2/conf/extra/httpd-vhosts.conf

最初から書いてあるバーチャルホストの設定は全てコメントアウト。
最後の行に
Include virtconf.d/*.conf

cd /usr/local/apache2
mkdir virtconf.d
cd virtconf.d
vi バーチャルホスト名.conf

<VirtualHost *:80>
  ServerName バーチャルホスト名
  DocumentRoot /usr/local/apache2/htdocs
  CustomLog /var/log/apache/access.log combined
  ErrorLog /var/log/apache/error.log
</VirtualHost>

たまに、本当に「バーチャルホスト名.conf」というファイルを作って、「動かねえぞゴルァ」って言ってくる大ボケの人がいますが、バーチャルホスト名.confの部分は「software.aufheben.info.conf」みたいに、お使いのバーチャルホスト名を入れてくださいね。

・パスを通す
vi /etc/profile.d/apache.sh

PATH="$PATH":/usr/local/apache2/bin

ただし、/etc/profile.dに記述したスクリプトはログイン時に有効になるので、いったんtelnetを抜けて入り直します

入り直した後、apachectlというコマンドがパスなしで直接使えれば成功です。

PostgreSQLのインストール

・readline-develのインストール
cd /mnt/Packages/
rpm -ivh readline-devel-6.2-10.el7.x86_64.rpm \
ncurses-devel-5.9-14.20130511.el7_4.x86_64.rpm

・PostgreSQLのソースのコンパイルとインストール
cd ソースディレクトリ
wget https://ftp.postgresql.org/pub/source/v10.5/postgresql-10.5.tar.gz
tar xvzf postgresql-10.5.tar.gz
cd postgresql-10.5
./configure
make
make install

・データーベース初期化
useradd postgres
chmod 777 /usr/local/pgsql
su - postgres
/usr/local/pgsql/bin/initdb --encoding=EUC_JP --no-locale -D /usr/local/pgsql/data
exit
chmod 755 /usr/local/pgsql

・ログのローテーションの設定
mkdir /var/log/pgsql
chown postgres.postgres /var/log/pgsql
vi /etc/logrotate.d/postgres

/var/log/pgsql/*log {
    create 0644 postgres postgres
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `head -1 /usr/local/pgsql/data/postmaster.pid  2> /dev/null` 2> /dev/null || true
    endscript
}

エラーが出ない事を確認
logrotate -d /etc/logrotate.conf

・自動起動スクリプトの作成
▽ここを参考にしました。ありがとうございました。
http://d.hatena.ne.jp/rougeref/20170815

vi /usr/lib/systemd/system/postgresql.service

[Unit]
Description=PostgreSQL Database Server (/usr/local/pgsql/)

[Service]
Type=forking
User=postgres
ExecStart=/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /var/log/pgsql/postgres.log start
ExecStop=/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -m fast stop
ExecReload=/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -m fast restart
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

/etc/rc.d/init.dに書いていた時代とは異なり、ExecStart=の後にsuコマンドを入れるとエラーになってしまうので、実行するユーザーは
User=postgres
として指定します。これによって、systemdがユーザーを切り替えてから実行してくれます。

▽ここを参考にしました。ありがとうございました。
http://engineer-milione.com/tips/centos7postgres.html

・起動
systemctl start postgresql.service

・動作確認
ps ax | grep postgres
もしpostgresが常駐してないようなら、ログを見て問題を修正します。
cat /var/log/pgsql/postgres.log

・サーバー起動時に自動起動
systemctl enable postgresql.service

・パスを通す
PostgreSQL関係のコマンド(psqlやpg_dumpやvacuumdbなど)をフルパスで入力しなくても良いように、パスを通しておきます。
vi /etc/profile.d/postgresql.sh

export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
export PGHOST=127.0.0.1
PATH="$PATH":/usr/local/pgsql/bin

ただし、/etc/profile.dに記載したスクリプトはログイン時に有効になるので、いったんtelnetを抜けて入りなおします。入りなおしたら、
psql -U postgres -l
としてパスが通っている事を確認します。

・PostgreSQL8からの互換性のない変更
PostgreSQL9以降からは、psql、pg_dump、vacuumdbコマンドにホストの指定(-h ホスト)が必須となっています。ホストを指定しないと、 「TCP/IP connections on port 5432?」というエラーになってしまいます。

しかし、これではいささか面倒なので、/etc/profile.d/postgresql.shに
export PGHOST=127.0.0.1
を追加しています。

ただし、/etc/profile.d/postgresql.shはtelnetやsshでログインした時に自動的に実行されるスクリプトであって、crontab内では使うことができません。もしcrontabでpg_dumpやvacuumdbをする場合は、pg_dumpやvacuumdbコマンドに -h 127.0.0.1を入れましょう。

.soファイルの場所をシステムに記憶させます。そうしないと、DBD::Pg等でエラーが出る場合があります。
vi /etc/ld.so.conf.d/postgres.conf

/usr/local/pgsql/lib

ldconfig

PHPをインストールする際に困った事

PHPをソースからコンパイル&インストールする際に、1つ困った事態になりました。./configure時に--with-libdir=lib64 をつけないと、
GD2
openldap
libexpat
libiconv
を、/usr/lib64から探してくれず、エラーになってしまいます。

「じゃあ、--with-libdir=lib64 を指定すれば良くね?」と言うかもしれませんが、すると今度は/usr/lib64に最初から入っているDB4を読みに行って、
DB4 major version... configure: error: Header contains different version
というエラーが出てしまいます。

だったら、DB4を別途/usr/localにコンパイル&インストールすれば良いと思ったのですが、
--with-db4=/usr/local
--with-libdir=lib64
をダブルで指定しても、まだ /usr/lib64にある別バージョンを先に読みに行ってしまい、
DB4 major version... configure: error: Header contains different version
というエラーになってしまいます。

おそらくconfigureスクリプトの不具合でしょう。本来なら--with-db4=/usr/localと指定したら先に/usr/loca/libを読みに行かなければなりません。にもかかわらず、--with-libdir=lib64 を指定すると、/usr/lib64を先に見にいってしまうのです。

しかし残念な事に私にはconfigureスクリプトを修正できるだけのスキルがありません。これは困りました。PHPの開発グループとコンタクトが取れれば良いのですが、私は英語がさっぱりわからないので無理です。

ちなみに。DB4を --prefix=/usrと指定して/usr直下にインストールしてみましたが、やはり/usr/libにインストールされてしまい、/usr/lib64にはインストールされませんでした。また、前回はこれをやった事で、Login Serviceが起動せずサーバーが起動しなくなった疑いもあるため、ソースからコンパイルしたライブラリをむやみに/usr直下に入れるのはやめておきます。

もう仕方ないので、RPMからインストールすると/usr/lib64にインストールされてしまう「GD2」「openldap」「libexpat」「libiconv」は、ソースからコンパイルして、/usr/localにインスールする事にしました。

次に私が別のサーバーを設置する時までには、このconfigureスクリプトは修正されている事を願うばかりです。

GD2のコンパイル&インストール

先にも述べたように、GD2をRPMから入れてしまうと、/usr/lib64にインストールされます。このままだとPHPをconfigureする時に/usr/lib64から探してくれず、また --with-libdir=lib64 を指定するとDB4を/usr/lib64に入っている別バージョンを先に見に行ってしまいエラーになってしまいます。仕方ないのでPHPで使うためだけにGD2はソースからコンパイルして /usr/local以下に入れます。

まず、GD2が必要としているライブラリを入れます。これはRPMから入れれば十分でしょう。

・bzip2-develのインストール
cd /mnt/Packages
rpm -ivh bzip2-devel-1.0.6-13.el7.x86_64.rpm

・PNGライブラリのインストール
rpm -ivh libpng-1.5.13-7.el7_2.x86_64.rpm \
libpng-devel-1.5.13-7.el7_2.x86_64.rpm

・JPEGライブラリのインストール
rpm -ivh libjpeg-turbo-1.2.90-5.el7.x86_64.rpm \
libjpeg-turbo-devel-1.2.90-5.el7.x86_64.rpm

・freetype2のインストール
rpm -ivh freetype-devel-2.4.11-15.el7.x86_64.rpm

・Fontconfigのインストール
rpm -ivh fontconfig-2.10.95-11.el7.x86_64.rpm \
fontconfig-devel-2.10.95-11.el7.x86_64.rpm \
fontpackages-filesystem-1.44-8.el7.noarch.rpm \
bitmap-fixed-fonts-0.3-21.el7.noarch.rpm

・xpmのインストール
rpm -ivh \
libXpm-devel-3.5.12-1.el7.x86_64.rpm \
libXpm-3.5.12-1.el7.x86_64.rpm \
libX11-1.6.5-1.el7.x86_64.rpm \
libX11-common-1.6.5-1.el7.noarch.rpm \
libX11-devel-1.6.5-1.el7.x86_64.rpm \
libXext-1.3.3-3.el7.x86_64.rpm \
libXt-1.1.5-3.el7.x86_64.rpm \
libxcb-1.12-1.el7.x86_64.rpm \
libICE-1.0.9-9.el7.x86_64.rpm \
libSM-1.2.2-2.el7.x86_64.rpm \
libXau-1.0.8-2.1.el7.x86_64.rpm \
libXau-devel-1.0.8-2.1.el7.x86_64.rpm \
xorg-x11-proto-devel-7.7-20.el7.noarch.rpm \
libxcb-devel-1.12-1.el7.x86_64.rpm

・vpx-develのインストール
cd ソースディレクトリ
wget http://ftp.riken.jp/Linux/centos/7/os/x86_64/Packages/libvpx-devel-1.3.0-5.el7_0.x86_64.rpm
rpm -ivh libvpx-devel-1.3.0-5.el7_0.x86_64.rpm \
/mnt/Packages/libvpx-1.3.0-5.el7_0.x86_64.rpm

・tiff-develのインストール
cd /mnt/Packages
rpm -ivh \
libtiff-4.0.3-27.el7_3.x86_64.rpm \
libtiff-devel-4.0.3-27.el7_3.x86_64.rpm \
jbigkit-libs-2.0-11.el7.x86_64.rpm

・GD2のコンパイル&インストール
cd ソースディレクトリ
wget https://github.com/libgd/libgd/releases/download/gd-2.2.5/libgd-2.2.5.tar.gz
tar xvzf libgd-2.2.5.tar.gz
cd libgd-2.2.5
./configure \
--prefix=/usr/local \
--with-png=/usr \
--with-freetype=/usr \
--with-fontconfig=/usr \
--with-jpeg=/usr \
--with-tiff=/usr \
--with-Xem=/usr
make
make install

Xwindowがインストールされてる環境では、標準で/usr/lib64にGD2ライブラリがインストールされていますので、競合を避けるため、ここでは/usr/localにインストールしています。

PHPが必要としているライブラリを入れる

GD2を除くライブラリを入れます。「GD2」「openldap」「libexpat」「libiconv」以外はRPMからインストールしても/usr/libにインストールされるため、RPMからインストールする事にします。

・libxsltのインストール
cd /mnt/Packages/
rpm -ivh \
libxslt-1.1.28-5.el7.x86_64.rpm \
libxslt-devel-1.1.28-5.el7.x86_64.rpm \
libgcrypt-devel-1.5.3-14.el7.x86_64.rpm \
libgpg-error-devel-1.12-3.el7.x86_64.rpm \
libxml2-devel-2.9.1-6.el7_2.3.x86_64.rpm \
xz-devel-5.2.2-1.el7.x86_64.rpm

・libcurlのインストール
rpm -ivh libcurl-devel-7.29.0-46.el7.x86_64.rpm

・ldapのインストール
rpm -ivh openldap-clients-2.4.44-13.el7.x86_64.rpm

・DB4のソースのコンパイル&インストール
RPMに入っているDB4は、PHP7.2が要求してくるバージョンとは異なるため、やむを得ずソースからコンパイルしてインストールします。/usr/lib64以下には最初から別バージョンがインストールされていますので、競合を避けるために/usr/localにインストールしています。
cd ソースディレクトリ
wget https://src.fedoraproject.org/lookaside/extras/db4/db-4.8.30.tar.gz/f80022099c5742cd179343556179aa8c/db-4.8.30.tar.gz
tar xvzf db-4.8.30.tar.gz
cd db-4.8.30
cd build_unix
../dist/configure --prefix=/usr/local
make
make install

これ以降のライブラリは、RPMからインストールすると/usr/lib64にインストールされてしまう上に、PHPをコンパイルする時に--with-libdir=lib64をつけると今度は/usr/lib64に入っている別バージョンのDB4を読みに行ってしまいエラーになってしまうので、仕方なくソースからコンパイルして/usr/local以下にインストールします。しかし、困りましたね。何のための、--with-db4=オプションなんでしょう。

・openldapのインストール
まずLD_LIBRARY_PATHのパスを指定するようにします。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

大抵のソフトは、何も指定しなくても/usr/loca/libl以下も見てくれるのですが、このopenldapでは環境変数LD_LIBRARY_PATHを指定しておかないと、/usr/lib64に入っているDB4を先に見に行って
configure: error: Berkeley DB version mismatch
というエラーが出てしまいます。困りましたね。普通は何も指定しなくても/usr/local/libぐらいは標準で見るべきでしょう。

▽ここを参考にしました。ありがとうございました。
http://lightmaterial.blogspot.com/2008/04/openldapconfigureberkeley-db-version.html

LD_LIBRARY_PATHに/usr/local/libが入ってないと、GD::Barcodeをコンパイルする時も同様にエラーが出てしまうので、どうせならログイン時に自動的に設定されるようにしてしまいましょう。

vi /etc/profile.d/uselocallib.sh

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"/usr/local/lib"

一度Poderosaから抜けて、もう一度Poderosaで入り直してから、
echo $LD_LIBRARY_PATH
としてみてください。コロン区切りで/usr/local/libが含まれていれば成功です。

cd ソースディレクトリ
wget http://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-2.4.23.tgz
tar xvzf openldap-2.4.23.tgz
cd openldap-2.4.23
./configure --prefix=/usr/local --enable-ldbm
make depend
make
make install

・libexpatのインストール
cd ソースディレクトリ
wget https://sources.voidlinux.eu/expat-2.2.5/expat-2.2.5.tar.bz2
tar xvjf expat-2.2.5.tar.bz2
cd expat-2.2.5
./configure
make
make install

・libiconvのインストール
cd ソースディレクトリ
wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar xvzf libiconv-1.15.tar.gz
cd libiconv-1.15
./configure
make
make install

PHP7.2のコンパイル&インストール

ようやくPHPのコンパイルです。

cd ソースディレクトリ
wget http://am1.php.net/get/php-7.2.11.tar.gz/from/this/mirror
mv mirror php-7.2.11.tar.gz
tar xvzf php-7.2.11.tar.gz
cd php-7.2.11
vi mkphpconf

./configure                                      \
--with-config-file-path=/etc                     \
--with-openssl                                   \
--with-zlib                                      \
--enable-exif                                    \
--enable-ftp                                     \
--enable-sockets                                 \
--enable-sysvsem                                 \
--enable-sysvshm                                 \
--enable-sysvmsg                                 \
--enable-wddx                                    \
--with-kerberos                                  \
--enable-shmop                                   \
--enable-calendar                                \
--with-libxml-dir=/usr                           \
--with-apxs2=/usr/local/apache2/bin/apxs         \
--with-gd=/usr/local                             \
--with-pgsql=/usr/local/pgsql                    \
--disable-debug                                  \
--with-layout=GNU                                \
--with-pear=/usr/share/php                       \
--enable-bcmath                                  \
--with-bz2                                       \
--enable-ctype                                   \
--with-iconv=/usr/local                          \
--with-gettext                                   \
--enable-mbstring                                \
--with-pcre-regex                                \
--with-libexpat-dir=/usr/local                   \
--with-pgsql                                     \
--enable-shared                                  \
--enable-static                                  \
--with-zlib-dir=/usr                             \
--with-jpeg-dir=shared,/usr                      \
--with-png-dir=shared,/usr                       \
--with-freetype-dir=shared,/usr                  \
--with-ldap=shared,/usr/local                    \
--with-db4=shared,/usr/local                     \
--with-xsl                                       \
--with-xmlrpc                                    \
--enable-soap                                    \
--with-curl

先にも述べたように、--with-libdir=lib64 をつけるとdb4のバージョンが合わないと言われてエラーになってしまうのでつけていません。標準で/usr/lib64にインストールされているライブラリは、前もって/usr/local/libにインストールしています。

chmod 755 mkphpconf
./mkphpconf
ここでエラーが出ない事を確認します。特にPHPのconfigureは、すぐにアレがないコレがないとか言ってエラーばっかり吐くので注意が必要です。

エラーがなければコンパイルします。
make

・PHP7.10ではxml_element.cがコンパイルエラー

ext/xmlrpc/libxmlrpc/xml_element.c:646: undefined reference to `efree'
ext/xmlrpc/libxmlrpc/xml_element.c:347: undefined reference to `emalloc'

「efree、emallocなんて命令ないよ」という意味のようです。

vi ext/xmlrpc/libxmlrpc/xml_element.c

#include "ext/xml/expat_compat.h"
#include "xml_element.h"
#include "queue.h"
#include "encodings.h"

これらのインクルードファイルのどこにも、efree、emallocなんて定義されていません。また、efree、emallocで検索したところ、これらの関数はPHP内部で使う関数のようです。

他のefree、emallocを使っているソースを見ると、全てにおいて
#include <php.h>
が組み込まれています。また、php.hという名前からして、これこそがPHP内部で使う関数を定義しているヘッダーではないかと推理できます。

というわけで追加してみます。
vi ext/xmlrpc/libxmlrpc/xml_element.c

#include "ext/xml/expat_compat.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <php.h> ←この行を追加

make

Build complete.
Don't forget to run 'make test'

いいのかよ!!
まったく、こんな事で一晩徹夜する羽目になるとは。

さっそくツイッターで指摘したところ、2日後にはもうPHP7.2.11がリリースされており、ちゃっかり修正されていました。結局、私が指摘するまで誰も --with-xmlrpcオプションを試してなかったようです。

コンパイルが通ったら
make test
make install
cp php.ini-development /etc/php.ini

・チューニング
vi /etc/php.ini

error_log = /var/log/apache/php-error.log
file_uploads = On
short_open_tag = On
session.auto_start = 1
session.gc_maxlifetime = 3600
session.use_trans_sid = 1
session.cache_limiter = private, must-revalidate
upload_max_filesize = 100M
post_max_size = 200M
date.timezone = Asia/Tokyo
mbstring.http_output = SJIS-win
mbstring.internal_encoding = SJIS-win
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
default_charset = ""

・default_charset=""
デフォルトではdefault_charset = "UTF8"と記述されていますが、これがあるとブラウザに対してcontent-type: text/html; charset=utf-8を出力してしまい、utf8以外で書かれたページは全て文字化けを起こしてしまいます。

当サイトでは、ほとんどのページがシフトJISなため、default_charset = ""としてブラウザに文字コードヘッダーを出力させないようにします。

▽ここを参考にしました。ありがとうございました。
http://scribble.washo3.com/linux/web-garbled-characters-apacheweb-garbled-character-apache.html

当サイトは、当初(2000年~2004年頃まで)はほぼ全てのページがeucコードで記述されていました。これは、当時使っていたPHP3ではシフトJISコードを使っていると、「ソ」「表」「申」という文字が現れるとエラーになってしまうためです。

その後、2005年以降は随時シフトJISに変更しています。これは当時使っていたPHP4がシフトJISに対応したためです。また、当時はガラケーサイトを作る仕事をしており、古い機種ではシフトJIS(SJIS-win)しか表示できないものもあったためです。

しかし、現在はUTF8が主流となっており、Linuxの世界でもさまざまなソフトが最初からUTF8を使う前提として設定されています。なので、本来であればUTF8に切り替えなければならないのですが、当サイトはご覧のように既にかなり肥大化しており、今から全部のページをUTF8に切り替えるのは相当な労力を要します。したがって、UTF8に切り替えるのは、この後少しずつ時間のある時にやる事にします。

・short_open_tag
「PHP5.4からこの項目は削除された」と他のサイトに書いてあったので、それを鵜呑みにしてこのサイトでもこれまでずっと「PHP5.4から削除されました」と書いていたのですが(人のせいにするな?)、どうやらガセネタだったようです。

しかしデフォルトがOffになっているので、Onと書き換えます。つか、自分のサーバー上のPHPはもう全部<?で開始してるので、いまさらオフにはできません。

・register_globals
これは本当になくなったようです。このサーバーの全てのphpスクリプトがregister_globals=On前提で作っているため、今から全部直さないといけないようです。

・apacheを再起動
apachectl stop
apachectl start

PHPが入ってない時に新規に入れる場合、restartではなく、いったんstopしてstartしないとうまく動作しないようです。

また、systemctlコマンドは、startとstopを中央に書かなければならないため、「↑キーで前コマンドを再表示させて、後ろだけstartに変える」といったワザが使えなくなりました。そのそもなんで、startとかstopを後ろではなく中央に書かなければならないのかわかりません。systemctlコマンドを考えた人を読んで小一時間ほど説教してやりたいところです。

というわけで、apacheの再起動は、できるだけapachectlコマンドを使うようにします。

この後、ドキュメントルート下にphpinfo()関数を書いて、ブラウザからアクセスして、phpが設定どおりに動いているかどうか確認します。

Perlモジュールのインストール

Perlのモジュールは特にクラックされる心配もないので、 そんなに最新版にこだわる必要もなければ、 頻繁にアップデートする必要もないでしょう。 なので、できる限りRPMからインストールします。

・MakeMaker
cd /mnt/Packages/
rpm -ivh perl-ExtUtils-MakeMaker-6.68-3.el7.noarch.rpm \
perl-ExtUtils-Install-1.58-292.el7.noarch.rpm \
perl-ExtUtils-Manifest-1.61-244.el7.noarch.rpm \
perl-ExtUtils-ParseXS-3.18-3.el7.noarch.rpm \
perl-devel-5.16.3-292.el7.x86_64.rpm \
gdbm-devel-1.10-8.el7.x86_64.rpm \
systemtap-sdt-devel-3.2-4.el7.x86_64.rpm \
pyparsing-1.5.6-9.el7.noarch.rpm

・ImageMagick
rpm -ivh ImageMagick-6.7.8.9-15.el7_2.x86_64.rpm \
ImageMagick-perl-6.7.8.9-15.el7_2.x86_64.rpm \
ilmbase-1.0.3-7.el7.x86_64.rpm \
OpenEXR-libs-1.7.1-7.el7.x86_64.rpm \
cairo-1.14.8-2.el7.x86_64.rpm \
gdk-pixbuf2-2.36.5-1.el7.x86_64.rpm \
ghostscript-9.07-28.el7_4.2.x86_64.rpm \
jasper-libs-1.900.1-31.el7.x86_64.rpm \
libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm \
pango-1.40.4-1.el7.x86_64.rpm \
librsvg2-2.40.16-1.el7.x86_64.rpm \
libwmf-lite-0.2.8.4-41.el7_1.x86_64.rpm \
mesa-libEGL-17.2.3-8.20171019.el7.x86_64.rpm \
mesa-libGL-17.2.3-8.20171019.el7.x86_64.rpm \
libXrender-0.9.10-1.el7.x86_64.rpm \
pixman-0.34.0-1.el7.x86_64.rpm \
ghostscript-fonts-5.50-32.el7.noarch.rpm \
lcms2-2.6-3.el7.x86_64.rpm \
cups-libs-1.6.3-35.el7.x86_64.rpm \
poppler-data-0.4.6-3.el7.noarch.rpm \
urw-fonts-2.4-16.el7.noarch.rpm \
harfbuzz-1.3.2-1.el7.x86_64.rpm \
libXft-2.3.2-2.el7.x86_64.rpm \
libthai-0.1.14-9.el7.x86_64.rpm \
mesa-libgbm-17.2.3-8.20171019.el7.x86_64.rpm \
libwayland-client-1.14.0-2.el7.x86_64.rpm \
libwayland-server-1.14.0-2.el7.x86_64.rpm \
libxshmfence-1.2-1.el7.x86_64.rpm \
libXdamage-1.1.4-4.1.el7.x86_64.rpm \
libXfixes-5.0.3-1.el7.x86_64.rpm \
libXxf86vm-1.1.4-1.el7.x86_64.rpm \
mesa-libglapi-17.2.3-8.20171019.el7.x86_64.rpm \
libxshmfence-1.2-1.el7.x86_64.rpm \
xorg-x11-font-utils-7.5-20.el7.x86_64.rpm \
graphite2-1.3.10-1.el7_3.x86_64.rpm \
libXfont-1.5.2-1.el7.x86_64.rpm \
libfontenc-1.1.3-3.el7.x86_64.rpm

・TimeDate
rpm -ivh perl-TimeDate-2.30-2.el7.noarch.rpm

・perl-Time-HiRes
rpm -ivh perl-Time-HiRes-1.9725-3.el7.x86_64.rpm

・Test-Sinmple
rpm -ivh perl-Test-Simple-0.98-243.el7.noarch.rpm

・DBI
rpm -ivh perl-DBI-1.627-4.el7.x86_64.rpm \
perl-PlRPC-0.2020-14.el7.noarch.rpm \
perl-IO-Compress-2.061-2.el7.noarch.rpm \
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm \
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm \
perl-Net-Daemon-0.48-5.el7.noarch.rpm

・DBD-Pg
DBD-Pgを動かすためには、今現在インストールされているバージョンのPostgresのAPIライブラリ(libpq-fe.h、libpq.so等)が必要です。なぜなら、PostgreSQLでは完全な上位互換が保たれておらず、その都度APIにも大幅な変更があるためです。しかし、このサーバーではPostgreSQLをソースからコンパイルしてインストールしているため、DBD-Pgもソースからコンパイルしてインストールする必要があります。

wget https://cpan.metacpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.7.4.tar.gz
tar xvzf DBD-Pg-3.7.4.tar.gz
cd DBD-Pg-3.7.4
perl Makefile.PL
make
export DBI_DSN='dbi:Pg:dbname=template1;port=5432;host=127.0.0.1'
export DBI_USER=postgres
make test
make install
cd ..

・GDのインストール
GDライブラリはさっきPHPをインストールする前にソースからコンパイルしてインストールしたのですが、あれはあくまでPHPで使うためのものであり、PerlのGDライブラリをRPMからインストールするのであればGDライブラリそのものもRPMからインストールする必要があります。
rpm -ivh perl-GD-2.49-3.el7.x86_64.rpm \
gd-2.0.35-26.el7.x86_64.rpm

・File::Slurp
rpm -ivh perl-File-Slurp-9999.19-6.el7.noarch.rpm

ここから先のモジュールはCentOS7.5のインストールDVDに入ってないので、ソースからコンパイルしてインストールします。

・File-Tail
wget http://backpan.perl.org/authors/id/M/MG/MGRABNAR/File-Tail-0.98.tar.gz
tar xvzf File-Tail-0.98.tar.gz
cd File-Tail-0.98
perl Makefile.PL
make
make test
#妙に時間がかかりますが異常ではありません。
make install
cd ..

・MIME-BASE-64
wget http://backpan.perl.org/authors/id/G/GA/GAAS/MIME-Base64-3.05.tar.gz
tar xvzf MIME-Base64-3.05.tar.gz
cd MIME-Base64-3.05
perl Makefile.PL
make
make test
make install
cd ..

・File-ReadBackwards
wget http://gitpan.integra.net/backpan/authors/id/U/UR/URI/File-ReadBackwards-1.02.tar.gz
tar xvzf File-ReadBackwards-1.02.tar.gz
cd File-ReadBackwards-1.02
perl Makefile.PL
make
make test
make install
cd ..

・Jcode
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-Jcode/Jcode-2.03.tar.gz/8d285ebf5e5d4f60938829a2c11bdef6/Jcode-2.03.tar.gz
tar xvzf Jcode-2.03.tar.gz
cd Jcode-2.03
perl Makefile.PL
make test
make install
cd ..

・GD-Barcode
wget https://cpan.metacpan.org/authors/id/K/KW/KWITKNR/GD-Barcode-1.15.tar.gz
tar xvzf GD-Barcode-1.15.tar.gz
cd GD-Barcode-1.15
perl Makefile.PL
make
make test
make install
cd ..

このままでは「QRコードのバージョンを指定しなかった場合には自動判別になる」という機能が働かず、QRコードのバージョンを指定しなかった場合に1になってしまうというバグがあるので、以下のように修正します。
chmod 755 /usr/local/share/perl5/GD/Barcode/QRcode.pm
vi /usr/local/share/perl5/GD/Barcode/QRcode.pm

40行目
$oSelf->{Version} = $rhPrm->{Version} || 1;        ↓ $oSelf->{Version} = $rhPrm->{Version};

Perl の「モジュール」について

Perlは当初ではjcode.plのようなよく使うサブルーチンをインクルードして使っていました。しかし、これではそのサーバーを使っている各ユーザーが、それぞれ同じファイルを入れなければならず、もしサブルーチンにバグがあった場合に、バージョンアップするためにはそのサーバー内の全部のファイルを更新しなければなりませんでした。

そこで登場したのが「モジュール」です。これはサーバーのたとえば/usr/lib64/perl内に1つだけ設置しておけばそのファイルを全員が参照できて便利です。また、バージョンアップも1つのファイルを更新すれば済みます。

しかし、その後みんながみんなモジュールを好き勝手に拡張していった結果、ツケがまわってきたというか、AというモジュールではB、Cというモジュールを使っていて、BというモジュールではD、Eというモジュールを使っていて、Eというモジュールでは、F、Gというモジュールを使っていて・・・・、のような事が発生し、さらにFはliba.soを使い、Gはlibb.soを使い・・とやっていった結果、モジュール1つ入れるのに、依存性の雨あられで、モジュールのインストールには大変な手間がかかるようになってしまいました。

依存性の欠如の表示で困るのが、パッケージ名(なんとかかんとかRPM)ではなく、必要なファイル名で表示される事です。そりゃ、依存性の欠如のエラーメッセージをパッケージ名で表示させるとなると、必要なファイルはDVDに収録したパッケージのどのファイルに含まれているかを、全て(マイナーバージョンまで含めて) どこかで管理しておかないといけないわけですが・・・。

しかし、rpm -ivhコマンドに続いて後ろにズラズラと指定すれば、指定されたものの中から自動的に必要なファイルを探してくれるわけですから、そこをもうひと工夫して、カレントディレクトリ内のRPMファイルから自動的に探してくれるぐらいの工夫は欲しかった気もします。

もしくは、rpmコマンドに何かオプションをつけると、カレントディレクトリの中から必要なパッケージを表示してくれるて、なおかつ、その中から未インストールのものは青で表示されるとかね。それぐらいの工夫は欲しかった気もします。

最初にCentOSをインストールする時に、「Perl開発ツール」にチェックをいれておけばあらかじめかなりのモジュールはインストールされますが、それらが要求するライブラリまで全て同時にインストールされるため、CentOSのインストールそのものが異常に長くなってしまいます。サーバーをインストールしなければならない時は、大抵はサーバークラッシュなどの緊急事態が多く、とてもそんなに時間をかけていられないのが現状です。

tcp-wrapperの設定

tcp-wrapperは、firewalldと同様、外部からの接続を管理するものです。firewalldとの違いは、fiwarelldは接続するポートに対して設定するのに対し、tcp-wrapperはデーモン名に対して設定します。また、設定がテキストファイルのみなため、watcher2等の常駐ソフトで比較的自由に、そして動的にアクセスの許可/禁止が設定できます。

また、firewalldとtcp-wrapperの2つで外部からのアクセスを遮断する事によって、どちらかが破られたとしても、どちらかが防いでくれるというメリットがあります。

・全てを禁止する
vi /etc/hosts.deny

all : all 

これによりデフォルトのポリシーは全禁止となり、hosts.allowに記述された接続のみが許可されるようになります。

・ローカル内からは全てのサービスの接続を許可する
vi /etc/hosts.allow

all : [::1]                     : allow
all : 127.0.0.1                 : allow
all : 192.168.0.0/255.255.255.0 : allow

tcp-wrapperの設定は全てコロンで区切るのですが、困った事にIPv6のアドレスもコロンで区切る事になっているため、区切りの記号がバッティングしてしまいました。そこで、ここではIPv6のアドレスはカギカッコでくくって記述します。

・sendmailは全てのアドレスからの接続を許可する
vi /etc/hosts.allow

sendmail   : All : allow

これをやっておかないと、内部LANの外から来たメールが一切届かなくなります。

・pop3,ftp,telnet,sshを広く一般に公開する場合

popper : All : allow
vsftpd     : All : allow
in.telnetd : All : allow
sshd       : All : allow

もちろん、ここで Allに対して許可をしても、firewalldや/etc/xinetd.dで接続を許可するIPが指定されている場合は、そこで阻止されますので注意してください。

hosts.allow、hosts.denyはファイルを書き換えたその瞬間から有効になります。べつにtcp-wrappersを再起動させる必要はありません。だからこそ、watcher2のような動的に接続を許可/禁止するソフトを作りやすくなっています。

hosts.allow、hosts.denyはあくまで新規に接続を試みるパケットに対して有効です。したがって、既に接続されているtelnetやsshが切れるわけではありません。しかし、設定を間違えると一度抜けると二度と接続できなくなるので気をつけてください。最悪の場合、データーセンターのサーバー室まで行く羽目になります。

そうならないためにも、必ず新規に接続ができるかどうかテストをしてから、現在接続中のtelnetを抜けるようにしてください。

Net::Twitter::Liteのインストール

まずは依存性の解決のためにNet::Twitter::Liteが使うモジュールを入れます。

・Encode
rpm -ivh perl-Encode-2.51-7.el7.x86_64.rpm

・Perl-OSType
rpm -ivh perl-Perl-OSType-1.003-3.el7.noarch.rpm

・Parse-CPAN-Meta
rpm -ivh perl-Parse-CPAN-Meta-1.4404-5.el7.noarch.rpm \
perl-CPAN-Meta-YAML-0.008-14.el7.noarch.rpm \
perl-JSON-PP-2.27202-2.el7.noarch.rpm

・JSON
rpm -ivh perl-JSON-2.59-2.el7.noarch.rpm

・Module::Metadata
rpm -ivh perl-Module-Metadata-1.000018-2.el7.noarch.rpm \
perl-version-0.99.07-3.el7.x86_64.rpm

・ExtUtils::CBuilder
rpm -ivh perl-ExtUtils-CBuilder-0.28.2.6-292.el7.noarch.rpm \
perl-IPC-Cmd-0.80-4.el7.noarch.rpm \
perl-ExtUtils-MakeMaker-6.68-3.el7.noarch.rpm \
perl-Module-Load-Conditional-0.54-3.el7.noarch.rpm \
perl-ExtUtils-Install-1.58-292.el7.noarch.rpm \
perl-ExtUtils-Manifest-1.61-244.el7.noarch.rpm \
perl-Module-CoreList-2.76.02-292.el7.noarch.rpm \
perl-Module-Load-0.24-3.el7.noarch.rpm \
perl-devel-5.16.3-292.el7.x86_64.rpm \
gdbm-devel-1.10-8.el7.x86_64.rpm \
perl-ExtUtils-ParseXS-3.18-3.el7.noarch.rpm \
systemtap-sdt-devel-3.2-4.el7.x86_64.rpm \
perl-Locale-Maketext-Simple-0.21-292.el7.noarch.rpm \
perl-Params-Check-0.38-2.el7.noarch.rpm \
perl-Locale-Maketext-1.23-3.el7.noarch.rpm \
pyparsing-1.5.6-9.el7.noarch.rpm

・Archive::Tar
rpm -ivh perl-Archive-Tar-1.92-2.el7.noarch.rpm \
perl-IO-Zlib-1.10-292.el7.noarch.rpm \
perl-Package-Constants-0.02-292.el7.noarch.rpm

・CPAN
rpm -ivh perl-CPAN-1.9800-292.el7.noarch.rpm \
perl-Digest-SHA-5.85-4.el7.x86_64.rpm \
perl-local-lib-1.008010-4.el7.noarch.rpm \
perl-Digest-1.17-245.el7.noarch.rpm

・CPAN::Meta
rpm -ivh perl-CPAN-Meta-2.120921-5.el7.noarch.rpm \
perl-CPAN-Meta-Requirements-2.122-7.el7.noarch.rpm

・Module::Build
rpm -ivh perl-Module-Build-0.40.05-2.el7.noarch.rpm

・Digest::HMAC
rpm -ivh perl-Digest-HMAC-1.03-5.el7.noarch.rpm \
perl-Digest-MD5-2.52-3.el7.x86_64.rpm

・Digest::SHA1
rpm -ivh perl-Digest-SHA1-2.13-9.el7.x86_64.rpm

・libwww-perl
依存性の解決をするのが大変すぎて泣けてきました。
rpm -ivh \
mailcap-2.1.41-2.el7.noarch.rpm \
perl-Business-ISBN-2.06-2.el7.noarch.rpm \
perl-Business-ISBN-Data-20120719.001-2.el7.noarch.rpm \
perl-Encode-Locale-1.03-5.el7.noarch.rpm \
perl-File-Listing-6.04-7.el7.noarch.rpm \
perl-HTML-Parser-3.71-4.el7.x86_64.rpm \
perl-HTML-Tagset-3.20-15.el7.noarch.rpm \
perl-HTTP-Cookies-6.01-5.el7.noarch.rpm \
perl-HTTP-Daemon-6.01-7.el7.noarch.rpm \
perl-HTTP-Date-6.02-8.el7.noarch.rpm \
perl-HTTP-Message-6.06-6.el7.noarch.rpm \
perl-HTTP-Negotiate-6.01-5.el7.noarch.rpm \
perl-IO-HTML-1.00-2.el7.noarch.rpm \
perl-IO-Socket-IP-0.21-5.el7.noarch.rpm \
perl-IO-Socket-SSL-1.94-7.el7.noarch.rpm \
perl-libwww-perl-6.05-2.el7.noarch.rpm \
perl-LWP-MediaTypes-6.02-2.el7.noarch.rpm \
perl-Mozilla-CA-20130114-5.el7.noarch.rpm \
perl-Net-HTTP-6.06-2.el7.noarch.rpm \
perl-Net-LibIDN-0.12-15.el7.x86_64.rpm \
perl-Net-SSLeay-1.55-6.el7.x86_64.rpm \
perl-URI-1.60-9.el7.noarch.rpm \
perl-WWW-RobotRules-6.02-5.el7.noarch.rpm

・Try::Tine
rpm -ivh perl-Try-Tiny-0.12-2.el7.noarch.rpm

・LWP::Protocol::https
rpm -ivh perl-LWP-Protocol-https-6.04-4.el7.noarch.rpm

・Net::OAuth
これはCentOS7のインストールDVDには含まれないので、ソースからコンパイルしてインストールします。
cd ソースディレクトリ
wget https://cpan.metacpan.org/authors/id/K/KG/KGRENNAN/Net-OAuth-0.28.tar.gz
tar xvzf Net-OAuth-0.28.tar.gz
cd Net-OAuth-0.28
perl Makefile.PL
make
make test
#make: *** [test] エラー 255が出るけど無視無視
make install

・ようやくNet::Twitter::Liteのインストール
cd ソースディレクトリ
wget https://cpan.metacpan.org/authors/id/M/MM/MMIMS/Net-Twitter-Lite-0.12008.tar.gz
tar xvzf Net-Twitter-Lite-0.12008.tar.gz
cd Net-Twitter-Lite-0.12008

このモジュールにはMakefile.PLというものがないので、直接コピーコマンドでインストールします。
mkdir /usr/lib64/perl5/Net
cp -pr lib/Net/Twitter /usr/lib64/perl5/Net/

コピー先は当然ですが、Linuxのディストリビューション、Perl本体のインストールのし方、Perlのバージョンによっても異なりますので、それぞれの環境に合わせて読み替えてください。

vi /usr/lib64/perl5/Net/Lite/API/V1_1.pm

        [ 'trends_location', {
            aliases         => [ qw// ],
            path            => 'trends/:woeid',
            method          => 'GET',
            params          => [ qw/woeid/ ],
            required        => [ qw/woeid/ ],
            add_source      => 0,
            deprecated      => 0,
            authenticate    => 0,
            booleans        => [ qw// ],
            base_url_method => 'apiurl',
        } ],

バージョン0.12008では、バージョン0.12006にあった「trends_locationというメゾットがない」というバグは直っているようです。いや、もしかするとこのサイトで指摘したから直したのかもしれません。

バックアップディスクの追加

これまでのセッティングで、ソフトRAID1に設定しました。これで片方のハードディスクが故障しても、もう片方のハードディスクが補ってくれます。

しかし、RAIDはあくまで破損に対する防衛。操作ミスには対応できません。操作ミスで大事なファイルを消してしまった、あるいは外部からの攻撃で壊されてしまった、という場合にはRAID1の両方のハードディスクともに破損してしまいます。したがって、別途バックアップを残さなければなりません。

バックアップとは、別のハードディスクをもう1個追加しておき、crontabで定期的に(1日に1回ぐらい)大事なデーターをもう1個のハードディスクに移すものです。この場合、バックアップを取るのはできる限り誰も何も作業をしない時間帯(朝の4時とか)が良いでしょう。操作ミスで大事なファイルを消しても、朝の4時までにバックアップから戻せば良いわけですから。

本当は、バックアップは別の場所にあるサーバーにFTPで転送すべきなんですけどね。火災や落雷などでサーバー全体が壊れる(消失する)可能性もありますので。

・ハードディスクを足す
サーバーにハードディスクを足します。足す方法は、「Linux情報」の範疇にはないので、別途「ハードウェア情報」の方を見てください。

・追加ディスクがsdいくつかを調べる。
パラレルATA全盛期の頃は、ハードディスクのデバイス名はhda、hdb、hdc・・・って名前でした。しかし、今ではハードディスクはsda、sdb、sdcです。

実は、当初Linuxがカーネルで対応していたのはパラレルATAだけでした。SCSIのハードディスクは別途起動時にドライバーを読み込ませる事で対応していました。これを、SCSIの頭を取ってsda、sdb、sdcとしていました。

しかし、そのうちRAIDカード上に接続されたハードディスクや、USBポートに接続されたハードディスクを読み込ませる必要が生じてきました。なので、SCSIと同じようにドライバーにて対応して、カーネルからはSCSIハードディスクに見えるようにしました。

その後、シリアルATAが登場し、これが主流となりました。Linuxでは従来どおりシリアルATAのハードディスクもSCSIと同じようにドライバーにて対応したため、シリアルATAのハードディスクも、sda,sdb,sfcとなったわけです。

しかし、sはシリアルATAのSだとも言えるので、Sでも良いかと思います。

df -h

/dev/md126       924G  3.9G  920G    1% /
devtmpfs         3.7G     0  3.7G    0% /dev
tmpfs            3.7G  8.0K  3.7G    1% /dev/shm
tmpfs            3.7G  8.8M  3.7G    1% /run
tmpfs            3.7G     0  3.7G    0% /sys/fs/cgroup
/dev/md125       477M   16K  477M    1% /boot/efi
tmpfs            751M     0  751M    0% /run/user/1000

頭にmdがつくデバイスは、RAIDのハードディスクです。複数のハードディスクがセットで1つのmdなんとかを成しています。したがって、md125とmd126はsd何を使っているか調べる必要があります。

cat /proc/mdstat

md125 : active raid1 sdc2[1] sdb2[0]
      488384 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md126 : active raid1 sdc3[1] sdb3[0]
      968324096 blocks super 1.2 [2/2] [UU]
      bitmap: 1/8 pages [4KB], 65536KB chunk

md127 : active raid1 sdc1[1] sdb1[0]
      7811072 blocks super 1.2 [2/2] [UU]
      
unused devices: 

これによると、md125、md126、md127は、sdbとsdcを使っています。

したがって、先程追加したディスクはこのリストにないsdaという事になります。この判断を間違えると、せっかくインストールしたディスクをフォーマットする羽目になるので注意してください。

一度に複数のハードディスクを追加した場合は、まず繋いだSATAポート番号で判断できます。マザーボード上のSATAポートには0,1,2,3・・・と番号がついていて、若い番号ほどsd何とかが若いアルファベットになると思います。

また、容量で判断する事もできます。

fdisk -l | grep GB

Disk /dev/sdc: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors
Disk /dev/sda: 500.1 GB, 500107862016 bytes, 976773168 sectors
Disk /dev/md126: 991.6 GB, 991563874304 bytes, 1936648192 sectors

この例ではsda1は500GBなので、サーバー内のハードディスクのうち、500GBのディスクが1つならば特定できるでしょう。

また、中に何が入っているかで判断する事もできます。
mount /dev/sda1 /mnt -t ntfs

mount: unknown filesystem type 'ntfs'

これは「ntfsなんてファイルシステム知らねーよ」という意味です。この場合、ntfsをマウントするためには、ntfs-3gパッケージが必要です。

cd /home/mente/work/RPMS
wget http://springdale.math.ias.edu/data/puias/7/x86_64/os/Addons/Packages/ntfs-3g-2017.3.23-1.sdl7.x86_64.rpm
rpm -ivh ntfs-3g-2017.3.23-1.sdl7.x86_64.rpm
mount /dev/sda1 /mnt -t ntfs
ls /mnt
これで中身を見て、消しても大丈夫かどうか判断しましょう。

・パーティション作成
追加したディスクにLinuxパーティションを作成します。Windowsのパーティションがある場合は消します。

fdisk /dev/sda
コマンド (m でヘルプ): p

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048   204802047   102400000    7  HPFS/NTFS/exFAT
/dev/sda2       204802048   976771071   385984512    7  HPFS/NTFS/exFAT

sda1とsda2はWindowsで使っていた時の名残なので消します。(これはあくまで例です。お使いの環境に合わせて読み替えてください。)

コマンド (m でヘルプ): d

パーティション番号 (1,2, default 2): 2
Partition 2 is deleted

コマンド (m でヘルプ): d

Selected partition 1
Partition 1 is deleted

パーティションが1個しかない時は、どこを消すかは聞いてこずにに問答無用で消されちゃいます。しかし、qを入力すると取り消しができます。wを押すまでは、パーティションをどうしたいかを決めるだけで、書き込まれません。

新しくパーティションを作ります。
コマンド (m でヘルプ): n

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 

ここで、
p プライマリ (0プライマリ、 0エクステンド、 余り4)
e エクステンド
で、作成できる区画は4つ、うちプライマリは1つだけとなります。ブートできるのはプライマリのみです。

Select (default p): p
パーティション番号 (1-4, default 1): 1
最初 sector (2048-976773167, 初期値 2048): 
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-976773167, 初期値 976773167): 
初期値 976773167 を使います
Partition 1 of type Linux and of size 465.8 GiB is set

単にEnterだけを押していくと、最大の範囲を設定してくれます。

最終セクタ番号の質問の所で、+100GBというふうに「+容量」で指定する事もできます。

Last sector, +sectors or +size{K,M,G} (2048-976773167, 初期値 976773167):
+400GBPartition 1 of type Linux and of size 372.5 GiB is set

ここで、
「+400GBと指定したのに、372.5GBしか確保されない。」 「バグではないのか?」
などと言ってはいけない。よく見ると372.5GiBと「i」が入っているでしょう。

400GBとはハードディスクメーカーが言うところのGBであって、バイト数でいうと、
4,000,000,000,000バイトです。

OSやBIOSから見ると、
1KB=1024バイト、
1MB=1024Kバイト
1GB=1024MB
なので、OSから見ると3725.2902984619140625バイトです。

しかしながら、ハードディスクメーカーのいうところのGBと、OSやBIOSから見たところのGBが違うのではややこしいので、1024単位で繰り上がる場合はGiBというふうにGの後にiをつけて区別します。

終わったら、wで書き込みます。wコマンドで抜けると、もう元には戻せなくなるので注意してください。

うまくいったか確認
fdisk -l

(省略)
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1            2048   976773167   488385560   83  Linux
(省略)

・フォーマット
mks -t xfs /dev/sda1

mkfs.xfs: /dev/sda1 appears to contain an existing filesystem (ntfs).
mkfs.xfs: Use the -f option to force overwrite.

/dev/sda1には別システム(ntfs)が入ってる。
-fオプションをつけて強制上書きせよ。

えー、なんでなんで??今までWindowsで使ってたのがいけなかったの??
というわけで、-fをつけてやり直します。

mkfs -t xfs -f /dev/sda1

meta-data=/dev/sda1              isize=512    agcount=4, agsize=30524098 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=122096390, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=59617, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

(注意) Linuxのコマンドを、意味もわからず丸写しするのはやめましょう。 あくまでこの原稿を書いてる環境では、消しても良いデバイスが/dev/sda1であって、 このコマンドを丸写しすると、大抵は大事なパーティションが消えるので注意してください。 (大抵は/dev/sda1は/bootパーティションだと思います。)

・マウント
cd /
mkdir /backuphdd
mount /dev/sda1 /backuphdd
df -h

ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/md126       924G  3.9G  920G    1% /
devtmpfs         3.7G     0  3.7G    0% /dev
tmpfs            3.7G  8.0K  3.7G    1% /dev/shm
tmpfs            3.7G  8.8M  3.7G    1% /run
tmpfs            3.7G     0  3.7G    0% /sys/fs/cgroup
/dev/md125       477M   16K  477M    1% /boot/efi
tmpfs            751M     0  751M    0% /run/user/1000
/dev/sda1        466G   33M  466G    1% /backuphdd

mountコマンドを/etc/rc.d/rc.locaに書いても良いのですが、スマートではないので /etc/fstabで書く事にします。blkidコマンドでUUDを確認した後、/etc/fstabに追加します。

blkid | grep sda1

/dev/sda1: UUID="260ff714-5f0d-4178-9753-c8218278fba5" TYPE="xfs"

vi /etc/fstab

UUID=260ff714-5f0d-4178-9753-c8218278fba5 /backuphdd xfs defaults 0 0

reboot

再起動したらPoderosaでログインして、うまくいったか確認します。

df -h

ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/md126       924G  3.9G  920G    1% /
devtmpfs         3.7G     0  3.7G    0% /dev
tmpfs            3.7G  8.0K  3.7G    1% /dev/shm
tmpfs            3.7G  8.8M  3.7G    1% /run
tmpfs            3.7G     0  3.7G    0% /sys/fs/cgroup
/dev/sda1        466G   33M  466G    1% /backuphdd
/dev/md125       477M   16K  477M    1% /boot/efi
tmpfs            751M     0  751M    0% /run/user/1000

うまくいったようです。この後、crontabでバックアアップコマンドを登録します。といっても、J-3100のMS-DOSのようなbackupというコマンドがあるわけではなく、自分でシェルで作成します。

ディレクトリをバックアップする際には、
tar cvz --same-permission -f ファイル名 圧縮するディレクトリ
tar cvj --same-permission -f ファイル名 圧縮するディレクトリ
lha a ファイル名 圧縮するディレクトリ
等を使って圧縮する方が良いでしょう。

バックアップはあくまでバックアップであって、そのままの形で読ませる必要もないので、圧縮した方がハードディスクの容量が少なくて済みますし、余裕があれば世代バックアップも可能です。

z(gzip)よりはj(bzip2)の方が圧縮率が高いのですが、最近ハードディスクの容量に余裕があるため、そんなに圧縮率にこだわる必要もないので、私はz(gzip)の方を使います。

lhaは、CentOS7のDVDにRPMで付いてこないし、作者がセキュリティの関係で使わないようにと呼びかけているのですが、WindowsにダウンロードしてLHUT32で1個だけ抽出するという技が使えるので、私は重宝しています。

ただ、tarではファイルの所有者を名前で記録しているのに対し、lhaではuid,gidで記録しています。なので別のサーバーで復元する場合、uid,gidを同じにする必要があります。

lm_sensorsのインストール

しかし、これはgrubを再構築するので、最悪起動しなくなるかも?? 全部終わった後にそうなるとショックがデカすぎるので、OSをインストール直後にやる方が良いかもしれませんね。

▽ここを参考にしました。ありがとうございました。
https://k-memo-blog.blogspot.com/2015/05/centos7.html
https://mo.kerosoft.com/0196
https://vogel.at.webry.info/201408/article_12.html

・DVDドライブがマウントされてなかったら
mount /dev/cdrom /mnt

mount: /dev/sr0 is write-protected, mounting read-only

・RPMのインストール
cd /mnt/Packages/
rpm -ivh lm_sensors-3.4.0-4.20160601gitf9185e5.el7.x86_64.rpm \
lm_sensors-libs-3.4.0-4.20160601gitf9185e5.el7.x86_64.rpm

・grubの再構築
vi /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.md.uuid=46ffb918:36e7a60d:9c0887e4:fdb157e2 rd.md.uuid=cb129b1c:8a3c6f98:26f2bb40:3e5091d9 rhgb quiet acpi_enforce_resources=lax"
GRUB_DISABLE_RECOVERY="true"

赤字の部分を足します。それ以外をいじると起動しなくなる恐れがあるので、他の項目は触らないように。
grub2-mkconfig -o /boot/grub2/grub.cfg

Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-862.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-ee353b8023ac45e6acaf42f0fa2d42f4
Found initrd image: /boot/initramfs-0-rescue-ee353b8023ac45e6acaf42f0fa2d42f4.img
done

reboot
再起動後、
sensors-detect
質問が色々出るので、全てyと答えます。
sensors

acpitz-virtual-0
Adapter: Virtual device
temp1:        +27.8°C  (crit = +87.0°C)
temp2:        +29.8°C  (crit = +87.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +34.0°C  (high = +80.0°C, crit = +86.0°C)
Core 0:         +34.0°C  (high = +80.0°C, crit = +86.0°C)
Core 1:         +33.0°C  (high = +80.0°C, crit = +86.0°C)
Core 2:         +34.0°C  (high = +80.0°C, crit = +86.0°C)
Core 3:         +32.0°C  (high = +80.0°C, crit = +86.0°C)

nct6779-isa-0290
Adapter: ISA adapter
Vcore:                  +0.93 V  (min =  +0.00 V, max =  +1.74 V)
in1:                    +1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
AVCC:                   +3.42 V  (min =  +2.98 V, max =  +3.63 V)
+3.3V:                  +3.42 V  (min =  +2.98 V, max =  +3.63 V)
in4:                    +1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in5:                    +2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in6:                    +0.29 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
3VSB:                   +3.38 V  (min =  +2.98 V, max =  +3.63 V)
Vbat:                   +3.33 V  (min =  +2.70 V, max =  +3.63 V)
in9:                    +1.05 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in10:                   +0.22 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in11:                   +0.18 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in12:                   +1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in13:                   +1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in14:                   +0.22 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
fan1:                   478 RPM  (min =    0 RPM)
fan2:                  1654 RPM  (min =    0 RPM)
fan3:                     0 RPM  (min =    0 RPM)
fan4:                     0 RPM  (min =    0 RPM)
fan5:                     0 RPM  (min =    0 RPM)
SYSTIN:                 +36.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor
CPUTIN:                 +32.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor
AUXTIN0:               +101.0°C    sensor = thermistor
AUXTIN1:               +101.0°C    sensor = thermistor
AUXTIN2:               +101.0°C    sensor = thermistor
AUXTIN3:                 +3.0°C    sensor = thermal diode
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  
PCH_CHIP_TEMP:           +0.0°C  
PCH_CPU_TEMP:            +0.0°C  
PCH_MCH_TEMP:            +0.0°C  
intrusion0:            ALARM
intrusion1:            ALARM
このページの先頭へ
  広告