<CentOS 7 가상환경 생성 및 셋팅>


1. 새 가상환경 만들기


1.1) 새로 만들기 클릭



1.2) 메모리 설정




1.3) 디스크 용량 설정



1.4) 가상 이미지 생성 완료



2. 가상환경 네트워크 준비하기


2.1) VirtualBox 전체 환경설정

* 각 가상환경 설정 버튼과 혼동하지 말자



2.2) 네트워크 탭에서 NAT 네트워크에 사용할 새로운 세팅 생성



2.3) 네트워크 CIDR 은 가상OS에 분배될 내부 네트워크 IP 주소대역임

ex) 평소 사용하는 공유기들이 192.168.0.xxx IP 를 분배해 주는것과 같음

* 위에 써있는 10.0.2.0/24 를 192.168.0.0/24 로 변경해도 됨



2.4) 현재 사용중인 호스트 컴퓨터와 가상OS 를 포트포워딩 설정할 수 있음

아직 가상OS 설치를 하지 않았으므로 비운상태로 넘어가고 가상OS 설치를 끝낸 후 다시 설정함



3. 가상 OS 설치


3.1) 가상환경을 클릭하고 위 설정 버튼을 눌러 설정화면으로 이동

또는 가상환경을 오른쪽 클릭해서 나오는 메뉴에서 설정을 클릭해도 됨

* VirtualBox 전체 설정과 혼동하지 말 것.



3.2) 저장소 메뉴에서 '컨트롤러 : IDE' 항목의 광학 드라이브 항목



3.3) 받아놓은 CentOS 7 이미지 파일을 선택



3.4) '컨트롤러 : IDE' 항목 아래에 이미지가 추가된거 확인 후 '네트워크' 메뉴로 이동




3.5) 네트워크 어댑터를 'NAT 네트워크' 그리고 이름 항목을 2.3 에서 새로 만든 NAT네트워크 이름으로 지정



3.6) 기본적인 셋팅 완료. 가상 OS 설치 전 스냅샷 찍기

***** 스냅샷을 잘 만들어 두면 문제가 생겼을 경우 쉽게 복구할 수 있다. *****



3.7) 스냅샷 생성



3.8) 가상OS 설치 준비 완료


4. 가상 OS 설치


4.1) CentOS 7 설치 시작




4.2) 설치중 표시할 언어 - 한국어로 해도 상관없음



4.3) 기본적으로 네트워크가 꺼져있음. 클릭해서 설정을 변경하도록 하자.



4.4) 네트워크를 켜준다. 기본 설정이 자동으로 셋팅된다.

* 여기 나오는 IP 주소가 2.3, 2.4 에서 만든 NAT 네트워크 셋팅의 CIDR 네트워크 대역중 하나로 설정된다.

* 추후 이 IP로 포트포워딩을 설정한다.




4.5) 디스크 메뉴를 확인해야 한다.



4.6) 디스크 메뉴 안에서는 따로 건드릴건 없고 확인만 되면 완료 버튼을 눌러 되돌아가면 된다.



4.7) 두 항목 설정이 끝나면 설치시작 버튼이 활성화 되므로 설치시작 버튼을 눌러 다음 화면으로 넘어간다.



4.8) root 계정과 사용자 계정 둘다 설정해준다.



4.9) root 계정 비밀번호 설정



4.10) 사용자계정 설정

* 이 사용자를 관리자로 합니다. 체크하기



4.11) 설치가 끝날 때 까지 기다린다.



4.12) 설치가 끝나면 재부팅


*** 설치 끝나고 나서 스냅샷을 하나 더 찍어놓는 것도 좋다. ***

* 그러면 가상OS 를 사용하다가 문제가 발생했을 경우 지금 만든 스냅샷으로 복원하면

OS 를 새로 설치 하지 않고도 처음 OS 설치를 끝낸 순간으로 쉽게 돌아올 수 있다.


* 스냅샷 상태


5. CentOS 7 실행 및 네트워크 설정



5.1) 설치한 CentOS 7 을 실행한다.



