2012年11月9日金曜日

資料:HDD,SSD 容量・セクタ数 一覧表

製造元あるいは型番が異なると、大雑把な容量表示(○GB, ○TB)に対応するセクタ数が違う場合があります。そのため、あまり意味がありません。

[WesternDigital]
CapacityUser SectorsModel
40GB78165360WD400JD
80GB156301488WD800JD
120GB234441648WD1200AAJS
160GB312581808WD1600AAJS
250GB488397168WD2500AAKX
320GB625142448WD3200AAKX
500GB976773168WD5000AZRX
750GB1465149168WD7500AALX
1TB1953525168WD10EZRX
1.5TB2930277168WD15EARX
2TB3907029168WD20EZRX
3TB5860533168WD30EZRX
4TB7814037168WD40EZRX

[Intel]
CapacityUser SectorsModel
60GB117231408SSD330,SSD520Series
120GB234441648SSD330,SSD520Series
180GB351651888SSD330,SSD520Series
240GB468862128SSD330,SSD520Series
480GB937703088SSD520Series
仮想ストレージを作る時、なるべく存在する物理HDD/SSDと同一容量で作りたい気がしたので調べてみました。

2012年11月7日水曜日

iPXEでWindows7のインストーラをディスクレスブートし、iSCSIターゲット内ストレージにインストール

※wimboot-2.1.0以前を使用した場合の情報です。 重要なポイントはiPXE公式サイトの通りです。
http://www.ipxe.org/wimboot

iPXEを使ってiSCSIターゲット内ディスクにWindows7をインストールする方法は知っていました。 具体的には、iPXEでiSCSIターゲット内ディスクをsanhook(あるいは gpxeでkeep-san+sanboot失敗)し、 物理DVDドライブ(あるいはUSBフラッシュメモリー)を使ってWindows7のインストーラを起動する方法です。

インストーラもネットワークブートできればいいなと思い、やってみました。 iPXE、iSCSIターゲットとしてtgt、httpサーバとしてlighttpdを使いました。
以下
iSCSIターゲット内ストレージを iSCSI-DD
Windows7のDVDイメージを win7.iso
と呼ぶ事にします。
ちなみに、win7.isoをsanbootしても、インストールはできませんでした。 sanhook/sanboot の --driveについて iSCSI-DDを0x80、win7.isoを0x81等にするとインストーラが起動せず、 win7.isoを0x80、iSCSI-DDを0x81等にするとインストーラは起動するが、 インストール先にiSCSI-DDを選択したところで、 「それは無理、BIOSから見えてないから(要約)」というエラーが出てインストールできませんでした。 その他、色々やりましたorz

1.
win7.isoを用意した。ちなみに、マウント方法は
 mount -t udf -o loop /tgt/iso/win7.iso /tgt/iso/mnt/win7
といった具合です。

2.
win7.isoをiSCSI-DDと同じターゲット内の別lunに登録した。
<target iqn.2012-11.hoge.hoge:hoge>
#...
    <backing-store /tgt/iso/win7.iso>
        lun 2
        device-type cd
        readonly 1
    </backing-store>
#...
</target>
といった具合です。iSCSI-DDと別のターゲットだと、(iPXEかtgtかwin7か何かの仕様の影響で)インストール不可でした。

3.
iPXEでiSCSI-DDをsanhookし、物理DVDドライブを使ってWindows7のインストーラを起動するiPXEスクリプトを元に、 iPXEでiSCSI-DDとwin7.isoをsanhookし、wimbootを使ってWindows7のインストーラを起動するiPXEスクリプトを用意した。具体的には
 sanhook --drive 0x80 ${iSCSI-DD用root-path}
 exit
といったところを
 sanhook --drive 0x80 ${iSCSI-DD用root-path}
 sanhook --drive 0x81 ${iSCSIでのwin7.iso用root-path}

 set base-url http://tgt.or.some.server/hoge/

 kernel ${base-url}ipxetool/wimboot
 initrd ${base-url}mnt/win7/bootmgr          bootmgr
 initrd ${base-url}mnt/win7/boot/bcd         BCD
 initrd ${base-url}mnt/win7/boot/boot.sdi    boot.sdi
 initrd ${base-url}mnt/win7/sources/boot.wim boot.wim
 boot
