multiple ram disks; also make release process use this

so temporary partitions aren't needed any more.
This commit is contained in:
Ben Gras 2009-03-19 13:48:19 +00:00
parent 347fa61675
commit e5079dfc02
5 changed files with 81 additions and 98 deletions

View file

@ -77,7 +77,10 @@ do
$e mknod boot b 1 4; $e chmod 600 ram
$e mknod zero c 1 5; $e chmod 644 zero
$e mknod imgrd b 1 6; $e chmod 644 zero
$e chgrp kmem ram mem kmem null boot zero imgrd
for n in 0 1 2 3 4 5
do $e mknod ram$n b 1 $((7+$n)); $e chmod 600 ram$n
done
$e chgrp kmem ram* mem kmem null boot zero imgrd
;;
fd[0-3])
# Floppy disk drive n.

View file

@ -11,17 +11,22 @@ main(int argc, char *argv[])
{
int fd;
signed long size;
if((fd=open(_PATH_RAMDISK, O_RDONLY)) < 0) {
perror(_PATH_RAMDISK);
char *d;
if(argc < 2 || argc > 3) {
fprintf(stderr, "usage: %s <size in kB> [device]\n",
argv[0]);
return 1;
}
if(argc != 2) {
fprintf(stderr, "usage: %s <size in bytes>\n", argv[0]);
d = argc == 2 ? _PATH_RAMDISK : argv[2];
if((fd=open(d, O_RDONLY)) < 0) {
perror(d);
return 1;
}
size = atol(argv[1]);
#define KFACTOR 1024
size = atol(argv[1])*KFACTOR;
if(size <= 0) {
fprintf(stderr, "size should be positive.\n");
@ -33,6 +38,8 @@ main(int argc, char *argv[])
return 1;
}
fprintf(stderr, "size on %s set to %dkB\n", d, size/KFACTOR);
return 0;
}

View file

@ -32,7 +32,12 @@
#include "local.h"
#define NR_DEVS 7 /* number of minor devices */
/* ramdisks (/dev/ram*) */
#define RAMDISKS 6
#define RAM_DEV_LAST (RAM_DEV_FIRST+RAMDISKS-1)
#define NR_DEVS (7+RAMDISKS) /* number of minor devices */
PRIVATE struct device m_geom[NR_DEVS]; /* base and size of each device */
PRIVATE vir_bytes m_vaddrs[NR_DEVS];
@ -164,10 +169,15 @@ int safe; /* safe copies */
if (opcode == DEV_GATHER_S) return(OK); /* always at EOF */
break;
/* Virtual copying. For RAM disk, kernel memory and internal FS. */
/* Virtual copying. For RAM disks, kernel memory and internal FS. */
default:
case KMEM_DEV:
case RAM_DEV:
case RAM_DEV_OLD:
case IMGRD_DEV:
/* Bogus number. */
if(m_device < 0 || m_device >= NR_DEVS) {
return(EINVAL);
}
if(!dev_vaddr || dev_vaddr == (vir_bytes) MAP_FAILED) {
printf("MEM: dev %d not initialized\n", m_device);
return EIO;
@ -265,9 +275,6 @@ int safe; /* safe copies */
}
break;
/* Unknown (illegal) minor device. */
default:
return(EINVAL);
}
/* Book the number of bytes transferred. */
@ -364,34 +371,47 @@ int safe;
switch (m_ptr->REQUEST) {
case MIOCRAMSIZE: {
/* Someone wants to create a new RAM disk with the given size. */
static int first_time= 1;
u32_t ramdev_size;
int s;
int s, dev;
void *mem;
/* A ramdisk can be created only once, and only on RAM disk device. */
if (!first_time) return(EPERM);
if (m_ptr->DEVICE != RAM_DEV) return(EINVAL);
if ((dv = m_prepare(m_ptr->DEVICE)) == NIL_DEV) return(ENXIO);
dev = m_ptr->DEVICE;
if(dev < 0 || dev >= NR_DEVS) {
printf("MEM: MIOCRAMSIZE: %d not a valid device\n", dev);
}
if((dev < RAM_DEV_FIRST || dev > RAM_DEV_LAST) && dev != RAM_DEV_OLD) {
printf("MEM: MIOCRAMSIZE: %d not a ramdisk\n", dev);
}
if ((dv = m_prepare(dev)) == NIL_DEV) return(ENXIO);
/* Get request structure */
s= sys_safecopyfrom(m_ptr->IO_ENDPT, (vir_bytes)m_ptr->IO_GRANT,
0, (vir_bytes)&ramdev_size, sizeof(ramdev_size), D);
if (s != OK)
return s;
if(m_vaddrs[dev] && !cmp64(dv->dv_size, cvul64(ramdev_size))) {
return(OK);
}
if(m_vaddrs[dev]) {
printf("MEM: MIOCRAMSIZE: %d already has a ramdisk\n", dev);
return(EPERM);
}
#if DEBUG
printf("allocating ramdisk of size 0x%x\n", ramdev_size);
printf("MEM:%d: allocating ramdisk of size 0x%x\n", dev, ramdev_size);
#endif
/* Try to allocate a piece of memory for the RAM disk. */
if((m_vaddrs[RAM_DEV] = (vir_bytes) mmap(0, ramdev_size, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0)) == (vir_bytes) MAP_FAILED) {
if((mem = mmap(0, ramdev_size, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0)) == MAP_FAILED) {
printf("MEM: failed to get memory for ramdisk\n");
return(ENOMEM);
}
m_vaddrs[dev] = (vir_bytes) mem;
dv->dv_size = cvul64(ramdev_size);
first_time= 0;
break;
}

View file

@ -15,13 +15,14 @@ enum dev_style { STYLE_DEV, STYLE_NDEV, STYLE_TTY, STYLE_CLONE };
/* Major and minor device numbers for MEMORY driver. */
#define MEMORY_MAJOR 1 /* major device for memory devices */
# define RAM_DEV 0 /* minor device for /dev/ram */
# define RAM_DEV_OLD 0 /* minor device for /dev/ram */
# define MEM_DEV 1 /* minor device for /dev/mem */
# define KMEM_DEV 2 /* minor device for /dev/kmem */
# define NULL_DEV 3 /* minor device for /dev/null */
# define BOOT_DEV 4 /* minor device for /dev/boot */
# define ZERO_DEV 5 /* minor device for /dev/zero */
# define IMGRD_DEV 6 /* minor device for /dev/imgrd */
# define RAM_DEV_FIRST 7 /* first minor device for /dev/ram* */
#define CTRLR(n) ((n)==0 ? 3 : (8 + 2*((n)-1))) /* magic formula */

View file

@ -5,6 +5,9 @@ set -e
XBIN=usr/xbin
SRC=src
# size of /tmp during build
TMPKB=32000
PACKAGEDIR=/usr/bigports/Packages
PACKAGESOURCEDIR=/usr/bigports/Sources
secs=`expr 32 '*' 64`
@ -12,7 +15,7 @@ export SHELL=/bin/sh
make_hdimage()
{
dd if=$TMPDISK of=usrimage bs=$BS count=$USRBLOCKS
dd if=$TMPDISK1 of=usrimage bs=$BS count=$USRBLOCKS
rootsize=`stat -size rootimage`
usrsize=`stat -size usrimage`
@ -133,87 +136,36 @@ do
done
USRMB=550
USRBLOCKS="`expr $USRMB \* 1024 \* 1024 / $BS`"
USRSECTS="`expr $USRMB \* 1024 \* 2`"
USRKB=$(($USRMB*1024))
USRBLOCKS=$(($USRMB * 1024 * 1024 / $BS))
USRSECTS=$(($USRMB * 1024 * 2))
ROOTKB=4096
ROOTSECTS="`expr $ROOTKB \* 2`"
ROOTBLOCKS="`expr $ROOTKB \* 1024 / $BS`"
ROOTSECTS=$(($ROOTKB * 2))
ROOTBLOCKS=$(($ROOTKB * 1024 / $BS))
if [ "$COPY" -ne 1 ]
then
echo "Note: this script wants to do svn operations."
fi
TD1=.td1
TD2=.td2
TD3=.td3
TMPDISK1=/dev/ram0
TMPDISK2=/dev/ram1
TMPDISK3=/dev/ram2
if [ -f $TD1 ]
then TMPDISK="`cat $TD1`"
echo " * Warning: I'm going to overwrite $TMPDISK!"
else
echo "Temporary (sub)partition to use to make the /usr FS image? "
echo "I need $USRMB MB. It will be mkfsed!"
echo -n "Device: /dev/"
read dev || exit 1
TMPDISK=/dev/$dev
fi
if [ -b $TMPDISK ]
then :
else echo "$TMPDISK is not a block device.."
if [ ! -b $TMPDISK1 -o ! -b $TMPDISK2 -o ! $TMPDISK3 ]
then echo "$TMPDISK1, $TMPDISK2 or $TMPDISK3 is not a block device.."
exit 1
fi
echo $TMPDISK >$TD1
ramdisk $USRKB $TMPDISK1
ramdisk $TMPKB $TMPDISK2
ramdisk $ROOTKB $TMPDISK3
if [ -f $TD2 ]
then TMPDISK2="`cat $TD2`"
echo " * Warning: I'm going to overwrite $TMPDISK2!"
else
echo "Temporary (sub)partition to use for /tmp? "
echo "It will be mkfsed!"
echo -n "Device: /dev/"
read dev || exit 1
TMPDISK2=/dev/$dev
fi
if [ -b $TMPDISK2 ]
then :
else echo "$TMPDISK2 is not a block device.."
exit 1
fi
echo $TMPDISK2 >$TD2
if [ -f $TD3 ]
then TMPDISK3="`cat $TD3`"
echo " * Warning: I'm going to overwrite $TMPDISK3!"
else
echo "It has to be at least $ROOTKB KB."
echo ""
echo "Temporary (sub)partition to use to make the root FS image? "
echo "It will be mkfsed!"
echo -n "Device: /dev/"
read dev || exit 1
TMPDISK3=/dev/$dev
fi
if [ -b $TMPDISK3 ]
then :
else echo "$TMPDISK3 is not a block device.."
exit 1
fi
echo $TMPDISK3 >$TD3
umount $TMPDISK || true
umount $TMPDISK1 || true
umount $TMPDISK2 || true
umount $TMPDISK3 || true
if [ $TMPDISK = $TMPDISK2 -o $TMPDISK = $TMPDISK3 -o $TMPDISK2 = $TMPDISK3 ]
if [ $TMPDISK1 = $TMPDISK2 -o $TMPDISK1 = $TMPDISK3 -o $TMPDISK2 = $TMPDISK3 ]
then
echo "Temporary devices can't be equal."
exit
@ -223,17 +175,17 @@ echo " * Cleanup old files"
rm -rf $RELEASEDIR $IMG $IMAGE $ROOTIMAGE $CDFILES image*
mkdir -p $CDFILES || exit
mkdir -p $RELEASEDIR
mkfs -B $BS -b $ROOTBLOCKS $TMPDISK3 || exit
mkfs $TMPDISK2 || exit
mkfs -i 2000 -B $BS -b $ROOTBLOCKS $TMPDISK3 || exit
mkfs -B 1024 -b $TMPKB $TMPDISK2 || exit
echo " * mounting $TMPDISK3 as $RELEASEDIR"
mount $TMPDISK3 $RELEASEDIR || exit
mkdir -m 755 $RELEASEDIR/usr
mkdir -m 1777 $RELEASEDIR/tmp
mount $TMPDISK2 $RELEASEDIR/tmp
mkfs -B $BS -b $USRBLOCKS $TMPDISK || exit
echo " * Mounting $TMPDISK as $RELEASEDIR/usr"
mount $TMPDISK $RELEASEDIR/usr || exit
mkfs -B $BS -b $USRBLOCKS $TMPDISK1 || exit
echo " * Mounting $TMPDISK1 as $RELEASEDIR/usr"
mount $TMPDISK1 $RELEASEDIR/usr || exit
mkdir -p $RELEASEDIR/tmp
mkdir -p $RELEASEDIR/usr/tmp
mkdir -p $RELEASEDIR/$XBIN
@ -347,18 +299,18 @@ fi
echo $version_pretty, SVN revision $SVNREV, generated `date` >$RELEASEDIR/etc/version
echo " * Counting files"
extrakb=`du -s $RELEASEDIR/usr/install | awk '{ print $1 }'`
expr `df $TMPDISK | tail -1 | awk '{ print $4 }'` - $extrakb >$RELEASEDIR/.usrkb
expr `df $TMPDISK1 | tail -1 | awk '{ print $4 }'` - $extrakb >$RELEASEDIR/.usrkb
find $RELEASEDIR/usr | fgrep -v /install/ | wc -l >$RELEASEDIR/.usrfiles
find $RELEASEDIR -xdev | wc -l >$RELEASEDIR/.rootfiles
echo " * Zeroing remainder of temporary areas"
df $TMPDISK
df $TMPDISK1
df $TMPDISK3
cp /dev/zero $RELEASEDIR/usr/.x 2>/dev/null || true
rm $RELEASEDIR/usr/.x
cp /dev/zero $RELEASEDIR/.x 2>/dev/null || true
rm $RELEASEDIR/.x
umount $TMPDISK || exit
umount $TMPDISK1 || exit
umount $TMPDISK2 || exit
umount $TMPDISK3 || exit
@ -393,7 +345,7 @@ else
# number of sectors
isosects=`expr $isosects + $isopad`
( cat $IMG $ROOTIMAGE ;
dd if=$TMPDISK bs=$BS count=$USRBLOCKS ) >m
dd if=$TMPDISK1 bs=$BS count=$USRBLOCKS ) >m
mv m $IMG
# Make CD partition table
installboot -m $IMG /usr/mdec/masterboot