Debian squeeze alatt, demóztam zfs-t egy régi kollégámnak, és az alábbi meglepetéssel találkoztam:
fs# zfs send mypool/home@20130301 > x1
fs# zfs send mypool/home@20130301 |cat >x2
fs# ls -l x*
-rw-r--r-- 1 root root 131072 Mar 1 10:27 x1
-rw-r--r-- 1 root root 1106112 Mar 1 10:27 x2
Az x2 fájl rendben van, abból meg is a visszaállítás, de mi van az x1-el???
Még csak nem is arról van szó, hogy valami lemaradt a végéről:
fs# dd if=x1 bs=10240 count=1 of=y1; dd if=x2 bs=10240 count=1 of=y2;
fs# diff y1 y2
Binary files y1 and y2 differ
Hogyan lehetséges ez?
20 év Unix/Linux alatt egyszer sem láttam, hogy a valami > file és a valami | cat > file különböző eredményt adott volna...
Először shell hibára gyanakodtam, de bash, ksh, tcsh és zsh alatt is pontosan ugyanez a jelenség.
Visznot, úgy gondolom, ha a program az stdout-ra dologzik, akkor nem is tudja megkülönböztetni, hogy az stdout hova van irányítva, ezért úgy gondolom, a zfs send sem lehet a hibás.
De akkor meg mi van?
- 1703 megtekintés
Hozzászólások
Nem lehet hogy a zfs send csinál valamit másképp? Persze nem tudom épeszű okát elképzelni, de ki tudja. Van valami mód arra, hogy a zfs snapshot épségét ellenőrizze az ember? Mármint azon túl, hogy felcsapja valahová és ott ellenőrzi a kapott adatot.
- A hozzászóláshoz be kell jelentkezni
esetleg a cat sortöréseket konvertál? Nem kéne neki :)
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
úgy gondolom, ha a program az stdout-ra dologzik, akkor nem is tudja megkülönböztetni, hogy az stdout hova van irányítva
De igen, az isatty fuggveny megmondja. Peldaul a gzip hasznalja is:
[muszi@muszi ~]$ echo | gzip
gzip: compressed data not written to a terminal. Use -f to force compression.
- A hozzászóláshoz be kell jelentkezni
Még az első nap első 2 órájában tanított ls is megcsinálja ugyanezt. Megvalósítástól függő ugyan, de van ahol az ls az "ls -1" és van ahol az ls az "ls -C" módon fut akkor, ha az stdout képernyőt jelent. (Direkt írtam ezt és nem az átiránzítás hiányát, ugyanis lehet pl. az ls-t átirányítaani, de szintén terminálra. Szóval simán lehet *legalább* ennyit észlelni (és szükség esetén ennél jóval többet is).
Amúgy a shell-be beépített test parancsnak is van rá eszköze, [ -t filedescriptor ] formában.
- A hozzászóláshoz be kell jelentkezni
Persze, a gzip csak egy pelda volt.
- A hozzászóláshoz be kell jelentkezni
Itt egyik esetben sincs terminál, kicsit merengve az eredeti problémán, még az jutott az eszembe, hogy a bash a pipe-hoz subshell-t indít. A többi shellt nem ismerem, nem tudom megmondani, hogy az így csinálják-e.
- A hozzászóláshoz be kell jelentkezni