Приостановка с рутом на USB

У меня есть ноутбук с Ubuntu 14.04 из корневой файловой системы на USB-накопителе. Это не очень хорошо работает, потому что после выхода из режима ожидания, ext4 будет часто пытаться выполнить запись в корневую файловую систему до того, как USB будет готов.

Вот что я вижу в журнале ядра, когда это происходит, обратите внимание, как я получаю кучу ошибок ввода / вывода на 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 вручную из корневой оболочки, чтобы восстановить файловую систему.

Существуют ли какие-либо настройки, которые я могу изменить, чтобы доступ к корневому устройству после пробуждения из режима ожидания мог быть отложен до тех пор, пока USB-накопитель не будет готов?

1
задан 2 August 2014 в 12:13

1 ответ

Причиной эта проблема только замечена с USB-устройствами а не с другими устройствами, является комбинация двух факторов:

  • устройство хранения данных USB в отличие от других носителей полагается на потоки ядра для операции.
  • При возобновлении от приостанавливают, ядро будит все потоки одновременно.

результат - то, что во время резюме будет гонка между системой USB, с одной стороны пытаясь обнаружить медиа и системный журнал, с другой стороны, пытаясь записать, что сообщения журнала от приостанавливают и возобновляются к диску.

, Если системный журнал, оказывается, делает попытку записи, прежде чем 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),
0
ответ дан 2 August 2014 в 12:13

Другие вопросы по тегам:

Похожие вопросы: