Cover V04, I05
Article
Listing 1
Listing 2

sep95.tar


UNIX as a DOS File and Print Server

Kim Soques and Bruce Altmann

Introduction

While NFS is a common method of sharing files between UNIX machines, it is less common as a way to share files between PCs. Given our exclusively TCP/IP network, and our users' need to work in cross-functional groups using multiple platforms (VAX, UNIX, PC), our company chose to use NFS as its enterprise-wide file-sharing method. In addition, we moved away from using serial connections for our network printers, in favor of an IP printing strategy. This model not only has been easy to integrate into our existing environment, but also has proven able to scale up or down as needed.

Since this article is targeted toward UNIX configuration, we do not discuss the issues surrounding selecting and configuring an NFS client to run on the PC. Given this, you should be aware that not all PC network software that delivers TCP/IP services to the PC includes NFS or network printing clients. In many cases these are add-ons or an enhanced version of a basic TCP/IP stack. We use SunSofts PC-NFS; however, all the PC-based NFS products operate the same for the purposes of this article. Henceforth, references to the PC software refer to a product that includes an NFS client and some support for network printing.

Something to remember when using NFS with PCs is that the single-user, "trusting" PCs are directly accessing a multiuser UNIX environment. PCs and, by extension, their users do not inherently use UNIX permissions. Many of the lessons we learned stem from that fundamental contradiction.

rpc.pcnfsd

rpc.pcnfsd lies at the heart of managing the multiuser UNIX/single-user PC contradiction. rpc.pcnfsd provides weak authentication of user IDs for the PC. An RPC server, it listens at port 150001 for authentication requests, returning the UID and all GIDs for each valid user name and password passed to it. This occurs during the PC's boot cycle, or if the user manually chooses to log out and log back in. Authentication allows the user access to the directories he/she has permissions for. If authentication fails, the user ID defaults to "nobody," and the user can only access network resources available under world permissions. This process is essential for the PC to be able to access UNIX resources.

rpc.pcnfsd is freely distributable, and available on many of the ftp sites that keep Sun patches and other information. The most current version we have found is version 2, revision 1.6, which we found on a SunSoft PC-NFS CD-ROM. If a server is already running rpc.pcnfsd, use rpcinfo to determine which version is installed. To identify the revision number, use the command

strings rpc.pcnfsd | grep ver

HP bundles rpc.pcnfsd into its operating system, but the version tends to run one revision or so behind the most current Sun code. In addition, some vendors of PC NFS clients sell proprietary versions of rpc.pcnfsd. Our tuning recommendations here apply to the Sun rpc.pcnfsd.

The essential portion of configuring a UNIX server to run rpc.pcnfsd is turning it on. The daemon is enabled in /etc/rc.local on SunOS 4.1.3, in /etc/initd/pcnfs on SunOS 5.4, and in /etc/netnfsrc under HP-UX 9.3.

For SunOS 4.1.3:

#  start up pcnfsd version 2 daemon  ("april 02, 93") by: ("altmann")
#
if  [  -f  /usr/local/etc/rpc.pcnfsd ] ;  then
/usr/local/etc/rpc.pcnfsd ;  echo  ' rpc.pcnfsd'  >/dev/console
fi

for HP-UX 9.3:

NISDOMAIN_ERR=""
##
#       PCNFS_SERVER    --     if this node is a server for PC-NFS requests.
#                              This variable controls the startup of the
#                              pcnfsd(1M) server.  See Also:  pcnfsd(1M).
##
PCNFS_SERVER=1
# (the default is 0)

Aside from its crucial role in providing UNIX user IDs, rpc.pcnfsd plays another part -- that of enabling network printing. We will discuss that aspect in more detail in the section dealing with printing.

Server Setup for File Sharing

General Setup Information

Much of the effort needed to set up a UNIX server for PC file sharing is the same as for setting up any NFS/NIS server. There are many excellent resources that cover the topic, including Hal Stern's book, Managing NIS/NFS, so we do not cover that here. Note that NIS services are not strictly necessary when setting a server up to handle PC services, though we cover some ways to broaden their use in supporting PC-based NFS.

Beyond the basic server setup are customization issues. Some of these, such as export restrictions, permissions, and shared directories, are simply enhancements to the standard configuration. Others, such as rpc.pcnfsd tuning, are specific to the server's new role.

Exports

The exports needed on a PC NFS server are simple. The two primary file systems the PCs will need to access are the filesystem containing user home directories and the /var/spool/pcnfs filesystem (for pcnfsd printing).

However, to keep from opening the server up to the whole network, we use the /etc/netgroup file to restrict access. A NIS map, /etc/netgroup resolves individual host names to file system access. (Without NIS, this file is moot.)

