LTSP 씬 클라이언트 설정: DHCP, 자동 공유 마운트, Kerberos SSH
핵심 포인트
- PXE/ DHCP 설정으로 씬 클라이언트가 네트워크 부팅하도록 구성합니다.
- 로그인 시 NETLOGON에 있는 사용자별 배치 파일을 기반으로 CIFS 공유를 자동 마운트합니다.
- 로그오프 시 pam_script.so를 이용해 언마운트합니다.
- Kerberos(GSSAPI)를 이용해 SSH 무비밀번호 로그인을 활성화합니다.
용어 한 줄 요약
- LTSP: 네트워크로 부팅하여 중앙 서버에서 세션을 제공하는 씬 클라이언트 솔루션.
- PXE: 네트워크를 통한 부팅 프로토콜.
- CIFS: Windows 파일 공유를 마운트하는 프로토콜.
- Kerberos: 네트워크 인증 프로토콜.
- PAM: 리눅스 인증/세션 모듈 관리.
- GSSAPI: Kerberos 인증을 SSH에 통합하기 위한 API.
DHCP 서버 설정
다음은 씬 클라이언트가 thinserver로 부팅하게 하기 위해 필요한 DHCP 설정 예시입니다. 이 코드는 DHCP 서버 설정 파일에 그대로 넣어 사용할 수 있습니다.
default-lease-time 21600;
max-lease-time 21600;
option subnet-mask 255.255.255.0;
option broadcast-address 10.255.255.255;
option routers 10.0.0.1;
option domain-name-servers 10.0.0.10
option domain-name "domain.internal";
option root-path "/opt/ltsp/i386";
host thinclient1 {
next-server 10.0.0.10;
hardware ethernet 00:AA:BB:CC:DD:EE;
fixed-address 10.0.0.100;
filename "ltsp/i386/pxelinux.0";
option root-path "10.0.0.10:/opt/ltsp/i386";
}
host thinclient2 {
next-server 10.0.0.10;
hardware ethernet 00:BB:CC:DD:EE:FF;
fixed-address 10.0.0.101;
filename "ltsp/i386/pxelinux.0";
option root-path "10.0.0.10:/opt/ltsp/i386";
}
중요: IP와 MAC 주소, next-server 등은 환경에 맞게 변경하세요. root-path와 파일 경로는 LTSP 서버의 실제 경로와 일치해야 합니다.
씬 클라이언트 데스크톱 설정
씬 클라이언트 사용성을 높이기 위해 XPGnome 테마를 설치했습니다. 원본 링크는 문서에서 제공했던 ‘여기’를 참고하세요(원문 링크 유효 시 사용).
기본적으로 시작 메뉴만 수정했고, Adobe Reader 9와 Skype를 추가 설치했습니다. 로그아웃 아이콘이 표시되지 않는 문제가 있었는데, 48×48 크기의 아이콘을 찾아 GIMP로 32×32, 24×24, 22×22, 16×16으로 축소한 다음 system-log-out.png로 이름을 바꾸어 /usr/share/icons/GnomeXP/{icon size}/actions에 저장하면 해결됩니다.
최종 결과 화면 예시는 아래 스크린샷을 참고하세요.

모든 사용자에게 동일한 설정을 기본 적용하려면, 테마와 설정을 적용한 사용자의 홈 폴더에서 .config, .gconf, .icons, .local, .themes 폴더를 /etc/skel로 복사하세요. 앞으로 전 사용자에게 공통으로 적용할 변경은 /etc/skel로 복사해야 합니다.
로그인 시 윈도우 공유 자동 마운트
윈도우 공유를 로그인 시 자동으로 마운트하는 방법은 여러 가지가 있지만, 이 가이드에서는 Bash와 Perl 스크립트를 사용하고 Ubuntu의 “Startup Applications”(시작 응용 프로그램)에 등록하는 방식을 채택했습니다. 아래 스크립트들을 환경에 맞게 수정해 사용하면 됩니다.
사전 준비: dc.domain.internal의 NETLOGON 공유가 thinserver.domain.internal에 마운트되어 있어야 합니다. 이 예시에서는 AD 내용을 열람만 할 수 있는 일반 도메인 계정 public / password를 사용했다고 가정합니다(실제 환경에서는 안전한 계정을 사용하세요).
마운트할 폴더 생성:
sudo mkdir /mnt/logon다음 항목을 /etc/fstab에 추가하여 NETLOGON 공유를 영구 마운트하도록 합니다.
//dc.domain.internal/netlogon /mnt/logon cifs username=public,password=password 0 0마운트 적용:
sudo mount -a이 방법은 각 사용자가 NETLOGON 내부에 로그인 배치 파일(.bat)을 가지고 있고, 서버 server.domain.internal에 각 사용자용 공유가 존재한다고 가정합니다. 예: 사용자 John Doe의 사용자명 jdoe, 배치 파일 jdoe.bat:
@echo off
NET USE S: \\server\common
NET USE T: \\server\IT다음으로 /usr/local/bin/에 win_share.sh를 생성합니다. 이 스크립트는 로그인한 사용자의 홈에 기존 .mount.sh와 .umount.sh가 있으면 삭제하고, mount.pl을 실행해 새로 .mount.sh와 .umount.sh를 생성한 뒤, .mount.sh를 실행해 공유를 마운트합니다. Kerberos 인증을 사용하므로 사용자에게 비밀번호 프롬프트가 뜨지 않아야 합니다.
#!/bin/sh
# Check to see if .mount.sh and .umount.sh exist, if so delete them!
if [ -f /home/$USER/.mount.sh ]; then
rm /home/$USER/.mount.sh
fi
if [ -f /home/$USER/.umount.sh ]; then
rm /home/$USER/.umount.sh
fi
# Create the .mount.sh and .umount.sh scripts from users batch file
/usr/local/bin/mount.pl $USER
# Mount network shares when logging on.
/home/$USER/.mount.sh다음으로 mount.pl Perl 스크립트를 /usr/local/bin에 생성합니다. 이 스크립트는 NETLOGON에 있는 사용자 배치 파일을 파싱해서 사용자 홈에 .mount.sh와 .umount.sh를 작성합니다.
#!/usr/bin/perl
# Build dynamic ~user/.mount.sh based on logon.bat
$user = $ARGV[0];
$file = "/mnt/logonbat/$user.bat"; # <-- Change this from $user to the name of the batch script if you only use one.
die if ! $user;
die if ! -e $file;
open (PAM_CONF, ">/home/$user/.mount.sh");
open (LOGOFF, ">/home/$user/.umount.sh");
print PAM_CONF qq{#!/bin/sh
if [ ! -d /home/$user/Home ]; then
mkdir /home/$user/Home
fi
mount.cifs //server/$user /home/$user/Home -o username=$user,sec=krb5
};
print LOGOFF qq{#!/bin/sh
if [ "`cat /proc/mounts | grep /home/$user/Home | wc -l`" -ge "1" ]; then
umount.cifs /home/$user/Home
fi \n};
my(@arr)=`cat /mnt/logonbat/$user.bat`;
$mounts = parse_batfile(\@arr);
foreach $mount (@$mounts) {
chomp($mount);
($server,$share) = $mount =~ /\\\\(.*)\\(.*)/;
$share =~ tr/\cM//d;
$mnt = $share;
# skip AUDIT. It's for PCs only
next if $mnt =~ /AUDIT/;
# skip personal shares.
next if lc("$mnt") eq lc("$user");
next if ! $mnt;
#strip dollar sign from mount point
$mnt =~ s/\$$//;
# make sure mount point is unique
$mnt .= "-$server" if $seen{$mnt}++;
# upshift first letter of mnt point
$mnt =~ s/^(.)(.*)/\u$1$2/g;
# print PAM_CONF "volume $user cifs $server $share /home/$user/$mnt - - -\n";
print PAM_CONF qq{if [ ! -d /home/$user/$mnt ]; then
mkdir /home/$user/$mnt
fi
mount.cifs //$server/$mnt /home/$user/$mnt -o username=$user,sec=krb5 \n};
print LOGOFF qq{if [ "`cat /proc/mounts | grep /home/$user/$mnt | wc -l`" -ge "1" ]; then
umount.cifs /home/$user/$mnt
fi \n};
}
close PAM_CONF;
close LOGOFF;
system ("chown $user:16777729 /home/$user/.mount.sh"); # 16777729 is my GID for "Domain Users"
system ("chown $user:16777729 /home/$user/.umount.sh"); # 16777729 is my GID for "Domain Users"
system ("chmod +x /home/$user/.mount.sh");
system ("chmod +x /home/$user/.umount.sh");
# All done
sub parse_batfile {
my($file) = @_;
my(@mounts);
foreach $line (@$file) {
(@val) = split / /,$line;
if (uc($val[0]) eq "NET" && uc($val[1]) eq "USE") {
push (@mounts,$val[3]);
}
if ($val[0] eq "CALL") {
my($match) = $val[1] =~ /\\\\.*\\NETLOGON\\(.*)/ ;
if ($match) {
chop($match);
my(@arr)=`cat /mnt/logonbat/$match`;
$mounts = parse_batfile(\@arr);
unshift @mounts, @$mounts;
}
}
}
return \@mounts;
}예시로, jdoe 사용자의 .mount.sh는 다음과 같습니다.
#!/bin/sh
if [ ! -d /home/jdoe/Home ]; then
mkdir /home/jdoe/Home
fi
mount.cifs //server/jdoe /home/jdoe/Home -o username=jdoe,sec=krb5
if [ ! -d /home/jdoe/common ]; then
mkdir /home/jdoe/common
fi
mount.cifs //server/common /home/jdoe/common -o username=jdoe,sec=krb5
if [ ! -d /home/jdoe/IT ]; then
mkdir /home/jdoe/IT
fi
mount.cifs //server/IT /home/jdoe/IT -o username=jdoe,sec=krb5 win_share.sh와 mount.pl을 준비한 후, 로그인 시 win_share.sh를 실행하도록 “시작 응용 프로그램”에 추가합니다. “시작 응용 프로그램”은 시스템 메뉴의 Preferences > Startup Applications에서 생성할 수 있습니다.

로그오프 시 윈도우 공유 제거
로그오프 시 마운트한 공유를 언마운트하려면 pam_script.so 모듈을 이용해 사용자의 .umount.sh를 실행하게 합니다. pam_script는 세션 시작/종료 시 스크립트를 실행할 수 있는 PAM 모듈입니다. 로그인시에는 본 예제처럼 사용자의 환경 변수($USER)에 의존하는 스크립트를 직접 실행하도록 Startup Applications를 사용했고, 로그오프 처리만 pam_script로 수행했습니다.
libpam-script 패키지 설치 예시:
sudo dpkg -i libpam-script_1.1.4-1_i386.debmount.pl이 생성한 jdoe 사용자의 .umount.sh 예시는 다음과 같습니다.
#!/bin/sh
if [ "`cat /proc/mounts | grep /home/jdoe/Home | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/Home
fi
if [ "`cat /proc/mounts | grep /home/jdoe/common | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/common
fi
if [ "`cat /proc/mounts | grep /home/jdoe/IT | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/IT
fi 다음으로 /usr/share/libpam-script/pam_script_ses_close 파일을 생성/편집합니다.
#!/bin/sh
# pam_script_ses_close script to remove windows shares
/home/$PAM_USER/.umount.sh 2>&1 >> /var/log/umount.log그리고 /etc/pam.d/common-session 파일에 다음 라인을 추가합니다.
session optional pam_script.so그 후 실제로 로그오프 후 공유가 언마운트되는지 테스트하세요.
Kerberos로 비밀번호 없는 SSH
Kerberos를 도메인에 설정해 두면 SSH에서 GSSAPI를 이용한 비밀번호 없는 로그인(티켓 위임 포함)이 가능합니다. 서버와 워크스테이션 모두 도메인에 가입되어 있고 Kerberos 설정이 올바르게 되어 있어야 합니다.
thinserver의 /etc/ssh/sshd_config에서 다음을 활성화합니다:
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UseDNS yes워크스테이션의 /etc/ssh/ssh_config에서 다음을 활성화합니다:
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes테스트:
ssh -v thinserver성공하면 암호 프롬프트 없이 다음과 같은 디버그 로그를 볼 수 있습니다:
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Delegating credentials
debug1: Delegating credentials
debug1: Authentication succeeded (gssapi-with-mic).문제와 해결법
다음은 실제로 마주친 문제들과 해결법입니다.
문제: LTSP 클라이언트가 인증은 되는데 즉시 로그아웃한다 해결: 다음을 실행해 윈도우 매니저 설정을 강제합니다:
gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory --type string --set /desktop/gnome/session/required_components/windowmanager metacity문제: 씬 클라이언트에서 VNC가 보이지 않음 해결: http://bootpolish.net/home_ltsp_installx11vnconltsp5
문제: 기본 로그인 화면을 사용자 정의 화면으로 변경하는 방법 해결: https://help.ubuntu.com/community/EdubuntuFAQ
문제: 씬 클라이언트의 root 비밀번호 설정 방법 해결: https://help.ubuntu.com/community/EdubuntuFAQ
문제: 로그아웃 아이콘이 없음 해결: http://ubuntuforums.org/archive/index.php/t-815188.html
배포 전 체크리스트
- DHCP 서버: PXE 옵션 및 next-server 설정 확인
- LTSP 서버: /opt/ltsp/i386 경로와 pxelinux.0 파일 존재 확인
- NETLOGON 마운트: /etc/fstab 항목과 /mnt/logon 접근 권한 확인
- Kerberos: kinit으로 티켓 발급 확인, 서버와 클라이언트의 시간 동기화(NTP)
- PAM 설정: /etc/pam.d/common-session에 pam_script.so가 추가되어 있는지 확인
- 권한: 생성되는 .mount.sh/.umount.sh의 소유자와 실행 권한 확인
- 보안: plaintext 비밀번호를 fstab에 두지 않도록 검토(가능하면 자격 증명 파일 사용)
역할별 체크리스트
관리자:
- DHCP 및 TFTP 설정 검토
- LTSP 이미지와 root-path 유지 관리
- Kerberos와 DNS 설정 점검
데스크톱 운영자:
- XPGnome 테마 배포 및 /etc/skel 동기화
- 시작 응용 프로그램 등록과 테스트
사용자 지원 담당자:
- 로그인 시 네트워크 드라이브 매핑 문제 해결
- 로그오프 시 언마운트 실패 시 로그 분석 (/var/log/umount.log)
간단한 실행 플레이북
- DHCP/TFTP 확인 및 LTSP 이미지 배포
- NETLOGON을 /mnt/logon에 마운트
- mount.pl 및 win_share.sh 배치, 권한 설정
- 사용자 계정으로 로그인해 .mount.sh 생성 확인
- pam_script 설치 및 /etc/pam.d/common-session 수정
- Kerberos 티켓 테스트 및 SSH 접속 테스트
- 최종 사용자 환경을 /etc/skel로 복사
트러블슈팅 흐름도
flowchart TD
A[로그인 문제 발생] --> B{인증 실패인가}
B -- 예 --> C[Kerberos 티켓 확인 'klist/kinit']
B -- 아니오 --> D{데스크톱 세션 강제 종료}
D -- 세션 문제 --> E[gconftool-2로 윈도우매니저 설정]
C --> F{SSH/Kerberos 연동 문제}
F -- 네트워크 --> G[DNS/NTP/도메인 가입 여부 확인]
F -- 설정 --> H[sshd_config 및 ssh_config 설정 확인]
E --> I[로그 확인 및 세션 로그 분석]보안 및 운영상 주의사항
- /etc/fstab에 평문 비밀번호를 두는 방식은 보안상 권장되지 않습니다. 가능한 경우 자격증명 파일(권한 제한) 또는 Kerberos 기반 인증을 사용하세요.
- mount.cifs에서 sec=krb5를 사용하면 Kerberos 티켓으로 인증하므로 비밀번호를 묻지 않습니다.
- 생성되는 .mount.sh/.umount.sh 파일의 소유자와 권한을 적절히 설정해 다른 사용자가 읽지 못하도록 하세요.
글로서리 (한 줄)
- LTSP: 원격 세션을 제공하는 씬 클라이언트 서버.
- PXE: 네트워크 부팅 프로토콜.
- CIFS: 윈도우 파일 공유 마운트 프로토콜.
- PAM: 리눅스 인증 모듈 프레임워크.
- Kerberos: 티켓 기반 네트워크 인증 시스템.
마무리 요약
이 문서는 LTSP 씬 클라이언트를 위한 DHCP 설정, 사용자 환경 배포 방법, NETLOGON 기반 윈도우 공유 자동 마운트와 언마운트, Kerberos 기반 SSH 비밀번호 없는 로그인, 그리고 자주 발생하는 문제와 해결책을 다룹니다. 배포 전 체크리스트와 역할별 목록, 트러블슈팅 흐름도를 참고해 환경에 맞게 조정하세요.
중요: 프로덕션 환경에서는 평문 자격증명 사용을 피하고, 시간 동기화와 DNS 설정을 엄격히 관리하세요.