<!-- Swap-Space-1.2j.sgml v.1.2 02/05/95
     hariguti@lsidiv.kawasaki-steel.co.jp -->

<!doctype linuxdoc system>

<article>

<title>MS-Windows と Linux でスワップ領域を共有する方法 (v.1.2 13 Nov 1994)
<author>Peter Anvin, <tt/&lt;hpa@nwu.edu&gt;/
<date>翻訳バージョン v1.2, 1995年 2月 5日
<trans>播口陽一, <tt/&lt;hariguti@lsidiv.kawasaki-steel.co.jp&gt;/
<abstract>
多くの人が Linux と MS-Windows の両方を使っています。そのようにする能
力は「Linux 革命」にとって重要なことです。例えば他の人に、その人が良く
使うソフトウェアを使えるようにしたままで Linux を実験してもらう(そして
Linux を大好きになってもらう)ことができるからです。Linux と MS-Windows 
は両者ともディスクへのスワップを伴う仮想記憶を使いますから、ディスクを
節約するためにスワップ領域を共有する方法についての質問が
<tt/comp.os.linux.help/ に頻繁に現れます。

スワップ領域を共有する方法はいくつかあります。ここで述べるのは多分最も
複雑な方法ですが、ディスクパーティションを破壊する危険なしに両方の環境
に対して最大の性能を引き出す、私が経験した中で唯一の方法です。

【注:もしこの文書の以前のバージョンを使って、Windows のスワップ領
域が適切に回復されない(Windows がスワップファイルが壊れていると文句を
言う)という問題が発生した場合はこのバージョンの <tt/shutdown/ スクリプ
トを試して下さい。以前のバージョンから少し変更が加えられています。】
</abstract>


<sect>何が必要か
<p>
この手順には以下の物が必要です。古いバージョンの物にはいくらか問題があ
りますので下記の条件にあう物を揃えることを強くお勧めします。
<itemize>
<item>MS-DOS 5.0 あるいはそれ以降のバージョン(テストは 6.2 で行いました)
<item>MS-Windows 3.1 あるいはそれ以降のバージョン
<item>シャットダウン中にファイルを実行できる <tt/shutdown/ および 
<tt/init/。(例えば SysVinit-2.50 パッケージにはこの機能があります。
SysVinit-2.50 は <tt/sunsite.unc.edu/ の <tt>/pub/Linux/system/Daemons</tt> 
から入手できます)
</itemize>

<sect>手順
<p>
<itemize>
<item>DOS を boot します。<tt/FDISK/ を使って必要なスワップ領域の大き
さを持つ DOS パーティションを作ります。 このパーティションにドライブ文
字(番号)を割り当てます。以下の説明では、例えば ``<tt/LABEL X:/'' や 
``<tt/COPY FOO X:DUMMY.DAT/'' という命令では <tt/X/ をあなたが割り当て
たドライブ文字に読み換えてください。
<item>DOS の <tt/FORMAT/ コマンドでこのパーティションをフォーマットします。

<verb>
        FORMAT X:
</verb>

<item>このパーティションのボリュームラベルを DOS の <tt/LABEL/ コマン
ドを用いて ``<tt/SWAP SPACE/'' に設定します。<tt/DIR/ コマンドを用いて
ボリュームラベルを確認してください。パーティションのフォーマットとボリュー
ムラベルの設定は別々に行ってください。というのは <tt/FORMAT/ コマンド
のいくつかのバージョンはボリュームラベルを本来置くべきブートセクタに置
かないらしいからです。【<tt/注/: 数人の方からボリュームラベルはルートディ
レクトリに書かれるとの指摘を受けました。確かにその通りですが、少なくと
も DOS 5.0 からはブートセクタにも書き込まれます。】

<verb>
        LABEL X:
        DIR X:
</verb>

<item>Windows を起動してください。コントロールパネルを開いて
``<tt/386 Enhanced/'' を選んでください。 ``<tt/Virtural Memory/'' を選
んでドライブ <tt/X:/ に最大容量の Windows 永久スワップファイル(Windows
Permanent swap file)を作ってください(Windows が最大容量を教えてくれる
でしょう)。 Windows はそんなに大きなスワップファイルは使えないと文句を
しれませんが、無視してスワップファイルをとにかく作ってください。
<item>Windows を終了してください。
<item>Linux を boot して root で login してください。
<item><tt/fdisk/ コマンドを用いてパーティションの名前とブロック数を見
つけます。<tt>/dev/winswap</tt> からこのパーティションにシンボリックリ
ンクを張ります。パーティションの名前が <tt/hda7/ なら

<verb>
        ln -s /dev/hda7 /dev/winswap
</verb>

と打ち込んでください。

<tt/純正主義者への注/: シンボリックリンクを使ってください。このパーティ
ションの名前はいくつかの初期設定(configuration)ファイルに置かれるので、
名前の不一致は致命的になる可能性があります。
<item>下記はパーティションを分析していくつかの特別な情報を引き出すバイ
ナリファイルを <tt/uuencode/ したものです。<tt/uudecode/ した後 
<tt/gunzip/ で解凍し、

