はじめまして、株式会社アジャストの渕上と申します。

本日より弊社スタッフブログをはじめることになりました。
私含めた数人で、Web開発技術回りの話題を提供していければと思います。

実は私、このブログの企画が決まった時に軽い気持ちで
第一回目の更新担当に立候補してしまったのですが、
いったいなぜ安請け合いしてしまったのか。。

原稿の締切が迫っているにも関わらず、まだ記事のテーマも決められていません。
できれば今すぐこのwebサーバごとなかったことにしたい気持ちです。

うーん。どうしたらなかったことにできるでしょうか。

  1. データセンタに乗り込んで物理的に破壊する
  2. 企画会議の偉い人を亡き者にする
  3. webサーバからすべてのファイルを消し去る

1.と2.はハードルが高そうですし、そもそも犯罪です。

3.はどうでしょうか。
幸い私はsudo権限をもっていますし、シェルコマンドに対するささやかな知識を持っています。
そうですね、sudo rm -rf /でも実行してやれば一発です。

ブログの企画自体がなくなることはないと思いますが、
「とつぜんLinuxがばくはつした」とでも報告しておけば、公開日の延期くらいはできるでしょう。

とはいえ、sudo rm -rf /なんて実行したことは今までにありませんので、いきなり本番環境で実行するのは不安があります。
まずは充分な試験を行ったうえで計画を実行したいと思います。

善は急げ、さっそくテスト環境を作りましょう。
普段、私はVMWarePlayerを使っているのですが、前々からVagrantが気になっていました。
今回はVirtualBoxとVagrantを使って、仮想環境を構築したいと思います。

(すぐにsudo rm -rf /の結果が見てみたいという方は、こちらからどうぞ)

仮想環境のセットアップ

今回はWindows8.1にCentos6.5の仮想環境を構築します。

VirtualBoxのインストール

virtualbox.orgのダウンロードページから、最新版をダウンロードします。今回は4.3.28をダウンロードしました。
インストーラに従ってインストールします。

Vargrantのインストール

vagrantup.comのダウンロードページから、最新版をダウンロードします。今回は1.7.2をダウンロードしました。
インストーラに従ってインストールします。

Vagrantを使ってVirtualBoxにBoxを追加する

VirtualBox,Vagrantのインストールが完了したら、ひな形となるVM(Boxといいます)を追加しましょう。
Vagrantで利用できるBoxは、数多くネット上で公開されています。
vagrantbox.esに一覧がまとめられていますので、好きなOSのBoxを追加しましょう。

ダウンロードはvagrant box addというコマンドで行うことができます。

(コマンドの書式)
vagrant box add <追加するBoxの管理名> {BoxのURL}

今回は、CentOS6.5のBoxを、centos65という名前で追加しました。
コマンドプロンプトを立ち上げて、下記のコマンドを実行します。

vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

仮想環境を立ち上げる

次に、追加したBoxを使って仮想環境を初期化します。
初期化は、vagrant init <Box名>で行うことができます。

今回はZドライブにVagrantVMs\Centos65というディレクトリを作り、
その中に仮想環境を作ることにしました。
コマンドプロンプトを立ち上げて、下記のコマンドを実行します。

cd /d Z:\
mkdir VagrantVMs\Centos65
cd VagrantVMs\Centos65
vagrant init centos65

Vagrantfileの編集

vagrant initを実行すると、実行したディレクトリにVagrantfileというファイルが自動生成されます。
このファイルをテキストエディタで編集し、少しだけ設定を変更しましょう。

22行目~34行目あたりに、ネットワーク設定例が記載されています。
今回は自分のPCから接続できればよいので、ホストオンリーネットワークを選択します。
コメントアウトされている下記行頭の#を削除し、ホストオンリーネットワークを有効にしました。

# config.vm.network "private_network", ip: "192.168.33.10"

次にvagrant upコマンドを実行して、仮想環境を立ち上げます。

仮想環境にログインする

仮想環境を立ち上げることができました。

早速普段使っているターミナルエミュレータを使ってsshしてみましょう。
“vagrant”という初期ユーザが準備されているので、”vagrant”ユーザでsshします。
“vagrant” ユーザのパスワードには”vagrant”が設定されています。

$ ssh vagrant@192.168.33.10
vagrant@192.168.33.10's password:
Last login: Tue Jun 23 11:22:15 2015 from 192.168.33.1
[vagrant@vagrant-centos65 ~]$

無事ログインが完了し、試験の準備が整いました。

すぐにでもsudo rm -rf /と行きたいところですが、
このコマンドを実行して仮想環境が壊れてしまったら、
2度目以降の試験はどのように行うことになるのでしょう。

またvagrant initからやり直し?
簡単に仮想環境が立ち上げられるとはいえ、ちょっとめんどくさいですね。

Vagrantには様々なプラグインが公開されており、簡単に機能を追加することができるようです。
少し調べたところ、スナップショットを提供するプラグインが公開されていましたので、これを追加してみたいと思います。

スナップショットは仮想環境の状態を保存して、好きな時に保存した状態に差し戻せる機能です。

スナップショットのインストールとテスト

vagrant plugin install <plugin名>というコマンドでプラグインを追加することができます。
コマンドプロンプトを立ち上げてスナップショットプラグインをインストールします。

cd /d Z:\VagrantVMs\Centos65
vagrant plugin install vagrant-vbox-snapshot

