PMPの流儀

我が家の流儀

我が家で気になったことを夫婦で取り上げていきます

MENU

VMWare に Gentoo Linux (CUI) の最適化環境を構築しました

VMware Workstation Player 上に Gentoo Linux 環境を構築しました。セッティングはGNOMEなしのサーバー向けの環境です。カーネルもできるだけ最適化しています。

概要

VMware 上で動作する軽量 Linux Server を構築する事にしました。今回は気合を入れてGentoo Linux です。以前にもサーバー用には Gentoo Linux をおススメした記事を書いていました。 pmp-style.hatenablog.com

インストールは今のマウスを使ったお手軽なものではなく、HDDの領域確保、フォーマットからすべてコンソールでコマンドを手打ちしながら進めていきます。Linux やPCの勉強をしたい方には基礎が学べるのでとてもよい教材です。

Gentoo Linux の特徴

Gentoo Linux の最大の特徴はパッケージがソースコードで構成されており、バイナリは自分のPCでコンパイルするという点です。コンパイルからインストールまで含めて自動化されているのでほっとけばいいのですが、時間と電気代がかかります。なぜこんな効率の悪そうなことをするのかというと、PCのスペックや求める機能に応じてソースをカスタマイズする機能があり、よりよいバイナリを得ることができます。Windowsubuntuなどの一般的なOSでは、多種多様なPCにインストールできるバイナリが提供されています。どのPCでも動くことは素晴らしいですが、一方で無駄が多いのも事実です。

Gentoo Linux は1点ものを自分の手で作り上げていくこだわりの世界です。

Linux OS としてGentoo Linux のシェアは0.6%程度しかありませんが、そのすごさは google からも認められており、Chromium OSGentoo Linux が採用されています。それを見抜くgoogle もさすがです。Gentooファンとしては嬉しい限りです。

Chrome OSANXRpCÉGentooÌPortageÌp | IT

詳細

細かい所を紹介していきます。

32bit(x86)にも対応している

最近Linuxディストリビューションは64bit版のみになりましたが、Gentoo Linuxは32bit版(x86)にも対応しています。32bit の方が省メモリに向いています。

gcc の最適化オプションを最適化できる

"-O2 -march=native -fomit-frame-pointer -pipe"

march に nativeを指定すると、gccがcpu情報を見て機能を自動的に付与してコンパイルしてくれます。ただしCPUが変わると動く保証がありません。汎用性を求める場合は march の代わりに mtune オプションを使います。今回のように1点ものを極める場合は march が必須です。

USEフラグによる機能の有無指定

パッケージをコンパイルするときに USE フラグで不要な機能は省くことができます。例えば…今回は ipv6 には使いませんので以下の設定をしています。頭にマイナス記号をつけることで不要という指示になります。

USE = "-ipv6"

こうすることで、たとえば dhcp クライアントをコンパイルするときに ipv6 の個所を自動的に対象から外してくれます。他のOSですと、ipv4, ipv6 両対応しているが ipv6 は使わないところですが、gentoo では ipv6 の機能そのものがなくなります。その分メモリが節約できわけです。Gentoo Linux の開発者は様々なパッケージを横断して USEフラグのつじつまを合わせているのは大変な事だろうと思います。

このようにして、PCの機能、自分が欲しい機能に限定して最適化できるわけです。

Linux Kernel

カーネルコンパイルは他のディストリビューションでも可能ですが、自らコンパイルする事は稀でしょう。ディストリビューション標準のカーネルは、どんなPCでも動くように機能てんこ盛り状態のカーネルが生成されます。

Gentoo の場合、かならずLinux カーネルコンパイルが必須となります。その時に余計なデバイスドライバや使用しない機能を削ることができます。上記のUSEフラグと同じ感覚です。Linux Kernel のオプションは多岐にわたりよく分からない項目がたくさんがあります。いかに項目を減らすかが勝負ですが、カーネルの場合は失敗すると起動できなくなることも多々あります。 実際、今回画面表示が出てこなくて半日以上悩みました。

何度もトライしながら完成度を上げていくのは楽しかったりします・・・

VMware にインストール

インストール方法はこちらの公式ガイドに従って進めます。昔と変わったのは grubUEFI のみサポートになった点です。bootパーティーションがvfatになるのと grub の書き込み方法が変わっています。
Gentoo AMD64 Handbook - Gentoo Wiki

vmxファイル

UEFIが必要になるのと、Network と SCSIVMWare社提供の純粋仮想アダプタに差し替えます。

firmware = "efi"
scsi0.virtualDev = "pvscsi"
ethernet0.virtualDev = "vmxnet3"

Linux kernel

Linux 標準カーネルVMware のデバイスが取り込まれています。以下は必ず * にします。VMware 社の働きで標準カーネルに取り込まれて楽ができるのはありがたいです。

Device Drivers
  Networking device support
     <*>VMware VMXNET3 ethernet driver

Device Drivers
  SCSI device support
     SCSI low-level drivers
       <*> VMware PVSCSI driver support

Device Drivers
  Graphics support
    <*> DRM driver for VMware Virtual GPU
           [*]  Enable framebuffer console under vmwgfx by default

     Frame buffer Devices
        Support for frame buffer devices
          [*] EFI-based Framebuffer support

このオプションでgentoo linux は動作します。

vmware toolsの Linux版は open-vm-tools が用意されています。
インストールすると、

VMWare からパワーオフが可能
・ホストと時刻同期ができる

が可能となります。特にシャットダウンは、ホストのスクリプトからシャットダウンが簡単にできるようになり便利です。

open vm tools を動かすには、カーネルオプションの以下を有効にします。

Networking support
   Networking options
     <*> Virtual Socket protocol
     <*>   VMware VMCI transport for Virtual Sockets 
Device Drivers
  <*> Fusion MPT device support
     <*> Fusion MPT ScsiHost drivers for SPI
   Misc Drivers
     <*> VMware VMCI Driver

File systems
  <*> FUSE (Filesystem in Userspace) support

その他

カーネルサイズ

試行錯誤して到達した Gentoo LinuxカーネルLinux mint の標準カーネルサイズを比べてみます。

gentoo    4,820,992 bytes
mint      13,668,608 bytes

実際にはカーネルgzip 圧縮されているファイルですが、約3分の1になっています !!

パスワードポリシー

標準ではパスワードポリシーが厳しすぎて、何度も再起動したときに大変だったので、ポリシーを無効化しました。

/etc/security/passwdqc.conf

enforce=everyone を none に変更

SSH対応

open-ssh サーバーのインストールで1日はまりました。通常のログイン名、パスワード方式はすぐにできたのですが、RSA認証をしようとしたらどうしてもログインができない。
最終的にたどり着いた原因は USE フラグでした。RSAの公開鍵方式の認証をするには USE フラグに X509 が必要だったですが、初期値は無効でした。
パッケージで使用する USE フラグをみて怪しそうな名前が無いか確認して X509 に気がついたのですが、デジタル証明書のことかとかん違いしてしまい、解決するまで数日かかってしまいました。

今の openssh のUSEフラグはこんな感じです。

sv ~ # emerge --ask --verbose openssh

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] net-misc/openssh-8.9_p1-r2::gentoo  USE="X509 pam pie scp ssl -X -audit (-debug) -hpn -kerberos -ldns -libedit -livecd -sctp -security-key (-selinux) -static -test -verify-sig -xmss" 0 KiB