2017년 12월 4일 월요일

Tensorflow 의 로그로 tensorboard 사용하기

Tensorboard 를 사용하면 Tensorflow 수행 후 남아있는 로그들을 이용하여 loss, learning rate 등을 손쉽게 그래프로 확인할 수 있습니다.

단, Tensorflow를 수행하는 python 코드에 나중에 tensorboard로 그래프화 할 수 있게끔 timestamp, 수행 로그 등을 남겨주는 코드가 미리 삽입되어 있어야 합니다.

해당 내용은 아래의 링크를 참조하세요.

저는 이미 training 시의 이벤트 로그를 남기도록 되어있는 python script를 가지고 Tensorflow를 수행했습니다.
이후, tensorboard를 수행하며 log가 위치한 path 정보를 --log dir 인자값으로 넘겨줍니다.

b7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/benchmark/tensorflow/train_log_single$ tensorboard --logdir=./
TensorBoard 0.1.8 at http://p10login1:6006 (Press CTRL+C to quit)
W1129 01:09:46.680698 Reloader tf_logging.py:86] Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events.  Overwriting the graph with the newest event.

위와 같이 tensorboard 데몬이 실행되면, 브라우저를 통해 위 URL로 접근해봅니다. (POK 센터는 http://p10login1.pbm.ihost.com:6006 으로 접근합니다.)

다음과 같이 해당 logdir에 위치한 event log의 정보들을 읽어오고, 그래프로 표현해줍니다.
저의 경우, 여러차례 동일 스크립트를 수행하는 바람에 로그가 duplicate 되어 warning 메시지가 발생하였습니다만, logdir에 각 수행되는 TF job 별로 하부 directory를 지정하여 로그를 기록하면 위와 같은 문제는 없을것이라 생각합니다.

예를들어, 기본 로그 디렉토리를 /train_log_dir로 설정하는 경우, 각 수행하는 TF job 별로 하부 디렉토리를 구분하여 적재하면 아래와 같이 Tensorboard에서 Runs의 toggle을 구분하여 그래프를 볼수 있습니다.

(예) logdir = /train_log_dir
tf1 Job은 /train_log_dir/tf1_job_log
tf2 Job은 /train_log_dir/tf2_job_log



2017년 12월 3일 일요일

Caffe의 plot_training_log.py 수행하기 (Caffe 수행 후 로그로 그래프 그리기)

Caffe-bvlc, caffe-nv 등 오픈소스를 보면 tools/extra/ 경로에 로그 그래프를 그릴 수 있는 스크립트를 기본으로 제공합니다. PowerAI에 포함된 caffe, caffe-nv, caffe-ibm에는 해당 스크립트는 없지만, github에 올라온 코드를 사용하여 동일한 plotting 을 수행할 수 있습니다.

우선 Github에서 caffe-bvlc 를 복제합니다.
b7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/imsi$ git clone https://github.com/BVLC/caffe.gitb7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/imsi$ cd bvlc_caffe

/usr/bin/python2.7 버전을 사용하여 tools/extra/plot_training_log.py.example 을 수행합니다. 이미 PYTHONPATH로 설정되어 있다면 python 명령어로 사용할 수 있습니다.

이때 plot_training_log.py.example을 수행하는 포맷은 다음과 같습니다.
Usage:
./plot_training_log.py.example chart_type[0-7] /where/to/save.png(저장할이미지명/경로) /path/to/first.log(읽어올 로그경로)
Notes:
1. Supporting multiple logs.
2. Log file name must end with the lower-cased ".log".
Supported chart types:
0: Test accuracy vs. Iters
1: Test accuracy vs. Seconds
2: Test loss vs. Iters
3: Test loss vs. Seconds
4: Train learning rate vs. Iters
5: Train learning rate vs. Seconds
6: Train loss vs. Iters
7: Train loss vs. Seconds

아래 수행의 경우, /usr/bin/python2.7 로 bvlc_caffe/tool/extra/plot_training_log.py.example을 실행시켰으며, 6번(Train loss vs Iters) 그래프를 그려서 bvlc_caffe/image_results/caffe_gnet_128b_4G.png 라는 이름의 이미지 파일로 저장합니다. 읽어올 로그 경로는 가장 마지막에 있는 ../../benchmark/caffe/log/output_inception_v1_iter50045_b64_4gpu.11160529.log <- 이 로그를 불러옵니다.

b7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/imsi/bvlc_caffe$ /usr/bin/python2.7 ./tools/extra/plot_training_log.py.example 6 ./image_results/caffe_gnet_128b_4G.png ../../benchmark/caffe/log/output_inception_v1_iter50045_b64_4gpu.11160529.log
/usr/lib/python2.7/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')

잠시간의 시간이 걸리고(수초-수분 내외), 아래와 같이 MATLAB을 사용하여 그래프를 그려줍니다.



2017년 7월 16일 일요일

Kubernetes on RHEL 7.2 LE 기본 설치/구성하기

Docker Container Orchestrator 역할을 하는 오픈소스 기반 Kubernetes cluster를 Linux on Power 에 구성해보겠습니다.

현재 Kubernetes는 RHEL Little-endian(ppc64le)에서 지원됩니다.

기본 과정은 아래 블로그를 참조했습니다.
(https://www.ibm.com/developerworks/library/l-docker-orchestration/
http://cloudgeekz.com/773/setting-up-a-kubernetes-cluster-on-power.html
https://www.ibm.com/developerworks/community/blogs/mhhaque/entry/Docker_And_Kubernetes_Cluster_on_Power_with_RHEL7_Part_1_Preparing_all_Node?lang=en)

1. RHEL 7.2 환경에서 구성하며, kubernetes 설치를 위해 repository를 설정합니다.

[root@sys-88227 ~]# cat /etc/*release
NAME="Red Hat Enterprise Linux Server"
VERSION="7.2 (Maipo)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="7.2"
PRETTY_NAME="Red Hat Enterprise Linux Server 7.2 (Maipo)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:7.2:GA:server"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7"
REDHAT_BUGZILLA_PRODUCT_VERSION=7.2
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="7.2"
Red Hat Enterprise Linux Server release 7.2 (Maipo)
Red Hat Enterprise Linux Server release 7.2 (Maipo)

=> kubernetes 설치하기 위한 파일셋 갖고 있는 repository를 추가
[root@sys-88227 ~]# cat > /etc/yum.repos.d/unicamp-docker.repo <<EOF
> [unicamp-docker]
> name=Unicamp Repo for Docker Packages
> baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/
> enabled=1
> gpgcheck=0
> EOF

[root@sys-88227 ~]# cat > /etc/yum.repos.d/unicamp-misc.repo <<EOF
> [unicamp-misc]
> name=Unicamp Repo for Misc Packages
> baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/
> enabled=1
> gpgcheck=0
> EOF

=> 새로운 repository 추가된 것 확인
[root@sys-88227 ~]# yum repolist
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use su                               bscription-manager to register.
unicamp-docker                                           | 2.9 kB     00:00
unicamp-misc                                             | 2.9 kB     00:00
(1/2): unicamp-docker/primary_db                           | 3.9 kB   00:00
(2/2): unicamp-misc/primary_db                             |  21 kB   00:00
repo id               repo name                                           status
advance_toolchain     IBM Advance Toolchain                                   88
compiler              IBM XL C/C++ And Fortran Compiler                       56
optional              RedHat Enterprise LE Linux 7.2 - Optional           25,873
server                RedHat Enterprise LE Linux 7.2 - Server              6,594
supplementary         RedHat Enterprise LE Linux 7.2 - Supplementary      19,380
unicamp-docker        Unicamp Repo for Docker Packages                         3
unicamp-misc          Unicamp Repo for Misc Packages                          40
repolist: 52,034

=> Kubernetes 관련 파일셋 설치
[root@sys-88227 ~]# yum install kubernetes-client kubernetes-master etcd
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-man                 ager to register.
Resolving Dependencies
--> Running transaction check
---> Package etcd.ppc64le 0:3.0.15-1.el7 will be installed
---> Package kubernetes-client.ppc64le 0:1.4.7-1.git92b4f97.el7 will be installed
---> Package kubernetes-master.ppc64le 0:1.4.7-1.git92b4f97.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================
 Package                 Arch          Version                       Repository          Size
==============================================================================================
Installing:
 etcd                    ppc64le       3.0.15-1.el7                  unicamp-misc       7.2 M
 kubernetes-client       ppc64le       1.4.7-1.git92b4f97.el7        unicamp-misc       6.6 M
 kubernetes-master       ppc64le       1.4.7-1.git92b4f97.el7        unicamp-misc        27 M

Transaction Summary
==============================================================================================
Install  3 Packages

Total download size: 41 M
Installed size: 270 M
Is this ok [y/d/N]: y
Downloading packages:
(1/3): kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le.rpm                             | 6.6 MB  00:00:09
(2/3): etcd-3.0.15-1.el7.ppc64le.rpm                                                    | 7.2 MB  00:00:10
(3/3): kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le.rpm                             |  27 MB  00:00:40
---------------------------------------------------------------------------------------------------------------
Total                                                                          830 kB/s |  41 MB  00:00:50
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                            1/3
groupadd: failure while writing changes to /etc/group
useradd: group 'kube' does not exist
error: %pre(kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le) scriptlet failed, exit status 6
Error in PREIN scriptlet in rpm package kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le
error: kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le: install failed
groupadd: failure while writing changes to /etc/group
useradd: group 'etcd' does not exist
error: %pre(etcd-3.0.15-1.el7.ppc64le) scriptlet failed, exit status 6
Error in PREIN scriptlet in rpm package etcd-3.0.15-1.el7.ppc64le
  Verifying  : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                            1/3
  Verifying  : etcd-3.0.15-1.el7.ppc64le                                                                   2/3
  Verifying  : kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le                                            3/3

Installed:
  kubernetes-client.ppc64le 0:1.4.7-1.git92b4f97.el7

Failed:
  etcd.ppc64le 0:3.0.15-1.el7                kubernetes-master.ppc64le 0:1.4.7-1.git92b4f97.el7

Complete!

=> 그룹 추가 관련 명령어가 수행되지 않아서 Kubernetes-master, etcd 설치 실패.
=> 임의의 그룹 번호(700, 701) 사용 중인지 확인 후, 그룹 추가합니다.
[root@sys-88227 ~]# cat /etc/group | grep 700
[root@sys-88227 ~]# cat /etc/group | grep 701
[root@sys-88227 ~]# groupadd -g 700 kube
[root@sys-88227 ~]# groupadd -g 701 etcd
[root@sys-88227 ~]# cat /etc/group | grep kube
kube:x:700:
[root@sys-88227 ~]# cat /etc/group | grep etcd
etcd:x:701:

=> Kubernetes-master, etcd 설치 재수행
[root@sys-88227 ~]# yum install kubernetes-master etcd
(중략)
Installed:
  etcd.ppc64le 0:3.0.15-1.el7                kubernetes-master.ppc64le 0:1.4.7-1.git92b4f97.el7

Complete!


,
=> Network Ports 오픈 (Kubernetes API 서버 : 8080, etcd : 2379 by default)
[root@sys-88227 ~]# firewall-cmd --zone=public --add-port 8080/tcp --permanent
success
[root@sys-88227 ~]# firewall-cmd --zone=public --add-port=2379/tcp --permanent
success
[root@sys-88227 ~]# firewall-cmd --reload
success

2. Kubernetes Master 구성

설치가 되었으면 아래와 같이 /etc/kubernetes 폴더가 생깁니다.

[root@sys-88227 ~]# ls /etc/kubernetes/
apiserver  config  controller-manager  scheduler

=> Master로 구성할 서버의 IP 정보 확인
[root@sys-88227 ~]# ifconfig | grep inet
        inet 172.29.160.107  netmask 255.255.192.0  broadcast 172.29.191.255

[root@sys-88227 ~]# openssl genrsa -out /tmp/serviceaccount.key 2048

=> Kubernetes 구성 파일에서 Master IP 정보 수정
[root@sys-88227 ~]# vi /etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.29.160.107:8080"

=> API 서버 구성파일에서 etcd 서버의 IP 정보 수정 (현재 구성에서는 One Master)
[root@sys-88227 ~]# vi /etc/kubernetes/apiserver
# The address on the local server to listen to.
KUBE_API_ADDRESS="--address=0.0.0.0"
# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://172.29.160.107:2379,http://172.29.160.107:4001"
KUBE_API_PORT="--port=8080"
KUBE_API_ARGS="--service_account_key_file=/tmp/serviceaccount.key"

 => Etcd 구성하기
[root@sys-88227 ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

=> Control-manager 추가
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/tmp/serviceaccount.key"


=> Kubernetes 서비스 시작하기
[root@sys-88227 ~]# for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
> systemctl restart $SERVICES
> systemctl enable $SERVICES
> systemctl status $SERVICES
> done
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
● etcd.service - Etcd Server
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:08 EDT; 214ms ago
 Main PID: 9538 (etcd)
   CGroup: /system.slice/etcd.service
           └─9538 /usr/bin/etcd --name=default --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:23...

Jul 16 11:06:07 sys-88227.dal-ebis.ihost.com etcd[9538]: starting server... [version: 3.0.15, cluster version: 3.0]
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d is starting a new election at term 5
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d became candidate at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d received vote from 8e9e05c52164694d at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d became leader at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: published {Name:default ClientURLs:[http://0.0.0.0:2379]} to c...8c32
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: ready to serve client requests
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: serving insecure client requests on 0.0.0.0:2379, this is stro...ged!
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com systemd[1]: Started Etcd Server.
Hint: Some lines were ellipsized, use -l to show in full.
● kube-apiserver.service - Kubernetes API Server
   Loaded: loaded (/usr/lib/systemd/system/kube-apiserver.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:09 EDT; 86ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 9571 (kube-apiserver)
   CGroup: /system.slice/kube-apiserver.service
           └─9571 /usr/bin/kube-apiserver --logtostderr=true --v=0 --etcd-servers=http://172.29.160.107:2379 --insecure-bin...

Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.031808    9571 reflector.go:214] k8s.i...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.031936    9571 reflector.go:214] k8s.io/k...
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.032020    9571 reflector.go:214] k8s.i...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.032143    9571 reflector.go:203] k8s.i...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.139549    9571 reflector.go:214] pkg/c...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: [restful] 2017/07/16 11:06:09 log.go:30: [restful/swa...pi/
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: [restful] 2017/07/16 11:06:09 log.go:30: [restful/swa...ui/
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Started Kubernetes API Server.
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: I0716 11:06:09.257313    9571 genericapiserver.go:716...443
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: I0716 11:06:09.257490    9571 genericapiserver.go:761...080
Hint: Some lines were ellipsized, use -l to show in full.
● kube-controller-manager.service - Kubernetes Controller Manager
   Loaded: loaded (/usr/lib/systemd/system/kube-controller-manager.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:09 EDT; 148ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 9599 (kube-controller)
   CGroup: /system.slice/kube-controller-manager.service
           └─9599 /usr/bin/kube-controller-manager --logtostderr=true --v=0 --master=http://172.29.160.107:8080 --service_a...

Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Stopping Kubernetes Controller Manager...
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Started Kubernetes Controller Manager.
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Starting Kubernetes Controller Manager...
● kube-scheduler.service - Kubernetes Scheduler Plugin
   Loaded: loaded (/usr/lib/systemd/system/kube-scheduler.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:09 EDT; 144ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 9626 (kube-scheduler)
   CGroup: /system.slice/kube-scheduler.service
           └─9626 /usr/bin/kube-scheduler --logtostderr=true --v=0 --master=http://172.29.160.107:8080

Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Stopping Kubernetes Scheduler Plugin...
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Started Kubernetes Scheduler Plugin.
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Starting Kubernetes Scheduler Plugin...


3. Kubernetes node (Minion) 구성하기

=> 필요한 패키지 설치
[root@sys-88228 ~]#yum install kubernetes-client kubernetes-node

1:nvidia-kmod-361.107-2.el7.ppc64le has installed conflicts nvidia-uvm-kmod: 1:nvidia-kmod-361.107-2.el7.ppc64le
  Installing : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                                    1/3
  Installing : socat-1.7.2.2-5.el7.ppc64le                                                                         2/3
  Installing : kubernetes-node-1.4.7-1.git92b4f97.el7.ppc64le                                                      3/3
  Verifying  : kubernetes-node-1.4.7-1.git92b4f97.el7.ppc64le                                                      1/3
  Verifying  : socat-1.7.2.2-5.el7.ppc64le                                                                         2/3
  Verifying  : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                                    3/3

Installed:
  kubernetes-client.ppc64le 0:1.4.7-1.git92b4f97.el7          kubernetes-node.ppc64le 0:1.4.7-1.git92b4f97.el7

Dependency Installed:
  socat.ppc64le 0:1.7.2.2-5.el7

Complete!

[root@sys-88228 ~]# vi /etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.29.160.107:8080"

[root@sys-88228 ~]# vi /etc/kubernetes/kubelet

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME=" "
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://172.29.160.107:8080"

[root@sys-88228 ~]# for SERVICES in kube-proxy kubelet docker; do
> systemctl restart $SERVICES
> systemctl enable $SERVICES
> systemctl status $SERVICES
> done
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
● kube-proxy.service - Kubernetes Kube-Proxy Server
   Loaded: loaded (/usr/lib/systemd/system/kube-proxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:40:11 EDT; 177ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 21334 (kube-proxy)
   CGroup: /system.slice/kube-proxy.service
           └─21334 /usr/bin/kube-proxy --logtostderr=true --v=0 --master=h...

Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: W0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: E0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: E0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: E0713 22:4...
Hint: Some lines were ellipsized, use -l to show in full.
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
● kubelet.service - Kubernetes Kubelet Server
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:40:11 EDT; 269ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 21374 (kubelet)
   CGroup: /system.slice/kubelet.service
           └─21374 /usr/bin/kubelet --logtostderr=true --v=0 --api-servers...

Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com systemd[1]: Started Kubernete...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com systemd[1]: Starting Kubernet...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kubelet[21374]: Flag --api-se...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kubelet[21374]: W0713 22:40:1...
Hint: Some lines were ellipsized, use -l to show in full.
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:40:14 EDT; 215ms ago
     Docs: https://docs.docker.com
 Main PID: 21403 (dockerd)
   CGroup: /system.slice/docker.service
           ├─21403 /usr/bin/dockerd
           └─21407 docker-containerd -l unix:///var/run/docker/libcontaine...

Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com systemd[1]: Started Docker Ap...
Hint: Some lines were ellipsized, use -l to show in full.

4. Master 서버에서 node 정보 확인
[root@sys-88227 ~]# kubectl get nodes --show-labels
NAME                           STATUS     AGE       LABELS
127.0.0.1                      NotReady   2d        beta.kubernetes.io/arch=ppc64le,beta.kubernetes.io/os=linux,kubernetes.io/hostname=127.0.0.1
sys-88228.dal-ebis.ihost.com   Ready      11m       beta.kubernetes.io/arch=ppc64le,beta.kubernetes.io/os=linux,kubernetes.io/hostname=sys-88228.dal-ebis.ihost.com

Docker engine 설치하기 on RHEL 7.2 (ppc64le)

기본 내용은 아래 공식 링크를 참조했으나, 일부 에러가 발생하여 필요한 패키지를 별도로 다운로드 받아서 설치했습니다.

https://developer.ibm.com/linuxonpower/docker-on-power/

# cat > /etc/yum.repos.d/unicamp-docker.repo <<EOF
[unicamp-docker]
name=Unicamp Repo for Docker Packages
baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/
enabled=1
gpgcheck=0
EOF
 
#yum install docker-engine

Error: Package: docker-engine-17.05.0.ce-1.el7.centos.ppc64le (unicamp-docker)
           Requires: libseccomp.so.2()(64bit)
 You could try using --skip-broken to work around the problem
** Found 3 pre-existing rpmdb problem(s), 'yum check' output follows:
docker-selinux-1.13.1-0.ael7b.noarch has installed conflicts docker-selinux: docker-selinux-1.13.1-0.ael7b.noarch
1:nvidia-kmod-361.107-2.el7.ppc64le has installed conflicts nvidia-uvm-kmod: 1:nvidia-kmod-361.107-2.el7.ppc64le
policycoreutils-python-2.2.5-20.el7.ppc64le has missing requires of libcgroup
 
=====> yum으로 설치하려니 dependancy issue 등이 발생함. 필요한 패키지를 다운로드 받아서 사용하기로 함. 

#wget -r -np http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/
혹은 #wget http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/docker-1.13.1-0.ael7b.ppc64le.rpm

#wget http://mirror.luga.ru/centos/altarch/7/os/ppc64le/Packages/libcgroup-0.41-8.el7.ppc64le.rpm

#setenforce 0

[root@sys-88228 docker-ppc64el]# rpm -Uvh docker-1.13.1-0.ael7b.ppc64le.rpm
error: Failed dependencies:
        docker-selinux = 1.13.1-0.ael7b is needed by docker-1.13.1-0.ael7b.ppc64le
        libcgroup is needed by docker-1.13.1-0.ael7b.ppc64le
        libtool-ltdl is needed by docker-1.13.1-0.ael7b.ppc64le

#yum install libtool-ltdl
#yum install policycoreutils-python
#rpm -Uvh libcgroup-0.41-8.el7.ppc64le.rpm
#wget ftp://rpmfind.net/linux/fedora-secondary/releases/24/Everything/ppc64le/os/Packages/d/docker-selinux-1.10.3-9.git667d6d1.fc24.ppc64le.rpm
#wget ftp://195.220.108.108/linux/fedora-secondary/development/rawhide/Everything/ppc64le/os/Packages/p/policycoreutils-python-utils-2.6-5.fc27.ppc64le.rpm
#wget ftp://195.220.108.108/linux/fedora-secondary/development/rawhide/Everything/ppc64le/os/Packages/s/selinux-policy-minimum-3.13.1-263.fc27.noarch.rpm

#rpm -Uvh policycoreutils-python-utils-2.6-5.fc27.ppc64le.rpm --nodeps
#rpm -Uvh selinux-policy-minimum-3.13.1-263.fc27.noarch.rpm --nodeps
warning: selinux-policy-minimum-3.13.1-263.fc27.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f5282ee4: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:selinux-policy-minimum-3.13.1-263################################# [100%]
/var/tmp/rpm-tmp.UGMgdb: /usr/sbin/semanage: /usr/bin/python3: bad interpreter: No such file or directory
/usr/sbin/semodule: SELinux policy is not managed or store cannot be accessed.# rpm -Uvh docker-selinux-1.10.3-9.git667d6d1.fc24.ppc64le.rpm
warning: docker-selinux-1.10.3-9.git667d6d1.fc24.ppc64le.rpm: Header V3 RSA/SHA1 Signature, key ID 030d5aed: NOKEY
Preparing...                          ################################# [100%]
        package docker-selinux-2:1.10.3-9.git667d6d1.fc24.ppc64le is already installed

#rpm -Uvh docker-1.13.1-0.ael7b.ppc64le.rpm --nodeps
Preparing...                          ################################# [100%]
Updating / installing...
   1:docker-1.13.1-0.ael7b            ################################# [100%]


# service docker start
Redirecting to /bin/systemctl start  docker.service
# service docker status
Redirecting to /bin/systemctl status  docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:16:17 EDT; 1min 1s ago
     Docs: https://docs.docker.com
 Main PID: 21107 (dockerd)
   Memory: 25.6M
   CGroup: /system.slice/docker.service
           ├─21107 /usr/bin/dockerd
           └─21110 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interv...

Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.708588000-04:00" level=inf...ds"
Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.709532000-04:00" level=war...nd"
Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.710001000-04:00" level=inf...t."
Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.729999000-04:00" level=inf...ue"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.166484000-04:00" level=inf...ss"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.530810000-04:00" level=inf...e."
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.540873000-04:00" level=inf...on"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.540978000-04:00" level=inf...3.1
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.581564000-04:00" level=inf...ck"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.


[root@sys-88228 docker-ppc64el]# docker -v
Docker version 1.13.1, build fb79528


2017년 5월 25일 목요일

Ubuntu 에서 kdump 사용하기 (ppc64le)

아래 Ubuntu 사이트에서 가이드하는대로 따라 하다 보면, 간혹 사용 가능한 상태가 아닌 경우가 있습니다. 이때 kdump 설정하는 방법에 대해 posting 합니다.

Kernel dump가 제대로 enabled 되어있는지 확인하는 Verification 단계

1. crashkernel 파라미터 확인하기

linux-crashdump 패키지 설치 후에는, Reboot 을 해주어야 kdump-tools 가 활성화된다고 합니다. Reboot 을 수행하고 나서 /proc/cmdline을 확인해보면 crashkernel이 설정된 것을 볼 수 있습니다.

root@sys-87396:/etc/default# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M
 

* 간혹 crashkernel 파라미터가 보이지 않는 경우가 있습니다. 이때의 해결방법입니다.

root@sys-87397:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet => crashkernel 파라미터가 없음
root@sys-87397:/sys/kernel# cat /sys/kernel/kexec_crash_loaded
=> 1로 셋팅되어야 부트 시 crashkernel이 로드됨

kernel crash가 한번이라도 발생하게 되면, 이후에는 자동으로 crashkernel parameter가 붙게 됩니다. 그러나 초기 kdump 구성 시에 이렇게 crashkernel parameter가 안보이는 경우, 아래와 같이 수행합니다.

u0017496@sys-87481:~$ cat /etc/default/kexec
# Defaults for kexec initscript
# sourced by /etc/init.d/kexec and /etc/init.d/kexec-load

# Load a kexec kernel (true/false)
LOAD_KEXEC=true

# Kernel and initrd image
KERNEL_IMAGE="/boot/vmlinux"
INITRD="/boot/initrd.img"

# If empty, use current /proc/cmdline
APPEND=""

# Load the default kernel from grub config (true/false)
USE_GRUB_CONFIG=true ==> 이 부분은 default=false로 되어 있으나, true로 바꿉니다.

crashkernel에 대한 값은 아래 경로의 kexec-tools.cfg 파일에 정의되어 있습니다. 사이즈를 변경하고 싶다면, 해당 파일을 수정하면 됩니다. 관련 포멧은 링크를 참조하세요.

u0017496@sys-87481:~$ cat /etc/default/grub.d/kexec-tools.cfg
GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=384M-:128M"

u0017496@sys-87481:~$ sudo update-grub
u0017496@sys-87481:~$ sudo reboot

리부팅 후,

Last login: Mon May 29 04:11:02 2017 from 172.29.96.152
u0017496@sys-87481:~$ cat /proc/cmdline
root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M => 파라미터 설정되었습니다.

u0017496@sys-87481:~$ kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    ready to kdump => 정상 작동 상태

kexec command:
  /sbin/kexec -p --command-line="root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet  irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz
  
 

2. Kernel에서 kdump를 위해 memory reservation 했는지 확인하기

root@sys-87396:/etc/default# dmesg | grep -i crash
[    0.000000] Reserving 128MB of memory at 128MB for crashkernel (System RAM: 2048MB)
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic
 root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M

3. kdump config를 확인해서 현재 사용 가능한 상태인지 확인하기

root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: broken symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    Not ready to kdump ==> 현재 사용 불가능한 상태입니다. 위에 링크도 잘못걸려 있으므로, 해당 링크를 재설정합니다.

kexec command:
  no kexec command recorded
 
내용을 확인해보면, /var/lib/kdump/initrd.img 에 잘못된 symbolic link가 걸려있습니다. 
 
root@sys-87396:/etc/default# ls -al /var/lib/kdump/
total 9672
drwxr-xr-x  3 root root    4096 May 26 00:42 .
drwxr-xr-x 44 root root    4096 May 25 21:35 ..
drwxr-xr-x  5 root root    4096 Mar 17 17:28 initramfs-tools
lrwxrwxrwx  1 root root      42 May 26 00:42 initrd.img -> /var/lib/kdump/initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root 9889523 May 25 21:35 initrd.img-4.4.0-66-generic
lrwxrwxrwx  1 root root      30 May 25 21:45 vmlinuz -> /boot/vmlinux-4.4.0-78-generic
 
/var/lib/kdump 경로를 확인해보니, symbolic link로 걸어놓았던
 initrd.img-4.4.0-78-generic 파일은 없고, 대신 initrd.img-4.4.0-66-generic 파일만 있습니다.
/boot 에 들어가보면 initrd.img-4.4.0-78-generic이 있습니다. copy 해서 가져다 놓습니다.

root@sys-87396:/etc/default# ls -al /boot
total 117680
drwxr-xr-x  3 root root     4096 May 22 11:36 .
drwxr-xr-x 22 root root     4096 May 25 21:45 ..
-rw-r--r--  1 root root  1138911 Mar  3 11:03 abi-4.4.0-66-generic
-rw-r--r--  1 root root  1139503 Apr 27 12:00 abi-4.4.0-78-generic
-rw-r--r--  1 root root   173579 Mar  3 11:03 config-4.4.0-66-generic
-rw-r--r--  1 root root   173546 Apr 27 12:00 config-4.4.0-78-generic
drwxr-xr-x  5 root root     4096 May 25 21:35 grub
lrwxrwxrwx  1 root root       27 May 21 23:14 initrd.img -> initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root 32026385 May 22 02:34 initrd.img-4.4.0-66-generic
-rw-r--r--  1 root root 32035729 May 22 02:43 initrd.img-4.4.0-78-generic
lrwxrwxrwx  1 root root       27 Mar 23 14:04 initrd.img.old -> initrd.img-4.4.0-66-generic
-rw-------  1 root root  3520955 Mar  3 11:03 System.map-4.4.0-66-generic
-rw-------  1 root root  3520298 Apr 27 12:00 System.map-4.4.0-78-generic
lrwxrwxrwx  1 root root       24 May 21 23:14 vmlinux -> vmlinux-4.4.0-78-generic
-rw-------  1 root root 23370856 Mar  3 11:03 vmlinux-4.4.0-66-generic
-rw-------  1 root root 23370856 Apr 27 12:00 vmlinux-4.4.0-78-generic
lrwxrwxrwx  1 root root       24 Mar 23 14:04 vmlinux.old -> vmlinux-4.4.0-66-generic
root@sys-87396:/etc/default# cp /boot/initrd.img-4.4.0-78-generic /var/lib/kdump/
root@sys-87396:/etc/default# ls -al /var/lib/kdump
total 40960
drwxr-xr-x  3 root root     4096 May 26 01:07 .
drwxr-xr-x 44 root root     4096 May 25 21:35 ..
drwxr-xr-x  5 root root     4096 Mar 17 17:28 initramfs-tools
lrwxrwxrwx  1 root root       42 May 26 01:05 initrd.img -> /var/lib/kdump/initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root  9889523 May 25 21:35 initrd.img-4.4.0-66-generic
-rw-r--r--  1 root root 32035729 May 26 01:07 initrd.img-4.4.0-78-generic
lrwxrwxrwx  1 root root       30 May 25 21:45 vmlinuz -> /boot/vmlinux-4.4.0-78-generic


kdump-config 상태 확인합니다.
root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic => 링크는 제대로 걸림
 current state:    Not ready to kdump => 아직도 동작 불가

kexec command:
  no kexec command recorded

/var/crash를 살펴보면 vmcore도 기록되지 않은것을 볼수 있습니다.
root@sys-87396:/etc/default# ls /var/crash
root@sys-87396:/etc/default#

다시 커널 정보를 로드합니다.
root@sys-87396:/etc/default# kdump-config load
Modified cmdline:BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service elfcorehdr=156800K
 * loaded kdump kernel

상태를 보니, kdump를 사용할 수 있는준비가 되었습니다.
root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    ready to kdump

kexec command:
  /sbin/kexec -p --command-line="BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz

덤프가 떨어지는 /var/crash에도 뭔가 생성되었습니다.
root@sys-87396:/etc/default# ls /var/crash
kexec_cmd
 

4. kdump 서비스가 동작중인지 확인

kdump-tools.service가 로드되어 있고, 정상 동작중(Active)인지 확인합니다. 

root@sys-87396:/sys/kernel# service kdump-tools status
● kdump-tools.service - Kernel crash dump capture service
   Loaded: loaded (/lib/systemd/system/kdump-tools.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mon 2017-05-29 07:52:09 EDT; 56min ago
  Process: 2260 ExecStart=/etc/init.d/kdump-tools start (code=exited, status=0/SUCCESS)
 Main PID: 2260 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/kdump-tools.service

May 29 07:52:07 sys-87396 systemd[1]: Starting Kernel crash dump capture service...
May 29 07:52:08 sys-87396 kdump-tools[2260]: Starting kdump-tools: Modified cmdline:root=UUID=2a159e60-be84-4802-9b
May 29 07:52:09 sys-87396 kdump-tools[2260]:  * loaded kdump kernel
May 29 07:52:09 sys-87396 kdump-tools[2426]: /sbin/kexec -p --command-line="root=UUID=2a159e60-be84-4802-9bf1-bdbcf
May 29 07:52:09 sys-87396 kdump-tools[2427]: loaded kdump kernel
May 29 07:52:09 sys-87396 systemd[1]: Started Kernel crash dump capture service.
lines 1-13/13 (END)

만약 위의 상태가 아니라면, 아래 명령어를 수행합니다.
#sudo service kdump-tools load
#sudo service kdump-tools start

kdump가 제대로 동작하는지 강제 kernel panic 일으켜서 확인해보는 방법 (Optional)

SysRQ 매커니즘을 enable 하여 kdump가 실제로 동작하는지 테스트해봅니다. 그러나, 아래 테스트는 선택사항입니다. (Reboot이 필요합니다.)

root@sys-87396:/etc/default# cat /proc/sys/kernel/sysrq
176

위 결과가 0이 아니면 실행 가능한 상태입니다. 만약 0이라면, 아래와 같이 수행해줍니다.
# sudo sysctl -w kernel.sysrq=1

이제 강제장애 상황을 일으켜봅니다. 연결중인 네트워크 연결은 끊어질 것이고, Core dump 생성 후 reboot 진행됩니다.
root@sys-87396:/etc/default# echo c > /proc/sysrq-trigger

위 Command 수행 시 Console 환경에서 수행하면, 아래와 같은 진행 절차를 보게 됩니다. 저는 텔넷 환경으로 수행하여 보진 못했습니다.

시스템 재부팅 후, /var/crash에 새로 생성된 덤프를 확인해봅니다.

root@sys-87396:~# ls /var/crash
201705260522  kexec_cmd  linux-image-4.4.0-78-generic-201705260522.crash
 

2017년 3월 28일 화요일

Dockerfile.ppc64le 알아보기

ppc64le/ubuntu 환경에서 원하는 버전의 Docker engine 을 사용하기 위해서, 직접 Docker 소스코드를 빌드하여 사용하는 방법이 있습니다.

이때 사용하게 되는 것이 Docker github에 이미 올라와 있는, 잘 만들어진 Dockerfile.ppc64le 입니다. 이 파일을 살펴보면, go lang, 등등의 버전을 원하는 대로 설정하여 Docker 엔진을 빌드하여 사용할 수 있습니다.

https://github.com/docker/docker/blob/master/Dockerfile.ppc64le

아래는 Dockerfile.ppc64le 내용입니다.


# This file describes the standard way to build Docker on ppc64le, using docker
#
# Usage:
#
# # Assemble the full dev environment. This is slow the first time.
# docker build -t docker -f Dockerfile.ppc64le .
#
# # Mount your source in an interactive container for quick testing:
# docker run -v `pwd`:/go/src/github.com/docker/docker --privileged -i -t docker bash
#
# # Run the test suite:
# docker run --privileged docker hack/make.sh test-unit test-integration-cli test-docker-py
#
# Note: AppArmor used to mess with privileged mode, but this is no longer
# the case. Therefore, you don't have to disable it anymore.
#

FROM ppc64le/debian:jessie

# allow replacing httpredir or deb mirror
ARG APT_MIRROR=deb.debian.org
RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list

# Packaged dependencies
RUN apt-get update && apt-get install -y \
    apparmor \
    apt-utils \
    aufs-tools \
    automake \
    bash-completion \
    btrfs-tools \
    build-essential \
    cmake \
    createrepo \
    curl \
    dpkg-sig \
    git \
    iptables \
    jq \
    net-tools \
    libapparmor-dev \
    libcap-dev \
    libltdl-dev \
    libsystemd-journal-dev \
    libtool \
    mercurial \
    pkg-config \
    python-dev \
    python-mock \
    python-pip \
    python-websocket \
    xfsprogs \
    tar \
    vim-common \
    --no-install-recommends

# Get lvm2 source for compiling statically
ENV LVM2_VERSION 2.02.103
RUN mkdir -p /usr/local/lvm2 \
    && curl -fsSL "https://mirrors.kernel.org/sourceware/lvm2/LVM2.${LVM2_VERSION}.tgz" \
        | tar -xzC /usr/local/lvm2 --strip-components=1
# See https://git.fedorahosted.org/cgit/lvm2.git/refs/tags for release tags

# Fix platform enablement in lvm2 to support ppc64le properly
RUN set -e \
    && for f in config.guess config.sub; do \
        curl -fsSL -o "/usr/local/lvm2/autoconf/$f" "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=$f;hb=HEAD"; \
    done
# "arch.c:78:2: error: #error the arch code needs to know about your machine type"

# Compile and install lvm2
RUN cd /usr/local/lvm2 \
    && ./configure \
        --build="$(gcc -print-multiarch)" \
        --enable-static_link \
    && make device-mapper \
    && make install_device-mapper
# See https://git.fedorahosted.org/cgit/lvm2.git/tree/INSTALL

# Install seccomp: the version shipped upstream is too old
ENV SECCOMP_VERSION 2.3.2
RUN set -x \
        && export SECCOMP_PATH="$(mktemp -d)" \
        && curl -fsSL "https://github.com/seccomp/libseccomp/releases/download/v${SECCOMP_VERSION}/libseccomp-${SECCOMP_VERSION}.tar.gz" \
                | tar -xzC "$SECCOMP_PATH" --strip-components=1 \
        && ( \
                cd "$SECCOMP_PATH" \
                && ./configure --prefix=/usr/local \
                && make \
                && make install \
                && ldconfig \
        ) \
        && rm -rf "$SECCOMP_PATH"


# Install Go
# 이 부분이 go language 버전을 설치하는 부분입니다. https://golang.org/dl/ 사이트에 가보면 현재 ppc64le용으로 version 1.8까지 나와있습니다. ENV GO_VERSION을 변경하면 원하는 버전으로 설치하게 됩니다. 현재는 1.7.5 버전으로 설치하게 되어 있습니다.
# NOTE: official ppc64le go binaries weren't available until go 1.6.4 and 1.7.4
ENV GO_VERSION 1.7.5
RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-ppc64le.tar.gz" \
    | tar -xzC /usr/local

ENV PATH /go/bin:/usr/local/go/bin:$PATH
ENV GOPATH /go

# Dependency for golint
ENV GO_TOOLS_COMMIT 823804e1ae08dbb14eb807afc7db9993bc9e3cc3
RUN git clone https://github.com/golang/tools.git /go/src/golang.org/x/tools \
    && (cd /go/src/golang.org/x/tools && git checkout -q $GO_TOOLS_COMMIT)

# Grab Go's lint tool
ENV GO_LINT_COMMIT 32a87160691b3c96046c0c678fe57c5bef761456
RUN git clone https://github.com/golang/lint.git /go/src/github.com/golang/lint \
    && (cd /go/src/github.com/golang/lint && git checkout -q $GO_LINT_COMMIT) \
    && go install -v github.com/golang/lint/golint

# Install two versions of the registry. The first is an older version that
# only supports schema1 manifests. The second is a newer version that supports
# both. This allows integration-cli tests to cover push/pull with both schema1
# and schema2 manifests.
ENV REGISTRY_COMMIT_SCHEMA1 ec87e9b6971d831f0eff752ddb54fb64693e51cd
ENV REGISTRY_COMMIT 47a064d4195a9b56133891bbb13620c3ac83a827
RUN set -x \
    && export GOPATH="$(mktemp -d)" \
    && git clone https://github.com/docker/distribution.git "$GOPATH/src/github.com/docker/distribution" \
    && (cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT") \
    && GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \
        go build -o /usr/local/bin/registry-v2 github.com/docker/distribution/cmd/registry \
    && (cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT_SCHEMA1") \
    && GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \
        go build -o /usr/local/bin/registry-v2-schema1 github.com/docker/distribution/cmd/registry \
    && rm -rf "$GOPATH"

# Install notary and notary-server
ENV NOTARY_VERSION v0.5.0
RUN set -x \
    && export GOPATH="$(mktemp -d)" \
    && git clone https://github.com/docker/notary.git "$GOPATH/src/github.com/docker/notary" \
    && (cd "$GOPATH/src/github.com/docker/notary" && git checkout -q "$NOTARY_VERSION") \
    && GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \
        go build -o /usr/local/bin/notary-server github.com/docker/notary/cmd/notary-server \
    && GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \
        go build -o /usr/local/bin/notary github.com/docker/notary/cmd/notary \
    && rm -rf "$GOPATH"

# Get the "docker-py" source so we can run their integration tests
ENV DOCKER_PY_COMMIT e2655f658408f9ad1f62abdef3eb6ed43c0cf324
RUN git clone https://github.com/docker/docker-py.git /docker-py \
    && cd /docker-py \
    && git checkout -q $DOCKER_PY_COMMIT \
    && pip install -r test-requirements.txt

# Set user.email so crosbymichael's in-container merge commits go smoothly
RUN git config --global user.email 'docker-dummy@example.com'

# Add an unprivileged user to be used for tests which need it
RUN groupadd -r docker
RUN useradd --create-home --gid docker unprivilegeduser

VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux

# Let us use a .bashrc file
RUN ln -sfv $PWD/.bashrc ~/.bashrc

# Register Docker's bash completion.
RUN ln -sv $PWD/contrib/completion/bash/docker /etc/bash_completion.d/docker

# Get useful and necessary Hub images so we can "docker load" locally instead of pulling
COPY contrib/download-frozen-image-v2.sh /go/src/github.com/docker/docker/contrib/
RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images \
    ppc64le/buildpack-deps:jessie@sha256:902bfe4ef1389f94d143d64516dd50a2de75bca2e66d4a44b1d73f63ddf05dda \
    ppc64le/busybox:latest@sha256:38bb82085248d5a3c24bd7a5dc146f2f2c191e189da0441f1c2ca560e3fc6f1b \
    ppc64le/debian:jessie@sha256:412845f51b6ab662afba71bc7a716e20fdb9b84f185d180d4c7504f8a75c4f91 \
    ppc64le/hello-world:latest@sha256:186a40a9a02ca26df0b6c8acdfb8ac2f3ae6678996a838f977e57fac9d963974
# See also "hack/make/.ensure-frozen-images" (which needs to be updated any time this list is)

# Install tomlv, vndr, runc, containerd, tini, docker-proxy
# Please edit hack/dockerfile/install-binaries.sh to update them.
COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy

# Wrap all commands in the "docker-in-docker" script to allow nested containers
ENTRYPOINT ["hack/dind"]

# Upload docker source
# 해당 Dockerfile로 빌드한 이미지로 컨테이너를 수행하면, 현재 경로(docker github를 local에 복제한 경로를 의도함)를 실행된 컨테이너에서 copy 하여 사용하도록 합니다.
# 예컨데.. 컨테이너를 bash로 수행하게 되면, root@컨테이너ID:/go/src/github.com/docker/docker# 로 시작됩니다.
COPY . /go/src/github.com/docker/docker

ppc64le 용으로 특정 버전의 Docker engine build 하기

이전 글에서는 Ubuntu(ppc64le) 에다가 이미 잘 만들어진 Docker 엔진을 받아 간단히 설치했습니다. 그런데 이미 Build 된 Docker engine들은 Docker의 최신 버전은 아니더군요..

이왕 Ubuntu 16.10 버전을 사용하는 김에, Docker engine 도 최신으로 사용해보고자 Docker master binary 사이트를 찾아보았습니다. Docker 최신 바이너리는 현재 17.05 인것 같네요.

ppc64le OS 버전에 맞는 Docker 빌드는 어떻게 하는가?
https://developer.ibm.com/recipes/tutorials/build-docker-ppc64le-on-power-linux/

IBM developer recipe에서 누군가 이미 친절하게 설명해 놓았습니다.

방법 1. Docker Master binary 사이트에서 ppc64le 버전의 파일을 다운로드 받고, /usr/bin에 있던 기존 docker 바이너리와 바꿔치기 합니다.

아래가 현재 사용중인 binaries 입니다.


wget으로 master.docker.org 에서 위의 파일과 같은 이름을 가진 ppc64le 버전을 받아옵니다.
# wget https://master.dockerproject.org/linux/ppc64le/docker && wget https://master.dockerproject.org/linux/ppc64le/docker-containerd && wget https://master.dockerproject.org/linux/ppc64le/docker-containerd-ctr && wget https://master.dockerproject.org/linux/ppc64le/docker-containerd-shim && wget https://master.dockerproject.org/linux/ppc64le/docker-init && wget https://master.dockerproject.org/linux/ppc64le/docker-proxy && wget https://master.dockerproject.org/linux/ppc64le/docker-runc && wget https://master.dockerproject.org/linux/ppc64le/dockerd
# service docker stop
# cp docker docker-containerd docker-containerd-ctr docker-containerd shim docker-init docker-proxy docker-runc dockerd /usr/bin
# service docker start
# docker version


방법 2.위 방법이 잘 되지 않으면, Docker 문서에서 설명하는 것처럼 소스 코드로 직접 Docker 엔진을 빌드합니다. 그러나, 공식 문서는 x86 기준이므로 ppc64le와는 절차가 조금 다릅니다.


방법2를 상세히 보면,
1. 우선 ppc64le Ubuntu OS에 이미 기존에 빌드된 이전 버전의 Docker 엔진을 설치합니다. (이전 포스트 참조)

2. 그 다음 github에서 Docker 소스코드를 Local 영역에 받아오고, 브랜치를 설정합니다.

#mkdir /tmp_downloads
#cd /tmp_downloads
#git clone https://github.com/docker/docker.git
#cd docker

#git branch // 마스터 branch 만들기


#git tag // 소스 버전 확인

#git checkout -b v17.03.0-ce v17.03.0-ce // -b 옵션으로 임의 branch 생성하며 작업할 브랜치 전환(v17.03.0-ce) => git tag로 확인한 소스 버전으로 체크아웃을 수행하면, 도커 엔진 이미지 빌드 후, hack/make.sh 를 수행할때 해당 버전으로 소스코드를 빌드한다고 합니다. go language 버전을 변경하고 싶은 경우, Dockerfile.ppc64le 파일에서 "ENV GO_VERSION 1.7.5" 부분을 수정하면 됩니다. 기본은 1.7.5 버전입니다. (https://golang.org/dl/ 에서 최신 버전의 go language 확인 가능)

3. 이미 github에 작성되어 있는 Dockerfile.ppc64le 를 이용해서 원하는 버전의 Docker-engine 이미지를 빌드합니다.
# docker build -t docker-build -f Dockerfile.ppc64le .
# docker images // docker-build라는 이름으로 새로 생성된 이미지 확인
(아래는 빌드 수행 후 완료된 화면..)



4. 새로 생성된 Docker-engine 이미지로 컨테이너를 하나 실행하고, 이 컨테이너 안에서 스크립트를 수행하여 받아온 소스코드를 빌드합니다. (docker github의 hack/make.sh 스크립트 수행, 시간이 좀 걸림.)
# docker run --privileged --rm -ti docker-build /bin/bash
root@컨테이너ID:/go/src/github.com/docker/docker# hack/make.sh binary
 (완료 메시지를 보면, bundles/17.03.0-ce/binary-client, bundles/17.03.0-ce/binary-daemon 경로에 바이너리 파일이 생성되었다고 나옵니다.)

5. 소스코드 빌드가 완료되면, bundles/latest/binary에 해당 버전의 Docker 바이너리가 생성됩니다. 앞서 git checkout으로 전환했던 브랜치, git tag 버전(17.03.0-ce)대로 만들어졌네요. 경로를 잘 알아둡니다. (containerID:/go/src/github.com/docker/docker/bundles/17.03.0-ce/binary-....)
컨테이너를 빠져나옵니다.(종료되지 않도록 ctrl+P 누르고 ctrl+Q로 빠져나옵니다)
컨테이너에 생성되어 있는 바이너리 파일을 호스트로 copy 합니다.
# docker cp containerID:/go/src/github.com/docker/docker/bundles/17.03.0-ce/binary-client [다운받을 Host 임의 경로]
# docker cp containerID:/go/src/github.com/docker/docker/bundles/17.03.0-ce/binary-daemon [다운받을 Host 임의 경로]
 
 

참고로, 호스트OS에서도 좀전에 컨테이너에서 생성한 파일을 확인할 수 있습니다. (8e9d891....로 시작되는 부분을 어떻게 확인해야 하는지는 잘 모르겠습니다.)

6. 새로 만들어진 바이너리를 /usr/bin에 넣어주고 Docker 데몬을 재수행합니다. Docker 버전이 바뀌었는지 체크하면 완료.
# service docker stop
# cp binary-client/관련파일 /usr/bin/
# cp binary-daemon/관련파일 /usr/bin/
# system docker start
# docker version


여기까지 ppc64le 용도로 특정 버전의 Docker engine build 하는 방법을 알아보았습니다.
사실.. 이미 빌드 된 Docker engine 특정 버전의 바이너리만 있다면 방법 1로 간단히 수행할수 있습니다. 원하는 버전의 바이너리가 없을 때, 혹은 ppc64le용 Docker engine 소스를 스스로 수정하여 빌드하고자 할때 사용 가능한 방법입니다.