<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>debian | bitneer.dev</title>
	<atom:link href="https://www.bitneer.dev/blog/tag/debian/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bitneer.dev</link>
	<description>AI 시대에 취미로 하는 코딩</description>
	<lastBuildDate>Tue, 06 Jan 2026 20:59:26 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://www.bitneer.dev/wp/wp-content/uploads/2023/11/cropped-bitneer_Logo_for_Google_200-32x32.png</url>
	<title>debian | bitneer.dev</title>
	<link>https://www.bitneer.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>데비안에 Eclipse Temurin JDK 설치하기</title>
		<link>https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-eclipse-temurin-jdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 20:41:04 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdk]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=10094</guid>

					<description><![CDATA[<div data-nosnippet>Atlassian이 Cloud 중심 전략으로 전환하기 위해 2021년 Confluence, Jira, Bitbucket에 대한 개인용 영구 라이선스(Server) 판매를 중단했고, 기업용인 Data Center 제품도 2029년까지 단계적으로 종료할 예정이다. 이에 따라 개인적으로 사용 중이던 Jira와 Bitbucket은 Gitea로 대체하였다. Confluence는 노션(Notion), 아웃라인(Outline), 옵시디언(Obsidian) 등을 검토해 보았으나 딱히 마음에 드는 대안이 없었다. 다행히 Confluence는 폴백(Fallback) 영구 라이선스라 업그레이드는 불가능하지만 계속 사용할 수 있어 아직 유지하고 있다. Java에 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-eclipse-temurin-jdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">데비안에 Eclipse Temurin JDK 설치하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  Atlassian이 Cloud 중심 전략으로 전환하기 위해 2021년 Confluence, Jira,
  Bitbucket에 대한 개인용 영구 라이선스(Server) 판매를 중단했고, 기업용인 Data
  Center 제품도 2029년까지 단계적으로 종료할 예정이다. 이에 따라 개인적으로 사용
  중이던 Jira와 Bitbucket은
  <a rel="noopener noreferrer" target="_blank" href="https://about.gitea.com/">Gitea</a
  >로 대체하였다. Confluence는
  <a rel="noopener noreferrer" target="_blank" href="https://www.notion.com/ko">노션(Notion)</a
  >,
  <a rel="noopener noreferrer" target="_blank" href="https://www.getoutline.com/">아웃라인(Outline)</a
  >,
  <a rel="noopener noreferrer" target="_blank" href="https://obsidian.md/">옵시디언(Obsidian)</a
  >
  등을 검토해 보았으나 딱히 마음에 드는 대안이 없었다. 다행히 Confluence는
  폴백(Fallback) 영구 라이선스라 업그레이드는 불가능하지만 계속 사용할 수 있어
  아직 유지하고 있다.
</p>
<p>
  Java에 대한 흥미를 잃어 대체 솔루션으로 교체하게 되면 JDK를 삭제할
  예정이었으나, 한동안은 더 필요할 듯하다. 또한 검색을 통해 이전에 작성한
  <a rel="noopener noreferrer" target="_blank" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-adoptopenjdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">데비안에 AdoptOpenJDK 설치하기</a
  >
  글로 유입되는 경우가 있어, 최신 정보를 공유하고자 기록을 남긴다.
</p>
<h5>AdoptOpenJDK의 브랜드 변경과 이관</h5>
<p>
  AdoptOpenJDK는 2021년 Eclipse 재단으로 이관되면서
  <strong>Eclipse Adoptium</strong> 프로젝트로 재탄생하였다. 이는 Oracle의
  상표권 문제를 해결하고, 공식 호환성 테스트(TCK)를 통과하여 엔터프라이즈
  환경에서 더 신뢰할 수 있는 바이너리를 제공하기 위함이다.
</p>
<ul>
  <li>
    <strong>상표권 분쟁 회피:</strong> &#8216;OpenJDK&#8217;라는 단어는 Oracle의 등록
    상표이다. 커뮤니티 프로젝트였던 &#8216;AdoptOpenJDK&#8217;의 규모가 커지자, 법적으로
    안전하고 영구적인 이름을 갖기 위해 Eclipse 재단으로 이관하며 이름을 변경해야
    했다.
  </li>
  <li>
    <strong>Java 공식 인증 (TCK 라이선스 획득)</strong>: 과거 AdoptOpenJDK는
    Oracle과의 라이선스 문제로 &#8216;자바 호환성 테스트(TCK)&#8217;를 공식적으로 수행할 수
    없었다. 하지만 Eclipse 재단 산하로 들어가면서 Oracle과 협약을 맺고 TCK
    인증을 통과한 &#8216;공식 호환 Java&#8217;를 배포할 수 있게 되었다.
  </li>
</ul>
<p>
  2021년 AdoptOpenJDK 프로젝트가 Eclipse 재단으로 합류하며 Eclipse Adoptium으로
  이름이 바뀌었고, <strong>Eclipse Temurin</strong>이라는 바이너리가 처음
  배포되었다. 이후 2023년 7월, 기존에 사용하던
  <kbd>adoptopenjdk.jfrog.io</kbd> 저장소는 완전히 사용 중단(Deprecated)되었다.
</p>
<p>
  Eclipse Adoptium(어댑티움)은 프로젝트 이름이고 Eclipse Temurin(테무린)은 해당
  프로젝트에서 생산하는 JDK 제품 이름이다. <strong>Temurin</strong>은
  <strong>Runtime</strong>의 아나그램(철자 순서 바꾸기)이다. (R-u-n-t-i-m-e
  &harr; T-e-m-u-r-i-n)
</p>
<h5>AdoptOpenJDK 저장소 정리하기</h5>
<p>
  Eclipse Temurin으로 이관되던 2023년 무렵, <kbd>apt update</kbd> 실행 시 다음과
  같은 경고 메시지가 발생했었다. 현재는 저장소 자체가 삭제되었을 것으로 보인다.
</p>
<pre class="language-none">
<code># apt update
...
W: https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/dists/buster/InRelease 파일을 받는데 실패했습니다  503  Service Temporarily Unavailable [IP: 34.74.126.177 443]
W: Some index files failed to download. They have been ignored, or old ones used instead.</code>
</pre>
<p>
  아직 저장소를 정리하지 않았다면 <kbd>/etc/apt/sources.list</kbd>나
  <kbd>/etc/apt/sources.list.d</kbd>에서 AdoptOpenJDK 저장소 설정을 삭제하자.
</p>
<p>
  AdoptOpenJDK GPG 키는 <kbd>apt-key add</kbd> 명령으로
  <kbd>/etc/apt/trusted.gpg</kbd> 파일에 저장되어 있을 것이다. 다음 명령어로 키
  정보를 확인한다.
</p>
<pre class="language-none" data-line="4">
<code># apt-key list
...
pub   rsa4096 2019-06-25 [SC] [expires: 2023-06-24]
      5951 8666 C652 3968 B1F8  6530 8AC3 B291 7488 5C03
uid           [ unknown] AdoptOpenJDK &lt;adoptopenjdk@jfrog.com&gt;
sub   rsa4096 2019-06-25 [E] [expires: 2023-06-24]
...</code>
</pre>
<p>
  4번째 줄의 전체 핑거프린트(Fingerprint)에서 마지막 8자리를 Key ID로 사용한다.
  위 예시에서는 <kbd>74885C03</kbd>이 Key ID이다. 다음 명령어로 AdoptOpenJDK
  키를 삭제한다.
</p>
<pre class="language-none">
<code># apt-key del 74885C03</code>
</pre>
<h5>데비안의 최신 apt 보안 표준</h5>
<p>외부 저장소의 GPG 키를 저장하는 곳은 크게 다음 세 가지가 있다.</p>
<ol>
  <li><kbd>/etc/apt/trusted.gpg</kbd> 파일</li>
  <li><kbd>/etc/apt/trusted.gpg.d/</kbd> 디렉터리 내부</li>
  <li><kbd>/etc/apt/keyrings/</kbd> 디렉터리 내부</li>
</ol>
<p>
  첫 번째와 두 번째 방식은 보안상 좋지 않아 권장되지 않거나 사용이 중단될
  예정이다. <kbd>trusted.gpg</kbd> 파일과 <kbd>trusted.gpg.d</kbd> 디렉터리 안의
  키는 시스템의 <strong>모든</strong> 저장소에서 해당 키를 무조건 신뢰하기
  때문이다.
</p>
<ul>
  <li>
    <kbd>apt-key add</kbd> 명령어로 <kbd>trusted.gpg</kbd> 파일에 추가하던
    방법은 사용이 금지된다.
    <strong
      >Debian 13 &quot;Trixie&quot;부터 apt-key는 제거되어 더 이상 사용할 수
      없다.</strong
    >
  </li>
  <li>
    <kbd>/etc/apt/trusted.gpg.d/</kbd> 디렉터리에 넣는 것 또한 권장되지 않는다.
    <kbd>rm</kbd> 명령어로 GPG 키를 편하게 삭제할 수 있다는 장점은 있으나,
    여전히 전역 신뢰(Global Trust) 문제로 인해 보안에 좋지 않다.
  </li>
</ul>
<p>
  따라서 별도의 디렉터리인 <kbd>/etc/apt/keyrings</kbd>에 GPG 키를 저장하고,
  <kbd>sources.list</kbd>에서
  <strong>&quot;이 저장소는 오직 이 키로만 인증한다(signed-by)&quot;</strong
  >라고 명시하는 세 번째 방식을 권장하고 있다.
</p>
<p>
  이 권장 방식을 따르고 있는 대표적인 예로 GitHub CLI가 있다. (공식 문서 참조:
  <a rel="noopener noreferrer" target="_blank" href="https://github.com/cli/cli/blob/trunk/docs/install_linux.md#debian">GitHub CLI Install</a
  >) GitHub CLI는
  <kbd>/etc/apt/keyrings/githubcli-archive-keyring.gpg</kbd> 경로에 GPG 키를
  생성하며, <kbd>/etc/apt/sources.list.d/github-cli.list</kbd> 파일의 내용은
  다음과 같다.
</p>
<pre class="language-none">
<code>deb [arch=amd64 signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main</code>
</pre>
<p>
  <kbd>signed-by</kbd> 옵션에 GPG 키 경로를 명시적으로 설정한 것을 볼 수 있다.
</p>
<h5>Eclipse Temurin 설치</h5>
<p>
  Eclipse Temurin 설치 페이지(<a rel="noopener noreferrer" target="_blank" href="https://adoptium.net/installation/linux/">https://adoptium.net/installation/linux/</a
  >)에서는 앞서 언급한 두 번째 방식(<kbd>/etc/apt/trusted.gpg.d/</kbd>)을
  안내하고 있다. 데비안의 최신 권장 방식을 아직 따르고 있지 않은데, 언젠가는
  문서가 업데이트될 것으로 보인다. 공식 문서대로 설치해도 사용에는 지장이
  없으나, 이 글에서는 <strong>데비안의 권장 방식(signed-by)</strong>으로
  설치하는 방법을 설명한다.
</p>
<h6>1. 필수 패키지 설치</h6>
<p>
  다음 명령어로 Eclipse Temurin 설치 과정에 필요한
  <kbd>wget, apt-transport-https, gpg</kbd> 패키지를 설치한다. <kbd>gpg</kbd>는
  데비안 설치 시 <kbd>gnupg</kbd>에 포함되어 이미 설치되어 있을 수 있다.
</p>
<pre class="language-none">
<code># apt update
# apt install wget apt-transport-https gpg</code>
</pre>
<h6>2. Eclipse Adoptium GPG 키 설치</h6>
<p>
  패키지의 무결성 검사에 사용하는 Eclipse Adoptium GPG 키를 설치한다.
  <kbd>/etc/apt/keyrings</kbd> 디렉터리에 설치하는 점에 주목하자.
</p>
<pre class="language-none">
<code># wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor | tee /etc/apt/keyrings/adoptium.gpg > /dev/null</code>
</pre>
<h6>3. Eclipse Adoptium DEB 저장소 설정</h6>
<p>
  Eclipse Adoptium DEB 저장소 설정을 추가한다. <kbd>signed-by</kbd> 옵션에
  Eclipse Adoptium GPG 키 경로를 지정하여, 해당 저장소가 오직 이 키만 사용하도록
  강제한다.
</p>
<pre class="language-none">
<code># echo "deb [signed-by=/etc/apt/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list</code>
</pre>
위 명령어로 생성된 <kbd>/etc/apt/sources.list.d/adoptium.list</kbd> 파일의
내용은 다음과 같다.
<pre class="language-none">
<code>deb [signed-by=/etc/apt/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main</code>
</pre>
<h6>4. temurin-&lt;version&gt;-jdk 설치</h6>
다음은 개인적으로 사용하는 구버전 Confluence 환경에 맞춰
<kbd>temurin-8-jdk</kbd> 패키지를 설치하는 예시이다. 본인이 필요한 버전의
패키지를 설치하면 된다.
<pre class="language-none">
<code># apt update
# apt install temurin-8-jdk</code>
</pre>
<h5>관련 글</h5>
<ul>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-adoptopenjdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">데비안에 AdoptOpenJDK 설치하기</a
    >
  </li>
</ul>
<h5>참고 자료</h5>
<ul>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://adoptium.net/blog/2023/07/adoptopenjdk-jfrog-io-has-been-deprecated/">AdoptOpenJDK.jfrog.io has been deprecated! | Adoptium</a
    >
  </li>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://adoptium.net/installation/linux/">https://adoptium.net/installation/linux/</a
    >
  </li>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://wiki.debian.org/SecureApt">SecureApt &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://unix.stackexchange.com/questions/420961/how-to-identify-gpg-key-ids-so-they-may-be-deleted">debian &#8211; How to identify gpg key IDs so they may be deleted &#8211; Unix &amp;
      Linux Stack Exchange</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-eclipse-temurin-jdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">데비안에 Eclipse Temurin JDK 설치하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>데비안 9(Stretch)에서 10(Buster)으로 업그레이드 시 주의 사항</title>
		<link>https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88-9stretch%ec%97%90%ec%84%9c-10buster%ec%9c%bc%eb%a1%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c-%ec%8b%9c-%ec%a3%bc%ec%9d%98-%ec%82%ac%ed%95%ad/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Wed, 17 Jun 2020 04:38:57 +0000</pubDate>
				<category><![CDATA[네트워크와 시스템 관리]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[upgrade]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=649</guid>

					<description><![CDATA[<div data-nosnippet>데비안 9에서 데비안 10으로 업그레이드 하면서 내가 부딪쳤던 문제들을 정리해 본다. eth0 네트워크 인터페이스 이름의 미지원 네트워크 인터페이스 이름으로 eth0 등을 사용하고 있다면 데비안 10으로 업그레이드하기 전에 새로운 방식의 이름으로 변경해 주어야 한다. 이에 대한 이해를 위해 네트워크 인터페이스에 이름을 부여하는 방법의 변화 과정을 보자. 원래의 간단한 체계(Original Simple Scheme)는 리눅스 커널이 단순히 eth0, eth1 등으로 이름을 붙인다. 이 체계의 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88-9stretch%ec%97%90%ec%84%9c-10buster%ec%9c%bc%eb%a1%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c-%ec%8b%9c-%ec%a3%bc%ec%9d%98-%ec%82%ac%ed%95%ad/">데비안 9(Stretch)에서 10(Buster)으로 업그레이드 시 주의 사항</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  데비안 9에서 데비안 10으로 업그레이드 하면서 내가 부딪쳤던 문제들을 정리해
  본다.
</p>
<h5>eth0 네트워크 인터페이스 이름의 미지원</h5>
<p>
  네트워크 인터페이스 이름으로 <kbd><strong>eth0</strong></kbd> 등을 사용하고
  있다면 데비안 10으로 업그레이드하기 전에 새로운 방식의 이름으로 변경해 주어야
  한다. 이에 대한 이해를 위해 네트워크 인터페이스에 이름을 부여하는 방법의 변화
  과정을 보자. <em>원래의 간단한 체계(Original Simple Scheme)</em>는 리눅스
  커널이 단순히 eth0, eth1 등으로 이름을 붙인다. 이 체계의 문제는 부팅 후에
  eth0과 eth1의 이름이 서로 바뀔 수 있다는 점이다. 이 문제를 해결하기 위한 여러
  방법이 생겨났는데 그중의 하나가
  <em>영속적인 이름 체계(Persistent Names Scheme)</em>이다. 이 체계는 Mac 주소를
  사용하여 고정된 eth0 등의 이름을 부여한다. 이 체계도 완전하지 않고 특히
  가상머신(virtualization)에서 문제가 있다. 그래서 나온 것이 펌웨어/BIOS에서
  제공하는 정보를 사용하는
  <em>예측가능한 이름 체계(Predictable Name Scheme)</em>이다.
</p>
<p>
  데비안 5(Lenny) 즈음부터 영속적인 이름 체계를 사용해 왔다. 데비안
  9(Stretch)에서 예측가능한 이름 체계가 들어 왔다. 데비안 9를 새로 설치하면
  예측가능한 이름 체계를 사용한다. &#8216;<strong>ip a</strong>&#8216; 명령어를 실행하면
  기존의 eth0 대신 하드웨어에 따라 달라지는 <kbd>eno1, enp0s1, wlp1s0</kbd> 등의
  이름을 볼 수 있을 것이다. 새로 설치하는 것이 아니라 업그레이드로 데비안 9까지
  왔다면 여전히 영속적인 이름 체계를 사용할 것이다.
  <kbd>/etc/udev/rules.d/70-persistent-net.rules</kbd> 파일의 존재로 확인할 수
  있다.
</p>
<p>
  데비안 10(Buster)에서 <em>실제 제작자(upstream)</em>가 영속적인 이름 체계를
  공식적으로 지원하지 않는다.
  <a href="https://wiki.debian.org/NetworkInterfaceNames" target="_blank" rel="noopener noreferrer">NetworkInterfaceNames &#8211; Debian Wiki</a
  >
  페이지에서는 영속적인 이름 체계를 데비안 10까지는 사용할 수 있고 데비안
  11(Bullseye) 무렵에 완전히 없어질 것이라 나온다.
  <a href="https://www.debian.org/releases/buster/releasenotes" target="_blank" rel="noopener noreferrer">데비안 10 &#8212; 릴리스 노트</a
  >
  5장에서는 영속적인 이름 체계가 가능할지도 모르지만, 위험할 수 있어 새로운
  이름으로 변경할 것을 권고하고 있다. 어쨌든 영속적인 이름 체계는 피하는 것이
  나을 것이고 이에 대한 몇 가지 방법이 있다.
</p>
<h6>1. 원래의 간단한 체계 사용하기</h6>
<p>
  네트워크 인터페이스를 하나만 가지고 있고 예측가능한 이름 체계를 싫어한다면
  원래의 간단한 체계를 사용할 수 있는 다양한 방법이 있다. 그러나 이것이 지속
  가능할지는 알 수 없다. 다음에서 커널의 옵션을 설정하는 방법을 설명한다.
</p>
<p>
  1.1. <kbd>/etc/default/grub</kbd> 파일의
  <strong><kbd>GRUB_CMDLINE_LINUX_DEFAULT</kbd></strong
  >의 값으로 <strong><kbd>"net.ifnames=0"</kbd></strong
  >을 추가한다.
</p>
<pre class="language-none">
<code>GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet net.ifnames=0&quot;</code>
</pre>
<p>1.2. update-grub 명령어를 실행한다.</p>
<pre class="language-none">
<code># update-grub</code>
</pre>
<p>
  데비안 9를 새로 설치했다면 위까지 작업한 후 시스템을 재시작하면 eth0을 사용할
  수 있을 것이다. 그러나 영속적인 이름 체계를 사용하여
  <kbd>/etc/udev/rules.d/70-persistent-net.rules</kbd> 파일을 가지고 있다면
  추가적인 작업이 필요하다.
</p>
<p>
  1.3.
  <kbd>/etc/udev/rules.d/70-persistent-net.rules</kbd> 파일을 삭제하거나 이름을
  바꾼다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># cd /etc/udev/rules.d
# mv 70-persistent-net.rules 70-persistent-net.rules.old</code>
</pre>
<p>1.4. 다음의 명령어로 initrd를 재생성한다.</p>
<pre class="language-none line-numbers" data-line="1">
<code># update-initramfs -u
...</code>
</pre>
<p>1.5. 시스템을 재시작한다.</p>
<pre class="language-none">
<code># systemctl reboot</code>
</pre>

<h6>2. ssh로 접속하여 예측가능한 이름 체계로 변경하기</h6>
<p>
  ssh로 접속하여 원격 시스템의 네트워크 인터페이스 이름을 바꾸는 것은 신중하게
  해야 한다. 오타 하나 때문에 ssh로 접속할 수 없는 불상사가 발생한다. 내가
  사용하는 시스템이 모니터와 키보드 없이 구석에 자리하고 있는데 작업에서 실수가
  발생한다면 상당히 귀찮을 것이다. 시스템이 모니터와 키보드를 가지고 있어 콘솔로
  직접 접근할 수 있다면 작업은 좀 더 편할 것이다. 다음의 설명 중 @reboot cronjob
  등은 콘솔을 가지고 있다면 생략할 수 있으므로 참작하여 보자.
</p>
<p>
  2.1. 먼저 자신이 현재 사용하고 있는 네트워크 인터페이스 이름을 확인한다.
  여기에는 다양한 방법들이 있다.
</p>
<pre class="language-none">
<code># ip a
# cat /etc/udev/rules.d/70-persistent-net.rules
# echo /sys/class/net/[ew]*</code>
</pre>
<p>
  2.2. 영속적인 이름 체계에서 특별한 경우가 아니라면 eth0을 사용하고 있을
  것이다. 다음의 명령어로 eth0을 사용하고 있는 설정 파일들을 찾는다.
</p>
<pre class="language-none">
<code># grep -r eth0 /etc
...</code>
</pre>
<p>
  위의 결과로 나온 대부분은 주석으로 처리한 것이고 실제 변경이 필요한 파일은
  <strong><kbd>/etc/network/interfaces</kbd></strong
  >일 것이다.
</p>
<p>
  2.3. 다음의 명령어로 예측가능한 이름 체계에서 사용할 네트워크 인터페이스
  이름을 찾는다.
</p>
<pre class="language-none" data-line="1,4">
<code># udevadm test-builtin net_id /sys/class/net/eth0 2&gt; /dev/null
ID_NET_NAME_MAC=enxf46d04d4b9f6
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
ID_NET_NAME_PATH=enp3s0</code>
</pre>
<p>
  라인 4에서 나온 <kbd>enp3s0</kbd>이 내가 앞으로 사용해야 할 이름이다. 여러분이
  가지고 있는 하드웨어에 따라 이름은 달라질 것이다. VirtualBox 가상머신의
  데비안은 enp0s3 이름이 나온다.
</p>
<p>2.4. 다음으로 진행하기 전에 무언가 잘못되었을 때를 위한 대비책을 세우자!</p>
<p>2.4.1. 다음의 스크립트는 아래에서 작업할 내용을 복구하는 스크립트이다.</p>
<pre
  class="language-none line-numbers"
  data-line="3,7,8,10,11"
  data-label="/root/revoke_net.sh"
>
<code>#!/bin/bash

sleep 5m

ip a &gt;&gt; /root/network_interfaces.txt
mv -f /etc/network/interfaces /etc/network/interfaces.fail
cp -a -f /etc/network/interfaces.bak /etc/network/interfaces
cp -a -f /etc/udev/rules.d/70-persistent-net.rules.old /etc/udev/rules.d/70-persistent-net.rules
#cp -a -f /root/99-default.link /etc/systemd/network/99-default.link
update-initramfs -u
systemctl reboot</code>
</pre>
<p>
  이 스크립트를 부팅 시 실행할 수 있게 Crontab에 등록할 것이다. 라인 3은 5분을
  대기하기 위한 것이다. 시스템을 재시작하고 ssh로 접속을 할 수 있는지 확인한다.
  접속에 성공하면 이 스크립트를 실행하는 프로세스를 찾아 죽여야 한다. ssh 접속에
  실패한다면 5분 후 라인 5부터 복구 작업을 시작한다. 라인 5는 &#8216;ip -a&#8217; 명령어로
  네트워크 인터페이스의 이름을 확인하기 위한 것이다. 라인 6은 네트워크 이름
  <kbd>enp3s0</kbd>으로 변경했던 /etc/network/interfaces 파일의 이름을 변경하여
  보관해 둔다. 라인 7에서 기존의 eth0 이름을 가진 /etc/network/interfaces로
  복구한다. 라인 8은 /etc/udev/rules.d/70-persistent-net.rules 파일을 복구한다.
  라인 9는 가상머신에 설치한 데비안을 위한 것이다. 가상머신의 데비안을
  사용한다면 라인 8을 주석 처리하고 라인 9의 주석을 제거한다. 라인 10에서
  initrd를 재생성한다. 라인 11에서 시스템을 재시작한다. 시스템을 재시작하면
  기존의 eth0으로 다시 접속할 수 있을 것이다. 접속하자마자 위의 실행 프로세스를
  찾아 죽여야 한다.
</p>
<p>2.4.2. 다음의 명령으로 위에서 작성한 스크립트에 실행 모드를 추가한다.</p>
<pre class="language-none">
<code># chmod +x /root/revoke_net.sh</code>
</pre>
<p>
  2.4.3. <strong>crontab -e</strong> 명령어를 사용하여 다음의 내용을 추가한 후
  저장한다.
</p>
<pre class="language-none line-numbers" data-line="1,3">
<code># crontab -e
...
@reboot /root/revoke_net.sh</code>
</pre>
<p>
  <strong>crontab -l</strong> 명령어를 실행하여 제대로 등록하였는지 확인해 볼 수
  있다.
</p>
<p>2.5. /etc/network/interfaces 파일을 복구에 사용할 수 있도록 백업해 둔다.</p>
<pre class="language-none">
<code># cp -a /etc/network/interfaces /etc/network/interfaces.bak</code>
</pre>
<p>
  /etc/network/interfaces 파일에서 eth0을 2.3.에서 나온 <kbd>enp3s0</kbd>으로
  변경한다.
</p>
<pre class="language-none line-numbers" data-line="2,3">
<code>...
auto enp3s0
iface enp3s0 inet static
...</code>
</pre>
<p>
  2.6. <kbd>/etc/udev/rules.d/70-persistent-net.rules</kbd> 파일의 이름을
  바꾼다. 가상머신의 데비안이라면 /etc/systemd/network/99-default.link 파일을
  /root 디렉토리로 옮겨준다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># cd /etc/udev/rules.d
# mv 70-persistent-net.rules 70-persistent-net.rules.old</code>
</pre>
<p>2.7. 다음의 명령어로 initrd를 재생성한다.</p>
<pre class="language-none line-numbers" data-line="1">
<code># update-initramfs -u
...</code>
</pre>
<p>2.8. 시스템을 재시작한다.</p>
<pre class="language-none">
<code># systemctl reboot</code>
</pre>
<p>
  2.9. ssh로 접속해 본다. 접속에 성공한다면 다음과 같이 revoke_net.sh 스크립트를
  실행하는 프로세스를 찾아 죽인다.
</p>
<pre class="language-none line-numbers" data-line="1,3,5">
<code># ps -ef | grep revoke
root       723   717  0 14:58 ?        00:00:00 /bin/sh -c /root/revoke_net.sh
root       724   723  0 14:58 ?        00:00:00 /bin/bash /root/revoke_net.sh
root      1849  1779  0 14:58 pts/0    00:00:00 grep revoke
# kill -9 724
# ps -ef | grep revoke
root      1917  1779  0 14:59 pts/0    00:00:00 grep revoke</code>
</pre>
<p>
  2.10. &#8216;<strong>ip a</strong>&#8216; 명령어로 네트워크 인터페이스의 이름이
  <kbd>enp3s0</kbd>으로 나오는지 확인해 본다.
</p>
<p>
  2.11. 성공적으로 작업을 마쳤으면 정리에 들어간다.
  <strong>crontab -e</strong> 명령어를 사용하여 2.4.3.에서 추가한 &#8216;<kbd
    >@reboot /root/revoke_net.sh</kbd
  >&#8216;를 삭제한 후 저장한다. <strong>crontab -l</strong> 명령어로 확인해 본다.
  <kbd>/etc/network/interfaces.bak</kbd> 파일을 삭제한다.
  <kbd>/etc/udev/rules.d/70-persistent-net.rules.old</kbd> 파일은 따로
  보관하거나 삭제한다.
</p>
<h5>기존의 PostgreSQL 데이터베이스는 reindex 필요</h5>
<p>
  데비안 10은 <kbd>glibc</kbd> 로케일 데이터를 업그레이드하기 때문에
  PostgreSQL의 기존 데이터베이스에 대한 인덱스를 다시 만들어야 한다. 가능하다면
  PostgreSQL의 데이터베이스를 사용하는 응용 프로그램을 업그레이드가 끝날 때까지
  잠시 중단하는 것이 좋을 것이다. 업그레이드를 완료한 즉시 다음의 명령어를
  실행한다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># sudo -u postgres reindexdb --all
...</code>
</pre>

<h5>관련 글</h5>
<ul>
  <li>
    <a href="https://www.bitneer.dev/wp/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%84-%ec%83%88-%eb%b2%84%ec%a0%84%ec%9c%bc%eb%a1%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/" target="_blank" rel="noopener noreferrer">데비안을 새 버전으로 업그레이드하기</a
    >
  </li>
</ul>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://wiki.debian.org/NetworkInterfaceNames" target="_blank" rel="noopener noreferrer">NetworkInterfaceNames &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/" target="_blank" rel="noopener noreferrer">Predictable Network Interface Names</a
    >
  </li>
  <li>
    <a href="https://www.freedesktop.org/software/systemd/man/systemd.net-naming-scheme.html" target="_blank" rel="noopener noreferrer">systemd.net-naming-scheme — Network device naming schemes</a
    >
  </li>
  <li>
    <a href="https://www.debian.org/releases/buster/releasenotes" target="_blank" rel="noopener noreferrer">데비안 10 &#8212; 릴리스 노트</a
    >
  </li>
</ul><p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88-9stretch%ec%97%90%ec%84%9c-10buster%ec%9c%bc%eb%a1%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c-%ec%8b%9c-%ec%a3%bc%ec%9d%98-%ec%82%ac%ed%95%ad/">데비안 9(Stretch)에서 10(Buster)으로 업그레이드 시 주의 사항</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>데비안을 새 버전으로 업그레이드하기</title>
		<link>https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%84-%ec%83%88-%eb%b2%84%ec%a0%84%ec%9c%bc%eb%a1%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Wed, 17 Jun 2020 01:14:36 +0000</pubDate>
				<category><![CDATA[네트워크와 시스템 관리]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[upgrade]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=285</guid>

					<description><![CDATA[<div data-nosnippet>데비안은 정교한 패키지 관리 시스템을 가지고 있어 한 번 설치하면 재설치 없이 계속해서 새 버전으로 업그레이드할 수 있다. 이 글을 쓰는 데 사용하고 있는 시스템은 2011년 즈음에 버전 5.0(Lenny)을 설치한 이래로 버전 10(Buster)까지 왔다. 데비안은 게으른 사람에게 더할 나위 없는 리눅스 배포판이다. 현재 사용하는 버전 안에서의 업그레이드는 apt update &#38;&#38; apt upgrade 명령어로 한껏 여유를 부릴 수 있다. 새 버전으로 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%84-%ec%83%88-%eb%b2%84%ec%a0%84%ec%9c%bc%eb%a1%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/">데비안을 새 버전으로 업그레이드하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  데비안은 정교한 패키지 관리 시스템을 가지고 있어 한 번 설치하면 재설치 없이
  계속해서 새 버전으로 업그레이드할 수 있다. 이 글을 쓰는 데 사용하고 있는
  시스템은 2011년 즈음에 버전 5.0(Lenny)을 설치한 이래로 버전 10(Buster)까지
  왔다. 데비안은 게으른 사람에게 더할 나위 없는 리눅스 배포판이다. 현재 사용하는
  버전 안에서의 업그레이드는
  <strong>apt update &amp;&amp; apt upgrade</strong> 명령어로 한껏 여유를 부릴
  수 있다.
</p>
<p>
  <em>새 버전</em>으로 업그레이드하려면 조금은 부지런해야 한다. 제일 먼저
  업그레이드할 버전의 <em>릴리스 노트(Release Notes)</em>를 읽어 봐야 한다.
  릴리스 노트의 페이지 주소는
  <kbd
    >https://www.debian.org/releases/<strong>&lt;코드네임&gt;</strong>/releasenotes</kbd
  >다. 코드네임이 buster라면
  <a href="https://www.debian.org/releases/buster/releasenotes" target="_blank" rel="noopener noreferrer">https://www.debian.org/releases/buster/releasenotes</a
  >
  주소로 접속할 수 있다. 데비안 릴리스의 버전 넘버와 코드네임은
  <a href="https://wiki.debian.org/DebianReleases" target="_blank" rel="noopener noreferrer">DebianReleases &#8211; Debian Wiki</a
  >에서 볼 수 있다. 코드네임은 개발 단계에서 사용하고 이후에 버전 넘버를 붙인다.
  4.0(Etch) 이후로 버전 넘버는 1씩 규칙적으로 증가했지만, 그전에는 그렇지
  않았다.
</p>
<p>
  릴리스 노트의 PDF 문서는 50쪽 정도의 분량을 가진다. 아쉽게도 한글 번역 문서는
  없다. 그러나 새 버전으로 업그레이드하는 것이 처음이라면 한 번 읽어 볼 것을
  추천한다. 전체적인 내용을 통해 자신만의 업그레이드 절차를 만들어 보기를
  바란다. 다음번에 업그레이드할 때는 <strong>2장</strong>에서 새 버전의 전체적인
  내용을 대강 훑고, <strong>5장</strong>에서 자신이 설치한 패키지에 따라 영향을
  받을만한 것이 있는지 정도만 본다. 나머지 장의 내용은 거의 변하지 않기
  때문이다.
</p>
<p>
  이 글은 나의 관점에서 데비안을 새 버전으로 업그레이드할 때 릴리스 노트에
  기반하여 필요한 사전 지식과 절차를 정리한 것이다.
</p>
<h5>단계적 업그레이드</h5>
<p>
  버전 간의 업그레이드는 단계적으로 해야 한다. 예를 들면, 버전 8(Jessie)에서
  버전 10(Buster)으로 업그레이드하려면 먼저 버전 9(Stretch)로 업그레이드한 후
  다시 Buster로 업그레이드한다. 데비안 개발자가 직전 버전에서 새 버전으로
  업그레이드하는 것만을 테스트하기 때문에 단계적으로 업그레이드할 것을 제안하는
  것으로 보인다.
</p>
<h5>버전 업그레이드 시 추천하는 패키지 관리 도구</h5>
<p>
  릴리스 노트 <strong>4장</strong>에서 새 버전으로 업그레이드할 때 추천하는
  패키지 관리 도구는 가끔 달라질 때가 있다. <strong>aptitude</strong>를 추천한
  적도 있지만, 대부분은 <strong>apt-get</strong> 사용을 권장해 왔다. 데비안
  10(Buster)에서 처음으로 <strong>apt</strong>를 추천한다. apt는 apt-get과
  apt-cache의 기능을 합치고, 출력할 때 색깔을 사용하여 눈을 즐겁게 해준다.
  그러나 색깔이 들어간 코드로 인해 파싱 등을 위한 스크립트에서 사용하기에
  부적절하다. 다음은 업그레이드와 관련하여 apt-get을 apt로 대체할 수 있는 명령어
  목록이다.
</p>
<ul>
  <li>apt-get update → apt update</li>
  <li>apt-get upgrade → apt upgrade</li>
  <li>apt-get dist-upgrade → apt full-upgrade</li>
</ul>
<h5>/etc 설정 충돌</h5>
<p>
  /etc 디렉토리는 데비안 개발자(패키지 메인테이너)와 사용자가 충돌하는 영역이다.
  패키지에 중요한 설정의 변화가 있을 수 있다. 예를 들면 Apache 2.2에서 2.4로
  변경되었을 때 설정에 많은 차이가 있었다. 업그레이드 시 마지막 단계인 패키지의
  설정에서 이러한 충돌을 마주칠 것이다. 패키지 개발자의 설정으로 대체할 것인지
  사용자의 설정을 유지할 것인지 선택을 묻는다. 대부분 패키지 개발자의 설정으로
  대체하는 것이 좋다. 그러고 나서 나중에 내가 원하는 설정으로 변경해 준다. 내가
  했던 설정은 <kbd>.dpkg-old, .ucf-old</kbd> 등의 확장자를 가진 파일로 남아 있을
  것이다.
</p>
<p>
  업그레이드를 진행 중일 때는 정신이 없어서 어떤 패키지에서 무엇을 선택했는지
  잊어버릴 때가 있다. 그리고 간간이 보이는 경고 메시지도 신경 쓰인다. 화면이
  빠르게 지나가기 때문에 메시지를 잡아내기도 힘들다. 따라서
  <strong>script</strong> 프로그램으로 진행 상황을 기록하는 것이 좋다.
</p>
<p>script의 사용 방법을 간단히 알아보자.</p>
<pre class="language-none line-numbers" data-line="1,2,7,9">
<code># script --timing=test.time test.script
Script started, file is test.script
# free
              total        used        free      shared  buff/cache   available
Mem:       16345836     8126580     1408848     1259412     6810408     6622112
Swap:       2579452        1352     2578100
# exit
exit
Script done, file is test.script
#</code>
</pre>
<p>
  라인 1에서 script 명령어를 실행한다. <kbd>--timing=test.time</kbd> 옵션은
  <strong>scriptreplay</strong>에서 사용하기 위해 시간을 저장하는 것이다. 라인
  2에서 스크립트가 시작되었음을 알려 준다. 라인 3에서 free 명령어를 사용하여
  메모리의 정보를 본다. script의 기록을 위한 예제로 아무 명령어나 실행해 보자.
  라인 7에서 <strong>exit</strong> 명령어를 사용하여 script의 실행을 끝낸다.
  우리가 했던 행동은 <kbd>test.scirpt</kbd> 파일에 저장하고 있다.
</p>
<pre class="language-none" data-line="1">
<code># scriptreplay test.time test.script
# free
              total        used        free      shared  buff/cache   available
Mem:       16345836     8126580     1408848     1259412     6810408     6622112
Swap:       2579452        1352     2578100
# exit
exit

#</code>
</pre>
<p>
  script에서 <kbd>--timing</kbd> 옵션을 사용하였다면 라인 1과 같이 scriptreplay
  명령어로 우리가 했던 행동을 볼 수 있다. 데비안의 업그레이드 과정은 내용이
  많아서 scriptreplay로 한가하게 다시 보기를 하지는 않을 것이다. 스크립트
  파일(test.script)을 편집기로 보면서 검토하는 것이 빠르다.
</p>
<p>
  데비안 10에서 추천하는 &#8216;<strong>apt full-upgrade</strong>&#8216; 명령어는 색깔이
  들어가 있는 코드 때문에 script 프로그램하고는 맞지 않는다. 대신에
  <kbd><strong>/var/log/apt/term.log</strong></kbd> 파일에서 우리가 했던
  행동들을 볼 수 있다.
</p>
<h5>screen 사용</h5>
<p>
  ssh로 접속하여 업그레이드한다면 <strong>screen</strong>을 사용해야 한다.
  네트워크 관련 패키지를 업그레이드할 때 ssh 세션이 끊어질 수 있기 때문이다.
  또는 ssh 클라이언트를 사용하는 윈도우 운영체제의 컴퓨터가 업그레이드하면서
  컴퓨터를 다시 시작해 버릴 수도 있다. ssh 세션이 끊기면 ssh 서버 프로세스에서
  포크한 bash 쉘도 종료하고 업그레이드 작업이 중단될 것이다.
</p>
<p>
  screen 사용법에 대해 간단히 알아보자. screen을 설치하지 않았다면 다음의
  명령어로 screen 패키지를 설치한다.
</p>
<pre class="language-none">
<code># apt install screen</code>
</pre>
<p>
  다음과 같이 screen 명령어를 실행한다. 실행 후 <kbd>&lt;Space&gt;</kbd>나
  <kbd>&lt;Return&gt;</kbd> 키를 눌러 작업을 시작한다.
</p>
<pre class="language-none">
<code># screen</code>
</pre>
<p>
  현재 상태를 유지하면서 screen 세션에서 빠져나오려면
  <kbd>&lt;Ctrl + a&gt;</kbd> 키를 누른 후 이어서 <kbd>&lt;d&gt;</kbd> 키를
  누른다. (detach)
</p>
<p>
  다시 이전에 작업하던 screen 세션으로 들어가려면 다음의 명령어를 실행한다.
  (reattach) 업그레이드 도중 ssh 세션이 끊어져 다시 접속했을 때에도 다음의
  명령어를 실행하여 작업을 계속할 수 있다.
</p>
<pre class="language-none" data-line="1">
<code># screen -Dr</code>
</pre>
<p>
  screen 세션을 종료하려면 screen의 쉘에서 exit 명령어를 실행한다. 또는
  <kbd>&lt;Ctrl + a&gt;</kbd> 키에 이어서 <kbd>&lt;k&gt;</kbd> 키를 누른 후
  종료를 확인하는 메시지가 나오면 <kbd>y</kbd>를 입력한다.
</p>
<pre class="language-none">
<code># exit</code>
</pre>

<h5>sources.list와 서드파티 저장소</h5>
<p>
  새 버전으로 업그레이드하려면 <kbd>/etc/apt/sources.list</kbd> 파일을 변경해야
  한다. 다음은 데비안 9(Stretch)의 sources.list 파일의 예이다.
</p>
<pre class="language-none" data-label="/etc/apt/sources.list">
<code># stretch
deb http://deb.debian.org/debian/ stretch main contrib non-free
deb-src http://deb.debian.org/debian/ stretch main contrib non-free

# stretch - security updates
deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free

# stretch-updates
deb http://deb.debian.org/debian/ stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian/ stretch-updates main contrib non-free</code>
</pre>
<p>
  <kbd>stretch</kbd> 코드네임을 업그레이드하려는 <kbd>buster</kbd>로 모두
  변경하면 된다.
</p>
<p>
  데비안에 없는 패키지를 제공하는 비공식 APT 저장소를 서드파티
  저장소(third-party repository)라고 부른다. 나의 경우
  <a href="https://adoptopenjdk.net/installation.html#linux-pkg" target="_blank" rel="noopener noreferrer">AdoptOpenJDK</a
  >,
  <a href="https://docs.microsoft.com/en-us/dotnet/core/install/linux-debian" target="_blank" rel="noopener noreferrer">.NET Core SDK</a
  >,
  <a href="https://github.com/nodesource/distributions/blob/master/README.md#debinstall" target="_blank" rel="noopener noreferrer">Node.js</a
  >,
  <a href="https://www.virtualbox.org/wiki/Linux_Downloads" target="_blank" rel="noopener noreferrer">VirtualBox</a
  >
  네 개가 있다. 일반적으로 서드파티 저장소의 GPG 키는
  <kbd>/etc/apt/trusted.gpg</kbd> 파일이나
  <kbd>/etc/apt/trusted.gpg.d</kbd> 디렉토리에 추가하고 저장소의 설정은
  <kbd>/etc/apt/sources.list</kbd> 파일이나
  <kbd>/etc/apt/sources.list.d</kbd> 디렉토리에 추가한다. 나는 일관성을 위해
  저장소의 설정은 <kbd>/etc/apt/sources.list.d</kbd> 디렉토리에 다음의 파일로
  관리한다. 파일 이름은 .list 확장자를 가져야 한다.
</p>
<ul>
  <li>adoptopenjdk.list</li>
  <li>microsoft-prod.list</li>
  <li>nodesource.list</li>
  <li>virtualbox.list</li>
</ul>
<p>
  새 버전으로 업그레이드하려면 위의 파일들도 수정해 주어야 한다. 몇 가지 예를
  보자. 다음은 데비안 9(Stretch)의 <kbd>nodesource.list</kbd> 파일의 내용이다.
</p>
<pre
  class="language-none"
  data-line="1"
  data-label="/etc/apt/sources.list.d/nodesource.list"
>
<code>deb https://deb.nodesource.com/node_10.x stretch main
deb-src https://deb.nodesource.com/node_10.x stretch main</code>
</pre>
<p>
  위의 <kbd>stretch</kbd> 코드네임을 업그레이드하려는 <kbd>buster</kbd>로
  변경해야 한다.
  <a href="https://deb.nodesource.com/node_10.x/dists/buster/" target="_blank" rel="noopener noreferrer">https://deb.nodesource.com/node_10.x/dists/buster/</a
  >
  주소로 접속하여 <em>buster 저장소</em>의 존재를 확인할 수 있다. 저장소 설정의
  URL에서 <kbd><strong>dists</strong></kbd
  >는 관례로 생략하기 때문에 실제 주소에는 추가해야 한다.
</p>
<p>
  마이크로소프트의 .NET Core 저장소는 특이하게 URL에 데비안의 버전 넘버가 있다.
  다음은
  <kbd>microsoft-prod.list</kbd> 파일의 내용이다.
</p>
<pre
  class="language-none"
  data-line="1"
  data-label="/etc/apt/sources.list.d/microsoft-prod.list"
>
<code>deb [arch=amd64] https://packages.microsoft.com/debian/9/prod stretch main</code>
</pre>
<p>
  코드네임을 <kbd>buster</kbd>로 변경하는 것에 더하여
  <strong><kbd>9</kbd></strong
  >를 <strong><kbd>10</kbd></strong
  >으로 수정해야 한다.
  <a href="https://packages.microsoft.com/debian/10/prod/dists/buster/" target="_blank" rel="noopener noreferrer">https://packages.microsoft.com/debian/10/prod/dists/buster/</a
  >
  주소로 접속하여 저장소를 확인할 수 있다.
</p>
<h5>업그레이드 절차</h5>
<p>
  새 버전으로 업그레이드하는 것은 보통 2년 정도의 주기를 가진다. 긴 기간 동안
  업그레이드 작업 절차는 잊히기 쉽고 한 번만 하고 끝나는 것이 아니므로 정리해 둘
  필요가 있다.
</p>
<ol>
  <li>
    <kbd>https://www.debian.org/releases/&lt;코드네임&gt;/releasenotes</kbd>에서
    릴리스 노트를 확인한다. <strong>2장</strong>에서 새 버전의 전체적인 내용을
    대강 훑고, <strong>5장</strong>에서 문제가 발생할 만한 것이 있는지 본다.
    <strong>4장</strong>에서 추천하는 패키지 관리 도구 정도를 확인한다.
  </li>
  <li>
    데이터와 설정 정보들을 백업한다. 나의 경우 데이터베이스를 포함하여 서버
    전체를 백업하는 스크립트를 사용한다.
  </li>
  <li>
    <kbd>/etc/apt/sources.list</kbd> 파일에서 현재 코드네임을 업그레이드할
    코드네임으로 변경한다.
  </li>
  <li>
    <kbd>/etc/apt/sources.list.d</kbd> 디렉토리에서 서드파티 저장소에 대한 설정
    파일을 변경한다.
  </li>
  <li>
    screen을 실행한다.
    <pre class="language-none">
<code># screen</code>
</pre>
  </li>
  <li>
    script를 실행한다.
    <pre class="language-none">
<code># script --timing=upgrade.time upgrade.script</code>
</pre>
  </li>
  <li>
    패키지 리스트를 업데이트한다.
    <pre class="language-none">
<code># apt update</code>
</pre>
  </li>
  <li>
    최소한의 시스템 업그레이드를 실행한다.
    <pre class="language-none">
<code># apt-get upgrade</code>
</pre>
  </li>
  <li>
    시스템 업그레이드를 실행한다.
    <pre class="language-none">
<code># apt full-upgrade</code>
</pre>
  </li>
  <li>
    업그레이드 진행 중에 발생했던 <kbd>/etc</kbd> 디렉토리의 설정 충돌을
    해결한다. 데비안 개발자의 설정에 자신이 원하는 설정을 추가한다.
    <kbd><strong>/var/log/apt/term.log</strong></kbd
    >나 <strong><kbd>upgrade.script</kbd></strong> 파일을 참고할 수 있다.
  </li>
  <li>
    script를 종료하고 screen 세션을 종료한다.
    <pre class="language-none">
<code># exit
...
# exit</code>
</pre>
  </li>
  <li>
    새로운 커널을 반영하기 위해 시스템을 재시작한다.

    <pre class="language-none">
<code># systemctl reboot</code>
</pre>
  </li>
  <li>
    삭제한 패키지의 설정 파일이 남아 있는 것을 찾아 제거한다.
    <pre class="language-none">
<code># aptitude search '~c'
# aptitude purge '~c'</code>
</pre>
  </li>
  <li>
    aptitude를 실행하고
    <strong>Obsolete and Locally Created Packages</strong> 카테고리에서 쓸모가
    없어진 패키지를 선택적으로 삭제한다.
  </li>
</ol>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://wiki.debian.org/DebianReleases" target="_blank" rel="noopener noreferrer">DebianReleases - Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://www.debian.org/releases/buster/releasenotes" target="_blank" rel="noopener noreferrer">데비안 10 -- 릴리스 노트</a
    >
  </li>
  <li>
    <a href="https://wiki.debian.org/SourcesList" target="_blank" rel="noopener noreferrer">SourcesList - Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://wiki.debian.org/DebianRepository/UseThirdParty" target="_blank" rel="noopener noreferrer">DebianRepository/UseThirdParty - Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://www.debian.org/doc/manuals/debian-faq/index.en.html" target="_blank" rel="noopener noreferrer">The Debian GNU/Linux FAQ</a
    >
  </li>
  <li>
    <a href="https://www.debian.org/doc/manuals/debian-reference/" target="_blank" rel="noopener noreferrer">Debian Reference</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%84-%ec%83%88-%eb%b2%84%ec%a0%84%ec%9c%bc%eb%a1%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%ed%95%98%ea%b8%b0/">데비안을 새 버전으로 업그레이드하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>데비안의 MariaDB 설치와 설정</title>
		<link>https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%98-mariadb-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Wed, 10 Jun 2020 23:21:35 +0000</pubDate>
				<category><![CDATA[데이터베이스 시스템]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[mariadb]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=627</guid>

					<description><![CDATA[<div data-nosnippet>데비안 9(Stretch)부터 MariaDB는 디폴트 MySQL 변종이다. 즉, MariaDB가 기존의 MySQL을 완전히 대체한다. 데비안 8(Jessie)의 MySQL 버전은 5.5이다. 내가 사용하는 Confluence 등이 MySQL 5.5를 지원하지 않았기 때문에 MySQL Community의 MySQL 5.6을 설치해야 했다. 최근에 Confluence, Jira, Bitbucket의 MySQL 데이터베이스를 PostgreSQL로 이전하였다. 워드프레스의 데이터베이스만이 MySQL에 남았다. 워드프레스는 현재 공식적으로 MySQL과 MariaDB만을 지원한다. 정교한 데비안 패키지 관리의 이점을 얻기 위해 MariaDB로 돌아갈 것이다. ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%98-mariadb-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95/">데비안의 MariaDB 설치와 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  데비안 9(Stretch)부터 MariaDB는 <em>디폴트 MySQL</em> 변종이다. 즉, MariaDB가
  기존의 MySQL을 완전히 대체한다. 데비안 8(Jessie)의 MySQL 버전은 5.5이다. 내가
  사용하는 Confluence 등이 MySQL 5.5를 지원하지 않았기 때문에
  <a href="https://www.mysql.com/products/community/" target="_blank" rel="noopener noreferrer">MySQL Community</a
  >의 MySQL 5.6을 설치해야 했다. 최근에 Confluence, Jira, Bitbucket의 MySQL
  데이터베이스를 PostgreSQL로 이전하였다. 워드프레스의 데이터베이스만이 MySQL에
  남았다. 워드프레스는 현재 공식적으로 MySQL과 MariaDB만을 지원한다. 정교한
  데비안 패키지 관리의 이점을 얻기 위해 MariaDB로 돌아갈 것이다. MariaDB 설치 후
  처음에 마주칠 수 있는 unix_socket 인증과 튜닝 등의 설정을 정리해 본다.
</p>
<h5>MariaDB 설치</h5>
<p>
  MySQL Community의 MySQL 패키지를 설치했다면 완전히 삭제하는 것이 필요하다.
  패키지의 의존성 문제로 삭제에 애를 먹을 수 있는데
  <strong>apt-get remove &#8211;purge &#8216;mysql-.*&#8217;</strong> 명령어를 사용하여 mysql
  관련 패키지를 모두 제거하는 편법을 사용해야 한다.
  <em>패키지를 삭제하기 전에</em> mysqldump로 데이터베이스를 백업하고 /etc/mysql
  디렉토리 안의 my.cnf 등 설정 파일을 백업하는 것이 좋을 것이다.
</p>
<p>
  데비안 9(Stretch) 또는 10(Buster)에서
  <strong>apt install mariadb-server</strong> 명령어로 MariaDB를 설치할 수 있다.
  데비안 9는 MariaDB 10.1을 데비안 10은 MariaDB 10.3을 설치할 것이다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># apt update
# apt install mariadb-server</code>
</pre>
<p>
  데비안 패키지와 관련한 문서는
  <kbd>/usr/share/doc/&lt;패키지 이름&gt;</kbd> 디렉토리에 위치한다. 패키지 설치
  후 가장 먼저 찾아볼 문서이다. 참고로 README는 <em>실제 제작자(upstream)</em>의
  문서이고, README.Debian은 <em>데비안 개발자</em>(패키지 메인테이너)가 제공하는
  문서이다. MariaDB 서버와 관련하여 볼 만한 문서는
  <kbd>/usr/share/doc/mariadb-server-10.1</kbd> 또는
  <kbd>/usr/share/doc/mariadb-server-10.3</kbd> 디렉토리 안의
  <strong>README.Debian.gz</strong> 파일이다. gzip으로 압축이 되어 있으므로
  zmore나 zcat 명령어로 보거나 윈도우 운영체제에서는 7-Zip 등으로 압축을 풀어
  편집 프로그램을 사용하여 본다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># zmore /usr/share/doc/mariadb-server-10.3/README.Debian.gz
...
# zcat /usr/share/doc/mariadb-server-10.3/README.Debian.gz &gt; ~/mariadb-server.README.Debian</code>
</pre>

<h5>systemd</h5>
<p>
  MariaDB는 버전 10.1.8부터 systemd unit 파일을 제공한다. 데비안 패키지에서
  <kbd>/lib/systemd/system/mariadb.service</kbd> 파일이 이에 해당한다.
  mariadb.service는 편리를 위해 <kbd>mysql.service, mysqld.service</kbd> 별칭을
  가진다. systemctl 사용시 .service 접미사는 생략할 수 있다. 따라서 다음과 같이
  systemctl 명령어를 사용하여 MariaDB 서비스의 시작, 종료 등을 할 수 있다.
</p>
<pre class="language-none">
<code># systemctl status mariadb
# systemctl status mysql.service
# systemclt status mysqld
# systemctl stop mysqld.service
# systemctl start mysql
# systemctl restart mariadb.service</code>
</pre>

<h5>mysql_secure_installation을 실행할 필요가 없음</h5>
<p>
  데비안의 MariaDB 패키지는 보안을 적용한 상태이기 때문에 패키지 설치 후
  mysql_secure_installation 명령어를 실행할 필요는 없다. 어떤 보안 설정들을
  적용하였는지 살펴보자.
</p>
<pre class="language-none" data-line="1,8,13,15,17,19,21">
<code># mysql_secure_installation
...
In order to log into MariaDB to secure it, we&#039;ll need the current
password for the root user.  If you&#039;ve just installed MariaDB, and
you haven&#039;t set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] n
...
Remove anonymous users? [Y/n] y
...
Disallow root login remotely? [Y/n] y
...
Remove test database and access to it? [Y/n] y
...
Reload privilege tables now? [Y/n] y
...</code>
</pre>
<p>
  위의 내용은 mysql_secure_installation 실행 과정의 일부분을 발췌한 것이다. 라인
  8에서 현재 root 계정의 암호를 묻고 있다. 처음 설치 시에는 MariaDB에 대한 root
  계정의 암호가 없으므로 <kbd>&lt;Enter&gt;</kbd> 키를 누른다. 라인 13에서
  root의 암호를 설정할 것인지를 묻는다. unix_socket을 사용하여 root 계정을
  인증하기 때문에 <kbd>n</kbd>을 입력한다. 이후 나머지 설정에서는 모두
  <kbd>y</kbd>를 입력한다. 라인 15는 anonymous 사용자를 삭제한다. 라인 17은
  root의 원격 로그인을 허용하지 않는다. 라인 19는 test 데이터베이스를 삭제한다.
  라인 21은 보안 강화를 위해 변경한 내용을 바로 적용한다.
</p>
<p>
  데비안에서 MariaDB 패키지를 설치하면 <em>이미</em> 위와 같이 설정한 상태이다.
  데비안에서 라인 13처럼 MariaDB의 root 계정에 대한 암호를 설정하지 않는 데
  다음에서 이에 대해 알아볼 것이다.
</p>
<h5>Unix Socket 인증</h5>
<p>
  데비안은 MariaDB에서 <em>unix_socket 인증 플러그인</em>을 기본적으로 사용한다.
  unix_socket 인증 플러그인이 나오기 전에 MySQL이나 MariaDB는 데이터베이스를
  보호하기 위해 자체적인 인증을 사용하였다. 그래서 시스템에 모든 권한이 있는
  root 계정이라도 MySQL 내에 암호를 별도로 가져야 했다. mysql 클라이언트 사용 시
  root 계정임에도 불필요해 보이는 <strong>-u</strong>,
  <strong>-p</strong> 옵션을 사용해야만 했다. 데이터베이스의 백업 스크립트에서
  암호를 노출해야 하는 문제도 있었다.
</p>
<p>
  unix_socket 인증 플러그인은 시스템의 인증과 MariaDB의 인증을 함께 묶어 준다.
  로컬 시스템으로 접속하여 mysql 클라이언트 실행 시 -u, -p 옵션을 사용하지 않을
  수 있게 한다. 예제를 통해 좀 더 알아보자. 규모가 큰 조직에서 미숙한 신입 DB
  관리자가 들어왔다고 가정해 보자. 시스템 전체의 권한을 주지 않으면서
  데이터베이스의 관리 권한만 주고 싶다면 다음과 같이 한다.
</p>
<pre class="language-none" data-line="1-3,7">
<code># groupadd dbadmin
# useradd dbadmin -g dbadmin -m
# passwd dbadmin
새  암호:
새  암호 재입력:
passwd: 암호를 성공적으로 업데이트했습니다
# mysql -e &quot;GRANT ALL ON *.* TO &#039;dbadmin&#039;@&#039;localhost&#039; IDENTIFIED VIA unix_socket WITH GRANT OPTION&quot;</code>
</pre>
<p>
  라인 1에서 3까지 시스템에 <kbd>dbadmin</kbd> 계정을 만들고 암호를 설정한다.
  라인 7에서 unix_socket 인증을 사용하는 <kbd>dbadmin</kbd> 계정에
  데이터베이스의 모든 권한을 주는 SQL 문을 실행한다. 다른 ssh 세션에서
  <kbd>dbadmin</kbd>으로 로그인하여 <kbd>mysql</kbd> 클라이언트를 실행해 보자.
</p>
<pre class="language-none" data-line="1">
<code>$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 59
Server version: 10.3.22-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type &#039;help;&#039; or &#039;\h&#039; for help. Type &#039;\c&#039; to clear the current input statement.

MariaDB [(none)]&gt;</code>
</pre>
<p>
  라인 1에서 보듯이 -u, -p 옵션을 사용하지 않았다. 로컬 시스템의 dbadmin 계정과
  암호로 로그인하면 unix_socket 인증에 의해 mysql 클라이언트를 사용할 수 있는
  것이다.
</p>
<p>
  신입 DB 관리자가 자신의 컴퓨터에서
  <a href="https://dbeaver.io/" target="_blank" rel="noopener noreferrer">DBeaver</a
  >,
  <a href="https://www.jetbrains.com/ko-kr/datagrip/features/" target="_blank" rel="noopener noreferrer">DataGrip</a
  >
  같은 그래픽 도구로 MariaDB 서버에 접속하여 데이터베이스를 관리하고 싶다고
  해보자. 그리고 집에서도 접속하고 싶어 한다. 이럴 때는 unix_socket이 아니라
  password 인증을 사용해야 한다. 다음과 같이 작업한다.
</p>
<pre class="language-none" data-line="1,6,9,12,16-18,22">
<code>MariaDB [(none)]&gt; USE mysql;
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
MariaDB [mysql]&gt; GRANT ALL ON *.* TO &#039;dbadmin&#039;@&#039;192.168.10.%&#039; IDENTIFIED BY &#039;원하는 암호 입력&#039; WITH GRANT OPTION;
Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]&gt; GRANT ALL ON *.* TO &#039;dbadmin&#039;@&#039;%&#039; IDENTIFIED BY &#039;원하는 암호 입력&#039; WITH GRANT OPTION;
Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]&gt; SELECT user, host, password, plugin FROM user WHERE user=&#039;dbadmin&#039;;
+---------+--------------+-------------------------------------------+-------------+
| user    | host         | password                                  | plugin      |
+---------+--------------+-------------------------------------------+-------------+
| dbadmin | localhost    |                                           | unix_socket |
| dbadmin | 192.168.10.% | *CB04FE5BBC0DAAE405DB6DD0745827BCF1CF624D |             |
| dbadmin | %            | *CB04FE5BBC0DAAE405DB6DD0745827BCF1CF624D |             |
+---------+--------------+-------------------------------------------+-------------+
3 rows in set (0.000 sec)

MariaDB [mysql]&gt; DROP USER &#039;dbadmin&#039;@&#039;%&#039;;
Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]&gt;</code>
</pre>
<p>
  라인 1에서 라인 12의 SELECT 문을 사용하기 쉽게 mysql 데이터베이스로 이동한다.
  라인 6에서 암호 인증을 사용하는 dbadmin 계정에 데이터베이스의 모든 권한을
  주었다. <strong>&#8216;dbadmin&#8217;@&#8217;192.168.10.%&#8217;</strong>는 dbadmin이
  <kbd>192.168.10</kbd>의 네트워크에 있는 컴퓨터에서 접속할 수 있음을 의미한다.
  % 문자는 &#8216;모든&#8217;을 의미한다. 라인 9에서 <strong>&#8216;dbadmin&#8217;@&#8217;%&#8217;</strong>는
  네트워크 제한을 두지 않는다. dbadmin 계정은 어떤 IP에서든 접속할 수 있다.
  당연히 보안에 좋지 않다. 라인 12에서 <strong>SELECT</strong> 문을 사용하여
  dbadmin 사용자의 인증 방법과 접속할 수 있는 네트워크 대역을 확인한다. 라인
  22에서 <strong>DROP USER</strong> 문을 사용하여 &#8216;dbadmin&#8217;@&#8217;%&#8217; 사용자를
  삭제한다.
</p>
<p>
  원격으로 접속하기 위해서는 추가적인 설정이 필요하다. 이에 대해서는 아래의
  &#8216;원격 접속을 허용하기&#8217;에서 다룬다.
</p>
<h5>워드프레스의 데이터베이스 만들기</h5>
<p>
  응용 프로그램을 위한 데이터베이스 생성은 기존의 방식과 동일하게 암호 인증을
  사용한다. 워드프레스를 위한 데이터베이스와 사용자는 다음과 같이 만들 수 있다.
</p>
<pre class="language-none line-numbers" data-line="1,4">
<code>MariaDB [mysql]&gt; CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)

MariaDB [mysql]&gt; GRANT ALL ON wordpress.* TO &#039;wordpress&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;원하는 암호 입력&#039; WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]&gt;</code>
</pre>

<h5>MariaDB 설정 파일의 위치</h5>
<p>/etc/mysql/mariadb.cnf 파일을 보면 MariaDB 설정 파일은 다음과 같다.</p>
<ol>
  <li>/etc/mysql/mariadb.cnf</li>
  <li>/etc/mysql/conf.d/*.cnf</li>
  <li>/etc/mysql/mariadb.conf.d/*.cnf</li>
  <li>~/.my.cnf</li>
</ol>
<p>
  위의 순서로 설정 파일을 읽기 때문에 같은 옵션이 여러 번 나타난다면 가장
  마지막에 있는 설정을 적용할 것이다. MariaDB 서버와 관련한 설정은
  <kbd>/etc/mysql/mariadb.conf.d</kbd> 디렉토리 안의
  <kbd><strong>50-server.cnf</strong></kbd> 파일에서 한다.
</p>
<h5>원격 접속을 허용하기</h5>
<p>
  데비안의 MariaDB는 보안을 위해 <kbd>3306</kbd> 포트를 루프백(loop-back) 주소인
  <kbd>127.0.0.1</kbd>로 바인딩한다. 다음의 명령어로 확인할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># netstat -tlnp | grep mysql
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      12435/mysqld</code>
</pre>
<p>
  따라서 시스템 외부에서 접근할 수 없다. 시스템 외부에서 접근할 수 있도록 하려면
  <kbd><strong>50-server.cnf</strong></kbd> 파일에서 bind-address를 다음과 같이
  변경한다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code>bind-address            = 0.0.0.0</code>
</pre>
<p>변경한 설정을 반영하기 위해 MariaDB 서버를 다시 시작한다.</p>
<pre class="language-none">
<code># systemctl restart mariadb</code>
</pre>
<p>
  공유기(방화벽 역할)의 외부에서 오는 접근을 허용하려면 3306 포트에 대한 포트
  포워딩을 해야 한다. 보안에 좋지 않기 때문에 데이터베이스 서버의 포트를 여는
  경우는 거의 없을 것이다.
</p>
<h5>언어 설정</h5>
<p>
  데비안의 MariaDB에서 디폴트 <em>문자 집합(character set)</em>은
  <strong>utf8mb4</strong>이다. 디폴트 <em>데이터 정렬(collation)</em>은
  <strong>utf8mb4_general_ci</strong>이다. 데이터 정렬을
  <strong>utf8mb4_unicode_ci</strong>로 바꾸고 싶다면
  <kbd><strong>50-server.cnf</strong></kbd> 파일을 다음과 같이 편집한다.
</p>
<pre class="language-none" data-line="1,2">
<code>collation-server      = utf8mb4_unicode_ci
skip-character-set-client-handshake</code>
</pre>
<p>
  라인 1의 collation-server의 값을 utf8mb4_general_ci에서
  <strong>utf8mb4_unicode_ci</strong>로 변경한다. 라인 2의
  <strong>skip-character-set-client-handshake</strong>를 추가한다.
</p>
<p>
  MariaDB 서버를 다시 시작하고 MySQL 클라이언트를 다시 실행한 후 다음의 SQL
  문으로 변경을 확인한다.
</p>
<pre class="language-none" data-line="1">
<code>MariaDB [(none)]&gt; SHOW VARIABLES LIKE &#039;coll%&#039;;
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.001 sec)

MariaDB [(none)]&gt;</code>
</pre>
<p>
  MariaDB 서버의 데이터 정렬 설정은 MySQL 클라이언트 외에 다른
  <em>응용 프로그램</em>의 데이터 정렬을 강제하지는 않는다. 예를 들면
  <a href="https://www.adminer.org/" target="_blank" rel="noopener noreferrer">Adminer</a
  >는 collation_connection을 utf8mb4_general_ci로 나타낸다. 워드프레스의 일부
  플러그인은 utf8mb4_general_ci를 가지는 테이블을 만든다.
</p>
<h5>튜닝</h5>
<p>
  데이터베이스의 데이터는 &#8216;하드디스크 &gt; 메모리 &gt; CPU의 레지스터&#8217; 순으로
  옮겨간다. 오른쪽으로 갈수록 속도가 빠른 대신 저장 비용은 비싸진다.
  데이터베이스 읽기의 최적화는 디스크 입출력(I/O)을 최소화하고 메모리를 최대한
  사용하는 것이다. 단순하지만 중요한 개념이다. 데이터베이스 쓰기의 최적화는
  메모리의 휘발성으로 인해 간단하지 않다. 커밋(commit)한 데이터를 메모리에서
  디스크로 쓰기 전에 시스템 장애가 발생한다면 데이터를 잃을 것이다. 은행이나
  증권의 돈과 관련한 데이터라면 커밋 즉시 메모리에서 디스크로 써야 한다.
  안정성은 증가하지만, 성능은 준다. 게시판의 글에 대한 데이터라면 메모리를 좀 더
  활용하고 디스크에 쓰는 것을 늦출 수 있을 것이다. 데이터베이스 쓰기의 최적화는
  데이터의 종류에 따라 안정성과 성능 사이에서 고민해야 할 문제이다.
</p>
<p>
  MariaDB의 디폴트 스토리지 엔진(default_storage_engine)은 InnoDB이다. InnoDB와
  관련한 디폴트 설정값은 데스크톱 시스템에 맞게 되어 있다. 데이터베이스 전용의
  서버를 사용한다면 최적의 성능을 위해 설정값을 변경하여야 할 것이다. 전용의
  서버가 아니더라도 약간의 설정값 변경으로 성능 향상을 꾀할 수 있다. 나는
  <a href="https://mariadb.com/kb/en/configuring-mariadb-for-optimal-performance/" target="_blank" rel="noopener noreferrer">Configuring MariaDB for Optimal Performance</a
  >와
  <a href="https://mariadb.com/resources/blog/10-database-tuning-tips-for-peak-workloads/" target="_blank" rel="noopener noreferrer">10 Database Tuning Tips for Peak Workloads</a
  >
  페이지를 참고하여 3가지 정도의 설정만 추가하였다.
</p>
<pre
  class="language-none"
  data-line="1,2"
  data-label="/etc/mysql/mariadb.conf.d/50-server.cnf"
>
<code>innodb_buffer_pool_size=4096M
innodb_log_file_size=1024M
innodb_log_buffer_size=64M</code>
</pre>

<p>
  위의 설정은 모두 <kbd><strong>50-server.cnf</strong></kbd> 파일에 추가한다.
  라인 1의<strong> innodb_buffer_pool_size</strong>는 성능 최적화에 가장 중요한
  설정이다. 하나만 설정해야 한다면 이것을 해야 한다. 참고한 페이지에서는
  innodb_buffer_pool_size를 데이터베이스 전용의 서버일 때 메모리의
  <kbd>80%</kbd> 정도를 권장한다. Buffer Pool은 주로 데이터의 읽기와 관련한
  것으로 디스크보다는 메모리를 사용하기 위해 가능한 한 크게 설정하는 것을
  추천하고 있다. 데이터베이스 전용의 서버가 아니더라도 자신의 시스템 환경에 맞춰
  크게 설정하는 것이 좋겠다.
</p>

<p>
  InnoDB는 데이터를 디스크에 쓰기 전에 속도와 안정성을 목적으로 Redo Log를
  사용한다. Redo Log는 시스템 장애 발생 시 복구를 위해 변경 기록들을 저장한다.
  INSERT 문과 같은 데이터 변경이 발생한다면 그 데이터는 &#8216;Buffer Pool(메모리)
  &gt; Log Buffer(메모리) &gt; Redo Log(ib_logfile0, ib_logfile1 파일) &gt;
  테이블(디스크)&#8217;의 순으로 이동한다. Redo Log의 파일 크기인
  <strong>innodb_log_file_size</strong>는 innodb_buffer_pool_size의
  <kbd>1/4</kbd>에서 <kbd>1/2</kbd>까지를 권장한다. Log Buffer의 크기인
  <strong>innodb_log_buffer_size</strong>는 참고한 페이지에서 <kbd>64M</kbd>을
  추천하고 있다.
</p>
<p><strong>innodb_log_file_size</strong>의 변경은 다음의 절차로 한다.</p>
<ol>
  <li>MariaDB 서버를 종료한다.</li>
  <li>
    위 라인 2처럼 <kbd><strong>50-server.cnf</strong></kbd> 파일에
    <kbd>innodb_log_file_size</kbd> 설정을 추가한다.
  </li>
  <li>
    <kbd>/var/lib/mysql</kbd> 디렉토리에서 <kbd>ib_logfile0, ib_logfile1</kbd>을
    삭제하거나 다른 디렉토리로 옮긴다.
    (<strong>innodb_log_files_in_group</strong>의 디폴트 값이 <kbd>2</kbd>이기
    때문에 Redo Log 파일이 2개가 있다.)
  </li>
  <li>
    MariaDB 서버를 시작한다. 새로 설정한 크기의
    <kbd>ib_logfile0, ib_logfile1</kbd> 파일을 볼 수 있을 것이다.
  </li>
</ol>
<p>
  참고한 페이지에는 데이터 안정성과 관련한
  <strong>innodb_flush_log_at_trx_commit</strong>과
  <strong>sync_binlog</strong>, 동시 접속자 수에 대한
  <strong>max_connections</strong> 등을 다루고 있다. 나는 위 3개의 설정을
  제외하고 모두 디폴트 값을 사용할 것이어서 크게 관심을 가지지 않았지만,
  여러분에게 필요한 내용이 있을지 모르겠다.
</p>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://mariadb.com/kb/en/moving-from-mysql-to-mariadb-in-debian-9/" target="_blank" rel="noopener noreferrer">Moving from MySQL to MariaDB in Debian 9</a
    >
  </li>
  <li>
    <a href="https://serverfault.com/questions/111358/how-do-i-completely-remove-mysql-server-on-debian" target="_blank" rel="noopener noreferrer">How do I completely remove mysql-server on Debian?</a
    >
  </li>
  <li>
    <a href="https://mariadb.com/kb/en/systemd/" target="_blank" rel="noopener noreferrer">systemd</a
    >
  </li>
  <li>
    <a href="https://mariadb.com/kb/en/mysql_secure_installation/" target="_blank" rel="noopener noreferrer">mysql_secure_installation</a
    >
  </li>
  <li>
    <a href="https://mariadb.com/kb/en/authentication-plugin-unix-socket/" target="_blank" rel="noopener noreferrer">Authentication Plugin &#8211; Unix Socket</a
    >
  </li>
  <li>
    <a href="https://mariadb.com/kb/en/configuring-mariadb-for-optimal-performance/" target="_blank" rel="noopener noreferrer">Configuring MariaDB for Optimal Performance</a
    >
  </li>
  <li>
    <a href="https://mariadb.com/resources/blog/10-database-tuning-tips-for-peak-workloads/" target="_blank" rel="noopener noreferrer">10 Database Tuning Tips for Peak Workloads</a
    >
  </li>
  <li>
    <a href="https://mariadb.com/kb/en/innodb-system-variables/" target="_blank" rel="noopener noreferrer">InnoDB System Variables</a
    >
  </li>
  <li>
    <a href="https://mariadb.com/kb/en/server-system-variables/" target="_blank" rel="noopener noreferrer">Server System Variables</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%98-mariadb-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95/">데비안의 MariaDB 설치와 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Confluence, Jira, Bitbucket의 systemd unit 설정</title>
		<link>https://www.bitneer.dev/blog/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Wed, 27 May 2020 20:20:22 +0000</pubDate>
				<category><![CDATA[네트워크와 시스템 관리]]></category>
		<category><![CDATA[bitbucket]]></category>
		<category><![CDATA[confluence]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[systemd]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=532</guid>

					<description><![CDATA[<div data-nosnippet>2012년 즈음에 Confluence, Jira, Stash(Bitbucket의 이전 이름)를 데비안 시스템에 TAR.GZ Archive 파일을 사용하여 처음 설치하였다. 시작 스크립트는 공식적인 지원 대상이 아니고 그에 대한 문서의 내용도 부실해서 직접 만들어야 했다. Confluence, Jira, Stash가 Tomcat을 사용했기 때문에 데비안 6.0(Squeeze)의 Tomcat 6을 참고하여 init.d 스크립트를 작성했었다. Tomcat과 같이실제 제작자(upstream)의 소프트웨어는 데비안 개발자가 데비안의 정책에 맞게 패키지를 만든다. init.d 스크립트를 작성할 때 그것에 맞게 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/">Confluence, Jira, Bitbucket의 systemd unit 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  2012년 즈음에 Confluence, Jira, Stash(Bitbucket의 이전 이름)를 데비안 시스템에
  TAR.GZ Archive 파일을 사용하여 처음 설치하였다. 시작 스크립트는 공식적인 지원
  대상이 아니고 그에 대한 문서의 내용도 부실해서 직접 만들어야 했다. Confluence,
  Jira, Stash가 Tomcat을 사용했기 때문에 데비안 6.0(Squeeze)의 Tomcat 6을
  참고하여 init.d 스크립트를 작성했었다. Tomcat과 같이<em
    >실제 제작자(upstream)</em
  >의 소프트웨어는 데비안 개발자가 데비안의 정책에 맞게 패키지를 만든다. init.d
  스크립트를 작성할 때 그것에 맞게 하려고 했고 아래에 나올 내용인 사용자와 그룹
  생성, 설치 디렉토리와 홈 디렉토리가 그를 반영한 것이다.
</p>
<p>
  데비안 8(Jessie)에서 systemd가 디폴트 시작 시스템으로 완전히 들어왔다. 한동안
  데비안 7(Wheezy)에서 업그레이드를 해야 할지 주저했던 기억이 난다. 그러나
  systemd는 SysV 스크립트 파일을 분석하고 변환하는 방식으로 하위 호환성을
  제공하였다. 내가 작성한 구식의 스크립트는 살아남을 수 있었다.
</p>
<p>
  최근에 MySQL에서 PostgreSQL로 옮기는 작업을 진행하면서 init.d 스크립트도
  버리기로 하였다. 관리의 측면에서 Confluence, Jira, Bitbucket의 서비스 설정은
  init.d 스크립트보다는 systemd unit 설정 파일이 더 낫다. 업그레이드되면서 환경
  변수 등이 변한다면 init.d 스크립트도 이를 반영해야 할 경우가 생기기 때문이다.
</p>
<h5>사용자와 그룹 생성</h5>
<p>
  보안상의 이유로 데몬(서비스)은 root 관리자 계정으로 실행하지 말아야 한다. 보안
  취약점을 이용하여 악의적인 사용자가 root 권한이 있는 데몬을 사용한다면
  시스템에 재앙을 가져온다. 따라서 서비스는 일반 사용자로 실행하여야 한다.
</p>
<p>
  Confluence 서비스에서 사용할 confluence 그룹과 confluence 사용자를 생성하기
  위해 다음과 같이 한다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># groupadd confluence
# useradd confluence -M -g confluence -d /opt/share/confluence -s /bin/false</code>
</pre>
<p>
  위의 useradd 명령어에서 <strong>-d</strong> 옵션으로 홈 디렉토리는 지정하지만
  <strong>-M</strong> 옵션으로 홈 디렉토리를 생성하지 않는다. confluence
  사용자는 서비스 실행만을 위해 존재하기 때문에 홈 디렉토리를 생성할 필요는
  없다. 마찬가지로 로그인 시 사용할 쉘을 지정하는 <strong>-s</strong> 옵션에서
  <kbd>/bin/false</kbd>로 하여 로그인을 허용하지 않는다. jira와 bitbucket도 위의
  confluence가 나온 부분을 대체하여 사용자와 그룹을 만들어 줄 수 있다.
</p>
<p>데비안의 tomcat6 패키지와 비교해 보자.</p>
<pre class="language-none line-numbers" data-line="2,4">
<code># cat /etc/passwd | grep tomcat6
tomcat6:x:109:115::/usr/share/tomcat6:/bin/false
# cat /etc/passwd | grep confluence
confluence:x:1002:1002::/opt/share/confluence:/bin/false</code>
</pre>
<p>
  사용자와 그룹을 한꺼번에 삭제하고 싶다면 &#8216;deluser&#8217; 명령어를 사용한다. 다음의
  명령어는 stash 사용자와 그룹을 한 번에 제거한다.
</p>
<pre class="language-none">
<code># deluser stash</code>
</pre>

<h5>설치 디렉토리와 홈 디렉토리</h5>
<p>
  Confluence, Jira, Bitbucket을 어느 디렉토리에 설치하는 것이 좋을까? 데비안
  개발자가 패키지를 만들면서 신경 쓰지 않는 /opt, /srv, /usr/local, /home
  디렉토리가 적당해 보인다. 나는 위의 사용자 생성에서 보듯이 /opt/share 디렉토리
  안에 confluence, jira, bitbucket으로 선택했다. 데비안에서 운영체제에
  종속적이지 않은 Tomcat 같은 패키지는 /usr/share 디렉토리에 들어간다. 그래서
  /opt/share로 하였다. 이것은 취향의 문제로 여러분은 다른 곳에 설치할 수 있다.
</p>
<p>
  보안 측면을 짚어 보기 위해 좀 더 살펴본다.
  <a href="https://www.atlassian.com/software/confluence/download" target="_blank" rel="noopener noreferrer">Download Confluence Server</a
  >,
  <a href="https://www.atlassian.com/software/jira/download" target="_blank" rel="noopener noreferrer">Download Jira Software Server</a
  >,
  <a href="https://www.atlassian.com/software/bitbucket/download" target="_blank" rel="noopener noreferrer">Download Bitbucket Server</a
  >에서 TAR.GZ Archive 파일을 다운로드 할 수 있다. 다운로드한 파일을
  /opt/share로 복사한 후 다음의 작업을 한다. 여기서는 Confluence만 예제로
  보인다. Jira와 Bitbucket도 confluence가 나온 부분을 jira와 bitbucket으로
  변경하여 같은 작업을 할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="4-7">
<code># cd /opt/share
# tar zxvf atlassian-confluence-&lt;version&gt;.tar.gz
# mv atlassian-confluence-&lt;version&gt; confluence
# chown -R root:root confluence
# chown -R confluence:confluence confluence/logs
# chown -R confluence:confluence confluence/temp
# chown -R confluence:confluence confluence/work</code>
</pre>
<p>
  보안을 강화하기 위해 라인 4에서 7까지 파일의 소유자와 그룹을 설정하였다.
  confluence 사용자로 실행하는 Confluence 데몬은 logs, temp, work 디렉토리에만
  쓰기 권한을 가진다. 다른 곳은 사용자와 그룹을 root 소유로 설정하였기 때문에
  confluence 사용자로 실행하는 서비스는 파일을 저장할 수 없다.
</p>
<p>
  데비안의 Tomcat 패키지 방식으로 하려면 몇 가지 작업을 더 해야 한다. logs, work
  디렉토리는 /var/lib/confluence 안에 들어가야 하고 temp 디렉토리는 /tmp 안에
  위치해야 한다. 그러나 이 디렉토리들은 중요도가 떨어지고 업그레이드할 때마다
  해주기 번거롭기 때문에 그렇게까지는 하지 않았다.
</p>
<p>
  Confluence, Jira, Bitbucket은 데이터를 사용자가 설정하는 홈 디렉토리에
  저장한다. 어디로 설정하는 것이 좋을까? /var 디렉토리는 변하는 데이터를
  저장하는 곳이기에 적당하다. 데비안의 패키지는 /var/lib 디렉토리를 사용한다.
  나는 /var/local/lib 디렉토리 안의 confluence, jira, bitbucket으로 설정했다.
  /var/local은 데비안 개발자가 관심을 두지 않는 곳이기 때문에 선택했다. 이 역시
  취향 문제다.
</p>
<p>
  Confluence의 홈 디렉토리를 생성하기 위해 다음과 같이 한다. Jira와 Bitbucket도
  confluence가 나온 부분을 변경하여 같은 작업을 할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="4">
<code># mkdir -p /var/local/lib/confluence
# cd /var/local/lib
# chown confluence:confluence confluence
# chmod g-s confluence</code>
</pre>
<p>
  mkdir 명령어의 <strong>-p</strong> 옵션은 상위 디렉토리인 lib가 존재하지 않을
  때 생성하라는 의미이다. 라인 3에서 confluence 사용자로 실행하는 Confluence
  데몬이 쓸 수 있도록 사용자와 그룹의 소유주를 confluence로 설정한다. 라인 4는
  /var/local/lib/confluence 디렉토리의 스티키 비트(sticky bit)를 사용하지
  않으므로 제거한 것이다. 데비안에서 /var/local 디렉토리는 그룹에 스티키 비트가
  설정되어 있어서 디렉토리나 파일을 생성하면 스티키 비트가 붙는다.
</p>
<p>
  추가로 데이터베이스를 만들고 홈 디렉토리 설정 등을 한다면 Confluence, Jira,
  Bitbucket을 설치할 준비를 마친 것이다. 이제 이 글의 주제인 systemd unit
  설정으로 넘어가자.
</p>
<h5>systemd unit 설정</h5>
<p>
  시스템의 전원을 켜면 복잡한 여러 부트 단계를 거쳐 PID=1을 가지는 init
  프로그램이 실행된다. init 프로그램은 모든 프로세스의 최상위 조상이고 시작 시
  필요한 프로그램을 실행한다. 데비안 jessie 이후로 init 프로그램인 /sbin/init은
  /lib/systemd/systemd에 대한 심볼릭 링크이다. systemd init 프로세스는 다음의
  디렉토리에서 unit 설정 파일을 읽어 들여 <em>병렬적(parallel)</em>으로
  프로세스들을 생산한다. 병렬적이기 때문에 기존의 <em>순차적</em>인 SysV
  init보다 빠르다.
</p>
<ul>
  <li>/lib/systemd/system : 운영체제의 디폴트 설정 파일</li>
  <li>/etc/systemd/system : 시스템 관리자의 설정 파일</li>
  <li>/run/systemd/system : 실행 시간에 만들어지는 설정 파일</li>
</ul>
<p>
  unit 설정 파일의 접미사에 따라 서비스(.service), 장치(.device),
  마운트(.mount), unit 설정 파일의 그룹(.target) 등 다양한 타입이 있다.
  Confluence, Jira, Bitbucket의 서비스를 위해 /etc/systemd/system 디렉토리 안에
  .service로 끝나는 unit 설정 파일을 만들 것이다.
</p>
<p>
  Confluence의 unit 설정 파일인 /etc/systemd/system/confluence.service의 내용은
  다음과 같다.
</p>
<pre
  class="language-none line-numbers"
  data-line="7-10"
  data-label="/etc/systemd/system/confluence.service"
>
<code>[Unit]
Description=Atlassian Confluence
After=network.target

[Service]
Type=forking
User=confluence
PIDFile=/opt/share/confluence/work/catalina.pid
ExecStart=/opt/share/confluence/bin/start-confluence.sh
ExecStop=/opt/share/confluence/bin/stop-confluence.sh

[Install]
WantedBy=multi-user.target</code>
</pre>
<p>
  프로그램의 흐름을 따라가는 <em>절차적</em>인 SysV init 스크립트와 비교하면
  unit 설정 파일은 <em>선언적</em>으로 이해하기 쉽다. unit 설정 파일은 윈도우
  운영체제의 .ini 확장자를 지닌 설정 파일에서 사용하는 문법을 사용한다. 대괄호의
  절(section)로 시작하여 한 줄마다 &#8216;변수=값&#8217;으로 이루어진다. 변수는
  지시자(directive)라 부른다. unit 설정 파일은 [Unit], [Install] 절을 기본적으로
  가져야 한다. 서비스 unit 설정 파일은 추가로 [Service] 절을 반드시 포함해야
  한다.
</p>
<p>
  [Unit] 절은 unit의 일반적인 정보를 지닌다. 라인 2의 Description 지시자에는
  unit의 원하는 이름을 넣어준다. 종속성 지시자인 After는 먼저 실행돼야 하는
  unit을 지정한다. Confluence는 웹 서버이므로 시스템의 네트워크 설정이 먼저
  이루어지는 것이 필요하다. 따라서 라인 3에서 네트워크 관련 unit들은 모아 놓은
  network.target을 설정한다.
</p>
<p>
  [Install] 절은 unit을 설치하기 위한 정보로 systemd가 사용하지 않는다. 아래에서
  볼 systemctl의 enable과 disable에서 이 절을 사용하여 심볼릭 링크를 만들거나
  삭제한다. SysV의 런레벨과 비슷한 것으로 multi-user.target은 런레벨 2에서 4에
  해당한다. &#8216;<kbd>ls -al /lib/systemd/system/runlevel*</kbd>&#8216; 명령어로 확인해 볼
  수 있다.
</p>
<p>
  [Service] 절은 서비스 unit을 위한 것이다. 라인 6의 Type=forking은 라인 9의
  ExecStart에서 설정한 start-confluence.sh가 fork()를 호출할 것임을 의미한다.
  전통적인 UNIX 서비스가 행동하는 방식으로 Tomcat도 이처럼 한다. Type을
  forking으로 한다면 PIDFile의 설정을 권고하고 있다. 라인 8에서 Confluence가
  사용하는 Tomcat의 PID 파일의 위치를 설정한다. 라인 10의 ExecStop에서 서비스
  종료에 사용할 파일을 지정한다. 라인 7에서 서비스를 실행할 사용자로
  confluence를 설정한다.
</p>
<p>Jira의 unit 설정 파일은 다음과 같다.</p>
<pre
  class="language-none line-numbers"
  data-line="7-10"
  data-label="/etc/systemd/system/jira.service"
>
<code>[Unit]
Description=Atlassian Jira
After=network.target

[Service]
Type=forking
User=jira
PIDFile=/opt/share/jira/work/catalina.pid
ExecStart=/opt/share/jira/bin/start-jira.sh
ExecStop=/opt/share/jira/bin/stop-jira.sh

[Install]
WantedBy=multi-user.target</code>
</pre>
<p>Bitbucket의 unit 설정 파일은 다음과 같다.</p>
<pre
  class="language-none line-numbers"
  data-line="7-10"
  data-label="/etc/systemd/system/bitbucket.service"
>
<code>[Unit]
Description=Atlassian Bitbucket
After=network.target

[Service]
Type=forking
User=bitbucket
PIDFile=/opt/share/bitbucket/work/catalina.pid
ExecStart=/opt/share/bitbucket/bin/start-bitbucket.sh
ExecStop=/opt/share/bitbucket/bin/stop-bitbucket.sh

[Install]
WantedBy=multi-user.target</code>
</pre>

<h5>systemctl 사용한 unit 설정의 활성화, 시작, 종료 등</h5>
<p>
  다음에서 Confluence에 대한 명령문의 실행 예만 든다. Jira와 Bitbucket도
  confluence가 나온 부분을 jira와 bitbucket으로 변경하여 실행할 수 있다. 명령문
  실행에서 서비스를 나타내는 .service 접미사는 생략할 수 있다. 예를 들면
  confluence.service 대신 confluence를 사용하여 타이핑을 줄일 수 있다. bash에서
  &lt;TAB&gt; 키로 자동 완성 기능을 사용한다면 큰 의미는 없다.
</p>
<p>
  unit 설정 파일을 새로 만들었거나 변경했다면 systemd가 그것을 알 수 있게 다음의
  명령어를 실행한다.
</p>
<pre class="language-none">
<code># systemctl daemon-reload</code>
</pre>
<p>
  시스템 부팅 시에 서비스를 실행하려면 다음의 명령어를 실행한다. [Install] 절의
  WantedBy 지시자 값으로 설정한 multi-user.target의 디렉토리에서 심볼릭 링크로
  연결된다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># systemctl enable confluence.service
Created symlink /etc/systemd/system/multi-user.target.wants/confluence.service → /etc/systemd/system/confluence.service.</code>
</pre>
<p>
  다음의 명령어로 서비스를 시작(start), 종료(stop)하고 서비스의 상태(status)를
  본다.
</p>
<pre class="language-none">
<code># systemctl start confluence.service
# systemctl stop confluence.service
# systemctl status confluence.service</code>
</pre>
<p>
  서비스에 문제가 발생하면 다음의 명령어를 실행하여 무엇이 문제인지 확인해 본다.
</p>
<pre class="language-none">
<code># journalctl -xe</code>
</pre>

<h5>관련 소스 코드</h5>
Confluence, Jira, Bitbucket의 init.d 스크립트
<ul>
  <li>
    <a href="https://github.com/bitneer/bitneer.dev/blob/master/scripts/confluence" target="_blank" rel="noopener noreferrer">https://github.com/bitneer/bitneer.dev/blob/master/scripts/confluence</a
    >
  </li>
  <li>
    <a href="https://github.com/bitneer/bitneer.dev/blob/master/scripts/jira" target="_blank" rel="noopener noreferrer">https://github.com/bitneer/bitneer.dev/blob/master/scripts/jira</a
    >
  </li>
  <li>
    <a href="https://github.com/bitneer/bitneer.dev/blob/master/scripts/bitbucket" target="_blank" rel="noopener noreferrer">https://github.com/bitneer/bitneer.dev/blob/master/scripts/bitbucket</a
    >
  </li>
</ul>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://confluence.atlassian.com/confkb/run-confluence-as-a-systemd-service-on-linux-937177781.html" target="_blank" rel="noopener noreferrer">Run Confluence as a systemd service on linux</a
    >
  </li>
  <li>
    <a href="https://confluence.atlassian.com/jirakb/run-jira-as-a-systemd-service-on-linux-979411854.html" target="_blank" rel="noopener noreferrer">Run Jira as a systemd service on linux</a
    >
  </li>
  <li>
    <a href="https://confluence.atlassian.com/bitbucketserver/running-bitbucket-server-as-a-linux-service-776640157.html" target="_blank" rel="noopener noreferrer">Running Bitbucket Server as a Linux service</a
    >
  </li>
  <li>
    <a href="https://wiki.debian.org/systemd" target="_blank" rel="noopener noreferrer">systemd &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://wiki.debian.org/systemd/Services" target="_blank" rel="noopener noreferrer">systemd/Services &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://manpages.debian.org/buster/systemd/systemd.service.5.en.html" target="_blank" rel="noopener noreferrer">systemd.service(5) — systemd — Debian buster — Debian Manpages</a
    >
  </li>
  <li>
    <a href="https://manpages.debian.org/buster/systemd/systemd.exec.5.en.html" target="_blank" rel="noopener noreferrer">systemd.exec(5) — systemd — Debian buster — Debian Manpages</a
    >
  </li>
  <li>
    <a href="https://manpages.debian.org/buster/systemd/systemd.unit.5.en.html" target="_blank" rel="noopener noreferrer">systemd.unit(5) — systemd — Debian buster — Debian Manpages</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/">Confluence, Jira, Bitbucket의 systemd unit 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>데비안의 PostgreSQL 설치와 설정</title>
		<link>https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%98-postgresql-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Fri, 22 May 2020 19:53:04 +0000</pubDate>
				<category><![CDATA[데이터베이스 시스템]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[postgresql]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=337</guid>

					<description><![CDATA[<div data-nosnippet>내가 사용하고 있는 Confluence, Jira, Bitbucket의 MySQL을 PostgreSQL로 변경하기로 마음먹고 학습을 진행했다. 그간에 얻은 PostgreSQL의 설치, 설정, 튜닝, 데이터베이스와 사용자 생성, 백업 및 복구 등을 전반적으로 정리해 본다. 이 페이지에서는 설치, 설정, 튜닝에 대해서 다룬다. 나머지 내용은 PostgreSQL의 데이터베이스와 사용자 생성, 백업 및 복구로 이어진다. PostgreSQL을 처음 접하는 분들에게 도움이 되었으면 한다. PostgreSQL 설치 PostgreSQL의 라이센스는 자유를 추구하는 데비안과 잘 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%98-postgresql-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95/">데비안의 PostgreSQL 설치와 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  내가 사용하고 있는 Confluence, Jira, Bitbucket의 MySQL을 PostgreSQL로
  변경하기로 마음먹고 학습을 진행했다. 그간에 얻은 PostgreSQL의 설치, 설정,
  튜닝, 데이터베이스와 사용자 생성, 백업 및 복구 등을 전반적으로 정리해 본다. 이
  페이지에서는 설치, 설정, 튜닝에 대해서 다룬다. 나머지 내용은
  <a href="https://www.bitneer.dev/wp/postgresql%ec%9d%98-%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4%ec%99%80-%ec%82%ac%ec%9a%a9%ec%9e%90-%ec%83%9d%ec%84%b1-%eb%b0%b1%ec%97%85-%eb%b0%8f-%eb%b3%b5%ea%b5%ac/">PostgreSQL의 데이터베이스와 사용자 생성, 백업 및 복구</a
  >로 이어진다. PostgreSQL을 처음 접하는 분들에게 도움이 되었으면 한다.
</p>
<h5>PostgreSQL 설치</h5>
<p>
  PostgreSQL의 라이센스는 자유를 추구하는 데비안과 잘 맞는다. PostgreSQL은
  데비안의 주요 패키지 중의 하나이기 때문에 다음과 같이 한 줄의 명령어로
  설치한다.
</p>
<pre class="language-none">
<code># apt install postgresql postgresql-client</code>
</pre>
<p>설치 후 PostgreSQL 관련 파일의 위치는 다음과 같다.</p>
<ul>
  <li>설정 파일: /etc/postgresql/[version]/[cluster]/</li>
  <li>실행 파일: /usr/lib/postgresql/[version]</li>
  <li>데이타 파일: /var/lib/postgresql/[version]/[cluster]</li>
  <li>
    로그 파일: /var/log/postgresql 디렉토리 안의
    postgresql-[version]-[cluster].log
  </li>
</ul>
<p>
  내가 사용하는 데비안 9(stretch)에서 PostgreSQL 버전은 9.6이다. 앞으로 나올
  파일의 경로는 9.6을 기준으로 서술한다. PostgreSQL은 클러스터로 데이터베이스를
  관리한다. 간단하게 &#8216;클러스터 &gt; 데이터베이스 &gt; 테이블&#8217;의 순서로 그려볼 수
  있다. 여러 개의 클러스터가 존재할 수 있고 한 클러스터 내에 여러 개의
  데이터베이스를 가질 수 있다. 클러스터는 아마존 클라우드와 같이 대용량을 위한
  것이다. 개인이라면 하나의 클러스터로도 충분할 것이다.
</p>
<p>
  데비안은 pg_ctl을 pg_ctlcluster로 대체한다. pg_ctlcluster는 Perl 스크립트
  파일이고 내부에서 pg_ctl을 사용한다. pg_ctlcluster는 PostgreSQL의 다양한
  버전과 여러 클러스터를 효율적으로 관리하기 위한 것이다.
</p>
<p>
  데비안에서 PostgreSQL의 init.d 시작 스크립트는 /etc/init.d/postgresql이다. 이
  시작 스크립트 안에서 pg_ctlcluster를 호출한다. PostgreSQL의 시작과 종료는
  systemctl을 사용하거나 다음과 같이 init.d 시작 스크립트를 실행할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="1,3,5">
<code># /etc/init.d/postgresql stop
[ ok ] Stopping postgresql (via systemctl): postgresql.service.
# /etc/init.d/postgresql start
[ ok ] Starting postgresql (via systemctl): postgresql.service.
# /etc/init.d/postgresql restart 
[ ok ] Restarting postgresql (via systemctl): postgresql.service.
/etc/init.d/postgresql reload
[ ok ] Reloading postgresql configuration (via systemctl): postgresql.service.
# /etc/init.d/postgresql status
...</code>
</pre>

<h5>사용자 접근 설정</h5>
<p>
  디폴트 데이타베이스와 사용자는 postgres이다. 데이타베이스 관리는 postgres
  사용자로 하여야 한다. root 계정에서 다음의 명령어로 postgres 사용자로
  변경한다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># su -s /bin/bash postgres
$ id
uid=115(postgres) gid=124(postgres) groups=124(postgres),112(ssl-cert)</code>
</pre>
<p>
  id 명령어로 현재의 사용자가 postgres인지 확인할 수 있다. postgres로 사용자
  변경후 psql 클라이언트 프로그램을 실행한다.
</p>
<pre class="language-none">
<code>$ psql</code>
</pre>
<p>
  root에서 postgres로 사용자를 전환하는
  <em>su 명령어를 사용하지 않고</em> psql을 직접 실행하려면 다음과 같이 하여야
  한다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># psql -h localhost -U postgres -d postgres
postgres 사용자의 암호:</code>
</pre>
<p>
  postgres 사용자의 암호를 묻는 메시지가 나온다. 데비안에서는 디폴트로 postgres
  사용자의 암호가 없다. &lt;Ctrl + C&gt; 키를 눌러 우선은 빠져나온다.
</p>
<p>
  데비안의 PostgreSQL은 로컬 시스템에서 peer 인증(authentication)을 사용한다.
  peer 인증은 PostgreSQL 사용자와 동일한 이름을 가지는 로컬 계정으로 로컬
  시스템에 로그인하면 암호 없이 데이터베이스를 사용할 수 있다. 이러한 설정은
  /etc/postgresql/9.6/main/pg_hba.conf에서 확인할 수 있다.
</p>
<pre
  class="language-none line-numbers"
  data-line="8"
  data-label="/etc/postgresql/9.6/main/pg_hba.conf"
>
<code># Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# &quot;local&quot; is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
...</code>
</pre>
<p>
  위 설정을 보면 로컬 시스템(127.0.0.1/32)에 <em>로그인하지 않고</em>(host)
  접근하려면 암호를 사용해야 한다. METHOD가 md5인 경우 암호를 사용한다는
  의미이다. 로컬 시스템에서 사용자가 아니라 응용프로그램이 PostgreSQL
  데이터베이스에 접속할 때 적용될 것이다. 또는 위에서 보았듯 root 계정에서
  PostgreSQL 사용자로 전환하는 su를 사용하지 않고 psql, pg_dump 등을 사용할 때
  암호를 사용해야 한다.
</p>
<p>
  PostgreSQL의 관리자 권한을 가지는 postgres 사용자에 암호를 설정하려면 psql
  클라이언트에서 다음의 SQL문을 실행한다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code>postgres=# ALTER USER postgres PASSWORD &#039;원하는 암호 입력&#039;;
ALTER ROLE
postgres=# \q</code>
</pre>
<p>
  SQL 실행 후 ALTER ROLE 확인 메시지가 나오면 성공한 것이다.
  <strong>\q</strong> 명령어를 실행하여 psql을 종료한다.
</p>
<p>
  root 계정으로 다음과 같이 psql을 다시 실행하고 설정한 암호를 입력하여 접속에
  성공하는지 확인해 본다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># psql -h localhost -U postgres -d postgres
postgres 사용자의 암호: &lt;설정한 암호 입력&gt;
psql (9.6.17)
SSL 연결정보 (프로토콜: TLSv1.2, 암호화기법: ECDHE-RSA-AES256-GCM-SHA384, 비트: 256, 압축: off)
도움말을 보려면 &quot;help&quot;를 입력하십시오.

postgres=#</code>
</pre>
<p>
  매번 암호를 입력하는 것은 귀찮은 작업이다. 특히 백업에 사용하는 pg_dump를
  스크립트에서 사용할 때 암호가 노출된다. pg_dump를 한 번 실행해 보자.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># pg_dump -Fc -h localhost -U postgres -d postgres -f /root/postgres_`date +%F`.dump
암호:</code>
</pre>
<p>스크립트에서 암호를 입력하지 않고 실행하려면 다음과 같이 해야 한다.</p>
<pre class="language-bash" data-label="pg_backup.sh">
<code>#!/bin/bash
export PGPASSWORD=&quot;yourpassword&quot;
pg_dump -Fc -h localhost -U postgres -d postgres -f /root/postgres_`date +%F`.dump</code>
</pre>
<p>이를 해결하기 위해 다음의 내용을 가지는 /root/.pgpass 파일을 생성한다.</p>
<pre
  class="language-none line-numbers"
  data-line="2"
  data-label="/root/.pgpass"
>
<code>localhost:5432:*:postgres:&lt;관리자인 postgres의 암호를 입력&gt;
localhost:5432:*:*:&lt;개발이나 응용프로그램에서 사용할 암호 입력&gt;</code>
</pre>
<p>
  위의 내용은 <strong>hostname:port:database:username:password</strong>를
  의미한다. 별표 문자 *는 와일드카드로 &#8216;모든&#8217;을 뜻한다. 마지막의 password를
  제외하고 별표 문자를 사용할 수 있다. 두 번째 줄에서 개발이나 다른
  응용프로그램에서 사용할 데이터베이스의 암호를 따로 설정해 주었다. 일반적으로
  개발이나 응용프로그램은 설정 파일에 암호를 저장하는 경우가 빈번하기 때문에
  사용하는 데이터베이스의 암호가 노출되기 쉽다. 관리자 암호와는 다른 암호를
  사용하여 관리자의 암호를 보호하기 위해 두 번째 줄을 추가한 것이다. root 외
  다른 사용자가 .pgpass 파일 안의 내용을 보지 못하도록 다음의 명령어를 실행한다.
</p>

<pre class="language-none">
<code># chmod 600 /root/.pgpass</code>
</pre>
<p>
  다시 root 계정으로 pg_dump와 psql을 실행하면 암호를 묻지 않는 것을 확인할 수
  있다.
</p>
<pre class="language-none">
<code># pg_dump -Fc -h localhost -U postgres -d postgres -f /root/postgres_`date +%F`.dump
# psql -h localhost -U postgres -d postgres
psql (9.6.17)
SSL 연결정보 (프로토콜: TLSv1.2, 암호화기법: ECDHE-RSA-AES256-GCM-SHA384, 비트: 256, 압축: off)
도움말을 보려면 &quot;help&quot;를 입력하십시오.

postgres=#</code>
</pre>

<h5>원격 접속을 위한 설정</h5>
<p>
  시스템 외부에서 pgAdmin, DataGrip 등의 프로그램을 사용하여 원격으로 접속하려면
  몇 가지 설정을 해야 한다. PostgreSQL은 기본값으로 포트 5432를 사용한다.
  데비안에서 포트 5432는 디폴트로 로컬 주소(127.0.0.1)로 바인딩한다. 다음의
  명령어로 확인할 수 있다.
</p>
<pre class="language-none">
<code># netstat -nlt | grep 5432
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN</code>
</pre>
<p>
  따라서 시스템 외부에서 접근할 수 없다. 시스템 외부에서 접근할 수 있도록
  허용하려면 /etc/postgresql/9.6/main/postgresql.conf 파일에 다음의 내용을
  설정한다.
</p>
<pre
  class="language-none line-numbers"
  data-line="1"
  data-label="/etc/postgresql/9.6/main/postgresql.conf"
>
<code>listen_addresses = &#039;*&#039;</code>
</pre>
<p>
  로컬 네트워크에 있는 컴퓨터가 접근할 수 있도록 허용하려면
  /etc/postgresql/9.6/main/pg_hba.conf에 다음의 내용을 추가한다. 로컬 네트워크
  대역의 주소(192.168.1.0/24)는 여러분에게 맞는 값을 넣어준다.
</p>
<pre
  class="language-none line-numbers"
  data-label="/etc/postgresql/9.6/main/pg_hba.conf"
  data-start="2"
  data-line="2"
>
<code>host    all             all             192.168.1.0/24         md5</code>
</pre>
<p>모든 설정을 마쳤으면 PostgreSQL을 다시 시작한다.</p>
<pre class="language-none line-numbers" data-start="3">
<code># /etc/init.d/postgresql restart</code>
</pre>

<h5>PostgreSQL의 기본적인 튜닝</h5>
<p>
  PostgreSQL은 오래된 시스템을 지원하기 위한 설정값을 디폴트로 가진다. 전문적인
  튜닝은 아니지만 약간의 설정을 변경하는 것으로도 많은 성능 향상을 가져온다.
  다음의 사이트에서 설정값에 대한 힌트를 얻을 수 있다.
</p>
<ul>
  <li>
    <a href="https://pgtune.leopard.in.ua/#/" target="_blank" rel="noopener noreferrer">PGTune</a
    >
  </li>
  <li>
    <a href="https://www.pgconfig.org/#/tuning" target="_blank" rel="noopener noreferrer">PGConfig 2.0</a
    >
  </li>
  <li>
    <a href="http://pgconfigurator.cybertec.at/" target="_blank" rel="noopener noreferrer">Cybertec Postgres Configurator</a
    >
  </li>
</ul>
<p>
  운영체제의 종류, 메모리 크기 등을 선택해서 나온 설정값을 종합적으로 고려하여
  /etc/postgresql/9.6/main/postgresql.conf 파일을 수정하고 PostgreSQL을 다시
  시작한다. 내가 설정한 내용은 다음과 같다.
</p>
<pre class="language-none">
<code>shared_buffers = 1GB
work_mem = 64MB
maintenance_work_mem = 256MB
effective_io_concurrency = 2
wal_buffers = 16MB
max_wal_size = 2GB
min_wal_size = 512MB
checkpoint_completion_target = 0.7
random_page_cost = 4
effective_cache_size = 3GB
default_statistics_target = 100</code>
</pre>

<h5>관련 글</h5>
<ul>
  <li>
    <a href="https://www.bitneer.dev/wp/postgresql%ec%9d%98-%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4%ec%99%80-%ec%82%ac%ec%9a%a9%ec%9e%90-%ec%83%9d%ec%84%b1-%eb%b0%b1%ec%97%85-%eb%b0%8f-%eb%b3%b5%ea%b5%ac/">PostgreSQL의 데이터베이스와 사용자 생성, 백업 및 복구</a
    >
  </li>
</ul>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://wiki.debian.org/PostgreSql" target="_blank" rel="noopener noreferrer">PostgreSql &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://www.postgresql.org/docs/manuals/" target="_blank" rel="noopener noreferrer">PostgreSQL: Manuals</a
    >
  </li>
  <li>
    <a href="https://www.postgresql.org/docs/11/libpq-pgpass.html" target="_blank" rel="noopener noreferrer">PostgreSQL: Documentation: 11: 34.15. The Password File</a
    >
  </li>
  <li>
    <a href="https://www.pgadmin.org/" target="_blank" rel="noopener noreferrer">pgAdmin PostgreSQL Tools</a
    >
  </li>
  <li>
    <a href="https://www.jetbrains.com/ko-kr/datagrip/features/" target="_blank" rel="noopener noreferrer">기능 및 스크린샷 &#8211; DataGrip</a
    >
  </li>
</ul><p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%9d%98-postgresql-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95/">데비안의 PostgreSQL 설치와 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>데비안에 AdoptOpenJDK 설치하기</title>
		<link>https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-adoptopenjdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Wed, 20 May 2020 15:27:10 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdk]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=373</guid>

					<description><![CDATA[<div data-nosnippet>데비안의 Java 패키지 Java를 개발한 썬 마이크로시스템즈는 2010년에 오라클에 인수합병되었다. 썬은 오픈소스에 친화적이었지만 오라클은 그렇지 않았다. 재배포를 허용하지 않는 라이센스 때문에 데비안에서 오라클의 Java 패키지는 빠졌다. 대신에 OpenJDK가 들어왔다. OpenJDK는 썬이 GPL로 공개한 Java 소스코드를 기반으로 하는 프로젝트이다. 오라클도 이 프로젝트에 주요 구성원으로 참여하고 있다. OpenJDK는 오라클 Java와 거의 동일하며 몇몇 상업적인 소스코드만이 빠져있다. 가장 큰 차이점이라면 소스코드의 빌드 주체와 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-adoptopenjdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">데비안에 AdoptOpenJDK 설치하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h5>데비안의 Java 패키지</h5>
<p>
  Java를 개발한 썬 마이크로시스템즈는 2010년에 오라클에 인수합병되었다. 썬은
  오픈소스에 친화적이었지만 오라클은 그렇지 않았다. 재배포를 허용하지 않는
  라이센스 때문에 데비안에서 오라클의 Java 패키지는 빠졌다. 대신에 OpenJDK가
  들어왔다. OpenJDK는 썬이 GPL로 공개한 Java 소스코드를 기반으로 하는
  프로젝트이다. 오라클도 이 프로젝트에 주요 구성원으로 참여하고 있다. OpenJDK는
  오라클 Java와 거의 동일하며 몇몇 상업적인 소스코드만이 빠져있다. 가장 큰
  차이점이라면 소스코드의 빌드 주체와 어떤 라이센스로 배포하는가일 것이다.
</p>
<p>
  데비안에서 개발을 위한 JDK(Java Development Kit)의 설치는 다음과 같이 한다.
</p>
<pre class="language-none">
<code># apt-get install default-jdk</code>
</pre>

<p>
  개발이 목적이 아니라면 default-jre 패키지만을 설치할 수 있다. default
  JRE/JDK의 버전은 데비안 버전에 따라 달라진다. 데비안 9(stretch)는 OpenJDK v8,
  데비안 10(buster)은 OpenJDK v11이다.
</p>
<h5>AdoptOpenJDK 설치</h5>
<p>
  내가 사용하고 있는 Confluence, Jira, Butbucket은 AdoptOpenJDK를 권장한다. 현재
  데비안은 AdoptOpenJDK를 포함하고 있지 않다. 따라서 AdoptOpenJDK 저장소에서
  패키지를 설치해야 한다. root 계정으로 다음과 같이 작업한다.
</p>
<ol>
  <li>
    패키지의 무결성 검사에 사용하는 AdoptOpenJDK GPG 키를 설치하기 위해 다음과
    같이 한다.
    <pre class="language-none line-numbers">
<code># wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -</code>
</pre>
  </li>
  <li>
    AdoptOpenJDK DEB 저장소 설정을 추가하기 위해 다음의 명령어를 실행한다.
    <pre class="language-none line-numbers" data-start="2" data-line="1">
<code># add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/</code>
</pre>
  </li>
  <li>
    다음의 명령어로 adoptopenjdk-8-hotspot 패키지를 설치한다.
    <pre class="language-none line-numbers" data-start="3">
<code># apt-get update
# apt-get install adoptopenjdk-8-hotspot</code>
</pre>
  </li>
</ol>
<p>
  apt에 대한 GPG 키는 /etc/apt/trusted.gpg 파일이나 /etc/apt/trusted.gpg.d
  디렉토리에 저장된다. 다음의 명령어로 키 리스트를 확인할 수 있다.
</p>
<pre class="language-none">
<code># apt-key list
...
        [ unknown] AdoptOpenJDK (used for publishing RPM and DEB files) &lt;adoptopenjdk@gmail.com&gt;
...</code>
</pre>

<p>
  add-apt-repository 명령어가 없다면 먼저 software-properties-common 패키지를
  설치한다. which 명령어는 add-apt-repository 명령어가 있는지 확인하는 데
  유용하다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># which add-apt-repository
# apt-get install software-properties-common
...
# which add-apt-repository
/usr/bin/add-apt-repository</code>
</pre>

<p>
  위 2.의 add-apt-repository 명령은 /etc/apt/sources.list 파일 끝에 AdoptOpenJDK
  DEB 저장소 설정을 추가한다. 나는 깔끔함을 위해 /etc/apt/sources.list.d
  디렉토리 안에 adoptopenjdk.list 파일을 만들어 설정을 옮겨 주었다.
  /etc/apt/sources.list.d/adoptopenjdk.list의 내용은 다음과 같다.
</p>

<pre class="language-none">
<code>deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ stretch main
# deb-src https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ stretch main</code>
</pre>

<p>
  데비안에 없는 패키지를 제공하는 비공식 APT 저장소를 서드파티
  저장소(third-party repository)라고 부른다. /etc/apt/sources.list.d가 서드파티
  저장소를 위한 것이고 파일 이름은 .list로 끝난다. 설정을 반영하기 위해서는
  &#8216;apt-get update&#8217; 명령어를 실행해야 한다. AdoptOpenJDK는 오픈 소스 프로젝트답게
  소스코드를 제공한다. 소스코드를 받아서 설치하고자 한다면 deb-src 앞의 주석을
  위한 샵(#)을 제거한다.
</p>
<h5>데비안의 Java 설정</h5>
<p>
  여러 개의 Java 버전을 설치하였다면 디폴트로 사용할 Java를 선택하기 위해 다음의
  명령어를 실행한다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># update-alternatives --config java
대체 항목 java에 대해 (/usr/bin/java 제공) 5개 선택이 있습니다.

  선택       경로                                              우선순 상태
------------------------------------------------------------
  0            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java   1081      자동 모드
  1            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java   1081      수동 모드
  2            /usr/lib/jvm/j2sdk1.7-oracle/jre/bin/java            317       수동 모드
  3            /usr/lib/jvm/java-6-sun/jre/bin/java                 63        수동 모드
  4            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java       1081      수동 모드
* 5            /usr/lib/jvm/jdk-8-oracle-x64/jre/bin/java           318       수동 모드

Press &lt;enter&gt; to keep the current choice[*], or type selection number:</code>
</pre>

<p>
  원하는 Java 버전 앞에 있는 숫자를 입력하고 &lt;Enter&gt; 키를 누른다. 현재의
  Java 버전을 확인하기 위해 다음의 명령어를 실행해 본다.
</p>
<pre class="language-none line-numbers" data-line="1,3">
<code># java -version
openjdk version &quot;1.8.0_252&quot;
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.252-b09, mixed mode)</code>
</pre>

<p>
  디폴트로 사용할 Java 컴파일러를 선택하기 위해 위와 마찬가지로
  &#8216;update-alternatives&#8217; 명령어를 사용할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># update-alternatives --config javac
대체 항목 javac에 대해 (/usr/bin/javac 제공) 3개 선택이 있습니다.

  선택       경로                                               우선순 상태
------------------------------------------------------------
  0            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/javac   1081      자동 모드
  1            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/javac   1081      수동 모드
  2            /usr/lib/jvm/j2sdk1.7-oracle/bin/javac                317       수동 모드
* 3            /usr/lib/jvm/jdk-8-oracle-x64/bin/javac               318       수동 모드

Press &lt;enter&gt; to keep the current choice[*], or type selection number:</code>
</pre>

<p>
  그러나 위와 같이 일일이 설정하기보다는 $JAVA_HOME/bin 디렉토리 안에 있는 실행
  파일들에 대해 한꺼번에 설정할 필요가 있다. 이를 위해 java-common 패키지의
  update-java-alternatives 명령어를 사용할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="3,4,11,12,14,15">
<code># readlink -f /usr/bin/javac
/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/javac
# readlink -f /usr/bin/keytool 
/usr/lib/jvm/jdk-8-oracle-x64/jre/bin/keytool
# update-java-alternatives -l
adoptopenjdk-8-hotspot-amd64   1081       /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64
j2sdk1.7-oracle                317        /usr/lib/jvm/j2sdk1.7-oracle
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64
java-6-sun                     63         /usr/lib/jvm/java-6-sun
jdk-8-oracle-x64               318        /usr/lib/jvm/jdk-8-oracle-x64
# update-java-alternatives -s adoptopenjdk-8-hotspot-amd64
update-alternatives: 오류: no alternatives for HtmlConverter
...
# readlink -f /usr/bin/keytool 
/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/keytool</code>
</pre>

<p>
  readlink 명령어로 Java 관련 실행 파일의 경로를 확인할 수 있다.
  &#8216;update-java-alternatives -s&#8217;를 실행할 때 나오는 오류 메시지는 무시해도
  괜찮다.
</p>
<p>
  몇몇 응용프로그램은 Java의 설치 위치를 결정하기 위해 JAVA_HOME 환경 변수를
  사용한다. JAVA_HOME의 시스템 전역 설정을 위해 /etc/environment에 다음의 내용을
  추가한다.
</p>
<pre class="language-none">
<code>JAVA_HOME="/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64"</code>
</pre>

<p>
  JAVA_HOME의 값은 위의 &#8216;update-alternatives &#8211;config java&#8217; 명령어를 실행하여
  참고할 수 있다. 선호하는 Java 버전의 실행 경로에서 맨 뒤의 /bin/java를 빼고
  JAVA_HOME에 할당한다. 설정한 환경 변수를 반영하기 위해 다시 로그인하거나
  다음의 명령어를 실행한다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># source /etc/environment
# echo $JAVA_HOME
/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64</code>
</pre>

<p>
  /etc/environment에 설정하는 환경 변수는 로그인하는 모든 사용자에게 영향을
  미친다. 다른 값을 원하는 사용자는 홈 디렉토리의 .bashrc 파일에 JAVA_HOME을
  설정하여 오버라이딩할 수 있다.
</p>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://wiki.debian.org/Java/" target="_blank" rel="noopener noreferrer">Java &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://sylvestre.ledru.info/blog/2011/08/26/sun_java6_packages_removed_from_debian_u" target="_blank" rel="noopener noreferrer">sun-java6 packages removed soon from Debian/Ubuntu (and all other linux
      distros)</a
    >
  </li>
  <li>
    <a href="http://openjdk.java.net/" target="_blank" rel="noopener noreferrer">OpenJDK</a
    >
  </li>
  <li>
    <a href="https://adoptopenjdk.net/" target="_blank" rel="noopener noreferrer">AdoptOpenJDK &#8211; Open source, prebuilt OpenJDK binaries</a
    >
  </li>
  <li>
    <a href="https://adoptopenjdk.net/installation.html#linux-pkg" target="_blank" rel="noopener noreferrer">Installation | AdoptOpenJDK &#8211; Linux RPM and DEB installer packages</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-adoptopenjdk-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">데비안에 AdoptOpenJDK 설치하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>데비안에 워드프레스 설치 시 고려할 점</title>
		<link>https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-%ec%9b%8c%eb%93%9c%ed%94%84%eb%a0%88%ec%8a%a4-%ec%84%a4%ec%b9%98-%ec%8b%9c-%ea%b3%a0%eb%a0%a4%ed%95%a0-%ec%a0%90/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Sun, 05 Nov 2017 07:50:10 +0000</pubDate>
				<category><![CDATA[네트워크와 시스템 관리]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=29</guid>

					<description><![CDATA[<div data-nosnippet>패키지 설치 vs 다운로드 설치 데비안의 강력한 패키지 관리 시스템을 사용하기 위해서는 데비안에서 제공하는 패키지를 사용하는 것이 좋은 선택이다. &#8216;apt-get update &#38;&#38; apt-get upgrade&#8217; 명령어를 사용하여 패키지 업데이트의 편리함을 얻을 수 있다. 그러나 워드프레스는 직접 다운로드하여 설치하는 것이 더 낫다. 데비안의 워드프레스 버전이 낮고 워드프레스 자체가 웹호스팅에 설치할 것을 전제로 하기 때문이다. 데비안의 워드프레스 패키지 설치는 https://wiki.debian.org/WordPress에서 볼 수 있다. &#8216;apt-get install ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-%ec%9b%8c%eb%93%9c%ed%94%84%eb%a0%88%ec%8a%a4-%ec%84%a4%ec%b9%98-%ec%8b%9c-%ea%b3%a0%eb%a0%a4%ed%95%a0-%ec%a0%90/">데비안에 워드프레스 설치 시 고려할 점</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h5>패키지 설치 vs 다운로드 설치</h5>
<p>
  <a href="https://www.debian.org" target="_blank" rel="noopener noreferrer">데비안</a
  >의 강력한 패키지 관리 시스템을 사용하기 위해서는 데비안에서 제공하는 패키지를
  사용하는 것이 좋은 선택이다. &#8216;apt-get update &amp;&amp; apt-get upgrade&#8217;
  명령어를 사용하여 패키지 업데이트의 편리함을 얻을 수 있다. 그러나 <a href="https://wordpress.org/download/" target="_blank" rel="noopener noreferrer">워드프레스</a
  >는 직접 다운로드하여 설치하는 것이 더 낫다.
</p>
<p>
  데비안의 워드프레스 버전이 낮고 워드프레스 자체가 웹호스팅에 설치할 것을
  전제로 하기 때문이다. 데비안의 워드프레스 패키지 설치는
  <a href="https://wiki.debian.org/WordPress" target="_blank" rel="noopener noreferrer">https://wiki.debian.org/WordPress</a
  >에서 볼 수 있다. &#8216;apt-get install wordpress&#8217; 명령어를 실행하여 워드프레스를
  설치하면 데비안의 <a href="https://wiki.debian.org/FilesystemHierarchyStandard" target="_blank" rel="noopener noreferrer">파일시스템 계층구조 표준</a
  >에 따라 다음의 디렉토리 구조를 가진다.
</p>

<ul>
  <li>/usr/share/wordpress</li>
  <li>/usr/share/wordpress/.htaccess -&gt; /etc/wordpress/htaccess</li>
  <li>/var/lib/wordpress/wp-content</li>
</ul>
<p>
  데비안 Jessie의 워드프레스 패키지 버전은 4.1이다. backports로 설치한다면 4.7.x
  버전까지 설치할 수 있다. 이 글을 쓰는 시점의 워드프레스 최신 버전은 4.8.x
  이다. 브라우저에서 워드프레스로 로그인하여 플러그인, 테마를
  설치하려면 /var/lib/wordpress/wp-content 안 plugins, themes 디렉토리의
  사용자와 그룹을 www-data로 변경하는 추가적인 작업이 필요하다. 이런 이유로
  데비안에서 제공하는 워드프레스 패키지 대신 직접 다운로드하여 설치하는 것을
  추천한다.
</p>
<h5>보안 vs 사용의 편리성</h5>
<p>
  워드프레스를 직접 다운로드하여 설치할 시 보안과 사용의 편리성을 절충해야 한다.
  플러그인 설치와 워드프레스 업데이트 등을 쉽게 하려면 워드프레스를 설치할
  디렉토리에 대한 쓰기 권한이 필요하다. 아파치의 VirtualHost인 mysite.com이
  DocumentRoot로 /var/www/mysite 디렉토리를 사용한다고 가정하면 다음과 같이
  설정한다.
</p>
<pre class="language-none">
<code># chown www-data:www-data /var/www/mysite
# chmod 755 /var/www/mysite</code>
</pre>

<p>
  tar.gz으로 압축된 워드프레스를 다운로드하여 /var/www/mysite로 복사한 후 다음과
  같이 작업한다.
</p>
<pre class="language-none">
<code># cd /var/www/mysite
# tar zxvf wordpress-&lt;version&gt;.tar.gz 
# mv wordpress wp
# chown -R www-data:www-data wp 
# find wp -type d -exec chmod 755 {} \; -print 
# find wp -type f -exec chmod 644 {} \; -print 
# rm wordpress-&lt;version&gt;.tar.gz</code>
</pre>

<p>보안을 강화하고자 한다면 데비안의 워드프레스 패키지 방식으로 할 수 있다.</p>
<p>
  mysite나 wp 디렉토리와 디렉토리 안 모든 파일의 사용자와 그룹을 root로
  설정하고, wp/wp-content의 일부 디렉토리만 www-data 사용자와 그룹으로 설정한다.
  이처럼 설정하면 데비안의 아파치는 www-data 사용자와 그룹으로 실행하기 때문에
  root 사용자와 그룹으로 설정한 디렉토리와 파일에 쓰기 권한을 가질 수 없다.
</p>
<p>
  따라서 플러그인과 테마를 별도로 다운로드하여 압축을 푼 후 wp-content 안
  plugins, themes 디렉토리에 복사해야 한다. 보안과 편리성은 서로 상충하기 때문에
  한쪽을 선택하면 한쪽은 희생해야 한다.
</p>
<h5>워드프레스의 주요 설정</h5>
<p>
  mysite.com/wp 대신 mysite.com URL을 사용하고자 한다면 다음과 같이 작업한다.
</p>
<ol>
  <li>
    WordPress에 접속하여 <strong>Settings &gt; General</strong>의
    <strong>Site Address (URL)</strong>을 http://www.mysite.com으로 변경한 후
    <strong>Save Change</strong> 버튼을 클릭한다.
  </li>
  <li>
    /var/www/mysite/wp/index.php 파일을 /var/www/mysite/ 디렉토리로 복사한다.
  </li>
  <li>
    복사한 index.php 파일을 다음과 같이 수정한다.
    <pre class="language-none">
<code>require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );</code>
</pre>
  </li>
  <li>
    Permalink를 사용하고자 한다면 /var/www/mysite/wp/.htaccess 파일을
    /var/www/mysite/ 디렉토리로 복사한다.
  </li>
</ol>
<p>
  Permalink를 사용하려면 rewrite모듈을 활성화해야 한다. &#8216;a2enmod rewrite&#8217;
  명령어를 실행한다.
</p>
<p>
  .htaccess 파일을 사용하기 위해서는 아파치의 &#8216;AllowOverride All&#8217; 설정이
  필요하다. 아파치(2.4)에서 가상호스트 mysite.com에 대해 다음과 같이 편집한 후
  &#8216;sevice apache2 restart&#8217; 명령어로 아파치를 재시작한다.
</p>
<pre class="language-none line-numbers" data-line="7">
<code>&lt;VirtualHost *:80&gt;
  ServerName www.mysite.com
  
  DocumentRoot /var/www/mysite
  &lt;Directory /var/www/mysite&gt;
    Options FollowSymLinks
    AllowOverride All
    Require all granted
  &lt;/Directory&gt;
&lt;/VirtualHost&gt;</code>
</pre>

<p>
  Permalink는 SEO를 위해서 Post의 제목이 나올 수 있게 &#8216;Post Name&#8217;을 선택하거나
  Custom Structure에서 &#8216;/wp/%postname%/&#8217; 정도로 설정한다. 다음과 같이 시스템을
  전체적으로 UTF-8로 설정했다면
  <a href="https://github.com/Joungkyun/mod_url/" target="_blank" rel="noopener noreferrer">mod_url</a
  >을 설치할 필요는 없다.
</p>
<ul>
  <li>데비안을 UTF-8로 설치</li>
  <li>
    Apache 설정에서 /etc/apache2/conf-available/charset.conf에
    &#8216;AddDefaultCharset UTF-8&#8217;로 설정
  </li>
  <li>
    워드프레스의 데이터베이스를 UTF-8로 생성

    <pre class="language-none">
<code>MariaDB [(none)]&gt; CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
MariaDB [(none)]&gt; GRANT ALL ON wordpress.* TO &#039;wordpress&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;암호 입력&#039; WITH GRANT OPTION;</code>
</pre>
  </li>
</ul>
<p>개인적인 취향에 따라 워드프레스 플러그인과 테마를 설치하여 사용한다.</p>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/%eb%8d%b0%eb%b9%84%ec%95%88%ec%97%90-%ec%9b%8c%eb%93%9c%ed%94%84%eb%a0%88%ec%8a%a4-%ec%84%a4%ec%b9%98-%ec%8b%9c-%ea%b3%a0%eb%a0%a4%ed%95%a0-%ec%a0%90/">데비안에 워드프레스 설치 시 고려할 점</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
