LINUX.ORG.RU

Два вопроса про cygwin


0

0

Есть задача собрать exe из *nix-исходников утилиту TAR последней версии. Ставим cygwin, собираем приложение (./configure, make, make install), и почти всё работает нормально. НО: 1. при восстановлении файлов/папок из архива на них принудительно назначаются NTFS-права по образцу *nix (владелец, группа, прочие), что совершенно ненужно и даже вредно. До версии cygwin 1.5 (точно не помню) эту функцию можно было отключить, выставив переменную окружения CYGWIN=noNTSEC, а как быть сейчас? 2. у TAR есть опция --new-volume-script='script name', которая указывает полное имя файла-сценария для именования частей многотомного архива. Так вот exe будучи запущенным вне cygwin-shell не хочет понимать windows-именование объектов файловой системы, т.е. в имени вида 'c:\file.ext' он неадекватно реагирует на двоеточие, можно это как-нибудь исправить или же без cygwin-shell никак?

Ответ на: комментарий от gena2x

1-й вопрос однозначно относится к cygwin, т.к. в tar-е использутся штатные функции open/mkdir, а cygwin определяет их работу в win-среде, да и второй вопрос возможно решить какой-н настройкой cygwin-а

beavis_inc ()

в имени вида 'c:\file.ext' он неадекватно реагирует на двоеточие

А разве он должен реагировать иначе?

C:\>tar -xzf c:\test.tar.gz
c: Unknown Host
tar (child): c\:\\test.tar.gz: Cannot open: Input/Output error
tar (child): Error is not recoverable: exiting now

gzip: stdin: unexpected end of file
tar: Child returned status 2
tar: Error exit delayed from previous errors
C:\>tar -xzf /c/test.tar.gz
C:\>
vaulter ()
Ответ на: комментарий от vaulter

у меня проблема с опцией имени сценария --new-volume-name (-F и т.п.) c:\tar.exe -cf arch.tar -T list.txt -P -L 1024 -M -F c:\script.sh

c/:\script.sh - no such file or directory пробовал /c/script.sh script.sh c:/script.sh c/:/script.sh

на все варианты выдаёт сообщение об отсутствии файла в Linux: "... -F /home/user/script.sh" отрабатывает нормально

beavis_inc ()

1. Из официального changelog'а

The CYGWIN environment variable options «ntsec» and «smbntsec» have been replaced by the per-mount option «acl»/«noacl».

2. C:\\file.ext, нет? А еще есть утилита cygpath, можно попробовать её заюзать.

sjinks ★★★ ()
Ответ на: комментарий от beavis_inc

> у меня проблема с опцией имени сценария --new-volume-name (-F и т.п.) c:\tar.exe -cf arch.tar -T list.txt -P -L 1024 -M -F c:\script.sh

Note that bash interprets the backslash '\' as an escape character, so you must type it twice in the bash shell if you want it to be recognized as such.

/cygdrive/c/script.sh работает?

sjinks ★★★ ()
Ответ на: комментарий от sjinks

/cygdrive/c/script.sh работает более того, работает из cmd c:\tar.exe ... -F c:/script.sh на ОС, где установлен cygwin, а вот на другой ОС без cygwin выдает «c\:/script.sh no such file or directory», что наводит на мысль о необходимости присутствия какой-н минимальной установки cygwin в ОС к примеру, наличие записей в реестре (смотрел, такие есть).

The CYGWIN environment variable options «ntsec» and «smbntsec» have been replaced by the per-mount option «acl»/«noacl». - можно поподробнее об этом, где и как указывать «noacl» ?

beavis_inc ()
Ответ на: комментарий от beavis_inc

>> наводит на мысль о необходимости присутствия какой-н минимальной установки cygwin

tar собирается в среде cygwin из исходников с GNU.ORG

Минимальными требованиями будут наличие cygwin1.dll и cyggcc_s1.dll. И специальных файлов: http://cygwin.com/cygwin-ug-net/using-specialnames.html

Ну и

regtool -v list /HKLM/Software/Cygwin

regtool -v list /HKCU/Software/Cygwin

sjinks ★★★ ()
Ответ на: комментарий от sjinks

скачал CYGWIN 1.7.1

попробовал отключить работу с ACL на файловых системах NTFS

/etc/fstab:

C: /cygdrive/c ntfs binary,noacl,posix=0,user 0 0

такой подход не работает, что здесь не так? в документации сказано, что флаг noacl игнорируется для файловых систем NFS, возможно это опечатка и имелось ввиду nTfs ?

beavis_inc ()
Ответ на: комментарий от beavis_inc

> такой подход не работает, что здесь не так?

А что конкретно не работает? Можно какой-нибудь пример, чтобы воспроизвести ситуацию локально?

в документации сказано, что флаг noacl игнорируется для файловых систем NFS, возможно это опечатка и имелось ввиду nTfs ?

Нет.

acl - Cygwin uses the filesystem's access control lists (ACLs) to

implement real POSIX permissions (default). This flag only affects filesystems supporting ACLs (NTFS) and is ignored otherwise.

NTFS действительно поддерживает ACL, поэтому флаги acl/noacl должны работать (у меня работают).

noacl игнорируется для NFS потому, что NFS — сетевая файловая система, и Cygwin может не иметь контроль над сервером. Иными словами, сервер NFS сам реализует поддержку прав доступа, на которую (поддержку) нельзя повлиять извне.

