AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 505779
Accepted
kasperd
kasperd
Asked: 2014-08-03 00:13:46 +0800 CST2014-08-03 00:13:46 +0800 CST 2014-08-03 00:13:46 +0800 CST

在 USB 上以 root 挂起

  • 772

我有一台从 USB 存储上的根文件系统运行 Ubuntu 14.04 的笔记本电脑。这不是很好,因为从挂起唤醒后,ext4 会在 USB 准备好之前频繁尝试写入根文件系统。

这是发生这种情况时我在内核日志中看到的内容,请注意我是如何在 上出现一堆 I/O 错误sda1,然后一秒钟后内核终于检测到 USB 存储驱动器。

[ 2826.517419] wlan0: associated
[ 2826.517452] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[ 2827.575371] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 1733735 (offset 0 size 0 starting block 12629950)
[ 2827.575380] Buffer I/O error on device sda1, logical block 12629694
[ 2827.575400] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 3148603 (offset 0 size 8192 starting block 12844470)
[ 2827.575404] Buffer I/O error on device sda1, logical block 12844212
[ 2827.575411] Buffer I/O error on device sda1, logical block 12844213
[ 2827.575448] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 3015015 (offset 0 size 90112 starting block 6588832)
[ 2827.575453] Buffer I/O error on device sda1, logical block 6588576
[ 2827.575461] Buffer I/O error on device sda1, logical block 6588577
[ 2827.575465] Buffer I/O error on device sda1, logical block 6588578
[ 2827.575469] Buffer I/O error on device sda1, logical block 6588579
[ 2827.575473] Buffer I/O error on device sda1, logical block 6588580
[ 2827.575477] Buffer I/O error on device sda1, logical block 6588581
[ 2827.575481] Buffer I/O error on device sda1, logical block 6588582
[ 2828.857284] sd 0:0:0:0: [sda] No Caching mode page found
[ 2828.857293] sd 0:0:0:0: [sda] Assuming drive cache: write through

起初在内核日志之外没有可见的迹象表明问题已经触发,但如果我让 Ubuntu 在这一点之后继续运行,那么文件系统将出现错误并最终切换到只读模式。那时我必须重新启动进入恢复模式并fsck.ext4从 root shell 手动运行以修复文件系统。

是否有一些我可以更改的设置,以便可以延迟从挂起唤醒后对根设备的访问,直到 USB 驱动器准备就绪?

usb
  • 1 1 个回答
  • 1019 Views

1 个回答

  • Voted
  1. Best Answer
    kasperd
    2014-08-04T22:22:43+08:002014-08-04T22:22:43+08:00

    此问题仅出现在 USB 设备上而不出现在其他设备上的原因是两个因素的结合:

    • USB 存储与其他存储介质不同,它依赖于内核线程进行操作。
    • 从挂起恢复时,内核同时唤醒所有线程。

    结果是,在恢复过程中,一方面 USB 系统试图检测媒体,另一方面系统日志试图将日志消息从挂起和恢复写入磁盘。

    如果 syslog 碰巧在检测到 USB 设备之前尝试写入,ext4 会收到一个错误,出于某种原因,该错误没有得到妥善处理,最终文件系统将需要手动运行 fsck。

    我找到的解决方案是在其他线程被唤醒之前为内核线程提供 12 秒的领先优势。这些是我必须对内核进行的更改才能使其工作:

    --- linux-3.13.0/kernel/power/suspend.c.orig    2014-01-20 03:40:07.000000000 +0100
    +++ linux-3.13.0/kernel/power/suspend.c 2014-08-04 00:57:43.847038640 +0200
    @@ -299,6 +299,8 @@
            goto Resume_devices;
     }
    
    +unsigned int resume_delay = 0;
    +
     /**
      * suspend_finish - Clean up before finishing the suspend sequence.
      *
    @@ -307,6 +309,15 @@
      */
     static void suspend_finish(void)
     {
    +       if (resume_delay) {
    +               /* Give kernel threads a head start, such that usb-storage
    +                * can detect devices before syslog attempts to write log
    +                * messages from the suspend code.
    +                */
    +               thaw_kernel_threads();
    +               pr_debug("PM: Sleeping for %d milliseconds.\n", resume_delay);
    +               msleep(resume_delay);
    +       }
            suspend_thaw_processes();
            pm_notifier_call_chain(PM_POST_SUSPEND);
            pm_restore_console();
    --- linux-3.13.0/kernel/sysctl.c.orig   2014-08-04 08:11:26.000000000 +0200
    +++ linux-3.13.0/kernel/sysctl.c        2014-08-03 23:27:23.796278219 +0200
    @@ -277,8 +277,17 @@
     static int max_extfrag_threshold = 1000;
     #endif
    
    +extern unsigned int resume_delay;
    +
     static struct ctl_table kern_table[] = {
            {
    +               .procname       = "resume_delay",
    +               .data           = &resume_delay,
    +               .maxlen         = sizeof(unsigned int),
    +               .mode           = 0644,
    +               .proc_handler   = proc_dointvec,
    +       },
    +       {
                    .procname       = "sched_child_runs_first",
                    .data           = &sysctl_sched_child_runs_first,
                    .maxlen         = sizeof(unsigned int),
    
    • 1

相关问题

  • 如何显示UMTS信号强度?

  • 如何在连接 MTP 设备时禁用自动播放功能?

  • 我这里有一个 22 号陷阱!除非我更新,否则没有互联网[关闭]

  • 修复 USB 驱动器自动通知

  • 如何从命令行重置 USB 设备?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve