44690


## 経緯

標準の `nixos` box on Vagrant on VirtualBox に Ruby 処理系をインストールしようとしています。以下の
`Vagrantfile` があるディレクトリで作業しています。

[code]

    # Vagrantfile
    Vagrant.configure("2") do |config|
      config.vm.box = "nixos/nixos-18.03-x86_64"
    end
    
[/code]

`vagrant up` のあと `vagrant ssh` で NixOS 上のシェルに接続しました。  
そのあと nixpkgs から `nix-env -i ruby` で Ruby をインストールしようとしたのですが、出力の最後に `Killed`
と出て中断されてしまいます。終了ステータスは `137` であり、異常終了でした。以下はそのログです。

[code]

    $ vagrant ssh
    Last login: Fri Jun  8 13:38:06 2018 from 10.0.2.2
    
    [vagrant@nixbox:~]$ ruby
    ruby: command not found
    
    [vagrant@nixbox:~]$ nix-env -i ruby
    installing 'ruby-2.5.0'
    these paths will be fetched (3.61 MiB download, 17.82 MiB unpacked):
      /nix/store/j9l2p2c1yhgb227cbr9n4yrd3x2h92gp-ruby-2.5.0
    copying path '/nix/store/j9l2p2c1yhgb227cbr9n4yrd3x2h92gp-ruby-2.5.0' from 'https://cache.nixos.org'...
    Killed
    
    [vagrant@nixbox:~]$ echo $?
    137
    
    [vagrant@nixbox:~]$ ruby
    ruby: command not found
    
[/code]

NixOS に詳しくないため環境全体としておかしいのかもと思って試しに `nix-env -i wget`
としてみたのですが、こちらは正常終了し、`wget` がインストールされました。

## 質問

  * どうすれば正常に Ruby をインストールできるのでしょうか？
  * なぜ `nix-env -i ruby` が中断されてしまうのでしょうか？ 
    * どこかにログが残っているでしたら知りたいです。簡単に探した程度では見つかりませんでした。

## 環境

  * ホスト: Ubuntu 18.04 bionic, VirtualBox 5.2.12 r122591 (Qt5.9.5), Vagrant 2.1.1
  * Vagrant box: `nixos/nixos-18.03-x86_64`
  * Vagrant box 内の NixOS の情報:
[code]     [vagrant@nixbox:~]$ nixos-version

    18.03.131807.489a14add9a (Impala)
    
    [vagrant@nixbox:~]$ nix-env --version
    nix-env (Nix) 2.0
    
[/code]

## 追記: メモリについて

コメントでのご指摘を受け、メモリ不足かどうか確認するために2つの端末で `vagrant ssh` し、片方で `nix-env -i ruby`、他方で
`while sleep 1; do free -h; done` をしてみました。すると最初は下のような値だったものが、

[code]

    [vagrant@nixbox:~]$ while sleep 1; do free -h; done
                  total        used        free      shared  buff/cache   available
    Mem:           993M         39M        914M        3.4M         39M        862M
    Swap:            0B          0B          0B
    
[/code]

だんだんと free が減っていき、最終的に下の値で止まりました。

[code]

                  total        used        free      shared  buff/cache   available
    Mem:           993M        904M         63M        3.4M         25M        4.4M
    Swap:            0B          0B          0B
    
[/code]

`Killed` が表示されて `nix-env` が終了すると元の値に戻ったため、確かに Vagrant/VirtualBox
内のメモリを使い果たしているようです。


CC BY-SA 4.0
2018-06-08T14:11:33.620
44625
2018-06-11T10:25:09.627
2018-06-11T10:25:09.627
3054
19110
question
nix nixos nixpkgs
NixOS の nix-env が Killed とだけ表示されて終了してしまう


### メモリー不足による終了

`nix-env` は素直に使うとメモリーの消費量がとても多いようです。  
参照: [nix-env uses a ton of
memory](https://github.com/NixOS/nixpkgs/issues/38635)

システムの残メモリーが危機的に少なくなった際には、プロセスが目的を達成する前に終了してしまうことがあります。  
終了する理由は2通り考えられます。

  * OOM Killer に強制終了される
  * リソースの要求（メモリーの確保やプロセスの起動など）をOSに断わられ、プロセス自身が続行不可能と判断して終了する

質問のケースは `Killed` としか表示されていないので、おそらくOOM Killerによるものです。  
OOM Killerに強制終了された場合は、プロセス自身はログを残せません。  
システム側のログに残ると思います。  
例えば `systemd` を使用しているシステムであれば、

[code]

    journalctl |grep -iE 'oom|kill'
    
[/code]

のようにして強制終了のログを検索します。

### `nix-env` のメモリー消費を抑える方法

現在では、`--attr（-A）` オプションを使い、引数には単純なパッケージ名でなく "attribute path" を指定するのが一般的なようです。

[code]

    sudo nix-env -iA nixos.ruby
    
[/code]

この場合の `nixos.ruby`("attribute path") は、

[code]

    nix-env -qaP ruby
    
[/code]

で見つかりますが、この検索もメモリー不足で終了するかも知れません。  
そういった場合は、[NixOSのパッケージ検索ページ](https://nixos.org/nixos/packages.html)で調べることもできます。


CC BY-SA 4.0
2018-06-11T10:18:56.923
44690
2018-06-11T10:18:56.923
3054
44625
answer