SHARING SWAP SPACES BETWEEN LINUX AND MS-WINDOWS A mini-HOWTO by Peter Anvin Copyright (C) 1994 H. Peter Anvin VERSION: 1.2 Date: 13 Nov 1994 0. ABSTRACT Many people use both Linux and MS-Windows. The ability to do so is an important part of "the Linux revolution"; i.e. letting people experiment with (and get hooked on) Linux while still being able to run their off-the-shelf software. Since both Linux and MS-Windows use virtual memory with swap to disk, a frequently occurring question in comp.os.linux.help is how to share swap spaces, in order to reduce the amount of disk space needed. There are several methods for sharing swap spaces, the one described in this document is probably the most complicated one but is the only one I have encountered that allows maximum performance for both environments without the risk of trashing a disk partition. NOTE: If you have used a previous version of this document and have had problems with swap space not getting properly restored (Windows claims your permanent swapfile is corrupt), try the slighly revised shutdown script in this version. 1. WHAT YOU NEED This procedure have a few requirements that need to be filled. I strongly recommend that you fill these requirements *anyway*, as there are several problems with older versions. * MS-DOS 5.0 or newer * MS-Windows 3.1 or newer * A shutdown/init that knows to run a file on shutdown. (The SysVinit-2.50 package can do this, for example. SysVinit-2.50 is available from sunsite.unc.edu in /pub/Linux/system/Daemons) 2. THE PROCEDURE * Boot DOS. Create a DOS partition (using FDISK) the size = the size swap space you want. It will be assigned a drive letter; use that drive letter instead of X whenever these instructions lists a command like "LABEL X:" or "COPY FOO X:DUMMY.DAT" * Format this partition using the DOS FORMAT command. FORMAT X: * Set the volume label on this partition to "SWAP SPACE" using the DOS LABEL command. Verify it by the DIR command. Please do this as a separate step. Some versions of FORMAT do not seem to put the volume label in the boot sector as it should. [Note: some people has written me saying the volume label is stored in the root directory. Yes, but at least since DOS 5.0 it has also been in the boot sector.] LABEL X: DIR X: * Start Windows. Go to the Control Panel, select "386 Enhanced". Select "Virtual Memory" and create a Windows Permanent swap file on drive X: of maximum size (Windows will tell you the maximum size). Windows may complain saying it will not use a swap file that big. Ignore the message and create the file anyway. * Exit Windows. * Boot Linux, then log in as root. * Use the fdisk command to find the name of the partition and its size in blocks. Create a symbolic link from /dev/winswap to this partition. If the paritition is hda7, then type: ln -s /dev/hda7 /dev/winswap [NOTE TO PURISTS: Please use a symlink. The name of this partition is going to go into several configuration files and inconsistencies could be fatal.] * The following is a uuencoded binary that analyzes the partition and derives some special information; uudecode the following file, gunzip it and run it as: msinfo /dev/winswap begin 755 msinfo.gz M'XL(`$$YNRT"`Y557TQ;51@_MW]HZ0AM'"$U-.28W([..>84%1%D2QH>',9* M2S&VC);V=FV]T*;WWBD+1I)K'YH;DOJF#YH80GPR^J""D"R8-K('MS2;#Q*S M%Y,E-P&592A$V:[?.;?M"FP/?DG/G^_[?7_Z_3G7PL313TT(?8P0]_PX\M<3@!`'ZZ26[`-I7A.F!%$;JK.;21`!#.\-,5A/CK)\=B3FL:3F8PH M<#$QDSO91Q%^>L%"Z@KW*"-NR3;""5SN,A?'NI[0=P0Q=#[P&&$5@3UNZ3VW M=-(V`NYQ/)6CX)DC2F`KD!&C/!:R7"Q%]L-6`8'D+=]8T*^$V8@RR\;5\P9( M^;\&T:F]E`Q`EI,_6YHCZBT#BJ09M0VV9!:XVKLF]0NX%'Z4R];\W](3A-%J MI:`_&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("&9ZK32AR=DTN/QNZ."&7?27H_<(=_^=Q"U1N3Y.>!-E`$BY( M;(4ZG)/[\_0F_54HY7\5[8F^@IV9( M,6!G2;BU+YN)@X2,9^)QG%\!IZ@5`SSJ>EWN!SN>HCK MLJ%F08R*J5B4YV=T0-R&J#UYJW>4#"7/#D,0/GG`0ZI@__`;6->]K!>C[:!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#&\%RO_^@9F6TP<]'M8J@'AFA"[JM]0(WCQ!`[.826!F&A@HG4JWU5R_KKL& M9GNQF$;J[?NZ\YUZ?B].C,OEWI*\94J`:6LB?U,RK^2.([0QRQK(W!D2[K5M M,G>&0B7A'K03F"'17*&L#9XU@+U2L9K4-GCIG(K(NE:SM,>SM,?;X,T:&U6, MT./E%NAUTNE_$,^E(A0M!B7K[D'>X6'\FC25Q3W=+V3YLR^CXJW.S0>#54*# M#ZE^AI+N-35^_>![U4!?@VQ%ETMC5"\GH->"T6'4/2NS>((N0,DT>_ 9K6^!S%65KRS`,`,UVB43\!]-BKG]B`<``#5" ` end Take note at the number saying "Total special sectors", and verify that the volume label says "SWAP SPACE". If it does not, reboot DOS and re-do the LABEL command. If it still does not work, please inform me about which version of DOS you are running, and I will try to help you out. * [Optional step] Windows may occationally leave some space on the partition, even if it is told not to. Don't attempt to use this space, since it will be erased any time you run Linux. If you want to avoid accidentally using it (and lose data), you can create a dummy file that fills that space by using the following commands: mkdir /mnt mount -t msdos /dev/winswap /mnt dd if=/dev/zero of=/mnt/dummy.fil umount /mnt The dd command will report "No space left on device". This is exactly what you want. * Check the name of the shutdown file. For SysVinit this is the file listed in the following line of /etc/inittab; add it if you don't have it. # Runlevel 0 means shut down the system l0:0:wait:/etc/brc For the remainder of this file, I will assume the filename was /etc/brc. * Type: dd if=/dev/winswap bs=512 count=XXX | gzip -9 > /etc/winswap.gz ^^^ Replace ... where XXX is replaced with the "Total special sectors" number. * Add the following piece of code to your /etc/rc file (or whatever your init calls it), right before the command "swapon -a" (if there is no such command, add it to your /etc/rc file right before any mount commands). If you have a directory /etc/rc.d (like Slackware 2.x), the file you want to put this in should be called "/etc/rc.d/rc.S". If your swapon is in /etc, replace /sbin/swapon with /etc/swapon. If it is in /bin, replace with /bin/swapon. Do the same for mkswap. Replace XXXXX with the actual size of the partition in blocks, as given by fdisk. ---[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]--- * Add the following piece of code to your /etc/brc file (or whatever it is called -- it is /etc/rc.d/rc.0 if you have an /etc/rc.d directory); put this after any command that might need swap to be in place. ---[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]--- * Reboot Linux. You should now have swapping on the new swap device. 3. A COUPLE OF NOTES * There is no need to add /dev/winswap to your /etc/fstab file. In fact, it is probably wise not to do so (except possibly as a comment). * If your Linux session crashes or otherwise exits without running /etc/brc, you will need to reboot and exit Linux before swapping in Windows will work. It is also possible to FORMAT X: and re-create the Windows swapfile. The only way around this would be to put the equivalent of the /etc/brc commands in the DOS AUTOEXEC.BAT file; unfortunately I don't know of any way of doing that in DOS!