まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:centos

IBM Cloud のプライベートクラウド環境内にアクセスするための(サーバーインスタンス代以外は不要という意味で)安価な VPN サーバーを構築する、という機会があったので、その手順をまとめておきます。先に書いておくと、構築する際に手を動かす部分だけはさほど大変ではないのですが、事前準備というか、環境確認というか、構築用途を考慮した上で準備する部分がそこそこのボリュームを占めています。



【システム図】
今回紹介するシステム環境はこのようなものです:
2020100201

IBM Cloud 内にプライベート VLAN を1つ用意して、プライベートクラウド環境内に業務環境を構築します。このプライベートクラウドにアクセスするための VPN サーバー(上図の赤箱)を専用のサーバーインスタンスを1つ追加して構築する、というものです。

今回、このサーバーを CentOS 8.x をベースに、OpenVPN サーバーを使って構築します。OSS をベースとすることで、OS もソフトもサービスも追加料金不要です。


この作業を行う前に、環境についていくつか事前に決めておく必要があります。順を追って紹介します。


【セキュリティグループの定義】

セキュリティグループは IBM Cloud 内のセキュリティ設定を担う機能です。今回構築する VPN サーバーではどのようなセキュリティ設定で構築する必要があるかを事前に考え、定義し、この後作成する VPN サーバーに適用します。

※今回の記事の中で IBM Cloud に特化している部分でもあります。このセキュリティグループや内部ネットワークの確認方法に関わる箇所以外の内容は他のインフラ環境でもほぼ流用できると思っています。

IBM Cloud のセキュリティグループ定義内容を確認するには、まず左上のメニューから Classic Infrastructure を選択してインフラ一覧ページに移動します:
2020100202


そして同ページから更にメニューを Security - Network Security - Security Groups とたどった先にあります:
2020100203


デフォルトで定義済みのものも含めて、セキュリティグループの一覧が表示されます。新規セキュリティグループを追加する場合は画面右上の Create group を選択します:
2020100204


新規作成時のダイアログです。ここではセキュリティグループの Name(必須)と、必要に応じて Description(説明、任意)を入力します。なお Create group with .. と書かれたチェックは外して、空の定義状態で作成します:
2020100205


作成後の一覧です。入力した名前のセキュリティグループが登録されていることを確認します:
2020100206


一覧から1つ選択すると定義内容が表示されます。作成直後は定義内容が空の状態です。ここで Inbound(リクエスト受付)/Outbound(リクエスト送付) にわけてセキュリティ内容を定義します:
2020100207


例えば HTTP(=TCP/80) を通す設定を加えたい場合、Inbound ルールを以下の内容で追加します。特定のネットワークアドレスからのリクエストのみ受け付ける条件を加えることも可能です(無指定の場合はすべてのネットワークアドレスからのリクエストに適用されます):
2020100208


この作業を繰り返して、Inbound ルールと Outbound ルールを加えてゆきます。なお実際のサーバーインスタンスにはここで作成したルールを複数組み合わせて割り当てることができるので、1つのセキュリティグループにすべての設定内容を記述する必要はありません:
2020100201


更に、別のセキュリティグループで SSH を通すセキュリティ設定を用意しました。こちらは Source を定義することで、特定の IP アドレス(自分の IP アドレス)からのリクエストのみ許可するような内容にしており、環境構築後のこちらのセキュリティグループのみ除去する予定です:
2020100202


一覧ではこのように2つのセキュリティグループを追加しました:
2020100203


【プライベート VLAN ネットワーク環境の確認】

次に、この後 VPN サーバーをインストール&設定する際の、設定内容を現在のプライベート VLAN 内容から確認します。

まず対象サーバーインスタンスを1つ確認します。IBM Cloud ダッシュボードから Classic Infrastructure - Device List を選択します:
2020100204


(止まっているものも含めた)定義済みのサーバー一覧が表示されます。ここから今回 VPN で接続することになるプライベート VLAN 内のサーバーを1つ選択します:
2020100205


選択したサーバーインスタンスの詳細画面が表示されます。ここで以下の内容を確認しておきます(後の作業で使います):
2020100206


