Acer Aspire easyStore H340 に Windows Server 2012 R2 Essentials を入れる

あらすじ

もう購入して6年前ですが、下記の記事で書いた Acer Aspire easyStore H340 という Windows Home Server の4ドライブベイの NAS を使っていました。

Windows Home Server 搭載の Acer Aspire easyStore H340-S1 レビュー - tilfin's note

とうに Windows Home Server 自体は終わってしまったんですが、Drive Extender というこちらも廃止された機能がゆるく便利だったためそのまま使い続けていました。ギガビットイーサのNICであるため速度的な問題がなく、NAT内での利用でセキュリティに不安はそれほどなかった。オールインワンで販売されたNASだったので、コンソールが普通に利用できないためOSインストールすらもハードルが高かったのが理由です。

しかし、流石に色々と厳しくなってきました。Windows Home Server が32ビットのため、 4ベイのHDDがそれぞれ最大2TBまでしか認識できなく、初期のシステムドライブは1TBなので複製機構を利用すると3.5TB(= (1+2+2+2) / 2)で限界になること。Drive Extender をマイクロソフトが捨てているので、新しい大規模ストレージシステムに移行しておかないとと思い、アップグレードを検討することにしました。

この間に Windows Home Server 自体は次のバージョン 2011 が出てそこで打ち止めとなり終了してしまいました。現存する一番近い OS は Windows Server 2012 Essentials の R2 になります。Windows Home ServerWindows Server 2003 ベースのため5世代の差があります。普通はハードから総取り替えするレベルなんですが、この筐体が静音でデザインも気に入っていたのと、メモリを増設すれば動作環境にギリギリ達することができたので、頑張って Windows Server 2012 R2 Essentials を入れてみようと調べ始めました。

日本語のリソースではこれを行った人は見つからなかったのですが(マザーボードを入れ替えてインストールした方はいました)、海外のフォーラムでは成功している人がいて、手順も載せてくれていたためやってみることにしました。

How To Install Windows Server 2012 R2 On H340 Hardware With No Vga Cable (Unattended Install) Using Virtualbox - Acer - We Got Served Forums

手順概要

  • Windows ADKを使って、Windows を無人インストールできる設定ファイルを用意する。
  • 物理ハードディスクに対して、VirtualBox から Windows Server 2012 R2 Essentials を途中までインストールする。
  • easyStore のシステムドライブベイ(1番下)にハードディスクを差して電源を入れる。
  • 数十分放置して無人インストールが完了した頃合で、リモートデスクトップからセットアップする。

注意事項

  • 記憶域プールは DriveExtender とは違い物理ハードディスクをまとめて指定するため、システムディスクの空き領域を活用することはできない。
  • OSをインストールするシステムハードディスクは、MBRディスクとなるため2TBまでしか利用できない。
  • GPTディスクが含まれるため現状 easyStore の各ドライブベイのLEDを利用することはできない(点灯しない)
  • インフォメーション(iマーク)LEDは常時青で点滅となる。
  • メモリを 2GB 以上に増やす(スロットは1つなので入れ替え)。

無人インストール用自動応答ファイルの設定

基本方針として入力が必要なものは予めセットしておく。リモートデスクトップが利用できるようにしておく(ただ次項で設定したファイアウォールのルールは結局反映されなかった)。

Windows ADK をインストール

Windows 8.1 Update 用 Windows アセスメント & デプロイメント キット (Windows ADK) http://www.microsoft.com/ja-jp/download/details.aspx?id=39982

Windows システム イメージ マネージャー

  1. OSインストール DVD ISO をマウントして sources\install.wim を抽出
  2. Windows システム イメージ マネージャーを開く
  3. Windows イメージの選択から install.wim を選択し、カタログ ファイルを作成する。

応答ファイルの設定

応答ファイルの設定をする。カタログのComponentsから設定する(詳細は下記のリンク参照)。 最後に応答ファイル autounattend.xml として保存する。

autounattend.xml

