2010年6月14日月曜日

ユーザプロファイルが破損したWindows 7環境の復旧

Windows 7 + BitLocker 環境のユーザプロファイルが破損してログインできなくなったため、ユーザプロファイルを再作成して復旧しました。その時のメモ。

■ セーフモード + プロンプトで起動

BIOS POST画面から Windows 7 のスプラッシュロゴに切り替わる瞬間に F8 キーを押し起動画面を表示します。 BitLocker によりHDD 全体を保護している場合、このタイミングで BitLocker の回復キーを要求されます。

■ ログインし裏口ユーザを作成

コマンドプロンプトだけであればユーザプロファイルが破損していても問題なくログインできました。ここで DOS プロンプトより裏口ユーザを作成し、管理権限を与えておきます。

C:\Users\hasegaw>> net user hasegaw2 /add
C:\Users\hasegaw>> net user hasegaw2 password
C:\Users\hasegaw>> net localgroup administrators hasegaw2 /add

■ 普通に起動し、 hasegaw ユーザを再作成

この段階で、これまで使っていた hasegaw というユーザだけでなく hasegaw2 によるログインも可能な状態になっています。

hasegaw2 でログインした後に下記の順序で作業します。


  • C:\Users\hasegaw を C:\Users\hasegaw.old にリネーム

  • コントロールパネル(もしくはnet user)で hasegaw ユーザをいったん削除、再作成

  • hasegaw ユーザでログイン


  • 必要なファイルを hasegaw.old/ から移動などする

Windows xp ではユーザプロファイルのフォルダ自体がなくなっていれば自動的に再生成されたかと思いますが Windows 7 ではダメだったのでユーザごと再作成しました。 SID が変わってしまいますが、まぁローカルユーザですし特に問題はないでしょう。


■ プロファイル破損時に備えて

あらかじめ裏口ユーザは一つぐらい作っておいたほうがよいかもしれませんね。。。



2010年5月12日水曜日

PuTTYによるSSH接続でNATタイムアウトを防止するには

SSHクライアントを利用する場合に、しばらく放置すると接続が切れてしまう経験はありませんか?

IPマスカレードなどのNAT環境下にいる場合、もしくはそのようなホストへ接続する場合に、TCPセッションがNATテーブルから消えることによりセッションがリセットされる場合があります。これを防止する場合は PuTTY の場合「接続の設定」で下記設定を60秒などに設定します。

Keepalive の間隔 (0秒でオフ)

これにより、 PuTTY が定期的にダミーパケットを送出するため TCP セッション切れを防止できます。

2010年2月25日木曜日

autofsを使ってISOファイルを自動マウントする

Linux の autofs で、設定値を書いたファイルのほかにスクリプトが使えるということに2~3年ぐらい前に気づいたので、「ISOファイルを自動マウントする仕組みを作ってやろう」と思っていました。今頃ながら試しに実装してみましたので、ご紹介します。

/etc/auto.master

#
# $Id: auto.master,v 1.4 2005/01/04 14:36:54 raven Exp $
#
# Sample auto.master file
# This is an automounter map and it has the following format
# key [ -mount-options-separated-by-comma ] location
# For details of the format look at autofs(5).
#/misc  /etc/auto.misc --timeout=60
#/smb   /etc/auto.smb
#/misc  /etc/auto.misc
#/net   /etc/auto.net
/export /etc/auto.export
/dvd    /etc/auto.dvd --timeout=60


/etc/auto.dvd (-r-xr-xr-x)

#!/usr/bin/perl

($key) = @ARGV;
$dvd = sprintf('/export/archives/ISO/%s.ISO', $key);

if (-e $dvd) {
        print "         -fstype=auto,ro,loop    :$dvd\n";
}


つかいかた。/dvd/≪ISOイメージのベースネーム≫ に cd すると、勝手にマウントされます。

hasegaw@vm245:~$ mount | grep dvd
automount(pid3743) on /dvd type autofs (rw,fd=4,pgrp=3743,minproto=2,maxproto=4)
hasegaw@vm245:~$ ls -l /dvd/MXXXXXX_FRONTIER_01
total 4
dr-xr-xr-x 2 4294967295 4294967295   40 2008-06-18 22:23 AUDIO_TS
dr-xr-xr-x 2 4294967295 4294967295 1028 2008-06-18 22:23 VIDEO_TS
hasegaw@vm245:~$ mount | grep dvd
automount(pid3743) on /dvd type autofs (rw,fd=4,pgrp=3743,minproto=2,maxproto=4)
/export/archives/ISO/MXXXXXX_FRONTIER_01.ISO on /dvd/MXXXXXX_FRONTIER_01 type udf (ro,loop=/dev/loop0)



