如何为所有用户创建一个 ext4 分区?

mcE*_*nge 8 permissions partitioning fstab mount

我知道这听起来像是一个重复的问题,但我尝试了以下方法并没有帮助:

我的驱动器安装在

/media/data
Run Code Online (Sandbox Code Playgroud)

所以我进入了

sudo chown -R :users /media/data
Run Code Online (Sandbox Code Playgroud)

但是,我仍然无法以用户身份写入该分区。我还尝试在 /etc/fstab 中创建一个条目

UUID=... /media/data ext4 rw,suid,dev,exec,auto,user,async 0 0
Run Code Online (Sandbox Code Playgroud)

但在那之后,我的电脑无法启动,因为他找不到磁盘。

我安装了 Ubuntu 14.04 服务器。该分区列在下面/dev/nvmeOn1p1 但没有出现在/etc/fstab(见下图)中。

(该设备为“Intel DC P3700”800GB SSD)

附加说明:由于分区是空的,我也可以格式化它并使用 gparted 重新创建它。gparted 或其他 gui 程序中是否有办法指定该分区应可供所有用户使用?

ger*_*los 9

也许你做事的顺序不对。当您使用 来创建文件系统时mkfs.ext4,其中的所有内容都由用户 root 和组 root 拥有,并设置了系统默认权限。

在目录上挂载该文件系统时,您会看到文件系统权限和所有者,而不管该目录的原始所有者和权限如何。

所以做这样的事情是行不通的:

sudo mkfs.ext4 /dev/some/data
sudo mkdir /media/data
sudo chown -R :users /media/data
sudo chmod -R g+rw /media/data
sudo mount /dev/some/data /media/data
Run Code Online (Sandbox Code Playgroud)

正确的做法是创建文件系统,挂载它,然后更改其权限和所有权。您在 /etc/fstab 中做什么无关紧要。

正确的做法是这样的:

sudo mkfs.ext4 /dev/some/data
sudo mkdir /media/data
sudo mount /dev/some/data /media/data
sudo chown -R :users /media/data
sudo chmod -R g+rw /media/data
Run Code Online (Sandbox Code Playgroud)

这应该回答你的问题。如果您需要更多详细信息,请继续阅读。


为了更好地理解发生了什么,让我们用一个图像文件做一些实验

创建一个空文件以使用fallocate -l 100MB /tmp/filesystem.img. 然后将其格式化为 ext4 文件系统sudo mkfs.ext4 /tmp/filesystem.img(它不是块设备,但如果您回答是,则无论如何都可以在其上放置一个工作的 ext4 文件系统)并创建一个目录以用作挂载点mkdir /tmp/experiment

现在尝试更改所有者和权限上directoysudo chown -R :users /tmp/experimentsudo chmod -R g+rw /tmp/experiment,并与检查权限ls -la /tmp/experiment。你会得到这样的东西:

 ls -la /tmp/experiment/
 total 0
 drwxrwx--x 2 gerlos users  40 feb 19 10:37 .
 drwxrwxrwt 8 root   root  180 feb 19 10:38 ..
Run Code Online (Sandbox Code Playgroud)

这告诉您 /tmp/experiment 归用户 gerlos 和组用户所有,组成员可以对其进行读取、写入和执行。您可以将文件放入其中,例如使用touch /tmp/experiment/somefile.

现在使用 挂载该目录上的文件系统sudo mount /mnt/filesystem.img /tmp/experiment,并再次查看ls输出:

$ ls -la /tmp/experiment/
total 13
drwxr-xr-x 3 root root  1024 feb 19 10:41 .
drwxrwxrwt 8 root root   180 feb 19 10:41 ..
drwx------ 2 root root 12288 feb 19 10:41 lost+found
Run Code Online (Sandbox Code Playgroud)

如您所见,现在 /tmp/experiment 似乎归 root 所有,具有不同的权限!为什么?因为我们不是在看/tmp/experiment本身,而是在/mnt/filesystem.img中包含的文件系统的根目录,挂载在/mnt/experiment上。

此外,您的普通用户将无法将文件放在那里touch /tmp/experiment/anotherfile

如果您现在再次尝试运行chownchmod如上所示,您将更改的不是挂载点的所有者和权限,而是挂载的文件系统,您的用户将能够使用该文件系统。要确认最后一次查看 ls 输出:

$ ls -la /tmp/experiment/
total 13
drwxrwxr-x 3 root users  1024 feb 19 10:41 .
drwxrwxrwt 8 root root    180 feb 19 10:45 ..
drwxrw---- 2 root users 12288 feb 19 10:41 lost+found
Run Code Online (Sandbox Code Playgroud)

如您所见,现在用户组的成员可以将文件放在文件系统上!事实上,没有什么能阻止你的普通用户在那里创建一个新文件touch /tmp/experiment/myfile

$ ls -la /tmp/experiment/
total 13
drwxrwxr-x 3 root   users   1024 feb 19 11:05 .
drwxrwxrwt 8 root   root     180 feb 19 11:02 ..
drwxrw---- 2 root   users  12288 feb 19 10:41 lost+found
-rw-rw---- 1 gerlos gerlos     0 feb 19 11:02 myfile
Run Code Online (Sandbox Code Playgroud)

任务完成!:-)


mcE*_*nge 1

我终于解决了这个问题。我发现我的 UUID 有错字。所以我的最终条目fstab是:

\n\n
UUID=... /media/data ext4 defaults 0 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

甚至更好:

\n\n
/dev/sdb1 /media/data ext4 defaults 0 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在重新启动之前检查了它,只需调用:

\n\n
sudo umount /media/data\nsudo mount -a\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果 fstab 条目正确,一切都会正常安装,并且计算机的每个用户都可以访问该分区(至少可以访问他自己创建的文件夹,这是正确的行为)。

\n\n

一只猫会做

\n\n
sudo chown -R UserNameOfSudo:users /media/data \nsudo chmod -R g+rw /media/data \n
Run Code Online (Sandbox Code Playgroud)\n\n

同时分区仍处于安装状态,以确保每个人都可以访问该分区。

\n\n

如果执行 \xc2\xb4chown\xc2\xb4 确保特定用户是“users”组的一部分,请输入:

\n\n
sudo adduser yourSpecificUsername users\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后注销并重新登录!

\n\n

编辑
\n挂载后的分区默认为root所有。这似乎阻止任何人写入该分区。如上所示安装后将所有者更改为“UserNameOfSudo”会产生所需的行为。

\n\n

Edit2
\n在本地用户和 LDAP 用户之间共享计算机的情况下,解决方案是向每个人授予所有权限:

\n\n
sudo chmod 777 /media/data\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后设置“粘滞位”,这意味着只有创建文件夹/文件的用户才允许删除它。这增加了一些合理的安全性:

\n\n
sudo chmod o+t /media/data/\n
Run Code Online (Sandbox Code Playgroud)\n