いけむランド

はてダからやってきました

誰も知らなかった Cygwin 1.7

以前、diff で見る cygwin 1.5 と 1.7 の違いみたいなエントリを書いた。

あの後に公式サイトにきちんとした変更の一覧が置かれたため、それを訳してみる。

相変わらず、難しい英文は直訳ベースにしており、変な日本語になっているところもありますので、よくわからないところは原文で確認をお願いします。


[最終更新 : 2010-02-07]

OS

ファイルシステム

  • マウントポイントの情報をレジストリに格納しないようにした。代わりに /etc/fstab と /etc/fstab.d/$USER を使う。mount(1) で生成されたマウントポイントはそのセッションでのみ有効で、すべての cygwin プロセスが終了した時に消滅する。
  • /, /usr/bin, /usr/lib のマウントポイントは自動的に生成されるため、/etc/fstab でこれらを指定する必要はない。
  • もしファイル名が現在の文字集合で表現できないならば、その文字は Ctrl-N + UTF-8 表現に変換される。これにより、現在の文字集合 (codepage) では正しく表現できないファイルにさえアクセスできるようになる。常に UTF-8 を使った正しい文字列を持つためには、環境変数 $LANG, $LC_ALL または $LC_CTYPE に正しい POSIX の値をセットすれば良い。例えば、cygwin.bat に以下のように記載する。
        set LC_CTYPE=en_US.UTF-8
  • PATH_MAX は 4096 でなる。内部的にはパス名は OS が扱うことが可能な長さ (32K) となる。
  • 構造体 dirent が d_type をサポート。d_type には DT_REG か DT_DIR がセットされる。性能面から他の場合は DT_UNKNOWN がセットされる。*1
  • 環境変数 CYGWIN
    • "ntsec" と "smbntsec" はマウントのオプションである "acl"/"noacl" に置き換えられる。
    • "ntea" は廃止される。
    • "check_case" はファイルシステムでサポートするため、廃止される。
  • ファイル名に以下のものが使えるようになる。
  • ファイル名は OS とファイルシステムがサポートしているならば、大文字小文字を区別するようになる。今のところ、NTFSNFS では使用できるが、FAT や Samba 共有では使用できない。使用するにはレジストリのキーの変更が必要で、マウントポイント毎にそれを無効にすることもできる。
  • 以上の変更により managed マウントも廃止される。*2
  • DOS のパス名は常に大文字小文字を区別せず、あたかも noacl, posix=0 でマウントされたもののように扱われ、POSIXパーミッションを考慮しない。
  • unlink(2) と rmdir(2) はファイル・ディレクトリがアクセスまたはロックされている場合に削除することは難しいが、これを隠し recycle bin ディレクトリと削除のためのファイルへのマークを利用することで実現した。
  • rename(2) をより POSIX 準拠になるように書き換えた。
  • access(2) は今は POSIX で要求される場合と同様にリアルなユーザ ID を使ったチェックを行う。実効ユーザ ID に基づくような以前の挙動をさせたい場合は faccessat(2) や euidaccess(2) API を通して行うことができる。
  • 構造体 stat に st_birthtim を追加した。
  • ファイルロックは現在は任意であり、必須ではない。fnctl(2) および新しい lockf(2) APIPOSIX のやり方に基づくロックを、flock(2) は BSD のやり方に基づくロックを行う。POSIX および BSD のロックは互いに独立している。
  • アトミックな O_APPEND モードを実装した。
  • open(2) のフラグで O_DIRECTORY, O_EXEC および O_SEARCH をサポートするようにした。*3
  • シンボリックリンクをする場合は「システム属性を持つプレーンファイル」形式のシンボリックリンクをデフォルトとする。Windows ショートカット形式のシンボリックリンクのみにしたい場合は環境変数 CYGWIN に winsymlinks をセットする。
  • シンボリックリンクは国際化のためにターゲットのファイル名に UTF-16 エンコーディングを使用している。Cygwin 1.7 はすべての古い形式のシンボリックリンクを読むことできるが、新しい形式 (のシンボリックリンク) は古い Cygwin との互換性はない。
  • Vista/2008 以降ではシンボリックリンクとして NTFS ネイティブシンボリックリンクを扱うことができる。(しかし、OS の制限から Vista/2008 のシンボリックリンクを生成することはできない。)
  • ネイティブの機構を利用して、NFS 共有を認識するようにした。NFS 共有で本当のシンボリックリンクを作成および認識でき、これにより stat(2) の正確な情報を取得できるようになり、open(2), mkdir(2) および chmod(2) で正しくモードをセットできるようになる。
  • NetApp DataOnTap を認識するようにした。また、i ノード番号の扱いを修正した。
  • Samba 開発者と交渉した拡張ヴァージョン情報を使う Samba 3.0.28a で始まるヴァージョンの Samba を認識するようにした。
  • ハードリンクをネイティブでサポートしてないファイルシステム (FAT, FAT32 など) で擬似的なハードリンクを実現するためのファイルのコピーをしないようにした。代わりに Linux のように単にエラーを返す。
  • 自分のドメイン・ワークグループのみではなく、// でアクセスすることのできるすべてのドメイン・ワークグループのリストを取得できるようにした。
  • API
    • Linux ライクな拡張属性 ([fl]getxattr, [fl]listxattr, [fl]setxattr, [fl]removexattr)
    • 新しいファイルパス変換 API (Win32 <-> POSIX) (cygwin_conv_path, cygwin_create_path, cygwin_conv_path_list)
    • 新しい openat 関数 : openat, faccessat, fchmodat, fchownat, fstatat, futimesat, linkat, mkdirat, mkfifoat, mknodat, readlinkat, renameat, symlinkat, unlinkat
    • その他の新しい API : posix_fadvise, posix_fallocate, funopen, fopencookie, open_memstream, open_wmemstream, fmemopen, fdopendir, fpurge, mkstemps, eaccess, euidaccess, canonicalize_file_name, fexecve, execvpe

