Hi,
Exceptionally top-posting, because, I'll answer in the message body,
and I want to tell general things first.
First, thanks to Kevin to be our "quality assurance". Those messages
are bugging me, but make me think...
Second, presently, the whole management of directories is the result of
design decisions made at the beginning of the testing of the new
method. Some of those decisions may seem wrong now, but that was not
evident at the time. Specially, the first aim was to have a working
build, not necessarily the best explanations...
Third, one of those decisions was to keep $LFS owned and only writable
by root. At the time, it was thought that it could prevent unwanted
behavior in chapter 6, for example alert on non desirable directory
creation. In retrospect, it was maybe not necessary, and having $LFS
writable by lfs could simplify things a lot.
That said, here are a few comments...
On Sat, 2020-08-01 at 15:42 +0800, Kevin Buckley via lfs-dev wrote:
As some of you will be aware from other threads, I have been
spending way too much time looking at the way that the LFS
book goes about creating its directory hierarchy, but for those
of you who find these things interesting, here's some more.
Here's what the current (r12002) book does, as regards creating
the required directory hierarchy, in two separate parts:
4.2
mkdir -pv $LFS/{usr,lib,var,etc,bin,sbin}
the order is a result of adding directories as needed for chapter 6
installations. They did not come in alphabetical order. Now they can be
sorted...
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
mkdir -pv $LFS/tools
4.3
chown -v lfs $LFS/{usr,lib,var,etc,bin,sbin,tools}
alphabetical sort here too.
case $(uname -m) in
x86_64) chown -v lfs $LFS/lib64 ;;
esac
7.2
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
and here again
case $(uname -m) in
x86_64) chown -R root:root $LFS/lib64 ;;
esac
7.5
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
At first, /bin was not used in chapter 6. Now it is, and shouldn't
appear here.
/etc, and /lib already exist. the -p option is not needed
mkdir -pv /{media/{floppy,cdrom},srv,var}
Again, /var was added later in the minimal set. May be removed here.
/media does not exist yet, so the -p option is needed.
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
Here, we should separate /usr and /usr/local:
/usr/{bin,include,lib,sbin} exist from chapter 6. The equivalent in
/usr/local does not. OTOH, we may want to have the whole structure in
one place (which means probably adding sbin to the first line)
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
Again, some of those already exist from chapter 6
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
Same here (terminfo)
mkdir -pv /usr/{,local/}share/man/man{1..8}
And again here
install -dv -m 1777 /tmp /var/tmp
install -dv -m 0750 /root
mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}
Leaving aside the non-alphabetical ordering of the directories
in the Chapter 4 commands,
I wondered why the first two lines of commands in 7.5 duplicate
the creation, in 4.2, of
/bin
/var
answered above...
but not any of the other "top-level" directories from 4.2, so
/etc /lib /lib64 /sbin /usr
with mkdir -p, those directories would be created if they did not
exist. But I agree, /var could be left for later, when creating
subdirectories in /var (using mkdir -p)
that get created in 4.2?
I do note though that /etc, /lib and /usr are implicitly created
when subdirectories of them are, so could ask a slightly different
question, vis:
Why is the creation of /sbin not duplicated?
Good question. Having the whole directory structure on one page might
be better for understanding. I (and Thomas) wonder whether this
structure couldn't even be created in chapter 4, selectively changing
ownership of directories where the lfs user needs to be able to write.
I also wondered why the first mkdir for subdirectories of /var
mkdir -v /var/{log,mail,spool}
doesn't have a "-p", in common with all the other mkdir-s,
including the creation of the top-level directories.
It does not have a -p because it is not needed. But then the first line
does not need it either... Not very consistent, as you say.
I'd suggest that the 7.5 commands would be better laid out as
Create some root-level directories that are not in the limited set
required for Chapters 4, 5 and 6.
mkdir -pv /{boot,home,mnt,opt,srv}
Create the required set of subdirectories below the root-level
mkdir -pv /etc/{opt,sysconfig}
mkdir -pv /lib/firmware
mkdir -pv /media/{floppy,cdrom}
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
mkdir -pv /var/{cache,local,log,mail,opt,spool}
mkdir -pv /var/lib/{color,misc,locate}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
install -dv -m 1777 /tmp /var/tmp
install -dv -m 0750 /root
in that it would
1) remove the duplicated creation of /bin and /var, which
are already referred to in 7.2
2) make the new/extra top-level directories more apparent
by separating them out
3) be consistent in its use of "-p"
I might even be tempted to add /media into the first of those
mkdir lines, as its creation, in passing, as an implicit part
of the
mkdir -pv /media/{floppy,cdrom}
line might otherwise be lost on the reader.
I should also add that if the book really wants to ensure that all of
the
top-level directories chown-ed to root:root in 7.2 have not somehow
"been lost" when entering the chroot, we explicitly duplicate their
creation
in 7.5, with a note to that effect, but include /sbin in the list.
Well, I think the current state of affairs is not really satisfactory,
and that the above changes would make things better locally, but the
whole picture would remain unclear...
We have two ways to go:
- make $LFS writable by user lfs, then change back at the beginning of
chapter 7, but not blindly do "chown -R root /", because an user may
need directories owned by another user for his/her scripts (for
example).
- Create the whole structure in one place, as root in chapter 4,
selectively change ownership to lfs after the lfs user is created, then
change back at the beginning of chapter 7.