如何禁用本地文件写入?

sci*_*ife 1 permissions home readonly

我维护一个共享的公共计算机。每个用户在/home. 我们不喜欢进行/home网络挂载,因为新用户登录需要很长时间,但我们希望设置它以便用户无法写入他们的/home目录。我们为用户提供了他们应该使用的网络存储,但我们无法强迫他们使用它。

理想情况下,我想完全阻止它们将数据写入本地机器,而是引导它们写入存储服务器。如果这是不可能的,我至少想限制他们在本地机器上的磁盘配额,这样他们就不能消耗所有空间。我该怎么做呢?

gol*_*cks 5

您可以通过在/home. 这不会禁用/home,但它会解决您的问题,因为它会阻止人们写入超过固定数量的内容。

文件系统映像文件的工作方式如下:

  1. 创建一个固定大小的空文件,例如 100 MB:

    dd if=/dev/zero of=/var/home/bob.img bs=1024 count=100000
    
    Run Code Online (Sandbox Code Playgroud)

    您不必使用/var/home这些;这是一个目录,否则将不存在。 这些文件应该由 root 拥有并设置模式 600,以便其他人无法读取它们。显然,确保您有空间为每个用户创建一个 100 MB 的文件,但请记住,您将能够同时删除所有内容/home并释放该空间。

  2. 在镜像中创建文件系统:

    mke2fs -m 0 /var/home/bob.img
    
    Run Code Online (Sandbox Code Playgroud)

    这将警告您bob.img is not a block special device- 无论如何都要继续。

    第一次这样做,想必你想复制到用户现有的家中,所以你必须临时挂载它:

    mount /var/home/bob.img /mnt/tmp
    mv /home/bob/* /mnt/tmp
    mv /home/bob/.* /mnt/tmp
    
    Run Code Online (Sandbox Code Playgroud)

最后一个会询问您是否要覆盖...别。 它只是为了移动顶层中的“隐藏”点文件,第一个mv将留下。您也可以使用文件浏览器或其他一些方法来进行移动。 /home/bob现在应该是空的,您可以将安装的图像移动到那里:

    umount /mnt/tmp
    mount /var/home/bob.img /home/bob
Run Code Online (Sandbox Code Playgroud)

瞧,一切似乎都回到了原来的样子——除了/home/bob现在是一个独立的文件系统,用户bob将无法在那里放置超过 100 MB。此外,因为它是一个现有的图像文件,所以这个空间将保留给 bob,不会被其他任何东西占用。

你需要一个 init 服务来在启动时挂载所有这些;它可以很简单:

#!/bin/bash

for img in /var/home/*.img; do
    name=$(basename $img .img)
    mount $img "/home/$name"
done
Run Code Online (Sandbox Code Playgroud)

当系统关闭时,它们应该被自动卸载。数据与在其他任何地方一样安全。