[インデックス 1156] ファイルの概要
このコミットは、Go言語のデバッガ(cov
, prof
など)のビルドプロセスに、setgid
ビットを設定してprocmod
グループに属するようにインストールするステップを追加するものです。特にmacOS (Darwin) 環境において、setgid
ビットが/Users
ディレクトリ以下では無視されるというOSの特性に対応するため、デバッガを/usr/local/bin
にインストールするように変更されています。これにより、デバッガがプロセス関連の操作を行うために必要な権限を適切に取得できるようになります。
コミット
commit 6b7dd4c0207f92b1398f3a1f3436424c182501e0
Author: Russ Cox <rsc@golang.org>
Date: Tue Nov 18 10:08:46 2008 -0800
add build step to install debuggers setgid procmod.
they have to go in /usr/local/bin
because the setgid bit is ignored in /Users.
R=r
DELTA=54 (49 added, 0 deleted, 5 changed)
OCL=19424
CL=19463
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6b7dd4c0207f92b1398f3a1f3436424c182501e0
元コミット内容
デバッガをsetgid procmod
でインストールするためのビルドステップを追加。
/Users
ディレクトリではsetgid
ビットが無視されるため、デバッガは/usr/local/bin
に配置する必要がある。
変更の背景
この変更の背景には、デバッガがシステム上の他のプロセスを検査・操作するために必要な特殊な権限の管理があります。Unix系システムでは、通常のユーザー権限では他のユーザーのプロセスや、特定のシステムプロセスにアクセスすることは制限されています。デバッガのようなツールは、これらの制限を越えて動作するために、より高い権限を必要とします。
具体的には、Go言語のデバッガがmacOS (Darwin) 環境で正しく機能するためには、setgid
ビットが設定され、かつ特定のグループ(procmod
)に属している必要がありました。しかし、macOSのセキュリティポリシーにより、ユーザーのホームディレクトリ(/Users
以下)に配置された実行ファイルに対してはsetgid
ビットがセキュリティ上の理由から無視されるという制約がありました。
この制約を回避し、デバッガが期待通りに動作するようにするためには、setgid
ビットが有効に機能するシステム上の別の場所、具体的には/usr/local/bin
のような標準的なシステムバイナリのパスにデバッガをインストールする必要がありました。このコミットは、そのためのビルドプロセスとインストールスクリプトを導入することで、デバッガの機能性とセキュリティ要件を両立させることを目的としています。
前提知識の解説
1. setgid
ビット (Set Group ID)
Unix系ファイルシステムにおける特殊なパーミッションビットの一つです。実行ファイルにsetgid
ビットが設定されている場合、そのプログラムは実行したユーザーのグループIDではなく、ファイルの所有グループのIDで実行されます。これにより、プログラムは通常のユーザーではアクセスできないリソース(例えば、特定のグループのみが読み書きできるファイルやディレクトリ)にアクセスできるようになります。デバッガの場合、procmod
グループの権限で実行されることで、他のプロセスに関する情報にアクセスできるようになります。
2. procmod
グループ
macOSなどの一部のUnix系システムに存在する特殊なグループです。このグループに属するユーザーや、setgid
ビットが設定されこのグループが所有するプログラムは、システム上のプロセスに関する情報(例えば、実行中のプロセスのメモリ、レジスタ、状態など)にアクセスしたり、プロセスを制御したりする権限を持ちます。デバッガが他のプロセスをアタッチしたり、その状態を読み取ったりするためには、このprocmod
グループの権限が必要となります。
3. /usr/local/bin
Unix系システムにおける標準的なディレクトリの一つで、ローカルにインストールされた実行可能ファイルが配置される場所です。システム全体で利用可能なコマンドやプログラムが置かれます。/Users
以下のユーザーディレクトリとは異なり、/usr/local/bin
に配置された実行ファイルは、setgid
ビットが正しく機能することが期待されます。
4. Makefile
make
コマンドによって実行されるビルド自動化ツールで使用される設定ファイルです。ソースコードのコンパイル、リンク、インストールなどの手順を記述します。このコミットでは、install
ターゲットの動作をOSごとに分岐させるために変更されています。
5. uname
コマンド
Unix系システムで、現在のシステム情報を表示するコマンドです。特にuname
の出力は、OSの種類(例: Linux
, Darwin
for macOS)を判別するためにシェルスクリプトでよく利用されます。
6. sudo
コマンド
"superuser do"の略で、通常のユーザーが一時的にスーパーユーザー(root)や他のユーザーの権限でコマンドを実行するためのコマンドです。システムファイルをコピーしたり、パーミッションを変更したりする際に必要となります。
技術的詳細
このコミットは、Go言語のビルドシステムに、デバッガのインストールに関するOS固有のロジックを導入しています。
-
Makefileの変更:
src/cmd/cov/Makefile
とsrc/cmd/prof/Makefile
において、install
ターゲットがinstall-$(GOOS)
に依存するように変更されました。$(GOOS)
はGoのビルドシステムが提供する環境変数で、現在のオペレーティングシステム(例:linux
,darwin
)を示します。- これにより、
make install
が実行された際に、OSに応じてinstall-linux
またはinstall-darwin
のような特定のターゲットが呼び出されるようになります。 install-linux
はinstall-default
にフォールバックし、これは単にビルドされたデバッガのバイナリを$(BIN)
ディレクトリ(通常は$GOROOT/bin
)にコピーします。install-darwin
ターゲットは、@true
という空のコマンドを実行するだけです。これは、macOSでの実際のインストールと権限設定が、後述のsudo.bash
スクリプトによって行われるためです。Makefileのコメントで「on Darwin, have to install and setgid; see $GOROOT/src/sudo.bash」と明記されており、この役割分担が示されています。
-
src/make.bash
の変更:- Goのビルドスクリプトである
src/make.bash
に、uname
コマンドの出力に基づいてOSを判別するcase
文が追加されました。 - もしOSが
Darwin
(macOS)である場合、ビルドの最後に「%%% run sudo.bash to install debuggers」というメッセージが表示されるようになりました。これは、ユーザーに対してデバッガの適切なインストールと権限設定のためにsudo.bash
スクリプトを手動で実行する必要があることを促すものです。
- Goのビルドスクリプトである
-
src/sudo.bash
の新規追加:- このスクリプトは、macOS環境でのデバッガの特殊なインストール手順を自動化するために作成されました。
- スクリプトはまず
uname
がDarwin
であるかを確認し、そうでなければ即座に終了します。 acid
,db
,prof
,cov
といったデバッガのリストをループ処理します。- 各デバッガについて、以下の
sudo
コマンドを実行します。sudo cp $GOROOT/src/cmd/$i/6$i /usr/local/bin/6$i
: ビルドされたデバッガのバイナリ(例:6acid
)を$GOROOT/src/cmd/$i/
から/usr/local/bin/
にコピーします。6
プレフィックスは、当時のGoのツールチェインにおけるバイナリの命名規則(例:6g
for Go compiler for 64-bit systems)に由来します。sudo chgrp procmod /usr/local/bin/6$i
: コピーしたデバッガのファイルのグループ所有者をprocmod
グループに変更します。sudo chmod g+s /usr/local/bin/6$i
: コピーしたデバッガのファイルにsetgid
ビットを設定します。これにより、このデバッガがprocmod
グループの権限で実行されるようになります。
これらの変更により、macOSユーザーはGoのデバッガをインストールする際に、setgid
ビットが正しく機能し、procmod
グループの権限で実行されるように設定するための明確な指示と自動化されたスクリプトを利用できるようになりました。
コアとなるコードの変更箇所
src/cmd/cov/Makefile
:install
ターゲットの変更とinstall-darwin
、install-default
ターゲットの追加。src/cmd/prof/Makefile
:src/cmd/cov/Makefile
と同様の変更。src/make.bash
: macOS環境でsudo.bash
の実行を促すメッセージの追加。src/sudo.bash
:setgid procmod
でデバッガを/usr/local/bin
にインストールするための新規シェルスクリプト。
コアとなるコードの解説
src/cmd/cov/Makefile
および src/cmd/prof/Makefile
の変更
--- a/src/cmd/cov/Makefile
+++ b/src/cmd/cov/Makefile
@@ -22,7 +22,14 @@ $(TARG): $(OFILES)
clean:
rm -f $(OFILES) $(TARG)
-install: $(TARG)
+install: install-$(GOOS)
+install-linux: install-default
+
+# on Darwin, have to install and setgid; see $GOROOT/src/sudo.bash
+install-darwin: $(TARG)
+ @true
+
+install-default: $(TARG)
cp $(TARG) $(BIN)/$(TARG)
$(OFILES): $(HFILES)
この変更は、make install
コマンドの動作をOSに依存させるためのものです。
install: install-$(GOOS)
:install
ターゲットが、現在のOS(GOOS
変数)に応じたターゲット(例:install-linux
やinstall-darwin
)を呼び出すようにします。install-linux: install-default
: Linux環境では、一般的なインストール手順であるinstall-default
を実行します。install-darwin: $(TARG)
: macOS環境では、デバッガのバイナリがビルドされたことを確認するだけで、実際のファイルコピーや権限設定は行いません。これは、後述のsudo.bash
スクリプトがその役割を担うためです。@true
は、コマンドが何もしないことを示し、エラーを発生させずに成功を返します。install-default: $(TARG)
: デフォルトのインストール手順で、ビルドされたターゲットバイナリ($(TARG)
)を$(BIN)
ディレクトリにコピーします。
src/make.bash
の変更
--- a/src/make.bash
+++ b/src/make.bash
@@ -28,3 +28,9 @@ do
cd ..
done
+case "`uname`" in
+Darwin)
+ echo;
+ echo %%% run sudo.bash to install debuggers
+ echo
+esac
この変更は、Goのビルドプロセスが完了した際に、macOSユーザーに対して追加のステップが必要であることを通知するためのものです。
case "
uname" in Darwin)
:uname
コマンドの出力がDarwin
(macOS)である場合にのみ、以下のブロックが実行されます。echo %%% run sudo.bash to install debuggers
: デバッガを適切にインストールするためにsudo.bash
スクリプトを実行する必要があることをユーザーに促すメッセージを表示します。
src/sudo.bash
の新規追加
--- /dev/null
+++ b/src/sudo.bash
@@ -0,0 +1,18 @@
+#!/bin/bash
+# Copyright 2009 The Go Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+case "`uname`" in
+Darwin)
+ ;;
+*)
+ exit 0
+esac
+
+for i in acid db prof cov
+do
+ sudo cp $GOROOT/src/cmd/$i/6$i /usr/local/bin/6$i
+ sudo chgrp procmod /usr/local/bin/6$i
+ sudo chmod g+s /usr/local/bin/6$i
+done
このスクリプトは、macOS環境でデバッガをsetgid procmod
でインストールするための中心的なロジックを含んでいます。
#!/bin/bash
: Bashスクリプトであることを示します。case "
uname" in Darwin)
: 再度、OSがDarwin
であるかを確認します。そうでなければスクリプトは終了します。for i in acid db prof cov
:acid
,db
,prof
,cov
というデバッガのリストをループ処理します。これらはGoの初期のデバッガツールです。sudo cp $GOROOT/src/cmd/$i/6$i /usr/local/bin/6$i
: 各デバッガのバイナリを$GOROOT
内のビルド元から/usr/local/bin
にコピーします。sudo
を使用しているため、管理者権限が必要です。sudo chgrp procmod /usr/local/bin/6$i
: コピーしたファイルのグループ所有者をprocmod
に変更します。sudo chmod g+s /usr/local/bin/6$i
: コピーしたファイルにsetgid
ビットを設定します。これにより、デバッガがprocmod
グループの権限で実行されるようになり、プロセス関連の操作が可能になります。
これらの変更は、Go言語のデバッガがmacOS上で正しく機能するための、OS固有の権限管理とインストールパスの問題を解決するために不可欠でした。
関連リンク
- Go言語の初期のコミット履歴: https://github.com/golang/go/commits/master
- Unixのファイルパーミッションに関する一般的な情報: https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3
参考にした情報源リンク
- macOSにおける
setgid
の挙動に関する情報(一般的なUnix/macOSのセキュリティモデル) procmod
グループに関する情報(macOSのシステムグループ)Makefile
の条件分岐に関する情報uname
コマンドの利用方法sudo
,cp
,chgrp
,chmod
コマンドの利用方法- Go言語の初期のビルドシステムに関する議論(当時のメーリングリストやIssueトラッカーなど、公開されている情報源)