<?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>upgrade | bitneer.dev</title>
	<atom:link href="https://www.bitneer.dev/blog/tag/upgrade/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>upgrade | bitneer.dev</title>
	<link>https://www.bitneer.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>
	</channel>
</rss>
