このブログを検索

2013-10-19

CentOSにruby1.8を入れる

CentOS6.3(6.2?)にruby1.8を入れる際に躓いたのでメモ
rpm -i の際に他にもオプションがいるっぽい

# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p374.tar.gz
# tar zxvf ruby-1.8.7-p374.tar.gz
# cd ruby-1.8.7-p374
# ./configure
# make
# checkinstall --fstrans=no
# rpm -ivh --nodeps --nomd5 /root/rpmbuild/RPMS/i386/ruby-1.8.7-p374-1.i386.rpm
※普通にrpm -i とやるとフォルダが不足してるようなエラーが出るので無視
※無視以外の方法もネットにあるけどそれやるとrubyコマンドでセグメンテーション違反とでる

# vim /etc/profile
Make the section with pathmunge look alike like this:
2行追記(あんま意味わかってない)
--------------------------------------------------------------------------------
#Path manupulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /usr/local/bin # ADDED THIS
else
pathmunge /usr/local/bin after # ADDED THIS
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin
fi
--------------------------------------------------------------------------------
# source /etc/profile


RPMパッケージを作成する方法

Linuxでソースからビルドする必要があるアプリケーション。
パッケージ管理ツールで管理できないので不便です。
そこで試しにrubyをパッケージ化する方法をメモします。
全てのアプリケーションはできないと思いますが、ちゃんとしたアプリケーションなら恐らく対応できるんじゃないかと思います。
(要件をちゃんとしらべてません)

環境はCentOS6.3(6.2?)だったはず。

# yum install -y make gcc wget gettext
# yum install -y zlib-devel curl-devel openssl-devel httpd-devel apr-devel apr-util-devel mysql-devel ncurses-devel gdbm-devel readline-devel sqlite-devel

checkinstallのインストール
# mkdir -p /root/rpmbuild/SOURCES
# yum -y install git gcc rpm-build
# cd /usr/local/src
# git clone http://checkinstall.izto.org/checkinstall.git/
# cd checkinstall
# make && make install
# checkinstall

デフォルトのまま進んでいく。
RPMかどうか選ぶところではRPMを選ぶ。

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm

# ls -l /etc/yum.repos.d/epel* /etc/yum.repos.d/remi.repo
とやって

/etc/yum.repos.d/epel.repo
/etc/yum.repos.d/epel-testing.repo
/etc/yum.repos.d/remi.repo
が出れば成功

参考:
http://www.google.com/url?q=http%3A%2F%2Ftnakamura.hatenablog.com%2Fentry%2F20120226%2Finstall_the_ruby_to_centos&sa=D&sntz=1&usg=AFQjCNH2he-ba_1g2c4_wGB9iphMiYMj6w


おまけ ソースからインストールした場合に単純にファイルを削除する方法
# cd /usr/local/src/ruby-1.9.1-p429
# cat .installed.list | xargs rm


お名前.comレンタルサーバーにRedmine2.3を入れる

最初、さくらレンタルに入れようとしていたRedmine。
root権限がある環境でやった方が確実で速い、そしてそうじゃないとまともに動かないということに気づいたので
お名前.comレンタルサーバー VPS(KVM)に入れてみました。
注意点はrubyを入れる際にrbenvだと普通はroot権限用になってしまうことくらいでしょうか。
環境による不都合はほぼありませんでした。

Redmine/Mercurial/SSL証明書を入れていきます。
[コントロールパネル操作]
■OSインストール
VPSコントロールパネルに繋ぐ
OS再インストール CentOS6.2を選択
SSH Private Keyと公式ヘルプを用い、SSH接続で接続できるようにする


[SSH]
■OSセットアップ
・yum高速化
# yum -y install yum-fastestmirror
# yum update

・vim入れる
# yum -y install vim

・locate入れる
# yum -y install mlocate
# updatedb

・firewall設定
※詳しくないので参考までに
# vim /etc/sysconfig/iptables
--------------------------------------------------------------------------------------
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

#既にconnectionが張られている通信を許可,TCPの接続開始と応答、FTPデータなどを許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#icmp(ping) 許可
-A INPUT -p icmp -j ACCEPT
#ローカルホストの入力許可
-A INPUT -i lo -j ACCEPT

# FRAGMENT DROP ###
-A INPUT -f -j LOG --log-level debug --log-prefix 'FRAGMENT-DROP:'
-A INPUT -f -j DROP
#### PING OF DEATH ###
-N PINGOFDEATH
-A PINGOFDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
-A PINGOFDEATH -j LOG --log-level debug --log-prefix 'PINGDEATH-DROP:'
-A PINGOFDEATH -j DROP
-A INPUT -p icmp --icmp-type echo-request -j PINGOFDEATH
#### BROAD MULTI DROP ###
-A INPUT -d 255.255.255.255 -j DROP
-A INPUT -d 224.0.0.1 -j DROP
#### 113IDENT ###
-A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
#### SYNFLOOD ###
-N drop_synflood
-A drop_synflood -m limit --limit 10/s --limit-burst 20 -j RETURN
-A drop_synflood -j LOG --log-prefix "SYNFLOOD: " -m limit --limit 1/s --limit-burst 10
-A drop_synflood -j DROP
-A INPUT -p tcp --syn -j drop_synflood

#SSH許可
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

#Web許可
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 3000 -j ACCEPT
#FTP許可
#-A INPUT -p tcp --dport 20 -j ACCEPT
#-A INPUT -p tcp --dport 21 -j ACCEPT
#-A INPUT -p tcp --dport 4000:4029 -j ACCEPT
#MAIL許可
#-A INPUT -p tcp --dport 25 -j ACCEPT
#-A INPUT -p tcp --dport 465 -j ACCEPT
#-A INPUT -p tcp --dport 110 -j ACCEPT
#-A INPUT -p tcp --dport 995 -j ACCEPT
#-A INPUT -p tcp --dport 143 -j ACCEPT
#-A INPUT -p tcp --dport 993 -j ACCEPT

#先に許可したポート以外全て不許可にする
#デフォルトであったけどDROPに変えたいのでコメントアウト
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

#LOGGING
-A INPUT -m limit --limit 1/s -j LOG --log-level debug --log-prefix 'INPUT-DROP:'
-A INPUT -j DROP
-A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix 'FORWARD-DROP:'
-A FORWARD -j DROP

COMMIT
--------------------------------------------------------------------------------------
# /etc/init.d/iptables restart

・ログ出力設定
# vim /etc/rsyslog.conf
コメントされているkern.*の下あたりにでも追記
--------------------------------------------------------------------------------------
kern.debug /var/log/iptables.log
--------------------------------------------------------------------------------------
※iptables専用ではないけどkern.debugには他のログがこないからこれでいいらしい

・ファイル作成
# touch /var/log/iptables.log
# chmod 600 /var/log/iptables.log