上記の設定を自分で行ったが結局すんなり行かなかったので、自分の作ったサンプルを貼っておきます。プロダクトキー (ProductKey) を換えてください。Administratorのアカウントは、Password2012 になっています。

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="windowsPE">
        <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SetupUILanguage>
                <UILanguage>ja-JP</UILanguage>
            </SetupUILanguage>
            <InputLocale>ja-JP</InputLocale>
            <SystemLocale>ja-JP</SystemLocale>
            <UILanguage>ja-JP</UILanguage>
            <UserLocale>ja-JP</UserLocale>
        </component>
        <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <DiskConfiguration>
                <Disk wcm:action="add">
                    <CreatePartitions>
                        <CreatePartition wcm:action="add">
                            <Order>1</Order>
                            <Size>350</Size>
                            <Type>Primary</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Extend>true</Extend>
                            <Order>2</Order>
                            <Type>Primary</Type>
                        </CreatePartition>
                    </CreatePartitions>
                    <ModifyPartitions>
                        <ModifyPartition wcm:action="add">
                            <PartitionID>1</PartitionID>
                            <Format>NTFS</Format>
                            <Active>true</Active>
                            <Label>System</Label>
                            <Order>1</Order>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <Format>NTFS</Format>
                            <Label></Label>
                            <Order>2</Order>
                            <PartitionID>2</PartitionID>
                        </ModifyPartition>
                    </ModifyPartitions>
                    <DiskID>0</DiskID>
                    <WillWipeDisk>true</WillWipeDisk>
                </Disk>
            </DiskConfiguration>
            <ImageInstall>
                <OSImage>
                    <InstallFrom>
                        <MetaData wcm:action="add">
                            <Key>/IMAGE/NAME</Key>
                            <Value>Windows Server 2012 R2 SERVERSOLUTION</Value>
                        </MetaData>
                    </InstallFrom>
                    <InstallTo>
                        <DiskID>0</DiskID>
                        <PartitionID>2</PartitionID>
                    </InstallTo>
                    <InstallToAvailablePartition>false</InstallToAvailablePartition>
                    <WillShowUI>OnError</WillShowUI>
                </OSImage>
            </ImageInstall>
            <UserData>
                <ProductKey>
                    <WillShowUI>OnError</WillShowUI>
                    <Key><プロダクトキー></Key>
                </ProductKey>
                <AcceptEula>true</AcceptEula>
                <FullName><名前></FullName>
                <Organization><組織名></Organization>
            </UserData>
            <EnableNetwork>true</EnableNetwork>
            <EnableFirewall>true</EnableFirewall>
        </component>
    </settings>
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <RegisteredOrganization><組織名></RegisteredOrganization>
            <RegisteredOwner><名前></RegisteredOwner>
            <TimeZone>Tokyo Standard Time</TimeZone>
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <NetworkLocation>Home</NetworkLocation>
                <ProtectYourPC>1</ProtectYourPC>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <HideLocalAccountScreen>true</HideLocalAccountScreen>
            </OOBE>
            <UserAccounts>
                <AdministratorPassword>
                    <Value>UABhAHMAcwB3AG8AcgBkADIAMAAxADIAQQBkAG0AaQBuAGkAcwB0AHIAYQB0AG8AcgBQAGEAcwBzAHcAbwByAGQA</Value>
                    <PlainText>false</PlainText>
                </AdministratorPassword>
            </UserAccounts>
            <BluetoothTaskbarIconEnabled>false</BluetoothTaskbarIconEnabled>
            <AutoLogon>
                <Password>
                    <Value>UABhAHMAcwB3AG8AcgBkADIAMAAxADIAUABhAHMAcwB3AG8AcgBkAA==</Value>
                    <PlainText>false</PlainText>
                </Password>
                <Enabled>true</Enabled>
                <LogonCount>9</LogonCount>
                <Username>Administrator</Username>
            </AutoLogon>
        </component>
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>ja-JP</InputLocale>
            <SystemLocale>ja-JP</SystemLocale>
            <UILanguage>ja-JP</UILanguage>
            <UserLocale>ja-JP</UserLocale>
        </component>
    </settings>
    <settings pass="specialize">
        <component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <fDenyTSConnections>false</fDenyTSConnections>
        </component>
        <component name="Networking-MPSSVC-Svc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <FirewallGroups>
                <FirewallGroup wcm:action="add" wcm:keyValue="EnableRemoteDesktop">
                    <Active>true</Active>
                    <Group>Remote Desktop</Group>
                    <Profile>all</Profile>
                </FirewallGroup>
            </FirewallGroups>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ComputerName><ホスト名></ComputerName>
        </component>
    </settings>
    <cpi:offlineImage cpi:source="catalog:d:/temp/install_windows server 2012 r2 serversolution.clg" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>

