真实磁盘空间

真实磁盘空间

我不知道发生了什么事。昨晚我的电脑系统分区上还有大约700MB的可用空间,今天磁盘上已经没有可用空间了,而且很多包含数据的文件,根据系统,是0字节,但实际上文件已经充满了右文本等数据(并且它们具有空白文档的图标)。删除一些文件后,我看不到任何变化 - 仍然没有可用空间。这些文件已被永久删除,并且在删除过程中未使用。

sync昨天我第一次指挥了一次。今天我还以 root 身份执行了以下操作sync; sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

看起来分区或实际文件系统有问题。很长一段时间没有重新启动系统,就我而言,这是我现在最不想做的事情。

此外,我注意到终端中没有命令历史记录 - 文件.bash_history是空的。这是因为缓存丢失还是我的磁盘损坏了?如果是第一个,那么在 bash 历史记录等值得注意的事情中还有什么被清除了?

昨天,由于文件搜索之类的一些操作,我曾经使磁盘努力工作,但在那之后直到晚上一切都很好。

我注意到的另一件烦人的事情是名为的工作进程,update-apt-xapian-index-dbus它仍在后台,但它现在正在睡觉(我无法杀死它,每次我尝试这样做时它都会回来)。

我没有看到其他错误 - 系统仍在工作并且稳定。我想知道我的系统发生了什么...你有什么建议吗?如何诊断?如何显示真实的可用空间和文件大小?是否需要重启?

编辑:另一件事是像 Shift+Del 这样的击键不起作用。我试图找到在夜间创建的文件,但find / -ctime=0也显示较旧的文件,对于-mtime.我不得不提到我使用 Ubuntu。

**编辑:我刚刚找到了名为的文件.xsession-errors,它大约有 650MB,所以也许这是我丢失的空间(它是 maches),今天一小时前访问和修改了它,但我不能说(并检查)它何时创建。这个怎么样?该文件旁边的文件是.xsession-errors.old在上次重新启动当天修改的,大小不到 0.5MB。我刚刚找到了我的“自由空间”吗?

命令sync可能是分区问题的原因吗?我在某处读到过,但真的可以吗?**

编辑:我打开了该文件.xsession-errors,我在里面看到的是一些真正的错误,其中包含有关显示窗口的描述以及数千行Illegal character <2e> in hex string和数百万行Write error: Unknow error。我猜它正在写入,直到磁盘上有可用空间为止。该字符并不总是<2e>,但它重复次数最多。

答案1

为了查找文件大小,如果分区损坏,则在检查 fs 之前不会报告正确的大小FSCK。您需要fsck -P在根磁盘上执行 a,您可以通过运行来识别该磁盘,df -h您应该得到类似的信息。

user@server:~> df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              25G   18G  5.9G  76% /
udev                  2.0G  116K  2.0G   1% /dev
/dev/sda1             244M   20M  211M   9% /boot
/dev/sda5             4.0G  1.7G  2.2G  43% /var
/dev/sda6             4.7G  1.2G  3.3G  27% /tmp
/dev/sdb1             197G  127G   61G  68% /data

您需要从 grub 启动进入恢复模式或从磁盘启动进入恢复模式(首选)。实时环境是更好的选择,因为如果您的文件系统损坏/,该fsck实用程序可能会损坏并造成损坏。如果您可以启动到实时环境,则/默认情况下可能不会安装,因此 df 不会有帮助,运行时sudo fdisk -l将列出可用磁盘,一旦确定,您就可以fsck在目标设备上运行。

此外,您还需要复制所有已归档的日志。假设驱动器不是 fubar 并且您可以清理一些空间,那么实时滚动日志输出对于诊断错误至关重要。您也可以考虑使用类似的东西系统日志用于将日志写入另一个盒子上的数据库。当您的磁盘出现问题时,这将使您可以访问日志。

答案2

您可能希望尽快运行 fsck,如另一个答案中所述。我会尝试先进行备份,特别是如果您能够访问文件的内容,尽管它们的大小为 0。

查看 tar 备份并恢复到另一台计算机是否可以修复文件大小。

cd /to/problem/area
tar -zcf - . | ssh [email protected] tar -C /some/safe/dir -zxvf -

如果是这样 - 备份所有内容,然后重新启动进入恢复模式并对所有内容进行 fsck。

答案3

一年多来,我一直在与分区作斗争,并毫无理由地向我驱使腐败。即使使用 LiveCD,我也会遇到困难,因为我很难控制并恢复数据。我准备转向恢复工具,但发现 gparted 和 gpart 可以管理我真正需要的只是将我的数据备份,然后

不幸的是,虽然 gparted 正确识别了我的文件夹和文件并确定了我的驱动器结构,但它只是报告分区表中存在差异,但没有纠正它们。在“设备”下,它提供了数据救援功能,但事实证明您需要为此安装 gpart。它不在 LiveCD 上,并且 LiveCD 允许的有限存储库也没有它。您必须进行完整安装并进行升级才能到达任何地方。

但是,在没有完全重建的情况下,您不会将安装日期安装到损坏的驱动器上。所以

我选择 /dev/sdb1 作为 root,并确保除了可移动驱动器上的交换分区之外还选择了其他分区。安装程序假设任何现有的交换分区也可以使用,但在损坏的驱动器上这是一个危险的假设。安装进行得很顺利,但我放弃了旧发行版并在 itd 位置使用了 UbuntuGnome 16.04。我想将旧发行版视为造成我困境的原因,但我很确定

安装很顺利,但情况有所不同。几个小时的使用让我确信我比我的旧发行版更喜欢它。它有点原始,有一些有缺陷的部分,但总而言之,它非常不错。我不喜欢它只有 Firefox 作为浏览器,并且没有 gpart 或 parted 或其他恢复工具,但看看 DVD 光盘的弱点,它的捆绑软件大约是我的旧发行版的两倍,这样很好。

我决定不再使用旧发行版,并且发现使用 LiveCD 工作很不方便,因此决定在第二个新分区上进行第二次安装。在这两个安装中,我将引导进程放在 /dev/sdb 上,而不是默认的 /dev/sda 上。 /dev/sda 已损坏,因此在我复制 /home 下的用户帐户之前不会对其进行写入。否则我可能会不小心把它弄得更糟。每次您进行新安装或在终端中运行 update0grup 时,当前安装都会成为主要安装。现在我已准备好启动可移动驱动器。我之前删除了 /dev/sda 上 3 个分区中的两个分区上除 /home 之外的所有内容。从 LiveCD,您应该能够挂载分区,然后使用终端并输入以下命令:

    sudo su root
    cd /m*/*/*/home

第一个命令在该终端会话中为您提供永久的 root id 和电源,没有超时。但 $HOME 和 $USER 保持原样。然而“~”改为/root。您可以通过键入“exit”或对不同的身份执行“su”来退出 root。

第二个命令可能需要修改。它允许将分区安装在 /mnt 或 /media 或任何其他以“m”开头的文件夹下。通常,Linux 系统中只有这两个。但即使没有“m”,该命令也只有在存在两层“home”文件夹的情况下才会成功。如果这不是带有“home”的驱动器,请在分区上选择一个文件夹名称以提供帮助。如果您不知道分区上有什么,可以使用以下命令序列来了解大部分信息:

   cd /m*/$USER; dir *; dir */

这可能会滚动到视图之外。要向上或向下滚动,请按住 Ctrl+Shift 键并使用向上和向下箭头键。确定您想要访问的分区,然后执行以下操作:“cd ”。同样,您只需输入部分内容,使用 * 填写其余部分。

由于我们在这里保留用户帐户并消除其他所有内容,我假设您使用的“home”现在位于正确的分区上。事实上,此时您已在 .../home 中。所以我们要删除的所有内容都在前一层。我们仅使用一个句点 (.) 来标识当前级别,并使用 2 个句点 (..) 来标识前一级别。现在“home”是该级别唯一以“h”开头的文件夹,这使我们的工作变得简单:

    rm -r ../[!h]*

该命令会递归地删除所有不以“h”开头的内容。这包括文件和文件夹,并且使用 -r 表示这些文件夹中的内容,无论它们的名称中是否包含“h”。就是这样。现在,如果可能的话,您想尝试删除您的数据。但要做到这一点,我需要 gpart,这意味着启动两个新安装的分区之一。所以我输入“立即重新启动”,然后完成重新启动过程。

它按计划出现,但在使用 apt-get 和其他一些命令通过终端窗口安装了一些需要和想要的软件后,我决定继续使用以下命令修改 /etc/sudoers:

    sudo echo $USER '    ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

看,如果您只是想向文件添加一些内容,那么实际上没有必要编辑文件。这样就可以解决问题了。现在,当我使用“sudo”时,不会要求我输入密码。