vagrant snapshot take <snapshot名>でスナップショットを取ることができます。
スナップショットの状態に戻るにはvagrant snapshot go <snapshot名>すればOKです。

スナップショットをとって、2回目以降の試験に備えます。

vagrant snapshot take first

試験の実施

sudo rm -rf / の実行

長い戦いの終局も目前です。万全の試験環境が整いました。
イメージは大切です。本番サーバでの実行をイメージして、試験を行います。
勝利の時はきた!ときに慎重に、ときに大胆にタイピングを!天を貫くように、人差し指を高らかに挙げ、勢いよくEnterを!

[vagrant@vagrant-centos65 ~]$ sud

世界は再構成され、すべてなかったことに、なり・・・

[vagrant@vagrant-centos65 ~]$ sudo r

なり・・・

[vagrant@vagrant-centos65 ~]$ sudo rm -rf /

なり・・・

[vagrant@vagrant-centos65 ~]$ sudo rm -rf /
rm: it is dangerous to operate recursively on `/'
rm: use --no-preserve-root to override this failsafe

なりませんでした。
変わりに、警告が出力されています。

manコマンドでrmのマニュアルを参照すると、’–no-preserve-root'(/を削除する)と’–preserve-root'(/を削除しない)があり、通常は’–preserve-root’が設定されている扱いのようです。
確かに、ホイホイ’/’が削除できては困ってしまいますね。

[vagrant@vagrant-centos65 ~]$ man rm
(略)
       --no-preserve-root
              do not treat ‘/’ specially

       --preserve-root
              do not remove ‘/’ (default)
(略)

sudo rm -rf –no-preserve-root / の実行

気を取り直して、’–no-preserve-root’つきのコマンドを実行してみます。
やはりイメージは大切です。本番サーバでの実行をイメージして、試験を行います。
訪れるのは、俺が望んだ世界なり!すべては運命石の扉の選択である!

[vagrant@vagrant-centos65 ~]$ sudo rm -r

これで世界は再構成され、すべてなかったことに、なり・・・

[vagrant@vagrant-centos65 ~]$ sudo rm -rf --no-prese

なり・・・

[vagrant@vagrant-centos65 ~]$ sudo rm -rf --no-preserve-root /

なり・・・

[vagrant@vagrant-centos65 ~]$ sudo rm -rf --no-preserve-root /
(略)
rm: cannot remove `/proc/8140/wchan': Permission denied
rm: cannot remove `/proc/8140/stack': Permission denied
rm: cannot remove `/proc/8140/schedstat': Permission denied
rm: cannot remove `/proc/8140/cpuset': Permission denied
rm: cannot remove `/proc/8140/cgroup': Permission denied
rm: cannot remove `/proc/8140/oom_score': Permission denied
rm: cannot remove `/proc/8140/oom_adj': Permission denied
rm: cannot remove `/proc/8140/oom_score_adj': Permission denied
rm: cannot remove `/proc/8140/loginuid': Permission denied
rm: cannot remove `/proc/8140/sessionid': Permission denied
rm: cannot remove `/proc/8140/coredump_filter': Permission denied
rm: cannot remove `/proc/8140/io': Permission denied

なったのか?
出力を読んだ限りプロセス情報が消せなかったようですが、いま仮想環境はどんな状態なんでしょうか。

[vagrant@vagrant-centos65 ~]$ ls
-bash: /bin/ls: No such file or directory
[vagrant@vagrant-centos65 ~]$ pwd
/home/vagrant
[vagrant@vagrant-centos65 ~]$ cd /
[vagrant@vagrant-centos65 /]$ ls
-bash: /bin/ls: No such file or directory
[vagrant@vagrant-centos65 /]$ ls /bin
-bash: /bin/ls: No such file or directory
[vagrant@vagrant-centos65 /]$ cd /bin
-bash: cd: /bin: No such file or directory

なんだかよくわからないが、とにかく普通の状態ではないようです。
端末をもう一つ立ち上げて、SSHしてみます。

$ ssh vagrant@192.168.33.10
Read from socket failed: Connection reset by peer

SSHもできない状態です。ひとまず、当初の目的は達成できたと思います。

念のためスナップショットから差し戻して、再度テストしてみます。
コマンドプロンプトを立ち上げて、下記のコマンドを実行します。

Z:\VagrantVMs\Centos65>vagrant snapshot go first
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or,
get an ID of a target machine from `vagrant global-status` to run
this command on. A final option is to change to a directory with a
Vagrantfile and to try again.

なぜか、スナップショットから差し戻しができません。
先にvagrant init してVagrantの環境を作れと怒られてしまいました。

どうやらゲストOSにこのフォルダがマウントされていたため、
Vagrantfileまで削除されてしまったようです。

この試験を継続的に行うには、設定の見直しが必要そうです。

終わりに

さて、いかがだったでしょうか。

rmコマンドで’/’を削除しようとしたことがなかったため、’–no-preserve-root’オプションを初めて知りました。

manコマンドでいくつかのコマンドを調べたところ、chownやchmodにも同じオプションがあるようです。
chown/chmodはデフォルトが’–no-preserve-root’でした。
フェイルセーフになっていないような気がしますが…どういう意味があるのでしょうか。コマンドの世界は奥が深いです。

また、私は今回初めてVagrantとVirtualBoxを使った環境構築を行ったのですが、
簡単に環境が構築できることに驚きました。
今後新たに開発する案件では、積極的に使っていきたいと思います。

本番環境の破壊は、、もう疲れしまったので別の機会にしたいと思います!