ネットワーク

  • POSIX 互換のスレッド・プロセス間でソケットの共有をできるようにするためのソケットのブロッキングと select を新たに実装した。
  • send/sendto/sendmsg は WinSock の内部バッファの問題 (KB 201213) で現在 64K 単位でデータを送信するようになっている。
  • send/recv でフラグ MSG_DONTWAIT をサポート。*4
  • IPv6 をサポート。
    • API : getaddrinfo, getnameinfo, freeaddrinfo, gai_strerror, in6addr_any, in6addr_loopback
    • IPv6 のないシステムでは IPv4 のための代替関数を用意している。
    • IPv6 のあるシステムでは WinSock 関数を使用している。
    • POSIX と同等の機能性を利用しにくい上に getaddrinfo や他の機能を完全に準拠している実装は Vista/2008 以降でのみ使用可能であることを留意しておいて欲しい。
  • 解決関数 (res_init, res_query, res_search, res_querydomain, res_mkquery, res_send, dn_comp, dn_expand) は現在、cygwin の一部である。アプリケーションはもはや minres (libminires.a) とリンクする必要はない。
  • rcmd は WinSock 関数を呼ぶ代わりに現在 cygwin 内部で実装されている。これにより WinSock からこの関数が切り離された Vista/2008 での rsh(1) の使用が可能である。
  • マルチキャストのための構造体を netinet/in.h に定義した。Vista/2008 以降でのみ完全に準拠したマルチキャストをサポートしていることに注意。
  • get_ifconf を改善した。構造体 ifreq と関連したデータ構造により多くの情報を保持できるように再定義した。SIOCGIFINDEX, SIOCGIFDSTADDR および Cygwin 特有の SIOCGIFFRNDLYNAM をサポート。また、システムがサポートする物理インタフェースのフラグもサポート。
  • その他の新しい API : bindresvport, bindresvport_sa, gethostbyname2, iruserok_sa, rcmd_af, rresvport_af, getifaddrs, freeifaddrs, if_nametoindex, if_indextoname, if_nameindex, if_freenameindex
  • /proc/net/if_inet6 を追加した。

