1 FSDB_UDFS(1M) Maintenance Commands FSDB_UDFS(1M) 2 3 4 5 NAME 6 fsdb_udfs - udfs file system debugger 7 8 SYNOPSIS 9 fsdb [-F] udfs [generic_option] [-o specific_option] special 10 11 12 DESCRIPTION 13 The fsdb_udfs command is an interactive tool that can be used to patch 14 up a damaged udfs file system. fsdb_udfs has conversions to translate 15 block and i-numbers into their corresponding disk addresses. Mnemonic 16 offsets to access different parts of an inode are also included. 17 Mnemonic offsets greatly simplify the process of correcting control 18 block entries or descending the file system tree. 19 20 21 fsdb contains several error-checking routines to verify inode and block 22 addresses. These can be disabled if necessary by invoking fsdb with the 23 -o option or by using the o command. 24 25 26 fsdb reads one block at a time, and therefore works with raw as well as 27 block I/O devices. A buffer management routine is used to retain 28 commonly used blocks of data in order to reduce the number of read 29 system calls. All assignment operations result in an immediate write- 30 through of the corresponding block. In order to modify any portion of 31 the disk, fsdb must be invoked with the -w option. 32 33 34 Wherever possible, adb-like syntax has been adopted to promote the use 35 of fsdb through familiarity. 36 37 OPTIONS 38 The following options are supported: 39 40 -o specific_option 41 Specify udfs file system specific options in a 42 comma-separated list with no intervening spaces. 43 The following specific options are supported: 44 45 o 46 Override some error conditions. 47 48 49 p=string 50 Set prompt to string. 51 52 53 w 54 Open for write. 55 56 57 ? 58 Display usage. 59 60 61 62 USAGE 63 Numbers are considered hexadecimal by default. The user has control 64 over how data is to be displayed or accepted. The base command displays 65 or sets the input and output base. Once set, all input defaults to this 66 base and all output displays in this base. The base can be overridden 67 temporarily for input by preceding hexadecimal numbers by 0x, preceding 68 decimal numbers with a 0t, or octal numbers with a 0. Hexadecimal 69 numbers beginning with a-f or A-F must be preceded with a 0x to 70 distinguish them from commands. 71 72 73 Disk addressing by fsdb is at the byte level. However, fsdb offers many 74 commands to convert a desired inode, directory entry, block, and so 75 forth, to a byte address. After the address has been calculated, fsdb 76 records the result in the current address (dot). 77 78 79 Several global values are maintained by fsdb: 80 81 o Current base (referred to as base) 82 83 o Current address (referred to as dot) 84 85 o Current inode (referred to as inode) 86 87 o Current count (referred to as count) 88 89 o Current type (referred to as type) 90 91 92 Most commands use the preset value of dot in their execution. For 93 example, 94 95 > 2:inode 96 97 98 99 100 first sets the value of dot (.) to 2, colon (:), signifies the start of 101 a command, and the inode command sets inode to 2. A count is specified 102 after a comma (,). Once set, count remains at this value until a new 103 command is encountered that resets the value back to 1 (the default). 104 105 106 So, if 107 108 > 2000,400/X 109 110 111 112 113 is entered, 400 hex longs are listed from 2000, and when completed, the 114 value of dot is 2000 + 400 * sizeof (long). If a RETURN is then 115 entered, the output routine uses the current values of dot, count, and 116 type and displays 400 more hex longs. An asterisk (*) causes the entire 117 block to be displayed. An example showing several commands and the use 118 of RETURN would be: 119 120 > 2:ino; 0:dir?d 121 122 123 124 125 or 126 127 > 2:ino; 0:db:block?d 128 129 130 131 132 The two examples are synonymous for getting to the first directory 133 entry of the root of the file system. Once there, subsequently entering 134 a RETURN, plus (+), or minus (-) advances to subsequent entries. 135 Notice that 136 137 > 2:inode; :ls 138 139 140 141 142 or 143 144 > :ls / 145 146 147 148 149 is again synonymous. 150 151 Expressions 152 The following symbols are recognized by fsdb: 153 154 RETURN 155 Update the value of dot by the current value of type and 156 display using the current value of count. 157 158 159 # 160 Update the value of dot by specifying a numeric 161 expression. Specify numeric expressions using addition, 162 subtraction, multiplication, and division operators ( +, 163 -, *, and %). Numeric expressions are evaluated from left 164 to right and can use parentheses. After evaluation, the 165 value of dot is updated. 166 167 168 , count 169 Update the count indicator. The global value of count is 170 updated to count. The value of count remains until a new 171 command is run. A count specifier of * attempts to show a 172 blocks's worth of information. The default for count is 1. 173 174 175 ? f 176 Display in structured style with format specifier f. See 177 Formatted Output. 178 179 180 / f 181 Display in unstructured style with format specifier f. See 182 Formatted Output. 183 184 185 . 186 Display the value of dot. 187 188 189 +e 190 Increment the value of dot by the expression e. The amount 191 actually incremented is dependent on the size of type: dot 192 = dot + e * sizeof (type) The default for e is 1. 193 194 195 -e 196 Decrement the value of dot by the expression e . See +. 197 198 199 *e 200 Multiply the value of dot by the expression e. 201 Multiplication and division don't use type. In the above 202 calculation of dot, consider the sizeof (type) to be 1. 203 204 205 %e 206 Divide the value of dot by the expression e. See *. 207 208 209 < name 210 Restore an address saved in register name. name must be a 211 single letter or digit. 212 213 214 > name 215 Save an address in register name. name must be a single 216 letter or digit. 217 218 219 = f 220 Display indicator. If f is a legitimate format specifier 221 (see Formatted Output), then the value of dot is displayed 222 using format specifier f. Otherwise, assignment is 223 assumed. See = [s] [e]. 224 225 226 = [s] [e] 227 Change the value of dot using an assignment indicator. The 228 address pointed to by dot has its contents changed to the 229 value of the expression e or to the ASCII representation 230 of the quoted (") string s. This can be useful for 231 changing directory names or ASCII file information. 232 233 234 =+ e 235 Change the value of dot using an incremental assignment. 236 The address pointed to by dot has its contents incremented 237 by expression e. 238 239 240 =- e 241 Change the value of dot using a decremental assignment. 242 Decrement the contents of the address pointed to by dot by 243 expression e. 244 245 246 Commands 247 A command must be prefixed by a colon (:). Only enough letters of the 248 command to uniquely distinguish it are needed. Multiple commands can be 249 entered on one line by separating them by a SPACE, TAB, or semicolon 250 (;). 251 252 253 To view a potentially unmounted disk in a reasonable manner, fsdb 254 supports the cd, pwd, ls, and find commands. The functionality of each 255 of these commands basically matches that of its UNIX counterpart. See 256 cd(1), pwd(1), ls(1), and find(1) for details. The *, ,, ?, and - 257 wildcard characters are also supported. 258 259 260 The following commands are supported: 261 262 base[=b] 263 264 Display or set the base. All input and output is governed by the 265 current base. Without the = b, displays the current base. 266 Otherwise, sets the current base to b. Base is interpreted using 267 the old value of base, so to ensure correctness use the 0, 0t, or 268 0x prefix when changing the base. The default for base is 269 hexadecimal. 270 271 272 block 273 274 Convert the value of dot to a block address. 275 276 277 cd [dir] 278 279 Change the current directory to directory dir. The current values 280 of inode and dot are also updated. If dir is not specified, changes 281 directories to inode 2, root (/). 282 283 284 directory 285 286 If the current inode is a directory, converts the value of dot to a 287 directory slot offset in that directory, and dot now points to this 288 entry. 289 290 291 file 292 293 Set the value of dot as a relative block count from the beginning 294 of the file. The value of dot is updated to the first byte of 295 this block. 296 297 298 find dir [-name n] | [-inum i] 299 300 Find files by name or i-number. Recursively searches directory dir 301 and below for file names whose i-number matches i or whose name 302 matches pattern n. Only one of the two options (-name or -inum) can 303 be used at one time. The find -print is not necessary or accepted. 304 305 306 fill=p 307 308 Fill an area of disk with pattern p. The area of disk is delimited 309 by dot and count. 310 311 312 inode 313 314 Convert the value of dot to an inode address. If successful, the 315 current value of inode is updated as well as the value of dot. As a 316 convenient shorthand, if :inode appears at the beginning of the 317 line, the value of dot is set to the current inode and that inode 318 is displayed in inode format. 319 320 321 ls [ -R ] [-l ] pat1 pat2... 322 323 List directories or files. If no file is specified, the current 324 directory is assumed. Either or both of the options can be used 325 (but, if used, must be specified before the filename specifiers). 326 Wild card characters are available and multiple arguments are 327 acceptable. The long listing shows only the i-number and the name; 328 use the inode command with ?i to get more information. 329 330 331 override 332 333 Toggle the value of override. Some error conditions might be 334 overridden if override is toggled to on. 335 336 337 prompt "p" 338 339 Change the fsdb prompt to p. p must be enclosed in quotes. 340 341 342 pwd 343 344 Display the current working directory. 345 346 347 quit 348 349 Quit fsdb. 350 351 352 tag 353 354 Convert the value of dot and if this is a valid tag, print the 355 volume structure according to the tag. 356 357 358 ! 359 360 Escape to the shell. 361 362 363 Inode Commands 364 In addition to the above commands, several other commands deal with 365 inode fields and operate directly on the current inode (they still 366 require the colon (:). They can be used to more easily display or 367 change the particular fields. The value of dot is only used by the :db 368 and :ib commands. Upon completion of the command, the value of dot is 369 changed so that it points to that particular field. For example, 370 371 > :ln=+1 372 373 374 375 376 increments the link count of the current inode and sets the value of 377 dot to the address of the link count field. 378 379 380 The following inode commands are supported: 381 382 at 383 Access time 384 385 386 bs 387 Block size 388 389 390 ct 391 Creation time 392 393 394 gid 395 Group id 396 397 398 ln 399 Link number 400 401 402 mt 403 Modification time 404 405 406 md 407 Mode 408 409 410 maj 411 Major device number 412 413 414 min 415 Minor device number 416 417 418 nm 419 This command actually operates on the directory name field. 420 Once poised at the desired directory entry (using the 421 directory command), this command allows you to change or 422 display the directory name. For example, 423 424 > 7:dir:nm="foo" 425 426 427 gets the 7th directory entry of the current inode and changes 428 its name to foo. Directory names cannot be made larger than the 429 field allows. If an attempt is made to make a directory name 430 larger than the field allows,, the string is truncated to fit 431 and a warning message is displayed. 432 433 434 sz 435 File size 436 437 438 uid 439 User ID 440 441 442 uniq 443 Unique ID 444 445 446 Formatted Output 447 Formatted output comes in two styles and many format types. The two 448 styles of formatted output are: structured and unstructured. Structured 449 output is used to display inodes, directories, and so forth. 450 Unstructured output displays raw data. 451 452 453 Format specifiers are preceded by the slash (/) or question mark (?) 454 character. type is updated as necessary upon completion. 455 456 457 The following format specifiers are preceded by the ? character: 458 459 i 460 Display as inodes in the current base. 461 462 463 d 464 Display as directories in the current base. 465 466 467 468 The following format specifiers are preceded by the / character: 469 470 b 471 Display as bytes in the current base. 472 473 474 c 475 Display as characters. 476 477 478 o | O 479 Display as octal shorts or longs. 480 481 482 d | D 483 Display as decimal shorts or longs. 484 485 486 x | X 487 Display as hexadecimal shorts or longs. 488 489 490 EXAMPLES 491 Example 1 Using fsdb as a calculator for complex arithmetic 492 493 494 The following command displays 2010 in decimal format, and is an 495 example of using fsdb as a calculator for complex arithmetic. 496 497 498 > 2000+400%(20+20)=D 499 500 501 502 Example 2 Using fsdb to display an i-number in inode fomat 503 504 505 The following command displays the i-number 386 in inode format.386 506 becomes the current inode. 507 508 509 > 386:ino?i 510 511 512 513 Example 3 Using fsdb to change the link count 514 515 516 The following command changes the link count for the current inode to 517 4. 518 519 520 > :ln=4 521 522 523 524 Example 4 Using fsdb to increment the link count 525 526 527 The following command increments the link count by 1. 528 529 530 > :ln=+1 531 532 533 534 Example 5 Using fsdb to display the creation time as a hexadecimal long 535 536 537 The following command displays the creation time as a hexadecimal long. 538 539 540 > :ct=X 541 542 543 544 Example 6 Using fsdb to display the modification time in time format 545 546 547 The following command displays the modification time in time format. 548 549 550 > :mt=t 551 552 553 554 Example 7 Using fsdb to display in ASCII 555 556 557 The following command displays, in ASCII, block 0 of the file 558 associated with the current inode. 559 560 561 > 0:file/c 562 563 564 565 Example 8 Using fsdb to display the directory enteries for the root 566 inode 567 568 569 The following command displays the first block's directory entries for 570 the root inode of this file system. This command stops prematurely if 571 the EOF is reached. 572 573 574 > 2:ino,*?d 575 576 577 578 Example 9 Using fsdb to change the current inode 579 580 581 The following command changes the current inode to that associated 582 with the 5th directory entry (numbered from 0) of the current inode. 583 The first logical block of the file is then displayed in ASCII. 584 585 586 > 5:dir:inode; 0:file,*/c 587 588 589 590 Example 10 Using fsdb to change the i-number 591 592 593 The following command changes the i-number for the 7th directory slot 594 in the root directory to 3. 595 596 597 > 2:inode; 7:dir=3 598 599 600 601 Example 11 Using fsdb to change the name field 602 603 604 The following command changes the name field in the directory slot to 605 name. 606 607 608 > 7:dir:nm="name" 609 610 611 612 Example 12 Using fsdb to display the a block 613 614 615 The following command displays the 3rd block of the current inode as 616 directory entries. 617 618 619 Example 13 Using fsdb to set the contents of address 620 621 622 The following command sets the contents of address 2050 to 0xffffffff. 623 0xffffffff can be truncated, depending on the current type. 624 625 626 > 2050=0xffff 627 628 629 630 Example 14 Using fsdb to place an ASCII string at an address 631 632 633 The following command places the ASCII string this is some text at 634 address 1c92434. 635 636 637 > 1c92434="this is some text" 638 639 640 641 SEE ALSO 642 clri(1M), fsck_udfs(1M), dir(4), attributes(5) 643 644 645 646 November 26, 2017 FSDB_UDFS(1M)