2016年9月15日木曜日

Oracle Linux 7.2 インストール手順

OS のインストール手順は、いろいろな人が書いており、本ブログで取り上げる必要性はあまり感じていなかったのですが、rhel6 でできていたことが rhel7 では難しくなったことがあり、社内勉強会のネタとして調べたことも含め、一般公開することにしました。

Red Hat Enterprise Linux や CentOS でもよかったのですが、Oracle Linux での操作をキャプチャしました。試した範囲では、どれでも同じ操作でした。

VMware ESXi にてインストール作業を行います。

パーティション構成ですが、デフォルトでは、/boot パーティションと LVM で構成されます。
LVM のボリュームグループ名が rhel 固定になってしまったのは残念です。

LVM を利用しない場合、1台目の HDD については、以下のような構成が考えられます。

(a)
/dev/sda1 /

(b)
/dev/sda1 /boot
/dev/sda2 /

(c)
/dev/sda1 /boot
/dev/sda2 swap
/dev/sda3 /

(d)
/dev/sda1 /boot
/dev/sda2 /
/dev/sda3 swap

(a) 案は、シンプルさが魅力です。AWS では、基本的にこのパターンとなります。
swap については、必要に応じて、dd コマンドでファイルを作成し、swap 用に割り当てます。1つのローカル HDD として最大 2TB までしか提供していない AWS では問題となりませんが、BIOS のサポート状況等により、2TB 超のパーティションからの OS 起動は失敗する可能性があります。

(b) 案は、/boot パーティションを用意することで、2TB 超のローカル HDD からの OS 起動が問題なくサポートできるだけでなく、LVM 利用や / パーティションの暗号化が可能となるというメリットがあります。

(c),(d) 案は、(b) 案に swap パーティションも用意したい場合の構成となります。
仮想環境では、ローカル HDD サイズを後から拡張する、ということがサポートされる環境が多いです。その場合、(d) 案では、/ パーティションの拡張にあたり、swap 用パーティションを一度削除しなければならない、という面倒な作業が発生します。(c) 案であれば、そのような余計な作業が発生しません。もっとも、swap パーティションも拡張したい、という要件を重視するのであれば、(d)案でなければなりません。いずれにせよ、SIer としては、設計したとおりにパーティショニングしたいところです。

rhel7 の anaconda(インストーラ)を通常通りに操作すると、(c) 案となるように操作したつもりでも、勝手に (d) 案の構成となってしまいます。この問題をどう解決すべきか、というのが本稿の最初のテーマです。anacondaを利用しない方法は対象外とします。

以下のパラメータで構築していきます。


【事前作業】

Oracle Linux 7.2 のインストーラ V100082-01.iso を ESXi のデータストアに保存しておきます。
DNS サーバに、これから構築する OS の IP アドレス情報を登録します。


【仮想マシン作成】

 名前: ol1
 ゲストOS: Oracle Linux 4/5/6/7 (64ビット)
 CPU: 2core
 メモリ: 2GB
 NIC1: VMXNET 3 - VM Network
 SCSIコントローラ: VMware準仮想化
 仮想HDD: 200GB (Thin Provision)


【Oracle Linux インストール】

  ホスト名: ol1.example.com
  キーボード: Japanese (OADG 109A)
  KDUMP: 無効
  ネットワーク自動接続: オン
  NICデバイス命名: Legacy
  IPv4:
    Static 172.28.0.61/255.255.0.0  GW: 172.28.0.1  DNS: 172.28.0.2  Domain: example.com
  IPv6:
    Ignore
  NTP Servers: ntp-a2.nict.go.jp, ntp-a3.nict.go.jp, ntp-b2.nict.go.jp, ntp-b3.nict.go.jp
  SELinux: 無効
  パーティション構成:
    デバイス名 FS   MountPoint      サイズ   ラベル  UUID
    /dev/sda1 xfs    /boot         500MiB  /boot   自動
    /dev/sda2 swap                2049MiB  swap    自動
    /dev/sda3 xfs    /             残り    /       自動


具体的な作業手順は以下を参照してください。
https://raw.githubusercontent.com/blog-pcoffice/public/master/oracle-linux7.2-install.pdf

