LTSP:Thin Client と Thinserver の設定ガイド
重要: 本記事中のパスワードやホスト名はサンプルです。本番環境では適切な資格情報とアクセス制御を使用してください。
目的と対象読者
このドキュメントは、LTSP 環境を運用または構築するシステム管理者向けです。以下が主な対象です。
- シンクライアントをネットワークブートで起動させたい管理者
- Windows 共有をユーザーごとにマウント/アンマウントしたい運用担当者
- Kerberos を利用して SSH 認証を無人化したい管理者
用語の1行定義:
- LTSP: Linux Terminal Server Project。ネットワークブートでシンクライアントを提供する仕組み。
- CIFS/SMB: Windows 共有(ファイル共有)プロトコル。
- Kerberos: ネットワーク認証プロトコル。
DHCP サーバー設定
以下は、Thin Client が thinserver から PXE ブートするための DHCP 設定例です。必要に応じてネットワークや IP アドレスを自環境に合わせて変更してください。
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";
}
注意: next-server と filename の設定は PXE ブート時に必要です。root-path は NFS ルートイメージの場所を指します。
シンクライアント初期設定
ユーザー向けの見た目や使い勝手を一括で変更したい場合は、以下の手順が役に立ちます。
- XPGnome テーマをインストールして見た目を統一しました。ダウンロードリンクはご自身で管理するレポジトリやパッケージサーバーを使ってください。
- 初期設定で行った変更点は、主にスタートメニューの編集、Adobe Reader 9 と Skype の導入です。
問題の一例: 「ログアウト」アイコンが表示されない場合
- 解決策: 48×48 のアイコンを見つけ、GIMP などで 32×32、24×24、22×22、16×16 に縮小して保存します。ファイル名を system-log-out.png に変更し、各サイズのディレクトリに配置します。
配置例:
- /usr/share/icons/GnomeXP/32x32/actions/system-log-out.png
- /usr/share/icons/GnomeXP/24x24/actions/system-log-out.png
- /usr/share/icons/GnomeXP/22x22/actions/system-log-out.png
- /usr/share/icons/GnomeXP/16x16/actions/system-log-out.png
最終的なデスクトップ見た目の例:

全ユーザーのデフォルト設定にするには、ホームディレクトリで以下のフォルダを /etc/skel にコピーします。
- .config
- .gconf
- .icons
- .local
- .themes
注意: 今後、共通デフォルトに反映したい変更は /etc/skel に再度コピーする必要があります。
Windows 共有をログイン時にマウントするフロー
方針: Bash と Perl スクリプトを使い、Ubuntu の「スタートアップアプリケーション」でログイン時にユーザー毎の共有を動的にマウントします。pam_script をログオフ処理にのみ利用する理由は、ログインで実行するスクリプトはユーザー権限($USER)で動く必要があるためです。
前提:
- thinserver.domain.internal 上で dc.domain.internal の NETLOGON がマウントされていること。
- 例として、汎用的に 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 上)を用意する。例: jdoe.bat
@echo off
NET USE S: \\server\common
NET USE T: \\server\IT- /usr/local/bin に win_share.sh と mount.pl を作成して、ログイン時にユーザー固有の .mount.sh/.umount.sh を生成・実行する仕組みにする。
win_share.sh の要点:
#!/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.shmount.pl はログオンバッチを解析して、ユーザー用の .mount.sh と .umount.sh を動的に生成します(Perl スクリプト)。生成されるスクリプトは Kerberos(sec=krb5)でのマウントを想定しています。
mount.pl の要点(ファイルは /usr/local/bin/mount.pl):
#!/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;
}生成された /home/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 を実行するには、Ubuntu の「設定 > スタートアップアプリケーション」から新しいエントリを追加します。

重要: start-up のエントリはユーザー権限で実行されることを確認してください。root で実行すると $USER が root になり、スクリプトは期待通り動作しません。
ログオフ時の共有解除
ログオフ時にマウントを解除するには pam_script.so を使います。pam_script はログイン/ログオフ時にスクリプトを実行できる PAM モジュールです。ログオン時に使わなかった理由は前述のとおりユーザー権限が必要なためです。
- libpam-script をインストール
sudo dpkg -i libpam-script_1.1.4-1_i386.deb- mount.pl が作る .umount.sh の例(jdoe)
#!/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- テスト: ログイン→共有がマウントされること。ログオフ→/var/log/umount.log にエントリが残り、共有が umount されること。
Kerberos を使ったパスワードレス SSH
Kerberos を正しく構成済みのドメイン内であれば、SSH の GSSAPI を使ってパスワード入力無しにログインできます。
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).注意: Kerberos チケットの有効期限や kinit の有無により挙動が変わります。ワークステーションで kinit を行い、klist でチケットを確認してください。
問題と解決策(トラブルシューティング・リスト)
以下は実際に遭遇した問題とその解決策の抜粋です。
- 問題: LTSP クライアントは認証されるがすぐにログアウトする
- 解決:
gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory --type string --set /desktop/gnome/session/required_components/windowmanager metacity問題: Thin クライアントで VNC が動かない
- 解決: ブートポリッシュの LTSP-VNC インストール手順を参考にしてください: http://bootpolish.net/home_ltsp_installx11vnconltsp5
問題: デフォルトログイン画面をカスタムに変更したい
- 解決: Ubuntu/Edubuntu の FAQ を参照: https://help.ubuntu.com/community/EdubuntuFAQ
問題: Thin クライアントで root パスワードを設定したい
- 解決: 上記 Edubuntu FAQ を参照
問題: ログアウトアイコンが表示されない
- 解決: フォーラムの投稿を参照: http://ubuntuforums.org/archive/index.php/t-815188.html
トラブルシューティング・マトリクス
| 問題 | 主要原因 | 優先対応 | 備考 |
|---|---|---|---|
| PXE ブート失敗 | DHCP/TFTP 設定不備 | DHCP 設定確認(next-server, filename) | ネットワーク VLAN を疑う |
| ユーザー共有がマウントされない | Kerberos チケット不足 / smbcredentials | kinit 実行、/var/log/ を確認 | mount.cifs のオプション確認 |
| ログオフで umount されない | pam_script 未導入 / パスの不一致 | /etc/pam.d に pam_script.so を追加 | /var/log/umount.log を参照 |
展開手順(簡易 SOP)
目的: 新しい LTSP イメージを作り、全クライアントに展開する簡易手順。
- テスト環境で DHCP と PXE 設定を検証する。
- LTSP イメージを作成し、/opt/ltsp/i386 に配置する。
- DHCP の next-server と filename を設定して PXE ブートを有効化する。
- テンプレートユーザーでログインし、必要なデスクトップ設定を行う。
- 設定フォルダを /etc/skel にコピーしてデフォルト化する。
- mount.pl/ win_share.sh を /usr/local/bin に配置し、実行権限を与える。
- libpam-script を導入し、ログオフ時の umount を有効化する。
- パイロットユーザーで一連のログイン→共有マウント→ログオフ→アンマウントを検証する。
- 問題なければ本番環境にロールアウトする。障害対応手順(ロールバック)を事前に用意する。
ロールバック案(簡易):
- DHCP 設定を以前の状態に戻す。
- /etc/skel を以前のバックアップに戻す。
- mount.pl による生成スクリプトを無効化して、手動マウントに戻す。
ロール別チェックリスト
管理者(展開):
- DHCP・TFTP 設定を確認した
- PXE イメージが /opt/ltsp にあることを確認した
- /etc/skel を更新しておいた
運用担当(毎日の確認):
- /var/log/syslog に PXE のエラーがないか確認
- /var/log/umount.log を確認してログオフ処理が成功しているか確認
ヘルプデスク(ユーザー対応):
- ユーザーの kinit 状況を確認する方法を知っている
- ログイン時の共有が見えないときに mount.cifs コマンドで確認する
テストケース(受入基準)
- TC1: 新規ユーザーでログインした際、/home/
以下に Home, common, IT など指定された共有がマウントされること。 - TC2: ログオフ時に /proc/mounts に該当エントリが残らないこと。
- TC3: SSH で thinserver に接続した際、Kerberos 認証でパスワードを要求されないこと。
受入基準:
- 上記 TC1〜TC3 がすべて満たされること。ログにはエラーが残らないこと。
セキュリティと運用上の注意
- /etc/fstab に平文でパスワードを置かない。可能なら credential ファイルか Kerberos のみで認証する設定にしてください。
- /home/*/.mount.sh と .umount.sh の所有者と実行権限を確認し、他ユーザーが編集できないようにする。
- Kerberos のチケットの有効期限と KDC の冗長化を検討してください。
よくある失敗パターンと回避ヒント
失敗: mount.pl が期待したバッチファイルを見つけられない
- 回避: /mnt/logonbat のパスとファイル名の大文字小文字を確認し、mount.pl の $file 変数を適切に変更する。
失敗: umount で “device is busy” が出る
- 回避: lsof や fuser でアクセス中プロセスを調べ、ログオフ前にプロセス終了を促す。
マインドセットとヒューリスティクス
- 小さく始めて段階的にロールアウトする。
- まずはテストユーザーで運用を検証し、問題がないことを確認してから全ユーザーに展開する。
- 自動化スクリプトは明確にログを出すようにして、障害発生時に原因追跡しやすくする。
1行用語集
- PXE: ネットワーク経由でブートイメージを取得する仕組み。
- GSSAPI: Kerberos を SSH 等で利用するための API。
- CIFS: Windows 共有をマウントするための Linux 側の呼称。
まとめ:
- 本ガイドは LTSP 環境の構築から運用までの実例をまとめています。DHCP/PXE 設定、ユーザーごとの共有マウント、ログオフ時のアンマウント、Kerberos による SSH 認証など、実運用で必要となるポイントを網羅しました。
- まずはテスト環境で順を追って確認してください。問題が出たらトラブルシューティング・マトリクスとログを参照して原因を絞り込みましょう。
重要: 本文のスクリプトや設定はサンプルです。権限、資格情報、ネットワーク構成は自組織のセキュリティポリシーに従って適切に管理してください。