TOWNS で Linux と WINDOWS でスワップファイルを共有する方法

萩尾(VIC) <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. はじめに

2. 設定方法

3. 参考ファイル


1. はじめに

『MS−WINDOWSとLinuxで swap space を共用する方法』 (Peter Anvin <hpa@nmu.edu> 氏作) (播口 陽一 <hriguti@lsidiv.kawasaki-steel.co.jp> 氏訳) より。

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

2. 設定方法

作業は DOS5 または 6 で作業を行ってください。T−OS では、うまく いきません。 DOS3 では確認していませんが、T−OS がだめなのでたぶんだめでしょう。 なお、動作環境は Linux version 1.1.12 for FMTOWNS release 1.2 です。

方法は、

  1. SETUP2 でスワップファイル用の区画を MS−DOS または、MS−DOS 512 の区画として作成し、ドライブを追加します。

  2. そのドライブを FORMAT します。 このときボリュームラベル名は "SWAP SPACE" にしてください。

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

  4. Linux を起動後、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. 図1のシェルスクリプトを 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 をエディタで以下のように修正してください。

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

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

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

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

このドキュメントに対してのご意見は、GAA00714 萩尾(VIC)
                   (GAA00714@niftyserve.or.jp)まで。

3. 参考ファイル

3.1 図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 図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 図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