WindowsOSのカスタムセットアップスクリプトを作る

以前windows用カスタムインストールメディアを作成するで、
OSインストール後に、アプリケーションをインストールをしたい場合の設定を調べたので記載。

動きとしては、

  • OSインストール時に、インストールメディアのPATH\sources\$OEM$\$$\setupが、%windir%\Setup\に展開される。
  • インストール後、%windir%\Setup\scripts/SetupComplete.cmdが実行される。
  • 注意点としては、

  • 再起動を伴うインストール、設定は最後に1つのみやる
  • この後にユーザープロファイルが作成される為、C:\Users\Administrator\Desktopにファイルを置くなどは行わない
  • ボタンを押すなどのGUI操作が必要な処理は行えない(サイレントインストールが出来れば行ける)
  • 会社のOSはWindowsServer2008R2なので、SetupComplete.cmdに以下の処理を追記。

    [code]
    # ログイン後のセットアップに使うスクリプト群をC:直下に配置
    xcopy %windir%\Setup\scripts\custum_setup C:\setup\ /Y 

    # ドットネットフレームワーク4.5をインストール
    %windir%\Setup\scripts\Packages\dotnetfx45_full_x86_x64.exe /q

    # Windowsアップデート関連の何かをインストール
    %windir%\Setup\scripts\Packages\Windows6.1-KB3138612-x64.msu /quiet /norestart

    # Powershell4.0をインストール(再起動あり)
    %windir%\Setup\scripts\Packages\Windows6.1-KB2819745-x64-MultiPkg.msu /quiet /forcerestart
    [/code]

    Let’s EncryptでブログをHTTPS通信にしてみた

    参考:Let’s Encrypt 総合ポータル

    基本的には上のリンク通りだがメモしておく。
    Apache(RPM) + wordpressの構成

    [code]
    # 実行ファイルを置く場所 ※今回は/usr/bin

    cd /usr/bin

    # リポジトリ取得
    git clone https://github.com/certbot/certbot

    # インストール&設定 ※ 事前に80/tcpを落としておく
    cd certbot
    /usr/bin/certbot-auto certonly -a standalone -m メールアドレス -d www.jhhk-family.net –agree-tos –no-bootstrap

    # ssl.conf修正
    # 事前にssl.confを設定してたとして、Let’s Encryptに上書きされるので、もう一度修正。
    vim /etc/httpd/conf.d/ssl.conf
    <VirtualHost _default_:443>
    DocumentRoot "/var/www/wordpress"
    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    LogLevel warn

    <Directory "/var/www/wordpress/">
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
    </Directory>
    </vertualhost>

    # 最後にDocumentRoot直下の.htaccessに、rewriteの設定を追加し、HTTP接続をHTTPSにリダイレクトする

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off # 追加
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] # 追加
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    [/code]

    Let’s Encryptの有効期限が3ヶ月なので、crontagで毎月更新している人が多い。

    00 16 * * 2 root /usr/bin/certbot-auto renew –post-hook “service httod restart”

    Elastic CacheにAWS外からアクセスする

    基本的にはAWS 外部からの ElastiCache リソースへのアクセスの通り。

    Elastic CacheにはAWS以外からのアクセスが出来ないので、
    インターネット-[Elastic IP]–[EC2]–[Elastic Cache]
    みたいに、中間にEC2インスタンスを噛ます必要がある。

    EC2は、PREROUTINGしかt1.microインスタンスでも十分じゃないかな

    [code]
    #中間のEC2上で

    iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 6379 -j DNAT –to ElasticCacheのIP:6379
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables-save

    #/etc/sysctl.conf
    net.ipv4.ip_forward = 1

    sysctl -a
    [/code]

    grafanaを試してみた

    CloudwatchをGrafana+Graphiteで見るようにしたら幸せになった件を見たらカッコよかったので試してみた

    AWS上にt1.nanoインスタンス(Amazon Linux)を作成し、ここにgrafanaを入れてみる。

    Redhat系とはいえ、初めてAmazon Linuxも触ったのでOSの設定も少し入っています。

    まずはawscliをインストールする。

    pythonのバージョンを確認したら、2.7.10だったので、pipは最初から入っていたが、

    /usr/local/bin/pip にPATHが通って居なかったので、まずはPATHを通します。


    修正が終わったらsource /root/.bash_profileを忘れずに。

    次は、awscliのインストール。


    で、やっとgrafanaのインストール。

    grafanaはRPMで配っていたので、さくっと。


    grafanaを起動する前に、awsのAPIに繋ぐ為の認証情報を設定する。

    awscliの認証ファイルは、~/.aws/に保存されるがgrafanaの場合は/usr/share/grafana/.awsに同じファイルを複製してあげればいい。


    ここまでやって、grafanaを起動。
    初期ポートは3000
    アカウント:admin
    パスワード:admin
    grafana_login.jpg
    ログイン後、左上のアイコンをクリックし、DataSourceを選択。
    CloudWatchを選択し、接続情報を設定する。

    grafana_datasource.jpg

    グラフの表示、並べ替えなどはもう少し勉強してから書きます。
    grafana_grafh.jpg

    #error “Unrecognized SSL Toolkit!”

    apacheのmod_sslを後から追加しようとしたら、こんなエラーに遭遇

    [code]
    # /usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c
    /usr/local/apache-2.2.31/build/libtool –silent –mode=compile gcc -prefer-pic -DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/openssl/include/openssl -c -o mod_ssl.lo mod_ssl.c && touch mod_ssl.slo
    ssl_private.h:60 から include されたファイル中,
    mod_ssl.c:27 から:
    ssl_toolkit_compat.h:267:2: error: #error "Unrecognized SSL Toolkit!"
    In file included from ssl_private.h:86,
    from mod_ssl.c:27:
    ~中略~
    ssl_private.h:644: error: declaration for parameter ‘ssl_init_Child’ but no such parameter
    mod_ssl.c:572: error: expected ‘{‘ at end of input
    apxs:Error: Command failed with rc=65536
    [/code]

    調べたら、そもそもopensslのソースインストールが失敗してた。
    改めて、opensslのインストールをしたけど、こっちもエラーでインストールできない。

    [code]
    make[2]: Entering directory `/usr/local/src/openssl-1.0.2g’
    [ -z "" ] || gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,–noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -Iinclude \
    -DFINGERPRINT_PREMAIN_DSO_LOAD -o fips_premain_dso \
    fips_premain.c fipscanister.o \
    libcrypto.a -ldl -lz
    make[3]: Entering directory `/usr/local/src/openssl-1.0.2g’
    make[4]: Entering directory `/usr/local/src/openssl-1.0.2g’
    /usr/bin/ld: libcrypto.a(rsaz_exp.o): relocation R_X86_64_32 against `.rodata’ can not be used when making a shared object; recompile with -fPIC
    libcrypto.a(rsaz_exp.o): could not read symbols: Bad value
    collect2: ld returned 1 exit status
    make[4]: *** [link_a.gnu] Error 1
    make[4]: Leaving directory `/usr/local/src/openssl-1.0.2g’
    make[3]: *** [do_linux-shared] Error 2
    make[3]: Leaving directory `/usr/local/src/openssl-1.0.2g’
    make[2]: *** [libcrypto.so.1.0.0] Error 2
    make[2]: Leaving directory `/usr/local/src/openssl-1.0.2g’
    make[1]: *** [shared] エラー 2
    make[1]: ディレクトリ `/usr/local/src/openssl-1.0.2g/crypto’ から出ます
    make: *** [build_crypto] エラー 1
    [/code]

    このエラーを解決するには、configオプションに、-fPICを付けてあげる
    [code]
    ./config -fPIC –prefix=/usr/local/openssl-1.0.2g shared zlib
    make
    make install
    [/code]

    で、もう一度「/usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c」を実行したけど、まだ同じエラーが出る。
    ldconfigは実行済みなのに・・・

    再度ググって、こちらのページを見つけた。元RX-7乗りの適当な日々
    同じことやったら通った!
    [code]
    /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto -lssl
    [/code]

    mysqld.sockが作成出来ない

    mysqld.sockの場所をRPM標準の/var/lib/mysql/mysqld.sockから/tmp/mysqld.sockに変更したらmysqlが起動しなくなった件

    /var/log/mysqld.logを見ると、
    [code]
    2016-04-27 19:04:34 19904 [ERROR] Can’t start server : Bind on unix socket: Permission denied
    2016-04-27 19:04:34 19904 [ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?
    2016-04-27 19:04:34 19904 [ERROR] Aborting
    [/code]が記録されていた。

    Permission denied?
    /tmpディレクトリのパーミッションも777なのに?

    su -c “touch /tmp/mysql” mysql
    でファイル作れるよ?

    調べた結果、/var/log/audit/audit.logに以下のログを発見。
    原因はselinuxだった。

    [code]
    type=AVC msg=audit(1461749417.909:7600470): avc: denied { module_request } for pid=22742 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
    type=SYSCALL msg=audit(1461749417.909:7600470): arch=c000003e syscall=41 success=no exit=-97 a0=a a1=1 a2=0 a3=7fff608ad190 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
    type=AVC msg=audit(1461749417.911:7600471): avc: denied { create } for pid=22742 comm="mysqld" name="mysql.sock" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
    type=SYSCALL msg=audit(1461749417.911:7600471): arch=c000003e syscall=49 success=no exit=-13 a0=c a1=7fff608ad1e0 a2=6e a3=0 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
    type=AVC msg=audit(1461749433.190:7600472): avc: denied { module_request } for pid=24545 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
    [/code]

    setenforce 0を実行後、mysqldの起動が出来るようになった。

    /etc/sysconfig/selinuxをみると、SELINUX=disabled
    になっているので、誰かが手動で有効にしていたんだろう。

    windows用カスタムインストールメディアを作成する

    サーバーに新規にWindowsをインストールする時、Windows標準のドライバではデバイスを認識しない事がある。

    RAIDカードのドライバが合わなければインストールすら出来ないし、
    インストール出来たとしても、NICドライバが合わなければ、USBメモリ等にドライバを入れておいて後からインストールする等、めんどくさいです。

    Windowsのインストールメディアを元に、
    ・RAIDドライバの追加
    ・NICドライバの追加
    ・Windowsサービスの有効化(SNMPサービスなど)
    を行ったカスタムインストールメディアを作る事が出来たので、素人がハマった箇所をメモします。

    基本的な手順は、
    http://www.vwnet.jp/Windows/WS12R2/AddDriver/AddDriver2ISO.htm
    https://msdn.microsoft.com/ja-jp/library/hh825099.aspx
    などを見て下さい。

    作った環境は以下になります。
    クライアント: Windows 10
    メディア  : Windows Server 2008 R2
    サーバー  : DELL PowerEdge R720
    RAIDカード : PERC H710P Mini
    ネットワーク: Intel(R) 10G 2P X520 Adapter 、Intel(R) GbE 4P I350-t rNDC

    ハマった箇所(1)ドライバファイルの在り処
    DELLのドライバは、実行ファイル形式(exe)で提供されています。
    そのままでは追加が出来ないので、ドライバーファイルだけに抜き出します。

    http://www.dell.com/support/home/jp/ja/jpdhs1/Drivers/DriversDetails?driverId=XYPYC&fileId=3481042880&osCode=WS8R2&productCode=poweredge-r720&languageCode=jp&categoryId=SF


    http://www.dell.com/support/home/us/en/19/Drivers/DriversDetails?driverId=W205T
    からドライバファイルをダウンロードし解凍します。※Windows標準機能で解凍できました。

    << RAIDカード >>
    SAS-RAID_Driver_XYPYC_WN64_6.803.21.00_A07.EXEを解凍します。
    解凍後、SAS-RAID_Driver_XYPYC_WN64_6.803.21.00_A07\payload\にドライバーファイルがあります。

    << ネットワークカード >>
    SAS-RAID_Firmware_F9M2Y_WN64_21.3.2-0005_A07.EXEを解凍します。
    解凍されたフォルダを見ると、Winx64.pkgというファイルがあるので、これも解凍します。
    解凍後、Network_Driver_W205T_WN64_17.0.0_A00\Winx64\Winx64にドライバー群があります。
    今回のネットワークカードに必要なドライバーは、PRO1000とPROXGBの2つになります。

    ハマった箇所(2) boot.wim と install.wim
    各サイトを流し読みしていて気付くのが遅れてしまい、無駄に時間を使ってしまったので。
    細かいとこは分かりませんが、以下の認識で間違っていないと思う。
    boot.wim   ・・・ RAIDカードなどのWindowsのインストールに必須のドライバーを追加
    install.wim ・・・ ネットワークカードなど、後からでもいいドライバーの追加、Windows機能のデフォルト値変更、レジストリ変更もここ

    indexを適切に指定しないと間違った場所にドライバを追加してしまう事になる為、
    必ず
    Dism /Get-WimInfo /WimFile:”インストールメディアのPATH\sources\boot.wim”
    Dism /Get-WimInfo /WimFile:”インストールメディアのPATH\sources\install.wim”
    を実行して、indexを確認してください。

    レジストリ変更と、アプリケーション追加は試していないので、試したら追記します。

    続きを読む windows用カスタムインストールメディアを作成する

    javeって何よ?

    29日の18:00ぐらいから、CentOS7のVPSサーバーに繋がらなくなった。
    再起動しても、5分ぐらい経つとSSHでの接続もタイムアウトになる。

    プロセスを見てみると、/tmp/javeってのがCPUリソース食いまくってるのみたい。

    [root@jhhk-family bin]# ps -auxf
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    (中略)
    root 513 67.8 0.0 107076 1064 ? Ssl 18:46 2:52 /tmp/jave

    netstatはこんな感じ

    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
    cp 0 55 182.163.72.51:59867 23.228.105.6:25000 ESTABLISHED 17759/jave on (0.20/0/0)

    pkillしても、すぐに上がってくるからKernel関係のプロセス?と思ったけど、ググッてもそんな情報無いし、とりあえず止めてもサービスには影響は無かったのでcrondで毎分pkill投げてる。


    botとかで踏まれてる可能性もあるから、iptablesは固くした。
    時間見てちゃんと調べよう。

    14:27追記
    以下の事をやられていたので、追加で対策。
    1)/root/.ssh/の公開鍵のtimestampが変わっている
      作業用でrootログインを許可して鍵認証していたけど、authorized_keyの
    timestampが昨日になっていた。
    SSHのログインを禁止して、authorized_keyを削除

    2)/tmp/色々のパーミッション変更
    不正な実行ファイルは/tmp/javeだけど、/tmp下に関連しそうなファイルがあった。
      ———- 1 root root 73 12月 30 13:36 conf.n
    ———- 1 root root 5 12月 30 13:36 gates.lod
    ———- 1 root root 1223123 12月 30 14:32 jave
    ———- 1 root root 5 12月 30 13:36 moni.lod
    javeと同様、単純に消しちゃうと再作成された為、全てのパーミッションを取り除く。
    ※ 上記の不正なファイル関連は、ファイルの存在のみ見ているみたいだったので、
    パーミッション変更後にpkill /tmp/javeとすると、2度とjaveは起動しなくなった。

    でも、root取られていたので他にも悪さしている箇所があるかも。
    ログも信用出来なくなったので、年明けに再構築しないと、、、

      

    redisデータベースの複製

    rdbファイルの複製ではなく、db10 → db18とかに複製する方法。

    [code]source_host=localhost
    source_port=xxxx
    source_db=10
    target_host=localhost
    target_port=xxxx
    target_db=18
    redis-cli -p $source_port -n $source_db keys \* | while read key; do echo "Copying $key"; \
    redis-cli –raw -h $source_host -p $source_port -n $source_db DUMP "$key" | \
    head -c -1|redis-cli -x -h $target_host -p $target_port -n $target_db RESTORE "$key" 0; done
    [/code]

    openstackで固定IPアドレスを振る

    openstackのネットワークを管理するneutronについて
    色んなサイトで「仮想ホストにDHCPでIPアドレスを割り当て、floatingIPを振って外部に公開する~」みたいな情報は見たけど、
    実運用だとサーバーに固定でIPアドレスを振りたい。

    10.0.0.1 ・・・ 仮想L3ゲートウェイ
    10.0.0.2 ・・・ 仮想DHCP、DNS
    10.0.0.3 ・・・ 仮想WEBサーバ(1)
    10.0.0.4 ・・・ 仮想DBサーバ(1)
    10.0.0.5 ・・・ 仮想DBサーバ(2)
    10.0.0.6 ・・・ 仮想WEBサーバ(2)
    とか、気持ち的に嫌なので。

    仮想サーバーの/etc/sysconfig/network-scripts/ifcfg-eht0とかに直接IPアドレスを書いても、
    neutronでネットワークポート(それにIPアドレスが紐づく)を管理してる為、残念ながらこのやり方では認識されない。

    数時間調べて、コマンド的には以下で変更出来た。
    [bash]
    #DHCPで割り当てられたネットワークポートの削除
    #仮想サブネット上でDHCPが無い場合は、この手順は不要
    nova interface-detach 仮想ホスト名 Port ID

    #ポートを作る
    neutron port-create ネットワーク名 –fixed-ip ip_address=xxx.xxx.xxx.xxx

    #作ったポートを、仮想ホストに割り当てる
    nova interface-attach –port-id ポートID 仮想ホスト名
    [/bash]

    ただ、この状態だと対象の仮想サーバーに、新規にネットワークインターフェースが追加されることになるので、
    /etc/udev/rules.d/70-persistent-net.rulesを修正する必要がある。