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

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

タグ:install

前回に引き続き yum(dnf) 関連の小ネタです。


前回のおさらいも含めますが、yum を使って、例えば "wget" をインストールしようとする場合、以下のような "yum install" コマンドを実行することになります:
# yum install wget
Updating Subscription Management repositories.
Last metadata expiration check: 1:19:58 ago on Mon Jan  1 09:30:11 2024.
Dependencies resolved.
================================================================================
 Package Arch      Version            Repository                           Size
================================================================================
Installing:
 wget    x86_64    1.21.1-7.el9       rhel-9-for-x86_64-appstream-rpms    794 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 794 k
Installed size: 3.1 M
Is this ok [y/N]:

普通にインターネット環境が整っていれば、インターネット上のリポジトリを参照し、必要な依存ライブラリと現在の OS にインストール済みのライブラリとを比較し、足りない(追加でインストールが必要な)ライブラリとまとめてインストールしてくれます。一般的な利用であればこれだけ覚えておけば充分なケースも少なくありません。

ただ少し特殊なケース、例えば「インターネット接続環境がない」 CentOS/RHEL 環境の場合にどうやってインストールするか、というのは少し工夫が必要になります。今回のブログのテーマがこれです。

これはケース・バイ・ケースなんですが、おそらく以下(1)~(3)のいずれかの方法で解決できると思っています。実現が容易な順に(1)から(3)と記載しているので、数字が小さい方法で解決できるものかどうかを調べて、できない場合は次の数字へ、、という順に調べていただくのがおススめです。なおインストールするパッケージのライセンスに関わる問題は解決済みである(正式なライセンスを持っていて、インターネット接続できている場合はライセンス含めて問題なくインストールできるもの)と仮定します。

(1)DVD や ISO などのインストールメディアを持っている場合、

インターネット環境はないけれど、OS のインストール時に使った DVD メディアや、その ISO ファイルを持っているようなケースです(本来なら初期インストール時に一緒に入れておけばよかったのに入れ忘れたケースも含みます)。目的のファイルの rpm パッケージが含まれたメディアが手元にある場合は、そのメディアを使ってインストールすることが可能です。

具体的にはそのメディアをマウントした上で、ローカル環境に新しいリポジトリを1つ追加することで、インターネット上ではなく、ローカルファイルシステムに展開されたリポジトリが使えるようになり、そのローカルリポジトリを使ってインストールする、という方法です。少し古い環境で書かれていますが、以前に書いたこちらのブログエントリを参照するとより具体的な手順を説明しています:
ローカル環境内に yum リポジトリを作成する


(2)DVD や ISO などのインストールメディアを持っていない場合、

問題はこちらです。インターネット上に目的のパッケージファイルがあり、インストール用 DVD や他の DVD などでは提供されていないようなケースです(ansible などはこのパターンです)。インターネットに接続されている状況下であれば普通に "yum install" でインストールできるけど、接続がないとモジュールにアクセスできないのでインストールできない、ということになります。

これも考え方としては(1)と同様で「なんとかしてインストールに必要なファイルを入手して、ローカルファイルシステム上に用意」して、「ローカルリポジトリを作ってインストールする」ことになります。問題は「なんとかしてインストールに必要なファイルを入手」する部分です。

ここから先は実際にインターネットに接続されていない環境(目的のインストールを行う環境)とは別にインターネットに接続された環境を用意するか、その環境を一時的でいいのでインターネットに接続して実施する必要があります。インターネット接続のある環境で準備して、準備したファイルを目的の環境にコピー(転送)すれば、後は(1)と同様にできる、というやり方です。この前提が必要となる点に注意してください。

さて、インターネット接続のある環境で目的のファイルを(インストールではなく)ダウンロードだけ行うにはどのようにすればいいでしょうか? 例えば上述の "wget" の例で考えると、「"yum install wget" の結果としてダウンロードされてインストールされるファイルをダウンロードだけしたい」ことになります。

これは yum のオプション指定で可能でした。具体的には以下2つのオプションを指定します:
 ・"--downloadonly"
 ・"--destdir=(保存先ディレクトリ)"

"wget" の例だと以下のように実行します(この例だと保存先に /tmp を指定し、また確認プロンプトで止めないように "-y" オプションも指定しています):
# yum install --downloadonly --destdir=/tmp -y wget
Updating Subscription Management repositories.
Last metadata expiration check: 0:59:59 ago on Tue Jan  2 05:56:23 2024.
Dependencies resolved.
================================================================================
 Package       Architecture    Version                  Repository         Size
