2017년 6월 14일 수요일

Linux kernel update 이후 SpectrumScale mount가 안되는 문제의 해결 - mmbuildgpl


보안 패치 등의 적용 등으로 인해 원했든 원하지 않았든 linux kernel이 update되는 수가 있습니다.  그 뒤에 SpectrumScale (GPFS)가 mount가 되지 않는 경우가 있습니다.  좀더 정확하게 말하자면 GPFS daemon이 살아나지 못하는 경우지요.

결론부터 이야기하면 다음과 같이 해당 서버에서 root 권한으로 1줄의 명령을 수행하고 GPFS daemon을 restart 하면 해결됩니다.

# /usr/lpp/mmfs/bin/mmbuildgpl

설명은 이렇습니다.

- GPFS는 여러 node에 걸쳐 동시에 mount되고 read/write할 수 있는 병렬파일시스템이기 때문에, 일반 파일시스템과는 달리 linux kernel에 밀접히 연관되어 있습니다.
- UNIX OS인 IBM AIX에서는 위와 같은 절차가 필요없으나, Linux OS에서는 open source로 되어 있는 linux kernel이 바뀔 때마다 그와 연동하기 위해 GPFS의 일부 module(portability layer)도 새로 compile되어야 합니다.
- 원래 이 작업은 몇가지 과정을 거치는 좀더 복잡한 작업이었으나, IBM에서 위와 같이 mmbuildgpl 명령 하나만으로 그 과정들이 모두 수행되도록 shell script를 작성한 것입니다.
- 위 작업을 수행하신 뒤, 해당 node에서 mmshutdown 이후 mmstartup으로 GPFS daemon만 restart 해주시면 GPFS가 다시 잘 mount 됩니다.

이 상황의 재현 및 해결의 test를 위해 먼저, 1대의 POWER8 Ubuntu 서버(sys-87549)를 GPFS server로 삼고, 나머지 1대(sys-87576)를 network을 통해 그 GPFS를 mount하는 GPFS client로 삼겠습니다.

먼저, SpectrumScale (GPFS)을 설치합니다.  tgz 파일을 풀면 다음과 같이 self-extracting 파일이 나옵니다.

root@sys-87549:/home/u0017496# tar -zxvf SpectrumScaleStd421Pwr8le.tgz
Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install
README

이걸 수행해주면 Redhat용 rpm과 Ubuntu용 deb 파일들이 /usr/lpp/mmfs/4.2.1.0에 복사됩니다.

root@sys-87549:/home/u0017496# ./Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install

Extracting License Acceptance Process Tool to /usr/lpp/mmfs/4.2.1.0 ...
tail -n +563 ./Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install | tar -C /usr/lpp/mmfs/4.2.1.0 -xvz --exclude=installer --exclude=*_rpms --exclude=*rpm  --exclude=*tgz --exclude=*deb 1> /dev/null

Installing JRE ...
tail -n +563 ./Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install | tar -C /usr/lpp/mmfs/4.2.1.0 --wildcards -xvz  ibm-java*tgz 1> /dev/null
tar -C /usr/lpp/mmfs/4.2.1.0/ -xzf /usr/lpp/mmfs/4.2.1.0/ibm-java*tgz
Defaulting to --text-only mode.
...
Product rpms successfully extracted to /usr/lpp/mmfs/4.2.1.0

root@sys-87549:/home/u0017496# cd /usr/lpp/mmfs/4.2.1.0/
root@sys-87549:/usr/lpp/mmfs/4.2.1.0# ls
gpfs.base_4.2.1-0_ppc64el.deb     gpfs.gss.pmcollector-4.2.1-0.el7.ppc64le.rpm
gpfs.base-4.2.1-0.ppc64le.rpm     gpfs.gss.pmcollector-4.2.1-0.sles12.ppc64le.rpm
gpfs.docs_4.2.1-0_all.deb         gpfs.gss.pmsensors-4.2.1-0.el7.ppc64le.rpm
gpfs.docs-4.2.1-0.noarch.rpm      gpfs.gss.pmsensors-4.2.1-0.sles12.ppc64le.rpm
gpfs.ext_4.2.1-0_ppc64el.deb      gpfs.gui-4.2.1-0.noarch.rpm
gpfs.ext-4.2.1-0.ppc64le.rpm      gpfs.java-4.2.1-0.ppc64le.rpm
gpfs.gpl_4.2.1-0_all.deb          gpfs.msg.en-us_4.2.1-0_all.deb
gpfs.gpl-4.2.1-0.noarch.rpm       gpfs.msg.en_US-4.2.1-0.noarch.rpm
gpfs.gskit_8.0.50-57_ppc64el.deb  license
gpfs.gskit-8.0.50-57.ppc64le.rpm  manifest

먼저, GPFS 구성에는 아래 OS package들이 필요하므로 apt-get으로 설치합니다.

root@sys-87549:/usr/lpp/mmfs/4.2.1.0# apt-get install ksh gawk libaio1

그리고나서 아래 명령으로 deb 파일들을 설치합니다.

root@sys-87549:/usr/lpp/mmfs/4.2.1.0# dpkg -i gpfs.base*deb gpfs.gpl*deb gpfs.gskit*deb gpfs.msg*deb gpfs.ext*deb

위 작업을 sys-87576에서 반복합니다.

이제 GPFS cluster를 만듭니다.  Primary server node는 여기서는 sys-87549 1대 뿐이고, client도 sys-87576 1대 뿐입니다.

root@sys-87549:/usr/lpp/mmfs/bin# ./mmcrcluster -N sys-87549:manager-quorum,sys-87576:client -p sys-87549 -r /usr/bin/ssh -R /usr/bin/scp -C test1
mmcrcluster: Performing preliminary node verification ...
mmcrcluster: Processing quorum and other critical nodes ...
...
mmcrcluster: Command successfully completed
mmcrcluster: Warning: Not all nodes have proper GPFS license designations.
    Use the mmchlicense command to designate licenses as needed.
mmcrcluster: Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.


이제 아래와 같이 mmchlicense 명령으로 license accept를 합니다.

root@sys-87549:/usr/lpp/mmfs/bin# mmchlicense server --accept -N sys-87549

root@sys-87576:/usr/lpp/mmfs/bin# mmchlicense client --accept -N sys-87576


이제 다른 쪽 노드에서 mmlscluster를 수행해보면 이미 cluster로 구성된 것이 보입니다.

root@sys-87576:/usr/lpp/mmfs/bin# mmlscluster

GPFS cluster information
========================
  GPFS cluster name:         test1.dal-ebis.ihost.com
  GPFS cluster id:           6484364745360086160
  GPFS UID domain:           test1.dal-ebis.ihost.com
  Remote shell command:      /usr/bin/ssh
  Remote file copy command:  /usr/bin/scp
  Repository type:           CCR

 Node  Daemon node name              IP address      Admin node name               Designation
-----------------------------------------------------------------------------------------------
   1   sys-87549.dal-ebis.ihost.com  172.29.160.222  sys-87549.dal-ebis.ihost.com  quorum-manager
   2   sys-87576.dal-ebis.ihost.com  172.29.160.12   sys-87576.dal-ebis.ihost.com


이제 서버에서 GPFS daemon을 start 합니다.

root@sys-87549:/usr/lpp/mmfs/bin# mmstartup -a
Wed Jun 14 06:57:29 EDT 2017: mmstartup: Starting GPFS ...
sys-87576.dal-ebis.ihost.com:  /tmp/mmfs has been created successfully.

Daemon들이 제대로 올라왔는지 아래 명령으로 확인합니다.  보시다시피 down된 상태입니다.  즉, 뭔가 잘못된 것이지요.

root@sys-87549:/usr/lpp/mmfs/bin# mmgetstate -a

 Node number  Node name        GPFS state
------------------------------------------
       1      sys-87549        down
       2      sys-87576        down

이는 위에서 언급한 GPFS의 portability layer를 build 해주지 않았기 때문입니다.  설치 후, 그리고 향후에도 kernel update 등을 한 이후에는 꼭 아래 명령을 내려  GPFS의 portability layer를 새로 compile 해줘야 합니다.  아래 mmbuildgpl은 shell script로서, 여러 단계의 compile 과정을 자동으로 해줍니다.

root@sys-87549:~# /usr/lpp/mmfs/bin/mmbuildgpl
--------------------------------------------------------
mmbuildgpl: Building GPL module begins at Wed Jun 14 08:57:27 EDT 2017.
--------------------------------------------------------
Verifying Kernel Header...
  kernel version = 40400066 (4.4.0-66-generic, 4.4.0-66)
  module include dir = /lib/modules/4.4.0-66-generic/build/include
  module build dir   = /lib/modules/4.4.0-66-generic/build
  kernel source dir  = /usr/src/linux-4.4.0-66-generic/include
  Found valid kernel header file under /lib/modules/4.4.0-66-generic/build/include
Verifying Compiler...
  make is present at /usr/bin/make
  cpp is present at /usr/bin/cpp
  gcc is present at /usr/bin/gcc
  g++ is present at /usr/bin/g++
  ld is present at /usr/bin/ld
make World ...
make InstallImages ...
--------------------------------------------------------
mmbuildgpl: Building GPL module completed successfully at Wed Jun 14 08:58:12 EDT 2017.
--------------------------------------------------------

다시 GPFS daemon을 start 합니다.

root@sys-87549:/home/u0017496# mmstartup -a
Wed Jun 14 09:02:18 EDT 2017: mmstartup: Starting GPFS ...

잘 올라온 것을 확인할 수 있습니다.

root@sys-87549:~# mmgetstate -a

 Node number  Node name        GPFS state
------------------------------------------
       1      sys-87549        active
       2      sys-87576        active


이제 SpectrumScale server인 sys-87549의 내장 disk로 NSD를 만듭니다.  이 disk는 sys-87549에서만 access되는 내장 disk이지만, 일단 NSD로 만들어지면 네트워크를 통해 client node인 sys-87576에서도 access가 가능해집니다.

root@sys-87549:~# vi /tmp/diskdef.txt
%nsd:
device=/dev/sdb
servers=sys-87549
nsd=nsd1
usage=dataAndMetadata

root@sys-87549:~# mmcrnsd -F /tmp/diskdef.txt
mmcrnsd: Processing disk sdb
mmcrnsd: Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.

SpectrumScale client 노드인 sys-87576에서도 이것이 보이는지 확인합니다.

root@sys-87576:~# mmlsnsd

 File system   Disk name    NSD servers
---------------------------------------------------------------------------
 (free disk)   nsd1         sys-87549.dal-ebis.ihost.com


이제 GPFS filesystem을 만듭니다.

root@sys-87549:~# mmcrfs GPFS1 -F /tmp/diskdef.txt -A yes -T /gpfs1 --version=4.2.1.0

The following disks of GPFS1 will be formatted on node sys-87549:
    nsd1: size 4096 MB
Formatting file system ...
Disks up to size 96 GB can be added to storage pool system.
Creating Inode File
  48 % complete on Wed Jun 14 09:09:18 2017
  97 % complete on Wed Jun 14 09:09:23 2017
 100 % complete on Wed Jun 14 09:09:23 2017
Creating Allocation Maps
Creating Log Files
  78 % complete on Wed Jun 14 09:09:29 2017
 100 % complete on Wed Jun 14 09:09:29 2017
Clearing Inode Allocation Map
Clearing Block Allocation Map
Formatting Allocation Map for storage pool system
Completed creation of file system /dev/GPFS1.
mmcrfs: Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.


root@sys-87549:~# mmlsfs all

File system attributes for /dev/GPFS1:
======================================
flag                value                    description
------------------- ------------------------ -----------------------------------
 -f                 8192                     Minimum fragment size in bytes
 -i                 4096                     Inode size in bytes
 -I                 32768                    Indirect block size in bytes
 -m                 1                        Default number of metadata replicas
 -M                 2                        Maximum number of metadata replicas
 -r                 1                        Default number of data replicas
 -R                 2                        Maximum number of data replicas
 -j                 cluster                  Block allocation type
 -D                 nfs4                     File locking semantics in effect
 -k                 all                      ACL semantics in effect
 -n                 32                       Estimated number of nodes that will mount file system
 -B                 262144                   Block size
 -Q                 none                     Quotas accounting enabled
                    none                     Quotas enforced
                    none                     Default quotas enabled
 --perfileset-quota No                       Per-fileset quota enforcement
 --filesetdf        No                       Fileset df enabled?
 -V                 15.01 (4.2.0.0)          File system version
 --create-time      Wed Jun 14 09:09:15 2017 File system creation time
 -z                 No                       Is DMAPI enabled?
 -L                 4194304                  Logfile size
 -E                 Yes                      Exact mtime mount option
 -S                 No                       Suppress atime mount option
 -K                 whenpossible             Strict replica allocation option
 --fastea           Yes                      Fast external attributes enabled?
 --encryption       No                       Encryption enabled?
 --inode-limit      65792                    Maximum number of inodes
 --log-replicas     0                        Number of log replicas
 --is4KAligned      Yes                      is4KAligned?
 --rapid-repair     Yes                      rapidRepair enabled?
 --write-cache-threshold 0                   HAWC Threshold (max 65536)
 --subblocks-per-full-block 32               Number of subblocks per full block
 -P                 system                   Disk storage pools in file system
 -d                 nsd1                     Disks in file system
 -A                 yes                      Automatic mount option
 -o                 none                     Additional mount options
 -T                 /gpfs1                   Default mount point
 --mount-priority   0                        Mount priority

이제 mount 합니다.  -a 옵션을 쓰면 클러스터 내 모든 노드에서 다 mount 됩니다.

root@sys-87549:~# mmmount all -a
Wed Jun 14 09:11:15 EDT 2017: mmmount: Mounting file systems ...

모든 노드에서 다 mount 되었는지 확인합니다.

root@sys-87549:~# mmlsmount all
File system GPFS1 is mounted on 2 nodes.