バイス

  • より信頼でき中断可能なパイプと FIFO を生成するためにオーバーラップされた I/O を使うパイプを再実装した。
  • 環境変数 CYGWIN におけるオプション "binmode" を廃止した。
  • Windows ネイティブの名前付きパイプを使うことで FIFO の処理を改善した。
  • パイプのように見える標準入出力が tty であることを検出できるようにした。特にこれにより、同じ tty をデバッガとして使用していることをデバッグされているアプリケーションに認識させることができる。
  • コンソールでの utf-8 をサポート。
  • コンソールウィンドウでは Linux コンソールや xterm と同じように backspace を押下すると、BS (0x08) ではなく、DEL (0x7f) が発行される。Alt-Backspace を押下すると、DEL (0x7f) ではなく、ESC-DEL (0x1b, 0x7f) が発行される。また、Ctrl-space を押下すると、ASCII ヌル (0x0) 文字が発行される。
  • 64 個までのシリアルインタフェース (/dev/ttyS0 〜 /dev/ttyS63) をサポート。
  • 128 個までの raw ディスクドライブ (/dev/sda 〜 /dev/sddx) をサポート。
  • 新しい API : cfmakeraw, get_avphys_pages, get_nprocs, get_nprocs_conf, get_phys_pages, posix_openpt

POSIX

  • たくさんの文字集合を setlocale() 呼び出し経由でサポートするようにした。環境変数 $LANG, $LC_ALL $LC_CTYPE が使用されるであろう。例えば、Cygwin セッションを開始する前に環境変数 $LANG を「de_DE.ISO-8859-15」にセットすることで、すべてのセッションで文字集合 ISO-8859-15 が使用される。UTF-8 も同様に「en_US.UTF-8」としてサポートされる。
  • サポートされている文字集合 : "ASCII", "ISO-8859-x" with x in 1-16, except 12, "UTF-8", Windows codepages "CPxxx", with xxx in (437, 720, 737, 775, 850, 852, 855, 857, 858, 862, 866, 874, 1125, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258), "SJIS", "GBK", "eucJP", "eucKR", "Big5"
    • 前方の言語および領土の部分 (例えば en_US) が今はまだ cygwin では使用していないが、POSIX との互換性のために要求するようにする。
  • スレッド毎の並行読み出しのロックを pthread_rwlock_t でサポート。
  • POSIX のように pthread_kill(thread, 0) を実装した。
  • IPC 向けの新しい API
    • 名前付きセマフォ : sem_open, sem_close, sem_unlink
    • メッセージキュー : mq_open, mq_getattr, mq_setattr, mq_notify, mq_send, mq_timedsend, mq_receive, mq_timedreceive, mq_close, mq_unlink
    • 共有メモリ : shm_open, shm_unlink
  • で宣言されている関数のみが宣言されるように、このヘッダから がインクルードされないようにした。*5
  • waitpid と wait4 のために WCONTINUED, WIFCONTINUED() が追加された。
  • 新しい API : _Exit, confstr, insque, remque, sys_sigabbrev, posix_madvise, posix_memalign, reallocf, exp10, exp10f, pow10, pow10f, lrint, lrintf, rint, rintf, llrint, llrintf, llrintl, lrintl, rintl, mbsnrtowcs, strcasestr, stpcpy, stpncpy, wcpcpy, wcpncpy, wcsnlen, wcsnrtombs, wcsftime, wcstod, wcstof, wcstoimax, wcstok, wcstol, wcstoll, wcstoul, wcstoull, wcstoumax, wcsxfrm, wcscasecmp, wcsncasecmp, fgetwc, fgetws, fputwc, fputws, fwide, getwc, getwchar, putwc, putwchar, ungetwc, asnprintf, dprintf, vasnprintf, vdprintf, wprintf, fwprintf, swprintf, vwprintf, vfwprintf, vswprintf, wscanf, fwscanf, swscanf, vwscanf, vfwscanf, vswscanf

