Cygwin メモ

インストール

最小構成システム

Cygwin.com から、自分の OS にあわせて 32ビット版インストーラ64ビット版インストーラ をダウンロードしてください。32ビット版は64ビット OS では動作しません。

インストーラを、好きなフォルダに移動してください。以後、そのフォルダの中にファイルをインストールしていきます。ここでは 64ビット版インストーラを C:\cygwin64 に移動したことにします。

エクスプローラで shift キーを押しながら C:\cygwin64 を右クリックして「コマンド ウィンドウをここで開く」を選択すると、cmd.exe コマンドウィンドウが開きます。

以下のとおりに入力してください。インストールが始まります。環境によっては、表示が左右逆の「/」である文字(バックスラッシュ)は、円記号になります。

(2018/10/15追記) 一回の実行では、ダウンロードが途中で終わってしまうので、同じコマンドを二回実行することでインストールできます。

setup-x86_64 -q -R %CD% -s ftp://ftp.iij.ad.jp/pub/cygwin -l %CD%\.cygwin -D -P base-cygwin,base-files -L

Cygwin Terminal という名前のショートカットが作成されているので、それを起動すると、自動設定が完了します。

これでインストールは終了です。

パスワードについて

Windows のユーザ名とパスワードがそのまま使えます。むしろそれしか使えません。そのため、adduser/useradd に相当するコマンドはありませんし、passwd コマンドも実質無効です。

Cygwin にユーザを追加するなら、Windows にユーザを追加しなければなりません。また、Microsoftアカウントに紐づいているアカウントは実験したところ Cygwin の方にパスワードが通らないので使えません。なんらかの対策が期待されるところです。(2014/12/10)

telnetd、ftpd で通る USER/PASS も Windows のものだけです。

権限の再設定

自動的に設定される権限情報を持ったまま使い続けると、権限にかかわる不具合が発生したときの取り返しが非常につきにくくなるので、ここで正しい権限情報を設定します。しなくてもかまいません。

具体的には、ディレクトリ etc にある passwd と group を書き換えます。Windows にユーザを追加するたび、つまり Cygwin にユーザが追加されるたびに同様の書き換えをしなければなりません。

まず、次のようにして passwd と group を生成します。

mkpasswd -l >/etc/passwd mkgroup -l >/etc/group

passwd にはユーザの一覧が書かれています。私のものは、このようになっています。重要な情報はここにはありません。

SYSTEM:*:18:18:U-NT AUTHORITY\SYSTEM,S-1-5-18:/home/SYSTEM:/bin/bash LOCAL SERVICE:*:19:19:U-NT AUTHORITY\LOCAL SERVICE,S-1-5-19:/:/sbin/nologin NETWORK SERVICE:*:20:20:U-NT AUTHORITY\NETWORK SERVICE,S-1-5-20:/:/sbin/nologin Administrators:*:544:544:U-BUILTIN\Administrators,S-1-5-32-544:/:/sbin/nologin NT SERVICE+TrustedInstaller:*:328384:328384:U-NT SERVICE\TrustedInstaller,S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464:/:/sbin/nologin Administrator:*:197108:197121:U-USADA-PC\Administrator,S-1-5-21-2928480115-2656868154-153426011-500:/home/Administrator:/bin/bash DefaultAccount:*:197111:197121:U-USADA-PC\DefaultAccount,S-1-5-21-2928480115-2656868154-153426011-503:/home/DefaultAccount:/bin/bash Guest:*:197109:197121:U-USADA-PC\Guest,S-1-5-21-2928480115-2656868154-153426011-501:/home/Guest:/bin/bash HIKARU:*:197608:197121:U-USADA-PC\HIKARU,S-1-5-21-2928480115-2656868154-153426011-1000:/home/HIKARU:/bin/bash HomeGroupUser$:*:197610:197121:U-USADA-PC\HomeGroupUser$,S-1-5-21-2928480115-2656868154-153426011-1002:/home/HomeGroupUser$:/bin/bash

これを、以下のように変更します。