<verb>
        msinfo /dev/winswap
</verb>

と実行してください。

<!-- !!!注意!!! -->
<!--
     以下の uuencode された文書の中に含まれる "&" は "&ero;" に変換さ
     れているので、そのまま uudecode できません。必ず fmttext した後で
     uudecode して下さい。
-->
<code>
begin 755 msinfo.gz
M'XL(`$$YNRT"`Y557TQ;51@_MW]HZ0AM'"$U-.28W([..>84%1%D2QH>',9*
M2S&ero;VC);V=FV]T*;WWBD+1I)K'YH;DOJF#YH80GPR^J""D"R8-K('MS2;#Q*S
M%Y,E-P&ero;592A$V:[?.;?M"FP/?DG/G^_[?7_Z_3G7PL313TT(?8P0<J"CI':8
M$5H^#:=5<KT^MQ`^UAQ1O*QUH0<.]B7S/FC[U!98Y;))]<*N^AG"^LB((J%E
MAFIM[A9U0O`;%:*7N#[L%G!_-IH34V(J,WUZ.CK%O6I#N4DTE,E-144Q-7T)
M>]_PX\M<3@!`'ZZ26[`-I7A.F!%$;JK.;21`!#.\-,5A/CK)\=B3FL:3F8PH
M<#$QDSO91Q%^>L%"Z@KW*"-NR3;""5SN,A?'NI[0=P0Q=#[P&ero;&ero;$5@3UNZ3VW
M=-(V`NYQ/)6CX)DC2F`KD!&ero;C/!:R7"Q%]L-6`8'D+=]8T*^$V8@RR\;5\P9(
M^;\&ero;T:F]E`Q`EI,_6YHCZBT#BJ09M0VV9!:XVKLF]0NX%'Z4R];\W](3A-%J
MI:`_&ero;12!>@33QC0S'V8]?O5+0`;3UC23K)!"?@97N8R#:29MF/>R)PI>UJF)
MK%/-4QR39OSJE8,8MHZ)UC#`?1ZX'N!ZU`L'X;@.?X["C<1DUT%,9QW32C''
M"<98PQR#8#=(L'>96NQWR/4W1@>H3\'!OC3,MMN_"[,=A1OVK^XEH($[$S^H
MY@28=MB78-$/`=8)(L=\P*$5*I_LS@)_G7!=\Z9V@F"``Y$XQM[T!T>(WHNU
M/T9CH)YIZI("&ero;9ZK32AR=DTN/QNZ."&ero;7?27H_<(=_^=Q"U1N3Y.>!-E`$BY(
M;(4ZG)/[\_0F_54HY7\5[<!33)\2M%:Y(.THX_N%K?%2L9&ero;(O=4>8F^@IV9(
M,<HEDU:17T'23M)GA#ANW-<F'J5-]>6!G2;BU+YN)@<RL.JBIFD4[:<###UG
MO3Z77WO?L?O+@@G\+(-<"X&ero;QT"&ero;#_N7@_\2;JGAEF&ero;U1`JR#ZCD/Z]7HJ'ZH
M09_JNAZGJ^N?X5.39_AXMY!!?3@6G>X2,9^)QG%\!IZ@5`SSJ>EWN!SN>HCK
MLJ%F08R*J5B4YV=T0-R&ero;J#UYJW>4#"7/#D,0/GG`0ZI@__`;6->]K!>C[<GD
M31/IQP>:!B]D?DT,*<;Y6=9Y]3:P][^W`?+>8F(1!*ZY7B1:BN=@D_XY9?0I
M'?ZT0=V@BBWIIV$47#Y@7-,9Q>0<*=7;NMW-NS2>9#_X3V)8()?A$;!`ALRW
M#&ero;\%RO_^@9F6TP<]'M8J@'AFA"[JM]0(WCQ!`[.826!F&ero;A@HG4JWU5R_KKL&ero;
M9GNQF$;J[?NZ\YUZ?B].C,OEWI*\94J`:6LB?U,RK^2.([0QRQK(W!D2[K5M
M,G>&ero;0B7A'K03F"'17*&ero;L#9XU@+U2L9K4-GCIG(K(NE:SM,>SM,?;X,T:&ero;U6,
MT./E%NAUTNE_$,^E(A0M!B7K[D'>X6'\FC25Q3W=+V3YLR^CXJW.S0>#54*#
M#ZE^AI+N-35^_>![U4!?@VQ%ET<L!BC>MC5"\GH->"T6'4/2NS>((N0,DT>_
9K6^!S%65KRS`,`,UVB43\!]-BKG]B`<``#5"
`
end
</code>
``<tt/Total special sectors/'' の数字を書き留めておいてください。また、
ボリュームラベルが ``<tt/SWAP SPACE/'' になっていることを確かめてくだ
さい。もしそうなっていなければ DOS を reboot してもう一度 <tt/LABEL/ 
コマンドでボリュームラベルを設定してください。それでもまだうまくいかな
いときは使用した DOS のバージョンを私に知らせてください。手助けします。
<item>【オプションの手順】Windows はしばしばたとえそうしないようにと指
示されても、パーティション上にいくらかの領域を残します。この領域は使用
しないで下さい。Linux を走らせた時に必ず消去されます。このような領域を
偶然使用して(データを失って)しまうことを避けたい場合は以下に示す命令を
用いて埋め草ファイルを作り、その領域を埋めて下さい:

<verb>
	mkdir /mnt
	mount -t msdos /dev/winswap /mnt
	dd if=/dev/zero of=/mnt/dummy.fil
	umount /mnt  
</verb>

<tt/dd/ コマンドは ``<tt/No space left on device/'' と言って来ますが、
これは正に望み通りの結果です。
<item>シャットダウンファイルの名前を確認してください。SysVinit では
<tt>/etc/inittab</tt> で以下のように記述されています。<tt>/etc/inittab</tt>
に以下の記述が無い場合は付け加えてください。

<verb>
	# Runlevel 0 means shut down the system
	l0:0:wait:/etc/brc
</verb>

この HOWTO ファイルの残りの部分では、シャットダウンファイルのファイル
名は <tt>/etc/brc</tt> であると仮定します。
<item>以下のように打ち込んでください

<verb>
        dd if=/dev/winswap bs=512 count=XXX | gzip -9 > /etc/winswap.gz
                                        ^^^
                                    「置き換え」
</verb>

ここで <tt/XXX/ を ``<tt/Total special sectors/'' の数に置き換えて
ください。
<item>下記の記述を <tt>/etc/rc</tt> ファイル(あるいはあなたの 
<tt/init/ が呼び出すファイル)の ``<tt/swapon -a/'' コマンドの前に加え
てください(もしそのようなコマンドがなければ、<tt>/etc/rc</tt> ファイル
にあるどんな <tt/mount/ コマンドよりも前に加えてください)。

(Slackware 2.x のように) <tt>/etc/rc.d</tt> ディレクトリが存在する場合、
下記の記述を加えるファイルは ``<tt>/etc/rc.d/rc.S</tt>'' です。

もしあなたの <tt/swapon/ が <tt>/etc</tt> にある場合は、下記の記述の中
の <tt>/sbin/swapon</tt> を <tt>/etc/swapon</tt> に置き換えてください。
もし <tt>/bin</tt> にある場合は、<tt>/bin/swapon</tt> に置き換えてくだ
さい。<tt/mkswap/ についても同じ操作を行ってください。

<tt/XXXXX/ を <tt/fdisk/ コマンドで与えられるパーティションの実際のブ
ロック数で置き換えてください。
<code>
---[BEGIN CODE SEGMENT]---
#
# 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
---[END CODE SEGMENT]---
</code>
<item>下記の記述を <tt>/etc/brc</tt> ファイル(あるいはそれと同様のこと
を行っているファイル)の、スワップが必要となる可能性のある、あらゆるコ
マンドの後に加えてください。<tt>/etc/rc.d</tt> ディレクトリが存在する
場合は、<tt>/etc/rc.d/rc.0</tt> ファイルが <tt>/etc/brc</tt> ファイル
に相当します。

<code>
---[BEGIN CODE SEGMENT]---
#
# 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 > /dev/winswap
else
  echo 'ERROR: /dev/winswap lacks swap signature, skipping restore'
fi
---[END CODE SEGMENT]---
</code>

<item>Linux を reboot します。この時新しいスワップデバイスが有効になっ
ているはずです。
</itemize>

<sect>2,3 の注意
<p>
<itemize>
<item><tt>/dev/winswap</tt> を <tt>/etc/fstab</tt> ファイルに加える必
要はありません。実際、(おそらくコメントとして加える以外は)そうしないほ
うが賢明です。
<item>Linux セッションがクラッシュしたりあるいは <tt>/etc/brc</tt> を
実行せずに Linux を終了した場合には、Windows のスワッピングが働く前に 
Linux を reboot して終了しないといけません。<tt/FORMAT X:/ した後 
Windows のスワップファイルを作り直すという手段も可能です。これに関する
唯一の方法は <tt>/etc/brc</tt> に記述されたコマンドと同等のものを DOS 
の <tt/AUTOEXEC.BAT/ ファイルに入れておくことでしょう。が、不幸なこと
に私は DOS での手段を知らないのです!
</itemize>

<sect>翻訳者の放棄声明
<p>
<itemize>
<item>私はこの翻訳が正確である事を一切保証しません。
<item>私はこの翻訳の内容および、この翻訳からから生じたことについて、い
かなる責任も否認します。
</itemize>
</article>
