Почему делает эту работу: “cp image.bin/dev/mapper/loop0p1”?

На Ваш вопрос трудно ответить точно, потому что Вы не сказали, что соединяет каналом, Вы являетесь передающими демону, и Вы не указали полномочия ~agent. Если Вы запускаете демона в ~agent/incoming каталог и передача это относительные пути, затем так как демон находится в automaton группа, которую это сможет считать, пишут и удаляют файлы в ~agent/incoming каталог.

Я предполагаю то, что происходит:

  1. ~agent каталог не является исполняемым файлом демону.
  2. Путь, переданный демону, включает ~agent как компонент (говорят, это - полный путь).

Когда процесс доступы /home/agent/incoming/foo, это должно иметь полномочия выполнения на всех каталогах, которые пересечены: /, /home, /home/agent и /home/agent/incoming (больше, если некоторые из них являются символьными ссылками).

Если доступы демона foo в то время как его текущий каталог ~agent/incoming, это только должно иметь полномочия выполнения на текущем каталоге (~agent/incoming) самостоятельно. Необходимо удаться сделать тот каталог текущим; chdir требует, чтобы процесс имел доступ к целевому каталогу. Это возможно, если Вы сначала изменяетесь на желаемый каталог при выполнении, как (говорят) agent пользователь, затем выполняет что-то как su daemon -c daemon-command.

2
18.04.2013, 02:37
3 ответа

GNU coreutils cp работы, потому что это было записано тот путь. Запись в блочные устройства не является сложной, это - по существу та же операция как пишущий в регулярный файл.

Однако Вы не должны использовать cp тот путь. Можно сделать это, если Вы уверены, что это - GNU coreutils, который работает. Но существуют другие ароматы cp вокруг, например busybox cp не поддерживает запись в устройства вообще; это удаляет связь (удаляет) узел устройства и создает новый файл в его месте вместо этого.

dd более безопасно в том отношении. Это было сделано для записи в устройства и приносит инструменты (бакалавр наук, ищите, пропустите, рассчитайте...), Вам часто нужно при контакте с устройствами. Это должно сделать ожидаемую вещь во всех ароматах dd.

3
27.01.2020, 21:53
  • 1
    Как "CP может быть записано тот путь", если "это - по существу та же операция"? Действительно ли игнорирование является проверкой на блочное устройство и не выходом из-за этого "записанного тот путь"?8-) busybox поведение кажется глупым мне. Тот POSIX совместим? (Можно) изменить права доступа этим. И если цель не может быть несвязанной, она перестала работать затем? :-/ –  Hauke Laging 17.04.2013, 14:59
  • 2
    Глупый или нет, я просто хотел указать на это. –  frostschutz 17.04.2013, 15:20
  • 3
    , Которое действительно походит на ошибку в busybox... –  psusi 17.04.2013, 16:34
  • 4
    Как насчет cat image.bin > /dev/mapper/loop0p1 в busybox? –  jdh8 10.02.2017, 19:52

Ваше ожидание отличается от программы / проектирование системы. Что мы скажем об этом?:-)

"Все - файл"...

Вы могли прокрутить CP и/или dd strace -e trace=open и будет видеть, что syscall является тем же и для регулярных файлов и для блочных устройств. Если syscall не говорит им независимо, почему CP должно заботиться?

2
27.01.2020, 21:53
  • 1
    Можно ли сделать противоположное? cp/dev/sdb1 ~/disk.iso –  Guerrio 17.04.2013, 14:46
  • 2
    Да. Можно использовать cp, dd или даже cat (и вероятно несколько других команд). –  Hennes 17.04.2013, 14:49
  • 3
    @Guerrio Действительно. Но обычно dd взят для этого, потому что это более гибко. cp может скопировать целые "файлы" только. –  Hauke Laging 17.04.2013, 14:53
  • 4
    Это работает в некоторых оболочках: < /dev/sdb1 > ~/disk.iso. –   18.04.2013, 03:40

Хорошо насколько я знаю, все это cp делает

  • откройте конечный файл в режиме записи
  • запишите данные от исходного файла до конечного файла (не уверенный в размере блока, хотя, но это - просто детали),

С нормальными файлами это может привести к также

  • создание нового файла, который вырастет с каждым вызовом записи
  • Перезапись существующего файла, который будет перезаписан:
    Первый вызов записи сотрет содержание файла и поместит новые данные в них. От той точки на файле растет точно как то, если это было новое.

