<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>mingming</title>
    <link>https://mingming-96.tistory.com/</link>
    <description>클라우드 엔지니어 성장기</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 13:06:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>mingming_96</managingEditor>
    <image>
      <title>mingming</title>
      <url>https://tistory1.daumcdn.net/tistory/6548462/attach/10816f0f4e314108a7e233e19380b6e1</url>
      <link>https://mingming-96.tistory.com</link>
    </image>
    <item>
      <title>Jenkins Helm Chart 기동 구조 분석</title>
      <link>https://mingming-96.tistory.com/167</link>
      <description>&lt;div style=&quot;font-family:'Noto Sans KR',sans-serif; font-size:15px; line-height:1.8; color:#212529; max-width:780px; margin:0 auto;&quot;&gt;

&lt;p style=&quot;margin:12px 0;&quot;&gt;Jenkins를 Helm으로 배포하고 운영하다 보면 한 번쯤 이런 의문이 생깁니다. &lt;strong&gt;Pod가 재시작될 때 플러그인은 어디서 오는 걸까? ConfigMap은 어떻게 Jenkins에 반영되는 걸까?&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;이 글에서는 &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;jenkinsci/jenkins&lt;/code&gt; Helm Chart를 기반으로 Jenkins Pod가 기동될 때의 전체 흐름을 단계별로 분석합니다.&lt;/p&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;1. 전체 Pod 구성&lt;/h2&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;Jenkins Helm Chart는 하나의 Pod 안에 아래와 같은 컨테이너 구조로 구성됩니다.&lt;/p&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;Pod: jenkins-0 (StatefulSet)
├── initContainer: copy-default-config   ← 기동 전 준비 작업
├── container:     jenkins               ← 메인 Jenkins 프로세스
└── container:     config-reload (선택)  ← JCasC 자동 리로드 사이드카&lt;/div&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;StatefulSet으로 배포되기 때문에 Pod 이름은 항상 &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;&amp;lt;release&amp;gt;-0&lt;/code&gt;으로 고정됩니다. &lt;strong&gt;initContainer가 완료되어야만 메인 컨테이너가 기동됩니다.&lt;/strong&gt;&lt;/p&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;2. 생성되는 Kubernetes 리소스&lt;/h2&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;helm install&lt;/code&gt; 시 생성되는 주요 리소스 목록입니다.&lt;/p&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:16px 0;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;리소스&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;이름&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;용도&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;StatefulSet&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Jenkins Controller Pod 관리&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;ConfigMap&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;apply_config.sh, plugins.txt, jvm-options 등&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;ConfigMap&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;-jenkins-jcasc-config&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;JCasC 기본 보안/권한 설정&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;ConfigMap&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;-jenkins-config-&amp;lt;key&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;configScripts 항목별 JCasC yaml&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Secret&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;admin 계정 username / password&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;ServiceAccount&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Jenkins RBAC 권한&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;PVC&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;jenkins_home 영구 저장소&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Service&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;&amp;lt;release&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;8080 (UI), 50000 (Agent 연결)&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;3. 볼륨 구성&lt;/h2&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;initContainer와 메인 컨테이너가 공유하는 볼륨 구조입니다. 어떤 볼륨이 재시작 후에도 살아남는지 파악하는 것이 중요합니다.&lt;/p&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:16px 0;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;볼륨명&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;타입&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;initContainer 마운트&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;메인 컨테이너 마운트&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;데이터 유지&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;jenkins-home&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;PVC&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/var/jenkins_home&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/var/jenkins_home&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;✅ 영구&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;jenkins-config&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;ConfigMap (읽기전용)&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/var/jenkins_config&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;✅ ConfigMap 기준&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;plugin-dir&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;emptyDir&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/var/jenkins_plugins&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/usr/share/jenkins/ref/plugins&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;❌ 재시작 시 초기화&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;secrets-dir&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;emptyDir&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/usr/share/jenkins/ref/secrets&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/usr/share/jenkins/ref/secrets&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;❌ 재시작 시 초기화&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;sc-config-volume&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;emptyDir&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/var/jenkins_home/casc_configs&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;❌ 재시작 시 초기화&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background:#fff9db; border-left:3px solid #ffd43b; padding:12px 16px; margin:16px 0; font-size:14px;&quot;&gt;&lt;strong&gt;plugin-dir은 emptyDir입니다.&lt;/strong&gt; Pod가 재시작될 때마다 비워지기 때문에 매 기동 시 initContainer가 plugins.txt를 다시 읽어 플러그인을 전부 새로 설치합니다.&lt;/p&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;4. initContainer 상세 분석&lt;/h2&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;4.1 기본 정보&lt;/h3&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;initContainer는 메인 컨테이너와 동일한 이미지를 사용하며, ConfigMap에 저장된 쉘 스크립트를 실행합니다.&lt;/p&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;name:    copy-default-config
image:   jenkins/jenkins:lts
command: [&quot;sh&quot;, &quot;/var/jenkins_config/apply_config.sh&quot;]&lt;/div&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;4.2 주입되는 환경 변수&lt;/h3&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;env:
  # Secret에서 주입
  - name: ADMIN_PASSWORD
    valueFrom:
      secretKeyRef:
        name: &amp;lt;release&amp;gt;
        key:  jenkins-admin-password

  - name: ADMIN_USER
    valueFrom:
      secretKeyRef:
        name: &amp;lt;release&amp;gt;
        key:  jenkins-admin-user

  # values.yaml에서 주입
  - name: JENKINS_VERSION   # Setup Wizard 비활성화에 사용
    value: &quot;2.x.x&quot;

  - name: JAVA_OPTS         # controller.javaOpts
    value: &quot;-Xmx512m ...&quot;

  - name: JENKINS_OPTS      # controller.jenkinsOpts
    value: &quot;...&quot;&lt;/div&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;4.3 apply_config.sh 실행 흐름&lt;/h3&gt;

&lt;h3 style=&quot;font-size:15px; font-weight:700; color:#212529; margin:20px 0 8px;&quot;&gt;Step 1 — Setup Wizard 비활성화&lt;/h3&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;JCasC 환경에서 최초 기동 시 나타나는 Setup Wizard를 건너뛰기 위해 버전 파일을 미리 생성합니다.&lt;/p&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;echo $JENKINS_VERSION &gt; /var/jenkins_home/jenkins.install.UpgradeWizard.state
echo $JENKINS_VERSION &gt; /var/jenkins_home/jenkins.install.InstallUtil.lastExecVersion&lt;/div&gt;

