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