リモートデスクトップのポート開けは設定したものの適用されていませんでした。最初はファイアウォール自体を無効 (EnableFirewallをfalse) にしてもいいかもしれません(ただ無効になってくれるかは検証していないので推測です)。

このXMLファイル autounattend.xml をルートに配置した CD ISO イメージ(autounattend.iso)を何らかの方法で作成します。

物理ハードディスクを仮想ディスクとして利用する準備

管理者権限でコマンドプロンプトを開いて、VirtualBoxのVBoxManageコマンドで行います。

C:\Windows\system32>cd "\Program Files\Oracle\VirtualBox"

C:\Program Files\Oracle\VirtualBox>VBoxManage internalcommands createrawvmdk -fi
lename "D:\Temp\easystore.vmdk" -rawdisk "\\.\PhysicalDrive2"
RAW host disk access VMDK file D:\Temp\easystore.vmdk created successfully.
  • PhysicalDrive2 の 2 は予めディスク番号を調べておいて合わせます。

VirtualBox

VirtualBoxの新しいゲストを作成します。ハードディスクドライブに easystore.vmdk を選択します。CD/DVDドライブに以下をセットします。

  • ja_windows_server_2012_r2_essentials_with_update_x64_dvd_4119240.iso
  • autounattend.iso

ゲストを起動します。ロケール選択が出てこないで進めばとりあえず順調です。「処理が完了します」まで緑のチェックが入り、再起動カウントダウン画面になり、再起動がかかってVirtual Boxの初期画面が出たらゲストOSを強制的に終了させます。

VirtualBox を終了し、該当ハードディスクを取り外します。easyStore のドライブを全て一旦はずし、一番下のドライブベイにセットアップしたハードディスクをセットしてます。このままDHCPがあるLANに繋がっている状態で easyStore の電源を入れます。

この状態で数十分待ちます。DHCPサーバの履歴を見るなどして、easyStore の IPアドレスを特定し、リモートデスクトップ接続をします。 しかし、私の場合ここでファイルウォールが効いていたため、接続できませんでした。エクスプローラから \<IPアドレス>\c$ を叩き、Administratorで接続できれば、OSインストールは成功しています。作業用PCでレジストリエディタを開き、リモートで接続によってファイアウォールを無効化の設定に変更しました。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile

あたりのプロファイルの EnableFirewall を 0 (0x0) にセットします。

コマンドプロンプトから shutdown コマンドで再起動させます。

shutdown /r /m \\<IPアドレス>

easyStore の再起動後暫くしてリモートデスクトップ接続ができました。

セットアップ

後はコントロールパネルからファイアウォールの設定を開き、ルールで受信の構成でリモートデスクトップのルールを3つを有効にしてファイルウォールを再度オンにします。 「Windows Server Essentialsの構成」で管理者アカウントを設定するところがあります。Administrator は後に無効化され、ここで指定したアカウントが実質の管理者アカウントとなります。

ここまで来れば後は簡単です。リモートデスクトップからお好みの Windows Essentials サーバの設定を行います。

データの移行

私の場合は、新規のハードディスク2つを下から2,3番目のドライブベイにセットしてそれを記憶域プールの双方向ミラーで作成しました。

これまでのドライブエクステンダーに含まれていたデータを4番目のドライブや USB での外付けなど何らかの方法で開き、ドライブレター\DE\shares からコピーします。どのドライブにどのデータがあるかはわからないので、以前の全てのドライブの中身を上書きはスキップでコピーすれば移行完了です。

あとがき