The netgroup file allows host names to be added dynamically, unlike the more static -access flags in the /etc/exports file. The netgroup format is an alias followed by an access control field, containing any one of the following: hostname, login, or domain name. (Domain name was never implemented.) The most secure method specifies user and hostname. However, we cannot rely on the same user always being at the same host, so our netgroup implementations use the hostname only. These aliases can contain approximately 60 entries. Several can be combined into still-larger aliases, with the highest-level alias used in the exports file itself.

The /etc/netgroup entry controlling access to /var/spool/pcnfs would look like this:

nova_pc_1 (crawford,,) (flato,,) (pignut,,) (introit,,) (hangnail,,) (sauk,,)\
(cheroot,,) (bibelot,,) (corolla,,) (fauve,,) (organdy,,)\
(adams,,) (philip,,) (peccary,,) (ebony,,) (cherimoya,,)\
[...]
######### /var/spool/pcnfs export
nova_pcnfs nova_pc_0 nova_pc_1 nova_pc_2

while the corresponding /etc/exports portion would be:

/var/spool/pcnfs -access=nova_pcnfs

This, in conjunction with strategic use of UNIX permissions, keeps unauthorized users from accessing what could be confidential data.

Permissions, Group Access, and Work Group Directories

Since the NFS mount on the PC is mapped to a drive letter, many users think the "virtual drive" is the same as their local disk. To maintain the illusion, we set user directories to drwx------. The user then does not receive the sort of surprise one of our users did before we adopted this rule. She had been working with someone in a different department, and called him to discuss how best to transfer a mutual file back to him. He, a UNIX user on the same server, told her not to worry, since he'd already copied it out of her home directory! We quickly found out how unamused she was to find out that the file she thought was "safe" wasn't. Our policy changed.

In a similar vein, group permissions play a larger role on the PC-based NFS server, particularly if many different departments are using the same server. To keep confusion to a minimum and ease security concerns, we give all members of a particular department a default group specific to that department.

wgs:*:6020:

Finance staff would be in group finance, while Marketing would go in group mrkt. Even if a user changed her account's permissions to drwxrwx---, Marketing staff would not be able to get into Finance's directories. This more controlled use of group permissions also makes it easy to implement work group directories.

After users start to use their home directories, they request a place to share files with other department members. To do this, we put a twist on the basic account, calling it a work group directory. We define a dummy user in the passwd file with the same primary group ID as the members of that work group. The account is locked ( a "*" in the password field), but otherwise set up normally.

wgs:*:5071:6020:WGS Work Grp Dir:/user/wgs:/bin/csh

The permissions on that account's directory are then set to drwxrwx---, enabling all members of that GID to read and write in the directory:

drwxrwx--- 13 wgs     wgs          1024 Jun 23 17:02 wgs

With no more effort than creating an account, the group has a shared space in which to work collaboratively.

Concerning permissions and access, there is one other item to cover. We mentioned earlier that rpc.pcnfsd provides "weak authentication." This means that after the server hands over a UID to the client, no more checking is done. The client carries that UID to every server it accesses, unchallenged.

Weak authentication has caused a problem that we are still struggling with. For example, when juser turns on her PC in the morning, she authenticates on server A. To access some spreadsheets in a different department, she NFS-mounts server B. If the UIDs are not identical -- that is, if juser is UID 555 on server A but is 556 on server B -- conflicts arise. At minimum, juser will not be able to access her files. Depending on the PC NFS client, juser may have access to all of the files belonging to user 555 as well.

When we first implemented NFS for PCs, we did not worry about this. Most users had only one NFS mount and authenticated on that machine. Now, however, use of NFS on PCs has become more accepted and widespread. When we set out to implement a corporate-wide application that relied upon NFS mounts to central servers, we realized the mess we had in front of us. We have been working to implement a global UID registry as a stopgap measure, but at this point the registry involves lots of rework for all our systems administrators. Unsurprisingly, they have been slow to adopt this for anything other than new accounts. We are eagerly awaiting something like DCE or NIS+ for PC clients, since at this time even SunOS 5.4 handles PCs in NIS-compatibility mode.

Tuning for NFS Performance

Optimizing a server for PC file and print services does not stop with starting rpc.pcnfsd and adding NIS enhancements. Since the server is no longer a compute box or a major time-sharing platform, but a file server, it needs to be tuned for NFS performance. An NFS accelerator card is essential -- we use Prestoserve on our Sun 4.1.3 machines. These cards handle write caching, keeping the client from having to wait on a completed disk write on the server. While NFS accelerator cards do entail some initial cost, they quickly pay for themselves in decreased wait time and fewer hostile users.

Another important item is to enable the UDP checksums. NFS uses UDP, a stateless protocol, to transmit packets, and the RFC for NFS does not specify that it must do data checking. In Managing NIS/NFS, Hal Stern states that "without the checksums, it's possible to read or write corrupted data" (p. 317). The UDP checksum provides this missing data verification step. As Stern notes, "NFS requests containing UDP checksum errors are rejected on the server, and will be re-transmitted by the client" (p. 317).