================================================================================
Installing:
 wget          x86_64          1.21.1-7.el9             myrhel92          794 k

Transaction Summary
================================================================================
Install  1 Package

Total size: 794 k
Installed size: 3.1 M
YUM will only download packages for the transaction.
Downloading Packages:
Complete!

成功すると(私の環境だと) "/tmp/wget-1.21.1-7.el9.x86_64.rpm" というファイルがダウンロードできていました。具体的なファイル名は実行環境やタイミングによって(バージョンなどが)少し変わる可能性もありますが、目的のファイルがダウンロードできたことになります。 ちなみにこうしてダウンロードできた rpm ファイルをスタンドアロン環境でインストールするには、上述のようなローカルリポジトリを作って行う場合以外にも、
# yum install /tmp/wget-1.21.1-7.el9.x86_64.rpm

のようにフルパス指定することでも可能になります。

ちなみに、上の wget のケースでは rpm ファイル1つだけが必要で、ダウンロードファイルも1つだけでした。これが、
# yum install --downloadonly --destdir=/tmp jq
Updating Subscription Management repositories.
Last metadata expiration check: 1:06:58 ago on Tue Jan  2 05:56:23 2024.
Dependencies resolved.
================================================================================
 Package           Architecture   Version                Repository        Size
================================================================================
Installing:
 jq                x86_64         1.6-14.el9             myrhel92         190 k
Installing dependencies:
 oniguruma         x86_64         6.9.6-1.el9.5          myrhel92         221 k

Transaction Summary
================================================================================
Install  2 Packages

Total size: 411 k
Installed size: 1.1 M
Is this ok [y/N]:

のように依存ライブラリが存在しているような場合はどうなるのでしょうか? 答はシンプルで「依存ファイルもまとめてダウンロード」されることになります。上の例だと、
 ・/tmp/jq-1.6-14.el9.x86_64.rpm
 ・/tmp/oniguruma-6.9.6-1.el9.5.x86_64.rpm

という2つのファイルがダウンロードされます。ダウンロード後のインストールは2つのファイルをそれぞれフルパス指定してローカルインストールしてもいいですし、2つのファイルを含むローカルリポジトリを作ってから "yum install jq" を実行する、でもセットアップできます。


(3)既にインストール済みの場合、

最後はちょっとややこしいケースです。例えば "wget" のモジュールをダウンロードしようとして、以下のようなメッセージがでることがあります:
# yum install --downloadonly --destdir=/tmp -y wget
Updating Subscription Management repositories.
Last metadata expiration check: 1:14:12 ago on Tue Jan  2 05:56:23 2024.
Package wget-1.21.1-7.el9.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

「(この環境には)既にインストール済みなので何もすることはない」というメッセージが表示されています。ある程度環境が整っているマシンで実行すると、このようなケースは珍しくないと思っています。が、元々このマシンでインストールしたくてダウンロードしているのではなく、別のインターネットにつながっていないマシンでローカルインストールできるようにするためのダウンロードをしているので、今のマシンにインストールされているかどうかは関係なくダウンロードしたい、という背景があります。

これは「1度アンインストールする」ことで話が単純になります。つまり、
 ・一度アンインストール
 ・ローカルにダウンロード(上の(2)の手順)
 ・再度インストール(環境を元に戻す)
を順に実施することで目的のファイルのダウンロードができます。


っていうか、インターネットのない環境でのセットアップ、って今はもうかなり面倒なことになってきているんですね。まあ確かに「内側からインターネットに出ていくだけ」すら許されない環境って、「そのせいでここまでセットアップにコストがかかる」デメリットを凌ぐだけの理由があるんだろうか?? という気がして・・・ あ、いえいえ、仕事の愚痴ではありませんよ。


2024 年最初のブログとなりました。「ブログの書初め」です、本年もよろしくお願いします。

CentOS / RHEL 系の Linux で rpm パッケージをインストールする際には "yum"("dnf" 派の人もいるかもしれませんが、ここでは "yum" で統一します。内容は同じなので単純に読み替えていただいて大丈夫です)を使う機会が多いと思っています。

この yum を使って、例えば "wget" をインストールしようとすると、
# yum install wget