sjinks ★★★ ()
Ответ на: комментарий от beavis_inc

> скачал CYGWIN 1.7.1

Обновляйтесь до 1.7.2 :-)

В 1.7.1 mount points хранятся в реестре.

А в 1.7.1 можно (нужно?) использовать переменную окружения CYGWIN

sjinks ★★★ ()
Ответ на: комментарий от sjinks

Я обманул с номером версии - на самом деле скачал самую свежую редакцию 1.7.2, то есть записи параметров монтирования в /etc/fstab должны поддерживаться. Пример я уже приводил:

C: /cygdrive/c ntfs binary,noacl,posix=0,user 0 0

Пробовал копировать и через MC в среде cygwin, и через total commander в обычной среде Windows - ntfs ACL'и портятся. Приведите пример правильного монтирования ntfs разделов.

Вообще, после сборки TAR в новом cygwin он перестал понимать русские имена файлов/каталогов, передаваемых ему для архивации, а также заглючила возможность создания многотомных архивов - создаётся лишь первый том, после чего выдаётся ошибка «CreateProcessW (error 2)» (приблизительно так). Подозреваю, что исток проблем один и тот же, так как и при попытке трактовки русских имён, и при попытке запуска tar-ом самого себя из каталога, содержащего в имени русские символы, ошибка одна и таже - The system cannot find the file specified.

beavis_inc ()
Ответ на: комментарий от beavis_inc

[quote]Приведите пример правильного монтирования ntfs разделов[/quote]

Ну у меня вот так всё смонтировано, проблем с ACL не наблюдал:

[code] $ mount C:/cygwin/bin on /usr/bin type ntfs (binary,auto) C:/cygwin/lib on /usr/lib type ntfs (binary,auto) C:/cygwin on / type ntfs (binary,auto) C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto) D: on /cygdrive/d type iso9660 (binary,posix=0,user,noumount,auto) X: on /cygdrive/x type vboxsharedfolderfs (binary,posix=0,user,noumount,auto) [/code]

[quote]Подозреваю, что исток проблем один и тот же, так как и при попытке трактовки русских имён, и при попытке запуска tar-ом самого себя из каталога, содержащего в имени русские символы, ошибка одна и таже - The system cannot find the file specified.[/quote]

Что говорит echo $LANG

[code] Vladimir@ics-e1417faa331 ~ $ mkdir Тест

Vladimir@ics-e1417faa331 ~ $ cd Тест

Vladimir@ics-e1417faa331 ~/Тест $ tar tar: You must specify one of the `-Acdtrux' options Try `tar --help' or `tar --usage' for more information. [/code]

Посмотрите http://cygwin.com/cygwin-ug-net/setup-locale.html

sjinks ★★★ ()
Ответ на: комментарий от sjinks

1. C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto) - выдержка из вывода mount

$ ~ >filname

смотрим свойства созданного файла «filename», закладка «безопасность» - наследование снято, назначены права для everyone, владельца и None

2. echo $LANG C.UTF-8 (пробовал ru_RU.UTF-8 - результат тот же) $ ~ mkdir тест

$ ~ cd тест

./tar --help - всё ОК ./tar -cf tar.tar filename.dat -P -L 4096 -M -F ./newvolumefilename.sh - ...CreateProcessW fail (errno 2(файл не найден)), то есть создаётся только первый том архива

beavis_inc ()
Ответ на: комментарий от beavis_inc

нашёл решение для п.2

$ ~ export LANG=ru_RU.CP1251

$ ~ ./tar -cf arch.tar -T ./list.txt -P -L 4096 -M -F ./newvolumefilename.sh

отрабатывает нормально - создаётся многотомный архив

к сожалению, этот подход не работает в классической windows-консоли, там нужно выставлять charset=utf8, как быть? как вариант можно всё-таки использовать cygwin-shell, который при запуске будет выполнять некий сценарий вида:

export LANG=ru_RU.CP1251

~./tar.exe -cf......

exit

возможно такое?

ну и остаётся открытым вопрос про п.1

beavis_inc ()
Ответ на: комментарий от beavis_inc

По поводу п.1:

сегодня попробовал запаковать, а затем восстановить набор каталогов и файлов, удалив их после архивации, с NTFS раздела подключенного по-умолчанию, то есть в /etc/fstab отдельной записи о нём нет. Так вот, все ACL на распакованных объектах оказались в порядке (получены путём наследования). Наверно я чего-то недопонимаю в логике работы cygwin с NTFS-правами...

п.2:

принято решение использовать урезанную (вручную) установку cygwin, а tar запускать с помощью сценария bash, имя файла которого будет передаваться как аргумент коммандной строки. StartTar.bat:

@echo off

c:

cd c:\cygwin\bin

bash --login starttar.sh

starttar.sh располагается в домашней директории пользователя (c:\cygwin\home\username) и имеет примерно следующее содержание:

#!/bin/bash

export CYGWIN=nodosfilewarning

export LANG=ru_RU.UTF-8

tar -cf ta.tar -P -T ./listoffiles.txt -L 4096 -M -F ./newvolumename.sh

#Важно! Если listoffiles.txt содержит русские имена каталогов/файлов, то они должны быть представлены в формате UTF-8

logout

beavis_inc ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.