SYSTEM:*:18:18:U-NT AUTHORITY\SYSTEM,S-1-5-18:/home/SYSTEM:/bin/bash Administrators:*:544:544:U-BUILTIN\Administrators,S-1-5-32-544:/:/sbin/nologin root:*:197108:197121:U-USADA-PC\Administrator,S-1-5-21-2928480115-2656868154-153426011-500:/root:/bin/bash HIKARU:*:197608:197121:U-USADA-PC\HIKARU,S-1-5-21-2928480115-2656868154-153426011-1000:/home/HIKARU:/bin/bash

Administrator を (Administrators ではなく) root に、/home/Administrator を /root にしています。利用しないユーザはセキュリティのため、消してしまいます。

group にはグループの一覧があります。私のものはこうです。

SYSTEM:S-1-5-18:18: NT SERVICE+TrustedInstaller:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464:328384: Access Control Assistance Operators:S-1-5-32-579:579: Administrators:S-1-5-32-544:544: Backup Operators:S-1-5-32-551:551: Cryptographic Operators:S-1-5-32-569:569: Distributed COM Users:S-1-5-32-562:562: Event Log Readers:S-1-5-32-573:573: Guests:S-1-5-32-546:546: Hyper-V Administrators:S-1-5-32-578:578: IIS_IUSRS:S-1-5-32-568:568: Network Configuration Operators:S-1-5-32-556:556: Performance Log Users:S-1-5-32-559:559: Performance Monitor Users:S-1-5-32-558:558: Power Users:S-1-5-32-547:547: Remote Desktop Users:S-1-5-32-555:555: Remote Management Users:S-1-5-32-580:580: Replicator:S-1-5-32-552:552: System Managed Group:S-1-5-32-581:581: Users:S-1-5-32-545:545: HomeUsers:S-1-5-21-2928480115-2656868154-153426011-1001:197609: なし:S-1-5-21-2928480115-2656868154-153426011-513:197121:

これを、以下のように変更します。

SYSTEM:S-1-5-18:18: Administrators:S-1-5-32-544:544: Users:S-1-5-32-545:545: nobody:S-1-5-21-2928480115-2656868154-153426011-513:197121:

「なし」を nobody にしています。使わないグループも消してしまいます。

いったんターミナルを閉じ、再度開けば適用されます。

テキストエディタがない局面では、文字の変更に sed を利用します。たとえば:

mkpasswd -l |sed s/^Administrator:/root:/ |sed s#/home/Administrator#/root# >/etc/passwd mkgroup -l |sed s/なし/nobody/ >/etc/group

新規作成ファイルの権限

この設定をしないままファイルを新規に作成すると、Windows がファイルに共有属性をつけてしまいます。その対策として /etc/fstab を以下のようにします:

C:/cygwin64 / ntfs binary,auto,noacl,override 0 0 none /cygdrive cygdrive binary,posix=0,user,noacl 0 0

共有属性のついてしまったファイルの属性をリセットするには、Windows のコマンドラインから:

icacls * /reset /T

とします。これは、カレントフォルダ以下のファイルすべての属性をリセットします。つまり C:\cygwin64 にカレントフォルダを移動し、そのうえで実行する必要があります。

apt-cyg

mintty コンソールからパッケージを簡単にインストールできる apt-cyg を利用できるようにします。

まず、cmd.exe コマンドウィンドウで以下のように入力してください。パッケージのインストールが始まります。

setup-x86_64 -q -D -P wget,bzip2,tar,gawk,which -L

次のように入力し、apt-cyg を得ます。

wget rawgit.com/transcode-open/apt-cyg/master/apt-cyg

apt-cyg をインストールします。

install apt-cyg /bin

apt-cyg の設定のため、以下のように入力します。

apt-cyg mirror ftp://ftp.iij.ad.jp/pub/cygwin

これでインストールは終了です。

アプリケーション

Apache2 を使う

パッケージ httpd と cygrunsrv をインストールします。

管理者権限で mintty を実行、その中で cygserver-config を実行します。

cygserver を開始するため、以下のように入力します。

cygrunsrv -S cygserver

/etc/httpd/conf/httpd.conf に ServerName localhost:80 と一行追記します。