用が済んだら --timeout 秒経過後、大体1分後にアンマウントされる。

hasegaw@vm245:~$ mount | grep dvd
automount(pid3743) on /dvd type autofs (rw,fd=4,pgrp=3743,minproto=2,maxproto=4)



この仕組みの利用例。HDD上にため込んだDVDイメージをiPodに変換する際に実際に入力したコマンドです。たくさんの ISO イメージをハシゴするような作業をバッチで仕掛る場合など、イメージのマウント・アンマウントが autofs が勝手に行うので意識する必要がありません。


$ for i in 01 02 03 04 05 06 07 08 09; do echo mkmp4_linux -d /dvd/MACROSS_FRONTIER_$i -p iPod; done

その他の応用としては Linux のインストール DVD をレポジトリにため込み、ディレクトリ移動のみで参照できる環境を提供を想定しています。

懸念事項としては、この仕組みの利用頻度が上がると loop デバイスを使い切ってしまい、自動マウントできなくなるトラブルが考えられます。その場合には /etc/modules.conf 等で loop デバイスの個数を増やすなどの対策が考えられます。



2010年1月24日日曜日

昼食の時間だけスクリーンセーバをデフラグツールに変更する(改良版)

昨日紹介したスクリーンセーバー切り替え VBScript をマイナーチェンジしました。

新しいスクリプトでは、すでにスクリーンセーバーが起動していた場合は、それを強制終了させます。ここれにより、以下のような挙動になります。(スクリーンセーバーの設定が10分の場合)


■ スクリーンセーバー切り替え時に、すでにスクリーンセーバーが動作している場合


  • 基準時間: スクリーンセーバーの変更、および既存スクリーンセーバの停止

    →画面がロックされる

  • +10分: 再度タイムアウトによりスクリーンセーバーが起動される


■ スクリーンセーバー切り替え時に、スクリーンセーバーが動作していない場合


  • ユーザーがロックもしくは放置してから 10 分後にタイムアウトによりスクリーンセーバーが起動される


これにより、タスク設定時間より早めに休憩に入ってしまったとしても、お昼には確実にデフラグスクリーンセーバーを起動するようになりました。

なお、前回は Auglogics Disk Defrag を使用していましたが、今回のスクリプトは MyDefrag (JkDefragの後継) 向けとしてあります。


MyDefrag
http://www.mydefrag.com/





'
' スクリーンセーバを auslogics disk defrag に設定する
'

SS_DEFRAG = "C:\WINDOWS\system32\MYDEFR~1.SCR"

HKEY_CURRENT_USER = &H80000001
strComputer = "."

Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Control Panel\Desktop"
objReg.CreateKey HKEY_CURRENT_USER, strKeyPath
objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, "SCRNSAVE.EXE", SS_DEFRAG

' すでに別のスクリーンセーバ(logon.scr)が動作していたら、そのスクリーンセーバーを
' ストップさせる。
Set objShell = CreateObject("Wscript.Shell")
r = objShell.Run("taskkill /F /IM logon.scr", 1, True)

昼食の時間だけスクリーンセーバをデフラグツールに変更する

こんにちわ。みなさんお仕事は順調でしょうか?

