おおよそ、以下の環境での記録です。 ・ubuntu 12.04 (ブートローダはGRUB2) ・/dev/sdOK のHDDは正常 ・/dev/sdFAILED のHDDは不具合 ・/dev/sdNEW は新規・新品HDD ・sdOK sdFAILED sdNEWは、全て同じ容量、同じパーティション構成 ・/dev/md0は sdOK1 と sdFAILED1 で構成 ・/dev/md1は sdOK2 と sdFAILED2 で構成 まず、データのバックアップをとった。 下の[復旧作業]を他の(仮想)PCで予行演習し、自己責任で作業を実行した。 [役立ちそうな情報確認・表示コマンド] RAIDの状態を表示 # cat /proc/mdstat /dev/sdX の製品名・シリアル番号・容量等を表示 (要 smartmontools パッケージ) # smartctl -i /dev/sdX /dev/sdX のパーティション情報をs(sector)単位で表示 # parted /dev/sdX unit s print [復旧作業] sdFAILED が Fail(F)状態ではない場合、Fail状態に変更。 # mdadm --manage /dev/md0 --fail /dev/sdFAILED1 # mdadm --manage /dev/md1 --fail /dev/sdFAILED2 sdFAILEDをRAIDから除去。 # mdadm --manage /dev/md0 --remove /dev/sdFAILED1 # mdadm --manage /dev/md1 --remove /dev/sdFAILED2 sdOKにGRUBが入っているか確認。 # dpkg-reconfigure grub-pc sdOK,sdFAILED の仕様を確認し、後の作業での取り間違えを回避。 # smartctl -i /dev/sdOK # smartctl -i /dev/sdFAILED PCをシャットダウン、sdFAILEDを除去、sdNEW を接続、PCを起動。 自分の環境では、/etc/grub/defaultの GRUB_TERMINAL=console これを無効に(コメントに)していた事などから、 GRUBのブートメニューでrecovery modeを選択しないと、 degraded状態でのUbuntu起動ができなかった。 とりあえず起動できたので、普通にlogin。 sdOK sdNEW が /dev/sda か /dev/sdb か、何なのかを確認、特定。 (あるいは /dev/disk/by-id/ とかを使えば良いのかもしれない) # ls /dev/sd? # smartctl -i /dev/sda # smartctl -i /dev/sdb # cat /proc/mdstat sdOKのパーティション情報を表示。 # parted /dev/sdOK unit s print /dev/sdNEW のパーティションを以下の条件で作成。 ・パーティションテーブルはMBR(GPTではない) ・パーティション1: 基本(primary)パーティション Start 2048s End 999423s ・パーティション2: 基本(primary)パーティション Start 999424s End 1953523711s ・パーティション1、2は、ともにLinux ソフトウェア raid 用 # parted /dev/sdNEW (parted) unit s (parted) print (parted) mklabel msdos (parted) print (parted) mkpart primary 2048s 999423s (parted) print (parted) mkpart primary 999424s 1953523711s (parted) print (parted) set 1 raid on (parted) set 2 raid on (parted) print (parted) quit /dev/sdNEWをRAIDに追加。 # mdadm --manage /dev/md0 --add /dev/sdNEW1 # mdadm --manage /dev/md1 --add /dev/sdNEW2 RAIDの状態表示で、追加作業の開始を確認し、完了するまで放置。 # cat /proc/mdstat 念のため、initrdを更新。要らないかもしれないが、なんとなく。 # update-initramfs -u GRUBを/dev/sdOK と /dev/sdNEWに(再)インストール。 # dpkg-reconfigure grub-pc PCを再起動し、RAID1障害復旧の完了を確認。 [参考] ソフトウェアRAID1障害時のHDD交換(Parted編) | クラウド備忘録 http://www.cloud-memo.com/2013/04/raidhddparted.html Ubuntu Manpage: GNU Parted - a partition manipulation program http://manpages.ubuntu.com/manpages/precise/man8/parted.8.html [おまけ作業:RAID1 --raid-devices=3] HDD2台(2重)構成のRAID1では、なんとなく心配になってきたので、 HDD(/dev/sdTHIRD)を追加し、HDD3台(3重)構成のRAID1に変更した。 パーティションを作成するところまでは sdNEWと同じなので省略。 spareとしてsdTHIRDを登録。 # mdadm --manage /dev/md0 --add /dev/sdTHIRD1 # mdadm --manage /dev/md1 --add /dev/sdTHIRD2 3台構成に変更。 # mdadm --grow /dev/md0 --raid-devices=3 # mdadm --grow /dev/md1 --raid-devices=3 RAIDの状態表示で、追加作業の開始を確認し、完了するまで放置。 # cat /proc/mdstat initrdの更新と、GRUBをsdTHIRDにもインストール。 # update-initramfs -u # dpkg-reconfigure grub-pc 以上で完了。 ちなみに、2台に戻す場合のmdadm処理は、以下の要領。 # mdadm --manage /dev/md0 --fail /dev/sdTHIRD1 # mdadm --manage /dev/md0 --remove /dev/sdTHIRD1 # mdadm --grow /dev/md0 --raid-devices=2 [おまけ:気になった点] 「initrd.img の更新は必要なのか?」 と思ったが、今回の作業では不要だったかもしれない。 UUIDの変化は、blkid コマンドにて、以下の通りいくつか確認した。 ・構成ディスクが変わっただけなので、md0 md1 のUUIDは変化無し ・sdFAILED[12] と sdNEW[12] のUUIDは同じなので、実質的にUUIDの変化無し ・sdFAILED[12] と sdNEW[12] のUUID_SUBは異なるので、UUID_SUBは変化あり ・mdadm.confには、UUID_SUBの記述は見当たらない ・ついでに、grub.cfgには、UUID_SUBの記述は見当たらない よって、更新は要らないかもしれない。ただし、 # update-initramfs -u # dpkg-reconfigure grub-pc このあたりの処理で、UUID_SUBを検出して利用している可能性はあるので、 これらを実行しておいたほうが無難だとは思う。 Linux ソフトウェア RAID1の障害復旧作業では起こらないかもしれないが、 何らかの理由か、何か別の処理で /dev/md や /dev/sd の UUIDが変われば、 設定の更新処理をしてからGRUBのインストールやinitrd.imgの更新等が必ず必要になるだろう。 処理内容は、おそらく以下のような感じ。※これは予想※ # echo mdを構成するsdのUUIDが変更されたら・・・ # cd /etc/mdadm # mv -i mdadm.conf mdadm.conf--backup # /usr/share/mdadm/mkconf generate # # echo mdのUUIDが変更されたら・・・ # cd /etc # mv -i fstab fstab--backup # vi fstab # # update-initramfs -u # dpkg-reconfigure grub-pc [おまけ:発見したこと] Ubuntu新規インストール時にRAIDの作成処理をした後ぐらいの所で、 「OSブート時、もしもRAIDがdegrade状態だった場合の通常処理は、 そのまま起動か?中止か?」 という選択を求められたが、その変更方法が気になっていた。 # dpkg-reconfigure mdadm これで、変更できるっぽい事を知った。
2013年10月3日木曜日
Linux ソフトウェア RAID1の障害復旧記録(Ubuntu12.04)
2012年11月9日金曜日
資料:HDD,SSD 容量・セクタ数 一覧表
製造元あるいは型番が異なると、大雑把な容量表示(○GB, ○TB)に対応するセクタ数が違う場合があります。そのため、あまり意味がありません。
[WesternDigital]
[Intel]
仮想ストレージを作る時、なるべく存在する物理HDD/SSDと同一容量で作りたい気がしたので調べてみました。
[WesternDigital]
| Capacity | User Sectors | Model |
| 40GB | 78165360 | WD400JD |
| 80GB | 156301488 | WD800JD |
| 120GB | 234441648 | WD1200AAJS |
| 160GB | 312581808 | WD1600AAJS |
| 250GB | 488397168 | WD2500AAKX |
| 320GB | 625142448 | WD3200AAKX |
| 500GB | 976773168 | WD5000AZRX |
| 750GB | 1465149168 | WD7500AALX |
| 1TB | 1953525168 | WD10EZRX |
| 1.5TB | 2930277168 | WD15EARX |
| 2TB | 3907029168 | WD20EZRX |
| 3TB | 5860533168 | WD30EZRX |
| 4TB | 7814037168 | WD40EZRX |
[Intel]
| Capacity | User Sectors | Model |
| 60GB | 117231408 | SSD330,SSD520Series |
| 120GB | 234441648 | SSD330,SSD520Series |
| 180GB | 351651888 | SSD330,SSD520Series |
| 240GB | 468862128 | SSD330,SSD520Series |
| 480GB | 937703088 | SSD520Series |
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を使いました。
1.
win7.isoを用意した。ちなみに、マウント方法は
2.
win7.isoをiSCSI-DDと同じターゲット内の別lunに登録した。
3.
iPXEでiSCSI-DDをsanhookし、物理DVDドライブを使ってWindows7のインストーラを起動するiPXEスクリプトを元に、 iPXEでiSCSI-DDとwin7.isoをsanhookし、wimbootを使ってWindows7のインストーラを起動するiPXEスクリプトを用意した。具体的には
wimbootの取得は
http://www.ipxe.org/wimboot こちらから。
bootmgr等、win7.iso内のファイルは、win7.isoをマウントしてアクセス可能にした。
なお、http://www.ipxe.org/wimbootにあるとおり、 Windows8でも同様にして実現可能な模様。試してません。
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キーロールオーバーではないキーボード、あるいは、 同時押しできる組み合わせに制限があるキーボードの構造は、 こちらが参考になる。
登録:
投稿 (Atom)



