LinuxとかOSSのこととか

Linux (主にNixOS) や OSS に関する取り組みを記述するブログ。

NixOS を始める 起動編

はじめに

この記事は Linux Advent Calendar 2018の4日目の記事です。この記事は前回の記事の続きですが、ちょうど Advent Calendar の時期なので、ついでに載せることにしました。

ykonomi.hatenablog.com

NixOSは、純粋関数型 Linux Distribution であり、Nix パッケージマネージャを利用して作られるOSです。Nix は関数型由来の様々な独自機能を持っています。この記事ではそのことをほとんど紹介できていませんが、興味を持った方はぜひ初めてみてください。

この記事は、実際に NixOS をインストールするまでの記録です。具体的には、インストールメディアの作成、パーテーションの作成、設定ファイルの作成、インストールと起動を行います。当初の目的は、この記事自体を NixOS 上で執筆することでしたが、日本語入力がうまくできなかったため仕方なく諦めました。そのため、ゴールはGUI上でログイン画面が表示されるまでとしました。

また、ここで行った手続き、入力したコマンドは全てNixOS manualを参照しています。

インストール用のUSBメモリの作成、起動

マニュアルによると、インストールするメディアはCD, DVD, USBメモリから選択することができました。しかし、手持ちにUSBメモリしかなかったため、USBメモリを選択しました。

f:id:ykonomi:20181122075114j:plain
インストール用のUSBとインストール先のSSDSSDは友人からただでもらう。

USBメモリへの書き込み時に入力したコマンドは以下です。作業はMacOS上で行いました。2行目のdisk2は1行目のdiskutil listによって判明した識別子であり、PCに刺したUSBメモリを指します。nix.iso は公式で入手してリネームしたものです。

$ diskutil list
$ diskutil unmountDisk disk2
$ sudo dd bs=1m if=nix.iso of=/dev/rdisk2

この作業は特別問題なくできたのですが、ログに以下の表示がでるだけだったので、本当に書き込みが成功したか不安でした。

541065216 bytes transferred in 56.234190 secs (9621641 bytes/sec)

次に、作成したUSBメモリが優先的に起動できるよう、BIOSの設定を行いUSBを先に起動できるようにしました。以下がその時の画像です。

f:id:ykonomi:20181203073352j:plain
インストールメディア起動画面。一番上以外が謎のまま。

画像を撮り忘れたのですが、インストールメディア起動後CUIが起動します。以降のコマンドはそのCUI上で実行しています。ちなみに、デフォルトのキーレイアウトはUS配列です。

パーティションの分割、フォーマット、そして、インストール

インストール先のメディアとして、上の図にある SSD(容量は256GB)を使用しました。マニュアルによると、NixOS のシステムをブートする方法として、BIOSとUDFIがあります。しかし、自分が所持するマザーボードが10年ものであり、UDFIに対応していなかったため、(というか、UDFIをその時に初めて知りました。)BIOSで起動せざるを得ませんでした。次の機会にはUDFIを試したいです。パーティションの作成で入力したのが以下のコマンドです。BIOSでは、パーティションテーブルとしてMBR (Master Boot Record) を用います。コマンドの1行目がこのパーティションテーブルを作成するコマンドです。2行目ではルートパーティション(/から始まる)を作成し、3行目ではスワップパーティションを作成しています。

# parted /dev/sda -- mklabel msdos
# parted /dev/sda -- mkpart primary 1MiB -8GiB
# parted /dev/sda -- mkpart primary linux-swap -8GiB 100%

次にフォーマットです。以下のコマンドを入力しました。マニュアル通りです。

# mkfs.ext4 -L nixos /dev/sda1
# mkswap -L swap /dev/sda2

最後に、インストールです。以下のコマンドを入力しました。マニュアルとの相違点はnanoではなくvimを使った点です。単純にnanoが使えないためvimにしました。

# swapon /dev/sda2
# mount /dev/disk/by-label/nixos /mnt
# nixos-generate-config --root /mnt
# vim /mnt/etc/nixos/configuration.nix
# nixos-install

configuration.nix はNixOSの全体のシステムを設定するファイルです。configuration.nix に、使用するパッケージを記述します。nixos-install コマンドを実行することで、configuration.nix に記述されたパッケージがビルドされインストールされます。configuration.nix の最初コードは、以下のように記述しました。

{ config, pkgs, ... }: {
  imports = [
    # Include the results of the hardware scan.
    ./hardware-configuration.nix
  ];

  boot.loader.grub.device = "/dev/sda"; 
};

nixos-install 後の結果が以下の図です。

f:id:ykonomi:20181203073454j:plain
nixos-install 成功後のコンソール画面

マニュアルでは、この後、reboot することでNixOSを立ち上げることができる、と記述されていました。しかし、私の環境の都合で再起動後、インストールメディアの方が先に立ち上がってしまったトラブルがありました。本来立ち上がるべきなのは、インストール先のメディアであるため、BIOSの設定から起動優先順位を変更しインストール先のメディアを先に起動できるようにしました。

起動後、GRUBのブートメニューが立ち上がります。成功したみたいです。

f:id:ykonomi:20181203073518j:plain
GNU GRUB2 の画面

一般ユーザーの作成

この記事の趣旨としてはおまけになります。rootユーザーのみでは常用OSとしては不安なため、一般ユーザーを追加しました。mutableUserは、デフォルトはtrueですが、falseすると、users.users 最初に設定したパスワードが起動時のパスワードになり、パスワードを変更しても再起動すれば元に戻るなど、面白い挙動になります。

  users.mutableUsers = true; #default
  users.users.ykonomi = {
    isNormalUser = true;
    home = "/home/ykonomi";
    description = "";
    extraGroups = ["wheel" "networkmanager"];
  };
  

X Window System (X11) の導入

GUIが欲しいため、X Window Systemを導入しました。以下をconfiguration.nixに追加しました。当然ですが搭載するグラボによって指定するデバイスドライバも変わります。また、freeではないソフトウェアを設定ファイルに記述するためにnixpkgs.config.allowUnfree = true; を記述する必要があるなど、ad hoc な対応が要求されました。

  nixpkgs.config.allowUnfree = true;
  services.xserver = {
      enable = true;
      videoDrivers = [ "nvidia" ];
      desktopManager.gnome3.enable = true;
      layout = "us";  # default
  };  

ユーザー設定とX Window Systemの設定をconfiguration.nix に追加して、再ビルドしたものが以下の図です。無事ログイン画面を表示させることができました。

f:id:ykonomi:20181203073433j:plain
ログイン画面。歪みがひどい。

まとめ・感想

マニュアルを読み、以前から気になっていたNixOSをインストールしました。 作業を少しずつ進めるたびに一つずつレベルアップしていく感じがしてよかったです。 次は日本語入力対応とNixOpsというものがあるらしいので試してみたいです。