というコマンドを実行します。すると、
# yum install wget
Updating Subscription Management repositories.
Last metadata expiration check: 3:32:04 ago on Mon Jan  1 05:44:30 2024.
Dependencies resolved.
================================================================================
 Package Arch      Version            Repository                           Size
================================================================================
Installing:
 wget    x86_64    1.21.1-7.el9       rhel-9-for-x86_64-appstream-rpms    794 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 794 k
Installed size: 3.1 M
Is this ok [y/N]:

↑のようなメッセージが表示されて、最後に "Is this ok [y/N]:" と確認メッセージが表示されて止まります。「このパッケージをインストールするよ、OK?」と聞かれていて、"y" と入力するとインストール開始、"n" だとインストールせずに終了します("[y/N]" と "N" が大文字になっているのでデフォルトは "n" ということになります。つまりそのままリターンキーを入力すると "n" とみなされます)。

で、この確認メッセージで止まるのが面倒な場合、つまり「正しいことはわかっているから、いいからインストールして」と思っている場合はコマンドのどこか(最後とか)に "-y" オプションを指定します。つまり、
# yum install wget -y

と入力することで、確認メッセージなしでインストールを始めることができます。シェルスクリプトなどで連続実行したい場合はよく使いますよね。


で、このブログのメインはここからです。需要は少ないかもしれないのですが、「この "-y" の逆のオプションって何だろう?」という疑問が生じて調べてみました。要は「 "yum install" のインストール直前までを実行して、インストールせずに終了する」ようなオプションです。

単純に「 "-n" かな?」と思ったのですが「そんなパラメータ知らん」と怒られてしまいました:
# yum install wget -n
Updating Subscription Management repositories.
usage: yum install [-c [config file]] [-q] [-v] [--version]
                   [--installroot [path]] [--nodocs] [--noplugins]
                   [--enableplugin [plugin]] [--disableplugin [plugin]]
                   [--releasever RELEASEVER] [--setopt SETOPTS]
                   [--skip-broken] [-h] [--allowerasing] [-b | --nobest] [-C]
                   [-R [minutes]] [-d [debug level]] [--debugsolver]
                   [--showduplicates] [-e ERRORLEVEL] [--obsoletes]
                   [--rpmverbosity [debug level name]] [-y] [--assumeno]
                   [--enablerepo [repo]] [--disablerepo [repo] | --repo
                   [repo]] [--enable | --disable] [-x [package]]
                   [--disableexcludes [repo]] [--repofrompath [repo,path]]
                   [--noautoremove] [--nogpgcheck] [--color COLOR] [--refresh]
                   [-4] [-6] [--destdir DESTDIR] [--downloadonly]
                   [--comment COMMENT] [--bugfix] [--enhancement]
                   [--newpackage] [--security] [--advisory ADVISORY]
                   [--bz BUGZILLA] [--cve CVES]
                   [--sec-severity {Critical,Important,Moderate,Low}]
                   [--forcearch ARCH]
                   PACKAGE [PACKAGE ...]
yum install: error: unrecognized arguments: -n

"-n" ではないとしたら、果たしてそんなオプショことがあるのか(そもそも「そんなオプション使うことがあるのか?」と言われそうですが、その件についてはいずれまた)、という疑問が生じ、一度ちゃんと調べてみました。結論としては存在していて、上のエラーメッセージ内にも表示されている "--assumeno" オプションでした。このオプションを付けて実行することで、インストールされる rpm ライブラリに関する(アーキテクチャやバージョン、サイズなどの)情報を表示されるだけでインストールは実行しない、という挙動が可能になります:
# yum install wget --assumeno
Updating Subscription Management repositories.
Last metadata expiration check: 0:09:21 ago on Mon Jan  1 09:30:11 2024.
Dependencies resolved.
================================================================================
 Package Arch      Version            Repository                           Size
================================================================================
Installing:
 wget    x86_64    1.21.1-7.el9       rhel-9-for-x86_64-appstream-rpms    794 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 794 k
Installed size: 3.1 M
Operation aborted.

# 

インストールは何もせずに "Operation aborted." と表示されてプロンプトに戻ってきました(この挙動は "n" を入力した時と全く同じです)。


インストールしようと思っているライブラリに関する情報だけを収集するようなシェルスクリプトを作るようなケースで役立つ、かもしれない、情報でした。



ラズベリーパイネタシリーズです。

今回はオープンソースのブロックチェーン基盤である Hyperledger Fabric を一通り Raspbian OS に導入して実行する手順を紹介します。まあラズパイの 1GB 物理メモリでどこまで実用的に動くか、というのはあまり期待できないし、また現時点では Hyperledger Fabric はともかく、Hyperledger Composer を使った動作は 32bit OS である Raspbian OS ではどうやら難しいのかもしれない・・・と感じていることを最初に申し上げておきます。 なお以下で紹介する手順はこの環境で確認しています:

モデル: Raspberry Pi 3B+
OS: Raspbian 2018-11-13 (Stretch Full) ※最新版はこちら
SD カード: 128GB

※ページ最下の【参考】でも参照しているリンク先では Docker Swarm 環境で3台のラズパイを使った Hyperledger Fabric 環境構築を紹介しています。実用面ではこちらのほうが現実的かもしれません。



【導入手順】
基本方針として、このブログエントリ最下段の【参考】で記した2つのページの情報をあわせた方法で導入しています。

おおまかには以下の順序で Hyperledger Fabric 環境を構築します:
0. 事前準備
1. Docker 導入
2. Docker Compose 導入
3. Docker Image ダウンロード
4. 起動


今回は1台のラズパイの中に Docker 環境を構築し、その Docker の中で各種 Hyperledger Fabric のイメージを1インスタンスずつ動かして環境構築します。そのため上記のような順序でインストールする必要があります。


【0. 事前準備】
今回 Hyperledger Fabric を Docker 上で動かします。そのためラズパイに Docker 等を導入することになるのですが、そのための前提ライブラリ等を用意しておきます。ラズパイのターミナル等を開いて、以下のコマンドを順次実行します:
リポジトリ更新
$ sudo apt-get update && sudo apt-get upgrade -y

依存ライブラリを導入
$ sudo apt-get install git curl gcc libc6-dev libltdl3-dev python-setuptools -y

python pip インストーラーを更新
$ sudo -H pip install pip --upgrade

ここまでの操作が完了すると、ラズパイ用の Docker がインストールできるようになります。


【1. Docker 導入】

上記に続いて以下のコマンドを実行します:
Docker 導入
$ curl -sSL get.docker.com | sh

Docker の実行権限設定
$ sudo usermod -aG docker pi

ここまで完了したら一度ログアウトし、再度ログインします(最後の実行権限設定が有効になります)。ここまで正しく実行できていると、sudo なしで docker コマンドを実行することができるようになっているはずです:
Docker バージョン確認
$ docker -v
↑ Docker のバージョンが表示されれば、ここまでの手順は完了です。


【2. Docker Compose 導入】

引き続き Docker Compose を導入します。こちらは pip を使って導入し、導入後はすぐにコマンドを実行することが可能です:
Docker Compose 導入
$ sudo pip install docker-compose

Docker Compose バージョン確認
$ docker-compose -v
↑ Docker Compose のバージョンが表示されれば、ここまでの手順は完了です。


【3. Docker イメージダウンロード】

こちらのサイトで提供されている、ラズパイ用にビルド済みの Hyperledger Fabric (v1.0.7) の Docker イメージ群を docker pull コマンドでダウンロードします:
$ docker pull jmotacek/fabric-baseos:armv7l-0.3.2

$ docker pull jmotacek/fabric-basejvm:armv7l-0.3.2

$ docker pull jmotacek/fabric-baseimage:armv7l-0.3.2

$ docker pull jmotacek/fabric-ccenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-javaenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-peer:armv7l-1.0.7

$ docker pull jmotacek/fabric-orderer:armv7l-1.0.7

$ docker pull jmotacek/fabric-buildenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-testenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-zookeeper:armv7l-1.0.7

$ docker pull jmotacek/fabric-kafka:armv7l-1.0.7

$ docker pull jmotacek/fabric-couchdb:armv7l-1.0.7

$ docker pull jmotacek/fabric-tools:armv7l-1.0.7

自分でビルドする方法もあるようなのですが、あまりに面倒そうなので出来合いのものを使わせていただきました。 jmotacek 様、ありがとうございます。


これで Hyperledger Fabric 環境を動かすために必要な準備が完了しました。


【4. 起動】
Hyperledger Fabric の準備が整ったので起動します。ラズパイ1台で(物理メモリ 1GB で)この環境を起動するのは、できるか/できないかで言えばできそうですが、実用には厳しいかもしれません。環境に応じてスワップメモリを増やしておきましょう。方法はこちらを参照ください(私自身はスワップを 2GB に設定して以下を実行しました)。

