ubuntu 18.04 上的 zerofree

Dan*_*ish 21 virtualbox disk-usage 18.04

我正在使用 Ubuntu 18.04 在 Windows 10 专业版主机上的 VM VirtualBox 上进行开发,我之前按照以下步骤压缩了虚拟硬盘:https : //www.howtogeek.com/312883/how-to-shrink- a-virtualbox-virtual-machine-and-free-up-disk-space/

除了通常的更新 - 我没有乱用它,(最近刚刚安装了 virtualbox gues 添加的更新)

以前,我只显示了一个 /dev/sda1 - 今天我有三个,当我尝试在其中任何一个上运行 zerofree 时,我发现该设备安装在 rw 中

在此处输入图片说明

我也按照这里的一些说明停止了一些服务并尝试重新安装 - 但它没有用

https://unix.stackexchange.com/questions/42015/mount-is-busy-when-trying-to-mount-as-read-only-so-that-i-can-run-zerofree

它仍然说挂载点很忙

我不确定这是不是因为最近的更新而发生的?我还通过卸载 vmware 来宾添加进行了测试 - 但它没有用

建议?

Teo*_*man 24

安装零免费

sudo apt install zerofree

重新启动进入 ubuntu 恢复控制台,按住 [RIGHT SHIFT]

advanced options -> recovery mode -> root console

找到根目录

mount | grep "sda"

零运行

echo "u" > /proc/sysrq-trigger
mount /dev/mapper / -o remount,ro
zerofree -v /dev/sda1
Run Code Online (Sandbox Code Playgroud)

重启

shutdown -r now

压缩驱动器

VBoxManage modifyhd /path/to/VDI/VM.vdi --compact

来源:来自 ubuntuforums.org 的 cyplex

  • `echo "u" > /proc/sysrq-trigger` 似乎对我的情况产生了影响。我读到的所有其他关于停止各种服务、杀死 dhclients、禁用交换的提示都是不够的 (2认同)
  • 这个实际上适用于 20.04 (2认同)

Emm*_*N K 21

什么对我有用(结合了几个相关问题和论坛的答案):

  • 虚拟盒 5.2.10
  • Windows 10 作为主机操作系统
  • Ubuntu 18.04 作为来宾操作系统

首先安装 zerofree:

sudo apt-get install zerofree
Run Code Online (Sandbox Code Playgroud)

创建 0 以获取要回收的空间(删除所有不需要的文件以及清空垃圾箱)

重新启动到 GRUB 菜单(在 Ubuntu 启动时按 Esc)

Advanced options for Ubuntu > Recovery Mode (choose highest version number)
Run Code Online (Sandbox Code Playgroud)

Recovery Menu 选择Drop to root shell prompt