・ローテート設定
# vim /etc/logrotate.d/syslog
{ の上あたりに追記
--------------------------------------------------------------------------------------
/var/log/iptables.log
--------------------------------------------------------------------------------------

参考:
http://www.rapidsite.jp/support/manual/rv_custom/e_4210.html
http://kazmax.zpp.jp/cmd/i/iptables.8.html
http://arisonsvr.org/web/maincontents/serverset/iptables/iptable.html
http://www3.big.or.jp/~sian/linux/tips/iptables.html
http://kensuke.jp/~kensuke/pukiwiki/index.php?debian%2Fns%2Fiptables
http://vok.paburica.com/index.php?iptables%2FSYN%20Flood%E5%AF%BE%E7%AD%96%E3%82%92%E3%81%97%E3%81%9F%E3%81%84


・作業ディレクトリ作る
# mkdir ~/tmp

・必要なパッケージを導入
基本的なもの
# yum install -y make gcc wget gettext-devel
rubyやredmineに必要っぽいもの
# yum install -y zlib-devel curl-devel openssl-devel httpd-devel apr-devel apr-util-devel mysql-devel ncurses-devel gdbm-devel readline-devel sqlite-devel
gitに必要っぽいもの
# yum install -y expat-devel perl-ExtUtils-MakeMaker.x86_64

・gitインストール
# cd ~/tmp
# wget --no-check-certificate https://git-core.googlecode.com/files/git-1.8.4.1.tar.gz
# tar zxvf git-1.8.4.1.tar.gz
# cd git-1.8.4.1
# ./configure
# make && make install
# git version


■rubyインストール
ポイントはrootユーザだけでなくPassengerユーザ(apacheやredmineユーザ)が使うので
システム共有な場所にインストールする必要がある
また、Passengerは祖先に渡って全てのディレクトリに読込と実行権限が必要
よって/usr/local内にインストールする

・rbenv+ruby-buildのインストール
# echo 'export RBENV_ROOT="/usr/local/rbenv"' >> ~/.bashrc
# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> ~/.bashrc
# source ~/.bashrc
# git clone https://github.com/sstephenson/rbenv.git ${RBENV_ROOT}
# mkdir ${RBENV_ROOT}/plugins
# git clone https://github.com/sstephenson/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build
# echo 'eval "$(rbenv init -)"' >> ~/.bashrc
# source ~/.bashrc
# rbenv --version
--------------------------------------------------------------------------------------
rbenv 0.4.0-67-g3300587
--------------------------------------------------------------------------------------
※この設定だと他ユーザがデフォルトでは使えないはずなので留意

・ruby2.0.0のインストール
使えるrubyバージョン確認
# rbenv install -l
rubyをインストール
# rbenv install 2.0.0-p247
パスを通す
# rbenv rehash
インストールしたバージョンを有効にする
# rbenv global 2.0.0-p247
# ruby -v
--------------------------------------------------------------------------------------
ruby 2.0.0p247
--------------------------------------------------------------------------------------

・rubygemsインストール
# rbenv exec gem install rubygems-update
# rbenv rehash
# update_rubygems
参考:
http://docs.rubygems.org/read/chapter/3#page83

・bundlerインストール
# rbenv exec gem install bundler --no-ri --no-rdoc
# rbenv rehash


■mysqlインストール
[SSH]
・サーバーインストール
# yum -y install mysql-server
# chkconfig mysqld on
# vim /etc/my.cnf
追記:
--------------------------------------------------------------------------------------
[mysqld]
character-set-server = utf8
[mysql]
default-character-set = utf8
--------------------------------------------------------------------------------------
# service mysqld restart

# mysqladmin -u root password DBパスワード
# /usr/bin/mysql_secure_installation
--------------------------------------------------------------------------------------
Change the root password? : n
Remove anonymous users? : Y
Disallow root login remotely? : Y
Remove test database and access to it? : n
Reload privilege tables now? : Y
--------------------------------------------------------------------------------------

・redmine用DB作成
# mysql -u root -p
--------------------------------------------------------------------------------------
> create database redmine character set utf8;
> create user 'redmine'@'localhost' identified by 'DBパスワード';
> grant all privileges on redmine.* to 'redmine'@'localhost';
> \q
--------------------------------------------------------------------------------------

■redmineインストール
ここもPassengerが全てのディレクトリに権限がある場所に入れる必要がある
今回は/var/www配下におく
# cd ~/tmp
# wget http://rubyforge.org/frs/download.php/77138/redmine-2.3.3.tar.gz
# tar zxvf redmine-2.3.3.tar.gz
# mv redmine-2.3.3 /var/www/redmine
# cd /var/www/redmine
# mkdir -p tmp tmp/pdf public/plugin_assets
# chmod -R 755 files log tmp public/plugin_assets
# cd /var/www/redmine/config
# cp -p database.yml.example database.yml
# vim database.yml
Change it to look like:
--------------------------------------------------------------------------------------
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "DBパスワード"
encoding: utf8
--------------------------------------------------------------------------------------

# cd /var/www/redmine

・Gemfileにpassengerを追加
# vim Gemfile
sourceの下に追記:
--------------------------------------------------------------------------------------
gem "passenger"
--------------------------------------------------------------------------------------

・gemをインストールする(ディレクトリ配下に)
# yum -y install gcc-c++ ImageMagick-devel libxml2-devel libxslt-devel
# bundle install --path vendor/bundle

・rails動作確認
# bundle exec rails -v
--------------------------------------------------------------------------------------
Rails 3.2.13
--------------------------------------------------------------------------------------

# bundle exec rake generate_secret_token
# RAILS_ENV=production bundle exec rake db:migrate
# RAILS_ENV=production bundle exec rake redmine:load_default_data
--------------------------------------------------------------------------------------
Select Language: ja
--------------------------------------------------------------------------------------

・動作確認(WEBrick)
# bundle exec rails server -e production
>> http://IPアドレス:3000/
Redmineの初期アカウントはadmin:admin

・設定ファイルを用意
# cd /var/www/rails/redmine/config
# cp -p configuration.yml.example configuration.yml

・実行モードをproduction固定
# vim /var/www/rails/redmine/config/boot.rb
末尾に追記:
--------------------------------------------------------------------------------------
ENV['RAILS_ENV'] ||= 'production'
--------------------------------------------------------------------------------------

・再確認
# cd /var/www/redmine
# bundle exec rails server
>> http://IPアドレス:3000/

参考:
http://www.redmine.org/projects/redmine/wiki/RedmineInstall
http://www.redmine.org/projects/redmine/wiki/Redmine_on_CentOS_installation_HOWTO
http://www.sdmemo.com/wiki/Redmine%E3%81%AE%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86


■apache+passengerセットアップ
passengerはroot権限では動作しない
実行ユーザはredmine/config.ru(場合によってはconfig/environment.rb)のオーナーとなる
今回はredmineユーザーで動作させる
# adduser redmine
# passwd redmine
ユーザパスワード
# chown -R redmine:redmine /var/www/redmine

・passengerモジュールのインストール
# bundle exec passenger-install-apache2-module
# bundle exec passenger-install-apache2-module --snippet
apacheの設定に使う文字列が表示されるのでコピーする:
--------------------------------------------------------------------------------------
LoadModule passenger_module /var/www/redmine/vendor/bundle/ruby/2.0.0/gems/passenger-4.0.20/buildout/apache2/mod_passenger.so
PassengerRoot /var/www/redmine/vendor/bundle/ruby/2.0.0/gems/passenger-4.0.20
PassengerDefaultRuby /usr/local/rbenv/versions/2.0.0-p247/bin/ruby
--------------------------------------------------------------------------------------

・passenger設定ファイルを作成
# vim /etc/httpd/conf.d/passenger.conf
以下の内容で新規作成する
基本設定のところはsnippetで得られた文字列で置き換える:
--------------------------------------------------------------------------------------
# Passengerの基本設定
LoadModule passenger_module /var/www/redmine/vendor/bundle/ruby/2.0.0/gems/passenger-4.0.20/buildout/apache2/mod_passenger.so
PassengerRoot /var/www/redmine/vendor/bundle/ruby/2.0.0/gems/passenger-4.0.20
PassengerDefaultRuby /usr/local/rbenv/versions/2.0.0-p247/bin/ruby

# Passengerが追加するHTTPヘッダを削除するための設定
Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"

# 必要に応じてPassengerのチューニングのための設定を追加
PassengerMaxPoolSize 6
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
RailsSpawnMethod smart
RailsAppSpawnerIdleTime 0
PassengerMaxPreloaderIdleTime 0
--------------------------------------------------------------------------------------

・文法チェック
# apachectl configtest
--------------------------------------------------------------------------------------
Syntax OK
--------------------------------------------------------------------------------------

・とりあえずredmine関係なくapacheの動作確認
# /etc/init.d/httpd restart
>> http://IPアドレス/

参考:
http://morizyun.github.io/blog/passenger-install-apache-ruby-rails/

メモ:
祖先にわたってすべてのディレクトリにapacheユーザの読み込みと実行権限が必要
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_deploying_to_a_virtual_host_8217_s_root
all parent folders. That is, /webapps/mycook and /webapps must also be readable and executable by Apache.
メモ:
passengerは仮想ホストかシンボリックリンクを使うべきで、
仮想ディレクトリだとうまく動かない模様

・redmineをSUB-URIで実行する(シンボリックリンクを用いる)
※但し今回の設定だとpassengerはSUB-URIで動作するがWEBrickはルートディレクトリで動作する
 どちらも同じSUB-URIにする方法はわからなかった
# ln -s /var/www/redmine/public /var/www/html/redmine
# vim /etc/httpd/conf/httpd.conf
DocumentRoot(/var/www/html)の下あたりに追記
--------------------------------------------------------------------------------------
#Redmine
RackBaseURI /redmine
<Directory /var/www/redmine/public>
AllowOverride All
Order allow,deny
Allow from all
</Directory>
--------------------------------------------------------------------------------------

# cd /var/www/redmine
# vim config/boot.rb
末尾に追記
--------------------------------------------------------------------------------------
ENV['RAILS_RELATIVE_URL_ROOT'] = '/redmine'
--------------------------------------------------------------------------------------
WEBrickで実行する際はconfig.ruにmapを追記する必要あるが、それだとpassengerが誤動作する
この状態でWEBrickで実行するとSUB-URIではない状態で実行される

動作確認
# /etc/init.d/httpd restart
>> http://IPアドレス/redmine

・redmineセットアップ
[redmine]
adminでログイン パスワードadmin
個人設定からパスワードを変更する
管理->情報からすべてにチェックマークがついていることを確認する


[SSH]
■Mercurialインストール
# cd ~/tmp
Mercurial用ユーザを作成(今回は使わないけどMercurialをWEBで動作させる際には必要のはず)
# useradd -m mercurial
# passwd mercurial
ユーザパスワード

・Mercurialをeasy_install経由でインストール
# yum -y install python-devel make gcc
# wget http://peak.telecommunity.com/dist/ez_setup.py
# python ez_setup.py
# easy_install -U mercurial
# hg --version

ユーザ情報を設定する
# vim ~/.hgrc
--------------------------------------------------------------------------------------
[ui]
username = admin <redmine@mail.com>
--------------------------------------------------------------------------------------

動作確認
# cd ~/tmp
# mkdir hgtest
# hg init hgtest

Redmine用リポジトリを作る
# cd /var/www
# mkdir hg
# cd hg
# mkdir project01
# hg init project01

・この状態でredmineのプロジェクト設定からリポジトリを連携する
例(リポジトリパス):/home/アカウント名/hg/project01
識別子: 任意
パスのエンコーディング: 空欄


■Mercurialクライアントをインストール
[ローカル]
・TortoiseHgをダウンロードしてインストール
http://mercurial.selenic.com/
・デスクトップ等で右クリック->TortoiseHg->Global Settings
・Commit->Usernameをセット
名前 <メールアドレス>
・Edit File
・[ui]にsshをセット(圧縮オプション等をセット)
--------------------------------------------------------------------------------------
ssh = "C:\Program Files\TortoiseHg\TortoisePlink.exe" -agent -ssh -2 -batch -C
--------------------------------------------------------------------------------------
・Save->OK

・TortoiseHgを公開暗号方式に対応させる
・puttygen(ASE対応)をダウンロードする
※ごった煮版等はASE対応してない
http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe
・実行してLoadからSSH Private Key ファイルを読み込み
・Save privete keyで●●●.ppkとして保存 -> c:\ssh_keys\ に保存したとする
・キー管理ツールのPageant.exeのショートカットを作成する
--------------------------------------------------------------------------------------
"C:\Program Files\TortoiseHg\Pageant.exe" "c:\ssh_keys\●●●.ppk"
--------------------------------------------------------------------------------------

動作確認
・ショートカットを実行する
・デスクトップ等で右クリック->TortoiseHg->Clone
source
--------------------------------------------------------------------------------------
ssh://root@IPアドレス//ssh://var/www/hg/project01
--------------------------------------------------------------------------------------
※必要に応じてユーザアカウントを作る方がよい


■SSL対応(自己証明)
[SSH]
# yum -y install openssl openssl-devel mod_ssl
# cd /etc/pki/tls/certs

・RSA秘密鍵生成
# openssl genrsa -des3 -out private.key 2048
--------------------------------------------------------------------------------------
Enter pass phrase for private.key: パスワード
--------------------------------------------------------------------------------------
・内容確認
# openssl rsa -in private.key -text -noout

・証明書要求(CSR)生成
# openssl req -new -key private.key -out server.csr
--------------------------------------------------------------------------------------
Enter pass phrase for private.key: パスワード
Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]: Minato-ku
Organization Name (eg, company) [Default Company Ltd]: TEST Co., Ltd.
Organizational Unit Name (eg, section) []: TEST
Common Name (eg, your name or your server's hostname) []: IPアドレス
以降、省略(入力不要)
--------------------------------------------------------------------------------------
・内容確認
# openssl req -in server.csr -text -noout

・証明書発行
# openssl x509 -in server.csr -out server.crt -req -signkey private.key -days 365

・権限変更
# chmod 400 private.key server.crt server.csr
・RSA秘密鍵をしかるべき場所へ
# mv /etc/pki/tls/certs/private.key /etc/pki/tls/private/private.key

・apacheにセット
# vim /etc/httpd/conf.d/ssl.conf
コメント解除
--------------------------------------------------------------------------------------
DocumentRoot "/var/www/html"
--------------------------------------------------------------------------------------
変更する
--------------------------------------------------------------------------------------
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/certs/private.key
--------------------------------------------------------------------------------------
</VirtualHost>の上あたりに追記する
--------------------------------------------------------------------------------------
# SSLでも画像やJavaScriptファイルがキャッシュされるように指定
Header onsuccess append Cache-Control publicExpiresActive On
ExpiresByType text/css "access plus 3 days"
ExpiresByType application/x-javascript "access plus 3 days"
ExpiresByType image/jpeg "access plus 3 days"
ExpiresByType image/png "access plus 3 days"
ExpiresByType image/gif "access plus 3 days"
--------------------------------------------------------------------------------------

# /etc/init.d/httpd restart
>> https://IPアドレス/redmine

・動作が確認できたらhttpを閉じる
# vim /etc/httpd/conf/httpd.conf
コメントアウト
--------------------------------------------------------------------------------------
#Listen 80
--------------------------------------------------------------------------------------

・今だとhttpd再起動毎にパスワード聞かれるので省略する
# vim /etc/httpd/conf.d/ssl.conf
変更
--------------------------------------------------------------------------------------
SSLPassPhraseDialog exec:/etc/httpd/certs/pass_phrase.sh
--------------------------------------------------------------------------------------

# mkdir /etc/httpd/certs
# vim /etc/httpd/certs/pass_phrase.sh
--------------------------------------------------------------------------------------
#!/bin/sh
echo "パスワード"
--------------------------------------------------------------------------------------

# chown root:root /etc/httpd/certs/pass_phrase.sh
# chmod 500 /etc/httpd/certs/pass_phrase.sh
・動作確認
# ./pass_phrase.sh
・動作確認
# /etc/init.d/httpd restart

・httpdをサービス化
# chkconfig httpd on

参考:
https://www.verisign.co.jp/ssl/help/csr/capache_new.html
http://d.hatena.ne.jp/mrgoofy33/20110209/1297262978
http://linux.kororo.jp/cont/server/openssl_command.php
http://centossrv.com/apache-ssl.shtml
http://takuya-1st.hatenablog.jp/entry/20110208/1297157015


おまけ
ruby1.8の場合、redmineのdatabase.ymlに記述する adapter: mysql2 は、mysqlになる。

ruby1.8の場合、redmineのGemfileに記述をしないとバージョンエラーになる。
# vim Gemfile
--------------------------------------------------------------------------------------
gem 'nokogiri', '~> 1.5.10' --------------------------------------------------------------------------------------

redmine2.3+ruby1.8の場合に、WEBrick実行時に変な警告が出る。
それを消す方法
# vim /var/www/redmine/lib/redmine/syntax_highlighting.rb
コメントアウト
--------------------------------------------------------------------------------------
#require 'coderay/helpers/file_type' --------------------------------------------------------------------------------------
参考:
http://www.redmine.org/issues/13692



さくらレンタルサーバーにRedmine2.3を入れる

さくらレンタルサーバーのスタンダードプラン(FreeBSD)にRedmine現在最新の2.3.3+ruby2.0.0を入れてみたので手順を公開します。
また、Mercurialもインストールしました。
ネットで調べるとこのRedmine2.3+ruby2.0.0構成で入れている記事は無く、古いRedmineだったり古いrubyだったり。
ただ、結論としては、入るけど遅くて使いものにならない、でした。
1画面遷移10秒とかになります。

原因はWEBサーバーが自由に使えないことにあり、
さくらレンタルサーバーではデフォルトでapacheが用意されていますが、
そこを経由するとRailsがアプリケーションとして動作できません。
で、汎用的なCGIモードというので動作させると遅い、という結果になります。
また、Railsをアプリケーションとして動作させる独自サーバープロセスを立ち上げることもできるのですが、
そうすると数分でシステムからKillされてしまいます。
どうもさくらレンタルでは常駐型のプロセスを許してなかったり、負荷や常駐時間の閾値を超えるとKillされたりがあるようです。
よって、Redmineを入れたければさくらレンタルで頑張るよりは、最初からさくらVPS他のサービスを契約したほうが良いです。

ポイント
・root権限ないのでパッケージインストール等は全てHOME上に行う
・WEBサーバーはサービス側で用意されているapacheを用いる
 apache側に設定が必要なアプリは使えない
・RedmineはCGIモード(?)で動作させる
・いくつかのパッケージのビルドにはgmakeを使う

では手順です。
※お古の環境のためもしかしたら他にもパッケージインストールが必要かもしれません
※思考錯誤したままなのでおかしな手順があるかもしれません

■シェルをbashに変更
FreeBSDはcshというシェルらしいけど、不慣れなのと世の情報は大抵bashのためbashに変更する。
$ cat /etc/shells
$ chsh -s /usr/local/bin/bash
$ cd
$ vi .bash_profile
--------------------------------------------------------------------------------
if [ -f $HOME/.bashrc ]; then
source $HOME/.bashrc
fi
--------------------------------------------------------------------------------
$ vi .bashrc
--------------------------------------------------------------------------------
PATH=$HOME/local/bin:$PATH
export LANG=ja_JP.UTF-8
--------------------------------------------------------------------------------

この状態でいったんログオフ再ログイン
$ exit

参考:
http://blog.smileeeen.com/2010/06/sakura/bash/


■vimインストール
エディタとして今回はvimを入れる
$ cd ~/tmp
$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
$ tar jxvf vim-7.4.tar.bz2
$ cd vim74
$ mkdir patches
$ cd ./patches
$ curl -O 'ftp://ftp.vim.org/pub/vim/patches/7.4/7.4.[001-052]'
$ cd ..
$ cat patches/7.4.* | patch -p0
$ ./configure --enable-multibyte --enable-xim --enable-fontset --with-features=big --prefix=$HOME/local
$ make && make install
キー操作がなんかおかしいのに対応
$ cat << EOF >> .vimrc
--------------------------------------------------------------------------------
set nocompatible
EOF
--------------------------------------------------------------------------------


■gitインストール
$ cd ~/tmp
$ wget --no-check-certificate https://git-core.googlecode.com/files/git-1.8.4.1.tar.gz
$ tar zxvf git-1.8.4.1.tar.gz
$ cd git-1.8.4.1.tar.gz
$ ./configure --prefix=$HOME --enable-pthreads=-pthread --with-curl=/usr/local
$ gmake && gmake install
$ git version
※makeじゃだめらしい
※もしgitがコマンドエラーになった場合はログインしなおせばいける
参考:
http://www.machu.jp/diary/20130622.html#p01


■rbenv+ruby-buildインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ mkdir ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ rbenv --version
--------------------------------------------------------------------------------
rbenv 0.4.0-67-g3300587
--------------------------------------------------------------------------------

■ruby2インストール
$ echo 'export TMPDIR="$HOME/tmp"' >> ~/.bashrc
※/var/tmp が noexec に設定されているための処置

$ source ~/.bashrc
一時的にmakeをgmakeとする
$ export MAKE="gmake"

使えるrubyバージョン確認
$ rbenv install -l

rubyをインストール
$ CONFIGURE_OPTS="--with-openssl-dir=/usr/local --with-readline-dir=/usr/local --with-iconv-dir=/usr/local" rbenv install 2.0.0-p247
パスを通す
$ rbenv rehash
インストールしたバージョンを有効にする
$ rbenv global 2.0.0-p247
$ ruby -v
--------------------------------------------------------------------------------
ruby 2.0.0p247
--------------------------------------------------------------------------------

MAKEを戻すためにログオフ再ログイン
$ exit

rubygemsをアップデート
$ rbenv exec gem install rubygems-update
$ rbenv rehash
$ update_rubygems

bundlerインストール
$ rbenv exec gem install bundler --no-ri --no-rdoc
$ rbenv rehash


■mysqlセットアップ
[コントロールパネルで操作]
--------------------------------------------------------------------------------
[mysqld]
character-set-server = utf8
[mysql]
default-character-set = utf8
--------------------------------------------------------------------------------
相当の設定をする
※おそらくデフォルト値なので何もしない

--------------------------------------------------------------------------------
> create database redmine character set utf8;
--------------------------------------------------------------------------------
相当の設定をする
実際は アカウント名_DB名 になる

ユーザーや権限設定は不要(アカウント名固定)



■redmineのインストール

$ cd
$ mkdir rails
$ cd rails
$ wget http://rubyforge.org/frs/download.php/77138/redmine-2.3.3.tar.gz
$ tar zxvf redmine-2.3.3.tar.gz
$ mv redmine-2.3.3 redmine
$ cd redmine
$ mkdir -p tmp tmp/pdf public/plugin_assets
$ chmod -R 757 files log tmp public/plugin_assets
$ cd ~/rails/redmine/config
$ cp database.yml.example database.yml
$ vim database.yml
Change it to look like:
--------------------------------------------------------------------------------
production:
adapter: mysql2
database: DBユーザー名_redmine(さくらレンタルだとコントロールパネルから調べる)
host: DBサーバー名(さくらレンタルだとコントロールパネルから調べる)
username: DBユーザー名(さくらレンタルだとコントロールパネルから調べる)
password: "DBパスワード"(さくらレンタルだとコントロールパネルからセットする)
encoding: utf8
--------------------------------------------------------------------------------

$ cd ~/rails/redmine
gemをディレクトリ配下にインストールする
$ bundle install --path vendor/bundle
※Gemfileは最初からある
※make=gmakeを残しているとここでffiがエラーとなるで注意

動作確認
$ bundle exec rails -v

$ bundle exec rake generate_secret_token
$ RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=production bundle exec rake redmine:load_default_data
--------------------------------------------------------------------------------
Select Language: ja
--------------------------------------------------------------------------------

動作確認(WEBrick)
$ bundle exec rails server -e production
http://ドメイン:3000/

設定ファイルを用意
$ cd ~/rails/redmine/config
$ cp -p configuration.yml.example configuration.yml

htaccessファイルを用意(WEBrickでは使われない)
$ cd ~/rails/redmine/public
$ cp -p htaccess.fcgi.example .htaccess
--------------------------------------------------------------------------------
<IfModule mod_fastcgi.c>関連 コメントアウト
<IfModule mod_fcgid.c>関連 コメントアウト
Options +FollowSymLinks +ExecCGI コメントアウト
<IfModule mod_fastcgi.c>関連 コメントアウト
<IfModule mod_fcgid.c>関連 コメントアウト
--------------------------------------------------------------------------------

実行モードをproduction固定
$ vim ~/rails/redmine/config/boot.rb
末尾に追記
--------------------------------------------------------------------------------
ENV['RAILS_ENV'] ||= 'production'
--------------------------------------------------------------------------------

再確認
$ bundle exec rails server
http://ドメイン:3000/

参考:
http://www.redmine.org/projects/redmine/wiki/RedmineInstall
http://www.machu.jp/diary/20130622.html#p01
http://t100life.blog121.fc2.com/blog-entry-148.html
http://manablog.eek.jp/linux/install_redmine_to_sakura/
http://tmpz84.blogspot.jp/2011/07/rails-3.html



■redmineをさくらレンタルのapacheで動作させる
要点
・さくらレンタルでは常駐型プロセスを認めておらずKillされる可能性が高い
 そこで共有サーバーのapache上でCGIモードで動作させる
 その場合、config.ruが実行されないため、それに相当するdispatch.cgiというのを作ってやる
 さくらではデフォルトでONになってるらしく、指定するとエラーとなるのでしない
・DocumentRoot=/redmine/publicは権限不足で無理そうなのでSUB-URI(http:/ドメイン/redmine)で動作させる
 publicディレクトリを~/www/redmineとしてシンボリックリンクを張る
 この際、SUB-URIは本来はapache設定ファイルで指定するができないため無理繰り対応させる
・apacheユーザは環境変数が異なるため指定してやる必要があるらしい
$ cd ~/rails/redmine
$ ln -s $HOME/rails/redmine/public $HOME/www/redmine

環境変数等をセット
$ vim config/boot.rb
末尾に追記
--------------------------------------------------------------------------------
#ruby lib 関連
$LOAD_PATH.push('/home/アカウント名/.rbenv/versions/2.0.0-p247/lib/ruby/site_ruby/2.0.0')
$LOAD_PATH.push('/home/アカウント名/.rbenv/versions/2.0.0-p247/lib/ruby')

#PATHにさくらアカウントのbinを追加
ENV['PATH'] += ':/home/アカウント名/bin'
ENV['PATH'] += ':/home/アカウント名/local/bin'

#Mercurial用にPython変数指定
ENV['PYTHONPATH'] ||= '/home/アカウント名/lib/python'

#GEM_HOME指定
ENV['GEM_HOME'] ||= '/home/アカウント名/rails/redmine/vendor/bundle/ruby/2.0.0'

#RAILSをSUB-URIに対応
ENV['RAILS_RELATIVE_URL_ROOT'] = '/redmine'
--------------------------------------------------------------------------------

WEBrick用にSUB-URIをセット
$ vim config.ru
runをmapで囲む
--------------------------------------------------------------------------------
map ActionController::Base.config.relative_url_root || "/" do
run RedmineApp::Application
end
--------------------------------------------------------------------------------

確認(画面遷移も確認すること)
$ bundle exec rails server
http://ドメイン名:3000/redmine

htaccessファイルにconfig.ru相当のcgiを呼び出す処理を追記
$ cp -p public/htaccess.fcgi.example public/.htaccess
$ vim public/.htaccess
最初の方に追記
--------------------------------------------------------------------------------
AddHandler cgi-script .cgi
--------------------------------------------------------------------------------

ほかのRewriteRuleが記載されてるあたりに追記
--------------------------------------------------------------------------------
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
--------------------------------------------------------------------------------

fastcgi用dispatch.fcgiを参考にconfig.ru相当のCGIを作る
$ cp -p public/dispatch.fcgi.example public/dispatch.cgi
rubyのパスを変更
--------------------------------------------------------------------------------
#!/home/アカウント名/.rbenv/versions/2.0.0-p247/bin/ruby
--------------------------------------------------------------------------------

call(env)の@app.call(env)直前に以下を追記
SUB-URI(/redmine)を使うとき、本来ならApach設定ファイルのVirtualHostディレクティブの中に
RackBaseURI指定をするらしいがさくらではそれができない
このままだとアプリ内で生成されるURIにSUB-URIがつかないのでSCRIPT_NAMEに入れることで対応
--------------------------------------------------------------------------------
#PATH_INFOからSUB-URIを除去
env['PATH_INFO'] = env['PATH_INFO'].gsub(/\A#{ENV['RAILS_RELATIVE_URL_ROOT']}(.*)\Z/, '\1')
env['SCRIPT_NAME'] = ENV['RAILS_RELATIVE_URL_ROOT']
--------------------------------------------------------------------------------
※試行錯誤してたらたまたまうまくいった方法で、もしかしたら他に不具合出るかも

apacheで確認(画面遷移も確認すること)
http://ドメイン名/redmine

メモ:
rails2.2以前と2.3以降とでRack対応かどうかが異なり、設定が変わる
ネット上にある情報は2.2以前のものが多い

参考:
http://quickhack.net/nom/blog/2012-09-19-rails-with-relative-url-root.html
http://manablog.eek.jp/linux/install_redmine_to_sakura/
http://nyon2.net/archives/ruby-on-rails/
http://zaya3.blog.fc2.com/blog-entry-50.html
http://ascarpediemstyle.com/?p=409
http://takuya-1st.hatenablog.jp/entry/20120108/1326043011
http://t100life.blog121.fc2.com/blog-entry-148.html
http://d.hatena.ne.jp/cimadai/20080923/RubyonRails_on_sakura
http://manablog.eek.jp/linux/install_redmine_to_sakura/



■Mercurialインストール
インストール先を$HOME/localにするとSSH経由コマンドで見つからないぽい
HOME直下に入れること
$ cd ~/tmp
$ wget http://www.selenic.com/mercurial/release/mercurial-2.7.2.tar.gz
$ tar zxvf mercurial-2.7.2.tar.gz
$ cd mercurial-2.7.2
$ python setup.py install --home=$HOME
$ echo 'export PYTHONPATH="$HOME/lib/python"' >> ~/.bashrc
$ source ~/.bashrc
$ hg --version

ユーザー情報登録
$ vim ~/.hgrc
--------------------------------------------------------------------------------
[ui]
username = admin <redmine@mail.com>
--------------------------------------------------------------------------------

試す
$ cd ~/tmp
$ mkdir hgtest
$ hg init hgtest

redmine用にリポジトリ作る
$ cd
$ mkdir hg
$ cd hg
$ mkdir project01
$ hg init project01

この状態でredmineのプロジェクト設定からリポジトリを連携する
例(リポジトリパス):/home/アカウント名/hg/project01

■Mercurialクライアントインストール
HTTP経由にもできるけど今回はSSH経由で
[ローカル操作]
・TortoiseHgをダウンロードしてインストール
http://mercurial.selenic.com/
・デスクトップ等で右クリック->TortoiseHg->Global Settings
・Commit->Usernameをセット
名前 <メールアドレス>
・Edit File
・[ui]にsshをセット(圧縮オプション等をセット)
--------------------------------------------------------------------------------
ssh = "C:\Program Files\TortoiseHg\TortoisePlink.exe" -agent -ssh -2 -batch -C
--------------------------------------------------------------------------------
・Save->OK
・この状態でクローンを試す
・デスクトップ等で右クリック->TortoiseHg->Clone
source
--------------------------------------------------------------------------------
ssh://アカウント名@アカウント名.sakura.ne.jp//home/アカウント名/hg/project01
--------------------------------------------------------------------------------

これでローカルからサーバーに接続可能になる
但しこの状態だと何かする度にパスワードを尋ねられて使い辛いので
以降の操作でSSH認証を公開鍵方式にする


■SSHを公開暗号鍵方式にする
$ ssh-keygen -t dsa
--------------------------------------------------------------------------------
Enter file in which to save the key (/home/アカウント名/.ssh/id_dsa): ※そのままEnter
Enter passphrase (empty for no passphrase): ※パスワード入力
--------------------------------------------------------------------------------
$ cd ~/.ssh
$ mv id_dsa.pub authorized_keys
$ chmod 600 authorized_keys

この手順で元の認証方式と公開鍵方式両方でログインできるようになる


■TortoiseHgを公開暗号方式に対応させる
公開鍵をローカルにもってきてTortoiseHg付属のPageantに登録する
そうすることでクローン等の際に鍵を使ってログインするようになる
但し、毎回改めて鍵を指定してやる必要がある
いくつか方法があるが今回は、ショートカットの引数で渡すようにする
公開鍵は形式変換する必要があり、puttygenで変換する

[SSH]
$ cd ~/.ssh
$ more id_dsa
内容をクリップボードにコピー

[ローカル操作]
・クリップボードの中身をテキストファイルに張り付けて保存
・puttygen(ASE対応版)をダウンロードする
http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe
・実行してLoadから先ほどのテキストファイルを読み込み
・Save privete keyで"○○○.ppk"として保存 -> c:\ssh_keys\に保存
・キー管理ツールのPageant.exeのショートカットを作成する
--------------------------------------------------------------------------------
"C:\Program Files\TortoiseHg\Pageant.exe" "c:\ssh_keys\○○○.ppk"
--------------------------------------------------------------------------------
※今後鍵が増えても都度ショートカット実行すれば、Pageant実行中でもキーが有効になる

クローンを試す
・Pageantショートカットを実行しパスワードを入力する
・その状態で先ほどと同じようにクローンする

参考:
http://d.hatena.ne.jp/NAT_programming/20080504/1209901660
http://0xc000013a.blog96.fc2.com/blog-entry-65.html
http://sh1.2-d.jp/b/2007-10-18-00-05.html
http://www.dodgson.org/omo/t/?date=20070519
http://www.emptypage.jp/notes/pymods-on-sakura.html#ID000301
http://umezo.hatenablog.jp/entry/20080320/1206015911



■SSL対応
[コントロールパネル操作] ・さくらレンタルのドメイン設定から共有SSLをONにする
https://ドメイン名/redmine



以下、没ネタのメモ。

■本来redmine(rails3.2)でSSL接続させるらしい設定
なんかうまくいかなかった
$ vim ~/rails/redmine/config/application.rb
次の場所にconfig.force_sslをセットする
--------------------------------------------------------------------------------
module RedmineApp
class Application < Rails::Application
config.force_ssl = true



--------------------------------------------------------------------------------


■fastcgiインストール
CGIモードながら、キャッシュを駆使して速くするらしい方法
着手し始めたものの、どうもapacheの設定や再起動が必要っぽい気がしたので途中で断念。
一応、これでいいかな?と思える手順を残す。
$ cd ~/tmp
$ wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
$ tar xzvf fcgi-2.4.0.tar.gz
$ cd fcgi-2.4.0
$ ./configure --prefix=$HOME/local CFLAGS="-g -O2 -Wall -fPIC" CXXFLAGS="-g -O2 -Wall -fPIC"
$ make && make install
$ cgi-fcgi
※configureにいろいろオプションつけないとgem installでこける

$ cd ~/rails/redmine
$ bundle exec gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib
※bundle install/updateにオプション付ける機能がないので先に入れる
$ vim Gemfile
適当な場所、sourceの下あたりに追記
--------------------------------------------------------------------------------
gem "fcgi"
--------------------------------------------------------------------------------
$ bundle update

$ vim public/.htaccess
コメントアウト
--------------------------------------------------------------------------------
#Options +FollowSymLinks +ExecCGI
--------------------------------------------------------------------------------

$ cp -p public/dispatch.fcgi.example public/dispatch.fcgi
中身は元の手順と基本同じとする
以下、元の手順との差分
$ vim public dispatch.fcgi
requireの下に追記
--------------------------------------------------------------------------------
require 'rubygems'
require 'fcgi'
--------------------------------------------------------------------------------



2013-07-24

TCHAR型

完全にメモ

http://paken.s1.hayasoft.com/sb/log/eid13.html

TCHAR型のススメ
2007年01月31日 水曜日 | Paken > Iketaki |
C/C++でWindowsプログラミングをやり始めたとき、誰もが一度は嫌になるあの謎のデータ型。
"LPCTSTR"なんてのはその典型例です。
しかし、これが何かを知らぬまま放っておいてる、ということが意外とありがちなんですよね。
というわけで、一応簡単に解説しておくことにしよう、と思ったまでです。
※ C/C++を使った一般的なWindowsプログラミングをする方向けです。
※ 開発環境は、Microsoft Visual C++ 2005 を想定しています。

1.UNICODE
文字コードとはつまり、数値と文字の関係を示したものです。
文字'a'は128で表し、文字'b'は129で表し・・・と文字と数値が一対一で対応して定められています。(数値は適当です)
UNICODEも、その文字コードの一種で、古い文字コードのASCIIに比べて新しいものです。
NT系のWindowsには全て対応しているので、現在のほとんどの環境がUNICODE対応となっています。
だったら、プログラムもUNICODEに対応させた方が良いですね。

2.TCHAR型
C#という新しい言語のchar型はUNICODEですが、C/C++言語では、char型はASCII、古い文字コードです。
C/C++言語でUnicodeの文字を表すにはwchar_t型を使い、VC++ならWCHAR型とtypedefされています。
というわけで、UNICODE対応プログラムを作るにはWCHAR型を使えばOKです。

・・・OKなのですが、実はもっと良い型があります。
TCHAR型です。
こいつは何かというと、ASCIIとUNICODE両方に切り替えることが出来る万能型です。
コンパイラの設定で、UNICODEを使用する設定にすれば、UNICODEを使用し、そうでなければWindows9x系でも動作するASCIIを使用することになります。
非常に簡単に両方に対応しているプログラムが生成できるので、プログラムを作成する際にはTCHAR型をお勧めします。

3.文字または文字列の表し方
TCHAR chara;
chara = 'a';

上のコードは間違いです。なぜでしょうか。
char型で在れば問題ないのですが、ここではTCHAR型を宣言しているため、'a'がchar型だと認識されてしまうのです。
そのため、TCHAR型の文字を表すには、_TマクロまたはTEXTマクロを使用します。

TCHAR chara;
chara = _T('a');
// あるいは
chara = TEXT('a');

文字列の場合でも同じく、_T("PAKEN")、TEXT("PAKEN")、と記述してください。
(ちなみに、WCHAR型の場合は頭にLをつけ、L'a'、L"PAKEN"、などと表します)

4.謎のデータ型LPCTSTR
さて、char、WCHAR、TCHARの違いがわかったところで、一気に文字列を表すデータ型を見てみましょう。

LPSTR = char*
LPCSTR = const char*
LPWSTR = WCHAR*
LPCWSTR = const WCHAR*
LPTSTR = TCHAR*
LPCTSTR = const TCHAR*

お分かりですね。
LPCTSTRはTCHAR型の文字列なわけです。
今までchar型の文字列をLPCTSTRに強引にキャストして使っていた人もいたのではないでしょうか?
コンパイラの設定でUNICODEを使用しないようにすれば、TCHAR型はchar型に変換されるので、使うことが出来ます。
しかし、UNICODEを使用する設定にしていた人は、TCHAR型がWCHAR型に変換されるため、エラーが発生するはずです。

このような間違いを防ぐためにも、最初からchar型ではなくTCHAR型を使うことが推奨されているのです。

5.注意点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd);

見慣れたWinMain関数ですね。ですが、ここには問題点が一つあります。
お分かりですね。第3引数にchar型の文字列であるLPSTRが使われています。
ちゃんとTCHAR型のLPTSTRにしてあげなくてはなりません。
そのためには、WinMainの頭に_tをつけてあげます。なお、tchar.hをインクルードします

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nShowCmd);