完成后,我考虑如何获取数据。 gpart 做得很好,当 gparted 调用它时,它使我的 3 个分区中的 2 个再次可读。使用 -w 参数,它可以将读取的内容复制到另一个位置,但它可能会覆盖已经存在的内容。 rsync 允许与包含和排除同步,您可以在其中保留最新内容,但“cp -purf”也是如此,但没有包含和排除的好处。但除了垃圾之外,没有什么需要担心的。还有ddrescue,我什至没有研究过我下载的几个救援盘ISO的内容。无论如何,我对拯救损坏的驱动器不感兴趣,只要可能的话就将数据删除并重新开始。

然后我的新安装遇到了分区问题。现在我确信这是由以下两个原因之一造成的:要么是 ext4 waa 坏了,要么是交换。这是我很长一段时间以来唯一使用的两种分区类型。其他一切都发生了变化,但这是两个常量,我不知道如何处理交换,但它已经存在很长时间了,而且它的作用相当简单,所以它不太可能是候选者。很可能是 ext4,我可以更改。

我从带有 LiveCD 和 gparted 的可移动驱动器开始。 O 想我可以退回一个版本,然后尝试 ext3。我重新找了找,发现它比 ext4 还糟糕。 fsck 让我知道 ext4 正在处理 ext3,并且它在刚刚格式化的新驱动器上发现了令人难以置信的大量错误,该驱动器已被验证为干净的。原来没有单独的分机?格式已经不再是了,获得 ext4 旧副本的唯一方法是通过旧 LiveCD。您必须支持一年或更长时间,这可能有助于安装,但第一次升级会将其替换为似乎有缺陷的版本。

我打开了错误报告吗?不,我也不打算这样做。首先,这是我个人的经历,我不能代表任何人。在 4 台 PC 和 6 个硬盘上发生这种情况可能只是巧合,或者反映了软件的不良组合。正确的?它需要确认,因此如果您也运气不好并且使用 ext4,那么这可能值得讨论。

其次,我厌倦了那些将举证责任强加给用户的网站,或者将帖子和帖子限制在他们需要什么的概念上,并不是所有好的东西都是从模具中出来的。如果存在错误,他们需要自己解决。不要让我指着特定的包装或组合说“这就是!我为你找到了!”。这不是我在这里的角色。我只是一个用户,不是维护者或开发者。

也就是说,我需要为我的分区选择一种不同的结构,但是哪一个呢?我在网上查了一下,这并不是什么大话题,大家就看个人选择了。然后,当您使用“其他东西”时,我考虑了 gparted 和安装程序中的选项。他们不同意。当然也有一些比赛,但不是很多。您会立即失去 ext2、ext3、and ext4 选择,但您还需要排除 FAT16、FAT32 和 NTFS。我不会解释原因,只是不要选择它们,除非您确实需要 Windows 或 DOS 兼容性。好吧,我将简要解释一下:FAT16 的局限性太大,最适合软盘,FAT32 很弱,NTFS 有缺陷,并且在 Windows 或 Linux 端都没有好的恢复工具。

我不再选择一种分区类型,而是决定至少选择两种。 gparted 和安装程序之间的重叠部分为 3m,我选择了 jfs 和 xfs。我都做了,每个分区一个,到目前为止没有问题。

至于数据恢复,第三个分区完全消失了。交换分区(第四个分区)的分区表条目从约 6GB 跃升至约 58GB,映射为第三个分区的重要部分。无论如何,这在很大程度上是多余的,因为我把东西放在那里,但没有真正的时间使用它。