On by default in SunOS 5.4, UDP checksums are turned off in Sun 4.1.3 machines. To implement them, edit /usr/kvm/sys/netinet/in_proto.c and change the udp_cksum line (near the end) from

udp_cksum = 0

to

udp_cksum =1

Reconfigure the kernel and then reboot.

Another key NFS tuning parameter is to increase the number of nfsds running. As more and more users are added, the eight nfsds SunOS starts by default become inadequate. A handy rule of thumb is to run approximately eight nfsds per every 50 users, up to the maximum recommended by the OS provider (30 for SunOS 4.1.3). Less than this can result in temporarily dropped mounts with the PC clients, which is alarming for the end user -- "Not reading drive K" generates quite a few support calls!

Our final NFS tuning hint involves adjusting the number of MAXUSERS in the kernel. The paper "Sun Performance Tuning Overview," from SMCC Technical Marketing (December 1993), suggests setting MAXUSERS equal to two times the amount of RAM on the server, up to the maximum suggested for the operating system (225 for SunOS 4.1.3). This setting is twice Sun's recommendation for non-NFS servers. Changing MAXUSERS optimizes the NFS buffer queue sizes, the I/O buffer sizes, and the table sizes in the kernel, preventing bottlenecks.

Network Printing Setup

Migration from Serial to IP Printing

Originally, UNIX network printers were made available on our TCP/IP network via a serial connection to a terminal server. Under our old method, we could trace a printing problem from the client originating the job through to the server. Unfortunately, the link from the server to the printer was difficult to troubleshoot. As we began implementing PC-NFS enterprise-wide, this level of uncertainty was unacceptable. We decided to use MiLan's Fastport 3100/3100CX, moving us from reliance on serial protocols to TCP/UDP.

The Fastport is a network-aware device that accepts Berkeley LP protocol requests and spools them to the attached printer. It can be monitored remotely via telnet, thus making printing much easier to troubleshoot. With the Fastport handling the connection between the printer and the server, we can now trace a printing problem almost to the parallel cable linking the Fastport and the printer.

MiLan Attachment and Setup

The MiLan Fastport provides a flexible interface between our servers and printers. It can be set up to perform filtering or not on the box itself, with some models supporting autosensing. The Fastport also supports many different printer description languages, though we have standardized upon three -- UNIX ASCII, DOS ASCII, and PostScript. These three we can move through the same queue, since a Fastport set up for autosensing can handle the carriage return/line feed issues between UNIX and DOS ASCII. This single-queue approach also simplifies matters for our PC users, since they only point to the one queue name for all their printing requirements. For printer languages that contain escape codes, like HPCL and HPGL, we find it easiest to set up a separate queue. We try to avoid this, however.

The details of configuring printer setup files vary so widely from operating system to operating system -- even from one OS version to the next -- that we do not have enough column inches to cover that here. However, with each Fastport MiLan ships software that covers configuring the various server types, along with good documentation.

Printing

Choosing and setting up MiLan boxes is only the first step in our printing strategy. Once IP printing is enabled, there are still decisions to make in how to approach spooling print jobs from the PC. There are two options available: pcnfsd printing and Berkeley LP protocol.

pcnfsd Printing

rpc.pcnfsd on the server enables what we call "pcnfsd printing," a method of providing network printing to the PC without using the Berkeley LP protocol. Using pcnfsd printing, a PC will print through an LPT port redirected to an NFS mount. Once the print job is copied to the NFS mount (that is, on the server), rpc.pcnfsd then executes lpr on that spool file. Until recently, the NFS client we used on the PC did not support the Berkeley LP protocol, so this was our only network printing option. Berkeley LP is supported in more recent versions of our PC NFS client, so we are increasingly using the LP protocol as a more reliable printing transport, for reasons outlined below.

rpc.pcnfsd Changes

rpc.pcnfsd by default has a printing timeout of 50 seconds. We have found this setting has a tendency to fail on large files such as presentations. Not only does the print job stop, but often rpc.pcnfsd hangs when this timeout occurs.

To make pcnfsd printing more reliable, we recommend making the changes noted in Listing 1 to the rpc.pcnfsd source code. We took these suggestions from SunService, after contacting them with our printing timeout problem. These changes do not eliminate the problem completely, but they do lessen its frequency.

printcap Entries

For pcnfsd printing, printcap configuration is no different from usual. To use Berkeley LP printing, the server's lp daemon must be set up to accept remote requests. This is no different from setting it up to accept lp requests from remote UNIX boxes, however.

rpc.pcnfsd Monitoring Tools