客先の業務量減少に伴い、残業規制やらお昼時間の消灯やらでテンションだだ下がりなブログ主です。お昼の時間 12:00 になるとオフィスの照明が強制消灯されるので、最近は時間どおりに食事に出ることが多くなりました。おかげでお陰で最近、体重がいいかんじにry(関係ない

ところで、お昼の時間って、PCの電源が入ったままなので、この間にデフラグを流してる人なども多いのではないでしょうか。私は別にデフラグジャンキーじゃないのですが、職場のセキュリティポリシーに準じて導入しているツールがファイルをズタズタにしてくれるので、昼休みはデフラグすることにしようと思いました。



  • 使用するデフラグツール

  • スクリプトの作成とテスト

  • タスクの設定

  • 問題が発生……



■ 使用するデフラグツール

ほかに JkDefrag などの選択肢もあるわけですが、Auslogics Disk Defrag が最近のお気に入りなので、このスクリーンセーバーを使いたいと思います。

Auslogics Disk Defrag Screen Saver

http://www.auslogics.com/en/software/disk-defrag-screen-saver/

ただ、私は普段からデフラグスクリーンセーバーを設定するほどのデフラグジャンキーではありませんし、外出先でデフラグがかかると鬱陶しいので、時間指定でスクリーンセーバーを変更することにしました。

■ スクリプトの作成とテスト

まず、スクリーンセーバーを変更する VBScript を 2 つ書きます。

C:\hasegaw\bin\TASK_SCREENSAVER_CHANGER_DEFRAG.vbs …… スクリーンセーバをデフラグツールに

C:\hasegaw\bin\TASK_SCREENSAVER_CHANGER_LOGON.vbs …… スクリーンセーバを普段のものに

以下にスクリプトの例を示します。

C:\hasegaw\bin\TASK_SCREENSAVER_CHANGER_DEFRAG.vbs

'
' スクリーンセーバを auslogics disk defrag に設定する
'

SS_DEFRAG = "C:\Windows\aus_ddss.scr"

HKEY_CURRENT_USER = &H80000001
strComputer = "."

Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Control Panel\Desktop"
objReg.CreateKey HKEY_CURRENT_USER, strKeyPath
objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, "SCRNSAVE.EXE", SS_DEFRAG

C:\hasegaw\bin\TASK_SCREENSAVER_CHANGER_LOGON.vbs

'
' スクリーンセーバを login.scr に設定する
'

SS_DEFRAG = "C:\Windows\SYSTEM32\logon.scr"

HKEY_CURRENT_USER = &H80000001
strComputer = "."

Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Control Panel\Desktop"
objReg.CreateKey HKEY_CURRENT_USER, strKeyPath
objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, "SCRNSAVE.EXE", SS_DEFRAG

これらのスクリプトを書いたら、スクリプトが期待通りに動作するかを確認します。


  • 画面のプロパティーを開き、スクリーンセーバーを なし に設定してプロパティを閉じる

  • TASK_SCREENSAVER_CHANGER_DEFRAG.vbs をダブルクリックする

  • 画面のプロパティーを開き、スクリーンセーバーがデフラグツールに設定されたことを確認

  • TASK_SCREENSAVER_CHANGER_LOGON.vbs をダブルクリックする

  • 画面のプロパティーを開き、スクリーンセーバーが普段のものに設定されたことを確認

■ タスクの設定

スクリプトが問題なく動作することを確認したら、続いて Windows のタスクとしてこれらのスクリプトを設定します。


  • TASK_SCREENSAVER_CHANGER_DEFRAG


    • 実行するプログラム …… TASK_SCREENSAVER_CHANGER_DEFRAG.vbs

    • 実行日時/頻度 …… 毎日11:50

    • その他設定 …… ログオン時以外は実行しない

  • TASK_SCREENSAVER_CHANGER_LOGON


    • 実行するプログラム …… TASK_SCREENSAVER_CHANGER_LOGON.vbs

    • 実行日時/頻度 …… 毎日13:00

    • その他設定 …… ログオン時以外は実行しない

  • TASK_SCREENSAVER_CHANGER_LOGON2


    • 実行するプログラム …… TASK_SCREENSAVER_CHANGER_LOGON.vbs

    • 実行日時/頻度 …… ログオン時

    • その他設定 …… ログオン時以外は実行しない

これで、毎日 11:50~13:00にスクリーンセーバが変わるようになりました。

■ 問題が発生……

その後、 Auglogic Disk Defrag のスクリーンセーバを実際に動かしてみて、問題が判明。

このデフラグスクリーンセーバー、実行中はデフラグ対象のファイルの名前がリアルタイムで表示されてしまいます。(^^;;;

この状態でついうっかり「...\秘蔵エロ\...」とか「履歴書.doc」※とかのファイル名を職場の人間に見られると大変なことになってしまうのでちょっと常用はきついなぁ……。スクリーンセーバの設定をみてもこの挙動は変えられないみたい。

※ エロとか履歴書とかはネタだとしても、顧客名などの情報を含むファイル名がスクリーンセーバーにより表示されている状態というのは、普通に考えてもちょっと……。開発元はどういう神経で作ってるんでしょうね。

2009年11月19日木曜日

デグレード後使えなくなっていたZFSプールのインポートに成功

OpenSolaris 2009.06 で、Degrade ステータスとなった ZFS プールをインポートできなくなり
困っていたのですが、先ほど紹介した ZFS プールの rewind 機能を試したら無事マウントできるようになりました。

実はディスクを3台収容できるエンクロージャに物理的な障害が発生し 3本中1本のディスクが認識できなくなりました。冗長性を失ったままずっと動いていたのですが、障害原因の切り分けを行うべく OpenSolaris を停止したところ二度と import できなくなり、2ヶ月ほど放置してあったものです。

root@opensolaris:~# zpool import
  pool: array1
    id: 12644204788362156509
 state: DEGRADED
status: The pool was last accessed by another system.
action: The pool can be imported despite missing or damaged devices.  The
        fault tolerance of the pool may be compromised if imported.
   see: http://www.sun.com/msg/ZFS-8000-EY
config:

        array1        DEGRADED
          raidz1      DEGRADED
            c5t0d0p1  ONLINE
            c5t1d0p1  FAULTED  corrupted data
            c4t1d0p1  ONLINE

2009/11/6付の ONNV では同じ操作をするとこんな感じ。ステータス表記が DEGRADED から FAULTED に変更されるなど、メッセージにいくらかの変更があります。

root@opensolaris:~# zpool import
  pool: array1
    id: 12644204788362156509
 state: FAULTED
status: The pool was last accessed by another system.
action: The pool cannot be imported due to damaged devices or data.
        The pool may be active on another system, but can be imported using
        the '-f' flag.
   see: http://www.sun.com/msg/ZFS-8000-EY
config:

        array1        FAULTED  corrupted data
          raidz1-0    FAULTED  corrupted data
            c5t0d0p1  ONLINE
            c5t1d0p1  FAULTED  corrupted data
            c4t1d0p1  ONLINE


これまでインポートできなかった ZFS プール array1 ですが、無事インポートできるようになりました。 cannot share ... のメッセージが表示されていますが、これは iSCSI ターゲットのパッケージが入っておらずサービスが復旧できないために表示されており、 ZFS プールとしてはきちんとオンラインになっています。

root@opensolaris:~# zpool import -Ff array1
cannot share 'array1/timemachine': iscsitgtd failed request to share
cannot share 'array1/iscsi/elena4': iscsitgtd failed request to share

ちなみに -F オプションなしだと下記のようにエラーが表示されました。
プールを作り直せとメッセージが表示されるようになったのは最近のことです。
おそらくインポートできなくなったプールに関する問い合わせが相次いでいたのでしょうね。:-)

root@opensolaris:~# zpool import -f array1
cannot import 'array1': one or more devices is currently unavailable
        Destroy and re-create the pool from
        a backup source.



ZFSに、直近書き込み内容をロールバックする機能が搭載された?

マイコミジャーナルで先日掲載されていた「ZFSにはfsckが必要?」で ZFS にも fsck 的なツールが必要ではないかというお話が書かれていましたが、今日なんとなく ZFS のソースコードを見ていて目にとまったネタがあるので紹介します。


http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/zpool/zpool_main.c


   1556 /*
   1557  * zpool import [-d dir] [-D]
   1558  *       import [-o mntopts] [-o prop=value] ... [-R root] [-D]
   1559  *              [-d dir | -c cachefile] [-f] -a
   1560  *       import [-o mntopts] [-o prop=value] ... [-R root] [-D]
   1561  *              [-d dir | -c cachefile] [-f] [-n] [-F] <pool | id> [newpool]
   (..snip..)
   1582  *       -f Force import, even if it appears that the pool is active.
   1583  *
   1584  *       -F     Attempt rewind if necessary.
   1585  *

zpool import コマンドのオプションとして、必要であれば rewind するというオプションができたようです。細かくは語られていませんが、おそらく ZFS の領域を正しくマウントできなかった場合に、いくらか直近の書き込みをロールバックしてマウントを試みる機能のように思われます。

現状 zpool import でインポートできない ZFS プールを復旧する手段は特に用意されていないようですが、この rewind オプションに対応した ZFS モジュールとコマンドが一般的に使えるようになれば、RAID やライトキャッシュのせいでインポートできなくなった ZFS プールに対する手段となるのかもしれません。


というわけで OpenSolaris に最新の ONNV を適用する方法について調査中な私でした。