'cp -al' funktioniert nicht wie erwartet

Status
Für weitere Antworten geschlossen.

hank2000

Benutzer
Mitglied seit
24. Mrz 2009
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
Hallo,

auf meiner neuen DS-107+ muss ich unterschiedliches Verhalten von 'cp -al' im Vergleich zu meinem Desktop-Linux feststellen.

Das ist im Rahmen des Test aufgefallen in dem die DS 107+ als Backup für diverse Linux-Rechner konfiguriert und vorbereitet werden soll.

Als Backup -Software ist rsnapshot vorgesehen. Hier im Forum ist einiges positive darüber zu lesen und daher als Lösung ausgewählt worden.

Konkret handelt es sich hierbei um das Verhalten von cp bei bestimmten Permissions für Verzeichnisse

Ein kleines Skript legt ein paar Verzeichnisse mit Inhalt an:
Rich (BBCode):
#!/bin/sh
DIR=foo
rm -fr ${DIR}
mkdir ${DIR}
cd ${DIR}

mkdir _________
mkdir __x______
mkdir r________
mkdir r_x______
mkdir rwx______

chmod 000 _________
chmod 100 __x______
chmod 400 r________
chmod 500 r_x______
chmod 700 rwx______

cd ..

find ${DIR} -name "*_*" -type d -exec cp ${0} {}/bar \;

# -- file

Mit
Rich (BBCode):
ls -l foo/*
kann man sehen, was angelegt wurde.

Und nun versucht man z.B. mit
Rich (BBCode):
cp -al foo foofoo
eine Kopie anzulegen.

Unter Gentoo sieht das z.B. so aus:
Rich (BBCode):
# cp -alv foo foofoo
`foo' -> `foofoo'
`foo/_________' -> `foofoo/_________'
`foo/_________/bar' -> `foofoo/_________/bar'
`foo/__x______' -> `foofoo/__x______'
`foo/__x______/bar' -> `foofoo/__x______/bar'
`foo/r________' -> `foofoo/r________'
`foo/r________/bar' -> `foofoo/r________/bar'
`foo/r_x______' -> `foofoo/r_x______'
`foo/r_x______/bar' -> `foofoo/r_x______/bar'
`foo/rwx______' -> `foofoo/rwx______'
`foo/rwx______/bar' -> `foofoo/rwx______/bar'

# echo $?
0

Auf der DS107+ sieht das aber leider so aus (ausgeführt im Verzeichnis /volume1):
Rich (BBCode):
# cp -alv foo foofoo
`foo' -> `foofoo'
`foo/rwx______' -> `foofoo/rwx______'
`foo/rwx______/bar' -> `foofoo/rwx______/bar'
cp: setting permissions for `foofoo/r_x______': Function not implemented
cp: setting permissions for `foofoo/__x______': Function not implemented
cp: setting permissions for `foofoo/r________': Function not implemented
cp: setting permissions for `foofoo/_________': Function not implemented
# echo $?
1

Hier kommen nun das Problem zu Tage:
cp -al verhält sich unerwartet bei bestimmten Verzeichnis-Rechten, bricht ab und liefert 1 als Returnwert.
Dies wiederum führt dazu, dass rsnapshot seinen Backupzyklus ebenfalls abbricht. Das Backup beginnt nun unvollständig zu werden.
Dies tritt vor allem dann auf, wenn der zu sichernde Rechner nicht erreichbar ist, dann tritt bei rsnapshot ein RollbackPlan in Kraft, in dem dann cp -al für die unerreichbaren Hosts ausgeführt wird, aber beim ersten steigt rsnapshot aus, alle anderen unerreichbaren werden nun gar nicht mehr kopiert.

Verwendet wird natürlich gnu-cp:
cp (GNU coreutils) 6.10 auf gentoo
cp (GNU coreutils) 6.12 auf der DS107+

Hier nun die Fragen:
wie bekomme ich cp dazu dass es mir diese Verzeichnisse komplett kopiert, bzw. als link-copy anlegt?
welche Informationen fehlen noch, um das Problem besser eingrenzen zu können?
Was mache ich falsch?

Danke

Grüße

Heinrich
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Jajaja, es läuft zwar ein Linux auf der DS, aber die Kommandos sind von der BusyBox (ein spezielle Linux-Version). Ich hoffe, es hat sich schon herumgesprochen, dass Linux nicht gleich Linux ist und wenn ich ein schönes Programm schreib (z. B. den cp1), dass dieses dann auch sofort zu meinem Linux gehört, genauso wenn ich in der /bin Programmdateien lösche, dann hat mein Linux halt was weniger. Und das es zig-Versionen eines Programms geben kann ... mit mehr oder weniger vielen unterschiedlichen Optionen.

1] Wenn du wissen willst, welche Kommandos für die DS gelten, dann schau unter /bin nach. Wenn du auch wissen willst, welche Optionen die "möglicherweise" kennen, dann schau ins Manual der BusyBox.

2] Wenn du Kommandos haben willst, die ein wenig mehr können, dann musst die zusätzlich mit IPKG installieren ... so hat das wohl jeder hier gemacht.

Itari
 

hank2000

Benutzer
Mitglied seit
24. Mrz 2009
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
1] Wenn du wissen willst, welche Kommandos für die DS gelten, dann schau unter /bin nach. Wenn du auch wissen willst, welche Optionen die "möglicherweise" kennen, dann schau ins Manual der BusyBox.

2] Wenn du Kommandos haben willst, die ein wenig mehr können, dann musst die zusätzlich mit IPKG installieren ... so hat das wohl jeder hier gemacht.
Itari

Hmm, ich dachte cp von gnu-coreutils kommt eh nur per ipkg ins System drum hab ich nicht explizit erwähnt das es so gemacht wurde:
# ipkg list_installed
bash - 3.2.33-1 - A bourne style shell
coreutils - 6.12-2 -
gdbm - 1.8.3-2 - GNU dbm is a set of database routines that use extensible hashing. It works similar to the standard UNIX dbm routines.
libdb - 4.2.52-3 - Berkeley DB Libraries
ncurses - 5.7-1 - NCurses libraries
openssh - 5.2p1-1 - a FREE version of the SSH protocol suite of network connectivity tools.
openssl - 0.9.7m-5 - Openssl provides the ssl implementation in libraries libcrypto and libssl, and is needed by many other applications and librari
perl - 5.8.8-20 - Practical Extraction and Report Language.
readline - 5.2-2 - The GNU Readline library provides a set of functions for use by applications that allow users to edit command lines as they are
rsnapshot - 1.3.1-1 - A filesystem snapshot utility based on rsync.
rsync - 3.0.5-1 - fast remote file copy program (like rcp)
screen - 4.0.3-2 - A screen manager that supports multiple logins on single terminal
strace - 4.5.16-1 - Traces all system calls a program makes.
termcap - 1.3.1-2 - Terminal emulation library
wget - 1.11.4-1 - A network utility to retrieve files from the Web
zlib - 1.2.3-3 - zlib is a library implementing the 'deflate' compression system.
Successfully terminated.

# ll /opt/bin/cp
lrwxrwxrwx 1 root root 12 Mar 24 15:43 /opt/bin/cp -> coreutils-cp

Leider hält sich /bin/cp nicht an die Beschreibung unter:http://www.busybox.net/downloads/BusyBox.html
/bin/cp kennt gar keinen Parameter -l:

Rich (BBCode):
/bin/cp -al foo/ foofoo
/bin/cp: invalid option -- l
BusyBox v1.1.0 (2009.03.06-16:49+0000) multi-call binary

Usage: cp [OPTION]... SOURCE DEST

Was liegt mein Denkfehler?

Wie oben geschrieben, cp 6.10 und cp 6.12 aus Coreutils verhalten sich auf den unterschiedlichen System nicht vergleichbar. So groß kann der Unterschied bei einem Minor-update eigentlich nicht sein, oder?

Liegt's am Release, liegt's am Filesystem, liegt's an der Implementierung für die verschiedenen Architekturen? Liegt's an sonst noch was?
Hat niemand sonst ähnliches Verhalten festgestellt?

Ich werde wohl nicht der einzige sein, der rsnapshot auf einer DS verwendet.

Es gibt sogar einen schönen Wikieintrag im Synology-Wiki.


Danke.

Heinrich
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Asche auf mein Haupt. Ich hatte deinen ersten Post nicht komplett gelesen gehabt und dachte, dass du es mit dem eingebauten cp versucht hast. Aber dem war und ist ja nun nicht so, so dass ich mir meine Ratschläge irgendwohin stecken kann ... sorry.

Leider kann ich dir bei deinem eigentlichen Problem nicht weiter helfen, weil ich den rshapshot weder richtig kenne noch einsetze. Vielleicht wäre aber ein Post im internationalen Forum geeignet, weil es da wohl mehr Leute gibt, die solche Probleme wahrnehmen.

Itari
 

QTip

Super-Moderator
Teammitglied
Mitglied seit
04. Sep 2008
Beiträge
2.341
Punkte für Reaktionen
13
Punkte
84
Ich hab ebenfalls coreutils - 6.12-2 schon eine Weile installiert und bei mir funktioniert das mit der Kopie und dem Paramatern -alv.
Sieht so aus, dass du zwar den Ersatz für cp per IPKG installiert hast, allerdings benutzt dein System es nicht als Standard. (normalerweise wird das nach der Installation unter /opt/lib/ipkg/alternatives eingetragen) Dann existiert ein Symlink in /opt/bin mit dem Ziel /opt/bin/coreutils-cp
Woher das System nun weiss, welches cp benutzt werden soll, weiss ich leider nicht. Ich kann nur raten, dass die gleichnamigen Dateien in /opt/bin Vorrang haben.
/bin/cp kennt gar keinen Parameter -l:

Code:
/bin/cp -al foo/ foofoo
 /bin/cp: invalid option -- l
 BusyBox v1.1.0 (2009.03.06-16:49+0000) multi-call binary
 
 Usage: cp [OPTION]... SOURCE DEST
Was liegt mein Denkfehler?
Bei Eingabe von cp --help sollte mehr als nur 1 Zeile Info kommen. Du benutzt immer noch das eingebaute cp beim Aufruf mit cp --help. man cp sollte ebenfalls funktionieren, sofern der Befehl 'man' defaultmäßig vorhanden ist (weiss ich leider nicht mehr), ansonsten kannst es ja nachinstallieren.
Versuche mal den absoluten Pfad zum cp mit anzugeben, dann weisst du wenigstens, ob das installierte cp wenigstens grundsätzlich funktioniert.
 
Zuletzt bearbeitet:

MrDS

Benutzer
Mitglied seit
07. Feb 2009
Beiträge
41
Punkte für Reaktionen
0
Punkte
0
Hallo

mit dem Kommande

Rich (BBCode):
which cp

kann man abfragen, welche Datei (Programm, Script etc.) verwendet wird, wenn dieses ohne Pfadangabe gestartet wird.

im $HOME des Users gibt es eine Datei .profile, die beinhaltet die PATH-Variable. Diese steuert, wo nach Dateien, Scripts etc. gesucht werden soll, wenn nicht explizit ein Pfad angegeben wird

Evtl. ist der Pfad der Coreutils nicht eingetragen?

Gruss MrDS
 

hank2000

Benutzer
Mitglied seit
24. Mrz 2009
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
Guten Morgen mit'nander,

ein paar Antworten an die letzten Posts.

@itari: Danke für die Korrektur, ich dachte schon ich schreib spanisch ;-)

@QTip: Das sieht gut aus bei Dir, könntest Du bitte bei Gelegenheit die Ausgabe des von mir geposteten Scripts liefern?
Wenn ja, welches System (HW/OS) verwendest du?
Den Suchpfad welches cp benutzt werden soll kann man durch die Variable $PATH einstellen, die Reihenfolge ist hier relevant. Je nach Shell ist das in .profile oder .bashrc usw... Mein Beispiel findest Du unten.

@MrDS: Danke für Deinen Hinweis, aber das /bin/cp bringt eben nicht mal den Parameter -l, nur das cp unter /opt/bin, welches selbstverständlich ein Link auf /opt/bin/coreutils-cp ist.

Kernaussage:
Also ich bin mir sehr sicher das ich das coreutils-cp Release 6.12 verwende. Und das es es leider nicht so funktioniert wie auf allen anderen Linux-Kisten die ich so betreibe.
Und was mich eben stark irritiert ist: ich habe ein GNU/Linux, ich habe ein ext3 FS, welches mittlerweile auch wie die Originalen funktioniert (z.B. Groß/Kleinschreibung) und ich habe ein GNU-Coreutils cp 6.12, und trotzdem habe ich unterschiedliche Verhaltensweisen bei bestimmten Rechten der Verzeichnisse (siehe oben).

Und nun noch ein paar Ausgaben:
Rich (BBCode):
# uname -a
Linux ds107 2.6.15 #832 Sat Mar 7 00:44:45 CST 2009 armv5tejl GNU/Linux

# echo $PATH
/opt/bin:/opt/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/syno/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/bin:/usr/syno/sbin:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/bin:/usr/syno/sbin:/usr/local/bin:/usr/local/sbin

# which cp
/opt/bin/cp

# ll `which cp`
lrwxrwxrwx 1 root root 12 Mar 24 15:43 /opt/bin/cp -> coreutils-cp

# /bin/cp --help
BusyBox v1.1.0 (2009.03.06-16:49+0000) multi-call binary

Usage: cp [OPTION]... SOURCE DEST

# /opt/bin/cp --help
Usage: /opt/bin/cp [OPTION]... [-T] SOURCE DEST
  or:  /opt/bin/cp [OPTION]... SOURCE... DIRECTORY
  or:  /opt/bin/cp [OPTION]... -t DIRECTORY SOURCE...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Mandatory arguments to long options are mandatory for short options too.
  -a, --archive                same as -dpR
      --backup[=CONTROL]       make a backup of each existing destination file
  -b                           like --backup but does not accept an argument
      --copy-contents          copy contents of special files when recursive
  -d                           same as --no-dereference --preserve=links
  -f, --force                  if an existing destination file cannot be
                                 opened, remove it and try again
  -i, --interactive            prompt before overwrite
  -H                           follow command-line symbolic links in SOURCE
  -l, --link                   link files instead of copying
  -L, --dereference            always follow symbolic links in SOURCE
  -P, --no-dereference         never follow symbolic links in SOURCE
  -p                           same as --preserve=mode,ownership,timestamps
      --preserve[=ATTR_LIST]   preserve the specified attributes (default:
                                 mode,ownership,timestamps), if possible
                                 additional attributes: context, links, all
      --no-preserve=ATTR_LIST  don't preserve the specified attributes
      --parents                use full source file name under DIRECTORY
  -R, -r, --recursive          copy directories recursively
      --remove-destination     remove each existing destination file before
                                 attempting to open it (contrast with --force)
      --sparse=WHEN            control creation of sparse files
      --strip-trailing-slashes  remove any trailing slashes from each SOURCE
                                 argument
  -s, --symbolic-link          make symbolic links instead of copying
  -S, --suffix=SUFFIX          override the usual backup suffix
  -t, --target-directory=DIRECTORY  copy all SOURCE arguments into DIRECTORY
  -T, --no-target-directory    treat DEST as a normal file
  -u, --update                 copy only when the SOURCE file is newer
                                 than the destination file or when the
                                 destination file is missing
  -v, --verbose                explain what is being done
  -x, --one-file-system        stay on this file system
      --help     display this help and exit
      --version  output version information and exit

By default, sparse SOURCE files are detected by a crude heuristic and the
corresponding DEST file is made sparse as well.  That is the behavior
selected by --sparse=auto.  Specify --sparse=always to create a sparse DEST
file whenever the SOURCE file contains a long enough sequence of zero bytes.
Use --sparse=never to inhibit creation of sparse files.

The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable.  Here are the values:

  none, off       never make backups (even if --backup is given)
  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

As a special case, cp makes a backup of SOURCE when the force and backup
options are given and SOURCE and DEST are the same name for an existing,
regular file.

Report bugs to <bug-coreutils@gnu.org>.


Danke für die Hilfen, ich werde wohl mal im internationalen Forum posten.

Grüße

Heinrich
 

QTip

Super-Moderator
Teammitglied
Mitglied seit
04. Sep 2008
Beiträge
2.341
Punkte für Reaktionen
13
Punkte
84
mein System (steht auch in meiner Signatur)
DS 209+ DSM 2.1.839
Code:
uname -a
Linux DiskStation 2.6.24 #839 Wed Mar 25 18:32:21 CST 2009 ppc GNU/Linux

/bin/cp --help
BusyBox v1.1.0 (2009.03.25-10:37+0000) multi-call binary

Usage: cp [OPTION]... SOURCE DEST

echo $PATH
/opt/bin:/opt/sbin:/opt/bin:/opt/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/syno/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/bin:/usr/syno/sbin:/usr/local/bin:/usr/local/sbin:.

which cp
/opt/bin/cp

ll `which cp`
lrwxrwxrwx 1 root root 12 Jan 17 17:41 /opt/bin/cp -> coreutils-cp
Meine Ausgabe des Scriptes:
Code:
# cp -al foo foofoo
cp: setting permissions for `foofoo/r_x______': Function not implemented
cp: setting permissions for `foofoo/_________': Function not implemented
cp: setting permissions for `foofoo/r________': Function not implemented
cp: setting permissions for `foofoo/__x______': Function not implemented
Scheint leider bei mir auch nicht zu funktionieren, musst dir wohl einen Workaround einfallen lassen, wenn du rsnapshot auf der DS verwenden möchtest.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat