Dealing with PHP Segfault in CentOS 6.5

Oktyabr 15, 2014 Şərh yaz

Bir müddət əvvələ qədər DMESG output-dan aldığımız məlumata əsasən commandline-dan çalışdırılan PHP kod serverde segfult error-lar verir, bir müddətdən sonra isə server-in özünü necə deyərlər “itiririk”:

php[2682]: segfault at ffffffff ip 000000000058b19f sp 00007fff4f51eae0 error 4 in php[400000+2c0000]
php[4478]: segfault at ffffffff ip 000000000058b19f sp 00007fffd5b5b3e0 error 4 in php[400000+2c0000]
php[5883]: segfault at ffffffff ip 000000000058b19f sp 00007fff6e5ddd70 error 4 in php[400000+2c0000]
php[8353]: segfault at ffffffff ip 000000000058b19f sp 00007ffffa83a8a0 error 4 in php[400000+2c0000]
php[9629]: segfault at ffffffff ip 000000000058b19f sp 00007fff55e23630 error 4 in php[400000+2c0000]
php[11285]: segfault at ffffffff ip 000000000058b19f sp 00007fff2dd525a0 error 4 in php[400000+2c0000]
php[13148]: segfault at ffffffff ip 000000000058b19f sp 00007fff375157a0 error 4 in php[400000+2c0000]
php[14569]: segfault at ffffffff ip 000000000058b19f sp 00007fff90a58d00 error 4 in php[400000+2c0000]
php[15560]: segfault at ffffffff ip 000000000058b19f sp 00007fffa1db0060 error 4 in php[400000+2c0000]
php[17825]: segfault at ffffffff ip 000000000058b19f sp 00007fff33d2b490 error 4 in php[400000+2c0000]
php[18783]: segfault at ffffffff ip 000000000058b19f sp 00007ffff949dcb0 error 4 in php[400000+2c0000]
php[19747]: segfault at ffffffff ip 000000000058b19f sp 00007fff897c3f10 error 4 in php[400000+2c0000]
php[20704]: segfault at ffffffff ip 000000000058b19f sp 00007ffff3083eb0 error 4 in php[400000+2c0000]
php[21667]: segfault at ffffffff ip 000000000058b19f sp 00007fff93bb9a20 error 4 in php[400000+2c0000]
php[22620]: segfault at ffffffff ip 000000000058b19f sp 00007fff28930530 error 4 in php[400000+2c0000]
php[24544]: segfault at ffffffff ip 000000000058b19f sp 00007ffff8e08450 error 4 in php[400000+2c0000]
php[25654]: segfault at ffffffff ip 000000000058b19f sp 00007fffaf874640 error 4 in php[400000+2c0000]
php[26704]: segfault at ffffffff ip 000000000058b19f sp 00007fff7e2283a0 error 4 in php[400000+2c0000]
php[27869]: segfault at ffffffff ip 000000000058b19f sp 00007fffc9e5c8e0 error 4 in php[400000+2c0000]

/var/log/messages – output:

Oct 13 11:23:46 linuxsrv2 kernel: php[2439]: segfault at 6b4bac000 ip 00000000005b41d0 sp 00007fff7d0b9568 error 4 in php[400000+2c0000]
Oct 13 11:23:48 linuxsrv2 abrtd: Directory 'ccpp-2014-10-13-11:23:46-2439' creation detected
Oct 13 11:23:48 linuxsrv2 abrt[2440]: Saved core dump of pid 2439 (/usr/bin/php) to /var/spool/abrt/ccpp-2014-10-13-11:23:46-2439 (85946368 bytes)

Daha dəqiq olaraq test etdikdə:

[root@linuxsrv2 abrt]# /usr/bin/php /usr/share/nginx/html/Grab/index-console.php Test xxxxxxxxxx
Segmentation fault (core dumped)

Core Dump GDB output-a nəzər yetirək:

[root@linuxsrv2 ccpp-2014-10-15-14:25:02-10116]# gdb /usr/bin/php coredump
.
.
.
Core was generated by `/usr/bin/php /usr/share/nginx/html/Grab/index-console.php Test xxxxxxxx'.
Program terminated with signal 11, Segmentation fault.
#0  zend_mm_remove_from_free_list (heap=<value optimized out>, mm_block=0x29fe8c8) at /usr/src/debug/php-5.3.3/Zend/zend_alloc.c:826
826				ZEND_MM_CHECK_TREE(mm_block);

(gdb) bt
#0  zend_mm_remove_from_free_list (heap=<value optimized out>, mm_block=0x29fe8c8) at /usr/src/debug/php-5.3.3/Zend/zend_alloc.c:826
#1  0x000000000058b3b5 in _zend_mm_free_int (heap=0x24372b0, p=0x29fe878) at /usr/src/debug/php-5.3.3/Zend/zend_alloc.c:2019
#2  0x00000000005b4b91 in zend_hash_destroy (ht=0x4e4d1b0) at /usr/src/debug/php-5.3.3/Zend/zend_hash.c:531
#3  0x00000000005a052a in destroy_zend_class (pce=<value optimized out>) at /usr/src/debug/php-5.3.3/Zend/zend_opcode.c:191
#4  0x00000000005b4835 in zend_hash_apply_deleter (ht=0x2437c00, p=0x2aca320) at /usr/src/debug/php-5.3.3/Zend/zend_hash.c:609
#5  0x00000000005b4939 in zend_hash_reverse_apply (ht=0x2437c00, apply_func=0x59b750 <clean_non_persistent_class>)
    at /usr/src/debug/php-5.3.3/Zend/zend_hash.c:758
#6  0x000000000059c45e in shutdown_executor () at /usr/src/debug/php-5.3.3/Zend/zend_execute_API.c:312
#7  0x00000000005a8c22 in zend_deactivate () at /usr/src/debug/php-5.3.3/Zend/zend.c:890
#8  0x0000000000556805 in php_request_shutdown (dummy=<value optimized out>) at /usr/src/debug/php-5.3.3/main/main.c:1634
#9  0x0000000000631214 in main (argc=4, argv=0x7fff232e2158) at /usr/src/debug/php-5.3.3/sapi/cli/php_cli.c:1373

(gdb) bt full
#0  zend_mm_remove_from_free_list (heap=<value optimized out>, mm_block=0x29fe8c8) at /usr/src/debug/php-5.3.3/Zend/zend_alloc.c:826
        rp = <value optimized out>
        cp = <value optimized out>
        prev = 0x2bf12b0
        next = 0x2bf12b0
#1  0x000000000058b3b5 in _zend_mm_free_int (heap=0x24372b0, p=0x29fe878) at /usr/src/debug/php-5.3.3/Zend/zend_alloc.c:2019
        mm_block = 0x29fe868
        next_block = 0x29fe8c8
        size = 96
#2  0x00000000005b4b91 in zend_hash_destroy (ht=0x4e4d1b0) at /usr/src/debug/php-5.3.3/Zend/zend_hash.c:531
        p = 0x4e49b98
        q = 0x29fe878
#3  0x00000000005a052a in destroy_zend_class (pce=<value optimized out>) at /usr/src/debug/php-5.3.3/Zend/zend_opcode.c:191
        ce = 0x4e4d180
#4  0x00000000005b4835 in zend_hash_apply_deleter (ht=0x2437c00, p=0x2aca320) at /usr/src/debug/php-5.3.3/Zend/zend_hash.c:609
        retval = <value optimized out>
#5  0x00000000005b4939 in zend_hash_reverse_apply (ht=0x2437c00, apply_func=0x59b750 <clean_non_persistent_class>)
    at /usr/src/debug/php-5.3.3/Zend/zend_hash.c:758
        result = 1
        p = 0x2aca400
        q = 0x2aca320
#6  0x000000000059c45e in shutdown_executor () at /usr/src/debug/php-5.3.3/Zend/zend_execute_API.c:312
        __orig_bailout = 0x0
        __bailout = {{__jmpbuf = {9618720, 4153135478262045439, 140733783621432, 0, 0, 140733783621432, -4153268429412787457, 4153135458132007679}, 
            __mask_was_saved = 0, __saved_mask = {__val = {44778240, 312, 5813072, 44033256, 81700376, 88, 5813072, 20040, 5813072, 9620224, 9617240, 
                9618536, 0, 0, 5928661, 9620224}}}}
#7  0x00000000005a8c22 in zend_deactivate () at /usr/src/debug/php-5.3.3/Zend/zend.c:890
No locals.
#8  0x0000000000556805 in php_request_shutdown (dummy=<value optimized out>) at /usr/src/debug/php-5.3.3/main/main.c:1634
        report_memleaks = 1 '\001'
#9  0x0000000000631214 in main (argc=4, argv=0x7fff232e2158) at /usr/src/debug/php-5.3.3/sapi/cli/php_cli.c:1373
        exit_status = 0
        c = <value optimized out>
---Type <return> to continue, or q <return> to quit---
        file_handle = {type = ZEND_HANDLE_MAPPED, filename = 0x7fff232e3f38 "/usr/share/nginx/html/Grab/index-console.php", opened_path = 0x0, handle = {
            fd = 40267816, fp = 0x2667028, stream = {handle = 0x2667028, isatty = 0, mmap = {len = 585, pos = 0, map = 0x7ff7457cf000, 
                buf = 0x7ff7457cf000 <Address 0x7ff7457cf000 out of bounds>, old_handle = 0x26908f0, old_closer = 0x5bd500 <zend_stream_stdio_closer>}, 
              reader = 0x5bdb10 <zend_stream_stdio_reader>, fsizer = 0x5bd5b0 <zend_stream_stdio_fsizer>, closer = 0x5bdaa0 <zend_stream_mmap_closer>}}, 
          free_filename = 0 '\000'}
        behavior = <value optimized out>
        reflection_what = <value optimized out>
        orig_optind = 1
        orig_optarg = 0x0
        arg_free = <value optimized out>
        arg_excp = <value optimized out>
        script_file = <value optimized out>
        interactive = <value optimized out>
        module_started = 1
        request_started = 1
        lineno = 1
        exec_direct = <value optimized out>
        exec_run = <value optimized out>
        exec_begin = <value optimized out>
        exec_end = <value optimized out>
        param_error = <value optimized out>
        hide_argv = <value optimized out>
        ini_entries_len = <value optimized out>


zend_mm_heap corrupted
-u isə scripti PHP debug-dan birbaşa alırıq

[root@linuxsrv2 ~]# gdb /usr/bin/php
.
.
(gdb) run /usr/share/nginx/html/Grab/index-console.php Test xxxxx
Starting program: /usr/bin/php /usr/share/nginx/html/Grab/index-console.php Test xxxxx
[Thread debugging using libthread_db enabled]
zend_mm_heap corrupted

Program exited with code 01.

Araşdırmalardan sonra, ortaya çıxdı ki, bu BUG PHP-nin garbage collector-undan irəli gəlir.
Test məqsədilə Garbage Collector-u söndürüb yoxlayaq./etc/php.ini faylına əlavə edirik:

[PHP]
zend.enable_gc = 0

Daha sonra nginx-ə restart veririk və bir daha yoxlayırıq:

(gdb) run /usr/share/nginx/html/Grab/index-console.php Test xxxxxx
Starting program: /usr/bin/php /usr/share/nginx/html/Grab/index-console.php Test xxxxx
[Thread debugging using libthread_db enabled]

Program exited normally.

Ümumiləşdirsək, qarşılaşdığımız BUG üçün workaround: Garbage Collector-u söndürməkdir.

Əgər Global yox məhz müəyyən script üçün söndürmək lazımdırsa o zaman script daxilinə qeyd etmək lazımdır:

ini_set('zend.enable_gc',0);

Təşəkkürlər.

Use Oracle 12c Preinstall RPM with CentOS 6.5

Oktyabr 13, 2014 Şərh yaz

Oracle-ın Linux üzərinə install-ı zamanı, bəzi pre-install addımlar atılmalıdır ki, burda yeni başlayanlara bəzən çətinlik yaradır.
Bu prosesi sadələşdirmək məqsədilə, Oracle 12cR1 üçün preinstall paketini təqdim edir.
Paketin adı: oracle-rdbms-server-12cR1-preinstall
Lakin bu paket yalnız, Oracle Public Yum Repo-da mövcuddur. Sözsüz ki, repo-ni aktivləşdirmək çox sadədir. Problem isə daha ciddidir, bu pre-install paketi dependency error verir (CentOS,Scientific Linux, Red Hat). Daha dəqiq desək Oracle Linux Kernel teleb edir(UEK).
Sınayaq:

Installing:
 oracle-rdbms-server-12cR1-preinstall    x86_64    1.0-8.el6                  /oracle-rdbms-server-12cR1-preinstall-1.0-8.el6.x86_64     37 k
Installing for dependencies:
 compat-libcap1                          x86_64    1.10-1                     base                                                       17 k
 compat-libstdc++-33                     x86_64    3.2.3-69.el6               base                                                      183 k
 kernel-uek                              x86_64    2.6.39-400.215.7.el6uek    ol6_UEK_latest                                             28 M
 kernel-uek-firmware                     noarch    2.6.39-400.215.7.el6uek    ol6_UEK_latest                                            3.7 M
 ksh                                     x86_64    20120801-10.el6_5.9        ol6_latest                                                757 k
 libaio-devel                            x86_64    0.3.107-10.el6             base                                                       13 k
 sysstat                                 x86_64    9.0.4-22.el6_5.1           ol6_latest                                                230 k

Bəli gördüyümüz kimi, kernel-uekkernel-uek-firmware
dependency tələb edir.
Sözsüz ki, 1 distro-da müxtəlif fərqli vendor-dan kernel olmamalıdır.
Nəticə etibarı ilə, biz bu pre-install RPM paketi CentOS-a qurmaq üçün, RPM-i yenidən rebuild etməli, bu əsnada isə UEK dependency-ni silməliyik.

Bütün addımlar aşağıdakı kimidir:

1. Install rpmbuild and related packages

[root@linuxsrv1 ~]#yum install rpm-build rpmdevtools

2. Bütün rebuild işlərini görmək üçün, tets user yaradaq

[root@linuxsrv1 ~]# useradd tester -p tester -m -s /bin/bash
[root@linuxsrv1 ~]# su - tester

3. Oracle pre-install source paketlərini əldə edirik

[tester@linuxsrv1 ~]$ wget http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackageSource/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
Saving to: “oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm”

100%[====================================================================================================>] 14,075      --.-K/s   in 0.06s   

2014-09-09 22:37:33 (241 KB/s) - “oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm” saved [14075/14075]

4. RPMTREE yaradırıq:

[tester@linuxsrv1 ~]$ rpmdev-setuptree
[tester@linuxsrv1 ~]$ ls -l
total 20
-rw-rw-r--. 1 tester tester 14075 Nov 21  2013 oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
drwxrwxr-x. 8 tester tester  4096 Sep  9 22:40 rpmbuild
[tester@linuxsrv1 rpmbuild]$ ls -l
total 24
drwxrwxr-x. 3 tester tester 4096 Sep  9 22:40 BUILD
drwxr-xr-x. 2 tester tester 4096 Sep  9 22:40 BUILDROOT
drwxrwxr-x. 3 tester tester 4096 Sep  9 22:40 RPMS
drwxrwxr-x. 2 tester tester 4096 Sep  9 22:38 SOURCES
drwxrwxr-x. 2 tester tester 4096 Sep  9 22:38 SPECS
drwxrwxr-x. 2 tester tester 4096 Sep  9 22:40 SRPMS

5. src.rpm paketini test user ilə install edirik:

[tester@linuxsrv1 ~]$ rpm -ivh oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
warning: oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
   1:oracle-rdbms-server-12c########################################### [100%]

6. Dependency hissəsində dəyişiklik edirik:

[tester@linuxsrv1 ~]$ nano rpmbuild/SPECS/oracle-rdbms-server-12cR1-preinstall.spec
#System requirement
Requires:procps module-init-tools ethtool initscripts
Requires:bc bind-utils nfs-utils util-linux-ng pam
Requires:xorg-x11-utils xorg-x11-xauth
#Requires:kernel-uek
Requires:smartmontools

7. Yeni SPEC fayldan RPM-i rebuild edirik:

[tester@linuxsrv1 rpmbuild]$ rpmbuild -ba SPECS/oracle-rdbms-server-12cR1-preinstall.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.iYRCvZ
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ echo RPM_BUILD_ROOT=/home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
RPM_BUILD_ROOT=/home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ cd /home/tester/rpmbuild/BUILD
+ rm -rf oracle-rdbms-server-12cR1-preinstall-1.0
+ /bin/tar -xf -
+ /usr/bin/gzip -dc /home/tester/rpmbuild/SOURCES/oracle-rdbms-server-12cR1-preinstall-1.0.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.kajs7z
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.yw8fMa
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ '[' /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64 '!=' / ']'
+ rm -rf /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
++ dirname /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ mkdir -p /home/tester/rpmbuild/BUILDROOT
+ mkdir /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/sysconfig/oracle-rdbms-server-12cR1-preinstall
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/usr/bin
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/rc.d/init.d
+ mkdir -p -m 755 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/security/limits.d
+ mkdir -p -m 700 /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/var/log/oracle-rdbms-server-12cR1-preinstall/results
+ install -m 700 oracle-rdbms-server-12cR1-preinstall-verify /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/sysconfig/oracle-rdbms-server-12cR1-preinstall
+ install -m 700 oracle-rdbms-server-12cR1-preinstall-verify /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/usr/bin
+ install -m 600 oracle-rdbms-server-12cR1-preinstall.param /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/sysconfig/oracle-rdbms-server-12cR1-preinstall
+ install -m 700 oracle-rdbms-server-12cR1-preinstall-firstboot /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/rc.d/init.d
+ touch /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/etc/security/limits.d/oracle-rdbms-server-12cR1-preinstall.conf
+ ln -f -s /etc/sysconfig/oracle-rdbms-server-12cR1-preinstall/oracle-rdbms-server-12cR1-preinstall-verify /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64/usr/bin/oracle-rdbms-server-12cR1-preinstall-verify
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/tester/rpmbuild/BUILD/oracle-rdbms-server-12cR1-preinstall-1.0
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
warning: File listed twice: /etc/sysconfig/oracle-rdbms-server-12cR1-preinstall/oracle-rdbms-server-12cR1-preinstall-verify
warning: File listed twice: /etc/sysconfig/oracle-rdbms-server-12cR1-preinstall/oracle-rdbms-server-12cR1-preinstall.param
Provides: config(oracle-rdbms-server-12cR1-preinstall) = 1.0-11.el6 oracle-rdbms-server-12cR1-preinstall = 1.0
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(VersionedDependencies) <= 3.0.3-1
Requires(pre): /bin/sh /etc/redhat-release
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Requires: /bin/bash
Processing files: oracle-rdbms-server-12cR1-preinstall-debuginfo-1.0-11.el6.x86_64
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
warning: Could not canonicalize hostname: linuxsrv1
Wrote: /home/tester/rpmbuild/SRPMS/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.src.rpm
Wrote: /home/tester/rpmbuild/RPMS/x86_64/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64.rpm
Wrote: /home/tester/rpmbuild/RPMS/x86_64/oracle-rdbms-server-12cR1-preinstall-debuginfo-1.0-11.el6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.7RHWGH
+ umask 022
+ cd /home/tester/rpmbuild/BUILD
+ cd oracle-rdbms-server-12cR1-preinstall-1.0
+ rm -rf /home/tester/rpmbuild/BUILDROOT/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64
+ exit 0

8. Yeni yaradılmış RPM paketi install edək:

[tester@linuxsrv1 ~]$ cd rpmbuild/RPMS/x86_64/
[tester@linuxsrv1 x86_64]$ ls -l
total 20
-rw-rw-r--. 1 tester tester 15220 Sep  9 22:40 oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64.rpm
-rw-rw-r--. 1 tester tester  3424 Sep  9 22:40 oracle-rdbms-server-12cR1-preinstall-debuginfo-1.0-11.el6.x86_64.rpm
[tester@linuxsrv1 x86_64]$ su -
Password: 
[root@linuxsrv1 ~]# yum localinstall /home/tester/rpmbuild/RPMS/x86_64/oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64.rpm
Dependencies Resolved

==============================================================================================================================================
 Package                                 Arch      Version                   Repository                                                  Size
==============================================================================================================================================
Installing:
 oracle-rdbms-server-12cR1-preinstall    x86_64    1.0-11.el6                /oracle-rdbms-server-12cR1-preinstall-1.0-11.el6.x86_64     38 k
Installing for dependencies:
 compat-libcap1                          x86_64    1.10-1                    base                                                        17 k
 compat-libstdc++-33                     x86_64    3.2.3-69.el6              base                                                       183 k
 ksh                                     x86_64    20120801-10.el6_5.9       updates                                                    757 k
 libaio-devel                            x86_64    0.3.107-10.el6            base                                                        13 k
 sysstat                                 x86_64    9.0.4-22.el6_5.1          updates                                                    230 k

9. Uğurla install edirik

Installed:
  oracle-rdbms-server-12cR1-preinstall.x86_64 0:1.0-11.el6                                                                                    

Dependency Installed:
  compat-libcap1.x86_64 0:1.10-1                compat-libstdc++-33.x86_64 0:3.2.3-69.el6          ksh.x86_64 0:20120801-10.el6_5.9         
  libaio-devel.x86_64 0:0.3.107-10.el6          sysstat.x86_64 0:9.0.4-22.el6_5.1                 

Complete!

10.Uğurlu installdan sonra görürük ki, əvvəllər manual olaraq etdiyimiz bütün addımlar indi avtomatik olaraq yerinə yetirilmişdir:

[root@linuxsrv1 ~]# cat /etc/group | grep oracle
dba:x:54322:oracle
[root@linuxsrv1 ~]# cat /etc/group | grep oinstall
oinstall:x:54321:

[root@linuxsrv1 ~]# cat /etc/sysctl.conf | grep oracle
# oracle-rdbms-server-12cR1-preinstall setting for fs.file-max is 6815744
# oracle-rdbms-server-12cR1-preinstall setting for kernel.sem is '250 32000 100 128'
# oracle-rdbms-server-12cR1-preinstall setting for kernel.shmmni is 4096
# oracle-rdbms-server-12cR1-preinstall setting for kernel.shmall is 1073741824 on x86_64
# oracle-rdbms-server-12cR1-preinstall setting for kernel.shmmax is 4398046511104 on x86_64
# oracle-rdbms-server-12cR1-preinstall setting for net.core.rmem_default is 262144
# oracle-rdbms-server-12cR1-preinstall setting for net.core.rmem_max is 4194304
# oracle-rdbms-server-12cR1-preinstall setting for net.core.wmem_default is 262144
# oracle-rdbms-server-12cR1-preinstall setting for net.core.wmem_max is 1048576
# oracle-rdbms-server-12cR1-preinstall setting for fs.aio-max-nr is 1048576
# oracle-rdbms-server-12cR1-preinstall setting for net.ipv4.ip_local_port_range is 9000 65500

Artıq hazırladığım paketi aşağıdakı linkdən yükləyə bilərsiniz:

12c Preinstall RPM for CentOS

Təşəkkürlər.

Use WireShark as non-root user

Avqust 29, 2014 Şərh yaz

Kiçik problem olsa da, mütləq qeyd etmək istədim bəlkə kimsə qarşılaşar nə vaxtsa.
WireShark install etdikdən sonra adi user ilə onu run etdikdə heç bir capture funksiyası işləməyəcək.
Root user-lə run etdikdə isə bunun təhlükəli olduğunu deyir.
Dolayısı ilə, biz regular user ilə bunu işlətməliyik.
Addımları eyni ilə yerinə yetirdikdə işləyəcək:

1.
sudo apt-get install libcap2-bin

2. 
sudo groupadd wireshark

3.
sudo usermod -a -G wireshark sh --(sh-ın yerinə sizin regular username-iniz olmalıdır)

4. 
sudo chmod 750 /usr/bin/dumpcap

5.
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

6. adi user-lə run etməzdən əvvəl log off və login olun:
wireshark

Bu qədər. artıq adi userlə analizlərə başlaya bilərsiniz.

Disk Encryption for Linux LUKS

Avqust 26, 2014 Şərh yaz

Bu yazıda VirtualBox-da qurulmuş CentOS 6.5-ə yeni disk-in (hard drive) əlavə olunması və onun encrypt olunmasından danışacıq.

Əgər siz CentOS-u install edəndə diqqət yetirmisinizsə, orada setup zamanı file system-in encrypt olunması opsiyası təklif olunur.

Təbii ki, daha sonra da bunu etmək olur, lakin bir şeyi yadda saxlamaq lazımdır ki, encrypt olunan zaman bütün data disk-dən silinir. Dolayısı ilə yeni drive-ı istifadəyə buraxmazdan əvvəl bunu etməniz məsləhətdir.

İlk öncə VirtualBox-da yeni hard drive-ın əlavə olunmasını kiçik bir video ilə göstərək:

Yuxarıda göstərilən şəkildə disk əlavə edildikdən sonra təbii ki, bu diski partition-lamaq lazımdır necə deyərlər.
Gəlin mövcud disklərə baxaq:

[root@linuxpamtest ~]# parted -l | grep /dev/sd
Disk /dev/sda: 53,7GB
Disk /dev/sdb: 8590MB
Disk /dev/sdc: 8590MB
Disk /dev/sdd: 8590MB
Error: /dev/sde: unrecognised disk label       

Bizim yeni əlavə etdiyimiz disk /dev/sde-dir.
Aşağıdakı qaydada partition yaradırıq:

[root@linuxpamtest ~]# parted /dev/sde
GNU Parted 2.1
Using /dev/sde
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Error: /dev/sde: unrecognised disk label                                  
(parted) mklabel gpt                                                      
(parted) mkpart
Partition name?  []? primary                                              
File system type?  [ext2]? ext4                                           
Start? 0                                                                  
End? 2GB                                                                  
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore                                                     
(parted) p                                                                
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sde: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      17,4kB  2000MB  2000MB               primary

Biz /dev/sde diski daxilində 2 GB həcmli /dev/sde1 partition-nunu yaratmış olduq.
Və indi Error: /dev/sde: unrecognised disk label erroru əvəzinə, artıq bizim diskimiz tanınır:

[root@linuxpamtest ~]# parted -l | grep /dev/sd
Disk /dev/sda: 53,7GB
Disk /dev/sdb: 8590MB
Disk /dev/sdc: 8590MB
Disk /dev/sdd: 8590MB
Disk /dev/sde: 8590MB

/dev/sde1 yaradıldıqdan sonra biz onu encrypt edə bilərik bu məqsədlə “Single User Mode”-a aşağıdakı qaydada keçirik:

[root@linuxpamtest ~]# telinit 1

telling_init

Daha sonra,
yenicə yaratdığımız partition-u random data ilə dolduraq. Bu vaxt ala bilər, səbrlə gözləmək lazımdır:

dd if=/dev/urandom of=/dev/sde1

dd_random

Daha sonra:

cryptsetup --verbose --verify-passphrase luksFormat /dev/sde1

cryptsetup_command_success

Yeni encrypt olunmuş device-ı açaq və ona yeni ad verək:

cryptsetup luksOpen /dev/sde1 crypted_data

luksOpen

Yoxlayaq:

verify_encrypted_part

Daha sonra da encrypt etdiyimiz disk-də file system yaradaq(EXT4):

mkfs.ext4 /dev/mapper/crypted_data

ext4_file_system

Bu andan etibarən biz öz encrypt olunmuş /dev/sde1 partition-umuzu mount edib istifadə edə bilərik. Lakin bundan əvvəl, /etc/crypttab faylına əlavə etməliyik:

crypted_data /dev/sde1 none

Faylı save edirik.
Daha sonra hər hansı bizə lazım olan yerdə bir qovluq yaradıb ora mount edirik:

mounted

Həmçinin /etc/fstab faylına da əlavələr edirik:

/dev/mapper/crypted_data /root/crypted_data ext4 defaults 1 2

Faylı save edirik.
SELinux ilə əlaqəli komanda:

/sbin/restorecon -v -R /root/crypted_data

selinux

Və ən sonda da sistemi reboot edirik. Müəyyən bir vaxtdan sonra, sizdən encrypt olunmuş path üçün parolu tələb edəcək. Təqribən aşağıdakına bənzər bir output olacaq:

password_protected

Bununla da mövzumuz bitmiş hesab olunur.
Təşəkkürlər.

Install MySQL from source with debugging option in Linux

İyul 21, 2014 Şərh yaz

Hörmətli oxucular, bugünkü mövzumuz aşkar edilmiş hər hansı problemi dərinləməsinə araşdırıb tapmaq və yaxud onu debug etməkdən ibarətdir.
Mövzuya biraz teoriya ilə başlamaqda fayda var.
İlk öncə MySQL üçün bəzi anlayişları irəli sürək:
1. MySQL Logging:
MySQL-də log-lamanın növləri aşağıdakılardır:

* General Log – bütün növ RDBMS fəaliyyətlərin hamısı (SQL-lərin hamısı) bu log faylında log-lanır. Production server-lərdə aktiv etmək məsləhət deyil. Səbəbi isə çox sadədir işlək database-də bu log həcmi qısa müddətdə bir neçə GB-yə çata bilər. General Log adətən 1-2 dəqiqəlik lazım olan aktivliyi scan etmək üçün istifadə olunur.

* Slow Quer Log – default olaraq 10 saniyədən daha çox işləyən sorğuların hamısı bu faylda log-lanır. Təbii ki, 10 saniyəni daha aşağı məsələn, 3 saniyə edib sizin database-inizdə 3 saniyədən çox işləyən, həmçinin index-siz çalışdırılan və.s sorğuları aşkarlaya bilərsiniz.

* Error Log – MySQL start olunandan bu yana baş vermiş bütün kritik dəyişikliklər və error-lar bu faylda qeyd olunur. Bizim üçün ən vacib məsələlərdən biri crash və yaxud BUG-la qarşılaşdıqda ilk edəcəyimiz iş bu fayla baxmaqdır. Çox böyük ehtimal ki, bu faylda stack trace qeyd olunub. Nümunə olaraq:

Thread pointer: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 0 thread_stack 0x40000
/usr/local/mysql/bin/mysqld(my_print_stacktrace+0x35)[0xab6ead]
/usr/local/mysql/bin/mysqld(handle_fatal_signal+0x404)[0x736ee0]
/lib64/libpthread.so.0[0x35df20f710]
/usr/local/mysql/bin/mysqld[0xd27e2e]
/usr/local/mysql/bin/mysqld[0xd1cc5e]
/usr/local/mysql/bin/mysqld[0xc5d5f6]
/usr/local/mysql/bin/mysqld[0xc5dca7]
/usr/local/mysql/bin/mysqld[0xc5e152]
/lib64/libpthread.so.0[0x35df2079d1]
/lib64/libc.so.6(clone+0x6d)[0x35deee8b5d]

Error Log-da verilən faydalı məlumata baxmayaraq, hər hansı BUG-ı report etdikdə MySQL(Oracle) -ın professional developer-lərinə (hansı ki MySQL-i onlar yazırlar) error-un məhz hansı kod faylının hansı funksiyasında baş verdiyi maraqlandırır. Səbəbi isə çox sadədir BUG-ı reproduce edə bilsinlər və də asanlıqla həmin kod hissəsində dəyişiklik edə bilsinlər. Bunun üçün isə sizdən Linux Admin-lərin çox gözəl bildiyi CORE DUMP tələb olunacaq.
Qeyd edək ki, core dump-ı yalnız və yalnız Debug aktivləşdirilmiş MySQL ilə generate edə biləcəksiniz. Debug mode heç bir halda hazır şəkildə, yüklənə bilən şəkildə (downloadable) saxlanılmır.
Burdan belə çıxır ki, biz MySQL-i source-dan özümüz yazmalı olacıq. CMAKE-ə isə DEBUG-ı aktiv etsin deyə, necə deyərlər bir əmr append edəcik.
Dependency-ləri install edirik:

[root@localhost ~]# yum groupinstall "Development Tools"
[root@localhost ~]# yum install cmake
[root@localhost ~]# yum install ncurses ncurses-devel
[root@localhost ~]# yum install wget

Daha sonra arxiv faylımızı download edirik:
mysql-5.6.19.tar.gz

Daha sonra da ardıclıllıqla:

1. [root@localhost ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.19.tar.gz
2. [root@localhost ~]# tar -xvf mysql-5.6.19.tar.gz
3. 
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -r -g mysql mysql
4. [root@localhost ~]# cd mysql-5.6.19
5. [root@localhost mysql-5.6.19]# cmake  -DWITH_DEBUG=1
6. [root@localhost mysql-5.6.19]# make
7. [root@localhost mysql-5.6.19]# make install

Install bitdikdən sonra:

8.  [root@localhost mysql-5.6.19]# cd /usr/local/mysql
9.  [root@localhost mysql]# chown -R mysql .
10. [root@localhost mysql]# chgrp -R mysql .
11. [root@localhost mysql]# scripts/mysql_install_db --user=mysql
2014-07-21 03:52:05 14280 [Note] InnoDB: Using atomics to ref count buffer pool pages
2014-07-21 03:52:05 7f6e8f793720 InnoDB: !!!!!!!! UNIV_DEBUG switched on !!!!!!!!!
2014-07-21 03:52:05 7f6e8f793720 InnoDB: !!!!!!!! UNIV_SYNC_DEBUG switched on !!!!!!!!!

Fərqliliyə diqqət yetirin.
Daha sonra:

12. [root@localhost mysql]# chown -R root .
13. [root@localhost mysql]# chown -R mysql data
14. [root@localhost mysql]# bin/mysqld_safe --user=mysql &
[root@localhost mysql]# bin/mysqld_safe --user=mysql &
[1] 14525
[root@localhost mysql]# 140721 03:55:41 mysqld_safe Logging to '/var/log/mysqld.log'.
140721 03:55:41 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

Gördüyünüz kimi artıq, debug MySQL start olundu və öz testlərinizə başlaya bilərsiniz.
Connect olduqda:

[root@localhost bin]# ./mysql -u root --socket=/usr/local/mysql/data/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.19-debug-log Source distribution

Server versiyasında fərqi dərhal görürük: 5.6.19-debug-log.

Deməli, biz artıq sizlərlə, DEBUG MySQL-i install etdik. İndi isə MySQL CORE DUMP-ın alınmasına baxacıq.
Bu məqsədlə biz, my.cnf (MySQL config faylı) faylında [mysqld] kataloqu altında yazırıq:
[mysqld]
core-file

Həmçinin faylın sonuna qeyd edirik:
[mysqld_safe]
core_file_size=unlimited

Bu şəkildə start olunmuş MySQL-də hər hansı crash baş verərsə aşağıdakına bənzər bir output görə bilərsiniz:

bin/mysqld_safe: line 166: 27247 Segmentation fault      (core dumped) 


(core dumped) –
yəni core file artıq yaradıldı.
Default olaraq core file-ı MySQL datadir-də yaradılır.

Sizlərlə MySQL-in source-dan debug option-la installına baxdıq. Həmçinin Core Dump-ın yaradılmasını da göstərdik.
Təşəkkürlər.

Copying Tablespaces to Another Server (Transportable Tablespaces)

May 17, 2014 2 şərh

Bugünkü mövzumuz MySQL 5.6 > versiyalar nəzərdə tutulub odur ki, test etməzdən əvvəl mütləq əmin olun ki, sizin MySQL versiyanlz müvafiqdir.
İndiki hald mən 5.6.17 versiya MySQL-i aşağıdakı opsiyalarla start etmişəm.
QEYD: Transportable Tablespaces-ə nail olmağınız üçün MySQL-i aşağıdakı dəyişənlərlə start etməlisiniz

[mysqld]
innodb_file_per_table          = 1
lower_case_table_names         = 1

Daha sonra test məqsədi ilə, bir kifayət qədər böyük cədvəl tapın.
Məndə artıq biri var təqribən 2.4 gb-dır.
O cədvəli rename edək:

[root@linuxsrv3 xxx]# ls -lthr
total 2,4G
-rw-rw----. 1 mysql mysql   65 2014-05-07 11:05 db.opt
-rw-rw----. 1 mysql mysql  20K 2014-05-12 12:07 test_table.frm
-rw-rw----. 1 mysql mysql 2,4G 2014-05-12 14:05 test_table.ibd

Cədvəlimizi test_table-dan test_table2-yə rename edək.:

[root@linuxsrv3 xxx]# time mysql -u root -p -e 'rename table xxx.test_table to xxx.test_table2'
Enter password: 

real	0m1.973s
user	0m0.002s
sys	0m0.004s

Bu cəmi 1.9 saniyə çəkdi.

Rename-in başqa istifadə yeri də var. Deyək ki, biz bir database-dən cədvəli digərinə move etmək istəyirik bu zaman cədvəlin backup-ını alıb, digər database-də import etməyə ehtiyac yoxdur, aşağıdakı şəkildə bunu edə bilərik:

[root@linuxsrv3 xxx]# time mysql -u root -p -e 'rename table xxx.test_table2 to test.test_table2'
Enter password: 

real	0m1.876s
user	0m0.005s
sys	0m0.003s

Və bizim cədvəlimiz artıq, test database-indədir:

[root@linuxsrv3 test]# ls -lthr
total 2,4G
-rw-rw----. 1 mysql mysql 8,4K 2014-05-12 11:32 ff.frm
-rw-rw----. 1 mysql mysql  96K 2014-05-12 11:33 ff.ibd
-rw-rw----. 1 mysql mysql   65 2014-05-12 11:34 db.opt
-rw-rw----. 1 mysql mysql  20K 2014-05-12 12:07 test_table2.frm
-rw-rw----. 1 mysql mysql 2,4G 2014-05-12 14:05 test_table2.ibd

Deməli gördüyünüz kimi, bir cədvəli bir database-dən digərinə move etməyin sürətli və asan yolunu göstərmiş olduq.
Lakin belə bir sual yaranır, bəs biz bir cədvəli digər server-dəki database-ə copy edə bilərik mi?
Transportable Tablespaces məhz burda bizim köməyimizə gəlir.
Bir daha xatırlatmaqda fayda var ki, buna nail olmanız üçün my.cnf faylında yazının əvvəlində göstərdiyim kimi, dəyişənləri qeyd edib, MySQL-i start etmək lazımdır.
Həmçinin, sizin remote server-də artıq eyni adlı database və eyni adlı (strukturlu) cədvəliniz olmalıdır.

Bizim serverlər aşağıdakılardır:

source server : linuxsrv3
Destination server : linuxsrv4

Destination server-də artıq eyni adlı database və cədvəlimiz var.

Destination server-də biz mövcud boş cədvəlimizin tablespace-ini discard edirik:

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> alter table test_table2 discard tablespace;
Query OK, 0 rows affected (0,05 sec)

Əgər yoxlasanız görərsiniz ki, .ibd faylı databse direktoriyamızda yoxdur.

[root@linuxsrv4 test]# ls
db.opt  test_table2.frm

Source serverimizdə:

mysql> use test;
Database changed
mysql> FLUSH TABLES test_table2 FOR EXPORT;
Query OK, 0 rows affected (0,00 sec)

.ibd faylını destination server-ə copy edirik:

[root@linuxsrv3 test]# scp test_table2.ibd root@192.168.1.88:/var/lib/mysql/test
root@192.168.1.88's password: 
test_table2.ibd                       100% 2444MB  15.4MB/s   02:39 

Source server-də:

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0,00 sec)

destination server-də:

[root@linuxsrv4 test]# ls
db.opt  test_table2.frm  test_table2.ibd

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> alter table test_table2 IMPORT TABLESPACE;
ERROR 1146 (42S02): Table 'test.test_table2' doesn't exist

Əgər bu error-u gördünüzsə demək ki, owner:

[root@linuxsrv4 test]# ls -l
total 2502684
-rw-rw----. 1 mysql mysql         65 2014-05-12 15:03 db.opt
-rw-rw----. 1 mysql mysql      20166 2014-05-12 15:05 test_table2.frm
-rw-r-----. 1 root  root  2562719744 2014-05-12 15:16 test_table2.ibd

Owner-i mysql user-ə dəyişək:

[root@linuxsrv4 test]# chown mysql:mysql test_table2.ibd
[root@linuxsrv4 test]# ls -l
total 2502684
-rw-rw----. 1 mysql mysql         65 2014-05-12 15:03 db.opt
-rw-rw----. 1 mysql mysql      20166 2014-05-12 15:05 test_table2.frm
-rw-r-----. 1 mysql mysql 2562719744 2014-05-12 15:16 test_table2.ibd

İndi isə bir daha sınayaq:

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

mysql> alter table test_table2 IMPORT TABLESPACE;
Query OK, 0 rows affected, 1 warning (2 min 29,38 sec)

And checking :

mysql> select idvisit from test_table2 order by idvisit desc limit 1;
+---------+
| idvisit |
+---------+
| 7016951 |
+---------+
1 row in set (0,04 sec)

Bununla da gördüyünüz kimi 2.4 gb-lik bizim cədvəl artıq başqa bir server-də eyni data-larla mövcuddur. Bu əməliyyat toplamda 2 dəqiqə çəkir.
Təşəkkürlər.

Error: database disk image is malformed in CentOS 6.5

[root@tester1 ~]# yum groupinstall "Desktop Platform"
.
.
Error: database disk image is malformed
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Belə bir error-u gördükdən sonra, aşağıdakı addımı etməklə həll etdim:

[root@tester1 ~]# yum clean dbcache
Loaded plugins: fastestmirror, refresh-packagekit, security
Cleaning repos: base extras updates
4 sqlite files removed

Təşəkkürlər.

Kateqoriyalar: Linux Etiketlər:
İzlə

Hər yeni yazı üçün e-poçt qutunuza göndəriş alın.

Digər 208 izləyiciyə qoşulun