Client 노드에 들어가서 mount 되었는지 확인합니다.

root@sys-87576:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           408M   18M  390M   5% /run
/dev/sda2        35G   18G   16G  53% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
GPFS1           4.0G  3.9G  151M  97% /gpfs1

이제 비로소 kernel update 및 GPFS mount 테스트 준비가 끝났습니다.   이제 client인 sys-87576에서 kernel을 update 해보겠습니다.  먼저, 현재 kernel 버전을 확인합니다.

root@sys-87576:~# uname -r
4.4.0-66-generic

이제 kernel update를 합니다.

root@sys-87576:~# apt-get upgrade

완료되면 reboot 합니다.

root@sys-87576:~# shutdown -r now

Reboot 된 이후 kernel 버전 확인합니다.

root@sys-87576:/home/u0017496# uname -r
4.4.0-79-generic

이제 GPFS를 mount하기 위해 GPFS daemon을 살립니다.  (여기서는 client 노드에서만 살리면 되므로 -a 옵션은 빼고 수행합니다.)

root@sys-87576:/home/u0017496# mmstartup
Wed Jun 14 09:42:08 EDT 2017: mmstartup: Starting GPFS ...
mmremote: startSubsys: The /lib/modules/4.4.0-79-generic/extra/mmfslinux.ko kernel extension does not exist.  Use mmbuildgpl command to create the needed kernel extension for your kernel or copy the binaries from another node with the identical environment.
mmremote: startSubsys: Unable to verify kernel/module configuration.
mmstartup: Command failed. Examine previous error messages to determine cause.

보시다시피 error가 나고, 당연히 GPFS 파일시스템은 마운트 되지 못합니다.  이제 mmbuildgpl 명령으로 portability layer를 compile 해줍니다.

root@sys-87576:/home/u0017496# mmbuildgpl
--------------------------------------------------------
mmbuildgpl: Building GPL module begins at Wed Jun 14 09:42:21 EDT 2017.
--------------------------------------------------------
Verifying Kernel Header...
  kernel version = 40400079 (4.4.0-79-generic, 4.4.0-79)
  module include dir = /lib/modules/4.4.0-79-generic/build/include
  module build dir   = /lib/modules/4.4.0-79-generic/build
  kernel source dir  = /usr/src/linux-4.4.0-79-generic/include
  Found valid kernel header file under /lib/modules/4.4.0-79-generic/build/include
Verifying Compiler...
  make is present at /usr/bin/make
  cpp is present at /usr/bin/cpp
  gcc is present at /usr/bin/gcc
  g++ is present at /usr/bin/g++
  ld is present at /usr/bin/ld
make World ...
make InstallImages ...
--------------------------------------------------------
mmbuildgpl: Building GPL module completed successfully at Wed Jun 14 09:43:18 EDT 2017.
--------------------------------------------------------

성공적으로 끝났습니다.  이제 GPFS daemon을 살립니다.

root@sys-87576:/home/u0017496# mmstartup
Wed Jun 14 09:45:26 EDT 2017: mmstartup: Starting GPFS ...

잘 되었습니다.  이제 mount 합니다.

root@sys-87576:/home/u0017496# mmmount all
Wed Jun 14 09:45:37 EDT 2017: mmmount: Mounting file systems ...

잘 되었습니다.  이제 눈으로 mount 상태를 확인합니다.

root@sys-87576:/home/u0017496# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           408M   12M  396M   3% /run
/dev/sda2        35G   18G   16G  53% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
GPFS1           4.0G  456M  3.6G  12% /gpfs1


** 여기서는 SpectrumScale 4.2.1로 테스트한 것으로 되어 있습니다만, 제가 해보니 4.2.1에서는 mmbuildgpl에서 다음과 같은 error가 발생합니다.  

error "struct inode has no member named i_wb_list"

이는 4.2.1에서의 bug인 모양입니다.  다시 4.2.3으로 설치하고 해보니 아무 문제없이 잘 됩니다.  

댓글 1개:

  1. Hw 엔지니어를 위한 Deep Learning: Linux Kernel Update 이후 Spectrumscale Mount가 안되는 문제의 해결 - Mmbuildgpl >>>>> Download Now

    >>>>> Download Full

    Hw 엔지니어를 위한 Deep Learning: Linux Kernel Update 이후 Spectrumscale Mount가 안되는 문제의 해결 - Mmbuildgpl >>>>> Download LINK

    >>>>> Download Now

    Hw 엔지니어를 위한 Deep Learning: Linux Kernel Update 이후 Spectrumscale Mount가 안되는 문제의 해결 - Mmbuildgpl >>>>> Download Full

    >>>>> Download LINK

    답글삭제