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으로 설치하고 해보니 아무 문제없이 잘 됩니다.
피드 구독하기:
댓글 (Atom)
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