&lt;h3 style=&quot;font-size:15px; font-weight:700; color:#212529; margin:20px 0 8px;&quot;&gt;Step 2 — plugins.txt 복사 (ConfigMap → PVC)&lt;/h3&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;ConfigMap에 있는 plugins.txt를 PVC로 복사합니다. 이전 실행에서 남은 .lock 파일도 함께 제거합니다.&lt;/p&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;cp /var/jenkins_config/plugins.txt /var/jenkins_home
rm -rf /usr/share/jenkins/ref/plugins/*.lock&lt;/div&gt;

&lt;h3 style=&quot;font-size:15px; font-weight:700; color:#212529; margin:20px 0 8px;&quot;&gt;Step 3 — 플러그인 설치 (jenkins-plugin-cli)&lt;/h3&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;jenkins-plugin-cli&lt;/code&gt; 버전에 따라 두 가지 방식으로 분기합니다.&lt;/p&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;# jenkins-plugin-cli v2.1.1 이상 (신버전)
jenkins-plugin-cli \
  --war &quot;/usr/share/jenkins/jenkins.war&quot; \
  --plugin-file &quot;/var/jenkins_home/plugins.txt&quot; \
  --latest true

# v2.1.1 미만 (구버전 폴백)
/usr/local/bin/install-plugins.sh $(cat /var/jenkins_home/plugins.txt)&lt;/div&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;Update Center를 참조하여 의존성을 재귀적으로 해결하며, 버전 충돌 시 &lt;strong&gt;높은 버전으로 자동 대체&lt;/strong&gt;됩니다.&lt;/p&gt;

&lt;h3 style=&quot;font-size:15px; font-weight:700; color:#212529; margin:20px 0 8px;&quot;&gt;Step 4 — plugin-dir(emptyDir)로 플러그인 복사&lt;/h3&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;설치된 플러그인을 메인 컨테이너가 읽을 수 있는 공유 볼륨으로 복사합니다.&lt;/p&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;yes n | cp -i /usr/share/jenkins/ref/plugins/* /var/jenkins_plugins/&lt;/div&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;5. 메인 컨테이너 기동 순서&lt;/h2&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;initContainer가 &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;exit 0&lt;/code&gt;으로 종료된 후 메인 Jenkins 컨테이너가 기동됩니다.&lt;/p&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:16px 0;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;순서&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;작업&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;비고&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;1&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;JVM 기동&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;JAVA_OPTS, JENKINS_OPTS 적용&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;2&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;플러그인 로드&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/usr/share/jenkins/ref/plugins/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;3&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;JCasC 설정 적용&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;/var/jenkins_home/casc_configs/&lt;/code&gt; 내 yaml 전체 읽기&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;4&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Probe 통과&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;HTTP GET /login → 200 OK 확인 후 트래픽 허용&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background:#fff9db; border-left:3px solid #ffd43b; padding:12px 16px; margin:16px 0; font-size:14px;&quot;&gt;&lt;strong&gt;플러그인 의존성 충돌은 2번 단계에서 Jenkins가 죽습니다.&lt;/strong&gt; &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;kubectl logs &amp;lt;pod&amp;gt; -c jenkins&lt;/code&gt;에서 오류를 확인하세요.&lt;/p&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;6. JCasC(Jenkins Configuration as Code) 적용 구조&lt;/h2&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;6.1 ConfigMap 생성 구조&lt;/h3&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;values.yaml&lt;/code&gt;의 &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;controller.JCasC.configScripts&lt;/code&gt; 항목들은 각각 독립적인 ConfigMap으로 생성됩니다.&lt;/p&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;controller:
  JCasC:
    configScripts:
      welcome-message: |
        jenkins:
          systemMessage: &quot;Hello Jenkins&quot;
      credentials: |
        credentials:
          system: ...&lt;/div&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;6.2 Pod 내 마운트 경로&lt;/h3&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;/var/jenkins_home/casc_configs/
  ├── welcome-message.yaml      ← ConfigMap에서 마운트
  ├── credentials.yaml          ← ConfigMap에서 마운트
  └── jcasc-default-config.yaml ← 기본 보안/권한 설정&lt;/div&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;6.3 configAutoReload 사이드카&lt;/h3&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;controller.sidecars.configAutoReload.enabled: true&lt;/code&gt;로 설정하면 사이드카 컨테이너가 추가됩니다.&lt;/p&gt;
&lt;p style=&quot;background:#ebfbee; border-left:3px solid #40c057; padding:12px 16px; margin:16px 0; font-size:14px;&quot;&gt;사이드카는 ConfigMap 변경을 감지하면 yaml을 &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;casc_configs/&lt;/code&gt;에 복사하고 리로드를 요청합니다. &lt;strong&gt;Jenkins 재기동 없이 설정 변경이 반영&lt;/strong&gt;됩니다.&lt;/p&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;7. Secret 및 Credential 주입 구조&lt;/h2&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;7.1 Admin 계정 Secret&lt;/h3&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;controller:
  adminUser:     &quot;admin&quot;
  adminPassword: &quot;password&quot;&lt;/div&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;7.2 추가 Secret 마운트&lt;/h3&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;controller:
  additionalSecrets:
    - name:  github-token
      value: &quot;ghp_xxx&quot;

  additionalExistingSecrets:
    - name:    my-k8s-secret
      keyName: db-password&lt;/div&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;Pod의 &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;/run/secrets/&lt;/code&gt; 경로에 마운트되며, JCasC에서 &lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 6px; border-radius:4px;&quot;&gt;${github-token}&lt;/code&gt; 형식으로 참조할 수 있습니다.&lt;/p&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;8. 기동 실패 주요 원인&lt;/h2&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:16px 0;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;원인&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;증상&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;확인 방법&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;플러그인 의존성 충돌&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;initContainer CrashLoopBackOff&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;kubectl logs &amp;lt;pod&amp;gt; -c copy-default-config&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;PVC 마운트 실패&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Pod Pending 상태 지속&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;kubectl describe pod &amp;lt;pod&amp;gt;&lt;/code&gt; Events 확인&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Update Center 연결 실패&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;플러그인 다운로드 타임아웃&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;initContainer 로그에서 connection refused 확인&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;JCasC yaml 문법 오류&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Jenkins 기동 후 즉시 재시작&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;kubectl logs &amp;lt;pod&amp;gt; -c jenkins&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Secret 누락&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;initContainer Error 즉시 종료&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;&lt;code style=&quot;font-family:monospace; font-size:13px; background:#f6f8fa; padding:2px 4px;&quot;&gt;kubectl describe pod&lt;/code&gt; Events 확인&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 style=&quot;font-size:16px; font-weight:700; color:#212529; margin:24px 0 10px;&quot;&gt;주요 확인 명령어&lt;/h3&gt;
&lt;div style=&quot;background:#f2f2f2; padding:16px 20px; margin:16px 0; overflow-x:auto; font-family:monospace; font-size:13px; color:#333333; white-space:pre; line-height:1.6;&quot;&gt;# initContainer 로그
kubectl logs &amp;lt;pod&amp;gt; -c copy-default-config -n &amp;lt;namespace&amp;gt;

# 메인 컨테이너 로그
kubectl logs &amp;lt;pod&amp;gt; -c jenkins -n &amp;lt;namespace&amp;gt;

# 사이드카 로그
kubectl logs &amp;lt;pod&amp;gt; -c config-reload -n &amp;lt;namespace&amp;gt;

# Pod 전체 이벤트
kubectl describe pod &amp;lt;pod&amp;gt; -n &amp;lt;namespace&amp;gt;

# rollout 상태 확인
kubectl rollout status statefulset/jenkins -n &amp;lt;namespace&amp;gt;&lt;/div&gt;

&lt;hr style=&quot;border:none; border-top:1px solid #dee2e6; margin:32px 0;&quot;&gt;

&lt;h2 style=&quot;font-size:20px; font-weight:700; color:#212529; margin:40px 0 16px; padding-bottom:10px; border-bottom:1px solid #dee2e6;&quot;&gt;9. 전체 기동 흐름 요약&lt;/h2&gt;
&lt;p style=&quot;margin:12px 0;&quot;&gt;지금까지 살펴본 내용을 단계별로 정리하면 다음과 같습니다.&lt;/p&gt;

&lt;p style=&quot;font-size:14px; font-weight:600; color:#212529; margin:20px 0 4px;&quot;&gt;Phase 1 — 리소스 준비&lt;/p&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:8px 0 20px;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;단계&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;내용&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Helm install/upgrade&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Chart 렌더링 후 K8s 리소스 apply&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;ConfigMap 생성/업데이트&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;apply_config.sh, plugins.txt, JCasC yaml&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Secret 생성/업데이트&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;admin 계정, 추가 credentials&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;PVC 바인딩&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;jenkins_home 영구 볼륨 확보&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p style=&quot;font-size:14px; font-weight:600; color:#212529; margin:20px 0 4px;&quot;&gt;Phase 2 — initContainer (copy-default-config)&lt;/p&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:8px 0 20px;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;순서&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;작업&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;관련 볼륨&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;1&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Setup Wizard 비활성화 파일 생성&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;jenkins-home (PVC)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;2&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;ConfigMap → PVC로 plugins.txt 복사&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;jenkins-config, jenkins-home&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;3&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;jenkins-plugin-cli로 플러그인 다운로드&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Update Center 네트워크 통신&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;4&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;설치된 플러그인을 plugin-dir에 복사&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;plugin-dir (emptyDir)&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p style=&quot;font-size:14px; font-weight:600; color:#212529; margin:20px 0 4px;&quot;&gt;Phase 3 — 메인 컨테이너 (jenkins)&lt;/p&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:8px 0 20px;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;순서&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;작업&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;관련 볼륨&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;5&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;JVM 기동 (JAVA_OPTS, JENKINS_OPTS 적용)&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;—&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;6&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;plugin-dir에서 플러그인 로드&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;plugin-dir (emptyDir)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;7&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;casc_configs/ 읽어 JCasC 설정 적용&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;sc-config-volume (emptyDir)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;8&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Liveness / Readiness Probe 통과&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;—&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p style=&quot;font-size:14px; font-weight:600; color:#212529; margin:20px 0 4px;&quot;&gt;Phase 4 — 사이드카 (config-reload, 선택)&lt;/p&gt;
&lt;table style=&quot;width:100%; border-collapse:collapse; font-size:14px; margin:8px 0 20px;&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;순서&lt;/th&gt;
      &lt;th style=&quot;font-size:14px; font-weight:600; padding:10px 14px; text-align:left; border:1px solid #dee2e6; background:#f1f3f5;&quot;&gt;작업&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;9&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;Kubernetes Watch API로 ConfigMap 변경 감시 시작&lt;/td&gt;&lt;/tr&gt;
    &lt;tr style=&quot;background:#f8f9fa;&quot;&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;10&lt;/td&gt;&lt;td style=&quot;font-size:14px; padding:10px 14px; border:1px solid #dee2e6;&quot;&gt;변경 감지 시 yaml을 casc_configs/에 복사 후 Jenkins에 리로드 요청&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;/div&gt;</description>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/167</guid>
      <comments>https://mingming-96.tistory.com/167#entry167comment</comments>
      <pubDate>Sun, 22 Mar 2026 23:21:09 +0900</pubDate>
    </item>
    <item>
      <title>Windows Server KMS 호스트 등록</title>
      <link>https://mingming-96.tistory.com/165</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Windows 라이선스는 종류와 인증 방식에 따라 적용 방법이 크게 달라지며, 이를 충분히 이해하지 못한 상태에서 KMS를 구성할 경우 인증 오류나 운영상의 제약이 발생할 수 있습니다. 이에 따라 본 문서에서는 다음과 같은 순서로 내용을 정리하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Windows 라이선스 종류&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Microsoft 라이선스 인증 채널 유형&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;KMS 인증 구조&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;KMS 호스트 등록 절차&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;제약사항 및 한계&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;slmgr 명령어 사용 예시&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;KMS 호스트 버전별 지원 범위&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;KMS 인증 시 자주 발생하는 오류 코드 및 해결법&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. Windows 라이선스 종류&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Windows Server 및 Windows Client 라이선스는 크게 다음과 같은 유형으로 구분됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1.1 Retail (FPP, Full Packaged Product)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;개인 또는 소규모 환경을 대상으로 제공되는 라이선스입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;제품 키를 입력하여 Microsoft 인증 서버와 직접 통신하는 방식으로 활성화됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;일정 조건을 충족할 경우 다른 장비로 이전이 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;KMS 및 MAK 인증 방식은 사용할 수 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1.2 OEM (Original Equipment Manufacturer)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;서버 또는 PC 구매 시 하드웨어와 함께 제공되는 라이선스입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;BIOS/UEFI에 제품 키가 내장되어 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;하드웨어에 종속되며 다른 장비로 이전할 수 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;KMS 인증 방식은 사용할 수 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1.3 Volume License (볼륨 라이선스)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;기업 및 공공기관 환경을 대상으로 제공되는 라이선스입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;다수의 서버 및 클라이언트를 효율적으로 관리하기 위한 목적의 라이선스입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;KMS 또는 MAK 인증 방식을 사용할 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 호스트는 반드시 &lt;/span&gt;&lt;b&gt;&lt;span&gt;Volume License 환경에서만 구성 가능&lt;/span&gt;&lt;/b&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. Microsoft 라이선스 인증 채널 유형&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Windows 라이선스는 라이선스 종류와 별도로 &lt;/span&gt;&lt;b&gt;&lt;span&gt;인증 채널(Activation Channel)&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 에 따라 활성화 방식이 구분됩니다. 주요 인증 채널은 Retail, MAK, KMS 세 가지입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2.1 Retail 인증 채널&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Retail(FPP) 라이선스에서 사용하는 인증 채널입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;제품 키를 입력하면 Microsoft 인증 서버와 직접 통신하여 활성화됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;장비 1대당 1개의 라이선스가 적용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;기업 환경에서의 중앙 집중식 라이선스 관리는 제공되지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;인터넷 연결 필수&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;개별 장비 단위 인증&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;KMS 또는 MAK 전환 불가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2.2 MAK (Multiple Activation Key)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;볼륨 라이선스 환경에서 사용하는 인증 채널입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;각 시스템이 Microsoft 인증 서버와 직접 통신하여 활성화합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;활성화 횟수에 제한이 존재합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;운영체제 재설치 시 인증 횟수가 추가로 차감될 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;적합한 환경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;서버 또는 클라이언트 수량이 많지 않은 환경&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;중앙 집중식 라이선스 관리가 필요하지 않은 환경&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2.3 KMS (Key Management Service)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;볼륨 라이선스 환경에서 사용하는 인증 채널입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;내부 네트워크에 KMS 호스트 서버를 구성하여 인증을 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;클라이언트는 KMS 호스트를 통해 라이선스를 인증받습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;일정 주기마다 자동으로 재인증이 수행됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;적합한 환경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;다수의 Windows Server 및 Client를 운영하는 환경&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;내부망 기반의 중앙 집중형 라이선스 관리가 필요한 환경&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. KMS 인증 구조&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 환경은 다음과 같은 구성 요소로 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.1 KMS 호스트&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Microsoft에서 발급한 &lt;/span&gt;&lt;b&gt;&lt;span&gt;KMS Host Key&lt;/span&gt;&lt;/b&gt;&lt;span&gt;를 설치합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;내부 클라이언트의 인증 요청을 처리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;최초 1회 Microsoft 인증 서버와의 통신이 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.2 KMS 클라이언트&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;GVLK(Generic Volume License Key)를 사용하여 인증을 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;DNS를 통해 KMS 호스트를 검색한 후 인증을 진행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;일정 주기마다 KMS 호스트에 재인증을 요청합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 인증은 &lt;/span&gt;&lt;b&gt;&lt;span&gt;최소 활성화 수(Minimum Activation Threshold)&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 조건을 충족해야 정상적으로 수행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. KMS 호스트 등록 절차&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4.1 사전 준비 사항&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Microsoft Volume License 계약 체결&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;VLSC(Volume Licensing Service Center) 계정 보유&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;KMS Host Key 확보&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;KMS 호스트 역할을 수행할 Windows Server&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4.2 KMS Host Key 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 호스트로 사용할 Windows Server에서 관리자 권한 명령 프롬프트를 실행한 후 아래 명령어를 입력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877568442&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX&lt;/code&gt;&lt;/pre&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4.3 KMS 호스트 활성화&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1769877578239&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /ato&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;KMS 호스트 자체를 Microsoft 서버에 활성화합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;최초 1회 인터넷 연결이 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4.4 KMS 상태 확인&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1769877591942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /dlv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아래 항목을 중심으로 상태를 확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;License Status&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;KMS 활성화 여부&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Current Count (현재 인증 요청 수)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4.5 DNS 설정 확인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 인증은 기본적으로 &lt;/span&gt;&lt;b&gt;&lt;span&gt;DNS SRV 레코드&lt;/span&gt;&lt;/b&gt;&lt;span&gt;를 통해 KMS 호스트를 자동으로 검색합니다. 따라서 DNS 설정이 정상적으로 구성되어 있지 않으면 KMS 인증이 실패할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;4.5.1 DNS SRV 레코드 개요&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;레코드 이름: &lt;/span&gt;&lt;span&gt;_vlmcs._tcp&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;프로토콜: TCP&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;포트: 1688&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;대상 호스트: KMS 호스트 서버&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 호스트가 정상적으로 활성화되면, &lt;/span&gt;&lt;b&gt;&lt;span&gt;DNS 서버에 SRV 레코드가 자동으로 등록&lt;/span&gt;&lt;/b&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;4.5.2 DNS SRV 레코드 확인 방법&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DNS 서버에서 다음 명령어를 통해 SRV 레코드 존재 여부를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877881613&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nslookup -type=SRV _vlmcs._tcp.example.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정상적인 경우 KMS 호스트 정보와 포트 1688이 조회됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;4.5.3 DNS 자동 등록이 되지 않는 경우&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음과 같은 환경에서는 SRV 레코드가 자동으로 등록되지 않을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;KMS 호스트가 도메인에 가입되어 있지 않은 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;DNS 동적 업데이트가 제한된 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;보안 정책에 의해 SRV 레코드 등록이 차단된 경우&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 경우 DNS 관리자 콘솔에서 SRV 레코드를 수동으로 등록해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;SRV 레코드 수동 등록 예시&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스: _vlmcs&lt;/li&gt;
&lt;li&gt;프로토콜: _tcp&lt;/li&gt;
&lt;li&gt;포트 번호: 1688&lt;/li&gt;
&lt;li&gt;호스트 이름: kms01.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;4.5.4 DNS를 사용하지 않는 경우&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DNS 기반 자동 탐색을 사용할 수 없는 환경에서는 클라이언트에 KMS 서버를 수동으로 지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877833618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /skms kms01.example.com:1688&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 방식은 임시 조치 또는 테스트 환경에서만 사용하는 것이 권장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;5. KMS 클라이언트 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 클라이언트는 GVLK를 사용하여 인증을 수행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877604339&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /ipk &amp;lt;GVLK_KEY&amp;gt;
slmgr /ato&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;DNS SRV 레코드 &lt;/span&gt;&lt;span&gt;_vlmcs._tcp&lt;/span&gt;&lt;span&gt;를 통해 KMS 호스트를 자동으로 탐색합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;필요 시 KMS 서버를 수동으로 지정할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;6. KMS 제약사항 및 한계&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;6.1 최소 활성화 수 제한&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 41.7437%; height: 76px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 22.093%; text-align: center;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 19.6512%; text-align: center;&quot;&gt;최소 수량&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 22.093%; text-align: center;&quot;&gt;&lt;span&gt;Windows Client&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 19.6512%; text-align: center;&quot;&gt;&lt;span&gt;25대&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 22.093%; text-align: center;&quot;&gt;&lt;span&gt;Windows Server&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 19.6512%; text-align: center;&quot;&gt;&lt;span&gt;5대&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;최소 활성화 수를 충족하지 못할 경우 KMS 인증이 완료되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;6.2 인증 유효 기간&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;KMS 인증의 유효 기간은 180일입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;클라이언트는 7일 주기로 재인증을 시도합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;180일 동안 재인증에 실패할 경우 라이선스 만료 상태로 전환됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;6.3 네트워크 및 DNS 의존성&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;TCP 1688 포트 통신이 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;DNS SRV 레코드가 정상적으로 등록되어 있어야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;방화벽 또는 DNS 장애 발생 시 인증이 실패할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;6.4 KMS 호스트 장애 영향&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;KMS 호스트 장애 발생 시 신규 인증이 불가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;기존 인증은 유효 기간 동안 유지됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;필요에 따라 다중 KMS 호스트 구성이 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;7. slmgr 명령어&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;라이선스 정보 요약 확인&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877200314&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /dli&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;라이선스 상세 정보 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877170941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /dlv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;제품 키 제거&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877155596&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /upk&lt;/code&gt;&lt;/pre&gt;
&lt;div contenteditable=&quot;false&quot; data-is-code-block-view=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;KMS 서버 수동 지정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877135249&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /skms kms01.example.com:1688&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;KMS 서버 설정 초기화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769877119393&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slmgr /ckms&lt;/code&gt;&lt;/pre&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;8. Windows Server 버전별 KMS 호환성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KMS 호스트는 설치된 Windows Server 버전에 따라 &lt;/span&gt;&lt;b&gt;&lt;span&gt;인증 가능한 Windows Server 및 Client 버전이 제한&lt;/span&gt;&lt;/b&gt;&lt;span&gt;됩니다. 따라서 KMS 호스트 구축 시 호환성을 반드시 고려해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;8.1 KMS 호스트와 클라이언트 호환성 개요&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;상위 버전의 Windows Server KMS 호스트는 하위 버전 Windows를 인증할 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;하위 버전 KMS 호스트는 상위 버전 Windows를 인증할 수 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어, Windows Server 2022 KMS 호스트는 Windows Server 2019/2016 및 Windows 10, 11을 인증할 수 있지만, Windows Server 2016 KMS 호스트는 Windows Server 2022를 인증할 수 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;8.2 Windows Server KMS 호스트 버전별 지원 범위&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아래 표는 &lt;/span&gt;&lt;b&gt;&lt;span&gt;Microsoft 공식 문서(KMS 정품 인증 계획)&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 기준으로 정리한 KMS 호스트와 클라이언트 간 호환성 개요입니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;핵심 기준: &lt;/span&gt;&lt;b&gt;&lt;span&gt;KMS 호스트는 해당 Windows Server 버전을 인식할 수 있는 KMS Host Key를 보유해야 인증이 가능합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;KMS 호스트&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;KMS Host Key&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;인증 가능 Windows Server&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;비고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Windows Server 2025&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Server 2025 KMS Host Key&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;2025 / 2022 / 2019 / 2016&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;최신 호스트, 하위 버전 호환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Windows Server 2022&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Server 2022 KMS Host Key&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;2022 / 2019 / 2016&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;Server 2025 인증 불가&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Windows Server 2019&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Server 2019 KMS Host Key&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;2019 / 2016&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;상위 버전 인증 불가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Windows Server 2016&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Server 2016 KMS Host Key&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;2016&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;최소 호환 범위&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;※ Windows Server 2025는 &lt;/span&gt;&lt;b&gt;&lt;span&gt;KMS 클라이언트 OS로는 지원 대상에 포함&lt;/span&gt;&lt;/b&gt;&lt;span&gt;되지만, 이를 인증하려면 &lt;/span&gt;&lt;b&gt;&lt;span&gt;Server 2025를 인식할 수 있는 KMS Host Key 및 호스트 환경&lt;/span&gt;&lt;/b&gt;&lt;span&gt;이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/windows-server/get-started/kms-activation-planning?tabs=server25&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://learn.microsoft.com/ko-kr/windows-server/get-started/kms-activation-planning?tabs=server25&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1769877643365&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Windows Server에 대한 KMS(키 관리 서비스) 정품 인증 계획&quot; data-og-description=&quot;Windows Server에서 KMS(키 관리 서비스) 정품 인증을 계획하는 방법을 알아봅니다.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/windows-server/get-started/kms-activation-planning?tabs=server25&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/windows-server/get-started/kms-activation-planning&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cQZInY/dJMb82eHZYM/rbOHI0PtjUlZNaqqd4rV6k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/windows-server/get-started/kms-activation-planning?tabs=server25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/windows-server/get-started/kms-activation-planning?tabs=server25&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cQZInY/dJMb82eHZYM/rbOHI0PtjUlZNaqqd4rV6k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Windows Server에 대한 KMS(키 관리 서비스) 정품 인증 계획&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Windows Server에서 KMS(키 관리 서비스) 정품 인증을 계획하는 방법을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;9. KMS 인증 시 자주 발생하는 오류 코드 및 해결법&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;KMS 구성 후 정품 인증 시 발생하는 오류 코드&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 0xC004F038 (수량 부족)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;의미:&lt;/b&gt; &quot;인증 서버의 카운트가 부족합니다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;원인:&lt;/b&gt; KMS 호스트에 연결된 클라이언트 수가 최소 기준(서버 5대 / 클라이언트 25대)을 넘지 못했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;해결:&lt;/b&gt; 더 많은 클라이언트를 연결하여 카운트를 채워야 합니다. (카운트 확인: slmgr /dlv)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 0x80070005 (권한 부족)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;의미:&lt;/b&gt; &quot;액세스가 거부되었습니다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;원인:&lt;/b&gt; 명령 프롬프트(CMD)를 '관리자 권한'으로 실행하지 않아 인증 정보를 시스템에 기록하지 못한 경우입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;해결:&lt;/b&gt; 반드시 CMD를 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;7,2,0&quot;&gt;관리자 권한으로 실행&lt;/b&gt;한 뒤 명령어를 입력하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 0xC004F074 (연결 실패/시간 초과)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;의미:&lt;/b&gt; &quot;KMS 호스트를 찾을 수 없거나 연결할 수 없습니다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;원인:&lt;/b&gt; 네트워크 문제, 방화벽(1688 포트) 차단, 또는 DNS SRV 레코드가 잘못 설정되어 호스트를 찾지 못하는 경우입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;해결:&lt;/b&gt; telnet &amp;lt;KMS서버IP&amp;gt; 1688 명령으로 포트 확인 및 DNS의 _vlmcs 레코드를 점검하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 0xC004F015 (잘못된 키/버전 미지원)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;의미:&lt;/b&gt; &quot;라이선스를 활성화할 수 없습니다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;원인:&lt;/b&gt; 호스트 버전보다 높은 버전의 클라이언트가 인증을 요청했거나(예: 2012 호스트에 2025 클라이언트), 잘못된 키가 입력된 경우입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;해결:&lt;/b&gt; KMS 호스트 서버를 최신 버전(Windows Server 2025 등)으로 교체하거나 적절한 호스트 키를 재설치하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 0x800705B4 (타임아웃)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;의미:&lt;/b&gt; &quot;작업 시간이 초과되었습니다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;원인:&lt;/b&gt; 인증 서비스(sppsvc)의 응답이 너무 늦어 시스템이 기다려주지 못하고 연결을 끊어버린 경우입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;해결:&lt;/b&gt; 레지스트리에서 ServicesPipeTimeout 시간을 늘려주거나 서비스를 재시작 후 즉시 시도하세요.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Windows</category>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/165</guid>
      <comments>https://mingming-96.tistory.com/165#entry165comment</comments>
      <pubDate>Sun, 1 Feb 2026 02:03:40 +0900</pubDate>
    </item>
    <item>
      <title>Linux 부팅 실패 후 dracut 모드로 진입했을 때의 복구 과정</title>
      <link>https://mingming-96.tistory.com/164</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Linux 부팅 실패 후 dracut 모드 진입: initramfs 재생성&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;서버 재부팅 후 Root Volume을 찾을수 없다는 에러와 함께 dracut 모드로 진입했습니다.&lt;br /&gt;dracut 모드에서 현재 상태 진단 및 복구하는 과정을 공유해보려 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 장애 상황 개요&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Netbackup의 WORM 인스턴스 다운 및 재기동 실패&lt;/li&gt;
&lt;li&gt;Netbackup 재부팅 후 정상 부팅 실패&lt;/li&gt;
&lt;li&gt;부팅 과정에서 &lt;b&gt;dracut emergency mode&lt;/b&gt; 진입&lt;/li&gt;
&lt;li&gt;루트 파일시스템을 찾지 못했다는 메시지 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시점에서 가장 큰 혼란은 명확한 원인을 찾지 못한다는 것이었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 장애 발생 환경&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1 dracut 모드 진입&lt;/h4&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;Entering emergency mode.
dracu:/#&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2 &lt;code&gt;/dev/mapper&lt;/code&gt; 상태&lt;/h4&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;ls /dev/mapper&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;control만 존재&lt;/li&gt;
&lt;li&gt;루트 볼륨으로 사용 중이던 Logical Volume이 보이지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;➡️ dm_mod는 올라왔지만, &lt;b&gt;LVM을 통해 루트 볼륨을 활성화 하지 못함.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3 LVM 명령어 상태&lt;/h4&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;dracut:/# lvs
command not found


dracut:/# pvs
command not found

dracut:/# lvm pvscan
segmentation fault&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;lvs, pvs, vgs 명령어 자체가 없음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lvm pvscan&lt;/code&gt; 실행 시 &lt;b&gt;segmentation fault 발생&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때문에 처음에는 다음과 같은 가설을 세웠다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LVM 메타데이터 손상?&lt;/li&gt;
&lt;li&gt;디스크 자체 장애?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이후 분석 결과, 이 가설은 모두 &lt;b&gt;결과에 대한 오해&lt;/b&gt;였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. segmentation fault&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;pvscan&lt;/code&gt; 실행 시 발생한 segmentation fault는 매우 위협적으로 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 segmentation fault는 다음과 같은 오류를 의미한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잘못된 메모리 접근&lt;/li&gt;
&lt;li&gt;손상된 바이너리 또는 라이브러리&lt;/li&gt;
&lt;li&gt;불완전한 실행 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 케이스에서는 &lt;b&gt;LVM 바이너리가 initramfs 내에서 필요한 라이브러리를 정상적으로 로딩하지 못한 상태&lt;/b&gt;였고,&lt;br /&gt;그 결과 pvscan이 정상 실행되지 못하며 segmentation fault가 발생한 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 리눅스 부팅 단계에서 무슨 일이 벌어졌나&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 부팅 과정은 크게 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;BIOS/UEFI
&amp;rarr; GRUB
&amp;rarr; Kernel
&amp;rarr; initramfs (dracut)
    ├─ 스토리지 드라이버 로드
    ├─ 디스크 장치 생성 (/dev/sdX, /dev/nvmeX)
    ├─ device-mapper 로드 (dm_mod)
    ├─ LVM 유저스페이스 실행
    │     ├─ pvscan
    │     ├─ VG 활성화
    │     └─ LV 생성
    ├─ root LV 마운트 (/sysroot)
&amp;rarr; systemd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 장애는 initramfs 생성 단계의 &lt;b&gt;LVM 유저스페이스 실행&lt;/b&gt; 단계에서 실패했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;initramfs 안에 LVM 관련 바이너리, 필요한 라이브러리 등이 &lt;b&gt;완전하게 포함되지 않은 상태&lt;/b&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과 커널은 정상은 로드되었지만 LVM을 통해 루트 볼륨을 활성화하지 못하였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 근본 원인 분석&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이번 장애의 근본 원인은 LVM이나 디스크 자체의 문제가 아니라, initramfs(dracut) 환경이 단독으로 손상되거나 불완전하게 생성된 것이었다.&lt;br /&gt;중요한 점은 커널 업데이트는 전혀 없었다는 사실이다. 그럼에도 불구하고 dracut 단계에서 부팅이 멈춘 이유는, 리눅스 부팅 구조상 커널과 initramfs가 서로 독립적으로 관리되기 때문이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.1 무엇이 깨졌나&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널은 정상적으로 로딩됨&lt;/li&gt;
&lt;li&gt;device-mapper 커널 모듈(dm_mod)도 로드됨&lt;/li&gt;
&lt;li&gt;initramfs 내부에 있어야 할 LVM 사용자 공간 바이너리 관련 shared library udev rule 일부 가 누락되거나 정상적으로 포함되지 않은 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과, 커널은 디스크를 인식했지만 &lt;b&gt;LVM을 통해 루트 Logical Volume을 활성화할 수 없었고&lt;/b&gt;, 부팅은 dracut 단계에서 중단되었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.2 왜 이런 일이 발생했나&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능성이 높은 원인은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;/boot&lt;/code&gt; 파티션 공간 부족 상태에서 dracut가 실행됨&lt;/li&gt;
&lt;li&gt;lvm2, dracut, systemd 등 관련 패키지 업데이트 중 initramfs 자동 재생성 실패&lt;/li&gt;
&lt;li&gt;initramfs 생성 과정 중 전원 차단 또는 강제 재부팅&lt;/li&gt;
&lt;li&gt;일시적인 I/O 오류로 인한 initramfs 이미지 손상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 어떤 경우든 공통점은 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;부팅에 필요한 모든 구성 요소가 포함되지 않은 initramfs가 생성되었다&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서는 LVM 명령어가 없거나, 실행되더라도 필요한 라이브러리를 찾지 못해 segmentation fault와 같은 비정상 동작이 발생할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 해결 방법 (복구 절차)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6.1 Rescue 모드 진입&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS 설치 ISO로 부팅&lt;/li&gt;
&lt;li&gt;Rescue mode 선택&lt;/li&gt;
&lt;li&gt;기존 시스템을 &lt;code&gt;/mnt/sysimage&lt;/code&gt;에 마운트&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mnt/sysimage&lt;/code&gt; 하위에 가상파일시스템 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;mkdir -p /mnt/sysimage

# root LV 마운트
mount /dev/mapper/root-vol /mnt/sysimage

# mount pseudo-filesystems inside chroot
for i in proc sys dev; do mount -rbind /$i /mnt/sysimage/$i; done&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6.2 chroot 진입&lt;/h4&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;chroot /mnt/sysimage /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6.3 initramfs 강제 재생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 커널의 initramfs 재생성&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;dracut -f -v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 특정 커널 지정:&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;dracut -f /boot/initramfs-$(uname -r).img $(uname -r)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;➡️ LVM, device-mapper, 필수 라이브러리를 initramfs에 다시 포함&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6.4 GRUB 설정 재생성 (안전 확인)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BIOS 환경&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;grub2-mkconfig -o /boot/grub2/grub.cfg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UEFI 환경&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;grub2-mkconfig -o /boot/efi/EFI/*/grub.cfg&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6.5 재부팅 및 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재부팅 후 체크리스트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dracut emergency shell로 떨어지지 않고 정상 부팅되는지&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/mapper/root-vol&lt;/code&gt; 이 정상적으로 마운트되는지&lt;/li&gt;
&lt;li&gt;lsblk, mount, df -h 명령으로 root filesystem 상태 확인&lt;/li&gt;
&lt;li&gt;systemctl status를 통해 주요 서비스 정상 기동 여부 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 정리하며&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7.1 디스크도 LVM도 정상인데, 왜 부팅이 되지 않았을까&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 장애를 겪으면서 가장 혼란스러웠던 점은 디스크와 LVM이 모두 정상임에도 불구하고 OS가 부팅되지 않았다는 사실이었다. 복구 모드에서는 root volume이 정상적으로 보였고, 파일시스템 역시 문제없이 마운트되었다. 그렇다 보니 자연스럽게 &amp;ldquo;이게 왜 안 올라오지?&amp;rdquo;라는 의문이 들 수밖에 없었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7.2 initramfs의 역할&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;initramfs는 단순히 부팅에 필요한 파일 묶음이 아니라, 커널이 부팅 초기에 root filesystem에 도달하기 위해 필요한 드라이버와 도구들을 담고 있는 일종의 설계도에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 경우에는 이 설계도 안에서 root LVM을 자동으로 활성화하는 과정이 정상적으로 수행되지 않았다. 그 결과 &lt;code&gt;/dev/mapper&lt;/code&gt;에는 control 디바이스만 남았고, 커널은 root filesystem을 찾지 못한 채 dracut 단계에서 멈춰 서게 되었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7.3 장애의 본질&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 이것이 디스크 손상이나 LVM 메타데이터 문제 때문이 아니라, initramfs가 생성되던 시점의 시스템 상태와 실제 재부팅 시점의 상태가 어긋나면서 발생했다는 것이다. 운영자가 의도적으로 작업을 하지 않았더라도, dracut 자동 실행 실패나 시스템 환경 변화로 인해 이러한 불일치는 충분히 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이번 장애의 본질은 &amp;ldquo;디스크가 없어서&amp;rdquo;가 아니라, &lt;b&gt;부팅 단계에서 그 디스크에 도달하지 못했다는 점&lt;/b&gt;이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 경험을 통해, dracut 모드에서 발생하는 부팅 장애는 단순히 스토리지 가시성만으로 판단해서는 안 되며, &lt;b&gt;initramfs가 부팅 과정에서 어떤 역할을 수행하는지부터 차분히 되짚어보는 것이 가장 빠른 해결로 이어진다는 점&lt;/b&gt;을 다시 한 번 확인할 수 있었다.&lt;/p&gt;</description>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/164</guid>
      <comments>https://mingming-96.tistory.com/164#entry164comment</comments>
      <pubDate>Sun, 18 Jan 2026 05:02:59 +0900</pubDate>
    </item>
    <item>
      <title>Windows 메모리 구조</title>
      <link>https://mingming-96.tistory.com/163</link>
      <description>&lt;h1 data-end=&quot;123&quot; data-start=&quot;96&quot;&gt;Windows 메모리 구조&lt;/h1&gt;