5.2) 설치할 때 생성한 사용자 계정으로 로그인 후 ip addr 명령어를 통해 IP 를 확인한다.

OS 설치할 때 확인한 네트워크 IP 와 동일하게 표시될 것이고 이제 다시 2.3, 2.4 항목으로 돌아가 포트포워딩 설정을 해준다.



5.3) 가상OS CLI 화면에서 작업하기는 불편하므로 (해상도 변경의 까다로움, 클립보드 공유 설정 까다로움)

위처럼 SSH 포트를 포트포워딩 해주고 putty 또는 secureCRT 등등의 터미널 프로그램으로 작업할 수 있게 한다.



5.4) 터미널 프로그램으로 접속한다.

Host IP 는 현재 사용중인 컴퓨터 이므로 127.0.0.1 로 설정한다.

포트는 5.3 화면과 같이 가상OS 의 22번 포트와 매핑시킨 포트번호를 입력한다 (이 포스트에서는 10122)

접속 계정도 입력한다.



5.5) 접속해본다.



5.6) 위처럼 VirtualBox 화면을 사용하지 않고 터미널 프로그램으로 잘 연결되었다. 쉽게 작업하도록 하자.


*** 만약 웹서버를 올린다던가 DB 를 설치해서 테스트해보려 한다면

5.3 화면에서 가상OS 로 접근하려는 포트를 모두 추가해줘야 한다.

1) 웹서버라면 80 포트

2) DB 라면 각 DB에 맞는 포트 (ex : mysql - 3306)

그 외 필요한 포트를 모두 추가해 준다.

그 후에 웹서버나 DB를 실행하고 접근할 때는 Host 컴퓨터에서 127.0.0.1:10180 등과 같이 접속하면 된다.



***** 스냅샷은 자주 만들도록 하자. 매우 편하다. *****



-------------------------------------------------------


'Programming > ETC' 카테고리의 다른 글

웹훅(Webhook)이란?  (1) 2019.02.11
[Yona] 설치형 이슈 트래커 Yona 설치  (0) 2019.01.03
[AWS] EC2 인스턴스 디스크 볼륨 확장  (0) 2018.12.07
[VirtualBox] 네트워크 설정  (0) 2018.11.08
이슈 트래커 종류  (1) 2018.09.19

[주의사항]

* 도커는 기본적으로 root 권한이 필요합니다. 사용자 계정으로 sudo 없이 사용하려면 해당 사용자를 docker 그룹에 추가해야 합니다.

* 설치도중 또는 설치 후 fabric 샘플 소스를 실행할 때 root 권한이 맞는지 잘 확인해주세요.

* 특정 사용자 계정으로 진행할 경우 아래 모든 명령어들은 사용자 계정 및 root 계정 모두 지정된 버전으로 실행되어야 합니다.


[특정 사용자를 docker 그룹에 추가 (추천)]

sudo usermod -aG docker 사용자계정


[CentOS 7 - 환경 구축]

# 2018.04.24 # DNS 8.8.8.8 # KT DNS 주소로 진행했더니 # 도커 이미지를 제대로 못받는 경우가 발생함 (정확하지는 않음) ######################################
# 선행 조건 - fabric 공식 문서(Prerequisite 항목)에서 확인 # 각 오픈소스별 버전 매우 중요 # Python(2.7 버전만, 3.x는 안 됨) # Docker(17.06-ce 이상, Ubuntu (docker.io 설치 시) 는 1.13 이상) # Docker compose(1.14 이상) # Go(1.9 이상) # Node.js(8.9 이상 9.0 미만 - 8.11 추천) # NPM(5.6.0 이상) # repository 및 epel 업데이트 sudo yum -y update sudo yum -y install epel-release # 설치가 안되어 있다면 설치할 것. # curl, git, wget, python2.7 #sudo yum -y install curl git sudo yum -y install wget # docker (17.06-ce 이상) 설치 sudo yum -y install yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum makecache fast sudo yum -y install docker-ce # docker-compose (1.14 이상) 설치 sudo yum -y install python-pip sudo pip install docker-compose # docker-compose 설치 다른방법 (root 로그인 후 실행) curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # docker 서버 실행 및 자동실행 설정 추가 systemctl start docker systemctl enable docker # n (최신), nodejs (8.9 이상 9.0 미만 - 8.11 추천), npm (5.6.0 이상) 설치 sudo yum -y install npm nodejs sudo npm install -g n sudo n 8.11.1 sudo ln -sf /usr/local/n/versions/node/8.11.1/bin/node /usr/bin/node sudo npm install -g npm sudo npm install --global grpc --unsafe # go 1.95 버전 다운로드 cd ~ wget https://dl.google.com/go/go1.9.5.linux-amd64.tar.gz sudo tar -zxvf go1.9.5.linux-amd64.tar.gz -C /usr/local/ (이후 아래 환경변수 설정 후에 go 명령어 사용 가능합니다.) ###################################################