我决定只使用“cp -purf 如果文件夹和文件完好无损,我会很容易获得它们。当然,我也不想要它们。我会将 /dev/sda1/* 恢复到 /dev/sdb1/,和 /dev/sda2/* tp dev/sdb2/。我又采取了一步:我将 /dev/sda1 和 /dev/sda2 安装为只读。听起来完全不可能,但最近几个月我经历了很多事情,而且情况变得更糟,但愿我现在可以摆脱它。

哦,实际使用的命令:

    dir /mnt
    sudo -i
    mkdir /mnt/sda1
    mkdir /mnt/sda2
    mkdir /mnt/sda3
    sudo mount -o ro /dev/sda1 /mnt/sda1
    sudo mount -o ro /dev/sda2 /mnt/sda2
    sudo mount -o ro /dev/sda3 /mnt/sda3
    dir /mnt/sda1
    home  hope
    dir /mnt/sda2
    hold  home
    dir /mnt/sda3
    lost+found
    dir /mnt/sda3/lost+found
    mkdir /mnt/hold1
    cp -rfup /mnt/sda1/home/* /media/$USER/sdb1/home/; cp -rfup /mnt/sda2/hold/* /media/$USER/sda1/home/; cp -rfup /mnt/sda2/home/* /media/$USER/sdb2/home/; cp -rfup /mnt/sda2/hope/* /media/$USER/sda2/home/

使用这一技术,我将 /dev/sda1 上的 2 个文件夹合并到 /dev/sdb1 上的一个文件夹中,并对其他两个分区执行了相同的操作。现在我将从 /dev/sda 重新开始并使 gparted 再次工作。比尝试修复损坏的驱动器更快、更彻底,这充其量只是一个不确定的提议。

答案4

这是我对发生的事情的猜测。

  1. 您的 .xsession-errors 文件已被 650+MB 的垃圾填满。
  2. 这填满了你的主分区。
  3. 许多仍在运行的程序继续运行并尝试写入主分区上的文件。

下面的一些指针描述了他的一些问题。

真实磁盘空间

要检查计算机上的磁盘使用情况,请使用以下df命令。这是一个例子:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        10G  4.5G  4.5G  50% /
/dev/sda5        25G 22.5G    0G 100% /home

这应该会显示磁盘上的可用空间。

您可能会注意到上面的示例有些奇怪。在 中/dev/sda1,指定的分区大小为 10G。但是,如果将“已使用”列和“可用”列相加,则只能得到 9G。同样的事情/dev/sda5- “已使用”和“可用”列比文件系统大小低几倍。是什么赋予了?

默认情况下,ext 分区是使用以下命令创建的预留空间,文件系统的一小部分对普通用户不可用,但对 root 用户可用。其中, 和 的预留空间/dev/sda1均为/dev/sda510%。您可以/dev/sda1使用 来查看预留空间tune2fs -l /dev/sda1

当程序写入磁盘时会发生什么

总而言之,如果您的分区已满,程序将无法写入文件系统。

但是当程序无法写入文件系统时会是什么样子呢?为了解释这一点,您必须回想一下程序分两步写入文件系统:

  1. 程序从操作系统获取文件描述符(具有写权限)。
  2. 程序将数据发送到文件描述符。然后操作系统可以将要写入的数据排队。

有趣的是,这与内核对文件的表示相匹配,从而区分以下内容:

  1. 磁盘中描述文件大小、权限等的块 - 又名索引节点
  2. 磁盘中保存文件内容的块 - 也称为数据块

相对于保存数据的块,索引节点很小。大多数文件系统都会区分数据块消耗的空间和索引节点消耗的空间,因此,当我们这样做时df -h,我们仅报告数据块的空间。就可用空间而言,索引节点不算在内。

这与您的情况有什么关系?

如果磁盘已满(实际上 100% 已满,没有磁盘空间),这并不意味着您的系统无法再写入磁盘。程序仍然可以获取文件描述符,从而创建 0 大小的空白文件。但是,他们将无法将数据写入这些文件。如果由于磁盘空间问题而无法写入文件,许多程序将产生错误消息或崩溃。但最终,您的磁盘上将留下一个大小为 0 的文件。

写入失败示例

我们以 bash 为例。

  1. bash 启动并读取HISTFILE变量,该变量告诉它打开.bash_history命令历史记录
  2. 根据HISTSIZE变量,bash 将只允许 1000 行历史记录(或您设置的任何内容)
  3. 您运行一些命令,然后退出。
  4. bash 现在尝试将历史记录中的最后 1000 个命令写入 .bash_history
    1. bash 获取一个写入文件描述符.bash_history
    2. Linux 现在生成一个 0 大小的 .bash_history 文件
    3. bash 发送 1000 行数据到历史文件描述符
    4. Linux 由于磁盘空间而出现写入错误
  5. 您剩下一个 0 大小的 .bash_history 文件

对于任何试图执行此操作的程序,此过程很容易重复整个文件,而不是简单地追加到文件末尾。因此,我不希望日志文件被清零,尽管我不希望它们被更新。

任何尝试写入磁盘的程序都会受到上述问题的影响。

但是等等,你的系统没有崩溃,对吧?

我高度怀疑您的系统分区 (/) 与您的主分区 (/home) 是分开的,如果您运行df.此外,即使不是,以 root 用户身份运行的系统程序也应该能够访问分区中的保留空间,该空间应该是总分区大小的 1-10%。

您很可能不需要重新启动计算机。但是,我不相信系统的稳定性,因为某些打算将更改写入磁盘上的临时文件的程序将无法做到这一点。由于您运行的是桌面,因此很难确定这些程序是什么。我建议您释放一些空间,然后重新启动,以确保万无一失。

相关内容