команда 'reboot' не работает должным образом после команды 'cp' - PullRequest
0 голосов
/ 08 мая 2018

Я скомпилировал код C, работающий как двоичный файл на ARM. ARM загружает Linux с SD-карты, используя старый Image, созданный с помощью buildroot. В коде C я вызываю сценарий оболочки, который перемещает новый Image, с которым я хочу загрузиться, из подкаталога на SD-карте на верхний уровень SD-карты (перезаписывая старый Image), а затем использую резервная копия Image.bak для восстановления Image в подкаталоге снова, в случае, если я снова запускаю сценарий:

#!/bin/sh
mv /sd/newImage/Image /sd/
mv /sd/newImage/Image.bak /sd/newImage/Image
reboot

В этом случае перезагрузка работает должным образом (Putty отключается -> индикатор на используемой плате становится красным, а затем зеленым -> я могу подключиться через Putty), хотя вторая команда mv не работает - она ​​удаляет Image.bak но не создает Image - но на самом деле это не цель этого поста.

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

#!/bin/sh
mv /sd/newImage/Image /sd/
cp /sd/newImage/Image.bak /sd/newImage/Image
reboot

Что происходит, это то, что терминал Putty, который я использовал, разъединяет, но светодиод на плате, который становится красным при сигнале о перезагрузке, просто остается зеленым, и единственный способ восстановить соединение через Putty - это вручную выключить плату через выключатель питания. Так что, кажется, что-то странное происходит, когда я вызываю команду cp в сценарии оболочки. Я попытался отключить SD-карту, думая, что, возможно, были проблемы с синхронизацией, но это тоже не сработало.

Я вошел в систему как root, и разрешения не должны быть проблемой ни с чем из этого.

1 Ответ

0 голосов
/ 08 мая 2018

Во-первых, это на самом деле системный вопрос, а не вопрос программирования, поэтому он, вероятно, должен быть в другом стеке.

Во-вторых, вполне вероятно, что изображение фактически является символической ссылкой где-то еще в файловой системе. Когда вы используете cp, он заменит контент, на который указывает ссылка. Когда вы используете mv, он помещает этот файл на место символической ссылки, но оставляет исходный файл без изменений в его фактическом местоположении.

Чтобы убедиться в этом, просто используйте ls -l /sd и обратите внимание на тип файла Image (первый символ в атрибутах).

...