[BACK]Return to xfs_lab_04_ext_attr.doc CVS log [TXT][DIR] Up to [Development] / xfs-website / training / docs

File: [Development] / xfs-website / training / docs / xfs_lab_04_ext_attr.doc (download)

Revision 1.2, Wed Jan 17 07:01:30 2007 UTC (10 years, 9 months ago) by chatz
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +49 -46 lines

Initial XFS training course that was presented in Nov 06.

ࡱ>	`	)bjbjss	EZ3;;;;:::8r4;(ԢԢԢ*8D$hj9;ò^òòԢԢ˺˺˺ò*Ԣ";RԢ˺ò˺˺Y/:t;"aԢi:0()8_0a"8;LZ@˺4LLL[pLLL(òòòò;$;$;$M$;;;;;;
XFS
Practical Exercises


04  Extended Attributes




Overview
Extended Attributes (EA's) are used for attaching structured meta information to a file or inode and below we will give an example using an ACL. In the lab we will look at how we store an ACL in an EA and how this EA can be stored in various forms on the disk in XFS. Finally, we will look at how the EA's compete for inode space with the data extents and how variable this can be when attr2 is turned on for an XFS filesystem.
Goals
%	To understand what EA's are in XFS
%	The interfaces to manipulate EA's
%	Summary of the ondisk formats
%	The competition for inode space between data extents and EA extents
%	Becoming more familiar with xfs_db(8) for looking at inodes
Prerequisites
Some knowledge of what Extended Attributes (EA's) and Access Control Lists (ACL's) are would be beneficial.
Setup
Need a scratch filesystem to play with as root
In the examples we will refer to this device and mount point through these environment variables, for example:
export SCRATCH_MNT=/mnt/scratch
export SCRATCH_DEV=/dev/sda8
acl and attr packages installed
xfsprogs package installed
xfstests/src/makeextents binary; the directory path for this is called $BINDIR
export BINDIR=/home/fred/src/xfs-cmds/xfstests/src
For the attr2 exercises:
a kernel which supports XFS attr2 format
a mkfs.xfs which supports XFS attr2 format
Exercises
Exercise 1  ACLs and EA Interface
We create an access ACL on a file, and look at how its value is stored in an EA and what the EA for it looks like on the disk. A posix access ACL on a file is a set of access permissions on a file, like the standard unix permissions, but gives a finer grain of control on who gets these permissions. As the point of this lab is about XFS EAs and not about ACLs, we will just create a simple ACL with user, group, other permissions and the  mask entry.
The setfacl(1) and getfacl(1) commands are standard commands which were implemented by Andreas Gruenbacher and the chacl(1) command came originally from IRIX.
Setup
create filesystem and ACL's
# cd /
# mkdir $SCRATCH_MNT
# mkfs.xfs -f $SCRATCH_DEV
# mount $SCRATCH_DEV $SCRATCH_MNT

# cd $SCRATCH_MNT
# echo data1 > file1
# echo data2 > file2
# setfacl -m u::rw,g::rw-,o::r--,m::rwx file1
# chacl u::r--,g::---,o::---,m::rwx file2

# getfacl file2
# chacl -l file1
Exercise
List the extended attributes on the file:
# getfattr -d file1
This won't show much as we didn't specify the user namespace. This will show two extended attributes:
# getfattr -e hex -dm '.*' file1
One for the "system" namespace and one for the "trusted" namespace.
However, when we run the "attr" command, it only shows 1 EA which is what we'd expect since we only created one ACL on the file. 
# attr -Rl file1
# attr -Rqg SGI_ACL_FILE file1 >ea_value
# od -x ea_value

The reason why getfattr shows 2 EAs is because the system.posix_acl_access is an EA XFS provides as an interface into the system and ACL routines, however, the trusted.SGI_ACL_FILE EA is the only one actually stored on the disk and is the same as would be stored on an IRIX XFS filesystem. The internal namespace for this XFS EA is actually "root" which is stored as a bit in the flags field (it doesn't actually store the namespace as a string in XFS).
In our case, we have 4 entries: u::rwx g::rw- o::r-- m::rwx
An XFS ACL is of the form: 
<acl_count: int32>  <entry> <entry> <entry> ...
where:
<entry> = <tag: int32> <id: int32> <perm: uint16>
and
<tag> = USER_OBJ, GROUP_OBJ, OTHER
<id> = user id or group id if given one
<perm> = normal unix permissions like rwx
You can now try to match up a few of the fields of the SGI_ACL_FILE EA contents with the format of an ACL given above; you can see, for example, that there are 4 entries for the acl_count which are at the start of the EA value.
Identify the permissions from the od (octal) dump
Exercise 2 - ondisk form of the EA (ACL)
We will now see how this ACL and other EAs look in terms of the on disk structure using xfs_db.
Obtain the inode number for the file
# ls -i file1
# umount $SCRATCH_MNT
Use xfs_db to look at what is on the disk to see:
Data format is extents (core.format = 2)
Offset between data and EA fork = 15 * 8 = 120 bytes
EA format is extents (core.aformat = 2)
# xfs_db -r $SCRATCH_DEV
xfs_db> inode inode_number
xfs_db> print
...
core.format = 2 (extents)
core.forkoff = 15
core.aformat = 2 (extents)
u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,13,1,0]
a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,12,1,0]
xfs_db> ablock 0
xfs_db> p
....stuff omitted...
nvlist[0].valuelen = 52
nvlist[0].namelen = 12
nvlist[0].name = "SGI_ACL_FILE"
nvlist[0].value = "\000\000\000\004\000\000\000\001\377\377\377\377\000\006\000\000\000\000\000\004\377\377\377\377\000\006\000\000\000\000\000\020\377\377\377\377\000\a\000\000\000\000\000 \377\377\377\377\000\004\000\000"
Alternatively specifying the filesystem block directly using the FSB listed in the a.bmx list::
xfs_db> fsb 12
xfs_db> type attr
xfs_db> p
Look at the file data while we are here:
xfs_db> dblock 0
xfs_db> p
000: 64617461 310a0000 00000000 00000000 00000000 00000000 00000000 00000000
...etc...
xfs_db> type text
xfs_db> p
000:  64 61 74 61 31 0a 00 00 00 00 00 00 00 00 00 00  data1...........
010:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

i.e. the file1 data is "data1" just like we echo'ed in at the beginning.

So in this example with 1 data extent for its contents, the ACL EA was also in extent format. However, EAs can often fit inside the inode in what is called "shortform" format. However, in this case, the EA space starts from the fork offset in the inode:
core.forkoff = 15 
which is 15 * 8 = 120 bytes into the llteral space of the inode (which is the area after the core part of the inode). With the 51 bytes value and 12 byte name and the rest of the EA header, there was not enough room for the EA to be inside the inode.
Exercise 3  attr2 filesystem
With the attr2 format used in the mkfs.xfs parameters, the forkoff is not set at a fixed place anymore, as was in traditional XFS. Instead, the fork offset is moved according to the requirements of the EAs and until it bumps into the data extents, always leaving enough room for a btree root data extent block. 
Another alternative to increasing the chance of fitting the EA within the inode, is to increase the size of the inode at mkfs time (using "-i size=xxx").
Please refer to the attr2 diagram in the XFS Filesystem Structure document on Extended Attributes.
Setup
Recreate the filesystem with attr2 enabled
# cd /
# unmount $SCRATCH_MNT
# mkfs.xfs -fi attr=2 $SCRATCH_DEV
# mount $SCRATCH_DEV $SCRATCH_MNT

Create a file and give it an ACL
# cd $SCRATCH_MNT
# echo data1 > file1
# setfacl -m u::rw,g::rw-,o::r--,m::rwx file1
Exercise
Re-examine the inode and observe how the fork offset and aformat have changed comparedto the earlier exercises.
Exercise 4  ondisk EAs in different formats
As we know, if the EA is small enough it can fit within the inode. If we have an EA with a big name or a big value, or lots of EA's then it will move out of the inode. As soon as we are using EA's, there is then less room in the inode for the data extents. This exercise explores the different data structures used ondisk for different sized extended attributes.
Setup
Recreate the filesystem
# cd /
# umount $SCRATCH_MNT
# mkfs.xfs -f $SCRATCH_DEV
# mount $SCRATCH_DEV $SCRATCH_MNT
Exercise
Add an attribute to a file
# cd $SCRATCH_MNT
# echo data1>file1
# setfattr -n user.name1 -v value1 file1
# getfattr -d file1
Examine the inodes format to see it is in short-form with a fork offset of 120 bytes:
# ls i file1
# cd /
# umount $SCRATCH_MNT
# xfs_db -r -c "inode inode_number" -c "p a" -c "p core.forkoff" -c "p core.aformat" $SCRATCH_DEV
A another EA, name2, but this time with a big value of 60K.
# cd $SCRATCH_MNT
# man bash | strings | dd bs=1024 count=60 of=file2
# ls -s file2
61440 file2
# attr -s name2 file1 < file2 >/ dev/null
Dump the inode and explore its structure
# ls i file1
# cd /
# umount $SCRATCH_MNT
# xfs_ncheck $SCRATCH_DEV
# xfs_db -r $SCRATCH_DEV
xfs_db> inode inode_number
xfs_db> p
The EA is quite large and will not fit within the inode, instead it is in its own set of blocks
a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,28,16,0]
The first block at 28 contains the main EA information and the remaining 15 blocks (15 * 4K = 60K) starting from block 29 contain the value for name2, in this case the bash(1) man page..
xfs_db> fsb 28
xfs_db> type attr
xfs_db> p
xfs_db> fsb 29
xfs_db> type text
xfs_db> p
Now add 1000 attributes to the file:
# for i in {1..1000}
> do
> attr -s name.$i -V value.$i file1
> done
# cd /
# umount /mnt/scratch
# xfs_db -r $SCRATCH_DEV
This time we now have the EA in btree form with the root within the inode and the actual EA data in the leaf blocks of the btree, similar to:
btree[0-11] = [hashval,before] 0:[0x55101e5a,16] 1:[0x55105dd8,24] 2:[0x55109c5b,25] 3:[0x55109fde,23] 4:[0x5510dfde,21] 5:[0x55111ed7,22] 6:[0x55115ed7,19] 7:[0x5511dd5a,20] 8:[0x55139d5a,18] 9:[0x5513dd5a,26] 10:[0xdcaa20bd,27] 11:[0xec3b72b4,17]
Examine one of the leafblocks (in this example block16):
xfs_db> ablock 16
xfs_db> p
Exercise 5 - attr2 and inode literal space competition
With attr2, there is more competition allowed for the literal space of the inode. To show this we will create a file with 1 EA and see how many data extents we can fit within an inode. Then we will try this all again with 24 Eas and now see how many data extents we can fit inline. At each stage, you can look at what the new forkoffset is set to.
Setup
Create a filesystem with 512 byte inodes and attr2
# mkfs.xfs -f -i attr=2,size=512 $SCRATCH_DEV
# mount $SCRATCH_DEV $SCRATCH_MNT
Exercise
Create and examine a file with a single attribute
# cd $SCRATCH_MNT
# touch file
# setfattr -n user.name.1 -v value file
# xfs_bmap file
# ls i file
# cd /
# umount $SCRATCH_MNT
# xfs_ncheck $SCRATCH_DEV
# xfs_db -r $SCRATCH_DEV -c 'inode inode_number' -c 'p'
We can see from this output that we have 1 EA and a fork offset of 47 which is equivalent to 376 bytes worth of space left over for data extents.
Let's now see how many extents we can fill up before they go out of line.
# mount $SCRATCH_DEV $SCRATCH_MNT
# cd $SCRATCH_MNT
# $BINDIR/makeextents -p -n 23 file
The -p option is to preserve the file and its extents  it won't create 23 more extents, rather it should create enough extents to have 23 extents in total.
# xfs_bmap file
# cd /
# umount $SCRATCH_MNT
# xfs_db -r $SCRATCH_DEV -c 'inode inode_number' -c 'p'
From this we can see that we can fit 23 extents inline. 
Now you should try it with 24 extents. Still inline?
Clear all the data extents in the file by truncating it to zero.
# mount $SCRATCH_DEV $SCRATCH_MNT
# cd $SCRATCH_MNT
# >file
# xfs_bmap file
Now add 23 more EA's so that we have 24 EA's in total.
# for i in {2..24}
> do
> setfattr -n user.name.$i -v value file
> done
# getfattr -d file
Now unmount and look at the fork offset in xfs_db. It should be at about 7 which is equivalent to 56 bytes into the literal space. So in adding 23 EA's we have gone from 376 bytes down to 56 bytes.
How many extents we can fit in there before going out of line for the data extents? Try first creating 3 extents and then 4.
# mount $SCRATCH_DEV $SCRATCH_MNT
# cd $SCRATCH_MNT
# $BINDIR/makeextents -p -n 3 file
# xfs_bmap file
# cd /
# umount $SCRATCH_MNT
# xfs_db -r $SCRATCH_DEV -c 'inode inode_number' -c 'p'
In the answers section below is a table which lists the various fork offsets for EA's created in the same way we did above. It also shows how many data extents we can fit inline with that fork offset  although only 2 rows for this column have been filled in.
Questions
If I have a file with EA's in it which they are all in shortform format (i.e. they are all inside the inode), and I decide to replace one of those EA's by specifying the same name in a setfattr command but this time using a large value (e.g. 60K), what will happen to the format of the EA? 
Will it just mark the value for this EA as remote and put a pointer to a set of blocks for this value and leave all rest of the EA's in shortform? Or as well as marking it remote and storing the value remotely, will it change the EA format to the extent form?
Construct a table showing how many inline extents are possible as the number of extended attributes grow.
Answers
It will change to the extent form with 1 filesystem block for the EA names and values, and will mark the large value EA (60K) as remote and store its value in remote blocks. We did this in the lab :)
This table shows for various number of EA's named name.xx and value value on a 512 byte inode,what the fork offset will be and the maximum number of inline extents one can have (only a couple of these entries have been filled in).
Number of EA'sFork OffsetFork Offset bytesMax # of inline extents1473762324737644435283729616221762014112211296221080239722475632524 (extent format)192








XFS Lab 05  Extended Attributes		sgi

	 PAGE 7	

Copyright  2006, Silicon Graphics, Inc.
1200 Crittenden Lane
Mountain View, CA 94043






























































































































































































































































 358A			
fgmqr{|~=gûóó˯tjtjtfhPhu?mHnHsHhu?hu?mHnHsHhZ\hu?h"vh
huhOhhhohuhuhuhOhhQ9h~OJQJhF~OJQJhfOJQJh]hhQ9OJQJh]hCJOJQJaJhOCJOJQJaJh]hHCJOJQJaJ(45678A		J


^gm
4gdugdpKgdOgdugdO$^a$gdhQ9,gdO,gd$-gd$g<=$(
+
H
h


Gr|c$+@[}~gdu?
&Fgdu?gdu?gdu?gd"vgd#G4
&Fgdu4gdugdu#4=g{H4dkgdP!gdP
&FgdPgdu?gdu?(H+,6TU'/0B*+`}bS Ϳڗ}hPhPmHnHsHhPhPmHnHsHhhOJQJ^Jh`_h`_mHnHsHh`_hP6mHnHsHh`_h`_6mHnHsHh`_hPmHnHsHhh`_hOh"vhu?hu?hPhu?hu?hP/,U0Y(C4gd`_
&Fgd`_gd`_
&FgdUxgdPgdO
&FgdP!gdP*J*FPblFGEXS q !C"gdUxgd'pgdR{gdP!gd`_
&Fgd`_gd`_S ] p q !C""":#\#j#m#n#z#{#|#}####*$4$W$X$X%%%%%;&D&_&&&''̸xpxf[hUxh,mH	sH	h$mHnHsH	h$mH	sH	hUxhUxmHnHsH	h,mH	sH	hVRmH	sH	hUxmH	sH	hSmH	sH	hUxhUxmH	sH	hUxmHsHhUxmHnHsHh'pmHnHsHh'ph'pmHnHsHhmHnHsHhUxh'pmHnHsHhUxhOh'phS#C""""""#:#;#\#n####*$X$%%%%%&;&D&gd$
&FgdUxgdUxgdVRgdUxgd'p
&FgdUxgdUxgd'pD&_&q&&&&'&'-'C'''''(5(A(k(((((((
))w))!gd$
&Fgd$gd$gd,
&Fgd,'''&'Y'e'''''(.(X(Y(a(b(j(k(((()))v)w)))w****m+++,,,---I-T-V-߷߷߷ߪߗߢ߇zp߇hhG:mH	sH	h5HmHnHsH	hUxh5HmHnHsH	h5HmH	sH	hUxmH	sH	h$6mHnHsH	h$mH	sH	hUxh$mHnHsH	h$mHnHsH	hUxhUxmH	sH	h,mH	sH	h,6mHnHsH	hUxhUxmHnHsH	hmHnHsH	h,mHnHsH	()w********++0+7+>+T+m++,--?-I--../
&FgdG:gdG:gdG:gd5H!gd5Hgd5Hgd$
&Fgd5HV---./g///0A0`0l00122333333 4!45535S5V5|56$606<7=7G7m9n9999::;;f<g<h<j<k<m<n<p<q<s<t<{<|<<ϺhRqh~-hfjhPUmHnHuh:jh:UhOhL0hL0hL0h]hL0hL0h]hv-hOhG:hG:	h6h	hK6hKhm&fhG::/E/g/p//////0
0#0=0u01Q1s111H2X2_2u222!gdgd
&Fgd!gdK
&FgdKgdKgdK23\3~3333333 4'4:45}555555696=7G7j8n9!gdv-
&Fgdv-gdO!gdgd
&Fgdn999:;;;;;;;d[	7$IfgdL0rkd$$IfT\b!b$	b$	47a7T	($IfgdL0
&F	
*$^gd_+gdO!
&FgdL0
;;;;;;;;;rkd$$IfT\b!b$	b$	47a7T	7$IfgdL0;;;;;;	7$IfgdL0rkdz$$IfT\b!b$	b$	47a7T;;;<<<	7$IfgdL0rkd0$$IfT\b!b$	b$	47a7T<<
<
<<<	7$IfgdL0rkd$$IfT\b!b$	b$	47a7T<<<<<<	7$IfgdL0rkd$$IfT\b!b$	b$	47a7T<<"<%<(<)<	7$IfgdL0rkdR$$IfT\b!b$	b$	47a7T)<*<-<0<3<4<	7$IfgdL0rkd$$IfT\b!b$	b$	47a7T4<5<8<:<=<><	7$IfgdL0rkd$$IfT\b!b$	b$	47a7T><?<B<D<G<I<	7$IfgdL0rkdt$$IfT\b!b$	b$	47a7TI<J<M<`<d<e<v
7$If^gdL0	7$IfgdL0rkd*$$IfT\b!b$	b$	47a7Te<f<g<i<j<l<m<o<p<r<s<<<~ywywywywiw
$
*Q'V^Vgdgd>3R
*$^gdL0rkd$$IfT\b!b$	b$	47a7T<<<<<<<<<<<<<<===>#$%&'()̻hOhL0h<hU?hPh2DUh:hh{YhOh0J'mHnHu
hP0J'jhP0J'UjhPUmHnHuhhPCJEHaJhhPCJ0aJ0hP<<<<<=======	=
===
=========77]7^7gdrX%$^a$gdO%
9r 'gd	@=========== =!="=#=$=%=&='=(=)=*=+=,=-=.=/=0=$
Ba$gd>mgd`0=1=2=3=4=5=6=7=8=9=:=;=<===>=?=@=A=B=C=D=E=F=G=H=I=J=K=L=	
BgdCNL=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z=[=\=]=^=_=`=a=b=c=d=e=f=g=h=i=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z={=|=}=~====================================$a$gd"hTgd"hT	
Bgd"hT=============================gd7FgdF===========================================================gdsr===========>	










































 !"#$%&'()
*$^gdL0$gdHpC	0
00&P	P/R :p#. A!r"r#$% 2$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	////47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T$$If!vh5b5$	5b5$	#vb#v$	#vb#v$	:V5b5$	5b5$	///47a7T8L@LdFNormal7x^7OJQJ_HmH	sH	tH	@`	Heading 1,$$&d@&P`&^'5B*	CJ(KH OJQJ\^JaJ phDj@jO	Heading 2$@&^&5B*	CJ OJQJ\]^JaJphDh@hlF	Heading 3$x@&^#5B*	CJOJQJ\^JaJphDP@P$	Heading 4$@&B*	CJ\aJphDDA@DDefault Paragraph FontVi@VTable Normal :V44
la(k@(No List6U@6+	Hyperlink>*B*phbOb"p6Code 
@@xx^m$ B*	CJOJQJmHnHph=lufOfng	Structure
B^#CJOJQJ^JaJmHnHsHur@#rrX
Table Grid7:V0
7^7TO2Ti7^Array contents$
B&<<a$sH	@OC@i7^Array TableCJOJQJ2OR2#p6Example
n^nTT
ETOC 1$
%5CJOJQJ\^JaJDD
q_TOC 2
%S(^S5\::
ukgTOC 3
%^22
sTOC 4^22
sTOC 5X^X22
sTOC 6 ^ 22
sTOC 7^22
sTOC 8^22
sTOC 9x^xHOH<[
Parameters$xm$5mHnHu:O:+YCDescription
 n^n>@>P
Normal Indent
!^VO!Vp6	Code Char,B*	CJOJQJ_HmHnHph=lsH	tH	u0O"10p6Example CharT@BTTHHeader$
B*^5B*CJ OJQJph< @R<78Footer
%
9r OJQJFV@aF78FollowedHyperlink>*B*ph.)@q.78Page NumberRORnY
Table Heading(<^5OJQJ^JJOJnYTable Description)<^HOHnYTable Values*<^OJQJHOH Description Char_HmH	sH	tH	O$@Style 24 pt Bold Custom Color(RGB(9638168)) Centered Left:  0...,$^a$5B*	CJ0\phDO3$@Style 60 pt Bold Custom Color(RGB(9638168)) Centered Left:  0...-$^a$5B*	CJx\phDRYR$Document Map.-D M
OJQJ^JBOBp6Style Courier NewOJQJnOn1p6Style Description + Courier New0OJQJmHnHutOt0p6$Style Description + Courier New CharOJQJmHnHujOjXTOC Heading"2$&d	PD^5B*	CJ(OJQJphDO1-9qEStyle 60 pt Bold Custom Color(RGB(9638168)) Centered Left:  0... Char+5B*	CJxOJQJ\_HmH	phDsH	tH	0OB0pKBullet	4
&Fe@R]HTML PreformattedC5
2(
Px4 #\'*.25@9^OJQJ^JmH	sH	tH	8Ob8&Y
Table Text6OJQJBOrBL0Table Contents7$*$tH	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

5		



  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~		



	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

!	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

555@05@045678A<\Z`;[v:eoV3Npq			'	0	Z	n			;



	
'
W
^




	H#L	6z=}9CU_9:8KFd6-.OavK.7Rdw 6(4^ 
 j  j!y!!!!!!!!!#"*"1"G"`""# $2$<$s$%%&8&Z&c&&&&&&&''0'h''D(f(x((;)K)R)h)))*O*q*******++-++p,,,,,,,,-0.:.]/a00012222222222222222222222222223333	3333333333 3#3&3'3(3+3-30313235373:3<3=3@3S3W3X3Y3Z3\3]3_3`3b3c3e3f333333333333333333444444444	4
444
4444444444444444444 4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434445464748494:4;4<4=4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}4~4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555	5
555
555555555555555-0-0-0,0,0,0,0000008080000008008 40Z 40Z0Z0Z 40Z 40Z 40Z0Z 40Z 40Z 40Z00e0o0o(0o 00000000000000(0o 0'	0'	 0'	0'	!0'	 0'	0'	0'	0'	0'	!0'	!0'	 0'	0'	!0'	0'	!0'	0'	0'	0'	!0'	 0'	0e0 000 0 40 40 400000000000000000 0000!0000000000!00!00!00e0F0F0F(0F 000000 0000(0F 00e0(0 00000(0 0.0.0.0.0. 0.0.0.0.0. 0.0.0.0.0.0. 0.0.0.0.0.0.0.0.!0.0. 0.0.0.0.0.0.0. 0.0.0.0.0.0.0.0.!0.0. 0.0.0.0e0<$(0<$ 0%0%0%(0<$ 0Z&0Z&0Z&0Z&0Z&0Z&0Z&0Z&0Z&0Z&!0Z& 0Z&0Z&0Z&0Z&!0Z&0Z&0Z&0Z&0Z&!0Z& 0Z& 0Z&0/&0/&0/&0/& 0/&0/&0/&0/&0/&0/& 0/& 0/&0/&0/&0/&0/&0/&0/&0/&!0/&0 0.!0. !0.0	 00	 00(0 (0 (0 (0 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 70 70 70 70 0 0@0h00@0h00@0h00@0h00@$0@0@%0@0@0@0@0@%0@0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$00h045678A<\Z`;[v:eoV3Npq			'	0	Z	n			;



	
'
W
^




	H#L	6z=}9CU_9:8KFd6-.OavK.7Rdw 6(4^0.2222222222333333'3(31323<3=3X3Y3Z33335-0-0-0,0,0,0,0000008080000008008 40Z 40Z0Z0Z 40Z 40Z 40Z0Z 40Z 40Z 40Z00e0o0o(0o 00000000000000(0o 0'	0'	 0'	0'	!0'	 0'	0'	0'	0'	0'	!0'	!0'	 0'	0'	!0'	0'	!0'	0'	0'	0'	!0'	 0'	0e0 000 0 40 40 400000000000000000 0000!0000000000!00!00!00e0F0F0F(0F 000000 0000(0F 00e0(0 00000(0 0.0.0.0.0. 0.0.0.0.0. 0.0.0.0.0.0. 0.h000@0h00B81 h00@0/h00@0\h00@0lh00	@p0 h0
08@0h00
IAK1Kh00@0jh00A0jh00h00lKh00@0h00@j2D 00@0@0@0
00	55EES 'V-<)$'*,;
C"D&)/2n9;;;<<<)<4<><I<e<<=0=L=i======) "#%&()+-./0123456789:<=>?@ABCDEG(!8?A! ,b$.^%rBɮc$0e0e
   A@ AԔ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||s
"
0e@        @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab `&@ 0(	
B
S	?J2(	
z	.&/
C  3"t

s*X99?  "`.&/ZB
	
s*DDp  	.

C  S"t

s*X99?  "`.

s*@~D  "`.<
556
.k@	/wH*xu/\K*u@_Common_XFS_Typese5e5I[9
1I[9I[9UI[91I[9I[9, 33333353333335>*urn:schemas-microsoft-com:office:smarttags
PostalCode9*urn:schemas-microsoft-com:office:smarttagsState8*urn:schemas-microsoft-com:office:smarttagsCity9*urn:schemas-microsoft-com:office:smarttagsplace:*urn:schemas-microsoft-com:office:smarttagsStreet;*urn:schemas-microsoft-com:office:smarttagsaddress,"VZnr7;;>CG[cv|jnZaipU
Y
 ),<S



or;Fpu#pw.1}()15""""#$T%W%%%****X+^+++}--P.T.q.z.....////11111222Z3Z3\3\3]3]3_3`3b3c3e3f3333355~^ajnENZbq		:
W
\