LoadModule で cgi_module をロードするようにコメント (#) を除去します。

Apache を起動するため、以下のように入力します。

/usr/sbin/apachectl start

Apache を終了する場合は、以下のように入力します。

/usr/sbin/apachectl stop

Apache を電源投入時に自動起動するなら、以下のように入力して Windows に認識させます。

cygrunsrv -I httpd -d "CYGWIN httpd" -p /usr/sbin/httpd

Apache は cygrunsrv -S httpd としてもエラーを返します。開始直後に自分から終了していますが、それが通常の動作です。

自動起動を操作する際は、以下のように入力します。

cygrunsrv -S httpd (開始) cygrunsrv -E httpd (停止) cygrunsrv -R httpd (削除) cygrunsrv -Q httpd (確認) cygrunsrv -L httpd (一覧)

CPAN を使う

以下のように入力します。

cpan o conf urllist unshift ftp://ftp.riken.jp/lang/CPAN/ o conf commit q

ImageMagick(PerlMagick)のコンパイル

ImageMagick.tar.gz を展開、以下のように入力します。Perl スクリプトで use Image::Magick が通るようになります。

libcrypt-devel が必要です。libjpeg-devel、libpng-devel は状況によっては入れた方がいいかもしれません。

/usr にインストールしないと cygserver の apache が ImageMagick を発見できません。

./configure --prefix=/usr --with-perl; make; make install

状況として MakeMaker.pm が見つからない場合は ln -s /lib/perl5/5.14/ /usr/lib/perl5/ とすれば解決します。MakeMaker.pm が @INC に通っている必要があります。バージョンは読み替えてください。

ビルドを通すために magick/magick-baseconfig.h の #define *HAVE_LOCALE_H をコメントアウトする必要があるかもしれません。

inetd を使って telnet サーバと ftp サーバを立てる

パッケージ inetutils と tcp_wrappers が必要です。

/etc/hosts.allow に telnetd (telnet サーバ) と ftpd (ftp サーバ) の設定を追加する必要があります。私は以下の二行を追加しています。

telnetd: 192.168.0.0/24 : allow ftpd: 192.168.0.0/24 : allow

/etc/inetd.conf のコメントを外します。具体的には、以下の二行です。

ftp stream tcp nowait root /usr/sbin/tcpd ftpd telnet stream tcp nowait root /usr/sbin/tcpd telnetd

マシン起動のたびに立ち上がるようにするため inetd をサービスとして登録します。以下のように入力してください。

cygrunsrv -I inetd -d "CYGWIN inetd" -p /usr/sbin/inetd -a -D

cygrunsrv -S inetd とすることで、inetd が動作します。

/etc/inetd.conf を書き換えることがあったら、kill -HUP `cat /var/run/inetd.pid` として inetd だけを再起動します。

/etc/ftpusers と /etc/ftpchroot の設定も必要かと思います。ここはその内容を説明する場所ではないので、ネットで linux の日本語 man ページを検索してください。

USER/PASS は Windows と同じものを使ってください。

FTP サーバに対応するファイアウォールの設定

管理者権限のある cmd.exe コマンドプロンプトで以下のように入力してください。

netsh advfirewall firewall add rule name="CYGWIN ftp service" action=allow protocol=TCP dir=in localport=21 netsh advfirewall firewall add rule name="CYGWIN ftpd.exe" action=allow dir=in program="(ftpd.exe の Windows 下でのフルパス)" enable=yes netsh advfirewall set global StatefulFtp enable

ftpd.exe のフルパスは環境により違うので、読み替えてください。このページでの場合は、C:\cygwin64\usr\sbin\ftpd.exe になります。

lynx の日本語表示

~/.profile に追記。

export LYNX_CFG=~/.lynxrc

/etc/lynx.cfg を一部変更します。

INCLUDE:~/.lynxrc CHARACTER_SET:utf-8 ASSUME_CHARSET:utf-8 ASSUME_LOCAL_CHARSET=utf-8 PREFERRED_LANGUAGE:ja_JP.utf-8 PREFERRED_CHARSET:ja

autotools

設定ファイル configure.ac

最低限の confiugre.ac は以下の通りです。

AC_INIT(プログラム名, バージョン) AC_CONFIG_SRCDIR(ソースファイル) AC_CONFIG_HEADERS(ヘッダファイル) AM_INIT_AUTOMAKE(foreign) AC_PROG_CXX AC_OUTPUT(Makefile)

「プログラム名」には、この configure でビルドするプログラム名を書くことが推奨されます。

「バージョン」は、1.0.0 のように、メジャー.マイナー.デバッグの三桁で書くことが推奨されています。文字列評価なので、0.98beta のような記述でも通りますが、一般的ではありません。

automake によりアーカイブを作るとき(make dist)、アーカイブ名が、プログラム名-バージョン.tar.gz という名前になります。

「ソースファイル」は、そのファイルがあるディレクトリ名を採用する目的なので、ファイル名自体は捨てられます。Makefile.am でかまいません。

「ヘッダファイル」は、プログラムから利用できる各種定義の出力先ファイル名です(C言語では define 文の羅列)。慣習的に config.h ですが、別の名称でもかまいません。

AM_INIT_AUTOMAKE は foreign にしておくと GNU で定義された規約が書かれたファイルの存在を確認しなくなります。

AC_PROG_CXX は、C++ コンパイラが使えるか、どのように使うことができるかを調べるよう命令するものです。

AC_OUTPUT は、出力する Makefile の名前を指定します。(Makefile) であるならカレントに Makefile を一つ出力します。サブディレクトリも扱うのであれば(Makefile.amの項のSUBDIRSで)、たとえば ./libs であるなら (libs/Makefile Makefile) のように並べて記述します。

通常、configure.ac は手で記述しなくても済むように autoscan というプログラムで生成する configure.scan ファイルを configure.ac と名前を変えて使います。その際は、以上の記述が参考になるでしょう。

設定ファイル Makefile.am

sample.h と sample.cpp から sample という実行ファイルを生成する Makefile.am は以下のようになります。

bin_PROGRAMS = sample sample_SOURCES = sample.h sample.cpp

_PROGRAMS には、ビルドするプログラム名を空白区切りで列記します。bin_PROGRAMS は、make install を実行した際にインストールされるプログラム名を記述します。ビルドをしてもインストールはしないプログラムは、noinst_PROGRAMS に記述します。

_SOURCES には、ビルドに使用するソースファイル名を空白区切りで列記します。sample_SOURCES は、実行ファイル sample で使うソースファイル名を指定するものです。実行ファイル名に別の、たとえば dummy を利用するなら、そのソースファイルを指定するために dummy_SOURCES が使えます。

設定ファイルの処理 autoreconf

configure.ac と Makefile.am を記述したら、autoreconf --install を実行してください。エラーがなければ各種ファイルが配置され、ビルドの準備が整います。

autoreconf は、複数のツールを適正な順番で呼び出す補助プログラムです。内部では aclocal、libtoolize、automake --add-missing、autoconf の順に呼び出しています。

サブディレクトリの利用

ビルドにサブディレクトリを利用する場合、たいていはライブラリの利用によりますが、Makefile.am から呼び出したい Makefile.am がサブディレクトリにあるなら、呼び出し元の Makefile.am に以下の記述を追加します。

SUBDIRS = サブディレクトリ名

「サブディレクトリ名」は、ビルド対象の Makefile.am があるサブディレクトリ名を空白区切りで列記します。たとえば libs と scripts をこの順で呼び出したいなら SUBDIRS = libs scripts のように記述します。

サブディレクトリ libs でライブラリ libs.a を作ってプログラム sample にリンクするには、以下のようにそれぞれのファイルの記述を変更します。

[ configure.ac ] AC_INIT(sample, バージョン) AC_CONFIG_SRCDIR(Makefile.am) AC_CONFIG_HEADERS(config.h) AM_INIT_AUTOMAKE(foreign) AC_PROG_CXX AC_PROG_RANLIB AC_OUTPUT(libs/Makefile Makefile) [ ./Makefile.am ] SUBDIRS = libs bin_PROGRAMS = sample sample_SOURCES = sample.h sample.cpp sample_LDADD = libs/libs.a sample_CXXFLAGS = -Ilibs [ ./libs/Makefile.am] noinst_LIBRARIES = libs.a libs_a_SOURCES = libs.h libs.cpp

configure.ac のあるディレクトリで autoreconf --install を実行します。

AC_PROG_RANLIB は、ライブラリのビルドに使うプログラムがどのように利用できるか調査させます。

_LIBRARIES は、ビルドするライブラリ名を空白区切りで列記します。ここでは noinst_LIBRARIES としていますが、インストールするなら lib_LIBRARIES とすると標準で /lib にインストールされます。

_LDADD には、リンクに使うプログラム ld に指定するライブラリ名を空白区切りで列挙します。

_CXXFLAGS は、C++ の場合、コンパイラに渡す追加オプションを記述します。-I はインクルードディレクトリの指定です。

libs_a_SOURCES のように、ファイル名の . は _ に置き換えます。

設定ファイルの自動生成 autoscan

configure.ac の生成を簡単にするため autoscan を使うこともあります。

サブディレクトリやカレントディレクトリに Makefile.am を書き、ソースファイルを配置し、カレントディレクトリで autoscan を実行すると configure.scan が出力されます。この記述を configure.ac に反映させていきます。内容は、別項で説明したものとほぼ同じです。AM_INIT_AUTOMAKE と AC_INIT の修正が主になります。AC_INIT の第三パラメータは連絡先メールアドレスとして設定ファイル (ここでは config.h) に出力されます。

AC_PROG_ や AC_C_ などの記述が configure.scan に出力されますが、できるだけ configure.ac に反映し、(C++では) config.h に出力される条件分岐用パラメータを使い、利用できる環境とできない環境の切り分けをする必要があります。AC_C_INLINE などが該当します。

libtool

configure.ac があるディレクトリで、以下を実行してください。

libtoolize --copy --force

必要なファイルがコピーされた後、このようなメッセージが出力されるので、そのとおりにします。

libtoolize: putting auxiliary files in `.'. libtoolize: linking file `./ltmain.sh' libtoolize: You should add the contents of the following files to `aclocal.m4': libtoolize: `/usr/share/aclocal/libtool.m4' libtoolize: `/usr/share/aclocal/ltoptions.m4' libtoolize: `/usr/share/aclocal/ltversion.m4' libtoolize: `/usr/share/aclocal/ltsugar.m4' libtoolize: `/usr/share/aclocal/lt~obsolete.m4' libtoolize: Remember to add `LT_INIT' to configure.ac. libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree. libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.

ここにあるように configure.ac に LT_INIT と AC_CONFIG_MACRO_DIR([m4]) の二行を書き足し、もう一度同じコマンドを実行すると、以下のメッセージが出力され、ファイルがコピーされます。

libtoolize: putting auxiliary files in `.'. libtoolize: copying file `./ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. libtoolize: copying file `m4/libtool.m4' libtoolize: copying file `m4/ltoptions.m4' libtoolize: copying file `m4/ltsugar.m4' libtoolize: copying file `m4/ltversion.m4' libtoolize: copying file `m4/lt~obsolete.m4' libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.

ACLOCAL_AMFLAGS = -I m4 という一行を Makefile.am に書き足し、autoreconf --install とします。

Makefile.am では、

lib_LTLIBRARIES = libname.la libname_la_SOURCES = libmain.cpp

のように、_LTLIBRARIES と拡張子 .la を使うことで、libtool の機能が働きます。

実際に利用した時 cannot find -lgcc_s というエラーが出ることがあります。これは、gcc のインストーラのバグです。libgcc_s.dll.a というファイルのインストール先が間違っているためで、これは lib/gcc/x86_64-pc-cygwin/lib/ に入っているので、lib/gcc/x86_64-pc-cygwin/4.10.0/ にコピーする必要があります。マシン名とバージョンは読み替えてください。


© 2014-2015 高崎 伸裕 (Nobuhiro Takasaki)