に変更した。
wimbootの取得は
http://www.ipxe.org/wimboot こちらから。
bootmgr等、win7.iso内のファイルは、win7.isoをマウントしてアクセス可能にした。
 ちなみに、win7.isoもsanhookしているのは、インストーラは途中からiPXE経由のアクセスを止めるために一応。
 iSCSI-DDと同じターゲットなので、要らないと思いますけど。
 httpを使うのは、公式サイトの説明がhttpになってるのと、その理由はおそらく
 tftpではファイルサイズの上限が16MBか32MBで、boot.wimをとってこれないためだと思われる。

なお、http://www.ipxe.org/wimbootにあるとおり、 Windows8でも同様にして実現可能な模様。試してません。

2012年10月6日土曜日

savecredを使えない環境でパスワード入力を自動化したrunasをpowershellで実現

※2013-12-19更新

PsExec を使えばよいみたいです
http://technet.microsoft.com/ja-jp/sysinternals/bb897553.aspx
> コンピューター名を省略すると、PsExec では
> ローカル システムでアプリケーションを実行します。
ということなので、基本的な使い方は、以下の通りのようです。
psexec -u <ユーザー> -p <パスワード> <コマンド名> <引数>


[Powershellを使う方法]
標準ユーザーAが標準ユーザーBの権限でコマンドを実行したい時、
runas.exeを使えば良いが、savecredを使えない環境だと毎回パスワードの入力が必要。
以前は、runas.exeのパスワード入力を、Windows Script Hostで自動化していたが、
この方法でパスワード入力を実行している時、runas.exeが動いているウィンドウのフォーカスを
うっかり奪ってしまうと、うまくいかない。
そこで、Windows PowerShellを使ってみたところ、うまくいった。
検証環境は、Vista Home Premium 64bitで、具体的な方法は以下の通りです。

まず、次のバッチファイルを、メモ帳にコピペして、標準ユーザーAで作成した。
ただし、userb_idとuserb_pwの部分を、目的とする標準ユーザーBの実際の値に変更すること。 
パスワードを平文で保存するのが不都合なら、この手は使えません。
== as_userb_run.bat ======================================================================
@echo off
REM ####################################################################
REM ## 
REM ## 基本機能(用途)は、PowerShellを使って、
REM ## バッチファイルを別ユーザで実行すること。
REM ## ※エスケープや特殊文字の使用は非対応
REM ##
REM ## 例:
REM ##  as_userb_run.bat "C:\Users\userb\opt\mybatch.bat"
REM ##
REM ####################################################################

set id='userb_id'
set pw='userb_pw'

REM ####################################################################
REM ## [For文メモ]
REM ## For文内での環境変数が扱いにくいので、あえてifとgotoで処理
REM ## [変数メモ]
REM ##  %1: "ho ge" の時、 %~1: ho ge となり、引用符「"」があれば削除
REM ####################################################################

set arglist="'&'"
:arglist_append_start
 if x%1 == x goto arglist_append_end
  set arglist=%arglist%,"'''%~1'''"
  shift
 goto arglist_append_start
:arglist_append_end

REM ####################################################################
REM ## [powershellを2回使う理由]
REM ## 1回目: Start-Processの-Credentialで、ユーザをかえるため
REM ## 2回目: 実行演算子「&」を使い、通常の手順でコマンドを実行するため
REM ## [debugメモ]
REM ## powershellが-Commandの文字列を処理したあとも終了しないようにする
REM ## powershell -NoExit -Command ...
REM ## 
REM ## powershell 1回目でエラーをあえて起させて、コマンドラインを見る
REM ## ... Start-Process powershell errarg -ArgumentList ...
REM ##
REM ## powershell 2回目でエラーをあえて起させて、コマンドラインを見る
REM ## ... @("'-Command'","'errarg'",%arglist%) ...
REM ####################################################################

REM ## 通常
powershell -Command Start-Process powershell -ArgumentList @("'-Command'",%arglist%) -LoadUserProfile -NoNewWindow -Credential (New-Object System.Management.Automation.PSCredential(%id%, (ConvertTo-SecureString -AsPlainText -Force %pw%))) -WorkingDirectory '%SystemRoot%'

REM ## powershell 1回目でエラー
REM #powershell -NoExit -Command Start-Process powershell errarg -ArgumentList @("'-Command'",%arglist%) -LoadUserProfile -NoNewWindow -Credential (New-Object System.Management.Automation.PSCredential(%id%, (ConvertTo-SecureString -AsPlainText -Force %pw%))) -WorkingDirectory '%SystemRoot%'

REM ## powershell 2回目でエラー
REM #powershell -Command Start-Process powershell -ArgumentList @("'-NoExit'","'-Command'","'errarg'",%arglist%) -LoadUserProfile -NoNewWindow -Credential (New-Object System.Management.Automation.PSCredential(%id%, (ConvertTo-SecureString -AsPlainText -Force %pw%))) -WorkingDirectory '%SystemRoot%'