Теперь/dev/mapper /* являются блочными устройствами (или быть определенными, символьными ссылками на блочные устройства). У этого действительно есть статические размеры файла. Поэтому, если Вы открываете те файлы, каждого write() вызов просто перезапишет n байты конечного файла, который Вы отправили в него (предполагающий, что существует нет fseek() звоните где угодно).

Так, давайте запишем CP нашего собственного плохого человека:

#include <stdlib.h>
#include <stdio.h>

void usage() {fprintf(stderr, "Usage: cp <srcFile> <tgtFile>\n"); exit(1);}
void error(const char *msg) {fprintf(stderr, "Error: %s\n", msg); exit(2);}

void printPosAndSize(FILE *f) {
    off_t curPos = ftello(f);
    fseeko(f, 0, SEEK_END);
    off_t size = ftell(f);
    fseeko(f, curPos, SEEK_SET);
    printf("Pos: %llu,\tSize: %llu\n", curPos, size);
}

int main(int argc, const char *argv[]) {
    if (argc != 3) usage();

    const char *srcPath = argv[1];
    const char *tgtPath = argv[2];

    FILE *inFile = fopen(srcPath, "rb");
    FILE *outFile = fopen(tgtPath, "wb");

    printf("inFile: %s, outfile: %s\n", srcPath, tgtPath);

    if (!inFile) error("Couldn't open source file!");
    if (!outFile) error("Couldn't open target file!");

    while (!feof(inFile)) {
        char buff[2048];
        size_t count = fread(buff, 1, sizeof(buff), inFile);
        fwrite(buff, 1, count, outFile);
        printPosAndSize(outFile);
    }

    fclose(inFile);
    fclose(outFile);

    return 0;
}

Это CP запишет 2 048-байтовые блоки от file1 до file2. Если Вы просто скопируете регулярные файлы, то вывод будет похож на это:

# copying to new file:
$ sudo ./cp /var/log/syslog /tmp/foo.txt 
inFile: /var/log/syslog, outfile: /tmp/foo.txt
Pos: 2048,      Size: 2048
Pos: 4096,      Size: 4096
Pos: 4949,      Size: 4949

# overwriting existing file:
$ sudo ./cp /var/log/syslog /tmp/foo.txt 
inFile: /var/log/syslog, outfile: /tmp/foo.txt
Pos: 2048,      Size: 2048
Pos: 4096,      Size: 4096
Pos: 4949,      Size: 4949

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

Так, давайте попробуем что-то другое: $ sudo./cp/var/log/syslog/dev/null inFile:/var/log/syslog, outfile:/dev/null На месте продажи: 0, Размер: 0 На месте продажи: 2048, Размер: 0 На месте продажи: 974, Размер: 0

/dev/null устройство посимвольного ввода-вывода. У этого всегда есть размер 0. Вывод просто пишут в них (например, в последовательный порт) и забывают впоследствии.

Но давайте доберемся до Вашего вопроса: Что происходит, если Вы пишете в блочное устройство (Осторожность! Выполнение этого сделает все данные по устройству нечитабельными, поскольку это уничтожает метаинформацию диска! Я использовал старую Карту памяти для этой демонстрации),

$ sudo ./cp /var/log/syslog /dev/sdb
inFile: /var/log/syslog, outfile: /dev/sdb
Pos: 2048,      Size: 2003828736
Pos: 4096,      Size: 2003828736
Pos: 5306,      Size: 2003828736

Файл блока просто открыт в положении 0 и перезаписанном байте байтом (не касаясь всех других данных).

2
27.01.2020, 21:53
  • 1
    я не получаю смысл последнего абзаца... –  Hauke Laging 17.04.2013, 14:28
  • 2
    я думаю последние намеки абзаца на некоторое другое очень полезное копирование dd. Просто тот, который не имеет никакого отношения к вопросу об операции в секунду. –  Hennes 17.04.2013, 14:50
  • 3
    @Hennes OK, теперь я получил его. Но что удивительно об этом? CP должно заполнить остальную часть блочного устройства, обнуляет или безотносительно? :-S –  Hauke Laging 17.04.2013, 14:55
  • 4
    Sry, последний абзац немного сбивал с толку. Я заменил его некоторым примером кода и некоторым выполнением, которое должно покрыть все различные типы конечного файла (регулярный файл, символ и блок dev) –  mreithub 17.04.2013, 14:59

Теги

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