これで問題ないですね。

ほとんど全てのWin32APIは、LPCTSTRまたはLPTSTRを使用しているので、私たちは気にする必要がありません。
ですが、このままだとstrcpyやfopenなど、C言語標準ライブラリ関数が使えなくなります。
でもご安心を。ちゃんとtchar.hにTCHAR型用に定義されています。

(tchar.hに定義されている例)
strcpy() → _tcscpy()
fopen() → _tfopen()
atoi() → _ttoi()
sprintf() → _stprintf()

何を使用すればよいのかわからなくなったら、tchar.h内を検索してみましょう。
TCHAR型を使用した代わりの関数が見つかります。

6.おわりに
実際やることは大したことないですがやたらと長くなってしまいました・・・
ほとんどの人は知っていることだとは思いますが、これは非常に重要なことです。
この記事を読んで初めて知った人は、出来るだけTCHAR型を使用して書くようにしましょう。

今の時代、C/C++を使用してWindowsプログラミングをする人すらあまりいませんからね。
デフォルトUNICODE対応のC#でなんら問題はないのです。

2013-07-03

centosのVMファイルを移動した後にネットワークに繋がらない時

/etc/init.d/network restartをした後、次のようなメッセージが出る。
Device eth0 does not seem to be present, delaying initialization
VMファイルを移動した後にMACアドレスの古い情報が残っているのが原因