ポイントは、シェルに移行して fdisk コマンドでパーティショニングし、GUI に戻って面倒な操作で既存のパーティションを参照させることです。
「/」は、GUI 手順内でフォーマットすることが必須のようなので、上記の手順ではシェル内でフォーマットしていません。ラベルは GUI 内手順で指定できますが、UUID は指定できないので、何らかの理由で UUID を指定したい場合には、インストール完了後にインストーラの Rescue モードで起動しなおし、マウントしていない状態で、xfs_admin コマンドにより修正することになります。マウントしてから grub2 関連ファイル、fstab ファイル等も併せて変更します。

カーネル起動オプションについて補足しておきます。
anaconda 起動時に、「rd.live.check quiet」を削除、「net.ifnames=0 biosdevname=0 selinux=0 vconsole.keymap=jp106」を追加しました。
インストール完了後の状態は以下の通りでした。

[root@ol1 ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.8.13-98.7.1.el7uek.x86_64 root=UUID=fca8b332-a457-4994-be4b-be49f0dc6025 ro selinux=0 biosdevname=0 net.ifnames=0 rhgb quiet LANG=en_US.UTF-8

[root@ol1 ~]# cat /boot/grub2/grub.cfg | grep vmlinuz
        linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=fca8b332-a457-4994-be4b-be49f0dc6025 ro selinux=0 biosdevname=0 net.ifnames=0 rhgb quiet LANG=en_US.UTF-8
        linux16 /vmlinuz-3.8.13-98.7.1.el7uek.x86_64 root=UUID=fca8b332-a457-4994-be4b-be49f0dc6025 ro selinux=0 biosdevname=0 net.ifnames=0 rhgb quiet LANG=en_US.UTF-8
        linux16 /vmlinuz-0-rescue-0ccf8defb7944d699edc6e4e11225446 root=UUID=fca8b332-a457-4994-be4b-be49f0dc6025 ro selinux=0 biosdevname=0 net.ifnames=0 rhgb quiet

[root@ol1 ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="selinux=0 biosdevname=0 net.ifnames=0 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

[root@ol1 ~]# getenforce
Disabled
[root@ol1 ~]# cat /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

SELinux については、カーネルパラメータで無効化するだけではなく、専用の設定ファイルにおいても無効化していることを明示する目的で、以下のように編集しておきます。
[root@ol1 ~]# sed -i -e 's/^SELINUX=.*$/SELINUX=disabled/' /etc/sysconfig/selinux

rhgb quiet」については、OS 起動時のコンソールへのログ表示を抑止していたりするだけなので、私的には不要なものという認識です。

net.ifnames=0 biosdevname=0」については、NIC デバイス名を Legacy な eth0、eth1、… とするために追加しています。Predictable Network Interface Names や Consistent Device Naming by biosdevname を無効化します。インストール時にこのオプションを加えなかった場合、今回の手順だと「eno16780032」となり、予測可能な名前なのか、常にこの名前になるのか、とても不安になるものでした。

rhel6 では、udev の機能により、MAC アドレスと NIC のデバイス名を自動的に紐付けてくれていました。以下のようなファイルが自動的に作成されていました。
[root@rhel6 ~]$ cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x15ad:0x07b0 (vmxnet3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:9e:5d:0d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

rhel7 では、このファイルの自動生成がなくなりましたが、rhel6 からのアップグレード・パスがあり、rhel7 において、依然として有効な設定となります。ただし、カーネル起動オプションに「net.ifnames=0」等が存在すると、有効に働きません。「KERNEL=="eth*"」という条件も邪魔になります。以下のように生成し、grub 設定も併せて変更します。
[root@ol1 ~]# cat << EOF >> /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="$(ip addr show eth0 | grep 'link/ether' | awk '{print $2}')", ATTR{type}=="1", NAME="eth0"
EOF
[root@ol1 ~]# sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/ *biosdevname=[^ "]*//' /etc/default/grub
[root@ol1 ~]# sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/ *net\.ifnames=[^ "]*//' /etc/default/grub
[root@ol1 ~]# sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/ *rhgb quiet//' /etc/default/grub
[root@ol1 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.8.13-98.7.1.el7uek.x86_64
Found initrd image: /boot/initramfs-3.8.13-98.7.1.el7uek.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-0ccf8defb7944d699edc6e4e11225446
Found initrd image: /boot/initramfs-0-rescue-0ccf8defb7944d699edc6e4e11225446.img
done

MAC アドレスの情報を設定ファイルに記録すると、クローニングの際に消す必要が出てきて邪魔である、という認識のもと、rhel6 では、以下のようにこのファイルを編集することで、NIC が存在するバスの位置情報と NIC のデバイス名を紐付けていたケースも多いことと思われます。
[root@rhel6 ~]$ sed -i -e '/eth0/ s/ATTR[^,]*,/ID=="'$(ethtool -i eth0 | grep bus-info | awk '{print $2}')'",/' /etc/udev/rules.d/70-persistent-net.rules

rhel7 では、「ID="<バス情報>"」という条件の書き方が廃止されたため「KERNELS="<バス情報>"」に置き換える必要があります。

[root@ol1 ~]$ sed -i -e '/eth0/ s/ATTR[^,]*,/KERNELS=="'$(ethtool -i eth0 | grep bus-info | awk '{print $2}')'",/' /etc/udev/rules.d/70-persistent-net.rules

この順序で実行していけば、自動化スクリプトに組み込みやすくなります。

ついでに、IPv6 を無効化します。rhel7 では、カーネルのコンパイルオプションが変更され、ipv6 モジュールはなくなり、カーネル本体に組み込まれるようになりました。ipv6 モジュール読み込み時用に指定していたオプションは、カーネル起動時のパラメータで渡す必要があります。
[root@ol1 ~]# sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/ *ipv6.disable=[^ "]*//' /etc/default/grub
[root@ol1 ~]# sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/" /"/' /etc/default/grub
[root@ol1 ~]# sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/="/="ipv6.disable=1 /' /etc/default/grub
[root@ol1 ~]# sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/ "/"/' /etc/default/grub
[root@ol1 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

sysctl.d にて IPv6 を無効化すべき、との記述も見かけますが、無効化できないケースがあり、IPv6 を無効化せざるを得ない状況では、上記の方法をお奨めすることになります。

IPv6 を無効化する場合、各種サービスでそれなりの対応をしないと不具合が発生しますが、対応リストは CentOS の Wiki に記載されています。
https://wiki.centos.org/FAQ/CentOS7#head-8984faf811faccca74c7bcdd74de7467f2fcd8ee


まとめ

【インストーラ操作】
https://raw.githubusercontent.com/blog-pcoffice/public/master/oracle-linux7.2-install.pdf


【初回起動直後の操作】
sed -i -e 's/^SELINUX=.*$/SELINUX=disabled/' /etc/sysconfig/selinux

> /etc/udev/rules.d/70-persistent-net.rules
NUM=0
while :
do
  if ! ip addr show eth$NUM; then
    break
  fi
  cat << EOF >> /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="$(ip addr show eth$NUM | grep 'link/ether' | awk '{print $2}')", ATTR{type}=="1", NAME="eth$NUM"
EOF
  sed -i -e /eth$NUM'/ s/ATTR[^,]*,/KERNELS=="'$(ethtool -i eth$NUM | grep bus-info | awk '{print $2}')'",/' /etc/udev/rules.d/70-persistent-net.rules
  NUM=$((NUM+1))
done

sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/ *biosdevname=[^ "]*//' /etc/default/grub
sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/ *net\.ifnames=[^ "]*//' /etc/default/grub
sed -i -e '/^GRUB_CMDLINE_LINUX=/ s/rhgb quiet/ipv6.disable=1/' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg

sed -i -e 's/^#AddressFamily .*$/AddressFamily inet/' /etc/ssh/sshd_config
sed -i -e 's/^inet_interfaces .*$/inet_interfaces = 127.0.0.1/' /etc/postfix/main.cf
[ -r /etc/netconfig ] && sed -i -e 's/^udp6/#udp6/' -e 's/^tcp6/#tcp6/' /etc/netconfig

reboot


0 件のコメント:

コメントを投稿