As we mentioned earlier, we run a perl script called pcnfsdcheck.pl to help us monitor rpc.pcnfsd (see Listing 2). Run from a cron job, pcnfsdcheck.pl checks the 150001 port to make sure that rpc.pcnfsd is still responding. If it is not, the script kills the process and restarts it. It also contains a syslog function, return codes, and the option to test remote hosts. We have tested it under perl 4.03X and perl 5.001 on HPUX 9.X, SunOS 4.1.3.X, and SunOS 5.4.

Typing

pcnfsdcheck.X.X.X.pl -h

will give a list of the options available. Note that the -f flag only works on a localhost, so do not use it with the -n option. Used without the -n <node> option, pcnfsdcheck.pl will poll the localhost. -s is silent mode, although errors will write to STDOUT. The -l option will write to syslog. This is most effective with the -s option. The -f will cause pcnfsdcheck.pl to try to run ps to get the PID, then kill and restart rpc.pcnfsd (localhost). We recommend using:

pcnfsdcheck.pl -n node_to_check -s -l -f

The script is setup by default to run on SunOS 4.1.3.X, but you can configure it to run on other operating systems by changing the LOCAL CUSTOMIZE section to match your OS.

A side note: the syslog function requires the syslog.ph perl header, so check /usr/local/lib/perl for this file. If the perl installation on the server was questionable, the -l flag will break the pcnfsdcheck.pl code. If you do not have syslog.ph, check the h2ph ("header to perl header") man page for how to proceed.

To use pcnfscheck.pl, install it in /usr/local/etc as

755 root daemon pcnfsdcheck.VENDOR.OS.pl

-rwxr-xr-x  1 root     daemon       7015 May 15 17:04 pcnfsdcheck.Sun.4.X.pl
-rwxr-xr-x  1 root     daemon       7015 May 15 17:04 pcnfsdcheck.Hpux.9.X.pl

The crontab entry would be as follows:

# check pcnfsd, fix, and log every 15 min
1,16,31,46 * * * *
/usr/local/etc/pcnfsdcheck.Sun.4.X.pl -s -l -f

This hands-free checking means that we no longer find out about rpc.pcnfsd dying from our unhappy users, and our support calls are kept for bigger problems. Phasing out pcnfsd printing will reduce our need for pcnfsdcheck.pl, but not eliminate it, since client authentication plays such a key role in determining the PC's access to network resources.

Conclusion

At a high level, setting up this environment entails the following steps:

  • Select a DOS/Windows PC-based NFS package.

  • Set up rpc.pcnfsd to handle the single-user (PC) to multiuser (UNIX) translation.

  • Set up the user's UNIX account and home directory, setting permissions to drwx------.

  • Add the user's hostname to the netgroup file and push the map (assuming NIS is running).

  • Export the needed filesystems, using the netgroups to manage access.

  • Set up a work group directory as needed, setting permissions to drwxrwx---.

  • Set up and export /var/spool/pcnfs.

  • Install the PC client software, including user login, password, and directory mounts - H: for home directory, P: for work group directory.

  • Install and set up the MiLan Fastport.

  • Set up the print queue on the UNIX host.

  • Set up the LPT redirection on the PC, making sure to choose an appropriate Windows printer driver (if using Windows).

    From a technical standpoint, NFS and Berkeley LP protocols have proven surprisingly easy to integrate into our corporate network, and have shown themselves to be highly scalable enterprise-wide. The ability to control security on the server, rather than the client, has been an added plus, particularly in working with our PC users. From a user education standpoint, we have found that the transports are virtually transparent to our user base on all platforms. In fact, one could say we are now victims of our own success. Document formatting has become a hot issue as our users often forget that not everyone on our network has access to Microsoft Word. Our move to MiLan Fastports has not only made our UNIX and PC printing more robust, but it has had the side benefit of standardizing the setup of all our network printing. We even use MiLan boxes for mainframe and VAX printing, sending print jobs from all platforms over ethernet to the same printer -- no more IBM controllers, and our users can save money by using a single printer for their workgroup. NFS and LP have proven highly successful protocols for sharing files and handling network printing across our large, mixed platform network.

    References

    Stern, Hal. Managing NFS and NIS. Sebastopol, CA: OReilly & Associates, April 1992 printing.

    About the Authors

    Kimbol Soques earned a BA in English Literature from Rice University. She works for Advanced Micro Devices as a Systems and Network Analyst. She has been doing systems administration and PC networking for AMD for four years. She can be reached via email at kimbol.soques@amd.com.

    Bruce Altmann earned a BS in Engineering Technology/Telecommunications from Texas A&M University. He works for Advanced Micro Devices doing Systems and Network Engineering. He has been in the WAN/LAN/UNIX game for four years in the corporate world, and three years before that in the academic world. He can be reached via email at bruce@altmann.com.


     



  •