[도커 이미지 다운로드]

# HyperLedger Fabric 도커 이미지 및 바이너리 다운로드 cd ~ mkdir -p go/src/github.com/hyperledger cd go/src/github.com/hyperledger sudo curl -sSL https://goo.gl/6wtTN5 | sudo bash -s 1.1.0 (* docker 그룹에 사용자계정을 추가했을 경우 sudo 를 안써도 된다.) curl -sSL https://goo.gl/6wtTN5 | bash -s 1.1.0


* 도커 필수 이미지를 받는 스크립트의 경우 사용자 계정을 docker 그룹에 추가하지 않으면

  sudo 를 통해 실행해야 docker 명령어가 정상적으로 수행됩니다. 그러나 sudo 를 사용하면 다운받는 fabric-samples 폴더 소유자가 root 가 되어

  소유 및 권한을 다시 사용자계정으로 변경해 주거나 이후 샘플 폴더 안에서 실행할 작업들을 모두 sudo 로 진행해야 합니다.


* 사용자 계정을 docker 그룹에 추가 (sudo usermod -aG docker 사용자계정) 한 후 위 스크립트를 진행한다면 sudo 명령어를 빼고 실행해도 되며

  (curl -sSL https://goo.gl/6wtTN5 | bash -s 1.1.0) 이럴 경우 fabric-sample 폴더는 사용자계정 소유로 진행되고 추후 작업들도 sudo 없이 진행 가능합니다.


[환경변수 설정]

# go 환경변수 sudo vi /etc/profile # 프로필 맨 아래 추가 # GOPATH 는 golang 의 workspace 와 비슷하므로 원하는 곳으로 설정해도 괜찮습니다. export GOPATH=/home/사용자계정/go export PATH=/usr/local/go/bin:$PATH # 나중에 소스코드 실행 시 또는 Chaincode 수정시 peer, configtxgen, cryptogen 등 관련 명령어를 못찾는 오류가 생길 경우 export PATH=$HOME/go/src/github.com/hyperledger/fabric-samples/bin:$PATH source /etc/profile


# fabcar 예제 cd fabcar sudo npm install --unsafe-perm sudo ./startFabric.sh


[결과]
1. startFabric.sh 실행

[user@localhost fabcar]$ sudo ./startFabric.sh # don't rewrite paths for Windows Git Bash users export MSYS_NO_PATHCONV=1 docker-compose -f docker-compose.yml down Removing cli ... done Removing peer0.org1.example.com ... done Removing orderer.example.com ... done Removing ca.example.com ... done Removing couchdb ... done Removing network net_basic docker-compose -f docker-compose.yml up -d ca.example.com orderer.example.com peer0.org1.example.com couchdb Creating network "net_basic" with the default driver Creating orderer.example.com ... done Creating couchdb ... done Creating ca.example.com ... done Creating peer0.org1.example.com ... done # wait for Hyperledger Fabric to start # incase of errors when running later commands, issue export FABRIC_START_TIMEOUT=<larger number> export FABRIC_START_TIMEOUT=10 #echo ${FABRIC_START_TIMEOUT} sleep ${FABRIC_START_TIMEOUT} # Create the channel docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx 2018-04-24 08:02:04.449 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2018-04-24 08:02:04.482 UTC [channelCmd] InitCmdFactory -> INFO 002 Endorser and orderer connections initialized 2018-04-24 08:02:04.685 UTC [main] main -> INFO 003 Exiting..... # Join peer0.org1.example.com to the channel. docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel join -b mychannel.block 2018-04-24 08:02:04.862 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2018-04-24 08:02:04.962 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel 2018-04-24 08:02:04.962 UTC [main] main -> INFO 003 Exiting..... Creating cli ... done 2018-04-24 08:02:05.666 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-04-24 08:02:05.666 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-04-24 08:02:05.666 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc 2018-04-24 08:02:05.666 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc 2018-04-24 08:02:05.666 UTC [chaincodeCmd] getChaincodeSpec -> DEBU 005 java chaincode disabled 2018-04-24 08:02:05.693 UTC [golang-platform] getCodeFromFS -> DEBU 006 getCodeFromFS github.com/fabcar/go 2018-04-24 08:02:05.783 UTC [golang-platform] func1 -> DEBU 007 Discarding GOROOT package bytes 2018-04-24 08:02:05.783 UTC [golang-platform] func1 -> DEBU 008 Discarding GOROOT package encoding/json 2018-04-24 08:02:05.783 UTC [golang-platform] func1 -> DEBU 009 Discarding GOROOT package fmt 2018-04-24 08:02:05.783 UTC [golang-platform] func1 -> DEBU 00a Discarding provided package github.com/hyperledger/fabric/core/chaincode/shim 2018-04-24 08:02:05.783 UTC [golang-platform] func1 -> DEBU 00b Discarding provided package github.com/hyperledger/fabric/protos/peer 2018-04-24 08:02:05.783 UTC [golang-platform] func1 -> DEBU 00c Discarding GOROOT package strconv 2018-04-24 08:02:05.783 UTC [golang-platform] GetDeploymentPayload -> DEBU 00d done 2018-04-24 08:02:05.783 UTC [container] WriteFileToPackage -> DEBU 00e Writing file to tarball: src/github.com/fabcar/go/fabcar.go 2018-04-24 08:02:05.787 UTC [msp/identity] Sign -> DEBU 00f Sign: plaintext: --- 2018-04-24 08:02:05.787 UTC [msp/identity] Sign -> DEBU 010 Sign: digest: --- 2018-04-24 08:02:05.817 UTC [chaincodeCmd] install -> DEBU 011 Installed remotely response:<status:200 payload:"OK" > 2018-04-24 08:02:05.817 UTC [main] main -> INFO 012 Exiting..... 2018-04-24 08:02:05.983 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-04-24 08:02:05.983 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-04-24 08:02:05.984 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc 2018-04-24 08:02:05.984 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc 2018-04-24 08:02:06.018 UTC [chaincodeCmd] getChaincodeSpec -> DEBU 005 java chaincode disabled 2018-04-24 08:02:06.019 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: --- 2018-04-24 08:02:06.019 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: --- 2018-04-24 08:02:06.293 UTC [msp/identity] Sign -> DEBU 008 Sign: plaintext: --- 2018-04-24 08:02:06.293 UTC [msp/identity] Sign -> DEBU 009 Sign: digest: --- 2018-04-24 08:02:06.294 UTC [main] main -> INFO 00a Exiting..... 2018-04-24 08:02:16.467 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-04-24 08:02:16.467 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-04-24 08:02:16.468 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc 2018-04-24 08:02:16.468 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc 2018-04-24 08:02:16.468 UTC [chaincodeCmd] getChaincodeSpec -> DEBU 005 java chaincode disabled 2018-04-24 08:02:16.469 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: --- 2018-04-24 08:02:16.469 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: --- 2018-04-24 08:02:16.476 UTC [msp/identity] Sign -> DEBU 008 Sign: plaintext: --- 2018-04-24 08:02:16.476 UTC [msp/identity] Sign -> DEBU 009 Sign: digest: --- 2018-04-24 08:02:16.477 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU 00a ESCC invoke result: version:1 response:<status:200 message:"OK" > payload:"\n L\373h\037A><&3\371c0\261\243d\245\3207\240\254\225 \201\201.\240vDH?\205\260\022\267\006\n\240\006\022\205\006\n\006fabcar\022\372\005\032J\n\004CAR0\032B{\"make\":\"Toyota\",\"model\":\"Prius\",\"colour\":\"blue\",\"owner\":\"Tomoko\"}\032G\n\004CAR1\032?{\"make\":\"Ford\",\"model\":\"Mustang\",\"colour\":\"red\",\"owner\":\"Brad\"}\032N\n\004CAR2\032F{\"make\":\"Hyundai\",\"model\":\"Tucson\",\"colour\":\"green\",\"owner\":\"Jin Soo\"}\032N\n\004CAR3\032F{\"make\":\"Volkswagen\",\"model\":\"Passat\",\"colour\":\"yellow\",\"owner\":\"Max\"}\032G\n\004CAR4\032?{\"make\":\"Tesla\",\"model\":\"S\",\"colour\":\"black\",\"owner\":\"Adriana\"}\032K\n\004CAR5\032C{\"make\":\"Peugeot\",\"model\":\"205\",\"colour\":\"purple\",\"owner\":\"Michel\"}\032H\n\004CAR6\032@{\"make\":\"Chery\",\"model\":\"S22L\",\"colour\":\"white\",\"owner\":\"Aarav\"}\032H\n\004CAR7\032@{\"make\":\"Fiat\",\"model\":\"Punto\",\"colour\":\"violet\",\"owner\":\"Pari\"}\032J\n\004CAR8\032B{\"make\":\"Tata\",\"model\":\"Nano\",\"colour\":\"indigo\",\"owner\":\"Valeria\"}\032M\n\004CAR9\032E{\"make\":\"Holden\",\"model\":\"Barina\",\"colour\":\"brown\",\"owner\":\"Shotaro\"}\022\026\n\004lscc\022\016\n\014\n\006fabcar\022\002\010\001\032\003\010\310\001\"\r\022\006fabcar\032\0031.0" endorsement:<endorser:"\-----BEGIN CERTIFICATE-----\---\n-----END CERTIFICATE-----\n" signature:"---" > 2018-04-24 08:02:16.478 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 00b Chaincode invoke successful. result: status:200 2018-04-24 08:02:16.478 UTC [main] main -> INFO 00c Exiting..... Total setup execution time : 25 secs ... Start by installing required packages run 'npm install' Then run 'node enrollAdmin.js', then 'node registerUser' The 'node invoke.js' will fail until it has been updated with valid arguments The 'node query.js' may be run at anytime once the user has been registered [user@localhost fabcar]$


2. enrollAdmin.js 실행

- admin 등록

[user@localhost fabcar]$ sudo node enrollAdmin.js Store path:$HOME/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store Successfully enrolled admin user "admin" Assigned the admin user to the fabric client ::{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"*******************","identity":{"certificate":"-----BEGIN CERTIFICATE-----\n********************\n-----END CERTIFICATE-----\n"}}} [user@localhost fabcar]$ 


3. registerUser.js 실행

- 일반 유저 등록

[user@localhost fabcar]$ sudo node registerUser.js Store path:$HOME/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store Successfully loaded admin from persistence Successfully registered user1 - secret:****** Successfully enrolled member user "user1" User1 was successfully registered and enrolled and is ready to intreact with the fabric network [user@localhost fabcar]$ 



4. query.js 실행

- 자동차 데이터 확인

[user@localhost fabcar]$ sudo node query.js Store path:$HOME/go/src/github.com/hyperledger/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Query has completed, checking results Response is [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}] [user@localhost fabcar]$ 


* 특정 문자열은 임의로 가렸습니다.


[참고]

- HyperLedger Fabric

http://hyperledger-fabric.readthedocs.io/en/release-1.1/

https://github.com/hyperledger/fabric-samples


---




+ Recent posts