207 lines
8.1 KiB
Plaintext
207 lines
8.1 KiB
Plaintext
|
Hiding files on a CD
|
||
|
=====================
|
||
|
|
||
|
This document attempts to show how to hide files from being seen by an
|
||
|
operating system accessing a CD as an ISO9660/Rock Ridge, Joliet or HFS
|
||
|
CD. It also highlights some of the limitations ...
|
||
|
|
||
|
Note: this document is about the various -hide options - not be confused with
|
||
|
the -hidden options.
|
||
|
|
||
|
The -hidden options set the 'EXISTENCE' bit in the directory entry which
|
||
|
means the file or directory will be invisible - unless some special option
|
||
|
is used to mount or view the CD - Linux has the 'unhide' mount option to
|
||
|
make these files visible. i.e. the directory entry exists on the CD.
|
||
|
|
||
|
With hindsight, to avoid confusion with the -hidden option, it would have
|
||
|
been better to chose an option name like '-omit' instead of '-hide'...
|
||
|
|
||
|
The various -hide options actually exclude the relevant directory entry
|
||
|
from the directory tree. Therefore, it is not possible to access a file
|
||
|
or directory that has be hidden with the -hide option when the ISO9600/Rock
|
||
|
Ridge directory is mounted - because the directory entry does not exist on the
|
||
|
CD (but the file data does). You would probably be able to access this file
|
||
|
or directory when mounted as a Joliet or HFS CD (depending on other options
|
||
|
used). Similarly, a directory entry hidden with the -hide-joliet option
|
||
|
will not be accessible when mounted as an Joliet CD. Similarly for -hide-hfs
|
||
|
etc.
|
||
|
|
||
|
If you don't want a file or directory to appear on the CD at all, then use the
|
||
|
-exclude options, not the -hide options (mkisofs completely ignores any
|
||
|
file/directory excluded with the -exclude options).
|
||
|
|
||
|
|
||
|
Using the hide options
|
||
|
======================
|
||
|
|
||
|
There are 6 hide options:
|
||
|
|
||
|
-hide Hide a file/directory from the ISO9660/Rock Ridge directory
|
||
|
-hide-list As above, but read file names from a file
|
||
|
-hide-joliet Hide a file/directory from the Joliet directory
|
||
|
-hide-joliet-list As above, but read file names from a file
|
||
|
-hide-hfs Hide a file/directory from the HFS directory
|
||
|
-hide-hfs-list As above, but read file names from a file
|
||
|
|
||
|
You can use the -hide, -hide-joliet and/or -hide-hfs options as many times
|
||
|
as you like on the command line, but if you have many files to hide, then
|
||
|
it may be better to put your file names in a file (one per line) and use
|
||
|
the corresponding 'list' option. You can also use the three -hide-list options
|
||
|
as many times as you want.
|
||
|
|
||
|
The arguments to the -hide options are either the 'basename' or the 'whole
|
||
|
path name' of a file. That is, if you use the option:
|
||
|
|
||
|
% mkisofs -hide ABC [-other-options] CD_directory
|
||
|
|
||
|
then any file with the name ABC will be hidden. If you want to be more
|
||
|
specific, then use the whole name - as seen by mkisofs e.g.:
|
||
|
|
||
|
% mkisofs -hide CD_directory/XYZ/ABC [-other-options] CD_directory
|
||
|
|
||
|
will hide just the file 'CD_directory/XYZ/ABC' - not any other file called
|
||
|
'ABC' that might exist under 'CD_directory'. However, if your command line
|
||
|
is like:
|
||
|
|
||
|
% mkisofs -hide CD_directory/XYZ/ABC [-other-options] ./CD_directory
|
||
|
|
||
|
Then the file 'CD_directory/XYZ/ABC' will not be hidden because as far as
|
||
|
mkisofs is concerned. Its whole path is actually './CD_directory/XYZ/ABC'.
|
||
|
|
||
|
You can use wild cards in the -hide arguments.
|
||
|
|
||
|
If the file name to be hidden is a directory, then the directory and all
|
||
|
its contents are hidden.
|
||
|
|
||
|
The main use of the hide options is on a multi platform (hybrid CD) to hide
|
||
|
various files/directories that are operating system specific from been seen
|
||
|
on the CD when mounted on another OS. i.e. You may want to hide Macintosh
|
||
|
executables from being seen when the CD is mounted as a Joliet CD on a PC etc.
|
||
|
|
||
|
For example, say we want to create a ISO9660/Rock Ridge, Joliet, HFS hybrid
|
||
|
CD from files/directories in the directory called 'cd_dir' - which are:
|
||
|
|
||
|
MAC/
|
||
|
MAC/app
|
||
|
MAC/data/
|
||
|
MAC/data/file1
|
||
|
PC/
|
||
|
PC/app
|
||
|
PC/data/
|
||
|
PC/data/file1
|
||
|
UNIX/
|
||
|
UNIX/app
|
||
|
UNIX/data
|
||
|
UNIX/data/file1
|
||
|
COMMON/
|
||
|
COMMON/some_files
|
||
|
|
||
|
We could use the command line:
|
||
|
|
||
|
% mkisofs -r -J -hfs -hide MAC -hide PC -hide-joliet MAC \
|
||
|
-hide-joliet UNIX -hide-hfs PC -hide-hfs UNIX -o cd.iso cd_dir
|
||
|
|
||
|
This will give a CD that when mounted as a Rock Ridge CD, you will only
|
||
|
see the directories UNIX and COMMON, as a Joliet CD the directories
|
||
|
PC and COMMON, and as an HFS CD the directories MAC and COMMON.
|
||
|
|
||
|
If you also had the three files in the current directory called README.hfs,
|
||
|
README.joliet and README.unix - but you wanted to have each of these
|
||
|
files appear as just 'README' when mounted, then you could use the above
|
||
|
command line with the following:
|
||
|
|
||
|
% mkisofs -r -J -hfs -graft-points -hide MAC -hide PC -hide-joliet MAC \
|
||
|
-hide-joliet UNIX -hide-hfs PC -hide-hfs UNIX \
|
||
|
-hide README.hfs -hide README.joliet -hide-joliet README.hfs \
|
||
|
-hide-joliet README.uni -hide-hfs README.joliet -hide-hfs README.unix \
|
||
|
README=README.hfs README=README.joliet README=README.unix \
|
||
|
-o cd.iso cd_dir
|
||
|
|
||
|
Note: we've used the -graft-points option as we're using the '=' syntax
|
||
|
to insert the files called README.hfs, README.joliet and README.unix as
|
||
|
'README'
|
||
|
|
||
|
The resulting CD when mounted as a Rock Ridge CD, will have the directories
|
||
|
UNIX and COMMON - with the file called README - which was originally
|
||
|
called README.unix.
|
||
|
|
||
|
However, in most circumstances, it would be better to have the contents
|
||
|
of each of the OS specific directories (plus the contents of the COMMON
|
||
|
directory) to appear at the top level of the CD. i.e. when the CD is mounted
|
||
|
(as ISO9660/Rock Ridge, Joliet or HFS) it has the contents:
|
||
|
|
||
|
README
|
||
|
app
|
||
|
data/file1
|
||
|
some_files
|
||
|
|
||
|
Unfortunately, this is not as straight forward as it may seem - i.e. doing
|
||
|
the following may seem OK, but it won't work - for reasons I'll explain
|
||
|
later:
|
||
|
|
||
|
It gets a bit messy using the -graft-points syntax above, so we'll assume
|
||
|
each of the MAC, UNIX and PC directories contain the correct README, We'll
|
||
|
also change to the 'cd_dir' directory and use the command:
|
||
|
|
||
|
mkisofs -r -J -hfs -hide MAC -hide PC -hide-joliet MAC \
|
||
|
-hide-joliet UNIX -hide-hfs PC -hide-hfs UNIX \
|
||
|
-o cd.iso MAC PC UNIX COMMON
|
||
|
|
||
|
You will get errors like:
|
||
|
|
||
|
mkisofs: Error: UNIX/README and MAC/README have the same Rock Ridge name
|
||
|
...
|
||
|
mkisofs: Unable to sort directory
|
||
|
|
||
|
This is because you can not hide "pathspecs" that are directories ("pathspecs"
|
||
|
are file names given on the command line, or in a path-list file). This a
|
||
|
"feature" of mkisofs. In this case nothing is actually hidden at all.
|
||
|
|
||
|
So you might think that the following may work:
|
||
|
|
||
|
mkisofs -r -J -hfs -hide "MAC/*" -hide "PC/*" -hide-joliet "MAC/*" \
|
||
|
-hide-joliet "UNIX/*" -hide-hfs "PC/*" -hide-hfs "UNIX/*" \
|
||
|
-o cd.iso MAC PC UNIX COMMON
|
||
|
|
||
|
which may appear to work - but when the CD is mounted as an ISO9660/Rock Ridge
|
||
|
or Joliet CD, then the directory "data" is missing.
|
||
|
|
||
|
Again this is a feature of mkisofs - the directories PC/data and UNIX/data
|
||
|
are mapped by mkisofs to the same output directory called "/data" - the
|
||
|
various "hide" flags are stored with this directory info - in this case as
|
||
|
the output directory "/data" is first hidden from the ISO9660/Rock Ridge and
|
||
|
then the Joliet directory, the net result is that "/data" gets hidden from
|
||
|
both directories ... the way mkisofs hides HFS directories is slightly
|
||
|
different, so in this case the directory "data" exists on the HFS volume
|
||
|
and contains the correct contents.
|
||
|
|
||
|
However, it is possible to obtain the required result, but we have to be
|
||
|
careful about hiding multiple input directories that map to a single output
|
||
|
directory.
|
||
|
|
||
|
To do this we have to hide just the files in these directories (or more
|
||
|
accurately, all the non-directories). This is best done by using lists of
|
||
|
files to hide for example:
|
||
|
|
||
|
find PC -type f -print > pc.list
|
||
|
find UNIX -type f -print > unix.list
|
||
|
find MAC -type f -print > mac.list
|
||
|
|
||
|
mkisofs -r -J -hfs -hide-list pc.list -hide-list mac.list \
|
||
|
-hide-joliet-list unix.list -hide-joliet-list mac.list \
|
||
|
-hide-hfs-list pc.list -hide-hfs-list unix.list \
|
||
|
-o cd.iso MAC PC UNIX COMMON
|
||
|
|
||
|
i.e. instead of trying to hide a directory and letting mkisofs hide its
|
||
|
contents, we explicitly hide all the files in the directory, but not the
|
||
|
directory and any of its sub-directories.
|
||
|
|
||
|
This will work for the above input files, but if your directory trees contain
|
||
|
symbolic links and/or directories that will not get merged, then the hide lists
|
||
|
will have to be tailored to get the required result.
|
||
|
|
||
|
|
||
|
James Pearson 22-Nov-2001
|
||
|
|
||
|
Any comments/problems to j.pearson@ge.ucl.ac.uk
|