Hyperledger Fabric の起動スクリプトの元となるキット(通称「サポートツール」)をダウンロード&展開します。以下の例ではホームディレクトリ以下に fabric/ というフォルダを作り、その中に展開しています:
$ mkdir ~/fabric

$ cd ~/fabric

$ curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip

$ unzip fabric-dev-servers.zip

この中の docker-compose.yml ファイルを上記で用意したラズパイ向け Docker イメージ用に書き換えます。具体的には ~/fabric/fabric-scripts/hlfv12/composer/docker-compose.yml を以下のように編集しました(変更部分をにしています):
version: '2'

services:
#  ca.org1.example.com:
#    image: jmotacek/fabric-ca:armv7l-1.0.7
#    environment:
#      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
#      - FABRIC_CA_SERVER_CA_NAME=ca.org1.example.com
#
#    ports:
#      - "7054:7054"
#    command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/19ab65abbb04807dad12e4c0a9aaa6649e70868e3abd0217a322d89e47e1a6ae_sk -b admin:adminpw -d'
#    volumes:
#      - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
#    container_name: ca.org1.example.com
#
  orderer.example.com:
    container_name: orderer.example.com
    image: jmotacek/fabric-orderer:armv7l-1.0.7
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/composer-genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    ports:
      - 7050:7050
    volumes:
        - ./:/etc/hyperledger/configtx
        - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/etc/hyperledger/msp/orderer/msp

  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    image: jmotacek/fabric-peer:armv7l-1.0.7
    environment:
      - CORE_LOGGING_LEVEL=debug
      - CORE_CHAINCODE_LOGGING_LEVEL=DEBUG
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=composer_default
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/msp
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: peer node start
    ports:
      - 7051:7051
      - 7053:7053
    volumes:
        - /var/run/:/host/var/run/
        - ./:/etc/hyperledger/configtx
        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/peer/msp
        - ./crypto-config/peerOrganizations/org1.example.com/users:/etc/hyperledger/msp/users
    depends_on:
      - orderer.example.com
      - couchdb

  couchdb:
    container_name: couchdb
    image: jmotacek/fabric-couchdb:armv7l-1.0.7
    ports:
      - 5984:5984
    environment:
      DB_URL: http://localhost:5984/member_db

そして起動コマンドを実行します:
$ cd ~/fabric

$ ./startFabric.sh

↓こんな感じで Docker 内でイメージがコンテナ化され、実行されていきます:
2019011003


少し時間がかかりますが(1分くらい?)コマンドが完了すると、こんな画面になってプロンプトが戻ります:
2019011004


以下のコマンドで起動中のコンテナの状態を確認し、Hyperledger Fabric の各種コンテナが実行されていることを確認します:
$ docker ps

↓docker-compose.yml で指定されたイメージが起動していることが確認できます。Hyperledger Fabric の起動に成功しました!:
2019011002


ちなみに、この「Hyperledger Fabric が起動しただけ」の段階で使用メモリを確認してみました。起動しただけであれば意外と余裕あるようにも見えますね・・・
2019011006



【(途中まで)使ってみる】
Hyperledger Fabric の導入と起動までであれば上記までで完了していますが、せっかくなのでこの環境を使ってみることにします(といっても、以下で紹介しているのはカードファイルのインポートまでですが・・)。

具体的には「サポートツールで提供されているスクリプトを使って管理者用のカードファイルを作成する」ところまでを紹介します。といってもここから先はラズパイ特有の部分はなく、通常の方法と一緒というか、通常と同じ方法でできる所までを紹介する、というスタンスです。

そのために composer コマンドと呼ばれる、Hyperledger Composer のコマンドラインツールを導入するのですが、その前提として Node.js v8.x 環境(node と npm)が必要になります。ここがちとややこしいのですが、今回の導入に使った Raspbian OS 2018-11-13 (Stretch Full) でははじめから V8 の node コマンドは使えるようになっていますが、npm が導入されていません。というわけで今後のことも考えて node のバージョン管理ツール(n package)と合わせて Node.js v8.x を導入しておくことにします:
一旦 npm を導入
$ sudo apt-get install npm

キャッシュを更新
$ sudo npm cache clean

n package をインストール
$ sudo npm install n -g

