Frequently Asked Questions

From Multics Wiki
Jump to: navigation, search


Backup, Dump, and Retrieving Segments and Directories

How to create a backup_dump tape as an unprivileged user

In order to use backup_dump to backup directories when you are logged into a non-privileged account (e.g. Multics, SysEng, etc.), you have to use the -debug control argument to the backup_dump command. This disables attempts to call phcs_ and hphcs_ privileged gates.

Here is an example. Say you want to backup the directory >udd>Multics>Swenson

You create a dump control file — let’s call it foo.dump, and put this as the single line in the file:


(If you wanted to backup multiple directories, place the absolute pathname of the directories one per line in the dump control file).

The filename should have the extension “.dump”.

Then, use the following command:

backup_dump -control foo -debug

(Replace “foo” with the prefix of the dump control file you created.)

You willl be prompted for a tape name. Provide one. If the tape is blank or non-existent, an RCP message will appear on the operator console asking the operator to authenticate the tape. A tape drive name will be provide — for example: tapa_04. In order to authenticate the tape, you type:

x auth tapa_04 ***

(Replace the tapa_04 with the name of the tape drive for which authentication is requested).

(The *** means: “just do it”. You could also type in the current tape label, if you knew what it was).

backup_dump should display some other messages and end with a “Normal Termination” message.

If you get prompted for the tape name again, something is preventing you from writing to that tape. It is likely that you don’t have access to the tape drive. If the tape drive chosen is tapa_04, then you need rw access to the access control segment (ACS) here: >sc1>rcp>tapa_04.acs.

If you still don’t succeed, make sure you are using the -debug control argument.

If you still don’t succeed, do the following:

Type: “new_proc” (this will force close the map and err_file i/o switches) and create a new process. Now that the switches are closed, you will see non-zero .map and .ef files in your working directory. Look at the contents of the .ef (error file) and you should see some helpful error message that will point you in the right direction.

Why are the I/O switches (called “map” and “err_file”) not closed when things fail? Well, it probably has to do with the fact that backup_dump is just an entrypoint into the set of programs used by the hierarchy dumpers (complete, catchup, and incremental), and those are setup to not “die” on failure, but to reprompt and let the operator type in a new tape name (under the assumption that the wrong tape name was entered and the mount rejected by the operator). Since the process doesn’t die, but continues running, the i/o switches are left open as a running record of the dump process. Now, as to why they don’t get closed if you QUIT (and get to a recursive command level) and then type “release” (or “rl”), that seems to me a bug.

How to retrieve directories from backup_dump tapes

If you have created a backup_dump tape and want to retrieve one or more directories from that tape, you can use the following process:

First, create a retrieval control file. Let’s use as an example, a segment called “foo.retrieve”. You can name it anything and the suffix is not relevant.

You should include in this text file, one line per directory (with a starname) you want to retrieve. The assumption is that a matching directory will be on the tape you will load.

For example, if you have dumped >udd>Multics>Swenson, and under that directory is a single subdirectory, call it “foo”, that you want to retrieve, you would have a retrieval control file with the single line:


That will request that the directory “foo” and all of the subtree below this direcory will be retrieved from the tape.

Now, invoke the retrieve command as such:

retrieve foo.retrieve

(Replace foo.retrieve with the name of the retrieval control file you created).

You can use the -map control argument to get a map. You can use the -noreload control argument if you just want to get a map and not actually reload any files.

You will be prompted for a tape name, which the operator might have authenticate. (e.g. “x auth tapa_04 ***”).

When the retrieve command exits, you should have the directory restored from tape into the storage system. There are LOTS of options for the retrieve command — for instance you can retrieve to a different location as was specified on the tape. Do a “help retrieve” for more info.

Retrieving files from backup_dump tape for unprivileged user

It is not possible for an unprivileged user to use the backup_load or retrieve (or related) commands to load Multics dump tapes. Even though a -debug control argument exists on these commands, and even though the -debug control argument for backup_dump *does* allow unprivileged users to use that command, it appears that access to the system_privilege_ [sic] gate is required for the backup_load and retrieve commands.

Unprivileged users should use the tape_archive (ta) command to create a tape archive and then commit this tape archive to tape. That command can also be used to load a tape archive from a tape into the Multics storage system. Once the tape archive is loaded in the storage system, you can use tape_archive (ta) commands to extract / update / delete / add segments to the tape archive.

How to get help on privileged and semi-privileged commands

By default the >doc>privileged directory is NOT in the default “info” search paths. For example, for help on the “retrieve” command, if you type:

help retrieve

you will be told:

help: Entry not found. retrieve
r 21:16 0.028 5

If you add the >doc>privileged directory to the “info” search paths, you will be able to get this documentation.

asp info >doc>privileged
r 21:17 0.017 0

help retrieve
doc>privileged>   (3 lines follow;  194 in info)
02/27/85 retrieve

Syntax as a command:  retrieve path {-control_args}

Function (14 lines).  More help?   no
r 21:17 0.078 11

System Administration

How to set password of daemon or user accounts

You will need to either perform the following step from admin mode on an Initializer console (e.g. the operator console) or from a SysAdmin or appropriately privileged account.

From an Initializer console, enter admin mode:


Or you can login as a user in the SysAdmin project.

Then, execute the following:

cwd >udd>sa>admin
ec master chpass <username>
<enter password>
Password again:
<enter password>

If you executed the above from admin mode on an Initializer terminal, exit admin mode by typing:


How set access to write to tapes

backup_dump, tape_archive, generate_mst and other Multics applications expect to be able to read and/or write tapes; the appropriate ACLs need to be set to allow the access from a user account.


sa >sc1>rcp>tapa_**.acs rw Swenson.SysAdmin

How authenticate a tape from the operator console

If a tape mount mounts a tape with an incorrect label or a blank tape label, RCP will ask for operator authentication.

Enter the following command on the operator console. Substitute tapa_01 (below) with the tape drive specified in the RCP message requesting authentication.

x auth tapa_01 ***

From a privileged process, you can execute the following command to authenticate a tape. Substitute the appropriate tape drive in this command:

authenticate_device tapa_01 ***

How to update date/time cutoff for a project

While the default cutoff date for all projects is "open", meaning no cutoff, this open cutoff was implemented in Multics by using the "last possible date" which was set at 12/31/1999 as the cutoff date. As of MR12.6, which included the ACTC Y2K fixes, we can now run our Multics systems in years after 1999. However, any PDTs that were not automatically updated during the upgrade to MR12.6 will still have open cutoffs specified as a cutoff of 12/31/1999. The MR12.6 installation automatically updated the PDTs for these projects: SysDaemon, SysAdmin, and Daemon. These are the three projects that are automatically created upon Multics installation, and therefore, known to exist. For all other projects, you will have to manually update the PDTs so that the "open" cutoff limit is set far into the future. To do this, follow these instructions:

First, you need to know where the PMF is located for the project in question. If you have been using the standard administrative exec_coms to create all projects, then, at least for undelegated projects, the PMF should be located in one of two places:

  1. In >udd>sa>a>pmf.archive
  2. In >udd>sa>a

In the first case, the PMF is inside an archive. In the second case, it is a freestanding segment in >udd>sa>a. The latter case is not really good practice, but it may well be that the last update of the PMF was done manually and that the pmf.archive was not updated and the PMF deleted as a standalone segment.

If the PMF for the project for which you'd like to adjust the cutoff is freestanding, just execute the following commands:

cv_pmf <project>
install <project>.pdt -a

In this case, it is probably good practice to put the PMF in the pmf.archive archive, and delete it from >udd>sa>a. To do this, you can use the following command if the entry is already in pmf.archive:

ac rd pmf <project>.pmf

Or, if the PMF doesn't already exist in pmf.archive, you can do this:

ac ad pmf <project>.pmf

If the PMF is not freestanding, but is in pmf.archive, you can do the following:

ac x pmf <project>.pmf
cv_pmf <project>
install <project>.pdt -a
dl <project>.pmf

Note the delete of <project>.pmf, above. This is because the PMFs of undelegated projects are supposed to be stored in pmf.archive and not as freestanding segments. If you always use exec_com >udd>sa>a> to create and manage projects, then this will be maintained for you.

Note: we did not need to make any changes to the PMF. We only needed to convert it from a PMF to a PDT and then install the updated PDT. The act of doing the cv_pmf command updated the cutoff date to be way in the future. The install command installed the PDT in >sc1 (where it needs to be to be recognized by the answering service).

How to increase the inactivity timeout period

By default, Multics enforces an hour inactivity timeout. If a user does not interact with Multics for more than 1 hour, he/she will be automatically logged out. There is a warning message displayed to the user 5 minutes before this automatic logout.

If you wish to increase the inactivity timeout period (you can't disable it), you can follow these procedures:

ed_installation_parms >sc1>installation_parms

The program will respond with the prompt:


You can see the current inactivity timeout by typing:

p inactive_time

And you will get a response similar to this one:

inactive_time:      3600 sec.

You can change this value by typing something like:

c inactive_time

And you will prompted with:

inactive_time (seconds):

Enter a value in seconds, such as:


Then save your changes and quit with:

type w
type q

Note that Multics doesn't support per-user or per-project inactivity timeouts. This is a system-wide parameter.

What is a special session and how do I enter one?

When Multics is booted and the answering service is started, there are two modes the system can be in. One is a "normal" session and the other is a "special" session. A special session may be used when systems personnel need to perform system maintenance (or a software upgrade) from a normal login terminal, but where they want to ensure that no one else (except authorized maintenance personnel) can login. This is effected by changing the "login word". The "login word" is normally "login". That is, when you login, you use a command like:

login Swenson Multics

However, in a special session, the login word is changed to a random 4-digit number, e.g. 4567. In this case, you have to know the login word, and you would login with a command like:

4567 Swenson Multics

When you boot Multics and wish to start a normal session, you issue the operator command "boot star" or "boot startup". This will load the FNP and start up the answering service and set the login word to "login".

If you wish to start a special session, you use the command "boot mult". This will boot to ring-4 Initializer command level. If you wish to load the FNP and have the answering service listen for logins and connections from terminals, you follow this with the "go" command. The system will generate a random 4-digit login word and display it on the operator console (actually the Initializer terminal). When Multics was in use on real hardware at customer sites, the operator could tell the system maintenance personnel what the login word was, and they could use it to login.

If you are in a special session, as terminals "dial up", they are told "Special session in progress". Attempts to login with the "login" login word will fail. To exit special session, issue the Initializer command "word login".

How do I add a TCD card to my config deck?

If you are seeing a message upon boot that indicates that you don't have a TCD card in the config deck, you can safely ignore this message. If it annoys you, or you want other-than-default TCD parameters, you can do the following:

First, you have to not be running Multics. Either shut it down to BCE or boot up to BCE, but don't start Multics (e.g. don't type "boot XXXX".

At the BCE prompt, enter this command:


To print out the current config deck, you can issue this (qedx) command:


BCE will display the current config deck. You can use qedx commands to insert/append/edit/delete entries in the config deck. To add a TCD card at the end of the config deck, type:

tcd 1000. 2000.

You can substitute other values for the parameters on the TCD card,but make sure you are familiar with the TCD card by reading about it in the System Maintenance Procedures manual before doing so.

Now, if you have just shut down Multics to get to BCE, issue this command:


And then you can start up normal service with this:

boot star

How do I forcibly logout (bump) a user?

If you wish to force-logout a user, which is called, in Multics, "bumping" a user, you can use the operator "bump" command.

On the operator console, you can type: “bump <personid>.<projectid>

As an administrator, you can use the command “send_admin_command sc_command bump <personid>.<projectid> <time> <message>”. the short name for send_admin_command is “sac”.

Using “send_admin_command sc_command <command>” is a way for an admin to execute arbitrary operator commands.

How do I add a new user?

Follow the following example to add a new user to your Multics system. Make sure you are logged into a user on the SysAdmin project. For a brand new system, the only accessible SysAdmin account will be Repair.SysAdmin.

cwd >udd>sa>a
r 11:05 0.017 0

ec master register

Enter full user name (Last, First I.)
Full name           Swenson, Eric J.

Enter mailing address
Address             Room 13

Enter programmer number
Prog. number        

Enter notes

Enter default project
Project ID          SysAdmin
Password again:
Network Password:

User ID assigned is "Swenson".
Is this OK? y

More users to add? no
r 11:06 0.390 55


Note: you must provide some value for the Full name, and Address fields. The newly created user will not be able to login until you add this user to some project. See the FAQ entry on how to do that.

How do I add a user to a project?

Before you can add a user to a project, you must have created the user. See the FAQ entry on how to do that.

Follow the following example to add a user to a project. Make sure you are logged in as a user on the SysAdmin project. For a brand new system, the only accessible SysAdmin account will be Repair.SysAdmin.

cwd >udd>sa>a
r 11:16 0.016 0

ec master upmf SysAdmin Swenson
r 11:17 0.250 47

The first parameter to the upmf function (in is the ProjectId. The second parameter is the Personid.

Note: the above command will extract the project PMF from pmf.archive, update it, convert the PMF to a PDT, and install the PDT. Then, it will re-archive the PMF in pmf.archive.

How do I change the name of my Multics system?

When you cold boot a new Multics system, its name will be "Installation and location". Clearly, this is not what you want. You may also not like the choice you (or someone else) originally made for the so-called "installation_id". The installation id shows up in many places, but the most prominent is when you connect to Multics:

Multics MR12.6: Installation and location (Channel d.h000)
Load = 5.0 out of 90.0 units: users = 5, 12/01/15  1121.4 pdt Tue

To change the installation id, make sure you are logged in with sufficient privileges (such as an account in the SysAdmin project). Then use the ed_installation_parms prorgram like this:

ed_installation_parms >sc1>installation_parms

The system will respond with:

Hit QUIT and use "program_interrupt" to return this request loop.

Here, you can use the "p all" command to see all the parameters. Or the "p installation_id" to see the current setting of this installation parameter. You can change the value with the "c installation_id" command:

type c installation_id
Installation id     Gold Hill Multics
type w
type q
r 22:01 0.067 2

To check the value, do this:

type p installation_id
Installation id     Gold Hill Multics

Now, when you logout and log back in, you will be greeted with your new installation id:

Swenson.SysAdmin logged out 12/01/15  1301.7 pdt Tue
CPU usage 3 sec, memory usage 7.7 units, cost $1.76.
Multics has disconnected you
Multics is now listening to this line

Multics MR12.6: Gold Hill Multics (Channel d.h000)
Load = 5.0 out of 90.0 units: users = 5, 12/01/15  1301.7 pdt Tue

Can I add an alias for my Personid?

While historically, Multics Personids were either a user's last name, or more frequently, a combination of initials and last name, it was also possible to have an alias. An alias might be user's initials or something easier to type and all lower-case. With an alias, you can login with the shorter alias, rather than your possibly difficult-to-type Personid. Although not specifically tied to aliases, a common practice was to also get the alias as an added name on your home directory.

To add an alias for a Personid, make sure you are logged into a privileged project, such as SysAdmin, and use the following example as a guide:

cwd >udd>sa>a
r 13:34 0.740 97

ec master chalias Swenson ejs
r 13:34 0.402 33

The first parameter to the chalias function (in is the Personid. The second is the desired alias. The command displays the old alias.

If you'd like to add the alias to the home directory, use the add_name (an) command, as follows:

an >udd>SysAdmin>Swenson ejs

How do I increase the inactivity timeout period?

If you haven't done anything in a Multics process for a while, the answering service will log you out. You will see a message indicating that your inactivity period has been exceeded. You do get a 5-minute warning message before you are automatically logged out, however.

If you'd like to increase this value, you can. You cannot disable the inactivity period completely, nor can you change it on a person-by-person or project-by-project basis. It is a system-wide installation parameter. The default value for this timeout is 3600 seconds, or 1 hour.

To change it, make sure you are logged into a privileged project (like SysAdmin) and follow the example below to change the inactivity timeout:

ed_installation_parms >sc1>installation_parms
Hit QUIT and use "program_interrupt" to return this request loop. 
type p inactive_time
inactive_time:      3600 sec.
type c inactive_time
inactive_time (seconds): 7200
type p inactive_time
inactive_time:      7200 sec.
type w
type q
r 14:10 1.291 4

How do I create a new project?

To create a new project, and set the initial member(s) of the project, you must login to an project with sufficient privileges (e.g. *.SysAdmin). You can follow the example below, substituting appropriate values for the project name, various fields, and members. You can hit <enter> or <return> at each prompt to accept the default value. Note that in a clean system, the Other (load control group), which will be selected as the default group, doesn't allow shift 1 logins, so either specify System (as shown below) if appropriate, or create a new load control group first, and specify it here. Alternately, you can change the Other load control group to allow shift 1 logins, which might be the best option.

cwd >udd>sa>a
r 13:34 0.899 354

ec master new_proj Multics
Creating new project "Multics".
Title:   Multics
Inv. Address:   
Amount:                 open

Cutoff date:            12/02/16  0000.0 pdt Fri

Billing name:   
Billing Address:   
Project Alias: type "." to delete current alias from SAT.
Project administrators. Type "." to delete.
Absentee foreground cpu limit: 0

Authorization:          system_low

Audit flags:            fsobj=N/N,fsattr=N/N,rcp=N/N,admin=N/N,special=N/N,other=N/N,^admin_op,^priv_op,^fault,^small_cc,^moderate_cc

Segment quota:          100

Directory quota:        10

Rate structure:         default

Default group:          Other
Authorized groups. Type "." to delete.
Attributes:             anonymous, bumping, brief, vinitproc, vhomedir, nostartup;
Grace:                  2880

Minimum login ring:     4

Maximum login ring:     5

Maximum pdir quota:     0

Maximum foreground processes: 0

Maximum background processes: 0

new_proj: Do you wish to review the project?   no
Project directory logical volume: 
Enter initial list of users. Type "." to exit
 Person:                Swenson

Input for "Multics" complete.
daily_summary: cut 0, warned 0, total $0.00
archive: >udd>sa>a>Multics.pmf appended to >udd>sa>a>pmf.archive
r 13:35 1.390 93

How do I set a second logical volume?

If you have a system where the entirety of the file system is on the Root Logical Volume (RLV), and you want to create another logical volume, the walkthrough below will provide an example on how to do this.

First, you have to make sure you have more physical disks configured in your system. With the DPS8 simulator, you will need to define another "disk". You most likely have one disk now, configured something like this:

attach disk1 rpv.dsk

For a second disk, where the host filesystem file has a different name (useful if you want to move a disk between multiple systems), specify a different filename in an attachment for disk2 (or the first available disk):

attach disk2 <some-name>.dsk

For the following example, I'm going to add a new logical volume called "system". It will, like the RPV, consist of three physical volumes: sys01, sys02, and sys03.

In a privileged process or in Initializer admin mode, register the three physical volumes (sys01, sys02, and sys03) and specify the local volume (system) they should be part of. The first of these registrations will actually register the logical volume (system).

M-> avr -pv sys01 -lv system -model 3381 
add_volume_registration: LV "system" does not exist.  Do you wish to create it?    M-> y
add_volume_registration: Registered PV "sys01" (pvid 657440773012) on new LV "system" lvid 657440773003).
r 00:21 0.166 7

M-> avr -pv sys02 -lv system -model 3381
add_volume_registration: Registered PV "sys02" (pvid 657464464261) on LV “system".
r 00:21 0.061 3

M-> avr -pv sys03 -lv system -model 3381
add_volume_registration: Registered PV "sys03" (pvid 657507447757) on LV "system".
r 00:21 0.060 3

Now, we’ve registerd a new logical volume called “system” comprised of three physical volumes called sys01, sys02, and sys03.

Now, on the Initializer console (not in admin mode), initialize the three physical volumes thus:

M-> init_vol sys01 dska_02a -special
request:M-> end
volume sys01 68111 records

M-> init_vol sys02 dska_02b -special
request:M-> end
volume sys02 68111 records

M-> init_vol sys03 dska_02c -special
request:M-> end
volume sys03 68111 records

(It is probably not necessary to add -special, but I wasn't sure).

Now, once the physical volumes are initialized, you add the volumes to the system:

M-> av sys01 dska_02a
M-> av sys02 dska_02b
M-> av sys03 dska_02c

And once you have the phyical volumes mounted, you can mount the logical volume:

M-> alv -all
lv system mounted

In my case, I now have 6 physical volumes, which I can see by doing this (Initializer console):

M-> ld

dska_01a rpv      root
dska_01b root2    root
dska_01c root3    root
dska_02a sys01    system
dska_02b sys02    system
dska_02c sys03    system

If I use the list_volume (lsv) Initializer command, we see:

M-> lsv
                                           Avg PV
Drive   Records  Left  %  VTOCEs  Left  %  Size Name     PB/PD LV Name

dska_01a  29950 11605  39  14974 12462  83    7 rpv      pb    root
dska_01b  68111 42229  62  13622 10576  78    8 root2    pb    root
dska_01c  68111 44387  65  13622 10675  78    8 root3    pb    root
dska_02a  68111 68111 100  13622 13622 100    0 sys01    pb    system
dska_02b  68111 68111 100  13622 13622 100    0 sys02    pb    system
dska_02c  68111 68111 100  13622 13622 100    0 sys03    pb    system


Now, note that the number of records on each of the three physical volumes is 68111. That means that we have a total of 68111*3 (204,333) records in the logical volume.

Now, in order to be able to administer this logical volume, and, say, create directories on it. You have to (in admin mode) do the following.

First create an ACS for the logical volume:

M-> create >lv>system.acs
r 00:26 0.047 9

Then, change the volume registration for the “system” volume to use this ACS:

M-> cvr -lv system -acs >lv>system.acs
change_volume_registration: Changed attributes of LV "system".
r 00:27 0.049 2

Set the max length of the ACS segment to 0 (we don’t want people writing to this segment, which they can, if they have w access to the ACS):

M-> set_max_length >lv>system.acs 0
r 00:27 0.049 5

And then, remove access for Initializer.SysDaemon. This is necessary, because Initializer.SysDaemon got rw access by virtual of the “create” command, above. But *.SysDaemon and *.SysAdmin got “rew” access. The “e” access is required to administer the logical volume. So removing the specific entry for Initializer.SysDaemon will allow that process to get the “rew” access from the *.SysDaemon ACL.

M-> la >lv>**.acs
rw    Initializer.SysDaemon.*
rew   *.SysDaemon.*
rew   *.SysAdmin.*

r 00:27 0.092 1

M-> da >lv>system.acs
r 00:27 0.052 0

M-> la >lv>system.acs 
rew   *.SysDaemon.*
rew   *.SysAdmin.*

r 00:27 0.062 0

Now, in either Initializer admin mode, or any SysAdmin process, we can set the logical volume quota:

M-> set_volume_quota system 200000
r 00:29 0.049 3

Note: we can probably set this to 204333, because I believe directories are all created on the RLV and therefore we don’t have to worry about directory quota on the new LV, just segment quota. And we should have 204333 records on the LV. But this is playing it safe.

Now, we can create a directory on this logical volume. You use the normal create_dir (cd) command, but you specify the -lv control argument to say you want it on a different logical volume than the parent directory (in this case the parent directory is the root (>)).

M-> cd >ejs -lv system -quota 10000
r 00:30 0.048 2

So now there is a new directory off of the root (ejs) which is NOT on the RLV, but rather on the "system" LV.

How do I configure Multics to have a printer, reader, and punch device?

Add the following cards to your config deck.

mpc -ctlr urpa -model 8004. -iom a -chn 15 -nchan 1 
prph -device rdra -iom a -chn 15 -model 301. 
mpc -ctlr urpb -model 8004. -iom a -chn 16 -nchan 1 
prph -device puna -iom a -chn 16 -model 301. 
mpc -ctlr urpc -model 8004. -iom a -chn 17 -nchan 1 
prph -device prta -iom a -chn 17 -model 1600. -train 600. -ll 136. 

SST Pool Sizes

The default SST pool sizes as defined by our install config deck are:

sst  -4k 2000. -16k 1000. -64k 500. -256k 250.

These sizes were probably designed for a Multics system with a small amount of memory. During very intensive file system operations, the system can hang, become totally unresponsive, or even crash. According to one (reliable) source, each ASTE is 12 words long plus the page table. The entire SST cannot be larger than a segment (256K words). It probably makes sense to utilize a whole segment for the SST - a drop in the bucket of a system with 4 4MW SCUs.

If you use file_system_meters (fsm) you can see what your ASTE usage is. It will include a section like this:

AST Sizes             4        16        64       256
Number             2000       500       200        50
Need               6722       750      1139       104
Steps           7666485       750    147423      1263
Ave Steps        1140.5       1.0     129.4      12.1
Lap Time(sec)       0.5    1396.0       2.8      82.9

You want average steps to be less than 2. As you can see, above, the 4K pool size is way too small.

Here are some settings that completely consume one segment (262144=256K words):

4k  5501 5501*(12 + 4)   =  88016 words
16k 1442 1442*(12 + 16)  =  40376 words
64k  702  702*(12 + 64)  =  53352 words
256k 300  300*(12 + 256) =  80400 words
		         = 262144 = 256K words

This would translate into an SST config deck card of:

sst  -4k 5501. -16k 1442. -64k 702. -256k 300.

Of course, you should run file_system_meters after some typical usage and see what you get. You may require totally different values.

How to setup the crank

The "crank" are the daily, weekly, and disk report absentee jobs run by the system administrators. These are necessary to keep the system healthy and also provide reports for administrators.

To set up the crank, decide on the SysAdmin user who is doing to run the crank and related exec_coms. It can be anyone on the SysAdmin project.

Then, login as that SysAdmin user.

Before you can schedule the absentee jobs, you have to set up a few variables in the "value segment" (think of this as a config file that can be queried via exec_coms).

The pathname of the value segment used by the crank is >udd>sa>a>sys_admin.value.

To see the current values in this segment, use these command:

cwd >udd>sa>a
r 13:24 0.051 8

value_list -pn sys_admin
    abort_crank               "false"
    accounting_start_up_time  "2015-12-22__17:36:46.203305_pst_Tue"
    admin_online              "SA1.SysAdmin"
    crank_time                "0300."
    default_addr              "ADMINISTRATOR"
    default_dest              "SYSTEM"
    disk_time                 "0230."
    log_number                "0"
r 13:24 0.051 8

To set the required variables to allow the crank to run, do the following (still in the >udd>sa>a directory):

value_set -pn sys_admin last_diskreport "2015-12-17__22:57:20.526510_pst_Thu"
r 13:24 0.051 8

value_set -pn sys_admin last_log_time "2015-12-17__22:57:20.526510_pst_Thu"
r 13:24 0.051 8

value_set -pn sys_admin weekly_time "0400._6days"
r 13:24 0.051 8

The first two settings for last_diskreport and last_log_time configure when the crank was last run. You will get errors if these are not set, so set these to dates in the past (the above values should work).

The third setting tells the system what time to run the weekly job. In the example above, we run the weekly job at 04:00 (4AM). Note that the disk report is run at 02:30 and the crank at 03:00. Those values were already set in the sys_admin.value segment.

The crank requires the Terminals, Operator, and HFED projects to exist. If these exist already, you can skip this next step. It won't hurt to execute it in any case:

cv_pmf (Terminals Operator HFED)
r 13:35 0.148 34

install (Terminals Operator HFED).pdt -a
r 13:35 0.148 34

ac ad pmf [segs *.pmf]
r 14:02 0.110 15

Now it is time to run the crank for the first time. This will actually not complete successfully, but will schedule the crank run for 0300 the next day. It should run successfully then.

ec master crank
ID: 10455982; 0 already requested.
>udd>sa>a>crank.absin in queue 1
sumry at end of file.
cutrpt at end of file.
daily_summary: cut 0, warned 0, total $0.00
sumry device detached.
cutrpt device detached.
system_total: range err: dayx = 0, not 1-190. set to 190
system_total: range err: qhi = 2804154368, not 1-96. set to 96
summarize_sys_log: 5 streams, 37 selectors
summarize_sys_log: Log >system_control_dir>as_logs>log from 2015-12-22 17:37:07
\c.968223 to 2016-01-11 13:37:26.593098
summarize_sys_log: 175 messages read.
summarize_sys_log: 3 streams, 15 selectors
summarize_sys_log: Log >system_library_1>syserr_log from 2015-12-22 17:23:47.49
\c6112 to 2016-01-11 13:17:41.657665
summarize_sys_log: 561 messages read.
summarize_sys_log: 1 streams, 1 selectors
summarize_sys_log: Log >system_control_dir>as_logs>admin_log from 2015-12-22 17
\c:25:03.502298 to 2016-01-11 13:16:43.186541
summarize_sys_log: 1942 messages read.
summarize_sys_log: 1 streams, 1 selectors
summarize_sys_log: The requested log message cannot be located. Cannot find mes
\csage before 2016-01-11 13:37:27.594181
move_log_segments: At least two log segments must be present in >sc1>syserr_log
\c>syserr_log in order to migrate one.
move_log_segments: Use of star convention resulted in no match. Listing >sc1>as
move_log_segments: Use of star convention resulted in no match. Listing >sc1>as
move_log_segments: Use of star convention resulted in no match. Listing >sc1>as
     105 messages copied into:
     371 messages processed,
     syserr seq_num 1000179 through
     syserr seq_num 1000550.
    No records were deleted from:
remove_registry: Use of star convention resulted in no match. >udd>sa>a>safe_re
delete_registry: Use of star convention resulted in no match. >udd>sa>a>safe_re
copy_registry: Use of star convention resulted in no match. >sc1>rcp>**.rcpr
truncate: Entry not found. meter_data.print
truncate: Entry not found. bwchart.print

Error:  out_of_bounds at b_and_w$|2253
referencing >udd>sa>a>today.use_totals|776206
Attempt to access beyond end of segment.
r 13:37 7.572 578 level 2

You can release that command level with:

r 13:37 7.572 578

If you then list your absentee requests, you'll see that the crank is scheduled:


Absentee queue 1:    1 request. 1 total request.

213725.5 crank.absin (deferred by user to 01/12/16 03:00)

r 13:39 0.097 1

Invoke this command to get the disk report doing:

ec master disk_auto
$ Following figure is total quota / current use.
dir: 267340/924
seg: 290543/75216
charge_disk: No logical volumes specified. Storage on all logical volumes will 
\cbe charged for.
charge_disk: charged 7 dirs out of 20 to 6 projects
ID: 12557720; 1 already requested.
>udd>sa>a>dodrp.absin in queue 1
r 13:40 1.425 71

Invoke this command to get the weekly job running:

ec master weekly
ID: 13024732; 2 already requested.
>udd>sa>a>weekly.absin in queue 1
save_dir_info: Incorrect access on entry. Cannot get quota of
save_dir_info: Incorrect access on entry. Cannot list inacl of
save_dir_info: Incorrect access on entry. >udd>SysAdmin>admin>
comp_dir_info: Entry not found. Accessing dir_info segment
delete: Entry not found. >udd>SysAdmin>admin>old.admin.dir_info
comp_dir_info: Entry not found. Accessing dir_info segment
delete: Entry not found. >udd>SysAdmin>admin>old.lib.dir_info
save_dir_info: Incorrect access on entry. Cannot get quota of PNT.pnt
save_dir_info: Incorrect access on entry. Cannot list inacl of PNT.pnt
save_dir_info: Incorrect access on entry. >system_control_1>PNT.pnt
save_dir_info: Incorrect access on entry. Cannot get quota of user_messages
save_dir_info: Incorrect access on entry. Cannot list inacl of user_messages
save_dir_info: Incorrect access on entry. >system_control_1>user_messages
comp_dir_info: Entry not found. Accessing dir_info segment
delete: Entry not found. >udd>SysAdmin>admin>old.system_control_1.dir_info
comp_dir_info: Entry not found. Accessing dir_info segment
delete: Entry not found. >udd>SysAdmin>admin>old.pdt.dir_info
r 13:41 3.194 63

The errors are ok at this point.

Now you should have the daily and weekly absentee jobs setup.

How do I set the time zone

The time zone is initially set in the config deck, on the CLOK card. However, you can dynamically change the time zone using the set_time_zone (stz) Initializer command. From the info segment:

>doc>ss>operator>   (6 lines follow;  12 in info)

04/23/87  set_time_zone, stz

Syntax as a command:  stz time_zone

Function: sets the system time zone to the zone specified.

Arguments (7 lines).  More help?   y

   is a time zone abbreviation defined in time_info_.  The zone
   abbreviation can be in any of the languages known to the date/time
   system.  To print a list of acceptable zone values, type
   "display_time_info -zone" or "display_time_info -map" (in admin
   mode, they are not initializer commands).

Using Multics

On a fresh, cold booted system, how do I login? What Personid.Project and password should I use?

If you have followed the Multics installation instructions for a cold boot, there will be one privileged user account you can login as. It is Repair.SysDaemon. The password is initially "repair", but you will have to change it on first login, which of course, you should do. Here is what a first login attempt would look like:

Multics MR12.6: Installation and location (Channel d.h000)
Load = 5.0 out of 90.0 units: users = 5, 12/01/15  1058.1 pdt Tue
l Repair SysAdmin
You must use the -change_password option to change your password.
Please try to login again or type "help" for instructions.
l Repair SysAdmin -cpw
New Password:
New Password Again:
Password changed.
You are protected from preemption.
Repair.SysAdmin logged in 12/01/15  1058.6 pdt Tue from ASCII terminal "none".

New messages in message_of_the_day:

Welcome to the Multics System.

print_motd:  Created >user_dir_dir>SysAdmin>Repair>Repair.value.
r 10:58 0.277 31

Note the use of the "-cpw" (or "-change_password") control argument to the "login" command.

I keep typing CD instead of CWD. Is there any way to add an alias?

What are called "aliases" on Linux are called "abbrevs" on Multics. You can enable abbrevs by invoking the command "abbrev". You can add abbrevs with the ".a" command. Do a "help abbrev" for full documentation.

Here is an example of accidentally typing "cd" instead of "cwd", realizing the mistake, enabling abbrevs, and creating an abbrev for "cd" that maps to "cwd".

ls -d

Directories = 1.

sma  foo

r 11:27 0.028 1

cd foo

create_dir: Name duplication. Do you want to delete the old directory >user_dir_dir>SysAdmin>Swenson>foo?      no
r 11:27 0.047 2

r 11:27 0.014 12

.ab cd cwd
abbrev: Profile >user_dir_dir>SysAdmin>Swenson>Swenson.profile created.
r 11:27 0.030 7

cd foo
r 11:27 0.027 0

r 11:27 0.024 1

Tip: If you have abbrevs, it is helpful to turn on abbrevs automatically upon login. See the FAQ entry called "Where is my .bashrc? for details."

Is there a .bashrc or equivalent?

On Multics, command scripts are called "exec_coms", or "ecs" for short. When you login, unless you specifically prevent it, Multics will automatically execute an exec_com called in your home directory.

For details on exec_com syntax, type "help exec_com". Below you will find a trivial that turns on abbrevs.


                   12/01/15  1140.7 pdt Tue

&version 2
&trace &command off
&goto &ec_name

&label start_up
&if [equal &1 login] &then print_motd

r 11:40 0.034 0

The above uses "version 2" exec_coms. See the documentation for details, but basically, version 2 exec_coms are better and support more features. The "&trace &command off" tells the command processor to not display the commands as it is executing them.

It is always good practice to use the "&goto &ec_name" and "&label XXX" convention because this allows you to add additional names to exec_coms and get different functionality depending on with which name you invoked the exec_com.

When start_up exec_coms are invoked, they are passed a parameter, which can be "login", "logout", and other possibilities. This example checks to make sure this is a "login" (rather than a new_proc) and if it is, then displays the "Message of the Day" (motd). Otherwise, it skips that step. In all cases, however, abbrevs are enabled.

Emacs keeps asking me for a terminal type. Isn't there are better way?

Multics has the notion of a "terminal type", and it supports many different varieties. Unfortunately, most of these terminals have long since gone to the terminal graveyard. Many terminal simulators these days support the old VT100 or VT132 terminal, and Multics does too. If you haven't set a terminal type, say, in your, and you invoke "emacs" (or other applications that use the Multics video system), you see a prompt like this one:


What type of terminal do you have? 

At this point, you may type in a terminal type like "vt100" or "vt132", but you will likely not be happy with the page length and line length settings associated with these terminal types. Fortunately, the "emacs" command takes some control arguments that allow you some choice in the matter. Specifically, it supports these three useful control arguments:

  • ttp (terminal type)
  • pl (page length)
  • ll (line length)

So you can invoke emacs this way:

emacs -ttp vt132 -pl 50 -ll 132

And you will have a much better emacs editing experience. And of course, you can create an abbrev (see FAQ entry on aliases) to make this automatic:

.ab emacs    emacs -ttp vt132 -pl 48 -ll 132

When using the Multics video system (window_io_) via the "wdc invoke" command, you should not specify a terminal type, page length, or line length when invoking emacs. The following emacs abbrev handles the different methods for invoking emacs.

.ab emacs    emacs [if [wdc video_invoked] -then -else "-ttp vt132 -pl 78"]

Emacs, Quick & Short

Emacs on Multics is a little rough on the edge ( :D )

Here are the few commands I found most useful for starter :

Quit : CTRL-x, CTRL-c Save : CTRL-x, CTRL-s

Moving cursor into the file (yes, it's a full screen editor !), use you keyboard arrows !

Just kidding, arrows do not work.

Up : CTRL-p Down : CTRL-n Left : CTRL-b Right : CTRL-f

Next page : CTRL-v Previous page : ESC v

Goto Line : ESC g

Search text : CTRL-s

Kill line : CTRL-k

There is an inline help system accessible with CTRL-_ (CTRL + Underscore)

CTRL-_ A will ask for a keyword about which you need help, and will display it if available

Emacs requests using ^O do nothing, when logged in via telnet.

Emacs has several requests that include ^O in their keystroke.

  • ^O open-space
  • ^X^O delete-blank-lines
  • ESC-^O split-line

However, for telnet logins to Multics, these connections may be ignored. That happens because telnet defines ^O as an escape sequence to flush pending output from the telnet channel.

telnet> display flushoutput
flushoutput     [^O]

The flushoutput escape sequence may be disabled by invoking the telnet as a subsystem, to use telnet requests:

~ => telnet
telnet> unset flushoutput
flushoutput character is 'off'.
telnet> open localhost 6180
Trying ::1...
Connected to localhost.
Escape character is '^]'.

Connected to the dps-8/m simulator MUX device, line 1

HSLA Port (d.h001,d.h002,d.h003,d.h004,d.h005,d.h006,d.h007,d.h008,d.h009,d.h010,d.h011,d.h012,d.h013,d.h014,d.h015,d.h016,d.h017,d.h018,d.h019,d.h020,d.h021,d.h022,d.h023,d.h024,d.h025,d.h026,d.h027,d.h028,d.h029,d.h030,d.h031)?

You may automate this login process, if your host system includes the expect command. For example, on a Unix or Linux system, check for existence of the command using the man or which commands:

man -k expect

expect(1)                - programmed dialogue with interactive programs, Version 5

~ => which expect

The expect command uses an input script to make a connection to another system, look for "expected" output lines from that system, provide responses to those outputs, etc.

Line 1 of the following Unix/Linux shell script specifies /usr/bin/expect as the target command to be invoked with that script as input. This script may be placed in some directory in your executable search paths, and then can be invoked as a command. For example, it could be given as the command to open a connection in your terminal emulation client.

Subsequent lines are expect requests which:

  • Adjust the default timeout period when expecting output from the remote system.
  • Start the telnet command.
  • Specify maximum amount of output that might be expected in each output expected from the remote system.
  • Wait for ("expect") a telnet prompt.
  • Send a request to disable the flushoutput escape sequence.
  • Wait for the response from that request.
  • Send a request to open a connection to the Multics system.
  • Wait for a port specification request from the Multics FNP (matching the given regular expression).
  • Send a CR reply (FNP simulator picks a port from the list).
  • Wait for a Multics Login banner (matching the given regular expression).
  • Ends the script by turning control over to the user (letting the user interact with the system).
#!/usr/bin/expect -f
set timeout -1
spawn telnet
match_max 100000
expect -exact "telnet> "
send -- "unset flushoutput\r"
expect -exact "unset flushoutput\r
flushoutput character is 'off'.\r
telnet> "
send -- "open localhost 6180\r"
expect -re "HSLA Port (.*)\? $"
send -- "\r"
expect -re "Load = .*\r
expect eof

How do I change the titles on my dprint output?

When you print a segment on Multics (see the "dprint" or "enter_output_request") info segments for details on how, the output pages will have banners using the values in the "titles" installation parameter. If you wish to change these, make sure you are logged into a privileged project (like SysAdmin) and follow the example below to change these values:

ed_installation_parms >sc1>installation_parms
Hit QUIT and use "program_interrupt" to return this request loop.
type p titles
Company:            Company Name
Department:         Department Name
Companyds:          C o m p a n y   N a m e
Departmentds:       D e p a r t m e n t
type c titles
company             Swenson Clan
department          R&D
company (ds)        S w e n s o n  C l a n
department (ds)     R & D
type p titles
Company:            Swenson Clan
Department:         R&D
Companyds:          S w e n s o n  C l a n
Departmentds:       R & D
type w
type q
r 14:03 0.075 4

How do I permanently define my Terminal type?

You can easily define your terminal type in your file, imagine you want to use vt102, just add this line :

stty -ttp vt102

log out then log in, you're done

Why won't Multics let me log two sessions concurrently?

By default, projects are setup to only allow one login session at a time. You can easily change this by giving the project the "multip" attribute.

Without this attribute, a second login attempt might result in a login message such as the following:

Multics MR12.6: Gold Hill Multics (Channel d.h002)
Load = 6.0 out of 90.0 units: users = 6, 12/02/15  1342.3 pdt Wed
l ejs Multics
Attempt to log in Swenson.Multics from ASCII terminal "none".
Swenson.Multics already logged in from ASCII terminal "none".
Please try to login again or type "help" for instructions.

You can, of course, login to a different project, but you will be warned that this is what you are doing when you login:

Multics MR12.6: Gold Hill Multics (Channel d.h002)
Load = 6.0 out of 90.0 units: users = 6, 12/02/15  1342.3 pdt Wed
l ejs sa
Another Swenson (Swenson.SysAdmin) is now logging in from ASCII terminal "none".
This is your 2nd interactive login instance.
You are protected from preemption.
Swenson.SysAdmin logged in 12/02/15  1344.8 pdt Wed from ASCII terminal "none".
Last login 12/02/15  1333.9 pdt Wed from ASCII terminal "none".
r 13:44 0.792 24

In order to give a Project or a specific user on a Project the multip attribute, you have to update the Project in the SAT as well as the project's PDT. It is not enough to do one or the other.

To update the Project in the SAT, follow similar steps to these:

cwd >udd>sa>a
r 14:56 0.044 5

edit_proj Multics attributes 
Attributes:             anonymous, bumping, brief, vinitproc, vhomedir, nostartup;
r 14:57 0.078 2

install smf.cur.sat -a
r 14:57 0.029 2

Note that we didn't use the "" this time, but the new_proj command directly. We gave edit_proj the project name (Multics) and the field we wanted to update (attributes). Edit_proj displayed the existing allowed attributes for the project and then prompted for changes. Typing "multip" added that attribute to the list (it didn't change any of the other attributes). Because we didn't use "", we have to manually install the updated candidate SAT (smf.cur.sat).

You can verify that this change was made by doing the following:

print_sat >sc1>sat Multics 

   projectid:       Multics;
/* state:           1; */
   projectdir:      >user_dir_dir>Multics;
/* pdt_ptr:         554|0; */
   maxprim:         32767;
/* n_users:         1; */
   attributes:      anonymous, multip, bumping, brief, vinitproc, vhomedir, nostartup;
   authorization:   "system_low";
/* days_to_cutoff:  366; */
/* pct_balance:     100%; */
/* dollars_to_cutoff: $0.00; */
   ring:            4,5;
   group:           System;
   grace:           2880;
   pdir_quota:      0;
   max_foreground:  0;
   max_background:  0;
   abs_foreground_cpu_limit: 0;

r 15:00 0.069 2

Note the "multip" attribute is now allowed for this project. Next, you have to update the PDT for the project. You can do that by editing the PMF with your favorite editor (emacs, qedx, ted, etc.). Change the Attrributes line (fields with initial capital letters are per-project and those with initial lowecase letters are per-user) to include the multip attribute.

PMFs for undelegated projects are stored in the archive >udd>sa>a>pmf.archive. You should extract the PMF from the archive using a command similar to this (assuming you're still in the >udd>sa>a directory):

ac x pmf Multics.pmf
r 15:04 0.319 1

Then, edit the PMF to add the multip attribute. Here is an example PMF edited already:

pr Multics.pmf

                    Multics.pmf         12/02/15  1501.7 pdt Wed

Projectid:          Multics;
Initproc:           process_overseer_;
Grace:              0;
Attributes:         vinitproc, vhomedir, nostartup, multip;

personid:           Swenson;

r 15:01 0.054 7

Once you have edited the PMF, convert it to a PDT, install the PDT, and put the PMF back in pmf.archive:

cv_pmf Multics
r 15:06 0.059 2

install Multics.pdt
r 15:06 0.018 1

ac rd pmf Multics.pmf
r 15:06 0.028 1

Now, you will be able to login to the project more than once, concurrently:

Multics MR12.6: Gold Hill Multics (Channel d.h002)
Load = 6.0 out of 90.0 units: users = 6, 12/02/15  1507.5 pdt Wed
l ejs Multics
Another Swenson (Swenson.Multics) is now logging in from ASCII terminal "none".
This is your 2nd interactive login instance.
You are protected from preemption until 15:07.
Swenson.Multics logged in 12/02/15  1507.6 pdt Wed from ASCII terminal "none".
Last login 12/02/15  1506.2 pdt Wed from ASCII terminal "none".

r 15:07 0.246 19

Why can't I create a backup using backup_dump?

In order to use backup_dump, you must have access to privileged gates. However, you can get around this by using the -debug control argument to the backup_dump command. Still, even if you have access to privileged gates or use the -debug control agument, you may run into a situation where after running the backup_dump command, you see something similar to the following:

backup_dump -control foo     

Type primary dump tape label:   test
Mounting tape test for writing
Error file attached to file "backup_dump.12/02/15.1511.ef".
Map attached to file "!".

Type primary dump tape label:   

In other words, two things happened that don't look right:

  • You see the message about an error file being attached
  • You are prompted again for the tape label

To see what is going wrong, hit QUIT (Control-C in the simulator) and type "release" ("rl").

Type primary dump tape label:   QUIT
r 15:15 0.397 29 level 2

r 15:15 0.020 0

If you now type "ls", you will see zero-length segments for the map and error file. This is because backup_dump leaves two i/o switches attached (map and err_file). To see this, you can use the "print_attach_table" ("pat") command:

map                 file !
          IOS compatibility w
err_file            file backup_dump.12/02/15.1511.ef
          IOS compatibility w
dump_control        file_ foo.dump      IOS compatibility r
error_output        syn_ user_i/o -inh close get_line get_chars
user_output         syn_ user_i/o -inh close get_line get_chars
user_input          syn_ user_i/o -inh close put_chars
user_i/o            tty_ -login_channel -suppress_dial_manager
r 15:16 0.039 1

Note that the "map" and "err_file" switches are still attached. The corresponding files are still open. Close them with the following command:

iocall detach (map err_file)
map device detached.
err_file device detached.
r 15:17 0.022 3

Note the use of parentheses to invoke the iocall command twice -- once on the switch named "map" and once on the switch named "err_file".

Now, if you do an "ls", you will see that the files are closed and non-zero in length:


Segments = 6, Lengths = 6.

r w    1  !
r w    1  backup_dump.12/02/15.1511.ef
r w    1  foo.dump
r w    1
r w    1  Swenson.profile
r w    1  Swenson.value

r 15:18 0.031 0

Taking a look at the error file, you see:

pr backup_dump.12/02/15.1511.ef

                    backup_dump.12/02/15.1511.ef  12/02/15  1519.2 pdt Wed

bk_output: Resource not accessible to the requesting process. test,sys

r 15:19 0.046 0

This means that you are not allowed to access the specified tape or tape drive.

Assuming you are in a privileged process, give youself access to a tape drive using the "send_admin_command" ("sac") to execute a command in the Initializer.SysDaemon process:

sac sa >sc1>rcp>tapa_05.acs rw *.SysAdmin
send_admin_command: Execution started ... completed.
r 15:20 0.173 17

We've giver ourselves access to a single tape drive (all we need is one!). Now, let's try again, after first deleting our old .map and .ef files:

dl **.map **.ef
r 15:21 0.056 0

ls *.dump

Segments = 1, Lengths = 1.

r w    1  foo.dump

r 15:21 0.017 0

backup_dump -control foo
backup_dump: Ioname already attached and active. Attaching control file foo.dump
r 15:21 0.017 0

It looks like one more I/O switch needs to be closed, but let's verify:

dump_control        file_ foo.dump      IOS compatibility r
error_output        syn_ user_i/o -inh close get_line get_chars
user_output         syn_ user_i/o -inh close get_line get_chars
user_input          syn_ user_i/o -inh close put_chars
user_i/o            tty_ -login_channel -suppress_dial_manager
r 15:21 0.015 0

Yes, the "dump_control" switch needs to be closed:

iocall detach dump_control
dump_control device detached.
r 15:21 0.013 0

Let's try again:

backup_dump -control foo

Type primary dump tape label:   test
Mounting tape test for writing

That's much better. But note that the last message said "Mounting tape...", but didn't actually tell us that it was mounted. That is because either the operator is out to lunch (just kidding), or the tape doesn't already have the correct label (we asked for one with the label "test"), or that the tape is blank. In our case, this is a blank tape. The operator must confirm the tape mount. A message will have appeared on the operator console similar to the following:

1521.6  RCP: Attached tapa_05 for Swenson.SysAdmin.a
1521.6  RCP: Note (tapa_05) - test,sys
1521.6  RCP: Mount Reel test with ring on tapa_05 for Swenson.SysAdmin.a
1521.6  RCP: Authenticate tapa_05.  It has blank label .
1525.6  RCP: Check Mount of test for writing on tapa_05 for Swenson.SysAdmin.a
1525.6  RCP: Note (tapa_05) - test,sys

To this prompt, the operator (you) must, on the operator console, respond with:

x auth tape_05 ***

You can also, as a privileged user, use the following command to do this from your terminal:

authenticate_device tapa_05 ***

But that would mean you'd need another logged in terminal, since you are in the middle of doing the backup_dump command. (Yes, you could QUIT and authenticate the tape and then restart).

For now, just use the "x auth" command, above. Our backup_dump command completes:

Mounted blank volume "test" on device tapa_05
Begin at 12/02/15  1521.5 pdt Wed
Map attached to file "!".
Normal termination 12/02/15  1532.8 pdt Wed.
r 15:32 1.751 25

I got a record_quota_overflow error. What do I do?

Multics supports per-directory quotas. A directory may have a specific quota, or it may get its quota from its parent directory. Each directory off of the root must have a quota. If you run out of quota, you need to "move" quota to an appropriate parent directory (or a directory with a quota) from a parent directory.

Note: Multics supports both segment quota and directory quota. We're only talking about segment quota here.

For example: Let's say that you get a record_quota_overflow error while attempting to write something in your home directory. You can check to see if your home directory has quota via a command like this:

gq >udd>SysAdmin>Swenson
quota = 0; used = 2975
r 15:54 0.013 0

The above example shows that there is no explicit quota on >udd>SysAdmin>Swenson, but this directory is currently using 2975 records. It presumably is getting these from its parent directory. Let's check:

gq >udd>SysAdmin
quota = 3000; used = 3000
r 15:55 0.013 0

Aha! We see that Swenson's home directory is getting its quota from >udd>SysAdmin, which is at its maximum quota of 3000 records.

We need to give more quota to >udd>SysAdmin. Let's make sure that the parent directory (>udd) has enough quota.

gq >udd
quota = 3790; used = 0
r 15:56 0.010 0

We can see that it has 3790 records. So without giving more quota to >udd, we can only move a maximum of 3790 records of quota from >udd to >udd>SysAdmin. Let's do that:

mq >udd>SysAdmin 3790
move_quota: Record quota overflow. >udd>SysAdmin
r 15:58 0.020 0

Well, that didn't work. We can't allocate the maximum. Let's try 3000 records:

mq >udd>SysAdmin 3000
r 15:58 0.009 0

That worked. Let's check:

gq >udd>SysAdmin
quota = 6000; used = 3000
r 15:59 0.011 0

That should give all users of the SysAdmin project 3000 more records of quota. Since the original directory we tried to add segemnts to (>udd>SysAdmin>Swenson) didn't have any quota set, we don't need to move quota to it. It will just borrow from the parent. We should be all set now (until we run out of the 3000 records!)

How to use MRDS/Linus

MRDS is the Multics Relational Database System. Linus is a query system for MRDS and stands for Logical Inquiry and Update System. MRDS is not SQL, but it is SQL-like.

The following provides an example of how to create an MRDS database, and how to use linus to populate it and display the entries.

The database being created is a simple one, with a single table. Its purpose in this example, is manage spending, with a table named purchases. The items in the purchases table are date, payee, category, payment_type, amount, and notes. The following segment, named spending.cmdb, provides the definition of this data base:

          text char(50) varying,
          date_time fixed bin(71)
                    -decode_dcl char (17)
                    -encode_proc >udd>User>Scarafino>how_to>db_date_encode
                    -decode_proc >udd>User>Scarafino>how_to>db_date_decode,
          dollars fixed decimal(59, 2) unal,
          name char(24),
          kind char(18);

          date date_time,
          payee name,
          category kind,
          payment_type kind,
          amount dollars,
          notes text;

          purchases (date* payee* category payment_type amount notes);

Note that the schema defines two encode/decode procedures (db_date_encode and db_date_decode). These must point to executable Multics programs. Source for these are provided below. Place each in its own segment (e.g. db_date_encode.pl1 and db_date_decode.pl1) and compile them. These will be invoked by MRDS to convert character strings into the Multics binary time format.


db_date_encode:  procedure (user_value, db_value, code);

          dcl user_value char(*);
          dcl db_value fixed bin(71);
          dcl code fixed bin(35);
          dcl convert_date_to_binary_ entry
                    (char(*), fixed bin(71), fixed bin(35));

          code = 0;
          call convert_date_to_binary_ (user_value, db_value, code);
          end db_date_encode;


db_date_decode:  procedure (db_value, user_value, code);

          dcl user_value char(*);
          dcl db_value fixed bin(71);
          dcl code fixed bin(35);
          dcl date_time_ entry
                    (fixed bin(71), char(*));

          code = 0;
          call date_time_ (db_value, user_value);
          end db_date_decode;

Create the data base with the following command:

cmdb spending

This produces an empty database named "spending" with a single table named "purchases".

Now linus will be used to populate the database. Following is an annotated example of how to add one item.

Invoke linus.


Open the data base for exclusive update.

linus:  o spending eu

Store a record into the purchases table.

linus:  s purchases
date ? 1/22/16
payee ? Lowes
category ? home repair
payment_type ? Visa
amount ? 84.55
notes ? sump pump

date = 1/22/16
payee = Lowes
category = home repair
payment_type = Visa
amount = 84.55
notes = sump pump

OK? y

Other records can be added in the same way. The database can be queried through linus. Following are some examples:

The input_query command allows you to construct a relational select statement.

linus:  iq
select * from purchases

The query needs to be translated.

linus:  tq

Now the results of the query can be displayed.

linus:  di

      date                  payee                 category

01/02/16  2122.2   Republic                  parking
01/05/16  2123.1   Kroger                    groceries

01/15/16  2125.2   Marriot                   hotel
01/13/16  2126.2   Speedway                  fuel

01/22/16  1247.8   Lowes                     home repair
sump pump                                                      

Here is an example where only entries with dates after January 14, 2016 are selected and displayed:

linus:  iq
A query already exists, do you wish to replace it? y
select * from purchases where date > "01/14/16"

linus:  tq

linus:  di

      date                  payee                 category

01/15/16  2125.2   Marriot                   hotel
01/22/16  1247.8   Lowes                     home repair
sump pump                                                                      

The next commands close the database and quit linus:

linus:  c

linus:  q

How to use Kermit

Assuming you are on the non-Multics host, and wish to transfer files to Multics, follow the instructions below. If you wish to transfer files from Multics, you can use the GET command rather than the SEND command.

On the non-Multics machine, start up kermit:

eswenson@ubuntu:~$ kermit
C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, for Linux+SSL+KRB5 (64-bit)
 Copyright (C) 1985, 2011,
  Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/eswenson/) C-Kermit>

Then, at the kermit command prompt, issue the TELNET command to connect to Multics:

(/home/eswenson/) C-Kermit>telnet localhost 6180
 DNS Lookup...  Trying  Reverse DNS Lookup... (OK)
Connecting to host localhost:6180
 Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.

Connected to the dps-8/m simulator MUX device, line 0

HSLA Port (d.h000,d.h001,d.h002,d.h003,d.h004,d.h005,d.h006,d.h007,d.h008,d.h009,d.h010,d.h011,d.h012,d.h013,d.h014,d.h015,d.h016,d.h017,d.h018,d.h019,d.h020,d.h021,d.h022,d.h023,d.h024,d.h025,d.h026,d.h027,d.h028,d.h029,d.h030,d.h031)?

Then, do what you normally do to login to Multics interactively:


Line 0 connected as
name:            d.h001

Multics hardcore: EjsMultics, Soquel, CA (Channel d.h001)
Load = 5.0 out of 90.0 units: users = 5, 08/11/93  1533.5 pdt Wed
l Swenson SysMaint
You are protected from preemption until 15:34.
Swenson.SysMaint logged in 08/11/93  1534.1 pdt Wed from ASCII terminal "none".
Last login 08/11/93  1418.7 pdt Wed from ASCII terminal "none".
r 15:34 0.345 59

Then, start kermit on Multics:



Issue the "server" command:


Now, to get back to the client telnet (to issue requests), type the escape character. In my case, the escape character in c-kermit is ^\C (<control><backslash>C)


(Back at ubuntu)
(/home/eswenson/) C-Kermit>

For best results, issue the following three commands:

set literal file names
set streaming off
set prefixing all

Now, issue the SEND or GET command. Here, I use SEND as an example:

send <filename>

C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, ubuntu []

   Current Directory: /home/eswenson
        Network Host: localhost:6180
        Network Type: TCP/IP
              Parity: space
         RTT/Timeout: 08 / 15
             SENDING: => TN.SH
           File Type: TEXT (ascii => ascii)
           File Size: 622
        Percent Done: 100 //////////////////////////////////////////////////
 Estimated Time Left: 00:00:00
  Transfer Rate, CPS: 20
        Window Slots: 1 of 30
         Packet Type: Z
        Packet Count: 3
       Packet Length: 6
         Error Count: 4
          Last Error: (resend)
        Last Message:

X to cancel file, Z to cancel group, <CR> to resend last packet,
E to send Error packet, ^C to quit immediately, ^L to refresh screen.

(/home/eswenson/) C-Kermit>    

Once it is finished, kermit may return to the prompt automatically. If it doesn't, use ^C to get to kermit prompt. Then, you can quit or enter other requests.