メモリ 2 GBは足りていますが、やはり CPU がネックとなりがダッシュボードやコントロールパネルの表示が遅いです。よって諸々の設定が終わるのに時間がかかります。逆に言うとセットアップが終われば、ネットワークストレージとしてこれまで通り利用できます。Windows Azure Backup も VPN サーバとしての利用も可能です。

Ubuntu で Unicorn で動かす Redmine を 2.6 にアップデートしたときのメモ

RMagickに必要なパッケージインストール

RMagick系のパッケージが要るといわれたので入れておく。

# apt-get install graphicsmagick-libmagick-dev-compat libmagickcore-dev libmagickwand-dev

新しい Redmine の展開

新しい Redmine のパッケージをダウンロードして展開する。

前の場所から以下のファイルをコピーする。

  • Gemfile.local
  • config.ru
  • config/unicorn.rb
  • config/configuration.yml
  • config/database.yml

以下のディレクトリ内のファイルを移動する。

  • plugins
  • files
  • public/themes

お約束の手順

$ bundle install --path vendor/bundler
$ rake generate_secret_token
$ RAILS_ENV=production rake db:migrate
$ rake db:migrate:upgrade_plugin_migrations RAILS_ENV=production
$ rake db:migrate_plugins RAILS_ENV=production
$ rake tmp:cache:clear
$ rake tmp:sessions:clear

起動

$ bundle exec unicorn_rails -D -E production -c $APP_ROOT/config/unicorn.rb

Ubuntu で cron でスクリプトをセットするときのパス解決

rbenv や nodebrew で実行プログラムを管理してる場合、ユーザの HOME 下に環境を構築するため .bashrc や .bash_profile などでパスを通します。

しかし、crontab でそのままスクリプトを定義しても、ruby や node にパスが通っておらず動かない。調べたら bash の -l, --login オプションを付ければいいというので、試したがダメ。

Ubuntu の場合デフォルトで置かれる .bashrc の先頭で対話的ログインシェル以外は読み込みを止めてしまう記述があった。よって、それを外すなりその処理の前に PATH を再定義する必要がありました。

考えたあげく、アプリケーションの設定として実行ユーザーの環境設定に依存するのは止めた方が良いと、外出しの設定として PATH を定義するスクリプトソースを各 cron スクリプトの先頭で読ませるようにしました。

PATH=$HOME/.rbenv/shims:$HOME/.rbenv/bin:$HOME/.nodebrew/current/bin:$PATH

Nginx で IE 8.0 以下には jQuery のバージョン 1 を返すようにする

jQuery バージョン 2 から IE 9 未満のサポートが切り捨てられて、実装的にもファイルサイズ的にも軽くなっています。 ただそうは言っても IE 8 以前のアクセスもあるため、サーバ側でブラウザに合わせて、jQuery を切り替えて返してしまおうという設定をしました。

server {

    (略)

    modern_browser unlisted;
    ancient_browser "MSIE 6.0" "MSIE 7.0" "MSIE 8.0";
    
    location ~ ^/statics {
        root    /var/www/html/statics;

        if ($ancient_browser) {
            set $oldie_jq  O;
        }

        if ($request_filename ~* jquery\.min\.js) {
            set $oldie_jq  "${oldie_jq}K";
        }

        if ($oldie_jq = OK) {
            rewrite ^(.*)\/jquery\.min\.js$  $1/jquery-1.min.js  break;
        }

        break;
    }

    (略)
}

modern_browser と ancient_browser はそのままで Nginx としてモダンなブラウザか古いブラウザをセットすることができます。これによって古いブラウザに該当するかどうかを $ancient_browser を評価するだけで行えます。

続いてリクエストファイルが jquery.min.js かどうかを判定しています。if で AND が書けないためトリッキーな変数評価をしています。

IE 6.0~8.0だったときは jquery.min.js を jquery-1.min.js に rewrite することでバージョン 1 系を返しています。 バージョン 2 系は jquery.min.js 自体になります。

さくら VPS に Linux Mint 17 (Xfce) を入れて VNC でデスクトップを利用する

インターネット上に常時起動しているデスクトップ環境があると色々と重宝します。