&lt;h3 data-end=&quot;181&quot; data-start=&quot;124&quot; data-ke-size=&quot;size23&quot;&gt;Committed, Working Set, Shared Memory, 반환 가능한 메모리까지&lt;/h3&gt;
&lt;p data-end=&quot;316&quot; data-start=&quot;183&quot; data-ke-size=&quot;size16&quot;&gt;Windows 서버나 VM에서 메모리를 분석하다 보면&lt;br /&gt;&lt;b&gt;Committed&lt;/b&gt;, &lt;b&gt;Working Set&lt;/b&gt;, &lt;b&gt;Private&lt;/b&gt;, &lt;b&gt;Shared&lt;/b&gt; 같은 용어들이 헷갈릴 때가 많습니다.&lt;br /&gt;특히 아래와 같은 의문이 자주 생깁니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;454&quot; data-start=&quot;318&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;354&quot; data-start=&quot;318&quot;&gt;Working Set이 왜 Committed보다 더 클까?&lt;/li&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;355&quot;&gt;프로세스가 실제로 운영체제에 돌려줄 수 있는 메모리는 어떻게 확인할까?&lt;/li&gt;
&lt;li data-end=&quot;454&quot; data-start=&quot;399&quot;&gt;Committed / Working Set / Private Memory의 관계는 어떻게 되나?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;522&quot; data-start=&quot;456&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 Windows 메모리 구조를 기반으로&lt;br /&gt;&lt;b&gt;실제 운영 환경에서 메모리를 해석하는 방법&lt;/b&gt;을 정리했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;527&quot; data-start=&quot;524&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;554&quot; data-start=&quot;529&quot;&gt;1. Windows 메모리 구조 기본 이해&lt;/h1&gt;
&lt;p data-end=&quot;589&quot; data-start=&quot;556&quot; data-ke-size=&quot;size16&quot;&gt;Windows는 프로세스 메모리를 크게 두 가지로 나눕니다.&lt;/p&gt;
&lt;h3 data-end=&quot;622&quot; data-start=&quot;591&quot; data-ke-size=&quot;size23&quot;&gt;✔ Virtual Memory (가상 메모리)&lt;/h3&gt;
&lt;p data-end=&quot;645&quot; data-start=&quot;623&quot; data-ke-size=&quot;size16&quot;&gt;프로세스가 논리적으로 확보한 주소 공간.&lt;/p&gt;
&lt;h3 data-end=&quot;679&quot; data-start=&quot;647&quot; data-ke-size=&quot;size23&quot;&gt;✔ Physical Memory (물리 메모리)&lt;/h3&gt;
&lt;p data-end=&quot;699&quot; data-start=&quot;680&quot; data-ke-size=&quot;size16&quot;&gt;RAM에 실제 올라가 있는 페이지.&lt;/p&gt;
&lt;p data-end=&quot;740&quot; data-start=&quot;701&quot; data-ke-size=&quot;size16&quot;&gt;이 둘을 구분해서 관리하기 때문에 각종 메모리 지표가 따로 존재합니다.&lt;/p&gt;
&lt;hr data-end=&quot;745&quot; data-start=&quot;742&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;770&quot; data-start=&quot;747&quot;&gt;2. Committed Memory란?&lt;/h1&gt;
&lt;p data-end=&quot;817&quot; data-start=&quot;772&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Committed Memory = 프로세스가 OS로부터 &amp;lsquo;보장받은 메모리&amp;rsquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;904&quot; data-start=&quot;819&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;847&quot; data-start=&quot;819&quot;&gt;반드시 확보되어야 하는 Private 메모리&lt;/li&gt;
&lt;li data-end=&quot;860&quot; data-start=&quot;848&quot;&gt;페이지파일 포함&lt;/li&gt;
&lt;li data-end=&quot;885&quot; data-start=&quot;861&quot;&gt;OS가 마음대로 회수할 수 없는 영역&lt;/li&gt;
&lt;li data-end=&quot;904&quot; data-start=&quot;886&quot;&gt;프로세스 단위 &amp;ldquo;필수 메모리&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;941&quot; data-start=&quot;906&quot; data-ke-size=&quot;size16&quot;&gt;즉, &amp;ldquo;이건 꼭 필요하니 보장해줘&amp;rdquo;라고 OS에 요청한 양입니다.&lt;/p&gt;
&lt;hr data-end=&quot;946&quot; data-start=&quot;943&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;974&quot; data-start=&quot;948&quot;&gt;3. Working Set(작업 집합)이란?&lt;/h1&gt;
&lt;p data-end=&quot;1018&quot; data-start=&quot;976&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Working Set = 실제 RAM에 올라와 있는 물리 메모리 전체&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1037&quot; data-start=&quot;1020&quot; data-ke-size=&quot;size16&quot;&gt;다음 요소들이 모두 포함됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1132&quot; data-start=&quot;1039&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1062&quot; data-start=&quot;1039&quot;&gt;Private Working Set&lt;/li&gt;
&lt;li data-end=&quot;1085&quot; data-start=&quot;1063&quot;&gt;Shared Working Set&lt;/li&gt;
&lt;li data-end=&quot;1107&quot; data-start=&quot;1086&quot;&gt;File-backed pages&lt;/li&gt;
&lt;li data-end=&quot;1132&quot; data-start=&quot;1108&quot;&gt;Prefetch / Cache pages&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1171&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size16&quot;&gt;즉, 프로세스가 지금 당장 RAM에서 사용 중인 모든 페이지입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1176&quot; data-start=&quot;1173&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1213&quot; data-start=&quot;1178&quot;&gt;4. 왜 Working Set이 Committed보다 클까?&lt;/h1&gt;
&lt;p data-end=&quot;1237&quot; data-start=&quot;1215&quot; data-ke-size=&quot;size16&quot;&gt;많은 관리자들이 여기서 의문을 가집니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1285&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size23&quot;&gt;✔ Resource Monitor에서 WS &amp;gt; Commit이 나오는 이유&lt;/h3&gt;
&lt;p data-end=&quot;1384&quot; data-start=&quot;1286&quot; data-ke-size=&quot;size16&quot;&gt;Commit에는 &lt;b&gt;Private 메모리&lt;/b&gt;만 포함되지만,&lt;br /&gt;Working Set에는 &lt;b&gt;Shared + File-backed + Private&lt;/b&gt; 모두 포함되기 때문입니다.&lt;/p&gt;
&lt;p data-end=&quot;1389&quot; data-start=&quot;1386&quot; data-ke-size=&quot;size16&quot;&gt;예시)&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1520&quot; data-start=&quot;1391&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Committed&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Working Set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1467&quot; data-start=&quot;1442&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1453&quot; data-start=&quot;1442&quot;&gt;1,668 KB&lt;/td&gt;
&lt;td data-end=&quot;1467&quot; data-start=&quot;1453&quot; data-col-size=&quot;sm&quot;&gt;117,040 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1492&quot; data-start=&quot;1468&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1479&quot; data-start=&quot;1468&quot;&gt;5,120 KB&lt;/td&gt;
&lt;td data-end=&quot;1492&quot; data-start=&quot;1479&quot; data-col-size=&quot;sm&quot;&gt;18,864 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1520&quot; data-start=&quot;1493&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1506&quot; data-start=&quot;1493&quot;&gt;215,324 KB&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1520&quot; data-start=&quot;1506&quot;&gt;222,228 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1603&quot; data-start=&quot;1522&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 Working Set이 더 크게 보이는 것은&lt;br /&gt;&lt;b&gt;Shared 메모리가 Process의 WS로 잡혀서 그런 것&lt;/b&gt;이며 완전히 정상입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1608&quot; data-start=&quot;1605&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1652&quot; data-start=&quot;1610&quot;&gt;5. Private / Shared / File-backed / Stanby Cache 메모리 차이&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1854&quot; data-start=&quot;1654&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;회수 가능 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1748&quot; data-start=&quot;1716&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1726&quot; data-start=&quot;1716&quot;&gt;Private&lt;/td&gt;
&lt;td data-end=&quot;1740&quot; data-start=&quot;1726&quot; data-col-size=&quot;sm&quot;&gt;프로세스 고유 메모리&lt;/td&gt;
&lt;td data-end=&quot;1748&quot; data-start=&quot;1740&quot; data-col-size=&quot;sm&quot;&gt;△ 가능하지만 제한적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1786&quot; data-start=&quot;1749&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1758&quot; data-start=&quot;1749&quot;&gt;Shared&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1778&quot; data-start=&quot;1758&quot;&gt;DLL 등 다른 프로세스와 공유&lt;/td&gt;
&lt;td data-end=&quot;1786&quot; data-start=&quot;1778&quot; data-col-size=&quot;sm&quot;&gt;⭕ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1820&quot; data-start=&quot;1787&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1801&quot; data-start=&quot;1787&quot;&gt;File-backed&lt;/td&gt;
&lt;td data-end=&quot;1812&quot; data-start=&quot;1801&quot; data-col-size=&quot;sm&quot;&gt;파일 매핑 기반&lt;/td&gt;
&lt;td data-end=&quot;1820&quot; data-start=&quot;1812&quot; data-col-size=&quot;sm&quot;&gt;⭕ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1854&quot; data-start=&quot;1821&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1837&quot; data-start=&quot;1821&quot;&gt;Standby Cache&lt;/td&gt;
&lt;td data-end=&quot;1846&quot; data-start=&quot;1837&quot; data-col-size=&quot;sm&quot;&gt;캐시 페이지&lt;/td&gt;
&lt;td data-end=&quot;1854&quot; data-start=&quot;1846&quot; data-col-size=&quot;sm&quot;&gt;⭕ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1893&quot; data-start=&quot;1856&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;ldquo;회수 가능&amp;rdquo;한 것들이 WS에 포함되므로 WS가 커질 수 있음.&lt;/p&gt;
&lt;hr data-end=&quot;1898&quot; data-start=&quot;1895&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1937&quot; data-start=&quot;1900&quot;&gt;6. 반환 가능한 메모리(Reclaimable Memory)란?&lt;/h1&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1939&quot; data-ke-size=&quot;size16&quot;&gt;운영체제가 상황에 따라 언제든지 회수(trim)할 수 있는 메모리입니다.&lt;/p&gt;
&lt;p data-end=&quot;1989&quot; data-start=&quot;1981&quot; data-ke-size=&quot;size16&quot;&gt;포함되는 영역:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2090&quot; data-start=&quot;1991&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2013&quot; data-start=&quot;1991&quot;&gt;Shared Working Set&lt;/li&gt;
&lt;li data-end=&quot;2041&quot; data-start=&quot;2014&quot;&gt;File-backed Working Set&lt;/li&gt;
&lt;li data-end=&quot;2058&quot; data-start=&quot;2042&quot;&gt;Standby list&lt;/li&gt;
&lt;li data-end=&quot;2090&quot; data-start=&quot;2059&quot;&gt;Modified pages(디스크에 쓰면 회수 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2138&quot; data-start=&quot;2092&quot; data-ke-size=&quot;size16&quot;&gt;즉, Working Set의 상당 부분은 언제든지 회수 가능한 메모리라는 뜻입니다.&lt;/p&gt;
&lt;hr data-end=&quot;2143&quot; data-start=&quot;2140&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2166&quot; data-start=&quot;2145&quot;&gt;7. 반환 가능한 메모리 확인 방법&lt;/h1&gt;
&lt;h3 data-end=&quot;2204&quot; data-start=&quot;2168&quot; data-ke-size=&quot;size23&quot;&gt;❗ Resource Monitor로는 정확한 확인 불가&lt;/h3&gt;
&lt;p data-end=&quot;2280&quot; data-start=&quot;2205&quot; data-ke-size=&quot;size16&quot;&gt;Resource Monitor는 &lt;b&gt;Private Working Set 표시가 없음&lt;/b&gt;&lt;br /&gt;&amp;rarr; 반환 가능한 메모리 계산 자체가 불가능.&lt;/p&gt;
&lt;p data-end=&quot;2310&quot; data-start=&quot;2282&quot; data-ke-size=&quot;size16&quot;&gt;정확한 확인은 아래 두 가지 방법으로만 가능합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2315&quot; data-start=&quot;2312&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2352&quot; data-start=&quot;2317&quot; data-ke-size=&quot;size26&quot;&gt;✔ 방법 1) Process Explorer (가장 정확)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2492&quot; data-start=&quot;2354&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2391&quot; data-start=&quot;2354&quot;&gt;Sysinternals Process Explorer 실행&lt;/li&gt;
&lt;li data-end=&quot;2408&quot; data-start=&quot;2392&quot;&gt;프로세스를 더블 클릭&lt;/li&gt;
&lt;li data-end=&quot;2492&quot; data-start=&quot;2409&quot;&gt;아래 항목 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2492&quot; data-start=&quot;2426&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2441&quot; data-start=&quot;2426&quot;&gt;Working Set&lt;/li&gt;
&lt;li data-end=&quot;2468&quot; data-start=&quot;2445&quot;&gt;Private Working Set&lt;/li&gt;
&lt;li data-end=&quot;2492&quot; data-start=&quot;2472&quot;&gt;Shared Working Set&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;반환 가능 메모리 = Working &lt;/span&gt;&lt;span&gt;&lt;span&gt;Set&lt;/span&gt;&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span&gt;&lt;span&gt;Private&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Working &lt;/span&gt;&lt;span&gt;&lt;span&gt;Set&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2616&quot; data-start=&quot;2571&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2594&quot; data-start=&quot;2571&quot;&gt;Working Set = 120MB&lt;/li&gt;
&lt;li data-end=&quot;2616&quot; data-start=&quot;2595&quot;&gt;Private WS = 20MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2641&quot; data-start=&quot;2618&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 반환 가능 메모리 = &lt;b&gt;100MB&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2676&quot; data-start=&quot;2643&quot; data-ke-size=&quot;size16&quot;&gt;즉, OS가 필요하면 100MB는 바로 회수할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2681&quot; data-start=&quot;2678&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2720&quot; data-start=&quot;2683&quot; data-ke-size=&quot;size26&quot;&gt;✔ 방법 2) Perfmon Counter 사용 (운영 수준)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2842&quot; data-start=&quot;2722&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2747&quot; data-start=&quot;2722&quot;&gt;Process &amp;rarr; Working Set&lt;/li&gt;
&lt;li data-end=&quot;2783&quot; data-start=&quot;2748&quot;&gt;Process &amp;rarr; Working Set &amp;ndash; Private&lt;/li&gt;
&lt;li data-end=&quot;2810&quot; data-start=&quot;2784&quot;&gt;Memory &amp;rarr; Standby Cache&lt;/li&gt;
&lt;li data-end=&quot;2842&quot; data-start=&quot;2811&quot;&gt;Memory &amp;rarr; Modified Page List&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2904&quot; data-start=&quot;2844&quot; data-ke-size=&quot;size16&quot;&gt;이 조합을 통해 프로세스의 &amp;ldquo;실제 필요한 메모리&amp;rdquo;와&lt;br /&gt;&amp;ldquo;회수 가능한 메모리&amp;rdquo;를 정확히 구분할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2909&quot; data-start=&quot;2906&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2928&quot; data-start=&quot;2911&quot;&gt;8. 메모리 누수 판단 기준&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3043&quot; data-start=&quot;2930&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2979&quot; data-start=&quot;2930&quot;&gt;&lt;b&gt;Commit 증가 &amp;rarr; Private Memory 증가 &amp;rarr; 누수 가능성 높음&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3023&quot; data-start=&quot;2980&quot;&gt;&lt;b&gt;Working Set 증가만으로는 누수 판단 불가&lt;/b&gt; (캐시 포함)&lt;/li&gt;
&lt;li data-end=&quot;3043&quot; data-start=&quot;3024&quot;&gt;Shared WS는 누수와 무관&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3078&quot; data-start=&quot;3045&quot; data-ke-size=&quot;size16&quot;&gt;진짜 위험한 것은 Commit이 끝없이 증가하는 경우입니다.&lt;/p&gt;
&lt;hr data-end=&quot;3083&quot; data-start=&quot;3080&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3095&quot; data-start=&quot;3085&quot;&gt;9. 최종 정리&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 126px;&quot; border=&quot;1&quot; data-end=&quot;3335&quot; data-start=&quot;3097&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;3170&quot; data-start=&quot;3125&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;3137&quot; data-start=&quot;3125&quot;&gt;Committed&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;3170&quot; data-start=&quot;3137&quot; data-col-size=&quot;sm&quot;&gt;프로세스가 예약한 Private 메모리 (반환 불가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;3207&quot; data-start=&quot;3171&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;3185&quot; data-start=&quot;3171&quot;&gt;Working Set&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;3207&quot; data-start=&quot;3185&quot; data-col-size=&quot;sm&quot;&gt;현재 RAM에 올라온 전체 메모리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;3254&quot; data-start=&quot;3208&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;3230&quot; data-start=&quot;3208&quot;&gt;Private Working Set&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;3254&quot; data-start=&quot;3230&quot; data-col-size=&quot;sm&quot;&gt;프로세스가 반드시 필요한 최소 메모리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;3291&quot; data-start=&quot;3255&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;3273&quot; data-start=&quot;3255&quot;&gt;WS - Private WS&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;3291&quot; data-start=&quot;3273&quot; data-col-size=&quot;sm&quot;&gt;OS가 회수 가능한 메모리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>Windows</category>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/163</guid>
      <comments>https://mingming-96.tistory.com/163#entry163comment</comments>
      <pubDate>Sat, 22 Nov 2025 18:12:14 +0900</pubDate>
    </item>
    <item>
      <title>IPSec VPN Phase 1 &amp;amp; Phase 2</title>
      <link>https://mingming-96.tistory.com/162</link>
      <description>&lt;h2 data-end=&quot;822&quot; data-start=&quot;790&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 1: IKE SA 협상 (보안 채널 설정)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-end=&quot;833&quot; data-start=&quot;824&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. 목적&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;956&quot; data-start=&quot;834&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 1은 VPN 장비가 서로를 인증하고, 안전한 &lt;b&gt;IKE SA&lt;/b&gt;(보안 채널)를 생성하는 단계입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 IKE SA는 Phase 2에서 실제 데이터 트래픽 보호를 위한 IPSec SA의 기반이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;970&quot; data-start=&quot;958&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2. 배경 지식&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1199&quot; data-start=&quot;971&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1037&quot; data-start=&quot;971&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;IPSec: &lt;/b&gt;Layer3 에서 데이터 암호화 및 인증을 통해 안전한 통신 제공&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1098&quot; data-start=&quot;1038&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;IKE (Internet Key Exchange): &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;안전한 키 교환과 SA 생성 프로토콜&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1139&quot; data-start=&quot;1099&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;HMAC (Hash-based Message Authentication Code): &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메시지 무결성 검증용 해시 기반 인증 코드&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1199&quot; data-start=&quot;1140&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Diffie-Hellman (DH): &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;안전한 공유 비밀 키 생성용 공개키 교환 알고리즘&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1204&quot; data-start=&quot;1201&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1218&quot; data-start=&quot;1206&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3. 구성 요소&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1514&quot; data-start=&quot;1220&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 22.7907%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 37.3256%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 39.8837%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예시&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1308&quot; data-start=&quot;1257&quot;&gt;
&lt;td style=&quot;text-align: center; width: 22.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1265&quot; data-start=&quot;1257&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;인증 방식&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 37.3256%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1280&quot; data-start=&quot;1265&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;VPN 장치 인증 수단&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 39.8837%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1308&quot; data-start=&quot;1280&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PSK, Digital Certificate&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1354&quot; data-start=&quot;1309&quot;&gt;
&lt;td style=&quot;text-align: center; width: 22.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1320&quot; data-start=&quot;1309&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;암호화 알고리즘&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 37.3256%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1329&quot; data-start=&quot;1320&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;데이터 보호&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 39.8837%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1354&quot; data-start=&quot;1329&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;AES-128/192/256, 3DES&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1397&quot; data-start=&quot;1355&quot;&gt;
&lt;td style=&quot;text-align: center; width: 22.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1364&quot; data-start=&quot;1355&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해시/무결성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 37.3256%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1374&quot; data-start=&quot;1364&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메시지 무결성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 39.8837%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1397&quot; data-start=&quot;1374&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SHA-1, SHA-256, MD5&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1439&quot; data-start=&quot;1398&quot;&gt;
&lt;td style=&quot;text-align: center; width: 22.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1406&quot; data-start=&quot;1398&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DH 그룹&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 37.3256%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1419&quot; data-start=&quot;1406&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;키 교환 안전 수준&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 39.8837%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1439&quot; data-start=&quot;1419&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2, 5, 14, 19, 20&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1480&quot; data-start=&quot;1440&quot;&gt;
&lt;td style=&quot;text-align: center; width: 22.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1454&quot; data-start=&quot;1440&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;IKE Version&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 37.3256%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1464&quot; data-start=&quot;1454&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프로토콜 버전&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 39.8837%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1480&quot; data-start=&quot;1464&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;IKEv1, IKEv2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1514&quot; data-start=&quot;1481&quot;&gt;
&lt;td style=&quot;text-align: center; width: 22.7907%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1492&quot; data-start=&quot;1481&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;LifeTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 37.3256%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1503&quot; data-start=&quot;1492&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SA 유효 기간&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; width: 39.8837%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1514&quot; data-start=&quot;1503&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1519&quot; data-start=&quot;1516&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1550&quot; data-start=&quot;1521&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4. Phase 1 &amp;ndash; IKE SA 협상 과정&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-end=&quot;1577&quot; data-start=&quot;1552&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4.1 단계 1: Initiation&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1698&quot; data-start=&quot;1578&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1619&quot; data-start=&quot;1578&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Initiator &amp;rarr; Responder: SA Proposal 전달&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1660&quot; data-start=&quot;1620&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포함 정보: 암호화/해시/인증 방식, DH 그룹, LifeTime&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1698&quot; data-start=&quot;1661&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Responder &amp;rarr; Initiator: 지원 가능한 옵션 선택&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1722&quot; data-start=&quot;1700&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4.2 단계 2: DH 키 교환&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1871&quot; data-start=&quot;1723&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1750&quot; data-start=&quot;1723&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Initiator와 Responder 상호 공개키 교환 &amp;rarr; 공유 비밀 키 생성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1871&quot; data-start=&quot;1751&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Nonce(Ni, Nr) + DH 공개값으로 &lt;b&gt;세션 키 파생&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1871&quot; data-start=&quot;1794&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1816&quot; data-start=&quot;1794&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_d: Phase2 데이터 키&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1844&quot; data-start=&quot;1821&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_ai/SK_ar: HMAC 키&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1871&quot; data-start=&quot;1849&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_ei/SK_er: 암호화 키&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1890&quot; data-start=&quot;1873&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4.3 단계 3: 인증&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2172&quot; data-start=&quot;1891&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1969&quot; data-start=&quot;1891&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Initiator &amp;rarr; Responder&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1969&quot; data-start=&quot;1919&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1949&quot; data-start=&quot;1919&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_ei로 암호화, SK_ai로 HMAC 생성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1969&quot; data-start=&quot;1954&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;IDi + AUTH 전송&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2015&quot; data-start=&quot;1970&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Responder 처리&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2015&quot; data-start=&quot;1989&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2015&quot; data-start=&quot;1989&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_ei 복호화, SK_ai HMAC 검증&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2093&quot; data-start=&quot;2016&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Responder &amp;rarr; Initiator&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2093&quot; data-start=&quot;2044&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2073&quot; data-start=&quot;2044&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_er로 암호화, SK_ar HMAC 생성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2093&quot; data-start=&quot;2078&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;IDr + AUTH 전송&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2141&quot; data-start=&quot;2094&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Initiator 처리&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2141&quot; data-start=&quot;2113&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2141&quot; data-start=&quot;2113&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_er 복호화, SK_ar HMAC 검증&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2172&quot; data-start=&quot;2142&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;결과: 상호 인증 완료 &amp;rarr; &lt;b&gt;IKE SA 확립&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2177&quot; data-start=&quot;2174&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2218&quot; data-start=&quot;2179&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;5. Phase 1 메시지 흐름 (IKEv1 Main Mode)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 140px;&quot; border=&quot;1&quot; data-end=&quot;2571&quot; data-start=&quot;2220&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;단계&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메시지&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;2312&quot; data-start=&quot;2258&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2262&quot; data-start=&quot;2258&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2293&quot; data-start=&quot;2262&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Initiator &amp;rarr; Responder: SA 제안&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2312&quot; data-start=&quot;2293&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;암호화/해시/인증 방식 제시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;2364&quot; data-start=&quot;2313&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2317&quot; data-start=&quot;2313&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2348&quot; data-start=&quot;2317&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Responder &amp;rarr; Initiator: SA 수락&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2364&quot; data-start=&quot;2348&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;제안 수락, 협상 완료&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;2414&quot; data-start=&quot;2365&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2369&quot; data-start=&quot;2365&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2391&quot; data-start=&quot;2369&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DH + Nonce 상호 교환&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2414&quot; data-start=&quot;2391&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;공유 비밀 키 계산, SK_* 파생&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;2471&quot; data-start=&quot;2415&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2419&quot; data-start=&quot;2415&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2451&quot; data-start=&quot;2419&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Initiator &amp;rarr; Responder: 인증 메시지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2471&quot; data-start=&quot;2451&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;ID + AUTH 암호화 전송&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;2528&quot; data-start=&quot;2472&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2476&quot; data-start=&quot;2472&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2508&quot; data-start=&quot;2476&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Responder &amp;rarr; Initiator: 인증 메시지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2528&quot; data-start=&quot;2508&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;ID + AUTH 암호화 전송&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;2571&quot; data-start=&quot;2529&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2533&quot; data-start=&quot;2529&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;6&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2546&quot; data-start=&quot;2533&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 1 완료&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2571&quot; data-start=&quot;2546&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;IKE SA 확립, Phase 2 준비&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2576&quot; data-start=&quot;2573&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2613&quot; data-start=&quot;2578&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 2: IPSec SA 협상 (데이터 보호 채널)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-end=&quot;2624&quot; data-start=&quot;2615&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. 목적&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2682&quot; data-start=&quot;2625&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 2는 실제 데이터 트래픽을 암호화하기 위한 &lt;b&gt;IPSec SA&lt;/b&gt;를 설정하는 단계입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;2696&quot; data-start=&quot;2684&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2. 배경 지식&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2812&quot; data-start=&quot;2697&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2726&quot; data-start=&quot;2697&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;SPI&lt;/b&gt;: 각 SA를 식별하는 고유 번호&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2770&quot; data-start=&quot;2727&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Transform Set&lt;/b&gt;: 사용할 암호화/인증/PFS 방식 결정&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2812&quot; data-start=&quot;2771&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;PFS(Perfect Forward Secrecy)&lt;/b&gt;: DH 재교환으로 이전 키 노출에도 안전한 통신 제공&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2817&quot; data-start=&quot;2814&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2850&quot; data-start=&quot;2819&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3. Phase 2 &amp;ndash; IPSec SA 협상 과정&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-end=&quot;2896&quot; data-start=&quot;2852&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3.1 IPSec SA 제안 (Initiator &amp;rarr; Responder)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2983&quot; data-start=&quot;2897&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2943&quot; data-start=&quot;2897&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;제안 항목: 프로토콜(AH/ESP), 암호화/해시 알고리즘, Lifetime&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2983&quot; data-start=&quot;2944&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 1 IKE SA를 이용해 메시지 암호화 + HMAC 무결성 검증&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;3028&quot; data-start=&quot;2985&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3.2 SA 수락 및 응답 (Responder &amp;rarr; Initiator)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3120&quot; data-start=&quot;3029&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3050&quot; data-start=&quot;3029&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;제안 중 허용 가능한 옵션 선택&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3080&quot; data-start=&quot;3051&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PFS 사용 시 DH 교환 및 Nonce 사용&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3120&quot; data-start=&quot;3081&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 1 키(SK_ei, SK_ai 등)로 암호화/무결성 검증&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;3141&quot; data-start=&quot;3122&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3.3 인증 및 SA 확립&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3484&quot; data-start=&quot;3142&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3254&quot; data-start=&quot;3142&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Initiator &amp;rarr; Responder&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3254&quot; data-start=&quot;3174&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3204&quot; data-start=&quot;3174&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_ei로 암호화, SK_ai로 HMAC 생성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3254&quot; data-start=&quot;3209&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이전 단계 교환값(Ni, Nr) 기반 IPSec 세션 키 계산, HASH 전송&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3334&quot; data-start=&quot;3255&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Responder 처리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3334&quot; data-start=&quot;3278&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3306&quot; data-start=&quot;3278&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_ei 복호화, SK_ai HMAC 검증&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3334&quot; data-start=&quot;3311&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;HASH 확인 &amp;rarr; IPSec SA 생성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3417&quot; data-start=&quot;3335&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Responder &amp;rarr; Initiator&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3417&quot; data-start=&quot;3367&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3395&quot; data-start=&quot;3367&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_er 암호화, SK_ar HMAC 생성&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3417&quot; data-start=&quot;3400&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;IDr + 인증 데이터 전송&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3484&quot; data-start=&quot;3418&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Initiator 처리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3484&quot; data-start=&quot;3441&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3484&quot; data-start=&quot;3441&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SK_er 복호화, SK_ar HMAC 검증 &amp;rarr; IPSec SA 확립 완료&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3489&quot; data-start=&quot;3486&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;3499&quot; data-start=&quot;3491&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4. Phase 2 메시지 흐름 (Quick Mode)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.74419%; text-align: center;&quot;&gt;단계&lt;/td&gt;
&lt;td style=&quot;width: 32.3255%; text-align: center;&quot;&gt;메시지&lt;/td&gt;
&lt;td style=&quot;width: 60.814%; text-align: center;&quot;&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.74419%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 32.3255%; text-align: left;&quot;&gt;Initiator &amp;rarr; Responder: IPSec SA 제안&lt;/td&gt;
&lt;td style=&quot;width: 60.814%; text-align: left;&quot;&gt;프로토콜(AH/ESP), 암호화/해시 알고리즘, Lifetime 등 제안. Phase 1에서 확립된 IKE SA를 이용해 암호화(HMAC 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.74419%; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 32.3255%; text-align: left;&quot;&gt;Responder &amp;rarr; Initiator: SA 수락&lt;/td&gt;
&lt;td style=&quot;width: 60.814%; text-align: left;&quot;&gt;협상된 IPSec SA 선택, 제안 수락&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.74419%; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 32.3255%; text-align: left;&quot;&gt;(Optional) DH 교환&lt;/td&gt;
&lt;td style=&quot;width: 60.814%; text-align: left;&quot;&gt;PFS 적용 시, 새로운 공유 키 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.74419%; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 32.3255%; text-align: left;&quot;&gt;Phase 2 완료&lt;/td&gt;
&lt;td style=&quot;width: 60.814%; text-align: left;&quot;&gt;상호 인증 완료 및 IPSec SA 확립 &amp;rarr; 실제 데이터 트래픽 암호화 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-end=&quot;3499&quot; data-start=&quot;3491&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;요약&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3646&quot; data-start=&quot;3500&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3541&quot; data-start=&quot;3500&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 1: &lt;b&gt;IKE SA 생성&lt;/b&gt; &amp;rarr; 안전한 제어 채널 확보&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3587&quot; data-start=&quot;3542&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Phase 2: &lt;b&gt;IPSec SA 생성&lt;/b&gt; &amp;rarr; 실제 데이터 트래픽 암호화&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3646&quot; data-start=&quot;3588&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;양 단계 모두 &lt;b&gt;암호화, HMAC, Nonce, DH 키&lt;/b&gt;를 이용하여 인증, 무결성, 기밀성 확보&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/162</guid>
      <comments>https://mingming-96.tistory.com/162#entry162comment</comments>
      <pubDate>Sun, 12 Oct 2025 04:38:34 +0900</pubDate>
    </item>
    <item>
      <title>Linux 부팅 커널 변경 및 커널 자동 업데이트 방지 설정</title>
      <link>https://mingming-96.tistory.com/161</link>
      <description>&lt;h1 data-end=&quot;213&quot; data-start=&quot;175&quot;&gt;Linux 부팅 커널 변경 및 커널 자동 업데이트 방지 설정&lt;/h1&gt;
&lt;p data-end=&quot;317&quot; data-start=&quot;215&quot; data-ke-size=&quot;size16&quot;&gt;운영 중인 리눅스 서버에서 커널이 자동으로 업데이트되면 예상치 못한 커널 버전 차이로 부팅 장애나 드라이버 호환성 문제가 발생할 수 있습니다.&lt;br /&gt;이 글에서는 다음을 다룹니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;412&quot; data-start=&quot;319&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;334&quot; data-start=&quot;319&quot;&gt;현재 부팅 커널 확인&lt;/li&gt;
&lt;li data-end=&quot;353&quot; data-start=&quot;335&quot;&gt;부팅 시 사용할 커널 변경&lt;/li&gt;
&lt;li data-end=&quot;387&quot; data-start=&quot;354&quot;&gt;yum update 실행 시 커널 자동 설치 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;417&quot; data-start=&quot;414&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;440&quot; data-start=&quot;419&quot; data-ke-size=&quot;size26&quot;&gt;1. 현재 커널 버전 확인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759668617242&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uname -r
5.14.0-570.42.2.el9_6.x86_64&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;509&quot; data-ke-size=&quot;size16&quot;&gt;현재 실행 중인 커널 버전을 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;541&quot; data-start=&quot;538&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;565&quot; data-start=&quot;543&quot; data-ke-size=&quot;size26&quot;&gt;2. 설치된 커널 목록 확인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759668643485&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rpm -qa | grep kernel

rpm -qa --last | grep kernel
kernel-5.14.0-570.42.2.el9_6.x86_64 Fri 04 Oct 2025 09:14:36 PM KST kernel-5.14.0-362.24.1.el9_3.x86_64 Mon 17 Jun 2024 10:10:55 AM KST&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;821&quot; data-start=&quot;818&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;850&quot; data-start=&quot;823&quot; data-ke-size=&quot;size26&quot;&gt;3. 부팅 시 사용할 커널 버전 변경&lt;/h2&gt;
&lt;p data-end=&quot;911&quot; data-start=&quot;852&quot; data-ke-size=&quot;size16&quot;&gt;리눅스는 여러 커널이 설치되어 있을 때, &lt;b&gt;GRUB 부트로더&lt;/b&gt;를 통해 어느 커널로 부팅할지 결정합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;930&quot; data-start=&quot;913&quot; data-ke-size=&quot;size23&quot;&gt;▶ 현재 부팅 순서 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759668691767&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo grub2-editenv list
saved_entry=2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1043&quot; data-start=&quot;1040&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1069&quot; data-start=&quot;1045&quot; data-ke-size=&quot;size23&quot;&gt;▶ 사용 가능한 부팅 커널 목록 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;CentOS&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759668717257&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo awk -F\' '/menuentry / {print $2}' /etc/grub2.cfg
Rocky Linux (5.14.0-570.42.2.el9_6.x86_64) Rocky Linux (5.14.0-362.24.1.el9_3.x86_64)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Rocky Linux(RHEL 8이상)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1759668877942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep '^title' /boot/loader/entries/*.conf | awk -F'title ' '{print $2}'​&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1243&quot; data-start=&quot;1240&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1262&quot; data-start=&quot;1245&quot; data-ke-size=&quot;size23&quot;&gt;▶ 기본 부팅 커널 변경&lt;/h3&gt;
&lt;p data-end=&quot;1306&quot; data-start=&quot;1264&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 두 번째 커널(5.14.0-362.24.1)로 부팅하고 싶다면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759668903668&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo grub2-set-default 1 sudo grub2-editenv list
&amp;rarr; saved_entry=1 로 변경되면 성공&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1424&quot; data-start=&quot;1401&quot; data-ke-size=&quot;size16&quot;&gt;이후 재부팅 시 지정된 커널로 부팅됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1429&quot; data-start=&quot;1426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1465&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size26&quot;&gt;4. yum update 시 커널 자동 설치 원리&lt;/h2&gt;
&lt;p data-end=&quot;1615&quot; data-start=&quot;1467&quot; data-ke-size=&quot;size16&quot;&gt;yum update(또는 dnf update)는 시스템의 &lt;b&gt;모든 패키지 중 최신 버전이 있는 항목을 전부 갱신&lt;/b&gt;합니다.&lt;br /&gt;커널(kernel, kernel-core, kernel-modules)도 RPM 패키지이기 때문에 기본적으로 포함됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759668925688&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum update -y
실행 시 자동으로 새로운 커널이 설치됩니다.

업데이트 로그 확인
grep -i kernel /var/log/yum.log or /var/log/dnf.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1690&quot; data-start=&quot;1679&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1803&quot; data-start=&quot;1800&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1836&quot; data-start=&quot;1805&quot; data-ke-size=&quot;size26&quot;&gt;5. yum update 시 커널 제외 설정&lt;/h2&gt;
&lt;p data-end=&quot;1952&quot; data-start=&quot;1838&quot; data-ke-size=&quot;size16&quot;&gt;커널 업데이트를 자동으로 포함하지 않게 하려면,&lt;br /&gt;/etc/dnf/dnf.conf 파일을 하기와 같이 수정합니다. (RHEL 8 이상은 dnf가 yum을 대체합니다)&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759669017280&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vi /etc/dnf/dnf.conf
exclude=kernel*&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;2066&quot; data-start=&quot;2031&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;2066&quot; data-start=&quot;2033&quot; data-ke-size=&quot;size16&quot;&gt;yum update 실행 시 커널은 제외됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2071&quot; data-start=&quot;2068&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2098&quot; data-start=&quot;2073&quot; data-ke-size=&quot;size23&quot;&gt;일시적으로만 커널 제외하고 싶다면&lt;/h3&gt;
&lt;p data-end=&quot;2135&quot; data-start=&quot;2099&quot; data-ke-size=&quot;size16&quot;&gt;전역 설정을 바꾸지 않고, 특정 명령에서만 제외할 수도 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759669051526&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum update --exclude=kernel*&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2668&quot; data-start=&quot;2665&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2698&quot; data-start=&quot;2670&quot; data-ke-size=&quot;size26&quot;&gt;6. 추가 팁: 오래된 커널 자동 정리&lt;/h2&gt;
&lt;p data-end=&quot;2777&quot; data-start=&quot;2700&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 DNF는 최신 커널 3개만 유지합니다.&lt;br /&gt;이 갯수를 조정하려면 /etc/dnf/dnf.conf 의 아래 항목을 수정합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759669101881&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;installonly_limit=3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2866&quot; data-start=&quot;2863&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2878&quot; data-start=&quot;2868&quot; data-ke-size=&quot;size26&quot;&gt;7. 정리 요약&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3335&quot; data-start=&quot;2880&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3335&quot; data-start=&quot;2936&quot;&gt;
&lt;tr data-end=&quot;2974&quot; data-start=&quot;2936&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2947&quot; data-start=&quot;2936&quot;&gt;현재 커널 확인&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2960&quot; data-start=&quot;2947&quot;&gt;uname -r&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2974&quot; data-start=&quot;2960&quot;&gt;실행 중 커널 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3032&quot; data-start=&quot;2975&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2987&quot; data-start=&quot;2975&quot;&gt;설치된 커널 확인&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3005&quot; data-start=&quot;2987&quot;&gt;`rpm -qa --last&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3020&quot; data-start=&quot;3005&quot;&gt;grep kernel`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3083&quot; data-start=&quot;3033&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3044&quot; data-start=&quot;3033&quot;&gt;부팅 커널 변경&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3068&quot; data-start=&quot;3044&quot;&gt;grub2-set-default N&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3083&quot; data-start=&quot;3068&quot;&gt;기본 부팅 커널 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3157&quot; data-start=&quot;3084&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3105&quot; data-start=&quot;3084&quot;&gt;yum update 시 커널 제외&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3145&quot; data-start=&quot;3105&quot;&gt;/etc/dnf/dnf.conf &amp;rarr; exclude=kernel*&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3157&quot; data-start=&quot;3145&quot;&gt;자동 설치 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3210&quot; data-start=&quot;3158&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3167&quot; data-start=&quot;3158&quot;&gt;일시적 제외&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3200&quot; data-start=&quot;3167&quot;&gt;yum update --exclude=kernel*&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3210&quot; data-start=&quot;3200&quot;&gt;1회성 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3283&quot; data-start=&quot;3211&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3224&quot; data-start=&quot;3211&quot;&gt;자동 업데이트 중지&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3266&quot; data-start=&quot;3224&quot;&gt;systemctl disable dnf-automatic.timer&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3283&quot; data-start=&quot;3266&quot;&gt;자동 커널 업데이트 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3335&quot; data-start=&quot;3284&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3296&quot; data-start=&quot;3284&quot;&gt;오래된 커널 정리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3320&quot; data-start=&quot;3296&quot;&gt;installonly_limit=3&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3335&quot; data-start=&quot;3320&quot;&gt;커널 유지 개수 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3518&quot; data-start=&quot;3353&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/161</guid>
      <comments>https://mingming-96.tistory.com/161#entry161comment</comments>
      <pubDate>Sun, 5 Oct 2025 22:00:26 +0900</pubDate>
    </item>
    <item>
      <title>Netbackup AWS Integration</title>
      <link>https://mingming-96.tistory.com/160</link>
      <description>&lt;h1 data-end=&quot;164&quot; data-start=&quot;117&quot;&gt;NetBackup Snapshot Manager AWS Cross-Account Integration&lt;/h1&gt;
&lt;p data-end=&quot;288&quot; data-start=&quot;166&quot; data-ke-size=&quot;size16&quot;&gt;AWS에서 서비스를 운영하다 보면, 계정을 하나만 쓰지 않고 여러 개로 나눠 쓰는 경우가 많습니다.&lt;br /&gt;예를 들어, 운영 계정에는 실제 서비스가 돌고, 별도의 보안/백업 계정에서는 모니터링과 로그만 관리하는 식이죠.&lt;/p&gt;
&lt;p data-end=&quot;288&quot; data-start=&quot;166&quot; data-ke-size=&quot;size16&quot;&gt;바로 &lt;b&gt;Cross-Account Integration&lt;/b&gt;을 설정해서, Snapshot Manager가 다른 계정 리소스까지 백업하도록 만드는 방법이 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;500&quot; data-start=&quot;497&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;528&quot; data-start=&quot;502&quot; data-ke-size=&quot;size26&quot;&gt;Cross-Account 구조 이해하기&lt;/h2&gt;
&lt;p data-end=&quot;539&quot; data-start=&quot;530&quot; data-ke-size=&quot;size16&quot;&gt;간단히 말해,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;658&quot; data-start=&quot;540&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;599&quot; data-start=&quot;540&quot;&gt;&lt;b&gt;Source Account&lt;/b&gt; &amp;rarr; NetBackup Snapshot Manager가 설치된 계정&lt;/li&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;600&quot;&gt;&lt;b&gt;Target Account&lt;/b&gt; &amp;rarr; 실제 보호할 워크로드(EC2, EBS, RDS)가 있는 계정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;707&quot; data-start=&quot;660&quot; data-ke-size=&quot;size16&quot;&gt;이 두 계정을 이어주는 게 &lt;b&gt;IAM Role + AssumeRole&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-end=&quot;796&quot; data-start=&quot;709&quot; data-ke-size=&quot;size16&quot;&gt;즉, Source Account의 Snapshot Manager가 Target Account 안에 있는 Role을 &amp;ldquo;빌려 쓰는&amp;rdquo; 방식으로 접근하는 거죠.&lt;/p&gt;
&lt;hr data-end=&quot;801&quot; data-start=&quot;798&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;817&quot; data-start=&quot;803&quot; data-ke-size=&quot;size26&quot;&gt;단계별 설정 방법&lt;/h2&gt;
&lt;h3 data-end=&quot;856&quot; data-start=&quot;819&quot; data-ke-size=&quot;size23&quot;&gt;1) Target Account에 IAM Role 만들기&lt;/h3&gt;
&lt;p data-end=&quot;931&quot; data-start=&quot;857&quot; data-ke-size=&quot;size16&quot;&gt;먼저 보호 대상 계정에 Role을 하나 만듭니다. 이름은 편하게 NBU_SnapshotRole 정도로 두면 관리하기 좋습니다.&lt;/p&gt;
&lt;p data-end=&quot;988&quot; data-start=&quot;933&quot; data-ke-size=&quot;size16&quot;&gt;그리고 신뢰 정책(Trust Policy)에 Source Account ID를 넣어줘야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1758972909223&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::PRIMARY_ACCOUNT_ID:root&quot;
      },
      &quot;Action&quot;: &quot;sts:AssumeRole&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1266&quot; data-start=&quot;1210&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 Source Account에서 이 Role을 AssumeRole 할 수 있게 됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1271&quot; data-start=&quot;1268&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1294&quot; data-start=&quot;1273&quot; data-ke-size=&quot;size23&quot;&gt;2) Role에 권한 붙이기&lt;/h3&gt;
&lt;p data-end=&quot;1411&quot; data-start=&quot;1295&quot; data-ke-size=&quot;size16&quot;&gt;Snapshot Manager가 할 수 있는 일이 꽤 많습니다. EC2 스냅샷도 만들고, RDS 백업도 하고, 암호화된 볼륨은 KMS까지 접근해야 하죠.&lt;br /&gt;그래서 Role에 다음과 같은 권한을 붙입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758972836440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Sid&quot;: &quot;KMSAccess&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;kms:ListKeys&quot;,
        &quot;kms:Encrypt&quot;,
        &quot;kms:Decrypt&quot;,
        &quot;kms:GenerateDataKey&quot;,
        &quot;kms:GenerateDataKeyWithoutPlaintext&quot;,
        &quot;kms:CreateGrant&quot;,
        &quot;kms:ReEncryptTo&quot;,
        &quot;kms:ReEncryptFrom&quot;,
        &quot;kms:DescribeKey&quot;,
        &quot;kms:ListAliases&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;RDSBackupRestore&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;rds:DescribeDBSnapshots&quot;,
        &quot;rds:DescribeDBClusters&quot;,
        &quot;rds:DescribeDBClusterSnapshots&quot;,
        &quot;rds:DeleteDBSnapshot&quot;,
        &quot;rds:CreateDBSnapshot&quot;,
        &quot;rds:CreateDBClusterSnapshot&quot;,
        &quot;rds:ModifyDBSnapshotAttribute&quot;,
        &quot;rds:DescribeDBSubnetGroups&quot;,
        &quot;rds:DescribeDBInstances&quot;,
        &quot;rds:CopyDBSnapshot&quot;,
        &quot;rds:CopyDBClusterSnapshot&quot;,
        &quot;rds:DescribeDBSnapshotAttributes&quot;,
        &quot;rds:DeleteDBClusterSnapshot&quot;,
        &quot;rds:ListTagsForResource&quot;,
        &quot;rds:AddTagsToResource&quot;,
        &quot;rds:ModifyDBInstance&quot;,
        &quot;rds:ModifyDBClusterSnapshotAttribute&quot;,
        &quot;rds:RestoreDBInstanceFromDBSnapshot&quot;,
        &quot;rds:ModifyDBCluster&quot;,
        &quot;rds:RestoreDBClusterFromSnapshot&quot;,
        &quot;rds:CreateDBInstance&quot;,
        &quot;rds:RestoreDBClusterToPointInTime&quot;,
        &quot;rds:CreateDBSecurityGroup&quot;,
        &quot;rds:CreateDBCluster&quot;,
        &quot;rds:RestoreDBInstanceToPointInTime&quot;,
        &quot;rds:DescribeDBClusterParameterGroups&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;STSAccess&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;sts:GetCallerIdentity&quot;,
        &quot;sts:AssumeRole&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;EC2SnapshotAndRestore&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;ec2:CreateSnapshot&quot;,
        &quot;ec2:CreateSnapshots&quot;,
        &quot;ec2:DescribeInstances&quot;,
        &quot;ec2:DescribeInstanceStatus&quot;,
        &quot;ec2:ModifySnapshotAttribute&quot;,
        &quot;ec2:CopySnapshot&quot;,
        &quot;ec2:DescribeSnapshots&quot;,
        &quot;ec2:DescribeVolumeStatus&quot;,
        &quot;ec2:DescribeVolumes&quot;,
        &quot;ec2:RegisterImage&quot;,
        &quot;ec2:DeregisterImage&quot;,
        &quot;ec2:DescribeVolumeAttribute&quot;,
        &quot;ec2:DescribeSubnets&quot;,
        &quot;ec2:DescribeVpcs&quot;,
        &quot;ec2:DescribeInstanceAttribute&quot;,
        &quot;ec2:DeleteSnapshot&quot;,
        &quot;ec2:DescribeRegions&quot;,
        &quot;ec2:DescribeAvailabilityZones&quot;,
        &quot;ec2:ResetSnapshotAttribute&quot;,
        &quot;ec2:DescribeHosts&quot;,
        &quot;ec2:DescribeImages&quot;,
        &quot;ec2:DescribeSecurityGroups&quot;,
        &quot;ec2:DescribeNetworkInterfaces&quot;,
        &quot;ec2:RunInstances&quot;,
        &quot;ec2:AttachNetworkInterface&quot;,
        &quot;ec2:DetachVolume&quot;,
        &quot;ec2:AttachVolume&quot;,
        &quot;ec2:DeleteTags&quot;,
        &quot;ec2:CreateTags&quot;,
        &quot;ec2:StartInstances&quot;,
        &quot;ec2:StopInstances&quot;,
        &quot;ec2:TerminateInstances&quot;,
        &quot;ec2:CreateVolume&quot;,
        &quot;ec2:DeleteVolume&quot;,
        &quot;ec2:DescribeIamInstanceProfileAssociations&quot;,
        &quot;ec2:AssociateIamInstanceProfile&quot;,
        &quot;ec2:AssociateAddress&quot;,
        &quot;ec2:DescribeKeyPairs&quot;,
        &quot;ec2:DescribeInstanceTypeOfferings&quot;,
        &quot;ec2:GetEbsEncryptionByDefault&quot;,
        &quot;ec2:AuthorizeSecurityGroupEgress&quot;,
        &quot;ec2:AuthorizeSecurityGroupIngress&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;EBSBackupAndRestore&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;ebs:ListSnapshotBlocks&quot;,
        &quot;ebs:GetSnapshotBlock&quot;,
        &quot;ebs:ListChangedBlocks&quot;,
        &quot;ebs:CompleteSnapshot&quot;,
        &quot;ebs:PutSnapshotBlock&quot;,
        &quot;ebs:StartSnapshot&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;IAMInspection&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;iam:ListAccountAliases&quot;,
        &quot;iam:SimulatePrincipalPolicy&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;DynamoDBBackupRestore&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;dynamodb:ListTables&quot;,
        &quot;dynamodb:DescribeTable&quot;,
        &quot;dynamodb:CreateTable&quot;,
        &quot;dynamodb:BatchWriteItem&quot;,
        &quot;dynamodb:DescribeContinuousBackups&quot;,
        &quot;dynamodb:ExportTableToPointInTime&quot;,
        &quot;dynamodb:DescribeExport&quot;,
        &quot;dynamodb:DeleteTable&quot;,
        &quot;dynamodb:UpdateTable&quot;,
        &quot;dynamodb:UpdateContinuousBackups&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;RedshiftBackupRestore&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;redshift:ListDatabases&quot;,
        &quot;redshift:GetClusterCredentialsWithIAM&quot;,
        &quot;redshift-data:ExecuteStatement&quot;,
        &quot;redshift-data:ListDatabases&quot;,
        &quot;redshift-data:GetStatementResult&quot;,
        &quot;redshift:DescribeClusters&quot;,
        &quot;redshift-data:CancelStatement&quot;,
        &quot;redshift:GetClusterCredentials&quot;,
        &quot;redshift-data:DescribeStatement&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;S3AccessForBackup&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;s3:CreateBucket&quot;,
        &quot;s3:ListBucket&quot;,
        &quot;s3:GetObjectAcl&quot;,
        &quot;s3:GetObject&quot;,
        &quot;s3:DeleteObject&quot;,
        &quot;s3:PutObject&quot;,
        &quot;s3:PutObjectRetention&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;SSMApplicationConsistentSnapshot&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;ssm:SendCommand&quot;,
        &quot;ssm:DescribeDocument&quot;,
        &quot;ssm:DescribeInstanceInformation&quot;,
        &quot;ssm:UpdateDocumentDefaultVersion&quot;,
        &quot;ssm:UpdateDocument&quot;,
        &quot;ssm:CreateDocument&quot;,
        &quot;ssm:GetCommandInvocation&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;EKSClusterOperations&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;eks:DescribeNodegroup&quot;,
        &quot;eks:DescribeUpdate&quot;,
        &quot;eks:UpdateNodegroupConfig&quot;,
        &quot;eks:ListClusters&quot;,
        &quot;eks:DescribeCluster&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Sid&quot;: &quot;AutoScalingAndSNS&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;autoscaling:UpdateAutoScalingGroup&quot;,
        &quot;autoscaling:AttachInstances&quot;,
        &quot;autoscaling:DescribeScalingActivities&quot;,
        &quot;autoscaling:TerminateInstanceInAutoScalingGroup&quot;,
        &quot;sns:Publish&quot;,
        &quot;sns:GetTopicAttributes&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2214&quot; data-start=&quot;2147&quot; data-ke-size=&quot;size16&quot;&gt;테스트 단계에서는 Resource: &quot;*&quot; 로 두고, 운영에선 꼭 필요한 리소스 ARN만 넣는 게 더 안전합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2219&quot; data-start=&quot;2216&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2262&quot; data-start=&quot;2221&quot; data-ke-size=&quot;size23&quot;&gt;3) Source Account에 AssumeRole 권한 주기&lt;/h3&gt;
&lt;p data-end=&quot;2330&quot; data-start=&quot;2263&quot; data-ke-size=&quot;size16&quot;&gt;이제 NetBackup이 돌아가는 계정에 &amp;ldquo;저쪽 Role을 AssumeRole 할 수 있다&amp;rdquo;라는 권한을 줘야 합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758972979598&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;AWS&quot;: &quot;arn:aws:iam::TARGET_ACCOUNT_ID:role/ROLE_NAME&quot;
      },
      &quot;Action&quot;: &quot;sts:AssumeRole&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2546&quot; data-start=&quot;2543&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2591&quot; data-start=&quot;2548&quot; data-ke-size=&quot;size23&quot;&gt;4) Snapshot Manager에 Cross-Account 등록&lt;/h3&gt;
&lt;p data-end=&quot;2638&quot; data-start=&quot;2592&quot; data-ke-size=&quot;size16&quot;&gt;이제 NetBackup 콘솔로 가서 Snapshot Manager 설정 메뉴에서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2692&quot; data-start=&quot;2639&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2660&quot; data-start=&quot;2639&quot;&gt;Target Account ID&lt;/li&gt;
&lt;li data-end=&quot;2692&quot; data-start=&quot;2661&quot;&gt;Role 이름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2709&quot; data-start=&quot;2694&quot; data-ke-size=&quot;size16&quot;&gt;을 입력해주면 끝입니다.&lt;/p&gt;
&lt;hr data-end=&quot;2714&quot; data-start=&quot;2711&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2733&quot; data-start=&quot;2716&quot; data-ke-size=&quot;size26&quot;&gt;Assume Role 검증하기&lt;/h2&gt;
&lt;p data-end=&quot;2787&quot; data-start=&quot;2735&quot; data-ke-size=&quot;size16&quot;&gt;구성이 제대로 됐는지 확인하려면, CLI에서 직접 AssumeRole을 해볼 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758972937107&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws sts assume-role \ --role-arn arn:aws:iam::&amp;lt;TARGET_ACCOUNT_ID&amp;gt;:role/NBU_SnapshotRole \ --role-session-name TestNetBackup&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2990&quot; data-start=&quot;2930&quot; data-ke-size=&quot;size16&quot;&gt;정상적으로 AccessKey, SecretKey, SessionToken이 나오면 설정이 성공한 겁니다.&lt;/p&gt;
&lt;hr data-end=&quot;3213&quot; data-start=&quot;3210&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3223&quot; data-start=&quot;3215&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;3322&quot; data-start=&quot;3225&quot; data-ke-size=&quot;size16&quot;&gt;NetBackup Snapshot Manager로 여러 AWS 계정을 하나의 창구에서 관리하려면,&lt;br /&gt;결국 핵심은 &lt;b&gt;IAM Role과 AssumeRole 설정&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;3419&quot; data-start=&quot;3324&quot; data-ke-size=&quot;size16&quot;&gt;한 번만 제대로 설정해두면, 계정이 여러 개로 쪼개져 있어도 Snapshot Manager가 알아서 스냅샷을 생성하고 관리할 수 있습니다.&lt;br /&gt;복잡해 보이지만 실제로는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3508&quot; data-start=&quot;3420&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3448&quot; data-start=&quot;3420&quot;&gt;Target Account에 Role 만들기&lt;/li&gt;
&lt;li data-end=&quot;3483&quot; data-start=&quot;3449&quot;&gt;Source Account에서 AssumeRole 허용&lt;/li&gt;
&lt;li data-end=&quot;3508&quot; data-start=&quot;3484&quot;&gt;Snapshot Manager에 등록&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/160</guid>
      <comments>https://mingming-96.tistory.com/160#entry160comment</comments>
      <pubDate>Sat, 27 Sep 2025 20:36:44 +0900</pubDate>
    </item>
    <item>
      <title>NetBackup Kubernetes 백업</title>
      <link>https://mingming-96.tistory.com/159</link>
      <description>&lt;h2 data-end=&quot;662&quot; data-start=&quot;640&quot; data-ke-size=&quot;size26&quot;&gt;1) 사전 준비&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1176&quot; data-start=&quot;663&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;767&quot; data-start=&quot;663&quot;&gt;NetBackup 버전 호환성 확인(Operator 지원 버전). (Veritas 다운로드 포털 / 문서 확인)&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;823&quot; data-start=&quot;768&quot;&gt;kubectl과 helm 사용 가능, 클러스터 Admin 권한 보유&lt;/li&gt;
&lt;li data-end=&quot;858&quot; data-start=&quot;824&quot;&gt;컨테이너 레지스트리 (이미지 Push 권한)&lt;/li&gt;
&lt;li data-end=&quot;1059&quot; data-start=&quot;859&quot;&gt;네트워크: Kubernetes 노드 &amp;rarr; NetBackup Primary / Media 서버간 통신 (기본 PBX 1556 등 포트 열기). NetBackup은 클라이언트 &amp;rarr; 서버 방향으로 PBX(기본 1556) 포트 통신을 사용합니다. (MSDP 등 추가 포트는 기능에 따라 필요).&lt;/li&gt;
&lt;li data-end=&quot;1176&quot; data-start=&quot;1060&quot;&gt;스토리지: PV를 스냅샷으로 만들 수 있는 StorageClass / VolumeSnapshotClass(CSI) 필요(복구 시 필수).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1181&quot; data-start=&quot;1178&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1222&quot; data-start=&quot;1183&quot; data-ke-size=&quot;size26&quot;&gt;2) 패키지/이미지 준비&amp;nbsp;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1424&quot; data-start=&quot;1223&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1399&quot; data-start=&quot;1223&quot;&gt;Veritas NetBackup Kubernetes 패키지(예: netbackupkops-&amp;lt;ver&amp;gt;.tar.gz)와 datamover 이미지 파일을 다운로드. Helm 차트 및 이미지가 포함되어 있습니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1424&quot; data-start=&quot;1400&quot;&gt;(로컬에서) 이미지를 레지스트리에 등록&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758919771668&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 예시: tar에서 이미지 로드 -&amp;gt; 태깅 -&amp;gt; push
docker load -i veritasnetbackup-datamover-10.3.tar
docker tag veritasnetbackup-datamover:10.3 my-registry.example.com/veritas/datamover:10.3
docker push my-registry.example.com/veritas/datamover:10.3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Helm 차트 위치(예: netbackupkops-helm-chart)를 작업 디렉토리에 준비. values.yaml을 편집할 준비.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고: 레지스트리가 사설이면 imagePullSecret 생성 필요.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Netbackup Helm 차트 구조&lt;/p&gt;
&lt;pre id=&quot;code_1758961080281&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;netbackupkops-helm-chart/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   └── _helpers.tpl
└── values.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1798&quot; data-start=&quot;1795&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1854&quot; data-start=&quot;1800&quot; data-ke-size=&quot;size26&quot;&gt;3) Kubernetes 전제 작업 (네임스페이스/이미지풀시크릿/서비스어카운트/RBAC)&lt;/h2&gt;
&lt;h3 data-end=&quot;1868&quot; data-start=&quot;1855&quot; data-ke-size=&quot;size23&quot;&gt;네임스페이스 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1758919794110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create namespace netbackup&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;1942&quot; data-start=&quot;1917&quot; data-ke-size=&quot;size23&quot;&gt;이미지 풀 시크릿 (사설 레지스트리용)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758919807970&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create secret docker-registry nb-regcred \
  --docker-server=my-registry.example.com \
  --docker-username=myuser --docker-password='mypassword' \
  -n netbackup&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3387&quot; data-start=&quot;3384&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3443&quot; data-start=&quot;3389&quot; data-ke-size=&quot;size26&quot;&gt;4) NetBackup (Primary Server)에서 토큰/인증키 생성 &amp;amp; 시크릿 생성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3663&quot; data-start=&quot;3444&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3638&quot; data-start=&quot;3444&quot;&gt;NetBackup Web UI 또는 CLI에서 &lt;b&gt;Kubernetes용 인증 토큰(API key)&lt;/b&gt; 을 생성합니다. NetBackup Operator는 이 토큰(또는 API key)과 Primary 서버의 인증서 지문(fingerprint)을 사용해 안전하게 통신합니다. &lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3663&quot; data-start=&quot;3639&quot;&gt;Kubernetes에 넣을 시크릿 예시:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758919733981&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Secret
metadata:
  name: netbackup-nb-config-deploy-secret
  namespace: netbackup
type: Opaque
stringData:
  apikey: &quot;생성한-API-키-값&quot;
  k8scacert: |&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758919745499&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f nb-config-deploy-secret.yaml -n netbackup&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;4060&quot; data-start=&quot;3893&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;4060&quot; data-start=&quot;3895&quot; data-ke-size=&quot;size16&quot;&gt;주의: NetBackup 가이드에 따라 &lt;b&gt;토큰은 Base64 인코딩 / fingerprint 포함&lt;/b&gt; 등 요구사항이 있으니, 문서의 예시를 그대로 따라야 합니다. (토큰/지문 생성 및 사용 절차는 관리자 가이드를 참고하세요).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;4065&quot; data-start=&quot;4062&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4102&quot; data-start=&quot;4067&quot; data-ke-size=&quot;size26&quot;&gt;5) Volume Snapshot Contorller 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. CRD 배포&lt;/p&gt;
&lt;pre id=&quot;code_1758963901924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/refs/heads/release-8.2/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/refs/heads/release-8.2/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/refs/heads/release-8.2/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Volume Snapshot Controller 배포&lt;/p&gt;
&lt;pre id=&quot;code_1758963937825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/refs/heads/release-8.2/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/refs/heads/release-8.2/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Volume Snapshot Class 배포&lt;/p&gt;
&lt;pre id=&quot;code_1758963986546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# vsc.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-aws-vsc
driver: ebs.csi.aws.com
deletionPolicy: Delete

kubectl apply -f vsc.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;4102&quot; data-start=&quot;4067&quot; data-ke-size=&quot;size26&quot;&gt;6) Helm values.yaml 설정&lt;/h2&gt;
&lt;p data-end=&quot;4188&quot; data-start=&quot;4103&quot; data-ke-size=&quot;size16&quot;&gt;netbackupkops-helm-chart/values.yaml 주요 항목&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758919705607&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;netbackupkops:
  containers:
    manager:
      image: &quot;netbackupkopsimage:10.5.1&quot;
      resources:
        limits:
          cpu: 150m
          memory: 600Mi
        requests:
          cpu: 100m
          memory: 500Mi
  kopsPvcStorageClass:
  kopsPvcSize: 10Gi
  pvMountPath: /usr/openv
  imagePullSecrets: []
  # Example to add imagePullSecrets
  # imagePullSecrets:
  # - name: netbackupkops-docker-cred
  fipsMode: DISABLE
  acceleratorTracklogPvcStorageClass: None
  minSizeForAcceleratorTracklogPvc: 50Mi
  hostAliases:
    - hostnames:
      - netbackup-master.local.com
      ip: 10.70.1.151

nbsetup:
  replicas: 1
  containers:
    netbackup_config_pod:
      nbprimaryserver: netbackup-master.local.com
      nbsha256fingerprint: &quot;netbackup-fingerprint&quot;
      k8sCluster: &quot;k8scluster-url&quot;
      k8sPort: 443
      datamoverimage: &quot;datamoverimage:10.5.0.1&quot;
      logLevel: INFO
      storageclassblock: gp3
      volumesnapshotclassblock: csi-aws-vsc
      storageclassfilesystem:
      volumesnapshotclassfilesystem:
  storageMap:
    gp3:
      snapshotClass: csi-aws-vsc
      storageClassForBackupDataMovement: gp3
      storageClassForRestoreFromBackup: gp3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(버전에 따라 netbackupKops 또는 netbackupConfig 등 키명 차이가 있을 수 있으니 values.yaml 기본 파일을 확인해서 복사&amp;middot;수정하세요.)&lt;/p&gt;
&lt;hr data-end=&quot;4800&quot; data-start=&quot;4797&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4817&quot; data-start=&quot;4802&quot; data-ke-size=&quot;size26&quot;&gt;7) Helm으로 설치&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758919681465&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로컬 차트 경로로 설치 예시
helm install nb-kops ./netbackupkops-helm-chart -n netbackup --values ./my-values.yaml

# 상태 확인
helm status nb-kops -n netbackup
kubectl get pods -n netbackup
kubectl describe pod &amp;lt;pod-name&amp;gt; -n netbackup
kubectl logs &amp;lt;pod-name&amp;gt; -n netbackup&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5297&quot; data-start=&quot;5089&quot; data-ke-size=&quot;size16&quot;&gt;설치 중 chart가 operator pod, config pod, datamover pod 등을 생성합니다. 배포가 완료되면 NetBackup Web UI에서 &amp;ldquo;클러스터 추가(Add Cluster)&amp;rdquo; 절차를 밟아 클러스터를 등록합니다. 등록할 때 operator가 제공하는 토큰/지문 정보를 이용합니다.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-end=&quot;5302&quot; data-start=&quot;5299&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5325&quot; data-start=&quot;5304&quot; data-ke-size=&quot;size26&quot;&gt;8) 설치 검증(핵심 체크포인트)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;5737&quot; data-start=&quot;5326&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;5393&quot; data-start=&quot;5326&quot;&gt;kubectl get pods -n netbackup &amp;mdash; 모든 관련 Pod가 Running 상태인지 확인&lt;/li&gt;
&lt;li data-end=&quot;5455&quot; data-start=&quot;5394&quot;&gt;kubectl logs &amp;lt;operator-pod&amp;gt; -n netbackup &amp;mdash; 에러/예외 로그 확인&lt;/li&gt;
&lt;li data-end=&quot;5546&quot; data-start=&quot;5456&quot;&gt;NetBackup Web UI: &lt;b&gt;클러스터가 &amp;lsquo;연결(Connected)&amp;rsquo; 상태인지, 자동 자원탐지(autodiscovery)가 정상 동작하는지&lt;/b&gt; 확인&lt;/li&gt;
&lt;li data-end=&quot;5624&quot; data-start=&quot;5547&quot;&gt;샘플 백업 실행(예: NetBackup에서 생성한 K8s 용 Policy로 테스트 백업) 및 복구(restore) 시나리오 테스트&lt;/li&gt;
&lt;li data-end=&quot;5737&quot; data-start=&quot;5625&quot;&gt;PV snapshot 생성/복구가 제대로 동작하는지 확인 &amp;mdash; 이는 스토리지 드라이버(CSI)와 밀접하므로 미리 확인해야 합니다. &lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;5742&quot; data-start=&quot;5739&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5767&quot; data-start=&quot;5744&quot; data-ke-size=&quot;size26&quot;&gt;9) 자주 발생하는 문제 &amp;amp; 해결 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6264&quot; data-start=&quot;5768&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5859&quot; data-start=&quot;5768&quot;&gt;&lt;b&gt;이미지 Pull 실패&lt;/b&gt;: imagePullSecrets 누락 또는 레지스트리 인증 오류 &amp;rarr; kubectl describe pod / 이벤트 확인&lt;/li&gt;
&lt;li data-end=&quot;5954&quot; data-start=&quot;5860&quot;&gt;&lt;b&gt;RBAC 권한 오류&lt;/b&gt;: Operator가 CRD 또는 VolumeSnapshot 접근 권한이 없을 때 발생 &amp;rarr; 필요한 권한 추가(ClusterRole 수정)&lt;/li&gt;
&lt;li data-end=&quot;6115&quot; data-start=&quot;5955&quot;&gt;&lt;b&gt;토큰/인증서 관련 에러&lt;/b&gt;: 토큰 값의 포맷(Base64 등) 또는 Primary 서버의 인증서 지문(fingerprint) 불일치 &amp;rarr; 시계(Clock skew)도 확인 필요(토큰/증명서 유효성에 영향).&lt;/li&gt;
&lt;li data-end=&quot;6264&quot; data-start=&quot;6116&quot;&gt;&lt;b&gt;NetBackup과 통신 불가&lt;/b&gt;: 방화벽(1556) 차단, DNS 불일치, 호스트명 해석 문제 &amp;rarr; bpclntcmd(클라이언트 유틸)로 NetBackup 관점의 네트워크 상태 확인. &lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;6545&quot; data-start=&quot;6542&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;6613&quot; data-start=&quot;6547&quot; data-ke-size=&quot;size26&quot;&gt;10) (참고) 전통적인 NetBackup 클라이언트 에이전트 설치 &amp;mdash; Linux / Windows (간단 요약)&lt;/h2&gt;
&lt;p data-end=&quot;6948&quot; data-start=&quot;6614&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes 외에 개별 노드(예: VM/베어메탈)의 NetBackup 클라이언트를 설치할 때는 NetBackup 설치 이미지(ESD/DVD)를 내려받아 &lt;b&gt;로컬 설치 또는 Master에서 push&lt;/b&gt; 방식으로 설치할 수 있습니다. UNIX/Linux는 ./install 스크립트 기반 설치, Windows는 Browser.exe 또는 설치 마법사/무인 설치 방식이 제공됩니다. 설치 후 NetBackup 서비스 시작/정지 명령(bpup, nbstop 등)과 bpclntcmd로 연결 상태를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;7324&quot; data-start=&quot;7321&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;7341&quot; data-start=&quot;7326&quot; data-ke-size=&quot;size26&quot;&gt;빠른 명령 모음&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1758918629700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 네임스페이스
kubectl create ns netbackup

# registry credential (사설 레지스트리)
kubectl create secret docker-registry nb-regcred --docker-server=... --docker-username=... --docker-password=... -n netbackup

# API token secret (예시)
kubectl create secret generic nb-config-deploy-secret --from-literal=apikey='PASTE_API_KEY' -n netbackup

# Helm 설치
helm install nb-kops ./netbackupkops-helm-chart -n netbackup --values ./my-values.yaml

# 상태 확인
kubectl get pods -n netbackup
helm status nb-kops -n netbackup
kubectl logs -n netbackup &amp;lt;operator-pod&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;7896&quot; data-start=&quot;7893&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;7913&quot; data-start=&quot;7898&quot; data-ke-size=&quot;size26&quot;&gt;참고(주요 근거 문서)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8438&quot; data-start=&quot;7914&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8016&quot; data-start=&quot;7914&quot;&gt;NetBackup Kubernetes Installation and Configuration Guide.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;8130&quot; data-start=&quot;8017&quot;&gt;NetBackup for Kubernetes Administrator's Guide (토큰/secret, 업그레이드 지침).&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;8230&quot; data-start=&quot;8131&quot;&gt;Installing NetBackup using Helm charts (Helm/차트 관련 지침).&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;8324&quot; data-start=&quot;8231&quot;&gt;NetBackup Network Ports Reference Guide (포트/방화벽).&lt;/li&gt;
&lt;li data-end=&quot;8438&quot; data-start=&quot;8325&quot;&gt;About NetBackup client installation on UNIX and Linux (클라이언트 설치 방법 요약).&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/159</guid>
      <comments>https://mingming-96.tistory.com/159#entry159comment</comments>
      <pubDate>Sat, 27 Sep 2025 05:52:13 +0900</pubDate>
    </item>
    <item>
      <title>Windows MMC와 CPL</title>
      <link>https://mingming-96.tistory.com/158</link>
      <description>&lt;h1&gt;Windows MMC와 CPL: 관리 도구의 이해 및 자주 쓰는 종류&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 환경에서 시스템 관리를 하다 보면 자주 마주치는 두 가지 개념이 있습니다. 바로 &lt;b&gt;MMC&lt;/b&gt;와 &lt;b&gt;CPL&lt;/b&gt;입니다. 이번 글에서는 이 두 도구가 무엇인지, 각각의 특징과 자주 쓰이는 종류, 차이점을 쉽게 정리해보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. MMC (Microsoft Management Console)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MMC&lt;/b&gt;는 Windows에서 다양한 관리 도구를 통합하여 실행할 수 있는 프레임워크입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개념:&lt;/b&gt; 여러 관리 도구를 하나의 콘솔 창에서 실행하도록 해주는 컨테이너&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 기능:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Snap-in 기반 구조: 각 관리 도구를 Snap-in 형태로 추가&lt;/li&gt;
&lt;li&gt;사용자 정의 콘솔 생성 가능: 관리자가 원하는 도구만 모아서 실행 가능&lt;/li&gt;
&lt;li&gt;정책 관리, 장치 관리, 이벤트 뷰어 등 다양한 관리 기능 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Event Viewer, Device Manager, Group Policy Management 등을 MMC로 통합&lt;/li&gt;
&lt;li&gt;예: &lt;code&gt;mmc.exe&lt;/code&gt; 실행 후 원하는 Snap-in 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. 자주 쓰이는 MMC 종류 (.msc)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Event Viewer&lt;/b&gt; (&lt;code&gt;eventvwr.msc&lt;/code&gt;) &amp;ndash; 시스템/응용 프로그램 로그 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Device Manager&lt;/b&gt; (&lt;code&gt;devmgmt.msc&lt;/code&gt;) &amp;ndash; 하드웨어 장치 관리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Group Policy Editor&lt;/b&gt; (&lt;code&gt;gpedit.msc&lt;/code&gt;) &amp;ndash; 로컬 그룹 정책 관리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Computer Management&lt;/b&gt; (&lt;code&gt;compmgmt.msc&lt;/code&gt;) &amp;ndash; 디스크 관리, 서비스, 사용자 계정 통합 관리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Services&lt;/b&gt; (&lt;code&gt;services.msc&lt;/code&gt;) &amp;ndash; 서비스 상태 확인 및 관리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Task Scheduler&lt;/b&gt; (&lt;code&gt;taskschd.msc&lt;/code&gt;) &amp;ndash; 예약 작업 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정리:&lt;/b&gt; MMC는 &lt;i&gt;Windows 관리 도구를 통합하고 사용자 맞춤형 관리 콘솔을 만드는 프레임워크&lt;/i&gt;입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. CPL (Control Panel Item)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPL&lt;/b&gt;은 Control Panel에서 실행되는 개별 관리 항목 파일입니다. 대부분 &lt;code&gt;.cpl&lt;/code&gt; 확장자를 가집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개념:&lt;/b&gt; 제어판에서 실행되는 개별 설정 항목&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 기능:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제어판에서 네트워크 설정, 사용자 계정, 전원 옵션 등 개별 설정 항목 관리&lt;/li&gt;
&lt;li&gt;CPL 파일은 실행 시 자체 GUI를 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;control.exe&lt;/code&gt;로 제어판 실행 후 CPL 호출 가능&lt;/li&gt;
&lt;li&gt;예: &lt;code&gt;inetcpl.cpl&lt;/code&gt; (인터넷 옵션), &lt;code&gt;ncpa.cpl&lt;/code&gt; (네트워크 연결)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 자주 쓰이는 CPL 종류 (.cpl)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인터넷 옵션&lt;/b&gt; &amp;ndash; &lt;code&gt;inetcpl.cpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;네트워크 연결&lt;/b&gt; &amp;ndash; &lt;code&gt;ncpa.cpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전원 옵션&lt;/b&gt; &amp;ndash; &lt;code&gt;powercfg.cpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 속성&lt;/b&gt; &amp;ndash; &lt;code&gt;sysdm.cpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로그램 추가/제거&lt;/b&gt; &amp;ndash; &lt;code&gt;appwiz.cpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 계정&lt;/b&gt; &amp;ndash; &lt;code&gt;nusrmgr.cpl&lt;/code&gt; (Windows 10 이전) / 계정 설정은 Control Panel GUI에서 접근 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;마우스 설정&lt;/b&gt; &amp;ndash; &lt;code&gt;main.cpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디스플레이 설정&lt;/b&gt; &amp;ndash; &lt;code&gt;desk.cpl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정리:&lt;/b&gt; CPL은 &lt;i&gt;제어판에서 실행되는 개별 관리 설정 파일&lt;/i&gt;로, 특정 기능만 담당합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. MMC와 CPL의 차이&lt;/h2&gt;
&lt;table style=&quot;width: 764px;&quot; border=&quot;1&quot; cellpadding=&quot;6&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 78px;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;width: 409px;&quot;&gt;MMC&lt;/th&gt;
&lt;th style=&quot;width: 277px;&quot;&gt;CPL&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 78px;&quot;&gt;개념&lt;/td&gt;
&lt;td style=&quot;width: 409px;&quot;&gt;관리 도구 통합 콘솔 프레임워크&lt;/td&gt;
&lt;td style=&quot;width: 277px;&quot;&gt;제어판에서 실행되는 개별 설정 항목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 78px;&quot;&gt;확장자&lt;/td&gt;
&lt;td style=&quot;width: 409px;&quot;&gt;.msc (Management Console)&lt;/td&gt;
&lt;td style=&quot;width: 277px;&quot;&gt;.cpl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 78px;&quot;&gt;기능&lt;/td&gt;
&lt;td style=&quot;width: 409px;&quot;&gt;여러 관리 도구를 통합하여 사용자 정의 콘솔 생성 가능&lt;/td&gt;
&lt;td style=&quot;width: 277px;&quot;&gt;특정 설정 항목에 대한 GUI 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 78px;&quot;&gt;사용 예시&lt;/td&gt;
&lt;td style=&quot;width: 409px;&quot;&gt;Event Viewer, Device Manager, Group Policy Management&lt;/td&gt;
&lt;td style=&quot;width: 277px;&quot;&gt;인터넷 옵션, 네트워크 연결, 전원 옵션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 78px;&quot;&gt;사용 방식&lt;/td&gt;
&lt;td style=&quot;width: 409px;&quot;&gt;Snap-in 추가/삭제로 맞춤형 콘솔 생성&lt;/td&gt;
&lt;td style=&quot;width: 277px;&quot;&gt;Control Panel이나 명령어로 단독 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows에서 시스템 관리 시 MMC와 CPL의 역할을 이해하면 도구 선택이 훨씬 쉬워집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MMC:&lt;/b&gt; 여러 도구를 통합하여 관리할 때 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CPL:&lt;/b&gt; 특정 제어판 설정을 빠르게 실행할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, MMC는 &lt;i&gt;관리 도구 통합 콘솔&lt;/i&gt;이고, CPL은 &lt;i&gt;제어판 개별 항목&lt;/i&gt;이라고 생각하면 이해가 쉽습니다.&lt;/p&gt;</description>
      <category>Windows</category>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/158</guid>
      <comments>https://mingming-96.tistory.com/158#entry158comment</comments>
      <pubDate>Sun, 21 Sep 2025 15:13:15 +0900</pubDate>
    </item>
    <item>
      <title>REST API와 SOAP</title>
      <link>https://mingming-96.tistory.com/157</link>
      <description>&lt;h1&gt;REST API와 SOAP: 역사, 개념, 특징, 그리고 차이점&lt;/h1&gt;

&lt;p&gt;API는 오늘날 소프트웨어 개발에서 빠질 수 없는 핵심 요소입니다. 그중에서도 가장 많이 비교되는 두 가지 방식이 바로 &lt;strong&gt;SOAP&lt;/strong&gt;과 &lt;strong&gt;REST&lt;/strong&gt;입니다. 이번 글에서는 두 방식의 역사와 개념, 특징을 살펴보고 어떤 차이가 있는지 정리해 보겠습니다.&lt;/p&gt;

&lt;h2&gt;1. API 역사 속 SOAP과 REST의 등장&lt;/h2&gt;

&lt;h3&gt;SOAP의 등장&lt;/h3&gt;
&lt;p&gt;SOAP(Simple Object Access Protocol)은 &lt;strong&gt;1998년 Microsoft와 IBM&lt;/strong&gt;을 중심으로 등장했습니다.&lt;br&gt;
당시에는 기업 시스템 간 연동이 중요한 시대였고, 서로 다른 플랫폼(Java, .NET, C++ 등)을 사용하는 환경에서도 안정적이고 신뢰성 있는 통신 방식이 필요했습니다.&lt;/p&gt;

&lt;p&gt;SOAP은 이러한 요구를 충족하기 위해 만들어졌으며, &lt;strong&gt;보안(WS-Security), 트랜잭션 보장&lt;/strong&gt; 같은 기능이 내장되어 있어 은행·정부·대기업의 엔터프라이즈 시스템에서 널리 사용되었습니다.&lt;/p&gt;

&lt;h3&gt;REST의 등장&lt;/h3&gt;
&lt;p&gt;REST(Representational State Transfer)는 &lt;strong&gt;2000년 Roy Fielding(HTTP 프로토콜 공동 설계자)&lt;/strong&gt;의 박사 논문에서 처음 제시되었습니다.&lt;br&gt;
SOAP의 복잡성과 무거움을 극복하기 위해, 웹 친화적이고 단순한 아키텍처 스타일을 제안한 것입니다.&lt;/p&gt;

&lt;p&gt;REST는 이후 웹 2.0 시대와 모바일 서비스 확산과 함께 급속히 자리잡았고, JSON 기반 응답을 활용하며 현재는 &lt;strong&gt;인터넷 서비스의 표준 API&lt;/strong&gt;로 자리매김했습니다.&lt;/p&gt;

&lt;h2&gt;2. SOAP API 개념과 특징&lt;/h2&gt;
&lt;p&gt;SOAP은 XML 기반 메시징 프로토콜로, &lt;strong&gt;엄격한 표준화&lt;/strong&gt;를 통해 다양한 환경에서 일관된 통신을 제공합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 포맷:&lt;/strong&gt; XML 고정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API 정의:&lt;/strong&gt; WSDL(Web Services Description Language)로 인터페이스 정의&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프로토콜 지원:&lt;/strong&gt; HTTP뿐 아니라 SMTP, TCP 등 다양한 프로토콜 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특징:&lt;/strong&gt;
  &lt;ul&gt;
    &lt;li&gt;WS-Security, 트랜잭션 보장 등 고급 기능 내장&lt;/li&gt;
    &lt;li&gt;엔터프라이즈 환경에서 안정성과 보안성이 뛰어남&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;무거운 이유:&lt;/strong&gt;
      &lt;ul&gt;
        &lt;li&gt;XML 기반 메시지는 구조가 복잡하고, 네임스페이스·태그가 많아 데이터 크기가 커짐&lt;/li&gt;
        &lt;li&gt;SOAP 헤더, WS-Security, 트랜잭션 관련 정보가 포함되어 요청/응답 메시지가 커짐&lt;/li&gt;
        &lt;li&gt;여러 프로토콜과 기능을 지원하다 보니 처리 로직이 복잡하고 서버 부담 증가&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;SOAP 요청/응답 예시&lt;/h4&gt;

&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&amp;lt;!-- SOAP 요청 --&amp;gt;
&amp;lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:usr=&quot;http://example.com/user&quot;&amp;gt;
   &amp;lt;soapenv:Header/&amp;gt;
   &amp;lt;soapenv:Body&amp;gt;
      &amp;lt;usr:GetUser&amp;gt;
         &amp;lt;usr:UserId&amp;gt;123&amp;lt;/usr:UserId&amp;gt;
      &amp;lt;/usr:GetUser&amp;gt;
   &amp;lt;/soapenv:Body&amp;gt;
&amp;lt;/soapenv:Envelope&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&amp;lt;!-- SOAP 응답 --&amp;gt;
&amp;lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&amp;gt;
   &amp;lt;soapenv:Body&amp;gt;
      &amp;lt;GetUserResponse&amp;gt;
         &amp;lt;User&amp;gt;
            &amp;lt;Id&amp;gt;123&amp;lt;/Id&amp;gt;
            &amp;lt;Name&amp;gt;홍길동&amp;lt;/Name&amp;gt;
            &amp;lt;Email&amp;gt;hong@example.com&amp;lt;/Email&amp;gt;
         &amp;lt;/User&amp;gt;
      &amp;lt;/GetUserResponse&amp;gt;
   &amp;lt;/soapenv:Body&amp;gt;
&amp;lt;/soapenv:Envelope&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;3. REST API 개념과 특징&lt;/h2&gt;
&lt;p&gt;REST는 웹의 설계 원칙을 따른 아키텍처 스타일로, 가볍고 단순한 접근 방식을 제공합니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 포맷:&lt;/strong&gt; JSON, XML, YAML 등 자유롭게 선택 가능 (JSON이 주류)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;리소스 표현:&lt;/strong&gt; URL로 리소스 식별 (&lt;code&gt;/users/1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP 메서드 활용:&lt;/strong&gt; GET, POST, PUT, DELETE 등 표준 메서드 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특징:&lt;/strong&gt;
  &lt;ul&gt;
    &lt;li&gt;Stateless 구조 (서버가 클라이언트 상태를 기억하지 않음)&lt;/li&gt;
    &lt;li&gt;단순하고 빠르며, 웹·모바일 환경에 최적화&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;경량화된 이유:&lt;/strong&gt;
      &lt;ul&gt;
        &lt;li&gt;JSON 사용으로 데이터 구조가 간단하고 용량이 작음&lt;/li&gt;
        &lt;li&gt;불필요한 헤더와 기능이 없고, 트랜잭션/보안 관련 정보는 최소화&lt;/li&gt;
        &lt;li&gt;HTTP 표준만 활용해 메시지 처리 로직이 단순&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;REST 요청/응답 예시&lt;/h4&gt;

&lt;pre&gt;&lt;code class=&quot;http&quot;&gt;# REST 요청 (GET)
GET /users/123 HTTP/1.1
Host: api.example.com
Accept: application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;json&quot;&gt;// REST 응답 (JSON)
{
  &quot;id&quot;: 123,
  &quot;name&quot;: &quot;홍길동&quot;,
  &quot;email&quot;: &quot;hong@example.com&quot;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;4. SOAP vs REST 비교&lt;/h2&gt;

&lt;table border=&quot;1&quot; cellpadding=&quot;6&quot;&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;&lt;th&gt;SOAP&lt;/th&gt;&lt;th&gt;REST&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;등장 시기&lt;/td&gt;&lt;td&gt;1998년 (MS, IBM 주도)&lt;/td&gt;&lt;td&gt;2000년 (Roy Fielding 논문)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 포맷&lt;/td&gt;&lt;td&gt;XML 고정&lt;/td&gt;&lt;td&gt;JSON, XML, YAML 등 자유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로토콜&lt;/td&gt;&lt;td&gt;HTTP, SMTP, TCP 등&lt;/td&gt;&lt;td&gt;HTTP 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복잡성&lt;/td&gt;&lt;td&gt;복잡하고 무겁다&lt;/td&gt;&lt;td&gt;단순하고 가볍다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보안/트랜잭션&lt;/td&gt;&lt;td&gt;WS-Security, 트랜잭션 지원&lt;/td&gt;&lt;td&gt;별도 구현 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주 사용처&lt;/td&gt;&lt;td&gt;금융, 정부, 대기업 엔터프라이즈&lt;/td&gt;&lt;td&gt;웹/모바일, 오픈 API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상태 관리&lt;/td&gt;&lt;td&gt;Stateful 가능&lt;/td&gt;&lt;td&gt;Stateless 기본 원칙&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h2&gt;5. 마무리&lt;/h2&gt;

&lt;p&gt;SOAP과 REST는 &lt;strong&gt;등장 배경부터 철학이 다릅니다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOAP은 &lt;strong&gt;안정성과 보안&lt;/strong&gt;을 중시하는 엔터프라이즈 환경에서 출발했으며, 오늘날에도 금융·정부 시스템에서는 여전히 사용됩니다.&lt;/li&gt;
&lt;li&gt;REST는 &lt;strong&gt;단순함과 웹 친화성&lt;/strong&gt;을 무기로 웹·모바일 API 표준으로 자리 잡았고, 현재 대부분의 서비스에서 활용됩니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;결국 어떤 API를 선택할지는 &lt;strong&gt;서비스 환경과 요구사항(보안, 성능, 확장성)&lt;/strong&gt;에 달려 있습니다.&lt;/p&gt;</description>
      <author>mingming_96</author>
      <guid isPermaLink="true">https://mingming-96.tistory.com/157</guid>
      <comments>https://mingming-96.tistory.com/157#entry157comment</comments>
      <pubDate>Sat, 20 Sep 2025 21:14:39 +0900</pubDate>
    </item>
  </channel>
</rss>