  TOWNS で Linux と WINDOWS でスワップファイルを共有する方法
  萩尾（ＶＩＣ） <GAA00714@niftyserve.or.jp>
  1994年10月30日
  播口  陽一 <hriguti@lsidiv.kawasaki-steel.co.jp>
  1994年10月30日

  TOWNS 上で、Linux と Windows とで swap file を共有する方法。

  JF より：この文書は、1994年10月以来、更新されていません。現在と事情が
  異なる場合があるので、ご注意ください。

  1.  はじめに

  『ＭＳ−ＷＩＮＤＯＷＳとＬinuxで swap space を共用する方法』 (Peter
  Anvin <hpa@nmu.edu> 氏作) (播口  陽一 <hriguti@lsidiv.kawasaki-
  steel.co.jp> 氏訳) より。

  有用な情報をくださった両氏に感謝します。

  2.  設定方法

  作業は ＤＯＳ５ または ６ で作業を行ってください。Ｔ−ＯＳ では、うま
  くいきません。ＤＯＳ３ では確認していませんが、Ｔ−ＯＳ がだめなのでた
  ぶんだめでしょう。なお、動作環境は  Ｌinux version 1.1.12 for ＦＭＴＯ
  ＷＮＳ release 1.2 です。

  方法は、

  1.

     ＳＥＴＵＰ２ でスワップファイル用の区画を ＭＳ−ＤＯＳ または、ＭＳ
     −ＤＯＳ５１２ の区画として作成し、ドライブを追加します。

  2.

     そのドライブを ＦＯＲＭＡＴ します。このときボリュームラベル名は
     "SWAP SPACE" にしてください。

  3.

     ＷＩＮＤＯＷＳ を起動して、そのドライブに最大容量で永久スワップファ
     イルを作成します（別のファイルを間違って書き込むことがないよう
     に）。また、このドライブはスワップファイル以外には使用しないで下さ
     い。スワップファイル以外のファイルはＬinux 動作後に破壊されてる可能
     性があります（たぶん壊れているでしょう）。

  4.

     Ｌinux を起動後、login して次のコマンドを実行して、スワップファイル
     の区画をリンクしてください。

         ln -s /dev/sd?? /dev/winswap

  sd?? の ?? の部分は、fdisk -l で確認できます。

  おまけ：スワップファイルのあるドライブに誤って、重要なデータを書き込ん
  でしまわないようにドライブの未使用領域をいっぱいにするには以下のコマン
  ドを実行してください。

         mount -t msdos /dev/winswap /mnt
         dd if=/dev/zero of=/mnt/dummy.fil
         umount /mnt

  5.

     ``図１''のシェルスクリプトを msinfo という名前で作成し、実行してく
     ださい。

         # sh msinfo /dev/winswap

   このとき出力される "Sector size" と "Total special sectors" の数字を
  メモっておいてください。

  6.

     以下のコマンドを実行してください。

         dd if=/dev/winswap bs=XXX count=YYY | gzip -9 > /etc/winswap.gz

  XXX の部分には、"Sector size"、YYY の部分には " Total special sectors"
  の数値（さっきメモった値）を代入してください。

  7.

     /etc/rc.d/rc.S をエディタで以下のように修正してください。

     o  swapon -a をコメントアウトする。

     o  その直後に図２コードを追加する。

     ``図２''コードの中の XXXXX の部分には fdisk で確認したスワップファ
     イルボリューム（swap space）のブロック数を代入してください。

  8.

     /etc/rc.d/rc.0 をエディタで以下のように修正してください。

     o  umount の前に``図３''のコードを追加する。

  これで、Ｌinuxと Ｗindows でスワップファイルが共用できるようになりま
  す。

  なお、/dev/winswap を /etc/fstab に登録する必要はありません。また、操
  作を誤るとドライブの内容を破壊する可能性があるため、バックアップをとる
  などして、十分に注意して作業してください。もし、破壊してしまった場合、
  私は責任を取れませんので。

  このドキュメントに対してのご意見は、GAA00714 萩尾（ＶＩＣ）
                     （GAA00714@niftyserve.or.jp）まで。

  3.  参考ファイル

  3.1.  図１： msinfo  のリスト

       #!/bin/sh
       #
       # Extract special sector information from an MS-DOS partition
       #
       PATH=/bin:/usr/bin:/usr/local/bin
       if [ "$#" != "1" ]; then
         echo "Usage: $0 <partition-name>"
         exit 1
       fi
       if [ ! -r $1 ]; then
         echo "$1: Permission denied"
         exit 1
       fi
       DOSVER="`dd 2>/dev/null if=$1 bs=1 count=8 skip=3`"
       SECSIZE=`dd 2>/dev/null if=$1 bs=1 count=2 skip=11 | hexdump -e '1/2 "%u\n"'`
       RESERV=`dd 2>/dev/null if=$1 bs=1 count=2 skip=14 | hexdump -e '1/2 "%u\n"'`
       FATS=`dd 2>/dev/null if=$1 bs=1 count=1 skip=16 | hexdump -e '1/1 "%u\n"'`
       ROOTDIR=`dd 2>/dev/null if=$1 bs=1 count=2 skip=17 | hexdump -e '1/2 "%u\n"'`
       FATSIZE=`dd 2>/dev/null if=$1 bs=1 count=2 skip=22 | hexdump -e '1/2 "%u\n"'`
       LABEL="`dd 2>/dev/null if=$1 bs=1 count=11 skip=43`"
       FILESYS="`dd 2>/dev/null if=$1 bs=1 count=8 skip=54`"
       let FATSEC=$FATSIZE*$FATS
       let ENTPERSEC=$SECSIZE/32
       let ROOTSEC=$ROOTDIR/$ENTPERSEC
       let EXTRA=$ROOTDIR%$ENTPERSEC
       if [ $EXTRA != 0 ]; then let ROOTSEC=$ROOTSEC+1; fi
       let SPECIAL=$RESERV+$FATSEC+$ROOTSEC
       echo "Formatting DOS version:      $DOSVER"
       echo "Filesystem:                  $FILESYS"
       echo "Volume label:                $LABEL"
       echo "Sector size:                 $SECSIZE"
       echo "Reserved sectors:            $RESERV"
       echo "FAT sectors:                 $FATSEC (${FATS}x${FATSIZE})"
       echo "Root directory sectors:      $ROOTSEC"
       echo "Total special sectors:       $SPECIAL"

  3.2.  図２： /etc/rc.d/rc.S  に追加する部分

  #
  # Verify and initialize swap space
  #
  echo -n 'Verifying swap space... '
  if [ "`/bin/dd 2>/dev/null if=/dev/winswap bs=1 count=10 skip=4086`" \
     = 'SWAP-SPACE' ]; then
    echo 'Linux signature found'
    /sbin/swapon /dev/winswap
  elif [ "`/bin/dd 2>/dev/null if=/dev/winswap bs=1 count=11 skip=43`" \
     = 'SWAP SPACE ' ]; then
    echo 'DOS signature found'
    /sbin/mkswap /dev/winswap XXXXX
    /sbin/swapon /dev/winswap
  else
    echo 'No signature found'
    echo 'ERROR: Will not swap'
  fi

  3.3.  図３： /etc/rc.d/rc.0  に追加する部分

       #
       # Terminate swapping and restore DOS/Windows swap info
       #
       /sbin/swapoff /dev/winswap
       if [ "`/bin/dd 2>/dev/null if=/dev/winswap bs=1 count=10 skip=4086`" \
          = 'SWAP-SPACE' ]; then
         echo 'Restoring DOS/Windows swap info'
         /bin/zcat /etc/winswap.gz | /bin/dd of=/dev/winswap 2>/dev/null
       else
         echo 'ERROR: /dev/winswap lacks swap signature, skipping restore'
       fi