解消方法
ifconfig -a でMACアドレス調べる
/etc/sysconfig/network-scripts/ifcfg-eth0 のHWADDRを変更
/etc/udev/rules.d/70-persistent-net.rules のeth1を消してeth0のMACを変更
reboot
http://dharry.hatenablog.com/entry/20120307/1331055287


2013-06-30

Ubuntu12.04のインストールとSamba 4でActive Directory構築

久しぶりにUbuntuを再インストールしてみた。
以前RAID1によるHDD二重化をしていたけどそのうち片方が壊れた。
HDD追加で買うほど大切なデータも入れてないのでRAIDは今回はやめた。
代わりに、以前はUbuntuのバグか何かでうまくいかなかったLVMを使ってみた。

とりあえずインストール時に注意する要素として以前と同じく
・AdvancedFormatTechnologyのHDD
・AFTとなんだか相性の悪いマザーボード
・今のHDDだと微妙に2TB以下らしく標準インストールだとパーティションテーブルがGPTにならずMSDOSになる

といったところ。IntelliPark問題は前回対応済なので不要。
最近のUbuntuはAFTに対応しているっぽいけど、
GPTを使いたいがためにパーティショニングを手動で行う。

GPT周りについてのメモ
GRUBをMBRにインストールした場合、追加でBIOSブートパーティション/予約済み BIOS ブート領域(bios_grubフラグのたったパーティション)に情報を保存する。
もしなければ/bootの情報を使おうとする。そうすると何らかの原因でブートができなくなる可能性があるらしく、BIOSブートパーティションを設けたほうがいいらしい。
BIOSブートパーティションは最低31KB必要らしく、通常は多めに1MBほど確保される。
UbuntuではこれがないとGRUBインストールに失敗するとの情報あり。
RAID1を構築した場合、bios_grubはOSインストール後に手動でミラーにインストールするのが良さそう。

