Skip to content

4-2. chrootを用いたルート移動

それでは、chrootを用いてルートフォルダを移動させてみましょう!

【前提】この節で扱うsyscall

chroot

OSに登録されているルートフォルダを変更します。

go
func Chroot(path string) (err error)

ルートを移動させる

unix.Chrootを使ったルートフォルダ移動を、rootfs.goに実装してみましょう!
ルートフォルダになるべきディレクトリのパスは、RootfsConfigの構造体で関数に渡されます。

go
// rootfs設定
type RootfsConfig struct {
 // ルートファイルシステムのパス
 RootfsPath string `json:"rootfs_path"`
}
ヒント

カレントディレクトリを変更しないと、カレントディレクトリがルートの中に無いというおかしな状況になってしまいます。
os.Chdir()を使ってディレクトリを移動させてあげましょう。

想定解答

想定解答
go
func SetupRootfs(c RootfsConfig) error {
  // ルートディレクトリを変更
  if err := unix.Chroot(c.RootfsPath); err != nil {
    return errors.WithStack(err)
  }

  // カレントディレクトリをルートに
  if err := os.Chdir("/"); err != nil {
    return errors.WithStack(err)
  }

  return nil
}

ルートディレクトリが変わったことを確かめる

ルートディレクトリが変わったことを確かめましょう。
ルートディレクトリの変更にはroot権限が必要なので、sudo suを実行してrootになってからプログラムを実行して下さい。

シェルが開いた瞬間少し様子が変わっていたり、カレントディレクトリ/になっていたり、goコマンドが見つからなかったりと様々な違いが表れているはずです。

console
$ sudo su
# make run
go build -o main *.go
./main run bash
# go
bash: go: command not found
#