n package で導入できる Node.js のバージョン(8.xx.xx の最新バージョン)を確認
$ sudo n list

(8.xx.xx の中では 8.15.0 が最新であったと仮定)
Node.js V8.15.0 を指定してインストール $ sudo n 8.15.0

一度ログアウト&ログインし直して、改めて node コマンドと npm コマンドのバージョンを確認します:
$ node -v
v8.15.0

$ npm -v
6.4.1
↑ Node.js V8.x と対応する npm が導入できたことを確認


Node.js 環境が整ったので、改めて composer コマンドをインストールします。今回用意した Hyperledger Fabric のバージョンが v1.0.7 のイメージなので、このバージョンに合う composer-cli v0.16 を指定してインストールします(※):
$ sudo npm install --unsafe-perm -g composer-cli@0.16

※ラズパイ環境だからかもしれませんが、上記の --unsafe-perm オプションを付けないと実行結果がエラーになってしまうようでした。こちらを参照。


そしてサポートツール内の createPeerAdminCard.sh を実行して、PeerAdmin@hlfv1 のカードを作成します:
$ cd ~/fabric/fabric-scripts/hlfv1

$ ./createPeerAdminCard.sh

composer のコマンドで、PeerAdmin@hlfv1 カードが作成されていることを確認します:
$ composer card list
2019011101


とりあえず動作確認できたのはここまでです。2019/01/11 時点でこの先に進もうとして BNA ファイルを用意して composer runtime install し(ここまでは成功)、composer network start させようとすると、以下のようなエラーになりました:
Error: Error trying to instantiate composer runtime. Error: No valid responses from any peers.
Response from attempted peer comms was an error: Error: Error starting container: API error (400): {"message":"Minimum memory limit allowed is 4MB"}
2019011102


このエラーの原因がまだわかっていないのですが、調べた範囲ではもしかすると 32bit OS である Raspbian OS に原因があるような気もしていて、そうだとすると現時点で Hyperledger Composer のこの先を動かすのは厳しいのかなあ・・・ とも思っています。

この辺りは引き続き調査もしますが、情報求む(苦笑)。


【Hyperledger Fabric を終了する】
起動した Hyperledger Fabric を終了するには startFabric.sh と同じフォルダにある stopFabric.sh を実行します:
$ ./stopFabric.sh

↓終了できました:
2019011005



実メモリ 1GB の制約はどうにもならないので実用的な使い方は難しいかもしれませんが、とりあえず1台のラズパイで Hyperledger Fabric が起動できることは確認できました。CouchDB などを使わずに、既存のビジネスネットワークに Peer だけ動かして接続するような使い方であればもう少し余裕を持って使えるかもしれません。


秋葉原の最安値で済ませることができれば、
 本体 5000 円 + ケース 1000 円 + Micro SDカード 2000 円
8000 円程度で Hyperledger Fabric のブロックチェーン環境が一台確保できる、ということになりますね。安っ!


【参考】
https://stackoverflow.com/questions/45800167/hyperledger-fabric-on-raspberry-pi-3
https://www.joemotacek.com/hyperledger-fabric-v1-0-on-a-raspberry-pi-docker-swarm-part-2/

Node.js を使ったアプリケーション開発中に npm install を実行して、こんなエラーに遭遇することがあります(個人的な印象では下の例のように canvas モジュールをインストールしようとした際によく遭遇します):
$ npm install canvas

> canvas@1.6.11 install /Users/dotnsf/src/tmp/node_modules/canvas
> node-gyp rebuild

gyp WARN download NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, please use NODEJS_ORG_MIRROR
gyp ERR! configure error 
gyp ERR! stack Error: Python executable "/Users/dotnsf/.pyenv/shims/python" is v3.6.5, which is not supported by gyp.
gyp ERR! stack You can pass the --python switch to point to Python >= v2.5.0 & < 3.0.0.
gyp ERR! stack     at PythonFinder.failPythonVersion (/Users/dotnsf/.nvm/versions/node/v8.9.4/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:492:19)
gyp ERR! stack     at PythonFinder. (/Users/dotnsf/.nvm/versions/node/v8.9.4/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:474:14)
gyp ERR! stack     at ChildProcess.exithandler (child_process.js:267:7)
gyp ERR! stack     at emitTwo (events.js:126:13)
gyp ERR! stack     at ChildProcess.emit (events.js:214:7)
      :
      :