今回は関係ないけど/bootのメモ
/bootパーティションには起動するための情報が格納される。なければ/に格納される。
これは基本的にはRAIDの外に出さないといけないが、RAID1ははやくから対応されている。
RAID1の時、縮退すると起動できなくなってしまうので、/bootもRAIDに載せるほうがよいらしい。
ついでに、LVMの上に/bootを載せるのは少なくともうちの環境では動かないっぽい(RAIDは未確認

パーティショニングに関して参考にしたサイト
http://www.linuxmania.jp/raid_md_grub.html
http://www.ibm.com/developerworks/jp/linux/library/l-grub2/


で、OS入れる際にまたまたなかなかうまく行かなかったので色々実験結果をメモしとく。
インストール&起動の結果
◆MSDOS&RAIDなし&LVMなし→OK
◆GPT&RAIDなし&LVMなし→OK
◆GPT&RAIDあり(/bootと/)&LVMなし→NG(一瞬起動メニューが出て先に進むけど真っ黒の画面で止まる)
◆GPT&RAIDあり(/)&LVMあり(/)→成功?(起動しかけたところで単独RAIDが原因っぽいエラーが発生)

AFT&LVM&RAIDあたりの注意事項について細かく記載のあるサイトがあったのでメモ
http://green-rabbit.sakura.ne.jp/blog/2010/11/27/2191/
※意味がよくわからなかったので今回は気にしないことにした


AdvancedFormatTechnology対応したパーティショニングをGPartedで行う

注意としては、流用したHDDだと前の情報が残っていたりするっぽいので、適当なフォーマットと適当なラベル付を行う。

http://gparted.sourceforge.net/からGparted Live"gparted-live-0.16.1-1-amd64.iso"をダウンロードしてCDに焼く。
ディスクを入れて起動
  1. ・・・Live・・・
  2. Don't touch keymap
  3. 15: Japan
  4. 0) COntinue to start X to use GParted automatically
  5. 右上の/dev/・・・から操作したいHDDを選択、今回は"/dev/sda"
  6. メニュー→デバイス→パーティションの作成→詳細→[新しいパーティションテーブルの形式を選択]"gpt"→"Apply"
  7. まず、gpt用のgrub用領域を1MB分作成する。
  8. 未割り当てを選択→New→前方の空き領域"1"、新しいサイズ"1"MiB、種類"基本パーティション"、ファイルシステム"ext4"※本来不要、ラベル"grub"
  9. 次に、ブート用の領域を256MB分作成する。
  10. 未割り当てを選択→New→前方の空き領域"0"、新しいサイズ"256"MiB、種類"基本パーティション"、ファイルシステム"ext4"※本来不要、ラベル"boot" RAID化しておけば片方のHDD異常でも起動ができるらしい。
  11. 次に、スワップ領域をディスクの末尾に作成する。メモリが2GBでそれより多めにとる。
  12. 今回はとりあえず3GBととする。 未割り当てを選択→New→新しいサイズ"3072"MiB、後方の空き領域"0"、種類"基本パーティション"、ファイルシステム"ext4"※本来不要、ラベル"swap" なお、スワップ領域をRAID化する意味はないらしい。
  13. 最後に、それ以外のメイン部分の領域を残り全部で作成する。
  14. ただ、のちのち別HDDとRAID1化するので念の為少し小さめに数十MBくらい残しておく。 未割り当てを選択→New→前方の空き領域"0"、新しいサイズ"1904300"MiB、種類"基本パーティション"、ファイルシステム"ext4"※本来不要、ラベル"data"
  15. 念の為、これまで作成したパーティションを右クリックしてinformationから開始セクターを確認する。
  16. 8の倍数であることを確認する。
  17. ・・・確かApplyをクリックして適用。
  18. Exitをダブルクリックして終了。
今回はHDDひとつだったけど、RAID1用に複数あるなら全て同じようにパーティショニングする。


Ubuntu Server 64bit版をインストールする

http://www.ubuntu.com/server/から"ubuntu-12.04.2-server-amd64.iso"をダウンロードしてCDに焼く。
ディスクを入れて起動

インストール手順1(基本情報)

  1. [Language]画面"日本語"
  2. "Ubuntu Serverをインストール"
  3. [インストーラの翻訳は、選択された言語では完全ではありません]画面"はい"
  4. [場所の選択]画面"日本"
  5. [キーボードの設定]画面"日本語"→キーボードのレイアウト"日本語"
  6. [ネットワークの設定]画面の[このシステムのホスト名を入力して下さい]画面(ネットワーク手動設定のために)"戻る"→"ネットワークを手動で設定"→[IP address]任意入力"192.168.1.xxx"して"続ける"→[ネットマスク]任意入力"255.255.255.0"→[ゲートウェイ]任意入力"192.168.1.1"→[ネームサーバーアドレス]任意入力"192.168.1.1"→[このシステムのホスト名を入力して下さい]任意入力"ubuntu"→[ドメイン名]任意入力"mydomain"※他のドメイン名にあわせる
  7. [ユーザーとパスワードのセットアップ]画面の[新しいユーザーの本名]任意入力"TestUser"→[あなたのアカウントのユーザ名]任意入力"testuser"→[新しいユーザーのパスワードを選んで下さい]任意入力"xxxxxxxx"→[確認のため、再度パスワードを入力して下さい]先と同じ値を入力
  8. [ホームディレクトリを暗号化しますか]"いいえ"※持ち歩かない端末なので盗難は心配せず、パフォーマンス優先
  9. [時間の設定]画面で[your time zone is Asia/Tokyo]と出てるので[Is this time zone correct]"はい"