U^_KPO`auv< B W!\!Z3Z3\3\3]3]3_3`3b3c3e3f33355333333333333333338[v:3	/	#L	6Oa.7Rd  !!<$r$%%Z&c&&&&&G,p,0.:.0011222Y3Z3Z3\3\3]3]3_3`3b3c3e3f3g33333355Z3Z3\3\3]3]3_3`3b3c3e3f33355	'Lbs62\zd)W4>7/B-FK4)sA脀/aFNX;P`%QZ^`.88^8`.^`.^`.pp^p`.		^	`.@@^@`.^`.^`.^`OJQJo(hH^`OJQJ^Jo(hHo

^
`OJQJo(hHw
w
^w
`OJQJo(hHGG^G`OJQJ^Jo(hHo^`OJQJo(hH^`OJQJo(hH^`OJQJ^Jo(hHo^`OJQJo(hHh
^`hH.h
^`hH.h

L
^
`LhH.h
w
w
^w
`hH.h
GG^G`hH.h
L^`LhH.h
^`hH.h
^`hH.h
L^`LhH.h
^`hH.h
^`hH.h

L
^
`LhH.h
w
w
^w
`hH.h
GG^G`hH.h
L^`LhH.h
^`hH.h
^`hH.h
L^`LhH.h
^`hH.h^`OJQJo(hHh

L
^
`LhH.h
w
w
^w
`hH.h
GG^G`hH.h
L^`LhH.h
^`hH.h
^`hH.h
L^`LhH.h
^`hH.h
^`hH.h

L
^
`LhH.h
w
w
^w
`hH.h
GG^G`hH.h
L^`LhH.h
^`hH.h
^`hH.h
L^`LhH.h
^`hH.h
^`hH.h

L
^
`LhH.h
w
w
^w
`hH.h
GG^G`hH.h
L^`LhH.h
^`hH.h
^`hH.h
L^`LhH.h
^`hH.h
^`hH.h

L
^
`LhH.h
w
w
^w
`hH.h
GG^G`hH.h
L^`LhH.h
^`hH.h
^`hH.h
L^`LhH.h
^`hH.h
^`hH.h

L
^
`LhH.h
w
w
^w
`hH.h
GG^G`hH.h
L^`LhH.h
^`hH.h
^`hH.h
L^`LhH.	'%Q>7/)sA/aFzd)6;P		T"																											T"																																												@	@@]xXe>xz0Jd8'%AFyYzZ&''_,v-00KzcH:*C15?S4WW^{$1)x2;"|6:&DGg"i~5
DqOU]Ncnzu{<$cTa(}i(/4F#^Gnt	="	I-	P	]	e	h	
)	
Q
Q 
3
5
G
b
;p
w
KGFNfiuz`
DZBh-
'
(
:0
A
c
u
9I:<qr.Y>lIU>dhwk&*:ipIS E7U>Zghr6{D
\">&}==ZYfsu
$S/0Q^oZsWxI.L84"$/3ODJjL6&t#'[ns.eDHya?ADlId37AQ|}d~y+(,s-86;`>].DuoU_#v=> 	 0 E5 )9 = S e i du w "!8!}K!$]!~!"""Z'"O""X"s"y"z" #0#B#c#th#zx#m$	$%$%R$X$Fj$% %'%(%)%4%J%P%]%a%r%T&'&8&;&n&co&jy&'_G'M'^'(=(FA(F(u^(B|(~())")8)B)&m)Yu)z)
*!*&*eC*d*f*-i*'x*Z{*+ +0+;+D+H+K+_+(|+,1,b,4h,j,s,w,"-3;-W-_-|-~-k-1.A.d.../H.\].$_.7c.m.//&/y;/D/L/R/Qf/h/w/:0O@0
I0Tb01:1Y1Z1f1mp1p1262k263)3^3\c3y3M94RV4'p4|4J?5N5PS50Y5Y5g51l5
y5.(6163:6l;6=6?=6B6E6X6]`6Xb6p6p6z67}j7z7"7
8187898a8{s89c9#929hQ9b9t9t9:':.:31:G:G:w:~: ;6$;[;a;e;l; <!<yb<==k=;*=5=p=={>>>>:>=>[>d>j>#k>`v>ez>
A?A?.B?7i?u?	@x5@I@[@b@`m@w@ZAAAFAoAtA0B9B`(B8B?BAB]eBTiB2zBBC2CUCYCdZClC"D2D*DC+D8/DAaDDaDdDeD|D((E}SEwrE
F@FFF"F7F?FdFlF#Go$G*GBmGFmG H#H'H0H5HYH~fHE|H8,I
9I?ILIrIY{I"JJ`2J<JzSJwJK
KK6K8K*KK/LKWKgKmK3LXLhL1nL|LN(M8MtHMLMcMiMe>NO&Oa8O:^OFrOXPiPPPP_1P6PCPXP/`Pq`P0Q6QQHQyOQ`Q]xQ}RVR(RG0R>3RZ>Rr@R6MRmRS+S1SLSRST	TJT**T1T7T;TKT"hTnTUzUUkU}!U"(U@)U=UDUEUJUNU<RUfUVx!V9VAVGVMVcVW1W|AWMWOWxWX0X%5X>XQX^`XqYYNY!Y&YT'Yn)YkVYYYfYjoYh{YGZZB%Zq8Z=ZTlZ	[[5[\V\l\Q\Z\_\O]
]#]3]B]^i7^/:^1Z^;[^d^~i^__q_-_?_X_
``=`jq`
aT-a>Eacaeb=wb{b;cdd.dEdJtdKedEefhffm&fg!g72g3gDgEgsNg]hgukgngyg@zghhd#hR8h=h?hChDhxPhiiMiViwioj.&j=.j(1jKj,k~.k9kMkVk]k%eksk%l{9l
5mPfmnG)nfoooCoRop]o`oHp'pk2p@pOp7ipvpq
qxqq6q9qFDqRq?nqrr4r(;r{r`szss'st0t|t;uj1u.@uhuJyuvvrv>vcvWdvPvvIw.wJZw9hw#nwvwNyw
xMx?x5IxJxUxUx\xAzx%y(y(9y?yTy\ywyz9)z$fzjzzz{{:{R{R{T{n{=s{s{|.|9|N|q|O}:}?}(?}KM}Op}w~}~_E~F~NF~M~;T~q~?x~x~	?D)EEHjx<9'5*@@dBw1
:Q^#G>U=Srx$<6DDXXI~#w:aU]u[A/
kq39MNOPP'dk+uz&mHs!Dnsr}t,@5@tEOCu;~
2RWYYclM$M%W%-3FM&Vtkz&bCa|`$'EGT\hnynn(IX_"+13A4T[sM$) 8iA%(&"+c10)"#:_4'Wf{{U~
& j'CCPPJRXRo=%0J<~J3SS`l}!_ $X(UVBh3$5O$~9 PqShkp-s*^n95DCHUW?Zg9z"2V:LW+p	QY)
9>L,kl}tuz=}m7DSnX
L
.IKTe
T
|P P":d[[v
$'&F=Fma|u	i#*.:AF<LcLo1L0?58:-Ti!4Sp#Tkpw>9VX\_fh)1E\O1KSt{kvu#),,"B R5AVwWly:2JxT]iy}#'|GM2u}Ga"vB
"?$W6I`r7yUX#%U6:?_H'bb7$ &)AOrvKwk$CNoZ\`v}/<X[`_U#5HI]bw>!0S)sL0n3:R=t
FlHx/<#AkEn	EnYuY\or"A[jyl>m=uKxy>&78@sFKP` s +0@3Fit{/jd xxE&5HKLPt'_r}
zJ3D6CRXe{{@38<>I3js\"Irs-;+Des~1oy@nx",.8:Ol4"16td2?#0E;U?PrXau)]
&$%J>THHcI2Y:Zze*^
zG!2)/I^e`t5
3/:<`CLKTx
.
.?
O6WOX:\'r_,fsmut&17<SXDd)#J7>BQ7VZC[`O9g-Mp&5G nu.u5$D_~bhitw!'Sip3w;|.%uKj^;DTJq|
F%)2*VJOZa9?~Ky
&*dFqT`lq37o9JN*%s;+?iy/Uk8$AaC4Z44}pp3
\-<DLP<[7gl=0&28Q:keo`P
Dc/Y25Fp$55cVv;B]d=pK\]7 ?uw^Hcv]#bm'tr
#8=wz
(;>\]`ab/f],
2>lBEU7Y:l+%3$?$CNU_wr*sL	h$=Dwz'Ka>pA!QUzS+'RySX>K`Czh
>NQZ``:fpIt&* BU]Z`x&g-wy|	!Dabqwg#AG<9MfzBUI+sD^mm+,2222222222222222222222222223333	3333333333 3#3&3'3(3+3-30313235373:3<3=3@3S3W3X3Y35@,R445@@@
@@@@UnknownG: Times New Roman5Symbol3&: Arial/&SGI?5	: Courier NewA&Arial Narrow5&zaTahoma;Wingdings"1hI15&$c+]+]q4d@3@32QXR
0>2	XFS Practical Exercises04 - Extended Attributeschatzchatz0	Oh+'0 	0<
\ht
XFS Practical Exercises04 - Extended AttributeschatzNormal.dotchatz36Microsoft Office Word@ʗ1@DV@vB@+՜.+,0hp|
SGI]@3XFS Practical ExercisesTitle	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry	F|Data
I1TableQ6WordDocumentESummaryInformation(DocumentSummaryInformation8CompObjq
	FMicrosoft Office Word Document
MSWordDocWord.Document.89q