確認する項目この図での値
LocationTokyo 5
Private ネットワークの VLANtok05.bcr01a.2256
Private ネットワークの IP Address10.193.122.107/26


この IP アドレスの値より、同ネットワークのネットワークアドレスおよびネットマスクを計算すると、
 ネットワークアドレス : 10.193.122.64
 ネットマスク : 255.255.255.192
ということがわかります。


サーバー構築前に調べておく内容は以上です。この後は実際のサーバー構築に移ります。


【CentOS 8 インスタンス作成】

では実際に VPN サーバーを構築していきます。まずは IBM Cloud の同プライベート VLAN 内に CentOS 8.x の VM を追加します。

IBM Cloud ダッシュボードのデバイス一覧画面から Order ボタンを選択します:
2020100207


追加内容はいわゆる VM です。IBM Cloud では Virtual Server for Classic と分類されているので、これを直接検索するか、または検索窓に "classic" などと入力して検索し、Virtual Server for Classic を選択します:
2020100208


次の画面で作成する VM のスペックを決めていきます。名前に加えて CPU やらメモリやら。ここで注意すべきは作成するインスタンスの Location 、先程調べた VPN 接続対象プライベート VLAN(上記例では Tokyo 5)と同じものを選択してください:
2020100301


また OS イメージは CentOS 8.x を、そしてパブリックネットワークのセキュリティグループには上で作ったセキュリティグループ2つを指定して、自端末からの SSH 接続ができるようにします。最後に画面右の Create を選択します:
2020100302


指定した CentOS サーバーがデプロイされて稼働状態になるまで少し待ちます。

この後、この稼働したインスタンスにアクセスして作業するため、その接続のためのネットワーク情報を確認する必要があります。作成したインスタンスを選択します:
2020100304


まず選択直後は Overview ペインが選択され、概要が表示されています。この画面でパブリックネットワークに割り振られた IP アドレスを確認します(この直後の SSH ログイン時に指定します):
2020100305


また Passwords ペインを選択し、ログイン時のユーザー ID およびパスワードを確認しておきます。パスワードはマスクされていますが、目のアイコンを選択するとマスクが外れた状態で視認できるようになります:
2020100306


【CentOS 8 インスタンスへの OpenVPN サーバーのインストール&設定】

では作成した CentOS 8 インスタンスに SSH でログインし、OpenVPN サーバーとしてのセットアップを行っていきます。

まずは Teraterm や PuTTy、WSL などの SSH クライアントを使って、作成した CentOS 8 サーバーにログインします。先程確認した IP アドレス、ユーザー ID 、パスワードを使います:
2020100307


この後はしばらくこの SSH 端末からの入力作業が続きます。

まず最初に、この後 OpenVPN サーバーを EPEL リポジトリを使ってインストールすることになるため、EPEL リポジトリをインストールしておきます:
# dnf install -y epel-release

続けて OpenVPN サーバーや証明書作成に必要なツールなどをまとめてイントールします:
# dnf --enablerepo=epel -y install openvpn easy-rsa net-tools

ここまでの作業で OpenVPN サーバーそのものがインストールできました。続けて証明書ファイルを作成してゆきます(青字はコメントです):
(フォルダを移動)
# cd /usr/share/easy-rsa/3

(easyrsa 初期化)
# ./easyrsa init-pki

(認証局を作成)
# ./easyrsa build-ca

 この時にパスフレーズの入力を求められるので適当なフレーズを2回続けて入力。
 ここで入力したフレーズは下で再度入力する必要があります。


(サーバー証明書を作成) # ./easyrsa build-server-full server1 nopass
 途中でパスフレーズの入力を求められたら、上記で指定したフレーズを入力

(クライアント証明書を作成) # ./easyrsa build-client-full client1 nopass
 途中でパスフレーズの入力を求められたら、上記で指定したフレーズを入力

