In order to use backup_dump to backup directories when you are logged into a non-priviledged 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:
>udd>Multics>Swenson
(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.
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:
>udd>Multics>Swenson>foo>**
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.
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.
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>retrieve.info (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
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:
admin
Or you can login as a user in the SysAdmin project.
Then, execute the following:
cwd >udd>sa>admin
ec master chpass <username>
Password
<enter password>
Password again:
<enter password>
If you executed the above from admin mode on an Initializer terminal, exit admin mode by typing:
ame
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.
Example:
sa >sc1>rcp>tapa_**.acs rw Swenson.SysAdmin
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 ***
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:
- In >udd>sa>a>pmf.archive
- 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>master.ec 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).
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:
type
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.
type
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:
7200
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.
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".
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:
config
To print out the current config deck, you can issue this (qedx) command:
1,$p
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:
$a
tcd 1000. 2000.
\f
w
q
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:
reinit
And then you can start up normal service with this:
boot star
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> <time> <message>” for example, “bump Swenson.Multics 5 “logging you out in 5 minutes”.
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.
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
Password:
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
Password:
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.
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
Notes
Enter default project
Project ID SysAdmin
Password:
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.
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 master.ec) 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.
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
abbrev
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
pwd
>user_dir_dir>SysAdmin>Swenson>foo
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."
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 start_up.ec in your home directory.
For details on exec_com syntax, type "help exec_com". Below you will find a trivial start_up.ec that turns on abbrevs.
pr start_up.ec
start_up.ec 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
abbrev
&quit
r 11:40 0.034 0
The above start_up.ec 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 start_up.ec 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.
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 emulators these days support the old VT100 or VT132 terminal, and Multics does too. If you haven't set a terminal type, say, in your start_up.ec, and you invoke "emacs" (or other applications that use the Multics video system), you see a prompt like this one:
emacs
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 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 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
/usr/bin/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 emulator 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
$"
interact
expect eof
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.
type
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
type
Now, when you logout and log back in, you will be greeted with your new installation id:
logout
Swenson.SysAdmin logged out 12/01/15 1301.7 pdt Tue
CPU usage 3 sec, memory usage 7.7 units, cost $1.76.
hangup
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
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
Alias:
r 13:34 0.402 33
The first parameter to the chalias function (in master.ec) 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
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
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
You can easily define your terminal type in your start_up.ec file, imagine you want to use vt102, just add this line :
stty -ttp vt102
log out then log in, you're done
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
Investigator:
Inv. Address:
Supervisor:
Phone:
Account:
Requisition:
Amount: open
Cutoff date: 12/02/16 0000.0 pdt Fri
Billing name:
Billing Address:
Project Alias: type "." to delete current alias from SAT.
Alias:
Project administrators. Type "." to delete.
Administrator:
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
System
Authorized groups. Type "." to delete.
Group:
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
Person:
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
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
Password:
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
Password:
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;
multip
r 14:57 0.078 2
install smf.cur.sat -a
r 14:57 0.029 2
Note that we didn't use the "master.ec" 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 "master.ec", 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;
end;
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
Password:
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
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 "!BBBKKDNWHkGBKb.backup.map".
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 emulator) and type "release" ("rl").
Type primary dump tape label: QUIT
r 15:15 0.397 29 level 2
rl
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:
pat
map file !BBBKKDNWHkGBKb.backup.map
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
stream_input_output
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:
ls
Segments = 6, Lengths = 6.
r w 1 !BBBKKDNWHkGBKb.backup.map
r w 1 backup_dump.12/02/15.1511.ef
r w 1 foo.dump
r w 1 start_up.ec
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:
pat
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
stream_input_output
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 "!BBBKKDNXPjxdMZ.backup.map".
Normal termination 12/02/15 1532.8 pdt Wed.
r 15:32 1.751 25
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!)
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 emulator, 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
Ready
M-> init_vol sys02 dska_02b -special
request:M-> end
volume sys02 68111 records
Ready
M-> init_vol sys03 dska_02c -special
request:M-> end
volume sys03 68111 records
Ready
(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
Ready
M-> av sys02 dska_02b
Ready
M-> av sys03 dska_02c
Ready
And once you have the phyical volumes mounted, you can mount the logical volume:
M-> alv -all
lv system mounted
Ready
In my case, I now have 6 physical volumes, which I can see by doing this (Initializer console):
M-> ld
dska_00a
dska_00b
dska_00c
dska_01a rpv root
dska_01b root2 root
dska_01c root3 root
dska_02a sys01 system
dska_02b sys02 system
dska_02c sys03 system
dska_03a
dska_03b
dska_03c
dska_04a
dska_04b
dska_04c
dska_05a
dska_05b
dska_05c
dska_06a
dska_06b
dska_06c
dska_07a
dska_07b
dska_07c
dska_08a
dska_08b
dska_08c
dska_09a
dska_09b
dska_09c
dska_10a
dska_10b
dska_10c
dska_11a
dska_11b
dska_11c
dska_12a
dska_12b
dska_12c
dska_13a
dska_13b
dska_13c
Ready
M->
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
Ready
M->
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
lv>system.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.
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.
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.
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
\c_logs>log.????????.??????
move_log_segments: Use of star convention resulted in no match. Listing >sc1>as
\c_logs>admin_log.????????.??????
move_log_segments: Use of star convention resulted in no match. Listing >sc1>as
\c_logs>iolog.????????.??????
105 messages copied into:
>system_control_1>heals_dir>heals_log
371 messages processed,
syserr seq_num 1000179 through
syserr seq_num 1000550.
No records were deleted from:
>system_control_1>heals_dir>heals_log.
remove_registry: Use of star convention resulted in no match. >udd>sa>a>safe_re
\cgistries>**.rcpr
delete_registry: Use of star convention resulted in no match. >udd>sa>a>safe_re
\cgistries>**.old
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
(>system_library_tools>bound_admin_rtnes_)
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:
rl
r 13:37 7.572 578
If you then list your absentee requests, you'll see that the crank is scheduled:
lar
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.
557883/76140
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 PNT.safe.pnt
save_dir_info: Incorrect access on entry. Cannot list inacl of PNT.safe.pnt
save_dir_info: Incorrect access on entry. >udd>SysAdmin>admin>PNT.safe.pnt
comp_dir_info: Entry not found. Accessing dir_info segment
(>udd>SysAdmin>admin>old.admin.dir_info).
delete: Entry not found. >udd>SysAdmin>admin>old.admin.dir_info
comp_dir_info: Entry not found. Accessing dir_info segment
(>udd>SysAdmin>admin>old.lib.dir_info).
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
(>udd>SysAdmin>admin>old.system_control_1.dir_info).
delete: Entry not found. >udd>SysAdmin>admin>old.system_control_1.dir_info
comp_dir_info: Entry not found. Accessing dir_info segment
(>udd>SysAdmin>admin>old.pdt.dir_info).
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.
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:
domain:
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);
attribute:
date date_time,
payee name,
category kind,
payment_type kind,
amount dollars,
notes text;
relation:
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.pl1:
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);
return;
end db_date_encode;
db_date_decode.pl1:
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);
return;
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.
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
Query:
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
payment_type
amount
notes
01/02/16 2122.2 Republic parking
visa
3.60
Dining
01/05/16 2123.1 Kroger groceries
Amex
68.35
01/15/16 2125.2 Marriot hotel
MasterCharge
245.15
Boston
01/13/16 2126.2 Speedway fuel
Visa
24.50
01/22/16 1247.8 Lowes home repair
Visa
84.55
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
Query:
select * from purchases where date > "01/14/16"
.
linus: tq
linus: di
date payee category
payment_type
amount
notes
01/15/16 2125.2 Marriot hotel
MasterCharge
245.15
Boston
01/22/16 1247.8 Lowes home repair
Visa
84.55
sump pump
The next commands close the database and quit linus:
linus: c
linus: q
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 127.0.0.1... 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:
d.h001
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
Password:
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:
kermit
Multics-Kermit:
Issue the "server" command:
server
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)
^\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 [127.0.0.1]
Current Directory: /home/eswenson
Network Host: localhost:6180
Network Type: TCP/IP
Parity: space
RTT/Timeout: 08 / 15
SENDING: tn.sh => TN.SH
File Type: TEXT (ascii => ascii)
File Size: 622
Percent Done: 100 //////////////////////////////////////////////////
...10...20...30...40...50...60...70...80...90..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.