2009年12月26日土曜日

第14回 バックアップをメディア1枚に収める

SolarisにOracleをインストールした程度の容量では、バックアップアーカイブはDVDメディア1枚の中に余裕で収まるはずだが、 使用するにつれ、データ量が増加してくるとメディア1枚収まらなくなる。この場合は一部のディレクトリ以下のファイルをFlashの圧縮よりも高圧縮して、 JumpStart ディレクトリにコピーしておく。これを、システムがリブートする前に作業を実行するスクリプト、 すなわちfinish スクリプトにそのファイルを解凍して復元する処理を記述しておくことにより対処する。

  1. 使用状況の調査
    1. duコマンドを使用して各ディレクトリのディスク使用量を表示する。概要だけでよいので、結果をgrepでGバイトを超過するものに絞る。
    2. # du -h|grep "[0-9]G"
      3.0G ./usr
      2.1G ./opt/oracle/product/10.2.0
      2.1G ./opt/oracle/product
      5.6G ./opt/oracle/data/orcl
      5.6G ./opt/oracle/data
      7.7G ./opt/oracle
      7.7G ./opt
      8.2G ./opt
        …  

    3. 上記の例から、/opt以下を対象にすることにする。

  2. シェルスクリプトへの追加
    1. 「第10回 ブータブルなリカバリディスクの作成」のシェルスクリプトを参照されたい。同シェルスクリプトに追加変更を行う。

    2. /opt以下をtarで固めて圧縮する、かつその部分はFlashアーカイブには含めない。
    3. # create tar archive
      mkdir -p /dvdimage/flash
      cd /
      tar cvf opt.tar ./opt
      gzip opt.tar
      mv opt.tar.gz /dvdimage/flash

      # create flash archive
      flarcreate -n solaris_oracle_application \
      -I \
      -x /dvdimage \
      -x /opt \
      -x /cdrom \
      -c /dvdimage/flash/soi.flar

    4. 「finish」という名前のfinishスクリプトを実行するようにruleファイルを変更する。
    5. echo "any - x86-begin any_machine finish" > rules

    6. finishスクリプトを作成して、実行権限を与える。なお、スクリプトにはログホストとホスト名の設定も加えたので、これに関わる手入力は必要なくなる。
    7. # create finish script
      cat << EOF > finish
      #!/bin/sh
      cd /a/
      cp /cdrom/flash/opt.tar.gz .
      gzip -d opt.tar.gz
      tar xvf opt.tar
      rm opt.tar
      echo '127.0.0.1 loghost' >> /a/etc/inet/hosts
      echo \`/a/usr/sbin/prtdiag|grep 'System Configuration:'|/a/usr/bin/awk '{print \$NF}'\`'.domain.com' > /a/etc/nodename
      EOF

      chmod 755 finish

  3. シェルスクリプト全体
  4. 「第10回 ブータブルなリカバリディスクの作成」で作成したシェルスクリプトとの相違は網伏せの部分である。

    #!/bin/sh

    # stop oracle
    /etc/init.d/dbora stop

    # create tar archive
    mkdir -p /dvdimage/flash
    cd /
    tar cvf opt.tar ./opt
    gzip opt.tar
    mv opt.tar.gz /dvdimage/flash

    # create flash archive
    flarcreate -n solaris_oracle_application \
    -x /dvdimage/flash \
    -x /opt \
    -x /cdrom \
    -c /dvdimage/flash/soi.flar

    # copy solaris installation dvd
    cd /cdrom
    find . -depth -print|grep -v ./Solaris_10|cpio -pdm /dvdimage
    find Solaris_10/Misc -depth -print|cpio -pdm /dvdimage

    # extract miniroot
    mkdir -p /dvdimage/miniroot
    /boot/solaris/bin/root_archive unpack /cdrom/boot/x86.miniroot /dvdimage/miniroot

    # create sysidcfg
    cd /dvdimage/miniroot/etc
    mv sysidcfg sysidcfg.org
    cat << EOF > sysidcfg
    name_service=none
    network_interface=rtls0 {dhcp protocol_ipv6=no}
    root_password=`cat /etc/shadow | grep root: | sed s/root:// |sed s/:.*//`
    security_policy=none
    system_locale=ja
    timezone=Asia/Tokyo
    timeserver=localhost
    nfs4_domain=dynamic
    EOF

    # edit profind
    cp -p /dvdimage/miniroot/usr/sbin/install.d/profind /dvdimage/miniroot/usr/sbin/install.d/profind.org
    sed s'/\[ -f \/tmp\/.preinstall \]/\[ true \]/' /dvdimage/miniroot/usr/sbin/install.d/profind.org > /dvdimage/miniroot/usr/sbin/install.d/profind

    # edit install-solaris
    cd /dvdimage/miniroot/sbin
    mv install-solaris install-solaris.org
    sed s"/ reboot/i=0;while [ \$i -lt 100 ];do tput bel;sleep 1;i=\`expr \$i + 1\`;done;reboot/" install-solaris.org > install-solaris
    chmod u+x install-solaris

    # archive miniroot
    /boot/solaris/bin/root_archive pack /dvdimage/boot/x86.miniroot /dvdimage/miniroot
    cd
    rm -r /dvdimage/miniroot
    eject cdrom
    echo "Please insert writable media and press enter: "
    read key

    # edit Grub menu
    cd /dvdimage/boot/grub
    mv menu.lst menu.lst.org
    cat << EOF >> menu.lst
    default=0
    timeout=60
    title Solaris10 Jumpstart
    kernel /boot/multiboot kernel/unix - install -B install_media=cdrom
    module /boot/x86.miniroot
    EOF

    # edit rule file
    cd /dvdimage/.install_config
    mv rules.ok rules.ok.org
    echo "any - x86-begin any_machine finish" > rules

    # create any_machine
    cat << EOF > any_machine
    # profile keywords profile values
    # ---------------- -------------------
    install_type flash_install
    archive_location local_file /cdrom/flash/soi.flar
    partitioning explicit
    filesys any free /
    filesys any 4096 swap
    EOF

    # copy begin script
    cp -p /dvdimage/Solaris_10/Misc/jumpstart_sample/x86-begin .

    # create finish script
    cat << EOF > finish
    #!/bin/sh
    cd /a/
    cp /cdrom/flash/opt.tar.gz .
    gzip -d opt.tar.gz
    tar xvf opt.tar
    rm opt.tar
    echo '127.0.0.1 loghost' >> /a/etc/inet/hosts
    echo \`/a/usr/sbin/prtdiag|grep 'System Configuration:'|/a/usr/bin/awk '{print \$NF}'\`'.domain.com' > /a/etc/nodename
    EOF

    chmod 755 finish

    # validate rules file
    /dvdimage/Solaris_10/Misc/jumpstart_sample/check

    # create ISO image
    cd /dvdimage
    mkisofs -o /dvdimage/flash/soi.iso -b boot/grub/stage2_eltorito -c .catalog -no-emul-boot -boot-load-size 4 -boot-info-table -relaxed-filenames -N -L -l -r -J -d -D -V SOL_10_1008_X86_JUMPSTART .

    # write ISO image to DVD
    cdrw -i -p 1 /dvdimage/flash/soi.iso

    # erase work area
    #cd
    #rm -r /dvdimage

    exit

  5. 注意点
    1. tarはcd してから相対パス(.)で指定して固めることにより、相対パスで展開させる。これはインストール時にインストール先のルートパスは/a以下にマウントされるため、絶対パスで作成しては展開できないためだ。つまり/opt以下のファイルを、/a/opt以下に展開させる。
    2. cd /
      tar cvf opt.tar ./opt
        …  
      cd /a/
        …  
      tar xvf opt.tar

    3. より少ない容量で、より正確に行うならシェルスクリプトを2つに分けて前半をシングルモード(init s)下でtar、flarcreate の処理を行い。残りを通常モード(init 3)に戻して、インストールメディアをマウントさせて行う。なお、下記の除外はもともとシングルモードでは外部ドライブはマウントされていないのコメントアウトする。
    4. -x /cdrom \

    5. 同様にメディア1枚に収まらない場合は、その部分を除外オプション(-x)ではずし、別メディアにシェルスクリプトと同じようなことをtar、gzipで行う。