スクリーンショット 2018-08-21 9.44.07


Node.js でネイティブモジュールのビルドが必要になった場合に node-gyp を使ってビルドが行われるのですが、その際に使われる Python のバージョンがあっていない、というエラーです。ちと厄介なのは Python のバージョンが古くて問題になっているのではなく、新しすぎてエラーが発生している、ということです(上の例では v2.5.0 以上 v3.0.0 未満でないといけないのに v3.6.5 がインストールされていてエラーが発生している、というメッセージが表示されています)。

この解決のためにわざわざ古いバージョンをインストールしないといけないのか、ということはなく、以下のようにバージョンを明示して npm install することで解決できます:
$ npm install canvas --python=python2.7

> canvas@1.6.11 install /Users/dotnsf/src/tmp/node_modules/canvas
> node-gyp rebuild

gyp WARN download NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, please use NODEJS_ORG_MIRROR
      :
      :

+ canvas@1.6.11
added 2 packages in 10.027s


マルチスレッド&マルチコア&オンメモリで超ハイパフォーマンス NoSQL 型データベース、と言われている Aerospike をインストールしてみました:
2016081000


Aerospike は Docker や Vagrant のイメージが配布されていたり、AWS や GCE の仮想イメージが配布されていたりするので、これらを使うと「インストール」という作業を行わなくてもそのまま使えちゃいます(現にそのイメージを使う解説サイトも目立ちます)。が、今回はオンプレミスや普通の(?)仮想マシンでも使えるように、サーバーソフトの導入手順を紹介します。例によって CentOS 6.x が対象です。

まず Aerospike の動作には Python (2.6+)、Python ライブラリ、そして gcc が必要になります。これらの前提ライブラリをまとめてインストールしておきます:
# yum install gcc python python-devel

改めて、ここから Aerospike の環境を揃えていきます。今回は無料版であるコミュニティエディションのサーバーノード1つと、AMC(Aerospike Management Console 管理コンソール)1つを1台のマシンに導入する手順を紹介します。

まずサーバーノードを導入します。以下のサイトから対象の環境(今回は CentOS 6 なので、互換性のある RedHat 6)を選んで最新版をダウンロードします:
http://www.aerospike.com/download/server/

2016081003


2016/Aug/10 時点では最新バージョンは 3.9.0.3 でした。ダウンロードできるのは tgz ファイルなので、このアーカイブを展開し、インストーラー(asinstall)を実行してインストールします:
# cd /tmp
# tar xzvf ~/aerospike-server-community-3.9.0.3-el6.tgz
# cd aerospike-server-community-3.9.0.3-el6
# ./asinstall

インストールが成功したら以下のコマンドでサーバーとして起動し、またシステム再起動時に自動起動するよう設定しておきます:
# /etc/init.d/aerospike start
# chkconfig aerospike on

これでサーバーノードがこの環境にインストールできました。次にこのサーバーノードを管理するコンソール機能を導入します。

同様にして、以下のサイトから対象の環境を選んで AMC の最新版をダウンロードします。ちなみに AMC は RedHat 6(CentOS 6) 用のものしか用意されておらず、7.x のものは配布されていませんでした:

http://www.aerospike.com/download/amc/

2016081001


こちらの場合は rpm パッケージファイルがダウンロードできるので、RPM コマンドでそのまま導入します:
# rpm -ivh aerospike-amc-community-3.6.10.1-el6.x86_64.rpm

やはり同様に AMC を起動して、次回再起動時に自動起動するよう設定しておきます:
# /etc/init.d/amc start
# chkconfig amc on

これで導入作業は完了です。試しに一度管理コンソールを見てみましょう。ウェブブラウザを起動して、
 http://(導入先のマシン名):8081/
にアクセスしてみましょう:

2016081002


すると最初の1回は上記のような画面になり、AMC で管理するサーバーノードを指定するよう指示されます。今回は AMC と同じマシンにサーバーノードを導入しているので、同じアドレスか localhost を指定します。ポート番号は特に変更していない限り 3000 のままで大丈夫です:

成功すると AMC の管理画面が現れます:
2016081004


とりあえず1ノード環境ですがこれで動いちゃいました。Aerospike はノードを追加すればリニアにスケールするよう設計されているので、足りなくなったらサーバーノードを追加準備して、この AMC に追加すれば使えちゃいます。データの増減が大きいシステムに非常に向いていると言えます。




このページのトップヘ