テクノロジーガイド

LTSP:Thin Client と Thinserver の設定ガイド

4 min read インフラ 更新されました 22 Oct 2025
LTSP:Thin Client と Thinserver の設定ガイド
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 ルートイメージの場所を指します。

シンクライアント初期設定

ユーザー向けの見た目や使い勝手を一括で変更したい場合は、以下の手順が役に立ちます。

  1. XPGnome テーマをインストールして見た目を統一しました。ダウンロードリンクはご自身で管理するレポジトリやパッケージサーバーを使ってください。
  2. 初期設定で行った変更点は、主にスタートメニューの編集、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” を使用しています。実際には安全な資格情報を使用してください。

手順(要点):

  1. マウントポイント作成
sudo mkdir /mnt/logon
  1. /etc/fstab に NETLOGON エントリを追加(例)
//dc.domain.internal/netlogon      /mnt/logon           cifs   username=public,password=password 0  0
  1. マウント実行
sudo mount -a
  1. ユーザーごとのログオンバッチ(NETLOGON 上)を用意する。例: jdoe.bat
@echo off
NET USE S: \\server\common
NET USE T: \\server\IT
  1. /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.sh

mount.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 モジュールです。ログオン時に使わなかった理由は前述のとおりユーザー権限が必要なためです。

  1. libpam-script をインストール
sudo dpkg -i libpam-script_1.1.4-1_i386.deb
  1. 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 
  1. /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
  1. /etc/pam.d/common-session に以下を追加
session     optional              pam_script.so
  1. テスト: ログイン→共有がマウントされること。ログオフ→/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

トラブルシューティング・マトリクス

問題主要原因優先対応備考
PXE ブート失敗DHCP/TFTP 設定不備DHCP 設定確認(next-server, filename)ネットワーク VLAN を疑う
ユーザー共有がマウントされないKerberos チケット不足 / smbcredentialskinit 実行、/var/log/ を確認mount.cifs のオプション確認
ログオフで umount されないpam_script 未導入 / パスの不一致/etc/pam.d に pam_script.so を追加/var/log/umount.log を参照

展開手順(簡易 SOP)

目的: 新しい LTSP イメージを作り、全クライアントに展開する簡易手順。

  1. テスト環境で DHCP と PXE 設定を検証する。
  2. LTSP イメージを作成し、/opt/ltsp/i386 に配置する。
  3. DHCP の next-server と filename を設定して PXE ブートを有効化する。
  4. テンプレートユーザーでログインし、必要なデスクトップ設定を行う。
  5. 設定フォルダを /etc/skel にコピーしてデフォルト化する。
  6. mount.pl/ win_share.sh を /usr/local/bin に配置し、実行権限を与える。
  7. libpam-script を導入し、ログオフ時の umount を有効化する。
  8. パイロットユーザーで一連のログイン→共有マウント→ログオフ→アンマウントを検証する。
  9. 問題なければ本番環境にロールアウトする。障害対応手順(ロールバック)を事前に用意する。

ロールバック案(簡易):

  • 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 認証など、実運用で必要となるポイントを網羅しました。
  • まずはテスト環境で順を追って確認してください。問題が出たらトラブルシューティング・マトリクスとログを参照して原因を絞り込みましょう。

重要: 本文のスクリプトや設定はサンプルです。権限、資格情報、ネットワーク構成は自組織のセキュリティポリシーに従って適切に管理してください。

共有する: X/Twitter Facebook LinkedIn Telegram
著者
編集

類似の素材

Debian 11 に Podman をインストールして使う
コンテナ

Debian 11 に Podman をインストールして使う

Apt-pinning入門:Debianで複数リポジトリを管理
Linux

Apt-pinning入門:Debianで複数リポジトリを管理

OptiScalerでFSR 4を全対応ゲームに導入する方法
ゲーム

OptiScalerでFSR 4を全対応ゲームに導入する方法

Dansguardian と Squid(NTLM)を Debian Etch に導入する方法
ネットワーク

Dansguardian と Squid(NTLM)を Debian Etch に導入する方法

AndroidでSDカードのインストールエラーを修正する方法
トラブルシューティング

AndroidでSDカードのインストールエラーを修正する方法

KNetAttach と KDE の remote:/ でネットワークフォルダーを設定
Linux ネットワーク

KNetAttach と KDE の remote:/ でネットワークフォルダーを設定