/dev/sda1:发现了一个损坏的孤立链表中的一部分i节点。

我正在正常使用我的Ubuntu 2015.04(带有ecryptfs加密用户主目录)笔记本电脑时,突然硬盘变成了只读模式。
我重新启动后,现在卡在这个界面上:
[    0.703206] ACPI PCC probe failed.
starting version 219
error: /dev/sdb: No medium found
error: /dev/sdb: No medium found
Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default or ^D to
try again to boot into default mode.
root@nico:~#

系统日志中的有趣部分:
-- Unit systemd-fsckd.service has begun starting up.
system-fsck[475]: /dev/sda1 contains a file system with errors, check forced.
kernel: ACPI warning: \_SB_.PCIO.PEG_.VID_._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20141107/nsarguments-95)
kernel: ACPI warning: \_SB_.PCIO.PEG_.VID_._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20141107/nsarguments-95)
kernel: thinkpad_acpi: EC reports that Thermal Table has changed
system-fsck[475]: /dev/sda1: Inodes that were part of a corrupted orphan linked list found.
system-fsck[475]: /dev/sda1: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
system-fsck[475]: (i.e., without -a or -p options)
system-fsck[475]: fsck failed with error code 4.
system-fsck[475]: Running request emergency.target/start/replace
systemd[1]: system-fsck-root.service: main process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start File System Check on Root Device
-- Subject: Unit system-fsck-root.service has failed

我不确定是ACPI问题还是磁盘问题。我尝试更新我的联想Thinkpad T520的最新BIOS,但它没有更好地启动。

如何解决这个问题,或者如果磁盘快要损坏了,如何至少将我加密的主目录数据导出到外部驱动器?


8它发现了根文件系统的错误。按照它的指示,运行fsck /dev/sda1并与其交互,让它显示出找到的错误并选择修复它们。首次运行时始终选择“no”来查看有多少错误。如果这些错误似乎只涉及无关紧要的文件,比如日志文件,再次运行时选择“yes”。这可能会导致文件丢失,所以如果你可以先将分区复制到USB设备上,最好这样做。 - meuh
3个回答

  1. 在提示符下,输入fsck /dev/sda<number>并按回车键(根据包含文件系统错误的目录,从日志中查找<number>
  2. 输入y以修复所有错误
  3. exit

如何找到<number> - Kapil Yadav
1非常感谢。它有效了。 - Viraths
2@KapilYadav:你可以在抛出的错误日志中找到这个数字。例如,在OP的问题中,日志显示system-fsck[475]: /dev/sda1 contains a file system with errors, check forced. 因此这个数字是 1 - Rocky Inde
遇到了类似的问题,按照这里的建议操作后,只需点击“y”,问题就解决了,谢谢。这个错误可能会有什么后果(比如丢失或损坏数据)?现在我成功启动并登录了Ubuntu (18.04.5 LTS) 操作系统,有没有办法检查一下呢? - lampShadesDrifter
我在一个虚拟机上安装了Ubuntu 20.04,遇到了一个类似的问题,并且这个解决方案对我有效。 - stic-lab

在终端中:
sudo -i (如果不是root用户,则跳过此步骤)
fdisk -l

寻找您的根驱动器。

我在树莓派上使用Kali Linux,所以我的看起来像mmcblk0p2而不是sdb1...查看您自己的情况。

`umount /dev/mmcblk0p2`

fsck -y /dev/mmcblk0p2

poweroff


我也遇到了同样的问题。我使用Win32DiskImager从一个正常工作的Raspbian SDCard创建了一个镜像文件。当我运行pishrink时,工具给出了"orphaned inode list"错误。所以我按照Rocky Inde的建议执行了fsck。它发现并修复了一些错误,所以我再次运行pishrink,这次成功了!谢谢Rock Inde。
如果你已经走到这一步,仍然不知道如何操作,我创建了一个脚本,部分基于pishrink,来修复这些"orphaned inodes"。你可以在以下链接查看脚本源代码:

https://github.com/gmenezesg/fix_orphaned_inode_list

使用方法:

wget https://raw.githubusercontent.com/gmenezesg/fix_orphaned_inode_list/master/fix_orphaned_inode_list.sh

sudo chmod +x fix_orphaned_inode_list.sh

sudo ./fix_orphaned_inode_list.sh [imagefile.img]

脚本:

#!/bin/bash

function cleanup() {
  if losetup $loopback &>/dev/null; then
        if [ "$verbose_mode" = true ]; then
        echo "### Running cleanup ###"
        fi
        losetup -d "$loopback"
  fi
}

verbose_mode=false

while getopts ":v" opt; do
  case "${opt}" in
    v) verbose_mode=true ;;
    *) usage ;;
  esac
done
shift $((OPTIND-1))

usage() { echo "Usage: $0 [-v] imagefile.img"; exit -1; }

if [ "$verbose_mode" = true ]; then
echo "### Mapping arguments ###"
fi

img="$1"

if [ "$verbose_mode" = true ]; then
echo "### Usage checks ###"
fi

if [[ -z "$img" ]]; then
  usage
fi
if [[ ! -f "$img" ]]; then
  echo "ERROR: $img is not a file..."
  exit -2
fi
if (( EUID != 0 )); then
  echo "ERROR: You need to be running as root."
  exit -3
fi

echo "#Check that what we need is installed"
for command in parted losetup tune2fs md5sum e2fsck resize2fs; do
  which $command 2>&1 >/dev/null
  if (( $? != 0 )); then
    echo "ERROR: $command is not installed."
    exit -4
  fi
done

if [ "$verbose_mode" = true ]; then
echo "### Setting cleanup at script exit ###"
fi
trap cleanup ERR EXIT

beforesize=$(ls -lh "$img" | cut -d ' ' -f 5)
parted_output=$(parted -ms "$img" unit B print | tail -n 1)
partnum=$(echo "$parted_output" | cut -d ':' -f 1)
partstart=$(echo "$parted_output" | cut -d ':' -f 2 | tr -d 'B')
loopback=$(losetup -f --show -o $partstart "$img")
tune2fs_output=$(tune2fs -l "$loopback")
currentsize=$(echo "$tune2fs_output" | grep '^Block count:' | tr -d ' ' | cut -d ':' -f 2)
blocksize=$(echo "$tune2fs_output" | grep '^Block size:' | tr -d ' ' | cut -d ':' -f 2)

fsck -y "$loopback"