Go! Bbuwoo: Tech/안녕리눅스 카테고리 글 목록https://my.oops.org/뭘 이런걸..2024-03-19T12:56:55+09:00Textcube 1.10.10 : Tempo primoIDC 점검으로 인한 안녕리눅스 업데이트 중단김정균https://my.oops.org/2022021-01-19T23:39:05+09:002021-01-19T23:39:05+09:00안녕 리눅스 업데이트 서버가 있는 IDC 의 전원 공사로 인하여 다음 기간 동안 홈페이지 운영및 yum repository 서버 운영이 중단 되어, yum update 가 이 기간 동안 불가능 하오니 업무에 참고 바랍니다.<br /><br />서비스 중지 : 2021.01.22 17:00<br /> 서비스 재개 : 2022.01.25 언젠가..<br /><br />서비스 재개는 IDC 사정에 따라 유동적일 수 있습니다.<br /><br />긴급 업데이트나, yum 사용이 필요할 경우에는, /etc/yum.repos.d/Annyung.repo 설정 파일에서 mirrorolist 항목을 baseurl 로 변경하여 긴급 사용할 수 있습니다.<br /><br />[AN:core]<br />baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/core/$basearch<br /><br />[AN:base]<br />baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/base/$basearch<br /><br />[AN:xless]<br />baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/xless/$basearch<br /><br />[AN:addon]<br />baseurl=http://ftp.kr.freebsd.org/pub/AnNyung/$annyungver/addon/$basearch<p><strong><a href="https://my.oops.org/202?commentInput=true#entry202WriteComment">댓글 쓰기</a></strong></p>안녕 리눅스 2.0 EOL 공지김정균https://my.oops.org/2002020-12-20T06:29:44+09:002020-12-20T06:29:44+09:00안녕 리눅스 2 EOL (End Of Life) 공지 입니다.<br /><br />안녕 리눅스 2의 모체인 CentOS 6 의 Life time 이 2020/11/30 종료가 되어, 안녕 리눅스 2도 같이 EOL 이 종료 됩니다.<br /><br />다만, 현재 제가 아직 운영 중인 CentOS 6 이 남아 있는지라, 이 서버가 유지될 때 까지 잠시 동안은 critical bug fix 는 지원될 수도 있을 것 같습니다. 아마 2021년 상반기 안으로 정리가 되지 않을까 싶습니다.<br /><br />현재, CentOS 6 이 mirror.centos.org 에서 제거 되고, valut.centos.org 로 이동이 되어, 안녕 리눅스 2에서 yum 이 동작하지 않습니다. 이 문제를 수정하기 위하여 다음의 명령을 수행해 주시면 됩니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@host ~]# rpm -Uhv http://mirror.oops.org/pub/AnNyung/2/core/x86_64/annyung-release-2.8-2.an2.noarch.rpm<br /></code></pre><br /><br />P.S.<br />안녕 리눅스 3은 Oracle linux 또는 Rocky linux 기반으로 될 지도 모르겠습니다. Rocky linux 기반일 경우에는 많이 지연될 수 있을 것 같습니다. (아직 출시가 되지 않아서 --;) 아직은 약간 관망 중입니다.<p><strong><a href="https://my.oops.org/200?commentInput=true#entry200WriteComment">댓글 쓰기</a></strong></p>AnNyung LInux 8 소식김정균https://my.oops.org/1992020-12-20T06:19:48+09:002020-06-13T02:47:48+09:00안녕 리눅스 2 에서 독자 노선을 포기하고 clone 배포본 base 로 잡기 시작하면서, 버전의 괴리가 커지는 것 같아 안녕 리눅스 4는 출시하지 않고 버전을 맞추어 8 로 릴리즈 할 예정 입니다.<br /><br />안녕 리눅스 3 작업 시에, systemd 에 대한 경험이 너무 없었고, RHEL 6에서 7로의 변화에서도 많은 부분을 놓쳐서 legacy 설정이나 init scritp 를 이용하고 있었는데, 안녕 8에서는 이런 부분을 좀 더 향상 시키기 위하여 RHEL 8 로 경험치를 좀 쌓고 있습니다. 그리고 RHEL 7에서 당한 것들을 보아 8.3 또는 8.4 를 base 로 안녕 8을 생각하고 있었으나, RHEL 6의 EOL 이 2020.11.30 로 다가오면서, 안녕 2의 EOL 역시 같이 종료를 되므로, 이 시점에 맞추어 8.2 또는 8.3 으로 release 를 해 보려고 합니다. 물론 CentOS 가 RHEL 보다 1~2달 정도 늦게 나오므로, 아마 실제 출시는 CentOS 8.3 에 맞춰지지 않을까 예상은 합니다만, 안녕 2의 EOL 때문에 일단은 2020.11.30 을 목표로 (아마 이 시점이면 8.2 base 가 될 수도 있을 겁니다.) 진행은 하고 있으며, 늦어지면 CentOS 8.3 출시에 맞춰서 진행될 것으로 보입니다.<br /><br />출시 고지는 <a href="http://annyung.oops.org/?m=data&p=roadmap">http://annyung.oops.org/?m=data&p=roadmap</a> 의 [ 8 ] 섹션에 출시 날자가 업데이트 될 예정이니 참고 하시기 바랍니다.<p><strong><a href="https://my.oops.org/199?commentInput=true#entry199WriteComment">댓글 쓰기</a></strong></p>TLS 1.3 지원김정균https://my.oops.org/1942020-12-20T06:19:22+09:002019-06-02T23:43:15+09:00TLS 1.3 지원을 하려면 openssl 1.1 이상이 필요 합니다.<br />현재 CentOS 7 이나 안녕 3 에서는 지원이 안된다는 얘기죠. 물론 openssl 1.1 을 별도 위치에 설치해 놓고 link를 하는 방법은 가능 합니다. 단순히 배포본 기본 패키지로 지원을 하지 않는 다는 것을 언급 하는 것입니다.<br /><br />일단, 안녕 3에 TLS 1.3 지원을 위하여 openssl 1.1 관련 compat 패키지들을 등록해 놓았습니다. 조만간 SSL을 사용하는 패키지들을 모두 openssl 1.1 로 link를 변경하여 안녕 3에서 지원이 가능하게 할 예정 입니다.<br /><br />작업을 마치면, CentOS 7 에서 이 패키지들을 사용할 수 있는 방법도 올려 보도록 하겠습니다.<p><strong><a href="https://my.oops.org/194?commentInput=true#entry194WriteComment">댓글 쓰기</a></strong></p>Apache mod_md김정균https://my.oops.org/1882018-04-11T00:32:17+09:002018-04-11T00:07:11+09:00Apache 2.4.33 에 experimental 로 <strong>mod_md</strong> 라는 새로운 모듈이 추가가 되었습니다. (실제로는 2.4.30 에 추가가 되었으나, 2.4.30 이 release 되지 않고 2.4.33으로 relelase 가 되었습니다.)<br /><br /><strong>ACME protocol</strong> 을 이용하여 인증서 자동 관리를 해 주는 모듈이라고 보면 됩니다. 일단은 현재 ACME protocol을 지원하는 곳이 Let's encrypt 밖에 없으므로, <strong><span style="text-decoration: underline; color: #808080;">Let's encrypt 인증서 전용</span></strong>이라고 할 수 있습니다.<br /><br />mod_md 모듈을 이용하면 아주 쉽게 인증서 설정 및 관리를 할 수가 있습니다. (인증서 발급 같은 것도 신경쓸 필요가 없습니다.)<br /><br />일단 간단하게 예를 들자면<br /><br /><pre class="prettyprint APACHE" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code><VirtaulHost *:80><br /> ServerName oops.org<br /> ServerAlias www.oops.org<br /></VirtaulHost><br /></code></pre><br /><br />이런 가상 호스트를 SSL 서비스를 하기 위하여 다음의 설정으로 간단히 가능해 집니다.<br /><br /><pre class="prettyprint APACHE" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code><IfModule md_module><br />MDomain oops.org<br />MDCertificateAgreement https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf<br /><br /><VirtaulHost *:443><br /> ServerName oops.org<br /> ServerAlias www.oops.org<br /> SSLEngine On<br /></VirtaulHost><br /></IfModule><br /></code></pre><br /><br />이렇게 설정 한 후에 Apache 를 시작을 하면, oops.org 에 대한 인증서 발급을 시작 합니다. tail 명령으로 error_log 를 보고 있으면, 재시작 후 5~10초 정도가 지나면 다음과 같은 로그가 출력이 됩니다.<br /><br /><pre class="prettyprint BASH" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@host ~]# tail -f /var/log/httpd/error_log<br />[Tue Apr 10 23:53:51.043029 2018] [md:notice] [pid 88797] AH10059: The Managed Domain oops.org has been setup and changes will be activated on next (graceful) server restart.<br /></code></pre><br /><br />이 로그가 출력이 되면 apache 를 다시 한번 재시작 해 주면 인증서가 자동 생성이 된 것을 확인할 수 있습니다. 더군다나, <a href="https://github.com/icing/mod_md/wiki/Directives#mdrenewwindow--when-to-renew">MDRenewWindow</a> 를이용하면 자동 갱신도 가능하면, ServerAlias 의 도메인들은 SubjectAltName 으로 자동으로 등록이 됩니다. 즉, 도메인 발급 갱신에 대해서 신경을 꺼도 된다는 의미가 됩니다.<br /><br />인증서는 SERVER_ROOT/md 에 저장이 되며, 이 위치는 <a href="https://httpd.apache.org/docs/trunk/mod/mod_md.html#mdstoredir">MDStoreDir</a> 지시자로 변경할 수 있습니다.<br /><br />현재는 apache module 만 지원이 되는 듯 하며 조만간 nginx 도 지원을 하지 않을까 싶습니다.<br /><br />mod_md에 대한 자세한 사항은 <a href="https://httpd.apache.org/docs/trunk/mod/mod_md.html">https://httpd.apache.org/docs/trunk/mod/mod_md.html</a> 를 참조 하십시오.<br /><br />안녕 리눅스 3에서는, httpd 2.4.33 부터 mod_md package 를 설치하여 사용이 가능 합니다.<br /><br />빌드 시의 참고 사항으로는, 다음의 조건이 있습니다.<br /><br />apr >= 1.5.2<br />libcurl > 7.50<br />brotli<br /><br />안녕 리눅스에서는 apr 1.5.2 의 apr_escape call 을 back porting 하여 지원하였으며, brotli 는 설치 하지 않았음에도 잘 동작하는 것으로 보아 mod_md 와는 직접적인 연관이 없는 것으로 보입니다. 그리고, libcurl 도 mod_md 의 config2.m4 를 수정하여 CentOS 7의 libcurl 7.29 를 이용하여 빌드 하였으며, 아직까지는 문제점이 보이지는 않고 있습니다. 즉, apr 만 해결하면 CentOS 7에서 빌드는 그리 어려운 편은 아닙니다.<br /><br />P.S.<br />mod_md는 mod_watchdog 모듈에 의존성이 있습니다. mod_watchdog 모듈을 mod_md 보다 먼저 load 해 주어야 합니다.<p><strong><a href="https://my.oops.org/188?commentInput=true#entry188WriteComment">댓글 쓰기</a></strong></p>안녕 리눅스 3.2 준비김정균https://my.oops.org/1852017-08-21T00:03:07+09:002017-08-21T00:03:07+09:002017년 08월 01일에 RHEL 7.4가 release 가 되었습니다. RHEL 7.4에 대응하는 안녕 리눅스 버전은 3.2 <a href="https://ko.wiktionary.org/wiki/aang">Aang</a> 입니다.<br /><br />RHEL 7.4는 binary level의 package를 배포하지 않고, 또한 안녕 리눅스는 RHEL이 아니라 CentOS 를 기반으로 릴리즈를 하기 때문에, CentOS 7.4 가 release 되어야 안녕 리눅스도 이에 맞춰 3.2가 출시 되게 됩니다.<br /><br />일단, CentOS 7.4 는 <a href="https://seven.centos.org/2017/08/centos-linux-7-1708-based-on-rhel-7-4-source-code/">블로그</a>상에 의하면 8/22 ~ 9/12 사이에 출시를 하게 될 것이라고 언급 하고 있습니다. 그래서 안녕 리눅스 역시 CentOS 7.4가 출시되면 바로 출시가 가능 하도록 준비를 하고 있습니다.<br /><br />안녕 리눅스 3.2 릴리즈를 위해서는 대략 25개의 package가 준비가 되어야 하며, 현재 10개의 패키지가 준비가 되었으며, binary 의존성이 없는 6개의 패키지는 이미 선 배포가 되고 있습니다.<br /><br />CentOS 7.4 릴리즈 전에 대부분의 패키지는 선반영이 될 예정이며, CentOS 7.4의 bianry package 버전 의존성이 있는 (systemd 등 일부 패키지) 패키지들과 annyung-release 패키지는 CentOS 7.4가 릴리즈 된 이후 바로 배포가 될 예정입니다. (packaging은 CentOS 7.4 release 이전에 완료될 예정입니다.)<p><strong><a href="https://my.oops.org/185?commentInput=true#entry185WriteComment">댓글 쓰기</a></strong></p>안녕 리눅스 2 RPM-GPG-KEY 변경 공지김정균https://my.oops.org/1772018-01-10T00:22:20+09:002017-01-22T20:11:25+09:00안녕 리눅스 2.x 의 RPM-GPG-KEY 변경 공지 입니다.<br /><br />혹시 <strong>YUM</strong>으로 <strong>/etc/yum.repos.d/AnNyung.repo</strong> 에 등록되어 있는 패키지 업데이트가 되지 않은 경우에는, 다음 사항을 참고 하여 조치를 하십시오.<br /><br />
<ol>
<li><strong>대상</strong><br /><br />안녕 리눅스 2 x86_64, i686<br /><br /></li>
<li><strong>증상</strong><br /><br />/etc/yum.repos.d/AnNyung.repo 에 등록된 repository의 <ins>패키지 업데이트가 되지 않는 증상</ins>이 발생할 수 있음<br /><br /></li>
<li><strong>원인</strong><br /><br />2017.01.16 OOPS.org 서버 이전 중 서버 노후화에 의한 HDD, memory 손상. 특히 HDD 파손으로 인하여 RAID 10이 깨져서 데이터 복구 불가능하여, 안녕 리눅스 2의 패키지 빌드 private key를 손실 하여, 새로운 키를 생성해서 모든 패키지를 resign 함.<br /><br /></li>
<li><strong>해결책</strong><br /><br />업데이트가 되지 않을 경우에는, <span style="color: #d41a01;"><strong><ins>수동으로 annyung-release package 업데이트</ins></strong></span>를 해야 함. 기존의 패키지들을 신규 생성한 private key로 다시 sign 을 하였기 때문에 예전의 공개키로는 verify 를 할 수 없습니다. 그러므로 공개키를 갱신시키기 위하여, 공개키를 포함하고 있는 annyung-release package를 수동으로 재설치 해 주어야 합니다.<br /><br /><pre class="prettyprint Bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@host ~]$ rpm -Uhv --force http://mirror.oops.org/pub/AnNyung/2/inst/annyung-release.rpm</code></pre><br /><br />깨끗이 정리를 위해서는 분실된 이전 공개키를 제거해 주십시오.<br /><br /><pre class="prettyprint Bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@host ~]$ rpm -e gpg-pubkey-0eff2026-4eedfee5</code></pre></li>
</ol>
<br />OOPS.org 서버는 Xen server 6.5에 4개의 VM (oops.org, an1.pkg.oops.org, an2.pkg.oops.org, an2.x86.pkg.oops.org)으로 구성이 되어 있습니다. 이번 사건은 RAID를 너무 맹신했던 것이 가장 큰 문제였으며, 2번째로는 장비의 노후화 및 서버 부품 조달 비용에 대한 문제가 있었습니다.<br /><br />RAID 복구 시에 깨끗하지 못한 여분 하드를 사용한 것이 RAID가 깨진 가장 큰 원인이었으며, 여분 하드 역시 다른 RAID 정보를 가지고 있어 발생한 문제 입니다. 더군다나 RAID 10을 맹신하여, VM 2대에 key가 분산이 되어 있어 외부 백업을 하지 않은 것이 가장 큰 원인 입니다.<br /><br /><br /><p><strong><a href="https://my.oops.org/177?commentInput=true#entry177WriteComment">댓글 쓰기</a></strong></p>2016년 12월 31일 윤초 대응김정균https://my.oops.org/1752016-12-31T01:06:55+09:002016-12-28T23:41:00+09:00<span style="font-size: 0.938em;">2016년 12월 31일 24:00 에 </span><ins style="font-size: 0.938em;"><font color="#d41a01">윤초가 추가될 예정</font></ins><span style="font-size: 0.938em;">입니다. (UTC 기준이니 우리나라 기준으로는 2017년 1월 1일 9시가 8시 59분 60초가 되겠네요.)</span><br><br>윤초에 대해서는 2012년에 요란을 떨 정도로 큰 장애(LinkedIn, Reddit 등의 Java로 운영을 하는 시스템들의 장애)가 있었습니다.<br><br>가장 마지막 윤초는 2015년 6월 30일에 있었으며, 2012년 사건 이후로 OS level과 time server들이 잘 대응을 해서 별 문제 없이 넘어간 듯 싶습니다.<br><br>그리고, 2016년 12월 31일에 또 윤초가 추가되게 됩니다.<br><br>여기서 논할 것은, 2012년의 문제가 잘 해결이 되어 있더라도, 또 다른 버그로 인하여 이 문제가 발생하는 것을 원천적으로 제거하는 방법에 대해서 논합니다. 물론 이론적인 것들은 인터넷 상에서 잘 논한것들이 있으니 여기서 다루지는 않습니다. 여기서는 이 이론들을 실무에 어떻게 적용을 하느냐 입니다.<br><br>윤초에 영향을 받는 서비스가 없거나 <font color="#177fcd"><strong><ins>윤초 따윈 안중에 없어..</ins></strong></font> 하시는 분들은 사뿐이 브라우져를 즈려 밟으시고 무시하시면 되겠습니다.<br><br>2012년 사태 이후로, Google에서 1초를 그냥 확 추가하는 것이 아니라 대략 20여시간에 걸쳐서 1초를 추가하는 <a href="https://googleblog.blogspot.kr/2011/09/time-technology-and-leaping-seconds.html">Leap Smear</a> 를 적용한 <a href="https://developers.google.com/time/" target="_blank">public NTP</a>를 제공 합니다.<br><br>이 글에서는 <ins>Leaf Smear를 NTP와 chrony에 어떻게 적용</ins>을 해서 운영을 할 수 있는지에 대하여 기술 합니다.<br><br>일단, 별도로 Time server를 운영하지 않는다면, <a href="https://developers.google.com/time/" target="_blank"><strong><font color="#008000">Goolge Public NTP</font></strong></a>를 사용하는 것을 고려하십시오. (물론 <span style="font-size: 0.938em;"><strong><ins>난 윤초랑 관련이 없어</ins></strong> </span>하시는 분들은 그냥 사뿐이 무시 하시면 됩니다.)<br><br>제가 ubuntu machine의 경우에는 다양한 버전이 없어서, CentOS/RHEL 을 기준으로 설명 합니다.<br><br><ol><li>CentOS / RHEL 4 or 5<br>CetnOS 5 이하처럼 <strong><del>EOL이 종료된 배포본</del></strong>의 경우에는 문제를 해결할 수 있는 방법은 <a href="https://developers.google.com/time/" target="_blank" style="font-size: 15.008px;"><strong><font color="#008000">Goolge Public NTP</font></strong></a> 처럼 leap smear를 제공하는 time server를 이용하여 시간 동기화를 하는 방법 밖에는 없습니다.<br>.</li><li>time server에 시간 동기화를 하지 않는 경우<br>time 동기화를 하지 않는 경우에는, <strong>tzdata</strong> package를 최신으로 갱신해 주어야 합니다. yum을 이용하여 <strong>tzdata</strong> 를 최신 상태로 업데이트를 하는 것으로 해결이 됩니다.<br>.</li><li>ntp 또는 chrony를 이용하여 외부 time 서버에 동기화 하는 방법</li><ol><li><a href="https://developers.google.com/time/" target="_blank" style="font-size: 15.008px;"><strong><font color="#008000">Goolge Public NTP</font></strong></a>로 동기화 대상을 변경</li><li>또는 leap smear를 제공하는 time server로 동기화 대상 변경.</li><li>또는 아래의 방법(4,5번)을 이용하여 ntpd 또는 chrony로 time server를 구성하여 동기화.</li><li>또는 각 서버에 4,5번의 설정을 반영<br>.</li></ol><li>ntpd를 이용하여 time server 운영 시<br>ntpd를 구동할 때 command line option으로 -x 옵션을 주어 구동을 합니다. RHEL 6.6 이하의 ntp에서는 ***-x*** 옵션이 정상적으로 동작하지 않는 버그가 있습니다. <ins>NTP를 최신으로 업데이트 해 주십시오</ins>.<br><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@host ~]$ yum update ntp<br>[root@host ~]$ service ntpd stop<br>[root@host ~]$ ntptime -s 0 -f 0<br>[root@host ~]$ # ntpd의 OPTIONS 변수에 -x 를 추가해 줍니다.<br>[root@host ~]$ cat /etc/sysconfig/ntpd<br># Drop root to id 'ntp:ntp' by default.<br>OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid -g"<br>[root@host ~]$ service ntpd restart</code></pre></li><li>chronyd를 이용하여 time server 운영 시<br>chorny를 최신 버전으로 업데이트 합니다. 다음 옵션은 chrony >= 2.0 의 조건에서 사용이 가능 합니다. RHEL 7.0 에는 chrony 1.3이 포함이 되어 있습니다. <ins>yum 으로 chrony를 최신으로 업데이트</ins> 해 주십시오. 업데이트 이후, 다음의 설정을 chrony.conf에 추가 한 다음, chrony를 재시작 합니다.<br><pre class="prettyprint conf" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code># slew mode for leap second<br>leapsecmode slew<br>maxslewrate 1000<br>smoothtime 400 0.001 leaponly</code></pre></li></ol><br><strong>Reference:</strong><br><ol><li><a href="https://srad.jp/~marusa/journal/608570/" target="_blank">https://srad.jp/~marusa/journal/608570/</a></li><li><a href="https://srad.jp/~marusa/journal/593599/" target="_blank">https://srad.jp/~marusa/journal/593599/</a></li><li><a href="http://www.criticalworld.co.kr/?p=281" target="_blank">http://www.criticalworld.co.kr/?p=281</a></li></ol><p><strong><a href="https://my.oops.org/175?commentInput=true#entry175WriteComment">댓글 쓰기</a></strong></p>VIM에서 tab과 공백문자 구분하기김정균https://my.oops.org/1742016-12-24T01:54:42+09:002016-12-23T21:26:28+09:00협업 프로젝트시에 여려명이서 코드를 같이 생성하다 보면 각자의 코딩 스타일 때문에 코드가 난장판이 되는 문제가 있습니다. 이 문제 때문에 대부분의 프로젝트들은 각각의 코딩 규칙을 생성하여 사용 합니다.<br><br>여기서는 이 <font color="#d41a01"><strong>난장</strong></font> 중에서 <emns>tab과 space가 섞여서 있는 경우에 대한 체크를 위한 팁을 작성해 봅니다. 특히 이 경우는 <strong>Python</strong>의 <strong><em>indent</em></strong>에서 가장 큰 특징으로 나타납니다.<br><br>일단, 구분을 하기 위해서는 <strong><emns>vim의 syntax</emns></strong> 를 이용합니다. <strong>python</strong> 파일을 예로 들겠습니다.<br><br>먼저, python에 적용될 syntax 파일을 생성합니다.<br><br><pre class="prettyprint Bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[oops@an3 ~]$ # vim syntax directory를 생성 합니다.<br>[oops@an3 ~]$ mkdir -p ~/.vim/syntax<br>[oops@an3 ~]$ # tab의 바탕색을 푸른색으로 하는 syntax color를 설정 합니다.<br>[oops@an3 ~]$ cat <<EOF > ~/.vim/syntax/python.vim<br>syn match Tab "\t"<br>hi def Tab guifg=blue ctermbg=blue<br>EOF<br>[oops@an3 ~]$ <span style="font-size: 0.938em;"></code></pre></span><br><span style="font-size: 14.0775px;">위와 같이 작업을 한 후에, python file을 vim으로 열면 <ins style="background-color: rgb(23, 127, 205);"><font color="#ffffff">tab이 푸른색 바탕으로 보이게 됩니다</font></ins>. space와 tab이 섞여 있을 경우 쉽게 구분이 되어지게 됩니다.</span><br><br><span style="font-size: 14.0775px;">여기까지는 인터넷에서 검색만 잘하면 찾을 수 있는 내용입니다. <ins>그럼 이 글을 포스팅 하는 이유는 다음과 같습니다</ins>.</span><br><br><span style="font-size: 14.0775px;">제가 사용하다 보니, 일단 언어마다 syntax 파일을 생성해 줘야 하는 불편함과, 항상 이렇게 보고 싶지 않다는 점 입니다. 즉, 필요할 때만 구분을 하고 싶은데, 위의 팁은 vim 설정 파일을 변경하면서 사용을 해야 한다는 것이죠. 그래서 이 불편함들을 해결하기 위하여, 이 기능을 vim function으로 만들고 특정 키에 bind 해서 사용하도록 합니다. (물론 안녕 리눅스의 VIM package에 포함될 기능 입니다.)</span><br><br><span style="font-size: 14.0775px;">여기서 부터의 내용은, 위의 내용을 싹 잊어 버리시면 됩니다. (일단 위의 내용을 적용했다면, 싹 원복 하라는 의미입니다.) </span><span style="font-size: 14.0775px;">일단, <a href="https://github.com/AnNyung/VIM_plugins/" target="_blank">AnNyung LInux VIM plugin project site</a>에서 <a href="https://raw.githubusercontent.com/AnNyung/VIM_plugins/master/TabDistinct/tabdistinct.vim" target="_blank"><strong><font color="#008000">TabDistinct plugin</font></strong></a>을 다운로드 받습니다.</span><br><br><span style="font-size: 14.0775px;"><pre class="prettyprint Bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[oops@an3 ~]$ curl -o tabdistinct.vim \</span><br><span style="font-size: 14.0775px;">https://raw.githubusercontent.com/AnNyung/VIM_plugins/master/TabDistinct/tabdistinct.vim</span><br><span style="font-size: 14.0775px;">[oops@an3 ~]$<br></code></pre></span><br><span style="font-size: 14.0775px;">다운로드 받은 tabdistinct.vim 을 root 권한이 있을 경우에는 <strong><em>$VIM/vimfiles/plugin</em></strong><em><em> 디렉토리에 저장을 하고, root권한이 없을 경우에는 <strong><em>~/.vim/plugin</em></strong> 에 저장을 합니다. <ins>아래의 예는 일반 계정의 예</ins> 입니다.</em></em></span><em><br><br><pre class="prettyprint Bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[oops@an3 ~]$ # vim plugin directory를 생성 합니다.<br>[oops@an3 ~]$ mkdir -p ~/.vim/plugin<br>[oops@an3 ~]$ mv tabdistinct.vim ~/.vim/plugin/<br>[oops@an3 ~]$<br></code></pre><br><span style="font-size: 14.0775px;">이 작업을 마친 후에, 아무 파일이나 열어서 command mode에서 <strong style="font-style: italic;"><em>언더바(_)</em></strong><span style="font-style: normal;">키('shift' + '-')를 누르시면 of/off toggle이 가능해 집니다.</span></span></em></emns><br><emns><span style="font-size: 14.0775px;"><br></span></emns><span style="font-size: 14.0775px;">자세한 사항은 https://github.com/AnNyung/VIM_plugins/tree/master/TabDistinct 를 참고 하세요</span><p><strong><a href="https://my.oops.org/174?commentInput=true#entry174WriteComment">댓글 쓰기</a></strong></p>PHP VM type 변경 및 realpath_cache_force 기능김정균https://my.oops.org/1732016-12-24T00:08:38+09:002016-12-14T02:29:00+09:00이번에는 PHP 성능을 높일 수 있는 방법 2가지에 대해서 기술해 봅니다. 아래의 내용은 안녕 리눅스의 PHP package를 빌드할 때 성능을 높이기 위하여 한 작업을 기술 하는 것입니다.<br><br><strong>먼저 PHP VM type을 변경하여 성능을 높이는 방법에 대해서 알아 보겠습니다.</strong><br>
<br>PHP 5 까지 configure 옵션에 보면 --with-zend-vm 이라는 옵션이 있습니다. (7.0 부터는 없어졌습니다.) configure --help를 해 보면 아래 와 같이 설명이 나옵니다.
<br><br><pre class="prettyprint " style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>Zend: <br> --with-zend-vm=TYPE Set virtual machine dispatch method. Type is <br> one of "CALL", "SWITCH" or "GOTO" TYPE=CALL </code></pre>
<br><br>즉, zend vm type에는 "<strong>CALL</strong>", "<strong>SWITCH</strong>", "<strong>GOTO</strong>" 모드가 있고, 기본값은 "<strong>CALL</strong>" 이라는 내용입니다. 그리고 이 옵션으로 zend vm type을 변경할 수 있다고 되어 있습니다.
<br>
<br>하지만, <del>실제로 configure 시에 이 옵션은 동작하지 않습니다</del>. 그래서 <a href="https://marc.info/?l=php-cvs&m=142649712628949&w=2" target="_blank">7.0 부터는 제거</a>가 되었습니다.<br><div>configure 얘기를 한 이유는, 검색을 하다 보면, 이 옵션을 이용하여 VM type을 변경할 수 있다는 글들이 나오기 때문입니다. configure 옵션으로는 VM type 변경이 되지 않기 때문에 언급을 한 것입니다. 7.0 부터 제거가 되었다는 것은 configure 옵션이 실제 동작을 하지 않기 때문에 제거가 되었다는 의미이지 7.0에서는 여기서 설명하는 것이 적용이 안된다는 의미가 아닙니다. 7.0 이후에서도 동일하게 성능을 높일 수 있습니다.<br>
<br>그럼, zend vm type이 뭔지, 그리고 어떻게 하면 변경할 수 있는지에 대해서 설명을 합니다. (빌드 후에 변경은 불가하고, 빌드 시에 선택을 해야 합니다.)
<br>
<br>일단, zend vm에 대한 기본 내용은
<br>
<br>https://github.com/php/php-src/blob/master/Zend/README.ZEND_VM
<br>
<br>에서 확인하실 수 있습니다. 간략하게 설명을 하면, opcode optimize 방법이라고 보시면 됩니다. (설명 파일에는 executor 방법이라고 나오는데, 표현하기 쉽게 최적화라고 했습니다.) 일단 성능은 다음과 같습니다.
<br>
<br><div style="text-align: center;"><b style="font-size: 0.938em;">GOTO</b><span style="font-size: 0.938em;"> > </span><b style="font-size: 0.938em;">SWITCH</b><span style="font-size: 0.938em;"> > </span><b style="font-size: 0.938em;">CALL </b></div>
<br>일단, <strong>GOTO</strong>를 기준으로 하면, php source code 안에 있는 <strong>bench.php</strong>를 기준으로 <strong>CALL</strong>보다 <ins><font color="#0000ff">20% 정도의 성능 향상</font></ins>이 이루어 집니다.
<br>
<br>그러면 왜 기본값이 <strong>GOTO</strong>가 아니라 가장 성능이 안 좋은 <strong>CALL</strong>이냐.. 에 대한 건 저도 아직 제대로 된 설명을 못 찾았습니다. (어쩌면 영어 자료만 있어서 그럴 수도 있습니다. ^^;)
<br>
<br>다만, 빌드시에 <strong>GOTO</strong>의 경우에는 memory가 아주 많이 필요하며, 빌드 시간이 <strong>CALL</strong>로 빌드하는 것 보다 3~4배 정도가 더 걸립니다. build machine 성능에 따라 차이가 더 커질수도 있습니다. (특정 아키텍쳐나 compiler에 따라 case by case로 발생 합니다.) RHEL 5의 i686 시스템에서 php 5.2를 GOTO로 빌드 할 때 memory가 12G 정도를 잡아 먹어서, mameory가 모잘라 swap을 늘려서 빌드 했던 적도 있습니다. 이건 case by case이기 때문에 꼭 나타나는 증상이라고 할 수는 없지만 CALL로 빌드할 때 보다는 많은 메모리가 필요 합니다.
<br>
<br>일단, 빌드 방법은 다음과 같습니다. ./configure를 실행하기 전에 php-src/Zend 디렉토리에서 다음의 명령을 실행합니다.
<br>
<br><pre class="prettyprint Bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@an3 php-7.1.0]$ cd Zend<br>[root@an3 Zend]$ php zend_vm_gen.php --with-vm-kind=GOTO<br>[root@an3 Zend]$ cd ..<br>[root@an3 php-7.1.0]$ ./configure --with-옵션....<br>[root@an3 php-7.1.0]$ make -j 8 && make install<span style="font-size: 0.938em;"></code></pre></span><span style="font-size: 0.938em;"> </span><div><div><div><span style="font-size: 14.0775px;"><br></span>이 명령을 실행하면, <ins><font color="#0000ff">zend_vm_execute.h 와 zend_vm_opcodes.h 파일이 새로 생성</font></ins>이 됩니다.<br><br><blockquote><strong><font size="2">참고:</font></strong><br><span style="font-size: small;">5.6 에서는 GOTO로 이 파일들을 생성하면, 빌드시에 syntax error가 발생하는 버그가 있습니다. 5.6에서는 zend_vm_execute.h에서 "constant_fetch_end"이 duplicate되었다는 에러가 발생 합니다. zend_vm_execute.h에서 중복된 constant_fetch_end 라벨을 constant_fetch_end1, constant_fetch_end2, constant_fetch_end3 과 같이 중복되지 않게 변경해 주면 됩니다.</span></blockquote><div><div><strong>zend_vm_gen.php</strong> 스크립트를 이용하여 <font color="#0000ff"><ins>zend_vm_execute.h 와 zend_vm_opcodes.h 파일을 GOTO type을 새로 생성</ins></font>한 후에, 기존의 configure; make; make install 을 이용하여 설치를 진행하면 됩니다.
<br>
<br>안녕 리눅스 1/2/3 에 들어있는 PHP는 모두 <strong>GOTO</strong> 모드로 빌드 되어 있고, 네오위즈에서 사용하는 PHP와 TMON에서 사용하는 PHP도 모두 GOTO로 빌드되어 동작하고 있습니다. 실제 상용 시스템에서 사용하여 검증은 되었으니, 직접 빌드해서 사용하는 분들은 빌드시에 적용을 해 보시면 좋을 겁니다.<br>
<br>OS 선택을 고려해야 하고 CentOS 6/7 을 생각하고 계신 분들이라면 안녕 리눅스를 선택하는 것을 고려해 보심이 ^^; CentOS 6/7 호환이라 전환을 한다고 해서 특별하게 달라질 것은 없습니다.<br>
<br><b>
다음은 realpath_cache_force 기능에 대해서 기술 합니다.</b></div><br>이 기능에 대해서는 <a href="https://joungkyun.gitbooks.io/annyung-3-user-guide/content/chapter3-4-php.html" target="_blank">안녕 리눅스 3 사용자 가이드의 PHP 문서의 4.7 realpath_cache_force 항목</a>에서 자세히 설명을 하고 있습니다.<br><br>위의 링크의 내용을 간략히 말하자면, PHP 파일에서 <strong>realpath_cache</strong> 라는 기능이 있습니다. 이 기능은 PHP가 파일 시스템에 접근을 할 때에 mtime(modify time) 을 체크하여 일정 시간동안 caching을 하여 성능을 높이는 것인데, <ins>link()와 symlink() function으로 race condition을 이용해서 open_basedir 을 무력화 시킬 수 있는 보안 버그가 발견</ins>이 되어, PHP 개발자들이 <strong>open_basedir</strong>을 사용할 경우에는 <strong>realpath_cache</strong>를 사용하지 못하도록 코드를 변경해 버렸습니다. 그래서 <strong>open_basedir</strong>을 사용할 경우에 접속이 많은 사이트의 경우에는 <ins><font color="#0000ff">30% 정도의 성능이 감소</font></ins>되는 문제가 있습니다. (이것 역시 case by case로 접속이 많은 수록 성능의 차이가 많이 나게 됩니다.)</div><br>안녕 리눅스 2.0 부터는 <strong>realpath_cache_force</strong> 라는 옵션을 추가하여, <strong>open_basedir</strong>을 사용하더라도, 이 옵션이 활성화가 되어 있으면, <strong>realpath_cache</strong>를 할 수 있도록 해 주며, <ins>문제가 되는 link()와 symlink() 함수들을 사용하지 못하게</ins> 하여 문제를 해결하고 성능을 높일 수 있도록 합니다.<br><br>이 기능은 TMON에서 주유권 이벤트시에 접속이 너무 몰려서 최적화 작업을 하면서 만든 기능으로 안녕 리눅스 2.0의 PHP에 반영이 되었습니다.<br><br>CentOS 6 또는 7 사용자들의 경우에는 CentOS를 안녕 리눅스로 전환을 시키면 이 기능을 사용할 수 있습니다. (물론 PHP 버전이 다르므로 약간의 migration은 필요할 수 있습니다.)</div><br><br>안녕 리눅스 전환을 얘기를 하면 강요같이 받아들이는 분들도 계셔서 안녕 리눅스에 반영된 patch file을 아래에 공유 합니다.<span style="font-size: 0.938em;"> 다음은 안녕 리눅스 3의 php 7.1.0에 적용된 패치 파일 입니다. (</span><span style="font-size: 15.008px;">copy & paste 이기 때문에 tab이 space로 변환이 되어 copy & paste로는 patch가 적용이 안되니 어디를 수정하는지 부분만 참고를 하세요.)</span></div></div></div><br><pre class="prettyprint " style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>diff -urNp php-7.1.0.org/ext/standard/link.c php-7.1.0/ext/standard/link.c<br>--- php-7.1.0.org/ext/standard/link.c 2016-12-02 11:07:40.000000000 +0900<br>+++ php-7.1.0/ext/standard/link.c 2016-12-09 17:28:34.301410867 +0900<br>@@ -126,6 +126,16 @@ PHP_FUNCTION(symlink)<br> char dirname[MAXPATHLEN];<br> size_t len;<br><br>+ <span style="font-size: 15.008px;"> if (PG(open_basedir) && *PG(open_basedir) && PG(realpath_cache_force)) {</span><br>+ php_error_docref(<br>+ NULL TSRMLS_CC,<br>+ E_ERROR,<br>+ "The relapath_cache_force option is enabled. "<br>+ "For security issue, symlink function is not usable."<br>+ );<br>+ RETURN_FALSE;<br>+ }<br>+<br> if (zend_parse_parameters(ZEND_NUM_ARGS(), "pp", &topath, &topath_len, &frompath, &frompath_len) == FAILURE) {<br> return;<br> }<br>@@ -182,6 +192,16 @@ PHP_FUNCTION(link)<br> char source_p[MAXPATHLEN];<br> char dest_p[MAXPATHLEN];<br><br>+ if (PG(open_basedir) && *PG(open_basedir) && PG(realpath_cache_force)) {<br>+ php_error_docref(<br>+ NULL TSRMLS_CC,<br>+ E_ERROR,<br>+ "The relapath_cache_force option is enabled. "<br>+ "For security issue, link function is not usable."<br>+ );<br>+ RETURN_FALSE;<br>+ }<br>+<br> if (zend_parse_parameters(ZEND_NUM_ARGS(), "pp", &topath, &topath_len, &frompath, &frompath_len) == FAILURE) {<br> return;<br> }<br>diff -urNp php-7.1.0.org/main/main.c php-7.1.0/main/main.c<br>--- php-7.1.0.org/main/main.c 2016-12-09 17:28:25.502936720 +0900<br>+++ php-7.1.0/main/main.c 2016-12-09 17:28:34.302410921 +0900<br>@@ -725,6 +725,7 @@ PHP_INI_BEGIN()<br><br> STD_PHP_INI_ENTRY("realpath_cache_size", "16K", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_size_limit, virtual_cwd_globals, cwd_globals)<br> STD_PHP_INI_ENTRY("realpath_cache_ttl", "120", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_ttl, virtual_cwd_globals, cwd_globals)<br>+ STD_PHP_INI_ENTRY("realpath_cache_force", "0", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_force, php_core_globals, core_globals)<br><br> STD_PHP_INI_BOOLEAN("upload_image_check", "0", PHP_INI_SYSTEM, OnUpdateBool, upload_image_check, php_core_globals, core_globals)<br> STD_PHP_INI_BOOLEAN("upload_image_check_log", "0", PHP_INI_ALL, OnUpdateBool, upload_image_check_log, php_core_globals, core_globals)<br>@@ -1779,7 +1780,7 @@ int php_request_startup(void)<br> }<br><br> /* Disable realpath cache if an open_basedir is set */<br>- if (PG(open_basedir) && *PG(open_basedir)) {<br>+ if (PG(open_basedir) && *PG(open_basedir) && !PG(realpath_cache_force)) {<br> CWDG(realpath_cache_size_limit) = 0;<br> }<br><br>@@ -2362,7 +2363,7 @@ int php_module_startup(sapi_module_struc<br> zend_register_standard_ini_entries();<br><br> /* Disable realpath cache if an open_basedir is set */<br>- if (PG(open_basedir) && *PG(open_basedir)) {<br>+ if (PG(open_basedir) && *PG(open_basedir) && !PG(realpath_cache_force)) {<br> CWDG(realpath_cache_size_limit) = 0;<br> }<br><br>diff -urNp php-7.1.0.org/main/php_globals.h php-7.1.0/main/php_globals.h<br>--- php-7.1.0.org/main/php_globals.h 2016-12-09 17:28:25.503936774 +0900<br>+++ php-7.1.0/main/php_globals.h 2016-12-09 17:28:34.303410975 +0900<br>@@ -154,6 +154,7 @@ struct _php_core_globals {<br> zend_long max_input_nesting_level;<br> zend_long max_input_vars;<br> zend_bool in_user_include;<br>+ zend_bool realpath_cache_force;<br><br> zend_bool upload_image_check;<br> zend_bool upload_image_check_log;<br>diff -urNp php-7.1.0.org/php.ini-development php-7.1.0/php.ini-development<br>--- php-7.1.0.org/php.ini-development 2016-12-09 17:22:39.522475756 +0900<br>+++ php-7.1.0/php.ini-development 2016-12-09 17:28:34.304411028 +0900<br>@@ -351,6 +351,12 @@ disable_classes =<br> ; http://php.net/realpath-cache-ttl<br> ;realpath_cache_ttl = 120<br><br>+; If set on safe_mode or open_basedir, realpth_cache is disable. Set 1 this<br>+; directive, realpath_cache is enable with realpath_cache_size and realpath_cache_ttl<br>+; although safe_mode or open_basedir set enable. If you want to enable this variable,<br>+; We recommand that symlink function is set to disable_functions<br>+;realpath_cache_force = 0<br>+<br> ; Enables or disables the circular reference collector.<br> ; http://php.net/zend.enable-gc<br> zend.enable_gc = On<br>diff -urNp php-7.1.0.org/php.ini-production php-7.1.0/php.ini-production<br>--- php-7.1.0.org/php.ini-production 2016-12-09 17:22:39.523475809 +0900<br>+++ php-7.1.0/php.ini-production 2016-12-09 17:28:34.305411082 +0900<br>@@ -351,6 +351,12 @@ disable_classes =<br> ; http://php.net/realpath-cache-ttl<br> ;realpath_cache_ttl = 120<br><br>+; If set on safe_mode or open_basedir, realpth_cache is disable. Set 1 this<br>+; directive, realpath_cache is enable with realpath_cache_size and realpath_cache_ttl<br>+; although safe_mode or open_basedir set enable. If you want to enable this variable,<br>+; We recommand that symlink function is set to disable_functions<br>+;realpath_cache_force = 0<br>+<br> ; Enables or disables the circular reference collector.<br> ; http://php.net/zend.enable-gc<br> zend.enable_gc = On<span style="font-size: 0.938em;"></code></pre></span><p><strong><a href="https://my.oops.org/173?commentInput=true#entry173WriteComment">댓글 쓰기</a></strong></p>안녕 리눅스 3 릴리즈김정균https://my.oops.org/1682016-04-08T23:11:38+09:002016-02-29T04:54:09+09:00<span style="color: #666666; font-family: 'Helvetica Neue', Helvetica, NanumBarunGothic, 나눔바른고딕, 'Noto Sans Korean', 'Apple SD Gothic Neo', 'Malgun Gothic', AppleGothic, Dotum, 돋움, sans-serif; font-size: 13.132px; line-height: 22.3244px;">정말 산넘고 강건너 돌고 돌아서 출시가 되었습니다.</span><br /><br /><a href="http://annyung.oops.org/?m=data&p=rel3">안녕 리눅스 3 Release Note 보기</a><p><strong><a href="https://my.oops.org/168?commentInput=true#entry168WriteComment">댓글 쓰기</a></strong></p>안녕 리눅스 3 개발 소식 2th김정균https://my.oops.org/1652015-11-25T23:49:39+09:002015-10-07T00:56:16+09:00* 참고: 이글의 코멘트로 진행 사항이 계속 업데이트 되고 있습니다.<br /><br />안녕리눅스 3 소식이라고 10개월 전에 올려놓고 금방 나올것 처럼 포스팅을 했습니다만, 역시나 공수표가 되고 말았습니다.<br /><br />2015년 한해가 제게는 완전히 고난의 해 이군요. 2015년의 키워드는 '배신'이며, 제 인생에서 지워버리고 싶을 정도로 엄청난 일들을 겪었고, 또 현재 진행형 입니다. 그러다 보니 안녕리눅스 개발 역시 뒷전이 되고 말았습니다.<br /><br />현재 안녕 리눅스 3의 개발 단계는 기본 패키징은 완료된 상태이며, kickstart 설치 테스트를 하고 있습니다. RHEL의 설치 프로그램인 anaconda 역시 systemd의 도입으로 많이 변경된 관계로 테스트가 꽤 많이 필요하네요.<br /><br />앞으로의 남은 작업은 다음과 같습니다.<br /><br />
<ol>
<li>kickstart 설치 정리</li>
<li>systemd 관련 daemon package 정리</li>
<li>KLDP system에 적용 및 테스트</li>
<li>Release</li>
</ol>
단계상으로는 얼마 안남은 듯 싶은데, 현재 진행형인 제 개인사가 어떻게 방해를 하지 몰라서 일정은 감히 언제 된다고 하기는 힘들 것 같습니다. 하지만 8월 말 부터 계속 꾸준하게 저녁 시간을 할애해서 작업이 진행되고 있으며, 아마도 올해 안에는 공개가 가능하지 않을까 싶습니다.<br /><br />공개는 일차적으로 RHEL의 패키지를 수정한 base repository를 공개할 수도 있을 듯 싶습니다.<p><strong><a href="https://my.oops.org/165?commentInput=true#entry165WriteComment">댓글 쓰기</a></strong></p>안녕 리눅스 3 개발 소식김정균https://my.oops.org/1622015-11-19T13:30:41+09:002014-12-18T14:58:57+09:0012월 초에 안녕 리눅스 3일정을 잡았다가 현재는 2015년 1월 말로 연기된 상태 입니다.<br /><br />현재 작업 상태는 core package들의 re-packaing이 거의 완료된 상태입니다.<br /><br />문제는 결국에는 기존의 init를 systemd로 변경된 것에서 문제가 발생을 하고 있네요.<br /><br />안녕의 init script에는 argument를 가져와서 사용하는 것들이 있습니다. 대표적으로 mysql과 redis, memcache 같은 것들인데요. 이 데몬들의 init script들은 argument를 이용해서 여러개의 process를 관리할 수 있도록 되어 있습니다.<br /><br />문제는 systemd가 외부 argument를 받아 들이지 못하는 것 같고(아직 정확하게 파 보지는 않아서 추측입니다..), 그리고 외부 변수(sysconfig)의 활용도가 너무 제한적이라는 것입니다. 그냥 자유를 박탈당한 기분이랄까요?<br /><br />지금은 systemd를 뜯어 고쳐야 하나 심각하게 고민중입니다. 그래서 일정이 더 지연이 될 수도 있을 것 같네요. 고민고민 병에 걸려 버렸습니다. --;<p><strong><a href="https://my.oops.org/162?commentInput=true#entry162WriteComment">댓글 쓰기</a></strong></p>안녕리눅스 넌 뭐야?김정균https://my.oops.org/1602014-05-03T02:14:09+09:002014-05-03T02:11:19+09:00제가 안녕 리눅스를 처음 배포한지 벌써 만 12년이 다 되어 갑니다.<br />
<br />
그러함에도 불구하고, 안녕 리눅스는 여전히 듣보잡이라는 소리를 듣는 minor한 배포본 입니다. 그래서 오랜만에 한번 썰을 풀어보고자 합니다.<br />
<br />
안녕 리눅스 1.x는 2003년 6월에 처음 배포를 시작해서 2012년 12월말까지 대략 9년 6개월 정도를 지원했습니다. 상용 리눅스인 RHEL보다도 2년반을 더 지원을 했네요. 물론 제 개인적인 사정으로 커널 2.6 대응이 늦어지다보니 어쩔 수 없이 길어지기는 했습니다 ^^;<br />
<br />
안녕 2는 안녕 리눅스 1을 배포한지 딱 10년만에 출시가 되었는데요. 공식적으로 커널 2.6을 대응하는 버전입니다. (커널 2.4로 정말 많이 울궈 먹었습니다. ^^)<br />
<br />
안녕 리눅스의 사용량에 대해서도 썰들이 참 많습니다. 일단 듣보잡이라는 말을 듣기 때문에 아무도 사용하지 않을거다라는 의견도 참 많이 들어봤고, 예상하시는대로 굉장히 minor한 배포본임에는 틀림없는 사실입니다.<br />
<br />
일단 예전에 KLDP 10주년 행사시에 한번 구두로 밝히기는 했는데, 안녕 리눅스 업데이트 log 기록을 기준으로, 1.3 이 출시 되었을 때 최고치를 찍었으며 ip 기준으로 100,000 대 조금 안되게 설치가 되었던 것으로 추측을 합니다. 안녕 2의 경우 안녕 리눅스가 커널 2.6 대응이 너무 늦은 이유로 사용자 층이 많이 떨어져 나가서 현재 12,000 여개의 IP에서 update log가 들어오고 있습니다. 생각 보다는 많다고 생각 되실지도 모르겠습니다. 일단 제가 한 300개의 ip를 찍고 있기는 하며, 안녕 2의 경우 yum repository를 사용하며 mirror 쪽으로 가는 것은 알수가 없으므로 좀 더 많지 않을까 추측해 봅니다.<br />
<br />
제 입장에서는 제게 안녕 리눅스 어떠냐고 물어보면 사용하지 말라고 하고 다니고, 홍보도 거의 안하는 배포본이 이만큼이나 사용되고 있다는 것에 놀랍기는 합니다. (언젠가 드라마에 안녕 리눅스가 나오기도 했었죠. 남상미 나오는.. http://my.oops.org/52?category=17 참조)<br />
<br />
그리고, 제가 받는 질문 중의 가장 빈도가 놓은 질문이 "안녕 리눅스를 업무용으로 사용하기에는 불안하다"라는 것입니다.<br />
<br />
이건 개인 판단이기 때문에 전 항상 이런 질문을 받으면 "CentOS나 RHEL 사용하세요"라고 답합니다. 이유로는 일일히 이해 시키기도 그렇고, 제가 업무용으로 custom한 배포본이기 때문에 다른 사람이 사용하지 않아도 상관이 없는지라 이해를 시키기 귀찮아서 이렇게 답하고, 홍보를 안하는 것지요.<br />
<br />
그래서 여기서는 이 부분에 대해서 한번 설명을 해 보려고 합니다.<br />
<br />
일단 "불안하다"라는 것에 대해서는 제가 판단하기로는 기술적인 문제 보다는 안녕 리눅스의 미래에 대해서 불안하다는 것이겠지요. 뭐 제가 쌩으로 만든 배포본도 아니니 안녕 리눅스가 기술적으로 불안하다면 CentOS 아니 RHEL까지 싸잡힐테니 말입니다. :-)<br />
<br />
영속성이라는 것이 얼마나 오래 버티고 내가 계속 사용을 하는데 문제가 없을까라는 점이 가장 큰 이유인데, 세계의 배포본들을 잘 살펴 보시면 그 잘나가던 배포본들도 안녕 리눅스의 역사보다 짧은 시간을 가진 것들이 많습니다. 특히 우리나라에서 배포하는 것 치고는 안녕 리눅스와 역사를 비슷하게 할 수 있는 것은 SULinux 밖에 없는 것 같군요. (하지만 안녕 2가 너무 늦게 나온 것에 대해서는 할말이 없습니다. 이게 개인 배포본의 한계이기는 하죠.)<br />
<br />
그리고, 개인이 한다는 것에 대한 불안감도 많이 있습니다. 하지만 이 경우도 slackware의 경우에도 개인이 잘 유지하고 있죠. 다만 개인의 한계로 인하여 이제는 안녕 리눅스 처럼 minor한 배포본이 되었지만요. 안녕의 경우, 이런 부분 때문에 1.x에서 독자 배포본으로 변신을 시도 했다가 안녕 2에서는 기생 배포본으로 다시 환원하게 됩니다. ^^;<br />
<br />
일단 안녕 리눅스가 이렇게 오랜시간 동안 유지할 수 있는 이유는 간단합니다. 바로 제가 업무용으로 사용을 하기 위하여 유지보수를 하고 있기 때문입니다. 그리고 제 성격이 좀 엿같은 부분이 있는데, 제가 행한 것에 대해서는 어떻게는 책임을 지려고 하는 저한테는 아주 않좋은 습관이 있는데, 이것도 일조를 합니다. (직접적으로 비용이 들 경우에는 안면 몰수를 잘하는 좋은 습관도 있습니다. ^^)<br />
<br />
안하던 홍보를 해 보자면, 안녕 리눅스를 사용하시면 ISMS나 PIMS 인증을 받으실 때 보안 업체에서 돌리는 check script에 대응하는 것들이 기본으로 90% 정도 반영이 되어 있습니다. 돌려 보라고 하세요. 별거 안나올 겁니다.<br />
<br />
PHP를 사용하시는 분들은 안녕 리눅스에서 패치된 safe_mode_exec_dir 기능을 사용해 보십시오. system injection에서 해방이 되실 겁니다. 그 외에 상위 버전의 php의 기능이 back porting 되어 있기도 합니다.<br />
<br />
system jail을 하고 싶으시면 안녕 리눅스의 pam_chroot를 사용해 보십시오. 기존의 pam_chroot 보다 훨씬 쉽게 할 수 있습니다.<br />
<br />
뭐 그 외에도 기타등등 있기는 한데, 정리해 놓은 것이 없어서.. (이것도 홍보를 안하는 이유중의 하나 입니다.)<br />
<br />
참 많이도 적었네요. 마지막으로 안녕 리눅스가 발전해온 경과를 한번 보겠습니다.<br />
<br />
wikipedia 한국어 판의 안녕 리눅스 문서를 보면 "배포판이 지나치게 비대해지는 것에 실망하여" 라는 설명이 있습니다. 이게 annyung linux 공식 홈페이지에 있는 글인데, 의미가 좀 다르게 퍼져나가 있더군요.<br />
<br />
안녕 리눅스의 시작은 개인적인 목적이 아니라 회사에서 사용을 하기 위하여 설치 후 customize를 하는 것을 배포본으로 만든 것입니다. 그러다 보니 배포본에서 X 환경을 제거를 하였고, 배포할 때 업로드가 힘들어서 slim한 배포본을 만든 것이죠. 1.2G 짜리 ISO를 200M 짜리 ISO로 만들었으니, 이런 의미에서 "비대"라는 표현을 쓴 것이죠.<br />
<br />
실질적인 안녕 리눅스의 정체성은 2005년경 부터 나타나기 시작하였고, 여기서 독자적인 배포본의 욕심을 부려봅니다.<br />
<br />
안녕 리눅스의 정체성은 KLDP와 관련이 되어 있습니다. 2005년경에 KLDP에 아주 중대한 사건이 발생합니다. 사용하던 phpbb 2의 Highlight Vulnerability에 의해서 system injection을 당하여 "rm -rf /"를 당합니다. backup 해 놓은 db로 겨우 복구를 하였죠.<br />
<br />
이 때, 제가 있던 회사에서 KLDP를 후원을 하고 있었던 까닭으로 KLDP의 복구를 제가 하게 됩니다. 그리고 그 이유로 제가 KLDP의 시스템 관리를 지금까지 하게 됩니다.<br />
<br />
다시 정체성으로 돌아가보면, KLDP의 시스템 관리를 하게 되었는데, 문제는 KLDP를 회사 서버처럼 돌볼수는 없다는 점이었습니다. 그렇다고 이런 사건이 날때마다 닥질을 하기도 그렇고 해서 엉뚱한 생각을 하게 됩니다. 문은 열리라고 있는 것이고, 보안은 안뚫릴수 있는 시스템은 없다는 가정을 해보니, 문을 열고 들어와도 훔쳐갈게 없게 만들면 되지 않을까라는 엉뚱한 생각입니다. 마침 php에는 쓸모도 없는 safe mode에서 shell을 jail시키는 safe_mode_exec_dir 이라는 기능이 있었습니다. 그런데 이 기능을 구현하는 parser가 엄청나게 구려서 실제 환경에서는 사용할 만한것이 아니라, system command parser를 새로 구현해서 safe_mode_exec_dir을 safe_mode가 아니어도 사용할 수 있도록 patch를 합니다. openbase_dir과 safe_mode_exec_dir을 같이 적용을 하면 system injection을 하더라도 실행할 명령 자체가 command not found가 되어 버립니다. 심지어는 shell의 internal command 까지 말이죠. 바로 web shell이 무력화가 되더군요. http://annyung.oops.org/?m=white&p=php-guide 를 참고 하시면 이 외에도 많은 부분이 보안 목적으로 패치가 되어 있고, 현재 KLDP와 현업에서 잘 활용을 하고 있습니다.<br />
<br />
즉, 안녕 리눅스의 정체성은 관리할 여유가 없는 서버가 대상이 되기 시작합니다. (물론 그냥 안녕 리눅스만 설치해 줬다고 해서 이렇게 되지는 않습니다. 초기 설정은 한번 해 줘야 가능하죠)<br />
<br />
KLDP를 위한 이 기능이 회사에서 사용하게 되고, 회사의 보안성을 높이게 된 계기가 됩니다. 이렇게 KLDP는 제가 회사에서 적용하는 것들의 test bed 가 되었지요. 그러다보니 KLDP의 시스템은 일반 community가 운영하는 level과는 비교할 수 없게 운영적으로 고도화가 되어 있습니다. (인증 통합 부터, (Layer 7 level)모니터링, 떨어져 있는 시스템간의 VPN 연결 등등) 고도화가 되어 있는 이유는 전에 말했듯이 운영에 실험적으로 해 볼만한 것들을 KLDP에서 반영하여 테스트 하고, 확신이 들면 업무에 적용을 하는 것이죠. 그리고 이것들은 모두 안녕 리눅스에 반영이 되게 됩니다.<br />
<br />
반대로 업무에 안녕리눅스를 사용하면서 안녕 리눅스가 발전되는 부분은 제도권 즉 ISMS나 PIMS 같은 인증 이슈가 있습니다. 일일이 지적 사항을 반영하기가 귀찮아서 그냥 안녕 리눅스에 기본 적용을 해 버린 것이죠.<br />
<br />
뭐 이 외에도 말할 것들은 많지만 글재주가 없는지라 여기까지만 해도 힘드네요.<br />
<br />
정리하자면, 안녕 리눅스는 중소규모의 서비스에 사용할 만큼 밖에 되지 않는 배포본은 아닙니다. 실제로 네이버 정도는 아니지만, daum 정도 이상의 규모에서 사용되었고(daum에서 사용한다는 의미는 아닙니다), 그에 준하는 곳에서도 main 배포본으로 사용이 되고 있으니까요. 충분히 enterprise 급의 배포본 입니다.<br />
<br />
하지만 제게 "안녕 리눅스 사용을 권장하겠습니까"라고 물으면 전 여전히 "사용하지 마세요"라고 답을 할 겁니다. 여기서 발생을 하는 문제가 바로 안녕 리눅스의 최대 약점인데.. 바로 수많은 요구 조건을 받아들일 수 없는 개인 신분이기 때문입니다. 안녕 리눅스는 제가 필요한 사항이 반영되는 시스템이지 anonymous의 요구를 충족할 수 있는 배포본이 아니기 때문입니다.<br />
<br />
그래서 제목에 대한 결론을 내리자면, "안녕 리눅스 너 뭐야?" 에 대해서는 "몰라도 돼. 신경꺼" 입니다. ^^;<br />
<br />
P.S.<br />
가끔 안녕 리눅스를 ubuntu 기반으로 변경할 생각이 없냐고 물으시는 분이 있습니다. 이 질문에 대해서는 "아직 없습니다." 입니다. 개인적으로 ubuntu의 설정 정책이 많이 마음에 들지 않습니다. 너무 직관적이지 않거든요. 이런 점에서는 RHEL 7에 적용될 systemd도 많이 마음에 들지 않습니다. 안녕 3에서는 systemd를 빼버릴지도 모르겠군요(라고 마음은 먹지만 귀찮음에 빼지는 못할 것 같습니다. TT)<p><strong><a href="https://my.oops.org/160?commentInput=true#entry160WriteComment">댓글 쓰기</a></strong></p>End of Life AnNyung 1김정균https://my.oops.org/1542012-10-16T16:53:26+09:002012-09-15T19:55:23+09:0010여년 동안 같이 했던 안녕 리눅스 1.x의 유지보수를 2012년 12월 31일부로 종료하려고 합니다.<br />
<br />
기나긴 세월동안 같이 해 주셨던 안녕 리눅스 1.x 사용자분들에게 감사드리고, 빨리 안녕 2나 다른 배포본으로 업그레이드 하시기 바랍니다.<br />
<br />
감사합니다.<br />
<br />
<a href="http://annyung.oops.org/?m=doc&p=end-of-life-1">안녕 리눅스 1 End of Life 공식 Announce</a><p><strong><a href="https://my.oops.org/154?commentInput=true#entry154WriteComment">댓글 쓰기</a></strong></p>