(DH を生成) # ./easyrsa gen-dh (TLS-Auth キーを生成) # openvpn --genkey --secret ./pki/ta.key (ここまでの作業で作成したファイル群をまとめて /etc/openvpn/server/ 以下にコピー) # cp -pR /usr/share/easy-rsa/3/pki/{issued,private,ca.crt,dh.pem,ta.key} /etc/openvpn/server/ (IP フォワードの設定のため、このファイルを新規作成) # vi /etc/sysctl.d/10-ipv4_forward.conf  (ファイル内容はこの1行だけ)  net.ipv4.ip_forward = 1 (IP フォワード有効化) # sysctl --system (サーバー設定ファイルのサンプルをコピー) # cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/ (サーバー設定ファイルを実際の環境に合わせて書き換え、変更内容は以下) # vi /etc/openvpn/server/server.conf  (78行目 コピーした証明書ファイル名を指定)  ca ca.crt  cert issued/server1.crt  key private/server1.key  (85行目 コピーした DH ファイル名を指定)  dh dh.pem    (101行目 VPN で使用する IP レンジを指定、ユーザーの環境と重複しないもの)  server 192.168.123.0 255.255.255.0  (142行目 コメントを解除して、上で確認したプライベート VLAN のネットワークを指定)  push "route 10.193.122.64 255.255.255.192"  (222行目 コメントを解除)  duplicate-cn  (267行目 コメントを解除して値を 32 (クライアント上限数)に変更)  max-clients 32  (287行目 ログファイルの保管場所をフルパス指定)  status /var/log/openvpn-status.log  (296行目 コメントを解除してログファイルの保管場所をフルパス指定)  log /var/log/openvpn.log  log-append /var/log/openvpn.log (変更内容を有効にして再起動) # systemctl enable --now openvpn-server@server
(プライベート VLAN とパブリック LAN のルーティング設定)
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT


※最後のルーティング設定部分はこのコマンドで実行した場合は再起動時に無効になってしまいます。恒久的に有効にする場合は /etc/rc.d.rc.local などに書いておく、などの対応が必要です。


これで対象プライベート VLAN に接続するための OpenVPN サーバーができあがりました。SSH はログアウトして構いません。


【OpenVPN クライアントのインストール&設定】

VPN サーバー側が用意できたので、残すは VPN クライアント側だけです。以下は Windows 10 を想定した内容で紹介します。

まだ OpenVPN クライアントをインストールしていない場合は以下からダウンロードしてインストールします:
https://openvpn.net/community-downloads/


導入先フォルダ(デフォルトだと C:\Program Files\OpenVPN)内の config サブフォルダ内に、VPN サーバーから以下の4ファイルを転送します(書き込み時に Administrator 権限が必要です):
  • /etc/openvpn/server/ca.crt
  • /etc/openvpn/server/ta.key
  • /etc/openvpn/server/issued/client1.ca
  • /etc/openvpn/server/private/client1.key

更に、導入先フォルダ内の sample-config サブフォルダ内にある client.opvn ファイルを、config サブフォルダ内にコピーします(書き込み時に Administrator 権限が必要です)。上記と合わせて都合5つのファイルを config フォルダにコピーすることになります。

そして、この client.opvn ファイルをテキストエディタで開き、以下を編集して保存します(保存時に Administrator 権限が必要です):
(42行目 OpenVPN サーバーのパブリック IP アドレスを指定)
remote 165.192.xxx.xxx

(88行目 コピーした各種証明書ファイル名を指定)
ca ca.crt
cert client.crt
key client.key

これでサーバーとクライアント、全ての準備が整いました。

なお、このクライアント向け作業で用意した5つのファイルは(後述の動作確認後に)他のユーザーからも利用できるようになります。サーバーからのファイル転送や client.opvn ファイルの編集といった面倒な作業をユーザー全員にさせる必要はなく、ここで動作が確認できていれば同じファイルを流用することができます。


【動作確認】

実際に OpenVPN サーバーにアクセスして VPN 接続します。Windows の場合であればタスクバーから OpenVPN クライアントを右クリックして client に接続します(アイコンが緑になったら VPN 接続成功です):
2020100308


VPN 接続ができたら、プライベートアドレスを指定してプライベート VLAN 内のサーバーにアクセスできるようになっているはずです。ウェブブラウザやリモートデスクトップ接続といったサービスをプライベートアクセスで使ってみてください:
2020100309

2020100309



CentOS 7 で運用する独自ドメインのウェブサーバーを Certbot(Let's encrypt) で無料の証明書を取得して SSL 化しました。その手順の備忘録です:
le-logo-standard



【環境】
OS: CentOS 7.6(64bit)
HTTP: Apache HTTPD 2.4.6※

※正確には WordPress 5.2.2(ja) を MariaDB 5.5.60 で運用中。Apache と MariaDB は yum で導入、WordPress は公式サイトから最新版 latest-ja.tar.gz を取得して展開

Document Root: /var/www/html/wordpress
ドメイン名(仮): mydomain.com (DNS 設定済み)

1サーバーで1ドメイン運用、のシンプルなケースを想定しています。http では既に稼働中、という状態だと思ってください。


【準備】

Certbot のインストール
$ sudo yum install -y epel-release
$ sudo yum install -y certbot python-certbot-apache

root で動作確認
$ sudo -i
# certbot --version
certbot 0.36.0

certbot コマンドを実行し、バージョン番号が表示される(=インストールされている)ことを確認します。

【作業】

以下のコマンドを実行するにあたり、証明書を導入するサーバーに HTTP(TCP/80) および HTTPS(TCP/443) でパブリック・アクセスできるようにポート設定できているものとします。またDocument Root に Basic 認証などがかかっている場合は外しておきます(必須)。

証明書作成
# certbot certonly --webroot -w /var/www/html/wordpress -d mydomain.com

-w オプションで DocumentRoot、-d オプションでドメイン名を指定します。E メールアドレスの入力を求められるので自分のメールアドレスを入力して Enter 、そして利用規約に A(Agree) を押して、最後に N(No) を押します:
# certbot certonly --webroot -w /var/www/html/wordpress -d mydomain.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): myname@xxx.co.jp
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

処理が成功すると以下のような "Conguratulations!" というメッセージが表示されます:
2019082900


ここまで完了していると、以下の4ファイルが作成されているはずです(mydomain.com 部分には指定したドメイン名が入ります):
  1. /etc/letsencrypt/live/mydomain.com/cert.pem (サーバー証明書(公開鍵))
  2. /etc/letsencrypt/live/mydomain.com/chain.pem (中間証明書)
  3. /etc/letsencrypt/live/mydomain.com/fullchain.pem (サーバー証明書と中間署名書の結合ファイル 今回は使いません
  4. /etc/letsencrypt/live/mydomain.com/privkey.pem (秘密鍵)

証明書を有効にする

/etc/httpd/conf.d/ssl.conf ファイルの以下3箇所を書き換えて&コメントを外すなどして有効にします:
  • SSLCertificateFile /etc/letsencrypt/live/mydomain.com/cert.pem
  • SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem
  • SSLCertificateChainFile /etc/letsencrypt/live/mydomain.com/chain.pem
  • (fullchain.pem は使わない)

また、Basic 認証をかける場合はこのタイミングで元に戻して(有効にして)おきます。

HTTP サーバーを再起動
# systemctl restart httpd


以上です。僕が以前にウェブサーバーやそのアプリケーションを大量に作る仕事していた頃は無料で証明書作ってもらえるサービスはなくて、いわゆる「オレオレ証明書」に頼っていたのでした。改めていい時代になりました。


自分は(慣れの要素が大きいのですが)CentOS は未だに 6.x をメインに使っています。「別に不便じゃないし~」程度にしか考えていなかったのですが、その姿勢を改めた方がいいかなあ、と思うことがあったので、その時の様子と対処がいかに大変だったかをまとめました。

Linux で比較的新しめのアプリケーションを使おうとすると、たまにこんなエラーメッセージが出ることがあります:
./xxxxx: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./xxxxx)
./xxxxx: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./xxxxx)
./xxxxx: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by ./xxxxx)
./xxxxx: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /opt/Xxxxx/libnode.so)

これはシステムにインストールされている libstdc++(GLIBC) ライブラリが古く、動かそうとしているアプリケーションが要求するバージョン(上の例では 3.4.14 や 3.4.15)と合わないためのエラーが発生していることを意味しています。


※実はこのエラーはこのブログエントリの最後に「Rodeo は CentOS/RHEL 7.x 上で動かすのが無難」と書いた時の話です。CentOS 6.8 で普通に Rodeo をインストールして動かすと、ここで紹介しているようなエラーに遭遇するのでした:
CentOS に Rodeo(Python IDE)をインストールする


実際にシステムに組み込まれている libstdc++ のバージョンを確認するには以下のコマンドを実行します(青字は出力結果):
# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

この例の場合、3.4.1 から 3.4.13 までは組み込まれているシステムであることが分かります。このシステムで上記アプリケーションを動かそうとすると 3.4.14 や 3.4.15 は組み込まれていないため、上述のようなエラーが発生してしまう、ということになるのでした。エラーの原因はこれで特定できました。


この状況を回避するには libstdc++ を必要なバージョンが組み込まれた新しいものと入れ替える必要があります。そして libstdc++ は gcc に含まれるモジュールなので、(まず gcc ビルドの前提となる glibc を更新して、)gcc をビルドして、そこから libstdc++ を取り出して既存のものと入れ替える、というちと面倒な手順を実行する必要があるのでした。要するに libstdc++ を新しくするためには gcc をビルドする必要があるのです。。

更に、ここまでは全ての Linux ディストリビューションに言える内容なのですが、実際にこの手順を行う場合、CentOS/RHEL 6.x だとものすごく面倒な手順が待ち構えているのでした。実際に行った長い道のりを以下に紹介します。



まず、gcc のビルドに必要なヘッダーファイルをインストールします。具体的には gmp-devel, mpfr-devel, libmpc-devel が必要で、かつ 64bit 環境では glibc-devel.i686 までも必要になります。このうち libmpc-devel 以外は標準の yum リポジトリからインストールできますが、libmpc-devel は EPEL から入手する必要があります。

というわけで、まずは EPEL リポジトリをダウンロード:
# yum install epel-release

続けて上記3つのヘッダファイルと 32bit 版 glibc ヘッダをダウンロードします:
# yum install gmp-devel mpfr-devel libmpc-devel
# yum install glibc-devel.i686

ヘッダファイルの準備ができた所で最初に前提となる glibc をダウンロードしてビルドします。以下の例では /usr/local/src 以下にソースコードを展開しています:
# cd /usr/local/src
# wget http://ftp.gnome.org/pub/gnome/sources/glib/2.32/glib-2.32.4.tar.xz
# tar Jxvf glib-2.32.4.tar.xz
# rm glib-2.32.4.tar.xz
# cd glib-2.32.4
# ./configure
# make
# make install