インストール手順2(パーティショニング)

概要としては、システム周りは先程パーティショニングした通りで、ルートなどはLVM上に構築していく。
あまり細かくはわけず、ルート(20GB)とホーム(残り)の2つに分ける。
ちなみにパーティションを遣り直したい際、論理ボリュームの削除ができない。
これは日本語のバグらしく、メニューを戻って言語からEnglishを選択すれば削除できるようになる。
  1. [ディスクのパーティショニング]画面→[パーティショニングの方法]"手動"
  2. [・・・sda・・・]の
  3. 1.(bios用領域)→
  4. [利用方法]"予約済みBIOSブート領域" [起動フラグ]"オフ"
  5. 2.(boot用)→
  6. [利用方法]"ext4" [パーティションの初期化]"初期化" [マウントポイント]"/boot" [起動フラグ]"オフ"
  7. 3.(swap用)→
  8. [利用方法]"スワップ領域" [起動フラグ]"オフ"
  9. 4.(rootなどその他用)→
  10. 論理ボリュームにするので触らない
  11. →"論理ボリュームマネージャの設定"→[LVM設定アクション]"ボリュームグループの作成"→[ボリュームグループ名]"vg0"→[新しいボリュームグループのデバイス]"/dev/sda4"(rootなど用)を選択して"続ける"
  12. →[LVM設定アクション]"論理ボリュームの作成"→[ボリュームグループ]"vg0"→[論理ボリューム名]"lv0"を入力して"続ける"→[論理ボリュームサイズ]任意入力"20GB"
  13. →[LVM設定アクション]"論理ボリュームの作成"→[ボリュームグループ]"vg0"→[論理ボリューム名]"lv1"を入力して"続ける"→[論理ボリュームサイズ]任意入力※残り全部※デフォルト値
  14. →[LVM設定アクション]"完了"
  15. →[LVM VG・・・lv0・・"の"1.・・・]を選択→
  16. [利用方法]"ext4" [マウントポイント]"/" [マウントオプション]"defaults"※デフォルト値 [ラベル]任意入力"root" [予約ブロック]"5%"※デフォルト値 [典型的な利用方法]"標準"※デフォルト値
  17. →"パーティションのセットアップを終了"
  18. →[LVM VG・・・lv1・・"の"1.・・・]を選択→
  19. [利用方法]"ext4" [マウントポイント]"/home" [マウントオプション]"defaults"※デフォルト値 [ラベル]任意入力"home" [予約ブロック]"5%"※デフォルト値 [典型的な利用方法]"標準"※デフォルト値
  20. →"パーティションのセットアップを終了"
  21. →"パーティショニングの終了とディスクへの書き込み"

インストール手順3(ソフトウェア周り)

  1. [taskselを設定しています]画面の[このシステムのアップグレードをどのように管理しますか"自動的にアップデートしない"
  2. [ソフトウェアの選択]画面"OpenSSH server","Mail server"
  3. [Postfix Configuration]画面の[メール設定の一般形式]"インターネットサイト"
  4. →[システムメール名]任意入力"ホスト名.ドメイン名"
  5. ※何入れればいいかわからん Samba入れたら ホスト名.ドメイン名、いれなかったらホスト名がデフォルト値だった
  6. [ハードディスクへのGRUBブートローダのインストール]画面の[マスターブートレコードにGRUBブートローダをインストールしますか]"はい"
  7. [インストールの完了]画面でディスクを抜き"続ける"


この時点で再起動すると、"No bootable device"と出て起動できない。
どうやら、マザーボード(BIOS)がUbuntuの作るGPTを読めていないらしい。
というのも、Ubuntuから見たGPTはブートフラグは関係しない不要な属性らしいけど、
マザーボードによってはブートフラグ前提で動いていて純粋なGPTに対応してなかったりするらしい。
というわけで、Live版のUbuntuからHDDに細工をしてマザーボードから読めるようにする。
起動さえすればあとはGRUBとかがうまくやってくれるらしい。
なお、この問題は10.XXから発生しているらしく、確かに以前10.XXがダメだったから9.10を入れた。
最近は対応策が発見されたらしい。

適当なパーティションに起動フラグセット

どこか適当なパーティションに起動フラグをセットする必要がある、今回の構成だとスワップ以外につけられるところがないのでスワップをONにする。 http://www.ubuntulinux.jp/download/ja-remixから"ubuntu-ja-12.04.2-desktop-i386.iso"をダウンロードしてCDに焼く。 ディスクを入れて起動する。
  1. "Ubuntuを試す"で起動してDash→検索"terminal"
  2. $ sudo fdisk /dev/sda
  3. [GPTをサポートしません・・・]とか言われるけど無視する。
  4. とりあえず状態を確認
  5. : p
    デバイス ブート 始点 終点 ブロック ID システム /dev/sda1 1 39070・・・ 19535・・・ ee GPT
  6. パーティションをアクティブにする
  7. "a"→"1"→"w"
  8. 終了
  9. $ sudo shutdown -h 0
OSインストールの手順は以上、次は初期セットアップ以降の手順を。

ついでに調べた事項のメモ、RAID1構成にしてインストールした時に以下のようなメッセージが出る場合について。
[Do you want to boot your system if your RAID becomes degraded?]

Yes を選ぶと、degraded 時に case.1
No を選ぶと、degraded 時に case.2

case.1
起動時に以下のメッセージが出て、そのまま起動します。
started the RAID in degraded mode.

case.2
起動時に以下のメッセージが出ます。
Do you wish to start the degraded RAID? [y/N]:

いいえが無難かなぁ。

参考
https://forums.ubuntulinux.jp/viewtopic.php?id=9232

初期セットアップ以降の手順

文字化け対策

$ vim ~/.profile
以下を追記
case $TERM in
linux) LANG=C ;;
*) LANG=ja_JP.UTF-8 ;;
esac
:wq
$ sudo shutdown -r 0
今後の新規ユーザーにも適用する
$ sudo vim /etc/skel/.profile
自分の.profileと同じ変更をする(動作未確認)


念の為IP確認

$ ifconfig
IPはinet addr:・・・のところ
MACアドレスはHWaddr・・・のところ


ネットワーク設定確認

$ more /etc/network/interfaces
address 192.168.1.xxx
netmask 255.255.255.0
network 192.168.1.0
broadcase 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
dns-search mydomain


ソフトウェアアップデート

※今回はapt-getではなく、aptitudeを採用してみる
$ sudo aptitude update
$ sudo aptitude full-upgrade
$ sudo shutdown -r 0

以降、SSHクライアントから作業する
今回は、以前インストールしたPederosaからやる。
注意なのは、今後mysqlをインストールする際には直接コンソールからやること。
なぜかSSHクライアントからだと操作不能になる。


インストール作業に用いるソフトウェアインストール

$ sudo aptitude install zip


時計のセットアップ

9.04と比べて設定ファイル名が変わっていた
今回はNTPサーバー機能は入れない
$ sudo sed -i 's/NTPSERVERS="ntp.ubuntu.com"/NTPSERVERS="ntp.nict.jp"/g' /etc/default/ntpdate
$ sudo ntpdate -u ntp.nict.jp
ハードウェアの時計に反映
$ sudo hwclock -w
なお、手動で日時変更する場合は
$ sudo date 1129225808
これで2008/11/29 22:58:00になる


↓winbindはsambaの兄弟で、今回はsambaをソースからインストールする関係で念のため入れないでおく

Ubuntu→Windowsの名前解決

そのままだとUbuntuからWindowsの名前を解決できない。
Windowsと同じようにNetBIOSの名前解決ができるようにする。
winbindをインストールし、名前解決方法にwinsを追加するとできるようになる。
$ ping Windows機ホスト名
→だめ
$ sudo aptitude install winbind
$ sudo vim /etc/nsswitch.conf
hosts: files dns となっているところを
hosts: files dns wins にする
$ sudo /etc/init.d/winbind restart
$ ping Windows機ホスト名


FireWallのセットアップ

UbuntuのFireWallはiptablesで行われる。
簡単に操作するためのuwfというツールもある。

FireWall初期設定の確認
$ sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
何も設定されていない。
仕組みはよくわからないけど、何も触らなくてもインストールしたソフトは自動で使える、みたいな状態。
一度設定した以降は、ちゃんとポート設定しないといけないっぽい?

今回色々設定したけど記事の趣旨からは外れるのでここでは説明しない。
多分そのままでも動作はするはずで、だめなら必要に応じて設定すればよい。


postfixによるメール設定

ここではgmailを使用する
$ sudo postconf -e relay_transport=smtp
$ sudo postconf -e relayhost=[smtp.gmail.com]:587
$ sudo postconf -e smtp_use_tls=yes
$ sudo postconf -e smtp_sasl_auth_enable=yes
$ sudo postconf -e smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
$ sudo postconf -e smtp_sasl_security_options=noanonymous
$ sudo postconf -e smtp_sasl_mechanism_filter=plain
$ sudo postconf -e smtp_tls_security_level=secure
$ sudo postconf -e smtp_tls_CApath=/etc/postfix/certs

ログイン情報を作成する
$ sudo touch /etc/postfix/sasl_passwd
$ sudo vim /etc/postfix/sasl_passwd
↓の行を記入する
[smtp.gmail.com]:587 メールアドレス:パスワード
$ sudo chmod 600 /etc/postfix/sasl_passwd
$ sudo postmap /etc/postfix/sasl_passwd

$ sudo mkdir /etc/postfix/certs
$ sudo chmod 600 /etc/postfix/certs
$ cat /etc/ssl/certs/Equifax_Secure_CA.pem | sudo tee -a /etc/postfix/certs/Equifax_Secure_CA.pem
$ cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem | sudo tee -a /etc/postfix/Thawte_Premium_Server_CA.pem
$ c_rehash /etc/postfix/certs
$ sudo vim /etc/postfix/submit.cred
submitcred version 1
hostname|username|password
$ sudo chmod 600 /etc/postfix/submit.cred
※submit.credは要らない可能性あり
$ sudo /etc/init.d/postfix restart
送信テスト
$ mail 宛先メールアドレス
本文は.で終了
うまくいかない場合は/var/log/mail.logを確認
"Server certificate not trusted"と出ている場合はpemがおかしい

参考:
http://ubuntu-tutorials.com/2008/11/11/relaying-postfix-smtp-via-smtpgmailcom/
http://stevejenkins.com/blog/2011/06/fixing-postfix-certificate-verification-failed-for-gmail-untrusted-issuer-error-message/

メール通知の設定
$ sudo vim /etc/aliases
最初はpostmaster: rootみたいな設定だけある
root: ユーザーアカウント
ユーザーアカウント: メールアドレス
という設定を追記
カンマ区切りで複数設定可能
$ sudo postalias /etc/aliases


これで基本的な初期セットアップ完了。

次はsamba4のインストールとActiveDirectoryの構築。
最近samba4のstable版がリリースされ、samba4からはActiveDirectoryのサーバー機能を備えている。
ActiveDirectoryに必要な機能はDNSサーバーとケルベロスサーバーで、samba4はこの辺を全て内包している。

sambaのサポートページ
http://wiki.samba.gr.jp/mediawiki/

aptitude等でsamba4を入れることもできるけどエラーが多発してインストールすらできない。
ソースからコンパイルして入れてみる。

参考
https://wiki.samba.org/index.php/Samba_4/OS_Requirements
http://paulcolfer.ie/os/linux/samba-4-domain-controller-on-ubuntu-server-12-04/


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

$ sudo aptitude install build-essential libacl1-dev libattr1-dev libblkid-dev libgnutls-dev libreadline-dev python-dev python-dnspython gdb pkg-config libpopt-dev libldap2-dev dnsutils libbsd-dev attr docbook-xsl libcups2-dev xsltproc inkscape libpam0g-dev
※krb5-user はあとで入れる

$ sudo aptitude install gcc python2.7-dev make libacl1-dev python
※インストールされるものはなかった、上記のに含まれてるかも


openldapインストール

samba4をコンパイルするとwinbindやpam関連のsoファイルが生成されるべきだけど、
事前にopenldap関係のパッケージを入れておかないと生成されないっぽい?
$ sudo aptitude install slapd ldap-utils
管理者のパスワード: ※使わないのでなんでもよい

入れるのはいいけどかといって動作しているとなぜかADがおかしくなる。
なのでサービスから外しとく。
$ sudo update-rc.d -f slapd remove


samba4インストール

ソースをダウンロードしてmakeところから。
今回は4.0.6で試した。
$ cd
$ wget http://ftp.samba.org/pub/samba/samba-4.0.6.tar.gz
$ tar -zxvf samba-4.0.6.tar.gz
$ cd samba-4.0.6
$ ./configure
$ sudo make && sudo make install

さっそくADをセットアップする。
Realm(レルム/Kerberosの管理範囲)にはADドメインを、DomainにはNTドメインを入れるらしい。
NTドメインにはドットが含められないらしい。
Realmは組織のDNS名を大文字にしたもの(例えば、SALES.EXAMPLE.COM)を使うのが慣例で、DNSと紐づかない閉じた環境では名前 + ".LOCAL"とすることが多いらしい。
ちなみにOSインストール時のドメイン名は上書きされる感じになるので無視していい。
ServerRoleにはDomainControlerであるdcを選択。ActiveDirectoryのサーバー以外にしたりするなら他を選ぶ。
DNS backendにはDNSサーバーの種類を選ぶ、今回はsambaに任せるのでSAMBA_INTERNAL。
DNS forwarder ・・・には親となるDNSサーバーを選ぶ、今回はルーターを。

$ sudo /usr/local/samba/bin/samba-tool domain provision
Realm []: MYDOMAIN.LOCAL
Domain []: MYDOMAIN
Server Role (dc, member, standalone) [dc]:
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
DNS forwarder IP address (write 'none' to disable forwarding) [192.168.1.1]:
Administrator password: パスワード
起動は単純に実行するだけ
$ sudo /usr/local/samba/sbin/samba
$ ps aux|grep samba
ずらずら表示されていたらOK
※4.0.5->4.0.6で数がだいぶプロセス減ってるような?


sambaのサービス化

毎回手動実行は大変なのでサービス登録する
$ sudo vim /etc/init.d/samba4

次のようなスクリプトを記述する。
#! /bin/sh
### BEGIN INIT INFO
# Provides: samba
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Samba
# Description: Samba Domain controller
# scheduler
### END INIT INFO
#
#
#
set -e

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/local/samba/sbin/samba

test -x $DAEMON || exit 0

case "$1" in
start)
echo -ne "Starting Samba" "samba \n"
$DAEMON -D
;;
stop)
echo -ne "Stopping Samba" "samba \n"
PIDSMB=`ps -e | grep samba | awk '{ print $1 }'`
killall samba
;;
restart)
$0 stop
echo -ne "Sleeping 5 Seconds Before Start: \n"
sleep 5
$0 start
;;
*)
echo "Usage: /etc/init.d/samba4 {start|stop|restart)"

exit 1
;;
esac

exit 0
注意:ファイル名はsambaではだめなのでsamba4にしている、killallで処理中のこのスクリプトまでkillされてしまう

スクリプトを自動実行するようにする。
$ sudo chmod +x /etc/init.d/samba4
$ sudo update-rc.d samba4 defaults 98 02
ちなみにサービスの状態を確認するには
$ sudo aptitude install chkconfig
$ sudo chkconfig --list samba4
ランレベル毎に表示されるらしい。


ネットワーク設定を正す

インストールしただけだとネットワーク関連の設定ファイルが全然だめな状態なので直す。

参考
http://www.be-dama.com/kb/samba4-ad-mini-howto/samba_init_setting.html

$ sudo vim /etc/hostname
もともと
ホスト名
となっているものを
ホスト名.レルム
を(多分)小文字で記述する
ubuntu.mydomain.local

$ sudo vim /etc/hosts
127.0.0.1 localhost
UbuntuサーバーIP ホスト名.レルム ホスト名

今回だと
192.168.1.xxx ubuntu.mydomain.local ubuntu

interfacesに書いてあるDNSサーバー情報とかを移動する。
interfaces辺りの編集を間違えててハマッタ
参考
http://d.hatena.ne.jp/studio-m/20080213/1202862706
http://iabsis.com/EN/article/35-2/Samba4-installation

$ sudo vim /etc/resolvconf/resolv.conf.d/base
もともと空
search レルム名
nameserver UbuntuサーバーIP
に変更する。
search mydomain.local
nameserver 192.168.1.xxx
$ sudo resolvconf -u
ポイントはnameserver(DNS)にルーターを指定せず自分を指定するところ。

interfacesから移動した記述を削除
$ sudo vim /etc/network/interfaces
もともと
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.xxx
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.1.1
dns-search mydomain

dns-*系があればコメントアウトする
# dns-* options are implemented by the resolvconf package, if installed
#dns-nameservers 192.168.1.1
#dns-search mydomain

ネットワーク再起動
$ sudo ifdown eth0 && sudo ifup eth0

問題なくサービス再起動することを確認
$ sudo /etc/init.d/samba4 restart

一通り終わったので再起動してみる。
$ sudo shutdown -r 0


ADの動作確認

ドメイン定義の確認
$ /usr/local/samba/bin/smbclient -L localhost -U%
Domain=[XXXXXXXX] OS=[Unix] Server=[Samba 4.0.6]

Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (Samba 4.0.6)
sysvol Disk
netlogon Disk
Domain=[XXXXXXXX] OS=[Unix] Server=[Samba 4.0.6]

Server Comment
--------- -------

Workgroup Master
--------- -------
みたいな感じで表示されればOK

DNSの確認
$ sudo host -t SRV _ldap._tcp.mydomain.local 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

_ldap._tcp.mydomain.local has SRV record 0 100 389 ubuntu.mydomain.local.

ドメイン管理者でログオンできるか
$ /usr/local/samba/bin/smbclient //localhost/netlogon -UAdministrator%'パスワード' -c 'ls'
Domain=[XXXXXXXX] OS=[Unix] Server=[Samba 4.0.6]
. D 0 Sun May 19 22:48:09 2013
.. D 0 Sun May 19 22:48:20 2013

34196 blocks of size 524288. 27826 blocks available
※パスワードに'が含まれている場合は"で囲む


kerberosの確認

adの暗号認証が機能しているか確認する。
sambaでadが動いた時点でサービスとしては動いてるはずで、udp88とかがnmapで確認できればよい。
問題はネットワーク設定がちゃんとしてなくてローカルから確認が失敗することが多そう。
adとしては起動に必須ではないはずで動いてるかわからないため念のため動作確認する。

sambaでドメイン立ち上げた時にできるテンプレートファイルをコピーしておく
$ sudo cp /usr/local/samba/private/krb5.conf /etc/.

kerberosクライアントインストール
レルムにはADのレルムを、
ケルベロスサーバーと管理サーバーに自分のホスト名を入れる。
$ sudo aptitude install krb5-user
デフォルトのケルベロスバージョン 5 レルム:MYDOMAIN.LOCAL
あなたのレルムのケルベロスサーバ: ubuntu
あなたのケルベロスレルムの管理サーバー: ubuntu
※質問の順番がなぜか違う時がある

$ sudo shutdown -r 0
※再起動しないとなぜかだめだった

$ kinit administrator@MYDOMAIN.LOCAL
※レルム名は大文字
何も帰ってこないか、パスワードに関する警告が出ればOK

接続のチケット(許可?)の一覧
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: administrator@MYDOMAIN.LOCAL
みたいな感じで出ればOK


AD管理ツールでの確認

$ sudo /usr/local/samba/bin/wbinfo -t
checking the trust secret for domain MYDOMAIN via RPC calls succeeded
succeededと出ればOK

$ sudo /usr/local/samba/bin/wbinfo -u
$ sudo /usr/local/samba/bin/wbinfo -g
でドメインのユーザーとグループが表示されればOK

試しにパスワードポリシー表示
$ sudo /usr/local/samba/bin/samba-tool domain passwordsettings show
Password informations for domain 'DC=mydomain,DC=local'

Password complexity: on
Store plaintext passwords: off
Password history length: 24
Minimum password length: 7
Minimum password age (days): 1
Maximum password age (days): 42

他にも、SSHでログインできるようにもできるらしいけど今回は調べない。

セットアップ完了。
次会hADへのユーザー追加とかファイルサーバーのセットアップとか。


ユーザー追加
$ sudo /usr/local/samba/bin/samba-tool user add tester

この時点でWindows機から確認してみる。
ネットワークの設定からDNSのIPをUbuntuサーバー機にする。
念の為ネットワークアダプタを無効にしてから有効化。
ping mydomain.local
で通ることを確認。

でもって、コントロールパネルのシステムからドメイン情報を入力すると参加できた。


ADユーザーとUbuntu情報の連携
make時にwinbindやpamといった名前のついたファイルができている。
これらをシステムに組み込んでユーザー情報を連携させる。
その際、既にあるファイルを退避させとく。
$ sudo mv /lib/x86_64-linux-gnu/libnss_winbind.so.2 /var/tmp/.
$ sudo ln -s /usr/local/samba/lib/libnss_winbind.so.2 /lib/x86_64-linux-gnu/libnss_winbind.so
$ sudo ln -s /lib/x86_64-linux-gnu/libnss_winbind.so /lib/x86_64-linux-gnu/libnss_winbind.so.2
$ sudo mv /lib/x86_64-linux-gnu/security/pam_winbind.so /var/tmp/
$ sudo ln -s /usr/local/samba/lib/pam_winbind.so /lib/x86_64-linux-gnu/security/pam_winbind.so

sambaのシェル設定
$ sudo vim /usr/local/samba/etc/smb.conf
[global]
...
template shell = /bin/bash
...

連携する用に設定
$ sudo vim /etc/nsswitch.conf
passwd: compat
group: compat
shadow: compat

passwd: compat winbind
group: compat winbind
shadow: compat winbind
に変更

設定読み込み(再起動しても同じ効果らしい)
$ sudo ldconfig -v | grep winbind

winbindの動作確認
$ /usr/local/samba/bin/wbinfo -p
Ping to winbindd succeeded

ユーザー情報の連携確認
$ getent passwd
MYDOMAIN\Administrator:*:0:100::/home/MYDOMAIN/Administrator:/bin/bash
などがずらずらでればOK

これでActiveDirectoryのユーザーがLinuxから参照できる?
$ id Administrator
uid=0(root) gid=100(users) groups=0(root),100(users),3000004(MYDOMAIN\Group Policy Creator Owners),3000006(MYDOMAIN\Enterprise Admins),3000008(MYDOMAIN\Domain Admins),3000007(MYDOMAIN\Schema Admins)

UID/GIDに関してはよーわからんけど
$ sudo /usr/local/samba/bin/ldbedit -e vi -H /usr/local/samba/private/idmap.ldb
でUIDとかのマッピング情報が見られるらしく
lowerBound: 3000000
upperBound: 4000000
とかあるので、3000000~4000000の間でIDでが振られるのかもしれない

ADユーザー情報
$ /usr/local/samba/bin/wbinfo --user-info Administrator
MYDOMAIN\Administrator:*:0:100::/home/MYDOMAIN/Administrator:/bin/false
UID=0 つまりroot

$ /usr/local/samba/bin/wbinfo --user-info tester
MYDOMAIN\tester:*:3000016:100::/home/MYDOMAIN/tester:/bin/false
UID=3000016 新たなID

ADグループ情報
$ /usr/local/samba/bin/wbinfo --group-info 'Domain Users'
MYDOMAIN\Domain Users:*:100:
GID=100 つまり users

というわけでグループを作ってみる
$ sudo /usr/local/samba/bin/samba-tools group add 'TestUsers'
$ sudo /usr/local/samba/bin/samba-tools group addmembers 'TestUsers' tester
※カンマ区切りで複数追加できるっぽい

ADグループ情報
$ /usr/local/samba/bin/wbinfo --group-info 'TestUsers'
MYDOMAIN\TestUsers:*:3000019:

参考
http://web.chaperone.jp/w/index.php?samba%2Fuser
http://wiki.samba.gr.jp/mediawiki/index.php?title=Samba_4.0.0%E3%81%AEDC%E4%B8%8A%E3%81%A7UID/GID%E3%81%AE%E5%80%A4%E3%81%ABUNIX%E5%B1%9E%E6%80%A7%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84


ファイルサーバーセットアップ
sambaでファイルサーバーをセットアップする。

$ sudo vim /usr/local/samba/etc/smb.conf
# Global parameters
[global]
workgroup = MYDOMAIN
realm = MYDOMAIN.LOCAL
netbios name = UBUNTU
server role = active directory domain controller
dns forwarder = 192.168.1.1


[netlogon]
path = /usr/local/samba/var/locks/sysvol/mydomain.local/scripts
read only = No

[sysvol]
path = /usr/local/samba/var/locks/sysvol
read only = No
みたいな感じになっているところに
[global]
dos charset = CP932
unix charset = UTF-8

[share]
comment = share contents
path = /home/MYDOMAIN
read only = No
を追記する
$ sudo /etc/init.d/samba4 restart
$ sudo mkdir /home/MYDOMAIN
$ sudo chmod 755 /home/MYDOMAIN
$ sudo chown root:'MYDOMAIN\TestUsers' /home/MYDOMAIN

参考
http://sheepdogjam.cocolog-nifty.com/blog/2013/01/raspberrypi-sam.html

Windowsマシンから
\\192.168.1.XXX\
で共有フォルダが見えるようになる
ホスト名でも繋がるけど、何度かインストール手順を色々試してるとなぜかつながらないパターンがある。。。


プライマリグループの変更
このままだとドメインユーザーのプライマリグループがusersになっている。
ファイルサーバーで新規に作成したファイルのアクセス権設定がやりづらい。
設定ファイルを直接変更すれば変更できる。
$ sudo /usr/local/samba/bin/ldbedit -e vi -H /usr/local/samba/private/sam.ldb
/ユーザー名
などでユーザーの定義を探す
たぶん
objectClass: user
name: ユーザー名
となっていると思う
そこの
primaryGroupID: ・・・・
を変更先のグループに変える

IDを調べる方法は
$ /usr/local/samba/bin/wbinfo --name-to-sid グループ名
とした結果の末尾がID
今回だと
S-1-5-21-3800727457-1005178589-2210324449-1107 SID_DOM_GROUP (2)
となって、1107がIDとなる

primaryGroupID: 1107
とセットする
$ sudo /etc/init.d/samba4 restart
これで、プライマリグループの変更ができる。


おまけ

未確認やあまりはっきりしないことなど。

(20131031追記) Windows機をADに参加
普通にシステム詳細からドメインに参加すればよい。 ○○○○.LOCAL この時、アカウント情報を求められるが、ドメイン管理者(Domain Amins)の権限が必要らしい。 そうじゃない場合、Samba4だけかもしれないが次のようなエラーメッセージが出て混乱させられる。 「 ”***”という名前のコンピューターアカウントが以前、別の資格情報で作成された可能性があります。 別のコンピューター名を使うか、管理者に連絡して、競合を発生している無効なアカウントを削除してもらって下さい。 アクセスが拒否されました。」 なので、一般ユーザーを登録する場合は、まずはシステム詳細から管理者権限でドメインに参加し、 その後、一般ユーザーでPCにログインさせるといった感じになる。 また、WindowsVista以降では次の操作をしないといけないらしい(Pro未満の場合はレジストリ操作になる?) Windowsキー+R -> secpol.msc ローカルポシリー->セキュリティオプション ネットワーク セキュリティ: LAN Manager 認証レベル を変更する 未定義 -> 「NTLM応答のみ送信する」または「LMとNTLM応答を送信する」に変更する ※一度変更すると初期値(設定前)に戻せないので注意、初期値は「NTMv2応答のみを送信する」
AD管理をWindows7から
Ubuntuからだとコマンドベースで大変。
UIでやるならWindows7のリモート管理ツールというのが使えるらしい。

http://www.microsoft.com/ja-jp/download/details.aspx?id=7887
Win7用リモート管理ツールをダウンロードしてインストール

コントロールパネル→プログラムと機能→Windowsの機能の有効化または無効化
役割管理ツール→AD DS およびAD LDSツール→AD DSツール→ActiveDirectory管理センタをチェックする
一緒にいくつかチェックされるのでそのままにしておく→OK

で、前提条件としてWindows機からドメインに管理者権限で参加しておく必要があるっぽい。

スタートメニュー→管理ツール→ActiveDirectoryユーザーとコンピュータ
エラーが出るけど気にしない

操作→ドメインコントローラの変更→次のドメインコントローラーまたはAD LDS インスタンス
ドメイン名を入力
状態がオンラインになればOK

参考
http://www.kurobuti.com/blog/?p=6318
http://d.hatena.ne.jp/rti7743/20110425/1303688263


RAID1構築後に2台目HDDのbiosgrubパーティションセットアップ
1台目の情報をコピーする。
$ sudo dd if=/dev/sda1 of=/dev/sdb1 bs=512
をする

参考
http://nabe.blog.abk.nu/0301
http://blog.lwlv.net/archives/323


samba起動エラー解消
そのままだとsamba起動時にエラーが出ている。
$ sudo vim /usr/local/samba/etc/smb.conf
[global]に以下を追記
printing = bsd
load printers = no
printcap name = /dev/null
$ sudo /etc/init.d/samba4 restart


SWATのインストール
sambaの管理UI
$ sudo aptitude purge openbsd-inetd
※なければそれでよい

$ sudo aptitude install xinetd
$ sudo update-inetd --enable 'swat'
$ sudo dpkg-reconfigure xinetd
$ sudo vim /etc/xinetd.d/swat
service swat
{
port = 901
socket_type = stream
wait = no
only_from = 127.0.0.1 192.168.1.0/24
user = root
server = /usr/local/samba/sbin/swat
log_on_failure += USERID
disable = no
}

$ sudo vim /etc/inetd.conf
からswatに関する記述をコメントアウト
なぜかconfが残りっぱなしでxinetdが若干影響受けてるっぽいので念の為
※もともとなければ不要

swatのヘルプページがなぜかおかしいのは放置
samba-docを入れてwelcome.htmlを修正すればいいらしいが・・・
全部修正するのは大変だしsamba4のdocumentでちゃんとしたのが見つからなかった

もいちど再起動
$ sudo dpkg-reconfigure xinetd

rootにパスワードを与える
$ sudo passwd root

Windows機から
http://Ubuntuホスト名:901/
でswatに繋がる

なお、Ubuntu12.04の通常のsambaとswatではなぜかswatには繋がるけど
何かすると真っ白になるという状態になった
samba4でイチからビルドした場合はうまくいくっぽい


名前解決
インストール内容によってはWinowsマシンからLinuxマシンを名前解決できないケースがある。
その場合は次の操作で繋がるパターンがあった。

nmbdを入れる
$ sudo aptitude install samba

nmbdだけ欲しくてsmbdはいらないのでサービス停止
$ sudo /etc/init.d/smbd stop

smbdはupstartでサービス登録されているけど
念の為 SysV init の停止もする。多分えらー
$ sudo update-rc.d smbd disable
upstartの記述を削除する
$ sudo vim /etc/init/smbd.conf
start on ・・・ という行を#でコメントアウト

これで再起動してもsmbdが起動しないようになる
なお、/etc/init.d/ではなくserviceコマンドを使うこともあるが
これはupstartとSysV initの区別をしなくてもいいコマンドらしい

この状態でWIndowsマシンから
> ping ホスト名
で名前解決できていることを確認


その他参考にしたかもしれないサイト

http://www.kurobuti.com/blog/?p=6278http://d.hatena.ne.jp/torutk/20130301/p1
http://blog.bis5.net/archives/138
http://paulcolfer.ie/os/linux/samba-4-domain-controller-on-ubuntu-server-12-04/
https://wiki.samba.org/index.php/Samba_AD_DC_HOWTO
http://www.matrix44.net/cms/notes/gnulinux/samba-4-ad-domain-with-ubuntu-12-04
http://d.hatena.ne.jp/vivid_skid/20130417/1366159279
http://krakenbeal.blogspot.jp/2011/03/ubuntuswat.html
http://www.aconus.com/~oyaji/samba/samba.htm
http://www.samba.gr.jp/doc/contrib/begin_samba2.0.html
http://askubuntu.com/questions/196272/how-to-install-and-configure-swat-in-ubuntu-server-12-04
http://www.samba.gr.jp/project/translation/Samba3-HOWTO/FastStart.html
http://fummy-net.blogspot.jp/2013/04/samba4-active-directory-pdc.html#centos_domain_login