セキュリティ

  • ドメインユーザのグループの取得がうまくいけば、より強固になった。
  • cygwin には現在 LSA 認証パッケージが付属している。これは /bin/cyglsa-config スクリプトを使用して、特権ユーザが手動でインストールしなければならない。これについては http://cygwin.com/ml/cygwin-developers/2006-11/msg00000.html に記載されている。
  • cygwin では現在、レジストリの隠し領域にユーザのパスワードを格納できるようになっている。これは cygwin がユーザコンテキストをスイッチするために特権プロセスによって呼ばれる時に試される。これは、例えば、すべてのネットワークへのアクセス権を持つ SSH 公開鍵のセッションに他のマシンで共有されている資源へのアクセスを許す。
  • mkpasswd と mkgroup ツールはその仕様が変わり、新しいオプションは複数のマシンや異なるドメイン環境における操作の一貫性を維持しやすくするものとなっている。

その他

  • Linux のような ldd ユーティリティを新しく追加した。
  • 新しいリンクライブラリ libdl.a, libresolve.a, librt.a を追加した。
  • 長いパス名の切り捨て : もし、作業ディレクトリ名が 260 バイトより長いか、(/proc, /cygdrive, //server のような) 仮想パスである場合はそれらのパスを解釈できない Win32 のネイティブプログラムを呼ばないようにした。
  • DOS のパス (C:\foo, \\foo\bar など) を最初に使用した時に Cygwin DLL は DOS のパス名は使うべきではないというゾッとするような警告を出す。これを無効にするには環境変数 CYGWIN に "nodosfilewarning" をセットする。
  • 環境変数 CYGWIN におけるオプション "server" を廃止した。Cygwin は利用可能であるならば自動的に cygserver を使用する。
  • 環境変数のサイズの制限 32K を廃止し、任意のサイズを使用できるようにした。
  • cygwin プロセスから起動した時に環境変数を大文字に強制的に変更しないようにした。常に大文字である Windows および POSIX の変数以外は元のままを保持する。以前のような挙動に戻すには環境変数 CYGWIN に "upcaseenv" をセットする。
  • プロセスの起動時に存在しない DLL を検出・報告する。
  • 64 ビットのシステムでは 32/64 ビットのそれぞれのレジストリにアクセスするために /proc/registry{32,64} を追加した。
  • レジストリ内の同じ部分木の中で同じ名前を持つレジストリのキーと値を区別する方法を追加した。キーが "foo" と呼ばれる場合は値は "foo%val" と呼ばれる。
  • /proc/cpuinfo のフォーマットをより Linux のものに近づけた。
  • エントリ /proc/$PID/mounts を追加し、Linux のようにシンボリックリンク /proc/mounts が /proc/self/mounts を指すようにした。
  • strstr および memmem の実装を最適化した。
  • 古いシグナルマスクの下位互換性を排除した。(シグナルマスクを使用しているとても古いプログラムはもうきちんと動かないかもしれない。)
  • Cygwin からは共有ライブラリ間で完全な C++ 標準に準拠した実装のためのツールチェインをサポートするために標準 C++ ライブラリ (libstdc++) の new および delete 演算子のためのラッパー関数をエクスポートしている。
  • 異なるパスにインストールされた cygwin 環境はお互いを意識せずに並列に実行することが可能である。プロセス内の cygwin DLL のパスは IPC オブジェクトが生成される時に使われるキーとなる。よって、異なる cygwin DLL は異なる名前空間で実行される。
  • それぞれの cygwin DLL はレジストリにそのパスとインストールキーを格納する。これにより、複数の並行した cygwin 環境による問題の解決が可能になる。

*1:d_type の取りうる値については http://www.linux.or.jp/JM/html/LDP_man-pages/man2/getdents.2.html を参照のこと

*2:namaged マウントについては managed オプションを利用したマウント を参照のこと

*3:open の取りうるフラグについては open を参照のこと

*4:send の取りうるフラグについては http://www.linux.or.jp/JM/html/LDP_man-pages/man2/send.2.html を参照のこと

*5:1.5 では #include が書かれていた。