exit /B
=======================================================================================

as_userb_run.batの使い方は、例えば、

c:\> as_userb_run.bat "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -no-remote 

あるいは、

c:\> as_userb_run.bat notepad "C:\Users\userb\hoge hoge\fuga.txt"

あるいは、次のバッチファイル

as_userb_run.bat notepad "C:\Users\userb\hoge hoge\fuga.txt"

を作成し、実行する方法がある。
このようにすれば、 標準ユーザーAが標準ユーザーBの権限でコマンドを実行できるはず。

[参考]
「別のユーザーとして実行」して「管理者として実行」する。: Windows Script Programming
http://scripting.cocolog-nifty.com/blog/2010/01/post-a567.html

2012年9月6日木曜日

製作: 十字キー(ジョイパッド)付きキーボード


PCでゲーム(特にアクションゲーム)をする時、
普段使っているキーボードでだいたいこなせるが、移動操作だけは

 ↑
←↓→

あるいは

 E
SDF

などによる入力では、個人的にはキツイ。
移動操作だけは、十字キー(ジョイパッド)を使って左手でやりたい。
あと、PC用ソフトでキーボード非対応は珍しいが、ジョイパッド非対応はありえる。

そこで、十字キー搭載でキーピッチ19mm(一般的な大きさ)のキーボードを
探したが、見つからないので作ってみた。
具体的には、手持ちのキーボードにプレステ(PS1)のコントローラSCPH-1080を接続し、
SCPH-1080の十字キーを操作した時も、↑←↓→が入力されるキーボードに改造しました。

主な注意事項は、以下のとおり。
・NumLockオフの時、テンキーの8426も↑←↓→なので間違えないようにする
・ハンダゴテで面実装IC等を外すとき、強引にひっぱらず、工夫する
・追加配線が、キーボード、コントローラの外枠と干渉しないか確認する




ちなみに、ジョイパッド+JoyToKeyで方向キーの入力をし、
あとは通常のキーボードを使えば同等の環境になるが、
「ジョイパッド+JoyToKey」と「キーボード」の間で
入力遅延の差が発生する可能性がある。
一方、キーボードでゲームをする場合の注意点は、
ゲーム用や高級なキーボードを除いて、複数ボタンを
同時に押すことに対応していない可能性が高いので、
こちらのHTML等でテストしてみたほうがよい。

パソコンなどのキーボードで複数のキーが同時に押打されたときに、
そのキー全てを読取れる機能をNキーロールオーバーと呼ぶそうだ。
Nキーロールオーバーではないキーボード、あるいは、
同時押しできる組み合わせに制限があるキーボードの構造は、
こちらが参考になる。

資料: SCPH-1080の基盤

プレイステーション(1)のコントローラSCPH-1080を分解した写真です。
同一型番でも、中身は違うかもしれません。

資料: SCPH-1010の基盤

プレイステーション(1)のコントローラSCPH-1010を分解した写真です。
同一型番でも、中身は違うかもしれません。

2012年7月2日月曜日

qemu-kvm: Windows VistaゲストにVNCで接続して半角全角キーを使う

qemu-kvmで仮想化したWindows Vistaのゲスト(以下、Vista)へ、qemu-kvmの -vnc オプションで有効になるVNCディスプレイ経由で接続した時、半角全角キーを使えなかった。
もちろん、VNCクライアントは半角/全角対応のVNCクライアントを使ったのに。

それどころか、CTRLキーが効かなかった。何故かCTRLキーが半角/全角キー扱い。
物理PCで動かしていたVistaなので、レジストリでCTRLとCapsLockを入れ替える設定をしてた。
この入れ替え設定が、何故か影響していた。当該レジストリ設定(Scancode Map)を消せば、CTRLキーは使えるようになった。

調べてみた所、半角/全角キーを押すと、Vistaは不明(あるいは無効)なキーが押されたと認識しているようだった。qemu-kvmの -k (keyboard layout)オプションで ja(日本語) を選択していた分もあるのか、半角/全角を除くキーは問題なく認識されていたので、不明なキーを半角/全角キー扱いしてもらうことにした。
具体的には、レジストリ設定ファイル(.reg)で表現すると、
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,29,00,00,00,00,00,00,00
という内容で、レジストリエディタのスクリーンショットで表現すると、





この通り。設定後、Vistaを再起動すれば、半角/全角を使えるようになった。