TOWNS で Linux と WINDOWS でスワップファイルを共有する方法 萩尾(VIC) 1994年10月30日 播口 陽一 1994年10月30日 TOWNS 上で、Linux と Windows とで swap file を共有する方法。 JF より:この文書は、1994年10月以来、更新されていません。現在と事情が 異なる場合があるので、ご注意ください。 1. はじめに 『MS−WINDOWSとLinuxで swap space を共用する方法』 (Peter Anvin 氏作) (播口 陽一 氏訳) より。 有用な情報をくださった両氏に感謝します。 2. 設定方法 作業は DOS5 または 6 で作業を行ってください。T−OS では、うま くいきません。DOS3 では確認していませんが、T−OS がだめなのでた ぶんだめでしょう。なお、動作環境は Linux version 1.1.12 for FMTO WNS release 1.2 です。 方法は、 1. SETUP2 でスワップファイル用の区画を MS−DOS または、MS −DOS512 の区画として作成し、ドライブを追加します。 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 をエディタで以下のように修正してください。 o swapon -a をコメントアウトする。 o その直後に図2コードを追加する。 ``図2''コードの中の XXXXX の部分には fdisk で確認したスワップファ イルボリューム(swap space)のブロック数を代入してください。 8. /etc/rc.d/rc.0 をエディタで以下のように修正してください。 o umount の前に``図3''のコードを追加する。 これで、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 " 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