さくらインターネットVPSLinux Mint 17 をセットアップしたのでそれのメモです。

ISO ダウンロード

デスクトップは軽量な方がいいので、Xfce を選択しました。

Linux Mint 17 Qiana のダウンロードページ http://www.linuxmint.com/download.php から Xfce 64bit 版のISOファイルをダウンロード

OS インストール

さくらのサイトの VPS コントロールパネルからインストール ISO をアップロードするためにアカウントを取得します。 sftp 接続して /iso/ にダウンロードした ISO ファイルをアップロードします。

HTML5 版のコンソールを使って Linux Mint をインストールします。 Ubuntuのマニュアルを参考にするといいでしょう。設定箇所はユーザ名、ホスト名、ハードディスクの扱いくらいです。

ネットワーク

そのままDHCPでセットアップされているので、手動に変えます。 ネットワーク接続でWired Connection 1 (eth0) の IPv4 を手動で設定します。Wired Connection 1〜3 (eth0~3) の IPv6 の設定も手動に変えます。そうしないとオート処理が裏で延々走ります。

SSH

SSHのポートフォワーディングを使うので SSH サーバを入れます。

# apt-get install ssh-server

さらに ufw を activeにして SSHサーバポートを許可します。

VNC

VNC サーバをインストールします。

# apt-get install vnc4server

Vino の設定をします。

$ vino-preferences &

SSH 経由でリモートホストの5900ポートをローカルで15900ポートで待ち受けるフォワーディングを有効にしつつログインします。

$ ssh -L 15900:localhost:5900 <VPS>

VNC サーバを起動します。

$ vncserver :1

$ vncserver -kill :1

初期設定ファイルを生成されます。そして一旦止めます。

VNC スタートアップ設定

xstartup を編集します。

$ vi .vnc/xstartup
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
x-window-manager &
exec xfce4-session &

VNC TLSを無効化

最近はVNCがデフォルトでTLS化しているためクライアントが対応できなく接続に失敗します。 SSHでラップしているため暗号化する必要もない。

$ sudo dbus-launch gsettings set org.gnome.Vino require-encryption false

VNCサーバ起動

VNC サーバをディスプレイ番号1で起動します。画面解像度 1280 x 800

$ vncserver -geometry 1280x800 :1

OS X から接続

Finderの[移動]、[サーバへ接続...]で「vnc://127.0.0.1:15900」に接続します。

iOSアプリエンジニア養成読本を共著させていただきました

技術評論社さんから刊行されますiOSアプリエンジニア養成読本[クリエイティブな開発のための技術力/デザイン力/マインドを養う!]を執筆させていただきました。 日頃お世話になっているクラスメソッド株式会社のエンジニアの諏訪さん、平屋さん、平井さんとフリーランスのyumulab 湯村さんとの共著になります。

自分が書いたのは三章立ての巻頭特集iOSエンジニアとして食べていくために知っておくべき14の重要スキルと知識 ~Appleの世界で生きるための処世術」になります。 iOSアプリの開発からリリースまでに必要となるスキルや持っていた方がいい知識を、自分のこれまでの経験を基に網羅的に書いたものになります。

副題にあるとおり、iOSアプリを取り巻く世界はAppleによってコントロールされているため、良くも悪くもその中で巧くやる必要があります。 それらを特に、これからiOSエンジニアを目指す方・1年未満の方、既にやっているけどアプリのリリースをしたことは無い方、iOSの受託開発をしようとしている会社のプロジェクトリーダー・マネージャーの方を念頭に、幅広くそして嵌りやすい点は掘り下げて書かせていただきました。

特集1, 3, 4 についてはクラスメソッドさんのエンジニアの御三方のコメントをご覧下さい。
iOSアプリエンジニア養成読本執筆のお知らせ | Developers.IO

養成読本というサフィックスですが、他の方の特集記事も含めてエキスパートで無い限りは何かしら得るものがある本になっています。 書店でお見かけの際はぜひに手に取っていただけると幸いです。

※ 自分の苗字を本来のはしごだかで書誌登録してもらったところ、UTF-8の全盛の現代でも文字化けや欠けになる場合があるみたいです。