次のページ 前のページ 目次へ

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

有用な情報をくださった両氏に感謝します。
作業は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 をエディタで以下のように修正してください。
  swapon -a をコメントアウトする。
  その直後に図2コードを追加する。

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

8. /etc/rc.d/rc.0 をエディタで以下のように修正してください。
     umount の前に図3のコードを追加する。

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

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

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

図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"
-----------------------------------------------------------------------------
図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 /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

次のページ 前のページ 目次へ