df 获取您的分区(查看您想要缩小的分区,例如 sda1、sda 4 等。通常是它的/dev/sda1

df
Run Code Online (Sandbox Code Playgroud)

尝试运行 zerofree

zerofree /dev/sda1
Run Code Online (Sandbox Code Playgroud)

分区是可读写的,需要以只读方式挂载,zerofree 才能运行错误:

如果您从 zerofree 收到错误,例如/dev/sda1安装为 rw,那么您需要将其安装为只读才能继续。

要将/dev/sda1所需分区挂载为只读分区以zerofree在其上使用:

注意 1:您应该相对快速地执行以下步骤,以便能够像ro在服务和套接字重新使用之前一样安装驱动器并再次开始写入磁盘。否则,您可能需要systemctl再次执行该步骤以确保已停止写入磁盘。

注 2:(跳过阅读此内容,直到此后的步骤失败)。根据您的系统,您可能还有其他服务和套接字仍在写入磁盘而不是systemd-journald. 如果以下步骤不起作用,请尝试在运行这些步骤后查看仍在写入磁盘的内容,然后以相同的方式停止它们

systemctl --type=service
systemctl --type=socket
Run Code Online (Sandbox Code Playgroud)

脚步:

更新:用户@Kevin 给出了一个很好的建议,可以在单行命令中执行这些步骤(见下文),以防服务和套接字过快恢复使用:

systemctl stop systemd-journald.socket && systemctl stop systemd-journald.service && sudo swapoff -a && mount -n -o remount,ro -t ext2 /dev/sda1 / && zerofree /dev/sda1
Run Code Online (Sandbox Code Playgroud)

首先,停止所有写入磁盘的进程,以免mount /: mount busy出错

systemctl stop systemd-journald.socket
systemctl stop systemd-journald.service
Run Code Online (Sandbox Code Playgroud)

检查是否启用了任何交换分区:

swapon -s
Run Code Online (Sandbox Code Playgroud)

如果启用,则禁用它们

sudo swapoff -a
Run Code Online (Sandbox Code Playgroud)

最后,您应该能够以dev/sda1只读方式挂载。(您的文件系统类型可能与 不同ext2。要查找文件系统,请运行df -T

mount -n -o remount,ro -t ext2 /dev/sda1 /
Run Code Online (Sandbox Code Playgroud)

然后最后运行 zerofree

zerofree -v /dev/sda1
Run Code Online (Sandbox Code Playgroud)

Whenszerofree完成后,关闭Ubuntu的

halt
Run Code Online (Sandbox Code Playgroud)

最后,在主机操作系统(在我的情况下为 Windows 10)上,压缩 vdi 以回收空间:

VBoxManage.exe modifymedium disk "C:\path\to\disk.vdi" --compact
Run Code Online (Sandbox Code Playgroud)

  • 我在 Ubuntu 20.04 LTS 上执行了以下命令: `systemctl stop systemd-journal* && swapon -s && sudo swapoff -a && mount -n -o remount,ro -t ext4 /dev/sda<your number> /` ...我只使用了一个停止命令,它起作用了:`systemctl stop systemd-journal*` ... (3认同)

小智 9

我使用了 Emmanuels 的解决方案,它仅在停止另外两个套接字后才起作用:

systemctl stop systemd-journald.socket 
Run Code Online (Sandbox Code Playgroud)

新线路:

systemctl stop systemd-journald-dev-log.socket
systemctl stop systemd-journald-audit.socket
Run Code Online (Sandbox Code Playgroud)
systemctl stop systemd-journald.service
sudo swapoff -a 
mount -n -o remount,ro -t ext4 /dev/sda1 / 
zerofree /dev/sda1
Run Code Online (Sandbox Code Playgroud)

注意:我使用 Ubuntu 18.04.3 和 EXT4

将我的磁盘从 40 GB 缩小到 7 GB。谢谢。:)


Cha*_*een 7

正如其中一条评论中提到的,您安装了三个分区(sda1、sda2 和 sda3)和几个用于其他目的的临时文件系统。

手册zerofree指出,如果您想在文件系统上运行它,那么该文件系统必须以只读方式挂载或卸载。当您运行 Ubuntu 时,可以肯定的//dev/sda1,您计算机上的根分区已安装,因此该命令会失败。

如果您想继续运行zerofree/dev/sda1您需要从备用设备启动,例如可启动的 USB 或 ISO 映像,或者对备用 linux 映像执行 chroot。您引用的链接为您提供了有关如何在根分区上运行此程序的具体说明。请重新阅读他们关于如何在 Linux 中使用该程序的说明:

  • 在操作系统加载之前启动和访问 Grub
  • 从 grub 菜单中选择“高级选项”
  • 进入恢复模式会话
  • 使用“root”登录
  • 识别磁盘
  • zerofree
  • 停止机器
  • 关闭电源并重新启动虚拟机

2019-01-22

当前版本的 Ubuntu 使zerofree从恢复会话中运行变得困难 - 在这种情况下,从实时 USB 运行此程序更容易:

  • 下载当前的 Ubuntu iso 文件
  • 使用 Ubuntu iso 创建实时 USB/CD
  • 从实时媒体启动您的设备(这也可以在 VM 中完成)
  • 安装程序zerofree,如果尚未安装,请使用命令sudo apt install zerofree
  • 运行命令
  • 重启机器

  • 这就是我所做的,从 GRUB 选择 root,然后在 /dev/sda1 上,当我尝试在 /dev/sda1 上运行 Zerofree 时 - 它说它安装在 rw 中 (2认同)
  • VirtualBox 中有一个选项,可以将 ISO 挂载为 CD,然后从该 CD 启动。其中一些链接较旧,但过程将非常相似。[https://forums.virtualbox.org/viewtopic.php?t=55617](https://forums.virtualbox.org/viewtopic.php?t=55617) 或 [https://www.dedoimedo.com/ computer/virtualbox-cdrom.html](https://www.dedoimedo.com/computers/virtualbox-cdrom.html) 或 [https://www.howtogeek.com/187721/how-to-boot-from-a -usb-drive-in-virtualbox/](https://www.howtogeek.com/187721/how-to-boot-from-a-usb-drive-in-virtualbox/) (2认同)
  • @GiacomoAlzetta 我的理解是,恢复会话的行为在 Ubuntu 18.10 发布时发生了一些变化 - 例如,许多人报告他们无法在恢复中对“/”运行 fsck。因此,我们被迫使用实时 USB 或 CD 来执行此操作,正如我之前提到的 3 条评论...... (2认同)

小智 5

我会在 Charles Green 的回答中添加评论,但我没有足够的声誉。

运行zerofree命令时,您可能会收到一条错误消息,指出/dev/sda1分区以读写方式挂载。在这种情况下,您必须将此类分区重新安装为只读:

mount -n -o remount,ro -t ext2 /dev/sda1 /
Run Code Online (Sandbox Code Playgroud)

并重新运行zerofree命令,如here所述