JF より:この文書は、1994年10月以来、更新されていません。 現在と事情が異なる場合があるので、ご注意ください。
『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 です。
方法は、
SETUP2 でスワップファイル用の区画を MS−DOS または、MS−DOS 512 の区画として作成し、ドライブを追加します。
そのドライブを FORMAT します。
このときボリュームラベル名は "SWAP SPACE
" にしてください。
WINDOWS を起動して、そのドライブに最大容量で永久スワップファイルを作 成します(別のファイルを間違って書き込むことがないように)。また、このドライブ はスワップファイル以外には使用しないで下さい。スワップファイル以外のファイルは Linux 動作後に破壊されてる可能性があります(たぶん壊れているでしょう)。
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
図1のシェルスクリプトを msinfo
という名前
で作成し、実行してください。
# sh msinfo /dev/winswap
このとき出力される "Sector size
" と "Total special sectors
" の数字をメモっておいてください。
以下のコマンドを実行してください。
dd if=/dev/winswap bs=XXX count=YYY | gzip -9 > /etc/winswap.gz
XXX
の部分には、"Sector size
"、YYY
の部分には "
Total special sectors
" の数値(さっきメモった値)を代入してください。
/etc/rc.d/rc.S
をエディタで以下のように修正してください。
図2コードの中の XXXXX
の部分には fdisk
で確認したスワップファイルボリューム(swap space)のブロック数を
代入してください。
/etc/rc.d/rc.0
をエディタで以下のように修正してください。
umount
の前に
図3のコードを追加する。これで、Linuxと Windows でスワップファイルが共用できるようになります。
なお、/dev/winswap
を /etc/fstab
に登録する必要はありません。
また、操作を誤るとドライブの内容を破壊する可能性があるため、バックアップを
とるなどして、十分に注意して作業してください。もし、破壊してしまった場合、
私は責任を取れませんので。
このドキュメントに対してのご意見は、GAA00714 萩尾(VIC) (GAA00714@niftyserve.or.jp)まで。
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"
/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
/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