そして、ここからやっと gcc のソースコードをダウンロードしてビルドします。ちなみにここから先の手順を行うためには 5GB 弱の空きディスク容量が必要になります。また make の実行を開始してから完了するまでに数時間かかります。スペックにもよりますが、昼寝ではなく一度マジ寝して起きる頃に終わっている、というくらいの時間を見ておく必要があります (^^;:
# cd /usr/local/src
# curl -LO http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.4/gcc-4.8.4.tar.gz
# tar fxz gcc-4.8.4.tar.gz
# rm gcc-4.8.4.tar.gz
# cd gcc-4.8.4
# ./configure
# make (僕の仮想環境ではここで4~5時間かかりました・・)
# make install

・・・で、gcc のビルドが無事に完了したら libstdc++ の入れ替えを行います。まずは現在の状況を確認します:
# ls -l /usr/lib64/libstdc*

lrwxrwxrwx 1 root root     19  1月 23 12:35 2017 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.13
-rwxr-xr-x 1 root root 989840  5月 10 18:38 2016 /usr/lib64/libstdc++.so.6.0.13

ビルドした結果から、目的のライブラリをコピーして、シンボリックリンクを作り直します:
# cp /usr/local/src/gcc-4.8.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/lib64
# cd /usr/lib64
# mv libstdc++.so.6 libstdc++.so.6.bak
# ln -s libstdc++.so.6.0.19 libstdc++.so.6
# ls -l /usr/lib64/libstdc*

lrwxrwxrwx 1 root root      19  2月 14 12:07 2017 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x 1 root root  989840  5月 10 18:38 2016 /usr/lib64/libstdc++.so.6.0.13
-rwxr-xr-x 1 root root 6468627  2月 14 12:06 2017 /usr/lib64/libstdc++.so.6.0.19
lrwxrwxrwx 1 root root      19  5月 26 11:23 2016 /usr/lib64/libstdc++.so.6.bak -> libstdc++.so.6.0.13

最後に目的のバージョン(今回であれば 3.4.14 や 3.4.15)が有効になっているかどうかを確認します:
# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

期待通りのライブラリに更新できました。これで CentOS 6.x でも Rodeo が動くようになりました。いやあ、長かった。めでたし、めでたし:
rodeo_centos6
↑今回のブログエントリは、この「CentOS 6.x 上で動く Rodeo」のスクリーンショットを撮るまでがいかに大変であったかを分かっていただきたいがために書きました。 (^^;


ここまで確認できれば glibc や gcc のソースコード一式は不要なので、消してしまっても構いません(何しろこの環境のために 5GB 前後のディスクを専有しているので・・・)
# cd /usr/local/src
# rf -rf glib-2.32.4 # rm -rf gcc-4.8.4




(参考)
http://qiita.com/dozo/items/de393588d5c267794ced

https://www.saintsouth.net/blog/update-libstdcpp-on-centos6/



 

マルチプラットフォーム対応の Python IDE である Rodeo を CentOS/RHEL にインストールする手順を紹介します:
https://www.yhat.com/products/rodeo

2017021300


といっても手順として特別なことはなく、リポジトリを追加して yum でインストールするだけです:
$ sudo wget http://rodeo-rpm.yhat.com/rodeo-rpm.repo -P /etc/yum.repos.d/
$ sudo yum install rodeo

インストール後、アプリケーションメニューの「その他」から起動できます:
2017021301


はい起動しました。簡単ですね~(※CentOS/RHEL 7 の場合)
rodeo_centos6


機械学習や数値解析に便利なライブラリが充実している Python をより便利に使うための Python IDE も充実してきてるんですね。。


なお、上でわざと(※CentOS/RHEL 7 の場合)と強調しているのには意味があります。ご覧のように上記のスクリーンショットは CentOS 6 上で動いている Rodeo の画像なのですが、この環境を作るのは一筋縄ではいかなかった、という背景があります(このスクリーンショットを撮るまでの作業が、まあ大変でした・・・)。別の機会に詳しく書くかもしれませんが、とりあえず Rodeo は CentOS/RHEL 7.x 上で動かすのが無難、と付け加えておきます。


IBM Bluemix からも提供しているビジュアルフローエディタ Node-RED の最新バージョン v0.16 がリリースされました(2017/Jan/17 時点での最新版は v0.16.1):
https://libraries.io/npm/node-red/


新機能などの情報についてはこちらの公式ブログエントリや、
http://nodered.org/blog/2017/01/11/version-0-16-released

こちらのリリースノートを参照ください:
https://github.com/node-red/node-red/releases/tag/0.16.0


さて、上記ブログエントリにも書かれているのですが、この v0.16 より Node.js の v0.10 および v0.12 がサポート外になりました。Node.js も v4 以上のものを用意する必要があります。

これで問題になるのが CentOS/RHEL 6.x を使っている場合です。現在、CentOS/RHEL 6.x で(epel リポジトリなどを使って)普通に Node.js を導入すると v0.10.48 が導入されます:
# node -v
v0.10.48

IBM からも IBM SDK for Node.js として IBM 版の Node.js がリリースされていますが、こちらも CentOS/RHEL 6.x は v0.12 までしか用意されておらず、Node.js v4 以上を使おうとすると CentOS/RHEL であれば 7.x を使う必要があります:
https://developer.ibm.com/node/sdk/

2017011702


ちなみに Node.js v0.10.x が導入された状況下で深く考えずに npm を使って Node-RED を導入すると、最新バージョン(今であれば v0.16.1)が導入されてしまいます。その結果起動時にエラーが発生し、ユーザー画面にもエラーメッセージが表示されてしまいます:
# npm install node-red -g  (このコマンドは成功する)

# node-red
  :
  :
Welcome to Node-RED
===================

17 Jan 10:10:33 - [info] Node-RED version: v0.16.1
17 Jan 10:10:33 - [info] Node.js  version: v0.10.48
17 Jan 10:10:33 - [error] *****************************************************************
17 Jan 10:10:33 - [error] * Unsupported version of Node.js. Requires: >=4 Found: v0.10.48 *
17 Jan 10:10:33 - [error] *****************************************************************
17 Jan 10:10:33 - [info] Linux 2.6.32-642.11.1.el6.x86_64 x64 LE
17 Jan 10:10:33 - [info] Loading palette nodes

/usr/lib/node_modules/node-red/node_modules/mqtt/lib/connect/index.js:100
    const isSecure = ['mqtts', 'wss'].indexOf(opts.protocol) !== -1
    ^^^^^
17 Jan 10:10:35 - [warn] ------------------------------------------------------
17 Jan 10:10:35 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node
17 Jan 10:10:35 - [warn] [mqtt] SyntaxError: Use of const in strict mode.
17 Jan 10:10:35 - [warn] ------------------------------------------------------
17 Jan 10:10:35 - [info] Settings file  : /root/.node-red/settings.js
17 Jan 10:10:35 - [info] User directory : /root/.node-red
17 Jan 10:10:35 - [info] Flows file     : /root/.node-red/flows_xxxxxxxx.xxxxx.xxx.json
17 Jan 10:10:35 - [info] Creating new flow file
17 Jan 10:10:35 - [info] Server now running at http://127.0.0.1:1880/
17 Jan 10:10:35 - [info] Starting flows
17 Jan 10:10:35 - [info] Started flows

↑起動が成功したように見えるが、バージョン非互換のエラーが発生している

2017011701


では改めて CentOS/RHEL 6.x のバージョンアップをせずにどうやって Node-RED を導入すればよいでしょうか? Node-RED の最新版を動かすために工夫する、というのも1つの方法ですが、Node-RED が最新版でなくてもよい場合であれば Node-RED v0.14.x を使う、という方法もあります。このバージョンであれば CentOS/RHEL 6.x でも動作します。

その場合の手順を紹介します。まず上記のコマンドを実行してしまって Node-RED v0.16.x を導入してしまった場合はアンインストールします:
# npm uninstall node-red -g

リリースサイトを見ると、v0.14.x の最新バージョンは v0.14.6 のようです(2017/Jan/17 時点)。というわけで、改めてこのバージョンを指定して npm でインストールします:
# npm install node-red@0.14.6 -g

こうしてインストールした Node-RED を起動すればエラーは発生しません:
# node-red
  :
  :
Welcome to Node-RED
===================

17 Jan 10:15:55 - [info] Node-RED version: v0.14.6
17 Jan 10:15:55 - [info] Node.js  version: v0.10.48
17 Jan 10:15:55 - [info] Linux 2.6.32-642.11.1.el6.x86_64 x64 LE
17 Jan 10:15:55 - [info] Loading palette nodes
17 Jan 10:15:58 - [warn] ------------------------------------------------------
17 Jan 10:15:58 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node
17 Jan 10:15:58 - [warn] ------------------------------------------------------
17 Jan 10:15:58 - [warn] Missing node modules:
17 Jan 10:15:58 - [warn]  - node-red: yaml
17 Jan 10:15:58 - [info] Removing modules from config
17 Jan 10:15:58 - [info] Settings file  : /root/.node-red/settings.js
17 Jan 10:15:58 - [info] User directory : /root/.node-red
17 Jan 10:15:58 - [info] Flows file     : /root/.node-red/flows_xxxxxxxx.xxxxx.xxx.json
17 Jan 10:15:58 - [info] Creating new flow file
17 Jan 10:15:58 - [info] Starting flows
17 Jan 10:15:58 - [info] Started flows
17 Jan 10:15:58 - [info] Server now running at http://127.0.0.1:1880/

↑起動成功

というわけで、現時点で比較的簡単に CentOS/RHEL 6.x で Node-RED を動かす場合はこの方法になるのかな、と思ってます:
2017011703


なお、CentOS/RHEL 6.x に Node.js v4.x を導入してから Node-RED v0.16.x を入れる、という方法もあります。CentOS/RHEL 6.x に Node.js v4.x を入れる方法についてはこちらに詳しく書かれていました:
CentOS 6.xにLTS(4.3.0)のnode.jsをインストールする

このページのトップヘ