Bjö*_*ist 38 filesystems fhs directory-structure
我是超过 15 年的 Linux 用户,但我非常讨厌的一件事是强制的目录结构。我不喜欢那/usr/bin
是二进制文件或库的倾销地/usr/lib
,/usr/lib32
,/usr/libx32
,/lib
,/lib32
等...随机的东西在/usr/share
等,这是愚蠢和混乱。但有些人喜欢它,口味不同。
我想要一个目录结构,其中每个包都是隔离的。想象一下,如果媒体播放器龙有自己的结构:
/software/dragon
/software/dragon/bin/x86/dragon
/software/dragon/doc/README
/software/dragon/doc/copyright
/software/dragon/lib/x86/libdragon.so
Run Code Online (Sandbox Code Playgroud)
或者:
/software/zlib/include/zlib.h
/software/zlib/lib/1.2.8/x86/libz.so
/software/zlib/lib/1.2.8/x64/libz.so
/software/zlib/doc/examples/...
/software/zlib/man/...
Run Code Online (Sandbox Code Playgroud)
你明白了。我有哪些选择?有没有使用类似于我的方案的 Linux 发行版?可以修改某些发行版以使其像我想要的那样工作(Gentoo ??)还是我需要 LFS?在这个领域有任何现有技术吗?喜欢关于该计划是否可行或不可行的出版物?
不是在寻找 OS X。:) 但受OS X 启发的完全没问题。
编辑:我不知道如何PATH
,LD_LIBRARY_PATH
以及依赖于一小部分的路径应制定其他环境变量。我在想,如果我安装了 KDE 编辑器Kate,/software/kate/bin/x86/bin/kate
那么我就可以输入二进制文件的完整路径来启动它。它应该如何用于动态库和dlopen
调用,我不知道,但它不可能是一个无法解决的工程问题。
Mic*_*mer 57
首先,预先声明利益冲突免责声明:我是一名长期的 GoboLinux 开发人员。
其次,对领域专业知识的预先声明:我是一名长期的 GoboLinux 开发人员。
目前使用的有几种不同的结构。GoboLinux有一个,像GNU Stow、Homebrew等工具使用的东西非常相似(主要用于用户程序)。NixOS还使用非标准的程序层次结构和生活哲学。这也是一个相当常见的 LFS 实验。
我将描述所有这些,然后根据经验评论它在实践中的效果(“可行性”)。简短的回答是,是的,这是可行的,但您必须真正想要它。
GoboLinux 的结构与您所描述的非常相似。软件安装在/Programs
:/Programs/ZSH/5.0.8
包含属于 ZSH 5.0.8 的所有文件,在通常的bin
/ lib
/... 目录中。系统工具在/System/Links
层次结构下创建指向这些文件的符号链接,这些文件映射到/usr
¹。该PATH
变量仅包含单个统一的可执行目录,LD_LIBRARY_PATH
未使用。多个版本的软件可以同时共存,但一次只能bin/zsh
主动链接一个给定名称 ( ) 的文件。您可以通过完整路径访问其他人。
还存在一组兼容性符号链接,因此/bin
和/usr/bin
映射到统一的可执行文件目录,依此类推。这使软件在运行时的工作更轻松。内核补丁 GoboHide 允许从文件列表中隐藏这些兼容性符号链接(但仍然可以遍历)。
魂斗罗另一个答案,你并不需要修改内核代码:GoboHide是纯粹的外观,内核不general²依赖于用户空间的路径。GoboLinux 确实有一个定制的初始化系统,但也不需要这样做。
标语一直是“文件系统是包管理器”,但系统中有相当普通的包管理工具。您可以使用做的一切cp
,rm
和ln
,虽然。
如果您想使用 GoboLinux,非常欢迎您。不过,我会注意到,这是一个小型开发团队,如果以前没有人想使用它,您可能会发现您想要的某些软件没有打包。好消息是,为系统构建程序通常相当容易(标准的“配方”大约有三行长);坏消息是有时它非常复杂,我将在下面详细介绍。
有一些“出版物”。我在linux.conf.au 2010上做了一个关于整个系统的演示,涵盖了所有一般的内容,可以在视频中找到:ogv mp4(也在您当地的 Linux Australia 镜像上);我也把我的笔记写成散文。GoboLinux 网站上还有一些较旧的文档,包括著名的“我不是一无所知” ,其中解决了一些反对意见和问题。我认为这些天我们都不太热心了,我怀疑未来的版本将采用作为符号链接的基本位置。/usr
NixOS将每个安装的程序放在/nix/store
. 这些目录的命名类似于/nix/store/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-firefox-3.5.4/
- 有一个加密哈希代表导致该程序的整个依赖项和配置集。该目录内是所有相关文件,在本地或多或少具有正常位置。
它还允许您同时拥有多个版本,并使用其中的任何一个。NixOS 有一个与可重复配置相关的整体理念:它本质上从一开始就内置了一个配置管理系统。它依赖于一些环境操作来向用户展示已安装程序的正确世界。
通过Linux From Scratch并准确设置您想要的层次结构非常简单:只需创建目录并配置所有内容以安装在正确的位置。我在构建 GoboLinux 实验时已经做过几次,它并不比普通的 LFS 难。在这种情况下,您确实需要制作兼容性符号链接;否则它会更难,但如果你真的想要,小心使用工会坐骑可能会避免这种情况。
我觉得曾经有一个关于这一点的LFS 提示,但我现在似乎找不到它。
FHS 的问题在于它是一个标准,它非常普遍,并且广泛地反映了它编写时的现有用法。大多数用户永远不会使用本质上不遵循该布局的系统。其结果是,许多软件对它有潜在的依赖,没有人意识到,通常是完全无意的。
所有那些带有#!/bin/bash
? 如果那里没有 Bash,那就不好了。这就是 GoboLinux 具有所有这些兼容性符号链接的原因;这只是实用。在非标准布局下,许多软件在构建时或运行时都无法运行,然后需要打补丁来纠正,通常是非常侵入性的。
你的基本 Autoconf 程序通常会很高兴地安装在你告诉它的任何地方,并且自动化传递正确的--prefix
. 其他构建系统并不总是那么好,要么故意在层次结构中烘焙,要么由主要作者编写不可移植的配置。CMake 是后一类中的主要罪犯。这意味着如果你想生活在这个世界上,你必须准备好在其他人的构建系统中预先做很多繁琐的工作。在编译期间必须动态修补生成的文件是一个真正的麻烦。
运行时又是另一回事。许多程序假设它们自己的文件或其他人的文件相对于它们或绝对位于何处。当您开始使用符号链接来呈现一致的视图时,许多程序都有处理它们的错误(或者有时可以说是对您无益的正确行为)。例如,一个工具foobar
可能希望找到baz
它旁边的可执行文件,或者在../sbin
. 根据它是否读取其符号链接,它们可能是两个不同的地方,无论如何它们都可能不正确。
一个综合问题是/usr/share
目录。当然,它用于共享文件,但是当您将每个程序放在自己的前缀中时,它们实际上就不再共享了。这导致程序无法找到标准图标等。GoboLinux 以一种非常丑陋的方式处理这个问题:在构建时,$prefix/share
是指向 的符号链接$prefix/Shared
,而在构建后,链接指向全局share
目录。它现在使用编译时沙箱和文件移动来处理share
(和其他目录),但读取链接的运行时错误仍然是一个问题。
多个程序的套件是另一个问题。GoboLinux 从来没有让 GNOME 完全工作,我不相信 NixOS 也有,因为布局的相互依赖性是如此的成熟,以至于很难治愈它们。
所以,是的,这是可行的,但是:
所有这些对您来说可能是也可能不是问题。
¹ 14.01 版使用/System/Index
,它直接映射到/usr
. 我怀疑未来的版本可能会删除链接/索引层次结构并全面使用/usr
。
² 它确实需要/bin/sh
默认存在。
Linux FHS 基于 Sun 和其他 UNIX 公司在 1980 年代后期的决定。
当时的一个重要变化是放弃/usr/local/
并引入/opt/
/{ bin
! lib
!man
!...}
如果你正在寻找今天 /usr/bin 被用作垃圾场的原因,我相信 GNOME 是最负责任的项目之一。
32 位与 64 位库发生的情况似乎是由 FHS 引起的。
Solaris 在/lib
/usr/bin
和 中引入了特定于平台的子目录/usr/lib
。按照您的意愿,Sun 是如何从 1988 年开始增强基本概念的。