pax_global_header00006660000000000000000000000064152271715610014521gustar00rootroot0000000000000052 comment=3f280486bde12bc13fe0733f97e1a0da4c83e28b snapraid-14.9/000077500000000000000000000000001522717156100132575ustar00rootroot00000000000000snapraid-14.9/.github/000077500000000000000000000000001522717156100146175ustar00rootroot00000000000000snapraid-14.9/.github/workflows/000077500000000000000000000000001522717156100166545ustar00rootroot00000000000000snapraid-14.9/.github/workflows/build.yml000066400000000000000000000020211522717156100204710ustar00rootroot00000000000000name: Build permissions: contents: read on: push: branches: [ "master", "stable" ] pull_request: branches: [ "master", "stable" ] jobs: build-mac: runs-on: macos-latest steps: - uses: actions/checkout@v5 - run: brew install automake - run: autoreconf -i - run: ./configure --enable-warning-as-error - run: make all - run: make distcheck build-linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - run: autoreconf -i - run: ./configure --enable-warning-as-error - run: make all - run: make distcheck build-win: runs-on: windows-latest defaults: run: shell: msys2 {0} steps: - uses: actions/checkout@v5 - uses: msys2/setup-msys2@v2 with: msystem: MINGW64 update: true install: mingw-w64-x86_64-gcc autoconf automake make - run: autoreconf -i - run: ./configure --enable-warning-as-error - run: make all - run: make distcheck snapraid-14.9/.github/workflows/codeql.yml000066400000000000000000000111531522717156100206470ustar00rootroot00000000000000# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL Advanced" on: push: branches: [ "master", "stable" ] pull_request: branches: [ "master", "stable" ] jobs: analyze: name: Analyze (${{ matrix.language }}) # Runner size impacts CodeQL analysis time. To learn more, please see: # - https://gh.io/recommended-hardware-resources-for-running-codeql # - https://gh.io/supported-runners-and-hardware-resources # - https://gh.io/using-larger-runners (GitHub.com only) # Consider using larger runners or machines with greater resources for possible analysis time improvements. runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} permissions: # required for all workflows security-events: write # required to fetch internal or private CodeQL packs packages: read # only required for workflows in private repositories actions: read contents: read strategy: fail-fast: false matrix: include: - language: actions build-mode: none - language: c-cpp build-mode: autobuild # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' # Use `c-cpp` to analyze code written in C, C++ or both # Use 'java-kotlin' to analyze code written in Java, Kotlin or both # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository uses: actions/checkout@v4 # Add any setup steps before running the `github/codeql-action/init` action. # This includes steps like installing compilers or runtimes (`actions/setup-node` # or others). This is typically only required for manual builds. # - name: Setup runtime (example) # uses: actions/setup-example@v1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality # If the analyze step fails for one of the languages you are analyzing with # "We were unable to automatically build your code", modify the matrix above # to set the build mode to "manual" for that language. Then modify this step # to build your code. # â„šī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - name: Run manual build steps if: matrix.build-mode == 'manual' shell: bash run: | echo 'If you are using a "manual" build mode for one or more of the' \ 'languages you are analyzing, replace this with the commands to build' \ 'your code, for example:' echo ' make bootstrap' echo ' make release' exit 1 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 with: category: "/language:${{matrix.language}}" snapraid-14.9/.gitignore000066400000000000000000000014001522717156100152420ustar00rootroot00000000000000# archives *.zip *.tar.gz *.tgz *.txz *.deb *.rpm *.zst # backups *~ # logs *.log stream*.bin # upload makepush.sh makemount.sh makeumount.sh # autotools Makefile Makefile.in compile aclocal.m4 autom4te.cache/ config.guess config.h config.h.in config.log config.status config.sub configure install-sh missing stamp-h1 .dirstamp # objects snapraid mktest mkstream *.exe *.o *.gcda *.gcno *.gcov makeslackware.sh makeslackdist.sh pkg/snapraid.SlackBuild pkg/snapraid.info makedeb.sh pkg/control makerpm.sh pkg/snapraid.spec makearch.sh makearchdist.sh pkg/.PKGINFO pkg/PKGBUILD pkg/.SRCINFO # projects *.dst *.epr *.geany session.conf # AFL makeafl.sh afl/ afl_corpus/ # specific cov/ contrib/ paper/ kernel/ obj/ bench/ support/ archive/ www/ wiki/ beta/ ftp/ snapraid-14.9/AUTHORS000066400000000000000000000010501522717156100143230ustar00rootroot00000000000000SnapRAID AUTHORS ================ The author of SnapRAID is Andrea Mazzoleni. You can contact me sending an email at: amadvance@gmail.com Please don't send support requests at this address, but use the SnapRAID forum. ACKNOWLEDGMENTS =============== Special thanks to Leifi, the king of the Forum! Thanks for the testing, suggestions and bug reports to klbl, jwill42, tholiin, uhclem, reardonia, Jens, rubylaser and the whole SnapRAID Forum. Also thanks for the support to Ben_in_COSprings, Darin, micksh, RamanRB and the whole AVS Forum. snapraid-14.9/BLUEBOX000066400000000000000000000076441522717156100143150ustar00rootroot00000000000000SnapRAID Windows Smart Screen (Blue Box) ======================================== Windows uses a cloud-based reputation system to vet software. Because SnapRAID is a specialized Open Source project, it may not have the "global reputation" required to pass these automated checks silently. Consequently, when running SnapRAID or the SnapRAID Daemon, Windows SmartScreen may display a warning dialog (informally called a "Blue Box") or block execution entirely due to "Malicious binary reputation". Only expensive EV (Extended Validation) certificates can automatically bypass these reputation filters, making them generally unsuitable for free Open Source projects. OPTION 1: THE "RUN ANYWAY" METHOD --------------------------------- When the SmartScreen dialog first appears, click "More info" and then select "Run anyway" to proceed. This dialog only appears for files downloaded from the internet. If Windows is blocking the file silently (e.g. you see an "Application Control policy" error rather than a dialog), skip to Option 2 or 3. "Run anyway" bypasses the check for that launch only. The prompt may reappear after the file is updated or replaced. OPTION 2: PERMANENTLY UNBLOCKING THE FILE ----------------------------------------- If you would prefer to permanently "unblock" a specific file on your machine and prevent the prompt from appearing again, follow these steps: 1. Right-click the executable or installer file (.exe) and select Properties. 2. Stay on the General tab (the default view). 3. Look for the Security section at the very bottom of the window. 4. Check the box labeled Unblock. 5. Click Apply and then OK. Once unblocked, the file is treated as safe by your local system. This method removes the Mark of the Web flag that Windows applies to downloaded files. It is effective against SmartScreen prompts but will not help on managed machines where an Application Control policy (WDAC or AppLocker) is enforced by an administrator. If you do not see an Unblock checkbox, or the block persists after applying it, see the note at the end of this document. OPTION 3: ADDING A PATH EXCLUSION (RECOMMENDED FOR RECURRING BLOCKS) -------------------------------------------------------------------- If Windows continues to block files within your SnapRAID folder, you can add a permanent folder exclusion to Microsoft Defender. Substitute the path below for wherever you keep your SnapRAID binaries (e.g. C:\snapraid). 1. Open Windows Security by searching for it in the Start menu. 2. Select Virus & threat protection. 3. Under "Virus & threat protection settings," click Manage settings. 4. Scroll down to the bottom and click Add or remove exclusions. 5. Click + Add an exclusion and select Folder. 6. Browse to and select your SnapRAID folder (e.g. C:\snapraid). 7. Click Select Folder and confirm any administrator prompts. By excluding this path, Microsoft Defender will no longer subject files inside that folder to reputation-based blocks or SmartScreen warnings. This exclusion applies to Microsoft Defender Antivirus. It does not override Application Control policies (WDAC or AppLocker) enforced by an administrator. If blocks persist after adding the exclusion, see the note below. Only use this method if you are certain that you only place authentic SnapRAID files in that directory. MANAGED OR CORPORATE MACHINES ----------------------------- If none of the above options resolve the issue, your machine is likely subject to an Application Control policy enforced by your organisation's IT department. These policies (implemented via Windows Defender Application Control or AppLocker) operate at the kernel level and cannot be overridden by end users. In this situation you will need to contact your IT administrator and ask them to whitelist the SnapRAID executable, either by file path, or by file hash. Providing them with the official download URL (https://www.snapraid.it) and the file hash may help them process the request. snapraid-14.9/CHECK000066400000000000000000000013531522717156100140210ustar00rootroot00000000000000SnapRAID CHECK ============== The regression test for SnapRAID is run using the command: make check You can also run the regression test with Valgrind using: ./configure --enable-valgrind make check To perform a coverage test, use the following commands: ./configure --enable-coverage make lcov_reset make check make lcov_capture make lcov_html Then, open the file `./cov/index.html` in your browser to view the results. Note that the coverage analysis excludes error-handling code that causes immediate program termination. This excluded code is enclosed between the LCOV_EXCL_START and LCOV_EXCL_STOP keywords. To test with the Clang static analyzer, use: scan-build ./configure scan-build make snapraid-14.9/CHECKSUMS000066400000000000000000000463651522717156100145450ustar00rootroot00000000000000sha256 761eaf08937139a89d79d1ffbad42508f270d3aa603eac50475f7449ae278dcf snapraid-1.2.tar.gz 10e64f2629eb469a32eabc84e1f9a59593cbbf61282ead964b622af1ec0c4681 snapraid-1.2-windows-x64.zip 27da3c54fe408ab53c6e2b4b398ae46328a2dbc701b785a55bf76ffed6046eb2 snapraid-1.2-windows-x86.zip 2e6aaa660a5a74665044ead40959006632dcd1ee1e21091e6260f5b845304f96 snapraid-1.3.tar.gz 0d0cefeabf8230b66414a8731ceb52a0adaaedb5be0fa11d07a6be44e9f2fb6d snapraid-1.3-windows-x64.zip 4358802fb022ba5e2f8d1323ce963155adccea99069abd5f901eadf1411b6366 snapraid-1.3-windows-x86.zip 157b0ca7cfa9cba43cf995b4c32b0b206e299f5ffff58062069bb6ec41c77c0d snapraid-1.4.tar.gz 5b210dd4667369799fd02757e8efc4d733c704cfe72319d297d4ab969b80c962 snapraid-1.4-windows-x64.zip 77047e1fa1bfcb12db7d5c3167e7dbbbb1718909f1003fd185cdf219cd952427 snapraid-1.4-windows-x86.zip f460bf9aee4b02b6c08f19b0caa2928b075c73ca4cfc41c7f426f015f67cffbc snapraid-1.5.tar.gz d19262bdf9e572fa80285887886a8fbe9a7b9bd4159496f112d383bf9b4db797 snapraid-1.5-windows-x64.zip 28816c0cde4cf8ce8e91a585eb9aab5552344a331237b6a2afd50396685814fd snapraid-1.5-windows-x86.zip e0684d036cfd6b9fcdf23792c057fec4f4531d25aab7c677ff35e7a8be07b098 snapraid-1.6.tar.gz 9c13f99d67aafe43f5c540d97d0f6b40289856f547b8f33ee8aee27b270a7fae snapraid-1.6-windows-x64.zip ae94db99a06068e17134ce69009492c4bfd8f6e54ea1848df105bb89f9f7ba28 snapraid-1.6-windows-x86.zip 1cf7a8f58533d6bc717ff6d396114ec4ed61eb66ff2756370e4cc730ee4edc4d snapraid-1.7.tar.gz 0cb49c676f3f9fd1f0fc938513b6dcaaf15390b64098e17cff5066667e4d01d5 snapraid-1.7-windows-x64.zip 44bc6b947ba845a89ecf812b82e751dca2dd4a6143ff06391c3b8b285a7ed3a2 snapraid-1.7-windows-x86.zip da1c09f0139e683c03942c2b9489c2d9b989c59d147f7c28258c8e58c3938037 snapraid-1.8.tar.gz fca7352fece5d7243af45ba8c5a07e08cc0e24d226468a619b9d86a3767e7099 snapraid-1.8-windows-x64.zip 35520cab33b3b3f9efc4ba4d7a968a7d7d49637b5e256921e0091424f5dd60ee snapraid-1.8-windows-x86.zip 504c3fe288b66c84bc65173979e7cede06370ca2a5f02ef3ca200c2fc8b09ea9 snapraid-1.9.tar.gz ddba596451a05c61b20ce1e82c8039ba3c13be67b7469f2c75c6b0b7b4b18356 snapraid-1.9-windows-x64.zip 5a0dd3cdc0edf69cd03d926b594e41f5ca7e07564ef1cb3d6ac417c76f16b77b snapraid-1.9-windows-x86.zip 5e4eee49748faf966ebcc1cb3b9127ad7047542baf8952c6e0a9cbb32dac4d88 snapraid-1.10.tar.gz 7812a37f8767beb9542def762b2e131caafffc1b1b21f1d9422030e93e367f12 snapraid-1.10-windows-x64.zip b899784498050c5d41752464bd31cec7de9e77ec865f55e2192fea75f52787d5 snapraid-1.10-windows-x86.zip c349c4c25e3cb794d908dc75422ca9b04b44162c295b41d4ea55081af1a3451f snapraid-1.11.tar.gz 47e8f09f3d012d0a34d71e6ece7b9171c82af27766cca709fc9bbd104328cc7d snapraid-1.11-windows-x64.zip 8a8b0562192732022ae1732f5ae48e5f8745e217f73683123b2822e316918204 snapraid-1.11-windows-x86.zip bd89ef0ddc3909c50fecc30da1d5d70342b92952b5d3ae0a2e31a66c8755dc8a snapraid-1.12.tar.gz 290c5ac8667ca7ada12a0d550e06c9fbc5f4e29abb5af0ef105eba38fb274c5d snapraid-1.12-windows-x64.zip 8cbc4e447f2152c3e76025cdbad03c54e7c85e004bb535f9dc7dde9b86605fe8 snapraid-1.12-windows-x86.zip 7c824abf6cacd8b847467916a1b4c28f48161e4b9f9b6c2f607c4de473a663c9 snapraid-1.13.tar.gz 22f6e9bf1dff5df4abff29b7cf364dc029959991dc158257f2a283721581abf4 snapraid-1.13-windows-x64.zip 9801b1a0331c461ce70c7824e2624dd2866358d61d923ff854253f340985947e snapraid-1.13-windows-x86.zip 68a48c961fcc15ffcfb86e4c5ea2371d562252e61f58fe87a529f479e81fb2bb snapraid-2.0.tar.gz a2e1fb0610c8bfc57d73da1dbd276c238a032bf9b4c73a41977fcc57e773fff4 snapraid-2.0-windows-x64.zip 0fc3bee4d107bcd5e55a1c5bb81015558d9791d66a44f9ae2e3723906c3199df snapraid-2.0-windows-x86.zip 788377f579486c2b16548563a3d25f385594ae4276f1328c8f82cd0d5e0af9b6 snapraid-2.1.tar.gz 6e32fc0603136c4d3ad60fc1f04e6c919b7e7159267750ebf0dd8ad20ee6b442 snapraid-2.1-windows-x64.zip d2813aec37f96506bcf98f2b5196204f065786731a5874f495f18f58fe87064b snapraid-2.1-windows-x86.zip faf9545f0a66865e754ad587731483becf895a954c22e023501a2f28af44682a snapraid-2.2.tar.gz 2ea4b610c8d99f3766f6d2c89be5eafd1e16a17454d9df02d982fa184b517744 snapraid-2.2-windows-x64.zip e2dac0663546f06ac3e679a93ba5de9e7de91563e09c1396fd367c5b16e011be snapraid-2.2-windows-x86.zip 68e610d67087c02715289934472c5fa3d7aa77c8085298ba54f02f26f7d396ad snapraid-3.0.tar.gz ca7943f270a940554ddbd8c09698228120da2bac5b6d78486a34f5b301e24f47 snapraid-3.0-windows-x64.zip c6a47d8bf544e69d9b301fe525d193c8faa8ef056c78f8a0649637d2e99b93c6 snapraid-3.0-windows-x86.zip b5b22350c221e145c3347426f186f188f5d64616d03f196b35d75db564e78f7f snapraid-3.1.tar.gz 6d275cf3d579a5050e936879db85acbcb34b6522b36d5bc81b2f3764ca011c87 snapraid-3.1-windows-x64.zip 66f5967e559368193aef7b13a1c641694ca62f64e4b5749a7e2709aac6dc5759 snapraid-3.1-windows-x86.zip 99617ef379c4e46cc4366f2b3baced653f786ef08a40d74dca23a11a9240b096 snapraid-3.2.tar.gz 94d121d8cc0b9ab7ef1648e42edbfe1cfc602231c86a086d21984177da566f77 snapraid-3.2-windows-x64.zip 1d1ed69d3eab8247a7444e603ba09a56ec77979d3865489b2d8a7fc5db65848f snapraid-3.2-windows-x86.zip c5a6e77613fab5cecb1aa55750f2045934d9374ba70471b6d35296c34509e5a9 snapraid-4.0.tar.gz a59c911fef0d4d3e95d5521c6a180b40c455870be3ee9dbb5991b05b2cdd2f05 snapraid-4.0-windows-x64.zip 97ec4ae7b6ec6cd05e0c2ae835def526d12c35fa3546d27bd93978d978cd62aa snapraid-4.0-windows-x86.zip 7f5a37be7b8b78056d6602cef8ef702fe4f0d0b6ac3fa4bcefeb70743425b6fe snapraid-4.2.tar.gz bf7861274639f2e9e5819ec3a89eed911cd79a212824fe3a6b64e45c0d1e2cc4 snapraid-4.2-windows-x64.zip c7d9330be1936d7d7b07c51668fc8d3f88ce270e9e74945288d75eda2405a377 snapraid-4.2-windows-x86.zip 09f1ebfb5c45680c50651e94287d59e58260c46aee922d8864fb06fd591740e8 snapraid-4.3.tar.gz ba1008452ff679c1e144206c73a81e4cb2689006c9ce37b60ceab45ef4c99dda snapraid-4.3-windows-x64.zip 23b21e162d5d18a4f68c8635e1f111fddb91d380514d8ddab9040b18a49d9994 snapraid-4.3-windows-x86.zip aa22ea2e01a8db45ba43a3139d763cb2d12548de96f957a1ea1b5f80f04a4d83 snapraid-4.4.tar.gz ca68dd88741290a6ee6494a9186b58766cab2b838f4a55ab23921b524b15ee82 snapraid-4.4-windows-x64.zip 3d9cccc2080d1435e7e747c7eeeffc85e0b68ad45b390c236de321b8aca44d46 snapraid-4.4-windows-x86.zip ba43b0534197c6064b7a171321762be2ac2c848d4849c578007cc65aa963bed5 snapraid-5.1.tar.gz 54a31c5c979b9c3ad481cd918a48e220f11ce04de0a8ec6f41a957af7ba259fc snapraid-5.1-windows-x64.zip 6758966b3a120bf5b97f21748f649b2f147800b10377a0ee69d922be318ee399 snapraid-5.1-windows-x86.zip eab07c21201eceb4204f8039f021ff0032515719aa5e640c330da45dd8b8e7a3 snapraid-5.2.tar.gz 554cc7be40fff0a0f249522bda957dfba229066e81102624b979213666b1aaae snapraid-5.2-windows-x64.zip 44f909157ba89d769af59e971c71b15bd38dfd62359b2e2c7eeb8cef0f9dc081 snapraid-5.2-windows-x86.zip 81e00fced6bb040d49aa6e3dc6fda97f22bf677d00f6c0c490e312c23222b421 snapraid-5.3.tar.gz 2627b2491b4d432a311cca1c924f4b40cef7a64c930b7e5eca55b3b9a8a62e61 snapraid-5.3-windows-x64.zip d1019dc29922d4787c3fd9d4222dfc3b84a6a2e0c6b2db298340747238d8fb46 snapraid-5.3-windows-x86.zip d836200058b98f189e576ad5619d4ffcd867e5dc8d2a4b775bff07d4f201c938 snapraid-6.0.tar.gz 06f2e56bc30c89e4a1561ec32cf72b240765456505f17da539af4b4338a6b12c snapraid-6.0-windows-x64.zip 6ae0a3fa973a28c64489bc28d7a7f4b354d3fc6703bcb83ef661cf76e994b34d snapraid-6.0-windows-x86.zip 1709c09b0e0699ce38452be7340c279c561b91433a6810600386bb9d8c0491e3 snapraid-6.1.tar.gz 40d995a88a23d799a32eba15f64c983a012771c527208cec2ad98787a45ef4c3 snapraid-6.1-windows-x64.zip f8e09b3300717d1f9ee9b69bb132038642839c19a15a1f47810f3de10ad559eb snapraid-6.1-windows-x86.zip b182328227ed9b87b01037f7d005d38a6e3cfb0f675e919978c696dcc6246787 snapraid-6.2.tar.gz 72ccfbf6548b83bd6f229d4862763a4e4cf6001c94d9ee84bf7b2a379a9a7743 snapraid-6.2-windows-x64.zip 55f1bc131f9148ed2b52e0e252c7155e50f5b4383fe82cd74ec2edace2ddc9c6 snapraid-6.2-windows-x86.zip 1f1961385b865bff5282bd16aff76f372f3ed19b685ef7a3b27d907a499385d2 snapraid-6.3.tar.gz bb55d74d6b3cb08b21f70fded8b706ec1e790222cb265524cb2dc5499ec73391 snapraid-6.3-windows-x64.zip 3e4fa161ea26b8472dbbbfb4e61b34aca904ff9621f5afafbc83280d334a89b2 snapraid-6.3-windows-x86.zip 7cad74422d45c8a05435a03d3228a2d621a962fb866caedde0497f180bd9f60d snapraid-6.4.tar.gz 59471b49733c36acfbdeb16b28fbee063c4582abab2c9168abc7abc75610f9fc snapraid-6.4-windows-x64.zip abe80b7c019980da2af5e07e0ea8b1ac1e1cdb2eb663483c07dab6ad6bd15985 snapraid-6.4-windows-x86.zip 554684520204d45f8b7cee9abb0269dd2bdba272cb0130c3b26062bea551a791 snapraid-7.0.tar.gz a617b435f97cd746b4076d00cde68f947cca21adaca6ce603fec4676827b7ae9 snapraid-7.0-windows-x64.zip 301af727522912184f6d4a8290757950fed4577da625d9951809ff69f50b6e4f snapraid-7.0-windows-x86.zip dd9005b6d7ea701e4aa0f854a0e34dabe68d7765b75f12fc6b3e1fda4d5c2cef snapraid-7.1.tar.gz 0d3a9625a6156ffe9b9eb4703aa2fc63141c51b83c69e98fbecce5430b1980e4 snapraid-7.1-windows-x64.zip e0afdb753ae6a3bb3484a1bfe1cf01b9178010a8c11604e4bbc44b2f83884842 snapraid-7.1-windows-x86.zip a912628dd003b3d70f2736629d48eeb738e7d27cba74014001dcc46fce3bc3be snapraid-8.0.tar.gz 9c2158fb9e2c08570f6a03f5cea7ab68d2a424adb1f42bb6b3d970ba9dc8a15d snapraid-8.0-windows-x64.zip 3c2c4357450564010d80bbd2cb1d5583281885b32cf659a0cf3dadce4766e167 snapraid-8.0-windows-x86.zip 6bf89a1319ac3403958cd2c98a9c6102728c0070cfa1aedd90c4561d93c54e5d snapraid-8.1.tar.gz 83ad064d5c3938fdacb989983c6b0fafa0932c236dc4baa93512f3c97fa019bc snapraid-8.1-windows-x64.zip 25e5cffade3667348a242f44fb23719328d578010d79bb28a5cab662fc75916b snapraid-8.1-windows-x86.zip dff5f4e9a41865313ddd60b6379d5c0b308880d33f197934f98313e8241c6274 snapraid-9.0.tar.gz 624c3aa6cb0bdb7c90566545ca831721ea5e543c843418a00ff4de753af07953 snapraid-9.0-windows-x64.zip 6ace6dafacd902bdf058e42c7d39591e327aef1bb19a94b05496f0f14aca8e1e snapraid-9.0-windows-x86.zip 397fdd7709e941e372b37025457794f8b0ce63a5a8455703ad17770cbccd3823 snapraid-9.1.tar.gz 4c56b2c5d556a3685239e444cb58ce84c398e86a173be34ff7cfa3a2b31a5b34 snapraid-9.1-windows-x64.zip 515ca2078cdcb58b59afc005770a06648d8f17adb27afa5751ca6f68de2c05c6 snapraid-9.1-windows-x86.zip 77de90645a5debd177995d7897d58277b7c778632f0d9852740f5670f3321176 snapraid-9.2.tar.gz 483d96dc8937f6df48b7f454f8ec8f7ee51b5e973fa8f004e59048d60525d2fb snapraid-9.2-windows-x64.zip 99c950ff31c73cc55a1b83e4dfdbb6e1717420af54721f8bbe813fbbba484e04 snapraid-9.2-windows-x86.zip 61c4f3ce8bd5ebb1178fe76ab5933e90c4cead6dba31669f11e262d258c2b2ba snapraid-9.3.tar.gz 178e743b6246265f936e63ab47fe2a942bf414992cd752478854b81bdf264913 snapraid-9.3-windows-x64.zip 2cb888833cdddc82431822f818de0cfd046ceda5a7aa17bf9c410b6147ed7e20 snapraid-9.3-windows-x86.zip f7dcf19480256fc2c1db9ab976aa12f786e76da6044cc397f0451524e8031ad6 snapraid-10.0.tar.gz a3b4b2563f44f17072bb20963d61aae53d9f0e6b9446509fee76bbfa9b51fd23 snapraid-10.0-windows-x64.zip 95a1859163beb8c8d02208b27ecf5298068972498c7e2b99b488693ad5f8f133 snapraid-10.0-windows-x86.zip 30a72b8853ea750128c96784b73bb55f7faa4b16367b2e03f40c1f78515c5771 snapraid-11.0.tar.gz af6f24adb81008e7ccdb7a8f2c46d1187542bd290294563de90acf5d817d772d snapraid-11.0-windows-x64.zip fedc7591c8de0ce2775482e6b18033cdaca62078a0a16d45421d5fb5dd5615d6 snapraid-11.0-windows-x86.zip b9acafeb6cece61fd426f08362b596ba89eea0564231955b82156fd09c0e6884 snapraid-11.1.tar.gz 6468d1a55a9a8043eae3c7c292c908c0fbd1974af3f175df23d39dd4748d9bf9 snapraid-11.1-windows-x64.zip e70929b44ed88701b542abbccadc57dd89469f58cf7d6ca0bf80ce706d854553 snapraid-11.1-windows-x86.zip 735cdeb7656ac48cbb0b4a89a203dd566505071e465d5effbcc56bcb8fd3a0d7 snapraid-11.2.tar.gz 025faabb6390b6af600034523e5988e14160015b835541d8427475ca7fa52057 snapraid-11.2-windows-x64.zip de16e2083054f34e1206b552bd05c64218c0dffcf787d716c6639f8728457d20 snapraid-11.2-windows-x86.zip d35ad92157936db3411e2cf7325665fc59e2d159204f9424895cfa9f33122af1 snapraid-11.3.tar.gz b764a3341783d4694242412e0fca7c112e44e84a4a89a7c27b0f74a836a84baf snapraid-11.3-windows-x64.zip f8e51bee80ae0223f402afe68f5192f1036434bab816c42333bf2e5f9fbc82a2 snapraid-11.3-windows-x86.zip 1de47b8277c7dd9c339396efdd2b12a865ff82fdf6ab47cb945f2e21717451c9 snapraid-11.4.tar.gz 0734ca7a521ba7c05eea6898f481ca812d2a2d78da4545f7990cd27e6381dc75 snapraid-11.4-windows-x64.zip 061075df60b584ade5c76551ca54d76726441421576a544cdfd621acb23d55e1 snapraid-11.4-windows-x86.zip 1f5267261bdbcf4d48b9359ce67184df11905590739140f740327fb73bcecafa snapraid-11.5.tar.gz e18f6b825a25b71947c2c41a315440a3d394de348afca80e2ab13a525bbb8a2b snapraid-11.5-windows-x64.zip a66753201e55c115699df78f89dd562c1b71e876aba5be35fcaf507bfe1e9e52 snapraid-11.5-windows-x86.zip f030a3830449a78d10af41320da0be21c60f88dc8d328ebd056e0eb7596161cf snapraid-11.6.tar.gz 8a3b8fd240285b5abf62c3ce222a5c674b475a83b3c48a40e457d34bfbcd1744 snapraid-11.6-windows-x64.zip e8e9140423552cbccbe9a162100a830cd7d2e29bae0893cca9f5bd1943393508 snapraid-11.6-windows-x86.zip f07652261e9821a5adfbfa8dad3350aae3e7c285f42a6bd7d96a854e5bc56dda snapraid-12.0.tar.gz a9cd1e30042b09ecc42b508955a1c1144b446a0399c83ecfb78b5455d528938c snapraid-12.0-windows-x64.zip a037d16bb9d226da2c88df00e410f9e637f1acb6153ac078c9a3805e721282a6 snapraid-12.0-windows-x86.zip 49337d9bafa96c2beac0125463bd22622be2fc00f3b4dee7e4b0e864d2a49661 snapraid-12.1.tar.gz 23196a373b4c7a327a207f019ea833f888977f6e48743b0060706f67fbb1c13e snapraid-12.1-windows-x64.zip 488e3b57323fd55c1bccc14a051d4048a1a7b7b5d6440ece30b5161bda9f5498 snapraid-12.1-windows-x86.zip 9d30993aef7fd390369dcaf422ac35f3990e8c91f0fb26151f5b84ccb73d3e01 snapraid-12.2.tar.gz 1f08ee889b4e0d221267ad011cfbd6f3ebdf94a8809ba2b2d79dbb0751a7c06a snapraid-12.2-windows-x64.zip daaccc71a2b2cf3d16d021d0c1f7db20e49fbaebea5cda6c301bf41bce8df073 snapraid-12.2-windows-x86.zip 1f27aba6e5db3929474da9c472fc4a3bc51d4a83aa5385af6b09afc9f68d6d44 snapraid-12.3.tar.gz ffdd430f5f1ad8fba5bd0707bd860b0d3dca55cb8aeca633804638d64b5f0550 snapraid-12.3-windows-x64.zip 579d24cc607d0668e6f17c905eb75e409086a58f466c6fae2943c8e2fc8de039 snapraid-12.3-windows-x86.zip bc15ad9c42ddf9bd70033562a10e9b9fec43afed54c48fe22da4b6835657ec1b snapraid-12.4.tar.gz 5a5c398b2941fe0d0ede3dfbedaa2fd689dacc6c6d7f537dcd3f276d1c02af8d snapraid-12.4-windows-x64.zip 7f4153af7c9d270ce1e2dac8dc6921d8f284f99f6db1eb3a0ddc80ae1da4f0c3 snapraid-12.4-windows-x86.zip 0282a9eec3301cd608dc45d9182b6d207f9fd4d25828c9deb329a015c77cb4e2 snapraid-13.0.tar.gz e2f44b06d2065226e6d2b184f9bf046bb0ce5144a585eadb14f83e19c349cc86 snapraid-13.0-windows-x64.zip 1b83a31e5e0ad25701ad58779b125d194426e3f3715f1a51cf81c993c2921e4b snapraid-13.0-windows-x86.zip 59e10835c0397193cb27969852a51059f0b0b9abb6cec2353f3052f6bd18e85d snapraid-14.0.tar.gz 8a917bb29b19fb32ce59cd18d09059ac53b84df6a33da798e6f28f552099f4b4 snapraid-14.0-1-x86_64.pkg.tar.zst 264f66d3092a47c64439fb3d2bded6ce4ec0b3cbc5b5c1f4f3c1ac8bf05a4767 snapraid-14.0-1.x86_64.rpm 59b8b09e20a5937e0cd2798b1256eefa1cd27bd3f1c24b5e4dee32e6b25c1553 snapraid-14.0-windows-x64.zip b6a144161e7240c754947d5ea4f637f59006cbdaed68c2f285f440c257e7590e snapraid-14.0-windows-x86.zip b67183342cc4160891dfdf10452f1c79e71bb7887c54fcfb81cd2ded68b3bd37 snapraid-14.0-x86_64-1_am.txz b33e19558ad0f29f1c8d3907a772377f1125f19b44003db8b8df05cec46cd7c6 snapraid-14.1.tar.gz d0cb38415284e88cb6f7253ef8389aa207c3689e0276196808773bd37aeb6552 snapraid-14.1-1-x86_64.pkg.tar.zst a754c6acd9c0efd8de89b698ff7bf422299f30de222c99db42a597b21f272429 snapraid-14.1-1.x86_64.rpm 0bb740d84b446aafc87fb8f188cb87d1429a7c3243b9339633f8a237dfc2b987 snapraid-14.1-windows-x64.zip f796fc232bc578e9b3007e50dc543dcb9a8a9ab721eaf0b805a0e25c53e573e5 snapraid-14.1-windows-x86.zip a15c366093e7184b72e51797fcf6429858374810c35694a0c7fb9cb044c5f7ff snapraid-14.1-x86_64-1_am.txz 57da8c813b12dd91bfa5b145b7529f84e227a301394da109fa64f39479c14a1b snapraid-14.2.tar.gz 79c91f03ee8153bd4e1be734ef45778eaf2aa77d2166d6bc7e69ddff8e3c6937 snapraid-14.2-1-x86_64.pkg.tar.zst 7ec5671902a84f806e263372edb98baa4be8a181158515a998deb4b842c974dd snapraid-14.2-1.x86_64.rpm ea9f459c132cdeeda22f0a51d06cf2d926acfc816d742c4f8d05f0c8de6c3539 snapraid-14.2-windows-x64.zip a1ae6ed8851e60092fc61a6b2bcceef0404d3f0e1d41bc6ed129980ff24da1b9 snapraid-14.2-windows-x86.zip f11c3279a2d32d39743826da2cd6abdaa213fa402ecfbfe093dfeed2e1ba032c snapraid-14.2-x86_64-1_am.txz 29cb416eda9beac436c2994543938c01f28555a11a24dedfe102677c9669080a snapraid-14.3.tar.gz b9d1745ebd6afde38a3f33ae1f2066f1e2adf57877565e15c2f92a21dd6102db snapraid-14.3-1-x86_64.pkg.tar.zst 2580344b374a5f8a12504ded8063d5f94984bd8249a1b62c2f5fb6068a2d8334 snapraid-14.3-1.x86_64.rpm 223dc51189ab4b9d11a2cd47c39190b4fb22f3b515b75975fe6123fddb6d6fea snapraid-14.3-windows-x64.zip 48df1f810271d93a4bc2665fb145ec1225320990db4d9558c67152ab8bcd4b4d snapraid-14.3-windows-x86.zip 04da63b992fbaa961ed0060245947b9090abcedb569ec79c1bf012ca0050e1a1 snapraid-14.3-x86_64-1_am.txz 941467eb69a055028a68484c83aef6b193808914729ab3d3efe0cfd47c2352ab snapraid-14.4.tar.gz 743edf67d2bb6657220da1262cf0ebd1ff871ae87c816bcaf2568de80eeef66c snapraid-14.4-1-x86_64.pkg.tar.zst bf01ff0956adf0b489f8d85a18146e2450827c96f58087ce699113888c46194e snapraid-14.4-1.x86_64.rpm 5ed9868d263f98978fde7d6a559afd38d0c4ddc85fd753c46e8e11799518c92b snapraid-14.4-windows-x64.zip 64b7499bee20515bf57f2ffcef14a0b1e9c2ba19f0bf897fe8e8fd2f4d2bacbe snapraid-14.4-windows-x86.zip 6de85b1703df0cd30bbbab9ef2cf27d444e97a3c202442ef677f0f484187672c snapraid-14.4-x86_64-1_am.txz ccbbf089134a2963147aeaa535911ad1868a2786daf54786d633837d4130da54 snapraid-14.5.tar.gz 8621b7115a30d488c86665d20d6c4c8c99f0018103dba6bcac52b0dee4832c30 snapraid-14.5-1-x86_64.pkg.tar.zst 239b9f546e84f9c2db160688164af9339f1a1252e8573eab16cb9fd225ee19af snapraid-14.5-1.x86_64.rpm 52aed58e0802d65f2e5c543f620958ea03f3c2ec5098874085685b581ef94dad snapraid-14.5-windows-x64.zip 573c0460388e9ceae8b30726cf88c97d3012e223e9781dd71e67231e3b6b54dc snapraid-14.5-windows-x86.zip bfdf468f9a5df195e1cfb51ef423d61866470efb16c0e734f82c009865258bc4 snapraid-14.5-x86_64-1_am.txz 056f86b4f69265692d15d742ea7427804ef2e873aec4263425abb138be86fb08 snapraid-14.6.tar.gz 0c5ed569aab38586539cfc8fa148190b025e89418c8accdc22004716246c3d9b snapraid-14.6-1-x86_64.pkg.tar.zst ebbae62aabadb02813441662256197fb37bf785b0e7b31a9c10261b523b031f0 snapraid-14.6-1.x86_64.rpm bbac43675a18a0b465cbc519cf047b395c873caa736f48749b26dc40777d20e5 snapraid-14.6-windows-x64.zip e58f1b5859c52c289e06508f297c9a98d8cddb4ca67b8ac210ad4d2696b468f5 snapraid-14.6-windows-x86.zip dce1bfd86784484c709a9e0fce0a8a22a8201793f8b5ca8734e766022ad05b54 snapraid-14.6-x86_64-1_am.txz fe4c71d444bade85fe390d2a58de1ea34b53109278b96fb19bc9ac9133eb07ff snapraid-14.7.tar.gz eaac4391c89650c7fe9fd263a31533bbf6d06b0c28eb4ee21590e9472aaa5f79 snapraid-14.7-1-x86_64.pkg.tar.zst 4be9f5f41ba744870b9315e7d3e7e162d74f280a20f669b63dfbdc7bb819f91e snapraid-14.7-1.x86_64.rpm dce8b1345b04cf99ec8fc41fd0c5ed9ea38e64050077a7fb12a03b21e35deef9 snapraid-14.7-windows-x64.zip 3ff33a921ac22672eb8267eb5c52721fbd3de35fb2bb373a6056ba4281a800b4 snapraid-14.7-windows-x86.zip e0d8178b2d6b4ab8302001eddd10f09bbbdf744020bff2f0576b405a0c96e294 snapraid-14.7-x86_64-1_am.txz 128b5b0f80a6a0911e77ed3b5d9d81529f5ea1d8fffbb5112e3af3467d80464a snapraid_14.0-1_amd64.deb b9c41ae2e8edbc413abd3172b7ed2da2cba7fa0e631d0f47fc1dafccf7c6e92c snapraid_14.1-1_amd64.deb e6456b926bb053d34645e31e5e3d8363e952c9869e873eb348abb1149598d331 snapraid_14.2-1_amd64.deb bfbec7200f96d6ce23bfd6ae43fb2764fe26c9480c5c478b3bb6bb90dd707a07 snapraid_14.3-1_amd64.deb 50863cc6067f23449ba67e0cae456d74a1eadf2a19612a70067bb4e7cc88131c snapraid_14.4-1_amd64.deb 3ff971ba7da0336e3f86fef7218437e680649abcbd6a60607aee946f7ac99695 snapraid_14.5-1_amd64.deb b71b556da4be6263a904fb8ac489933875467adbb920dd3911e54d87e9637ca3 snapraid_14.6-1_amd64.deb 35b156fc4d5c34339eed7e7d73e22a76e646879ecf6846b5ca20f7992ff55640 snapraid_14.7-1_amd64.deb snapraid-14.9/COPYING000066400000000000000000000006651522717156100143210ustar00rootroot00000000000000The SnapRAID project as a whole, including all its contributions and modifications to included libraries, is provided under the GPL-3.0-or-later License. The RAID library is provided under the GPL-2.0-or-later License. The TommyDS library is provided under the BSD-2-Clause License. The full text for these licenses is available in the LICENSES/ directory. All contributions to the SnapRAID project are subject to this COPYING file. snapraid-14.9/HISTORY000066400000000000000000001323111522717156100143440ustar00rootroot00000000000000SnapRAID HISTORY ================ 14.9 2026/07 ============ * Fix a regression when both the '--gui-touch-before' and '--gui-threshold' options are selected at the same time, which may prevent the thresholds from working correctly. Now, the content file is unconditionally saved before scanning for differences if any touch is performed. 14.8 2026/06 ============ * Avoid spinning up standby disks on Windows in some machines during the 'probe' and other device-monitoring commands. Direct system queries for disk properties, size, and geometry are now performed using zero-access handles. * Fixed the smartctl type detection retry during probe on Windows to properly preserve the standby check option, preventing standby disks from spinning up if a retry is needed. * Save the content file before aborting 'sync' due to safety thresholds if files were touched by '--gui-touch-before', preventing timestamp desynchronization and false diff reports on subsequent runs. 14.7 2026/06 ============ * Fix the 'touch' command on Windows for files with the read-only attribute. The read-only attribute is temporarily removed and then restored. No need to update if you are not on Windows. 14.6 2026/06 ============ * Fix stack overflow in deep directory trees on platforms with a small stack like Alpine. * Log errors as "fatal" only if the execution is stopped early. This ensures SnapRAID Daemon correctly identifies the alert level of each message (e.g., treating non-terminating issues as warnings). 14.5 2026/05 ============ * Support importing data from smartctl even when the disk reports incomplete information for attributes (e.g. missing norm, worst, or threshold values). * Log errors while SnapRAID scans the list of all files on a disk, so that the SnapRAID Daemon becomes aware of any I/O errors. * Fixed importing of the disk serial number from the SCSI Device Identification VPD page (also known as VPD Page 83h). * Various security improvements and memory leak fixes. 14.4 2026/04 ============ * Updated --gui-threshold-* logic to trigger on values equal to or greater than the threshold (previously only "greater than"). This enables setting the threshold to 1 to trigger it for a single case. This change is required by SnapRAID Daemon 1.8. 14.3 2026/04 ============ * On ARM64 (AArch64), replaced the inline assembly implementation of 128-bit multiplication with a `__uint128_t`-based version. This avoids potential miscompilations of the experimental MuseAir hash observed with aggressive compiler optimizations (e.g. -O2/-O3) on some toolchains (notably Apple Silicon), while still generating optimal code on modern compilers. * Fixed the speed computation of the undocumented -T option for the recovery functions. The reported values are now comparable to those of the generation functions. Note that the real speed is unchanged from the previous version, only the way it is measured has changed. 14.2 2026/04 ============ * Added a workaround for filesystems with a broken implementation of posix_fadvise() that returns unexpected error codes. This issue was specifically reported with the F2FS filesystem. This change is primarily intended for package maintainers who need to run "make check" on build servers that may use such filesystems. No update is required if you have not encountered an error message about failure to advise files. * Log the modification time of the content file in probe and other commands. This log entry is used by SnapRAID Daemon 1.6. 14.1 2026/03 ============ * Fixed include/exclude specification for directories. This is a regression bug in version 14.0. It is highly recommended to update. If you are using version 14.0 with include/exclude directives, simply run a new sync with this version to automatically resolve any potential issues. * Fixed a build issue in Alpine distribution. * Fixed abort condition if the Windows volume name cannot be converted to UTF-8. 14.0 2026/03 ============ * More log tags for all commands in preparation for the upcoming SnapRAID Daemon. Pre-release will be available at https://github.com/amadvance/snapraid-daemon. Note that this is the minimal SnapRAID version required to use the daemon. * New 'extra' config option to define additional disks to monitor with the 'probe' and 'smart' commands. This replaces the previous autodetection. * Introduced the 'relocated' file state to unify the previous 'copied/removed' logic. This new status specifically identifies files moved to a different path or disk with a new inode where the original has disappeared. * Added support for local exclusion rules via .snapraidignore files placed directly within the array directory tree. This allows for granular, directory-level control over which files and folders are excluded from parity, mirroring the workflow of .gitignore. * Added support for the ** globbing character to allow recursive pattern matching across multiple directory levels. * Fixed a crash on macOS when filesystem doesn't report UUID * Added a new locate command to map physical file offsets within the parity volume. This feature facilitates diagnostic analysis of the parity distribution. It supports the -t, --tail option to filter files located specifically at the end of the parity file [Ralf1108]. * Added new option `-W, --force-realloc-tail SIZE` for the `sync` command. This option works like `--force-realloc` but applies only to the specified tail portion (last SIZE bytes) of the parity file. Its main purpose and result is to shrink the size of the parity file by reclaiming unused space ("holes") that may exist in the parity due to previous fragmentation, allowing to compact the parity toward the beginning [Ralf1108]. * The -p / --plan option now accepts percentage values with decimal points (e.g. -p 1.5, -p 0.2) * Added detection of the smartctl executable. Improves reliability when running under sudo or in environments where /sbin and /usr/sbin are not in PATH. * Avoided saving the content file when it was not strictly necessary. * Added wear level percentage to the SMART report. * Added documentation of the tags used in the log file in the new snapraid_log manpage. * Added manual translations in multiple languages. * Added new undocumented options that affect the -T, --speed-test: --speed-test-period MS, specifies how many milliseconds to test each single feature in the speed test. Default 1000. --speed-test-disks-number DISKS, specifies how many disks to use in the speed test. Default 8. --speed-test-blocks-size KB, specifies the size of each block in kibibytes (1024) used in the speed test. Default 256. 13.0 2025/10 ============ * Added new thermal protection configuration options: - temp_limit TEMPERATURE_CELSIUS Sets the maximum allowed disk temperature. When any disk exceeds this limit, SnapRAID stops all operations and spins down the disks to prevent overheating. - temp_sleep TIME_IN_MINUTES Defines how long the disks remain in standby after a temperature limit event. After this time, operations are resumed. Defaults to 5 minutes. * Added a new "probe" command that shows the spinning status of all disks. * Added a new -s, --spin-down-on-error option that spins down all disks when a command ends with an error. * Added a new -A, --stats option for an extensive view of the process. * Fixed handling of command-line arguments containing UTF-8 characters on Windows, ensuring proper processing outside the Windows code page. * Removed the SMART attribute 193 "Load Cycle Count" from the failure probability computation, as its effectiveness in predicting failures is too dependent on the hard disk vendor. * Added a new "smartignore" configuration option to ignore specific SMART attributes. * Supported UUID in macOS [Nasado]. * Windows binaries built with gcc 11.5.0 using the MXE cross compiler at commit 8c4378fa2b55bc28515b23e96e05d03e671d9b90 with targets i686-w64-mingw32.static and x86_64-w64-mingw32.static and optimization -O2. 12.4 2025/01 ============ * Avoided a warning about function pointer conversion. No functional changes. 12.3 2024/01 ============ * Fixed potential integer overflow when computing the completion percentage. No effect on the functionality. * Documentation improvements. 12.2 2022/08 ============ * Fixed build issue with GLIBC 2.36 12.1 2022/01 ============ * Reduced stack usage to work in environments with limited stack size, like MUSL. * Increased the default disk cache from 8 MiB to 16 MiB. 12.0 2021/12 ============ * Parallel disk scanning. It's always enabled but it doesn't cover the -m option that still processes disks sequentially. 11.6 2021/10 ============ * The 'fix' and 'check' commands with the -e option now process the whole files that have bad blocks, and not only the blocks marked bad. This allows restoring the timestamp and printing the paths of processed files and the final state of the files like 'recovered' or 'unrecovered'. The previous behavior is available with the -b, --filter-block-error option. * Improved the speed of the filtering in 'fix' and 'check'. This phase happens after the "Selecting..." message [UhClem]. 11.5 2020/05 ============ * Removed the default -march=native to allow deployment in any machine. * Fixed typos [Andrea Gelmini]. 11.4 2020/05 ============ * Fixed build errors due to new gcc 10 default for -fno-common. * In fixing, if a parity is filtered out, don't attempt to recover its size, and proceed without it if missing. * Avoided unnecessary parity read when fixing the parity itself. This improves the 'fix' speed when a parity file is completely missing. * Removed a build warning about major/minor defined now in sys/sysmacros.h. 11.3 2018/11 ============ * Fixed handling of Linux devices that have multiple slaves. This affects the smart/list/devices/down commands [Valentin Hilbig]. * The 'list' command in verbose mode prints the full nanosecond timestamp precision. * After writing content files, also sync their directory. * Fixed an invalid time computation that could result in future scrub dates. Such dates are fixed automatically at the next scrub or sync. 11.2 2017/12 ============ * Fixed recognition of NTFS hardlinks. They behave differently than standard Unix hardlinks and this could result in SnapRAID reporting internal inconsistency errors for detecting links to the same file with different metadata attributes. * More efficient 'pool' command that updates only the links that need to be updated. This ensures that no change is done, avoiding triggering a directory rescan of other programs. * In Linux, use by default the advise "discard" mode instead of "flush". This avoids swapping out the other process memory, leaving the system more responsive. * Changed the fallocate() use to work better with Btrfs with parity disks. * Changed the --test-io-stats screen to print the file name in process for each disk. 11.1 2017/05 ============ * Fixed the check command to correctly ignore errors on unused parity. This was broken in version 9.0. * Allowed increasing the number of parity splits of existing parity. * Fixed quoting when printing in Linux. This fixes the UTF-8 screen output. Windows version was not affected. * Fixed recognition of 'hashsize' in the configuration file. The previous incorrect 'hash_size' is still supported for backward compatibility. * Fixed building in platforms that don't provide major/minor definitions in sys/types.h. * When creating 'pool' symbolic links, set their time as the linked files. * Added support for the Windows 10 symbolic link unprivileged creation, using SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE. * Windows binaries built with gcc 4.9.4 using the MXE cross compiler at commit ae56efa2b23a793b0146508bfef33027cdb09fd2 with targets i686-w64-mingw32 and x86_64-w64-mingw32 and optimization -O2. 11.0 2016/11 ============ * Added support for splitting the parity in multiple partitions. You can now specify multiple files for a single parity. As soon as a file cannot grow anymore, the next one starts growing. In the configuration file, just put more files in the same 'parity' line, separated by , (comma). Note that if this feature is used, the saved content file won't be read by older SnapRAID versions. In Windows, 256 MB are left free in each disk to avoid the warning about full disks. * Added a new 'hashsize' configuration option. It could be useful in systems with low memory, to reduce the memory usage. Note that if this feature is used, the saved content file won't be read by older SnapRAID versions. * In Linux, added the missing support for Btrfs file-systems. Note that to have full support you need also the 'libblkid' library, otherwise you won't get the UUIDs. * In screen messages, don't print the disk directory in file path. You can control the format with the test option: --test-fmt file|disk|path. * In Windows, allows using the escape char '^' to handle file patterns containing real characters matching the globbing '*?[]' ones. In Unix it was already possible to do the same escaping with '\'. * Added a new -R, --force-realloc option to reallocate all the parity information keeping the precomputed hash. This is the previous -F, --force-full that instead now maintains the same parity organization and just recomputes it. * Added test options for selecting the file advise mode to use: --test-io-advise-none for standard mode --test-io-advise-sequential advise sequential access (Linux/Windows) --test-io-advise-flush flush cache after every operation (Linux) --test-io-advise-flush-window flush cache every 8 MB (Linux) --test-io-advise-discard discard cache after every operation (Linux) --test-io-advise-discard-window discard cache every 8 MB (Linux) --test-io-advise-direct use direct/unbuffered mode (Linux/Windows) The new default mode is 'flush' in Linux (before it was 'sequential'), and 'sequential' in Windows (like before). * For Seagate SMR (Shingled Magnetic Recording), ignore the SMART attribute Command_Timeout 188 as not reliable. * Fixed running in Windows platforms that miss the RtlGenRandom() function. * Added the --test-io-cache=1 option to disable the multi-thread IO mode. 10.0 2016/02 ============ * Boosted the speed of the 'sync' and 'scrub' commands with a new multi-thread implementation. It uses one thread for each disk, dedicated exclusively to read-ahead data and parity and to write-behind parity. This maximizes the data throughput keeping disks always busy. You can control the number of blocks to cache with the option --test-io-cache=NUMBER, where the number is between 3 and 128. The default is 8 MiB of blocks. You can show run-time stats during the process with the --test-io-stats option. You will see a graph with the number of cached blocks, and a graph with the wait time percentage for all the disks and computations. * The -h, --pre-hash option saves the content file only after having verified all the hashes. This allows recovery of moved files in case a silent error is found during the hash verification check. * Allowed using the -d, --filter-disk option in the 'up' and 'down' commands. * Allowed running the 'smart' command without a configuration file. In such case it operates on all the disks of the machine. * In the configuration file 'data' is now a synonym of 'disk'. * Added the 'touch' command intended to arbitrarily set all the zero sub-second timestamps. This improves the SnapRAID capabilities to identify files. The 'status' command recommends running 'touch' if required. * Restored the functionality of the -D, --force-device option when used to work around the use of the same disk for two logical data drives when running the 'fix' command. * Used correct shell quoting in the example commands that involve files. * The minimum Windows version supported is now Windows Vista. This is required to use the native Windows thread support for the new multi-thread implementation. If you need to run on Windows XP, you have to stick with SnapRAID 9.x. 9.3 2016/01 =========== * Fixed an invalid assumption in the copy detection mechanism that could result in an internal inconsistency, and with the impossibility to run the 'sync' and 'diff' commands. This was triggered by a very specific pattern of identical files. At least three of them, with one already in the parity, and at a higher disk number than the others that should be instead new ones. This had no bad effect, if not preventing the 'sync' command to run. A workaround was to just run 'sync' one time with the -N, --force-nocopy option to disable the copy detection. * Restored the -O2 optimization option for Windows binaries, as -Og has a too big performance penalty. 9.2 2016/01 =========== * Fixed support for symlinks pointing to an empty target. Before they were only partially supported, and their presence could result in a content file not readable. This also disables multi-thread content write, as this was the issue we tried to detect with this feature, and it doesn't provide a performance advantage. Content verification is instead still multi-threaded. * Autorename disks using the matching UUID. To rename a disk you can now change directly the name in the configuration file, and run a 'sync' command. * Improved the physical offset ordering for the Btrfs file-system, correctly detecting files that have no physical offset, for whatever reason. * Added UUID support to Btrfs file-systems. It's present only if the 'libblkid' development library is available on the system. Usually this requires installing the libblkid-dev or libblkid-devel package. * Added a new --no-warnings option to disable some repetitive warnings that could be annoying to power users. * Improved the error reporting, printing a complete stack trace, that can be used to track down bugs more easily. For this reason the Windows binaries are now built with optimization option -Og, instead of -O2. 9.1 2015/11 =========== * Fixed a bug when reading a content file with a deleted entry bigger than 4 GB. This was a regression introduced in version 9.0 that could result in the impossibility to read a valid content file, after a deletion of a file bigger than 4 GB in the array. If this happened to you, just upgrading to 9.1 fixes the issue, and it allows you to continue to work. Note that this bug only prevented running 9.0, but your data was still protected and could have been recovered using the versions 8.1 or 9.1. * In Windows, disabled the file zero check requiring the --force-zero option. This check is intended for possible cases using ext3/4 in Linux, and there is no evidence that in Windows it's possible at all. * Windows binaries built with gcc 4.9.3 using the MXE cross compiler at commit 62bcdbee56e87c81f1faa105b8777a5879d4e2e with targets i686-w64-mingw32 and x86_64-w64-mingw32 and optimization -O2. 9.0 2015/11 =========== * Fixed an invalid assumption that could happen when using the -e, --filter-error option with "fix" or "check". This was triggered by a very specific pattern of fragmented files and bad blocks combination, not so easy to reproduce. This had no bad effect, if not preventing the command to run. * Drastically reduced the memory usage. For each block, it now uses 17 bytes of memory, instead of the previous 28 bytes (for 32 bit) or 36 bytes (for 64 bit). This could result in a memory saving of up to 50%. * The -p, --plan option (old --percentage) can be used to define a scrub plan: "new", "bad" and "full". The "new" plan scrubs all the new synced blocks not yet scrubbed. This allows verifying as early as possible that the written parity during sync is really correct. You can use the "status" command to show the amount of blocks not yet scrubbed. The "bad" plan scrubs only bad blocks. The "full" plan scrubs all blocks. * The graph in the "status" command now shows scrubbed blocks with '*', and synced, but not yet scrubbed, blocks with 'o'. Note that when upgrading from a previous version, all blocks are assumed scrubbed the first time. * Content files are now written asynchronously from different threads to avoid the unfortunate condition that a memory error affects all of them in the same way. After writing, they are read again to verify their CRC. This is done to ensure that they are really OK, even in the case of the worst possible silent errors. * Extended the -D, --force-device option to ignore more erroneous conditions in the 'fix' command, like inaccessible disks, or disks sharing the same physical device. * Extended the -d, --filter-disk option to allow filtering also by parity disk. * Extended the -h, --pre-hash option to also verify moved and copied files into the array before running a 'sync'. * Updated 'best' RAID functions for recent Atom CPUs. * Validated filter specifications rejecting relative paths. 8.1 2015/05 =========== * Fixed build issues in generic Unix platforms, including Mac OS X. * The "diff" command returns with error code 2 if a "sync" is required, to differentiate it from the generic error code 1. * Reduced the effect of SMART attribute 193 on the failure probability to avoid some false positive reports. 8.0 2015/04 =========== * Allowed "sync" and "scrub" to continue after the first bunch of disk errors. Blocks with errors are marked as bad, and you can fix them with the "fix -e" command. The fix is expected to force the disk firmware to reallocate the bad sector, likely fixing the problem. You can control the number of allowed errors with the new -L, --error-limit option. The default is 100. * The -e, --filter-error option doesn't write fixes to unsynced files anymore. This helps in case you are running it on a not synced array, removing the risk to revert some files to an old state. * The -e, --filter-error option is now optimal and reads only the minimal amount of data necessary to fix the errors. * The "diff" command returns with an error code if a "sync" is required. * Added new "smart" command to print a SMART report of the array. * Added new "up" and "down" commands to spin up and down the disks of the array. * Added new "devices" command to print the devices associations in the array. * Changed the log handling. If no log file is specified, all the warnings and non-fatal error messages go to stderr. If a log file is specified, only fatal error messages are printed on the screen. You can control the amount of informative messages on stdout with the -q, --quiet and -v, --verbose options, that can be specified multiple times to be more quiet or verbose. * In the "status" command the "Wasted" column now shows a negative number for the amount of space that you can still waste without filling up the parity. * In the "status" and other commands we now use GB instead of GiB, when referring to disk space. * Renamed the -s and -t options to -S and -B as they are intended to be manual only operations. * Windows binary built with gcc 4.8.1 using the MXE cross compiler 2.23, with targets i686-w64-mingw32 and x86_64-w64-mingw32. Before the x86 target was i686-pc-mingw32. 7.1 2015/01 =========== * In 'scrub' and 'sync' detects and reports Input/Output errors separately from generic file system errors. * In 'diff' doesn't print the "add" entry if a "copy" one is already printed. * Fixed build with old compilers in the x64 platforms [Leigh Phillips]. * Fixed out-of-dir builds [Christoph Junghans]. 7.0 2014/11 =========== * In 'check' and 'fix' the array is scanned to find any moved files that could be used to recover missing data. Files are identified by time-stamp, and then they are recognized also if moved to a different disk. Note that even if there are false positives they are identified checking the hash, so they have no effect, besides making the process a little slower. To disable this new behavior you can use the -N, --force-nocopy option. * The -i, --import command now identifies files by time-stamp making it very fast in importing directories. * More detailed 'status' report with single disk stats and free space available. * A lot faster directory listing for Windows. * Added AVX2 support to improve parity generation speed. * Prints the time spent waiting for each disk also in 'scrub'. * The CPU usage, speed and ETA estimations are now based on the last 100 seconds rather than from the start. * Keeps track of the UUID of the parity disks to check them before operating. * Windows binary built with gcc 4.8.1 using the MXE cross compiler 2.23. 6.4 2014/11 =========== * Added support for the new binary format of SnapRAID 7.0. This allows downgrading from version 7.0 to 6.x or previous. 6.3 2014/7 ========== * The -N, --force-nocopy option now also works if you used previous "sync" commands without it. * In 'sync' keeps stats about the amount of time spent waiting for each disk and what is spent in CPU computation. * Auto-excluded the lock file. * A more precise counting of how many blocks to scrub. Now it's exact regardless of the order of the blocks timing. * Doesn't print the 'UUID set' message anymore because it's the normal condition for empty disks. * In Windows, if the disk doesn't support reading physical offsets, allows SnapRAID to continue anyway. * Added a new -F, --force-full option that forces a full sync reusing the hash data present in the content file. 6.2 2014/5 ========== * Fixed the regression test when run as root. * Added a new heuristic to detect file copies. Now a file is assumed to be a copy if name, size and nanosecond time-stamp are matching, but if the nanosecond part of the time-stamp is 0, it requires the full path matching and not only the name. * Added the -N, --force-nocopy option to disable completely the copy detection. SnapRAID also suggests using this option in the error message of a data mismatch if likely caused by the copy detection. 6.1 2014/4 ========== * Fixed build and regression test in Mac OS X. 6.0 2014/3 ========== * In "sync", even if a silent error is found, continue to update the parity if it's possible to correct the error. Note that the block will be marked bad, and the data will be fixed only at the next "fix -e" call. But any new data added will be protected if you are using enough parity to fix both the silent error and at least another potential error. * Detected copied files from one disk to another and reused the already computed hash information to validate them in "sync". Files are assumed copied if they match the name, size and time-stamp. * For "sync", added a new -h, --pre-hash option to run a preliminary hashing step for all the new files to ensure detecting silent errors caused by the heavy machine usage of the parity computation. * In "fix", if a previous fixing attempt was made resulting in a .unrecoverable file, uses this file as starting point for the new attempt. * In the log file name, allows the use of the '>>', %D, %T modifiers to select append mode, and to insert the date and time in the name. * The options -p, --percentage and -o, --older-than now keep their default value even if the other one is specified. * Moved the .lock file in the same dir of the first specified content file. This avoids spinning up the parity disks in all commands. * The "diff", "list", "dup", "status" and "pool" commands don't access the parity disks anymore that can now stay powered down. * The default configuration file in Windows is now searched in the same directory where the snapraid.exe file resides. * New source code organization. The RAID engine is now an external component usable also in other projects. 5.3 2014/3 ========== * Doesn't warn about UUID changed if it's for an empty disk. * Fixed the number of blocks that scrub has to process when selecting a high percentage of the array. * Removed duplicate recovery attempts in synced state. 5.2 2013/12 =========== * If a disk changes UUID, automatically disable the inode recognition, because this is likely a new file-system with all the inodes reassigned, and we don't want to risk a false positive when searching for inode/time-stamp/size. * Allowed running a fix command with disks that don't need to be fixed mounted as read-only. * After a failed sync, always reallocates new files with a not yet computed parity to ensure minimizing the parity usage, if some other file is deleted in the meantime. * Doesn't count empty dirs as files in the diff counters. * Added a new "share" configuration option to allow sharing in the network the pool directory also in Windows. * Fixed build problems in OpenBSD due to the old assembler. * Fixed build problems in platforms different than x86. 5.1 2013/12 =========== * Fixed a potential crash if a file is deleted during a "sync/scrub". This is a problem introduced in version 5.0 due to new logging. If it happened to you to have a crash in sync, you don't need to take any special action, just run "sync" again. * Restored the functionality of -C, --gen-conf command. * Prints the files with duplicate physical offset if the -v, --verbose option is specified. 5.0 2013/11 =========== * Added support for up to six levels of parity. * Added a specific and faster triple parity format for CPUs that don't support SSSE3 instructions like ARM and AMD Phenom, Athlon and Opteron. * Faster RAID5 and RAID6 implementation for ARM 64 bit CPUs. * If a silent error is found during a "sync" command, directly marks the block as bad like in "scrub", without stopping the "sync" process. * Sorted files by inode when listing the directory. This improves the scanning performance. * For files with changes only in some blocks, updates the parity only for blocks that really are changed. This improves the performance in sync for modified files. * Added a new "list" command to see the stored list of files. * Removed the detailed list of errors from the screen output. To get it you must explicitly use the -l, --log option. It's now too detailed for the screen, because it contains a lot of info. * Changed the output format of some commands to make it similar to the new "list" one. * Reduced memory usage removing some unnecessary allocations. * Added a memory test on the memory buffers used in sync, scrub, check, fix before using them. 4.4 2013/10 =========== * Relaxed the check about small parity files, to allow recovering after a failed sync before resizing the parity files. 4.3 2013/10 =========== * Fixed the scrub command with the -p0 option. Now it really scrubs only the blocks marked as bad and not the full array. 4.2 2013/10 =========== * Fixed the wrong warning about physical offsets not supported caused by files not having a real offset because too small. For example, in NTFS it's possible to store such files in the MFT. It's just a cosmetic change, and not a functional one. * Removed unexpected 'Restore' entries in the diff output when dealing with file-systems without persistent inodes like NTFS in Linux. * Added support for filenames containing newlines. This happens in Mac OS X. 4.1 2013/9 ========== * If the underlying file-system doesn't support the FIEMAP command, automatically fall back to use FIBMAP for sorting files. * Fixed the import of content files from previous versions of SnapRAID that are the result of an incomplete sync. * Added a new -C, --gen-conf option to generate a dummy configuration file from the info in the content file. Just in case that you lose everything, except the content file. * At the end of sync/scrub/check/fix prints "Everything OK" if no error was found. This should make clear that everything is really OK. 4.0 2013/9 ========== * New 'scrub' command to periodically check the oldest blocks for silent errors without the need to scan the whole array. * New 'status' command to check the fragmentation, the last check time distribution, and the silent error status of the array. * Added the new Spooky hash. It's faster in 64 bit architectures. To convert you can use the new 'rehash' command. * Changed to a binary content file to improve speed and reduce size. * Removed the --find-by-name, -N option. Now it always searches by name if a file is not found searching by inode, automatically reassigning inodes in restored files without needing to sync again the file. This happens only if the file has the same path, size and timestamp at nanosecond precision. * Added a hash seed to make harder intentional collision attacks. * When inserting files for the first time, sort them by their physical address to improve read performance. * Optimized the cache use for all the RAID computations. This improves a lot the RAID performance. * Better selection of the RAID6 implementation for different CPUs. * Added RAID5/RAID6 mmx and sse2 implementations with unrolling by 4. They are a little faster than the previous unroll by 2. * Added a lock file to avoid multiple running instances on the same array. The file is named as parity file adding the .lock extension. There is also the undocumented --test-skip-lock to avoid checking it. * Automatically ignores, with warning, mount points inside the array directory tree. * Changed the 'dup' output format to include the size of each duplicate file. 3.2 2013/7 ========== * Fixed a directory creation problem in Windows when the "disk" option points to the root directory of a drive. Now SnapRAID won't complain about the inability to create such directory. If you encounter this problem when trying to recover your data, just upgrade to this version, and you'll be able to complete the recovering process. No need to upgrade for platforms different than Windows. 3.1 2013/5 ========== * Direct use of Windows API for disk access to improve error reporting. * If the 'fix' process is aborted, it removes all the new files partially recovered, to allow reusing again the -m, --filter-missing flag. * In Windows don't exclude system files anymore. Only system directories are excluded. * In Windows applies filters in case insensitive way. * The Windows binaries are now built with gcc 4.7.2. * Reduced memory occupation for hardlinks and directories. * In 'dup' don't list files with 0 size. 3.0 2013/3 ========== * Added pooling support with the new 'pool' command. It creates a virtual view of the array using symbolic links pointing to the original files. * Added a new -m, --filter-missing option that allows undeleting files, without checking/fixing the others. * Added a new -i, --import option to automatically import deleted files when fixing. * Added a new -l, --log option to save to disk the detailed log. * Added support for hardlinks and empty directories. * Added support to save symlinks to files in Windows. Note that only the symlink is saved and not the linked file. Note that Windows Symlinks to dirs and junctions are still not supported. * Files without read permission generate an error instead of a warning. You now must explicitly exclude them in the configuration file with exclusion rules. * In 'check' and 'fix', if verbose is enabled, prints the result for each processed file. * Added a UUID check to detect when a disk is replaced, and to prevent unwanted disk swaps. 2.1 2013/1 ========== * Checks for wrong empty fields in the configuration file. * Filter rules for files are not applied to directories anymore. 2.0 2012/12 =========== * Added a new -a option to make the 'check' command only check file hashes without checking the parity data. * Added a new -d option to filter by disk name. * The file modification time is now saved using nanosecond precision. This allows restoring the exact modification time in 'fix'. The new 'content' files written with this version are not backward compatible, but it's still possible to read the old format. * Fixed hard-links automatic exclusion. All the hardlinks after the first one are now correctly ignored. * If it isn't possible to grow a parity file, prints the list of files outside the maximum size allocated. * Autosave isn't triggered if we are near the end of the 'sync' process. * Before starting a 'sync', we wait for two seconds, to work around the FAT limitation of having two seconds modification time precision. This is a safe measure to be 100% sure to always detect file changes. * Always fill the memory after allocating it to avoid the OOM (Out Of Memory) killer in Linux. * Fixed compilation in Solaris/OpenIndiana for lacking both futimes() and futimens(). * Now 'sync' ensures that the parity files are not too small to contain the just loaded data. * Removed the '-H,--filter-nohidden' option. It doesn't make sense to have it as command line option. You must use the 'nohidden' option in the configuration file. * When opening files in read-only mode, also specify the noatime flag, to avoid updating the file access time. * Exclude rules for files are now also applied to directories. This allows excluding some file/directory without the need to call the stat() function on them. * The -N, --find-by-name option also ignores the nanosecond part of timestamps to work with copy programs not supporting nanoseconds. * Fixed deduplicated files handling in Windows Server 2012. * Removed MD5 support. 1.13 2012/11 ============ * Fixed a Segmentation Fault when checking/fixing if there are three or more errors in a specific block. 1.12 2012/9 =========== * Fixed file renaming in Windows during a 'fix' command. This is a Windows only issue, no reason to upgrade for other platforms. 1.11 2012/7 =========== * Fixed again directories inclusion. Exclusion rules for directories were ignored. 1.10 2012/6 =========== * Fixed directory inclusion, in case the last rule is an "include" one. * Fixed very long paths in Windows. We now always use the special '\\?' prefix to remove the 260 chars limitation. * If a file is excluded, it prints explicitly which attribute caused the exclusion. * Automatically excludes also the temporary copy of content file, the one with the ".tmp" extension. * Avoids Windows going in automatic sleep mode when running. 1.9 2012/3 ========== * Implemented a more sophisticated recovery in case a harddisk failure happens during a 'sync' command. When using RAID6 it improves the chances of recovering data with partially computed parity, after an aborted 'sync'. * Fixed the count of new files. * Added a new 'autosave' configuration option to save the intermediate 'sync' state. * Supported file-systems with read requests returning less data than requested. * In Windows ensures that the disk serial number is not zero. 1.8 2012/1 ========== * Added a new "dup" command to find all the duplicate files. * Added a new option "--filter-nohidden" to exclude hidden files. * Faster and parallel writing of content files. * The example configuration files now put the content files in the data disks instead of in the parity disks. * Added a checksum at the content file to ensure its integrity. * Using fallocate() instead of posix_fallocate() to avoid the very slow posix_fallocate() fall back of writing the whole file. 1.7 2011/11 =========== * If a file is modified or removed during a sync, the sync process doesn't stop anymore, but it will simply skip the file, resulting in an incomplete sync. Note that the sync will terminate with an error. * If the content file is placed in a data disk, it's automatically excluded from the sync process. * Increased by one the minimum number of content files. Before it was only a suggestion, but now it's a requirement because you are allowed to put content files in data disks. * Added checks to ensure that data and parity disks are different, and to correctly count the number of copies of "content" files in different disks. * Removed the dependency of the "disk" order specification in the configuration file. The used order is now saved in the content file to avoid damaging the dual parity in case the order is changed by the user. It easily allows removing or adding disks from the array when using a dual parity. * Improved the "fix" performance when a lot of files or the parity have to be recreated from scratch. * When getting unrecoverable errors, the printed log line now starts with "unrecoverable:" instead of "error:" to allow an easier identification. * Added a new option "--find-by-name" to allow syncing using only the file path and not the inode. This is useful to avoid long sync when you replace one disk with another copying manually the files. * If "fix" cannot recover a file, it's renamed adding the ".unrecoverable" extension. * Checking and fixing also empty files with size 0. 1.6 2011/9 ========== * The content file is now saved also at the start of the "sync" command. This avoids parity errors if the sync process is aborted without saving the content file and you made changes at the disk array before another "sync" command was done. More specifically, deletions or truncations of not yet synced files after the aborted sync, and before the next sync command, may have damaged the parity data. New file additions were instead safe. If these conditions may have happened to you a "check" command (also with older versions of the program) is recommended to ensure the correctness of your parity data. * The "diff" command now recognizes the reuse of inodes. * Windows hidden files are now saved like any other files. * Symbolic links are now saved in *nix. Not supported in Windows. * The "fix" command restores also the original modification time. * The message asking to use the --force-empty option now lists all the empty disks. 1.5 2011/7 ========== * Ignores extra spaces in the configuration file. * Changed the output of check/fix to allow a more easy post-processing with other tools like awk and sort. * Added the hidden option -G/--gui to enable the output of progress information for a potential GUI for SnapRAID. * Added a new "diff" command to print the list of changes detected at file level. * Faster loading of content file. Approx three times faster. 1.4 2011/6 ========== * Ignoring in sync System and Hidden files in Windows. * Files without read permission are ignored in sync. * If a file is ignored a warning message is printed. You have to exclude it to remove the warning. * In fixing, if a file cannot be written for missing permission, an error is reported only if a write is effectively required. * Ignores any symbolic links. They are not saved. 1.3 2011/5 ========== * Fixed the restore of directories with unicode chars in Windows. * Fixed support of file names starting or ending with a space. * Removes files before inserting new ones to minimize the parity size. 1.2 2011/5 ========== * Fixed use of file names out of the codepage in Windows. All the names are now stored in UTF8 in the content file. 1.1 2011/5 ========== * Fixed a bug in the check command when detecting garbage data over the expected end of the file. The parity data was anyway computed correctly, and no special action is required to update. * Changed the default checksum to Murmur3 hash. It's a lot faster than MD5. You can check its speed with the "snapraid -T" command. MD5 is still supported for backward compatibility. To convert to the new Murmur3 hash, simply remove the 'content' file, and start a new complete 'sync'. * Added RAID6 support. It's used the very good RAID6 library made by H. Peter Anvin also used in the Linux Kernel. It contains optimized implementations for SSE2 and MMX. * Added support for multiple 'content' files. You can save extra copies to be able to verify the checksums also if you lose all the 'content' files in the parity disks. * Added a filtering include logic, where anything not explicitly included is excluded. For example, it allows including only the files in a predefined set of directories. * The check command returns with an error code if any kind of error is present. Previously it was returning an error only if unrecoverable errors were present. * Opening the files in sequential mode in Windows. This should give a speedup in Windows. * In Windows you can use the backslash \ in the filter definitions instead of the forward slash /. 1.0 2011/4 ========== * No relevant change. 0.4 2011/4 ========== * Added hidden 'dry' command mainly for speed measurement. * As default, uses the OpenSSL crypto MD5 implementation. 0.3 2011/4 ========== * Added --filter option to select a subset of files in check and fix. * Better ETA estimation in all the commands. * Added support for OpenSSL crypto library to use its optimized MD5 implementation. * Added test vectors and a speed test for MD5. 0.2 2011/3 ========== * Second public test release of SnapRAID. * Functionally complete in check and fix. * Files are identified by inode and not anymore by name. * Exclusion list of files and directories. * Precise error management. * More regression tests. 0.1 2011/3 ========== * First public test release of SnapRAID. snapraid-14.9/INSTALL000066400000000000000000000016121522717156100143100ustar00rootroot00000000000000SnapRAID INSTALL ================ To build and install SnapRAID, download the source code from http://www.snapraid.it and unpack it with the following commands: tar xf snapraid-.tar.gz cd snapraid-* To configure the build environment and compile the binary, run: ./configure --prefix=/usr --sysconfdir=/etc make To run the application's correctness tests, execute: make check If the tests complete with "Success", install the application and documentation using: sudo make install Note: The SnapRAID application does not require root privileges to run, but you may need appropriate permissions to access the disks. To start using SnapRAID, modify the example configuration file snapraid.conf.example to suit your needs and copy it to /etc/snapraid.conf. For additional guidance, refer to the "Getting Started" section in the SnapRAID manpage by typing: man snapraid snapraid-14.9/INSTALL.windows000066400000000000000000000005431522717156100160030ustar00rootroot00000000000000SnapRAID INSTALL for Windows ============================ To start using SnapRAID, you need to modify the example configuration file snapraid.conf.example to suit your requirements. After editing, save it as snapraid.conf in the same directory where you run snapraid.exe. For additional guidance, refer to the "Getting Started" section in snapraid.txt. snapraid-14.9/LICENSES/000077500000000000000000000000001522717156100144645ustar00rootroot00000000000000snapraid-14.9/LICENSES/BSD-2-Clause000066400000000000000000000024301522717156100163670ustar00rootroot00000000000000Copyright (c) 2010, Andrea Mazzoleni. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. snapraid-14.9/LICENSES/GPL-2.0000066400000000000000000000432551522717156100153370ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. snapraid-14.9/LICENSES/GPL-3.0000066400000000000000000001045131522717156100153330ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . snapraid-14.9/Makefile.am000066400000000000000000001442041522717156100153200ustar00rootroot00000000000000bin_PROGRAMS = snapraid check_PROGRAMS = mktest mkstream checker AM_CPPFLAGS = -DSYSCONFDIR="\"${sysconfdir}\"" if HAVE_DISK_ARBITRATION snapraid_LDFLAGS = -framework CoreFoundation -framework DiskArbitration mktest_LDFLAGS = -framework CoreFoundation -framework DiskArbitration mkstream_LDFLAGS = -framework CoreFoundation -framework DiskArbitration endif # Windows if HOST_WINDOWS snapraid_LDADD = resource_res.o resource_res.o: cmdline/resource.rc cmdline/resource.manifest $(WINDRES) --include-dir=. --include-dir=$(srcdir) $< -o $@ CLEANFILES = resource_res.o endif snapraid_SOURCES = \ raid/raid.c \ raid/check.c \ raid/module.c \ raid/tables.c \ raid/int.c \ raid/x86.c \ raid/intz.c \ raid/x86z.c \ raid/helper.c \ raid/memory.c \ raid/test.c \ raid/tag.c \ tommyds/tommy.c \ cmdline/main.c \ cmdline/snapraid.c \ cmdline/io.c \ cmdline/bw.c \ cmdline/util.c \ cmdline/stream.c \ cmdline/support.c \ cmdline/elem.c \ cmdline/state.c \ cmdline/scan.c \ cmdline/sync.c \ cmdline/check.c \ cmdline/dry.c \ cmdline/rehash.c \ cmdline/scrub.c \ cmdline/status.c \ cmdline/dup.c \ cmdline/list.c \ cmdline/pool.c \ cmdline/parity.c \ cmdline/locate.c \ cmdline/handle.c \ cmdline/touch.c \ cmdline/device.c \ cmdline/selftest.c \ cmdline/speed.c \ cmdline/import.c \ cmdline/search.c \ cmdline/thermal.c \ cmdline/mingw.c \ cmdline/unix.c noinst_HEADERS = \ raid/raid.h \ raid/helper.h \ raid/internal.h \ raid/cpu.h \ raid/gf.h \ raid/combo.h \ raid/memory.h \ raid/test.h \ tommyds/tommyarray.h \ tommyds/tommyarrayblkof.h \ tommyds/tommychain.h \ tommyds/tommyhash.h \ tommyds/tommyhashdyn.h \ tommyds/tommylist.h \ tommyds/tommytree.h \ tommyds/tommytypes.h \ tommyds/tommyarray.c \ tommyds/tommyarrayblkof.c \ tommyds/tommyhash.c \ tommyds/tommyhashdyn.c \ tommyds/tommylist.c \ tommyds/tommytree.c \ cmdline/portable.h \ cmdline/snapraid.h \ cmdline/io.h \ cmdline/bw.h \ cmdline/util.h \ cmdline/stream.h \ cmdline/support.h \ cmdline/elem.h \ cmdline/state.h \ cmdline/parity.h \ cmdline/locate.h \ cmdline/handle.h \ cmdline/murmur3.c \ cmdline/murmur3test.c \ cmdline/spooky2.c \ cmdline/spooky2test.c \ cmdline/metro.c \ cmdline/metrotest.c \ cmdline/museair.c \ cmdline/museairtest.c \ cmdline/import.h \ cmdline/search.h \ cmdline/thermal.h \ cmdline/mingw.h \ cmdline/unix.h mktest_SOURCES = \ cmdline/mktest.c \ cmdline/mingw.c \ cmdline/unix.c \ cmdline/support.c mkstream_SOURCES = \ cmdline/mkstream.c \ cmdline/mingw.c \ cmdline/unix.c \ cmdline/support.c \ cmdline/util.c \ cmdline/stream.c \ raid/memory.c # Checker binary share the snapraid variables, with the exception of the checker.c source checker_SOURCES = $(snapraid_SOURCES:cmdline/snapraid.c=cmdline/checker.c) checker_LDFLAGS = $(snapraid_LDFLAGS) checker_LDADD = $(snapraid_LDADD) # Add the .version file in the distribution dist-hook: $(srcdir)/autover.sh > $(distdir)/.version LANG_CODES = de es fr it ja ko pl pt ro ru sv uk zh LIST_D = doc/snapraid.d doc/snapraid_log.d $(patsubst %, doc/snapraid-%.d, $(LANG_CODES)) LIST_MAN = doc/snapraid.1 doc/snapraid_log.1 $(patsubst %, doc/snapraid-%.1, $(LANG_CODES)) LIST_TXT = doc/snapraid.txt doc/snapraid_log.txt $(patsubst %, doc/snapraid-%.txt, $(LANG_CODES)) LIST_XML = doc/snapraid.xml doc/snapraid_log.xml $(patsubst %, doc/snapraid-%.xml, $(LANG_CODES)) EXTRA_DIST = \ autogen.sh autover.sh \ README AUTHORS HISTORY INSTALL BLUEBOX TODO CHECK INSTALL.windows \ COPYING LICENSES/GPL-2.0 LICENSES/GPL-3.0 LICENSES/BSD-2-Clause \ $(LIST_D) \ $(LIST_MAN) \ $(LIST_TXT) \ test/test-par1.conf \ test/test-par2.conf \ test/test-par3.conf \ test/test-parz.conf \ test/test-par4.conf \ test/test-par5.conf \ test/test-par6.conf \ test/test-par6-hole.conf \ test/test-par6-noaccess.conf \ test/test-par6-rename.conf \ test/test-par6-thermal.conf \ snapraid.conf.example \ cmdline/resource.rc \ cmdline/resource.manifest \ configure.windows-x86 configure.windows-x64 snapraid.conf.example.windows \ acinclude.m4 \ raid/test/Makefile \ raid/test/fulltest.c \ raid/test/selftest.c \ raid/test/speedtest.c \ raid/test/invtest.c \ makeslackware.sh.in \ makeslackdist.sh.in \ pkg/snapraid.SlackBuild.in \ pkg/snapraid.info.in \ pkg/slack-desc \ makedeb.sh.in \ pkg/control.in \ makerpm.sh.in \ pkg/snapraid.spec.in \ makearch.sh.in \ makearchdist.sh.in \ pkg/.PKGINFO.in \ pkg/PKGBUILD.in \ pkg/.SRCINFO.in man1_MANS = doc/snapraid.1 doc/snapraid_log.1 clean-local: rm -f valgrind.log callgrind.log cachegrind.log rm -rf bench rm -f test*.log output.log stream*.bin rm -f cmdline/*.gcda cmdline/*.gcno cmdline/*.gcov rm -f raid/*.gcda raid/*.gcno raid/*.gcov rm -f tommyds/*.gcda tommyds/*.gcno tommyds/*.gcov rm -f lcov.info rm -f gmon.out rm -f makeslackware.sh makeslackdist.sh pkg/snapraid.SlackBuild pkg/snapraid.info makedeb.sh pkg/control makerpm.sh pkg/snapraid.spec maintainer-clean-local: rm -f $(LIST_MAN) rm -f $(LIST_TXT) rm -f $(LIST_XML) rm -f snapraid-*.txz snapraid_*.deb snapraid-*.rpm snapraid-*.tar.zst snapraid-*.zip snapraid-*.tar.gz rm -f snapraid.src.tar.gz snapraid.tar.gz # Install localized manpages install-data-hook: for lang in $(LANG_CODES); do \ mkdir -p $(DESTDIR)$(mandir)/$$lang/man1; \ $(INSTALL_DATA) $(srcdir)/doc/snapraid-$$lang.1 $(DESTDIR)$(mandir)/$$lang/man1/snapraid.1; \ done @echo "" @echo "==================================================================" @echo " $(PACKAGE_NAME) installation complete!" @echo "==================================================================" @echo "" @if test -z "$(DESTDIR)"; then \ if test ! -f /etc/snapraidd.conf -a ! -f $(sysconfdir)/snapraid.conf; then \ echo "Configuration:"; \ echo " 1. Create your configuration file:"; \ echo " cp $(docdir)/snapraid.conf.example /etc/snapraid.conf"; \ echo " 2. Edit /etc/snapraid.conf to match your setup."; \ echo ""; \ echo "=================================================================="; \ fi; \ fi # Uninstall localized manpages uninstall-hook: for lang in $(LANG_CODES); do \ rm -f $(DESTDIR)$(mandir)/$$lang/man1/snapraid.1; \ rmdir --ignore-fail-on-non-empty $(DESTDIR)$(mandir)/$$lang/man1 2>/dev/null || true; \ rmdir --ignore-fail-on-non-empty $(DESTDIR)$(mandir)/$$lang 2>/dev/null || true; \ done # Automatic testing # Common options # --test-skip-device # Is required to allow testing in the same disk # # --test-skip-self # It just makes the test a little faster # # --test-io-advise-none # Keep data in the page cache to speedup the test CHECKFLAGS_COMMON = --test-skip-device --test-skip-self --test-force-progress --no-warnings --test-parity-limit=3333333 --test-io-advise-none # --test-force-order-alpha # Ensures to process files always in the same order despite # the inode, physical location, and dir order assigned by the OS. CHECKFLAGS_ALPHA = $(CHECKFLAGS_COMMON) --test-force-order-alpha # Physical offset options CHECKFLAGS_PHYSICAL = $(CHECKFLAGS_COMMON) --test-force-order-physical -q -q -q # Verbose options CHECKFLAGS_VERBOSE = $(CHECKFLAGS_ALPHA) -v --gui # Quiet options CHECKFLAGS = $(CHECKFLAGS_ALPHA) -q -q -q # Number of files to create if !HAVE_MEMORY_CHECKER if HAVE_POSIX CHECKCOUNT = 1000 else CHECKCOUNT = 500 endif else CHECKCOUNT = 500 endif # Size of files to create if !HAVE_MEMORY_CHECKER CHECKSIZE = 4000 else CHECKSIZE = 100 endif CONF = $(srcdir)/test/test-par6.conf THERMAL = $(srcdir)/test/test-par6-thermal.conf HOLE = $(srcdir)/test/test-par6-hole.conf NOACCESS = $(srcdir)/test/test-par6-noaccess.conf RENAME = $(srcdir)/test/test-par6-rename.conf PAR1 = $(srcdir)/test/test-par1.conf PAR2 = $(srcdir)/test/test-par2.conf PAR3 = $(srcdir)/test/test-par3.conf PARZ = $(srcdir)/test/test-parz.conf PAR4 = $(srcdir)/test/test-par4.conf PAR5 = $(srcdir)/test/test-par5.conf PAR6 = $(srcdir)/test/test-par6.conf MSG = @echo ===== SNAPRAID = ./checker$(EXEEXT) fastcheck: mktest rm -rf bench rm -f test.log mkdir bench mkdir bench/disk1 mkdir bench/disk2 mkdir bench/disk3 mkdir bench/disk4 mkdir bench/disk5 mkdir bench/disk6 mkdir bench/pool $(MSG) Stream $(TESTENV) $(SNAPRAID) --test-skip-device -H $(TESTENV) $(SNAPRAID) --test-skip-device -V $(TESTENV) $(SNAPRAID) test $(MSG) Create some files $(TESTENV) ./mktest$(EXEEXT) generate 1 6 $(CHECKCOUNT) $(CHECKSIZE) echo DUP > bench/disk1/DUP1 echo DUP > bench/disk1/DUP2 echo -n > bench/disk1/ZERO $(MSG) Some commands with a not empty array $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_COMMON) -c $(CONF) --test-expect-need-sync diff > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_COMMON) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) dup -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) list -l test.log > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) test-rewrite $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) read $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -a check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) test-dry $(MSG) Regression test completed with SUCCESS! $(MSG) Please ignore any error message printed above, they are expected! $(MSG) Everything OK check-local: rm -rf bench rm -f test.log mkdir bench mkdir bench/disk1 mkdir bench/disk2 mkdir bench/disk3 mkdir bench/disk4 mkdir bench/disk5 mkdir bench/disk6 mkdir bench/pool $(MSG) Stream $(TESTENV) ./mkstream$(EXEEXT) if HAVE_THREAD_CHECKER #### THREAD TEST #### $(MSG) Create some files $(TESTENV) ./mktest$(EXEEXT) generate 1 6 $(CHECKCOUNT) $(CHECKSIZE) $(MSG) Some commands that use threads # First sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync # Remove, move and add some more rm bench/disk4/a/9* rm bench/disk5/a/9* rm bench/disk6/a/9* mv bench/disk1/a/9* bench/disk4/a mv bench/disk2/a/9* bench/disk5/a mv bench/disk3/a/9* bench/disk6/a $(TESTENV) ./mktest$(EXEEXT) change 2 500 bench/disk2/b/* bench/disk3/b/* # Sync again $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync # Other commands that uses threads $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) test-rewrite $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) scrub -p full $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) scrub -p full --test-io-cache 3 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) scrub -p full --test-io-cache 128 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync -F --test-io-cache 1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) scrub -p full --test-io-cache 1 else #### COMMAND LINE #### $(MSG) Pre test $(TESTENV) $(SNAPRAID) --test-skip-device -H $(TESTENV) $(SNAPRAID) --test-skip-device -V $(TESTENV) $(SNAPRAID) test $(TESTENV) ./mktest$(EXEEXT) if !HAVE_MEMORY_CHECKER if HAVE_EMULATOR $(MSG) Speed # Run the self test in AVX2 $(TESTENV_AVX2) $(SNAPRAID) --test-skip-device -c $(CONF) status # Run the speed test in different architectures $(TESTENV_SSE2) $(SNAPRAID) --test-skip-device -T $(TESTENV_SSSE3) $(SNAPRAID) --test-skip-device -T $(TESTENV_SSE42) $(SNAPRAID) --test-skip-device -T $(TESTENV_AVX2) $(SNAPRAID) --test-skip-device -T else # Run the self test natively $(TESTENV) $(SNAPRAID) --test-skip-device -c $(CONF) status # Run the speed test natively $(TESTENV) $(SNAPRAID) --test-skip-device -T endif endif #### EMPTY #### $(MSG) Some commands with empty array $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) diff $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) dup $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) list > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status -l ">&1" $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status -l ">&2" $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status -l ">>test.log" $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status -l test-%D-%T.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) up $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) down -d parity -d disk1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) devices $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) probe --test-fake-device $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) probe --test-fake-device -s $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) smart --test-fake-device --test-expect-failure if HAVE_POSIX $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) pool endif $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -a check #### CONTROLLED #### $(MSG) Filesystem allocation test dd bs=1 count=8192 if=/dev/zero of=bench/disk1/TEST # Copy the file to trigger the copy optimization check cp -a bench/disk1/TEST bench/disk2/TEST $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync # Now delete the file, and do a partial sync to force a deallocation in the middle of a file rm bench/disk1/TEST $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -E -S 1 -B 1 sync # Now force a deallocation at the end $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -E -S 7 -B 1 sync rm bench/disk2/TEST # Have the sync to fail for empty disk $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync --test-expect-failure # Now sync will complete with -E $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -E sync $(MSG) Filesystem fragmentation test dd bs=1 count=8192 if=/dev/zero of=bench/disk1/TEST1 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/TEST2 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/TEST3 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/TEST4 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/TEST5 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/TEST6 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync # Now delete some files, and create a bigger one to fill the holes rm bench/disk1/TEST1 rm bench/disk1/TEST3 rm bench/disk1/TEST5 dd bs=1 count=65536 if=/dev/zero of=bench/disk1/TESTX $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync -l ">&1" rm -r bench/disk1/TEST* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -E sync # Now enforce copy detection of a file without parity # Create a file in a high number disk dd bs=1 count=8192 if=/dev/urandom of=bench/disk6/STEP1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync --bw-limit 1M # Create two new copies. The one in disk1 will copy # the hash from the one in disk6, and the one in disk2 # will copy the hash from the one in disk1, that # doesn't have parity cp -a bench/disk6/STEP1 bench/disk1/STEP1 cp -a bench/disk6/STEP1 bench/disk2/STEP1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync # Now create, duplicate, move and partial sync dd bs=1 count=8192 if=/dev/zero of=bench/disk1/INVA1 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/INVA2 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/INVA3 dd bs=1 count=8192 if=/dev/zero of=bench/disk1/MOVE1 cp -a bench/disk1/MOVE1 bench/disk1/MOVE2 cp -a bench/disk1/MOVE1 bench/disk1/MOVE3 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync mv bench/disk1/MOVE2 bench/disk2/MOVE2 mv bench/disk1/MOVE3 bench/disk3/MOVE3 dd bs=1 count=8192 if=/dev/zero of=bench/disk4/MOVE4 cp -a bench/disk1/INVA1 bench/disk1/EXTRA1 cp -a bench/disk1/INVA2 bench/disk1/EXTRA2 cp -a bench/disk1/INVA3 bench/disk1/EXTRA3 rm bench/disk1/INVA1 touch bench/disk1/INVA2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-kill-after-sync sync # Diff should report the need of a sync for invalid parity $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) --test-expect-need-sync diff $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status mv bench/disk2/MOVE2 bench/disk4/MOVE4 mv bench/disk3/MOVE3 bench/disk5/MOVE5 mv bench/disk4/MOVE4 bench/disk6/MOVE6 rm bench/disk1/EXTRA1 touch bench/disk1/EXTRA2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -E sync # Change UUID $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-fake-uuid sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### NOT EMPTY #### $(MSG) Create some files $(TESTENV) ./mktest$(EXEEXT) generate 1 6 $(CHECKCOUNT) $(CHECKSIZE) echo DUP > bench/disk1/DUP1 echo DUP > bench/disk1/DUP2 echo -n > bench/disk1/ZERO $(MSG) Some commands with a not empty array # Run a sync using physical offset $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_PHYSICAL) -c $(CONF) --test-expect-need-sync diff > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_PHYSICAL) -c $(CONF) sync # Now reset the array, as we normally test with alpha order and murmur3 rm bench/content bench/?-content # Now rebuild the array with alpha order and murmur3 and do some commands # Later we will convert it to spooky2 to test both hashes $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) --test-expect-need-sync diff > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-force-murmur3 --test-force-autosave-at 100 sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) dup -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) list -l test.log > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) test-rewrite $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) read $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status -l test.log if HAVE_POSIX $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) pool endif $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -a check $(MSG) Dry $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) test-dry # Thermal test $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(THERMAL) --test-fake-device test-dry $(MSG) Copy detection # Create a file and sync with it echo 123 > bench/disk1/COPY $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync # Corrupt and move it to another disk $(TESTENV) ./mktest$(EXEEXT) damage 1 1 1 bench/disk1/COPY mv bench/disk1/COPY bench/disk2/COPY # Now sync with failure as the data won't match. We have two points of failure, pre-hash and sync $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-expect-failure -h sync $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-expect-failure sync # Now sync with force-nocopy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --force-nocopy sync $(MSG) Nano touch -t 200102011234.56 bench/disk1/a/a* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) touch $(MSG) Check the --gen-conf command $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --gen-conf bench/content $(MSG) Filter $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) -d disk1 check > output.log if HAVE_POSIX # Only in real unix, as with MingW the * trigger path replacement # Like /b/a* -> B:/a* and SnapRAID then complain $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) -f \\*a -f a/ -f /b/a\\* check > output.log endif $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) --test-expect-failure -f . check > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) --test-expect-failure -f ./ check > output.log $(MSG) Delete some files and sync rm bench/disk4/a/9* rm bench/disk5/a/9* rm bench/disk6/a/9* $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) --test-expect-need-sync diff > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) sync -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Move some files, sync and check mv bench/disk1/a/9* bench/disk4/a mv bench/disk2/a/9* bench/disk5/a mv bench/disk3/a/9* bench/disk6/a $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(CONF) --test-expect-need-sync diff > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check #### MORE FILES #### $(MSG) Create some more files, hardlinks and empty directories, delete others, sync PAR1 and check rm bench/disk4/a/8* rm bench/disk5/a/8* rm bench/disk6/a/8* $(TESTENV) ./mktest$(EXEEXT) generate 2 6 $(CHECKCOUNT) $(CHECKSIZE) mkdir bench/disk1/empty1 mkdir bench/disk2/empty2 mkdir bench/disk3/empty3a mkdir bench/disk3/empty3a/emptyinner mkdir bench/disk3/empty3b echo TARGET1 > bench/disk1/target1 ln bench/disk1/target1 bench/disk1/file_hardlink1 ln bench/disk1/target1 bench/disk1/file_hardlink2 ln bench/disk1/target1 bench/disk1/file_hardlink3 if HAVE_POSIX ln -s bench/disk1/target1 bench/disk1/file_symlink1 ln -s bench/disk1/target1 bench/disk1/file_symlink2 ln -s bench/disk1/target1 bench/disk1/file_symlink3 endif $(FAILENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) --test-expect-need-sync diff > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-skip-fallocate -c $(PAR1) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-io-advise-none -c $(PAR1) sync -F --test-io-cache 1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-io-advise-sequential -c $(PAR1) sync -F --test-io-stats $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-io-advise-flush -c $(PAR1) sync -F --test-io-cache 1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-io-advise-flush-window -c $(PAR1) sync -F $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-io-advise-discard-window -c $(PAR1) sync -F $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-io-advise-direct -c $(PAR1) sync -F #### CHANGE LINKS #### # Use a different size ("22" instead of "1") to ensure to recognize the file different # even if it gets the same timestamp in case subsecond timestamp is no available echo TARGET22 > bench/disk1/target2 rm bench/disk1/file_hardlink1 ln bench/disk1/target2 bench/disk1/file_hardlink1 if HAVE_POSIX rm bench/disk1/file_symlink1 ln -s bench/disk1/target2 bench/disk1/file_symlink1 endif $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) --test-expect-need-sync diff > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) sync -l ">&1" $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) check -l ">&1" #### MISC COMMANDS #### $(MSG) Some commands with a not empty array $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) dup $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) list --test-fmt file > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) list --test-fmt disk > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) list --test-fmt path > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) locate --test-fmt file > output.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) -c $(PAR1) locate -t 10K --test-fmt path > output.log if HAVE_POSIX $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) pool endif $(MSG) Extend PAR1 to max parity with fix and check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(CONF) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) fix -d 2-parity -d 3-parity -d 4-parity -d 5-parity -d 6-parity -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check -l ">&1" $(MSG) Fix with unaccessible parity and disk $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(NOACCESS) fix --test-expect-failure $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(NOACCESS) fix --force-device --test-expect-recoverable -l test.log $(MSG) Rename a disk $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(RENAME) --test-match-first-uuid sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-match-first-uuid sync #### SCRUB #### $(MSG) Scrub some times $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-force-scrub-at 100 scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-force-scrub-at 1000 scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-force-scrub-at 100000 scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status #### SYNC WITH RUNTIME CHANGE #### $(MSG) Modify files during a sync echo RUN > bench/disk1/RUN-RM $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "rm bench/disk1/RUN-RM" --test-expect-failure sync echo RUN > bench/disk1/RUN-CHMOD if HAVE_POSIX # Doesn't run this test as root because the root user override permissions if test "$$EUID" -ne 0; then \ $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "chmod a-r bench/disk1/RUN-CHMOD" --test-expect-failure sync; \ fi endif echo RUN > bench/disk1/RUN-SIZE $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "echo RUNRUN > bench/disk1/RUN-SIZE" --test-expect-failure sync echo RUN > bench/disk1/RUN-TOUCH $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "touch -t 200001011200 bench/disk1/RUN-TOUCH" --test-expect-failure sync echo RUN > bench/disk1/RUN-INODE cp -p bench/disk1/RUN-INODE bench/disk1/RUN-INODE-COPY $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "mv bench/disk1/RUN-INODE-COPY bench/disk1/RUN-INODE" --test-expect-failure sync rm bench/disk1/RUN-CHMOD rm bench/disk1/RUN-SIZE rm bench/disk1/RUN-TOUCH rm bench/disk1/RUN-INODE echo HASH > bench/disk1/HASH-RM $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "rm bench/disk1/HASH-RM" --test-expect-failure -h sync echo HASH > bench/disk1/HASH-CHMOD if HAVE_POSIX # Doesn't run this test as root because the root user override permissions if test "$$EUID" -ne 0; then \ $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "chmod a-r bench/disk1/HASH-CHMOD" --test-expect-failure -h sync; \ fi endif echo HASH > bench/disk1/HASH-SIZE $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "echo HASHHASH > bench/disk1/HASH-SIZE" --test-expect-failure -h sync echo HASH > bench/disk1/HASH-TOUCH $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "touch -t 200001011200 bench/disk1/HASH-TOUCH" --test-expect-failure -h sync echo HASH > bench/disk1/HASH-INODE cp -p bench/disk1/HASH-INODE bench/disk1/HASH-INODE-COPY $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-run "mv bench/disk1/HASH-INODE-COPY bench/disk1/HASH-INODE" --test-expect-failure -h sync rm bench/disk1/HASH-CHMOD rm bench/disk1/HASH-SIZE rm bench/disk1/HASH-TOUCH rm bench/disk1/HASH-INODE $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### SILENT ERRORS #### $(MSG) Silently corrupt some files, scrub and fix filtering for error. Test scrub patterns. $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) ./mktest$(EXEEXT) damage 1 1 1 bench/disk1/a/* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-expect-recoverable -p full scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) fix -e $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --percentage bad scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --plan 1.5 scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -o 0 scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -p full scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -p new scrub $(MSG) Silently corrupt some files, and sync with error presents $(TESTENV) ./mktest$(EXEEXT) write 2 1 1 bench/disk1/a/* $(TESTENV) ./mktest$(EXEEXT) damage 3 1 1 bench/disk2/a/* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-expect-recoverable sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status # Note that this fix -e command doesn't fix all the errors because # only the blocks touched by the sync are marked bad $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) fix -e $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check --test-expect-recoverable $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) fix $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -p full scrub $(MSG) Full sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -F sync $(MSG) Realloc partial/full sync # Full realloc to compact the parity $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --force-realloc sync cat bench/parity.* > bench/saved-parity-before # Create a big file dd bs=1024 count=1024 if=/dev/urandom of=bench/disk1/REALLOC1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync cat bench/parity.* > bench/saved-parity-first-file # Create another big file dd bs=1024 count=1024 if=/dev/urandom of=bench/disk1/REALLOC2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync cat bench/parity.* > bench/saved-parity-second-file # Now remove the first one creating a hole rm bench/disk1/REALLOC1 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --tail 10k locate cat bench/parity.* > bench/saved-parity-hole # Reallocate the second file $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --force-realloc-tail 10k sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --tail 10k locate cat bench/parity.* > bench/saved-parity-remove-hole # Remove also the second file rm bench/disk1/REALLOC2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --tail 10k locate cat bench/parity.* > bench/saved-parity-after # Adding files should grow the parity @ [ $$(wc -c < bench/saved-parity-before) -lt $$(wc -c < bench/saved-parity-first-file) ] || exit 1 @ [ $$(wc -c < bench/saved-parity-first-file) -lt $$(wc -c < bench/saved-parity-second-file) ] || exit 1 # Creating the hold should not change parity size @ [ $$(wc -c < bench/saved-parity-second-file) -eq $$(wc -c < bench/saved-parity-hole) ] || exit 1 # Removing the hole should return to the first file size @ [ $$(wc -c < bench/saved-parity-first-file) -eq $$(wc -c < bench/saved-parity-remove-hole) ] || exit 1 # Removing both files should return to initial parity size @ [ $$(wc -c < bench/saved-parity-before) -eq $$(wc -c < bench/saved-parity-after) ] || exit 1 #### SYNC PARTIAL #### $(MSG) Abort sync with additions. Delete some of them, and add others and sync again. $(MSG) This triggers files reallocation inside parity mkdir bench/disk1/c mkdir bench/disk1/d mkdir bench/disk1/e cp -pR bench/disk2/a/c* bench/disk1/c cp -pR bench/disk2/a/d* bench/disk1/d $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-kill-after-sync sync rm -r bench/disk1/c cp -pR bench/disk2/a/e* bench/disk1/e $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Abort sync with both deletions and additions. And delete and add some more and sync again. # Note that here we are depending of the previous state leaving dirs "d" and "e" mkdir bench/disk1/f cp -pR bench/disk3/a/f* bench/disk1/f rm -r bench/disk1/d $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-kill-after-sync sync mkdir bench/disk1/g cp -pR bench/disk4/a/g* bench/disk1/g rm -r bench/disk1/e $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check rm -r bench/disk1/f rm -r bench/disk1/g $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Make a hole in the disk array and sync with --force-empty mv bench/disk2 bench/disk2.old mkdir bench/disk2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --force-empty sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Use with the hole $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(HOLE) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(HOLE) check rm -r bench/disk1/a rm -r bench/disk3/a $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(HOLE) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(HOLE) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(HOLE) test-dry $(MSG) Fill the hole with a new disk rm -r bench/disk2 mv bench/disk2.old bench/disk2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Corrupt the content file $(TESTENV) ./mktest$(EXEEXT) write 1 100 100 bench/content $(FAILENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-failure -c $(CONF) sync rm bench/content #### AGAIN MORE FILES #### $(MSG) Delete some files, create some new, sync and check rm bench/disk1/a/1* rm bench/disk2/a/2* rm bench/disk3/a/3* rm bench/disk4/a/4* $(TESTENV) ./mktest$(EXEEXT) generate 3 6 $(CHECKCOUNT) $(CHECKSIZE) $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Move some files, sync and check mv bench/disk1/a/7* bench/disk1/b/ mv bench/disk2/a/7* bench/disk2/b/ mv bench/disk3/a/7* bench/disk3/b/ mv bench/disk4/a/7* bench/disk4/b/ $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check #### SNAPRAIDIGNORE echo "a*" > bench/disk1/a/.snapraidignore echo "b*" > bench/disk1/.snapraidignore echo "c/" > bench/disk1/.snapraidignore echo "/d/" > bench/disk1/.snapraidignore $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync if !HAVE_MEMORY_CHECKER #### RECOVER 1 #### $(MSG) Delete one disk, fix and check with PAR1 rm -r bench/disk3 mkdir bench/disk3 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR1) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### RECOVER 2 #### $(MSG) Delete two disks, fix and check with PAR2 rm -r bench/disk1 mkdir bench/disk1 rm -r bench/disk2 mkdir bench/disk2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR1) fix -l test-fail-strategy1.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR2) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### RECOVER 3 #### $(MSG) Delete three disks, fix and check with PAR3 rm -r bench/disk1 mkdir bench/disk1 rm -r bench/disk2 mkdir bench/disk2 rm -r bench/disk3 mkdir bench/disk3 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR2) fix -l test-fail-strategy2.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR3) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR3) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### RECOVER Z #### $(MSG) Compute PARZ - keeping PAR1 and PAR2 as they are $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PARZ) fix -d 3-parity -l test.log $(MSG) Delete three disks, fix and check with PARZ rm -r bench/disk3 mkdir bench/disk3 rm -r bench/disk4 mkdir bench/disk4 rm -r bench/disk5 mkdir bench/disk5 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PARZ) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PARZ) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### RECOVER 4 #### $(MSG) Delete four disks, fix and check with PAR4 rm -r bench/disk3 mkdir bench/disk3 rm -r bench/disk4 mkdir bench/disk4 rm -r bench/disk5 mkdir bench/disk5 rm -r bench/disk6 mkdir bench/disk6 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR3) fix -l test-fail-strategy3.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR4) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR4) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### RECOVER 5 #### $(MSG) Delete five disks, fix and check with PAR5 rm -r bench/disk1 mkdir bench/disk1 rm -r bench/disk2 mkdir bench/disk2 rm -r bench/disk3 mkdir bench/disk3 rm -r bench/disk5 mkdir bench/disk5 rm -r bench/disk6 mkdir bench/disk6 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR4) fix -l test-fail-strategy4.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR5) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR5) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### RECOVER 6 #### $(MSG) Delete six disks, fix and check with PAR6 rm -r bench/disk1 mkdir bench/disk1 rm -r bench/disk2 mkdir bench/disk2 rm -r bench/disk3 mkdir bench/disk3 rm -r bench/disk4 mkdir bench/disk4 rm -r bench/disk5 mkdir bench/disk5 rm -r bench/disk6 mkdir bench/disk6 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR5) fix -l test-fail-strategy5.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR6) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR6) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync endif #### MULTI STEP #### $(MSG) Delete some files and create some new, sync and check in multiple steps rm bench/disk1/a/4* rm bench/disk2/a/5* rm bench/disk3/a/6* rm bench/disk4/a/6* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -B 10 sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check -l test.log $(TESTENV) ./mktest$(EXEEXT) generate 4 6 $(CHECKCOUNT) $(CHECKSIZE) $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -B 100 sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -B 1000 sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Rehash to spooky2 and rehash even blocks $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-force-spooky2 rehash $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-force-scrub-even scrub $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) status $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Full sync to complete rehash $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -F sync $(MSG) Delete files from three disks and check/fix with import by data in PAR2 rm -r bench/disk1/a rm -r bench/disk2/a mv bench/disk3/a bench/a $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-import-content bench/a -c $(PAR2) fix -l test.log rm -r bench/a $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Delete files from three disks and check/fix with import by timestamp in PAR2 rm -r bench/disk1/a rm -r bench/disk2/a mv bench/disk3/a bench/a $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -i bench/a -c $(PAR2) fix -l test.log rm -r bench/a $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Delete files from three disks and check/fix with automatic import in PAR2 rm -r bench/disk1/a rm -r bench/disk2/a mv bench/disk3/a bench/disk1/a_from_disk3 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log rm -r bench/disk1/a_from_disk3 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync #### SYNC ABORT #### $(MSG) Abort sync late with additions, delete them and recover with PAR2 $(MSG) This triggers the recovering with q using p to check the validity cp -pR bench/disk1/a bench/disk1/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-kill-after-sync -c $(CONF) sync rm -r bench/disk1/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log rm -r bench/disk1/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Abort sync early with additions, delete them and recover with PAR2 $(MSG) This triggers the recovering with q using p to check the validity, but failing for new blocks being filled with zero cp -pR bench/disk1/a bench/disk1/a_copy # Ensure that there is at least one zero filled file dd bs=1 count=8192 if=/dev/zero of=bench/disk1/a_copy/ZERO_FILLED $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -B 1 --test-kill-after-sync -c $(CONF) sync rm -r bench/disk1/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR2) fix -l test-fail-earlysyncadd.log rm -r bench/disk1/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Abort sync late with additions with prehash and then delete the new additions and sync again cp -pR bench/disk1/a bench/disk1/a_copy cp -pR bench/disk2/a bench/disk2/a_copy cp -pR bench/disk3/a bench/disk3/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-kill-after-sync -c $(CONF) -h sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check rm -r bench/disk1/a_copy rm -r bench/disk2/a_copy rm -r bench/disk3/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Abort sync late with additions and then delete the new additions and sync again cp -pR bench/disk1/a bench/disk1/a_copy cp -pR bench/disk2/a bench/disk2/a_copy cp -pR bench/disk3/a bench/disk3/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-kill-after-sync -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check rm -r bench/disk1/a_copy rm -r bench/disk2/a_copy rm -r bench/disk3/a_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Abort sync late with additions and then delete some unchanged stuff and fix with PAR1 cp -pR bench/disk1/b bench/disk1/b_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) --test-kill-after-sync sync rm -r bench/disk2 mkdir bench/disk2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) fix -l test.log $(MSG) Fixes again to restore all the parity $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) fix -l test.log rm -r bench/disk1/b_copy $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(MSG) Abort sync late with more deletions than additions and then delete some unchanged stuff and fix with PAR1 cp -pR bench/disk1/a bench/disk1/a_copy mv bench/disk1/a bench/a mv bench/disk1/b bench/b $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) --test-kill-after-sync sync rm -r bench/disk2 mkdir bench/disk2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) fix -l test.log $(MSG) Fixes again to restore all the parity $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) fix -l test.log -rm -r bench/disk1/a -rm -r bench/disk1/b rm -r bench/disk1/a_copy mv bench/a bench/disk1/a mv bench/b bench/disk1/b $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Abort sync early with more deletions than additions and then delete some unchanged stuff and fix with PAR2 cp -pR bench/disk1/a bench/disk1/a_copy mv bench/disk1/a bench/a mv bench/disk1/b bench/b $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -B 1 --test-kill-after-sync sync rm -r bench/disk2 mkdir bench/disk2 $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR1) fix -l test-fail-earlysyncdel.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log -rm -r bench/disk1/a -rm -r bench/disk1/b rm -r bench/disk1/a_copy mv bench/a bench/disk1/a mv bench/b bench/disk1/b $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check #### RECOVER MISSING #### $(MSG) Delete some files, fix with -m and check with PAR1 rm bench/disk1/a/8* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR1) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) -m fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Delete some dirs in six disk, fix with -m and check rm -r bench/disk1/b rm -r bench/disk2/b rm -r bench/disk3/b rm -r bench/disk4/b rm -r bench/disk5/b rm -r bench/disk6/b $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR5) fix -l test-full5.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(CONF) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -m fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check #### RECOVER BY DISK #### $(MSG) Delete some dirs in two disks, fix and check with PAR2 using the -d option for each disk rm -r bench/disk2/b rm -r bench/disk5/b $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR1) check -l test-full1.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) -d disk2 fix -l test-part1.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) -d disk5 fix -l test-part2.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check #### RECOVER PARITY #### $(MSG) Delete the parity, fix and check with PAR1 rm bench/parity* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Delete the parity and the 2-parity, fix and check with PAR2 rm bench/parity* rm bench/2-parity* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Delete the parity and a disk, fix and check with PAR2 rm bench/parity* rm -r bench/disk2/b $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Delete the 2-parity and a disk, fix and check with PAR2 rm bench/2-parity* rm -r bench/disk3/a $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Corrupt the parity, fix and check with PAR1 $(TESTENV) ./mktest$(EXEEXT) write 1 100 10000 bench/parity* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR1) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) -a check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Corrupt the parity and the 2-parity, fix and check with PAR2 $(TESTENV) ./mktest$(EXEEXT) write 2 100 10000 bench/parity* $(TESTENV) ./mktest$(EXEEXT) write 2 100 10000 bench/2-parity* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR2) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) -a check $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check #### RECOVER FILES AND PARITY #### $(MSG) Corrupt some files, fix and check with PAR1 $(TESTENV) ./mktest$(EXEEXT) change 3 500 bench/disk2/b/* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR1) -a check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR1) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR1) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Corrupt some files, fix and check with PAR2 in verbose mode $(TESTENV) ./mktest$(EXEEXT) change 4 500 bench/disk2/b/* $(TESTENV) ./mktest$(EXEEXT) change 4 500 bench/disk3/b/* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) --test-expect-unrecoverable -c $(PAR1) check -l test.log > /dev/null $(TESTENV) $(SNAPRAID) $(CHECKFLAGS_VERBOSE) --test-expect-unrecoverable -c $(PAR1) fix -l test-fail-corrupt-verbose.log > /dev/null $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR2) -a check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR2) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Corrupt some files, fix and check with PAR2 $(TESTENV) ./mktest$(EXEEXT) change 5 500 bench/disk2/b/* $(TESTENV) ./mktest$(EXEEXT) change 5 500 bench/disk3/b/* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR1) check -l test-fail-corrupt-data.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR2) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Corrupt the parity and some files, fix and check with PAR2 $(TESTENV) ./mktest$(EXEEXT) write 6 100 10000 bench/parity* $(TESTENV) ./mktest$(EXEEXT) change 6 500 bench/disk1/a/* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-unrecoverable -c $(PAR1) check -l test-fail-corrupt-parity.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR2) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Corrupt the 2-parity and some files, fix and check with PAR2 $(TESTENV) ./mktest$(EXEEXT) write 7 100 10000 bench/2-parity* $(TESTENV) ./mktest$(EXEEXT) change 7 500 bench/disk1/a/* $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR1) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) --test-expect-recoverable -c $(PAR2) check -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(PAR2) fix -l test.log $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check $(MSG) Sync after all the fixes $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) sync $(TESTENV) $(SNAPRAID) $(CHECKFLAGS) -c $(CONF) check endif $(MSG) Regression test completed with SUCCESS! $(MSG) Please ignore any error message printed above, they are expected! $(MSG) Everything OK # Manual testing MANUAL = ./snapraid --test-skip-device -c test/test-par1.conf sync run: $(MANUAL) valgrind: valgrind \ --tool=memcheck \ --track-origins=yes \ --read-var-info=yes \ --leak-check=full \ -v $(MANUAL) \ 2> valgrind.log tail valgrind.log callgrind: valgrind \ --tool=callgrind \ --dump-instr=yes \ --trace-jump=yes \ --collect-systime=yes \ -v $(MANUAL) \ 2> callgrind.log tail callgrind.log cachegrind: valgrind \ --tool=cachegrind \ -v $(MANUAL) \ 2> cachegrind.log tail cachegrind.log heaptrack: /usr/local/heaptrack/bin/heaptrack $(MANUAL) perf: @trap 'perf report; exit 1' INT; perf record -g -- $(MANUAL) perfstat: perf stat -d -- $(MANUAL) perfmem: @trap 'perf mem report; exit 1' INT; perf mem record -- $(MANUAL) lcov_reset: lcov --directory . -z rm -f ./lcov.info lcov_capture: lcov --directory . --capture -o lcov.info lcov_html: rm -rf ./cov mkdir cov genhtml -o ./cov lcov.info # Rules for documentation if HAVE_ADVD2 %.1 : %.d advd2 man < $(srcdir)/$< > $@ %.txt : %.d advd2 txt < $(srcdir)/$< | todos > $@ %.html : %.d advd2 html < $(srcdir)/$< > $@ %.xml : %.d advd2 xml < $(srcdir)/$< > $@ endif # Web distribution web: $(LIST_XML) # Windows distribution DISTWIN = \ $(LIST_TXT) \ snapraid.exe distwindows-x86: $(DISTWIN) rm -f $(PACKAGE)-$(VERSION)-windows-x86.zip mkdir tmp cp $(DISTWIN) tmp cp support/smartctl.exe tmp/smartctl.exe todos < snapraid.conf.example.windows > tmp/snapraid.conf.example todos < README > tmp/readme.txt todos < AUTHORS > tmp/authors.txt todos < HISTORY > tmp/history.txt todos < BLUEBOX > tmp/bluebox.txt todos < LICENSES/GPL-3.0 > tmp/copying.txt cd tmp && zip -r ../$(PACKAGE)-$(VERSION)-windows-x86.zip * rm -r tmp distwindows-x64: $(DISTWIN) rm -f $(PACKAGE)-$(VERSION)-windows-x64.zip mkdir tmp cp $(DISTWIN) tmp cp support/smartctl.exe tmp/smartctl.exe todos < snapraid.conf.example.windows > tmp/snapraid.conf.example todos < README > tmp/readme.txt todos < AUTHORS > tmp/authors.txt todos < HISTORY > tmp/history.txt todos < BLUEBOX > tmp/bluebox.txt todos < LICENSES/GPL-3.0 > tmp/copying.txt cd tmp && zip -r ../$(PACKAGE)-$(VERSION)-windows-x64.zip * rm -r tmp snapraid-14.9/README000066400000000000000000000020331522717156100141350ustar00rootroot00000000000000SnapRAID ======== SnapRAID is a backup program designed for disk arrays, storing parity information for data recovery in the event of up to six disk failures. Primarily intended for home media centers with large, infrequently changing files, SnapRAID offers several features: * You can utilize disks already filled with files without the need to reformat them, accessing them as usual. * All your data is hashed to ensure data integrity and prevent silent corruption. * When the number of failed disks exceeds the parity count, data loss is confined to the affected disks; data on other disks remains accessible. * If you accidentally delete files on a disk, recovery is possible. * Disks can have different sizes. * You can add disks at any time. * SnapRAID doesn't lock in your data; you can stop using it anytime without reformatting or moving data. * To access a file, only a single disk needs to spin, saving power and reducing noise. For more information, please visit the official SnapRAID site: https://www.snapraid.it/ snapraid-14.9/TODO000066400000000000000000000452711522717156100137600ustar00rootroot00000000000000SnapRAID TODO ============= This is the list of TODO items for SnapRAID. - Next * Use a memory mapped file to read the content file * Integration with MergeFS ? * Evaluate use of syscall getdents64() instead of readdir(): https://linux.die.net/man/2/getdents64 * Check Reliability Test https://github.com/linuxhw/SMART https://github.com/linuxhw/EnterpriseDrive * Support BTRFS subvolumes. Keep track of the subvolumeid, along with the inode, and use it when searching/comparing inodes. The value 0 can be used for the root volume, like a normal filesystem. See: https://github.com/kdave/btrfs-progs/tree/master/libbtrfsutil Check also that other tools are doing: See: https://github.com/automorphism88/snapraid-btrfs See: https://github.com/dim-geo/btrfssnapraid * A "dependents" output option to [--test-fmt file|disk|path|dependents] for LIST. Example, snapraid LIST --test-fmt dependents >FileList_with_dependents.txt The goal is a filelist that, for every file, includes full paths to the dependent files on other data disks needed to repair that file (in addition to the parity data). I created a thread about it here: https://sourceforge.net/p/snapraid/discussion/1677233/thread/6e872fdae0/ - Minor * Add a new -u, --filter-updated command that filters files with a different timestamp, to be able to restore only them to the previous state. See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/e26e787d/ * Allow to filter in diff/list by disk name. Not checked disks should be allowed to be missing. * Add an option to ignore subsecond timestamp. Like when you copy data to a filesystem with less timestamp precision. * Support more parity levels It can be done with a generic computation function, using intrinsics for SSSE3 and AVX instructions. It would be interesting to compare performance with the hand-written assembler functions. Eventually we can convert them to use intrinsics also. https://sourceforge.net/p/snapraid/discussion/1677233/thread/9dbd7581/ * Add a "noaccessdenied" config option to exclude not readable files/dirs. Like the "nohidden". See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/1409c26a/ * Don't insert new files if they are now opened by other applications. Not yet sure how to check if a file is open in a fast way. In case we can exclude files created too recently, like with a --min-age option. See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/a1683dd9/?limit=25#1e16 * Add markdown support for output See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/661cce8b/ * Add ZFS support for SMART and UUID. See latest messages at: https://sourceforge.net/p/snapraid/discussion/1677233/thread/42defa3b/ * Change all the paths printed in the terminal as relative and not absolute. https://sourceforge.net/p/snapraid/discussion/1677233/thread/648955ec/ (Leifi in diff) https://sourceforge.net/p/snapraid/discussion/1677233/thread/5b6ef1b9/ (Miles in check + filter) Partially done. Now you can control it with --test-fmt * Add ReFS support with 128 bit inode See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/2be14f63/ https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/miniFilter/avscan/filter/utility.h https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/miniFilter/avscan/filter/utility.c https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/miniFilter/delete/delete.c Partially done. Until the inodes are less than 64 bit, everything works. If a 128 bit inode is found, it aborts with "Invalid inode number! Is this ReFS?" * When a disk is replaced, and SnapRAID detects this by a UUID change, we could clear the scrub information for that disk. https://sourceforge.net/p/snapraid/discussion/1677233/thread/ee87901b/ * In fix, automatically --import excluded directory in the config file. https://sourceforge.net/p/snapraid/discussion/1677233/thread/c80c42e5/?limit=25 * Allow to have "partial" parity disks, smaller than required ? https://sourceforge.net/p/snapraid/discussion/1677233/thread/e924c663/ * How to handle corrupt copied/moved files ? Now pre-hash checks them, but if a corruption is found, it stops the sync process. This is not optimal, because the 'sync' command is stopped instead of continuing. A possible solution could be: If a copied block is corrupt, we can recover the original one from parity (if moved), or read it directly from disk (if copied), and we can use this one to build the parity, working around the corruption, that can be later fixed with "fix". This requires to allocate blocks of moved files in parity positions *after* the currently used one. * Some programs are misusing the FILE_ATTRIBUTE_TEMPORARY. In fact, it makes sense as it's a good way to control the cache on the file, so, despite the name, that usage could be common for not temporary files. https://sourceforge.net/p/snapraid/discussion/1677233/thread/57d40108/ * Restore ownership and permissions, at least in Unix. * Restore directory timestamps. * Add an option for dup to list only duplicates with different names. This supposing that if a file has the same name, it's intentionally duplicated. * In fix, an existing symlink with the same name of a file to be recovered may stop the process making the create() operation to fail. The same for directories, when recreating the directory tree. * If a directory exists with the same name of a parity/content file be more explicative on the error message. See: https://sourceforge.net/projects/snapraid/forums/forum/1677233/topic/4861034 * We don't try to do partial block recovering. A block is correct or not. But if only some bytes, or a sector, is wrong, it should be possible to recover all the rest of the block. The problem is that we don't have any hash to ensure that the block is partially recovered, or completely garbage. But it makes sense to anyway write the "most likely" correct one. - Naming * A new 'init' command to differentiate the first 'sync' operation. This 'init' will work also without a content file, and parity files. Instead 'sync' will require all of them. This will also help when running with the parity filesystem unmounted. * Rename sync->backup and fix->restore. It seems to me a naming expressing better the meaning of the commands. But not yet sure. - Pooling * Add a new "commit" command to move changes from the pool to the array. It should: - Move files copied into the pool (that are no links) to the array. The files should be moved to the disk that contains most of the files in the directory. If no space, try with the disk with less files in the directory, and eventually the disk in the array with more free space. - Detect renames, and apply them in the array. The file will be renamed and moved to the new directory, if changed, but kept in the same disk of the array. - Detect deletes, and move file in the array to a "/trash/" directory of the same disk. For safety no real deletion is done. File with the same name will get an extra extension like ".1", ".2". - Major * Allocate parity minimizing concurrent use of it Each parity allocation should check for a parity range with less utilization by other disks. We need to take care to disable this mechanism when the parity space is near to fillup the parity partition. See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/1797bf7d/ + This increases the possibility of recovering with multiple failures with not enough parity, as the benefit of existing parity is maximized. - Possible increase of fragmentation of parity allocation - No real benefit when the array is filled Rejected TODO ============= This is a list of rejected TODO items. * Allow multiple parity files and to coexist with data in the same disk. This is possible if the data in the same disk uses parity addresses not contained in the parity file present in the same disk. + It's a nice trick. The disk containing parity, will have less space available, and then it will need less parity, resolving the problem of the parity disk being too small. + We can also think at an automated parity files naming and creation, removing the need of the user to specify that. We can also completely remove the concept of parity drive, automatically allocating parity in the most free data drives. - It won't be nice to have the program to automatically choose where to create the parity, because the choice cannot be optimal. With a dedicated disk manually chosen, it's instead optimal. + We can limit this coexist possibility only to latest parity file, allowing the user to choose where to put it. - It won't work with disks of different size. Suppose to have all disks of size N, with only one of size M>N. To fully use the M space, you can allocate a full N parity in such disk, but the remaining space will also need additional parity in the other disks, in fact requiring a total of M parity for the array. In the end, we cannot avoid that the first biggest disk added is fully dedicated to parity, even if it means to leave some space unused. * Directly access disks for parity skipping the filesystem layer - No real performance or space gain compared to a custom filesystem configuration like: mkfs.ext3 -i 16777216 -m0 -O ^dir_index,large_file,sparse_super /dev/sdX1 See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/9c0ef324/?limit=25 * Allow to specify more than one disk directories to cover the case of multi partitions. Different partitions have duplicate inode. The only way to support this is to add also a kind of device_id, increasing the memory required. But it should be only few bits for each file. So, it should be manageable. A lot of discussions about this feature :) https://sourceforge.net/p/snapraid/discussion/1677233/thread/b2cd9385/ - The only benefit is to distribute better the data. This could help the recovery process, in case of multiple failures. But no real usability or functionality benefit in the normal case. * https://sourceforge.net/p/snapraid/discussion/1677233/thread/2cb97e8a/ Have two hashes for each file. One for the first segment, that may use only a part of the first parity block. And a second hash that takes care of the final segment, also using only part of a parity block. Intermediate blocks can be handled like now. The first and last segment can use only a part of the parity block, sharing it with other files, and then allowing big parity blocks. + Big parity block, like 1MB, and small file allocation, like 4KB. - It won't be possible to copy hash info from one disk to another, as copied files may have a different block splitting. Copied file should be allocated with the same exact splitting. - Dup detection can be handled with a dedicated hash covering the full file. But increasing the number of hash for each file to three. - No way to handle block import. * Create a filesystem snapshot at every sync, and use it in all the other commands automatically. At the next sync, drop the old snapshot and create a new one. This should help recovering, because we'll have the exact copy used by sync. This feature can be enabled with a specific option, and available in Windows using Shadow Copy, and in Linux using Btrfs, and in a generic Unix using ZFS. See Jens's Windows script at: http://sourceforge.net/p/snapraid/discussion/1677233/thread/a1707211/ Note that a difference between Windows and Unix is that in Windows old snapshots are automatically deleted. * Checks if splitting hash/parity computation in 4K pages can improve speed in sync. That should increase cache locality, because we read the data two times for hash and parity, and if we manage to keep it in the cache, we should save time. - We now hash first the faster disks, and this could reduce performance as we'll have to wait for all disks. * Enable storing of creation time NTFS, crtime/birth time EXT4. But see: http://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4 coreutils stat has an example, but it doesn't work in Linux (see lib/stat-time.h) - Not supported in Linux. * In the content file save the timestamp of the parity files. If they do not match, stop the processing. This can be done to avoid to use not synchronized parity and content files, resulting in wrong data. But if the sync process is killed we need a way to resynchronize them. Or maybe we should allow parity newer than content, but not viceversa. - The corner cases are too many. A fixed parity may be never. A someway modified content may be never. So, the time is not really significant. * Use Async IO for Linux (libaio). See thread: https://sourceforge.net/p/snapraid/discussion/1677233/thread/a300a10b/ Docs at: http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt - Implemented for scrub in the "libaio" branch, but it's slower of about 20% in my machine. * Allow to put parity directly into the underline block device without the need of any filesystem. That would allow to increase a lot the free space for parity. We can implement some kind of filesystem detection to avoid to overwrite an already existing filesystem. - Still risky if stuffs go wrong. - In Linux with largefile4 there is only a very small amount of space wasted. In the order of 0.01%. Not really worth to do it. - With NTFS the saving is also limited, because the "reserved" MFT of 12.5% is not really exclusively reserved, but can be used also for normal files, when all the remaining space is filled. * The data could be compressed before processing, resulting in parity block of fixed size, but matching different data block sizes. The complexity is that a file blocks will have to be allocated at runtime, and you may run out of them in the middle of the processing. We need also a way to compress a stream until the compressed data reach the block size, but no more, and then start a new block. For each block, we'll have also to store. "size_uncompressed", "size_compressed", "hash". - It will be too slow. - Not addressing the problem of a lot of small files, as still one block will be allocated for each file. * Uses different block size for parity and file allocation. We can use a big size, like 1MB for parity allocation and hash computation, and at the same time using a 4K blocks for files allocation. This means that a parity blocks may contain more than one file. - We'll have to drop the dup and import feature, because it won't be possible anymore to compare the hash of files, as it would depend also on the start address inside the parity block. - When a hash fail, it won't be possible to tell which file is really broken, because more file may share the same parity block. * Have special parity blocks containing the last blocks of more files until it's filled up. For such parity blocks, we'll have more than one hash. One for each file contained. - Parity will be too fragmented, because we'll have parity blocks containing the last blocks of many files. * In "pool" for Windows, and for unique directories a junction to the directory could be used, avoiding to use symlinks to files. This allows to overcome the problem of sharing symlinks. - It would work, in fact it would work too well. The problem is that Windows will treat the junction as the real directory, like *really* deleting its content from Explorer pressing "del" and also from the command line with "rd". Too dangerous. * When fixing, before overwriting the present file, make a copy of it just in case that the original file cannot be completely recovered. We can always open files in read-only mode, if a write is required, we close it, rename it to with a .bak extension, and rewrite it up to the required size. The same for symlink if a file with the same name exist or viceversa. - The idea behind this is to avoid to leave untouched a file if we cannot restore it completely. But it's debatable what's better in this case. Anyway, considering the typical use, it's not really relevant. * In the import list, uses also all the blocks in the array. But we must cover the case of bad blocks. Likely we can just check the hash after reading, and in case, skip it, and retry with another copy. - It will work only for duplicate files. Not really worth to do it. * Save the content file in compressed .gz format to save space. - Compression is too slow. Even using the very fast lzo. $ time lzop -1 < content > content.lzo real 1m23.014s user 0m40.822s sys 0m3.389s $ time ./gzip -1 < content > content.gz real 1m47.463s user 1m23.732s sys 0m3.290s $ time ./gzip --huffonly < content > contentH.gz real 1m51.607s user 1m30.032s sys 0m3.245s Similar command done with snapraid without compression, and involving also decoding and encoding takes less time. $ time ./snapraid --test-skip-device --test-skip-self -v -c ./test.conf test-rewrite real 0m59.087s user 0m14.164s sys 0m4.398s * Recognizes that a file is moved from one disk to another, and if the parity data doesn't overlap, do not recompute it. - It's going to work only in RAID5 mode and only in special cases. * Implements a multithread sync command to share HASH and RAID computations to different CPUs. - At now it's questionable if it will result in a performance improvement. The murmur3 hash, and the RAID5/6 computations are so fast that even a single thread should be able to do them. Use the "snapraid -T" command to see the speed. * In the repair() function the heuristic to detect if we recovered after the sync, can be extended to all the previous blocks, because we always proceed in block order during a sync. So, if for a block we can detect that we recovered using updated parity data, also for all the previous blocks this is true. Anyway, the case where this information could be useful should be present only if changes are committed after an aborted sync. - No real advantage on that, beside some speed gain in fix. The risk would be instead to miss some recovery opportunity. So, makes sense to have it a little slower but trying any possible recovery strategy. * Extend haspdeep to support the SnapRAID hash. - Not possible, because now SnapRAID uses a hash seed that makes the hash unique for each array https://github.com/jessek/hashdeep/ https://sourceforge.net/p/snapraid/discussion/1677233/thread/90b0e9b2/?limit=25 * Uses a separated file for storing hashes, to allow to use a memory mapped file to decrease memory utilization. - Now it's expected to have machines with big memory. The file can contains hashes stored in the same order they are accessed in sync/check/scrub. + A lot less memory utilization - It will be slow in --pre-hash as the files are accessed in another order, but not much slow. - How to handle multiple .content file copy ? When working we can have only a single file. When storing the .content we'll have to copy it in all the places. * Can we mix the existing and new approach ? We can create this hash file at startup in a memory mapped "temporary" file. It may take some time to create it, but then it will be fast. See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/cdea773f/ snapraid-14.9/acinclude.m4000066400000000000000000000006211522717156100154470ustar00rootroot00000000000000dnl @synopsis AC_CHECK_CC_OPT(flag, ifyes, ifno) dnl dnl Shows a message as like "checking whether gcc accepts flag ... no" dnl and executes ifyes or ifno. AC_DEFUN([AC_CHECK_CC_OPT], [ AC_MSG_CHECKING([whether ${CC-cc} accepts $1]) echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -c $1 conftest.c 2>&1`"; then AC_MSG_RESULT([yes]) $2 else AC_MSG_RESULT([no]) $3 fi rm -f conftest* ]) snapraid-14.9/autogen.sh000077500000000000000000000004571522717156100152660ustar00rootroot00000000000000#!/bin/sh # echo "Generating build information using autoreconf" # All is done by autoreconf autoreconf -f -i # Run configure for this platform echo "Now you are ready to run ./configure" # Remove backup files created by autoreconf rm -f config.guess~ config.h.in~ config.sub~ configure~ install-sh~ snapraid-14.9/autover.sh000077500000000000000000000014111522717156100153000ustar00rootroot00000000000000#!/bin/sh # if [ -f .version ]; then # Get version from the .version file VERSION=$(cat .version) fi if [ -z "$VERSION" ] && [ -d .git ]; then # Get version from git tags, removing the 'v' prefix VERSION=$(git describe --match 'v*' 2>/dev/null | sed 's/^v//') fi if [ -z "$VERSION" ] && [ -d .git ]; then # Fall back to short commit hash VERSION=0-$(git rev-parse --short HEAD 2>/dev/null) fi if [ -z "$VERSION" ]; then # No version, but still use a number VERSION="0" fi # Apply common rules to all outputs: # - Remove "-" at the end # - Replace "rc-" with "rc" # - Replace "beta-" with "beta" # - Replace all remaining dashes with "." VERSION=$(echo "$VERSION" | sed 's/-$//; s/rc-/rc/g; s/beta-/beta/g; s/-/./g') printf '%s' "$VERSION" snapraid-14.9/cmdline/000077500000000000000000000000001522717156100146725ustar00rootroot00000000000000snapraid-14.9/cmdline/bw.c000066400000000000000000000011121522717156100154410ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2016 Andrea Mazzoleni #include "portable.h" #include "bw.h" void bw_init(struct snapraid_bw* bw, uint64_t limit) { bw->limit = limit; bw->total = 0; bw->start = os_tick_ms(); } void bw_limit(struct snapraid_bw* bw, uint64_t bytes) { if (!bw || bw->limit == 0) return; uint64_t elapsed = os_tick_ms() - bw->start; uint64_t done; uint64_t eta; done = __atomic_fetch_add(&bw->total, bytes, __ATOMIC_SEQ_CST); eta = done * 1000 / bw->limit; if (eta > elapsed) { eta -= elapsed; usleep(eta * 1000); } } snapraid-14.9/cmdline/bw.h000066400000000000000000000013401522717156100154510ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2016 Andrea Mazzoleni #ifndef __BW_H #define __BW_H #include "state.h" #include "support.h" /** * Bandwidth limiting */ struct snapraid_bw { uint64_t limit; /**< Bandwidth limit in bytes per second */ uint64_t total; /**< Remaining bytes allowed in current second */ uint64_t start; /**< Time when to reset the bandwidth counter */ }; /** * Initialize the bandwidth limit */ void bw_init(struct snapraid_bw* bw, uint64_t limit); /** * Limit IO bandwidth to stay within the configured limit. * If no limit is set, returns immediately. * Otherwise sleeps as needed to maintain the rate limit. */ void bw_limit(struct snapraid_bw* bw, uint64_t bytes); #endif snapraid-14.9/cmdline/check.c000066400000000000000000002171631522717156100161250ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "util.h" #include "elem.h" #include "import.h" #include "search.h" #include "state.h" #include "parity.h" #include "handle.h" #include "raid/raid.h" #include "raid/combo.h" /****************************************************************************/ /* check */ static const char* es(int err) { if (is_hw(err)) return "error_io"; else return "error"; } /** * A block that failed the hash check, or that was deleted. */ struct failed_struct { /** * If we know for sure that the block is garbage or missing * and it needs to be recovered and rewritten to the disk. */ int is_bad; /** * If what we have recovered may be not updated data, * an old version, or just garbage. * * Essentially, it means that we are not sure what we have recovered * is really correct. It's just our best guess. * * These "recovered" blocks are also written to the disk if the block is marked as ::is_bad. * But these files are marked also as FILE_IS_DAMAGED, and then renamed to .unrecoverable. * * Note that this could happen only for CHG blocks. */ int is_outofdate; unsigned index; /**< Index of the failed block. */ struct snapraid_block* block; /**< The failed block */ struct snapraid_disk* disk; /**< The failed disk. */ struct snapraid_file* file; /**< The failed file. 0 for DELETED block. */ block_off_t file_pos; /**< Offset inside the file */ struct snapraid_handle* handle; /**< The handle containing the failed block, or 0 for a DELETED block */ }; /** * Check if a block hash matches the specified buffer. * Return ==0 if equal */ static int blockcmp(struct snapraid_state* state, int rehash, struct snapraid_block* block, unsigned pos_size, unsigned char* buffer, unsigned char* buffer_zero) { unsigned char hash[HASH_MAX]; /* now compute the hash of the valid part */ if (rehash) { memhash(state->prevhash, state->prevhashseed, hash, buffer, pos_size); } else { memhash(state->hash, state->hashseed, hash, buffer, pos_size); } /* compare the hash */ if (memcmp(hash, block->hash, BLOCK_HASH_SIZE) != 0) { return -1; } /* compare to the end of the block */ if (pos_size < state->block_size) { if (memcmp(buffer + pos_size, buffer_zero + pos_size, state->block_size - pos_size) != 0) { return -1; } } return 0; } /** * Check if the hash of all the failed blocks we are expecting to recover are now matching. */ static int is_hash_matching(struct snapraid_state* state, int rehash, unsigned diskmax, struct failed_struct* failed, unsigned* failed_map, unsigned failed_count, void** buffer, void* buffer_zero) { unsigned j; int hash_checked; hash_checked = 0; /* keep track if we check at least one block */ /* check if the recovered blocks are OK */ for (j = 0; j < failed_count; ++j) { /* if we are expected to recover this block */ if (!failed[failed_map[j]].is_outofdate /* if the block has a hash to check */ && block_has_updated_hash(failed[failed_map[j]].block) ) { /* if a hash doesn't match, fail the check */ unsigned pos_size = file_block_size(failed[failed_map[j]].file, failed[failed_map[j]].file_pos, state->block_size); if (blockcmp(state, rehash, failed[failed_map[j]].block, pos_size, buffer[failed[failed_map[j]].index], buffer_zero) != 0) { log_tag("repair_hash_error:%u: Hash mismatch\n", failed_map[j]); return 0; } hash_checked = 1; } } /* if nothing checked, we reject it */ /* note that we are excluding this case at upper level */ /* but checking again doesn't hurt */ if (!hash_checked) { /* LCOV_EXCL_START */ return 0; /* LCOV_EXCL_STOP */ } /* if we checked something, and no block failed the check */ /* recompute all the redundancy information */ raid_gen(diskmax, state->level, state->block_size, buffer); return 1; } /** * Check if specified parity is now matching with a recomputed one. */ static int is_parity_matching(struct snapraid_state* state, unsigned diskmax, unsigned i, void** buffer, void** buffer_recov) { /* recompute parity, note that we don't need parity over i */ raid_gen(diskmax, i + 1, state->block_size, buffer); /* if the recovered parity block matches */ if (memcmp(buffer[diskmax + i], buffer_recov[i], state->block_size) == 0) { /* recompute all the redundancy information */ raid_gen(diskmax, state->level, state->block_size, buffer); return 1; } return 0; } /** * Repair errors. * Return <0 if failure for missing strategy, >0 if data is wrong and we cannot rebuild correctly, 0 on success. * If success, the parity is computed in the buffer variable. */ static int repair_step(struct snapraid_state* state, int rehash, unsigned pos, unsigned diskmax, struct failed_struct* failed, unsigned* failed_map, unsigned failed_count, void** buffer, void** buffer_recov, void* buffer_zero) { unsigned i, n; int error; int has_hash; int id[LEV_MAX]; int ip[LEV_MAX]; /* no fix required, already checked at higher level, but just to be sure */ if (failed_count == 0) { /* LCOV_EXCL_START */ /* recompute only the parity */ raid_gen(diskmax, state->level, state->block_size, buffer); return 0; /* LCOV_EXCL_STOP */ } n = state->level; error = 0; /* if failures exceed parity level, recovery is impossible */ if (failed_count > n) { log_tag("recover_strategy_error:%u: Impossible to recover from %u failures with %u parity\n", pos, failed_count, n); return -1; } /* setup vector of failed disk indexes */ for (i = 0; i < failed_count; ++i) id[i] = failed[failed_map[i]].index; /* check if there is at least a failed block that can be checked for correctness using the hash */ /* if there isn't, we have to sacrifice a parity block to check that the result is correct */ has_hash = 0; for (i = 0; i < failed_count; ++i) { /* if we are expected to recover this block */ if (!failed[failed_map[i]].is_outofdate /* if the block has a hash to check */ && block_has_updated_hash(failed[failed_map[i]].block) ) has_hash = 1; } /* if we don't have a hash, but we have an extra parity */ /* (strictly-less failures than number of parities) */ if (!has_hash && failed_count < n) { /* number of parity to use, one more to check the recovering */ unsigned r = failed_count + 1; /* all combinations (r of n) parities */ combination_first(r, n, ip); do { /* if a parity is missing, do nothing */ for (i = 0; i < r; ++i) { if (buffer_recov[ip[i]] == 0) break; } if (i != r) continue; /* copy the parities to use, one less because the last is used for checking */ for (i = 0; i < r - 1; ++i) memcpy(buffer[diskmax + ip[i]], buffer_recov[ip[i]], state->block_size); /* recover using one less parity, the ip[r-1] one */ raid_data(r - 1, id, ip, diskmax, state->block_size, buffer); /* use the remaining ip[r-1] parity to check the result */ if (is_parity_matching(state, diskmax, ip[r - 1], buffer, buffer_recov)) return 0; /* log */ log_tag("recover_parity_error:%u:", pos); for (i = 0; i < r; ++i) { if (i != 0) log_tag(","); log_tag("%s", lev_config_name(ip[i])); } log_tag(": Parity mismatch\n"); ++error; } while (combination_next(r, n, ip)); } /* if we have a hash, and enough parities */ /* (less-or-equal failures than number of parities) */ if (has_hash && failed_count <= n) { /* number of parities to use equal to the number of failures */ unsigned r = failed_count; /* all combinations (r of n) parities */ combination_first(r, n, ip); do { /* if a parity is missing, do nothing */ for (i = 0; i < r; ++i) { if (buffer_recov[ip[i]] == 0) break; } if (i != r) continue; /* copy the parities to use */ for (i = 0; i < r; ++i) memcpy(buffer[diskmax + ip[i]], buffer_recov[ip[i]], state->block_size); /* recover */ raid_data(r, id, ip, diskmax, state->block_size, buffer); /* use the hash to check the result */ if (is_hash_matching(state, rehash, diskmax, failed, failed_map, failed_count, buffer, buffer_zero)) return 0; /* log */ log_tag("recover_hash_error:%u:", pos); for (i = 0; i < r; ++i) { if (i != 0) log_tag("/"); log_tag("%s", lev_config_name(ip[i])); } log_tag(": Hash mismatch\n"); ++error; } while (combination_next(r, n, ip)); } /* return the number of failed attempts, or -1 if no strategy */ if (error) return error; log_tag("recover_strategy_error:%u: No strategy to recover from %u failures with %u parity %s hash\n", pos, failed_count, n, has_hash ? "with" : "without"); return -1; } static int repair(struct snapraid_state* state, int rehash, unsigned pos, unsigned diskmax, struct failed_struct* failed, unsigned* failed_map, unsigned failed_count, void** buffer, void** buffer_recov, void* buffer_zero) { int ret; int error; unsigned j; int n; int something_to_recover; int something_unsynced; error = 0; /* if nothing failed, just recompute the parity */ if (failed_count == 0) { raid_gen(diskmax, state->level, state->block_size, buffer); return 0; } /* logs the status */ for (j = 0; j < failed_count; ++j) { const char* desc; const char* hash; const char* data; struct snapraid_block* block = failed[j].block; unsigned block_state = block_state_get(block); switch (block_state) { case BLOCK_STATE_DELETED : desc = "delete"; break; case BLOCK_STATE_CHG : desc = "change"; break; case BLOCK_STATE_REP : desc = "replace"; break; case BLOCK_STATE_BLK : desc = "block"; break; /* LCOV_EXCL_START */ default : desc = "unknown"; break; /* LCOV_EXCL_STOP */ } if (hash_is_invalid(block->hash)) { hash = "lost"; } else if (hash_is_zero(block->hash)) { hash = "zero"; } else { hash = "known"; } if (failed[j].is_bad) data = "bad"; else data = "good"; if (failed[j].file) { struct snapraid_disk* disk = failed[j].disk; struct snapraid_file* file = failed[j].file; block_off_t file_pos = failed[j].file_pos; log_tag("repair_entry:%u:%s:%s:%s:%s:%s:%u:\n", j, desc, hash, data, disk->name, esc_tag(file->sub), file_pos); } else { log_tag("repair_entry:%u:%s:%s:%s:\n", j, desc, hash, data); } } /* Here we have to try two different strategies to recover, because in case the 'sync' */ /* process is aborted, we don't know if the parity data is really updated just like after 'sync', */ /* or if it still represents the state before the 'sync'. */ /* Note that if the 'sync' ends normally, we don't have any DELETED, REP and CHG blocks */ /* and the two strategies are identical */ /* As first, we assume that the parity IS updated for the current state */ /* and that we are going to recover the state after the last 'sync'. */ /* In this case, parity contains info from BLK, REP and CHG blocks, */ /* but not for DELETED. */ /* We need to put in the recovering process only the bad blocks, because all the */ /* others already contains the correct data read from disk, and the parity is correctly computed for them. */ /* We are interested to recover BLK, REP and CHG blocks if they are marked as bad, */ /* but we are not interested in DELETED ones. */ n = 0; something_to_recover = 0; /* keep track if there is at least one block to fix */ for (j = 0; j < failed_count; ++j) { if (failed[j].is_bad) { unsigned block_state = block_state_get(failed[j].block); assert(block_state != BLOCK_STATE_DELETED); /* we cannot have bad DELETED blocks */ /* if we have the hash for it */ if ((block_state == BLOCK_STATE_BLK || block_state == BLOCK_STATE_REP) /* try to fetch the block using the known hash */ && (state_import_fetch(state, rehash, failed[j].block, buffer[failed[j].index]) == 0 || state_search_fetch(state, rehash, failed[j].file, failed[j].file_pos, failed[j].block, buffer[failed[j].index]) == 0) ) { /* we already have corrected it! */ log_tag("repair_hash_import:%u: Fixed by import\n", j); } else { /* otherwise try to recover it */ failed_map[n] = j; ++n; /* we have something to try to recover */ something_to_recover = 1; } } } /* if nothing to fix */ if (!something_to_recover) { log_tag("recover_sync:%u:%u: Skipped for already recovered\n", pos, n); /* recompute only the parity */ raid_gen(diskmax, state->level, state->block_size, buffer); return 0; } ret = repair_step(state, rehash, pos, diskmax, failed, failed_map, n, buffer, buffer_recov, buffer_zero); if (ret == 0) { /* reprocess the CHG blocks, for which we don't have a hash to check */ /* if they were BAD we have to use some heuristics to ensure that we have recovered */ /* the state after the sync. If unsure, we assume the worst case */ for (j = 0; j < failed_count; ++j) { /* we take care only of BAD blocks we have to write back */ if (failed[j].is_bad) { unsigned block_state = block_state_get(failed[j].block); /* BLK and REP blocks are always OK, because at this point */ /* we have already checked their hash */ if (block_state != BLOCK_STATE_CHG) { assert(block_state == BLOCK_STATE_BLK || block_state == BLOCK_STATE_REP); continue; } /* for CHG blocks we have to 'guess' if they are correct or not */ /* if the hash is invalid we cannot check the result */ /* this could happen if we have lost this information */ /* after an aborted sync */ if (hash_is_invalid(failed[j].block->hash)) { /* it may contain garbage */ failed[j].is_outofdate = 1; log_tag("repair:hash_unknown:%u: Unknown hash\n", j); } else if (hash_is_zero(failed[j].block->hash)) { /* if the block is not filled with 0, we are sure to have */ /* restored it to the state after the 'sync' */ /* instead, if the block is filled with 0, it could be either that the */ /* block after the sync is really filled by 0, or that */ /* we restored the block before the 'sync'. */ if (memcmp(buffer[failed[j].index], buffer_zero, state->block_size) == 0) { /* it may contain garbage */ failed[j].is_outofdate = 1; log_tag("repair_hash_unknown:%u: Maybe old zero\n", j); } } else { /* if the hash is different than the previous one, we are sure to have */ /* restored it to the state after the 'sync' */ /* instead, if the hash matches, it could be either that the */ /* block after the sync has this hash, or that */ /* we restored the block before the 'sync'. */ unsigned pos_size = file_block_size(failed[j].file, failed[j].file_pos, state->block_size); if (blockcmp(state, rehash, failed[j].block, pos_size, buffer[failed[j].index], buffer_zero) == 0) { /* it may contain garbage */ failed[j].is_outofdate = 1; log_tag("repair_hash_unknown:%u: Maybe old data\n", j); } } } } return 0; } if (ret > 0) error += ret; if (ret < 0) log_tag("recover_sync:%u:%u: Failed with no attempts\n", pos, n); else log_tag("recover_sync:%u:%u: Failed with %d attempts\n", pos, n, ret); /* Now assume that the parity IS NOT updated at the current state, */ /* but still represent the state before the last 'sync' process. */ /* In this case, parity contains info from BLK, REP (old version), CHG (old version) and DELETED blocks, */ /* but not for REP (new version) and CHG (new version). */ /* We are interested to recover BLK ones marked as bad, */ /* but we are not interested to recover CHG (new version) and REP (new version) blocks, */ /* even if marked as bad, because we don't have parity for them and it's just impossible, */ /* and we are not interested to recover DELETED ones. */ n = 0; something_to_recover = 0; /* keep track if there is at least one block to fix */ something_unsynced = 0; /* keep track if we have some unsynced info to process */ for (j = 0; j < failed_count; ++j) { unsigned block_state = block_state_get(failed[j].block); if (block_state == BLOCK_STATE_DELETED || block_state == BLOCK_STATE_CHG || block_state == BLOCK_STATE_REP ) { /* If the block is CHG, REP or DELETED, we don't have the original content of block, */ /* and we must try to recover it. */ /* This applies to CHG and REP blocks even if they are not marked bad, */ /* because the parity is computed with old content, and not with the new one. */ /* Note that this recovering is done just to make it possible to recover any other BLK one, */ /* we are not really interested in DELETED, CHG (old version) and REP (old version). */ something_unsynced = 1; if (block_state == BLOCK_STATE_CHG && hash_is_zero(failed[j].block->hash) ) { /* If the block was a ZERO block, restore it to the original 0 as before the 'sync' */ /* We do this to just allow recovering of other BLK ones */ memset(buffer[failed[j].index], 0, state->block_size); /* note that from now the buffer is definitely lost */ /* we can do this only because it's the last retry of recovering */ /* try to fetch the old block using the old hash for CHG and DELETED blocks */ } else if ((block_state == BLOCK_STATE_CHG || block_state == BLOCK_STATE_DELETED) && hash_is_unique(failed[j].block->hash) && state_import_fetch(state, rehash, failed[j].block, buffer[failed[j].index]) == 0) { /* note that from now the buffer is definitely lost */ /* we can do this only because it's the last retry of recovering */ } else { /* otherwise try to recover it */ failed_map[n] = j; ++n; /* note that we don't set something_to_recover, because we are */ /* not really interested to recover *only* old blocks. */ } /* avoid using the hash of this block to verify the recovering */ /* this applies to REP blocks because we are going to recover the old state */ /* and the REP hash represents the new one */ /* it also applies to CHG and DELETE blocks because we want to have */ /* a successful recovering only if a BLK one is matching */ failed[j].is_outofdate = 1; } else if (failed[j].is_bad) { /* If the block is bad we don't know its content, and we try to recover it */ /* At this point, we can have only BLK ones */ assert(block_state == BLOCK_STATE_BLK); /* we have something we are interested to recover */ something_to_recover = 1; /* we try to recover it */ failed_map[n] = j; ++n; } } /* if nothing to fix, we just don't try */ /* if nothing unsynced we also don't retry, because it's the same try as before */ if (something_to_recover && something_unsynced) { ret = repair_step(state, rehash, pos, diskmax, failed, failed_map, n, buffer, buffer_recov, buffer_zero); if (ret == 0) { /* reprocess the REP and CHG blocks, for which we have recovered an old state */ /* that we don't want to save into disk */ /* we have already marked them, but we redo it for logging */ for (j = 0; j < failed_count; ++j) { /* we take care only of BAD blocks we have to write back */ if (failed[j].is_bad) { unsigned block_state = block_state_get(failed[j].block); if (block_state == BLOCK_STATE_CHG || block_state == BLOCK_STATE_REP ) { /* mark that we have restored an old state */ /* and we don't want to write it to the disk */ failed[j].is_outofdate = 1; log_tag("repair_hash_unknown:%u: Surely old data\n", j); } } } return 0; } if (ret > 0) error += ret; if (ret < 0) log_tag("recover_unsync:%u:%u: Failed with no attempts\n", pos, n); else log_tag("recover_unsync:%u:%u: Failed with %d attempts\n", pos, n, ret); } else { log_tag("recover_unsync:%u:%u: Skipped for%s%s\n", pos, n, !something_to_recover ? " nothing to recover" : "", !something_unsynced ? " nothing unsynced" : "" ); } /* return the number of failed attempts, or -1 if no strategy */ if (error) return error; else return -1; } /** * Post process all the files at the specified block index ::i. * For each file, if we are at the last block, close it, * adjust the timestamp, and print the result. * * This works only if the whole file is processed, including its last block. * This doesn't always happen, like with an explicit end block. * * In such case, the check/fix command won't report any information of the * files partially checked. */ static int file_post(struct snapraid_state* state, int fix, unsigned i, struct snapraid_handle* handle, unsigned diskmax) { unsigned j; int ret; /* for all the files print the final status, and do the final time fix */ /* we also ensure to close files after processing the last block */ for (j = 0; j < diskmax; ++j) { struct snapraid_block* block; struct snapraid_disk* disk; struct snapraid_file* collide_file; struct snapraid_file* file; block_off_t file_pos; uint64_t inode; disk = handle[j].disk; if (!disk) { /* if no disk, nothing to do */ continue; } block = fs_par2block_find(disk, i); if (!block_has_file(block)) { /* if no file, nothing to do */ continue; } file = fs_par2file_get(disk, i, &file_pos); /* if it isn't the last block in the file */ if (!file_block_is_last(file, file_pos)) { /* nothing to do */ continue; } /* if the file is excluded, we have nothing to adjust as the file is never written */ if (file_flag_has(file, FILE_IS_EXCLUDED) || (state->opt.syncedonly && file_flag_has(file, FILE_IS_UNSYNCED))) { /* nothing to do, but close the file */ goto close_and_continue; } /* finish the fix process if it's the last block of the files */ if (fix) { /* mark that we finished with this file */ /* to identify later any NOT finished ones */ file_flag_set(file, FILE_IS_FINISHED); /* if the file is damaged, meaning that a fix failed */ if (file_flag_has(file, FILE_IS_DAMAGED)) { /* rename it to .unrecoverable */ char path[PATH_MAX]; char path_to[PATH_MAX]; pathprint(path, sizeof(path), "%s%s", disk->dir, file->sub); pathprint(path_to, sizeof(path_to), "%s%s.unrecoverable", disk->dir, file->sub); /* ensure to close the file before renaming */ if (handle[j].file == file) { ret = handle_close(&handle[j]); if (ret != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); return -1; /* LCOV_EXCL_STOP */ } } ret = rename(path, path_to); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error renaming '%s%s'. %s.\n", disk->dir, file->sub, strerror(errno)); log_tag("%s:%u:%s:%s: Rename error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); return -1; /* LCOV_EXCL_STOP */ } log_tag("status:unrecoverable:%s:%s\n", disk->name, esc_tag(file->sub)); msg_info("unrecoverable %s\n", fmt_term(disk, file->sub)); /* and do not set the time if damaged */ goto close_and_continue; } /* if the file is not fixed, meaning that it is untouched */ if (!file_flag_has(file, FILE_IS_FIXED)) { /* nothing to do, but close the file */ goto close_and_continue; } /* if the file is closed or different than the one expected, reopen it */ /* a different open file could happen when filtering for bad blocks */ if (handle[j].file != file) { /* keep a pointer at the file we are going to close for error reporting */ struct snapraid_file* report = handle[j].file; ret = handle_close(&handle[j]); if (ret != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), i, disk->name, esc_tag(report->sub), strerror(errno)); log_fatal_errno(errno, disk->name); return -1; /* LCOV_EXCL_STOP */ } /* reopen it as readonly, as to set the mtime readonly access it's enough */ /* we know that the file exists because it has the FILE_IS_FIXED tag */ ret = handle_open(&handle[j], file, state->file_mode, 0); if (ret != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Open error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); return -1; /* LCOV_EXCL_STOP */ } } log_tag("status:recovered:%s:%s\n", disk->name, esc_tag(file->sub)); msg_info("recovered %s\n", fmt_term(disk, file->sub)); inode = handle[j].st.st_ino; /* search for the corresponding inode */ collide_file = tommy_hashdyn_search(&disk->inodeset, file_inode_compare_to_arg, &inode, file_inode_hash(inode)); /* if the inode is already in the database and it refers to a different file name, */ /* we can fix the file time ONLY if the time and size allow to differentiate */ /* between the two files */ /* for example, suppose we delete a bunch of files with all the same size and time, */ /* when recreating them the inodes may be reused in a different order, */ /* and at the next sync some files may have matching inode/size/time even if different name */ /* not allowing sync to detect that the file is changed and not renamed */ if (!collide_file /* if not in the database, there is no collision */ || strcmp(collide_file->sub, file->sub) == 0 /* if the name is the same, it's the right collision */ || collide_file->size != file->size /* if the size is different, the collision is identified */ || collide_file->mtime_sec != file->mtime_sec /* if the mtime is different, the collision is identified */ || collide_file->mtime_nsec != file->mtime_nsec /* same for mtime_nsec */ ) { /* set the original modification time */ ret = handle_utime(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Time error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); /* mark the file as damaged */ file_flag_set(file, FILE_IS_DAMAGED); return -1; /* LCOV_EXCL_STOP */ } } else { log_tag("collision:%s:%s:%s: Not setting modification time to avoid inode collision\n", disk->name, esc_tag(file->sub), esc_tag(collide_file->sub)); } } else { /* we are not fixing, but only checking */ /* print just the final status */ if (file_flag_has(file, FILE_IS_DAMAGED)) { log_tag("status:unrecoverable:%s:%s\n", disk->name, esc_tag(file->sub)); msg_info("unrecoverable %s\n", fmt_term(disk, file->sub)); } else if (file_flag_has(file, FILE_IS_FIXED)) { log_tag("status:recoverable:%s:%s\n", disk->name, esc_tag(file->sub)); msg_info("recoverable %s\n", fmt_term(disk, file->sub)); } else { /* we don't use msg_verbose() because it also goes into the log */ if (msg_level >= MSG_VERBOSE) { log_tag("status:correct:%s:%s\n", disk->name, esc_tag(file->sub)); msg_info("correct %s\n", fmt_term(disk, file->sub)); } } } close_and_continue: /* if the opened file is the correct one, close it */ /* in case of excluded and fragmented files it's possible */ /* that the opened file is not the current one */ if (handle[j].file == file) { /* ensure to close the file just after finishing with it */ /* to avoid keeping it open without any possible use */ ret = handle_close(&handle[j]); if (ret != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); return -1; /* LCOV_EXCL_STOP */ } } } return 0; } /** * Check if we have to process the specified block index ::i. */ static int block_is_enabled(struct snapraid_state* state, block_off_t i, struct snapraid_handle* handle, unsigned diskmax) { unsigned j; unsigned l; /* filter for bad blocks */ if (state->opt.badblockonly) { snapraid_info info; /* get block specific info */ info = info_get(&state->infoarr, i); /* * Filter specifically only for bad blocks */ return info_get_bad(info); } /* filter for the parity */ if (state->opt.badfileonly) { snapraid_info info; /* get block specific info */ info = info_get(&state->infoarr, i); /* * If the block is bad, it has to be processed * * This is not necessary in normal cases because if a block is bad, * it necessary needs to have a file related to it, and files with * bad blocks are fully included. * * But some files may be excluded by additional filter options, * so it's not always true, and this ensures to always check all * the bad blocks. */ if (info_get_bad(info)) return 1; } else { /* if a parity is not excluded, include all blocks, even unused ones */ for (l = 0; l < state->level; ++l) { if (!state->parity[l].is_excluded_by_filter) { return 1; } } } /* filter for the files */ for (j = 0; j < diskmax; ++j) { struct snapraid_block* block; /* if no disk, nothing to check */ if (!handle[j].disk) continue; block = fs_par2block_find(handle[j].disk, i); /* try to recover all files, even the ones without hash */ /* because in some cases we can recover also them */ if (block_has_file(block)) { struct snapraid_file* file = fs_par2file_get(handle[j].disk, i, 0); if (!file_flag_has(file, FILE_IS_EXCLUDED)) { /* only if the file is not filtered out */ return 1; } } } return 0; } static int state_check_process(struct snapraid_state* state, int fix, struct snapraid_parity_handle** parity, block_off_t blockstart, block_off_t blockmax) { struct snapraid_handle* handle; unsigned diskmax; block_off_t i; unsigned j; void* buffer_alloc; void** buffer; unsigned buffermax; int ret; data_off_t countsize; block_off_t countpos; block_off_t countmax; unsigned soft_error; unsigned io_error; unsigned silent_error; unsigned unrecoverable_error; unsigned recovered_error; struct failed_struct* failed; unsigned* failed_map; unsigned l; bit_vect_t* block_enabled; struct snapraid_bw bw; handle = handle_mapping(state, &diskmax); /* initialize the bandwidth context */ bw_init(&bw, state->opt.bwlimit); /* share the bandwidth context with all handles */ for (j = 0; j < diskmax; ++j) handle[j].bw = &bw; for (j = 0; j < state->level; ++j) if (parity[j]) parity[j]->bw = &bw; /* we need 1 * data + 2 * parity + 1 * zero */ buffermax = diskmax + 2 * state->level + 1; buffer = malloc_nofail_vector_align(diskmax, buffermax, state->block_size, &buffer_alloc); if (!state->opt.skip_self) mtest_vector(buffermax, state->block_size, buffer); /* fill up the zero buffer */ memset(buffer[buffermax - 1], 0, state->block_size); raid_zero(buffer[buffermax - 1]); failed = malloc_nofail(diskmax * sizeof(struct failed_struct)); failed_map = malloc_nofail(diskmax * sizeof(unsigned)); soft_error = 0; io_error = 0; silent_error = 0; unrecoverable_error = 0; recovered_error = 0; msg_progress("Selecting...\n"); /* first count the number of blocks to process */ countmax = 0; block_enabled = calloc_nofail(1, bit_vect_size(blockmax)); /* preinitialize to 0 */ for (i = blockstart; i < blockmax; ++i) { if (!block_is_enabled(state, i, handle, diskmax)) continue; bit_vect_set(block_enabled, i); ++countmax; } if (fix) msg_progress("Fixing...\n"); else if (!state->opt.auditonly) msg_progress("Checking...\n"); else msg_progress("Hashing...\n"); /* check all the blocks in files */ countsize = 0; countpos = 0; int alert = state_progress_begin(state, blockstart, blockmax, countmax); if (alert > 0) goto end; if (alert < 0) goto bail; for (i = blockstart; i < blockmax; ++i) { unsigned failed_count; int valid_parity; int used_parity; snapraid_info info; int rehash; if (!bit_vect_test(block_enabled, i)) { /* continue with the next block */ continue; } /* If we have valid parity, and it makes sense to check its content. */ /* If we already know that the parity is invalid, we just read the file */ /* but we don't report parity errors */ /* Note that with auditonly, we anyway skip the full parity check, */ /* because we also don't read it at all */ valid_parity = 1; /* If the parity is used by at least one file */ used_parity = 0; /* keep track of the number of failed blocks */ failed_count = 0; /* get block specific info */ info = info_get(&state->infoarr, i); /* if we have to use the old hash */ rehash = info_get_rehash(info); /* for each disk, process the block */ for (j = 0; j < diskmax; ++j) { int read_size; unsigned char hash[HASH_MAX]; struct snapraid_disk* disk; struct snapraid_block* block; struct snapraid_file* file; block_off_t file_pos; unsigned block_state; /* if the disk position is not used */ disk = handle[j].disk; if (!disk) { /* use an empty block */ memset(buffer[j], 0, state->block_size); continue; } /* if the disk block is not used */ block = fs_par2block_find(disk, i); if (block == BLOCK_NULL) { /* use an empty block */ memset(buffer[j], 0, state->block_size); continue; } /* get the state of the block */ block_state = block_state_get(block); /* if the parity is not valid */ if (block_has_invalid_parity(block)) { /* mark the parity as invalid, and don't try to check/fix it */ /* because it will be recomputed at the next sync */ valid_parity = 0; /* follow */ } /* if the block is DELETED */ if (block_state == BLOCK_STATE_DELETED) { /* use an empty block */ memset(buffer[j], 0, state->block_size); /* store it in the failed set, because potentially */ /* the parity may be still computed with the previous content */ failed[failed_count].is_bad = 0; /* note that is_bad==0 <=> file==0 */ failed[failed_count].is_outofdate = 0; failed[failed_count].index = j; failed[failed_count].block = block; failed[failed_count].disk = disk; failed[failed_count].file = 0; failed[failed_count].file_pos = 0; failed[failed_count].handle = 0; ++failed_count; continue; } /* here we are sure that the parity is used by a file */ used_parity = 1; /* get the file of this block */ file = fs_par2file_get(disk, i, &file_pos); /* if we are only hashing, we can skip excluded files and don't even read them */ if (state->opt.auditonly && file_flag_has(file, FILE_IS_EXCLUDED)) { /* use an empty block */ /* in true, this is unnecessary, because we are not checking any parity */ /* but we keep it for completeness */ memset(buffer[j], 0, state->block_size); continue; } /* if the file is closed or different than the current one */ if (handle[j].file == 0 || handle[j].file != file) { /* keep a pointer at the file we are going to close for error reporting */ struct snapraid_file* report = handle[j].file; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), i, disk->name, esc_tag(report->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", i); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* if fixing, and the file is not excluded, we must open for writing */ if (fix && !file_flag_has(file, FILE_IS_EXCLUDED)) { /* if fixing, create the file, open for writing and resize if required */ ret = handle_create(&handle[j], file, state->file_mode); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Create error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", i); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* check if the file was just created */ if (handle[j].created != 0) { /* if fragmented, it may be reopened, so remember that the file */ /* was originally missing */ file_flag_set(file, FILE_IS_CREATED); } } else { /* open the file only for reading */ if (!file_flag_has(file, FILE_IS_MISSING)) { ret = handle_open(&handle[j], file, state->file_mode, state->opt.expected_missing ? log_expected : 0); } else { errno = ENOENT; ret = -1; /* if the file is missing, we cannot open it */ } if (ret == -1) { /* save the failed block for the check/fix */ failed[failed_count].is_bad = 1; failed[failed_count].is_outofdate = 0; failed[failed_count].index = j; failed[failed_count].block = block; failed[failed_count].disk = disk; failed[failed_count].file = file; failed[failed_count].file_pos = file_pos; failed[failed_count].handle = &handle[j]; ++failed_count; log_tag("%s:%u:%s:%s: Open error at position %u. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), file_pos, strerror(errno)); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } /* mark the file as missing, to avoid to retry to open it again */ /* note that this can be done only if we are not fixing it */ /* otherwise, it could be recreated */ file_flag_set(file, FILE_IS_MISSING); continue; } } /* if it's the first open, and not excluded */ if (!file_flag_has(file, FILE_IS_OPENED) && !file_flag_has(file, FILE_IS_EXCLUDED)) { /* check if the file is changed */ if (handle[j].st.st_size != file->size || handle[j].st.st_mtime != file->mtime_sec || STAT_NSEC(&handle[j].st) != file->mtime_nsec /* don't check the inode to support file-system without persistent inodes */ ) { /* report that the file is not synced */ file_flag_set(file, FILE_IS_UNSYNCED); } } /* if it's the first open, and not excluded and larger */ if (!file_flag_has(file, FILE_IS_OPENED) && !file_flag_has(file, FILE_IS_EXCLUDED) && !(state->opt.syncedonly && file_flag_has(file, FILE_IS_UNSYNCED)) && handle[j].st.st_size > file->size ) { log_error(ESOFT, "File '%s' is larger than expected.\n", handle[j].path); log_tag("error:%u:%s:%s: Size error\n", i, disk->name, esc_tag(file->sub)); ++soft_error; if (fix) { ret = handle_truncate(&handle[j], file); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Truncate error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", i); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } log_tag("fixed:%u:%s:%s: Fixed size\n", i, disk->name, esc_tag(file->sub)); ++recovered_error; } } /* mark the file as opened at least one time */ /* this is used to avoid to check the unsynced and size */ /* more than one time, in case the file is reopened later */ file_flag_set(file, FILE_IS_OPENED); } /* read from the file */ if (file_flag_has(file, FILE_IS_MISSING)) { /* if the file is reported missing, don't even try to read it */ errno = ENOENT; read_size = -1; } else { read_size = handle_read(&handle[j], file_pos, buffer[j], state->block_size, state->opt.expected_missing ? log_expected : 0); } if (read_size == -1) { /* save the failed block for the check/fix */ failed[failed_count].is_bad = 1; /* it's bad because we cannot read it */ failed[failed_count].is_outofdate = 0; failed[failed_count].index = j; failed[failed_count].block = block; failed[failed_count].disk = disk; failed[failed_count].file = file; failed[failed_count].file_pos = file_pos; failed[failed_count].handle = &handle[j]; ++failed_count; log_tag("%s:%u:%s:%s: Read error at position %u. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), file_pos, strerror(errno)); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } /* if we are reading at the end, mark the file as missing to avoid to try to read it again at the next block */ if (errno == ENOENT) { file_flag_set(file, FILE_IS_MISSING); } continue; } countsize += read_size; /* always insert CHG blocks, the repair functions needs all of them */ /* because the parity may be still referring at the old state */ /* and the repair must be aware of it */ if (block_state == BLOCK_STATE_CHG) { /* we DO NOT mark them as bad to avoid to overwrite them with wrong data. */ /* if we don't have a hash, we always assume the first read of the block correct. */ failed[failed_count].is_bad = 0; /* we assume the CHG block correct */ failed[failed_count].is_outofdate = 0; failed[failed_count].index = j; failed[failed_count].block = block; failed[failed_count].disk = disk; failed[failed_count].file = file; failed[failed_count].file_pos = file_pos; failed[failed_count].handle = &handle[j]; ++failed_count; continue; } assert(block_state == BLOCK_STATE_BLK || block_state == BLOCK_STATE_REP); /* compute the hash of the block just read */ if (rehash) { memhash(state->prevhash, state->prevhashseed, hash, buffer[j], read_size); } else { memhash(state->hash, state->hashseed, hash, buffer[j], read_size); } /* compare the hash */ if (memcmp(hash, block->hash, BLOCK_HASH_SIZE) != 0) { unsigned diff = memdiff(hash, block->hash, BLOCK_HASH_SIZE); /* save the failed block for the check/fix */ failed[failed_count].is_bad = 1; /* it's bad because the hash doesn't match */ failed[failed_count].is_outofdate = 0; failed[failed_count].index = j; failed[failed_count].block = block; failed[failed_count].disk = disk; failed[failed_count].file = file; failed[failed_count].file_pos = file_pos; failed[failed_count].handle = &handle[j]; ++failed_count; log_tag("error:%u:%s:%s: Data error at position %u, diff hash bits %u/%u\n", i, disk->name, esc_tag(file->sub), file_pos, diff, BLOCK_HASH_SIZE * 8); ++silent_error; continue; } /* always insert REP blocks, the repair functions needs all of them */ /* because the parity may be still referring at the old state */ /* and the repair must be aware of it */ if (block_state == BLOCK_STATE_REP) { failed[failed_count].is_bad = 0; /* it's not bad */ failed[failed_count].is_outofdate = 0; failed[failed_count].index = j; failed[failed_count].block = block; failed[failed_count].disk = disk; failed[failed_count].file = file; failed[failed_count].file_pos = file_pos; failed[failed_count].handle = &handle[j]; ++failed_count; continue; } } /* now read and check the parity if requested */ if (!state->opt.auditonly) { void* buffer_recov[LEV_MAX]; void* buffer_zero; /* buffers for parity read and not computed */ for (l = 0; l < state->level; ++l) buffer_recov[l] = buffer[diskmax + state->level + l]; for (; l < LEV_MAX; ++l) buffer_recov[l] = 0; /* the zero buffer is the last one */ buffer_zero = buffer[buffermax - 1]; /* read the parity */ for (l = 0; l < state->level; ++l) { if (parity[l]) { ret = parity_read(parity[l], i, buffer_recov[l], state->block_size); if (ret == -1) { log_tag("parity_%s:%u:%s: Read error. %s.\n", es(errno), i, lev_config_name(l), strerror(errno)); buffer_recov[l] = 0; /* no parity to use */ if (is_hw(errno)) { ++io_error; } else { ++soft_error; } } } else { buffer_recov[l] = 0; } } /* try all the recovering strategies */ ret = repair(state, rehash, i, diskmax, failed, failed_map, failed_count, buffer, buffer_recov, buffer_zero); if (ret != 0) { /* increment the number of errors */ if (ret > 0) silent_error += ret; ++unrecoverable_error; /* print a list of all the errors in files */ for (j = 0; j < failed_count; ++j) { if (failed[j].is_bad) log_tag("unrecoverable:%u:%s:%s: Unrecoverable error at position %u\n", i, failed[j].disk->name, esc_tag(failed[j].file->sub), failed[j].file_pos); } /* keep track of damaged files */ for (j = 0; j < failed_count; ++j) { if (failed[j].is_bad) file_flag_set(failed[j].file, FILE_IS_DAMAGED); } } else { /* now counts partial recovers */ /* note that this could happen only when we have an incomplete 'sync' */ /* and that we have recovered is the state before the 'sync' */ int partial_recover_error = 0; /* print a list of all the errors in files */ for (j = 0; j < failed_count; ++j) { if (failed[j].is_bad && failed[j].is_outofdate) { ++partial_recover_error; log_tag("unrecoverable:%u:%s:%s: Unrecoverable unsynced error at position %u\n", i, failed[j].disk->name, esc_tag(failed[j].file->sub), failed[j].file_pos); } } if (partial_recover_error != 0) { silent_error += partial_recover_error; ++unrecoverable_error; } /* * Check parities, but only if all the blocks have it computed and it's used. * * If you check/fix after a partial sync, it's OK to have parity errors * on the blocks with invalid parity and doesn't make sense to try to fix it. * * It's also OK to have data errors on unused parity, because sync doesn't * update it. */ if (used_parity && valid_parity) { /* check the parity */ for (l = 0; l < state->level; ++l) { if (buffer_recov[l] != 0 && memcmp(buffer_recov[l], buffer[diskmax + l], state->block_size) != 0) { unsigned diff = memdiff(buffer_recov[l], buffer[diskmax + l], state->block_size); /* mark that the read parity is wrong, setting ptr to 0 */ buffer_recov[l] = 0; log_tag("parity_error:%u:%s: Data error, diff parity bits %u/%u\n", i, lev_config_name(l), diff, state->block_size * 8); ++silent_error; } } } /* now write recovered files */ if (fix) { /* update the fixed files */ for (j = 0; j < failed_count; ++j) { /* nothing to do if it doesn't need recovering */ if (!failed[j].is_bad) continue; /* do not fix if the file is excluded */ if (file_flag_has(failed[j].file, FILE_IS_EXCLUDED) || (state->opt.syncedonly && file_flag_has(failed[j].file, FILE_IS_UNSYNCED))) continue; ret = handle_write(failed[j].handle, failed[j].file_pos, buffer[failed[j].index], state->block_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Write error. %s.\n", es(errno), i, failed[j].disk->name, esc_tag(failed[j].file->sub), strerror(errno)); log_fatal_errno(errno, failed[j].disk->name); log_fatal(errno, "Stopping at block %u\n", i); /* mark the file as damaged */ file_flag_set(failed[j].file, FILE_IS_DAMAGED); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* if we are not sure that the recovered content is uptodate */ if (failed[j].is_outofdate) { /* mark the file as damaged */ file_flag_set(failed[j].file, FILE_IS_DAMAGED); continue; } /* mark the file as containing some fixes */ /* note that it could be also marked as damaged in other iterations */ file_flag_set(failed[j].file, FILE_IS_FIXED); log_tag("fixed:%u:%s:%s: Fixed data error at position %u\n", i, failed[j].disk->name, esc_tag(failed[j].file->sub), failed[j].file_pos); ++recovered_error; } /* * Update parity only if all the blocks have it computed and it's used. * * If you check/fix after a partial sync, you do not want to fix parity * for blocks that are going to have it computed in the sync completion. * * For unused parity there is no need to write it, because when fixing * we already have allocated space for it on parity file creation, * and its content doesn't matter. */ if (used_parity && valid_parity) { /* update the parity */ for (l = 0; l < state->level; ++l) { /* if the parity on disk is wrong */ if (buffer_recov[l] == 0 /* and we have access at the parity */ && parity[l] != 0 /* and the parity is not excluded */ && !state->parity[l].is_excluded_by_filter ) { ret = parity_write(parity[l], i, buffer[diskmax + l], state->block_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s: Write error. %s.\n", es(errno), i, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); log_fatal(errno, "Stopping at block %u\n", i); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } log_tag("parity_fixed:%u:%s: Fixed data error\n", i, lev_config_name(l)); ++recovered_error; } } } } else { /* if we are not fixing, we just set the FIXED flag */ /* meaning that we could fix this file if we try */ for (j = 0; j < failed_count; ++j) { if (failed[j].is_bad) { file_flag_set(failed[j].file, FILE_IS_FIXED); } } } } } else { /* if we are not checking, we just set the DAMAGED flag */ /* to report that the file is damaged, and we don't know if we can fix it */ for (j = 0; j < failed_count; ++j) { if (failed[j].is_bad) { file_flag_set(failed[j].file, FILE_IS_DAMAGED); } } } /* post process the files */ ret = file_post(state, fix, i, handle, diskmax); if (ret == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Stopping at block %u\n", i); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* count the number of processed block */ ++countpos; /* progress */ if (state_progress(state, 0, i, countpos, countmax, countsize)) { /* LCOV_EXCL_START */ break; /* LCOV_EXCL_STOP */ } /* thermal control */ if (state_thermal_alarm(state)) { /* until now is misc */ state_usage_misc(state); state_progress_stop(state); state_thermal_cooldown(state); state_progress_restart(state); /* drop until now */ state_usage_waste(state); } } /* for each disk, recover empty files, symlinks and empty dirs */ for (i = 0; i < diskmax; ++i) { tommy_node* node; struct snapraid_disk* disk; if (!handle[i].disk) continue; /* for each empty file in the disk */ disk = handle[i].disk; node = disk->filelist; while (node) { char path[PATH_MAX]; struct stat st; struct snapraid_file* file; int unsuccessful = 0; file = node->data; node = node->next; /* next node */ /* if not empty, it's already checked and continue to the next one */ if (file->size != 0) { continue; } /* if excluded continue to the next one */ if (file_flag_has(file, FILE_IS_EXCLUDED)) { continue; } /* stat the file */ pathprint(path, sizeof(path), "%s%s", disk->dir, file->sub); ret = stat(path, &st); if (ret == -1) { unsuccessful = 1; log_error(errno, "Error stating empty file '%s'. %s.\n", path, strerror(errno)); log_tag("empty_%s:%s:%s: Empty file stat error\n", es(errno), disk->name, esc_tag(file->sub)); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } } else if (!S_ISREG(st.st_mode)) { unsuccessful = 1; log_error(ESOFT, "Error stating empty file '%s' for not regular file.\n", path); log_tag("empty_error:%s:%s: Empty file error for not regular file\n", disk->name, esc_tag(file->sub)); ++soft_error; } else if (st.st_size != 0) { unsuccessful = 1; log_error(ESOFT, "Error stating empty file '%s' for not empty file.\n", path); log_tag("empty_error:%s:%s: Empty file error for size '%" PRIu64 "'\n", disk->name, esc_tag(file->sub), (uint64_t)st.st_size); ++soft_error; } if (fix && unsuccessful) { int f; /* create the ancestor directories */ ret = mkancestor(path); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating ancestor '%s%s'. %s.\n", disk->dir, file->sub, strerror(errno)); log_tag("empty_%s:%u:%s:%s: Create ancestor error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* create it */ /* O_NOFOLLOW: do not follow links to ensure to open the real file */ f = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_NOFOLLOW, 0600); if (f == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating '%s%s'. %s.\n", disk->dir, file->sub, strerror(errno)); log_tag("empty_%s:%u:%s:%s: Create error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* set the original modification time */ ret = fmtime(f, file->mtime_sec, file->mtime_nsec); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error timing '%s%s'. %s.\n", disk->dir, file->sub, strerror(errno)); log_tag("empty_%s:%u:%s:%s: Time error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); close(f); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* close it */ ret = close(f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing '%s%s'. %s.\n", disk->dir, file->sub, strerror(errno)); log_tag("empty_%s:%u:%s:%s: Close error. %s.\n", es(errno), i, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } log_tag("empty_fixed:%s:%s: Fixed empty file\n", disk->name, esc_tag(file->sub)); ++recovered_error; log_tag("status:recovered:%s:%s\n", disk->name, esc_tag(file->sub)); msg_info("recovered %s\n", fmt_term(disk, file->sub)); } } /* for each link in the disk */ disk = handle[i].disk; node = disk->linklist; while (node) { char path[PATH_MAX]; char pathto[PATH_MAX]; char linkto[PATH_MAX]; struct stat st; struct stat stto; struct snapraid_link* slink; int unsuccessful = 0; int unrecoverable = 0; slink = node->data; node = node->next; /* next node */ /* if excluded continue to the next one */ if (link_flag_has(slink, FILE_IS_EXCLUDED)) { continue; } if (link_flag_has(slink, FILE_IS_HARDLINK)) { /* stat the link */ pathprint(path, sizeof(path), "%s%s", disk->dir, slink->sub); ret = stat(path, &st); if (ret == -1) { unsuccessful = 1; log_error(errno, "Error stating hardlink '%s'. %s.\n", path, strerror(errno)); log_tag("hardlink_%s:%s:%s:%s: Hardlink stat error. %s.\n", es(errno), disk->name, esc_tag(slink->sub), esc_tag(slink->linkto), strerror(errno)); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } } else if (!S_ISREG(st.st_mode)) { unsuccessful = 1; log_error(ESOFT, "Error stating hardlink '%s' for not regular file.\n", path); log_tag("hardlink_error:%s:%s:%s: Hardlink error for not regular file\n", disk->name, esc_tag(slink->sub), esc_tag(slink->linkto)); ++soft_error; } /* stat the "to" file */ pathprint(pathto, sizeof(pathto), "%s%s", disk->dir, slink->linkto); ret = stat(pathto, &stto); if (ret == -1) { unsuccessful = 1; if (errno == ENOENT) { unrecoverable = 1; if (fix) { /* if the target doesn't exist, it's unrecoverable */ /* because we cannot create an hardlink of a file that */ /* doesn't exists */ /* but in check, we can assume that fixing will recover */ /* such missing file, so we assume a less drastic error */ ++unrecoverable_error; } } log_error(errno, "Error stating hardlink-to '%s'. %s.\n", pathto, strerror(errno)); log_tag("hardlink_%s:%s:%s:%s: Hardlink to stat error. %s.\n", es(errno), disk->name, esc_tag(slink->sub), esc_tag(slink->linkto), strerror(errno)); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } } else if (!S_ISREG(stto.st_mode)) { unsuccessful = 1; log_error(ESOFT, "Error stating hardlink-to '%s' for not regular file.\n", path); log_tag("hardlink_error:%s:%s:%s: Hardlink-to error for not regular file\n", disk->name, esc_tag(slink->sub), esc_tag(slink->linkto)); ++soft_error; } else if (!unsuccessful && st.st_ino != stto.st_ino) { unsuccessful = 1; log_error(ESOFT, "Mismatch hardlink '%s' and '%s'. Different inode.\n", path, pathto); log_tag("hardlink_error:%s:%s:%s: Hardlink mismatch for different inode\n", disk->name, esc_tag(slink->sub), esc_tag(slink->linkto)); ++soft_error; } } else { /* read the symlink */ pathprint(path, sizeof(path), "%s%s", disk->dir, slink->sub); ret = readlink(path, linkto, sizeof(linkto)); if (ret < 0) { unsuccessful = 1; log_error(errno, "Error reading symlink '%s'. %s.\n", path, strerror(errno)); log_tag("symlink_%s:%s:%s: Symlink read error. %s.\n", es(errno), disk->name, esc_tag(slink->sub), strerror(errno)); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } } else if (ret >= PATH_MAX) { unsuccessful = 1; log_error(ESOFT, "Error reading symlink '%s'. Symlink too long.\n", path); log_tag("symlink_error:%s:%s: Symlink too long\n", disk->name, esc_tag(slink->sub)); ++soft_error; } else { linkto[ret] = 0; if (strcmp(linkto, slink->linkto) != 0) { unsuccessful = 1; log_tag("symlink_error:%s:%s: Symlink data error '%s' instead of '%s'\n", disk->name, esc_tag(slink->sub), linkto, slink->linkto); ++soft_error; } } } if (fix && unsuccessful && !unrecoverable) { const char* link = link_flag_has(slink, FILE_IS_HARDLINK) ? "hard" : "sym"; /* create the ancestor directories */ ret = mkancestor(path); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating ancestor '%s%s'. %s.\n", disk->dir, slink->sub, strerror(errno)); log_tag("%slink_%s:%u:%s:%s: Create ancestor error. %s.\n", link, es(errno), i, disk->name, esc_tag(slink->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* if it exists, it must be deleted before recreating */ ret = remove(path); if (ret != 0 && errno != ENOENT) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing '%s%s'. %s.\n", disk->dir, slink->sub, strerror(errno)); log_tag("%slink_%s:%u:%s:%s: Remove error. %s.\n", link, es(errno), i, disk->name, esc_tag(slink->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* create it */ if (link_flag_has(slink, FILE_IS_HARDLINK)) { ret = hardlink(pathto, path); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing hardlink '%s' to '%s'. %s.\n", path, pathto, strerror(errno)); log_tag("hardlink_%s:%u:%s:%s: Hardlink error. %s.\n", es(errno), i, disk->name, esc_tag(slink->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } log_tag("hardlink_fixed:%s:%s: Fixed hardlink error\n", disk->name, esc_tag(slink->sub)); ++recovered_error; } else { ret = symlink(slink->linkto, path); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing symlink '%s' to '%s'. %s.\n", path, slink->linkto, strerror(errno)); log_tag("symlink_%s:%u:%s:%s: Hardlink error. %s.\n", es(errno), i, disk->name, esc_tag(slink->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } log_tag("symlink_fixed:%s:%s: Fixed symlink error\n", disk->name, esc_tag(slink->sub)); ++recovered_error; } log_tag("status:recovered:%s:%s\n", disk->name, esc_tag(slink->sub)); msg_info("recovered %s\n", fmt_term(disk, slink->sub)); } } /* for each dir in the disk */ disk = handle[i].disk; node = disk->dirlist; while (node) { char path[PATH_MAX]; struct stat st; struct snapraid_dir* dir; int unsuccessful = 0; dir = node->data; node = node->next; /* next node */ /* if excluded continue to the next one */ if (dir_flag_has(dir, FILE_IS_EXCLUDED)) { continue; } /* stat the dir */ pathprint(path, sizeof(path), "%s%s", disk->dir, dir->sub); ret = stat(path, &st); if (ret == -1) { unsuccessful = 1; log_error(errno, "Error stating dir '%s'. %s.\n", path, strerror(errno)); log_tag("dir_%s:%s:%s: Dir stat error. %s.\n", es(errno), disk->name, esc_tag(dir->sub), strerror(errno)); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } } else if (!S_ISDIR(st.st_mode)) { unsuccessful = 1; log_tag("dir_error:%s:%s: Dir error for not directory\n", disk->name, esc_tag(dir->sub)); ++soft_error; } if (fix && unsuccessful) { /* create the ancestor directories */ ret = mkancestor(path); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating ancestor '%s%s'. %s.\n", disk->dir, dir->sub, strerror(errno)); log_tag("dir_%s:%u:%s:%s: Create ancestor error. %s.\n", es(errno), i, disk->name, esc_tag(dir->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } /* create it */ ret = mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); if (ret != 0 && errno != EEXIST) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating directory '%s%s'. %s.\n", disk->dir, dir->sub, strerror(errno)); log_tag("dir_%s:%u:%s:%s: Create directory error. %s.\n", es(errno), i, disk->name, esc_tag(dir->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping\n"); ++unrecoverable_error; goto bail; /* LCOV_EXCL_STOP */ } log_tag("dir_fixed:%s:%s: Fixed dir error\n", disk->name, esc_tag(dir->sub)); ++recovered_error; log_tag("status:recovered:%s:%s\n", disk->name, esc_tag(dir->sub)); msg_info("recovered %s\n", fmt_term(disk, dir->sub)); } } } end: state_progress_end(state, countpos, countmax, countsize, "Nothing to check.\n"); bail: /* close all the files left open */ for (j = 0; j < diskmax; ++j) { struct snapraid_file* file = handle[j].file; struct snapraid_disk* disk = handle[j].disk; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockmax, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); ++unrecoverable_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } /* remove all the files created from scratch that have not finished the processing */ /* it happens only when aborting pressing Ctrl+C or other reason. */ if (fix) { /* for each disk */ for (i = 0; i < diskmax; ++i) { tommy_node* node; struct snapraid_disk* disk; if (!handle[i].disk) continue; /* for each file in the disk */ disk = handle[i].disk; node = disk->filelist; while (node) { char path[PATH_MAX]; struct snapraid_file* file; file = node->data; node = node->next; /* next node */ /* if the file was not created, meaning that it was already existing */ if (!file_flag_has(file, FILE_IS_CREATED)) { /* nothing to do */ continue; } /* if processing was finished */ if (file_flag_has(file, FILE_IS_FINISHED)) { /* nothing to do */ continue; } /* if the file was originally missing, and processing not yet finished */ /* we have to throw it away to ensure that at the next run we will retry */ /* to fix it, in case we select to undelete missing files */ pathprint(path, sizeof(path), "%s%s", disk->dir, file->sub); ret = remove(path); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing '%s'. %s.\n", path, strerror(errno)); log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockmax, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); ++unrecoverable_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } } } if (soft_error || io_error || silent_error || recovered_error || unrecoverable_error) { msg_status("\n"); msg_status("%8u soft errors\n", soft_error); msg_status("%8u io errors\n", io_error); msg_status("%8u data errors\n", silent_error); if (fix) { msg_status("%8u recovered errors\n", recovered_error); } if (unrecoverable_error) { msg_status("%8u UNRECOVERABLE errors\n", unrecoverable_error); } else { /* without checking, we don't know if they are really recoverable or not */ if (!state->opt.auditonly) msg_status("%8u unrecoverable errors\n", unrecoverable_error); if (fix) msg_status("Everything OK\n"); } } else { msg_status("Everything OK\n"); } if ((soft_error || io_error || silent_error) && !fix) { if (soft_error) log_fatal(ESOFT, "WARNING! There are soft errors!\n"); if (io_error) log_fatal(EIO, "DANGER! Unexpected input/output errors!\n"); if (silent_error) log_fatal(EDATA, "DANGER! Unexpected silent data errors!\n"); } if (unrecoverable_error) log_fatal(ESOFT, "DANGER! Unrecoverable errors detected!\n"); log_tag("summary:error_soft:%u\n", soft_error); log_tag("summary:error_io:%u\n", io_error); log_tag("summary:error_data:%u\n", silent_error); if (fix) log_tag("summary:error_recovered:%u\n", recovered_error); if (!state->opt.auditonly) log_tag("summary:error_unrecoverable:%u\n", unrecoverable_error); if (fix) { if (soft_error + io_error + silent_error + recovered_error + unrecoverable_error == 0) log_tag("summary:exit:ok\n"); else if (unrecoverable_error == 0) log_tag("summary:exit:recovered\n"); else log_tag("summary:exit:unrecoverable\n"); } else if (!state->opt.auditonly) { if (soft_error + io_error + silent_error + unrecoverable_error == 0) log_tag("summary:exit:ok\n"); else if (unrecoverable_error == 0) log_tag("summary:exit:recoverable\n"); else log_tag("summary:exit:unrecoverable\n"); } else { /* audit only */ if (soft_error + silent_error + io_error == 0) log_tag("summary:exit:ok\n"); else if (silent_error + io_error == 0) log_tag("summary:exit:warning\n"); else log_tag("summary:exit:error\n"); } log_flush(); free(failed); free(failed_map); free(block_enabled); free(handle); free(buffer_alloc); free(buffer); /* fail if some error are present after the run */ if (fix) { if (state->opt.expect_unrecoverable) { if (unrecoverable_error == 0) return -1; } else { if (unrecoverable_error != 0) return -1; } } else { if (state->opt.expect_unrecoverable) { if (unrecoverable_error == 0) return -1; } else if (state->opt.expect_recoverable) { if (unrecoverable_error != 0) return -1; if (soft_error + silent_error + io_error == 0) return -1; } else { if (unrecoverable_error != 0) return -1; if (soft_error + silent_error + io_error != 0) return -1; } } if (alert < 0) return -1; return 0; } int state_check(struct snapraid_state* state, int fix, block_off_t blockstart, block_off_t blockcount) { block_off_t blockmax; data_off_t size; int ret; struct snapraid_parity_handle parity[LEV_MAX]; struct snapraid_parity_handle* parity_ptr[LEV_MAX]; unsigned process_error; unsigned l; msg_progress("Initializing...\n"); blockmax = parity_allocated_size(state); size = blockmax * (data_off_t)state->block_size; if (blockstart > blockmax) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Error in the specified starting block %u. It's larger than the parity size %u.\n", blockstart, blockmax); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* adjust the number of block to process */ if (blockcount != 0 && blockcount < blockmax - blockstart) { blockmax = blockstart + blockcount; } if (fix) { /* if fixing, create the file and open for writing */ /* if it fails, we cannot continue */ for (l = 0; l < state->level; ++l) { /* skip parity disks that are not accessible */ if (state->parity[l].skip_access) { parity_ptr[l] = 0; continue; } parity_ptr[l] = &parity[l]; /* if the parity is excluded */ if (state->parity[l].is_excluded_by_filter) { /* open for reading, and ignore error */ ret = parity_open(parity_ptr[l], &state->parity[l], l, state->file_mode, state->block_size, state->opt.parity_limit_size); if (ret == -1) { log_tag("parity_%s:%u:%s: Open error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); if (is_hw(errno)) { log_fatal_errno(errno, lev_config_name(l)); exit(EXIT_FAILURE); } /* continue anyway */ parity_ptr[l] = 0; } } else { /* open for writing */ ret = parity_create(parity_ptr[l], &state->parity[l], l, state->file_mode, state->block_size, state->opt.parity_limit_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Create error. %s.\n", es(errno), 0, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = parity_chsize(parity_ptr[l], &state->parity[l], 0, size, state->block_size, state->opt.skip_fallocate, state->opt.skip_space_holder); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Create error. %s.\n", es(errno), 0, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } } else if (!state->opt.auditonly) { /* if checking, open the file for reading */ /* it may fail if the file doesn't exist, in this case we continue to check the files */ for (l = 0; l < state->level; ++l) { parity_ptr[l] = &parity[l]; ret = parity_open(parity_ptr[l], &state->parity[l], l, state->file_mode, state->block_size, state->opt.parity_limit_size); if (ret == -1) { log_tag("parity_%s:%u:%s: Open error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); if (is_hw(errno)) { log_fatal_errno(errno, lev_config_name(l)); exit(EXIT_FAILURE); } msg_status("No accessible %s file, only files will be checked.\n", lev_name(l)); /* continue anyway */ parity_ptr[l] = 0; } } } else { /* otherwise don't use any parity */ for (l = 0; l < state->level; ++l) parity_ptr[l] = 0; } process_error = 0; /* skip degenerated cases of empty parity, or skipping all */ if (blockstart < blockmax) { ret = state_check_process(state, fix, parity_ptr, blockstart, blockmax); if (ret == -1) { /* LCOV_EXCL_START */ ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } /* try to close only if opened */ for (l = 0; l < state->level; ++l) { if (parity_ptr[l]) { /* if fixing and not excluded, truncate parity not valid */ if (fix && !state->parity[l].is_excluded_by_filter) { ret = parity_truncate(parity_ptr[l]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Truncate error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } ret = parity_close(parity_ptr[l]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Close error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } } if (process_error != 0) return -1; return 0; } snapraid-14.9/cmdline/checker.c000066400000000000000000000002471522717156100164450ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni /* enable the --test-run option */ #define HAVE_CHECKER 1 #include "snapraid.c" snapraid-14.9/cmdline/device.c000066400000000000000000001075001522717156100163000ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2015 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "state.h" #include "raid/raid.h" void device_name_set(devinfo_t* dev, const char* name, int index) { if (index == 0) pathcpy(dev->name, sizeof(dev->name), name); else pathprint(dev->name, sizeof(dev->name), "%s/%d", name, index); } /** * The following are Failure Rate tables computed from the data that * BackBlaze made available at: * * Reliability Data Set For 41,000 Hard Drives Now Open Source * https://www.backblaze.com/blog/hard-drive-data-feb2015/ * * Hard Drive Data Sets * https://www.backblaze.com/hard-drive-test-data.html * * Note that in this data: * - Disks all passed the load-testing and have made it to production, * and then Dead On Arrival (DOA) failures are excluded. * - Disks that are predicted to fail by BackBlaze are removed before * they really fail, not counting as a failure. * * The following tables are computed using the data from 2014-02-14 to * 2014-12-31 because it's the period when more SMART attributes were gathered. * * In this period there are 47322 disks seen, with 1988 removed because failed, * and with 4121 removed because predicted to fail. */ /** * Number of data points in each table. */ #define SMART_MEASURES 256 /* * Divider for SMART attribute 5 */ static unsigned SMART_5_STEP = 1; /* * Failure rate for 30 days, for a disk * with SMART attribute 5 at a given value. */ static double SMART_5_R[SMART_MEASURES] = { 0.0026, 0.0748, 0.0919, 0.1013, 0.1079, 0.1137, 0.1194, 0.1235, 0.1301, 0.1398, 0.1453, 0.1490, 0.1528, 0.1566, 0.1595, 0.1635, 0.1656, 0.1701, 0.1718, 0.1740, 0.1762, 0.1787, 0.1808, 0.1833, 0.1858, 0.1885, 0.1901, 0.1915, 0.1934, 0.1958, 0.1975, 0.1993, 0.2014, 0.2048, 0.2068, 0.2088, 0.2109, 0.2120, 0.2137, 0.2160, 0.2173, 0.2214, 0.2226, 0.2237, 0.2262, 0.2277, 0.2292, 0.2304, 0.2338, 0.2369, 0.2381, 0.2396, 0.2411, 0.2427, 0.2445, 0.2462, 0.2472, 0.2488, 0.2496, 0.2504, 0.2514, 0.2525, 0.2535, 0.2544, 0.2554, 0.2571, 0.2583, 0.2601, 0.2622, 0.2631, 0.2635, 0.2644, 0.2659, 0.2675, 0.2682, 0.2692, 0.2701, 0.2707, 0.2712, 0.2726, 0.2745, 0.2767, 0.2778, 0.2784, 0.2800, 0.2814, 0.2834, 0.2839, 0.2851, 0.2877, 0.2883, 0.2891, 0.2900, 0.2907, 0.2916, 0.2934, 0.2950, 0.2969, 0.2975, 0.2983, 0.2999, 0.3006, 0.3013, 0.3021, 0.3033, 0.3054, 0.3066, 0.3074, 0.3082, 0.3094, 0.3106, 0.3112, 0.3120, 0.3137, 0.3141, 0.3145, 0.3151, 0.3159, 0.3169, 0.3174, 0.3181, 0.3194, 0.3215, 0.3219, 0.3231, 0.3234, 0.3237, 0.3242, 0.3255, 0.3270, 0.3283, 0.3286, 0.3289, 0.3304, 0.3315, 0.3322, 0.3347, 0.3361, 0.3382, 0.3384, 0.3395, 0.3398, 0.3401, 0.3405, 0.3411, 0.3431, 0.3435, 0.3442, 0.3447, 0.3450, 0.3455, 0.3464, 0.3472, 0.3486, 0.3497, 0.3501, 0.3509, 0.3517, 0.3531, 0.3535, 0.3540, 0.3565, 0.3569, 0.3576, 0.3579, 0.3584, 0.3590, 0.3594, 0.3599, 0.3621, 0.3627, 0.3642, 0.3649, 0.3655, 0.3658, 0.3667, 0.3683, 0.3699, 0.3704, 0.3707, 0.3711, 0.3715, 0.3718, 0.3721, 0.3727, 0.3740, 0.3744, 0.3748, 0.3753, 0.3756, 0.3761, 0.3766, 0.3775, 0.3794, 0.3801, 0.3804, 0.3813, 0.3817, 0.3823, 0.3831, 0.3847, 0.3875, 0.3881, 0.3886, 0.3890, 0.3893, 0.3896, 0.3900, 0.3907, 0.3923, 0.3925, 0.3933, 0.3936, 0.3961, 0.3971, 0.3981, 0.3989, 0.4007, 0.4012, 0.4018, 0.4023, 0.4027, 0.4041, 0.4048, 0.4056, 0.4073, 0.4079, 0.4086, 0.4104, 0.4107, 0.4109, 0.4112, 0.4118, 0.4133, 0.4139, 0.4144, 0.4146, 0.4148, 0.4164, 0.4165, 0.4174, 0.4191, 0.4197, 0.4201, 0.4204, 0.4210, 0.4213, 0.4216, 0.4221, 0.4231, 0.4235, 0.4237, 0.4239, 0.4241, 0.4244, 0.4249, }; /* * Divider for SMART attribute 187 */ static unsigned SMART_187_STEP = 1; /* * Failure rate for 30 days, for a disk * with SMART attribute 187 at a given value. */ static double SMART_187_R[SMART_MEASURES] = { 0.0039, 0.1287, 0.1579, 0.1776, 0.1905, 0.2013, 0.2226, 0.3263, 0.3612, 0.3869, 0.4086, 0.4292, 0.4559, 0.5278, 0.5593, 0.5847, 0.6124, 0.6345, 0.6517, 0.6995, 0.7308, 0.7541, 0.7814, 0.8122, 0.8306, 0.8839, 0.9100, 0.9505, 0.9906, 1.0254, 1.0483, 1.1060, 1.1280, 1.1624, 1.1895, 1.2138, 1.2452, 1.2864, 1.3120, 1.3369, 1.3705, 1.3894, 1.4055, 1.4218, 1.4434, 1.4670, 1.4834, 1.4993, 1.5174, 1.5400, 1.5572, 1.5689, 1.5808, 1.6198, 1.6346, 1.6405, 1.6570, 1.6618, 1.6755, 1.6877, 1.7100, 1.7258, 1.7347, 1.7814, 1.7992, 1.8126, 1.8225, 1.8269, 1.8341, 1.8463, 1.8765, 1.8850, 1.9005, 1.9281, 1.9398, 1.9618, 1.9702, 1.9905, 2.0099, 2.0480, 2.0565, 2.0611, 2.0709, 2.0846, 2.0895, 2.0958, 2.1008, 2.1055, 2.1097, 2.1235, 2.1564, 2.1737, 2.1956, 2.1989, 2.2015, 2.2148, 2.2355, 2.2769, 2.2940, 2.3045, 2.3096, 2.3139, 2.3344, 2.3669, 2.3779, 2.3941, 2.4036, 2.4396, 2.4473, 2.4525, 2.4656, 2.4762, 2.4787, 2.5672, 2.5732, 2.5755, 2.5794, 2.5886, 2.6100, 2.6144, 2.6341, 2.6614, 2.6679, 2.6796, 2.6847, 2.6872, 2.6910, 2.6934, 2.6995, 2.7110, 2.7179, 2.7204, 2.7232, 2.7282, 2.7355, 2.7375, 2.7422, 2.7558, 2.7580, 2.7643, 2.7767, 2.7770, 2.8016, 2.9292, 2.9294, 2.9337, 2.9364, 2.9409, 2.9436, 2.9457, 2.9466, 2.9498, 2.9543, 2.9570, 2.9573, 2.9663, 2.9708, 2.9833, 2.9859, 2.9895, 2.9907, 2.9932, 2.9935, 3.0021, 3.0035, 3.0079, 3.0103, 3.0126, 3.0151, 3.0266, 3.0288, 3.0320, 3.0330, 3.0343, 3.0373, 3.0387, 3.0438, 3.0570, 3.0579, 3.0616, 3.0655, 3.0728, 3.0771, 3.0794, 3.0799, 3.0812, 3.1769, 3.1805, 3.1819, 3.1860, 3.1869, 3.2004, 3.2016, 3.2025, 3.2070, 3.2129, 3.2173, 3.2205, 3.2254, 3.2263, 3.2300, 3.2413, 3.2543, 3.2580, 3.2595, 3.2611, 3.2624, 3.2787, 3.2798, 3.2809, 3.2823, 3.2833, 3.2834, 3.2853, 3.2866, 3.3332, 3.3580, 3.3595, 3.3625, 3.3631, 3.3667, 3.3702, 3.3737, 3.3742, 3.3747, 3.3769, 3.3775, 3.3791, 3.3809, 3.3813, 3.3814, 3.3822, 3.3827, 3.3828, 3.3833, 3.3833, 3.3843, 3.3882, 3.3963, 3.4047, 3.4057, 3.4213, 3.4218, 3.4230, 3.4231, 3.4240, 3.4262, 3.4283, 3.4283, 3.4288, 3.4293, 3.4302, 3.4317, 3.4478, 3.4486, 3.4520, }; /* * Divider for SMART attribute 188 */ static unsigned SMART_188_STEP = 1; /* * Failure rate for 30 days, for a disk * with SMART attribute 188 at a given value. */ static double SMART_188_R[SMART_MEASURES] = { 0.0025, 0.0129, 0.0182, 0.0215, 0.0236, 0.0257, 0.0279, 0.0308, 0.0341, 0.0382, 0.0430, 0.0491, 0.0565, 0.0658, 0.0770, 0.0906, 0.1037, 0.1197, 0.1355, 0.1525, 0.1686, 0.1864, 0.2011, 0.2157, 0.2281, 0.2404, 0.2505, 0.2591, 0.2676, 0.2766, 0.2827, 0.2913, 0.2999, 0.3100, 0.3185, 0.3298, 0.3361, 0.3446, 0.3506, 0.3665, 0.3699, 0.3820, 0.3890, 0.4059, 0.4108, 0.4255, 0.4290, 0.4424, 0.4473, 0.4617, 0.4667, 0.4770, 0.4829, 0.4977, 0.4997, 0.5102, 0.5137, 0.5283, 0.5316, 0.5428, 0.5480, 0.5597, 0.5634, 0.5791, 0.5826, 0.5929, 0.5945, 0.6025, 0.6102, 0.6175, 0.6245, 0.6313, 0.6421, 0.6468, 0.6497, 0.6557, 0.6570, 0.6647, 0.6698, 0.6769, 0.6849, 0.6884, 0.6925, 0.7025, 0.7073, 0.7161, 0.7223, 0.7256, 0.7280, 0.7411, 0.7445, 0.7530, 0.7628, 0.7755, 0.7900, 0.8006, 0.8050, 0.8098, 0.8132, 0.8192, 0.8230, 0.8293, 0.8356, 0.8440, 0.8491, 0.8672, 0.8766, 0.8907, 0.8934, 0.8992, 0.9062, 0.9111, 0.9209, 0.9290, 0.9329, 0.9378, 0.9385, 0.9402, 0.9427, 0.9448, 0.9459, 0.9568, 0.9626, 0.9628, 0.9730, 0.9765, 0.9797, 0.9825, 0.9873, 0.9902, 0.9926, 0.9991, 1.0031, 1.0044, 1.0062, 1.0120, 1.0148, 1.0188, 1.0218, 1.0231, 1.0249, 1.0277, 1.0335, 1.0355, 1.0417, 1.0467, 1.0474, 1.0510, 1.0529, 1.0532, 1.0562, 1.0610, 1.0702, 1.0708, 1.0800, 1.0804, 1.0845, 1.1120, 1.1191, 1.1225, 1.1264, 1.1265, 1.1335, 1.1347, 1.1479, 1.1479, 1.1519, 1.1545, 1.1645, 1.1646, 1.1647, 1.1649, 1.1678, 1.1713, 1.1723, 1.1733, 1.1736, 1.1736, 1.1738, 1.1739, 1.1739, 1.1741, 1.1741, 1.1746, 1.1746, 1.1748, 1.1750, 1.1760, 1.1794, 1.1854, 1.1908, 1.1912, 1.1912, 1.1971, 1.2033, 1.2033, 1.2120, 1.2166, 1.2185, 1.2185, 1.2189, 1.2211, 1.2226, 1.2234, 1.2320, 1.2345, 1.2345, 1.2347, 1.2350, 1.2350, 1.2407, 1.2408, 1.2408, 1.2408, 1.2409, 1.2460, 1.2518, 1.2519, 1.2519, 1.2519, 1.2520, 1.2520, 1.2521, 1.2521, 1.2521, 1.2593, 1.2745, 1.2760, 1.2772, 1.2831, 1.2833, 1.2890, 1.2906, 1.3166, 1.3201, 1.3202, 1.3202, 1.3202, 1.3204, 1.3204, 1.3314, 1.3422, 1.3423, 1.3441, 1.3491, 1.3583, 1.3602, 1.3606, 1.3636, 1.3650, 1.3661, 1.3703, 1.3708, 1.3716, 1.3730, 1.3731, }; /* * Divider for SMART attribute 197 */ static unsigned SMART_197_STEP = 1; /* * Failure rate for 30 days, for a disk * with SMART attribute 197 at a given value. */ static double SMART_197_R[SMART_MEASURES] = { 0.0028, 0.2972, 0.3883, 0.4363, 0.4644, 0.4813, 0.4948, 0.5051, 0.5499, 0.8535, 0.8678, 0.8767, 0.8882, 0.8933, 0.9012, 0.9076, 0.9368, 1.1946, 1.2000, 1.2110, 1.2177, 1.2305, 1.2385, 1.2447, 1.2699, 1.4713, 1.4771, 1.4802, 1.4887, 1.5292, 1.5384, 1.5442, 1.5645, 1.7700, 1.7755, 1.7778, 1.7899, 1.7912, 1.7991, 1.7998, 1.8090, 1.9974, 1.9992, 2.0088, 2.0132, 2.0146, 2.0161, 2.0171, 2.0273, 2.1845, 2.1866, 2.1877, 2.1900, 2.1922, 2.1944, 2.1974, 2.2091, 2.3432, 2.3459, 2.3463, 2.3468, 2.3496, 2.3503, 2.3533, 2.3593, 2.4604, 2.4606, 2.4609, 2.4612, 2.4620, 2.4626, 2.4638, 2.4689, 2.5575, 2.5581, 2.5586, 2.5586, 2.5588, 2.5602, 2.5602, 2.5648, 2.6769, 2.6769, 2.6769, 2.6794, 2.6805, 2.6811, 2.6814, 2.6862, 2.7742, 2.7755, 2.7771, 2.7780, 2.7790, 2.7797, 2.7807, 2.7871, 2.9466, 2.9478, 2.9492, 2.9612, 2.9618, 2.9624, 2.9628, 2.9669, 3.1467, 3.1481, 3.1494, 3.1499, 3.1504, 3.1507, 3.1509, 3.1532, 3.2675, 3.2681, 3.2703, 3.2712, 3.2714, 3.2726, 3.2726, 3.2743, 3.3376, 3.3379, 3.3382, 3.3397, 3.3403, 3.3410, 3.3410, 3.3429, 3.4052, 3.4052, 3.4052, 3.4052, 3.4052, 3.4053, 3.4053, 3.4075, 3.4616, 3.4616, 3.4616, 3.4616, 3.4616, 3.4616, 3.4620, 3.4634, 3.4975, 3.4975, 3.4975, 3.4975, 3.4979, 3.4979, 3.4979, 3.4998, 3.5489, 3.5489, 3.5489, 3.5489, 3.5489, 3.5493, 3.5497, 3.5512, 3.5827, 3.5828, 3.5828, 3.5828, 3.5828, 3.5828, 3.5828, 3.5844, 3.6251, 3.6251, 3.6251, 3.6267, 3.6267, 3.6271, 3.6271, 3.6279, 3.6562, 3.6562, 3.6563, 3.7206, 3.7242, 3.7332, 3.7332, 3.7346, 3.7548, 3.7548, 3.7553, 3.7576, 3.7581, 3.7586, 3.7587, 3.7600, 3.7773, 3.7812, 3.7836, 3.7841, 3.7842, 3.7851, 3.7856, 3.7876, 3.8890, 3.8890, 3.8890, 3.8890, 3.8890, 3.8890, 3.8890, 3.8897, 3.9111, 3.9114, 3.9114, 3.9114, 3.9114, 3.9114, 3.9114, 3.9126, 3.9440, 3.9440, 3.9440, 3.9440, 3.9440, 3.9498, 3.9498, 3.9509, 3.9783, 3.9783, 3.9784, 3.9784, 3.9784, 3.9784, 4.0012, 4.0019, 4.0406, 4.0413, 4.0413, 4.0413, 4.0413, 4.0414, 4.0414, 4.0421, 4.0552, 4.0552, 4.0558, 4.0558, 4.0558, 4.0558, 4.0558, 4.0563, 4.0753, 4.0753, 4.0760, 4.1131, 4.1131, 4.1131, 4.1131, }; /* * Divider for SMART attribute 198 */ static unsigned SMART_198_STEP = 1; /* * Failure rate for 30 days, for a disk * with SMART attribute 198 at a given value. */ static double SMART_198_R[SMART_MEASURES] = { 0.0030, 0.5479, 0.5807, 0.5949, 0.6046, 0.6086, 0.6139, 0.6224, 0.6639, 1.0308, 1.0329, 1.0364, 1.0371, 1.0387, 1.0399, 1.0421, 1.0675, 1.3730, 1.3733, 1.3741, 1.3741, 1.3752, 1.3794, 1.3800, 1.3985, 1.6291, 1.6303, 1.6309, 1.6352, 1.6384, 1.6448, 1.6464, 1.6645, 1.8949, 1.8951, 1.8962, 1.9073, 1.9073, 1.9152, 1.9161, 1.9240, 2.1308, 2.1315, 2.1328, 2.1328, 2.1328, 2.1328, 2.1329, 2.1439, 2.3203, 2.3205, 2.3205, 2.3205, 2.3205, 2.3205, 2.3205, 2.3265, 2.4729, 2.4729, 2.4729, 2.4729, 2.4729, 2.4729, 2.4729, 2.4778, 2.5900, 2.5900, 2.5901, 2.5901, 2.5901, 2.5901, 2.5901, 2.5949, 2.6964, 2.6965, 2.6965, 2.6965, 2.6965, 2.6965, 2.6965, 2.7010, 2.8328, 2.8328, 2.8328, 2.8329, 2.8329, 2.8329, 2.8329, 2.8366, 2.9405, 2.9405, 2.9405, 2.9405, 2.9405, 2.9405, 2.9405, 2.9442, 3.1344, 3.1344, 3.1346, 3.1463, 3.1463, 3.1463, 3.1463, 3.1493, 3.3076, 3.3076, 3.3076, 3.3076, 3.3076, 3.3077, 3.3077, 3.3097, 3.4456, 3.4456, 3.4456, 3.4456, 3.4456, 3.4456, 3.4456, 3.4473, 3.5236, 3.5236, 3.5236, 3.5236, 3.5236, 3.5236, 3.5236, 3.5249, 3.6004, 3.6004, 3.6004, 3.6004, 3.6004, 3.6004, 3.6004, 3.6026, 3.6684, 3.6684, 3.6684, 3.6684, 3.6684, 3.6684, 3.6684, 3.6697, 3.7121, 3.7121, 3.7121, 3.7121, 3.7121, 3.7121, 3.7121, 3.7136, 3.7744, 3.7744, 3.7744, 3.7744, 3.7744, 3.7745, 3.7745, 3.7756, 3.8151, 3.8151, 3.8151, 3.8151, 3.8151, 3.8151, 3.8151, 3.8163, 3.8673, 3.8673, 3.8673, 3.8673, 3.8673, 3.8673, 3.8673, 3.8680, 3.9044, 3.9044, 3.9044, 3.9044, 3.9044, 3.9044, 3.9044, 3.9056, 3.9297, 3.9297, 3.9297, 3.9297, 3.9297, 3.9297, 3.9297, 3.9305, 3.9494, 3.9494, 3.9494, 3.9494, 3.9494, 3.9494, 3.9494, 3.9514, 4.0725, 4.0725, 4.0725, 4.0725, 4.0725, 4.0725, 4.0725, 4.0731, 4.0990, 4.0993, 4.0993, 4.0993, 4.0993, 4.0993, 4.0993, 4.1004, 4.1385, 4.1385, 4.1385, 4.1386, 4.1386, 4.1387, 4.1387, 4.1398, 4.1732, 4.2284, 4.2284, 4.2284, 4.2284, 4.2284, 4.2284, 4.2290, 4.2781, 4.2781, 4.2963, 4.2963, 4.2963, 4.2963, 4.2963, 4.2971, 4.3141, 4.3141, 4.3141, 4.3141, 4.3141, 4.3141, 4.3141, 4.3146, 4.3393, 4.3393, 4.3393, 4.3393, 4.3393, 4.3393, 4.3393, }; /** * Computes the estimated Annual Failure Rate from the specified table. */ static double smart_afr_value(double* tab, unsigned step, uint64_t value) { value /= step; if (value >= SMART_MEASURES) value = SMART_MEASURES - 1; /* table rates are for a month, so we scale to a year */ return 365.0 / 30.0 * tab[value]; } /** * Computes the estimated Annual Failure Rate of a set of SMART attributes. * * We define the Annual Failure Rate as the average number of * failures you expect in a year from a disk slot: * * AFR = 8760/MTBF (Mean Time Between Failures in hours). * * Note that this definition is different from the one given * by Seagate, that defines AFR = 1 - exp(-8760/MTBF), that * instead represents the probability of a failure in the next * year. * * To combine the different AFR from different SMART attributes, * we use the maximum rate reported, and we do not sum them, * because the attributes are not independent. */ static double smart_afr(devinfo_t* devinfo) { double afr = 0; uint64_t mask32 = 0xffffffffU; uint64_t mask16 = 0xffffU; uint64_t* info = devinfo->info; struct smart_attr* smart = devinfo->smart; /* do not estimate for not rotational */ if (info[INFO_ROTATION_RATE] == 0) return 0; if (smart[5].raw != SMART_UNASSIGNED) { double r = smart_afr_value(SMART_5_R, SMART_5_STEP, smart[5].raw & mask32); if (afr < r) afr = r; } if (smart[187].raw != SMART_UNASSIGNED) { /* with some disks, only the lower 16 bits are significant */ /* See: http://web.archive.org/web/20130507072056/http://media.kingston.com/support/downloads/MKP_306_SMART_attribute.pdf */ double r = smart_afr_value(SMART_187_R, SMART_187_STEP, smart[187].raw & mask16); if (afr < r) afr = r; } if ( /** * Don't check Command_Timeout (188) for Seagate disks. * * It's reported by users that for Archive SMR (Shingled Magnetic Recording) * and IronWolf disks to be a not significant test as * this value increases too often also on sane disks. */ strncmp(devinfo->model, "ST", 2) != 0 && smart[188].raw != SMART_UNASSIGNED ) { /* with Seagate disks, there are three different 16 bits value reported */ /* the lowest one is the most significant */ double r = smart_afr_value(SMART_188_R, SMART_188_STEP, smart[188].raw & mask16); if (afr < r) afr = r; } if (smart[197].raw != SMART_UNASSIGNED) { double r = smart_afr_value(SMART_197_R, SMART_197_STEP, smart[197].raw & mask32); if (afr < r) afr = r; } if (smart[198].raw != SMART_UNASSIGNED) { double r = smart_afr_value(SMART_198_R, SMART_198_STEP, smart[198].raw & mask32); if (afr < r) afr = r; } return afr; } /** * Calculates the probability of at least one failure occurring * within a year using a Poisson distribution. * * @param afr The aggregate Annual Failure Rate (lambda). * @return The probability as a double between 0 and 1. */ static double poisson_prob_at_least_one_failure(double rate) { return 1.0 - exp(-rate); } /** * Probability of having data loss in a RAID system with the specified ::redundancy * supposing the specified ::array_failure_rate, and ::replace_rate. */ static double raid_prob_of_one_or_more_failures(double array_failure_rate, double replace_rate, unsigned n, unsigned redundancy) { unsigned i; double MTBF; double MTTR; double MTTDL; double raid_failure_rate; /* * Use the MTTDL model (Mean Time To Data Loss) to estimate the * failure rate of the array. * * See: * Garth Alan Gibson, "Redundant Disk Arrays: Reliable, Parallel Secondary Storage", 1990 */ /* avoid division by zero */ if (array_failure_rate == 0) return 0; /* get the Mean Time Between Failure of a single disk */ /* from the array failure rate */ MTBF = n / array_failure_rate; /* get the Mean Time Between Repair (the time that a failed disk is replaced) */ /* from the repair rate */ MTTR = 1.0 / replace_rate; /* use the approximated MTTDL equation */ MTTDL = pow(MTBF, redundancy + 1) / pow(MTTR, redundancy); for (i = 0; i < redundancy + 1; ++i) MTTDL /= n - i; /* the raid failure rate is just the inverse of the MTTDL */ raid_failure_rate = 1.0 / MTTDL; /* probability of at least one RAID failure */ return poisson_prob_at_least_one_failure(raid_failure_rate); } static void state_info_log(devinfo_t* devinfo) { log_tag("info:%s:%s\n", devinfo->file, devinfo->name); if (devinfo->serial[0]) log_tag("attr:%s:%s:serial:%s\n", devinfo->file, devinfo->name, esc_tag(devinfo->serial)); if (devinfo->family[0]) log_tag("attr:%s:%s:family:%s\n", devinfo->file, devinfo->name, esc_tag(devinfo->family)); if (devinfo->model[0]) log_tag("attr:%s:%s:model:%s\n", devinfo->file, devinfo->name, esc_tag(devinfo->model)); if (devinfo->interf[0]) log_tag("attr:%s:%s:interface:%s\n", devinfo->file, devinfo->name, esc_tag(devinfo->interf)); if (devinfo->info[INFO_SIZE] != SMART_UNASSIGNED) log_tag("attr:%s:%s:size:%" PRIu64 "\n", devinfo->file, devinfo->name, devinfo->info[INFO_SIZE]); if (devinfo->info[INFO_ROTATION_RATE] != SMART_UNASSIGNED) log_tag("attr:%s:%s:rotationrate:%" PRIu64 "\n", devinfo->file, devinfo->name, devinfo->info[INFO_ROTATION_RATE]); } static void state_smart_ignore(struct snapraid_state* state, devinfo_t* devinfo) { /* clear attributes to ignore */ for (int i = 0; i < SMART_IGNORE_MAX; ++i) { if (state->smartignore[i] < 256) devinfo->smart[state->smartignore[i]].raw = SMART_UNASSIGNED; if (devinfo->smartignore[i] < 256) devinfo->smart[devinfo->smartignore[i]].raw = SMART_UNASSIGNED; } } static void state_smart_log(devinfo_t* devinfo, double afr) { unsigned j; log_tag("smart:%s:%s\n", devinfo->file, devinfo->name); if (devinfo->smart[SMART_ERROR_PROTOCOL].raw != SMART_UNASSIGNED) log_tag("attr:%s:%s:error_protocol:%" PRIu64 "\n", devinfo->file, devinfo->name, devinfo->smart[SMART_ERROR_PROTOCOL].raw); if (devinfo->smart[SMART_ERROR_MEDIUM].raw != SMART_UNASSIGNED) log_tag("attr:%s:%s:error_medium:%" PRIu64 "\n", devinfo->file, devinfo->name, devinfo->smart[SMART_ERROR_MEDIUM].raw); if (devinfo->smart[SMART_WEAR_LEVEL].raw != SMART_UNASSIGNED) log_tag("attr:%s:%s:wear_level:%" PRIu64 "\n", devinfo->file, devinfo->name, devinfo->smart[SMART_WEAR_LEVEL].raw); if (devinfo->smart[SMART_FLAGS].raw != SMART_UNASSIGNED) log_tag("attr:%s:%s:flags:%" PRIu64 ":%" PRIx64 "\n", devinfo->file, devinfo->name, devinfo->smart[SMART_FLAGS].raw, devinfo->smart[SMART_FLAGS].raw); if (afr != 0) log_tag("attr:%s:%s:afr:%g:%g\n", devinfo->file, devinfo->name, afr, poisson_prob_at_least_one_failure(afr)); for (j = 0; j < 256; ++j) { struct smart_attr* attr = &devinfo->smart[j]; if (attr->raw != SMART_UNASSIGNED) { const char* type = "";; const char* updated = ""; const char* when_failed = ""; if (attr->flags & SMART_ATTR_TYPE_PREFAIL) type = "prefail"; else if (attr->flags & SMART_ATTR_TYPE_OLDAGE) type = "oldage"; if (attr->flags & SMART_ATTR_UPDATE_ALWAYS) updated = "always"; else if (attr->flags & SMART_ATTR_UPDATE_OFFLINE) updated = "offline"; if (attr->flags & SMART_ATTR_WHEN_FAILED_NOW) when_failed = "now"; else if (attr->flags & SMART_ATTR_WHEN_FAILED_PAST) when_failed = "past"; else if (attr->flags & SMART_ATTR_WHEN_FAILED_NEVER) when_failed = "never"; char norm[64] = { 0 }; char worst[64] = { 0 }; char thresh[64] = { 0 }; if (attr->norm != SMART_UNASSIGNED) snprintf(norm, sizeof(norm), "%" PRIu64, attr->norm); if (attr->worst != SMART_UNASSIGNED) snprintf(worst, sizeof(worst), "%" PRIu64, attr->worst); if (attr->thresh != SMART_UNASSIGNED) snprintf(thresh, sizeof(thresh), "%" PRIu64, attr->thresh); log_tag("attr:%s:%s:%u:%" PRIu64 ":%" PRIx64 ":%s:%s:%s:%s:%s:%s:%s\n", devinfo->file, devinfo->name, j, attr->raw, attr->raw, norm, worst, thresh, attr->name, type, updated, when_failed); } } int temp = smart_temp(devinfo); if (temp >= 0) log_tag("attr:%s:%s:temperature:%d\n", devinfo->file, devinfo->name, temp); } static void state_smart(struct snapraid_state* state, unsigned n, tommy_list* low) { tommy_node* i; unsigned j; size_t device_pad; size_t serial_pad; int have_parent; double array_failure_rate; double p_at_least_one_failure; int make_it_fail = 0; uint64_t mask32 = 0xffffffffU; /* compute lengths for padding */ device_pad = 0; serial_pad = 0; have_parent = 0; for (i = tommy_list_head(low); i != 0; i = i->next) { size_t len; devinfo_t* devinfo = i->data; len = strlen(devinfo->file); if (len > device_pad) device_pad = len; len = strlen(devinfo->serial); if (len > serial_pad) serial_pad = len; if (devinfo->parent != 0) have_parent = 1; } printf("SnapRAID SMART report:\n"); printf("\n"); printf(" Temp"); printf(" Power"); printf(" Error"); printf(" FP"); printf(" Wear"); printf(" Size"); printf("\n"); printf(" C"); printf(" OnDays"); printf(" Count"); printf(" "); printf("Level"); printf(" TB"); printf(" "); printl("Serial", serial_pad); printf(" "); printl("Device", device_pad); printf(" Disk"); printf("\n"); /* |<##################################################################72>|####80>| */ printf(" -----------------------------------------------------------------------\n"); array_failure_rate = 0; for (i = tommy_list_head(low); i != 0; i = i->next) { devinfo_t* devinfo = i->data; double afr; uint64_t flag; state_smart_ignore(state, devinfo); int temp = smart_temp(devinfo); if (temp >= 0) printf("%7d", temp); else printf(" -"); if (devinfo->smart[SMART_POWER_ON_HOURS].raw != SMART_UNASSIGNED) printf("%7" PRIu64, (devinfo->smart[SMART_POWER_ON_HOURS].raw & mask32) / 24); else printf(" -"); uint64_t error_count = 0; if (devinfo->smart[SMART_ERROR_PROTOCOL].raw != SMART_UNASSIGNED && devinfo->smart[SMART_ERROR_PROTOCOL].raw != 0) error_count += devinfo->smart[SMART_ERROR_PROTOCOL].raw; if (devinfo->smart[SMART_ERROR_MEDIUM].raw != SMART_UNASSIGNED && devinfo->smart[SMART_ERROR_MEDIUM].raw != 0) error_count += devinfo->smart[SMART_ERROR_MEDIUM].raw; if (devinfo->smart[SMART_FLAGS].raw != SMART_UNASSIGNED) flag = devinfo->smart[SMART_FLAGS].raw; else flag = 0; if (flag & SMARTCTL_FLAG_FAIL) printf(" FAIL"); else if (flag & SMARTCTL_FLAG_PREFAIL) printf(" PREFAIL"); else if (flag & SMARTCTL_FLAG_PREFAIL_LOGGED) printf(" logfail"); else if (error_count != 0) { printf("%8" PRIu64, error_count); } else if (flag & SMARTCTL_FLAG_ERROR_LOGGED) printf(" logerr"); else if (flag & SMARTCTL_FLAG_SELFERROR_LOGGED) printf(" selferr"); else printf(" -"); /* if some fail/prefail attribute, make the command to fail */ if (flag & (SMARTCTL_FLAG_FAIL | SMARTCTL_FLAG_PREFAIL)) make_it_fail = 1; /* note that in older smartmontools, like 5.x, rotation rate is not present */ /* and then it could remain unassigned */ if (flag & (SMARTCTL_FLAG_UNSUPPORTED | SMARTCTL_FLAG_OPEN)) { /* if error running smartctl, skip AFR estimation */ afr = 0; printf(" n/a"); } else if (devinfo->info[INFO_ROTATION_RATE] == 0) { /* if SSD, skip AFR estimation as data is from not SSD disks */ afr = 0; printf(" SSD"); } else { afr = smart_afr(devinfo); if (afr == 0) { /* this happens only if no data */ printf(" -"); } else { /* use only the disks in the array */ if (devinfo->parent != 0 || !have_parent) array_failure_rate += afr; printf("%4.0f%%", poisson_prob_at_least_one_failure(afr) * 100); } } if (devinfo->smart[SMART_WEAR_LEVEL].raw != SMART_UNASSIGNED) { printf(" %3" PRIu64 "%%", devinfo->smart[SMART_WEAR_LEVEL].raw); } else { printf(" -"); } if (devinfo->info[INFO_SIZE] != SMART_UNASSIGNED) printf(" %4.1f", devinfo->info[INFO_SIZE] / 1E12); else printf(" -"); printf(" "); if (*devinfo->serial) printl(devinfo->serial, serial_pad); else printl("-", serial_pad); printf(" "); if (*devinfo->file) printl(devinfo->file, device_pad); else printl("-", device_pad); printf(" "); if (*devinfo->name) printf("%s", devinfo->name); else printf("-"); printf("\n"); state_info_log(devinfo); state_smart_log(devinfo, afr); } printf("\n"); /* |<##################################################################72>|####80>| */ printf("The FP column is the estimated probability (in percentage) that the disk\n"); printf("is going to fail in the next year.\n"); printf("\n"); /* * The probability of one and of at least one failure is computed assuming * a Poisson distribution with the estimated array failure rate. */ p_at_least_one_failure = poisson_prob_at_least_one_failure(array_failure_rate); printf("Probability that at least one disk is going to fail in the next year is %.0f%%.\n", p_at_least_one_failure * 100); log_tag("summary:array_failure:%g:%g\n", array_failure_rate, p_at_least_one_failure); /* print extra stats only in verbose mode */ if (msg_level < MSG_VERBOSE) goto bail; /* |<##################################################################72>|####80>| */ printf("\n"); printf("Probability of data loss in the next year for different parity and\n"); printf("combined scrub and repair time:\n"); printf("\n"); printf(" Parity 1 Week 1 Month 3 Months\n"); printf(" -----------------------------------------------------------------------\n"); for (j = 0; j < RAID_PARITY_MAX; ++j) { printf("%6u", j + 1); printf(" "); printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 7, n, j + 1) * 100, 19); printf(" "); printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 30, n, j + 1) * 100, 17); printf(" "); printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 90, n, j + 1) * 100, 13); printf("\n"); } printf("\n"); /* |<##################################################################72>|####80>| */ printf("These values are the probabilities that in the next year you'll have a\n"); printf("sequence of failures from which the parity won't be able to recover,\n"); printf("assuming that you regularly scrub and repair the array (as needed)\n"); printf("within the specified time.\n"); bail: if (make_it_fail) { printf("\n"); printf("DANGER! SMART is reporting that one or more disks are FAILING!\n"); printf("Please take immediate action!\n"); exit(EXIT_FAILURE); } } void state_attr(struct snapraid_state* state, tommy_list* low) { tommy_node* i; (void)state; for (i = tommy_list_head(low); i != 0; i = i->next) { devinfo_t* devinfo = i->data; state_smart_ignore(state, devinfo); double afr = smart_afr(devinfo); state_info_log(devinfo); state_smart_log(devinfo, afr); } } static void state_probe_report(struct snapraid_state* state, tommy_list* low) { tommy_node* i; size_t device_pad; (void)state; /* compute lengths for padding */ device_pad = 0; for (i = tommy_list_head(low); i != 0; i = i->next) { size_t len; devinfo_t* devinfo = i->data; state_smart_ignore(state, devinfo); len = strlen(devinfo->file); if (len > device_pad) device_pad = len; double afr = smart_afr(devinfo); state_info_log(devinfo); state_smart_log(devinfo, afr); } printf("SnapRAID PROBE report:\n"); printf("\n"); printf(" State "); printf(" "); printl("Device", device_pad); printf(" Disk"); printf("\n"); /* |<##################################################################72>|####80>| */ printf(" -----------------------------------------------------------------------\n"); for (i = tommy_list_head(low); i != 0; i = i->next) { devinfo_t* devinfo = i->data; printf(" "); switch (devinfo->power) { case POWER_STANDBY : printf("StandBy"); break; case POWER_ACTIVE : printf(" Active"); break; default : printf("Unknown"); break; } printf(" "); if (*devinfo->file) printl(devinfo->file, device_pad); else printl("-", device_pad); printf(" "); if (*devinfo->name) printf("%s", devinfo->name); else printf("-"); printf("\n"); log_tag("probe:%s:%s:%d\n", devinfo->file, devinfo->name, devinfo->power); } printf("\n"); } static void state_stat(struct snapraid_state* state, tommy_list* high) { tommy_node* i; (void)state; /* compute lengths for padding */ for (i = tommy_list_head(high); i != 0; i = i->next) { devinfo_t* devinfo = i->data; /* print disk access_stat (not split) */ if (devinfo->split == 0 && devinfo->access_stat != 0) { if (devinfo->name[0]) log_tag("stat:%s:%" PRIu64 "\n", devinfo->name, devinfo->access_stat); } } } static void state_devices(struct snapraid_state* state, tommy_list* low) { tommy_node* i; (void)state; for (i = tommy_list_head(low); i != 0; i = i->next) { devinfo_t* devinfo = i->data; devinfo_t* parent = devinfo->parent; if (parent) { #ifdef _WIN32 printf("%" PRIu64 "\t%s\t%08" PRIx64 "\t%s\t%s\n", devinfo->device, devinfo->wfile, parent->device, parent->wfile, parent->name); #else printf("%u:%u\t%s\t%u:%u\t%s\t%s\n", major(devinfo->device), minor(devinfo->device), devinfo->file, major(parent->device), minor(parent->device), parent->file, parent->name); #endif } } } int devtest(tommy_list* high, tommy_list* low, int operation) { tommy_node* i; unsigned count; if (operation != DEVICE_SMART && operation != DEVICE_PROBE) return -1; /* for each device add some fake data */ count = 0; for (i = tommy_list_head(high); i != 0; i = i->next) { devinfo_t* devinfo = i->data; devinfo_t* entry; int j; entry = calloc_nofail(1, sizeof(devinfo_t)); /* fake device number */ entry->device = tommy_strhash_u32(0, devinfo->name); tommy_list_insert_tail(low, &entry->node, entry); for (j = 0; j < 256; ++j) { switch (count) { case 0 : entry->smart[j].raw = 0; break; case 1 : entry->smart[j].raw = SMART_UNASSIGNED; break; default : entry->smart[j].raw = 0; break; } } pathprint(entry->serial, sizeof(entry->serial), "FAKE_%s", devinfo->serial); pathprint(entry->family, sizeof(entry->family), "FAKE_%s", devinfo->family); pathprint(entry->model, sizeof(entry->model), "FAKE_%s", devinfo->model); pathprint(entry->interf, sizeof(entry->interf), "FAKE_%s", devinfo->interf); pathprint(entry->file, sizeof(entry->file), "FAKE_%s", devinfo->file); pathcpy(entry->name, sizeof(entry->name), devinfo->name); entry->info[INFO_SIZE] = (count + 1) * TERA; entry->info[INFO_ROTATION_RATE] = 7200; entry->smart[SMART_ERROR_MEDIUM].raw = 0; entry->smart[SMART_ERROR_PROTOCOL].raw = 0; entry->smart[SMART_FLAGS].raw = SMART_UNASSIGNED; entry->smart[SMART_TEMPERATURE_CELSIUS].raw = 27; switch (count) { case 3 : entry->smart[SMART_ERROR_PROTOCOL].raw = 1; break; case 4 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_UNSUPPORTED; break; case 5 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_COMMAND; break; case 6 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_OPEN; break; case 7 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_FAIL; break; case 8 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_PREFAIL; break; case 9 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_PREFAIL_LOGGED; break; case 10 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_ERROR_LOGGED; break; case 11 : entry->smart[SMART_FLAGS].raw = SMARTCTL_FLAG_SELFERROR_LOGGED; break; } entry->power = POWER_ACTIVE; ++count; } return 0; } int state_device(struct snapraid_state* state, int operation, tommy_list* filterlist_disk) { tommy_node* i; unsigned j; tommy_list high; tommy_list low; int ret; time_t now = time(0); /* map device if not already done */ if (!state->mapped_device) { devmap(); state->mapped_device = 1; } switch (operation) { case DEVICE_UP : msg_progress("Spinup...\n"); break; case DEVICE_DOWN : msg_progress("Spindown...\n"); break; } tommy_list_init(&high); tommy_list_init(&low); /* for all disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; devinfo_t* entry; if (filterlist_disk != 0 && filter_path(filterlist_disk, 0, disk->name, 0) != 0) continue; entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = disk->device; device_name_set(entry, disk->name, 0); pathcpy(entry->mount, sizeof(entry->mount), disk->dir); pathcpy(entry->smartctl, sizeof(entry->smartctl), disk->smartctl); memcpy(entry->smartignore, disk->smartignore, sizeof(entry->smartignore)); tommy_list_insert_tail(&high, &entry->node, entry); } /* for all parities */ for (j = 0; j < state->level; ++j) { devinfo_t* entry; devinfo_t* split; unsigned s; if (filterlist_disk != 0 && filter_path(filterlist_disk, 0, lev_config_name(j), 0) != 0) continue; for (s = 0; s < state->parity[j].split_mac; ++s) { entry = calloc_nofail(1, sizeof(devinfo_t)); /* keep track of the first split */ if (s == 0) split = entry; else entry->split = split; entry->device = state->parity[j].split_map[s].device; device_name_set(entry, lev_config_name(j), s); pathcpy(entry->mount, sizeof(entry->mount), state->parity[j].split_map[s].path); pathcpy(entry->smartctl, sizeof(entry->smartctl), state->parity[j].smartctl); memcpy(entry->smartignore, state->parity[j].smartignore, sizeof(entry->smartignore)); pathcut(entry->mount); /* remove the parity file */ tommy_list_insert_tail(&high, &entry->node, entry); } } /* extra disks are never spundown or spunup */ int include_extra = 1; switch (operation) { case DEVICE_UP : case DEVICE_DOWN : case DEVICE_DOWNIFUP : include_extra = 0; break; } if (include_extra) { /* for all extra disks */ for (i = state->extralist; i != 0; i = i->next) { struct snapraid_extra* extra = i->data; devinfo_t* entry; if (filterlist_disk != 0 && filter_path(filterlist_disk, 0, extra->name, 0) != 0) continue; entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = extra->device; device_name_set(entry, extra->name, 0); pathcpy(entry->mount, sizeof(entry->mount), extra->dir); pathcpy(entry->smartctl, sizeof(entry->smartctl), extra->smartctl); memcpy(entry->smartignore, extra->smartignore, sizeof(extra->smartignore)); tommy_list_insert_tail(&high, &entry->node, entry); } } /* with a GUI always gives time reference */ if (state->opt.gui) log_tag("unixtime:%" PRIi64 "\n", (int64_t)now); if (state->opt.fake_device) { ret = devtest(&high, &low, operation); } else { ret = devquery(&high, &low, operation); } /* if the list is empty, it's not supported in this platform */ if (ret == 0 && tommy_list_empty(&low)) ret = -1; if (ret != 0) { const char* ope = 0; switch (operation) { case DEVICE_UP : ope = "Spinup"; break; case DEVICE_DOWN : ope = "Spindown"; break; case DEVICE_LIST : ope = "Device listing"; break; case DEVICE_SMART : ope = "Smart"; break; case DEVICE_PROBE : ope = "Probe"; break; case DEVICE_DOWNIFUP : ope = "Spindown"; break; } log_fatal(ESOFT, "%s is unsupported in this platform.\n", ope); } else { state_stat(state, &high); if (operation == DEVICE_SMART) state_smart(state, state->level + tommy_list_count(&state->disklist), &low); if (operation == DEVICE_PROBE) state_probe_report(state, &low); if (operation == DEVICE_UP) state_attr(state, &low); if (operation == DEVICE_LIST) state_devices(state, &low); } tommy_list_foreach(&high, free); tommy_list_foreach(&low, free); return ret; } snapraid-14.9/cmdline/dry.c000066400000000000000000000304501522717156100156360ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "util.h" #include "elem.h" #include "state.h" #include "parity.h" #include "handle.h" #include "io.h" #include "raid/raid.h" /****************************************************************************/ /* dry */ static const char* es(int err) { if (is_hw(err)) return "error_io"; else return "error"; } static void dry_data_reader(struct snapraid_worker* worker, struct snapraid_task* task) { struct snapraid_io* io = worker->io; struct snapraid_state* state = io->state; struct snapraid_handle* handle = worker->handle; struct snapraid_disk* disk = handle->disk; block_off_t blockcur = task->position; unsigned char* buffer = task->buffer; int ret; /* if the disk position is not used */ if (!disk) { /* use an empty block */ memset(buffer, 0, state->block_size); task->state = TASK_STATE_DONE; return; } /* get the block */ task->block = fs_par2block_find(disk, blockcur); /* if the block is not used */ if (!block_has_file(task->block)) { /* use an empty block */ memset(buffer, 0, state->block_size); task->state = TASK_STATE_DONE; return; } /* get the file of this block */ task->file = fs_par2file_get(disk, blockcur, &task->file_pos); /* if the file is different than the current one, close it */ if (handle->file != 0 && handle->file != task->file) { /* keep a pointer at the file we are going to close for error reporting */ struct snapraid_file* report = handle->file; ret = handle_close(handle); if (ret == -1) { /* LCOV_EXCL_START */ /* This one is really an unexpected error, because we are only reading */ /* and closing a descriptor should never fail */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(report->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", blockcur); if (is_hw(errno)) { task->state = TASK_STATE_IOERROR; } else { task->state = TASK_STATE_ERROR; } return; /* LCOV_EXCL_STOP */ } } ret = handle_open(handle, task->file, state->file_mode, 0); if (ret == -1) { log_tag("%s:%u:%s:%s: Open error. %s.\n", es(errno), blockcur, disk->name, esc_tag(task->file->sub), strerror(errno)); if (is_hw(errno)) { /* LCOV_EXCL_START */ log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", blockcur); task->state = TASK_STATE_IOERROR; return; /* LCOV_EXCL_STOP */ } task->state = TASK_STATE_ERROR_CONTINUE; return; } task->read_size = handle_read(handle, task->file_pos, buffer, state->block_size, 0); if (task->read_size == -1) { log_tag("%s:%u:%s:%s: Read error at position %u. %s.\n", es(errno), blockcur, disk->name, esc_tag(task->file->sub), task->file_pos, strerror(errno)); if (is_hw(errno)) { /* LCOV_EXCL_START */ log_fatal_errno(errno, disk->name); task->state = TASK_STATE_IOERROR_CONTINUE; return; /* LCOV_EXCL_STOP */ } task->state = TASK_STATE_ERROR_CONTINUE; return; } /* store the path of the opened file */ pathcpy(task->path, sizeof(task->path), handle->path); task->state = TASK_STATE_DONE; } static void dry_parity_reader(struct snapraid_worker* worker, struct snapraid_task* task) { struct snapraid_io* io = worker->io; struct snapraid_state* state = io->state; struct snapraid_parity_handle* parity_handle = worker->parity_handle; unsigned level = parity_handle->level; block_off_t blockcur = task->position; unsigned char* buffer = task->buffer; int ret; /* read the parity */ ret = parity_read(parity_handle, blockcur, buffer, state->block_size); if (ret == -1) { log_tag("parity_%s:%u:%s: Read error. %s.\n", es(errno), blockcur, lev_config_name(level), strerror(errno)); if (is_hw(errno)) { /* LCOV_EXCL_START */ log_fatal_errno(errno, lev_config_name(level)); task->state = TASK_STATE_IOERROR_CONTINUE; return; /* LCOV_EXCL_STOP */ } task->state = TASK_STATE_ERROR_CONTINUE; return; } task->state = TASK_STATE_DONE; } static int state_dry_process(struct snapraid_state* state, struct snapraid_parity_handle* parity_handle, block_off_t blockstart, block_off_t blockmax) { struct snapraid_io io; struct snapraid_handle* handle; unsigned diskmax; block_off_t blockcur; unsigned j; unsigned buffermax; int ret; data_off_t countsize; block_off_t countpos; block_off_t countmax; unsigned soft_error; unsigned io_error; unsigned l; unsigned* waiting_map; unsigned waiting_mac; handle = handle_mapping(state, &diskmax); /* we need 1 * data + 2 * parity */ buffermax = diskmax + 2 * state->level; /* initialize the io threads */ io_init(&io, state, state->opt.io_cache, buffermax, dry_data_reader, handle, diskmax, dry_parity_reader, 0, parity_handle, state->level); /* possibly waiting disks */ waiting_mac = diskmax > RAID_PARITY_MAX ? diskmax : RAID_PARITY_MAX; waiting_map = malloc_nofail(waiting_mac * sizeof(unsigned)); soft_error = 0; io_error = 0; /* drop until now */ state_usage_waste(state); countmax = blockmax - blockstart; countsize = 0; countpos = 0; blockcur = blockstart; /* start all the worker threads */ io_start(&io, blockstart, blockmax, 0); blockcur = blockstart; int alert = state_progress_begin(state, blockstart, blockmax, countmax); if (alert > 0) goto end; if (alert < 0) goto bail; while (1) { void** buffer; /* go to the next block */ blockcur = io_read_next(&io, &buffer); if (blockcur >= blockmax) break; /* until now is scheduling */ state_usage_sched(state); /* for each disk, process the block */ for (j = 0; j < diskmax; ++j) { struct snapraid_task* task; int read_size; struct snapraid_block* block; struct snapraid_disk* disk; unsigned diskcur; /* until now is misc */ state_usage_misc(state); /* get the next task */ task = io_data_read(&io, &diskcur, waiting_map, &waiting_mac); /* until now is disk */ state_usage_disk(state, handle, waiting_map, waiting_mac); /* get the task results */ disk = task->disk; block = task->block; read_size = task->read_size; /* if the disk position is not used */ if (!disk) continue; state_usage_file(state, disk, task->file); /* if the block is not used */ if (!block_has_file(block)) continue; /* handle error conditions */ if (task->state == TASK_STATE_IOERROR) { /* LCOV_EXCL_START */ ++io_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR) { /* LCOV_EXCL_START */ ++soft_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR_CONTINUE) { ++soft_error; continue; } if (task->state == TASK_STATE_IOERROR_CONTINUE) { ++io_error; if (io_error >= state->opt.io_error_limit) { /* LCOV_EXCL_START */ log_fatal(EIO, "DANGER! Too many input/output errors in the %s disk. It isn't possible to continue.\n", disk->dir); log_fatal(EIO, "Stopping at block %u\n", blockcur); goto bail; /* LCOV_EXCL_STOP */ } /* otherwise continue */ continue; } if (task->state != TASK_STATE_DONE) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in task state\n"); os_abort(); /* LCOV_EXCL_STOP */ } countsize += read_size; } /* until now is misc */ state_usage_misc(state); /* read the parity */ for (l = 0; l < state->level; ++l) { struct snapraid_task* task; unsigned levcur; task = io_parity_read(&io, &levcur, waiting_map, &waiting_mac); /* until now is parity */ state_usage_parity(state, waiting_map, waiting_mac); /* handle error conditions */ if (task->state == TASK_STATE_IOERROR) { /* LCOV_EXCL_START */ ++io_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR) { /* LCOV_EXCL_START */ ++soft_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR_CONTINUE) { ++soft_error; continue; } if (task->state == TASK_STATE_IOERROR_CONTINUE) { ++io_error; if (io_error >= state->opt.io_error_limit) { /* LCOV_EXCL_START */ log_fatal(EIO, "DANGER! Too many input/output errors in the %s disk. It isn't possible to continue.\n", lev_name(levcur)); log_fatal(EIO, "Stopping at block %u\n", blockcur); goto bail; /* LCOV_EXCL_STOP */ } continue; } if (task->state != TASK_STATE_DONE) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in task state\n"); os_abort(); /* LCOV_EXCL_STOP */ } } /* count the number of processed block */ ++countpos; /* progress */ if (state_progress(state, &io, blockcur, countpos, countmax, countsize)) { /* LCOV_EXCL_START */ break; /* LCOV_EXCL_STOP */ } /* thermal control */ if (state_thermal_alarm(state)) { /* until now is misc */ state_usage_misc(state); state_progress_stop(state); state_thermal_cooldown(state); state_progress_restart(state); /* drop until now */ state_usage_waste(state); } } end: state_progress_end(state, countpos, countmax, countsize, "Nothing to dry.\n"); state_usage_print(state); bail: /* stop all the worker threads */ io_stop(&io); for (j = 0; j < diskmax; ++j) { struct snapraid_file* file = handle[j].file; struct snapraid_disk* disk = handle[j].disk; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } if (soft_error || io_error) { msg_status("\n"); msg_status("%8u soft errors\n", soft_error); msg_status("%8u io errors\n", io_error); } else { msg_status("Everything OK\n"); } if (soft_error) log_fatal(ESOFT, "DANGER! Unexpected errors!\n"); if (io_error) log_fatal(EIO, "DANGER! Unexpected input/output errors!\n"); log_tag("summary:error_soft:%u\n", soft_error); log_tag("summary:error_io:%u\n", io_error); if (soft_error + io_error == 0) log_tag("summary:exit:ok\n"); else log_tag("summary:exit:error\n"); log_flush(); free(handle); free(waiting_map); io_done(&io); if (soft_error + io_error != 0) return -1; if (alert < 0) return -1; return 0; } int state_dry(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount) { block_off_t blockmax; int ret; struct snapraid_parity_handle parity_handle[LEV_MAX]; unsigned process_error; unsigned l; msg_progress("Drying...\n"); blockmax = parity_allocated_size(state); if (blockstart > blockmax) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Error in the specified starting block %u. It's larger than the parity size %u.\n", blockstart, blockmax); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* adjust the number of block to process */ if (blockcount != 0 && blockcount < blockmax - blockstart) { blockmax = blockstart + blockcount; } /* open the file for reading */ /* it may fail if the file doesn't exist, in this case we continue to dry the files */ for (l = 0; l < state->level; ++l) { ret = parity_open(&parity_handle[l], &state->parity[l], l, state->file_mode, state->block_size, state->opt.parity_limit_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Open error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } process_error = 0; /* skip degenerated cases of empty parity, or skipping all */ if (blockstart < blockmax) { ret = state_dry_process(state, parity_handle, blockstart, blockmax); if (ret == -1) { /* LCOV_EXCL_START */ ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } /* try to close only if opened */ for (l = 0; l < state->level; ++l) { ret = parity_close(&parity_handle[l]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Close error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } if (process_error != 0) return -1; return 0; } snapraid-14.9/cmdline/dup.c000066400000000000000000000065351522717156100156370ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "util.h" #include "elem.h" #include "state.h" #include "parity.h" #include "handle.h" /****************************************************************************/ /* dup */ struct snapraid_hash { struct snapraid_disk* disk; /**< Disk. */ struct snapraid_file* file; /**< File. */ unsigned char hash[HASH_MAX]; /**< Hash of the whole file. */ /* nodes for data structures */ tommy_hashdyn_node node; }; struct snapraid_hash* hash_alloc(struct snapraid_state* state, struct snapraid_disk* disk, struct snapraid_file* file) { struct snapraid_hash* hash; block_off_t i; unsigned char* buf; size_t hash_size = BLOCK_HASH_SIZE; hash = malloc_nofail(sizeof(struct snapraid_hash)); hash->disk = disk; hash->file = file; buf = malloc_nofail(file->blockmax * hash_size); /* set the back pointer */ for (i = 0; i < file->blockmax; ++i) { struct snapraid_block* block = fs_file2block_get(file, i); memcpy(buf + i * hash_size, block->hash, hash_size); if (!block_has_updated_hash(block)) { free(buf); free(hash); return 0; } } memhash(state->besthash, state->hashseed, hash->hash, buf, file->blockmax * hash_size); free(buf); return hash; } static inline tommy_uint32_t hash_hash(struct snapraid_hash* hash) { return tommy_hash_u32(0, hash->hash, HASH_MAX); } void hash_free(struct snapraid_hash* hash) { free(hash); } int hash_compare(const void* void_arg, const void* void_data) { const char* arg = void_arg; const struct snapraid_hash* hash = void_data; return memcmp(arg, hash->hash, HASH_MAX); } void state_dup(struct snapraid_state* state) { tommy_hashdyn hashset; tommy_node* i; unsigned count; data_off_t size; tommy_hashdyn_init(&hashset); count = 0; size = 0; msg_progress("Comparing...\n"); /* for each disk */ for (i = state->disklist; i != 0; i = i->next) { tommy_node* j; struct snapraid_disk* disk = i->data; /* for each file */ for (j = disk->filelist; j != 0; j = j->next) { struct snapraid_file* file = j->data; struct snapraid_hash* hash; tommy_hash_t hash32; /* if empty, skip it */ if (file->size == 0) continue; hash = hash_alloc(state, disk, file); /* if no hash, skip it */ if (!hash) continue; hash32 = hash_hash(hash); struct snapraid_hash* found = tommy_hashdyn_search(&hashset, hash_compare, hash->hash, hash32); if (found) { ++count; size += found->file->size; log_tag("dup:%s:%s:%s:%s:%" PRIu64 ": dup\n", disk->name, esc_tag(file->sub), found->disk->name, esc_tag(found->file->sub), found->file->size); printf("%12" PRIu64 " %s = %s\n", file->size, fmt_term(disk, file->sub), fmt_term(found->disk, found->file->sub)); hash_free(hash); } else { tommy_hashdyn_insert(&hashset, &hash->node, hash, hash32); } } } tommy_hashdyn_foreach(&hashset, (tommy_foreach_func*)hash_free); tommy_hashdyn_done(&hashset); msg_status("\n"); msg_status("%8u duplicates, for %" PRIu64 " GB\n", count, size / GIGA); if (count) msg_status("There are duplicates!\n"); else msg_status("No duplicates\n"); log_tag("summary:dup_count:%u\n", count); log_tag("summary:dup_size:%" PRIu64 "\n", size); if (count == 0) { log_tag("summary:exit:unique\n"); } else { log_tag("summary:exit:dup\n"); } log_flush(); } snapraid-14.9/cmdline/elem.c000066400000000000000000001220571522717156100157670ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "elem.h" #include "support.h" #include "state.h" #include "util.h" /****************************************************************************/ /* snapraid */ int BLOCK_HASH_SIZE = HASH_MAX; struct snapraid_content* content_alloc(const char* path, uint64_t dev) { struct snapraid_content* content; content = malloc_nofail(sizeof(struct snapraid_content)); pathimport(content->content, sizeof(content->content), path); content->device = dev; return content; } void content_free(struct snapraid_content* content) { free(content); } struct snapraid_filter* filter_alloc_file(int direction, const char* root, const char* pattern) { struct snapraid_filter* filter; char* i; char* first; char* last; int token_is_valid; int token_is_filled; filter = malloc_nofail(sizeof(struct snapraid_filter)); pathimport(filter->pattern, sizeof(filter->pattern), pattern); pathimport(filter->root, sizeof(filter->root), root); filter->direction = direction; /* find first and last slash */ first = 0; last = 0; /* reject invalid tokens, like "", ".", ".." and more dots */ token_is_valid = 0; token_is_filled = 0; for (i = filter->pattern; *i; ++i) { if (*i == '/') { /* reject invalid tokens, but accept an empty one as first */ if (!token_is_valid && (first != 0 || token_is_filled)) { free(filter); return 0; } token_is_valid = 0; token_is_filled = 0; /* update slash position */ if (!first) first = i; last = i; } else if (*i != '.') { token_is_valid = 1; token_is_filled = 1; } else { token_is_filled = 1; } } /* reject invalid tokens, but accept an empty one as last, but not if it's the only one */ if (!token_is_valid && (first == 0 || token_is_filled)) { free(filter); return 0; } /* it's a file filter */ filter->is_disk = 0; if (first == 0) { /* no slash */ filter->is_abs = 0; filter->is_dir = 0; } else { if (first == filter->pattern) { /* slash at the start */ filter->is_abs = 1; } else { /* no slash at the start */ filter->is_abs = 0; } if (last[1] == 0) { /* slash at the end */ filter->is_dir = 1; last[0] = 0; /* clear the slash */ } else { /* no slash at the end */ filter->is_dir = 0; } } return filter; } struct snapraid_filter* filter_alloc_disk(int direction, const char* pattern) { struct snapraid_filter* filter; filter = malloc_nofail(sizeof(struct snapraid_filter)); pathimport(filter->pattern, sizeof(filter->pattern), pattern); filter->direction = direction; /* it's a disk filter */ filter->is_disk = 1; filter->is_abs = 0; filter->is_dir = 0; /* no slash allowed in disk names */ if (strchr(filter->pattern, '/') != 0) { /* LCOV_EXCL_START */ free(filter); return 0; /* LCOV_EXCL_STOP */ } return filter; } void filter_free(void* filter) { free(filter); } const char* filter_type(struct snapraid_filter* filter, char* out, size_t out_size) { const char* direction; if (filter->direction < 0) direction = "exclude"; else direction = "include"; if (filter->is_disk) pathprint(out, out_size, "%s %s:", direction, filter->pattern); else if (filter->is_dir) pathprint(out, out_size, "%s %s/", direction, filter->pattern); else pathprint(out, out_size, "%s %s", direction, filter->pattern); return out; } /** * Apply a filter to the specified path * * @param filter The filter to apply. * @param reason Assign to it the filter that caused rejection. * @param path The path to filter. * @param is_dir if the path refers to a directory, otherwise to a file. * @return < 0 if the path is excluded, > 0 if the path is included, 0 if the filter doesn't apply. */ static int filter_apply(struct snapraid_filter* filter, struct snapraid_filter** reason, const char* path, int is_dir) { if (filter->root[0] != 0) { /* if it's a local filter */ if (!path_is_root_of(filter->root, path)) /* applies it only if it matches the root */ return 0; /* advance the path to compare to make it local */ path += strlen(filter->root); } /* if the filter is for files, it doesn't applies to directories */ if (!filter->is_dir && is_dir) return 0; /* * If the filter is for directories, it should be applied to all files inside * that directory. * * This is done allowing a partial matching as far it ends at a directory separator */ int match_sub = 0; if (filter->is_dir && !is_dir) match_sub = 1; int ret = 0; if (filter->is_abs) { /* skip initial slash, as always missing in the path */ if (wnmatch_sub(filter->pattern + 1, path, match_sub) == 0) ret = filter->direction; } else { /* the path is relative, first try to match from the root */ if (wnmatch_sub(filter->pattern, path, match_sub) == 0) { ret = filter->direction; } else { /* then try to match after all the / presents */ const char* slash = strchr(path, '/'); while (slash) { if (wnmatch_sub(filter->pattern, slash + 1, match_sub) == 0) { ret = filter->direction; break; } slash = strchr(slash + 1, '/'); } } } if (reason != 0 && ret < 0) *reason = filter; return ret; } /** * Apply a list of filter to a specific disk/sub path * * @param filterlist The list of filter to apply * @param reason Assign to it the filter that caused rejection. * @param disk The disk that contain the path * @param sub The path in the disk * @param is_dir If the path refers to a directory, otherwise it's a file * @param is_def_include If no filter apply, if by default force the inclusion. Used to include directory by default. * @return < 0 if the path is excluded, == 0 if the path is included. */ static int filter_element(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub, int is_dir, int is_def_include) { tommy_node* i; /** * The rule is that the latest filter defines the behaviour of paths * that doesn't match any filter. * * If the latest filter is an 'exclusion' filter, the default is to include. * If the latest filter is an 'inclusion' filter, the default is to exclude. * If there are no filter, the default is to include. */ int default_direction = 1; /* for each filter */ for (i = tommy_list_head(filterlist); i != 0; i = i->next) { int ret; struct snapraid_filter* filter = i->data; if (filter->is_disk) { if (wnmatch(filter->pattern, disk) == 0) { ret = filter->direction; } else { ret = 0; } if (reason != 0 && ret < 0) *reason = filter; } else { ret = filter_apply(filter, reason, sub, is_dir); } if (ret > 0) { /* include the file */ return 0; } else if (ret < 0) { /* exclude the file */ return -1; } else { /* default is opposite of the last filter */ default_direction = -filter->direction; if (reason != 0 && default_direction < 0) *reason = filter; /* continue with the next one */ } } /* directories are always included by default, otherwise we cannot apply rules */ /* to the contained files */ if (is_def_include) return 0; /* files are excluded/included depending of the last rule processed */ if (default_direction < 0) return -1; return 0; } int filter_path(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub) { return filter_element(filterlist, reason, disk, sub, 0, 0); } int filter_subdir(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub) { return filter_element(filterlist, reason, disk, sub, 1, 1); } int filter_emptydir(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub) { return filter_element(filterlist, reason, disk, sub, 1, 0); } int filter_existence(int filter_missing, const char* dir, const char* sub) { char path[PATH_MAX]; struct stat st; if (!filter_missing) return 0; /* we directly check if in the disk the file is present or not */ pathprint(path, sizeof(path), "%s%s", dir, sub); if (lstat(path, &st) != 0) { /* if the file doesn't exist, we don't filter it out */ if (errno == ENOENT) return 0; /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* the file is present, so we filter it out */ return 1; } int filter_correctness(int filter_error, tommy_arrayblkof* infoarr, struct snapraid_disk* disk, struct snapraid_file* file) { unsigned i; if (!filter_error) return 0; /* check each block of the file */ for (i = 0; i < file->blockmax; ++i) { block_off_t parity_pos = fs_file2par_get(disk, file, i); snapraid_info info = info_get(infoarr, parity_pos); /* if the file has a bad block, don't exclude it */ if (info_get_bad(info)) return 0; } /* the file is correct, so we filter it out */ return 1; } int filter_content(tommy_list* contentlist, const char* path) { tommy_node* i; for (i = tommy_list_head(contentlist); i != 0; i = i->next) { struct snapraid_content* content = i->data; char tmp[PATH_MAX]; if (pathcmp(content->content, path) == 0) return -1; /* exclude also the ".tmp" copy used to save it */ pathprint(tmp, sizeof(tmp), "%s.tmp", content->content); if (pathcmp(tmp, path) == 0) return -1; /* exclude also the ".lock" file */ pathprint(tmp, sizeof(tmp), "%s.lock", content->content); if (pathcmp(tmp, path) == 0) return -1; } return 0; } struct snapraid_file* file_alloc(unsigned block_size, const char* sub, data_off_t size, uint64_t mtime_sec, int mtime_nsec, uint64_t inode, uint64_t physical) { struct snapraid_file* file; block_off_t i; file = malloc_nofail(sizeof(struct snapraid_file)); file->sub = strdup_nofail(sub); file->size = size; file->blockmax = (size + block_size - 1) / block_size; file->mtime_sec = mtime_sec; file->mtime_nsec = mtime_nsec; file->inode = inode; file->physical = physical; file->flag = 0; file->shared_flag = 0; file->blockvec = malloc_nofail(file->blockmax * block_sizeof()); for (i = 0; i < file->blockmax; ++i) { struct snapraid_block* block = file_block(file, i); block_state_set(block, BLOCK_STATE_CHG); hash_invalid_set(block->hash); } return file; } struct snapraid_file* file_dup(struct snapraid_file* copy) { struct snapraid_file* file; block_off_t i; file = malloc_nofail(sizeof(struct snapraid_file)); file->sub = strdup_nofail(copy->sub); file->size = copy->size; file->blockmax = copy->blockmax; file->mtime_sec = copy->mtime_sec; file->mtime_nsec = copy->mtime_nsec; file->inode = copy->inode; file->physical = copy->physical; file->flag = copy->flag; file->blockvec = malloc_nofail(file->blockmax * block_sizeof()); for (i = 0; i < file->blockmax; ++i) { struct snapraid_block* block = file_block(file, i); struct snapraid_block* copy_block = file_block(copy, i); block->state = copy_block->state; memcpy(block->hash, copy_block->hash, BLOCK_HASH_SIZE); } return file; } void file_free(struct snapraid_file* file) { free(file->sub); file->sub = 0; free(file->blockvec); file->blockvec = 0; free(file); } void file_rename(struct snapraid_file* file, const char* sub) { free(file->sub); file->sub = strdup_nofail(sub); } void file_copy(struct snapraid_file* src_file, struct snapraid_file* dst_file) { block_off_t i; if (src_file->size != dst_file->size) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Copy file with different size\n"); os_abort(); /* LCOV_EXCL_STOP */ } if (src_file->mtime_sec != dst_file->mtime_sec) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Copy file with different mtime_sec\n"); os_abort(); /* LCOV_EXCL_STOP */ } if (src_file->mtime_nsec != dst_file->mtime_nsec) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Copy file with different mtime_nsec\n"); os_abort(); /* LCOV_EXCL_STOP */ } for (i = 0; i < dst_file->blockmax; ++i) { /* set a block with hash computed but without parity */ block_state_set(file_block(dst_file, i), BLOCK_STATE_REP); /* copy the hash */ memcpy(file_block(dst_file, i)->hash, file_block(src_file, i)->hash, BLOCK_HASH_SIZE); } file_flag_set(dst_file, FILE_IS_COPY); } const char* file_name(const struct snapraid_file* file) { const char* r = strrchr(file->sub, '/'); if (!r) r = file->sub; else ++r; return r; } unsigned file_block_size(struct snapraid_file* file, block_off_t file_pos, unsigned block_size) { /* if it's the last block */ if (file_pos + 1 == file->blockmax) { unsigned block_remainder; if (file->size == 0) return 0; block_remainder = file->size % block_size; if (block_remainder == 0) block_remainder = block_size; return block_remainder; } return block_size; } int file_block_is_last(struct snapraid_file* file, block_off_t file_pos) { if (file_pos == 0 && file->blockmax == 0) return 1; if (file_pos >= file->blockmax) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: File block position over the max\n"); os_abort(); /* LCOV_EXCL_STOP */ } return file_pos == file->blockmax - 1; } int file_inode_compare_to_arg(const void* void_arg, const void* void_data) { const uint64_t* arg = void_arg; const struct snapraid_file* file = void_data; if (*arg < file->inode) return -1; if (*arg > file->inode) return 1; return 0; } int file_inode_compare(const void* void_a, const void* void_b) { const struct snapraid_file* file_a = void_a; const struct snapraid_file* file_b = void_b; if (file_a->inode < file_b->inode) return -1; if (file_a->inode > file_b->inode) return 1; return 0; } int file_path_compare(const void* void_a, const void* void_b) { const struct snapraid_file* file_a = void_a; const struct snapraid_file* file_b = void_b; return strcmp(file_a->sub, file_b->sub); } int file_physical_compare(const void* void_a, const void* void_b) { const struct snapraid_file* file_a = void_a; const struct snapraid_file* file_b = void_b; if (file_a->physical < file_b->physical) return -1; if (file_a->physical > file_b->physical) return 1; return 0; } int file_path_compare_to_arg(const void* void_arg, const void* void_data) { const char* arg = void_arg; const struct snapraid_file* file = void_data; return strcmp(arg, file->sub); } int file_name_compare(const void* void_a, const void* void_b) { const struct snapraid_file* file_a = void_a; const struct snapraid_file* file_b = void_b; const char* name_a = file_name(file_a); const char* name_b = file_name(file_b); return strcmp(name_a, name_b); } int file_stamp_compare(const void* void_a, const void* void_b) { const struct snapraid_file* file_a = void_a; const struct snapraid_file* file_b = void_b; if (file_a->size < file_b->size) return -1; if (file_a->size > file_b->size) return 1; if (file_a->mtime_sec < file_b->mtime_sec) return -1; if (file_a->mtime_sec > file_b->mtime_sec) return 1; if (file_a->mtime_nsec < file_b->mtime_nsec) return -1; if (file_a->mtime_nsec > file_b->mtime_nsec) return 1; return 0; } int file_namestamp_compare(const void* void_a, const void* void_b) { int ret; ret = file_name_compare(void_a, void_b); if (ret != 0) return ret; return file_stamp_compare(void_a, void_b); } int file_pathstamp_compare(const void* void_a, const void* void_b) { int ret; ret = file_path_compare(void_a, void_b); if (ret != 0) return ret; return file_stamp_compare(void_a, void_b); } struct snapraid_extent* extent_alloc(block_off_t parity_pos, struct snapraid_file* file, block_off_t file_pos, block_off_t count) { struct snapraid_extent* extent; if (count == 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Allocating empty extent for file '%s' at position '%u/%u'\n", file->sub, file_pos, file->blockmax); os_abort(); /* LCOV_EXCL_STOP */ } if (count > file->blockmax || file_pos > file->blockmax - count) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Allocating overflowing extent for file '%s' at position '%u:%u/%u'\n", file->sub, file_pos, count, file->blockmax); os_abort(); /* LCOV_EXCL_STOP */ } extent = malloc_nofail(sizeof(struct snapraid_extent)); extent->parity_pos = parity_pos; extent->file = file; extent->file_pos = file_pos; extent->count = count; return extent; } void extent_free(struct snapraid_extent* extent) { free(extent); } int extent_parity_compare(const void* void_a, const void* void_b) { const struct snapraid_extent* arg_a = void_a; const struct snapraid_extent* arg_b = void_b; if (arg_a->parity_pos < arg_b->parity_pos) return -1; if (arg_a->parity_pos > arg_b->parity_pos) return 1; return 0; } int extent_file_compare(const void* void_a, const void* void_b) { const struct snapraid_extent* arg_a = void_a; const struct snapraid_extent* arg_b = void_b; if (arg_a->file < arg_b->file) return -1; if (arg_a->file > arg_b->file) return 1; if (arg_a->file_pos < arg_b->file_pos) return -1; if (arg_a->file_pos > arg_b->file_pos) return 1; return 0; } struct snapraid_link* link_alloc(const char* sub, const char* linkto, unsigned link_flag) { struct snapraid_link* slink; slink = malloc_nofail(sizeof(struct snapraid_link)); slink->sub = strdup_nofail(sub); slink->linkto = strdup_nofail(linkto); slink->flag = link_flag; return slink; } void link_free(struct snapraid_link* slink) { free(slink->sub); free(slink->linkto); free(slink); } int link_name_compare_to_arg(const void* void_arg, const void* void_data) { const char* arg = void_arg; const struct snapraid_link* slink = void_data; return strcmp(arg, slink->sub); } int link_alpha_compare(const void* void_a, const void* void_b) { const struct snapraid_link* slink_a = void_a; const struct snapraid_link* slink_b = void_b; return strcmp(slink_a->sub, slink_b->sub); } struct snapraid_dir* dir_alloc(const char* sub) { struct snapraid_dir* dir; dir = malloc_nofail(sizeof(struct snapraid_dir)); dir->sub = strdup_nofail(sub); dir->flag = 0; return dir; } void dir_free(struct snapraid_dir* dir) { free(dir->sub); free(dir); } int dir_name_compare(const void* void_arg, const void* void_data) { const char* arg = void_arg; const struct snapraid_dir* dir = void_data; return strcmp(arg, dir->sub); } struct snapraid_disk* disk_alloc(const char* name, const char* dir, uint64_t dev, const char* uuid, int skip_access) { struct snapraid_disk* disk; unsigned i; disk = malloc_nofail(sizeof(struct snapraid_disk)); pathcpy(disk->name, sizeof(disk->name), name); pathimport(disk->dir, sizeof(disk->dir), dir); pathcpy(disk->uuid, sizeof(disk->uuid), uuid); /* ensure that the dir terminate with "/" if it isn't empty */ pathslash(disk->dir, sizeof(disk->dir)); #if HAVE_THREAD disk->single_thread = 0; thread_mutex_init(&disk->fs_mutex); #endif disk->smartctl[0] = 0; for (i = 0; i < SMART_IGNORE_MAX; ++i) disk->smartignore[i] = 0; disk->fstype[0] = 0; disk->fslabel[0] = 0; disk->device = dev; disk->tick = 0; disk->cached_blocks = 0; disk->progress_file = 0; disk->total_blocks = 0; disk->free_blocks = 0; disk->first_free_block = 0; disk->has_volatile_inodes = 0; disk->has_volatile_hardlinks = 0; disk->has_unreliable_physical = 0; disk->has_different_uuid = 0; disk->has_unsupported_uuid = *uuid == 0; /* empty UUID means unsupported */ disk->had_empty_uuid = 0; disk->mapping_idx = -1; disk->skip_access = skip_access; tommy_list_init(&disk->filelist); tommy_list_init(&disk->deletedlist); tommy_hashdyn_init(&disk->inodeset); tommy_hashdyn_init(&disk->pathset); tommy_hashdyn_init(&disk->stampset); tommy_list_init(&disk->linklist); tommy_hashdyn_init(&disk->linkset); tommy_list_init(&disk->dirlist); tommy_hashdyn_init(&disk->dirset); tommy_tree_init(&disk->fs_parity, extent_parity_compare); tommy_tree_init(&disk->fs_file, extent_file_compare); disk->fs_last = 0; return disk; } void disk_free(struct snapraid_disk* disk) { tommy_list_foreach(&disk->filelist, (tommy_foreach_func*)file_free); tommy_list_foreach(&disk->deletedlist, (tommy_foreach_func*)file_free); tommy_tree_foreach(&disk->fs_file, (tommy_foreach_func*)extent_free); tommy_hashdyn_done(&disk->inodeset); tommy_hashdyn_done(&disk->pathset); tommy_hashdyn_done(&disk->stampset); tommy_list_foreach(&disk->linklist, (tommy_foreach_func*)link_free); tommy_hashdyn_done(&disk->linkset); tommy_list_foreach(&disk->dirlist, (tommy_foreach_func*)dir_free); tommy_hashdyn_done(&disk->dirset); #if HAVE_THREAD thread_mutex_destroy(&disk->fs_mutex); #endif free(disk); } struct snapraid_extra* extra_alloc(const char* name, const char* dir, uint64_t dev, const char* uuid) { struct snapraid_extra* extra; unsigned i; extra = malloc_nofail(sizeof(struct snapraid_extra)); pathcpy(extra->name, sizeof(extra->name), name); pathimport(extra->dir, sizeof(extra->dir), dir); pathcpy(extra->uuid, sizeof(extra->uuid), uuid); /* ensure that the dir terminate with "/" if it isn't empty */ pathslash(extra->dir, sizeof(extra->dir)); extra->smartctl[0] = 0; for (i = 0; i < SMART_IGNORE_MAX; ++i) extra->smartignore[i] = 0; extra->fstype[0] = 0; extra->fslabel[0] = 0; extra->device = dev; return extra; } void extra_free(struct snapraid_extra* extra) { free(extra); } static inline void fs_lock(struct snapraid_disk* disk) { #if HAVE_THREAD if (!disk->single_thread) thread_mutex_lock(&disk->fs_mutex); #else (void)disk; #endif } static inline void fs_unlock(struct snapraid_disk* disk) { #if HAVE_THREAD if (!disk->single_thread) thread_mutex_unlock(&disk->fs_mutex); #else (void)disk; #endif } struct extent_disk_empty { block_off_t blockmax; }; /** * Compare the extent if inside the specified blockmax. */ static int extent_disk_empty_compare_unlock(const void* void_a, const void* void_b) { const struct extent_disk_empty* arg_a = void_a; const struct snapraid_extent* arg_b = void_b; /* if the block is inside the specified blockmax, it's found */ if (arg_a->blockmax > arg_b->parity_pos) return 0; /* otherwise search for a smaller one */ return -1; } int fs_is_empty(struct snapraid_disk* disk, block_off_t blockmax) { struct extent_disk_empty arg = { blockmax }; /* if there is an element, it's not empty */ /* even if links and dirs have no block allocation */ if (!tommy_list_empty(&disk->filelist)) return 0; if (!tommy_list_empty(&disk->linklist)) return 0; if (!tommy_list_empty(&disk->dirlist)) return 0; fs_lock(disk); /* search for any extent inside blockmax */ if (tommy_tree_search_compare(&disk->fs_parity, extent_disk_empty_compare_unlock, &arg) != 0) { fs_unlock(disk); return 0; } /* finally, it's empty */ fs_unlock(disk); return 1; } struct extent_disk_size { block_off_t size; }; /** * Compare the extent by highest parity position. * * The maximum parity position is stored as size. */ static int extent_disk_size_compare_unlock(const void* void_a, const void* void_b) { struct extent_disk_size* arg_a = (void*)void_a; const struct snapraid_extent* arg_b = void_b; /* get the maximum size */ if (arg_a->size < arg_b->parity_pos + arg_b->count) arg_a->size = arg_b->parity_pos + arg_b->count; /* search always for a bigger one */ return 1; } block_off_t fs_size(struct snapraid_disk* disk) { struct extent_disk_size arg = { 0 }; fs_lock(disk); tommy_tree_search_compare(&disk->fs_parity, extent_disk_size_compare_unlock, &arg); fs_unlock(disk); return arg.size; } struct extent_check { const struct snapraid_extent* prev; int result; }; static void extent_parity_check_foreach_unlock(void* void_arg, void* void_obj) { struct extent_check* arg = void_arg; const struct snapraid_extent* obj = void_obj; const struct snapraid_extent* prev = arg->prev; /* set the next previous block */ arg->prev = obj; /* stop reporting if too many errors */ if (arg->result > 100) { /* LCOV_EXCL_START */ return; /* LCOV_EXCL_STOP */ } if (obj->count == 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Parity count zero for file '%s' at '%u'\n", obj->file->sub, obj->parity_pos); ++arg->result; return; /* LCOV_EXCL_STOP */ } /* check only if there is a previous block */ if (!prev) return; /* check the order */ if (prev->parity_pos >= obj->parity_pos) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Parity order for files '%s' at '%u:%u' and '%s' at '%u:%u'\n", prev->file->sub, prev->parity_pos, prev->count, obj->file->sub, obj->parity_pos, obj->count); ++arg->result; return; /* LCOV_EXCL_STOP */ } /* check that the extents don't overlap */ if (obj->parity_pos - prev->parity_pos < prev->count) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Parity overlap for files '%s' at '%u:%u' and '%s' at '%u:%u'\n", prev->file->sub, prev->parity_pos, prev->count, obj->file->sub, obj->parity_pos, obj->count); ++arg->result; return; /* LCOV_EXCL_STOP */ } } static void extent_file_check_foreach_unlock(void* void_arg, void* void_obj) { struct extent_check* arg = void_arg; const struct snapraid_extent* obj = void_obj; const struct snapraid_extent* prev = arg->prev; /* set the next previous block */ arg->prev = obj; /* stop reporting if too many errors */ if (arg->result > 100) { /* LCOV_EXCL_START */ return; /* LCOV_EXCL_STOP */ } if (obj->count == 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: File count zero for file '%s' at '%u'\n", obj->file->sub, obj->file_pos); ++arg->result; return; /* LCOV_EXCL_STOP */ } /* note that for deleted files, some extents may be missing */ /* if the files are different */ if (!prev || prev->file != obj->file) { if (prev != 0) { if (file_flag_has(prev->file, FILE_IS_DELETED)) { /* check that the extent doesn't overflow the file */ if (prev->count > prev->file->blockmax || prev->file_pos > prev->file->blockmax - prev->count) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Delete end for file '%s' at '%u:%u' overflowing size '%u'\n", prev->file->sub, prev->file_pos, prev->count, prev->file->blockmax); ++arg->result; return; /* LCOV_EXCL_STOP */ } } else { /* check that the extent ends the file */ if (prev->file_pos + prev->count != prev->file->blockmax) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: File end for file '%s' at '%u:%u' instead of size '%u'\n", prev->file->sub, prev->file_pos, prev->count, prev->file->blockmax); ++arg->result; return; /* LCOV_EXCL_STOP */ } } } if (file_flag_has(obj->file, FILE_IS_DELETED)) { /* check that the extent doesn't overflow the file */ if (obj->count > obj->file->blockmax || obj->file_pos > obj->file->blockmax - obj->count) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Delete start for file '%s' at '%u:%u' overflowing size '%u'\n", obj->file->sub, obj->file_pos, obj->count, obj->file->blockmax); ++arg->result; return; /* LCOV_EXCL_STOP */ } } else { /* check that the extent starts the file */ if (obj->file_pos != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: File start for file '%s' at '%u:%u'\n", obj->file->sub, obj->file_pos, obj->count); ++arg->result; return; /* LCOV_EXCL_STOP */ } } } else { /* check the order */ if (prev->file_pos >= obj->file_pos) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: File order for file '%s' at '%u:%u' and at '%u:%u'\n", prev->file->sub, prev->file_pos, prev->count, obj->file_pos, obj->count); ++arg->result; return; /* LCOV_EXCL_STOP */ } if (file_flag_has(obj->file, FILE_IS_DELETED)) { /* check that the extents don't overlap */ if (obj->file_pos - prev->file_pos < prev->count) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Delete sequence for file '%s' at '%u:%u' and at '%u:%u'\n", prev->file->sub, prev->file_pos, prev->count, obj->file_pos, obj->count); ++arg->result; return; /* LCOV_EXCL_STOP */ } } else { /* check that the extents are sequential */ if (prev->file_pos + prev->count != obj->file_pos) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: File sequence for file '%s' at '%u:%u' and at '%u:%u'\n", prev->file->sub, prev->file_pos, prev->count, obj->file_pos, obj->count); ++arg->result; return; /* LCOV_EXCL_STOP */ } } } } int fs_check(struct snapraid_disk* disk) { struct extent_check arg; /* error count starts from 0 */ arg.result = 0; fs_lock(disk); /* check parity sequence */ arg.prev = 0; tommy_tree_foreach_arg(&disk->fs_parity, extent_parity_check_foreach_unlock, &arg); /* check file sequence */ arg.prev = 0; tommy_tree_foreach_arg(&disk->fs_file, extent_file_check_foreach_unlock, &arg); fs_unlock(disk); if (arg.result != 0) return -1; return 0; } struct extent_parity_inside { block_off_t parity_pos; }; /** * Compare the extent if containing the specified parity position. */ static int extent_parity_inside_compare_unlock(const void* void_a, const void* void_b) { const struct extent_parity_inside* arg_a = void_a; const struct snapraid_extent* arg_b = void_b; if (arg_a->parity_pos < arg_b->parity_pos) return -1; if (arg_a->parity_pos - arg_b->parity_pos >= arg_b->count) return 1; return 0; } /** * Search the extent at the specified parity position. * The search is optimized for sequential accesses. * \return If not found return 0 */ static struct snapraid_extent* fs_par2extent_get_unlock(struct snapraid_disk* disk, struct snapraid_extent** fs_last, block_off_t parity_pos) { struct snapraid_extent* extent; /* check if the last accessed extent matches */ if (*fs_last && parity_pos >= (*fs_last)->parity_pos && parity_pos - (*fs_last)->parity_pos < (*fs_last)->count ) { extent = *fs_last; } else { struct extent_parity_inside arg = { parity_pos }; extent = tommy_tree_search_compare(&disk->fs_parity, extent_parity_inside_compare_unlock, &arg); } if (!extent) return 0; /* store the last accessed extent */ *fs_last = extent; return extent; } struct extent_file_inside { struct snapraid_file* file; block_off_t file_pos; }; /** * Compare the extent if containing the specified file position. */ static int extent_file_inside_compare_unlock(const void* void_a, const void* void_b) { const struct extent_file_inside* arg_a = void_a; const struct snapraid_extent* arg_b = void_b; if (arg_a->file < arg_b->file) return -1; if (arg_a->file > arg_b->file) return 1; if (arg_a->file_pos < arg_b->file_pos) return -1; if (arg_a->file_pos - arg_b->file_pos >= arg_b->count) return 1; return 0; } /** * Search the extent at the specified file position. * The search is optimized for sequential accesses. * \return If not found return 0 */ static struct snapraid_extent* fs_file2extent_get_unlock(struct snapraid_disk* disk, struct snapraid_extent** fs_last, struct snapraid_file* file, block_off_t file_pos) { struct snapraid_extent* extent; /* check if the last accessed extent matches */ if (*fs_last && file == (*fs_last)->file && file_pos >= (*fs_last)->file_pos && file_pos - (*fs_last)->file_pos < (*fs_last)->count ) { extent = *fs_last; } else { struct extent_file_inside arg = { file, file_pos }; extent = tommy_tree_search_compare(&disk->fs_file, extent_file_inside_compare_unlock, &arg); } if (!extent) return 0; /* store the last accessed extent */ *fs_last = extent; return extent; } struct snapraid_file* fs_par2file_find(struct snapraid_disk* disk, block_off_t parity_pos, block_off_t* file_pos) { struct snapraid_extent* extent; struct snapraid_file* file; fs_lock(disk); extent = fs_par2extent_get_unlock(disk, &disk->fs_last, parity_pos); if (!extent) { fs_unlock(disk); return 0; } if (file_pos) *file_pos = extent->file_pos + (parity_pos - extent->parity_pos); file = extent->file; fs_unlock(disk); return file; } block_off_t fs_file2par_find(struct snapraid_disk* disk, struct snapraid_file* file, block_off_t file_pos) { struct snapraid_extent* extent; block_off_t ret; fs_lock(disk); extent = fs_file2extent_get_unlock(disk, &disk->fs_last, file, file_pos); if (!extent) { fs_unlock(disk); return POS_NULL; } ret = extent->parity_pos + (file_pos - extent->file_pos); fs_unlock(disk); return ret; } void fs_allocate(struct snapraid_disk* disk, block_off_t parity_pos, struct snapraid_file* file, block_off_t file_pos) { struct snapraid_extent* extent; struct snapraid_extent* parity_extent; struct snapraid_extent* file_extent; fs_lock(disk); if (file_pos > 0) { /* search an existing extent for the previous file_pos */ extent = fs_file2extent_get_unlock(disk, &disk->fs_last, file, file_pos - 1); if (extent != 0 && parity_pos == extent->parity_pos + extent->count) { /* check if the position will go outside the limit */ if (extent->parity_pos + extent->count == POS_NULL) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Parity position overflow allocating file '%s' at position '%u/%u' with count '%u' in disk '%s'\n", file->sub, file_pos, file->blockmax, extent->count, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } /* ensure that we are extending the extent at the end */ if (file_pos != extent->file_pos + extent->count) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Allocating file '%s' at position '%u/%u' in the middle of extent '%u:%u' in disk '%s'\n", file->sub, file_pos, file->blockmax, extent->file_pos, extent->count, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } /* extend the existing extent */ ++extent->count; fs_unlock(disk); return; } } /* a extent doesn't exist, and we have to create a new one */ extent = extent_alloc(parity_pos, file, file_pos, 1); /* insert the extent in the trees */ parity_extent = tommy_tree_insert(&disk->fs_parity, &extent->parity_node, extent); file_extent = tommy_tree_insert(&disk->fs_file, &extent->file_node, extent); if (parity_extent != extent || file_extent != extent) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Allocating file '%s' at position '%u/%u' for existing extent '%u:%u' in disk '%s'\n", file->sub, file_pos, file->blockmax, extent->file_pos, extent->count, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } /* store the last accessed extent */ disk->fs_last = extent; fs_unlock(disk); } void fs_deallocate(struct snapraid_disk* disk, block_off_t parity_pos) { struct snapraid_extent* extent; struct snapraid_extent* second_extent; struct snapraid_extent* parity_extent; struct snapraid_extent* file_extent; block_off_t first_count, second_count; fs_lock(disk); extent = fs_par2extent_get_unlock(disk, &disk->fs_last, parity_pos); if (!extent) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Deallocating parity position '%u' for not existing extent in disk '%s'\n", parity_pos, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } /* if it's the only block of the extent, delete it */ if (extent->count == 1) { /* remove from the trees */ tommy_tree_remove(&disk->fs_parity, extent); tommy_tree_remove(&disk->fs_file, extent); /* deallocate */ extent_free(extent); /* clear the last accessed extent */ disk->fs_last = 0; fs_unlock(disk); return; } /* if it's at the start of the extent, shrink the extent */ if (parity_pos == extent->parity_pos) { /* * Note that modifying parity_pos and file_pos in-place is safe * because extents never overlap. Shrinking the start of the extent * keeps the relative sorted order of all nodes completely unchanged, * preserving the tree invariants without delete/insert overhead. */ ++extent->parity_pos; ++extent->file_pos; --extent->count; fs_unlock(disk); return; } /* if it's at the end of the extent, shrink the extent */ if (parity_pos == extent->parity_pos + extent->count - 1) { --extent->count; fs_unlock(disk); return; } /* otherwise it's in the middle */ first_count = parity_pos - extent->parity_pos; second_count = extent->count - first_count - 1; /* adjust the first extent */ extent->count = first_count; /* allocate the second extent */ second_extent = extent_alloc(extent->parity_pos + first_count + 1, extent->file, extent->file_pos + first_count + 1, second_count); /* insert the extent in the trees */ parity_extent = tommy_tree_insert(&disk->fs_parity, &second_extent->parity_node, second_extent); file_extent = tommy_tree_insert(&disk->fs_file, &second_extent->file_node, second_extent); if (parity_extent != second_extent || file_extent != second_extent) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Deallocating parity position '%u' for splitting extent '%u:%u' in disk '%s'\n", parity_pos, second_extent->file_pos, second_extent->count, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } /* store the last accessed extent */ disk->fs_last = second_extent; fs_unlock(disk); } struct snapraid_block* fs_file2block_get(struct snapraid_file* file, block_off_t file_pos) { if (file_pos >= file->blockmax) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Dereferencing file '%s' at position '%u/%u'\n", file->sub, file_pos, file->blockmax); os_abort(); /* LCOV_EXCL_STOP */ } return file_block(file, file_pos); } struct snapraid_block* fs_par2block_find(struct snapraid_disk* disk, block_off_t parity_pos) { struct snapraid_file* file; block_off_t file_pos; file = fs_par2file_find(disk, parity_pos, &file_pos); if (file == 0) return BLOCK_NULL; return fs_file2block_get(file, file_pos); } struct snapraid_map* map_alloc(const char* name, unsigned position, block_off_t total_blocks, block_off_t free_blocks, const char* uuid) { struct snapraid_map* map; map = malloc_nofail(sizeof(struct snapraid_map)); pathcpy(map->name, sizeof(map->name), name); map->position = position; map->total_blocks = total_blocks; map->free_blocks = free_blocks; pathcpy(map->uuid, sizeof(map->uuid), uuid); return map; } void map_free(struct snapraid_map* map) { free(map); } /****************************************************************************/ /* bucket */ static int bucket_cmp(const void* void_a, const void* void_b) { const struct snapraid_bucket* a = void_a; const struct snapraid_bucket* b = void_b; if (a->time_at < b->time_at) return -1; if (a->time_at > b->time_at) return 1; return 0; } void bucket_free(struct snapraid_bucket* bucket) { free(bucket); } void bucket_insert(tommy_hashdyn* bucket_hash, time_t time_at, block_off_t count, int justsynced) { tommy_hash_t hash = tommy_inthash_u64(time_at); tommy_node* i = tommy_hashdyn_bucket(bucket_hash, hash); while (i) { struct snapraid_bucket* entry = i->data; if (entry->time_at == time_at) { if (justsynced) entry->count_justsynced += count; else entry->count_scrubbed += count; return; } i = i->next; } struct snapraid_bucket* entry = malloc_nofail(sizeof(struct snapraid_bucket)); entry->time_at = time_at; if (justsynced) { entry->count_justsynced = count; entry->count_scrubbed = 0; } else { entry->count_justsynced = 0; entry->count_scrubbed = count; } tommy_hashdyn_insert(bucket_hash, &entry->node, entry, hash); } void bucket_to_list(tommy_hashdyn* bucket_hash, tommy_list* bucket_list, block_off_t* bucketcount) { /* clear previous list */ tommy_list_foreach(bucket_list, (tommy_foreach_func*)bucket_free); tommy_list_init(bucket_list); log_tag("list:bucket_begin\n"); log_tag("bucket:count:%" PRIu64 "\n", (uint64_t)tommy_hashdyn_count(bucket_hash)); tommy_hashdyn_to_list(bucket_hash, bucket_list); tommy_list_sort(bucket_list, bucket_cmp); block_off_t count = 0; for (tommy_node* i = tommy_list_head(bucket_list); i != 0; i = i->next) { struct snapraid_bucket* entry = i->data; count += entry->count_scrubbed + entry->count_justsynced; log_tag("bucket:entry:%" PRIu64 ":%u:%u\n", (uint64_t)entry->time_at, entry->count_scrubbed, entry->count_justsynced); } log_tag("bucket:block_count:%u\n", count); log_tag("list:bucket_end\n"); *bucketcount = count; } /****************************************************************************/ /* format */ int FMT_MODE = FMT_FILE; /** * Format a file path for poll reference */ const char* fmt_poll(const struct snapraid_disk* disk, const char* str) { (void)disk; return esc_shell(str, esc_buf()); } /** * Format a path name for terminal reference */ const char* fmt_term(const struct snapraid_disk* disk, const char* str) { const char* out[3]; switch (FMT_MODE) { case FMT_FILE : default : return esc_shell(str, esc_buf()); case FMT_DISK : out[0] = disk->name; out[1] = ":"; out[2] = str; return esc_shell_multi(out, 3, esc_buf()); case FMT_PATH : out[0] = disk->dir; out[1] = str; return esc_shell_multi(out, 2, esc_buf()); } } const char* fmt_size(uint64_t size, char* buffer, size_t buffer_size) { if (size >= 10ULL * TERA) snprintf(buffer, buffer_size, "%" PRIu64 " T", size / TERA); else if (size >= 10ULL * GIGA) snprintf(buffer, buffer_size, "%" PRIu64 " G", size / GIGA); else if (size >= 10 * MEGA) snprintf(buffer, buffer_size, "%" PRIu64 " M", size / MEGA); else if (size >= 10 * KILO) snprintf(buffer, buffer_size, "%" PRIu64 " k", size / KILO); else snprintf(buffer, buffer_size, "%" PRIu64 " ", size); return buffer; } snapraid-14.9/cmdline/elem.h000066400000000000000000001107351522717156100157740ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __ELEM_H #define __ELEM_H #include "util.h" #include "support.h" #include "tommyds/tommyhash.h" #include "tommyds/tommylist.h" #include "tommyds/tommytree.h" #include "tommyds/tommyhashdyn.h" #include "tommyds/tommyarray.h" #include "tommyds/tommyarrayblkof.h" /****************************************************************************/ /* snapraid */ /** * Number of measures of the operation progress. */ #define PROGRESS_MAX 100 /** * Max UUID length. */ #define UUID_MAX 128 /** * Max filesystem type/label length */ #define FSINFO_MAX 64 /** * Invalid position. */ #define POS_NULL ((block_off_t)-1) /** * Content file specification. */ struct snapraid_content { char content[PATH_MAX]; /**< Path of the content file. */ uint64_t device; /**< Device identifier. */ void* context; /**< Context used for multithread operations. */ tommy_node node; /**< Next node in the list. */ }; /** * Filter for paths. */ struct snapraid_filter { char pattern[PATH_MAX]; /**< Filter pattern. */ char root[PATH_MAX]; /**< If empty, it's a global pattern. If not empty, it's a local pattern that applies only to that dir. */ int is_disk; /**< If the pattern is a disk one, otherwise it's a file pattern */ int is_abs; /**< If the pattern is an absolute path (start with /), otherwise it's a relative one */ int is_dir; /**< If the pattern is only for dir, otherwise it's only for file. */ int direction; /**< If it's an inclusion (=1) or an exclusion (=-1). */ tommy_node node; /**< Next node in the list. */ }; /** * Block pointer used to represent unused blocks. */ #define BLOCK_NULL 0 /** * This block is an empty one. * Note that an empty block is represent with ::BLOCK_NULL. */ #define BLOCK_STATE_EMPTY 0 /** * The block has both the hash and the parity computed. * This is the normal state of a saved block. * * The block hash field IS set. * The parity for this disk is updated. */ #define BLOCK_STATE_BLK 1 /** * The block is new and not yet hashed. * This happens when a new block overwrites a just removed block, or an empty * space. * * The block hash field MAY be set and it represents the hash of the OLD data. * The hash may be also INVALID or ZERO. * * If the OLD block was empty, the hash is set to the special ZERO value. * If the OLD block was lost, the hash is set to the special INVALID value. * * The parity for this disk is not updated, but it contains the old data referenced by the hash. * * If the state is read from an incomplete sync, we don't really know if the hash is referring to the * data used to compute the parity, because the sync process was interrupted at an unknown point, * and the parity may or may not be updated. * * For this reason we clear all such hashes when reading the state from an incomplete sync before * starting a new sync, because sync is affected by such hashes, as sync updates the parity, only * if the new data read for CHG blocks has a mismatching hash. * Clearing is done setting the ::clear_past_hash flag before reading the state. * No clearing is done in other commands, as check and fix are instead able to work with unsynced * hashes, and scrub ignores CHG/DELETED blocks. */ #define BLOCK_STATE_CHG 2 /** * The block is new and hashed. * This happens when a new block overwrites a just removed block, or an empty space. * * Note that when the file copy heuristic is enabled, the REP blocks may be set * using this heuristic, meaning that the hash may be wrong. * * For this reason, when the ::force_nocopy flag is enabled in sync, we convert all the REP blocks * to CHG, invalidating the stored hash. * Clearing is done setting the ::clear_past_hash flag before reading the state. * No clearing is done in other commands, as they don't stop the process like in sync * when there is a false silent error. * * The block hash field IS set, and it represents the hash of the new data. * The parity for this disk is not updated. */ #define BLOCK_STATE_REP 3 /** * This block is a deleted one. * This happens when a file is deleted. * * The block hash field IS set, and it represents the hash of the previous data, * but only if it's different by all 0. * The parity for this disk is not updated, but it contains the old data referenced by the hash. * * If the state is read from an incomplete sync, we don't really know if the hash is referring to the * data used to compute the parity, because the sync process was interrupted at an unknown point, * and the parity may or may not be updated. * * As now the sync process is not affected by DELETED hash, so clearing won't be really needed, * but considering that we have to do it for CHG blocks, we do it also for DELETED ones, * clearing all the past hashes. * Clearing is done setting the ::clear_past_hash flag before reading the state. * No clearing is done in other commands, as check and fix are instead able to work with unsynced * hashes, and scrub ignores CHG/DELETED blocks. */ #define BLOCK_STATE_DELETED 4 /** * Block hash size. * * At max HASH_MAX. */ extern int BLOCK_HASH_SIZE; /** * Block of a file. */ struct snapraid_block { unsigned char state; /**< State of the block. */ /** * Hash of the block. * * The effective stored size is BLOCK_HASH_SIZE. */ unsigned char hash[HASH_MAX]; }; /** * If a file is present in the disk. * It's used only in scan to detect present and missing files. */ #define FILE_IS_PRESENT 0x01 /** * If it's an excluded file from the processing. * It's used in both check and fix to mark files to exclude from the processing. */ #define FILE_IS_EXCLUDED 0x02 /** * If a fix was attempted but it failed. * It's used only in fix to mark that some data is unrecoverable. */ #define FILE_IS_DAMAGED 0x04 /** * If a fix was done. * It's used only in fix to mark that some data was recovered. */ #define FILE_IS_FIXED 0x08 /** * If the file was originally missing, and it was created in the fix process. * It's used only in fix to mark files recovered from scratch, * meaning that they don't have any previous content. * This is important because it means that deleting them, you are not going * to lose something that cannot be recovered. * Note that excluded files won't ever get this flag. */ #define FILE_IS_CREATED 0x10 /** * If the file has completed its processing, meaning that it won't be opened anymore. * It's used only in fix to mark when we finish processing one file. * Note that excluded files won't ever get this flag. */ #define FILE_IS_FINISHED 0x20 /** * If the file hash was obtained from a file copy * identified by the same name, size and stamp. */ #define FILE_IS_COPY 0x40 /** * If the file was opened. * It's used in fix to detect if it's the first time a file is opened. */ #define FILE_IS_OPENED 0x80 /** * If the file is modified from the latest sync. * It's used in fix to store the state of the file before being modified. */ #define FILE_IS_UNSYNCED 0x100 /** * If the file is without inode. * It could happen in file-systems where inodes are not persistent, * or when restoring a full disk with "fix". * In such cases we have to clear any stored duplicate inode. * After the scan process completes, no file should have this flag set. */ #define FILE_IS_WITHOUT_INODE 0x200 /** * The file is deleted. * This happens when a file is deleted from the array, * but it's keep inside the parity until the next sync. * * During the file-system check we needs this information, * because deleted files may be present only partially. */ #define FILE_IS_DELETED 0x400 /** * The file is missing. * This happens in fix/check when a file is cannot be opened, * and marking it as such prevents to retry to open it again. */ #define FILE_IS_MISSING 0x800 #define FILE_IS_HARDLINK 0x1000 /**< If it's an hardlink. */ #define FILE_IS_SYMLINK 0x2000 /**< If it's a file symlink. */ #define FILE_IS_SYMDIR 0x4000 /**< If it's a dir symlink for Windows. Not yet supported. */ #define FILE_IS_JUNCTION 0x8000 /**< If it's a junction for Windows. Not yet supported. */ #define FILE_IS_LINK_MASK 0xF000 /**< Mask for link type. */ /** * Flags from this bit are shared between multiple threads * and goes in the shared_flags instead of flags */ #define FILE_FLAGS_SHARED_BIT 16 /** * During scan if the file is found missing and relocated to another place * * This is used to avoid to report it "removed". * * This specific bit is written using protection from the stamp_mutex during * the multithread scan. */ #define FILE_IS_RELOCATED 0x10000 /** * File. */ struct snapraid_file { int64_t mtime_sec; /**< Modification time. */ uint64_t inode; /**< Inode. */ uint64_t physical; /**< Physical offset of the file. */ data_off_t size; /**< Size of the file. */ struct snapraid_block* blockvec; /**< All the blocks of the file. */ int mtime_nsec; /**< Modification time nanoseconds. In the range 0 <= x < 1,000,000,000, or STAT_NSEC_INVALID if not present. */ block_off_t blockmax; /**< Number of blocks. */ uint16_t flag; /**< FILE_IS_* flags. */ uint16_t shared_flag; /**< FILE_IS_RELOCATED flag. Keep it separated as it's accessed by multiple threads */ char* sub; /**< Sub path of the file. Without the disk dir. The disk is implicit. */ /* nodes for data structures */ tommy_node nodelist; tommy_hashdyn_node nodeset; tommy_hashdyn_node pathset; tommy_hashdyn_node stampset; }; /** * Symbolic Link. */ struct snapraid_link { unsigned flag; /**< FILE_IS_* flags. */ char* sub; /**< Sub path of the file. Without the disk dir. The disk is implicit. */ char* linkto; /**< Link to. */ /* nodes for data structures */ tommy_node nodelist; tommy_hashdyn_node nodeset; }; /** * Dir. */ struct snapraid_dir { unsigned flag; /**< FILE_IS_* flags. */ char* sub; /**< Sub path of the file. Without the disk dir. The disk is implicit. */ /* nodes for data structures */ tommy_node nodelist; tommy_hashdyn_node nodeset; }; /** * Chunk. * * A extent represents a fragment of a file mapped into the parity. */ struct snapraid_extent { struct snapraid_file* file; /**< File containing this extent. */ block_off_t parity_pos; /**< Parity position. */ block_off_t file_pos; /**< Position in the file. */ block_off_t count; /**< Number of sequential blocks in the file and parity. */ tommy_tree_node parity_node; /**< Tree sorted by . */ tommy_tree_node file_node; /**< Tree sorter by . */ }; /** * Other disk. */ struct snapraid_extra { char name[PATH_MAX]; /**< Name of the disk. */ char dir[PATH_MAX]; /**< Mount point of the disk. It always terminates with /. */ char smartctl[PATH_MAX]; /**< Custom command for smartctl. Empty means auto. */ int smartignore[SMART_IGNORE_MAX]; /**< Smart attributes to ignore for this device. */ char uuid[UUID_MAX]; /**< UUID of the disk. They are probed during the config reading. */ char fstype[FSINFO_MAX]; /**< Filesystem type */ char fslabel[FSINFO_MAX]; /**< Filesystem label */ uint64_t device; /**< Device identifier. */ /* nodes for data structures */ tommy_node node; }; /** * Data disk. */ struct snapraid_disk { char name[PATH_MAX]; /**< Name of the disk. */ char dir[PATH_MAX]; /**< Mount point of the disk. It always terminates with /. */ char smartctl[PATH_MAX]; /**< Custom command for smartctl. Empty means auto. */ int smartignore[SMART_IGNORE_MAX]; /**< Smart attributes to ignore for this device. */ char uuid[UUID_MAX]; /**< UUID of the disk. They are probed during the config reading. */ char fstype[FSINFO_MAX]; /**< Filesystem type */ char fslabel[FSINFO_MAX]; /**< Filesystem label */ uint64_t device; /**< Device identifier. */ block_off_t total_blocks; /**< Number of total blocks. */ block_off_t free_blocks; /**< Number of free blocks at the last sync. */ uint64_t tick; /**< Usage time. */ uint64_t progress_tick[PROGRESS_MAX]; /**< Last ticks of progress. */ unsigned cached_blocks; /**< Number of IO blocks cached. */ struct snapraid_file* progress_file; /**< File in progress. */ /** * First free searching block. * Note that it doesn't necessarily point at the first free block, * but it just tell you that no free block is present before this position. */ block_off_t first_free_block; int has_volatile_inodes; /**< If the underline file-system has not persistent inodes. */ int has_volatile_hardlinks; /**< If the underline file-system has not synchronized metadata for hardlink (NTFS). */ int has_unreliable_physical; /**< If the physical offset of files has duplicates. */ int has_different_uuid; /**< If the disk has a different UUID, meaning that it is not the same file-system. */ int has_unsupported_uuid; /**< If the disk doesn't report UUID, meaning it's not supported. */ int had_empty_uuid; /**< If the disk had an empty UUID, meaning that it's a new disk. */ int mapping_idx; /**< Index in the mapping vector. Used only as buffer when writing the content file. */ int skip_access; /**< If the disk is inaccessible and it should be skipped. */ #if HAVE_THREAD int single_thread; /**< Running in single thread, and then not needing the mutex */ /** * Mutex for protecting the filesystem structure. * * Specifically, this protects ::fs_parity, ::fs_file, and ::fs_last, * meaning that it protects only extents. * * Files, links and dirs are not protected as they are not expected to * change during multithread processing. */ thread_mutex_t fs_mutex; /** * Mutex for protecting the scan process. * * It's used during the scan process to protect the stampset to identify copy of files * and the FILE_IS_RELOCATED flag of files. * * Note that only the FILE_IS_RELOCATED single bit is protected. * Not the other bits. */ thread_mutex_t stamp_mutex; #endif /** * Mapping of extents in the parity. * Sorted by and by */ tommy_tree fs_parity; tommy_tree fs_file; /** * Last extent we accessed. * It's used to optimize access of sequential blocks. */ struct snapraid_extent* fs_last; /** * List of all the snapraid_file for the disk. */ tommy_list filelist; /** * List of all the deleted file for the disk. * * These files are kept allocated, because the blocks are still referenced in * the ::blockarr. */ tommy_list deletedlist; tommy_hashdyn inodeset; /**< Hashtable by inode of all the files. */ tommy_hashdyn pathset; /**< Hashtable by path of all the files. */ tommy_hashdyn stampset; /**< Hashtable by stamp (size and time) of all the files. */ tommy_list linklist; /**< List of all the links. */ tommy_hashdyn linkset; /**< Hashtable by name of all the links. */ tommy_list dirlist; /**< List of all the empty dirs. */ tommy_hashdyn dirset; /**< Hashtable by name of all the empty dirs. */ /* nodes for data structures */ tommy_node node; }; /** * Disk mapping. */ struct snapraid_map { char name[PATH_MAX]; /**< Name of the disk. */ char uuid[UUID_MAX]; /**< UUID of the disk. Empty if unknown. They are read from the content file. */ block_off_t total_blocks; /**< Number of total blocks. */ block_off_t free_blocks; /**< Number of free blocks at last 'sync'. */ unsigned position; /**< Position of the disk in the parity. */ /* nodes for data structures */ tommy_node node; }; /** * Max number of parity split. */ #define SPLIT_MAX 8 /** * Invalid parity size. * * This value is used to identify new parities, * like when you alter the configuration adding * a new parity level, creating it with 'fix'. * Given that 'fix' doesn't write the content file, * the new size will be written only at the next * 'sync'. */ #define PARITY_SIZE_INVALID -1LL /** * Parity split. */ struct snapraid_split { char path[PATH_MAX]; /**< Path of the parity file. */ char uuid[UUID_MAX]; /**< UUID of the disk. Empty if unknown. They are probed during the config reading, and later read from the content file. */ char fstype[FSINFO_MAX]; /**< Filesystem type */ char fslabel[FSINFO_MAX]; /**< Filesystem label */ /** * Size of the parity split. * Only the latest not zero size is allowed to grow. * If the value is unset, it's PARITY_SIZE_INVALID. */ data_off_t size; uint64_t device; /**< Device identifier of the parity. */ }; /** * Parity. */ struct snapraid_parity { struct snapraid_split split_map[SPLIT_MAX]; /**< Parity splits. */ unsigned split_mac; /**< Number of parity splits. */ char smartctl[PATH_MAX]; /**< Custom command for smartctl. Empty means auto. */ int smartignore[SMART_IGNORE_MAX]; /**< Smart attributes to ignore for this device. */ block_off_t total_blocks; /**< Number of total blocks. */ block_off_t free_blocks; /**< Number of free blocks at the last sync. */ int is_excluded_by_filter; /**< If the parity is excluded by filters. */ int skip_access; /**< If at least one of the parity disk is inaccessible and it should be skipped. */ uint64_t tick; /**< Usage time. */ uint64_t progress_tick[PROGRESS_MAX]; /**< Last cpu ticks of progress. */ unsigned cached_blocks; /**< Number of IO blocks cached. */ }; /** * Info. */ typedef uint64_t snapraid_info; /** * Allocate a content. */ struct snapraid_content* content_alloc(const char* path, uint64_t dev); /** * Deallocate a content. */ void content_free(struct snapraid_content* content); /** * Allocate a filter pattern for files and directories. */ struct snapraid_filter* filter_alloc_file(int is_include, const char* root, const char* pattern); /** * Allocate a filter pattern for disks. */ struct snapraid_filter* filter_alloc_disk(int is_include, const char* pattern); /** * Deallocate an exclusion. */ void filter_free(void* filter); /** * Filter type description. */ const char* filter_type(struct snapraid_filter* filter, char* out, size_t out_size); /** * Filter hidden files. * Return !=0 if it matches and it should be excluded. */ static inline int filter_hidden(int enable, struct dirent* dd) { if (enable && dirent_hidden(dd)) { return 1; /* filter out */ } return 0; } /** * Filter a path using a list of filters. * For each element of the path all the filters are applied, until the first one that matches. * Return !=0 if it should be excluded. */ int filter_path(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub); /** * Filter a file/link/dir if missing. * This call imply a disk check for the file presence. * Return !=0 if the file is present and it should be excluded. */ int filter_existence(int filter_missing, const char* dir, const char* sub); /** * Filter a file if bad. * Return !=0 if the file is correct and it should be excluded. */ int filter_correctness(int filter_error, tommy_arrayblkof* infoarr, struct snapraid_disk* disk, struct snapraid_file* file); /** * Filter a dir using a list of filters. * For each element of the path all the filters are applied, until the first one that matches. * Thesesdir are always by included by default, to allow to apply rules at the contained files. * Return !=0 if should be excluded. */ int filter_subdir(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub); /** * Filter a dir using a list of filters. * For each element of the path all the filters are applied, until the first one that matches. * Return !=0 if should be excluded. */ int filter_emptydir(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub); /** * Filter a path if it's a content file. * Return !=0 if should be excluded. */ int filter_content(tommy_list* contentlist, const char* path); /** * Check if the specified hash is invalid. * * An invalid hash is represented with all bytes at 0x00. * * If working with reduced hash lengths, this function always return 0. */ static inline int hash_is_invalid(const unsigned char* hash) { int i; /* if the hash is reduced, we cannot grant that it's a specific kind of hash */ if (BLOCK_HASH_SIZE != HASH_MAX) return 0; for (i = 0; i < BLOCK_HASH_SIZE; ++i) if (hash[i] != 0x00) return 0; return 1; } /** * Check if the specified hash represent the zero block. * * A zero hash is represented with all bytes at 0xFF. * * If working with reduced hash lengths, this function always return 0. */ static inline int hash_is_zero(const unsigned char* hash) { int i; /* if the hash is reduced, we cannot grant that it's a specific kind of hash */ if (BLOCK_HASH_SIZE != HASH_MAX) return 0; for (i = 0; i < BLOCK_HASH_SIZE; ++i) if (hash[i] != 0xFF) return 0; return 1; } /** * Check if the specified hash is unequivocally representing the data. * * If working with reduced hash lengths, this function always return 0. */ static inline int hash_is_unique(const unsigned char* hash) { /* if the hash is reduced, we cannot grant that it's a specific kind of hash */ if (BLOCK_HASH_SIZE != HASH_MAX) return 0; return !hash_is_zero(hash) && !hash_is_invalid(hash); } /** * Set the hash to the special INVALID value. */ static inline void hash_invalid_set(unsigned char* hash) { memset(hash, 0x00, BLOCK_HASH_SIZE); } /** * Set the hash to the special ZERO value. */ static inline void hash_zero_set(unsigned char* hash) { memset(hash, 0xFF, BLOCK_HASH_SIZE); } /** * Allocated space for block. */ static inline size_t block_sizeof(void) { return 1 + BLOCK_HASH_SIZE; } /** * Get the state of the block. * * For this function, it's allowed to pass a NULL block * pointer than results in the BLOCK_STATE_EMPTY state. */ static inline unsigned block_state_get(const struct snapraid_block* block) { if (block == BLOCK_NULL) return BLOCK_STATE_EMPTY; return block->state; } /** * Set the state of the block. */ static inline void block_state_set(struct snapraid_block* block, unsigned state) { block->state = state; } /** * Check if the specified block has an updated hash. * * Note that EMPTY / CHG / DELETED return 0. */ static inline int block_has_updated_hash(const struct snapraid_block* block) { unsigned state = block_state_get(block); return state == BLOCK_STATE_BLK || state == BLOCK_STATE_REP; } /** * Check if the specified block has a past hash, * i.e. the hash of the data that it's now overwritten or lost. * * Note that EMPTY / BLK / REP return 0. */ static inline int block_has_past_hash(const struct snapraid_block* block) { unsigned state = block_state_get(block); return state == BLOCK_STATE_CHG || state == BLOCK_STATE_DELETED; } /** * Check if the specified block is part of a file. * * Note that EMPTY / DELETED return 0. */ static inline int block_has_file(const struct snapraid_block* block) { unsigned state = block_state_get(block); return state == BLOCK_STATE_BLK || state == BLOCK_STATE_CHG || state == BLOCK_STATE_REP; } /** * Check if the block has an invalid parity than needs to be updated. * * Note that EMPTY / BLK return 0. */ static inline int block_has_invalid_parity(const struct snapraid_block* block) { unsigned state = block_state_get(block); return state == BLOCK_STATE_DELETED || state == BLOCK_STATE_CHG || state == BLOCK_STATE_REP; } /** * Check if the block is part of a file with valid parity. * * Note that anything different than BLK return 0. */ static inline int block_has_file_and_valid_parity(const struct snapraid_block* block) { unsigned state = block_state_get(block); return state == BLOCK_STATE_BLK; } static inline int file_flag_has(const struct snapraid_file* file, unsigned mask) { if (mask >= (1 << FILE_FLAGS_SHARED_BIT)) { mask >>= FILE_FLAGS_SHARED_BIT; return (file->shared_flag & mask) == mask; } else { return (file->flag & mask) == mask; } } static inline void file_flag_set(struct snapraid_file* file, unsigned mask) { if (mask >= (1 << FILE_FLAGS_SHARED_BIT)) { mask >>= FILE_FLAGS_SHARED_BIT; file->shared_flag |= mask; } else { file->flag |= mask; } } static inline void file_flag_clear(struct snapraid_file* file, unsigned mask) { if (mask >= (1 << FILE_FLAGS_SHARED_BIT)) { mask >>= FILE_FLAGS_SHARED_BIT; file->shared_flag &= ~mask; } else { file->flag &= ~mask; } } /** * Allocate a file. */ struct snapraid_file* file_alloc(unsigned block_size, const char* sub, data_off_t size, uint64_t mtime_sec, int mtime_nsec, uint64_t inode, uint64_t physical); /** * Duplicate a file. */ struct snapraid_file* file_dup(struct snapraid_file* copy); /** * Deallocate a file. */ void file_free(struct snapraid_file* file); /** * Rename a file. */ void file_rename(struct snapraid_file* file, const char* sub); /** * Copy a file. */ void file_copy(struct snapraid_file* src_file, struct snapraid_file* dest_file); /** * Return the block at the specified position. * * Note that the block size if a runtime value. */ static inline struct snapraid_block* file_block(struct snapraid_file* file, size_t pos) { unsigned char* ptr = (unsigned char*)file->blockvec; return (struct snapraid_block*)(ptr + pos * block_sizeof()); } /** * Return the name of the file, without the dir. */ const char* file_name(const struct snapraid_file* file); /** * Check if the block is the last in the file. */ int file_block_is_last(struct snapraid_file* file, block_off_t file_pos); /** * Get the size in bytes of the block. * If it's the last block of a file it could be less than block_size. */ unsigned file_block_size(struct snapraid_file* file, block_off_t file_pos, unsigned block_size); /** * Compare a file with an inode. */ int file_inode_compare_to_arg(const void* void_arg, const void* void_data); /** * Compare files by inode. */ int file_inode_compare(const void* void_a, const void* void_b); /** * Compare files by path. */ int file_path_compare(const void* void_a, const void* void_b); /** * Compare files by physical address. */ int file_physical_compare(const void* void_a, const void* void_b); /** * Compute the hash of a file inode. */ static inline tommy_uint32_t file_inode_hash(uint64_t inode) { return (tommy_uint32_t)tommy_inthash_u64(inode); } /** * Compare a file with a path. */ int file_path_compare_to_arg(const void* void_arg, const void* void_data); /** * Compare a file with another file for name, stamp, and both. */ int file_name_compare(const void* void_a, const void* void_b); int file_stamp_compare(const void* void_a, const void* void_b); int file_namestamp_compare(const void* void_a, const void* void_b); int file_pathstamp_compare(const void* void_a, const void* void_b); /** * Compute the hash of a file path. */ static inline tommy_uint32_t file_path_hash(const char* sub) { return tommy_hash_u32(0, sub, strlen(sub)); } /** * Compute the hash of a file stamp. */ static inline tommy_uint32_t file_stamp_hash(data_off_t size, int64_t mtime_sec, int mtime_nsec) { return tommy_inthash_u32((tommy_uint32_t)size ^ tommy_inthash_u32(mtime_sec ^ tommy_inthash_u32(mtime_nsec))); } /** * Allocate a extent. */ struct snapraid_extent* extent_alloc(block_off_t parity_pos, struct snapraid_file* file, block_off_t file_pos, block_off_t count); /** * Deallocate a extent. */ void extent_free(struct snapraid_extent* extent); /** * Compare extent by parity position. */ int extent_parity_compare(const void* void_a, const void* void_b); /** * Compare extent by file and file position. */ int extent_file_compare(const void* void_a, const void* void_b); static inline int link_flag_has(const struct snapraid_link* slink, unsigned mask) { return (slink->flag & mask) == mask; } static inline void link_flag_set(struct snapraid_link* slink, unsigned mask) { slink->flag |= mask; } static inline void link_flag_clear(struct snapraid_link* slink, unsigned mask) { slink->flag &= ~mask; } static inline void link_flag_let(struct snapraid_link* slink, unsigned flag, unsigned mask) { slink->flag &= ~mask; slink->flag |= flag & mask; } static inline unsigned link_flag_get(struct snapraid_link* slink, unsigned mask) { return slink->flag & mask; } /** * Allocate a link. */ struct snapraid_link* link_alloc(const char* name, const char* slink, unsigned link_flag); /** * Deallocate a link. */ void link_free(struct snapraid_link* slink); /** * Compare a link with a name. */ int link_name_compare_to_arg(const void* void_arg, const void* void_data); /** * Compare links by path. */ int link_alpha_compare(const void* void_a, const void* void_b); /** * Compute the hash of a link name. */ static inline tommy_uint32_t link_name_hash(const char* name) { return tommy_hash_u32(0, name, strlen(name)); } static inline int dir_flag_has(const struct snapraid_dir* dir, unsigned mask) { return (dir->flag & mask) == mask; } static inline void dir_flag_set(struct snapraid_dir* dir, unsigned mask) { dir->flag |= mask; } static inline void dir_flag_clear(struct snapraid_dir* dir, unsigned mask) { dir->flag &= ~mask; } /** * Allocate a dir. */ struct snapraid_dir* dir_alloc(const char* name); /** * Deallocate a dir. */ void dir_free(struct snapraid_dir* dir); /** * Compare a dir with a name. */ int dir_name_compare(const void* void_arg, const void* void_data); /** * Compute the hash of a dir name. */ static inline tommy_uint32_t dir_name_hash(const char* name) { return tommy_hash_u32(0, name, strlen(name)); } /** * Allocate a disk. */ struct snapraid_disk* disk_alloc(const char* name, const char* dir, uint64_t dev, const char* uuid, int skip_access); /** * Deallocate a disk. */ void disk_free(struct snapraid_disk* disk); /** * Allocate a extra disk. */ struct snapraid_extra* extra_alloc(const char* name, const char* dir, uint64_t dev, const char* uuid); /** * Deallocate a other disk. */ void extra_free(struct snapraid_extra* other); /** * Get the size of the disk in blocks. */ block_off_t fs_size(struct snapraid_disk* disk); /** * Check if a disk is totally empty and can be discarded from the content file. * A disk is empty if it doesn't contain any file, symlink, hardlink or dir * and without any DELETED block. * The blockmax is used to limit the search of DELETED block up to blockmax. */ int fs_is_empty(struct snapraid_disk* disk, block_off_t blockmax); /** * Check the file-system for errors. * Return 0 if it's OK. */ int fs_check(struct snapraid_disk* disk); /** * Allocate a parity position for the specified file position. * * After this call you can use the par2file/par2block operations * to query the relation. * * \note This function is NOT thread-safe as it uses the disk cache. + */ void fs_allocate(struct snapraid_disk* disk, block_off_t parity_pos, struct snapraid_file* file, block_off_t file_pos); /** * Deallocate the parity position. * * After this call the par2file/par2block operations * won't find anymore the parity association. * * \note This function is NOT thread-safe as it uses the disk cache. */ void fs_deallocate(struct snapraid_disk* disk, block_off_t pos); /** * Get the block from the file position. */ struct snapraid_block* fs_file2block_get(struct snapraid_file* file, block_off_t file_pos); /** * Get the file position from the parity position. * Return 0 if no file is using it. */ struct snapraid_file* fs_par2file_find(struct snapraid_disk* disk, block_off_t parity_pos, block_off_t* file_pos); /** * Get the file position from the parity position. */ static inline struct snapraid_file* fs_par2file_get(struct snapraid_disk* disk, block_off_t parity_pos, block_off_t* file_pos) { struct snapraid_file* ret; ret = fs_par2file_find(disk, parity_pos, file_pos); if (ret == 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Deresolving parity to file at position '%u' in disk '%s'\n", parity_pos, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } return ret; } /** * Get the parity position from the file position. * Return POS_NULL if no parity is allocated. */ block_off_t fs_file2par_find(struct snapraid_disk* disk, struct snapraid_file* file, block_off_t file_pos); /** * Get the parity position from the file position. */ static inline block_off_t fs_file2par_get(struct snapraid_disk* disk, struct snapraid_file* file, block_off_t file_pos) { block_off_t ret; ret = fs_file2par_find(disk, file, file_pos); if (ret == POS_NULL) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Resolving file '%s' at position '%u/%u' in disk '%s'\n", file->sub, file_pos, file->blockmax, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } return ret; } /** * Get the block from the parity position. * Return BLOCK_NULL==0 if the block is over the end of the disk or not used. */ struct snapraid_block* fs_par2block_find(struct snapraid_disk* disk, block_off_t parity_pos); /** * Get the block from the parity position. */ static inline struct snapraid_block* fs_par2block_get(struct snapraid_disk* disk, block_off_t parity_pos) { struct snapraid_block* ret; ret = fs_par2block_find(disk, parity_pos); if (ret == BLOCK_NULL) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Deresolving parity to block at position '%u' in disk '%s'\n", parity_pos, disk->name); os_abort(); /* LCOV_EXCL_STOP */ } return ret; } /** * Allocate a disk mapping. * Uses uuid="" if not available. */ struct snapraid_map* map_alloc(const char* name, unsigned position, block_off_t total_blocks, block_off_t free_blocks, const char* uuid); /** * Deallocate a disk mapping. */ void map_free(struct snapraid_map* map); /** * Mask used to store additional information in the info bits. * * These bits reduce the granularity of the time in the memory representation. */ #define INFO_MASK ((snapraid_info)0x7) /** * Make an info. */ static inline snapraid_info info_make(time_t last_access, int error, int rehash, int justsynced) { /* clear the lowest bits as reserved for other information */ snapraid_info info = last_access & ~INFO_MASK; if (error != 0) info |= 0x1; if (rehash != 0) info |= 0x2; if (justsynced != 0) info |= 0x4; return info; } /** * Extract the time information. * This is the last time when the block was know to be correct. * The "scrubbed" info tells if the time is referring at the latest sync or scrub. */ static inline time_t info_get_time(snapraid_info info) { return info & ~INFO_MASK; } /** * Extract the error information. * Report if the block address had some problem. */ static inline int info_get_bad(snapraid_info info) { return (info & 0x1) != 0; } /** * Extract the rehash information. * Report if the block address is using the old hash and needs to be rehashed. */ static inline int info_get_rehash(snapraid_info info) { return (info & 0x2) != 0; } /** * Extract the scrubbed information. * Report if the block address was never scrubbed. */ static inline int info_get_justsynced(snapraid_info info) { return (info & 0x4) != 0; } /** * Mark the block address as with error. */ static inline snapraid_info info_set_bad(snapraid_info info) { return info | 0x1; } /** * Mark the block address as with rehash. */ static inline snapraid_info info_set_rehash(snapraid_info info) { return info | 0x2; } /** * Set the info at the specified position. * The position is allocated if not yet done. */ static inline void info_set(tommy_arrayblkof* array, block_off_t pos, snapraid_info info) { tommy_arrayblkof_grow(array, pos + 1); memcpy(tommy_arrayblkof_ref(array, pos), &info, sizeof(snapraid_info)); } /** * Get the info at the specified position. * For not allocated position, 0 is returned. */ static inline snapraid_info info_get(tommy_arrayblkof* array, block_off_t pos) { snapraid_info info; if (pos >= tommy_arrayblkof_size(array)) return 0; memcpy(&info, tommy_arrayblkof_ref(array, pos), sizeof(snapraid_info)); return info; } /****************************************************************************/ /* bucket */ struct snapraid_bucket { time_t time_at; /**< Time of the scrub */ block_off_t count_scrubbed; /**< Number of blocks scrubbed */ block_off_t count_justsynced; /**< Number of blocks justsynced */ tommy_node node; }; void bucket_free(struct snapraid_bucket* bucket); /** * Insert an bucket record into the hashtable */ void bucket_insert(tommy_hashdyn* bucket_hash, time_t time_at, block_off_t count, int justsynced); /** * Convert the bucket hashtable to a sorted list */ void bucket_to_list(tommy_hashdyn* bucket_hash, tommy_list* bucket_list, block_off_t* bucketcount); /****************************************************************************/ /* format */ #define FMT_FILE 0 /**< Print only the file. */ #define FMT_DISK 1 /**< Print the disk name and the file. */ #define FMT_PATH 2 /**< Print the full path. */ extern int FMT_MODE; /** * Format a file path for poll reference */ const char* fmt_poll(const struct snapraid_disk* disk, const char* str); /** * Format a path name for terminal reference */ const char* fmt_term(const struct snapraid_disk* disk, const char* str); /** * Format a size adding suffix K/M/G/T */ const char* fmt_size(uint64_t size, char* buffer, size_t buffer_size); #endif snapraid-14.9/cmdline/handle.c000066400000000000000000000245241522717156100163000ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "elem.h" #include "support.h" #include "handle.h" /****************************************************************************/ /* handle */ int handle_create(struct snapraid_handle* handle, struct snapraid_file* file, int mode) { int ret; int flags; /* if it's the same file, and already opened, nothing to do */ if (handle->file == file && handle->f != -1) { return 0; } advise_init(&handle->advise, mode); pathprint(handle->path, sizeof(handle->path), "%s%s", handle->disk->dir, file->sub); ret = mkancestor(handle->path); if (ret != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } /* initial values, changed later if required */ handle->created = 0; /* flags for opening */ /* O_BINARY: open as binary file (Windows only) */ /* O_NOFOLLOW: do not follow links to ensure to open the real file */ flags = O_BINARY | O_NOFOLLOW | advise_flags(&handle->advise); /* open for read write */ handle->f = open(handle->path, flags | O_RDWR); /* if failed for missing write permission */ if (handle->f == -1 && (errno == EACCES || errno == EROFS)) { /* open for read-only */ handle->f = open(handle->path, flags | O_RDONLY); } /* if failed for missing file */ if (handle->f == -1 && errno == ENOENT) { char path_from[PATH_MAX]; /* check if exists a .unrecoverable copy, and rename to the real one */ pathprint(path_from, sizeof(path_from), "%s.unrecoverable", handle->path); if (rename(path_from, handle->path) == 0) { /* open for read write */ handle->f = open(handle->path, flags | O_RDWR); } else { /* create it */ handle->f = open(handle->path, flags | O_RDWR | O_CREAT, 0600); if (handle->f != -1) { /* mark it as created if really done */ handle->created = 1; } } } if (handle->f == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening file '%s'. %s.\n", handle->path, strerror(errno)); handle_close(handle); return -1; /* LCOV_EXCL_STOP */ } /* just opened */ handle->file = file; /* get the stat info */ ret = fstat(handle->f, &handle->st); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing file '%s'. %s.\n", handle->path, strerror(errno)); handle_close(handle); return -1; /* LCOV_EXCL_STOP */ } /* get the size of the existing data */ handle->valid_size = handle->st.st_size; ret = advise_open(&handle->advise, handle->f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error advising file '%s'. %s.\n", handle->path, strerror(errno)); handle_close(handle); return -1; /* LCOV_EXCL_STOP */ } return 0; } int handle_truncate(struct snapraid_handle* handle, struct snapraid_file* file) { int ret; ret = ftruncate(handle->f, file->size); if (ret != 0) { /* LCOV_EXCL_START */ if (errno == EACCES) { log_fatal(errno, "Failed to truncate file '%s' for missing write permission.\n", handle->path); } else { log_fatal(errno, "Error truncating file '%s'. %s.\n", handle->path, strerror(errno)); } return -1; /* LCOV_EXCL_STOP */ } /* adjust the size to the truncated size */ handle->valid_size = file->size; return 0; } int handle_open(struct snapraid_handle* handle, struct snapraid_file* file, int mode, log_ptr* out_missing) { int ret; int flags; if (!out_missing) out_missing = log_error; /* if already opened, nothing to do */ if (handle->file == file && handle->file != 0 && handle->f != -1) { return 0; } advise_init(&handle->advise, mode); pathprint(handle->path, sizeof(handle->path), "%s%s", handle->disk->dir, file->sub); /* for sure not created */ handle->created = 0; /* flags for opening */ /* O_BINARY: open as binary file (Windows only) */ /* O_NOFOLLOW: do not follow links to ensure to open the real file */ flags = O_BINARY | O_NOFOLLOW | advise_flags(&handle->advise); /* open for read */ handle->f = open_noatime(handle->path, flags | O_RDONLY); if (handle->f == -1) { if (errno == ENOENT) out_missing(errno, "Missing file '%s'.\n", handle->path); else if (errno == EACCES) log_error(errno, "Permission denied for file '%s'.\n", handle->path); else log_error(errno, "Error opening file '%s'. %s.\n", handle->path, strerror(errno)); handle_close(handle); return -1; } /* just opened */ handle->file = file; /* get the stat info */ ret = fstat(handle->f, &handle->st); if (ret != 0) { /* LCOV_EXCL_START */ log_error(errno, "Error accessing file '%s'. %s.\n", handle->path, strerror(errno)); handle_close(handle); return -1; /* LCOV_EXCL_STOP */ } /* get the size of the existing data */ handle->valid_size = handle->st.st_size; ret = advise_open(&handle->advise, handle->f); if (ret != 0) { /* LCOV_EXCL_START */ log_error(errno, "Error advising file '%s'. %s.\n", handle->path, strerror(errno)); handle_close(handle); return -1; /* LCOV_EXCL_STOP */ } return 0; } int handle_close(struct snapraid_handle* handle) { int ret; /* close if open */ if (handle->f != -1) { advise_close(&handle->advise, handle->f); ret = close(handle->f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file '%s'. %s.\n", handle->path, strerror(errno)); /* invalidate for error */ handle->file = 0; handle->f = -1; handle->valid_size = 0; return -1; /* LCOV_EXCL_STOP */ } } /* reset the descriptor */ handle->file = 0; handle->f = -1; handle->valid_size = 0; return 0; } int handle_read(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size, log_ptr* out_missing) { ssize_t read_ret; data_off_t offset; unsigned read_size; unsigned count; int ret; offset = file_pos * (data_off_t)block_size; if (!out_missing) out_missing = log_error; /* check if we are going to read only not initialized data */ if (offset >= handle->valid_size) { /* if the file is missing, it's at 0 size, or it's rebuilt while reading */ if (offset == handle->valid_size || handle->valid_size == 0) { errno = ENOENT; if (offset == 0) { out_missing(errno, "Missing file '%s'.\n", handle->path); } else { out_missing(errno, "Missing data in file '%s' at offset %" PRIu64 ".\n", handle->path, offset); } } else { errno = ENXIO; log_error(errno, "Reading over the end from file '%s' at offset %" PRIu64 ".\n", handle->path, offset); } return -1; } read_size = file_block_size(handle->file, file_pos, block_size); count = 0; errno = 0; do { bw_limit(handle->bw, block_size - count); read_ret = pread(handle->f, block_buffer + count, block_size - count, offset + count); if (read_ret == -1) { /* LCOV_EXCL_START */ log_error(errno, "Error reading file '%s' at offset %" PRIu64 " for size %u. %s.\n", handle->path, offset + count, block_size - count, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } if (read_ret == 0) { /* LCOV_EXCL_START */ if (errno == 0) errno = ENXIO; log_error(errno, "Unexpected end of file '%s' at offset %" PRIu64 ". %s.\n", handle->path, offset, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } count += read_ret; } while (count < read_size); /* pad with 0 */ if (read_size < block_size) { memset(block_buffer + read_size, 0, block_size - read_size); } ret = advise_read(&handle->advise, handle->f, offset, block_size); if (ret != 0) { /* LCOV_EXCL_START */ log_error(errno, "Error advising file '%s'. %s.\n", handle->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } return read_size; } int handle_write(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size) { ssize_t write_ret; data_off_t offset; unsigned write_size; unsigned count; int ret; offset = file_pos * (data_off_t)block_size; write_size = file_block_size(handle->file, file_pos, block_size); count = 0; do { bw_limit(handle->bw, write_size - count); write_ret = pwrite(handle->f, block_buffer + count, write_size - count, offset + count); if (write_ret == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing file '%s'. %s.\n", handle->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } if (write_ret == 0) { /* LCOV_EXCL_START */ errno = ENXIO; log_fatal(errno, "Unexpected 0 write to file '%s'. %s.\n", handle->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } count += write_ret; } while (count < write_size); /* adjust the size of the valid data */ if (handle->valid_size < offset + write_size) { handle->valid_size = offset + write_size; } ret = advise_write(&handle->advise, handle->f, offset, block_size); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error advising file '%s'. %s.\n", handle->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } return 0; } int handle_utime(struct snapraid_handle* handle) { int ret; /* do nothing if not opened */ if (handle->f == -1) return 0; ret = fmtime(handle->f, handle->file->mtime_sec, handle->file->mtime_nsec); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error timing file '%s'. %s.\n", handle->file->sub, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } return 0; } struct snapraid_handle* handle_mapping(struct snapraid_state* state, unsigned* handlemax) { tommy_node* i; unsigned j; unsigned size = 0; struct snapraid_handle* handle; /* get the size of the mapping */ size = 0; for (i = state->maplist; i != 0; i = i->next) { struct snapraid_map* map = i->data; if (map->position > size) size = map->position; } ++size; /* size is one more than the max */ handle = malloc_nofail(size * sizeof(struct snapraid_handle)); for (j = 0; j < size; ++j) { /* default for empty position */ handle[j].disk = 0; handle[j].file = 0; handle[j].f = -1; handle[j].valid_size = 0; handle[j].bw = 0; } /* set the vector */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_map* map; struct snapraid_disk* disk = i->data; tommy_node* k; /* search the mapping for this disk */ map = 0; for (k = state->maplist; k != 0; k = k->next) { map = k->data; if (strcmp(disk->name, map->name) == 0) break; } if (!map) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal error for inconsistent disk mapping.\n"); os_abort(); /* LCOV_EXCL_STOP */ } handle[map->position].disk = disk; } *handlemax = size; return handle; } snapraid-14.9/cmdline/handle.h000066400000000000000000000046531522717156100163060ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __HANDLE_H #define __HANDLE_H #include "state.h" #include "support.h" #include "bw.h" /****************************************************************************/ /* handle */ struct snapraid_handle { char path[PATH_MAX]; /**< Path of the file. */ struct snapraid_disk* disk; /**< Disk of the file. */ struct snapraid_file* file; /**< File opened. When the file is closed, it's set to 0. */ int f; /**< Handle of the file. */ struct stat st; /**< Stat info of the opened file. */ struct advise_struct advise; /**< Advise information. */ data_off_t valid_size; /**< Size of the valid data. */ int created; /**< If the file was created, otherwise it was already existing. */ struct snapraid_bw* bw; /**< Context for bandwidth limiting. */ }; /** * Create a file. * The file is created if missing, and opened with write access. * If the file is created, the handle->created is set. * The initial size of the file is stored in the file->st struct. * If the file cannot be opened for write access, it's opened with read-only access. * The read-only access works only if the file has already the correct size and doesn't need to be modified. */ int handle_create(struct snapraid_handle* handle, struct snapraid_file* file, int mode); /** * Truncate a file if required. */ int handle_truncate(struct snapraid_handle* handle, struct snapraid_file* file); /** * Open a file. * The file is opened for reading. */ int handle_open(struct snapraid_handle* handle, struct snapraid_file* file, int mode, log_ptr* out_missing); /** * Close a file. */ int handle_close(struct snapraid_handle* handle); /** * Read a block from a file. * If the read block is shorter, it's padded with 0. */ int handle_read(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size, log_ptr* out_missing); /** * Write a block to a file. */ int handle_write(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size); /** * Change the modification time of the file to the saved value. */ int handle_utime(struct snapraid_handle* handle); /** * Map the unsorted list of disk to an ordered vector. * \param diskmax The size of the vector. * \return The allocated vector of pointers. */ struct snapraid_handle* handle_mapping(struct snapraid_state* state, unsigned* diskmax); #endif snapraid-14.9/cmdline/import.c000066400000000000000000000205241522717156100163530ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "import.h" /****************************************************************************/ /* import */ /** * Compare the hash of two import blocks. */ int import_block_hash_compare(const void* void_arg, const void* void_data) { const unsigned char* arg = void_arg; const struct snapraid_import_block* block = void_data; return memcmp(arg, block->hash, BLOCK_HASH_SIZE); } int import_block_prevhash_compare(const void* void_arg, const void* void_data) { const unsigned char* arg = void_arg; const struct snapraid_import_block* block = void_data; return memcmp(arg, block->prevhash, BLOCK_HASH_SIZE); } /** * Compute the hash of the hash for an import block. * We just use the first 32 bit of the hash itself. */ static inline tommy_uint32_t import_block_hash(const unsigned char* hash) { /* the hash data is not aligned, and we cannot access it with a direct cast */ return hash[0] | ((uint32_t)hash[1] << 8) | ((uint32_t)hash[2] << 16) | ((uint32_t)hash[3] << 24); } static void import_file(struct snapraid_state* state, const char* path, uint64_t size) { struct snapraid_import_file* file; block_off_t i; data_off_t offset; void* buffer; int ret; int f; int flags; unsigned block_size = state->block_size; struct advise_struct advise; file = malloc_nofail(sizeof(struct snapraid_import_file)); file->path = strdup_nofail(path); file->size = size; file->blockmax = (size + block_size - 1) / block_size; file->blockimp = malloc_nofail(file->blockmax * sizeof(struct snapraid_import_block)); buffer = malloc_nofail(block_size); advise_init(&advise, state->file_mode); /* open for read */ flags = O_RDONLY | O_BINARY | advise_flags(&advise); f = open(path, flags); if (f == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = advise_open(&advise, f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error advising file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } offset = 0; for (i = 0; i < file->blockmax; ++i) { struct snapraid_import_block* block = &file->blockimp[i]; unsigned read_size = block_size; if (read_size > size) read_size = size; ret = read(f, buffer, read_size); if (ret < 0 || (unsigned)ret != read_size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } block->file = file; block->offset = offset; block->size = read_size; memhash(state->hash, state->hashseed, block->hash, buffer, read_size); tommy_hashdyn_insert(&state->importset, &block->nodeset, block, import_block_hash(block->hash)); /* if we are in a rehash state */ if (state->prevhash != HASH_UNDEFINED) { /* compute also the previous hash */ memhash(state->prevhash, state->prevhashseed, block->prevhash, buffer, read_size); tommy_hashdyn_insert(&state->previmportset, &block->prevnodeset, block, import_block_hash(block->prevhash)); } offset += read_size; size -= read_size; } advise_close(&advise, f); ret = close(f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } tommy_list_insert_tail(&state->importlist, &file->nodelist, file); free(buffer); } void import_file_free(struct snapraid_import_file* file) { free(file->path); free(file->blockimp); free(file); } int state_import_fetch(struct snapraid_state* state, int rehash, struct snapraid_block* missing_block, unsigned char* buffer) { struct snapraid_import_block* block; int ret; int f; const unsigned char* hash = missing_block->hash; unsigned block_size = state->block_size; unsigned read_size; unsigned char buffer_hash[HASH_MAX]; const char* path; if (rehash) { block = tommy_hashdyn_search(&state->previmportset, import_block_prevhash_compare, hash, import_block_hash(hash)); } else { block = tommy_hashdyn_search(&state->importset, import_block_hash_compare, hash, import_block_hash(hash)); } if (!block) return -1; path = block->file->path; read_size = block->size; f = open(path, O_RDONLY | O_BINARY); if (f == -1) { /* LCOV_EXCL_START */ if (errno == ENOENT) { log_fatal(errno, "DANGER! file '%s' disappeared.\n", path); log_fatal(errno, "If you moved it, please rerun the same command.\n"); } else { log_fatal(errno, "Error opening file '%s'. %s.\n", path, strerror(errno)); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = pread(f, buffer, read_size, block->offset); if (ret < 0 || (unsigned)ret != read_size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = close(f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (read_size != block_size) { /* fill the remaining with 0 */ memset(buffer + read_size, 0, block_size - read_size); } /* recheck the hash */ if (rehash) memhash(state->prevhash, state->prevhashseed, buffer_hash, buffer, read_size); else memhash(state->hash, state->hashseed, buffer_hash, buffer, read_size); if (memcmp(buffer_hash, hash, BLOCK_HASH_SIZE) != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Mismatch in data reading file '%s'.\n", path); log_fatal(EUSER, "Please don't change imported files while running.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return 0; } static void import_dir(struct snapraid_state* state, const char* dir) { DIR* d; d = opendir(dir); if (!d) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } while (1) { char path_next[PATH_MAX]; struct stat st; const char* name; struct dirent* dd; /* clear errno to detect erroneous conditions */ errno = 0; dd = readdir(d); if (dd == 0 && errno != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (dd == 0) { break; /* finished */ } /* skip "." and ".." files */ name = dd->d_name; if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) continue; pathprint(path_next, sizeof(path_next), "%s%s", dir, name); #if HAVE_STRUCT_DIRENT_D_STAT /* convert dirent to lstat result */ dirent_lstat(dd, &st); /* if the st_mode field is missing, takes care to fill it using normal lstat() */ /* at now this can happen only in Windows (with HAVE_STRUCT_DIRENT_D_STAT defined), */ /* because we use a directory reading method that doesn't read info about ReparsePoint. */ /* Note that here we cannot call here lstat_sync(), because we don't know what kind */ /* of file is it, and lstat_sync() doesn't always work */ if (st.st_mode == 0) { if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #else /* get lstat info about the file */ if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif if (S_ISREG(st.st_mode)) { import_file(state, path_next, st.st_size); } else if (S_ISDIR(st.st_mode)) { pathslash(path_next, sizeof(path_next)); import_dir(state, path_next); } } if (closedir(d) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } void state_import(struct snapraid_state* state, const char* dir) { char path[PATH_MAX]; msg_progress("Importing...\n"); /* if the hash is not full */ if (BLOCK_HASH_SIZE != HASH_MAX) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot import files when using a reduced hash.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* add the final slash */ pathimport(path, sizeof(path), dir); pathslash(path, sizeof(path)); import_dir(state, path); } snapraid-14.9/cmdline/import.h000066400000000000000000000032341522717156100163570ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #ifndef __IMPORT_H #define __IMPORT_H #include "elem.h" #include "state.h" /****************************************************************************/ /* import */ /** * Import block. * Block used to import data external when recovering by hash. */ struct snapraid_import_block { struct snapraid_import_file* file; /**< Back pointer to the file owning this block. */ unsigned size; /**< Size of the block. */ data_off_t offset; /**< Position of the block in the file. */ unsigned char hash[HASH_MAX]; /**< Hash of the block. */ unsigned char prevhash[HASH_MAX]; /**< Previous hash of the block. Valid only if we are in rehash state. */ /* nodes for data structures */ tommy_hashdyn_node nodeset; tommy_hashdyn_node prevnodeset; }; /** * Import file. * File used to import data external when recovering by hash. */ struct snapraid_import_file { data_off_t size; /**< Size of the file. */ struct snapraid_import_block* blockimp; /**< All the blocks of the file. */ block_off_t blockmax; /**< Number of blocks. */ char* path; /**< Full path of the file. */ /* nodes for data structures */ tommy_node nodelist; }; /** * Deallocate an import file. */ void import_file_free(struct snapraid_import_file* file); /** * Fetch a block from the specified hash. * Return ==0 if the block is found, and copied into buffer. */ int state_import_fetch(struct snapraid_state* state, int prevhash, struct snapraid_block* missing_block, unsigned char* buffer); /** * Import files from the specified directory. */ void state_import(struct snapraid_state* state, const char* dir); #endif snapraid-14.9/cmdline/io.c000066400000000000000000000662441522717156100154610ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2016 Andrea Mazzoleni #include "portable.h" #include "io.h" void (*io_start)(struct snapraid_io* io, block_off_t blockstart, block_off_t blockmax, bit_vect_t* block_enabled) = 0; void (*io_stop)(struct snapraid_io* io) = 0; block_off_t (*io_read_next)(struct snapraid_io* io, void*** buffer) = 0; struct snapraid_task* (*io_data_read)(struct snapraid_io* io, unsigned* diskcur, unsigned* waiting_map, unsigned* waiting_mac) = 0; struct snapraid_task* (*io_parity_read)(struct snapraid_io* io, unsigned* levcur, unsigned* waiting_map, unsigned* waiting_mac) = 0; void (*io_parity_write)(struct snapraid_io* io, unsigned* levcur, unsigned* waiting_map, unsigned* waiting_mac) = 0; void (*io_write_preset)(struct snapraid_io* io, block_off_t blockcur, int skip) = 0; void (*io_write_next)(struct snapraid_io* io, block_off_t blockcur, int skip, int* writer_error) = 0; void (*io_refresh)(struct snapraid_io* io) = 0; void (*io_flush)(struct snapraid_io* io) = 0; /** * Get the next block position to process. */ static block_off_t io_position_next(struct snapraid_io* io) { block_off_t blockcur; /* get the next position */ if (io->block_enabled) { while (io->block_next < io->block_max && !bit_vect_test(io->block_enabled, io->block_next)) ++io->block_next; } blockcur = io->block_next; /* next block for the next call */ ++io->block_next; return blockcur; } /** * Setup the next pending task for all readers. */ static void io_reader_sched(struct snapraid_io* io, int task_index, block_off_t blockcur) { unsigned i; for (i = 0; i < io->reader_max; ++i) { struct snapraid_worker* worker = &io->reader_map[i]; struct snapraid_task* task = &worker->task_map[task_index]; /* setup the new pending task */ if (blockcur < io->block_max) task->state = TASK_STATE_READY; else task->state = TASK_STATE_EMPTY; task->path[0] = 0; if (worker->handle) task->disk = worker->handle->disk; else task->disk = 0; assert(worker->buffer_skew + i < io->buffer_max); task->buffer = io->buffer_map[task_index][worker->buffer_skew + i]; task->position = blockcur; task->block = 0; task->file = 0; task->file_pos = 0; task->read_size = 0; task->is_timestamp_different = 0; } } /** * Setup the next pending task for all writers. */ static void io_writer_sched(struct snapraid_io* io, int task_index, block_off_t blockcur) { unsigned i; for (i = 0; i < io->writer_max; ++i) { struct snapraid_worker* worker = &io->writer_map[i]; struct snapraid_task* task = &worker->task_map[task_index]; /* setup the new pending task */ task->state = TASK_STATE_READY; task->path[0] = 0; task->disk = 0; task->buffer = io->buffer_map[task_index][worker->buffer_skew + i]; task->position = blockcur; task->block = 0; task->file = 0; task->file_pos = 0; task->read_size = 0; task->is_timestamp_different = 0; } } /** * Setup an empty next pending task for all writers. */ static void io_writer_sched_empty(struct snapraid_io* io, int task_index, block_off_t blockcur) { unsigned i; for (i = 0; i < io->writer_max; ++i) { struct snapraid_worker* worker = &io->writer_map[i]; struct snapraid_task* task = &worker->task_map[task_index]; /* setup the new pending task */ task->state = TASK_STATE_EMPTY; task->path[0] = 0; task->disk = 0; task->buffer = 0; task->position = blockcur; task->block = 0; task->file = 0; task->file_pos = 0; task->read_size = 0; task->is_timestamp_different = 0; } } /*****************************************************************************/ /* mono thread */ static block_off_t io_read_next_mono(struct snapraid_io* io, void*** buffer) { block_off_t blockcur_schedule; /* reset the index */ io->reader_index = 0; blockcur_schedule = io_position_next(io); /* schedule the next read */ io_reader_sched(io, 0, blockcur_schedule); /* set the buffer to use */ *buffer = io->buffer_map[0]; return blockcur_schedule; } static void io_write_preset_mono(struct snapraid_io* io, block_off_t blockcur, int skip) { unsigned i; /* reset the index */ io->writer_index = 0; /* clear errors */ for (i = 0; i < IO_WRITER_ERROR_MAX; ++i) io->writer_error[i] = 0; if (skip) { /* skip the next write */ io_writer_sched_empty(io, 0, blockcur); } else { /* schedule the next write */ io_writer_sched(io, 0, blockcur); } } static void io_write_next_mono(struct snapraid_io* io, block_off_t blockcur, int skip, int* writer_error) { unsigned i; (void)blockcur; (void)skip; /* report errors */ for (i = 0; i < IO_WRITER_ERROR_MAX; ++i) writer_error[i] = io->writer_error[i]; } static void io_refresh_mono(struct snapraid_io* io) { (void)io; } static void io_flush_mono(struct snapraid_io* io) { (void)io; } static struct snapraid_task* io_task_read_mono(struct snapraid_io* io, unsigned base, unsigned count, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { struct snapraid_worker* worker; struct snapraid_task* task; unsigned i; /* get the next task */ i = io->reader_index++; assert(base <= i && i < base + count); worker = &io->reader_map[i]; task = &worker->task_map[0]; /* do the work */ if (task->state != TASK_STATE_EMPTY) worker->func(worker, task); /* return the position */ *pos = i - base; /* store the waiting index */ waiting_map[0] = i - base; *waiting_mac = 1; return task; } static struct snapraid_task* io_data_read_mono(struct snapraid_io* io, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { return io_task_read_mono(io, io->data_base, io->data_count, pos, waiting_map, waiting_mac); } static struct snapraid_task* io_parity_read_mono(struct snapraid_io* io, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { return io_task_read_mono(io, io->parity_base, io->parity_count, pos, waiting_map, waiting_mac); } static void io_parity_write_mono(struct snapraid_io* io, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { struct snapraid_worker* worker; struct snapraid_task* task; unsigned i; /* get the next task */ i = io->writer_index++; worker = &io->writer_map[i]; task = &worker->task_map[0]; io->writer_error[i] = 0; /* do the work */ if (task->state != TASK_STATE_EMPTY) worker->func(worker, task); /* return the position */ *pos = i; /* store the waiting index */ waiting_map[0] = i; *waiting_mac = 1; } static void io_start_mono(struct snapraid_io* io, block_off_t blockstart, block_off_t blockmax, bit_vect_t* block_enabled) { io->block_start = blockstart; io->block_max = blockmax; io->block_enabled = block_enabled; io->block_next = blockstart; } static void io_stop_mono(struct snapraid_io* io) { (void)io; } /*****************************************************************************/ /* multi thread */ /* disable multithread if pthread is not present */ #if HAVE_THREAD /** * Get the next task to work on for a reader. * * This is the synchronization point for workers with the io. */ static struct snapraid_task* io_reader_step(struct snapraid_worker* worker) { struct snapraid_io* io = worker->io; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); while (1) { unsigned next_index; /* check if the worker has to exit */ /* even if there is work to do */ if (io->done) { thread_mutex_unlock(&io->io_mutex); return 0; } /* get the next pending task */ next_index = (worker->index + 1) % io->io_max; /* if the queue of pending tasks is not empty */ if (next_index != io->reader_index) { struct snapraid_task* task; /* the index that the IO may be waiting for */ unsigned waiting_index = io->reader_index; /* the index that worker just completed */ unsigned done_index = worker->index; /* get the new working task */ worker->index = next_index; task = &worker->task_map[worker->index]; /* if the just completed task is at this index */ if (done_index == waiting_index) { /* notify the IO that a new read is complete */ thread_cond_signal_and_unlock(&io->read_done, &io->io_mutex); } else { thread_mutex_unlock(&io->io_mutex); } /* return the new task */ return task; } /* otherwise wait for a read_sched event */ thread_cond_wait(&io->read_sched, &io->io_mutex); } } /** * Get the next task to work on for a writer. * * This is the synchronization point for workers with the io. */ static struct snapraid_task* io_writer_step(struct snapraid_worker* worker, int state) { struct snapraid_io* io = worker->io; int error_index; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); /* counts the number of errors in the global state */ error_index = state - IO_WRITER_ERROR_BASE; if (error_index >= 0 && error_index < IO_WRITER_ERROR_MAX) ++io->writer_error[error_index]; while (1) { unsigned next_index; /* get the next pending task */ next_index = (worker->index + 1) % io->io_max; /* if the queue of pending tasks is not empty */ if (next_index != io->writer_index) { struct snapraid_task* task; /* the index that the IO may be waiting for */ unsigned waiting_index = (io->writer_index + 1) % io->io_max; /* the index that worker just completed */ unsigned done_index = worker->index; /* get the new working task */ worker->index = next_index; task = &worker->task_map[worker->index]; /* if the just completed task is at this index */ if (done_index == waiting_index) { /* notify the IO that a new write is complete */ thread_cond_signal_and_unlock(&io->write_done, &io->io_mutex); } else { thread_mutex_unlock(&io->io_mutex); } /* return the new task */ return task; } /* check if the worker has to exit */ /* but only if there is no work to do */ if (io->done) { thread_mutex_unlock(&io->io_mutex); return 0; } /* otherwise wait for a write_sched event */ thread_cond_wait(&io->write_sched, &io->io_mutex); } } /** * Get the next block position to operate on. * * This is the synchronization point for workers with the io. */ static block_off_t io_read_next_thread(struct snapraid_io* io, void*** buffer) { block_off_t blockcur_schedule; block_off_t blockcur_caller; unsigned i; /* get the next parity position to process */ blockcur_schedule = io_position_next(io); /* ensure that all data/parity was read */ assert(io->reader_list[0] == io->reader_max); /* setup the list of workers to process */ for (i = 0; i <= io->reader_max; ++i) io->reader_list[i] = i; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); /* schedule the next read */ io_reader_sched(io, io->reader_index, blockcur_schedule); /* set the index for the tasks to return to the caller */ io->reader_index = (io->reader_index + 1) % io->io_max; /* get the position to operate at high level from one task */ blockcur_caller = io->reader_map[0].task_map[io->reader_index].position; /* set the buffer to use */ *buffer = io->buffer_map[io->reader_index]; /* signal all the workers that there is a new pending task */ thread_cond_broadcast_and_unlock(&io->read_sched, &io->io_mutex); return blockcur_caller; } static void io_write_preset_thread(struct snapraid_io* io, block_off_t blockcur, int skip) { (void)io; (void)blockcur; (void)skip; } static void io_write_next_thread(struct snapraid_io* io, block_off_t blockcur, int skip, int* writer_error) { unsigned i; /* ensure that all parity was written */ assert(io->writer_list[0] == io->writer_max); /* setup the list of workers to process */ for (i = 0; i <= io->writer_max; ++i) io->writer_list[i] = i; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); /* report errors */ for (i = 0; i < IO_WRITER_ERROR_MAX; ++i) { writer_error[i] = io->writer_error[i]; io->writer_error[i] = 0; } if (skip) { /* skip the next write */ io_writer_sched_empty(io, io->writer_index, blockcur); } else { /* schedule the next write */ io_writer_sched(io, io->writer_index, blockcur); } /* at this point the writers must be in sync with the readers */ assert(io->writer_index == io->reader_index); /* set the index to be used for the next write */ io->writer_index = (io->writer_index + 1) % io->io_max; /* signal all the workers that there is a new pending task */ thread_cond_broadcast_and_unlock(&io->write_sched, &io->io_mutex); } static void io_refresh_thread(struct snapraid_io* io) { unsigned i; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); /* for all readers, count the number of read blocks */ for (i = 0; i < io->reader_max; ++i) { unsigned begin, end, cached; struct snapraid_worker* worker = &io->reader_map[i]; /* the first block read */ begin = io->reader_index + 1; /* the block in reading */ end = worker->index; if (begin > end) end += io->io_max; cached = end - begin; if (worker->parity_handle) io->state->parity[worker->parity_handle->level].cached_blocks = cached; else worker->handle->disk->cached_blocks = cached; } /* for all writers, count the number of written blocks */ /* note that this is a kind of "opposite" of cached blocks */ for (i = 0; i < io->writer_max; ++i) { unsigned begin, end, cached; struct snapraid_worker* worker = &io->writer_map[i]; /* the first block written */ begin = io->writer_index + 1; /* the block in writing */ end = worker->index; if (begin > end) end += io->io_max; cached = end - begin; io->state->parity[worker->parity_handle->level].cached_blocks = cached; } thread_mutex_unlock(&io->io_mutex); } static void io_flush_thread(struct snapraid_io* io) { unsigned i; while (1) { int all_done = 1; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); for (i = 0; i < io->writer_max; ++i) { struct snapraid_worker* worker = &io->writer_map[i]; /* get the next pending task */ unsigned next_index = (worker->index + 1) % io->io_max; /* if the queue of pending tasks is not empty */ if (next_index != io->writer_index) { all_done = 0; break; } } thread_mutex_unlock(&io->io_mutex); if (all_done) break; /* wait for something to complete */ thread_yield(); } } static struct snapraid_task* io_task_read_thread(struct snapraid_io* io, unsigned base, unsigned count, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { unsigned waiting_cycle; /* count the waiting cycle */ waiting_cycle = 0; /* clear the waiting indexes */ *waiting_mac = 0; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); while (1) { unsigned* let; unsigned busy_index; /* get the index the IO is using */ /* we must ensure that this index has not a read in progress */ /* to avoid a concurrent access */ busy_index = io->reader_index; /* search for a worker that has already finished */ let = &io->reader_list[0]; while (1) { unsigned i = *let; /* if we are at the end */ if (i == io->reader_max) break; /* if it's in range */ if (base <= i && i < base + count) { struct snapraid_worker* worker; /* if it's the first cycle */ if (waiting_cycle == 0) { /* store the waiting indexes */ waiting_map[(*waiting_mac)++] = i - base; } worker = &io->reader_map[i]; /* if the worker has finished this index */ if (busy_index != worker->index) { struct snapraid_task* task; task = &worker->task_map[io->reader_index]; /* mark the worker as processed */ /* setting the previous one to point at the next one */ *let = io->reader_list[i + 1]; thread_mutex_unlock(&io->io_mutex); /* return the position */ *pos = i - base; /* on the first cycle, no one is waiting */ if (waiting_cycle == 0) *waiting_mac = 0; return task; } } /* next position to check */ let = &io->reader_list[i + 1]; } /* if no worker is ready, wait for an event */ thread_cond_wait(&io->read_done, &io->io_mutex); /* count the cycles */ ++waiting_cycle; } } static struct snapraid_task* io_data_read_thread(struct snapraid_io* io, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { return io_task_read_thread(io, io->data_base, io->data_count, pos, waiting_map, waiting_mac); } static struct snapraid_task* io_parity_read_thread(struct snapraid_io* io, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { return io_task_read_thread(io, io->parity_base, io->parity_count, pos, waiting_map, waiting_mac); } static void io_parity_write_thread(struct snapraid_io* io, unsigned* pos, unsigned* waiting_map, unsigned* waiting_mac) { unsigned waiting_cycle; /* count the waiting cycle */ waiting_cycle = 0; /* clear the waiting indexes */ *waiting_mac = 0; /* the synchronization is protected by the io mutex */ thread_mutex_lock(&io->io_mutex); while (1) { unsigned* let; unsigned busy_index; /* get the next index the IO is going to use */ /* we must ensure that this index has not a write in progress */ /* to avoid a concurrent access */ /* note that we are already sure that a write is not in progress */ /* at the index the IO is using at now */ busy_index = (io->writer_index + 1) % io->io_max; /* search for a worker that has already finished */ let = &io->writer_list[0]; while (1) { unsigned i = *let; struct snapraid_worker* worker; /* if we are at the end */ if (i == io->writer_max) break; /* if it's the first cycle */ if (waiting_cycle == 0) { /* store the waiting indexes */ waiting_map[(*waiting_mac)++] = i; } worker = &io->writer_map[i]; /* the two indexes cannot be equal */ assert(io->writer_index != worker->index); /* if the worker has finished this index */ if (busy_index != worker->index) { /* mark the worker as processed */ /* setting the previous one to point at the next one */ *let = io->writer_list[i + 1]; thread_mutex_unlock(&io->io_mutex); /* return the position */ *pos = i; /* on the first cycle, no one is waiting */ if (waiting_cycle == 0) *waiting_mac = 0; return; } /* next position to check */ let = &io->writer_list[i + 1]; } /* if no worker is ready, wait for an event */ thread_cond_wait(&io->write_done, &io->io_mutex); /* count the cycles */ ++waiting_cycle; } } static void io_reader_worker(struct snapraid_worker* worker, struct snapraid_task* task) { /* if we reached the end */ if (task->position >= worker->io->block_max) { /* complete a dummy task */ task->state = TASK_STATE_EMPTY; } else { worker->func(worker, task); } } static void* io_reader_thread(void* arg) { struct snapraid_worker* worker = arg; /* force completion of the first task */ io_reader_worker(worker, &worker->task_map[0]); while (1) { struct snapraid_task* task; /* get the new task */ task = io_reader_step(worker); /* if no task, it means to exit */ if (!task) break; /* nothing more to do */ if (task->state == TASK_STATE_EMPTY) continue; if (task->state != TASK_STATE_READY) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Unexpected state %d in reader for task at position %u in worker %u\n", task->state, task->position, worker->index); os_abort(); /* LCOV_EXCL_STOP */ } /* work on the assigned task */ io_reader_worker(worker, task); } return 0; } static void* io_writer_thread(void* arg) { struct snapraid_worker* worker = arg; int latest_state = TASK_STATE_DONE; while (1) { struct snapraid_task* task; /* get the new task */ task = io_writer_step(worker, latest_state); /* if no task, it means to exit */ if (!task) break; /* nothing more to do */ if (task->state == TASK_STATE_EMPTY) { latest_state = TASK_STATE_DONE; continue; } if (task->state != TASK_STATE_READY) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Unexpected state %d in writer for task at position %u in worker %u\n", task->state, task->position, worker->index); os_abort(); /* LCOV_EXCL_STOP */ } /* work on the assigned task */ worker->func(worker, task); /* save the resulting state */ latest_state = task->state; } return 0; } static void io_start_thread(struct snapraid_io* io, block_off_t blockstart, block_off_t blockmax, bit_vect_t* block_enabled) { unsigned i; io->block_start = blockstart; io->block_max = blockmax; io->block_enabled = block_enabled; io->block_next = blockstart; io->done = 0; io->reader_index = io->io_max - 1; /* the first io_read_next() is going to set it to 0 */ io->writer_index = 0; /* clear writer errors */ for (i = 0; i < IO_WRITER_ERROR_MAX; ++i) io->writer_error[i] = 0; /* setup the initial read pending tasks, except the latest one, */ /* the latest will be initialized at the fist io_read_next() call */ for (i = 0; i < io->io_max - 1; ++i) { block_off_t blockcur = io_position_next(io); io_reader_sched(io, i, blockcur); } /* setup the lists of workers to process */ io->reader_list[0] = io->reader_max; for (i = 0; i <= io->writer_max; ++i) io->writer_list[i] = i; /* start the reader threads */ for (i = 0; i < io->reader_max; ++i) { struct snapraid_worker* worker = &io->reader_map[i]; worker->index = 0; thread_create(&worker->thread, io_reader_thread, worker); } /* start the writer threads */ for (i = 0; i < io->writer_max; ++i) { struct snapraid_worker* worker = &io->writer_map[i]; worker->index = io->io_max - 1; thread_create(&worker->thread, io_writer_thread, worker); } } static void io_stop_thread(struct snapraid_io* io) { unsigned i; thread_mutex_lock(&io->io_mutex); /* mark that we are stopping */ io->done = 1; /* signal all the threads to recognize the new state */ thread_cond_broadcast(&io->read_sched); thread_cond_broadcast(&io->write_sched); thread_mutex_unlock(&io->io_mutex); /* wait for all readers to terminate */ for (i = 0; i < io->reader_max; ++i) { struct snapraid_worker* worker = &io->reader_map[i]; void* retval; /* wait for thread termination */ thread_join(worker->thread, &retval); } /* wait for all writers to terminate */ for (i = 0; i < io->writer_max; ++i) { struct snapraid_worker* worker = &io->writer_map[i]; void* retval; /* wait for thread termination */ thread_join(worker->thread, &retval); } } #endif /*****************************************************************************/ /* global */ void io_init(struct snapraid_io* io, struct snapraid_state* state, unsigned io_cache, unsigned buffer_max, void (*data_reader)(struct snapraid_worker*, struct snapraid_task*), struct snapraid_handle* handle_map, unsigned handle_max, void (*parity_reader)(struct snapraid_worker*, struct snapraid_task*), void (*parity_writer)(struct snapraid_worker*, struct snapraid_task*), struct snapraid_parity_handle* parity_handle_map, unsigned parity_handle_max) { unsigned i; size_t allocated_size; size_t block_size = state->block_size; io->state = state; assert(buffer_max >= handle_max + parity_handle_max); /* initialize bandwidth limiting */ bw_init(&io->bw, state->opt.bwlimit); /* set IO context in handles */ for (i = 0; i < handle_max; ++i) handle_map[i].bw = &io->bw; for (i = 0; i < parity_handle_max; ++i) parity_handle_map[i].bw = &io->bw; #if HAVE_THREAD if (io_cache == 0) { /* default is 16 MiB of cache */ /* this seems to be a good tradeoff between speed and memory usage */ io->io_max = 16 * 1024 * 1024 / state->block_size; if (io->io_max < IO_MIN) io->io_max = IO_MIN; if (io->io_max > IO_MAX) io->io_max = IO_MAX; } else { io->io_max = io_cache; } #else (void)io_cache; /* without pthread force the mono thread mode */ io->io_max = 1; #endif assert(io->io_max == 1 || (io->io_max >= IO_MIN && io->io_max <= IO_MAX)); io->buffer_max = buffer_max; allocated_size = 0; for (i = 0; i < io->io_max; ++i) { if (state->file_mode != ADVISE_DIRECT) io->buffer_map[i] = malloc_nofail_vector_align(handle_max, buffer_max, block_size, &io->buffer_alloc_map[i]); else io->buffer_map[i] = malloc_nofail_vector_direct(handle_max, buffer_max, block_size, &io->buffer_alloc_map[i]); if (!state->opt.skip_self) mtest_vector(io->buffer_max, state->block_size, io->buffer_map[i]); allocated_size += block_size * buffer_max; } msg_progress("Using %u MiB of memory for %u cached blocks.\n", (unsigned)(allocated_size / MEBI), io->io_max); if (parity_writer) { io->reader_max = handle_max; io->writer_max = parity_handle_max; } else { io->reader_max = handle_max + parity_handle_max; io->writer_max = 0; } io->reader_map = malloc_nofail(sizeof(struct snapraid_worker) * io->reader_max); io->reader_list = malloc_nofail(sizeof(unsigned) * (io->reader_max + 1)); io->writer_map = malloc_nofail(sizeof(struct snapraid_worker) * io->writer_max); io->writer_list = malloc_nofail(sizeof(unsigned) * (io->writer_max + 1)); io->data_base = 0; io->data_count = handle_max; io->parity_base = handle_max; io->parity_count = parity_handle_max; for (i = 0; i < io->reader_max; ++i) { struct snapraid_worker* worker = &io->reader_map[i]; worker->io = io; if (i < handle_max) { /* it's a data read */ worker->handle = &handle_map[i]; worker->parity_handle = 0; worker->func = data_reader; /* data read is put in lower buffer index */ worker->buffer_skew = 0; } else { /* it's a parity read */ worker->handle = 0; worker->parity_handle = &parity_handle_map[i - handle_max]; worker->func = parity_reader; /* parity read is put after data and computed parity */ worker->buffer_skew = parity_handle_max; } } for (i = 0; i < io->writer_max; ++i) { struct snapraid_worker* worker = &io->writer_map[i]; worker->io = io; /* it's a parity write */ worker->handle = 0; worker->parity_handle = &parity_handle_map[i]; worker->func = parity_writer; /* parity to write is put after data */ worker->buffer_skew = handle_max; } #if HAVE_THREAD if (io->io_max > 1) { io_read_next = io_read_next_thread; io_write_preset = io_write_preset_thread; io_write_next = io_write_next_thread; io_refresh = io_refresh_thread; io_flush = io_flush_thread; io_data_read = io_data_read_thread; io_parity_read = io_parity_read_thread; io_parity_write = io_parity_write_thread; io_start = io_start_thread; io_stop = io_stop_thread; thread_mutex_init(&io->io_mutex); thread_cond_init(&io->read_done); thread_cond_init(&io->read_sched); thread_cond_init(&io->write_done); thread_cond_init(&io->write_sched); } else #endif { io_read_next = io_read_next_mono; io_write_preset = io_write_preset_mono; io_write_next = io_write_next_mono; io_refresh = io_refresh_mono; io_flush = io_flush_mono; io_data_read = io_data_read_mono; io_parity_read = io_parity_read_mono; io_parity_write = io_parity_write_mono; io_start = io_start_mono; io_stop = io_stop_mono; } } void io_done(struct snapraid_io* io) { unsigned i; for (i = 0; i < io->io_max; ++i) { free(io->buffer_map[i]); free(io->buffer_alloc_map[i]); } free(io->reader_map); free(io->reader_list); free(io->writer_map); free(io->writer_list); #if HAVE_THREAD if (io->io_max > 1) { thread_mutex_destroy(&io->io_mutex); thread_cond_destroy(&io->read_done); thread_cond_destroy(&io->read_sched); thread_cond_destroy(&io->write_done); thread_cond_destroy(&io->write_sched); } #endif } snapraid-14.9/cmdline/io.h000066400000000000000000000340411522717156100154540ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2016 Andrea Mazzoleni #ifndef __IO_H #define __IO_H #include "state.h" #include "support.h" #include "handle.h" #include "parity.h" /** * Number of read-ahead buffers. * * More buffers always result in better performance. * * This is the scrub performance on my machine with different buffers: * * 1 - 380 MB/s, CPU 26%, speed 100% [SnapRAID 9.2] * 2 - 426 MB/s, CPU 46%, speed 112% * 4 - 452 MB/s, CPU 54%, speed 118% * 8 - 487 MB/s, CPU 60%, speed 128% * 16 - 505 MB/s, CPU 63%, speed 132% * 32 - 520 MB/s, CPU 64%, speed 136% [SnapRAID <= 12.0] * 64 - 524 MB/s, CPU 65%, speed 137% [SnapRAID > 12.0] * 128 - 525 MB/s, CPU 66%, speed 138% */ #define IO_MIN 3 /* required by writers, readers can work also with 2 */ #define IO_MAX 128 /** * State of the task. */ #define TASK_STATE_IOERROR_CONTINUE -4 /**< IO error. Continuation requested. */ #define TASK_STATE_ERROR_CONTINUE -3 /**< Generic error. Continuation requested. */ #define TASK_STATE_IOERROR -2 /**< IO error. Failure requested. */ #define TASK_STATE_ERROR -1 /**< Generic error. Failure requested. */ #define TASK_STATE_EMPTY 0 /**< Nothing to do. */ #define TASK_STATE_READY 1 /**< Ready to start. */ #define TASK_STATE_DONE 2 /**< Task completed. */ /** * Task of work. * * This represents the minimal element of work that worker threads are * going to be asked to do. * * It consists in reading a block of data from a disk. * * Note that the disk to use is defined implicitly in the worker thread. */ struct snapraid_task { int state; /**< State of the task. One of the TASK_STATE_*. */ char path[PATH_MAX]; /**< Path of the file. */ struct snapraid_disk* disk; /**< Disk of the file. */ unsigned char* buffer; /**< Where to read the data. */ block_off_t position; /**< Parity position to read. */ /** * Result of the task. */ struct snapraid_block* block; struct snapraid_file* file; block_off_t file_pos; int read_size; /**< Size of the data read. */ int is_timestamp_different; /**< Report if file has a changed timestamp. */ }; /** * Worker for tasks. * * This represents a worker thread designated to read/write data for a specific disk. */ struct snapraid_worker { #if HAVE_THREAD thread_id_t thread; /**< Thread context for the worker. */ #endif struct snapraid_io* io; /**< Parent pointer. */ void (*func)(struct snapraid_worker*, struct snapraid_task*); /** * Handle to data or parity. * * Only one of the two is valid, the other is 0. */ struct snapraid_handle* handle; /**< Handle at the file on the disk. */ struct snapraid_parity_handle* parity_handle; /**< Handle at the parity on the disk. */ /** * Vector of tasks. * * It's a ring of tasks reused cycle after cycle. */ struct snapraid_task task_map[IO_MAX]; /** * The task in progress by the worker thread. * * It's an index inside the ::task_map vector. */ unsigned index; /** * Which buffer base index should be used for destination. */ unsigned buffer_skew; }; /** * Number of error kind for writers. */ #define IO_WRITER_ERROR_BASE TASK_STATE_IOERROR_CONTINUE #define IO_WRITER_ERROR_MAX (-IO_WRITER_ERROR_BASE) /** * IO system that handles all parallel reads and writes. * * This represents the pool of worker threads dedicated to read and write * data from the disks. * * Typical scenario is: * * # Initialize the process * io_start(&io, blockstart, blockmax, block_enabled); * * for_each_block { * # Now read starts * # Get the current block to process and the vector of data buffers to use * # buffer[0..diskmax-1] are data disks * # buffer[diskmax..diskmax+levelmax-1] are parity disks * # * # INTERNAL: Broadcast a read_sched signal, to signal worker threads * # that the previous "blockcur" position is now available and the * # buffers can be used to read a new look-ahead position. * unsigned blockcur = io_read_next(&io, &buffer); * * for_each_disk { * # Read a disk into buffer[diskcur] * # diskcur is the disk processed, and it may come in random order * # depending on which disk is faster * # * # INTERNAL: It may wait for the read_done condition in case * # the read is not yet done. * # The reader thread will set the condition when ready. * struct snapraid_task* task = io_data_read(&io, &diskcur, waiting_map, &waiting_mac); * * # compute the hash * ... * } * * # compute the parity * ... * * # Now write starts * # At this point the parity data should ALREADY be in the buffer[diskmax+levcur] * # Note that the only reason that the process is separated for each parity * # is to allow to identify which is the latest and slowest disk * io_write_preset(&io, blockcur, !parity_going_to_be_updated); * * for_each_parity { * unsigned levcur; * * # Write a parity from buffer[diskmax+levcur] * # levcur is the disk processed, and it may come in random order * # depending on which disk is faster * # * # INTERNAL: It may wait for the write_done condition in case * # there isn't a free position in the parity write queue. * # The writer thread will set the condition when ready. * io_parity_write(&io, &levcur, waiting_map, &waiting_mac); * } * * # End of the write * # INTERNAL: Broadcast a write_sched signal, to signal worker threads * # that a new position is ready to be written * io_write_next(&io, blockcur, !parity_going_to_be_updated, writer_error); * } * * # Stop all thread after writing all queued data * io_stop(&io); */ struct snapraid_io { struct snapraid_state* state; /** * Number of read-ahead and write-cached buffers to use. * * Between IO_MIN and IO_MAX for thread use. * * If equal to 1, it means to work without any thread. */ unsigned io_max; #if HAVE_THREAD /** * Mutex used to protect the synchronization * between the io and the workers. */ thread_mutex_t io_mutex; /** * Condition for a new read is completed. * * The workers signal this condition when a new read is completed. * The IO waits on this condition when it's waiting for * a new read to be completed. */ thread_cond_t read_done; /** * Condition for a new read scheduled. * * The workers wait on this condition when they are waiting for a new * read to process. * The IO signals this condition when new reads are scheduled. */ thread_cond_t read_sched; /** * Condition for a new write is completed. * * The workers signal this condition when a new write is completed. * The IO waits on this condition when it's waiting for * a new write to be completed. */ thread_cond_t write_done; /** * Condition for a new write scheduled. * * The workers wait on this condition when they are waiting for a new * write to process. * The IO signals this condition when new writes are scheduled. */ thread_cond_t write_sched; #endif /** * Base position for workers. * * It's the index in the ::worker_map[]. */ unsigned data_base; unsigned data_count; unsigned parity_base; unsigned parity_count; /** * Callbacks for workers. */ void (*data_reader)(struct snapraid_worker*, struct snapraid_task*); void (*parity_reader)(struct snapraid_worker*, struct snapraid_task*); void (*parity_writer)(struct snapraid_worker*, struct snapraid_task*); /** * Blocks mapping. * * This info is used to obtain the sequence of block * positions to process. */ block_off_t block_start; block_off_t block_max; block_off_t block_next; bit_vect_t* block_enabled; /** * Buffers for data. * * A pool of buffers used to store the data read. */ unsigned buffer_max; /**< Number of buffers. */ void* buffer_alloc_map[IO_MAX]; /**< Allocation map for buffers. */ void** buffer_map[IO_MAX]; /**< Buffers for data. */ /** * Workers. * * A vector of readers, each one representing a different thread. */ unsigned reader_max; /**< Number of workers. */ struct snapraid_worker* reader_map; /**< Vector of workers. */ unsigned writer_max; /**< Number of workers. */ struct snapraid_worker* writer_map; /**< Vector of workers. */ /** * List of not yet processed workers. * * The list has ::reader_max + 1 elements. Each element contains * the number of the reader to process. * * At initialization the list is filled with [0..reader_max]. * To get the next element to process we use i = list[i + 1]. * The end is when i == reader_max. */ unsigned* reader_list; unsigned* writer_list; /** * Exit condition for all threads. */ int done; /** * The worker task index currently used by the operation in * progress. It's the position in all the reader task_map[]. * * Until the operation is in progress, the data buffer cannot be * discarded, because it's in use. * * It's a rolling counter, when reaching ::io_max * it goes again to 0. * * When the caller finish with this index, it calls read_sched(), * and this ::reader_index is incremented, meaning that the data of * the just finished index is not needed anymore and the buffer is * available to be used for the following read-ahead. * * When this happens a read_sched signal is broadcasted, and all the * workers can proceed using this now available index to have one more * read-ahead buffer to load. * * In monothread mode it isn't the task index, * but the worker index. */ unsigned reader_index; /** * The worker task index currently used by the operation in * progress. It's the position in all the writer task_map[]. * * Until the operation is in progress, the data buffer cannot be * written, because the data is not yet in the buffer. * * It's a rolling counter, when reaching ::io_max * it goes again to 0. * * When the caller finish writing the data in the buffer for this * index, it calls write_sched() and ::writer_index is incremented, * meaning that the just finished index is scheduled to be written * to disk. * * When this happens a write_sched signal is broadcasted, and all the * workers can proceed writing the data in this index. * * In monothread mode it isn't the task index, * but the worker index. */ unsigned writer_index; /** * Counts the error happening in the writers. */ int writer_error[IO_WRITER_ERROR_MAX]; /** * Bandwidth */ struct snapraid_bw bw; }; /** * Initialize the InputOutput workers. * * \param io_cache The number of IO buffers for read-ahead and write-behind. 0 for default. * \param buffer_max The number of data/parity buffers to allocate. */ void io_init(struct snapraid_io* io, struct snapraid_state* state, unsigned io_cache, unsigned buffer_max, void (*data_reader)(struct snapraid_worker*, struct snapraid_task*), struct snapraid_handle* handle_map, unsigned handle_max, void (*parity_reader)(struct snapraid_worker*, struct snapraid_task*), void (*parity_writer)(struct snapraid_worker*, struct snapraid_task*), struct snapraid_parity_handle* parity_handle_map, unsigned parity_handle_max); /** * Deinitialize the InputOutput workers. */ void io_done(struct snapraid_io* io); /** * Start all the worker threads. */ extern void (*io_start)(struct snapraid_io* io, block_off_t blockstart, block_off_t blockmax, bit_vect_t* block_enabled); /** * Stop all the worker threads. */ extern void (*io_stop)(struct snapraid_io* io); /** * Next read position. * * This call starts the reading process. * It must be called before io_data_read() and io_parity_read(). * * \param io InputOutput context. * \param buffer The data buffers to use for this position. * \return The parity position. */ extern block_off_t (*io_read_next)(struct snapraid_io* io, void*** buffer); /** * Read a data block. * * It must be called exactly ::handle_max times. * * \param io InputOutput context. * \param diskcur The position of the data block in the ::handle_map vector. * \return The completed task. */ extern struct snapraid_task* (*io_data_read)(struct snapraid_io* io, unsigned* diskcur, unsigned* waiting_map, unsigned* waiting_mac); /** * Read a parity block. * * It must be called exactly ::parity_handle_max times. * * \param io InputOutput context. * \param levcur The position of the parity block in the ::parity_handle_map vector. * \return The completed task. */ extern struct snapraid_task* (*io_parity_read)(struct snapraid_io* io, unsigned* levcur, unsigned* waiting_map, unsigned* waiting_mac); /** * Write of a parity block. * * It must be called exactly ::parity_handle_max times. * * \param io InputOutput context. * \param levcur The position of the parity block in the ::parity_handle_map vector. */ extern void (*io_parity_write)(struct snapraid_io* io, unsigned* levcur, unsigned* waiting_map, unsigned* waiting_mac); /** * Preset the write position. * * This call starts the write process. * It must be called before io_parity_write(). * * \param io InputOutput context. * \param blockcur The parity position to write. * \param skip Skip the writes, in case parity doesn't need to be updated. */ extern void (*io_write_preset)(struct snapraid_io* io, block_off_t blockcur, int skip); /** * Next write position. * * This call ends the write process. * It must be called after io_parity_write(). * * \param io InputOutput context. * \param blockcur The parity position to write. * \param skip Skip the writes, in case parity doesn't need to be updated. * \param writer_error Return the number of errors. Vector of IO_WRITER_ERROR_MAX elements. */ extern void (*io_write_next)(struct snapraid_io* io, block_off_t blockcur, int skip, int* writer_error); /** * Refresh the number of cached blocks for all data and parity disks. */ extern void (*io_refresh)(struct snapraid_io* io); /** * Flush all the writes. */ extern void (*io_flush)(struct snapraid_io* io); #endif snapraid-14.9/cmdline/list.c000066400000000000000000000054471522717156100160230ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #include "portable.h" #include "util.h" #include "elem.h" #include "state.h" #include "parity.h" #include "handle.h" /****************************************************************************/ /* list */ void state_list(struct snapraid_state* state) { tommy_node* i; unsigned file_count; data_off_t file_size; unsigned link_count; file_count = 0; file_size = 0; link_count = 0; msg_progress("Listing...\n"); /* for each disk */ for (i = state->disklist; i != 0; i = i->next) { tommy_node* j; struct snapraid_disk* disk = i->data; /* sort by name */ tommy_list_sort(&disk->filelist, file_path_compare); /* for each file */ for (j = disk->filelist; j != 0; j = j->next) { struct snapraid_file* file = j->data; #if HAVE_LOCALTIME_R struct tm tm_res; #endif struct tm* tm; time_t t; ++file_count; file_size += file->size; if (state->opt.gui_verbose) log_tag("file:%s:%s:%" PRIu64 ":%" PRIi64 ":%u:%" PRIu64 "\n", disk->name, esc_tag(file->sub), file->size, file->mtime_sec, file->mtime_nsec, file->inode); t = file->mtime_sec; #if HAVE_LOCALTIME_R tm = localtime_r(&t, &tm_res); #else tm = localtime(&t); #endif printf("%12" PRIu64 " ", file->size); if (tm) { printf("%04u/%02u/%02u %02u:%02u", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min); if (msg_level >= MSG_VERBOSE) printf(":%02u.%09u", tm->tm_sec, file->mtime_nsec); printf(" "); } printf("%s\n", fmt_term(disk, file->sub)); } /* sort by name */ tommy_list_sort(&disk->linklist, link_alpha_compare); /* for each link */ for (j = disk->linklist; j != 0; j = j->next) { struct snapraid_link* slink = j->data; const char* type; switch (slink->flag & FILE_IS_LINK_MASK) { case FILE_IS_HARDLINK : type = "hardlink"; break; case FILE_IS_SYMLINK : type = "symlink"; break; case FILE_IS_SYMDIR : type = "symdir"; break; case FILE_IS_JUNCTION : type = "junction"; break; /* LCOV_EXCL_START */ default : type = "unknown"; break; /* LCOV_EXCL_STOP */ } ++link_count; if (state->opt.gui_verbose) log_tag("link_%s:%s:%s:%s\n", type, disk->name, esc_tag(slink->sub), esc_tag(slink->linkto)); printf("%12s ", type); printf(" "); if (msg_level >= MSG_VERBOSE) printf(" "); printf("%s -> %s\n", fmt_term(disk, slink->sub), fmt_term(disk, slink->linkto)); } } msg_status("\n"); msg_status("%8u files, for %" PRIu64 " GB\n", file_count, file_size / GIGA); msg_status("%8u links\n", link_count); log_tag("summary:file_count:%u\n", file_count); log_tag("summary:file_size:%" PRIu64 "\n", file_size); log_tag("summary:link_count:%u\n", link_count); log_tag("summary:exit:ok\n"); log_flush(); } snapraid-14.9/cmdline/locate.c000066400000000000000000000175341522717156100163170ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Andrea Mazzoleni #include "portable.h" #include "elem.h" #include "parity.h" #include "state.h" #include "stream.h" #include "locate.h" struct snapraid_parity_entry { uint32_t block_size; block_off_t low; /**< Lower position in the parity */ block_off_t high; /**< Higher position in the parity */ block_off_t fragments; /**< Number of fragments in the parity */ struct snapraid_file* file; struct snapraid_disk* disk; tommy_node node; }; struct snapraid_locate_info { block_off_t block_max; /**< Number of blocks in the parity */ data_off_t parity_size; /**< Size in bytes of the parity */ block_off_t tail_block; /**< Number of blocks of the tail of the parity */ block_off_t low_to_free_tail_block; /**< First block that has to be freed */ }; static int parity_entry_compare(const void* void_a, const void* void_b) { const struct snapraid_parity_entry* entry_a = void_a; const struct snapraid_parity_entry* entry_b = void_b; if (entry_a->high < entry_b->high) return -1; if (entry_a->high > entry_b->high) return 1; if (entry_a->low < entry_b->low) return -1; if (entry_a->low > entry_b->low) return 1; return strcmp(entry_a->file->sub, entry_b->file->sub); } static void dump_entry(void* void_entry) { struct snapraid_parity_entry* entry = void_entry; printf("%12" PRIu64 " ", entry->low * (uint64_t)entry->block_size); printf("%12" PRIu64 " ", (entry->high - entry->low + 1) * (uint64_t)entry->block_size); printf("%8u ", entry->fragments); printf("%s\n", fmt_term(entry->disk, entry->file->sub)); } static void add_size_to_sum(void* arg, void* void_entry) { struct snapraid_parity_entry* entry = void_entry; data_off_t* size_sum = arg; *size_sum += entry->file->size; } static void collect_parity_block_file(uint32_t block_size, struct snapraid_disk* disk, struct snapraid_file* file, tommy_list* file_list, block_off_t low_to_free_tail_block) { block_off_t parity_low = 0; /* lower block */ block_off_t parity_high = 0; /* higher block */ block_off_t parity_fragments = 0; /* number of fragments */ for (block_off_t i = 0; i < file->blockmax; ++i) { block_off_t parity_pos = fs_file2par_find(disk, file, i); /* check if a valid position is found */ if (parity_pos == POS_NULL) { /* block not yet allocated */ continue; } if (parity_fragments == 0) { parity_low = parity_pos; parity_high = parity_pos; parity_fragments = 1; } else { if (parity_pos != parity_high + 1) ++parity_fragments; parity_high = parity_pos; } } if (parity_fragments == 0) return; /* not allocated */ if (low_to_free_tail_block > 0 && parity_high < low_to_free_tail_block) return; /* entry not in the range to free */ /* found a relevant block so add the corresponding file */ struct snapraid_parity_entry* entry = malloc_nofail(sizeof(struct snapraid_parity_entry)); entry->block_size = block_size; entry->file = file; entry->disk = disk; entry->low = parity_low; entry->high = parity_high; entry->fragments = parity_fragments; tommy_list_insert_tail(file_list, &entry->node, entry); } void state_locate_info(struct snapraid_state* state, uint64_t parity_tail, struct snapraid_locate_info* info) { uint32_t block_size = state->block_size; info->block_max = parity_allocated_size(state); info->parity_size = info->block_max * (uint64_t)block_size; info->tail_block = (parity_tail + block_size - 1) / block_size; if (info->tail_block > info->block_max) info->low_to_free_tail_block = 0; else info->low_to_free_tail_block = info->block_max - info->tail_block; } void state_locate(struct snapraid_state* state, uint64_t parity_tail) { char buf[64]; uint32_t block_size = state->block_size; block_off_t low_to_free_tail_block; printf("SnapRAID locate report:\n"); printf("\n"); if (parity_tail == 0) { printf("Locate all files\n\n"); low_to_free_tail_block = 0; } else { printf("Locate files within the tail of %sB of the parity\n\n", fmt_size(parity_tail, buf, sizeof(buf))); struct snapraid_locate_info info; state_locate_info(state, parity_tail, &info); printf("Current parity size is %sB\n", fmt_size(info.parity_size, buf, sizeof(buf))); if (info.tail_block > info.block_max) { printf("Specified tail greater than the parity size! Operate on the full parity\n"); } low_to_free_tail_block = info.low_to_free_tail_block; } msg_progress("Collecting files with offset greater or equal to %" PRIu64 "\n", low_to_free_tail_block * (uint64_t)block_size); tommy_list files; tommy_list_init(&files); for (tommy_node* i = tommy_list_head(&state->disklist); i != 0; i = i->next) { struct snapraid_disk* disk = i->data; for (tommy_node* j = tommy_list_head(&disk->filelist); j != 0; j = j->next) { struct snapraid_file* file = j->data; collect_parity_block_file(block_size, disk, file, &files, low_to_free_tail_block); } } printf("\n"); if (tommy_list_count(&files) == 0) { printf("No files located in the specified parity tail.\n"); } else { tommy_list_sort(&files, parity_entry_compare); data_off_t total_size_located = 0; tommy_list_foreach_arg(&files, add_size_to_sum, &total_size_located); printf("Located data in this range: %sB\n", fmt_size(total_size_located, buf, sizeof(buf))); printf("\n"); /* |<##################################################################72>|####80>| */ printf(" Offset Span Frags\n"); tommy_list_foreach(&files, dump_entry); } tommy_list_foreach(&files, free); } void state_locate_mark_tail_blocks_for_resync(struct snapraid_state* state, uint64_t parity_tail) { char buf[64]; uint32_t block_size = state->block_size; block_off_t low_to_free_tail_block; if (parity_tail == 0) { printf("Forcing reallocation of all files\n\n"); low_to_free_tail_block = 0; } else { msg_progress("Forcing reallocation of all files within the tail of %sB of the parity\n\n", fmt_size(parity_tail, buf, sizeof(buf))); struct snapraid_locate_info info; state_locate_info(state, parity_tail, &info); printf("Current parity size is %sB\n", fmt_size(info.parity_size, buf, sizeof(buf))); if (info.tail_block > info.block_max) { printf("Specified tail greater than the parity size! Operate on the full parity\n"); } low_to_free_tail_block = info.low_to_free_tail_block; } msg_progress("Collecting files with offset greater or equal to %" PRIu64 "\n", low_to_free_tail_block * (uint64_t)block_size); tommy_list files; tommy_list_init(&files); for (tommy_node* i = tommy_list_head(&state->disklist); i != 0; i = i->next) { struct snapraid_disk* disk = i->data; for (tommy_node* j = tommy_list_head(&disk->filelist); j != 0; j = j->next) { struct snapraid_file* file = j->data; collect_parity_block_file(block_size, disk, file, &files, low_to_free_tail_block); } } printf("\n"); if (tommy_list_count(&files) == 0) { printf("No files located in the specified parity tail.\n"); } else { /* process all the files partiall or fully overlapping the free zone */ for (tommy_node* j = tommy_list_head(&files); j != 0; j = j->next) { struct snapraid_parity_entry* entry = j->data; struct snapraid_file* file = entry->file; struct snapraid_disk* disk = entry->disk; /* reallocate the full file, not only the part of in the free zone */ /* this is required because the files blocks have to be in order in */ /* in the parity file. */ /* not reallocating the file head will prevent the reallocation of the file tail */ for (block_off_t f = 0; f < file->blockmax; ++f) { block_off_t parity_pos = fs_file2par_find(disk, file, f); if (parity_pos == POS_NULL) { /* block not yet allocated */ continue; } struct snapraid_block* block = fs_file2block_get(file, f); if (block_state_get(block) == BLOCK_STATE_BLK) { /* convert from BLK to REP */ block_state_set(block, BLOCK_STATE_REP); } } } } tommy_list_foreach(&files, free); } snapraid-14.9/cmdline/locate.h000066400000000000000000000006431522717156100163150ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Andrea Mazzoleni #ifndef __LOCATE_H #define __LOCATE_H /****************************************************************************/ /* snapraid */ #include "state.h" void state_locate(struct snapraid_state* state, uint64_t parity_tail); void state_locate_mark_tail_blocks_for_resync(struct snapraid_state* state, uint64_t parity_tail); #endif snapraid-14.9/cmdline/main.c000066400000000000000000000222751522717156100157720ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2025 Andrea Mazzoleni #include "portable.h" #include "snapraid.h" #define MODE_DEFAULT 0 #define MODE_SPINDOWN 1 #ifdef _WIN32 #define COMMAND_LINE_MAX 32767 static int needs_quote(const WCHAR* arg) { while (*arg) { if (*arg == L' ' || *arg == L'\t' || *arg == L'"') return 1; ++arg; } return 0; } #define charcat(c) \ do { \ if (pos + 1 >= size) { \ return -1; \ } \ cmd[pos++] = (c); \ } while (0) static int argcat(WCHAR* cmd, int size, int pos, const WCHAR* arg) { int has_quote; /* space separator */ if (pos != 0) charcat(L' '); has_quote = needs_quote(arg); if (!has_quote) { while (*arg) charcat(*arg++); } else { /* starting quote */ charcat(L'"'); while (*arg) { int bl = 0; while (*arg == L'\\') { ++arg; ++bl; } if (*arg == 0) { /* double backslashes before closing quote */ bl = bl * 2; while (bl--) charcat(L'\\'); } else if (*arg == '"') { /* double backslashes + escape the quote */ bl = bl * 2 + 1; while (bl--) charcat(L'\\'); charcat(L'"'); ++arg; } else { /* normal backslashes */ while (bl--) charcat(L'\\'); charcat(*arg); ++arg; } } /* ending quote */ charcat(L'"'); } return pos; } static char* argutf8(const WCHAR* arg) { size_t len = wcslen(arg); char* utf8_arg; DWORD utf8_len; DWORD res; utf8_len = WideCharToMultiByte(CP_UTF8, 0, arg, len + 1 /* include final null */, 0, 0, 0, 0); utf8_arg = malloc(utf8_len); if (!utf8_arg) return 0; res = WideCharToMultiByte(CP_UTF8, 0, arg, len + 1 /* include final null */, utf8_arg, utf8_len, 0, 0); if (res != utf8_len) return 0; return utf8_arg; } /* Global variable to store child process handle */ static HANDLE child_process = NULL; /* Console control handler - forwards Ctrl+C, Ctrl+Break to child */ static BOOL WINAPI console_handler(DWORD ctrl_type) { /* if no child, default behavior */ if (child_process == NULL) return FALSE; switch (ctrl_type) { case CTRL_C_EVENT : case CTRL_BREAK_EVENT : /* * Return TRUE to prevent parent termination. The child process * will receive these events automatically because it's attached * to the same console, so we don't need to forward them. */ return TRUE; /* signal handled, don't terminate parent */ case CTRL_CLOSE_EVENT : case CTRL_LOGOFF_EVENT : case CTRL_SHUTDOWN_EVENT : /* * Return TRUE to prevent our termination while child handles shutdown. * The child receives these events automatically (same console). * Note: Windows will forcibly kill us after a timeout regardless * of returning TRUE: ~5 seconds for CLOSE_EVENT and LOGOFF_EVENT, * ~5-20 seconds for SHUTDOWN_EVENT (configurable in registry). */ return TRUE; /* signal handled, but Windows will kill us after timeout */ default : return FALSE; } } int main(int argc, char* argv[]) { int wide_argc; WCHAR** wide_argv; int utf8_argc; char** utf8_argv; WCHAR app_buffer[COMMAND_LINE_MAX]; WCHAR cmd_buffer[COMMAND_LINE_MAX]; DWORD res; int i; int pos; int mode; int ret; (void)argc; (void)argv; res = GetModuleFileNameW(NULL, app_buffer, sizeof(app_buffer)); if (res == 0 || res >= sizeof(app_buffer)) { exit(EXIT_FAILURE); } wide_argv = CommandLineToArgvW(GetCommandLineW(), &wide_argc); if (!wide_argv) { exit(EXIT_FAILURE); } utf8_argc = 0; utf8_argv = malloc((wide_argc + 1) * sizeof(void*)); if (!utf8_argv) { exit(EXIT_FAILURE); } pos = argcat(cmd_buffer, sizeof(cmd_buffer), 0, app_buffer); if (pos < 0) { exit(EXIT_FAILURE); } utf8_argv[0] = argutf8(app_buffer); if (!utf8_argv[0]) { exit(EXIT_FAILURE); } utf8_argc = 1; mode = MODE_DEFAULT; for (i = 1; i < wide_argc; i++) { if (wcscmp(wide_argv[i], L"-s") == 0 || wcscmp(wide_argv[i], L"--spin-down-on-error") == 0) { mode = MODE_SPINDOWN; } else { pos = argcat(cmd_buffer, sizeof(cmd_buffer), pos, wide_argv[i]); if (pos < 0) { exit(EXIT_FAILURE); } utf8_argv[utf8_argc] = argutf8(wide_argv[i]); if (!utf8_argv[utf8_argc]) { exit(EXIT_FAILURE); } ++utf8_argc; } } utf8_argv[utf8_argc] = 0; cmd_buffer[pos] = 0; LocalFree(wide_argv); if (mode == MODE_DEFAULT) { ret = snapraid_main(utf8_argc, utf8_argv); } else { STARTUPINFOW si; PROCESS_INFORMATION pi; DWORD wait; /* install console control handler */ if (!SetConsoleCtrlHandler(console_handler, TRUE)) { fprintf(stderr, "Failed to set console handler\n"); exit(EXIT_FAILURE); } ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if (!CreateProcessW(app_buffer, cmd_buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { fprintf(stderr, "Failed to exec SnapRAID\n"); exit(EXIT_FAILURE); } /* store child process handle for signal handler */ child_process = pi.hProcess; wait = WaitForSingleObject(pi.hProcess, INFINITE); if (wait != WAIT_OBJECT_0) { fprintf(stderr, "WaitForSingleObject failed: %lu\n", (unsigned long)GetLastError()); TerminateProcess(pi.hProcess, 1); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return 1; } /* clear child process handle */ child_process = NULL; if (!GetExitCodeProcess(pi.hProcess, &res)) { fprintf(stderr, "GetExitCodeProcess failed: %lu\n", (unsigned long)GetLastError()); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return 1; } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); ret = res; if (ret != 0) { char* spindown_argv[3]; spindown_argv[0] = utf8_argv[0]; spindown_argv[1] = "down"; spindown_argv[2] = 0; /* sync all disks */ printf("Flush...\n"); if (sync() != 0) printf("WARNING! Failed to flush disks!\n"); snapraid_main(2, spindown_argv); } } for (i = 0; i < utf8_argc; ++i) free(utf8_argv[i]); free(utf8_argv); return ret; } #else char full_argv0[PATH_MAX]; const char* get_argv0(const char* argv0) { ssize_t len = readlink("/proc/self/exe", full_argv0, sizeof(full_argv0) - 1); if (len != -1) { full_argv0[len] = '\0'; return full_argv0; } else { #ifdef __APPLE__ uint32_t size = sizeof(full_argv0); if (_NSGetExecutablePath(full_argv0, &size) == 0) return full_argv0; #endif } return argv0; } /* global variable to store child PID for signal handler */ static volatile pid_t child_pid = 0; /* signal handler that forwards signals to child */ /* LCOV_EXCL_START */ static void forward_signal(int sig) { if (child_pid > 0) { kill(child_pid, sig); } } /* LCOV_EXCL_STOP */ int main(int argc, char* argv[]) { int mode; int i, j; int ret; mode = MODE_DEFAULT; j = 1; for (i = 1; i < argc; ++i) { if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--spin-down-on-error") == 0) { mode = MODE_SPINDOWN; } else { argv[j] = argv[i]; ++j; } } argc = j; argv[argc] = 0; if (mode == MODE_DEFAULT) { ret = snapraid_main(argc, argv); } else { struct sigaction sa; /* set up signal handler to ignore signals */ sa.sa_handler = forward_signal; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; /* restart interrupted system calls */ /* install forwarding handler for signals */ sigaction(SIGINT, &sa, NULL); /* Ctrl+C */ sigaction(SIGQUIT, &sa, NULL); /* Ctrl+\ */ sigaction(SIGTERM, &sa, NULL); /* termination */ sigaction(SIGHUP, &sa, NULL); /* hangup */ sigaction(SIGUSR1, &sa, NULL); /* user-defined 1 */ sigaction(SIGUSR2, &sa, NULL); /* user-defined 2 */ pid_t pid = fork(); if (pid == -1) { /* LCOV_EXCL_START */ perror("Failed to fork SnapRAID"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (pid == 0) { /* child process */ /* restore default signal handlers */ signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTERM, SIG_DFL); signal(SIGHUP, SIG_DFL); signal(SIGUSR1, SIG_DFL); signal(SIGUSR2, SIG_DFL); execvp(get_argv0(argv[0]), argv); /* here it's an error */ /* LCOV_EXCL_START */ perror("Failed to exec SnapRAID"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } else { /* parent process */ int status; /* store child PID so signal handler can forward signals */ child_pid = pid; do { ret = waitpid(pid, &status, 0); } while (ret == -1 && errno == EINTR); /* retry if interrupted by signal */ if (ret == -1) { /* LCOV_EXCL_START */ perror("Failed to wait for SnapRAID"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* clear child PID */ child_pid = 0; /* restore default signal handlers */ signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTERM, SIG_DFL); signal(SIGHUP, SIG_DFL); signal(SIGUSR1, SIG_DFL); signal(SIGUSR2, SIG_DFL); if (WIFEXITED(status)) { ret = WEXITSTATUS(status); } else if (WIFSIGNALED(status)) { /* terminated by signal */ ret = 128 + WTERMSIG(status); } else { ret = -1; } if (ret != 0) { char* spindown_argv[3]; spindown_argv[0] = argv[0]; spindown_argv[1] = "down"; spindown_argv[2] = 0; /* ignore sigpipe to allow spindown even if the terminal is closed */ signal(SIGPIPE, SIG_IGN); /* in *nix DO NOT CALL sync() because we use syncfs() in all single disks befode the down command */ snapraid_main(2, spindown_argv); } } } return ret; } #endif snapraid-14.9/cmdline/metro.c000066400000000000000000000074241522717156100161730ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2019 Andrea Mazzoleni /* * Derivative work from MetroHash128::Hash * * This version extends the original MetroHash128::Hash to accept a full 128-bit seed. * * Note: The original algorithm's behavior can be perfectly replicated by * setting the low and high part of the seed to the same 64-bit value. * * https://github.com/jandrewrogers/MetroHash/blob/master/src/metrohash128.cpp * * Copyright 2015-2018 J. Andrew Rogers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static const uint64_t k0 = 0xC83A91E1; static const uint64_t k1 = 0x8648DBDB; static const uint64_t k2 = 0x7BDEC03B; static const uint64_t k3 = 0x2F5870A5; void MetroHash128(const void* data, size_t size, const uint8_t* seed, uint8_t* digest) { const uint8_t* ptr = data; uint64_t v[4]; /* * EXTENSION: Initialize primary state with 128-bit seed (seedL and seedH) * Ensures both halves influence the hash even for short messages (< 32 bytes) * * Original code was: * v[0] = (static_cast(seed) - k0) * k3; * v[1] = (static_cast(seed) + k1) * k2; */ v[0] = (util_read64(seed) - k0) * k3; v[1] = (util_read64(seed + 8) + k1) * k2; if (size >= 32) { /* * EXTENSION: Initialize secondary state using both halves of the 128-bit seed * * Original code was: * v[2] = (static_cast(seed) + k0) * k2; * v[3] = (static_cast(seed) - k1) * k3; */ v[2] = (util_read64(seed) + k0) * k2; v[3] = (util_read64(seed + 8) - k1) * k3; do { v[0] += util_read64(ptr) * k0; ptr += 8; v[0] = util_rotr64(v[0], 29) + v[2]; v[1] += util_read64(ptr) * k1; ptr += 8; v[1] = util_rotr64(v[1], 29) + v[3]; v[2] += util_read64(ptr) * k2; ptr += 8; v[2] = util_rotr64(v[2], 29) + v[0]; v[3] += util_read64(ptr) * k3; ptr += 8; v[3] = util_rotr64(v[3], 29) + v[1]; size -= 32; } while (size >= 32); v[2] ^= util_rotr64(((v[0] + v[3]) * k0) + v[1], 21) * k1; v[3] ^= util_rotr64(((v[1] + v[2]) * k1) + v[0], 21) * k0; v[0] ^= util_rotr64(((v[0] + v[2]) * k0) + v[3], 21) * k1; v[1] ^= util_rotr64(((v[1] + v[3]) * k1) + v[2], 21) * k0; } if (size >= 16) { v[0] += util_read64(ptr) * k2; ptr += 8; v[0] = util_rotr64(v[0], 33) * k3; v[1] += util_read64(ptr) * k2; ptr += 8; v[1] = util_rotr64(v[1], 33) * k3; v[0] ^= util_rotr64((v[0] * k2) + v[1], 45) * k1; v[1] ^= util_rotr64((v[1] * k3) + v[0], 45) * k0; size -= 16; } if (size >= 8) { v[0] += util_read64(ptr) * k2; ptr += 8; v[0] = util_rotr64(v[0], 33) * k3; v[0] ^= util_rotr64((v[0] * k2) + v[1], 27) * k1; size -= 8; } if (size >= 4) { v[1] += util_read32(ptr) * k2; ptr += 4; v[1] = util_rotr64(v[1], 33) * k3; v[1] ^= util_rotr64((v[1] * k3) + v[0], 46) * k0; size -= 4; } if (size >= 2) { v[0] += util_read16(ptr) * k2; ptr += 2; v[0] = util_rotr64(v[0], 33) * k3; v[0] ^= util_rotr64((v[0] * k2) + v[1], 22) * k1; size -= 2; } if (size >= 1) { v[1] += util_read8(ptr) * k2; v[1] = util_rotr64(v[1], 33) * k3; v[1] ^= util_rotr64((v[1] * k3) + v[0], 58) * k0; } v[0] += util_rotr64((v[0] * k0) + v[1], 13); v[1] += util_rotr64((v[1] * k1) + v[0], 37); v[0] += util_rotr64((v[0] * k2) + v[1], 13); v[1] += util_rotr64((v[1] * k3) + v[0], 37); util_write64(digest, v[0]); util_write64(digest + 8, v[1]); } snapraid-14.9/cmdline/metrotest.c000066400000000000000000005576231522717156100171060ustar00rootroot00000000000000/* * Metro test vector from https://github.com/jandrewrogers/MetroHash/blob/master/src/metrohash128.cpp */ { "012345678901234567890123456789012345678901234567890123456789012", 63, { 0xc7, 0x7c, 0xe2, 0xbf, 0xa4, 0xed, 0x9f, 0x9b, 0x05, 0x48, 0xb2, 0xac, 0x50, 0x74, 0xa2, 0x97 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { "012345678901234567890123456789012345678901234567890123456789012", 63, { 0x45, 0xA3, 0xCD, 0xB8, 0x38, 0x19, 0x9D, 0x7F, 0xBD, 0xD6, 0x8D, 0x86, 0x7A, 0x14, 0xEC, 0xEF }, { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, /* others */ { "", 0, { 0x06, 0x7e, 0x5d, 0x24, 0x32, 0x71, 0x6c, 0x6f, 0x56, 0x3f, 0xbe, 0xaa, 0x5d, 0xb4, 0x77, 0x00 }, { 0x35, 0xc9, 0xf7, 0x89, 0x7b, 0x34, 0x47, 0xb1, 0x35, 0xc9, 0xf7, 0x89, 0x7b, 0x34, 0x47, 0xb1 } }, { "a", 1, { 0xc7, 0x4e, 0x10, 0x0d, 0x2c, 0x8d, 0x25, 0xc6, 0x2b, 0x99, 0x3d, 0x31, 0x22, 0xa6, 0x47, 0xfc }, { 0x26, 0x15, 0x24, 0x15, 0x2d, 0x5e, 0x2a, 0xa0, 0x26, 0x15, 0x24, 0x15, 0x2d, 0x5e, 0x2a, 0xa0 } }, { "abc", 3, { 0xed, 0x8d, 0xc5, 0xf8, 0x84, 0x85, 0x66, 0xec, 0x60, 0xca, 0x3f, 0x49, 0x60, 0xcf, 0x6a, 0xfd }, { 0xf7, 0x95, 0xaa, 0x11, 0x1f, 0xc3, 0x05, 0x4f, 0xf7, 0x95, 0xaa, 0x11, 0x1f, 0xc3, 0x05, 0x4f } }, { "message digest", 14, { 0x13, 0xec, 0x25, 0xf2, 0x3c, 0x4d, 0x4f, 0x4e, 0x9f, 0x83, 0x61, 0x0d, 0x2f, 0x2d, 0x22, 0x44 }, { 0x41, 0xff, 0x15, 0x16, 0x2c, 0x05, 0xde, 0x29, 0x41, 0xff, 0x15, 0x16, 0x2c, 0x05, 0xde, 0x29 } }, { "abcdefghijklmnopqrstuvwxyz", 26, { 0xe7, 0x26, 0xb1, 0x06, 0x6d, 0x21, 0xa6, 0x5e, 0xba, 0x63, 0x29, 0xfc, 0x3f, 0xb6, 0x1f, 0x01 }, { 0x34, 0x1b, 0x5c, 0x7e, 0x2c, 0x41, 0xdb, 0x17, 0x34, 0x1b, 0x5c, 0x7e, 0x2c, 0x41, 0xdb, 0x17 } }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62, { 0x5c, 0x11, 0x8e, 0xd2, 0x10, 0x21, 0xe9, 0x2d, 0x26, 0x07, 0xf9, 0xc5, 0xfb, 0xf7, 0xb2, 0x79 }, { 0xb2, 0xeb, 0x2d, 0x5e, 0x69, 0x37, 0x37, 0xeb, 0xb2, 0xeb, 0x2d, 0x5e, 0x69, 0x37, 0x37, 0xeb } }, { "The quick brown fox jumps over the lazy dog", 43, { 0xdb, 0xb5, 0xfa, 0xd3, 0x6c, 0x77, 0x8a, 0x09, 0xf6, 0xa3, 0x30, 0x36, 0xa2, 0xf9, 0x18, 0x4f }, { 0x25, 0x6e, 0x8b, 0x77, 0x41, 0x6b, 0x6f, 0x96, 0x25, 0x6e, 0x8b, 0x77, 0x41, 0x6b, 0x6f, 0x96 } }, { "\x2a", 1, { 0x9a, 0x53, 0x8f, 0xc2, 0x88, 0x75, 0x00, 0x2d, 0x23, 0xc1, 0xfe, 0xfc, 0x90, 0xbc, 0xcc, 0xcf }, { 0xe2, 0x5d, 0x6e, 0xb9, 0x90, 0xb8, 0x43, 0x62, 0xe2, 0x5d, 0x6e, 0xb9, 0x90, 0xb8, 0x43, 0x62 } }, { "\x11\xb7", 2, { 0x86, 0x94, 0xdd, 0xa0, 0x50, 0xf5, 0x54, 0xa7, 0x4e, 0x79, 0x12, 0x03, 0xbd, 0xc5, 0x07, 0x85 }, { 0x1f, 0xf6, 0x7f, 0x9e, 0xa4, 0xbf, 0xa0, 0x9a, 0x1f, 0xf6, 0x7f, 0x9e, 0xa4, 0xbf, 0xa0, 0x9a } }, { "\x4c\xdf\x4d", 3, { 0x89, 0xf6, 0xec, 0x6f, 0xe6, 0xb7, 0x73, 0x70, 0x72, 0xf9, 0x20, 0xb4, 0x7f, 0x5e, 0x80, 0x08 }, { 0x13, 0xd9, 0xc1, 0x91, 0x25, 0x57, 0x65, 0x48, 0x13, 0xd9, 0xc1, 0x91, 0x25, 0x57, 0x65, 0x48 } }, { "\x57\x34\x85\xf5", 4, { 0x34, 0x52, 0xd0, 0x11, 0x30, 0x55, 0x59, 0x30, 0xbc, 0x9e, 0x7d, 0xd7, 0xb0, 0xcb, 0x7c, 0x8e }, { 0xc4, 0x7f, 0x07, 0x4e, 0x4d, 0x8a, 0x47, 0x01, 0xc4, 0x7f, 0x07, 0x4e, 0x4d, 0x8a, 0x47, 0x01 } }, { "\x87\x87\xf3\x02\xd8", 5, { 0xcb, 0x72, 0xe3, 0x2b, 0x97, 0x72, 0xf0, 0xcd, 0x8a, 0xb1, 0xa2, 0xb4, 0xf9, 0x4e, 0xe1, 0x3a }, { 0x0c, 0x68, 0xf2, 0x5f, 0x35, 0xca, 0xdd, 0x3e, 0x0c, 0x68, 0xf2, 0x5f, 0x35, 0xca, 0xdd, 0x3e } }, { "\x60\xcd\xb4\x00\x4c\xd4", 6, { 0x3c, 0xe8, 0xda, 0x00, 0x44, 0x63, 0x90, 0x75, 0x5f, 0xbd, 0x7f, 0x4f, 0x9a, 0x84, 0xe3, 0x90 }, { 0xde, 0xc2, 0x11, 0x42, 0xa5, 0x26, 0xe1, 0x90, 0xde, 0xc2, 0x11, 0x42, 0xa5, 0x26, 0xe1, 0x90 } }, { "\xc2\x57\x5a\x3b\x1b\x83\x07", 7, { 0xe6, 0xe5, 0xcd, 0x64, 0x2e, 0x10, 0x7c, 0x15, 0x1c, 0x1c, 0xb2, 0xe4, 0x6a, 0xeb, 0xc6, 0xa9 }, { 0xfa, 0x1e, 0x9c, 0xd3, 0xdf, 0x07, 0xbb, 0xdf, 0xfa, 0x1e, 0x9c, 0xd3, 0xdf, 0x07, 0xbb, 0xdf } }, { "\x7a\xef\xb4\xfe\xcf\x95\xda\xb4", 8, { 0xf4, 0x68, 0x70, 0x68, 0x31, 0xde, 0x32, 0xda, 0xf8, 0x78, 0x8f, 0x42, 0x87, 0xdd, 0x2b, 0x49 }, { 0x2d, 0xe0, 0x72, 0x31, 0xeb, 0xf4, 0x07, 0xce, 0x2d, 0xe0, 0x72, 0x31, 0xeb, 0xf4, 0x07, 0xce } }, { "\xc3\x8f\xec\xcb\x1e\x00\x7a\x7b\x84", 9, { 0x5b, 0x70, 0xc0, 0xd4, 0x73, 0xd1, 0x61, 0xc5, 0xcf, 0xc0, 0xf5, 0x29, 0x50, 0xb6, 0xc4, 0xf8 }, { 0x08, 0x43, 0x53, 0xfd, 0x79, 0x45, 0xc3, 0xeb, 0x08, 0x43, 0x53, 0xfd, 0x79, 0x45, 0xc3, 0xeb } }, { "\x6f\x9a\x56\x2c\x85\x0a\xf1\xa5\x90\x5f", 10, { 0xa7, 0x93, 0x18, 0x11, 0x94, 0x74, 0x38, 0x05, 0x03, 0x0c, 0x4e, 0xc2, 0x1a, 0x54, 0x6c, 0xb2 }, { 0xc1, 0x72, 0x94, 0x12, 0x23, 0x22, 0x2f, 0x74, 0xc1, 0x72, 0x94, 0x12, 0x23, 0x22, 0x2f, 0x74 } }, { "\xec\x25\x78\x0e\x7f\xe1\x53\x8d\x3d\xa5\xd9", 11, { 0xa5, 0xc2, 0x14, 0x97, 0x49, 0x21, 0x16, 0xe5, 0x29, 0x73, 0x2c, 0xff, 0x38, 0xa7, 0x4e, 0xb3 }, { 0x74, 0x73, 0x8d, 0xd4, 0x0b, 0x50, 0x7a, 0x6a, 0x74, 0x73, 0x8d, 0xd4, 0x0b, 0x50, 0x7a, 0x6a } }, { "\x3e\x81\x9e\x0b\x68\x2a\x0f\x60\xca\x61\xc6\x48", 12, { 0x76, 0xb2, 0x6c, 0x3b, 0x89, 0xfc, 0x91, 0xf4, 0x9e, 0xac, 0x4f, 0x92, 0xa5, 0x95, 0xa2, 0x28 }, { 0x45, 0xee, 0xa1, 0x15, 0x7f, 0xf4, 0xa8, 0xd1, 0x45, 0xee, 0xa1, 0x15, 0x7f, 0xf4, 0xa8, 0xd1 } }, { "\x87\x12\x60\x00\x51\x25\xd5\x63\x60\xf4\x60\x33\xba", 13, { 0xba, 0xbd, 0x9d, 0x0d, 0xe7, 0x4e, 0x60, 0xe7, 0x7c, 0x61, 0xf1, 0x69, 0xff, 0x93, 0x1f, 0x55 }, { 0x21, 0x8a, 0x1e, 0x83, 0x3a, 0x49, 0xba, 0xfe, 0x21, 0x8a, 0x1e, 0x83, 0x3a, 0x49, 0xba, 0xfe } }, { "\x91\x95\xc9\x08\xe7\xea\x6a\xae\x5e\xd6\x4f\xf9\xcf\x98", 14, { 0x05, 0x7e, 0x64, 0x97, 0xf8, 0x20, 0x3f, 0xf0, 0x6e, 0x34, 0xde, 0x97, 0x48, 0x80, 0xa7, 0xf5 }, { 0xb9, 0xb7, 0x6a, 0x60, 0x42, 0x0e, 0xba, 0x16, 0xb9, 0xb7, 0x6a, 0x60, 0x42, 0x0e, 0xba, 0x16 } }, { "\xc1\xe9\xfa\x1e\x9f\x4e\x90\x14\x33\x39\xc2\x58\xd8\x98\x14", 15, { 0x14, 0x53, 0x9c, 0xaa, 0x18, 0xeb, 0xa3, 0xfe, 0x80, 0x2d, 0x69, 0x09, 0x0e, 0x44, 0xef, 0x56 }, { 0x6c, 0x7b, 0x65, 0x1b, 0xa1, 0x45, 0xb7, 0x2e, 0x6c, 0x7b, 0x65, 0x1b, 0xa1, 0x45, 0xb7, 0x2e } }, { "\x60\x3e\x95\x66\xf0\x12\x4d\x58\x0f\x93\x5a\x21\xad\x41\x40\x13", 16, { 0x15, 0x96, 0xc5, 0x22, 0x89, 0x4e, 0x24, 0x1d, 0xfd, 0x47, 0x2c, 0x19, 0xf0, 0x63, 0x2b, 0x42 }, { 0x46, 0x82, 0x96, 0xe4, 0xc0, 0xcc, 0xb9, 0xf6, 0x46, 0x82, 0x96, 0xe4, 0xc0, 0xcc, 0xb9, 0xf6 } }, { "\x67\xe4\xa4\xd2\x35\xf4\xe3\xac\x9d\xa0\xd6\x93\x1e\xbc\xb2\x13\xc3", 17, { 0xf7, 0xf4, 0xf4, 0x4c, 0xfb, 0xd4, 0x5b, 0xce, 0x4c, 0x74, 0x2c, 0x0c, 0xe6, 0xb4, 0xa7, 0xaa }, { 0xd4, 0x9a, 0x3d, 0xc0, 0xd2, 0x85, 0xeb, 0x4b, 0xd4, 0x9a, 0x3d, 0xc0, 0xd2, 0x85, 0xeb, 0x4b } }, { "\x32\x28\xb3\x53\xe9\x51\xcd\x4b\x9a\x12\xb9\xc3\x51\x3c\x1a\x0f\x44\x24", 18, { 0xab, 0xcf, 0xaa, 0xf3, 0x02, 0xde, 0x49, 0x01, 0x10, 0x39, 0x4b, 0xba, 0xa8, 0xbe, 0xf3, 0x28 }, { 0x62, 0x9d, 0xa7, 0xb7, 0x15, 0x73, 0x5a, 0x71, 0x62, 0x9d, 0xa7, 0xb7, 0x15, 0x73, 0x5a, 0x71 } }, { "\xf8\xeb\x58\xac\xbb\xd0\xb5\x23\x29\xda\x7e\x9d\x8f\xe4\x7e\x85\x25\x06\xee", 19, { 0xfb, 0xb5, 0x26, 0x27, 0xa1, 0x47, 0x99, 0xfa, 0xc7, 0x6e, 0x72, 0x28, 0x78, 0x72, 0x07, 0x1f }, { 0xc6, 0x31, 0xf8, 0xb7, 0xa1, 0xfe, 0xb8, 0xee, 0xc6, 0x31, 0xf8, 0xb7, 0xa1, 0xfe, 0xb8, 0xee } }, { "\x41\x13\x1e\xa0\x63\xb9\x62\x07\x1b\xfe\xb3\x7c\xd8\x14\xe1\xfb\x87\x00\x29\x55", 20, { 0x74, 0x36, 0xdd, 0x5a, 0xaa, 0x66, 0x42, 0x91, 0x24, 0x45, 0x4e, 0x49, 0xdc, 0x9c, 0x1e, 0x78 }, { 0xc6, 0xde, 0x21, 0xd0, 0x98, 0x2b, 0xa6, 0x66, 0xc6, 0xde, 0x21, 0xd0, 0x98, 0x2b, 0xa6, 0x66 } }, { "\xa5\xe6\xe0\x0b\xbc\xff\x11\xb4\xfa\xef\x25\x42\x58\x83\x64\x00\x71\x6f\xa2\xfd\xe7", 21, { 0x0b, 0x38, 0x5d, 0x2e, 0xe4, 0xba, 0xa5, 0x4f, 0x83, 0x0b, 0x46, 0x34, 0x0f, 0xb9, 0xbd, 0xc4 }, { 0x6b, 0xae, 0xc7, 0x84, 0x60, 0x69, 0x32, 0xa9, 0x6b, 0xae, 0xc7, 0x84, 0x60, 0x69, 0x32, 0xa9 } }, { "\x9f\x23\x3a\xda\x11\x18\x86\x18\x7c\x65\xe8\x8b\xba\xf2\x35\xa9\x85\x89\xfc\xd6\xfe\x4c", 22, { 0x8d, 0x33, 0xa9, 0x97, 0xbf, 0x89, 0x7b, 0xbf, 0x65, 0xa2, 0xe5, 0xe8, 0x5a, 0xcd, 0x3f, 0x69 }, { 0xcd, 0xe0, 0x28, 0x17, 0xf3, 0x4f, 0x44, 0x79, 0xcd, 0xe0, 0x28, 0x17, 0xf3, 0x4f, 0x44, 0x79 } }, { "\xfd\xf5\xbd\xb8\x72\xf6\x5b\xb1\xc1\x6f\x6b\x91\x9a\x17\xca\x7a\xdc\x25\xfa\x60\x2e\x2b\x0d", 23, { 0x5f, 0xf8, 0x10, 0x8f, 0x3c, 0xf5, 0x8a, 0x94, 0x95, 0x97, 0x1d, 0x2d, 0xe6, 0xc6, 0x7f, 0xaa }, { 0x94, 0x78, 0x37, 0x0c, 0x1c, 0x04, 0x0e, 0x91, 0x94, 0x78, 0x37, 0x0c, 0x1c, 0x04, 0x0e, 0x91 } }, { "\x4f\x34\x7e\xc9\xa5\xfe\x82\xaf\xc4\x14\x09\x8c\x05\x44\xd1\xa7\x58\x45\xaa\x10\xcf\x85\x48\x92", 24, { 0xd2, 0x67, 0x35, 0x27, 0x0e, 0x55, 0xbd, 0xb1, 0x00, 0x55, 0x35, 0xf2, 0x8d, 0x19, 0x2f, 0x60 }, { 0xe6, 0x78, 0xcf, 0xe1, 0xaa, 0x6c, 0xaa, 0x65, 0xe6, 0x78, 0xcf, 0xe1, 0xaa, 0x6c, 0xaa, 0x65 } }, { "\xa6\xf9\x60\x25\xe2\x87\xb6\x0e\x1f\x6f\x2f\xd5\x96\xf4\xdf\x98\x62\x1d\xb2\x44\x68\x66\x13\xa0\xa4", 25, { 0x79, 0xaa, 0x35, 0x8b, 0x04, 0x39, 0xa5, 0x81, 0xcb, 0xe0, 0xbf, 0x21, 0xc6, 0xa8, 0xc9, 0xde }, { 0x9e, 0x15, 0x99, 0x85, 0xc6, 0xa7, 0x99, 0x06, 0x9e, 0x15, 0x99, 0x85, 0xc6, 0xa7, 0x99, 0x06 } }, { "\xab\x90\xcd\xc5\xcb\x95\xce\xd2\xd0\x3b\x50\xe7\xb7\x46\x7a\xf9\x9e\x00\x61\xd7\x86\xf8\x92\x5a\xea\x98", 26, { 0x87, 0x00, 0x28, 0x66, 0xfe, 0x22, 0xb2, 0xfc, 0xc7, 0xb2, 0xe5, 0xc3, 0x48, 0xe4, 0xb6, 0x83 }, { 0x87, 0x82, 0xf1, 0xe4, 0x2e, 0x58, 0x17, 0xfc, 0x87, 0x82, 0xf1, 0xe4, 0x2e, 0x58, 0x17, 0xfc } }, { "\x4b\x15\x88\xe0\x30\xc0\x52\x11\xe1\xc8\xe2\x9e\xe3\xc8\xff\xd8\x5f\x1b\x75\x7d\x62\x93\xeb\x49\x30\x86\x58", 27, { 0x8e, 0x32, 0x7c, 0x12, 0x57, 0x58, 0x7a, 0x3f, 0x90, 0xf6, 0x39, 0x32, 0x92, 0x83, 0x86, 0xcb }, { 0xe5, 0x55, 0xa6, 0x43, 0xd1, 0x93, 0x62, 0x31, 0xe5, 0x55, 0xa6, 0x43, 0xd1, 0x93, 0x62, 0x31 } }, { "\x46\x4f\x6d\x23\x9b\x98\xaf\x0b\x84\x00\xb3\xac\x86\x08\x52\x9d\xaa\xcc\xd6\x80\x0a\x1d\x4f\x84\x65\x55\x97\x42", 28, { 0xf9, 0x89, 0x90, 0x17, 0x7e, 0x5f, 0x90, 0xc5, 0x64, 0xf4, 0x7c, 0xe3, 0xcf, 0xde, 0x56, 0xe6 }, { 0x6e, 0xf5, 0x14, 0x2f, 0x68, 0x36, 0xc3, 0x14, 0x6e, 0xf5, 0x14, 0x2f, 0x68, 0x36, 0xc3, 0x14 } }, { "\xaf\x19\x03\x50\x77\x43\x46\xd8\x25\x83\x87\x65\xc6\x0f\x58\xa4\xdd\x4a\x15\x3a\x7a\x19\xbb\x34\x60\xb6\x7c\x93\x77", 29, { 0xdb, 0x7f, 0xc3, 0x0d, 0xaa, 0x01, 0xd3, 0x5d, 0x11, 0xa0, 0x34, 0x05, 0x3f, 0xc4, 0xd8, 0xef }, { 0xc9, 0x36, 0xfb, 0xae, 0xfb, 0x63, 0xa9, 0x3e, 0xc9, 0x36, 0xfb, 0xae, 0xfb, 0x63, 0xa9, 0x3e } }, { "\x84\x87\x11\x76\xfd\x70\xdc\x2f\x21\x01\xc6\xe3\x3f\x96\x68\x63\x9e\x0f\x36\x7e\x9e\x54\x1a\xf1\xff\x79\x60\xee\x1e\xf4", 30, { 0xc0, 0xcd, 0x4d, 0xd5, 0x74, 0x77, 0xc0, 0x9c, 0x2a, 0x29, 0x25, 0x06, 0x73, 0x55, 0xf8, 0xd9 }, { 0x11, 0x9f, 0x10, 0xec, 0x1a, 0x9f, 0xf4, 0x59, 0x11, 0x9f, 0x10, 0xec, 0x1a, 0x9f, 0xf4, 0x59 } }, { "\x79\xd2\xf2\xe7\xd8\xe7\x0e\x62\x17\x7b\x47\x52\x55\x39\x3b\x65\x4f\x8c\x00\xc7\xfc\x72\xf8\xd1\x75\x6a\x10\x78\xee\x2e\x8a", 31, { 0x32, 0x8d, 0x56, 0x46, 0xc1, 0xd8, 0x12, 0x14, 0x67, 0x42, 0xeb, 0xd6, 0x5a, 0xc4, 0xcb, 0x9b }, { 0x21, 0xe7, 0x37, 0x0d, 0x13, 0x25, 0x96, 0xc2, 0x21, 0xe7, 0x37, 0x0d, 0x13, 0x25, 0x96, 0xc2 } }, { "\xa3\x83\xd0\x52\x93\x5b\x89\x70\xd8\x98\x95\xab\x0f\x66\xd1\xe7\x50\x16\x43\x3d\x8f\x60\xfd\x55\x99\x67\xb7\x04\xbf\x4f\x6e\x1e", 32, { 0x50, 0x03, 0xd1, 0xa6, 0xc8, 0xcb, 0x7e, 0xb2, 0x17, 0x62, 0xeb, 0xca, 0x3a, 0x04, 0x8d, 0xc7 }, { 0x14, 0xd1, 0xd0, 0x8d, 0xe1, 0x7f, 0xed, 0x3a, 0x14, 0xd1, 0xd0, 0x8d, 0xe1, 0x7f, 0xed, 0x3a } }, { "\x34\xe4\xa3\x56\x0a\x06\x74\x09\xbf\x32\x81\xff\x64\xdd\xd6\x3c\xcf\x81\x00\x56\xa5\x7c\x6d\x3d\x22\xa2\x59\x56\x1c\xb6\xf3\x43\x82", 33, { 0x30, 0x05, 0xa8, 0xf1, 0xc1, 0xb1, 0x93, 0x3c, 0x52, 0xd4, 0xca, 0xf2, 0xcd, 0xa5, 0xf0, 0xa9 }, { 0x34, 0x22, 0xd6, 0x35, 0x14, 0x82, 0x2f, 0x24, 0x34, 0x22, 0xd6, 0x35, 0x14, 0x82, 0x2f, 0x24 } }, { "\xc1\xb2\x2b\x9a\xf7\xd5\x08\x69\xf0\xab\x7f\x8b\xb6\x5c\x6a\x3a\x86\x6f\x8d\x47\xe2\xc8\x40\x69\xe0\x66\xc1\x40\x79\xf3\x9c\xf0\x2d\xef", 34, { 0x1f, 0x42, 0x2c, 0xf9, 0x0c, 0xf6, 0xd2, 0x4e, 0xf6, 0xdf, 0xdf, 0x49, 0x91, 0x6e, 0x51, 0xb3 }, { 0x26, 0xb9, 0x1a, 0xb0, 0xde, 0xee, 0x7a, 0x15, 0x26, 0xb9, 0x1a, 0xb0, 0xde, 0xee, 0x7a, 0x15 } }, { "\xe9\xd7\x3c\x4b\xbc\xc0\xdb\xe9\xd0\xad\x55\x8d\x5f\xde\x6b\xc9\x89\x6e\x27\x8f\xab\x5d\x73\x6f\xe2\x3a\x57\x1b\xea\x9d\x81\x85\xa4\x18\x4b", 35, { 0xc8, 0x28, 0x51, 0xfe, 0xc6, 0x47, 0x70, 0xf9, 0x79, 0x5f, 0x22, 0xca, 0x28, 0x4d, 0xee, 0x86 }, { 0xeb, 0x4d, 0x93, 0xa6, 0xce, 0xe1, 0xef, 0x1c, 0xeb, 0x4d, 0x93, 0xa6, 0xce, 0xe1, 0xef, 0x1c } }, { "\x53\xc9\x79\x5f\x82\x09\xaf\xab\xd5\x7d\xfe\xeb\x7f\x1b\xc8\x3e\xda\x03\x45\xfd\x75\x2c\x8b\xa8\xf9\xcc\x82\x2d\x67\xa6\xf3\xdc\x15\xd3\x28\xe0", 36, { 0x32, 0x4b, 0xcb, 0x82, 0x1a, 0x2b, 0x4a, 0x46, 0x06, 0xc6, 0xe5, 0x2c, 0xb3, 0x0f, 0x1b, 0x2c }, { 0xa2, 0xd2, 0x75, 0x4a, 0x34, 0x1b, 0x91, 0xa4, 0xa2, 0xd2, 0x75, 0x4a, 0x34, 0x1b, 0x91, 0xa4 } }, { "\x5b\xd9\x0c\xe1\xa3\x9b\x19\xff\x60\x1d\x4a\x21\x1e\xa8\x27\x20\x3f\x79\x02\xc4\x43\x1c\x02\x42\xa8\x14\x9b\xd8\x12\x69\xa2\xe2\x60\x07\xb4\x3b\xed", 37, { 0xa1, 0x9f, 0x6c, 0xcc, 0x8f, 0x19, 0xa3, 0x82, 0xf4, 0x99, 0x55, 0x60, 0x2c, 0xf7, 0x02, 0xd2 }, { 0x64, 0x04, 0x2a, 0x91, 0xbb, 0x50, 0xec, 0x24, 0x64, 0x04, 0x2a, 0x91, 0xbb, 0x50, 0xec, 0x24 } }, { "\x00\x56\xb0\xea\xa5\x9c\x8e\x6d\x0e\xf4\x88\x98\xc2\x49\x3e\x6e\xe8\xc5\xf7\x44\x8f\x6a\xd6\x88\x35\xac\xe2\x66\xbd\x63\xee\xcc\xb8\x9b\x04\xa4\xba\x27", 38, { 0x30, 0x15, 0xd7, 0x06, 0xd5, 0x87, 0xf9, 0xf5, 0x30, 0x3b, 0x40, 0xc0, 0x98, 0x6a, 0x40, 0xeb }, { 0xfa, 0x63, 0xf0, 0xe3, 0x60, 0x2a, 0x40, 0xbf, 0xfa, 0x63, 0xf0, 0xe3, 0x60, 0x2a, 0x40, 0xbf } }, { "\x52\x6e\xdc\x2b\x6d\x81\x33\x7e\xf8\xb0\x70\xe5\x08\x68\x10\x68\x84\x07\xe6\x73\x86\xdb\x67\xcd\x34\x87\x55\xa1\xd4\xec\x3a\x7c\x3f\x54\x30\xfe\x3d\xde\x31", 39, { 0x50, 0xa5, 0xbc, 0x38, 0x2d, 0x32, 0xad, 0x41, 0xba, 0xdf, 0x51, 0x78, 0x1e, 0xaa, 0x99, 0xc6 }, { 0x75, 0xd7, 0x8f, 0x5d, 0x99, 0x57, 0x1a, 0x1a, 0x75, 0xd7, 0x8f, 0x5d, 0x99, 0x57, 0x1a, 0x1a } }, { "\x19\x8f\xb2\x47\x4d\x96\x87\xd9\xed\xfe\xea\x41\x00\xd9\xbe\x30\xfa\x64\xd8\x24\xad\x2a\x90\x00\x84\x78\x39\x1e\x38\x85\xa5\xa4\x0c\x21\x89\x3a\x85\x50\x54\x77", 40, { 0xdc, 0x64, 0x9e, 0xa3, 0x88, 0x2c, 0x3f, 0xe2, 0x38, 0x1b, 0x2e, 0x9d, 0xe5, 0xad, 0x60, 0x8c }, { 0x49, 0xae, 0x02, 0xd9, 0xfe, 0xa1, 0x4a, 0xfa, 0x49, 0xae, 0x02, 0xd9, 0xfe, 0xa1, 0x4a, 0xfa } }, { "\xac\x0f\x22\x3f\xa6\x99\x88\xd1\x10\x7a\xbe\xaf\x56\x67\xfb\x82\x10\xf9\x58\xea\x92\xbb\xe0\x6b\x11\x38\x89\xfd\x8d\x1c\x47\x22\x75\x6d\x30\x18\x00\x20\x86\x02\x44", 41, { 0xa8, 0x1e, 0xb6, 0x09, 0xc1, 0xa5, 0xfa, 0xe1, 0x2d, 0x51, 0x1e, 0xa8, 0xb0, 0x9a, 0x03, 0xc9 }, { 0x41, 0x3e, 0x76, 0x3e, 0x86, 0x0e, 0x5d, 0x54, 0x41, 0x3e, 0x76, 0x3e, 0x86, 0x0e, 0x5d, 0x54 } }, { "\xcc\x0e\x8b\x41\xa8\x2f\xe4\xd6\xcc\xd6\x8a\x4a\x32\xe9\x08\x81\x50\xe8\x2a\xbc\xcf\xfc\x27\xa5\xd3\x33\x95\x8a\x9b\x09\x5c\xda\xb0\x6c\xc6\x5c\x73\x9d\x9a\x47\xba\x52", 42, { 0x0e, 0x64, 0xdd, 0xf9, 0xfa, 0x02, 0x6b, 0x45, 0x84, 0xa1, 0xdc, 0x92, 0x9d, 0xc3, 0x00, 0xf0 }, { 0x7a, 0xb4, 0x28, 0x13, 0x93, 0xf9, 0xad, 0x09, 0x7a, 0xb4, 0x28, 0x13, 0x93, 0xf9, 0xad, 0x09 } }, { "\xc6\x9f\x96\x4d\x4b\xd2\x4f\x87\xd0\xca\x42\x44\x8b\xe3\x55\x68\xd4\xd1\xf1\x1c\x0f\xb4\xfb\x39\x73\x62\xb3\x16\xd1\x12\xc0\x73\xcf\x85\x1f\x32\xc8\x11\x73\xba\xa6\x7e\xe9", 43, { 0xbb, 0x4f, 0x10, 0x73, 0x94, 0x59, 0xb9, 0x4f, 0x67, 0xc4, 0x50, 0x4b, 0xde, 0x34, 0x54, 0x2d }, { 0x1d, 0x85, 0x33, 0xc6, 0x82, 0xc1, 0x99, 0x1c, 0x1d, 0x85, 0x33, 0xc6, 0x82, 0xc1, 0x99, 0x1c } }, { "\x2d\xf1\xb6\x46\xda\xe7\x50\x43\x2d\xb1\xf5\xcd\xd0\x9e\x3b\xcb\xe5\x76\x79\x9e\x7c\x2a\xa3\x7f\xe4\x97\xa2\xcc\x12\xe2\xc7\xb8\xeb\xaa\xe0\x34\x66\xac\x9f\xb5\x3b\x6b\xd2\x28", 44, { 0xdd, 0x18, 0x57, 0x75, 0x64, 0x74, 0xc6, 0xb5, 0x3c, 0x09, 0x6d, 0xcd, 0x92, 0x42, 0x34, 0x0b }, { 0x85, 0x9b, 0xc9, 0x0c, 0xf4, 0x07, 0xff, 0x9b, 0x85, 0x9b, 0xc9, 0x0c, 0xf4, 0x07, 0xff, 0x9b } }, { "\x16\xcf\x24\x22\x8e\xb6\xf2\x80\xfa\x0a\x55\x07\x36\x52\xef\x8b\xd7\x5b\x66\x5f\x8d\x52\xac\x72\x01\x31\x22\x94\x48\x8f\x4e\x4f\x39\x9c\x1c\xa9\x4c\x5d\x17\x57\xb8\xf5\xce\x76\x43", 45, { 0xd5, 0xfa, 0x71, 0x93, 0xa5, 0x10, 0x4e, 0x04, 0xd3, 0x00, 0x04, 0xdf, 0xa1, 0x34, 0x92, 0x2f }, { 0x27, 0xec, 0x5b, 0x50, 0xab, 0x3a, 0x4c, 0x9c, 0x27, 0xec, 0x5b, 0x50, 0xab, 0x3a, 0x4c, 0x9c } }, { "\x13\x5d\x5a\x28\xc7\xf0\xbf\x6d\xef\x8a\x78\xec\x31\xf3\x9a\x51\x31\xdc\xa7\x09\xe9\x87\x36\x29\xee\x96\x09\x5b\x31\xb2\xda\xca\x14\x56\x25\x69\x30\xcd\x60\xbc\x72\x75\x48\xdc\xa5\x9c", 46, { 0x1f, 0xc9, 0xb7, 0x57, 0x8c, 0xad, 0xdf, 0xf4, 0xcf, 0xad, 0xcc, 0x85, 0x57, 0x64, 0xf2, 0x1c }, { 0xdc, 0x97, 0xf6, 0x8c, 0x5d, 0xe0, 0x56, 0x3e, 0xdc, 0x97, 0xf6, 0x8c, 0x5d, 0xe0, 0x56, 0x3e } }, { "\xf7\xe6\xd7\xf5\x3e\x77\x10\x02\xb2\x0e\x0c\x1a\xa4\x60\xf1\x26\x04\x01\x34\xa6\x8f\xdf\x64\xcd\x78\xe7\x80\x4e\xd1\x36\x04\x3c\x46\x64\x30\x95\x69\x4b\x01\x09\x73\x02\xdc\x05\xd0\x2e\x9d", 47, { 0xc3, 0x9b, 0x8f, 0x6a, 0x6f, 0xb6, 0x09, 0x92, 0xf6, 0x61, 0xec, 0x1c, 0xc4, 0x67, 0x87, 0x1a }, { 0xa1, 0xaf, 0x88, 0xc8, 0x22, 0xe9, 0xcc, 0x32, 0xa1, 0xaf, 0x88, 0xc8, 0x22, 0xe9, 0xcc, 0x32 } }, { "\xef\x8b\x59\x07\x6a\xa6\x89\xcc\x48\x28\x85\xc7\xbe\x8c\xe4\xe3\x1b\x1b\x8b\x40\x42\x16\xe4\xed\x1d\xc7\xa3\xd2\xf7\xc7\x8d\x3e\x1d\x74\xab\xcf\x72\x3d\x15\xe8\x4c\xdd\x3b\xda\x3b\xf8\x48\x52", 48, { 0xaf, 0xb1, 0xe7, 0xab, 0x1f, 0xde, 0xd2, 0x0a, 0x2f, 0x57, 0xe7, 0x76, 0x11, 0x64, 0x0c, 0x3f }, { 0x3a, 0x7d, 0x06, 0x01, 0x57, 0x65, 0xf7, 0x58, 0x3a, 0x7d, 0x06, 0x01, 0x57, 0x65, 0xf7, 0x58 } }, { "\x13\x9e\x05\x5e\x33\xc7\xfb\xd4\xa8\x71\x90\x8a\xe7\x4f\x32\x89\x10\x47\x69\x64\x67\x0d\x95\x55\x5b\xc7\xcd\x2c\xef\x0b\x92\x78\xb7\xdf\x4a\x8f\x41\x3b\x22\xdb\x43\xe0\x13\x38\x53\x46\x06\xf3\xfe", 49, { 0x5c, 0xbe, 0x3f, 0x5f, 0x67, 0x60, 0xf3, 0xe6, 0x05, 0xb8, 0x9f, 0xdc, 0x63, 0xd0, 0x61, 0xbe }, { 0x0f, 0x4f, 0xe7, 0xf0, 0x9a, 0x71, 0xd0, 0x89, 0x0f, 0x4f, 0xe7, 0xf0, 0x9a, 0x71, 0xd0, 0x89 } }, { "\x42\x1d\xaf\xd0\xc5\x96\x91\xad\x2f\xba\x69\x33\x95\x3f\xdc\x66\xc0\x50\xf7\xc5\xe0\xbe\x1a\x91\x72\x7a\x87\x92\xa3\x46\x03\xcd\x36\xa8\x6c\x38\xd6\x2f\x71\x53\x50\x6a\xd7\xb0\xd5\xbf\xa6\xef\xc3\xdf", 50, { 0x68, 0x9e, 0xb8, 0x2e, 0xc6, 0xf6, 0x91, 0x0c, 0x64, 0xad, 0x91, 0x8e, 0xbc, 0x82, 0x56, 0xab }, { 0xd3, 0x46, 0x6e, 0xbb, 0x64, 0x21, 0xdd, 0x93, 0xd3, 0x46, 0x6e, 0xbb, 0x64, 0x21, 0xdd, 0x93 } }, { "\x06\x3b\x63\x82\xdc\x71\xde\x0f\x4c\x30\x8f\x3c\x00\xf3\x56\x51\x7b\xa1\x6d\x3e\xaa\x8f\xea\x1e\x4c\x04\xd8\x02\xed\xe7\x6d\x74\x8c\x1c\x5a\x99\x31\x3b\xad\x79\xcb\x4a\x3b\x31\xdb\x65\xc7\x51\x26\xff\x4d", 51, { 0x58, 0xe3, 0x70, 0xc8, 0xdb, 0xae, 0x03, 0xd0, 0x51, 0xa1, 0x6b, 0x11, 0x19, 0x90, 0x01, 0xed }, { 0x87, 0xf0, 0xdb, 0x9a, 0x06, 0xd5, 0x74, 0x11, 0x87, 0xf0, 0xdb, 0x9a, 0x06, 0xd5, 0x74, 0x11 } }, { "\x54\xc6\x7f\xd3\xc3\xff\xab\x98\x48\xef\x96\x79\xa1\x23\xc0\x15\x57\x1d\x24\x0e\x41\xe8\xc2\xe3\x46\xdf\xab\xb9\x13\x13\xc0\xaf\x21\x8e\xb9\x07\x9e\x60\x4e\xad\x4b\x15\x71\xde\xba\xed\xe4\xfd\x2c\x9b\xfb\x26", 52, { 0xdc, 0xe0, 0x11, 0xe0, 0x75, 0x52, 0x95, 0x6a, 0xc0, 0x80, 0x3d, 0x9b, 0x95, 0xff, 0x45, 0x52 }, { 0x35, 0xb2, 0x7b, 0x6d, 0x6b, 0xdf, 0xfc, 0xed, 0x35, 0xb2, 0x7b, 0x6d, 0x6b, 0xdf, 0xfc, 0xed } }, { "\xe4\x5b\x24\x0c\x37\x72\xfa\xf3\xdc\xca\x08\xc0\x1b\xe7\x23\x92\x8d\xaf\x6a\x6f\x04\xe2\xd2\x86\xb5\xfb\xae\x02\x66\x8a\x12\xe1\x54\xfb\x2d\x3d\x3d\xd2\x8c\x7d\x07\xdb\xdb\x8b\xd2\xe5\xaf\x21\x53\x8a\xbe\xec\x5d", 53, { 0x2d, 0xa4, 0x49, 0x55, 0xf6, 0x76, 0xc0, 0x14, 0x4d, 0xb5, 0x13, 0x88, 0x72, 0x68, 0x0e, 0xfc }, { 0x6a, 0x68, 0x98, 0xe2, 0xab, 0x45, 0xde, 0x08, 0x6a, 0x68, 0x98, 0xe2, 0xab, 0x45, 0xde, 0x08 } }, { "\x02\x63\xda\xe2\xff\x98\x4d\x40\x41\xad\x77\x9e\x33\xac\xd7\x30\x21\xb0\x73\x45\x4f\x81\xbe\x65\x42\xf9\x49\x7f\xa6\x04\x7d\x77\x40\x8d\x2d\xcd\xb8\xc9\xd2\xad\xd3\x0f\xbb\x33\xca\x72\xb1\xac\x0a\x53\x5d\xf5\x86\x36", 54, { 0xa9, 0x00, 0x59, 0x2b, 0xc6, 0xef, 0x1f, 0x1c, 0x6c, 0xf2, 0x6b, 0x5c, 0xad, 0xec, 0x95, 0x94 }, { 0x2c, 0x85, 0x99, 0x03, 0xca, 0x6d, 0x8a, 0x44, 0x2c, 0x85, 0x99, 0x03, 0xca, 0x6d, 0x8a, 0x44 } }, { "\xe8\x30\x1e\xa8\xd1\xc7\x62\x47\xb0\x61\x8b\x7a\xd3\x77\x8a\x00\x5b\x34\x9b\xa9\x0e\x59\x64\xb1\x71\x07\xfd\xd9\x73\xfa\xfd\x89\x70\x2c\x35\xf8\xf7\xb7\xdb\x6e\x12\xa3\x88\x30\x0c\xcc\xe5\x68\x85\xf2\xd0\xbb\x2c\x8c\x20", 55, { 0x7c, 0x0f, 0x04, 0xd0, 0xc6, 0x74, 0x4e, 0xda, 0x26, 0x0a, 0xb5, 0xa4, 0x27, 0x43, 0xd1, 0x78 }, { 0x29, 0xf3, 0x4d, 0xbf, 0xe4, 0xf2, 0xa5, 0x5d, 0x29, 0xf3, 0x4d, 0xbf, 0xe4, 0xf2, 0xa5, 0x5d } }, { "\x3d\xef\xf7\x0a\xa6\x9e\x02\xc2\x6e\x61\xea\x7e\x94\x2f\x20\xce\x4e\x35\x40\x27\xba\xc8\x51\x93\x3b\xe2\xee\x71\x38\x9e\x12\x33\x5b\x07\xc5\x20\xdf\xe3\x19\xf2\xd0\x74\x24\x0b\xd1\xd1\x8c\x80\x52\xbd\xd6\xb6\x5d\x85\xdd\x92", 56, { 0x71, 0x35, 0xf4, 0x1e, 0x6c, 0xe3, 0xce, 0x81, 0xd1, 0x4d, 0x58, 0x60, 0xd9, 0xb5, 0x5d, 0x8d }, { 0x5c, 0x3a, 0xe8, 0x76, 0x95, 0x30, 0x66, 0x9c, 0x5c, 0x3a, 0xe8, 0x76, 0x95, 0x30, 0x66, 0x9c } }, { "\xd1\x06\x7e\xa7\xa4\x1c\x82\x43\x2b\xf8\xb2\x30\xe8\xe6\x0c\x57\x86\xc2\xe3\x42\x2a\x96\xf6\x6a\x1d\x33\xed\x4a\xec\x4d\xdf\x12\x9e\xbc\x40\x06\x30\x55\x7a\x4d\xb9\x20\xaa\x25\x99\x70\x41\x21\xd5\x8c\x85\x04\xa8\x31\x07\x30\xbc", 57, { 0x7c, 0xc1, 0x88, 0x98, 0xf4, 0xc9, 0xd1, 0x7a, 0x52, 0x16, 0xef, 0x62, 0xba, 0xf5, 0x41, 0x78 }, { 0x42, 0x44, 0x30, 0x72, 0xe0, 0x5e, 0x0b, 0xa2, 0x42, 0x44, 0x30, 0x72, 0xe0, 0x5e, 0x0b, 0xa2 } }, { "\xe9\xe4\x13\x6b\x32\x34\xa6\xfb\xaa\x62\x4c\x27\x4a\x04\xf5\x2b\x2e\xd9\x6d\x09\xe7\xad\x57\xfb\x45\xcf\xdd\x04\x49\x64\x91\xaa\x42\x55\x95\x7b\xd6\x5b\x67\x40\xab\x62\x6c\xe2\xc9\x99\xf2\x96\xd4\x20\xa1\xb8\x27\x99\x85\x26\xeb\x20", 58, { 0x24, 0x02, 0xfe, 0x32, 0xd7, 0x73, 0x16, 0x51, 0x8c, 0xe6, 0xe3, 0x90, 0x93, 0xd6, 0xef, 0x17 }, { 0x96, 0x53, 0x42, 0x5b, 0x79, 0x57, 0x2f, 0xce, 0x96, 0x53, 0x42, 0x5b, 0x79, 0x57, 0x2f, 0xce } }, { "\x65\x2d\x76\x67\x68\x9f\x1f\xde\x8c\x30\x4c\xc7\x4d\xa5\x0b\xd7\x4e\x97\x08\xef\x8f\xdd\x70\x9c\xc6\x47\xf7\xcd\x3b\x75\x1b\xc2\x49\x2d\x76\x24\x9d\x58\xb0\x47\x92\x76\x42\xde\x06\x0c\xfa\x64\x0a\x50\x76\xa6\x01\x83\xb6\x4d\x86\xf8\x6c", 59, { 0x04, 0x21, 0x0f, 0xfc, 0xd2, 0x16, 0x1b, 0x7e, 0x82, 0xa2, 0xdb, 0x70, 0xe1, 0xf7, 0x9c, 0x1b }, { 0xc7, 0xdb, 0x6d, 0xd1, 0xaf, 0x80, 0xf8, 0x8e, 0xc7, 0xdb, 0x6d, 0xd1, 0xaf, 0x80, 0xf8, 0x8e } }, { "\xfa\xd2\x68\xd8\x5b\x76\x6e\x87\x7c\x14\xb5\xe3\x12\xc6\xbf\xa5\xc8\xb2\x66\x63\xc7\xa0\x1c\x67\xef\xa6\xbf\x7a\xb3\x11\x5d\x15\x3f\xbe\xd7\x8f\x68\xd2\xb1\x93\x78\x89\x6c\xca\x92\x6b\x08\xc8\x45\x15\xcd\x4c\x20\x49\x8b\x3c\xef\xfa\x89\xcc", 60, { 0xb9, 0xb4, 0xe0, 0x51, 0xb1, 0xf4, 0xd8, 0xd1, 0xce, 0x0f, 0xb1, 0xae, 0xb5, 0xe1, 0x40, 0xa9 }, { 0xac, 0xcc, 0x07, 0x15, 0xc9, 0x37, 0x5f, 0x90, 0xac, 0xcc, 0x07, 0x15, 0xc9, 0x37, 0x5f, 0x90 } }, { "\x27\xed\xc5\x85\x12\xd5\x2b\xac\x25\xb6\xb0\xab\x92\x53\x15\x44\x42\x07\x4d\xd5\xe1\xc4\x5a\x24\x99\x2c\x09\xa2\x4c\xcf\x6e\xc3\x91\xf8\x7c\xda\x2d\xd2\x8a\x81\xf5\x4c\x90\xce\x2f\x3c\x7d\x54\x42\x56\xee\xdc\xb6\xa2\x4e\x5f\x95\xbb\xc6\xba\xd4", 61, { 0x2e, 0x03, 0x80, 0xfa, 0x88, 0x7b, 0x11, 0x87, 0xbf, 0x9a, 0x4a, 0x31, 0x08, 0x4b, 0x37, 0x96 }, { 0xc2, 0x0a, 0xfe, 0xcc, 0xa0, 0x6f, 0x54, 0xa3, 0xc2, 0x0a, 0xfe, 0xcc, 0xa0, 0x6f, 0x54, 0xa3 } }, { "\xf3\xe6\xdd\xe2\xba\x72\x79\x2b\x30\x3b\x2e\x8f\x6e\xd3\x70\xa1\xa5\x18\x8e\xff\xb0\xcf\xc6\xdc\x8e\x39\xb4\x4a\x5b\x90\x71\x0c\xcb\xb4\xf4\x82\x3e\xf6\x6b\xb3\x99\x0c\x27\x6c\x81\x19\x31\x1d\x51\xff\x78\x47\x51\x58\x24\x95\xdf\x09\x18\x3f\x7c\x4b", 62, { 0x8d, 0xd3, 0xc2, 0x8e, 0xa1, 0x41, 0x4e, 0x28, 0x2b, 0xd2, 0xc6, 0x5f, 0x9b, 0xfa, 0x0c, 0x1b }, { 0xb3, 0xba, 0x49, 0x8f, 0x24, 0x57, 0x37, 0x21, 0xb3, 0xba, 0x49, 0x8f, 0x24, 0x57, 0x37, 0x21 } }, { "\x00\x1e\xed\xb7\x17\x39\xf7\x8b\xea\xbc\x79\x5c\xa2\xc2\xf1\x00\xae\x7d\x0a\xf6\x48\xe6\x91\x23\x0d\x39\x9d\x48\x22\xb1\xd5\x27\xd2\x1f\x9f\xed\x8d\x37\x8e\xa7\x76\x14\xe8\x86\x50\x57\x49\x9f\x48\x5d\xe8\x5d\x74\x5b\x73\x6c\xf2\x11\x6e\x3d\xa8\x7f\x4d", 63, { 0xf0, 0x77, 0x16, 0xd5, 0xa2, 0xb6, 0xb8, 0x72, 0x03, 0xe5, 0xda, 0xe0, 0x52, 0x47, 0x56, 0x66 }, { 0xad, 0xec, 0x74, 0xe1, 0x7e, 0xa8, 0x5c, 0x7a, 0xad, 0xec, 0x74, 0xe1, 0x7e, 0xa8, 0x5c, 0x7a } }, { "\x0c\x20\xdf\xfe\x41\x55\xf7\x8d\x73\x10\x41\x2a\x92\xca\x29\x17\x1d\xd0\xfb\x06\x49\x41\x23\x4c\x1c\xf9\x0a\x64\x8b\x2b\x5f\x99\x1c\xec\xfe\x8f\x59\x95\xfb\xc0\x62\x54\xd8\x9c\x0a\x20\x10\x31\xe0\x5c\x7b\x0b\x31\xc9\xb5\x61\x5d\xe7\x28\x26\xce\x05\xba\x09", 64, { 0x72, 0xc3, 0x93, 0xb4, 0x20, 0x70, 0x60, 0x59, 0x41, 0x57, 0xb3, 0x09, 0x19, 0x61, 0x8c, 0x30 }, { 0x26, 0x3b, 0x07, 0x98, 0xc2, 0xbf, 0xbb, 0x7d, 0x26, 0x3b, 0x07, 0x98, 0xc2, 0xbf, 0xbb, 0x7d } }, { "\x99\x45\x2b\x92\xb2\x19\xc2\xfc\xa4\x0b\x9d\xfd\xcd\x44\xfa\x1f\xe8\x2b\xf7\x00\xb8\xa8\xeb\x56\x78\xc7\x1a\xe5\x9f\x4c\xd4\x67\x7c\x46\x04\xab\x4a\x76\x3e\x4b\xcd\x58\x35\x1e\xe8\xcf\x83\x6b\x6e\x0a\xe3\x25\x66\x00\x5a\x03\xf6\xa6\x67\xdc\xcb\xbd\x5b\xd7\x23", 65, { 0x92, 0x08, 0x27, 0x67, 0x9a, 0xfa, 0xd7, 0x8d, 0x0e, 0x66, 0xe5, 0x4c, 0x25, 0x94, 0xd1, 0x08 }, { 0x52, 0xa7, 0x81, 0x4b, 0x9b, 0x72, 0xde, 0xf0, 0x52, 0xa7, 0x81, 0x4b, 0x9b, 0x72, 0xde, 0xf0 } }, { "\x2d\x3a\xdf\xd3\x20\xa0\x0d\x41\xce\x99\x23\xc6\xf3\xc5\xa8\x1f\x64\x6a\xc3\x16\xfb\x96\xbe\x30\xb3\x1a\x1a\xad\x6d\x87\x81\x22\x18\xf8\xa1\x73\x4d\x5b\xb4\xbd\x27\x86\xbf\xde\x12\x48\xa2\x5f\x73\xcb\xb4\x40\x45\x62\xbb\x87\x9f\x3c\xde\xbc\x84\x65\x9d\xa1\xca\x0d", 66, { 0xd4, 0x35, 0x00, 0x98, 0x36, 0xc8, 0x30, 0xac, 0x62, 0x87, 0x7c, 0x36, 0xa8, 0x9b, 0x0f, 0xba }, { 0xbd, 0x79, 0x12, 0xb6, 0x62, 0xe0, 0xef, 0x3f, 0xbd, 0x79, 0x12, 0xb6, 0x62, 0xe0, 0xef, 0x3f } }, { "\x9b\x26\x96\x7a\xe6\xb4\x23\x33\x58\xf7\x3c\xcd\xdc\x94\x82\xea\x21\x44\x66\x96\x6a\xe1\x99\x78\x1e\xd6\x4b\x3a\x32\xb9\x4a\xb1\xc3\x12\x8a\x26\x91\xf8\x0b\x08\x5b\x16\x84\x60\xd9\x31\x58\xd3\xb4\xa4\xa8\xb1\xa2\x62\xb3\x18\xcf\x8a\x8e\x5e\xe7\x28\x59\xa4\x24\xaf\xa5", 67, { 0x17, 0xb3, 0xea, 0x3f, 0xa9, 0xc1, 0x71, 0x24, 0x0c, 0x19, 0x53, 0x9e, 0x1a, 0x90, 0x25, 0x0e }, { 0x6a, 0x4e, 0x23, 0x11, 0x1d, 0x13, 0x77, 0xdc, 0x6a, 0x4e, 0x23, 0x11, 0x1d, 0x13, 0x77, 0xdc } }, { "\x7f\xd4\xad\x52\xdb\x5d\xa8\x2d\x2a\xac\x70\x5d\x77\xca\x02\x75\xd9\x0b\x93\xf2\x56\xab\x77\x8e\xba\xa0\xf3\x07\x85\xbf\xab\x96\x66\xe7\x8f\x6c\x53\x05\xdd\x20\xe0\xab\x65\x6e\x5e\xf0\x46\x4a\xad\xe3\x39\x20\x97\xb2\x9f\x4b\x87\xad\x3a\xdb\x20\xaa\x17\x47\xa9\x37\x02\xf1", 68, { 0x92, 0x2b, 0xac, 0x59, 0xa0, 0xcd, 0x20, 0x6c, 0xbb, 0x6c, 0xb2, 0xe7, 0xde, 0x2e, 0x7e, 0xdb }, { 0x4d, 0xef, 0xfa, 0x9d, 0xca, 0xf8, 0xe0, 0xf0, 0x4d, 0xef, 0xfa, 0x9d, 0xca, 0xf8, 0xe0, 0xf0 } }, { "\x15\x31\xea\x64\xa1\xb4\x17\xd9\xea\x6a\xe5\x3b\x9e\xad\x62\x30\x99\x85\x50\x60\x55\x4a\x41\xf0\xe8\xa6\xe6\x60\xa5\x43\xd5\xcd\x91\x4f\xac\xaf\xc2\xa6\x07\x22\x7b\xcc\x8c\xf8\x78\xa6\xfd\x70\x93\xd5\x92\xef\x76\x61\x9c\x9b\x34\x9a\xa6\xef\xd3\x89\x11\x1a\x47\xd7\x86\x0a\xdd", 69, { 0x1c, 0xe7, 0x33, 0xa7, 0x61, 0x2b, 0xde, 0x8b, 0x5e, 0xc0, 0xc0, 0xd0, 0x45, 0xc1, 0xb4, 0x66 }, { 0xc3, 0xdc, 0xf3, 0x0d, 0x72, 0x9d, 0x96, 0x7a, 0xc3, 0xdc, 0xf3, 0x0d, 0x72, 0x9d, 0x96, 0x7a } }, { "\xdf\x6b\x28\x3b\x07\x75\xce\xbf\x97\x59\x0b\x99\x49\xce\x9a\x68\xcc\x0f\xcf\x40\x7d\x4f\x2b\x8f\xac\x69\x9a\x90\x70\x9e\xee\xf0\xdc\x3d\xaa\xee\x03\x95\x43\x9b\xeb\x85\x4d\xaa\xd2\xab\x30\x6c\x60\x83\x5b\x83\xcb\x17\xd6\x61\x9a\xb4\x6e\x37\x60\x7c\x36\xe8\xf5\xfc\x20\xae\xf7\x9d", 70, { 0x94, 0xa3, 0xf4, 0xc3, 0x47, 0x4f, 0x8f, 0xa2, 0x22, 0x40, 0x48, 0x9c, 0x17, 0x37, 0xae, 0x83 }, { 0x4f, 0x6b, 0x35, 0x93, 0x5e, 0xd2, 0xb6, 0x16, 0x4f, 0x6b, 0x35, 0x93, 0x5e, 0xd2, 0xb6, 0x16 } }, { "\x45\x2c\xea\x15\xa6\xba\x93\x13\x7d\x7a\xa4\xb8\x23\x58\xf1\x79\x8a\x62\x04\xf9\x0f\x48\xb4\x6f\x27\x37\xd8\x35\x1b\xf9\x3b\x6e\xf6\x0e\xcf\x52\x5a\x05\x55\x06\x6b\x5f\x91\x15\x52\x15\xc2\x30\xff\x2f\x21\xea\xd3\x83\xf7\xa7\x2c\x55\x16\x8d\x0f\x03\x5a\x0d\xf5\x31\x1d\x3c\x06\x29\xc8", 71, { 0xe1, 0xac, 0x61, 0xfd, 0xec, 0x47, 0xdf, 0x52, 0x17, 0x4f, 0xf7, 0x61, 0x07, 0xb0, 0x4f, 0x3c }, { 0xe8, 0x71, 0x9c, 0x0d, 0x9c, 0x03, 0x97, 0x6a, 0xe8, 0x71, 0x9c, 0x0d, 0x9c, 0x03, 0x97, 0x6a } }, { "\xf8\x2b\x77\xf2\x71\x37\x70\x97\x27\xd5\xa5\x0d\x60\xbc\x7a\x1a\x06\x22\x86\xf2\x2c\xa7\xe0\x1d\x9d\x67\x84\x98\xf5\xbf\x71\x38\x87\xe1\xf2\x0a\xc6\x2f\x78\x63\x7f\x3f\xc3\xc7\x3f\x25\xfe\x20\x01\x1a\xe7\x29\xb5\x7f\x3e\xb8\xf9\x25\x05\x60\x1e\x6d\x07\xd3\x35\x47\x4a\xcd\x78\xef\x84\x78", 72, { 0x17, 0xfb, 0x57, 0x7d, 0x14, 0x3d, 0x5d, 0x87, 0xe7, 0xf5, 0x9a, 0xb5, 0x27, 0xa7, 0x66, 0xb4 }, { 0x8f, 0x00, 0x0f, 0x84, 0x29, 0xf8, 0x2d, 0x5b, 0x8f, 0x00, 0x0f, 0x84, 0x29, 0xf8, 0x2d, 0x5b } }, { "\x6f\xc5\xd1\x4a\xbd\x27\xe8\xb0\xd3\x95\x30\x41\x51\xd0\x1c\x27\x67\xc1\x31\x3b\x98\x03\x3a\xee\xea\xeb\x5a\xee\x99\xa7\xda\xb5\xee\xc1\xbe\x6c\x34\x10\xf6\xb0\x6c\x33\x48\xc9\x75\x19\x2a\xe6\x6b\xa9\xa6\x41\x88\xd6\x5e\x65\x31\xef\xc8\xe0\x3e\x9a\x54\x7e\xd5\x18\xad\x4c\x0f\x62\x53\x36\xb5", 73, { 0x5e, 0x2b, 0xac, 0x76, 0x9a, 0xdd, 0xf6, 0x27, 0xfd, 0xf5, 0x83, 0xb6, 0xec, 0xc9, 0x58, 0x7a }, { 0x82, 0x89, 0xc7, 0x34, 0x74, 0xa2, 0x50, 0x55, 0x82, 0x89, 0xc7, 0x34, 0x74, 0xa2, 0x50, 0x55 } }, { "\xb2\xd1\x4a\x80\xbf\x4a\xa4\x8e\xd9\xd7\xde\xdb\x3e\x9e\x3a\x1e\xa3\xdc\x77\x28\x8c\x73\x1b\x98\x2f\x82\x2b\x9e\x4a\x5d\x86\x0c\x4a\xa7\x93\x86\x14\x0c\xa5\xf9\x7c\x96\x76\x25\xee\x80\xcd\x0c\xf3\x3d\x90\x84\xef\x93\x7d\xf0\xcc\x58\xd8\xb2\xb1\x85\x87\x9c\x07\xd3\xe4\xae\x06\x75\x19\x76\x13\x8d", 74, { 0x9b, 0x95, 0x55, 0x04, 0x42, 0x22, 0x2a, 0x37, 0xa9, 0xfd, 0xf9, 0x30, 0xe7, 0x73, 0x22, 0x52 }, { 0x9d, 0x6e, 0xa4, 0xdd, 0x10, 0x69, 0x5c, 0x21, 0x9d, 0x6e, 0xa4, 0xdd, 0x10, 0x69, 0x5c, 0x21 } }, { "\xfe\xc3\x86\xcc\xba\x64\x84\x1c\xf9\x19\x69\x2e\x6e\xf2\xe8\x64\x62\xa9\x74\x3e\x38\x0b\x16\x73\xf7\x74\x59\x21\x53\x40\xaa\x31\x9e\xdb\xdd\xec\x59\x12\x42\x3e\x64\xc5\x2a\x62\xfe\x80\xb6\x25\xc3\xcd\xeb\xb5\xc9\x46\x9a\xc6\x27\x75\x4d\x47\x6a\x6f\x3b\x74\x7e\x9a\x4c\x5a\xfb\x75\x3f\xdc\x53\xad\x19", 75, { 0x61, 0xe0, 0x10, 0xeb, 0x6d, 0xc7, 0xa3, 0x8e, 0x6b, 0x90, 0x30, 0xa4, 0x54, 0x37, 0x97, 0xb5 }, { 0x01, 0x31, 0x3f, 0xdf, 0x3e, 0x55, 0x37, 0x93, 0x01, 0x31, 0x3f, 0xdf, 0x3e, 0x55, 0x37, 0x93 } }, { "\xc6\x59\x0a\xac\x92\xb2\x48\xa1\x4d\x30\x03\x14\xe6\xcf\xdd\x39\xbc\x97\x14\x70\xd3\xe8\x65\x79\x5d\xc1\x37\xf3\xdb\x67\xe9\xb7\x91\xba\x8c\x4b\x8b\x6f\xdd\xd3\x84\xbd\x91\x32\xcd\x17\x76\x56\x8d\xc5\xff\xaf\x87\xa7\x8f\x85\x6f\x26\x13\x72\x95\x34\x46\x21\xe3\xa2\x2c\x0e\xbf\x28\xd2\x66\xad\x2b\xef\x43", 76, { 0x26, 0x23, 0x4f, 0x57, 0xbb, 0x65, 0xda, 0xaa, 0x3c, 0xa6, 0x7f, 0xc9, 0xa5, 0xf4, 0x91, 0x81 }, { 0x70, 0xe9, 0xc4, 0x39, 0x1a, 0xd1, 0xb7, 0x83, 0x70, 0xe9, 0xc4, 0x39, 0x1a, 0xd1, 0xb7, 0x83 } }, { "\xb1\x11\x15\xe7\xe5\xd9\xa1\x8a\xb1\x7b\x68\xb2\xb6\x31\xcb\xe5\xed\x27\x14\x85\x44\x31\xc7\x8b\x24\x9d\x0d\xab\xdf\xa4\xbe\x75\xb8\x32\x89\x56\x5a\x68\xab\x82\x5c\x81\xf8\x78\xe9\xe6\x41\x00\xd0\x62\xf6\x24\x08\x39\xe3\x4d\x65\xfc\x5e\xba\x4a\x3f\xe2\x1f\x0f\x6a\x78\x02\x83\x53\x32\xac\x1d\x7e\xb7\x08\xf4", 77, { 0x53, 0x2e, 0xe9, 0xe5, 0xf7, 0xa7, 0x74, 0x14, 0x0c, 0xb6, 0x4c, 0xa2, 0xb0, 0xe6, 0xd5, 0xf7 }, { 0xc1, 0xe7, 0x96, 0x6e, 0xb1, 0x3f, 0x44, 0x8a, 0xc1, 0xe7, 0x96, 0x6e, 0xb1, 0x3f, 0x44, 0x8a } }, { "\x08\xa8\x5c\x6b\x58\x8b\x3f\xa6\xc6\x74\x46\xc1\xd0\x3e\x75\x04\x1b\x37\x9b\xa6\xc0\xdb\xd8\x41\x6c\xef\x7b\x0c\x20\xbe\xf9\xc3\xd9\x97\xce\x33\xa0\x2a\xdb\xc9\x18\x0b\xbd\x52\x02\x42\x3d\xd3\xcd\x6d\xde\x2a\x00\x13\x61\x51\x04\x74\x82\x00\x4f\x18\x52\x98\xb8\xe4\x29\x19\x67\x32\x81\x7c\x99\xa4\xb5\xdf\xf4\xb6", 78, { 0x29, 0xc8, 0x3d, 0x7b, 0x62, 0x9a, 0x52, 0x28, 0xf4, 0x40, 0x81, 0xc7, 0x73, 0x08, 0x5e, 0x1f }, { 0x2a, 0x82, 0x5c, 0x87, 0x5e, 0x02, 0x6b, 0xc3, 0x2a, 0x82, 0x5c, 0x87, 0x5e, 0x02, 0x6b, 0xc3 } }, { "\x0b\x93\x62\x32\x10\x85\xe1\x8f\x73\x00\x23\x30\xe5\x1f\x18\xa7\xdf\x69\x5a\x87\x5c\xfe\xcd\x80\xcc\x99\x52\x04\xa2\xec\x28\x64\xaf\x4d\x7e\x24\xb7\x6c\xb3\x43\x6b\xc4\x04\x92\xe1\xa7\x71\xeb\x4c\xc9\xd9\xf8\x04\x67\xe9\x07\x62\xdd\xd5\x00\x5b\x76\xe6\x31\xc9\x85\x00\x2b\x1a\x37\x26\x91\x35\x4c\xa4\x2b\xec\x1d\x38", 79, { 0x7b, 0xd5, 0x6f, 0x86, 0x16, 0x3a, 0xff, 0x0e, 0x67, 0xbd, 0xab, 0xf8, 0xe7, 0x24, 0xe5, 0xcf }, { 0xfb, 0x9d, 0x92, 0x5b, 0xf1, 0x4c, 0x63, 0x44, 0xfb, 0x9d, 0x92, 0x5b, 0xf1, 0x4c, 0x63, 0x44 } }, { "\xd8\x24\x34\x7b\x68\x21\x72\x15\x9f\x7d\x09\x37\x31\x5d\x8d\xbe\x81\x12\xd4\x4c\x8a\x5a\x27\xdb\x6c\x29\x14\x78\xc8\x1f\x32\x79\xbc\x47\x54\x83\xd2\x8c\x77\x1e\x08\xb0\x2a\x51\xe7\xa9\x84\xbd\xac\xdd\x68\xbd\x56\xe9\x78\xac\x10\x16\x5e\xd2\x31\xaa\xf9\xcd\x1e\xbb\x4c\xcc\xd9\x2d\xd5\x05\x2e\x31\xae\x20\x2c\xf0\x71\xe7", 80, { 0xd6, 0x83, 0x14, 0x82, 0x66, 0x96, 0xdb, 0x62, 0xea, 0x76, 0x23, 0x92, 0x93, 0xd0, 0xdb, 0x0b }, { 0x6c, 0x45, 0xe2, 0xd2, 0xa0, 0xe7, 0x6b, 0x2b, 0x6c, 0x45, 0xe2, 0xd2, 0xa0, 0xe7, 0x6b, 0x2b } }, { "\xb3\x07\xbc\x67\xf0\xfb\x08\x0f\x0e\x23\x59\xa1\xac\xb6\x5f\xf8\xc9\xd8\xe1\x8a\x10\xb6\xd8\x0b\xed\x8d\x03\xc7\xd7\xea\x2d\xee\xcc\xe6\xb7\xf6\x84\xda\x24\xc6\xc7\x04\x10\xf8\x17\x0d\x97\x12\xde\xe1\xe6\x91\xbb\x2c\x28\x9b\x84\x94\x31\x1d\x95\x03\x66\x1c\x23\xe4\x46\xe1\x89\x1e\x84\x27\xd4\x4b\x97\xb3\x05\xf6\x70\xcf\x0a", 81, { 0x4e, 0x1b, 0x3d, 0x32, 0xf1, 0xd0, 0xd7, 0x17, 0xff, 0xed, 0x39, 0xeb, 0x08, 0xcc, 0xb3, 0x60 }, { 0x49, 0xc3, 0xe6, 0xab, 0x5b, 0x15, 0x7d, 0x2a, 0x49, 0xc3, 0xe6, 0xab, 0x5b, 0x15, 0x7d, 0x2a } }, { "\x96\x5f\x13\x62\x21\x7f\xb8\x50\x38\x67\x9e\x84\xaa\xc5\x97\x8e\x8a\xb8\x7d\xd1\x94\x06\x05\x4d\x0b\x33\xd6\x09\x28\x2a\x08\x38\x9b\xe5\xbc\x58\xc9\xb5\x19\x8a\x72\x45\x60\xc7\x89\x4b\x36\x89\xbc\xa6\x20\x6e\xe1\x97\x47\x39\xdd\x74\x7b\x65\xff\x1b\xe7\x0e\xd7\x30\x38\xdb\x57\x90\x88\x5a\x6d\xef\x4e\x00\xc6\x6d\x09\x8b\xe7\x8d", 82, { 0x4d, 0xd8, 0x38, 0xea, 0x16, 0xd6, 0xb7, 0xd7, 0x46, 0x51, 0x31, 0xaa, 0xf1, 0x43, 0x5e, 0xac }, { 0x1d, 0x39, 0x9d, 0xf9, 0xd0, 0x32, 0xca, 0x16, 0x1d, 0x39, 0x9d, 0xf9, 0xd0, 0x32, 0xca, 0x16 } }, { "\xe5\xb6\x2c\x14\x61\xea\x00\xec\xab\x68\x58\xca\x6f\x3e\x1d\x7e\xb0\x05\x6f\x9c\x68\xd1\xd8\x9e\x83\x98\x27\x6b\x1f\x27\xb1\x13\xd6\xbc\xa2\x85\x14\x6c\x75\xc2\x8a\x79\x72\x6b\x99\xee\x61\x11\x0b\xca\x31\xea\x65\x55\x76\xa8\x64\x26\x5a\xea\x21\xc2\xa3\x6b\x85\x1f\xae\xbd\xe9\x8a\x8c\xd6\xec\x47\x22\x26\x3b\x2f\xea\xce\x42\xed\x16", 83, { 0x9e, 0x55, 0x16, 0x9f, 0x73, 0x73, 0x1f, 0x72, 0xed, 0x8b, 0x9f, 0x1f, 0xb5, 0x95, 0x87, 0xbe }, { 0x86, 0x70, 0x4f, 0xcb, 0xba, 0x9b, 0xc0, 0x4c, 0x86, 0x70, 0x4f, 0xcb, 0xba, 0x9b, 0xc0, 0x4c } }, { "\x68\xa9\x14\x5b\xb5\xc1\xab\x92\x6a\x8a\x06\x6c\x57\x3a\x43\xab\x77\x94\x46\xfd\x00\xf8\x1c\xeb\x4d\x93\x3b\x59\xc6\x79\x05\xe8\x72\xc6\x81\x99\x34\xdc\xa9\xff\x0d\xa0\x3c\x40\x25\x04\x90\xac\xe7\x84\xc0\x69\xd4\x05\xef\x11\x12\xe9\x99\x6a\xbb\x56\x05\x77\x93\x9d\xb3\x86\xc7\xa4\xfa\x33\xc3\x16\xf6\x8f\xe9\x19\x7d\xb5\x4e\xa8\x49\xc0", 84, { 0x0f, 0xf7, 0x02, 0x1d, 0xa7, 0x2f, 0x69, 0x12, 0x60, 0xfb, 0xfb, 0xad, 0x2a, 0x61, 0x30, 0xd6 }, { 0x85, 0x29, 0x73, 0x63, 0x21, 0x02, 0x86, 0x55, 0x85, 0x29, 0x73, 0x63, 0x21, 0x02, 0x86, 0x55 } }, { "\x30\xd1\xa1\xfd\x6d\x0e\x91\x15\x34\x8e\x1a\x24\x33\x7a\x51\x46\xe7\x04\x4d\x40\xe6\x97\x13\x61\xf3\x58\xb6\x6b\xe3\xaa\xd0\x10\xee\x49\x98\xf1\xa0\xfb\xcb\x49\xc4\x05\x38\x8b\x28\xa0\x89\x19\x19\x78\x7f\xa6\x2a\x33\x0a\x68\x83\x58\x3e\x4c\xae\xfd\x84\xb4\xdd\x92\x4b\x24\x6e\xb7\x35\x5b\xed\x12\x9a\x96\x2a\x3f\xfb\x3b\xf5\xd5\x4a\x97\x03", 85, { 0xe8, 0xfd, 0x65, 0x4b, 0x4e, 0xb0, 0x00, 0xff, 0x77, 0x93, 0xb5, 0xd0, 0x50, 0xbf, 0x84, 0x6a }, { 0x46, 0xdd, 0x04, 0xb6, 0xc5, 0x5a, 0x76, 0x27, 0x46, 0xdd, 0x04, 0xb6, 0xc5, 0x5a, 0x76, 0x27 } }, { "\x6b\xa2\x47\x58\xd9\x70\x6e\x39\xfc\xd5\x94\x0a\xeb\x16\x35\xfb\x31\x8f\x0c\xe2\x77\x9a\xa1\x1d\x66\xce\x66\xad\x86\x50\x60\xd8\xf4\xdc\x5f\xb2\xf6\xcf\xe1\x76\xf9\x6a\x7f\xfb\x03\xe5\xb2\x1e\xde\x0c\x3a\x04\x2d\x7d\x67\x70\x45\x2e\x97\x65\xac\x15\xbd\x4b\xb8\xe1\xcf\x5e\x5b\x0e\x37\x42\x82\xda\xbb\xb6\xca\xfb\x33\xe0\xf9\xc7\x45\xba\x6c\x61", 86, { 0x6d, 0x22, 0x63, 0x98, 0x9e, 0x37, 0xf9, 0x34, 0x56, 0xf7, 0xc0, 0x77, 0xc4, 0x42, 0xf1, 0x30 }, { 0x4a, 0xdf, 0xfb, 0x13, 0xe1, 0xf4, 0xcc, 0x98, 0x4a, 0xdf, 0xfb, 0x13, 0xe1, 0xf4, 0xcc, 0x98 } }, { "\xcd\xa5\x25\x30\xfe\xd9\xf2\xed\x4b\x3b\x39\xc5\xea\xdb\xd2\xa2\x14\x51\xb3\xa9\xf4\xc0\xe0\x3b\x4b\x72\xb0\x2e\x78\xe2\xa6\x93\x13\x8b\x22\xc1\x5c\x03\xbb\x43\x17\xdc\xc7\x79\x5b\x31\x08\x87\x0a\x31\xf9\x2a\x38\x76\x91\xaa\x23\xe6\x7c\x1e\xf8\x93\x57\xc1\x72\x8d\x66\x8c\x7e\x55\x33\x78\x6e\x48\x40\x10\x0a\xd2\xc7\x9f\xf4\x3d\x46\xa9\x8b\x54\xf9", 87, { 0x84, 0xf4, 0xc6, 0xda, 0x42, 0xa8, 0x24, 0x21, 0x87, 0x49, 0xdb, 0x9e, 0x3b, 0x68, 0x57, 0x5d }, { 0xf4, 0x57, 0xbf, 0x8a, 0x8e, 0x8f, 0x31, 0x1c, 0xf4, 0x57, 0xbf, 0x8a, 0x8e, 0x8f, 0x31, 0x1c } }, { "\x62\xe8\x6f\x5a\xd6\xc0\x2e\x06\xef\x54\x17\xe7\x26\xba\x79\xdd\xcc\xea\x88\x60\xa2\x0b\x70\xb1\x85\xa3\xea\xba\x1c\x63\xbd\x61\x32\xb5\xbd\x08\x89\xe6\x59\xb5\x21\x00\x82\x32\x98\xfc\xc6\x1d\xa3\x08\xae\xeb\x84\x2d\xcb\x19\x7c\x0b\xd9\x9a\x7c\x11\x8e\xe3\xfb\x44\xa0\x07\x61\x18\x55\xd9\xbf\x31\xb4\x29\xf0\xf4\x0a\x14\x02\x32\xe2\x89\xc0\xb3\x06\x1b", 88, { 0x11, 0x39, 0x7c, 0x62, 0x34, 0x62, 0x46, 0x8b, 0xfc, 0x65, 0x10, 0xaf, 0xa0, 0x53, 0xc0, 0xee }, { 0x1b, 0x4f, 0x4f, 0x2f, 0x12, 0xfa, 0xff, 0x30, 0x1b, 0x4f, 0x4f, 0x2f, 0x12, 0xfa, 0xff, 0x30 } }, { "\x85\xed\x3f\xeb\x0b\x3e\x48\xc9\xae\x32\xf1\xf6\x47\x95\x42\xdd\xd3\x99\x71\xb7\x0c\xf4\x6c\xb8\x8a\x9d\x72\xb3\x8d\x1b\xee\x03\x2e\x0e\x75\xbe\x20\x1d\xeb\x9f\xa9\xab\xd0\x74\x8e\x43\x49\xaf\xc3\xb8\xba\x85\x21\x43\xe7\xe0\x59\xf0\x02\x1a\x05\x5b\x88\x2a\x27\x16\xda\x01\x09\x1b\x48\xc8\x40\x4f\x18\xd8\xc9\x74\x7a\xca\xfd\x5a\x01\x57\x43\x46\x6e\x64\xfe", 89, { 0xd7, 0x07, 0x57, 0x84, 0xed, 0xa4, 0x8f, 0x30, 0x7f, 0xb3, 0xa7, 0x86, 0xac, 0x10, 0x9f, 0xc5 }, { 0xfa, 0xf3, 0x19, 0xdb, 0x73, 0x61, 0xff, 0x0b, 0xfa, 0xf3, 0x19, 0xdb, 0x73, 0x61, 0xff, 0x0b } }, { "\x86\x39\x69\x83\xeb\x8b\x72\xc7\xfb\x99\x31\xcd\x8a\x0f\x83\xa7\x8e\x87\x40\x4a\xbf\x4a\x5d\xcc\x06\x45\xcb\xfd\x63\x2a\x8e\x31\x08\x03\x7a\x61\xb5\x37\x7b\x81\x00\x07\x8d\x29\xf5\xb9\x0f\x5c\x1c\xcc\x75\xce\x78\x2b\x58\x2e\xaa\x12\xf2\xb2\x16\x0a\xf9\x2a\xd9\xab\x65\xd4\x66\x71\x88\xc4\x8d\x40\xb7\xbb\x27\x5b\x16\x1f\x5d\x25\x20\xb9\xe7\xba\x32\xbd\x1d\xe0", 90, { 0x30, 0xf8, 0x10, 0x07, 0xa8, 0x7b, 0xa1, 0x4c, 0x3b, 0x2d, 0xb9, 0x4b, 0x38, 0xfe, 0x15, 0x56 }, { 0x42, 0xb5, 0x42, 0x7c, 0x61, 0x7a, 0x10, 0xf9, 0x42, 0xb5, 0x42, 0x7c, 0x61, 0x7a, 0x10, 0xf9 } }, { "\xd6\x87\x00\xf7\x2c\x35\x8a\x60\x3c\x7a\xd4\xd9\x03\xb2\xae\xdc\xa0\x0d\x6e\xed\x19\x1c\xcc\x2c\xec\x26\x3f\xf3\x8b\xed\xf4\x21\xb4\x92\xde\xcb\x08\x85\x46\x35\xca\xac\x9a\xf9\x7c\xca\x66\xd1\x43\x81\xda\x7d\xcd\x60\x11\x13\x0e\x98\xce\x4f\x53\xbf\x19\x85\x8a\x39\x99\x28\x89\x4e\x25\xca\xcb\x7b\x79\x80\xb1\x36\x22\x74\xed\xe5\xf6\xb3\x7b\x92\xa2\xa7\x25\x4d\xed", 91, { 0xe1, 0x9a, 0xe9, 0x38, 0x03, 0x65, 0xf0, 0xb3, 0x87, 0x50, 0x0f, 0x5c, 0xd2, 0x21, 0x09, 0x9d }, { 0xc3, 0x8a, 0xd5, 0x68, 0xc6, 0xc4, 0xff, 0x8c, 0xc3, 0x8a, 0xd5, 0x68, 0xc6, 0xc4, 0xff, 0x8c } }, { "\x60\xd0\x8c\xc0\xac\x24\x6b\xf7\xeb\xbe\x48\x24\x83\x80\x9e\xc2\xaa\x7c\x32\x30\x0f\x0c\xeb\x25\x48\x30\x66\xd8\xa1\xee\xf8\x2e\x3f\xb3\x6b\x53\x7b\x27\xeb\x15\x44\x59\x40\x0f\xcf\xfd\xa5\xad\x3e\x70\x6d\x2a\x8a\xa9\x03\x35\xd9\x40\x89\x81\xb7\x31\xc3\xdf\x1f\x10\xf0\xd8\xb3\xea\x16\x60\x32\x0a\x97\xb8\xe3\x04\x77\x2b\xb1\x82\x55\x7d\xa6\x82\x97\x4d\x78\x11\x41\x6f", 92, { 0x1b, 0xef, 0xb5, 0x5d, 0xf7, 0xb0, 0x88, 0xaf, 0x6c, 0x7e, 0x06, 0xe7, 0x6f, 0xc0, 0x93, 0x6c }, { 0x96, 0x13, 0xcb, 0xab, 0x7c, 0x1a, 0xa3, 0x8f, 0x96, 0x13, 0xcb, 0xab, 0x7c, 0x1a, 0xa3, 0x8f } }, { "\x19\x8d\x64\x27\x97\x46\x6b\xc6\x76\x37\xdb\x88\x8c\x47\x51\xd4\x9e\x52\x5e\x88\xd7\x61\xb6\x0f\x98\xaf\x57\x21\x5d\xef\x6f\xd6\x72\xb9\x9e\xc0\x06\xce\x32\x10\xb8\x49\x6f\xef\x7b\xed\x4b\x39\x81\x2e\xf9\x8f\xee\xf9\x4e\xa9\x4a\x4c\xfe\xb0\x9f\x2c\x82\x34\xcd\xb0\x07\x5e\xc4\x8f\xbb\x6c\xd3\xdb\x0a\xe5\x80\xfa\x0c\x8d\x1c\xfa\xee\x23\x9a\xbe\x67\x1f\x18\x21\x01\xaa\x37", 93, { 0x77, 0x65, 0x26, 0xc5, 0x1e, 0xc3, 0x17, 0x49, 0x55, 0xc0, 0xeb, 0xf8, 0xd4, 0xff, 0x5d, 0xcc }, { 0xd1, 0xdf, 0x56, 0x22, 0xb1, 0x30, 0xc7, 0x83, 0xd1, 0xdf, 0x56, 0x22, 0xb1, 0x30, 0xc7, 0x83 } }, { "\x1c\x7b\x03\xef\x82\xac\xb5\x3f\x96\xaf\x2f\xa6\xb2\xc7\x86\x4e\xfe\x66\xf2\xf1\x14\x1f\x3f\x9b\x42\xe3\x44\xe9\x83\x89\x8e\x06\x0c\x26\xfe\x18\x57\x88\xb2\x34\xab\x8b\xc3\xe6\x3b\x2c\x6a\x53\xa0\x11\x54\x2d\x98\x26\xaa\x98\xf6\xdc\x42\x30\x82\x6f\xbf\xaa\xc3\xf6\x1d\x37\x15\x1b\xc7\x32\xc5\xfc\x2b\x3b\xeb\x0b\x79\x1e\x49\x21\x0e\x11\x63\xce\xe9\xd3\x14\xc8\xfe\xa8\x51\x82", 94, { 0xd6, 0xc5, 0xae, 0xa7, 0x0f, 0x85, 0x62, 0x61, 0xbb, 0xf0, 0x2c, 0x00, 0x4a, 0xbf, 0x69, 0xb2 }, { 0x02, 0x95, 0xf1, 0xde, 0x6f, 0xd4, 0xff, 0xf0, 0x02, 0x95, 0xf1, 0xde, 0x6f, 0xd4, 0xff, 0xf0 } }, { "\x29\x6b\xf9\x3c\x5e\x11\xe2\x36\xfa\xad\x77\x84\x23\x04\x5b\x16\xc1\x7f\x42\x1e\xd6\xba\xd1\xd6\x1f\x7f\x0a\x0b\x37\x59\xef\x6d\x87\x53\xf2\xef\x85\xe4\x81\xc3\x9d\x58\x26\x83\xcb\xd8\xa9\xa5\x04\xa2\x85\xe5\x31\x8a\xe5\xe6\x0d\x63\x7c\x7a\xf1\x64\x95\xee\xfe\x03\x6a\xfb\x53\x54\xaa\x88\xbb\xce\xc5\x23\xc0\xcd\x20\x43\xb3\x8c\xdd\x99\x5f\x76\x3f\x4c\x85\xfc\x77\x28\xb2\x0f\x12", 95, { 0xac, 0x34, 0x4c, 0x7d, 0xcf, 0x4d, 0xb2, 0xbc, 0xd5, 0x4f, 0x56, 0x0a, 0x82, 0x4f, 0x9a, 0x82 }, { 0xd3, 0x23, 0x31, 0xe1, 0x0f, 0x63, 0xe7, 0x04, 0xd3, 0x23, 0x31, 0xe1, 0x0f, 0x63, 0xe7, 0x04 } }, { "\xad\x53\xe9\xd3\xb2\x64\x88\x08\xff\x5d\x32\x06\xe1\x51\x80\x89\x6a\x8f\x66\x19\xd8\x70\xec\xbc\x95\xca\xc2\x5a\x0d\x8b\x4f\x28\xe8\x41\x2b\xdb\xdb\xed\xa4\xfe\x5a\x0c\x2a\xd2\xfc\xef\xc4\xae\x76\x49\x86\x35\x82\x13\x45\x26\x06\x57\xe8\x52\x4d\xe0\xd5\xd9\x78\x03\xeb\xc1\x05\xef\xe6\x94\xa6\xc7\xd9\xa2\x41\xd3\xe0\xae\xf1\xd6\xe2\xc5\x6f\xde\x66\x85\x57\x73\xde\x76\x55\xc5\x3d\xe9", 96, { 0x80, 0xeb, 0xe1, 0xae, 0x47, 0x0d, 0x45, 0x73, 0x86, 0x0f, 0xa1, 0xdf, 0x89, 0x2f, 0x6c, 0x8f }, { 0x47, 0x49, 0x5f, 0x08, 0x90, 0x14, 0xb1, 0x2e, 0x47, 0x49, 0x5f, 0x08, 0x90, 0x14, 0xb1, 0x2e } }, { "\x07\x05\x83\x98\x52\x5a\xd7\xaa\xdd\x7f\x6e\xaa\xb9\x05\x36\x7f\xf1\xec\xe2\x8a\x31\x17\xe2\x07\x63\xc7\xd2\x07\xe9\x33\x56\xbd\xea\x10\xcf\xde\xc2\x11\x05\x75\x94\x6b\x6b\x38\x5e\xcf\xc8\x8e\xbc\x11\xf5\x2d\x0e\xc4\x0b\x32\xe5\x3c\x23\x51\xfe\x65\x1a\xdc\x16\xc4\x86\xeb\xd1\xd2\x4c\x56\x2c\x55\x84\x14\x70\xe8\x60\xb0\x09\x74\x1b\x49\x12\x64\x2f\xb8\x59\x6a\x44\x38\x19\x0c\x39\xd6\x52", 97, { 0xdd, 0x5f, 0x38, 0xac, 0x99, 0x5d, 0x49, 0xe3, 0xb6, 0x42, 0xb5, 0xf1, 0x77, 0x41, 0x0e, 0xb6 }, { 0x26, 0x42, 0xcc, 0xc5, 0xde, 0xcd, 0x58, 0x0d, 0x26, 0x42, 0xcc, 0xc5, 0xde, 0xcd, 0x58, 0x0d } }, { "\x69\xdb\x99\xb2\x4a\xec\x53\x9a\x77\x03\xc0\xd5\x81\xd5\x0e\x9c\xdd\x04\x19\xe2\xff\x1f\xc0\x4b\xf0\x30\x96\x2b\x62\x02\x1e\x7f\x84\xa8\x19\x47\xa3\xdc\xb5\x62\x6f\xdc\x40\x66\x69\xb2\x1f\x58\x9b\x8d\x51\xc0\x7f\xe2\x4d\xbc\x8a\xc9\x6d\x71\x29\xfb\x72\xf0\x0c\xa5\xf7\xfb\x2a\x6f\x2a\x54\x52\x58\x4f\x6d\xbe\xd3\xfe\x37\xc5\x0f\xd9\x4e\x45\x45\x4a\x7c\x43\x2b\x35\x1b\x41\xaa\x11\x5c\x5a\xed", 98, { 0xb3, 0x7b, 0x88, 0x17, 0x77, 0x93, 0x07, 0x1a, 0xb4, 0xec, 0x31, 0x3d, 0xea, 0x26, 0x30, 0x27 }, { 0x16, 0x41, 0xb1, 0x31, 0x2f, 0xd3, 0x9f, 0x87, 0x16, 0x41, 0xb1, 0x31, 0x2f, 0xd3, 0x9f, 0x87 } }, { "\x31\xec\x6c\xcc\xe5\x86\x40\xb4\xb7\x69\x06\x3d\x51\xd9\x2b\x4a\x12\x6e\x3d\xd0\xc2\x3e\x9d\x1c\x74\x75\x70\x5b\xc2\xda\xb7\x16\xc5\x22\x32\x16\x45\x28\x8b\x00\xcb\x13\xc3\xf6\x4e\xce\xa6\x0e\xe5\xf3\xf0\x5f\x86\x4d\x6d\xdf\xdc\x18\xe3\x30\x50\xe8\x84\x7a\x55\xb5\xbd\x1c\x81\xad\x28\xcb\xdf\x7b\x06\x24\x0c\xb9\xd4\x85\x07\xfa\xc8\x33\x7c\x04\xc9\x8e\xfb\xf3\x4f\x0c\x3b\xeb\xab\xd5\xd4\x9a\x0d", 99, { 0x04, 0xe9, 0xd9, 0x48, 0x7d, 0xf8, 0xff, 0xb1, 0xd1, 0x04, 0xcf, 0xc7, 0x43, 0x31, 0x5c, 0xd6 }, { 0x0c, 0xc0, 0x2b, 0xd5, 0xf7, 0xd7, 0x1e, 0xeb, 0x0c, 0xc0, 0x2b, 0xd5, 0xf7, 0xd7, 0x1e, 0xeb } }, { "\x42\x0e\x83\xe3\xf8\x3a\x6f\xf2\xbd\xa7\xb3\x07\x7d\x5e\x41\xce\xd8\xe3\x8c\xed\xff\x06\x67\x73\x62\x60\x87\x4b\x2a\x2f\x4a\x0f\x95\x10\xde\x72\xc9\x0e\xae\x1d\x0d\xcd\x02\x70\x36\xe5\xe8\xe0\x0e\x26\x59\x55\x9d\x01\xb1\x20\xcd\x8d\xf1\x47\x91\x1f\x31\xa3\x80\x42\xa5\x32\x1c\x61\x4c\x24\x0c\x2f\xf6\xe8\x0d\x9c\xc4\x00\x53\x57\x3f\xa8\xbe\x26\xb5\xcb\x6d\xbe\x57\xd3\x53\xd5\xb1\x55\xd4\xf6\x89\x82", 100, { 0x09, 0x18, 0x2e, 0x65, 0x01, 0xbb, 0x6c, 0xbc, 0x2e, 0xf8, 0xe2, 0x62, 0x84, 0x4f, 0xbc, 0xd6 }, { 0x6d, 0xa3, 0x2d, 0x1c, 0x96, 0x76, 0xe7, 0xe2, 0x6d, 0xa3, 0x2d, 0x1c, 0x96, 0x76, 0xe7, 0xe2 } }, { "\x61\x6b\xc7\x1c\x58\xba\x21\x50\x31\xb7\x49\xdf\x2a\x76\x82\x22\x2c\x5f\x74\x96\x62\xf7\x49\x3a\x29\x74\x95\x88\x7a\x81\x44\x2d\xcc\xc6\x59\x63\xe5\x6a\x68\xbf\x3b\x24\xd7\xb6\x2c\xb6\xcd\xa8\x3d\x0e\x70\x7d\x69\x94\x10\xbd\xee\x63\x9a\x5e\x6c\x61\x3a\xe5\x94\x95\x30\x3c\x9b\x02\xc2\x42\x7f\x12\x76\xcd\xa6\xcd\x87\x00\xb9\x08\x43\x55\x2a\xc3\x62\xd8\xdb\x38\x6c\x9a\x45\xa8\xd4\xd3\xd9\xc7\xe9\xb4\xf2", 101, { 0x20, 0xfc, 0x88, 0x97, 0x26, 0x73, 0x64, 0xd5, 0x17, 0xf5, 0xd5, 0x35, 0x6c, 0xda, 0xde, 0xad }, { 0x63, 0x26, 0xcd, 0xc0, 0xd9, 0x07, 0x6b, 0x6a, 0x63, 0x26, 0xcd, 0xc0, 0xd9, 0x07, 0x6b, 0x6a } }, { "\x1d\xed\xce\x04\x21\xe4\x52\x32\x1b\xe6\x52\x3f\x9c\x9a\xc5\x9f\xeb\x31\x6e\x0f\xda\xdf\xea\x2d\xc9\xb5\x5f\x37\x8f\xd3\x7a\x48\x5a\x24\xc4\xba\x16\xf4\x16\x75\x91\xcb\x66\x6a\x59\x90\x25\xd2\xab\x21\x4c\xe8\x8f\xb0\xd6\x94\x00\x01\x1b\x60\xae\xe2\x81\x2a\x53\xd7\xfd\xa0\x1d\x7b\x76\x1d\x6d\x0d\xf9\x5e\x50\xad\x24\x90\x67\x67\x94\x0b\xb1\x9b\x7d\x3d\x62\x47\x0e\xb6\x0e\xd9\x38\xea\xc0\x8d\xed\xae\x89\x73", 102, { 0x95, 0xba, 0xac, 0x8e, 0xe6, 0x49, 0x05, 0xf7, 0x77, 0xf9, 0x14, 0x8e, 0x85, 0x5c, 0x31, 0x2b }, { 0x4e, 0xcf, 0xab, 0x23, 0x42, 0xa2, 0x14, 0x56, 0x4e, 0xcf, 0xab, 0x23, 0x42, 0xa2, 0x14, 0x56 } }, { "\xce\x1e\xd6\x94\x3f\xe7\x3c\xaf\xfb\x32\x1f\x39\xc5\x22\xed\x5a\x7a\xfa\x3b\x27\xdb\x5b\xe8\x48\x5b\x51\x96\xc6\x1d\x4b\x95\xc4\xf5\x53\x09\x52\xc7\xdf\xdc\xb4\x49\xbd\x77\xf3\x66\xf8\x71\x50\x0a\xc4\x90\x12\x17\x0d\xcd\x48\xd9\xc9\xde\x28\x8c\x0f\x8d\x59\x10\xb7\x7a\xe3\xf4\x69\xe5\x08\x90\xec\x3d\xc6\x68\xe1\xe3\xfc\x90\x88\x64\xc0\xf6\xcb\xb9\x5d\x9e\xb3\x8d\xed\x07\x72\xd2\x84\x03\xf3\x68\xd5\x87\x10\x79", 103, { 0xf7, 0x15, 0x7c, 0x3e, 0x99, 0x31, 0x19, 0x59, 0xd3, 0xd8, 0xcc, 0xf9, 0x88, 0x6d, 0x43, 0x5e }, { 0x62, 0xb5, 0x83, 0x0a, 0xab, 0xd9, 0x79, 0x75, 0x62, 0xb5, 0x83, 0x0a, 0xab, 0xd9, 0x79, 0x75 } }, { "\xb8\x13\x53\x89\x9d\x27\x20\xb6\xd6\xe2\x66\xce\x8d\x54\xd0\xde\x25\x58\xef\xa5\x4b\x84\xf0\xd5\x1e\xe8\x59\x30\x5d\x66\xb3\x5c\xed\xce\x12\x0b\x00\x46\x5a\x9a\x69\x4b\x7f\xa1\x3d\xde\x42\x44\x9f\x9d\x70\x88\x80\xa5\x99\x2b\x74\xec\x07\x94\x31\x6c\xbf\x66\xd3\xc9\xe8\x2b\x7d\x06\x3f\xad\xb7\x9d\x50\x22\x44\xc9\xa3\xe0\x07\x2c\xcd\xe7\x3c\xdc\xc3\x35\xad\xf8\xcf\xe3\xd0\xee\xb1\x17\xea\x81\x89\xfa\x6f\x33\x74\x83", 104, { 0x0e, 0x6b, 0x76, 0x6d, 0x7b, 0xde, 0xbf, 0x7e, 0x4d, 0x13, 0xcf, 0x0c, 0x33, 0xfa, 0xfe, 0xa0 }, { 0x26, 0x14, 0x24, 0xdb, 0x0c, 0x14, 0xad, 0x81, 0x26, 0x14, 0x24, 0xdb, 0x0c, 0x14, 0xad, 0x81 } }, { "\x55\x7b\x93\x59\x48\xe4\x4a\xb5\x8d\x0b\x76\x2d\x80\x87\xa8\xcb\x2d\x7d\x9f\x00\xb2\x91\xc7\x57\x23\xd7\xcd\x73\x03\x52\x11\x48\x2c\xd9\x0f\xe9\xde\x22\x68\x0c\x11\xe8\x9e\x69\xd0\x70\x85\xbf\xc3\x3c\x1a\x38\xba\x09\x3a\x41\xef\x6f\xf3\xc0\xaf\x4d\x8b\x71\x49\xce\x63\x13\x25\x9b\xdf\xdb\x21\xc0\x7d\x99\x01\x35\x6f\x44\xdc\xe6\xbb\xdc\x7f\x0b\xa6\x62\x02\xa5\x64\x8d\xcd\x43\x80\x6c\x2f\x24\x01\x96\x1a\x82\xdc\xb1\xa8", 105, { 0xc7, 0xb6, 0x96, 0x9b, 0xcd, 0x30, 0x78, 0xcc, 0x41, 0x9b, 0x92, 0xc6, 0xf8, 0x90, 0x87, 0xe6 }, { 0x2e, 0xe3, 0x9b, 0x78, 0xdb, 0x09, 0xf4, 0xfd, 0x2e, 0xe3, 0x9b, 0x78, 0xdb, 0x09, 0xf4, 0xfd } }, { "\x1a\x91\x0c\x5b\x6d\x5d\x8e\x77\x92\xbf\xbe\xa4\xdb\x07\x6f\xa9\xac\x56\x17\x68\xe0\xe3\x6a\x84\x51\x05\x93\xc9\xe4\xed\x66\xa2\x6b\xd4\x49\xf5\x26\x17\x42\x32\xca\x34\x9e\x58\x17\xc7\x69\x02\x36\x86\x0d\x09\x6b\x49\xa7\xc1\x54\xfb\x09\x3d\xcc\xa1\xcb\x67\xba\x94\x46\x77\x9f\x27\xac\x42\x4a\x2d\x50\x66\x79\x95\x0b\xab\x84\x42\x94\x80\xb2\x99\x64\xc5\xe9\xc2\xd0\xa8\x2c\xa6\x48\xa2\xd6\xd4\x6e\x28\xaf\x60\xbf\x81\xf1\xcd", 106, { 0x41, 0xf4, 0xd6, 0xaf, 0x20, 0x5b, 0xb7, 0x45, 0x4c, 0x08, 0xe7, 0xb9, 0x3b, 0x27, 0xe4, 0x45 }, { 0x35, 0x7b, 0x6a, 0xd3, 0xfe, 0x2a, 0x78, 0x73, 0x35, 0x7b, 0x6a, 0xd3, 0xfe, 0x2a, 0x78, 0x73 } }, { "\x2a\xde\x8b\x64\x13\x7d\xfe\x0e\x3e\x54\xc5\x82\x15\xd3\x74\xc3\x71\x4d\xf9\x0f\x49\x06\xe1\x72\x1c\xe6\x3f\xe1\x17\x53\x2b\x38\x6d\xdd\x4c\x45\xb5\xf5\xf0\xf0\x97\xcc\xde\x59\xc9\x49\x2f\x48\x0c\x94\x41\x07\x44\xe8\xa7\x5e\xab\x9a\x1b\x25\xc0\x72\x38\x69\xf2\x3e\x91\xe4\x02\xd7\x07\x84\xbd\xed\x87\x74\xee\x80\xec\xa1\x08\xbd\x23\xc1\x48\xeb\x39\x6f\xf6\xe4\x54\xed\x62\x20\xea\x5f\xc7\xd5\xe4\xdb\x75\x45\x63\xfe\x2a\xb5\x2e", 107, { 0x7b, 0x18, 0x89, 0x70, 0xe9, 0x09, 0x1b, 0x04, 0xb7, 0x9f, 0xc4, 0xe7, 0x54, 0xdf, 0xbe, 0x0b }, { 0xe8, 0x69, 0x11, 0xdb, 0x66, 0xed, 0xc9, 0xa3, 0xe8, 0x69, 0x11, 0xdb, 0x66, 0xed, 0xc9, 0xa3 } }, { "\x32\x31\x11\x4e\x93\xe0\x03\x50\x84\xb4\xbb\x55\xcb\xc6\x46\xc0\x47\x3b\x13\xe2\x4f\xa7\x24\x30\x40\x1e\x4d\xdc\x2b\xdd\x57\xe6\x34\xcf\x49\xed\x14\x88\xdf\xd0\x93\xa8\xee\x2c\x36\x3b\xf8\x2d\xc3\xde\x15\xde\x86\x2f\x1e\xab\x55\xa9\xce\xa0\x6d\xdb\x78\x07\xee\xf8\x23\x93\x90\xad\xf2\x7f\x68\x5e\xf8\xa6\xe3\xbc\x0a\x7d\xd9\xd3\x07\xda\x9e\xed\x40\xfa\x89\xe1\xfa\x0f\xec\x42\xe6\xbc\x1c\xa0\x7c\x70\xd5\x54\xa8\xb8\xcc\xf4\x66\xf6", 108, { 0xdc, 0xa6, 0xe8, 0x4a, 0x96, 0xdb, 0xed, 0x8e, 0xec, 0x6d, 0xec, 0xeb, 0xbe, 0xf1, 0x6f, 0xc4 }, { 0x0b, 0x15, 0x39, 0x49, 0x59, 0xbd, 0xc9, 0x3c, 0x0b, 0x15, 0x39, 0x49, 0x59, 0xbd, 0xc9, 0x3c } }, { "\x75\xa7\xf6\xee\x23\x9b\xf5\xeb\x62\xff\x76\xf4\xfe\x7d\xd9\x8c\x23\x11\xa1\xa4\x1e\xe1\xf7\xa1\x4a\xba\x3e\xad\x63\x9b\xd4\x79\xed\x89\x68\xf8\x35\xe7\x39\xbd\xfd\xa7\x32\x17\x96\xf1\x8d\x16\xae\xac\xc1\x2f\x90\xca\x3d\x6b\x87\xee\x0f\x93\x52\x8c\x3b\xc3\xa6\x36\x3d\x0b\xeb\x66\xc1\x4c\xba\xac\xc0\x21\xde\x94\xf4\x9c\x1c\x61\x5d\xcf\xb8\xfc\xb6\xf3\xda\xee\xa3\xc9\x24\xf3\x56\x1c\xc4\xfe\x64\xbb\x53\x07\xe2\x87\xfe\xc0\x5c\xbb\x91", 109, { 0xc2, 0x3a, 0x08, 0xcb, 0xe1, 0xc5, 0x7f, 0x37, 0xd6, 0xf1, 0x53, 0x2b, 0x40, 0xb7, 0x68, 0x03 }, { 0x1a, 0x47, 0x55, 0x57, 0x55, 0x9f, 0xcc, 0x5a, 0x1a, 0x47, 0x55, 0x57, 0x55, 0x9f, 0xcc, 0x5a } }, { "\x1f\xa5\x25\xea\xba\xfc\x20\x81\xf9\x8f\xd7\x4a\xfe\xa7\xa3\x9a\xfa\xd0\xf2\xf0\xb5\xc8\xe4\x97\xc9\x31\xf2\xc8\xc6\x4f\xab\x15\xa1\x06\xf5\xa0\xcb\xff\xb5\x97\x0c\x25\x45\xb0\x60\xa9\x3b\x0a\x0e\xae\x0b\x39\xa6\xd2\x84\xdf\x0e\xbf\xb0\x4e\x26\x54\xf6\xc4\x85\x4b\x9f\xc0\x3e\xbd\xee\x9a\x7d\x27\x2e\x9e\x0a\x1c\x10\xf6\xc5\x49\xd9\x4e\x24\x85\xcf\xaf\x2d\x90\x1f\xc4\x07\xb7\xcc\x85\xe8\x27\xc3\xad\x15\x50\xe8\x35\x80\x9b\x18\x62\xd0\x98", 110, { 0x84, 0x43, 0x13, 0xee, 0xa9, 0xb3, 0x84, 0x4b, 0xe1, 0xa7, 0xaf, 0x53, 0x7b, 0x28, 0x22, 0xf5 }, { 0x7e, 0x2e, 0xe2, 0x33, 0x54, 0xe3, 0xea, 0x28, 0x7e, 0x2e, 0xe2, 0x33, 0x54, 0xe3, 0xea, 0x28 } }, { "\x8d\x75\x1d\xb3\xee\x7a\x2f\x1e\x1b\x43\xee\x74\x20\x5d\x8e\xe7\xe1\xcf\x95\xd5\x96\x5c\x99\xd2\x6c\x34\x13\x6f\xb0\xaf\xab\x86\x48\x5d\x89\xe8\xa4\x0e\xe5\x5f\xc8\x3e\xc6\x2c\xcc\xae\x6e\x1d\x51\x6d\x86\xd4\x2e\x5e\xe0\xf6\x17\xc0\x7c\x0a\x59\x50\xe6\xff\x55\x00\xe7\xd4\xcc\xba\x88\x2b\x3b\xcd\xe9\x20\x99\x78\x3d\xd8\xf8\x3a\x76\x77\xfb\xbe\xaf\x2e\x2f\x27\xda\x2a\x56\xda\xd6\x7f\xcc\x79\x8c\xa9\xe4\xe5\xa6\x20\xb0\x93\x60\xb0\x19\x2f\xe1", 111, { 0xcd, 0x76, 0xbe, 0xe5, 0xc9, 0x35, 0x9d, 0x48, 0xd1, 0xcb, 0x92, 0xc1, 0xec, 0xad, 0x8a, 0x70 }, { 0x22, 0x67, 0xa5, 0x45, 0x9b, 0x19, 0x9d, 0x5d, 0x22, 0x67, 0xa5, 0x45, 0x9b, 0x19, 0x9d, 0x5d } }, { "\xfe\x3a\x4a\x50\xfa\xf9\x68\xa3\xa0\xff\xb5\x10\x0d\x76\xe0\x90\x29\x0a\x7e\x45\x22\xda\x52\xa8\x75\xfc\xeb\x25\x1c\xc7\x73\xa1\xc9\x16\x29\x34\xcc\xe8\xa8\x4a\xb4\xf1\xac\xc9\x2d\x60\xa9\x5a\x3a\x34\x9d\xa6\xa7\x8d\x9f\x20\x55\x0f\xd6\x17\x5e\xa0\x2e\x76\x44\x67\x73\x83\x3f\xf4\xb7\x52\xc3\x03\xd2\xa1\xbb\x9c\x71\x18\x6c\x22\x61\x7e\x27\xd7\x80\x6a\x01\x19\xbd\x39\xef\x4e\xaa\x12\xe6\xa7\x16\xe2\xbb\x47\x11\xf8\x4e\x0c\xae\xbb\x4d\xdb\x5a\x27", 112, { 0x9b, 0x41, 0x48, 0x92, 0x98, 0x99, 0x31, 0x5e, 0x16, 0xc0, 0xbb, 0xf2, 0x75, 0x44, 0xea, 0x8a }, { 0xb0, 0xbc, 0x90, 0x59, 0x24, 0xee, 0x94, 0x5b, 0xb0, 0xbc, 0x90, 0x59, 0x24, 0xee, 0x94, 0x5b } }, { "\xeb\x41\x32\x39\x1b\x75\x2f\x92\xc5\x5e\x2b\x6f\x9c\xf9\x00\xb2\x9f\x84\xb7\x56\x07\x9b\xb9\xae\xc4\x1e\x10\x4a\xda\x0e\xe1\x5f\xd2\xae\xe0\x54\x3e\x5c\x2c\x0c\xac\x40\xb5\x58\xfc\x90\x96\x4b\x54\x65\x9c\xc1\xf2\xc5\xc7\x5a\x2a\xc7\xd0\xbf\x0d\x73\x5c\xb9\x21\x12\x50\x2c\x88\x8f\xb1\x73\xbc\xe5\xe4\xab\x68\xff\x53\x72\x5d\x2b\xbf\x01\x32\xe1\x07\x7c\x6e\x99\xbc\x98\x1c\x5f\x47\x8f\x69\xd5\x7b\xd4\xdf\x22\xc2\x32\x5a\x26\xa5\x17\xbd\x18\x26\x53\x95", 113, { 0xfc, 0x79, 0x63, 0x98, 0x97, 0xfc, 0x70, 0xbb, 0x49, 0xc5, 0x63, 0x4f, 0x0d, 0x4e, 0x4f, 0x02 }, { 0x14, 0xf6, 0xc5, 0x06, 0xb2, 0x19, 0x16, 0x94, 0x14, 0xf6, 0xc5, 0x06, 0xb2, 0x19, 0x16, 0x94 } }, { "\xd8\xb2\x19\x18\xe3\xa1\xaa\xd4\x9f\xef\x5f\x1e\x0d\x91\x3a\xa9\x7d\xed\xa3\x9f\x7b\xb3\x73\x23\x74\x6a\x0c\x4e\xff\xb0\xa8\x17\xa0\x35\x23\x18\x43\xa0\xfe\x5e\x08\xd4\xde\xe4\x3f\x86\xf3\xe2\xa5\x52\x91\xd3\xbf\xde\x4a\xcf\xec\x2e\xab\xfa\x93\xaf\x2f\x17\x2f\x2a\x54\xc1\x75\x7c\x86\x02\x7c\xa9\x33\xbb\x81\xde\xdb\xbf\x7e\xdb\xde\xf4\x7b\xbb\xa5\xef\x12\x1a\x63\x06\x40\x22\xd3\xab\x7d\xe4\x6c\x8a\x8a\xae\x93\x03\xa7\x5c\x6d\x9d\xeb\x64\x8a\xf5\x74\x76", 114, { 0xb6, 0xdf, 0x0c, 0x85, 0x9a, 0xc1, 0x89, 0x48, 0x75, 0x2f, 0x8a, 0xf8, 0x90, 0xc6, 0xad, 0xf7 }, { 0x6b, 0xf7, 0x78, 0x1e, 0xa2, 0x92, 0xf6, 0x6d, 0x6b, 0xf7, 0x78, 0x1e, 0xa2, 0x92, 0xf6, 0x6d } }, { "\x7c\xbd\x1f\x61\xc8\x5a\xdc\x39\xab\xa7\x6d\x7b\x08\x23\x98\x75\xa4\xc0\x5f\x2c\xff\xa3\x20\xdb\x7f\xaf\x01\x73\xd8\xa8\x3c\xf0\x26\x04\xa9\x06\x85\x4e\xf0\x02\xc1\x50\x9c\xb7\x2a\xac\xc2\x6a\xc4\xa5\xb4\xba\x3c\x9d\x53\x5f\xb4\x75\x35\xb9\x98\x41\x41\x77\x73\x2c\xde\x5b\x86\xdf\xe9\x35\x21\x4a\xc0\xae\x2d\x7e\xd6\xd5\x00\xf7\xb3\xb5\x8a\xd0\x8c\xf3\x7b\x5e\x73\x58\xe2\x42\x50\xde\xd6\xf5\xc8\x15\x91\x07\x1a\xd8\xfe\xd5\x0f\x4a\xbc\x81\xd6\xed\xc9\x7b\x29", 115, { 0x17, 0x64, 0x5c, 0x1e, 0x16, 0x8d, 0xa1, 0x1e, 0x5c, 0xab, 0x35, 0xfb, 0x51, 0x40, 0x11, 0x78 }, { 0x49, 0x3d, 0xbe, 0x2a, 0xb9, 0x28, 0x69, 0x38, 0x49, 0x3d, 0xbe, 0x2a, 0xb9, 0x28, 0x69, 0x38 } }, { "\x7d\x70\xcb\x7a\x58\xfb\x56\x69\xd9\x30\x71\xa4\xaa\xaa\x8b\x9f\xf3\x2e\x60\x68\x9e\x30\x1f\x35\x3e\x19\xd4\x23\x3e\x6f\xdd\x0e\x7e\x60\x3e\xd8\x95\x4c\x32\x6b\xae\x64\xf9\x69\xea\x9a\x72\x49\x3f\x22\x30\x38\x30\x9c\x40\x68\x8f\x09\x09\xea\xe0\x9d\x0a\x3b\xdb\x1c\xc4\xfb\xc5\x84\x96\x2d\xd1\x79\xee\xe4\x5b\xb9\x4c\xba\xc2\xb9\x94\x7e\xd0\xca\xf7\x15\x28\xff\x82\xfc\x35\x34\xd8\x10\xbe\xab\xf1\x3e\x33\x81\x64\xb4\xe1\x7c\xc1\xf2\x01\x3d\xf7\x4e\x8e\xcd\x1c\x76", 116, { 0xbd, 0xc2, 0x80, 0x8d, 0x5b, 0x54, 0x69, 0x71, 0x21, 0x90, 0xff, 0xfe, 0xb4, 0x9f, 0x42, 0xa4 }, { 0x45, 0xe1, 0xde, 0xd2, 0x01, 0xfc, 0x69, 0xdb, 0x45, 0xe1, 0xde, 0xd2, 0x01, 0xfc, 0x69, 0xdb } }, { "\x45\x8b\xca\x9a\xb5\x91\xc7\x80\xfd\x8c\x19\x64\xe2\xb0\x19\x84\xc3\x2d\xa9\x7f\xa0\xd4\xa0\xe8\xd9\xb5\xe3\x56\x3d\x35\x06\xcc\xa8\xf3\x7e\x82\x05\xad\x95\x6b\xac\xd2\x12\x23\x7a\xfc\x3c\x2c\x4f\xe0\x28\xd3\xba\xdb\x6d\xb0\xa8\x1a\x5d\x42\xb2\xc4\x63\x44\x9f\xa5\x76\xde\x76\xec\x9a\xf0\xc4\xd3\x85\xed\x70\x76\xe3\x52\x6b\xa3\x69\xa1\xd5\x96\xb9\xae\x25\xc9\xac\x94\xa7\xbf\x90\xf2\xd6\x1f\x2e\xcc\x36\xa8\xee\x17\xe8\xd5\x66\x54\xd8\x2c\x70\x74\x33\x15\xc0\xe8\x9e", 117, { 0x8b, 0x00, 0xfd, 0xb3, 0xe0, 0xb8, 0x60, 0x00, 0x67, 0x7a, 0x86, 0xc1, 0x40, 0x64, 0x4b, 0x86 }, { 0xb1, 0x15, 0x58, 0xfa, 0xea, 0x38, 0x9f, 0x80, 0xb1, 0x15, 0x58, 0xfa, 0xea, 0x38, 0x9f, 0x80 } }, { "\xa3\xca\xc2\xc2\x05\x59\xf7\x25\xa4\x48\xdf\xa0\x77\x47\x0b\x5a\xe4\x59\xcb\x84\x22\xc3\x2e\x97\x24\x5e\x70\x7d\xc7\x78\x41\xeb\xc8\x73\x1f\x4f\x10\xae\x3f\xd3\x6a\xc6\x8a\xef\x78\xbb\x35\x85\x8d\x4f\x8e\xa2\xae\xec\x4b\x5b\x4f\x9b\xff\x2c\x9d\xb0\x1c\x9d\xea\x48\xe4\x72\x49\x90\x92\x60\xc6\xbe\x1d\x68\x48\x53\x5f\x91\xb7\xfd\xbc\x5f\x42\xe0\xf8\x5d\x0b\x4c\x69\xcf\x72\x59\x05\xa9\x74\x61\xc8\xec\xf0\xad\x91\x29\xd9\xe9\xbe\xab\xc1\xec\x50\x40\x5b\x77\xe2\xae\x26\x08", 118, { 0x78, 0x57, 0x26, 0x0f, 0xbd, 0xb1, 0xec, 0xed, 0x77, 0x71, 0x96, 0x10, 0x29, 0xb7, 0x56, 0xfd }, { 0x54, 0x51, 0x59, 0xe9, 0x1d, 0x1a, 0x96, 0x65, 0x54, 0x51, 0x59, 0xe9, 0x1d, 0x1a, 0x96, 0x65 } }, { "\xdc\x1e\x1b\x5a\x91\x8c\xd0\x3e\xe4\x25\x18\xea\xb0\x90\x77\xba\x78\x55\x6a\xb1\xba\xec\x7e\xbc\xdb\x46\x4e\x07\xe2\xcb\xe5\xea\xd8\x1d\x84\x55\x30\x0d\xae\xaa\x80\x03\x3e\x12\x1e\xd4\x9d\x3d\x41\xbd\x42\x15\xf6\x19\x4b\xfb\x73\xa1\xe4\x65\xc9\xb6\x6f\x3f\x13\x95\xde\x71\xb5\xdf\x83\x24\x78\xbd\x5d\xb5\xe6\xd4\xb4\x42\x1c\x53\xf5\x10\x9e\x15\xad\xe3\xcf\x3b\x75\xef\x47\x09\xd9\xe6\x30\xbd\xce\x55\x16\x1a\xfe\x35\x82\x03\x62\x58\xa5\x98\x9c\xfd\x2e\x44\x00\x35\xf2\x7f\xff", 119, { 0xbd, 0xba, 0x2b, 0x81, 0x72, 0x4f, 0x14, 0xab, 0xc0, 0xab, 0x40, 0x68, 0xb1, 0x5f, 0xa0, 0x49 }, { 0xe8, 0x0f, 0x8b, 0x9b, 0xa1, 0x2e, 0x0e, 0x85, 0xe8, 0x0f, 0x8b, 0x9b, 0xa1, 0x2e, 0x0e, 0x85 } }, { "\x17\x3e\xc2\xb1\x97\x03\x25\x21\xca\x4c\xdc\x72\x53\x8f\xfe\x30\x60\x1f\x7d\xbf\x0a\x4f\xc9\x67\x42\x1e\x5b\x1f\x83\xaa\x59\xd6\x8d\x90\x5d\x83\x0a\xbe\xe0\x9e\x39\x21\x59\x27\x44\xd6\x3f\x63\xb2\xa6\x95\x9c\x57\xd0\x64\x35\x30\x5a\x93\x4e\x2b\xa7\x9e\x66\xca\x89\x8f\x48\xee\x64\x41\x3e\x1c\xb4\xe1\x88\xee\xf1\x1c\x95\x35\xe2\xd7\xd7\x72\xa6\x92\x93\xdb\x40\x28\x67\x54\x20\xad\xb4\x5c\x95\xf7\xa5\xb1\x6e\x3f\xda\xfa\xfc\xa2\xdc\x71\xbe\xac\x49\x37\x36\x9c\x27\x6d\x9d\xf3\x22", 120, { 0x98, 0x1a, 0x5d, 0xa6, 0x5e, 0x50, 0xea, 0xe4, 0xe6, 0x54, 0x2b, 0x51, 0x8a, 0xf5, 0x92, 0x1f }, { 0xa6, 0xf9, 0x97, 0xb6, 0x97, 0x7a, 0x32, 0xd1, 0xa6, 0xf9, 0x97, 0xb6, 0x97, 0x7a, 0x32, 0xd1 } }, { "\x6c\x8a\xe9\xf7\x57\x57\x45\x93\x36\x06\xc4\x8e\x27\xeb\xc1\xbd\xcc\xbd\x9e\xaf\xf5\xc0\x28\x67\x65\xe0\x33\x5f\xcc\xbb\x99\xfd\xb6\x26\xfa\x45\xa3\x44\xf4\x62\x7f\xf6\xe0\x45\x7c\xa5\x81\x67\x21\x57\xf4\x9a\xa6\xe7\xb9\x5c\x8d\xf2\x77\x0b\xfc\x2a\x19\xed\x32\x3c\x5c\x02\x94\x0c\x65\x57\x16\xc5\xb3\x2a\x2c\xb4\xa8\x0b\x29\xf9\x76\x6a\x06\xd4\x09\x99\xaa\xeb\x7f\x93\xe6\x8b\xab\x96\x76\xc0\x15\x31\x8f\xc7\x34\x0d\xd3\x32\x14\xd9\xe9\x35\x13\x6a\xfa\x0a\x68\x67\x0c\x1e\xc9\xa8\x4a", 121, { 0xaa, 0x30, 0xc6, 0x62, 0xf2, 0x54, 0x96, 0x72, 0x0b, 0x18, 0xd4, 0x72, 0x1e, 0x92, 0xf2, 0x36 }, { 0xd9, 0x7a, 0x32, 0x17, 0x43, 0xc3, 0xc5, 0x10, 0xd9, 0x7a, 0x32, 0x17, 0x43, 0xc3, 0xc5, 0x10 } }, { "\xa6\xec\x50\xa2\x11\xf1\x68\x02\x91\x8f\x22\xcc\x2f\xf4\x40\xce\x84\xd9\x6e\xf5\x5f\x7b\xa3\x3a\x58\xe9\xa5\xf8\xd0\x13\x1e\x34\xb9\xf5\xf5\xb4\xe8\xa8\x32\x0f\x64\xec\x27\x55\xf3\xfa\x43\x22\xd3\x91\x32\x49\xcf\x2f\x45\x57\x79\xaf\x9e\xb2\x94\xf5\xc2\xc9\x9a\x53\x53\x64\x1e\x55\xd4\x73\x27\x13\xe5\x65\x59\xe0\x86\x97\xb0\x6e\xb6\x42\x54\x6f\x3e\x60\xcc\x1b\x8a\x8f\xdf\x64\xe4\x5b\xd1\x49\x7b\x1f\x60\x42\x4b\x4e\xcf\x46\x55\x5f\xd5\x73\x0e\xc5\x77\xdf\x19\xc6\x58\x61\xde\xb8\x22\x18", 122, { 0xa7, 0xfe, 0xb9, 0xe1, 0xf0, 0xbd, 0xc9, 0x11, 0xc6, 0x98, 0x1c, 0x85, 0xd7, 0xaa, 0x32, 0xe0 }, { 0xc7, 0x29, 0x1d, 0x27, 0xd3, 0x7f, 0x4c, 0x7a, 0xc7, 0x29, 0x1d, 0x27, 0xd3, 0x7f, 0x4c, 0x7a } }, { "\x08\xec\xdc\x51\xbc\x41\xbb\x60\xac\x2b\x47\x99\x9a\x0d\x7d\xd8\x7c\x6f\x80\xee\x63\xc0\x10\x05\xe1\x40\xe2\x4c\xc9\x9f\x12\xf9\x9f\x95\xf4\x71\xf6\x91\xba\xff\x7b\x4a\x05\x5c\xa1\xd6\x6e\xac\x45\xfb\x58\x0a\xda\x73\x33\x08\x35\x25\xf3\x48\xfd\x58\xa9\x28\xad\xbc\x8a\xca\x86\x5f\xe6\x76\x78\xec\x5a\x6a\xc2\x4b\xf7\xa7\xf9\x74\x5a\x29\x22\x62\x8d\x52\x05\x45\xac\x73\x4f\x78\x73\x80\x00\xb8\x7e\x1a\x0f\xa3\x2f\x51\xfd\xf8\xd9\x84\xf1\x85\x78\x67\xc9\x9c\x0a\x6f\xa8\x4e\x7d\x23\xfe\x6b\xac", 123, { 0x1f, 0xdc, 0xdf, 0xf9, 0xcf, 0x2e, 0xe7, 0xc6, 0xbd, 0x7a, 0xaf, 0xc0, 0x57, 0xc5, 0x3a, 0x57 }, { 0x83, 0xbb, 0x03, 0xac, 0x35, 0x7d, 0x3e, 0x50, 0x83, 0xbb, 0x03, 0xac, 0x35, 0x7d, 0x3e, 0x50 } }, { "\x3a\x01\xa4\x77\xd4\xbc\xaa\xa7\xa8\x9d\x77\x4f\x04\xd9\x70\x20\x9a\xa5\x31\xe5\x4d\x52\xc9\xe8\xf9\x48\xba\x13\x0a\x46\xe4\x07\x48\xeb\x4e\x9c\x63\x61\xc1\xbe\x2a\x80\x32\xaf\x3f\x4a\x15\x83\x7a\x5a\x58\xac\x89\x3a\x5b\xa3\xb7\xfa\x6a\x46\x1d\x3b\x51\x09\x28\x6b\x45\x8d\x17\x59\x76\x4a\x31\xef\xbf\x31\xc9\x57\x9b\x4f\x71\x67\x92\x05\x20\x1b\xe0\x38\xba\xd3\xf7\xad\xc9\xdc\xb1\xc5\x51\xba\x58\x0f\x43\x5d\x17\x9f\xa2\x05\xdc\x65\x06\xab\xb0\xb4\x33\x5b\xd3\x8d\xaa\x1e\x60\x1d\x68\x73\x08\x52", 124, { 0x9b, 0x8e, 0x30, 0x9f, 0x27, 0x38, 0x5a, 0xfa, 0x33, 0x75, 0x71, 0xab, 0xdd, 0x13, 0x4a, 0x27 }, { 0xb6, 0x4c, 0x67, 0xe9, 0x9f, 0x92, 0xb7, 0x53, 0xb6, 0x4c, 0x67, 0xe9, 0x9f, 0x92, 0xb7, 0x53 } }, { "\x27\xe2\xbe\xa8\xf6\x17\xbf\x5c\xa6\x0f\x31\x87\xa5\x6e\x0c\xa4\xc7\xb0\x25\x48\xb0\xea\x44\x17\xcb\x1f\x25\xd1\x08\x15\xa9\x4b\xd8\x42\x9d\x56\x7a\xde\xaf\x3e\xa0\x3d\x66\x42\x14\x51\x1a\xa7\x4c\xfc\x9f\x37\x78\x30\xd4\x11\x35\x3c\x6c\x31\x37\xe9\x42\x5e\x7f\x81\x3c\x3d\xe3\xf3\x36\x1d\xfa\xf6\x9f\xf4\x0a\xbf\xc5\x56\xf1\x2d\x4e\x5c\x05\x09\x3a\xe8\xef\xd5\xb1\x1e\xb6\xb0\xeb\xc2\x97\x91\xeb\x67\x5e\x9b\x44\x6c\xaf\x45\x7b\xed\x34\xf5\x3c\xa1\xbc\x4c\xc4\xdc\x15\xa9\xea\x7e\xfb\x38\xd3\x8f\x69", 125, { 0x11, 0x66, 0x45, 0x8f, 0x93, 0x28, 0x94, 0x1b, 0x2c, 0xc9, 0x10, 0xc9, 0x97, 0x1d, 0x77, 0xf2 }, { 0x2f, 0xa1, 0x96, 0x06, 0x39, 0xb6, 0x64, 0x34, 0x2f, 0xa1, 0x96, 0x06, 0x39, 0xb6, 0x64, 0x34 } }, { "\x87\xee\x1a\x0b\x42\xf2\x4a\x66\xad\x4f\xa2\x28\x37\x28\xa4\x43\x0e\x89\xee\xcd\x77\x8b\x8e\x41\x78\xcb\x58\x18\xfb\x30\xe2\x0a\x3a\x1e\x4f\x4e\x82\x3e\x9d\x44\xef\x08\x07\x5f\x58\xfa\x5e\x96\xd1\x9b\xc3\xba\x08\xb8\x60\x13\xb0\xcd\x41\x4d\x36\xcb\x0d\xfb\xc1\xf0\xa2\xd3\xec\x72\x06\x14\x27\x92\x22\xd3\x94\xa3\xc4\xf2\x13\xb8\xcc\x7a\xc5\x89\x1a\xb3\xfd\x4c\x18\x76\xc0\x04\xcd\x58\x99\xac\xd5\xb6\xc2\x8d\x23\xeb\x41\x6d\xa1\x17\x48\x90\xe8\x2b\xfc\x6e\xee\xc8\xca\x8d\x8f\x47\xaa\x58\x1f\x12\x6d\xed", 126, { 0x08, 0x32, 0xa1, 0xcc, 0x3a, 0xee, 0xfd, 0xd0, 0x30, 0xdd, 0x34, 0x35, 0x0e, 0x14, 0xa5, 0x3f }, { 0x45, 0xcd, 0x59, 0xa5, 0xea, 0xc6, 0x2b, 0x88, 0x45, 0xcd, 0x59, 0xa5, 0xea, 0xc6, 0x2b, 0x88 } }, { "\x68\xa6\x9d\xb4\xe0\x19\xb1\xe3\xe6\x62\x71\x3d\x88\xd7\xd0\xab\x9e\x5a\x55\x4f\x88\x9b\x01\x51\xbb\xe2\xac\xcf\x51\x0b\xd1\xb4\xa3\xd1\x43\x01\xd1\xe0\x3c\x92\x94\x02\xf8\x56\x2a\xa5\xcc\xdf\xba\xb0\x6e\xa5\xb0\x57\x81\xd1\xd1\xe6\x75\x8c\x5b\x27\xb1\xc6\xeb\x9d\xa3\x65\x2a\xb0\x1e\xf9\xa3\x0b\xeb\xa1\x4e\x49\x92\x64\x48\x2c\x66\x3b\x50\xe0\x3d\x85\x3e\xa1\xdd\x59\xef\xfe\x1f\x9e\xb4\xb1\x5c\xf6\x81\x0d\x41\x6b\x41\xd5\x4c\x79\x2d\xcb\xe9\x8c\xa1\x3e\x3b\x08\xdc\xdd\xc0\x01\x14\x2d\x74\x0e\xf3\x69\x91", 127, { 0x8d, 0x80, 0x38, 0x14, 0xa0, 0x4a, 0x73, 0xe1, 0x4f, 0x88, 0x23, 0x08, 0x27, 0xa4, 0x19, 0x86 }, { 0x9b, 0x4f, 0x66, 0x15, 0x67, 0xa8, 0x91, 0x5f, 0x9b, 0x4f, 0x66, 0x15, 0x67, 0xa8, 0x91, 0x5f } }, { "\xaf\xd2\x8a\x5a\x75\x0b\xa7\x0e\xfd\x9e\xa8\x72\x3f\x13\x1a\xf6\xe9\x6f\x52\xf0\x27\x28\x9b\xb4\x99\xdc\xa7\xe5\x92\x2a\x0c\x67\x0d\x91\xcc\xc7\xfb\x9d\x98\x71\x72\xc0\x0b\xac\x1b\xf1\xb0\xb8\x88\x7e\x45\xed\x82\x4a\x03\xba\x04\xd4\xdd\x1b\x9b\x62\x29\x8a\xfe\xec\x5a\x5a\x42\xa1\xa4\xd8\x23\xda\x57\x0b\x09\xe3\x50\x75\xc6\xf8\x41\x7e\x61\xba\x52\xf1\x9f\x5b\x53\x0b\x6f\x4a\xd1\xf4\x70\xd4\xee\xd8\x9a\x84\x06\xe2\xd0\x1a\xeb\xcd\xed\x90\x59\x82\xed\x34\xac\x2a\xed\x1c\x5b\xb3\x95\xa4\x91\xf2\x64\xff\x3e\x43", 128, { 0x10, 0x27, 0x14, 0xa5, 0x93, 0xa4, 0xaf, 0xb7, 0x29, 0xb6, 0x13, 0x61, 0x1a, 0xe6, 0xca, 0x2c }, { 0xae, 0x5e, 0x36, 0x7f, 0xc2, 0x2f, 0x87, 0x90, 0xae, 0x5e, 0x36, 0x7f, 0xc2, 0x2f, 0x87, 0x90 } }, { "\xfd\x7f\xcf\xd9\xd3\xe1\x20\xf6\xd1\xb3\x1c\xe7\xbb\x07\xc7\x8f\xa1\x34\xe6\xf0\xd3\x5d\x0f\xfc\x11\xef\x1d\x94\xcc\x3f\x50\xe9\xc4\xcc\x1b\xd2\xbf\xbd\x74\x2b\x4a\x16\x37\xf3\xf7\x95\x29\x24\x93\xe1\x78\xbc\x89\x9b\x53\xe5\x61\x3c\xa0\x35\x9e\xce\x68\xf4\xb5\xa6\xaf\xd3\xf4\xd1\xdc\x42\xd1\xd8\x96\xfb\xc4\x50\x5d\xc6\xe2\xd2\x8a\xae\x5e\xbb\xc5\x92\xff\x39\xe5\xd0\xbe\xa9\x16\x7a\x03\x43\x07\x74\xaf\xa9\xa6\x2b\x85\x31\xe0\x26\x2a\x01\x13\x4d\x50\x03\xbf\x75\x7f\x59\xd3\x55\x37\x18\x40\xef\xc5\x18\x6b\xa4\x00", 129, { 0xff, 0x68, 0x40, 0x97, 0x3c, 0x8a, 0xff, 0xb6, 0x58, 0x15, 0x3c, 0x32, 0x9e, 0x23, 0x63, 0x0e }, { 0xc6, 0xec, 0xc8, 0xd1, 0x82, 0xf4, 0xc2, 0x7f, 0xc6, 0xec, 0xc8, 0xd1, 0x82, 0xf4, 0xc2, 0x7f } }, { "\x42\x28\xec\x05\x25\x21\xb7\x2d\x5d\x37\x4d\xff\xd0\xf8\x09\xb7\x75\x9a\x0f\xe1\xbb\x1d\x38\x88\xa4\x77\xf7\xb1\x42\x73\xd6\xcd\x6e\x67\x82\x35\xcc\x06\x37\x64\x91\x34\x56\xd4\x4e\x70\x67\x9a\x42\xf0\xef\xec\xd6\x0b\xac\x9b\x22\x39\xbe\xa1\x9c\x56\xd4\xc7\xc2\x5e\x5f\xe6\x3f\x3f\x87\x10\x5d\x0b\xe3\x0e\xb4\x9e\xc0\x15\x84\x71\x0a\x95\x1c\xce\xe7\xd7\xa2\x7e\x7e\x6d\x0d\x14\x0d\x06\xf6\x4f\x92\x51\xde\x2c\xe5\x59\x36\x69\x1e\x62\x20\xa0\xf8\xc8\x18\x77\x56\x1f\xd3\x3d\x42\xd8\x15\x18\x3a\x7b\x16\x72\xcc\xb1\x2c\xe4", 130, { 0x5a, 0x36, 0x4f, 0x9e, 0x42, 0xc1, 0x79, 0xb3, 0x69, 0x8f, 0xa6, 0xaf, 0x98, 0x01, 0x5e, 0x19 }, { 0x71, 0x27, 0xf0, 0x19, 0x74, 0x24, 0xac, 0x18, 0x71, 0x27, 0xf0, 0x19, 0x74, 0x24, 0xac, 0x18 } }, { "\xc7\xa0\x26\x96\xed\xd0\x5f\x5c\x2e\x22\xd0\x1e\x34\x7b\x35\x24\x8c\x1a\xf2\x47\x04\x9e\x70\x89\xa5\x2f\x19\x2a\x8a\xbe\x3f\x37\x31\xfd\xf4\xf8\x93\xe4\x7d\x32\xa3\xad\xf6\x0c\x4d\x8a\xa9\x80\x72\xc0\xf5\xac\xcc\x63\x9d\xdb\x20\xf9\x5d\x62\x6d\x69\x05\xd4\x2b\xce\xbe\x7d\x7c\x40\x7f\xcc\x97\x7f\x76\x45\x4f\xd0\x4d\xe2\x87\x06\x57\xb5\x99\xbb\x77\x9f\xdb\x52\x53\x51\x8a\x4b\x59\xe6\x5f\xee\x04\xdf\xf2\xef\xa1\x70\xb3\xfb\xc2\x67\x71\x63\x02\x7c\x32\x40\xab\x67\x74\xb2\x86\xef\x25\xd3\x18\x8b\xdf\xda\xed\x07\xc8\xc6\xed", 131, { 0xbd, 0xb3, 0x6a, 0x61, 0xc5, 0x66, 0xe6, 0xe2, 0x07, 0x31, 0x2e, 0xc9, 0x24, 0xef, 0x2d, 0x86 }, { 0x25, 0x35, 0x60, 0x7f, 0xe8, 0x24, 0x71, 0x4e, 0x25, 0x35, 0x60, 0x7f, 0xe8, 0x24, 0x71, 0x4e } }, { "\x2b\xb7\x4b\x95\xd2\x7d\x8c\xd8\x29\x96\x97\x01\x25\xdb\xbd\xf5\x7c\xb0\x5c\x70\x0c\x65\x3a\x18\x59\xcd\xf0\xcf\x10\x5e\xbb\x5d\xe8\x6f\x0f\x9d\x61\x7b\x96\x23\xbf\xa4\x2c\x7c\x13\x05\x2d\x97\x9f\xd3\x09\x1f\xd5\xaa\x84\xd7\xe5\x9f\x14\x97\x46\x4f\x5e\x51\xa6\x2e\x49\x24\x59\xb5\x47\x2e\xc5\x81\x8a\x94\x76\xea\x54\xd7\x7a\xe7\x60\xb7\xf3\x76\xb7\xc8\x5a\x0c\xc4\xa0\xad\x5e\x06\x34\xe0\xdd\xce\x14\x67\x00\x28\xa3\x0c\x50\xd0\xb5\xa6\x9f\x32\x89\xa7\xe0\x11\x6f\x3b\x9d\x37\xf2\x2a\x86\xb9\x69\x0c\x1a\x32\x43\x24\x55\x1a\x67", 132, { 0x40, 0xfa, 0x9c, 0xef, 0x51, 0xe5, 0x19, 0x3f, 0x78, 0xbd, 0xef, 0x33, 0x2e, 0x97, 0xdf, 0xaf }, { 0x82, 0x95, 0xbc, 0x8a, 0x21, 0x49, 0x26, 0xc9, 0x82, 0x95, 0xbc, 0x8a, 0x21, 0x49, 0x26, 0xc9 } }, { "\x52\xde\x69\xb4\xce\x65\x04\x79\xcb\xd7\xae\x80\xfa\xc9\x86\xa4\xd3\x5c\xc3\x92\xc4\x03\x4f\x31\x2a\x59\x84\x3a\xdc\x68\x29\x8a\x59\x45\x7e\x8a\x92\x11\x7e\x9d\x13\x4b\x0d\xc1\xa5\x71\xee\x01\x71\xd1\x26\x2b\x8e\xae\x5c\x1f\xde\x31\x1b\x54\x7c\x30\x04\xe8\xee\x4b\xca\x6d\x15\x8d\xdc\x40\x2a\xb6\x71\x4f\x12\xf3\x57\x1a\x0e\xbe\x87\xe7\x8e\x3e\x7b\x04\x33\xb8\x8c\xfb\xf3\xdc\xf3\x5f\xf5\xff\x09\x72\x9e\xf4\x1b\x16\xd8\xfb\x50\x10\xfc\x2b\xea\x29\xcd\x4b\xaf\x2c\xfc\xdf\xf5\x29\x26\xce\x3d\x98\xd8\x41\x3e\x86\xca\xcd\x49\x2b\x0c", 133, { 0x09, 0x5c, 0xf5, 0x5d, 0x5a, 0xf5, 0x95, 0x7c, 0x0f, 0xac, 0x66, 0xa3, 0xde, 0x73, 0x22, 0x83 }, { 0x0c, 0xec, 0x38, 0x93, 0x97, 0xc5, 0xd3, 0xb2, 0x0c, 0xec, 0x38, 0x93, 0x97, 0xc5, 0xd3, 0xb2 } }, { "\xd1\x04\xcd\x30\x3f\x4e\x53\xba\x34\xc2\xc3\xf3\xbf\x9b\xf4\x65\x12\x08\xda\xb3\x5e\xf0\x18\xcd\x4f\x19\xcb\x72\xd7\x34\x6e\xb5\x48\xf6\xf0\x3a\x04\x7c\x63\xd3\x49\xf7\xc2\x03\x9e\xcb\x68\x67\x69\x01\xf4\x45\x82\x5b\xfa\xf8\x87\x0c\xd0\x52\x02\x5b\x28\x26\x95\x9f\xee\x44\x0d\x1e\x09\x56\xc3\xd3\xdb\x9e\xdc\xfa\x61\x30\xe3\x49\x32\xe7\x4c\x5e\xe4\x36\xb3\xa2\xb0\x3c\x80\xfb\xb5\x34\x57\xf5\x00\x36\x24\x50\xd8\xf4\xb5\xf2\x3d\xae\xb7\x7f\x2a\x07\x53\x3e\x72\x1e\x85\x2c\x6c\x1a\xb0\xb7\x60\x82\xe5\xa9\xc3\xc4\x81\xae\x46\xdb\xa6\x61", 134, { 0x3a, 0xce, 0x51, 0x29, 0x71, 0xb9, 0xce, 0x1b, 0xd0, 0x69, 0x66, 0x47, 0x19, 0x66, 0xb0, 0x06 }, { 0xb9, 0x2f, 0x6c, 0x33, 0x99, 0xf1, 0xaa, 0x51, 0xb9, 0x2f, 0x6c, 0x33, 0x99, 0xf1, 0xaa, 0x51 } }, { "\x9a\x20\x2b\xbd\xa9\xca\x7e\x91\x7e\x74\x7f\xb5\xc8\x15\x07\x49\x1e\xe8\x68\x4d\x14\xb6\x5b\x79\xa8\x49\x3c\x6f\x10\xb9\x69\x4b\x17\x64\x61\x32\x09\x0e\x8b\x39\xc2\xf4\x57\x94\x94\xde\xa7\x5b\x9b\xa8\x7d\x83\xe8\x77\x02\x00\x49\x4b\x86\x82\xb2\xb4\xc5\x14\xf7\x32\x29\x0d\x8b\xbb\x6e\xe5\xba\x65\xc6\x34\xaf\x67\xdd\x05\xe7\xab\x87\x74\x68\x7e\x02\x64\xbf\xd7\xe7\x9b\x59\x95\x46\xff\x19\x9a\x92\x52\x96\xba\xa1\x0c\xd6\xb3\xac\x3e\x8c\xf4\x90\xaf\xb8\x5d\x7c\xbd\x77\xc5\x98\xec\x10\xfd\x16\x87\xf6\x0b\x4b\xda\x2f\x4d\x8f\x98\x5f\x11\x63", 135, { 0xd2, 0xc5, 0x55, 0x23, 0xe8, 0x26, 0x03, 0x1d, 0x2f, 0x1e, 0xf3, 0x10, 0xc0, 0x84, 0x33, 0x87 }, { 0x7d, 0xe3, 0x27, 0xac, 0xa8, 0xaa, 0xc3, 0xaa, 0x7d, 0xe3, 0x27, 0xac, 0xa8, 0xaa, 0xc3, 0xaa } }, { "\x35\x54\xdd\x37\xd8\xa3\xf6\xff\x2e\x4b\x51\xde\x8d\xa7\x63\xf1\x3e\x7f\x59\xd1\x4e\xfa\x88\x59\xee\x1b\xc0\xa3\xce\x83\xaa\x85\x19\x5b\x24\x26\x6d\x67\xcb\x7c\x99\x2f\xbf\x04\x6d\xbc\x93\x0b\xe9\x97\x07\x20\x30\xe8\x9f\xbc\x5f\x27\xb6\x68\x4c\x01\xc8\x1e\x3b\x6a\xdf\x58\xb6\xdc\x45\xe9\x59\x2e\x21\xf8\x0e\x95\xc7\x42\x39\xd3\x17\x21\x49\x27\x1f\xfe\xa2\xfa\x4f\x95\x3a\xcf\x56\xcc\x60\xb6\x91\x25\x72\x24\x97\xd8\xcd\xe0\x57\x1c\x04\x2c\x5d\x2e\xdc\x53\x1a\x10\xa3\x49\x12\x5c\x63\xfb\x17\xac\xd7\x0a\x06\x6c\x96\xd1\x81\xcd\xd4\xd0\xf9\xe6", 136, { 0x62, 0x65, 0xd7, 0xce, 0x73, 0xe4, 0x21, 0xe0, 0xb4, 0x7c, 0x21, 0xe6, 0x1e, 0xb0, 0x6c, 0x20 }, { 0xb1, 0xa1, 0x43, 0xd5, 0xf4, 0xd6, 0x02, 0xcf, 0xb1, 0xa1, 0x43, 0xd5, 0xf4, 0xd6, 0x02, 0xcf } }, { "\xc9\xc2\x21\x2a\x31\x57\xc3\x2c\xad\x99\xb9\x03\x6d\xc3\x8d\x8e\xe0\x4f\x88\xef\xe3\xba\x62\xc5\x4e\xf3\x0e\x6b\xa3\x03\xd5\x2f\x11\xa3\xd2\xce\x90\xf5\xe4\xda\x3b\x32\x6a\xdd\x1f\xc7\x91\x20\xb8\xe7\xaa\x6d\xac\x11\x76\xfa\xc2\x4c\xf9\x9b\x61\xf1\xd7\x52\x3d\x0b\xfd\x05\x68\xce\xa1\xfe\x01\x63\x31\xe7\xa3\xcf\x82\xdf\xe6\x2c\x53\x45\x7d\xdf\xff\x91\x2a\xcf\xfd\xda\x21\x91\xe9\xda\xa8\xa1\x28\x28\xc7\x46\x31\x9a\x0a\x5d\x96\x31\x43\xea\x54\xa6\x32\x5d\xdb\x26\xe7\xd2\xab\x2c\xa2\x41\x7e\xc0\xc5\xce\x50\xea\x77\x6b\x31\xf2\xdc\xef\x55\x8a\xee", 137, { 0x41, 0x39, 0x7e, 0xdd, 0x3a, 0x94, 0xe4, 0x70, 0x9e, 0x8e, 0x98, 0x4f, 0x97, 0x69, 0x2b, 0x39 }, { 0x5d, 0x42, 0x73, 0xaa, 0x69, 0x60, 0x0b, 0x40, 0x5d, 0x42, 0x73, 0xaa, 0x69, 0x60, 0x0b, 0x40 } }, { "\x84\x29\xe7\x9d\xf8\x03\xf6\xe0\x29\xd9\x39\x7c\x73\x2c\x82\xce\xa6\x82\x9a\x6d\x6e\x4e\xa9\x12\x90\xa2\x8a\xfb\xe9\xc8\xe2\x58\x08\x68\x34\x58\x8a\x22\x96\x34\xdb\xe3\xcf\x46\x54\xa4\xb1\x2d\x14\xdd\x1c\x67\x83\x53\x22\x29\x00\x32\xce\xdd\xe7\x44\xea\xa6\x6a\x3e\x72\x4f\xfe\x91\xf7\xfb\xd0\xad\xbe\xe3\xd1\xe7\xf8\x0c\xdb\x85\xe3\xbf\xc6\xed\x2b\xe7\xb6\x3e\xe9\x26\xa5\x0e\x9f\x51\x48\x33\x5d\x21\x31\x7a\xe4\x15\x58\xa0\xe7\x7f\x55\x32\x02\xa6\xe1\x78\x74\x69\xb2\x1b\x1a\xe2\xa4\x01\xfb\x1c\x33\x7f\x07\xd6\xca\xf6\xd4\x05\xc1\xd0\xe2\x8c\x0d\xd6", 138, { 0x01, 0x95, 0x92, 0xb6, 0x40, 0x11, 0x75, 0xe6, 0xd9, 0x96, 0x4c, 0xbc, 0x21, 0x87, 0xa1, 0x33 }, { 0x66, 0x3e, 0x8b, 0x02, 0xba, 0xcf, 0xfc, 0x58, 0x66, 0x3e, 0x8b, 0x02, 0xba, 0xcf, 0xfc, 0x58 } }, { "\xb3\x73\x93\xf2\xde\x4a\xf8\xc1\x8c\x0a\xa0\x6b\x0d\x08\xe8\xfd\x8d\xc8\x34\x3f\x6e\x64\xc3\xaa\x30\x0a\xc5\x71\x35\x0c\xdf\xca\xc1\x17\x81\x29\x61\x66\xb2\x54\x52\x9a\xed\xe3\xb8\xee\x6b\x43\x47\x62\xa4\x0f\xc3\x51\xff\x7f\x64\x72\x1a\x12\xd5\xb4\x7a\x1f\x94\xf8\xc7\xc5\x8d\xe8\xb8\xb4\xff\x8f\x3a\xbf\x77\x81\x35\xe2\x9f\x3d\x39\x68\x16\x50\x9b\x28\xac\xbf\xcf\x5c\xfd\x36\x40\xb9\xa1\x55\xe6\x6c\x94\x8b\x5b\xe9\x80\x80\xa0\x4a\xad\xd0\xca\xc0\x63\x39\xc9\xc9\x86\xe9\xbf\x20\xb4\xa2\x5f\x8e\x4c\xdc\xb1\x56\xf6\x44\xa2\x4b\xe7\x3e\x6d\x32\xa5\x88\x8d", 139, { 0x05, 0xe4, 0x41, 0xa6, 0x18, 0x8a, 0x3a, 0x41, 0x29, 0x28, 0x8b, 0x1e, 0x74, 0x2f, 0x3a, 0xba }, { 0x05, 0x1e, 0x35, 0xa9, 0x81, 0x92, 0xe9, 0xac, 0x05, 0x1e, 0x35, 0xa9, 0x81, 0x92, 0xe9, 0xac } }, { "\x38\xce\x73\xe1\x19\xfe\x37\x9f\xf1\x28\x32\x28\x62\x77\x35\xee\xc4\x45\x9f\xe8\x9b\x1f\x8c\x9b\xd0\xa0\x29\x56\xfe\x86\xe9\x8b\x43\x9b\xa2\x5b\xa2\xcc\x5e\x0a\x97\x79\xa6\x2e\x87\x44\x74\x1e\x7f\x7d\xc2\x01\xef\x3c\x7c\x6d\x5a\xf3\xb7\x46\x7e\x1f\xc6\xfa\x88\x8f\x3c\x3b\x43\x97\x8f\x86\xf7\x3a\xc0\xaf\x75\xd9\x2d\xf0\xa6\xbf\x36\x0d\xd5\x49\x76\xa7\x87\x35\xd8\x58\x04\xcb\x44\x2f\x52\x58\xf8\x3e\xe0\xfd\xdd\xe6\x9f\xc7\x30\x3d\x8d\xb2\x55\x48\xf8\xcb\xdc\x15\x21\x9c\x37\x69\xf3\x0b\x9b\xe1\xb1\x67\x86\x76\xe2\x43\xb8\x99\xfb\xc7\x61\x6c\xdc\x8a\xed\xdd", 140, { 0x13, 0x1a, 0x72, 0xe2, 0x15, 0x91, 0xec, 0xc2, 0x05, 0x2d, 0xf2, 0x29, 0x5c, 0xc3, 0x40, 0x7b }, { 0x23, 0x2a, 0x74, 0x5c, 0xb5, 0xb7, 0x04, 0x1e, 0x23, 0x2a, 0x74, 0x5c, 0xb5, 0xb7, 0x04, 0x1e } }, { "\x17\xf6\x8f\xc8\x82\xef\x94\xf8\x42\xdc\xf0\x0c\x5c\x9d\x68\x55\x39\x61\xbe\x9e\x0e\x06\x79\xc1\xa5\xb9\xca\x9d\xcd\x78\x87\x17\x58\x16\xcf\x8c\xbd\x2e\x59\xd0\x00\x05\x53\xb0\x42\x7a\xe1\x83\x6f\xb5\x2e\x70\xb8\xd3\x77\xa1\x92\xd9\x91\x7b\x96\xd3\x3d\xd9\xea\xd6\xdb\x68\x47\xe4\x5f\x5e\xed\x9e\xcc\xa7\x23\xe2\x44\xdc\x63\x10\x8b\x6a\xf9\x79\x85\x50\xd8\x49\x3f\x77\xc9\xb7\xc9\xc7\x5b\x5d\x91\x28\x59\x8e\x07\xb8\xfb\xab\x16\xe6\x82\xc6\x56\xa4\xd1\xa5\x17\x57\x7f\x7d\x16\x3a\x0e\xec\xa3\xc5\xb5\x3a\xdd\x3a\x3d\xa6\x6c\x7a\x1d\x91\x0a\xf9\xe7\xb2\x38\x87\x1e", 141, { 0xa9, 0x5e, 0x6f, 0xfb, 0xa7, 0x76, 0x81, 0xa5, 0x47, 0x9b, 0x80, 0x37, 0x48, 0xb6, 0x59, 0xc0 }, { 0x86, 0xf3, 0x3d, 0x93, 0xc1, 0x65, 0x0f, 0xca, 0x86, 0xf3, 0x3d, 0x93, 0xc1, 0x65, 0x0f, 0xca } }, { "\x1e\x22\xc0\xe7\x7b\x18\x36\x16\x92\x06\x4f\xf3\xab\x66\xa5\x77\x23\xac\x57\x36\x4e\xb6\xa3\xd8\x62\x87\xb2\x0b\x2b\x88\xf6\x42\xcf\xb0\x12\x05\x56\xdf\x34\x24\xa0\x63\xed\x71\x97\xde\x1d\xfb\xc6\x6f\xfd\x87\x29\x47\x16\xa8\xba\x3e\xdc\x55\xc0\x94\x77\x26\xb6\xc1\x66\x39\xc5\xeb\x3a\x85\x73\x6f\x4e\xcd\x0d\xac\xfa\xf8\xff\x1f\x8f\x4c\xba\x77\x90\x1f\x63\x43\x53\x70\x06\x3e\xa5\x85\xd0\xc3\x9c\x6f\x5c\x6d\x4e\x7c\xcf\xf6\x2c\xe8\xf6\xad\x9a\x6f\x4b\x3c\x9a\xbe\x9c\x1d\x92\x02\x3e\x0a\x98\xa0\x08\x09\x07\x16\x0d\xa0\x1a\x4e\x66\x11\x6c\xaf\xd5\xb9\x43\x26\xc8\x43", 142, { 0xc7, 0x48, 0x6b, 0xfe, 0x6b, 0xdd, 0x39, 0x76, 0x61, 0x30, 0x39, 0xab, 0x79, 0x74, 0xde, 0x85 }, { 0xba, 0x83, 0x0d, 0x18, 0x15, 0x5c, 0x63, 0x07, 0xba, 0x83, 0x0d, 0x18, 0x15, 0x5c, 0x63, 0x07 } }, { "\xbe\xf5\x9c\x67\xba\x6d\xe1\xa3\xac\xfe\x8d\x28\x49\x30\xc1\xf3\x2a\xc6\x11\x0a\x4d\x5d\x5e\xbe\x7c\x0f\xaa\x65\x54\x4b\x8c\x12\xb5\x09\x01\xdf\x7f\x26\xb6\x36\xbc\x7c\xad\x8b\xb9\xf7\xfe\x90\x58\x83\x5c\x69\x5a\xe0\x62\xd1\x4a\x61\xf3\xac\xd7\x18\xeb\x17\xee\xe8\x78\xa9\x80\xf3\x29\xac\x39\xd1\x27\x9a\xe5\xbb\xa5\x22\xce\x2b\xaa\x8b\xfa\x8c\xb5\x9c\xd6\x7e\x0c\x79\xaa\xc5\xcd\xfe\x46\x5e\x57\x42\x88\x2f\x84\x42\x45\x5a\x78\x2c\xb5\x0a\xf3\x60\x97\x60\x7c\x43\xcc\x4b\xc7\x4c\x84\x88\xa9\xc0\xa1\x09\x46\x7e\xb7\xde\xe1\x25\xfc\xbc\x30\x52\xe1\x25\xf0\x63\x48\x8b\x04", 143, { 0x96, 0xf1, 0x2d, 0x65, 0x88, 0x47, 0xf1, 0x0b, 0x7b, 0x99, 0x33, 0x16, 0xad, 0x86, 0xe1, 0xca }, { 0x1e, 0x42, 0xd9, 0x58, 0xe1, 0x5a, 0xec, 0xea, 0x1e, 0x42, 0xd9, 0x58, 0xe1, 0x5a, 0xec, 0xea } }, { "\x5a\x40\x2f\x53\x27\x99\x53\x89\x5d\x06\x5f\x3c\xca\xf7\xb0\xd5\xcd\xfe\xe5\xe5\x65\x06\xca\xa8\xb2\xe6\xae\x50\x6d\x5f\xe3\x1e\xa4\xa7\x77\xe4\xda\x0a\x5b\x44\x3c\xd6\x58\x87\x06\xba\x79\xec\xae\x9f\xdb\x02\x04\x76\x1d\x0a\x01\xc1\xcb\x63\xce\x42\x9b\x3d\x99\x97\x0d\x14\x31\x90\xac\x97\xab\x13\x9a\x88\xac\x7b\xc3\x29\x08\x84\x27\xee\x26\x84\xfd\x32\x64\x3a\xb5\xcc\x1d\x3e\x20\x62\x05\xfc\x31\xd5\x35\xda\x0e\x08\x11\xf4\x3c\xa2\x7d\xae\x65\x36\xf5\x05\x3e\xf3\xe3\x7c\xe2\x74\x0a\xbd\x76\x5d\xa8\xea\x11\xe8\x8d\x60\xd0\xa2\xc3\x59\x17\x1b\x9c\x50\xc7\xc1\x7b\xc7\xe9\x42", 144, { 0xda, 0x43, 0x23, 0x3c, 0xfc, 0xdd, 0x80, 0xca, 0x66, 0xac, 0x78, 0xf3, 0x43, 0x92, 0xe6, 0x47 }, { 0x3e, 0x98, 0x28, 0x82, 0xbb, 0x59, 0x28, 0x43, 0x3e, 0x98, 0x28, 0x82, 0xbb, 0x59, 0x28, 0x43 } }, { "\x24\x2e\x20\xce\x15\x2b\x1e\xa3\x39\xf4\x2e\x11\x20\xdd\xb4\xa5\x45\x09\x07\xae\xe9\x9b\xb7\x99\x17\xa5\xfb\xad\x91\x88\xed\x75\x9b\xfc\xa6\xc2\x2e\x0c\xe2\x7d\x25\xb7\xb4\x43\x03\xf4\x1c\x73\x61\xdc\x7f\x7b\x70\xaa\x24\x00\x4d\xa7\x33\xc0\x54\xe3\xef\xe9\xf5\xa0\x62\x43\xbf\x25\x36\x58\xe7\xd9\xd8\xaf\xa9\x52\xaa\x4f\x35\xd9\xf0\xcb\x42\x7d\x14\x41\x2c\xc8\xa8\xb8\x4e\xbd\x3e\xb3\xd1\x52\x82\x59\x42\xa6\x2d\x16\x3c\xa3\xd9\xe6\x07\xb4\x8c\x32\x93\x03\x57\x00\x18\x85\x47\x05\x23\xab\xf6\xee\x41\x36\xe9\x1d\xda\x72\x3d\x12\xa5\xa0\xa5\x58\x5c\x89\x7d\xba\x97\xce\x2d\x4e\xe7", 145, { 0xf3, 0xa5, 0xa6, 0xe7, 0x59, 0x44, 0x8d, 0xb4, 0x15, 0xad, 0xcd, 0x24, 0xa3, 0x79, 0x85, 0xfc }, { 0x53, 0x79, 0x02, 0x32, 0x0a, 0xa1, 0x68, 0xb3, 0x53, 0x79, 0x02, 0x32, 0x0a, 0xa1, 0x68, 0xb3 } }, { "\x3e\x1f\x2f\xe8\xfb\xd1\x02\xa2\x02\xd2\x22\xec\x66\x42\x58\xa4\x82\x0a\xfb\x4e\xe8\x11\x7a\xfc\x4c\x91\xfb\x8f\x38\x31\x25\xf2\xdf\xd8\xa6\x83\xd6\x3f\x39\x7f\xa3\x81\x25\x61\xb0\x37\x29\xd1\xe4\xdc\x1b\x3f\xfc\xec\xec\x61\xa1\xa7\x14\x27\x1d\xf5\xba\x42\xd1\xeb\xde\x4f\xa6\xd9\x63\x80\xef\xdd\x13\xd0\x00\x57\x13\x87\xfa\x24\x6c\xe7\x26\x82\x78\x47\xd1\x28\x25\xd2\xe5\x1b\xb6\x6b\x12\x26\x6b\x2e\x4a\xc3\xfd\x00\xa2\x27\x1f\x9f\x87\x88\x2f\xdf\xff\x67\xe0\x95\x31\x83\x88\x80\x8b\x23\x19\x72\xa9\x10\xe1\xc6\x08\xcb\xc3\xc1\x4a\xd5\x3e\x98\x93\x01\xdc\xf1\xaa\x29\x70\xba\x47\xab", 146, { 0xf6, 0x2a, 0xb9, 0x1a, 0x46, 0x23, 0xc4, 0x1c, 0x96, 0xad, 0x39, 0x85, 0x21, 0xad, 0x47, 0x60 }, { 0xb1, 0xd3, 0x71, 0x64, 0x04, 0xc9, 0xd2, 0x0a, 0xb1, 0xd3, 0x71, 0x64, 0x04, 0xc9, 0xd2, 0x0a } }, { "\x17\x3c\x8d\xa9\xde\xe7\x3c\x70\x85\x4b\xc7\x04\x03\x70\xe5\xf3\xbf\x47\x52\xe2\x33\x96\x88\xe0\xf3\x24\xce\x8d\xdd\x55\x47\x6b\x6d\x7b\x05\x42\xd1\x5a\x6a\x6f\xa0\x22\x0e\xee\x33\x68\x0b\x51\xf4\x50\xe0\x5b\x4b\xfd\x7f\x0a\x2a\xbc\x07\x3d\x26\xcb\xab\x3b\xd2\xa3\x3a\x7e\xe9\xdd\xcf\x34\x4e\xad\xfc\x6e\x4b\xa5\x35\x81\x4b\x70\x85\x86\xa2\xd2\x51\x44\x5f\x4b\x10\xc1\xb7\xc5\xe6\xab\x8b\xc2\x54\xb7\x2f\x8d\x79\x53\x0a\xe6\x82\xcd\x44\x9c\x33\x22\x46\xb6\x18\x4a\x88\xdf\x62\x80\xab\x2a\x2b\x6b\x01\x65\x64\x97\xe5\x79\x43\x7d\xe9\x55\x81\x73\x01\x5f\xca\x8a\x92\x1d\x80\x98\xfc\x53\xfc", 147, { 0xf0, 0x73, 0xd7, 0xe6, 0x4c, 0x6a, 0x7d, 0x0f, 0x48, 0x6a, 0xbe, 0xa4, 0xf5, 0x23, 0x3a, 0xe9 }, { 0x35, 0xa8, 0x2f, 0x98, 0x39, 0x4b, 0x3d, 0x0f, 0x35, 0xa8, 0x2f, 0x98, 0x39, 0x4b, 0x3d, 0x0f } }, { "\x9a\xf2\x44\x62\xb3\xee\x1e\x8d\x2c\xf4\x0d\xf4\xde\x7e\x0f\xed\xb0\xed\x76\x2b\x6a\xf1\xbc\xeb\xb8\x64\xf3\x69\x44\xda\xaa\xf4\x2e\x7b\x50\x3a\x31\xe2\x7e\x05\xec\xff\xbf\x96\xe2\x59\xc2\xa5\x98\x09\x35\xb6\x31\x53\xb9\xe4\xc2\xee\xf6\x6e\xef\x37\xde\x70\x8a\x34\x88\x61\x80\x26\x32\xf3\xe5\x42\xea\xbd\x5d\xb5\x84\xfa\x88\x12\x6c\x9f\x42\x65\xcf\x64\x3b\x03\x1a\x33\xdb\x08\x7b\x9a\x53\xaf\x29\xf5\x9d\x5b\xaf\xd7\x0d\xbe\x0a\x69\x86\xf5\xda\x65\xa1\x57\xf3\xca\x38\x23\x93\x1d\x98\xa6\x2b\x82\xaa\xf8\xa6\x0c\x9c\x4a\x05\xfc\x22\x30\xcb\xa3\x76\x87\x17\x85\x04\x34\x80\xf1\x0c\x71\x86\x77", 148, { 0x67, 0xb2, 0xa1, 0x39, 0x14, 0x79, 0x69, 0xaa, 0xb1, 0x66, 0xfb, 0xff, 0xb6, 0xdf, 0x54, 0xdf }, { 0x25, 0x10, 0x32, 0xb5, 0x41, 0xf2, 0xdb, 0x04, 0x25, 0x10, 0x32, 0xb5, 0x41, 0xf2, 0xdb, 0x04 } }, { "\x5b\x45\xf8\x23\x25\x82\x26\x72\x35\x93\x10\xfd\x0d\x3e\x5a\x55\x93\xfb\xa8\x6a\x7b\x65\xaa\x92\xd4\x4a\x50\x2b\x9d\xc7\xf0\xa6\xbe\xe8\xeb\xd0\x8d\xf9\x7c\x79\xd7\xd5\x91\xb0\x79\x31\x5e\x51\x41\xf3\x96\xd2\xbc\xe5\xc9\x63\xe5\x8a\x34\x92\x27\x93\xd2\x2c\xdc\x5f\x75\xd5\xa1\x62\x1c\x76\x39\xa7\x26\x62\xf1\x95\xb1\x21\xef\x25\xb4\x06\x15\xd5\x0e\x5f\x6e\xb6\x1c\xbc\x3f\x3f\xc7\x42\x02\xb2\xd4\xc3\xd7\x1e\xc0\xdf\x8c\x27\x1e\xa1\x8c\x74\x21\xb8\x07\xcd\x0c\x3e\xf7\xba\xf6\xf8\x20\xaa\x31\x4d\xfa\x2e\xd4\xcb\x45\x56\xd9\xfc\xa5\xf8\xeb\x21\xeb\xd3\x9b\x4e\x5b\xa8\x77\xe4\xa4\x18\xaa\x4f\xe2", 149, { 0x13, 0xb2, 0xe9, 0xf8, 0x80, 0xc8, 0x6a, 0xd1, 0x09, 0x73, 0xcd, 0xd2, 0x73, 0xe7, 0x08, 0x92 }, { 0xd5, 0x02, 0xf8, 0x50, 0x07, 0xb2, 0x6b, 0xf7, 0xd5, 0x02, 0xf8, 0x50, 0x07, 0xb2, 0x6b, 0xf7 } }, { "\xde\x9a\xba\x6c\x55\x8f\x2a\x84\xd6\x9b\x22\xdd\x6a\xd6\x1e\x40\x63\xe1\x42\x03\xd8\x22\xc0\x1f\xd2\xfb\xc1\xe4\x84\xaf\x51\x96\x6f\x39\xb9\xbd\xc5\x05\x35\xac\x80\x9d\x0e\x51\xd5\xf1\xfb\x4b\x54\xd9\x36\x55\xf1\x96\x3b\x7c\xed\x10\xd8\xc8\x38\x90\x12\xc5\xd5\xa6\xa2\x2e\x31\xa2\xf3\x26\x9f\x88\x3a\xee\x84\xed\x4c\x08\xe0\x35\x06\xf1\x71\xc7\xa5\xe1\x87\x5a\xf2\x73\x2b\xeb\xe8\x90\x72\x28\xa8\x4d\xee\x8a\xe4\x8d\x51\xdb\x9f\x5c\xb1\x27\x5b\x10\x2c\x90\x23\x49\x33\x5b\x11\x5d\x3e\x1e\xfa\x8e\x73\x03\xae\x75\xf9\xa3\x35\x20\xf6\x7c\x9d\xed\x59\x8d\xfd\xf1\xbb\xb1\xb1\xbc\xf1\x7e\xa4\xb1\x22\x21", 150, { 0x22, 0xca, 0xc8, 0x57, 0x00, 0x44, 0xa0, 0xa3, 0x48, 0xa2, 0xbf, 0x1f, 0xa0, 0x7c, 0xa7, 0x6b }, { 0x8b, 0x41, 0x42, 0x5c, 0xbc, 0x8a, 0x1f, 0xc4, 0x8b, 0x41, 0x42, 0x5c, 0xbc, 0x8a, 0x1f, 0xc4 } }, { "\xad\xdf\x50\x2b\x40\x73\xd1\xe1\xb2\x85\xef\xe2\x6d\x96\x41\xa4\xe5\xa4\x33\x98\x85\xf6\xe0\x34\xc5\x92\xf7\x4c\x7b\x71\xc4\x4d\xd5\x70\x12\x4f\x64\x30\x40\x3e\x97\xf4\xe2\xef\x71\xab\xc8\xfe\x3d\xfd\x63\xb4\xc8\x6a\xb2\x5b\xf9\xa1\x76\x99\x55\x25\x26\x77\xff\xfb\x57\xd5\x04\x53\x2a\xda\x60\x17\x6f\x3c\xa5\xee\xb1\x0d\x86\x0b\x2b\x56\x35\x8f\x98\x62\x7a\xd2\x4a\xc1\x4d\xdc\x66\x87\x42\x4c\x84\xc5\x00\xc7\xa8\x8a\x30\x59\xd4\xdf\x33\xd3\x53\x64\xe4\x42\x60\xfb\x0d\x9e\x22\x48\x80\xcf\xc7\xe4\x6d\x77\x18\x54\x63\xc2\x4e\x0f\x74\x52\x08\x3d\x09\x5c\x94\xda\xa6\x3f\xf2\x54\x8c\x22\x27\xf1\x1f\xb7\xef", 151, { 0x45, 0x2b, 0xbb, 0x5f, 0x8c, 0x67, 0x2d, 0x66, 0xdc, 0x82, 0x6e, 0x16, 0x87, 0xb3, 0x4c, 0x08 }, { 0xb3, 0x90, 0x91, 0x83, 0x74, 0x1b, 0xf2, 0x29, 0xb3, 0x90, 0x91, 0x83, 0x74, 0x1b, 0xf2, 0x29 } }, { "\xee\xd2\x12\xfb\x52\x7c\xdd\xe7\x02\x9a\x8c\xaf\x4e\xb0\x62\x3d\x98\x51\x8a\x02\x4f\x66\x08\x1e\x40\x95\x0c\xf8\xbf\x75\x91\x89\xed\x54\x34\x04\x28\x57\xb7\x7a\xaa\x81\x33\x47\xd2\x19\xf2\x49\x4d\x78\x65\xc1\x98\x3d\x6a\x96\xdc\x12\x48\x52\x57\xc6\x40\x17\xf8\x26\xab\x32\xf1\x4a\xd9\xb3\x53\xcf\x16\xe4\x3f\xda\x31\x68\x10\x88\xc9\x82\x17\xd2\x33\xde\x10\xb7\x57\x5d\x30\x8d\x16\x2a\x75\x04\x7c\xc9\xdb\xf4\x45\x78\x4c\x2e\x94\xed\x95\x90\xca\xad\x37\x16\x68\x5e\x90\x19\xd8\xbc\x69\xbb\xd3\x6c\xdc\xcd\x7b\x30\xf2\xe9\xf8\x67\x58\x80\x18\x78\xf0\x28\x50\xa5\xb9\x8e\x61\x76\x60\x8a\xcf\x6a\x52\xa2\x98\xef", 152, { 0x89, 0x67, 0x6b, 0x00, 0xaf, 0x6b, 0x2f, 0x6a, 0xe3, 0x85, 0x45, 0x80, 0xb5, 0x3f, 0x9d, 0x6c }, { 0x6f, 0x19, 0xe5, 0x14, 0xa2, 0x28, 0x67, 0xf2, 0x6f, 0x19, 0xe5, 0x14, 0xa2, 0x28, 0x67, 0xf2 } }, { "\x01\x39\x20\x9d\x67\xa2\x8c\x63\x57\x12\x6e\x56\xf4\x84\xd5\xbc\x3a\x5b\x6d\x97\xc3\x16\xcc\x36\x2c\x05\x8a\x3e\xda\xa5\xda\x6b\xd3\xb9\xa7\x3b\xeb\x0f\x76\xc0\x67\x0a\x03\x8c\x1c\x7f\x49\x64\xc9\xca\x04\x80\xc0\xf6\x59\x3c\x25\xd5\x20\x2a\x79\x50\xdf\x50\x53\x2a\xba\x9e\x31\x6a\x6c\xac\x17\x07\xdb\xd3\x5f\x20\xca\xc7\xb8\xdf\x8a\xa8\xf3\xeb\x44\x94\x2b\x6e\x82\x12\xb2\x96\x5b\x05\x2d\x28\x39\xe9\x81\xc2\x20\x29\x69\x8b\x85\x60\xff\x9e\x08\xf5\xeb\xe1\xc8\x82\xd4\x0f\x15\x69\x7e\x9d\x1f\x91\x3f\xd3\x53\xef\x2c\x28\x77\x17\xad\x93\xeb\xfc\x38\x7d\x0a\xcb\x18\x92\x09\x27\xe0\x49\x85\xa2\xb3\x8f\x90\xf6\xd5", 153, { 0xe7, 0x9f, 0x7f, 0x45, 0xb5, 0x9c, 0x3c, 0x2f, 0x1c, 0xf9, 0x84, 0x7a, 0x32, 0x35, 0xb3, 0x80 }, { 0x89, 0x2e, 0x8b, 0xd4, 0x4d, 0x89, 0x34, 0x38, 0x89, 0x2e, 0x8b, 0xd4, 0x4d, 0x89, 0x34, 0x38 } }, { "\x5e\xbe\xcb\xe4\xe5\x99\x70\x5a\xa0\x8a\xde\x58\xfe\x5d\xe8\x32\x8b\x85\x6c\x46\x40\xfe\xcf\x38\x1b\x22\x1d\x99\x59\x33\x52\xec\xc4\xab\x20\x7d\xdc\x69\x6d\xa8\x79\x53\x48\x78\x11\xe2\xdd\x15\x61\xf1\x0a\x88\xf1\x58\xc0\xde\x99\x90\x74\xd4\x3a\xc3\xee\xa2\x44\x6b\x02\xfe\xb2\x6a\xb9\xc4\xb6\x3f\xc2\x90\xe7\x6e\x11\xb8\x3d\x7a\xf3\xa8\x7b\x1e\xe0\xd9\x66\x58\xd9\x56\xb7\xdf\xc3\x45\x2f\xff\x01\xc9\xcf\xf5\xda\xea\x9b\xd8\xef\xa2\xc6\x97\x9e\xe6\x4d\x31\xbd\x26\x21\x2c\xd8\xaf\xcd\xdb\xcf\x02\x98\xd7\x6a\xa3\xec\x3f\x7b\x93\x17\x64\xa8\x6a\x1e\xc1\x61\x1d\x93\xd0\xdf\xd5\xb5\x6b\xb9\x1f\xc4\x13\x2c\x8f\x33\x0f", 154, { 0x11, 0xf8, 0xc4, 0xdc, 0xe7, 0xb5, 0x25, 0xa6, 0x30, 0x58, 0xf0, 0xe6, 0xf7, 0x04, 0x05, 0xc2 }, { 0x22, 0x41, 0x35, 0x66, 0x54, 0xd7, 0x58, 0x10, 0x22, 0x41, 0x35, 0x66, 0x54, 0xd7, 0x58, 0x10 } }, { "\xc2\x7e\x35\x7e\x47\xa0\x47\x69\xf5\xc6\x0b\x2d\xb3\x75\x86\x7d\x42\x9a\x46\x4c\x78\x3d\xa0\xa3\x84\x9c\xfe\x46\xbb\x99\xad\xb0\x20\x99\x58\x77\xe7\x5b\xb7\x37\x20\xff\x10\xbf\x1e\xcc\x58\x12\xcf\x76\xd9\x07\x26\x92\xfb\x6f\xa6\x94\xd8\x5d\x72\xa4\x1d\x87\x02\x22\x58\x6d\x14\x69\xe7\x01\xeb\x1c\x5c\x15\x28\x59\xdb\x2f\x83\x13\x1b\xc5\x9a\xb4\x9f\x95\xbe\xfb\x30\x42\x5b\x6f\x62\x02\xe9\x04\x6a\x40\xeb\x2f\x48\x9a\x1a\x5b\x11\xaf\x79\xb3\x54\xe7\x8b\x50\x48\x10\x3b\x8c\xef\xbd\xe1\x78\xc1\xf6\x9a\x0f\xf9\x60\xe9\x8a\xfc\xab\x05\x16\x9d\xab\xd8\x7b\x16\xe7\x06\x10\xd0\xe8\x8a\xf7\x7b\x8c\x67\x96\x08\x5f\x49\xc5\xb4", 155, { 0x2c, 0x0f, 0x82, 0x44, 0x4f, 0x05, 0xb5, 0xcf, 0x44, 0x47, 0x9b, 0x7b, 0x58, 0x97, 0x65, 0x23 }, { 0x93, 0x0a, 0x79, 0xaa, 0x54, 0xaf, 0x7d, 0xd8, 0x93, 0x0a, 0x79, 0xaa, 0x54, 0xaf, 0x7d, 0xd8 } }, { "\x6d\xd4\x08\xed\x1c\x0d\x8d\xa3\xfd\x1e\x5c\x4f\xee\x02\x96\x3a\x5a\x2e\x62\xd0\xcc\xc9\x49\x25\x11\xa6\x7a\x5f\x71\xf6\xae\xee\x9b\xb7\x43\xc0\x4c\x78\xaa\x49\x86\x7a\xa0\x0a\x8b\x51\x50\x5a\x33\x99\x0c\xf2\xe8\x78\xe2\xbe\x4b\x0e\x26\xb7\x1b\x30\x30\x0c\x9a\xa8\xc7\x9b\x35\x3f\x0a\xff\x31\x18\x2f\x85\x28\xdc\x87\x8f\x39\x29\x88\x51\x05\xb1\xd4\xf5\x2e\x68\xc2\x87\x97\x74\x32\x60\x60\xfa\x54\x67\x96\xd3\xaa\x46\xcf\x8c\xad\x89\xb1\x19\x41\xf2\x0b\x95\xa5\xab\x47\xba\x0a\x74\x65\xdb\x44\x1d\x4f\xaa\x19\x31\x8b\x5a\x47\x11\x2d\xa9\x2e\x11\x92\x30\xab\x3f\x8d\x84\xd2\xf6\x5e\xf7\x16\xf4\x74\x8f\xd2\x8f\x8b\xd8\x67\x1e", 156, { 0xd2, 0x79, 0x38, 0x0e, 0xc6, 0x0e, 0x92, 0x0e, 0x2b, 0xb3, 0x16, 0x78, 0x8d, 0x40, 0xe5, 0xd7 }, { 0xf2, 0xef, 0x3d, 0xcb, 0x0d, 0xbd, 0x25, 0x3b, 0xf2, 0xef, 0x3d, 0xcb, 0x0d, 0xbd, 0x25, 0x3b } }, { "\x38\xa6\x35\x9d\x0c\xe5\x03\x10\xd7\x37\x2a\xdc\x32\x0e\x51\xd5\xec\xf8\x64\x87\x8a\x54\x44\x26\xda\x95\x53\x10\xa6\x00\xb9\x46\x49\x03\xa5\x50\x79\x47\xb7\x03\xed\xdd\x3f\xd5\x4c\xee\x76\xa8\x4f\x0c\x31\xe4\xf6\x4f\xc1\x20\xcf\x6b\xc9\xb4\xd1\xb1\x9c\x9b\x31\xcb\x53\x59\xe5\x1e\x78\xe9\x02\x81\x3c\x42\x29\x3b\x4f\x0d\x41\x72\xee\x9c\xfa\x2c\x42\x18\xca\x38\x48\xd8\x39\x14\x4a\x45\x75\x69\x90\x3a\x20\xe3\x44\x3e\xe1\xfc\x27\x1b\x66\x1b\x88\xdb\xff\x80\x2c\xff\x5b\xc0\xd9\x0d\x80\xc3\xdb\x1f\x31\x4a\x21\xdd\x84\x7b\x40\xa0\xdb\xe3\x7a\x01\x60\xc2\xbc\x81\x8d\x69\x56\x84\xdc\xa1\x35\xb1\x26\xc7\x03\x69\xbf\xef\x5e\x3e\xf9", 157, { 0x15, 0x95, 0xe2, 0x0c, 0x48, 0xbe, 0x3f, 0x17, 0x90, 0x40, 0x33, 0x5f, 0xbe, 0xa9, 0x62, 0x1d }, { 0x8b, 0x81, 0xe1, 0x83, 0x13, 0xcd, 0xf6, 0x7e, 0x8b, 0x81, 0xe1, 0x83, 0x13, 0xcd, 0xf6, 0x7e } }, { "\x16\xe7\xcd\xb0\xab\xeb\x09\x2c\x01\x9a\xb2\x72\x1c\x22\xc5\x87\x8f\x50\xf0\x83\x67\x98\xe9\xd2\xf7\xde\x99\x8d\x00\xed\xfb\x7e\x31\x5d\x06\xa6\xf3\xe5\x77\x66\x10\x78\x5d\x88\x03\xa0\xa1\xf6\x64\x8d\x36\x51\x4c\x6e\xd3\x15\x83\x81\x3d\x0c\xb5\xa2\xb8\xa9\x15\x6d\x5a\xa3\xee\xd7\x9b\xa5\x2b\xc5\xb4\x84\x2e\xf6\x2a\x55\xbf\x26\xc2\x56\xf1\x91\x0a\xda\x38\x3d\xca\x84\xaa\xf7\x1a\x7e\x21\xda\x4f\x3d\x05\x12\x8c\x24\x9d\x9b\x98\xd1\xac\x53\xad\xc8\xaa\xd9\x46\x28\x91\x8c\x94\xd4\xc7\xdb\x79\x25\xdc\x39\x26\x3e\xc2\x8c\x39\xb0\x8a\x9f\x8e\x99\x1e\x79\x8a\x2c\x49\x7a\xf5\xd4\x5b\x3c\x94\x2c\x4c\xf1\x7e\x70\x29\x02\x93\x19\xaa\xc8", 158, { 0x3e, 0x3b, 0x75, 0xd1, 0x06, 0xc0, 0xc5, 0x7f, 0x70, 0x80, 0xd3, 0xd5, 0x8e, 0x01, 0x99, 0x0d }, { 0x5d, 0x5a, 0x9a, 0xfe, 0xe6, 0x62, 0x13, 0x7d, 0x5d, 0x5a, 0x9a, 0xfe, 0xe6, 0x62, 0x13, 0x7d } }, { "\x33\xc7\x82\x61\xe4\x76\x52\x8e\x8a\xe8\xdf\xb0\xfc\x6e\xda\xa1\x3e\xca\x88\x80\xc7\x51\xd9\xf8\x89\xfd\xdd\x94\xc7\x17\x27\xd0\xc0\x37\x34\x75\x1c\x09\xae\x17\xbd\xf0\xf1\x13\x7b\x47\x50\xf6\x61\xc7\x22\x7f\x95\xa9\x22\xb5\xbe\xcb\x6f\xfd\x73\xc1\x85\xd5\xe9\xcd\x8b\x43\xea\xdd\x49\x03\x19\x47\xcf\xde\x7a\x15\x72\x74\xc5\x9d\x68\x44\x09\xd2\x6f\x60\x70\xd4\x46\xd6\x2d\xd1\x55\x41\x49\x5c\xb9\xca\x70\x9c\x32\xc3\x4c\x6d\x68\x25\x0c\xc9\x94\x20\xa1\xef\x36\x6e\x81\x4f\x69\x19\x3a\x28\xd5\x82\x62\x13\x7b\xd1\x70\x4c\x9d\xe1\x22\x87\x6b\x5c\x3e\x6a\xff\xe4\x9a\x51\x83\x00\x1e\x02\x6c\xff\xee\x85\xbb\xfe\xfe\x12\x60\x62\x3c\xb1\x0a", 159, { 0x58, 0x73, 0x7b, 0x44, 0x83, 0xfd, 0x8f, 0x9d, 0x40, 0x36, 0xbb, 0x54, 0xf7, 0xdc, 0xa7, 0x1e }, { 0xbd, 0x8f, 0x8c, 0x43, 0xbf, 0x83, 0xe8, 0x1b, 0xbd, 0x8f, 0x8c, 0x43, 0xbf, 0x83, 0xe8, 0x1b } }, { "\xf5\x26\x8c\x0d\x40\x28\xdb\xaf\x34\x0e\xa4\x6e\x23\x0e\x10\x35\x7e\xbf\x3b\x46\xb7\xd2\xb6\xc1\x19\x97\xf7\x43\xdb\x8f\x92\x13\xfe\xa4\xa6\x74\x0c\xb7\x48\x6c\xa3\x09\x5a\x9e\x35\x88\xf1\x67\x44\xa5\xfd\x54\x25\xde\x01\x2a\xd5\x0c\xeb\x19\x16\xff\x4e\x83\x86\xab\xad\x82\xc4\xb5\x3a\xac\x2b\xa6\xd1\xdf\xb3\x88\x14\x43\x8f\x03\x44\x3f\xd7\x11\xe9\xbc\x7b\xac\x7e\x21\x18\x1a\xea\x77\x4a\x80\xa0\x86\x60\xac\x3b\x0e\x6e\x59\xdb\x5e\x49\x1a\x84\xd5\x56\x38\x77\xd2\xe6\x67\x42\x48\x3b\x95\xa3\x5b\xd8\xfc\xd9\xed\x66\x39\x15\x1a\xe7\x8b\x89\x18\x23\x2c\x03\xfa\x71\x8b\xf5\x08\xc4\x74\xa7\xd9\xdf\x4f\x64\x01\xe2\x35\x7e\xfa\x79\xeb\x1c\x4a", 160, { 0xc4, 0x67, 0xa0, 0x07, 0xfa, 0xd7, 0xa5, 0x5c, 0x75, 0x61, 0xcb, 0x22, 0x0a, 0x6c, 0x37, 0x67 }, { 0x1f, 0x6d, 0x8f, 0xab, 0x7c, 0x51, 0x50, 0x9a, 0x1f, 0x6d, 0x8f, 0xab, 0x7c, 0x51, 0x50, 0x9a } }, { "\xe2\xb6\xfd\xa5\xb9\xad\xc3\x1f\xd3\xd5\xe5\x12\x01\x35\x17\x56\xd1\x57\x3e\x5c\xa3\xd6\x8e\x37\x50\x72\xd1\x03\x46\x49\xbe\xa9\x7f\xfc\x19\x18\xca\xd8\xb9\x53\x03\x9b\x8e\x1c\xee\x49\x20\xb6\x99\xef\xf1\xe0\xd2\x77\x19\x5f\xa3\x12\x0a\xf4\x73\xc8\xa2\xd8\xff\x34\xec\x7f\x1c\xad\x87\xb9\x5c\xe8\x3f\x0e\xeb\x5c\xe5\x96\x7c\xe3\xd0\x11\x08\xb4\xdd\xab\x1a\x27\x00\x90\x0d\xa3\xc0\x32\x29\xc9\xe6\x45\xc3\xba\x7b\xda\x1a\x4b\x2e\xd5\x67\x72\xca\x32\x90\x8d\xe1\xe8\xab\x78\xcb\x1d\xbe\x84\xd4\x7e\x72\x26\x36\xbb\xaf\xa0\x5a\x0e\x3b\x44\x61\xbd\x1c\x21\xd6\x61\x3b\xc7\x30\xab\xb8\xb2\x2d\x59\x9d\xf5\xf1\x47\xbb\x4c\x9e\x32\x40\x47\x35\xf0\xb7", 161, { 0x0b, 0xf7, 0x7d, 0x7f, 0x0a, 0x39, 0xc4, 0x60, 0xbe, 0xaf, 0xc0, 0x96, 0xa5, 0xff, 0x8f, 0xf1 }, { 0x5e, 0xc7, 0x0e, 0xa7, 0xfc, 0x4c, 0xca, 0x5c, 0x5e, 0xc7, 0x0e, 0xa7, 0xfc, 0x4c, 0xca, 0x5c } }, { "\x88\x11\xda\x74\x63\xaf\x60\x31\x13\x2e\xbe\xa3\x68\xea\xc4\x8d\x3e\xf6\x12\xda\xfb\x65\xba\x02\x32\x44\x16\xa9\xfd\xa5\xc5\xb6\xf6\xab\x8e\x76\xb8\x80\x11\xf9\x47\x02\xb6\x04\x74\x0a\x6c\x3c\xd2\xe1\x3b\xf6\xdd\x35\x44\x8a\x4c\xbf\x2f\xa1\xb3\x4e\xf8\xb1\x11\x94\x41\xe7\xaf\x9a\xef\x9b\x54\x52\x3a\x7d\xce\xe6\xc4\xe6\x73\x3e\x2b\x19\x58\xeb\x23\x9d\x40\xde\x9f\xa8\x0c\x47\x1b\xff\x64\x82\x70\xd8\xdd\x97\x8b\x93\xd8\x7a\x91\x51\x40\xa4\xb5\x4f\x34\xa0\xeb\x70\x91\xb0\x8a\xfd\xc4\x54\x59\x05\x32\xfe\xed\xa3\x57\xe2\x34\x42\x8a\xa6\xb0\xa4\x43\x43\xf9\x6b\x07\x87\x43\x17\x63\xcb\x26\xa0\x6d\x08\x22\x75\xb1\x82\x89\x40\xb1\x65\x0b\xdd\x88\xcc", 162, { 0x86, 0xaa, 0xe8, 0x45, 0x7b, 0xe3, 0x52, 0x3f, 0x2a, 0xc0, 0xe1, 0x80, 0x81, 0x90, 0x1c, 0xd4 }, { 0x20, 0x53, 0x15, 0xaa, 0x27, 0x9b, 0x6d, 0x8a, 0x20, 0x53, 0x15, 0xaa, 0x27, 0x9b, 0x6d, 0x8a } }, { "\x97\xe4\x99\xa8\xb4\x28\xd5\x30\x0a\xc4\x3f\x53\x62\x0c\x1c\x2a\x9b\x6f\x35\x57\x0d\x7f\x67\x88\xdb\xb2\x2e\x93\x8b\x08\x58\xcd\x4d\x6c\xcd\x0c\x72\xbb\xfa\x92\x56\xbc\x98\x03\x96\x7f\x58\xd8\xb8\x78\x9c\x76\x3f\x30\x7b\xa6\x95\x51\xdf\x2d\x21\xff\xac\x9a\x22\xc6\xa0\xfc\xa5\x3d\x19\x8c\xae\x6f\x04\x46\x5a\x2d\xac\xb9\xee\x95\x98\x36\x57\xda\x78\x47\x27\xe7\xb7\xea\x12\x7f\xa2\x92\x3a\xfb\x6b\xef\x50\x03\x0f\x28\x83\x60\xf5\x79\xb2\x9c\x04\x64\x27\x80\x02\x92\x5d\xac\x0b\xac\x9d\x58\x32\x6e\xac\x34\x67\x7a\xcf\x49\xf0\xe9\x27\xeb\x19\xf8\x21\xfa\x8a\x94\x29\x0a\x66\xc7\xf3\x9f\x96\x57\x7a\x63\x7b\x46\xf2\x10\x83\x60\x4b\xfd\xdb\x5c\x09\xda\x4f", 163, { 0x91, 0xe3, 0xcc, 0x45, 0x80, 0x51, 0x06, 0xb8, 0xff, 0x87, 0x94, 0x3a, 0x05, 0x8e, 0x09, 0xdd }, { 0x33, 0x01, 0x31, 0x06, 0xaf, 0x11, 0xf8, 0x0a, 0x33, 0x01, 0x31, 0x06, 0xaf, 0x11, 0xf8, 0x0a } }, { "\x40\x93\x11\xe7\x5d\xf7\xcb\xa0\x03\xc3\x71\x14\x00\x85\x1d\xca\x3d\xad\xac\x24\x89\x8c\x63\x92\xa5\xf4\xe9\x82\xca\x1e\x9b\xb7\xd8\xac\x44\xa9\xeb\xd3\xc3\x38\xe9\x74\x2a\x59\x71\x39\x5f\xf3\xed\xf6\x31\xaa\xec\x21\xa0\x05\x77\x4d\x54\xe7\x4b\x58\x4d\x0b\x64\x4d\x76\x26\x8a\x56\x35\xdd\x37\x5c\x83\x55\xaf\x8d\xc1\x27\x10\x44\x6a\xe7\x9e\x26\x72\x10\xd3\xfc\xea\x6e\xa3\x8d\xc8\x72\xbe\xf4\x63\x61\x9a\x78\xbf\x49\x1c\xb9\x13\x60\x35\xc7\xed\x98\xd7\xd1\x51\x23\x2a\xeb\x96\x43\xca\xa9\x64\xa2\xcc\x86\x62\xd0\x2c\x57\xa4\x93\xdb\x9f\x93\x28\xef\x68\x46\xfc\xea\x0a\x06\xf3\xad\x94\xe8\x2d\xe5\xbe\x08\x5a\xff\x04\xfb\xe0\xb4\x9a\x2d\xd8\x26\xd7\x22\xc1", 164, { 0xbb, 0xdb, 0x8d, 0xb7, 0x8e, 0x68, 0x24, 0x05, 0xda, 0xb9, 0xed, 0x38, 0x37, 0x35, 0x8b, 0xb8 }, { 0xc5, 0xb5, 0xa1, 0x1d, 0x07, 0x20, 0xb3, 0xb9, 0xc5, 0xb5, 0xa1, 0x1d, 0x07, 0x20, 0xb3, 0xb9 } }, { "\xa0\x00\x91\xdc\xb7\xe4\x48\xb4\x83\x00\xbc\xea\xf9\xbf\x54\x3f\xa1\x49\xac\x18\x08\x0d\x3a\x09\x40\xe8\xe8\xb7\x3b\xba\xa1\x56\x45\x04\xdb\xcd\x76\xa3\xe6\xb6\x25\x95\x6d\xb2\x94\x6f\x21\xb3\x0c\x92\xbf\xc1\x51\x77\x58\xf9\xe3\xe3\x3b\xf5\x44\x5b\xe2\x0a\xf7\x93\xba\x9a\xc6\x57\xd2\xbe\x3a\xde\x38\xe1\xe5\x32\xc0\xd4\x86\x81\x6b\x21\x2e\xfb\xa1\x4c\x18\x33\x17\x97\xd0\x9d\x6b\xe7\x79\x82\x39\x2c\x6c\xee\x04\xbb\x87\x0c\xb3\x3d\xaf\xe6\xb7\x46\x32\x73\x50\xe8\x44\x81\x61\xce\xea\xd7\x71\x0b\x14\xb0\xec\xa0\x83\xe2\x3d\x4b\x95\x77\x1d\xfa\x37\x79\x72\xbf\xbc\x29\x0e\xfb\x30\xa4\x7a\xd5\xf9\xbf\x8b\x76\x63\xc2\xff\x3f\x6a\x35\x9f\xce\x46\x97\x39\x68\xeb", 165, { 0x21, 0x73, 0xa9, 0xca, 0x0e, 0x65, 0xf1, 0xb2, 0x2b, 0x2d, 0x08, 0x94, 0x28, 0xe2, 0x19, 0xd7 }, { 0x17, 0xaa, 0xf1, 0xc4, 0xd7, 0x12, 0x91, 0x3f, 0x17, 0xaa, 0xf1, 0xc4, 0xd7, 0x12, 0x91, 0x3f } }, { "\x87\x1a\xe5\xf3\x6a\x1c\x99\x37\x34\x5e\x4f\x17\x3f\x08\x4e\x48\x2f\x50\xb9\xd5\x7c\x51\x82\xe4\xec\x49\x1a\x49\xfd\xf5\xd1\xe6\xac\x0b\x63\x91\xbf\x15\x1b\x6d\x53\x50\x7c\x95\x45\x07\x22\x4d\x1e\x87\x3d\x83\x6a\x59\x39\x82\x0c\xcb\xc6\x6e\x89\x81\x15\xe2\x2e\x22\x1f\xd0\x87\x70\x03\xd8\x2d\xcd\x5f\xf9\xe7\x7c\xbf\x77\x26\x9e\x78\x35\x3a\x46\x67\xf8\x8d\x25\xe3\x40\x6f\x54\xd4\xa3\x0e\x51\x07\x3d\x24\xe1\xb8\xf4\x5b\x70\xd5\xc5\x36\x0e\xcf\xf8\xc5\x90\x1c\x24\xa6\x02\x8e\x58\xe8\x67\x45\x5c\x2a\x13\xc4\x56\xde\x61\x47\x0d\x08\x75\xb5\x8e\x9e\xcb\x68\x60\x56\x64\xe3\x74\xef\x2f\xd8\x6d\x8c\x42\x5c\x8f\x29\xef\xb8\xb3\xe2\x6c\x8f\x14\x47\x00\xc0\xa9\x87\x5e", 166, { 0xc8, 0x6f, 0xef, 0xfd, 0xe2, 0x27, 0x40, 0x55, 0xbd, 0x7a, 0x17, 0x5b, 0x20, 0x81, 0xca, 0xa7 }, { 0x6e, 0x08, 0x8e, 0xe3, 0xca, 0xea, 0x61, 0xc9, 0x6e, 0x08, 0x8e, 0xe3, 0xca, 0xea, 0x61, 0xc9 } }, { "\xa6\x89\xa7\x1b\x32\x15\x7d\xd3\x48\x25\x3e\xd5\xf9\xb8\xaa\xa2\x51\x38\x92\x84\xef\x86\x94\x39\x95\xa1\xfd\x79\x47\x84\xab\x7b\x09\x83\x82\x26\xad\x00\xba\xbe\x21\x8c\x53\x8d\x62\x5b\x1f\x39\x37\xa3\xe9\x79\x0e\xdd\x86\x13\xc4\x5b\xc6\x89\x32\xe1\xc5\x3a\xf9\xa2\x5d\x0a\x4e\xd9\x42\x97\x3a\x67\x67\x3a\x7c\x1e\xd7\x12\xb2\xa6\x5c\xc3\xe8\xdc\x9b\x82\xe2\x2d\xf1\x03\x78\xf7\xda\x06\xf5\x19\x18\xc8\x34\x9a\x4d\x47\x2a\x9b\x20\xc9\xee\x6c\x88\xfa\x41\xcb\xff\xbd\x0d\x2d\x89\x76\x82\x7b\xc7\xb0\x1e\xb3\x65\x18\xba\xb0\xdd\x7e\xb1\xab\x24\xf7\xd4\xe3\xcd\x3d\xfb\x12\xaf\x07\x58\x4f\xf1\x4d\x37\x51\xef\x69\xdb\x4f\x42\xe9\x21\x4d\xa1\x8f\x67\x8d\xf6\x84\xb5\x69\x56", 167, { 0xb7, 0x6a, 0xcd, 0xf6, 0x31, 0xb2, 0x7d, 0xe8, 0x95, 0x9c, 0xcd, 0x89, 0xc9, 0x5b, 0x66, 0xec }, { 0xc2, 0xfd, 0xb2, 0xc6, 0x79, 0xb7, 0xa8, 0x9f, 0xc2, 0xfd, 0xb2, 0xc6, 0x79, 0xb7, 0xa8, 0x9f } }, { "\x95\xe6\xe0\xdd\x99\x41\xbc\x13\xa2\x23\xfc\x08\x64\xc6\x17\x45\xc7\x1b\xcd\x32\x5a\x14\x02\x54\x16\x38\xbf\x60\x73\xc7\x67\x49\x53\xe8\x85\x27\xd2\x03\xab\xd0\xaf\x42\x30\x76\x04\xde\x82\x76\x60\x0d\x54\x99\xe9\x07\x54\x12\x96\x13\x5c\x3c\x9a\xdf\x07\xbb\xd7\x86\x08\xa5\x30\xeb\x55\xcd\xe9\x50\x69\x25\x75\xbc\x68\xf3\x7f\xf4\x94\x35\xac\x37\x21\x94\x50\xb6\x48\xd4\xed\x82\xc0\xb0\x04\x2e\xd8\x36\x6e\x35\x10\xee\xd4\x01\x7c\xb7\xd8\x9c\x6b\x70\x28\xdf\xdd\x06\x8c\xe5\x62\x74\x91\xbd\x70\xc3\x63\x56\x2e\x00\x44\x27\xf4\x09\x5f\x66\xae\xd3\xea\x6f\xe8\x9b\x13\x2f\xa5\x41\xe2\x9e\xa6\x00\x60\xee\xa7\xe8\x7d\x36\x3d\x8f\x18\x47\x17\x48\x1e\x14\xd2\xc4\xf4\x8e\x0d\x95", 168, { 0xde, 0xb6, 0x05, 0x1b, 0xcf, 0xe9, 0x0b, 0xdc, 0x55, 0xae, 0xf7, 0x91, 0x1a, 0xa0, 0x9c, 0x30 }, { 0x93, 0x90, 0x6e, 0xe9, 0xed, 0xbc, 0xad, 0x39, 0x93, 0x90, 0x6e, 0xe9, 0xed, 0xbc, 0xad, 0x39 } }, { "\xaa\x23\x22\xf0\xc5\x6d\x85\xc1\x11\x3b\xdf\x7d\xbd\x84\xee\xa0\x95\xf4\xbd\x14\xc0\x03\x17\xb5\x23\x7c\x87\xcf\x25\xa7\xfb\x5a\x73\x18\xda\x9c\x90\x7c\x1d\x18\x12\x99\x9f\x59\x58\x86\xbc\x2e\x77\xb9\x28\x66\xd3\x7f\x56\x11\x22\x94\x98\x70\xe1\x31\x78\x01\x37\xde\x52\x69\x6b\x5f\x07\x9f\x74\x59\xac\x9b\x38\x2f\x57\x24\x38\xad\x92\x91\xef\xe0\x47\x77\x63\xab\xb7\x7d\x07\xf9\x0f\x1f\xa4\x79\xd7\x36\x1c\x67\x1a\xdd\xd4\x51\x49\xd9\x38\x57\xd6\x4c\x6e\x1b\x6d\x42\x5c\x05\x5c\xfd\x56\x31\x37\xd9\xdb\xe4\xa7\x31\xac\x85\x16\xd8\xba\x20\x24\x55\x89\x60\x38\xe5\x29\xa9\x68\x45\xfe\x02\xd8\xcb\x14\x23\xe0\x1c\x7f\xfe\x71\x92\x13\x72\x4a\xa8\x56\xcd\x42\x3e\x2a\x9c\x07\x73\x29", 169, { 0x5e, 0x9a, 0x39, 0x8c, 0x7b, 0xd5, 0x00, 0xcb, 0xc5, 0xd4, 0xd0, 0x89, 0x96, 0x5b, 0xff, 0x19 }, { 0xf2, 0x82, 0x97, 0xbc, 0xd5, 0x6b, 0x65, 0x55, 0xf2, 0x82, 0x97, 0xbc, 0xd5, 0x6b, 0x65, 0x55 } }, { "\xeb\xdf\xa9\xd2\x11\x4a\xd2\xf1\x4c\x13\x20\xb8\x28\x30\x45\x50\x81\x1d\xb7\xcb\xf6\x53\x04\xd0\x3f\xee\x27\xfe\xfd\xb6\x34\xa0\x83\xc1\x0b\x6b\x91\x14\xa1\x4d\x59\x96\xb9\x64\x26\xb9\xc3\x73\x1c\x63\x61\x2a\x77\x0e\xe3\x84\x79\x8d\x6f\x29\x94\x91\x62\x66\x46\x04\x42\xae\xbb\x77\x66\xcb\xb1\x02\x9f\x58\x72\xae\xa9\xf1\x8a\x18\xd1\xa8\x2b\xec\xfa\xff\x47\xb9\xac\x83\xf3\x9f\x91\x3a\x47\x17\x17\xb3\x71\xa2\x77\xe6\x20\x25\xdb\xcf\x02\xaa\x80\x7a\x39\xa1\x5d\x3f\x28\x98\xe7\xa7\xbc\x29\x18\x0f\x0e\x30\x68\x98\xa3\xe0\x8d\xf3\x60\xd3\xc6\xef\x17\xf5\xff\xe3\x59\xc1\xe2\xd4\xbf\xce\xbb\x90\x71\x64\x78\x88\x59\x2a\x73\xe6\xe2\x86\x99\xe4\x91\x63\x68\xac\x96\xbf\x58\x57\xaa\x5d", 170, { 0x37, 0x33, 0x1b, 0x06, 0x76, 0x0d, 0x13, 0x1e, 0x80, 0x3d, 0x91, 0xa4, 0x65, 0x7d, 0x68, 0xa5 }, { 0xa6, 0x12, 0x6d, 0x95, 0xc1, 0xbe, 0x4f, 0xfc, 0xa6, 0x12, 0x6d, 0x95, 0xc1, 0xbe, 0x4f, 0xfc } }, { "\x59\x07\x13\x5e\xb1\x65\xd7\x6b\x44\xa5\x99\x5c\xba\x6a\x74\x3e\x84\xd0\xcf\xeb\xd2\x82\x88\xaa\x76\x17\xf9\x0f\xd9\x8a\x99\x75\x99\x50\x80\x39\x3c\x75\x74\x89\xbb\x5a\xc8\x80\x12\x12\x79\x91\xf1\x52\x15\xad\x42\x77\xd6\x52\xd5\x0f\xb2\x5a\x1c\x64\xb3\xd4\xed\xac\xb1\x31\x6f\xe8\xa0\x77\x5c\x61\x9c\xa7\x77\x75\xe6\x0d\x16\x38\x85\xdd\x2f\xe4\x2a\x5b\xc7\x16\x1c\x87\xe7\x4e\x50\xa1\x57\xbc\x9a\xcf\x24\xab\x5b\x16\xea\x08\x02\xa5\x22\xbd\xa6\x33\xfd\xe6\x9d\x9f\x7a\x2d\x01\x4f\x96\x53\x5c\xc8\xfe\xd6\xc5\x63\x73\xbe\xb9\xad\x20\xc6\xc3\xab\xc5\x1e\x12\xe3\xe2\x62\x22\xbf\x69\x36\x4d\xf3\xa7\x08\x1f\x69\xef\x8a\x89\x76\x6b\xdb\x01\x7a\xfc\xb0\x07\xc6\x25\xb6\x89\xb4\x8e\x70\xc7", 171, { 0x4c, 0xc6, 0x7d, 0x17, 0x8d, 0x1b, 0xac, 0x28, 0x83, 0x9e, 0x32, 0x54, 0x3d, 0x15, 0x9e, 0x82 }, { 0xc4, 0x16, 0x73, 0x7e, 0xf3, 0x51, 0xa9, 0x5a, 0xc4, 0x16, 0x73, 0x7e, 0xf3, 0x51, 0xa9, 0x5a } }, { "\x9e\xd1\xa4\x71\x3d\x0c\x2b\x50\x69\x84\x67\x39\x21\x50\x37\xde\x45\xc0\xc4\x87\x40\xa3\xf0\xf9\xc2\x2f\x18\x67\x5e\x2b\xcd\x47\x41\xe9\x3c\xeb\xdc\xcd\x91\xc6\x67\x12\x9f\xd4\x4a\x48\xe6\x05\xaf\x21\x78\x2e\x7b\xf3\x39\x01\xef\xd6\xcf\xdb\xa1\x61\x52\x13\xae\x9c\xde\xfb\x6c\xc1\xd6\x2d\xda\xcf\x99\xb0\x67\x3f\x4b\x51\xe8\x8b\xc5\xc3\x3c\x61\xa9\x46\xb6\xea\x8b\x34\x1b\xf7\x08\x1f\x98\x75\x2f\xdb\xca\x32\x3d\x04\x3d\xd0\x36\x06\x57\x07\xba\x77\x54\xa6\xd3\xba\x5d\xd9\x12\x0a\x46\x7f\x37\x45\x0d\x04\x6b\x37\xe6\x5d\xd9\x7f\x2f\x40\x4f\x49\xa9\x62\xbb\x11\x10\x4e\x23\xf2\xbc\x12\xd3\x93\xfb\x6b\xdc\xd6\x1f\x37\x26\x36\x3d\xd8\x56\x92\xec\xaa\xc7\x74\xea\x08\x2d\xda\x44\x60\xd5\x5d", 172, { 0x73, 0x78, 0x8c, 0x1d, 0xaa, 0x21, 0x86, 0xd8, 0x46, 0xde, 0x21, 0x97, 0xe5, 0x4a, 0xf4, 0xde }, { 0xaa, 0x34, 0xdf, 0xed, 0x55, 0x46, 0xf6, 0x7f, 0xaa, 0x34, 0xdf, 0xed, 0x55, 0x46, 0xf6, 0x7f } }, { "\xab\xe6\xa1\x9a\xcd\xde\x56\x7f\x8d\x19\x5d\x91\x99\x9b\x6e\x28\xa4\x5b\x8a\x34\xb7\x0c\x0d\xd4\x0b\x22\xe3\x23\xf1\x31\x8f\xd2\xcb\x0a\x93\xc5\xbe\x04\x76\x70\x20\x76\x3f\x79\xb4\x56\x07\x76\xa3\xc5\xa6\xb7\x2b\xcb\x3e\x1c\xc6\xf3\xfb\x47\x4e\x0e\x1c\xf7\x7a\x93\xc0\x00\xde\xe3\xc4\x6d\xe0\x1d\xe0\xcd\xe1\xbc\x5e\x6a\xbd\x96\x84\x6b\x07\xbf\xa1\x9e\xba\xf2\x60\x00\x3b\xa9\xf2\xac\x30\xe9\x2a\x11\x97\x73\xf6\x40\x91\xa9\x95\x96\x26\x94\x63\x78\xff\x27\x35\x3b\xdd\x00\xcb\xc9\xed\x7c\xfd\x71\x05\xb7\x61\x77\xb7\x9b\xb0\x89\x61\x81\xab\xce\x4d\x2f\xb4\x27\xd4\x4e\x66\xe7\x40\xe6\x2b\xac\xc4\x3f\xa7\xe2\x44\x9f\xc0\x97\xf2\x79\x67\xd2\x71\xee\x3d\x6d\x55\xad\xd2\x37\x1b\x8a\xa4\xea\xae", 173, { 0xac, 0xc6, 0xe5, 0x26, 0x4c, 0x66, 0x0e, 0x55, 0xb2, 0x1c, 0x04, 0xa9, 0x2f, 0x71, 0x7b, 0x2c }, { 0xfd, 0xf8, 0x63, 0x3b, 0xb7, 0x05, 0x50, 0x42, 0xfd, 0xf8, 0x63, 0x3b, 0xb7, 0x05, 0x50, 0x42 } }, { "\x48\x6d\xa5\xd9\x06\x34\x46\xf9\x85\xc4\xd1\x21\x0b\xb9\x48\x71\x47\xc2\x67\x3c\xe1\x68\xb1\xc6\xcb\xc5\x14\x7d\x76\x50\x92\xa1\x55\x55\x21\x65\x7c\xc8\x20\xaa\xf3\x1f\xa1\x87\xfa\x63\x30\x58\x7e\xd3\x34\xef\x75\x1a\x2e\x0f\x77\x77\x9d\x6f\xde\x5a\x9c\xd4\x64\x97\x70\x52\x34\x51\x27\x7b\x1b\x4e\x84\x2a\x89\xd4\x85\x54\x76\x26\x4e\x60\x6f\x65\x4b\x83\x1b\x26\x4b\x76\x05\x67\x84\x86\xdb\x5c\xff\x5c\x12\xdf\x1a\xb0\x1e\xc2\x05\xd6\x18\x0f\xa3\xe9\x64\x5c\xb6\x4a\x18\x55\x51\x86\xcc\x3e\x0f\xce\x20\xf0\x5e\x17\xff\x54\xab\x03\x00\x74\x11\x69\xbb\x17\x51\x3f\x55\x6c\x9a\xa0\x73\x7a\x9f\x7c\x99\xf3\x28\x86\xa8\xed\xa9\x83\x1e\x5f\x40\x98\x71\xdb\xcf\x0d\x04\x44\x38\xd8\xf6\xfb\x00\x22\x03\x7b", 174, { 0xaf, 0xfd, 0xff, 0xf3, 0xf4, 0xcf, 0x2e, 0x00, 0x2d, 0xe2, 0x5d, 0xd8, 0xdb, 0x8d, 0x26, 0xe6 }, { 0x32, 0xc3, 0x6e, 0x46, 0xf6, 0x82, 0x78, 0x6b, 0x32, 0xc3, 0x6e, 0x46, 0xf6, 0x82, 0x78, 0x6b } }, { "\x54\x42\x6e\xff\x48\x28\x12\x5b\x31\x4c\xdd\xde\x77\xc3\x5e\xe3\xc3\x29\xea\x5a\x0f\x68\xdb\xf0\xc4\xc6\x98\x31\x94\x76\x7b\xd8\x75\x0d\x0a\xfd\xa5\x65\x08\x7d\xb8\x53\x63\xa9\x1d\xee\x4e\xe2\x49\xc2\x5a\x98\x00\x45\x74\x2f\x76\x46\xe3\x31\xe9\x0b\xb1\x74\x59\x23\xfd\xf2\x38\x8a\x9d\x0f\xb1\xf4\x38\x36\xd1\x09\x1f\xca\xb8\x04\x27\xeb\x27\xfb\x6c\x99\xb0\xcd\xe8\x01\x0b\x10\x38\xad\xad\x5a\x07\x4f\x49\xa3\xd5\xf9\x01\xe5\xb9\x8e\x7d\xeb\x88\xa8\x6e\x7e\x5f\x06\x07\x4c\xde\xc1\xfd\x16\xa3\x58\x15\xc7\xf8\x0f\xd4\xe0\x73\x8e\x1c\x80\x3d\xaf\x1b\x85\x8a\x93\xe0\xa5\x77\xae\xaa\x91\x73\xf5\x2b\x3f\x20\xa8\x58\x63\xb4\x0b\xff\x0c\xe6\x47\xa8\xd9\x71\x68\x4d\x55\xd6\x8d\xae\x80\x56\x47\xf7\xdf\x08", 175, { 0x52, 0xbd, 0x6a, 0x3d, 0xf1, 0x03, 0x96, 0x7b, 0x7c, 0x9c, 0xb2, 0x19, 0x26, 0x22, 0x84, 0xac }, { 0x39, 0xa0, 0x5c, 0xe6, 0x57, 0x6c, 0xd9, 0x53, 0x39, 0xa0, 0x5c, 0xe6, 0x57, 0x6c, 0xd9, 0x53 } }, { "\x5c\x74\xc0\x16\xf2\x36\xda\x03\x00\x16\x65\x64\x34\x42\xb3\xca\xc5\xdf\x00\x40\xfe\xf4\xb9\xef\xd4\x05\xdd\x60\xea\xb1\xf6\xe3\x0e\xd9\x1c\x8a\x33\xb3\xec\x01\xbe\x63\xbb\x2f\xff\x6d\x22\x0b\xa9\x95\x94\x84\x5d\xb9\x65\x07\x40\x5b\x82\xd2\x37\xee\xfb\xc4\x8d\x3d\x65\xfd\xca\xe7\x91\x41\x05\x9d\x3d\x95\x4d\x5d\x23\x64\xcc\xbd\xda\x97\x9e\x7f\x45\x7c\x98\xf9\x08\x31\x04\xb4\x56\xee\xa6\x2a\x1c\x00\x66\xd7\xa5\x79\xf7\x6b\xaa\x14\xbd\xbc\xfb\x08\xdd\xd0\xe7\x9c\x6f\x5f\x79\x4e\x70\x4e\xfa\x15\xd4\x1d\xbe\xf3\xd1\x2b\xfa\x72\xb1\xca\xd9\x69\x92\x18\x28\xd3\x93\xa4\x90\xa5\x4a\xce\x44\xa5\x71\x4e\x74\xa3\xae\x55\x2a\x45\x62\x5c\xfb\x51\x24\x1b\xd2\x9a\xa4\x87\x51\x61\x45\xee\xb3\xf1\x55\x01\x60\xea", 176, { 0xdf, 0xff, 0x45, 0xd1, 0x3a, 0xe9, 0x9a, 0x4e, 0x1d, 0xbd, 0xa1, 0x01, 0xf3, 0x1c, 0x0b, 0x0b }, { 0x49, 0x32, 0xaa, 0x25, 0x47, 0xa9, 0x97, 0xea, 0x49, 0x32, 0xaa, 0x25, 0x47, 0xa9, 0x97, 0xea } }, { "\x09\xce\x9e\x08\x47\xe3\xb8\x2a\xd5\x57\x52\xa4\x68\xa8\xf9\x64\x20\x71\x94\xb0\x8c\x38\x16\xe7\x65\xb7\xe2\xea\x98\x8b\x7b\x24\xe5\x1e\x8b\x5f\x21\xc5\xe1\x5b\x41\x2c\x60\x5a\x1b\x10\x9a\xeb\xb1\x79\x17\x1d\x3c\x12\xdf\x34\xfc\x7c\x22\xe0\xc1\x75\xf8\x68\x6a\x80\x70\xd7\xd4\x81\xf3\xdc\x6b\xc0\x25\x27\xe3\x44\xad\xbe\x9a\x85\xdc\xbd\xe1\xb7\x31\x7e\xce\xd4\x22\xb5\x22\xd4\xb4\xe2\x13\xfa\xb8\x68\xf1\xbf\x64\x7a\xc6\x4c\x8f\xeb\xa8\xa4\x14\x3d\xa8\xb9\x3a\x3c\xc3\x84\x8b\x7c\x68\x4c\xda\xc9\x64\xa3\x32\x28\xb7\x8d\x28\x2b\x3a\x17\xcb\x78\x65\x72\x82\xd3\x02\x90\x2d\x86\x51\x12\x1f\xd3\xe0\x65\x0e\x12\x83\x05\x69\x70\x63\x76\x92\x43\x4c\x5e\xde\x52\xa4\x3f\x2f\x65\x72\x13\x03\x00\x98\xce\x8c\x03\x55", 177, { 0xfb, 0x2d, 0x33, 0xa1, 0xa0, 0xfb, 0x3a, 0x46, 0xdb, 0x40, 0x7e, 0x65, 0x1f, 0x8f, 0xa7, 0x71 }, { 0xf8, 0x4b, 0xc3, 0x84, 0x17, 0x3a, 0xd2, 0x27, 0xf8, 0x4b, 0xc3, 0x84, 0x17, 0x3a, 0xd2, 0x27 } }, { "\x09\xad\xbf\xfa\xb8\x07\xc9\x7a\x9d\x0a\x6e\xa9\x64\xa6\xef\x6f\xa9\xc2\xcd\xa7\x39\x4c\x16\xc7\x19\xc0\x9c\xbf\x3a\x15\xae\xac\xac\xf2\x26\x87\xd4\x91\xc8\x68\x10\x29\x05\x44\xeb\xfb\x97\x2a\x45\x59\xe4\xe2\xe4\xb9\xa7\xc5\x4a\x08\xef\xf7\xea\xed\x22\xaf\x14\xef\x5b\x9d\xa4\xf7\x0d\x75\x77\x2c\xc5\x5c\xa9\x9d\xd7\x2c\xfd\xab\xdb\x0b\xd8\x8d\x88\x90\x21\xc3\xe0\xb4\xd6\xff\xf6\xcf\x78\xc7\x1d\xf3\x37\x05\x1c\x5e\xa0\x55\x1b\x26\x4f\xa8\x48\xb9\xe5\x3e\x07\x23\xe3\xf2\xc8\xc5\x62\x47\x3a\x1c\x2c\xe7\x5c\x72\xa8\xab\xc1\xca\xc3\xac\xc4\x7d\x44\x6e\x54\x00\xe2\x53\x9e\xb2\x48\xa2\xaf\xa3\xb6\x2d\xd2\x4a\x7d\x29\xe1\x7e\x4e\xc9\x2d\x59\x7a\x73\xf9\xe3\xb0\x29\xec\xa9\x5f\x27\x03\xc8\x3f\x9c\xad\x28\xd1\x7f", 178, { 0x45, 0x76, 0x4f, 0x29, 0xd6, 0x4b, 0x25, 0x08, 0xcb, 0x2d, 0xa9, 0xbd, 0xb0, 0xd6, 0x39, 0xe2 }, { 0x87, 0x4e, 0xa7, 0xb8, 0x73, 0x03, 0x9d, 0xe2, 0x87, 0x4e, 0xa7, 0xb8, 0x73, 0x03, 0x9d, 0xe2 } }, { "\xcb\x84\x2e\x85\xf2\xe3\xb0\x17\xf3\x3d\x8a\x29\x98\x14\x8d\x2f\x74\x6c\xbd\x84\x08\xfc\x93\x26\xbd\x15\x6a\x32\x04\xb6\xaa\x29\xf2\xb7\x5c\x01\x6b\x3f\xbf\xd6\x15\xa9\xeb\xca\x49\x6a\x54\x71\x91\xac\xee\x7c\xa0\x5a\xbd\xc0\x56\x14\xba\x3e\x2d\x3b\x43\x5f\x85\x6e\xa6\x5b\x4d\x93\x0d\x7d\xc3\x1d\xb7\xd0\xf0\x6a\xa8\x2b\x4b\xe9\x30\xa7\x4b\x29\xd8\x09\x5d\x74\x3b\xde\x01\x8e\xf7\xbe\x47\xd5\x16\xef\x5c\xf7\x43\xfa\x07\x2d\x91\x04\xaa\x9e\xf9\x13\xae\xef\xeb\xa1\x29\x6b\x37\x81\xd5\x43\xf1\x74\x28\x96\x94\xc6\x1c\xe3\x3d\x81\x8c\x3e\x0f\x53\xf6\x83\x3f\x8d\xa5\x33\xbf\xce\x90\x16\x34\xdb\x2d\x97\xec\x90\x7e\xcf\x92\xdc\xbc\x69\x4c\xd1\xd2\x82\x32\xed\xf1\xef\xfd\xaf\x98\x23\x25\x41\x83\xb8\x7e\xe0\x4a\x77\x40", 179, { 0x55, 0x77, 0x05, 0x9f, 0x0a, 0x07, 0xda, 0x15, 0x7a, 0x7d, 0x44, 0xc0, 0xdf, 0xf5, 0x4e, 0xdf }, { 0x91, 0x98, 0x29, 0x42, 0xd5, 0x20, 0xdf, 0xa2, 0x91, 0x98, 0x29, 0x42, 0xd5, 0x20, 0xdf, 0xa2 } }, { "\x98\x35\x8f\x45\x14\xfd\xf0\x51\x36\x67\x60\x7e\xb3\x5a\xe9\x11\x35\xcc\xff\xdf\xac\xd8\x15\x61\x9f\x2c\x0b\x4e\x38\x0e\x39\xdf\xa6\x46\x5c\x46\x44\x54\x04\x07\xc9\x93\x23\x9a\x09\x6c\x2a\x99\xde\x9b\xb7\x82\x6a\x99\x01\x77\x2b\x1a\xd8\x06\xc9\x08\x8b\x97\x65\xd1\xe2\x3d\x4e\x45\x06\x59\xf3\xba\x68\x21\x61\xbc\xcf\xc0\x2e\x60\x5c\xd5\xa8\xfe\x4c\xb8\xcf\x8f\x4d\x25\xbf\xb4\x05\x52\x67\x81\x9b\x42\xf1\x73\x77\x08\x9e\x54\x06\xa3\x7a\x69\x85\x99\x33\x17\x38\x7c\x7e\xda\x5e\xa3\x4d\x90\x5f\xef\x14\x77\xcf\x7d\x1f\xca\x5a\xe4\x84\x13\xa8\x06\x61\x4d\x1f\x5a\x6e\xf1\x8a\x0d\x06\x52\x9b\x06\x61\x13\xd6\xeb\xee\x50\x17\x81\xfa\x49\x9c\xa2\x94\xb6\x5e\xf3\x66\x78\x62\x96\x16\xd0\x31\x3b\xeb\x22\xad\xf3\x3a\x18\x93\x18", 180, { 0x46, 0x08, 0x86, 0x0d, 0x7a, 0xf0, 0xae, 0xea, 0xd1, 0xc7, 0x6d, 0x59, 0x98, 0x3f, 0x70, 0x13 }, { 0x24, 0x64, 0x6b, 0x58, 0xc0, 0x59, 0x2a, 0x38, 0x24, 0x64, 0x6b, 0x58, 0xc0, 0x59, 0x2a, 0x38 } }, { "\xd5\xc9\x4f\x92\x59\x34\xe5\xf1\xd0\x98\x9f\x5b\x93\x3a\x05\x7a\x15\x47\x19\xd3\x41\xa9\x3e\x67\x31\xae\xe3\x2c\x38\xf2\xe7\x19\x3d\xd2\x07\xa9\x9e\xde\x92\x23\x1d\x7e\x01\x34\x09\x7a\x9b\x52\x0e\x16\xa6\x9f\x0f\x0b\x20\xd1\x1f\x77\x9f\xde\x64\x68\xfd\x13\xdc\xbd\x4b\xd7\x38\x68\xc3\xf6\xad\x9c\xe3\x3a\x6f\x8b\x7d\x77\xf8\x16\x1f\x85\x49\xef\x89\x22\x63\x11\x69\x5e\xfb\x94\x96\x52\x18\x12\x8f\x2b\xed\xa8\xd0\xa6\x6b\x9c\x08\xf2\x0e\x5d\x62\xe8\x79\xc3\x9b\x28\xdc\x9f\xb8\x5e\xdf\x63\x88\xcc\xfe\x4d\xe9\x1d\x75\x6d\x7b\xe0\x62\x41\x65\xf8\xcf\xa0\x63\x2f\xe6\x95\x90\x94\xa0\x2d\x68\x67\xff\xa8\xef\x9d\xeb\x64\x7e\x63\xe7\xf6\x41\xda\xaf\x20\x3d\x02\x3b\x5d\xcc\xc9\xdb\x83\xfd\x2b\x57\x38\x4a\xb4\xe7\x40\xa5\x09\xaa", 181, { 0x2f, 0xb9, 0x65, 0xd7, 0x4a, 0xb7, 0xb5, 0xda, 0x84, 0xf7, 0x30, 0xd2, 0x5c, 0x8d, 0x74, 0x17 }, { 0x54, 0xba, 0x4c, 0xb8, 0xd3, 0x37, 0xfe, 0x28, 0x54, 0xba, 0x4c, 0xb8, 0xd3, 0x37, 0xfe, 0x28 } }, { "\x42\xdd\x21\x64\x36\xc2\xe9\x11\x4b\x93\x95\x63\xaa\xd7\xe2\xb6\xd8\x2d\xf7\xcb\xe0\xf9\x0b\x5f\x50\x5f\xb6\x03\xc7\xb4\x5e\x89\x42\xa9\xa1\xd0\xd1\x09\x68\x14\xbc\x78\xf3\xfa\x6a\x50\xbc\xab\x56\x99\x32\xc4\xc0\x4c\x56\x7a\x1c\xec\x45\x46\x7e\xf7\x4f\x14\x8a\xcf\xa9\xcd\x4b\x95\xf7\x9b\xee\xbd\xb8\x16\x6e\x62\xc7\xf6\x13\x08\xb4\xcc\xd1\xfe\x30\xc0\x5a\xac\xfd\x21\x1e\x31\xe2\xbe\x05\xff\x7b\x16\xba\x91\x45\x71\xe2\xbe\x8a\x97\x4f\x3f\x5a\xee\xf3\xa2\x55\x22\xc6\x45\x7d\xc9\x80\xc4\x42\x44\xbd\xd5\x45\x91\xb8\xd7\x07\x83\x81\x22\x94\x2c\xe4\x3c\xc4\x1d\xb2\xee\x76\x2f\xbf\xe1\xd8\x90\x43\xef\xd2\xfd\xf3\x40\x74\x53\x2b\x27\xe4\x43\x9c\x7b\xfd\xee\x62\x56\x5c\xf2\x2b\x9c\x09\x48\xbb\xc4\x94\xa9\xd3\xb2\x51\xf6\xc7\x3d", 182, { 0x11, 0x29, 0x12, 0x1a, 0xe3, 0x6e, 0x30, 0xb1, 0x7c, 0x78, 0x27, 0x13, 0x01, 0x7f, 0xfa, 0x3b }, { 0x0c, 0x7a, 0xba, 0x2b, 0xbd, 0xce, 0x49, 0xb1, 0x0c, 0x7a, 0xba, 0x2b, 0xbd, 0xce, 0x49, 0xb1 } }, { "\xdf\x38\x9e\x13\xc8\x0e\x4f\xbb\x24\xc6\x81\x02\x22\x68\x0b\x77\xa3\x92\xee\x03\xa9\xcf\x6d\x46\x18\xfd\x9c\x37\x41\x12\x09\x22\x11\x6c\x6e\xfb\x56\x51\x2e\x3a\xb8\xe3\x96\xa0\xae\xe4\x39\x2a\xf8\x6c\x54\x94\xa9\x63\xb0\x56\x8c\x67\xc4\x4e\x59\xea\x2f\xd3\xb7\x5e\x1f\xad\x5b\xc9\x6b\x45\x71\x08\x32\xdb\x7d\x9e\x82\xdf\xe1\xd0\xd8\x28\x65\xc8\x66\x01\x53\x78\xbb\x92\xaa\x78\x2a\xd5\x73\xe4\x91\x7a\x5e\x29\x06\xad\xc2\x40\xff\x54\x53\x38\x6e\x1a\x5b\x28\x4c\x86\xd4\xfe\x73\xe7\xfe\xee\xe1\x37\x89\x5c\x0d\x6b\xc0\xf9\x4b\x03\xba\xda\x8a\xab\x12\x82\x5e\xbc\x32\x9e\x02\xd3\x5d\x6e\xa1\x9a\x9a\xa7\x35\x3a\xa0\xe8\x06\xa0\x51\x3d\x51\x5f\xe6\x71\xe3\x7d\xf9\xc1\x27\xd9\x71\x6e\x87\x3e\x47\x81\xce\x81\xe2\xb9\xd6\x1a\xe3\xd7\xa1", 183, { 0x62, 0x41, 0x10, 0xa0, 0x6b, 0x7d, 0xe4, 0x3c, 0xbb, 0xe0, 0xd2, 0xec, 0xb1, 0x96, 0x55, 0xc2 }, { 0xe3, 0xf1, 0xb9, 0x22, 0x12, 0xd6, 0xa0, 0x33, 0xe3, 0xf1, 0xb9, 0x22, 0x12, 0xd6, 0xa0, 0x33 } }, { "\x3e\x08\x3b\x63\x72\x4e\x47\xa7\x76\xd2\xd7\x78\x52\x5a\xef\x85\xe2\x2b\xf2\x86\x1b\xb8\x97\x4b\x8b\x98\xbc\x67\xa9\xcc\x7e\xc4\xf9\x6d\xb4\x16\xfd\x36\x11\x77\xda\x59\xed\x2d\x3e\x64\x35\x58\x7b\x4e\xae\xc4\xf5\x55\x2f\x67\x0b\xec\xe4\x25\x93\x11\xa4\x6d\x41\xde\xc0\x83\x9a\xcd\x1d\x64\xd8\x87\xb8\x61\x24\x61\x17\xc4\x5c\xda\xc5\x90\x7d\x14\x87\x2b\xfa\x83\x2f\x8f\x05\xfa\xb3\x1a\xb9\xd2\x74\x6c\x1c\xde\xba\x54\x94\xdc\xfa\xe0\x68\xfa\x22\x26\x7d\x72\x6d\x86\x3a\x8f\xfb\x36\xa7\x21\x02\x99\xa6\xd6\xb5\xe2\x02\xda\xe8\x80\x72\x48\x8a\x8e\x0f\x21\x3f\xd1\xce\xd6\x1b\x44\xad\x31\xe0\x9c\x8b\xd8\x59\x8e\xb4\x5c\x53\x6c\x7a\x7d\x0b\xa0\x09\x67\xf0\xa9\x2d\x6d\xa8\x66\x18\xdc\x5f\xc6\x0c\x91\xb4\x42\xb3\x8c\x8f\x09\x22\xdd\x9e\xce", 184, { 0x4a, 0xe3, 0x21, 0xed, 0x56, 0x9f, 0x45, 0x4c, 0x4c, 0xa5, 0x91, 0xc7, 0x1b, 0xec, 0x69, 0xe0 }, { 0xd8, 0x40, 0x1c, 0x64, 0xa4, 0x47, 0x51, 0xf4, 0xd8, 0x40, 0x1c, 0x64, 0xa4, 0x47, 0x51, 0xf4 } }, { "\x55\xda\x31\x9d\x01\x0f\x05\x9d\x6f\x89\x81\x50\x3e\x91\x54\x6d\xaf\x13\xc8\xcc\x55\x95\xa2\x96\x6f\x07\xe1\x1e\x37\x88\xb4\x24\x3f\x57\x99\xc4\x05\x94\xff\x47\x8a\x0f\xa8\x6c\xd0\xfd\xec\x22\xd0\xdc\xf7\x8b\x6d\x45\x46\x53\x5c\x52\x92\x80\xb9\x3d\xbc\x5b\xfe\x37\xdb\x6e\xc1\x0f\x41\x6a\x80\xaf\xd4\xb9\x56\xe7\x2d\x98\x3d\xe2\x3a\xb0\x87\x27\x09\x78\x37\x86\xaf\x39\xd8\xf6\x5f\x1f\x52\x52\x29\x46\xed\x42\xf5\x29\xe7\x59\x75\x86\x12\x62\x54\x5d\xe4\xe9\x83\x8b\xce\xae\xbe\xe0\xa7\xad\x8d\x97\x80\x08\x99\x44\x68\x9a\xd0\x7e\x8f\xe5\x83\xd8\xcb\xd5\x24\xf9\x8f\x4d\xc6\xd4\x23\x4a\x6f\xf2\xe9\x2d\xca\x21\x75\x0f\xfd\x05\xa6\x27\xf2\xb8\x5a\x11\x85\xff\x03\x57\x18\x2d\xb9\xcc\x95\xc5\x6a\x0b\xf2\x48\xbc\x35\xbe\x91\x03\x95\xc8\xd1\x8c", 185, { 0x53, 0x10, 0xa8, 0x8b, 0x9d, 0x2a, 0xc1, 0xdf, 0xc4, 0x81, 0x8f, 0x71, 0x91, 0xe7, 0x82, 0xf4 }, { 0xcd, 0xd5, 0x36, 0xcb, 0xe8, 0x10, 0x0b, 0x4c, 0xcd, 0xd5, 0x36, 0xcb, 0xe8, 0x10, 0x0b, 0x4c } }, { "\x99\xa3\xf6\xf6\x9f\x4c\x5e\x7f\x0d\x5e\xf7\x35\xd0\x08\x66\x49\x5e\xf3\xe3\xbc\xf5\xa8\x31\x68\x39\xef\x53\xef\xf6\x26\x11\xe3\x6e\x0b\x24\x11\x19\xb0\xe8\x1f\xa0\x73\x53\xfb\x44\x9c\xd4\xe1\xd6\x4d\xbd\xa4\x84\x1a\xc0\x4c\x9d\x65\x06\xd7\xa3\x34\x29\x57\x5a\x25\x3f\x62\xae\x8b\xda\xfa\x65\x06\x81\x70\x7f\x33\x08\xb5\x16\x4b\xd2\x81\xf2\x09\x00\xe7\x6b\x6a\x2a\x34\x3a\x0b\x8a\xa2\x7f\xd4\x77\xdf\x92\x01\xbb\x79\x21\x37\x0c\x51\x36\x01\xdf\xcb\xbd\x58\x9f\x67\x73\x92\x7f\x51\xda\x4f\x56\x9a\xb1\x8d\xc3\x7b\xd3\xda\x65\x3b\x7f\x0c\x75\xbb\x46\x14\x96\x63\x8b\x72\xb4\x02\xc2\x27\xee\x7b\x79\x22\x56\xe8\x6d\xd6\xf4\xa3\xcf\x3c\xb9\xac\x71\x11\x76\xcf\xfa\xc3\x42\x90\xd6\xa7\x35\x97\xa4\x19\x06\x03\xb4\x39\xf3\x76\x46\x7e\xd7\xbb\x7b\xb7", 186, { 0x24, 0x3e, 0x6d, 0xc9, 0x2c, 0xa4, 0x00, 0xcb, 0x16, 0x01, 0x23, 0x3e, 0x63, 0xcb, 0x8b, 0x48 }, { 0x86, 0xde, 0x90, 0xe6, 0xe8, 0x12, 0x0e, 0x06, 0x86, 0xde, 0x90, 0xe6, 0xe8, 0x12, 0x0e, 0x06 } }, { "\x1e\x29\x1e\xbe\xe0\x6c\x84\xd9\x2e\xd4\x79\x32\xa7\x40\xab\xf3\x4e\x42\x3f\x48\x4d\xbf\xa7\x50\xa7\x21\x38\xf4\x22\x67\x78\xb1\xa8\xd1\xc3\x5e\xfa\x1a\xf8\x2f\xfd\x76\xb6\xe5\x26\x3a\xe3\x72\x0d\xae\x74\xb5\x25\x19\xfa\x59\x85\x8d\x72\x27\xb0\xfa\xd4\x44\x76\x73\xb9\x53\x40\xb7\x7d\xc4\xcd\x60\x9d\x20\x44\xa3\x59\x6d\xf2\x17\x78\x13\x87\xa2\x5a\x1b\x22\xcd\x6e\x87\x28\x5f\x2a\xf2\x75\x75\x28\x43\x51\x94\x07\xa7\x9d\x6e\x65\x31\xf3\xfb\xad\x11\xd2\x70\xc6\x5c\x1b\xfb\x19\x3f\xd8\x51\xf2\xe1\xde\xca\x57\x53\xcb\x00\x5f\xc1\xa3\xb7\xeb\x1c\xaf\xf0\x33\x3f\x9a\x6f\x9c\x66\x08\xdb\x9c\x8e\x9e\x35\x57\xcb\xd0\x1a\x57\x1d\x21\x26\x41\x6d\xdb\x25\xd0\x2a\xab\x53\x3f\x79\xbf\xdd\xae\xa6\x58\xbc\x74\x6e\x32\x3b\x7d\x65\x96\xac\x71\x9c\xee\xd3\x55", 187, { 0x4e, 0x8b, 0x03, 0x86, 0x16, 0x37, 0x82, 0x1a, 0x85, 0x32, 0xdc, 0xd8, 0xa6, 0x26, 0xa9, 0xa2 }, { 0xe0, 0xb5, 0xfd, 0xfc, 0xec, 0x46, 0xc7, 0x7b, 0xe0, 0xb5, 0xfd, 0xfc, 0xec, 0x46, 0xc7, 0x7b } }, { "\x67\x32\xf2\xa4\x2f\xcf\x92\x9b\x66\x47\x27\xe7\xbc\x24\xa4\xb5\x7e\x59\x57\xcb\x89\x43\x85\xeb\xb6\xc9\x49\x0e\xd3\x12\xe8\xc6\xcc\x64\x62\x24\x8c\x5a\x8e\xed\x97\x92\xfa\xcb\x87\x56\x60\x70\xda\x9c\x68\xb6\xf4\x4a\x33\x50\x8c\x60\x3a\xc6\x24\x48\x49\x49\xd7\x84\x8b\x21\xe9\x56\x58\x47\x2d\x8e\x6c\xbf\xf9\x4b\x71\x32\xbb\x2d\x03\x2f\x1a\x1b\x8b\xc9\xd7\xc7\x49\x34\x27\x79\x15\x08\x9c\x30\xec\xe0\x3c\x91\xca\x21\x78\x37\xfc\xb2\x81\x8f\x6f\x46\x8a\x56\xc2\xa8\x23\x96\x59\x97\xe4\x8d\x7a\x09\xd3\x96\xa2\xed\x94\xba\xc3\xfa\x4b\x69\xe7\x42\x70\x9b\x41\x53\x0d\x2c\xf9\x4f\x9f\x70\x4b\x36\xf3\x37\x11\x0b\x40\xac\x56\x1d\x64\xc9\xb6\x1d\xd7\x69\x76\xba\x89\x38\xc2\x4d\x71\xd0\x4f\xf2\x47\xed\x9e\x4b\x19\xd8\xf3\x94\x76\x27\x11\x88\x7e\x58\x4a\x34", 188, { 0x43, 0x2d, 0x9a, 0x57, 0x47, 0xa7, 0x53, 0x4e, 0x59, 0x87, 0x8a, 0x2d, 0xab, 0x31, 0x29, 0x1f }, { 0xcb, 0x18, 0x1b, 0x74, 0xff, 0xad, 0x10, 0xaa, 0xcb, 0x18, 0x1b, 0x74, 0xff, 0xad, 0x10, 0xaa } }, { "\x5c\x93\xaf\xcf\x28\x39\x82\x1e\x24\xe4\xe6\xcb\xb9\x0d\x51\x9d\xa1\xa5\x38\x7f\x5b\xab\xc9\xd6\x64\xdf\x32\xf3\xa7\x7f\x78\xf4\xb7\x38\x0b\xa6\xb5\xfd\xb6\x8c\x95\xc6\x47\xca\x08\x42\xd7\xca\x61\x08\x99\x67\x63\x41\x81\x3a\x8b\xf1\x08\x09\xdd\x76\x02\xe5\xad\xa0\xfb\xfd\x90\xc3\x22\xcd\x1b\xbe\x22\xe6\xf6\x8c\xb5\x33\xf9\x33\x45\xa8\x7a\xe9\xe2\x07\xb1\xb3\x9e\x6c\x51\xf3\xdf\x45\x00\x0b\xd3\x94\x61\x1c\x04\x42\x63\x08\x9d\x70\x6b\x2d\xd9\xd6\x07\x0e\xb0\x52\xba\xff\x6d\xc0\xce\xde\x23\x95\xe7\x5d\xdb\x47\x16\x86\xb7\x01\xaa\x30\x82\x0e\x5e\x50\x5a\x6a\x65\xe9\xb3\x6e\x05\x74\x9c\x8e\x3b\x30\x67\x67\x79\x1d\x8b\x4e\xb1\x66\x33\x2d\xde\xc1\x3a\x04\xc9\xb9\x84\x6b\x12\xe0\xad\xdf\x7c\x56\x06\xb9\xe3\x02\xd8\x85\x22\x16\xc3\xc2\x7d\x1d\x76\x94\x69", 189, { 0xb8, 0x53, 0x92, 0x17, 0x2f, 0x30, 0x1b, 0x01, 0x33, 0xe6, 0xb7, 0x90, 0x96, 0x19, 0x4e, 0x6b }, { 0x22, 0x6b, 0x87, 0xa9, 0xc6, 0x9d, 0xfb, 0x97, 0x22, 0x6b, 0x87, 0xa9, 0xc6, 0x9d, 0xfb, 0x97 } }, { "\xc4\xad\xa9\x8f\x39\x92\x82\x92\x17\x3c\x66\x64\x96\x6f\x97\x60\x90\xea\xd9\x63\x25\x6c\x32\xaf\x36\x30\xb1\xc5\x19\x2c\x8a\x7f\x82\xbc\x6b\x07\x27\x6d\x5f\xdf\x56\xe6\x3c\x3e\xab\xb3\x67\x3a\xc8\x08\x9a\x10\x04\xd9\xbd\x35\xc4\x2e\x66\x96\xf3\x17\x32\x83\x9f\x76\xdd\x23\x1c\x22\xc7\xc0\x15\x79\xaa\x9a\x7d\x48\x7f\x44\xae\x34\xea\x2f\x09\x1a\xb8\x4d\xcd\x12\xab\x95\x22\x08\x61\xb7\x6e\x7e\x73\x87\x78\x8b\x6e\x57\x73\x54\xb0\x79\x67\x55\x41\x92\x6c\xf6\x13\xdf\xe7\x6c\x2b\x26\xcf\x74\xaf\xbd\xf4\xbb\xb2\x9e\x39\x7e\x4a\x63\xad\xbc\xe4\xd3\x9f\xe6\x3a\x01\x83\xda\xd4\xfa\x96\x89\x26\xa0\x81\x8e\x2f\x20\x1c\xef\x75\x1f\x74\x11\xee\x8f\xc7\x60\xbd\x91\x57\x65\x34\x61\xa8\x96\xd5\xdb\x38\xd9\xac\x71\x99\xf8\xfd\xf6\xa8\x9f\xda\x30\xfc\x11\xc4\x67\x2e\x26", 190, { 0xe8, 0xa8, 0x06, 0xab, 0x76, 0xae, 0x8b, 0x67, 0xbd, 0x54, 0xd5, 0xb3, 0x4b, 0xa6, 0x75, 0x25 }, { 0xc2, 0x19, 0xec, 0xb4, 0xac, 0xa1, 0xae, 0x04, 0xc2, 0x19, 0xec, 0xb4, 0xac, 0xa1, 0xae, 0x04 } }, { "\x64\x82\x33\xe1\x54\x90\x00\x24\x03\xeb\x44\xaa\xe3\x79\xfb\x98\x9b\x1e\x9b\xef\x71\xf1\x49\x90\x46\xf4\x90\x04\xf3\x2f\x3e\x3e\x92\x27\x8b\x8b\x61\x73\xcd\x0a\x6d\x0f\x4a\x06\x75\xd4\x85\x2f\x11\x5c\x78\xe0\x42\x3b\xb9\x43\xca\x57\xf8\x4b\xad\x96\xb1\x17\x4d\x53\xe5\xcf\x89\xbe\xbf\x4b\x3b\x8a\xd8\xdd\x17\x28\x74\x58\xbc\xe6\xf0\xd9\x8a\x28\x99\x02\x2f\xc9\x31\x14\x30\x08\x14\x12\x84\x12\x57\xa1\x9c\xd3\xe0\x37\x74\x2a\x5f\x0d\xf4\x31\x97\x95\xe3\xf7\xb3\xf2\x3c\x17\xef\xc4\xb6\x3d\xf6\xe2\x48\x8e\xfc\x36\x83\xcc\xe0\x92\x01\xba\xa7\xff\x2f\x33\x0d\x1b\x03\x99\xde\x11\x21\x52\xaf\x3b\xcb\xe0\xb6\x15\x9f\x10\x0f\x5a\x0a\xb6\xe7\x74\x7f\x1b\xe5\x32\xd3\x19\xc3\xa9\x3c\x38\xf6\x28\x45\x3d\x1a\x00\x47\x31\xe0\xd2\x20\x9c\x0f\x86\xdb\x56\x65\x3c\x03\x8f\xf5", 191, { 0x5b, 0x68, 0x26, 0x79, 0x41, 0x15, 0xa0, 0x20, 0x02, 0x72, 0x8e, 0x16, 0x61, 0x0f, 0xbb, 0x5a }, { 0x41, 0xde, 0xda, 0x91, 0x3d, 0x19, 0xb7, 0x86, 0x41, 0xde, 0xda, 0x91, 0x3d, 0x19, 0xb7, 0x86 } }, { "\x51\xd7\x12\x2b\x1c\xe2\x90\xb2\x4e\xf4\xdb\x4d\x57\x52\x88\x83\x8f\x5c\x69\x92\x6f\x0e\xcc\xfb\x28\x23\x26\x3c\xa1\xfd\x4d\x03\x08\x22\xa3\x00\xf5\x81\x9a\x01\x13\xe5\x8b\x7e\x8b\x62\x80\xb0\xa0\x4b\x1e\x1b\x7d\xc7\x01\x64\x37\x3d\x73\x2d\x91\x3e\x22\xe4\x17\xfc\x0b\x0b\x96\xc6\xb9\xe9\x00\x9c\x9f\x2b\x57\x12\xde\x66\x8d\x48\x72\x84\xe8\xb7\xb7\xca\xc5\x04\xcb\xd7\x28\x2c\xd7\xef\x79\x7a\x69\x75\x5f\xcc\x72\x89\xb4\xa0\x2a\x78\xa4\x33\x39\x89\xf5\x49\xab\x6e\x9b\xf3\xdb\xe8\x2f\xae\x73\xcf\x02\xaa\x80\xf8\xa5\x40\x3c\x28\x0c\x6b\x08\xb4\xab\x1e\x33\x24\xc1\x3b\x38\xc3\x63\x4e\x10\x07\xd9\x5e\xc8\x3f\xbf\x70\x2f\xd9\x15\xae\x8e\x7b\x24\xe9\x30\xa9\x80\x63\x3c\xf2\x02\xdb\xae\xf4\x6b\x85\xa0\x67\x0e\x87\x55\x69\x71\x8c\xe4\x31\xd4\xb2\x2d\x97\xbf\xf4\x17\x73", 192, { 0x72, 0xd9, 0x82, 0x7d, 0x93, 0x33, 0xe8, 0xc2, 0xaa, 0xbd, 0xb5, 0xc4, 0x7f, 0xbd, 0x83, 0x7b }, { 0x71, 0xa3, 0x8a, 0x65, 0x6e, 0xf2, 0x1f, 0x4f, 0x71, 0xa3, 0x8a, 0x65, 0x6e, 0xf2, 0x1f, 0x4f } }, { "\xd1\x6d\x63\x42\x2a\x9c\x0c\xcc\x60\x22\x1b\xe4\x07\x57\xdd\xe1\x3d\x74\xce\xfa\xc8\x5b\xe8\x9c\x91\xa5\xde\xa3\x46\x22\x0b\x8d\xa8\xd0\x9d\x5f\xf2\x04\x76\xb0\x35\x0d\x64\xe0\xc5\x84\xbf\x40\xdb\xb8\x66\xfb\xbd\x7c\xb4\xc0\xef\x2c\x02\x87\x04\x75\x98\x86\x5c\x11\xb6\x47\x7b\xc6\x9a\xd9\x69\x5f\xa5\xd6\x37\x8e\x4b\x9c\xfc\xa6\xbe\xcb\x38\x2f\x09\x94\x0c\x85\xa1\xbb\xfa\xa8\x98\x7a\xdb\x27\x0f\x60\xe4\x67\x7d\x14\xde\xa3\x23\xfa\x26\x91\x2c\x92\xf0\xfc\x5b\xe9\xda\xef\x15\xeb\x70\x4d\x26\xa4\x15\xe4\x73\x88\xac\x74\x2c\x26\xd0\x85\x39\x0c\xe6\x39\xaf\x15\xf7\xcf\xb4\x4f\x02\x74\x4b\x0b\xf9\xdb\x52\x56\x94\x98\x6a\xc4\xdc\x9a\x58\x02\x3f\x63\x20\xc8\xe5\x96\x9d\x52\xcb\x92\xe3\xd0\xf4\xcf\xe9\x8c\x5e\x81\x5c\x9c\x3c\x8b\x57\xae\x99\xa8\x5f\x02\x7d\x14\xff\x24\xd2", 193, { 0x21, 0x69, 0x84, 0x9e, 0x48, 0xb5, 0xc0, 0xb2, 0x56, 0x52, 0xa8, 0x98, 0xe0, 0xde, 0xe2, 0xf8 }, { 0xbe, 0xdf, 0x51, 0x76, 0x45, 0x89, 0x65, 0x3b, 0xbe, 0xdf, 0x51, 0x76, 0x45, 0x89, 0x65, 0x3b } }, { "\x34\x4c\x20\x72\xcb\x01\x51\x0e\xc6\x33\xa2\x1d\x73\xf9\x84\xf1\xc6\xd8\xd0\x29\x11\x3d\x37\xc2\xa1\xdf\xda\x45\x56\xbe\xb0\x1e\x2e\x8c\x25\x6f\x16\x5b\x70\x21\xc3\xc2\x49\xa6\x21\xfe\xcc\xd8\xc7\x14\x80\x3e\x3f\x23\xe3\x8e\xc3\xdb\x22\xf7\xda\xc6\x46\x61\x55\x1b\xf5\xb5\x93\xd0\x2c\x53\x09\x6a\xa0\xa7\x1b\x2a\x87\xf1\x25\x02\x05\x5d\xba\x78\x8f\x3c\xce\xf9\xfb\x4a\x80\x80\x20\xc6\x1e\xb5\x65\x1f\xd3\xd4\xd6\x28\x5e\x25\x2e\xba\x5c\x39\xf8\x17\xfa\xa8\xe7\xec\x99\x39\x81\xf0\xfa\x12\x63\xc9\x04\xf4\x5a\x4f\xed\x94\x80\x25\x62\x03\x02\x99\xa8\x2d\xb8\x70\x2a\xb1\xe3\x5d\x86\x15\xf1\xc1\x6c\xc7\x33\x17\xf7\x1d\xb4\x1e\xd9\x51\x91\xd0\xb7\xe8\xff\x2a\x3c\x1a\xe9\x50\x92\x18\x4e\xfb\xdc\x3e\xe7\x21\xec\x3c\x13\x0e\x02\x79\x67\xcf\x75\xe9\xd5\x9b\x0d\x66\x5b\x32\xf8\x85", 194, { 0x3c, 0x52, 0x5b, 0x8d, 0xbe, 0xb9, 0x70, 0x28, 0xcc, 0x64, 0x1c, 0xac, 0x0d, 0x15, 0x01, 0x71 }, { 0xb7, 0x52, 0x10, 0x89, 0x50, 0x06, 0xeb, 0xfc, 0xb7, 0x52, 0x10, 0x89, 0x50, 0x06, 0xeb, 0xfc } }, { "\x1a\x2b\x6f\x91\x58\x2f\x7c\xe2\x8c\x51\xee\x22\xf3\x64\xdb\x3e\x7b\x88\x8f\x89\x29\x60\x6f\x46\x8c\xd4\x22\x04\xcc\x7b\xc4\xa9\x2d\x8a\x8b\x29\x7c\x4a\x45\x27\x8c\x9d\xed\x31\x60\xff\x91\x97\xbf\xb2\x15\x2a\x44\xe6\x6e\x75\x2d\x10\x2c\x31\xee\x04\xff\xa2\x97\x2a\x30\xe7\x93\x89\x36\x4c\xf4\xa2\xf4\xeb\x0e\xb0\x18\x8e\x81\x98\x78\x39\xa6\xf3\x1c\x5e\x43\x14\x2b\xa2\x72\xaa\xf8\x62\xa4\x26\x63\x7c\x1c\x3c\x79\x64\x67\x84\x0d\xef\x21\x23\x30\x72\x30\xb9\x27\x7c\x50\xb9\x96\x10\x1c\xaa\x6c\x6a\xfe\xb7\xa9\x8a\xa0\x61\x7e\x93\x29\x6c\x67\x2c\xc9\x76\x22\x94\xe9\x31\xb3\x4d\x01\xfc\xf2\xd5\xb4\xeb\xcf\xab\x59\x37\x3f\x89\x11\xb9\xd0\x32\xa3\xe6\xe3\x32\x8a\x22\x70\xcd\x6c\xa1\x98\x1b\x4f\xa4\x63\xcb\xb6\xe8\xde\xa1\x29\x9e\xee\x40\x7b\xb9\x91\x09\x72\xdd\xbc\x74\x8c\x59\x7f", 195, { 0x56, 0x86, 0xb1, 0xe1, 0x9e, 0x22, 0x9b, 0x86, 0x69, 0x4f, 0x16, 0x13, 0x74, 0xd0, 0xc0, 0xac }, { 0x2a, 0x8c, 0x43, 0x99, 0x9e, 0x77, 0x62, 0xc8, 0x2a, 0x8c, 0x43, 0x99, 0x9e, 0x77, 0x62, 0xc8 } }, { "\x73\x8b\x0a\x8e\x9e\x4e\x32\x7c\xf0\x6f\xd9\xd0\x9e\x38\xaf\x5b\xb9\x9a\x39\x8a\x0c\x8a\x63\x8b\x22\x29\x80\x90\x70\xef\x65\x86\x9a\x79\x07\x35\xd1\x6b\x33\xd1\x7e\x14\xa9\xb3\xd9\x33\x89\x73\x5d\xc2\x20\x6d\x27\x87\x40\x43\xb8\xae\x40\x83\x6b\x49\xae\xd9\xb5\xa8\x64\x2d\xd9\xca\x22\xcc\x50\x10\x15\x55\xea\x48\x6d\x08\x1a\xe7\xf9\xc5\x70\xb9\xe0\x5a\x14\x68\x7b\x7a\xbc\xde\x76\x7e\x2b\x8c\x7d\x11\x83\x40\x8f\x2e\x97\x5e\x02\x1b\xdc\xa9\xbf\x25\xf0\x02\xd3\xb5\xa4\x5e\x5e\x7d\x78\x01\xb0\x7e\x68\xff\xcc\x44\xfa\x3e\x81\x80\x4b\xb4\x7b\xf4\x76\xea\xf9\xb2\x9d\xf8\xc0\x8a\xe4\xf1\x68\x3b\x66\xb3\x1c\x8b\x70\xd3\x14\xf1\x68\xe2\x1a\x6f\xf1\x64\xad\xef\x21\xa6\xcc\xf1\xfb\x32\x57\xc9\x5c\xd3\x88\xbf\xe5\x0c\xff\xa3\xda\xff\x65\xd5\xb0\x73\x3d\xf0\xa9\xac\x4b\x24\x37\xbd\xc8\x67", 196, { 0x43, 0xc8, 0xcd, 0x6b, 0x73, 0xc2, 0xe5, 0xab, 0x30, 0xd0, 0xb4, 0x3c, 0xef, 0x48, 0xe4, 0xfe }, { 0x95, 0x3f, 0x29, 0xad, 0xc6, 0x47, 0xde, 0x68, 0x95, 0x3f, 0x29, 0xad, 0xc6, 0x47, 0xde, 0x68 } }, { "\x7c\x49\x96\x50\x98\x19\x5e\xac\xea\x97\x8c\x1e\xee\x0e\x4f\x1e\xb4\x68\xc9\x16\x72\x21\x33\x7a\x7a\x7c\xae\x91\xb2\xb4\x57\xa4\xcf\x6c\x76\x07\x55\xc3\x59\xf7\x1d\xf0\x82\x64\x31\x6b\x26\x57\x19\xc3\x0c\x61\x7c\xd4\xa8\xd8\x7f\x13\x6f\xa2\x3e\x68\x20\x18\xf5\x89\x73\xf5\x5c\xc0\x65\xeb\x58\xa6\xda\x04\x87\xd1\x5d\xa3\xde\x9d\xce\x3d\xef\x52\x5e\x9b\x63\x06\x87\x64\x84\x73\xe7\xcb\xdf\xac\xad\xd5\xaa\x76\x5e\x99\x9c\x77\x7e\x81\x20\xc0\x16\x4e\x70\xa4\xfb\x9e\x48\xd0\xf5\xf8\x9d\xf1\xf4\xf8\xa4\x34\xe8\xd3\x94\xc0\xc5\x4f\xe4\x39\xc6\x72\x9b\xe9\x4e\x08\x20\x94\x5b\x6a\xab\x92\x15\x18\x2c\xf2\xd5\x0e\x89\x28\xd4\x64\x8b\xd0\x0a\xcc\x84\x59\xdf\x49\x87\xd5\x27\x26\xd2\xe5\xb8\x9c\x30\x28\x1d\xd0\x89\x66\xb9\x33\x81\xbc\x25\xf3\x58\x9d\x10\x46\x5b\x0b\x6e\x64\xdb\x4d\xbf\x78\x8a", 197, { 0xe6, 0xa5, 0xfb, 0x5a, 0x06, 0x89, 0xc3, 0x04, 0x07, 0xa0, 0xeb, 0x68, 0xcd, 0xf7, 0x02, 0x00 }, { 0x9e, 0xcb, 0xe0, 0x7f, 0xe3, 0x55, 0xda, 0x6c, 0x9e, 0xcb, 0xe0, 0x7f, 0xe3, 0x55, 0xda, 0x6c } }, { "\xaf\x77\x5d\x18\x48\x07\xe9\x28\x6c\xaf\xb8\x46\x35\x8d\x05\xcc\x6f\xbc\xcd\x0e\xe9\x51\x49\xbe\xf1\x2b\x4e\x4e\xd2\x9d\x2f\x47\x57\x39\xa3\x2b\x70\x6e\x43\xc1\x22\xe1\x5c\xa8\xee\x20\xec\x63\x59\xe6\x6d\xa9\x02\x7b\x7c\xdc\xd3\x43\x83\x79\x13\x8b\x41\x0d\x9c\xe1\xba\xb5\xb6\xd6\x1d\x7f\xbe\x28\xf3\xda\x86\x5f\x1d\xbf\x10\x36\x4d\xa1\xe2\x53\x6a\xc6\xa9\xb3\x5d\x6b\x3c\x78\xe2\xed\x1b\xc8\x03\xed\x72\xa3\xd1\x3e\x05\xd0\xc3\xbd\x56\x25\x58\xd5\x96\xed\x13\x86\x96\x50\x1f\xd8\x80\xf6\x0c\xaf\xf4\xe6\xa2\x1a\xc5\x59\x82\x6b\x07\x94\xd8\x07\xc9\x9b\x30\x3c\xa0\xec\x61\x5c\x8b\x0b\x9a\xe5\x6f\x42\xd4\xfd\x98\x64\xba\x42\xe0\x85\x0c\xce\x29\xf7\xcf\xde\xc1\xa4\x4c\x3f\x37\x60\x04\xca\x3b\xd2\x6f\xb9\x39\xa4\x6f\xd6\x60\x9e\xc2\xee\xe6\xd1\x1d\x46\x74\x95\x1f\x0e\x83\x7b\x0e\x67\x46\x0d", 198, { 0x4e, 0x41, 0xfa, 0x67, 0x80, 0xf4, 0x83, 0xca, 0xf1, 0x04, 0xd4, 0xb2, 0x63, 0xb5, 0x1a, 0xf5 }, { 0x19, 0x6d, 0x40, 0xf8, 0x18, 0xd6, 0x5f, 0x86, 0x19, 0x6d, 0x40, 0xf8, 0x18, 0xd6, 0x5f, 0x86 } }, { "\x2e\xee\xa2\xe9\xe5\xa9\x0d\x99\x55\x87\xe3\x9d\xde\x5f\x85\x6c\xef\x2b\x71\x46\xa5\x66\xf7\x30\x9b\x55\xc3\x07\x22\xab\x67\xc5\x6e\xa8\xda\x3a\xd6\xb8\x18\x14\xa4\x60\xf3\xab\x79\xa0\xb4\x0d\x0b\xcb\x8c\x39\x2e\xeb\x61\x0f\x6a\x03\x1c\xfa\x4e\x5c\x54\x1e\x65\x6b\xe1\x9a\x95\x78\x16\xe6\x37\x3d\x15\x6b\xf6\x98\x9f\x6c\x96\x40\x03\xe6\x43\x80\x0d\xa6\xbd\x8c\xd4\xb5\xff\x3b\x80\x53\xa6\x00\x43\xf5\xe7\x2f\x5f\x31\xaf\x16\x54\xa3\x29\xc0\xb3\xcc\x9a\x0f\x62\xa1\xf3\x07\x04\x15\xa8\x9f\xab\xf8\x1d\xdc\xfc\xd4\x07\x5f\xdb\xc1\x0c\x4d\x20\x18\x4a\xd1\x84\xcc\x1c\xc0\x80\xf6\x4c\xaa\x10\x98\x2a\x9e\xd4\x83\x76\x3e\xfd\xc0\x62\x64\x16\x9c\xd9\xb4\xa0\x6b\x05\xae\x64\x12\x72\xdf\x68\x05\xe0\x02\x64\x24\x4e\xa8\x52\x07\xe7\xfc\xfc\xd1\x9f\x9e\x69\xd3\x3e\xa1\x73\x48\x8e\xf2\x2d\x11\xa8\x61\x0c", 199, { 0x13, 0x69, 0x80, 0x26, 0xb4, 0x4a, 0xb1, 0xf3, 0xae, 0x2a, 0x07, 0x7e, 0xe3, 0xb6, 0xfe, 0x7d }, { 0x14, 0x08, 0x91, 0xd6, 0x90, 0xa0, 0xd9, 0x80, 0x14, 0x08, 0x91, 0xd6, 0x90, 0xa0, 0xd9, 0x80 } }, { "\x97\x1e\xe3\x1c\x49\x98\xba\xc6\x12\x69\xea\x2b\xa7\xcd\x76\x06\xcc\xd6\x5e\x31\x61\xb7\x3d\x10\xdc\xed\xc1\xae\x2b\x51\xe1\xd9\xda\xcd\xfc\x17\x0c\x73\xbb\xd1\xf4\x51\x8a\x87\xcf\xed\x65\xef\xf6\xf2\x92\x8d\x5b\xe8\xea\xaf\xa4\x7a\x6e\x02\x7e\x0c\xd6\xb8\x67\xeb\x90\xcd\x9d\x96\x4a\xa0\x06\x2e\x74\x8a\xa8\xd1\xd8\x94\x65\x63\x4b\x13\xee\x29\x1b\xbb\xd1\xc4\xc4\x8e\xf1\xde\x2b\x92\xdc\x23\xed\x82\xbf\x7e\xa6\x39\x44\x77\xfe\x21\x5f\xa8\xca\x6b\x33\xde\x04\xff\x95\xe7\x51\x60\x38\xc6\xad\x87\x08\x07\xd0\x1c\x68\x1b\x62\xc9\x8e\x27\x82\xbc\x41\x4b\x22\x49\x4c\x1d\x0a\xe3\xd6\xc3\x0a\x46\x4e\x30\x4e\x38\xf6\x35\x73\xff\x58\x75\xcf\xca\x6e\x16\xea\xdf\x4d\x30\x29\xe1\xb0\x8d\x5d\xf7\x8e\x56\x93\xc3\xbf\x75\xf9\x0a\x32\x92\x6c\x3d\x65\xf0\x50\x7c\x74\xe4\x43\x96\x31\xbc\xaa\x53\x95\xc3\x18\x40", 200, { 0x97, 0x07, 0xf2, 0xfa, 0x3a, 0x29, 0x1e, 0xb9, 0x2c, 0x0a, 0x92, 0x99, 0x3b, 0x14, 0x8f, 0x99 }, { 0x37, 0xf5, 0x73, 0xfb, 0xb0, 0xf4, 0x25, 0x53, 0x37, 0xf5, 0x73, 0xfb, 0xb0, 0xf4, 0x25, 0x53 } }, { "\x83\x83\x87\x45\xf7\xfa\x5a\xcf\xb3\x0a\x4d\xf0\xa1\xc7\x9b\x9f\x29\x7b\x24\x35\x95\xbc\x0b\xed\x28\x50\x64\x44\x76\xa0\xe1\xdc\x54\x14\xd2\x7e\xe0\xd5\x69\x67\x1e\x2b\x5a\x7f\xb7\x06\x10\x5e\x9e\x6d\x25\xe1\x2a\x1d\x81\x40\x73\x4a\x61\x2c\x46\x7a\xde\x31\x29\x2e\x0a\x46\x59\x32\x11\x9a\xda\x77\xdd\x90\x3b\x7c\xf8\xbf\xbb\x53\x43\x98\x14\x87\x6a\x50\x4c\x38\xff\xba\xfa\x22\xce\x92\x1c\x0d\xfc\xdb\x9a\x96\xed\xc9\xe6\xe7\x7a\x08\xec\x0f\x06\x3d\x71\x6e\xf6\xee\x43\x76\xbf\x93\x69\x9c\xe2\x61\x89\xea\xab\x1e\x89\xea\x1d\x1c\xf9\x4d\xf0\x54\x77\x49\x40\x4c\xa3\xf4\x9f\x9f\x10\x9b\xdb\xad\xd9\x03\x96\xaa\x5a\xb4\x95\x2a\x07\x30\x45\x1f\x38\x1a\xe4\xfa\xed\x91\x93\x02\xd2\xef\x77\xb3\x63\x54\x64\xd8\xbe\x0e\xe2\x8d\x71\xc7\xdb\xec\x37\x86\x0a\xad\xee\x2c\xa2\x34\x4e\x45\xaf\x2e\x78\xe1\x23\xa3\x9e", 201, { 0xe7, 0xfc, 0x8f, 0xff, 0x2f, 0x45, 0xda, 0x2b, 0xef, 0xed, 0x85, 0x62, 0x8e, 0x85, 0x42, 0xb5 }, { 0x82, 0xe8, 0x4c, 0x05, 0x89, 0x52, 0x1d, 0x50, 0x82, 0xe8, 0x4c, 0x05, 0x89, 0x52, 0x1d, 0x50 } }, { "\xb6\x3a\x1c\x3b\x1d\xd8\xce\xcf\x5f\x8a\x91\xeb\x10\x7c\x82\xcd\xbd\x91\xd9\xd9\x1a\x67\x2c\x7a\x4a\x43\xc9\xea\x78\x37\x14\x38\xe6\x7c\x8a\xa8\xad\xe3\xfb\xef\xb7\xa1\x28\xcb\xb9\x1d\x90\x6b\xfc\x56\xe9\x2e\x35\xeb\xbb\x10\x1d\xde\xa5\x3b\xff\x7b\x39\x2a\x7f\x14\xd7\x88\x40\x4c\x1d\x10\x16\x23\x33\x8c\xb7\x17\x3b\x5c\x46\xc1\x79\xd3\x52\xe8\x0d\xf4\x28\x10\x43\x56\xc1\x3b\x1a\x47\xb7\xc8\xf2\x35\xea\x3b\x2a\x4c\x20\xf4\x0a\x67\x1a\x54\x87\x4a\xa2\x7b\x38\x51\x22\x7c\x39\x3a\xbc\x61\x81\xb9\x80\xe8\x64\xee\x9b\xf2\x66\xf0\xd8\xc3\x4a\x08\x92\xf0\x15\x45\xf4\x7d\xb3\x8c\xd7\x44\xbc\x74\x57\xc2\xb6\x33\x06\x57\x0c\xdf\xb6\x2e\x1c\xea\xd9\x13\xb8\x53\xae\xf8\x2a\xd0\x29\x38\x39\xb6\xeb\x7f\xcd\xf4\x01\xa6\xeb\x40\x98\xf9\x65\x38\x10\xf1\xd3\xd3\x23\xbf\xd7\x9c\x05\x3b\x22\xb7\x71\x97\x28\xfe\x4a\x8a", 202, { 0x6e, 0xb1, 0xa3, 0xa9, 0xb4, 0xfe, 0x59, 0xf7, 0xca, 0xbe, 0xa2, 0xd3, 0x91, 0x2d, 0x27, 0xe9 }, { 0xda, 0x32, 0xea, 0x09, 0xb9, 0xa3, 0x47, 0xf0, 0xda, 0x32, 0xea, 0x09, 0xb9, 0xa3, 0x47, 0xf0 } }, { "\x2b\x8b\x43\xef\x0c\x8b\x1a\xb9\x2f\xfb\xf8\x4c\x2c\x56\x5a\xd4\x97\x79\xd9\xd4\x1d\x3c\xde\x2b\xaf\x1b\xa5\x7a\x78\x70\xd4\x58\x1a\x2d\xf2\x1e\x98\x7a\x54\x59\x7d\xe7\xfb\x16\x2a\xa1\x5b\xe9\xd1\x7a\x08\x90\xd8\xd3\x31\xf9\xb4\x16\xe4\x40\x66\xdf\x17\xfc\xdd\x74\xb8\x6f\x73\x24\xff\xa2\x49\x3a\x7c\x51\x55\xc0\xd7\x6a\xac\x6b\x4e\xf7\xcf\xe6\x8d\xcc\x11\x0e\x96\x27\xf1\xd9\x1e\xfc\x97\x2e\xb1\xef\xd3\xf8\xf4\x6c\x00\xf3\x1e\x5b\x5c\xe6\x91\xbd\x8d\x0f\x9a\x7d\x2f\xf1\x2c\xee\x44\x82\x18\x6e\x2b\x5c\x3e\x42\xda\x6a\xbe\xb1\x75\xa7\xcd\xfe\x46\x07\x39\xf3\x5e\xd9\x84\x70\xd4\x95\x68\x87\x0c\x76\x6f\xf4\xc6\x22\x78\xd9\x41\xbc\x5b\x2a\x74\xa4\x46\x3e\xf9\x94\xd3\xf2\xfa\x2a\xb9\x96\xd2\xb0\xac\x19\x35\x8f\xee\x71\x64\x09\x23\xd1\x72\xa0\xf8\xd0\x40\xf6\xc8\x9f\xf3\x75\xfc\x09\x9f\xf1\x5b\x85\x00\x6c\x68", 203, { 0x39, 0x10, 0x2d, 0x86, 0x53, 0xf4, 0x1b, 0x47, 0x60, 0x86, 0x17, 0x9f, 0x1c, 0xac, 0xe6, 0xfc }, { 0x69, 0x03, 0x9d, 0xf8, 0xf4, 0x0d, 0x4a, 0x64, 0x69, 0x03, 0x9d, 0xf8, 0xf4, 0x0d, 0x4a, 0x64 } }, { "\x33\x6f\x8f\x26\xc7\x01\x03\x52\x5e\x87\x92\x01\xb6\x97\x37\x5f\x62\xb9\x57\x1b\x6c\xa7\x70\x06\x32\x97\xb8\x0a\x32\x29\xb8\x06\x99\x1a\x48\xdd\x47\x8b\xa1\x48\x5c\x3b\xe5\xf6\x29\x7c\x4c\xff\xcb\xd1\x60\x64\x23\x21\xa4\x39\x0c\x98\xf0\x53\x3a\x59\x0b\x49\xff\x11\xea\xc8\xf2\x83\x5c\xd9\x85\x9d\x61\xd3\x11\x0d\x89\x44\x27\xec\x9e\xb0\x2a\x67\x18\x38\xdc\x5e\x83\xef\xca\x59\xcc\x1c\x73\x76\x7f\x8e\x77\xca\x74\x01\x1e\x30\xf5\xee\x9b\xbf\x75\x44\xde\x2e\xf0\xbd\x6c\xfc\x06\x8c\x9d\x7b\x3a\x01\x3a\x92\xc1\x2f\x21\x6d\xd0\xea\xf0\x44\x58\x68\x29\x45\xb9\x9c\xe4\xe3\x8e\x05\x84\xd3\x8d\x6d\xdf\x62\x2b\x87\xa3\x41\x06\xcd\xbd\x24\x89\x31\x4a\x27\xa4\xe5\x5a\x3f\xbc\x22\xa8\xe7\x78\x96\x15\x36\xca\x1c\x8b\x13\x84\x45\xcc\xd1\xfe\x9f\x17\x19\x77\xd0\x32\xf2\x8c\x76\x60\xf8\xf4\xaf\x1d\xfd\x5a\x55\x1d\xc0\x5e\xe4", 204, { 0x36, 0xf1, 0x1b, 0x59, 0xee, 0x92, 0x05, 0xcf, 0xb1, 0x6b, 0xab, 0x4a, 0x4a, 0x6c, 0x26, 0x21 }, { 0xf0, 0x1e, 0xad, 0xbe, 0x3f, 0xad, 0x55, 0xf8, 0xf0, 0x1e, 0xad, 0xbe, 0x3f, 0xad, 0x55, 0xf8 } }, { "\x9d\xfa\x3b\x9d\x41\xfd\x2d\xab\x36\x5c\x71\xc0\x6d\xd4\x9f\x1f\xa2\xd5\x1a\x61\x4c\x17\x22\xab\xad\x08\x81\x68\x3c\xf1\x15\x96\xe7\x80\xed\x16\xa5\xc0\xab\x51\x84\xbb\x26\xb5\x63\x78\xf7\xc3\x56\xad\xcd\x7f\x71\xc9\x99\xc7\x3e\x20\x27\x94\x38\xde\x0c\x2c\xdd\x8c\xa8\xb7\x50\xcb\xa7\x72\xdb\x13\x16\x03\xf6\x19\x95\x05\x61\xf2\xe7\xfe\x9b\x8f\x21\x75\x14\xd3\x40\xdb\x55\xb9\xda\xf6\xbc\x1a\x11\x15\xbc\xdb\x04\x7b\x13\xab\xe4\xed\xe1\x1a\x8c\x42\x2f\xbe\x21\x2f\x66\xc3\x75\x8d\x56\xf7\x8e\xfd\xc1\xad\xc4\x91\x6b\x5e\x3d\xf8\x77\xfa\xee\x8c\x41\x9a\x3d\x24\x8a\x0a\x68\x0f\x49\x6c\x9c\xd2\xe9\x12\x42\xeb\xec\xf0\x32\xe5\xf6\x29\xce\x00\x67\x4d\xcf\x55\x91\x3d\xec\xdf\x29\xfa\x4e\x49\x98\x9e\x55\xd4\xe0\x24\x5a\xb9\xc1\x84\x5c\x3f\xf0\xd1\xdd\x8e\x81\x4e\x81\x18\xf7\xfd\x44\xf2\x8d\xe6\x8d\x13\x73\x3f\xcb\x6a\x0c", 205, { 0x24, 0x2f, 0x23, 0x46, 0xb2, 0xf8, 0x55, 0xbc, 0x71, 0x05, 0xaf, 0x08, 0x6b, 0x36, 0xa0, 0x5f }, { 0x73, 0x67, 0xe3, 0x32, 0x34, 0xdd, 0x0b, 0x14, 0x73, 0x67, 0xe3, 0x32, 0x34, 0xdd, 0x0b, 0x14 } }, { "\xb6\xb4\x58\x31\x4d\xf6\x2f\x6b\x8d\x5b\x18\xe6\xbf\xd0\xea\xa8\x99\x71\xb4\xf8\x52\xf9\xa5\xdb\x3c\x72\x88\xb4\x8f\x0e\x39\x6b\xa5\x5c\x63\x5b\x9f\xc4\xd7\x8f\x2b\x88\xdb\x33\x5a\xa7\x3a\x50\xcf\x9e\x38\x45\x89\xf1\x77\xc9\xd1\x74\x91\x3f\x75\x14\xf0\xc0\x8c\xba\x1a\x61\xc8\x09\xc7\x6e\x8d\x88\x34\x69\xec\x67\x51\x32\x8e\x02\x89\x73\x75\x2f\x27\x2d\xb3\xb4\x33\xad\xeb\x11\x36\xbe\xaf\x1a\xc3\x46\x65\xf4\x58\xb5\x02\xbb\xeb\xab\x75\xb5\x24\x89\xe1\xc7\x58\x08\xae\xf3\x69\x8f\x68\xd6\xc4\xdc\xd3\x9f\x1e\x9c\xaa\xf0\xbd\x34\xca\xdc\x14\xed\xbf\x01\x89\xa7\xf3\x59\x47\x05\x05\xac\xad\xb5\xb0\xdb\xdb\x2f\x3e\x6e\x18\xa3\x37\x62\xdb\x38\x01\x6c\x05\x15\x0c\xb7\x37\x06\x85\x95\x8a\xdf\xda\xdf\xf5\x41\xc5\x80\x02\x5f\xa7\x44\x09\x80\x4a\x8a\x70\x62\xa7\x7f\xf6\xd2\x9b\xaa\x9a\x44\x52\xd4\xe8\x28\xf5\xff\x1a\x99\x7d\xde", 206, { 0x02, 0x52, 0x66, 0xa4, 0x5b, 0x17, 0xf2, 0x43, 0xcf, 0xb9, 0xe5, 0xf7, 0xd3, 0x72, 0xd4, 0x16 }, { 0x21, 0x9d, 0x14, 0xf8, 0x87, 0x98, 0xc1, 0xb7, 0x21, 0x9d, 0x14, 0xf8, 0x87, 0x98, 0xc1, 0xb7 } }, { "\x93\x58\xad\x54\x7d\x31\xcb\x55\xb8\xd5\x5f\x68\xe8\xfb\xed\xde\xc5\xc5\x6b\x85\x00\x5f\x23\x2f\xa9\xbc\x67\x6c\x0a\x01\xf5\xe8\xb7\x40\x35\x13\x41\x4a\x09\x71\x2a\xfc\x62\x7b\x06\xbf\xd4\x48\x33\xdd\x5d\xbf\x55\x1b\x89\x8b\x22\xf1\x04\x42\x8d\xff\x7d\x54\x72\x6c\xc4\xd7\x9e\x4a\xd8\x97\xdf\x5b\xf2\xaf\xb2\x29\x13\x49\x13\x46\x3b\x62\x50\x5b\x7c\x7c\x18\xa9\x8b\xef\x8e\xcf\x5c\xcb\x08\xc4\x56\x34\xa3\xe3\x81\x26\x5a\x8f\x01\xde\xfc\x83\x70\x7d\x5d\xca\xbc\x93\x13\x99\xa2\x6b\x3c\xfd\xad\x67\xa5\x57\x58\xbf\x9b\x74\xb9\xc5\xf0\x64\x63\xbb\xfb\x2e\x63\xa5\x12\x54\x3e\xf8\x65\x58\x2b\xeb\x3c\x4c\x78\x9c\xc0\x22\xb9\xf5\x29\x74\xc4\x29\xbf\x29\x3e\x3f\x16\x10\x22\xb8\xa8\xc0\x98\x02\x67\xb2\xf3\xc3\xbb\xb2\x7c\x69\x1d\xfb\xc3\xa2\xa3\x62\x2f\xe0\xd2\xa2\x0d\x3d\x8c\x75\x1b\xa2\xfb\x8b\x16\x23\x30\x6f\xd3\xfa\x54\x4a\xe6", 207, { 0x36, 0xca, 0xa7, 0x3a, 0xf9, 0x0c, 0x53, 0x8c, 0xb0, 0x8c, 0x83, 0x06, 0x2c, 0x58, 0x3a, 0xd7 }, { 0x85, 0x74, 0x2f, 0x96, 0x3b, 0x94, 0xd2, 0xa3, 0x85, 0x74, 0x2f, 0x96, 0x3b, 0x94, 0xd2, 0xa3 } }, { "\x17\xb9\x48\xdd\x43\x3d\x81\xad\xcd\x5e\x45\xbe\x18\x76\xec\xec\xed\x2f\xed\x7b\x89\x90\x00\xac\xe8\x50\x58\x08\x47\x57\x55\x1f\xe7\x98\x3f\xab\xf5\x5d\x03\x8b\x56\xd3\x9a\x9f\x01\xc2\x01\xbb\xee\x86\x57\xfa\x56\x67\x14\x4a\x6b\x70\x53\x7b\x06\x15\x30\xd3\x6d\xba\x31\xe3\xe6\x87\xed\xfe\x45\x73\x99\xeb\x58\x6c\x54\xc1\xb6\x70\x52\xc6\x25\x34\x7b\x71\x0a\x99\xd9\xff\xba\xa7\x01\xb8\xcc\x35\xa7\x87\xb9\xb9\xae\xf7\x85\x4f\x3a\xd0\x3a\xec\xea\xcf\x94\x69\xeb\x37\x3b\x1d\x85\xa3\x06\xee\xe8\x3a\xcc\xf8\x77\x79\xa9\x0c\x90\x3c\x2b\x6c\xf0\x46\x90\x8b\xee\x97\xa5\xf1\x69\x06\x0d\xca\xa5\x1f\xb2\xa7\x84\x69\xf5\x09\xfb\x79\xe6\x2f\xc3\xc7\x1c\x49\xb0\xa6\x82\xb8\xc0\x2a\x99\x27\x52\x90\x16\x6b\x6b\x6c\x2e\x61\xf3\x24\x7c\xfa\xdf\xeb\x0f\xaa\x52\xa4\x6e\xfe\xdc\x59\x34\x1a\xa1\xc6\xe2\x7d\xa0\x15\xe3\xe7\xdd\x69\x86\x46\x29\x8f", 208, { 0x5b, 0x2e, 0xb9, 0x18, 0xf9, 0x19, 0x1a, 0x3f, 0x14, 0x29, 0x91, 0xf4, 0xfa, 0xae, 0xd1, 0xc4 }, { 0x14, 0xf5, 0x53, 0x40, 0xd7, 0xa6, 0x90, 0xfa, 0x14, 0xf5, 0x53, 0x40, 0xd7, 0xa6, 0x90, 0xfa } }, { "\xea\xb8\xfb\x8e\xb4\xf0\x1e\xfb\x86\xf4\xf8\xd3\xd9\x02\x74\xfb\x2d\xbf\xe7\xed\xe5\xff\x4c\x49\x11\xf7\x5f\x1f\xc1\xea\x1e\x23\x81\xf8\x38\x4c\x29\x62\xe1\xe4\xac\xb2\xcb\x12\x3a\xb0\x01\x1e\x60\xe1\x0f\xe2\x55\xc3\xbd\xd0\x02\x31\xc4\xb9\xaf\xbf\xbe\x61\x67\x56\xa4\xd5\xd4\x45\x70\x4d\xe7\x00\x9b\x2f\x36\x43\xe0\x6a\x53\x74\x4a\x4d\xfd\xe2\x66\x07\x79\xd7\x6a\x86\x83\xde\x7f\x14\x16\x23\xc5\x8d\x54\x80\x31\x1f\x2b\xc3\xfd\x55\xb4\x34\x99\xff\xe3\x0d\xd6\x04\xa1\x02\x95\x08\x2a\xcf\x8a\xf1\xa1\xc7\x53\x29\x65\x30\x7b\x72\xae\x7e\xaf\xe7\xbb\x03\xc5\xb9\xb4\xa8\x77\x57\x4c\x99\x3b\xbd\xc6\xc1\xae\x3d\x59\xe9\xab\xd5\x7e\xe8\xf9\x65\x40\xd6\xe3\xed\x50\x55\x97\x26\x5c\xb1\x9b\x3b\x78\xf2\x4d\xc4\x06\xae\x60\x0c\x2b\x4c\xde\xc6\x5e\xb9\x68\xa4\xfe\xf2\x43\x4e\x2e\xe1\x3f\x6c\x10\x7e\x97\xd7\x59\x31\x89\xb0\xd9\x6a\x2c\x80\x86", 209, { 0x31, 0x25, 0x6f, 0xfd, 0x35, 0x22, 0xe8, 0x07, 0xc3, 0x32, 0xf2, 0xd6, 0x13, 0xa7, 0x8e, 0x45 }, { 0x0f, 0xdd, 0xb0, 0x43, 0x14, 0xfa, 0x95, 0xa7, 0x0f, 0xdd, 0xb0, 0x43, 0x14, 0xfa, 0x95, 0xa7 } }, { "\xad\x22\xec\x00\x1f\xf3\x53\x2e\x7e\xf1\xe1\xc1\x56\xdc\x63\xa5\x95\x6a\x6e\xea\xd4\xcb\xef\x77\x7b\x72\x34\xaa\x41\xb7\xfe\x52\x52\x3e\xcd\x5d\xe5\x5a\xab\xb2\x0c\x79\xb7\x56\x36\xb1\xd6\x20\x6e\xe1\xb1\x69\xe0\x5a\x66\xa1\x9f\x77\xf3\x76\x17\xd2\xf3\xb8\x1e\x7f\x7d\x6b\x17\xc8\xc8\xec\x9a\x1d\x24\xbb\x64\xa8\xae\x30\x9d\x36\x6a\x70\xfe\xa0\x5d\x03\x3e\x2e\xff\x0f\x32\x44\x49\x4a\x29\x7a\x22\x66\x46\x3b\xfd\xf9\x6f\xec\xf4\x13\x59\x85\xdc\x16\xc4\x73\xf0\x7d\xc6\x08\x86\xbe\xaf\xc6\x1e\x5e\x0b\xf8\x89\x8e\xee\x8b\x27\x24\xc5\x09\x9f\xd6\x7a\x3b\xa2\xf3\x9b\x9c\x34\xc3\x0d\x25\x9c\x1a\x83\xf7\x52\xd3\x84\xdd\x57\xd8\x3e\xcd\x57\xac\xf0\x81\x31\x7e\x8c\x3f\x19\xf7\x31\xce\xc9\xad\x3a\x03\xa5\x65\x48\x93\x45\x59\xae\xbe\x40\x2b\x01\xb3\xc6\xdb\x94\x15\xfe\x6b\x9e\x3d\x62\x82\x7d\xb1\x2b\x8a\xff\xe0\xfe\x93\x69\x11\x8a\x0b\xbc\x7f", 210, { 0x5d, 0x67, 0x04, 0x3d, 0xa2, 0x1a, 0xaa, 0xa7, 0xd4, 0x27, 0x26, 0x9a, 0x8c, 0xbe, 0x4a, 0x8d }, { 0x57, 0x8e, 0x17, 0x27, 0xfd, 0x23, 0xe5, 0xac, 0x57, 0x8e, 0x17, 0x27, 0xfd, 0x23, 0xe5, 0xac } }, { "\x79\x40\x60\xc1\x58\xf4\x6d\x72\xa3\xa6\xcf\xb3\x19\x30\x24\x3f\x69\x3e\x64\xa9\x4d\xfe\x1a\x0b\xcf\xba\xa3\x18\x4f\xb8\x8f\x94\x3a\x77\x5e\x53\x01\xb6\xed\xcd\x87\xbe\xfd\x2e\x7b\xe1\x86\xd6\xc0\x8a\xf2\x9a\x06\x8c\xc2\x86\xb4\xce\x10\x9d\x6d\x61\xbb\xf1\x09\xb8\x0a\xe0\xa3\x6c\x05\xa2\x3a\x04\x4f\x49\x97\xde\xcc\xef\xdd\xab\x51\xa5\xa6\x02\xdd\xf4\x9f\xe4\xc6\xea\x3f\xd1\x98\x87\x01\x0e\xc5\x4d\xb7\xc1\x95\x1d\xdd\xba\x21\x13\x74\xf2\xd9\xa2\xc0\x9b\xdd\x50\x67\x0b\xcd\xf4\xdc\x32\xb0\xbf\x70\xbc\x32\x1d\xbf\xd2\x27\x7f\x2b\x62\xc3\x76\x18\xae\x60\x66\x6c\x6a\xc6\xf5\x81\x86\xfb\x58\x5f\xb7\x89\xca\x37\xa6\xb5\x81\x51\x06\x8c\xe7\xbf\x2d\x4d\x41\xb2\x6e\x77\x43\x62\x8d\xe7\xc6\x27\xbe\x16\xad\x35\x95\x96\xc4\xa7\x5b\x96\xad\xc9\xb9\xdd\x28\x8e\xae\x40\x60\x1a\x93\xf6\xba\x08\xf6\x1c\xe7\x30\x46\xf4\xe4\xcc\xe8\x5f\x05\xee\x49\xa9", 211, { 0xc8, 0xf2, 0xc8, 0x9f, 0x12, 0x4e, 0x17, 0x42, 0x89, 0xe7, 0x90, 0x65, 0x70, 0x3d, 0xae, 0x43 }, { 0xec, 0x0c, 0xe0, 0x65, 0xc8, 0x52, 0x70, 0x0e, 0xec, 0x0c, 0xe0, 0x65, 0xc8, 0x52, 0x70, 0x0e } }, { "\x9c\x75\xef\xa4\x2a\x5c\x71\x38\xbf\x16\x56\x09\x48\x5f\xdc\x54\x4e\x0b\x1f\x6b\x0f\xa2\xd8\x17\xe6\x8d\xcf\xbd\xe3\x23\x4f\xfc\xd5\x5a\x60\xf1\xd2\xc5\xa3\x7d\x3e\xcb\x67\x2f\xef\x35\xa0\x31\xda\x5f\xd9\xa0\x4a\xe9\xcd\x30\x41\x16\x19\xfb\x5f\x88\x1c\x9c\xd4\xb7\x3e\xc1\x51\xa8\x58\xc7\xf2\xc5\xed\x65\x3d\x4c\x6f\xd7\xa6\xff\xed\xa6\x7d\x8a\xf3\x93\x0f\xa3\xd0\x8e\xef\x4e\x00\x75\xe4\x15\xa3\x03\x04\xb7\xca\x3d\x0e\x08\x92\x1f\xbf\xbe\x36\x1f\xd6\xa2\x55\x27\x9b\x5c\xa3\xee\xf4\x40\x05\xb4\x0e\x10\xae\x3f\xb9\x4f\x37\x68\x59\x22\xf2\x85\x36\xe0\xb3\x5c\x56\x58\x07\xc8\xdb\x92\x57\x42\x08\x41\x1b\x27\x95\x15\xe8\x85\x7a\x25\xfa\xfb\x10\x16\x7a\x4b\xbc\xfd\x89\x15\x33\x7a\xe1\xea\xc2\x44\x48\xf4\x4a\xf6\x96\xa5\x69\xed\x2e\xab\xd9\x48\x1f\x31\x3c\x7f\x9f\x38\x82\x5b\x03\x1e\xcd\x14\x48\x2c\xb9\x93\xe0\xe5\x7c\x24\xaf\xc0\xa0\x97\xf9\xd1", 212, { 0xb2, 0x70, 0xee, 0xf6, 0x91, 0x40, 0x4c, 0xed, 0x9c, 0x55, 0x38, 0x16, 0xe6, 0xa1, 0x20, 0x0a }, { 0xf7, 0x72, 0x51, 0xea, 0x0a, 0x59, 0x9b, 0x56, 0xf7, 0x72, 0x51, 0xea, 0x0a, 0x59, 0x9b, 0x56 } }, { "\xb7\xcd\x26\x3a\x19\x55\x31\xb4\x80\x00\x79\x1f\x3f\x1c\x31\x66\x9c\x35\x5d\xa3\xc1\xd6\x6c\xb3\xfd\x75\xb6\xc3\x41\xf6\x5f\xfe\x9a\x90\x42\x2d\x55\x83\x01\x98\xc2\xa1\x95\x35\xd9\x1d\x01\x9c\x4f\x83\xef\xa2\xb5\x22\xb1\xe9\xa3\x61\x54\x4e\xd2\x7c\xbe\xab\xa4\x38\x70\x2b\x58\x77\xb6\x49\x57\x82\xe4\xb3\xc6\x7d\x03\x88\xd8\x0e\x81\x05\xfd\xfd\x73\x39\xa2\xa8\x0c\x69\x1c\x05\x16\xae\x20\x26\x8a\x2f\xbe\xd5\x43\xc4\xef\x95\xc7\xf1\xd5\x2f\xce\x41\x4e\x1b\xf0\x64\x3e\x7f\x6f\x89\x33\x10\x40\x86\x43\xce\x50\x01\x52\x98\x10\xc2\x94\x02\x4b\x61\xe8\x1c\x2b\x86\x4b\xdb\xe6\x21\x0b\xf5\x3d\xf3\x4a\xf1\x29\x28\x09\xd9\x68\x32\xdc\xac\xda\x65\x65\xbc\xfb\x1c\x89\x99\x65\x9a\xd8\x9a\x2b\xa3\xa3\x6c\xf1\xe4\xa7\x22\x24\xa4\x5d\xbe\x62\x5c\x89\x2c\x86\xaf\xd2\xb6\x3c\x36\x9e\x14\x3d\x8f\xf9\xe9\x60\xe3\x1d\x87\xd2\x3c\x6a\xa8\x90\x2d\x0c\x8f\xa6\x76\x04", 213, { 0x37, 0x38, 0x31, 0xd8, 0xd3, 0x34, 0x29, 0xd8, 0x76, 0x1a, 0x81, 0x13, 0x50, 0x27, 0xd2, 0xf5 }, { 0x12, 0xe8, 0x35, 0x95, 0xaf, 0xd0, 0x46, 0x9c, 0x12, 0xe8, 0x35, 0x95, 0xaf, 0xd0, 0x46, 0x9c } }, { "\xdc\x4d\x18\xfd\xc9\x68\x4e\x52\x14\x20\xa1\x65\xe9\x76\x90\xee\x3e\xfc\x34\xd6\x8f\x08\x97\xe3\x9b\x60\x75\xbf\x30\x61\x2e\x75\xd6\xfb\xfd\x84\x91\x9c\x33\xe2\x4c\x07\xbb\x52\xa2\xfd\x8c\x33\x49\xb3\x22\xbe\x93\x33\x2a\xec\xc9\xd7\x64\xbe\x34\x27\xd8\x6d\xc6\xc2\xfa\x16\x09\xa4\x64\x31\x96\x17\x43\x94\x5a\xce\xa4\x75\x72\x11\x5c\x75\xf2\x16\xd3\x6a\x1f\x42\x3a\x2a\xe3\x59\xd5\xb9\xa2\x26\x4e\x57\x53\x3c\x28\x5c\xb7\x63\xb5\xeb\xc5\x5c\xc6\x67\xb6\xcb\xbd\x63\x9a\x80\x07\x11\x8c\x3f\x0a\x28\x3d\x8f\xae\xa2\xa4\x24\xf4\x6e\x27\x24\x73\x05\xd5\x4b\x4d\x8b\x3e\xe2\x92\x3c\xb7\x5b\x1c\x35\xa5\x5f\x2b\x0c\x8a\x6b\x73\x16\x70\x30\x3b\xcb\x4f\x69\x40\x17\x1d\xbe\x3c\xd8\x73\xd2\xfe\xbb\xe0\x0f\x48\x39\x84\xb5\x80\xb0\xfc\x30\x76\xc5\x84\x20\xfa\xc5\x31\x59\x93\x60\xa4\x52\xab\x67\x82\xca\xac\x5f\xe9\xa3\x7e\xe2\x81\xec\xdd\x12\xea\x3d\x1b\xd4\xcd\x86", 214, { 0x39, 0xc8, 0x4f, 0x25, 0x1c, 0x7a, 0xc5, 0x3e, 0xe3, 0xbf, 0xce, 0xab, 0x55, 0x47, 0xce, 0xf0 }, { 0xdd, 0x76, 0xa7, 0x62, 0x1b, 0xc1, 0xac, 0xe0, 0xdd, 0x76, 0xa7, 0x62, 0x1b, 0xc1, 0xac, 0xe0 } }, { "\x28\x93\x6b\x79\x63\x8f\x60\x3b\x56\x3e\xdf\x68\xc5\xa1\x29\x5b\x1a\xec\xb2\x65\x70\x51\xb5\xb2\xc3\x48\x1c\x0a\x7f\x78\xa7\x23\x52\x9a\xa4\xae\x81\x17\xe3\x04\xd3\xfc\x75\x85\x7a\xfd\xaa\xc3\xd5\xb9\x62\xaa\x31\x29\x36\x4e\x2f\xdd\x6c\x4b\x72\x10\x5b\xb6\x5c\xb2\x20\x21\xae\x1d\x7c\xb3\x94\xe0\xdd\x4a\x5a\xe2\xd4\xad\x57\xa3\x6c\x0a\xc0\x3c\xf0\x6a\x83\x7d\x7c\x67\x50\x81\xa3\xa1\x7b\x3f\x4c\xb0\x01\x6a\xb0\xf2\x30\x55\x9f\xd0\x8d\x17\xe7\xa3\xa9\xe1\xde\x53\x8d\x9f\xb9\x31\x29\xb9\xd2\xf7\x40\x03\xeb\x67\xe6\xd2\x54\x32\xa5\x25\x66\xa8\xb3\x2d\x21\x27\xdd\x18\x2d\x4a\x3d\x9c\x8a\x13\xd1\x60\x26\xc0\x5e\x9c\xe1\xe8\xc1\x7c\x04\x3c\x75\xbd\x26\x84\x5e\xc4\xa8\xcc\x5d\xec\xe5\xde\x35\xc2\xb0\xce\x0f\xea\xdf\xb8\xe3\x64\x67\xc4\xf3\x0f\x23\x2f\x95\x64\xe2\x00\x87\x28\xf0\x53\x90\xd6\xfe\xb7\xd6\x6e\x91\x71\x1e\x9c\x4a\xcc\x1a\x4c\x4b\x98\x06\xfa\x13", 215, { 0xa6, 0x58, 0xbd, 0x4a, 0x1d, 0x08, 0x84, 0x68, 0x2f, 0x78, 0x55, 0xd3, 0x4e, 0x1c, 0xe2, 0x3e }, { 0x80, 0x0f, 0x12, 0x7f, 0xcb, 0x86, 0x9a, 0x6e, 0x80, 0x0f, 0x12, 0x7f, 0xcb, 0x86, 0x9a, 0x6e } }, { "\x7f\x03\x83\x7e\x98\x09\xd3\x31\x60\xa2\x78\xce\x13\xb2\x30\x18\x5d\xf3\x3f\x90\x12\x14\x7d\xdb\x62\x01\x5f\x09\x14\xce\x15\x7c\x9b\x42\xf3\x77\x54\x3a\x1a\x92\x1e\xe6\x32\xc1\xb0\x8b\xba\x23\xd5\xf8\x1c\x16\x7a\xf4\x1f\x2f\x8a\x98\xf6\xb3\xa7\x56\x3f\x47\xe3\x6a\xc2\xd2\x04\x2e\x9c\x1a\x54\x37\x88\xa4\x54\x70\x5c\x85\x3a\xaa\x30\x10\x27\xf7\x08\x8e\xaa\x46\xfb\x84\xfa\xb4\x92\xb6\xc9\xac\x0d\x43\xe3\x91\xe4\xa7\xef\x94\xff\x78\xed\x15\x43\x16\x00\x86\x82\xf0\xdb\xa9\x8b\x80\x2a\x77\xb1\xa0\xe4\x52\xfd\xa2\x7b\x4b\x5f\x90\x8b\xcc\xcb\x38\x28\xd0\xa5\xb0\xe1\x65\xf9\x86\x61\xcb\xf6\xcb\x83\x45\x15\x3c\x34\x13\x47\x43\xf0\x81\xf7\x85\xcc\x9c\x47\x27\x66\x97\x3b\x51\x4a\x88\xc0\xa4\x66\xc7\xf9\x7c\x03\x37\xd6\xb2\xab\x3b\xab\x5f\x42\x5c\x7c\x42\x15\x9f\x8f\x08\x35\xa3\xb3\xc5\xc5\xe3\xb1\xd2\xea\x15\xf0\x11\x4a\x36\x78\x4e\x7f\xf8\x6a\x37\x87\xd2\x67\x39", 216, { 0xb6, 0xb6, 0xc1, 0x98, 0x0e, 0xf0, 0x0b, 0x4c, 0x03, 0x06, 0xdd, 0x86, 0xba, 0xc4, 0xa2, 0x93 }, { 0xcc, 0x8c, 0xef, 0xc9, 0x58, 0x28, 0x9d, 0xa8, 0xcc, 0x8c, 0xef, 0xc9, 0x58, 0x28, 0x9d, 0xa8 } }, { "\xb3\xa8\xf4\x49\x6d\xcc\xc0\x22\xb3\x82\x19\x0c\xd3\x62\xd5\x02\x71\x84\xa2\x74\x70\xca\x7d\x95\xce\x5d\xa5\x7e\x8e\x21\xd3\xaf\xed\x8a\xb5\x04\x5c\xe2\x9d\x89\x5e\xda\x50\xa6\xad\x06\xf2\x45\xeb\x51\x83\x70\xad\x14\x0f\x4f\x4f\x77\x39\x00\xf8\xcf\xf3\xd4\x1d\x45\x32\x38\xcd\xbf\x09\x4c\xa8\x85\x95\xa9\x9e\xbf\xe2\xd6\xdb\x27\xae\xf0\x5d\x50\x71\xde\xee\x80\x9a\xfd\xc7\x93\x25\xd2\x26\xe8\x79\xc3\xc6\x6f\x38\xaf\xcd\x48\x2f\x57\x5b\xa9\x1a\x5d\xae\x26\x7a\xcc\x1d\xa9\xc5\x1c\x31\xdf\x2b\xa2\x2a\x18\x3e\x6f\xdb\xa0\xa7\x01\xef\x36\xb5\x78\xb2\xf7\x43\x69\x7b\x96\x8c\x1b\x9a\xbd\xfe\x89\xb8\x96\x46\xeb\x23\xc7\x22\x6a\x2e\x6d\x11\xe0\x3e\x25\xfe\x41\xf2\xc2\xa6\x90\xbb\x5f\x3e\x6c\x80\xd1\xa4\x57\xc1\xb4\x13\xca\x36\x65\xa5\xf3\xb9\x72\x92\x4d\xbc\x97\xc4\xe0\xc8\x87\x29\x6f\xad\xd9\x0a\x5a\x77\xa2\x8c\xa5\xe0\x4d\x13\xd2\xb4\xc8\x8b\x1c\xd6\x84\x28\x49\x20", 217, { 0x97, 0xbc, 0xdc, 0x33, 0x32, 0x46, 0x32, 0x32, 0x43, 0x56, 0x50, 0xce, 0xa6, 0x19, 0xf3, 0xfe }, { 0x62, 0x5c, 0x0a, 0xff, 0x34, 0x30, 0x66, 0x57, 0x62, 0x5c, 0x0a, 0xff, 0x34, 0x30, 0x66, 0x57 } }, { "\x08\x90\xa2\x11\x86\x21\xb1\x4a\x89\x52\xb2\x69\x3c\xa4\x7e\xe1\x71\x56\x6f\x51\x0f\x89\x1b\x95\x39\x2d\x66\x23\x06\x09\xcf\x98\xb5\xf0\x87\x82\x7f\x82\x31\x72\xfa\x7c\x19\x75\xf6\x45\xf4\x93\x1c\xa9\xb7\x49\x42\x5f\x98\xa9\x3f\x93\x35\xe6\xa5\xe1\x40\x86\xda\xae\x5d\x9c\xf6\x63\xb3\x84\x7d\x58\x4f\x0c\x9f\xc0\xcb\x4d\xa6\x3d\x4a\xfd\x1e\x5c\x16\x4f\x9e\x90\xcc\x8f\xdb\x81\x8c\xb2\x58\x8c\x0d\x85\x5e\x8c\xbe\x9e\x40\x61\xaf\x38\xb4\xd8\x7b\x4f\x6e\xfc\x61\x95\xce\xf2\x22\x1a\x67\xfe\x39\x7b\xc1\x34\x71\x18\xad\x39\xb8\x64\x59\xc9\x2e\xd4\x4e\xbd\x46\x2c\x89\x56\x00\x77\x4c\xd6\x08\xfa\x86\x1b\x91\x00\x56\xaf\x4c\xdd\xa9\x9d\xe6\xf0\xd7\x68\x27\xac\xcb\x68\x44\xf8\x8c\x70\xfe\xcc\xfc\x9f\x81\xa7\x98\xd2\x37\x03\xa0\x6e\xe0\x07\x3d\x58\x34\x09\x2f\xac\x26\xa0\x87\x96\xd1\x3b\xed\xec\x0b\x0a\xd3\x6e\x18\x68\x89\x4a\xe0\xf2\xc1\x76\x40\x69\xd2\xf8\xe6\xd6\x7b\x01", 218, { 0x26, 0x73, 0x15, 0x7b, 0xbd, 0x4d, 0xd2, 0x3b, 0x52, 0x24, 0xac, 0xcb, 0xdb, 0xa2, 0xb4, 0x85 }, { 0x42, 0x6a, 0xbb, 0xc6, 0x57, 0xcd, 0x21, 0xdf, 0x42, 0x6a, 0xbb, 0xc6, 0x57, 0xcd, 0x21, 0xdf } }, { "\x1d\xf8\x02\xc9\x98\x06\x10\x7f\x28\x21\xb5\x6a\x2f\x97\x4a\x35\x51\x13\xeb\xb1\x95\xe5\x77\xa4\x54\x54\x4c\x6a\x41\x72\xf5\x0b\x55\x64\x4a\x6a\xb0\x66\xb4\x54\xdc\x4a\x71\xff\x93\xed\xd8\x79\x69\xeb\x4f\xde\x93\xbc\x87\x19\x9b\x7e\xc1\x1c\xcc\x69\x65\x23\xd5\xc7\xd2\x80\x3a\x32\x3d\x6b\x5e\xbd\xcd\x84\x15\x8f\x2d\xdc\xc6\xdf\x4f\x55\x42\x15\x6b\x91\x9e\x5f\xfe\x53\x0b\x11\x78\x50\x1f\xe0\x97\x12\x0b\xee\x71\xe3\xb8\x48\x88\xb6\x17\x6d\x55\x9a\x31\xc7\x07\xdc\x63\x66\x86\xe0\xda\xc2\x82\x61\x74\x44\xf5\xf8\xa9\xa0\xb5\x74\x45\xff\xe3\x92\x59\xfc\xa4\xaf\x9a\xf6\xf9\x60\xaf\xde\xa5\xaa\xc3\x5d\xcd\xbf\xfc\x94\x53\xd5\x5d\x6a\x83\xe1\x3a\xa2\x2d\xbe\x39\x0d\x14\xe9\x0f\xe4\x52\x8a\x66\x23\x5f\x9a\x37\xf2\x2c\xee\x50\x62\x22\x07\x9e\xf5\x9d\x4c\xaf\xae\x92\xae\x7c\x38\xc2\x83\xe2\x0e\xa2\xd4\xf1\xae\xca\x29\x50\x3f\x35\x8c\x1b\xb7\x29\xdb\xbd\x11\x3d\x9a\xdc\x58\x7e", 219, { 0xf8, 0xf6, 0xd7, 0x27, 0xb4, 0x06, 0x41, 0xbf, 0xb5, 0x85, 0xcd, 0x36, 0x96, 0x1f, 0x60, 0x2c }, { 0x80, 0x8a, 0x36, 0x5b, 0x06, 0x36, 0x75, 0x0e, 0x80, 0x8a, 0x36, 0x5b, 0x06, 0x36, 0x75, 0x0e } }, { "\x26\x5e\xf8\xf7\x70\xd3\xc9\x13\x9f\xfe\xc8\x6d\xe8\xce\x2b\x3a\xf7\x32\x7b\x64\x3f\xaf\xa0\xeb\x1a\x10\x44\x0a\x7b\x92\xd5\xea\xe7\x21\x9d\x36\x88\xff\xb3\xf2\xc7\xa9\x5f\x9d\x1e\x80\xb5\xe1\x4f\xc3\x66\xaa\x91\x98\xa7\xf3\xb8\xe8\x69\x9d\x1a\x76\x96\x36\xcc\x11\x01\x4d\xa5\x1e\x90\x7e\x92\xca\xd9\x3f\xdb\x0a\x9e\xe9\x22\x44\x9c\x91\x45\x79\x1f\x95\xbd\xbe\xd0\x35\xd9\xd2\x25\x74\x9e\xad\xb0\x15\xc4\xc7\x5e\xa5\xbe\x5a\x35\x2c\x2d\x0a\x4c\x8e\xf3\xf8\x99\x47\x42\x87\x17\xd5\x33\xf5\x9e\xd0\xef\xec\x34\xf8\x7c\xe2\x0f\x6e\x3d\x31\xec\xa8\x41\x9e\x71\xdf\x68\x12\x6d\xd4\xf8\x46\xf0\xa8\xf2\x41\x6f\xf5\xfe\xfb\xca\xb2\x43\x73\xbb\xdc\xd9\x1a\x17\xb1\x52\x67\xbb\xc3\x09\xb8\x91\xe7\x57\x9e\xfe\xd5\x9f\x59\xdd\x1a\x96\x4e\x06\xc7\xd0\x1c\xcf\x53\xaa\x8f\x24\x48\x83\x4f\x59\x46\x38\x86\xb4\x08\x74\x14\x8d\x78\x76\x53\x61\x55\x1a\x44\xe6\xf0\x36\xd4\x11\x7c\xc4\x47\xbb\xa8", 220, { 0x47, 0xce, 0x0b, 0x67, 0x8a, 0x9a, 0x81, 0x09, 0xcb, 0xd9, 0xb7, 0x6f, 0x4d, 0x42, 0x49, 0x98 }, { 0x08, 0xc8, 0x40, 0xde, 0x0f, 0x17, 0xd4, 0x27, 0x08, 0xc8, 0x40, 0xde, 0x0f, 0x17, 0xd4, 0x27 } }, { "\x4d\x5b\xf6\x3f\xe0\x51\xcd\x35\x6c\x53\xa1\x3c\xf2\xf6\xcc\x4d\xf6\x92\xb6\x16\x6f\xc7\x1b\x0b\x6a\x76\x0b\xd1\x4b\x5f\x8f\x1c\xfb\xc3\xfe\xf3\xd8\x90\x42\x65\x48\xc8\xbd\xcd\x89\x22\x1c\x08\x3c\x74\xa6\x76\xb7\xaf\x61\xc6\xf4\x81\x9c\x5e\x31\x08\x82\xc5\x9e\x47\x48\x93\x30\x68\xbe\xd2\x80\xd9\x81\x76\xca\x90\x3c\xd5\x19\x40\xf3\x50\x10\xe4\xae\x82\x34\x91\x74\x1d\x8d\xa9\x68\x10\xf3\x58\xd1\x4f\xad\x3f\x4e\x9d\x2e\x81\x88\x79\xcf\x7f\xa6\x72\xce\xc0\xdf\xbe\x6f\xf0\x5f\x36\x1b\xfd\x7a\x9f\x42\x79\xe9\x9d\xf8\xd6\xc8\x71\xdb\x4c\x09\x91\x14\xa8\x9e\x57\x5b\xe6\x96\x66\x64\xd5\x89\xbd\x81\xdc\x40\x7a\xe4\xf6\xc9\x56\x6a\xce\x36\x23\xfc\x85\x77\x08\x07\xfc\x16\xa6\x56\x3f\xbb\xd7\xe2\x2c\x13\xae\xac\xa1\xc2\x53\xfb\x13\xa2\x1a\x24\x9f\xc5\x96\xbe\x3c\xfd\xb8\x55\xdf\x06\xce\x96\xcd\x52\xe9\xe4\x59\x81\x8b\x6c\x9f\xfe\xba\xa9\x8a\x3a\x94\x32\x11\x6b\x57\xb3\xb7\x1c\x0a\xcc", 221, { 0xae, 0xac, 0x87, 0xf5, 0x0c, 0x04, 0xea, 0x14, 0x8a, 0x90, 0x0b, 0x60, 0x65, 0x29, 0x9a, 0xed }, { 0x6a, 0xe6, 0xaf, 0x3f, 0x81, 0x33, 0xf6, 0x44, 0x6a, 0xe6, 0xaf, 0x3f, 0x81, 0x33, 0xf6, 0x44 } }, { "\x05\x84\xd9\x8d\x21\x6d\xe5\x23\x6c\x99\x13\xa2\x4c\x63\xba\x50\x4c\x60\xfc\x18\x9d\x2e\xb8\x6b\xf5\xcb\x2a\x56\xbb\x44\x1d\xd0\x8a\xaf\xec\xe3\x6a\x93\xbb\x97\x41\x68\x68\xdb\xbd\xa4\x0a\x26\x53\x8e\xf1\x85\x80\xa6\x54\xc7\x8e\x9b\x7d\x03\x66\xbf\x06\x47\x3c\xc5\x57\xa5\xb3\x36\xdc\xf7\x56\xac\xb8\x9e\xe4\x14\xf8\x63\x24\x63\xdf\x44\xc8\x48\x18\x4e\x2b\xbb\x85\xf3\x9f\xf7\xfd\x70\x57\x8c\xb5\x24\x71\x2c\xca\xbd\x4a\xaa\x12\x57\xe4\x7a\xe4\xda\x47\x9e\xc6\xeb\x09\x4b\xd9\xab\x39\x71\xa4\x43\xcc\x72\xc0\xa9\x63\xbd\x0e\xee\x8b\xf7\x22\x0e\xc0\xf3\x7c\x41\x51\xc1\x48\x32\x5d\x37\x83\x0f\xb4\x88\x4c\x7c\x64\x6f\x35\xa1\xb8\xc6\xe2\x76\xac\xa2\x58\x52\x77\x8c\x58\xb9\x21\x59\x69\xd5\x73\x74\xc3\x27\xaf\x1d\x6e\x81\x41\xf0\x09\x3d\xeb\xed\xa0\x75\xd3\x9e\xc8\x1c\xfe\xa8\x06\x60\x1b\xb0\xba\x46\x4e\xa8\x99\x83\xf8\xea\x3d\xa3\xfc\x97\x4b\x91\xde\x4c\xc5\x42\xdd\x19\xee\xec\x24\x77", 222, { 0x2f, 0xa0, 0x06, 0xef, 0xa2, 0x2c, 0x2d, 0xe9, 0x26, 0x73, 0x5b, 0x5f, 0xf7, 0xc1, 0x43, 0x5c }, { 0x44, 0x98, 0x8a, 0x21, 0x95, 0x3a, 0xd5, 0x13, 0x44, 0x98, 0x8a, 0x21, 0x95, 0x3a, 0xd5, 0x13 } }, { "\x12\xbf\xc8\x64\x86\x35\xd6\x60\x43\x73\x71\x4b\xb4\x29\x6b\x15\xcd\x5b\x33\xc9\x5a\x8a\x81\xe9\xa5\xf6\x25\x5b\x5a\xbd\x80\xee\x1a\xec\x1b\x01\x89\x66\x53\x9c\x4d\x25\x54\xa9\x08\xe8\x5d\x27\xfa\x2b\x49\x16\xae\x32\x31\xfd\x1c\xe5\x8a\x5c\x4a\x3a\x74\xe4\x2c\x1b\xa2\x8c\x71\x4f\xbf\x43\xa7\xd4\x59\x5b\x86\xf3\xbd\x0b\x30\xc8\xa1\xcf\x18\x8a\xf6\xae\x8d\xd6\x24\xe0\x6f\x79\x3d\x54\x4e\xb8\x42\x06\xef\xf0\x1f\xa7\x36\xe6\xe0\x1a\x7d\x16\xef\x42\x23\xa4\x00\xcb\x0f\xd7\xb6\x20\xd9\x7c\x92\x7a\xfe\xda\x9e\x7c\xed\x0d\xa0\x7f\xdc\xfe\xf0\x0e\x66\xf3\x48\xbd\x04\xe6\x55\xac\x73\x23\x6f\xb5\xbb\xd1\x7f\x23\xf2\x12\xb9\x42\xe9\x60\x6c\x2c\x18\xcb\x5f\x60\x91\xc7\x82\xf4\x8d\xed\x67\x74\xaf\x71\x74\xb3\xd9\x6a\xda\x4e\xc0\xd3\x70\x04\x27\x3d\x28\xa1\xd8\x28\x7d\x35\x5c\x50\x01\x7c\x9d\xe8\x46\xc1\x21\x60\x9b\x92\xee\xbc\xd3\x7e\x88\xb6\xfa\x07\x3c\xba\x46\xee\xb3\x0b\xb8\x58\x3a\xe0\xa5", 223, { 0x4e, 0x54, 0xab, 0xd3, 0x1c, 0x89, 0xbd, 0xd9, 0xad, 0x12, 0x65, 0x02, 0x2b, 0x04, 0x97, 0xa1 }, { 0x8d, 0xde, 0xb6, 0x05, 0xcd, 0x2c, 0xc9, 0x60, 0x8d, 0xde, 0xb6, 0x05, 0xcd, 0x2c, 0xc9, 0x60 } }, { "\x9c\xc0\xcd\x97\x15\x01\x0f\xbd\x19\x8d\x85\xaf\x58\xea\x2d\x20\xe8\xd3\xfd\x74\x95\x0a\xba\x58\x09\x52\x4b\x2f\x03\x5a\x19\xc5\xe5\x44\xe3\xee\xa8\x88\x37\x94\x73\x37\x3a\x77\x6a\x88\xe4\xa1\x40\xf4\x07\x8e\x9c\x28\x7c\xfd\x83\xd3\x3a\x19\xa3\x3f\x50\xdb\xa3\x5c\x0e\x6e\xcf\x13\x18\x9e\xca\x51\x99\xab\x06\x5e\xe1\x92\x01\x85\x3e\xc0\x3b\x60\xd7\x61\xa8\x01\x7e\xc4\x32\x30\xea\x77\x4e\x7d\x88\xb6\xd7\x07\x6c\x9c\xdd\x72\x43\x02\x14\x5d\x58\x25\xfb\xe8\xb3\xd3\xd5\x6b\x8a\x40\xea\x13\x61\xb1\x96\x43\x27\x2b\x6c\x25\xd0\x47\x7a\x59\x56\x8d\x75\x9a\xff\xad\x24\x54\x16\xe1\x61\x20\xd1\x59\x9d\xa2\x53\x75\x5a\x72\x6b\xbf\x6c\xc0\x97\xb9\xb3\xcf\x9e\xbc\x3b\x0c\x68\x11\x3d\xc0\x0e\xb9\xe1\xfb\x7d\x19\x44\x90\xf5\x32\xcc\x92\x7a\x64\x96\x9c\xd8\x4e\xc3\xd6\x61\x00\xac\x39\x44\x98\x5b\x27\xab\xbb\x18\xa1\x26\x04\x91\xa1\xe4\xb0\xe3\x31\xfb\x19\x7e\xb7\xa0\x5d\xb8\x88\xe0\xf9\xaf\x19\xc3\x3d", 224, { 0xfb, 0x75, 0xc2, 0x4f, 0x1f, 0xd2, 0x57, 0x14, 0x57, 0x01, 0xee, 0xac, 0xd1, 0x77, 0x2a, 0x86 }, { 0x34, 0x98, 0x36, 0x4b, 0x45, 0x85, 0x86, 0x4d, 0x34, 0x98, 0x36, 0x4b, 0x45, 0x85, 0x86, 0x4d } }, { "\x58\xba\xa8\xc4\x5f\x74\x48\x60\xf7\x28\x4e\xd3\x3c\xcf\xf7\x57\x36\xfc\x75\x91\xc6\x4e\x93\x58\xeb\xc3\xbe\x24\x9b\x43\xa2\x4a\x5a\x2e\x44\x4d\x41\x44\xbe\xd6\x07\x57\xb8\xe4\xdb\xc5\x64\x7d\x55\xec\x4a\xf2\xad\x65\xdb\x7f\xcc\xfa\xa0\x62\x67\xf8\x94\x21\x3d\xc6\x98\x8e\x0c\x0c\xee\xe5\x3c\xab\x88\x31\xb4\x7f\xc6\x99\x04\x48\xfc\x93\xf5\x83\x09\xa0\xe5\x54\x7d\x96\x78\xfa\xb2\x2f\x38\x39\xae\x9c\x25\x8d\x5a\xaa\x60\x88\x8f\x99\x6d\xde\x35\xfd\x8b\x63\x02\xb4\x81\xef\x99\xe7\xdf\x1b\xf4\xad\x42\xc7\x4f\x76\xda\x0c\xa2\x64\x3c\x6d\x4f\x89\xe2\x3d\x98\xe3\x6b\x03\x9b\xf5\x5f\xb8\x4c\xdf\xbe\x89\xe9\x98\xca\xf1\xbd\xdc\xb8\xef\x6f\xf4\xa8\xad\xb6\xbf\x33\xc4\xf0\x2a\xcf\x61\xc3\x71\x09\xd6\x18\x41\xae\xd8\x72\x19\xe7\xa0\xfe\x3b\x5d\x03\x4a\x67\x15\x83\x20\xf2\x47\xe8\x73\xc5\xa2\x15\xfb\xc9\x6a\x49\xaa\x15\x3f\x6a\x63\xce\xb4\x87\x87\xb6\x5a\x61\xef\x01\x2a\x7f\x25\x8d\xd1\x05\xfe\x2f\xc2", 225, { 0xba, 0xba, 0xf5, 0x0c, 0x38, 0xf4, 0x1e, 0x29, 0xcd, 0x39, 0x31, 0x5e, 0x72, 0xd5, 0x46, 0x2f }, { 0x0a, 0x3e, 0xdf, 0x15, 0x45, 0xf5, 0xa3, 0x38, 0x0a, 0x3e, 0xdf, 0x15, 0x45, 0xf5, 0xa3, 0x38 } }, { "\x17\x03\xf0\x87\x53\x7d\x89\xf6\x56\x7c\xf6\x34\x38\xab\x76\xef\x94\x4c\xed\x2f\xed\x41\x4a\x3c\x0f\xab\xae\xe1\x2b\xe4\x3c\xb8\x91\xaf\xee\x5a\x36\xd0\x90\xbd\x9f\x48\xee\x3f\x1a\xb1\x63\xa6\x64\x53\x95\x16\xfc\xae\x99\x02\x3d\xf7\x8a\x0b\x56\x9f\xe7\xa5\x3f\xf0\xb8\xdc\xa6\xe9\x78\xed\x4c\xaf\x5b\x95\x86\xf5\x6e\xe8\xcb\x6b\xd9\x06\xc2\x61\xe4\xb1\x55\x5b\xdc\x8f\x3c\xdb\x4e\xd7\x24\xfe\x30\x9a\x7d\x27\xc3\x51\x69\x34\x60\xa3\x0e\xf3\xdd\x97\x15\x0e\xb6\xa9\x8d\x5c\xeb\x36\x45\x2c\x51\x75\xf6\xae\xa9\x72\xed\x4d\xd2\x73\x4c\x3e\xd2\xc4\x0d\x4c\x35\xbe\xbd\x1c\x93\x59\xfd\x69\x7e\xdf\x10\x52\xab\xad\xe5\xb2\x70\xd1\xa8\xb5\x69\x7e\xea\x7d\xd5\xd9\xf9\xf4\xfd\xf5\xc5\xb7\xd7\xb4\xeb\x95\x7c\xc6\x00\xbb\xdc\x31\xb0\x1b\xa5\x55\xf7\x68\xf1\x6a\xec\x7a\x03\x04\x81\x9c\x44\xaf\xed\xa9\x1e\xfb\x4d\x64\x08\x6f\x4f\xb8\xaa\x35\x24\x2d\xae\x3c\x1c\x25\x53\xb6\xd9\x7d\x1d\xe6\xf5\x2c\x86\x1b\xa5\x0b", 226, { 0x60, 0x37, 0x98, 0xca, 0x57, 0xe0, 0x5e, 0xd1, 0x6e, 0xc6, 0xbd, 0x58, 0x2a, 0x63, 0x49, 0x63 }, { 0x5f, 0x80, 0x78, 0xc8, 0x1d, 0xd4, 0x55, 0x78, 0x5f, 0x80, 0x78, 0xc8, 0x1d, 0xd4, 0x55, 0x78 } }, { "\x81\x48\x91\x9a\x76\x88\x82\xcf\x3a\xf9\xbb\x5e\x4f\x3c\x4d\x7f\x05\xde\x33\x06\x23\x5b\x9e\xbe\x3f\x3a\xa8\xef\x8e\x08\xa1\xde\x69\x89\x70\xd9\x20\x8a\x5a\xda\xf4\x68\xb9\x4e\x20\xce\xb0\xf0\x64\x51\xf8\x11\x83\x08\xfe\xb5\x80\xc7\xae\xad\x5f\xf0\xfe\x32\x6e\x99\x2d\x38\x9e\x72\x3d\xe9\x65\xa8\xa8\x55\x2f\x8d\x51\x49\x9e\x72\x2a\x3c\x9d\x9c\x95\x8a\xc0\x8e\xbc\x11\x54\x53\x1f\x2a\xfe\x27\x71\xec\x0f\x52\x17\x63\xf0\xba\xb0\x35\x9d\xb9\x3f\xda\x9f\x27\x6a\x35\xda\x1b\x1d\xe7\x71\xf8\xc0\x39\x4c\xe6\x72\x1d\x15\x61\x6b\xc4\x38\x88\x05\xa4\x58\x5a\x5a\x21\xd1\x79\x00\x8c\xc9\x1c\xb8\xde\x29\xe7\x49\x27\x42\xe3\xc9\xc9\x03\x31\xa9\xc2\x10\x19\x0c\xf8\x8a\x60\xdc\xd6\x2e\x53\xb8\xd0\xed\xa1\x48\xc6\x28\xe8\x53\xaa\xce\x17\xb4\x73\x79\x03\x16\x0c\x43\x2f\xc1\x4a\x27\x8c\x03\xb3\xf4\xa4\xb3\x8a\x7b\x95\xec\x66\x68\x7e\x53\x4c\x26\xfc\xb8\xbe\xa4\x53\x83\x3d\x7d\x79\x9f\x8d\xfb\x7d\xb0\xc6\x26\xaf\x2f", 227, { 0xc7, 0x29, 0x70, 0x84, 0xf3, 0x9a, 0xea, 0xe9, 0x8e, 0x1d, 0x28, 0x99, 0xcf, 0x23, 0x7e, 0x5b }, { 0x52, 0x45, 0x1d, 0x7e, 0x33, 0x34, 0x3f, 0x2e, 0x52, 0x45, 0x1d, 0x7e, 0x33, 0x34, 0x3f, 0x2e } }, { "\x4e\x79\x3d\xaf\x97\xb3\xdc\x14\xd2\x8d\x6f\x7d\xee\x50\x4f\xad\xa1\x57\x32\x9f\x5f\xf0\x60\xc7\x19\x8d\xf0\x40\xff\xe7\x4d\x69\xc7\x23\xd7\x63\xd3\x83\xd7\x87\x87\x78\x44\x5d\x0d\xe4\x46\xce\xbd\x6a\x5e\x14\x0c\xf8\x23\xf0\x28\x29\x53\x6a\x03\xee\x9d\xa6\x2a\xbd\xc4\xfe\x45\x9f\x7b\x7a\x92\x3f\xf1\xc7\xe5\xf0\xf6\xb0\x2a\x0e\xa4\x9c\x8e\x98\x16\x64\x3c\x32\x0c\x3a\xab\x04\xbc\xc6\xa8\xfd\x78\xf6\xb5\x1a\x14\x5c\x87\x3f\xf5\xe8\xf7\x4c\x00\x62\xe7\x3c\xd4\x1b\x65\xc3\x37\xb4\x29\x69\xaa\x7a\xea\xd3\x78\xe0\x20\x63\x60\xfd\x7d\x2b\xd6\x0d\x5d\x84\xb8\x82\x17\x39\xd6\x5c\x18\xd1\xcd\x0b\x09\xe9\xe0\x6d\x61\x5e\x0d\xb5\xb8\x65\x03\x85\xdd\x85\x90\x65\xe9\x2c\x18\xcd\x87\x90\xd9\x57\x80\xd6\x59\xfa\x2a\xc9\xf8\x8a\xc1\xf5\xac\x4c\xfd\xa5\x45\xd6\x90\xce\x4e\xc0\x1a\x0a\xfc\x61\x46\xb5\xc7\x55\xf3\xf7\xda\xb7\xcd\xed\x2b\x30\x35\x31\xfe\xf4\xad\x5b\x83\xbd\x96\x37\xd7\x26\x4e\xfd\xae\xe8\x18\x1f\xbd\x0d", 228, { 0x38, 0xf3, 0x77, 0x24, 0xe5, 0xb3, 0x8b, 0x82, 0x53, 0xa1, 0xf7, 0xa7, 0xf1, 0xe8, 0x45, 0x96 }, { 0xcb, 0x41, 0x1d, 0x44, 0x0d, 0xb6, 0xf8, 0x81, 0xcb, 0x41, 0x1d, 0x44, 0x0d, 0xb6, 0xf8, 0x81 } }, { "\x7d\x6b\xf8\x5e\x18\xf7\x54\x49\xe5\xe6\x85\x0d\x3e\x43\x89\x63\x86\x38\xef\x9f\x2a\xb6\xa2\x53\x63\x6a\xc5\x82\x87\x79\xd8\x04\xbf\x0e\x9f\x31\x1a\x51\x5d\xe1\xe0\xc5\x9b\xe3\x80\xf1\xc5\xbc\x7f\xc3\x66\xe0\x20\xe0\x3b\xa1\x07\xc1\x03\xab\x79\xf8\x3f\xad\x30\xa1\xd8\x11\xea\xa8\x61\xe0\x59\x13\xc5\xc2\x7b\x5c\x0e\xc1\xb5\xde\xfe\xde\x38\xaf\x9a\x72\x12\xbe\xb2\x38\xb7\xac\x78\x66\x9b\x05\x6d\xa0\x2f\x89\x18\x76\xd1\xaa\x26\x69\x90\x5b\xe1\xeb\x17\xf3\x59\xe3\xd8\xc0\x60\x9c\x53\x52\xaa\x8d\x64\xe3\xaf\x6e\xf3\x44\x04\xdc\xb8\x9b\xa7\x07\xad\x15\x19\xe7\xf5\xa3\x58\x07\x3b\x96\xe4\xd4\x57\x53\xe4\xcd\x24\xe1\x1a\xb4\x18\xdc\x37\x27\x4f\x9e\x22\xc8\x6b\xfb\x4e\xfe\x0e\x5b\x06\x48\x4a\x42\xbe\x9f\x43\x35\x6c\x26\x67\xeb\x95\xd2\x70\xf2\x02\xbe\x2e\xf3\xa9\xdd\xb7\xcc\x10\xe8\x06\x6a\x57\xdc\x53\xc2\x81\xdd\x24\x33\x7d\x14\x88\x31\x24\x54\x9b\x70\x1e\x38\x43\x15\xc8\x24\x1d\x1d\xcf\x54\xa3\xf2\xd6\x9b\x75", 229, { 0x5c, 0xb5, 0x5e, 0x8a, 0xf7, 0xe0, 0xae, 0x81, 0xb7, 0x74, 0xe0, 0xcd, 0xcf, 0x61, 0xdd, 0x04 }, { 0x44, 0x0b, 0x66, 0x01, 0xf8, 0xad, 0x6c, 0x6c, 0x44, 0x0b, 0x66, 0x01, 0xf8, 0xad, 0x6c, 0x6c } }, { "\xae\x06\xe9\xe9\x35\xb2\xae\xae\xf7\x68\x16\xac\xa5\x7f\x91\x2d\xfa\x30\x22\x5a\x6d\x21\x30\x43\x68\xbc\x3c\xc9\xa2\x54\x6b\xe6\x59\x1f\x61\x7c\x5c\x8b\x56\x40\x1c\x45\x17\xa4\xee\x96\xe5\x57\xc8\x97\x8d\x3c\x11\xd9\x87\x8d\x7f\x47\xbc\xfa\x87\x1e\xd7\x90\xd8\x4a\x03\x30\xad\x13\x42\xff\x24\xac\x28\x31\xfa\x84\xb8\x39\x54\xb4\xdf\x17\xf5\x6a\x5a\x5e\x8f\x40\x4a\x9c\x39\xc0\x21\xbd\xbb\xf6\x38\x25\xa2\x04\x37\x2a\xfe\x9d\x64\xab\x30\xd4\xfe\xcc\x2a\x43\x67\x6b\xe3\xa2\x05\x5a\x4b\x28\xb4\xfb\x79\x42\x55\x6d\xb1\xe7\x96\xb1\x03\x1e\xce\xf1\x84\x44\xe7\x85\x7a\xb3\x9a\xdf\x4c\x13\x42\x6f\xfb\x97\xc0\x33\x00\x93\x15\xf1\xea\xc3\x72\xaf\x76\xaa\xc7\x67\x14\x7d\x21\xf7\x31\x5c\x91\xc4\xfd\x80\xac\xcc\x1a\x3b\x09\x4a\xe2\x1b\xf7\xf1\xcf\x66\xa7\x23\x3a\xa1\x01\x49\x72\x80\x7f\x0e\x50\xdb\xb7\xad\xf8\x77\x31\xe6\xf2\x5d\x95\xbf\x10\xbc\x62\xba\xa1\xcf\x19\x70\xd6\x17\x14\x8e\x4a\xd8\xfb\x5f\x48\x60\x07\x65\x2d\xa8", 230, { 0x9e, 0x3d, 0x6a, 0xba, 0x2e, 0x07, 0x5b, 0x35, 0x42, 0x0e, 0x0c, 0x41, 0xc4, 0xd8, 0xc3, 0xc2 }, { 0xcb, 0xf6, 0x4f, 0xf5, 0x52, 0x8c, 0xc5, 0x27, 0xcb, 0xf6, 0x4f, 0xf5, 0x52, 0x8c, 0xc5, 0x27 } }, { "\x90\x31\x03\x48\xc2\x8e\x00\xa9\xac\x56\xe8\x7d\x4b\x60\xe5\x72\x56\x37\x24\x1f\x0f\x1b\xce\xf9\xe2\x09\x2f\xbe\x65\x5c\xc6\x6d\xaf\x41\xae\x8f\x7b\xfa\xa9\x82\xe5\x45\x80\x62\x15\x40\xd8\x0d\xff\xed\xfc\x4c\xfa\x06\x5f\xe2\xc8\xc9\x3b\x1e\xaa\x28\xd3\x18\x91\xf2\x4d\xce\xb7\x74\x6d\x21\x68\x70\x01\x51\xf5\x4e\xb5\x38\x71\xf9\xfb\x3e\x9f\xa5\x54\x58\xc7\x55\x6b\x94\x8e\x8f\x10\xba\x63\x7a\x20\xe5\x75\xbb\x98\x12\xc4\x46\x0d\x75\xc6\x09\xbd\x4c\x46\xdb\xe9\xbd\xe4\x75\x33\xef\xa3\xb9\x68\xb2\x46\xe3\xb9\x1a\x50\x3f\xb0\x42\xa4\x58\x70\xd8\x88\x86\xc7\x6f\xaa\xc5\x0a\xdc\x17\x73\x05\xaf\xca\x2e\x86\x99\x0e\x9c\x16\xa8\xa4\xeb\xd5\xd9\xbb\x38\xa4\x78\x9e\x4a\x1b\x40\xa8\x2c\x38\x6b\x97\xe1\x04\xbd\x66\x43\x26\x2a\x3c\x68\x1c\x25\xcc\x1e\x73\x1b\x25\x1e\xfc\x7e\x92\x6c\x0b\x21\xde\x9f\x32\xf2\xfa\x4e\x0f\x4e\x88\x25\x56\x1c\xd9\x67\x5f\x62\xaf\xe8\x06\xda\xeb\x5a\x73\x83\xc4\xa4\xb8\x85\xae\x6e\xe0\x0b\xb0\xf1\xa6", 231, { 0x54, 0xc2, 0xb1, 0xeb, 0xbb, 0xe0, 0x19, 0x7c, 0x2a, 0x6b, 0xee, 0x0e, 0xdf, 0xdf, 0x7c, 0xf5 }, { 0xac, 0xbf, 0xed, 0xbd, 0x88, 0xa1, 0x24, 0x35, 0xac, 0xbf, 0xed, 0xbd, 0x88, 0xa1, 0x24, 0x35 } }, { "\x5c\x63\x13\x25\xb1\xf8\xb3\xeb\x77\x96\xe5\xa4\xc3\x2c\x91\x42\x34\x2d\x78\x51\x29\xbb\xcc\xdb\x3c\x15\xbb\xef\x5b\x48\xb2\xd8\xc0\x72\x91\x3d\xf4\x02\x41\xf0\x97\xa4\x8b\x08\xb6\x9a\xf7\xe3\xf7\xce\x20\x8b\x5b\x07\x27\x26\x7f\x7e\x35\x0c\xd9\x4d\x40\xc5\xd1\xad\x41\x5f\xa8\x38\x4f\x7a\x39\xbb\x5d\x5d\x57\x08\xa5\xcb\x35\x69\x75\x30\x4e\x11\x2c\xae\x9c\xff\x34\x97\xee\x00\x99\x93\xd4\xa1\xe0\x35\x3d\x1e\xc0\x5f\x9e\x19\xa3\x8d\x52\x32\x9e\xa1\xac\x7e\x05\x18\x49\x4a\xd4\xff\xb3\xb4\x2e\xe0\x56\x36\x31\xb4\x6b\xe3\x29\x6d\x09\x6b\x4d\x6a\x8d\x73\x21\x85\x30\x8c\x94\x69\xec\xa6\x74\x7b\x8b\x90\x08\x82\x4e\x8f\x37\x46\x0d\xca\xe8\xfd\x44\x96\x0f\xec\x5a\x67\x6a\x79\x12\x78\x5b\xe8\xf4\x78\xc2\xf3\x65\xb4\x50\x10\xd9\x12\x9f\xdc\xa4\x2e\x8a\x62\xe4\x08\xd3\x8c\xa9\xc8\x03\x3c\x43\x95\x2c\x47\xc1\xe8\x84\xdb\x1f\x48\x2b\xfc\xd5\x6a\xdc\xd3\x19\xf2\x73\x01\x68\xaf\xc6\x97\x3d\x35\xd0\x54\xaf\x44\xb8\xc2\x55\xa0\x8a\x24", 232, { 0x9b, 0x08, 0xe0, 0x81, 0xf7, 0x5f, 0x85, 0x56, 0x14, 0xb0, 0x46, 0xd7, 0xd6, 0x93, 0xe4, 0x41 }, { 0x23, 0x8c, 0x6d, 0x94, 0x41, 0x89, 0xe8, 0xdb, 0x23, 0x8c, 0x6d, 0x94, 0x41, 0x89, 0xe8, 0xdb } }, { "\xe9\x2d\x65\xe4\x17\x14\x5d\xc0\xb7\xdc\x5a\xf0\xf8\x81\xa2\x4e\xb0\x90\x86\x8b\x16\xf1\x57\x04\x78\xcf\x7a\x2e\xd7\xd3\x4b\x4d\xe8\xe3\x39\xa7\x7e\x77\x67\x02\xd2\xd0\x39\xcc\x8c\xa5\x00\x40\x76\xa5\x0b\xe3\x44\x2e\x6e\x19\xd9\xf3\x01\xab\xe2\x31\x62\xe9\x5b\xf8\x65\x1c\xa7\xc9\x71\x36\x03\xb1\x82\x00\xbb\x4e\x87\x41\x4b\xd6\x20\x74\xb7\xc0\xed\x4f\x4e\xb8\xac\xbb\x17\x89\xd9\xe5\xe2\xb3\x2b\xe4\x74\x01\xe8\xc8\x04\x1c\x75\x25\x98\xec\x7b\x3c\x5b\x8b\x36\x84\x96\x06\xd4\x91\xe8\x27\xea\x14\x2b\x50\xe3\x02\x39\x6a\x37\xf4\xd0\xf2\x4d\x4f\x79\xa0\x8c\x0e\xfe\x8e\xdb\xb5\x97\xec\x2d\x33\xb5\x6c\x50\x53\x4d\x72\x37\x22\x02\x41\x64\x17\xb9\xff\xbb\x0d\x8f\x91\xed\x8b\x0c\x67\xc9\xcb\x97\xb5\xf3\x65\xbf\xdd\xae\x60\x65\x8c\xd0\xdf\x27\xc3\xcf\xbf\xd0\x6e\x04\x79\xca\x9d\x23\x30\xc0\x8c\x57\xbe\xea\x28\x2e\x90\xd4\x82\x27\xd1\xa4\xca\x70\x57\xa7\xf2\x33\x04\xd7\x0f\x6e\xc1\x9f\xf3\xbd\xde\x79\x6f\x3b\xad\xa3\x35\x56\xb2\xef", 233, { 0xd1, 0x29, 0xd7, 0x66, 0xb4, 0xf9, 0xc8, 0x53, 0xd5, 0x69, 0x45, 0xcf, 0xb7, 0x5c, 0x01, 0x9a }, { 0x72, 0x33, 0x8b, 0xa6, 0xe1, 0x90, 0xed, 0x7d, 0x72, 0x33, 0x8b, 0xa6, 0xe1, 0x90, 0xed, 0x7d } }, { "\x56\xe5\xa7\x39\x9d\xfa\x29\x72\x7d\x2d\xb9\xf6\x73\xea\xd0\x61\x24\xb6\x00\x8f\xd7\x3b\xb4\xb2\xf6\x87\xce\xc3\x78\xaa\x0f\xca\x87\xd0\xb7\xfa\x78\xa7\xfd\x8b\x78\xc9\x28\x96\x17\x32\x2b\x8a\x22\x8e\x6e\x30\x5a\x24\xd7\x71\x7f\x14\xf5\x2b\xac\x4d\xd7\x35\x47\x12\x74\xd2\x5c\xd9\x57\x60\x0d\x63\x7d\x7a\x10\xce\xe8\x9a\x32\xa3\x65\x37\x43\xee\xe5\x71\x9f\x0a\x3c\x5c\x21\x8f\xc8\x0c\x91\x37\xef\x57\xde\xd3\x56\xc1\x15\xd8\x01\x87\x02\x1b\xef\x84\x99\x21\x75\x7f\x6b\xde\x13\x95\xb4\x5a\x68\x62\x47\xa1\x36\xd8\x5b\x83\xbe\x3f\xa2\x26\x53\x03\xc4\x39\x95\x2d\x3d\xfa\xc4\x85\xc9\xf0\xbb\xc6\x35\x54\xaf\x71\x5b\x6a\x05\x8d\x65\x58\x47\x85\xec\x69\xa7\x3e\x76\x07\x60\x33\x87\xcf\x20\xae\x27\x2f\x35\x03\xa5\x65\xc0\x81\x55\x6b\x7e\x54\xd2\xfa\x73\x5a\x93\x1b\x79\x12\x60\x46\x1a\x6e\x13\x48\x29\x91\xcb\x3b\xa3\x37\xab\x53\xed\x0c\xe4\x5c\x96\x16\xdf\xe5\xa5\x9a\x97\xdc\xb6\xee\x97\x21\xb1\xd1\xae\x27\x56\xbb\x5d\x68\x23\x8b\x24\x7b", 234, { 0x21, 0x31, 0x17, 0xdf, 0xe8, 0xee, 0x49, 0xf9, 0xfa, 0xe4, 0x6d, 0x52, 0xf7, 0x68, 0xf1, 0x33 }, { 0x28, 0x7a, 0x02, 0x21, 0x50, 0x03, 0x7a, 0xa1, 0x28, 0x7a, 0x02, 0x21, 0x50, 0x03, 0x7a, 0xa1 } }, { "\xd7\x1e\x9a\x2c\x8f\x91\x92\x20\x25\x3a\x64\x08\xbd\x7a\x43\x34\x12\xe6\x7f\x5f\x9e\x67\xc3\xff\xc2\x9f\x73\x86\xe9\xcb\x0c\x86\x35\x67\x06\xd3\xfd\x83\xf2\x1e\x2d\xf2\x11\x62\xda\x0e\x1c\xc0\xa3\x17\x63\xe6\x84\x12\xe6\xa4\xb8\x19\x62\x8d\xfc\x4e\x3c\x2a\x93\x59\x8b\x9e\x4c\xf5\x44\x29\xee\x41\x48\x22\xa4\x7b\xc1\x5d\xa4\xc4\x22\x2c\x2a\x57\xd5\xc6\xfa\xd2\x0d\xea\x9a\x08\x03\xbb\x49\x95\xa2\xbc\xa2\xa2\x67\x9b\x4f\xe8\x70\x47\x49\xe2\x7d\xe9\xca\x19\xa8\x38\xf9\xab\xed\xfb\x2c\x32\x5b\x68\xe0\xbf\x8a\x79\xa1\xc1\xe5\xbd\x91\x9e\x26\xc1\x22\x3f\x4c\xbc\x2f\x83\xb6\x47\x5c\xae\x32\xe5\xcc\xc9\xdd\x2f\xc6\x96\xe0\x40\xed\xfd\x41\x5c\x6b\x3d\x48\xfc\xdf\xe5\x06\x21\xaa\x72\x57\xb8\xdf\x1e\x97\xad\xfd\xae\xa7\xc2\x90\xcd\x83\x99\xa9\x82\xc7\xf4\x32\x82\xac\x04\xef\xe2\x3d\xfa\xd4\xe6\x33\xde\x6e\xe3\x16\xdd\x78\xa3\x59\xee\xbf\x3c\xae\x39\x27\x3a\xff\x6f\x0a\xb4\x0f\xc5\xa4\x3c\xf2\x59\x43\x10\x70\x8e\x0e\x33\x02\xef\x59\x12\x6a", 235, { 0xc6, 0x82, 0x09, 0x7f, 0x6b, 0x09, 0x44, 0xa2, 0xd5, 0xc2, 0x9b, 0x47, 0xa7, 0x82, 0x9e, 0xe7 }, { 0x7f, 0x96, 0xdf, 0xc3, 0x6c, 0xc5, 0xb0, 0x6f, 0x7f, 0x96, 0xdf, 0xc3, 0x6c, 0xc5, 0xb0, 0x6f } }, { "\x52\x77\xf5\xfd\x4b\xa7\x24\xba\x56\x04\x2c\xda\xaa\x3d\x4f\x64\x5f\x39\xab\x0c\xfb\x22\x7d\xa6\xaa\x62\x77\xc3\x5f\xa1\x9e\xa8\x10\x2c\xf5\x46\xbb\x7a\x12\x37\xd5\x89\x33\xa8\xf7\x33\x73\x6f\x3f\xc4\x5a\xef\xe4\x47\xfc\x47\x50\x54\x9d\x8c\x68\xa4\xe0\xe6\xf5\x83\x76\x5c\x1a\x1c\xb9\x19\xa2\x2d\x7e\xfc\x9e\x7f\x58\x31\x93\x33\xf6\x17\x12\x70\xe7\x97\x1c\x45\xb9\x49\xb8\x61\x49\x58\x76\xa3\x3a\x34\x24\x1c\x90\x4e\x71\xb8\x1d\x8d\x10\xc3\x42\xd7\xc6\xac\xcd\x1d\x21\x5f\x76\x63\xf7\xcb\xb7\xf2\x1a\xb8\xfc\xad\xf6\x12\x68\x4d\x41\x3b\x41\xb5\x4c\x5e\x02\xcb\xdd\xa1\xd6\xbb\x2f\x48\x11\x06\x8b\x71\x72\x7b\xd2\xe8\x79\x70\xa4\xeb\x47\x9c\x26\xaf\x03\xe6\x35\x2e\x86\x1f\xf8\xb8\x13\xda\xec\x5b\x3f\xe0\xce\x14\x88\xc0\x02\x2c\x5d\x18\x5f\x8e\xfa\x84\x8d\xc9\x6c\x1e\xca\x5e\x90\x8a\xba\xfe\x9f\x60\xa8\x78\xc1\x63\x38\xb7\x09\xe8\x50\xe7\x0f\xfa\x44\x67\x0c\x8e\xd5\x4a\x38\x04\xde\x21\xd9\x4b\x01\x57\x5e\x8b\x57\x8a\x30\x97\xb3\xcf\xf8\x69", 236, { 0xf2, 0xb4, 0x91, 0x22, 0xbb, 0x26, 0x7a, 0xf1, 0x45, 0x2f, 0xdd, 0x18, 0x0b, 0x95, 0xa5, 0x86 }, { 0xe8, 0xcb, 0x7e, 0x25, 0x61, 0x7b, 0xc7, 0x95, 0xe8, 0xcb, 0x7e, 0x25, 0x61, 0x7b, 0xc7, 0x95 } }, { "\xce\xa9\xde\xce\x18\x35\x69\xe4\x6a\xf0\x50\xcf\x7e\x0b\x86\x1d\xc3\xce\x50\x71\xe5\x1d\xb2\xca\xb3\x61\xfa\xa8\x66\xcc\x77\xbf\xea\xef\xe9\x42\x7c\x96\x25\x9a\xe5\x43\x12\xb7\xbe\xb6\xca\x0c\xff\x85\x31\x84\xd3\x4c\x94\xc8\x7b\x67\x38\xc9\x2a\xc1\x79\xf0\x37\xfc\xa8\x99\x27\xa7\x88\xa1\xa9\xb3\xf7\x4a\x80\x93\x9e\x48\x11\x6f\x94\x9b\x4a\xb6\xe5\xec\x11\x39\x34\x95\x2c\x4d\x6e\xf2\xca\x2d\xa8\x54\x2c\xe1\x1b\xc1\xaf\xc2\xcc\x99\xa6\x65\x75\x74\xd6\x9c\xa8\xa1\x5c\xb5\xc4\x43\x6b\x4e\x09\x2a\xa5\x63\x16\xd6\xe3\x52\xb8\x15\x1c\x34\xa2\x3d\x9e\x19\xab\x22\x6c\x7c\xc3\x4e\x21\xe1\x03\x49\x8e\x8e\x84\xca\x29\xb7\x53\x6f\xd6\x38\x37\x77\x93\x6c\x2d\x11\xe4\x5e\x92\x87\xcf\x31\x48\x1a\xbd\x39\x03\xfb\x62\x23\xa1\xdb\x72\xd9\xfd\x9c\x60\x39\xc0\xd8\xd9\x44\x4b\x45\x4b\x5e\xd3\x51\xb8\xe7\xdb\xbc\x54\xbb\x8e\x00\xaf\x23\x3b\x86\xf2\xc9\x4c\x2f\x26\x5a\xa4\x12\x6d\xcb\xe8\x18\x44\x41\x8b\x6e\x24\x65\xcd\xe1\x3d\xae\x0d\x77\xf6\x4d\xe7\x22\x1a", 237, { 0xc2, 0xf0, 0x4c, 0xb0, 0x1e, 0xba, 0x45, 0xb0, 0x54, 0x2d, 0x47, 0x36, 0x85, 0x19, 0x2b, 0x60 }, { 0x25, 0x49, 0x61, 0x2f, 0xe7, 0xe3, 0xd8, 0xd8, 0x25, 0x49, 0x61, 0x2f, 0xe7, 0xe3, 0xd8, 0xd8 } }, { "\x1c\x88\xae\x38\x32\x92\x52\xa2\xdc\x30\xed\x5e\xeb\x40\xbd\x2f\xef\xd0\x13\x9b\x08\xac\xa6\x26\x99\x29\x2c\xcf\x99\x95\x83\xec\x1d\xee\x87\x1e\x19\xb2\x4a\xc8\x4a\x5c\x31\x5d\xee\x72\xa4\x88\x94\x76\x23\xce\xdf\xc0\x40\xe5\xf2\x81\x97\xf3\xf6\x78\x3b\x2e\xc3\xa4\x40\x12\x30\xf5\x7d\x28\x53\x7a\x5e\x89\x12\xe1\xe0\xaa\x89\x66\xf7\x7c\x86\x05\x8d\xad\xb8\xed\x15\x98\x61\x98\x75\xe7\x34\x4c\x41\x78\xec\x6f\xef\xaf\xa8\x02\x48\xa2\xfa\xcb\x27\x5a\x8f\x82\xe7\xe3\x77\x0a\xe3\xa1\x2d\xaf\x8d\xbd\x14\xe6\x65\xfe\xff\xe8\xcb\xb2\x30\xad\x72\x62\x6e\x7b\x15\x07\x6c\x81\x78\xc0\xd6\xae\x99\x05\xbb\xcd\x54\x6a\xb3\x1c\x15\x61\xdc\xbb\x43\xe3\x82\xbe\x97\x89\x71\xe3\x22\xa0\xf3\x9c\xb9\xd0\x3f\xaf\x8e\x43\x0f\x72\x83\x51\x5d\xd7\x09\xf0\x3d\x3b\x2c\xe2\x79\x5f\x1b\xab\xf2\xab\xef\xd1\x6d\xe3\x3c\x47\x48\xbc\x77\x88\x3c\xd0\x3c\x0e\xec\x33\xf4\xce\x6b\x64\xfe\xcb\x13\x6f\x57\x8f\xca\x36\xa5\xdd\x2a\x10\xd0\x41\xd2\x8d\x26\x05\x41\xc7\xe1\x9e\xc3\xa4", 238, { 0xfd, 0x92, 0xbc, 0x62, 0xc5, 0x59, 0x86, 0x83, 0x45, 0x52, 0x41, 0x2a, 0xc5, 0x9c, 0xe1, 0x8d }, { 0x52, 0x2c, 0x58, 0x8e, 0x58, 0xef, 0x42, 0x36, 0x52, 0x2c, 0x58, 0x8e, 0x58, 0xef, 0x42, 0x36 } }, { "\xc7\xbb\xdd\xc4\xaa\x66\xe7\xc7\x1d\xea\xcc\xd6\xff\xe3\x94\x55\x88\x56\xab\x37\x34\xfa\x7c\x14\x65\xa8\x1f\x5e\x29\xec\x49\xc0\x6f\x8d\x94\xa7\xca\x42\xb4\x1b\x5c\x5d\x85\xeb\xd2\x2d\x8a\x26\x4d\x19\xf6\xde\xdc\x50\x88\xfa\x98\xc9\xd8\xc4\x60\x27\xe2\x1d\xcb\x44\x41\x83\x94\x13\xaa\x0e\xf5\x3e\x3f\x52\x06\x40\xd9\x56\x3d\x73\xf3\xed\x58\x8c\x3b\xc9\xb6\x52\xb0\x04\x0d\xb8\xe4\x77\x32\xa3\x8c\x94\xd3\x89\xf7\x9e\x58\xdc\x61\x7f\x69\x5f\x65\x78\x94\x42\x7e\x4b\x32\xbe\x99\x54\xca\x55\x73\x4f\x96\xe6\x5e\x6c\x68\xea\x49\x58\x24\xbc\x44\xe9\x68\xf9\x38\x96\xb6\x31\x99\x33\x34\xc0\x4d\x7e\x63\xc8\x98\x25\x9f\x69\x77\x3b\x80\xcc\x64\x43\x9a\x35\x45\x53\x80\x53\xd8\xc5\x6a\x40\x9f\x32\xa2\x53\xa4\xa7\x71\x8e\x77\x01\xa1\x96\xc9\xe1\xc2\xb4\x4a\x4b\x74\x3f\xd8\xd4\x0c\x98\xfb\x43\x18\xb4\x27\xe9\x28\x34\x0b\xb2\x2e\xc6\xdb\x02\x8b\x05\x03\x9d\xa9\x27\x98\x48\xbb\x15\x6d\x1b\xf4\x7a\x6d\x00\x4d\x9c\xc9\xca\x08\xec\xde\xbf\x7b\x8d\xde\x62\x30\x71\x56", 239, { 0xd8, 0x19, 0x58, 0x67, 0xed, 0xc1, 0x60, 0xa1, 0x2f, 0x6c, 0x98, 0xd1, 0xfe, 0x10, 0x59, 0xe9 }, { 0x88, 0xa7, 0x44, 0xcf, 0x95, 0xb5, 0x8b, 0x1f, 0x88, 0xa7, 0x44, 0xcf, 0x95, 0xb5, 0x8b, 0x1f } }, { "\xe8\xed\xc0\x76\xdc\x07\xbe\xcb\x5a\xa0\x80\x55\xf9\xf8\x48\x7f\x7d\x50\x76\x08\xa6\x02\x93\xbb\x72\x87\x65\x34\x5f\xbf\x33\x89\xb8\xd5\x4e\x02\xef\x91\x3b\x36\xd2\x9a\xd6\x55\x6e\x25\xf1\x6b\xa9\xe3\x65\x13\xb3\x80\x27\xd5\x98\xbb\x12\x2a\x8c\x50\xb6\xf1\x1f\xa2\xe8\xba\x50\x3a\xd2\x6e\x29\x0f\xbf\x22\x63\xac\xb5\x40\xad\x36\xeb\x61\x6d\xf2\x11\xb0\x1d\x10\xd1\xf7\x15\x71\x58\xc2\x05\x44\x27\xca\xfc\x56\x9f\x7f\x67\x57\x69\xbe\x1d\x02\x2a\x75\xaf\xee\xee\xdf\x1f\x64\x0a\xdf\x19\x64\x8a\x52\x95\x41\xf3\xf6\x5e\x9d\x09\x62\x29\x72\xc3\xc9\xb4\xfb\x69\xa8\xda\x37\xa2\x7a\x3d\xc7\x96\xe2\x5f\x04\x01\x11\x9e\x00\x9e\x39\xb4\xc5\x1c\x4c\x7c\xc6\x1a\x4b\x66\x98\xd6\x08\x26\x70\xf3\xaf\xed\xa3\xc3\x26\xd0\x63\x0f\x0e\xc8\x1d\x80\x84\xc5\xce\xa4\x2e\x2d\x3c\x31\x1a\xb6\x7c\x8d\x19\x67\x3c\x12\x0f\x7e\xee\x10\x34\xd5\x23\xb6\x18\xce\x52\x2a\xea\xf2\xd8\xe9\x97\x46\xc4\x31\x3a\xa5\xc2\x61\x23\x3d\xef\x8b\xee\x93\x40\xa6\x10\x3c\xe4\x0f\x4e\x4f\xc3\x8b\xe5", 240, { 0x90, 0x0f, 0x95, 0xfe, 0xc7, 0xf9, 0x4b, 0x74, 0x07, 0xbc, 0xcd, 0xb4, 0xc3, 0x8e, 0xd3, 0x1c }, { 0x24, 0xe8, 0xe6, 0xc3, 0x4d, 0x81, 0x64, 0xf6, 0x24, 0xe8, 0xe6, 0xc3, 0x4d, 0x81, 0x64, 0xf6 } }, { "\xe8\x2a\xbd\x11\xda\xc5\x25\x25\xad\xa0\x22\xf8\x5f\xf5\x17\x7d\x35\xb0\x84\x5b\xd0\x16\x88\xf6\xa8\xff\x9f\xbe\xc9\x8e\x77\x0a\x1d\x04\x43\xee\x3b\xf4\xaa\xdb\x4c\xcd\x91\xbd\x19\x3e\xea\xe5\x86\x54\x3e\x20\x25\xfc\xc5\x26\x09\x33\x35\xfc\x2c\xbc\xb0\x2f\xfa\x82\xf5\x4b\x50\x70\x58\xff\x87\x2e\x4c\x12\xb6\xf0\xfc\x9f\xe8\x6e\xae\xab\xa5\x89\xd6\x65\x6a\x92\x28\x2a\x6e\xf7\xc7\x3a\xd7\x4d\x55\xb3\xf0\x9a\x21\x0e\x97\xe1\x7d\xab\x66\xa0\x2b\xc5\xe3\xbf\xf5\xd1\xcf\x1a\xf4\xb9\xe7\x55\x82\x96\x97\x18\x9d\x36\x3e\x83\xfa\x62\xee\x22\xcb\xd7\x53\x45\xe0\x7a\x1b\x7b\x7a\x4e\x0b\xd0\x10\x0b\xf0\xbc\xaf\xa6\x94\x8e\x8c\x1a\x3f\x08\x84\x16\x87\xa7\x8f\x7d\x0e\x19\x29\x94\x51\x60\xa0\x02\x86\x61\x54\x45\x69\x96\x35\x90\xfe\xc3\x1d\xcd\x0b\xfc\x7f\xe5\x5e\x83\xf9\x0a\xe8\x7b\x62\xdd\x66\xb7\x99\xc2\xc1\xdc\x23\xad\x0b\x45\x63\xd3\xd7\x43\xb1\x0b\xa2\xb5\x59\x41\x28\xa1\xb9\xe2\xae\x6e\x1c\x55\x78\x6b\xac\x61\xb8\x85\xa3\x48\xbb\xbe\x47\x79\xfd\x17\x31\xa3\x36", 241, { 0x14, 0x21, 0xb2, 0xac, 0x0e, 0x07, 0x7c, 0x11, 0x11, 0xb0, 0xf5, 0xdd, 0x3f, 0x20, 0xd4, 0x41 }, { 0xbe, 0xd8, 0xaf, 0x36, 0x2c, 0xf5, 0xb1, 0x43, 0xbe, 0xd8, 0xaf, 0x36, 0x2c, 0xf5, 0xb1, 0x43 } }, { "\x49\x23\xeb\x4d\x9f\x5b\x30\xcb\xba\xdb\xfd\xe4\x5a\xc1\x9d\xb1\x9c\x52\xa0\x64\x18\x0d\x38\x4c\x9b\xcb\xba\x9b\x32\x9f\x98\x42\x0c\xb7\xa4\xce\x27\x0d\xdf\x69\xe8\x69\x29\x6e\x8f\x19\x77\x3b\xb2\x19\x70\x6e\x0c\x0e\x28\x5c\xe4\xf8\x9a\x11\x0c\x0f\x52\xbd\x16\xbc\xec\xe7\x05\x03\xa6\xad\x28\xc6\xb6\x8a\x44\x3f\x21\x51\x28\x9e\xe6\xea\x63\xa5\xdb\x58\x6b\x0b\x34\xb4\x28\x29\x4d\x88\x4c\x2a\xc0\x95\xd2\x55\xab\x37\xae\xd0\x78\x41\x1b\x3c\x96\x03\xe5\x7b\x97\x62\x9f\xe6\xe0\xbd\xfe\x3e\x99\x91\xc0\x41\x8d\x53\xec\x35\xbc\xf3\x85\xae\xd1\x39\xe2\xec\x32\xa3\x66\xe9\x59\x14\x5e\xa8\x18\x5b\x16\x01\x3c\x63\x3f\xae\x46\xe6\x60\x83\x0d\x63\xf3\x22\x12\x39\xc2\x72\x97\xc3\x5b\xa7\xb6\x63\x87\x54\xf0\x14\xfb\x09\xbf\x01\xaf\xac\x6e\xfc\x2b\xbb\x79\x22\xc4\xfd\x4b\x95\xfd\x77\x01\x28\x35\x89\x9c\x92\xa9\xdd\xd3\x6f\x39\x5a\x92\xd0\xbb\xd8\x89\x95\x38\xe8\x18\xf7\xcd\x1b\x59\xa8\x7e\xbc\x9e\xc0\x10\x73\xa5\x8c\x05\xd9\x92\x67\x6d\xf8\x39\xc1\xcf\x8d\x97\x61\x6e\x57", 242, { 0x26, 0xe0, 0x19, 0xb0, 0x21, 0x0f, 0x12, 0x8e, 0xff, 0xab, 0x8f, 0x25, 0x75, 0x0b, 0x59, 0xce }, { 0x90, 0x66, 0x63, 0x12, 0x2c, 0x20, 0x9e, 0x05, 0x90, 0x66, 0x63, 0x12, 0x2c, 0x20, 0x9e, 0x05 } }, { "\x0b\x94\x4f\xd5\xd0\x17\x7e\xd9\x26\x23\x79\x9b\x01\xc6\x3e\x39\x78\xdb\x54\xb8\xf7\x87\x52\x93\x41\x12\x16\x5b\xc0\xf4\xce\x98\x5e\x42\x50\xc9\xc6\x01\x4e\x7a\x63\x8b\x0a\xc5\x46\x78\x54\x97\x83\x52\xcf\xa8\x91\xcc\x34\x64\x2b\x34\x0d\x01\x41\x4e\x4c\x12\x99\xd4\x41\x14\xbb\xc1\x2c\x34\xbf\x2a\x87\x20\xc3\x1a\x0e\x4a\x79\x1a\x2a\x0b\x38\x96\x3b\x83\x5d\x60\x86\x8d\xa5\xd6\x52\xca\x1f\xb0\x5c\xec\xca\xef\x5b\x3d\x60\x2b\xcb\x9b\x5e\x0f\x73\x31\x9c\x83\x10\x2f\x57\xc2\xcf\xda\xc5\xdd\x98\x15\x5c\x07\xd1\x32\x5b\x74\x0d\x4c\xf7\x45\xda\x55\x5f\x6f\xbb\xbd\x47\x6e\x1c\x25\x08\xe3\xd6\x59\xb5\xf0\xfc\xbe\x61\xeb\x0f\x9c\xab\x32\x13\x0d\xb3\x14\xf5\x85\x18\x2d\x29\xdc\x95\xfe\x56\x60\x80\xfe\xcc\xcd\x50\xdc\x01\x2c\x5c\xf2\x60\x0f\x36\x88\xb7\x89\x47\x9a\xd9\x80\xcb\x8f\x0e\xe9\x4e\x32\xd6\xa2\x4d\xf4\xde\xd0\x1c\x8b\xf6\x32\x89\xcb\xab\xd1\x35\x8c\x20\x1c\x38\xb9\x00\xe9\x3a\x7b\x65\x6f\xdb\x1c\xc8\xc5\x96\xa8\x20\xa5\xaa\x5c\xd0\xab\x0a\x2e\x48\xb9\x5c\xf0\x2b", 243, { 0x6c, 0x13, 0x76, 0xaa, 0xdf, 0xc0, 0x34, 0x79, 0x13, 0x6a, 0xcc, 0xdd, 0x7c, 0xee, 0xbe, 0x6e }, { 0x7c, 0xa5, 0xcd, 0x6b, 0xd0, 0x5c, 0x9f, 0x5b, 0x7c, 0xa5, 0xcd, 0x6b, 0xd0, 0x5c, 0x9f, 0x5b } }, { "\x39\x14\x65\x48\xb3\xf2\xee\xce\x5f\x8a\x99\x46\x64\xb8\x0c\xfa\x1e\x4f\x44\xa0\x11\xe0\xac\x3e\x53\x74\xdb\xbf\x4e\x19\xa3\xf0\x4d\xe6\xe2\xf4\x67\x4b\xaa\x05\xce\x2a\x50\x89\xc0\xbe\xb0\xe0\xbc\xe2\xef\xc7\x3a\x93\x54\xdd\x8b\xac\x90\x7d\x94\x96\x2c\x95\x42\xee\x3e\x93\x6f\xa3\x08\x26\x2e\x0e\xd0\x1f\x99\x66\x85\x4e\x76\xc7\x7b\x09\x54\xbd\x58\xe3\xd1\x2c\x0b\x3a\x97\xc5\x05\xd9\xd7\x34\x9a\x68\x84\x31\x8f\x9c\x58\x62\x9f\xbe\xfc\xb2\xfe\xc0\x51\xda\x1b\x4a\x48\x48\x86\x0d\x1b\x38\xbe\xe3\x3e\x3e\x87\xf0\x3f\x02\xe2\x4f\x6f\x54\xdf\x41\x61\x37\xa3\xd4\xf0\x61\x68\x2a\xe6\xef\xa4\xa0\x82\x01\x32\xb8\x08\x1a\xa5\x38\x8b\xf2\x0e\x2c\x3c\x67\xa2\x75\xba\x3e\x4a\x0e\x4f\x1e\xd1\x81\xe3\xeb\xf4\x01\x3e\x69\x42\x64\x1f\x80\x8a\x0a\x03\x15\x4e\x97\x9a\xe1\x36\x03\x93\x97\x2b\xae\x33\xae\x3c\x74\x4c\x6c\xda\x20\x74\xe1\x30\xe2\xb7\xcb\x2f\x87\xb6\xb5\x44\x86\x58\x51\x3b\x8b\x18\xe5\xe3\x90\x73\xed\xab\x40\x35\xb4\x04\x16\x81\x01\x53\x44\x1b\x5c\x04\x35\x09\x49\x10\x98", 244, { 0x71, 0xe0, 0xbb, 0x94, 0x43, 0x35, 0xb9, 0xfa, 0x05, 0xc2, 0x1f, 0xaa, 0xfc, 0x25, 0x22, 0xd5 }, { 0xff, 0xfd, 0x47, 0xe5, 0xff, 0x08, 0xe4, 0x71, 0xff, 0xfd, 0x47, 0xe5, 0xff, 0x08, 0xe4, 0x71 } }, { "\x44\xe8\x6d\x76\x89\x63\xc2\x2d\x02\xa4\x51\x50\x79\xb4\xe2\x37\x4c\xb1\x4c\x4b\xcf\x53\xa0\xc7\xf2\xe2\x42\x7c\xb4\x50\x88\x8d\x8a\xc7\xea\x67\xf7\x89\x0d\x30\xb2\x07\x9f\x32\xa4\x99\x29\x5b\xf6\x61\x57\xa4\x48\x52\x99\x7b\x48\xea\x1d\xb9\xe3\xf9\xa4\xc1\x0f\x80\xa7\xd7\x07\x75\xfb\xe4\xe8\xc3\xb1\x7d\x3a\x61\xff\x90\x07\x8e\xe1\xa2\x4b\xa8\xd3\x3d\xee\x0a\x76\x01\x7a\x06\x3d\x20\x4c\x56\x8a\xee\x38\x19\x18\x2f\x22\x3a\x96\xbe\x65\x86\x24\xb8\xba\x0b\xc5\xad\x5b\xbf\xf6\x62\xa6\xad\x29\xe5\xa3\x95\x1b\x11\xf3\x14\x9d\x6e\xea\x4e\x8d\x8e\x6e\x3b\x36\x95\x71\xee\x57\xb1\x65\xac\xa2\x19\xb1\xb8\x31\x24\xb9\x65\xf3\x94\xd9\x5b\xd1\xe8\x1c\xe3\x3f\x44\xd3\x76\x32\xf6\xe9\x77\x7c\x2f\x4f\x0b\x1a\xb9\xee\x69\xb8\xa8\xb7\xbc\xbc\x0f\x76\xfe\xe9\x86\x05\x56\x38\x35\x5b\xaf\x61\x7a\x46\x97\x98\xa2\x9e\xea\x44\x49\x4f\x89\x3c\xda\xe2\x36\x6e\x05\xd1\xfc\x70\x47\x93\x3a\x87\xe7\x40\x74\xbc\x1d\x0a\xff\xb0\x52\x7f\xe6\xea\x2e\x4a\xdd\xda\x58\x3a\xe0\x06\xfa\xce\x59\x35\xc0\xc8", 245, { 0x29, 0xa7, 0x10, 0x28, 0x32, 0xe2, 0xdd, 0xb7, 0x3e, 0xb6, 0xc0, 0xa8, 0xab, 0x3c, 0x8a, 0x01 }, { 0x13, 0xbc, 0x78, 0x48, 0xcd, 0xf3, 0xee, 0xdb, 0x13, 0xbc, 0x78, 0x48, 0xcd, 0xf3, 0xee, 0xdb } }, { "\xfd\xd8\x29\x3c\x32\xab\x0c\x82\x86\x9f\x33\x4e\x0a\xfe\x94\xfb\xbd\xc0\x65\x6e\x2f\x20\x4a\x83\x2c\x7c\xbd\x73\x91\x3b\xb4\x9b\xba\x2f\x36\x74\xba\x77\x91\x2e\x93\x46\x9c\x7c\x7a\xfc\x7b\x3e\xa6\xc1\xc3\x4c\xad\x6f\xcc\x3f\x4f\x3a\x74\x82\x1f\xf5\xde\xf1\xb5\xc6\xd7\x42\x1b\x6d\xb8\x9b\x40\xb2\x62\x73\x6b\x21\x9b\xd7\xe6\x96\x6e\x78\xb5\x53\xdc\xd4\x95\xaa\xa9\x6e\x7c\x85\xfc\x82\xe4\x75\xf7\x7b\x59\x8b\xbc\x25\xa4\x01\x1a\xa9\xfb\xd8\x5c\xa9\xda\xc5\xf1\x60\x87\x2d\x42\xe2\x53\xb5\x5e\xb4\x4d\xde\x1e\x82\x61\x7a\x5b\x5f\x41\x9b\x7b\xba\xe6\x11\xb1\x07\x09\xae\x4c\xdb\xbd\x63\x40\x70\x62\x83\xe6\xe5\x0a\x92\xa5\xa9\xc3\x4f\xcf\xef\xbe\x94\x01\xfb\xf8\x1e\x6d\xe0\x25\xf2\x81\xab\xd0\xde\xa7\x8b\x6e\x46\x2a\xf2\x4c\x8e\x93\x4f\x8f\xa5\x1b\xd6\x7d\x3b\x1c\x48\x67\x08\x35\x17\x57\x99\xed\x43\xfa\x4f\x9a\x5b\x80\x96\x76\xb8\x15\xcf\x21\xc0\xd0\xf8\xd2\xe7\xb0\xaf\x28\x1a\x77\xc4\x8d\xd6\xca\xa3\x06\x34\xe6\x92\xfa\x74\x83\xac\x81\x1f\x3b\xec\x3e\x87\xf5\x83\x39\x44\xb7\xee", 246, { 0x52, 0xdc, 0x96, 0x32, 0xa6, 0x13, 0xc2, 0xc2, 0xef, 0x67, 0x15, 0xe9, 0x74, 0x4c, 0x0d, 0xb0 }, { 0x94, 0x84, 0x69, 0x95, 0x48, 0xea, 0x11, 0xf9, 0x94, 0x84, 0x69, 0x95, 0x48, 0xea, 0x11, 0xf9 } }, { "\x4f\xf2\xe7\xbf\xf3\xeb\x1c\x5a\xcf\x1a\x5b\x8c\xd9\xb4\x59\x2c\xef\x3b\xd4\x6f\x51\xd9\xf8\xc9\x4f\xc9\x4b\x27\x6e\x33\x87\xd3\x5d\x63\xdb\xc0\x25\xd7\xcb\x4f\x05\x6e\x7a\x01\x11\x26\xb2\xe9\xf0\xde\x12\x0c\x12\x76\x47\xca\x55\xad\xe9\x49\xb1\x37\x6f\x32\xe0\x1a\x15\x55\x89\xa0\x48\x6a\x69\xb1\x31\xf4\xc5\xcf\x9a\x73\xc2\xa4\xd5\xb9\x17\x6d\xc5\xac\xa5\x11\xda\x10\xc4\x60\xad\xe0\xe9\x48\xe0\x93\xa9\xb5\xd5\x73\x8b\x66\x15\x87\xf6\xe9\xdb\x2a\x71\xda\xe8\x77\x21\x24\xbf\xae\x97\xbe\x8d\x8a\xc6\x2e\xd3\xd9\x2d\x07\x95\x76\x34\x88\xe4\x57\xdb\x83\xc7\x2f\xb8\xbb\xfb\x7b\x83\x66\xb2\x23\xef\x1d\xae\xc4\x35\x8d\x75\xd0\x53\x78\xaf\xb9\x2a\xb3\xe3\x18\x19\x8f\x6e\x0e\x3b\x19\x46\x68\x44\x86\x8d\x37\x13\xc8\xe0\x4d\xe4\xe0\x30\x89\xa7\xbb\x15\x47\x7b\x9f\x55\x42\x25\x29\x3f\x49\x9e\x55\x18\x10\x73\x06\x09\xe6\x21\xe7\xd4\x8e\x57\x48\xff\x50\x01\xfd\x95\x62\x25\x21\x79\x48\x16\xa9\xda\x13\xd6\x16\xa5\x48\xd6\xc7\x01\xe4\xfd\x17\xd6\x79\x67\x63\x6f\x3e\x2d\x55\x9e\x06\x0a\xba\x0b", 247, { 0x37, 0x75, 0x81, 0x35, 0xad, 0x65, 0xd8, 0x9e, 0xba, 0x00, 0xd8, 0xc2, 0x86, 0x94, 0x22, 0xd9 }, { 0x45, 0xd8, 0x82, 0x34, 0x00, 0xb6, 0x3e, 0xfc, 0x45, 0xd8, 0x82, 0x34, 0x00, 0xb6, 0x3e, 0xfc } }, { "\xd9\xed\x48\x24\x24\xa1\x89\x24\x8e\xda\x2f\x96\x82\x4d\x4e\x17\xa5\x0a\x31\x20\x99\x6c\x17\xdc\xb0\x7d\xf3\x28\x5f\xe3\x6b\x85\x5e\xa7\x80\x59\x4f\xaa\x6c\x73\xcd\x96\xb9\xdc\x95\xed\x5d\x26\xa9\x4b\x4b\xa7\x63\xff\x2f\x61\x52\x47\xe4\x79\x05\x9f\x0e\x7d\xfa\xb9\x5b\x4d\xbd\xcf\x9b\x12\x11\xfb\xc9\x03\xf5\x57\xb1\xd8\x62\x00\x27\x88\xdb\x7d\x02\x25\x86\x21\xd8\xfa\xa3\x1c\xa6\x85\xe1\xc5\xa7\xe8\xfd\xb4\x8b\x8d\xd4\x2d\xbe\x32\x48\x8a\xc2\x70\x33\x94\xef\x06\x59\x14\x9b\x90\x8e\x9d\xca\x6c\x36\xda\x0d\x31\x8a\x41\x69\x39\xc1\xd1\xb1\x8e\x86\xc6\x57\xf1\x46\x2a\x0c\xf5\x98\x94\x2b\x4b\xe7\xb3\xb4\x5e\xdd\x04\x9d\xed\x8a\x32\x44\x23\xad\xb6\x66\x15\x7b\x51\xc6\x76\x2f\xe5\x3e\x8b\x1f\x1e\xee\x82\x7c\x08\xeb\x0c\xb8\xf3\x52\x01\x7c\x62\x77\xb8\xb7\x9c\x7e\x53\x88\x8a\x13\x92\x54\xe4\x22\x29\xa8\x25\x12\x9b\x20\xeb\x3b\x7e\xad\x90\xe5\x70\xe1\xc8\x9e\x3d\x42\xa2\x1e\xb2\x55\x6a\x62\x9e\x0c\x53\xa5\x4d\x78\xb6\x23\xfd\x22\x53\x27\x81\xe3\x89\x69\xcf\x04\x31\x31\x05\xed\x01\x2f\xce", 248, { 0x19, 0xb9, 0xa0, 0xae, 0x20, 0x0e, 0xc8, 0xe0, 0x56, 0x57, 0xfa, 0x56, 0x0a, 0x47, 0xbe, 0xd0 }, { 0x6e, 0x8e, 0x5d, 0xed, 0x7f, 0xf5, 0xae, 0x85, 0x6e, 0x8e, 0x5d, 0xed, 0x7f, 0xf5, 0xae, 0x85 } }, { "\xd2\x26\x56\x98\x9e\xfa\x37\xb4\x7c\x01\x84\x65\xd4\x54\x22\x0f\x83\xf3\x31\x17\xb4\x51\xd6\x23\x5d\x2c\xeb\xb3\x2e\x7b\xf8\xec\x8b\x57\x62\x82\x7c\x54\xa3\xc4\x5c\x9b\x84\x7c\x3d\x51\x62\xbf\x06\x38\x54\xe3\x8e\xab\xa8\x1a\xf2\x9f\xe0\x36\x12\x3e\x93\x0a\x0a\xbf\x44\x78\x7b\xf2\x43\x08\x2b\x86\x93\x17\x33\xfd\x5e\x94\x5a\xe6\x7d\x48\x3e\xa3\xf5\xa6\xee\xc8\x95\x0a\x9e\x37\xe6\x4e\xdc\x9a\xaa\x9e\x3d\xa2\x51\x40\x94\xf0\xab\x74\x09\xf2\xf0\xd5\x63\x04\xd6\x84\xa3\x1d\x4a\x2d\xd7\xd2\x4f\x9e\x49\x7c\x22\xcd\x2c\xb5\xe0\x87\xfc\x9e\xbc\xf5\xd3\x38\x0d\xf9\x16\x4d\x7f\xa5\x83\xbe\x9f\x09\x4a\x36\x06\x1d\x05\x70\x03\x99\x4b\x59\x7d\xd3\x0a\xcb\x5f\xf0\xf4\x19\x0b\x9b\x25\x4d\x10\x75\xd4\x49\xad\x69\x4a\x59\x34\xae\x5e\x1c\x16\xfc\xbe\x7f\xdd\x17\x89\x37\x96\xba\x99\xef\xc3\x4a\xc1\xf0\x00\x9e\x0e\xfe\xd8\xa0\xc2\xd6\xdd\x26\xa1\x1d\x11\x6d\x54\xa7\x68\x8e\x11\x75\xad\x9c\xc2\x34\xaf\x31\x85\x07\xc4\xdf\xb0\x61\x67\x2c\xaf\x1a\x99\x7d\xbb\x93\x4a\x4b\x7e\x6e\xa7\x34\x65\xdd\xda\xe9\xbb", 249, { 0xc2, 0xb2, 0xf8, 0x42, 0x9a, 0xaf, 0xea, 0x34, 0xfe, 0x37, 0xe4, 0xfb, 0xbb, 0x44, 0xc6, 0x8e }, { 0x51, 0xd9, 0xdd, 0x93, 0x9e, 0x04, 0x79, 0x70, 0x51, 0xd9, 0xdd, 0x93, 0x9e, 0x04, 0x79, 0x70 } }, { "\xcd\xb0\x94\x95\xb4\x37\x0c\x0b\xed\x5f\x12\xc9\x7a\xcd\xfa\xdf\x9b\xf7\x26\x73\xd5\xde\x0d\x7a\xa6\xc1\xa6\x3f\x82\xe2\x4c\x34\xdc\xaf\x57\xe0\xf5\xaa\xbd\xae\xe4\xd1\x7c\x45\xf9\x8d\xd9\x23\x9a\xbb\xf9\x01\xd0\x47\x9b\x5a\x7a\x0a\x62\x46\xe7\x52\xad\x57\x52\xc4\xc3\x1e\x92\x13\xd2\x7a\x19\xfb\x0b\x07\xde\xf0\x75\xc7\x98\x28\x23\xea\xad\xd9\xdb\xd1\x17\x08\x03\x73\x0c\x6f\x25\x52\x6f\x5c\x86\x5a\x8a\x5a\x8a\xf1\x76\x30\x2d\x8e\xa4\x65\x33\x39\xef\x9c\xde\xf4\x96\xd5\xbd\x1c\x1e\xb9\x05\xa7\x34\x9d\x17\xf2\x93\x6a\xb2\x3e\x66\x4d\xb1\x0c\x8f\xc2\x9b\xeb\xbb\xd6\x67\xc4\xef\x9e\x0d\x85\x5d\x95\xdc\x87\x80\x18\x32\xb9\xb0\x05\x61\x01\xaf\xc6\x02\xa6\x6d\xd3\xd0\x04\xda\x0b\xf8\xff\x2b\xc4\xbf\x4b\xec\x2c\x7e\x92\x1f\xf7\xb9\x9c\x76\xf9\x8c\x8c\xc9\x19\x1e\x43\x0c\x00\xa7\xd9\xf6\x9c\xbe\x51\xac\xdc\x0a\xc9\x75\xb3\xf3\xdf\xda\xae\xfa\xd6\x64\x98\xdc\x33\x99\xb7\xa7\xe6\x3c\xad\xa0\x2a\x9c\x65\x17\x01\x2b\xdd\x62\x2d\x99\x90\xe8\xd6\x3c\x2b\xc1\xa9\xde\x81\xbb\x6d\x20\xda\xd7\x40\xd7\x82", 250, { 0x0f, 0x8a, 0xa8, 0x34, 0x80, 0x72, 0x4c, 0x5a, 0x8f, 0xc3, 0x1d, 0x81, 0x28, 0x35, 0x09, 0x61 }, { 0xbb, 0xd8, 0xbe, 0x9c, 0x96, 0xc6, 0xaa, 0x4b, 0xbb, 0xd8, 0xbe, 0x9c, 0x96, 0xc6, 0xaa, 0x4b } }, { "\x02\x8b\x7c\x20\xe6\x1b\x89\xf6\x27\x2a\x04\x3e\x2c\xf3\x62\x2b\xf7\xb7\x98\x24\xa9\x79\xc1\x1a\xc6\xdc\x01\x5a\x62\x34\xa9\xa2\x1d\x4c\x22\x32\xfe\x6e\xaa\xf9\xb2\x56\x75\x30\x95\xb6\x19\xaa\xf1\xf4\x92\xa9\xab\xc3\x22\xf3\xa7\x24\x02\x27\x61\x5d\x74\x9e\xc5\xd9\xf9\x53\x1c\x67\x1e\xe1\x69\xd5\x17\x70\xe8\x8d\x9f\x69\x28\xcb\x94\x30\x52\xb6\x83\xe0\xc2\x68\xae\xd7\xae\x5e\xa0\x03\x2a\x83\xc5\xb2\xcc\x68\x03\xd4\x23\x46\x97\x6e\xa8\xe9\xb3\xf7\xcf\xe2\x49\x4e\xbe\xe3\x9e\x63\xd0\x93\xb1\x3f\xa3\x40\x2f\xbf\x86\x47\x87\x4e\x91\xe0\xcb\x6d\x79\x0a\xb6\x0b\x08\xa2\x3c\x0f\x51\x07\xf7\x80\x80\x16\x46\x75\xd2\x98\xac\xef\x76\x6c\xbd\x29\x8c\x26\x88\x4a\xb2\xf6\xa0\xe2\xd2\x8b\x7b\x55\xbe\x3c\xec\x49\x36\xfe\x0e\x90\x01\x3d\xa1\xa7\xe7\xea\x87\x0f\x07\xf8\x8f\x37\x0a\xa5\xfa\x8f\x79\xd5\xa4\x58\x20\x02\x04\xf6\xec\x59\x41\x84\x64\x92\xb7\x49\x24\x8d\x78\x67\x54\x81\xc6\x9c\xca\x4f\xe9\x3e\xda\x80\x99\xd2\xad\xdf\xee\x10\x8b\xa5\x8c\xbc\x63\xeb\x0c\xcd\x8b\x9d\x50\x40\xc5\x1f\x99\x75\x53\x1c\x03", 251, { 0xe3, 0x11, 0xd8, 0xe4, 0x8e, 0x11, 0xa5, 0x2e, 0x07, 0xf5, 0x0b, 0x2f, 0xb1, 0xcc, 0x04, 0xc3 }, { 0xd5, 0x9b, 0x53, 0xa1, 0xa6, 0x66, 0x9c, 0x75, 0xd5, 0x9b, 0x53, 0xa1, 0xa6, 0x66, 0x9c, 0x75 } }, { "\xd8\x65\x98\xd9\xea\x61\x46\x37\xdd\x4b\xde\x52\xd1\x50\x70\x2a\xe2\x66\xb3\x4d\x6d\x03\x02\x3b\x61\x7a\x0b\x1b\x1d\x19\x06\xcc\x44\x77\x55\x02\x1c\x06\x3b\x02\xd3\x2e\xc6\x61\xf8\x8c\xeb\x09\x53\xc0\x6d\x38\x78\x93\xcd\x10\x48\xe4\xe2\xf9\xf0\xe1\x74\xee\xad\x06\x56\x8d\xb6\xf9\x94\x1a\xbc\x16\x6b\xaa\x2c\xa1\x55\xfc\x47\xaf\x5e\xdb\xc4\xf3\xec\xd4\x7c\x99\x0e\x47\x36\x6e\x7f\x57\xaf\x82\x42\x2e\x17\x8e\x79\x35\x8c\x7e\xce\x19\xf5\xc7\xe0\x55\xd5\x76\xec\x3f\xe3\x0e\x7a\x56\x38\x0a\x5d\x40\xd6\x1b\x15\x7b\x0b\x7e\x95\x53\x22\xb7\xc8\x56\x46\x0e\x43\x53\xe9\xe7\x91\x89\x15\x78\xde\xc7\xd7\x62\x34\x31\xa6\x19\x26\x1f\x0e\xcf\xd0\x28\xc5\x18\xff\x02\xa8\xe0\x92\x5c\x21\xb3\xf5\x93\xe1\x13\xb0\xcc\x7a\x94\x33\x7b\x25\xcd\x06\x53\xf8\xc7\x45\x3d\x48\xd2\xf5\xf5\x63\xd6\x85\xe7\xfb\xe3\xcf\x43\x6b\x93\xc5\x97\xb7\x5c\x72\xa7\xd2\x47\x33\x3b\xc6\x96\x03\xf3\xf8\x9b\xf4\x28\x22\xa3\x40\x5d\x46\x39\x30\x77\x8a\xa6\x61\x30\x2c\x32\x28\x56\x8a\x1d\x17\xcd\x90\x6e\xbc\xac\xf9\x45\xaf\x2c\x3e\x5b\xca\x0c", 252, { 0x36, 0x19, 0x20, 0xba, 0xb3, 0xfe, 0xa9, 0x35, 0x69, 0x3c, 0xd2, 0xa5, 0x4e, 0x46, 0x6a, 0xa7 }, { 0x60, 0xda, 0x44, 0x1d, 0x71, 0xa1, 0xaa, 0x37, 0x60, 0xda, 0x44, 0x1d, 0x71, 0xa1, 0xaa, 0x37 } }, { "\x07\x5c\x84\xbf\x58\x19\x72\x71\x4d\x16\x9d\x0a\x74\x72\xbb\x27\xc1\x1e\x98\x18\xb6\xbe\x61\x1c\xe0\x98\x1d\x2f\xcd\x71\xff\xa5\xa6\x57\x1f\x84\x88\xce\x21\xcd\xbf\xe6\xb2\x68\xf1\xc8\x1f\x4b\xf6\xbe\x14\x1d\xdd\x1d\xfe\xea\xd1\xff\x3e\x60\xd0\x43\xe7\x21\x99\xc9\xc2\x2e\x72\x13\xae\xee\x04\xb1\x7b\xd9\x9e\x54\x3f\x25\x42\x24\xe3\xf2\x49\xc4\x04\x5d\x60\x8e\xcc\x02\x94\x3e\xe4\x65\xe1\x77\x8f\xde\xa1\x38\xfb\x1a\x0e\xa2\x8a\x6d\x8b\x62\x2e\xa6\x94\x6e\x6d\xfc\x41\x25\xbe\xfc\x7e\xee\x94\xc4\xb0\xa9\x78\xbc\xc8\x2f\x8e\x56\x39\xce\xb7\xad\x66\xe7\xe4\x38\xf7\x44\x4e\x92\x98\x63\x80\x93\xce\x2e\xe9\xea\x49\xc4\x7b\x32\xbf\x67\xe3\x8e\x16\x1b\x09\x25\x01\x63\x50\x61\x26\x6d\xdf\x1f\xf7\x52\xa2\x7c\x22\xd0\x07\x99\x7e\xa3\xc5\x5a\x69\x22\xd9\xfc\x93\xb0\xf4\x88\x10\x4e\x54\xbc\xad\x0c\x46\x5d\x11\xa1\x24\xfd\xff\x72\x47\xc1\x90\x3b\xbe\x7a\xfc\x7d\xb8\xb6\xcf\x11\x76\x31\xc8\x1a\xf9\xb0\xf6\x61\x31\x5a\xd6\xd4\xa5\x32\x5d\xb9\x2a\x51\xc7\x29\x81\x18\xcf\x8b\x6c\xa6\x91\x09\x9c\x02\xfa\x38\x9b\x65\xaa", 253, { 0xa5, 0xc2, 0xbf, 0x94, 0x36, 0xae, 0x8e, 0x9a, 0x95, 0xaa, 0xb9, 0x77, 0x74, 0x77, 0x6f, 0x0f }, { 0x5d, 0x89, 0x67, 0x63, 0x99, 0xc9, 0x74, 0xa2, 0x5d, 0x89, 0x67, 0x63, 0x99, 0xc9, 0x74, 0xa2 } }, { "\x60\x2f\x3e\x63\x70\x2d\x8f\x36\x4a\x07\xa7\x62\x35\xa2\x72\xff\xd7\xbf\x26\x1c\x3c\x6e\xbe\x32\xd5\xab\xe9\x82\x00\x18\xd4\x92\x72\x44\xe3\x09\x26\x73\x62\xcf\x6d\xf3\x7e\xe8\x8b\xfe\x81\xaf\xdd\x74\x98\x5b\xd5\x0a\x40\xea\xb3\x4a\xb8\xbf\xe7\xb6\xea\x01\x86\xdd\x4d\x48\x81\x95\x73\x24\x8b\xf5\xa8\xea\xab\xc8\xf6\x9c\x0f\x93\x40\xdd\xf8\x0a\x4a\x99\x62\x60\x02\x3e\x9c\xab\x63\x8d\x87\x9e\xb0\xdd\xf4\x7b\x75\xf6\x82\x4a\x3d\x25\x93\x89\x65\x24\xba\x99\xa3\x4e\x47\x74\x1e\x0e\x85\xe2\x05\xc5\x56\x5d\x16\x4a\x91\x17\xd3\xe5\x31\x98\xf9\xb5\xbf\xe5\xf2\x95\x9d\x95\x0d\x62\x0c\x43\x7c\x7a\x5e\xc0\x7a\x99\x7c\x8c\x1e\x2f\xa1\x90\x4c\x38\xf5\x86\x82\x92\x42\x38\x79\x6a\x53\xa0\x99\xe9\x0f\xcd\x5a\xb3\x47\x41\x20\x2f\xb9\x4a\xc2\x81\x6f\x67\xf5\x68\xe2\x5c\x80\x81\x92\x1e\x6b\x69\x9f\xbe\x12\x55\xbc\x77\x4d\x84\xbe\xab\x71\x6e\x0a\x5e\x5a\x8c\xa7\xf8\x1a\x1c\x45\xd3\xd5\x25\xd2\xc1\xd8\x28\x00\x71\x21\xe7\x78\xa1\x73\x65\x86\x73\x73\x3a\x86\xd5\x1f\xe8\x1b\xa0\x1e\xfc\x3e\xbb\x82\x90\xaf\x94\x46\x05\x28\x27", 254, { 0x67, 0x2b, 0x47, 0xac, 0x71, 0xd0, 0xef, 0x97, 0xae, 0x8b, 0x37, 0xa1, 0xb4, 0x13, 0x81, 0x6a }, { 0xb4, 0xe9, 0xe2, 0xa0, 0x62, 0x50, 0xb9, 0x5a, 0xb4, 0xe9, 0xe2, 0xa0, 0x62, 0x50, 0xb9, 0x5a } }, { "\x3b\x96\xd2\xd5\x69\x6e\x4a\x53\x08\x68\x4e\x6a\xce\x2c\x76\x19\x7f\x79\xa4\x21\x5f\xf8\x68\xc2\xbb\x6b\xce\x66\xfd\x5c\x8d\x17\x88\x85\x53\xda\x05\x59\x27\x42\xf5\x2b\x7e\xc4\x3b\xb4\x07\x98\xee\x01\x2b\xb8\x31\x2c\x7e\x34\xc8\x22\xe2\x5d\x66\x75\x52\x9c\x29\x99\x00\x1a\x22\xbc\x56\x34\x3d\x3a\x31\x33\x64\x83\x45\x31\xcb\x50\x35\x25\x4d\x46\xcd\x94\x32\x9c\xc5\x96\x04\xe2\x08\x5d\x81\xa0\x0c\x65\x4d\x25\xf8\xa9\xf4\x1a\x79\xe3\x40\xc0\x20\x48\x7e\x69\x5d\x9a\xce\x6f\xf9\x27\x82\x3c\xf5\xf8\x5d\xf4\x6c\xb2\xaa\x04\x31\x35\xaf\x30\x66\x1d\xd9\xe4\x95\x33\x09\xaf\xbc\xfe\x9a\x66\x04\x2a\x3e\x3f\x47\xcc\x60\xbd\xfa\xf1\x26\x01\x36\x82\x93\xc8\xcf\x1c\x58\x4b\xa1\x44\x86\x1f\x2c\x4a\x42\x63\xd8\xfb\x16\xfe\xcf\x07\x74\x74\xd2\xa4\xe6\xb3\x1b\x7f\x41\x54\xbc\x15\x01\xf9\x0c\x91\xce\x95\x03\xda\xf6\x7d\x11\xca\x51\xd8\x96\x6f\x9b\xea\xd9\x30\x7a\xe7\xc4\xf7\xfd\x0a\x2e\x2e\xc5\x4a\x20\xc2\xec\xdd\x58\x0d\x28\xd8\xab\x87\x8e\x63\xdb\x4c\x0f\xc9\x7d\xfd\x2c\x52\x82\xff\xca\x29\x8c\xc4\xb5\x15\x74\x42\x26\x73\x0c", 255, { 0xe2, 0x09, 0x34, 0x36, 0xe1, 0x1e, 0xf8, 0xa6, 0xef, 0xbc, 0x63, 0x4c, 0x45, 0xec, 0x8c, 0x7a }, { 0xdf, 0xff, 0x20, 0xd7, 0x21, 0xd8, 0x1f, 0x7a, 0xdf, 0xff, 0x20, 0xd7, 0x21, 0xd8, 0x1f, 0x7a } }, { "\x2c\x23\xef\xc0\xa4\x05\x78\x47\xaf\x7f\x15\x89\xe4\xf2\x3c\xa5\x35\x07\x14\x02\xda\x40\xd4\x99\x67\xf2\x8f\x44\xac\x34\x1a\x54\xfd\x33\x21\xab\x77\x83\x41\x7f\x84\xa2\x05\xd3\x11\x2d\x63\xbd\x17\xa4\x75\xfa\x27\xf5\x52\xbb\x11\x2f\xb8\x93\x3f\x4e\xbe\xf1\x36\x09\xbc\xd0\xe6\x03\x59\x1f\x61\x73\x52\x0d\x7d\xed\x4e\x5d\x6f\xa5\xb7\x44\x9f\x57\x87\x4b\x83\x87\xa8\xcf\xae\x53\xa8\xb3\x01\x2b\xd9\xbc\xb0\xcc\x93\x08\xb7\x90\x50\x0a\x01\x50\x90\x45\x9d\xef\x6e\xc8\x72\xa0\xf7\xb5\xeb\x23\xb6\x54\x82\xf6\xad\x8d\x97\xc4\x50\xb8\x35\x14\x6b\x27\x42\x99\x58\x7c\x26\x25\x6d\xa4\xad\xd3\xb8\x8a\x55\xca\xd3\x12\xa3\xf0\xf1\xa0\x11\x26\x1f\xe4\x99\x86\x9e\xb1\x05\xb2\x41\xca\x54\x4a\xa9\x2d\x93\xfc\x82\xe0\xac\x93\x0e\x86\x04\xa9\x0b\x5b\x3d\xf8\x2d\xc0\x5d\x00\x5c\x01\xdb\x9e\x70\x2a\xd2\xa4\x73\x0e\xcb\xba\x3c\x3e\x98\xe8\x8c\x3e\x15\x1a\xa5\xea\xe4\xb6\x57\xf2\xb4\x7d\x94\x51\x1b\x15\x28\xcd\xf7\xb0\x34\xeb\x4d\xb3\xc7\xda\xad\xe7\x4b\xc6\x41\x46\x64\x42\x19\xec\x15\x8e\xc6\xd9\xd7\xa8\x49\x14\x5f\x21\x95\x39\xa8\x55", 256, { 0xf8, 0x03, 0x02, 0xa9, 0x4a, 0x3e, 0xbd, 0x04, 0x75, 0x76, 0x65, 0x11, 0xf4, 0x75, 0x25, 0x1e }, { 0xb4, 0x89, 0x09, 0x17, 0xad, 0xba, 0x4c, 0xdd, 0xb4, 0x89, 0x09, 0x17, 0xad, 0xba, 0x4c, 0xdd } }, snapraid-14.9/cmdline/mingw.c000066400000000000000000002507271522717156100161740ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #ifdef __MINGW32__ /* Only for MingW */ #include "support.h" /** * Exit codes. */ int exit_success = 0; int exit_failure = 1; int exit_sync_needed = 2; /* Add missing Windows declaration */ /* For SetThreadExecutionState */ #ifndef WIN32_ES_SYSTEM_REQUIRED #define WIN32_ES_SYSTEM_REQUIRED 0x00000001L #endif #ifndef WIN32_ES_DISPLAY_REQUIRED #define WIN32_ES_DISPLAY_REQUIRED 0x00000002L #endif #ifndef WIN32_ES_USER_PRESENT #define WIN32_ES_USER_PRESENT 0x00000004L #endif #ifndef WIN32_ES_AWAYMODE_REQUIRED #define WIN32_ES_AWAYMODE_REQUIRED 0x00000040L #endif #ifndef WIN32_ES_CONTINUOUS #define WIN32_ES_CONTINUOUS 0x80000000L #endif /* File Index */ #ifndef FILE_INVALID_FILE_ID #define FILE_INVALID_FILE_ID ((ULONGLONG)-1LL) #endif /** * Direct access to RtlGenRandom(). * This function is accessible only with LoadLibrary() and it's available from Windows XP. */ static BOOLEAN(WINAPI * ptr_RtlGenRandom)(PVOID, ULONG); /** * Description of the last error. * It's stored in the thread local storage. */ static windows_key_t last_error; /** * Monotone os_tick counter */ static windows_mutex_t tick_lock; static uint64_t tick_last; /** * If we are running in Wine. */ static int is_wine; /** * If we should use the legacy FindFirst/Next way to list directories. */ static int is_scan_winfind; /** * Loaded ADVAPI32.DLL. */ static HMODULE dll_advapi32; /** * Executable dir. * * Or empty or terminating with '\'. */ static WCHAR exedir[MAX_PATH]; /** * Set the executable dir. */ static void exedir_init(void) { DWORD size; WCHAR* slash; size = GetModuleFileNameW(0, exedir, MAX_PATH); if (size == 0 || size == MAX_PATH) { /* use empty dir */ exedir[0] = 0; return; } slash = wcsrchr(exedir, L'\\'); if (!slash) { /* use empty dir */ exedir[0] = 0; return; } /* cut exe name */ slash[1] = 0; } void os_default_conf(char* conf, size_t conf_size, const char* argv0) { char* slash; pathimport(conf, conf_size, argv0); slash = strrchr(conf, '/'); if (slash) { slash[1] = 0; pathcat(conf, conf_size, PACKAGE ".conf"); } else { pathcpy(conf, conf_size, PACKAGE ".conf"); } } void os_init(int opt) { HMODULE ntdll, kernel32; is_scan_winfind = opt != 0; /* initialize the thread local storage for strerror(), using free() as destructor */ if (windows_key_create(&last_error, free) != 0) { log_fatal(EEXTERNAL, "Error calling windows_key_create().\n"); exit(EXIT_FAILURE); } tick_last = 0; if (windows_mutex_init(&tick_lock, 0) != 0) { log_fatal(EEXTERNAL, "Error calling windows_mutex_init().\n"); exit(EXIT_FAILURE); } ntdll = GetModuleHandle("NTDLL.DLL"); if (!ntdll) { log_fatal(EEXTERNAL, "Error loading the NTDLL module.\n"); exit(EXIT_FAILURE); } kernel32 = GetModuleHandle("KERNEL32.DLL"); if (!kernel32) { log_fatal(EEXTERNAL, "Error loading the KERNEL32 module.\n"); exit(EXIT_FAILURE); } dll_advapi32 = LoadLibrary("ADVAPI32.DLL"); if (!dll_advapi32) { log_fatal(EEXTERNAL, "Error loading the ADVAPI32 module.\n"); exit(EXIT_FAILURE); } /* check for Wine presence */ is_wine = GetProcAddress(ntdll, "wine_get_version") != 0; /* get pointer to RtlGenRandom, note that it was reported missing in some cases */ ptr_RtlGenRandom = (void*)GetProcAddress(dll_advapi32, "SystemFunction036"); /* set the thread execution level to avoid sleep */ /* first try for Windows 7 */ if (SetThreadExecutionState(WIN32_ES_CONTINUOUS | WIN32_ES_SYSTEM_REQUIRED | WIN32_ES_AWAYMODE_REQUIRED) == 0) { /* retry with the XP variant */ SetThreadExecutionState(WIN32_ES_CONTINUOUS | WIN32_ES_SYSTEM_REQUIRED); } exedir_init(); /* * Set LC_ALL=C to make child ignoring the locale when printing info * * Note anyway that in Windows this trick doesn't work because the * Windows locale is used with priority. */ _wputenv_s(L"LC_ALL", L"C"); } void os_done(void) { /* delete the thread local storage for strerror() */ windows_key_delete(last_error); windows_mutex_destroy(&tick_lock); /* restore the normal execution level */ SetThreadExecutionState(WIN32_ES_CONTINUOUS); FreeLibrary(dll_advapi32); } void os_abort(void) { void* stack[32]; size_t size; unsigned i; printf("Stacktrace of " PACKAGE " v" VERSION); printf(", mingw"); #ifdef __GNUC__ printf(", gcc " __VERSION__); #endif printf(", %d-bit", (int)sizeof(void*) * 8); printf(", PATH_MAX=%d", PATH_MAX); printf("\n"); /* get stackstrace, but without symbols */ size = CaptureStackBackTrace(0, 32, stack, NULL); for (i = 0; i < size; ++i) printf("[bt] %02u: %p\n", i, stack[i]); printf("Please report this error to the SnapRAID Forum:\n"); printf("https://sourceforge.net/p/snapraid/discussion/1677233/\n"); /* use exit() and not abort to avoid the Windows abort dialog */ exit(EXIT_FAILURE); } void os_clear(void) { HANDLE console; CONSOLE_SCREEN_BUFFER_INFO screen; COORD coord; DWORD written; /* get the console */ console = GetStdHandle(STD_OUTPUT_HANDLE); if (console == INVALID_HANDLE_VALUE) return; /* get the screen size */ if (!GetConsoleScreenBufferInfo(console, &screen)) return; /* fill the screen with spaces */ coord.X = 0; coord.Y = 0; FillConsoleOutputCharacterA(console, ' ', screen.dwSize.X * screen.dwSize.Y, coord, &written); /* set the cursor at the top left corner */ SetConsoleCursorPosition(console, coord); } /** * Size in chars of conversion buffers for u8to16() and u16to8(). */ #define CONV_MAX PATH_MAX /** * Convert a generic string from UTF8 to UTF16. */ static wchar_t* u8tou16(wchar_t* conv_buf, const char* src) { /* flags at 0 forces the API to never fail on malformed UTF-8 sequences */ int ret = MultiByteToWideChar(CP_UTF8, 0, src, -1, conv_buf, CONV_MAX); if (ret <= 0) { DWORD error = GetLastError(); if (error == ERROR_INSUFFICIENT_BUFFER) { log_fatal(EINTERNAL, "Path too long converting '%s' from UTF-8 to UTF-16\n", src); } else { log_fatal(EINTERNAL, "Error %u converting '%s' from UTF-8 to UTF-16\n", (unsigned)error, src); } os_abort(); } return conv_buf; } /** * Convert a generic string from UTF16 to UTF8. */ static char* u16tou8ex_may_fail(char* conv_buf, const wchar_t* src, size_t number_of_wchar, size_t* result_length_without_terminator) { /* WC_ERR_INVALID_CHARS forces the API to fail on malformed UTF-16 sequences */ int ret = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, src, number_of_wchar, conv_buf, CONV_MAX, 0, 0); if (ret <= 0) return 0; *result_length_without_terminator = ret; return conv_buf; } static char* u16tou8ex(char* conv_buf, const wchar_t* src, size_t number_of_wchar, size_t* result_length_without_terminator) { /* flags at 0 forces the API to never fail on malformed UTF-16 sequences */ int ret = WideCharToMultiByte(CP_UTF8, 0, src, number_of_wchar, conv_buf, CONV_MAX, 0, 0); if (ret <= 0) { DWORD error = GetLastError(); if (error == ERROR_INSUFFICIENT_BUFFER) { log_fatal(EINTERNAL, "Path too long converting from UTF-16 to UTF-8 with len %u\n", (unsigned)number_of_wchar); } else { log_fatal(EINTERNAL, "Error %u converting from UTF-16 to UTF-8 with len %u\n", (unsigned)error, (unsigned)number_of_wchar); if (src != 0) { for (size_t i = 0; i < number_of_wchar; ++i) { log_fatal(EINTERNAL, "%4u: %04x\n", (unsigned)i, src[i]); } } } os_abort(); } *result_length_without_terminator = ret; return conv_buf; } static char* u16tou8(char* conv_buf, const wchar_t* src) { size_t len; /* convert also the 0 terminator */ return u16tou8ex(conv_buf, src, wcslen(src) + 1, &len); } /** * Check if the char is a forward or back slash. */ static int is_slash(char c) { return c == '/' || c == '\\'; } /** * Convert a path to the Windows format. * * If only_is_required is 1, the extended-length format is used only if required. * * The exact operation done is: * - If it's a '\\?\' or '\\.\' path, convert any '/' to '\'. * - If it's a disk designator path, like 'D:\' or 'D:/', it prepends '\\?\' to the path and convert any '/' to '\'. * - If it's a UNC path, like ''\\server'', it prepends '\\?\UNC\' to the path and convert any '/' to '\'. * - Otherwise, only the UTF conversion is done. In this case Windows imposes a limit of 260 chars, and automatically convert any '/' to '\'. * * For more details see: * Naming Files, Paths, and Namespaces * http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx#maxpath */ static wchar_t* convert_arg(wchar_t* conv_buf, const char* src, int only_if_required) { int ret; wchar_t* dst; int count; dst = conv_buf; /* note that we always check for both / and \ because the path is blindly */ /* converted to unix format by path_import() */ if (only_if_required && strlen(src) < 260 - 12) { /* it's a short path */ /* 260 is the MAX_PATH, note that it includes the space for the terminating NUL */ /* 12 is an additional space for filename, required when creating directory */ /* do nothing */ } else if (is_slash(src[0]) && is_slash(src[1]) && (src[2] == '?' || src[2] == '.') && is_slash(src[3])) { /* if it's already a '\\?\' or '\\.\' path */ /* do nothing */ } else if (is_slash(src[0]) && is_slash(src[1])) { /* if it is a UNC path, like '\\server' */ /* prefix with '\\?\UNC\' */ *dst++ = L'\\'; *dst++ = L'\\'; *dst++ = L'?'; *dst++ = L'\\'; *dst++ = L'U'; *dst++ = L'N'; *dst++ = L'C'; *dst++ = L'\\'; /* skip initial '\\' */ src += 2; } else if (src[0] != 0 && src[1] == ':' && is_slash(src[2])) { /* if it is a disk designator path, like 'D:\' or 'D:/' */ /* prefix with '\\?\' */ *dst++ = L'\\'; *dst++ = L'\\'; *dst++ = L'?'; *dst++ = L'\\'; } /* chars already used */ count = dst - conv_buf; ret = MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, CONV_MAX - count); if (ret <= 0) { DWORD error = GetLastError(); if (error == ERROR_INSUFFICIENT_BUFFER) { log_fatal(EINTERNAL, "Path too long converting '%s' from UTF-8 to UTF-16\n", src); } else { log_fatal(EINTERNAL, "Error %u converting '%s' from UTF-8 to UTF-16\n", (unsigned)error, src); } os_abort(); } /* convert any / to \ */ /* note that in UTF-16, it's not possible to have '/' used as part */ /* of a pair of codes representing a single UNICODE char */ /* See: http://en.wikipedia.org/wiki/UTF-16 */ while (*dst) { if (*dst == L'/') *dst = L'\\'; ++dst; } return conv_buf; } #define convert(buf, a) convert_arg(buf, a, 0) #define convert_if_required(buf, a) convert_arg(buf, a, 1) static BOOL GetReparseTagInfoByHandle(HANDLE hFile, FILE_ATTRIBUTE_TAG_INFO* lpFileAttributeTagInfo, DWORD dwFileAttributes) { /* if not a reparse point, return no info */ if ((dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) == 0) { lpFileAttributeTagInfo->FileAttributes = dwFileAttributes; lpFileAttributeTagInfo->ReparseTag = 0; return TRUE; } /* do the real call */ return GetFileInformationByHandleEx(hFile, FileAttributeTagInfo, lpFileAttributeTagInfo, sizeof(FILE_ATTRIBUTE_TAG_INFO)); } /** * Convert Windows attr to the Unix stat format. */ static void windows_attr2stat(DWORD FileAttributes, DWORD ReparseTag, struct windows_stat* st) { /* Convert special attributes */ if ((FileAttributes & FILE_ATTRIBUTE_DEVICE) != 0) { st->st_mode = S_IFBLK; st->st_desc = "device"; } else if ((FileAttributes & FILE_ATTRIBUTE_OFFLINE) != 0) { /* Offline */ st->st_mode = S_IFCHR; st->st_desc = "offline"; } else if ((FileAttributes & FILE_ATTRIBUTE_TEMPORARY) != 0) { /* Temporary */ st->st_mode = S_IFCHR; st->st_desc = "temporary"; } else if ((FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { /* Reparse point */ switch (ReparseTag) { /* if we don't have the ReparseTag information */ case 0 : /* don't set the st_mode, to set it later calling lstat_sync() */ st->st_mode = 0; st->st_desc = "unknown"; break; /* for deduplicated files, assume that they are regular ones */ case IO_REPARSE_TAG_DEDUP : if ((FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { st->st_mode = S_IFDIR; st->st_desc = "directory-dedup"; } else { st->st_mode = S_IFREG; st->st_desc = "regular-dedup"; } break; case IO_REPARSE_TAG_SYMLINK : if ((FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { st->st_mode = S_IFLNKDIR; st->st_desc = "reparse-point-symlink-dir"; } else { st->st_mode = S_IFLNK; st->st_desc = "reparse-point-symlink-file"; } break; /* all the other are skipped as reparse-point */ case IO_REPARSE_TAG_MOUNT_POINT : st->st_mode = S_IFCHR; st->st_desc = "reparse-point-mount"; break; case IO_REPARSE_TAG_NFS : st->st_mode = S_IFCHR; st->st_desc = "reparse-point-nfs"; break; default : st->st_mode = S_IFCHR; st->st_desc = "reparse-point"; break; } } else if ((FileAttributes & FILE_ATTRIBUTE_SYSTEM) != 0) { /* System */ if ((FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { st->st_mode = S_IFCHR; st->st_desc = "system-directory"; } else { st->st_mode = S_IFREG; st->st_desc = "system-file"; } } else { if ((FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { st->st_mode = S_IFDIR; st->st_desc = "directory"; } else { st->st_mode = S_IFREG; st->st_desc = "regular"; } } /* store the HIDDEN attribute in a separate field */ st->st_hidden = (FileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0; } /** * Convert Windows info to the Unix stat format. */ static int windows_info2stat(const BY_HANDLE_FILE_INFORMATION* info, const FILE_ATTRIBUTE_TAG_INFO* tag, struct windows_stat* st) { int64_t mtime; windows_attr2stat(info->dwFileAttributes, tag->ReparseTag, st); st->st_size = info->nFileSizeHigh; st->st_size <<= 32; st->st_size |= info->nFileSizeLow; mtime = info->ftLastWriteTime.dwHighDateTime; mtime <<= 32; mtime |= info->ftLastWriteTime.dwLowDateTime; /* * Convert to unix time * * How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME * http://support.microsoft.com/kb/167296 */ mtime -= 116444736000000000LL; st->st_mtime = mtime / 10000000; st->st_mtimensec = (mtime % 10000000) * 100; st->st_ino = info->nFileIndexHigh; st->st_ino <<= 32; st->st_ino |= info->nFileIndexLow; st->st_nlink = info->nNumberOfLinks; st->st_dev = info->dwVolumeSerialNumber; /* GetFileInformationByHandle() ensures to return synced information */ st->st_sync = 1; /** * In ReFS the IDs are 128 bit, and the 64 bit interface may fail. * * From Microsoft "Application Compatibility with ReFS" * http://download.microsoft.com/download/C/B/3/CB3561DC-6BF6-443D-B5B9-9676ACDF7F75/Application%20Compatibility%20with%20ReFS.docx * "64-bit file identifier can be obtained from GetFileInformationByHandle in" * "the nFileIndexHigh and nFileIndexLow members. This API is an extended version" * "that includes 128-bit file identifiers. If GetFileInformationByHandle returns" * "FILE_INVALID_FILE_ID, the identifier may only be described in 128 bit form." */ if (st->st_ino == (uint64_t)FILE_INVALID_FILE_ID) { errno = EINVAL; log_fatal(errno, "Invalid inode number! Is this ReFS?\n"); return -1; } return 0; } /** * Convert Windows info to the Unix stat format. */ static int windows_stream2stat(const BY_HANDLE_FILE_INFORMATION* info, const FILE_ID_BOTH_DIR_INFO* stream, struct windows_stat* st) { int64_t mtime; /* The FILE_ID_BOTH_DIR_INFO doesn't have the ReparseTag information */ /* we could use instead FILE_ID_EXTD_DIR_INFO, but it's available only */ /* from Windows Server 2012 */ windows_attr2stat(stream->FileAttributes, 0, st); st->st_size = stream->EndOfFile.QuadPart; mtime = stream->LastWriteTime.QuadPart; /* * Convert to unix time * * How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME * http://support.microsoft.com/kb/167296 */ mtime -= 116444736000000000LL; st->st_mtime = mtime / 10000000; st->st_mtimensec = (mtime % 10000000) * 100; st->st_ino = stream->FileId.QuadPart; st->st_nlink = info->nNumberOfLinks; st->st_dev = info->dwVolumeSerialNumber; /* directory listing doesn't ensure to return synced information */ st->st_sync = 0; /* in ReFS the IDs are 128 bit, and the 64 bit interface may fail */ if (st->st_ino == (uint64_t)FILE_INVALID_FILE_ID) { errno = EINVAL; log_fatal(errno, "Invalid inode number! Is this ReFS?\n"); return -1; } return 0; } /** * Convert Windows findfirst info to the Unix stat format. */ static void windows_finddata2stat(const WIN32_FIND_DATAW* info, struct windows_stat* st) { int64_t mtime; windows_attr2stat(info->dwFileAttributes, info->dwReserved0, st); st->st_size = info->nFileSizeHigh; st->st_size <<= 32; st->st_size |= info->nFileSizeLow; mtime = info->ftLastWriteTime.dwHighDateTime; mtime <<= 32; mtime |= info->ftLastWriteTime.dwLowDateTime; /* * Convert to unix time * * How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME * http://support.microsoft.com/kb/167296 */ mtime -= 116444736000000000LL; st->st_mtime = mtime / 10000000; st->st_mtimensec = (mtime % 10000000) * 100; /* No inode information available */ st->st_ino = 0; /* No link information available */ st->st_nlink = 0; /* No device information available */ st->st_dev = 0; /* directory listing doesn't ensure to return synced information */ st->st_sync = 0; } static void windows_finddata2dirent(const WIN32_FIND_DATAW* info, struct windows_dirent* dirent) { char conv_buf[CONV_MAX]; const char* name; size_t len; name = u16tou8ex(conv_buf, info->cFileName, wcslen(info->cFileName), &len); if (len + 1 >= sizeof(dirent->d_name)) { log_fatal(EINTERNAL, "Name too long\n"); exit(EXIT_FAILURE); } memcpy(dirent->d_name, name, len); dirent->d_name[len] = 0; windows_finddata2stat(info, &dirent->d_stat); } static int windows_stream2dirent(const BY_HANDLE_FILE_INFORMATION* info, const FILE_ID_BOTH_DIR_INFO* stream, struct windows_dirent* dirent) { char conv_buf[CONV_MAX]; const char* name; size_t len; name = u16tou8ex(conv_buf, stream->FileName, stream->FileNameLength / 2, &len); if (len + 1 >= sizeof(dirent->d_name)) { log_fatal(EINTERNAL, "Name too long\n"); exit(EXIT_FAILURE); } memcpy(dirent->d_name, name, len); dirent->d_name[len] = 0; return windows_stream2stat(info, stream, &dirent->d_stat); } /** * Convert Windows error to errno. */ static void windows_errno(DWORD error) { switch (error) { case ERROR_INVALID_HANDLE : /* we check for a bad handle calling _get_osfhandle() */ /* and in such case we return EBADF */ /* Other cases are here identified with EINVAL */ errno = EINVAL; break; case ERROR_HANDLE_EOF : /* in ReadFile() over the end of the file */ errno = EINVAL; break; case ERROR_FILE_NOT_FOUND : case ERROR_PATH_NOT_FOUND : /* in GetFileAttributeW() if internal path not found */ errno = ENOENT; break; case ERROR_ACCESS_DENIED : /* in CreateDirectoryW() if dir is scheduled for deletion */ case ERROR_CURRENT_DIRECTORY : /* in RemoveDirectoryW() if removing the current directory */ case ERROR_SHARING_VIOLATION : /* in RemoveDirectoryW() if in use */ case ERROR_WRITE_PROTECT : /* when dealing with read-only media/snapshot and trying to write to them */ errno = EACCES; break; case ERROR_ALREADY_EXISTS : /* in CreateDirectoryW() if already exists */ errno = EEXIST; break; case ERROR_DISK_FULL : errno = ENOSPC; break; case ERROR_BUFFER_OVERFLOW : errno = ENAMETOOLONG; break; case ERROR_NOT_ENOUGH_MEMORY : errno = ENOMEM; break; case ERROR_NOT_SUPPORTED : /* in CreateSymlinkW() if not present in kernel32 */ errno = ENOSYS; break; case ERROR_PRIVILEGE_NOT_HELD : /* in CreateSymlinkW() if no SeCreateSymbolicLinkPrivilige permission */ errno = EPERM; break; case ERROR_IO_DEVICE : /* in ReadFile() and WriteFile() */ case ERROR_CRC : /* in ReadFile() */ errno = EIO; break; default : errno = ENXIO; log_fatal(errno, "Unexpected Windows error %lu.\n", error); break; } } int windows_fstat(int fd, struct windows_stat* st) { BY_HANDLE_FILE_INFORMATION info; FILE_ATTRIBUTE_TAG_INFO tag; HANDLE h; h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } if (!GetFileInformationByHandle(h, &info)) { windows_errno(GetLastError()); return -1; } if (!GetReparseTagInfoByHandle(h, &tag, info.dwFileAttributes)) { windows_errno(GetLastError()); return -1; } return windows_info2stat(&info, &tag, st); } int windows_get_file_attributes(const char* file) { wchar_t conv_buf[CONV_MAX]; DWORD ret = GetFileAttributesW(convert(conv_buf, file)); if (ret == INVALID_FILE_ATTRIBUTES) { windows_errno(GetLastError()); return -1; } return ret; } int windows_set_file_attributes(const char* file, int attributes) { wchar_t conv_buf[CONV_MAX]; if (!SetFileAttributesW(convert(conv_buf, file), attributes)) { windows_errno(GetLastError()); return -1; } return 0; } int windows_lstat(const char* file, struct windows_stat* st) { wchar_t conv_buf[CONV_MAX]; HANDLE h; WIN32_FIND_DATAW data; /* FindFirstFileW by default gets information of symbolic links and not of their targets */ h = FindFirstFileW(convert(conv_buf, file), &data); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } if (!FindClose(h)) { windows_errno(GetLastError()); return -1; } windows_finddata2stat(&data, st); return 0; } void windows_dirent_lstat(const struct windows_dirent* dd, struct windows_stat* st) { memcpy(st, &dd->d_stat, sizeof(struct windows_stat)); } int windows_mkdir(const char* file) { wchar_t conv_buf[CONV_MAX]; if (!CreateDirectoryW(convert(conv_buf, file), 0)) { windows_errno(GetLastError()); return -1; } return 0; } int windows_rmdir(const char* file) { wchar_t conv_buf[CONV_MAX]; if (!RemoveDirectoryW(convert(conv_buf, file))) { windows_errno(GetLastError()); return -1; } return 0; } static BOOL GetFilePhysicalOffset(HANDLE h, uint64_t* physical) { STARTING_VCN_INPUT_BUFFER svib; unsigned char rpb_buffer[sizeof(RETRIEVAL_POINTERS_BUFFER)]; RETRIEVAL_POINTERS_BUFFER* rpb = (RETRIEVAL_POINTERS_BUFFER*)&rpb_buffer; BOOL ret; DWORD n; /* in Wine FSCTL_GET_RETRIEVAL_POINTERS is not supported */ if (is_wine) { *physical = FILEPHY_UNREPORTED_OFFSET; return TRUE; } /* set the output variable, just to be safe */ rpb->ExtentCount = 0; /* read the physical address */ svib.StartingVcn.QuadPart = 0; ret = DeviceIoControl(h, FSCTL_GET_RETRIEVAL_POINTERS, &svib, sizeof(svib), rpb_buffer, sizeof(rpb_buffer), &n, 0); if (!ret) { DWORD error = GetLastError(); if (error == ERROR_MORE_DATA) { /* we ignore ERROR_MODE_DATA because we are interested only at the first entry */ /* and this is the expected error if the files has more entries */ } else if (error == ERROR_HANDLE_EOF) { /* if the file is small, it can be stored in the Master File Table (MFT) */ /* and then it doesn't have a physical address */ /* In such case we report a specific fake address, to report this special condition */ /* that it's different from the 0 offset reported by the underline file system */ *physical = FILEPHY_WITHOUT_OFFSET; return TRUE; } else if (error == ERROR_NOT_SUPPORTED) { /* for disks shared on network this operation is not supported */ *physical = FILEPHY_UNREPORTED_OFFSET; return TRUE; } else { return FALSE; } } if (rpb->ExtentCount < 1) *physical = FILEPHY_UNREPORTED_OFFSET; else *physical = rpb->Extents[0].Lcn.QuadPart + FILEPHY_REAL_OFFSET; return TRUE; } int lstat_sync(const char* file, struct windows_stat* st, uint64_t* physical) { wchar_t conv_buf[CONV_MAX]; BY_HANDLE_FILE_INFORMATION info; FILE_ATTRIBUTE_TAG_INFO tag; HANDLE h; /* * Open the handle of the file. * * Use FILE_FLAG_BACKUP_SEMANTICS to open directories (it's just ignored for files). * Use FILE_FLAG_OPEN_REPARSE_POINT to open symbolic links and not the their target. * * Note that even with FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, * and FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT some paths * cannot be opened like "C:\System Volume Information" resulting * in error ERROR_ACCESS_DENIED. */ h = CreateFileW(convert(conv_buf, file), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } if (!GetFileInformationByHandle(h, &info)) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); return -1; } if (!GetReparseTagInfoByHandle(h, &tag, info.dwFileAttributes)) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); return -1; } /* read the physical offset, only if a pointer is provided */ if (physical != 0) { if (!GetFilePhysicalOffset(h, physical)) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); return -1; } } if (!CloseHandle(h)) { windows_errno(GetLastError()); return -1; } return windows_info2stat(&info, &tag, st); } int windows_stat(const char* file, struct windows_stat* st) { wchar_t conv_buf[CONV_MAX]; BY_HANDLE_FILE_INFORMATION info; FILE_ATTRIBUTE_TAG_INFO tag; HANDLE h; /* * Open the handle of the file. * * Use FILE_FLAG_BACKUP_SEMANTICS to open directories (it's just ignored for files). */ h = CreateFileW(convert(conv_buf, file), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } if (!GetFileInformationByHandle(h, &info)) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); return -1; } if (!GetReparseTagInfoByHandle(h, &tag, info.dwFileAttributes)) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); return -1; } if (!CloseHandle(h)) { windows_errno(GetLastError()); return -1; } return windows_info2stat(&info, &tag, st); } int windows_ftruncate(int fd, off64_t off) { HANDLE h; LARGE_INTEGER pos; if (fd == -1) { errno = EBADF; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } pos.QuadPart = off; if (!SetFilePointerEx(h, pos, 0, FILE_BEGIN)) { windows_errno(GetLastError()); return -1; } /* * Windows effectively reserves space, but it doesn't initialize it. * It's then important to write starting from the begin to the end, * to avoid to have Windows to fill the holes writing zeros. * * See: * "Why does my single-byte write take forever?" * http://blogs.msdn.com/b/oldnewthing/archive/2011/09/22/10215053.aspx */ if (!SetEndOfFile(h)) { windows_errno(GetLastError()); return -1; } return 0; } int windows_fallocate(int fd, int mode, off64_t off, off64_t len) { if (mode != 0) return -1; /* no difference with ftruncate because Windows doesn't use sparse files */ return windows_ftruncate(fd, off + len); } int windows_fsync(int fd) { HANDLE h; if (fd == -1) { errno = EBADF; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } /* * "The FlushFileBuffers API can be used to flush all the outstanding data * and metadata on a single file or a whole volume. However, frequent use * of this API can cause reduced throughput. Internally, Windows uses the * SCSI Synchronize Cache or the IDE/ATAPI Flush cache commands." * * From: * "Windows Write Caching - Part 2 An overview for Application Developers" * http://winntfs.com/2012/11/29/windows-write-caching-part-2-an-overview-for-application-developers/ */ if (!FlushFileBuffers(h)) { DWORD error = GetLastError(); switch (error) { case ERROR_INVALID_HANDLE : /* * FlushFileBuffers returns this error if the handle * doesn't support buffering, like the console output. * * We had a report that also ATA-over-Ethernet returns * this error, but not enough sure to ignore it. * So, we use now an extended error reporting. */ windows_errno(error); log_fatal(errno, "Unexpected Windows INVALID_HANDLE error in FlushFileBuffers().\n"); log_fatal(errno, "Are you using ATA-over-Ethernet ? Please report it.\n"); return -1; case ERROR_ACCESS_DENIED : /* * FlushFileBuffers returns this error for read-only * data, that cannot have to be flushed. */ return 0; default : windows_errno(error); return -1; } } return 0; } static int windows_vsync(const wchar_t* volume) { HANDLE h; DWORD bytes; /* open the volume (volumeName already in \\?\Volume{GUID} format) */ h = CreateFileW(volume, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } /* * "The FlushFileBuffers API can be used to flush all the outstanding data * and metadata on a single file or a whole volume. However, frequent use * of this API can cause reduced throughput. Internally, Windows uses the * SCSI Synchronize Cache or the IDE/ATAPI Flush cache commands." * * From: * "Windows Write Caching - Part 2 An overview for Application Developers" * http://winntfs.com/2012/11/29/windows-write-caching-part-2-an-overview-for-application-developers/ */ if (!FlushFileBuffers(h)) { DWORD error = GetLastError(); CloseHandle(h); switch (error) { case ERROR_INVALID_HANDLE : /* * FlushFileBuffers returns this error if the handle * doesn't support buffering, like the console output. * * We had a report that also ATA-over-Ethernet returns * this error, but not enough sure to ignore it. * So, we use now an extended error reporting. */ windows_errno(error); log_fatal(errno, "Unexpected Windows INVALID_HANDLE error in FlushFileBuffers().\n"); log_fatal(errno, "Are you using ATA-over-Ethernet ? Please report it.\n"); return -1; case ERROR_ACCESS_DENIED : /* * FlushFileBuffers returns this error for read-only * data, that cannot have to be flushed. */ return 0; default : windows_errno(error); return -1; } } /* lock the volume (may fail if volume is in use, which is fine) */ if (!DeviceIoControl(h, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &bytes, NULL)) { DWORD error = GetLastError(); CloseHandle(h); switch (error) { case ERROR_ACCESS_DENIED : /* * ERROR_ACCESS_DENIED (5) means volume is in use - this is expected and OK */ return 0; default : windows_errno(error); return -1; } } /* unlock immediately - the lock/unlock cycle helps ensure consistency */ if (!DeviceIoControl(h, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &bytes, NULL)) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); return -1; } if (!CloseHandle(h)) { windows_errno(GetLastError()); return -1; } return 0; } static int windows_async(void) { HANDLE h; wchar_t volume[MAX_PATH]; DWORD error = 0; DWORD count = 0; DWORD success = 0; h = FindFirstVolumeW(volume, sizeof(volume) / sizeof(wchar_t)); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } do { /* remove trailing backslash */ size_t len = wcslen(volume); if (len > 0 && volume[len - 1] == L'\\') volume[len - 1] = L'\0'; ++count; if (windows_vsync(volume) == 0) { ++success; } else { /* save the first error */ if (error == 0) error = GetLastError(); } } while (FindNextVolumeW(h, volume, sizeof(volume) / sizeof(wchar_t))); /* if at least one failed */ if (count != success) { FindVolumeClose(h); windows_errno(error); return -1; } error = GetLastError(); if (error != ERROR_NO_MORE_FILES) { FindVolumeClose(h); windows_errno(error); return -1; } if (!FindVolumeClose(h)) { windows_errno(GetLastError()); return -1; } return 0; } int windows_sync(void) { if (windows_async() != 0) return -1; return 0; } int windows_futimens(int fd, struct windows_timespec tv[2]) { HANDLE h; FILETIME ft; int64_t mtime; if (fd == -1) { errno = EBADF; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } /* * Convert to windows time * * How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME * http://support.microsoft.com/kb/167296 */ mtime = tv[0].tv_sec; mtime *= 10000000; mtime += tv[0].tv_nsec / 100; mtime += 116444736000000000LL; ft.dwHighDateTime = mtime >> 32; ft.dwLowDateTime = mtime; if (!SetFileTime(h, 0, 0, &ft)) { windows_errno(GetLastError()); return -1; } return 0; } int windows_utimensat(int fd, const char* file, struct windows_timespec tv[2], int flags) { wchar_t conv_buf[CONV_MAX]; HANDLE h; FILETIME ft; int64_t mtime; DWORD wflags; /* * Support only the absolute paths */ if (fd != AT_FDCWD) { errno = EBADF; return -1; } /* * Open the handle of the file. * * Use FILE_FLAG_BACKUP_SEMANTICS to open directories (it's just ignored for files). * Use FILE_FLAG_OPEN_REPARSE_POINT to open symbolic links and not the their target. * * Note that even with FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, * and FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT some paths * cannot be opened like "C:\System Volume Information" resulting * in error ERROR_ACCESS_DENIED. */ wflags = FILE_FLAG_BACKUP_SEMANTICS; if ((flags & AT_SYMLINK_NOFOLLOW) != 0) wflags |= FILE_FLAG_OPEN_REPARSE_POINT; h = CreateFileW(convert(conv_buf, file), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, wflags, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } /* * Convert to windows time * * How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME * http://support.microsoft.com/kb/167296 */ mtime = tv[0].tv_sec; mtime *= 10000000; mtime += tv[0].tv_nsec / 100; mtime += 116444736000000000LL; ft.dwHighDateTime = mtime >> 32; ft.dwLowDateTime = mtime; if (!SetFileTime(h, 0, 0, &ft)) { windows_errno(GetLastError()); CloseHandle(h); return -1; } if (!CloseHandle(h)) { windows_errno(GetLastError()); return -1; } return 0; } int windows_rename(const char* from, const char* to) { wchar_t conv_buf_from[CONV_MAX]; wchar_t conv_buf_to[CONV_MAX]; /* * Implements an atomic rename in Windows. * Not really atomic at now to support XP. * * Is an atomic file rename (with overwrite) possible on Windows? * http://stackoverflow.com/questions/167414/is-an-atomic-file-rename-with-overwrite-possible-on-windows */ if (!MoveFileExW(convert(conv_buf_from, from), convert(conv_buf_to, to), MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH)) { windows_errno(GetLastError()); return -1; } return 0; } int windows_remove(const char* file) { wchar_t conv_buf[CONV_MAX]; if (!DeleteFileW(convert(conv_buf, file))) { windows_errno(GetLastError()); return -1; } return 0; } FILE* windows_fopen(const char* file, const char* mode) { wchar_t conv_buf_file[CONV_MAX]; wchar_t conv_buf_mode[CONV_MAX]; return _wfopen(convert(conv_buf_file, file), u8tou16(conv_buf_mode, mode)); } int windows_open(const char* file, int flags, ...) { wchar_t conv_buf[CONV_MAX]; HANDLE h; int f; DWORD access; DWORD share; DWORD create; DWORD attr; switch (flags & O_ACCMODE) { case O_RDONLY : access = GENERIC_READ; break; case O_WRONLY : access = GENERIC_WRITE; break; case O_RDWR : access = GENERIC_READ | GENERIC_WRITE; break; default : errno = EINVAL; return -1; } share = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; switch (flags & (O_CREAT | O_EXCL | O_TRUNC)) { case 0 : create = OPEN_EXISTING; break; case O_CREAT : create = OPEN_ALWAYS; break; case O_CREAT | O_EXCL : case O_CREAT | O_EXCL | O_TRUNC : create = CREATE_NEW; break; case O_CREAT | O_TRUNC : create = CREATE_ALWAYS; break; case O_TRUNC : create = TRUNCATE_EXISTING; break; default : errno = EINVAL; return -1; } attr = FILE_ATTRIBUTE_NORMAL; if ((flags & O_DIRECT) != 0) attr |= FILE_FLAG_NO_BUFFERING; if ((flags & O_DSYNC) != 0) attr |= FILE_FLAG_WRITE_THROUGH; if ((flags & O_RANDOM) != 0) attr |= FILE_FLAG_RANDOM_ACCESS; if ((flags & O_SEQUENTIAL) != 0) attr |= FILE_FLAG_SEQUENTIAL_SCAN; if ((flags & _O_SHORT_LIVED) != 0) attr |= FILE_ATTRIBUTE_TEMPORARY; if ((flags & O_TEMPORARY) != 0) attr |= FILE_FLAG_DELETE_ON_CLOSE; h = CreateFileW(convert(conv_buf, file), access, share, 0, create, attr, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } /* mask out flags unknown by Windows */ flags &= ~(O_DIRECT | O_DSYNC); f = _open_osfhandle((intptr_t)h, flags); if (f == -1) { CloseHandle(h); return -1; } return f; } struct windows_dir_struct { BY_HANDLE_FILE_INFORMATION info; WIN32_FIND_DATAW find; HANDLE h; struct windows_dirent entry; unsigned char* buffer; unsigned buffer_size; unsigned buffer_pos; int state; }; #define DIR_STATE_EOF -1 /**< End of the dir stream */ #define DIR_STATE_EMPTY 0 /**< The entry is empty. */ #define DIR_STATE_FILLED 1 /**< The entry is valid. */ static windows_dir* windows_opendir_find(const char* dir) { wchar_t conv_buf[CONV_MAX]; wchar_t* wdir; windows_dir* dirstream; size_t len; dirstream = malloc(sizeof(windows_dir)); if (!dirstream) { log_fatal(EFAULT, "Low memory\n"); exit(EXIT_FAILURE); } wdir = convert(conv_buf, dir); /* add final / and * */ len = wcslen(wdir); if (len != 0 && wdir[len - 1] != '\\') wdir[len++] = L'\\'; wdir[len++] = L'*'; wdir[len++] = 0; dirstream->h = FindFirstFileW(wdir, &dirstream->find); if (dirstream->h == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); if (error == ERROR_FILE_NOT_FOUND) { dirstream->state = DIR_STATE_EOF; return dirstream; } free(dirstream); windows_errno(error); return 0; } windows_finddata2dirent(&dirstream->find, &dirstream->entry); dirstream->state = DIR_STATE_FILLED; return dirstream; } static struct windows_dirent* windows_readdir_find(windows_dir* dirstream) { if (dirstream->state == DIR_STATE_EMPTY) { if (!FindNextFileW(dirstream->h, &dirstream->find)) { DWORD error = GetLastError(); if (error != ERROR_NO_MORE_FILES) { windows_errno(error); return 0; } dirstream->state = DIR_STATE_EOF; } else { windows_finddata2dirent(&dirstream->find, &dirstream->entry); dirstream->state = DIR_STATE_FILLED; } } if (dirstream->state == DIR_STATE_FILLED) { dirstream->state = DIR_STATE_EMPTY; return &dirstream->entry; } /* otherwise it's the end of stream */ assert(dirstream->state == DIR_STATE_EOF); errno = 0; return 0; } static int windows_closedir_find(windows_dir* dirstream) { if (dirstream->h != INVALID_HANDLE_VALUE) { if (!FindClose(dirstream->h)) { DWORD error = GetLastError(); free(dirstream); windows_errno(error); return -1; } } free(dirstream); return 0; } static int windows_first_stream(windows_dir* dirstream) { FILE_ID_BOTH_DIR_INFO* fd; if (!GetFileInformationByHandleEx(dirstream->h, FileIdBothDirectoryInfo, dirstream->buffer, dirstream->buffer_size)) { DWORD error = GetLastError(); if (error == ERROR_NO_MORE_FILES) { dirstream->state = DIR_STATE_EOF; return 0; } windows_errno(error); return -1; } /* get the first entry */ dirstream->state = DIR_STATE_FILLED; dirstream->buffer_pos = 0; fd = (FILE_ID_BOTH_DIR_INFO*)dirstream->buffer; return windows_stream2dirent(&dirstream->info, fd, &dirstream->entry); } static int windows_next_stream(windows_dir* dirstream) { FILE_ID_BOTH_DIR_INFO* fd; /* last entry read */ fd = (FILE_ID_BOTH_DIR_INFO*)(dirstream->buffer + dirstream->buffer_pos); /* check if there is a next one */ if (fd->NextEntryOffset == 0) { /* if not, fill it up again */ if (windows_first_stream(dirstream) != 0) return -1; return 0; } /* go to the next one */ dirstream->state = DIR_STATE_FILLED; dirstream->buffer_pos += fd->NextEntryOffset; fd = (FILE_ID_BOTH_DIR_INFO*)(dirstream->buffer + dirstream->buffer_pos); return windows_stream2dirent(&dirstream->info, fd, &dirstream->entry); } static windows_dir* windows_opendir_stream(const char* dir) { wchar_t conv_buf[CONV_MAX]; windows_dir* dirstream; WCHAR* wdir; dirstream = malloc(sizeof(windows_dir)); if (!dirstream) { log_fatal(EFAULT, "Low memory\n"); exit(EXIT_FAILURE); } wdir = convert(conv_buf, dir); /* uses a 64 kB buffer for reading directory */ dirstream->buffer_size = 64 * 1024; dirstream->buffer = malloc(dirstream->buffer_size); if (!dirstream->buffer) { log_fatal(EFAULT, "Low memory\n"); exit(EXIT_FAILURE); } dirstream->h = CreateFileW(wdir, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if (dirstream->h == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); free(dirstream->buffer); free(dirstream); windows_errno(error); return 0; } /* get dir information for the VolumeSerialNumber */ /* this value is used for all the files in the dir */ if (!GetFileInformationByHandle(dirstream->h, &dirstream->info)) { DWORD error = GetLastError(); CloseHandle(dirstream->h); free(dirstream->buffer); free(dirstream); windows_errno(error); return 0; } if (windows_first_stream(dirstream) != 0) { CloseHandle(dirstream->h); free(dirstream->buffer); free(dirstream); return 0; } return dirstream; } static struct windows_dirent* windows_readdir_stream(windows_dir* dirstream) { if (dirstream->state == DIR_STATE_EMPTY) { if (windows_next_stream(dirstream) != 0) return 0; } if (dirstream->state == DIR_STATE_FILLED) { dirstream->state = DIR_STATE_EMPTY; return &dirstream->entry; } /* otherwise it's the end of stream */ assert(dirstream->state == DIR_STATE_EOF); errno = 0; return 0; } static int windows_closedir_stream(windows_dir* dirstream) { if (dirstream->h != INVALID_HANDLE_VALUE) { if (!CloseHandle(dirstream->h)) { DWORD error = GetLastError(); free(dirstream->buffer); free(dirstream); windows_errno(error); return -1; } } free(dirstream->buffer); free(dirstream); return 0; } windows_dir* windows_opendir(const char* dir) { if (!is_scan_winfind) return windows_opendir_stream(dir); else return windows_opendir_find(dir); } struct windows_dirent* windows_readdir(windows_dir* dirstream) { if (!is_scan_winfind) return windows_readdir_stream(dirstream); else return windows_readdir_find(dirstream); } int windows_closedir(windows_dir* dirstream) { if (!is_scan_winfind) return windows_closedir_stream(dirstream); else return windows_closedir_find(dirstream); } int windows_dirent_hidden(struct dirent* dd) { return dd->d_stat.st_hidden; } const char* windows_stat_desc(struct stat* st) { return st->st_desc; } unsigned windows_sleep(unsigned seconds) { while (seconds) { if (global_interrupt) /* SIGINT should stop the sleep */ break; Sleep(1000); --seconds; } return seconds; } void windows_usleep(uint64_t useconds) { Sleep(useconds / 1000); } int windows_link(const char* existing, const char* file) { wchar_t conv_buf_file[CONV_MAX]; wchar_t conv_buf_existing[CONV_MAX]; if (!CreateHardLinkW(convert(conv_buf_file, file), convert(conv_buf_existing, existing), 0)) { windows_errno(GetLastError()); return -1; } return 0; } /** * In Windows 10 allow creation of symlink by not privileged user. * * See: Symlinks in Windows 10! * https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/#cQG7cx48oGH86lkI.97 * "Specify this flag to allow creation of symbolic links when the process is not elevated" */ #ifndef SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE #define SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE 0x2 #endif int windows_symlink(const char* existing, const char* file) { wchar_t conv_buf_file[CONV_MAX]; wchar_t conv_buf_existing[CONV_MAX]; /* We must convert to the extended-length \\?\ format if the path is too long */ /* otherwise the link creation fails. */ /* But we don't want to always convert it, to avoid to recreate */ /* user symlinks different than they were before */ if (!CreateSymbolicLinkW(convert(conv_buf_file, file), convert_if_required(conv_buf_existing, existing), SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE) ) { DWORD error = GetLastError(); if (GetLastError() != ERROR_INVALID_PARAMETER) { windows_errno(error); return -1; } /* retry without the new flag SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE */ if (!CreateSymbolicLinkW(convert(conv_buf_file, file), convert_if_required(conv_buf_existing, existing), 0)) { windows_errno(GetLastError()); return -1; } } return 0; } /* Adds missing definitions in MingW winnt.h */ #ifndef FSCTL_GET_REPARSE_POINT #define FSCTL_GET_REPARSE_POINT 0x000900a8 #endif #ifndef REPARSE_DATA_BUFFER_HEADER_SIZE typedef struct _REPARSE_DATA_BUFFER { DWORD ReparseTag; WORD ReparseDataLength; WORD Reserved; _ANONYMOUS_UNION union { struct { WORD SubstituteNameOffset; WORD SubstituteNameLength; WORD PrintNameOffset; WORD PrintNameLength; ULONG Flags; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { WORD SubstituteNameOffset; WORD SubstituteNameLength; WORD PrintNameOffset; WORD PrintNameLength; WCHAR PathBuffer[1]; } MountPointReparseBuffer; struct { BYTE DataBuffer[1]; } GenericReparseBuffer; } DUMMYUNIONNAME; } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; #endif int windows_readlink(const char* file, char* buffer, size_t size) { wchar_t conv_buf_file[CONV_MAX]; char conv_buf_name[CONV_MAX]; HANDLE h; const char* name; size_t len; unsigned char rdb_buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; REPARSE_DATA_BUFFER* rdb = (REPARSE_DATA_BUFFER*)rdb_buffer; BOOL ret; DWORD n; /* * Open the handle of the file. * * Use FILE_FLAG_BACKUP_SEMANTICS to open directories (it's just ignored for files). * Use FILE_FLAG_OPEN_REPARSE_POINT to open symbolic links and not the their target. */ h = CreateFileW(convert(conv_buf_file, file), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } /* read the reparse point */ ret = DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, 0, 0, rdb_buffer, sizeof(rdb_buffer), &n, 0); if (!ret) { windows_errno(GetLastError()); CloseHandle(h); return -1; } CloseHandle(h); /* check if it's really a symbolic link */ if (rdb->ReparseTag != IO_REPARSE_TAG_SYMLINK) { errno = EINVAL; return -1; } /* convert the name to UTF-8 */ name = u16tou8ex(conv_buf_name, rdb->SymbolicLinkReparseBuffer.PathBuffer + rdb->SymbolicLinkReparseBuffer.PrintNameOffset, rdb->SymbolicLinkReparseBuffer.PrintNameLength / 2, &len); /* check for overflow */ if (len > size) { len = size; } memcpy(buffer, name, len); return len; } int devuuid(uint64_t device, const char* path, char* uuid, size_t uuid_size) { (void)path; /* just use the volume serial number returned in the device parameter */ snprintf(uuid, uuid_size, "%08x", (unsigned)device); log_tag("uuid:windows:%u:%s:\n", (unsigned)device, uuid); return 0; } int filephy(const char* file, uint64_t size, uint64_t* physical) { wchar_t conv_buf[CONV_MAX]; HANDLE h; (void)size; /* open the handle of the file */ h = CreateFileW(convert(conv_buf, file), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } if (!GetFilePhysicalOffset(h, physical)) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); return -1; } CloseHandle(h); return 0; } int fsinfo(const char* path, int* has_persistent_inode, int* has_syncronized_hardlinks, uint64_t* total_space, uint64_t* free_space, char* fstype, size_t fstype_size, char* fslabel, size_t fslabel_size) { wchar_t conv_buf[CONV_MAX]; /* all FAT/exFAT/NTFS when managed from Windows have persistent inodes */ if (has_persistent_inode) *has_persistent_inode = 1; /* NTFS doesn't synchronize hardlinks metadata */ if (has_syncronized_hardlinks) *has_syncronized_hardlinks = 0; if (free_space || total_space) { ULARGE_INTEGER total_bytes; ULARGE_INTEGER total_free_bytes; DWORD attr; char dir[PATH_MAX]; if (strlen(path) + 1 > sizeof(dir)) { windows_errno(ERROR_BUFFER_OVERFLOW); return -1; } strcpy(dir, path); /* get the file attributes */ attr = GetFileAttributesW(convert(conv_buf, dir)); if (attr == INVALID_FILE_ATTRIBUTES) { DWORD error = GetLastError(); if (error != ERROR_FILE_NOT_FOUND) { windows_errno(error); return -1; } /* if it doesn't exist, we assume a file */ /* and we check for the containing dir */ attr = 0; } /* if it's not a directory, truncate the file name */ if ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0) { char* slash = strrchr(dir, '/'); /** * Cut the file name, but leave the last slash. * * This is done because a MSDN comment about using of UNC paths. * * MSDN 'GetDiskFreeSpaceEx function' * http://msdn.microsoft.com/en-us/library/windows/desktop/aa364937%28v=vs.85%29.aspx * If this parameter is a UNC name, it must include a trailing backslash, * for example, "\\MyServer\MyShare\". */ if (slash) slash[1] = 0; } /* get the free space of the directory */ /* note that it must be a directory */ if (!GetDiskFreeSpaceExW(convert(conv_buf, dir), 0, &total_bytes, &total_free_bytes)) { windows_errno(GetLastError()); return -1; } if (total_space) *total_space = total_bytes.QuadPart; if (free_space) *free_space = total_free_bytes.QuadPart; } if (fstype && fslabel) { wchar_t volume_root[MAX_PATH]; wchar_t fs_name[MAX_PATH]; wchar_t vol_name[MAX_PATH]; fstype[0] = 0; fslabel[0] = 0; if (GetVolumePathNameW(convert(conv_buf, path), volume_root, MAX_PATH)) { if (GetVolumeInformationW(volume_root, vol_name, MAX_PATH, 0, 0, 0, fs_name, MAX_PATH)) { char u8[CONV_MAX]; size_t len; char* ret; ret = u16tou8ex_may_fail(u8, fs_name, wcslen(fs_name), &len); if (ret != 0 && len + 1 <= fstype_size) { memcpy(fstype, u8, len); fstype[len] = 0; } ret = u16tou8ex_may_fail(u8, vol_name, wcslen(vol_name), &len); if (ret != 0 && len + 1 <= fslabel_size) { memcpy(fslabel, u8, len); fslabel[len] = 0; } } } } return 0; } /* ensure to call the real C strerror() */ #undef strerror const char* windows_strerror(int err) { /* get the normal C error from the specified err */ char* error; char* previous; const char* str = strerror(err); size_t len = strlen(str); /* adds space for GetLastError() */ len += 32; /* allocate a new one */ error = malloc(len); if (!error) return str; snprintf(error, len, "%s [%d/%u]", str, err, (unsigned)GetLastError()); /* get previous one, if any */ previous = windows_getspecific(last_error); /* store in the thread local storage */ if (windows_setspecific(last_error, error) != 0) { free(error); return str; } free(previous); return error; } ssize_t windows_read(int fd, void* buffer, size_t size) { HANDLE h; DWORD count; if (fd == -1) { errno = EBADF; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } if (!ReadFile(h, buffer, size, &count, 0)) { windows_errno(GetLastError()); return -1; } return count; } ssize_t windows_write(int fd, const void* buffer, size_t size) { HANDLE h; DWORD count; if (fd == -1) { errno = EBADF; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } if (!WriteFile(h, buffer, size, &count, 0)) { windows_errno(GetLastError()); return -1; } return count; } off_t windows_lseek(int fd, off_t offset, int whence) { HANDLE h; LARGE_INTEGER pos; LARGE_INTEGER ret; if (fd == -1) { errno = EBADF; return -1; } /* we support only SEEK_SET */ if (whence != SEEK_SET) { errno = EINVAL; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } pos.QuadPart = offset; if (!SetFilePointerEx(h, pos, &ret, FILE_BEGIN)) { windows_errno(GetLastError()); return -1; } return ret.QuadPart; } ssize_t windows_pread(int fd, void* buffer, size_t size, off_t offset) { HANDLE h; OVERLAPPED overlapped; DWORD count; if (fd == -1) { errno = EBADF; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } retry: memset(&overlapped, 0, sizeof(overlapped)); overlapped.Offset = offset & 0xFFFFFFFF; overlapped.OffsetHigh = offset >> 32; if (!ReadFile(h, buffer, size, &count, &overlapped)) { DWORD err = GetLastError(); /* * If Windows is not able to allocate memory from the PagedPool for the disk cache * it could return the ERROR_NO_SYSTEM_RESOURCES error. * In this case, the only possibility is to retry after a wait of few milliseconds. * * SQL Server reports operating system error 1450 or 1452 or 665 (retries) * http://blogs.msdn.com/b/psssql/archive/2008/07/10/sql-server-reports-operating-system-error-1450-or-1452-or-665-retries.aspx * * 03-12-09 - ERROR_NO_SYSTEM_RESOURCES * http://cbloomrants.blogspot.it/2009/03/03-12-09-errornosystemresources.html * * From SnapRAID Discussion Forum: * * Error reading file * https://sourceforge.net/p/snapraid/discussion/1677233/thread/6657fdbf/ * * Unexpected Windows ERROR_NO_SYSTEM_RESOURCES in pwrite(), retrying... * https://sourceforge.net/p/snapraid/discussion/1677233/thread/a7c25ba9/ */ if (err == ERROR_NO_SYSTEM_RESOURCES) { log_fatal(EEXTERNAL, "Unexpected Windows ERROR_NO_SYSTEM_RESOURCES in pread(), retrying...\n"); Sleep(50); goto retry; } windows_errno(err); return -1; } return count; } ssize_t windows_pwrite(int fd, const void* buffer, size_t size, off_t offset) { HANDLE h; OVERLAPPED overlapped; DWORD count; if (fd == -1) { errno = EBADF; return -1; } h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } retry: memset(&overlapped, 0, sizeof(overlapped)); overlapped.Offset = offset & 0xFFFFFFFF; overlapped.OffsetHigh = offset >> 32; if (!WriteFile(h, buffer, size, &count, &overlapped)) { DWORD err = GetLastError(); /* See windows_pread() for comments on this error management */ if (err == ERROR_NO_SYSTEM_RESOURCES) { log_fatal(EEXTERNAL, "Unexpected Windows ERROR_NO_SYSTEM_RESOURCES in pwrite(), retrying...\n"); Sleep(50); goto retry; } windows_errno(err); return -1; } return count; } size_t windows_direct_size(void) { SYSTEM_INFO si; GetSystemInfo(&si); /* * MSDN 'File Buffering' * https://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx * * "Therefore, in most situations, page-aligned memory will also be sector-aligned," * "because the case where the sector size is larger than the page size is rare." */ return si.dwPageSize; } uint64_t os_tick(void) { LARGE_INTEGER t; uint64_t r; /* * Ensure to return a strict monotone os_tick counter. * * We had reports of invalid stats due faulty High Precision Event Timer. * See: https://sourceforge.net/p/snapraid/discussion/1677233/thread/a2122fd6/ */ windows_mutex_lock(&tick_lock); /* * MSDN 'QueryPerformanceCounter' * "On systems that run Windows XP or later, the function" * "will always succeed and will thus never return zero." */ r = 0; if (QueryPerformanceCounter(&t)) r = t.QuadPart; if (r < tick_last) r = tick_last; tick_last = r; windows_mutex_unlock(&tick_lock); return r; } uint64_t os_tick_ms(void) { return GetTickCount64(); } int randomize(void* void_ptr, size_t size) { size_t i; unsigned char* ptr = void_ptr; /* try RtlGenRandom */ if (ptr_RtlGenRandom != 0 && ptr_RtlGenRandom(ptr, size) != 0) return 0; /* fallback to standard rand */ for (i = 0; i < size; ++i) ptr[i] = random_u8(); return 0; } /** * Get the device file from a path inside the device. */ static int devresolve(const char* mount, char* file, size_t file_size, char* wfile, size_t wfile_size) { wchar_t conv_buf_mount[CONV_MAX]; char conv_buf_volume_guid[CONV_MAX]; WCHAR volume_mount[MAX_PATH]; WCHAR volume_guid[MAX_PATH]; DWORD i; char* p; /* get the volume mount point from the disk path */ if (!GetVolumePathNameW(convert(conv_buf_mount, mount), volume_mount, sizeof(volume_mount) / sizeof(WCHAR))) { windows_errno(GetLastError()); return -1; } /* get the volume GUID path from the mount point */ if (!GetVolumeNameForVolumeMountPointW(volume_mount, volume_guid, sizeof(volume_guid) / sizeof(WCHAR))) { windows_errno(GetLastError()); return -1; } /* remove the final slash, otherwise CreateFile() opens the file-system */ /* and not the volume */ i = 0; while (volume_guid[i] != 0) ++i; if (i != 0 && volume_guid[i - 1] == '\\') volume_guid[i - 1] = 0; pathcpy(wfile, wfile_size, u16tou8(conv_buf_volume_guid, volume_guid)); /* get the GUID start { */ p = strchr(wfile, '{'); if (!p) p = wfile; else ++p; pathprint(file, file_size, "/dev/vol%s", p); /* cut GUID end } */ p = strrchr(file, '}'); if (p) *p = 0; return 0; } /** * Read a device tree filling the specified list of disk_t entries. */ static int devtree(devinfo_t* parent, tommy_list* list) { wchar_t conv_buf[CONV_MAX]; HANDLE h; unsigned char vde_buffer[sizeof(VOLUME_DISK_EXTENTS)]; VOLUME_DISK_EXTENTS* vde = (VOLUME_DISK_EXTENTS*)&vde_buffer; unsigned vde_size = sizeof(vde_buffer); void* vde_alloc = 0; BOOL ret; DWORD n; DWORD i; /* open the volume */ h = CreateFileW(convert(conv_buf, parent->wfile), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; } /* get the physical extents of the volume */ ret = DeviceIoControl(h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0, 0, vde, vde_size, &n, 0); if (!ret) { DWORD error = GetLastError(); if (error != ERROR_MORE_DATA) { CloseHandle(h); windows_errno(error); return -1; } /* more than one extends, allocate more space */ vde_size = sizeof(VOLUME_DISK_EXTENTS) + vde->NumberOfDiskExtents * sizeof(DISK_EXTENT); vde_alloc = malloc_nofail(vde_size); vde = vde_alloc; /* retry with more space */ ret = DeviceIoControl(h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0, 0, vde, vde_size, &n, 0); } if (!ret) { DWORD error = GetLastError(); CloseHandle(h); free(vde_alloc); windows_errno(error); return -1; } for (i = 0; i < vde->NumberOfDiskExtents; ++i) { devinfo_t* devinfo; devinfo = calloc_nofail(1, sizeof(devinfo_t)); pathcpy(devinfo->name, sizeof(devinfo->name), parent->name); pathcpy(devinfo->smartctl, sizeof(devinfo->smartctl), parent->smartctl); memcpy(devinfo->smartignore, parent->smartignore, sizeof(devinfo->smartignore)); devinfo->device = vde->Extents[i].DiskNumber; pathprint(devinfo->file, sizeof(devinfo->file), "/dev/pd%" PRIu64, devinfo->device); pathprint(devinfo->wfile, sizeof(devinfo->wfile), "\\\\.\\PhysicalDrive%" PRIu64, devinfo->device); devinfo->parent = parent; /* insert in the list */ tommy_list_insert_tail(list, &devinfo->node, devinfo); } if (!CloseHandle(h)) { windows_errno(GetLastError()); free(vde_alloc); return -1; } free(vde_alloc); return 0; } /** * Compute disk usage by aggregating access statistics. * * On many Windows versions, these raw disk performance counters are disabled by default to save overhead. * * If DeviceIoControl call with IOCTL_DISK_PERFORMANCE returns zeros or fails, the counters are likely disabled. * * Run the following command from an elevated command prompt: * * diskperf -y * * This change usually requires a reboot to take effect at the driver level. */ static int devstat(uint64_t device, const char* name, const char* wfile, uint64_t* count) { wchar_t conv_buf[CONV_MAX]; HANDLE h; BOOL ret; DISK_PERFORMANCE ds; DWORD bytes; char file[128]; snprintf(file, sizeof(file), "/dev/pd%" PRIu64, device); /* open the volume */ h = CreateFileW(convert(conv_buf, wfile), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } bytes = 0; ret = DeviceIoControl(h, IOCTL_DISK_PERFORMANCE, NULL, 0, &ds, sizeof(ds), &bytes, NULL); if (!ret) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } if (!CloseHandle(h)) { DWORD error = GetLastError(); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } *count = ds.ReadCount + ds.WriteCount; return 0; } /** * Get SMART attributes. */ static int devsmart(uint64_t device, const char* name, const char* smartctl, struct smart_attr* smart, uint64_t* info, char* serial, char* family, char* model, char* inter) { char conv_buf[CONV_MAX]; WCHAR cmd[MAX_PATH + 128]; char file[128]; FILE* f; int ret; int count; snprintf(file, sizeof(file), "/dev/pd%" PRIu64, device); /* if there is a custom smartctl command */ if (smartctl[0]) { char option[128]; snprintf(option, sizeof(option), smartctl, file); snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -a %s", exedir, option); } else { snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -a %s", exedir, file); } count = 0; retry: log_tag("smartctl:%s:%s:run: %s\n", file, name, u16tou8(conv_buf, cmd)); f = _wpopen(cmd, L"rt"); if (!f) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(errno, "Failed to run '%s' (from popen).\n", u16tou8(conv_buf, cmd)); return -1; /* LCOV_EXCL_STOP */ } if (smartctl_attribute(f, file, name, smart, info, serial, family, model, inter) != 0) { /* LCOV_EXCL_START */ pclose(f); log_tag("device:%s:%s:shell\n", file, name); return -1; /* LCOV_EXCL_STOP */ } ret = pclose(f); log_tag("smartctl:%s:%s:ret: %x\n", file, name, ret); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(errno, "Failed to run '%s' (from pclose).\n", u16tou8(conv_buf, cmd)); return -1; /* LCOV_EXCL_STOP */ } /* if first try without custom smartctl command */ if (count == 0 && smartctl[0] == 0) { /* * Handle some common cases in Windows. * * Sometimes the "type" autodetection is wrong, and the command fails at identification * stage, returning with error 2, or even with error 0, and with no info at all. * We detect this condition checking the PowerOnHours, Size and RotationRate attributes. * * In such conditions we retry using the "sat" type, that often allows to proceed. * * Note that getting error 4 is instead very common, even with full info gathering. */ if ((ret == 0 || ret == 2) && smart[SMART_POWER_ON_HOURS].raw == SMART_UNASSIGNED && info[INFO_SIZE] == SMART_UNASSIGNED && info[INFO_ROTATION_RATE] == SMART_UNASSIGNED ) { /* retry using the "sat" type */ snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -a -d sat %s", exedir, file); ++count; goto retry; } } /* store the smartctl return value */ smart[SMART_FLAGS].raw = ret; return 0; } static int serial_descriptor(PSTORAGE_DEVICE_DESCRIPTOR descriptor, size_t size, char* output, size_t output_size) { if (descriptor->SerialNumberOffset == 0 || descriptor->SerialNumberOffset == (DWORD)-1 || descriptor->SerialNumberOffset >= size) return -1; const char* raw = (const char*)descriptor + descriptor->SerialNumberOffset; size_t len = 0; /* find the length, not assuming a 0 ending */ while (descriptor->SerialNumberOffset + len < size && raw[len] != 0) ++len; if (len < 6) /* a serial cannot be so short */ return -1; if (len + 1 > output_size) return -1; /* all must be printable */ for (size_t i = 0; i < len; ++i) { if (!isprint((unsigned char)raw[i])) return -1; } memcpy(output, raw, len); output[len] = 0; strtrim(output); return 0; } static void devattr_property(HANDLE h, char* serial, char* model, char* inter) { STORAGE_PROPERTY_QUERY query = { 0 }; STORAGE_DESCRIPTOR_HEADER header = { 0 }; DWORD bytes; query.PropertyId = StorageDeviceProperty; query.QueryType = PropertyStandardQuery; if (!DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &header, sizeof(header), &bytes, 0)) return; if (header.Size == 0) return; /* allocate buffer and query full descriptor */ BYTE* buffer = malloc(header.Size); if (!buffer) return; if (!DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), buffer, header.Size, &bytes, 0)) { free(buffer); return; } STORAGE_DEVICE_DESCRIPTOR* desc = (STORAGE_DEVICE_DESCRIPTOR*)buffer; /* extract strings (offsets are from start of descriptor) */ if (model && *model == 0 && desc->ProductIdOffset) { snprintf(model, SMART_MAX, "%s", (char*)(buffer + desc->ProductIdOffset)); strtrim(model); } if (serial && *serial == 0) { /* * This is the RAW serial, maybe HEX encoded, maybe BYTES SWAPPED, * but we don't care because we just need any identifier. * * If smartctl was not able to read it, we now accept anything. */ serial_descriptor(desc, bytes, serial, SMART_MAX); } #define BusTypeVirtual 0x0E #define BusTypeFileBackedVirtual 0x0F #define BusTypeSpaces 0x10 #define BusTypeNvme 0x11 #define BusTypeSCM 0x12 #define BusTypeUfs 0x13 #define BusTypeNvmeof 0x14 /* always override interface as more detailed than smartctl */ const char* type = 0; switch ((int)desc->BusType) { /* cast to int to avoid warnings about enum unlisted */ case BusTypeScsi : type = "SCSI"; break; case BusTypeAtapi : type = "ATAPI"; break; case BusTypeAta : type = "ATA"; break; case BusType1394 : type = "FireWire"; break; case BusTypeSsa : type = "SSA"; break; case BusTypeFibre : type = "Fibre"; break; case BusTypeUsb : type = "USB"; break; case BusTypeRAID : type = "RAID"; break; case BusTypeiScsi : type = "iSCSI"; break; case BusTypeSas : type = "SAS"; break; case BusTypeSata : type = "SATA"; break; case BusTypeSd : type = "SD"; break; case BusTypeMmc : type = "MMC"; break; case BusTypeVirtual : type = "Virtual"; break; case BusTypeFileBackedVirtual : type = "Virtual"; break; case BusTypeSpaces : type = "Storage Spaces"; break; case BusTypeNvme : type = "NVMe"; break; case BusTypeSCM : type = "SCM"; break; case BusTypeUfs : type = "UFS"; break; case BusTypeNvmeof : type = "NVMe"; break; default : } if (inter && type) snprintf(inter, SMART_MAX, "%s", type); free(buffer); } static void devattr_size(HANDLE h, uint64_t* size) { DISK_GEOMETRY_EX geom = { 0 }; DWORD bytes; if (!DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, 0, 0, &geom, sizeof(geom), &bytes, 0)) return; *size = geom.DiskSize.QuadPart; } static void devattr_rotational(HANDLE h, uint64_t* rotational) { STORAGE_PROPERTY_QUERY query = { 0 }; DEVICE_SEEK_PENALTY_DESCRIPTOR desc = { 0 }; DWORD bytes; query.PropertyId = StorageDeviceSeekPenaltyProperty; query.QueryType = PropertyStandardQuery; if (!DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &desc, sizeof(desc), &bytes, 0)) return; if (bytes < sizeof(desc)) return; if (desc.Version != sizeof(DEVICE_SEEK_PENALTY_DESCRIPTOR) || desc.Size != sizeof(DEVICE_SEEK_PENALTY_DESCRIPTOR)) return; *rotational = desc.IncursSeekPenalty ? 1 : 0; } /** * Get device attributes. */ static void devattr(uint64_t device, const char* name, const char* wfile, uint64_t* info, char* serial, char* family, char* model, char* interf) { HANDLE h; wchar_t conv_buf[CONV_MAX]; char file[128]; snprintf(file, sizeof(file), "/dev/pd%" PRIu64, device); (void)family; /* not available, smartctl uses an internal database to get it */ /* open the volume */ h = CreateFileW(convert(conv_buf, wfile), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return; } if (info[INFO_SIZE] == SMART_UNASSIGNED) devattr_size(h, &info[INFO_SIZE]); if (info[INFO_ROTATION_RATE] == SMART_UNASSIGNED) devattr_rotational(h, &info[INFO_ROTATION_RATE]); if (*model == 0 || *serial == 0) devattr_property(h, serial, model, interf); if (!CloseHandle(h)) { DWORD error = GetLastError(); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return; } } /** * Get POWER state */ static int devprobe(uint64_t device, const char* name, const char* smartctl, int* power, struct smart_attr* smart, uint64_t* info, char* serial, char* family, char* model, char* interf) { char conv_buf[CONV_MAX]; WCHAR cmd[MAX_PATH + 128]; char file[128]; FILE* f; int ret; int count; snprintf(file, sizeof(file), "/dev/pd%" PRIu64, device); /* if there is a custom smartctl command */ if (smartctl[0]) { char option[128]; snprintf(option, sizeof(option), smartctl, file); snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -n standby,3 -a %s", exedir, option); } else { snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -n standby,3 -a %s", exedir, file); } count = 0; retry: log_tag("smartctl:%s:%s:run: %s\n", file, name, u16tou8(conv_buf, cmd)); f = _wpopen(cmd, L"rt"); if (!f) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(errno, "Failed to run '%s' (from popen).\n", u16tou8(conv_buf, cmd)); return -1; /* LCOV_EXCL_STOP */ } if (smartctl_attribute(f, file, name, smart, info, serial, family, model, interf) != 0) { /* LCOV_EXCL_START */ pclose(f); log_tag("device:%s:%s:shell\n", file, name); return -1; /* LCOV_EXCL_STOP */ } ret = pclose(f); log_tag("smartctl:%s:%s:ret: %x\n", file, name, ret); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(errno, "Failed to run '%s' (from pclose).\n", u16tou8(conv_buf, cmd)); return -1; /* LCOV_EXCL_STOP */ } /* if first try without custom smartctl command */ if (count == 0 && smartctl[0] == 0) { /* * Handle some common cases in Windows. * * Sometimes the "type" autodetection is wrong, and the command fails at identification * stage, returning with error 2. * * In such conditions we retry using the "sat" type, that often allows to proceed. */ if (ret == 2) { /* retry using the "sat" type */ snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -n standby,3 -a -d sat %s", exedir, file); ++count; goto retry; } } if (ret == 3) { log_tag("attr:%s:%s:power:standby\n", file, name); *power = POWER_STANDBY; } else { log_tag("attr:%s:%s:power:active\n", file, name); *power = POWER_ACTIVE; /* store the smartctl return value */ if (smart) smart[SMART_FLAGS].raw = ret; } return 0; } /** * Spin down a specific device. */ static int devdown(uint64_t device, const char* name, const char* smartctl) { char conv_buf[CONV_MAX]; WCHAR cmd[MAX_PATH + 128]; char file[128]; FILE* f; int ret; int count; snprintf(file, sizeof(file), "/dev/pd%" PRIu64, device); /* if there is a custom smartctl command */ if (smartctl[0]) { char option[128]; snprintf(option, sizeof(option), smartctl, file); snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -s standby,now %s", exedir, option); } else { snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -s standby,now %s", exedir, file); } count = 0; retry: log_tag("smartctl:%s:%s:run: %s\n", file, name, u16tou8(conv_buf, cmd)); f = _wpopen(cmd, L"rt"); if (!f) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(errno, "Failed to run '%s' (from popen).\n", u16tou8(conv_buf, cmd)); return -1; /* LCOV_EXCL_STOP */ } if (smartctl_flush(f, file, name) != 0) { /* LCOV_EXCL_START */ pclose(f); log_tag("device:%s:%s:shell\n", file, name); return -1; /* LCOV_EXCL_STOP */ } ret = pclose(f); log_tag("smartctl:%s:%s:ret: %x\n", file, name, ret); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(errno, "Failed to run '%s' (from pclose).\n", u16tou8(conv_buf, cmd)); return -1; /* LCOV_EXCL_STOP */ } /* if first try without custom smartctl command */ if (count == 0 && smartctl[0] == 0) { /* * Handle some common cases in Windows. * * Sometimes the "type" autodetection is wrong, and the command fails at identification * stage, returning with error 2. * * In such conditions we retry using the "sat" type, that often allows to proceed. */ if (ret == 2) { /* retry using the "sat" type */ snwprintf(cmd, sizeof(cmd), L"\"%lssmartctl.exe\" -s standby,now -d sat %s", exedir, file); ++count; goto retry; } } if (ret != 0) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:exit:%d\n", file, name, ret); log_fatal(errno, "Failed to run '%s' with return code %xh.\n", u16tou8(conv_buf, cmd), ret); return -1; /* LCOV_EXCL_STOP */ } log_tag("attr:%s:%s:power:down\n", file, name); return 0; } /** * Spin down a specific device if it's up */ static int devdownifup(uint64_t device, const char* name, const char* smartctl, int* power) { *power = POWER_UNKNOWN; if (devprobe(device, name, smartctl, power, 0, 0, 0, 0, 0, 0) != 0) return -1; if (*power == POWER_ACTIVE) return devdown(device, name, smartctl); return 0; } /** * Spin up a device. */ static int devup(uint64_t device, const char* name, const char* wfile) { wchar_t conv_buf[CONV_MAX]; HANDLE h; BOOL ret; DISK_GEOMETRY dg; DWORD bytes; void* buffer; char file[128]; snprintf(file, sizeof(file), "/dev/pd%" PRIu64, device); /* open the volume */ h = CreateFileW(convert(conv_buf, wfile), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH, 0); if (h == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } bytes = 0; ret = DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &dg, sizeof(dg), &bytes, NULL); if (!ret) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } buffer = VirtualAlloc(NULL, dg.BytesPerSector, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (!buffer) { DWORD error = GetLastError(); CloseHandle(h); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } bytes = 0; if (!ReadFile(h, buffer, dg.BytesPerSector, &bytes, NULL)) { DWORD error = GetLastError(); CloseHandle(h); VirtualFree(buffer, 0, MEM_RELEASE); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } if (!CloseHandle(h)) { DWORD error = GetLastError(); VirtualFree(buffer, 0, MEM_RELEASE); windows_errno(error); log_tag("device:%s:%s:error:%lu\n", file, name, error); return -1; } VirtualFree(buffer, 0, MEM_RELEASE); log_tag("attr:%s:%s:power:up\n", file, name); return 0; } /** * Thread for spinning up. */ static void* thread_spinup(void* arg) { devinfo_t* devinfo = arg; uint64_t start; start = os_tick_ms(); if (devup(devinfo->device, devinfo->name, devinfo->wfile) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } msg_status("Spunup device '%s' for disk '%s' in %" PRIu64 " ms.\n", devinfo->file, devinfo->name, os_tick_ms() - start); /* after the spin up, get SMART info */ if (devsmart(devinfo->device, devinfo->name, devinfo->smartctl, devinfo->smart, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } /* * Retrieve some attributes directly from the system. * * smartctl intentionally skips queries on devices in standby mode * to prevent accidentally spinning them up. */ devattr(devinfo->device, devinfo->name, devinfo->wfile, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf); return 0; } /** * Thread for spinning down. */ static void* thread_spindown(void* arg) { devinfo_t* devinfo = arg; uint64_t start; start = os_tick_ms(); if (devdown(devinfo->device, devinfo->name, devinfo->smartctl) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } msg_status("Spundown device '%s' for disk '%s' in %" PRIu64 " ms.\n", devinfo->file, devinfo->name, os_tick_ms() - start); return 0; } /** * Thread for spinning down. */ static void* thread_spindownifup(void* arg) { devinfo_t* devinfo = arg; uint64_t start; int power; start = os_tick_ms(); if (devdownifup(devinfo->device, devinfo->name, devinfo->smartctl, &power) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } if (power == POWER_ACTIVE) msg_status("Spundown device '%s' for disk '%s' in %" PRIu64 " ms.\n", devinfo->file, devinfo->name, os_tick_ms() - start); return 0; } /** * Thread for getting smart info. */ static void* thread_smart(void* arg) { devinfo_t* devinfo = arg; if (devsmart(devinfo->device, devinfo->name, devinfo->smartctl, devinfo->smart, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } /* * Retrieve some attributes directly from the system. * * smartctl intentionally skips queries on devices in standby mode * to prevent accidentally spinning them up. */ devattr(devinfo->device, devinfo->name, devinfo->wfile, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf); return 0; } /** * Thread for getting power info. */ static void* thread_probe(void* arg) { devinfo_t* devinfo = arg; if (devprobe(devinfo->device, devinfo->name, devinfo->smartctl, &devinfo->power, devinfo->smart, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } /* * Retrieve some attributes directly from the system. * * smartctl intentionally skips queries on devices in standby mode * to prevent accidentally spinning them up. */ devattr(devinfo->device, devinfo->name, devinfo->wfile, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf); return 0; } static int device_thread(tommy_list* list, void* (*func)(void* arg)) { int fail = 0; tommy_node* i; /* starts all threads */ for (i = tommy_list_head(list); i != 0; i = i->next) { devinfo_t* devinfo = i->data; thread_create(&devinfo->thread, func, devinfo); } /* joins all threads */ for (i = tommy_list_head(list); i != 0; i = i->next) { devinfo_t* devinfo = i->data; void* retval; thread_join(devinfo->thread, &retval); if (retval != 0) ++fail; } if (fail != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } return 0; } int devquery(tommy_list* high, tommy_list* low, int operation) { tommy_node* i; void* (*func)(void* arg) = 0; /* for each device */ for (i = tommy_list_head(high); i != 0; i = i->next) { devinfo_t* devinfo = i->data; uint64_t access_stat; if (devresolve(devinfo->mount, devinfo->file, sizeof(devinfo->file), devinfo->wfile, sizeof(devinfo->wfile)) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to resolve path '%s'.\n", devinfo->mount); return -1; /* LCOV_EXCL_STOP */ } /* retrieve access stat for the high level device */ if (devstat(devinfo->device, devinfo->name, devinfo->wfile, &access_stat) == 0) { /* cumulate access stat in the first split */ if (devinfo->split) devinfo->split->access_stat += access_stat; else devinfo->access_stat += access_stat; } /* expand the tree of devices */ if (devtree(devinfo, low) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to expand device '%s'.\n", devinfo->file); return -1; /* LCOV_EXCL_STOP */ } } switch (operation) { case DEVICE_UP : func = thread_spinup; break; case DEVICE_DOWN : func = thread_spindown; break; case DEVICE_SMART : func = thread_smart; break; case DEVICE_PROBE : func = thread_probe; break; case DEVICE_DOWNIFUP : func = thread_spindownifup; break; } if (!func) return 0; return device_thread(low, func); } int devmap(void) { for (int i = 0; i < 32; i++) { char wfile[PATH_MAX]; wchar_t conv_buf[CONV_MAX]; pathprint(wfile, sizeof(wfile), "\\\\.\\PhysicalDrive%d", i); HANDLE h; /* open the volume */ h = CreateFileW(convert(conv_buf, wfile), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); if (error != ERROR_FILE_NOT_FOUND) log_tag("enumeration:/dev/pd%d::error:%lu\n", i, error); continue; } char serial[SMART_MAX]; serial[0] = 0; devattr_property(h, serial, 0, 0); if (serial[0]) { log_tag("map:/dev/pd%d:%s\n", i, esc_tag(serial)); } CloseHandle(h); } return 0; } /****************************************************************************/ /* pthread like interface */ int windows_mutex_init(windows_mutex_t* mutex, void* attr) { (void)attr; InitializeCriticalSection(mutex); return 0; } int windows_mutex_destroy(windows_mutex_t* mutex) { DeleteCriticalSection(mutex); return 0; } int windows_mutex_lock(windows_mutex_t* mutex) { EnterCriticalSection(mutex); return 0; } int windows_mutex_unlock(windows_mutex_t* mutex) { LeaveCriticalSection(mutex); return 0; } int windows_cond_init(windows_cond_t* cond, void* attr) { (void)attr; InitializeConditionVariable(cond); return 0; } int windows_cond_destroy(windows_cond_t* cond) { /* note that in Windows there is no DeleteConditionVariable() to call */ (void)cond; return 0; } int windows_cond_signal(windows_cond_t* cond) { WakeConditionVariable(cond); return 0; } int windows_cond_broadcast(windows_cond_t* cond) { WakeAllConditionVariable(cond); return 0; } int windows_cond_wait(windows_cond_t* cond, windows_mutex_t* mutex) { if (!SleepConditionVariableCS(cond, mutex, INFINITE)) return -1; return 0; } struct windows_key_context { void (*func)(void*); DWORD key; tommy_node node; }; /* list of all keys with destructor */ static tommy_list windows_key_list = { 0 }; int windows_key_create(windows_key_t* key, void (*destructor)(void*)) { struct windows_key_context* context; context = malloc(sizeof(struct windows_key_context)); if (!context) return -1; context->func = destructor; context->key = TlsAlloc(); if (context->key == 0xFFFFFFFF) { windows_errno(GetLastError()); free(context); return -1; } /* insert in the list of destructors */ if (context->func) tommy_list_insert_tail(&windows_key_list, &context->node, context); *key = context; return 0; } int windows_key_delete(windows_key_t void_key) { struct windows_key_context* key = void_key; /* use the destructor for the local variable and remove from the list of destructors */ if (key->func) { void* value = windows_getspecific(key); if (value) key->func(value); tommy_list_remove_existing(&windows_key_list, &key->node); } TlsFree(key->key); free(key); return 0; } void* windows_getspecific(windows_key_t key) { struct windows_key_context* context = key; return TlsGetValue(context->key); } int windows_setspecific(windows_key_t key, void* value) { struct windows_key_context* context = key; if (!TlsSetValue(context->key, value)) { windows_errno(GetLastError()); return -1; } return 0; } struct windows_thread_context { HANDLE h; unsigned id; void* (*func)(void*); void* arg; void* ret; }; /* forwarder to change the function declaration */ static unsigned __stdcall windows_thread_func(void* arg) { struct windows_thread_context* context = arg; tommy_node* i; context->ret = context->func(context->arg); /* call the destructor of all the keys */ i = tommy_list_head(&windows_key_list); while (i) { struct windows_key_context* key = i->data; if (key->func) { void* value = windows_getspecific(key); if (value) key->func(value); } i = i->next; } return 0; } int windows_create(thread_id_t* thread, void* attr, void* (*func)(void*), void* arg) { struct windows_thread_context* context; (void)attr; context = malloc(sizeof(struct windows_thread_context)); if (!context) return -1; context->func = func; context->arg = arg; context->ret = 0; context->h = (void*)_beginthreadex(0, 0, windows_thread_func, context, 0, &context->id); if (context->h == 0) { free(context); return -1; } *thread = context; return 0; } int windows_join(thread_id_t thread, void** retval) { struct windows_thread_context* context = thread; if (WaitForSingleObject(context->h, INFINITE) != WAIT_OBJECT_0) { windows_errno(GetLastError()); CloseHandle(context->h); free(context); return -1; } if (!CloseHandle(context->h)) { windows_errno(GetLastError()); free(context); return -1; } *retval = context->ret; free(context); return 0; } int ambient_temperature(void) { return 0; } #endif snapraid-14.9/cmdline/mingw.h000066400000000000000000000252471522717156100161760ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __PORTABLE_MINGW_H #define __PORTABLE_MINGW_H #ifdef __MINGW32__ /* Only for MingW */ #include /** * Always assume that the assembler supports SSE2, SSSE3, SSE42 and AVX2 instructions in x86 */ #ifdef CONFIG_X86 #define HAVE_SSE2 1 #define HAVE_SSSE3 1 #define HAVE_SSE42 1 #define HAVE_AVX2 1 #endif /****************************************************************************/ /* file */ /** * Redefines PATH_MAX to allow very long paths. */ #undef PATH_MAX #define PATH_MAX 1024 /* Remap functions and types */ #undef fopen #define fopen windows_fopen #undef open #define open windows_open #define open_noatime windows_open #undef stat #define stat windows_stat #undef lstat #define lstat windows_lstat #undef off_t #define off_t off64_t #undef fstat #define fstat windows_fstat #define HAVE_FTRUNCATE 1 #undef ftruncate #define ftruncate windows_ftruncate #define HAVE_FALLOCATE 1 #undef fallocate #define fallocate windows_fallocate #define HAVE_FSYNC 1 #undef fsync #define fsync windows_fsync #define sync windows_sync #undef rename #define rename windows_rename #undef remove #define remove windows_remove #undef mkdir #define mkdir(a, b) windows_mkdir(a) #undef rmdir #define rmdir windows_rmdir #undef dirent #define dirent windows_dirent #undef DIR #define DIR windows_dir #undef opendir #define opendir windows_opendir #undef readdir #define readdir windows_readdir #undef closedir #define closedir windows_closedir #define HAVE_FUTIMENS 1 #undef futimens #define futimens windows_futimens #define HAVE_UTIMENSAT 1 #define AT_FDCWD -1 #define AT_SYMLINK_NOFOLLOW 1 #undef utimensat #define utimensat windows_utimensat #define O_NOFOLLOW 0 #define dirent_hidden windows_dirent_hidden #define HAVE_STRUCT_DIRENT_D_STAT 1 #undef HAVE_STRUCT_DIRENT_D_INO #define HAVE_STRUCT_STAT_ST_NLINK 1 #define dirent_lstat windows_dirent_lstat #define stat_desc windows_stat_desc #undef sleep #define sleep windows_sleep #undef usleep #define usleep windows_usleep /* 4==DIR, 5,6,7=free, 8==REG */ #define S_IFLNK 0x5000 /* Symbolic link to file */ #define S_ISLNK(m) (((m) & _S_IFMT) == S_IFLNK) #define S_IFLNKDIR 0x6000 /* Symbolic link to directory */ #define S_ISLNKDIR(m) (((m) & _S_IFMT) == S_IFLNKDIR) #define S_IFJUN 0x7000 /* Junction */ #define S_ISJUN(m) (((m) & _S_IFMT) == S_IFJUN) #undef readlink #define readlink windows_readlink #undef symlink #define symlink windows_symlink #undef link #define link windows_link #undef strerror #define strerror windows_strerror #undef read #define read windows_read #undef write #define write windows_write #undef lseek #define lseek windows_lseek #undef pread #define pread windows_pread #undef pwrite #define pwrite windows_pwrite #define direct_size windows_direct_size #define HAVE_DIRECT_IO 1 #define O_DIRECT 0x10000000 #define O_DSYNC 0x20000000 /** * If nanoseconds are not supported, we report the special STAT_NSEC_INVALID value, * to mark that it's undefined. */ #define STAT_NSEC_INVALID -1 /* We have nano second support */ #define STAT_NSEC(st) ((int)(st)->st_mtimensec) /** * Generic stat information. */ struct windows_stat { uint64_t st_ino; int64_t st_size; int64_t st_mtime; int32_t st_mtimensec; uint32_t st_mode; uint32_t st_dev; uint32_t st_nlink; int st_hidden; const char* st_desc; int st_sync; /**< If the information are in sync with the file-system. */ }; /** * Like the C fstat(). */ int windows_fstat(int fd, struct windows_stat* st); /** * Like the C lstat(), but with some limitations. * * The st_ino field may be 0 if it's not possible to read it in a fast way. * Specifically this always happens. * * In case of hardlinks, the size and the attributes of the file can * be completely bogus, because changes made by other hardlinks are reported * in the directory entry only when the file is opened. * * MSDN CreateHardLinks * http://msdn.microsoft.com/en-us/library/windows/desktop/aa363860%28v=vs.85%29.aspx * 'When you create a hard link on the NTFS file system, the file attribute information' * 'in the directory entry is refreshed only when the file is opened, or when' * 'GetFileInformationByHandle is called with the handle of a specific file.' * * MSDN HardLinks and Junctions * http://msdn.microsoft.com/en-us/library/windows/desktop/aa365006%28v=vs.85%29.aspx * 'However, the directory entry size and attribute information is updated only' * 'for the link through which the change was made.' * * Use lstat_sync() to override these limitations. */ int windows_lstat(const char* file, struct windows_stat* st); /** * Like the C stat(). */ int windows_stat(const char* file, struct windows_stat* st); /** * Like the C mkdir(). */ int windows_mkdir(const char* file); /** * Like rmdir(). */ int windows_rmdir(const char* file); /** * Like the C lstat(), but with some limitations. * * This call fills all the st_* fields of the stat struct, * and if provided the pointer, also the physical offset. * * It doesn't work for all kinds of files and directories. * You must call it only for regular files. * For example, "C:\System Volume Information" cannot be accessed * with error ERROR_ACCESS_DENIED. * * Note that instead lstat() works for all the files. */ #define HAVE_LSTAT_SYNC 1 int lstat_sync(const char* file, struct windows_stat* st, uint64_t* physical); /** * Like the C ftruncate(). */ int windows_ftruncate(int fd, off64_t off); /** * Like the C fallocate(). */ int windows_fallocate(int fd, int mode, off64_t off, off64_t len); /** * Like the C fsync(). */ int windows_fsync(int fd); /** * Like the C sync(). */ int windows_sync(void); /** * Like the C futimes(). */ int windows_futimes(int fd, struct timeval tv[2]); struct windows_timespec { int64_t tv_sec; int tv_nsec; }; #define timespec windows_timespec /** * Like the C futimens(). */ int windows_futimens(int fd, struct windows_timespec tv[2]); /** * Like the C utimensat(). */ int windows_utimensat(int fd, const char* file, struct windows_timespec tv[2], int flags); /** * Like the C rename(). */ int windows_rename(const char* a, const char* b); /** * Like the C remove(). */ int windows_remove(const char* a); /** * Like the C fopen(). */ FILE* windows_fopen(const char* file, const char* mode); /** * Like the C open(). */ int windows_open(const char* file, int flags, ...); /** * Like the C dirent. */ struct windows_dirent { char d_name[PATH_MAX]; struct windows_stat d_stat; }; /** * Like the C DIR. */ struct windows_dir_struct; typedef struct windows_dir_struct windows_dir; /** * Like the C opendir(). */ windows_dir* windows_opendir(const char* dir); /** * Like the C readdir(). */ struct windows_dirent* windows_readdir(windows_dir* dirstream); /** * Like the C closedir(). */ int windows_closedir(windows_dir* dirstream); /** * Convert a dirent record to a lstat record, but with some limitations. * * The st_mode field may be 0 if the file is a reparse point. * Specifically this happens if we are using GetFileInformationByHandleEx() * to read the directory stream. * * The st_ino field may be 0 if it's not possible to read it in a fast way. * Specifically this happens if we are using FindFirst/FindNext to enumerate * the directory. * * In such cases, call lstat_sync() to fill the missing fields. */ void windows_dirent_lstat(const struct windows_dirent* dd, struct windows_stat* st); /** * Like dirent_hidden(). */ int windows_dirent_hidden(struct dirent* dd); /** * Like stat_desc(). */ const char* windows_stat_desc(struct stat* st); /** * Like sleep(). */ unsigned windows_sleep(unsigned seconds); /** * List usleep(). */ void windows_usleep(uint64_t useconds); /** * Like readlink(). */ int windows_readlink(const char* file, char* buffer, size_t size); /** * Like symlink(). * Return ENOSYS if symlinks are not supported. */ int windows_symlink(const char* existing, const char* file); /** * Like link(). */ int windows_link(const char* existing, const char* file); /** * Like strerror(). */ const char* windows_strerror(int err); /** * Like read(). */ ssize_t windows_read(int f, void* buffer, size_t size); /** * Like write(). */ ssize_t windows_write(int f, const void* buffer, size_t size); /** * Like lseek(). */ off_t windows_lseek(int f, off_t offset, int whence); /** * Like pread(). */ ssize_t windows_pread(int f, void* buffer, size_t size, off_t offset); /** * Like pwrite(). */ ssize_t windows_pwrite(int f, const void* buffer, size_t size, off_t offset); /** * List direct_size(). */ size_t windows_direct_size(void); /** * Like GetFileAttributes() */ int windows_get_file_attributes(const char* file); /** * Like SetFileAttributes() */ int windows_set_file_attributes(const char* file, int attributes); /****************************************************************************/ /* thread */ #define HAVE_THREAD 1 typedef void* windows_thread_t; typedef CRITICAL_SECTION windows_mutex_t; typedef CONDITION_VARIABLE windows_cond_t; typedef void* windows_key_t; /* remap to pthread */ #define thread_id_t windows_thread_t #define thread_mutex_t windows_mutex_t #define thread_cond_t windows_cond_t #define thread_key_t windows_key_t #define pthread_mutex_init windows_mutex_init #define pthread_mutex_destroy windows_mutex_destroy #define pthread_mutex_lock windows_mutex_lock #define pthread_mutex_unlock windows_mutex_unlock #define pthread_cond_init windows_cond_init #define pthread_cond_destroy windows_cond_destroy #define pthread_cond_signal windows_cond_signal #define pthread_cond_broadcast windows_cond_broadcast #define pthread_cond_wait windows_cond_wait #define pthread_create windows_create #define pthread_join windows_join #define pthread_key_create windows_key_create #define pthread_key_delete windows_key_delete #define pthread_getspecific windows_getspecific #define pthread_setspecific windows_setspecific /** * Like the pthread_* equivalent. */ int windows_mutex_init(windows_mutex_t* mutex, void* attr); int windows_mutex_destroy(windows_mutex_t* mutex); int windows_mutex_lock(windows_mutex_t* mutex); int windows_mutex_unlock(windows_mutex_t* mutex); int windows_cond_init(windows_cond_t* cond, void* attr); int windows_cond_destroy(windows_cond_t* cond); int windows_cond_signal(windows_cond_t* cond); int windows_cond_broadcast(windows_cond_t* cond); int windows_cond_wait(windows_cond_t* cond, windows_mutex_t* mutex); int windows_key_create(windows_key_t* key, void (*destructor)(void*)); int windows_key_delete(windows_key_t key); void* windows_getspecific(windows_key_t key); int windows_setspecific(windows_key_t key, void* value); int windows_create(thread_id_t* thread, void* attr, void* (*func)(void*), void* arg); int windows_join(thread_id_t thread, void** retval); #endif #endif snapraid-14.9/cmdline/mkstream.c000066400000000000000000000120401522717156100166560ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2015 Andrea Mazzoleni #include "portable.h" #include "stream.h" #include "support.h" volatile int global_interrupt = 0; #define STREAM_MAX 8 #define BUFFER_MAX 64 #define STR_MAX 128 void test(void) { struct stream* s; char file[32]; unsigned char buffer[BUFFER_MAX]; char str[STR_MAX]; unsigned i, j; uint32_t u32 = -1L; uint64_t u64 = -1LL; uint32_t put_crc_stored; uint32_t put_crc_computed; crc32c_init(); s = sopen_multi_write(STREAM_MAX, STREAM_FLAGS_CRC); for (i = 0; i < STREAM_MAX; ++i) { snprintf(file, sizeof(file), "stream%u.bin", i); remove(file); if (sopen_multi_file(s, i, file) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 0; j < 256; ++j) { if (sputc(j, s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 0; j < 32; ++j) { if (sputb32(u32 >> j, s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 0; j < 64; ++j) { if (sputb64(u64 >> j, s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 0; j < BUFFER_MAX; ++j) { memset(buffer, j, j); if (swrite(buffer, j, s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 1; j < STR_MAX; ++j) { memset(str, ' ' + j, j - 1); str[j - 1] = 0; if (sputbs(str, s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } put_crc_stored = scrc(s); put_crc_computed = scrc_stream(s); if (put_crc_stored != put_crc_computed) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (sputble32(put_crc_stored, s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (sclose(s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } for (i = 0; i < STREAM_MAX; ++i) { uint32_t get_crc_stored; uint32_t get_crc_computed; snprintf(file, sizeof(file), "stream%u.bin", i); s = sopen_read(file, STREAM_FLAGS_CRC); if (s == 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } for (j = 0; j < 256; ++j) { int c = sgetc(s); if (c == EOF || (unsigned char)c != j) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 0; j < 32; ++j) { uint32_t v32; if (sgetb32(s, &v32) != 0 || v32 != (u32 >> j)) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 0; j < 64; ++j) { uint64_t v64; if (sgetb64(s, &v64) != 0 || v64 != (u64 >> j)) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 1; j < BUFFER_MAX; ++j) { char copy[BUFFER_MAX]; memset(buffer, j, j); if (sread(s, copy, j) != 0 || memcmp(copy, buffer, j) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (j = 1; j < STR_MAX; ++j) { char copy[STR_MAX]; memset(str, ' ' + j, j - 1); str[j - 1] = 0; if (sgetbs(s, copy, sizeof(copy)) != 0 || strcmp(copy, str) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /* get the computed CRC *before* reading the stored one */ get_crc_computed = scrc(s); if (sgetble32(s, &get_crc_stored) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (get_crc_stored != put_crc_stored) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (get_crc_stored != get_crc_computed) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (sclose(s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (i = 0; i < STREAM_MAX; ++i) { uint32_t get_crc_stored; uint32_t get_crc_computed; unsigned char buf[4]; snprintf(file, sizeof(file), "stream%u.bin", i); s = sopen_read(file, STREAM_FLAGS_CRC); if (s == 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (sdeplete(s, buf) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* get the stored crc from the last four bytes */ get_crc_stored = buf[0] | (uint32_t)buf[1] << 8 | (uint32_t)buf[2] << 16 | (uint32_t)buf[3] << 24; if (get_crc_stored != put_crc_stored) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* get the computed CRC *after* reading the stored one */ get_crc_computed = scrc(s); /* adjust the stored crc to include itself */ get_crc_stored = crc32c(get_crc_stored, buf, 4); if (get_crc_stored != get_crc_computed) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (sclose(s) != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } int main(void) { unsigned i; lock_init(); for (i = 1; i <= 16; ++i) { /* test with different stream buffer size */ STREAM_SIZE = i; printf("Test stream buffer size %u\n", i); test(); } return 0; } snapraid-14.9/cmdline/mktest.c000066400000000000000000000373221522717156100163540ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" volatile int global_interrupt = 0; /****************************************************************************/ /* random */ /** * Pseudo random number generator. */ unsigned long long seed = 0; unsigned rnd(unsigned max) { seed = seed * 6364136223846793005LL + 1442695040888963407LL; return (seed >> 32) % max; } unsigned rndnz(unsigned max) { if (max <= 1) return 1; else return rnd(max - 1) + 1; } void rndnz_range(unsigned char* data, int size) { int i; for (i = 0; i < size; ++i) data[i] = rndnz(256); } void rndnz_damage(unsigned char* data, int size) { int i; /* corrupt ensuring always different data */ for (i = 0; i < size; ++i) { unsigned char c; do { c = rndnz(256); } while (c == data[i]); data[i] = c; } } char CHARSET[] = "qwertyuiopasdfghjklzxcvbnm1234567890 .-+"; #define CHARSET_LEN (sizeof(CHARSET) - 1) void rnd_name(char* file) { int l = 1 + rnd(20); while (l) { *file++ = CHARSET[rnd(CHARSET_LEN)]; --l; } *file = 0; } /****************************************************************************/ /* file */ int file_cmp(const void* a, const void* b) { return strcmp(a, b); } int fallback(int f, struct stat* st) { #if HAVE_FUTIMENS struct timespec tv[2]; #else struct timeval tv[2]; #endif int ret; #if HAVE_FUTIMENS /* futimens() is preferred because it gives nanosecond precision */ tv[0].tv_sec = st->st_mtime; if (STAT_NSEC(st) != STAT_NSEC_INVALID) tv[0].tv_nsec = STAT_NSEC(st); else tv[0].tv_nsec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_nsec = tv[0].tv_nsec; ret = futimens(f, tv); #elif HAVE_FUTIMES /* fallback to futimes() if nanosecond precision is not available */ tv[0].tv_sec = st->st_mtime; if (STAT_NSEC(st) != STAT_NSEC_INVALID) tv[0].tv_usec = STAT_NSEC(st) / 1000; else tv[0].tv_usec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_usec = tv[0].tv_usec; ret = futimes(f, tv); #elif HAVE_FUTIMESAT /* fallback to futimesat() for Solaris, it only has futimesat() */ tv[0].tv_sec = st->st_mtime; if (STAT_NSEC(st) != STAT_NSEC_INVALID) tv[0].tv_usec = STAT_NSEC(st) / 1000; else tv[0].tv_usec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_usec = tv[0].tv_usec; ret = futimesat(f, 0, tv); #else #error No function available to set file timestamps #endif return ret; } /****************************************************************************/ /* cmd */ /** * Create a file with random content. * - If the file exists it's rewritten, but avoiding to truncating it to 0. */ void cmd_generate_file(const char* path, int size) { unsigned char* data; int f; /* remove the existing file/symlink if any */ if (remove(path) != 0) { if (errno != ENOENT) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } else { /* don't truncate files to 0 size to avoid ZERO file size protection */ ++size; } data = malloc(size); /* We don't write zero bytes because we want to test */ /* the recovering of new files, after an aborted sync */ /* If the files contains full blocks at zero */ /* this is an impossible condition to recover */ /* because we cannot differentiate between an unused block */ /* and a file filled with 0 */ rndnz_range(data, size); f = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_NOFOLLOW, 0600); if (f < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (write(f, data, size) != size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (close(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } free(data); } /** * Create a symlink. * - If the file already exists, it's removed. */ void cmd_generate_symlink(const char* path, const char* linkto) { /* remove the existing file/symlink if any */ if (remove(path) != 0) { if (errno != ENOENT) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } if (symlink(linkto, path) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing symlink %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /** * Create a file or a symlink with a random name. */ void cmd_generate(int disk, int size) { char path[PATH_MAX]; char* file; snprintf(path, sizeof(path), "bench/disk%d/", disk); file = path + strlen(path); /* add a directory */ *file++ = 'a' + rnd(2); *file = 0; /* create it */ if (mkdir(path, 0777) != 0) { if (errno != EEXIST) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating directory %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } *file++ = '/'; while (1) { /* add a random file */ rnd_name(file); /* skip some invalid file name, see http://en.wikipedia.org/wiki/Filename */ if (strcmp(file, ".") == 0 || strcmp(file, "..") == 0 || strcmp(file, "prn") == 0 || strcmp(file, "con") == 0 || strcmp(file, "nul") == 0 || strcmp(file, "aux") == 0 || file[0] == ' ' || file[strlen(file) - 1] == ' ' || file[strlen(file) - 1] == '.' ) { continue; } break; } #ifndef WIN32 /* Windows XP doesn't support symlinks */ if (rnd(32) == 0) { /* symlink */ char linkto[PATH_MAX]; rnd_name(linkto); cmd_generate_symlink(path, linkto); } else #endif { /* file */ cmd_generate_file(path, size); } } /** * Write a partially a file. * - The file must exist. * - The file size is not changed. * - The written data may be equal or not at the already existing one. * - If it's a symlink nothing is done. */ void cmd_write(const char* path, int size) { struct stat st; if (lstat(path, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (S_ISREG(st.st_mode)) { unsigned char* data; off_t off; int f; /* not over the end */ if (size > st.st_size) size = st.st_size; /* start at random position inside the file */ if (size < st.st_size) off = rnd(st.st_size - size); else off = 0; data = malloc(size); rndnz_range(data, size); f = open(path, O_WRONLY | O_BINARY | O_NOFOLLOW); if (f < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (lseek(f, off, SEEK_SET) != off) { /* LCOV_EXCL_START */ log_fatal(errno, "Error seeking file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (write(f, data, size) != size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (close(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } free(data); } } /** * Damage a file. * - The file must exist. * - The file size is not changed. * - The written data is SURELY different than the already existing one. * - The file timestamp is NOT modified. * - If it's a symlink nothing is done. */ void cmd_damage(const char* path, int size) { struct stat st; /* here a 0 size means to change nothing */ /* as also the timestamp should not be changed */ if (!size) return; if (lstat(path, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (st.st_size == 0) return; if (S_ISREG(st.st_mode)) { off_t off; unsigned char* data; int f; /* not over the end */ if (size > st.st_size) size = st.st_size; /* start at random position inside the file */ if (size < st.st_size) off = rnd(st.st_size - size); else off = 0; data = malloc(size); f = open(path, O_RDWR | O_BINARY | O_NOFOLLOW); if (f < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (lseek(f, off, SEEK_SET) != off) { /* LCOV_EXCL_START */ log_fatal(errno, "Error seeking file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (read(f, data, size) != size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } rndnz_damage(data, size); if (lseek(f, off, SEEK_SET) != off) { /* LCOV_EXCL_START */ log_fatal(errno, "Error seeking file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (write(f, data, size) != size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (fallback(f, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error setting time for file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (close(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } free(data); } } /** * Append to a file. * - The file must exist. * - If it's a symlink nothing is done. */ void cmd_append(const char* path, int size) { struct stat st; if (lstat(path, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (S_ISREG(st.st_mode)) { unsigned char* data; int f; data = malloc(size); rndnz_range(data, size); f = open(path, O_WRONLY | O_APPEND | O_BINARY | O_NOFOLLOW); if (f < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (write(f, data, size) != size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (close(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } free(data); } } /** * Truncate a file. * - The file must exist. * - The file is NEVER truncated to 0. * - If it's a symlink nothing is done. */ void cmd_truncate(const char* path, int size) { struct stat st; if (lstat(path, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (S_ISREG(st.st_mode)) { off_t off; int f; /* if file is empty, just rewrite it */ if (st.st_size == 0) { size = 0; } else { /* don't truncate files to 0 size to avoid ZERO file size protection */ if (size >= st.st_size) size = st.st_size - 1; } off = st.st_size - size; f = open(path, O_WRONLY | O_BINARY | O_NOFOLLOW); if (f < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (ftruncate(f, off) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error truncating file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (close(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } /** * Delete a file. * - The file must exist. */ void cmd_delete(const char* path) { if (remove(path) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /** * Change a file. Or deleted/truncated/append/created. * - The file must exist. */ void cmd_change(const char* path, int size) { struct stat st; if (!size) return; if (lstat(path, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (S_ISLNK(st.st_mode)) { /* symlink */ if (rnd(2) == 0) { /* delete */ if (remove(path) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } else { /* recreate */ char linkto[PATH_MAX]; if (remove(path) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } rnd_name(linkto); cmd_generate_symlink(path, linkto); } } else if (S_ISREG(st.st_mode)) { int r; r = rnd(4); if (r == 0) { cmd_write(path, size); } else if (r == 1) { cmd_append(path, size); } else if (r == 2) { cmd_truncate(path, size); } else { cmd_delete(path); } } } void help(void) { printf("Test for " PACKAGE " v" VERSION " by Andrea Mazzoleni, " PACKAGE_URL "\n"); printf("Usage:\n"); printf("\tmktest generate SEED DISK_NUM FILE_NUM FILE_SIZE\n"); printf("\tmktest damage SEED NUM SIZE FILE\n"); printf("\tmktest write SEED NUM SIZE FILE\n"); printf("\tmktest change SEED SIZE FILE\n"); printf("\tmktest append SEED SIZE FILE\n"); printf("\tmktest truncate SEED SIZE FILE\n"); } int main(int argc, char* argv[]) { int i, j, b; lock_init(); if (argc < 2) { help(); exit(EXIT_SUCCESS); } if (strcmp(argv[1], "generate") == 0) { int disk, file, size; if (argc != 6) { /* LCOV_EXCL_START */ help(); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } seed = atoi(argv[2]); disk = atoi(argv[3]); file = atoi(argv[4]); size = atoi(argv[5]); for (i = 0; i < disk; ++i) { for (j = 0; j < file; ++j) { if (j == 0) /* create at least a big one */ cmd_generate(i + 1, size); else if (j == 1) /* create at least an empty one */ cmd_generate(i + 1, 0); else cmd_generate(i + 1, rnd(size)); } } } else if (strcmp(argv[1], "write") == 0) { int fail, size; if (argc < 6) { /* LCOV_EXCL_START */ help(); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } seed = atoi(argv[2]); fail = atoi(argv[3]); size = atoi(argv[4]); b = 5; /* sort the file names */ qsort(&argv[b], argc - b, sizeof(argv[b]), file_cmp); for (i = b; i < argc; ++i) for (j = 0; j < fail; ++j) cmd_write(argv[i], rndnz(size)); } else if (strcmp(argv[1], "damage") == 0) { int fail, size; if (argc < 6) { /* LCOV_EXCL_START */ help(); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } seed = atoi(argv[2]); fail = atoi(argv[3]); size = atoi(argv[4]); b = 5; /* sort the file names */ qsort(&argv[b], argc - b, sizeof(argv[b]), file_cmp); for (i = b; i < argc; ++i) for (j = 0; j < fail; ++j) cmd_damage(argv[i], rndnz(size)); /* at least one byte */ } else if (strcmp(argv[1], "append") == 0) { int size; if (argc < 5) { /* LCOV_EXCL_START */ help(); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } seed = atoi(argv[2]); size = atoi(argv[3]); b = 4; /* sort the file names */ qsort(&argv[b], argc - b, sizeof(argv[b]), file_cmp); for (i = b; i < argc; ++i) cmd_append(argv[i], rndnz(size)); /* at least one byte */ } else if (strcmp(argv[1], "truncate") == 0) { int size; if (argc < 5) { /* LCOV_EXCL_START */ help(); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } seed = atoi(argv[2]); size = atoi(argv[3]); b = 4; /* sort the file names */ qsort(&argv[b], argc - b, sizeof(argv[b]), file_cmp); for (i = b; i < argc; ++i) cmd_truncate(argv[i], rnd(size)); } else if (strcmp(argv[1], "change") == 0) { int size; if (argc < 5) { /* LCOV_EXCL_START */ help(); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } seed = atoi(argv[2]); size = atoi(argv[3]); b = 4; /* sort the file names */ qsort(&argv[b], argc - b, sizeof(argv[b]), file_cmp); for (i = b; i < argc; ++i) cmd_change(argv[i], rnd(size)); } else { /* LCOV_EXCL_START */ help(); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } lock_done(); return 0; } snapraid-14.9/cmdline/murmur3.c000066400000000000000000000117171522717156100164570ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni /* * Derivative work from MurmorHash3.cpp revision r136 * * SMHasher & MurmurHash * http://code.google.com/p/smhasher/ * * Exact source used as reference: * http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp?spec=svn136&r=136 */ // MurmurHash3 was written by Austin Appleby, and is placed in the public // domain. The author hereby disclaims copyright to this source code. /* Finalization mix - force all bits of a hash block to avalanche */ static inline uint32_t fmix32(uint32_t h) { h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; h *= 0xc2b2ae35; h ^= h >> 16; return h; } /* * Warning! * Don't declare these variables static, otherwise the gcc optimizer * may generate very slow code for multiplication with these constants, * like: -> .cpp k1 *= c1; -> .asm 152: 8d 14 80 lea (%eax,%eax,4),%edx 155: 8d 14 90 lea (%eax,%edx,4),%edx 158: c1 e2 03 shl $0x3,%edx 15b: 29 c2 sub %eax,%edx 15d: 8d 14 d2 lea (%edx,%edx,8),%edx 160: 8d 14 90 lea (%eax,%edx,4),%edx 163: 8d 14 d0 lea (%eax,%edx,8),%edx 166: 8d 14 90 lea (%eax,%edx,4),%edx 169: 8d 14 50 lea (%eax,%edx,2),%edx 16c: 8d 14 90 lea (%eax,%edx,4),%edx 16f: 8d 14 92 lea (%edx,%edx,4),%edx 172: 8d 14 50 lea (%eax,%edx,2),%edx 175: 8d 04 d0 lea (%eax,%edx,8),%eax 178: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx 17f: 29 d0 sub %edx,%eax * resulting in speeds of 500 MB/s instead of 3000 MB/s. * * Verified with gcc 4.4.4 compiling with : * * g++ -g -c -O2 MurmurHash3.cpp -o MurmurHash3.o */ uint32_t c1 = 0x239b961b; uint32_t c2 = 0xab0e9789; uint32_t c3 = 0x38b34ae5; uint32_t c4 = 0xa1e38b93; void MurmurHash3_x86_128(const void* data, size_t size, const uint8_t* seed, void* digest) { size_t nblocks; const uint32_t* blocks; const uint32_t* end; size_t size_remainder; uint32_t h1, h2, h3, h4; h1 = util_read32(seed + 0); h2 = util_read32(seed + 4); h3 = util_read32(seed + 8); h4 = util_read32(seed + 12); nblocks = size / 16; blocks = data; end = blocks + nblocks * 4; /* body */ while (blocks < end) { uint32_t k1 = blocks[0]; uint32_t k2 = blocks[1]; uint32_t k3 = blocks[2]; uint32_t k4 = blocks[3]; #if WORDS_BIGENDIAN k1 = util_swap32(k1); k2 = util_swap32(k2); k3 = util_swap32(k3); k4 = util_swap32(k4); #endif k1 *= c1; k1 = util_rotl32(k1, 15); k1 *= c2; h1 ^= k1; h1 = util_rotl32(h1, 19); h1 += h2; h1 = h1 * 5 + 0x561ccd1b; k2 *= c2; k2 = util_rotl32(k2, 16); k2 *= c3; h2 ^= k2; h2 = util_rotl32(h2, 17); h2 += h3; h2 = h2 * 5 + 0x0bcaa747; k3 *= c3; k3 = util_rotl32(k3, 17); k3 *= c4; h3 ^= k3; h3 = util_rotl32(h3, 15); h3 += h4; h3 = h3 * 5 + 0x96cd1c35; k4 *= c4; k4 = util_rotl32(k4, 18); k4 *= c1; h4 ^= k4; h4 = util_rotl32(h4, 13); h4 += h1; h4 = h4 * 5 + 0x32ac3b17; blocks += 4; } /* tail */ size_remainder = size & 15; if (size_remainder != 0) { const uint8_t* tail = (const uint8_t*)blocks; uint32_t k1 = 0; uint32_t k2 = 0; uint32_t k3 = 0; uint32_t k4 = 0; switch (size_remainder) { case 15 : k4 ^= (uint32_t)tail[14] << 16; /* fallthrough */ case 14 : k4 ^= (uint32_t)tail[13] << 8; /* fallthrough */ case 13 : k4 ^= (uint32_t)tail[12] << 0; /* fallthrough */ k4 *= c4; k4 = util_rotl32(k4, 18); k4 *= c1; h4 ^= k4; /* fallthrough */ case 12 : k3 ^= (uint32_t)tail[11] << 24; /* fallthrough */ case 11 : k3 ^= (uint32_t)tail[10] << 16; /* fallthrough */ case 10 : k3 ^= (uint32_t)tail[ 9] << 8; /* fallthrough */ case 9 : k3 ^= (uint32_t)tail[ 8] << 0; /* fallthrough */ k3 *= c3; k3 = util_rotl32(k3, 17); k3 *= c4; h3 ^= k3; /* fallthrough */ case 8 : k2 ^= (uint32_t)tail[ 7] << 24; /* fallthrough */ case 7 : k2 ^= (uint32_t)tail[ 6] << 16; /* fallthrough */ case 6 : k2 ^= (uint32_t)tail[ 5] << 8; /* fallthrough */ case 5 : k2 ^= (uint32_t)tail[ 4] << 0; /* fallthrough */ k2 *= c2; k2 = util_rotl32(k2, 16); k2 *= c3; h2 ^= k2; /* fallthrough */ case 4 : k1 ^= (uint32_t)tail[ 3] << 24; /* fallthrough */ case 3 : k1 ^= (uint32_t)tail[ 2] << 16; /* fallthrough */ case 2 : k1 ^= (uint32_t)tail[ 1] << 8; /* fallthrough */ case 1 : k1 ^= (uint32_t)tail[ 0] << 0; /* fallthrough */ k1 *= c1; k1 = util_rotl32(k1, 15); k1 *= c2; h1 ^= k1; /* fallthrough */ } } /* finalization */ h1 ^= size; h2 ^= size; h3 ^= size; h4 ^= size; h1 += h2; h1 += h3; h1 += h4; h2 += h1; h3 += h1; h4 += h1; h1 = fmix32(h1); h2 = fmix32(h2); h3 = fmix32(h3); h4 = fmix32(h4); h1 += h2; h1 += h3; h1 += h4; h2 += h1; h3 += h1; h4 += h1; util_write32(digest + 0, h1); util_write32(digest + 4, h2); util_write32(digest + 8, h3); util_write32(digest + 12, h4); } snapraid-14.9/cmdline/murmur3test.c000066400000000000000000005563631522717156100173720ustar00rootroot00000000000000{ "", 0, { 0x6d, 0xc8, 0xcf, 0x99, 0x79, 0xda, 0x82, 0x0b, 0x9d, 0xd0, 0x02, 0x56, 0x0e, 0x6a, 0x28, 0x0a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "a", 1, { 0x83, 0xa4, 0xc1, 0x6e, 0x1f, 0xcb, 0x8b, 0x30, 0x26, 0x59, 0x53, 0x64, 0x3b, 0x3f, 0xc1, 0xda }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "abc", 3, { 0xb3, 0xfc, 0x85, 0x98, 0x5b, 0xe6, 0x5a, 0xa2, 0x4b, 0xe9, 0x91, 0xee, 0x71, 0x9f, 0x9f, 0x8d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "message digest", 14, { 0x20, 0xa2, 0x19, 0x39, 0xec, 0x22, 0x47, 0x6d, 0xe2, 0xec, 0x49, 0x9d, 0xc0, 0xd9, 0x9a, 0x3e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "abcdefghijklmnopqrstuvwxyz", 26, { 0xde, 0x14, 0xd1, 0x23, 0x69, 0xa3, 0x51, 0x40, 0xc2, 0x05, 0x6c, 0x02, 0xb1, 0xa5, 0x57, 0xf7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62, { 0xc9, 0x76, 0x9b, 0xc1, 0xaf, 0x21, 0x57, 0xbc, 0x1a, 0x37, 0xa3, 0xd0, 0xc5, 0x3e, 0x0c, 0xa7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "The quick brown fox jumps over the lazy dog", 43, { 0x50, 0x2a, 0xbe, 0xaf, 0x34, 0xa9, 0x5a, 0x3d, 0x23, 0x32, 0x5f, 0x35, 0xf4, 0xbb, 0xae, 0xb6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x00", 1, { 0xe6, 0x32, 0x4f, 0xfc, 0x34, 0xec, 0x2e, 0xa6, 0xd2, 0x78, 0x69, 0x5d, 0x02, 0x5a, 0x13, 0xf2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x16\x27", 2, { 0x6f, 0xa3, 0xa2, 0x16, 0xbf, 0x09, 0x0c, 0x4c, 0xc7, 0xca, 0xc2, 0xbc, 0xd7, 0xb4, 0xed, 0xd4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe2\x56\xb4", 3, { 0xc1, 0x5f, 0x9c, 0x8d, 0x8b, 0xeb, 0x7a, 0x1e, 0xc3, 0xd2, 0x30, 0xb6, 0xc1, 0x45, 0x4b, 0xee }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc9\x4d\x9c\xda", 4, { 0x00, 0x7b, 0x90, 0x9a, 0x99, 0xbd, 0xc8, 0x6b, 0x70, 0x54, 0x3b, 0x17, 0xfa, 0xae, 0x7c, 0xca }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x79\xf1\x29\x69\x5d", 5, { 0xb3, 0x8c, 0x03, 0x90, 0x92, 0x18, 0x1d, 0x76, 0xfe, 0x37, 0xb2, 0xb2, 0x49, 0x8f, 0x84, 0x5e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x00\x7e\xdf\x1e\x31\x1c", 6, { 0x0b, 0x4f, 0x0a, 0xa5, 0x2b, 0xaf, 0x0c, 0x3b, 0x6f, 0x80, 0xaa, 0xd8, 0xfb, 0x25, 0x09, 0xbf }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2a\x4c\xe1\xff\x9e\x6f\x53", 7, { 0xb6, 0xf1, 0x94, 0x8a, 0x57, 0x87, 0xfa, 0xe4, 0x18, 0x79, 0xab, 0x38, 0x5c, 0x4b, 0xc8, 0x5d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xba\x02\xab\x18\x30\xc5\x0e\x8a", 8, { 0x9a, 0x13, 0x04, 0x08, 0x73, 0xb3, 0xe7, 0xd8, 0x22, 0xcb, 0x09, 0x11, 0xda, 0xce, 0xc2, 0x8b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xec\x4e\x7a\x72\x1e\x71\x2a\xc9\x33", 9, { 0x01, 0xd2, 0x9a, 0x1a, 0x6f, 0x81, 0x70, 0x76, 0xac, 0x74, 0xe9, 0xbc, 0x5e, 0x70, 0x76, 0xcb }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfd\xe2\x9c\x0f\x72\xb7\x08\xea\xd0\x78", 10, { 0x06, 0xd3, 0x6f, 0x5a, 0x8f, 0x86, 0x3b, 0xdd, 0x46, 0xa1, 0xa1, 0x5f, 0x75, 0xf0, 0x8f, 0xa3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x65\xc4\x8a\xb8\x80\x86\x9a\x79\x00\xb7\xae", 11, { 0x16, 0x2f, 0xc0, 0x17, 0x48, 0x37, 0xdc, 0xe0, 0x06, 0xa1, 0x78, 0xd5, 0xa8, 0xb7, 0xae, 0x2f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x77\xe9\xd7\x80\x0e\x3f\x5c\x43\xc8\xc2\x46\x39", 12, { 0xc0, 0xa5, 0x2e, 0xda, 0x4e, 0x6c, 0xed, 0x9f, 0x3e, 0x36, 0x79, 0xac, 0x5d, 0x65, 0xb6, 0x88 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x87\xd8\x61\x61\x4c\x89\x17\x4e\xa1\xa4\xef\x13\xa9", 13, { 0xda, 0xa3, 0x53, 0xaa, 0x70, 0xb5, 0xa2, 0xcc, 0x01, 0x60, 0xbf, 0x90, 0x60, 0x76, 0x42, 0x15 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfe\xa6\x5b\xc2\xda\xe8\x95\xd4\x64\xab\x4c\x39\x58\x29", 14, { 0xa9, 0x13, 0x46, 0x19, 0xc6, 0x8f, 0xed, 0x22, 0xde, 0xbf, 0x77, 0xbd, 0xfb, 0x61, 0xa4, 0x0d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x94\x49\xc0\x78\xa0\x80\xda\xc7\x71\x4e\x17\x37\xa9\x7c\x40", 15, { 0xe3, 0x99, 0xd9, 0x33, 0xc9, 0xc6, 0xf5, 0x16, 0xdf, 0x60, 0x39, 0x1a, 0xe7, 0x56, 0x3e, 0x30 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x53\x7e\x36\xb4\x2e\xc9\xb9\xcc\x18\x3e\x9a\x5f\xfc\xb7\xb0\x61", 16, { 0x92, 0x65, 0x17, 0x2d, 0xa5, 0xfb, 0x6d, 0x60, 0xdc, 0xd0, 0xce, 0x45, 0x52, 0x63, 0xad, 0x13 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x59\xa9\x9f\xa6\xdb\xb7\x02\xc5\x95\x65\x34\x17\xde\xe5\xbb\xdf\xc5", 17, { 0x6d, 0xae, 0x56, 0xbf, 0xa2, 0x8b, 0x0a, 0x62, 0x3c, 0xf7, 0x12, 0x95, 0xe0, 0x3d, 0x9e, 0xa4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0d\x52\x83\x32\x6a\x92\xf9\x9a\x6e\x3c\x3d\x5e\xc4\x25\xfe\xc1\xc4\xbe", 18, { 0xf2, 0x00, 0xea, 0x7b, 0x07, 0xe8, 0xf4, 0xf7, 0xbc, 0x36, 0xd5, 0x3b, 0x4a, 0x35, 0x01, 0x66 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x59\x84\x02\x3f\xbc\x20\x01\x70\xed\xa0\x05\x14\x23\x18\x06\xf2\x52\xc5\xc1", 19, { 0xfc, 0x1c, 0x08, 0x2b, 0x38, 0x0b, 0x86, 0xf9, 0x62, 0x01, 0x50, 0x17, 0x13, 0x70, 0x86, 0xe8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x81\x84\xc3\xe8\x2f\x63\x65\x79\x4e\xd3\x34\x2c\x9c\xbc\x87\x05\x6d\xe5\xbc\x0a", 20, { 0xfb, 0xb8, 0x1e, 0xc4, 0x33, 0x0c, 0x81, 0x8b, 0x9f, 0x93, 0xf7, 0x33, 0xe4, 0xdf, 0x12, 0x0c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x77\xfc\x10\x0f\x3a\xb2\x20\xad\x0a\x03\xfd\x51\xba\x93\xe6\x70\xe7\x34\xa4\xd8\xde", 21, { 0x09, 0x77, 0x2c, 0xd4, 0xc8, 0x21, 0xce, 0xf3, 0x15, 0xee, 0x0a, 0xef, 0x1b, 0xdf, 0x79, 0x31 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x84\x87\x22\x2b\xb3\xf8\x44\xbf\x63\xbb\x43\xbd\xa8\xc4\x05\xe1\x2f\xb2\x44\x8d\x7a\xec", 22, { 0xc7, 0xb8, 0x65, 0x7e, 0xbc, 0x87, 0x1f, 0xbb, 0x56, 0x47, 0xde, 0x82, 0x6d, 0x23, 0xdc, 0x23 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9f\x72\x49\x57\xca\xd7\x15\xb1\xe6\x89\xb5\x8d\xec\x5f\x24\xeb\x42\x69\x5a\x73\x70\xb5\x56", 23, { 0xc0, 0x92, 0x04, 0xcb, 0x56, 0x1c, 0x82, 0x54, 0x66, 0xff, 0x4d, 0x02, 0xa4, 0x75, 0xfb, 0xab }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4e\xec\xbd\x3d\xa2\x11\x70\x9c\xa8\x2e\xdb\xca\x6b\xbb\x74\x69\x1e\xa7\x03\x0b\x1b\xcd\x2e\xf0", 24, { 0x96, 0x49, 0x0a, 0x9c, 0xef, 0x7d, 0xe0, 0x15, 0x4d, 0x76, 0x7a, 0x39, 0x7e, 0x2d, 0xe8, 0x58 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x74\x84\x9f\xed\x38\x55\xd4\x69\x44\xc8\x82\x82\xc2\x57\xa7\x4d\x43\x84\x2b\x3a\x75\x06\x32\x95\x81", 25, { 0x7f, 0xaa, 0x9d, 0xbf, 0xa5, 0xb8, 0xad, 0xe4, 0xaa, 0x1e, 0x11, 0xb3, 0x83, 0x59, 0xec, 0x8f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1e\x01\x28\x03\x09\x8a\xfe\xa7\x8e\x95\x42\x5d\xb7\x8d\x46\x38\x9c\xe5\xa1\xe8\x5a\x25\x70\xd2\x23\x95", 26, { 0xb2, 0x19, 0xf5, 0x35, 0xe2, 0x17, 0x94, 0xd8, 0x0c, 0x5c, 0x03, 0x78, 0x66, 0xd3, 0xe8, 0x94 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbc\xc9\x70\x84\xfc\x6c\x51\x35\xb1\x1c\xe4\x67\x2f\x97\xe4\x80\x7c\x36\x59\x55\x51\xbf\x6d\x98\x3d\xe8\x5f", 27, { 0x79, 0xca, 0xd3, 0xb3, 0x5d, 0xee, 0x4d, 0xa4, 0x00, 0xa9, 0x5c, 0x20, 0x3b, 0x19, 0x7d, 0x16 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdf\xe9\x69\x90\x4d\x76\xbc\xbb\xdf\x03\x74\x42\x55\x4a\x37\xa3\xba\x6a\x5a\x09\x92\xbf\x17\xff\xa0\xed\x6d\x3f", 28, { 0x7c, 0xca, 0x53, 0x89, 0xcd, 0x37, 0x11, 0x06, 0xf9, 0xd0, 0x8e, 0x41, 0x17, 0xd7, 0x42, 0xe4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x51\xfc\x95\xa9\xc8\x9d\x1c\x4f\x87\x8b\xa2\xad\xb7\x0d\x2d\xf6\x14\x98\x2b\x89\x77\x91\x02\x83\x01\x2f\x56\x6e\xe1", 29, { 0xdb, 0x92, 0x9e, 0xe8, 0x1e, 0xf7, 0x3a, 0xc6, 0xfc, 0x66, 0x8b, 0x7f, 0x3b, 0x77, 0x56, 0x64 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7f\xd6\x16\xc3\x81\xc3\x7c\xd6\x70\xff\xe4\x77\x1f\xcd\x09\x7f\x7f\x2b\x71\x26\x3d\xc9\xdb\x92\x88\xa5\xd4\x00\xf0\x44", 30, { 0x6d, 0x2e, 0x0a, 0x81, 0xbc, 0x6a, 0xd7, 0x2d, 0x04, 0xba, 0x4a, 0xcc, 0x0b, 0x3b, 0xc9, 0xf8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x68\x8e\x6a\x8e\xf6\xa2\x70\x47\x1d\xfb\x45\x26\xd2\x52\x56\x94\x94\xac\xbc\x02\xb6\x3f\xde\xe7\xdb\xfe\x34\x55\x81\xc3\x26", 31, { 0xe3, 0xc8, 0xa6, 0x56, 0x3f, 0x8c, 0x6e, 0x64, 0x11, 0xb3, 0x8a, 0x09, 0x95, 0xcf, 0xa0, 0xe1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x37\xb3\x18\x13\x29\xe2\xa2\x6d\xf4\xce\x2b\x01\xa5\x9f\x4b\x54\x48\x10\xb1\x29\x46\xcb\x13\x20\x58\xcf\xb0\x78\x27\x0d\x7e\xf5", 32, { 0xe0, 0x0a, 0x19, 0xff, 0x6e, 0xee, 0x06, 0x88, 0xea, 0x38, 0x6b, 0xc8, 0x68, 0x6a, 0x94, 0xa2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x82\x13\xf6\xdd\x3b\xdf\x78\x1c\x9e\xd6\x5b\x87\x8f\xcd\x95\x3d\x3f\x43\x04\x2a\x8b\xb2\x57\xa5\xf1\xfa\x9c\x39\x2f\xfe\x66\x81\x7a", 33, { 0x2b, 0xba, 0x42, 0x8d, 0xb0, 0x96, 0xcd, 0x0c, 0xc3, 0x6a, 0x05, 0x7c, 0x81, 0x42, 0x6f, 0x4c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4a\x9a\x2c\x58\xf1\xd6\x21\x1a\x76\x7f\xbc\xfa\xe0\x66\x35\xcd\xf1\x17\x22\x64\x6f\xbd\x13\x85\xa1\xb5\x5b\x81\xd6\xad\xee\x72\x1e\x79", 34, { 0x20, 0xdf, 0x47, 0x95, 0xc3, 0x0d, 0x81, 0x29, 0xdc, 0xd2, 0xf7, 0x28, 0x7c, 0xf8, 0xef, 0xa9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x66\x13\x1c\x72\x20\x3c\xf3\x8b\x83\xf8\x5e\xf2\x60\x44\xdc\x5e\x75\x67\x08\xfb\x0c\xe9\x07\xf0\xc1\x31\x1a\x89\x60\xbf\x53\x06\xed\x02\x64", 35, { 0xe9, 0x2a, 0x0c, 0x85, 0xe6, 0xaa, 0x86, 0x00, 0xdd, 0xb1, 0x3e, 0x0f, 0xa4, 0xd2, 0x5d, 0xa1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xff\xbd\xd6\x92\x72\xc1\x9e\xc9\x6b\xe3\xfb\xca\x4e\x88\x26\x7f\xc4\x36\xf0\x70\x40\x4f\x53\x4d\x2d\xfc\xb3\xab\xb6\x25\xb7\xcc\x31\x9c\xbf\x97", 36, { 0x90, 0x40, 0x16, 0xeb, 0xb9, 0x97, 0x22, 0xd2, 0x28, 0x99, 0xd8, 0x87, 0x57, 0x71, 0x58, 0x9c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x29\x59\x01\xa6\x06\xe0\x43\x7e\x5b\xbf\x37\xda\xcc\x33\x6e\x20\x9a\xeb\xfa\xf5\xcd\xe4\xa5\xec\xfd\x73\xc7\x59\xbc\x61\xc8\x44\xa3\x30\x33\x79\xf8", 37, { 0xf4, 0x09, 0x5a, 0x82, 0x2b, 0x32, 0x80, 0x9a, 0x0a, 0x71, 0x32, 0x74, 0x57, 0x18, 0xc5, 0x40 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7c\x72\xbd\xf9\x7d\x2c\x1b\xc8\xa9\x38\x5c\xf2\x76\x3c\x94\x9d\x3d\xe7\xd9\x4e\x3a\xc7\x0f\x55\xb0\xc7\xdf\xd5\x29\x49\xc6\x74\xdb\xdc\x49\x9b\x27\x9a", 38, { 0x12, 0x88, 0x65, 0xe1, 0x77, 0x1a, 0x72, 0xd0, 0x39, 0xc4, 0xcd, 0xc6, 0x21, 0x0e, 0xa5, 0x13 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x46\x6a\x3b\x21\x66\x3c\xd6\x2c\xaf\xd2\x2b\xcd\x36\x1e\xdf\x49\xf2\xae\x2d\x8f\xab\xb3\x29\x57\x10\xae\x22\xd4\xe8\xb6\x20\x15\x61\x68\x8c\xfd\x85\x6b\xef", 39, { 0x31, 0xe0, 0x8f, 0xd8, 0xfd, 0x6b, 0x31, 0xa2, 0xc4, 0x03, 0x70, 0xb9, 0xe1, 0x0d, 0x95, 0x16 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdd\xca\x9e\xd3\xab\xc8\xe1\xc5\xe2\x05\x7d\x7c\xf5\xec\x31\x14\x71\xdd\xda\x73\xae\x5e\xbd\xcd\x31\x6e\x74\x42\xa1\xfa\x74\xa4\x64\x69\x37\x57\xd6\x52\x0a\x51", 40, { 0x44, 0xa4, 0x8b, 0x8f, 0x05, 0x9d, 0x67, 0xeb, 0x05, 0xac, 0xed, 0x43, 0x92, 0x50, 0x91, 0xf9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x26\x4d\x75\x42\xcc\xe7\x42\xcd\xaa\xaf\x2c\xf3\xbf\x6d\x26\x91\x82\x72\x44\x00\xe1\x0b\x4a\xda\xd5\x0f\xd0\xdc\xa2\x98\x0e\xe7\xa8\xce\x4a\x21\xe9\xdf\xdb\x38\x18", 41, { 0xae, 0x76, 0x17, 0x96, 0x45, 0x61, 0xbb, 0x31, 0xbb, 0xf5, 0xc4, 0x6e, 0xe9, 0xc6, 0x22, 0xf8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0b\xd8\xc7\x5a\xdb\x62\xd1\x9c\x71\x8b\x69\x90\xfb\xe2\x74\x45\x41\x9d\x87\x61\x5e\x61\xea\xfe\x8c\xb0\xbe\x1f\x18\xef\x3a\xce\x74\x13\x11\xd3\x6b\xe8\xf0\x12\x6f\xfe", 42, { 0x07, 0xd5, 0xac, 0x77, 0x53, 0xc4, 0x8c, 0xd9, 0xb4, 0xec, 0x2b, 0xa5, 0xa5, 0x57, 0x45, 0xaf }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x23\x82\x0e\x30\x57\xc6\x83\xd2\x7a\x69\x69\x76\xbf\xbb\x8b\x5b\xbd\x42\xd6\x73\xb7\xdf\x70\x10\xf6\x7f\xe1\x2a\x53\x7a\x6f\x4f\xd1\x8b\x89\x27\x66\x6d\x59\xa3\xdb\x0e\x7c", 43, { 0x52, 0x80, 0xcc, 0x28, 0xb7, 0x1b, 0x2d, 0x6f, 0xcd, 0x73, 0xe1, 0xd7, 0xa9, 0xd0, 0xe6, 0xb4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc2\xc9\x72\xce\xff\xc3\x27\x5e\x5b\x92\x60\x81\x02\x9b\xb1\x02\x9d\x5d\x66\x77\x33\x17\x80\xaf\xbc\x86\x4d\x47\x44\xcc\xa3\x5b\xb9\x6c\xb9\x5a\x51\x72\xa1\xf3\x9a\xb0\x66\x2c", 44, { 0xe3, 0x96, 0x4f, 0xe1, 0x37, 0xb0, 0x7a, 0xc6, 0xeb, 0xbe, 0x59, 0x4f, 0xfa, 0xaa, 0x95, 0xf1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1f\x22\xbe\x91\xb4\x73\x6c\x89\x5f\x99\x35\xc4\xe3\x9b\x7c\xd0\xea\x73\x7c\xcb\xce\x0e\x22\x33\x04\x6f\x85\xd9\x25\xf4\x03\xf4\x9b\xb1\xf9\x52\xe4\xf8\x1e\xa9\x86\xfb\x7d\x0c\x8f", 45, { 0x6f, 0xb0, 0xa2, 0x69, 0x84, 0x9d, 0x97, 0x2b, 0x05, 0x8d, 0x15, 0x87, 0x7b, 0x2b, 0xa3, 0xc0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x88\x0d\x79\xc8\xf2\xee\x8f\x76\x10\x42\x5d\xcc\x5f\xa6\x55\xf0\x43\x4c\x5f\xa8\x6b\xb7\x0a\xa1\x51\x11\xdd\x5c\xe1\x2c\xcc\xb6\x31\x13\xc6\x12\x6f\x4c\x6b\x24\xd9\xae\xdb\x5d\xe4\xd9", 46, { 0x8c, 0x08, 0x81, 0x71, 0xd6, 0xf1, 0x21, 0x47, 0xe1, 0xac, 0x8a, 0xed, 0x99, 0xa2, 0x4c, 0x1f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaa\xee\x80\x55\xef\x7b\x73\x4a\x7c\x5e\xe2\xd9\x27\x95\xef\x17\x47\x49\x7b\xa4\x3b\xfc\x0c\xeb\x24\x4e\xca\xf8\xb2\x6b\xa4\xf0\x1c\x14\x90\x32\x29\x49\xef\x09\x6c\x91\x0e\x0a\x8d\xe5\xc9", 47, { 0xca, 0x4d, 0x13, 0x4c, 0xb6, 0xdf, 0xee, 0x5b, 0x9f, 0xb9, 0x05, 0x0d, 0xb6, 0x91, 0x7d, 0xd7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x11\xc1\x3f\x4a\xd2\x5b\xba\xef\x1e\x7c\x66\x4a\xb5\xe6\xaa\x41\xc2\xef\x56\x56\xf7\x91\x45\x01\x45\x9e\xab\x3a\x38\x10\x01\x13\xee\x7f\x8a\x81\xb2\xab\x80\x3b\x39\x39\xe0\xba\x78\x7b\xcf\x61", 48, { 0xf5, 0x57, 0x8d, 0x27, 0xa0, 0xa1, 0xcb, 0xc7, 0xe8, 0x2f, 0x77, 0xec, 0xdd, 0xa3, 0x84, 0xf7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x20\x68\xa7\xb7\xb8\xab\xa3\xcf\x55\xd7\x23\xc9\xf7\xb7\x9b\x71\x83\xc3\x1e\x04\x59\xaf\x83\x13\x91\x1e\x31\x81\xd7\x75\x8d\xa6\xe0\xca\xfc\x96\x88\xfa\x97\x7c\x8a\xd9\x6b\x1f\xdb\x85\x69\x87\xa3", 49, { 0x94, 0x10, 0x45, 0x76, 0xe9, 0xd7, 0x75, 0xce, 0x30, 0xcb, 0x28, 0xb7, 0xbc, 0xc0, 0x98, 0x94 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd4\xf1\xb9\xd9\xeb\xf5\x9d\x7a\xf0\xcd\x01\x65\xd7\x98\xb6\xd6\x59\x49\xd8\x7d\x03\x55\x2c\x3a\x6b\xf7\xa1\x78\x7d\x1e\xf9\x23\xf3\xf5\x81\x47\xe3\x0c\xfc\x46\x72\x28\x9e\xb6\xa6\xa4\x34\xd5\x5a\x81", 50, { 0x8f, 0x3d, 0x45, 0x4f, 0x31, 0xdc, 0xf9, 0xdc, 0x48, 0xbe, 0x95, 0x53, 0x80, 0xf1, 0xc0, 0x74 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x61\xa9\x4a\x12\x02\xb8\x4e\x3d\xb3\x61\xa4\x6e\x6b\xd6\x66\x1e\x42\xb7\x1a\xfb\x54\x4b\x68\xb5\xbd\x5d\xe6\x65\xc3\xb1\x0f\x99\x13\x22\x53\x00\x24\x59\x48\xaf\xb8\x2c\xfe\x0d\x81\x90\x70\x62\xe0\x3c\x15", 51, { 0x5d, 0xe7, 0x06, 0x6a, 0xbc, 0x01, 0xd0, 0x64, 0x94, 0x29, 0xae, 0x04, 0xf1, 0xcc, 0xb5, 0xd6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf6\xc8\xdd\x96\xe9\xc2\xef\x9b\x8f\x09\x3f\xbf\x85\xd5\xfa\xa2\x55\xb5\x70\x1c\xc1\x15\x6b\x8e\xb0\xdf\x26\x55\xb2\x3e\xec\x58\x32\x7e\x4f\xc1\x37\x10\x01\xc8\xd6\xa9\x52\xab\x38\x89\x46\xba\x44\xd9\x52\x8e", 52, { 0x84, 0xae, 0x25, 0xbc, 0x36, 0x9c, 0x91, 0x9b, 0x44, 0x2e, 0xd6, 0xef, 0x9e, 0x1f, 0xe2, 0x8f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe9\x2d\xb3\x5a\x09\x2a\x6c\x59\x05\x41\xda\x67\xe1\x99\xf5\xac\x14\x0b\x25\x73\xef\x47\xbe\x19\xa7\x14\x1a\x20\x01\xb4\x52\x63\x99\x65\x98\x64\xce\x04\x34\xc1\x4d\xcd\x19\xc5\x39\x3d\x24\x1b\xf4\x18\xf0\x9e\x8d", 53, { 0x1e, 0xa3, 0x3b, 0xad, 0x84, 0x80, 0xa6, 0x3e, 0x7a, 0xbe, 0xe1, 0xc2, 0xf6, 0x07, 0x6c, 0x8f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x86\x58\x4b\xc6\x59\x8a\x58\xc0\x6a\xc4\x5e\x45\x21\xaf\xb1\xb2\x12\x54\xd0\x7f\xc4\xbf\xf8\x6d\x8e\x2f\xd3\x4b\x9b\xf6\x4e\x64\x0c\xf3\x88\x88\x3c\xaa\xe6\xb5\x1f\xfd\x43\x63\xc3\x89\x45\x69\xf9\xa0\xcb\x8f\x0d\xde", 54, { 0x18, 0x55, 0xdc, 0x67, 0x81, 0x98, 0xdf, 0x9d, 0x59, 0x3d, 0xed, 0xb3, 0xf2, 0x14, 0x22, 0x43 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x82\xb1\xb0\x6a\x97\x8c\xf7\xcb\x86\x28\x7c\x64\x11\xe2\xa2\x8e\x4d\x15\xf7\x50\xd6\x64\xb2\xbd\x23\xa7\x5b\xeb\xf4\x70\x8a\x8b\xe8\x39\xc7\x2a\x2b\x2b\x91\x03\x4c\x8d\x7a\x7e\x2c\xc8\x6f\x49\x12\x13\x16\x12\xdc\xbf\x50", 55, { 0x7c, 0xd8, 0x1e, 0x1e, 0xfb, 0x01, 0xad, 0x5a, 0x4c, 0x0e, 0x83, 0xbd, 0x9d, 0x2e, 0xe1, 0xff }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xde\x50\x21\xdd\x09\x91\x17\x1f\xda\xad\x39\xf7\xc2\x53\x9e\xcc\x32\xa2\x48\xaa\x16\x1c\x2d\x86\xf1\xb9\xe2\xa0\x96\x18\xe6\x01\x80\xd0\x89\x24\xcf\xe5\x77\xb1\xe0\x57\xe5\x64\x87\xd4\x57\x0d\xeb\x8d\x0b\xb0\xff\x25\x06\xcc", 56, { 0xb5, 0x25, 0x80, 0x30, 0x10, 0x74, 0x47, 0xb8, 0xac, 0x64, 0xa9, 0x31, 0x47, 0xd4, 0x6a, 0x69 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x99\xc6\xb8\xb9\x30\x4e\x4e\x2a\x37\xa7\x95\xd2\x10\x35\x86\x24\xaf\x68\x72\x32\xcc\x71\xcb\xb7\xc4\x11\x8c\x30\x0d\x8c\x46\x24\x54\xbd\xc8\x85\x35\x43\x6b\x2f\x96\xd9\xf7\x8d\xa0\xc4\x36\x5b\x5b\x65\x13\x85\xe6\xee\x6d\x2f\x4f", 57, { 0xf2, 0xeb, 0xbc, 0x0f, 0x7b, 0x22, 0x29, 0x53, 0xd2, 0xcb, 0x16, 0x52, 0x41, 0x8f, 0xf5, 0x27 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x31\x7e\xce\x15\x94\xe2\x73\x37\x21\x47\x28\xf8\xba\xb0\x73\x32\x69\x65\xf7\x54\xd6\x7b\x3a\xfa\xd2\xfc\x82\x28\x0f\xb2\xd8\x22\xf2\x95\x2e\xea\x81\xce\x9c\x57\x77\x67\xc6\xce\x77\x92\x5a\xa0\x5d\x93\xb6\x00\xaf\x4a\xa6\x9f\x32\x61", 58, { 0xb7, 0x47, 0x82, 0x40, 0x69, 0x9d, 0x2d, 0x25, 0xd5, 0xce, 0x1b, 0xd5, 0xeb, 0x8c, 0xbf, 0x71 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4b\xe6\x99\x0e\x17\xcf\x58\x85\xf4\x60\x98\xfe\x84\xc6\x43\x5e\x84\x0a\x3e\x84\x4a\x72\xb7\x33\x6d\x77\x94\x97\x83\x5d\x0a\x76\x05\x75\x4f\xf4\x4f\xeb\x67\x02\xc4\x4c\x1b\x65\x0f\x99\x09\x5f\x84\x00\xd4\xfc\xa4\x3d\x7b\xfa\xbf\x8d\xc7", 59, { 0x82, 0x36, 0x57, 0xa2, 0xc1, 0xad, 0x78, 0x3f, 0xb9, 0xfb, 0xa2, 0xc6, 0x79, 0x7e, 0xca, 0x7a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x55\xb4\x4a\xde\x6f\xd4\x28\xf6\xd9\xe5\x0a\x23\xc1\x42\x82\x50\xf8\x20\xe4\x4c\x9e\xeb\x05\xfc\x6b\xce\x95\xaf\x9d\x52\x16\x8f\x7a\x1e\x78\x32\x81\xdd\x53\x50\x31\x3d\xc0\x8f\x75\x13\xd5\x7b\xaa\x9b\xbb\x91\x4f\xdd\x6c\x7a\x48\x2c\x0e\x55", 60, { 0x7a, 0x3f, 0x5c, 0x60, 0x63, 0x7e, 0x72, 0xdf, 0xcc, 0x23, 0x8a, 0xa3, 0x84, 0x14, 0x20, 0xe2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xcf\xc9\xe7\x2d\xf7\xa4\xfd\x8a\xde\x42\x4b\x23\x6f\xba\xa1\xb1\xd1\xd9\x19\xde\x70\x65\x31\x5c\xa6\x7f\x8a\x13\x05\x21\x3c\x72\x43\xc7\xd4\xe7\xc3\x2b\xeb\x69\xbc\x28\x64\x32\x08\xc0\x41\x8b\x8b\x39\x22\xbf\x3e\x62\x5c\x31\xd7\xf3\xb2\x8a\x17", 61, { 0xe3, 0x74, 0x31, 0xe3, 0xd2, 0x5e, 0x01, 0x00, 0x51, 0xde, 0x8c, 0x48, 0x58, 0x76, 0xaa, 0xca }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x12\xb3\x0a\xb0\xf2\xaf\x00\xd0\x96\x57\x55\x4e\xb4\xf0\x42\x70\xb4\x34\x21\x56\xd7\xc5\x61\x07\x75\x4f\x94\x17\x5e\x39\xa3\xf1\x62\x07\x21\xc7\xed\x4f\xbc\x13\xca\x55\xd0\xc8\x08\x46\x15\x1a\xfa\x0d\x79\xe7\x58\xd6\x09\xc0\x82\x1d\x08\x98\xe5\x72", 62, { 0x14, 0x7a, 0x4d, 0x78, 0xbe, 0xcf, 0x03, 0xf0, 0xa6, 0x57, 0x16, 0x8d, 0x7e, 0x07, 0xa8, 0x36 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x22\x09\x76\xcb\xba\x3d\x5c\x85\x60\x7f\xaa\xf9\x5e\x5e\x4a\xb7\x71\x7b\xf5\x62\x95\xf0\x5e\x28\xf9\x5d\x6e\xdb\x12\x90\xaa\xb1\xcc\xd0\xb2\x95\xdb\xc7\xe3\x27\x2f\x09\x1b\x57\x85\x45\x9c\x99\x1a\x07\x09\xc5\x7a\x27\x8e\x8f\x77\xd2\x1d\x9e\x36\x32\xd3", 63, { 0x8d, 0x97, 0x7a, 0xb1, 0x6f, 0x7a, 0x54, 0x80, 0x88, 0x10, 0x07, 0x3b, 0xb4, 0x6a, 0x19, 0xb9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4a\x64\xbd\x79\xf7\x86\x17\x25\x09\x6d\xa5\x01\x83\xc7\xaf\x23\x3f\xd2\x31\x9c\xcc\x2c\x3f\x8d\xdf\xc7\x12\x72\x78\xf8\xb3\x82\x93\xae\x42\x2f\x86\xbf\xe3\xc8\xfd\x5e\x46\x3f\x90\xa9\xd2\x04\xfe\x5f\x6e\x0f\x09\xaf\xeb\xfd\xed\x2b\x11\x52\x7e\xdc\x45\xdd", 64, { 0x15, 0xf4, 0x8b, 0xb9, 0x10, 0x92, 0xcd, 0x68, 0x96, 0xc1, 0x4c, 0x7d, 0x00, 0x47, 0x36, 0x34 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdd\x6e\xd4\x39\xd6\x8c\xde\x6f\xda\x47\xe1\xb9\x94\xaf\xe1\x62\x29\x84\x32\xc9\x11\x06\xe2\x84\x8d\xe9\xc5\xa0\xc4\x65\x1d\x07\x7e\x69\xe6\xfb\x7c\xef\xbc\xbe\x71\x6b\x6a\x54\xa1\x5d\x10\x60\x15\x06\xf0\x2b\x78\x37\xd5\xc4\x92\x44\x20\x41\x5e\x18\x70\x23\xc9", 65, { 0x8e, 0x53, 0x6f, 0xfb, 0xda, 0xda, 0x44, 0x77, 0xb3, 0x44, 0x3e, 0x65, 0xec, 0xbc, 0x40, 0x2a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x62\xed\xd8\x0a\xed\x32\x59\x98\x0e\xd4\xf4\xcd\x36\x93\x24\x15\xa7\x1d\x9c\xd2\x44\x79\x63\xd0\x81\x16\x18\x60\x79\x71\x57\x13\x1e\x5d\x34\x15\x8a\xf2\xe4\x23\x75\x14\x7c\x2a\xc0\x9f\xd1\x7e\x2d\x2c\x7d\xb3\x32\x83\x03\x1c\xe2\x9d\x0a\xdd\x0b\x54\xc6\xaf\x5f\xa9", 66, { 0x3b, 0xd1, 0xd1, 0xc0, 0xfa, 0xcb, 0x9c, 0xdb, 0x86, 0x97, 0x8f, 0x09, 0x31, 0xa6, 0x10, 0xca }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x74\x30\xca\xb2\x03\xe5\xe2\x1e\xd0\xcd\x7d\x66\x8a\xa2\x5c\x92\x35\xaf\x04\xa5\x4a\x49\xad\xa7\xfb\xeb\x54\x4d\x93\xf2\xeb\x46\xfc\xf1\xb1\x24\x5a\xb2\x9c\xe5\xd5\xca\xf1\x1e\x75\xd8\xf6\xc3\x26\x5a\xc0\x95\xda\x2b\x26\x28\xcd\x9d\xd6\x90\xe4\x2f\x85\xa8\x2f\xeb\x42", 67, { 0xfe, 0x03, 0x68, 0xe3, 0xc5, 0xf8, 0xb8, 0x4d, 0x9b, 0x29, 0x4b, 0x26, 0x36, 0x39, 0x34, 0xe6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfe\x8e\x5f\xe4\x5e\x6f\x35\xa2\xfa\xb5\x71\xc1\x33\xb4\x47\x68\x06\x59\x97\x8f\x16\x67\x06\x16\x52\xdc\xba\xf2\x42\x72\xb1\x82\xf3\x41\xbf\x00\x7d\x81\x22\x12\x2e\x6e\xc3\x80\x55\x44\x0c\x01\xac\x6a\x60\x2e\x63\xab\x3b\x98\xc5\x9f\xe8\xf5\x89\x28\xd9\x75\xb8\x18\xa6\x33", 68, { 0xb7, 0x0e, 0x24, 0x63, 0x59, 0x66, 0x0c, 0xa2, 0xfb, 0x46, 0xc6, 0xa1, 0x72, 0xd1, 0xd9, 0x3f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x35\xf0\xa5\xc6\xee\xc3\x22\xf8\x9e\x3a\x3b\x8e\x3c\xb0\x5b\x46\x03\x7d\x51\xdf\x1f\x50\x0c\x52\xf1\xb6\xf5\x1e\xff\xb7\xe9\xc1\x7b\x9f\xd2\x42\x6e\xda\xe1\xeb\x81\xf9\x69\x15\x68\xd1\x5b\x1b\xec\xc2\x5a\x71\x93\x15\x7a\xcd\xed\x7f\x9a\x83\x7e\xc2\x5b\xee\x43\x73\xbc\x0a\xe3", 69, { 0xd4, 0x3f, 0xb8, 0xeb, 0x1a, 0xb1, 0xed, 0xed, 0x3a, 0x26, 0x8f, 0x0b, 0x7d, 0x06, 0x0a, 0x64 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd6\x54\x1f\x73\xe5\x2b\x98\xe6\x70\x34\xf2\x10\x5e\x6b\xd0\x55\x11\x87\x2b\xf2\xe8\x5d\xa6\xe7\xde\xd1\xff\x80\x4f\x79\xa2\x7f\xdb\xd0\x58\xe8\x63\x13\x1c\x69\x31\xbb\x0e\x63\x34\x98\x81\x99\x68\x87\x2f\x74\x54\xd0\x8c\xf0\xad\x1e\x37\x27\x18\x1b\x8d\x78\x0d\xa8\x58\x54\xd7\xb6", 70, { 0xbd, 0x93, 0x38, 0x13, 0x7b, 0x70, 0x0d, 0xa8, 0x1b, 0x1a, 0x7a, 0x2d, 0xbe, 0x11, 0x15, 0x38 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa5\xa5\xb7\xc4\xb3\xda\x29\xf5\x07\x93\x3e\xcd\x9d\xe6\x28\x88\x38\x4c\xd4\x17\xdb\x2c\xb2\xb8\x50\x01\x90\x30\xe5\x2a\xa4\xa8\x37\x4e\xa8\x21\x26\x69\x20\x96\xe8\x78\xb7\xad\x39\xbd\xc7\x19\xb0\xaf\xf8\x8f\x2d\x82\x00\x62\x6f\x4e\x88\xbd\xc2\xdf\x2f\x7d\xd5\x18\xa7\xa9\xa9\x04\xfd", 71, { 0x7a, 0x7d, 0xc9, 0x94, 0x96, 0xaf, 0x51, 0x90, 0xc5, 0x48, 0x51, 0x9b, 0xeb, 0xd2, 0x6d, 0x3c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8e\xa6\x7b\xf7\x7b\xc8\x6d\x96\x16\xf6\xce\xbb\x5a\x73\x1e\xe6\x2e\x6d\x93\x19\xa2\xb3\xe6\xdb\xc8\x84\xb7\x58\x2d\x83\x9e\xa6\xf3\xc6\xcf\x22\x8c\x0d\x69\xf9\x15\x0f\x5b\xc3\x4d\xf0\xf3\x49\x30\xd0\x05\x67\x34\x7d\xb4\x0d\x1f\x48\xe0\x5f\x83\xf5\x2c\xfc\xd7\xcc\xaa\x5c\x34\xcc\x26\x53", 72, { 0x82, 0x13, 0x1c, 0x29, 0xf6, 0x16, 0x5a, 0x23, 0xba, 0xc4, 0x25, 0x2c, 0x5a, 0x9e, 0x9b, 0xde }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa9\xff\x0c\xb2\x3b\xe9\xf7\x0c\x7c\x1a\xd6\x96\xc6\xe3\xbd\x28\x15\x25\x46\x60\x7e\x45\xa1\xe6\x50\x3b\x3f\xc9\xc6\xca\x17\x08\x65\xca\x94\x2e\xf8\xa1\x1b\x14\x26\xd0\x3c\xca\xad\xa9\x74\x91\x3d\x1e\x9d\xff\xf3\xb5\xf3\x45\x70\x99\xc3\x8e\x96\xca\xb2\x7d\xdf\x73\xa7\xd9\x59\x5c\x56\x45\x42", 73, { 0x92, 0x2d, 0x15, 0x76, 0x2c, 0xb6, 0xf5, 0x81, 0x60, 0xcc, 0x0e, 0xd5, 0x09, 0xff, 0x39, 0xb8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x76\x6a\x28\x3c\x94\x4e\xab\x2c\x39\x99\xe0\xb5\x8c\x14\x00\x4c\x68\x68\xcd\xf8\x90\x69\x16\xa9\xff\xf9\x59\x32\x5e\x9a\x82\xe3\x8f\x94\xd2\xc7\x66\xbf\xdb\x77\x78\xee\xa7\x99\x0b\xf8\xf9\xf9\x2d\x64\xab\x41\xe0\xb0\x36\x58\x72\x3e\x50\x55\xec\xdc\xb0\x1f\xa0\xee\xed\xa3\xe5\x3a\x84\xb0\xe0\x50", 74, { 0xa5, 0x43, 0x80, 0x60, 0x02, 0x56, 0x20, 0x34, 0xdf, 0x73, 0x76, 0xbf, 0xe5, 0x73, 0xcb, 0xbc }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\x72\x78\x94\x14\x89\x6b\xea\x4c\xc5\x7f\xfc\x42\x80\xd0\x2a\x64\x98\x48\x0f\xb2\x08\x2e\xad\x9d\x23\xd5\x34\x0b\x6c\x74\x74\x78\x14\x16\xdc\x36\x11\xa8\x2e\xd4\xd7\x30\xc1\x9d\xb5\x1d\x72\x38\xcf\xb9\x28\x6d\xb4\xba\x03\x07\x9b\xf8\x21\xd4\x3f\x3a\x0c\xc9\x54\x29\xc3\x42\xa4\x66\x64\x68\xcb\xb7", 75, { 0xf9, 0x8f, 0xcc, 0xd8, 0x9b, 0xcd, 0x41, 0x55, 0x5b, 0xb0, 0xb5, 0xa2, 0xf4, 0x53, 0x3a, 0x88 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x73\xac\x8b\x5c\xc9\x6f\xcd\x80\x1b\xc4\x35\xcb\x26\x4d\x60\x14\x74\x42\xbd\x34\xce\x90\x05\xf6\x3f\x1d\x58\x2a\xc0\x2a\xf6\xd9\x85\xd2\x96\x92\xe3\xaf\x66\xe3\xdc\x9c\xa0\xe3\x49\x94\xc6\xec\xa2\xb9\x7a\x67\x6d\x71\xfc\xc0\x41\xab\x40\x78\x76\x40\xab\x58\x6c\x74\x6a\xc3\x74\x9b\x6f\x25\x5e\xd8\x09\x88", 76, { 0xaa, 0x3b, 0xd6, 0x8d, 0x86, 0x26, 0x1f, 0x65, 0xe7, 0x23, 0x96, 0x84, 0xda, 0x55, 0xa7, 0x8d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9f\x01\x1f\x45\x1f\x9e\x09\xd7\x9d\x10\x0c\xcb\xc0\xcf\x6f\xd3\xbb\xcc\x3e\xfb\x9b\xf5\x9b\xf3\x30\xd7\xbb\x8a\x96\x5d\x84\x3c\x5f\xb6\xc2\xe2\x5e\x55\x00\x87\x12\x12\x09\x5b\xae\x6e\xfb\xc1\xc1\xf3\x04\x83\x87\xba\xbc\x25\xcb\x06\x1f\x57\x77\x0e\x25\x83\xba\xd8\x00\x87\xd4\x41\xf2\x7d\x81\x19\xc8\xb5\x00", 77, { 0xe5, 0xee, 0xc1, 0x56, 0xbb, 0x5a, 0x4f, 0xa7, 0x4c, 0x76, 0x0d, 0x17, 0x27, 0xfb, 0xc2, 0x3e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6b\xf6\xc4\xbe\xda\x50\xb6\xa4\x26\x63\x5e\xfa\xce\x6e\xcf\xf6\xd0\x00\xe3\xe5\x8c\x2f\xf8\xf5\xc7\x72\xbb\x9d\xca\x1c\x1c\xa9\xaa\x76\x61\xe5\xa3\x77\x56\x65\x9e\x22\xa2\x70\xd2\x7c\x36\x07\x86\x29\xde\x15\xf4\xa3\xfa\x34\x4a\x15\x46\x19\xca\xda\xd4\x9e\x11\x8d\x1c\x6b\x74\xcc\x2a\x3f\x86\x8e\xf5\xe0\xb6\x1e", 78, { 0x78, 0xa5, 0x61, 0x3a, 0x59, 0x4a, 0x02, 0xa5, 0xa3, 0xa6, 0x94, 0x54, 0x0b, 0xe8, 0x94, 0x0f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd0\x9d\x15\xb4\xf9\x7d\x36\xae\x4f\x06\x2e\x70\x21\xab\xbb\xd5\x22\xd3\x81\x50\x78\x82\x6f\xa4\xf3\xa6\x41\x3c\x5b\x00\x1e\x27\xe2\xad\x61\xb4\xb8\x51\x75\xa7\xbe\xdf\xd9\x15\x52\x06\x43\xe1\x49\x3b\xe1\xd3\xfa\x5f\xba\x52\x77\x0e\x33\xbe\xd7\x84\xae\x6c\xaf\x2b\x4d\x3f\x9f\xc5\xd4\xdf\x08\x32\xac\x99\xdb\xdf\x04", 79, { 0x23, 0x58, 0xdd, 0x9f, 0x9e, 0xdd, 0x10, 0xda, 0xc2, 0x01, 0x1b, 0xaa, 0xb3, 0xec, 0x5e, 0x13 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x8d\xcb\x12\x2a\x27\x37\x78\x2a\x79\xea\xc1\xa9\x6e\x1e\x0a\xc0\x7b\x0a\xbd\x67\x31\x0d\x79\xac\xf3\x74\x0e\x90\xc1\xe8\xa4\x7e\x32\x77\xfb\x69\x80\x3d\xcc\x81\xbd\xae\x4f\x91\x24\x83\xd6\xf8\x8b\x3f\x96\x41\xf4\x5d\x86\x62\x42\x18\x61\x8e\x08\xd6\xc5\xb7\x7d\x32\x7d\xa3\x8c\xa5\xdc\xaa\x08\xd0\x40\x0a\xfd\x68\xb6", 80, { 0xe2, 0xa8, 0x37, 0xb5, 0xf7, 0x9d, 0x34, 0x76, 0x8c, 0x62, 0x65, 0xbe, 0x61, 0xb3, 0x81, 0xfb }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe6\x21\xbe\xbc\xe1\x6a\xea\x21\x53\xb9\x93\x09\x27\xb4\x5e\x0d\x51\xb1\xf1\x7f\xee\xcd\xa3\xcb\xf9\x1d\xc2\xf8\xa7\xfc\x80\x4e\x61\x84\x7a\x12\x5c\x18\xe6\x6d\xd6\x1d\x59\x6b\xee\xc8\x33\x1e\x20\x12\xa8\xe3\x5d\xc9\x6b\xbc\xc3\xc0\xf9\xdd\xfe\x27\x7f\x42\x3a\xf5\x68\x7d\xc4\x81\x87\x8e\x3c\x30\xde\xea\x79\x49\x09\x9e\xf9", 81, { 0x56, 0x9a, 0x78, 0x23, 0xde, 0x2b, 0xe3, 0xea, 0x51, 0x96, 0xff, 0x8d, 0xac, 0x0f, 0x6e, 0x95 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe5\x4a\x8d\x03\x02\x32\xd5\x5c\xb6\xe8\x50\xa1\x80\x19\x36\x47\xba\x7c\xe0\x2d\x2a\x00\xa7\xdb\xb9\x95\xeb\x5a\x3b\x94\x30\xaf\x6c\xcc\x62\xf5\xfc\x2a\x39\x16\xc1\x04\xb7\x26\x0c\x02\xcf\x5c\x16\xa9\x20\xad\x98\x85\xde\x07\x79\xf3\xd2\x27\xa2\x88\x78\x17\xee\x22\x46\x48\x3d\x89\x0c\x47\xa7\xc1\x76\x1f\xce\xee\xaf\x4c\x4d\xe4", 82, { 0x2e, 0x98, 0xba, 0x76, 0xed, 0xff, 0xf1, 0x24, 0x93, 0x11, 0x1d, 0xae, 0xa9, 0x3c, 0x2c, 0x19 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x20\x57\x4d\x4b\x56\x13\x36\x6b\x02\x72\x81\x9a\x19\x04\xac\x3f\x1c\x0e\x47\x82\x72\x43\x2c\x92\xf1\x22\xcc\x92\x7b\xeb\xa3\x21\xc5\x3f\xcd\x84\x33\x53\xb3\x73\xdf\xd0\xdd\x7d\xb9\x4b\xec\x18\xc8\x5c\x9f\x49\x8f\x5d\x12\xec\x8a\xc1\x08\xa1\xd7\x0e\x5d\x53\xf2\x78\x9e\x66\x99\x1c\xb4\x7c\xce\xd5\xbb\xe4\xfb\xbf\xf0\xa1\x2f\x46\xc9", 83, { 0xc1, 0x06, 0x74, 0x68, 0xa6, 0x97, 0x98, 0x95, 0xee, 0x75, 0x92, 0x71, 0xe1, 0xe8, 0x5a, 0x0a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x12\x87\xe9\x1f\x42\xa8\x91\x87\xce\x68\x88\xbe\x6f\x8c\x18\x42\x24\xac\xc1\xfd\xfd\x33\x15\x1c\x85\x83\x34\xff\xcd\x35\xe0\x49\x11\x7e\x3c\x16\x0a\xad\x26\x4c\xcf\xd0\x2d\x0b\x69\x76\x31\x3e\xf2\x90\x96\x53\x68\x71\x24\x07\x13\xf5\x7f\x5a\x91\xbd\x3e\xa2\x7b\x98\xa9\xbc\xb6\xfd\x14\x5d\x58\xb4\xd2\x86\x34\x95\xd8\x16\x04\x69\xf0\x79", 84, { 0x0b, 0x29, 0x0b, 0x0f, 0xff, 0xe0, 0x89, 0x9c, 0xea, 0x43, 0x82, 0xda, 0xea, 0x48, 0x69, 0x79 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x32\xed\x96\x7e\x43\xf4\x73\x47\xe0\xac\x73\x59\x83\xf9\x85\xd4\xba\xfd\xef\xbc\x1b\xb9\x4b\x75\xc5\xcd\x21\x4e\x8e\x5b\x22\x34\xce\x0a\xff\x87\xc7\x26\xe4\x09\xaf\xe5\x95\xf2\x5c\xc5\x23\x22\x8c\x10\x4a\x6e\xcd\x81\x6a\x1b\x0f\x01\x20\x69\xc4\x8a\x81\x46\xb1\x2d\xf3\x24\x55\x2e\xa7\xe4\xf2\x4d\xb6\xf1\x3c\x20\xd7\x6a\x9d\x9b\xbb\x77\x23", 85, { 0xd1, 0xd8, 0x5e, 0xa5, 0x95, 0xa7, 0x49, 0xac, 0x47, 0x06, 0x57, 0x0d, 0x28, 0x00, 0xf4, 0xa0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb2\x05\xbd\x07\x15\xe9\xec\xdb\x1a\x60\x75\x4f\xb9\x05\x59\x9f\xb0\x90\x1d\x9d\xc7\xec\xda\x56\x2e\xf6\x70\x64\x02\xd4\xdb\xd0\xee\xf0\x9e\xa1\xee\x90\x5b\x06\x2f\x14\x84\x1b\x13\xcb\x2c\x5b\x50\x71\xf7\xa3\x38\x49\x30\xdf\x13\xd3\xf9\x53\xa8\x2b\x9d\x88\xdb\xfe\x02\xd1\x70\x29\x3a\x78\xed\xf0\x38\x8a\x9e\xd7\x9f\x3c\xb2\x20\xb6\xf9\x83\xe2", 86, { 0xf1, 0x5f, 0x79, 0x80, 0x57, 0x2d, 0x9a, 0xb6, 0xc1, 0x7f, 0x79, 0xf3, 0xc9, 0x37, 0x04, 0x63 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x78\x09\xf3\xc3\xc8\xdf\xf2\x52\xc2\xff\x1b\x03\x2d\x8a\x7e\xc8\x0c\x67\x79\x48\x54\x10\xbf\xbe\xb7\xf6\x7a\x71\x9f\x92\x8d\xcb\x36\x0a\xf2\x19\xa2\x7c\x43\xde\x4e\xe9\x54\xd4\x64\xc1\xfd\x80\x57\x07\xf5\x71\x9c\x20\xd9\x15\x78\x3e\x4d\x37\xf4\x64\x39\x19\xee\x15\x35\x29\x4a\x9d\xff\x64\x45\xfb\x29\x44\xe9\x69\xd0\x67\x9d\x8a\x86\xbe\xd4\x2f\x51", 87, { 0x1b, 0xd6, 0xd5, 0xe4, 0x5a, 0xec, 0x0f, 0xb0, 0x32, 0x9f, 0x48, 0xd3, 0x30, 0xa0, 0x5c, 0xc7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6e\xe6\xc6\xcd\x46\xfb\x60\x6c\xdd\x23\x5d\xde\x48\x84\xb7\x8c\x76\xab\xe7\x3d\x28\x03\x77\xdb\x8f\x63\x26\x50\x83\xc1\xb1\x8b\x5e\x04\x44\x9f\x73\xf8\x7d\x0a\x2e\x5b\x19\x12\xca\x14\x3d\x4b\xa9\x83\x63\x36\x53\xf3\xdf\x04\x0d\x2c\x0d\x78\x15\x26\x19\xea\x79\xd7\x6b\x67\x91\x2d\xad\xf6\x1f\x18\x7a\xf6\x01\xbe\xa4\xa3\x90\xd2\x22\xb7\x99\xff\x95\x2c", 88, { 0x10, 0x9b, 0xe4, 0xa6, 0xe5, 0x6b, 0x8b, 0xa9, 0x93, 0x3d, 0x1f, 0x2b, 0x86, 0xee, 0x43, 0x6f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf6\x7e\x75\x20\xc8\xc7\xdc\xd2\x52\x63\xef\xc9\x75\xe0\xe5\x14\xc4\xde\xb5\xac\x43\x47\x60\xf5\xc1\x9c\xd8\x63\xcf\x6a\x8c\x3a\x5c\xdb\x91\x6e\xee\x68\x6e\xa8\x7f\xac\x84\x6a\xf2\x54\x18\x49\x30\x33\xff\x59\xe4\x72\xe5\xa8\xcf\xe5\x39\xe0\xc8\x78\xb8\x10\x54\xc8\x95\x84\xde\xce\x42\xd0\x93\xb6\xde\xec\xdc\xce\x3b\x79\x79\x99\x8a\x22\x37\x04\xa6\x1d\x4d", 89, { 0xc5, 0x4b, 0x08, 0x71, 0x93, 0xf9, 0x29, 0x50, 0xdf, 0x2e, 0xf2, 0xdb, 0xd3, 0xc0, 0x45, 0x8e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb0\xfa\xd1\x59\x6e\x0f\x92\xf2\xc9\xb5\x87\xe9\xbc\xcd\xad\x21\x84\xb2\xf4\x08\x90\x42\x87\xb1\x96\x8c\x29\x90\xbf\x18\xbb\xd1\x02\xcd\xda\x55\x8f\x83\xa5\x4a\x61\x26\x9c\x65\xf6\x83\xa4\xbf\x1b\xb2\x27\x49\xe0\x20\x58\xee\xac\x38\x94\x44\x69\xae\xe4\xed\xdf\x68\x9f\x90\x1f\x09\x2c\x6f\x15\x1a\xe5\xa6\x41\xd7\x18\xff\x7f\x94\x27\x74\x02\xca\xcf\x42\x5f\xc2", 90, { 0x87, 0x4d, 0x37, 0x7f, 0xf8, 0xc5, 0xf8, 0xbc, 0xa4, 0x91, 0x41, 0xf0, 0xcb, 0xc4, 0x24, 0xfc }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x85\xa6\xc5\xdd\xfc\x37\x4b\x7e\xc4\xdf\x62\x94\x0c\x77\x6a\xc7\x88\xfe\x60\x3e\x6d\x76\xb4\x0b\x99\x5c\x38\x34\xd1\xc2\x35\x5f\x22\x0a\x98\x19\x68\x41\x4a\xc3\xed\x15\x9d\x19\x29\x75\xe1\x60\xa8\xc4\x17\x2c\x09\xb9\xbd\xcb\x22\xd5\xc8\x51\x41\x82\xb0\x41\x8d\xc5\xa5\xd5\x8c\xa0\xdf\xeb\xbe\x07\x13\x8c\x66\x7c\x01\x19\x68\x49\x2a\x14\x4d\x5a\xa0\x88\x64\xb4\xf5", 91, { 0x9a, 0x75, 0xb0, 0x83, 0xa7, 0xef, 0xdc, 0xd1, 0xec, 0x55, 0x02, 0xe0, 0xc3, 0x21, 0x11, 0xcb }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x17\x04\x96\x55\x9e\xec\x2a\xb0\x86\xcb\xe8\x0f\xaa\xdb\x88\x08\xe0\xa7\xa1\x4d\x26\xee\xe3\x5e\x6b\xa0\xee\x5f\xf7\x05\xcc\x04\x77\xfd\x12\xa8\xa9\x62\x8e\x7d\xa0\x89\xad\xde\xb4\xe8\x6c\xc1\x0a\xd1\xf9\x48\xbc\x5c\xe6\x76\xa4\x64\x08\xfe\xca\xa7\xf2\x37\x68\x11\x09\x2d\x96\x12\x44\xd1\x96\x2b\x83\x50\xbe\x89\x88\x80\xfe\xc8\x96\x77\x0d\xd8\xa4\x36\x35\xfd\x3e\x83", 92, { 0x76, 0x5a, 0x38, 0x22, 0x4b, 0x74, 0x03, 0xca, 0xef, 0x81, 0xf9, 0x95, 0x2f, 0x9a, 0x61, 0x09 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb7\xf0\xf9\xd4\xdc\x23\x91\x67\x99\x22\xa1\x6f\xdd\x15\xfd\x68\x7b\x62\xaf\x8c\xaf\x6f\x8d\x5e\x4f\x85\x74\x63\x8f\xd0\x23\xf0\x71\x83\xb6\x1f\xc7\x18\xbc\xdb\xe6\xb5\xf8\x1b\xe9\xaa\xb1\x2c\x9f\x17\xb6\x26\x12\xab\xf2\x80\xb5\x87\xa7\xc0\x29\x40\x4b\x4a\xac\x03\xfc\x5a\x1e\xd3\xa0\x0d\xb1\xef\x9d\x99\x2d\x4f\x32\x9e\xde\x4c\x70\x94\x1b\x5f\xd9\x63\x73\x01\x93\x11\x75", 93, { 0xd5, 0x80, 0x2e, 0xe7, 0x75, 0x2b, 0x14, 0x45, 0xe7, 0x79, 0xbb, 0x8a, 0x9e, 0x25, 0xbe, 0x59 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb2\x49\x95\x1c\x16\x9f\xcb\xd5\x39\x4f\x81\x2f\xf3\xe5\xae\x1e\x67\x13\xc2\xec\xa5\xb2\x19\xbd\x70\x56\x89\xbd\x19\x8c\x1a\xe8\x8a\xb2\xd5\x75\x5f\x73\xb5\xe0\x2e\xdf\xba\x93\xe7\x23\x1d\x30\x57\xe9\x9e\x7e\xc7\x4f\xf9\xed\xc1\x7c\x77\xc7\xf2\xe5\xa0\xf5\x2b\x1b\x0e\x6c\x81\x4e\x5c\x32\x95\x62\x3e\x11\xee\xac\xab\xd6\x82\x49\x34\x46\x54\x1b\x78\x9f\x37\x61\xb0\xc6\xb0\xf2", 94, { 0xe7, 0x95, 0xef, 0x83, 0xc5, 0xa8, 0xfd, 0x49, 0x2c, 0xea, 0xcc, 0xb6, 0x5a, 0xd5, 0xfa, 0xf8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x66\x12\xf9\x16\x43\xb3\x22\x01\x05\xc0\x53\xed\x8f\xdd\x2c\xd2\x1a\x85\x4d\xc5\x8a\xfa\xf1\xeb\xdb\xc6\xb5\x18\xba\xec\x77\x08\x30\xb0\x59\x38\x79\x00\xe5\x62\xf3\x7e\x4b\x94\x32\x2b\xc5\xec\x30\xb1\x1b\xf2\xa2\x4d\x42\x92\x65\x57\x20\xb4\x17\x6f\x6b\x7a\xc3\x46\xaf\x15\xb4\x06\x6e\x44\x6a\x5f\x61\x6b\xaa\x2f\xdd\x4c\xb0\xcd\x51\x64\x80\xf3\xec\xe4\x5b\x45\x5b\x4a\x4c\x82\xb0", 95, { 0x78, 0xba, 0x8a, 0x34, 0xdc, 0x24, 0xb8, 0xf7, 0x78, 0xb9, 0x19, 0xfa, 0x5e, 0x19, 0xcd, 0x1d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9c\xe1\x46\x5e\x41\xf7\x79\x61\x7c\xaf\x58\x7a\x85\x7d\x1e\x98\x46\x5f\x4e\x53\xaf\x2a\xa0\x91\xb6\xff\x86\x4b\xef\xdd\x59\x6a\xc3\x50\x25\xcb\x50\x48\x0d\x62\xdd\x04\x5d\x7a\xf8\x2d\x2a\x1a\x2e\xff\xa8\x83\x67\xa2\x08\xd7\xdb\x97\x0b\xd4\xb5\x4e\x28\xbd\x42\xd4\x56\x59\xd6\xa9\x77\x15\x3c\xb0\x61\x44\xd7\x3f\x89\x87\x59\x56\x4e\x48\x1f\xed\xe0\x60\x28\x66\xcb\xd9\xb1\x22\x24\xcd", 96, { 0x4c, 0x22, 0xab, 0x04, 0x6c, 0xee, 0xab, 0xc7, 0x2b, 0x36, 0x9d, 0x34, 0x1e, 0x33, 0x3e, 0x9d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6e\x2f\x4e\x6d\x66\x1f\x69\x1e\x6c\xf4\x59\xbd\x35\x37\x6e\x03\x1b\x28\xb5\x04\x6d\x0f\xda\xd1\x70\xb1\xb8\x3e\xf7\xde\x7f\xbe\x9a\x27\x81\x6a\x96\xae\x99\x20\x41\x16\x38\xc8\x28\x98\x0d\xb2\xc7\x37\x51\x1b\xe4\x0c\xac\xcf\x88\xbb\xc7\xe8\x9b\x06\x6f\xb4\x1b\x80\x62\xb5\xf8\x59\xba\xc2\x90\x58\xf3\x4a\xc2\xe8\x9b\xb8\xb1\x49\x95\xf3\x17\xe7\x09\xfd\x43\xc8\xec\xbb\xb0\x1e\x27\xd3\x44", 97, { 0xf5, 0xdd, 0x03, 0x8a, 0xea, 0x22, 0xdd, 0xfb, 0x84, 0x4d, 0xe1, 0x47, 0x01, 0x83, 0x5f, 0xfa }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfc\x66\xb1\x22\x26\x80\xa5\x2c\x01\x7e\x26\x18\xa9\x4a\x3a\x2d\x21\xf6\xed\x9b\xa5\xa5\xfe\x75\x1c\x1a\x9a\x4c\xa9\xdb\x40\x69\x61\x01\xc3\xa6\x17\x9f\x6e\xe9\x52\xcd\x41\x3e\x60\x50\x5a\x91\x84\xe7\x6f\x05\x4a\x34\x78\xf3\xfc\x46\x69\x82\x2d\xbf\x1d\xdf\x72\xa7\x4e\x19\x30\xcc\xc1\x9c\x91\xd3\x7f\x48\x91\xe0\x3d\x2e\x34\xdd\xdd\xe7\xda\x6b\x0d\x90\xaa\x63\x0e\x65\x2c\x07\x8f\xf9\xf3\xcb", 98, { 0x3d, 0x89, 0x3a, 0x16, 0x78, 0x2f, 0xa7, 0x44, 0x52, 0x47, 0x8e, 0x03, 0xaf, 0x55, 0xc5, 0x4e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb7\x0f\x77\xb9\x42\x19\x01\x85\xc3\x4a\xbf\x2d\x07\x5a\xf7\x4c\x9a\xd6\x59\xfd\x63\x21\x6d\x66\x6a\x0b\x2b\xe8\xba\x0b\xa9\xe1\x62\x1c\xef\x1c\x95\x32\xe6\xd6\xf1\x58\x6f\x6e\xdd\x68\x91\xa8\x0b\x66\xca\x9d\x1d\x79\x86\x43\x64\x86\xad\x95\xc3\x6a\x57\x5f\xb2\xd4\x9b\xa8\x5e\xbe\x85\xbb\xee\x86\x25\xd4\xe1\xad\xc4\x64\x93\x2b\x32\x01\xde\x6c\x3b\xed\xdd\xeb\x38\x41\xcc\x6a\xc1\xb7\x0b\xcb\x80", 99, { 0x19, 0x77, 0x92, 0x3c, 0x8c, 0xe5, 0xc6, 0xcc, 0x04, 0xed, 0xe0, 0x02, 0x69, 0xa4, 0xb0, 0x14 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x11\x42\x8e\x21\x28\x9e\xe8\x65\x94\x38\x7c\x56\xf5\x97\xb8\x95\xdc\x4c\xcf\xcf\x5a\xbc\x4e\x4e\x22\xfa\x5d\xab\x5d\xd2\x95\xa2\x0b\xe3\x78\xfe\x10\xe4\x91\xb3\xe3\x07\x29\x0a\xce\x7a\xa3\xf7\xe2\x0a\x75\x86\x7b\xe2\xc3\x74\x6c\x72\x9a\xda\xc6\x6b\xc5\x04\x4a\xe6\x50\x60\x69\xa4\x97\x92\xf3\x70\x09\xa4\x64\xa1\x7f\x5b\xc8\xbc\x33\xa5\x47\x36\x5e\x2e\x51\x56\x72\x11\x66\x39\xf1\xab\x82\xef\xe8\x8c", 100, { 0x55, 0x0f, 0x1a, 0x5e, 0x93, 0x15, 0x75, 0xf2, 0xb7, 0x6b, 0x67, 0x79, 0x45, 0x36, 0x12, 0xe1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x24\xc3\x0c\x87\xfa\x99\x6f\xe9\x2b\x6f\xdf\xc6\x40\x06\xdc\x6f\xb0\x9a\x33\xff\x06\xcc\x3b\x15\xb1\xa1\xab\x9c\x68\xa3\x17\xc5\x38\x25\x05\x16\x2b\xa4\xb0\x9c\x97\x49\x58\x3c\x00\x8c\x44\x28\xab\xf2\x56\x6d\xc0\xf6\x49\xa8\x1a\x06\x89\xd8\xaf\xa4\xae\x4f\x97\xad\x97\xc3\xba\xb7\x1f\x81\x1b\x93\x7f\xc1\xbb\xf1\x40\x14\x2b\x23\xda\xfa\xb2\xfa\xee\x90\x16\xcd\x1d\x66\x0b\x98\x83\x6f\x35\x40\xd4\x11\xdc", 101, { 0x7e, 0x9b, 0xb1, 0xbf, 0xc2, 0xf0, 0xd6, 0xa9, 0xd1, 0xa3, 0x5d, 0x1f, 0x74, 0xae, 0xd6, 0xc5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf4\x11\x5d\x2b\xb0\xe6\x59\x25\xdb\xa3\x78\x25\x10\xd5\x2b\x10\xfa\x81\x90\x19\x59\xfc\x49\x30\x21\x6a\x68\x08\xc1\xd1\x86\xc3\x81\xd9\xf3\x3d\x04\x22\x07\xf2\xed\x42\x97\x8d\x9e\x59\x83\x0e\x1c\x53\x6d\x96\x0f\xba\x84\xd2\xe5\x36\x7e\x02\x15\xa2\xa4\xa5\x81\xcb\x07\xc3\xf4\xc7\xd0\xd6\xcb\xf0\xb5\x56\xb1\x7c\x88\xe0\x83\xba\xe9\x02\x52\xeb\x1c\xa5\x86\xbb\xf5\x18\x1f\x5a\xf0\xb5\x17\x3c\x5d\x32\xe4\x69", 102, { 0x0a, 0x37, 0xdb, 0x00, 0x9a, 0x07, 0x39, 0xfd, 0xd4, 0x36, 0x02, 0x15, 0x7e, 0xce, 0x60, 0x3c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb8\x86\x19\x81\x17\x75\x2c\x50\xbc\xba\x52\x0a\xca\xd0\x87\x23\x15\x5e\xaa\xcd\x12\x3d\xc4\x0f\xed\x27\x69\x7f\xba\xfd\x37\x9c\xc3\xb4\x7b\xca\xff\xde\xf4\xea\xa4\xd1\xaf\x95\xd4\x76\x11\xf6\x72\xb0\xf3\x41\x18\x66\xe7\xd4\x21\x2f\x9a\xe8\xe1\x99\x52\xf4\xf4\x16\x96\x9e\xb4\x84\xec\x5e\xc4\x57\xbd\xb2\xc9\x66\x55\xf8\x39\x4e\x07\xeb\x4b\x87\x6d\xbc\x0e\x01\xcd\xcc\x96\x7a\x98\x04\x50\x5f\x0c\xd2\x77\x5c\xf9", 103, { 0x5f, 0x1c, 0x52, 0x55, 0xd4, 0xde, 0x34, 0x35, 0x0d, 0xbb, 0xf3, 0x57, 0xa6, 0x15, 0x3f, 0x6f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\x9f\x82\xa0\xb2\x6f\x14\xb6\xbc\x6c\xee\x89\x9e\xf0\x93\x3a\xdd\x39\xd1\x28\x7f\x9d\x13\x6d\x62\xdb\x43\x82\x39\x8e\x5a\xfe\x24\xbb\x85\x7b\xeb\x89\xf5\x99\xd8\x10\x44\x1c\x2e\x49\x7f\x31\x49\x26\xd4\xce\x53\xbb\xd9\x37\xa0\x99\x76\x9c\xa7\x3c\x71\xdf\x9e\x9a\x94\x74\xb1\xdb\x7d\x62\xde\x28\x02\x66\x70\x9d\x3e\x36\x15\x58\x3d\xe3\x9e\xb3\x40\x57\x54\x8e\xad\xfe\xf1\xc5\x96\x82\x42\xc1\xe4\xae\x57\x2a\x20\x74", 104, { 0x3c, 0xd5, 0x22, 0xa8, 0x37, 0xc4, 0xe8, 0xad, 0x2a, 0xf4, 0xf6, 0x6d, 0x03, 0x38, 0x4e, 0xa9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x63\xba\xdd\x0a\x37\x2d\xc6\x2e\x56\x54\x40\x8b\xb4\x49\xbb\x34\x10\xbd\x9a\x4d\xeb\x6d\xbc\xc8\x23\xb4\xa7\x4d\x31\x39\x51\x33\xfc\xc8\x8a\xab\x57\x3f\x09\xfd\x1e\x9f\x11\xea\xe8\x42\xbf\x2f\x69\x2b\xf3\x2b\x67\x79\xd9\x98\x57\xf6\x13\x75\x94\xcc\x85\x04\x3b\x57\xbc\xef\xa5\x16\xfb\x86\x82\xba\xe4\x23\x8e\x61\xc0\xaf\xf3\xdc\x6b\x3d\x3b\x2c\xdf\xd4\xf0\x0c\x5b\x4a\xd3\xa8\x2f\x4b\xb5\x6b\x27\x79\xf5\xf6\x91\xae\x96", 105, { 0x34, 0x7e, 0x78, 0x3a, 0xaa, 0xd6, 0xde, 0xb7, 0xf4, 0x1f, 0xf8, 0x13, 0x4d, 0xe7, 0xba, 0x0f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2c\xed\x5c\xfb\x6a\x31\x16\x42\xd4\xb6\x27\x3b\xcb\xc2\x60\x04\x7a\xb3\xf0\x42\x90\xc4\x6b\xfe\x08\x7f\xed\x19\x23\xbf\x58\x6d\x78\x61\xb8\x82\x21\x87\xc8\xea\x17\x88\x8e\x3a\x98\x77\x21\xa5\xc4\x4f\x8b\x36\x48\xb8\xc9\xaa\x31\x78\xef\xe7\xe2\x79\x68\x1d\x21\x72\x5b\x78\x4b\x35\x2a\x7f\xa8\x95\x14\x0c\xd9\xf2\xfa\xe8\x6e\x63\x3f\x02\x94\x7e\xc8\x4c\xeb\xc7\x23\x33\x76\xb2\xc4\xb9\xac\x56\x6a\x30\xab\xb1\xa0\x95\x8c\x92", 106, { 0x56, 0x75, 0xe1, 0xc5, 0x9d, 0xa4, 0xf9, 0xec, 0x3b, 0xf3, 0x7d, 0x8f, 0xb3, 0x9a, 0xef, 0xb5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5f\x86\xd1\x27\xd0\xe1\xfb\x23\x30\xfb\x39\x8b\xcd\x7a\x3a\x1e\x2d\xd0\x23\x5f\x4d\x54\x9d\x40\x07\xfe\x05\x6d\x8d\xbf\xc7\x32\x11\x7b\xc5\x09\x87\xa4\xf0\xc4\x82\x74\xfa\x53\x3b\xc7\x22\x33\xb1\x92\x2e\x74\xea\x04\x77\x64\x57\x37\x1e\xdd\x55\x93\x5c\x28\xd0\xc0\xf8\x8d\x02\x45\xd1\x79\x59\xc2\x9b\x49\x77\xc6\xa7\xb9\x53\x4e\xda\xe4\x7c\xdb\xbf\xf7\x7e\x2e\xb9\x76\x5d\xa3\x51\x2a\x3e\x28\xae\xa6\x26\xd8\x22\x75\xd9\x38\xe0", 107, { 0x4e, 0xe1, 0xda, 0x97, 0xf7, 0x4d, 0xce, 0x3c, 0xae, 0xd0, 0x5a, 0x17, 0xa8, 0x9d, 0xea, 0x3f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe3\xe4\x0c\xcc\x64\xb7\xd7\x6b\xa4\xea\xee\xfa\x2b\xa0\x38\x9a\xac\x09\x84\xa8\xeb\x01\x87\x2b\x4a\xd6\x71\x67\xee\x27\x2a\x8e\x92\xe7\x2e\x96\xe8\x81\x02\x26\xa7\x16\x51\xa9\x36\xe1\xa8\x85\xf3\xbc\xcb\x66\x20\xbb\xb2\xb4\x6a\xf6\x23\x23\x18\x65\xed\x68\xcd\xe3\xbe\x09\xf9\x55\xa2\x4d\xe2\xe4\x18\x53\x4b\x66\xd3\x3f\xbe\xda\x0a\x8f\x7b\x12\x7c\x8b\xfd\x6b\x04\xdb\x25\xb8\xd4\x33\x06\x3d\x51\x29\x4c\xd7\x8b\x26\x49\x39\x57\x7b", 108, { 0x56, 0x6e, 0x56, 0xba, 0xee, 0x28, 0x17, 0xeb, 0x10, 0xc1, 0x9b, 0xf4, 0x7b, 0xbe, 0xf1, 0x99 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9d\x51\x0b\x8b\x82\xc9\xd6\x26\xb2\xa9\xb9\xf7\xf5\x19\x26\x13\x4a\x44\x33\xb1\xb1\x59\x7b\xf9\x93\xab\x92\xf5\xcf\xf8\x22\xa4\x63\xc7\xa7\x2d\xb2\xea\xc3\x31\x77\x23\x3e\x39\x47\xe3\x9e\x4e\xbc\x2e\x5f\xa8\x44\x9a\xd0\x7e\x84\x75\x8a\xfc\x6a\x06\x8d\x53\xce\xec\xf8\xea\xc4\xa4\x65\xb2\x80\x26\xdf\x97\xe6\xae\x81\x12\xae\x98\xac\xdb\x31\x64\xe4\xbc\xd2\xda\x47\x81\x0b\x47\xac\x0c\x13\xe5\x54\x85\x29\x58\x4f\xae\x80\x55\x6f\x54\xc7", 109, { 0xca, 0x20, 0x60, 0x9f, 0x8f, 0x6d, 0x8f, 0x91, 0x97, 0x72, 0x2c, 0xe3, 0xfd, 0x2a, 0x05, 0xa5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5d\xe1\xe1\x54\xa7\x6d\x0f\xec\x1c\x4a\xb7\x31\x7c\x9e\xc7\xa9\x9e\x92\x52\x67\xd4\x0f\xc2\x58\x6d\x17\x28\x2c\x54\xc2\xb4\xde\xd5\xd3\x40\xe2\x80\xf6\x06\xeb\x26\x98\x73\x56\x00\x63\x13\x36\xf0\x55\xab\xfc\xdf\x7c\x65\xc3\x45\x50\x26\x36\xc6\xac\xfc\x1f\xfa\x6b\xb3\x8c\x45\x9b\x86\xa0\xe5\x61\xf3\xf3\x0b\x69\xa7\xa7\x20\x07\x99\x08\x28\xef\x33\xdf\x44\x8d\xaa\x54\x51\x02\x6f\x7d\xae\xbc\xbd\x87\x1c\xb1\x53\x7f\xbe\x38\x3c\xbe\x3f\x84", 110, { 0x51, 0x82, 0x43, 0x6a, 0x40, 0xa6, 0x76, 0xb1, 0x58, 0xa4, 0x3d, 0xb1, 0xd3, 0xcd, 0xde, 0x96 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc9\xef\x12\xbd\xa1\xbe\xd5\xbd\xef\x1f\xcf\x64\xb9\x38\x98\x98\x51\xec\xd8\xdc\xe4\x05\x27\x8c\x2f\xfd\x14\xb2\x52\x69\x41\x89\xbd\x03\xac\x8c\x47\x52\x08\x39\x5d\xf8\x49\x67\x57\x98\x3f\x41\xe6\x62\x5a\xde\xaa\x3c\x8c\x7e\xe0\x8e\x4c\x64\x39\xaa\xb6\x4b\xc5\xd7\xcf\x86\x0e\xf9\xe7\xb7\x42\xde\x17\x2b\x87\x27\xea\xd1\x73\xd1\x18\xd5\x94\x5f\x6d\xde\x29\xa6\xc9\xe0\xf4\x34\x40\x9e\x27\x5e\x61\xc0\x7b\xe5\x94\x8c\x60\x44\x9d\x44\x4f\x99\x3d", 111, { 0xbc, 0x5f, 0x18, 0x15, 0x64, 0x22, 0x74, 0x18, 0xa4, 0xa0, 0x96, 0xdb, 0x00, 0x70, 0x9d, 0xb4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1c\x3b\x2d\xf7\xd7\x25\xa2\xf0\xfd\xcf\xb8\xf0\xbb\x88\xbc\x85\x57\x26\x8d\x46\x4e\x12\x4c\x35\x0b\x7d\xa0\x3e\x46\xb1\xa2\xdc\xf8\x82\x6c\xdb\xf6\xe3\x39\x38\x31\x95\x39\x24\x89\xf9\xf4\x27\x49\x07\x58\x62\x43\x57\x61\xed\x89\x5d\x63\x5e\xc5\xb2\xf7\x6b\x36\x8d\x80\xa7\x48\x50\x59\x68\xce\x3e\x9d\xca\xde\x4b\x92\xcc\x49\x0c\xb2\x97\xb5\xce\x58\xdf\x59\xc2\x04\x62\x55\x56\x4b\x8e\xac\x9e\x5e\x40\xdf\xf1\x34\xa6\x27\x91\x57\x45\x4e\x82\x48\x16", 112, { 0x3e, 0x3d, 0x87, 0x58, 0x0e, 0x01, 0x69, 0x78, 0x5c, 0x50, 0xd4, 0xb4, 0xf2, 0x87, 0x15, 0xf9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2a\x7b\x90\xcc\xb7\xfa\x65\x31\xd0\x72\xf5\xae\x8a\xa0\x51\xe9\x2d\xfc\xf9\x89\xd0\x4a\x00\x15\x90\x4f\xdc\xfa\x6c\xa1\xcc\xab\xc0\x98\xe6\xe3\x5c\x61\xbc\x06\x41\x30\xaa\xa5\xf7\x95\xbf\x20\x8e\xe8\x46\x66\x2f\xdf\xf0\xd9\x5d\x3e\x9f\x4c\xce\xad\xd1\x2e\xe0\xa5\xa7\xc0\xba\x84\x91\x82\x00\xc1\x99\xac\x32\x39\x48\xd8\xa2\xa8\x38\xbd\x10\x33\x38\x15\xe3\x21\x15\xa0\x06\xaa\x0b\x42\x5d\xe8\xc8\x48\xe3\xea\x19\xc8\x62\xe8\x34\x26\xcd\x90\xa1\xb3\x3d", 113, { 0x19, 0x09, 0x55, 0xc0, 0xf8, 0xda, 0x05, 0x7f, 0xa9, 0x81, 0xbc, 0xa1, 0xcc, 0x3f, 0xe1, 0x11 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7f\xc5\x6f\x87\xcb\x0c\xef\x76\xbd\xb2\x5a\xaa\x9c\x2f\x8d\x0c\xa4\x3d\x5f\xec\x16\x87\xfe\xba\x69\xef\x78\x5e\x9e\x7c\x56\x34\xb1\xdf\x63\xa7\x2b\xa0\x8a\x69\xd4\xea\xdd\x4c\x86\xef\xb2\xc0\x1d\xf9\xe8\xea\x8b\x0f\x47\x5d\x08\x40\x05\x77\x66\x8f\x65\x5a\x82\x7a\x7a\x86\xd7\x29\x0a\x10\x2c\x30\x8d\x81\x6e\x01\x55\x4e\x98\xf1\xc7\xef\xce\xe5\xc7\x9e\x8a\x99\x32\xad\xed\x8c\x85\x84\x37\x8c\x9b\x36\x52\xd9\x93\xc0\x89\xf9\xd0\xdd\x56\x18\x19\x89\x58\x19", 114, { 0x4e, 0x98, 0x6a, 0xa5, 0x5f, 0x57, 0xb4, 0x40, 0xd2, 0xf5, 0xf2, 0x3b, 0x19, 0xa7, 0x14, 0xa0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe1\x10\x63\x3d\xa2\xd1\xb2\x6e\x62\x94\x37\x29\x58\x85\x13\x06\xa7\xcd\x21\xe6\x49\xcc\xad\xb8\x07\xf4\x43\xe7\xa4\x45\xa1\x64\x1a\x61\xce\x4b\xfc\x4b\x44\x35\xfa\xc0\x48\x19\x83\x32\x5b\xdf\x85\x5d\xc8\x83\x50\x88\x5e\xe2\x98\x5a\x38\x25\x99\x57\xb8\xc7\x55\xf5\x92\x44\xf9\x5f\x04\x5f\x5e\xc5\x24\x10\xab\x5e\x51\x09\x17\xfb\xcb\xe4\xcc\x49\x5f\xeb\xe7\xa3\x3b\x83\x9c\x92\xe0\x35\x77\xe2\x34\x5a\xbd\x62\xb7\x63\xf1\x37\xce\xc3\x72\xdd\x3b\x79\x41\xbc\xae", 115, { 0x73, 0x08, 0xff, 0x52, 0x04, 0x9f, 0x74, 0x4f, 0x24, 0x7d, 0x90, 0x31, 0xe7, 0xa5, 0x0d, 0x41 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3d\xe1\x62\x74\x46\x57\x63\x4e\xb6\x51\xca\x5d\xa3\x63\x3b\x38\xc3\x6c\xa7\x20\xb3\x17\xaa\x4b\xe4\x7d\x84\x5c\x23\xe8\xb2\xf4\xc3\xb3\x28\x62\x68\x4d\x2e\x76\x73\x5c\xd4\x73\x05\xfe\x13\x22\xb2\x2a\x82\x03\xc4\x35\xb1\x9f\x29\x71\x26\xf9\xfa\xf0\xf2\x22\xa8\x66\xee\xec\xc5\x2c\x97\xb6\x6d\x61\x83\x67\x4f\x2b\x80\x76\x5b\x1b\x48\x25\x0a\xaf\xe2\xcd\x45\xf0\x97\x55\xf3\x3c\x8f\xbc\x22\x1e\x09\xd6\xd1\x59\x34\x14\x57\x04\xac\x7b\x74\xcf\x94\xb7\xf3\x63\x4c\x49", 116, { 0x57, 0xd9, 0xf8, 0x21, 0x2c, 0xc8, 0x6d, 0xe5, 0xdc, 0xbf, 0x77, 0x8f, 0x8b, 0x15, 0x62, 0xfd }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\xe8\xcf\xdb\xec\xa0\xac\xb4\x01\xb0\x9f\x46\x64\xff\xcc\xe5\xff\x37\x97\x92\xe7\xe9\x22\xf6\x69\xcd\x64\x6a\xac\x27\xe3\x33\x03\x44\x0e\xcb\xd2\x23\x39\x5a\x19\x31\x35\x44\xa2\x2d\x8b\xdb\xc3\x2b\x55\x35\xd1\xb4\xba\x19\x21\x0a\x04\x13\xbc\x89\x60\xa7\x9e\x28\x31\xa2\xab\x1f\x10\x8c\x2f\xa3\x65\x39\x10\xcd\x9b\x7e\x93\x99\x03\x01\xc7\x09\x47\x2a\x92\x69\x88\x36\x56\xae\x17\x6a\x3f\xf8\xcd\x64\x2b\x37\x08\x8c\x37\xe9\x42\xaa\xe2\x01\x4f\x92\xe1\xe3\x33\xfa\x7f", 117, { 0x88, 0x12, 0x61, 0x94, 0x21, 0xa3, 0xcb, 0x31, 0xa8, 0x60, 0x2d, 0xff, 0x13, 0x02, 0x40, 0xa5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8c\x9d\x6c\xad\xcf\x04\x56\xad\xba\x5d\x3f\x57\x17\x76\x14\x07\x0e\xf2\xa1\x24\xe8\xe1\x1b\x4d\xee\xfb\xd9\x21\x70\x7a\x23\xab\xe1\x91\x23\x69\x20\x8c\xf9\xf8\xd2\x85\xea\x5d\xea\xc0\xb8\xf2\x4a\xa4\x0c\xeb\x83\x57\x10\x84\xb9\xf4\x19\xc9\xa2\x6c\x82\x01\xad\xf6\x94\xb8\x3f\x34\xa1\x68\x18\xe4\x30\xc3\xd4\x3f\x52\xa0\x8e\xf2\x13\x7f\x9f\xb6\x0c\xba\x84\x8e\x15\x4b\xdd\x9c\x19\x34\x92\xa1\x02\x8f\x10\x10\xd2\x32\xb1\xcd\xd3\xfe\x3a\x87\xe7\xc5\x7e\xae\xf9\xd5\x1f\x13", 118, { 0x1f, 0x41, 0x60, 0x14, 0x09, 0xd9, 0xff, 0x1c, 0x0b, 0x49, 0x8c, 0xd7, 0xbe, 0xa9, 0x80, 0x08 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x94\x25\x74\x1c\x92\x1b\x86\xa0\xec\xf8\x35\x65\xb1\xe1\x78\x33\x12\x8b\xc2\x94\x9a\x81\x7f\x2b\x7a\x15\xbd\xaf\x02\xe1\xe8\x82\x2c\xf9\xae\xf2\x53\xaf\x01\x0b\x01\x01\x3b\x16\xe5\xa3\x5b\xb3\xe3\xa5\x6d\x8e\x46\xc2\x08\xc1\x11\x44\xf1\xc6\x73\x96\xdd\x17\x58\x68\x54\x64\x1c\x79\xb1\x70\x5a\x04\x46\x89\xe3\xc9\x9c\xa2\xcb\xb6\xd8\x0e\x9d\x32\x39\xdb\xae\x07\xbd\xc9\x8f\xe9\xe3\xe6\x9c\xa7\x8c\xc7\xb1\xed\xfb\x65\xfc\xb3\xfb\x91\xee\x46\x20\x15\x4b\xf1\x25\x69\x62\x48\x74", 119, { 0x58, 0x70, 0xa6, 0x06, 0xac, 0xb1, 0xee, 0x1f, 0x53, 0xe8, 0x72, 0x20, 0x3c, 0x05, 0x3b, 0x77 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0f\x56\x10\xc5\x8c\x9a\xce\xde\x03\x7b\xeb\x78\x6f\xd7\x81\x42\x7c\xeb\xc4\xff\x03\x4a\x0f\xca\x20\xea\x8a\x7a\xf2\x59\x76\x20\xef\x0d\x15\xad\xe1\xd8\x39\xb1\x81\x7a\x67\x3e\xae\x50\xa6\xeb\x4a\x2b\xea\xf4\xb2\x3c\x18\x7f\xd8\x2b\xb6\xf9\xfe\x46\x31\x9f\x10\xd6\xc9\x19\x9f\x8e\x1d\x40\x76\x1d\x4e\x00\xdb\xe3\xd3\x59\x63\xbf\xd9\x7f\x72\x07\x55\x22\x4f\x91\xa7\xc8\xe0\xee\xec\x55\x06\xb7\xe0\xad\x97\xff\x6e\x70\xf4\xe8\xd7\xe4\x47\x51\x7a\xf1\x5c\xad\x45\x45\x18\xef\xb9\x98", 120, { 0x26, 0x76, 0x51, 0x74, 0x00, 0x2d, 0x40, 0xe3, 0x3e, 0x70, 0x71, 0xc5, 0xf9, 0x19, 0xf1, 0x8b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9a\xa1\x93\x09\xec\x14\x1c\xa7\x65\xb2\x0f\x0d\x9f\x6f\x22\x25\x11\x5e\x33\x0d\x48\x60\x10\x16\xc7\xf7\xe3\xe9\x77\x38\x38\xc4\xcc\xdf\xad\xe2\x77\x7c\x35\xf9\xc1\xcc\x08\xdd\x8b\x23\x2b\x42\xdf\x04\x97\x9e\x32\xd3\x09\x2d\x38\xa1\x65\x0e\x64\x27\xc8\x8b\xfb\xcf\x29\x76\xd4\xeb\xaa\xae\xae\x08\x81\xc1\x2e\x5d\x7d\xab\x73\x5e\x38\xbd\x58\x6e\xd8\x99\x45\xb1\x81\x5a\xb2\xff\x5b\xd0\x3a\xf4\x3b\xe8\x57\x24\xf0\x2b\xc0\x6c\x2d\x5d\x5c\x64\x0e\x45\xe1\xf0\x48\x8d\x0e\xf6\xf2\xbf\x81", 121, { 0x3a, 0xfd, 0x49, 0x99, 0x51, 0xab, 0x70, 0xe1, 0xaf, 0x2e, 0xa2, 0x10, 0x8f, 0x52, 0x9c, 0x6e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x29\xea\x6f\x36\x04\xe5\x78\x9c\xd3\x17\x5e\x55\xeb\x7b\xd3\x8b\xfa\xbf\x55\xea\x79\xd0\xf4\x3d\x3e\xfd\x31\xa8\x2d\xca\x02\x7f\x0f\x54\xf3\xc2\x7b\x5c\x66\x37\xf0\xf1\xfb\x22\x05\xbe\x0b\xa2\xb7\xee\x4d\xab\xe2\xb7\x9b\x9b\xcb\x8a\xcf\x7b\xda\xd5\xc7\xd5\x65\x73\x89\x2d\xa6\xb2\x7f\x1d\xcf\xfe\xe3\x10\x34\x2e\x36\x9b\xa7\x6b\xe9\x73\xe2\xb9\x1f\x0f\x1c\x23\x8a\xdb\xbe\x87\x72\x15\x2f\xfb\xd4\x48\xcc\xdb\xa7\x63\xf3\x71\x3a\x76\x3e\x3f\xb9\x08\xce\xeb\xce\x17\xbd\xc8\x63\xad\xb5\xfd", 122, { 0x1a, 0xfc, 0xd7, 0x74, 0xe1, 0x55, 0x51, 0x67, 0x6b, 0xe7, 0x1b, 0xc8, 0xd4, 0xab, 0x39, 0x47 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x86\x1b\x9f\x54\x66\xd5\x73\xa1\x7a\xe9\x2e\xcc\xc1\x1d\xe2\x7e\x24\xa5\xe7\x64\xf7\x7e\x2f\x23\x9e\x6a\xb7\xd8\x4c\x88\x1a\x4a\xe7\x8f\x40\xaf\x08\xa7\x33\x17\x1e\xe4\x12\x79\xb1\x60\x1e\x59\xc4\xf3\xf1\x12\x55\x91\xcf\xc5\xfe\x41\x15\xde\xbd\xb6\xce\x40\xd1\x8c\x65\x0d\xbb\x20\x74\x13\x64\x0c\xbb\xd6\x5d\x3e\x2c\x36\x40\xb3\x22\xbd\x36\xd5\xb2\x87\x93\x6f\x1a\xce\x9b\x49\x57\x12\x68\x65\xd2\xe1\xe3\xd4\x3a\x48\xef\x35\x6d\xd6\xa6\xcb\x8f\x49\xbb\x3a\x3d\xd8\xff\xde\xdc\x1c\xff\xc9\x0b", 123, { 0x31, 0x66, 0x6a, 0xcb, 0x7f, 0xb2, 0x21, 0x3b, 0x4c, 0xb3, 0xbc, 0x28, 0xe1, 0x8b, 0x32, 0x58 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9c\xca\x57\x37\xf3\xd0\x6e\x4c\xa0\xe5\x57\x89\x6a\x65\x34\x6c\x6e\x72\x1d\xcd\xc7\x59\xdb\x07\xd8\x13\x40\x50\x39\xe7\x21\x2a\x3b\x2d\xf2\xf2\x1a\x2d\xfc\x96\xbe\x25\x3d\x64\x2e\x69\xdc\xfd\x92\xa5\x47\x68\xe2\x3e\xeb\x43\x31\xd7\x8f\x14\x90\xf0\x4e\xbd\xa0\xa8\x2f\x0e\xb8\xa3\x62\x75\xae\x06\x1a\xd0\x46\x9f\x01\x63\x35\x22\x5d\xe5\xd0\x8e\xbd\xb5\x56\xaf\x5f\x2a\xd6\xbc\x22\x07\xbf\x20\x22\x0d\x02\x56\xf5\xab\xe6\xed\x81\xd1\x68\xab\x78\xe2\x4c\xce\x72\xc8\xc4\x6d\xa5\x21\xbc\xfe\x43\x97", 124, { 0x69, 0x78, 0xc0, 0x8c, 0x6b, 0x92, 0x3d, 0x79, 0x26, 0x06, 0x37, 0x64, 0x96, 0x5e, 0x9a, 0x6b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\xf1\x71\x4d\x8b\x79\xdf\x75\x2d\x6a\x08\xfe\xd7\x3d\x08\x6b\x46\x31\x15\xbf\xca\x8c\x9b\x94\xf2\x00\xf8\x4c\xd6\x28\xd1\x5e\x01\x31\x0f\xd2\xf9\x96\x7a\xc8\x6b\x03\xf0\x31\xf8\x5b\x41\xa1\x96\xd5\xaa\x3d\xa4\x41\xed\xcf\x8f\x69\x09\xf8\x1a\x92\x9b\x85\x4d\x22\xd1\xda\xfc\x5b\x07\x8a\xf2\x45\x00\x09\xbb\xaa\xc2\x79\x0b\x3b\x0e\xa0\xce\xd0\x7a\xfb\xcd\xcd\x2d\xeb\xfa\xa0\x37\x0e\x58\x66\x8a\xa9\x89\xad\x99\x41\xf5\x54\x8c\x49\x94\x8f\x1d\xf5\x59\x07\x12\x2d\x3c\x1e\x57\x9d\xe2\x50\xb7\xe9\xea", 125, { 0x5a, 0x5a, 0xd4, 0x98, 0xee, 0x0c, 0xa8, 0xdd, 0xef, 0x60, 0xed, 0xc3, 0xf6, 0xd3, 0x95, 0x0f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb5\x37\xfe\xd6\xa3\x0f\x84\x94\x70\x46\x6f\xa9\x55\xe9\xb5\xf9\x6e\xe7\x1a\x35\xdd\x8c\x26\xe1\x0f\x98\x38\x00\x16\xfc\xb5\x5f\x36\x30\x59\x7c\x7b\x33\xad\x11\x87\x20\x99\x40\x6a\x6a\x11\x5c\xaa\xb4\xeb\x51\x62\x50\xd1\xb2\x86\x51\x52\x5d\x44\x4e\x13\xcd\x86\xb6\x22\xfc\x94\xcb\x6b\xf3\xd7\x3d\x43\xef\xb8\x64\x22\x32\xa7\x18\x6e\x63\x38\x30\x72\xa2\x67\x96\x6d\x2c\xfc\x04\xc7\xa8\x0a\x5d\x5e\x0c\x91\xaa\xff\x2f\x43\xaf\xf1\xeb\x64\x29\xab\xee\xca\xa7\xa5\x1e\x04\x02\x4b\xa6\x97\x7b\x0e\xa2\x63\x6f", 126, { 0x17, 0xca, 0x2b, 0xf4, 0x91, 0x4e, 0x34, 0x11, 0xb0, 0x08, 0x52, 0xdc, 0x95, 0x8c, 0xfb, 0x2c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x95\x63\x25\xb9\x12\x5f\x16\xa4\xaf\xb8\xb0\x8b\x26\x67\x90\x10\x70\x05\x76\xf5\x95\x36\x6a\x9a\xa2\xb2\xfa\x13\xb9\xf1\x9e\xe5\x42\x73\x3c\x5e\x3f\xa9\xc6\x8e\xbe\x83\x01\xe5\x67\x97\x61\x6b\x35\xea\x11\x96\x42\x5f\x0e\xcb\xba\xba\x73\x74\xf2\x4f\xcf\xba\x91\x4b\xb2\xdf\xec\x9e\x47\x3b\x70\x84\x1b\xd2\x38\xaf\xfc\x8e\xbf\x13\xfc\x1d\xaf\x4d\x95\x69\xd8\xb1\xe6\xb0\x3c\xee\x1c\x41\x47\x60\xec\xd2\x1c\xf2\x3c\x80\x0a\xae\xe1\x63\x1d\xe3\x83\xcd\xd1\xf2\x9d\x20\xe2\xb5\xa1\x49\x3e\x8b\x38\xdd\x1c\x04\xa7", 127, { 0x75, 0x90, 0x2f, 0x4a, 0xfb, 0x9d, 0x91, 0xb1, 0x0e, 0x74, 0xd7, 0x1c, 0xb6, 0xb0, 0x98, 0x06 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xce\x26\x26\x4d\xca\xd2\x5a\x49\x30\xcf\xf6\x38\xaf\x9a\x68\x1c\x7d\x2f\xfb\x58\x31\xdd\x49\xd7\x3e\x32\x3e\x4d\x0d\x16\xc4\x96\xb6\xf4\x10\x3a\x5a\x13\x89\x12\x1f\x03\x50\x04\xc9\x32\x70\xe9\xf2\x9e\xa4\x90\xe6\xa5\xbf\xdc\x1d\xf8\xbc\x08\x55\xae\x62\x0b\x4c\x75\x93\x16\x17\xe3\x32\x3b\x22\xea\xaf\x27\xc5\x6a\x31\x10\x7f\xe1\x5f\xaa\xd1\x3d\xca\x52\xb9\xd2\xfa\x4e\xc9\x67\x13\x2c\xe4\x6b\x23\x46\x95\x45\x0b\x67\x0c\xc9\x08\x88\xb6\xc6\xde\xb3\x78\xbc\xa0\x09\x87\xab\x1e\xdf\xe7\x06\xeb\x02\x7d\xc7\x09\x1b", 128, { 0xdd, 0x13, 0xdd, 0xd7, 0xfd, 0x85, 0xb9, 0xfe, 0xcf, 0x5f, 0x63, 0xd8, 0x30, 0x7f, 0x81, 0x37 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x9c\x34\x2e\x69\x3f\xc8\x3c\xb2\xe3\x4f\x09\xb2\xca\xab\xf8\x31\xf3\xdc\x12\x9c\xf1\x6f\x25\x79\xd7\x84\x09\x85\x50\x7a\xfe\x6d\xcb\x39\x31\x25\xd3\x1b\x5d\xe7\x7c\x78\x8e\xcb\xf9\xcc\x02\xff\x4b\x87\x28\xa4\x14\x72\xca\x46\x8a\xb9\x46\xf5\x87\x99\xf7\x04\xbc\xa6\xb4\x5e\x06\xb9\x6e\x80\xd9\x76\xfd\x16\xd8\x76\xf4\x36\x87\x15\xb0\x33\x18\xd9\x70\x1f\x61\x7d\x9e\xe1\xef\x9a\x2c\xee\x34\xf1\x1a\xa7\xdb\x57\x14\x4f\x3c\x3d\x37\xa8\xeb\xdb\xf4\x29\x6b\xf9\x0d\xdd\x00\x5a\xbd\xda\xa2\xc5\xf4\x5d\x0e\xb1\xc0\x7f", 129, { 0x85, 0x9f, 0x82, 0x66, 0xc3, 0xf3, 0xd5, 0xcf, 0xc6, 0x98, 0x4e, 0xcb, 0x74, 0xa6, 0x30, 0xe5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf6\x8c\xc7\x96\x58\xa8\xf1\x2b\xec\xc3\x22\x93\xb6\x31\x25\x2c\xbc\xa8\xa4\x36\xd2\xa8\x53\x4b\x91\x85\x2d\x7c\x66\x12\xd7\x0a\xc6\xec\x20\xbe\x7f\x60\xaa\xe5\x2a\xfa\xa2\xec\xbd\xab\xaa\x93\x3d\x95\xd9\xd1\x90\x77\xd8\x45\x70\xb0\x2d\x54\x7c\xf1\x94\xe3\x68\x84\x89\xb2\x55\x33\xe3\x53\x3c\xd6\x9a\xc7\x83\x7d\xa9\xb4\xb2\x36\x0f\x44\x3f\x7b\xef\x9c\x85\x3b\xd7\xf7\xd3\x83\x1d\x5f\xa1\xc9\x65\x08\xde\xd5\x40\x49\x65\x4c\xef\x37\x8d\xdb\x45\xe0\xdf\xfc\xaa\x21\xe3\x68\x3b\x25\x13\x19\x0f\x7a\xf1\xfb\x95\xd1\x34\x2f", 130, { 0x09, 0x1a, 0xd5, 0xec, 0xd3, 0xed, 0x5a, 0x2d, 0xf5, 0x61, 0xe8, 0x95, 0x69, 0xe8, 0xda, 0x04 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x19\x52\x1e\xfa\x65\x9a\xe9\x50\x84\x52\x5f\xf9\xa2\x6d\x89\x5e\x0f\xfd\x7f\xf3\x62\xb3\x5e\x40\xba\xf1\x58\x8d\x20\x8e\xe6\x29\x08\x25\x18\x57\xf7\x1a\x0c\xd6\x3e\x2b\x7d\x0c\xe4\xae\x73\xce\xa2\x6d\x18\xce\x07\x1a\xab\xa2\xbc\x70\x8d\x6d\xe2\xe9\x79\x2c\x97\x16\xd1\x9f\x98\x9e\x13\xd1\x00\xd5\x6a\x46\x2f\xf8\x61\xc1\xc6\x03\xb2\xaf\xce\x2f\x3d\x33\xf8\x0b\x14\xcf\xff\x36\xb3\xab\x2a\xb7\x4d\x86\xed\xf9\x41\x36\xaf\x66\xac\xdd\xa7\x9e\x18\xaa\xdf\x54\x51\x49\x5b\xc5\x58\xe9\x53\xd6\x71\xe7\x9b\xca\x57\x1c\x23\x9d\x90", 131, { 0x76, 0x56, 0x7f, 0xe3, 0x54, 0xbe, 0xa3, 0x1f, 0xff, 0x3a, 0xb0, 0xfb, 0x98, 0xfd, 0x35, 0x13 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\x9b\xff\xdb\xf9\x2f\xf0\xc5\x04\x70\xf4\x5a\xfe\x52\xf4\xf9\x50\x52\xb1\x41\xb5\xb0\xe5\x27\xea\xda\xf8\x2a\xf1\xe9\x5c\x9d\x01\x44\x85\x23\x0d\x62\x88\x3a\xef\xae\x4f\xed\x31\x83\x77\xad\x78\x56\xc6\x3b\x8e\xf3\x4c\xbc\x0a\xe0\x15\xee\x9e\xde\x87\x7a\xfd\x8d\x5f\x5f\x67\x2f\x42\x8e\xd2\x85\x03\x95\xb7\xd5\x70\x73\x76\x0d\xd9\x8a\x66\x02\x1e\xb2\x7d\xd1\x74\x69\x99\x66\xb4\x29\x69\x1b\x5f\xd2\xfa\x78\x32\x47\xe2\x19\x62\x15\x03\xad\x75\x4c\xfc\x1a\xbd\x72\x32\xbe\x71\x8d\x76\xd1\x69\x5f\x53\xe6\x76\xaf\xf7\x90\x5b\xc1", 132, { 0x0f, 0x4a, 0xeb, 0xeb, 0xe2, 0xf4, 0xfd, 0x1a, 0xa8, 0x5e, 0xe3, 0x62, 0x7d, 0xe0, 0xdf, 0x1e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbc\x21\x6c\xe7\x51\x8e\xc2\x30\x89\x6e\x19\x3f\xc0\x21\x46\x38\xe6\x0e\x57\xd3\x29\x04\x49\x92\x43\xc2\x60\x0f\x5d\x92\x27\x6f\x9e\x0f\x04\xf3\x55\x08\x77\xad\xbf\x7d\xef\x4f\x75\xc6\x49\x1e\x75\xd3\xe6\x06\xcb\x8e\x67\xc8\xdb\x5d\x08\x4f\x4e\xc3\x96\x20\x97\x26\x0e\xee\x21\xab\xd4\x4d\x17\x3d\x8c\x7f\xcf\xad\x99\x6b\xd4\xf4\x30\xab\x8e\x93\x18\xc4\x90\x1b\x00\x71\x7e\xc9\x7c\x18\x99\x49\x9e\x5e\xe9\x9b\x2d\xd6\x06\x13\x85\xd4\x82\x7a\x0a\x60\xf6\x53\x4a\x46\xa8\x38\xaf\x4b\xd6\x62\xdd\x7a\xa1\x46\xae\x9c\x99\x5d\xc7\xc5\xe1", 133, { 0xee, 0x0d, 0xd8, 0x9d, 0x25, 0x60, 0xda, 0x7a, 0x2c, 0x60, 0x14, 0xc7, 0x3f, 0x1d, 0x3b, 0x3d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfd\xd7\x0b\xff\x63\x6c\x52\x42\xd2\x71\x43\xd0\xd4\x48\x5b\x4b\x9f\x80\x1f\x20\x93\x33\x6e\x6c\xe0\xff\xee\x8a\x45\x9f\xa8\x3d\xf3\x25\xb0\x77\x90\xd6\xfd\xc4\x57\xa2\x57\x56\x5c\x3e\x6e\xad\xed\xe0\x06\xe3\x14\x96\x50\x91\x3a\x44\x55\x62\xe6\x38\x8b\x32\xa2\x6c\x8a\xe2\xfe\x57\xd8\xbb\xae\x70\xe0\x7c\xce\x40\x02\x01\x46\x22\xc4\x92\x49\x9a\x25\xc6\xf7\x50\x12\x12\x23\xa8\xf2\xf3\x2e\xfe\x5c\xb3\x12\x83\xe8\xda\x7b\xaf\x23\x35\x0f\x62\x9c\x7c\xcf\x9b\x1b\xa2\x95\xd3\xf1\xbe\xbd\xf7\x6b\x91\xe1\x01\x60\xb3\xbc\x32\xea\x5f\x30\xee", 134, { 0x8b, 0x7c, 0xff, 0x2f, 0x5f, 0xb8, 0xe4, 0xec, 0x5f, 0x22, 0xc5, 0x45, 0x5e, 0xb0, 0x62, 0x87 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x31\xd7\x62\x33\x63\x75\x03\xb7\xc0\x50\xaa\x9e\xd1\x87\x5d\xd5\xb8\x2d\x2f\x0e\xa3\xd1\x03\x58\x5a\xa8\x6e\x5a\xf8\x5a\xbb\x2b\xb7\x66\x08\xd1\xe4\x32\x8d\x55\xf1\xb3\xfd\x7f\xa9\xb5\x04\x34\x7e\xc7\xf1\x68\xfe\xc7\x6e\xc1\x64\x05\x6a\xca\x4b\x17\x17\xd0\x7e\x39\x0f\x5d\xea\x5e\x92\x4e\xb5\xd7\xea\x93\x67\x9f\xef\x83\x46\x41\xa7\xda\xc1\x66\x05\x50\x02\xff\xd2\xd6\xa6\x0b\xa9\x70\x89\x05\x1c\xaa\xba\xee\xf5\xb8\x8e\xf2\x96\x2e\xd0\xba\x82\x58\x16\x4d\xf4\x37\x2f\xa3\xad\x19\xb8\xc8\xcc\xd3\xce\xa9\xd5\x9e\xdd\x7f\xd4\x8c\x97\xd5\x9a", 135, { 0x8a, 0xa7, 0x2b, 0xac, 0xd5, 0x8c, 0x7a, 0xae, 0xe0, 0x26, 0xa8, 0xd7, 0xc0, 0xa2, 0x20, 0xb4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa5\x01\x37\x26\xa2\xa7\x79\x20\x45\xf0\xa1\x7e\x53\x8c\x72\x49\x2f\x09\x96\x7a\x15\x85\x67\xfe\xef\x7e\x5a\xd9\xd7\xc5\x08\x66\x2a\x91\xda\xbd\x45\xb0\x51\x2d\xdf\xd9\xf0\xe8\x03\x1c\xc6\xbe\xa8\x7a\x9c\x02\xef\x91\xb7\x89\xf8\x70\x4a\xd0\x60\x89\x7b\x3d\x5b\xc4\x10\x7e\x6b\xb0\xb6\x0e\xbb\xd4\xee\xd6\x1a\x24\x94\xf0\x97\x8f\x0d\x86\xb5\xb5\x0d\xd9\x4b\xb6\x03\x5e\xfb\x26\x21\x02\x4c\x1c\x0b\x8f\x67\x6a\x1b\x27\x6b\xe6\x4f\xec\x6d\xe7\xd0\xc2\x0f\xcc\x1f\x2c\xbb\xb6\xde\x53\x7d\x55\x39\x25\x7b\xe0\xef\x9a\x11\x1e\x01\x12\x8d\xa2\xf5\xdb", 136, { 0xcb, 0x2c, 0x7e, 0xc1, 0x58, 0xd4, 0xea, 0xf8, 0xb3, 0xc1, 0x82, 0x69, 0xcc, 0x3c, 0xaf, 0xa0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x84\x14\xc7\xce\xcf\xa9\x6d\x18\x26\xb4\x06\x16\x56\x56\x9e\x5a\x22\x51\xa0\xcb\xb4\xfb\xd9\xe9\xbe\x4e\x25\x2d\x32\x1c\xb8\x8e\x9a\x60\x0b\x20\x14\xaf\x60\xd7\xee\xcd\xf4\x6a\xda\x5b\xc1\x53\xce\xae\xed\xf2\x7b\xbc\xd2\xd1\x67\x30\xab\x03\xa9\x9d\xd7\xa5\x41\xce\xcd\x86\x11\x3b\x9d\xe3\x7c\x99\x1f\x4b\x9a\x89\xba\xa1\x15\x70\xd2\x40\xa3\x66\xcf\x39\x20\x47\xc7\xb7\x46\xe8\xc7\x84\x0c\x64\xc3\xa4\x99\x94\x17\x1f\xe4\x9c\xb9\xdd\xea\xa2\xfe\xa9\x8a\x9a\x05\x58\x00\x3d\xc4\x03\xfc\x18\xad\x6f\x5e\xc1\xfc\x8e\x91\x24\xa0\x1e\x81\xfb\xc3\x70\x3a", 137, { 0xa3, 0xac, 0x47, 0xc4, 0x7f, 0xf0, 0xfa, 0xcf, 0x5a, 0x75, 0x87, 0xd1, 0x31, 0x8d, 0x68, 0xe1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5c\xf8\x43\x1f\x6c\x00\xcf\xc3\x31\x39\xdd\x67\x86\xa4\x13\x11\x27\x91\x4e\x45\xec\xe9\x28\x62\x13\x18\x99\x9c\xb6\x95\xb9\x92\x5b\x0f\xa3\x8c\xaa\x36\x76\x52\x39\x23\x75\xab\x83\x64\x4e\x71\xf8\xa8\x78\x4d\x2e\x03\xb5\x15\x35\xdf\xb7\xbf\x08\x80\xdf\x00\x1e\x32\x20\x85\x20\x11\x02\xcd\xb6\x75\xc3\xa1\x7b\xf8\x98\x31\x0f\x25\x11\xcd\x4a\xbe\x9a\x3c\x8d\xaa\x1d\xbd\x35\x79\xc5\x97\x29\x96\xde\x5f\x93\x08\xd8\xc6\xac\xe4\x6a\x1c\xaf\x53\xd4\x65\xef\x3c\x3c\x16\x04\x8d\x3a\x6d\x21\x2b\x6f\x6a\x81\x74\x50\x6d\x00\x6d\x01\x6d\xc6\x8d\x5c\xd2\x1e\x25", 138, { 0x4a, 0xa7, 0x74, 0xe4, 0x2d, 0x30, 0x28, 0x86, 0xda, 0x3f, 0x18, 0x0c, 0xef, 0x15, 0xa0, 0xb2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x10\xf0\x65\x6a\xe6\x21\x1d\x21\x1f\x7e\x21\xe5\xfa\x3a\xf3\x18\x52\x9b\x31\x64\x63\x95\x27\xed\xad\x04\x7d\x15\xf1\x85\x11\xeb\x58\xf2\xe0\x31\xb3\x79\x1d\x08\xdd\x59\x64\x3a\x3d\x38\x08\x24\x68\x23\x88\x3e\xe3\x22\x21\x48\x06\x77\x7d\x13\xfb\x73\x89\xea\xe6\xf6\x64\x9b\x1f\x81\x73\x25\x9a\xf9\x91\xff\x68\xfb\x64\x03\x56\xd6\xcb\xf6\xb3\x29\x73\xb4\x30\x1a\x89\xfc\xdf\x30\x89\xd6\x5e\xce\x35\x9d\x0d\x4d\xa2\xad\x7a\xb5\x6c\xa9\xde\x17\x0a\x69\xc1\x89\x3c\x7f\xb8\xbf\xa1\x65\x4f\x42\x65\x44\x01\x50\x17\x63\x64\x51\x98\x2a\x62\xf1\x2f\xd2\xa1\xde\xba", 139, { 0xa0, 0x86, 0x6f, 0x0d, 0x37, 0x2f, 0x7e, 0xf8, 0x9a, 0x82, 0x03, 0x51, 0x49, 0x80, 0x26, 0x4c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xac\x04\x20\xff\x0a\x4b\x0f\x21\xce\xd6\xf6\x2e\x8d\x87\x43\xd5\x5f\xc4\x67\x35\x45\x9c\x50\xd0\x38\x01\x80\x9e\xca\x33\xca\x3e\x7b\x3e\xa9\x48\x9b\x99\x3d\xbd\xd6\xf0\xe3\xa0\x61\xfc\x6f\x9e\xc0\x8d\x09\xe8\x31\xa9\xa1\x21\xb8\xcf\x10\x73\xc8\x54\xcd\xbc\x8b\xef\x48\xe6\xce\x50\xe6\x55\x8c\xea\x9a\x79\x16\xd2\x1c\x83\xdc\xbf\xc9\x34\xda\x31\x17\xd0\xa1\xaf\xb3\x32\x00\x29\x39\xf9\x50\x7b\x8f\xe0\x59\x12\xdf\x2c\xe4\xa9\x2f\x3e\xde\x2d\x9e\x48\x26\xbf\x3d\x1c\xf4\xd7\x87\x20\xe5\x86\x7f\x5e\xa7\xd4\x65\xb8\x3d\x47\x14\x38\xef\x85\xfb\x86\xd2\x11\xb5\x73", 140, { 0x0f, 0x04, 0x8f, 0x85, 0xdf, 0x16, 0x04, 0x94, 0x33, 0x86, 0x13, 0xb6, 0x66, 0xea, 0xc7, 0x9c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xef\x31\x48\xb1\x13\xf0\xf7\xa5\x33\x40\xc4\x55\x79\x37\x86\x7c\xef\x7a\xa2\xbd\xc7\xb7\x69\xf4\x44\x4c\x0e\xa7\x49\x05\x42\x9b\x7c\x02\x6e\x83\x17\xb7\x8c\xd4\x4b\x0e\xa3\xb4\x50\xa7\xdd\x10\x0e\x3f\x46\xcc\x61\x2e\x23\x16\x0d\x0a\xed\xd4\x3e\x6a\xe9\x3b\xba\xc5\x65\x81\xa5\x78\x91\xaa\xf0\xe6\xf7\x7f\x60\xb9\x98\x9e\x36\x47\xa5\xaa\x80\x11\xd6\xa2\xfc\x65\x6b\x4f\xa4\x23\xbd\xd7\xdb\x9c\x80\x70\x32\x96\x98\x2e\xd7\x6c\x94\xfc\x9a\x52\xcb\xa9\x9d\xb7\x12\x1a\x98\xc3\x17\x9e\xc7\xff\x5d\x5f\x70\x14\xd4\xf3\x14\xac\x14\x12\x32\x75\x36\x62\xb2\x44\x4f\x6f\xf5", 141, { 0x4c, 0xac, 0xbf, 0x73, 0xc7, 0x06, 0x64, 0x46, 0xda, 0x86, 0x95, 0xdf, 0xb9, 0xb8, 0xb5, 0xd6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x56\x8a\xb6\x76\xb1\xe1\xe0\x1d\xa9\x78\x0c\x20\x7e\x96\x45\x96\x23\x40\x13\x9a\x19\x74\x2d\x18\x7a\xff\x4c\x37\x12\xfb\x1a\x63\xa8\xe9\x49\xf6\x5a\x66\xc1\x82\x26\x8d\xf1\xbd\x85\xea\x47\x0a\x31\x16\xba\xa0\x08\xf4\x84\x59\x09\x86\xee\x19\x7b\x6d\x43\xd9\x2c\xfb\xe6\x4f\xd7\xf6\x80\x3c\x9f\xec\x51\x51\xb8\x2e\xa8\xbf\x25\x6a\x6e\x5a\x9b\xe9\xdc\x69\x85\x61\x4c\x0c\x21\x78\x2d\x4a\xc7\xd6\x11\xb7\x4a\xe5\xe1\xbe\x77\x28\x30\x91\xba\x35\xac\xaa\xe1\x50\xb1\xfc\xf8\xa6\xf7\xbb\x52\x23\x6c\xc5\xa9\xf0\x1d\xab\x5d\x8c\x4d\x60\xd8\x86\xa8\x7d\x13\xd4\x91\x2f\x31\xd4", 142, { 0x63, 0x7e, 0x3a, 0xe0, 0x18, 0xd6, 0xf3, 0xb6, 0x8a, 0x93, 0xae, 0x2c, 0x75, 0x4d, 0x53, 0x73 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x98\xbe\x49\xdc\x07\xba\x41\x7f\x9b\xc4\xd5\x5f\x50\xf6\xb7\xaa\x56\xf0\xd1\x33\x1f\x80\xa6\x2d\x9a\xed\xd6\x86\x7a\xe0\xc0\xde\xaf\xf0\x42\x22\xf6\xc9\x9c\xc9\x8c\xf8\x72\xab\xfe\x55\xf0\x79\x1c\x0c\x08\xdd\x0b\x4a\xd6\x2f\x7a\x82\x25\xd0\xed\x59\x0b\x27\x35\x34\xaf\x36\x00\x5b\x2b\xd8\x8c\xca\x8c\x99\x77\x94\xf6\x32\xb3\xf5\xe5\x9f\x95\xf2\x8e\xdf\x0c\xaf\x64\x48\xee\x4d\xb6\x84\x6e\x7d\x75\x2c\xaa\xa6\x14\xff\x61\xaf\x88\xbe\xc2\x69\x6f\xa8\x5f\x9c\x4d\x8d\x41\xad\xf1\x91\x15\xe8\xf6\x80\x83\x70\x65\xc8\x9f\xc0\x78\x17\x78\xdd\x79\x92\xce\x1a\xc9\xae\xe2\x87\xfd", 143, { 0xa5, 0xdb, 0x01, 0x1b, 0x71, 0xec, 0xf0, 0x5c, 0x2f, 0xaf, 0x35, 0x2c, 0xf6, 0x74, 0xfd, 0x3e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaf\x65\xf8\x23\xbb\x92\xad\x22\x9a\x57\xa3\x3f\x0d\xae\x76\xbc\xc8\x0b\xf1\x9b\x0d\xee\x34\x80\xe5\x98\x81\xb4\xfe\xda\xa3\x46\x1c\x08\xfb\x4c\x3d\x0d\x28\x47\x4e\x98\x52\xa4\x83\x74\x13\x5f\x57\xf6\x03\xc2\x20\x8f\xdf\x4b\x4d\x82\x55\xac\x40\xaf\x6f\xec\xc2\x8d\x99\xab\x27\x36\x51\x82\xff\x9c\x6a\x89\x76\xd9\xfc\xf2\x49\xa5\xeb\xd2\x65\xe1\x13\x00\x1e\x50\x0d\x16\x08\x65\xa1\x95\x76\x36\xc8\x25\x8d\x90\x5c\xf9\x03\x25\x5e\x51\x7a\xe1\xe3\x19\x73\x5a\x9d\xaf\xf0\x66\x02\xc2\xab\xc6\x1b\x55\xec\xff\xeb\xe3\x0b\x49\x7a\x9d\x82\xa1\x7d\xcf\xae\xf9\xa3\x60\x22\x90\x7e\x78", 144, { 0x70, 0xcb, 0x37, 0x7b, 0x48, 0x29, 0xcd, 0x1c, 0x9e, 0xe6, 0x27, 0x97, 0xf6, 0x5f, 0xb5, 0xdd }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa8\x5c\x0c\x3c\xd5\xa2\xe2\xb5\x48\xa8\xf4\xce\x7f\x83\x03\x7c\x55\x0a\xa3\xf8\x1c\xeb\xe8\x28\x53\xdb\xad\x1c\x04\xe9\x80\xb3\xbd\xec\x2d\x5e\x28\x1b\xe6\xfc\x4a\xbb\x0c\xe5\x54\xf3\x9c\x02\x29\xbb\x39\x19\x6d\xf3\xd1\x27\x46\x90\xef\xe6\xb3\xf1\x9d\x6e\x85\x50\xf4\xf8\xfd\x53\x42\xbd\x04\xc2\xd6\xfd\x01\x54\x6a\x1b\x5b\xa2\x2e\xe5\x8b\x3d\x6d\xf2\xdc\xdb\xde\x24\xc2\xac\x89\x4e\xd4\xcb\x54\xef\x68\xd0\x2a\x1b\xca\x82\xc7\x7a\x18\xa9\x22\x6a\xbd\x02\x76\x40\x88\x4c\xef\xac\x68\x80\xee\x3a\xc6\x1d\xf9\xf5\x7f\xa1\x42\x26\x7d\x13\xd2\x3a\xf1\xbd\x52\xc1\x2f\xf8\x76\x93\x25", 145, { 0xaa, 0x81, 0x41, 0xd2, 0xf2, 0x8b, 0x40, 0x43, 0x3f, 0xcb, 0x21, 0x01, 0x79, 0xcd, 0xe5, 0xf0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1f\x06\x0d\x79\xa6\x8b\x79\x3f\x43\x92\x8c\x54\x4a\x9f\x08\x5a\x16\xb2\x82\x50\xa3\x6f\x3e\xcc\x39\xec\x36\xd8\x43\x1c\x39\x67\x3e\xd2\x30\x72\xcd\x75\x7d\xb4\xe9\x3f\x7c\xfe\x35\x31\x2b\x37\x6f\x97\xe6\xf4\x03\x33\x4b\xb0\xba\x09\x3c\xa8\x8f\xc6\x02\x56\xa2\xce\x8f\x87\x46\xe1\xdc\x1b\x35\x69\x71\x59\xe3\x62\x03\xec\xef\xe6\x37\x7e\xb6\x54\x85\xf0\x02\x1c\x37\x33\xe0\x2a\x91\xc6\x8f\xed\x0b\xcc\x94\x03\xba\xc9\xeb\x83\xcd\xf9\x58\xe6\x32\x4d\xdb\x92\x58\x03\x41\x05\x10\xe0\xd7\x9b\x8d\x0d\x3a\xfb\x8a\x8c\x4a\x24\x8a\x55\x3d\x10\x3b\x11\xcf\x02\xf4\x72\x97\x71\x5d\x2d\x75\x91", 146, { 0x08, 0xbc, 0x75, 0x2b, 0x6e, 0x0a, 0xe8, 0xd2, 0x25, 0x7e, 0x6c, 0x2b, 0x47, 0xf3, 0x79, 0x7f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2e\x95\x28\x7a\x10\xd5\xfc\xf7\x9f\xca\xa0\xee\x91\x7b\x16\x67\xf0\x36\xc3\x3a\x83\x48\xa6\x59\x4b\x58\xa5\xb8\x29\x60\x03\xd5\x9d\x49\xee\xe7\xa9\x23\x35\xa7\xd3\xfe\x17\xb5\x4a\x67\x37\xa9\x20\x82\xab\xb7\xb6\xc1\x33\xfe\x35\x3e\x86\x6d\x38\xbb\xc8\x52\x87\x33\x19\x81\xff\x1c\x47\x1d\x8d\x3c\xa3\x06\x59\x25\xf1\xdf\xff\x4f\x79\xba\xf8\xd0\x3a\x63\x17\xba\x3e\x46\x30\x11\x09\xfd\xd3\x67\x2b\x7a\x36\x16\xf5\xce\x30\x1a\x48\x93\x62\x89\x89\xfc\x70\xaf\xb0\x77\x6d\xca\x80\xfc\x55\x5f\xd1\xf6\xb3\x37\x09\xca\x63\xf9\xa9\x08\x72\x65\x03\x2d\x21\x2a\x0a\x12\x09\x65\x41\xf5\x58\xb8\xd6", 147, { 0x43, 0x95, 0x30, 0xa4, 0x0d, 0xbc, 0x2d, 0x03, 0x2c, 0x61, 0xc3, 0x95, 0x63, 0xd2, 0x7d, 0x95 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x23\x39\x02\xc8\x3e\x52\xc0\x42\x30\x67\x00\x0c\xad\x1c\xfd\x17\x5e\xd7\x5c\x36\xaf\xc4\x02\xec\x36\xf2\x90\x60\xbe\x9a\x7c\x6d\xf0\x80\xcd\xd6\x9d\x73\x72\x97\xab\xee\x40\x56\x99\xe1\x87\xf8\xb0\x89\x4f\x50\xc8\x7b\x34\xf3\xb4\xc1\xdb\x27\x4b\x1b\x10\xfa\x14\x67\x7e\x6e\x8d\x1b\x0a\xd2\x18\xee\xcc\x2c\x83\x96\xaa\xd2\x32\xad\x93\x17\xeb\xad\x55\x23\x3e\x1a\x1c\xdc\x8f\xbf\x88\x00\xc1\x10\x69\x55\x81\xae\x1a\xf7\x2c\x0a\x77\xd0\x5e\x21\x7c\x27\x18\x65\x7b\x4f\x8d\xbc\xf9\x7f\x89\xa1\x26\xc2\x7f\x69\xf8\x05\x2d\xa0\xe3\x4e\xee\x92\x37\x0c\x9c\xe5\x15\x89\x1f\x63\x0f\x7b\x97\xd6\x5c\xba", 148, { 0x7a, 0x61, 0x56, 0xe4, 0xc4, 0xdf, 0xf9, 0x6d, 0xc2, 0x11, 0x35, 0x16, 0xf1, 0x9a, 0x6e, 0x89 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x22\x0c\xb4\x0d\x4a\xfa\xce\x1d\x0e\xfd\x74\x8b\x8b\x3b\x3f\x1d\x47\x28\xf5\x13\x1b\x25\x7b\x98\xba\x42\x78\x54\xe2\x24\x89\x1e\x1d\x02\x1a\xcf\x34\xc9\xe7\x32\x31\x60\x10\x17\x10\x06\xd2\x87\x02\xd7\xe8\x11\x5d\x6d\x7d\x43\x23\xa2\xcc\x35\x2c\x74\x56\x3f\xf3\x02\xbf\xca\xfb\xb3\x46\x44\xdc\x76\xdf\x2d\xee\x23\xef\x4e\x90\x00\xa3\x0a\x16\x60\xee\xcd\x4d\x67\x1d\xa1\xab\xe8\x18\xdf\x18\x6f\x37\x02\x53\x5a\xbe\x97\x03\x22\xf7\x51\x5b\xb7\xea\x39\x68\x0a\xbc\x02\xfa\xa4\xa2\x7a\x2c\x73\x80\x1d\x92\xa6\x22\xc4\xff\xad\x15\x7a\xf0\x63\x23\x6f\x99\x48\x6a\x06\x89\xe7\x18\x09\xfc\x56\xc6\xfc\xbd", 149, { 0x69, 0x0d, 0x82, 0x75, 0x0b, 0x92, 0x08, 0xa6, 0xae, 0xc8, 0x57, 0xe3, 0x5e, 0x0f, 0x9f, 0x3e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdc\x6d\x8f\xb6\xad\x09\x2d\x16\xd0\xc8\xb1\x1d\x21\xef\x38\x87\x73\x4a\x11\x92\xcd\x4e\xd1\xae\xd5\xcd\x84\xc1\x4b\x54\xfd\x14\xac\x24\x4f\xdd\xf7\xcc\x54\x69\x8b\x5f\x6a\xe6\x2f\x57\x3e\xca\x2c\x06\xc0\xe4\x95\xb5\x36\xfd\xa7\x5b\x6d\x2a\x4b\xfb\x09\xb1\xb8\x9b\xfe\x96\x35\xdc\x17\xc1\xfc\x3b\xb4\xcd\x3a\xe3\x91\x6f\x33\x2c\xc0\x81\x83\xb4\xb9\xaa\x7f\x18\x88\xac\xba\x50\x24\x4a\xa4\xa5\xe0\xd4\x4c\x4f\xfb\x50\x46\xaf\x52\x47\xa7\x25\x34\x29\x2d\x8f\x56\x5e\x7c\x5f\xdd\xea\x83\x58\x99\xbb\xfd\xe5\x52\x92\x14\x16\x3a\x8c\x1f\x37\x81\x4c\x8c\x0f\x08\xc7\xd9\xb2\x2d\xac\xbc\x03\xc5\x6e\x63\xca", 150, { 0x7f, 0x92, 0xfb, 0x9d, 0x68, 0x56, 0xeb, 0x53, 0xe8, 0xab, 0x26, 0x4d, 0xd0, 0x3f, 0xf8, 0xe6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x28\xef\xd6\x6e\x65\xca\x78\x4f\x96\x3d\xac\xc2\x4f\xb2\x93\xaa\x30\xe8\xf4\xaf\x9a\xc3\x35\x1e\x7e\xac\x86\x5d\x51\xa6\x1d\x09\x1c\xef\x9b\xae\xaf\x4f\x8e\x22\xf5\x00\x10\x7e\x63\x39\x8c\xba\x8b\x59\xa0\xe4\xcd\xad\x1e\xfd\x2c\xde\x2d\x70\x3e\xfa\x8d\x30\x3d\x1d\xf8\x6d\x3c\xbb\xa3\xf2\x73\x8d\xe4\x1e\xbb\x16\xed\x7d\x15\xd1\xb6\x02\x64\xf9\xf9\xe3\x3b\xf4\x57\x11\xd1\x5d\x98\x53\x11\xad\x10\xfe\xce\x85\x1c\x53\x14\x9a\xcc\x75\x99\x3d\x9b\x05\x53\x86\x59\x5c\x23\x1c\x29\x64\xaf\xa4\xa6\x13\x4d\xc4\x21\x85\x1a\xd3\x06\xb6\x2b\x1f\x5d\xd9\xdb\xd9\x6c\x57\x44\xa1\x79\x67\xc9\xaa\xac\x46\xcf\x8a\x13", 151, { 0xf3, 0x88, 0x0d, 0xa8, 0x7a, 0x3e, 0xd7, 0x9e, 0x5d, 0x42, 0x7d, 0x7a, 0xaa, 0xbc, 0x6e, 0xd4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x14\x8b\xa1\xc0\x4b\xf6\x23\x0d\xdc\xde\xc3\x00\xe7\x16\xfd\xc9\x17\xce\x00\x68\x99\xfd\x37\x6b\xb7\xfa\x73\xd5\x15\x2a\xb7\x1b\x86\xd4\x9f\x48\x8c\x11\x6d\x40\x6a\xdf\xb1\x21\xe8\x54\x95\xc5\xa3\xef\xc2\x64\x0e\x0a\xf3\x57\x09\x6c\x14\xf7\x1c\xfb\x16\xa4\x50\x8e\x52\xe1\xaa\xe0\x97\x9d\x45\xa1\xd2\x8d\x0b\xa7\x59\xb4\x0f\x43\xd4\x04\x8a\xae\xc8\x1e\x71\xa1\xc1\x36\xaf\x03\x1c\x12\x04\xbd\x6e\x31\x79\xaa\x95\x08\x7f\xaa\x59\x67\xa4\xd6\xbd\xfb\xf1\xcd\xe8\xec\xe2\x2d\xab\xa7\x02\x1e\xaf\xb6\x23\x08\x3c\xca\x37\x64\xa8\xdb\xcf\xb0\x5a\x66\x2d\x7c\x7a\xd5\x07\xa2\x37\xfd\xdb\x93\xb4\xc1\xe9\xcb\x90\xd3", 152, { 0x60, 0x2b, 0xfd, 0x08, 0x46, 0xc2, 0x5c, 0x0d, 0x1d, 0x63, 0x05, 0xd8, 0x59, 0x14, 0x44, 0xd1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd2\x66\x10\x9b\xcb\xcd\xeb\x30\x7e\x89\xb2\x83\x7d\x38\xdb\x9b\x63\x9c\x69\xfa\x89\xd0\x39\x1f\x62\x97\xea\x25\x74\xcd\x6a\x89\xf3\xff\x1a\x09\xfc\x16\x9d\xa7\x6b\x2e\x42\xcc\x59\x85\x0b\x8a\x35\x8e\x5a\xfa\x7e\x25\x37\xc4\x1a\xde\x40\xbd\x56\x76\x2e\xab\x7b\x6b\xff\x23\x09\xa7\xc6\x93\x93\x57\x0b\x5c\x36\xdb\xe0\x17\xb7\xd6\x81\xf9\x38\x64\xa7\x51\x97\x6b\x69\x2e\x64\x0b\xcf\x1d\x7c\x2f\xf5\x0f\x46\x45\xd9\x5a\x8a\x0a\xc1\xd6\xe9\x7e\x4b\x28\xfd\xf7\x13\x1b\x0e\x52\xfa\x2a\x6d\x44\x19\x1a\x71\xce\x43\xc4\x0b\xcf\x2f\xf0\x08\xb3\x4a\x5d\xe4\x49\x18\xde\x45\xb3\x43\x9e\x1b\x77\x42\x84\x51\xb2\xa7\xb1\x30", 153, { 0xa7, 0xb7, 0x03, 0xe9, 0xa9, 0xbe, 0x15, 0x1f, 0xd7, 0x1d, 0x12, 0xad, 0xa6, 0x66, 0x1e, 0x57 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6b\x05\x26\x51\x05\x7b\x83\x3d\xcf\xe2\xeb\xa3\xb6\x8f\x03\x34\x1a\xc5\x18\x1f\xbd\xba\x60\x24\xd8\x44\x58\x57\x48\x20\x4d\x74\xe5\xdf\xf7\xd9\xf3\x6e\x3f\x24\xb2\x40\x22\x69\x10\x1a\xad\x10\x7f\x7a\x28\x4a\xe0\xa5\x4f\x2e\x9e\x4c\xbb\x74\xd8\xda\x60\xcc\xb6\x5d\x2f\xdc\xdd\x0e\xdc\xd5\xfd\x7f\xba\xb0\x87\x60\xc2\x0b\x7c\xed\xb2\x9a\x61\xf8\x52\x4b\x4f\x8e\xd1\xfa\x27\x49\x4e\xce\xe2\x32\x74\x2e\x06\x50\x3d\x64\x34\xd1\xd7\xcc\xde\xd4\xa3\xb8\x17\xd1\x5a\xe4\x83\xa6\x4a\x90\x6d\x3f\xbf\x40\xf7\xe0\x7d\x0c\x6c\x12\x68\xa4\xb2\x28\x46\xe4\xdb\x6c\x9d\x10\xda\xeb\xb7\xac\x52\xda\xc4\xfb\x8a\xa4\x1e\x12\x7d\x91", 154, { 0x83, 0xe9, 0x8a, 0x97, 0xe1, 0xf0, 0xd6, 0x1c, 0x85, 0xf4, 0xed, 0x7e, 0x3a, 0x05, 0x3d, 0x25 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa7\x97\x0f\x14\x4e\x1b\x59\xb1\xb1\x12\x25\x89\xdd\x6b\x75\x83\x30\xd0\x3e\x19\x5f\x7c\x32\xbc\x94\xb3\xbb\xe5\xb0\xe3\x03\xba\xae\x55\x30\x58\x27\x90\xad\xc3\xf2\x4a\xa4\x68\xe3\x0c\x88\x4a\xb4\x61\xce\xd1\x02\xba\xbb\x2c\x6e\xe1\x58\x5e\xe4\x18\x83\xec\xf8\xce\x20\x22\x6c\xfd\x6c\xfd\xce\x23\x72\xb8\x3e\xda\x96\xf6\x4e\x16\x4e\x88\x02\xfb\xf1\xdc\xf6\x59\xa7\x03\x9f\xc5\x80\x5d\xa9\x55\xa2\xe3\x80\xf7\x9a\x11\xeb\x6e\xd3\x6e\xd2\xea\x24\xb9\x20\x44\x83\xb2\xc3\xd3\xd7\x82\xd0\xed\xec\xc8\xc4\xfe\x80\x40\xe6\x3e\x7a\x12\xc8\x12\x3a\xb5\xec\x01\x0b\x7e\x82\x51\xb5\xc9\x4f\x3e\x30\xc2\xaa\xd6\x72\xd1\xa1\x74\x69", 155, { 0xad, 0x2e, 0x8c, 0x9f, 0xe8, 0x7f, 0x9d, 0xba, 0x71, 0xc8, 0x41, 0x50, 0x33, 0x22, 0x2e, 0xaa }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa0\x38\xd6\x05\xca\xd1\xdd\x6c\x21\xa7\xe2\x51\x9c\x74\xb0\x5f\xdb\x33\x21\xcf\x59\x00\x58\x19\x2d\x1b\x98\xc6\x7d\x0b\xbf\x64\x7f\xdf\x63\x94\x2d\x90\x88\x3d\x85\x82\xfa\xe3\x7a\x29\x4d\x12\x7a\xc8\x6f\xf4\x9d\x55\xe7\x02\x67\x79\xac\xd7\x3a\xb3\xa4\x20\x5b\x9c\xb8\xb0\x9f\x45\x90\xb0\xb1\xbc\xf0\xf4\x03\xae\xae\x68\x4f\x26\x4f\xa9\xc9\x74\x3e\xb0\xe3\x28\xa8\xa9\xbc\x3d\xf7\xe2\x26\x54\xe8\xdf\x52\x15\x4b\x8a\x1b\xba\x57\x87\xeb\xa7\xa7\xa6\x4e\x31\xd5\x72\x11\x7f\xb1\xe6\x16\x8e\x1f\x3f\xb7\x4e\x8a\xed\xd5\xea\x09\xa3\x7c\x25\x0c\x8d\x34\xdf\xc2\xa1\xe7\xb8\x0b\x0f\x6a\xcb\x15\xd2\xaa\x9b\x95\x68\x74\x0c\xa4\x9e", 156, { 0x0d, 0x7b, 0x57, 0x4b, 0x26, 0x26, 0xcd, 0x87, 0x41, 0x4e, 0x6a, 0xff, 0x3b, 0x56, 0x58, 0x20 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe0\x88\x34\x85\x5b\x42\x2d\x81\x50\x97\x28\x7f\x73\x90\xc7\x46\xaa\x84\xaf\xe7\x97\xdb\x23\x4f\xc6\xed\x3e\xfb\x70\x08\xcc\xca\xea\x91\xc6\xee\xad\x41\x69\xfc\x02\x91\xf2\x24\x4a\x31\xf8\x7a\xe7\xb1\x65\x72\xcb\x43\x12\x6b\x9b\x97\xff\x62\x7f\xe6\x2c\xc7\x89\x0b\x16\x6c\xbf\xcb\xd1\x9a\xc7\x35\xbe\x3e\x2e\x25\xea\x41\x54\xe2\x04\xf5\xf8\xe7\xf8\xab\x5c\xbf\x2c\x61\x15\x09\x56\x98\x71\x9b\xf8\x44\x84\xc3\x79\xdd\xd1\xa9\xe1\x93\x92\xd0\x31\x9e\xa5\xbb\x5d\xb3\x13\xac\xe7\x92\x3d\x88\x19\xbc\xa5\xd6\xdf\x43\x56\xe6\x3f\xb9\xf1\x0e\x75\x4a\x56\x10\xaf\xe6\xeb\x97\x61\x96\x8c\xe0\x46\xf0\x0f\x76\xf5\xa6\x72\x15\x1c\x38\xa4", 157, { 0x73, 0xb6, 0x03, 0x35, 0xf6, 0xda, 0xb2, 0x8b, 0x69, 0xf1, 0x80, 0xf7, 0x40, 0x0b, 0x06, 0xc0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb0\x5b\xca\xec\x8e\xbf\x10\xfa\x8f\xd9\x65\x89\x8d\x7a\xfb\xad\xde\x0e\x2d\xbe\xf5\x93\xf1\xe1\x28\x34\x69\x30\x8c\x86\x98\x85\xfc\x5e\x31\xe8\x39\x4c\x8b\x92\x2b\xb9\xb2\x9e\x46\x99\x97\x4b\x08\xcc\x67\xf0\x9e\x17\xf9\x7d\xa6\xb9\x60\xa9\x10\xad\xa0\xbd\x1e\x7c\x7e\xfd\x8a\xbb\x70\xae\xc6\x28\xb4\xc9\x5e\x5d\x7d\x3a\x7a\x2f\x47\xd5\x7f\xa6\x4c\xd6\xd6\x98\x0f\x13\xc4\xe4\x15\xc0\x78\x48\xb3\xdf\x24\xe0\x03\x42\x43\x3c\xf0\x3e\xf8\x1c\x71\xee\x97\xca\xd3\x21\x3d\x14\x2e\xe1\x99\xe5\xf9\xa1\xce\x80\xba\x02\x71\x58\xd6\x42\xad\x8e\x86\x41\x86\x07\xea\x31\x3a\x29\x37\xda\xc3\x33\x0d\x88\x7a\x37\xe4\x92\xd5\xb4\xa4\x87\x51\xd4", 158, { 0x26, 0x34, 0xea, 0x0f, 0xa7, 0x52, 0x4b, 0x9a, 0xb2, 0xdf, 0xcc, 0x1f, 0xf1, 0xd3, 0xd0, 0x78 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x53\xf6\x6b\x3e\xe8\xda\xc8\x99\x3f\xa0\x74\x9f\x26\xd7\x47\xd9\x94\x73\x64\xfc\xf9\xbe\xdb\xe0\xb1\xdc\x6e\x19\x92\xf9\x71\x34\xa4\x11\xca\x90\xf0\x5b\x18\xd6\x71\x53\xf0\x16\x28\x63\x43\x7f\x4b\x2d\xdb\xbb\x9d\x77\x04\xe5\xd9\xb4\x47\x28\x48\x2b\x52\xf5\x72\xc6\xf3\xe0\xf1\x79\x43\x18\x60\x4d\xe0\x81\x73\x08\x52\x70\x21\x7b\x8f\x02\xfb\x68\x99\x19\xa0\x0d\x45\xf4\x49\x52\x18\x6a\x80\x8a\x4a\xc3\xee\xe9\xec\x33\x51\x83\x25\xf4\x8c\xfd\x98\xff\xd8\xd2\xe1\x66\x19\x44\x3f\x51\x4b\xdd\x4c\x93\x1b\xa0\xe6\xe8\x92\xd1\x32\xcd\xec\x5e\xb7\xfc\x87\xe9\xa5\x83\xf7\x73\x39\x80\x36\xa6\x38\x7b\xf9\xbe\x98\x60\x1d\x16\x3e\x17\x40\x4b\xe2", 159, { 0xe6, 0xaf, 0x93, 0x2f, 0xba, 0x00, 0x41, 0x8d, 0x2c, 0x9f, 0xc7, 0x71, 0x81, 0x48, 0x2c, 0xfe }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc2\x6d\x0f\x10\x92\xef\x8c\x47\x47\x46\x72\x44\x42\x38\x9f\x59\x48\xfe\x6a\xf6\xd5\x9f\x8c\x49\x1a\x5b\xac\x02\x96\x3d\x86\x2f\x4c\xd3\xb7\x47\xa6\xfa\x27\x42\xe6\xd3\x13\xe5\x45\xd2\xb6\x1c\xaa\xf5\x93\x7f\x08\x11\x62\xf7\x54\x47\x94\x7a\x22\x96\x85\xf1\xdb\x8b\x3e\x3b\x9d\x13\xe3\x4b\xaf\x71\xbf\x6d\x9f\x4a\xea\xa6\xfb\xdd\x95\x38\xa8\x51\xf2\x44\xe2\x27\xc2\x8a\xd0\xcf\x7c\x4c\xc3\x56\x17\x52\x0b\x3c\x75\x06\x76\x64\x6c\xbf\x66\x24\x71\x1b\x8e\x7c\xe3\x85\x49\x64\xf2\xd6\x96\x3e\x2a\x17\xb4\x6b\xa0\x65\x56\xfa\xb7\xed\x84\x7a\x8f\x17\x0e\xf0\x0b\xc0\xad\xe4\x7e\x9f\xb7\x96\xf2\xc9\x7e\x4e\x14\x4f\x47\xd1\xbf\x05\xe2\xef\x23\x5e", 160, { 0xc1, 0xf7, 0x9a, 0xa7, 0xb1, 0x56, 0xdd, 0x85, 0x09, 0x0d, 0x4f, 0xc0, 0xd1, 0x25, 0xb0, 0x3c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xeb\x39\x92\x73\x9b\xd1\xe7\x22\x4b\x5a\x93\x53\x87\x0e\x45\x56\xcb\xed\x35\x68\xdd\x13\x0e\x55\xc6\x23\x76\x37\x6e\xdf\x3b\x5c\xd3\xda\x1b\x45\xe6\x44\x30\xcb\x02\xe4\xf6\x5d\x09\x25\xfb\x64\x1d\x47\x22\xc7\xf8\xb6\x93\x8a\xe9\x78\x42\x91\x6c\xbf\x1b\x83\x64\x9e\xc7\xca\xf7\xd9\x1e\xb6\x06\xd5\x29\xc1\x48\xae\xd2\xed\x02\x67\x2b\x4a\x65\x3c\x57\x94\x83\x14\x19\xf8\xef\x12\xf7\xf7\xf1\x4b\x0a\x64\x63\x92\x65\x87\x2c\x6e\x20\x64\x56\x2d\x00\x15\xcd\x12\xc4\x54\xb6\xa9\x0e\x15\x69\x3c\xec\x50\x0d\x5e\x03\xdc\xcf\xa4\x57\x77\xbf\x74\xb9\xe2\x47\xf5\xce\x29\x48\x26\xb7\x01\xd2\x0a\x62\x49\x80\x01\x6d\xb3\x6e\x33\xb2\x7c\xd9\x25\x73\x57\x51", 161, { 0x25, 0x9e, 0x60, 0x07, 0xc6, 0x99, 0x48, 0xe3, 0x91, 0x92, 0x4e, 0x39, 0xd7, 0x44, 0x7f, 0x63 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6d\x23\x68\x9d\x82\xcf\x6b\x2b\xad\x27\xf5\x32\x1c\x2d\xd3\x66\x15\x79\x8f\x57\x48\x26\x11\x67\x3d\x5d\x61\x66\xec\x7c\x8a\xcc\x6b\xe2\x9a\x92\xc2\x5a\xc7\xad\xda\x21\xac\x28\x94\x95\xb0\xdc\xf7\x7d\x87\xcf\x81\xef\xd2\x27\x9e\xe2\xe2\xc9\x36\x50\x9a\x93\x61\x07\x72\x32\x36\x0d\x98\xa0\xc1\xae\x31\x3d\x12\x24\xbd\x89\x72\xe1\x98\x7c\xb1\x7b\x9c\x82\x9b\x34\xe4\x16\x89\x25\xac\xfa\x13\x07\x54\x10\xe3\x9e\x83\xd9\xa5\xc3\x68\x87\x1a\x0c\x1c\xc0\x4c\x1a\x23\xf2\xdc\x7e\x12\x4d\x77\x48\x4a\x62\x67\x2e\xe2\x56\x45\x56\xa3\xc2\xcd\xc0\x2c\x2b\xca\x53\x36\x19\x30\x83\xf2\xd6\x48\x9b\x8f\xc4\x06\xac\xd8\x5b\x76\x12\xf9\xbf\x55\x9f\x61\xfa\xbc\x67", 162, { 0x02, 0xa5, 0xc5, 0x80, 0xb9, 0x42, 0x65, 0x02, 0xa8, 0x7b, 0x20, 0x32, 0x10, 0x65, 0xad, 0x6c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc3\xdb\xf7\x28\x38\x6a\x74\x53\x7f\x06\xd7\xbb\x64\x1d\x2a\xd9\x3e\x88\x32\xba\x91\x81\xdd\x86\xd4\x42\xd7\xad\x4e\x3b\x3b\xaf\x1a\xee\x67\x88\x49\x6b\xe8\xb7\x26\x63\x94\xea\x94\xec\xb7\x48\x94\xd0\x65\x5a\xe3\x92\xef\x97\xc0\xfe\x70\x8a\xcb\x6c\x87\xa2\x09\x91\x1f\x96\x04\x01\x69\x73\x10\x45\xeb\x43\xa8\x94\xb2\x5b\xf6\x32\xa3\x42\x71\x62\xf0\x39\xa1\x09\xa6\x6c\xfe\xe1\x62\xb3\xf6\x56\x24\x05\x0e\x01\x3b\x7a\x20\xbe\x60\xfa\xc2\x6c\xdf\x87\xc7\x40\xf0\x25\xdf\xc6\x24\x62\x5a\x76\xfb\x85\x09\xef\x92\x57\x45\xd2\x79\x88\x09\x3e\xa3\xc0\x3a\xe3\x77\x44\x08\xc5\x03\x40\x6c\x8f\x50\xb7\xd1\x91\xd0\x04\xcf\x58\xf4\x0b\x12\xe9\xda\x02\x59\x99\x24", 163, { 0xbf, 0x90, 0x55, 0xe1, 0xda, 0x81, 0x3d, 0x69, 0x5c, 0x5d, 0x2c, 0x5d, 0x96, 0xe9, 0x51, 0x54 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd6\x9b\x8c\xe4\x3b\x44\xc8\xb3\x53\x9c\xf5\xe1\xfa\x49\xb3\xc6\xac\xeb\x98\x37\x13\xe5\xc5\x14\x31\x3c\x24\xff\x27\x97\x40\x27\xa0\x66\xc0\x42\xdd\x20\x81\x99\x5d\xa4\x4f\x3d\x28\xc1\x40\x57\xb8\xd1\xae\x9d\x85\x80\xcf\xe1\x2c\xaa\xf3\xc3\x3b\x62\x59\x87\x9b\x10\xad\x01\x9a\xb2\x22\xad\x95\x43\x28\xdb\x3e\x38\xca\x07\x90\x27\xa7\x47\x4c\x83\x8b\xdd\x2e\x82\xaa\xec\xb1\x1f\x78\x48\x7c\x3b\x28\x66\x68\xdf\xbf\x72\x2e\x9c\xd3\x80\xb2\x13\xe5\xda\xe6\x91\x58\x78\x5c\xd2\x0e\x8d\x6d\xe7\x9e\x3e\xff\x32\x33\x6d\xf5\x8d\x04\xb4\x39\x8a\x6b\x6e\x5f\xd5\xa5\xef\xf6\xb6\x25\xd3\x70\xb3\x95\x74\xab\x52\x6a\x75\x1b\xfc\x22\x7b\x96\xfd\x1d\xfc\xbc\xa8\x15\x2f", 164, { 0x9c, 0x17, 0x1d, 0x5e, 0x84, 0xcb, 0x1e, 0x60, 0x48, 0xd1, 0x73, 0x61, 0xee, 0xa5, 0xbb, 0x78 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x01\x98\x3c\x23\x59\x11\xf1\xec\x7f\x84\x1e\xf7\xe1\x31\x30\x7f\x2b\xe7\xb4\x18\x6e\xe7\x8b\x69\xed\xe7\xc9\xf7\x84\x32\x30\x1c\xb6\xec\x44\x16\x51\x74\x0b\x3b\xc0\xe2\x63\x4b\xed\xaf\xff\xde\xd0\x74\x00\xfc\x99\xcb\x2c\xcb\x76\x52\xcd\x63\x01\xce\x28\xbe\x4a\x6b\x99\xcb\x7c\x21\x48\xa1\x2e\x33\x8a\xd0\x48\xd2\xd6\xd4\x90\xde\x61\xa3\xd0\xcc\x59\x65\xa6\xa2\xbb\x44\xe8\x1f\xd2\x59\xb1\xf9\x4d\xc5\x0d\x3e\xfb\xe1\x3d\xdc\x25\x8d\xa7\x3c\x88\xa5\x5d\x08\xed\x92\x48\x0e\x67\xfc\xf0\x3c\x29\x9d\xeb\xcb\x01\x31\xe1\x79\x75\x8a\x37\xee\x78\xbf\x60\x40\xc9\x84\xbc\x92\xe9\x95\x2b\xd7\xb7\x4d\x33\xb4\xa9\x53\xca\x84\xa9\x73\xc0\x75\x8a\x8b\xcb\xcf\x25\x9c\x31", 165, { 0x17, 0x89, 0x0e, 0x3e, 0xab, 0xcb, 0x90, 0x4d, 0xe0, 0xf3, 0x5b, 0x5b, 0xfe, 0x31, 0x6d, 0x40 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x55\x14\x00\x0c\xc4\x0a\xbb\x3d\x78\xce\xe9\xf0\x2e\xd2\x57\xc7\xe4\x74\x2e\xa5\xdd\xd0\xca\x1a\xc1\x40\xaa\x66\xe0\x71\x7f\x2c\x97\x23\x67\xb4\xcb\x7c\x33\xdd\x93\x0a\xe4\x9d\xf2\x54\x35\x36\xc1\x1b\x52\xf8\xac\x32\xa6\xad\x53\xf7\xd2\xa4\x90\x6d\xb9\x5d\xd8\xf7\xb8\xce\xba\xb3\xf3\x50\x85\x71\xcb\x29\x07\x4f\x6b\xb6\x6f\xf3\x82\x35\x54\x63\x0b\x2d\xce\x84\x47\x7a\xc2\x2d\xcd\xf9\x3c\xe7\xb7\xcc\xf5\x43\xfe\x4a\xf3\xd8\xe0\x86\x50\xd8\x7d\x7a\x12\x4e\x82\xd1\x39\xf7\xfc\x4e\xd8\xba\x4e\xdc\x5b\xc4\x3e\x32\xe7\x44\x29\x22\xdf\xc0\x57\x7f\x82\x13\x69\xa9\xb1\x03\xef\xb7\xce\x83\x16\x3f\xc1\x82\x7e\xc4\x14\x6d\x2a\xbd\x3e\x48\x91\x3e\xfd\x64\xd1\x46\xdc\xbe", 166, { 0xf1, 0x4c, 0xc8, 0x4a, 0x3c, 0x5d, 0xf7, 0xd0, 0x16, 0x5d, 0x8d, 0xf6, 0xf1, 0x0e, 0x52, 0xec }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x03\xa4\xd4\xf4\xa9\x86\x0f\xe5\x44\x9f\xc7\xe3\x03\xf4\x4d\x97\x95\x44\x26\x72\x1f\x12\x50\xcc\x4a\x50\xa2\x9b\x73\xa9\x51\xd0\x06\x6b\x8f\x51\xe5\x10\x4d\x8f\x01\x68\x22\xc5\x0c\x64\x44\xcc\x45\x81\xb2\x9c\x72\xce\x74\x63\xec\x9c\xfa\x3b\xd4\xc2\xa2\x8c\x64\x8a\x55\xfe\x60\x3c\x51\x18\xaa\x44\x01\x7a\xf5\x02\x07\xb3\x92\x2f\x5c\xc0\x66\xe7\x8f\x22\xfd\x57\x29\x9b\xb7\x03\x32\x84\x20\xb4\xcc\xce\x5e\xfd\xfc\x93\xc3\x69\x89\x58\x82\x43\xfd\xe2\x7f\x02\xc8\xb1\x3f\x4e\x84\x1d\xff\xb3\x54\x0c\xe0\xe1\x65\x4e\x3f\x9d\x96\x95\x23\x48\x34\x14\xd0\x0a\xde\xb2\x78\x9b\x88\xeb\x11\xae\x9a\x44\x42\xfa\x38\x69\x77\xe6\x9d\xe4\x13\xd0\xa0\x7c\xc5\xfa\x59\x28\xf4\x11\xdd", 167, { 0xa0, 0x91, 0xf8, 0x02, 0x18, 0x02, 0x02, 0x74, 0x19, 0xaf, 0xbf, 0x2f, 0xe5, 0xd5, 0x0a, 0x96 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xae\x54\x5b\x24\xdd\x9a\x7d\x0c\x63\x4c\xe7\x77\x4c\xb1\xdd\x8f\x18\xe8\x22\x29\x77\x15\x43\x47\xa3\xb6\x7d\xb8\x5a\x14\x4c\xda\x77\xd4\x91\x80\x2c\xad\x5e\xee\xde\x34\x62\x01\x9d\xd2\xec\x6c\x3f\xd8\x9d\x1c\x18\xa9\xaf\xbd\x57\x15\xdc\x56\x00\xc7\xec\x10\x81\xd4\xde\x14\xf4\x73\xb2\x91\xf0\xcc\xd1\xdd\x0c\xe9\x1a\xb3\xf1\xc9\x8a\x9b\x1b\x93\x87\x67\x2c\xe8\xc9\xd9\xed\x51\xe6\x62\xe2\xd8\x78\x05\x88\xb2\xec\x5a\x2d\x19\xea\xaf\x6c\x38\x5c\x49\x44\x40\x1e\xc8\xd5\x98\x40\xa8\xb6\x31\xfa\xe4\xf5\xf7\x2d\xb5\xac\x63\x92\x78\x3c\x2d\x81\xad\x29\x1f\x60\x1b\x92\x05\xa6\x12\x4b\xc1\x8b\xc8\x99\x7b\x4e\xe5\x89\xf5\x22\x1a\xed\xfc\xb6\xec\xf4\xfa\x60\x8f\x65\xa9\xe5\xed", 168, { 0xac, 0x8b, 0xae, 0x88, 0xd7, 0x6a, 0x35, 0x60, 0x7d, 0x02, 0x43, 0x98, 0x20, 0x2a, 0xd6, 0xec }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x78\xe2\xe7\xc6\x51\x93\xec\xf1\x19\xcf\x07\xc0\xbb\x00\x25\x81\x38\x37\xf5\x21\xa8\xa4\x75\xec\xce\x21\x16\x6f\x56\xe8\x8b\x7f\xad\x66\x33\x52\x7d\x27\x21\xca\xc4\xf0\xc4\xd2\x90\xeb\x38\xe1\x59\xfd\x28\x9c\xfb\x34\x5d\x98\x4e\x5c\xe8\x3d\x64\xb1\xe8\xc6\x5e\xae\xf9\x64\xeb\x04\x39\x82\x5e\xa6\xf8\x24\x6b\x01\xfc\x69\x7f\x49\x6d\x2f\xb9\xef\x63\xd5\x88\x2e\x0b\x1b\xe2\xc5\x70\x26\x1d\xbf\xec\xa1\x6e\x6e\x2a\xfd\xfd\x76\xd6\xd8\xa1\x05\xe4\x7b\x3d\x20\x7a\x7e\xb6\x19\x7b\x86\x90\x1d\xb1\x2f\x24\xe9\x96\x04\x80\x9d\xbf\xab\xdb\xa9\xe6\x1e\xb3\xe4\x92\x14\x85\xbb\x65\x7e\x28\x86\x02\x2d\xc7\xf6\x99\x90\x79\xab\x10\x9b\x7f\xe2\xcf\xc4\x19\x4c\x28\x27\x05\xf9\x62\xca\x95", 169, { 0xc4, 0xf0, 0x9b, 0x16, 0xea, 0x1a, 0x1a, 0x5a, 0x54, 0x70, 0x0c, 0xa8, 0xb4, 0xe3, 0x92, 0xd2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x73\x61\xfa\x6c\xe8\xf3\xd4\xd4\x7f\xb9\xe0\xbf\xcb\xb0\xd7\x59\x5d\x5b\x85\x46\x73\x8f\xc9\x7d\xcf\xda\xba\xc0\xa3\x91\xe4\xb7\xa8\x75\xb0\xa8\x4e\x01\xe1\xd6\x0e\x53\x3b\x73\xdb\xb4\x3e\x42\xb6\xc6\x10\xce\x61\x49\x78\x40\x2b\x8a\x06\xe1\xea\x68\x51\x2d\x07\x04\x59\x90\xb3\x04\x0a\xc0\x38\x84\xe2\xb6\x6a\x9b\xa9\x4a\x3c\x85\x5f\x6a\x6f\x72\x34\xf6\x64\xea\xb1\x3b\x13\xdb\xf4\x0b\x14\x41\x18\x75\xdb\x70\xb3\x27\x01\x01\x79\x5c\xbd\x57\xfd\x83\x71\xcc\x98\x6e\x61\x7d\x62\x33\x7e\xaf\x5d\xa3\x60\xdd\xb2\x64\x53\x5f\x13\xae\x88\xb8\x3f\x9e\x6d\x7c\xa4\x3a\x17\xdc\x1e\x02\xda\xd0\xde\x2f\xfb\xe0\x66\x8b\x7d\x8e\xb0\xec\x17\x63\x6e\x4e\x47\x95\x6d\x8c\x80\x51\x13\xbb\x7f\xab", 170, { 0x69, 0x9d, 0x5b, 0x85, 0x72, 0xec, 0xe6, 0xbf, 0x17, 0x47, 0xff, 0x53, 0xb3, 0xf0, 0xd5, 0x34 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x07\x23\xbc\x20\xef\xdb\xfb\xc4\x54\x00\x01\x0c\xa3\x92\x64\x3a\x4d\xeb\x7c\x61\x0d\xdc\x76\x14\x49\x65\x87\xaf\x92\x11\x3c\x41\x46\xec\xf0\x15\x55\x22\x58\xdc\x20\x36\x38\x78\x7d\xdb\x38\x67\xd7\x72\xd1\xca\x73\x21\x62\x11\xcd\x8c\x5f\x45\x21\x33\xa8\xf2\x05\x68\xf8\xaf\x33\xeb\x74\x4c\x65\x24\x63\x96\x59\xfc\xfd\xc9\xf4\x58\x5c\x93\x83\x32\x8f\xc1\x1c\x56\xce\x88\x23\xb7\xc7\x72\xe8\x6c\x17\xe4\x6e\x4a\xd4\x48\x47\x1e\x47\xdb\x9a\x87\xb7\x14\x47\x6e\x60\xb0\x21\x24\x83\x57\x5a\x16\x97\xec\xfd\x2f\x9d\x76\x94\xca\x91\xa6\xe9\x53\xfc\x04\xea\x79\xa6\xba\xa5\x11\x69\xfd\x73\x8a\x21\x14\x32\x09\xc0\x06\xab\x21\x7e\xe4\x12\x30\x2d\xb0\xab\x59\xaa\xe9\x89\x19\x70\xb4\x71\x88\x46", 171, { 0x24, 0x02, 0xdb, 0x04, 0xc8, 0xa1, 0xc2, 0x6a, 0xaa, 0x95, 0x63, 0x35, 0x92, 0x4e, 0x35, 0x1b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa9\xde\x2f\x19\x37\x1e\x80\xe4\xb4\x9a\xf6\xcb\x04\x33\xca\x48\xe5\xc7\x4f\x7c\xd6\xd2\xea\xa7\xa2\x31\xb2\xb3\x8d\x02\xa0\xeb\x19\xa8\x73\xc9\x75\xeb\x23\xec\x83\x3c\xff\x28\x85\x15\x65\xb8\x63\x7f\x1e\x8e\x9b\xad\x54\xcb\xc5\xc6\x30\x4a\xc2\xc0\x14\x57\x81\x68\x72\x7e\x6d\x7e\x47\x7d\x77\xfc\x38\x5b\xbb\x77\x47\x92\xd1\x9f\x32\x67\xb3\xe1\x68\x5b\x46\x2b\xa8\xba\x87\xcf\x39\x50\x53\x81\xc0\x3b\xd2\x7b\xc1\xdc\x82\xc0\xb5\xe7\xdc\x7c\xc3\x9a\xa4\x8a\x1f\x0b\xd2\x10\xfc\x99\x18\x45\x2f\x84\x10\x53\x61\x99\x04\x58\xf1\x06\x59\x86\x64\x4c\x98\x69\x89\x51\x1a\x48\x2e\x95\x50\xa5\x78\x7d\xac\xe0\xe3\xcb\x30\xf8\xd7\x2f\x91\x70\xe3\xf6\x07\x50\x98\xe1\xb4\x42\x04\x11\xae\xdd\xca\x1d", 172, { 0x95, 0x82, 0xd6, 0xd6, 0x0d, 0x72, 0x51, 0x58, 0xba, 0xbc, 0x56, 0xa9, 0xf6, 0x07, 0x54, 0xa6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xab\x00\xdb\x46\x48\x54\xd3\xc2\xf6\xf3\xf2\x34\x82\x27\xb5\x3d\x3f\x4a\x10\x2c\xd1\xcd\x4b\xd1\x99\x55\x76\x6f\xb8\x00\x8a\xcf\xc2\xc6\x1e\x71\x01\xfa\xc3\xde\x63\xee\xfc\x19\x01\xb6\xdd\x34\x4c\x06\x3f\xfe\xd6\x35\x9d\xda\xba\x62\x8e\xab\xaa\xb5\xdf\xeb\x93\xbf\x4c\xdb\xef\xfb\xdb\xd4\xa6\x76\xd6\xbd\xa2\x8a\x63\x96\xee\xc6\xc1\x30\x89\xea\x21\xff\xcd\x0d\x1f\x08\x77\xe1\xdb\xf4\x52\x0f\xb8\x47\x85\xbc\xb1\xaa\x75\x2d\x53\x64\x58\x87\x5b\xe7\x58\xaf\xec\x87\x5f\x50\x6c\x45\x85\xfb\xfd\xca\x14\x68\x93\x6f\x34\xda\xb7\x79\x38\xa1\xd7\x62\x83\xb9\x47\x52\x18\x90\xd8\xad\xbe\xe5\x13\xc5\xcc\xcc\x13\xb0\x96\xce\xfc\x35\x74\x2d\x1c\xe0\x6c\x44\x9c\x35\x7b\x0d\xe2\x01\x85\xbd\x87\xcc\xd6", 173, { 0xd7, 0x83, 0x37, 0xf7, 0xb8, 0xcb, 0x87, 0x54, 0xc4, 0x01, 0x9d, 0xcf, 0x3b, 0x57, 0xf5, 0x8b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8a\xf0\x6a\x54\x8c\x8b\xb1\x44\xc1\xa8\x44\xb5\x2b\xf1\x8e\x8c\x14\x88\xcb\x2d\x72\xbb\x40\xc3\x65\x66\x8b\x2d\xdc\xe6\x15\x86\x58\xb5\xa3\x4e\xc9\xa7\x0c\x3a\x94\xc0\x05\x94\xb6\xb0\x18\x50\x02\xec\xb3\xad\x86\x69\x5d\x84\x0c\xf7\x03\x31\xbc\x39\x71\x1b\xdf\x3d\xdc\xe1\xbe\xbc\x9b\x22\xa8\xef\xf6\xe9\x13\x0b\x17\xb4\xda\x5b\x1e\x1f\xa5\xf9\x50\x32\x67\x29\x6f\x44\x00\x52\x24\x89\x02\x9a\x99\x3f\x90\x1d\x23\x72\x62\xc9\x1d\x67\xe6\xd9\xd0\xab\x81\xeb\x8e\xb8\xf3\xc0\xde\x40\xd9\x90\xd1\x19\x4b\x08\x73\xc6\xa5\xe1\x5d\x9e\x64\x1e\x68\x9c\x26\xe2\x7c\xc2\xd3\xeb\x86\x2a\xdb\xaf\x87\xaa\x95\x11\xc9\x23\xc7\xc0\x2e\x66\x43\x2d\xa1\xc4\xae\x26\xad\x31\x5c\x14\x2c\x14\x57\xcd\x17\xae\x7f\x17", 174, { 0x8b, 0xaa, 0x35, 0x9d, 0xe0, 0x56, 0x8f, 0x69, 0xc8, 0x17, 0x5c, 0x10, 0x2d, 0x43, 0x12, 0xe3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7d\x24\xcb\xba\x8f\x2a\xad\x41\xd8\x4e\x94\x4d\x89\xdf\x8b\x95\xf2\x78\xff\x7d\x0d\x2c\x9d\x52\x35\x4f\x5a\x20\xf4\xdf\x8c\x30\xf9\x8e\x35\x22\x28\x6d\x61\xa3\xcc\x36\xa5\xca\xe8\x36\xc7\x14\xab\xd5\x7c\xfa\x01\xc4\x4c\x2d\x46\xc1\x92\x6e\x15\x0a\x9f\x0b\x3f\x5c\xff\xf9\xd8\xa6\xd3\x8b\x6b\x4f\x5d\xcd\x4d\x21\x9b\x7f\x0f\xd0\x0a\xb1\x0d\x2b\x8b\xf8\x23\xde\x63\x4a\x7f\xe1\x5d\x7b\x92\x81\x0a\x55\x21\x09\x29\x4d\x78\x0d\x21\xe8\xbd\x52\xaa\xaa\x62\x5d\x8c\xb6\xb4\x97\x80\x07\x91\x19\x33\x49\x36\x1a\x68\x55\x36\xf2\x3c\x48\x87\xca\x85\x3f\xb7\xe3\x54\xb0\x3c\x7f\x9a\x68\xe8\x6f\xe7\x1d\x7b\x3a\x4d\xaf\x53\xe7\x63\x00\x3e\x68\x66\x6c\x70\xa3\x79\xe7\x90\x1e\x0d\xb2\xec\x45\x5b\xba\xcd\x5b\x0e", 175, { 0x1e, 0x96, 0xa5, 0x23, 0xc0, 0x9c, 0x30, 0x9c, 0x2a, 0x99, 0x58, 0x95, 0xf2, 0x54, 0x8e, 0xed }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8d\xe6\xfb\xff\xf9\xe6\x4a\x18\x43\x2d\xbc\x59\x01\x9a\x7f\xf9\x95\x83\x87\xa4\x46\xbe\x37\xe3\xfc\xdc\xa9\x9a\x98\x76\x9a\xaa\xee\x9f\xf5\xb7\x60\x79\xfa\x04\x18\xe3\x0b\x79\xe1\x50\x13\xc7\xa2\xb3\x93\xa2\x79\x96\x4b\x2d\x70\x4a\x81\x74\xdf\x39\xf1\x12\x5e\x57\x51\xf3\x64\xb7\x7f\x34\x81\x3a\x49\x27\x34\x62\xd9\x72\x6a\x44\xbb\x56\x94\x9c\x8c\x0e\x63\xfb\x42\x4e\x23\x1b\x12\xea\xb1\x53\x02\x98\x1a\x25\x0b\xce\xd2\xf5\xea\xc5\x8e\xd5\x83\xa0\xbe\x7b\xf2\xa5\xaa\x54\x30\xa9\x28\xb1\x5f\x8b\xf8\x1f\xb3\xd6\xbc\xd6\xfc\x8a\x96\x47\xd3\xf5\x60\xd8\x61\xba\x83\xac\xc7\xf3\x74\x9b\x2d\x73\xd1\x41\x6b\x24\x14\x32\x4d\x8f\xf1\x4b\x86\x7b\x52\x24\x35\xac\xed\xa1\x0c\xcc\x7e\xa8\x23\x68\xa6\xed\x58\x11", 176, { 0xbe, 0xf1, 0xe8, 0x50, 0x33, 0xbf, 0xf7, 0xbe, 0x13, 0x51, 0x2e, 0x59, 0x3c, 0x64, 0x15, 0xd8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x60\xe8\x60\xa3\x1c\xe8\x6f\xa2\x7a\x41\x80\xbf\xa4\xa1\x41\x7b\x48\x81\x9e\xe3\x31\xb7\xe9\x79\x81\x27\xa3\x33\x8d\x9a\xea\x9c\x55\xa7\x7e\x19\x9e\xcd\x71\x47\xae\xa3\x6b\x7f\xa3\x26\x97\x7b\x71\x32\x2e\x12\x76\x0c\x9e\x1f\xbc\x1c\x56\x80\xca\xb8\x31\x3a\x27\x1b\x7c\xba\x6c\x74\xa6\x36\x05\x1b\x83\x32\x84\xde\x3d\x1f\xa1\x7a\xd7\x1e\xd2\x25\x5f\xe2\x83\x48\xb0\xb3\xf3\x4a\xe1\x8e\xab\x88\x4e\x69\x9b\x60\x41\x95\xd2\x6d\x3c\x3d\xd9\xcd\xe5\x0b\xad\x9d\x8e\xea\x58\x86\x60\xe6\x2b\x71\x25\x2f\x9a\x56\xaf\x3c\xb4\x32\xe7\x0b\x3d\x17\x75\x87\x69\x5d\x09\x03\x38\xf6\x45\xe3\x69\xdf\x47\x5b\x1c\xb3\xd6\x4e\x07\x5a\x28\x58\x54\xde\x4d\xe7\x16\x5e\x3c\x84\x67\x1b\x78\x30\x1f\xaf\x5f\xe9\x33\x5e\x0f\x4c\xa7", 177, { 0x21, 0xa8, 0xb9, 0x73, 0x01, 0x98, 0x8c, 0x9f, 0x67, 0xfb, 0xb8, 0xdb, 0xc4, 0xde, 0x97, 0x6a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x85\xf5\x54\x31\x2f\xf4\x40\x6c\xc7\x2e\x93\xb5\xe7\x71\x35\xa6\x4f\x41\xb7\x2d\xf1\x7e\xb4\x48\x28\xb2\x53\x5f\x09\xf9\xe8\x3d\xd2\x8d\xba\xad\x80\xed\xdf\xad\x7c\xaa\x44\x51\x75\xce\xc9\x37\x49\xe9\x89\xa3\x1c\xb9\x37\x37\x8c\x75\xa3\x50\xfb\xb6\x5c\xff\x0b\x03\x70\xa2\x28\xf7\x4f\x1f\x3e\x11\xce\xbc\x8c\x18\x47\x9e\x90\x29\xdd\xdd\x22\x5f\xdd\x40\x9d\x1d\x40\x9a\x37\xfa\x4d\xc0\x72\x4a\x5b\x25\xab\x45\xb4\x15\xd0\xd7\x96\x8a\x2f\x03\x53\xae\x69\xf4\x98\xee\x85\xa2\xca\xb7\x21\x1d\x8c\xd0\xc3\x7a\x5d\x54\x4d\x57\x5f\x4a\x8f\x0c\x32\xe3\xf7\x6f\xff\x4f\x63\x44\x91\x3c\x17\x40\x9d\xec\xca\xb8\x22\xf1\xdb\xeb\xeb\x88\xa1\xe8\x32\x90\xdf\x1d\x5f\x25\x57\x7e\xed\xde\x75\x4e\x6e\x9f\x2c\x8d\xa5\x1b\xde\xff", 178, { 0x51, 0x6b, 0x97, 0x49, 0x9d, 0x54, 0x92, 0x2b, 0x34, 0xc3, 0x79, 0x77, 0x7f, 0x03, 0x8d, 0x1a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd1\xe9\x75\xd4\x09\x42\x8f\xf9\xc2\x55\xd6\xfa\x6e\x47\x6d\x92\x3f\xca\x86\xd1\x09\x59\x10\xe8\x46\x0d\x8e\x94\x33\x1f\x03\x25\x17\xfb\x09\x2a\xa3\xfd\x02\xbb\x75\xca\x65\x63\xb7\x4e\x3a\xa7\xe4\x4d\xa1\x37\xab\xa8\x8b\xb1\xec\x2f\x8c\x0c\xdf\x1d\xc9\xa7\x54\x34\x0c\xee\x14\x76\xf6\xa6\x67\x7d\x54\xd7\xaf\x77\x8a\x53\x32\xc2\x2b\xe6\xf5\x20\xab\x1c\xc3\x97\x2c\xa9\x4d\xe8\x74\x79\x6b\xa9\x00\x55\x81\x01\x32\x2e\xfc\x00\xa5\x0a\xfc\x99\xa1\x88\x0c\x3d\xaa\x11\x0c\x14\x33\x9d\x30\xda\x70\x1f\x21\x55\x49\x8f\x41\x6e\x6a\x92\x0c\xf3\x77\xc7\x9a\xe8\x5d\xb0\x40\x86\xc4\x3b\x56\xd1\xa0\xec\x14\xd9\xe7\xaa\x96\x8d\x5d\x23\xff\x36\x8a\xdc\xb9\x98\xce\xd8\xda\xa0\x8b\xe4\xa2\xc9\x80\x7d\x21\x12\x36\x5f\xf6\x94\x92", 179, { 0x6b, 0xc1, 0x3c, 0x44, 0x56, 0x28, 0x48, 0xa5, 0xc9, 0x18, 0x9c, 0x37, 0xa8, 0x8e, 0xce, 0xf2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xac\x31\xc2\x8b\xb5\x5a\x42\xf6\x67\x8b\x62\x7d\x55\xb8\x38\xaf\x5d\x0f\x5b\x31\xfa\x7a\x38\x11\x26\x42\x11\x3b\xea\xcd\x98\x04\x83\x88\x24\xe4\x32\xe0\x8e\x41\xa1\x69\xab\x66\xed\x22\x65\x92\x54\xd0\x78\x2d\x7c\x86\xc6\x16\x5e\x46\x58\x17\xcd\xc2\xf2\x7a\xa7\x3b\x52\xb5\x97\x8b\x05\x40\x84\x3d\xe5\x87\x99\xda\x32\xfb\xf2\x3f\x4c\x43\xe0\x29\x0a\x91\xd9\xd3\xbb\x0f\xff\xb6\xb7\x77\x4b\x6f\xa0\xc2\x56\xbf\x3a\xf8\xc4\xac\xe4\x26\x4d\xc4\xb3\x6e\x69\x81\x2a\x38\x97\xc8\x97\x87\x4b\x8c\x0c\x66\x72\x90\xf9\x80\xa3\x49\x63\xcf\xe3\xe1\xc3\x6d\x15\x58\x7d\x86\xfc\xc5\xfb\x6f\xee\xbb\x66\xcf\x18\xc6\x01\xfb\x68\x15\x22\x60\x1b\x31\xcd\x19\xe3\xeb\xee\xa1\xb4\x55\x33\xa2\x2b\xe6\x84\xec\x9b\xc1\x20\x81\xb6\x0f\x55\xcd", 180, { 0x38, 0xf4, 0xa7, 0xc3, 0x5e, 0x5a, 0xf4, 0x32, 0xf2, 0x12, 0x4c, 0xf5, 0x99, 0xb6, 0x90, 0xe8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd5\x88\xdb\xf3\xe4\x11\xce\x42\xed\x80\x47\xc6\x3f\x7b\x96\xfb\x3b\x7e\x1d\x9d\xba\xfb\xcc\x9b\x1e\x9b\x34\x29\xf4\xa3\x4a\xf4\x43\x72\xbb\x71\x74\x26\xe6\x4f\xdd\x5f\x7b\x0b\xec\x1b\xae\xa1\xec\xc0\x17\x60\x77\x39\x29\xd7\x79\x38\x4c\xeb\xdc\x99\x9a\x0a\xd5\xe7\x33\x7a\xca\xf7\x3e\xcb\xdf\xb2\x7c\x6b\x1c\xf1\x8a\x58\x3c\x81\xb3\xf0\x15\x45\x6f\xe4\x9f\x7b\x7d\x4b\xa2\x17\x98\xd3\x00\x4b\xd9\x12\x9c\x28\xa8\xfa\xe6\x5e\x60\x6b\x05\x1f\x7f\xe3\x9f\x22\x86\x50\x48\xc4\x73\x06\x84\x48\xd9\xcc\x7b\x3f\x99\x11\x38\x03\x3f\x3c\x9d\x5d\xfb\x21\xe7\x47\x3a\x8f\xda\xcb\xe0\x06\x89\x0a\x24\x86\xc4\x58\x09\x82\x1e\x85\x75\xf4\x99\x37\xf0\x8a\xf0\x72\xfa\xfe\x81\x3a\x08\x83\xd6\x50\x1d\x5b\xcf\x17\x02\x85\x6d\x9a\x22\x94\x3d", 181, { 0x0a, 0x5b, 0x96, 0x06, 0x98, 0x96, 0x99, 0xa6, 0xdc, 0x6a, 0xa5, 0xbf, 0xc4, 0xfa, 0x83, 0x48 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa7\x04\x9b\x5f\x13\x65\x45\x32\x21\xf1\x01\x9e\xfe\x9e\x5a\xfd\x63\xa5\x64\xa6\x5d\x1e\x52\x18\x29\x38\x25\xc0\x39\x12\x7f\x67\x53\x38\x96\x3b\xd9\xbd\x44\x78\x23\xf1\x3a\xb3\x08\xbf\x55\xc3\x7c\xa6\x09\x4c\x53\x52\xf9\xe9\x24\xd6\xa9\xf6\x48\x88\x4b\xf7\x02\x7a\xb5\xa8\xb9\x90\x74\xa1\x60\x43\xfa\xa6\xf6\xf1\xf2\x89\x29\xde\xb5\xbc\x16\xcb\xd4\x77\x2b\x31\xd5\x82\x2e\x1a\xfc\xa0\x56\x9d\x3e\x98\x97\xf4\x5b\xe1\xfb\x3b\x04\xe9\x2c\xc7\x37\x02\x0e\x21\xac\xe9\x89\x9e\x67\xf5\x64\x9c\x6e\xd9\x4d\x5b\x95\x15\xf5\x75\x75\xff\x58\xfb\x7b\x6a\x1a\x2e\x1c\xf0\x0d\xd7\x26\xe2\xcf\x44\x32\xc8\x91\xdf\x36\x96\xf2\x6c\x37\x6e\x09\xde\x1b\x0c\x82\xd7\x9c\xd3\xdf\xbb\x59\x71\xe0\x70\x07\x31\xfe\xb4\xc4\xdd\x10\x1a\x8c\x4d\x11\xa2", 182, { 0x34, 0xf3, 0xea, 0x31, 0xf3, 0x44, 0x99, 0x87, 0x3c, 0x5f, 0x60, 0xbc, 0xe5, 0xb0, 0x5a, 0xdd }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc4\x90\xf9\xf4\xf4\xb6\xc7\x39\x92\x39\xa0\x96\xf9\x06\x11\x46\x79\x2b\x71\x53\x87\x1e\x62\xf1\x15\xa7\x76\x77\xfd\x6b\xed\xfb\x96\x17\x9d\x88\x69\x25\xeb\xfe\xfe\x4e\xf5\x87\xcf\x8c\xd2\xb2\x5e\xcb\xf1\x2d\x62\x2b\x9e\x23\x1d\xf4\xa3\x30\xc9\x17\x0b\xfd\x30\x5d\x01\x7d\x5b\x2f\xd8\xc3\x62\x00\x24\x7d\x62\x5b\x05\x11\x8d\x84\x84\x52\x5c\xce\x15\xdf\xdf\x79\x3c\x18\x34\x45\x4d\xbe\x16\x97\x4b\x26\x8d\x47\xf2\x1a\xc3\x04\xd1\x4d\xf7\x65\x8e\x78\x8b\x8c\x4d\x15\x37\x79\x2c\xb7\x60\xe9\xe5\x04\x83\xe8\x97\x51\xcb\xfa\x9e\xd8\xc3\xe2\x9e\x98\x26\x0d\x9f\xc9\xd1\x9e\x52\xfb\xd9\x17\x72\xca\xb9\xa0\x46\x40\xa4\xf7\x43\xc7\xf9\xf5\xce\xc9\xd5\xb9\x1e\xe6\xc2\x73\x40\xd1\x8c\xcf\x34\xc8\x34\xfb\x35\xae\xfe\x57\x16\xc6\xa5\xb9\xc8", 183, { 0xe0, 0x50, 0xf4, 0x13, 0x5b, 0x9f, 0x3d, 0x6c, 0xf8, 0xc9, 0x95, 0x5e, 0x68, 0x81, 0xb2, 0x0a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0e\xaf\x59\xf8\x36\xdb\x60\xd5\x3b\xb6\x08\xef\xa5\x4c\x6f\x3b\x59\xfc\xfe\x33\x1b\x65\x70\x1a\xa4\x7c\x82\x5d\x5c\xc0\x36\x15\xb5\x84\xc3\xaa\x24\x6b\x1c\x91\xbc\xf3\x1b\x35\x68\x28\x4a\xf4\xc4\x78\x4e\x40\x99\xa7\xf1\xe6\xf3\xd9\xca\x6b\xe1\xcc\x8b\x92\xc9\x29\xe7\xfb\x65\xef\x1e\xe5\x5e\x0f\x26\x14\x83\x17\x77\xce\xa6\x06\x74\xff\x13\x3e\x71\x7c\xae\x97\x65\x64\xa8\x8f\x2d\xa3\xdd\xa0\x7a\x90\xce\xaa\x59\xb6\x36\x90\x5d\xb0\x4b\xdf\x6b\x2e\x92\xa8\x22\x14\x5f\x6e\xe5\xc1\xe8\x3b\x86\x6d\x05\xcd\x90\xab\x87\xee\x31\x0e\x32\xe1\xc2\xe8\x58\xf8\xf5\x2d\x13\x43\x9a\x77\x1e\x62\x0e\x23\x50\x7c\x40\x98\xb7\x48\x61\xa8\x4d\x48\x28\x0e\x59\x16\xbf\x17\x65\xd7\x4d\x5e\xd8\xcc\x21\xb0\x2f\x07\x78\x0e\xdc\x3a\xeb\xd0\xbb\xab\x78\xe6", 184, { 0xf1, 0x8e, 0x78, 0x9a, 0x46, 0xe0, 0x68, 0x70, 0x90, 0x49, 0x85, 0x8e, 0x6b, 0x49, 0x0b, 0x61 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2d\x43\x2a\x3a\xd3\xc6\x68\x31\xe9\x1e\xd8\x51\x3c\xd0\xee\xfd\xc9\x90\x15\x5b\xf4\xef\x78\x56\x62\x32\x6d\xbf\x73\x3f\x7e\x8e\x5f\xb1\x16\x47\xec\x0a\xc5\x78\xc9\x08\x30\x5e\x8b\x10\x98\xa8\x41\xc7\x05\x53\xb5\xc0\x0e\xb4\x42\x4f\x48\x94\x4d\x7c\x49\x75\x61\x13\x58\xf3\xeb\xd9\xb2\x46\x8e\xd9\x7b\xe4\x24\xdc\x40\x43\x53\xf6\x25\xbc\xc7\x3d\xb0\x8b\x11\x95\x30\xf3\x1c\xa7\xcb\x7f\x47\xf0\x23\x62\x24\xf5\xa5\x00\xcd\x95\x6e\x86\xde\x77\xd9\xb3\x12\xa1\xa9\xba\x7d\x2a\xd0\x40\x63\x08\xda\x80\xb4\x03\xf9\x8e\x25\xcb\xad\xb9\xec\x24\x10\x09\x18\x3f\xbb\xe7\x8a\x25\x58\xdc\x94\x4c\xc6\x72\x2c\x4c\xe2\x37\xcc\xab\xf8\xdf\xea\xd4\xc6\x89\x0f\x27\x29\x1a\x97\x2a\x67\xc6\x04\xdc\x18\xad\xfe\x2a\xb1\xa1\xeb\x7b\xae\x06\x27\x66\x5c\xd3\xe0", 185, { 0x75, 0x72, 0xbf, 0x88, 0x25, 0xbe, 0x77, 0x6b, 0x6f, 0x97, 0x84, 0xf0, 0x11, 0xa5, 0xc8, 0x22 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x83\x40\xb5\x91\x5f\x27\x52\x19\x89\xcc\xaa\x77\xc9\x1f\x9a\x25\x71\x38\x7b\x0d\xcb\xd8\xe7\x2c\xb1\x97\x9b\xc2\x3c\xb0\x78\x33\x94\x65\xa4\x7e\xe7\x10\xcd\x57\x75\xc8\x8e\xe2\xc7\xac\xea\x0e\xff\xcf\xf5\x8c\x4b\xc0\x91\x6b\x74\xb4\x56\x52\x93\x52\x8b\x59\xe2\x1b\x51\x84\xb0\x75\xe0\xdc\x6e\x52\xe8\x2c\xe7\x81\x19\x55\x8d\x91\xbe\x4e\xee\x5e\x84\xbc\x46\x39\x59\x2a\x2d\xb8\x70\xe5\x71\x17\x60\x77\xfe\x49\x6c\xbe\xfa\x9f\xde\xa8\xed\x14\x8c\x8d\x1e\x32\x7c\x28\xf9\xa5\xa4\x33\xab\x5b\xca\x9f\xd0\x54\x8a\x6d\x44\x0b\x76\x2c\x16\x81\x57\x0f\x9b\xe2\x92\xaa\x9e\xd6\xa6\x49\xb5\x67\xd2\xed\xaf\x8a\xd3\xe4\x29\x4c\xcb\x04\x40\x9a\x3e\x83\x60\xad\x35\x76\x3b\x10\x85\xe4\xd6\x4f\x2a\x87\xbd\x3e\xcc\x1e\x57\xe3\x64\x71\x54\x01\xf8\xe3\x42\x42", 186, { 0xbb, 0x9a, 0xed, 0xe2, 0x33, 0x52, 0xb1, 0x0f, 0xad, 0xa6, 0x08, 0x76, 0x99, 0x43, 0xe4, 0x6e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x82\xad\x3f\x00\xef\xbd\xc9\xaf\x43\x2a\xb1\xeb\xd9\x52\x2f\x1a\xc8\x92\x0e\xbe\x62\xa1\x08\x5a\xd6\x89\x2c\xfd\xf5\x43\x7b\x6f\x11\xef\x93\xf7\x01\xad\x83\xc7\x42\x1b\xbd\x06\x38\x6b\x29\x78\x92\x1f\x56\xcb\xcb\x64\xcb\x80\xcc\x09\x7c\x73\xae\x1a\x58\x09\x9e\x1d\xff\xf6\xda\xe8\x91\xa8\xd7\x1d\xa2\x54\x85\x44\x49\x9b\xaa\x83\x58\xd8\x6b\xfc\xa6\x09\xea\xc3\x87\x57\x08\x7a\x5d\x43\x4b\x8c\x48\x6f\xdb\x02\xf8\x07\xa7\x05\xa4\xca\xa5\xf1\x13\xb9\x36\x11\xd8\x5a\xa7\xfd\x9b\xa9\xd4\x8d\x91\x9c\xe7\x79\x0d\x52\x3e\x8f\x30\xd7\x6b\x8f\xbd\x96\x54\xa6\x07\x5c\x7b\x85\x0b\x04\x59\x1e\x9a\xc5\xe3\xfb\xaf\x14\x2e\x3b\xdf\x37\x2e\x29\xee\x68\x9a\x7a\x7d\xa2\xec\x23\xe1\x0b\x84\xd5\x10\xfd\xec\x16\xb5\xb2\x36\xfd\x63\x8c\x82\x8a\xe5\xff\x9c\x9f\xb4", 187, { 0xf7, 0xcb, 0x61, 0x06, 0xde, 0xbd, 0x8d, 0xcb, 0xa7, 0x96, 0x12, 0x6e, 0x8e, 0x63, 0x04, 0x6a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1c\xc2\x9f\x82\xba\x82\xa2\xf3\x43\xc2\x52\x6b\x18\xda\x65\x02\xa2\xdb\xb7\x94\xf6\xf3\x03\xf6\x24\xe8\x3e\x43\x1d\xc2\x90\x54\x3e\x86\xef\x4d\x7d\x1c\x5a\x54\x2f\x52\xb0\x5d\x73\xf9\x2a\x21\x3f\x2d\x7b\x2d\x05\xb3\x83\x17\x01\x7b\xaa\xcb\x22\x44\xdf\x03\x92\x5e\x2d\xd5\xe4\x8b\xf7\x66\xd9\xff\xd0\xbc\xcf\x87\xf9\xb2\xc7\xc6\x78\x04\x11\x99\xd1\x8a\x96\x9c\x64\x82\xc2\xc6\x62\x06\x0c\x30\x6d\x9c\x23\xf3\xcc\xec\xb6\x2e\x48\x8c\xe0\x27\xa6\xf8\x2f\x89\xc0\x9d\x50\xcb\x42\x14\x58\xb1\xfe\x6c\xb1\xec\xed\xa0\x9f\xdd\xc3\x27\x6e\x78\x2d\xab\x3a\x43\xaa\xd1\x5b\x7c\x03\x37\x6b\x5a\x68\x7c\xf4\x6c\x29\x78\xbb\x1e\x0e\x8c\xa3\x5b\x53\x15\x40\x4c\x43\xfa\xf9\x3d\x6f\x65\xd9\xa1\x8b\x8f\xf2\x2c\xe6\xb3\x6e\x1e\x85\x24\x33\xa0\xdb\x7a\x32\x46\x26\xe8", 188, { 0x32, 0x70, 0x9f, 0xcf, 0xca, 0x08, 0x40, 0x64, 0x9c, 0x92, 0xf1, 0x9d, 0xf0, 0x45, 0xa3, 0xf3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4d\xb5\x68\xa9\xe3\x5e\x00\x99\xf9\x68\xe5\xe0\x06\xac\x80\xc9\x5b\xda\x23\xb1\x2d\xb9\x29\x1a\x40\x8b\xaa\xdf\x32\x8e\xdb\x82\x62\x9f\x01\xa1\x7b\xfa\x10\x88\xa1\x1c\xe4\xdf\x36\xc9\x1b\x84\x49\x2a\x8d\x74\x9b\x0e\x69\xe2\x50\x51\xed\x6a\x2f\x5a\xc1\x5f\x96\xbd\xf1\x40\xfd\x02\x85\x4a\x24\x7d\xbf\x27\xdc\x5c\xf1\xc4\x6f\xbf\xf8\x40\xae\x01\x59\x00\x95\x16\xf6\xdf\x9c\x0d\x6c\x83\x9d\xb4\x0c\xcb\x5c\x5a\x75\x64\xb8\xaf\xcb\x7b\x6d\xc8\x96\x8c\x84\x3f\x39\x59\x58\x78\x0c\xf7\x45\xfe\x19\x02\xee\x0b\x70\xf1\x2b\x26\x27\x84\x8e\xe7\xf2\x5a\x90\xd6\x5b\x9f\x5d\x72\x9e\xe2\x39\x4d\x23\x04\x8d\x54\x98\x4c\x92\x2d\xaa\x98\x99\xb9\x61\xaf\xf4\xb9\x16\xb1\x85\x8c\x11\xaf\xe1\x16\xc3\x57\x1f\xbd\x9c\xc8\x43\x8d\x8a\x84\x42\x7b\x10\x83\xb2\xc7\xfe\x64\x10", 189, { 0xcd, 0x2f, 0x08, 0x67, 0xde, 0x29, 0xd6, 0xbf, 0xf2, 0x95, 0x3e, 0xe6, 0x88, 0x73, 0x70, 0x43 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7a\xd3\xbf\xad\x0f\xab\x95\x35\x2e\xe6\xe9\xdd\x93\x58\x68\x29\x0e\x26\x43\x57\xa3\x43\x1e\x6b\xd1\x87\x20\xd8\xf0\x69\x2b\xc8\xb3\x59\x25\x08\xce\xbd\x75\x93\xb1\x85\x8a\xba\x71\x6d\x95\xec\xc8\xcf\x57\x28\x33\x22\x14\xfc\x39\x13\xa7\x38\xcc\x3e\xaf\x34\xc8\x89\xe7\xbb\x98\x1d\x94\x93\xf8\x02\x17\xaa\xd5\x56\xa2\xdf\x50\x2a\x07\x69\xe1\xf9\xac\xe8\x98\xc6\x9b\x06\x7f\xd1\xb6\xca\x1c\xf5\x08\x79\x13\xa1\x36\x29\xe7\x71\x14\xe3\xe1\x68\x53\x74\x09\xcc\x59\xd0\x51\x9f\x29\x24\xd2\xb5\x81\x77\x2d\x77\x03\xfc\x14\x32\x8b\xf6\xe1\x1c\x9f\x48\x63\xe5\x04\x98\xba\xf6\x6d\x1f\x58\x4a\x4f\x11\x27\xe5\xd0\xa3\xc9\xf4\xdd\xbd\xfb\x83\x5a\x3e\x13\xd5\x75\xe6\xa8\x63\x14\xe5\x50\x74\x6c\xfd\x84\x55\xb3\x56\xa0\x36\xed\xde\x07\xa1\xe3\x5a\x64\x97\x33\x0e\x0b\x49", 190, { 0x41, 0x35, 0xb4, 0x71, 0x1c, 0xe2, 0x04, 0x6c, 0x09, 0x30, 0x9e, 0x23, 0xaa, 0x6f, 0x9c, 0xed }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x80\x05\x7d\x70\xc9\xfe\x0a\x49\xd8\xf3\x91\x31\xd1\x47\x63\xd8\xea\x8b\x46\x25\x39\xed\x95\xa6\xa8\x3d\x85\xb2\x06\x9d\x82\x1e\x38\xc5\xb8\x98\x8d\xf0\xad\xa3\x2f\x67\x0b\x2f\xb4\xa8\x7c\xd4\xd4\x33\xae\xab\x36\xf0\x76\xc9\x63\x40\x10\x59\xdc\x9e\x84\x55\x46\xf2\x25\xe1\xc3\x72\x34\x44\x5d\x35\xa1\x83\x9c\x56\xf1\x9c\x37\xc1\x3b\x5c\xe7\x9d\x4c\xdd\x56\x56\xea\xa0\x37\x45\x36\x43\x6f\xff\x2a\xdf\x70\x37\x42\x00\xa7\x51\x38\x42\x0b\x84\xe7\x84\xd6\xaa\x51\xcc\x51\xa7\xbc\xb7\xc7\x74\xf7\x9b\x9b\xc7\xba\x3b\x76\x61\x2b\x25\x98\xf3\x7d\xac\x50\xae\xb3\x7e\x87\x66\x83\xe1\x76\x61\x55\x8e\x78\xc2\x6a\x2a\xf9\x8d\x1a\x5d\x8e\x56\x36\x91\x1f\x8b\x8c\x49\x3f\x5a\x88\x1b\x9c\x40\xf7\x4c\x92\x30\xe7\x06\xda\x5c\xab\x38\x5f\xa2\xfb\x0a\x31\x96\x37\xfc\x92\x28\xcc", 191, { 0xb0, 0x0c, 0x4f, 0x1c, 0x01, 0xbc, 0x03, 0x95, 0xe7, 0x9b, 0x96, 0x28, 0xa3, 0x74, 0xc6, 0x15 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9a\x2e\xf2\xaf\xde\x68\x21\x07\x22\xd0\xfd\xe7\xc0\xb0\x16\x39\x48\xc6\x0d\xb6\x5d\x0b\xfc\x11\x2c\xb2\x83\x34\x8a\x2c\x70\xa1\xa9\x68\x0a\xfb\x77\x19\xfa\x9e\x94\x2f\xd7\x68\xed\x67\x4c\x9b\xfa\xfe\xe8\xdb\x90\x81\x82\x51\x63\xc0\x47\xf2\x1c\xe0\x62\xda\x13\x90\x46\xd2\xaa\x54\x9b\xf1\x45\xfd\xc3\x5e\xe9\x39\x07\x33\x70\x46\x63\x7d\x66\xc2\xea\x60\x84\x9f\xd7\x57\xc7\x32\x32\x9a\x2b\x6a\x1c\x98\x09\x1d\xb7\xa3\x0a\x7e\xb4\xac\xc7\xab\x7a\x23\xff\x63\xf0\x00\x74\xd5\xe7\xe0\x62\x93\x27\x47\x9d\xa6\x14\x04\x46\xbb\xfd\xb2\x29\x7a\x02\x5a\xb6\xf7\x9f\x36\x9a\x41\xd9\x91\xfa\x18\x03\xca\x4c\xbd\x2d\x77\xd1\xe1\x2a\xa5\xb3\xbf\x3d\x3e\xb7\x45\x60\x84\x9e\x6d\x30\xb9\x1e\xab\x78\xe1\x78\x7f\x58\x9f\xb6\x2a\x11\x3c\x83\x7d\x70\xc7\xa6\xcc\xd5\x56\x1d\x02\xe0\x6a", 192, { 0xfd, 0xf1, 0x42, 0x20, 0xf2, 0xc8, 0x59, 0xfc, 0x92, 0xf4, 0x19, 0x99, 0x56, 0x5e, 0x8c, 0xc3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd2\xce\xb7\x71\xfc\xfc\xf5\x64\x15\xde\x32\x91\x73\xe8\x2b\x73\x86\x5c\x8e\xbd\xad\x1a\x65\x76\xb5\x99\x1c\x3d\xee\xf3\x30\xae\xec\x1a\x76\xdd\xd7\x28\x06\xff\x6f\xd5\xc2\x29\xa1\x02\x86\x30\xbe\x72\xee\xaf\x5e\x98\xbe\x26\xd0\x8a\xf2\x3f\x3c\x15\x63\x2d\x58\xeb\x13\x2d\xc3\xf8\x15\x2e\x01\xd3\x1c\x8d\x14\x4f\x9e\xf9\xb3\x30\xa4\x76\x2a\xfa\x31\x7d\xcd\xe5\x4c\x40\x1a\xee\xac\x0a\x6a\x07\x00\xc5\x54\x6f\xd8\x96\x9f\x1c\x33\xa3\xe1\x54\xa6\xf4\xb8\x5a\x25\x77\xa4\x46\x71\x1d\x80\xee\x1e\x23\x9b\x00\x40\x6b\x77\x32\xb2\x08\x1d\x90\x02\xd9\x1b\xf4\xfc\x4c\x1c\x94\xd1\x44\x22\xb5\xe4\x15\x62\x7e\x32\xac\xbc\xe7\x5b\xcc\xd5\xd0\x51\x73\xd3\x2e\x9c\x5b\xb4\x60\x47\x9c\x4b\xa0\x6b\x6e\xd9\x94\x55\x0d\x44\x04\x57\xb5\xf6\xa7\x28\xcd\x55\x16\xf8\x20\xda\xe2\x15\x46\xd0", 193, { 0x88, 0x74, 0xaf, 0x07, 0x77, 0x96, 0x60, 0x6a, 0xa4, 0xf8, 0xd3, 0xfe, 0x51, 0x45, 0xb1, 0x39 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc1\x33\x21\xab\xe3\x5b\x83\x03\x63\x73\xed\x2b\xd9\x66\x72\x72\x0c\xef\xbb\xf6\xc4\x07\x23\x20\xbe\xe9\x02\xbf\xb9\xbe\x08\xc4\xae\xeb\xbf\x98\x1c\xf3\x32\x16\x81\x09\xac\x28\xe5\x36\x99\x01\x8f\x23\x8a\xf4\xdb\x84\x54\xf0\x24\x21\x57\x99\xdb\x82\xdc\x03\xb9\x37\x98\x0d\x11\xc1\x4e\x58\x3e\x21\x90\xe3\x3c\xfa\xa5\x44\x53\x65\x86\x85\xee\x51\x03\x99\x8a\x95\x03\x7a\xca\x94\xe8\xe0\xa7\x8c\x11\x9f\xc4\x7b\x79\x9e\xdf\xae\x7c\x6f\x64\xe7\xba\x90\x1c\x2a\x14\x3d\x02\x24\xd4\xf0\x36\x39\xe9\x77\x0b\x29\x4f\xaf\x3b\x5d\x8d\xe2\x3a\xd4\x58\xbb\xa7\xa5\x55\xe2\xdf\x30\xfc\x38\xac\xe5\x98\xb0\x1b\xb0\x6b\xc8\x6b\x00\xee\xa3\x21\x73\x35\xc5\x39\x20\x71\x6a\x77\x80\x90\x83\xdb\xf9\xff\x4e\x32\x09\x8f\x91\xc9\x0b\x75\x72\x3d\xa9\x6b\xf6\x6e\xdf\xf5\x14\x92\xa7\xbe\x75\x65\x47", 194, { 0x4a, 0x49, 0xa4, 0xc0, 0x34, 0x27, 0x8d, 0x1e, 0x19, 0x41, 0x7c, 0x92, 0xdc, 0x85, 0x81, 0xc3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x21\xcb\x7e\x33\xc3\xcb\xbd\xa0\x5d\xc8\xe1\xa6\x97\xee\x36\x10\x10\x17\x6b\xc4\x7a\x4d\x82\xc9\xe3\xdd\xe0\xfa\x0e\x14\x84\x46\xff\x99\x54\xa1\x96\x66\x93\x8b\x53\x65\x70\x3b\x38\xa3\xb7\x68\xcc\x33\xaa\xb3\x3b\xa2\xeb\xb4\x9b\x12\x90\x9f\x49\xf5\x59\x93\x72\x68\xfd\x7f\xae\x29\xa0\xb1\xc6\x37\x62\xfc\x96\x05\x11\x86\x0e\x5a\xfe\x2c\x52\xc8\xed\x92\x01\xc6\x26\xca\x93\x6c\xa8\x9f\xdc\xcb\x7d\x80\xad\xe7\x29\x04\x9a\x53\x3c\x1e\xd5\x67\x07\xde\x39\x1f\x6b\xe1\x63\x93\xcd\x57\xfb\x0f\x25\xaf\x11\xce\x36\xe1\xa1\x58\xd8\x57\x39\x75\x71\x79\xb2\xcc\x82\xd4\x19\x1d\x5d\xe6\xb2\x18\xf5\x88\x12\xd8\xce\xf8\x6b\xff\x13\x82\xe5\x6e\xc6\xcb\x27\xa1\x11\xba\xf4\xa6\xbc\x04\xf2\xb8\xb8\x52\x87\x7c\xd8\x10\xdc\xd7\x9f\xd4\x03\x6a\x34\x69\x35\xab\x72\x78\x34\xa1\x1c\xd2\xcf\x3c\x2e", 195, { 0x9c, 0x25, 0x37, 0x70, 0xb4, 0xce, 0x2c, 0x7d, 0xff, 0xd2, 0xda, 0x7d, 0x85, 0x7e, 0x25, 0xe8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5c\x84\x4e\x4e\x98\x3f\x2a\x61\xcc\x41\xd8\x3a\xd1\x1c\xf1\x6e\x79\xda\x1d\x43\x9e\x3e\x27\xc7\xc3\x22\xba\xfc\x6a\xff\xbb\x31\xf2\x8b\x42\x6c\x29\x7d\x35\x03\x76\x6c\x83\x4a\x9c\xd5\xfb\x66\x2c\x3c\xc6\x40\x8a\x69\x87\x95\x99\xd3\x0e\x2b\x06\x1b\xb3\x1e\x2e\xaf\x55\x59\xad\x8f\xef\x20\x84\x2c\xd3\xc9\xe6\x6c\x87\x8b\x9f\xcb\x39\x6e\x22\x9b\xdf\x62\x2d\x6c\xef\x6c\x1b\x86\xb8\xfb\xc6\x93\x5c\x59\x16\x5a\x6a\x3d\x2b\xa6\x1c\x7d\x23\x45\x2a\xe0\x88\x2c\x48\x11\x59\xb8\x43\xb0\xb3\x0f\xb4\x83\x1c\xa5\x5e\xca\x6c\xda\x2a\xb0\x59\xc1\xbc\xdd\x9d\xfc\xb1\x28\xc6\xc3\x78\x6a\x9a\x03\xca\x6e\x24\xa3\xc7\x04\x5f\xe1\xae\x35\x7e\xdb\x39\x90\xd6\x2a\x93\xa3\x69\xa9\xf7\x86\x10\x53\xe6\x91\x44\x4a\x04\x2d\x89\xf4\x90\xc8\x77\x40\x7e\xe2\x66\x07\x33\x45\xb5\x8d\xdd\x51\xb7\x26\x6c\x75", 196, { 0xf4, 0x1a, 0xd3, 0x01, 0xe5, 0x69, 0x44, 0x94, 0x9b, 0x60, 0x1d, 0x3d, 0xbc, 0xc8, 0x4a, 0x94 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3b\xf5\x30\xba\xb7\xd0\x10\x79\x11\x3f\x64\x2d\x09\xa4\x70\x63\x45\x74\x7e\xce\xfa\xa3\x97\x77\x35\x1e\xdd\x11\xc4\x72\x88\x6a\xc3\x8a\x7b\xfe\xc6\x95\x82\xa6\xa0\x06\x2b\x6d\xce\xb5\x3e\x83\x83\x23\xda\x4b\x51\xda\x2d\x8f\x71\xf3\xcf\xd3\xaf\xb2\xbc\xc7\xf5\x4b\xec\xd6\x72\xc8\x91\xdb\x66\x02\xec\xf3\x8d\xcc\xcc\x6d\x25\x30\xa5\xde\x9e\xd1\x49\x52\xde\x6f\x45\x9d\x2d\x89\xdb\xcf\xc4\x1d\x97\xc5\xed\x8b\x90\xdc\xd6\x98\x3d\xc1\xf8\x8e\xf1\x64\x1f\x80\xf4\x0b\x15\xaa\x40\x83\xef\xf7\xd5\x71\xf3\x9d\xb9\xc6\x24\xe4\x90\x50\x6d\x04\xd3\x6e\x66\x2b\xb0\xdc\xc5\x9d\x7e\xac\x64\xf6\xdb\x56\xea\x8b\x65\xe6\x19\xef\x11\x53\xb4\x91\x2b\xf0\x0b\x82\xea\xfc\x24\x55\xaf\x54\x88\x20\xda\x48\xa7\x9e\x49\x8a\xe8\x76\x6f\x42\x51\x97\x0c\x3f\xd0\xba\x8e\x49\x24\x09\x04\x92\x6b\xde\xbb\x4a\x48", 197, { 0xe0, 0x17, 0x3a, 0x13, 0x7d, 0xcc, 0xf3, 0x56, 0x2a, 0xf8, 0x56, 0x04, 0xdb, 0xcf, 0x6b, 0x4a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa4\x77\x52\xb0\xda\x4f\x08\x52\x36\x26\x41\xa1\xe6\xc2\x55\x7f\xf1\x8a\x53\x87\xbc\xe0\x55\xf7\xa9\x19\xef\x39\xda\x15\xc1\x0c\x13\x80\x2c\x53\xbe\xa4\x21\x7a\x07\xe8\x15\x81\x27\xe8\x11\xa7\xbf\x32\xe5\xb3\x5a\x9b\x7c\xe1\x15\x3d\x4b\x68\x5b\x0e\xe4\xa4\xc8\x1d\xa7\xe5\x2f\x6b\x97\xd4\xb7\x63\x4a\x7c\x20\xf7\xfa\xfc\x23\x59\xba\xc8\xf8\x53\xc2\x97\xf1\x44\xeb\xed\x44\xb8\x36\x45\xe6\xa2\x86\xda\x92\x38\x6e\x12\xe8\x6b\x25\x88\xb3\x02\x96\xb4\x43\x52\x94\x39\xf9\x9c\x2b\xcc\xe1\x03\x12\xbc\x79\x28\x3c\x21\x90\x64\x8d\xa5\x4a\xa1\xaa\xea\x40\xd6\xe9\x97\xc4\x1d\x68\x02\x42\x72\x39\x7b\xc2\x0a\xbb\x33\x89\x4d\x04\xc8\xdf\x72\x7a\x6e\xec\xb6\x81\xbb\xbc\x39\x4e\x0f\x62\x75\xda\x9d\x38\x5b\xf3\x1b\x44\x0c\x6c\x02\xb6\x31\x75\x82\x8d\xf7\x05\x06\x5a\xaa\x73\x5f\x1d\xed\x25\x8f\x4b\x93", 198, { 0x1b, 0xae, 0x3b, 0x86, 0xbc, 0x4d, 0x77, 0x02, 0x5a, 0x90, 0x72, 0xf2, 0x23, 0x18, 0x3b, 0x53 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5f\x35\xf1\x1e\x3d\x90\xf2\xd2\xbc\x31\x6c\x74\xf2\x42\x39\xa4\x5e\x6c\x92\xd4\x5a\x6a\xcd\xe4\xad\x28\x47\x5c\x3d\x97\x5c\x45\xe1\x10\x93\xa4\x55\x62\xd7\x94\x46\x7a\xe0\xff\x8e\xae\xb1\xf9\x7a\xa6\x3a\xb9\x46\xe7\x1d\x34\xaa\xfd\x8d\x57\x8d\x45\x53\xe1\xd8\x54\xeb\xdc\x66\x07\xcb\xb6\x17\x28\xc3\x00\x04\xba\x7f\xc2\xcc\xe2\x2a\x78\x0d\x72\x2d\xae\xef\x12\x15\x33\xda\x0d\x93\xfd\x47\xb6\x9c\x99\xb4\x75\xb1\x4c\xb1\x71\x39\xcc\x18\xdb\x0a\x94\x5a\xd5\x06\xe8\xf3\xfe\xe2\x65\xff\x9c\x02\x44\xe7\x64\x80\x2b\x34\xe8\x4c\xaf\x84\x9e\x6d\x6b\x99\x88\x66\xb6\x8f\x85\xb3\x03\x26\x34\x73\xda\x3d\x81\x1f\x6f\x60\xcd\x78\xdc\x78\xbe\x7f\x00\xa1\xa0\x9e\xf3\x19\x76\xe4\x25\x53\xa2\x6e\x12\x2b\x2c\xe1\xa3\x35\xb2\x13\x25\x2e\xed\xc9\xde\x94\xdb\x9b\x51\x51\x8e\xf4\x10\x93\x91\x36\x39\xb7\xf2\xfa", 199, { 0xa3, 0xff, 0x9e, 0xb2, 0xc4, 0x17, 0xce, 0xca, 0xb4, 0xda, 0x08, 0x92, 0xb0, 0x6b, 0xf7, 0x47 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8e\x63\xf1\x75\x35\xb3\x43\xf6\x08\x8a\x03\x8b\x9a\x0b\x36\xc4\xc8\x20\xf9\x8f\xf7\x37\x4a\x42\xef\x0d\x6f\xb8\x53\xa2\x06\x92\xbc\x4c\xaa\x9f\x72\xe8\x3f\x56\xc6\x2b\xdb\x80\x0f\x16\x51\xf2\x3f\x88\x5b\x78\x21\xed\x63\xce\x31\x15\xee\xc8\x17\x1f\xa6\x91\xc2\x94\x02\x10\x1e\x90\x94\x66\x71\x1a\xef\x94\x57\x95\x32\x3a\x58\x50\x36\x7a\x23\x38\x50\xfb\x6a\xad\xc3\x09\x59\x71\xc5\xda\xb3\xbd\x2c\xec\x8c\x6e\xb5\x89\x9d\x5c\xf1\x6c\x47\xcb\xcd\x7e\x27\xfb\xbc\xb9\x52\xda\x83\x2e\x2d\xda\xa0\x21\xec\xdd\x58\x52\xa5\x4b\x5c\x57\x10\x46\x17\x24\xdd\xf5\x97\xad\xb2\xfd\x15\xa2\xc0\x0e\x22\x59\x01\x99\x71\xca\x10\x9f\x3b\xb3\xa4\xa5\x52\xdc\xaa\xc4\xc6\x75\xff\xdd\x2e\x9b\xc7\xe9\x94\xf9\x6d\x6e\xff\x8b\x37\x0d\x9d\x7e\x84\x38\x8d\x34\xa5\x02\x47\x63\x56\x0f\xa9\x5d\xd8\xaa\x9e\x6a\xac\xf5\x6d\x51", 200, { 0x6c, 0x74, 0x72, 0x4a, 0xa1, 0xeb, 0x2f, 0xe2, 0x8e, 0x27, 0xa4, 0xd0, 0xba, 0xf2, 0xf5, 0x30 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xed\x3b\x9c\xf6\x4b\x62\x7e\x1d\xa0\x7c\x60\x4d\x30\x7c\x4c\xcf\x82\x05\x78\xd6\xd5\x5e\x4e\xb8\x41\x82\x19\x5a\x6c\x55\x49\xab\xe5\xf0\x63\x47\x20\x1d\x88\x3b\x0e\xde\x9f\xe8\x59\x28\x22\x00\x39\xad\x82\xae\xf6\xd7\x38\xd2\xfa\xd0\x69\x6a\x92\xbe\x35\x0c\x41\x0c\x9d\x8f\xc1\xe4\x0e\xca\x97\xb9\x8e\x74\x51\x00\x82\x2a\x5f\xfe\x19\x90\x8c\xbc\x59\x8f\x17\x18\xc4\xbc\x72\xf6\xa6\xd8\x96\x93\xfe\x74\x01\xfa\x07\xad\x4d\x8f\x62\x15\x6e\xc8\xe1\xb2\x88\xfc\xf2\x20\x6b\x53\xa6\xd1\xac\xde\x5d\x75\x61\xc0\x10\x75\x78\x89\x3b\x98\xb4\xa3\x65\xc9\x46\xe5\x4d\xf0\x04\x45\xb3\xfc\x48\xaa\xc0\x02\x68\xe0\x12\x7f\xcd\xa5\x68\xb9\xb2\xe0\xe7\x44\x7b\xf1\x07\xa1\xaf\x23\x1d\x01\x94\x3e\x85\x27\x66\x3a\x6b\x6b\x33\x0e\x36\xda\x56\xa5\x93\x7b\x8e\xf2\x19\xad\xba\x1a\x9e\xac\x33\xd0\x16\x32\xc6\xbf\x22\x3a\x4c", 201, { 0xfc, 0xfb, 0x80, 0xef, 0x32, 0xd8, 0x1e, 0x33, 0xb0, 0x18, 0xbb, 0xfe, 0x11, 0x1f, 0x3a, 0x1f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x20\x3d\xdf\xe8\x6b\x7e\x63\xdd\x2a\x0a\x4c\x0a\xe8\x1a\xa9\x02\x49\xa5\x73\xcc\x33\xaa\x0e\x34\x2a\x1c\xef\xcc\xba\x69\x57\x82\x0d\xa9\x3d\xdf\x9c\x60\x49\xda\x02\xf0\xfd\x57\xec\x9e\xee\x3f\x2d\x3e\x30\x3c\xee\x7e\xd1\x11\x03\xcd\x7b\x95\x58\xe6\x3d\x4a\x8a\xfd\x63\x9e\x92\x84\x81\xbd\x9c\x9a\x8f\x11\xf6\x11\x2e\x57\x24\x1a\x09\x5f\x10\x8f\x57\x60\x5e\xdd\x7c\xf5\xde\x8c\xcf\xb8\x1b\x6d\x77\x7a\x10\x5f\x6e\x1c\xfa\xbd\xa7\x0d\x49\x68\x4c\x60\xb0\x6c\x20\x88\x5b\x51\x04\xb4\x40\x01\x95\xc1\x8f\x51\xf2\xe0\x43\x2d\x9b\xc6\xda\x65\x75\x89\x21\x0e\xea\x1e\x29\x96\x2d\x6c\x56\x68\x9b\x0c\x95\x38\x3d\xa0\xad\xeb\x6a\xcd\xaf\x26\x89\xd6\x88\x72\xf5\xd6\xb5\x09\xf9\x9a\x15\x40\xfa\x19\xda\x90\xb4\x90\x99\x42\x9c\x3e\x82\xb7\x65\xb9\xa9\x51\x9f\xec\x82\x02\x79\xae\x6c\x6f\xa7\xff\x64\xc0\x5f\xe1\xda\x07", 202, { 0xc3, 0xe1, 0xb0, 0x79, 0x72, 0x94, 0x8c, 0x0f, 0xa0, 0xfa, 0xa3, 0x43, 0x20, 0xc6, 0x93, 0x87 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7d\xd1\xa0\x4a\xc6\xe0\xff\x2e\x49\x73\xe4\x42\xe1\x93\x38\xe6\xd8\xf2\x4d\xd7\xa6\x7b\x74\x58\xd7\x94\xab\xfd\x0a\xf3\x73\x17\x15\x1a\xc0\xb7\x46\x70\x0a\x61\xc5\xfe\x81\x4f\x15\xc3\x5d\x5e\xb9\xb4\x53\x99\xf3\x53\x23\x61\xa7\xea\x4e\x36\x5f\x64\xe6\x24\x68\xc9\x7d\xcc\x19\x54\x3f\x0e\x33\x33\x1c\x50\x64\xdb\x1d\x6e\xe6\x05\xd8\x3e\x44\x48\xff\xbe\x3d\x54\x12\xdc\xc1\xc8\x35\xe2\x18\xb1\x1c\x7d\x22\xa0\x22\x68\xb9\x67\x79\xba\x32\x6f\x7c\xc8\x03\xb9\x21\xb8\x7e\x6f\x8a\xa3\xbc\x26\xba\x66\x95\xb3\x64\x06\xcb\xa7\xdf\xbd\x46\x68\x37\xa5\x7a\xed\x5d\x00\xe4\x15\x7e\x22\xb4\xa5\x71\xfb\x85\xdd\x49\x45\x47\xb5\x0a\x46\x3e\xb9\x79\x42\x23\x7e\x0c\x81\x68\xc0\x01\xf8\x99\x19\x8b\x97\xde\x60\x26\x2f\x9d\x9c\x0c\xfd\x3c\xa4\xc0\xd7\x04\x54\xc7\xf1\x21\x6e\x76\x4c\xc6\x0a\xe7\xbd\x6d\xbb\x05\x96\x3c\x40\xc7", 203, { 0x8d, 0x91, 0xba, 0x03, 0xb1, 0xc8, 0xaa, 0x70, 0xf9, 0x6c, 0x1c, 0x25, 0xa2, 0x93, 0xa9, 0x8d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf3\x83\xe4\x7a\xa2\x62\x73\x36\xb0\x88\xd9\x72\x8c\x16\x58\xb4\xdb\xa1\x65\x61\xd7\x56\x20\xb2\x64\x39\x6f\xc7\xb1\x86\xb6\xd6\x87\x38\x34\x7c\x32\xa7\xfd\x34\x08\x4c\x90\xe5\x9a\xa1\x14\x95\x77\x23\x34\x3c\x97\x79\x93\xb3\x6b\xaf\xee\xcb\x7f\x9b\xcd\x7a\xc8\x60\xe6\x31\x90\x10\x0e\x49\xfb\x6d\xdc\x9b\x35\xc8\xdc\x2e\x3a\x0b\x6d\x0b\x41\xd2\x38\x2d\xc6\xb3\x4d\x95\x32\x9e\xdc\x79\x2a\x60\x8c\x9c\x71\x42\x7b\xb9\x7b\xce\xd3\x19\x8f\xb1\x05\x44\x97\xbc\xa5\xd4\x87\x05\xe2\x65\x68\x2a\xa0\xa8\x00\xb5\x34\x97\x20\x9b\xbb\xc3\x8a\xdf\x17\xc8\x7c\x54\x88\xe3\xdd\x7f\xe3\x9a\x03\x9a\x71\x99\x1f\xb5\x66\x9d\x46\xf8\xfb\x89\x1c\x03\x2b\x96\x1f\x76\x08\xa8\x8d\x8c\xb7\xbb\xf3\xe2\x0e\x7c\x54\x56\xc8\xf4\xf2\x0b\x63\x5f\xbc\x88\x97\x1b\x53\x00\x72\xbc\xbb\xac\x14\x3c\x9b\x54\x05\x50\x30\xee\x2e\xd5\xd4\x5d\x7b\x69", 204, { 0xf3, 0x73, 0x23, 0x57, 0xe5, 0x6b, 0xc8, 0xaa, 0x91, 0xf1, 0x46, 0x79, 0x25, 0xaa, 0x4f, 0x9f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x27\x5a\x0a\x17\xd7\x70\x10\x2a\x12\x21\x49\x22\x85\x26\x19\xc5\x0f\xd4\x44\x4c\x07\x9a\x47\xbe\x26\xa7\x51\x5b\x13\xa8\xe1\x2e\x8a\xaf\xfd\xc6\x28\x2f\x0c\xfe\xd5\x24\x51\xf7\xce\x50\x04\x27\x4d\x9f\x0e\x8b\xd8\xac\x62\xf8\x23\x5c\xf3\x8f\xa3\xa8\x55\x4f\xb1\x79\xf4\xc5\x56\xac\xeb\xde\xb9\x35\x82\xdd\x22\x5f\x47\x67\xaa\x31\xc7\xbb\x82\xed\xe9\x00\xdc\xb2\xe8\xb7\x79\x41\xeb\x50\xd0\xdc\x43\xd8\xd8\x4a\x40\xcf\x72\xf8\xb0\x18\x76\x39\xf5\x09\x59\xae\xc2\xa2\x78\xc1\x72\xdb\x03\x4b\x05\x16\x89\x56\xb7\xb4\x1b\xfc\x3f\xc4\x20\x6e\xa1\xd5\xb5\x11\xb0\xec\xbe\xc2\x24\x91\x8e\x3a\x53\x04\x2f\x8d\x90\x8d\x4e\xcd\x1d\xf1\xc6\xcb\xcd\x00\xc7\xfd\x3b\x4c\xa3\x7b\xa1\xf4\x35\x24\x56\x9e\xee\xdd\xe6\x83\x7d\xf9\xcf\xa3\x1a\xb5\xd6\x1a\x70\xda\x04\x8b\x25\x85\x41\xb8\x07\x03\x8b\x34\xd4\xd6\xd3\x2f\xa6\xd5\x74\x71\xf9", 205, { 0x12, 0xe3, 0xc8, 0xd7, 0x9f, 0xe5, 0x62, 0x5e, 0xc1, 0x04, 0xed, 0xd2, 0x54, 0xf5, 0x06, 0xd8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6f\x51\x62\x5a\x10\x89\x45\xae\x9c\xda\x85\x1d\x18\x8f\x28\x99\x68\x27\x60\x0f\x33\x84\x40\x28\xe2\xcc\x8c\xbc\xc8\xe0\xa9\xd4\x5c\x77\xb3\x5a\xa1\xd6\xad\x5f\xa6\x2e\xd3\x09\x29\x92\x0c\x17\x57\x93\x7c\x13\xaf\x7a\x35\x13\x04\x21\x0d\x2b\xa1\x6e\x8a\x72\x86\x6d\xfa\xaf\xd1\x09\xa0\xa1\x38\x67\x08\xe8\xb3\xe0\x7c\x93\x37\x98\x8f\x47\x9c\xbf\xd6\x08\xa0\x64\xb7\xa7\x04\xf1\x59\xc8\xd4\x47\xbb\x8f\xc4\x77\xe0\xe7\xb6\x19\x28\x6f\x58\x4d\xbb\x01\xeb\x4c\x1e\xdf\x1e\xa9\xe7\x7c\x18\x2a\x8d\xe5\x95\x3d\x59\xca\x28\x19\x79\x2d\x9e\x72\x33\xa6\x83\xd8\x37\x50\xbe\xad\x0d\x54\x57\xc1\xad\x10\x5a\x8c\x2d\xe3\xd3\x07\x95\x97\xf8\x27\xce\x6c\x66\xf7\xb9\xbd\x84\x51\x5d\x51\x04\x38\x38\x41\x88\xd5\xb6\x81\x61\x0d\xbf\x0c\x72\xbb\x6b\xb0\x33\x8f\xd1\x73\xd1\x82\xfd\xa1\x73\xf5\xff\x73\x98\x65\x20\x5e\x9c\xcd\x30\xf5\x5a\x99", 206, { 0xa3, 0xaf, 0xd7, 0xe6, 0xa2, 0xce, 0x1a, 0x98, 0x7a, 0x71, 0xe1, 0xab, 0xf9, 0xce, 0x37, 0xb6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfb\x7b\xea\x42\xda\x09\x8b\x8a\x65\x58\x9c\x56\x46\x2c\xc5\x23\x29\x5e\x33\x26\xcf\x84\x00\x04\x42\x3e\xb0\x2b\x23\x20\xd7\xcb\x1f\x37\xd9\x75\x80\x3a\xca\x4e\xe0\x4f\x73\xef\xf8\x76\x76\xdd\x96\x96\x89\xa0\xad\x22\xde\x82\x86\x68\xa3\xe6\x15\x76\xa5\x42\x66\xa9\x10\xba\x36\xd3\x51\x5a\x9e\x08\x1c\xf0\xea\x06\x89\x84\x88\x3e\x59\x75\x1c\x83\x57\x32\xb1\x4e\xda\x91\x09\xab\x67\xcf\x15\xc4\x73\x25\x80\x08\x45\x03\x65\xf8\xfa\xec\x22\x8e\xa3\xed\x44\x4a\x89\xbb\xa1\xda\x90\x68\x85\x65\xb9\xc2\x04\x74\xc1\x48\x6f\x7d\xe7\xca\xe1\x0e\xcb\x9c\xf9\x93\x72\x76\xa2\xc4\x66\xeb\x0d\xad\xfa\x84\xc0\x5b\xab\x79\xc8\x20\xa2\x0b\x0a\x84\x57\x81\xb8\xc8\x4f\xbc\xdf\x17\x05\x79\x1c\x4c\xe7\x23\x6f\x5a\x77\x53\x27\x5c\x92\xe5\xfd\x3a\xce\xb8\x3d\xf4\xfc\x01\x1f\x8e\xcd\x4c\x34\x99\x90\x11\xfc\x59\x19\xef\x94\x98\xbe\x88\x8c\x06\x7b", 207, { 0x35, 0xc8, 0x5d, 0xea, 0xdd, 0x9b, 0x4e, 0xe1, 0x1d, 0x35, 0x19, 0x7e, 0x3c, 0xe6, 0xb8, 0x29 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\xd7\x4b\x35\xf2\xdc\xab\x1b\x79\xa9\x55\x29\x39\x47\x48\xc6\x80\x28\xe3\x8e\xdc\xbd\x07\x2a\x51\x24\xea\x5a\x37\xff\x7b\x14\xae\x60\x6d\xc6\xbf\xe0\xe3\xb8\x11\xcf\xb6\x8d\x45\x85\x66\xe8\xee\xd7\x9a\x2c\x30\xa5\x55\x5b\xf4\x91\xb8\x20\xc5\xca\x6e\xe8\x4a\x06\xb7\x2a\x60\x8e\x15\xc8\xd4\x73\x8d\x8d\xba\xde\x9a\xd6\x6c\x85\xb4\x4e\x22\x3a\x77\xd2\x2b\x9d\x74\x73\xc6\xf2\x91\x99\x9f\x0d\x1d\x44\xe9\x6a\x74\x6e\x14\x59\x4b\x8d\x2c\x56\x99\x35\xce\x77\x23\xd9\xc7\xfe\xa2\xb1\x4a\x0e\x92\xb8\xce\x7b\x9a\xcd\x82\xba\x93\xf9\x6e\xf7\x36\xd0\x27\x46\x67\xf0\x2e\xf1\x18\xa7\xe7\xf0\xdb\xb1\x31\x76\x08\x1e\xa6\xa8\x87\x52\x70\x68\x3b\x26\xc6\x50\x0c\x2d\x02\xbb\x8e\x11\x61\xfd\x53\x1b\x56\xb2\xca\xd1\x8b\x34\xd2\xb9\x75\x26\xdf\x3c\x92\x2d\xc7\xa6\x42\xbf\x2a\x4a\x40\x13\x7c\xc2\xbb\x38\xb1\x54\x15\x42\x83\x71\x37\x9f\x63\x57", 208, { 0xdf, 0xbc, 0x18, 0xbe, 0xc2, 0x94, 0xd5, 0x70, 0x1c, 0xe7, 0x30, 0xe9, 0x86, 0xc7, 0x7f, 0x08 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8f\x87\xfa\xd6\xa7\x92\x5a\x2f\x63\x63\xc6\x17\xd7\x82\x1a\xdc\xc2\x48\xd8\x9f\xab\xf3\xd1\xbf\x97\xd9\x6d\x57\x64\xba\x97\xdd\xc6\x2e\x47\xeb\xdb\x3d\xad\x1a\x6c\x0d\xf7\x0a\xc2\xb6\xbf\x7f\x23\x32\x14\xa6\xe8\x70\x24\x75\x3c\x87\x83\x30\x73\x07\x1a\x07\x04\x6c\xaf\xdd\x25\xac\x0c\x23\x01\xf0\xcf\xe3\x99\x5f\xce\xd9\x34\x15\x24\xbb\x84\x32\xdc\x9a\x57\x0f\x39\x60\xf6\x8c\xa0\x79\x1e\x85\x23\x8f\x98\x63\xab\x6d\x77\xce\xc1\x05\xee\x80\xf9\x8d\xcb\x35\xfb\xc3\x94\xbf\x2f\x52\x3d\x35\x05\x4d\x83\x4b\xde\xd8\xe7\xbd\x9a\xe6\x4a\xe6\xbf\x1c\x22\x6d\x42\xd4\x56\x1e\xf6\x3f\xbc\xd7\x8e\xa2\x2c\x99\x50\xc1\x41\xbe\x59\x59\xac\x4a\x87\xc6\x34\x59\x06\xc5\x4e\xb8\x7a\x54\x54\x90\xc6\xb6\x65\x3d\x77\x92\xda\x3e\xd1\x3b\x60\x45\x74\x0b\xb7\x6d\xa9\xe8\x06\x8b\x4f\xe8\xd8\x9c\x5c\x11\xb7\x5e\x12\x39\x63\xfc\xc1\x0c\xaf\xe1\x32\x2c\xf9", 209, { 0xb0, 0xbf, 0x87, 0x74, 0x91, 0x48, 0xb8, 0x57, 0xf4, 0xbb, 0xfa, 0x00, 0xec, 0x90, 0x0a, 0x39 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xae\xb7\x73\x44\x46\xcd\x54\xf4\x06\x6b\x5f\x25\x12\xea\xe3\xa8\xcb\x90\xad\x9a\x5c\xba\xef\xa3\x74\xa6\x3c\xc8\x0e\xda\xb0\xee\x6b\x35\x2d\xec\x22\x90\xc0\x4b\x4e\x11\x21\x9d\xe5\x0c\x59\x77\x28\x95\x7e\x0c\x36\xa6\x9a\x67\xbc\xe9\xaa\x44\xc7\x24\xc2\x8c\xba\x3f\x4e\x6c\x5b\xf2\x73\x11\x07\x0f\x93\x01\x06\x69\xef\x19\xf9\x60\x68\x1f\x70\x0a\x5e\x03\x98\x00\xb9\xb7\x11\xc2\x06\xa8\xde\xc8\xb9\xd7\x76\x26\x91\x99\xf7\xda\x19\xe7\x7a\xb6\x4a\x63\x81\xe4\x4e\xe8\x8d\x1b\x5f\xcc\xcd\x5d\xce\xb5\xf0\x6a\x20\x14\x1c\xc5\x52\x43\xf7\x60\x3e\x37\xe2\xe6\x16\xe2\x45\xa5\x0c\x28\x05\x17\x14\x7b\x12\x0b\xc1\x15\x1e\x75\x4c\xd1\x68\xce\xb4\xa7\xb6\x29\xff\xc2\x61\xd4\x9e\x40\x8a\xa7\xee\x85\x6b\xec\xdb\x3c\xc8\xeb\x9f\xec\x83\x10\xa8\x32\x4f\xbb\x98\xa1\x7d\xa4\x66\x33\xf2\xe9\xa2\x6a\x3a\xb6\xd5\x07\xb5\x90\x06\x66\xef\x3e\x59\x74\x0e\x54", 210, { 0x3f, 0x07, 0x92, 0x47, 0x77, 0x40, 0x22, 0x89, 0xaf, 0x63, 0xa4, 0x03, 0x20, 0xa2, 0x2a, 0x9e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x4e\x64\x5d\x38\x78\x24\xa4\x15\xb7\x32\x9f\xda\x8c\x13\xf9\x1f\x4d\x04\x3b\x07\xe1\x26\x16\xc2\x17\xd6\x4f\x2c\xa4\x1b\x47\x93\xb7\x39\x26\x96\x3b\x62\xa4\x28\xa8\x8c\x74\xb4\x86\x5e\x4d\x5b\x80\x44\x95\x58\x21\xa2\xac\x85\x2d\x24\xd3\xf7\x9e\x34\xb8\xc3\x3a\x85\x9f\xe4\xcd\xcc\x2e\x35\x09\x8f\xd5\x98\xf6\x15\xd8\x39\x17\x7d\xfa\xed\x1b\xeb\xc8\xb4\x3c\xdd\x7f\x5d\x38\x9c\x9b\x49\xea\xcd\xfd\x47\x85\x27\xb7\x9f\x6c\x3f\x77\x2a\xb0\x7f\x8f\x9e\x26\x35\x9d\xe8\x24\xc7\xdc\xb2\xd9\x05\x05\x04\x46\x97\xe3\x06\xdd\x95\x72\xe3\xb4\x35\xb3\xca\x66\x9f\x0f\x0e\x86\xdd\x65\x6e\xc1\xee\xb2\x6e\x8f\xf9\x5c\xe4\x95\x9f\x1b\x8f\x9b\x69\x84\xe0\x25\x61\x34\xdd\xb0\xbc\x95\x1b\x8b\xb4\x50\xe9\x4f\x74\x4f\x8c\xfc\x2d\x6d\xa4\xb1\x46\xbd\xad\x07\xb0\x74\xa1\x0b\x57\x74\xbb\xd7\xb4\x76\x57\xcc\x7f\xd2\xf5\x6e\x82\xee\x5d\xdc\x89\x41\xdc\xea\x76", 211, { 0xb4, 0xe4, 0x99, 0x88, 0x69, 0xa4, 0xd3, 0x42, 0x48, 0xfd, 0x35, 0x33, 0xd4, 0xa3, 0x66, 0x48 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x03\xac\xdd\x71\x73\x72\xc2\x3c\xc4\xe0\x6b\xa4\xa5\x7b\x07\x13\x6c\x77\x5d\x43\xde\xbe\xa5\x0d\x9d\x0f\x03\x5f\x2e\x43\xa1\x4c\xa6\xab\x67\x3e\xf1\x96\x5a\x47\xbf\xef\x8e\x94\x0c\x02\xc9\x02\x4a\x5f\xb6\xcb\x2c\xd7\xc3\x59\x11\xa3\x98\x3b\x0c\xa5\x33\x35\x8c\xc6\xa4\x71\xad\x7e\x62\xd4\x1a\x72\x49\x6c\x9c\x37\x31\x05\x44\x34\x2c\xdb\x31\xa6\x5b\x69\xff\xbe\x6d\x60\xcc\xe5\xb6\xb3\xe8\x1f\xe8\xcf\x18\x8d\x70\xe8\x87\x0c\x6f\x6f\x4a\xfc\x53\xa0\x8e\x1b\x12\x37\x61\x8f\x03\x42\x19\x02\x59\x12\x65\xe7\x3c\x4b\xee\xdc\x85\x1b\xa9\x28\x16\x87\xbc\x63\xd4\xe1\x0a\x35\x43\x56\x5d\x36\xbc\xa3\x2f\xf5\x4d\xe8\x15\x15\x2d\x95\xc9\x91\xda\x81\xd2\x1f\xd1\x19\xd2\xb2\xea\xb5\x6c\x1a\x4d\x06\xcf\xc7\x14\xac\xe4\xab\x7f\xe4\x10\x3d\xce\x5f\xa6\x99\xbf\x2d\xec\xc4\xa4\xd8\xc8\x0e\x20\x8e\x08\x90\x7e\x76\x4b\xd5\xad\x23\x8e\x95\xdc\x26\x57\x9d\xae\xbd", 212, { 0xba, 0xe8, 0x47, 0x79, 0xba, 0x43, 0xe2, 0x04, 0xf1, 0x5a, 0x99, 0xb4, 0x4d, 0xf6, 0x3b, 0x7c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x78\xca\x1a\xaa\x80\x33\xe3\x1f\xc4\x67\xae\xd5\x05\xcb\xc5\x3c\xbe\x26\x67\xcd\x0d\x38\xc9\x7b\x3b\x84\xae\x48\xea\x2f\x9e\xf3\xda\x01\xc6\xce\x57\x88\x6b\xae\x43\x5b\x0c\xfd\xbc\x7c\x14\xe9\x69\xd7\x39\xbf\x66\xe7\x74\x52\xc9\x78\x9d\x95\xd1\x87\xa2\x49\xab\x45\x63\xcf\xe0\x3a\x2e\x1f\x5e\x87\xd2\xd1\x20\x44\x62\x59\x7d\x08\x88\x50\x0b\x86\x83\xed\x2d\x54\xbe\x92\x40\xc7\x0e\x83\x5e\xfb\x88\xb1\xcd\xef\xfd\xb5\x08\xcd\x14\xd8\x67\x46\x02\x4e\x6d\x1c\xe8\x84\xae\xb9\xc8\x8f\x5b\xfd\x25\xc3\x6c\x15\x37\x65\x68\x86\xc8\x78\xd4\x4a\xae\xb3\x36\x11\xe5\x94\xc4\xa8\x48\x8e\xae\x77\xec\x5e\x05\x24\x1a\x7c\x46\x56\xe6\xac\x87\x94\x70\xb3\x3d\x4b\xb7\x27\xa8\xee\x15\x60\xdc\x38\x5b\x8b\x6c\x8d\x89\xdd\xb4\x7e\x2a\xe3\xc3\x6c\x4a\xf8\xe3\x43\x15\xd1\xc7\x68\x0e\x32\x51\xae\xe8\xc3\xfd\x81\x05\xfd\xed\x25\x88\x3f\x91\x19\x19\xfd\xf2\x95\x35\x17\x9c", 213, { 0x36, 0x5a, 0x4c, 0xec, 0xc3, 0x99, 0x8e, 0x50, 0xdb, 0xee, 0x2e, 0xc0, 0x07, 0x66, 0x78, 0x82 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x33\x2e\x48\x26\xaa\xc6\xb5\x5f\xb4\x64\xa5\x17\x12\xf1\x50\x87\xa6\x52\xd0\x5e\xbd\x82\x34\x69\x6f\x4a\xb4\xdd\x1f\xa0\xfe\x44\x1e\x9a\xaf\x02\x6c\x0d\xdd\x83\x9e\xc7\xd1\x04\xdb\x64\xd2\xfa\x00\xd1\x1c\x22\xe4\x5b\xf0\x26\xb5\x73\xc5\xe9\x81\x00\x9c\x70\xd1\x61\x71\x6c\x70\xfe\xcd\x68\x49\x89\x78\x8b\x6e\xd7\x4c\x0b\x35\x55\x26\x2f\x7d\x28\xf5\xfe\x0e\xe5\xf4\x89\x1e\xea\xf4\xd2\xf0\x57\xd2\x58\x97\xac\x09\x40\xd9\x01\x60\x21\x2f\xdc\xc4\x6c\xe8\xb2\x30\x77\x6c\xfd\xc8\x24\x9e\xf6\x06\x32\x5b\xf0\x0b\x20\x20\x51\x17\xb9\xc8\x2d\x14\x41\x72\x80\x4d\x3a\x81\x08\x3c\xd3\xbd\xbd\x80\xee\x96\xee\xed\xcd\x89\xfa\xbe\x58\x9c\xa7\xe5\x0d\x03\x22\x83\x84\xe5\x93\x74\x9e\x38\x5c\x01\x4a\xc8\xef\xb9\xf3\x57\x49\x59\x89\xdf\x0f\xe8\x2b\xf3\x43\xe0\x6e\x43\xa3\x86\x4d\x3e\x9e\x5b\xad\xd2\xf4\xab\x8b\x4f\xe9\x42\xc4\x69\x25\x3e\x80\x5c\x2b\x00\x3c\x2a\x74", 214, { 0x94, 0xb3, 0x23, 0x0b, 0x78, 0xb0, 0xe5, 0x34, 0x86, 0x5b, 0x43, 0xce, 0xc8, 0x6b, 0xc9, 0x2e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3c\x73\x00\x28\x30\xe9\xb7\x78\xf2\x94\x76\x9a\xe1\x27\x74\x62\x3d\x3c\xdb\x7a\xd3\x1d\xc8\x3e\xd1\x2e\x6f\x36\xb8\xfb\x5c\x31\x6f\xda\xd4\xfa\x73\x3d\x5a\xba\x2c\x96\x4d\xea\x5b\xe7\xae\xf2\xb0\xe5\x00\x63\x78\xc8\x48\xce\x74\xb2\x34\x3f\xc5\xb9\x58\x59\x03\x93\x93\x0f\x6c\xdd\x90\xfc\x39\x08\x69\x60\x0c\xe0\x65\xb8\x86\xba\xe2\xf9\xf6\x3a\x4e\x68\x2c\xbe\x4f\x19\x6b\x6b\x03\x02\x7c\xd2\x61\xbb\xdf\x3e\xbe\xd4\x1d\x9c\x6c\xd2\x39\x08\x7d\xc8\x45\xf0\xa5\x8f\x10\xe7\x3d\xa2\xfd\x08\x64\x98\xef\x05\x40\x3e\x60\xcb\x62\x50\x91\xd3\x48\xd4\xdc\x08\xfc\x14\x25\x50\xd9\x36\x6f\xba\x6d\x79\x8a\x42\x7a\x0e\xea\x43\x17\x91\x94\x7a\xf4\x22\x31\xb2\xba\x25\x45\x12\x91\x92\x79\xff\xbb\xf9\x14\xaf\x5d\x16\x88\x4c\x5e\x0c\x29\xc0\x68\x42\xf8\x23\x0c\xd7\x9e\xbf\x02\xc3\x74\xbc\x8e\x8b\xbf\x6d\xfd\xa0\xf9\x35\x4f\x55\x4a\x17\xef\x7c\x16\xda\x9d\x9c\xb0\xd5\x6c", 215, { 0xa5, 0xbf, 0x5d, 0x7b, 0xd6, 0x14, 0xfe, 0x55, 0x13, 0xa2, 0x41, 0x76, 0x5d, 0xa5, 0x45, 0x8d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd0\x2c\x5c\xe7\x3f\x51\xc7\x4f\x33\xad\x1b\x00\xd8\xc3\x58\xf2\x93\x60\x5f\x5a\xfd\x0c\x7d\x70\x7b\x9b\x98\x4c\x7b\xe3\xf4\xea\x4d\x87\xa3\x4c\x9b\xf2\x87\xbe\x87\x60\x05\x35\x60\x16\x48\xd1\x00\xb2\x2f\x82\xc4\x9d\xd4\xc6\x29\x9c\xba\x90\x00\x86\x92\x45\x4d\x10\xaa\xdf\xc2\xc4\xf3\x34\xd3\x10\xad\x51\x76\x7b\xb1\x00\x79\xf2\x5b\x6a\x7f\x41\x12\xd5\x98\x9d\x75\x8d\x7c\x5e\x23\xe1\x64\xc9\x27\x45\x86\x0b\xfe\x95\x2b\x43\x47\x79\x6e\xb6\x07\xe3\x93\x26\x95\xb5\x01\x3c\x28\x80\xdd\x22\xfb\x68\x45\x2d\x1a\x23\x26\xb8\xcd\x20\xbb\x0c\x9e\xc4\xa2\x7b\x07\xcf\x9c\x8c\xbd\xdd\xe1\x50\x93\x09\x1e\xd3\x0d\xac\x0d\xae\x82\x43\xae\xba\xec\x6f\x27\xdf\x50\x15\x35\x0a\xc4\xa5\x4e\x3d\x22\x78\x55\xc0\x48\x53\xf9\x75\x08\x09\xab\x49\xb3\x3c\x3a\xc6\x3d\x43\x0c\xc6\x0d\x28\xfb\x42\x64\xc8\xc9\x49\x67\x1d\x42\x0c\xca\x99\xed\x16\x1b\xa8\x6e\x98\xa8\x58\x7b\xe2\x0f\x15", 216, { 0x59, 0xfe, 0x50, 0x4c, 0xbb, 0x58, 0x09, 0xb1, 0x1b, 0xce, 0xbc, 0x3c, 0x1d, 0x12, 0xfc, 0x29 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x79\xee\x60\x8d\xb2\x17\xf0\xb2\x35\xe7\xbd\xde\x4b\x0d\x79\x10\x91\x6d\x35\x54\xb7\x52\xab\x41\xd4\xbf\x28\x9c\x63\xe3\x14\x1b\xde\xaa\x1f\x43\xf5\x70\x0a\x72\x6b\xd0\x0f\xf9\x8e\x9b\xef\x61\x51\xe5\x96\xcf\x07\x39\x6c\x82\xbe\xec\x3a\x78\x36\x8f\xb7\x30\x7d\x7e\xaf\x8b\x28\x95\xcf\xcc\x2f\x02\x0f\xbe\x66\x36\xbc\xf5\x94\xf6\x21\x2c\x32\x8e\xd1\xce\xc1\x24\x94\x90\xc8\x2a\xec\x3b\x69\xed\x42\x87\x9f\x4b\xb2\x23\x17\x81\x70\xd2\xa7\x22\xd5\xaf\x6f\x24\x0a\x91\x8b\x15\x50\x89\x72\x6b\xe9\x88\xee\xf8\xa6\x1e\xb8\x7c\x0e\x5d\xaf\x55\x28\xdc\xb5\x51\xe6\xd7\x26\xa4\x2e\x74\xf6\xf5\x85\x20\x66\x92\x5a\x18\x63\xc4\xed\x04\x7b\x3e\xda\xbd\x7c\xaf\x46\x2f\xab\x77\xa5\x5a\x9e\x76\x25\x73\xb7\xff\xba\x27\x3d\xeb\xc7\xff\x18\xca\x66\xde\x29\x35\x54\xa8\x44\x3f\x7c\xfd\xcb\x0a\x1e\x23\xe8\x75\x9c\x02\x66\xf3\xe1\x48\x2d\x77\x6e\xad\x58\x8b\x02\x51\xf5\x80\xe6\x41\x58", 217, { 0x46, 0x60, 0x93, 0x1b, 0x8d, 0xd0, 0x21, 0x38, 0x27, 0xd0, 0x23, 0xfe, 0x9a, 0x06, 0xe0, 0x3f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\xd2\x18\x1c\x3f\x7f\xc2\xb7\x10\xca\x5c\xb9\x14\x82\x37\xa1\xcd\xce\xfc\x5c\x50\x3e\xe9\x5b\x59\x6c\x39\x4f\x79\x4e\xa2\x84\x6a\x1c\xf8\xd7\x83\xd8\xef\x56\x46\x7f\xfd\x72\x17\xca\x5e\xe3\x08\xa1\x31\x19\xcf\x1d\xc0\x5a\xd9\x38\xdd\x7c\x77\x14\x67\x41\x37\xe4\xec\x4a\x4e\x7b\x68\xba\x30\x6f\x2c\x68\x42\xea\xda\xc0\xa7\x0d\x8d\x37\x37\x00\x15\x68\x8e\x9a\x60\xd0\x40\xaa\xf4\x23\x2a\xe0\x98\x48\xe4\x5b\x13\xf8\x52\xd0\x0c\xee\x5a\x53\x10\xcc\xb0\xc6\xb2\x8a\xcc\xdb\xcd\x9b\xfd\xc7\xe5\x9e\x97\x85\xac\xbd\x48\xc3\xa0\xa6\x89\x6d\xd1\x24\x30\xd5\xc1\x59\x22\x7c\x64\x9a\x25\x80\x46\xe7\xd3\xa1\xcc\x05\xaa\xf1\x92\x3a\x41\x18\xf4\xa5\x95\x41\xa8\x37\x82\xa5\x88\x52\x4d\xb2\x6e\xfc\x5e\xd7\x39\xc0\x0b\xef\xec\x21\x8f\x47\xf5\xbc\x19\x4e\x8a\xf9\x01\xd8\x2f\x6d\x15\x0e\x55\xd0\x12\xf6\x1c\x96\x2e\x9b\x39\x2c\xd2\xd9\xf3\xd0\x65\xc7\x47\x0d\x44\xc1\x2c\xd2\xce\x10", 218, { 0xf3, 0xa4, 0xbf, 0xef, 0x5b, 0x96, 0x17, 0xce, 0x45, 0x37, 0xa1, 0x87, 0x6e, 0x17, 0x10, 0x65 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf1\x2e\x9b\x39\xc2\xab\xcc\xdf\x49\x44\x7d\x55\x70\x03\x57\xc4\x45\x3b\x43\xf5\xf7\x5f\x39\xbc\xfd\x7e\x36\x02\x56\x5c\x4c\x6d\xeb\x2e\xd3\xae\x10\xf1\xbd\x66\x29\x67\x07\xb6\x69\xaf\x4c\x62\xb6\x80\x74\xa1\xa9\x02\x89\x83\xb1\x49\xaa\xff\x57\x6e\x18\x98\x9c\x4c\x6e\xac\x7e\xd4\xed\x59\x99\x0e\xf5\x0c\xeb\xac\x90\xa7\xb0\x4c\x29\x4e\x6c\x4b\x5a\xcf\x07\x40\xe3\xac\x12\x1c\xb6\xc5\x27\xdc\x2e\xa6\x6f\xe8\x60\x6b\x3e\x0c\x8a\x4c\xd8\x10\xa9\xc9\x57\xf5\x26\x73\xa4\xcf\xb0\x54\xa3\x3a\x25\xfc\x6b\x7a\xa9\x29\xb2\x33\xda\x12\x48\xc1\x1a\x50\xba\x35\x0b\x6a\x17\xed\x19\xfb\xcf\xcf\x30\x82\xb6\x22\x8f\xc6\x28\x08\xb4\xe4\x47\x9c\x77\xf6\x60\xa4\x33\x62\x6c\xf3\x1f\xbc\xb2\x5e\xba\x59\x8a\x58\x65\x71\x3c\x2d\x0a\xf0\x06\xd8\xfa\xd9\x3c\x81\xd5\x57\x8a\x96\xa2\x62\x55\x84\xff\x0a\x40\x12\x72\x64\xcb\x5a\xdd\x0e\x15\x66\x10\x5f\xc2\x63\x79\x30\xf7\x84\xf6\x42\x82\x76\xcb", 219, { 0xcd, 0x28, 0x77, 0xaa, 0xac, 0x2a, 0xed, 0x44, 0x22, 0x6b, 0x47, 0x34, 0xb0, 0x26, 0xb4, 0xb3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4a\x17\x7b\xaf\xa0\xb6\x26\x01\x80\x28\xb2\x18\xfa\xa7\xfe\xb7\x7c\x9d\x29\xa0\xfa\x85\xc6\x3f\xb7\xee\xbc\x87\xb3\x9e\xbd\xdb\xb1\xd3\x61\x22\xe4\xa5\xde\xfd\x35\x87\x66\x15\x34\xec\x1d\x8d\x98\x06\xb6\x97\x74\xa9\xa9\x22\xf9\x4e\x13\xb1\xe2\x34\x29\x47\x80\xa1\x5a\x7e\x62\x47\x01\xb8\xa0\xc1\xc4\x6c\xc4\x3c\x8c\xa2\x56\x33\x21\x7a\x03\x52\x60\xe6\x69\x7c\x1c\x77\x82\xe8\x8f\x55\xaa\x66\x7b\x49\x4e\xc0\xe2\xf4\x33\x3b\x5e\x23\x60\x3d\x1e\x3a\xaa\x08\x7d\xcc\xda\xa4\x40\x4d\x7c\xdb\x6c\xdf\x47\x5e\xc2\x48\x24\x06\xd9\x05\xdd\x34\xd6\x78\x63\x59\xc9\x3c\xbc\x91\xa7\x99\x87\x6a\xe0\x13\x2d\xc4\x9d\x1d\xa6\xd0\x98\xeb\xe5\x3a\x97\x65\xe1\x63\x86\x37\x41\xc7\x30\x05\xa4\x7e\x9a\xbc\x8a\xde\xfc\x04\xe2\x3d\x5d\xd1\x30\xd4\xc9\x19\x5a\xbf\x32\xa0\x10\x20\xe1\xee\xd7\x64\x97\x63\xb0\x9e\x44\x61\x69\x0f\x63\xa7\x7f\xc7\xf0\xbe\xae\x64\x07\x8b\x18\xf9\x1b\x05\x0d\x0b\xcf\x01", 220, { 0x95, 0x6d, 0xe2, 0x53, 0x57, 0x08, 0xe7, 0x97, 0x5e, 0xe4, 0x9d, 0xac, 0x5c, 0x77, 0xf2, 0xd4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7d\xb5\x74\x2a\xf7\xeb\x20\x0c\x5d\xdb\x67\x4f\x27\x6f\xb9\x00\x50\xef\x58\x0b\xe0\xc4\xf3\xc5\x17\x57\xe4\xa6\x33\x18\x03\x14\xdf\x9b\x25\x5a\x38\xdc\x35\xb7\x7c\xa3\xec\x93\x51\x03\x30\xcd\xb0\xfc\x07\x2f\x6c\x40\x36\x03\x63\x13\x7a\xbf\x3f\x4b\x62\xdb\xe9\x77\xc7\xc3\x8c\x1c\xe9\xe8\x41\x1a\x28\xf1\x5c\x2e\x5c\x10\x52\x91\xd1\x6f\x46\xbd\xe2\xc8\x2f\x4f\x30\x14\xa6\x08\x80\x5b\x51\xed\x2f\xaa\xe8\x8f\x52\x23\xe1\x65\x6e\x2e\xbc\x55\xd0\xce\xed\x51\x8b\x0e\x61\x1e\x0c\x99\xae\x30\x5b\x69\xdc\xb2\xf0\x98\xca\xa2\x30\x52\x3f\x18\x83\xec\x8e\xa6\x12\x0d\xe5\xdb\x22\x0a\x32\xe2\x08\x50\xb1\x48\xc8\xfa\x17\xdb\x4e\x83\x54\xad\x48\x95\x09\x38\x9e\x00\x86\x9b\x8f\xc6\x7e\x03\x69\x53\x4a\x25\xe5\xca\xd6\xe7\x1d\x7a\x2c\x1e\x2a\x6f\x9b\x72\x5e\x25\x83\x5e\x1b\x58\xc0\x54\x4e\xf7\xb1\xfd\x8c\x36\xe4\x9e\xc7\xc2\x60\x96\xac\x10\x8e\x04\x9d\xcf\xc4\x85\x46\x7c\x6f\x1b\xde\x13\xdd", 221, { 0x6d, 0xbe, 0xd8, 0x8e, 0x62, 0x40, 0x88, 0xb8, 0xf7, 0x63, 0xda, 0xce, 0x3a, 0x5f, 0x47, 0x0f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x29\xfc\xe3\xa5\x9b\x13\x7b\xb3\x22\x8c\xc0\xf4\x9d\x7e\x20\x9a\x93\x0d\xe1\x0c\xdd\x5c\x93\x6e\x61\x30\xa4\xc8\xf8\x22\x12\xd5\x71\x80\x3b\x6b\xaf\xc2\xd0\x81\xed\xa4\xe8\xe2\x22\xe4\x31\x6d\x80\x9a\x41\x06\x16\x2f\x0a\x1d\x95\xfb\x6c\xd9\x2f\x7f\xe5\xe0\x9b\x3c\x63\xc5\x35\x2e\x3a\x0f\x43\xe8\x31\xe2\x53\x4d\xb7\x4d\xc0\xe8\x33\x2f\x53\xe9\x79\xc6\x05\xbd\x58\xd6\xe2\x48\x50\x72\x0a\xc2\x61\x6a\xd2\x2b\xfe\x51\x07\x6c\x21\x29\x52\x0c\x78\xad\xb7\x8b\xbd\x3b\x38\x5f\x23\x5d\x96\x88\xec\xf3\x37\xd2\x17\xfe\x23\xa7\x37\x0b\x28\x8e\x5f\x3a\x1e\x44\x3a\xe9\x45\x75\x37\x02\xca\x17\xe1\xdf\x69\x64\x4c\xd5\x2c\x72\xab\x64\x51\x70\xff\xf9\x49\x7f\xea\x5d\xdd\x2a\xa2\xbe\x6b\x84\x01\x58\x4f\xdd\xb8\xc0\x5d\x20\xa4\xcd\x8a\xcc\x39\x23\xaa\x8d\x1b\x5d\x53\x76\xcb\xd6\xe1\xde\x7e\x15\x93\xd4\x0a\xd3\xd3\x40\xf9\xa9\x93\x97\xc0\x5a\xd3\x3a\x09\xbb\x3f\x6c\x2d\x3b\xf4\xee\xbe\x13\x63\x39", 222, { 0x19, 0x9e, 0x3f, 0xa3, 0xf4, 0x23, 0x12, 0xaa, 0x16, 0x04, 0xf8, 0xc9, 0x22, 0xd4, 0x39, 0x69 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3f\x0b\x4e\x57\xf7\xe5\xf0\x5f\xda\x6b\x3a\x8b\xa8\x10\x37\xf8\x12\x45\x90\xf9\x16\x5b\x2c\x17\x6c\x10\xef\xa9\x18\xb8\xa4\x0c\x20\x09\xf5\x80\x58\x83\x97\x9f\x59\x7a\x82\x7b\x90\xc2\x5e\x52\x72\xf5\xfa\xf0\xcd\x63\xf5\xa2\x3a\x97\x7f\xd2\xaf\x82\x3a\x44\x31\x47\x3a\xec\xa6\xa2\x2b\x69\xc8\xf6\x92\x22\x36\xf1\x2c\xfc\xa5\xde\x72\xb5\x33\x86\x3e\xe0\xdc\xc4\x87\x7d\x05\xa4\x48\x34\x36\x37\x80\x2e\xe5\xf6\x52\x91\x6d\xd0\x4c\x96\x1e\xd3\xc4\x48\x6d\x73\x5e\xda\x4c\x79\xab\xa5\x95\x8a\xec\xbe\x9f\x52\xf4\x31\xf3\x4e\x2b\xdc\x19\x34\xaf\xe9\x8b\xff\x94\xe9\xcb\x9a\x4c\x8a\x90\x28\x22\xf5\x1c\xee\xe0\xc6\xa9\xde\x91\xa9\x01\xc1\x61\x8d\x2d\x00\xa0\x88\x45\x0e\xe5\x47\x67\x75\x4f\x30\xc2\x7c\xe7\x16\xd2\x72\x21\x98\xa6\x9b\x82\x17\x5c\xb4\x5b\x51\xaf\x23\xb3\x9f\xa7\xc0\x43\xc7\x6f\x3a\x9a\x7f\x43\x27\x61\x7f\x88\xac\xb9\x41\xf5\xc5\xc0\x58\xef\x32\x33\x6a\xf3\xff\x2d\xcc\x2d\xae\x0e", 223, { 0xbc, 0xe6, 0x12, 0x5a, 0xda, 0xbc, 0x5a, 0x1b, 0x21, 0xa2, 0x7a, 0x18, 0x4b, 0x6a, 0x4b, 0xd2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb8\x25\x02\x77\x2d\x99\x6b\x71\x64\x65\x09\xad\xea\x9e\x5e\xe6\x5f\xbf\x95\x63\xc9\xfb\x69\x98\x95\xb1\xb4\xec\x2c\xfe\x95\x96\x2e\x6c\x3c\xa0\x4e\xc7\x55\x0e\xca\x10\x0e\x18\x85\x8b\xc7\x92\xc2\xf3\x55\x6d\x7f\xce\xf3\x56\x6c\xdb\xc6\x7c\x87\xa7\x0c\x6f\x55\x3f\xe0\x24\xbe\xff\xac\x15\x86\x89\x2b\x85\x64\xd2\x19\xe1\xc1\x56\x7a\x42\x0e\x6b\x84\x0f\xc2\xb3\x2b\xc0\xef\xac\x47\xbd\x80\x62\x63\x64\x11\x43\x24\x2a\x6b\x13\x54\xd8\x9a\xf6\x8a\xf7\xad\xab\x78\x47\x0a\xd8\xd1\x68\x6b\x7f\xd5\x9c\x79\x90\x7a\xa4\x03\x99\x38\xc6\xdb\x99\x71\xf0\x4d\xf2\x7c\xf7\x3d\x7c\x4d\xf8\xdc\xb6\xc2\xdf\x07\x17\x8c\x06\x3c\x82\xb8\xf5\x39\xd9\xd9\x48\x33\xa9\xd4\xae\xb0\x03\x48\x0d\x01\x6a\x98\xc3\x60\xe8\x96\x08\xa2\x3b\xcd\x6f\x98\x2d\x6b\x8b\x08\x01\xc9\xae\x43\x09\x99\xcd\x63\x55\xab\x7f\x23\x85\x5c\x24\x5b\xc0\x9b\x23\x16\xbd\x99\x4b\x51\xfe\x0d\x5b\x53\x1d\x21\x9d\xa4\x3f\xfc\xad\xab\xa5\xed\x57", 224, { 0xcf, 0x7a, 0x97, 0xcb, 0x19, 0xd8, 0x74, 0x61, 0x6c, 0x4b, 0xe9, 0xa4, 0xa7, 0x52, 0x11, 0x02 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe7\x61\x30\x9e\xca\x25\x61\xd9\x2d\x37\x7a\xf9\x74\x80\x8a\xe5\x40\xc4\xf5\x06\xca\xed\x62\xde\xe3\x80\x45\xd3\x85\x31\x08\x0a\x14\x91\xd8\x6f\x37\xe5\x0b\xd0\x4e\x13\x29\x29\x8f\xb6\x9e\xfb\xc0\x50\xfa\xd5\x93\x9f\xe2\xf4\x99\x08\x97\x06\xe4\x30\x20\x0b\x3e\xaa\x17\x54\xff\xca\x0e\xae\x8f\x98\x9c\x98\x79\xe1\x07\xaf\x27\x67\x8f\x2b\x40\x38\x55\x82\x9b\x1c\xe7\x2a\xde\x27\x69\x7c\xb7\x6f\x61\xb4\xb7\xd8\x1e\x15\xc6\x0b\xc6\x29\x47\x85\xfb\x26\xc9\xcb\x29\x6c\x66\xbc\x6f\x2b\xbc\xff\x28\x22\x85\x9a\x15\x82\xd6\xa4\x29\xf1\xf1\x13\xf0\xaa\xc6\xaf\x9c\xc1\x0d\x28\xad\x84\xf9\x42\x3c\xfe\x99\x2e\xe5\x95\xd0\xf5\x4f\xd3\xef\x0d\x5a\x41\xec\x0e\xe3\x6f\x42\x7e\x36\x11\x64\xc8\x11\x44\xdf\x4c\x51\xee\x0b\x90\x3c\x42\x6d\x93\x6a\x63\xac\x42\x50\x20\x2e\x04\x6a\xde\x4f\x70\x05\x93\x3e\x1e\xa6\xee\x73\x9b\x1a\x95\xd0\x76\x1b\x86\x54\x77\x9c\x9e\x76\xf0\xb2\x38\x24\x2b\x1e\xee\x57\x02\x7b\x7b\x52", 225, { 0x73, 0x28, 0x7e, 0x73, 0x4a, 0x07, 0x8f, 0xf9, 0x54, 0x98, 0x66, 0x8b, 0xe6, 0x28, 0x69, 0x5a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8e\x01\xc1\x78\xf7\xf3\xe5\xc8\x6b\xab\x98\xf6\x2a\x40\x71\x27\xbd\xd1\x76\x48\x46\x71\xba\x0b\xf3\xaf\x20\x7f\x8d\xc0\x3d\x4a\x2d\x4b\x5c\x86\x0d\xd1\x9b\x36\x7c\xb7\x32\x64\xeb\xf2\xd4\xd8\x25\x4e\x2e\x76\x9c\x5b\x8c\x35\xde\xf4\x9b\xb8\x27\x6d\x49\x8a\x0f\x58\xc8\xfb\x64\xf4\xb2\x91\x12\x34\x47\x2d\x3f\x67\xd1\xbc\x74\x88\x28\x96\xf5\x24\x52\x76\x31\xe4\x42\x16\x54\xb6\xc1\x67\xfa\x9c\x6a\x6a\xff\x11\xcf\xae\x72\x13\xba\x66\xa8\xd2\x8e\x26\x6c\xf3\xcb\x3a\x54\x81\xb0\xa3\x2f\x71\xfa\xaf\x9a\xd0\xcb\x34\xb2\x8b\xa6\x69\xe3\xdb\x97\x60\xdf\x4b\x6f\x24\xab\x67\x2d\x6b\xd3\x03\x79\xf8\xbe\x25\x49\x90\x1c\x90\xa6\x96\x7b\xed\x89\x45\xf9\x98\xdf\x8a\x14\x05\xac\x7c\x9d\xce\x4c\x79\xcc\x5a\xd4\xde\x6c\x2b\x96\x62\x37\xc3\xc3\x10\x3c\x34\x2b\xdf\x7c\x43\x21\xef\x95\x38\x7a\x62\x96\x45\xb4\xd5\xf1\x90\x32\x7a\x8e\xdf\xa5\xd3\xfc\xdf\x87\x0d\xc2\x11\xc1\xf7\xd4\x52\x6d\x9d\x21\x05\xb5\x85\x49\xdf", 226, { 0xd2, 0x88, 0x52, 0x3d, 0x56, 0x8c, 0x3e, 0x43, 0xc1, 0x91, 0x26, 0x52, 0x1f, 0x00, 0x34, 0x9b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xda\x85\x6c\x4e\x51\x3f\x1e\x87\x08\x3b\x76\x2b\xc6\x9f\x46\x95\xb0\x8d\x65\xc2\xe7\x19\x27\xde\x4f\xe6\xee\x67\x6b\x5c\xda\x00\x64\x88\x9c\xd4\x29\x8f\x68\xa5\xaf\xd0\x08\x70\x59\x96\x0e\xbf\x74\x76\x22\x8b\xd9\x4b\x79\xcb\xb5\xcc\x66\x9d\x66\xc7\x0a\x10\x7b\xfc\x28\x8c\xde\x99\x13\xdf\x0e\x4d\xc8\xe4\x84\x0a\x18\xd2\x37\x5c\xfe\x1e\x3b\x61\x0f\x0e\x85\x64\x0f\xdc\xc9\x1a\x9f\x83\x84\x78\x14\x28\x16\x2f\x64\x28\x07\xc6\x3a\xba\x6a\x52\x29\x41\x5e\xd3\xfc\x31\xb1\x2e\x2c\x9b\xa0\xc3\x6b\x56\xba\xaa\x5d\xcc\xe2\x8f\x66\x5e\x73\x27\x9e\x75\x7e\x4e\xe1\x26\x2e\xbf\x04\x81\x4d\x6f\x22\x77\xdf\x86\x14\x65\xec\xfb\xfe\x41\x5c\xca\x06\x60\xfa\xd5\x20\xe1\x9b\x55\x05\xba\x58\xfb\x43\x5d\xf6\xa7\x6d\x06\x67\xc4\x72\xa4\x6a\x3e\x0b\x61\x4d\x21\x4e\xd0\xd2\xcf\x60\xb2\x30\xdd\x47\x65\x30\x8c\xde\xea\x78\xdf\xe1\x91\xe5\x5d\x28\x43\x11\x65\xf1\x6c\xf4\x29\x56\x83\xa6\x49\xdd\x37\x42\x0c\x2e\x37\xe7\x3d\xdf", 227, { 0xcd, 0x4e, 0x87, 0xb7, 0x10, 0x56, 0x56, 0xa0, 0x13, 0xe5, 0xbd, 0x06, 0xe2, 0x8d, 0x82, 0xf9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9e\xd8\xa0\x6c\xfa\xc3\x10\x42\xf8\x1f\x36\xfa\xad\xae\xe8\xa3\x83\x22\x1b\x38\xbe\xdc\x86\x31\xaa\xcf\xd6\x35\x63\x83\x87\xec\x40\x36\x66\xf3\xdd\x1d\xa0\xe9\xc4\xc8\x85\xa6\xb8\xa3\xdf\x8c\x9d\x98\xe9\xf5\x07\xd2\xee\xcb\x5d\x9d\x80\x37\xaa\x69\x51\x72\x00\xee\xb1\xb7\x89\x69\xa4\x59\x2b\x04\x9f\xf0\xd7\x53\xdf\xaf\x6f\xfa\x66\xd1\x51\x6d\x94\x32\x85\xd0\x5e\xfa\x7f\xfd\x2d\x74\x91\xa3\x55\xfd\xf0\x8b\x30\x17\x60\xf6\xd7\x9d\x7f\x23\x7c\x11\xac\xed\x67\x11\x92\x90\x8b\xe9\x54\x8c\xc4\x41\x57\xa2\xb0\xf7\xa6\xfb\x27\x08\x06\x68\x58\xa7\x97\xc4\x81\x70\x24\x76\x4a\xb6\x07\x13\xbf\xf8\xbc\x20\xe9\x73\x00\xf5\x08\xd1\xa5\xbc\x6e\xff\xf5\x99\xfa\x1c\xc1\xe4\x30\x8d\x05\x91\xf2\x2d\x39\xb1\xdd\xa2\x36\x11\x43\xcb\xc3\x00\xc0\x55\xbc\x2f\x7b\x6d\xde\xb1\xfb\x8f\x31\x21\xa3\x7d\x12\xe2\xcc\x4c\xdc\x81\x7d\x99\x33\x38\xc9\xd8\xed\x8c\xc6\xcc\x9c\x15\x25\x13\xbc\x5e\x73\xd9\x76\xe2\xeb\xad\x0f\x37\xf5\x70", 228, { 0x19, 0xfd, 0x74, 0x3f, 0xff, 0x64, 0x2f, 0xff, 0xfa, 0x16, 0xbb, 0xd2, 0x16, 0x92, 0x6c, 0x7b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf0\x47\x3f\x69\x52\xb8\x77\x76\x86\x6d\xa2\x5e\xde\x26\x1c\x41\x3b\x43\x2c\x30\x34\xa6\x43\xd9\xe0\xb5\xd2\x5b\x41\x7f\xc5\x38\x4d\xf6\x9f\x68\x9a\x5a\x33\x8a\xa5\xb7\xfc\x36\xbe\x85\x1a\x6d\x94\x6d\xe9\x32\x59\x2b\x40\x32\x91\x8e\x43\x9e\x7d\x9d\xe6\x1a\x1e\xd4\xfe\xcd\xe8\x8c\x05\x99\x05\x78\x6a\x65\x42\x4b\x93\x95\x9a\x77\x70\x9b\x5d\x11\xbd\xa7\xfd\xd0\xd4\x7a\x75\x35\x2c\x58\x57\xc4\x72\x1c\x70\x70\x42\x65\x19\x14\x82\xee\x1d\x1e\x5b\xfc\x42\x46\xd5\xf0\x76\x7c\x0f\xfc\x98\xe0\x17\xf2\xdf\xeb\x6c\x38\xeb\xab\x0d\xd8\x66\x2b\x3d\xb4\x56\xf1\xd6\xd7\x03\xa0\x47\xe6\x7f\xbe\x2c\xb5\xd7\x90\x88\xf6\xd5\x22\xa2\x0c\x6e\x63\x79\xfd\xcf\x6c\xe4\x86\xff\xe1\x4b\x49\x30\x70\xfc\x22\xa8\x77\x2b\x97\x47\xc2\x89\x6d\xb4\x71\x7f\x57\x28\xf8\x07\xca\xd6\x41\x27\xec\xf6\xec\x0c\xaa\x6d\xb6\xbf\xe9\x1b\xf7\x86\xd4\xc0\x45\xd9\x54\x8b\x37\xff\x9e\x41\x44\x46\xe5\x07\xc9\xdb\x31\xcc\x29\x4b\x48\x55\x0e\x97\xc8\xe6", 229, { 0x8d, 0xe4, 0xe9, 0x8c, 0x60, 0x20, 0x2e, 0x6e, 0x67, 0x30, 0xe5, 0x90, 0xee, 0x49, 0x57, 0x5d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xce\xed\x56\x8a\xea\x09\xf1\x00\xb0\x28\x60\x42\x00\xa4\xca\xb2\x2b\x31\x64\xe4\xf7\xb2\x44\x02\xbf\xb9\x55\xe0\xb7\x9a\x63\x9d\x4e\x2a\x56\xf2\xac\x19\x7c\x1a\x5b\xe9\xff\x5e\x02\x8a\x75\x3c\x4b\x94\x96\x33\xe6\x20\x09\x2e\xa7\x44\x57\x8b\xcb\x28\x01\xc6\x58\xc9\xac\xc6\xa2\x4a\x7a\xc4\xe9\xf2\x75\xd4\x20\xc7\x25\x12\xc9\xc4\x41\x6a\xfb\xb9\x82\x03\x85\xc0\x92\x49\x2d\x57\x24\x95\x11\x1f\x1d\x7c\x2f\x30\xef\xb1\x00\x17\x07\x97\x3f\x6d\x5d\x67\xc7\x15\x28\xfb\x9a\x11\xb4\x35\xfe\x01\x4b\x0e\xc1\x3a\x50\x3f\x9e\x7f\x6c\x85\xb8\x5f\xdf\x95\x43\x2a\xf8\x9c\x42\x91\xa0\x71\x6a\xd9\x10\x5a\x26\xbc\xa3\x78\xb4\xdc\xc5\xd0\x6c\xe4\x0b\xf6\x21\x3e\x5d\x58\xa0\x6a\x4e\x24\x56\x02\x8c\xd7\x0e\x47\x73\x64\xd7\x66\xbc\xfd\x03\x4d\x52\x80\x4c\x25\x45\x81\x12\x6b\xd7\xf0\xc0\xae\xb4\x67\x4c\xe7\x3f\x13\xdc\x70\x08\x3c\x86\xa3\x5a\x72\x30\x10\xf0\x56\x97\x5a\xc7\x02\x6b\xae\x0e\x16\x96\xe1\x3a\x60\x9d\x26\x36\x27\x1f\x69", 230, { 0xe1, 0x2d, 0x4d, 0x4e, 0x25, 0xde, 0x0e, 0xf5, 0xcb, 0x99, 0x33, 0xe3, 0x45, 0x90, 0xf0, 0x1f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb8\x14\x7b\x4a\xaf\xbe\x8f\xb9\xd8\xd0\x9b\x2a\x70\xd9\x43\x75\x04\xb0\xb3\x4e\x64\x82\xdd\x5c\xb6\x7a\xde\xf7\xa6\x0b\x7e\x83\xbb\xdd\xd6\x64\xc5\x51\x0c\x9c\x72\xb3\x3a\x08\x01\xfb\x6d\x34\x0e\x40\xc9\xd6\x8b\xba\xca\xee\xcf\x72\xa5\x78\xc8\x88\xcd\xca\x4d\x21\x91\x90\x8e\xeb\xe2\x62\xad\x4e\x33\xff\x65\x30\x79\x29\xe8\x65\x52\x1c\xc7\xb2\x42\xac\x0b\x7c\x18\xfa\x61\x12\x6f\xd2\x71\x94\x50\xa5\x4f\x7e\xf5\x1e\x0a\xd5\xa8\x62\x63\xec\xca\xe9\x98\xd3\xf0\xf4\x5d\x5d\x28\xaa\xec\xcd\x59\xd3\x33\x1c\xc8\x30\x2c\xea\xb7\x74\x4b\xff\x28\xe3\x10\x7c\xbf\x86\xbc\xa2\xc5\x08\x20\x3e\x49\x31\x90\xb0\x61\xfc\xf7\x97\x8e\x56\x05\x1c\x3d\x76\x83\xd7\x6a\xd3\xc6\x61\x5f\xc7\x42\x77\x9b\xbe\x36\xc7\xcd\x1a\x85\x5b\xff\xa7\xa5\x9f\xd0\xb6\xb0\x10\xda\xd8\x98\x83\x32\x38\x78\x0f\x0d\x96\x05\x99\x7f\xdc\x23\xfa\x5f\x5e\x94\xcf\x47\xb3\xcb\xdc\xb8\x2a\xdf\x1d\x5a\xeb\x9b\x6b\x60\xac\xb2\xc8\x0a\x0c\x0f\x47\x44\x90\x4b\x9b\x6c", 231, { 0xfc, 0xbf, 0x92, 0xda, 0xc4, 0x1d, 0xb9, 0x19, 0x4f, 0x37, 0xa0, 0xbf, 0x95, 0xd0, 0x48, 0x08 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x37\x38\x3a\x31\xbb\x9a\x2d\x97\x67\xf5\x77\x16\x90\x82\x1f\xe2\xb1\x3b\xdc\x46\x27\x15\x5d\x2a\x85\x4e\x32\xb3\x95\xdc\x5a\x09\xec\x05\x69\x34\x29\x0c\x56\x1f\xca\x09\xdf\xbf\xaa\xd2\x99\x4d\x1b\x15\x98\xaf\x9c\x88\xb6\xf5\x37\x37\x84\xfe\x7a\xfc\xcb\x3b\x0f\x0d\xbd\x8b\xfa\xaf\xbd\x46\x6f\x09\xc8\x56\x4e\x13\x7e\x7f\x3c\xad\xd1\xbe\x5f\xcc\x49\xcf\xb5\xcf\xf1\xc9\x12\xf0\xe1\xe5\xb4\xd6\x69\x5c\x84\x46\xd7\x6e\xec\xfa\xe6\x7e\x4f\x8a\xc3\x5a\x29\x87\xbd\x99\xc5\xa7\x88\x1e\x95\x1a\x2d\xb9\x31\xfb\x92\xec\xef\xe2\xa1\xca\x1b\x96\x18\xfb\xd3\xe0\xed\xdd\x82\x7a\x5c\xc5\xf7\x26\x8e\x63\x21\xdc\xe7\x43\x69\x1b\xed\x70\xac\x61\xd0\x33\xd4\xb6\x9a\xf9\x12\x62\xf4\x52\xb9\xbe\x92\x16\xba\x28\x3c\xa2\xb8\x10\x7a\x40\xc7\x2f\xdc\xa5\xc6\xd8\xe3\x93\x56\x66\x8f\x9f\x76\xd5\x86\x0d\xbd\x6d\xde\xd7\x33\x99\x87\xcd\xcb\xd6\x58\xd6\x81\xc7\xb4\x54\x0c\x65\xd9\xa5\x41\x53\xc5\xc6\x04\x4f\xc5\x13\xeb\xc5\x9b\x2a\x70\x7e\x4b\xed", 232, { 0xfb, 0xcb, 0x4a, 0x19, 0x4e, 0xcd, 0x8d, 0x1e, 0x33, 0xad, 0xf0, 0x88, 0x02, 0xf2, 0x49, 0xb6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x75\x82\xa5\x8a\xca\xa4\x44\x66\xd0\x70\xc3\x44\x41\x52\xaa\x6c\x91\x46\xae\x89\x5f\x64\x74\x45\x08\x0c\x74\x81\x56\xae\xf9\x2e\x56\x36\x44\xcb\x47\x13\xd0\x7b\xae\xe3\xb1\xc2\x87\xbd\x16\xdc\x96\x1a\xed\xba\xdb\x60\xa5\x99\x23\x0d\x0f\x41\xbb\x7c\x5e\xd8\x40\x57\x4d\x60\x92\x9a\x5f\xd4\xe7\x3f\x42\xda\xfb\x8c\x4d\x24\x65\xf5\x28\x69\x05\xae\x8b\xfc\x9a\xd2\x1f\x06\x70\x29\x80\x65\x36\x99\x64\x1f\xee\x2c\xd5\x84\xfd\xba\x9a\xe0\x62\x33\xb4\xda\x03\x8b\x04\x6d\x23\x42\x0a\x80\xf1\x8f\xc8\x23\x3a\x28\xc5\x68\x3d\xb1\x2d\xdc\x9f\xbf\x15\xa1\x75\x87\xdd\x29\x7f\x27\xae\x91\x75\x91\x23\x98\x78\x10\x05\x3a\xab\x78\x2e\xed\xdb\xee\x8e\x77\x59\x51\x4c\x6a\xe9\x44\x04\x3d\xd3\xda\x2f\x09\x16\xdc\xa0\xdd\xbc\xb9\x2b\xbe\x49\x0b\x60\x3e\x4d\xc2\x75\xb7\x19\xef\x42\x25\x8e\x2f\x65\x9d\x11\xb2\x85\x6e\x9a\xe7\xb4\xd3\xec\xc6\xee\x51\xdf\xb9\xbe\xb3\xd9\x28\x00\xa0\x5b\xa0\xc1\xd6\xb7\x9f\x42\x05\xe0\xfe\x1c\x4a\x5a\xfb\x7d\x46", 233, { 0x6f, 0xa3, 0x9b, 0x06, 0x9a, 0x45, 0xa7, 0x4c, 0x93, 0x2a, 0xae, 0x07, 0x2f, 0x79, 0x54, 0x7f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x50\xe2\x90\xdb\xc4\x58\xfb\x83\xe0\x44\x82\x4c\x6c\x5a\xc9\x74\x59\x45\x36\x9c\x7a\x71\xf5\xac\x52\x72\x15\x44\x08\x14\xcf\xda\x77\x00\xe7\x75\x62\x07\x2c\x05\xc5\x0e\x19\x5c\x46\x96\x9e\xcd\xca\xe7\xf8\x60\x25\xd9\xbd\xaf\xe9\x3f\xf4\x60\x5f\xf0\x60\x3f\x94\x73\xde\xf6\x8a\x46\xe4\x6c\x90\xcb\x29\xb8\xac\xd0\x63\xc1\x34\xba\x2c\x74\x7c\x4d\xfe\xa0\xa9\x1a\x5d\x71\xa4\x85\x14\x87\x2a\x71\x97\xb2\x01\x8b\x87\x4c\x45\x30\x55\x33\xe1\xfc\xfe\x62\x19\xf0\xf4\x2c\x43\x3f\x1d\x14\x96\xb5\xf4\x4b\x1a\xc4\xce\xc7\xbf\x2d\x37\xfc\x8a\x48\x7b\x39\xea\xef\x40\xa2\x29\x0d\x50\xc6\xfe\xbe\x75\xdc\x3f\x23\x7d\x9f\xb3\xc6\x5d\xc3\x05\xa4\x72\x12\xd5\xdb\xe2\x28\xe9\xf1\x21\xc7\x81\xbe\x90\xd8\xc8\xf8\x40\xff\x66\x59\xd4\xd9\x32\x6f\x83\xd5\x05\x00\x3d\xac\xaa\x17\xe5\x7e\xf1\xaf\xbd\x8b\xe3\xfb\xe0\x8a\x0f\x50\xe8\xa9\x03\xb0\xaf\x22\xd7\xf4\x33\x77\xe3\x95\x93\x4a\x90\x17\x36\xdb\x4c\x12\x0b\x1e\x97\xde\xea\x78\x3b\xda\x19\x16\x98\x59", 234, { 0x10, 0x62, 0x10, 0x20, 0x9a, 0x5a, 0x01, 0xcb, 0x7e, 0x58, 0x93, 0xef, 0x8a, 0x77, 0xe5, 0xb3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xeb\xea\x1d\x2a\x84\x43\xd3\xc3\xb7\x08\x13\x09\x10\x91\x58\xbf\xed\x23\x2f\x88\xc7\x05\x4b\x9a\x8f\x43\xb5\x01\x33\xff\x20\x8d\x3f\x6e\x5a\x5a\xa0\x76\xdf\xfa\x85\xe2\x88\x41\x5e\x40\x61\xac\x06\x58\x97\x6e\xfd\x49\x90\x19\xce\x41\x15\xe6\x90\xd8\xaa\xa1\x87\x0a\xff\x33\xea\xcf\x7f\xcd\xbf\x59\x05\xaf\xe3\xea\xae\x92\x26\x4f\xc9\xb8\x92\xfc\xeb\x8e\xcc\xc5\x20\xfa\x94\x37\x3c\x47\x67\x91\x4f\xab\x44\x62\x36\x71\x8b\xc0\x4e\xc7\x00\x22\x44\x26\xef\xdb\x08\x59\x6a\x34\xe0\x2d\xae\x24\x99\xb4\xa4\xae\xd8\x35\x83\xd7\x8e\xb3\x92\x43\x8a\x18\x0b\x6b\x28\xff\x1b\x7d\x27\x1b\x07\xd1\x98\x46\x68\x03\xf3\x2a\x97\xb1\x44\x86\x23\xd2\x82\x1e\x7f\xb1\x00\x42\xb9\x86\xfd\xf8\x65\xaf\x56\xc8\x98\x90\x5b\x25\x10\x04\xbe\x73\x71\x7e\xa7\xb9\xaa\xc1\xe5\xe5\x76\x38\x40\xb6\xff\xf2\xea\x4a\x9d\x3e\x14\x44\xbb\xdf\x9c\x99\xda\xed\xe3\xf8\xaf\x48\xbd\xd4\x68\xb9\x82\x0f\x0d\xa6\x41\x44\x01\x72\x14\xb1\xa7\x6f\x8f\xbf\x21\x81\x52\x30\x33\x50\xbe", 235, { 0x58, 0xde, 0x89, 0x88, 0x29, 0xd3, 0x62, 0xe9, 0xc9, 0x41, 0x78, 0xc1, 0x0e, 0x4c, 0x32, 0xc6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe4\x46\x29\xc4\x48\x89\x72\xd9\x5c\x32\xc8\x06\x5e\xe2\xb7\x1b\x18\x27\x15\x03\xc3\x1b\xfb\x33\x97\x29\x61\x3d\xf0\xef\x55\x81\x1e\x3f\xd8\x02\xc9\x40\x55\x56\xff\xb2\xbf\xb8\xdc\x4f\x45\x38\xd5\x4c\xb5\x11\xa1\xff\x6b\x1b\xc4\x9a\xf3\x57\xb9\x15\x43\xa8\xbb\x2a\x8e\xa1\x30\x7a\xc6\x79\xb3\xcd\xb1\x1b\xbc\x77\xa7\x5a\xee\xd5\xe5\x42\xfd\xf7\x91\x8a\x3a\x58\x4b\x25\xbd\xc8\x6c\xf7\x2e\x6b\xde\xa5\x30\xda\x98\x85\x6a\x67\xb4\xb5\x32\x7d\x2e\x47\xd8\x26\x3b\x9a\x8d\xa7\x44\xc4\xef\x46\x7e\x2b\x32\x2c\x27\x33\xec\x64\x5e\x11\x7c\x03\x9f\xbe\x18\x62\xdb\x08\x73\x87\x30\xc2\x07\xa2\x4a\x1c\x04\xb3\x55\x0d\xd5\x49\x9e\xec\x4b\x64\xc5\x1f\x68\x7c\xa1\xea\xca\x9b\xb0\x69\xb3\xa5\x39\x99\xb1\xb8\x00\x90\xee\xae\xa5\xcd\x16\xbf\x9a\xaa\xe0\x44\xbf\xee\x3c\x96\x9c\x7f\x17\x15\x3a\x34\xce\x44\x9e\xc9\x2d\x12\xe3\xec\x22\x34\xf3\x74\x02\xad\xe2\xb1\x77\x6f\xe7\xde\x06\x1b\xf7\xb3\x39\xe5\x00\x17\x6d\x93\xbf\xf3\x3a\xa4\x3e\x22\x7a\x8d\xee\x84", 236, { 0x74, 0xb2, 0x77, 0xc9, 0x12, 0x1c, 0x72, 0xf0, 0xb8, 0x7a, 0x7e, 0xee, 0xce, 0x93, 0x97, 0xe0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\x1f\x5c\x32\xb7\x04\x93\xcb\xdc\x68\x0f\xed\x39\xb4\x59\xc0\x76\x75\x44\xac\xde\x5b\xc2\x2a\xc3\x5e\x63\xb8\x8f\xfb\x6c\xe6\x69\x9c\x90\x8e\x80\x16\x4e\x21\xf7\x4c\xe6\x1b\x6d\xf1\xf9\x98\x28\x6a\xbc\x01\xdd\xd1\xd8\xdf\x1e\x16\xe2\xd0\x60\x40\x72\x96\xa8\xd1\xe2\x4d\xd2\x48\xa5\xb5\x7e\xc0\x41\xad\x97\xb6\xea\xc1\x81\xe8\xbd\xda\xdf\x58\x95\x14\xfe\x70\x8e\xad\xe1\x3f\x14\x18\xe9\xe1\xa6\x31\x21\xfd\x2d\x8c\x24\x68\xf3\xe6\xab\xe8\x42\xbd\xb7\x13\x9a\xfc\x57\x55\x8d\xce\x17\x0f\x3b\x93\x05\xdd\x66\xf0\x61\xf0\x31\x01\xe0\x9a\x7a\xaa\x9d\xe9\xd0\x0b\x9d\x6a\x13\x11\xfd\x0f\xa7\x29\xba\x2b\x54\x10\x1d\x99\xbe\xc6\xc1\xfd\x7b\xa1\x42\x22\xd6\x7e\x84\x83\x20\x12\x9d\xe5\xad\x5e\x60\x21\x72\x41\x87\x00\x39\x27\x7c\x3e\x7e\xe0\xc4\xb1\xea\x8b\x09\x83\x69\xb1\xc2\x9b\xea\x6e\x81\x1b\xb2\xc9\xd8\x02\x5e\x25\xe9\xf0\x73\xd1\x89\x0a\xa3\xba\x11\xf4\x9f\x40\xc1\xfb\x93\x25\xd0\x55\x43\xa2\x14\x7f\xc0\x94\x4a\xc6\xc6\xd3\x03\xe2\xb5\xa4\x2c", 237, { 0x3d, 0xd8, 0x41, 0x6f, 0xd4, 0x1f, 0x87, 0xc7, 0x02, 0x20, 0x21, 0xd6, 0xeb, 0x2d, 0xd3, 0xc7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbc\x2a\x44\x38\x51\x3a\xa4\xec\xae\x4b\x35\xc6\x1b\x8e\xd9\x0b\x54\x1c\xf8\x6c\xf2\xac\xb4\x54\xe9\xef\x34\xd1\x2a\x88\x1d\x1c\x69\xab\x1f\xc6\xf9\x51\xab\x81\xd3\x15\xc3\x89\xb5\xaf\xe9\xad\x67\x0a\x39\xfe\x19\x03\x93\x12\xe8\xc0\xf0\xf5\x7f\xab\xd6\xae\xda\x0a\xe6\x69\x26\x3d\x93\x46\xc4\x93\xed\xbd\x6d\xc8\x9b\xab\x6f\x1f\xe7\xfe\x16\x18\xf4\xfa\x26\xcf\x0a\x25\x84\xf1\x12\xd5\xf4\x5b\x1d\x54\xfc\x51\x1e\xad\xe8\x57\xb8\x16\xe7\xaf\x32\xf9\x53\x70\x88\xa1\x0e\x40\x9b\x7e\x07\xae\x88\x14\xdc\x2e\x15\x86\x9a\xb2\x47\xbb\x9f\xe1\x12\x2a\xa1\xf6\x28\x48\xc7\x38\xf3\x8b\xf5\x11\x9d\x19\x25\xce\x4c\x12\xf0\xf2\x6c\x77\x2d\x37\x24\xb5\xb0\x22\xea\xd2\x34\x42\x32\x33\x53\x05\x41\x07\xb1\x36\x21\x54\x39\x16\xad\x9c\x7f\x16\xcc\x2b\x45\x2f\xba\x00\x19\xdf\x82\x56\x1b\xc1\x88\xcd\xdd\xc7\x42\x3a\x63\x16\x07\x08\x49\x7d\x00\x49\x04\x93\x3b\x5d\x41\x6d\xde\x3d\x69\xf9\x78\x65\x46\xfb\x73\x5c\xbf\xa1\xa6\xe1\xbf\xc4\x07\xb4\x34\xbe\x7d\xfd\x34\xe2", 238, { 0xe4, 0xf0, 0xa4, 0xab, 0x6f, 0x2a, 0xdd, 0x87, 0x83, 0xbb, 0xc7, 0x5c, 0x71, 0x24, 0x8f, 0x1b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd4\x5d\x39\x9c\xca\x90\x8d\x26\x46\xbc\xc1\xe4\xa8\x58\x57\x5e\x3b\xbc\x7f\xd7\xc7\x41\xfe\x8e\x44\x14\x2b\x91\xa9\x9c\x14\x38\xe1\x85\xbd\x45\xdf\x69\x88\x96\xc9\x1b\xb0\x84\x4f\x8f\xef\xdc\x1f\x69\x40\x78\x71\x20\xbf\x79\xbd\xcf\xac\x22\x8d\x98\x8e\x54\x6c\xb5\x74\xa2\xfe\x1d\x57\x10\x29\xcf\x9b\x6d\x71\xbd\xb4\x4a\x62\x58\xe5\x96\x26\xb4\x24\xd7\x36\x58\x1a\x07\x2d\xa5\x46\x09\xb8\xe1\x41\xc6\xaa\xde\x1c\xe9\x2c\x4b\xe5\x33\x12\x97\x49\x7b\x48\x7d\x53\x46\x6b\x31\x53\xff\x74\x25\xda\xd3\x8f\x78\xe1\x2b\x0a\xfc\x09\xc7\x69\xe2\xfc\x74\x96\x04\xf3\x69\x35\xcf\x52\x44\x16\xcb\x6e\x9c\xc4\xc9\x6e\x42\x3a\xa8\x4f\x19\xb5\xc3\x01\x8f\xa5\xfa\xaf\xb7\xbd\x5c\x1c\x05\x29\x6e\x29\xa5\xdf\x1b\x73\x78\x0f\x37\x19\xac\xb4\xb1\x9b\xf6\x4c\x55\xdd\x6f\xa4\x3c\x4b\x08\xcd\xd1\x17\xab\x2b\x80\x9e\xf0\xab\xfc\xe9\x79\x14\x2d\x50\xeb\x77\xb5\x38\x89\xc1\x1e\xfc\x6e\x6f\xa2\xe9\x67\x60\x95\x64\x6b\xc6\x73\x27\xb8\x36\x82\xa8\x8b\xe0\x24\x9a\x7b\xd8\xbb\x8c", 239, { 0x70, 0xdd, 0xb0, 0x46, 0x25, 0x38, 0xe4, 0xdd, 0x2a, 0x78, 0x64, 0xf0, 0x7b, 0xdc, 0x71, 0xa8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x72\x92\x38\xb0\x49\x6d\x43\xb7\xff\x66\x01\xd7\x96\xed\x84\xee\x8b\xd4\xd5\xc0\xf0\x64\x96\x5d\x27\x8a\x57\x9e\x3d\x2f\x78\xcd\xe0\xa5\xb6\x64\xff\x3d\x53\xee\xfc\xf5\xe6\x0a\x90\x4e\xbc\x8f\x3c\x3c\xea\xc9\x68\x37\xf1\xe0\x1a\x6f\x0c\x59\x54\x1c\x18\xb6\x0a\xf3\x20\x39\xbe\xb4\x85\xc7\xba\xe0\xc6\xe7\xea\x89\xf2\xe9\x53\x41\xa7\x23\x34\x34\xc5\x57\xb7\x52\xb5\x30\x54\xa4\x4f\xeb\xc3\xc0\x6d\x13\x9b\x58\x0a\x64\x8c\xec\x15\xd1\x35\xa0\xd8\xa2\xa3\x28\x00\xb5\x68\xdf\x48\xe4\x53\xf7\xc6\x87\xd1\xcb\xd2\x10\xdf\x51\x8f\xd5\xab\xab\x17\xeb\xc7\xdc\x47\x2d\x08\x98\x24\x5c\x01\x34\xe8\x60\x17\xbc\xad\xad\x41\x23\xb5\xc1\x5f\x95\x54\xc9\x33\xe9\x7a\x64\x00\x32\xe1\x7f\xbd\x74\xcf\x5f\xf6\x74\x88\xbd\x40\xa9\x54\x0b\x57\x4e\x28\xd5\xd6\x99\xf4\x43\x91\x05\x88\xbb\x92\xcc\x24\xa3\xaf\x71\x9a\x44\xc5\x79\x22\xca\x93\x39\xba\x67\x35\xcb\x38\x98\x3a\x1a\xee\x80\x65\x1d\xf8\x70\xfd\x21\x24\x88\xd1\x3e\x7f\x76\xcc\xeb\x78\x5d\x30\xae\xb3\xd2\x72\xec\x6d\x00", 240, { 0x77, 0xeb, 0x85, 0x90, 0xee, 0xde, 0x0a, 0x48, 0x59, 0x1f, 0xe2, 0xa5, 0xa9, 0x24, 0xea, 0x47 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb2\xde\x87\xeb\xd6\xa4\x31\xd1\x42\x74\x34\xad\x36\xeb\xdb\xd5\xc3\x84\x7f\xc3\x6b\x26\xae\xf0\x54\xd7\xf8\xdc\x29\x8f\x55\x2b\x8e\x27\x36\xe9\x3d\x70\x26\xee\xc2\x60\x1d\x5d\xcf\x68\x62\x46\x3d\xe1\x19\x6b\xa0\xa4\x70\x20\x85\xb8\x62\x4b\x4a\x26\x27\x8b\x9a\xe9\x39\x76\x85\x02\x02\xfa\x38\xa7\x27\xe4\x5d\x9b\x6b\x7f\x12\x99\x41\x55\x7e\xea\xf3\x11\x16\x16\x68\x84\x6b\xb7\x95\xc6\xac\x69\x83\x75\xc0\xdd\xf8\x19\xf8\x0d\xc5\xa8\x75\x8a\xac\x25\x16\xf1\xeb\x62\x1b\x7c\x69\xe7\x5b\xb4\x7c\xeb\x1e\x44\x55\x7f\x98\xe9\x09\xca\x03\x86\x3c\x6f\x57\x54\x6c\x0b\xa9\x37\xd7\xda\x1e\x2b\x0a\x79\x8a\xdd\x08\xc6\xa9\x56\x13\xe3\xf8\xd2\x1a\x5a\x31\xaf\xbe\x5a\x62\x81\x02\x20\xa9\x42\x8f\x71\x8e\xa7\xa2\x43\xfd\x8d\x93\x7c\xde\x92\x03\xd2\x53\xc1\xa0\xd1\x8d\x65\x97\xfb\x4b\xfe\x98\x09\xf1\x52\x7f\x50\x41\x9a\xa4\x3f\xb8\xdd\xc0\x04\x87\x5b\x7a\x4f\x2c\x1f\x8d\x2f\xad\xb8\x98\x18\x71\x01\x83\x05\xbb\x1b\x88\xba\xc3\x7c\xe5\x23\x73\x21\x1d\xd8\xbb\xdf\xe5\xc2\x91", 241, { 0x54, 0x10, 0x15, 0x52, 0x9c, 0x0e, 0x89, 0x84, 0xd4, 0x90, 0xfc, 0x2a, 0x5b, 0x5e, 0xf2, 0xed }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd7\xb2\xd7\x89\x08\xdd\x01\x0c\xff\x6f\x1c\x38\xa9\x8f\x1e\x54\x49\x85\x52\xee\x84\x6a\xbd\x93\x9a\x6e\xa1\x2b\xaf\xc6\x1f\xee\x47\x30\xf7\x07\xd1\x24\x6c\xc3\x5a\x99\x43\x76\x62\x70\xe9\xeb\xcc\x81\xb4\x85\xee\x41\x42\xf6\xc9\x0d\xfe\x9b\x52\x15\xc1\x73\xef\xe7\x94\xbb\xfd\x97\x94\x27\x8e\x89\xee\xbe\x30\xdb\x0a\x52\xe8\x71\xc5\x9b\x3e\x9e\xd6\xf0\x72\x6b\x52\xa1\xcc\x88\x4a\xf3\x11\xcd\x92\xb9\x11\x6b\x9d\x8b\x5e\xb3\x84\xa6\x17\x83\x25\x60\xe2\x49\x68\x46\xf8\xb5\x9d\xd4\x59\xff\x01\xcf\x21\xd2\x60\x43\xf3\xd4\xd4\x15\x91\xd2\xab\x44\x8e\x8d\x67\xc0\x1a\x1b\xde\xe7\xfd\xfc\x82\x98\x9f\xba\xbb\xf6\x43\x3b\x70\xbb\x54\xa7\xa5\x36\xd8\xf0\x3e\xe2\x01\x02\xe2\xa5\xe2\x89\xfb\xa2\x3f\x59\xd9\xbb\x7d\x7f\xf6\xa6\xb8\xe2\x54\xaa\xf3\x94\x03\xf7\x6a\xbb\xbf\xa0\x04\x16\xb5\x36\xe5\x2e\x66\x02\x1f\x1c\xa5\xde\x88\xf1\xba\xb0\xa6\xc5\xa9\x84\xc7\x5f\x8d\x45\x2e\x7e\x1d\x18\x67\xc2\x50\x56\xbc\x3a\x1d\x24\xc0\x8b\x5c\xb0\x08\xb9\xc8\x09\xfa\x95\x25\x9b\xbd\xc3", 242, { 0x58, 0x95, 0xff, 0xfc, 0x90, 0xfc, 0xfe, 0x6c, 0x68, 0xf7, 0x0c, 0x90, 0x74, 0x06, 0x60, 0xaa }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7e\x46\x50\x67\x88\x1b\xb7\x6c\x23\xb3\x4f\x70\xfe\x2b\x43\x4f\x59\xbf\x17\x4b\xe6\x02\x61\xd5\xc9\xb7\x98\xfb\xbf\x50\x05\x6d\x5a\x00\xd6\x2d\x6a\x7f\x51\xd3\x78\x5a\x26\x7a\x6c\xf4\xdd\x4b\x4e\x1d\x6e\xa3\x29\x4c\xef\xe4\x0b\x7c\x68\xd5\x2a\xa1\xc2\xb7\x21\xc6\xde\xe5\x57\xc5\xc3\x26\x81\xa2\xef\x93\x3d\x84\xce\x1f\xdf\x50\x49\xc8\x49\xe3\x75\x59\xf3\xec\x6c\xd9\x0b\x65\x39\x94\xb6\xac\xed\xc3\x74\x42\xce\xda\xa1\x1e\xaf\x6f\x17\xaf\x5b\xc2\xf1\x6d\x2b\xed\x6b\x1b\xb7\xa9\xe5\x9b\xa9\xba\x06\x6d\xad\xf8\xfd\xc6\x84\xfc\xe3\x49\x38\x63\x3d\x64\x6a\xc2\x9d\x4a\xc7\x26\x67\x88\x99\x46\xb1\x46\x7a\x48\x44\x1d\x23\x2c\xc0\x8f\x62\xd9\xdb\x27\x2a\xc2\xc9\x2e\xc4\x35\xb8\x07\x24\x40\x73\x28\x56\x40\x26\xb5\x17\x07\x41\xbb\x80\xa9\x75\x05\xdd\xe3\xdb\x9f\x9c\x29\x34\xe5\x61\x4b\x4b\x46\x37\xc3\x77\x9b\xe0\x9d\x3c\x1e\x4d\x03\x11\x08\x29\x64\x3d\xcb\x8f\x41\xdb\xe9\xdd\x94\xfc\x6f\xa0\xdd\xeb\x12\xae\xca\x8b\xe4\x53\x82\xdd\xb3\xa3\x8e\x9e\xff\xef\x64\x0d\x95\x52", 243, { 0x55, 0x8a, 0xc2, 0x51, 0x47, 0xe1, 0xcc, 0x16, 0x28, 0xb4, 0x10, 0x71, 0x27, 0x29, 0xa8, 0xba }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x92\xcb\xcc\x6b\x83\xda\x5b\x25\xf1\xc8\xd6\xb1\xe8\xe5\xc3\x95\x73\xaf\x5d\xde\xe5\x4f\xe4\x71\xc5\x3c\x9f\x80\x57\xfe\x70\x18\xc3\x0d\x12\xd6\xe5\xd8\xf1\xba\xb0\xe1\xa5\x13\x3f\x05\x0d\x9a\x7a\xd9\x04\x9b\x61\x30\xc3\x4e\xf8\xba\xd3\x44\xcf\xc7\xac\xfd\x2d\x29\xef\x96\xd9\x36\x3d\x9f\x84\xec\xb2\x0b\xd6\x30\x02\x41\x13\x2f\x2e\x4f\x6a\xe5\xe2\x3e\xda\xbc\x6e\x80\xc1\x4c\x5f\x86\x03\x41\xba\x6e\xd3\x5a\xd4\xda\x21\x8e\xd1\xdc\xa0\x49\xb7\x0d\x73\xd4\x2e\xbd\x73\xd2\xd6\x44\x1f\xe6\x45\x77\x21\x72\x9b\x36\x79\x7b\xc4\x23\x48\xa8\x4a\x6d\x3b\x69\xd4\xca\x92\x35\x40\x83\xcc\xeb\x58\xa9\xf1\x5a\x33\x65\x7c\xdc\x2b\x6d\xe2\x1d\x76\x93\xc3\xf9\x63\x77\xac\x84\x33\x5d\x87\x23\x92\x19\xa0\xd7\xb0\x27\x54\x9a\x01\xd7\x58\xe2\x8d\xa5\xa3\x42\xf4\xa7\xf9\x30\x02\x1f\x16\xe1\xeb\x30\x73\x50\x23\xae\xb7\x5e\xdc\x0e\xbd\x14\x1d\x7c\x3e\x04\x7c\x0c\x1b\xcd\x78\x08\x4a\xbc\x75\x68\x5a\x8f\x54\x5f\xa4\x56\xae\x12\x10\x73\xae\x64\x81\xc0\x88\xec\xde\xcf\x9a\x08\xbe\x4c\x1d\x0b", 244, { 0x25, 0x5e, 0xd3, 0x6f, 0x90, 0x16, 0x46, 0xa9, 0xa0, 0x75, 0x89, 0xa0, 0xd2, 0x74, 0x1b, 0x84 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaf\x7f\x88\x91\x24\xee\x81\xf4\xf8\x20\x80\xd7\xa3\x7b\x03\xdf\xf8\x4f\x68\x82\x98\xec\x6a\xf7\xf7\xed\x3a\x4d\x08\x98\x39\x98\x88\x5d\x50\x46\xe4\x7c\xed\x8f\xc8\xc4\x9a\x0b\x46\x76\x3b\x5d\x9f\x48\xe4\x0d\xb0\x85\x55\x74\xfb\x51\x13\xd0\x51\x0b\x24\x77\x1a\xcb\x66\x29\x41\x0b\x8c\x7e\xbe\x61\xb6\x7e\xc1\x6a\xac\x4f\x78\xc3\xb8\x09\x7d\x31\x1d\xa6\xdf\xe0\x37\x15\xcb\xc9\x30\x6d\xd8\x2c\x5c\x3e\xec\x3d\x32\x04\xcd\xdb\xe8\xb5\x48\x7b\xaa\x7a\xf8\x23\x76\x7a\xb3\x93\x97\xd1\x97\x7e\xbb\x9f\xac\xf5\xb3\x3d\x36\xe5\xc8\x8b\x9a\xb7\xb4\x65\xea\x15\x44\x34\x0f\xcd\x88\xa0\x92\xce\xb3\x63\x07\x4e\x96\x39\x16\x0e\xb4\xf4\x27\xb5\x01\xab\xa9\x59\x3c\x12\x00\x1d\xe6\xe6\x09\xf4\xdd\x7f\x4b\x84\x9a\x87\xbb\x25\x04\xc9\x2b\x08\xee\x23\x51\x75\x34\x96\x70\x2c\x6d\x7c\xa5\xed\x4d\xd9\xd0\x13\x9a\xc9\x1d\x5c\xc9\x19\x2e\xc4\x35\xf2\xe7\x8e\xfb\xb1\xd5\x64\x74\xd2\x3c\x96\x50\x0a\xbb\x7e\x4b\x73\x9e\x04\x8f\xe2\xc0\x3e\xa6\x54\x1b\x2f\x1a\x87\xee\xb0\xac\xa6\x89\x6d\x2d\x1c\xb8", 245, { 0x5e, 0xd5, 0xdf, 0xa5, 0xd4, 0xe1, 0xeb, 0x5b, 0x7e, 0x24, 0x12, 0xa1, 0xd3, 0x55, 0xba, 0x11 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x06\xfb\x8a\xca\x55\x1c\xd3\x3d\xcf\xf0\x54\x07\x03\x96\x31\x83\x40\xde\xcb\xf7\x54\xe6\x4e\xbe\x6e\x53\x66\x17\x25\x2e\x11\x88\x92\x58\x8f\xf0\x97\xab\x77\x28\x43\xaf\xe4\x55\x4e\xf6\xcc\xce\xbf\x15\x70\xa4\xad\x3f\xef\xd2\x21\x7f\xf6\x02\x1b\x92\x92\xfa\xac\x5e\x26\xa1\x40\x13\x78\xb2\xfe\xdd\xe5\xfc\x48\x43\xb5\x53\x5d\x1f\x89\x17\x1e\x3a\xf1\x5e\xee\x83\x1a\xc1\xb2\xec\xa5\xc0\xf7\xe2\x92\xd3\x33\x67\x5b\x0e\x24\xcd\x1d\x6f\x55\x10\xf1\xc7\xbf\xd1\x5a\x43\x8c\xeb\xd6\x97\xf7\xb4\x97\xc6\x4f\xd2\x4c\x90\x19\xb7\x18\x77\x55\xba\xa4\x70\xd9\xd3\x50\x23\xda\xf3\x84\xdf\x8a\xfe\x25\x1e\xdb\x66\x24\xaf\x61\x65\x30\x86\x55\xd7\x8b\x1c\xb5\xb1\xfa\x84\x89\x22\xd6\x0c\x41\x44\x40\x8c\x3b\x7f\x72\x4e\x60\x7b\x30\x99\xee\xbf\x5c\xdc\x50\xeb\xa9\x74\x29\x8e\x68\x1a\x6f\xa5\x7e\xec\xb4\xb1\x77\x16\x81\x73\xb3\x1d\xdb\x47\xbe\xc8\xe7\x1a\xbe\xab\xa9\x0a\x05\x51\xe8\x99\xc7\x05\x2e\x8c\xe5\x3d\xeb\x66\xe7\xa4\xb9\x7c\x09\xc3\xbb\xb5\x6c\x4b\x1e\xe0\x6d\x01\xc1\xb2\x13\x46\xf1\x5a", 246, { 0xf1, 0x29, 0xb7, 0xfb, 0x81, 0x56, 0xef, 0x46, 0xb7, 0x0b, 0xc5, 0xc2, 0xbe, 0xbe, 0xb5, 0x5b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa2\x42\x4d\xc3\x4c\xad\xc9\x66\x07\x39\xce\xc9\x7a\x9f\x7d\x97\x11\x45\x14\x5d\x30\x89\x6a\xdf\x83\xad\x94\x15\x74\x5f\xaa\xc5\xb6\xe3\xa3\xbe\xfe\xdf\x5d\xae\xd2\xc3\xba\xa1\x7a\xd3\xe4\x16\x12\xd2\xb0\xbf\xc1\x4c\x20\xd6\x04\x81\x03\x17\x24\xe9\xb7\x5e\xc6\x68\x0f\xdd\xa1\x10\x4f\xf9\x4a\x8d\x54\xc2\x2b\x31\xd1\x0d\x92\x9d\xb3\x30\xe5\x08\xa6\x5a\xf4\x2f\xb1\x8c\x67\xd9\xfd\x38\x56\x06\xb3\x74\xf7\xb4\x03\xdb\x72\x4d\x40\x01\xd1\xb0\x28\x90\x13\xda\x42\x04\x60\x31\x60\xff\x56\x6d\x44\x49\x81\x23\x5f\x68\xea\xf0\xb4\xd8\xc6\x3e\xdc\xe8\x4f\xb6\x22\x31\xb0\x42\xce\xb3\x1a\xbd\x7f\x8d\xf4\x3a\xb1\x59\x2f\xee\x5f\x22\xb7\xbb\xc2\x02\x05\x59\x37\x5d\xd1\x23\x3e\xb4\xe5\x7c\x9e\x26\x0d\xdc\xa7\x8a\x2b\x7b\x90\x21\x67\x98\xfe\xfb\x83\x66\xa6\xe9\x4c\x94\x09\x1b\x2c\x77\x5e\x55\xdd\xd7\x8e\xd2\x38\x53\x59\xb5\x2c\x71\x96\x28\xca\x46\x97\x14\x7c\xbe\xaa\x7b\x56\x89\xbc\x75\x84\xa3\x19\xc5\xe3\x7d\x4f\x17\xad\xcd\x30\xd8\x4c\xef\xf5\xb2\x4f\xf6\x7f\xa3\x7a\x54\xb9\xb9\xf7\x21\x1a", 247, { 0xca, 0x55, 0x81, 0x7c, 0x31, 0x59, 0x07, 0x16, 0xf7, 0xce, 0x7f, 0x9d, 0xf9, 0xbc, 0x6d, 0xb1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6c\xab\x0b\x47\x97\xa4\xdb\xd5\x15\xae\xa0\x2c\xf4\x05\x7a\x87\x59\x24\x05\x17\xf0\xbc\x5f\x47\x0d\xc0\xd8\x1b\x64\x9d\x35\xb2\x61\x87\xa1\xea\x25\xef\x31\x22\x1e\x11\x12\x1a\x42\xa9\x52\xf7\xe8\xc5\x47\x64\x43\xb6\x9f\xd2\x7b\x20\x06\xdf\x6a\x31\x6e\xd5\xf0\xee\xfe\x49\xf3\xa9\x99\xe4\xf6\x8f\x09\x3e\x55\x5e\xc8\xe6\x1a\x33\x6b\x7e\x7f\x81\xac\x03\x01\x1e\x12\x2b\x1e\x77\x3f\xe7\xab\xe4\xd5\x08\xd4\x16\x06\xfe\xb0\xad\xb8\xbb\x7f\xe6\x51\xb5\x84\x72\x24\x0b\x79\x62\x77\xbf\xb4\x3d\x30\x21\xd4\x34\x1c\x4d\x27\x6d\xdc\xcb\x9c\x7b\x6d\x54\x5f\xef\x52\xb4\x17\x08\x60\xcb\xb8\x85\x26\xad\x05\x9b\xf7\xe9\xa6\x03\x95\xe7\xe1\x2a\x7b\x6a\xf8\x8c\xc7\x36\x1f\x1b\xc2\xcb\x19\xd9\x0d\x4f\x6e\x85\x6b\x89\x4b\x71\x25\x09\xf6\x72\x1e\x66\xec\xf2\x73\xa0\x98\x20\xce\xa4\xb2\x46\x48\xed\x32\x3a\xf8\x47\xf0\xee\x1d\xae\xda\x23\xe3\x56\xd1\x3a\xd6\xc4\x20\x2b\xe0\x19\x99\x8e\x00\x6f\x4e\xd7\x8a\x5c\xe9\x9f\x14\x94\xa9\x1d\x04\xab\xf9\xb3\xb4\xf7\xaf\xa5\x3f\x93\xde\xe4\xeb\x81\x58\x09\x33\xe7", 248, { 0x1c, 0x9e, 0x80, 0x30, 0x66, 0x3c, 0xf5, 0x9d, 0x8e, 0x03, 0x83, 0xcf, 0x5c, 0x89, 0x97, 0x74 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc3\x5d\x6f\x7a\x56\x15\x22\xf8\x31\x9b\xe0\xcf\x57\x07\xda\xdb\x49\xac\x08\x4d\x3f\xcf\xf1\xa7\x05\x73\x1a\xe3\x71\x50\x09\xb3\x7d\xe1\xf4\xe4\x05\x9c\x0b\xdc\x1e\x3d\x5f\x42\x10\x3c\x6d\xbc\xf2\x5d\x4b\xd3\xe1\x66\x6e\xf4\xdc\xea\x16\x90\x3f\x44\x56\x62\xda\xa0\xc3\xd0\xae\x33\xb9\x6b\x43\x8a\x45\x91\xa9\x00\xb2\x32\x09\x4a\xb3\xaf\xe6\x2c\x2a\xde\xf6\x4e\x93\x2a\x97\x29\x10\xd8\xf0\x1c\x11\x64\xa5\x9b\x9f\x0a\x36\x87\x46\x60\xf5\x98\x9d\x20\xa2\xf6\x73\x04\xa4\xe7\x98\xca\xe6\xa3\x45\x57\x4c\x44\x29\xf8\xd1\xd9\x10\xc3\x3f\x9a\x32\x1c\x89\x35\x16\x53\xc8\x47\x21\x6b\xd0\xe6\xbf\xf6\x6f\x5b\x2d\x1c\x42\xed\xe0\xba\x33\xd8\x95\xa6\x92\x5d\xf6\x11\xcf\xf3\xe6\x06\xd2\x9b\x69\x0f\xf7\x51\x33\xf6\xa9\x9e\xcc\xa9\x9a\x4b\x5c\x37\x9c\x30\x19\xf7\x1f\x2a\x49\xc7\x48\x2a\xf6\x72\xaa\x6a\x2e\x2b\xa3\xbb\xf4\x36\x55\xfb\xc7\xa6\x40\xa2\xcc\x41\x79\x7b\x9a\x7f\x89\x6f\xa2\xb1\xe5\x7c\x39\x3f\x05\xc5\x44\x0a\x22\xc4\x7f\xf0\x91\x9b\x6a\x6d\xb7\x87\xd0\x5e\xa8\x75\xf5\xe1\x61\xaf\x5b\x59\x9d", 249, { 0x41, 0x95, 0xad, 0xac, 0x33, 0xb1, 0xf3, 0x9e, 0xa2, 0x05, 0x82, 0x08, 0xb3, 0xc7, 0x1d, 0xbc }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaf\x31\x8e\x57\x14\x59\xf1\xde\xb2\x14\xfd\x8e\xc4\x4d\xb8\x30\x3c\x7f\x59\xf0\x3b\x43\x03\xf7\x9d\x79\xaf\xa5\xab\x13\x29\x6c\xf4\x79\x31\x4c\x35\x9c\xc2\xe6\x75\x9b\x6f\x40\x2e\x0b\xe8\x14\xa5\xe7\x9c\xd5\x5b\x14\x79\x3f\x9c\x8e\xce\x99\x34\x35\x52\x8a\x41\x2e\x3e\x95\x24\xf7\x95\x33\x91\x0b\x84\x8c\xc6\x2e\xe3\xd1\xd9\x56\xdb\x39\x29\x36\xa2\x95\xf6\x68\x62\x92\x0d\x35\x39\x8b\x9c\x04\x59\x09\x24\x5e\x4e\xd8\x8c\x9a\x60\xc6\x51\x2a\x0e\xfb\xdb\x80\xbb\xf0\xeb\x9e\x65\x0e\x31\x39\x8f\xe3\xfb\x89\x41\x03\x07\xb0\x26\x79\x79\xc4\xd3\xe9\xe8\x7b\x27\x43\x92\x72\xcd\x26\xb0\x1a\xde\xcf\xe5\x3f\xa4\xbc\xcf\x36\x7a\xe1\xc0\xa3\xcf\x86\x87\xe4\x49\xbb\x67\x1e\x05\x79\x29\xe2\xfd\x57\x4d\x7b\x83\xe5\x5c\xd6\xea\xa9\x59\x0e\x43\xb4\x56\x94\x45\xdf\x22\xf8\x46\xa7\x20\x56\x66\xa2\x33\x5f\xcb\x9d\xd5\x03\x06\x55\x47\xb8\x94\xce\xe3\x6a\x81\x52\x8d\xff\x27\x09\x48\x85\x15\x32\xe4\xfb\x0b\xfc\xd5\xb9\x21\x03\x20\x7d\x06\x6a\x6e\x12\x66\x91\x43\x9e\x65\x73\x48\x89\x49\x9f\xc4\x06\x34\xd1\x29\x3f", 250, { 0xc2, 0x69, 0xc7, 0x4f, 0x4c, 0x81, 0x48, 0x5e, 0x87, 0x0f, 0xfb, 0xfe, 0xda, 0xfa, 0xa7, 0x72 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0e\x2d\xcb\x21\x81\x17\xab\xc1\x1e\xb1\x72\x69\x9d\xf2\x79\x44\x41\x60\x05\xa1\x5a\x6a\x90\xe7\xe4\x64\x42\x16\x4d\x1f\x7f\xf5\x54\x24\x9a\xde\x0d\x8d\xa7\x22\x01\x81\x6d\x1a\x72\x4a\x7a\xcb\xbb\x15\x51\x35\xd6\x45\xbf\x38\xf8\x73\x4c\x24\x57\x06\xcc\xdc\x0b\x6c\x15\xa5\x12\xf2\xca\x90\x6e\x46\x56\x82\x69\x86\xf5\xdd\xf9\x04\xec\xcd\x3e\x99\xd9\x31\x27\xa3\x25\x23\x35\x9c\x95\x26\x58\x58\x00\xeb\xf5\xdb\x1b\xc0\x09\xd4\x70\x96\x67\xba\x6d\xad\x1d\x82\x99\xde\xf5\xfa\xe1\x84\x17\xc5\x11\x08\xcc\xf3\x5e\x08\x5d\x3c\x20\x24\x1a\xda\x9d\x65\x76\x00\xff\x49\x4f\xfa\x68\x6f\x4c\xe2\x1c\xdb\x60\xfc\xdd\xe7\x6b\xaf\x54\xc7\xff\x21\xab\xb7\x3f\x6d\x37\xc3\xe4\x84\x53\x32\x59\x9d\x48\x90\x06\x5a\x68\x57\xab\x79\x3a\x3a\xe2\x33\xcf\x0d\xc6\x34\x33\x54\xb3\x38\xff\x66\x23\x3f\x0c\x3d\xb7\x6c\x42\xdd\x57\x80\x8e\x5f\x70\xed\xf2\x9a\x5c\x9a\xb6\x6c\xe0\x33\xbc\xaa\xce\x29\xf1\xa2\xcb\x4d\xdf\x49\x2b\x04\x60\x06\xf8\x28\x6e\x1a\x12\x7c\x15\xaa\x70\xc9\x89\x6a\x84\x99\x54\xe8\xbd\x8f\xa7\x72\x26\x61\xd2", 251, { 0xdd, 0x00, 0x50, 0x61, 0xae, 0x25, 0x19, 0xe0, 0x00, 0x24, 0x84, 0x43, 0x02, 0x6f, 0x1c, 0xd4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa5\x2c\x74\xcf\x94\x7c\x13\xf9\x91\x0b\x4b\xda\x9b\x2f\x65\x21\x64\xeb\x01\xb3\xfd\x48\xcb\xd8\x20\xde\xdd\x96\x1a\x72\xb1\x1b\x53\xb9\xc1\x53\x7b\x3b\xbd\x9a\x53\x53\x68\x8b\x15\x53\x10\xf7\x81\xc4\xa8\xf2\x86\xca\x83\x07\x89\xa6\xaf\x8b\x54\x56\xec\x0f\x9e\x57\x48\xef\x33\x8a\x58\x07\xc0\x34\x15\x86\x3d\x20\x50\xda\xf7\xdf\xd3\xcb\x39\x30\x16\xa4\x96\x7a\x9b\x8b\xd6\x76\xe7\xf2\x7b\xe9\x1d\x26\xee\x8f\x38\x05\x4b\x14\xe4\xcc\xc6\x3b\xfa\x0e\xb8\x22\x96\xc1\x4a\x9c\xd7\x73\xbc\xbe\x33\x9a\x53\x76\x74\x08\xdd\x54\x53\x7d\xe2\x6c\xaf\x57\x69\x54\x6a\x64\x64\x49\xe1\xd8\xb9\x6e\x06\x5a\xed\x34\x1b\x38\x6f\xd5\x0c\xbc\x7f\xf9\x6a\x96\xb9\x7c\x00\x78\x42\x47\x14\xc1\x8d\x5b\x3b\x51\xcb\xec\xd9\x7b\xed\xaa\x35\x18\x57\x1a\x35\xb8\x22\x23\xba\xf4\x0e\xa5\x9a\xdf\x03\x44\x36\x9b\x42\x43\xb8\x07\x2d\x8a\xeb\x96\xaf\xca\xb7\x3b\x49\xb7\x37\x80\xba\x74\x79\xb6\x4b\x0d\xd1\x47\xb4\x1d\xda\x27\xae\x90\x0b\x69\x16\x83\xf1\xee\xbb\x48\x0e\x38\xc4\x85\x4e\x5c\xc1\x7c\x22\x16\x4c\x65\x3c\xf7\x5b\xf7\xe5\xb9", 252, { 0x93, 0x1d, 0xc4, 0x3f, 0x9e, 0x01, 0xe4, 0xa0, 0xba, 0x31, 0x17, 0x62, 0xb1, 0x71, 0x07, 0x29 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x26\x05\xfe\xb3\xaf\x45\x91\x67\xf3\x2d\x13\x39\xab\xf7\x38\x3b\xbf\xc3\x73\x23\x48\xda\x09\x5e\x40\x10\xd1\x3d\xc9\x44\x8a\x4e\x16\x02\xd9\xc6\xfa\x47\xdd\x19\x0b\x64\x70\xac\x72\xfb\xfd\xa2\x52\x26\xf9\xd3\xd3\xb8\x00\xdb\xca\x9b\x8c\x4e\x07\x58\x54\x09\x3a\xb6\x3f\xa4\x82\x79\x03\x03\x94\x4b\x5f\x0c\x84\xb9\xf1\x73\x33\x54\xb4\xb0\x56\xf8\x1a\x12\x1e\x29\xc2\xed\x89\x99\xd7\xef\x45\xc6\x04\x91\x3c\xc0\x17\xa9\xc1\x08\x31\x1c\x55\x94\xa7\xb0\x15\xf0\x79\xff\xc4\x7e\x6d\x87\x71\xde\xc7\xdf\xc5\x68\xa6\x04\xeb\xd6\xfe\xd2\x1c\xff\x2d\x8e\xc6\xbe\x3c\xa0\x58\xf1\xb5\x5e\xac\x9d\x1c\x03\x12\x2f\x0b\xbe\xf5\xdd\xed\xe7\x2d\x2b\x57\x4c\xe0\x8a\xfe\xaa\x15\x1b\x59\x37\xd7\x91\xd4\x5c\x02\x34\xad\x80\xad\x01\x6f\x00\x34\xef\x09\x3b\xe0\x4c\x8b\xc9\x35\x46\x7c\xcb\xd9\x86\xda\x5d\x1c\xf7\xaf\x28\x28\xa5\x4c\x15\xc6\xc0\x25\x1c\xca\xbf\x48\x3a\x1d\xa1\x7b\x81\x65\x4e\xf2\x49\x53\x1c\xaa\x84\x88\x6f\x65\x30\x25\x78\x42\xe5\xee\x1e\xf8\x8e\x19\xf9\xaf\x34\xb9\x7a\x7b\xf6\xc2\x29\x75\x15\xb8\x07\x78\x2c\xf9", 253, { 0x52, 0x78, 0x7c, 0x98, 0x49, 0x6b, 0xa5, 0xff, 0x30, 0xbc, 0xb9, 0x58, 0x43, 0x67, 0x74, 0xff }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x12\x75\x7c\xa3\xe7\x74\x65\x23\x81\x28\xf1\x5b\x1f\x2d\x8b\x6f\x44\xe0\xcd\x2d\xd8\xdb\x77\x16\x6c\x0b\x7b\x0d\x9b\x70\x34\x9b\x8c\x71\xb7\xdd\x93\xda\x42\x0b\xf7\x73\xd2\xa5\xce\x3e\xd1\x3c\x05\x4c\xeb\xda\x7c\x3c\x01\x0f\x4e\x51\x37\x99\x2e\x2f\x28\xaf\xed\x32\x39\xea\x18\x6b\x0b\xd0\xbd\x39\x0a\xff\x4e\x7f\x22\xf3\x9f\x87\x92\x74\x0a\x73\xd8\x9f\xb2\x5b\xcc\x8e\xe4\x08\xc9\xa7\x99\x4c\x06\x7e\x18\xfc\x02\x68\xb8\x8c\x1e\x9d\xc3\x45\x44\x08\x77\x25\xc5\xaf\x26\x53\x41\xba\x7d\x3d\xbf\x22\xe1\x50\xdd\xf7\xf5\x53\x21\x4d\x38\x61\x6d\xc4\xcc\x81\x91\xb3\x51\xe3\xfb\xf1\xf0\xba\x89\x3f\x74\xb0\x7f\x55\x92\x0a\x94\x88\x49\x5a\x27\x14\x64\xdb\x8f\x0c\x1d\x6c\x90\xdb\xdc\x2c\xe9\x76\x1d\xae\x09\x20\x6f\xd9\xe2\xd9\x98\x5f\xd7\x64\xd6\xd8\xcf\xf4\x40\x7a\x6b\x72\x4b\x77\x54\x6d\x69\xf4\xad\x9f\xcc\xa1\xa8\x18\x49\xf9\x34\x0a\x57\x18\xd4\x30\x36\x34\x8b\xdb\x2c\xb9\xf4\x9a\xea\x05\x6e\x85\x0e\xbd\x73\x26\xc2\xca\x0a\x05\x81\xf4\x53\xcf\xfa\x19\x40\x22\x0d\x09\x63\xf8\xf2\x01\xe1\xad\x79\xc3\x86\xae\x6b\x4e", 254, { 0xce, 0x3c, 0x1c, 0xb0, 0xc1, 0xd5, 0x9a, 0x1f, 0xad, 0x95, 0x57, 0x98, 0xc6, 0x74, 0x61, 0x10 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf3\xc0\x10\x3f\xf2\xea\xca\xc4\xea\x01\xdf\x39\x6d\xce\x54\x61\xef\xdd\xf4\x42\x92\xe5\x70\x9d\x1c\xcf\xa0\x08\x0a\x65\xe8\xaa\xbe\x98\xb6\x93\xd3\x6d\x27\xb5\x91\x86\xc9\x83\x7c\x49\x7b\x25\x07\xaf\x71\x55\x66\xab\x54\xd9\x81\x34\x86\x9d\x04\xf1\x83\x6c\x93\x80\x63\x4b\x1b\x64\x7b\x72\x44\x89\x24\xe8\x02\x74\x93\xba\x4b\x0b\xe7\xd7\xe3\xfe\x42\x8b\x53\xd1\x0e\x96\xf8\x88\x61\xe9\x37\xee\x7b\xfc\xce\x81\x6c\xce\x46\xfd\xd3\x7a\x84\x83\xc1\x73\x7f\x66\xbb\x5c\x0c\x93\xde\x86\xd6\x9a\x1d\x07\x69\x5d\xa6\x73\x6d\x54\x64\x3a\xef\x7a\x9d\x9e\xdb\xd7\xba\x4f\x86\xab\x27\xa4\x68\x34\x51\x78\xe7\x1c\xcc\x9f\x4e\x83\x97\x04\xdc\xa4\x77\x61\xf9\x26\x7f\x99\x84\x01\xb1\xb5\x47\x0b\xbf\x79\x8c\x1f\xea\xa2\xc9\xe8\x0c\xbf\x76\x4f\xb1\xa9\xff\x7f\x5f\xa1\xd5\x91\xf6\x04\xa0\xd9\x32\xad\x8f\xcc\x4e\xe7\xcf\x8c\xc3\x0d\x19\x12\x2f\xc1\x66\xf7\x50\xc5\xbe\xdf\x2f\x79\x2e\x83\x59\xf1\xd8\x59\x48\xb2\x24\xe1\xe1\x0a\x15\x8e\x17\x09\xb6\x50\xad\x1f\xb3\xba\x18\x54\x03\xd5\x82\x1e\xc3\x80\xeb\xe2\x1f\x82\x6a\x0a\x69\x2e\x92", 255, { 0xbb, 0x05, 0x2f, 0x98, 0xc3, 0x43, 0x0a, 0x44, 0x7d, 0xae, 0x93, 0xea, 0x0a, 0x81, 0x4e, 0x3a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbf\x4b\xb1\xf0\x43\x19\xfc\xb0\xee\x40\x48\x5f\xc3\xdc\x4a\xca\xaf\x65\xf5\x06\x5d\x88\xe7\x89\xb8\x14\x71\x76\xfe\x0b\x46\xf6\x7e\xd9\xbf\xc1\xee\xa1\xc8\xbd\x6b\xb2\x6b\xbd\x0d\x18\xf7\x6a\x26\x4f\xcc\x3f\x18\x13\xc6\xae\xd0\x53\x44\x60\xe3\x43\xd4\x9a\x43\x91\x7c\xbb\x9d\xaf\xa7\xe1\x53\x4f\xab\xac\x11\xed\xf3\x1a\x0e\x85\xce\x92\xe1\x66\xd3\xfc\xfd\x1f\xee\x0d\xcb\x95\x0c\xa0\x63\x36\x5f\x40\xe6\x48\x4e\xc2\x7a\x5b\xfd\x0f\xe3\xdd\x74\x00\xbb\xcc\x6e\x62\x4e\x86\xc0\x18\x14\xbc\x64\x60\xcb\x85\x22\x2e\x31\x8f\xda\xb4\x5b\x70\x70\x03\xb5\x1a\x54\xcb\x97\x6d\xac\x3e\x7f\xe7\x21\x13\xf1\x77\x43\xa7\xe8\x6f\x9a\x3e\xf7\x97\x4a\x66\x01\x5d\x62\x7c\x91\x2a\xc1\x48\xd7\xd1\xa5\xc4\x40\x21\xd1\xfa\xb1\x9a\x5b\x0b\x5f\x3c\x0f\x4b\x4d\x7a\x83\x8a\x63\x4e\xb9\x6e\x28\x66\x6a\xfc\x1d\x7c\xf5\x35\xb5\xc3\xe4\xdd\xf4\x7d\x16\x57\xa2\xa9\x8f\xab\x2c\xda\xd9\xaa\x18\x23\x14\x29\x23\x2f\xa1\x69\xf9\x6d\x67\x97\x91\x68\xc0\x6e\x22\x34\x04\xfa\xc5\x04\xb0\x78\xa8\xd9\x32\x5a\xec\x55\x53\x66\x1d\xae\x41\xfe\x4b\xbe\x38\x7a", 256, { 0x64, 0xe1, 0xfd, 0x82, 0x3c, 0xe4, 0x10, 0x8b, 0x41, 0xca, 0x5d, 0xff, 0xed, 0x9f, 0x47, 0x22 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, snapraid-14.9/cmdline/museair.c000066400000000000000000000230061522717156100165040ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Andrea Mazzoleni /* * Derivative work of MuseAir v2 in the "long" (len > 32), "b128", and "bfast" configurations. * * Note that this specific MuseAir configuration didn't change from v1 to v2. * * This implementation also accepts a length <= 32, unlike the original MuseAir, * which switches to the short version for this length. * * https://github.com/eternal-io/museair */ /* * MuseAir v2 * By K--Aethiax * * Released into the public domain under the CC0 1.0 license. To view a copy * of this license, visit: https://creativecommons.org/publicdomain/zero/1.0/ */ /* * Analysis of the BFast variant and blinding multiplication * * Many fast non-cryptographic hashes (wyhash, rapidhash) use "folding * multiplication": fold_mul(state ^ input_a, input_b ^ SECRET), where both * the state and a public constant are XORed directly with input words. * This is vulnerable to "blinding multiplication": if any operand becomes * zero, the product is zero, and all accumulated state in that lane is lost. * An attacker who knows the SECRET constants can trivially craft an input * word that zeros out an operand, with probability 2^-64 per attempt (or * 2^-63 considering either operand). * * MuseAir BFast avoids this by using a circular accumulator with six * 64-bit state words. The core loop processes 12 input words per iteration: * * state[0] ^= input[0]; * state[1] ^= input[1]; * (lo0, hi0) = wide_mul(state[0], state[1]); * state[0] = lo5 ^ hi0; // lo5 is from the PREVIOUS step * ...repeat circularly for state[1] through state[5]... * * Inputs are mixed into the state (not XORed with public constants), so * an attacker must predict the evolving state to craft a blinding input. * * Even if a blinding multiplication occurs at the current step (one * operand is zero, making lo0 = hi0 = 0), the state update becomes: * * state[0] = lo5 ^ 0 = lo5 * * The state is NOT zeroed out: it inherits lo5 from the previous step, * which still carries entropy from all earlier inputs. The state only * zeros out if lo5 also happens to be zero. * * The probability of lo5 being zero equals the probability that the * low 64 bits of a 64x64->128 multiplication are zero. This happens * when the total number of trailing zero bits in both operands is >= 64. * For uniformly random operands, the exact count of such pairs in * {0..2^n-1}^2 is (n+2) * 2^(n-1). For n = 64 this gives 33 * 2^64 * pairs out of 2^128 total, so: * * P(lo64 = 0) = 33 * 2^-64 ~ 2^-59 * * The overall probability of a catastrophic state zero-out is therefore: * * P(blinding at current step) * P(lo5 = 0) * ~ 2^-63 * 33 * 2^-64 * = 33 * 2^-127 * ~ 2^-122 * * This is astronomically unlikely and completely irrelevant for detecting * silent data corruption, where inputs are real file data (not adversarial). * * The "Standard" variant of MuseAir replaces the assignment (=) with a * subtraction (-=) in the state update, making blinding multiplication * impossible at a performance cost. * * Why BFast was chosen over Standard for SnapRAID * * SnapRAID uses the hash exclusively to detect silent data corruption * (bit rot, firmware bugs, media degradation). The inputs are always * real file data read from disk, never adversarially crafted content. * In this context: * * - The 2^-122 blinding probability is irrelevant. Random bit errors * produce uniformly random changes that cannot trigger a blinding * multiplication. Only a deliberate attacker controlling the exact * file content could attempt to exploit it. * * - Both variants pass all 250 SMHasher3 quality tests and provide * identical error detection for random corruption. * * - BFast is measurably faster, and its structure is more amenable to * loop unrolling. * * The Standard variant's only advantage, full immunity to adversarial * blinding, provides no benefit when the threat model is physical * data corruption rather than a malicious actor. * * Short-input extension (len <= 32) * * The original MuseAir algorithm uses a completely separate "Short" * hash function for inputs of 32 bytes or less. This implementation * instead zero-pads short inputs to 32 bytes and processes them * through the same "Long" code path: * * if (len < 32) { memset(buf, 0, 32); memcpy(buf, p, len); } * * The motivation is to avoid maintaining two distinct hash algorithms. * Having a single code path reduces complexity and the potential for * algorithm defects. Hash functions generally provide a specialized * short version to improve performance for small keys, but this is * irrelevant for SnapRAID, which typically hashes 256 KB blocks. * Short inputs only occur as an exception. * * This extension is safe because the original length is mixed into * the finalization, independent of the zero-padded buffer: * * rot = len & 63; * i = rotl64(i, rot); // left-rotate by original length * j = rotr64(j, rot); // right-rotate by original length * k = k - len; // subtract original length * * So even though zero-padded buffers for, say, len=1 and len=2 are * identical, the different rotation amounts and subtraction values * produce completely different hashes after the final multiplications. */ #define u64x(N) (N * 8) /* AiryAi(0) fractional part calculated by Y-Cruncher */ static const uint64_t MUSEAIR_CONSTANT[13] = { 0x5ae31e589c56e17aULL, 0x96d7bb04e64f6da9ULL, 0x7ab1006b26f9eb64ULL, 0x21233394220b8457ULL, 0x047cb9557c9f3b43ULL, 0xd24f2590c0bcee28ULL, 0x33ea8f71bb6016d8ULL, 0xb5d2697595d0a01fULL, 0x9bb30a32f00e2b4fULL, 0x4acea09317a429d1ULL, 0xc2b2435dfdd545c6ULL, 0xfda811a785572a42ULL, 0xe5f50676bf67137bULL }; #define mult64_128(l, h, a, b) \ do { \ l = a; \ h = b; \ util_mum(&l, &h); \ } while (0) #define likely(a) tommy_likely(a) #define unlikely(a) tommy_unlikely(a) static const uint64_t MASK_I = 01555555555555555555555ULL; static const uint64_t MASK_J = 01333333333333333333333ULL; static const uint64_t MASK_K = 00666666666666666666666ULL; static void MuseAirLoong(const void* bytes, size_t len, const uint8_t* seed, uint8_t* out) { const uint8_t* p = bytes; size_t q = len; uint8_t buf[32]; if (unlikely(q < 32)) { memset(buf, 0, 32); if (q > 0) memcpy(buf, p, q); p = buf; q = 32; } uint64_t i, j, k; uint64_t lo0, lo1, lo2, lo3, lo4, lo5 = MUSEAIR_CONSTANT[6]; uint64_t hi0, hi1, hi2, hi3, hi4, hi5 = MUSEAIR_CONSTANT[6]; uint64_t state[6] = { MUSEAIR_CONSTANT[0], MUSEAIR_CONSTANT[1], MUSEAIR_CONSTANT[2], MUSEAIR_CONSTANT[3], MUSEAIR_CONSTANT[4], MUSEAIR_CONSTANT[5] }; uint64_t seed_a = util_read64(seed); uint64_t seed_b = util_read64(seed + 8); state[0] ^= seed_a & MASK_I; state[1] ^= seed_b & MASK_J; state[2] ^= seed_a & MASK_K; state[3] ^= seed_b & MASK_I; state[4] ^= seed_a & MASK_J; state[5] ^= seed_b & MASK_K; if (unlikely(q > u64x(12))) { do { state[0] ^= util_read64(p + u64x(0)); state[1] ^= util_read64(p + u64x(1)); mult64_128(lo0, hi0, state[0], state[1]); state[0] = lo5 ^ hi0; state[1] ^= util_read64(p + u64x(2)); state[2] ^= util_read64(p + u64x(3)); mult64_128(lo1, hi1, state[1], state[2]); state[1] = lo0 ^ hi1; state[2] ^= util_read64(p + u64x(4)); state[3] ^= util_read64(p + u64x(5)); mult64_128(lo2, hi2, state[2], state[3]); state[2] = lo1 ^ hi2; state[3] ^= util_read64(p + u64x(6)); state[4] ^= util_read64(p + u64x(7)); mult64_128(lo3, hi3, state[3], state[4]); state[3] = lo2 ^ hi3; state[4] ^= util_read64(p + u64x(8)); state[5] ^= util_read64(p + u64x(9)); mult64_128(lo4, hi4, state[4], state[5]); state[4] = lo3 ^ hi4; state[5] ^= util_read64(p + u64x(10)); state[0] ^= util_read64(p + u64x(11)); mult64_128(lo5, hi5, state[5], state[0]); state[5] = lo4 ^ hi5; p += u64x(12); q -= u64x(12); } while (likely(q > u64x(12))); state[0] ^= lo5; } lo0 = 0, lo1 = 0, lo2 = 0, lo3 = 0; hi0 = state[1]; hi1 = state[2]; hi2 = state[3]; hi3 = state[4]; if (q > u64x(4)) { state[0] ^= util_read64(p + u64x(0)); state[1] ^= util_read64(p + u64x(1)); mult64_128(lo0, hi0, state[0], state[1]); if (q > u64x(6)) { state[1] ^= util_read64(p + u64x(2)); state[2] ^= util_read64(p + u64x(3)); mult64_128(lo1, hi1, state[1], state[2]); if (q > u64x(8)) { state[2] ^= util_read64(p + u64x(4)); state[3] ^= util_read64(p + u64x(5)); mult64_128(lo2, hi2, state[2], state[3]); if (q > u64x(10)) { state[3] ^= util_read64(p + u64x(6)); state[4] ^= util_read64(p + u64x(7)); mult64_128(lo3, hi3, state[3], state[4]); } } } } state[4] ^= util_read64(p + q - u64x(4)); state[5] ^= util_read64(p + q - u64x(3)); mult64_128(lo4, hi4, state[4], state[5]); state[5] ^= util_read64(p + q - u64x(2)); state[0] ^= util_read64(p + q - u64x(1)); mult64_128(lo5, hi5, state[5], state[0]); i = (state[0] - state[1]) ^ MUSEAIR_CONSTANT[7]; j = (state[2] - state[3]) ^ MUSEAIR_CONSTANT[8]; k = (state[4] - state[5]) ^ MUSEAIR_CONSTANT[9]; int rot = len & 63; i = util_rotl64(i, rot); j = util_rotr64(j, rot); k = k - len; i = i - (lo3 ^ hi3) - (lo4 ^ hi4); j = j - (lo5 ^ hi5) - (lo0 ^ hi0); k = k - (lo1 ^ hi1) - (lo2 ^ hi2); mult64_128(lo0, hi0, i, j); mult64_128(lo1, hi1, j, k); mult64_128(lo2, hi2, k, i); i = lo2 ^ hi0; j = lo0 ^ hi1; k = lo1 ^ hi2; mult64_128(lo3, hi3, i, MUSEAIR_CONSTANT[10]); mult64_128(lo4, hi4, j, MUSEAIR_CONSTANT[11]); mult64_128(lo5, hi5, k, MUSEAIR_CONSTANT[12]); util_write64(out, lo3 ^ hi4 ^ lo5); util_write64(out + 8, hi3 ^ lo4 ^ hi5); } snapraid-14.9/cmdline/museairtest.c000066400000000000000000005563631522717156100174250ustar00rootroot00000000000000{ "", 0, { 0xec, 0xfa, 0x85, 0x21, 0xca, 0xf3, 0x3e, 0x32, 0x2f, 0x6b, 0xef, 0x39, 0xf7, 0xf2, 0xec, 0x97 }, { 0x26, 0x01, 0xec, 0xe1, 0x83, 0xe8, 0x8c, 0x7b, 0x90, 0x0e, 0x4b, 0xde, 0x01, 0xd5, 0x53, 0xdf } }, { "a", 1, { 0x0d, 0x7c, 0x23, 0xcf, 0x8f, 0x55, 0xda, 0x27, 0xd0, 0xd9, 0xdb, 0xee, 0x13, 0xbb, 0x6b, 0x1b }, { 0xa4, 0x42, 0x87, 0x4f, 0x88, 0x73, 0x39, 0xd1, 0x41, 0x15, 0xb8, 0x40, 0xa3, 0xb6, 0xc0, 0x5e } }, { "abc", 3, { 0xbb, 0x15, 0x41, 0x35, 0x28, 0x4c, 0xd0, 0x39, 0x84, 0x53, 0x81, 0x1c, 0x15, 0x8b, 0x6e, 0x6d }, { 0x18, 0xe4, 0x38, 0x31, 0x15, 0x50, 0xbc, 0x1b, 0xe3, 0x67, 0x76, 0x94, 0xf1, 0xcf, 0x38, 0xf4 } }, { "message digest", 14, { 0x68, 0xe0, 0x5a, 0xa3, 0x01, 0x72, 0x29, 0x26, 0x33, 0x7f, 0x2b, 0x67, 0x3a, 0x72, 0x76, 0x0c }, { 0x51, 0xa0, 0xc8, 0x1e, 0x0a, 0x47, 0xc0, 0xa7, 0xc7, 0x7f, 0x21, 0x05, 0x9a, 0x5c, 0x92, 0x33 } }, { "abcdefghijklmnopqrstuvwxyz", 26, { 0x54, 0x2f, 0xcb, 0x3d, 0x70, 0x47, 0x1d, 0x55, 0x9c, 0x1d, 0x5c, 0x53, 0x79, 0x5f, 0x25, 0x01 }, { 0xac, 0x4f, 0x52, 0x96, 0x83, 0x93, 0xd6, 0xa1, 0x38, 0x4a, 0x8f, 0xc9, 0xdf, 0xf8, 0xe0, 0x57 } }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62, { 0xb2, 0xbf, 0x48, 0x8c, 0x78, 0xe7, 0xbd, 0x27, 0xcd, 0xe2, 0x5d, 0x18, 0xfd, 0x72, 0xab, 0xed }, { 0xe3, 0x64, 0x46, 0x3d, 0xc4, 0x81, 0xdf, 0x27, 0x74, 0x39, 0xd4, 0x92, 0x49, 0x81, 0x3a, 0x0f } }, { "The quick brown fox jumps over the lazy dog", 43, { 0xd6, 0xa7, 0x07, 0xdd, 0xdb, 0x3d, 0x21, 0x88, 0x04, 0x85, 0x11, 0x5e, 0x5c, 0x59, 0x4a, 0xbd }, { 0x5f, 0x75, 0xc0, 0x9c, 0x71, 0xd2, 0xb1, 0x4a, 0x2e, 0x7a, 0x0f, 0xfb, 0x64, 0xe4, 0xdc, 0xce } }, { "\xf6", 1, { 0x29, 0xb0, 0x72, 0x21, 0x14, 0x86, 0x11, 0xab, 0x90, 0xeb, 0x0f, 0x32, 0xb8, 0x90, 0x4e, 0x17 }, { 0xf4, 0x39, 0x01, 0xc9, 0x5e, 0xe2, 0xcb, 0xd8, 0x0e, 0xb1, 0xa9, 0x1d, 0x8e, 0x39, 0xcf, 0x8a } }, { "\xf7\x39", 2, { 0xef, 0x01, 0x35, 0x91, 0xd9, 0x27, 0x0a, 0x16, 0x47, 0x28, 0x0d, 0x34, 0x30, 0x2f, 0xdf, 0x31 }, { 0x8c, 0xe1, 0x8c, 0x35, 0xdc, 0xc3, 0x3a, 0x1e, 0x9c, 0x9b, 0x89, 0x4c, 0x0a, 0x4a, 0x8b, 0xbb } }, { "\xcb\x8d\xab", 3, { 0x19, 0x93, 0x81, 0xe2, 0x3d, 0xf8, 0xa8, 0x16, 0x80, 0x61, 0x66, 0xd7, 0xb5, 0xa9, 0xc3, 0x3e }, { 0x5a, 0xc0, 0xf8, 0x41, 0x14, 0x15, 0x00, 0xdc, 0x49, 0x25, 0xa0, 0x7d, 0xe6, 0xef, 0x07, 0x5e } }, { "\x2f\xdc\x11\x68", 4, { 0x96, 0xb4, 0x38, 0x50, 0x50, 0x02, 0x32, 0x02, 0x5c, 0xfb, 0x45, 0x33, 0x09, 0x45, 0xa7, 0x36 }, { 0x86, 0x53, 0x98, 0xe4, 0x51, 0x3b, 0xba, 0x51, 0x31, 0x3d, 0x0c, 0xb5, 0x57, 0x40, 0x42, 0xbf } }, { "\x24\x74\x31\x0e\xc8", 5, { 0x24, 0xe1, 0x46, 0xda, 0x59, 0x78, 0x43, 0x3a, 0x41, 0xa9, 0x7b, 0xe4, 0x88, 0x66, 0xb8, 0x92 }, { 0x74, 0x4f, 0xf3, 0x03, 0x7a, 0x61, 0xaa, 0x0b, 0xb7, 0xd6, 0xe6, 0x4b, 0x25, 0x6e, 0xab, 0x00 } }, { "\x58\x10\x5e\xd4\xa1\x34", 6, { 0xb9, 0xc6, 0xac, 0x3f, 0x30, 0xf1, 0xde, 0x94, 0x39, 0xe4, 0xbf, 0xa3, 0xbd, 0x96, 0x28, 0xf6 }, { 0xff, 0x9b, 0x58, 0xe6, 0xea, 0x68, 0x5d, 0x1d, 0xf3, 0x74, 0x23, 0x59, 0x00, 0x29, 0x6c, 0x39 } }, { "\xc8\x87\x61\x1d\xb9\x21\x56", 7, { 0x7c, 0x19, 0xef, 0xa0, 0xb8, 0x0e, 0xec, 0xc8, 0x83, 0xce, 0x49, 0x23, 0x7a, 0x7d, 0xf8, 0x25 }, { 0x46, 0x8d, 0xa7, 0x10, 0x69, 0xef, 0x94, 0x27, 0xff, 0xd7, 0x5d, 0x0b, 0xf1, 0x74, 0x39, 0xed } }, { "\x0b\x41\x36\xa3\x7d\x24\x35\xcc", 8, { 0x4b, 0xeb, 0x90, 0xc6, 0x67, 0x1d, 0xbf, 0x3b, 0x32, 0x5b, 0x29, 0x51, 0x2e, 0xb4, 0x7d, 0xbe }, { 0x17, 0xc3, 0x7e, 0x4f, 0x38, 0xe7, 0x34, 0xcc, 0x88, 0x0c, 0x1f, 0xd1, 0x50, 0x1a, 0xd3, 0xba } }, { "\x7a\xe3\xa3\x36\x00\x75\x9c\x46\x5b", 9, { 0x7f, 0x76, 0x62, 0x13, 0x8a, 0xdc, 0xc1, 0x99, 0x75, 0xe5, 0x08, 0xbc, 0x44, 0x73, 0x1a, 0x9e }, { 0x8e, 0x4a, 0xc8, 0x25, 0xff, 0x6e, 0x50, 0x51, 0xa3, 0xa2, 0x7b, 0x51, 0x7f, 0x68, 0xd1, 0x2f } }, { "\x3d\xcb\x2b\x3f\x15\x36\x3c\xf9\xa6\xa2", 10, { 0x71, 0x0a, 0x20, 0x33, 0x0a, 0xa8, 0x28, 0x1d, 0xb3, 0xa0, 0xb3, 0xa2, 0x93, 0x10, 0xac, 0xa0 }, { 0xa7, 0xb5, 0x82, 0x54, 0x46, 0xc9, 0xa7, 0x9b, 0x3d, 0x3d, 0x87, 0xc0, 0x42, 0xee, 0xbd, 0xc5 } }, { "\xf9\x8a\x69\x67\x5e\xd1\xd2\xfd\xf4\xf1\xb2", 11, { 0x60, 0xc3, 0x01, 0x6b, 0x4c, 0x1b, 0xd6, 0xc6, 0x14, 0x3a, 0xb5, 0x52, 0x05, 0x1c, 0x8a, 0x6a }, { 0xba, 0x2e, 0x77, 0x20, 0x41, 0xfa, 0xec, 0x94, 0x11, 0x30, 0x8c, 0xde, 0x24, 0x8a, 0xce, 0x5c } }, { "\xfe\x93\x54\x96\xc6\xac\x7d\xf2\x89\x78\x0c\x50", 12, { 0x8f, 0x48, 0x65, 0x7d, 0x1c, 0xa2, 0x57, 0xc6, 0x89, 0xa2, 0x9b, 0x1e, 0xc0, 0x77, 0xff, 0x37 }, { 0x21, 0x15, 0x58, 0x62, 0xf0, 0x3e, 0x9b, 0x78, 0xb4, 0xa5, 0xb4, 0xdd, 0xcb, 0xe5, 0xcf, 0x5d } }, { "\x04\xa5\x95\xfa\xdf\x0c\x14\xdc\x4f\x78\x53\xb7\xed", 13, { 0x20, 0xa4, 0xd1, 0xca, 0xf0, 0xc8, 0x8a, 0x4f, 0x0b, 0xe0, 0xb6, 0xc3, 0xcc, 0x92, 0x4b, 0x51 }, { 0x63, 0xcf, 0xfd, 0x23, 0xa0, 0x54, 0xdb, 0xad, 0xda, 0x1f, 0xa5, 0x52, 0x7e, 0xe8, 0xf5, 0x8d } }, { "\x26\x31\x16\x02\x8b\x06\x95\x38\xf7\x44\xe1\xca\x79\x83", 14, { 0xba, 0x70, 0x56, 0x4a, 0x10, 0x0f, 0x98, 0x8a, 0x16, 0xd9, 0xd7, 0xb3, 0x55, 0x19, 0x4f, 0x60 }, { 0x01, 0x5b, 0x00, 0xbd, 0xcb, 0xb9, 0xbb, 0x1c, 0x33, 0x29, 0x93, 0x96, 0x9a, 0xb5, 0x3b, 0xd3 } }, { "\xe5\x08\x53\xbd\xff\x4d\xe9\xb8\xe3\x53\xfc\xa4\xe3\xfc\x46", 15, { 0xed, 0x05, 0x22, 0x0d, 0xa5, 0x62, 0x0b, 0x36, 0x9f, 0xbe, 0xcd, 0xb0, 0xf0, 0x2a, 0x51, 0x48 }, { 0x6f, 0xe8, 0xc9, 0x89, 0xbc, 0x9e, 0xd1, 0x35, 0xd8, 0x4d, 0xbd, 0xa7, 0xcb, 0xff, 0xd7, 0x46 } }, { "\x6d\x9a\x82\xa2\x16\x93\xc8\xfa\xe2\x52\xeb\x60\x57\x74\xba\x91", 16, { 0x48, 0x0d, 0xfa, 0x3d, 0x2b, 0x73, 0xb9, 0xbf, 0x1b, 0x7d, 0x4c, 0x38, 0x96, 0x47, 0x21, 0xac }, { 0x4f, 0x69, 0xb8, 0xf1, 0xb1, 0x99, 0xe3, 0xc6, 0x18, 0x24, 0x66, 0x20, 0xeb, 0xcb, 0x74, 0x94 } }, { "\x64\x7b\x6c\xf4\x87\xb0\x4c\x33\xda\xbb\x27\x3a\x6a\xfd\x25\x37\x2e", 17, { 0xd7, 0xb5, 0x6e, 0x31, 0xfe, 0x97, 0x9d, 0x04, 0x4f, 0xb3, 0x07, 0x53, 0x58, 0x4c, 0x6d, 0x92 }, { 0xe1, 0xfd, 0xc5, 0x7f, 0x54, 0xdb, 0x4e, 0x77, 0x01, 0x6f, 0xed, 0xce, 0xcc, 0xe6, 0x3b, 0x57 } }, { "\xe4\xff\x50\x32\xb1\x59\xa5\xba\x7a\xa6\x4d\x38\x05\x14\x4b\x77\xab\x43", 18, { 0x97, 0x5f, 0xe5, 0xa6, 0x78, 0xf0, 0x3e, 0xb6, 0x48, 0xa5, 0x53, 0x89, 0x9a, 0x53, 0x3a, 0x6d }, { 0x81, 0xe4, 0xe5, 0x54, 0x3f, 0xf5, 0x47, 0xf0, 0xe4, 0x91, 0xa2, 0xf7, 0x41, 0xf6, 0x47, 0xa1 } }, { "\x0b\xf2\xf4\x0b\x2c\x8c\x9f\xdd\xfd\x81\x39\xba\x10\x75\x14\x14\x10\xd9\xe4", 19, { 0xc6, 0x69, 0xbe, 0xe2, 0xf8, 0xc3, 0xe9, 0x68, 0x3b, 0x68, 0x7d, 0x93, 0x71, 0xeb, 0x13, 0xdf }, { 0xc4, 0x3f, 0x24, 0x8d, 0x7b, 0x22, 0x9f, 0x31, 0x92, 0xd7, 0x12, 0x3f, 0x70, 0x04, 0x2d, 0xbb } }, { "\xdf\xad\xe3\x3c\xe6\x11\xc4\xaf\x4e\x4d\xbb\x19\x2e\xc8\x87\x8d\x86\xbf\xae\xf8", 20, { 0xe7, 0x0a, 0x75, 0xf0, 0x45, 0x24, 0x13, 0x5c, 0xa5, 0x40, 0xae, 0x1c, 0xf2, 0xaf, 0xf7, 0x2e }, { 0x9e, 0xc6, 0x5f, 0x3f, 0xd1, 0x71, 0xda, 0xae, 0xcf, 0xdb, 0xa7, 0x7b, 0x48, 0xd2, 0xe2, 0x26 } }, { "\xc3\x06\x1f\x5a\x4c\x3c\xa3\xf5\xc5\x2d\xcb\x3e\xcf\xf0\x37\x94\x89\x58\x37\xbc\x81", 21, { 0x3f, 0x8e, 0xf8, 0x60, 0xd0, 0x53, 0x5d, 0x1d, 0x90, 0x96, 0x22, 0xca, 0x32, 0x98, 0x02, 0x3c }, { 0x2d, 0x22, 0xec, 0x95, 0xc7, 0x50, 0xee, 0x7e, 0x48, 0x88, 0xd4, 0x12, 0xfc, 0xa5, 0x11, 0x18 } }, { "\x06\xd9\x36\x42\x30\xec\x87\x20\xb0\x3c\xd8\x3c\x42\xd3\x99\x1e\xd1\xc8\x63\x8e\xdb\xa9", 22, { 0xc7, 0x3d, 0xa2, 0x80, 0x23, 0xdd, 0xd5, 0xc4, 0x51, 0xb0, 0xe3, 0x79, 0x4b, 0x23, 0xd8, 0xb2 }, { 0xe9, 0x89, 0x45, 0x85, 0x0c, 0x8e, 0xb6, 0x8e, 0x97, 0xbb, 0xb5, 0xa3, 0x76, 0x40, 0xa2, 0x53 } }, { "\x50\x5c\x22\x5c\xa5\xf3\xf9\xe7\x17\xcd\x71\x9f\xf1\x5b\xa4\xa4\xf2\xe5\x37\xf5\x9e\xed\xb5", 23, { 0xdb, 0xd0, 0x77, 0x23, 0xe3, 0xc0, 0x96, 0x5b, 0x78, 0x5e, 0xcb, 0x03, 0x56, 0xda, 0xf2, 0x04 }, { 0x09, 0x59, 0x30, 0xdb, 0x7b, 0x67, 0xae, 0x75, 0xb5, 0x45, 0x52, 0x7f, 0x6f, 0xca, 0x6c, 0x4f } }, { "\xbb\xde\x88\x01\x7c\x1f\x45\x38\x97\x4c\xa8\x55\x97\x92\xdd\x32\x42\xc4\xa3\x90\x9a\xf1\xe9\x51", 24, { 0x55, 0xec, 0x36, 0x76, 0xa8, 0xed, 0x68, 0xf6, 0x48, 0xa8, 0x0c, 0x1d, 0x37, 0x7b, 0x43, 0x34 }, { 0xc7, 0x2f, 0x2d, 0x75, 0x71, 0xe7, 0xc2, 0x12, 0x97, 0x78, 0x88, 0x42, 0x7f, 0x87, 0x1f, 0x2f } }, { "\x0f\x15\xbd\x39\xb2\x07\x94\xde\xe1\x25\x76\x96\x23\x94\x1e\x68\x66\x61\x81\xca\x5c\xe8\x73\x88\x94", 25, { 0x71, 0xda, 0x33, 0x84, 0x68, 0x92, 0xdf, 0xf5, 0x28, 0xb2, 0x36, 0xd2, 0x32, 0xba, 0x0c, 0xaf }, { 0x3d, 0xf3, 0xba, 0xaf, 0x62, 0x79, 0xaa, 0x31, 0x60, 0xb4, 0xb8, 0xda, 0x8d, 0x6f, 0x4e, 0x14 } }, { "\x4b\x26\x61\x0f\xfc\x64\xdc\x8c\x8d\x3b\x5b\x85\x44\xeb\xb1\x0a\x73\x59\x81\x11\x62\x65\x4d\xcf\x98\xf9", 26, { 0x77, 0xb9, 0x88, 0x2d, 0xa4, 0x26, 0xfb, 0xd6, 0x1e, 0x8e, 0x4a, 0x7f, 0x33, 0x2f, 0x67, 0x2d }, { 0x08, 0xd6, 0xec, 0x18, 0x36, 0x79, 0x76, 0x28, 0xa0, 0x24, 0x14, 0x6c, 0xa0, 0x04, 0x26, 0x8e } }, { "\x0c\x16\x38\x42\x1c\x04\xc3\x72\xa9\x42\xf2\xf6\x79\x96\xe6\x41\xcd\xbb\x2a\x3e\x11\x20\xba\xc3\x45\xa9\xf9", 27, { 0xa7, 0xe0, 0x52, 0xdb, 0xd7, 0xbf, 0xe3, 0x68, 0xb9, 0x41, 0xc6, 0x1e, 0x5a, 0xf5, 0xef, 0xa9 }, { 0xf7, 0xba, 0xbd, 0x21, 0xb3, 0xd7, 0xa2, 0xe0, 0xc4, 0x18, 0xf6, 0xca, 0xfd, 0x1b, 0xa2, 0x74 } }, { "\x6e\x7f\x2a\xe4\x9d\xb7\xfc\x8f\x10\x45\xe5\xc9\x1f\x45\x7a\x03\xfc\x13\xda\xd9\x92\xb1\xf1\x74\xcc\x21\xe5\x1b", 28, { 0x3b, 0xb2, 0x8f, 0x5e, 0x71, 0x01, 0x54, 0xb3, 0x1f, 0xe0, 0x98, 0x62, 0xc2, 0x75, 0x7b, 0x64 }, { 0x86, 0x40, 0x7f, 0x18, 0x46, 0x9f, 0xc1, 0x52, 0x4c, 0xc9, 0x42, 0xf5, 0xa2, 0x8e, 0x9f, 0xfb } }, { "\x3e\xe4\x33\x05\x1a\x38\x1d\xd4\x77\xcc\x58\xd9\xf6\x10\x0d\x17\x12\x3f\x41\x75\xc9\xac\x72\x18\x29\x8b\xa1\xd0\x33", 29, { 0x70, 0x31, 0xa9, 0x05, 0x95, 0x13, 0x28, 0xe0, 0x10, 0x5d, 0x13, 0x85, 0xad, 0xab, 0x46, 0x8b }, { 0x29, 0xa1, 0xc4, 0x5d, 0xcc, 0x9a, 0xa9, 0x71, 0x11, 0x80, 0x91, 0x86, 0xd2, 0x8d, 0xd3, 0xa7 } }, { "\xd9\x11\x4a\x2d\xc7\x6d\x35\x49\xfb\x0d\x1a\x66\x10\x16\x27\xe6\x8f\x2f\x80\x7d\x41\x05\xed\x07\xec\x64\xf7\x53\x09\x8c", 30, { 0x3c, 0xff, 0xb3, 0x4c, 0xbc, 0xab, 0x47, 0xbd, 0xb8, 0x59, 0xe0, 0x5e, 0x05, 0x4b, 0xe9, 0x7a }, { 0x57, 0xf4, 0xbf, 0x66, 0xd5, 0xb7, 0x49, 0xb7, 0xf1, 0x33, 0x97, 0xe2, 0x0c, 0x91, 0x06, 0x82 } }, { "\xe9\x15\x3f\x2c\x13\xe0\x01\x26\x2d\x84\xc3\x1f\x4a\x77\xba\x38\x65\x3d\x37\x4a\xf8\x76\xec\xf6\x6a\x66\x51\x09\xd4\xf5\x6a", 31, { 0xbd, 0x6c, 0xe9, 0x1f, 0x86, 0xb1, 0x1f, 0x6b, 0x6c, 0x7e, 0x4f, 0x61, 0x1e, 0x58, 0xaf, 0x8a }, { 0xad, 0x36, 0x03, 0xef, 0x63, 0xcd, 0xae, 0x30, 0xba, 0x8d, 0x49, 0x3e, 0x2e, 0x13, 0x43, 0x0b } }, { "\x0a\x9c\xa6\x92\xf6\x91\x5d\xb3\xda\xcc\x56\xbe\xdc\x8c\xa7\xdf\x23\x79\x06\x15\xe7\x55\x97\x77\xf9\x79\x3c\xc9\x74\xc3\x01\x72", 32, { 0x44, 0x54, 0x33, 0x3d, 0xa0, 0x33, 0x07, 0xb4, 0xd2, 0x21, 0xd9, 0x38, 0x11, 0x44, 0x2e, 0x0a }, { 0x22, 0xd9, 0xc2, 0x47, 0x80, 0xea, 0x68, 0xdd, 0x50, 0x69, 0x88, 0x30, 0xe8, 0x1c, 0xa4, 0x4e } }, { "\xd5\x1c\x43\x5d\x86\x79\xe3\x06\x19\x43\x86\xd0\xd3\x73\x1e\xcb\x6f\x08\x89\x6c\x53\xde\x5f\x9d\x25\x6b\x6f\x98\xd4\x3c\x6e\x64\x5c", 33, { 0x8e, 0x5e, 0x2d, 0xf4, 0x90, 0xd3, 0x60, 0x82, 0xf2, 0x65, 0x02, 0x8b, 0xa2, 0x1d, 0x2c, 0xb2 }, { 0x3b, 0x33, 0xca, 0x63, 0x52, 0x33, 0xc4, 0x37, 0x3b, 0xc5, 0x0d, 0x90, 0x44, 0xb2, 0xf1, 0xba } }, { "\x1a\xcf\xd3\x03\xf9\x19\x12\x56\xb1\x21\xe6\xd2\x7e\x30\xee\x42\x96\x3a\xee\x9f\xdf\x92\x66\xbe\x78\xc3\x88\x37\xf4\x6a\x4b\xe8\x77\x55", 34, { 0x96, 0xa5, 0xe7, 0x7e, 0x42, 0x64, 0x30, 0x10, 0x1f, 0xaa, 0xf6, 0x96, 0xa0, 0xaa, 0x9b, 0xdd }, { 0x64, 0xb3, 0x68, 0xfa, 0x26, 0xf2, 0xcf, 0x11, 0x61, 0x0b, 0xaf, 0xc9, 0xa3, 0x98, 0x6d, 0xd6 } }, { "\x2d\x16\x9e\x50\x6a\x7e\x6a\xe9\xd3\x02\x29\xac\x86\x34\x83\x3b\xe6\x83\xb1\x55\xa0\xcb\x17\xa4\xbf\xfe\xaf\x73\x00\xd1\x6f\x7e\x43\xa5\xe3", 35, { 0x49, 0x10, 0xf7, 0x34, 0x18, 0x61, 0x5c, 0x58, 0xb4, 0xe5, 0xa9, 0xa3, 0x76, 0x7d, 0x97, 0xf0 }, { 0xfa, 0x57, 0xac, 0x87, 0x27, 0x69, 0x0c, 0xc3, 0x6c, 0x3e, 0x08, 0x86, 0x2c, 0xd5, 0x7c, 0x40 } }, { "\x88\x7b\x06\x1f\xa0\x8b\xf8\xd0\x7d\xe8\xde\x59\x81\xe2\x5b\x22\x23\xe2\x43\xbd\xaf\x2f\x79\x54\xa8\xb4\xa9\x17\x11\x42\x67\x7a\xe5\x86\xae\x5f", 36, { 0xd8, 0x72, 0xe2, 0x54, 0x9a, 0x09, 0x7d, 0x59, 0xd2, 0x36, 0xee, 0x18, 0xab, 0x29, 0x32, 0x05 }, { 0xb7, 0x5c, 0x04, 0x90, 0xd6, 0x32, 0x94, 0xd9, 0x8d, 0xbc, 0x89, 0x5d, 0xe2, 0x56, 0x8a, 0x6e } }, { "\x66\x07\x0c\xca\xf7\xf8\xa4\x53\x8a\x4d\x74\x28\x42\x6c\xf0\x98\x4b\xce\xa8\x54\xbb\x63\xfb\x8f\x88\x07\x7f\xe1\x36\xcc\xbf\x12\x19\xda\xbb\x27\xb5", 37, { 0xe7, 0x4e, 0x2b, 0xad, 0xc7, 0x80, 0x25, 0x15, 0xc3, 0x56, 0x84, 0x4c, 0x81, 0x61, 0x0e, 0x1b }, { 0xaf, 0x2e, 0x53, 0xd7, 0x15, 0xc8, 0xfa, 0xe2, 0x4d, 0x70, 0xc7, 0xd5, 0xe2, 0x6b, 0x84, 0x71 } }, { "\xf5\xab\x1e\x7e\xc5\xe6\x5e\xc1\x16\xde\x11\x50\x68\x4c\x44\xf8\x87\x9d\x6c\xf7\x2c\x57\x73\x46\x82\xde\x3d\xa6\x65\x37\xc0\x83\x8f\xc5\x5d\xa4\x43\x4f", 38, { 0x80, 0xea, 0x33, 0x16, 0xca, 0x01, 0x79, 0xed, 0x1f, 0x21, 0x45, 0xcc, 0xcb, 0xa5, 0x88, 0xbf }, { 0x3c, 0x60, 0xbf, 0xff, 0xc1, 0xb9, 0x90, 0x34, 0xf5, 0xa6, 0xec, 0x78, 0xe7, 0x85, 0x11, 0xf0 } }, { "\x70\x03\x1d\xc3\x6d\xfd\xba\xa4\x18\xac\x95\x41\x59\xb1\xb7\xf4\x12\x32\x96\x1a\x47\xe3\x5a\x27\x38\xee\x3e\xff\x3f\xc2\xb8\x2a\x30\xc2\xe2\xec\xf1\x56\x0e", 39, { 0x73, 0x3e, 0x45, 0xc4, 0x83, 0x06, 0xab, 0x3e, 0xf3, 0x51, 0xf5, 0x9b, 0xc1, 0xda, 0x05, 0x28 }, { 0xd8, 0x02, 0x1a, 0x02, 0xc7, 0xb9, 0x9e, 0x09, 0x30, 0x07, 0x7c, 0xa8, 0xa0, 0x55, 0xe0, 0x6a } }, { "\x36\x45\xac\x62\x13\x74\x11\x57\x3c\x5d\x94\x8e\x36\x3b\x77\xc3\xbb\x83\xe1\xc3\x35\x07\x6b\x49\xd5\x60\x01\xae\xbc\x06\x5d\xa1\x19\x0e\x89\xf2\x7d\x2b\xb3\xf9", 40, { 0xfa, 0xf8, 0x36, 0xc1, 0xe2, 0xa7, 0x6d, 0xf8, 0xc9, 0xee, 0x66, 0x92, 0xaf, 0x8a, 0x7c, 0xcb }, { 0x23, 0x30, 0x1f, 0x97, 0x8f, 0xae, 0xd3, 0x63, 0x89, 0xf2, 0x6c, 0xd0, 0xab, 0x48, 0x2c, 0x3e } }, { "\x13\xc5\xf7\x9a\xe0\x63\x68\xd6\x8a\x54\x51\x12\x33\xe8\xc4\x36\x1e\xbb\xd6\xc6\x61\x16\x4e\x65\x36\xea\x16\x92\x89\x28\xf8\xbb\x8f\xdb\xc3\xe4\x7d\x57\x70\xc3\x1c", 41, { 0xea, 0x52, 0x2d, 0xf0, 0x1b, 0x50, 0x77, 0xe4, 0x58, 0xef, 0x1c, 0x4f, 0x35, 0x40, 0x30, 0x41 }, { 0xc9, 0xd5, 0x7a, 0x06, 0x3a, 0x78, 0xc9, 0x84, 0x32, 0x7e, 0xbb, 0x86, 0x22, 0xc9, 0x6c, 0x4b } }, { "\xab\xf2\x9e\x4e\x07\xb9\x6c\xed\xd7\x03\xc7\xe7\x02\x17\xaa\x9d\x37\x5b\x0e\x3d\x4b\x1d\x2a\x83\xc3\xec\xe3\x0c\x7b\xc6\xae\x86\x93\x29\xc2\xdf\xa7\x48\x96\xd2\xbb\x30", 42, { 0x8d, 0xea, 0xa5, 0x27, 0xba, 0xba, 0xaf, 0xb0, 0xe9, 0x67, 0x0d, 0xab, 0x71, 0xf5, 0x69, 0x4c }, { 0xfd, 0x02, 0xde, 0xf6, 0x20, 0xa2, 0x32, 0x3c, 0xe5, 0x44, 0x2e, 0x19, 0x7b, 0xd5, 0x24, 0x77 } }, { "\xda\x29\x6d\x50\xea\x83\xa5\x57\xb2\xfe\xe5\x2b\x1a\xd1\xd9\xdc\xcf\xef\x7d\x1a\x8c\xa6\xc6\x83\x86\x1a\xbd\xc7\x3c\xe2\x5d\xd2\x0b\xf0\x1a\xcd\x07\x5a\x77\xeb\x2c\x66\xe8", 43, { 0x1f, 0x63, 0x17, 0xad, 0x10, 0x1c, 0x75, 0x8f, 0xfd, 0xf4, 0x7a, 0x74, 0x1e, 0x9e, 0x3c, 0xa7 }, { 0x16, 0x0e, 0xe8, 0x32, 0x18, 0x78, 0x20, 0x42, 0x61, 0xfd, 0x75, 0x41, 0x4c, 0xc6, 0x3b, 0x16 } }, { "\xa6\x8a\xe5\x31\xfe\x40\xaa\xa4\x9c\x8c\x31\xba\x85\x44\x5e\x7c\x0a\xb5\x6b\x6b\x1c\xcc\x61\x9f\xe8\x42\x2b\xaa\x55\x1e\x7d\xe5\xfb\xb5\x39\x30\x46\x97\x11\xe9\xd7\xaf\xbc\xa5", 44, { 0x4d, 0x20, 0x76, 0xd5, 0x43, 0x9b, 0xf4, 0x50, 0x5a, 0x75, 0x13, 0xa3, 0x05, 0xd0, 0xf2, 0xff }, { 0xe0, 0xb4, 0xb3, 0xfd, 0x6e, 0x51, 0x0d, 0x94, 0xc3, 0xbc, 0xe9, 0x25, 0x58, 0xf5, 0x60, 0xdd } }, { "\x24\x57\xba\xb9\xe4\x43\x9e\xf3\x67\x60\xb4\x48\xbb\x0a\x6a\x60\xde\xc4\x1e\x95\x2d\xcf\x96\x83\xa3\xe5\x66\x5d\xe3\x65\x28\x4a\x40\x1d\x77\xf5\xf9\x3a\xd6\xcd\x97\x9d\x7e\xb4\x66", 45, { 0xa1, 0xc2, 0x91, 0xa0, 0x8f, 0xd6, 0x0f, 0x1c, 0xe3, 0x42, 0xe4, 0x4f, 0x68, 0xf3, 0xc0, 0x12 }, { 0x14, 0xcd, 0x6d, 0x7f, 0x36, 0x32, 0x30, 0x88, 0x20, 0x34, 0xe9, 0xb0, 0x16, 0xce, 0x72, 0x60 } }, { "\x34\x67\xf0\x23\xd3\x9a\x54\x60\x05\x2f\x12\xac\xa0\x64\xd1\x5b\x8e\x09\xe7\x1c\xc4\x64\x23\xfe\x98\x74\xad\x90\xd4\xc4\x18\xcf\x33\xba\x6d\x2e\xef\x7d\x12\xe0\x22\x1f\x46\x81\xde\x84", 46, { 0x5e, 0x14, 0xbb, 0x6d, 0xb5, 0x01, 0xab, 0x23, 0xf3, 0x61, 0x02, 0xb3, 0x66, 0xd5, 0x7d, 0xc2 }, { 0x97, 0x66, 0x0c, 0x59, 0xe5, 0x92, 0x35, 0xba, 0x9c, 0x8f, 0x0e, 0x72, 0x67, 0x7a, 0x41, 0x71 } }, { "\xd0\x58\x9c\x72\xe2\x15\x46\x48\x53\xba\x85\xd6\xed\x01\x84\x87\xfa\xf9\xba\x89\x26\x48\xcd\x65\x3f\x1e\x28\x3b\xbf\xb9\xf8\x6d\xd0\x97\x67\x24\xab\x3b\x8e\xdc\x2c\x7c\x2a\x05\xb1\xd9\xfc", 47, { 0x3a, 0x9c, 0x29, 0x83, 0xb4, 0x51, 0x6a, 0x60, 0xf7, 0x6c, 0x79, 0x6a, 0x62, 0x09, 0x6b, 0xb3 }, { 0xb1, 0x5c, 0xc8, 0xb0, 0x4e, 0xf6, 0xc0, 0x09, 0x49, 0x85, 0x94, 0x29, 0x11, 0x6a, 0x6f, 0x18 } }, { "\x69\x7b\x92\xda\x71\xb6\x8a\x09\xe4\xf8\x62\x34\x7f\x40\x52\xf3\x11\x93\x70\x4a\xf2\x50\x86\x88\x5e\x05\xe8\xce\x9f\xc6\x26\x7d\xcd\x31\x1e\xd2\x60\x3c\xa8\x03\x46\xfc\x47\xb3\x8c\x4a\x52\xa9", 48, { 0xe8, 0x05, 0x2b, 0x08, 0x71, 0xad, 0xe4, 0x28, 0xfb, 0x79, 0xe6, 0x74, 0x1c, 0x55, 0x98, 0xf5 }, { 0x35, 0x4a, 0x4f, 0xbf, 0x47, 0xaa, 0x32, 0x65, 0x6e, 0x14, 0xeb, 0x3a, 0x97, 0x45, 0x47, 0xd4 } }, { "\x8e\xa3\x40\xed\x7a\x29\x3c\x6a\x6f\x1c\xa4\xd1\x29\xbd\x8a\xb7\xf7\x70\xa7\xea\x4f\x02\xce\xd1\x71\xa1\x97\xa4\x20\x98\xc2\xbe\xf0\x85\xc4\xc0\x93\x93\x34\x8c\xfa\x1a\xcf\x5b\xd6\x02\x4d\xe0\x8f", 49, { 0x15, 0x02, 0xb4, 0x26, 0x0d, 0x05, 0x9d, 0xdf, 0x5c, 0xc7, 0xcf, 0x4c, 0x54, 0x8b, 0x0b, 0x1d }, { 0x44, 0xee, 0x56, 0x30, 0x13, 0xb6, 0xe0, 0xa7, 0x35, 0x93, 0x78, 0xeb, 0x07, 0x28, 0x44, 0xbe } }, { "\xfa\x1e\xf0\xce\x8a\x22\x3e\xec\x7d\x65\xe3\xd5\xc5\x3e\x85\x3b\xbe\x35\xed\x84\xfc\x31\x31\x9b\x50\xc5\xe6\x24\xff\xd4\xc6\xa6\x63\x41\xe8\xcf\x79\xa0\xf3\x12\x93\x68\x62\xb4\x2a\x08\x07\x05\x01\x13", 50, { 0x8a, 0xaa, 0x3f, 0x7a, 0x88, 0x70, 0xc9, 0x8a, 0x4c, 0x0e, 0x95, 0x19, 0xe1, 0x6e, 0x4d, 0x0e }, { 0xb1, 0xec, 0x55, 0x40, 0x04, 0xf8, 0x32, 0xd4, 0x4b, 0x51, 0xa9, 0xa1, 0x4c, 0xd3, 0xda, 0x55 } }, { "\x0b\xaa\xe5\xba\x0d\x5f\x6b\xd0\xf5\xd5\xe4\x99\x26\xb5\x76\x08\xa9\x2c\x1d\x08\x43\xbd\x9d\x81\x31\x29\xc0\x03\x12\x0c\x0a\x4e\xba\x5a\xfb\x26\xe3\xde\xad\x6b\x36\x26\xf4\xd5\x09\x64\xe1\x55\x28\xea\x1f", 51, { 0x0a, 0xfe, 0xfb, 0xc7, 0x25, 0x4b, 0xc3, 0xd0, 0x61, 0x1a, 0xbf, 0xbc, 0x12, 0x50, 0x9f, 0xb7 }, { 0xd8, 0x0a, 0x6a, 0xf1, 0x04, 0xce, 0xc8, 0x7e, 0x94, 0x40, 0x39, 0x5f, 0x8e, 0x13, 0xd7, 0x1a } }, { "\xb8\x70\xb8\x5a\x7a\x4e\x90\xe4\xd5\xef\x2d\xf7\x4c\x77\x02\xb9\xf0\x96\x80\x78\xa7\xc7\x51\xe6\x34\x6b\x00\x2d\x1f\x38\x16\xe8\x53\xe4\x14\x43\xc8\xcc\x75\x1d\x82\x15\x87\x8f\x69\x49\x46\xd7\xdb\x04\x57\xc5", 52, { 0xd5, 0x08, 0xaf, 0x1d, 0xfc, 0x44, 0x9d, 0x6a, 0x16, 0x7d, 0x5b, 0x43, 0xb5, 0xb4, 0xe8, 0xdb }, { 0x7b, 0x1b, 0xf7, 0x80, 0x09, 0x9b, 0x69, 0xfd, 0x28, 0xe3, 0xd3, 0xca, 0x7f, 0xaf, 0x43, 0x38 } }, { "\x0e\x4c\xc1\x46\x66\x25\x59\x6c\x93\xdd\x26\x33\x57\xa4\xc2\xe6\x8f\x87\xc6\x27\x18\x3f\xbb\x96\xac\x74\xfe\x28\x09\xba\x0e\xe2\x5d\x51\x01\x25\xa9\x86\x94\x6b\xa0\x5a\xaa\x1f\xe2\x2a\x86\xa1\xbd\x53\xb5\x43\xd8", 53, { 0x19, 0x79, 0xac, 0x33, 0x2d, 0x89, 0xe8, 0x44, 0x32, 0x49, 0xdd, 0x27, 0x48, 0xea, 0xe6, 0xbd }, { 0x58, 0xba, 0xa1, 0x4f, 0x54, 0x23, 0x8a, 0x8d, 0xe0, 0x81, 0xbc, 0xc5, 0x21, 0x00, 0x58, 0xf3 } }, { "\x0f\x70\xb2\xb4\x46\x72\x30\x4d\x06\x52\x8f\x42\x32\x56\xdd\xe8\x54\xc6\xdf\xa3\x6c\xf0\x00\x8b\xa9\x4a\x5c\xb9\xa4\xf8\x17\x1e\x69\xb3\x4e\x25\x6a\x90\xe5\x24\x3c\x5f\x21\xb1\x5e\x57\x18\x40\xbb\x75\x0d\x5d\xf7\x86", 54, { 0xce, 0x90, 0x6d, 0xbe, 0xa5, 0xe1, 0x73, 0x4f, 0x69, 0x27, 0x4c, 0x91, 0x6b, 0xde, 0x5d, 0x5b }, { 0x47, 0x5d, 0xb9, 0x45, 0xa5, 0x74, 0xc6, 0xff, 0xfa, 0x60, 0x6d, 0x86, 0x87, 0x20, 0x05, 0xbc } }, { "\x51\x1c\xf4\x8b\x1c\x17\xa7\xa3\xce\x3d\xeb\x69\xe1\xc6\xb2\xd0\xba\xcd\x47\xb3\xce\x52\xab\x07\xa6\x21\x52\x4d\x14\x2b\x02\xa8\x37\x2c\x4b\xba\xf6\xae\xa8\xe3\x6c\xb7\xa5\x6d\x2f\x83\xae\x32\x5d\x23\x1c\xfb\xd9\x1a\x72", 55, { 0x9e, 0xdb, 0xec, 0x2a, 0xf9, 0x85, 0x76, 0x2c, 0xfb, 0x8f, 0x2e, 0x72, 0x6e, 0x1c, 0x16, 0xb6 }, { 0x6f, 0x3b, 0xe6, 0x0c, 0x03, 0x69, 0x05, 0x4d, 0x4d, 0x69, 0xd4, 0x5b, 0x7b, 0x7c, 0xe6, 0x5e } }, { "\xc3\xa5\x63\x27\x07\x03\x7e\x34\xc8\x9f\x58\xb3\xe6\xab\x14\x35\x05\x6f\xd8\x2e\x47\xcd\xe9\x90\xb9\x42\x00\x48\x16\x85\xe8\xe5\xf9\xd7\x98\xc1\x11\xbb\xec\xfd\xf3\xea\x63\x41\x39\xed\xfc\xd7\x91\x84\x55\x82\x8e\xc2\xdb\xec", 56, { 0x39, 0x8a, 0xf1, 0xd1, 0xa5, 0xbe, 0xe0, 0xa4, 0x8f, 0x53, 0x0f, 0x29, 0x2e, 0x3e, 0x6f, 0xcc }, { 0xa2, 0x3d, 0x2e, 0xb9, 0xd3, 0x5f, 0xd3, 0xd7, 0x2a, 0x0c, 0xd1, 0x60, 0xf8, 0x2e, 0x84, 0x5b } }, { "\xa3\x69\x74\x12\xad\xff\x5d\xf7\x4b\x7d\x29\xda\xf7\x2f\x9d\xda\x9a\x6b\x92\xdc\xc3\xde\xe5\x7a\x8c\xd5\xf1\x9f\xe0\xbd\x69\x66\x2e\x01\x3f\x45\x99\x4a\x8a\x66\xce\x67\xb4\xf4\xf6\xcd\x18\xf7\x23\x9a\xe2\x26\xdd\x1d\xab\x8f\xc4", 57, { 0xd9, 0x6c, 0x27, 0x09, 0x67, 0xc7, 0x35, 0xdb, 0x69, 0x3e, 0x5a, 0xa8, 0x03, 0x6c, 0x7d, 0x86 }, { 0x4a, 0x75, 0xbf, 0xa7, 0x85, 0xc9, 0xd2, 0x40, 0x52, 0xa9, 0xd0, 0x66, 0xf5, 0xd1, 0xe9, 0xc2 } }, { "\x0a\x65\x70\xca\xca\x84\x29\x03\xe2\x13\x62\xe1\xe0\xe3\x06\xdb\x0a\x68\x46\x56\x24\x63\x0b\xe1\x2e\x32\xd3\x44\xef\x8b\x7d\x15\x47\x53\xec\x9b\x62\xea\x53\xa0\xcb\x16\x54\x46\xef\xe0\x8f\x4b\x5e\x43\x34\xd1\xde\xc4\x37\x3b\x8e\x7b", 58, { 0xb7, 0x84, 0x77, 0xc6, 0x0d, 0x64, 0xa9, 0x91, 0x4e, 0x25, 0x05, 0x35, 0xd4, 0x90, 0xf5, 0x9e }, { 0x22, 0x62, 0x04, 0x1b, 0x91, 0x4b, 0x2d, 0x7a, 0x7b, 0xd9, 0xb0, 0x36, 0xdd, 0xa5, 0xa6, 0x11 } }, { "\x9b\x9f\xb3\x05\x6a\xc3\xad\x44\xe1\x8f\x19\x0d\xf4\x80\x2c\x67\x2a\x78\xbd\xa8\x7e\x57\x60\x19\x97\xda\x99\xd5\xde\x26\xec\x28\x8e\xdc\x2d\xf9\xa3\xce\x7e\x53\x67\xba\x75\x22\x4d\x81\xd2\x3d\x65\x81\x58\x5e\x8a\x15\xca\x73\x37\xe8\x91", 59, { 0x54, 0x0c, 0x29, 0x61, 0x6b, 0x3f, 0x76, 0x74, 0x9a, 0xe7, 0xb6, 0xf4, 0x2f, 0x10, 0xb2, 0x7a }, { 0xb2, 0xe0, 0xed, 0x09, 0x39, 0xe3, 0x74, 0x5d, 0x86, 0x13, 0x50, 0xe9, 0x6a, 0x6b, 0x6c, 0xaf } }, { "\x93\xaf\xeb\x5b\x80\x30\x6d\x78\xdd\x49\x95\xe3\x14\xab\xad\x18\xce\x3e\xe7\x97\x12\x4c\x0d\x61\x47\x37\x9e\x66\xb5\xd2\x3c\x7a\x0d\x74\x0d\x15\x33\x6d\x3e\x31\xd8\x3c\xfc\x0a\x63\x38\x1b\x1e\xd4\x74\xdd\x59\x7b\x62\x21\xe2\x27\x1c\xcb\x56", 60, { 0x72, 0x58, 0x6b, 0x50, 0xe7, 0x76, 0x50, 0x62, 0x34, 0x12, 0xd9, 0x25, 0xd5, 0xf5, 0xf0, 0x1a }, { 0x5c, 0x0a, 0xd5, 0x60, 0x95, 0x80, 0xe9, 0x02, 0x9e, 0x47, 0xf4, 0x3d, 0x3a, 0xdf, 0x6d, 0xa9 } }, { "\x53\x7a\x16\x8f\x2e\xf8\x1d\x8d\xc4\x18\xb9\xc3\x34\xf9\x5a\x82\xb9\xae\x98\x65\xb2\x72\xd7\x2b\x30\xbc\x05\x0e\xb6\xb0\x3b\x2d\xa3\xcb\x0e\x93\x9c\x77\x81\x51\x12\xea\xe3\x49\x4d\x99\x52\xed\x16\xba\xf4\xc0\x3b\x99\x88\x96\x33\xb1\xad\xa2\x43", 61, { 0x64, 0xec, 0x37, 0x91, 0xd0, 0x66, 0xae, 0xb7, 0x15, 0x3a, 0x5a, 0x47, 0x1d, 0x6b, 0x7f, 0xe4 }, { 0x0f, 0x83, 0x06, 0xff, 0x82, 0x1f, 0xbb, 0xef, 0x77, 0x5d, 0x8a, 0x33, 0xa2, 0x23, 0x11, 0xaf } }, { "\xe1\xa4\x4a\x9c\xac\x7e\x7c\xf2\xe3\x61\xeb\x2f\x4b\x0e\x5c\x33\x2c\x17\x5b\xa3\x62\x89\x92\x74\xc7\x41\x3d\x0a\xc1\x13\x3b\x3e\x2d\xd8\x6b\x23\xff\x98\x89\x22\xe2\x52\x4e\x97\xcf\x38\xad\x13\x62\xb2\x1b\x25\x40\xc4\x73\xb6\xd7\x52\xc3\x66\x88\x2c", 62, { 0x30, 0x78, 0xcf, 0x91, 0x9b, 0x27, 0x59, 0x79, 0x19, 0xb6, 0xff, 0x27, 0x37, 0x49, 0xa4, 0xbd }, { 0xe9, 0xf1, 0xd8, 0x86, 0x35, 0xa0, 0xbd, 0x12, 0x16, 0x24, 0xce, 0x92, 0x12, 0xf1, 0xaf, 0xdb } }, { "\xff\xdf\xe1\x8e\x76\x07\x58\x47\x95\x0d\x4e\xcb\xf7\x5d\x66\x6f\xe9\xfc\x50\x17\xc0\x41\xd3\x3c\x59\x16\x90\xe1\x4d\xe5\xf5\x4b\xef\x0a\x81\xae\x86\x6f\x3b\x12\x44\x85\xf3\x1c\x3d\x2b\xdb\xdd\x98\xc9\x68\xab\x3f\xc2\xed\x88\x80\x80\x9f\xd4\xa5\xe8\x2d", 63, { 0x22, 0x78, 0x55, 0xa2, 0x9a, 0xa2, 0xd6, 0x8a, 0x3e, 0x38, 0x58, 0xb1, 0xaa, 0x54, 0xb6, 0x78 }, { 0xe4, 0x23, 0xc9, 0xe6, 0x86, 0x5e, 0x44, 0xa9, 0xe7, 0x7d, 0x09, 0x5d, 0x70, 0xf9, 0xa1, 0xb8 } }, { "\x97\xe6\xe1\x6c\x24\x3e\xc0\xc8\x83\x5e\x29\x6d\xed\x98\x2a\x49\x8f\x3a\x18\xf2\xc7\x5b\x5f\x23\x6e\x74\x8c\x57\xdb\x40\x5f\x92\x32\x74\x9d\x41\x85\x66\x28\x8a\xab\xcf\x3d\x92\xcd\x15\x13\xd4\x3b\x22\xc3\x8b\x94\xf7\xe5\xbf\x80\x30\x4e\x8a\x40\x82\xa4\xe3", 64, { 0xc3, 0x05, 0xc7, 0xba, 0xd0, 0x8c, 0xcc, 0x94, 0x7e, 0xb2, 0x62, 0xe5, 0xbc, 0xe9, 0x4d, 0x43 }, { 0x02, 0xe3, 0x87, 0x71, 0xd4, 0x70, 0x92, 0x44, 0x1c, 0x69, 0xe5, 0x3b, 0x80, 0x92, 0xb9, 0x14 } }, { "\xe3\xbf\xaf\x7f\xfd\x39\xbb\xab\xf9\xa8\x0b\xb0\xde\x6f\x97\x1e\xcd\xcf\x3f\xef\x5a\x07\x40\x44\x51\x06\xa5\x07\x1e\x50\xd2\x48\xa9\x53\x79\x0d\x8e\x74\x51\xc0\xfe\x98\x38\xf7\x71\xae\xfa\xdc\x86\xf9\x50\x92\x7e\x72\x63\xc8\xdb\xa9\x1d\x37\x2a\x7b\xe8\xf4\xf5", 65, { 0xd4, 0xd3, 0x0f, 0x48, 0x4a, 0xdc, 0xef, 0x5f, 0xad, 0x08, 0x10, 0xaf, 0x40, 0x60, 0xda, 0x33 }, { 0xba, 0x4e, 0x94, 0x7c, 0x06, 0x8d, 0x1a, 0xd7, 0x68, 0xe9, 0x57, 0xcf, 0x41, 0x3a, 0xc6, 0x60 } }, { "\x74\x1e\x33\x3a\xec\x42\xc1\x54\x55\x80\x6c\xec\x76\x42\x09\xcc\x32\xbe\x6c\x43\xac\xa2\x70\xe1\xc7\x2e\x4d\x94\x47\x8e\x30\x36\xc7\x99\xe5\xbf\x0a\x8e\x96\xa8\xed\x55\x3b\xd5\x4f\x03\xdb\xcb\x26\x8d\x10\xbc\x63\x28\x0e\xc1\x08\x4f\x35\xab\x1c\x05\xe7\x7e\x40\xb7", 66, { 0x28, 0x7f, 0xba, 0xfe, 0x13, 0x9c, 0xc9, 0xf4, 0x3a, 0x6b, 0x6c, 0xa9, 0xe2, 0x4c, 0x42, 0x65 }, { 0x5e, 0xe2, 0x93, 0x10, 0x4f, 0x48, 0x0b, 0xa1, 0xb2, 0xd0, 0x36, 0x4b, 0xa7, 0xd6, 0x11, 0xae } }, { "\xfc\x04\x08\xf9\x49\x2b\x9b\x72\x50\x8b\x59\xaf\x43\x39\x7a\x82\x3d\x56\x36\x16\x2d\xe9\xc1\x6c\xf7\x80\xac\x28\x49\x1e\x51\x1f\x7d\xed\x95\xd2\x1d\xf8\x02\x36\xab\xb1\x0b\xc7\x24\xf2\x92\x30\x5f\x2d\x14\x77\xbe\x2b\xd9\x2e\x90\x89\xb8\x6c\xbd\x76\x0b\x7b\x32\xb6\x31", 67, { 0x0d, 0x79, 0x17, 0x11, 0x23, 0xe3, 0xae, 0x32, 0x9f, 0xa8, 0x23, 0x5e, 0x76, 0x00, 0x8e, 0x0b }, { 0xbf, 0x9a, 0x49, 0x8d, 0x98, 0x3a, 0x1f, 0x54, 0x64, 0x57, 0xe7, 0x6b, 0x55, 0x35, 0xcb, 0xf2 } }, { "\x18\xde\x21\x51\x47\x89\x11\x02\xe2\xf7\x6f\x90\xb2\x09\xe3\x49\x38\x1c\x43\xf1\x38\x7e\xc6\x83\xb2\x34\xad\x6f\x62\x88\x8f\x5c\x09\x75\x75\x1d\x05\x0e\xe0\x92\xe6\x3a\x8d\x8d\xeb\x30\xb7\xd1\x50\x12\x60\x37\xea\x94\xe9\x02\x74\x3a\xb4\x06\x67\x36\xb2\xdc\xad\x04\x77\xaf", 68, { 0x5f, 0xbe, 0x0e, 0x35, 0x05, 0x34, 0x56, 0x50, 0x6d, 0x40, 0x94, 0x7b, 0xde, 0x20, 0x48, 0x2d }, { 0xc2, 0x32, 0xe4, 0x2b, 0xb7, 0x1a, 0xb4, 0xd5, 0x36, 0x11, 0x7c, 0xb7, 0x34, 0x44, 0x41, 0x6a } }, { "\x0d\x13\x37\xc4\xb6\xcb\xd4\x52\xbc\x03\x91\x88\xea\xf4\x77\x82\x94\x9e\xbf\x63\xde\x73\xc6\x2f\x31\x5c\xf2\x7c\x27\xd5\x8f\x39\x99\x59\x3b\xdc\x06\xfc\xba\xf1\x76\xe4\x13\x8b\x38\x1c\xb8\x11\xca\x67\x46\xc2\x36\xd2\xd1\x6c\xbd\x34\xeb\xad\x23\x72\x0d\x2f\x56\x61\xd0\x9e\x3c", 69, { 0xb1, 0xd6, 0x81, 0x66, 0x10, 0xc0, 0xc6, 0x8d, 0xde, 0x14, 0x94, 0x3f, 0x11, 0xaa, 0xab, 0xd9 }, { 0x42, 0xe9, 0x13, 0x96, 0xf0, 0x33, 0x1c, 0x74, 0xd8, 0x6e, 0x16, 0x53, 0x27, 0x00, 0x27, 0x3a } }, { "\xe0\xeb\xdf\x93\x5b\x94\x3e\xc4\x76\x6d\x3f\xc0\x11\x23\x29\x99\x43\x74\xd0\xe8\x3b\xa7\x9b\x7b\xbb\x7c\x74\x16\x16\xed\x1c\x07\xac\xe1\xdf\xdf\xac\x02\xad\x38\x9c\x65\x4c\x1d\x28\xf7\xf1\x12\xb3\x9c\x3c\xed\xc5\x91\xeb\x8f\x62\x16\xed\x5d\xf0\xba\x78\x50\x55\x24\x84\xb4\x2f\xa6", 70, { 0x9f, 0xde, 0x22, 0xec, 0xc4, 0x47, 0x72, 0x5c, 0xee, 0xe4, 0x77, 0x1f, 0x4b, 0x8d, 0xf4, 0x6b }, { 0x10, 0x73, 0xd8, 0xce, 0xd7, 0x4b, 0x46, 0xb4, 0x65, 0x24, 0x4c, 0xd1, 0x4e, 0x65, 0x85, 0x8d } }, { "\x9d\x25\x31\xc4\x30\x64\x8d\x7f\x7b\x95\x63\xf4\xdf\xc4\xeb\x51\x01\x40\x3b\x3d\x51\x69\x46\x49\x07\x95\x84\xf8\x98\x26\xfb\xd2\xd4\x26\xae\x62\xbf\xdc\xda\x15\xc6\xd4\x37\x11\xa6\x23\xde\x91\xe9\x3f\x49\xb9\x9a\x5a\x86\x9e\x0a\x6c\x3f\xb6\x94\x68\xc5\x7f\xa8\xbe\x90\x26\x69\xc5\x38", 71, { 0x25, 0xa6, 0x9f, 0x8d, 0x7f, 0xd1, 0x93, 0x77, 0x85, 0x1d, 0x10, 0x0e, 0x7e, 0xdf, 0x5d, 0x8f }, { 0x4d, 0x90, 0xa8, 0x60, 0x57, 0x18, 0xdc, 0x61, 0xc9, 0x99, 0x05, 0x35, 0xa1, 0x92, 0x8a, 0x7d } }, { "\x38\x95\x55\x5e\x1e\x71\xee\xe8\x57\x94\x21\xed\x4c\xcc\x1b\x1c\x99\xcb\x67\x6e\x61\x2f\x81\x09\xc5\xd0\xbf\x37\x1e\xd1\x24\x35\x77\xea\xe2\xba\xdd\x2b\xa3\x99\xce\xce\xf7\xa5\x33\xd6\xb9\xa2\xcc\xbd\x52\xa5\x94\x07\xb2\xd0\x9e\xcc\xff\x54\x18\xa5\xf9\x6e\x56\x85\x59\xd7\x88\x12\xd8\x8a", 72, { 0x76, 0x83, 0x4a, 0x11, 0x34, 0x5c, 0x50, 0x15, 0x38, 0xac, 0x0f, 0xa1, 0xd5, 0xf6, 0x14, 0x53 }, { 0xfa, 0xb8, 0x79, 0x41, 0x63, 0xb6, 0x10, 0x66, 0xa7, 0x17, 0x04, 0x06, 0xea, 0x1e, 0x8d, 0xda } }, { "\x47\x7d\x03\xda\xa2\x53\x60\xde\xe5\xf3\xfc\x0a\x2a\x2a\x2d\xec\x7f\x99\x90\xa0\x7b\x71\x75\x67\x34\x87\x02\x7b\x5e\x7c\xb4\xf0\x16\xbb\x46\x25\xe9\xba\xf2\x4e\xff\x35\x61\x91\x4b\x86\xd2\x01\x22\x66\x10\x27\x45\xcd\x74\x99\xbe\x30\xa2\x28\xaa\x44\x8d\x3b\x18\x41\x6e\xe3\x2c\xa4\x98\xbe\x28", 73, { 0xe9, 0x61, 0x66, 0x22, 0x9f, 0x85, 0x83, 0xa6, 0x39, 0x70, 0xf5, 0x66, 0xa9, 0x50, 0x68, 0xcd }, { 0xcb, 0xd5, 0x0e, 0x40, 0xb2, 0xe3, 0xaf, 0xe7, 0x80, 0x87, 0x84, 0xe8, 0xe8, 0x41, 0xb2, 0x86 } }, { "\x3f\xc0\x1b\x48\x37\x3c\x99\x44\xa6\xa2\xad\x32\x8b\xde\x91\xf9\xd5\x5c\xdc\x09\x27\x24\xee\x86\xa3\xde\x12\x19\x8d\x35\xf6\x9a\xec\x05\x2f\x05\x76\x25\x30\x05\x8f\x76\xdb\xbd\x52\xb5\xca\x3b\xd0\x95\x9e\xcd\x75\x17\x0b\x5b\xf7\x1c\xc4\xb4\x3f\xc8\xb9\x23\x80\x4c\xba\x64\xc6\x38\x14\xe8\x50\x64", 74, { 0x19, 0x0b, 0x19, 0x07, 0x0e, 0x14, 0x85, 0x4b, 0x38, 0x89, 0x01, 0x66, 0x1b, 0x2b, 0x39, 0x17 }, { 0xbb, 0xba, 0x25, 0xca, 0xad, 0x34, 0x5c, 0x9d, 0x93, 0x40, 0x25, 0x82, 0xdf, 0xa3, 0xb9, 0x4b } }, { "\xe3\x26\xc2\x55\xcd\x13\x71\xc0\xa2\x9d\xf2\x26\xdb\xdc\x4e\xec\x2f\x47\x24\xd0\x72\x4b\x4a\x12\xa7\xae\xdf\xd1\xe9\xdc\xda\xf1\x02\xad\xe5\xcc\x54\xf2\x91\xd6\x3a\xc6\x5a\x32\x77\xb2\x43\x50\x18\x17\xbb\xb6\x8a\xb8\x14\x81\x7c\xe6\x0a\xf2\xfe\x95\x34\x54\x2b\x93\x9a\x8c\xa4\x56\x72\x62\x2b\xc2\xdb", 75, { 0xb3, 0xac, 0x3c, 0x16, 0x7d, 0x9c, 0x5e, 0xc1, 0xd1, 0x45, 0xc7, 0x63, 0x2b, 0xf2, 0x93, 0x6e }, { 0x10, 0x13, 0xd5, 0x36, 0x82, 0x93, 0xfc, 0xaf, 0xcf, 0xba, 0x70, 0xe5, 0xc4, 0x64, 0x74, 0x63 } }, { "\x18\x91\xd2\xe5\x30\xe3\xff\x36\xd5\x29\xc2\x01\x00\xef\xbe\x99\xf0\xdd\xd2\xb6\x5c\xed\x88\x06\xd9\x8a\x0f\x43\xc7\x51\xe4\xb3\xc3\x9a\x0a\x51\xe3\xe4\xdb\x59\x21\xaf\xe6\x8c\x1d\x7d\xfc\xd9\x27\x53\x2d\x59\x06\xc6\x92\x83\x19\x78\xbc\xfd\x48\x13\x7e\x75\xe5\x4e\xa3\xb5\x0a\x74\x05\x0d\x16\xe9\x16\xce", 76, { 0x86, 0x35, 0x23, 0xf1, 0xd1, 0xba, 0xb0, 0xdd, 0x96, 0x53, 0xe6, 0x23, 0xda, 0x9b, 0x86, 0xf6 }, { 0x4f, 0xa0, 0xcf, 0xeb, 0xdb, 0xb4, 0x0e, 0x43, 0xa4, 0xe0, 0x20, 0x27, 0x87, 0xcb, 0x3a, 0x9a } }, { "\x01\x9d\xc5\x59\x43\x36\xad\x4d\x34\x16\xf6\x4b\xb0\xc8\x96\x7a\xf2\x9a\xfa\xc9\xd0\x4c\x4e\xcc\x14\x5f\xc4\x17\x56\x3e\xd5\xe9\xd3\xe9\x57\x03\x0e\x02\xf0\x23\x27\x20\xeb\x64\xb3\x36\x74\x62\xcd\xfb\xc6\xf6\x8d\x9e\x0b\x8d\x0a\x17\xb6\x02\x1e\x68\x93\x98\xf7\xd9\x72\x5e\xb6\xcc\xe6\x01\xf3\x37\x2a\xea\xd3", 77, { 0xb3, 0x76, 0x7f, 0x4d, 0x81, 0xde, 0x88, 0x33, 0x2e, 0x43, 0xea, 0x4f, 0xf7, 0x12, 0x39, 0x5f }, { 0x03, 0xeb, 0xd8, 0x2c, 0x3a, 0x39, 0x86, 0xda, 0xe2, 0x69, 0xd0, 0x67, 0x51, 0x50, 0x9d, 0xb5 } }, { "\xec\xa4\xa3\x87\x39\x5e\x8f\x16\xbc\xfc\xa0\x59\xd3\x50\xf1\xce\x61\x49\x9e\xdf\x0d\x00\x62\x70\x9e\xc2\x5d\x69\x53\x4a\x83\x74\x22\x7d\xbf\xac\xdf\x47\x8e\x59\x7e\xec\xb6\xa1\xd2\xb2\x4b\x53\x36\x09\xd5\x03\x86\xde\xf7\x0a\x2a\x8f\xba\x38\x11\x80\x59\xf4\x41\x06\x38\xfa\x03\x1f\x39\x18\xdf\xc0\xc8\x69\x95\xce", 78, { 0xbd, 0xc0, 0x7f, 0x12, 0xf6, 0xde, 0x13, 0x57, 0x64, 0x68, 0x30, 0xa0, 0x3f, 0xee, 0x93, 0x07 }, { 0xb6, 0x66, 0xcd, 0x74, 0xa9, 0x8a, 0x84, 0x92, 0xbb, 0x5f, 0x30, 0x8b, 0x4e, 0x54, 0x5a, 0xce } }, { "\xd6\x62\x73\x8a\xac\x3e\x70\x2a\x24\x72\xca\x8a\x52\x78\x78\xc7\x2d\xa7\xad\x7a\xcf\x20\x6d\xc8\xba\x75\x40\x9b\x34\xe4\x5a\x18\x7a\x2d\xcb\xf9\x6a\xcc\xe1\x82\xd4\xd0\xa3\xc7\x82\x21\xba\x40\x46\x17\xde\x3d\x01\x5f\xaf\xac\xb1\x69\xac\x2a\x3a\xaf\xe6\xde\x6d\x47\x49\xce\xda\xbe\x4e\x82\x84\x3a\x4b\x12\x8a\xd7\xdc", 79, { 0xde, 0x8c, 0x2f, 0xef, 0x77, 0xcc, 0x2e, 0xb5, 0x3d, 0x63, 0xd9, 0x4d, 0xa2, 0xcd, 0x09, 0x10 }, { 0xb4, 0x7e, 0x4b, 0x9a, 0x72, 0x4d, 0x07, 0xa7, 0xf0, 0x3b, 0x8f, 0x69, 0x22, 0xfc, 0xa1, 0xdc } }, { "\xfe\x6d\x2c\x1c\xf5\x5f\xea\x1f\x30\x7a\xc8\xab\xe9\xd6\xd6\xe1\x78\x95\x20\x58\xe6\x42\x28\x52\x67\xc2\xca\xa8\x3b\xf0\x3e\x1d\xa2\x88\x2d\x83\x46\xfc\x53\xd4\x1a\x67\x44\x8c\x3f\xfd\xb6\x8c\xc0\x7b\x84\x86\xc5\x9c\x3a\x38\x8a\x8d\xd6\x2f\xb6\x1d\xa8\xc7\x6f\x62\x27\x19\x1e\x71\xa3\x29\xe5\x89\x54\xdd\x70\x55\x9a\x4e", 80, { 0x44, 0x04, 0x9a, 0xb4, 0xc1, 0x51, 0x55, 0x2f, 0x46, 0x78, 0x9b, 0x01, 0xa9, 0xb5, 0xeb, 0xf9 }, { 0x1b, 0x65, 0x4e, 0xb7, 0xf1, 0xf0, 0x66, 0x63, 0xf6, 0xb0, 0x36, 0x43, 0x89, 0x80, 0x5b, 0x7d } }, { "\x34\x54\xd8\xea\xe9\xa5\xdb\xf9\x13\x3b\xf8\x54\xd9\xa4\xe9\xaf\x63\x33\x07\x67\x25\x5f\x33\xe3\x44\x1e\x30\xd7\xa4\xef\x2f\x4d\xbc\x5f\xc6\xe3\xd3\xb1\xba\x2f\x14\xdc\x03\x3f\x66\xc6\x25\xa0\xd3\x0d\x60\x66\x9b\x7a\x5d\x2b\xee\x27\x16\x7e\xde\xa8\x21\xae\x85\x3f\x50\xee\x7a\xa8\xe6\x4e\x45\x52\xdf\x85\x4d\x9c\xb0\x4a\x1f", 81, { 0x61, 0xec, 0x00, 0x32, 0x6a, 0x02, 0xd4, 0xaf, 0xe7, 0xa0, 0xce, 0xca, 0x60, 0xef, 0x21, 0x92 }, { 0x82, 0x50, 0x00, 0x25, 0x68, 0x9d, 0xbc, 0x20, 0x51, 0xe9, 0x75, 0x57, 0x7c, 0x69, 0x6f, 0xa9 } }, { "\xa5\xc5\x9a\x8e\xee\x1b\x35\xfa\x65\x18\x03\xd6\x9f\x61\x9f\x62\xf0\xa8\xd0\x6a\x0a\x22\xba\x67\x84\x98\x8d\xeb\x87\xe3\x58\x18\x24\x28\x70\x5f\xbf\xe8\xb2\x8a\x4f\xf3\x7e\xc5\xa5\xba\x0b\xde\xe9\x98\x33\x64\xad\x87\x22\x1c\xfd\xf8\xb1\xe8\xf4\x7c\x12\x1e\x02\xb8\x94\xa5\x07\x34\x34\x5e\x46\xc9\x59\x7c\xdd\x31\x0a\xb7\x81\xc0", 82, { 0xea, 0xbd, 0xf0, 0x95, 0xca, 0x4a, 0x07, 0x9c, 0x7f, 0x66, 0xff, 0xe6, 0x54, 0x18, 0xdc, 0x51 }, { 0xb8, 0x3b, 0x84, 0x10, 0x22, 0x1d, 0x88, 0x08, 0x34, 0x48, 0x19, 0x67, 0xdc, 0x0d, 0x51, 0x2b } }, { "\x0a\xda\x5b\xde\x2f\x73\xbf\x71\x6d\xc6\x87\xe5\xf8\xdc\x31\x86\xd8\xe1\xe1\x64\xed\x7a\xb2\x81\x5f\x49\x04\xcb\x1d\xce\x42\x58\x88\x98\x01\x7a\x9a\x45\xc7\xca\x75\x74\xf7\x5c\x24\x4f\xd9\x71\xf8\x59\xae\xe0\xfe\x5a\x2b\x41\xe6\x71\x66\x4e\x0a\x43\x7d\xdc\x57\x84\x44\x5d\x39\xdd\xed\xf5\x10\xe3\xc4\x2f\x07\x00\x67\xb3\xe5\x6a\x52", 83, { 0x4a, 0x5f, 0x79, 0xb2, 0xe8, 0x2c, 0x5f, 0x29, 0xce, 0xe6, 0xe9, 0x35, 0x5e, 0x9f, 0xd9, 0x16 }, { 0xa7, 0x85, 0x73, 0x73, 0x27, 0xa1, 0x3b, 0xf0, 0xbb, 0x1e, 0x62, 0xa1, 0x89, 0xde, 0x41, 0xa8 } }, { "\x8d\x4d\x67\x8f\x4f\xa6\x62\x34\xb5\xa7\x96\xff\xdf\x32\xef\xdc\x88\x05\x96\x41\x1f\x5f\xb5\x02\xf9\x72\x1c\x2c\xb7\x5e\xa9\x81\x42\x68\x05\x02\x68\xa9\x71\x19\xc5\xc6\xe6\xc5\x3c\x37\xf6\xd7\x08\x85\x06\x07\x86\x73\xd7\x27\x51\xae\xf3\xdb\x3a\x95\xc4\x98\x66\x80\x16\x50\xe1\xbb\x72\x40\x46\x3d\x5f\xbe\x38\x84\xed\x78\x17\xb4\xc7\x8c", 84, { 0x4f, 0xfd, 0x29, 0x18, 0x06, 0x6e, 0x13, 0x44, 0x3e, 0x22, 0xed, 0x6a, 0xb4, 0xb7, 0x09, 0x06 }, { 0x8d, 0x59, 0x8a, 0xad, 0x1f, 0x32, 0xf9, 0x6a, 0xef, 0x22, 0xf3, 0x7a, 0x4c, 0xe0, 0x94, 0xdf } }, { "\x1c\x5e\x5d\xf3\x52\xc1\x37\xf5\x02\x4f\x8b\x52\xd0\x84\x58\xa8\x10\x13\x81\x9c\xe3\xe4\xb2\xc3\x0e\x5d\xeb\x98\x94\x70\xfd\x68\xf6\x0f\xc5\x7c\x84\xdb\x2d\xde\x37\x15\xd9\xb8\xf1\x1c\xd5\x25\x3e\xb3\xef\xef\x8c\xa4\xad\xff\x2f\xf8\x65\x7a\x5a\x4e\xe0\x25\x04\xe4\x42\x2f\x53\x9b\x8b\xbd\x15\x90\xd8\xa8\x34\x7f\x69\xcc\xaf\x47\xd5\x0d\xd7", 85, { 0xae, 0x2f, 0x95, 0xa2, 0xdb, 0xf3, 0x3d, 0xb1, 0x4f, 0x11, 0x3d, 0x76, 0xcc, 0xf5, 0x9d, 0xa2 }, { 0x50, 0x39, 0xe8, 0xd0, 0x07, 0x0f, 0x04, 0xd0, 0x26, 0x21, 0x97, 0x29, 0xdc, 0x3e, 0x19, 0x8f } }, { "\x61\x6c\xf4\x0e\xd5\x90\x2e\x13\x9f\xf7\x83\x61\xdc\x0b\x20\xd7\xdc\xc6\x6a\x83\xb0\x56\x72\xe6\x80\xd8\x05\x25\x94\xde\xd4\x23\x87\x4d\x10\xb3\x63\xa6\x68\xf5\x58\xea\x63\x5c\x1a\x4e\xf9\xc0\xbd\x8c\x55\x40\x39\x17\x1d\x19\x39\x1a\x1d\x9b\x30\xf0\xda\x5d\x2c\xb7\xd8\x47\x87\x14\xfb\x37\x01\x20\x81\x1a\x33\xd2\x18\x79\x59\x65\x90\xae\x8d\xb3", 86, { 0x58, 0xd6, 0x31, 0x61, 0xf6, 0x31, 0x76, 0x89, 0x0b, 0xd9, 0x4f, 0x77, 0x45, 0x0d, 0x71, 0x5a }, { 0x4e, 0x27, 0x6d, 0x04, 0xe6, 0x3a, 0xd7, 0xfe, 0x99, 0x60, 0x0f, 0xb4, 0x5c, 0xb7, 0x99, 0xc5 } }, { "\x9f\x82\x55\x51\x54\x32\x7d\xf7\x9b\xdc\xdf\x8f\x74\xf4\x02\x46\x99\x07\x84\x85\x42\x6f\xb6\xb6\x29\xa9\x31\x2f\x6f\x89\xe4\x10\x98\x0f\x91\xdd\xa2\x07\xc8\xbb\xff\xef\x2a\xac\x97\x82\xd2\xb7\x37\x91\xc2\x57\x18\x59\x61\x2c\x2f\x15\x95\xf0\xb0\xc4\x6a\xf1\xff\x5f\xc4\xf4\x11\xb0\x08\x11\x1d\x22\xd8\x16\xa8\x69\x77\x1c\x38\x66\xbf\x28\xb0\xaa\x7b", 87, { 0xf9, 0x5c, 0xdd, 0x09, 0x7f, 0x10, 0x73, 0x9c, 0x94, 0xea, 0xbb, 0x56, 0x1b, 0x22, 0x35, 0x9a }, { 0x8c, 0x6e, 0x67, 0x84, 0x76, 0xa6, 0xf0, 0xa8, 0xf5, 0x78, 0x68, 0x2f, 0x68, 0x1c, 0x70, 0x41 } }, { "\x4a\x50\xf2\xea\x13\x95\xb3\xdd\x77\xa6\x11\x26\x38\x98\x2e\x41\xea\xb0\x87\x14\xce\xa7\xa2\x6a\x7e\xcd\xf8\x16\xc2\xf0\xe9\xe0\x16\x0c\xeb\x03\x69\x59\xfb\x39\x2c\x94\xab\x0d\xa0\xa5\x47\x7c\x3b\x98\xfa\xef\x81\xd5\x25\x1f\x09\x59\x56\xff\x99\x6f\x82\x42\x9c\x0c\x24\x30\x04\xaa\x66\x7e\x1b\x61\xe5\xff\x35\x4c\x03\x33\x6c\x8c\xe5\xcd\x21\xd0\xfa\xe2", 88, { 0x73, 0xea, 0xef, 0x15, 0xfb, 0x6b, 0x63, 0xec, 0x79, 0xf3, 0xec, 0xac, 0x3a, 0xf0, 0x9f, 0x29 }, { 0xb2, 0xb4, 0x30, 0x97, 0x7a, 0x75, 0x3f, 0xc0, 0x7a, 0x67, 0x74, 0x23, 0x45, 0x60, 0x1f, 0x6c } }, { "\x16\x3b\x98\xeb\xfc\x52\xb5\x5c\xc2\x01\x6f\x61\xcf\xb4\x27\x09\x6c\x70\x0c\xd5\x6b\xed\x6b\xeb\x2a\x0a\xba\x93\x32\x18\x57\x19\x31\xb8\x30\xe2\x8a\x0f\x3c\x8d\x88\xff\xa8\x3d\x28\x09\x1b\xde\xa0\x7a\x7c\x21\x11\xd8\xc0\x3f\xa3\x83\x0f\xca\xe4\x82\x65\x2a\xec\xa5\x8f\x68\x10\x58\x04\x9e\x81\xd4\x08\x47\xb5\x46\xb5\x42\x12\xb4\x1d\x37\x62\xda\xe1\xfd\x2d", 89, { 0xd2, 0x9a, 0x9e, 0x07, 0xef, 0x02, 0xd4, 0x12, 0xaa, 0xc4, 0x85, 0xc9, 0xc0, 0x07, 0xe9, 0xb6 }, { 0x8d, 0x10, 0x39, 0x11, 0x29, 0xf3, 0x64, 0xeb, 0x7c, 0x74, 0xc9, 0x57, 0x17, 0x94, 0x11, 0x9b } }, { "\x32\x0b\x82\xae\xea\x1e\xd7\x76\xe9\xda\xda\x56\xcd\xcb\x4c\x27\x03\x4a\x87\x52\xe9\x48\x2d\xeb\x7f\xd5\x60\x7d\x47\x54\x50\x0c\x8d\xc9\x57\x20\x21\xf8\x0d\x9c\x7f\xec\x55\x63\x25\xf6\xab\xd6\x38\xc5\x26\xc7\x3d\x93\xd9\x7f\x81\x73\x16\xd0\x88\x45\xef\x67\x41\x3d\x36\x40\x77\x58\x03\xb3\xf1\x8f\x00\x39\x23\xcf\x75\xf9\xd2\x06\x16\x0f\xad\xce\x6c\xf3\x0c\xd5", 90, { 0x9f, 0x07, 0x94, 0x3c, 0xbd, 0xd3, 0xbc, 0x92, 0x60, 0xaf, 0x17, 0x0a, 0xc6, 0x6c, 0x44, 0x36 }, { 0x1a, 0x79, 0xf6, 0x17, 0xda, 0xf7, 0x74, 0xa4, 0x1a, 0xb6, 0x50, 0xe4, 0x71, 0x4b, 0x3f, 0x1d } }, { "\xe1\x1a\x5d\x1c\xf4\xff\x2c\xf1\xec\x17\x5a\x92\x66\xcf\xa6\x11\xd4\x9b\x7d\xa8\xdf\xa7\x9c\xb6\x75\x35\xb0\x6b\x40\xe1\xe0\x41\x53\xb0\x0b\x1a\xe1\xb8\xec\xd0\xcb\x07\x71\xa6\x4d\xcd\xed\xbe\xec\x7e\x75\x7b\x85\xf8\x7d\x2a\x41\x26\x30\xc0\xf4\xf7\x8d\x46\xe5\x77\xa1\x78\x86\x18\xbc\xcc\xbd\x65\xc6\x21\x4a\xac\x0e\x78\x8d\x6f\x77\x6e\x91\x74\x96\xcf\x4b\x57\x45", 91, { 0x99, 0x1e, 0x6f, 0x05, 0x36, 0xf3, 0x50, 0xb4, 0x32, 0x9f, 0x67, 0x96, 0x1e, 0x19, 0xf6, 0xac }, { 0x59, 0x1a, 0x28, 0x99, 0xe0, 0x0c, 0x0e, 0x06, 0x16, 0xff, 0xf0, 0x5f, 0x02, 0x74, 0x04, 0x2d } }, { "\x4d\xcf\xdc\xd9\xbb\xd0\x66\x5e\x96\x72\xdb\x95\x45\x05\xde\x32\x0c\x81\x62\x41\xc7\xc8\x1b\x06\x32\xab\x40\xbb\x4f\x9f\x0b\x74\x29\x66\x81\xd7\x64\x90\x54\x26\xe8\x28\x84\xb5\x34\xb9\xd9\xce\xae\x48\x0d\x14\x16\xf7\xe4\x53\x4d\xbb\x7e\xb6\xcf\x0e\x25\x4a\xac\x47\x30\xf1\x91\x5c\xe6\xa0\x70\xa3\xb3\x60\xa7\x77\x0f\x4b\x2d\x6c\x1d\x9b\x7f\x63\xff\x20\x14\xad\x17\x41", 92, { 0x43, 0x66, 0xe2, 0x66, 0x26, 0x23, 0xec, 0x39, 0xb2, 0x14, 0x48, 0x38, 0x16, 0xf2, 0x89, 0xa8 }, { 0xa7, 0xcf, 0x17, 0x9b, 0x69, 0x56, 0x02, 0xa6, 0x02, 0x79, 0xfb, 0x1e, 0xe8, 0x36, 0xf2, 0x48 } }, { "\x19\x55\xe4\x94\xd9\x04\x1f\x63\x2f\x91\x86\x91\x93\x09\x8f\x60\xa6\xfc\x47\xf3\x4d\x64\xb1\x01\xf4\x6e\x28\x8a\xfd\xa2\x98\xe9\xde\xa9\x64\x16\x94\xc7\x95\x1c\xfc\xf1\x8b\xe9\x22\xf8\xad\xd7\xf6\x0d\xc0\x98\x37\x91\x37\x61\x9a\xde\xb1\x1e\x9a\xc6\x86\xc6\x26\x81\x13\x5c\x97\x42\xb5\x9d\x63\x0a\xe6\xdb\x79\x49\xaa\x58\xf3\x0e\xeb\x80\x30\xd2\x07\x4f\x5f\x89\x52\x70\x91", 93, { 0xfe, 0x43, 0x5d, 0xc0, 0x6d, 0xfd, 0x7b, 0x06, 0x8a, 0x53, 0xaa, 0x17, 0x8f, 0x50, 0x9e, 0x01 }, { 0x82, 0x2c, 0x32, 0x35, 0x21, 0x6a, 0x42, 0xef, 0x6a, 0x01, 0xf8, 0xe3, 0x5e, 0x68, 0x8d, 0xf3 } }, { "\x48\x69\x78\x9d\x87\xfd\x3d\x34\xd9\x61\x2c\xc3\x2f\x9b\xf0\xa1\xf3\x59\x3b\x84\x24\x48\x25\xeb\xee\x21\xeb\x2b\x2d\x1e\x5b\x9e\xa0\x3e\x8f\xdd\xb5\x38\x71\x28\x9c\xca\x96\x5c\xd0\x51\xfa\x50\x49\xd9\xfc\x76\xd8\x9c\x5b\x69\xfa\x0c\x17\x76\x1c\xf0\xdf\xe1\x64\x60\x29\xc8\xbe\x02\xd3\xdf\xa3\x46\x3c\x02\x49\x2f\xe2\x72\xeb\xcb\x14\xe4\xe8\x1c\xa8\x66\x26\xc5\x0f\x58\xb5\xc0", 94, { 0xd9, 0xfe, 0x37, 0x6d, 0x62, 0xbb, 0xe6, 0xf9, 0x22, 0xe8, 0xd4, 0xc7, 0x9c, 0xa1, 0x40, 0x3c }, { 0xb9, 0x96, 0x50, 0x6e, 0x38, 0x1b, 0xbe, 0xe5, 0x0a, 0xa2, 0xd7, 0x51, 0x1d, 0x75, 0x20, 0x63 } }, { "\x7b\xcb\x0a\x7c\xbf\xa6\x51\x24\x0b\x54\x01\xa7\x56\x17\x73\xcf\xfd\x08\x85\x58\x76\x8c\x90\x48\x6e\x82\x53\xbc\x51\xf0\x88\x9a\x24\x73\xb9\xd2\x9d\xf9\x14\x61\x6e\x6f\xd9\xc3\x17\x80\xfa\xb0\x2a\x2f\xcb\xee\x49\xca\xfd\x91\x7b\xfa\xe1\x05\xab\x6a\x54\x4a\x7e\x37\xe9\x8d\x33\xfd\xe6\xf1\x05\x0a\x37\x51\xdc\x31\xcc\x5b\xed\xb8\x22\x18\xa8\xe3\x30\x44\xf1\x5e\x9e\xcb\xba\x30\x16", 95, { 0x64, 0xcd, 0xf0, 0x1a, 0x85, 0x0c, 0xf9, 0x7f, 0x1d, 0xba, 0x02, 0xc7, 0x1e, 0x4e, 0x7c, 0x1b }, { 0x69, 0xae, 0x3e, 0x4e, 0xd8, 0x5e, 0x92, 0x15, 0xef, 0x58, 0xec, 0xeb, 0x92, 0xe7, 0x3c, 0x56 } }, { "\x29\x40\x47\xbb\xd6\xc4\x11\xe5\x58\xbf\x4e\xad\x30\x89\x8e\x7e\x02\xea\x27\x6d\xc9\x41\x2f\x9e\x9b\x8b\x3c\x63\xbd\xcf\xd8\x5e\x06\x9e\x59\xf5\x22\x65\x5a\x89\x0e\x01\xc8\x1f\xc4\x96\xb3\x32\xe6\x6e\x98\x63\x66\x4f\xbc\x0d\x50\x3c\xd2\x53\x9e\x20\x20\xc3\xe2\x94\xf7\xe0\xa6\x88\x55\x04\xdb\x2e\x7d\x32\x3d\x3c\x7f\x37\x40\xc4\x15\x82\xe2\xe5\x33\xd5\x6c\xea\x82\xc6\xc9\x42\xc5\x8b", 96, { 0x30, 0x48, 0xaa, 0x96, 0xcc, 0x94, 0xb9, 0xf3, 0x87, 0x11, 0xfa, 0x34, 0x6b, 0x2b, 0xd5, 0x48 }, { 0x8f, 0xbe, 0xd5, 0xa6, 0x68, 0xef, 0xdb, 0xd9, 0x3d, 0xda, 0x4b, 0x98, 0x97, 0x7a, 0xb9, 0x30 } }, { "\x0a\x1f\x5b\x83\x81\x2b\x27\xfd\x06\x8e\x64\xe3\x69\x8e\x93\x31\x43\xfb\x3e\x75\x62\x4e\x12\xde\xf8\xe0\x64\x4e\xcc\x8e\xbf\x99\x06\x8f\x84\x8e\xaa\x90\xfb\x22\xa6\x7c\xfd\x75\x6b\x92\xf2\x31\x7e\x6a\x84\x0c\x5f\xca\xf9\x4b\x79\x7b\x48\xdc\x3d\x22\x5a\x7d\x0e\x85\x3a\xa4\x52\xe8\xce\xce\x16\x61\x06\xae\xe7\x4d\x12\x39\x28\x1b\xbc\xb0\xd3\x9e\xea\xb7\xcf\xc5\x34\xb1\xf3\x24\x1f\x43\x0d", 97, { 0xe5, 0x50, 0x67, 0x79, 0xd1, 0xbc, 0xa0, 0xf8, 0x1a, 0x7f, 0xdc, 0xda, 0x55, 0xa3, 0xc0, 0x71 }, { 0x75, 0xc6, 0x10, 0x5b, 0xba, 0xf1, 0xe7, 0xbd, 0x19, 0xd2, 0x6b, 0x1d, 0x04, 0x18, 0x68, 0x71 } }, { "\xd0\xd9\xf9\xdb\x50\xaf\xe1\x44\xd3\x11\xb7\xc4\xe9\xa4\x49\xbc\xd2\x34\x70\x2e\xbd\x20\xc3\xd8\x8d\xce\x7e\xc9\x3f\x84\x3c\x45\x2d\x6a\xc9\x63\x79\x37\xec\x08\xe2\x27\xda\xa6\x1c\x3a\xa7\x6a\x4e\x12\x91\xc4\xce\x3d\x21\x17\xc0\xc1\x8b\x11\x44\xbc\xc7\xc7\x04\x82\x91\x3b\x17\x02\x6a\x7b\x5e\x62\x8a\xb9\x76\x35\xb5\x41\x2d\x8c\x63\x55\xb9\x74\x79\xca\x59\xa7\xc5\xb3\x07\x40\xca\x7e\x10\x50", 98, { 0x22, 0x0e, 0x71, 0xf2, 0x7c, 0xf7, 0x8a, 0x76, 0xe9, 0xc8, 0xc2, 0xbf, 0x02, 0x49, 0xf0, 0xf3 }, { 0xd0, 0x5e, 0x7c, 0x8a, 0x27, 0x8d, 0x94, 0x35, 0x3d, 0x11, 0xbb, 0xd2, 0x94, 0x3f, 0x91, 0xa8 } }, { "\x62\x5b\xe8\x7d\xa7\x7a\xa7\xb6\x86\x65\x64\x11\x0e\x19\xa1\x05\x02\x60\x2b\x24\x6c\xa5\x26\x73\x42\x7a\x89\x76\xf9\x88\xb8\xa2\x2a\x0b\xa3\xb7\x39\x89\x9a\x25\x16\xeb\xec\xe1\x7e\x0c\x28\x81\x22\x56\xa8\x88\xcb\x7f\x75\x9f\x2f\xfd\xda\xfb\x46\xfe\x4f\x14\x18\x47\x7a\xc5\x90\x2d\x3f\x9c\xd7\x45\xd6\xc1\xae\x90\x14\x5d\xe9\xf4\xe5\xdd\x59\xd2\xca\xf9\x53\x6b\xb4\x49\xc3\x35\x87\xcf\x94\x71\xf0", 99, { 0xea, 0x58, 0x32, 0xd8, 0x93, 0x3c, 0x75, 0x65, 0x02, 0xa8, 0x33, 0x6d, 0x07, 0xfc, 0x91, 0x04 }, { 0xa3, 0xc5, 0xd2, 0xb0, 0xc3, 0x48, 0x60, 0xb0, 0xc3, 0xa8, 0x17, 0x9a, 0x8b, 0x4d, 0x78, 0xa6 } }, { "\xf5\x89\x34\x2f\xa8\xb7\xc7\x9b\x9c\x1f\x63\x9d\xc7\xe8\xe3\xbc\x34\x07\x5f\x3f\xe9\x6b\x90\x3d\xb1\x08\x9a\xc1\xf9\x77\x97\xcc\xde\x58\x06\x12\xb4\xc3\xd1\xef\x1c\xa9\x94\xd7\x36\xe9\x50\x75\x71\x10\xc7\x1d\x99\x47\x86\x6e\xb6\xf9\x35\xf6\x4c\x3f\xb2\x5f\xd6\x9d\x07\x26\x38\xc4\x5d\xbb\x20\x8e\x83\x1c\xd8\xd6\x38\x24\x04\xac\xc8\x4c\xbf\x8c\xf0\x91\xb1\x55\xd9\xd9\x14\x6c\x44\xc0\xc7\x56\x19\xff", 100, { 0xfc, 0xe1, 0x98, 0xbf, 0xd7, 0x5a, 0x35, 0x20, 0xca, 0xdf, 0x53, 0x28, 0x03, 0xec, 0x3d, 0xeb }, { 0x4b, 0xc9, 0x36, 0x41, 0x6f, 0xfe, 0x90, 0x20, 0x09, 0x5e, 0x5e, 0x46, 0x07, 0xd0, 0xea, 0x33 } }, { "\xc0\x8e\x50\xb1\xcd\x45\xb2\xe9\x00\xbc\x60\x73\x31\xe3\x03\x2e\x49\xa2\x23\xf8\xf2\x01\xbd\x00\x3a\x67\xb2\xd5\x99\xbf\x4f\xdd\x96\x38\x51\xd4\x6c\x56\xbd\x7e\x72\x00\x34\x3c\x61\xa6\xb9\xa0\x28\x94\xfd\x56\x78\xb2\x41\x8e\xe8\x9e\x33\x3c\x7d\xfc\xe5\x99\x1b\x78\x15\x29\xb0\x77\x0b\x9f\x3c\x0d\x77\x8d\xc5\x13\x16\x1a\xeb\x5a\x5d\x4e\x4f\x83\x36\xfc\xd5\xb8\x3f\x82\x2a\xbe\xee\x4c\xa2\xf4\xa5\xfd\x37", 101, { 0x9a, 0x5d, 0xb1, 0xd8, 0xed, 0x62, 0x9a, 0x10, 0x80, 0x56, 0x14, 0x1d, 0x2b, 0xb9, 0x3c, 0xed }, { 0xbb, 0xb5, 0x5f, 0xd1, 0x5e, 0xa7, 0x5a, 0xdc, 0x4e, 0x0c, 0x5d, 0xa0, 0x76, 0x32, 0x1a, 0xe1 } }, { "\x5b\x00\x12\x98\x06\x8d\x02\x3e\x66\x62\xb9\x48\xaf\x0d\xa5\xd8\x8b\x63\xc9\xa1\x68\xaa\x1b\xe3\x25\x5c\x63\xf2\x64\x65\x7a\x0c\x95\xcd\x08\x37\xf8\xc6\xcd\x43\xde\x80\xaa\x68\x74\xae\x5a\x8f\x31\x67\xc8\x07\x88\x79\x2e\x46\x9d\xb9\x08\x6f\xd2\x2c\xd5\x4e\x29\xe4\x67\x98\x6d\x80\xac\xa1\xa3\x70\x2b\xf6\x46\xd1\x12\xc3\xd0\x22\x50\xb2\x33\x7f\x5c\xba\x1c\xb3\x7f\x52\xe4\x38\x82\x92\x3c\xfc\x20\xf2\x62\x08", 102, { 0x2a, 0xc6, 0xe7, 0xae, 0x6f, 0x11, 0xfd, 0xde, 0x0e, 0xb9, 0x30, 0x50, 0xc1, 0x92, 0x65, 0xaa }, { 0x5d, 0x90, 0x7e, 0x73, 0x13, 0x3b, 0x2d, 0x5e, 0xbc, 0xcf, 0x19, 0x69, 0xf8, 0x8b, 0x58, 0x60 } }, { "\x05\xd4\xc4\x19\x7c\xc7\x01\xb7\xd0\x9e\x3c\x89\xe7\x3d\xcd\xda\x3f\xb7\xc2\x9e\x9c\x6f\x19\x10\x2a\x8e\xb3\xcd\x0b\x67\x57\xe5\x3a\x45\x8d\x35\xa6\x74\x74\x64\xb9\xb3\x23\x56\xf9\x20\x47\x1c\xac\x67\x75\x03\xc2\x93\x5e\x23\x16\x88\x3a\x83\x9f\xaf\x81\xd5\x5c\xf5\x91\x9d\xe5\xa7\x49\xe6\xf0\x8d\x8d\xf8\x61\x51\x68\x1f\xfa\x64\x49\xa5\xf2\xa8\xb0\xdf\x82\xfa\x19\x7c\xd4\x75\x1f\x12\x91\x47\x74\xd8\x9e\x0b\x57", 103, { 0x9e, 0x7d, 0xd4, 0x07, 0xa6, 0xf4, 0xcc, 0x5c, 0x39, 0x2a, 0x68, 0x68, 0x5e, 0x83, 0xc5, 0x40 }, { 0x46, 0x4e, 0x89, 0x61, 0x33, 0x28, 0x45, 0x8b, 0x64, 0x6a, 0xa6, 0x77, 0xf6, 0xf4, 0xea, 0xf6 } }, { "\x64\x1a\xc1\x67\x59\x18\xbc\x5f\xd6\x16\x3b\xa8\x1d\x2f\xac\x8d\x07\x34\x5d\x20\xc7\x47\x59\x98\x7e\x94\xec\x8a\x73\x29\xeb\x75\x30\xaf\xa2\xa3\xa5\xf6\xb1\xc6\x16\xfb\x2a\xba\x0d\xa2\xb2\x84\x12\x43\x81\x1e\x51\xa5\x54\x5b\x29\x9f\x95\x87\xf4\x27\xa0\xce\x3d\xb9\x37\x00\x3b\x78\x70\x47\x2a\xb2\x1c\xe4\x83\x7b\xa6\xae\x48\x7e\x97\x14\xb3\x88\x98\x63\x0c\xf5\xd5\x77\xf8\xfb\x8f\x33\x77\x17\xcb\x82\xdb\x01\x59\xd4", 104, { 0x70, 0x4a, 0x67, 0x68, 0x01, 0x8f, 0x56, 0xdc, 0x1e, 0x7c, 0xef, 0x98, 0x5b, 0x0d, 0x0c, 0x94 }, { 0x7d, 0x17, 0xb3, 0x9b, 0x7b, 0x77, 0xe6, 0x41, 0x70, 0x46, 0x6b, 0xdf, 0x21, 0xdf, 0x7d, 0x4e } }, { "\x75\xce\x19\x27\xfb\xe0\x1c\x44\x6a\x45\x4a\x15\x22\x1d\x93\xb0\x67\x56\x18\x18\x12\x28\x60\x9a\x87\x5e\x12\x76\xe3\x7e\x0a\xb6\xac\x34\x45\x97\xe9\x28\xcc\xa7\x40\x4a\x16\x33\xae\x20\x2a\x8e\xc1\x6a\xd2\x57\x94\x5f\x99\xf4\xf2\xe9\x67\x24\xa1\xbf\x15\x11\x4e\x39\x05\x7f\xc7\xe1\x83\x9c\x5d\xe8\x86\xac\x48\x88\x30\x13\x25\xd8\x2b\x15\x1f\x0f\xa3\x9b\xb8\x83\x3d\xbc\xb2\xe6\x72\xdf\x32\x24\x01\x8e\x1d\x4b\x9e\x8a\x32", 105, { 0xb4, 0xcb, 0x6d, 0x6b, 0x31, 0x3b, 0x0a, 0x3e, 0xc4, 0x44, 0xaa, 0x1d, 0x47, 0x60, 0xdd, 0x6f }, { 0xe9, 0x84, 0xcc, 0x0a, 0xb9, 0x41, 0x7c, 0xaf, 0x19, 0x33, 0xf8, 0xcb, 0x82, 0xf1, 0x2f, 0x88 } }, { "\x4c\xa8\xec\xde\x53\xc1\x8e\x97\xf0\x8a\x20\x5d\x08\x49\x49\x61\x58\x3f\x51\xa8\x2a\x03\xef\xb2\x1d\x9d\xba\xf0\x71\x05\x94\xc1\xf9\x53\x65\x8d\xe4\xa3\xb2\x26\xa8\xe0\xe5\x53\x52\xa2\x35\xc2\x4b\xd9\xac\x81\x14\x3d\x2f\x1a\x40\x27\xcf\x68\x38\xea\xda\xf9\x75\x1b\xdf\x12\x7c\x12\x59\x02\xe1\x5f\x38\x3d\x59\xbf\x89\x6d\xb5\xdb\x88\xf0\x2e\x22\x8d\x52\x0a\x0e\x10\x1d\x6b\x12\x6a\x59\xe7\xbf\x29\x40\xc7\x07\x10\x86\xda\x6c", 106, { 0xe5, 0x0b, 0x80, 0x3e, 0x9d, 0x6c, 0x8f, 0xd4, 0x7a, 0xb2, 0x7f, 0xa7, 0xc4, 0xa6, 0xaf, 0xf0 }, { 0xdb, 0xfe, 0xc5, 0x92, 0x9c, 0x3d, 0x57, 0x37, 0x1e, 0x96, 0x69, 0xd8, 0xc9, 0x88, 0xae, 0x85 } }, { "\x0b\x05\x75\x1e\xdf\x8e\x11\x5e\x96\x92\xe8\xd3\x3f\x21\x80\x89\xb4\xad\x32\xb8\x6e\x49\xf3\xb3\x1f\xd7\x45\xd9\xfb\x95\x3b\xea\x31\xa8\xfd\x36\xa9\x9b\x7d\x91\xd0\xea\xdc\x7a\x24\x88\x79\xa4\xce\xb4\x6e\x40\xea\x5c\xce\x27\x4f\x36\xd6\xe0\x7a\x3f\xdd\x87\x7d\xaf\x2a\x6d\xc4\xe7\x11\xdf\xb7\x2f\x20\x6e\xa2\x65\x61\x64\xb4\x29\x0d\xc5\xdc\x1c\xf6\xa6\xbf\x5b\xff\xe1\xb8\xea\xf8\xee\x5f\x92\x1a\x9d\x1f\xda\xe4\xec\x14\x75\x46", 107, { 0xac, 0x6d, 0x0f, 0xbb, 0x31, 0x09, 0xbd, 0x86, 0xc8, 0xdb, 0x71, 0xc2, 0x4c, 0xf8, 0xd4, 0x2d }, { 0x33, 0x1e, 0x6e, 0x74, 0xf6, 0x5d, 0x75, 0x94, 0xdf, 0xf7, 0x13, 0x50, 0x6e, 0x8e, 0x3e, 0x66 } }, { "\x2f\x3f\xfa\x63\x4e\x0d\x7e\xf6\xfd\x46\x85\x50\xd8\xf1\x3c\xdb\x8c\x6a\x68\x94\x61\x08\x3e\xbe\x72\xaa\xe9\x2b\x16\xda\xf7\x92\x03\x4d\x38\x74\x33\x40\x59\x52\xfc\x9b\x61\x09\xa8\x73\xd3\x2a\x6a\xe2\x21\xb0\xa0\x9d\xa7\xe9\xd7\xf4\xd0\x83\xd8\x6b\x3b\x10\xbf\x63\x79\xd8\x1b\xce\x85\x60\x42\xa4\x25\x49\x35\xd5\xa3\x31\x0d\x38\xa1\xb9\xfb\x3c\xce\x55\x5e\x61\x4c\xf0\xb9\x2d\xcd\x82\xb9\x61\x09\xb5\xf5\x24\x18\xd6\xd4\xc3\xaf\xdb", 108, { 0x80, 0x6f, 0x88, 0xae, 0xd3, 0xc4, 0x0b, 0xee, 0xea, 0x85, 0xb8, 0xb2, 0x4e, 0x17, 0xef, 0x5e }, { 0x97, 0xc1, 0x12, 0x6e, 0x5e, 0x39, 0x63, 0xdd, 0x6f, 0x3e, 0x50, 0x6f, 0x9b, 0x2a, 0x63, 0xb2 } }, { "\x29\x48\x9a\x67\x6e\x1c\xa7\xb9\xf8\x5b\xba\xbd\xf8\x80\x65\xa2\x95\xfc\xd5\x43\x52\xb3\xdc\xc5\xb4\xc0\x4a\x5a\x2c\xae\x35\x54\x59\x75\x45\xc4\xa2\xd1\x18\xb8\x70\x54\x71\xcc\x71\xee\x2d\x4e\x13\xe8\x44\x7b\xd5\x4c\x3c\x04\xb6\x86\xfa\x63\xe7\x89\x8d\x31\xc3\xae\xde\x56\xad\x10\xef\x6e\x2b\x0e\x90\xbf\xcb\x02\x4d\xfd\x28\x1f\xe0\x82\xef\x67\x30\x35\xb5\x75\x4d\xf1\xd5\x27\xeb\x34\x98\x31\x26\x4d\xf2\xd2\xc5\x91\x72\xe2\x22\xc3\x3f", 109, { 0xd6, 0x48, 0x7e, 0xb3, 0x90, 0xe3, 0x9c, 0x12, 0x03, 0xf5, 0x8a, 0xa7, 0x83, 0x46, 0xe3, 0x6e }, { 0x28, 0x20, 0x27, 0xad, 0xd9, 0x50, 0x46, 0x18, 0x87, 0x63, 0xbf, 0x4a, 0x6a, 0xc1, 0xeb, 0x57 } }, { "\x58\xdb\xa7\x08\xed\x0f\x20\x3d\x9e\x18\xe9\xd3\x9b\xe9\xa6\x18\x6a\xe9\x28\x28\x7d\x67\x3f\x21\x52\x46\xb5\xec\xae\x1e\xd3\x34\xa3\xf0\xe5\x62\xb1\x5e\xda\xd5\x7e\x62\x4c\x0f\x82\xc7\x13\x9b\x00\xee\x9a\x59\xcb\x47\xd7\x9e\x7f\x3e\xa1\x53\x99\x26\x97\x2a\xfa\xd8\xe3\x04\x3c\x5c\xe8\x77\xdf\xb0\x6c\xfb\x64\x2b\x70\x64\x1e\xb4\x86\xcd\x90\x60\x0b\x56\xdf\x67\x70\xc9\x90\xfd\x65\x5b\x9a\xc1\xd6\x97\x2a\x84\x1c\x30\x9f\xb3\x7c\x99\xa2\xfd", 110, { 0x93, 0xf2, 0x48, 0x67, 0x60, 0x1d, 0x5c, 0x64, 0x9f, 0x7d, 0x4a, 0x89, 0xd9, 0x75, 0xad, 0x4e }, { 0x58, 0x61, 0xdd, 0xd0, 0xdd, 0x12, 0x1a, 0x39, 0x17, 0x2e, 0x26, 0xb4, 0x79, 0xda, 0x11, 0x2f } }, { "\x0e\x35\x9a\xdd\xbe\xf9\xd1\x44\x5c\x35\x30\x35\xd1\x20\x7e\x3a\xa8\x15\xef\x8f\x03\xab\x64\x28\xdc\x36\x94\x8f\xc4\x67\x06\x8b\x73\x39\x73\x4f\x71\x0d\x26\x26\x46\xa0\x6b\x63\x5e\xac\x37\xa8\x95\x77\x9f\x8a\xd9\xcf\x06\x4d\x7a\xb9\xf8\x0f\x81\x9b\x69\xe7\x2a\x16\x75\x40\xda\xac\x31\xa3\x89\xb7\x19\xf2\xf9\x5c\x7a\xb1\x80\xb9\x1f\x06\x0a\x47\xb0\x99\x8d\xf9\x13\xd5\x9a\x55\xc3\x2f\xaa\x7f\x10\xbd\x4a\x0f\x7a\x1e\x6d\x69\x66\x53\xa3\x41\x31", 111, { 0xa8, 0x9c, 0xc1, 0x1e, 0xe2, 0x0a, 0x6b, 0x9e, 0x13, 0x13, 0x78, 0x39, 0xff, 0xb1, 0x59, 0x70 }, { 0x92, 0x39, 0xa4, 0xa8, 0xc4, 0x02, 0x5a, 0x0e, 0x37, 0x56, 0x27, 0xe5, 0xe2, 0x5c, 0xbd, 0x7b } }, { "\x39\x9b\x52\x70\x4f\x0e\xa7\x5b\xde\x3d\xe6\xfb\x38\xd0\xdf\xe4\xe4\xb4\xc6\x23\x09\x25\xb5\xb4\xc1\x8b\x71\x00\x5e\xc3\xdc\xc2\x26\x9d\xb3\xaa\x74\x0c\x5e\x8f\xf0\x7a\x8d\xf2\x1b\x9a\x67\x85\xca\x37\xa1\x59\x23\x96\xec\x69\x57\x9f\x57\x86\x18\xa5\x4d\xc2\x43\x36\x0f\x1d\x7e\xd3\x23\x64\x01\x4d\xe4\xdb\xc7\x84\x76\xa4\xe4\x80\x7c\x5c\x5c\xd9\x1e\x80\x9c\xc4\x00\xc6\xa7\xa6\x43\x74\x15\xe0\x86\xc1\x5d\xbe\xf6\x30\x05\xab\x2f\xfe\xe4\xf4\x2c\x74", 112, { 0x9f, 0xb3, 0xba, 0xeb, 0x69, 0xce, 0x2b, 0xde, 0x17, 0x88, 0xde, 0xc3, 0x27, 0x61, 0x5c, 0x20 }, { 0xb1, 0x9e, 0x03, 0x92, 0x62, 0x5a, 0xfb, 0x4c, 0x5d, 0xdf, 0x87, 0xdf, 0xbf, 0x80, 0x75, 0xa4 } }, { "\x03\x6a\xd1\x9d\x50\x43\xa7\x88\xc0\xcd\xdd\x3c\xe9\x4f\x63\x53\x9c\xc2\xce\x59\x8d\x38\xf9\x63\x16\x3b\x5a\x86\x82\x1d\x36\xd1\xc2\xc7\x34\x43\xe2\xcd\x35\x7e\x8b\x7a\x96\xa3\xe5\x22\x56\xfd\xde\x0f\xa1\x62\xed\xc8\x95\xd1\x4e\x10\xa6\xee\xa6\x4a\x5c\x52\x13\xdd\x50\xb5\xc9\xad\xe1\xfd\xa7\xb8\xdd\x46\x2d\x33\x40\x43\x8e\x52\x28\xc9\x61\x97\x60\xe4\xe8\x5e\x36\xcc\xa4\xe6\x26\x7f\x2f\xd0\x98\x69\xd8\x32\x84\xa8\xd0\xc0\x8f\x22\xab\x57\x85\xb4\x8d", 113, { 0x47, 0x3a, 0x23, 0x8e, 0x1b, 0x64, 0x93, 0x2a, 0xd4, 0x2c, 0x75, 0xba, 0x78, 0xb2, 0xe7, 0xcc }, { 0x29, 0x5b, 0xd3, 0x6b, 0x00, 0xc9, 0xc1, 0xf6, 0x63, 0xa7, 0xe0, 0x02, 0x05, 0x1d, 0xcd, 0x22 } }, { "\xd5\x21\x09\x05\x28\xc3\x5e\xdf\xd4\x3c\x69\x3f\x02\x9b\x1d\x65\x92\x56\x33\xfa\x01\x25\x9c\x62\xe1\x0a\xdd\x41\xf6\xb8\x56\x7f\x4e\x01\x70\xb2\x21\x95\x3f\x9a\x1b\xe6\xfc\xd0\x56\x0f\x67\x2b\xfb\x2f\x46\xc6\xf6\x76\x6c\xdb\x89\x2c\xdb\x6f\x50\xbb\x45\x74\x9d\x3d\x56\x94\x5b\x46\xe0\xc3\x67\x37\xd5\xdb\x3b\xe6\x5f\xa9\xda\xa9\x5d\xcf\x5b\xc3\xa9\xb7\xba\xf4\xd2\x5c\x88\x25\x81\xa3\x4a\x76\x93\x73\x23\x2f\xad\xec\x56\x71\x75\x89\x3f\x72\xb1\x68\x10\xc7", 114, { 0x69, 0x94, 0x11, 0x43, 0x29, 0x54, 0xbd, 0x22, 0x6f, 0xf0, 0xd2, 0x35, 0x88, 0xc2, 0xa5, 0x6b }, { 0xaf, 0xeb, 0x63, 0xf1, 0x13, 0x34, 0x21, 0x15, 0x12, 0x03, 0x8a, 0x84, 0xb9, 0x15, 0x1c, 0xa4 } }, { "\x59\x3d\x8d\x75\x6f\x9c\x96\xc1\x6d\xc7\x68\xa3\xae\x0f\xe1\x6d\x84\x3d\x3a\xb5\x74\x76\x77\xb1\xe3\x02\x67\x06\xa0\x82\x27\x2f\x5d\xe4\xac\x95\xd0\x03\xe2\x0e\xd1\x0a\xcd\xf6\x23\x34\xac\xfb\x66\x86\xac\xd9\xf8\x5a\x66\x80\x6f\xb8\x47\x70\x11\xeb\x7c\x3c\xe4\xa5\x7e\x41\x95\x50\x2e\xfe\x1a\xd4\x99\xe0\x25\x99\xb6\x7e\xae\x8f\x12\x8a\x40\xc5\x5b\xc4\x3f\xa2\x27\xe7\x4a\x67\x05\x01\x92\xb4\x2d\x3e\xf2\xb6\x35\x10\x27\x22\xb0\xe3\x0f\xba\x4e\xde\x84\xcc\x0f", 115, { 0x6a, 0x83, 0x99, 0xcb, 0x71, 0xb0, 0x54, 0xfd, 0xcb, 0x00, 0xd9, 0x26, 0xc3, 0x59, 0xe7, 0x19 }, { 0x4e, 0xb3, 0x47, 0x44, 0x0b, 0xae, 0x11, 0xc9, 0x55, 0x22, 0x53, 0x9c, 0x51, 0xa5, 0x68, 0x70 } }, { "\x10\xac\x6f\xae\x54\x0d\x10\x94\x90\x98\x9a\x55\x44\xd6\xb7\x4e\x7f\x81\x0e\x41\x6d\x8a\x9c\x59\x64\x40\x6d\xbb\x0b\x0e\x16\x0b\xe1\xbf\xa9\x3c\xcc\xe6\x07\x1f\x89\x52\xb8\xbc\xd9\x97\x89\x8c\xaf\xb8\x1f\x2d\x0c\x88\x37\x5d\xa0\xb6\x1e\x4f\x05\xfe\x9f\x8b\x8a\x31\x77\x68\x74\x2b\x20\xe5\x27\x36\xab\x32\x59\x85\x48\xa5\x1e\x27\x41\xa9\xdb\x2a\x8a\xd0\xa2\x37\x24\x69\x9f\x7a\xb6\x3b\x13\x2a\x16\x3d\x69\x35\xe2\x17\x25\x6f\xdf\x09\x90\x94\xf6\x87\xee\xb6\xe5\xf1", 116, { 0x1f, 0x37, 0xab, 0x6f, 0x06, 0xc4, 0x09, 0x00, 0x59, 0xda, 0x2e, 0xd3, 0x01, 0xdc, 0x4d, 0x03 }, { 0x56, 0x40, 0xa8, 0xf8, 0x94, 0x6c, 0x82, 0x5b, 0xf4, 0x88, 0x16, 0xb8, 0x1a, 0x69, 0xce, 0x08 } }, { "\xd8\x33\xce\x43\x0d\x50\x12\x77\x70\x53\x57\x1b\xba\x1c\xf0\x18\x07\x7d\x82\x9e\xe5\x0e\x84\x32\x61\xad\x3c\x92\x8d\x8b\x91\xfa\xa0\x65\x66\xfb\xa2\x73\xe8\x39\x69\x0a\xd7\xbf\x25\xda\x1c\x45\x6e\x09\x59\xb8\xf1\xb0\x9d\xc1\x45\x05\xe9\x57\x44\x64\x23\xbf\x99\x96\xa7\x78\xb7\x9b\xb3\x92\x5b\x4e\xac\xbd\x51\x87\xf4\x1d\xda\x2f\x2b\x06\xd5\x67\x9f\x9f\xcb\xf3\x31\xbc\x09\x05\xeb\x28\x53\x5f\x0e\x9a\xe8\xb5\x05\x41\x77\xbf\x55\x68\x7c\xe9\x18\xe8\x1f\xb9\x4c\x84\xf6", 117, { 0x6d, 0x09, 0xe8, 0x44, 0xe3, 0x0b, 0x04, 0xbd, 0xa3, 0x6d, 0x81, 0xd9, 0x2c, 0xa1, 0x9e, 0xe7 }, { 0xbe, 0xf4, 0x1c, 0x5f, 0x44, 0x51, 0xe4, 0xbb, 0x58, 0x65, 0x2a, 0x31, 0xc1, 0xa0, 0x9e, 0x7e } }, { "\x93\xf8\x52\x5b\x1d\x29\xae\xc9\xe7\x21\x74\xfd\xf8\x46\x1e\x29\x88\x23\x45\x4f\xec\x37\x65\x34\xf9\x99\x14\xeb\x5f\x14\x16\x0e\x92\xc5\xa3\x7f\xf1\x0f\xa4\xdf\x68\x97\x28\x0a\x18\x95\xed\x77\x9d\x95\xb1\x81\xa5\x2c\xa9\x8b\xc8\xf1\xd4\x3d\xd4\xbd\xb9\x14\xbc\xfb\xbf\xde\x9a\x5c\x2a\xbf\x3c\xd4\x8f\xbd\x57\x12\xb6\xb0\x98\x0f\x7e\x76\x0f\xa5\xf5\x20\xfb\x43\x86\xe0\x66\xfd\xd6\x9c\x87\xcc\xf2\xa8\x2c\xe9\x8b\xab\x47\x00\xb1\x74\xa7\x2d\xfc\x1c\x5a\xd3\x7c\xfa\xf8\x49", 118, { 0x79, 0x5f, 0xf9, 0x75, 0x07, 0xd7, 0x82, 0x1d, 0x71, 0x57, 0x3d, 0x8d, 0x23, 0x99, 0x8c, 0xc5 }, { 0x86, 0x19, 0x0c, 0x98, 0x55, 0x16, 0x22, 0x4f, 0xc3, 0xf2, 0xc2, 0x04, 0xd6, 0x0a, 0xfe, 0x87 } }, { "\x56\xd8\x73\x6c\xd6\xfd\x45\xcb\x7c\xd0\x2c\xa9\xb2\xfb\x59\x78\xb8\x95\xfd\x27\xdd\xdc\x7d\xef\x7a\xc1\x3e\xc8\x6d\xad\x0e\x17\x1f\x04\xd6\x31\xc4\x49\xc5\xc7\x86\xb3\x37\x78\xae\xce\x4f\x30\xe7\xde\x04\xdc\x22\x68\x95\x40\x67\x13\xe0\x01\x78\x81\x35\xe9\x44\xf2\x32\xb1\x9f\x9b\x4b\xc7\x30\x7f\x1b\x6e\xa4\x19\xf0\x90\x38\xa8\xea\x74\x2a\x7e\x68\x32\xb2\xe1\xd4\x0a\x55\x86\x49\x4f\xc6\xcc\x3c\x70\xbb\xb3\x2c\x99\x42\x1a\xd1\x62\x1f\x9c\x23\x1c\x88\x40\x40\xf8\x8f\xb8\x68", 119, { 0x63, 0xd9, 0x9f, 0xb8, 0x4e, 0x24, 0xf1, 0xf7, 0x82, 0x98, 0x25, 0x0f, 0x30, 0x24, 0xad, 0x24 }, { 0x76, 0x7e, 0x9b, 0xec, 0x29, 0xc5, 0x66, 0x49, 0x70, 0x69, 0xf6, 0xb5, 0x75, 0x5d, 0x2b, 0x3d } }, { "\xc2\xd9\x4d\x7a\x19\xaa\x34\xb4\xeb\x7f\x96\x43\x01\xe9\xae\x45\xe6\xb6\x32\xd3\x35\xa1\x40\x77\x95\x15\xf0\x9a\x36\x7a\x69\x60\xa8\x25\xf5\x1f\x9b\x31\x44\xb5\x80\xf0\xae\x2a\x1f\x85\x9e\x2b\x2f\x85\x9a\x2f\x8f\x44\xa7\xe4\x28\xfb\x5a\x71\x04\x79\x65\xae\x9b\x19\x73\x66\x13\x5b\xe1\x8f\x12\x23\x33\xf2\x09\xf7\x7b\xe8\xcf\xd0\xe6\xd0\xad\xc9\x07\xd8\xf4\xc3\x74\x89\x76\x64\x5a\xd2\x01\xb6\x4d\xda\x15\x55\x10\xee\xcd\xa0\xb2\xe7\x3a\xd7\xba\xb4\xa5\x1e\xe8\x5e\xe6\xf4\x19\x6e", 120, { 0xd9, 0xdf, 0x12, 0x7f, 0xad, 0xc4, 0x9d, 0xc6, 0xe7, 0xd8, 0x1d, 0x1a, 0x3e, 0xe1, 0xb2, 0x5f }, { 0x55, 0x6c, 0x4d, 0xd8, 0x71, 0xb8, 0xd4, 0xfa, 0x23, 0x85, 0xd8, 0x7e, 0x5c, 0xac, 0x16, 0x83 } }, { "\xab\x42\x55\x99\x58\xcf\xa6\x51\x1b\xd7\x33\x2a\xe2\xfb\x4b\xdf\x28\x1d\x8a\x7b\x51\x65\xfc\xe7\x9f\xe1\xdb\xd6\x2c\x3e\x3f\xb9\x5a\xcd\x23\x64\xc4\xf9\x03\xe6\x73\x4e\xa4\x7a\xb3\xe3\xdb\xb2\x81\xd7\x07\x01\x92\x00\x31\x07\x9e\xd2\xce\x98\x17\xd2\x3c\x31\x15\x91\xd8\x3a\x20\x12\xc3\x2f\x98\x08\x55\x78\xf4\xd7\xba\xe3\xae\x51\x4c\xf8\xf1\xf0\x5e\xe9\x26\xde\xef\x34\x39\x17\xbe\x8e\x15\x17\x13\x94\xa7\x20\xdf\x46\x3b\xfc\xb5\x00\x2a\x2a\x10\xc3\x7c\x62\x4a\xd4\x90\x5e\x5f\x84\x49", 121, { 0x43, 0x36, 0xdd, 0xbd, 0x7c, 0x06, 0xef, 0x65, 0x82, 0x85, 0x10, 0x8c, 0x4e, 0x57, 0x1c, 0x19 }, { 0xe1, 0x5c, 0xd9, 0xde, 0x61, 0x7a, 0xfa, 0xb3, 0x1e, 0x16, 0x01, 0x37, 0xb6, 0x1e, 0x8a, 0x9d } }, { "\xa2\x63\xc8\x09\x93\xc0\xae\x16\xac\x3d\xe7\xa4\xfc\x58\x4d\x7a\x0e\x4f\xbf\xa7\x67\x60\xab\xcb\x5e\x80\x1d\x9b\x8b\x9f\x79\x9c\x9c\x18\xe0\x5f\x98\xd4\x32\xdb\xb2\x01\x0a\x2c\x97\xea\xf7\x6f\xfc\x16\xd4\x31\xaa\xa2\xce\xa1\x4e\xf1\x9f\x59\xb3\xf2\x94\x4f\x69\xc3\xa6\xf0\xe2\x8c\x59\xd5\x7c\x11\x07\xc4\xdd\x3c\x7e\x59\x19\x11\xfd\x39\xb7\xb3\xbb\xe8\x6e\xeb\xf9\x14\x25\x63\x24\xf8\x3c\x83\xe0\x41\xa5\xcc\xb5\xd4\x0a\x7e\xdf\xcf\x9e\xbe\xd0\x94\x6b\x02\xe2\x79\x94\xf8\x3b\x44\x16\xe3", 122, { 0xfc, 0x3d, 0x58, 0x08, 0x1e, 0x80, 0x0c, 0x10, 0xd9, 0xbf, 0x2d, 0x95, 0x37, 0x56, 0x5c, 0x35 }, { 0x1a, 0x20, 0x57, 0xfe, 0x0d, 0x3e, 0xdf, 0xbd, 0xb8, 0xa3, 0x65, 0xb0, 0x1a, 0x71, 0x8d, 0xd8 } }, { "\x5f\x53\xa3\x98\x23\x6f\x33\x82\x53\x4e\xf9\x32\x97\x5f\x1a\x9b\x5a\x7c\xf8\xbf\xa8\xc9\x7d\xd3\xcd\xe1\x4d\x8e\xee\xfe\x14\x6d\x12\xbb\xa9\xf3\x99\x32\xf7\x94\x96\x78\x8b\x37\x7f\x52\xe1\x16\x68\xbf\x23\x2b\x7f\xf5\xa5\x6a\xa2\x41\xa9\xf5\xb8\x27\x3f\x2f\x4a\xf6\xfa\x11\x13\x4f\xbc\xeb\x64\x10\x3b\x08\x56\xd5\xcd\x9b\xd9\x8e\xed\xff\xbb\xed\x9b\xd1\xcb\x7c\xd6\x8a\xe8\x61\xa9\x8a\xfa\xf5\xa6\xe2\x09\x54\x5e\xea\xbe\xae\x98\x91\x15\x26\x46\xec\xda\x91\x5e\xfa\xa3\x21\x20\x99\x4d\x8d\xd0", 123, { 0x9a, 0x6b, 0x61, 0x0b, 0x22, 0x1e, 0x2f, 0x82, 0x76, 0xbc, 0x00, 0xa4, 0x9b, 0x51, 0x43, 0x67 }, { 0x91, 0xa4, 0x10, 0x5e, 0x11, 0xcd, 0xd2, 0x02, 0x09, 0x85, 0x3d, 0xab, 0x41, 0x44, 0x82, 0x51 } }, { "\x74\x60\x2a\x03\x37\xb0\x7e\x63\x1f\x5f\xd0\x00\xba\xc3\x3d\xbd\x18\x35\xdf\x2e\x61\xc9\x5e\xf4\x38\x2f\x50\xfe\x1b\x1a\x00\xae\xaf\x3b\x2d\xab\xcd\xa1\x22\xe0\x14\x1e\xfb\x24\xb4\x83\x63\x09\xed\x35\x59\x0f\x8b\x65\x7f\xe7\xd5\x29\x6d\xde\xbd\x58\xaf\x1d\xe9\x43\x20\xd9\xc8\x07\xea\xb9\xe3\xfc\x51\x82\xda\x00\xb7\x2b\x96\x96\x34\x30\x43\x90\x3b\xf4\x50\x62\xe8\x59\x23\x5f\x30\x94\x49\x76\x88\x49\x61\xe6\x37\x10\xcf\x07\x20\x63\xcb\xa2\x41\x1e\xd7\xc7\x57\xcf\xe6\xa9\xc8\x90\x30\xf2\x75\xd9", 124, { 0xdf, 0x2b, 0xcc, 0x23, 0xbb, 0x55, 0xc3, 0xa9, 0x35, 0x82, 0xb9, 0xb4, 0x4f, 0x33, 0x4c, 0x05 }, { 0x49, 0x19, 0x98, 0x2f, 0x02, 0x6d, 0x44, 0x96, 0x58, 0x36, 0xea, 0x2e, 0xf7, 0x61, 0x15, 0x2d } }, { "\x10\xdb\x6e\xd4\x76\x36\x79\xac\x84\xe6\xa9\x97\xda\xe7\x07\xba\xca\xdb\xb3\x44\x11\x95\xd9\xc2\xe7\x35\x29\x8a\x99\x9b\xd4\xad\x50\xf0\xe0\x54\x52\x55\xa7\xbe\x20\x07\xc7\xc3\xb4\x0a\xd6\x22\xd1\xe3\x90\x89\x2e\x53\x7d\x44\xf7\xed\x97\x3b\xdc\x9d\xa6\x09\xcc\x85\x83\x05\x88\xf8\x36\xdb\x3c\xe2\xb5\x46\x73\x60\x17\x32\xb1\x1d\x3c\x45\xfc\x18\x6d\x42\x49\x99\x25\xea\xea\x4b\x93\x2b\x84\x2c\xff\x8f\xed\x76\xda\x84\x3e\x1f\x67\x77\x9f\xfe\x3c\x94\xc9\x72\xb5\xa3\xf9\x70\x19\x87\x8a\x12\x27\xbf\x6f", 125, { 0xce, 0x90, 0x30, 0xa3, 0x5c, 0xd8, 0x7a, 0xbc, 0xbe, 0xf4, 0x6c, 0x3c, 0xc9, 0xd6, 0x9a, 0x61 }, { 0x11, 0x37, 0x59, 0xe9, 0x61, 0x06, 0xf5, 0x1c, 0x05, 0x74, 0xdc, 0x06, 0x96, 0x74, 0xa7, 0x04 } }, { "\x5a\x80\x37\x50\x9d\xed\xcb\x6f\x96\x2f\x63\xe6\xd1\x91\xa6\x43\x46\x4d\xbc\xa9\x30\x9a\xb5\x53\x5b\x9d\x7f\x5a\xe9\x3b\x16\x23\x40\x6d\xdc\x2e\x6b\x0f\xbb\x80\xb2\x73\x4e\x46\x32\x7d\x3c\x4d\x62\x9b\xe7\x11\x03\x1b\xa0\xb7\xcd\xe5\xfa\xcc\x48\x0e\x08\x42\x61\x39\x98\x61\xf8\x11\x24\xac\x58\x13\x45\xd7\x58\xb0\xf4\xa3\x5f\x8a\x93\x9d\xd7\x54\x67\x08\x41\xcf\xa0\xa3\x91\x0e\x41\x34\xdf\x80\x92\x7a\x83\x9d\x45\x6c\x6d\x5c\x08\xa2\x7d\x85\xa8\x5c\xb7\x51\x7a\xe1\xef\x53\x8e\x2d\x21\x0d\x06\xaa\x27\x4a", 126, { 0xfd, 0x16, 0x55, 0xb2, 0x2f, 0xd1, 0x51, 0xac, 0xaa, 0x30, 0xda, 0xda, 0xea, 0xac, 0xd0, 0x2e }, { 0x6f, 0x84, 0x7a, 0x82, 0xcb, 0xb8, 0xba, 0x73, 0x12, 0xbf, 0x29, 0x2e, 0x9c, 0x06, 0x2e, 0x7c } }, { "\x55\xe9\x77\x03\x8b\x23\xa5\x18\x9a\x92\x28\x05\xf9\xf9\x4e\xea\x0f\xf9\x25\xcc\x60\x7a\xf5\xcf\x4f\x55\xc4\x2d\xeb\xb8\x28\x54\xbc\x20\xeb\xd1\xf9\x4a\xa7\x20\xfa\x7b\x3e\xf0\x2c\x72\x5e\x68\xed\x05\x8b\x90\xfe\xf5\xb9\x66\xc6\xcc\x06\xb8\xcc\xc7\xb4\x94\xab\xb9\x50\xb6\x2c\xc8\xac\x21\x8a\xca\xd6\x4d\x52\x15\x51\x72\xe5\x69\xdb\xf7\x50\x48\x42\x72\x37\xf7\x35\x70\xe1\xba\x45\xa5\x4d\xd5\x77\x00\x00\x9b\x68\x80\x65\x72\xaa\x18\x5d\x5b\xff\x5a\xa0\xd2\x38\xd0\x0c\xc0\x47\x80\xca\xf8\x29\x32\x07\x23\x5f", 127, { 0x39, 0x71, 0xc6, 0x33, 0xb0, 0x45, 0x1e, 0x12, 0xa1, 0x52, 0x61, 0xa6, 0x2a, 0xaf, 0x58, 0x93 }, { 0x7c, 0x91, 0x0f, 0x3c, 0x53, 0x7b, 0x19, 0xea, 0xae, 0x21, 0x6d, 0x00, 0x13, 0x6e, 0x3b, 0xab } }, { "\xa3\xf5\xa1\xce\xe9\xfd\x5e\xe0\x8d\xe6\x35\x6b\xbb\x70\x62\x5f\x1e\xbd\xf9\x2e\x5b\xcf\x45\x3e\xff\x82\xa4\x14\x73\x98\x45\x9d\x6f\xce\x59\x88\xfc\x39\x55\xba\x35\x9c\x6a\xa1\x16\xab\x13\x24\xa6\x58\x6b\x76\x0b\xb6\xec\x9d\xe5\x92\x92\x65\x08\x8c\x90\xff\x2c\x2f\xcd\xd5\x0e\xe1\xec\x9b\xb2\xb2\x90\x5e\x51\xf8\x8e\x00\x04\x17\xa9\x37\xa0\x3e\x87\xbf\x7d\x86\x6e\xcf\x66\x9d\x5c\x90\x7b\xe1\xc5\x73\x4d\xfc\x74\x96\x2f\xaf\x8c\x20\x75\x22\x47\x08\x61\x43\xbc\x6a\x54\xbd\xc7\x86\xa9\x0e\xf8\x7a\x61\x19\xb7\x66", 128, { 0x8a, 0x7d, 0x5d, 0x66, 0x07, 0xfb, 0xc4, 0xea, 0x2c, 0x2c, 0xa8, 0xc0, 0x69, 0x7d, 0xa9, 0xbd }, { 0x49, 0x97, 0xa1, 0x19, 0x35, 0x9e, 0xdf, 0xe6, 0xbc, 0x53, 0xd0, 0x2a, 0x60, 0xd7, 0xba, 0xb9 } }, { "\x44\xe5\xf8\x47\x1a\x98\xdf\xdf\x0a\x3a\x7f\xc7\xac\x19\x0d\x03\x6d\xa9\x41\x0b\x5e\x8b\xed\x5f\xa5\xb0\xa3\x6f\x30\x2d\xb3\x87\x83\xe1\xf8\x6d\x82\x9a\x8a\xb5\x7c\xaf\x78\xe7\x91\x4c\x78\x75\x70\x86\xa0\x27\x49\x47\x05\x0f\x6e\x1a\x11\x4b\x5b\x40\x83\x59\x91\x90\x93\x64\xb0\x1a\x22\x45\x2d\xb1\x43\xaa\x96\x68\x51\xc1\x5b\x2d\x1d\x33\x1e\x3f\x14\xfb\xa9\xd2\x0f\x8a\x9b\x24\xcd\x8e\x4a\xc4\xb6\x68\x2c\x1a\xb4\xaf\xe3\x06\xd4\xbf\x2b\x49\xb9\x7f\x7a\x00\x54\xcf\x44\x58\xa3\xf2\x3c\xa7\xa1\x30\xb7\x44\xd6\x0e\xcc", 129, { 0x53, 0x0b, 0xa3, 0x3a, 0xd8, 0xcc, 0x11, 0xed, 0x72, 0x34, 0x83, 0x31, 0xa5, 0xea, 0x10, 0x7b }, { 0x81, 0xbc, 0x8f, 0xcb, 0xe4, 0xcd, 0xbb, 0x30, 0xcc, 0xa1, 0xce, 0x87, 0x23, 0xc3, 0xde, 0x81 } }, { "\x26\xde\xfb\xfa\x22\x5c\x5a\x0c\x77\x3a\xd5\xd7\xde\x33\x5b\x82\x2a\x03\xac\x06\x33\xff\x17\x11\x22\x8e\xe7\x6d\xfc\x80\x5c\x1b\x0d\x25\x52\x02\x48\x48\x32\x79\xfb\xa6\xec\x63\x79\xba\xb5\x4b\x43\xb8\x6d\xc0\x2d\x7d\x97\x1c\x8c\xcb\x12\xd6\x01\x14\x65\xfb\x2f\x50\xac\xe2\xff\x1d\x0d\xa2\x12\x57\x88\xf9\xa4\x75\x38\xfe\x36\x8b\x4f\x53\x99\x53\xfc\x6b\xb3\x54\x3b\xa1\x95\xc8\xc3\x5a\x93\xdd\x99\xb2\x68\x4f\x92\x87\x00\x32\xa9\x36\x82\xed\x05\xb1\x11\xa4\x6d\xf7\xf5\xd3\xe3\x4c\xc6\x3e\xe5\xb1\xa6\x50\x38\x2a\x46\x8b", 130, { 0x29, 0xb3, 0xfb, 0x3d, 0x8d, 0x55, 0x4c, 0xb8, 0xac, 0x4f, 0xc2, 0x19, 0xdb, 0xd7, 0x76, 0xf1 }, { 0xee, 0x66, 0x51, 0x82, 0xac, 0xe7, 0xc0, 0x2a, 0x2a, 0xab, 0x45, 0xed, 0x7d, 0x46, 0xe6, 0x78 } }, { "\xeb\x67\x26\x05\x90\x52\x36\xe1\xc6\x76\x91\xef\x5c\x0d\x08\x76\x52\x18\xe4\xe4\x36\x1d\x88\xfe\x1c\xac\x97\x1e\x1e\xf8\xfb\x39\x94\x8c\x53\xbd\x96\xad\xc1\x13\xf7\xdf\x92\xcd\xaf\xd3\x47\xd8\xa5\xe0\x4c\x53\xf6\x8b\xbf\xcc\xb5\x7e\xab\xf8\x5d\xb6\x42\x8f\x82\x28\xe8\x80\x55\xf8\xbb\x01\xda\x15\x8c\xf8\x58\x39\x45\xce\x67\x6b\xa0\x64\x4b\xc4\x2b\x38\xde\x3e\x08\xb3\x5b\x6b\xc3\x38\xf9\x67\xe8\x31\x20\xa6\xcb\xa6\x10\x61\x2b\xa2\xf1\x4e\x42\x9b\x32\x02\xb6\x3a\x81\x55\x94\x44\xc5\x6c\xe1\x86\x45\x2a\xae\xc5\x4a\x4b\x93", 131, { 0xbc, 0x4f, 0xb5, 0xed, 0xec, 0x45, 0x3e, 0xec, 0xe3, 0x4a, 0x6a, 0x75, 0x92, 0xd9, 0x8e, 0x95 }, { 0xf5, 0x4f, 0xd4, 0x4c, 0xc0, 0xc0, 0x1b, 0xf4, 0xa4, 0x56, 0x81, 0xc2, 0xbc, 0x8b, 0xd3, 0x7b } }, { "\x95\x44\x9c\xa8\xf4\x46\xb2\xdb\x7e\x4c\x20\x56\xfc\xf9\x3c\xd5\x5d\xe2\x36\xf2\xad\x7e\x4f\xf0\x20\x28\x59\x35\x68\x63\x71\xa8\x2d\xf5\x3e\x25\x73\x5f\xa2\x8d\x13\x48\xe4\xcd\x42\x9b\xc1\x21\x2c\xd2\x8f\x8e\xf4\xb8\xb0\x1e\x54\xa6\x51\x96\x77\xad\x3b\x14\x6c\x8c\xa2\xcd\x0e\x37\x90\xbf\x63\xdf\x7c\x15\xf6\x6e\xa9\x51\x19\x3e\x1f\x8e\x85\xdb\x3a\xdb\xd7\x8b\xd1\xd5\x6f\xeb\x4a\xd7\xcf\xa0\x5b\x31\x1b\xfe\x53\x2b\xd1\x4c\xdb\x46\x4a\xf4\x4b\xe3\xf6\x81\x94\x25\x4c\xb1\xb6\x1d\xd3\x0e\x23\x11\x6a\x86\x88\xeb\xef\x66\x38\x5d", 132, { 0x75, 0x3e, 0x93, 0xdd, 0x62, 0x64, 0xdc, 0x2b, 0xe9, 0x63, 0x91, 0x07, 0x52, 0xd6, 0x66, 0x5b }, { 0x67, 0x53, 0x0c, 0x41, 0x3b, 0xb7, 0x4d, 0x49, 0x68, 0xd2, 0x30, 0xdb, 0x61, 0x39, 0xcb, 0x24 } }, { "\xeb\x5e\xc2\x4a\x33\x06\x75\xda\xa8\x5f\xd7\x95\x29\xfe\x81\xc2\x8a\x96\x2b\xa8\x14\x21\x42\x32\x2b\x39\xb5\x9f\x22\xdd\xed\xf9\x5a\x30\x1d\x19\x82\x5d\xd7\x40\x54\xe2\x04\x7b\x49\x84\xb0\x57\xa5\xb3\x22\x36\x3c\x75\xe5\x09\x08\xd2\x0d\x9b\x88\xdb\x52\x5d\x0e\x5a\xaf\x56\x78\x16\x12\x32\x96\x7f\x8d\x3d\x02\xea\x76\x4c\x95\x85\xd4\xe6\x2b\xa2\x45\x14\x2b\x82\xb9\xc5\x77\xea\x06\xe0\x9b\x9a\x5c\xc2\xe1\x74\xd1\x96\xe8\xfe\x57\xb3\x2e\xe0\x95\xea\x04\x78\x7c\xba\x0c\xdb\x74\xa4\x2e\x33\xd3\x9a\x53\x46\x36\x3c\xc4\x54\x49\x9d\x92", 133, { 0x5b, 0x51, 0x31, 0xa6, 0x20, 0xde, 0xfa, 0x85, 0x46, 0xc6, 0x52, 0x5b, 0xdc, 0x77, 0xae, 0x85 }, { 0x24, 0x8f, 0x35, 0x73, 0xe5, 0xb5, 0x9b, 0x2e, 0x00, 0x1a, 0x33, 0x01, 0x7b, 0x65, 0xe5, 0x82 } }, { "\x58\xc5\x17\xa8\x74\xfd\x1e\xa8\x2e\x23\xc1\xc3\x1e\x4d\xd4\xd1\x81\x30\xdf\x35\xab\xa8\xdd\x18\x3f\x7e\xec\x2e\x28\x86\x08\x3f\x32\x84\x54\x57\xd7\x9a\xdd\xd5\x38\xbd\xdf\x69\x9b\x5c\xc5\x96\x42\x9c\x51\xd5\x6f\x7f\xb3\xb7\xac\xa4\x29\x02\x41\xda\x6c\xc9\x5a\xd0\x3f\xcb\xb8\xe7\xe3\x45\x92\xad\x5f\xe7\xc6\xef\x83\x1d\xc9\x44\x01\x72\x3d\xb7\x33\x67\x08\x34\x6d\x72\xe8\x14\x41\x0d\x1d\xde\x78\x73\xb4\x44\xde\xc6\xb5\xe0\xa9\xfa\x08\xab\xc6\x9d\xa6\xff\xee\xd9\xbe\xe2\xf0\x32\xe2\xbe\x92\x91\xbe\x36\xeb\x1e\x25\xce\x3e\xcc\xe7\x77", 134, { 0xd5, 0x55, 0xa5, 0xc2, 0xf2, 0xf5, 0x88, 0xaf, 0xf0, 0x7b, 0x26, 0x5b, 0xba, 0x99, 0x1d, 0xca }, { 0x4d, 0xa6, 0x98, 0x88, 0x4c, 0x22, 0x7d, 0x44, 0xcd, 0xfa, 0xc5, 0xf1, 0xb8, 0x39, 0xc7, 0xd9 } }, { "\x59\xa1\x04\xeb\x2e\x94\xed\x06\x22\x7c\xd2\x7d\x2a\xc5\xad\x03\xf7\xd9\xa1\x45\x5f\x58\x84\x46\xfe\x92\x01\x6c\xda\xf9\x03\x7f\x34\x34\x39\xd5\x8a\xa7\xc9\x4c\x88\x03\xb5\xf2\x7c\x21\x53\x26\xc2\xd6\xa2\xbb\xdb\xc3\xde\xf6\x23\x27\x08\x14\x4f\x92\xbf\x22\x86\x57\x81\x92\xe6\xde\xec\x0a\xd6\xa7\xb3\x41\x38\x53\xee\xd4\x46\x39\x5d\xb5\x7d\x57\xa3\xca\xbd\x14\x3d\xb1\x44\xea\x1b\x81\x14\x1d\x0a\x9c\x96\x58\xdb\xe7\x57\x4b\x8d\xac\xea\x00\x79\x8b\x64\x4e\x0f\x34\x6d\x81\x9c\x20\x9d\x4d\x25\xd2\xa9\x7b\x47\xbe\x22\x6b\x25\x78\x8a\x11\x6e", 135, { 0x53, 0x69, 0x47, 0x81, 0xc6, 0x9b, 0x0b, 0x4f, 0xe6, 0x6f, 0x8c, 0x08, 0x4d, 0x9b, 0x3b, 0x0e }, { 0x83, 0xeb, 0x78, 0x45, 0x73, 0xb3, 0xe8, 0xb6, 0xfb, 0xf6, 0xa8, 0x67, 0xa1, 0xf2, 0xa6, 0x22 } }, { "\x1c\x92\x9a\x2b\x73\xe8\x66\x71\x9a\x17\xc9\x35\x8d\x7a\xa4\xc6\x7d\xcb\x06\xf3\x80\x67\x64\xa6\x26\xae\x1d\xb3\xc6\x10\xfa\x04\x0d\x25\x92\x77\x5a\x19\x50\xfb\x15\x00\xe1\xaf\x0d\x9d\xdf\xa2\x69\x1e\x15\x64\xe1\x53\xc4\x83\x8f\x4f\x68\xaf\x7c\xd0\xfa\xa0\xc6\x7e\x6b\xc0\x37\x9c\xb2\xad\x3c\x59\x87\xd3\x98\x38\x77\xb9\xe6\x78\x39\xc3\x2c\x31\xb7\x63\x1d\xaf\xe5\x51\xd8\x9e\x00\x97\xfa\x57\x0c\x98\x2a\x02\x61\x95\xab\x0a\x46\xf2\xf9\xbd\x0b\x5c\x3a\x2b\x89\x8f\x18\x7d\x93\x9d\x57\xea\xbc\x19\x1c\xb6\xea\x8d\x12\xae\x4e\xa1\x5a\x46\x31\xeb", 136, { 0xf2, 0xaa, 0xfa, 0x05, 0xad, 0xba, 0xc1, 0xb1, 0xe6, 0x29, 0x67, 0x43, 0xfe, 0x22, 0x33, 0x1f }, { 0xca, 0x71, 0x5f, 0x20, 0x78, 0xd9, 0xcd, 0xd7, 0xb4, 0x72, 0xff, 0x42, 0x45, 0xdb, 0x7d, 0x41 } }, { "\xb9\xf5\x60\x3a\x8d\x60\xb8\x5a\x4a\xe7\x3e\xbd\x35\x79\x4a\x24\x5a\x7f\x6c\xfe\xef\x18\x82\xe4\x09\x09\x07\xb0\xb8\xc6\x7b\x5e\xf2\x65\x6b\xfd\xb3\x28\xe9\xa5\xa0\x73\x9a\xab\x1b\x38\x1b\xb4\xb4\x25\xdb\x72\x2d\xb1\xba\xf5\xa4\x62\xff\x00\x3d\x67\x4d\x8d\xbb\xce\xa2\x6c\x7c\xd8\x89\x7c\xdc\x3e\x2e\x30\x60\x04\xb1\x9b\x50\xf0\x33\xb0\x6c\x34\x1d\x1c\xf8\xe9\x94\x55\xa7\xe4\x88\x2e\xf1\x68\x4a\xfc\x57\x26\x16\xac\xd1\xf9\xa8\xb9\xf8\x7e\x68\x8b\x45\xe6\xd3\x19\xac\xaa\xfd\xd3\x5a\xdf\xe4\x80\x1a\xe3\x0a\x91\xd6\x9a\xa2\x1a\x29\xf6\x66\x78\x3f", 137, { 0x29, 0x1b, 0x93, 0x9e, 0x90, 0xce, 0xd4, 0x7d, 0x1d, 0x7e, 0x44, 0x25, 0x94, 0x60, 0xa5, 0x49 }, { 0x3f, 0x8d, 0xe6, 0x89, 0x0b, 0xc8, 0x95, 0x33, 0x50, 0x58, 0x19, 0x57, 0x05, 0xf3, 0x59, 0x8d } }, { "\x0d\x2d\x9e\x30\x43\x71\x65\x86\xe2\x4f\x01\x44\xc9\x1e\xf7\xde\x63\x1d\xdb\xd4\xd6\x53\x14\x80\xa8\x69\xe4\xd6\x73\x87\x7d\xd8\xb7\x31\x64\x8e\xeb\x6a\x1b\xc6\xdd\x66\x05\xe8\x05\x14\x12\x09\xc0\x78\xf6\xfc\x63\x5e\xd3\xeb\x47\x87\x4c\x99\xec\xa5\x5a\xc3\xa1\xa3\xc8\x8d\x2b\x6d\x1a\xab\xe1\x24\xf5\x70\x0a\x05\x92\xf8\xe3\xe7\x95\xc6\x11\x7f\x34\xc3\xdb\x73\xce\x5f\xfa\x21\x95\xbe\x77\x68\xdf\xc9\xdc\x2c\x37\x67\x2a\x5c\xa1\xaf\xe6\xee\x9e\xc3\xd8\x96\xb7\x08\x57\x69\xe1\x87\x6e\x60\x5b\x68\x4a\xdb\x81\x88\xa0\xef\x2f\xc3\x27\x07\x39\x21\x56\xc7", 138, { 0x19, 0x16, 0x80, 0x9f, 0x02, 0x45, 0x4b, 0x9e, 0x72, 0x84, 0x96, 0x3c, 0xb3, 0x60, 0x2e, 0x88 }, { 0xc3, 0x59, 0xf1, 0xed, 0x13, 0x84, 0xd2, 0xb0, 0xe8, 0x85, 0x31, 0x08, 0x1f, 0x88, 0xa2, 0x24 } }, { "\x36\xbf\x0a\xc9\x12\x5f\x89\x12\x17\x86\xab\x50\xa9\x5e\x16\x1f\xc5\xe8\xee\x1c\x9c\x9b\x47\x60\x11\x45\x62\xb3\xac\x92\x99\xc3\x10\xd2\x18\x13\x85\x00\xb1\xe6\x39\x48\x8e\xda\x7e\xf8\x6a\xdf\x2e\xb5\x80\xe4\xb1\xd3\xf6\x5f\x4b\x59\xc8\x23\x17\x11\xfa\xd5\x9d\x68\x55\x01\xc4\xe1\xda\x24\xe4\x6e\x69\x98\xc5\xe5\x63\xb9\x83\x7c\xc1\x49\x90\x1a\x51\xe5\xdc\x5d\x3d\xb6\xad\x43\x1d\xcd\x06\xdd\x11\x5f\x78\x41\x0c\x05\x2a\x7b\x63\x7e\xb9\xdc\x56\x56\xd8\x0f\xbd\x05\x16\x45\xe6\x45\x0b\x76\x6c\xbe\x83\xf6\x00\x8d\x54\x4e\xb1\x5b\x3e\x30\xe1\xc9\x57\x02\x78", 139, { 0xcc, 0x87, 0x3e, 0xa0, 0xf6, 0xcb, 0x3c, 0xba, 0x0d, 0xc6, 0x8e, 0x2c, 0x33, 0x18, 0xab, 0x54 }, { 0xb0, 0x01, 0x86, 0x0a, 0x25, 0x1a, 0x9c, 0x7c, 0x64, 0xa7, 0xa4, 0x20, 0x3f, 0x5c, 0xd1, 0x77 } }, { "\x50\x62\x10\x48\x03\x0d\x6d\x07\x74\x7a\xd7\x89\x5b\x36\xe2\xe4\x22\x76\x12\xde\x27\x7f\x77\xf6\x38\x8b\xcb\xb4\x1d\xe8\xa9\xe9\xf1\x65\x62\x5d\xe7\xaa\x74\xd2\x47\xb7\xfd\xa9\xaa\x20\x79\x90\x96\x2b\xf7\xef\xf6\x2b\x6d\x5f\x89\xe9\xd7\x2d\x7e\xbe\x1f\xc4\xde\x8c\x22\x93\x58\xce\x18\x1b\x04\xc0\x5a\x56\x51\x84\x7f\x55\xa0\x3d\x68\x20\xb2\x4a\x4b\x5c\xe5\x94\x4f\x1e\x0a\xd5\xc8\x5a\xc8\x4e\x46\xea\x4a\x70\xd9\x25\xd3\x66\x44\x1c\x9b\xa0\x83\x4a\x23\xd2\xb7\xd7\xb6\x14\xcf\x7d\xb3\x33\xf7\x68\x95\x13\x72\xe5\xd5\x9e\xde\xf8\x8a\xd7\x55\xb9\x5c\x4d\xad\xa2", 140, { 0x22, 0xbf, 0xcf, 0x0b, 0x29, 0xc5, 0xd1, 0x78, 0x57, 0x41, 0xb4, 0xa6, 0x0a, 0x8c, 0x84, 0x0f }, { 0x29, 0xe7, 0xdb, 0x14, 0xac, 0xbc, 0xf6, 0x2d, 0xf9, 0x0c, 0x61, 0xf7, 0xe3, 0x12, 0xf1, 0xe8 } }, { "\x67\xfd\x3b\x15\xaf\x02\x6c\xcb\xe8\x5d\xdb\x55\x63\x3a\xb2\xd2\xe7\x76\x65\xee\xd3\x80\xa6\x48\x47\xc9\x36\x40\xd6\xa8\x50\x9b\x52\x70\xec\x40\xdd\x0b\x69\x0b\xfb\x6b\xbe\x13\x1e\x48\xbe\x01\xc8\x3a\xaf\xbb\x65\xd1\x14\x17\xe1\xbf\xb6\x08\xe8\x47\xd4\x98\x13\x90\x0c\xb5\x2b\xd0\x00\x59\x6a\xe1\x71\x6a\x0c\xd6\x70\x2a\x64\xb1\x86\x94\x36\xd7\xa8\xe3\x75\x44\x3b\xcc\x6e\x84\x4c\xe3\x96\xe5\xb1\x0a\x06\xb9\xe5\x89\x8f\x50\x60\xbc\x36\xcc\xcf\x17\xba\x9e\x52\x97\x38\xb6\x71\xdf\xad\x96\xdd\x87\x13\x42\x14\x69\xd1\x68\x93\x60\x41\x9d\xc4\x44\x99\xef\x3f\xf5\xec", 141, { 0x04, 0xcc, 0xed, 0x85, 0x07, 0x84, 0x3e, 0x21, 0xe3, 0xf1, 0xbb, 0xd0, 0x50, 0xd3, 0x2d, 0x87 }, { 0x3b, 0x1b, 0x54, 0x40, 0xa5, 0x51, 0x16, 0xa6, 0x8b, 0x2f, 0xd4, 0xd6, 0x9e, 0xd2, 0xb9, 0x83 } }, { "\xc1\x2c\x56\x13\x26\xbf\x59\x62\xf2\xf3\x7a\x26\xd0\x56\x00\x26\xb3\xb4\xe8\xae\x48\xde\x95\xe4\xfa\xe3\xd9\xa4\xf8\x77\x8c\xce\x39\xb0\x19\x07\x5e\x8e\x7a\x13\x27\xd8\x5f\x38\x9b\x90\x12\x69\xa8\xd7\x37\x91\xec\xc7\x48\xe0\xbd\x42\xcf\x22\x53\x61\x6f\xe8\x13\x97\xe7\x54\x1f\x8a\x0c\x7e\x37\x93\x61\x64\xc5\x69\x32\xd3\x26\xd6\x8c\xdb\x7d\xed\xf0\x1f\xa7\x1f\xb8\xcc\xcd\x1e\x4c\x50\x91\x43\x4b\xe4\x33\x61\x62\x20\x8d\x64\xf9\x86\x92\x74\x00\x40\x42\x9c\x40\xf6\xd4\x3e\x1f\x60\x6e\xd9\xb9\x35\xe9\x1f\xa6\x82\x81\xad\xda\xe2\x15\xf6\xfb\x9f\x71\xe8\x12\x4f\x77\x99", 142, { 0xe9, 0xe5, 0x46, 0xd4, 0xbd, 0x09, 0xc8, 0x38, 0x40, 0x2c, 0x43, 0xcb, 0x97, 0xc5, 0xbe, 0x98 }, { 0x87, 0xa8, 0x2f, 0xdf, 0x52, 0xc5, 0x73, 0x00, 0x09, 0x25, 0x7c, 0x2e, 0x84, 0x31, 0xec, 0x29 } }, { "\xaa\xb8\x13\x9c\x1e\x6e\x14\xc0\xb0\xf2\x74\xfb\xed\xaf\x08\x1e\x49\xc5\xad\x56\x25\x9e\xb7\x3a\x98\x5d\xff\x85\x13\xad\xbf\xbd\x61\x68\x5d\x27\x4c\x4f\x75\x91\xc2\x12\xc0\xed\x3b\x76\x6f\x84\xc4\xcc\x3a\xae\x45\xec\xfc\x5d\x12\x2f\xc2\x39\x9d\xf4\x2e\x25\x30\x46\x19\xb8\x87\x41\x54\xa4\xe3\x1d\x10\x30\xbb\x57\xd4\xb1\x0a\x54\x2c\x74\x49\x44\x2f\x56\x5e\x2d\x3a\x82\x14\xc9\x44\x62\x20\x77\xae\x33\xdf\x98\xd9\xca\x92\x15\x6c\xef\xdf\xf1\x63\xdf\xec\x7e\xf2\xaf\x08\xa2\xab\x1b\xa5\x82\x35\x0b\x38\xb1\x77\x7c\x34\x81\xd4\x83\x0d\x93\xa3\xfd\x8f\x08\x70\x8a\x25\x14\xcf", 143, { 0xa5, 0xaf, 0x4b, 0xe8, 0x4a, 0xc5, 0x78, 0x01, 0x7a, 0xa2, 0x2a, 0x1c, 0x40, 0x9a, 0xc4, 0x10 }, { 0x28, 0x10, 0x2d, 0xe4, 0x36, 0xd9, 0x10, 0x69, 0xfa, 0x47, 0x7f, 0x69, 0xe2, 0x29, 0x49, 0x24 } }, { "\xe0\x7b\x80\x18\x93\x15\x33\x75\xb2\xef\x1c\x9c\x9b\x28\x8f\xf4\x6c\xad\x2d\xe2\xa0\xf0\xcf\x99\xd5\xf8\xb4\xf5\x5b\x10\x09\xf3\x1f\xc6\xcd\x23\x44\x5e\x30\xea\x50\x2c\x38\x28\x24\x36\x37\x18\xf9\x9d\x79\xb0\xd7\x0a\x4d\x0c\x22\xce\x09\xe2\x7f\x35\x5b\x0c\x65\x6f\xdc\x62\x1c\x4a\x9e\x54\x9c\x33\xca\x35\x63\xe2\x87\x03\xbb\x4a\xcc\xf9\x97\x03\x96\xc1\xc4\x84\xdc\xe1\xc6\x4e\xcc\x47\xa4\x0f\xce\x38\x4c\xcc\x84\xd1\x1a\x41\xd1\xea\x2a\xb8\xe1\x7e\x0e\xca\xc6\xe8\xd7\x9b\x34\x59\xaf\xc8\x69\x58\x4e\x73\x83\x33\xdf\x67\xeb\xca\xe8\x82\xa8\x93\x4e\x1e\xb7\x88\x9c\xc6\x97\x27", 144, { 0x23, 0xa7, 0x9e, 0x3c, 0xbf, 0x5f, 0x8e, 0x8d, 0xad, 0x04, 0x11, 0x24, 0x57, 0x59, 0x9e, 0x47 }, { 0xc9, 0x88, 0x89, 0xdb, 0x1d, 0x95, 0x16, 0x4e, 0x3b, 0x82, 0x5a, 0x22, 0x0c, 0xe3, 0xb2, 0xb0 } }, { "\xbb\x38\x5e\x71\x0a\x55\xc6\xcb\xf5\x33\xe6\x5c\x2c\xd2\x23\x65\x71\xa5\xd8\xfe\x97\x5f\x0e\x38\xfd\x7e\x17\xd9\xf7\x88\xf8\x61\xf9\xa1\x1c\xca\x4b\xf3\x43\xdb\x28\x94\xa5\x4d\x7c\xea\xd4\x90\xb4\x0b\x73\x59\x7a\xcc\x93\x46\xb0\xaf\xd4\x00\x4f\x6a\x7e\x0b\xea\xec\x8b\xe8\xdf\xa1\xf8\x1c\x1d\x33\x79\xa3\xe1\x63\x7a\x13\x77\x23\xf0\x28\x31\x07\x34\x4c\xee\x39\xa5\x43\xe4\xd7\xd4\x3d\x11\xce\x79\x19\xf9\x29\x6a\x89\x6f\x3a\x90\x00\xc4\x99\x69\x06\xb8\x73\xd8\x49\x69\xb9\xea\x04\x80\xc0\xdd\x62\x35\x1c\xb0\x24\xab\x6a\x2a\xf7\x3c\x25\x94\xd1\xca\xe5\xf5\x84\xb5\xfe\x63\x89\xe2", 145, { 0x81, 0xf2, 0x6c, 0x8b, 0x9c, 0x7a, 0x24, 0x98, 0x39, 0x7e, 0x7c, 0x67, 0x25, 0x1b, 0x22, 0x8a }, { 0x96, 0x52, 0x25, 0xa3, 0x84, 0xbb, 0xd5, 0xac, 0x23, 0xa1, 0x70, 0x37, 0xf0, 0xa0, 0x5e, 0x9c } }, { "\x34\xd6\x24\xa0\xcf\x14\x01\xa9\xd1\xf4\x20\xd2\xc4\x66\x00\xf1\xfe\xdc\x0b\x54\x28\x3b\x68\xa6\xf5\x79\x9c\x52\xda\x7e\xe5\x02\x05\x59\x17\x75\x65\xbd\x8f\x64\x04\x00\x4b\xf5\xe3\x9b\x04\x61\x6b\xee\x87\x25\x56\x2b\x66\xd1\xbb\x63\x50\x9c\x1e\x37\xb9\x6b\xca\x86\x06\x99\x0f\x48\xa5\xb7\x6e\xfc\x9f\xc7\x39\xbe\x62\x5b\xd7\xe3\x2b\xde\x4d\x5d\xa5\x8e\xc0\x27\xa8\x0e\xdb\xd0\x34\x50\x29\x39\x75\x11\x5d\xc3\x84\x27\x82\x5c\x3d\x95\xef\xe3\x41\x46\x76\x68\xad\x8d\x91\xe1\x0b\x29\x12\x44\xbf\xdc\xb4\xa9\x32\xb9\xcc\x75\xc3\x76\x3e\x25\x5a\xbe\x70\x63\xc8\x37\x0b\x8f\x23\xdb\x93\x89", 146, { 0xcc, 0x12, 0x53, 0x4d, 0xf0, 0x34, 0x15, 0x08, 0xa2, 0xcf, 0xce, 0x3b, 0x39, 0xdc, 0xcb, 0x95 }, { 0xb8, 0x58, 0x76, 0x49, 0xf8, 0xe5, 0xf7, 0xf1, 0xc2, 0xc3, 0x10, 0xb5, 0x73, 0x45, 0x34, 0x7f } }, { "\xca\xbd\x19\x7e\x77\x58\x5f\x7c\x04\xce\xd9\x7c\xca\xcb\x60\x60\x63\x6c\xcc\x2b\x18\xc4\x2f\xf7\xf0\x22\x57\xa9\x89\x28\x2a\xdf\x02\x2a\xc5\x79\x5d\x75\x8a\xdc\xa9\x02\x2d\x00\xdd\xe5\xac\x07\xcf\xcb\x6e\xd2\x45\x69\xc7\x21\xbe\x0c\x2c\x13\xa4\xb0\x06\x95\x0b\x7b\xa6\x7d\xc3\x77\x5a\x47\xf2\x46\x9d\xdf\xf1\xd0\xf3\xe2\x75\x74\x60\x95\x8b\x3a\xb2\x3b\xe4\xe3\x60\x03\x71\x04\xe7\x99\xe1\x35\xa9\x48\xf7\xb1\xe7\x99\xcc\x28\x92\xca\xfe\x33\xae\xff\xe6\x96\x39\x81\x2f\xc6\x36\x69\x17\x64\xac\x26\xdd\x7f\x19\x85\x91\xd0\xf5\x9b\x83\x6d\xdc\xd9\x90\x97\x4a\x5e\x21\x91\xe9\x25\xfc\x52\x75", 147, { 0xb2, 0x7a, 0x58, 0xbf, 0x11, 0x80, 0x97, 0x95, 0xb8, 0xda, 0xf9, 0x51, 0x63, 0x5c, 0x9f, 0xa6 }, { 0x43, 0x50, 0xf3, 0xe0, 0xe6, 0x3b, 0xa6, 0xc4, 0x80, 0x29, 0xa7, 0x81, 0xe8, 0xd5, 0x7f, 0x12 } }, { "\xf6\x8c\xd1\xae\x1b\xba\xf6\x71\x7e\x42\xe5\x4b\x67\xba\xa5\x13\x4e\x58\x0f\x53\x19\xd7\xc2\xff\x7a\xef\x04\xfb\xd2\x23\x18\x4f\x70\xe3\xec\xb1\xa7\xa8\x98\x36\x83\x8c\xd6\xaa\x2e\x8c\xc0\x63\x21\x0a\xf5\x98\xc1\x9d\x23\x7a\xee\x7c\xe8\x53\xd9\x87\x96\x2a\xdf\x85\xcd\x03\x34\xfd\xd4\x65\x79\x2a\x43\xb7\x06\x26\xc8\x75\x21\x35\x87\xa8\x65\x4e\x69\xfa\x5c\xdb\xfa\xe3\x15\x35\x72\xa6\xe8\x95\x9f\x2f\x8c\xe7\x6a\x79\xe8\x05\x8f\x2f\xca\x08\x90\xb1\x18\xd1\x74\x90\xb7\x14\x22\x19\xa5\x6f\x7b\x78\xa9\xc6\xfd\x8a\x42\x83\x76\x59\x47\xca\xee\xf7\x9e\x81\xea\xda\x8a\x4f\x87\xe8\x76\x32\x82\x9a", 148, { 0x5d, 0x6d, 0xb7, 0xee, 0xee, 0x0b, 0x35, 0xd9, 0x73, 0xb8, 0x5b, 0x00, 0x54, 0x21, 0x4e, 0xb2 }, { 0x7a, 0x4d, 0xa5, 0x2c, 0x6c, 0x7d, 0x28, 0x64, 0xcb, 0x6c, 0x52, 0x27, 0x13, 0x3e, 0xcd, 0xe2 } }, { "\x00\xd3\xb6\xd2\xbc\xf3\xb9\xd0\x1a\xc0\x79\x9e\x51\xad\xe6\xfd\x68\x1c\x0a\x01\x8e\x11\x40\x12\x22\xad\x5b\x5b\x63\x30\xf6\x95\xeb\x67\xbd\xa2\x62\x48\xd9\xfc\x6a\x86\x18\x7b\xbd\x05\x2d\xa3\x2a\x4b\xb3\xb1\xb1\x22\x12\x92\x8c\xd2\xec\x57\xb6\x50\x1a\x22\xb2\x2c\x20\xa8\x5f\x80\xfa\xa1\xa8\x43\x8b\x51\x75\xd1\xe8\xbd\xb3\x2a\x2e\x8a\x24\x4a\x81\x1b\x0f\x64\x0a\x11\xc1\x7d\xd4\x69\x84\xf1\x8b\x43\xb0\x1d\xd7\xdd\x16\x16\x97\x1a\xf4\x30\x94\xa5\x4a\x41\xd4\x9d\x50\xf4\x2c\xe1\xb3\x2a\xae\x7b\x3c\xc6\x78\x24\xa8\xe0\x92\x8b\xca\x48\xbe\x90\x27\x99\x38\xc8\x60\x13\xb8\x20\xb8\x6b\xfa\xde\x93", 149, { 0x7e, 0x7b, 0xe2, 0x3d, 0xef, 0xa1, 0xd7, 0x8a, 0x3b, 0x1b, 0x8c, 0x3c, 0xf7, 0x7d, 0x01, 0xfe }, { 0x38, 0x30, 0xb4, 0x0e, 0x14, 0xac, 0xc8, 0xec, 0x8f, 0xb5, 0xd0, 0x1d, 0x97, 0x70, 0xae, 0x36 } }, { "\x11\x06\x7c\x6d\x5d\x61\x17\xb2\x49\x67\x67\x30\xc3\xa2\x67\x06\xdb\x44\x0a\xa9\x4c\x29\xac\xa3\x18\x14\xb7\x2e\x5b\x3f\x7e\x86\x3f\x22\x50\x24\xfe\x30\xd0\x74\x9a\x24\xb8\x3a\xc1\x43\x8b\xb8\x65\xf9\xe6\xe4\x6b\x2c\x90\xc6\x5b\x9e\x45\xc8\xe9\x84\x78\x02\xce\x6f\xaa\xb9\xb2\x99\xe9\x4e\x9b\xc0\x35\x97\xb1\x19\xf7\xd6\x87\xec\x23\x29\xfe\x5b\x42\xe1\x58\xa1\x73\x6f\xe0\xd8\xb0\x4d\xcd\x63\x28\x2b\xe7\xa7\x28\xc7\x71\x18\xed\x17\x49\xfa\xcd\x0e\x4b\x00\x54\x74\x2a\x27\x3d\x47\xca\xc7\x5b\xee\x5b\xfd\x9e\x2a\xee\x16\x71\x29\x26\xf4\xc8\x66\x81\x43\x52\x3c\x98\x73\x54\x65\xdc\xfe\xf8\xc2\x1a\x9e", 150, { 0x82, 0xcc, 0xd4, 0xbe, 0x1d, 0xba, 0x4d, 0x3e, 0x9e, 0x54, 0x86, 0x70, 0x46, 0xd2, 0x18, 0x46 }, { 0xd4, 0xb2, 0x40, 0x20, 0x6c, 0x7a, 0xf3, 0x27, 0x01, 0xc8, 0x9f, 0xa2, 0x99, 0x4f, 0x47, 0xa8 } }, { "\xe5\x32\x3b\xe1\x6a\x25\x94\x43\x77\x84\x89\x4b\xa4\x1f\xdb\x94\xa7\xa9\x54\xfd\x45\x67\xda\xc9\x45\x25\xb4\xef\x7d\x3e\xc5\x0f\xf2\xc5\xfd\x3f\x09\x6b\xb1\x5c\x4a\xce\x66\x13\x8e\x61\x71\xea\x20\xf8\x38\x1c\xad\x15\x92\xf4\xd6\xaf\x80\x0c\x05\xcf\x30\x99\xf9\x17\x44\xe4\xfc\x54\x69\xf3\x38\x78\x5f\x35\xd7\xa6\xc2\xfc\xa2\xa3\x03\x43\xb2\x2a\xfb\xdc\x83\xdc\x28\x03\x85\x7c\xba\x1f\x60\x31\x2a\xe0\x14\xb9\x1e\x63\xd6\x39\x09\x90\xbe\xde\x5b\xa2\x48\x81\xd2\xf9\xeb\x90\x67\x85\x5a\xf4\xff\x7e\x06\x55\xad\xa9\xc0\xa2\x7c\xf8\xf3\xa5\x44\xe8\xac\x25\x59\xcc\x8e\x29\x7c\x4c\x0f\x87\x67\x17\xdc\xdd\x10", 151, { 0xf9, 0xd8, 0x1b, 0x42, 0xb3, 0xc8, 0xa6, 0x62, 0xac, 0xfe, 0xd2, 0x23, 0x7c, 0x36, 0x14, 0xb7 }, { 0xca, 0xff, 0xe6, 0xa1, 0xf3, 0x16, 0xc5, 0x95, 0x17, 0xf2, 0x39, 0x82, 0xd1, 0xb5, 0x81, 0x83 } }, { "\x57\x65\x64\x85\x97\x18\x6a\xc2\x87\x19\x77\xed\x01\x08\xda\xea\x75\xb9\xcd\xe4\x00\xe3\x0b\x90\x40\x66\x1b\x8d\xb1\x66\xe7\xfb\xe4\x37\xe6\x42\x9e\x8c\x64\x07\x41\xca\x3c\x07\x20\xd8\xab\xfa\xe1\x84\x56\x6d\xbb\xda\x39\xea\x88\xdf\x40\x48\x8c\xf7\x0a\xb5\x7e\xc0\x6b\xa0\xde\x5c\xc0\x37\x9f\x96\x76\x13\x67\xb7\x6c\x3a\xb7\x12\x18\x39\xbc\x9d\x15\x0d\x89\x73\x2e\xe6\x6b\x14\x3d\x19\x3b\x98\x43\xed\x30\xbc\x83\x0d\xc8\x9e\x36\x40\x0b\x62\x82\x7c\x43\x50\xce\x63\xc5\xe1\xe0\xfc\x56\x51\x8b\xd5\xb6\x3d\xf0\xb1\x2c\x7b\x0e\x99\xde\xb2\xf3\x90\x5a\xf7\x63\x45\xe5\x6b\xb7\x10\x75\xf1\x84\x9c\xca\x68\x41\x0d", 152, { 0xdd, 0x84, 0x8f, 0x20, 0xee, 0x17, 0xbe, 0xd6, 0xd8, 0x3d, 0xbf, 0xe5, 0x45, 0xca, 0xd8, 0xc5 }, { 0x27, 0xf8, 0x81, 0x3e, 0x50, 0x9b, 0x53, 0x87, 0xf4, 0xf1, 0x4d, 0x55, 0x46, 0x51, 0x8f, 0xf8 } }, { "\x26\x82\x00\x9d\xc1\x7a\x91\x13\x36\x6f\xb0\x7f\x33\xe5\xbb\xe7\x47\xd3\x74\xc1\x47\x83\x49\x24\xca\x1e\x2c\x97\x25\xa4\x82\xed\xbc\xdf\xe5\xae\xb6\xca\xb6\xfe\xde\x7d\x22\xf5\xd7\x27\x77\xf8\x74\x3f\x34\x22\x5b\x34\x12\x89\x17\xf0\xc1\xd5\xde\xe6\x49\x05\x7c\xe6\x97\xad\x0f\x23\x62\x85\xf0\x4b\x33\xfa\x40\x65\xfc\xfa\xa4\x5a\x56\x86\x58\x00\x0c\x52\xfb\x5b\x14\x0a\x78\x99\x9f\xed\x64\x95\x35\xef\xa9\xfd\x2b\x4a\xb0\xbe\x50\xe8\x99\xed\x76\xcc\x34\x9c\x79\x3d\x0d\xf9\xcb\xca\xf5\x21\xfb\xd0\x19\x44\x25\xae\xd9\xc9\x9b\xcf\x3d\x03\x80\x6e\xda\xd0\x55\x96\x8c\x8f\x68\x7b\x0e\x57\x35\xbd\x5c\x11\x21\xb6\x14", 153, { 0xe7, 0x56, 0x48, 0x9d, 0x9d, 0x9d, 0xdc, 0x89, 0xc6, 0x53, 0x78, 0x54, 0xa4, 0xd1, 0x80, 0xa3 }, { 0xb3, 0xc8, 0x73, 0x1e, 0x5b, 0x41, 0xbe, 0x82, 0x37, 0x44, 0x45, 0x21, 0xc9, 0x2f, 0xd0, 0x68 } }, { "\x52\x8e\x45\xe6\xab\x1c\x68\xf2\x82\x60\xe3\x56\x23\xa1\x80\x3f\x2f\x71\x3c\x96\x7f\x17\xb9\xad\x5a\x0c\xee\x2f\xa8\x11\x8f\x33\x82\xb9\x12\x4c\xdd\xca\x07\x6b\x5d\x77\xfa\xdc\xdb\x59\x3b\x8d\x57\x6b\x36\x7f\x5d\x33\x7e\x94\x65\x33\xdf\x48\xe9\xdc\x4c\xfb\xd9\xed\x23\xfc\xcd\xea\x21\x5f\xf6\x5d\x45\xa3\x65\x80\xd6\x50\x32\x11\xf3\x56\x49\x60\x77\x99\x91\x56\xfa\xf9\x15\x5d\x22\xc3\xcd\xd9\x23\x51\x17\x43\x99\x6d\xad\xde\x76\x1c\x8c\xa8\x67\x65\xa0\x3e\x88\x55\x93\x79\x60\x1f\xa4\x92\x59\x45\x71\xcd\xdf\x34\xc4\x05\xff\x7b\x22\x89\xd4\x45\x99\xe2\x54\x97\x22\xa6\x4e\x1b\x2b\x11\x44\x03\xff\xb2\x42\x89\xf2\xdb", 154, { 0x68, 0xb4, 0xb7, 0x35, 0x04, 0x93, 0x28, 0x0e, 0x8c, 0xa6, 0x5e, 0x33, 0x40, 0xcf, 0x89, 0xbe }, { 0xb9, 0xe5, 0xee, 0xf2, 0x37, 0x8c, 0xc4, 0xd7, 0x1f, 0xca, 0x46, 0x76, 0xaa, 0xbb, 0xbe, 0x8e } }, { "\xa4\xb0\xa8\xb9\x2f\x70\xb3\x88\x6c\x77\xc2\xf4\xe3\xad\xbe\x5b\x73\x6c\x96\x3a\x13\x28\xf5\x06\x11\x51\xcd\x3a\x7e\x95\xa7\xe0\xcd\x25\xcc\xa2\x91\xfd\xd3\xfa\x73\xde\xe7\xed\x2b\x0a\xbe\x77\xf6\x31\x9d\x31\xb4\xe2\x7f\xa5\xb7\x95\x77\x03\x77\x68\xd3\x9f\xe0\x9d\x52\xf5\x3c\x70\xbc\xd8\x94\xad\xc6\x2e\xd8\x7c\x74\xbb\x01\x25\x7f\xcb\x57\x54\x4b\xc6\x1e\x7a\x6d\x04\x00\x92\x55\xf8\xe5\xab\x53\x5d\x78\x91\x26\xa3\x5d\x20\xaf\x38\xc4\x30\xb2\xb3\xd3\x45\x98\xf3\x16\xf6\x43\x2a\xab\x22\x31\x6b\x63\x86\x95\x43\x6a\x1f\x2d\x04\x10\x62\x46\xb0\x9d\xbd\x03\xc2\xd7\xa0\xc6\xed\xbf\xfa\x9b\x78\x24\x85\x99\x13\x62\xd2\x35", 155, { 0x67, 0x5f, 0x73, 0x7f, 0xcd, 0xad, 0xc1, 0x57, 0x5d, 0x11, 0x42, 0x81, 0xba, 0xac, 0xcb, 0x74 }, { 0x2e, 0x49, 0xac, 0x93, 0x81, 0x67, 0xf8, 0x04, 0x91, 0x57, 0xed, 0xec, 0x99, 0xe5, 0x7a, 0xf3 } }, { "\xdc\xbd\x17\x3c\xf6\x1b\x88\xdf\xb7\xb2\x64\x63\x89\xc2\xbd\x6e\x38\xaa\x8d\x97\xd6\x4d\x1f\xc3\x57\x77\x8e\xb9\x1f\xf1\x5e\x56\x35\xb0\x90\x88\x2c\x74\xc6\xd2\xc3\x0a\x6d\x56\x0b\x49\xce\x50\x6d\xe4\x58\x22\x90\xf6\x49\x91\x15\xb3\x99\xba\x65\x6e\x33\xd6\xfa\x4e\xc7\xa9\xe1\xd9\x84\x1a\xd2\x76\x02\x17\xe2\xd3\x97\x2b\xd4\x5d\xbd\xbc\x66\x8d\x90\xa4\xe5\x54\xf1\xd8\xdf\x5f\x8b\xad\x97\xe5\x9e\x88\x88\x50\xf7\x64\x2c\xb0\x5f\x04\x6b\xd3\xb2\x76\x0b\xf0\xfd\x25\x2b\x11\x38\xf5\x8d\x8c\xea\xe9\x9e\x58\x8b\xa0\x2c\x0c\x18\x16\x13\xb3\x26\xff\x72\x39\x56\xc4\xde\x2d\x8c\xd5\x05\xdc\x49\xaa\x20\x2a\x33\xc2\x2e\xc5\x7a\xd1", 156, { 0xe7, 0xd7, 0x55, 0x52, 0x87, 0x69, 0x58, 0x2f, 0x33, 0x3a, 0xe4, 0x36, 0xba, 0x66, 0x51, 0xc4 }, { 0x2e, 0x7d, 0x5c, 0xfb, 0xe2, 0x2a, 0xc4, 0xaf, 0x40, 0xdc, 0xa8, 0x21, 0xd0, 0x3a, 0x17, 0x0e } }, { "\x0b\x34\x50\x9c\x21\x77\xcc\x27\x7c\x91\x0e\x89\x8b\x45\xc4\xef\x24\xea\x7d\xe8\x2b\x71\x0c\xa4\xd1\xb0\xf9\x3a\xfd\x00\xa6\xbc\xb0\x04\x25\x51\x51\x1a\xc7\xc2\xb9\xf2\x60\x8a\x68\x70\xaf\x82\xe0\xb5\x79\x8d\xa0\xa7\x8b\xb7\x77\xea\xb8\x6d\x38\xee\x27\xb6\x88\xbe\xfa\xe2\x52\x11\xa9\x5e\xcb\xcb\x13\xd0\xf8\xc6\x84\x3c\x8a\x15\xab\xa9\x23\x29\x6c\x7b\x46\xb1\x69\x7d\xe6\x0e\xc0\xa6\x21\x83\xfe\x06\xd9\xf4\x18\x3f\xdc\x48\x08\xd1\xd7\x08\x50\x7e\xfa\x8b\xd8\x1f\x6b\x03\x1d\x08\x3e\xab\x42\xe9\x18\x22\x9e\x64\xee\xef\x5c\xa0\x7f\x2c\x72\x95\x28\x80\xca\xbb\xea\xe2\xf3\x68\xa6\x51\x33\xda\xdd\x45\xd1\x3d\xbe\x0c\x1c\x9d\x45", 157, { 0xc4, 0x51, 0xeb, 0x1a, 0x55, 0x65, 0x5b, 0xc2, 0x6a, 0xec, 0xdc, 0xd0, 0x2e, 0x51, 0x5a, 0xc9 }, { 0x4e, 0xc5, 0xcb, 0x15, 0xa7, 0x7a, 0x12, 0x94, 0x32, 0xa7, 0x94, 0xb4, 0x82, 0xf6, 0x91, 0xa2 } }, { "\x3d\x3a\x67\x97\x48\x3c\x08\x5b\x15\x10\x2c\x46\x49\x76\x05\x01\xb5\x91\x52\x56\x99\x8a\x72\xd3\x73\x6c\x41\x4e\x0b\xcf\x4b\xd6\xc9\xfb\x66\x89\xe8\xc4\x9d\x99\xf4\x3c\xe2\x3a\xfc\x90\x90\xdb\x68\x88\x4d\xe4\xed\x3f\xa4\x7d\xed\xf5\x85\x8f\xc7\xc7\x68\xbd\x65\x78\xc8\xb6\x99\xf9\x2d\x6d\x19\x45\x19\x55\x19\x07\xec\x58\x67\x40\x1b\x97\x01\x51\x5e\x4a\x5d\xf6\x77\x26\x61\x27\x20\x40\x76\x4d\x51\xa5\xf9\x17\xc5\xb8\xf1\x9b\x30\xd4\x43\x16\x18\x43\x67\x95\xef\xc2\x71\x78\xd4\xa3\x92\xc2\x6d\x08\x3c\xdd\xd2\x1f\xfd\xfe\xa4\x97\xc8\xb4\x58\x59\x67\xdc\x07\xa6\x4f\xb5\x43\xa6\x98\x59\x13\xe8\xc8\xff\x9c\x9f\x46\xd7\x96\xcb\x16\xef", 158, { 0xee, 0x17, 0xc3, 0xf2, 0xa5, 0x5c, 0x11, 0x6e, 0x37, 0x33, 0x02, 0x38, 0x11, 0xb9, 0x13, 0x9b }, { 0xef, 0xd9, 0x14, 0xb2, 0x0f, 0x4e, 0x65, 0x5b, 0xe4, 0x80, 0x35, 0xf3, 0xb5, 0x36, 0x39, 0xc5 } }, { "\x93\x62\xc6\x7c\x84\xfb\xc9\x7e\xc6\x84\x8c\x46\x6e\x2a\x4d\x8d\x07\x52\x43\x13\x0c\x3f\x3a\x1f\x40\xcc\x0a\x3e\x3b\x6e\x49\xea\x8b\x2f\xdb\x4d\x41\xcc\x0f\x61\x29\xb4\x28\x24\xe0\xea\xe9\x73\x48\x2b\x09\x2a\xb6\x73\xa6\xac\xd6\xbf\xdb\x71\x0f\x26\x7b\xb9\xc2\x84\x7c\x6e\x33\x22\x8e\x7e\xa6\xd5\x70\xc0\x7f\x5a\x3f\x5b\x5b\x8a\x3e\x9d\x85\x62\xf2\x30\x4e\xbc\x47\x6b\x22\x2c\xbf\x68\x3c\x69\x8e\xd0\x24\xe9\xd4\x78\x0f\x8f\xe6\x90\x40\xab\x0a\xec\x60\x96\x51\xda\x34\xff\xd8\x2f\x81\x83\x1b\x6a\x3c\x77\x3a\xf7\x20\xba\xb3\xfa\x57\xe7\x7a\x2e\x57\xa0\x1e\x7e\x54\x3f\xcb\xbf\xe3\xb3\x7b\xd8\x0d\x8d\xa5\xc1\x15\x86\x0c\x0c\x7e\x23\xbc", 159, { 0x94, 0xa5, 0x56, 0x18, 0x23, 0xa2, 0xeb, 0x84, 0x5d, 0xde, 0x63, 0x37, 0x53, 0x85, 0xea, 0x9b }, { 0xba, 0xdf, 0xe3, 0xdf, 0x1d, 0xfa, 0xa4, 0xad, 0x7c, 0xd0, 0x54, 0x9f, 0x52, 0x45, 0x17, 0x01 } }, { "\xa6\x1d\x56\x9f\x2d\x63\x75\x40\x16\xdc\x9b\xe3\xc8\x44\x91\x59\x7f\xeb\xed\x45\xaf\xd9\xfd\x10\xdc\xff\xc2\x0f\x58\xac\xf1\xe8\x76\x01\x2a\xf0\x1d\x8a\x4e\xf9\xfc\x17\xe3\xce\x5e\xab\xed\xbf\xda\xbf\xe4\xf8\x87\x63\x78\x3a\x27\xf3\x8a\x2c\x5a\x08\x61\x18\x5d\xfd\x23\xc1\xc7\xcf\xd8\xcd\x2b\x92\x6c\x12\x6d\x9e\xd2\x1d\xb7\xc7\xeb\xb0\x62\x57\x22\x32\x59\x09\x2b\x52\xf4\xd8\x06\x90\x2d\x92\x32\x01\xfd\x4b\xfa\x5a\x5e\xdb\x17\x8c\xa0\x30\x79\xf7\x9f\xc9\x1f\x9a\xd3\xc1\x12\xc5\xf6\xe9\x49\x20\x66\x40\x06\xb6\x8d\xd5\x73\xc8\x43\x62\x66\xa2\x1e\x05\xf3\xa3\x7f\x41\x2f\xe0\x1b\x07\x63\x39\x36\xd7\x01\x4b\xa2\xad\xa7\x1d\x93\xbc\xae\x0c", 160, { 0x32, 0x0d, 0x43, 0x7c, 0xe1, 0x29, 0x1a, 0xd2, 0x80, 0x1c, 0x8b, 0x07, 0x81, 0xf6, 0x2a, 0xb1 }, { 0x6a, 0x99, 0xcf, 0x78, 0x08, 0x76, 0xc1, 0x99, 0xbe, 0x09, 0xb4, 0xf3, 0x7b, 0xd4, 0xaf, 0xed } }, { "\xb2\xf9\x22\x16\x24\x14\x4a\x23\x28\xc8\xe8\x74\xa2\x1e\x68\xe8\x7a\x75\x65\x0b\xd5\xe7\x3e\x86\x92\xf0\xc8\xe5\x56\x34\xa4\xf4\xae\x1b\xa7\x6d\x9e\x34\x6e\xf1\x71\x0b\x01\x0a\xb9\xb9\x30\x41\x9a\xb8\x41\xac\xfb\x40\x74\xe5\xc3\xae\x89\x0b\xd4\x1e\xf6\x80\x52\x4d\xa2\x19\x93\xef\xe6\xc3\xb4\x72\xc6\xb7\xb7\x25\x51\x62\x3d\x47\x53\xab\xf5\xfc\xe0\x41\x64\xeb\x65\xbe\xe9\x12\xc5\xb9\x64\x48\xa2\x66\x68\xb4\xf8\x91\x9e\x23\x4a\x5b\x12\xfa\x6c\xa4\x35\xeb\x2d\x76\xbb\xda\x64\x8d\x47\x60\x40\x8e\x07\xc3\x8f\x27\x67\x5d\x49\x35\x17\x35\x69\xef\xa5\x6f\xfe\x3a\xcd\x6d\xe1\x1e\xc3\x6f\x61\x63\x43\x17\x47\x22\x6a\xe6\xbc\x35\x89\x43\xc9\x2d\x70", 161, { 0xc0, 0x2a, 0xda, 0x99, 0x23, 0xea, 0xfd, 0xf5, 0x09, 0x2f, 0x91, 0x53, 0x47, 0x59, 0x32, 0x1f }, { 0x6f, 0x89, 0x52, 0x79, 0x0e, 0x4f, 0xaf, 0x66, 0xce, 0xe5, 0xef, 0x8d, 0xf3, 0x86, 0x89, 0x8f } }, { "\x89\x8b\x15\x25\x56\xf6\xae\x7f\xa0\x04\xc1\x39\xf3\xd1\x7d\xbc\x5d\x9e\xd8\xf9\x15\x82\x94\x71\x1d\xa6\xa1\xfd\x31\x87\x41\xae\x97\x73\x2b\xbc\x0a\x5e\xd5\xc9\x5a\xd8\x2e\x77\x94\x09\x7e\x48\xdf\xbd\x59\xdb\xe3\x71\x01\x9a\xd0\xac\xbc\xb3\x4b\x03\x5f\x5a\xf6\x9e\x01\x2c\x5a\xb2\x70\xc3\x0e\x05\x77\x1c\x17\x8c\x2a\x9c\x78\xc6\x9c\xeb\x7d\xf3\x89\x08\x99\x4a\x85\x61\x92\xc2\xcc\x73\xbd\x27\x43\x4d\x3b\x36\xeb\xdd\x1c\xd0\xc6\x18\xce\x23\x11\x01\x11\x4d\x57\xa7\x76\x57\xec\xc5\x25\x46\xef\x3d\x4d\x53\x14\x96\x8b\xca\x68\x86\xda\xe9\x35\x27\xfd\xc4\x27\xf5\xab\x82\x8a\xc7\x9b\xa2\x95\x65\x13\xfb\xcb\x53\xeb\x1b\xe6\xb8\x11\xd6\x97\x07\xec\x16", 162, { 0x12, 0xfc, 0x95, 0x7f, 0xe9, 0x3f, 0x9f, 0x2b, 0xd0, 0xfb, 0x1e, 0xd4, 0x47, 0x3e, 0xdd, 0x06 }, { 0xea, 0xf0, 0xb4, 0x31, 0x59, 0x6e, 0x8b, 0x63, 0x53, 0xb8, 0xbc, 0x08, 0x16, 0x40, 0xc1, 0x06 } }, { "\x69\x2a\xad\x97\x98\xdc\x48\x27\xe1\x17\xc2\xa5\xe0\xcd\x74\x0b\xc5\xce\xb9\x94\x4d\x90\x3b\xc6\xb7\x1c\x18\xf1\xcb\x46\xab\x0c\x13\xc7\x62\x94\xa1\x23\x54\x06\x9c\xcf\xde\x5c\x02\x6d\x4c\x57\xec\xf7\x14\x71\x52\x12\xbf\xda\xc7\x09\xc5\x62\x41\xa7\xa3\xd9\x5b\xa5\x8c\x5e\xc9\x85\x1b\x5f\xc9\xf8\x2f\x7d\xdd\x80\x82\x69\x6d\x66\xe4\xf3\x96\x40\xef\x65\xa1\x68\x20\x93\xd9\x1d\xba\xd1\x99\x70\xe2\x1d\x00\x66\x5e\x18\x37\x28\xa0\x20\x54\x18\x6f\x42\x2e\x3b\xe3\xef\x26\x73\x86\x3b\x52\x3a\xfd\x2d\xfe\x89\xc3\x42\x63\x48\xf1\x2a\x86\x6d\x62\x70\x31\xa9\xdc\x15\x53\x58\x6f\xf5\x4c\x0c\x37\xe4\xee\x59\x56\x1e\x7c\xa9\x3a\x3b\x16\x05\xa4\x52\x50\xfc\x2f", 163, { 0x1c, 0xa6, 0x17, 0x6e, 0x87, 0x26, 0xde, 0xb4, 0xab, 0x3d, 0x8e, 0xd6, 0xa9, 0x9a, 0x94, 0x29 }, { 0xe3, 0x12, 0x8c, 0x8d, 0x19, 0x6a, 0x18, 0xa4, 0x94, 0xb2, 0x62, 0xeb, 0xb4, 0x96, 0x65, 0xdc } }, { "\x1a\xd0\xfe\x8b\x65\x8b\x20\xb5\xe5\x95\x71\xc7\x11\xbc\x6d\xdd\xf6\x73\x21\x1d\x26\x25\xfd\x2a\x70\x66\xfd\x41\xe0\xf9\x40\x92\xf0\x9d\x3b\x9e\x89\x92\x3a\xaf\xf2\xf9\x46\x92\x9f\xbb\x5f\x99\xf3\x8c\x75\x41\xed\x5c\x54\xea\x66\x8c\xaa\x6f\x4a\x9b\x40\x60\x17\x64\x70\xe8\x3e\x95\x4b\x07\x03\xe3\x13\xb1\xed\xf5\x09\xaf\xf9\xb9\x36\x57\x6e\x52\x3b\x76\xaa\xe7\xae\xb5\x1b\x9d\x32\xe7\x43\x29\xdf\x94\x93\xbe\x1d\x41\xec\xa5\x1a\xb6\xa5\x37\x9d\x07\x44\xaa\x8c\xeb\x37\xef\x0c\x95\xd9\x2b\x55\xc1\x9d\x4f\x96\x68\x8e\xc8\xd1\x32\x7d\x7d\x98\x87\x6e\xee\xc4\xa6\xa1\xc7\x54\x49\x27\x15\x56\x4e\x5d\xa5\x11\x09\x47\xcd\x8f\x3b\xd8\xfa\xf7\x28\x85\xbf\x22\xb7", 164, { 0xc1, 0xd7, 0xbd, 0xc3, 0x99, 0xb4, 0x20, 0xb1, 0xb6, 0xd3, 0xca, 0x18, 0x75, 0x0c, 0x58, 0xaf }, { 0xf0, 0x07, 0x2a, 0x1a, 0x9d, 0x10, 0x70, 0x37, 0xfa, 0x46, 0x9c, 0xd4, 0xdf, 0x3c, 0xf1, 0xf3 } }, { "\x63\x82\x90\xb8\x59\x48\x09\xb3\xe6\xea\x92\x8e\x77\x33\x2d\xae\x2d\xe7\xe0\x17\xa2\xff\x0e\xf8\xe8\x27\xcc\x83\x70\x35\x69\xd2\x46\x17\xfe\xdd\x4d\xed\xe8\xd3\x3b\xb3\x82\x71\x67\x3e\xf5\x65\xe8\x85\x36\xec\x01\xf3\x1b\xde\x5a\x0d\xb6\x66\x1f\xfe\xb3\x1a\xfb\xc4\x9a\x44\xdc\xca\xbf\x88\x7b\xf7\xaa\x88\x8a\xa3\xd9\x57\xf5\x81\x6b\x18\x4b\x32\x3d\xd6\x5d\x41\x69\x2c\x3e\x02\xa5\xb6\x55\x67\x7c\xc1\xe7\x92\xfe\xbc\xbd\x7c\xf7\x05\x9d\x33\xc6\x9e\xcd\xb0\xd0\x2d\x1c\x72\xd5\x59\x7f\x90\x95\x37\x2e\xa2\x99\x73\xf8\x74\xa6\x69\x9d\xd1\xa1\x6a\xe5\x50\x57\xf1\x1c\xe4\x07\x11\x40\x03\x76\x2c\x21\x1e\xe9\x19\x6a\x45\x07\x87\xa9\xbd\x9a\x23\x42\xc3\xed\xc0\x50", 165, { 0x02, 0x72, 0xe9, 0xd1, 0xf8, 0x49, 0x08, 0x67, 0xb3, 0xfd, 0x4d, 0xa7, 0xeb, 0xe0, 0x90, 0x2a }, { 0xe0, 0x30, 0x06, 0xa6, 0xbb, 0xf9, 0xce, 0xcc, 0x19, 0x4a, 0xc5, 0xf9, 0xbb, 0x10, 0x96, 0x00 } }, { "\xa5\x1c\x01\x87\x59\x42\xb0\x84\x45\x4c\x4c\xdb\x18\x20\x83\xc7\x56\x38\x64\x22\x28\x5d\xf1\x7e\x71\xa4\xac\x05\xdc\x41\x40\xf0\x90\x82\x2f\xff\x4a\x28\xcb\x36\xe5\xb7\x59\xe4\x4b\x19\x1b\x19\x8a\x98\xc9\x7a\x71\x30\xd9\xaa\x5f\x8f\x6a\xb0\x4c\xb4\x95\x31\x53\xe1\x72\x79\x8b\x62\x5a\xa3\x1b\xc7\x45\x38\x77\x0c\x18\x9d\x5b\xce\x75\x65\x08\x37\x1e\x67\xc9\x95\x94\x37\x9e\xb6\x3c\xbd\x6d\xf7\x0e\xcb\x51\xd6\x85\x7a\x62\x17\xd3\x2d\x8c\x64\x62\xb0\xa4\x88\xc8\x04\xd5\x52\x1a\x54\x81\x3a\x69\x51\x64\x5a\x77\xad\xa6\x01\x4b\x03\x56\x84\xd9\xaf\x38\xa8\xb4\xdc\x2a\xd2\xab\x63\x4d\xbe\xdc\x1c\x4c\xbc\x5c\xe3\x46\x29\xd8\xc2\xc6\x6c\x19\xc5\xe8\x92\x06\x9f\x87\x36", 166, { 0xc7, 0x77, 0x33, 0xd0, 0x4c, 0x77, 0xe5, 0xb0, 0x24, 0xdf, 0xec, 0x87, 0x69, 0x67, 0xe2, 0x1a }, { 0x57, 0xa7, 0x7e, 0x77, 0x4c, 0x34, 0xb1, 0x1f, 0x9d, 0x47, 0xfb, 0x01, 0x7c, 0xed, 0x34, 0xa3 } }, { "\xbe\xd1\x2e\x99\x0c\xca\xc8\x8f\x76\xc3\x28\xb1\x2e\x45\x09\x74\x39\xe7\x03\x74\x42\x83\xc3\x0d\x99\x87\xb2\x58\x9d\x9d\x72\xa3\xd2\x62\xf5\x0d\xb5\x95\x10\x53\x1b\xb9\x6d\xe8\xcd\xf5\x6e\xd1\xba\x86\x80\xcb\xb1\xee\x9c\x81\x21\xfd\x2f\xd5\x56\xd1\x0c\x59\x28\xdf\x70\xd4\x63\xb2\xe1\x8d\x5e\xab\xc7\xcd\x1a\x62\x26\x4a\xc3\xbd\x89\x92\x9f\x49\x5e\x1f\x76\xe5\x05\x36\x2d\xcf\x25\xa0\x56\xf1\x9a\xf8\x88\x62\x2d\xa2\x2f\xfd\x13\x2d\x92\x49\x4c\x97\xc5\x36\x7d\x2e\xee\xfc\x31\x10\x7a\x14\x77\x0d\x50\x24\x69\xc4\xb1\x8d\xae\xf8\xb5\x7f\x98\x29\xcd\xfc\x18\xd3\x43\x5a\x8e\x84\x83\x51\x08\xc0\x5c\xb6\xc1\xc5\x4e\x3e\x58\x11\xe7\x58\x74\x3e\x7b\x20\xad\xe7\x5f\x60\x1f", 167, { 0xef, 0xa4, 0x7e, 0x04, 0xec, 0xa0, 0x28, 0x94, 0xef, 0xca, 0xfc, 0xb4, 0xac, 0xcf, 0xf4, 0xc4 }, { 0x32, 0xb6, 0x38, 0xcd, 0x1a, 0x23, 0xd3, 0x95, 0xbf, 0x10, 0x1c, 0x58, 0x4b, 0x44, 0x2d, 0x0a } }, { "\x30\x16\x40\xab\xa5\xbf\xb1\xb6\x7e\xc7\xd5\x96\xd0\x53\x52\x11\x16\xec\x79\xb5\xbf\xba\xa9\xad\x9a\xa9\x4e\x3f\xca\x42\x80\xc0\x2e\xcc\x6c\x56\x59\x18\x9a\x33\xaf\x03\x8e\xef\x5c\x16\xf0\xe9\x36\x14\xe7\x64\x29\x87\x6f\x15\xbf\x07\x3f\x50\xe1\x74\x77\xfc\xa7\x84\x17\x5a\xe2\x34\x3a\xcc\xba\x58\xfe\x83\xcb\x0c\x0b\x1e\x10\x66\xfc\x7e\xa1\xca\x7c\x69\xcb\x9f\xdd\x8d\x5e\x67\x3c\x2e\xab\xc8\x98\xbb\x4b\x68\xdc\x44\x5d\xb1\x6e\x7c\xda\x4c\x70\x4a\x0a\xa7\x73\xa0\xf0\xa4\x24\xf4\x78\x70\x99\x3a\x0c\xcb\xdf\xae\x27\x1b\x65\x4c\x13\xe6\x5e\x01\x4d\xf6\xa3\xef\xd1\xe3\xe2\x8c\x20\xeb\xb5\x07\xfa\xdd\xbf\x66\xdc\x0a\x7a\x74\x19\xfa\x23\xbf\x91\x21\x46\x8c\xf6\x0e\x61\x63", 168, { 0x92, 0xa9, 0x70, 0x3f, 0x9a, 0x3e, 0x69, 0x13, 0x7f, 0xca, 0x96, 0x0c, 0xdc, 0xcd, 0xbb, 0x34 }, { 0xb7, 0x0b, 0x41, 0xb4, 0xe4, 0x40, 0x48, 0x4e, 0x5d, 0xda, 0xe0, 0x11, 0xd7, 0xf7, 0xb3, 0xc1 } }, { "\xca\x44\x3d\x62\x92\xf1\x68\x6c\xaf\x56\x50\xb6\x98\xdf\x11\x6b\x4c\x3c\x29\xee\x9a\xda\x6b\xdd\x00\xee\xfd\x43\xb1\xe1\x35\x58\x04\x41\xfd\xa0\xe9\xd2\xbe\xf4\x69\x41\x53\xe7\x02\x7d\x6f\xc0\x4e\x97\xe0\xa8\x44\xc1\x26\x83\x27\x6c\xc6\x35\x13\xfc\x0d\x93\x29\xb1\x32\xfb\xcf\x53\xfe\x80\x72\x96\xa9\x5b\x77\xa0\xa0\x56\xbe\x5b\x2b\x6f\xfb\x84\x7f\x7d\x95\xc3\x57\x9e\xa4\x75\x51\xaa\xd4\xd2\xb4\xd4\x85\xfc\x7e\x7b\x1a\x59\xec\x14\x14\x86\xc2\xaa\x75\xe5\x2a\x72\x28\xa6\xf2\xfe\xa0\x46\xe8\xe4\x24\x82\xb8\xb8\x9a\xee\x21\xe0\x5c\xf9\x32\x9c\x1c\x2a\xe3\xb6\x30\x7b\xe8\xe6\xd1\xc2\xc8\x10\xca\xd4\xd2\xf2\x19\x4f\x26\x52\x84\x91\x0f\xda\x83\x25\xf4\x78\x9c\xc9\x8c\xb6\x99", 169, { 0x58, 0xc4, 0x5f, 0x09, 0x40, 0xe5, 0x8a, 0xd8, 0xee, 0x64, 0x6a, 0x38, 0xc4, 0xc7, 0x16, 0x67 }, { 0xf6, 0x90, 0x5a, 0x55, 0xd9, 0x3c, 0xd2, 0xa6, 0xe3, 0x5c, 0x87, 0xb9, 0x80, 0x0c, 0xfd, 0x2b } }, { "\x15\xc6\x8c\xbc\xfd\x7e\x1e\x97\x00\x4c\xe1\x5f\x8e\xad\x38\xf2\x1c\x55\xa7\x9d\x89\xfd\x91\x08\x58\xed\x38\x34\xbf\xa8\xaf\x5c\x67\x06\x58\xb1\xd6\xaf\xe3\xe1\x08\xb3\x70\x62\xbb\x59\x83\xe0\x13\x5a\x77\x32\xeb\x24\x88\xfc\x6a\xbb\x11\x88\xed\xb6\xc7\x19\x86\x59\xaf\x96\x84\x6b\x66\x13\xd0\xcc\x69\xf1\x09\xb7\x32\x35\x88\x7c\x84\x2d\xa7\x08\x79\x4e\x42\x83\xda\x9b\xd6\xff\x12\x8f\x2c\x06\xd4\x23\x68\xbb\x05\x75\x7a\xbc\xe0\x4b\x2f\x1f\x6d\xf1\x7e\x8e\x99\x17\x5c\xaa\x8f\xda\x30\x5d\xdc\xa3\xe5\x0e\xdc\x1f\xc0\xf3\x96\x9f\x8f\xcc\x6f\xaa\x5e\xe5\x2e\x5b\xdb\x22\x83\x36\xd8\xe4\x76\xe2\x98\xa0\x64\xf6\xc7\x02\x5a\x98\xf2\x79\xf5\x4c\xb6\x2f\xd1\xf0\x95\xbb\x66\x67\x03\xae", 170, { 0x38, 0x78, 0xf7, 0x6b, 0xf2, 0x87, 0x74, 0xfb, 0x77, 0xd4, 0xd1, 0xf9, 0x9d, 0xbb, 0xd5, 0x89 }, { 0xa3, 0xbb, 0x35, 0x97, 0x0c, 0x48, 0xbd, 0xce, 0x72, 0x9d, 0xbe, 0xc9, 0x04, 0x39, 0xc4, 0xf2 } }, { "\xfc\xcb\x0b\xca\x97\x57\x39\xeb\x6f\xce\x28\x01\x72\xe8\xda\x8d\xaf\x81\x01\x26\x07\xe5\x77\x18\x88\x28\x70\x87\x0a\xee\x08\x97\xa5\x9c\xdb\x9c\x16\xc1\xf6\x50\x74\x3a\x3b\xa8\x7f\x99\x02\x03\xea\xe7\xf3\x16\x5c\xbf\x4d\x67\x06\x40\x68\x52\x3c\xdc\x18\x4b\x42\x77\x68\x6e\xcb\x19\x79\x3a\x5f\x1a\xc5\xcb\x19\x86\xa7\x4b\x4c\x44\x80\x94\x37\xcf\x8d\x1f\xf4\x72\x70\xfc\x82\x93\xbb\xa9\x08\x12\xea\xeb\x78\x3d\x04\x14\x48\x3e\x7b\x85\xb2\xfe\xa0\x4b\xe8\x31\x19\x4f\x10\xf0\x24\x99\x1e\x0d\x43\x2a\x3b\x60\x72\x42\xa5\x36\x97\x8a\xb1\xb7\x4e\x4e\x73\xbc\x59\x77\xd2\x57\x46\x62\x62\x4f\xff\xfb\xca\x18\xb9\x40\x0f\xbe\xbb\x1c\xec\xdf\x93\xd2\xfc\x18\x34\x6f\xe1\x03\x52\x70\x35\xc1\x29", 171, { 0x15, 0x1b, 0xd1, 0xec, 0xd5, 0xa6, 0xb1, 0x98, 0x35, 0x88, 0xdd, 0xb5, 0x33, 0x43, 0xeb, 0xe5 }, { 0x30, 0x7f, 0x2e, 0x91, 0xb1, 0x59, 0x82, 0x89, 0x84, 0x83, 0x49, 0x6f, 0x0d, 0xfb, 0x29, 0x51 } }, { "\x50\xee\x93\xc6\x6a\x0f\xb6\xd3\xb9\x95\x3e\x44\x7c\x30\x32\x3c\x56\x85\xae\xb0\xfe\x91\x45\x73\x79\x83\x41\x55\xc4\x0d\xc4\xb8\x70\xc5\xfa\xa9\x99\xe3\x56\x54\xe3\x7e\xb6\xaf\x72\x54\x93\xa8\xc2\x12\x30\x41\x0b\x85\xc1\x8a\xbe\xd1\xe1\x63\xb5\xc5\xfb\xc1\xfc\xd7\xdc\xaa\xb8\xa8\xfc\x64\xa7\xce\x48\x36\xda\x53\xf9\x81\x7e\xb7\x2f\x7b\x6d\xe5\x75\x01\xf6\x88\x4d\x54\x5f\x42\x5f\x6c\xc7\xff\xf2\xca\x07\xae\x54\x4e\x43\xcc\x1e\x1f\xe2\x78\x69\x00\xcc\xa0\xfd\x70\x10\x4a\x1f\x13\x82\x93\xc6\x45\xbb\x01\x02\x34\x1c\x5b\xea\x55\x82\xad\x54\xdd\xbf\xed\xb2\x69\x62\x72\xb4\x85\x07\x42\x77\x39\x93\x50\x25\x32\xfc\xde\x5b\x35\x98\x42\x8e\x49\xf0\xc9\x20\xde\x9c\x59\x94\xa7\x11\x1b\x72\x6e", 172, { 0xfe, 0x64, 0x81, 0xab, 0xc5, 0xb0, 0x3d, 0x67, 0x80, 0xc1, 0x0b, 0x7d, 0x86, 0xa2, 0xc0, 0x54 }, { 0x57, 0x12, 0x3e, 0x1f, 0x18, 0xc1, 0xd1, 0xeb, 0x44, 0x56, 0xe2, 0xab, 0xe4, 0x33, 0x1e, 0x15 } }, { "\x30\xd6\x6e\x30\x31\xe4\xdb\xf9\x0c\xa9\x2b\xbc\xde\xf0\x44\x22\x0a\xdd\x8e\x70\x30\x7d\xc3\xb9\x72\xe3\x2b\x99\xaf\x1b\x00\x8b\x6f\xeb\x7b\x1f\x4b\x15\x8d\xe3\x00\xb5\x24\x1c\x25\x26\xc9\x63\x41\xba\xec\x07\x6f\xeb\xeb\x78\x05\x84\xff\xf5\x5f\x11\x55\x59\x93\xea\x7f\xf0\x1a\x02\x96\x1b\xba\x58\x56\x40\x9e\x2c\x90\x6e\x03\x98\x42\xed\xb6\x5c\x03\xa8\x80\x14\xe5\xb5\xe8\x5d\x81\x00\x17\xa3\x5f\x33\x79\xe0\x7d\x50\xf5\x93\x03\x59\x0a\x28\xbf\x0c\x01\x64\xa5\x34\x37\x22\x0e\xb4\xec\x46\x39\x1d\x1f\x1b\x53\xea\xbf\xa3\xaa\xb3\x06\x0b\x7c\x9d\x16\x33\x55\x69\x47\xda\x03\x2f\xd2\xb0\xf8\x56\x0c\xa3\xb3\x6f\xe2\xdd\x91\xb8\x49\x43\xf3\xfa\x94\xef\xe2\xcc\x9e\xf6\x47\x57\x40\x71\x90\x23\x7f", 173, { 0x40, 0xc6, 0x9f, 0x90, 0x51, 0x97, 0x91, 0x7b, 0x9e, 0xab, 0x2e, 0x11, 0xeb, 0xc2, 0xdb, 0xd6 }, { 0xef, 0xc2, 0x2c, 0xfe, 0xf9, 0x7a, 0x8c, 0x00, 0x3f, 0x80, 0x07, 0x7c, 0xa1, 0x3f, 0x7f, 0x30 } }, { "\x19\xd3\xce\x7c\x93\x6f\x91\xc1\x0d\xb1\xd0\x8d\xe3\x6c\xaf\x95\xe5\x51\xbd\x30\x81\x9a\xf8\xf7\xa3\x80\x3b\x21\x03\x4a\xd9\x52\x6f\xd8\x2c\xf9\xbd\xc9\x4b\xae\x88\xbf\xc2\xec\x25\x4e\x18\xc4\xbf\xe8\x4e\xa7\xb8\x0c\xe3\x48\x3a\xa2\x16\xde\xca\x0e\x95\x03\xa5\xbb\x08\x5c\xf7\x73\xee\xdf\x1c\x71\xc8\x9c\x33\x52\x6f\xcb\x38\xa7\x66\xa7\xf0\x35\x75\x0f\xae\xc0\xb3\x05\x79\xa6\xcc\x12\xb6\x55\xb6\x74\xb5\x98\x2a\x67\x7b\xc2\x75\x4b\xd0\x77\x21\x9a\x9f\x86\xe2\xd5\x76\xc9\x61\xa8\xb5\x9d\x0f\x88\x79\x50\x1a\x4b\x7e\xc4\x4e\x44\x8b\xd8\xf4\x83\xc4\x2c\x8b\xd0\xa1\x41\x5f\x26\x5e\xb6\x6f\xc2\x16\x45\x1c\x7d\x31\x11\x1e\x09\xa1\xe0\xa8\x0a\xb0\xa2\x44\xa7\x51\x51\xef\xcc\xbd\xfc\xad\xeb\x6a\xec", 174, { 0xea, 0xf6, 0x58, 0x37, 0x68, 0x80, 0xf2, 0xa5, 0xfc, 0x5f, 0x3d, 0xf0, 0xbc, 0xfd, 0x65, 0x75 }, { 0x21, 0xca, 0x35, 0x77, 0x76, 0x33, 0x9b, 0x82, 0x01, 0xfe, 0xa5, 0x4b, 0x39, 0x70, 0xbd, 0x02 } }, { "\xe3\xd1\x33\x0d\x5a\x93\x49\x1f\x8e\xd2\x48\xd3\x2f\x59\xfa\x52\x1e\xdd\x01\x00\xba\x9b\x43\x57\xf6\x77\x9d\xac\x07\x8e\x15\x36\x91\x9c\xf0\x1f\x96\x44\x20\x0d\x44\xed\x91\xe8\x6b\xd7\xf4\x15\xbf\x61\xcc\x2b\x15\xd4\x2d\x6b\xfa\x82\x5f\xba\xa0\xb2\x36\x23\xaf\x91\x31\x00\x58\x7a\x0d\x09\x94\xfd\x65\xbe\xf9\xe6\x07\x26\xd8\x46\x93\x86\xb0\x43\x3e\x6e\x1a\x54\x5d\x0a\x2b\x8a\x61\x3d\x62\x41\x5e\xbd\xe8\x87\xdb\x22\xbe\x2f\x3a\x64\x0c\x8f\x96\x85\x35\xd1\x2a\x98\x57\x20\x3c\xb9\x27\x92\xf0\x0b\x41\x4c\xa4\xa9\x05\xd3\x7f\x44\xa2\xf6\xef\x1e\xe3\xa7\xf5\x68\x8e\xcf\x46\x04\x9d\x2b\x94\x91\xd9\xd0\x0f\x66\x67\xc4\x3d\xdf\x2e\xe9\x8c\xf6\x30\xbc\x25\x25\xdd\x0a\x19\xac\x81\xba\x90\x4c\xab\xb8\x4d", 175, { 0xd2, 0x72, 0x17, 0x4f, 0xb1, 0x9b, 0xe7, 0x3d, 0xe3, 0x31, 0xa7, 0xe6, 0x55, 0x4e, 0x5a, 0x08 }, { 0xaf, 0x85, 0x1f, 0x03, 0x77, 0x87, 0x81, 0xb7, 0x4a, 0x0e, 0xeb, 0xb9, 0x1e, 0xfc, 0x0b, 0x1c } }, { "\xe3\x9f\x45\x41\xcb\xc8\x52\x38\x8c\x4d\xc0\x2c\x38\x07\xa9\xad\x66\xbe\x0e\xe1\x07\xe6\x5e\x2a\xce\xe1\x92\x6b\xde\x54\xf3\x33\x6f\x2c\x75\x35\x2a\xcf\x12\x6a\x33\xe6\xe9\x92\x75\x1b\xe2\xaa\xf8\x8c\x16\x95\xe7\x6f\x5e\xa3\x05\xb1\x68\xaa\x56\x17\xba\xcb\xa6\xce\x02\x60\x40\x8d\xed\x0d\xe7\xd7\xd4\xe6\x48\x7e\x9b\x57\xcc\xd3\x0f\xed\xdb\x21\xcb\x19\x54\xb5\x48\x1f\xcc\x20\xc8\x31\x37\xa0\x73\x44\xe2\xb8\x8d\x2a\x61\xa1\xa3\x4e\x00\xb5\xee\xbe\x8c\xd1\x88\x00\xbb\x00\xf6\x2e\xe7\x1f\x83\xe9\xa4\xff\x3c\x93\xe9\x83\x4f\xc9\x75\xcd\xc2\x96\xa7\x7c\x41\x57\xd0\xe7\x84\xb5\xe3\xb5\x35\x99\x6d\x4f\x50\x7e\x74\x69\xb2\x54\x66\x82\x8b\x68\x5e\x89\x7a\xdb\xba\x61\xaa\x0a\x87\x52\xc7\x92\x13\x18\x5c\x71", 176, { 0xcc, 0x97, 0x57, 0x9a, 0xae, 0x04, 0xa3, 0x36, 0x7d, 0x6d, 0x60, 0xa7, 0x5e, 0xa1, 0xd9, 0xe2 }, { 0x08, 0x08, 0xc7, 0xa8, 0xcd, 0x04, 0x63, 0x0b, 0x2c, 0x6e, 0xc3, 0x97, 0x0d, 0x85, 0x43, 0x98 } }, { "\x90\x6f\x81\x7c\x88\x11\xd8\xe6\x00\x08\xf5\x28\x14\x38\xfe\xc3\x09\x45\x81\x30\x12\xa8\x3a\xd7\xda\x41\x38\x2a\xf3\xf4\xd5\x06\x93\x56\xc9\x59\x45\x44\x58\xa1\xed\xe9\x4a\x10\x69\xb2\xf8\xb7\x2f\x8e\x3a\xfb\x7d\x00\x2d\xf7\x44\x79\x71\x24\xd6\xd2\xd4\xe2\x26\xb3\x2f\x74\x71\x96\x2e\x66\x1e\x4e\xef\x3e\xca\x23\x67\x43\x9f\x4b\x0c\x0a\x48\xd6\x69\x3d\x2d\xbf\x10\x41\xee\x08\x86\x65\x4b\x35\x40\x16\x76\xea\xf6\x58\x4c\xf3\x19\x32\x22\x1b\x68\x8b\x4b\x9b\xa7\xe6\x5d\x56\x9a\x51\x11\x09\x52\x08\xa9\x1b\xac\xd2\xa0\x4f\xb7\x87\x44\x7d\xc0\xe4\x1f\xce\xae\xdf\x2e\x8f\xf9\xfb\xf5\xcb\x68\x7a\x52\x37\x21\x62\x8d\x55\x52\x21\x9f\x1a\x1b\x46\x7b\x58\xd3\xfb\xd4\xce\x29\x33\xdb\x8f\x54\xd1\x0b\x31\xf3\xa4\xe5", 177, { 0x72, 0x02, 0x9f, 0xd3, 0x17, 0x95, 0x1f, 0x7a, 0x73, 0xcd, 0xc8, 0xbc, 0x0e, 0xd0, 0x73, 0x1a }, { 0x03, 0x87, 0xc7, 0x1f, 0x68, 0x1c, 0x3e, 0x15, 0x49, 0x51, 0xe7, 0xab, 0x82, 0x47, 0x52, 0x3f } }, { "\x5c\x94\x27\x62\xeb\x1d\xe9\x65\x2d\xce\xe1\xef\x85\xaa\x8d\xcc\x88\xa0\x17\xbb\x11\xde\x3c\xe7\xf2\x8b\xb0\x72\x37\xb1\xff\x88\x5f\xbb\xf4\xd5\x0e\x4d\xf0\x80\x24\x4c\x53\x4c\x0a\x9b\xec\xba\xc4\x1a\x40\xef\x00\xf0\x13\x52\xe3\x9f\x23\xa9\x4b\xd6\xe7\x2e\xed\x51\x9e\x4f\xe3\xc9\x15\x2d\xa5\x78\x6b\x48\x77\x67\xfa\x69\x89\x9b\x7a\x31\x5d\x3b\xcf\x05\xa0\xf6\xdb\x5e\xd0\x43\x45\x53\xb9\x90\xa3\xa9\xdb\x48\x3e\x21\x86\xbe\x5f\xfb\xb2\x6c\x1a\x25\x4d\x79\x39\x12\xdc\xe1\xd5\xad\xf1\x7d\x63\x03\x84\xc1\x8a\x72\x12\x99\x93\x6e\x0f\x59\x10\x11\xe9\xd4\x39\xa8\x8a\x54\x1f\x2a\xa5\x37\x19\x5c\x97\x9e\x84\x05\x42\xdd\x19\x57\xf8\x37\x4a\xb7\xf4\xf3\x5f\x2e\x9d\x91\x8b\x6b\x1f\xd4\x93\xba\xfc\x72\x23\xa8\x13\x9e", 178, { 0x0f, 0x61, 0x0f, 0x4e, 0xc9, 0xf8, 0x0d, 0x40, 0x24, 0x67, 0x40, 0x20, 0x0b, 0x67, 0x5a, 0x4d }, { 0x20, 0x31, 0xa1, 0x73, 0xc1, 0x60, 0x8d, 0x80, 0x79, 0xb8, 0xf2, 0xd6, 0x81, 0xb3, 0x86, 0xc4 } }, { "\x9f\xca\xf8\x59\x0d\xbd\xd7\x48\xd4\xea\x00\xb1\x76\x41\xe0\x87\xcc\x4f\x47\x68\x62\xbc\x3d\xe4\x23\x3e\x60\x3d\xe9\xf9\x2d\xbf\xd5\xb0\x62\x9e\xe0\x1a\x37\xa7\xa2\x6f\x22\xf5\xbc\x8a\x63\x6c\xd5\xce\x20\x49\x3e\x19\xb4\x92\x46\xa6\x92\xed\xda\xa1\x29\x54\x0f\xbe\x52\xe4\x81\x29\xcd\xe6\xea\x4f\x5a\x60\xad\x5a\x77\xd7\xc2\xea\x81\xe5\x10\xa2\xd9\x15\x2e\xc6\x8e\xd4\x0f\x5c\x7d\x02\xa5\x60\xb4\x7d\xed\x93\xc0\x86\x46\x04\x58\xd0\xb9\x7f\x6f\xc1\x76\x36\xbb\x4f\x24\xf5\x8d\x43\xf7\x4a\x7f\xed\xa9\x73\x41\xb2\x00\x44\xc9\x9e\x74\x5f\x5c\x6c\xcb\x0c\x98\x2b\x9e\x3c\x27\x10\x34\xb9\x4e\x5f\x2e\x48\x28\x54\x23\xe3\x30\x63\x48\xd3\x37\x2e\x8e\x60\x0f\xab\xad\xeb\xff\x40\xef\xb1\xfe\xc0\xe8\x09\x62\xf6\x22\xc3\x73", 179, { 0xf6, 0x11, 0xc8, 0xa4, 0x7c, 0x5e, 0x6a, 0x79, 0x01, 0x49, 0x8f, 0x69, 0xa9, 0x60, 0x76, 0xbd }, { 0xf4, 0x2a, 0xed, 0x66, 0x1f, 0x62, 0x5d, 0xce, 0x93, 0x32, 0x51, 0x15, 0xe1, 0x4f, 0x3d, 0xd6 } }, { "\x8f\xb1\x03\x7a\x3d\x54\xb9\x3e\xa9\x23\xef\x31\x08\xf6\x8e\xf9\xeb\x54\x03\x4f\xd9\x38\xf6\xb8\xe3\x25\x4b\x85\x61\x5b\xed\x23\x17\xe3\x53\xaa\xb9\x6b\x7f\x9e\x3a\x4c\xf1\x69\x8b\x40\xff\xdb\xd5\x19\x66\x72\x1b\xe5\xe2\x66\x0a\x31\x50\x1c\x20\x72\x65\x8f\xd8\xaa\x94\x7b\xc1\x59\x39\xa0\xa8\x2b\x49\xba\x03\xe5\x04\x28\x41\x0d\x30\x30\x99\xd7\x93\x16\x4d\x1d\x93\xa7\x27\xc8\x95\xd2\xff\x8e\x5e\xf7\xaf\xb2\x75\xc3\xfd\x75\xa7\xd2\x50\xb0\x10\xd8\xf5\x46\x0d\xc9\x85\x43\x21\x4e\x51\x05\xb5\xd2\x8f\xa4\x07\x7e\xe2\x87\xc7\x6c\x60\x3e\x36\xc0\x1a\x9c\x6b\x32\x13\xe1\x41\x50\x8a\xf4\xb8\x60\xa0\x05\x67\x0d\x46\x97\xc8\x0f\x8b\xc8\x5e\x01\xa3\x2e\x40\x44\x12\xb6\xa2\x07\x46\xb0\x75\x72\xe9\xea\x02\x98\xca\x61\x31\x34", 180, { 0xe2, 0x11, 0x69, 0x4b, 0x83, 0x94, 0x4a, 0x2d, 0xe2, 0xae, 0xce, 0x3b, 0x37, 0xf0, 0x75, 0x1d }, { 0x07, 0x2d, 0x8b, 0x87, 0x61, 0x39, 0xcc, 0x9a, 0xdb, 0xa7, 0x8b, 0xdd, 0x5d, 0x3d, 0x03, 0x3d } }, { "\xdd\x2b\x4f\x42\x9a\xcd\x63\x4f\x68\xcc\xc1\xcf\x6d\x22\x5f\x76\xf1\x92\x9a\x21\xdc\xb6\x43\x5c\x48\xb8\xce\x22\xb4\x84\x9b\xf8\xcc\xfb\x62\x6e\x7f\x83\x67\xdb\x75\x7d\x07\x5f\xe1\xf8\xc6\xc6\xac\xaf\x18\xfe\xb3\x18\x16\xcc\xdf\x88\xca\xb9\x67\xd8\x2a\x0d\xc0\x82\x49\x19\xd2\x4d\x16\x2f\x8b\xd2\xe2\x54\x0b\x6f\xe6\xd9\x73\xcd\x14\x56\x0c\x31\x6f\x6b\x55\xad\x4a\xe7\xad\xff\x0a\xa0\x6e\xe3\x3f\x9e\x61\x22\xab\x21\x7d\x5d\xd3\x4e\x29\xc7\x35\x4f\x3b\xbe\x98\x70\x74\x4f\x1a\x78\xaa\x35\xbb\x1f\x56\xe6\xcd\xf3\x32\xd7\x97\xb1\x9c\x7b\xc0\xe8\xfa\xdd\x90\xa6\x3c\x38\xb3\x33\x84\xd1\x92\xbb\x4f\x22\x3a\xd1\x7f\x4d\x00\x93\xdd\xc3\x3f\xdd\xda\xe4\xfb\xf0\xf6\x85\xe7\x2f\x20\xd0\xb7\x77\x5d\x62\x70\xac\xc1\x1e\x82\x35\x2b", 181, { 0x01, 0x10, 0xb0, 0x83, 0x44, 0x58, 0x59, 0xb6, 0x09, 0x6a, 0x26, 0x49, 0xbd, 0x01, 0x6e, 0x1d }, { 0xdc, 0x7c, 0x19, 0x15, 0x34, 0xea, 0xb9, 0x72, 0x8d, 0x9a, 0x9b, 0x09, 0x00, 0x8e, 0xdd, 0xbc } }, { "\xef\x65\xb1\xd7\x42\xe2\xcb\x0e\xa0\xdd\x51\x67\xd9\x17\xfa\x38\x37\xc3\xbb\x77\x2e\xad\x0d\x71\xcf\x89\xa1\xa9\x92\x8b\x08\xdc\x53\x24\x2f\xba\x70\xec\x42\x62\x44\xe6\x9a\x3d\xcb\x56\x9b\x13\xcb\xcd\x68\xf0\xcb\xaa\x49\x2c\xa4\x8b\x89\xce\x20\x18\x70\xa7\x70\x6b\xf7\x9b\x00\x38\xe9\x0e\x76\x60\x1e\x8c\x13\x05\xe8\xf7\x7f\x87\x9b\xab\xef\xcc\x3c\x6b\x5f\x5d\x49\xe2\x4d\x81\x45\x55\x1c\x72\x9a\xa0\xdf\x1e\x9f\x19\x5b\xff\xf1\x96\x48\xda\x5d\x2b\xdb\x42\x55\xfe\xad\x3e\x9f\xe8\xa1\x6d\x47\x9f\x3e\x87\x78\xb6\xb2\x95\x90\xf0\x59\xb8\x99\x87\x3a\xe9\xa7\x9f\x75\xad\xf3\xaf\x72\x79\xf1\xeb\x6c\x59\x04\x75\x5b\xee\x06\xd0\xad\x1b\x0b\x29\x91\xd5\xa9\x75\x77\x45\x06\x6d\x98\x05\xf2\xe1\xb4\x10\xa5\x25\xb1\x71\xf8\x3b\x9f\x8c", 182, { 0xf9, 0x09, 0x7e, 0x4d, 0x5c, 0xff, 0x96, 0x06, 0x4c, 0x1d, 0x4f, 0xc2, 0x30, 0x7b, 0xf5, 0x37 }, { 0x26, 0x1e, 0xe2, 0xc5, 0xcc, 0xeb, 0xf7, 0x53, 0xdf, 0x51, 0x02, 0xf1, 0x04, 0x37, 0xa5, 0xee } }, { "\x10\xe6\xa4\x8b\x8d\x76\xa5\xb8\x0e\xd3\xed\x7c\x0e\x0a\xe6\xac\x2e\x88\x52\x7c\x13\x44\x47\xa1\xc6\x50\xd2\xc0\x28\x60\xf7\x17\xd8\x4f\x2c\x06\x6f\xa9\x78\xa1\xe4\xd4\x5c\xd7\x57\xd3\xff\x74\x9b\xf8\xab\xae\x5c\x33\xb8\x29\x0c\x5f\x82\x3e\xc4\x72\x0b\xcd\xff\x3f\xd9\x33\x85\xc2\x02\xe8\x8c\xdf\x71\xa6\xc4\x38\x3a\x09\x96\xb4\x5f\x39\x95\x97\x61\xae\xea\x37\x19\x01\x1b\x8f\xd0\x40\xb8\x68\x3b\x67\x33\x69\x61\xb2\xc0\x99\x33\x70\x9c\x12\x29\x11\x9e\xc1\x65\xf2\x09\xcd\xee\x7b\x73\xf0\x72\x3d\xe5\xb7\xdf\x78\x10\x6f\x7b\xe9\xe5\x1d\x04\x24\x13\x85\xb8\xea\x43\x90\xfa\x14\x7d\x3b\x79\x2d\x59\x9f\x6d\x9b\xcd\x4e\xf9\x32\x97\x1d\xb9\xa5\xd6\x6b\xda\xca\x77\x0d\xb1\x0f\x1e\x65\x1f\x34\xae\xff\xfb\xb0\x22\x96\xea\x57\x0f\x2a\x5d", 183, { 0x5f, 0x82, 0x74, 0x4c, 0x23, 0xc6, 0x83, 0xeb, 0x84, 0xeb, 0x54, 0xca, 0x8e, 0xb3, 0x00, 0x6c }, { 0x06, 0xb5, 0x89, 0xf3, 0x62, 0x3a, 0x3b, 0xdd, 0x24, 0xf3, 0xec, 0x3d, 0x53, 0x22, 0xd7, 0x7f } }, { "\x40\xff\xfd\xd5\xa9\x4a\xc1\x20\xf6\x79\x68\x9d\xde\x72\x0a\xeb\xe9\x5a\xc8\x24\xca\xc5\x40\x1b\x28\x78\x09\xe5\x72\x94\x7f\x35\x62\x7e\xf5\x01\xda\x6e\x55\xcd\x32\x86\x28\x4b\x36\xd5\xea\xa1\x12\x7d\x33\x7a\x27\x21\x8e\xb0\xf5\x78\xf5\xcb\xfb\x53\x80\x57\x1e\x51\x77\xed\x7e\x3f\x90\xcd\xb0\x9d\xa1\xd7\xd1\x8d\x03\x18\xa0\x9d\x77\x1a\x53\x8c\x15\xe4\x3d\x90\x2e\x06\x1e\x55\x0b\x6d\xfb\x74\x53\x95\x7a\x75\xcc\xd2\x8d\x4b\xdf\x8c\xee\x40\xb2\x1b\x81\x03\xc8\xfd\x8a\x1d\x55\x69\xfd\xa0\x46\x85\xb5\x28\xbe\x8a\x85\xd8\xd2\xf6\xb2\x68\x83\xf3\x1f\xff\x4a\x7b\xc6\xea\x13\x9f\x20\x13\x3f\x05\xa8\x46\xcf\xfa\xe6\x54\x7c\x25\xc0\x8a\x5b\xba\x0d\x24\xad\xb5\x07\x08\x5e\x66\xe7\xf9\xc4\xd8\x58\x53\xb4\x54\x6f\xbe\x21\xe6\x62\x54\x0c\x97", 184, { 0xac, 0xb0, 0x95, 0x37, 0x0c, 0x76, 0x7a, 0xe5, 0x1d, 0x9b, 0x11, 0x03, 0xe0, 0xb8, 0x1f, 0x9b }, { 0xb3, 0x3c, 0xe7, 0xcb, 0x36, 0x65, 0xa7, 0xbc, 0x84, 0x49, 0x30, 0x07, 0xdb, 0x72, 0xd6, 0x97 } }, { "\x36\x05\xc5\xba\x0a\x52\xd7\xd2\xb9\xaf\x10\x56\xf0\xe8\xfe\x75\x2f\x2b\xcb\x33\xbe\xca\xd6\x42\x5f\x07\x41\xd5\xa7\x0d\x97\x07\xad\xb7\xf1\x91\x07\xc3\x0a\xce\x01\x6f\x05\x23\xc1\xa0\x26\xc5\x83\xfb\xfc\x5b\x85\x84\x6f\xda\x42\x77\xc8\xa3\xbd\x92\x46\x60\xff\x0e\xb1\x36\x61\xf2\x18\x52\x60\x71\xec\x50\x59\x95\xbb\x31\x80\x4c\x38\x45\x98\x8a\x06\xf9\x74\xbe\x65\x1d\x5b\xfe\xfc\xb5\x51\x4d\x55\xfc\x51\xcf\x35\x6d\x7d\xa8\xf6\xa6\x45\xc2\x0e\x0f\xc2\x62\xab\x33\x7a\x55\x23\x81\x16\xc6\x35\x0d\x62\x5d\x73\x5f\x78\xd4\x5f\x1e\xf9\x10\xa8\x36\xa8\x55\x05\x67\x3a\x6a\xc9\x56\x40\x1e\xc7\x4b\xa7\xe0\x64\x69\x13\x04\xdc\xd6\x8f\x37\xd4\xfc\x38\x12\x1a\xe3\x29\xd5\x09\xd8\x4c\x9a\x31\xfe\x04\xef\x15\x4b\x46\x14\x90\xa8\xb3\x56\xaf\x77\xf3", 185, { 0x6b, 0x44, 0x43, 0x8f, 0x8d, 0x1a, 0x8c, 0xd8, 0xa3, 0x03, 0xed, 0x8d, 0xbe, 0xd5, 0x1e, 0xd8 }, { 0x7e, 0x40, 0x08, 0xa8, 0xab, 0xd2, 0x91, 0x2a, 0x67, 0xf7, 0x5b, 0xce, 0xd6, 0xf4, 0x15, 0x21 } }, { "\xbe\x88\xa9\xff\x60\x8e\x4a\x2c\xcf\xa3\x4e\x15\x34\x84\x4d\xa7\x89\x74\xdf\x70\x9d\x5e\x49\x77\xcd\xed\x32\x88\x37\x90\x00\x5e\x6d\x3f\x90\xa5\xd0\xc5\x52\xad\x8c\x16\x24\xd9\xb1\x73\x6d\xef\xdd\xe7\xd7\x34\xfc\x26\x70\xaf\x08\xa8\x0d\x14\x84\xa2\x4e\x1f\xd6\xf6\x6b\xea\x71\xd0\x73\x26\x6d\x13\xcf\xf5\xac\x10\x58\x18\x82\x68\x87\xdd\xee\xc9\x63\xea\x43\xb1\x8d\x7e\x4d\x2a\x71\x54\xdb\xad\xbe\xf2\x56\x45\xa6\x6a\x3a\xc2\x7c\x68\x0e\xd3\xe5\xf8\x85\x68\xc3\xca\x31\x2c\xaa\xd0\x53\x6d\xc1\xa4\x09\xc5\xa7\xeb\x31\x40\x42\x72\xe9\x6b\x24\x06\xa0\xe2\x1d\x5a\x1c\xba\xef\xe2\x8c\x62\x15\x0c\x2e\xa6\xbc\x4a\xe3\xdf\x40\xed\x43\xf3\x07\xf4\x71\xe4\x6f\x2d\x92\xd1\xba\x22\x03\x83\xf6\x45\x3e\x31\x6d\xc4\x9c\x88\xfd\xd2\x87\xc7\x6c\x0e\x3b\x08", 186, { 0xf8, 0x13, 0x87, 0x18, 0x1f, 0xf4, 0x7b, 0xbf, 0x3a, 0xa7, 0xa9, 0x56, 0xbd, 0x0f, 0xa3, 0x5b }, { 0xee, 0x93, 0xc8, 0x85, 0xf3, 0x3c, 0x44, 0x94, 0x94, 0x6e, 0xc2, 0x65, 0x70, 0xbe, 0xc1, 0xb9 } }, { "\x08\x2b\xda\xa2\x20\x8e\x5a\xbb\x48\xac\x5d\x93\xde\xb6\xef\x0d\xa4\xdf\x6a\x3e\x47\x08\xf1\x16\x00\x0e\xb7\x82\xc6\xf5\x2f\x40\xba\xa2\x5a\x5d\xce\x10\x0e\x0f\x1c\xc1\xba\x27\x79\x59\xd0\xee\xc3\xc7\x91\x2e\x19\xf1\xbd\x47\xde\x38\x64\x9a\x1b\xc1\x69\x95\xbb\x8e\x16\xf0\xee\x29\x1b\x5e\x1b\x42\x3e\x90\xea\x7b\x2f\x2c\x9c\xb2\x6f\xc0\x1f\x99\x6e\xa6\x2b\x7d\x95\x07\xc9\x94\x32\x48\xe4\x12\x2d\xd4\xcb\xcb\x73\x7a\x49\x23\x25\x31\x0e\x3c\xdb\xfd\xbb\x75\x5c\x32\x6a\x04\xb3\x58\x33\x63\xd3\x5f\x65\xfa\x2c\x87\xcd\x6e\xf2\x9d\x54\xe9\x12\x7d\x9a\x6b\x59\xe2\x08\x1e\x75\x70\xb9\xb5\xef\x8b\x05\x01\x1e\xbf\x44\x26\x0d\xd5\xb5\x4f\x9d\xef\x96\x94\x14\xb0\x5e\x9d\x9a\xcd\xb9\x9f\x74\x79\x9c\x34\xe6\x6d\x35\xf4\x3d\x21\x0a\x4e\xae\x33\x5e\x19\x20", 187, { 0x18, 0xa6, 0x43, 0x84, 0xfd, 0x90, 0x40, 0x32, 0x44, 0xe0, 0x6d, 0x93, 0x44, 0x62, 0x7d, 0xca }, { 0x3e, 0x6e, 0xb2, 0xa1, 0x56, 0x35, 0x7b, 0x53, 0xa2, 0x77, 0xc3, 0xa6, 0x0a, 0x08, 0xa3, 0x50 } }, { "\xa0\xdd\xcc\xaa\x2d\x33\x9c\xbb\xbb\x12\xd9\x0f\xa6\x5b\x6c\xba\x76\xec\xfa\x48\x6b\x34\x69\xf3\x6d\xb0\xa9\xa7\x71\x66\xbf\x26\xb5\xe7\xb7\x4e\xa0\x6a\x62\x67\x4a\x67\x8e\xc1\x3b\x8e\xa4\x47\xe7\xa4\x89\x51\x84\x7c\x1b\x1f\xd1\xda\x6d\xdb\xa7\x32\x28\xbc\x26\xe9\x33\xc3\xae\x76\x29\xd2\xab\x10\x27\xdc\xfe\x98\xc3\x99\x0a\x51\xa4\x14\xf6\x85\x98\x1a\x70\x7a\x6d\x3e\x2a\x56\x99\x1e\xf4\x6f\xd8\x57\xe3\xdd\x29\xe4\x64\xc6\x63\x78\x52\xdb\xaf\x5b\x3f\x58\x09\x79\xe2\xf4\x62\x7b\x65\x98\xec\x6d\x00\x6d\x6d\x08\x42\xf9\xe3\xee\xcf\x9a\x67\x34\x14\x3a\x2a\xdb\xba\x89\x54\x80\xfe\xe4\xb1\x22\x52\x48\xa2\xa2\xe0\xb2\x1b\x9f\xd5\x8a\x30\x4a\xc7\x13\x80\x88\x42\x20\x33\x53\x8f\xc3\x61\x8b\x40\x8c\x3f\x30\xbb\x06\x3c\xdb\x19\x58\x5f\xac\xf3\x05\x21\x90", 188, { 0x75, 0xfb, 0xa7, 0x68, 0xc9, 0x1f, 0x94, 0x6a, 0x46, 0x0e, 0x44, 0x55, 0xcb, 0x02, 0x06, 0xd0 }, { 0xc3, 0xb2, 0xe9, 0xc3, 0x62, 0x7d, 0x07, 0x5c, 0x83, 0x48, 0x28, 0x0e, 0xb0, 0xe4, 0xa8, 0xf7 } }, { "\x2f\xfb\x70\x10\x92\x05\x78\x0d\x56\xd8\xcc\x29\x51\x19\x32\x9c\x3a\xf4\x39\x39\x18\x08\xe5\xc6\x65\x1a\xfa\x8c\xf6\x7f\x8c\x3c\x75\xa0\x82\x46\x37\x1a\xff\x4c\xd6\xf6\xde\xe1\xcb\x34\xd9\xac\xdb\x8a\xa2\x9a\x4a\xd4\x43\x52\x4a\xf2\x7d\xe1\xb5\x8b\xdc\x7e\xd9\x5e\x7a\xce\x2b\x11\xc5\xc6\x4f\x2c\x8e\x13\x84\x9e\x26\x91\x7a\xf6\x91\x37\x5d\x9e\xfc\xc5\x39\x15\x35\x1b\xc4\x16\x97\x47\xfd\xdd\x7d\x6e\xdc\x1d\x67\x49\xf7\x5a\x5d\x84\x04\x89\x29\x8d\x41\x22\x64\x97\xfa\xef\x4f\xca\x55\x0e\x6c\x3f\x11\x8f\x92\xd7\x33\x90\x8e\x23\x8b\xfc\x57\xb7\x0a\x2a\x48\xa3\xb9\x74\x84\xb7\x6a\x44\xba\x5e\x23\x26\x5a\xda\x86\x57\x75\x82\x3e\xd2\x65\x26\xe3\xd3\xa4\x5d\x3b\x06\x55\x01\xfd\x86\xb2\xf8\xb3\xc9\x0f\xa4\x8e\xa9\xf5\x2a\x52\x7e\xbf\xee\x8c\xd5\x1e\x23\xa1", 189, { 0xa8, 0x61, 0x1d, 0x22, 0x24, 0x3c, 0xf4, 0x02, 0x57, 0xa0, 0xc2, 0x42, 0x9b, 0x88, 0x7a, 0x8c }, { 0x31, 0x27, 0x83, 0xbf, 0xd3, 0xa8, 0x2e, 0x2a, 0x04, 0x01, 0x04, 0x5a, 0xa4, 0xd3, 0x35, 0x5d } }, { "\x0c\xda\x0d\x99\xfb\xb1\x12\x3e\x42\x3a\xe1\xf2\x86\x58\xbc\x72\x11\x15\x17\x05\x5e\x1e\x03\x19\xda\x5b\x47\x11\x45\x79\xc2\x21\xe0\x88\xed\x0d\xfe\x9c\x07\xa9\xa0\x31\xc6\x92\xfc\x26\xb1\x27\xcf\x03\x83\xb0\x58\xd7\xa0\x2b\x26\x2d\x5e\x5a\x44\x01\x3d\xec\x61\xef\xab\x7d\xc0\xa4\xe4\x69\x69\xaf\xba\xb0\x7e\x64\xb0\x9a\xe1\x62\x20\xfa\xc8\xce\x5b\x5a\x06\x10\x95\xf2\xe8\x7a\xbc\xb2\x58\xb7\xe8\x2e\x7a\xb1\x3e\x35\x7e\x3b\x69\x16\x4c\xea\xac\x07\x77\xec\x0f\xc1\x33\x58\x26\x96\x6a\xbc\x77\xae\x2e\xbf\x8e\xaf\x56\x93\x92\x68\x95\x01\x33\xf0\x14\x7b\xe1\xc9\x75\xa0\xd7\xd5\xa6\xdd\x0c\x17\xa6\xae\x5f\xdc\x5d\x20\xaf\xc5\x38\x27\xdc\xc1\xcf\xe2\x9c\xf2\x08\x85\xd3\x3b\xf4\x5f\x02\x45\x8e\x56\x3a\x08\x13\xee\x02\xfc\x43\x0c\xf6\xb5\x6d\xf5\xb3\x66\x7f\x42", 190, { 0x4e, 0xb4, 0xdf, 0x63, 0x22, 0x7a, 0xfd, 0x00, 0x26, 0x6e, 0xe6, 0x88, 0x36, 0x1e, 0xc5, 0xbd }, { 0x6e, 0xaa, 0x7f, 0x80, 0x5e, 0xc9, 0xb2, 0xa4, 0xa2, 0xa9, 0x3d, 0xda, 0xef, 0xf5, 0xd2, 0x87 } }, { "\xea\x51\x19\x4d\x2e\xbd\x65\x42\xaa\x7c\xb4\x8a\xe1\x12\xf9\x85\x8b\x4c\x8b\x59\xe3\x59\x01\x06\xa6\x08\xb7\x19\xe7\xd0\x4d\x99\x57\x81\xcf\x1b\x1f\xcb\xf9\xfb\xca\xae\xac\x42\xb6\xc8\x48\x70\xb3\xb5\x90\x64\xa7\xc2\xcb\x07\x05\x10\xd7\x9f\x3d\x82\xe9\xfb\x3f\xfa\x72\xfb\x0b\xcf\x97\xa3\xb2\x03\x15\xd9\x3c\xd6\x79\xb6\xf4\x79\x5b\x4c\xf0\x65\x12\x26\x6a\x61\x5e\xe7\xf8\xf8\x13\x89\x62\x39\xc8\xaf\xec\x5b\x23\x64\x6a\xc5\x3d\x96\xe9\x0a\xd1\xd8\x99\x3b\xa4\x5a\x80\xe8\xc3\x6a\xc7\x6c\x92\xaa\x9b\x29\xfb\x5d\x8a\x04\x65\x8d\xb6\x92\x8a\x1e\xd0\xa6\x2d\x66\xaf\x75\xa7\x5c\xa0\xe6\x15\x43\xf5\xc6\x12\x0d\x3e\x47\x14\x60\x0f\x3f\x4f\x80\xe1\xe9\x56\x34\xaf\x8f\x95\xae\xcc\xa2\x6d\x48\x0b\x2a\x6c\x16\x5b\x24\x96\x21\xa8\x6d\xbd\x96\x6d\xd6\xae\x39\x29\x47\x10", 191, { 0x29, 0x9f, 0x78, 0xf5, 0xa7, 0xf7, 0x64, 0x83, 0x92, 0xee, 0x92, 0xda, 0xec, 0x0f, 0x30, 0xcd }, { 0x2a, 0xa4, 0x7a, 0x69, 0x06, 0xe8, 0xe5, 0xd9, 0xb0, 0x00, 0x0b, 0xf3, 0xb5, 0xa7, 0x96, 0x65 } }, { "\x6d\x36\x33\xff\x43\x8f\xc1\x11\x30\x26\xa9\x35\x77\x6a\x4e\x3b\xb5\xb5\xdf\xe2\x75\x2d\xc8\x15\xe1\x88\xa1\x88\x7e\x65\xc9\xa2\x29\x6c\x48\x4b\xc4\xa3\xd3\x93\x21\xce\x4f\x08\x97\x79\xa8\x4a\x96\x1c\x1c\x2e\x6b\x20\xe8\x6d\x9f\x1d\xce\x12\x59\x6a\xb9\x44\x27\xd7\x1c\x7a\x50\xce\x43\x5f\xf6\x90\x5a\x40\xec\x96\x60\x1f\xd9\x51\x10\xf2\xcc\x80\xcc\x25\x76\x55\x44\x47\xad\xbc\xfb\xaa\x5e\x48\x76\x52\x70\xcd\x4d\xd3\xd5\x07\x2f\x30\xa8\x12\xb3\xeb\xdb\x7b\x45\x75\x6d\xc0\x0e\x02\x55\xc3\x10\x3d\xf8\x42\x2d\xee\x65\xeb\x0d\x25\x7f\x35\xa6\x96\xbd\x9c\xbb\x2c\x3c\x92\x59\x38\x64\xe4\xa6\x18\x1f\x66\xf0\x0f\x86\xcc\x0c\x22\x25\x9e\x6d\xcd\x08\xf3\xb7\x55\x36\xfa\x4b\x74\xd8\xca\x4b\x08\x33\x2c\xb6\xe4\xcb\x72\x52\x21\xee\x56\xd9\x1b\xe5\xba\xa1\xc3\xc2\x76\xa6\x9c", 192, { 0x42, 0x51, 0xce, 0x9e, 0x2d, 0xe1, 0xd9, 0x05, 0x29, 0x87, 0x3d, 0x33, 0x2e, 0xaa, 0x25, 0x82 }, { 0x19, 0x3d, 0xd0, 0x55, 0x95, 0xe1, 0xd6, 0x77, 0x57, 0xba, 0xc6, 0xc0, 0x3d, 0x4b, 0x62, 0x7e } }, { "\x85\xbc\x59\x29\x3c\x94\x07\x16\x2b\x16\x39\xe0\xc8\x83\x36\xed\xad\x53\xc9\x36\xc9\x2b\x33\x26\x84\xa3\xd4\x3a\x2b\xad\xc1\xdb\x21\xad\xf8\x32\x94\x1d\x4a\x3e\x03\xf6\x10\x2b\xa1\x74\x06\x2e\xd3\x22\xcc\x2c\x10\x09\x86\x3a\x6a\x55\x94\x9a\x59\x3b\xf0\xa9\x1f\x0a\x5d\xfd\x93\x5b\x98\xde\x87\x7b\x9f\x86\x03\xc8\x17\x20\x20\xd9\x73\x2b\x56\x90\x55\x4f\x05\x85\xfe\xbe\xf4\x62\xbb\xad\xb5\xe5\xf7\x69\xba\x83\xd3\xeb\x4e\x0a\xfb\x2f\xda\x00\x03\x51\x9c\x87\x9f\x10\x0c\x66\xaf\x8f\xd4\xd4\xc3\x36\x89\x15\x36\x64\x24\xa3\x54\xd1\xdf\xb9\x15\xf2\xc8\x06\xe9\x97\x08\x4f\x57\xc5\x3f\x60\x04\x3d\x0d\xd4\xcb\x2f\x5d\x8b\xd6\x34\x41\x1b\xa1\x76\xa8\x09\x0a\x14\x85\x2a\x88\x6d\x14\x0b\xd1\x0e\xf1\x02\x6a\x7e\x21\xda\xb1\x15\xdb\x7a\x85\xd9\xae\x8b\xdd\x5c\x78\x2d\x28\x15\x88", 193, { 0x37, 0xeb, 0xe3, 0x8d, 0xa8, 0x48, 0xc4, 0xb0, 0x72, 0x7e, 0xaa, 0x09, 0xc3, 0x96, 0x5a, 0x34 }, { 0xd7, 0xec, 0xc2, 0x5a, 0xf6, 0xe9, 0xb4, 0x41, 0x4b, 0x91, 0x4f, 0x4d, 0xe5, 0x53, 0x87, 0x79 } }, { "\xe2\x4e\x37\x3e\x00\xae\xe2\xc5\x00\x60\xf1\x4a\x20\xdf\x81\x57\xbe\x33\x08\xba\xed\x20\x2f\x87\x71\xb6\x3b\xc6\x65\xd9\xce\xda\x70\x1a\x4e\xcf\x2d\x3e\xaf\xb5\x5a\x11\x7d\xc3\x7f\x1e\x43\x27\x96\xc7\x3a\xc1\x83\xbf\x45\xff\xfc\x6b\x34\x60\xaa\x84\x28\x0b\x97\x9c\x2d\x53\xb6\x2a\x72\xa6\x01\xdf\xde\xa0\x68\xf0\x9d\x0b\x29\xe7\x18\x49\xa6\x51\x41\xac\x30\xe2\x28\xa6\x15\x81\xfb\x5a\xad\x80\xcc\x08\x76\xcd\x40\xf9\xb2\x22\xcb\x53\x56\x06\x8e\xf8\x1a\x54\xcd\x49\xd7\x49\x8c\xd0\x7b\x8a\xde\xa4\x5b\x98\x7b\x37\xeb\xa7\xd8\x5f\xb6\x8c\x32\x1d\xa8\x81\x68\xf6\xda\xa5\xcf\xf0\x6e\x73\xcb\x1b\x22\x4d\x4d\x75\x19\xf6\x90\x35\x67\x27\xfe\xf0\xb4\x53\x89\x29\x38\x90\x21\x30\xc6\x81\x8b\x6c\x42\xfb\x93\x5e\x53\x54\xe9\xcf\x78\x92\x11\xcd\x74\x5a\x2b\x07\x7b\x59\x47\x81\x86\x5a", 194, { 0x08, 0x65, 0x16, 0x91, 0xd7, 0x38, 0x80, 0xb9, 0x09, 0x33, 0xa5, 0x98, 0x2b, 0x0a, 0xa0, 0x83 }, { 0x5e, 0x7b, 0x6c, 0x0f, 0x28, 0x94, 0x7b, 0xd1, 0x16, 0xf8, 0x03, 0xc0, 0x83, 0xfa, 0x91, 0xb8 } }, { "\xea\x93\x50\xaa\x78\xb4\xe2\x0d\xc1\xd9\x5f\xc0\x9e\xa5\x87\x55\xfa\xe1\x32\xf7\xb5\xb9\x93\x9e\xb3\xd8\xbb\xe9\x64\x8a\xd3\x0b\xd0\x99\x28\xea\x35\x80\x6b\x48\xe3\x93\x54\x12\xfc\xba\xca\x88\x6d\x73\x34\x83\xed\x01\x68\x4a\xf3\xe3\x90\x3e\x11\xe0\xef\x2e\x3f\x5b\x1b\x3e\x5d\x66\xed\x02\xd8\x3b\x5f\xe1\xcf\x43\x16\x61\x05\xa0\xf2\x30\xc7\xa2\xf5\x7a\x18\xb7\xf2\x50\x4c\xcd\x29\x4b\xe3\x0a\x33\x51\x8e\x96\xac\x4b\xdc\xda\xb0\xe3\xb1\xe4\x4f\x02\x28\x5f\xdc\x3d\xdb\x4b\x3c\x0f\x6c\x08\xed\x26\x5b\x9c\x1a\xa2\x6f\xa0\x64\x2b\x2c\x71\x05\x83\x35\x90\x68\x3d\x3d\xfd\x93\xb2\x15\x8f\xa9\x26\x15\x9b\xd0\xf5\x3d\x9e\x93\x8d\x69\xde\xfc\x97\x78\x53\x35\x44\xeb\x74\x1c\x9c\x06\x50\xae\x19\x6a\x7c\xfe\x7d\x74\x92\xb0\x37\xc0\x7e\x4f\xc4\xcd\x4c\xa1\x45\x77\x5e\x7b\x72\x25\xb9\x58", 195, { 0x5a, 0x4f, 0x38, 0x95, 0x0d, 0x88, 0x6b, 0x1a, 0xf5, 0x7a, 0xf3, 0x52, 0x4d, 0x62, 0x5d, 0xbc }, { 0x44, 0x75, 0x8f, 0x73, 0x1a, 0xd9, 0xd0, 0xe7, 0xf6, 0x95, 0x2a, 0xba, 0xa4, 0x64, 0x00, 0xfb } }, { "\xc4\x68\xd2\x70\xda\x43\x98\xb5\x60\x3c\xe5\x59\xb2\xe7\x7e\x6f\x30\x4a\x7b\x90\x6b\x6d\x31\xbf\xec\xf1\xce\x30\xd4\xbf\x3d\x2c\x1c\x60\xbe\xbf\x4f\x14\x2a\xd9\x5a\xbd\x76\xd0\x19\x16\x9c\x0f\x4e\x71\xb3\x29\xfd\x8e\xf0\xc8\xdd\xeb\xdf\x48\x9d\x42\x0f\x6d\x96\xa2\xc2\xa4\xf0\xe1\xf0\xfb\x90\xd4\x29\xea\x21\x90\x73\x2c\xa0\x2e\x3e\x2b\xe0\x01\x1a\xcd\xc8\xfe\x9d\x7f\x94\x2a\x82\xda\x7b\x72\x00\xdb\x75\xbe\xf1\xf7\xac\xe9\xdc\x23\x5a\xdc\x1e\x17\x25\x5a\x29\xbf\x9d\xa3\xeb\xe3\xc4\xaa\xaf\x42\x90\x82\x7f\x6a\xb2\xed\xff\x6a\xf4\x36\xb8\x07\x01\x2d\x22\xa4\xcc\x9f\x38\xdf\xe2\xbf\x3a\x7e\x42\xe2\x71\xc2\x76\xab\xa9\x76\xd0\x56\xd5\xe3\x0f\xd4\x83\x5d\x3d\xec\x29\x08\xb0\x1c\x00\xf1\x48\x73\xfa\x26\xa7\x65\x1d\x24\x0a\x70\xdc\x93\xcf\xd2\x90\x0d\xf6\xd5\x1b\xf9\x65\x76\x7a\x61", 196, { 0xb9, 0x72, 0x9a, 0xd8, 0x89, 0x81, 0xf8, 0x5b, 0x74, 0x3b, 0xb5, 0x46, 0xc6, 0xd9, 0x7b, 0xdd }, { 0x51, 0x03, 0xa4, 0x00, 0x14, 0x89, 0xba, 0xf4, 0xb4, 0xf5, 0x94, 0x9b, 0x7c, 0x41, 0x1e, 0xdf } }, { "\xd2\xd2\xf5\xb7\xc8\xcf\x44\xe1\x60\xb7\xd0\x69\x9d\x1a\x4b\xff\x27\x8f\xbf\x93\x93\x87\x95\x06\x19\x71\xdb\xb5\xf7\x1c\x0e\x72\x6a\x8b\x9b\xa5\x13\xba\x8f\xf7\xa5\x3b\xa1\x87\x07\x0a\xba\x10\x89\xa1\x4b\x13\x80\x2d\x57\x34\x3f\x02\xa0\xda\x70\xfc\x02\xf5\x9f\x1f\x55\x4c\xa1\x42\xa1\x44\x19\xda\x84\x2e\x52\x0a\xe3\x11\xca\xea\xa6\x86\x34\xe2\x90\xae\xd6\xb9\xc4\xf7\x86\x0a\xe4\x91\x18\xb9\x5c\x96\x9f\xb6\xb4\x72\x9a\xc5\xef\x77\x33\x0c\x13\x99\x7f\xa8\x88\x2d\xc4\x44\x16\xc8\x37\x8f\xde\x55\x27\x27\x25\x94\xc3\x6a\xd8\x9c\x3d\x45\x95\x1e\x91\x8b\xc6\x58\xc4\xf3\xb9\x94\x98\x72\x5e\x19\xee\x2e\xf5\x0b\x6c\x6f\xe9\xe1\x1d\x84\x8d\x62\x24\xeb\x19\x7d\xbc\x82\x39\x10\xa1\x46\xef\xd0\x55\x0b\x15\x1b\xa2\xf5\xd7\xda\xa2\x8d\x6f\x14\x03\xa9\xc1\x9a\x40\x21\x69\x82\xd7\x3d\x1b\xe2\xe1", 197, { 0xf1, 0x97, 0x2e, 0x6a, 0x32, 0xf8, 0x2d, 0x2d, 0xcb, 0x93, 0xe4, 0x8e, 0xe3, 0x97, 0x74, 0x3b }, { 0xa9, 0x9a, 0x1f, 0x50, 0x09, 0x79, 0x40, 0xb2, 0xc2, 0x97, 0x20, 0x94, 0x7c, 0xb5, 0xea, 0xfa } }, { "\x37\x8a\xfd\x45\x7b\x03\x1d\x54\x4c\xeb\x1f\x55\xbc\x7b\x04\xb0\x05\x84\xca\x39\x65\xce\x1a\x2a\xf6\x3f\xd3\xda\x43\x30\x18\x8b\x4c\x2d\x6a\xa0\x34\x39\x81\xce\x67\x56\x84\xf5\x01\x31\x3c\xcf\x11\x58\x6f\xe9\xc5\xae\x08\xce\x5f\x7c\xda\x9e\xf1\xbb\x3c\xa7\x47\x6c\x9e\x2a\xd2\x1d\x86\xe5\x6f\x4b\x51\xc5\xca\xf0\xb8\xc8\xdc\x03\x8b\x9b\x7c\x5f\x1e\xfe\x3b\xb9\xe7\xd5\xd3\xb8\xe2\x67\x00\x9a\x3a\xa0\x59\xad\xd8\xa3\xaf\xcf\x7f\x18\x7c\xb0\x8b\x26\xd2\x8f\xcd\xc3\x69\x10\xe7\xae\xc8\x06\xaa\x6b\xc1\xa5\xfb\x91\x8d\x39\x7a\x81\xcd\xff\x9e\xef\x2d\x27\x8c\x6d\x94\x1d\xb9\xa3\x2d\xf4\xb0\xd8\xaf\x9f\x7e\x5c\x2a\x50\xfa\x3d\x38\x5b\x4f\xa8\xd2\xb1\xf9\xc6\x38\x55\xfb\x09\xa4\x25\x2b\x72\xff\x4e\xcc\x6d\xa3\x5d\x05\xef\x33\x6d\x23\x1e\x27\x8a\x37\xdd\x35\xf2\x62\x4a\x10\x4c\x59\xc6\x90\x24", 198, { 0x38, 0xe3, 0xd4, 0xaa, 0xa8, 0xa0, 0xf7, 0x13, 0x79, 0x0b, 0x0c, 0x9e, 0x5c, 0x30, 0x12, 0x6f }, { 0xe0, 0xd3, 0xb6, 0xd6, 0x95, 0x5c, 0x5e, 0x9a, 0x2f, 0x6a, 0x9d, 0x39, 0xb0, 0x86, 0x61, 0x3d } }, { "\x84\xcb\xb0\xce\xf3\x5b\x21\x86\x2e\x4c\x6a\xb1\xcd\x89\x29\xeb\x9f\xf0\xd9\x6d\xb5\xf6\xed\x71\x51\xe0\xc6\x99\x4a\x14\xd8\xb1\x3a\x94\x46\x50\x4c\x43\x5f\x80\x91\x04\xf9\x5a\xf8\xbc\xe3\xb5\x79\xdf\xec\xe4\xa6\xf5\x98\xaf\x77\x68\x3a\x71\x0b\x41\x5e\xb8\x3a\x1e\xae\x0c\xbf\x4f\x6c\x80\x15\x20\x26\x79\x42\xb0\x20\x07\x95\x8e\x52\xc6\xd0\x81\x13\x01\xf0\xfa\xc2\x1e\x89\x34\xd6\x7d\xb5\x40\x31\xfc\x6a\x2a\x1b\xd6\x91\x89\xca\xda\x87\x25\x9a\x9a\xa4\x71\x99\xc8\x57\x9e\x4e\xcf\x23\x2c\x0f\xd6\x33\x5a\x41\x40\xdf\xbb\x8b\x90\x7a\x0b\x4e\xf5\x89\x12\x81\xf3\x91\xa1\xc8\x13\xdf\x8b\x05\x87\x82\x15\x14\x2e\xb8\xeb\x78\x28\x0f\xdb\x54\x10\x70\x83\x58\x73\x8d\x96\xf0\xdb\x0e\x85\x0c\x7e\x75\xd4\x4d\xe0\x79\x09\xa3\x7d\x93\x86\x1d\xae\x5f\xe4\x8d\x4e\xbf\x63\xd9\x1d\x56\x13\x44\x50\x7f\x11\x0c", 199, { 0x98, 0xb8, 0x13, 0x7f, 0x5e, 0x13, 0xaf, 0xbe, 0x6e, 0xd4, 0xee, 0x6a, 0x8e, 0x57, 0x57, 0x3e }, { 0x0d, 0x64, 0x90, 0x5e, 0x58, 0xbf, 0x47, 0xd0, 0x27, 0x9f, 0xa9, 0x41, 0x6e, 0x67, 0x2b, 0xbd } }, { "\x17\x68\xf3\xb8\x3f\xcc\x90\x0e\xfb\xa8\xf8\xa8\xa8\x9d\x4a\x4f\x02\x68\xd5\x19\x42\xe0\xf5\xf6\x5c\xb7\xb4\x21\x7d\x44\xff\xcb\x1d\xbb\x5e\xa6\x3d\x99\xea\x64\xf3\x43\x86\x5e\x2f\x9a\xb3\x70\x4f\xcb\x5a\x7a\x82\xe0\x13\xc1\xb6\x04\xfd\x84\x08\x3c\xe7\x66\x1c\x91\x15\x8b\x9f\x54\x58\x07\x16\xa2\x36\xc8\xbb\x96\xc5\xb0\xeb\xd3\x93\x64\x9b\xae\xfd\xc4\xab\xbf\xa6\xca\x07\xdd\x3e\xd9\x64\xc9\xf2\xee\x75\xaf\xac\x54\xe0\xe9\x57\xe3\x3b\xe6\x97\x44\x3e\xe6\x70\xa4\x8a\xc1\x9f\x18\xfc\x48\x60\xb1\x2d\x69\x6e\x81\x4f\x27\xb6\xef\xc6\x09\xbb\xe1\xf0\x0d\x49\x64\x8b\x5b\x73\x91\x69\x45\x02\xc2\x46\xa2\x90\x61\x3c\x6b\x0f\xb3\x49\x92\xf8\x7b\xec\x9a\x9c\x01\x9a\x29\x05\x29\x74\x44\x27\x74\x2c\x1b\xe1\x26\xc0\xb4\xd7\xc2\xc3\x46\xf9\xfa\x76\x27\xde\x2a\xfe\x5d\x21\x8c\x33\xa4\xd7\x6a\xac\x01\x96\x20", 200, { 0x63, 0x22, 0x84, 0xb1, 0x76, 0xf7, 0x2a, 0x21, 0xbf, 0x19, 0x9c, 0x78, 0x67, 0x0a, 0x5a, 0xdd }, { 0x5a, 0x41, 0x08, 0x8b, 0xf2, 0xb6, 0x95, 0x54, 0xd4, 0x13, 0xec, 0x08, 0x7e, 0xdb, 0xfc, 0x0c } }, { "\x2e\x6d\xc4\x9c\x49\xae\xa1\x88\x44\x2c\x44\xb6\x4f\x77\x3e\x1e\x62\xc0\xaf\xf9\x23\xc0\x39\x94\x6a\xb2\xb5\xe8\x0f\x0f\xf2\x50\x5e\x59\x24\xdf\xa4\xcf\x66\x34\x30\x80\x88\x6a\xfc\xb4\x96\xe6\x00\x24\xf9\x4b\x82\xb6\x82\x3a\x97\x3f\x45\x3d\xd4\x4d\x5a\xb2\xf8\x81\xd8\xcd\x2f\x69\xb0\xdd\x5d\x4d\xd1\xba\xa5\x70\xe5\x81\xd2\x53\x83\x74\xff\x41\x19\x3b\x46\xda\x75\x72\x0c\x1d\xa3\xe1\xce\x50\x6a\xe5\xbe\x7e\xc4\xb2\x77\x10\x13\x30\x0d\x91\x6d\x04\xc2\x06\xbb\x2b\xe7\x7f\x9a\xf3\xf5\x5d\x09\xbf\x95\xa6\xeb\xa5\x04\x71\xa3\xb2\x51\xcd\xaa\x50\xc6\x41\x5d\x92\x4d\x85\xc9\xe5\x27\x68\x09\x2d\xec\x7f\x68\xce\xbf\xd7\x9f\x30\x06\x17\x80\x27\x65\xf8\xdc\x33\x21\x67\xfe\x8f\x77\x98\x04\x86\x0b\xfd\xb1\x1c\xb7\xbb\xe2\xca\x72\x5f\xb0\x68\xf4\xe0\x4f\xe5\xef\xda\x41\x53\x32\xfb\x81\xa1\x1e\x6b\x3c\x00\x8c", 201, { 0xf9, 0xc3, 0x72, 0x25, 0xad, 0x1a, 0x74, 0xee, 0x02, 0x62, 0x2b, 0x32, 0xf8, 0x47, 0xe6, 0x45 }, { 0x89, 0x6b, 0xe3, 0xe6, 0x9f, 0x13, 0x33, 0x47, 0xb4, 0x8b, 0xc7, 0x83, 0x03, 0x78, 0xd8, 0xcb } }, { "\x49\xea\x4a\x66\x71\xda\x95\x21\xc2\x06\x01\x08\x71\x96\x1e\xe7\xa1\x0a\xbe\xb1\xfe\x08\x48\x4c\xb3\x76\x07\xb0\x0f\x8d\x76\x58\xa3\xc4\x84\x3b\xcc\x5c\x16\x27\xca\x1d\x67\x51\x78\x98\x31\x0c\xcb\x71\x66\xbb\x19\xfb\x48\xb0\xb5\x0f\x48\xff\x36\xf3\x42\x9d\x0a\x62\x5f\x03\x01\x56\xf1\xa5\x69\x21\x5f\xeb\x89\xe6\xb7\x64\xb3\x68\x94\x77\x65\x78\x40\x59\xcd\xbc\xd6\x79\xc6\x1d\x3b\x75\x35\x87\x40\xf7\x2a\x8e\x6b\x81\x5c\x3a\xfe\xab\x64\x75\x4a\x57\x22\x92\xd3\xfe\x43\xfa\xaf\x50\xec\x3f\x65\xe6\x94\x72\x05\xf3\x48\xe3\x2e\x12\x3c\x89\x43\xc6\x4d\xee\x04\x9f\x94\xe4\x63\x06\xfb\x2d\x6a\x71\xfd\x98\x82\xa1\x84\xb4\xa9\xe5\x49\x29\x6d\xfa\x65\xd4\xae\x6b\xe2\x0b\xa0\x88\xb2\xcc\xff\x21\x32\x33\x6a\x62\x52\x20\x69\x4c\x76\xf9\x48\xc9\x40\x06\xdd\x5b\xb3\x7d\xa5\x8c\xcc\x86\x8c\x82\xc6\x44\x5f\xb3\xaa\xae", 202, { 0xba, 0xf3, 0x61, 0xa1, 0xf3, 0xab, 0x0b, 0x15, 0xd3, 0x10, 0xd4, 0x86, 0x66, 0xdd, 0x3c, 0x28 }, { 0x6a, 0x00, 0x68, 0x5d, 0xdd, 0x9c, 0xa6, 0x57, 0x1b, 0x5d, 0xf0, 0xe7, 0x71, 0xce, 0x24, 0x51 } }, { "\xe4\xf5\xab\x8d\x30\x7f\x21\x4e\x17\xd4\x23\x53\x27\xac\x84\x95\x85\xdf\xbe\x94\xc7\x55\x44\x17\xfd\xfe\xb1\x85\xf8\xc5\xe9\xc8\x14\xf2\x0f\x66\x96\x11\x6a\x33\x3f\x32\x28\x16\x76\x15\xeb\x7b\x74\x76\xb9\xef\xb7\x7a\xff\x5b\x21\x90\x79\xb4\x0e\xf6\x5b\x90\xfd\xc7\x10\xba\xed\x84\x14\x0d\x74\x53\xf7\x5a\x66\x55\x42\xf3\x32\xff\x67\x9f\xcc\x0f\x77\xd0\x4e\x39\x5d\xa1\xce\x93\x02\xe3\xd3\x01\xa8\x95\x2d\x99\x05\xd0\x10\x80\x42\x9c\x30\xf4\x78\xb7\xf4\x34\x45\x00\x65\x4e\x31\x8d\xae\x50\x0b\xb5\x58\x7d\xef\x94\x7d\x6f\xe3\x6e\x55\x95\xbe\xa6\x8a\x28\xda\x5d\x1b\xa8\xa2\xee\x4a\x16\xf7\x60\xfd\x33\x11\x2c\x90\x1f\x8a\x58\x59\xae\x48\x01\xd1\xef\x78\xfa\x73\x28\xd8\x07\x9c\x7f\x7a\xe7\x3f\xee\xa4\xc3\x5e\x9c\x8b\xab\xa2\xdf\xb3\x44\x1d\xdf\xc1\x43\x97\x27\x0a\x16\x99\x24\xd0\xd5\x97\xd9\xb5\x4a\xd3\x36\x55", 203, { 0xe6, 0x5b, 0x6e, 0xf1, 0x9d, 0x3c, 0xc1, 0x30, 0x38, 0x06, 0xb5, 0xf1, 0x54, 0x82, 0x5b, 0x40 }, { 0xc0, 0x79, 0x73, 0x7c, 0x18, 0x02, 0x9d, 0xbe, 0x0e, 0xc8, 0x6a, 0x9c, 0x4e, 0xce, 0xf7, 0x75 } }, { "\x64\x44\x4f\xc1\xa7\x3e\x86\x6f\x3a\x50\x83\x47\x2e\xb3\x64\xb0\x1e\x58\x80\x46\x3b\xf7\x10\x59\x89\x99\x6d\x77\x1f\xe9\x1a\xc8\x29\x04\xd7\xee\x8b\x30\x10\x11\xaa\x24\x5b\x13\xc9\x61\x8f\x0c\x8a\xe6\x62\x47\x29\x12\xa2\xa8\x44\x24\x94\x9e\x66\x3b\xea\x19\x03\x18\x29\xb5\x43\x05\xb0\x1d\xca\x21\x9f\xaa\x4c\xf6\xf1\x21\x90\x40\x77\x13\xeb\x9e\x09\x39\x4d\x41\xec\xee\x85\x0d\x8d\x1e\x86\x54\x64\x3a\xc8\x1d\xa8\x41\x61\x65\x89\x48\xe6\x96\xb8\xa8\x22\x19\x99\xb1\x39\x35\xad\x6a\x6a\x1a\x3d\xb9\x02\x0a\x8f\x80\xbc\x7c\x64\x9e\xe0\xfa\xde\x4c\x91\x01\x84\xf8\x64\x4c\xcb\xd3\xb2\x19\x35\xfb\x33\x6c\x2e\x03\x0b\x17\x40\x76\x48\x84\x51\xdc\x73\x3f\x1a\x7a\x66\x27\xeb\xa9\x00\x35\x5d\x74\x42\x15\xe7\x0d\xe3\x6b\xa2\x68\xf8\xbb\x22\x6e\xe2\xad\xad\x20\xca\xaf\xdf\x17\x1b\xbf\x2a\x5b\xd4\x42\x9d\x58\x9d\xb2\xc9\x0f", 204, { 0x77, 0xaf, 0xa3, 0x2a, 0xa3, 0xf8, 0x43, 0x33, 0x01, 0x16, 0x2d, 0xbb, 0x1d, 0x02, 0x88, 0xde }, { 0x5b, 0x7b, 0xae, 0xd9, 0x2b, 0xe0, 0x42, 0x4a, 0x4b, 0xf0, 0x0a, 0x1e, 0x70, 0x81, 0x23, 0x72 } }, { "\x19\xd3\xf2\x71\xef\x75\x77\xae\xe5\xfc\xbb\xbf\xbb\x01\xd1\xa0\x48\x51\x59\xb4\xc5\x6b\xa4\xdc\x07\x43\x56\xef\x78\xfc\x28\x80\x48\x56\xa0\xd0\xec\x30\x7c\x99\xf7\xc6\x53\x3f\x25\x87\x88\x9b\x34\xc8\x24\xf2\xdf\xd6\x9b\x43\x77\x2f\xd2\x2d\x2b\xc1\xcd\xe2\xeb\x8e\x0f\x34\xbf\xf3\x47\x23\xaa\x73\x2a\x9a\xe4\xfb\x8f\xd4\xf7\xb8\xae\x78\xd0\xe6\x93\xb9\xe4\xe9\x0f\x93\x28\x4c\x26\x31\x70\x00\xc7\x13\x42\x4b\x51\xb1\xd9\x3d\xb4\x4f\x98\x6c\xd4\xaa\xd1\xca\x68\x21\x63\xad\x2a\xa6\x0a\x58\x76\xaa\xf1\x74\x13\x4e\xfb\x58\x86\xa8\x7a\x29\x5d\x6a\x09\xd1\xab\xf7\x6b\x38\x0a\x3d\x30\xcb\xe7\x23\xc0\x59\x3f\xcd\xe7\x85\xcd\xb6\xdd\x47\x78\xc7\x44\x7c\x66\xa6\x7f\x6a\xfe\x90\x50\xda\x25\xad\x12\x3d\x38\x15\xcc\xea\xb4\xeb\x3b\x29\x7e\x14\xc7\xa8\x6d\xc9\xbb\x01\xaf\x3a\x35\xd0\xe4\xb4\x6e\x78\x6d\xab\x5a\xe7\x1d\xdc\x29", 205, { 0x00, 0xf6, 0x95, 0xad, 0xc5, 0x33, 0x8c, 0x32, 0x3b, 0x8c, 0x80, 0x5f, 0x1e, 0xe5, 0x71, 0xcb }, { 0x48, 0x0a, 0x50, 0x84, 0x05, 0xab, 0xc9, 0xa9, 0x49, 0x24, 0x1c, 0x4b, 0x42, 0x1e, 0xc7, 0x61 } }, { "\xc3\xe6\x73\x02\x70\x80\x1c\xc5\x87\x9e\xb5\x13\x3c\xcf\x99\x0f\x06\x82\xd6\xf4\x67\xb9\x80\x77\xa6\xc3\x18\xe6\x79\xfd\x1b\xc3\x5f\x0a\xe7\x6e\x01\x47\xfe\xb5\x22\x53\x57\xcd\x17\x17\x19\xe5\x12\x6a\x86\xef\xaa\x1f\x29\x34\x42\x18\xb8\xf6\xf6\xb4\x16\xe3\xd1\x1c\x9c\xe8\xb7\x32\xcc\xab\xb8\xc9\x27\x59\x93\xc5\xa1\x5b\x1e\x63\xda\x76\x3e\x18\x34\x2e\x56\xf8\xcb\xad\xf2\x30\x03\xab\x0a\x83\xec\x40\x83\xa8\x01\x02\x27\x8c\x28\x4e\xeb\xfa\xd1\x8b\x24\xe2\x00\xac\x28\x42\x0c\x7a\x36\xd4\x65\x27\x4c\xb2\x8a\x65\xfa\xd4\x8f\x2c\x3c\x97\xdd\x2d\x12\x13\xe9\xf5\x1c\xa6\xb8\x04\x78\x2c\x1d\xa6\x69\x14\x68\xb9\xd8\xea\x2e\x95\x3f\xea\x18\x6f\x1f\x01\x51\xe6\x24\x9a\x65\x63\x52\xbf\x2f\xd0\x73\x14\x1d\x7b\x6a\x5d\xb7\xd7\xfe\xb3\xc0\x71\x1f\x38\xf4\xfc\x00\x24\x37\x78\x41\xf3\xa3\x7a\xf1\xf9\xd9\xb2\xfe\xe3\x22\xe3\x76\x28", 206, { 0x35, 0xe0, 0x98, 0x00, 0xad, 0xd6, 0x2b, 0x06, 0xb4, 0xf7, 0x8d, 0x75, 0x2c, 0x90, 0x84, 0xe8 }, { 0x32, 0x84, 0x45, 0x05, 0x48, 0x21, 0x2a, 0x76, 0x72, 0x71, 0x14, 0x75, 0x11, 0xd2, 0x19, 0xc0 } }, { "\x34\x0b\x2d\x20\x0a\x86\x9e\xdb\x23\x58\xe2\x80\x37\x58\xab\x11\x1a\xea\xc2\xbe\xca\x54\xf4\xa4\x15\x8a\x00\xe0\xd1\x14\xda\x27\x13\x4b\x32\xed\x8b\x0c\xb4\xcf\xae\x5b\xd5\x8c\x1b\xe6\xbf\x4b\x12\x25\xe1\xb1\x66\xf6\xf9\x89\x3a\x58\xee\x74\x0a\xfc\x3b\xc3\xce\x9a\x98\xe7\xf0\x07\x50\x8b\x14\x52\xce\x9e\x13\xa3\x33\x65\x62\xdc\x46\xa9\x23\xf6\x59\x64\x7e\xc9\x5b\xc7\x19\x7f\x39\xcd\x58\xf1\x9e\x06\xff\x9c\x6c\x5a\xa1\x21\x68\x7c\x1b\x8c\x27\x99\x20\x0e\x4b\x52\x3d\xe7\x93\x35\x31\x9a\x18\xb0\x8e\x26\x34\xcf\x2c\x44\x94\xb6\xf6\xe8\xf3\x4d\xac\xf8\x21\x87\xa9\x1d\x23\xf4\x4c\xf8\xaf\xbb\xf8\xe6\x8d\xad\xe8\x7d\x5a\xa9\xca\x30\xeb\x92\xcc\x4a\x11\x86\xa9\xfa\x4e\xa8\x6f\xfb\xe6\x6b\xa3\x96\x27\xd2\xcb\xdf\xc6\xe4\x81\xaf\x0e\xdd\x6b\x4b\xd7\x53\x59\x52\x4d\xe7\xce\xe5\xe0\x73\x2a\x33\x60\xc1\xc1\x4e\xa8\x77\x8c\xf3\xbd", 207, { 0x88, 0xc5, 0x42, 0x5c, 0x23, 0x98, 0x39, 0x49, 0xdd, 0xa3, 0xb1, 0xaa, 0x76, 0x02, 0x15, 0x94 }, { 0x19, 0xbe, 0x9a, 0x96, 0x21, 0xa7, 0xfd, 0xce, 0x71, 0xfc, 0x0f, 0x0a, 0x80, 0x8f, 0xa5, 0x4f } }, { "\xd2\x26\x4b\x3e\x3e\x76\x17\xdb\x51\xc2\xef\x6b\x71\x39\x8c\x60\x06\xfe\x2f\xff\x62\x85\x9a\x21\x3e\x57\x9c\x69\xcc\x2d\xee\x5d\x8f\xdd\xb3\xcc\x17\x9c\x6f\x75\x7e\x76\x92\x48\x5f\x8d\x7f\xef\xc8\x4a\x35\xcb\x4c\x6d\xc9\xdb\x52\x7c\x0d\xd1\xcf\x57\x3c\x40\x05\xe2\x80\x20\xf3\x04\x38\x30\x53\x0f\x48\xa4\x62\xf4\x90\x18\x1c\xee\x73\xc6\x10\xf4\x9a\xe8\x7f\xfe\xe6\x6b\x74\x10\x35\x88\xe5\x62\x43\x00\x63\x3c\xdb\x49\x43\x2c\xdd\x2e\x79\x6b\xa0\x6d\x3c\x98\x5b\x99\xdd\xf3\xee\xe9\xa2\x06\x3a\x3b\x4c\xfe\x18\x3d\x7b\xe6\xc1\x86\x43\x64\xd3\xe3\xcc\x38\x37\x24\x68\xce\xc1\xbd\x1f\xf1\xe9\x49\xd0\x34\x66\x96\xf3\x6d\x2f\x02\x2a\xd7\x46\x1e\x62\xeb\x28\x0c\x5a\xaa\x09\x2b\x9b\xf8\xb8\x65\xf9\xbe\x23\xa4\xf0\x82\xd0\xa6\xfe\x6d\x61\xee\xe6\xbc\x42\xa0\x1e\xb9\xcd\xee\x15\x8a\x30\x45\xd4\xa7\x32\xfc\x09\x29\x82\xdc\x5d\x78\xe9\x1b", 208, { 0x89, 0x42, 0x2f, 0xc7, 0x09, 0x90, 0xf4, 0x41, 0x25, 0x82, 0x0d, 0x53, 0xf2, 0xbc, 0x49, 0x08 }, { 0x6c, 0xfd, 0x28, 0xc4, 0x40, 0x56, 0xfd, 0x72, 0x10, 0xe5, 0x35, 0xc8, 0xda, 0xeb, 0x9c, 0xee } }, { "\xb0\x45\x3d\x25\x20\x64\x56\xb7\x79\xa5\x03\x9f\x9c\x2c\x55\xfe\x1a\x9c\x4e\x3d\x48\x94\x19\xbf\x35\xf4\xb3\xb5\x8d\x06\xed\xa4\x23\x6e\xc1\x08\xc2\x13\x36\x7e\x90\x74\x3f\x6c\x65\x5c\x8f\x92\xa7\x5e\x4f\x35\x30\x23\x2c\x58\xd2\x67\xbd\x64\x2b\xf2\x09\x04\x9c\x1e\x12\x4b\xe9\x93\xe6\x9c\xa4\x83\xdd\x5e\xa3\x9a\xde\x98\x6a\xaf\x0d\x24\xe7\xfd\xab\x0d\x4d\x2a\x5a\x17\xe0\xe4\x2e\xc8\xab\x05\x0c\x58\xdc\x7f\x4d\xa4\x47\x40\x1b\xc1\x23\x04\xf5\xbc\x88\x01\x1d\x83\x37\x65\x06\xb0\x9e\x6d\x34\x57\xd1\x6e\x6a\xaf\xe1\x6c\x85\x97\x0c\x8f\xbe\x0d\xa9\x3f\xb8\x8a\x4b\xfd\x83\x0b\x88\x26\x32\x31\x16\x05\x65\xc4\x1d\xc5\x9f\xbb\xbc\x2f\xb8\x3b\x7e\x88\x9c\xbb\x86\x35\x14\x7b\x85\x67\x0e\x89\xea\xb8\x63\xe2\xcd\x18\xeb\x8c\x10\x4f\x7f\x7f\x6d\xda\xc4\x2b\x9a\xc2\xc7\x04\x9d\xdf\x2e\x8f\xcd\x2b\x8a\x8b\xe9\x17\x17\x42\x79\x2e\x5b\xca\x6c", 209, { 0x32, 0x06, 0xab, 0x7b, 0x4a, 0xee, 0xe1, 0x31, 0xa8, 0xc7, 0x54, 0x75, 0x36, 0xe7, 0x2b, 0x6a }, { 0x8c, 0xdd, 0x74, 0xa1, 0xeb, 0x3b, 0x5c, 0x0f, 0x70, 0x24, 0x57, 0x95, 0xb0, 0x8b, 0xd5, 0xb0 } }, { "\x85\xfc\xd3\xf1\x37\x35\xac\x9a\xf8\x25\x30\x94\x40\xba\x2b\x35\x88\xe2\x40\x8a\xc3\x39\xcb\x12\x7d\x0f\x72\xc8\xfd\x6a\x5e\x8a\xe0\xe9\xbb\x53\xc3\xdd\xb9\xf2\x56\x6d\xfe\x4e\x0b\x49\x53\xf3\x47\x0e\xc2\xb5\x23\xef\x08\x2b\x53\x65\x66\xc2\xb4\x65\x21\x53\x16\x58\x4d\xf3\x13\x45\xac\xf4\x81\x9c\xa4\x1d\x3d\x39\x74\x5b\x81\xa4\x93\x17\xb4\xf6\xf9\x3f\xc3\x03\x74\x88\x3e\x86\x5b\x8c\x19\x21\xde\xc6\x1d\x1c\xfe\x71\x9c\x48\x0a\x65\x18\x93\x97\x40\xed\x66\x60\x9f\x8c\x7b\xcb\x97\x5e\xfd\x17\xc2\x5b\xa3\xd5\xed\x27\xfe\xf7\x00\x7c\x90\xd9\x4c\xda\x75\xfe\x8a\x87\x01\x0e\x44\x43\xe4\xad\xa1\x6a\xa6\x65\x76\x90\x19\x68\x9c\xfa\x46\xea\xc5\x2c\x68\x5e\x96\x45\x61\xed\x5e\x8e\x28\x73\x3e\xb1\x4e\x10\x04\xcf\xe8\x39\x6e\x20\x55\xc8\xf5\x52\xc6\x20\xe1\xb2\x85\x09\x9e\x2e\xd9\xf2\x45\xa8\xa2\x4f\xe2\xdb\xbc\xb6\xe3\x4b\x51\x6a\x88\x8d\x62", 210, { 0x29, 0x1a, 0xea, 0x5b, 0x9a, 0xba, 0xd3, 0xe8, 0x7e, 0x90, 0xaa, 0x94, 0x68, 0x73, 0x16, 0xb7 }, { 0x19, 0x04, 0x41, 0x1d, 0x3a, 0x9a, 0xb3, 0xc6, 0x2d, 0x5a, 0xbe, 0xd5, 0x13, 0xf7, 0x01, 0xf2 } }, { "\x84\x4c\x8a\x6b\x9f\x95\x97\xd4\xfc\x6f\xa3\xd0\x36\xae\x93\x4e\xe1\xc9\xa7\x89\xa9\x7e\x5b\x7e\x72\xc2\xf3\x88\x27\x05\xa0\x0e\xf0\xc7\x85\x74\xef\x49\x1f\x69\xa2\xda\x16\x95\x43\x46\xd4\xc2\xa5\xff\x60\xef\xc2\x7a\x5d\xbf\xb9\x26\xe5\xf6\x70\x05\x57\xde\x1a\xeb\x27\x99\x92\xa6\x8b\x14\xe6\x55\x63\xab\x70\x0b\x2e\xfa\x27\xbd\xca\x42\x6c\xbc\xae\xed\x23\x31\x7e\x24\x28\xf3\xfb\xd7\x5f\xf1\xeb\xbf\x01\xd5\x3f\x89\x5e\x43\xf0\x6b\x29\x9e\xed\xf2\xa6\xe8\xb3\x3a\xdb\x03\x06\xec\x65\xf1\x7c\xa8\x91\x5b\x3d\xc5\x91\x2f\xe7\xf4\x29\xaf\xa5\x36\x9d\x93\xd8\x32\x4f\xcd\x2c\xbd\xaa\x03\x14\x38\xff\xf1\xf3\x2e\xa0\x22\xb9\xaf\x81\x00\xf2\x0c\x27\xe2\x51\xc3\x43\x32\x54\xe8\xe9\x70\x2f\xf1\x88\x2d\xa4\xfc\xf7\x40\x9a\x73\x28\x0d\xef\x23\x55\x25\x48\xa3\x78\xa7\xb5\x7d\x9e\xe0\x27\xba\x14\x6d\x33\xd8\x6a\x19\x81\xaf\x6b\x19\x23\x9f\x90\xb2\xd2", 211, { 0xf9, 0x5f, 0x44, 0x1b, 0x15, 0x91, 0xc1, 0xee, 0x38, 0x4d, 0x89, 0x76, 0x89, 0xcf, 0x57, 0xdd }, { 0x9d, 0x7f, 0x09, 0xd6, 0xc5, 0x38, 0x63, 0xe6, 0x45, 0x4d, 0xd5, 0xe6, 0xf1, 0x10, 0xd2, 0xbd } }, { "\x7b\xa4\x7c\x0b\x3e\xc8\x13\x4d\xd0\x2f\xcc\xfd\x88\xbd\xa2\xe4\xc8\x90\x14\x1c\x63\x3c\x67\x2d\xbe\x5d\xd8\xf6\x36\x36\x63\xfe\x17\xf1\xd6\x39\xa8\xb0\x33\xba\x02\x5f\x96\x01\xf7\x3c\x6e\x1a\x99\x88\xcd\x44\xe3\x41\xe0\x02\x5a\x3c\x7e\x4c\x00\x40\x1b\xe0\x7b\x5b\xbc\x40\xe9\xc1\x5d\x6b\x16\xb7\x65\xd4\x55\x0a\x6e\xbf\x68\xb6\x02\x33\xec\x68\x36\x31\x6d\x7d\x4d\x32\xe5\x8c\x88\x0d\xc0\x83\xb7\xa0\xae\xb3\xd2\xc9\x96\x88\xa1\x5f\xcb\x58\x34\x19\xc5\xcf\x6f\x63\xbf\x79\xfc\xbc\xe8\x32\x2c\x8b\x94\x13\x2b\x2d\x74\x99\x92\xed\xbb\x2b\x2c\x44\xa2\xd2\x99\x15\xf8\x72\xed\xbf\x07\xe2\xae\x1f\x89\xfa\x4e\x44\x1d\xf8\xf7\xe1\xbb\xca\x5b\xc0\x13\xdc\xac\x13\xfb\x11\xe2\xe1\x85\x29\xce\xfe\x7c\x5b\xee\x4a\x76\x05\xab\xa5\x06\x19\x37\x06\xd2\xfb\x5f\xb4\xca\x36\x2d\xe6\x06\xaa\xb1\x7b\x79\xd1\x27\x65\x7e\xbf\x33\x02\xcb\xeb\xec\xb2\x1f\x6e\x43\x2b", 212, { 0x31, 0xb5, 0xf9, 0x6b, 0xd8, 0x6c, 0x49, 0x33, 0x94, 0x44, 0xa8, 0x6d, 0xed, 0xdf, 0x2a, 0xd4 }, { 0xbf, 0x59, 0x94, 0x3a, 0x3a, 0x35, 0xbe, 0xb7, 0x10, 0x78, 0x4b, 0xb8, 0xa4, 0xbb, 0xb3, 0xf6 } }, { "\x84\x41\x5c\x4f\xf2\xb6\xe1\x06\x21\x40\xa8\xd6\xa6\xbd\xef\x3e\x97\xeb\xd3\xd0\xac\x34\x8f\x58\x2d\x99\x15\xa7\x7b\x23\xaf\x0b\xab\x19\x2a\x61\x44\x3a\xdc\xab\x46\x23\xd2\x86\x59\x63\xd1\x76\xb8\xb0\xc5\xd1\x76\xde\x3f\x78\x29\x33\x49\x2d\x85\xd2\x50\x94\x28\x3c\xd0\x44\x52\x78\xa6\xff\x7b\xdb\xb2\xb6\x40\x14\x32\x3e\xe3\x11\xe6\x6f\x8b\x49\x3e\x1a\x88\x66\xce\x17\x48\xb0\x66\x89\xb9\xab\xfe\x89\xbf\x95\xc0\xe4\x32\x56\xa2\x78\xe5\x61\x49\x76\x80\x99\xd8\x39\xbd\x05\x0d\x75\x8a\xc0\xb8\x08\xef\x6c\x89\x91\xd1\xbe\xb3\x2b\x3a\xa0\xc6\xe9\x00\x66\x87\x38\x9a\x4a\xfc\x33\x8b\x17\x66\xd6\x5e\xf6\xd1\xf3\xd8\x32\x15\x17\xeb\xfd\x91\x5b\xcd\x2d\x32\x1c\x44\xa6\x89\x23\x39\xed\x68\xda\xf9\x3f\x87\xbf\xe5\x21\x51\x3f\x67\x5a\x55\xcb\x0b\xd6\x33\xc1\x5d\xe5\x41\xf1\x0d\x5b\x6c\x4f\xb1\x19\x77\xd7\x44\x1c\x29\x55\x20\xf7\x67\xf7\x44\x44\x5a\xbb\xb3", 213, { 0xf0, 0xc7, 0x75, 0x58, 0x9d, 0x46, 0x80, 0x13, 0x40, 0x1c, 0x93, 0xde, 0x00, 0x93, 0xe0, 0xd1 }, { 0x94, 0x37, 0xd4, 0xe8, 0xee, 0x70, 0x26, 0x48, 0x18, 0x91, 0xb6, 0xc2, 0xc7, 0x12, 0x47, 0x85 } }, { "\x96\x55\xab\xad\x90\x2f\xc7\x4d\x7e\xb0\x30\x73\xdb\x23\x8d\x8b\x82\x9f\xf9\x4e\xd6\x96\xcb\x73\x2e\x77\x09\x24\x7e\x61\x45\xa3\x6d\x5a\xb8\xd3\x9e\xab\x6a\xe5\x0e\xd2\xac\xbf\xe8\x97\x78\x2a\x25\x3f\x59\xf3\x5e\xd8\x28\x88\xa2\x1f\xa1\xde\xa4\xa0\xfb\x2c\x9a\x11\x32\x77\x5c\x4e\x95\xd6\x28\x44\x8e\x79\x5c\x58\xfd\xb1\x77\xc5\x5f\xd3\x5b\xc1\x88\xbd\x71\xf2\xc4\x8f\x76\xf0\xff\x2b\xbe\xd0\x48\xff\xa6\x80\x03\x51\x76\xd9\x97\xa0\xca\x14\x3e\xe8\x83\xc8\x3e\xcc\xcf\xb1\xb7\x7b\x7e\x49\x31\x00\xf2\x0f\xaf\xe9\x54\x4f\xdc\xab\x90\xd0\xe7\x37\x64\x35\x1a\xd2\x43\xcc\x34\x91\x5e\x5e\x8f\x6d\x18\x95\x60\x4f\x68\x31\xdf\x3f\xfe\x75\x4f\x8e\x68\x67\xba\xb2\x7c\xca\x49\xfb\xff\x57\x2a\x7a\xa0\xfd\xa7\xef\x96\x49\xab\x21\xe9\x3a\x67\x74\x11\xcd\xcd\x83\x69\x07\xd1\xe7\xf9\xe9\xcd\x44\xb4\x78\x3b\x89\x9b\x39\x79\xd0\x30\xcc\x70\xe9\xb9\x5d\x86\xe4\x81\xee", 214, { 0xe0, 0x72, 0x5c, 0x5f, 0x73, 0x9c, 0x87, 0xc0, 0x5f, 0x79, 0x9b, 0xc7, 0xfe, 0x66, 0x7b, 0xe6 }, { 0xa6, 0xaa, 0xf0, 0xca, 0xce, 0x43, 0xb1, 0x1d, 0x35, 0x34, 0xab, 0x3d, 0xbe, 0x46, 0x5d, 0x2d } }, { "\xf7\x44\x5a\x5c\x42\xe2\xbb\x9e\x2f\x0a\xf8\x82\x8a\x6a\xd6\xe0\xff\x4b\xf8\x39\x6c\x6b\x14\xe3\xfa\xe0\x87\xe1\x04\x3e\xa2\x0a\xcb\x32\xc5\xb1\x6e\xf0\x55\xbb\x3e\x1f\x4e\x2c\x09\xab\xa2\x60\xc3\x71\x05\x14\xcb\xd6\x86\xa0\xc5\xf2\x98\x27\xd1\x02\xb3\x83\xa8\xf1\x6a\xa6\xdc\x7b\x21\xa4\xad\xac\x27\x09\xed\xaa\xd3\xb8\x3a\xd1\x08\x75\x2d\xdb\x43\xa7\x4e\x63\x43\xdd\x22\x3d\xe3\x2f\x60\x1c\x46\x28\xb8\x0a\x8d\x92\x10\x51\x67\x5d\xe9\x44\x30\xe9\x5f\x5e\x35\xa5\x62\xe1\x5c\xc6\x7e\xd4\xa8\x77\x4c\x45\xbb\x9a\x9d\x68\x7b\x93\x3b\x47\x51\xca\xb9\xd1\xc1\xa7\xb7\x2e\x49\x07\x09\x25\x0a\x29\xd2\xec\x79\xf1\x74\x51\xb4\x10\x8b\x29\xdb\x9d\x41\xa9\x42\x45\x8b\xec\xb5\xd5\xd7\x55\x69\x84\x77\x7e\x8a\x31\x83\xe1\xc6\x2b\x3e\xb2\xd6\x2a\xbf\xe3\x44\xe7\x66\xc1\x87\x5d\x36\xa8\x73\x0b\x6b\xee\xc2\xbd\xd4\xcc\x75\xe4\x38\x34\x2c\x08\x4c\x1b\xa8\xf1\x0e\xba\x44", 215, { 0x9a, 0x9a, 0x4f, 0x73, 0x5c, 0x13, 0xa4, 0xd4, 0x9a, 0x49, 0x2e, 0xbe, 0x9a, 0xbb, 0x5d, 0xc4 }, { 0x01, 0xf4, 0x0f, 0x4e, 0x58, 0x86, 0x4c, 0x56, 0x3e, 0x3b, 0xd2, 0x91, 0xa0, 0x43, 0x76, 0x82 } }, { "\xd4\x13\xb2\xc9\x75\x9c\x24\x0d\xb6\xea\x81\xb6\x81\x37\xe3\xc2\xf9\x7b\xfe\xcc\x5f\x0a\xa1\x1f\xc7\x9d\x95\x15\x7b\xef\x69\xc5\x01\x7a\xf0\x64\xb8\x45\x97\xfd\x43\xff\x5f\xbe\x98\x68\x1b\xfe\x41\x29\x85\xd2\x59\x5c\x86\x94\xed\x81\x7d\xff\x45\xab\xd9\x3b\x36\xe4\x5d\x1b\xe7\x6d\x7b\x5b\xfc\x2e\x19\x1d\xe7\xde\x7b\xf8\x79\x13\x1d\xb5\x5c\x3c\xd0\x88\xef\x92\xf8\xc9\x83\x57\xea\xa2\x6b\x76\x48\xcd\x2f\x23\x65\xc3\x40\xa0\x2d\x45\x2b\x8a\x20\x0d\x6b\xb6\xb0\xba\x6b\x83\x39\x0c\xd3\xf1\x1b\xae\x3b\x2f\xe5\xb5\x55\xa4\xd8\xff\xff\x7c\x72\xd2\xf0\xbc\x81\xc2\x0e\x66\x2f\x86\x7a\x14\xbb\x8a\x1c\xc6\xe9\x8f\xa7\xa6\xc4\xdc\x93\xc8\x46\x9d\x38\xd0\x76\xd7\xff\xb0\x37\xe1\x57\x0a\xa5\xe2\xd3\xcf\x71\x73\x4f\x5d\x04\x23\x14\x54\xbb\x65\xf1\xd2\xdb\xf0\x7e\x68\x3b\x36\x50\x52\xd1\xb3\xde\x6a\x1f\xb0\xe6\xfc\xb7\x16\x7f\x71\x11\x30\x26\x5d\x71\x4b\xaa\x13\x9e\x55", 216, { 0xb8, 0x4e, 0x26, 0xab, 0x83, 0xca, 0x15, 0x65, 0x3b, 0x3d, 0x01, 0xda, 0x70, 0x6f, 0xa4, 0xa8 }, { 0x8e, 0xae, 0xf6, 0x51, 0xc4, 0x3d, 0x88, 0x3c, 0x94, 0xc7, 0xc9, 0x6e, 0x60, 0x5b, 0x34, 0x77 } }, { "\x7c\x28\x80\x7f\x07\x2b\xdc\x7b\x2a\xbf\xab\x0d\xd1\x81\xe0\x70\x06\xb7\x76\x87\x5e\xbf\xa2\xf2\x27\x6d\x1b\x80\x0b\xa9\x69\x37\x2b\xac\x51\x92\xa8\xa7\x4f\xe4\x7d\x2b\x25\xb3\x77\x3a\x8d\xa2\x33\x2d\x48\x9c\x1a\xb7\x95\x49\x7d\x91\xb1\x0c\x74\x0b\x09\x10\xf8\x39\x3f\x08\xcc\x41\x45\xe4\xba\xde\x22\x6c\xd7\x16\x01\x3d\xd9\x97\x06\xb5\x61\xb9\xb9\x72\x96\x97\xd3\x4b\xbc\xdc\x90\x41\xe0\x80\xef\xf9\x8e\x3a\x58\xde\x7c\x06\x4d\x01\x8b\xf6\xbb\x8c\x14\x24\x60\xc8\x4f\x23\xf3\xf8\x52\x80\x57\x6d\x32\xf8\xb1\xc6\xf3\x7c\x1c\x6b\x9e\xae\xbc\x3d\xba\xc1\x2f\x27\x91\x47\x3a\x88\x00\xff\xf9\x04\x3d\x8d\x92\xf0\xe9\x81\x95\xd8\x24\x21\xd2\xdf\x63\x4e\xfc\x04\x41\x0f\xeb\xb0\x1e\xfe\xfa\x27\xb8\x1f\x7d\x92\xf2\xfb\x00\xa3\xf8\xbb\xc3\x20\x00\x51\x96\x6a\xea\xc4\xf6\xc8\x85\x57\x0a\xcb\x80\x5b\x56\x39\xaf\x21\xfe\x5b\x30\x9c\x32\x11\x9f\x2b\x6e\x09\xa4\xb1\x64\x33\x65", 217, { 0x9e, 0xfd, 0x8c, 0xb0, 0x38, 0x3c, 0xba, 0xcf, 0x7e, 0xd6, 0xf4, 0xff, 0x0f, 0x71, 0x7a, 0x06 }, { 0x82, 0xae, 0x6a, 0x89, 0x29, 0x0b, 0xc6, 0x10, 0x19, 0xb5, 0x90, 0x7e, 0xd2, 0xe6, 0x9c, 0xdd } }, { "\xdb\x34\x3f\x47\x0a\x60\xd0\x19\x1e\x1e\x4b\xf6\x23\x33\xef\x20\xaf\xcd\x51\xeb\x84\xd6\x56\x4f\xe3\x8b\x9c\x18\xc0\x03\xf8\xf1\xfd\x83\x05\x42\xa2\x1c\xe6\xea\x52\x61\x18\xcd\xb6\x87\xd2\x6b\xb8\x42\xee\x22\xa0\xf0\xd6\x6d\x93\x5f\x5d\x48\xc5\x40\xa5\x53\xb9\x3d\xed\x53\xc0\xd5\xa0\xff\xb9\x9e\xd7\xbe\x6b\x99\xd1\x9f\x23\x10\x32\xa8\xd2\x7b\xcc\xa8\x9e\x68\xb2\x70\x4a\xa3\x69\x63\x64\xec\xd0\x81\x8d\xea\xa1\x2e\x63\x50\xa5\xd4\xc5\x5c\x2d\x89\x77\xab\xf4\x2e\xb8\xb5\x83\x0f\x7a\x9d\xe4\xae\xd0\x43\xf3\x60\x91\x50\x74\xd0\x63\xab\x9e\xb5\xc1\xea\x49\xd3\x53\x55\xeb\x47\xa0\x25\xfb\x2e\x22\xcd\xe4\x11\xdb\x64\x55\xf9\xb9\xda\x82\x1a\xe8\x78\x00\x04\x9c\x7f\x8f\x49\xa4\xe9\xfd\x44\x12\x21\x0e\x8c\xa5\xbf\x8a\x67\x4f\xbe\x15\xb9\x32\xe0\x53\x8f\x02\x8d\x90\x25\x80\x78\xb0\x89\x1c\x7f\x74\xc2\x22\x69\x17\xbc\xd9\x71\x9b\xe1\x89\x9f\xad\x51\x6f\x69\xf5\xe1\x99\xe5", 218, { 0x3f, 0x10, 0x3c, 0xe1, 0x42, 0x47, 0xdd, 0x60, 0xf8, 0xc9, 0xaa, 0x84, 0xb6, 0x9e, 0x59, 0x03 }, { 0x0f, 0xf7, 0x5c, 0xc7, 0xa2, 0xb3, 0xd5, 0x03, 0x8d, 0x37, 0x74, 0x36, 0x8d, 0x66, 0x30, 0xe4 } }, { "\x28\xc8\x75\xd5\x19\x17\xfb\x33\x9a\x5d\x70\x2a\x32\x7a\x3a\xad\xa7\x18\x98\xe0\x7d\x6e\x9d\x83\x75\xc0\xe3\x7c\x6c\x02\x15\xe3\x5c\xb7\x55\xf3\xdb\x30\x14\x1f\x3b\xe5\x46\xcc\xf1\x86\x3d\x04\x05\xd7\x2c\xa0\xe7\xb3\xee\x6f\x69\xda\x3d\xcb\x53\x01\xcc\x40\xe5\xee\x5d\x02\x2a\xd1\x89\xb6\x7e\xb0\x41\x08\x70\x0a\x28\x8d\x5f\x8a\x90\x4f\x50\xf1\xc0\x88\x82\x8c\xbe\x71\x6e\x46\x16\x60\xca\x81\x43\x6f\x2e\x60\x56\x0b\x32\xba\x20\x64\x84\xef\x67\x02\xca\x7f\xd2\x3a\xfb\xea\x11\x9c\x86\x10\x2c\x5c\x51\x2f\x99\x2a\xb0\xe0\xf2\xc5\x69\xf3\x37\xbc\x73\xd1\xe6\xaa\x6c\xfa\x8c\x49\xab\xec\xad\xfb\xf1\xaf\x7c\xb7\xb6\x9a\x57\x0f\xdc\x14\x19\xa3\x96\x3e\x1d\x49\x4d\x6c\xac\x22\xfd\x65\x78\xb2\xa0\x4a\xd8\x7f\xe0\xd9\x72\x03\xbe\x78\x3e\xf8\xf6\x80\xe0\xbf\xf7\x74\x51\x92\xba\x5f\x29\x22\xba\x79\x59\x77\xc3\xc2\xdc\x5c\x9f\x0b\x6a\x14\x8d\xae\x02\xc3\x0b\x85\x68\x17\x34\xcf\x2c", 219, { 0xd8, 0x09, 0x4e, 0xce, 0x9e, 0x25, 0x8e, 0x7d, 0xab, 0x35, 0x5c, 0xc0, 0xed, 0x23, 0x11, 0xc3 }, { 0x56, 0x85, 0x43, 0x4f, 0x2a, 0xb5, 0x10, 0x6f, 0xb9, 0x80, 0x15, 0x95, 0x00, 0x89, 0xdc, 0xb0 } }, { "\xb8\x2e\x1e\x51\x99\x5c\x40\x50\xcf\x9f\x27\x8b\xeb\x69\x42\xbc\xd6\x9a\x1b\xae\x42\x06\x8c\xef\xb2\x53\xa7\xb0\xf8\xca\xf5\x66\xcc\xc5\xa7\x9b\x5e\xc1\x3c\x74\xec\xeb\x19\xfb\x9d\xe6\x25\x33\x90\x53\x98\xd5\xbf\xfb\x14\x14\x3c\xc0\xf9\xb8\x93\x43\x6a\x50\x36\xbd\x93\x3b\xa2\xe8\x50\xd6\x31\x00\x5c\x65\x7d\x99\xa2\x2f\x87\x99\x76\x36\x03\xe9\x8a\xa3\x24\x94\xf5\x0b\xce\x3d\x88\x95\xb5\x5d\xb4\xa1\xf6\x78\xae\x1b\x1f\x14\xa8\xc4\x44\x0e\xed\x4e\xdb\xc0\xab\xe7\xf7\x30\xb1\x4e\xf5\x9a\xf7\x6a\x32\x86\x6c\x37\x26\x7b\xfe\x0e\x5f\x02\x58\x25\xa6\x3a\x6e\xe9\xb4\xf1\xae\x71\xd7\xc1\xff\x52\xa1\x2f\x0d\x0b\x4d\x20\x38\x18\xbc\xe1\xc5\x7e\x8f\x38\x72\xf8\xe0\x28\xab\x4c\x03\x28\x9a\xc7\x82\x97\xd1\x61\x03\xfd\xe9\x03\x38\xdd\xdc\xf8\x86\xfa\x35\x89\x97\xf0\xdd\x4a\xc9\x8f\x58\x8a\xa2\x13\x6f\xc7\x52\x5c\x27\x3b\xf7\x6e\x97\x96\x58\x01\xe4\x48\x3f\x96\x62\x72\x3f\x39\xf8\x9a", 220, { 0x64, 0xea, 0x71, 0xeb, 0x6f, 0x96, 0xe6, 0x93, 0xdf, 0x17, 0x57, 0x0c, 0x3a, 0x59, 0xd9, 0x4d }, { 0x75, 0x69, 0x05, 0xcc, 0xf5, 0x17, 0x6f, 0x3e, 0x81, 0xbb, 0xd6, 0xd2, 0x10, 0x26, 0x6b, 0xfa } }, { "\xa1\x68\x99\x53\x88\x81\x12\x3d\x8b\x03\x9c\xe0\x19\xcd\x8e\xd2\xbe\xef\x54\xd0\x7a\x05\xc4\x30\x20\x8b\xc2\x14\x9e\x50\xb7\x75\xeb\xd3\xa3\x92\xe7\x12\x81\x6e\x6a\xeb\x9f\xdf\xdc\x5a\x4e\xa0\x5e\x8c\x15\xfb\x5f\xb4\xec\x61\xed\x2e\x23\x15\xa7\x61\xdf\xf3\x21\xd3\x1c\xd1\x13\xf1\x3b\x56\x4c\xed\x6c\x3f\x87\xba\x92\x92\x38\x35\x31\xce\x33\xe6\xa2\xd3\x9f\xbc\x97\x25\xdc\xd5\x7a\x62\x79\x58\xda\xe8\x9c\x3c\xc2\x49\xfc\xb6\x76\x5f\x27\x1a\xe0\xef\xbe\x62\x01\x00\xf3\xba\x3c\x5f\x44\x59\x88\x50\xc5\xe3\xb0\xca\x15\x95\xab\x51\x79\x03\x60\x98\x84\x68\x16\xb5\x4a\xf2\x50\x50\x07\xdf\x8f\x0f\xa9\x22\x5d\xb6\xb1\x21\x6b\x21\x46\x32\xb6\x9b\xfb\xfb\xbb\xc0\xba\x07\x8c\xa3\x61\x8d\x50\x0c\x5a\x49\xc6\xf1\x42\x29\xeb\x88\xd3\xf2\x64\xbe\x60\x80\x26\x73\x0e\xd4\x93\xb1\xa9\xf9\xf5\xd9\x48\x44\xb7\xa7\x24\x67\x33\x62\xa8\x7d\xa3\xec\xdf\x95\x3d\xd5\xb2\x56\x66\xdb\x2b\x72\x60\x24\xe6", 221, { 0x52, 0x62, 0xcb, 0x8e, 0xea, 0xef, 0xba, 0x8a, 0xc9, 0x8c, 0x82, 0xe8, 0x78, 0x5a, 0x0c, 0x60 }, { 0x79, 0x7d, 0xcc, 0xd0, 0x10, 0x8a, 0xc9, 0x38, 0xf2, 0x27, 0xb3, 0xb0, 0x1d, 0x76, 0x69, 0x6e } }, { "\x20\xb0\xec\xe9\x4f\x46\x8a\xc7\x77\xc4\xcb\x01\x56\x0a\xdb\xfa\x58\x80\x31\x52\xf5\xb8\xd0\x18\x1e\x29\x39\x0e\x27\xc6\x5f\xa2\xff\x2f\xdf\x28\x39\x69\x5d\xd9\xcf\x09\xb5\xbd\xb7\xc7\xa8\x0f\x6d\xe0\x24\x8e\x2f\xee\x67\xa9\x78\xb8\x87\x67\xec\xdb\xd2\x2d\x3c\xfe\x30\x80\x5d\x89\x6c\x61\x5c\xc0\x77\x74\xa7\x6c\xfc\xb6\xff\x33\xc7\xc8\x53\x83\xaf\x11\x8f\xec\xe4\x9a\xb5\x13\xda\x24\xe0\xc2\xfd\xe9\xf2\x77\xb6\xa4\x1f\x8e\x11\x75\xce\x6a\x81\x76\x15\x65\x80\x09\xfc\xfb\x32\xbb\x87\x20\xe4\x1d\x61\x14\xed\x11\xe9\xb3\x0c\x11\xe4\x19\xcd\xc9\xe3\x8c\x5c\x25\xf5\x6b\x02\x69\x47\x00\x4c\x5b\xf3\x43\x46\x7e\xd2\x3a\x5d\x6d\x5f\xbd\x5c\xbe\xa6\x01\x48\x13\x0d\x35\x0a\x33\x96\x8a\xba\xc7\x50\x5f\x08\x34\x72\xf3\x38\xa7\x7d\x94\xc5\xe5\xd3\x52\xb7\xe9\xb2\xa6\xe7\x5e\xe1\x52\xdf\x3d\x98\x45\xfd\x41\xf9\x83\x77\x63\xff\xa5\xcc\xa0\x90\x67\x5a\xd9\x05\x03\x97\xcc\x0b\xad\x3f\x31\x32\x31", 222, { 0x63, 0x4f, 0xb1, 0x4b, 0xbe, 0x8c, 0xc7, 0x1e, 0x78, 0x69, 0x77, 0x69, 0x5c, 0x58, 0xdf, 0xa2 }, { 0x84, 0x3e, 0xd6, 0xd4, 0xff, 0x60, 0xed, 0x1e, 0x57, 0xcc, 0x12, 0xc0, 0xa1, 0xb0, 0x11, 0x3c } }, { "\x5e\xb1\xc1\x81\x9d\x5b\xce\x7f\xd8\x01\x9e\xc0\x10\xcf\x34\x34\xdd\x51\x6e\xb8\xdd\x74\x40\xdc\x04\x45\xca\xbd\x73\x06\xbd\x08\x5e\x56\x14\x7c\xac\x61\xe7\x84\x0f\xe5\xf2\x50\xa1\x22\x60\x28\xbd\x17\xeb\x40\x0e\x56\x69\x0a\xb2\x60\xbd\x17\xe2\x33\xec\xdf\xfd\xe4\xd1\xfa\x10\x9c\x99\x93\x8b\x15\x6f\xea\x0b\x1d\xc3\x84\x4e\x44\x71\x30\x8b\x7c\xc8\x2b\x1e\x44\x85\xb0\xe2\xfc\x70\x09\x92\xc7\xc2\xb4\x34\x8d\x05\x5a\x2d\xca\x8c\x0c\x0e\x89\x7a\xa6\x30\x4e\x68\xcb\xba\x41\xf5\x99\x8c\x03\x80\x89\x30\xaf\x42\x56\xfd\x23\x71\xd3\x34\x61\xda\xe6\x41\xf7\xce\xc0\x9a\xb3\x75\xf9\xff\x46\x1e\xb6\xd2\x62\x84\x61\xc3\x49\xc2\xa3\x21\xb7\x1f\x10\x7f\x82\x49\x6c\x08\x44\x63\xef\x35\xf4\x7e\xc5\x51\x02\x1d\xdf\x58\xd2\xfe\xb3\x98\xb2\xcf\x8f\xf6\x81\x47\x6a\xca\xcb\x70\x04\x4d\xe4\x2d\x9f\x7e\x12\x4c\x9d\x34\xb2\x1a\x8a\x81\x1a\x0a\x03\xf2\xba\xba\x7f\xc4\x21\x85\x30\x01\xd8\x26\xde\xc1\x1e\xe0", 223, { 0xd9, 0x75, 0xbe, 0x8a, 0xc8, 0x90, 0x22, 0xd2, 0x19, 0x92, 0x44, 0x82, 0x05, 0x92, 0xc4, 0x39 }, { 0xb0, 0xe8, 0x44, 0xae, 0xf6, 0xda, 0x62, 0xe2, 0xf5, 0x9d, 0xf5, 0x3e, 0xac, 0x1e, 0x56, 0x26 } }, { "\x9a\x00\x59\x57\x56\x31\x17\x2c\x00\xf4\x4d\x4a\x52\x18\xf7\x40\x0c\xe0\x5c\xda\xe0\x98\x32\x80\x3b\x43\x15\x03\xdc\x5d\x05\x72\x06\xc1\xec\xd8\x21\x22\xed\xe2\x1b\xde\x13\x37\x80\x5f\xa6\xd4\x1c\x42\xde\x86\x84\x07\x0b\x85\xa3\xfb\x35\x92\xb0\xcf\x38\xc5\x1a\x89\xb7\x01\xb0\x3a\xa7\xee\xc5\x5d\xe3\x43\x4b\x1f\x9a\x6d\x15\x27\x46\x85\x2e\x09\xf7\x2e\x7d\x56\xb7\xf1\x02\x34\x77\x99\xda\xdc\x7f\x85\x65\xf9\xa5\x4b\xdc\x78\xfa\xb1\xfe\x3f\xfe\x1c\x05\x00\xc3\xd9\x05\x3d\x3e\xc6\xdd\x89\x8f\xbc\x52\x46\x86\x5f\xd4\xae\xa0\xf3\x5e\x9a\x18\x9a\x63\xf8\x2f\x55\x05\xcc\x2f\x91\x3e\xa9\x01\xfc\x6e\xb3\xcb\x95\x0f\x0a\xd0\x27\x53\x28\xa8\x4b\x71\xbf\x81\x89\x37\xaf\x3c\xda\xda\x28\x88\x92\xf4\x6a\xf0\x0f\x83\xcf\xd4\xed\x2a\xe5\x8f\xe6\x3d\xab\xea\x93\xbc\xdd\xa0\x09\x87\x01\xa5\x80\xfd\x24\xf8\xb3\xf2\x2a\x04\xdc\x9e\xfb\x75\xd1\x1e\x6c\xe8\x7d\x61\x0e\x8e\x73\x24\xf5\xbc\xa4\xaa\x04\x46\x90", 224, { 0x31, 0x93, 0x4d, 0x92, 0x4d, 0xe8, 0xbe, 0xf7, 0x26, 0xb6, 0x50, 0xc4, 0x37, 0x39, 0xb7, 0x3d }, { 0x47, 0xfd, 0xec, 0x8d, 0xec, 0x90, 0x08, 0xd1, 0xf3, 0x68, 0x41, 0x5f, 0x73, 0x5a, 0xbc, 0x2f } }, { "\xfa\x4a\xd1\xb5\x8a\x8a\xc3\x36\xc8\x49\x5e\xb9\x56\x93\x01\xbb\xf2\x79\x12\xda\x65\x0f\xf6\x0a\x1b\xa4\x3a\xb1\x24\xca\x53\xac\x7b\xbe\xc9\x73\x17\xcf\x40\xfb\xc0\x87\xc6\xe8\x16\x75\x17\x60\x05\x02\x16\xa9\x90\x14\x28\x1a\xeb\x15\xea\x2e\x56\x78\x62\xf3\xac\x21\x6e\x23\xeb\xd5\x19\x31\xd4\xf4\xb1\xfc\xb7\xf2\x8a\x8c\xf7\x3a\x0b\xc7\x2d\x42\x55\x74\xa9\xe0\xe1\x23\x95\x16\xe1\x07\xf2\xe5\xc4\x4a\xfb\x89\x7e\x31\x61\x11\xb6\x62\xc4\x1d\x60\x7f\xad\x07\xb2\x48\xf9\x78\xd1\xdd\x4b\x34\x6b\xe4\x6c\xa3\xe9\x86\xfd\x8f\x41\xd6\x41\x13\xc0\x78\xf4\x3a\x4f\x8e\x92\x0c\x89\x01\x66\xd2\x93\xff\x86\xd6\x31\xaa\x99\xdc\x95\x36\xfa\x5d\xa8\xe4\x9d\x2b\x69\xd3\x1c\xf9\xca\x88\x7e\x1c\x95\xe9\xff\xf1\xb4\xb8\x9b\xf7\x2d\x3b\x26\x12\xe1\x02\x13\x28\xab\x1e\x48\xf5\x5d\xdc\xe2\x24\x8f\x84\xf3\x8c\xfd\x44\x5c\x56\x5f\xf6\x19\x33\xd0\xb0\x9d\x0d\x5a\x09\xf3\xc4\x5b\xbf\x42\xa7\x08\xd6\x16\xdc\x24\x95\xb0", 225, { 0x86, 0x3d, 0x44, 0x02, 0x59, 0xbe, 0x4a, 0x12, 0xf2, 0x33, 0xd7, 0xe0, 0x8a, 0xcf, 0xd8, 0x70 }, { 0x94, 0x47, 0xf0, 0x85, 0x1c, 0x62, 0x29, 0x66, 0x99, 0x5f, 0x5b, 0xcb, 0x70, 0xf6, 0x5f, 0x90 } }, { "\xbc\x44\x67\xae\x61\x87\x82\xd1\x2d\x21\x9b\x11\x2a\x3f\x55\x4c\x13\x42\xda\x14\x9f\x31\xa2\x1f\x95\xb0\x56\xb6\x28\xc8\x60\x63\xf5\x9d\x3a\xf0\xb5\x80\x2e\xfd\xcf\x8b\xc0\xd6\xb0\x93\xdd\x69\x71\x35\x2c\x4e\x99\x25\x45\xfe\x5a\xd9\x29\x00\xb1\x13\x96\x6b\x9a\xde\x24\x9a\xa7\x25\xb6\x5f\xbb\x96\xca\x59\x2b\x4b\x4e\xd2\x04\x08\x91\x56\xf3\x21\x90\x66\xf8\xb7\x08\x9a\x2c\x1d\x73\x8a\x0c\xfb\xc8\xb1\xc6\x04\x23\x31\xc2\xf6\x93\x9c\x82\xb2\xc8\x39\x90\x8f\xce\xa5\x46\x0e\xe3\x3e\xd0\x1b\xf9\xc6\xa7\x80\x89\xc7\x0c\xce\xba\x12\x74\x33\x48\x35\x7f\x28\xdc\x42\xf5\xb7\x8a\xe5\x5b\x26\xd1\x2b\x6c\x66\x4a\xcf\xca\xc3\xf2\x57\xcb\xd6\xa3\x88\xac\x58\xcd\x34\x4e\xc9\xcf\x8b\xab\x09\xad\xee\xc5\xc1\x32\x25\xec\xf4\x3a\x28\xcb\x20\xe2\xd3\xc2\x41\x6d\x96\xb6\x44\x0b\xd3\xf4\xb7\xe7\xff\x8f\xef\x94\x2d\x8f\xd1\x2a\x5d\x72\xc6\x4f\xe6\x06\x4f\xda\x1d\xa1\x34\x49\x34\x52\x20\xea\x16\x49\x98\x5c\xd5\xba\xf5", 226, { 0x75, 0xe5, 0x14, 0x6d, 0x22, 0xdb, 0xab, 0x6d, 0xe0, 0x93, 0x77, 0x05, 0x8f, 0xdc, 0xb2, 0xdc }, { 0x0f, 0xcc, 0x76, 0xd5, 0x7b, 0xba, 0xf8, 0x4e, 0x25, 0x83, 0xd1, 0x04, 0x2d, 0x52, 0x8b, 0x9d } }, { "\x47\x77\xa5\x59\xe6\xbd\x9d\xf9\xe5\x28\xf1\x23\x7f\x07\x70\xde\x76\x14\x34\x77\x94\xbf\xd1\xa4\x0a\x9b\x30\x20\xaa\x96\xd6\x58\x6d\x2a\x3f\x80\xbe\x30\x64\xec\x65\xbf\xc7\x14\xfe\x64\xa2\x27\x18\xf3\x26\x76\x36\x36\x14\x3e\xc0\xea\xfb\x28\x83\x08\xa3\xb2\xe3\x01\x98\x84\x58\xdf\x64\xae\xd7\x04\xe1\xf7\x47\xa6\x76\x5e\xbb\xe9\x39\x11\x8b\xf1\xeb\x36\x99\x02\xfe\xef\xc8\x88\xae\xe1\x57\xcb\x73\x2f\xf0\xe5\x13\xe1\xe1\xe4\x1e\xc9\x11\xb1\x6f\x38\x7e\x3b\xf4\xed\x43\x86\x80\x4d\xfb\x08\x2c\x86\x7f\x59\x0d\x04\xc2\xeb\x03\xef\xc5\x28\x6d\x8b\x05\xb3\x53\xc5\x32\x55\x77\x42\x08\xce\x6a\xf8\xba\xd2\x3c\x31\xb1\x4d\x61\xe7\x85\x04\x7e\x98\xbc\x3e\x67\x54\xe5\x99\x27\x02\x63\x92\x49\xb6\x56\x1f\x5a\xe8\x25\xb1\x66\x24\x4c\xb3\x8d\x46\x73\x2f\xbb\xcd\x23\x8f\xb3\x17\x09\x12\x62\x84\x05\xa6\x14\xea\x4c\xed\x35\x6c\x2c\xb0\xef\x5a\xed\xab\xe0\x06\xef\xf3\x3c\x72\xb3\x30\x54\x76\x58\xc8\xec\xb7\x71\x75\xdb", 227, { 0x3b, 0x55, 0xf3, 0x29, 0x87, 0x72, 0xef, 0xe8, 0xf6, 0x0b, 0x76, 0x20, 0x0b, 0xe4, 0xf3, 0x14 }, { 0x20, 0x0a, 0x0e, 0x02, 0x20, 0xfa, 0x04, 0xfa, 0x91, 0xcb, 0x4b, 0x96, 0x29, 0x90, 0xd2, 0x74 } }, { "\x4f\xcd\x15\x56\xfa\xe3\xd8\x67\x32\xd9\xcd\x32\x6c\xde\x4a\xde\xa5\xcf\xd9\x08\xbc\x11\x29\xf1\x17\x5d\x75\x1b\xf2\xa6\xa0\xb9\x82\x0d\x6c\x46\x07\x3c\x22\xea\x5f\x82\x42\xe9\x05\x35\xed\xbc\xe7\xf5\x73\x43\x58\x03\xe5\x27\x59\xe9\x7c\x27\xd6\x1e\xa9\x46\x3a\x69\x98\x8e\xb4\x4b\x6e\x96\x64\xad\x7e\xe7\xfc\x80\xef\xee\xec\x09\x92\x0d\xd5\x05\x8c\x10\x29\x9b\xe3\xd2\xe4\xbd\xdf\x5d\xe9\xc5\x09\x25\x57\x89\x2b\x41\x1f\x90\xa5\x83\x24\x5a\x69\xcd\xbc\xc8\xae\x13\xa7\x99\x0c\xca\x60\x58\xd6\x1e\x13\xd2\xf9\xb2\x2d\x52\x58\x54\xd0\x47\x19\x4d\x10\x06\x88\x7f\x2c\xdb\x9a\xfe\x49\xd3\xcf\xa6\xfa\x48\x03\x05\xca\x1f\xdd\xe3\x76\xdf\x91\x3d\x7a\x2a\x4a\x57\x6a\xc6\xe5\x07\x3e\x22\x72\xa1\x76\xb1\xee\x26\x94\xa8\x76\xec\x99\x1a\xe9\xd2\x6c\x95\xf0\x90\x43\x4e\xcd\x02\xf7\x7b\xf7\xf1\xd5\xb4\x38\x17\x30\x31\xf9\xdc\x0e\x89\x8d\xb9\xf8\x59\xf5\x5a\x53\xf0\x61\x2b\x2a\xb3\x38\x69\x31\x78\xf5\x79\xd1\xcd\xb8\xa8", 228, { 0xb4, 0x12, 0x5d, 0x0b, 0xcc, 0x36, 0x53, 0xae, 0x80, 0x46, 0x58, 0xd9, 0x3d, 0xdf, 0xf3, 0xaa }, { 0x0b, 0x41, 0x5f, 0x89, 0x63, 0x0c, 0x42, 0xb7, 0xf6, 0x0f, 0x9d, 0x02, 0x93, 0xfa, 0x3a, 0x45 } }, { "\xb9\x15\x8e\xb1\x1d\x61\x2d\x4d\x64\x2e\x67\x91\x11\x9a\x8b\x40\xab\xbb\xc2\x47\x51\x76\x82\x75\x74\x36\x16\x90\x37\x42\x41\x13\x7a\x29\x0a\xb4\x08\x6c\x21\xbc\x97\xab\x7e\x0b\xd8\x65\x30\xae\x70\x57\xb7\xee\xa2\xc9\x7d\x97\x44\x83\x7a\x52\x85\x1e\xe7\x44\xf3\x1d\xb3\x79\xd8\xc3\x51\xc6\x05\x30\x68\xb5\x10\x44\x8e\xa5\x0e\x91\x9b\xc2\x50\x67\x3e\xf7\xa7\xd4\x1d\x00\xa1\xf7\x43\xfe\xcb\xd7\x1f\xd7\xb6\x9b\x59\x50\xb3\x3a\xe4\x75\x4a\x9f\x6e\xe8\x3c\xb9\xb5\xd1\x82\x55\x54\xce\x53\x8f\x78\xb7\x79\xa8\x32\x99\x5c\x45\xaf\x76\x8b\xc8\x15\x7f\xf4\xaa\x34\x0b\x44\x38\xc4\xf0\xdb\x2a\xfe\xd1\x3b\xe6\xf3\xe9\x51\xe0\x08\x76\x5d\xf7\x5c\x9f\x76\xca\xaf\xf9\xdf\x77\xfb\x4d\x12\x64\x62\xb5\x8b\x20\x2c\x50\xcb\xb5\x14\x8e\x5e\xcc\xed\xcb\x6d\x4d\x0e\x11\x4f\x1e\xfc\x88\x6a\x18\x9e\x33\x15\x5c\x71\xd6\xef\x9e\x45\xaa\xb7\xdf\x7f\x21\xf2\xdb\x53\x9d\x8d\x03\xb9\x41\x46\xd6\x95\x56\x25\xf2\x53\x23\x47\x06\xda\x23\xea", 229, { 0x6a, 0x16, 0x68, 0x2f, 0xa4, 0xa5, 0xfb, 0x73, 0xff, 0x85, 0xdc, 0xfb, 0x93, 0x34, 0x11, 0xae }, { 0xbc, 0x1a, 0xcf, 0xf0, 0x9a, 0x05, 0x99, 0xe2, 0xea, 0x27, 0xad, 0x50, 0x08, 0x7a, 0xaf, 0xaa } }, { "\x79\x5c\x4d\x67\xd6\x5c\x20\xa0\x39\x71\xd8\x0e\xf3\x0c\xc3\x5b\x1c\x4b\xea\x6e\x8e\xc3\x90\x1d\x2b\xa7\xcf\xa3\x36\x9e\x75\xf7\x45\xda\xd5\xfa\x9c\xe0\xcc\x6b\x82\x99\x65\x50\xb0\x5a\xa5\xa5\x01\x02\x4d\x80\xa3\xae\xbc\xec\xc1\x0b\x75\x9c\x8b\xa6\xa2\xe1\x01\x1a\xa9\x9e\x30\x49\xad\x20\x2f\xab\x91\x4c\xa6\x71\xc4\xfc\x76\x72\x40\x7f\xe9\x5b\x4f\xb2\xf1\xf9\x46\x95\xc5\xe3\xbc\x09\x18\xe1\x14\x7d\x08\xe5\xc3\x67\xe2\xbe\x9f\x91\xea\x00\x46\xe3\x34\x34\x50\x68\x79\x43\x3e\x3a\x39\x7b\x62\x1d\x57\x0e\x59\xe0\x2a\x3c\xe5\x71\x0d\x22\x66\x76\x37\x4b\x35\xf8\x2d\x96\xa5\xc8\x85\x0c\xa9\xce\xd9\x31\xcf\x7f\x4f\x92\x2c\xc7\x5d\x5d\x35\xab\xdc\x46\x11\xa3\xd8\xc1\xc6\xbb\x74\xd2\x64\x04\xfd\x6d\xc4\x3f\x11\xd8\x52\xf9\xc6\x82\x80\x24\x1d\x6a\xd3\x86\x95\xd0\x24\xe1\xe7\xc0\x25\xf0\xea\x36\x4c\x9b\x67\x33\xe4\xff\x29\x50\xc4\x6b\x2a\x7c\xc7\x96\x7c\x7c\x82\x2a\xa0\xc8\x42\x5b\xc2\x6a\x22\x9f\x34\x25\xad\x9b\xd7\x58", 230, { 0x8f, 0xa7, 0x94, 0x44, 0x83, 0x2d, 0xb7, 0x3c, 0x9c, 0xbc, 0x10, 0x1e, 0xbb, 0xa2, 0x5b, 0xfd }, { 0x43, 0xbc, 0x9b, 0x29, 0x10, 0x86, 0xee, 0x9c, 0x54, 0xa8, 0x61, 0x53, 0x6b, 0x22, 0xef, 0x7a } }, { "\x4f\x3b\x87\xa4\xab\x9e\xf2\xd7\x38\x91\x3e\x18\x35\x82\xd8\x33\xb3\x2c\x8a\xf8\xfb\x2b\x89\x4c\xf3\x93\xbf\xf2\xa6\xc3\x4a\x46\xfe\x15\xf9\x4f\x0a\x43\xfd\xb6\x1a\x9d\x02\xc4\x0b\x20\xd1\x07\x07\x9f\xad\xd7\x30\x6d\x66\x16\xc4\x41\x94\xb9\x0e\x81\x39\x8b\x86\xf0\x32\x3f\x03\xd5\x1d\x71\xec\x80\x45\x4b\x4e\x08\x15\xa6\xaf\xea\xb4\x55\x73\x52\xdd\xb9\x17\x8f\x12\x5b\x97\xfc\xb4\xd9\x3f\x7a\x60\xed\x8a\x6b\x11\xa8\xed\x83\xbf\x85\x5d\xf5\xea\x49\x58\x1b\x82\x0d\xb2\xcd\xe4\x8d\x4e\x29\x4c\xdc\x6b\xfb\x95\x04\x48\x85\xb7\xf1\xd2\x91\xb4\x41\x8c\x1e\x45\x84\x5f\x09\xff\x76\xbf\xea\x82\x2d\xf1\xc2\x79\xfd\x84\x7c\x75\x7b\x19\x37\x37\x48\x66\xca\x13\x28\x8c\xfe\xba\x82\xbd\x57\x99\x74\xd0\xa6\x0b\xdd\xfd\x0d\x8d\x7d\x36\x8f\xb9\x2f\x91\xad\xc3\x4e\xab\xa0\x2b\x9a\x78\x1b\x76\x37\x87\x4a\x1d\x20\x33\x1b\x9f\x5e\x32\x88\x3f\x99\x92\xc5\x9a\x47\x8b\x74\x25\xdb\xb3\xad\xfc\x1c\xd4\xc6\x9f\xba\xb5\xfa\xf5\xb1\x48\x79\x7f", 231, { 0xff, 0x87, 0xd4, 0x1c, 0x80, 0x6c, 0x11, 0x6b, 0x82, 0xd7, 0x67, 0x22, 0x5b, 0xab, 0xb4, 0xf9 }, { 0x90, 0x24, 0x86, 0x1a, 0x7b, 0xc6, 0x64, 0x7b, 0x7f, 0x90, 0x00, 0xb9, 0x31, 0x22, 0xc3, 0xec } }, { "\xe2\x86\xf1\x0c\xe8\x59\x56\xb0\x9e\x18\x1a\x54\xff\x07\x8b\xfb\x7b\xcf\xcb\xa0\xbd\x38\x36\x25\x8e\xfd\x5b\x1d\x30\xe6\x28\xa4\xf1\x54\x25\x5c\x77\x9b\xb1\xc8\xae\xac\xa1\x06\x05\x45\xd8\x22\xfc\x2a\x30\x92\xe4\x30\xbf\x51\x01\x95\xc0\x5e\xf8\x5f\xf8\xaf\x17\x53\xe5\xc9\x67\x76\x39\x6d\x8f\x80\x7a\xd2\x81\x44\xc1\xd5\x3a\xef\x08\xf6\x17\xcc\x8f\x63\xe5\x61\x3f\xa1\x0f\x63\x21\xc4\xd3\x53\x46\x71\x62\xfb\xc7\xef\x53\x79\xdb\x4f\x82\x88\x61\x96\x2f\xba\xee\x30\x4d\xf9\xb9\x94\xd1\xb3\x9a\x88\x74\x37\xd6\x48\xe1\xfa\x24\xe4\x94\xd3\xe5\x7e\xb8\xac\x3b\x7a\x16\x8b\x7c\x8f\xf0\x9d\x21\xd8\xf6\x63\x69\xfe\x16\x4b\xbe\xbc\x4f\x58\x71\x7a\xe8\x2c\x5d\x34\x27\xa9\x1a\x3c\x9d\xf0\x13\x48\xa1\x39\x78\xa1\xf4\x09\x81\xc1\x7c\xb6\xa1\x78\xae\xc8\x68\x72\x60\xe9\x71\xfa\x12\x99\x3c\x73\xec\x8b\x21\x25\x4a\x88\x16\x53\xb7\x7a\xee\x8b\xbc\x78\x74\xbe\x05\x81\x8e\xff\xcd\xae\x9c\x14\x08\xfc\x44\x79\xb5\x7b\xe2\xe5\x64\x58\x43\x49", 232, { 0x64, 0x4f, 0x80, 0xd1, 0xf0, 0x13, 0x38, 0x1b, 0xaf, 0xbe, 0x28, 0xd7, 0x20, 0x28, 0xe2, 0x39 }, { 0x47, 0x69, 0xf2, 0xf6, 0xc7, 0xb0, 0xfe, 0x40, 0x8b, 0x02, 0x5e, 0x20, 0x94, 0x04, 0x20, 0xe0 } }, { "\x4a\x9a\xd5\x32\x08\x49\x18\xf2\x24\x2b\x36\xd9\x58\x6e\x0a\x5d\xce\xc7\xb0\x4d\x35\xe7\x85\xfd\x24\x26\xfc\x81\x72\x86\xd6\x8a\x0d\x45\xa2\x9f\x7a\x87\xc4\xee\x5c\xec\xfe\x86\x2c\xc0\xb6\x01\xb0\xd1\x3e\x30\x97\x91\x85\x35\x9d\x7a\x15\x85\xef\xdc\x9e\xbd\x9f\x31\x40\xf0\xa2\x58\x38\xd7\x01\xae\xe6\x97\x9b\x69\x65\x6d\xa4\x38\x65\x72\x25\xab\xe9\xd7\x5b\xd3\x7d\x0a\xc6\xfb\x2f\x8c\x27\x5d\x12\x9b\xbd\xa3\x94\x0c\xf9\xbc\xda\x90\xd7\x82\x16\xec\xad\xac\x8f\x17\xfa\xaa\x24\x89\xd3\xcb\x12\x27\xa3\x25\xda\x56\x28\x49\x67\xbe\x09\xbf\xc4\x1d\x7b\x00\xae\x4f\xe0\x29\xf4\x05\xb1\x83\x79\xa6\xda\x7f\x71\x3e\xf9\x93\xdd\x63\x0b\xce\x92\xae\x5d\xd1\x4f\x45\xd1\xf2\xc2\xd8\x0c\x5d\x91\xec\x0d\x5a\x24\x02\x4c\x83\xe9\x34\xc5\x39\x24\xec\x78\x14\x6b\x5f\x88\x1f\xfd\x51\x10\x0e\x76\x1f\x55\x3a\x00\x01\x3c\xb7\x79\xa5\xc6\x09\x82\x0c\x77\x11\xf9\x65\x58\xad\x8d\x80\xa1\xfd\xcd\x4a\x95\x55\x84\xd2\x0c\x0c\xcf\x55\x42\xb9\x8a\x01\xdb", 233, { 0xc5, 0x1c, 0x65, 0x09, 0x8b, 0xc0, 0xc4, 0x19, 0xa7, 0x51, 0xaf, 0x94, 0x9a, 0x8a, 0x36, 0xa5 }, { 0x4c, 0xe9, 0x71, 0x07, 0x7d, 0x9f, 0x3b, 0xb2, 0xfa, 0x07, 0x0e, 0xa1, 0xe6, 0x63, 0x98, 0xf9 } }, { "\x17\x44\xdd\xc8\x2b\xb4\xa6\x9f\xc2\xed\xe0\x9f\x2a\x5f\xf9\x60\x5d\xcf\x0d\x29\xe0\xc6\x8e\xa8\xc3\xd2\xa6\xde\x19\x0c\x0f\xa2\x2d\xdc\xf2\xc8\x13\x7d\x74\x85\x26\xba\xaf\x45\x4b\xac\x12\x23\x89\xa7\x1b\x4d\xc8\x26\xe0\x9b\x69\x82\x99\x76\xe9\x08\xfa\xf4\xdc\xf9\xd8\x3b\x30\x30\x0f\x4a\x75\x4a\x0c\x5d\x4c\x51\xd5\xcb\x7a\x23\x1c\x5c\x22\x74\xb5\x08\xae\xf6\xf7\xf9\x70\xb6\xa9\xb7\xe3\xda\x2f\x04\xf5\x8c\x77\x09\x00\x57\x42\x5d\x63\x4a\x8d\x33\x50\x2b\xe7\x7c\xd0\x64\x64\xe2\x38\x1d\x1c\x5a\x98\xb1\xd0\x42\x3f\xc2\x3e\x0a\x65\x47\x8b\x2e\xb6\x97\x7e\x65\x6f\x9e\x2a\x4c\x14\x2a\x51\xe0\xcf\xfd\x4c\xab\x1f\x25\xb3\xc1\x53\xf9\x51\x23\x20\x4d\x3c\x0d\xa6\x58\xd6\x23\x64\xdb\xfe\x48\xbe\xee\x6f\x28\xf8\xfb\xd3\x69\xff\x76\x48\x91\xea\xd7\xd8\xa1\x57\x01\xb4\xe5\xa2\xd7\x5f\x3b\xab\x6a\x01\xe2\xfa\xbe\xe5\x0b\x5f\x98\xba\x32\x99\xea\xc1\x24\x63\x8e\x94\x48\xac\x0d\xba\x49\x12\xeb\xac\xda\x6e\xfc\x30\x89\xfa\x70\x67\x40\xb3\x2d", 234, { 0xba, 0x9f, 0xd2, 0x3c, 0xbf, 0xa2, 0xf5, 0xd0, 0x5e, 0xa3, 0x7d, 0x0f, 0x66, 0xb8, 0x50, 0xae }, { 0x79, 0xd1, 0x1b, 0xba, 0x26, 0x2b, 0xcf, 0xc7, 0xe1, 0x8b, 0x4f, 0xde, 0xf4, 0x14, 0x72, 0x0a } }, { "\x59\x40\x46\x08\x47\xb8\xb4\x81\x57\x7f\x9e\x93\xf4\xe8\xc2\x95\xa8\xf3\x36\x88\x14\x3d\x1d\xbb\xa9\x79\x9a\x61\x36\x45\x02\x0d\xaa\x70\x63\x4e\x36\x9c\x69\x16\xb1\x22\x01\x35\x0d\xfd\xb1\xfc\x19\x9a\x06\xd4\xd5\xd0\x1a\xef\x49\xdf\xcf\xa3\x43\xed\x8b\x2f\x47\x18\x6f\xd4\x5f\xc5\xa9\xe4\xe8\x52\xc2\x63\x6f\xa0\x00\x3e\xb0\xe9\x53\x86\x49\x8d\x50\xfb\xb1\x1d\x63\x70\x66\x44\x7d\xf8\x98\x9a\xca\x36\xfc\x45\xda\x1c\x62\xdd\x35\xbf\xe0\xa5\xba\xad\x07\x52\xb9\xc4\xe4\x98\x1c\x7d\xc0\xb8\x70\xa8\xbd\x73\x2e\x33\x0a\x6f\x76\x13\x13\x41\x40\xbe\xb9\x61\xc9\xf8\xd1\x6e\x53\xb2\xe8\xa1\xfe\xf4\x06\x0a\xf3\x80\x6a\x62\x8b\xf3\x1e\x14\xe6\x61\x55\xa9\x97\x81\x33\x13\x94\xe3\x03\x43\x5a\x80\x81\xdd\xf9\x7c\x79\x6d\x26\xdf\x32\xa1\xc9\x3b\xd8\x49\x9f\x39\xc9\x41\x03\x4b\x04\xa7\x04\xd5\xca\xd2\xec\x1f\xce\xf0\xcf\xff\x74\xb2\x7d\x48\x11\x3d\xd8\x01\x54\x52\x5d\x45\xdf\x6b\x34\xe7\xd5\x0e\x2f\xf0\x82\xbf\x16\x66\xc9\x0a\x95\x0c\x00\xef\x75", 235, { 0xf3, 0x6e, 0x77, 0xcf, 0xfc, 0xbd, 0x78, 0xd4, 0x92, 0x3e, 0x91, 0x24, 0x89, 0xb6, 0x85, 0xa0 }, { 0xe7, 0xf0, 0xaf, 0x5e, 0xc5, 0x65, 0x23, 0xa7, 0x2f, 0x54, 0xe9, 0x42, 0xfe, 0xd9, 0xdc, 0xf8 } }, { "\x1a\x19\xb2\xf6\x0e\x67\xf3\x77\xde\xea\xaf\xff\x6d\x24\xd2\xf8\x5d\xf1\x17\x49\x11\x39\x8a\x33\x5c\x60\xbf\xfe\xc4\xf7\x0a\x75\xae\x00\xf3\x0b\xf8\x39\xf2\x4f\xd2\x11\x1b\xb5\xb0\x90\xca\xf6\x58\x90\x42\x2b\x7a\x73\xdd\x34\x22\x1c\x6b\x1a\xc5\xa3\x53\x27\x45\x46\x2d\x5a\x54\xde\xca\x8f\x7a\xb5\xcf\x14\xee\xeb\xab\xaf\x33\x6c\xfb\x28\x02\x27\x2c\x1f\x67\x06\x37\xce\x60\x74\x44\x2e\xfb\xcb\xc4\xbb\x7d\xcb\x75\xed\x9d\xe7\x38\xc9\x98\xcc\x57\x49\xca\x5d\xbb\xbf\xf8\x5b\xae\xab\xec\x5f\x3b\x30\x5e\x9f\x24\x15\x01\x8c\x5b\x23\x8e\x1c\x50\x11\xcb\xbc\x30\x8b\x61\xf7\xd0\xcd\x8a\x3c\xe2\xf4\x78\x9c\x9b\xd7\x9e\xad\x28\xb8\x43\x31\x2e\xcd\xf9\x16\x3a\xac\x0e\xad\xae\x0a\x7e\x03\x55\x82\x64\x36\x71\x25\xfd\x63\xa6\x6d\xf3\x26\xd0\xff\xd7\xe8\x7e\xec\x53\x6f\xa8\xad\xe1\xdb\xa7\xfa\x07\xaa\x3a\x3e\x6f\x61\xe9\x22\xf9\xa5\xeb\x53\xb9\x22\x33\xba\xb7\x39\xd6\x98\xc4\x80\xe2\xc1\xaa\x04\x15\x33\x1c\x39\xf2\xe7\x25\xfa\x58\x10\x9c\x9f\x63\x3b", 236, { 0x78, 0x91, 0xf6, 0x46, 0x46, 0xf2, 0x05, 0x0d, 0xe6, 0x1d, 0x58, 0x7a, 0x05, 0xf6, 0xe2, 0x0e }, { 0x67, 0x0c, 0x51, 0xe1, 0x96, 0xe7, 0x0e, 0x46, 0x3a, 0x9d, 0x7e, 0xc5, 0x4c, 0xd6, 0x45, 0x91 } }, { "\x1d\xc1\x48\xff\xe9\x39\xa1\xba\x63\x99\x4d\x22\x4e\x16\x3e\x9e\x2c\x52\x9e\x99\x00\xc1\x91\xb9\x70\x61\x51\xe6\x6a\xf1\x18\xed\xc1\x47\x31\x3c\xc4\xb2\x44\xde\x44\xef\xc4\xf6\x59\x72\x6d\x10\x8d\x20\xff\xa3\xc3\xf9\x6b\xe5\x35\xb2\xd0\x51\x77\xd6\x63\x68\xb1\x80\x0e\xd2\x91\x1b\x76\x02\x03\x8f\xbf\x5a\x40\x95\x3e\x53\x33\xfe\x15\xc3\xd4\x8c\x21\x2e\x1a\x99\x1e\xe9\x1d\xac\xc6\x4a\xf4\x81\x22\xb9\x23\x2b\xc5\x95\x47\x14\x5c\x81\xda\x1a\xf0\x9f\x0f\x10\xd8\x2d\x40\x4a\xb9\xf8\x46\x11\xb7\x19\xc4\x53\x10\x14\xf6\x25\x42\xf5\xd9\x55\x4b\xd2\x1c\xf3\x2b\xd6\xe6\xa0\xc4\xd4\x2e\xbd\x93\x77\x03\x27\x8e\x47\x73\x6c\x65\x8c\xea\xe7\xb9\x18\xdc\x63\x31\x3b\x2a\xe3\x6f\x82\xd9\xaa\x67\xf4\x47\x24\x52\x72\x4b\x1d\x91\xfb\xcd\x02\x27\x74\x17\x39\xa7\x8d\x91\xd6\x61\x38\x1d\xca\x0c\x96\xf1\xd1\x12\x18\x10\x27\x5d\xd8\x51\x65\x5d\xcd\xe8\xf9\xbf\xae\xe0\xfd\xa0\x17\xf5\xdb\xb1\x5c\xec\xcc\xc3\xbf\x66\x43\xb1\x0e\x8e\x3d\xe1\xac\x01\x3e\x17\xcd\xc8", 237, { 0x57, 0xa3, 0x10, 0xb7, 0x8e, 0x94, 0x82, 0xf9, 0x24, 0x93, 0x06, 0xad, 0xd1, 0x10, 0x43, 0x0b }, { 0x63, 0x53, 0x60, 0x23, 0x39, 0x09, 0xb9, 0xf6, 0x5c, 0xbe, 0x86, 0x08, 0x79, 0xa6, 0x20, 0x60 } }, { "\x92\x52\x87\x34\x72\xe3\x1d\x5c\x57\x91\x7d\xfe\x8c\x4f\x09\xa7\x58\xd9\x47\x06\xdb\x9f\x14\xc8\xb6\x90\x40\x9e\x13\x10\x0e\xba\x76\xde\x79\x26\xfc\x89\x3d\xd0\xf1\xbd\x19\xf1\xc3\xb1\x0b\x6f\xb6\x76\x5f\x62\xeb\x6a\xea\x66\x9c\x16\x1f\x43\x0d\x27\x21\xf3\xa6\xd6\x8b\xba\x02\xd3\x5c\x86\x23\xf4\x99\xcb\xd8\x69\x25\xf7\xf5\x13\x0a\xfe\xae\x51\x6d\xfb\xf0\x79\xd0\x06\x28\x96\xff\x67\xdf\x0f\x7b\xcf\x2a\x12\xaf\x8d\x4e\xff\x46\xfd\xc4\xfe\x94\xeb\x85\xcb\x6b\xc8\xe7\xa4\x47\xd1\x4b\x68\x03\xbb\xfd\x67\xdd\x24\x67\x15\x72\x65\x73\x5b\x19\x52\x5e\xa4\xd3\x89\xe0\x9f\xe9\xfe\x3a\x77\x0c\x04\xef\x3c\xb7\x9a\xe7\x96\x28\x40\xc9\x31\x72\xd8\xc5\x0a\x6a\xb4\x32\x0e\x5f\xfd\xa9\x27\x20\xfa\xbf\x38\x10\xc9\xbd\x7d\xa4\x23\x56\xb6\x03\x86\xad\x6d\x19\x97\x92\xd2\x72\xbb\x54\x09\x3c\x33\x45\x05\xb9\x80\x4d\xe1\xfd\xd5\x8e\xb8\x06\x83\x9f\x58\xd7\x3d\x1f\x7c\xc3\x92\x4b\x0c\xe4\x91\xac\xbb\x65\xc3\x6f\x53\xb6\x66\x3a\xa4\xf3\x4a\x19\xd3\x7a\x3c\xd2\x3f", 238, { 0x3e, 0x02, 0x3f, 0x4d, 0xf0, 0x60, 0x97, 0x09, 0x3d, 0xe8, 0xf7, 0x45, 0xe5, 0xf3, 0x23, 0xf3 }, { 0xe2, 0xd8, 0x04, 0x3f, 0x56, 0x4d, 0xc6, 0x18, 0x3a, 0xf5, 0x65, 0x2b, 0x59, 0xd3, 0x80, 0x9c } }, { "\xeb\x47\xbb\x17\x82\xfd\xc4\xb5\x36\x20\xd6\x3e\xe0\xae\x80\x76\x1d\xbc\x8d\x51\x8d\x01\xd7\xaf\x5a\xcd\x7c\x6e\x7e\x11\x53\xa5\x3c\x21\xe7\x74\x22\x9d\x78\xc4\x24\xba\x78\x77\x01\x4b\x36\x25\x01\x30\x16\x3c\x9d\xc9\x8c\xac\xdf\xd8\xc0\x22\x8c\xe0\xd8\xb3\xf4\x2e\x5b\x03\x95\x88\x0c\x76\xbe\x8c\x2c\xa5\x53\x94\x1c\xbd\x3d\x3e\xb2\xec\x7a\xc5\x41\x51\x1c\x80\x96\x81\x31\xb5\x57\xb2\x44\xd7\xe5\xde\x37\xdf\x71\xd8\x4b\xad\x55\x2e\xf5\x24\xd3\xbb\xfc\xe4\x34\xb7\x6c\x89\x58\x1b\x34\xf9\xda\x0e\x76\x40\xb6\x71\x20\x32\x01\x5c\x8a\x4a\x89\x6a\xbc\xff\x35\x68\xb6\xa5\x4f\xac\x52\x2b\xb4\x50\x24\x58\xf6\xe5\x7e\x51\xdc\x92\x1f\xe9\x7a\x52\x6b\x74\x5d\x20\xf0\x30\x5e\x92\x18\x98\x1a\x68\xb7\xeb\x69\x40\x63\xf4\xf6\xbc\x9b\x49\xe3\xe0\x77\x26\x7c\xe5\x6a\xfa\x03\x0b\xbf\x42\x2c\xc8\xd6\x57\x37\xae\xed\xaa\x46\x30\xd2\x81\xad\x27\x21\x97\xb8\x79\xb1\xba\xa8\xf3\xaf\xc2\x23\xd3\x61\xc5\xce\xbf\x6c\x64\xe1\x26\x9a\x2d\xaa\x6b\xe0\x65\x15\x5e\xc4\x7c\x49", 239, { 0x54, 0xa5, 0xd5, 0xe1, 0xe9, 0x3e, 0x60, 0xf7, 0x2b, 0x9c, 0x81, 0x4c, 0x00, 0x45, 0x5c, 0x55 }, { 0x26, 0x38, 0x9c, 0x4a, 0xf8, 0x53, 0x2a, 0xa1, 0xa4, 0x97, 0x10, 0x1a, 0x4b, 0xff, 0xc1, 0x2c } }, { "\x84\x28\x1f\xdc\x0e\xcd\xf0\x6a\x56\x89\x34\x8e\x64\x3a\x40\xe9\x15\x12\xe6\x43\xd2\x58\x61\x39\xa5\x11\x85\x91\xcc\x02\xee\x37\x54\x9e\x87\x72\xd3\x96\x00\x4d\x81\xee\x94\x5a\xb8\x62\xa6\x9d\xd0\x70\x16\x85\x66\x86\x18\x85\x68\x8b\x50\x10\x98\xfc\xe6\xa5\xda\x80\x25\xc8\x97\x07\x61\x37\x13\x4f\xce\xcc\xcc\xe8\x19\xe2\xc0\xd6\xe7\x4b\x51\xcc\xb0\xf3\xe4\x0a\x11\x1f\xe4\x64\x5c\x8d\x1c\xf8\xdf\x87\x01\xc8\x60\x57\x01\xf4\x14\xdf\x69\x42\x43\x48\x6f\x55\x75\x06\x2c\x04\xfb\xe9\x8b\x2e\x7e\xf2\x37\xb6\x01\xe6\xfa\x2c\xe5\x6d\x3b\x7c\x9e\x01\xf0\xab\x02\xc8\xd2\x6e\xe2\x01\x60\x5e\xd2\x6f\x8e\x72\x5d\xaa\x58\x9b\x93\xfa\x42\x2b\xcf\x41\xd2\xb0\x27\xae\x05\x15\xd3\x7f\x8a\xf2\x85\xba\xb4\x7b\xb4\x9f\xf9\x7c\x4e\x4e\xfd\xef\xb8\xac\xed\x47\x80\xa5\xcc\xd5\xe3\x45\x66\xf6\xd0\x8f\x08\x42\x61\x8b\x23\x9d\x2d\xd8\x8b\x67\x93\xa2\x4a\xfc\xb0\xaf\x98\xa7\xfe\xe3\x17\x0b\xb8\xdb\x74\xef\x64\x9e\x0d\xb1\x3c\x2a\xed\x37\xec\x37\x15\x0d\x10\x12\x02\x57\x18\xcd", 240, { 0xf2, 0xa2, 0x37, 0xbc, 0x7f, 0x70, 0x10, 0xfc, 0x03, 0xb3, 0x3e, 0x9f, 0xf7, 0xfe, 0x5e, 0xda }, { 0x47, 0xde, 0x93, 0xb1, 0x2b, 0xfc, 0xf1, 0xdb, 0x97, 0x7a, 0xe0, 0x80, 0x77, 0x71, 0x39, 0x0f } }, { "\x59\xca\xd8\x0c\xf6\x80\xb7\x5b\xed\x32\xed\x95\x9f\x5a\xe7\x33\xd9\xb0\x0d\x87\x9e\x34\x38\x1f\xf7\x7b\xb0\xa4\x83\xf1\x59\x4f\xb8\xcc\x74\x70\x65\x6f\x4d\xab\xcd\x35\xd9\x24\x97\xca\x15\x47\xad\x0c\x40\x8b\x9b\x4b\x5c\xb1\x7b\x46\x00\x56\xe1\x30\xd7\x59\x08\x5b\xc4\x83\xdc\xc3\x01\x93\xab\x3a\xa0\x10\x98\x60\x85\x56\x9d\xc1\xb4\x89\x34\x65\x07\x17\x91\xc6\x73\x12\x0f\xf5\x29\x93\x19\x2b\x5e\x65\x6e\x37\x81\x14\x6f\x30\xd1\xb7\xeb\x1f\x3a\x03\xb3\x07\x04\x68\xc4\xba\x1d\x6b\xa7\x07\xf2\x6e\xf0\x8c\x12\x8f\x1a\xdb\xa8\xd2\x3b\x70\x1e\x2a\xff\x1c\x44\x3a\xab\x3a\x5d\x9e\xf5\x59\x6b\xf9\x29\xd3\xcb\x97\xe7\x7d\x2d\x5d\xa0\x40\xa5\x17\x0f\xff\x8d\x1f\x3f\x43\xc1\xd1\xea\xe1\x39\xbe\x0c\x16\x93\xde\x51\x33\xe8\xf8\xda\xe3\x51\xd2\x86\x85\x0b\xc2\x49\x4a\xe5\x0a\x63\x67\x81\x24\x78\x51\xbc\x03\xda\xc6\xea\x18\xdc\xf4\xcb\xd6\x36\xb9\x5e\x97\x35\x41\x77\x02\xb7\x56\x06\x09\xd0\x48\x49\xef\xd0\x81\x50\x78\x21\x2e\x38\x24\xff\xa8\x69\x6d\xfc\x5f\x86\xfc\xcf", 241, { 0xc5, 0x27, 0x09, 0xb1, 0xdf, 0x61, 0x3f, 0x91, 0xab, 0x98, 0x07, 0xc2, 0x6d, 0x04, 0x98, 0x51 }, { 0x1c, 0x1b, 0x0e, 0x43, 0xed, 0xa9, 0xa2, 0x33, 0x19, 0x0f, 0x32, 0xa9, 0xef, 0x6c, 0xe4, 0x25 } }, { "\x0c\x36\x85\x73\xd5\xc3\x33\x89\x46\x53\xd2\x2f\x05\x99\x0a\xe5\x54\xf4\x9f\x98\xb3\x58\x3c\x28\x2d\x15\x76\x05\x49\x99\x25\x38\x8b\x09\x4c\x73\xf2\x04\x1b\xf1\x79\x60\x14\x7a\x4c\x48\x8c\x87\xd8\xab\xaf\x43\xc9\xaf\xb9\x9a\xe8\x85\x1d\xe3\x38\x77\xd4\x65\x12\xef\xed\x5b\x46\x52\x4c\x90\x63\xa2\xcf\x4c\xec\xa6\x18\x04\x55\xe2\x90\xa3\x60\xef\x4f\xcf\x1f\x07\x76\x86\x96\x44\xf1\x89\x8a\x47\x9f\x7e\x1e\xad\x28\x29\xae\x0c\x4a\x36\xc9\xb8\x7f\x8a\x4d\x11\x72\x93\x5b\xf2\x1b\x9f\xd6\xee\xc5\xf1\xa4\x13\x81\x9b\x7c\x1a\xfe\xee\xd1\xa1\xe6\xeb\x55\x06\x78\xa9\x76\x34\x8f\x71\xb3\xf9\xc6\xc9\xa8\xd1\x6a\xef\xa5\x5f\xa3\x2b\xbd\x59\xc6\xef\xd7\x7f\x2c\x52\x39\x4d\xe6\x2f\xd9\x94\xa9\xb3\x48\x83\xb8\x59\xd5\x95\xbf\xab\x98\xc4\x86\x05\xff\x63\x11\xbb\xa2\xbd\xca\x00\xeb\x41\x49\xf6\x6b\x10\x90\x0f\x7a\x13\x8e\xb2\xa2\x73\x0e\x45\x61\x51\xb5\x53\x93\xf0\x5d\xe6\xf1\xa1\xd8\x16\xc1\x93\x5e\xc1\x59\xd3\x82\xb8\xf3\x3f\x8f\xa1\x87\xe7\x90\xf1\x9e\x45\xfd\x1f\xab\x2d", 242, { 0x9a, 0x2e, 0x13, 0xe7, 0xff, 0xb4, 0xc2, 0x3f, 0x6d, 0x4f, 0x8a, 0x4b, 0xb1, 0xc7, 0xcb, 0xfa }, { 0xa2, 0x79, 0x17, 0x1a, 0xdd, 0x01, 0x5d, 0xca, 0x80, 0x41, 0x9e, 0x26, 0x10, 0xad, 0xfa, 0x36 } }, { "\x3d\x5f\x14\x88\x87\xef\x58\x67\x6d\x52\x52\x1d\xe2\x9d\x6c\x91\xee\xb2\x2b\x63\x30\x4e\x95\x2a\x92\x3a\x5d\x8e\xd6\x2d\xdc\xda\xd1\xe3\xed\xb0\xdf\x27\x3f\x5f\xee\x7e\xaf\x4c\xe9\x67\x80\xcf\xbd\x5a\xa2\xf5\x20\xec\x7b\x65\x79\x28\x7c\x46\xe6\x3e\x1a\xea\x70\x33\xdd\xa2\x1c\xee\x00\x01\x72\x3b\x6f\x71\x36\xc4\xea\xf3\x43\xb6\x8e\x1d\x1d\x55\xde\x2a\x20\xe9\x43\x1f\x1d\xda\xaa\x51\x74\x40\x27\xf0\x84\xef\x7b\x6d\x7d\xc1\x26\xd5\x34\x2a\x16\x5d\xbd\x0d\x50\x9e\x59\x31\x59\x22\x97\xee\x3c\x88\x77\xe4\x00\x30\x27\xb8\x2e\x19\x61\x31\xf1\xe4\x10\x73\xa5\x08\xfb\x53\xff\xa1\xb2\x38\x06\x1e\x25\x5b\x79\x84\x38\x73\xb9\xed\xf4\x1e\x3f\x9b\x77\x4a\x91\x13\xf9\x6d\x92\xaf\x78\x51\x6c\xd5\xe2\xd3\x80\xa7\x12\xd9\x74\x44\xa1\x3c\xc1\x80\x1a\xe9\x53\x5b\xed\x52\xfb\x1d\xf1\x3d\xe8\x0a\x42\xde\x13\x82\xec\xb9\xfd\xbc\x35\xc8\xd9\xa4\xc1\x88\x36\x85\x26\x43\xff\xdf\x1e\x41\xab\xb7\x48\x6f\x0a\x9e\xa0\xdf\xa5\xec\x90\x7a\x93\xfc\xeb\xeb\xca\x55\x95\x41\x3b\xa3\xb4\x98\x6c", 243, { 0x58, 0x9f, 0x49, 0x1f, 0x0d, 0xeb, 0x86, 0x8c, 0xad, 0x61, 0x4d, 0xc6, 0x90, 0xc2, 0x11, 0xf1 }, { 0x75, 0xee, 0x48, 0xeb, 0xc8, 0x99, 0x99, 0xce, 0x3f, 0x10, 0xa8, 0xc2, 0xe3, 0x9a, 0xe3, 0x9f } }, { "\x18\x11\x9e\x69\xd2\xbe\x71\x93\xeb\x11\x77\x65\xc0\x8e\xcb\x6c\xbc\x71\x9d\xb9\x31\xc6\x40\x65\x58\xb7\x24\x6f\xeb\x57\x03\xde\x2c\x0b\x93\xdc\xcb\x1f\x71\x46\xac\xb9\xa1\xb2\x4c\x56\xd1\xaa\x93\xf0\x88\x2d\x1e\x75\x31\xa2\x63\x55\x5f\x37\x56\xb3\x72\xd6\x64\x5b\xfc\xff\x3d\xb8\xc8\xa5\xcf\x7f\x1d\x4c\xbc\x3c\x9b\xd9\xcf\x67\x31\x7a\x3a\x63\x62\xbc\x9d\x2d\x2d\x3e\xa9\x24\x01\xdd\x53\x37\xe1\xc1\xaa\x29\xd3\xb8\xae\xff\xd7\x8b\x2c\xdd\x24\xa5\xc9\x53\x6b\x0e\x26\xf8\x27\x59\x84\x20\x34\x76\xcc\x36\x64\x2d\x7c\xdb\x5f\x34\xd5\xbe\x85\xd4\x49\xe3\xea\x27\x14\x0f\x1e\xd5\xf0\x89\xc5\x01\x06\xed\xfb\x19\x69\xbe\x04\x56\x81\x63\x6a\x4c\x9d\x35\xb0\x2e\x9c\x58\xaa\xc9\x9a\x96\x90\x90\xf7\x84\xe0\x9e\x9f\x72\xc2\xf3\x5c\xae\x00\xdd\x95\x39\x3d\xb3\x87\x47\x41\x90\x1a\x6d\xee\x74\xa3\xd9\x95\x0e\x72\x91\x0f\x56\x7c\x35\x0b\xbe\x2f\x92\x77\x8d\x3f\xb4\x5f\x46\x18\x6a\x2b\x88\x6e\x7d\x90\xb5\xc4\xff\x3e\x14\x93\xf8\x37\xc1\xdb\xef\xcc\x3b\xf7\x0d\xfc\xad\x62\x7f\xe5\xf0", 244, { 0xba, 0xf4, 0xa4, 0x84, 0x75, 0x0a, 0xe3, 0xeb, 0x5f, 0x0d, 0x56, 0x17, 0xff, 0xe3, 0xb1, 0x61 }, { 0x6a, 0x89, 0xab, 0x83, 0xb2, 0x7c, 0xc3, 0x59, 0x36, 0xa9, 0xfa, 0x68, 0x9f, 0x52, 0xed, 0x7c } }, { "\x03\x36\x9c\x3d\x33\x31\x84\xb6\x34\x96\xa9\xc1\xfa\x4e\xe2\x4f\xb1\xcc\x9e\xff\xc5\x88\x41\x93\x9e\x56\x4d\x37\x96\x48\xde\x6e\xb8\x57\x3c\x7e\xd4\x1c\x74\x52\xdc\xd0\x4a\x87\xa9\x5a\x87\xc0\xdb\x24\xa8\x30\xfb\xf5\x43\x8d\xcc\x71\xf0\xa3\xe6\x17\x62\x94\x42\xee\x6c\xcd\xcb\xf0\x12\x11\x52\xc5\x29\xd8\xab\x8b\x7d\x12\x91\x8d\x3b\x52\xca\xc5\xe8\x06\xec\xa4\x4f\x65\x05\xf7\x1c\x93\xdb\x19\x64\x23\xab\xb8\xbc\x63\xe3\x9c\xc1\x12\xc6\x49\x7c\xbb\xd2\xcd\x3e\x7e\x65\x8c\xd5\x9b\x23\x9f\xbe\xd1\x84\x68\xfb\xb6\x1d\x35\x87\xdd\x86\xcc\x79\xa3\x41\x8e\xfc\xe3\x9f\x15\x5e\x1c\x23\x6e\xe4\xf9\x7d\xc8\xa1\x9b\x6d\x3e\xce\xd4\xf8\xed\x39\x72\x7f\x82\xf5\xdd\xb4\x07\x45\x58\x04\x70\x59\x0b\x8b\xa5\xce\xdc\x55\x03\x14\x12\x7e\x7f\x90\x02\xa1\xbe\x42\x24\xad\xbd\xbb\xf2\x5e\x81\xc5\xa8\xcc\xaf\x0a\xd2\xef\x74\xc1\x2e\x79\xaf\xb6\xe9\x8c\x4d\xe1\x1d\xa6\xdd\xbb\xf8\xe4\x75\xda\xe7\x8e\xb2\xe1\xec\xf2\x43\xca\x04\xa5\x50\x1e\x92\x44\xf2\xbb\xe7\xc9\xe4\x04\x73\x1a\x4b\x3d\x2c\x11", 245, { 0x33, 0x63, 0xf2, 0x4d, 0xe2, 0x1a, 0xc1, 0xc7, 0x4f, 0xb7, 0x2e, 0x05, 0xa7, 0x37, 0xd9, 0xed }, { 0x16, 0xb6, 0x1e, 0x23, 0xb0, 0xe3, 0x84, 0x04, 0xcf, 0x90, 0xfd, 0x97, 0xbb, 0x31, 0x6b, 0x03 } }, { "\xf9\xfc\x99\x14\xd9\xf1\x4a\x0b\x12\x2c\xde\xf1\x0a\xad\xb5\xdc\x1a\xa3\x8b\x48\x77\xb7\x13\x46\x11\x7f\x40\x35\x56\xf0\x4f\x2a\xf4\x36\x88\xa4\x76\xdc\x3f\x4b\xcc\x24\x8f\x37\xbf\x47\xe6\x0d\x82\x4d\x73\x17\xd2\x4b\xab\x32\xf8\xe6\xa2\x0e\xb4\xdd\x11\x5d\x6d\x07\x1c\x45\xf6\x4d\x1e\xab\x37\xee\x24\xa2\x3f\xce\x35\xf9\x58\xed\xbc\xe2\x7a\x5f\xc3\xd0\x99\x0b\x8a\x1a\x7c\x3d\x13\x8b\x53\x58\x07\x37\x06\xc3\x3d\xf2\x3c\x40\xb0\xe1\x42\xe3\x56\xe3\x81\x43\x8d\xc3\x25\xb1\x4f\x99\x6d\xee\x25\xb8\xdb\x85\xab\xd9\x56\xa2\x76\xec\x6b\xbb\x82\x0b\x0d\xfd\x5b\x33\xff\x8a\x16\xc8\x57\xb3\x64\x37\x21\x8f\xa5\x6c\x2d\xb2\xeb\x83\xa8\x19\xea\xd4\x95\x70\x54\x29\x7c\x48\x57\x2c\x42\xab\x0a\x24\x9a\x80\xf2\x30\xab\xf9\xe4\xf1\x51\x3d\x9a\x50\x38\x52\x32\xca\x9b\x7a\xba\x00\xfe\x86\x66\xac\xcf\x29\xf6\x8a\x24\xf1\x1c\x40\xe7\x81\xec\xb6\xea\x84\x5c\xcd\x19\x18\x91\xa8\x61\x67\x8a\xbb\xb8\xba\x89\x3b\xc3\x23\x55\x89\xcd\x28\x40\xa9\xb5\xbe\x56\x96\x21\x51\xe6\x4c\x38\xad\x46\x3d\xa7\xfa", 246, { 0x18, 0x88, 0x55, 0x6d, 0x13, 0x10, 0xc2, 0x9c, 0xa0, 0x48, 0x04, 0x0c, 0x5e, 0xab, 0x86, 0x0f }, { 0xfb, 0x22, 0xa6, 0x5d, 0xf3, 0xde, 0xef, 0x49, 0xec, 0x44, 0x53, 0xc7, 0xcb, 0x36, 0x2e, 0xef } }, { "\x6d\xa1\xe5\x97\x60\xc8\x8b\x02\x7a\x4e\xe9\x5c\x5a\xc1\x03\x57\xb4\x8f\x41\x70\xdc\xfa\x39\xb6\x88\xaf\xec\x44\x87\x62\xee\x8a\xf1\x7e\x71\x19\x5a\xe8\x5d\xdb\xb1\xb4\x7a\x6f\x94\xbc\x93\x18\xbe\xce\xea\xa5\x04\xa7\xc5\x00\x0c\x48\xc2\x7a\xff\x38\xdc\xd3\xc5\x0c\x87\xa2\x49\x50\x0a\xbe\x7a\xba\x88\xf9\x9f\x33\x67\x96\x26\x1b\x59\x3f\xa5\xbf\xc0\x2f\x0d\x8f\xbc\x16\x2d\x11\xfc\xa8\x7c\xb0\x5b\xfa\x10\x54\x6b\x5e\x6d\x54\xad\xea\xf5\xc1\x05\x6f\xff\x06\xec\xa1\x42\xc0\x0a\x20\x0c\x76\xd6\x73\x5f\xdf\x78\x56\x99\x23\xe5\xd4\x3f\x99\x4c\x6c\xca\xe3\xd9\x82\xcd\x4a\x8a\xe6\xdd\x4e\xd6\xaf\x40\x1c\xa0\x4f\x5f\xcb\x4a\x5c\x32\x04\x17\x5b\xb4\x5f\x0e\xed\x59\x32\x90\x56\x0b\x0a\x56\x63\xb6\xbd\xa8\x1e\x92\x0a\x7b\x58\x1d\x40\xe7\x3e\x8a\xf6\xdb\xd8\x90\xfc\x9e\x33\x90\xc6\x97\xd0\x22\xde\xaf\x46\x37\xd6\x4c\x3e\x00\xaa\xfb\x08\xcc\xca\x21\x51\x4e\x9f\xeb\xa4\xea\x44\x68\x1e\x8e\x44\xc3\x03\x4e\x26\x7f\x0c\x12\x71\x8d\x36\x6a\x18\xeb\x74\x2a\xb9\xd2\x16\x27\xe0\x80\xa2\x9a\x78\x9f", 247, { 0x95, 0xb3, 0xb0, 0x3b, 0x97, 0xb7, 0xb1, 0x58, 0xb2, 0x07, 0x32, 0xcb, 0x75, 0x56, 0x68, 0x84 }, { 0x00, 0xe5, 0x84, 0xfe, 0x0c, 0x35, 0xe2, 0x26, 0x56, 0x0b, 0x62, 0x16, 0x85, 0xdb, 0xe3, 0x3d } }, { "\x14\x3f\x42\xfc\x7c\xe7\x67\x42\xaf\x84\x74\xb3\xfa\x7b\x0a\x43\x93\x6a\x22\xc9\xca\x6a\x85\xab\x2c\x5f\x1c\x9e\xff\xd4\xfa\xa6\xf3\xe0\xee\x59\xa4\x00\xe1\x36\xe4\x8a\x60\xd7\x82\x77\xf7\x30\xfa\xe2\xac\x0e\x63\x13\x7e\xcd\x73\x1d\x2e\x17\xf3\x3f\x48\x36\xfc\xee\x6c\x49\xd7\x8a\x6c\x55\x39\x0f\x98\xe8\x03\x4f\xf2\xc6\xba\xdc\x56\x73\x90\x8d\x89\xff\x8c\x37\xe4\xfe\x51\xea\xc4\x04\x8d\xf8\xd5\xc4\x7f\x37\x01\x97\x85\x17\x68\x54\x73\x61\x32\x67\x7e\xcd\x75\xd3\xba\x3b\xcf\x5b\xb9\x3f\x9d\x2d\xfe\xe1\x93\xfc\x1d\xe8\x0e\x97\x0b\xd1\xd3\x1c\x6b\xaa\xee\x83\x05\x1e\xb4\x79\x23\xbe\x64\x5c\x7f\xf3\x64\x8d\xdf\x67\x3e\xe9\x75\x0a\x80\x63\x80\x25\xb9\xc5\xc3\xb6\x11\x85\x41\x76\x29\xfc\xe4\xe8\x25\x28\x53\x3b\x5a\x5c\x39\x48\x69\xcb\x01\x28\x31\x87\x6f\x28\x89\x01\x7f\xd0\x96\xd6\xfb\x90\xaa\x80\xe1\xee\x70\xd6\x3a\x66\x4c\xfa\xfa\xc8\xe0\x78\xf2\xb2\x59\x2a\x6b\xc9\xcf\x89\xa8\x8a\x62\x22\x50\xc4\x9d\x7d\xf6\xad\xb9\x2c\x0d\xef\x30\xa7\xa1\xff\x1c\x82\xb0\x57\x98\x47\x27\x53\x66\xba", 248, { 0xda, 0x88, 0xa3, 0xbf, 0x1e, 0xf6, 0xa0, 0x0a, 0xb9, 0x55, 0x9e, 0x6f, 0xef, 0x11, 0xf9, 0x20 }, { 0x7b, 0xad, 0x19, 0x64, 0xa8, 0x9a, 0x4e, 0x77, 0x16, 0x53, 0x28, 0x44, 0x87, 0x1f, 0x3f, 0x26 } }, { "\x09\x8c\x07\x10\x93\x83\x6f\x26\x4a\x67\xf1\x7d\xa1\x00\xc8\x49\xd7\xce\xfd\x34\x78\x16\x47\xd5\x4f\xc3\x62\xed\x9c\x5c\xb3\xe8\x01\x80\x84\x0f\x1d\xc2\x8b\xcf\x74\x87\xca\x1e\x1e\x2d\x29\x23\x96\x1e\x08\x0e\x35\x18\xa5\x2c\x73\xc3\xd0\xc1\x15\x37\x81\xd1\xaf\xe7\x79\x87\x48\x04\xe4\x6b\x20\x00\x1e\xe1\xda\x07\x82\xdd\x6c\x77\x77\x38\x9e\x6f\xe9\xa7\x7f\x61\xcf\x51\x9c\x15\xf0\x0f\x0b\x3b\xe5\xe7\x90\x04\x4d\x18\x6a\x1c\x2a\x35\x3a\xb6\xe7\x5e\x39\x76\x31\x87\x7b\xa3\x48\x60\x51\xb1\x2e\x8f\xdb\x9c\xa7\x5a\xb3\x89\xb3\x30\xe2\x82\x7e\xcf\x36\xc4\x7b\x88\x3a\x5c\x84\x6c\x5e\xbb\x48\x5e\xc6\x10\x18\xa7\x15\xa2\x34\xfe\xe8\x92\x0f\xec\x7a\x53\x68\xe5\x1b\x10\x02\x44\xa2\xb1\xf6\x3e\xa1\xbf\x58\x17\xdf\x7c\x31\xa9\xef\x38\xe4\x4b\xc4\x2a\x63\xc5\x57\x0a\x1e\x09\xc4\x5a\xbd\x28\x7e\x26\x16\x6f\x13\xf1\x55\x91\xa1\x02\x93\x4f\x70\x68\x1e\x49\x89\x22\x7b\x7b\xa0\x7a\x66\x37\x27\x97\xe1\x93\x43\x22\x29\x1c\xb0\x4c\x70\x81\x54\xe3\xeb\xb5\xef\x34\xe4\x79\x44\xea\xae\x58\xf2\xc4\xd9\x17\x29", 249, { 0x37, 0xa4, 0x62, 0x45, 0x32, 0x28, 0x6e, 0x93, 0x4d, 0x1c, 0xdb, 0xec, 0x42, 0x26, 0x03, 0x40 }, { 0xae, 0x95, 0x35, 0x89, 0x21, 0xc4, 0xf7, 0xa9, 0x33, 0x99, 0x8b, 0xdd, 0x7a, 0x66, 0x99, 0xdf } }, { "\x70\x84\x13\xd3\x6b\x3b\xf7\x1e\xd3\xde\x7e\x6b\x9e\x97\x50\x23\xc8\x20\x8b\xf1\xb9\xd0\x02\x37\x53\x46\xca\xd9\xce\xac\x57\x1f\x01\x57\x3e\x11\x1d\x4b\xad\x08\x81\x69\x83\x40\xbd\x13\xbc\x75\xa1\xce\x3e\x0c\x7c\xf6\x13\xa5\x14\xc2\xaa\x58\xf9\x1c\xc3\xab\xa8\xed\xce\x99\x9c\x52\x22\xa6\xd8\x85\xb6\x74\xae\x41\x94\xe2\x61\x34\xb7\x0f\x26\x25\x9a\xcc\x50\x62\xf3\x07\xe8\x5f\x2b\xa4\x1d\x0d\x9f\x8a\xc1\x8f\x1c\x0c\xa2\x8a\xbb\xdd\xfe\x5d\x3a\xb2\x0e\x07\xe0\xee\xb5\x94\x73\x29\xf8\xa3\x94\x67\x27\xc0\x77\x0a\x41\xa4\xb5\xce\x2d\xf0\x0e\x09\x4d\xe5\x8c\x5e\x31\xa8\xee\xcc\xd8\x39\xc5\x30\x6a\x5a\x3a\x1e\xb9\xb2\x5e\x7f\x07\xa9\x4a\x2d\x3f\x3e\xd2\x02\xef\x36\xa8\xa6\xaa\x9c\x61\xad\x7a\x30\x7d\xb1\x53\x9e\x76\x08\xe1\x7e\x1d\x60\x85\xc2\xe1\x7d\x43\x5f\xd7\xb2\xbb\xa5\xba\xb3\x2e\xbc\xbd\x95\x10\xcd\x4f\xec\x76\x9b\xd0\x3c\x82\xf6\x91\x30\xed\xd3\x02\xb2\x59\xc1\x3a\xed\x27\x68\xc6\xd8\xf0\xec\xb2\x86\xc1\x1d\xd2\x8b\x57\xb7\x13\x9c\x8b\x09\x0a\x53\x30\x03\x17\xf4\x30\x50\x8e\x79\x0a\x16", 250, { 0x23, 0x09, 0x45, 0xf8, 0x4d, 0x13, 0x5d, 0x4b, 0x2a, 0xfa, 0x81, 0x24, 0x6c, 0x8d, 0xa3, 0xcc }, { 0x04, 0x45, 0xf4, 0xb7, 0xf7, 0x0d, 0x15, 0xda, 0x9a, 0x94, 0xb9, 0x8f, 0x34, 0x94, 0x55, 0xac } }, { "\xaa\xc8\x74\x1a\x38\xb7\x18\x20\x91\xcb\x6b\xc7\xa9\x9d\xe9\xae\x54\xcc\xa9\xca\x57\x92\x51\xb6\xaa\xb1\x3c\x2d\x7d\x0f\x64\xcf\x0b\x2c\x02\x59\xc3\x6f\xb4\xa6\xc7\xf1\x2c\xe0\x44\x7d\x7f\x2e\xad\x20\x62\xe7\x9c\xda\xeb\x64\x69\xac\xe0\xc9\x9c\x0c\x21\x4a\xf4\x5e\x2f\x6f\x23\x25\x40\x45\xc0\xdd\x6f\x29\x65\xfd\x87\x1a\x65\x6c\xea\xda\x8d\x68\xab\x8a\x6f\x05\xda\xda\x80\x4f\x85\x5d\x56\x03\x75\xd3\xa4\x7f\x0a\x94\xfb\x28\x77\x66\x15\xd7\x84\x32\xe9\x46\xde\x2e\xca\x81\x74\xdf\x53\xfb\xcd\xcd\x09\x38\xcf\x94\xd7\x50\x17\xbb\xa4\x66\x62\xce\x49\x79\x8c\xd3\x12\x73\x67\x06\x77\x2b\x3d\xa5\xbb\xe4\x02\x27\xc7\x73\xb4\x27\x27\xe6\xe7\x72\x07\x75\x07\x16\xb4\x90\x8c\x04\x05\x27\xa7\xcd\x76\x74\x82\xc6\xad\xb7\x26\x5c\xcf\xe4\x00\x1c\x5e\x35\x73\xca\xbe\xcc\x0c\xc7\xf7\x22\x6e\x12\xc7\xe5\x32\xe8\xfe\x4a\xb9\x0f\x51\x68\xed\xc7\x06\xea\x1e\x80\x3f\x60\x0c\x21\xe3\x81\xcf\xe1\x92\x27\xe8\x51\x62\xa5\xdc\xb2\x8d\x67\x03\x90\x2f\x37\xa6\xf6\x7a\xde\x85\x4c\xcf\xd8\x11\x37\x06\xb9\xc5\x06\x23\x12\x84", 251, { 0x66, 0x5f, 0xff, 0x3e, 0xec, 0xd6, 0xb9, 0x42, 0xf1, 0xee, 0xff, 0x90, 0x90, 0x86, 0xf9, 0x36 }, { 0xea, 0x40, 0xeb, 0x64, 0x66, 0x4a, 0x5e, 0x3b, 0x8d, 0xeb, 0x6b, 0xe4, 0x50, 0x73, 0x8e, 0x7a } }, { "\x3a\x36\xb0\xbf\x37\x7d\xe2\xdf\x5f\x8c\x31\xc4\x65\x81\xca\x86\xb5\x0a\x97\x91\x4c\x66\x85\x8b\x36\x49\x36\xa7\x1f\xc4\x3a\x59\x5f\x63\xcc\xa4\xb7\xb0\x08\xcb\x2e\x91\xc9\xaa\xd2\xa1\xb3\xa6\x3a\x4f\xa0\xd7\xb6\xdf\xda\x63\x4a\x08\x5c\x09\x62\xf4\x3b\xd8\x39\x72\x94\x64\x7a\xf5\x35\xeb\x22\x53\xe0\x85\x93\xc0\x0b\x58\xf3\xc3\x88\x2b\x5b\x47\x4a\x82\x26\x03\x7e\xc2\xf4\xdb\xe2\x4b\x55\xc7\xc6\xbf\xb6\x56\x1d\x21\xed\x59\xd8\x91\x19\x14\x45\x63\xa3\x77\x11\xbc\xed\x58\x05\x6b\x39\x23\x8b\xc5\x76\xb2\x3a\x8c\x42\x6c\xbe\x9d\x9e\xb7\x48\xbf\x86\x90\x2b\x93\x0f\x46\x47\xf3\x20\xbc\x5c\xfb\xb8\xe5\x8a\x87\xa7\x9e\x67\xdc\x11\x46\x9a\x88\x18\xfd\x8f\x7e\x23\xc8\x67\x83\xd6\x31\x1a\xe9\x02\x6e\x7b\xdf\xd6\xfe\xb2\x61\x5d\xe4\xfa\x69\xbd\x80\xf4\x9a\x2e\xfd\xf6\xb9\x04\xa8\x0f\x7b\x7f\x9b\x10\x75\x16\xa4\x94\x6c\x05\x80\xc3\xa7\x84\x34\x8b\xb4\x72\x6f\x1c\xb9\x27\x98\xe9\xa9\xc5\xd3\x2d\xd9\xe0\x04\x39\x1b\x97\x00\x16\x49\x2a\x23\x26\x52\x80\xe5\x6d\x35\x67\xc8\xaf\x0f\x52\xb0\x26\xba\x48\x62\x80\x9e", 252, { 0x22, 0x6d, 0xf8, 0x35, 0xbd, 0xbf, 0xa7, 0x3e, 0xc9, 0x19, 0xa3, 0x6b, 0x8d, 0x18, 0x57, 0x25 }, { 0xa4, 0x1d, 0x80, 0x1b, 0x12, 0xca, 0xa6, 0xcf, 0x9a, 0xf5, 0xeb, 0x36, 0xed, 0x5e, 0x9a, 0xf4 } }, { "\x4b\xda\xbe\xaa\xa1\xc6\x24\x5a\xb5\xeb\x18\xe3\x38\xc2\xc7\x65\xdb\x4f\x84\x4d\xea\x33\x72\xb9\xf4\x13\x79\x34\xd2\xa6\xa1\x98\x21\xbc\xb7\x93\x83\x9f\x5e\x39\xd0\x9c\xde\xb8\x86\x11\xbe\x24\x67\x03\x01\xf2\x17\x51\x02\x0a\xb5\x7f\xac\x6c\x2b\xdb\xb4\x89\xc9\xbc\x13\x2c\x19\xb0\x0f\x78\x92\x1e\x80\x30\x0f\xd7\x04\x6e\x50\xfa\x94\x92\x46\xcf\xa0\xb1\x65\x27\x21\x58\x9b\x6f\x80\x4b\x3b\x8e\x83\x57\xf0\x23\x4e\xea\x0d\x29\xfd\xb0\x1d\x13\xd6\x0b\x32\x75\xc1\xa6\x31\xed\x09\x0b\xfb\x20\xee\xd2\x23\xb0\x82\xaf\x58\x03\x12\x76\xc4\x3c\x0f\xbb\x94\xca\x58\xf5\x82\x1b\x5e\x9a\xe8\x6f\xc0\xa2\xb3\x67\xe4\x3b\x47\xc8\x6e\x53\x7a\x43\x98\x40\x71\x5f\xa3\x4d\x62\xb2\xed\x27\x94\xf0\x93\x0f\x54\xef\x97\xaf\x73\xcb\x88\x77\x05\xa9\xcd\x50\xe5\xa2\xf5\xfe\x5d\x76\xea\x31\x7f\xfa\x6e\xf2\xcb\x2c\xb0\xb9\xf5\x2c\x77\xf6\x07\xee\xeb\x48\xe1\x5c\x81\x25\xa6\xd2\xb0\x55\x9e\x91\xf5\x36\x84\x9c\x62\xbc\xd4\x36\x35\x2e\x6a\x3f\x47\x24\xf9\xda\x51\x4a\x90\xcd\x43\xcf\x4a\xcf\xa0\x31\x53\xbb\xcb\x8a\x1c\x03\xa7\x61\x63", 253, { 0x11, 0xd2, 0x45, 0x25, 0x40, 0xc5, 0xaf, 0x95, 0xd3, 0xf2, 0x5d, 0xba, 0xdc, 0xc0, 0xa1, 0x67 }, { 0x17, 0x17, 0x73, 0x50, 0x58, 0x8d, 0xfe, 0xd4, 0x13, 0xb7, 0x22, 0x77, 0x63, 0x98, 0x60, 0x92 } }, { "\xca\x46\x32\x44\x65\xf3\x56\x68\x2f\x32\x33\x4a\xa8\x2a\x40\x1d\xe6\x2a\x13\x1d\x99\x50\x06\x2b\xae\xb3\x80\x55\x72\x35\x02\xd5\x85\x0a\x2a\x72\x57\x89\x24\x26\x11\x54\xf5\x8d\x3c\xb8\x84\x43\xaa\x61\xec\x5e\x78\xf9\x60\x93\xdf\x56\xec\x5b\x21\xae\x6a\x4a\x20\x30\x95\x68\x94\xd5\x65\x2c\xed\xf7\xf2\x65\x84\x79\xb6\x28\x9f\x84\x4c\xcc\x1b\xa6\x2e\x78\xa7\xb0\xa8\x03\x44\x66\xfd\x8d\x51\x48\xdd\x81\x00\x6c\x6a\xf1\x85\x0c\xc5\xf5\xc5\x8a\xc3\x6a\x25\xc0\x3d\x7b\x7b\xaf\xa2\xae\x1e\xf8\xcd\x7d\x17\x55\xd4\x3c\xf7\x0e\x9c\x7c\xa0\x17\xc8\x89\x74\xf6\x37\x94\x26\xf3\x08\x2e\x6d\x19\xa1\x9c\x4a\xd3\x69\x89\x41\x6c\x4a\xdb\x26\x92\x2b\x25\x08\x4b\xf8\x4a\xae\x7d\x9b\xd5\x69\x36\x7e\x4d\xc5\xf8\x41\x4d\x21\xa9\x7b\x4d\x87\x3a\x24\x7e\xd3\xf1\xf0\x79\xe3\x9c\x9b\x49\xe7\x5e\x68\x9a\xb7\x9c\x13\x5a\x4e\xe8\x32\xda\x5d\x79\xea\x49\xbd\xdb\x0c\x4d\x2a\xb1\x76\xf1\x72\x50\xa2\x0a\xc6\xe0\x8c\x7c\x04\x48\xb4\x17\x72\x3a\xc9\x60\x1b\xe1\xc3\x0c\x78\x30\x9d\x54\xd4\x8e\xba\x48\xb0\xfb\xf4\xa7\x1c\x1e\xe9\xbf\x78\xd5", 254, { 0x81, 0x31, 0x20, 0x63, 0x77, 0x78, 0xe5, 0x03, 0x16, 0x9e, 0x01, 0x91, 0xb5, 0x94, 0x6d, 0x17 }, { 0xbb, 0x48, 0xb0, 0x9a, 0x25, 0x25, 0x04, 0x63, 0x3b, 0x54, 0xf1, 0x41, 0x02, 0xa7, 0x02, 0xb0 } }, { "\x80\x8c\x0b\x10\xd7\x08\xdc\x84\x3a\x07\x36\x56\xd9\x13\x02\x9f\x88\xb9\x6d\x57\x0e\xd6\x86\x9c\x19\x6c\xc7\x7b\x41\xc4\xaf\xd2\x92\x7c\x47\xc2\xe8\x21\xea\xc7\x60\xf9\xa9\x9f\x6c\x5c\x52\xf1\x87\x2b\x99\x30\xb0\xf0\x44\xc1\x4f\xbc\x06\x14\x3d\x10\xce\xa2\x6b\x65\x0d\x32\xcb\xb6\xf6\x48\xbf\x97\x73\x69\x5f\x8e\x1a\xac\x62\x2e\x5a\x40\xcc\xf3\x56\x1c\xe0\x3f\xc4\x97\xb2\x8d\xe1\xbf\x3e\x5c\xa6\x85\xba\xa7\xb7\x01\x05\x7f\x60\x11\x12\x1b\x7d\x04\x3e\x41\xc3\x5b\x11\x23\x4a\xfe\xe3\xbf\x97\x45\xc8\x7e\xf5\x63\xe4\xdf\x9a\xd9\x96\xbe\x56\x38\x1b\x71\x5c\x52\x6a\x14\x44\xd5\x74\x43\x86\xb8\xb3\x88\x67\xd2\xb4\x5c\x99\x3e\x63\x67\x8b\x80\xf5\xd6\x3c\x70\xeb\x8e\x1a\xb4\x75\xe6\xf0\x90\xc9\x57\x0c\xd4\x76\xc6\x42\xf8\xc5\x9a\x76\xc7\x89\x3b\x10\x5a\xde\x3e\x19\x67\x70\xca\x68\x79\x6c\x0b\x1d\x2e\x9c\x3e\x20\x17\xf1\xc4\x16\x5d\xa2\x42\xaf\xa5\x55\x93\x7c\x71\x9a\x66\x05\x10\x7a\xea\x68\xaf\x52\x3a\x4e\x66\x16\x70\xce\x54\x36\x98\xb4\x6a\x76\x2f\x88\x08\x05\x20\xfd\xa0\x87\x43\x43\x30\x9f\x5b\xc6\x71\x1e\x5a\xc1", 255, { 0x4a, 0x52, 0x36, 0x56, 0x39, 0x2e, 0xf0, 0x2f, 0xdd, 0x8b, 0x8a, 0x64, 0x35, 0x7f, 0xcb, 0x9d }, { 0x87, 0xe7, 0x8e, 0x84, 0xc3, 0xdf, 0xd4, 0xc2, 0xf2, 0x25, 0xe8, 0xa2, 0x91, 0x2e, 0x77, 0x54 } }, { "\x7b\xb0\xc7\x8a\x1a\x46\xee\xd3\x56\x09\xb5\x59\x2c\x47\xee\xaa\x98\x2d\x84\x26\xc7\xde\x9b\x3c\x3b\xbb\x93\x5a\xd8\x47\x2d\x8e\x9c\xe6\xcb\xe5\x62\xb4\x14\xa4\xd0\xc3\xef\xb6\x8a\x83\x88\x32\x38\x4d\x61\x8f\x17\xb2\x9f\x4b\x63\xba\x44\xe5\x76\x7b\x4b\xd1\xda\xc1\xd7\xec\x26\xa5\x61\xf3\xb3\xa6\xd4\x4e\xda\x27\xb7\xfb\x38\xef\x67\x81\x82\xc7\x20\xf6\xe3\x92\x09\x4f\xa0\x0e\x9b\x3f\xdc\xcc\xeb\x68\x8a\x36\x25\xfb\x24\x92\x9f\xd9\xfa\xcc\xba\x62\xd7\xdf\xf4\x14\x7a\x80\x5f\xcb\xe8\x52\x57\x61\xa7\x5d\xe7\xba\x64\x6f\xaa\xdc\x57\x08\xcf\x06\xec\xbd\x02\x80\x58\x7b\xd6\x1f\x9b\xde\x00\xac\x99\xff\xde\x5e\x82\x79\x4b\xa3\x06\x20\x16\x01\x20\x34\x1d\x10\x15\x66\xd9\x69\xd9\xf5\x6e\xb6\xdc\x22\x6a\xa9\x1a\x04\xbe\xee\xbf\xbb\xb6\x63\x6b\x52\xc3\x27\x86\x1e\xc3\xc7\xe3\x9e\xf8\x1d\x86\x06\x21\x6d\x56\xac\x95\xb2\x4a\xf5\x1f\xd6\x4c\xa8\xfa\x88\xea\xa3\x77\x0a\x23\xb0\x8f\xbf\xef\x73\xf5\x9a\xca\xea\x21\x95\x13\xbe\x2d\xa0\xf0\x9d\x64\xd4\xf1\x88\x49\xe7\x99\x7b\x07\xa9\x47\x6d\x15\x4d\x6e\xdb\x02\xf0\x62\xac\xf7\x8c", 256, { 0xd5, 0x92, 0x92, 0xc0, 0xa0, 0x79, 0x76, 0x19, 0x89, 0xe9, 0x10, 0x1d, 0xe5, 0xa7, 0x06, 0x5b }, { 0x7d, 0x4b, 0x58, 0xd6, 0xe2, 0xc0, 0xd7, 0xd8, 0x4d, 0x31, 0x4f, 0xb4, 0xac, 0x2b, 0x9b, 0xf4 } }, snapraid-14.9/cmdline/parity.c000066400000000000000000000612301522717156100163500ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "elem.h" #include "state.h" #include "parity.h" #include "handle.h" /** * Pseudo random limits for parity */ #define PARITY_LIMIT(size, split, level) \ size ? size + (123562341 + split * 634542351 + level * 983491341) % size : 0 /****************************************************************************/ /* parity */ block_off_t parity_allocated_size(struct snapraid_state* state) { block_off_t parity_block; tommy_node* i; /* compute the size of the parity file */ parity_block = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; /* start from the declared size */ block_off_t block = fs_size(disk); /* decrease the block until an allocated one, but part of a file */ /* we don't stop at deleted blocks, because we want to have them cleared */ /* if they are at the end of the parity */ while (block > parity_block && !block_has_file(fs_par2block_find(disk, block - 1))) --block; /* get the highest value */ if (block > parity_block) parity_block = block; } return parity_block; } block_off_t parity_used_size(struct snapraid_state* state) { block_off_t parity_block; tommy_node* i; /* compute the size of the parity file */ parity_block = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; /* start from the declared size */ block_off_t block = fs_size(disk); /* decrease the block until an used one */ while (block > parity_block && !block_has_file_and_valid_parity(fs_par2block_find(disk, block - 1))) --block; /* get the highest value */ if (block > parity_block) parity_block = block; } return parity_block; } void parity_overflow(struct snapraid_state* state, data_off_t size) { tommy_node* i; block_off_t blockalloc; int found = 0; /* don't report if everything is outside or if the file is not accessible */ if (size == 0) { return; } blockalloc = size / state->block_size; /* for all disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; tommy_node* j; /* for all files */ for (j = disk->filelist; j != 0; j = j->next) { struct snapraid_file* file = j->data; if (file->blockmax > 0) { block_off_t parity_pos = fs_file2par_get(disk, file, file->blockmax - 1); if (parity_pos >= blockalloc) { found = 1; log_tag("outofparity:%s:%s\n", disk->name, esc_tag(file->sub)); log_fatal(ESOFT, "outofparity %s%s\n", disk->dir, file->sub); } } } } if (found) { log_fatal(ESOFT, "\nInsufficient parity space. Data requires more parity than available.\n"); log_fatal(ESOFT, "Move the 'outofparity' files to a larger disk.\n"); } } void parity_size(struct snapraid_parity_handle* handle, data_off_t* out_size) { unsigned s; data_off_t size; /* now compute the size summing all the parity splits */ size = 0; for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; size += split->size; } *out_size = size; } int parity_create(struct snapraid_parity_handle* handle, const struct snapraid_parity* parity, unsigned level, int mode, uint32_t block_size, data_off_t limit_size) { unsigned s; data_off_t block_mask; /* mask of bits used by the block size */ block_mask = ((data_off_t)block_size) - 1; handle->level = level; handle->split_mac = 0; for (s = 0; s < parity->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; int ret; int flags; advise_init(&split->advise, mode); pathcpy(split->path, sizeof(split->path), parity->split_map[s].path); split->size = parity->split_map[s].size; split->limit_size = PARITY_LIMIT(limit_size, s, level); /* opening in sequential mode in Windows */ flags = O_RDWR | O_CREAT | O_BINARY | advise_flags(&split->advise); split->f = open(split->path, flags, 0600); if (split->f == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening parity file '%s'. %s.\n", split->path, strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* we have a valid file handle */ ++handle->split_mac; /* get the stat info */ ret = fstat(split->f, &split->st); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing parity file '%s'. %s.\n", split->path, strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* the initial valid size is the size on disk */ split->valid_size = split->st.st_size; /** * If the parity size is not yet set, set it now. * This happens when expanding the number of parities, * or when upgrading from a content file that has not split->size data. */ if (split->size == PARITY_SIZE_INVALID) { split->size = split->st.st_size; /* ensure that the resulting size if block aligned */ if ((split->size & block_mask) != 0) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Error in preallocated size of parity file '%s' with size %" PRIu64 " and block %u .\n", split->path, split->size, block_size); goto bail; /* LCOV_EXCL_STOP */ } } ret = advise_open(&split->advise, split->f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error advising parity file '%s'. %s.\n", split->path, strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } } return 0; bail: /* LCOV_EXCL_START */ for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; close(split->f); split->f = -1; } return -1; /* LCOV_EXCL_STOP */ } static int parity_handle_grow(struct snapraid_split_handle* split, data_off_t previous_size, data_off_t size, int skip_fallocate) { int ret; (void)previous_size; /* simulate a failure for testing limits */ if (split->limit_size != 0 && size > (data_off_t)split->limit_size) { errno = ENXIO; return -1; } #if HAVE_FALLOCATE if (!skip_fallocate) { /* * Allocate real space using the specific Linux fallocate() operation. * If the underline file-system doesn't support it, this operation fails. * * Instead posix_fallocate() fallbacks to write the whole file, * and we cannot use it as we may need to initialize a multi terabyte * file. * * See: fallocate vs posix_fallocate * http://stackoverflow.com/questions/14063046/fallocate-vs-posix-fallocate * * To work better with Btrfs, use as offset the previous allocated size. * Otherwise Btrfs will count as space needed even the already allocated one. * * See: Massive loss of disk space * https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg66454.html */ ret = fallocate(split->f, 0, previous_size, size - previous_size); /* * In some legacy system fallocate() may return the error number * as positive integer, and in this case it doesn't set errno. * * Detect and handle this case. * * See: Fix fallocate error return on i386 * https://sourceware.org/ml/libc-hacker/2010-04/msg00000.html * * See: [PATCH XFS] Fix error return for fallocate() on XFS * http://oss.sgi.com/archives/xfs/2009-11/msg00201.html */ if (ret > 0) { /* LCOV_EXCL_START */ errno = ret; ret = -1; /* LCOV_EXCL_STOP */ } } else { errno = EOPNOTSUPP; ret = -1; } /* * Fallback to ftruncate() if the operation is not supported. * * We get EOPNOTSUPP if the operation is not supported, like in ext3/ext2 * or ENOSYS with kernel before 2.6.23, because fallocate is not supported * at all. * * See: man fallocate * ENOSYS - This kernel does not implement fallocate(). * EOPNOTSUPP - The file system containing the file referred to by fd does not support this operation */ if (ret != 0 && (errno == EOPNOTSUPP || errno == ENOSYS)) { /* fallback using ftruncate() */ ret = ftruncate(split->f, size); } #else (void)skip_fallocate; /* avoid the warning */ /* allocate using a sparse file */ ret = ftruncate(split->f, size); #endif if (ret != 0) log_tag("split:grow:%s:%" PRIu64 ": failed with error %s\n", split->path, size, strerror(errno)); else log_tag("split:grow:%s:%" PRIu64 ": ok\n", split->path, size); return ret; } static int parity_handle_shrink(struct snapraid_split_handle* split, data_off_t size) { int ret; ret = ftruncate(split->f, size); if (ret != 0) log_tag("split:shrink:%s:%" PRIu64 ": failed with error %s\n", split->path, size, strerror(errno)); else log_tag("split:shrink:%s:%" PRIu64 ": ok\n", split->path, size); return ret; } /** * Get the highest bit set. */ uint64_t hbit_u64(uint64_t v) { unsigned ilog; ilog = 0; while ((v /= 2) != 0) ++ilog; return 1ULL << ilog; } static int parity_handle_fill(struct snapraid_split_handle* split, data_off_t size, uint32_t block_size, int skip_fallocate, int skip_space_holder) { data_off_t base; data_off_t delta; data_off_t block_mask; #ifdef _WIN32 /* * In Windows we want to avoid the annoying warning * message of disk full. * * To ensure to leave some space available, we first create * a spaceholder file >200 MB, to ensure to not fill completely * the disk. */ char spaceholder_path[PATH_MAX]; pathprint(spaceholder_path, sizeof(spaceholder_path), "%s%s", split->path, ".spaceholder"); if (!skip_space_holder) { int spaceholder_f; spaceholder_f = open(spaceholder_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0600); if (spaceholder_f == -1) { log_fatal(errno, "Failed to create space holder file '%s'.\n", spaceholder_path); return -1; } /* note that in Windows ftruncate is really allocating space */ if (ftruncate(spaceholder_f, WINDOWS_SPACEHOLDER_SIZE) != 0) { log_fatal(errno, "WARNING Failed to resize the space holder file '%s' to %u bytes.\n", spaceholder_path, WINDOWS_SPACEHOLDER_SIZE); log_fatal(errno, "Assuming that no more space is available.\n"); close(spaceholder_f); remove(spaceholder_path); return 0; } if (fsync(spaceholder_f) != 0) { log_fatal(errno, "Failed to sync the space holder file '%s'.\n", spaceholder_path); close(spaceholder_f); remove(spaceholder_path); return -1; } if (close(spaceholder_f) != 0) { log_fatal(errno, "Failed to close the space holder file '%s'.\n", spaceholder_path); remove(spaceholder_path); return -1; } } #else (void)skip_space_holder; #endif /* mask of bits used by the block size */ block_mask = ((data_off_t)block_size) - 1; /* present size */ base = split->st.st_size; /* truncate it to block size multiplier */ /* in case of damage the size may get wrong */ base &= ~block_mask; /* size we have to increase */ delta = size - base; log_tag("split:fill:%s:%" PRIu64 ":%" PRIu64 ":\n", split->path, base, size); /* grow the size one bit at time, like a kind of binary search */ while (delta != 0) { int ret; data_off_t run = hbit_u64(delta); /* mask out the bit we process */ delta &= ~run; log_tag("split:delta:%s:%" PRIu64 ":%" PRIu64 ":\n", split->path, base, run); ret = parity_handle_grow(split, base, base + run, skip_fallocate); if (ret != 0) { /* we cannot grow, fallback enabling all the smaller bits */ delta = run - 1; /* mask out the block size */ delta &= ~block_mask; } else { /* increase the effective size */ base += run; } } /* ensure that the resulting size if block aligned */ if ((base & block_mask) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in requested parity size %" PRIu64 " with block %u\n", base, block_size); os_abort(); /* LCOV_EXCL_STOP */ } #ifdef _WIN32 /* now delete the spaceholder file */ if (remove(spaceholder_path) != 0) { log_error(errno, "WARNING Failed to remove the space holder file '%s'.\n", spaceholder_path); log_error(errno, "Continuing anyway.\n"); } #endif /* shrink to the expected size to ensure to throw away any extra */ /* data allocated when the grow operation fails */ return parity_handle_shrink(split, base); } static int parity_handle_chsize(struct snapraid_split_handle* split, data_off_t size, uint32_t block_size, int skip_fallocate, int skip_space_holder) { int ret; int f_ret; int f_errno; int f_dir; if (split->st.st_size < size) { f_ret = parity_handle_fill(split, size, block_size, skip_fallocate, skip_space_holder); f_errno = errno; f_dir = 1; } else if (split->st.st_size > size) { f_ret = parity_handle_shrink(split, size); f_errno = errno; f_dir = -1; } else { f_ret = 0; f_errno = 0; f_dir = 0; } /* get the stat info */ ret = fstat(split->f, &split->st); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing parity file '%s'. %s.\n", split->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } /* now check the error */ if (f_ret != 0) { /* LCOV_EXCL_START */ if (f_dir > 0) { if (f_errno == ENOSPC) { log_fatal(errno, "Failed to grow parity file '%s' to size %" PRIu64 " due lack of space.\n", split->path, size); } else { log_fatal(errno, "Error growing parity file '%s' to size %" PRIu64 ". Do you have enough space? %s.\n", split->path, size, strerror(f_errno)); } } else { log_fatal(errno, "Error truncating parity file '%s' to size %" PRIu64 ". %s.\n", split->path, size, strerror(f_errno)); } return -1; /* LCOV_EXCL_STOP */ } /* if we shrink, update the valid size, but don't update when growing */ if (split->valid_size > split->st.st_size) split->valid_size = split->st.st_size; return 0; } static int parity_split_is_fixed(struct snapraid_parity_handle* handle, unsigned s) { /* next one */ ++s; /* the latest one is always growing */ if (s >= handle->split_mac) return 0; /* if the next it's 0, this one is growing */ if (handle->split_map[s].size == 0) return 0; return 1; } int parity_chsize(struct snapraid_parity_handle* handle, struct snapraid_parity* parity, int* is_modified, data_off_t size, uint32_t block_size, int skip_fallocate, int skip_space_holder) { int ret; unsigned s; data_off_t block_mask; /* mask of bits used by the block size */ block_mask = ((data_off_t)block_size) - 1; if (size < 0) { /* LCOV_EXCL_START */ errno = ENXIO; return -1; /* LCOV_EXCL_STOP */ } for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; int is_fixed = parity_split_is_fixed(handle, s); data_off_t run; if (is_fixed) { /* if the required size is smaller, we have to reduce also the file */ /* ignoring the previous size */ if (size <= split->size) { /* mark it as not fixed anymore for the later check */ is_fixed = 0; run = size; /* allocate only the needed size */ } else { /* if the size cannot be changed, use the fixed one */ run = split->size; if ((run & block_mask) != 0) { /* LCOV_EXCL_START */ errno = ENXIO; log_fatal(EINTERNAL, "Internal inconsistency in split '%s' size with extra '%" PRIu64 "' bytes.\n", split->path, run & block_mask); return -1; /* LCOV_EXCL_STOP */ } } } else { /* otherwise tries to allocate all the needed remaining size */ run = size; } ret = parity_handle_chsize(split, run, block_size, skip_fallocate, skip_space_holder); if (ret != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } if (split->st.st_size > run) { /* LCOV_EXCL_START */ errno = ENXIO; log_fatal(errno, "Unexpected over resizing parity file '%s' to size %" PRIu64 " resulting in size %" PRIu64 ".\n", split->path, run, (uint64_t)split->st.st_size); return -1; /* LCOV_EXCL_STOP */ } else if (is_fixed && split->st.st_size < run) { /* LCOV_EXCL_START */ errno = ENXIO; log_fatal(errno, "Failed restoring parity file '%s' to size %" PRIu64 " resulting in size %" PRIu64 ".\n", split->path, run, (uint64_t)split->st.st_size); return -1; /* LCOV_EXCL_STOP */ } else { /* here it's possible to get less than the requested size */ run = split->st.st_size; if ((run & block_mask) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in final parity size %" PRIu64 " with block size %u\n", run, block_size); os_abort(); /* LCOV_EXCL_STOP */ } /* store what we have allocated */ split->size = run; /* decrease the remaining size */ size -= run; } } /* if we cannot allocate all the space */ if (size != 0) { /* LCOV_EXCL_START */ errno = ENXIO; log_fatal(errno, "Failed to allocate all the required parity space. You miss %" PRIu64 " bytes.\n", size); return -1; /* LCOV_EXCL_STOP */ } /* now copy the new size in the parity data */ if (is_modified) *is_modified = 0; for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; if (parity->split_map[s].size != split->size) { parity->split_map[s].size = split->size; if (is_modified) *is_modified = 1; } } return 0; } int parity_open(struct snapraid_parity_handle* handle, const struct snapraid_parity* parity, unsigned level, int mode, uint32_t block_size, data_off_t limit_size) { unsigned s; data_off_t block_mask; handle->level = level; handle->split_mac = 0; /* mask of bits used by the block size */ block_mask = ((data_off_t)block_size) - 1; for (s = 0; s < parity->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; int ret; int flags; advise_init(&split->advise, mode); pathcpy(split->path, sizeof(split->path), parity->split_map[s].path); split->size = parity->split_map[s].size; split->limit_size = PARITY_LIMIT(limit_size, s, level); /* open for read */ /* O_NOATIME: do not change access time */ flags = O_RDONLY | O_BINARY | advise_flags(&split->advise); split->f = open_noatime(split->path, flags); if (split->f == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening parity file '%s'. %s.\n", split->path, strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* we have a valid file handle */ ++handle->split_mac; /* get the stat info */ ret = fstat(split->f, &split->st); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing parity file '%s'. %s.\n", split->path, strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* the initial valid size is the size on disk */ split->valid_size = split->st.st_size; /** * If the parity size is not yet set, set it now. * This happens when expanding the number of parities, * or when upgrading from a content file that has not split->size data. */ if (split->size == PARITY_SIZE_INVALID) { split->size = split->st.st_size; /* ensure that the resulting size if block aligned */ if ((split->size & block_mask) != 0) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Error in preallocated size of parity file '%s' with size %" PRIu64 " and block %u .\n", split->path, split->size, block_size); goto bail; /* LCOV_EXCL_STOP */ } } ret = advise_open(&split->advise, split->f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error advising parity file '%s'. %s.\n", split->path, strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } } return 0; bail: /* LCOV_EXCL_START */ for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; close(split->f); split->f = -1; } return -1; /* LCOV_EXCL_STOP */ } int parity_sync(struct snapraid_parity_handle* handle) { #if HAVE_FSYNC unsigned s; for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; int ret; /* Ensure that data changes are written to disk. */ /* This is required to ensure that parity is more updated than content */ /* in case of a system crash. */ ret = fsync(split->f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error syncing parity file '%s'. %s.\n", split->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } } #endif return 0; } int parity_truncate(struct snapraid_parity_handle* handle) { unsigned s; int f_ret = 0; for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; int ret; /* truncate any data that we know it's not valid */ ret = ftruncate(split->f, split->valid_size); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error truncating the parity file '%s' to size %" PRIu64 ". %s.\n", split->path, split->valid_size, strerror(errno)); f_ret = -1; /* LCOV_EXCL_STOP */ /* continue to truncate the others */ } } return f_ret; } int parity_close(struct snapraid_parity_handle* handle) { unsigned s; int f_ret = 0; for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; int ret; advise_close(&split->advise, split->f); ret = close(split->f); if (ret != 0) { /* LCOV_EXCL_START */ /* This is a serious error, as it may be the result of a failed write */ /* identified at later time. */ /* In a normal file-system (not NFS) it should never happen */ log_fatal(errno, "Error closing parity file '%s'. %s.\n", split->path, strerror(errno)); f_ret = -1; /* LCOV_EXCL_STOP */ /* continue to close the others */ } /* reset the descriptor */ split->f = -1; } return f_ret; } struct snapraid_split_handle* parity_split_find(struct snapraid_parity_handle* handle, data_off_t* offset) { unsigned s; if (*offset < 0) return 0; for (s = 0; s < handle->split_mac; ++s) { struct snapraid_split_handle* split = &handle->split_map[s]; if (*offset < split->size) return split; *offset -= split->size; } return 0; } int parity_write(struct snapraid_parity_handle* handle, block_off_t pos, unsigned char* block_buffer, unsigned block_size) { ssize_t write_ret; data_off_t offset; struct snapraid_split_handle* split; unsigned count; int ret; offset = pos * (data_off_t)block_size; split = parity_split_find(handle, &offset); if (!split) { /* LCOV_EXCL_START */ errno = ENXIO; log_fatal(errno, "Writing parity data outside range at extra offset %" PRIu64 ".\n", offset); return -1; /* LCOV_EXCL_STOP */ } /* update the valid range */ if (split->valid_size < offset + block_size) split->valid_size = offset + block_size; count = 0; do { bw_limit(handle->bw, block_size - count); write_ret = pwrite(split->f, block_buffer + count, block_size - count, offset + count); if (write_ret == -1) { /* LCOV_EXCL_START */ if (errno == ENOSPC) { log_fatal(errno, "Failed to grow parity file '%s' using write due lack of space.\n", split->path); } else { log_fatal(errno, "Error writing parity file '%s'. %s.\n", split->path, strerror(errno)); } return -1; /* LCOV_EXCL_STOP */ } if (write_ret == 0) { /* LCOV_EXCL_START */ errno = ENXIO; log_fatal(errno, "Unexpected 0 write to file '%s'. %s.\n", split->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } count += write_ret; } while (count < block_size); ret = advise_write(&split->advise, split->f, offset, block_size); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error advising parity file '%s'. %s.\n", split->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } return 0; } int parity_read(struct snapraid_parity_handle* handle, block_off_t pos, unsigned char* block_buffer, unsigned block_size) { ssize_t read_ret; data_off_t offset; unsigned count; struct snapraid_split_handle* split; int ret; offset = pos * (data_off_t)block_size; split = parity_split_find(handle, &offset); if (!split) { /* LCOV_EXCL_START */ errno = ENXIO; log_error(errno, "Reading parity data outside range at extra offset %" PRIu64 ".\n", offset); return -1; /* LCOV_EXCL_STOP */ } /* if read is completely out of the valid range */ if (offset >= split->valid_size) { /* LCOV_EXCL_START */ errno = ENXIO; log_error(errno, "Reading over the end from parity file '%s' at offset %" PRIu64 " for size %u.\n", split->path, offset, block_size); return -1; /* LCOV_EXCL_STOP */ } count = 0; errno = 0; do { bw_limit(handle->bw, block_size - count); read_ret = pread(split->f, block_buffer + count, block_size - count, offset + count); if (read_ret == -1) { /* LCOV_EXCL_START */ log_error(errno, "Error reading parity file '%s' at offset %" PRIu64 " for size %u. %s.\n", split->path, offset + count, block_size - count, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } if (read_ret == 0) { /* LCOV_EXCL_START */ if (errno == 0) errno = ENXIO; log_error(errno, "Unexpected end of parity file '%s' at offset %" PRIu64 ". %s.\n", split->path, offset, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } count += read_ret; } while (count < block_size); ret = advise_read(&split->advise, split->f, offset, block_size); if (ret != 0) { /* LCOV_EXCL_START */ log_error(errno, "Error advising parity file '%s'. %s.\n", split->path, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } return block_size; } snapraid-14.9/cmdline/parity.h000066400000000000000000000101161522717156100163520ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __PARITY_H #define __PARITY_H #include "support.h" #include "bw.h" #include "state.h" #include "io.h" /****************************************************************************/ /* parity */ struct snapraid_split_handle { char path[PATH_MAX]; /**< Path of the file. */ int f; /**< Handle of the files. */ struct stat st; /**< Stat info of the opened file. */ struct advise_struct advise; /**< Advise information. */ /** * Size of the parity split. * Only the latest not zero size is allowed to grow. * Note that this value CANNOT be PARITY_SIZE_INVALID. */ data_off_t size; /** * Valid size of the parity split. * This is the size effectively written, and not the result of a chsize operation. * It's used to make read operations failing if read over that size. * * Parity is also truncated to that size when fixing it, in case of a Break (Ctrl+C) * of the program. */ data_off_t valid_size; /** * Artificial size limit for testing. * 0 means unlimited. */ data_off_t limit_size; }; struct snapraid_parity_handle { struct snapraid_split_handle split_map[SPLIT_MAX]; unsigned split_mac; /**< Number of parity splits. */ unsigned level; /**< Level of the parity. */ struct snapraid_bw* bw; /**< Context for bandwidth limiting. */ }; /** * Compute the size of the allocated parity data in number of blocks. * * This includes parity blocks not yet written and still invalid. */ block_off_t parity_allocated_size(struct snapraid_state* state); /** * Compute the size of the used parity data in number of blocks. * * This includes only parity blocks used for files, not counting * potential invalid parity at the end. * * If the array is fully synced there is no difference between * parity_allocate_size() and parity_used_size(). * But if the sync is interrupted, the parity_used_size() returns * the position of the latest BLK block, ignoring CHG, REL and DELETED ones, * because their parity may be still not even written in the parity file. */ block_off_t parity_used_size(struct snapraid_state* state); /** * Report all the files outside the specified parity size. */ void parity_overflow(struct snapraid_state* state, data_off_t size); /** * Create the parity file. * \param out_size Return the size of the parity file. */ int parity_create(struct snapraid_parity_handle* handle, const struct snapraid_parity* parity, unsigned level, int mode, uint32_t block_size, data_off_t limit_size); /** * Change the parity size. * \param out_size Return the size of the parity file. The out_size is set also on error to reflect a partial resize. */ int parity_chsize(struct snapraid_parity_handle* handle, struct snapraid_parity* parity, int* is_modified, data_off_t size, uint32_t block_size, int skip_fallocate, int skip_space_holder); /** * Get the size of the parity. * * This returns the cached/expected version of the split sizes, and not the real file size. */ void parity_size(struct snapraid_parity_handle* handle, data_off_t* out_size); /** * Open an already existing parity file. */ int parity_open(struct snapraid_parity_handle* handle, const struct snapraid_parity* parity, unsigned level, int mode, uint32_t block_size, data_off_t limit_size); /** * Flush the parity file in the disk. */ int parity_sync(struct snapraid_parity_handle* handle); /** * Truncate the parity file to the valid size. */ int parity_truncate(struct snapraid_parity_handle* handle); /** * Close the parity file. */ int parity_close(struct snapraid_parity_handle* handle); /** * Read a block from the parity file. */ int parity_read(struct snapraid_parity_handle* handle, block_off_t pos, unsigned char* block_buffer, unsigned block_size); /** * Write a block in the parity file. */ int parity_write(struct snapraid_parity_handle* handle, block_off_t pos, unsigned char* block_buffer, unsigned block_size); /** * Flush and sync the parity files. */ int state_flush(struct snapraid_state* state, struct snapraid_io* io, struct snapraid_parity_handle* parity_handle, block_off_t blockcur); #endif snapraid-14.9/cmdline/pool.c000066400000000000000000000263061522717156100160160ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "elem.h" #include "state.h" struct snapraid_pool { char file[PATH_MAX]; char linkto[PATH_MAX]; int64_t mtime_sec; int mtime_nsec; /* nodes for data structures */ tommy_hashdyn_node node; }; struct snapraid_pool* pool_alloc(const char* dir, const char* name, const char* linkto, const struct stat* st) { struct snapraid_pool* pool; pool = malloc_nofail(sizeof(struct snapraid_pool)); pathprint(pool->file, sizeof(pool->file), "%s%s", dir, name); pathcpy(pool->linkto, sizeof(pool->linkto), linkto); pool->mtime_sec = st->st_mtime; pool->mtime_nsec = STAT_NSEC(st); return pool; } static inline tommy_uint32_t pool_hash(const char* file) { return tommy_hash_u32(0, file, strlen(file)); } void pool_free(struct snapraid_pool* pool) { free(pool); } int pool_compare(const void* void_arg, const void* void_data) { const char* arg = void_arg; const struct snapraid_pool* pool = void_data; return strcmp(arg, pool->file); } /** * Remove empty dir. * Return == 0 if the directory is empty, and it can be removed */ static int clean_dir(const char* dir) { DIR* d; int full = 0; d = opendir(dir); if (!d) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening pool directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } while (1) { char path_next[PATH_MAX]; struct stat st; const char* name; struct dirent* dd; /* clear errno to detect erroneous conditions */ errno = 0; dd = readdir(d); if (dd == 0 && errno != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading pool directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (dd == 0 && errno == 0) { break; /* finished */ } /* skip "." and ".." files */ name = dd->d_name; if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) continue; pathprint(path_next, sizeof(path_next), "%s%s", dir, name); #if HAVE_STRUCT_DIRENT_D_STAT /* convert dirent to lstat result */ dirent_lstat(dd, &st); /* if the st_mode field is missing, takes care to fill it using normal lstat() */ /* at now this can happen only in Windows */ if (st.st_mode == 0) { if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #else /* get lstat info about the file */ if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif if (S_ISDIR(st.st_mode)) { /* recurse */ pathslash(path_next, sizeof(path_next)); if (clean_dir(path_next) == 0) { int ret; /* directory is empty, try to remove it */ ret = rmdir(path_next); if (ret < 0) { #ifdef _WIN32 if (errno == EACCES) { /* in Windows just ignore EACCES errors removing directories */ /* because it could happen that the directory is in use */ /* and it cannot be removed */ log_fatal(errno, "Directory '%s' not removed because it's in use.\n", path_next); full = 1; } else #endif { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing pool directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } else { /* something is present */ full = 1; } } else { /* something is present */ full = 1; } } if (closedir(d) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing pool directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return full; } /** * Read all the links in a directory tree. */ static void read_dir(tommy_hashdyn* poolset, const char* base_dir, const char* sub_dir) { char dir[PATH_MAX]; DIR* d; pathprint(dir, sizeof(dir), "%s%s", base_dir, sub_dir); d = opendir(dir); if (!d) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening pool directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } while (1) { char path_next[PATH_MAX]; struct stat st; const char* name; struct dirent* dd; /* clear errno to detect erroneous conditions */ errno = 0; dd = readdir(d); if (dd == 0 && errno != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading pool directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (dd == 0 && errno == 0) { break; /* finished */ } /* skip "." and ".." files */ name = dd->d_name; if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) continue; pathprint(path_next, sizeof(path_next), "%s%s", dir, name); #if HAVE_STRUCT_DIRENT_D_STAT /* convert dirent to lstat result */ dirent_lstat(dd, &st); /* if the st_mode field is missing, takes care to fill it using normal lstat() */ /* at now this can happen only in Windows */ if (st.st_mode == 0) { if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #else /* get lstat info about the file */ if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif if (S_ISLNK(st.st_mode)) { struct snapraid_pool* pool; char linkto[PATH_MAX]; int ret; ret = readlink(path_next, linkto, sizeof(linkto)); if (ret < 0 || ret >= PATH_MAX) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in readlink symlink '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } linkto[ret] = 0; /* store the link info */ pool = pool_alloc(sub_dir, name, linkto, &st); tommy_hashdyn_insert(poolset, &pool->node, pool, pool_hash(pool->file)); } else if (S_ISDIR(st.st_mode)) { pathprint(path_next, sizeof(path_next), "%s%s/", sub_dir, name); read_dir(poolset, base_dir, path_next); } else { msg_verbose("Ignoring pool file '%s'\n", path_next); } } if (closedir(d) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing pool directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /** * Remove the link */ static void remove_link(void* void_arg, void* void_pool) { char path[PATH_MAX]; const char* arg = void_arg; struct snapraid_pool* pool = void_pool; int ret; pathprint(path, sizeof(path), "%s%s", arg, pool->file); /* delete the link */ ret = remove(path); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing symlink '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /** * Create a link to the specified disk link. */ static void make_link(tommy_hashdyn* poolset, const char* pool_dir, const char* share_dir, struct snapraid_disk* disk, const char* sub, int64_t mtime_sec, int mtime_nsec) { char path[PATH_MAX]; char linkto[PATH_MAX]; char linkto_exported[PATH_MAX]; struct snapraid_pool* found; int ret; /* make the source path */ pathprint(path, sizeof(path), "%s%s", pool_dir, sub); /* make the linkto path */ if (share_dir[0] != 0) { /* with a shared directory, use it */ pathprint(linkto, sizeof(linkto), "%s%s/%s", share_dir, disk->name, sub); } else { /* without a share directory, use the local disk paths */ pathprint(linkto, sizeof(linkto), "%s%s", disk->dir, sub); } /* search for the sub path */ found = tommy_hashdyn_search(poolset, pool_compare, sub, pool_hash(sub)); if (found) { /* remove from the set */ tommy_hashdyn_remove_existing(poolset, &found->node); /* check if the info match */ if (found->mtime_sec == mtime_sec && found->mtime_nsec == mtime_nsec && strcmp(found->linkto, linkto) == 0 ) { /* nothing to do */ pool_free(found); return; } /* delete the link */ ret = remove(path); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing symlink '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } pool_free(found); } /* create the ancestor directories */ ret = mkancestor(path); if (ret != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* convert back slashes */ pathexport(linkto_exported, sizeof(linkto_exported), linkto); /* create the symlink */ ret = symlink(linkto_exported, path); if (ret != 0) { if (errno == EEXIST) { log_fatal(errno, "WARNING! Duplicate pooling for '%s'\n", path); #ifdef _WIN32 } else if (errno == EPERM) { /* LCOV_EXCL_START */ log_fatal(errno, "You must run as Administrator to be able to create symlinks.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ #endif } else { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing symlink '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } if (mtime_sec) { ret = lmtime(path, mtime_sec, mtime_nsec); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error setting time to symlink '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } void state_pool(struct snapraid_state* state) { tommy_hashdyn poolset; tommy_node* i; char pool_dir[PATH_MAX]; char share_dir[PATH_MAX]; unsigned count; tommy_hashdyn_init(&poolset); if (state->pool[0] == 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "To use the 'pool' command you must set the pool directory in the configuration file\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } msg_progress("Reading...\n"); /* pool directory with final slash */ pathprint(pool_dir, sizeof(pool_dir), "%s", state->pool); pathslash(pool_dir, sizeof(pool_dir)); /* share directory with final slash */ pathprint(share_dir, sizeof(share_dir), "%s", state->share); pathslash(share_dir, sizeof(share_dir)); /* first read the previous pool tree */ read_dir(&poolset, pool_dir, ""); msg_progress("Writing...\n"); /* for each disk */ count = 0; for (i = state->disklist; i != 0; i = i->next) { tommy_node* j; struct snapraid_disk* disk = i->data; /* for each file */ for (j = disk->filelist; j != 0; j = j->next) { struct snapraid_file* file = j->data; make_link(&poolset, pool_dir, share_dir, disk, file->sub, file->mtime_sec, file->mtime_nsec); ++count; } /* for each link */ for (j = disk->linklist; j != 0; j = j->next) { struct snapraid_link* slink = j->data; make_link(&poolset, pool_dir, share_dir, disk, slink->sub, 0, 0); ++count; } /* we ignore empty dirs in disk->dir */ } msg_progress("Cleaning...\n"); /* delete all the remaining links */ tommy_hashdyn_foreach_arg(&poolset, (tommy_foreach_arg_func*)remove_link, pool_dir); /* delete empty dirs */ clean_dir(pool_dir); tommy_hashdyn_foreach(&poolset, (tommy_foreach_func*)pool_free); tommy_hashdyn_done(&poolset); if (count) msg_status("%u links\n", count); else msg_status("No link\n"); log_tag("summary:link_count::%u\n", count); log_tag("summary:exit:ok\n"); log_flush(); } snapraid-14.9/cmdline/portable.h000066400000000000000000000336171522717156100166650ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __PORTABLE_H #define __PORTABLE_H #if HAVE_CONFIG_H #include "config.h" /* Use " to include first in the same directory of this file */ #endif /***************************************************************************/ /* Config */ #ifdef __MINGW32__ /** * Enable the GNU printf functions instead of using the MSVCRT ones. * * Note that this is the default if _POSIX is also defined. * To disable it you have to set it to 0. */ #define __USE_MINGW_ANSI_STDIO 1 /** * Define the MSVCRT version targeting Windows Vista. */ #define __MSVCRT_VERSION__ 0x0600 /** * Include Windows Vista headers. * * Like for InitializeCriticalSection(). */ #define _WIN32_WINNT 0x600 /** * Undef as it clashes with windows.h declarations */ #undef DATADIR #include #endif /** * Specify the format attribute for printf. */ #ifdef __MINGW32__ #if defined(__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO == 1 #define attribute_printf gnu_printf /* GNU format */ #else #define attribute_printf ms_printf /* MSVCRT format */ #endif #else #define attribute_printf printf /* GNU format is the default one */ #endif /** * Compiler extension */ #ifndef __always_inline #define __always_inline inline __attribute__((always_inline)) #endif #ifndef __noreturn #define __noreturn __attribute__((noreturn)) #endif /** * Architecture for inline assembly. */ #if HAVE_ASSEMBLY #if defined(__i386__) #define CONFIG_X86 1 #define CONFIG_X86_32 1 #endif #if defined(__x86_64__) #define CONFIG_X86 1 #define CONFIG_X86_64 1 #endif #endif /** * Includes some platform specific headers. */ #if HAVE_SYS_PARAM_H #include #endif #if HAVE_SYS_MOUNT_H #include #endif #if HAVE_SYS_VFS_H #include #endif #if HAVE_SYS_STATFS_H #include #endif #if HAVE_SYS_FILE_H #include #endif #if HAVE_SYS_IOCTL_H #include #endif #if HAVE_LINUX_FS_H #include #endif #if HAVE_LINUX_FIEMAP_H #include #endif #if HAVE_BLKID_BLKID_H #include #if HAVE_BLKID_DEVNO_TO_DEVNAME && HAVE_BLKID_GET_TAG_VALUE #define HAVE_BLKID 1 #endif #endif /** * Includes some standard headers. */ #include #include /* On many systems (e.g., Darwin), `stdio.h' is a prerequisite. */ #include #include #include #include #include #include #include #include #if HAVE_STDINT_H #include #endif #if HAVE_INTTYPES_H #include #endif #if HAVE_UNISTD_H #include #endif #if TIME_WITH_SYS_TIME #include #include #else #if HAVE_SYS_TIME_H #include #else #include #endif #endif #if HAVE_MACH_MACH_TIME_H #include #endif #if HAVE_DIRENT_H #include #define NAMLEN(dirent) strlen((dirent)->d_name) #else #define dirent direct #define NAMLEN(dirent) (dirent)->d_namlen #if HAVE_SYS_NDIR_H #include #endif #if HAVE_SYS_DIR_H #include #endif #if HAVE_NDIR_H #include #endif #endif #if HAVE_SYS_TYPES_H #include #endif #if HAVE_SYS_MKDEV #include #endif #if HAVE_SYS_SYSMACROS_H #include #endif #if HAVE_SYS_STAT_H #include #endif #if HAVE_SYS_WAIT_H #include #endif #if HAVE_GETOPT_H #include #endif #if HAVE_MATH_H #include #endif #if HAVE_EXECINFO_H #include #endif #ifdef __APPLE__ #include #include #include #endif #if HAVE_IO_H #include #endif #if HAVE_GETOPT_LONG #define SWITCH_GETOPT_LONG(a, b) a #else #define SWITCH_GETOPT_LONG(a, b) b #endif /** * Enables lock file support. */ #if HAVE_FLOCK && HAVE_FTRUNCATE #define HAVE_LOCKFILE 1 #endif /** * Includes specific support for Windows or Linux. */ #ifdef __MINGW32__ #include "mingw.h" #else #include "unix.h" #endif /****************************************************************************/ /* os */ /** * Default paths. */ void os_default_conf(char* dst, size_t dst_size, const char* argv0); /** * Get the os_tick counter value. * * Note that the frequency is unspecified, because the time measure * is meant to be used to compare the ratio between usage times. */ uint64_t os_tick(void); /** * Get the os_tick counter value in millisecond. */ uint64_t os_tick_ms(void); /** * Initializes the system. */ void os_init(int opt); /** * Deinitialize the system. */ void os_done(void); /** * Abort the process with a stacktrace. */ void os_abort(void) __noreturn; /** * Clear the screen. */ void os_clear(void); /** * Global variable to identify if Ctrl+C is pressed. */ extern volatile int global_interrupt; /****************************************************************************/ /* app */ /** * Include list support to have tommy_node. */ #include "tommyds/tommylist.h" /** * Basic block position type. * With 32 bits and 128k blocks you can address 256 TB. */ typedef uint32_t block_off_t; /** * Basic data position type. * It's signed as file size and offset are usually signed. */ typedef int64_t data_off_t; /** * Another name for link() to avoid confusion with local variables called "link". */ static inline int hardlink(const char* a, const char* b) { return link(a, b); } /** * Get the device UUID. * Return 0 on success. */ int devuuid(uint64_t device, const char* path, char* uuid, size_t size); /** * Physical offset not yet read. */ #define FILEPHY_UNREAD_OFFSET 0 /** * Special value returned when the file-system doesn't report any offset for unknown reason. */ #define FILEPHY_UNREPORTED_OFFSET 1 /** * Special value returned when the file doesn't have a real offset. * For example, because it's stored in the NTFS MFT. */ #define FILEPHY_WITHOUT_OFFSET 2 /** * Value indicating real offsets. All offsets greater or equal at this one are real. */ #define FILEPHY_REAL_OFFSET 3 /** * Get the physical address of the specified file. * This is expected to be just a hint and not necessarily correct or unique. * Return 0 on success. */ int filephy(const char* path, uint64_t size, uint64_t* physical); /** * Check if the underline file-system support persistent inodes. * Return -1 on error, 0 on success. */ int fsinfo(const char* path, int* has_persistent_inode, int* has_syncronized_hardlinks, uint64_t* total_space, uint64_t* free_space, char* fstype, size_t fstype_size, char* fslabel, size_t fslabel_size); /** * Log file. * * This stream if fully buffered. * * If no log file is selected, it's 0. */ extern FILE* stdlog; /** * Exit codes for testing. */ extern int exit_success; extern int exit_failure; extern int exit_sync_needed; #undef EXIT_SUCCESS #undef EXIT_FAILURE #define EXIT_SUCCESS exit_success #define EXIT_FAILURE exit_failure #define EXIT_SYNC_NEEDED exit_sync_needed /** * Fill memory with pseudo-random values. */ int randomize(void* ptr, size_t size); /** * Standard SMART attributes. */ #define SMART_REALLOCATED_SECTOR_COUNT 5 #define SMART_POWER_ON_HOURS 9 #define SMART_POWER_CYCLE_COUNT 12 #define SMART_UNCORRECTABLE_ERROR_CNT 187 #define SMART_COMMAND_TIMEOUT 188 #define SMART_CURRENT_PENDING_SECTOR 197 #define SMART_OFFLINE_UNCORRECTABLE 198 #define SMART_START_STOP_COUNT 4 #define SMART_POWER_ON_HOURS 9 #define SMART_AIRFLOW_TEMPERATURE_CELSIUS 190 #define SMART_LOAD_CYCLE_COUNT 193 #define SMART_TEMPERATURE_CELSIUS 194 /** * Flags returned by smartctl via exit code */ #define SMART_FLAGS 256 /* * Counts command, transport, or controller-level errors reported by the device. * These reflect failed I/O operations not directly caused by media defects * (for example interface, firmware, or power-related errors). * This counter is cumulative and never resets to zero, even if the underlying * error condition is resolved. */ #define SMART_ERROR_PROTOCOL 257 /* * Counts media-level errors where data could not be reliably read or written. * These indicate actual storage surface or flash failures and may imply data loss. * This counter is cumulative and never resets to zero, even if the underlying * error condition is resolved. */ #define SMART_ERROR_MEDIUM 258 /** * Unified Wear Level Metric (0-100) * * Represents the remaining life of an SSD. * - 0: Brand new drive (0% wear). * - 100: Drive has reached or exceeded its manufacturer-rated design life. */ #define SMART_WEAR_LEVEL 259 /** * SMART attributes count. */ #define SMART_COUNT 260 /** * NVME custom SMART attributes * * The numbers are just arbitrary to put them in unused space */ #define SMART_NVME_CRITICAL_WARNING 100 #define SMART_NVME_AVAILABLE_SPARE 101 #define SMART_NVME_DATA_UNITS_READ 102 #define SMART_NVME_DATA_UNITS_WRITTEN 103 #define SMART_NVME_HOST_READ_COMMANDS 104 #define SMART_NVME_HOST_WRITE_COMMANDS 105 #define SMART_NVME_CONTROLLER_BUSY_TIME 106 #define SMART_NVME_UNSAFE_SHUTDOWNS 107 #define SMART_NVME_WARNING_COMP_TEMPERATURE_TIME 108 #define SMART_NVME_CRITICAL_COMP_TEMPERATURE_TIME 109 /** * Info attributes. */ #define INFO_SIZE 0 /**< Size in bytes. */ #define INFO_ROTATION_RATE 1 /**< Rotation speed. 0 for SSD. */ /** * Info attributes count. */ #define INFO_COUNT 2 /** * Max number of ignored smart attributes */ #define SMART_IGNORE_MAX 4 /** * Flags returned by smartctl. */ #define SMARTCTL_FLAG_UNSUPPORTED (1 << 0) /**< Device not recognized, requiring the -d option. */ #define SMARTCTL_FLAG_OPEN (1 << 1) /**< Device open or identification failed. */ #define SMARTCTL_FLAG_COMMAND (1 << 2) /**< Some SMART or ATA commands failed. This is a common error, also happening with full info gathering. */ #define SMARTCTL_FLAG_FAIL (1 << 3) /**< SMART status check returned "DISK FAILING". */ #define SMARTCTL_FLAG_PREFAIL (1 << 4) /**< We found prefail Attributes <= threshold. */ #define SMARTCTL_FLAG_PREFAIL_LOGGED (1 << 5) /**< SMART status check returned "DISK OK" but we found that some (usage or prefail) Attributes have been <= threshold at some time in the past. */ #define SMARTCTL_FLAG_ERROR_LOGGED (1 << 6) /**< The device error log contains records of errors. */ #define SMARTCTL_FLAG_SELFERROR_LOGGED (1 << 7) /**< The device self-test log contains records of errors. */ /** * SMART max attribute length. */ #define SMART_MAX 64 /** * Value for unassigned SMART attribute. */ #define SMART_UNASSIGNED 0xFFFFFFFFFFFFFFFFULL /** * SMART Attribute flags */ #define SMART_ATTR_TYPE_PREFAIL 1 #define SMART_ATTR_TYPE_OLDAGE 2 #define SMART_ATTR_UPDATE_ALWAYS 4 #define SMART_ATTR_UPDATE_OFFLINE 8 #define SMART_ATTR_WHEN_FAILED_NOW 16 #define SMART_ATTR_WHEN_FAILED_PAST 32 #define SMART_ATTR_WHEN_FAILED_NEVER 64 struct smart_attr { char name[128]; /**< SMART attribute name. */ uint64_t raw; /**< SMART attributes raw. It can be SMART_UNASSIGNED. */ uint64_t norm; /**< SMART attributes normalized. It can be SMART_UNASSIGNED even if raw is not. */ uint64_t worst; /**< SMART attributes worst. It can be SMART_UNASSIGNED even if raw/norm is not. */ uint64_t thresh; /**< SMART attributes threshold. It can be SMART_UNASSIGNED even if raw/norm/worst is not. */ int flags; /**< SMART_ATTR_* flags */ }; /** * Power mode */ #define POWER_STANDBY 0 #define POWER_ACTIVE 1 #define POWER_UNKNOWN -1 /** * Device info entry. */ struct devinfo_struct { uint64_t device; /**< Device ID. */ char name[PATH_MAX]; /**< Name of the disk combined with the split index if any */ char mount[PATH_MAX]; /**< Mount point or other contained directory. */ char smartctl[PATH_MAX]; /**< Options for smartctl. */ int smartignore[SMART_IGNORE_MAX]; /**< Attribues to ignore */ char file[PATH_MAX]; /**< File device. */ #ifdef _WIN32 char wfile[PATH_MAX]; /**< File device in Windows format. Like \\.\PhysicalDriveX, or \\?\Volume{X}. */ #endif struct devinfo_struct* parent; /**< Pointer at the parent if any. */ struct devinfo_struct* split; /**< Pointer at first split if this one is not the first. */ struct smart_attr smart[SMART_COUNT]; /**< All smart values. */ uint64_t info[INFO_COUNT]; /**< Informational attributes not related to SMART telemetry. */ uint64_t access_stat; /**< Access stat info. */ char serial[SMART_MAX]; /**< Serial number. */ char family[SMART_MAX]; /**< Family. */ char model[SMART_MAX]; /**< Model. */ char interf[SMART_MAX]; /**< Interface of the device: ata, sata, pata, nvme, usb */ int power; /**< POWER mode. */ #if HAVE_THREAD thread_id_t thread; #endif tommy_node node; }; typedef struct devinfo_struct devinfo_t; void device_name_set(devinfo_t* dev, const char* name, int index); #define DEVICE_LIST 0 #define DEVICE_DOWN 1 #define DEVICE_UP 2 #define DEVICE_SMART 3 #define DEVICE_PROBE 4 #define DEVICE_DOWNIFUP 5 /** * Query all the "high" level devices with the specified operation, * and produces a list of "low" level devices to operate on. * * The passed "low" device list must be already initialized. */ int devquery(tommy_list* high, tommy_list* low, int operation); /** * Fill with fake data the device list. */ int devtest(tommy_list* high, tommy_list* low, int operation); /** * Query all the "low" devices and log their unique identifiers */ int devmap(void); /** * Get the ambient temperature in degree * * Return 0 if not available. */ int ambient_temperature(void); /** * Size of the spaceholder file for Windows to avoid the message of low disk space */ #define WINDOWS_SPACEHOLDER_SIZE (256 * 1024 * 1024) /** * Generic errors */ #define EINTERNAL EFAULT /**< Internal assertion failed. */ #define EDATA EIO /**< Silent data corruption. */ #define ESOFT EINVAL /**< Software error, like permission denied. */ #define EUSER EINVAL /**< Invalid value specified by the user. */ #define EEXTERNAL EINVAL /**< Invalid external interface behaviour. */ #define ECONTENT EINVAL /**< Invalid content file. */ #define EENVIRONMENT EINVAL /**< Invalid physical environment, like temperature too high. */ #endif snapraid-14.9/cmdline/rehash.c000066400000000000000000000042201522717156100163060ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #include "portable.h" #include "util.h" #include "elem.h" #include "import.h" #include "state.h" #include "parity.h" #include "handle.h" #include "raid/raid.h" /****************************************************************************/ /* rehash */ void state_rehash(struct snapraid_state* state) { block_off_t blockmax; block_off_t i; blockmax = parity_allocated_size(state); /* check if a rehash is already in progress */ if (state->prevhash != HASH_UNDEFINED) { /* LCOV_EXCL_START */ log_tag("summary:exit:already_in_progress\n"); log_fatal(EUSER, "You already have a rehash in progress.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (state->hash == state->besthash) { /* LCOV_EXCL_START */ log_tag("summary:exit:not_required\n"); log_fatal(EUSER, "You are already using the best hash for your platform.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* copy the present hash as previous one */ state->prevhash = state->hash; memcpy(state->prevhashseed, state->hashseed, HASH_MAX); /* set the new hash and seed */ state->hash = state->besthash; if (randomize(state->hashseed, HASH_MAX) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to get random values.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* mark all the block for rehashing */ for (i = 0; i < blockmax; ++i) { snapraid_info info; /* if it's unused */ info = info_get(&state->infoarr, i); if (info == 0) { /* skip it */ continue; } if (info_get_rehash(info)) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency for a rehash already in progress\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* enable the rehash */ info = info_set_rehash(info); /* save it */ info_set(&state->infoarr, i, info); } /* save the new content file */ state->need_write = 1; msg_status("A rehash is now scheduled. It will take place progressively in the next\n"); msg_status("'sync' and 'scrub' commands. You can check the rehash progress using the\n"); msg_status("'status' command.\n"); log_tag("summary:exit:scheduled\n"); } snapraid-14.9/cmdline/resource.manifest000066400000000000000000000033161522717156100202540ustar00rootroot00000000000000 SnapRAID CLI true UTF-8 SegmentHeap snapraid-14.9/cmdline/resource.rc000066400000000000000000000016541522717156100170550ustar00rootroot00000000000000#include #include "../config.h" 1 RT_MANIFEST "resource.manifest" VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,0 PRODUCTVERSION 1,0,0,0 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN // 0409 = US English; 04b0 = Unicode (UTF-16) BLOCK "040904b0" BEGIN VALUE "CompanyName", "Andrea Mazzoleni" VALUE "FileDescription", "SnapRAID CLI" VALUE "FileVersion", PACKAGE_VERSION VALUE "InternalName", "snapraid" VALUE "LegalCopyright", "Copyright (C) 2026 Andrea Mazzoleni" VALUE "OriginalFilename", "snapraid.exe" VALUE "ProductName", "SnapRAID" VALUE "ProductVersion", PACKAGE_VERSION END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END snapraid-14.9/cmdline/scan.c000066400000000000000000002013041522717156100157620ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "elem.h" #include "state.h" #include "parity.h" static const char* es(int err) { if (is_hw(err)) return "error_io"; else return "error"; } struct snapraid_scan { struct snapraid_state* state; /**< State used. */ struct snapraid_disk* disk; /**< Disk used. */ thread_id_t thread; /**< Thread used for scanning the disk */ int is_diff; /**< If it's a diff command or a scanning */ int need_write; /**< If a state write is required */ /** * Counters of changes. */ unsigned count_equal; /**< Files equal. */ unsigned count_move; /**< Files with a different name, but equal inode, size and timestamp in the same disk. */ unsigned count_restore; /**< Files with equal name, size and timestamp, but different inode. */ unsigned count_change; /**< Files with same name, but different size and/or timestamp. */ unsigned count_copy; /**< Files new, with same name size and timestamp of a file in a different disk. */ unsigned count_relocate; /**< Like copy, but with the original disappeared. */ unsigned count_insert; /**< Files new. */ unsigned count_remove; /**< Files removed. */ tommy_list file_insert_list; /**< Files to insert. */ tommy_list link_insert_list; /**< Links to insert. */ tommy_list dir_insert_list; /**< Dirs to insert. */ tommy_list local_filter_list; /**< Filter list specific for the disk. */ /* nodes for data structures */ tommy_node node; }; static struct snapraid_scan* scan_alloc(struct snapraid_state* state, struct snapraid_disk* disk, int is_diff) { struct snapraid_scan* scan; scan = malloc_nofail(sizeof(struct snapraid_scan)); scan->state = state; scan->disk = disk; scan->count_equal = 0; scan->count_move = 0; scan->count_copy = 0; scan->count_relocate = 0; scan->count_restore = 0; scan->count_change = 0; scan->count_remove = 0; scan->count_insert = 0; tommy_list_init(&scan->file_insert_list); tommy_list_init(&scan->link_insert_list); tommy_list_init(&scan->dir_insert_list); tommy_list_init(&scan->local_filter_list); scan->is_diff = is_diff; scan->need_write = 0; #if HAVE_THREAD thread_mutex_init(&disk->stamp_mutex); #endif return scan; } static void scan_free(struct snapraid_scan* scan) { #if HAVE_THREAD thread_mutex_destroy(&scan->disk->stamp_mutex); #endif tommy_list_foreach(&scan->local_filter_list, filter_free); free(scan); } static void stamp_lock(struct snapraid_disk* disk) { #if HAVE_THREAD thread_mutex_lock(&disk->stamp_mutex); #else (void)disk; #endif } static void stamp_unlock(struct snapraid_disk* disk) { #if HAVE_THREAD thread_mutex_unlock(&disk->stamp_mutex); #else (void)disk; #endif } /** * Remove the specified link from the data set. */ static void scan_link_remove(struct snapraid_scan* scan, struct snapraid_link* slink) { struct snapraid_disk* disk = scan->disk; /* state changed */ scan->need_write = 1; /* remove the file from the link containers */ tommy_hashdyn_remove_existing(&disk->linkset, &slink->nodeset); tommy_list_remove_existing(&disk->linklist, &slink->nodelist); /* deallocate */ link_free(slink); } /** * Insert the specified link in the data set. */ static void scan_link_insert(struct snapraid_scan* scan, struct snapraid_link* slink) { struct snapraid_disk* disk = scan->disk; /* state changed */ scan->need_write = 1; /* insert the link in the link containers */ tommy_hashdyn_insert(&disk->linkset, &slink->nodeset, slink, link_name_hash(slink->sub)); tommy_list_insert_tail(&disk->linklist, &slink->nodelist, slink); } /** * Process a symbolic link. */ static void scan_link(struct snapraid_scan* scan, int is_diff, const char* sub, const char* linkto, unsigned link_flag) { struct snapraid_state* state = scan->state; struct snapraid_disk* disk = scan->disk; struct snapraid_link* slink; /* check if the link already exists */ slink = tommy_hashdyn_search(&disk->linkset, link_name_compare_to_arg, sub, link_name_hash(sub)); if (slink) { /* check if multiple files have the same name */ if (link_flag_has(slink, FILE_IS_PRESENT)) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency for link '%s%s'\n", disk->dir, sub); os_abort(); /* LCOV_EXCL_STOP */ } /* mark as present */ link_flag_set(slink, FILE_IS_PRESENT); /* check if the link is not changed and it's of the same kind */ if (strcmp(slink->linkto, linkto) == 0 && link_flag == link_flag_get(slink, FILE_IS_LINK_MASK)) { /* it's equal */ ++scan->count_equal; if (state->opt.gui_verbose) { log_tag("scan:equal:%s:%s\n", disk->name, esc_tag(slink->sub)); } } else { /* it's an update */ /* we have to save the linkto/type */ scan->need_write = 1; ++scan->count_change; log_tag("scan:update:%s:%s\n", disk->name, esc_tag(slink->sub)); if (is_diff) { msg_info("update %s\n", fmt_term(disk, slink->sub)); } /* update it */ free(slink->linkto); slink->linkto = strdup_nofail(linkto); link_flag_let(slink, link_flag, FILE_IS_LINK_MASK); } /* nothing more to do */ return; } else { /* create the new link */ ++scan->count_insert; log_tag("scan:add:%s:%s\n", disk->name, esc_tag(sub)); if (is_diff) { msg_info("add %s\n", fmt_term(disk, sub)); } /* and continue to insert it */ } /* insert it */ slink = link_alloc(sub, linkto, link_flag); /* mark it as present */ link_flag_set(slink, FILE_IS_PRESENT); /* insert it in the delayed insert list */ tommy_list_insert_tail(&scan->link_insert_list, &slink->nodelist, slink); } /** * Insert the specified file in the parity. */ static void scan_file_allocate(struct snapraid_scan* scan, struct snapraid_file* file) { struct snapraid_state* state = scan->state; struct snapraid_disk* disk = scan->disk; block_off_t i; block_off_t parity_pos; /* state changed */ scan->need_write = 1; /* allocate the blocks of the file */ parity_pos = disk->first_free_block; for (i = 0; i < file->blockmax; ++i) { struct snapraid_block* block; struct snapraid_block* over_block; snapraid_info info; /* increment the position until the first really free block */ while (block_has_file(fs_par2block_find(disk, parity_pos))) ++parity_pos; /* get block we are going to overwrite, if any */ over_block = fs_par2block_find(disk, parity_pos); /* deallocate it */ if (over_block != BLOCK_NULL) fs_deallocate(disk, parity_pos); /* get block specific info */ info = info_get(&state->infoarr, parity_pos); /* get the new block we are going to write */ block = fs_file2block_get(file, i); /* if the file block already has an updated hash without rehash */ if (block_has_updated_hash(block) && !info_get_rehash(info)) { /* the only possible case is for REP blocks */ assert(block_state_get(block) == BLOCK_STATE_REP); /* convert to a REP block */ block_state_set(block, BLOCK_STATE_REP); /* and keep the hash as it's */ } else { unsigned over_state; /* convert to a CHG block */ block_state_set(block, BLOCK_STATE_CHG); /* state of the block we are going to overwrite */ over_state = block_state_get(over_block); /* if the block is an empty one */ if (over_state == BLOCK_STATE_EMPTY) { /* the block was empty and filled with zeros */ /* set the hash to the special ZERO value */ hash_zero_set(block->hash); } else { /* otherwise it's a DELETED one */ assert(over_state == BLOCK_STATE_DELETED); /* copy the past hash of the block */ memcpy(block->hash, over_block->hash, BLOCK_HASH_SIZE); /* if we have not already cleared the past hash */ if (!state->clear_past_hash) { /* in this case we don't know if the old state is still the one */ /* stored inside the parity, because after an aborted sync, the parity */ /* may be or may be not have been updated with the new data */ /* Then we reset the hash to a bogus value */ /* For example: */ /* - One file is deleted */ /* - Sync aborted after, updating the parity to the new state, */ /* but without saving the content file representing this new state. */ /* - Another file is added again (exactly here) */ /* with the hash of DELETED block not representing the real parity state */ hash_invalid_set(block->hash); } } } /* store in the disk map, after invalidating all the other blocks */ fs_allocate(disk, parity_pos, file, i); /* set the new free position */ disk->first_free_block = parity_pos + 1; } /* insert in the list of contained files */ tommy_list_insert_tail(&disk->filelist, &file->nodelist, file); } /** * Delete the specified file from the parity. * * Note that the parity remains allocated, but the blocks and the file are marked as DELETED. * * The file pointer remain in memory and it's inserted in the deleted set. * * It should not be deallocated, as the parity still references it, and other threads * in the scanning process may reference it when searching for a copy in the "stampset". */ static void scan_file_deallocate(struct snapraid_scan* scan, struct snapraid_file* file) { struct snapraid_state* state = scan->state; struct snapraid_disk* disk = scan->disk; block_off_t i; /* remove from the list of contained files */ tommy_list_remove_existing(&disk->filelist, &file->nodelist); /* state changed */ scan->need_write = 1; /* here we are supposed to adjust the ::first_free_block position */ /* with the parity position we are deleting */ /* but we also know that we do only delayed insert, after all the deletion, */ /* so at this point ::first_free_block is always at 0, and we don't need to update it */ if (disk->first_free_block != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency for first free position at '%u' deallocating file '%s'\n", disk->first_free_block, file->sub); os_abort(); /* LCOV_EXCL_STOP */ } /* free all the blocks of the file */ for (i = 0; i < file->blockmax; ++i) { struct snapraid_block* block = fs_file2block_get(file, i); unsigned block_state; /* in case we scan after an aborted sync, */ /* we could get also intermediate states */ block_state = block_state_get(block); switch (block_state) { case BLOCK_STATE_BLK : /* we keep the hash making it an "old" hash, because the parity is still containing data for it */ break; case BLOCK_STATE_CHG : /* if we have not already cleared the past hash */ if (!state->clear_past_hash) { /* in these cases we don't know if the old state is still the one */ /* stored inside the parity, because after an aborted sync, the parity */ /* may be or may be not have been updated with the data that it's now */ /* deleted. Then we reset the hash to a bogus value. */ /* For example: */ /* - One file is added */ /* - Sync aborted after updating the parity to the new state, */ /* but without saving the content file representing this new state. */ /* - File is now deleted after the aborted sync */ /* - Sync again, deleting the blocks (exactly here) */ /* with the hash of CHG block not representing the real parity state */ hash_invalid_set(block->hash); } break; case BLOCK_STATE_REP : /* we just don't know the old hash, and then we set it to invalid */ hash_invalid_set(block->hash); break; default : /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in file '%s' deallocating block '%u:%u' state %u\n", file->sub, i, file->blockmax, block_state); os_abort(); /* LCOV_EXCL_STOP */ } /* set the block as deleted */ block_state_set(block, BLOCK_STATE_DELETED); } /* mark the file as deleted */ file_flag_set(file, FILE_IS_DELETED); /* insert it in the list of deleted blocks */ tommy_list_insert_tail(&disk->deletedlist, &file->nodelist, file); } static void scan_file_delayed_allocate(struct snapraid_scan* scan, struct snapraid_file* file) { struct snapraid_state* state = scan->state; struct snapraid_disk* disk = scan->disk; /* if we sort for physical offsets we have to read them for new files */ if (state->opt.force_order == SORT_PHYSICAL && file->physical == FILEPHY_UNREAD_OFFSET ) { char path_next[PATH_MAX]; pathprint(path_next, sizeof(path_next), "%s%s", disk->dir, file->sub); if (filephy(path_next, file->size, &file->physical) != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: File physycal offset error. %s.\n", es(errno), 0, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal(errno, "Error in getting the physical offset of file '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /* insert in the delayed list */ tommy_list_insert_tail(&scan->file_insert_list, &file->nodelist, file); } /** * Check if a file is completely formed of blocks with invalid parity, * and no rehash is tagged, and if it has at least one block. */ static int file_is_full_invalid_parity_and_stable(struct snapraid_state* state, struct snapraid_disk* disk, struct snapraid_file* file) { block_off_t i; /* with no block, it never has an invalid parity */ if (file->blockmax == 0) return 0; /* check all blocks */ for (i = 0; i < file->blockmax; ++i) { snapraid_info info; struct snapraid_block* block = fs_file2block_get(file, i); block_off_t parity_pos; /* exclude blocks with parity */ if (!block_has_invalid_parity(block)) return 0; /* * Get the parity position. * * Note that here we expect to always have mapped * parity, because kept files always have it. * * Anyway, checking for POS_NULL doesn't hurt. */ parity_pos = fs_file2par_find(disk, file, i); /* if it's not mapped, it cannot have rehash */ if (parity_pos != POS_NULL) { /* get block specific info */ info = info_get(&state->infoarr, parity_pos); /* if rehash fails */ if (info_get_rehash(info)) return 0; } } return 1; } /** * Check if a file is completely formed of blocks with an updated hash, * and no rehash is tagged, and if it has at least one block. */ static int file_is_full_hashed_and_stable(struct snapraid_state* state, struct snapraid_disk* disk, struct snapraid_file* file) { block_off_t i; /* with no block, it never has a hash */ if (file->blockmax == 0) return 0; /* check all blocks */ for (i = 0; i < file->blockmax; ++i) { snapraid_info info; struct snapraid_block* block = fs_file2block_get(file, i); block_off_t parity_pos; /* exclude blocks without hash */ if (!block_has_updated_hash(block)) return 0; /* * Get the parity position. * * Note that it's possible to have files * not mapped into the parity, even if they * have a valid hash. * * This happens for example, for 'copied' files * that have REP blocks, but not yet mapped. * * If there are multiple copies, it's also possible * that such files are used as 'source' to copy * hashes, and then to get them inside this function. */ parity_pos = fs_file2par_find(disk, file, i); /* if it's not mapped, it cannot have rehash */ if (parity_pos != POS_NULL) { /* get block specific info */ info = info_get(&state->infoarr, parity_pos); /* exclude blocks needing a rehash */ if (info_get_rehash(info)) return 0; } } return 1; } /** * Refresh the file info. * * This is needed by Windows as the normal way to list directories may report not * updated info. Only the GetFileInformationByHandle() func, called file-by-file, * really ensures to return synced info. * * If this happens, we read also the physical offset, to avoid to read it later. */ static void scan_file_refresh(struct snapraid_scan* scan, const char* sub, struct stat* st, uint64_t* physical) { #if HAVE_LSTAT_SYNC struct snapraid_state* state = scan->state; struct snapraid_disk* disk = scan->disk; /* if the st_sync is not set, ensure to get synced info */ if (st->st_sync == 0) { char path_next[PATH_MAX]; struct stat synced_st; pathprint(path_next, sizeof(path_next), "%s%s", disk->dir, sub); /* if we sort for physical offsets we have to read them for new files */ if (state->opt.force_order == SORT_PHYSICAL && *physical == FILEPHY_UNREAD_OFFSET ) { /* do nothing, leave the pointer to read the physical offset */ } else { physical = 0; /* set the pointer to 0 to read nothing */ } if (lstat_sync(path_next, &synced_st, physical) != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Stat error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(errno, "Error in stat file '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (st->st_mtime != synced_st.st_mtime || st->st_mtimensec != synced_st.st_mtimensec ) { #ifndef _WIN32 /* * In Windows having different metadata is expected with open files * because the metadata in the directory is updated only when the file * is closed. * * The same happens for hardlinks that duplicate metadata. * The link metadata is updated only when the link is opened. * This extends also to st_size and st_nlink. * * See also: * Why is the file size reported incorrectly for files that are still being written to? * http://blogs.msdn.com/b/oldnewthing/archive/2011/12/26/10251026.aspx */ log_tag("%s:%u:%s:%s: Uncached time change error.\n", es(ESOFT), 0, disk->name, esc_tag(sub)); log_error(ESOFT, "WARNING! Detected uncached time change from %" PRIu64 ".%09u to %" PRIu64 ".%09u for file '%s'\n", (uint64_t)st->st_mtime, (uint32_t)st->st_mtimensec, (uint64_t)synced_st.st_mtime, (uint32_t)synced_st.st_mtimensec, sub); log_error(ESOFT, "It's better if you run SnapRAID without other processes running.\n"); #endif st->st_mtime = synced_st.st_mtime; st->st_mtimensec = synced_st.st_mtimensec; } if (st->st_size != synced_st.st_size) { #ifndef _WIN32 log_tag("%s:%u:%s:%s: Uncached size change error.\n", es(ESOFT), 0, disk->name, esc_tag(sub)); log_error(ESOFT, "WARNING! Detected uncached size change from %" PRIu64 " to %" PRIu64 " for file '%s'\n", (uint64_t)st->st_size, (uint64_t)synced_st.st_size, sub); log_error(ESOFT, "It's better if you run SnapRAID without other processes running.\n"); #endif st->st_size = synced_st.st_size; } if (st->st_nlink != synced_st.st_nlink) { #ifndef _WIN32 log_tag("%s:%u:%s:%s: Uncached nlink change error.\n", es(ESOFT), 0, disk->name, esc_tag(sub)); log_error(ESOFT, "WARNING! Detected uncached nlink change from %u to %u for file '%s'\n", (uint32_t)st->st_nlink, (uint32_t)synced_st.st_nlink, sub); log_error(ESOFT, "It's better if you run SnapRAID without other processes running.\n"); #endif st->st_nlink = synced_st.st_nlink; } if (st->st_ino != synced_st.st_ino) { log_tag("%s:%u:%s:%s: Uncached inode change error.\n", es(ESOFT), 0, disk->name, esc_tag(sub)); log_fatal(ESOFT, "DANGER! Detected uncached inode change from %" PRIu64 " to %" PRIu64 " for file '%s'\n", (uint64_t)st->st_ino, (uint64_t)synced_st.st_ino, sub); log_fatal(ESOFT, "It's better if you run SnapRAID without other processes running.\n"); /* at this point, it's too late to change inode */ /* and having inconsistent inodes may result to internal failures */ /* so, it's better to abort */ exit(EXIT_FAILURE); } } #else (void)scan; (void)sub; (void)st; (void)physical; #endif } /** * Insert the file in the data set. */ static void scan_file_insert(struct snapraid_scan* scan, struct snapraid_file* file) { struct snapraid_disk* disk = scan->disk; /* insert the file in the containers */ if (!file_flag_has(file, FILE_IS_WITHOUT_INODE)) tommy_hashdyn_insert(&disk->inodeset, &file->nodeset, file, file_inode_hash(file->inode)); stamp_lock(disk); tommy_hashdyn_insert(&disk->pathset, &file->pathset, file, file_path_hash(file->sub)); tommy_hashdyn_insert(&disk->stampset, &file->stampset, file, file_stamp_hash(file->size, file->mtime_sec, file->mtime_nsec)); stamp_unlock(disk); /* delayed allocation of the parity */ scan_file_delayed_allocate(scan, file); } /** * Remove the file from the data set. * * File is then deleted. */ static void scan_file_remove(struct snapraid_scan* scan, struct snapraid_file* file) { struct snapraid_disk* disk = scan->disk; /* remove the file from the containers */ if (!file_flag_has(file, FILE_IS_WITHOUT_INODE)) tommy_hashdyn_remove_existing(&disk->inodeset, &file->nodeset); tommy_hashdyn_remove_existing(&disk->pathset, &file->pathset); stamp_lock(disk); tommy_hashdyn_remove_existing(&disk->stampset, &file->stampset); stamp_unlock(disk); /* deallocate the file from the parity */ scan_file_deallocate(scan, file); } /** * Keep the file as it's (or with only a name/inode modification). * * If the file is kept, nothing has to be done. * * But if a file contains only blocks with invalid parity, it's reallocated to ensure * to always minimize the space used in the parity. * * This could happen after a failed sync, when some other files are deleted, * and then new ones can be moved backward to fill the hole created. */ static void scan_file_keep(struct snapraid_scan* scan, struct snapraid_file* file) { struct snapraid_disk* disk = scan->disk; /* if the file is full invalid, schedule a reinsert at later stage */ if (file_is_full_invalid_parity_and_stable(scan->state, disk, file)) { struct snapraid_file* copy = file_dup(file); /* remove the file */ scan_file_remove(scan, file); /* reinsert the copy in the delayed list */ scan_file_insert(scan, copy); } } /** * Process a file. */ static void scan_file(struct snapraid_scan* scan, int is_diff, const char* sub, struct stat* st, uint64_t physical) { struct snapraid_state* state = scan->state; struct snapraid_disk* disk = scan->disk; struct snapraid_file* file; tommy_node* i; int is_original_file_size_different_than_zero; int is_file_already_present; data_off_t file_already_present_size; int64_t file_already_present_mtime_sec; int file_already_present_mtime_nsec; int is_file_reported; /* * If the disk has persistent inodes and UUID, try a search on the past inodes, * to detect moved files. * * For persistent inodes we mean inodes that keep their values when the file-system * is unmounted and remounted. This don't always happen. * * Cases found are: * - Linux FUSE with exFAT driver from https://code.google.com/p/exfat/. * Inodes are reassigned at every mount restarting from 1 and incrementing. * As worse, the exFAT support in FUSE doesn't use sub-second precision in timestamps * making inode collision more easy (exFAT by design supports 10ms precision). * - Linux VFAT kernel (3.2) driver. Inodes are fully reassigned at every mount. * * In such cases, to avoid possible random collisions, it's better to disable the moved * file recognition. * * For persistent UUID we mean that it has the same UUID as before. * Otherwise, if the UUID is changed, likely it's a new recreated file-system, * and then the inode have no meaning. * * Note that to disable the search by past inode, we do this implicitly * removing all the past inode before searching for files. * This ensures that no file is found with a past inode, but at the same time, * it allows to find new files with the same inode, to identify them as hardlinks. */ int has_past_inodes = !disk->has_volatile_inodes && !disk->has_different_uuid && !disk->has_unsupported_uuid; /* always search with the new inode, in the all new inodes found until now, */ /* with the eventual presence of also the past inodes */ uint64_t inode = st->st_ino; file = tommy_hashdyn_search(&disk->inodeset, file_inode_compare_to_arg, &inode, file_inode_hash(inode)); /* identify moved files with past inodes and hardlinks with the new inodes */ if (file) { /* check if the file is not changed */ if (file->size == st->st_size && file->mtime_sec == st->st_mtime && (file->mtime_nsec == STAT_NSEC(st) /* always accept the stored value if it's STAT_NSEC_INVALID */ /* it happens when upgrading from an old version of SnapRAID */ /* not yet supporting the nanosecond field */ || file->mtime_nsec == STAT_NSEC_INVALID ) ) { /* check if multiple files have the same inode */ if (file_flag_has(file, FILE_IS_PRESENT)) { /* if has_volatile_hardlinks is true, the nlink value is not reliable */ if (!disk->has_volatile_hardlinks && st->st_nlink == 1) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inode '%" PRIu64 "' inconsistency for file '%s%s' already present\n", (uint64_t)st->st_ino, disk->dir, sub); os_abort(); /* LCOV_EXCL_STOP */ } /* it's a hardlink */ scan_link(scan, is_diff, sub, file->sub, FILE_IS_HARDLINK); return; } /* mark as present */ file_flag_set(file, FILE_IS_PRESENT); /* update the nanoseconds mtime only if different */ /* to avoid unneeded updates */ if (file->mtime_nsec == STAT_NSEC_INVALID && STAT_NSEC(st) != file->mtime_nsec ) { file->mtime_nsec = STAT_NSEC(st); /* we have to save the new mtime */ scan->need_write = 1; } if (strcmp(file->sub, sub) != 0) { /* if the path is different, it means a moved file with the same inode */ ++scan->count_move; log_tag("scan:move:%s:%s:%s\n", disk->name, esc_tag(file->sub), esc_tag(sub)); if (is_diff) { msg_info("move %s -> %s\n", fmt_term(disk, file->sub), fmt_term(disk, sub)); } /* remove from the name set */ tommy_hashdyn_remove_existing(&disk->pathset, &file->pathset); /* * Protect the file->sub mutation because other threads may concurrently * search the stampset and read this file's name string inside * file_namestamp_compare/file_pathstamp_compare, or when doing * a pathcpy() during copy detection. */ stamp_lock(disk); file_rename(file, sub); stamp_unlock(disk); /* reinsert in the name set */ tommy_hashdyn_insert(&disk->pathset, &file->pathset, file, file_path_hash(file->sub)); /* we have to save the new name */ scan->need_write = 1; } else { /* otherwise it's equal */ ++scan->count_equal; if (state->opt.gui_verbose) { log_tag("scan:equal:%s:%s\n", disk->name, esc_tag(file->sub)); } } /* mark the file as kept */ scan_file_keep(scan, file); /* nothing more to do */ return; } /* * Here the file matches the inode, but not the other info * * It could be a modified file with the same name, * or a restored/copied file that get assigned a previously used inode, * or a file-system with not persistent inodes. * * In NTFS it could be also a hardlink, because in NTFS * hardlink don't share the same directory information, * like attribute and time. * * For example: * C:> echo A > A * C:> mklink /H B A * ...wait one minute * C:> echo AAAAAAAAAAAAAA > A * C:> dir * ...both time and size of A and B don't match! */ if (file_flag_has(file, FILE_IS_PRESENT)) { /* if has_volatile_hardlinks is true, the nlink value is not reliable */ if (!disk->has_volatile_hardlinks && st->st_nlink == 1) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inode '%" PRIu64 "' inconsistency for files '%s%s' and '%s%s' with same inode but different attributes: size %" PRIu64 "?%" PRIu64 ", sec %" PRIu64 "?%" PRIu64 ", nsec %d?%d\n", file->inode, disk->dir, sub, disk->dir, file->sub, file->size, (uint64_t)st->st_size, file->mtime_sec, (uint64_t)st->st_mtime, file->mtime_nsec, STAT_NSEC(st)); os_abort(); /* LCOV_EXCL_STOP */ } /* LCOV_EXCL_START */ /* suppose it's hardlink with not synced metadata */ scan_link(scan, is_diff, sub, file->sub, FILE_IS_HARDLINK); return; /* LCOV_EXCL_STOP */ } /* assume a previously used inode, it's the worst case */ /* and we handle it removing the duplicate stored inode. */ /* If the file is found by name later, it will have the inode restored, */ /* otherwise, it will get removed */ /* remove from the inode set */ tommy_hashdyn_remove_existing(&disk->inodeset, &file->nodeset); /* clear the inode */ /* this is not really needed for correct functionality */ /* because we are going to set FILE_IS_WITHOUT_INODE */ /* but it's easier for debugging to have invalid inodes set to 0 */ file->inode = 0; /* mark as missing inode */ file_flag_set(file, FILE_IS_WITHOUT_INODE); /* go further to find it by name */ } /* initialize for later overwrite */ is_file_reported = 0; is_original_file_size_different_than_zero = 0; /* then try finding it by name */ file = tommy_hashdyn_search(&disk->pathset, file_path_compare_to_arg, sub, file_path_hash(sub)); /* keep track if the file already exists */ is_file_already_present = file != 0; if (is_file_already_present) { /* if the file is without an inode */ if (file_flag_has(file, FILE_IS_WITHOUT_INODE)) { /* set it now */ file->inode = st->st_ino; /* insert in the set */ tommy_hashdyn_insert(&disk->inodeset, &file->nodeset, file, file_inode_hash(file->inode)); /* unmark as missing inode */ file_flag_clear(file, FILE_IS_WITHOUT_INODE); } else { /* here the inode has to be different, otherwise we would have found it before */ if (file->inode == st->st_ino) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in inode '%" PRIu64 "' for files '%s%s' as unexpected matching\n", file->inode, disk->dir, sub); os_abort(); /* LCOV_EXCL_STOP */ } } /* for sure it cannot be already present */ if (file_flag_has(file, FILE_IS_PRESENT)) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in path for file '%s%s' matching and already present\n", disk->dir, sub); os_abort(); /* LCOV_EXCL_STOP */ } /* check if the file is not changed */ if (file->size == st->st_size && file->mtime_sec == st->st_mtime && (file->mtime_nsec == STAT_NSEC(st) /* always accept the stored value if it's STAT_NSEC_INVALID */ /* it happens when upgrading from an old version of SnapRAID */ /* not yet supporting the nanosecond field */ || file->mtime_nsec == STAT_NSEC_INVALID ) ) { /* mark as present */ file_flag_set(file, FILE_IS_PRESENT); /* update the nano seconds mtime only if different */ /* to avoid unneeded updates */ if (file->mtime_nsec == STAT_NSEC_INVALID && STAT_NSEC(st) != STAT_NSEC_INVALID ) { file->mtime_nsec = STAT_NSEC(st); /* we have to save the new mtime */ scan->need_write = 1; } /* if when processing the disk we used the past inodes values */ if (has_past_inodes) { /* if persistent inodes are supported, we are sure that the inode number */ /* is now different, because otherwise the file would have been found */ /* when searching by inode. */ /* if the inode is different, it means a rewritten file with the same path */ /* like when restoring a backup that restores also the timestamp */ ++scan->count_restore; log_tag("scan:restore:%s:%s\n", disk->name, esc_tag(sub)); if (is_diff) { msg_info("restore %s\n", fmt_term(disk, sub)); } /* remove from the inode set */ tommy_hashdyn_remove_existing(&disk->inodeset, &file->nodeset); /* save the new inode */ file->inode = st->st_ino; /* reinsert in the inode set */ tommy_hashdyn_insert(&disk->inodeset, &file->nodeset, file, file_inode_hash(file->inode)); /* we have to save the new inode */ scan->need_write = 1; } else { /* otherwise it's the case of not persistent inode, where doesn't */ /* matter if the inode is different or equal, because they have no */ /* meaning, and then we don't even save them */ ++scan->count_equal; if (state->opt.gui_verbose) { log_tag("scan:equal:%s:%s\n", disk->name, esc_tag(file->sub)); } } /* mark the file as kept */ scan_file_keep(scan, file); /* nothing more to do */ return; } /* here if the file is changed but with the correct name */ /* save the info for later printout */ file_already_present_size = file->size; file_already_present_mtime_sec = file->mtime_sec; file_already_present_mtime_nsec = file->mtime_nsec; /* keep track if the original file was not of zero size */ is_original_file_size_different_than_zero = file->size != 0; /* remove it, and continue to insert it again */ scan_file_remove(scan, file); /* and continue to insert it again */ } else { file_already_present_size = 0; file_already_present_mtime_sec = 0; file_already_present_mtime_nsec = 0; } /* refresh the info, to ensure that they are synced, */ /* note that we refresh only the info of the new or modified files */ /* because this is slow operation */ scan_file_refresh(scan, sub, st, &physical); #ifndef _WIN32 /* do a safety check to ensure that the common ext4 case of zeroing */ /* the size of a file after a crash doesn't propagate to the backup */ /* this check is specific for Linux, so we disable it on Windows */ if (is_original_file_size_different_than_zero && st->st_size == 0) { if (!state->opt.force_zero) { /* LCOV_EXCL_START */ log_error(ESOFT, "The file '%s%s' has unexpected zero size!\n", disk->dir, sub); log_error(ESOFT, "It's possible that after a kernel crash this file was lost,\n"); log_error(ESOFT, "and you can use 'snapraid fix -f /%s' to recover it.\n", fmt_poll(disk, sub)); if (!is_diff) { log_fatal(ESOFT, "If this an expected condition you can '%s' anyway using 'snapraid --force-zero %s'\n", state->command, state->command); exit(EXIT_FAILURE); } /* LCOV_EXCL_STOP */ } } #else /* avoid the unused warning in Windows */ (void)is_original_file_size_different_than_zero; #endif /* insert it */ file = file_alloc(state->block_size, sub, st->st_size, st->st_mtime, STAT_NSEC(st), st->st_ino, physical); /* mark it as present */ file_flag_set(file, FILE_IS_PRESENT); /* if copy detection is enabled */ /* note that the copy detection is tried also for updated files */ /* this makes sense because it may happen to have two different copies */ /* of the same file, and we move the right one over the wrong one */ /* in such case we have a "copy" over an "update" */ if (!state->opt.force_nocopy) { tommy_uint32_t hash = file_stamp_hash(file->size, file->mtime_sec, file->mtime_nsec); /* search for a file with the same name and stamp in all the disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* other_disk = i->data; struct snapraid_file* other_file; char sub_other[PATH_MAX]; stamp_lock(other_disk); /* if the nanosecond part of the time stamp is valid, search */ /* for name and stamp, otherwise for path and stamp */ if (file->mtime_nsec != 0 && file->mtime_nsec != STAT_NSEC_INVALID) other_file = tommy_hashdyn_search(&other_disk->stampset, file_namestamp_compare, file, hash); else other_file = tommy_hashdyn_search(&other_disk->stampset, file_pathstamp_compare, file, hash); if (other_file) { /* copy sub path safely before unlocking stamp_lock */ pathcpy(sub_other, sizeof(sub_other), other_file->sub); } stamp_unlock(other_disk); /* if found, and it's a fully hashed file */ if (other_file && file_is_full_hashed_and_stable(scan->state, other_disk, other_file)) { char path_other[PATH_MAX]; struct stat other_st; stamp_lock(other_disk); file_flag_set(other_file, FILE_IS_RELOCATED); stamp_unlock(other_disk); /* assume that the file is a copy, and reuse the hash */ file_copy(other_file, file); /* check if other file still exists */ pathprint(path_other, sizeof(path_other), "%s%s", other_disk->dir, sub_other); if (lstat(path_other, &other_st) == 0) { ++scan->count_copy; log_tag("scan:copy:%s:%s:%s:%s\n", other_disk->name, esc_tag(sub_other), disk->name, esc_tag(file->sub)); if (is_diff) { msg_info("copy %s -> %s\n", fmt_term(other_disk, sub_other), fmt_term(disk, file->sub)); } } else { ++scan->count_relocate; log_tag("scan:relocate:%s:%s:%s:%s\n", other_disk->name, esc_tag(sub_other), disk->name, esc_tag(file->sub)); if (is_diff) { msg_info("relocate %s -> %s\n", fmt_term(other_disk, sub_other), fmt_term(disk, file->sub)); } } /* mark it as reported */ is_file_reported = 1; /* no need to continue the search */ break; } } } /* if not yet reported, do it now */ /* we postpone this to avoid to print two times the copied files */ if (!is_file_reported) { if (is_file_already_present) { ++scan->count_change; log_tag("scan:update:%s:%s: %" PRIu64 " %" PRIu64 ".%d -> %" PRIu64 " %" PRIu64 ".%d\n", disk->name, esc_tag(sub), file_already_present_size, file_already_present_mtime_sec, file_already_present_mtime_nsec, file->size, file->mtime_sec, file->mtime_nsec ); if (is_diff) { msg_info("update %s\n", fmt_term(disk, sub)); } } else { ++scan->count_insert; log_tag("scan:add:%s:%s\n", disk->name, esc_tag(sub)); if (is_diff) { msg_info("add %s\n", fmt_term(disk, sub)); } } } /* insert the file in the delayed list */ scan_file_insert(scan, file); } /** * Remove the specified dir from the data set. */ static void scan_emptydir_remove(struct snapraid_scan* scan, struct snapraid_dir* dir) { struct snapraid_disk* disk = scan->disk; /* state changed */ scan->need_write = 1; /* remove the file from the dir containers */ tommy_hashdyn_remove_existing(&disk->dirset, &dir->nodeset); tommy_list_remove_existing(&disk->dirlist, &dir->nodelist); /* deallocate */ dir_free(dir); } /** * Insert the specified dir in the data set. */ static void scan_emptydir_insert(struct snapraid_scan* scan, struct snapraid_dir* dir) { struct snapraid_disk* disk = scan->disk; /* state changed */ scan->need_write = 1; /* insert the dir in the dir containers */ tommy_hashdyn_insert(&disk->dirset, &dir->nodeset, dir, dir_name_hash(dir->sub)); tommy_list_insert_tail(&disk->dirlist, &dir->nodelist, dir); } /** * Process a dir. */ static void scan_emptydir(struct snapraid_scan* scan, const char* sub) { struct snapraid_disk* disk = scan->disk; struct snapraid_dir* dir; /* check if the dir already exists */ dir = tommy_hashdyn_search(&disk->dirset, dir_name_compare, sub, dir_name_hash(sub)); if (dir) { /* check if multiple files have the same name */ if (dir_flag_has(dir, FILE_IS_PRESENT)) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency for dir '%s%s'\n", disk->dir, sub); os_abort(); /* LCOV_EXCL_STOP */ } /* mark as present */ dir_flag_set(dir, FILE_IS_PRESENT); /* nothing more to do */ return; } else { /* and continue to insert it */ } /* insert it */ dir = dir_alloc(sub); /* mark it as present */ dir_flag_set(dir, FILE_IS_PRESENT); /* insert it in the delayed insert list */ tommy_list_insert_tail(&scan->dir_insert_list, &dir->nodelist, dir); } struct dirent_sorted { /* node for data structures */ tommy_node node; #if HAVE_STRUCT_DIRENT_D_INO uint64_t d_ino; /**< Inode number. */ #endif #if HAVE_STRUCT_DIRENT_D_TYPE uint32_t d_type; /**< File type. */ #endif #if HAVE_STRUCT_DIRENT_D_STAT struct stat d_stat; /**< Stat result. */ #endif char d_name[]; /**< Variable length name. It must be the last field. */ }; #if HAVE_STRUCT_DIRENT_D_INO static int dd_ino_compare(const void* void_a, const void* void_b) { const struct dirent_sorted* a = void_a; const struct dirent_sorted* b = void_b; if (a->d_ino < b->d_ino) return -1; if (a->d_ino > b->d_ino) return 1; return 0; } #endif static int dd_name_compare(const void* void_a, const void* void_b) { const struct dirent_sorted* a = void_a; const struct dirent_sorted* b = void_b; return strcmp(a->d_name, b->d_name); } /** * Return the stat info of a dir entry. */ #if HAVE_STRUCT_DIRENT_D_STAT #define DSTAT(file, dd, buf) dstat(dd) struct stat* dstat(struct dirent_sorted* dd) { return &dd->d_stat; } #else #define DSTAT(file, dd, buf) dstat(disk, file, buf) struct stat* dstat(struct snapraid_disk* disk, const char* file, struct stat* st) { if (lstat(file, st) != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Stat error. %s.\n", es(errno), 0, disk->name, esc_tag(file), strerror(errno)); log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", file, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return st; } #endif /** * Process a directory. * Return != 0 if at least one file or link is processed. */ static int scan_sub(struct snapraid_scan* scan, int level, int is_diff, char* path_next, char* sub_next, char* tmp) { struct snapraid_state* state = scan->state; struct snapraid_disk* disk = scan->disk; int processed = 0; DIR* d; tommy_list list; tommy_node* node; size_t path_len; size_t sub_len; path_len = strlen(path_next); sub_len = strlen(sub_next); tommy_list_init(&list); d = opendir(path_next); if (!d) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Open dir error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(errno, "Error opening directory '%s'. %s.\n", path_next, strerror(errno)); if (level == 0) log_fatal(errno, "If this is the disk mount point, remember to create it manually\n"); else log_fatal(errno, "If it's a permission problem, you can exclude it in the config file with: exclude /%s\n", sub_next); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* read the full directory */ while (1) { struct dirent_sorted* entry; const char* name; struct dirent* dd; size_t name_len; /* * Clear errno to differentiate the end of the stream and an error condition * * From the Linux readdir() manpage: * "If the end of the directory stream is reached, NULL is returned and errno is not changed. * If an error occurs, NULL is returned and errno is set appropriately." */ errno = 0; dd = readdir(d); if (dd == 0 && errno != 0) { /* LCOV_EXCL_START */ /* restore removing additions */ path_next[path_len] = 0; sub_next[sub_len] = 0; log_tag("%s:%u:%s:%s: Read dir error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(errno, "Error reading directory '%s'. %s.\n", path_next, strerror(errno)); log_fatal(errno, "You can exclude it in the config file with: exclude /%s\n", sub_next); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (dd == 0) { break; /* finished */ } /* skip "." and ".." files */ name = dd->d_name; if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) continue; pathcatl(path_next, path_len, PATH_MAX, name); /* check for not supported file names */ if (name[0] == 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Unsupported name error.\n", es(ESOFT), 0, disk->name, esc_tag(path_next)); log_fatal(ESOFT, "Unsupported name '%s' in file '%s'.\n", name, path_next); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* exclude hidden files even before calling lstat() */ if (filter_hidden(state->filter_hidden, dd) != 0) { msg_verbose("Excluding hidden '%s'\n", path_next); continue; } /* exclude content files even before calling lstat() */ if (filter_content(&state->contentlist, path_next) != 0) { msg_verbose("Excluding content '%s'\n", path_next); continue; } name_len = strlen(dd->d_name); entry = malloc_nofail(sizeof(struct dirent_sorted) + name_len + 1); /* copy the dir entry */ #if HAVE_STRUCT_DIRENT_D_INO entry->d_ino = dd->d_ino; #endif #if HAVE_STRUCT_DIRENT_D_TYPE entry->d_type = dd->d_type; #endif #if HAVE_STRUCT_DIRENT_D_STAT /* convert dirent to lstat result */ dirent_lstat(dd, &entry->d_stat); /* note that at this point the st_mode may be 0 */ #endif memcpy(entry->d_name, dd->d_name, name_len + 1); /* insert in the list */ tommy_list_insert_tail(&list, &entry->node, entry); /* process ignore files */ if (strcmp(".snapraidignore", dd->d_name) == 0) state_load_ignore_file(&scan->local_filter_list, path_next, sub_next); } if (closedir(d) != 0) { /* LCOV_EXCL_START */ /* restore removing additions */ path_next[path_len] = 0; log_tag("%s:%u:%s:%s: Close dir error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(errno, "Error closing directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (state->opt.force_order == SORT_ALPHA) { /* if requested sort alphabetically */ /* this is mainly done for testing to ensure to always */ /* process in the same way in different platforms */ tommy_list_sort(&list, dd_name_compare); } #if HAVE_STRUCT_DIRENT_D_INO else if (!disk->has_volatile_inodes) { /* if inodes are persistent */ /* sort the list of dir entries by inodes */ tommy_list_sort(&list, dd_ino_compare); } /* otherwise just keep the insertion order */ #endif /* process the sorted dir entries */ node = list; while (node != 0) { struct snapraid_filter* reason = 0; struct dirent_sorted* dd = node->data; const char* name = dd->d_name; struct stat* st; int type; #if !HAVE_STRUCT_DIRENT_D_STAT struct stat st_buf; #endif pathcatl(path_next, path_len, PATH_MAX, name); pathcatl(sub_next, sub_len, PATH_MAX, name); /* start with an unknown type */ type = -1; st = 0; /* if dirent has the type, use it */ #if HAVE_STRUCT_DIRENT_D_TYPE switch (dd->d_type) { case DT_UNKNOWN : break; case DT_REG : type = 0; break; case DT_LNK : type = 1; break; case DT_DIR : type = 2; break; default : type = 3; break; } #endif /* if type is still unknown */ if (type < 0) { /* get the type from stat */ st = DSTAT(path_next, dd, &st_buf); #if HAVE_STRUCT_DIRENT_D_STAT /* if the st_mode field is missing, takes care to fill it using normal lstat() */ /* at now this can happen only in Windows (with HAVE_STRUCT_DIRENT_D_STAT defined), */ /* because we use a directory reading method that doesn't read info about ReparsePoint. */ /* Note that here we cannot call here lstat_sync(), because we don't know what kind */ /* of file is it, and lstat_sync() doesn't always work */ if (st->st_mode == 0) { if (lstat(path_next, st) != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Stat error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #endif if (S_ISREG(st->st_mode)) type = 0; else if (S_ISLNK(st->st_mode)) type = 1; else if (S_ISDIR(st->st_mode)) type = 2; else type = 3; } if (type == 0) { /* REG */ if (filter_path(&state->filterlist, &reason, disk->name, sub_next) == 0 && filter_path(&scan->local_filter_list, &reason, disk->name, sub_next) == 0) { /* late stat, if not yet called */ if (!st) st = DSTAT(path_next, dd, &st_buf); #if HAVE_LSTAT_SYNC /* if the st_ino field is missing, takes care to fill it using the extended lstat() */ /* this can happen only in Windows */ if (st->st_ino == 0 || st->st_nlink == 0) { if (lstat_sync(path_next, st, 0) != 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Stat error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(errno, "Error in stat file '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #endif scan_file(scan, is_diff, sub_next, st, FILEPHY_UNREAD_OFFSET); processed = 1; } else { msg_verbose("Excluding file '%s' for rule '%s'\n", path_next, filter_type(reason, tmp, PATH_MAX)); } } else if (type == 1) { /* LNK */ if (filter_path(&state->filterlist, &reason, disk->name, sub_next) == 0 && filter_path(&scan->local_filter_list, &reason, disk->name, sub_next) == 0) { int ret; ret = readlink(path_next, tmp, PATH_MAX); if (ret >= PATH_MAX) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Readlink error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(EINTERNAL, "Error in readlink file '%s'. Symlink too long.\n", path_next); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (ret < 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Readlink error. %s.\n", es(errno), 0, disk->name, esc_tag(path_next), strerror(errno)); log_fatal(errno, "Error in readlink file '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (ret == 0) log_error(ESOFT, "WARNING! Empty symbolic link '%s'.\n", path_next); /* readlink doesn't put the final 0 */ tmp[ret] = 0; /* process as a symbolic link */ scan_link(scan, is_diff, sub_next, tmp, FILE_IS_SYMLINK); processed = 1; } else { msg_verbose("Excluding link '%s' for rule '%s'\n", path_next, filter_type(reason, tmp, PATH_MAX)); } } else if (type == 2) { /* DIR */ if (filter_subdir(&state->filterlist, &reason, disk->name, sub_next) == 0 && filter_subdir(&scan->local_filter_list, &reason, disk->name, sub_next) == 0) { #ifndef _WIN32 /* late stat, if not yet called */ if (!st) st = DSTAT(path_next, dd, &st_buf); /* * In Unix don't follow mount points in different devices * in Windows we are already skipping them reporting them as special files */ if ((uint64_t)st->st_dev != disk->device) { log_tag("%s:%u:%s:%s: Ignoring mount point.\n", es(ESOFT), 0, disk->name, esc_tag(path_next)); log_error(ESOFT, "WARNING! Ignoring mount point '%s' because it appears to be in a different device\n", path_next); } else #endif { /* recurse */ pathslash(path_next, PATH_MAX); pathslash(sub_next, PATH_MAX); if (scan_sub(scan, level + 1, is_diff, path_next, sub_next, tmp) == 0) { /* restore removing additions */ pathcatl(sub_next, sub_len, PATH_MAX, name); /* scan the directory as empty dir */ scan_emptydir(scan, sub_next); } /* or we processed something internally, or we have added the empty dir */ processed = 1; } } else { msg_verbose("Excluding directory '%s' for rule '%s'\n", path_next, filter_type(reason, tmp, PATH_MAX)); } } else { if (filter_path(&state->filterlist, &reason, disk->name, sub_next) == 0 && filter_path(&scan->local_filter_list, &reason, disk->name, sub_next) == 0) { /* late stat, if not yet called */ if (!st) st = DSTAT(path_next, dd, &st_buf); log_tag("%s:%u:%s:%s: Ignoring special file.\n", es(ESOFT), 0, disk->name, esc_tag(path_next)); log_error(ESOFT, "WARNING! Ignoring special '%s' file '%s'\n", stat_desc(st), path_next); } else { msg_verbose("Excluding special file '%s' for rule '%s'\n", path_next, filter_type(reason, tmp, PATH_MAX)); } } /* next entry */ node = node->next; /* free the present one */ free(dd); } return processed; } /** * Process a directory. * Return != 0 if at least one file or link is processed. */ static int scan_dir(struct snapraid_scan* scan, int level, int is_diff, const char* dir, const char* sub) { /* working buffers used by scan_sub() */ char path_next[PATH_MAX]; char sub_next[PATH_MAX]; char tmp[PATH_MAX]; pathcpy(path_next, sizeof(path_next), dir); pathcpy(sub_next, sizeof(sub_next), sub); return scan_sub(scan, level, is_diff, path_next, sub_next, tmp); } static void* scan_disk(void* arg) { struct snapraid_scan* scan = arg; struct snapraid_disk* disk = scan->disk; int ret; int has_persistent_inodes; int has_syncronized_hardlinks; uint64_t start; /* check if the disk supports persistent inodes */ ret = fsinfo(disk->dir, &has_persistent_inodes, &has_syncronized_hardlinks, 0, 0, 0, 0, 0, 0); if (ret < 0) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Filesystem info error. %s.\n", es(errno), 0, disk->name, esc_tag(disk->dir), strerror(errno)); log_fatal(errno, "Error accessing disk '%s' to get file-system info. %s.\n", disk->dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!has_persistent_inodes) { disk->has_volatile_inodes = 1; } if (!has_syncronized_hardlinks) { disk->has_volatile_hardlinks = 1; } /* if inodes or UUID are not persistent/changed/unsupported */ if (disk->has_volatile_inodes || disk->has_different_uuid || disk->has_unsupported_uuid) { /* remove all the inodes from the inode collection */ /* if they are not persistent, all of them could be changed now */ /* and we don't want to find false matching ones */ /* see scan_file() for more details */ tommy_node* node = disk->filelist; while (node) { struct snapraid_file* file = node->data; node = node->next; /* remove from the inode set */ tommy_hashdyn_remove_existing(&disk->inodeset, &file->nodeset); /* clear the inode */ file->inode = 0; /* mark as missing inode */ file_flag_set(file, FILE_IS_WITHOUT_INODE); } } start = os_tick_ms(); scan_dir(scan, 0, scan->is_diff, disk->dir, ""); if (!scan->is_diff) msg_progress("Scanned %s in %" PRIu64 " seconds\n", disk->name, (os_tick_ms() - start) / 1000); return 0; } static int state_diffscan(struct snapraid_state* state, int is_diff) { tommy_node* i; tommy_node* j; tommy_list scanlist; int done; msg_ptr* msg; struct snapraid_scan total; int no_difference; tommy_list_init(&scanlist); if (is_diff) msg_progress("Comparing...\n"); else msg_progress("Scanning...\n"); log_tag("list:scan_begin\n"); /* allocate all the scan data */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; struct snapraid_scan* scan; scan = scan_alloc(state, disk, is_diff); tommy_list_insert_tail(&scanlist, &scan->node, scan); } /* first scan all the directory and find new and deleted files */ for (i = scanlist; i != 0; i = i->next) { struct snapraid_scan* scan = i->data; #if HAVE_THREAD if (state->opt.skip_multi_scan) scan_disk(scan); else thread_create(&scan->thread, scan_disk, scan); #else scan_disk(scan); #endif } #if HAVE_THREAD /* wait for all threads to terminate */ for (i = scanlist; i != 0; i = i->next) { struct snapraid_scan* scan = i->data; void* retval; /* wait for thread termination */ if (!state->opt.skip_multi_scan) thread_join(scan->thread, &retval); } #endif /* we split the search in two phases because to detect files */ /* moved from one disk to another we have to start deletion */ /* only when all disks have all the new files found */ /* now process all the new and deleted files */ for (i = scanlist; i != 0; i = i->next) { struct snapraid_scan* scan = i->data; struct snapraid_disk* disk = scan->disk; tommy_node* node; unsigned phy_dup; uint64_t phy_last; struct snapraid_file* phy_file_last; /* check for removed files */ node = disk->filelist; while (node) { struct snapraid_file* file = node->data; /* next node */ node = node->next; /* remove if not present */ if (!file_flag_has(file, FILE_IS_PRESENT)) { /* here we are in mono-thread context, no need to use the stamp_lock() to read FILE_IS_RELOCATED */ if (!file_flag_has(file, FILE_IS_RELOCATED)) { ++scan->count_remove; log_tag("scan:remove:%s:%s\n", disk->name, esc_tag(file->sub)); if (is_diff) { msg_info("remove %s\n", fmt_term(disk, file->sub)); } } scan_file_remove(scan, file); } } /* check for removed links */ node = disk->linklist; while (node) { struct snapraid_link* slink = node->data; /* next node */ node = node->next; /* remove if not present */ if (!link_flag_has(slink, FILE_IS_PRESENT)) { ++scan->count_remove; log_tag("scan:remove:%s:%s\n", disk->name, esc_tag(slink->sub)); if (is_diff) { msg_info("remove %s\n", fmt_term(disk, slink->sub)); } scan_link_remove(scan, slink); } } /* check for removed dirs */ node = disk->dirlist; while (node) { struct snapraid_dir* dir = node->data; /* next node */ node = node->next; /* remove if not present */ if (!dir_flag_has(dir, FILE_IS_PRESENT)) { scan_emptydir_remove(scan, dir); } } /* sort the files before inserting them */ /* we use a stable sort to ensure that if the reported physical offset/inode */ /* are always 0, we keep at least the directory order */ switch (state->opt.force_order) { case SORT_PHYSICAL : tommy_list_sort(&scan->file_insert_list, file_physical_compare); break; case SORT_INODE : tommy_list_sort(&scan->file_insert_list, file_inode_compare); break; case SORT_ALPHA : tommy_list_sort(&scan->file_insert_list, file_path_compare); break; case SORT_DIR : /* already in order */ break; } /* insert all the new files, we insert them only after the deletion */ /* to reuse the just freed space */ /* also check if the physical offset reported are fakes or not */ node = scan->file_insert_list; phy_dup = 0; phy_last = FILEPHY_UNREAD_OFFSET; phy_file_last = 0; while (node) { struct snapraid_file* file = node->data; /* if the file is not empty, count duplicate physical offsets */ if (state->opt.force_order == SORT_PHYSICAL && file->size != 0) { if (phy_file_last != 0 && file->physical == phy_last /* files without offset are expected to have duplicates */ && phy_last != FILEPHY_WITHOUT_OFFSET ) { /* if verbose, print the list of duplicates real offsets */ /* other cases are for offsets not supported, so we don't need to report them file by file */ if (phy_last >= FILEPHY_REAL_OFFSET) { log_error(ESOFT, "WARNING! Files '%s%s' and '%s%s' share the same physical offset %" PRId64 ".\n", disk->dir, phy_file_last->sub, disk->dir, file->sub, phy_last); } ++phy_dup; } phy_file_last = file; phy_last = file->physical; } /* next node */ node = node->next; /* insert in the parity */ scan_file_allocate(scan, file); } /* mark the disk without reliable physical offset if it has duplicates */ /* here it should never happen because we already sorted out hardlinks */ if (state->opt.force_order == SORT_PHYSICAL && phy_dup > 0) { disk->has_unreliable_physical = 1; } /* insert all the new links */ node = scan->link_insert_list; while (node) { struct snapraid_link* slink = node->data; /* next node */ node = node->next; /* insert it */ scan_link_insert(scan, slink); } /* insert all the new dirs */ node = scan->dir_insert_list; while (node) { struct snapraid_dir* dir = node->data; /* next node */ node = node->next; /* insert it */ scan_emptydir_insert(scan, dir); } } /* propagate the state change (after all the scan operations are called) */ for (i = scanlist; i != 0; i = i->next) { struct snapraid_scan* scan = i->data; if (scan->need_write) { state->need_write = 1; } } /* check for disks where all the previously existing files where removed */ if (!state->opt.force_empty) { int all_missing = 0; int all_rewritten = 0; done = 0; for (i = state->disklist, j = scanlist; i != 0; i = i->next, j = j->next) { struct snapraid_disk* disk = i->data; struct snapraid_scan* scan = j->data; if (scan->count_equal == 0 && scan->count_move == 0 && scan->count_restore == 0 && (scan->count_remove != 0 || scan->count_change != 0) ) { if (!done) { done = 1; log_error(ESOFT, "WARNING! All the files previously present in disk '%s' at dir '%s'", disk->name, disk->dir); } else { log_error(ESOFT, ", disk '%s' at dir '%s'", disk->name, disk->dir); } /* detect the special condition of all files missing */ if (scan->count_change == 0) all_missing = 1; /* detect the special condition of all files rewritten */ if (scan->count_remove == 0) all_rewritten = 1; } } if (done) { log_fatal(ESOFT, "\nare now missing or have been rewritten!\n"); if (all_rewritten) { log_error(ESOFT, "This could occur when restoring a disk from a backup\n"); log_error(ESOFT, "program that is not setting correctly the timestamps.\n"); } if (all_missing) { log_error(ESOFT, "This could occur when some disks are not mounted\n"); log_error(ESOFT, "in the expected directory.\n"); } if (!is_diff) { log_fatal(ESOFT, "If you want to '%s' anyway, use 'snapraid --force-empty %s'.\n", state->command, state->command); exit(EXIT_FAILURE); } } } /* check for disks without the physical offset support */ if (state->opt.force_order == SORT_PHYSICAL) { done = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (disk->has_unreliable_physical) { if (!done) { done = 1; log_error(ESOFT, "WARNING! Physical offsets not supported for disk '%s'", disk->name); } else { log_error(ESOFT, ", '%s'", disk->name); } } } if (done) { log_error(ESOFT, ". The order of files won't be optimal.\n"); } } /* check for disks without persistent inodes */ done = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (disk->has_volatile_inodes) { if (!done) { done = 1; log_error(ESOFT, "WARNING! Inodes are not persistent for disks: '%s'", disk->name); } else { log_error(ESOFT, ", '%s'", disk->name); } } } if (done) { log_error(ESOFT, ". Inodes are not used to detect move operations.\n"); } /* check for disks with changed UUID */ done = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; /* don't print the message if the UUID changed because before */ /* it was no set. */ /* this is the normal condition for an empty disk because it */ /* isn't stored */ if (disk->has_different_uuid && !disk->had_empty_uuid) { if (!done) { done = 1; log_error(ESOFT, "WARNING! UUID is changed for disks: '%s'", disk->name); } else { log_error(ESOFT, ", '%s'", disk->name); } } } if (done) { log_error(ESOFT, ". Inodes are not used to detect move operations.\n"); } /* check for disks with unsupported UUID */ done = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (disk->has_unsupported_uuid) { if (!done) { done = 1; log_error(ESOFT, "WARNING! UUID is unsupported for disks: '%s'", disk->name); } else { log_error(ESOFT, ", '%s'", disk->name); } } } if (done) { log_error(ESOFT, ". Not using inodes to detect move operations.\n"); #if defined(_linux) && !HAVE_BLKID log_error(ESOFT, "The 'blkid' library is not linked in SnapRAID!\n"); log_error(ESOFT, "Try rebuilding it after installing the libblkid-dev or libblkid-devel package.\n"); #endif } total.count_equal = 0; total.count_move = 0; total.count_copy = 0; total.count_relocate = 0; total.count_restore = 0; total.count_change = 0; total.count_remove = 0; total.count_insert = 0; for (i = scanlist; i != 0; i = i->next) { struct snapraid_scan* scan = i->data; total.count_equal += scan->count_equal; total.count_move += scan->count_move; total.count_copy += scan->count_copy; total.count_relocate += scan->count_relocate; total.count_restore += scan->count_restore; total.count_change += scan->count_change; total.count_remove += scan->count_remove; total.count_insert += scan->count_insert; } if (is_diff) { msg_status("\n"); msg = msg_status; } else { msg = msg_verbose; } msg("%8u equal\n", total.count_equal); msg("%8u added\n", total.count_insert); msg("%8u removed\n", total.count_remove); msg("%8u updated\n", total.count_change); msg("%8u moved\n", total.count_move); msg("%8u copied\n", total.count_copy); msg("%8u relocated\n", total.count_relocate); msg("%8u restored\n", total.count_restore); log_tag("summary:equal:%u\n", total.count_equal); log_tag("summary:added:%u\n", total.count_insert); log_tag("summary:removed:%u\n", total.count_remove); log_tag("summary:updated:%u\n", total.count_change); log_tag("summary:moved:%u\n", total.count_move); log_tag("summary:copied:%u\n", total.count_copy); log_tag("summary:relocated:%u\n", total.count_relocate); log_tag("summary:restored:%u\n", total.count_restore); log_tag("list:scan_end\n"); /* save in the state */ state->removed_files = total.count_remove; state->updated_files = total.count_change; no_difference = !total.count_move && !total.count_copy && !total.count_relocate && !total.count_restore && !total.count_change && !total.count_remove && !total.count_insert; if (is_diff) { if (!no_difference) { msg_status("There are differences!\n"); } else { msg_status("No differences\n"); } if (state->unsynced_blocks != 0) log_error(EUSER, "The last sync was interrupted. Run it again!\n"); if (state->unsynced_blocks != 0) { log_tag("summary:exit:unsynced\n"); } else if (!no_difference) { log_tag("summary:exit:diff\n"); } else { log_tag("summary:exit:equal\n"); } } log_flush(); tommy_list_foreach(&scanlist, (tommy_foreach_func*)scan_free); /* check the file-system on all disks */ state_fscheck(state, "after scan"); if (is_diff) { /* check for file difference */ if (!no_difference) return 1; /* check also for incomplete "sync" */ if (state->unsynced_blocks != 0) return 1; } return 0; } int state_diff(struct snapraid_state* state) { return state_diffscan(state, 1); } void state_scan(struct snapraid_state* state) { (void)state_diffscan(state, 0); /* ignore return value */ } snapraid-14.9/cmdline/scrub.c000066400000000000000000000631271522717156100161650ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "elem.h" #include "state.h" #include "parity.h" #include "handle.h" #include "io.h" #include "raid/raid.h" /****************************************************************************/ /* scrub */ static const char* es(int err) { if (is_hw(err)) return "error_io"; else return "error"; } /** * Buffer for storing the new hashes. */ struct snapraid_rehash { unsigned char hash[HASH_MAX]; struct snapraid_block* block; }; /** * Scrub plan to use. */ struct snapraid_plan { struct snapraid_state* state; int plan; /**< One of the SCRUB_*. */ time_t timelimit; /**< Time limit. Valid only with SCRUB_AUTO. */ block_off_t lastlimit; /**< Number of blocks allowed with time exactly at ::timelimit. Valid only with SCRUB_AUTO. */ }; /** * Check if we have to process the specified block index ::i. */ static int block_is_enabled(struct snapraid_plan* plan, block_off_t* countlast, block_off_t i) { time_t blocktime; snapraid_info info; /* don't scrub unused blocks in all plans */ info = info_get(&plan->state->infoarr, i); if (info == 0) return 0; /* bad blocks are always scrubbed in all plans */ if (info_get_bad(info)) return 1; switch (plan->plan) { case SCRUB_FULL : /* in 'full' plan everything is scrubbed */ return 1; case SCRUB_EVEN : /* in 'even' plan, scrub only even blocks */ return i % 2 == 0; case SCRUB_NEW : /* in 'sync' plan, only blocks never scrubbed */ return info_get_justsynced(info); case SCRUB_BAD : /* in 'bad' plan, only bad blocks (already reported) */ return 0; } /* if it's too new */ blocktime = info_get_time(info); if (blocktime > plan->timelimit) { /* skip it */ return 0; } /* if the time is less than the limit, always include */ /* otherwise, check if we reached the last limit count */ if (blocktime == plan->timelimit) { /* if we reached the count limit */ if (*countlast >= plan->lastlimit) { /* skip it */ return 0; } ++*countlast; } return 1; } static void scrub_data_reader(struct snapraid_worker* worker, struct snapraid_task* task) { struct snapraid_io* io = worker->io; struct snapraid_state* state = io->state; struct snapraid_handle* handle = worker->handle; struct snapraid_disk* disk = handle->disk; block_off_t blockcur = task->position; unsigned char* buffer = task->buffer; int ret; /* if the disk position is not used */ if (!disk) { /* use an empty block */ memset(buffer, 0, state->block_size); task->state = TASK_STATE_DONE; return; } /* get the block */ task->block = fs_par2block_find(disk, blockcur); /* if the block is not used */ if (!block_has_file(task->block)) { /* use an empty block */ memset(buffer, 0, state->block_size); task->state = TASK_STATE_DONE; return; } /* get the file of this block */ task->file = fs_par2file_get(disk, blockcur, &task->file_pos); /* if the file is different than the current one, close it */ if (handle->file != 0 && handle->file != task->file) { /* keep a pointer at the file we are going to close for error reporting */ struct snapraid_file* report = handle->file; ret = handle_close(handle); if (ret == -1) { /* LCOV_EXCL_START */ /* This one is really an unexpected error, because we are only reading */ /* and closing a descriptor should never fail */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(report->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", blockcur); if (is_hw(errno)) { task->state = TASK_STATE_IOERROR; } else { task->state = TASK_STATE_ERROR; } return; /* LCOV_EXCL_STOP */ } } ret = handle_open(handle, task->file, state->file_mode, 0); if (ret == -1) { log_tag("%s:%u:%s:%s: Open error. %s.\n", es(errno), blockcur, disk->name, esc_tag(task->file->sub), strerror(errno)); if (is_hw(errno)) { /* LCOV_EXCL_START */ log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", blockcur); task->state = TASK_STATE_IOERROR; return; /* LCOV_EXCL_STOP */ } task->state = TASK_STATE_ERROR_CONTINUE; return; } /* check if the file is changed */ if (handle->st.st_size != task->file->size || handle->st.st_mtime != task->file->mtime_sec || STAT_NSEC(&handle->st) != task->file->mtime_nsec /* don't check the inode to support filesystem without persistent inodes */ ) { /* report that the block and the file are not synced */ task->is_timestamp_different = 1; /* follow */ } /* note that we intentionally don't abort if the file has different attributes */ /* from the last sync, as we are expected to return errors if running */ /* in an unsynced array. This is just like the check command. */ task->read_size = handle_read(handle, task->file_pos, buffer, state->block_size, 0); if (task->read_size == -1) { log_tag("%s:%u:%s:%s: Read error at position %u. %s.\n", es(errno), blockcur, disk->name, esc_tag(task->file->sub), task->file_pos, strerror(errno)); if (is_hw(errno)) { /* LCOV_EXCL_START */ log_fatal_errno(errno, disk->name); task->state = TASK_STATE_IOERROR_CONTINUE; return; /* LCOV_EXCL_STOP */ } task->state = TASK_STATE_ERROR_CONTINUE; return; } /* store the path of the opened file */ pathcpy(task->path, sizeof(task->path), handle->path); task->state = TASK_STATE_DONE; } static void scrub_parity_reader(struct snapraid_worker* worker, struct snapraid_task* task) { struct snapraid_io* io = worker->io; struct snapraid_state* state = io->state; struct snapraid_parity_handle* parity_handle = worker->parity_handle; unsigned level = parity_handle->level; block_off_t blockcur = task->position; unsigned char* buffer = task->buffer; int ret; /* read the parity */ ret = parity_read(parity_handle, blockcur, buffer, state->block_size); if (ret == -1) { log_tag("parity_%s:%u:%s: Read error. %s.\n", es(errno), blockcur, lev_config_name(level), strerror(errno)); if (is_hw(errno)) { /* LCOV_EXCL_START */ log_fatal_errno(errno, lev_config_name(level)); task->state = TASK_STATE_IOERROR_CONTINUE; return; /* LCOV_EXCL_STOP */ } task->state = TASK_STATE_ERROR_CONTINUE; return; } task->state = TASK_STATE_DONE; } static int state_scrub_process(struct snapraid_state* state, struct snapraid_parity_handle* parity_handle, block_off_t blockstart, block_off_t blockmax, struct snapraid_plan* plan, time_t now) { struct snapraid_io io; struct snapraid_handle* handle; void* rehandle_alloc; struct snapraid_rehash* rehandle; unsigned diskmax; block_off_t blockcur; unsigned j; unsigned buffermax; data_off_t countsize; block_off_t countpos; block_off_t countmax; block_off_t countlast; block_off_t autosavedone; block_off_t autosavelimit; block_off_t autosavemissing; int ret; unsigned soft_error; unsigned silent_error; unsigned io_error; unsigned l; unsigned* waiting_map; unsigned waiting_mac; bit_vect_t* block_enabled; /* maps the disks to handles */ handle = handle_mapping(state, &diskmax); /* rehash buffers */ rehandle = malloc_nofail_align(diskmax * sizeof(struct snapraid_rehash), &rehandle_alloc); /* we need 1 * data + 2 * parity */ buffermax = diskmax + 2 * state->level; /* initialize the io threads */ io_init(&io, state, state->opt.io_cache, buffermax, scrub_data_reader, handle, diskmax, scrub_parity_reader, 0, parity_handle, state->level); /* possibly waiting disks */ waiting_mac = diskmax > RAID_PARITY_MAX ? diskmax : RAID_PARITY_MAX; waiting_map = malloc_nofail(waiting_mac * sizeof(unsigned)); soft_error = 0; silent_error = 0; io_error = 0; msg_progress("Selecting...\n"); /* first count the number of blocks to process */ countmax = 0; countlast = 0; block_enabled = calloc_nofail(1, bit_vect_size(blockmax)); /* preinitialize to 0 */ for (blockcur = blockstart; blockcur < blockmax; ++blockcur) { if (!block_is_enabled(plan, &countlast, blockcur)) continue; bit_vect_set(block_enabled, blockcur); ++countmax; } /* compute the autosave size for all disk, even if not read */ /* this makes sense because the speed should be almost the same */ /* if the disks are read in parallel */ autosavelimit = state->autosave / (diskmax * state->block_size); autosavemissing = countmax; /* blocks to do */ autosavedone = 0; /* blocks done */ /* drop until now */ state_usage_waste(state); countsize = 0; countpos = 0; blockcur = blockstart; msg_progress("Scrubbing...\n"); /* start all the worker threads */ io_start(&io, blockstart, blockmax, block_enabled); int alert = state_progress_begin(state, blockstart, blockmax, countmax); if (alert > 0) goto end; if (alert < 0) goto bail; while (1) { unsigned char* buffer_recov[LEV_MAX]; snapraid_info info; int error_on_this_block; int silent_error_on_this_block; int io_error_on_this_block; int block_is_unsynced; int rehash; void** buffer; /* go to the next block */ blockcur = io_read_next(&io, &buffer); if (blockcur >= blockmax) break; /* until now is scheduling */ state_usage_sched(state); /* one more block processed for autosave */ ++autosavedone; --autosavemissing; /* by default process the block, and skip it if something goes wrong */ error_on_this_block = 0; silent_error_on_this_block = 0; io_error_on_this_block = 0; /* if all the blocks at this address are synced */ /* if not, parity is not even checked */ block_is_unsynced = 0; /* get block specific info */ info = info_get(&state->infoarr, blockcur); /* if we have to use the old hash */ rehash = info_get_rehash(info); /* for each disk, process the block */ for (j = 0; j < diskmax; ++j) { struct snapraid_task* task; int read_size; unsigned char hash[HASH_MAX]; struct snapraid_block* block; int file_is_unsynced; struct snapraid_disk* disk; struct snapraid_file* file; block_off_t file_pos; unsigned diskcur; /* if the file on this disk is synced */ /* if not, silent errors are assumed as expected error */ file_is_unsynced = 0; /* until now is misc */ state_usage_misc(state); /* get the next task */ task = io_data_read(&io, &diskcur, waiting_map, &waiting_mac); /* until now is disk */ state_usage_disk(state, handle, waiting_map, waiting_mac); /* get the task results */ disk = task->disk; block = task->block; file = task->file; file_pos = task->file_pos; read_size = task->read_size; /* by default no rehash in case of "continue" */ rehandle[diskcur].block = 0; /* if the disk position is not used */ if (!disk) continue; state_usage_file(state, disk, file); /* if the block is unsynced, errors are expected */ if (block_has_invalid_parity(block)) { /* report that the block and the file are not synced */ block_is_unsynced = 1; file_is_unsynced = 1; /* follow */ } /* if the block is not used */ if (!block_has_file(block)) continue; /* if the block is unsynced, errors are expected */ if (task->is_timestamp_different) { /* report that the block and the file are not synced */ block_is_unsynced = 1; file_is_unsynced = 1; /* follow */ } /* handle error conditions */ if (task->state == TASK_STATE_IOERROR) { /* LCOV_EXCL_START */ ++io_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR) { /* LCOV_EXCL_START */ ++soft_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR_CONTINUE) { ++soft_error; error_on_this_block = 1; continue; } if (task->state == TASK_STATE_IOERROR_CONTINUE) { ++io_error; if (io_error >= state->opt.io_error_limit) { /* LCOV_EXCL_START */ log_fatal(EIO, "DANGER! Too many input/output errors in the %s disk. It isn't possible to continue.\n", disk->dir); log_fatal(EIO, "Stopping at block %u\n", blockcur); goto bail; /* LCOV_EXCL_STOP */ } /* otherwise continue */ io_error_on_this_block = 1; continue; } if (task->state != TASK_STATE_DONE) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in task state\n"); os_abort(); /* LCOV_EXCL_STOP */ } countsize += read_size; /* now compute the hash */ if (rehash) { memhash(state->prevhash, state->prevhashseed, hash, buffer[diskcur], read_size); /* compute the new hash, and store it */ rehandle[diskcur].block = block; memhash(state->hash, state->hashseed, rehandle[diskcur].hash, buffer[diskcur], read_size); } else { memhash(state->hash, state->hashseed, hash, buffer[diskcur], read_size); } /* until now is hash */ state_usage_hash(state); if (block_has_updated_hash(block)) { /* compare the hash */ if (memcmp(hash, block->hash, BLOCK_HASH_SIZE) != 0) { unsigned diff = memdiff(hash, block->hash, BLOCK_HASH_SIZE); /* it's a silent error only if we are dealing with synced files */ if (file_is_unsynced) { log_tag("error:%u:%s:%s: Data error at position %u, diff hash bits %u/%u\n", blockcur, disk->name, esc_tag(file->sub), file_pos, diff, BLOCK_HASH_SIZE * 8); ++soft_error; error_on_this_block = 1; } else { log_tag("error_data:%u:%s:%s: Data error at position %u, diff hash bits %u/%u\n", blockcur, disk->name, esc_tag(file->sub), file_pos, diff, BLOCK_HASH_SIZE * 8); log_error(EDATA, "Data error in file '%s' at position '%u', diff hash bits %u/%u\n", task->path, file_pos, diff, BLOCK_HASH_SIZE * 8); ++silent_error; silent_error_on_this_block = 1; } continue; } } } /* buffers for parity read and not computed */ for (l = 0; l < state->level; ++l) buffer_recov[l] = buffer[diskmax + state->level + l]; for (; l < LEV_MAX; ++l) buffer_recov[l] = 0; /* until now is misc */ state_usage_misc(state); /* read the parity */ for (l = 0; l < state->level; ++l) { struct snapraid_task* task; unsigned levcur; task = io_parity_read(&io, &levcur, waiting_map, &waiting_mac); /* until now is parity */ state_usage_parity(state, waiting_map, waiting_mac); /* handle error conditions */ if (task->state == TASK_STATE_IOERROR) { /* LCOV_EXCL_START */ ++io_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR) { /* LCOV_EXCL_START */ ++soft_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR_CONTINUE) { ++soft_error; error_on_this_block = 1; /* if continuing on error, clear the missing buffer */ buffer_recov[levcur] = 0; continue; } if (task->state == TASK_STATE_IOERROR_CONTINUE) { ++io_error; if (io_error >= state->opt.io_error_limit) { /* LCOV_EXCL_START */ log_fatal(EIO, "DANGER! Too many input/output errors in the %s disk. It isn't possible to continue.\n", lev_name(levcur)); log_fatal(EIO, "Stopping at block %u\n", blockcur); goto bail; /* LCOV_EXCL_STOP */ } /* otherwise continue */ io_error_on_this_block = 1; /* if continuing on error, clear the missing buffer */ buffer_recov[levcur] = 0; continue; } if (task->state != TASK_STATE_DONE) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in task state\n"); os_abort(); /* LCOV_EXCL_STOP */ } } /* if we have read all the data required and it's correct, proceed with the parity check */ if (!error_on_this_block && !silent_error_on_this_block && !io_error_on_this_block) { /* compute the parity */ raid_gen(diskmax, state->level, state->block_size, buffer); /* compare the parity */ for (l = 0; l < state->level; ++l) { if (buffer_recov[l] && memcmp(buffer[diskmax + l], buffer_recov[l], state->block_size) != 0) { unsigned diff = memdiff(buffer[diskmax + l], buffer_recov[l], state->block_size); /* it's a silent error only if we are dealing with synced blocks */ if (block_is_unsynced) { log_tag("parity_error:%u:%s: Data error, diff parity bits %u/%u\n", blockcur, lev_config_name(l), diff, state->block_size * 8); ++soft_error; error_on_this_block = 1; } else { log_tag("parity_error_data:%u:%s: Data error, diff parity bits %u/%u\n", blockcur, lev_config_name(l), diff, state->block_size * 8); log_error(EDATA, "Data error in parity '%s' at position '%u', diff parity bits %u/%u\n", lev_config_name(l), blockcur, diff, state->block_size * 8); ++silent_error; silent_error_on_this_block = 1; } } } /* until now is raid */ state_usage_raid(state); } if (silent_error_on_this_block || io_error_on_this_block) { /* set the error status keeping other info */ info_set(&state->infoarr, blockcur, info_set_bad(info)); } else if (error_on_this_block) { /* do nothing, as this is a generic error */ /* likely caused by a not synced array */ } else { /* if rehash is needed */ if (rehash) { /* store all the new hash already computed */ for (j = 0; j < diskmax; ++j) { if (rehandle[j].block) memcpy(rehandle[j].block->hash, rehandle[j].hash, BLOCK_HASH_SIZE); } } /* update the time info of the block */ /* and clear any other flag */ info_set(&state->infoarr, blockcur, info_make(now, 0, 0, 0)); } /* mark the state as needing write */ state->need_write = 1; /* count the number of processed block */ ++countpos; /* progress */ if (state_progress(state, &io, blockcur, countpos, countmax, countsize)) { /* LCOV_EXCL_START */ break; /* LCOV_EXCL_STOP */ } /* thermal control */ if (state_thermal_alarm(state)) { /* until now is misc */ state_usage_misc(state); state_progress_stop(state); state_thermal_cooldown(state); state_progress_restart(state); /* drop until now */ state_usage_waste(state); } /* autosave */ if (state->autosave != 0 && autosavedone >= autosavelimit /* if we have reached the limit */ && autosavemissing >= autosavelimit /* if we have at least a full step to do */ ) { autosavedone = 0; /* restart the counter */ /* until now is misc */ state_usage_misc(state); state_progress_stop(state); msg_progress("Autosaving...\n"); state_write(state); state_progress_restart(state); /* drop until now */ state_usage_waste(state); } } end: state_progress_end(state, countpos, countmax, countsize, "Nothing to scrub. Use the -p PLAN option to select a different plan, like -p full.\n"); /* save the new state if required */ if (state->need_write || state->opt.force_content_write) state_write(state); state_usage_print(state); if (soft_error || silent_error || io_error) { msg_status("\n"); msg_status("%8u soft errors\n", soft_error); msg_status("%8u io errors\n", io_error); msg_status("%8u data errors\n", silent_error); } else { msg_status("Everything OK\n"); } if (soft_error) log_fatal(ESOFT, "WARNING! Unexpected soft errors!\n"); if (io_error) log_fatal(EIO, "DANGER! Unexpected input/output errors! The failing blocks are now marked as bad!\n"); if (silent_error) log_fatal(EDATA, "DANGER! Unexpected data errors! The failing blocks are now marked as bad!\n"); if (io_error || silent_error) { log_fatal(ESOFT, "Use 'snapraid status' to list the bad blocks.\n"); log_fatal(ESOFT, "Use 'snapraid -e fix' to recover them.\n"); log_fatal(ESOFT, "Use 'snapraid -p bad scrub' to recheck after fixing to clear the bad state.\n"); } log_tag("summary:error_soft:%u\n", soft_error); log_tag("summary:error_io:%u\n", io_error); log_tag("summary:error_data:%u\n", silent_error); if (soft_error + silent_error + io_error == 0) log_tag("summary:exit:ok\n"); else if (silent_error + io_error == 0) log_tag("summary:exit:warning\n"); else log_tag("summary:exit:error\n"); log_flush(); bail: /* stop all the worker threads */ io_stop(&io); for (j = 0; j < diskmax; ++j) { struct snapraid_file* file = handle[j].file; struct snapraid_disk* disk = handle[j].disk; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } free(handle); free(rehandle_alloc); free(waiting_map); io_done(&io); free(block_enabled); if (state->opt.expect_recoverable) { if (soft_error + silent_error + io_error == 0) return -1; } else { if (soft_error + silent_error + io_error != 0) return -1; } if (alert < 0) return -1; return 0; } /** * Return a * b / c approximated to the upper value. */ static uint32_t md(uint32_t a, uint32_t b, uint32_t c) { uint64_t v = a; v *= b; v += c - 1; v /= c; return v; } int state_scrub(struct snapraid_state* state, int plan100, int olderthan) { block_off_t blockmax; block_off_t countlimit; block_off_t count; time_t recentlimit; int ret; struct snapraid_parity_handle parity_handle[LEV_MAX]; struct snapraid_plan ps; unsigned process_error; time_t now; unsigned l; /* get the present time */ now = time(0); msg_progress("Initializing...\n"); if ((plan100 == SCRUB_BAD || plan100 == SCRUB_NEW || plan100 == SCRUB_FULL) && olderthan >= 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You can specify -o, --older-than only with a numeric percentage.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } blockmax = parity_allocated_size(state); /* preinitialize to avoid warnings */ countlimit = 0; recentlimit = 0; ps.state = state; if (state->opt.force_scrub_even) { ps.plan = SCRUB_EVEN; } else if (plan100 == SCRUB_FULL) { ps.plan = SCRUB_FULL; msg_progress("Scrub plan: full. All data blocks will be checked.\n"); } else if (plan100 == SCRUB_NEW) { ps.plan = SCRUB_NEW; msg_progress("Scrub plan: new. Only blocks that have never been scrubbed will be checked.\n"); } else if (plan100 == SCRUB_BAD) { ps.plan = SCRUB_BAD; msg_progress("Scrub plan: bad. Only blocks previously marked as bad will be checked.\n"); } else if (state->opt.force_scrub_at) { /* scrub the specified amount of blocks */ ps.plan = SCRUB_AUTO; countlimit = state->opt.force_scrub_at; recentlimit = now; } else { ps.plan = SCRUB_AUTO; if (plan100 >= 0) { countlimit = md(blockmax, plan100, 10000); } else { /* by default scrub 8.33% of the array (100/12=8.(3)) */ countlimit = md(blockmax, 1, 12); } if (olderthan >= 0) { recentlimit = now - olderthan * 24 * 3600; } else { /* by default use a 10 day time limit */ recentlimit = now - 10 * 24 * 3600; } if (plan100 >= 0) { if (olderthan >= 0) msg_progress("Scrub plan: auto. %.1f%% of the array, older than %d days, will be checked.\n", plan100 / 100.0, olderthan); else msg_progress("Scrub plan: auto. %.1f%% of the array, older than 10 days, will be checked.\n", plan100 / 100.0); } else { if (olderthan >= 0) msg_progress("Scrub plan: auto. 8.3%% of the array, older than %d days, will be checked.\n", olderthan); else msg_progress("Scrub plan: auto. 8.3%% of the array, older than 10 days, will be checked.\n"); } } count = 0; for (tommy_node* j = tommy_list_head(&state->bucketlist); j != 0; j = j->next) { struct snapraid_bucket* bucket = j->data; count += bucket->count_scrubbed + bucket->count_justsynced; } if (!count) { /* LCOV_EXCL_START */ log_fatal(EUSER, "The array is empty.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* compute the limits from count/recentlimit */ if (ps.plan == SCRUB_AUTO) { /* no more than the full count */ if (countlimit > count) countlimit = count; /* by default process everything */ ps.timelimit = now; ps.lastlimit = 0; tommy_node* j = tommy_list_head(&state->bucketlist); block_off_t processed_count = 0; while (j) { struct snapraid_bucket* bucket = j->data; block_off_t bucket_count = bucket->count_justsynced + bucket->count_scrubbed; if (bucket->time_at > recentlimit) { ps.timelimit = recentlimit; ps.lastlimit = 0; break; } if (processed_count + bucket_count > countlimit) { ps.timelimit = bucket->time_at; ps.lastlimit = countlimit - processed_count; processed_count = countlimit; break; } processed_count += bucket_count; j = j->next; } /* if nothing to scrub, disable also other limits */ if (processed_count == 0) { ps.timelimit = 0; ps.lastlimit = 0; } log_tag("count_limit:%u\n", countlimit); log_tag("time_limit:%" PRIu64 "\n", (uint64_t)ps.timelimit); log_tag("last_limit:%u\n", ps.lastlimit); } else { /* avoid compiler warnings */ ps.timelimit = 0; ps.lastlimit = 0; } /* open the file for reading */ for (l = 0; l < state->level; ++l) { ret = parity_open(&parity_handle[l], &state->parity[l], l, state->file_mode, state->block_size, state->opt.parity_limit_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Open error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } process_error = 0; ret = state_scrub_process(state, parity_handle, 0, blockmax, &ps, now); if (ret == -1) { ++process_error; /* continue, as we are already exiting */ } for (l = 0; l < state->level; ++l) { ret = parity_close(&parity_handle[l]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Close error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } if (process_error != 0) return -1; return 0; } snapraid-14.9/cmdline/search.c000066400000000000000000000174051522717156100163120ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2014 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "search.h" /****************************************************************************/ /* search */ static void search_file(struct snapraid_state* state, const char* path, data_off_t size, int64_t mtime_sec, int mtime_nsec) { struct snapraid_search_file* file; tommy_uint32_t file_hash; file = malloc_nofail(sizeof(struct snapraid_search_file)); file->path = strdup_nofail(path); file->size = size; file->mtime_sec = mtime_sec; file->mtime_nsec = mtime_nsec; file_hash = file_stamp_hash(file->size, file->mtime_sec, file->mtime_nsec); tommy_hashdyn_insert(&state->searchset, &file->node, file, file_hash); } void search_file_free(struct snapraid_search_file* file) { free(file->path); free(file); } struct search_file_compare_arg { const struct snapraid_state* state; const struct snapraid_block* block; const struct snapraid_file* file; unsigned char* buffer; data_off_t offset; unsigned read_size; int prevhash; }; int search_file_compare(const void* void_arg, const void* void_data) { const struct search_file_compare_arg* arg = void_arg; const struct snapraid_search_file* file = void_data; const struct snapraid_state* state = arg->state; unsigned char buffer_hash[HASH_MAX]; const char* path = file->path; int f; ssize_t ret; /* compare file info */ if (arg->file->size != file->size) return -1; if (arg->file->mtime_sec != file->mtime_sec) return -1; if (arg->file->mtime_nsec != file->mtime_nsec) return -1; /* read the block and compare the hash */ f = open(path, O_RDONLY | O_BINARY); if (f == -1) { /* LCOV_EXCL_START */ if (errno == ENOENT) { log_fatal(EUSER, "DANGER! file '%s' disappeared.\n", path); log_fatal(EUSER, "If you moved it, please rerun the same command.\n"); } else { log_fatal(errno, "Error opening file '%s'. %s.\n", path, strerror(errno)); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = pread(f, arg->buffer, arg->read_size, arg->offset); if (ret < 0 || (unsigned)ret != arg->read_size) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = close(f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* compute the hash */ if (arg->prevhash) memhash(state->prevhash, state->prevhashseed, buffer_hash, arg->buffer, arg->read_size); else memhash(state->hash, state->hashseed, buffer_hash, arg->buffer, arg->read_size); /* check if the hash is matching */ if (memcmp(buffer_hash, arg->block->hash, BLOCK_HASH_SIZE) != 0) return -1; if (arg->read_size != state->block_size) { /* fill the remaining with 0 */ memset(arg->buffer + arg->read_size, 0, state->block_size - arg->read_size); } return 0; } int state_search_fetch(struct snapraid_state* state, int prevhash, struct snapraid_file* missing_file, block_off_t missing_file_pos, struct snapraid_block* missing_block, unsigned char* buffer) { struct snapraid_search_file* file; tommy_uint32_t file_hash; struct search_file_compare_arg arg; arg.state = state; arg.block = missing_block; arg.file = missing_file; arg.buffer = buffer; arg.offset = state->block_size * (data_off_t)missing_file_pos; arg.read_size = file_block_size(missing_file, missing_file_pos, state->block_size); arg.prevhash = prevhash; file_hash = file_stamp_hash(arg.file->size, arg.file->mtime_sec, arg.file->mtime_nsec); /* search in the hashtable, and also check if the data matches the hash */ file = tommy_hashdyn_search(&state->searchset, search_file_compare, &arg, file_hash); if (!file) return -1; /* if found, buffer is already set with data */ return 0; } static void search_dir(struct snapraid_state* state, struct snapraid_disk* disk, const char* dir, const char* sub) { DIR* d; d = opendir(dir); if (!d) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } while (1) { char path_next[PATH_MAX]; char sub_next[PATH_MAX]; char out[PATH_MAX]; struct snapraid_filter* reason = 0; struct stat st; const char* name; struct dirent* dd; /* clear errno to detect erroneous conditions */ errno = 0; dd = readdir(d); if (dd == 0 && errno != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (dd == 0) { break; /* finished */ } /* skip "." and ".." files */ name = dd->d_name; if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) continue; pathprint(path_next, sizeof(path_next), "%s%s", dir, name); pathprint(sub_next, sizeof(sub_next), "%s%s", sub, name); /* exclude hidden files even before calling lstat() */ if (disk != 0 && filter_hidden(state->filter_hidden, dd) != 0) { msg_verbose("Excluding hidden '%s'\n", path_next); continue; } /* exclude content files even before calling lstat() */ if (disk != 0 && filter_content(&state->contentlist, path_next) != 0) { msg_verbose("Excluding content '%s'\n", path_next); continue; } #if HAVE_STRUCT_DIRENT_D_STAT /* convert dirent to lstat result */ dirent_lstat(dd, &st); /* if the st_mode field is missing, takes care to fill it using normal lstat() */ /* at now this can happen only in Windows (with HAVE_STRUCT_DIRENT_D_STAT defined), */ /* because we use a directory reading method that doesn't read info about ReparsePoint. */ /* Note that here we cannot call here lstat_sync(), because we don't know what kind */ /* of file is it, and lstat_sync() doesn't always work */ if (st.st_mode == 0) { if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #else /* get lstat info about the file */ if (lstat(path_next, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error in stat file/directory '%s'. %s.\n", path_next, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif if (S_ISREG(st.st_mode)) { if (disk == 0 || filter_path(&state->filterlist, &reason, disk->name, sub_next) == 0) { search_file(state, path_next, st.st_size, st.st_mtime, STAT_NSEC(&st)); } else { msg_verbose("Excluding link '%s' for rule '%s'\n", path_next, filter_type(reason, out, sizeof(out))); } } else if (S_ISDIR(st.st_mode)) { if (disk == 0 || filter_subdir(&state->filterlist, &reason, disk->name, sub_next) == 0) { pathslash(path_next, sizeof(path_next)); pathslash(sub_next, sizeof(sub_next)); search_dir(state, disk, path_next, sub_next); } else { msg_verbose("Excluding directory '%s' for rule '%s'\n", path_next, filter_type(reason, out, sizeof(out))); } } } if (closedir(d) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } void state_search(struct snapraid_state* state, const char* dir) { char path[PATH_MAX]; msg_progress("Importing...\n"); /* add the final slash */ pathimport(path, sizeof(path), dir); pathslash(path, sizeof(path)); search_dir(state, 0, path, ""); } void state_search_array(struct snapraid_state* state) { tommy_node* i; /* import from all the disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; /* skip data disks that are not accessible */ if (disk->skip_access) continue; msg_progress("Searching disk %s...\n", disk->name); search_dir(state, disk, disk->dir, ""); } } snapraid-14.9/cmdline/search.h000066400000000000000000000022671522717156100163170ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2014 Andrea Mazzoleni #ifndef __SEARCH_H #define __SEARCH_H #include "elem.h" #include "state.h" /****************************************************************************/ /* search */ /** * Search file. * File used to search for moved data. */ struct snapraid_search_file { char* path; /**< Full path of the file. */ char* name; /**< Pointer of the name inside the path. */ data_off_t size; int64_t mtime_sec; int mtime_nsec; /* nodes for data structures */ tommy_node node; }; /** * Deallocate a search file. */ void search_file_free(struct snapraid_search_file* file); /** * Fetch a file from the size, timestamp and name. * Return ==0 if the block is found, and copied into buffer. */ int state_search_fetch(struct snapraid_state* state, int prevhash, struct snapraid_file* missing_file, block_off_t missing_file_pos, struct snapraid_block* missing_block, unsigned char* buffer); /** * Import files from the specified directory. */ void state_search(struct snapraid_state* state, const char* dir); /** * Import files from all the data disks. */ void state_search_array(struct snapraid_state* state); #endif snapraid-14.9/cmdline/selftest.c000066400000000000000000000700671522717156100167010ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "snapraid.h" #include "util.h" #include "raid/raid.h" #include "raid/cpu.h" #include "raid/combo.h" #include "raid/internal.h" #include "raid/test.h" #include "elem.h" #include "state.h" #include "support.h" #include "tommyds/tommyhash.h" #include "tommyds/tommyarray.h" #include "tommyds/tommyarrayblkof.h" #include "tommyds/tommyhashdyn.h" struct hash32_test_vector { const char* data; int len; uint32_t digest; uint32_t seed; }; struct strhash32_test_vector { char* data; uint32_t digest; uint32_t seed; }; struct hash64_test_vector { const char* data; int len; uint64_t digest; uint64_t seed; }; struct hash_test_vector { const char* data; int len; unsigned char digest[HASH_MAX]; unsigned char seed[HASH_MAX]; }; /** * Test vectors for tommy_hash32 */ static struct hash32_test_vector TEST_HASH32[] = { { "", 0, 0x8614384c, 0xa766795d }, { "a", 1, 0x12c16c36, 0xa766795d }, { "abc", 3, 0xc58e8af5, 0xa766795d }, { "message digest", 14, 0x006b32f1, 0xa766795d }, { "abcdefghijklmnopqrstuvwxyz", 26, 0x7e6fcfe0, 0xa766795d }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62, 0x8604adf8, 0xa766795d }, { "The quick brown fox jumps over the lazy dog", 43, 0xdeba3d3a, 0xa766795d }, { "\x00", 1, 0x4a7d1c33, 0xa766795d }, { "\x16\x27", 2, 0x8b50899b, 0xa766795d }, { "\xe2\x56\xb4", 3, 0x60406493, 0xa766795d }, { "\xc9\x4d\x9c\xda", 4, 0xa049144a, 0xa766795d }, { "\x79\xf1\x29\x69\x5d", 5, 0x4da2c2f1, 0xa766795d }, { "\x00\x7e\xdf\x1e\x31\x1c", 6, 0x59de30cf, 0xa766795d }, { "\x2a\x4c\xe1\xff\x9e\x6f\x53", 7, 0x219e149c, 0xa766795d }, { "\xba\x02\xab\x18\x30\xc5\x0e\x8a", 8, 0x25067520, 0xa766795d }, { "\xec\x4e\x7a\x72\x1e\x71\x2a\xc9\x33", 9, 0xa1f368d8, 0xa766795d }, { "\xfd\xe2\x9c\x0f\x72\xb7\x08\xea\xd0\x78", 10, 0x805fc63d, 0xa766795d }, { "\x65\xc4\x8a\xb8\x80\x86\x9a\x79\x00\xb7\xae", 11, 0x7f75dd0f, 0xa766795d }, { "\x77\xe9\xd7\x80\x0e\x3f\x5c\x43\xc8\xc2\x46\x39", 12, 0xb9154382, 0xa766795d }, { 0, 0, 0, 0 } }; /** * Test vectors for tommy_strhash32 */ struct strhash32_test_vector TEST_STRHASH32[] = { { "", 0x0af1416d, 0xa766795d }, { "a", 0x68fa0f3f, 0xa766795d }, { "abc", 0xfc68ffc5, 0xa766795d }, { "message digest", 0x08477b63, 0xa766795d }, { "abcdefghijklmnopqrstuvwxyz", 0x5b9c25e5, 0xa766795d }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 0x1e530ce7, 0xa766795d }, { "The quick brown fox jumps over the lazy dog", 0xaf93eefe, 0xa766795d }, { "\xff", 0xfc88801b, 0xa766795d }, { "\x16\x27", 0xcd7216db, 0xa766795d }, { "\xe2\x56\xb4", 0x05f98d02, 0xa766795d }, { "\xc9\x4d\x9c\xda", 0xf65206f8, 0xa766795d }, { "\x79\xf1\x29\x69\x5d", 0x72bd6bda, 0xa766795d }, { "\xff\x7e\xdf\x1e\x31\x1c", 0x57dfb9b4, 0xa766795d }, { "\x2a\x4c\xe1\xff\x9e\x6f\x53", 0x499ff634, 0xa766795d }, { "\xba\x02\xab\x18\x30\xc5\x0e\x8a", 0xe896b7ce, 0xa766795d }, { "\xec\x4e\x7a\x72\x1e\x71\x2a\xc9\x33", 0xfe3939f0, 0xa766795d }, { "\xfd\xe2\x9c\x0f\x72\xb7\x08\xea\xd0\x78", 0x4351d482, 0xa766795d }, { "\x65\xc4\x8a\xb8\x80\x86\x9a\x79\xff\xb7\xae", 0x88e92135, 0xa766795d }, { "\x77\xe9\xd7\x80\x0e\x3f\x5c\x43\xc8\xc2\x46\x39", 0x01109c16, 0xa766795d }, { "\x87\xd8\x61\x61\x4c\x89\x17\x4e\xa1\xa4\xef\x13\xa9", 0xbcb050dc, 0xa766795d }, { "\xfe\xa6\x5b\xc2\xda\xe8\x95\xd4\x64\xab\x4c\x39\x58\x29", 0xbe5e1fd5, 0xa766795d }, { "\x94\x49\xc0\x78\xa0\x80\xda\xc7\x71\x4e\x17\x37\xa9\x7c\x40", 0x70d8c97f, 0xa766795d }, { "\x53\x7e\x36\xb4\x2e\xc9\xb9\xcc\x18\x3e\x9a\x5f\xfc\xb7\xb0\x61", 0x957440a9, 0xa766795d }, { 0, 0, 0 } }; /** * Test vectors for tommy_hash64 */ static struct hash64_test_vector TEST_HASH64[] = { { "", 0, 0x8614384cb5165fbfULL, 0x2f022773a766795dULL }, { "a", 1, 0x1a2e0298a8e94a3dULL, 0x2f022773a766795dULL }, { "abc", 3, 0x7555796b7a7d21ebULL, 0x2f022773a766795dULL }, { "message digest", 14, 0x9411a57d04b92fb4ULL, 0x2f022773a766795dULL }, { "abcdefghijklmnopqrstuvwxyz", 26, 0x3ca3f8d2b4e69832ULL, 0x2f022773a766795dULL }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62, 0x6dae542ba0015a4dULL, 0x2f022773a766795dULL }, { "The quick brown fox jumps over the lazy dog", 43, 0xe06d8cbb3d2ea1a6ULL, 0x2f022773a766795dULL }, { "\x00", 1, 0x201e664fb5f2c021ULL, 0x2f022773a766795dULL }, { "\x16\x27", 2, 0xef42fa8032c4b775ULL, 0x2f022773a766795dULL }, { "\xe2\x56\xb4", 3, 0x6e6c498a6688466cULL, 0x2f022773a766795dULL }, { "\xc9\x4d\x9c\xda", 4, 0x5195005419905423ULL, 0x2f022773a766795dULL }, { "\x79\xf1\x29\x69\x5d", 5, 0x221235b48afee7c1ULL, 0x2f022773a766795dULL }, { "\x00\x7e\xdf\x1e\x31\x1c", 6, 0x1b1f18b9266f095bULL, 0x2f022773a766795dULL }, { "\x2a\x4c\xe1\xff\x9e\x6f\x53", 7, 0x2cbafa8e741d49caULL, 0x2f022773a766795dULL }, { "\xba\x02\xab\x18\x30\xc5\x0e\x8a", 8, 0x4677f04c06e0758dULL, 0x2f022773a766795dULL }, { "\xec\x4e\x7a\x72\x1e\x71\x2a\xc9\x33", 9, 0x5afe09e8214e2163ULL, 0x2f022773a766795dULL }, { "\xfd\xe2\x9c\x0f\x72\xb7\x08\xea\xd0\x78", 10, 0x115b6276d209fab6ULL, 0x2f022773a766795dULL }, { "\x65\xc4\x8a\xb8\x80\x86\x9a\x79\x00\xb7\xae", 11, 0xd0636d2f01cf3a3eULL, 0x2f022773a766795dULL }, { "\x77\xe9\xd7\x80\x0e\x3f\x5c\x43\xc8\xc2\x46\x39", 12, 0x6d259f5fef74f93eULL, 0x2f022773a766795dULL }, { 0, 0, 0, 0 } }; /** * Test vectors for MurmorHash3_x86_128 */ static struct hash_test_vector TEST_MURMUR3[] = { #include "murmur3test.c" { 0, 0, { 0 }, { 0 } } }; /** * Test vectors for SpookyHash_128 */ static struct hash_test_vector TEST_SPOOKY2[] = { #include "spooky2test.c" { 0, 0, { 0 }, { 0 } } }; /** * Test vectors for MetroHash_128_1 */ static struct hash_test_vector TEST_METRO[] = { #include "metrotest.c" { 0, 0, { 0 }, { 0 } } }; /** * Test vectors for MuseAirLoong */ static struct hash_test_vector TEST_MUSEAIR[] = { #include "museairtest.c" { 0, 0, { 0 }, { 0 } } }; #define HASH_TEST_MAX 512 /* tests are never longer than 512 bytes */ static void test_hash(void) { unsigned i; unsigned char* seed_aligned; void* seed_alloc; unsigned char* buffer_aligned; void* buffer_alloc; seed_aligned = malloc_nofail_align(HASH_MAX, &seed_alloc); buffer_aligned = malloc_nofail_align(HASH_TEST_MAX, &buffer_alloc); for (i = 0; TEST_HASH32[i].data; ++i) { uint32_t digest; memcpy(buffer_aligned, TEST_HASH32[i].data, TEST_HASH32[i].len); digest = tommy_hash_u32(TEST_HASH32[i].seed, buffer_aligned, TEST_HASH32[i].len); if (digest != TEST_HASH32[i].digest) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed hash32 test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (i = 0; TEST_STRHASH32[i].data; ++i) { uint32_t digest; memcpy(buffer_aligned, TEST_STRHASH32[i].data, strlen(TEST_STRHASH32[i].data) + 1); digest = tommy_strhash_u32(TEST_STRHASH32[i].seed, buffer_aligned); if (digest != TEST_STRHASH32[i].digest) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed strhash32 test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (i = 0; TEST_HASH64[i].data; ++i) { uint64_t digest; memcpy(buffer_aligned, TEST_HASH64[i].data, TEST_HASH64[i].len); digest = tommy_hash_u64(TEST_HASH64[i].seed, buffer_aligned, TEST_HASH64[i].len); if (digest != TEST_HASH64[i].digest) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed hash64 test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (i = 0; TEST_MURMUR3[i].data; ++i) { unsigned char digest[HASH_MAX]; memcpy(buffer_aligned, TEST_MURMUR3[i].data, TEST_MURMUR3[i].len); memcpy(seed_aligned, TEST_MURMUR3[i].seed, HASH_MAX); memhash(HASH_MURMUR3, seed_aligned, digest, buffer_aligned, TEST_MURMUR3[i].len); if (memcmp(digest, TEST_MURMUR3[i].digest, HASH_MAX) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed Murmur3 test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (i = 0; TEST_SPOOKY2[i].data; ++i) { unsigned char digest[HASH_MAX]; memcpy(buffer_aligned, TEST_SPOOKY2[i].data, TEST_SPOOKY2[i].len); memcpy(seed_aligned, TEST_SPOOKY2[i].seed, HASH_MAX); memhash(HASH_SPOOKY2, seed_aligned, digest, buffer_aligned, TEST_SPOOKY2[i].len); if (memcmp(digest, TEST_SPOOKY2[i].digest, HASH_MAX) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed Spooky2 test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (i = 0; TEST_METRO[i].data; ++i) { unsigned char digest[HASH_MAX]; memcpy(buffer_aligned, TEST_METRO[i].data, TEST_METRO[i].len); memcpy(seed_aligned, TEST_METRO[i].seed, HASH_MAX); memhash(HASH_METRO, seed_aligned, digest, buffer_aligned, TEST_METRO[i].len); if (memcmp(digest, TEST_METRO[i].digest, HASH_MAX) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed Metro test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } for (i = 0; TEST_MUSEAIR[i].data; ++i) { unsigned char digest[HASH_MAX]; memcpy(buffer_aligned, TEST_MUSEAIR[i].data, TEST_MUSEAIR[i].len); memcpy(seed_aligned, TEST_MUSEAIR[i].seed, HASH_MAX); memhash(HASH_MUSEAIR, seed_aligned, digest, buffer_aligned, TEST_MUSEAIR[i].len); if (memcmp(digest, TEST_MUSEAIR[i].digest, HASH_MAX) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed MuseAir test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } free(buffer_alloc); free(seed_alloc); } struct crc_test_vector { const char* data; int len; uint32_t digest; }; /** * Test vectors for CRC32C (Castagnoli) */ static struct crc_test_vector TEST_CRC32C[] = { { "", 0, 0 }, { "\x61", 1, 0xc1d04330 }, { "\x66\x6f\x6f", 3, 0xcfc4ae1d }, { "\x68\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64", 11, 0xc99465aa }, { "\x68\x65\x6c\x6c\x6f\x20", 6, 0x7e627e58 }, { "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 32, 0x8a9136aa }, { "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", 32, 0x62a8ab43 }, { "\x1f\x1e\x1d\x1c\x1b\x1a\x19\x18\x17\x16\x15\x14\x13\x12\x11\x10\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00", 32, 0x113fdb5c }, { "\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x14\x00\x00\x00\x18\x28\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", 48, 0xd9963a56 }, { "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f", 32, 0x46dd794e }, { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28", 40, 0x0e2c157f }, { "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50", 40, 0xe980ebf6 }, { "\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78", 40, 0xde74bded }, { "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0", 40, 0xd579c862 }, { "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8", 40, 0xba979ad0 }, { "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0", 40, 0x2b29d913 }, { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0", 240, 0x24c5d375 }, { 0, 0, 0 } }; static void test_crc32c(void) { unsigned i; for (i = 0; TEST_CRC32C[i].data; ++i) { uint32_t digest; uint32_t digest_gen; digest = crc32c(0, (const unsigned char*)TEST_CRC32C[i].data, TEST_CRC32C[i].len); digest_gen = crc32c_gen(0, (const unsigned char*)TEST_CRC32C[i].data, TEST_CRC32C[i].len); if (digest != TEST_CRC32C[i].digest || digest_gen != TEST_CRC32C[i].digest) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed CRC32C test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } /** * Size of tommy data structures. */ #define TOMMY_SIZE 256 static int tommy_test_search(const void* arg, const void* obj) { return arg != obj; } static int tommy_test_compare(const void* void_arg_a, const void* void_arg_b) { if (void_arg_a < void_arg_b) return -1; if (void_arg_a > void_arg_b) return 1; return 0; } static unsigned tommy_test_foreach_count; static void tommy_test_foreach(void* obj) { (void)obj; ++tommy_test_foreach_count; } static void tommy_test_foreach_arg(void* void_arg, void* obj) { unsigned* arg = void_arg; (void)obj; ++*arg; } static void test_tommy(void) { tommy_array array; tommy_arrayblkof arrayblkof; tommy_list list; tommy_hashdyn hashdyn; tommy_tree tree; tommy_node node[TOMMY_SIZE + 1]; unsigned i; tommy_array_init(&array); tommy_arrayblkof_init(&arrayblkof, sizeof(unsigned)); for (i = 0; i < TOMMY_SIZE; ++i) { tommy_array_insert(&array, &node[i]); tommy_arrayblkof_grow(&arrayblkof, i + 1); *(unsigned*)tommy_arrayblkof_ref(&arrayblkof, i) = i; } tommy_array_grow(&array, TOMMY_SIZE); tommy_arrayblkof_grow(&arrayblkof, TOMMY_SIZE); if (tommy_array_memory_usage(&array) < TOMMY_SIZE * sizeof(void*)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_arrayblkof_memory_usage(&arrayblkof) < TOMMY_SIZE * sizeof(unsigned)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } for (i = 0; i < TOMMY_SIZE; ++i) { if (tommy_array_get(&array, i) != &node[i]) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (*(unsigned*)tommy_arrayblkof_ref(&arrayblkof, i) != i) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } } tommy_arrayblkof_done(&arrayblkof); tommy_array_done(&array); tommy_list_init(&list); if (!tommy_list_empty(&list)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_list_tail(&list)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_list_head(&list)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } tommy_list_insert_tail(&list, &node[0], &node[0]); if (tommy_list_tail(&list) != tommy_list_head(&list)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } tommy_hashdyn_init(&hashdyn); for (i = 0; i < TOMMY_SIZE; ++i) tommy_hashdyn_insert(&hashdyn, &node[i], &node[i], i % 64); if (tommy_hashdyn_count(&hashdyn) != TOMMY_SIZE) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_hashdyn_memory_usage(&hashdyn) < TOMMY_SIZE * sizeof(tommy_node)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } tommy_test_foreach_count = 0; tommy_hashdyn_foreach(&hashdyn, tommy_test_foreach); if (tommy_test_foreach_count != TOMMY_SIZE) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } tommy_test_foreach_count = 0; tommy_hashdyn_foreach_arg(&hashdyn, tommy_test_foreach_arg, &tommy_test_foreach_count); if (tommy_test_foreach_count != TOMMY_SIZE) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } for (i = 0; i < TOMMY_SIZE / 2; ++i) tommy_hashdyn_remove_existing(&hashdyn, &node[i]); for (i = 0; i < TOMMY_SIZE / 2; ++i) { if (tommy_hashdyn_remove(&hashdyn, tommy_test_search, &node[i], i % 64) != 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } } for (i = TOMMY_SIZE / 2; i < TOMMY_SIZE; ++i) { if (tommy_hashdyn_remove(&hashdyn, tommy_test_search, &node[i], i % 64) == 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } } if (tommy_hashdyn_count(&hashdyn) != 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } tommy_hashdyn_done(&hashdyn); tommy_tree_init(&tree, tommy_test_compare); for (i = 0; i < TOMMY_SIZE; ++i) tommy_tree_insert(&tree, &node[i], (void*)(uintptr_t)(i + 1)); /* try to insert a duplicate, count should not change */ tommy_tree_insert(&tree, &node[TOMMY_SIZE], (void*)(uintptr_t)1); if (tommy_tree_count(&tree) != TOMMY_SIZE) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_tree_memory_usage(&tree) < TOMMY_SIZE * sizeof(tommy_node)) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_tree_search(&tree, (void*)1) != (void*)1) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_tree_search(&tree, (void*)-1) != 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_tree_search_compare(&tree, tommy_test_compare, (void*)1) != (void*)1) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } if (tommy_tree_search_compare(&tree, tommy_test_compare, (void*)-1) != 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } tommy_test_foreach_count = 0; tommy_tree_foreach(&tree, tommy_test_foreach); if (tommy_test_foreach_count != TOMMY_SIZE) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } tommy_test_foreach_count = 0; tommy_tree_foreach_arg(&tree, tommy_test_foreach_arg, &tommy_test_foreach_count); if (tommy_test_foreach_count != TOMMY_SIZE) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } for (i = 0; i < TOMMY_SIZE / 2; ++i) tommy_tree_remove_existing(&tree, &node[i]); for (i = 0; i < TOMMY_SIZE / 2; ++i) { if (tommy_tree_remove(&tree, (void*)(uintptr_t)(i + 1)) != 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } } for (i = TOMMY_SIZE / 2; i < TOMMY_SIZE; ++i) { if (tommy_tree_remove(&tree, (void*)(uintptr_t)(i + 1)) == 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } } if (tommy_tree_count(&tree) != 0) { /* LCOV_EXCL_START */ goto bail; /* LCOV_EXCL_STOP */ } return; bail: /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed tommy test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } struct { const char* pattern; const char* text; int result; } WNMATCH_TEST[] = { /* basic literal matching */ { "hello", "hello", 0 }, { "hello", "world", 1 }, { "", "", 0 }, { "hello", "", 1 }, { "", "hello", 1 }, /* single asterisk (*) */ { "*", "anything", 0 }, { "*", "", 0 }, { "*.txt", "file.txt", 0 }, { "*.txt", "file.doc", 1 }, { "*file*", "myfile.txt", 0 }, { "f*le", "file", 0 }, { "f*le", "fiiiile", 0 }, { "f*le", "folder", 1 }, { "a*b*c", "abc", 0 }, { "a*b*c", "aXbYc", 0 }, { "a*b*c", "aXXbYYc", 0 }, { "a*b*c", "ac", 1 }, { "***", "anything", 0 }, { "*.txt", "notes.txt", 0 }, { "*.txt", "folder/notes.txt", 1 }, { "*.js", "main.jsx", 1 }, /* single asterisk with / */ { "*", "a/b", 1 }, { "*.txt", "dir/file.txt", 1 }, { "dir/*.txt", "dir/file.txt", 0 }, { "*/*.txt", "dir/file.txt", 0 }, { "*/*.txt", "a/b/file.txt", 1 }, /* question mark (?) */ { "?", "a", 0 }, { "?", "ab", 1 }, { "?", "", 1 }, { "file?.txt", "file1.txt", 0 }, { "file?.txt", "fileA.txt", 0 }, { "file?.txt", "file10.txt", 1 }, { "???", "abc", 0 }, { "???", "ab", 1 }, { "a?c", "abc", 0 }, { "a?c", "ac", 1 }, { "file?.txt", "file1.txt", 0 }, { "file?.txt", "file12.txt", 1 }, /* question mark with / */ { "?", "/", 1 }, { "dir?file", "dir/file", 1 }, { "dir?file", "dirAfile", 0 }, /* character classes [...] */ { "[abc]", "a", 0 }, { "[abc]", "b", 0 }, { "[abc]", "c", 0 }, { "[abc]", "d", 1 }, { "[abc]", "", 1 }, { "file[0-9].txt", "file5.txt", 0 }, { "file[0-9].txt", "fileA.txt", 1 }, { "[a-z]", "m", 0 }, { "[A-Z]", "M", 0 }, { "[0-9a-f]", "a", 0 }, { "[0-9a-f]", "5", 0 }, { "[0-9a-f]", "g", 1 }, { "[a-z].js", "p.js", 0 }, { "[a-z].js", "1.js", 1 }, { "[0-9].txt", "a.txt", 1 }, { "[!a-z].js", "b.js", 1 }, /* negated character classes [!...] */ { "[!abc]", "d", 0 }, { "[!abc]", "a", 1 }, { "[!0-9]", "a", 0 }, { "[!0-9]", "5", 1 }, { "file[!0-9].txt", "filea.txt", 0 }, { "file[!0-9].txt", "file5.txt", 1 }, { "[^abc]", "d", 0 }, { "[^abc]", "a", 1 }, /* character classes with / */ { "[a-z]", "/", 1 }, { "dir[/]file", "dir/file", 1 }, #ifdef WIN32 /* case */ { "hello", "HELLO", 0 }, { "Hello", "hello", 0 }, { "*.TXT", "file.txt", 0 }, { "FILE.txt", "file.TXT", 0 }, { "[a-z]", "A", 0 }, { "[ABC]", "b", 0 }, { "[a-z].js", "A.js", 0 }, { "[a-z]", "M", 0 }, #else { "hello", "HELLO", 1 }, { "Hello", "hello", 1 }, { "*.TXT", "file.txt", 1 }, { "FILE.txt", "file.TXT", 1 }, { "[a-z]", "A", 1 }, { "[ABC]", "b", 1 }, { "[a-z].js", "A.js", 1 }, { "[a-z]", "M", 1 }, #endif /* the /xx/ collapse case */ { "a/**/b", "a/b", 0 }, { "a/**/b", "a/x/b", 0 }, /* double asterisk (xx/) at start */ { "**/*.txt", "file.txt", 0 }, { "**/*.txt", "dir/file.txt", 0 }, { "**/*.txt", "a/b/c/file.txt", 0 }, { "**/*.txt", "file.doc", 1 }, { "**/test.txt", "test.txt", 0 }, { "**/test.txt", "a/b/test.txt", 0 }, { "**/test.txt", "a/b/other.txt", 1 }, { "**/*file*", "myfile.txt", 0 }, { "**/*file*", "dir/myfile.txt", 0 }, /* double asterisk (/xx) at end */ { "src/**", "src/", 0 }, { "src/**", "src/file.c", 0 }, { "src/**", "src/a/b/c/file.c", 0 }, { "src/**", "other/file.c", 1 }, { "src/**", "src", 1 }, { "dir/**", "dir/subdir/", 0 }, /* double asterisk (/xx/) in middle */ { "src/**/*.c", "src/file.c", 0 }, { "src/**/*.c", "src/lib/file.c", 0 }, { "src/**/*.c", "src/lib/util/file.c", 0 }, { "src/**/*.c", "src/file.h", 1 }, { "src/**/*.c", "other/file.c", 1 }, { "a/**/b/**/c", "a/b/c", 0 }, { "a/**/b/**/c", "a/x/b/y/c", 0 }, { "a/**/b/**/c", "a/x/y/b/z/w/c", 0 }, { "a/**/b", "a/x/y/z/b", 0 }, { "/docs/**/api.md", "/docs/api.md", 0 }, { "a/**/b", "a/xb", 1 }, { "a/**/b", "ax/b", 1 }, { "a/**/b", "a/c/xb", 1 }, { "a/**/b", "ax/c/b", 1 }, { "a/**/b", "a/x/y/c", 1 }, { "a/**/b", "axb", 1 }, /* multiple recursion segments */ { "**/**/file", "file", 0 }, { "**/**/file", "a/b/c/file", 0 }, { "a/**/b/**/c", "a/b/c", 0 }, { "a/**/b/**/c", "a/1/b/2/c", 0 }, /* combined patterns */ { "*.{txt,doc}", "file.txt", 1 }, { "file[0-9]*.txt", "file5abc.txt", 0 }, { "dir/*/file?.txt", "dir/sub/file1.txt", 0 }, { "**/src/**/*.c", "project/src/lib/file.c", 0 }, /* edge cases */ { "**", "anything", 0 }, { "a/**", "a/b", 0 }, { "a**", "aaa", 0 }, { "**a", "xxa", 0 }, { "a/**/", "a/b/", 0 }, { "a/**/b", "a/b", 0 }, { "a/**/b", "a//b", 0 }, { "*/**/file.txt", "a/file.txt", 0 }, { "*/**/file.txt", "a/b/c/file.txt", 0 }, { "a**/file.txt", "afile.txt", 1 }, { "/*/**/file.txt", "/file.txt", 1 }, { "*/**/file.txt", "/file.txt", 0 }, { "src/**/**/file.txt", "src/file.txt", 0 }, { "src/**/**/file.txt", "src/sub/file.txt", 0 }, { "src/***/file.txt", "src/file.txt", 0 }, { "src/***/file.txt", "src/sub/file.txt", 0 }, { "src/***/file.txt", "src/sub/sub/file.txt", 0 }, { "src/****/file.txt", "src/file.txt", 0 }, { "src/****/file.txt", "src/sub/file.txt", 0 }, { "src/****/file.txt", "src/sub/sub/file.txt", 0 }, { "**/build", "a/b/build", 0 }, { "src/**/test.js", "src/ui/test.js", 0 }, { "dist/**", "dist/bin/app.exe", 0 }, { "src-**", "src-folder/file.js", 1 }, { "**pkg/init.py", "libs/core/pkg/init.py", 1 }, { "**.log", "error.log", 0 }, { "**.log", "var/log/sys.log", 1 }, { "src/**.js", "src/app.js", 0 }, { "src/**.js", "src/components/ui/button.js", 0 }, /* <<<<< .GITIGNORE DIFFERS */ { "a**b.txt", "ab.txt", 0 }, { "a**b.txt", "axxb.txt", 0 }, { "a**b.txt", "a/b.txt", 1 }, { "a**b.txt", "a/subdir/b.txt", 1 }, { "a**b.txt", "a_folder/sub/b.txt", 1 }, { "a**b.txt", "a_folder/sub/folter_b.txt", 1 }, { "**/build", "build", 0 }, { "**/build", "project/out/build", 0 }, /* negative tests */ { "/docs/**/api.md", "docs/api.txt", 1 }, { "a/**/b", "a/b/c", 1 }, { "static/**", "static", 1 }, { "src/*.js", "src/ui/app.js", 1 }, { "/config.*", "etc/config.json", 1 }, { "*/*/*.c", "main.c", 1 }, { "a/*/b", "a/b", 1 }, { "a/**/b", "axb", 1 }, { "a/**/b", "ab", 1 }, { "/**/logs", "logs", 1 }, { "/src/**/logs", "src/web/log", 1 }, { "foo//bar", "foo/bar", 1 }, { "a/**/b", "a/b/", 1 }, { "a**b**c", "acb", 1 }, { "src-**-pkg", "src-pkg", 1 }, { "**/test/*.js", "test/ui/app.js", 1 }, /* complex real-world patterns */ { "**/.git/**", ".git/config", 0 }, { "**/.git/**", "project/.git/hooks/pre-commit", 0 }, { "**/node_modules/**", "node_modules/pkg/index.js", 0 }, { "**/node_modules/**", "app/node_modules/pkg/file.js", 0 }, { "src/**/*.{c,h}", "src/main.c", 1 }, { "**/test_*.py", "test_example.py", 0 }, { "**/test_*.py", "tests/test_feature.py", 0 }, /* performance/stress patterns */ { "a*b*c*d*e*f*g*h*i*j*k", "abcdefghijk", 0 }, { "a*b*c*d*e*f*g*h*i*j*k", "aXbXcXdXeXfXgXhXiXjXk", 0 }, { "**/**/**/*.txt", "a/b/c/d/e/f.txt", 0 }, /* trailing/leading slashes */ { "dir/", "dir/", 0 }, { "/root/*", "/root/file", 0 }, /* complex embedded patterns */ { "src-**-pkg/*.js", "src-web-pkg/main.js", 0 }, { "src-**-pkg/*.js", "src-lazy-load-ui-pkg/main.js", 0 }, { "src-**-pkg/*.js", "src-web-pkg/subdir/main.js", 1 }, /* anchoring and slashes */ { "/root.txt", "root.txt", 1 }, { "/root.txt", "subdir/root.txt", 1 }, { "docs/", "docs", 1 }, { "docs/", "docs/", 0 }, { "**/temp/", "src/temp/", 0 }, { "**/temp/", "src/temp", 1 }, { 0 } }; static void test_wnmatch(void) { for (int i = 0; WNMATCH_TEST[i].pattern; ++i) { if (wnmatch(WNMATCH_TEST[i].pattern, WNMATCH_TEST[i].text) != WNMATCH_TEST[i].result) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed wnmatch test %s %s, expected %d\n", WNMATCH_TEST[i].pattern, WNMATCH_TEST[i].text, WNMATCH_TEST[i].result); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } void selftest(void) { log_tag("selftest:\n"); log_flush(); msg_progress("Self-test...\n"); /* large file check */ if (sizeof(off_t) < sizeof(uint64_t)) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Missing support for large files\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (util_selftest() != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed UTIL test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } test_hash(); test_crc32c(); test_tommy(); test_wnmatch(); if (raid_selftest() != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed SELF test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_sort() != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed SORT test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_insert() != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed INSERT test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_combo() != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed COMBO test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_par(RAID_MODE_VANDERMONDE, 32, 256) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed GEN Vandermonde test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_rec(RAID_MODE_VANDERMONDE, 12, 256) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed REC Vandermonde test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_par(RAID_MODE_CAUCHY, 32, 256) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed GEN Cauchy test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_rec(RAID_MODE_CAUCHY, 12, 256) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed REC Cauchy test\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (raid_test_par(RAID_MODE_CAUCHY, 1, 256) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed GEN Cauchy test single data disk\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } snapraid-14.9/cmdline/snapraid.c000066400000000000000000002050141522717156100166410ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "snapraid.h" #include "support.h" #include "elem.h" #include "import.h" #include "search.h" #include "state.h" #include "io.h" #include "raid/raid.h" #include "locate.h" /****************************************************************************/ /* misc */ void version(void) { msg_status(PACKAGE_NAME " v" VERSION " by Andrea Mazzoleni, " PACKAGE_URL "\n"); } void usage(const char* conf) { version(); printf("Usage: " PACKAGE " status|diff|sync|scrub|list|dup|up|down|probe|touch|smart|pool|check|fix [options]\n"); printf("\n"); printf("Commands:\n"); printf(" status Print the status of the array\n"); printf(" diff Show the changes that needs to be synchronized\n"); printf(" sync Synchronize the state of the array\n"); printf(" scrub Scrub the array\n"); printf(" list List the array content\n"); printf(" dup Find duplicate files\n"); printf(" up Spin-up the array\n"); printf(" down Spin-down the array\n"); printf(" probe Show the spinning status of all disks\n"); printf(" touch Add non-zero ns timestamps to files\n"); printf(" smart SMART attributes of the array\n"); printf(" pool Create or update the virtual view of the array\n"); printf(" check Check the array\n"); printf(" fix Fix the array\n"); printf("\n"); printf("Options:\n"); printf(" " SWITCH_GETOPT_LONG("-c, --conf FILE ", "-c") " Configuration file\n"); printf(" " SWITCH_GETOPT_LONG("-f, --filter PATTERN ", "-f") " Process only files matching the pattern\n"); printf(" " SWITCH_GETOPT_LONG("-d, --filter-disk NAME", "-d") " Process only files in the specified disk\n"); printf(" " SWITCH_GETOPT_LONG("-m, --filter-missing ", "-m") " Process only missing/deleted files\n"); printf(" " SWITCH_GETOPT_LONG("-e, --filter-error ", "-e") " Process only files with errors\n"); printf(" " SWITCH_GETOPT_LONG("-p, --plan PLAN ", "-p") " Define a scrub plan or percentage\n"); printf(" " SWITCH_GETOPT_LONG("-o, --older-than DAYS ", "-o") " Process only the older part of the array\n"); printf(" " SWITCH_GETOPT_LONG("-i, --import DIR ", "-i") " Import deleted files\n"); printf(" " SWITCH_GETOPT_LONG("-l, --log FILE ", "-l") " Log file. Default none\n"); printf(" " SWITCH_GETOPT_LONG("-a, --audit-only ", "-a") " Check only file data and not parity\n"); printf(" " SWITCH_GETOPT_LONG("-h, --pre-hash ", "-h") " Pre-hash all the new data\n"); printf(" " SWITCH_GETOPT_LONG("-Z, --force-zero ", "-Z") " Force syncing of files that get zero size\n"); printf(" " SWITCH_GETOPT_LONG("-E, --force-empty ", "-E") " Force syncing of disks that get empty\n"); printf(" " SWITCH_GETOPT_LONG("-U, --force-uuid ", "-U") " Force commands on disks with uuid changed\n"); printf(" " SWITCH_GETOPT_LONG("-D, --force-device ", "-D") " Force commands with inaccessible/shared disks\n"); printf(" " SWITCH_GETOPT_LONG("-N, --force-nocopy ", "-N") " Force commands disabling the copy detection\n"); /* --force-full, --force-realloc and --force-realloc-tail are not listed as they are dangerous */ printf(" " SWITCH_GETOPT_LONG("-w, --bw-limit RATE ", "-w") " Limit IO bandwidth (M|G)\n"); printf(" " SWITCH_GETOPT_LONG("-v, --verbose ", "-v") " Verbose\n"); printf("\n"); printf("Configuration file: %s\n", conf); printf("\n"); } void memory(void) { log_tag("memory:used:%" PRIu64 "\n", (uint64_t)malloc_counter_get()); /* size of the block */ log_tag("memory:block:%" PRIu64 "\n", (uint64_t)(sizeof(struct snapraid_block))); log_tag("memory:extent:%" PRIu64 "\n", (uint64_t)(sizeof(struct snapraid_extent))); log_tag("memory:file:%" PRIu64 "\n", (uint64_t)(sizeof(struct snapraid_file))); log_tag("memory:link:%" PRIu64 "\n", (uint64_t)(sizeof(struct snapraid_link))); log_tag("memory:dir:%" PRIu64 "\n", (uint64_t)(sizeof(struct snapraid_dir))); msg_progress("Using %u MiB of memory for the file-system.\n", (unsigned)(malloc_counter_get() / MEBI)); } void test(int argc, char* argv[]) { int i; char buffer[ESC_MAX]; /* special testing code */ if (argc < 2 || strcmp(argv[1], "test") != 0) return; lock_init(); assert(strcmp(strpolish(strcpy(buffer, "\r \n\xFF")), " ") == 0); assert(strcmp(strtrim(strcpy(buffer, " trim trim \n\r")), "trim trim") == 0); assert(strcmp(strlwr(strcpy(buffer, " LoWer\n\r")), " lower\n\r") == 0); assert(worddigitstr("longneedlestring", "needle") == 0); assert(worddigitstr("longneedlestring", "") == 0); assert(worddigitstr("long needle string", "needle") != 0); assert(worddigitstr("long1needle2string", "needle") != 0); assert(worddigitstr("long\rneedle3string", "needle") != 0); assert(worddigitstr("long1needle", "needle") != 0); assert(worddigitstr("needle2string", "needle") != 0); assert(worddigitstr("needle", "needle") != 0); assert(strcmp(esc_tag("simple"), "simple") == 0); assert(strcmp(esc_tag("line1\nline2"), "line1\\nline2") == 0); assert(strcmp(esc_tag("line1\rline2"), "line1\\rline2") == 0); assert(strcmp(esc_tag("key:value"), "key\\dvalue") == 0); assert(strcmp(esc_tag("C:\\path\\file"), "C\\d\\\\path\\\\file") == 0); assert(strcmp(esc_tag("A\nB\rC:D\\E"), "A\\nB\\rC\\dD\\\\E") == 0); assert(strcmp(esc_tag("endwith\\"), "endwith\\\\") == 0); assert(strcmp(esc_tag(""), "") == 0); assert(strcmp(esc_tag("\n\r:\\\\"), "\\n\\r\\d\\\\\\\\") == 0); for (i = 2; i < argc; ++i) { printf("argv[%d]\n", i); printf("\t#%s#\n", argv[i]); printf("\t#%s#\n", esc_shell(argv[i], buffer)); } #ifdef _WIN32 /* basic cases - no special characters, no quotes needed */ assert(strcmp(esc_shell("simple", buffer), "simple") == 0); assert(strcmp(esc_shell("file.txt", buffer), "file.txt") == 0); assert(strcmp(esc_shell("file123", buffer), "file123") == 0); assert(strcmp(esc_shell("file_name-test.doc", buffer), "file_name-test.doc") == 0); assert(strcmp(esc_shell(",._+:@/-", buffer), ",._+:@/-") == 0); assert(strcmp(esc_shell("C:\\Users\\test", buffer), "C:\\Users\\test") == 0); /* space - requires quoting */ assert(strcmp(esc_shell(" ", buffer), "\" \"") == 0); assert(strcmp(esc_shell("file name.txt", buffer), "\"file name.txt\"") == 0); assert(strcmp(esc_shell("my document.doc", buffer), "\"my document.doc\"") == 0); assert(strcmp(esc_shell(" multiple spaces ", buffer), "\" multiple spaces \"") == 0); /* tab - requires quoting */ assert(strcmp(esc_shell("\t", buffer), "\"\t\"") == 0); assert(strcmp(esc_shell("file\tname", buffer), "\"file\tname\"") == 0); /* newline - requires quoting */ assert(strcmp(esc_shell("\n", buffer), "\"\n\"") == 0); assert(strcmp(esc_shell("line1\nline2", buffer), "\"line1\nline2\"") == 0); /* carriage return - requires quoting */ assert(strcmp(esc_shell("\r", buffer), "\"\r\"") == 0); assert(strcmp(esc_shell("text\r\n", buffer), "\"text\r\n\"") == 0); /* double quote - requires quoting and escaping with backslash */ assert(strcmp(esc_shell("\"", buffer), "\"\\\"\"") == 0); assert(strcmp(esc_shell("file\"name", buffer), "\"file\\\"name\"") == 0); assert(strcmp(esc_shell("\"quoted\"", buffer), "\"\\\"quoted\\\"\"") == 0); assert(strcmp(esc_shell("say \"hello\"", buffer), "\"say \\\"hello\\\"\"") == 0); /* ampersand - requires quoting */ assert(strcmp(esc_shell("&", buffer), "\"&\"") == 0); assert(strcmp(esc_shell("file&name", buffer), "\"file&name\"") == 0); assert(strcmp(esc_shell("a&b&c", buffer), "\"a&b&c\"") == 0); assert(strcmp(esc_shell("file & name", buffer), "\"file & name\"") == 0); /* pipe - requires quoting */ assert(strcmp(esc_shell("|", buffer), "\"|\"") == 0); assert(strcmp(esc_shell("file|name", buffer), "\"file|name\"") == 0); assert(strcmp(esc_shell("a | b", buffer), "\"a | b\"") == 0); /* parentheses - requires quoting */ assert(strcmp(esc_shell("(", buffer), "\"(\"") == 0); assert(strcmp(esc_shell(")", buffer), "\")\"") == 0); assert(strcmp(esc_shell("(test)", buffer), "\"(test)\"") == 0); assert(strcmp(esc_shell("file (1)", buffer), "\"file (1)\"") == 0); assert(strcmp(esc_shell("file(copy)", buffer), "\"file(copy)\"") == 0); /* angle brackets - requires quoting */ assert(strcmp(esc_shell("<", buffer), "\"<\"") == 0); assert(strcmp(esc_shell(">", buffer), "\">\"") == 0); assert(strcmp(esc_shell("ac", buffer), "\"ac\"") == 0); assert(strcmp(esc_shell("file > output", buffer), "\"file > output\"") == 0); /* caret - requires quoting */ assert(strcmp(esc_shell("^", buffer), "\"^\"") == 0); assert(strcmp(esc_shell("test^test", buffer), "\"test^test\"") == 0); assert(strcmp(esc_shell("a ^ b", buffer), "\"a ^ b\"") == 0); /* multiple special chars - requires quoting */ assert(strcmp(esc_shell("&|()<>^", buffer), "\"&|()<>^\"") == 0); assert(strcmp(esc_shell("test&|test", buffer), "\"test&|test\"") == 0); assert(strcmp(esc_shell("a & b | c", buffer), "\"a & b | c\"") == 0); /* percent sign - requires quoting */ assert(strcmp(esc_shell("%", buffer), "\"%\"") == 0); assert(strcmp(esc_shell("%%", buffer), "\"%%\"") == 0); assert(strcmp(esc_shell("%PATH%", buffer), "\"%PATH%\"") == 0); assert(strcmp(esc_shell("test%var%test", buffer), "\"test%var%test\"") == 0); assert(strcmp(esc_shell("%PATH% file", buffer), "\"%PATH% file\"") == 0); /* exclamation mark - requires quoting */ assert(strcmp(esc_shell("!", buffer), "\"!\"") == 0); assert(strcmp(esc_shell("!VAR!", buffer), "\"!VAR!\"") == 0); assert(strcmp(esc_shell("test!test", buffer), "\"test!test\"") == 0); assert(strcmp(esc_shell("hello !world!", buffer), "\"hello !world!\"") == 0); /* equals sign - requires quoting */ assert(strcmp(esc_shell("=", buffer), "\"=\"") == 0); assert(strcmp(esc_shell("VAR=value", buffer), "\"VAR=value\"") == 0); assert(strcmp(esc_shell("a=b", buffer), "\"a=b\"") == 0); /* semicolon - requires quoting */ assert(strcmp(esc_shell(";", buffer), "\";\"") == 0); assert(strcmp(esc_shell("cmd1;cmd2", buffer), "\"cmd1;cmd2\"") == 0); /* backslash - no quotes needed when alone or in path */ assert(strcmp(esc_shell("\\", buffer), "\\") == 0); assert(strcmp(esc_shell("C:\\", buffer), "C:\\") == 0); assert(strcmp(esc_shell("C:\\Users", buffer), "C:\\Users") == 0); assert(strcmp(esc_shell("path\\to\\file", buffer), "path\\to\\file") == 0); assert(strcmp(esc_shell("C:\\folder\\", buffer), "C:\\folder\\") == 0); /* backslash with space - requires quoting, normal backslash inside */ assert(strcmp(esc_shell("\\ ", buffer), "\"\\ \"") == 0); assert(strcmp(esc_shell("C:\\ ", buffer), "\"C:\\ \"") == 0); assert(strcmp(esc_shell("C:\\Program Files", buffer), "\"C:\\Program Files\"") == 0); /* trailing backslash with quotes - backslashes before closing quote must be doubled */ assert(strcmp(esc_shell("C:\\folder\\ ", buffer), "\"C:\\folder\\ \"") == 0); assert(strcmp(esc_shell("path\\ ", buffer), "\"path\\ \"") == 0); assert(strcmp(esc_shell("C:\\My Documents\\", buffer), "\"C:\\My Documents\\\\\"") == 0); /* backslash before embedded quote - backslash before quote must be doubled */ assert(strcmp(esc_shell("C:\\\"test\"", buffer), "\"C:\\\\\\\"test\\\"\"") == 0); assert(strcmp(esc_shell("path\\\"file\"", buffer), "\"path\\\\\\\"file\\\"\"") == 0); /* multiple trailing backslashes before end with quotes */ assert(strcmp(esc_shell("test\\\\ ", buffer), "\"test\\\\ \"") == 0); assert(strcmp(esc_shell("path\\\\\\\\ ", buffer), "\"path\\\\\\\\ \"") == 0); /* backslash NOT before quote - normal backslash */ assert(strcmp(esc_shell("test\\file ", buffer), "\"test\\file \"") == 0); assert(strcmp(esc_shell("a\\b c", buffer), "\"a\\b c\"") == 0); /* control characters - require quoting */ assert(strcmp(esc_shell("\x01", buffer), "\"\x01\"") == 0); assert(strcmp(esc_shell("\x1F", buffer), "\"\x1F\"") == 0); assert(strcmp(esc_shell("\x7F", buffer), "\"\x7F\"") == 0); /* DEL character */ assert(strcmp(esc_shell("test\x01test", buffer), "\"test\x01test\"") == 0); /* complex real-world examples */ assert(strcmp(esc_shell("C:\\Program Files\\App", buffer), "\"C:\\Program Files\\App\"") == 0); assert(strcmp(esc_shell("C:\\Program Files (x86)\\", buffer), "\"C:\\Program Files (x86)\\\\\"") == 0); assert(strcmp(esc_shell("file (copy).txt", buffer), "\"file (copy).txt\"") == 0); assert(strcmp(esc_shell("setup-v1.0.exe", buffer), "setup-v1.0.exe") == 0); assert(strcmp(esc_shell("setup v1.0.exe", buffer), "\"setup v1.0.exe\"") == 0); /* mixed quotes and special chars */ assert(strcmp(esc_shell("say \"hi\" & exit", buffer), "\"say \\\"hi\\\" & exit\"") == 0); assert(strcmp(esc_shell("test \"a|b\"", buffer), "\"test \\\"a|b\\\"\"") == 0); /* empty string */ assert(strcmp(esc_shell("", buffer), "") == 0); /* all safe characters that don't need escaping */ assert(strcmp(esc_shell("abcdefghijklmnopqrstuvwxyz", buffer), "abcdefghijklmnopqrstuvwxyz") == 0); assert(strcmp(esc_shell("ABCDEFGHIJKLMNOPQRSTUVWXYZ", buffer), "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 0); assert(strcmp(esc_shell("0123456789", buffer), "0123456789") == 0); assert(strcmp(esc_shell("._-+,@:", buffer), "._-+,@:") == 0); #else /* basic cases - no special characters */ assert(strcmp(esc_shell("simple", buffer), "simple") == 0); assert(strcmp(esc_shell("file.txt", buffer), "file.txt") == 0); assert(strcmp(esc_shell("file123", buffer), "file123") == 0); assert(strcmp(esc_shell("file_name-test.doc", buffer), "file_name-test.doc") == 0); assert(strcmp(esc_shell(",._+:@/-", buffer), ",._+:@/-") == 0); assert(strcmp(esc_shell("/usr/local/bin", buffer), "/usr/local/bin") == 0); /* empty string */ assert(strcmp(esc_shell("", buffer), "") == 0); /* space - escape with backslash */ assert(strcmp(esc_shell(" ", buffer), "\\ ") == 0); assert(strcmp(esc_shell("file name.txt", buffer), "file\\ name.txt") == 0); assert(strcmp(esc_shell("my document.doc", buffer), "my\\ document.doc") == 0); assert(strcmp(esc_shell(" spaces ", buffer), "\\ \\ spaces\\ \\ ") == 0); assert(strcmp(esc_shell("a b c", buffer), "a\\ b\\ c") == 0); /* tab - escape with backslash */ assert(strcmp(esc_shell("\t", buffer), "\\\t") == 0); assert(strcmp(esc_shell("file\tname", buffer), "file\\\tname") == 0); assert(strcmp(esc_shell("\t\t", buffer), "\\\t\\\t") == 0); /* newline - escape with backslash */ assert(strcmp(esc_shell("\n", buffer), "\\\n") == 0); assert(strcmp(esc_shell("line1\nline2", buffer), "line1\\\nline2") == 0); assert(strcmp(esc_shell("\n\n", buffer), "\\\n\\\n") == 0); /* carriage return - escape with backslash */ assert(strcmp(esc_shell("\r", buffer), "\\\r") == 0); assert(strcmp(esc_shell("text\r\n", buffer), "text\\\r\\\n") == 0); /* tilde (home directory expansion) */ assert(strcmp(esc_shell("~", buffer), "\\~") == 0); assert(strcmp(esc_shell("~/file", buffer), "\\~/file") == 0); assert(strcmp(esc_shell("file~name", buffer), "file\\~name") == 0); assert(strcmp(esc_shell("~user", buffer), "\\~user") == 0); /* backtick (command substitution) */ assert(strcmp(esc_shell("`", buffer), "\\`") == 0); assert(strcmp(esc_shell("`command`", buffer), "\\`command\\`") == 0); assert(strcmp(esc_shell("test`test", buffer), "test\\`test") == 0); assert(strcmp(esc_shell("``", buffer), "\\`\\`") == 0); /* hash (comment) */ assert(strcmp(esc_shell("#", buffer), "\\#") == 0); assert(strcmp(esc_shell("#comment", buffer), "\\#comment") == 0); assert(strcmp(esc_shell("file#name", buffer), "file\\#name") == 0); assert(strcmp(esc_shell("test#123", buffer), "test\\#123") == 0); /* dollar sign (variable expansion) */ assert(strcmp(esc_shell("$", buffer), "\\$") == 0); assert(strcmp(esc_shell("$$", buffer), "\\$\\$") == 0); assert(strcmp(esc_shell("$VAR", buffer), "\\$VAR") == 0); assert(strcmp(esc_shell("${VAR}", buffer), "\\$\\{VAR\\}") == 0); assert(strcmp(esc_shell("test$test", buffer), "test\\$test") == 0); assert(strcmp(esc_shell("$1", buffer), "\\$1") == 0); assert(strcmp(esc_shell("$PATH", buffer), "\\$PATH") == 0); /* ampersand (background job) */ assert(strcmp(esc_shell("&", buffer), "\\&") == 0); assert(strcmp(esc_shell("&&", buffer), "\\&\\&") == 0); assert(strcmp(esc_shell("file&name", buffer), "file\\&name") == 0); assert(strcmp(esc_shell("a&b&c", buffer), "a\\&b\\&c") == 0); assert(strcmp(esc_shell("cmd1 & cmd2", buffer), "cmd1\\ \\&\\ cmd2") == 0); /* asterisk (wildcard) */ assert(strcmp(esc_shell("*", buffer), "\\*") == 0); assert(strcmp(esc_shell("**", buffer), "\\*\\*") == 0); assert(strcmp(esc_shell("*.txt", buffer), "\\*.txt") == 0); assert(strcmp(esc_shell("file*name", buffer), "file\\*name") == 0); assert(strcmp(esc_shell("test*", buffer), "test\\*") == 0); /* parentheses (subshell) */ assert(strcmp(esc_shell("(", buffer), "\\(") == 0); assert(strcmp(esc_shell(")", buffer), "\\)") == 0); assert(strcmp(esc_shell("()", buffer), "\\(\\)") == 0); assert(strcmp(esc_shell("(test)", buffer), "\\(test\\)") == 0); assert(strcmp(esc_shell("file(1)", buffer), "file\\(1\\)") == 0); assert(strcmp(esc_shell("(a)(b)", buffer), "\\(a\\)\\(b\\)") == 0); /* backslash (escape character) */ assert(strcmp(esc_shell("\\", buffer), "\\\\") == 0); assert(strcmp(esc_shell("\\\\", buffer), "\\\\\\\\") == 0); assert(strcmp(esc_shell("path\\to\\file", buffer), "path\\\\to\\\\file") == 0); assert(strcmp(esc_shell("test\\test", buffer), "test\\\\test") == 0); assert(strcmp(esc_shell("a\\b\\c", buffer), "a\\\\b\\\\c") == 0); /* pipe (pipeline) */ assert(strcmp(esc_shell("|", buffer), "\\|") == 0); assert(strcmp(esc_shell("||", buffer), "\\|\\|") == 0); assert(strcmp(esc_shell("file|name", buffer), "file\\|name") == 0); assert(strcmp(esc_shell("a|b|c", buffer), "a\\|b\\|c") == 0); assert(strcmp(esc_shell("cmd1 | cmd2", buffer), "cmd1\\ \\|\\ cmd2") == 0); /* square brackets (wildcard) */ assert(strcmp(esc_shell("[", buffer), "\\[") == 0); assert(strcmp(esc_shell("]", buffer), "\\]") == 0); assert(strcmp(esc_shell("[]", buffer), "\\[\\]") == 0); assert(strcmp(esc_shell("[abc]", buffer), "\\[abc\\]") == 0); assert(strcmp(esc_shell("file[1]", buffer), "file\\[1\\]") == 0); assert(strcmp(esc_shell("[0-9]", buffer), "\\[0-9\\]") == 0); /* curly braces (brace expansion) */ assert(strcmp(esc_shell("{", buffer), "\\{") == 0); assert(strcmp(esc_shell("}", buffer), "\\}") == 0); assert(strcmp(esc_shell("{}", buffer), "\\{\\}") == 0); assert(strcmp(esc_shell("{a,b,c}", buffer), "\\{a,b,c\\}") == 0); assert(strcmp(esc_shell("file{1,2}", buffer), "file\\{1,2\\}") == 0); assert(strcmp(esc_shell("{1..10}", buffer), "\\{1..10\\}") == 0); /* semicolon (command separator) */ assert(strcmp(esc_shell(";", buffer), "\\;") == 0); assert(strcmp(esc_shell(";;", buffer), "\\;\\;") == 0); assert(strcmp(esc_shell("cmd1;cmd2", buffer), "cmd1\\;cmd2") == 0); assert(strcmp(esc_shell("test;test", buffer), "test\\;test") == 0); assert(strcmp(esc_shell("a; b", buffer), "a\\;\\ b") == 0); /* single quote */ assert(strcmp(esc_shell("'", buffer), "\\'") == 0); assert(strcmp(esc_shell("''", buffer), "\\'\\'") == 0); assert(strcmp(esc_shell("'test'", buffer), "\\'test\\'") == 0); assert(strcmp(esc_shell("file'name", buffer), "file\\'name") == 0); assert(strcmp(esc_shell("it's", buffer), "it\\'s") == 0); /* double quote */ assert(strcmp(esc_shell("\"", buffer), "\\\"") == 0); assert(strcmp(esc_shell("\"\"", buffer), "\\\"\\\"") == 0); assert(strcmp(esc_shell("\"test\"", buffer), "\\\"test\\\"") == 0); assert(strcmp(esc_shell("file\"name", buffer), "file\\\"name") == 0); assert(strcmp(esc_shell("say \"hi\"", buffer), "say\\ \\\"hi\\\"") == 0); /* angle brackets (redirection) */ assert(strcmp(esc_shell("<", buffer), "\\<") == 0); assert(strcmp(esc_shell(">", buffer), "\\>") == 0); assert(strcmp(esc_shell("<<", buffer), "\\<\\<") == 0); assert(strcmp(esc_shell(">>", buffer), "\\>\\>") == 0); assert(strcmp(esc_shell("ac", buffer), "a\\c") == 0); assert(strcmp(esc_shell("file>output", buffer), "file\\>output") == 0); assert(strcmp(esc_shell("cmd < in > out", buffer), "cmd\\ \\<\\ in\\ \\>\\ out") == 0); /* question mark (wildcard) */ assert(strcmp(esc_shell("?", buffer), "\\?") == 0); assert(strcmp(esc_shell("??", buffer), "\\?\\?") == 0); assert(strcmp(esc_shell("file?.txt", buffer), "file\\?.txt") == 0); assert(strcmp(esc_shell("test?test", buffer), "test\\?test") == 0); assert(strcmp(esc_shell("file??", buffer), "file\\?\\?") == 0); /* equals sign (assignment in some contexts) */ assert(strcmp(esc_shell("=", buffer), "\\=") == 0); assert(strcmp(esc_shell("==", buffer), "\\=\\=") == 0); assert(strcmp(esc_shell("VAR=value", buffer), "VAR\\=value") == 0); assert(strcmp(esc_shell("a=b", buffer), "a\\=b") == 0); assert(strcmp(esc_shell("PATH=/usr/bin", buffer), "PATH\\=/usr/bin") == 0); /* exclamation mark (history expansion) */ assert(strcmp(esc_shell("!", buffer), "\\!") == 0); assert(strcmp(esc_shell("!!", buffer), "\\!\\!") == 0); assert(strcmp(esc_shell("test!test", buffer), "test\\!test") == 0); assert(strcmp(esc_shell("!$", buffer), "\\!\\$") == 0); assert(strcmp(esc_shell("!123", buffer), "\\!123") == 0); /* control characters (0x01-0x1F) - escape with backslash */ assert(strcmp(esc_shell("\x01", buffer), "\\\x01") == 0); assert(strcmp(esc_shell("\x02", buffer), "\\\x02") == 0); assert(strcmp(esc_shell("\x1F", buffer), "\\\x1F") == 0); assert(strcmp(esc_shell("test\x01test", buffer), "test\\\x01test") == 0); /* DEL character (0x7F) */ assert(strcmp(esc_shell("\x7F", buffer), "\\\x7F") == 0); assert(strcmp(esc_shell("test\x7Ftest", buffer), "test\\\x7Ftest") == 0); /* multiple special characters combined */ assert(strcmp(esc_shell("$VAR & $OTHER", buffer), "\\$VAR\\ \\&\\ \\$OTHER") == 0); assert(strcmp(esc_shell("*.txt | grep test", buffer), "\\*.txt\\ \\|\\ grep\\ test") == 0); assert(strcmp(esc_shell("file (1) [copy].txt", buffer), "file\\ \\(1\\)\\ \\[copy\\].txt") == 0); assert(strcmp(esc_shell("a & b | c", buffer), "a\\ \\&\\ b\\ \\|\\ c") == 0); assert(strcmp(esc_shell("cmd1; cmd2 && cmd3", buffer), "cmd1\\;\\ cmd2\\ \\&\\&\\ cmd3") == 0); /* complex real-world examples */ assert(strcmp(esc_shell("/home/user/My Documents", buffer), "/home/user/My\\ Documents") == 0); assert(strcmp(esc_shell("/path/to/file (copy).txt", buffer), "/path/to/file\\ \\(copy\\).txt") == 0); assert(strcmp(esc_shell("~/project/file-v1.0.tar.gz", buffer), "\\~/project/file-v1.0.tar.gz") == 0); assert(strcmp(esc_shell("$(whoami)@$(hostname)", buffer), "\\$\\(whoami\\)@\\$\\(hostname\\)") == 0); assert(strcmp(esc_shell("test && echo 'done'", buffer), "test\\ \\&\\&\\ echo\\ \\'done\\'") == 0); assert(strcmp(esc_shell("file #1 [important].txt", buffer), "file\\ \\#1\\ \\[important\\].txt") == 0); assert(strcmp(esc_shell("/tmp/test (1).txt", buffer), "/tmp/test\\ \\(1\\).txt") == 0); assert(strcmp(esc_shell("var=$HOME/bin:$PATH", buffer), "var\\=\\$HOME/bin:\\$PATH") == 0); /* edge cases with multiple escapes */ assert(strcmp(esc_shell("a\\ b", buffer), "a\\\\\\ b") == 0); assert(strcmp(esc_shell("'\"test\"'", buffer), "\\'\\\"test\\\"\\'") == 0); assert(strcmp(esc_shell("$(echo \"test\")", buffer), "\\$\\(echo\\ \\\"test\\\"\\)") == 0); /* all safe characters that don't need escaping */ assert(strcmp(esc_shell("abcdefghijklmnopqrstuvwxyz", buffer), "abcdefghijklmnopqrstuvwxyz") == 0); assert(strcmp(esc_shell("ABCDEFGHIJKLMNOPQRSTUVWXYZ", buffer), "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 0); assert(strcmp(esc_shell("0123456789", buffer), "0123456789") == 0); assert(strcmp(esc_shell("._-+,@:", buffer), "._-+,@:") == 0); assert(strcmp(esc_shell("/path/to/file", buffer), "/path/to/file") == 0); assert(strcmp(esc_shell("simple_file-name.txt", buffer), "simple_file-name.txt") == 0); /* file extensions and versions */ assert(strcmp(esc_shell("file.tar.gz", buffer), "file.tar.gz") == 0); assert(strcmp(esc_shell("app-v1.2.3.deb", buffer), "app-v1.2.3.deb") == 0); assert(strcmp(esc_shell("test_2024-01-01.log", buffer), "test_2024-01-01.log") == 0); #endif random_seed(0); assert(random_u8() == 0xAF); assert(random_u64() == 0x6E789E6AA1B965F4ULL); printf("Everything OK\n"); lock_done(); exit(EXIT_SUCCESS); } /****************************************************************************/ /* log */ void log_open(const char* file) { char path[PATH_MAX]; const char* mode; char text_T[32]; char text_D[32]; time_t t; struct tm* tm; #if HAVE_LOCALTIME_R struct tm tm_res; #endif /* leave stdlog at 0 if not specified */ if (file == 0) return; t = time(0); #if HAVE_LOCALTIME_R tm = localtime_r(&t, &tm_res); #else tm = localtime(&t); #endif if (tm) { strftime(text_T, sizeof(text_T), "%H%M%S", tm); strftime(text_D, sizeof(text_T), "%Y%m%d", tm); } else { /* LCOV_EXCL_START */ strcpy(text_T, "invalid"); strcpy(text_D, "invalid"); /* LCOV_EXCL_STOP */ } /* file mode */ mode = "wt"; if (*file == '>') { ++file; if (*file == '>') { mode = "at"; ++file; } if (file[0] == '&' && file[1] == '1') { stdlog = stdout; return; } if (file[0] == '&' && file[1] == '2') { stdlog = stderr; return; } } /* process the path */ for (*path = 0; *file != 0; ) { switch (*file) { case '%' : ++file; switch (*file) { case '%' : pathcatc(path, sizeof(path), '%'); break; case 'T' : pathcat(path, sizeof(path), text_T); break; case 'D' : pathcat(path, sizeof(path), text_D); break; default : /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid type specifier '%c' in the log file.\n", *file); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; default : pathcatc(path, sizeof(path), *file); break; } ++file; } stdlog = fopen(path, mode); if (!stdlog) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening the log file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } void log_close(const char* file) { if (stdlog != stdout && stdlog != stderr && stdlog != 0) { if (fclose(stdlog) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing the log file '%s'. %s.\n", file, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } stdlog = 0; } /****************************************************************************/ /* main */ /** * Only long options */ #define OPT_NO_WARNINGS 500 #define OPT_GUI 501 #define OPT_GUI_VERBOSE 502 #define OPT_GUI_RESCAN_AFTER 503 #define OPT_GUI_TOUCH_BEFORE 504 #define OPT_GUI_THRESHOLD_REMOVES 505 #define OPT_GUI_THRESHOLD_UPDATES 506 /** * Test options */ #define OPT_TEST_SKIP_SELF 256 #define OPT_TEST_KILL_AFTER_SYNC 257 #define OPT_TEST_EXPECT_UNRECOVERABLE 258 #define OPT_TEST_EXPECT_RECOVERABLE 259 #define OPT_TEST_SKIP_SIGN 260 #define OPT_TEST_SKIP_FALLOCATE 261 #define OPT_TEST_SKIP_DEVICE 262 #define OPT_TEST_FORCE_MURMUR3 264 #define OPT_TEST_FORCE_SPOOKY2 265 #define OPT_TEST_SKIP_LOCK 266 #define OPT_TEST_FORCE_ORDER_PHYSICAL 267 #define OPT_TEST_FORCE_ORDER_INODE 268 #define OPT_TEST_FORCE_ORDER_ALPHA 269 #define OPT_TEST_FORCE_ORDER_DIR 270 #define OPT_TEST_FORCE_SCRUB_AT 271 #define OPT_TEST_FORCE_SCRUB_EVEN 272 #define OPT_TEST_FORCE_CONTENT_WRITE 273 #define OPT_TEST_SKIP_CONTENT_CHECK 275 #define OPT_TEST_SKIP_PARITY_ACCESS 276 #define OPT_TEST_EXPECT_FAILURE 277 #define OPT_TEST_RUN 278 #define OPT_TEST_FORCE_SCAN_WINFIND 279 #define OPT_TEST_IMPORT_CONTENT 280 #define OPT_TEST_FORCE_PROGRESS 281 #define OPT_TEST_SKIP_DISK_ACCESS 282 #define OPT_TEST_FORCE_AUTOSAVE_AT 283 #define OPT_TEST_FAKE_DEVICE 284 #define OPT_TEST_EXPECT_NEED_SYNC 285 #define OPT_TEST_FAKE_UUID 287 #define OPT_TEST_MATCH_FIRST_UUID 288 #define OPT_TEST_FORCE_PARITY_UPDATE 289 #define OPT_TEST_IO_CACHE 290 #define OPT_TEST_IO_STATS 291 #define OPT_TEST_COND_SIGNAL_OUTSIDE 292 #define OPT_TEST_IO_ADVISE_NONE 293 #define OPT_TEST_IO_ADVISE_SEQUENTIAL 294 #define OPT_TEST_IO_ADVISE_FLUSH 295 #define OPT_TEST_IO_ADVISE_FLUSH_WINDOW 296 #define OPT_TEST_IO_ADVISE_DISCARD 297 #define OPT_TEST_IO_ADVISE_DISCARD_WINDOW 298 #define OPT_TEST_IO_ADVISE_DIRECT 299 #define OPT_TEST_PARITY_LIMIT 301 #define OPT_TEST_SKIP_CONTENT_WRITE 302 #define OPT_TEST_SKIP_SPACE_HOLDER 303 #define OPT_TEST_FORMAT 304 #define OPT_TEST_SKIP_MULTI_SCAN 305 #define OPT_TEST_SPEED_PERIOD 307 #define OPT_TEST_SPEED_DISKS_NUMBER 308 #define OPT_TEST_SPEED_BLOCKS_SIZE 309 #if HAVE_GETOPT_LONG static struct option long_options[] = { { "conf", 1, 0, 'c' }, { "filter", 1, 0, 'f' }, { "filter-disk", 1, 0, 'd' }, { "filter-missing", 0, 0, 'm' }, { "filter-error", 0, 0, 'e' }, { "filter-block-error", 0, 0, 'b' }, { "percentage", 1, 0, 'p' }, /* legacy name for --plan */ { "plan", 1, 0, 'p' }, { "older-than", 1, 0, 'o' }, { "start", 1, 0, 'S' }, { "count", 1, 0, 'B' }, { "error-limit", 1, 0, 'L' }, { "import", 1, 0, 'i' }, { "log", 1, 0, 'l' }, { "stats", 0, 0, 'A' }, { "force-zero", 0, 0, 'Z' }, { "force-empty", 0, 0, 'E' }, { "force-uuid", 0, 0, 'U' }, { "force-device", 0, 0, 'D' }, { "force-nocopy", 0, 0, 'N' }, { "force-full", 0, 0, 'F' }, { "force-realloc", 0, 0, 'R' }, { "force-realloc-tail", 1, 0, 'W' }, { "bw-limit", 1, 0, 'w' }, { "audit-only", 0, 0, 'a' }, { "pre-hash", 0, 0, 'h' }, { "tail", 1, 0, 't' }, { "speed-test", 0, 0, 'T' }, /* undocumented speed test command */ { "speed-test-period", 1, 0, OPT_TEST_SPEED_PERIOD }, /* for how many milliseconds test each feature. Default 1000. */ { "speed-test-disks-number", 1, 0, OPT_TEST_SPEED_DISKS_NUMBER }, /* how many disk number uses in the speed test. Default 8. */ { "speed-test-blocks-size", 1, 0, OPT_TEST_SPEED_BLOCKS_SIZE }, /* how big in kBytes should be the blocks in the speed test. Default 256. */ { "gen-conf", 1, 0, 'C' }, { "verbose", 0, 0, 'v' }, { "quiet", 0, 0, 'q' }, { "help", 0, 0, 'H' }, { "version", 0, 0, 'V' }, { "no-warnings", 0, 0, OPT_NO_WARNINGS }, /* disable annoying warnings */ { "gui", 0, 0, OPT_GUI }, /* undocumented GUI interface option (it was also 'G' in the past) */ { "gui-verbose", 0, 0, OPT_GUI_VERBOSE }, /* undocumented GUI interface option */ { "gui-rescan-after", 0, 0, OPT_GUI_RESCAN_AFTER }, /* undocumented GUI, force a rescan after the command to log differences */ { "gui-touch-before", 0, 0, OPT_GUI_TOUCH_BEFORE }, /* undocumented GUI, force a touch before the command */ { "gui-threshold-removes", 1, 0, OPT_GUI_THRESHOLD_REMOVES }, /* undocumented GUI, abort sync if too many removed files */ { "gui-threshold-updates", 1, 0, OPT_GUI_THRESHOLD_UPDATES }, /* undocumented GUI, abort sync if too many updated files */ /* The following are test specific options, DO NOT USE! */ /* After syncing, do not write the new content file */ { "test-kill-after-sync", 0, 0, OPT_TEST_KILL_AFTER_SYNC }, /* Exit with failure if after check/fix there ARE NOT unrecoverable errors. */ { "test-expect-unrecoverable", 0, 0, OPT_TEST_EXPECT_UNRECOVERABLE }, /* Exit with failure if after check/fix there ARE NOT recoverable errors. */ { "test-expect-recoverable", 0, 0, OPT_TEST_EXPECT_RECOVERABLE }, /* Skip the initial self test */ { "test-skip-self", 0, 0, OPT_TEST_SKIP_SELF }, /* Skip the initial sign check when reading the content file */ { "test-skip-sign", 0, 0, OPT_TEST_SKIP_SIGN }, /* Skip the fallocate() when growing the parity files */ { "test-skip-fallocate", 0, 0, OPT_TEST_SKIP_FALLOCATE }, /* Skip the device check */ { "test-skip-device", 0, 0, OPT_TEST_SKIP_DEVICE }, /* Force Murmur3 hash */ { "test-force-murmur3", 0, 0, OPT_TEST_FORCE_MURMUR3 }, /* Force Spooky2 hash */ { "test-force-spooky2", 0, 0, OPT_TEST_FORCE_SPOOKY2 }, /* Skip the use of lock file */ { "test-skip-lock", 0, 0, OPT_TEST_SKIP_LOCK }, /* Force a sort order for files */ { "test-force-order-physical", 0, 0, OPT_TEST_FORCE_ORDER_PHYSICAL }, { "test-force-order-inode", 0, 0, OPT_TEST_FORCE_ORDER_INODE }, { "test-force-order-alpha", 0, 0, OPT_TEST_FORCE_ORDER_ALPHA }, { "test-force-order-dir", 0, 0, OPT_TEST_FORCE_ORDER_DIR }, /* Force scrub of the specified number of blocks */ { "test-force-scrub-at", 1, 0, OPT_TEST_FORCE_SCRUB_AT }, /* Force scrub of all the even blocks. This is really for testing, don't try it */ { "test-force-scrub-even", 0, 0, OPT_TEST_FORCE_SCRUB_EVEN }, /* Force write of the content file even if no modification is done */ { "test-force-content-write", 0, 0, OPT_TEST_FORCE_CONTENT_WRITE }, /* Relax the checks done at the content file */ { "test-skip-content-check", 0, 0, OPT_TEST_SKIP_CONTENT_CHECK }, /* Skip the parity access */ { "test-skip-parity-access", 0, 0, OPT_TEST_SKIP_PARITY_ACCESS }, /* Exit generic failure */ { "test-expect-failure", 0, 0, OPT_TEST_EXPECT_FAILURE }, /* Exit generic need sync */ { "test-expect-need-sync", 0, 0, OPT_TEST_EXPECT_NEED_SYNC }, #if HAVE_CHECKER /* Run some command after loading the state and before the command */ { "test-run", 1, 0, OPT_TEST_RUN }, #endif /* Use the FindFirst/Next approach in Windows to list files */ { "test-force-scan-winfind", 0, 0, OPT_TEST_FORCE_SCAN_WINFIND }, /* Alternative import working by data */ { "test-import-content", 1, 0, OPT_TEST_IMPORT_CONTENT }, /* Force immediate progress state update */ { "test-force-progress", 0, 0, OPT_TEST_FORCE_PROGRESS }, /* Skip the disk access */ { "test-skip-disk-access", 0, 0, OPT_TEST_SKIP_DISK_ACCESS }, /* Force autosave at the specified block */ { "test-force-autosave-at", 1, 0, OPT_TEST_FORCE_AUTOSAVE_AT }, /* Fake device data */ { "test-fake-device", 0, 0, OPT_TEST_FAKE_DEVICE }, /* Fake UUID */ { "test-fake-uuid", 0, 0, OPT_TEST_FAKE_UUID }, /* Match first UUID */ { "test-match-first-uuid", 0, 0, OPT_TEST_MATCH_FIRST_UUID }, /* Force parity update even if all the data hash is already matching */ { "test-force-parity-update", 0, 0, OPT_TEST_FORCE_PARITY_UPDATE }, /* Number of IO buffers */ { "test-io-cache", 1, 0, OPT_TEST_IO_CACHE }, /* Print IO stats */ { "test-io-stats", 0, 0, OPT_TEST_IO_STATS }, /* now replaced by -A, --stats */ /* Signal condition variable outside the mutex */ { "test-cond-signal-outside", 0, 0, OPT_TEST_COND_SIGNAL_OUTSIDE }, /* Set the io advise to none */ { "test-io-advise-none", 0, 0, OPT_TEST_IO_ADVISE_NONE }, /* Set the io advise to sequential */ { "test-io-advise-sequential", 0, 0, OPT_TEST_IO_ADVISE_SEQUENTIAL }, /* Set the io advise to flush */ { "test-io-advise-flush", 0, 0, OPT_TEST_IO_ADVISE_FLUSH }, /* Set the io advise to flush window */ { "test-io-advise-flush-window", 0, 0, OPT_TEST_IO_ADVISE_FLUSH_WINDOW }, /* Set the io advise to discard */ { "test-io-advise-discard", 0, 0, OPT_TEST_IO_ADVISE_DISCARD }, /* Set the io advise to discard window */ { "test-io-advise-discard-window", 0, 0, OPT_TEST_IO_ADVISE_DISCARD_WINDOW }, /* Set the io advise to direct */ { "test-io-advise-direct", 0, 0, OPT_TEST_IO_ADVISE_DIRECT }, /* Set an artificial parity limit */ { "test-parity-limit", 1, 0, OPT_TEST_PARITY_LIMIT }, /* Skip content write */ { "test-skip-content-write", 0, 0, OPT_TEST_SKIP_CONTENT_WRITE }, /* Skip space holder file in parity disks */ { "test-skip-space-holder", 0, 0, OPT_TEST_SKIP_SPACE_HOLDER }, /* Set the output format */ { "test-fmt", 1, 0, OPT_TEST_FORMAT }, /* Skip thread in disk scan */ { "test-skip-multi-scan", 0, 0, OPT_TEST_SKIP_MULTI_SCAN }, { 0, 0, 0, 0 } }; #endif /* * Free letters: gIjJkKMnPQruxXz * * The 's' letter is used in main.c * The 'G' letter is free but only from 14.0 */ #define OPTIONS "t:c:f:d:mebp:o:S:B:L:i:l:AZEUDNFRW:ahTC:vqHVw:" int parse_option_size(const char* arg, uint64_t* out_size) { char* e; /* parse the number part */ uint64_t size = strtoull(arg, &e, 10); if (e == arg) return -1; /* Handle suffixes */ if ((e[0] == 'k' || e[0] == 'K') && e[1] == 0) { size *= KILO; } else if ((e[0] == 'm' || e[0] == 'M') && e[1] == 0) { size *= MEGA; } else if ((e[0] == 'g' || e[0] == 'G') && e[1] == 0) { size *= GIGA; } else if ((e[0] == 't' || e[0] == 'T') && e[1] == 0) { size *= TERA; } else if (e[0] != 0) { return -1; } *out_size = size; return 0; } volatile int global_interrupt = 0; /* LCOV_EXCL_START */ void signal_handler(int signum) { /* report the request of interruption with the signal received */ global_interrupt = signum; } /* LCOV_EXCL_STOP */ void signal_init(void) { #if HAVE_SIGACTION struct sigaction sa; sa.sa_handler = signal_handler; sigemptyset(&sa.sa_mask); /* use the SA_RESTART to automatically restart interrupted system calls */ sa.sa_flags = SA_RESTART; sigaction(SIGHUP, &sa, 0); sigaction(SIGTERM, &sa, 0); sigaction(SIGINT, &sa, 0); #else signal(SIGINT, signal_handler); #endif } #define OPERATION_DIFF 0 #define OPERATION_SYNC 1 #define OPERATION_CHECK 2 #define OPERATION_FIX 3 #define OPERATION_DRY 4 #define OPERATION_DUP 5 #define OPERATION_LIST 6 #define OPERATION_POOL 7 #define OPERATION_REHASH 8 #define OPERATION_SCRUB 9 #define OPERATION_STATUS 10 #define OPERATION_REWRITE 11 #define OPERATION_READ 12 #define OPERATION_TOUCH 13 #define OPERATION_SPINUP 14 #define OPERATION_SPINDOWN 15 #define OPERATION_DEVICES 16 #define OPERATION_SMART 17 #define OPERATION_PROBE 18 #define OPERATION_LOCATE 19 int snapraid_main(int argc, char* argv[]) { int c; struct snapraid_option opt; char conf[PATH_MAX]; struct snapraid_state state; int operation; block_off_t blockstart; block_off_t blockcount; int ret; tommy_list filterlist_file; tommy_list filterlist_disk; int filter_missing; int filter_error; int plan100; int olderthan; char* e; const char* command; const char* import_timestamp; const char* import_content; const char* log_file; int lock; const char* gen_conf; #if HAVE_CHECKER const char* run; #endif int speedtest; int speed_test_period; int speed_test_disks_number; int speed_test_blocks_size; time_t t; struct tm* tm; #if HAVE_LOCALTIME_R struct tm tm_res; #endif int i; test(argc, argv); lock_init(); /* defaults */ os_default_conf(conf, sizeof(conf), argv[0]); memset(&opt, 0, sizeof(opt)); opt.io_error_limit = 100; blockstart = 0; blockcount = 0; tommy_list_init(&filterlist_file); tommy_list_init(&filterlist_disk); speed_test_period = -1; speed_test_blocks_size = -1; speed_test_disks_number = -1; filter_missing = 0; filter_error = 0; plan100 = SCRUB_AUTO; olderthan = SCRUB_AUTO; import_timestamp = 0; import_content = 0; log_file = 0; lock = 0; gen_conf = 0; speedtest = 0; #if HAVE_CHECKER run = 0; #endif opterr = 0; while ((c = #if HAVE_GETOPT_LONG getopt_long(argc, argv, OPTIONS, long_options, 0)) #else getopt(argc, argv, OPTIONS)) #endif != EOF) { switch (c) { case 'c' : pathimport(conf, sizeof(conf), optarg); break; case 'f' : { struct snapraid_filter* filter = filter_alloc_file(1, "", optarg); if (!filter) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid filter specification '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } tommy_list_insert_tail(&filterlist_file, &filter->node, filter); } break; case 'd' : { struct snapraid_filter* filter = filter_alloc_disk(1, optarg); if (!filter) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid filter specification '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } tommy_list_insert_tail(&filterlist_disk, &filter->node, filter); } break; case 'm' : filter_missing = 1; opt.expected_missing = 1; break; case 'e' : /* when processing only error, we filter files */ /* and we apply fixes only to synced ones */ filter_error = 1; opt.badfileonly = 1; opt.syncedonly = 1; break; case 'b' : /* when processing only block with error, we filter both files and blocks */ /* and we apply fixes only to synced ones */ filter_error = 1; opt.badfileonly = 1; opt.badblockonly = 1; opt.syncedonly = 1; break; case 'p' : if (strcmp(optarg, "bad") == 0) { plan100 = SCRUB_BAD; } else if (strcmp(optarg, "new") == 0) { plan100 = SCRUB_NEW; } else if (strcmp(optarg, "full") == 0) { plan100 = SCRUB_FULL; } else { double plan_double = strtod(optarg, &e); if (e == optarg || *e != 0 || !isfinite(plan_double) || plan_double < 0 || plan_double > 100 ) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid plan/percentage '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* +0.5 avoids floating point precision error of strtod, like "0.7" -> 0.6999... -> 0.6 */ plan100 = plan_double * 100 + 0.5; } break; case 'o' : olderthan = strtoul(optarg, &e, 10); if (e == optarg || *e || olderthan > 1000) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid number of days '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case 'w' : /* --bw-limit */ if (optarg == 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Missing bandwidth limit\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (parse_option_size(optarg, &opt.bwlimit) != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid bandwidth limit '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case 'S' : blockstart = strtoul(optarg, &e, 0); if (e == optarg || *e) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid start position '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case 'B' : blockcount = strtoul(optarg, &e, 0); if (e == optarg || *e) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid count number '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case 'L' : opt.io_error_limit = strtoul(optarg, &e, 0); if (e == optarg || *e) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid error limit number '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case 'i' : if (import_timestamp) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Import directory '%s' already specified as '%s'\n", optarg, import_timestamp); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } import_timestamp = optarg; break; case 't' : if (parse_option_size(optarg, &opt.parity_tail) != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid tail size '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case OPT_TEST_IMPORT_CONTENT : if (import_content) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Import directory '%s' already specified as '%s'\n", optarg, import_content); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } import_content = optarg; break; case 'l' : if (log_file) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Log file '%s' already specified as '%s'\n", optarg, log_file); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } log_file = optarg; break; case 'A' : opt.force_stats = 1; break; case 'Z' : opt.force_zero = 1; break; case 'E' : opt.force_empty = 1; break; case 'U' : opt.force_uuid = 1; break; case 'D' : opt.force_device = 1; break; case 'N' : opt.force_nocopy = 1; break; case 'F' : opt.force_full = 1; break; case 'R' : opt.force_realloc = 1; break; case 'W' : opt.force_realloc = 1; if (parse_option_size(optarg, &opt.parity_tail) != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid tail size '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case 'a' : opt.auditonly = 1; break; case 'h' : opt.prehash = 1; break; case 'v' : ++msg_level; break; case 'q' : --msg_level; break; case OPT_NO_WARNINGS : opt.no_warnings = 1; break; case OPT_GUI : opt.gui = 1; break; case OPT_GUI_VERBOSE : opt.gui = 1; opt.gui_verbose = 1; break; case OPT_GUI_RESCAN_AFTER : opt.gui_rescan_after = 1; break; case OPT_GUI_TOUCH_BEFORE : opt.gui_touch_before = 1; break; case OPT_GUI_THRESHOLD_REMOVES : opt.gui_threshold_removes = strtoul(optarg, &e, 0); if (e == optarg || *e) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid threshold '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case OPT_GUI_THRESHOLD_UPDATES : opt.gui_threshold_updates = strtoul(optarg, &e, 0); if (e == optarg || *e) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid threshold '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case 'H' : usage(conf); exit(EXIT_SUCCESS); case 'V' : version(); exit(EXIT_SUCCESS); case 'T' : speedtest = 1; break; case OPT_TEST_SPEED_PERIOD : speed_test_period = atoi(optarg); break; case OPT_TEST_SPEED_DISKS_NUMBER : speed_test_disks_number = atoi(optarg); break; case OPT_TEST_SPEED_BLOCKS_SIZE : speed_test_blocks_size = atoi(optarg); break; case 'C' : gen_conf = optarg; break; case OPT_TEST_KILL_AFTER_SYNC : opt.kill_after_sync = 1; break; case OPT_TEST_EXPECT_UNRECOVERABLE : opt.expect_unrecoverable = 1; break; case OPT_TEST_EXPECT_RECOVERABLE : opt.expect_recoverable = 1; break; case OPT_TEST_SKIP_SELF : opt.skip_self = 1; break; case OPT_TEST_SKIP_SIGN : opt.skip_sign = 1; break; case OPT_TEST_SKIP_FALLOCATE : opt.skip_fallocate = 1; break; case OPT_TEST_SKIP_DEVICE : opt.skip_device = 1; speed_test_period = 50; /* reduce period of the speed test for running the make check */ break; case OPT_TEST_SKIP_CONTENT_CHECK : opt.skip_content_check = 1; break; case OPT_TEST_SKIP_PARITY_ACCESS : opt.skip_parity_access = 1; break; case OPT_TEST_SKIP_DISK_ACCESS : opt.skip_disk_access = 1; break; case OPT_TEST_FORCE_MURMUR3 : opt.force_murmur3 = 1; break; case OPT_TEST_FORCE_SPOOKY2 : opt.force_spooky2 = 1; break; case OPT_TEST_SKIP_LOCK : opt.skip_lock = 1; break; case OPT_TEST_FORCE_ORDER_PHYSICAL : opt.force_order = SORT_PHYSICAL; break; case OPT_TEST_FORCE_ORDER_INODE : opt.force_order = SORT_INODE; break; case OPT_TEST_FORCE_ORDER_ALPHA : opt.force_order = SORT_ALPHA; break; case OPT_TEST_FORCE_ORDER_DIR : opt.force_order = SORT_DIR; break; case OPT_TEST_FORCE_SCRUB_AT : opt.force_scrub_at = atoi(optarg); break; case OPT_TEST_FORCE_SCRUB_EVEN : opt.force_scrub_even = 1; break; case OPT_TEST_FORCE_CONTENT_WRITE : opt.force_content_write = 1; break; case OPT_TEST_EXPECT_FAILURE : /* invert the exit codes */ exit_success = 1; exit_failure = 0; break; case OPT_TEST_EXPECT_NEED_SYNC : /* invert the exit codes */ exit_success = 1; exit_sync_needed = 0; break; #if HAVE_CHECKER case OPT_TEST_RUN : run = optarg; break; #endif case OPT_TEST_FORCE_SCAN_WINFIND : opt.force_scan_winfind = 1; break; case OPT_TEST_FORCE_PROGRESS : opt.force_progress = 1; break; case OPT_TEST_FORCE_AUTOSAVE_AT : opt.force_autosave_at = atoi(optarg); break; case OPT_TEST_FAKE_DEVICE : opt.fake_device = 1; break; case OPT_TEST_FAKE_UUID : opt.fake_uuid = 2; break; case OPT_TEST_MATCH_FIRST_UUID : opt.match_first_uuid = 1; break; case OPT_TEST_FORCE_PARITY_UPDATE : opt.force_parity_update = 1; break; case OPT_TEST_IO_CACHE : opt.io_cache = atoi(optarg); if (opt.io_cache != 1 && (opt.io_cache < IO_MIN || opt.io_cache > IO_MAX)) { /* LCOV_EXCL_START */ log_fatal(EUSER, "The IO cache should be between %u and %u.\n", IO_MIN, IO_MAX); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case OPT_TEST_IO_STATS : opt.force_stats = 1; break; case OPT_TEST_COND_SIGNAL_OUTSIDE : #if HAVE_THREAD thread_cond_signal_outside = 1; #endif break; case OPT_TEST_IO_ADVISE_NONE : opt.file_mode = ADVISE_NONE; break; case OPT_TEST_IO_ADVISE_SEQUENTIAL : opt.file_mode = ADVISE_SEQUENTIAL; break; case OPT_TEST_IO_ADVISE_FLUSH : opt.file_mode = ADVISE_FLUSH; break; case OPT_TEST_IO_ADVISE_FLUSH_WINDOW : opt.file_mode = ADVISE_FLUSH_WINDOW; break; case OPT_TEST_IO_ADVISE_DISCARD : opt.file_mode = ADVISE_DISCARD; break; case OPT_TEST_IO_ADVISE_DISCARD_WINDOW : opt.file_mode = ADVISE_DISCARD_WINDOW; break; case OPT_TEST_IO_ADVISE_DIRECT : opt.file_mode = ADVISE_DIRECT; break; case OPT_TEST_PARITY_LIMIT : opt.parity_limit_size = atoll(optarg); break; case OPT_TEST_SKIP_CONTENT_WRITE : opt.skip_content_write = 1; break; case OPT_TEST_SKIP_SPACE_HOLDER : opt.skip_space_holder = 1; break; case OPT_TEST_FORMAT : if (strcmp(optarg, "file") == 0) FMT_MODE = FMT_FILE; else if (strcmp(optarg, "disk") == 0) FMT_MODE = FMT_DISK; else if (strcmp(optarg, "path") == 0) FMT_MODE = FMT_PATH; else { /* LCOV_EXCL_START */ log_fatal(EUSER, "Unknown format '%s'\n", optarg); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } break; case OPT_TEST_SKIP_MULTI_SCAN : opt.skip_multi_scan = 1; break; default : /* LCOV_EXCL_START */ log_fatal(EUSER, "Unknown option '%c'\n", (char)c); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } os_init(opt.force_scan_winfind); raid_init(); crc32c_init(); random_reseed(); if (speedtest != 0) { speed(speed_test_period, speed_test_disks_number, speed_test_blocks_size); os_done(); exit(EXIT_SUCCESS); } if (gen_conf != 0) { generate_configuration(gen_conf); os_done(); exit(EXIT_SUCCESS); } if (optind + 1 != argc) { /* LCOV_EXCL_START */ usage(conf); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } command = argv[optind]; if (strcmp(command, "diff") == 0) { operation = OPERATION_DIFF; } else if (strcmp(argv[optind], "sync") == 0) { operation = OPERATION_SYNC; } else if (strcmp(argv[optind], "check") == 0) { operation = OPERATION_CHECK; } else if (strcmp(argv[optind], "fix") == 0) { operation = OPERATION_FIX; } else if (strcmp(argv[optind], "test-dry") == 0) { operation = OPERATION_DRY; } else if (strcmp(argv[optind], "dup") == 0) { operation = OPERATION_DUP; } else if (strcmp(argv[optind], "list") == 0) { operation = OPERATION_LIST; } else if (strcmp(argv[optind], "pool") == 0) { operation = OPERATION_POOL; } else if (strcmp(argv[optind], "rehash") == 0) { operation = OPERATION_REHASH; } else if (strcmp(argv[optind], "scrub") == 0) { operation = OPERATION_SCRUB; } else if (strcmp(argv[optind], "status") == 0) { operation = OPERATION_STATUS; } else if (strcmp(argv[optind], "test-rewrite") == 0) { operation = OPERATION_REWRITE; } else if (strcmp(argv[optind], "read") == 0) { operation = OPERATION_READ; } else if (strcmp(argv[optind], "touch") == 0) { operation = OPERATION_TOUCH; } else if (strcmp(argv[optind], "up") == 0) { operation = OPERATION_SPINUP; } else if (strcmp(argv[optind], "down") == 0) { operation = OPERATION_SPINDOWN; } else if (strcmp(argv[optind], "devices") == 0) { operation = OPERATION_DEVICES; } else if (strcmp(argv[optind], "smart") == 0) { operation = OPERATION_SMART; } else if (strcmp(argv[optind], "probe") == 0) { operation = OPERATION_PROBE; } else if (strcmp(argv[optind], "locate") == 0) { operation = OPERATION_LOCATE; } else { /* LCOV_EXCL_START */ log_fatal(EUSER, "Unknown command '%s'\n", argv[optind]); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* check options compatibility */ switch (operation) { case OPERATION_CHECK : break; default : if (opt.auditonly) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -a, --audit-only with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } switch (operation) { case OPERATION_FIX : case OPERATION_CHECK : case OPERATION_SMART : case OPERATION_PROBE : case OPERATION_DEVICES : case OPERATION_SPINUP : case OPERATION_SPINDOWN : break; default : if (opt.force_device) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -D, --force-device with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } switch (operation) { case OPERATION_SYNC : case OPERATION_CHECK : case OPERATION_FIX : break; default : if (opt.force_nocopy) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -N, --force-nocopy with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } switch (operation) { case OPERATION_SYNC : break; default : if (opt.prehash) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -h, --pre-hash with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (opt.force_full) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -F, --force-full with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (opt.force_realloc) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -R, --force-realloc with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } if (opt.force_full && opt.force_nocopy) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use the -F, --force-full and -N, --force-nocopy options simultaneously\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (opt.force_realloc && opt.force_nocopy) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use the -R, --force-realloc and -N, --force-nocopy options simultaneously\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (opt.force_realloc && opt.force_full) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use the -R, --force-realloc and -F, --force-full options simultaneously\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (opt.prehash && opt.force_nocopy) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use the -h, --pre-hash and -N, --force-nocopy options simultaneously\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } switch (operation) { case OPERATION_CHECK : case OPERATION_FIX : case OPERATION_DRY : break; default : if (!tommy_list_empty(&filterlist_disk)) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -d, --filter-disk with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* fallthrough */ case OPERATION_SPINUP : case OPERATION_SPINDOWN : if (!tommy_list_empty(&filterlist_file)) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -f, --filter with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (filter_missing != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -m, --filter-missing with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (filter_error != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -e, --filter-error with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /* errors must be always fixed on all disks */ /* because we don't keep the information on what disk is the error */ if (filter_error != 0 && !tommy_list_empty(&filterlist_disk)) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use -e, --filter-error and -d, --filter-disk simultaneously\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } switch (operation) { case OPERATION_CHECK : case OPERATION_FIX : break; default : if (import_timestamp != 0 || import_content != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Import not allowed with the '%s' command\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } switch (operation) { case OPERATION_LIST : case OPERATION_DUP : case OPERATION_STATUS : case OPERATION_REWRITE : case OPERATION_READ : case OPERATION_REHASH : /* avoid to check and access data disks if not needed */ opt.skip_disk_access = 1; break; } switch (operation) { case OPERATION_DIFF : case OPERATION_LIST : case OPERATION_DUP : case OPERATION_POOL : case OPERATION_STATUS : case OPERATION_REWRITE : case OPERATION_READ : case OPERATION_REHASH : case OPERATION_TOUCH : /* avoid to check and access parity disks if not needed */ opt.skip_parity_access = 1; break; } switch (operation) { case OPERATION_FIX : case OPERATION_CHECK : /* avoid to stop processing if a content file is not accessible */ opt.skip_content_access = 1; break; } switch (operation) { case OPERATION_DIFF : case OPERATION_LIST : case OPERATION_DUP : case OPERATION_POOL : case OPERATION_TOUCH : case OPERATION_SPINUP : case OPERATION_SPINDOWN : case OPERATION_DEVICES : case OPERATION_SMART : case OPERATION_PROBE : opt.skip_self = 1; break; } switch (operation) { #if HAVE_DIRECT_IO case OPERATION_SYNC : case OPERATION_SCRUB : case OPERATION_DRY : break; #endif default : /* we allow direct IO only on some commands */ if (opt.file_mode == ADVISE_DIRECT) opt.file_mode = ADVISE_SEQUENTIAL; break; } switch (operation) { case OPERATION_DEVICES : case OPERATION_SMART : case OPERATION_PROBE : /* we may need to use these commands during operations */ opt.skip_lock = 1; break; } /* open the log file */ log_open(log_file); /* print generic info into the log */ t = time(0); #if HAVE_LOCALTIME_R tm = localtime_r(&t, &tm_res); #else tm = localtime(&t); #endif log_tag("version:%s\n", PACKAGE_VERSION); log_tag("unixtime:%" PRIi64 "\n", (int64_t)t); if (tm) { char datetime[64]; strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", tm); log_tag("time:%s\n", datetime); } log_tag("command:%s\n", command); for (i = 0; i < argc; ++i) log_tag("argv:%u:%s\n", i, esc_tag(argv[i])); log_flush(); if (!opt.skip_self) selftest(); state_init(&state); /* read the configuration file */ state_config(&state, conf, command, &opt, &filterlist_disk); /* set the raid mode */ raid_mode(state.raid_mode); #if HAVE_LOCKFILE /* create the lock file */ if (!opt.skip_lock && state.lockfile[0]) { lock = lock_lock(state.lockfile); if (lock == -1) { /* LCOV_EXCL_START */ if (errno != EWOULDBLOCK) { log_fatal(errno, "Failed to create the lock file '%s'. %s.\n", state.lockfile, strerror(errno)); } else { log_fatal(errno, "The lock file '%s' is already in use!\n", state.lockfile); log_fatal(errno, "SnapRAID is already in use!\n"); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #else (void)lock; #endif ret = 0; if (operation == OPERATION_DIFF) { state_read(&state); /* refresh the size info to log correct info */ state_refresh(&state); ret = state_diff(&state); /* abort if sync needed */ if (ret > 0) exit(EXIT_SYNC_NEEDED); } else if (operation == OPERATION_SYNC) { /* in the next state read ensures to clear all the past hashes in case */ /* we are reading from an incomplete sync */ /* The indeterminate hash are only for CHG/DELETED blocks for which we don't */ /* know if the previous interrupted sync was able to update or not the parity. */ /* The sync process instead needs to trust this information because it's used */ /* to avoid to recompute the parity if all the input are equals as before. */ /* In these cases we don't know if the old state is still the one */ /* stored inside the parity, because after an aborted sync, the parity */ /* may be or may be not have been updated with the data that may be now */ /* deleted. Then we reset the hash to a bogus value. */ /* An example for CHG blocks is: */ /* - One file is added creating a CHG block with ZERO state */ /* - Sync aborted after updating the parity to the new state, */ /* but without saving the content file representing this new BLK state. */ /* - File is now deleted after the aborted sync */ /* - Sync again, deleting the blocks over the CHG ones */ /* with the hash of CHG blocks not representing the real parity state */ /* An example for DELETED blocks is: */ /* - One file is deleted creating DELETED blocks */ /* - Sync aborted after, updating the parity to the new state, */ /* but without saving the content file representing this new EMPTY state. */ /* - Another file is added again over the DELETE ones */ /* with the hash of DELETED blocks not representing the real parity state */ state.clear_past_hash = 1; state_read(&state); /* mark the files that have to be reallocated */ /* it will happen in inside scan_file_keep() called in state_scan() */ if (state.opt.force_realloc) state_locate_mark_tail_blocks_for_resync(&state, opt.parity_tail); if (opt.gui_touch_before) { state_touch(&state); /* save the new state if required */ if (state.need_write) state_write(&state); } state_scan(&state); if (opt.gui_threshold_removes != 0 && state.removed_files >= opt.gui_threshold_removes) { log_fatal(EUSER, "Too many files were removed (%u, limit is %u). Sync aborted.\n", state.removed_files, opt.gui_threshold_removes); exit(EXIT_SYNC_NEEDED); } if (opt.gui_threshold_updates != 0 && state.updated_files >= opt.gui_threshold_updates) { log_fatal(EUSER, "Too many files were updated (%u, limit is %u). Sync aborted.\n", state.updated_files, opt.gui_threshold_updates); exit(EXIT_SYNC_NEEDED); } /* refresh the size info before the content write */ state_refresh(&state); memory(); /* intercept signals while operating */ signal_init(); #if HAVE_CHECKER /* run a test command if required */ if (run != 0) { ret = system(run); if (ret == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to run '%s'.\n", run); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to run '%s' with return code %xh.\n", run, ret); return -1; /* LCOV_EXCL_STOP */ } } #endif /* waits some time to ensure that any concurrent modification done at the files, */ /* using the same mtime read by the scan process, will be read by sync. */ /* Note that any later modification done, potentially not read by sync, will have */ /* a different mtime, and it will be synchronized at the next sync. */ /* The worst case is the FAT file-system with a two seconds resolution for mtime. */ /* If you don't use FAT, the wait is not needed, because most file-systems have now */ /* at least microseconds resolution, but better to be safe. */ if (!opt.skip_self) sleep(2); ret = state_sync(&state, blockstart, blockcount); } else if (operation == OPERATION_DRY) { state_read(&state); /* refresh the size info to log correct info */ state_refresh(&state); /* filter */ state_skip(&state); state_filter(&state, &filterlist_file, &filterlist_disk, filter_missing, filter_error); memory(); /* intercept signals while operating */ signal_init(); ret = state_dry(&state, blockstart, blockcount); } else if (operation == OPERATION_REHASH) { state_read(&state); state_rehash(&state); /* * Intercept signals while operating * * Intentionally do this after the touch operation. * * The signal protection is meant only for saving the content file, * or an early stop of long operations. */ signal_init(); /* save the new state if required */ if (state.need_write) state_write(&state); } else if (operation == OPERATION_SCRUB) { state_read(&state); /* refresh the size info before the content write */ state_refresh(&state); memory(); /* intercept signals while operating */ signal_init(); ret = state_scrub(&state, plan100, olderthan); } else if (operation == OPERATION_REWRITE) { state_read(&state); /* intercept signals while operating */ signal_init(); state_write(&state); memory(); } else if (operation == OPERATION_READ) { state_read(&state); /* intentionally DO NOT CALL state_refresh() because it spins up disks */ memory(); } else if (operation == OPERATION_TOUCH) { state_read(&state); memory(); state_touch(&state); /* * Intercept signals while operating * * Intentionally do this after the touch operation. * * The signal protection is meant only for saving the content file, * or an early stop of long operations. */ signal_init(); if (state.need_write) state_write(&state); } else if (operation == OPERATION_SPINUP) { ret = state_device(&state, DEVICE_UP, &filterlist_disk); #if HAVE_CHECKER if (ret < 0) ret = 0; /* ignore errors in test environment */ #endif } else if (operation == OPERATION_SPINDOWN) { ret = state_device(&state, DEVICE_DOWN, &filterlist_disk); #if HAVE_CHECKER if (ret < 0) ret = 0; /* ignore errors in test environment */ #endif } else if (operation == OPERATION_DEVICES) { ret = state_device(&state, DEVICE_LIST, 0); #if HAVE_CHECKER if (ret < 0) ret = 0; /* ignore errors in test environment */ #endif } else if (operation == OPERATION_SMART) { ret = state_device(&state, DEVICE_SMART, 0); #if HAVE_CHECKER if (ret < 0) ret = 0; /* ignore errors in test environment */ #endif } else if (operation == OPERATION_PROBE) { /* probe also the content file */ state_probe(&state); ret = state_device(&state, DEVICE_PROBE, 0); #if HAVE_CHECKER if (ret < 0) ret = 0; /* ignore errors in test environment */ #endif } else if (operation == OPERATION_STATUS) { state_read(&state); memory(); state_status(&state); } else if (operation == OPERATION_LOCATE) { state_read(&state); state_locate(&state, opt.parity_tail); } else if (operation == OPERATION_DUP) { state_read(&state); state_dup(&state); } else if (operation == OPERATION_LIST) { state_read(&state); state_list(&state); } else if (operation == OPERATION_POOL) { state_read(&state); state_pool(&state); } else if (operation == OPERATION_CHECK || operation == OPERATION_FIX) { state_read(&state); /* if we are also trying to recover */ if (!state.opt.auditonly) { /* import the user specified dirs */ if (import_timestamp != 0) state_search(&state, import_timestamp); if (import_content != 0) state_import(&state, import_content); /* import from all the array */ if (!state.opt.force_nocopy) state_search_array(&state); } /* filter */ state_skip(&state); state_filter(&state, &filterlist_file, &filterlist_disk, filter_missing, filter_error); memory(); /* intercept signals while operating */ signal_init(); if (operation == OPERATION_CHECK) { ret = state_check(&state, 0, blockstart, blockcount); } else { /* it's fix */ ret = state_check(&state, 1, blockstart, blockcount); /* rescan if requested by the GUI */ if (opt.gui_rescan_after) state_scan(&state); } } else { /* LCOV_EXCL_START */ log_fatal(errno, "Unexpected command '%s'\n", command); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* close log file */ log_close(log_file); #if HAVE_LOCKFILE if (!opt.skip_lock && state.lockfile[0]) { if (lock_unlock(lock) == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to close the lock file '%s'. %s.\n", state.lockfile, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #endif state_done(&state); tommy_list_foreach(&filterlist_file, (tommy_foreach_func*)filter_free); tommy_list_foreach(&filterlist_disk, (tommy_foreach_func*)filter_free); os_done(); lock_done(); /* abort if required */ if (ret != 0) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (global_interrupt) { /* LCOV_EXCL_START */ #ifdef _WIN32 exit(STATUS_CONTROL_C_EXIT); #else /* restore default handler */ signal(global_interrupt, SIG_DFL); /* raise the signal again*/ raise(global_interrupt); /* if raise() didn't terminate */ _exit(128 + global_interrupt); #endif /* LCOV_EXCL_STOP */ } return EXIT_SUCCESS; } snapraid-14.9/cmdline/snapraid.h000066400000000000000000000005431522717156100166460ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __SNAPRAID_H #define __SNAPRAID_H /****************************************************************************/ /* snapraid */ void speed(int period, int disks_number, int blocks_size); void selftest(void); int snapraid_main(int argc, char* argv[]); #endif snapraid-14.9/cmdline/speed.c000066400000000000000000000465161522717156100161520ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "snapraid.h" #include "util.h" #include "raid/raid.h" #include "raid/cpu.h" #include "raid/internal.h" #include "raid/memory.h" #include "state.h" /** * Differential us of two timeval. */ static int64_t diffgettimeofday(struct timeval* start, struct timeval* stop) { int64_t d; d = 1000000LL * (stop->tv_sec - start->tv_sec); d += stop->tv_usec - start->tv_usec; return d; } /** * Start time measurement. */ #define SPEED_START \ count = 0; \ gettimeofday(&start, 0); \ do { \ for (i = 0; i < delta; ++i) /** * Stop time measurement. */ /* INDENT-OFF */ #define SPEED_STOP \ count += delta; \ gettimeofday(&stop, 0); \ } while (diffgettimeofday(&start, &stop) < period * 1000LL); \ ds = size * (int64_t)count * nd; \ dt = diffgettimeofday(&start, &stop); /* INDENT-ON */ /** * Global variable used to propagate side effects. * * This is required to avoid optimizing compilers * to remove code without side effects. */ static unsigned side_effect; void speed(int period, int nd, int size) { struct timeval start; struct timeval stop; int64_t ds; int64_t dt; int i, j; unsigned char digest[HASH_MAX]; unsigned char seed[HASH_MAX]; int id[RAID_PARITY_MAX]; int ip[RAID_PARITY_MAX]; int count; int delta; int nv; void* v_alloc; void** v; if (nd < 0) nd = 8; /* default */ if (nd < 6) nd = 6; /* minimum */ if (size < 0) size = 256 * KIBI; else size *= KIBI; if (period < 1) period = 1000; delta = period >= 1000 ? 10 : 1; nv = nd + RAID_PARITY_MAX + 1; v = malloc_nofail_vector_align(nd, nv, size, &v_alloc); /* initialize disks with fixed data */ for (i = 0; i < nd; ++i) memset(v[i], i, size); /* zero buffer */ memset(v[nd + RAID_PARITY_MAX], 0, size); raid_zero(v[nd + RAID_PARITY_MAX]); /* hash seed */ for (i = 0; i < HASH_MAX; ++i) seed[i] = i; /* basic disks and parity mapping */ for (i = 0; i < RAID_PARITY_MAX; ++i) { id[i] = i; ip[i] = i; } printf(PACKAGE " v" VERSION " by Andrea Mazzoleni, " PACKAGE_URL "\n"); #ifdef __GNUC__ printf("Compiler gcc " __VERSION__ "\n"); #endif #ifdef CONFIG_X86 { char vendor[CPU_VENDOR_MAX]; unsigned family; unsigned model; raid_cpu_info(vendor, &family, &model); printf("CPU %s, family %u, model %u, flags%s%s%s%s%s%s%s%s\n", vendor, family, model, raid_cpu_has_sse2() ? " sse2" : "", raid_cpu_has_ssse3() ? " ssse3" : "", raid_cpu_has_crc32() ? " crc32" : "", raid_cpu_has_avx2() ? " avx2" : "", raid_cpu_has_avx512bw() ? " avx512bw" : "", raid_cpu_has_avx512gfni() ? " avx512gfni" : "", raid_cpu_has_slowmult() ? " slowmult" : "", raid_cpu_has_slowextendedreg() ? " slowext" : "" ); } #elif defined(__aarch64__) || defined(_M_ARM64) printf("CPU 64-bit ARM (AArch64)\n"); #elif defined(__arm__) || defined(_M_ARM) printf("CPU 32-bit ARM\n"); #elif defined(__powerpc64__) printf("CPU 64-bit PowerPC\n"); #elif defined(__powerpc__) printf("CPU 32-bit PowerPC\n"); #elif defined(__riscv) printf("CPU RISC-V\n"); #elif defined(__s390x__) printf("CPU 64-bit IBM Z / s390x\n"); #else printf("CPU of unknown architecture\n"); #endif #if WORDS_BIGENDIAN printf("Memory is big-endian %d-bit\n", (int)sizeof(void*) * 8); #else printf("Memory is little-endian %d-bit\n", (int)sizeof(void*) * 8); #endif #if defined(__SIZEOF_INT128__) printf("128-bit integers are supported\n"); #else printf("128-bit integers are not supported\n"); #endif #if HAVE_FUTIMENS printf("Support nanosecond timestamps with futimens()\n"); #elif HAVE_FUTIMES printf("Support nanosecond timestamps with futimes()\n"); #elif HAVE_FUTIMESAT printf("Support nanosecond timestamps with futimesat()\n"); #else printf("Does not support nanosecond timestamps\n"); #endif printf("\n"); printf("Speed test using %u data buffers of %u bytes, for a total of %u KiB.\n", nd, size, nd * size / KIBI); printf("Memory blocks have a displacement of %u bytes to improve cache performance.\n", RAID_MALLOC_DISPLACEMENT); printf("The reported values are the aggregate bandwidth of all data blocks in MB/s,\n"); printf("not counting parity blocks.\n"); printf("\n"); printf("Memory write speed using the C memset() function:\n"); printf("%8s", "memset"); fflush(stdout); SPEED_START { for (j = 0; j < nd; ++j) memset(v[j], j, size); } SPEED_STOP printf("%8" PRIu64, ds / dt); printf("\n"); printf("\n"); /* crc table */ printf("CRC used to check the content file integrity:\n"); printf("%8s", "table"); fflush(stdout); SPEED_START { for (j = 0; j < nd; ++j) side_effect += crc32c_gen(0, v[j], size); } SPEED_STOP printf("%8" PRIu64, ds / dt); printf("\n"); printf("%8s", "intel"); fflush(stdout); #if HAVE_SSE42 if (raid_cpu_has_crc32()) { SPEED_START { for (j = 0; j < nd; ++j) side_effect += crc32c_x86(0, v[j], size); } SPEED_STOP printf("%8" PRIu64, ds / dt); } #endif printf("\n"); printf("\n"); /* hash table */ printf("Hash used to check the data blocks integrity:\n"); printf("%8s", ""); printf("%8s", "best"); printf("%8s", "murmur3"); printf("%8s", "spooky2"); printf("%8s", "metro"); printf("%8s", "museair"); printf("\n"); printf("%8s", "hash"); printf("%8s", memhashname(membesthash())); fflush(stdout); SPEED_START { for (j = 0; j < nd; ++j) memhash(HASH_MURMUR3, seed, digest, v[j], size); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); SPEED_START { for (j = 0; j < nd; ++j) memhash(HASH_SPOOKY2, seed, digest, v[j], size); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); SPEED_START { for (j = 0; j < nd; ++j) memhash(HASH_METRO, seed, digest, v[j], size); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); SPEED_START { for (j = 0; j < nd; ++j) memhash(HASH_MUSEAIR, seed, digest, v[j], size); } SPEED_STOP printf("%8" PRIu64, ds / dt); printf("\n"); printf("\n"); /* RAID table */ printf("RAID functions used for computing the parity with 'sync':\n"); printf("%8s", ""); printf("%8s", "best"); printf("%8s", "int8"); printf("%8s", "int32"); printf("%8s", "int64"); #ifdef CONFIG_X86 printf("%8s", "sse2"); #ifdef CONFIG_X86_64 printf("%8s", "sse2e"); #endif printf("%8s", "ssse3"); #ifdef CONFIG_X86_64 printf("%8s", "ssse3e"); #endif printf("%8s", "avx2"); #ifdef CONFIG_X86_64 printf("%8s", "avx2e"); #endif #endif printf("\n"); /* GEN1 */ printf("%8s", "gen1"); printf("%8s", raid_gen1_tag()); fflush(stdout); printf("%8s", ""); SPEED_START { raid_gen1_int32(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); SPEED_START { raid_gen1_int64(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSE2 if (raid_cpu_has_sse2()) { SPEED_START { raid_gen1_sse2(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #ifdef CONFIG_X86_64 printf("%8s", ""); #endif printf("%8s", ""); #ifdef CONFIG_X86_64 printf("%8s", ""); #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { raid_gen1_avx2(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); /* GEN2 */ printf("%8s", "gen2"); printf("%8s", raid_gen2_tag()); fflush(stdout); printf("%8s", ""); SPEED_START { raid_gen2_int32(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); SPEED_START { raid_gen2_int64(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSE2 if (raid_cpu_has_sse2()) { SPEED_START { raid_gen2_sse2(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86_64 SPEED_START { raid_gen2_sse2ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #endif } #endif printf("%8s", ""); #ifdef CONFIG_X86_64 printf("%8s", ""); #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { raid_gen2_avx2(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); /* GENz */ printf("%8s", "genz"); printf("%8s", raid_genz_tag()); fflush(stdout); printf("%8s", ""); SPEED_START { raid_genz_int32(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); SPEED_START { raid_genz_int64(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSE2 if (raid_cpu_has_sse2()) { SPEED_START { raid_genz_sse2(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86_64 SPEED_START { raid_genz_sse2ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #endif } #endif printf("%8s", ""); #ifdef CONFIG_X86_64 printf("%8s", ""); #endif printf("%8s", ""); #ifdef CONFIG_X86_64 #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { raid_genz_avx2ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif #endif printf("\n"); /* GEN3 */ printf("%8s", "gen3"); printf("%8s", raid_gen3_tag()); fflush(stdout); SPEED_START { raid_gen3_int8(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); printf("%8s", ""); printf("%8s", ""); #ifdef CONFIG_X86 if (raid_cpu_has_sse2()) { printf("%8s", ""); #ifdef CONFIG_X86_64 printf("%8s", ""); #endif } #endif #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { raid_gen3_ssse3(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86_64 SPEED_START { raid_gen3_ssse3ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #endif } #endif printf("%8s", ""); #ifdef CONFIG_X86_64 #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { raid_gen3_avx2ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif #endif printf("\n"); /* GEN4 */ printf("%8s", "gen4"); printf("%8s", raid_gen4_tag()); fflush(stdout); SPEED_START { raid_gen4_int8(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); printf("%8s", ""); printf("%8s", ""); #ifdef CONFIG_X86 #ifdef CONFIG_SSE2 if (raid_cpu_has_sse2()) { printf("%8s", ""); #ifdef CONFIG_X86_64 printf("%8s", ""); #endif } #endif #endif #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { raid_gen4_ssse3(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86_64 SPEED_START { raid_gen4_ssse3ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #endif } #endif printf("%8s", ""); #ifdef CONFIG_X86_64 #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { raid_gen4_avx2ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif #endif printf("\n"); /* GEN5 */ printf("%8s", "gen5"); printf("%8s", raid_gen5_tag()); fflush(stdout); SPEED_START { raid_gen5_int8(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); printf("%8s", ""); printf("%8s", ""); #ifdef CONFIG_X86 #ifdef CONFIG_SSE2 if (raid_cpu_has_sse2()) { printf("%8s", ""); #ifdef CONFIG_X86_64 printf("%8s", ""); #endif } #endif #endif #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { raid_gen5_ssse3(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86_64 SPEED_START { raid_gen5_ssse3ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #endif } #endif printf("%8s", ""); #ifdef CONFIG_X86_64 #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { raid_gen5_avx2ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif #endif printf("\n"); /* GEN6 */ printf("%8s", "gen6"); printf("%8s", raid_gen6_tag()); fflush(stdout); SPEED_START { raid_gen6_int8(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); printf("%8s", ""); printf("%8s", ""); #ifdef CONFIG_X86 #ifdef CONFIG_SSE2 if (raid_cpu_has_sse2()) { printf("%8s", ""); #ifdef CONFIG_X86_64 printf("%8s", ""); #endif } #endif #endif #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { raid_gen6_ssse3(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86_64 SPEED_START { raid_gen6_ssse3ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #endif } #endif printf("%8s", ""); #ifdef CONFIG_X86_64 #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { raid_gen6_avx2ext(nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif #endif printf("\n"); printf("\n"); /* recover table */ printf("RAID functions used for recovering with 'fix':\n"); printf("%8s", ""); printf("%8s", "best"); printf("%8s", "int8"); #ifdef CONFIG_X86 printf("%8s", "ssse3"); printf("%8s", "avx2"); #endif printf("\n"); printf("%8s", "rec1"); printf("%8s", raid_rec1_tag()); fflush(stdout); SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[0] = sizeof(void*) == 8 ? raid_gen1_int64 : raid_gen1_int32; /* +1 to avoid GEN1 optimized case */ raid_rec1_int8(1, id, ip + 1, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[0] = raid_gen1_sse2; /* +1 to avoid GEN1 optimized case */ raid_rec1_ssse3(1, id, ip + 1, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[0] = raid_gen1_avx2; /* +1 to avoid GEN1 optimized case */ raid_rec1_avx2(1, id, ip + 1, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); printf("%8s", "rec2"); printf("%8s", raid_rec2_tag()); fflush(stdout); SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[1] = sizeof(void*) == 8 ? raid_gen2_int64 : raid_gen2_int32; /* +1 to avoid GEN2 optimized case */ raid_rec2_int8(2, id, ip + 1, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[1] = raid_gen2_sse2ext; #else raid_gen_ptr[1] = raid_gen2_sse2; #endif /* +1 to avoid GEN2 optimized case */ raid_rec2_ssse3(2, id, ip + 1, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[1] = raid_gen2_avx2; /* +1 to avoid GEN1 optimized case */ raid_rec2_avx2(2, id, ip + 1, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); printf("%8s", "rec3"); printf("%8s", raid_recX_tag()); fflush(stdout); SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[2] = raid_gen3_int8; raid_recX_int8(3, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[2] = raid_gen3_ssse3ext; #else raid_gen_ptr[2] = raid_gen3_ssse3; #endif raid_recX_ssse3(3, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[2] = raid_gen3_avx2ext; #else raid_gen_ptr[2] = raid_gen3_ssse3; #endif raid_recX_avx2(3, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); printf("%8s", "rec4"); printf("%8s", raid_recX_tag()); fflush(stdout); SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[3] = raid_gen4_int8; raid_recX_int8(4, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[3] = raid_gen4_ssse3ext; #else raid_gen_ptr[3] = raid_gen4_ssse3; #endif raid_recX_ssse3(4, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[3] = raid_gen4_avx2ext; #else raid_gen_ptr[3] = raid_gen4_ssse3; #endif raid_recX_avx2(4, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); printf("%8s", "rec5"); printf("%8s", raid_recX_tag()); fflush(stdout); SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[4] = raid_gen5_int8; raid_recX_int8(5, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[4] = raid_gen5_ssse3ext; #else raid_gen_ptr[4] = raid_gen5_ssse3; #endif raid_recX_ssse3(5, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[4] = raid_gen5_avx2ext; #else raid_gen_ptr[4] = raid_gen5_ssse3; #endif raid_recX_avx2(5, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); printf("%8s", "rec6"); printf("%8s", raid_recX_tag()); fflush(stdout); SPEED_START { /* ensure to use same hardware in the delta step */ raid_gen_ptr[5] = raid_gen6_int8; raid_recX_int8(6, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); #ifdef CONFIG_X86 #ifdef CONFIG_SSSE3 if (raid_cpu_has_ssse3()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[5] = raid_gen6_ssse3ext; #else raid_gen_ptr[5] = raid_gen6_ssse3; #endif raid_recX_ssse3(6, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #ifdef CONFIG_AVX2 if (raid_cpu_has_avx2()) { SPEED_START { /* ensure to use same hardware in the delta step */ #ifdef CONFIG_X86_64 raid_gen_ptr[5] = raid_gen6_avx2ext; #else raid_gen_ptr[5] = raid_gen6_ssse3; #endif raid_recX_avx2(6, id, ip, nd, size, v); } SPEED_STOP printf("%8" PRIu64, ds / dt); fflush(stdout); } #endif #endif printf("\n"); printf("\n"); printf("If the 'best' expectations are wrong, please report it in the SnapRAID forum\n\n"); free(v_alloc); free(v); } snapraid-14.9/cmdline/spooky2.c000066400000000000000000000134431522717156100164510ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni /* * Derivative work from SpookyV2.cpp/h * * WARNING!!!! Note that this implementation doesn't use the short hash optimization * resulting in different hashes for any length shorter than 192 bytes * * SpookyHash * http://burtleburtle.net/bob/hash/spooky.html * * Exact source used as reference: * http://burtleburtle.net/bob/c/SpookyV2.h * http://burtleburtle.net/bob/c/SpookyV2.cpp */ // Spooky Hash // A 128-bit noncryptographic hash, for checksums and table lookup // By Bob Jenkins. Public domain. // Oct 31 2010: published framework, disclaimer ShortHash isn't right // Nov 7 2010: disabled ShortHash // Oct 31 2011: replace End, ShortMix, ShortEnd, enable ShortHash again // April 10 2012: buffer overflow on platforms without unaligned reads // July 12 2012: was passing out variables in final to in/out in short // July 30 2012: I reintroduced the buffer overflow // August 5 2012: SpookyV2: d = should be d += in short hash, and remove extra mix from long hash // // Up to 3 bytes/cycle for long messages. Reasonably fast for short messages. // All 1 or 2 bit deltas achieve avalanche within 1% bias per output bit. // // This was developed for and tested on 64-bit x86-compatible processors. // It assumes the processor is little-endian. There is a macro // controlling whether unaligned reads are allowed (by default they are). // This should be an equally good hash on big-endian machines, but it will // compute different results on them than on little-endian machines. // // Google's CityHash has similar specs to SpookyHash, and CityHash is faster // on new Intel boxes. MD4 and MD5 also have similar specs, but they are orders // of magnitude slower. CRCs are two or more times slower, but unlike // SpookyHash, they have nice math for combining the CRCs of pieces to form // the CRCs of wholes. There are also cryptographic hashes, but those are even // slower than MD5. // #define Mix(data, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11) \ s0 += data[0]; s2 ^= s10; s11 ^= s0; s0 = util_rotl64(s0, 11); s11 += s1; \ s1 += data[1]; s3 ^= s11; s0 ^= s1; s1 = util_rotl64(s1, 32); s0 += s2; \ s2 += data[2]; s4 ^= s0; s1 ^= s2; s2 = util_rotl64(s2, 43); s1 += s3; \ s3 += data[3]; s5 ^= s1; s2 ^= s3; s3 = util_rotl64(s3, 31); s2 += s4; \ s4 += data[4]; s6 ^= s2; s3 ^= s4; s4 = util_rotl64(s4, 17); s3 += s5; \ s5 += data[5]; s7 ^= s3; s4 ^= s5; s5 = util_rotl64(s5, 28); s4 += s6; \ s6 += data[6]; s8 ^= s4; s5 ^= s6; s6 = util_rotl64(s6, 39); s5 += s7; \ s7 += data[7]; s9 ^= s5; s6 ^= s7; s7 = util_rotl64(s7, 57); s6 += s8; \ s8 += data[8]; s10 ^= s6; s7 ^= s8; s8 = util_rotl64(s8, 55); s7 += s9; \ s9 += data[9]; s11 ^= s7; s8 ^= s9; s9 = util_rotl64(s9, 54); s8 += s10; \ s10 += data[10]; s0 ^= s8; s9 ^= s10; s10 = util_rotl64(s10, 22); s9 += s11; \ s11 += data[11]; s1 ^= s9; s10 ^= s11; s11 = util_rotl64(s11, 46); s10 += s0; #define EndPartial(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11) \ h11 += h1; h2 ^= h11; h1 = util_rotl64(h1, 44); \ h0 += h2; h3 ^= h0; h2 = util_rotl64(h2, 15); \ h1 += h3; h4 ^= h1; h3 = util_rotl64(h3, 34); \ h2 += h4; h5 ^= h2; h4 = util_rotl64(h4, 21); \ h3 += h5; h6 ^= h3; h5 = util_rotl64(h5, 38); \ h4 += h6; h7 ^= h4; h6 = util_rotl64(h6, 33); \ h5 += h7; h8 ^= h5; h7 = util_rotl64(h7, 10); \ h6 += h8; h9 ^= h6; h8 = util_rotl64(h8, 13); \ h7 += h9; h10 ^= h7; h9 = util_rotl64(h9, 38); \ h8 += h10; h11 ^= h8; h10 = util_rotl64(h10, 53); \ h9 += h11; h0 ^= h9; h11 = util_rotl64(h11, 42); \ h10 += h0; h1 ^= h10; h0 = util_rotl64(h0, 54); #define End(data, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11) \ h0 += data[0]; h1 += data[1]; h2 += data[2]; h3 += data[3]; \ h4 += data[4]; h5 += data[5]; h6 += data[6]; h7 += data[7]; \ h8 += data[8]; h9 += data[9]; h10 += data[10]; h11 += data[11]; \ EndPartial(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); \ EndPartial(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); \ EndPartial(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); // number of uint64_t's in internal state #define sc_numVars 12 // size of the internal state #define sc_blockSize (sc_numVars * 8) // // sc_const: a constant which: // * is not zero // * is odd // * is a not-very-regular mix of 1's and 0's // * does not need any other special mathematical properties // #define sc_const 0xdeadbeefdeadbeefLL void SpookyHash128(const void* data, size_t size, const uint8_t* seed, uint8_t* digest) { uint64_t h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11; uint64_t buf[sc_numVars]; size_t nblocks; const uint64_t* blocks; const uint64_t* end; size_t size_remainder; #if WORDS_BIGENDIAN unsigned i; #endif h9 = util_read64(seed + 0); h10 = util_read64(seed + 8); h0 = h3 = h6 = h9; h1 = h4 = h7 = h10; h2 = h5 = h8 = h11 = sc_const; nblocks = size / sc_blockSize; blocks = data; end = blocks + nblocks * sc_numVars; /* body */ while (blocks < end) { #if WORDS_BIGENDIAN for (i = 0; i < sc_numVars; ++i) buf[i] = util_swap64(blocks[i]); Mix(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); #else Mix(blocks, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); #endif blocks += sc_numVars; } /* tail */ size_remainder = (size - ((const uint8_t*)end - (const uint8_t*)data)); memcpy(buf, end, size_remainder); memset(((uint8_t*)buf) + size_remainder, 0, sc_blockSize - size_remainder); ((uint8_t*)buf)[sc_blockSize - 1] = size_remainder; /* finalization */ #if WORDS_BIGENDIAN for (i = 0; i < sc_numVars; ++i) buf[i] = util_swap64(buf[i]); #endif End(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); util_write64(digest + 0, h0); util_write64(digest + 8, h1); } snapraid-14.9/cmdline/spooky2test.c000066400000000000000000005563631522717156100173660ustar00rootroot00000000000000{ "", 0, { 0xc7, 0xd7, 0x7b, 0x13, 0xfc, 0xa2, 0x7b, 0x21, 0x00, 0x95, 0xf6, 0xa9, 0x6f, 0x84, 0xaa, 0xc9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "a", 1, { 0x85, 0x34, 0x3d, 0x36, 0xf4, 0x56, 0x79, 0x60, 0xa7, 0x96, 0x5f, 0x16, 0x44, 0x1e, 0x8c, 0xea }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "abc", 3, { 0xb0, 0x41, 0x6b, 0xce, 0xba, 0xdf, 0x5d, 0xe3, 0x09, 0x38, 0xcb, 0x1f, 0x25, 0xdc, 0x44, 0xa2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "message digest", 14, { 0xdf, 0xe5, 0xcb, 0x3f, 0x51, 0xa8, 0xa2, 0xd4, 0x8d, 0xa0, 0xd5, 0x48, 0x26, 0x1c, 0x17, 0x74 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "abcdefghijklmnopqrstuvwxyz", 26, { 0x95, 0xe3, 0x9c, 0x85, 0xb8, 0x70, 0x3d, 0x24, 0x51, 0x1c, 0x3c, 0x85, 0x8c, 0xd7, 0x57, 0x2c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62, { 0x7d, 0x0d, 0xb7, 0xae, 0x85, 0xce, 0xa1, 0x13, 0xf8, 0xfc, 0xb4, 0xf4, 0x05, 0xab, 0x68, 0xb0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "The quick brown fox jumps over the lazy dog", 43, { 0xda, 0xfa, 0x43, 0x97, 0xaf, 0x0b, 0xdc, 0x06, 0x1e, 0xc2, 0x77, 0x12, 0xeb, 0x36, 0xd4, 0x4d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x00", 1, { 0x51, 0xe3, 0xc3, 0x5c, 0x6d, 0x8f, 0xb3, 0xc8, 0x01, 0x19, 0x29, 0xcb, 0x9d, 0x98, 0xa3, 0xa0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x16\x27", 2, { 0xbb, 0x96, 0x86, 0x56, 0xcc, 0x62, 0x37, 0xe0, 0xe8, 0xf0, 0x5b, 0x63, 0x3b, 0xd1, 0x6c, 0x42 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe2\x56\xb4", 3, { 0xf6, 0xb2, 0x17, 0x1a, 0x27, 0x85, 0x2b, 0x8a, 0x45, 0x4e, 0x26, 0xf1, 0xeb, 0xb9, 0x60, 0x64 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc9\x4d\x9c\xda", 4, { 0x94, 0xdb, 0x3e, 0x5b, 0x3a, 0x4c, 0x0e, 0xf9, 0x4a, 0xe6, 0x42, 0xfa, 0xc6, 0xb5, 0xa6, 0x1d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x79\xf1\x29\x69\x5d", 5, { 0x0c, 0x5e, 0x36, 0x05, 0x04, 0xd5, 0xf2, 0x53, 0x7b, 0x56, 0x03, 0xc7, 0x6f, 0x08, 0x45, 0x07 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x00\x7e\xdf\x1e\x31\x1c", 6, { 0xd5, 0x65, 0x58, 0x3d, 0xa3, 0x96, 0x8a, 0xa2, 0x6e, 0xe5, 0x8d, 0x84, 0xa5, 0x3f, 0xd7, 0x6c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2a\x4c\xe1\xff\x9e\x6f\x53", 7, { 0x19, 0x00, 0x13, 0x2a, 0xd9, 0x50, 0x80, 0x5e, 0xb9, 0x19, 0x36, 0x5a, 0xb6, 0x36, 0x2a, 0x0f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xba\x02\xab\x18\x30\xc5\x0e\x8a", 8, { 0x13, 0xc7, 0xac, 0xcb, 0x7a, 0x5d, 0xe5, 0x14, 0x4b, 0xf6, 0xee, 0xfd, 0x52, 0x86, 0xb7, 0x5f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xec\x4e\x7a\x72\x1e\x71\x2a\xc9\x33", 9, { 0xe4, 0x12, 0x97, 0x2c, 0xe2, 0xca, 0x21, 0x67, 0xec, 0xe8, 0x63, 0xf7, 0x20, 0x7d, 0xae, 0xad }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfd\xe2\x9c\x0f\x72\xb7\x08\xea\xd0\x78", 10, { 0x11, 0x14, 0x7d, 0xd2, 0x79, 0xd5, 0x32, 0x30, 0x43, 0x83, 0x26, 0x60, 0x47, 0xed, 0x63, 0x2b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x65\xc4\x8a\xb8\x80\x86\x9a\x79\x00\xb7\xae", 11, { 0x59, 0xa5, 0x00, 0x96, 0x3f, 0x01, 0xd8, 0x90, 0x00, 0x46, 0x2f, 0x11, 0xf1, 0xf9, 0xb8, 0x7d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x77\xe9\xd7\x80\x0e\x3f\x5c\x43\xc8\xc2\x46\x39", 12, { 0x21, 0x3e, 0x1d, 0x1b, 0x44, 0xb7, 0x71, 0xc0, 0xde, 0x2b, 0xb4, 0x6d, 0x82, 0x6d, 0x8c, 0x1e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x87\xd8\x61\x61\x4c\x89\x17\x4e\xa1\xa4\xef\x13\xa9", 13, { 0xe3, 0xa9, 0x25, 0xc9, 0x53, 0x3c, 0xa2, 0xa5, 0x69, 0x62, 0x31, 0xde, 0x10, 0xbb, 0x54, 0xd3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfe\xa6\x5b\xc2\xda\xe8\x95\xd4\x64\xab\x4c\x39\x58\x29", 14, { 0x91, 0x14, 0xf0, 0x97, 0x98, 0x3b, 0x8e, 0x97, 0x33, 0x33, 0x8e, 0xb9, 0xca, 0x3a, 0x1d, 0x82 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x94\x49\xc0\x78\xa0\x80\xda\xc7\x71\x4e\x17\x37\xa9\x7c\x40", 15, { 0x06, 0x33, 0x47, 0x61, 0xe7, 0xc9, 0xc1, 0x0e, 0x23, 0x36, 0x86, 0x2b, 0x2d, 0x21, 0x89, 0x57 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x53\x7e\x36\xb4\x2e\xc9\xb9\xcc\x18\x3e\x9a\x5f\xfc\xb7\xb0\x61", 16, { 0x66, 0x36, 0x7d, 0xee, 0x47, 0x92, 0xa4, 0x4f, 0x62, 0xf8, 0xd9, 0x36, 0x8e, 0xe7, 0x69, 0x53 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x59\xa9\x9f\xa6\xdb\xb7\x02\xc5\x95\x65\x34\x17\xde\xe5\xbb\xdf\xc5", 17, { 0xd7, 0x7b, 0x00, 0x79, 0xae, 0x0f, 0xc9, 0x16, 0x02, 0x28, 0xab, 0x6a, 0xdf, 0x3e, 0x30, 0x03 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0d\x52\x83\x32\x6a\x92\xf9\x9a\x6e\x3c\x3d\x5e\xc4\x25\xfe\xc1\xc4\xbe", 18, { 0x46, 0x32, 0xb2, 0xa0, 0x1b, 0xa8, 0xea, 0xce, 0x66, 0x9f, 0xc1, 0x58, 0xc9, 0x94, 0xba, 0x3b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x59\x84\x02\x3f\xbc\x20\x01\x70\xed\xa0\x05\x14\x23\x18\x06\xf2\x52\xc5\xc1", 19, { 0x98, 0xfc, 0x24, 0x88, 0x92, 0xbd, 0xad, 0x17, 0xcc, 0x07, 0x11, 0x2b, 0x37, 0x4e, 0xb1, 0x47 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x81\x84\xc3\xe8\x2f\x63\x65\x79\x4e\xd3\x34\x2c\x9c\xbc\x87\x05\x6d\xe5\xbc\x0a", 20, { 0x9f, 0x9d, 0x76, 0xcf, 0x19, 0x6b, 0xae, 0x90, 0x61, 0x27, 0x76, 0x9d, 0xe4, 0x7b, 0x29, 0x4c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x77\xfc\x10\x0f\x3a\xb2\x20\xad\x0a\x03\xfd\x51\xba\x93\xe6\x70\xe7\x34\xa4\xd8\xde", 21, { 0xb2, 0xfe, 0xf1, 0xb3, 0x6c, 0x1d, 0x2a, 0x88, 0x2a, 0x02, 0x4e, 0x25, 0x12, 0xa8, 0x6a, 0x6d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x84\x87\x22\x2b\xb3\xf8\x44\xbf\x63\xbb\x43\xbd\xa8\xc4\x05\xe1\x2f\xb2\x44\x8d\x7a\xec", 22, { 0x2e, 0x1f, 0xd3, 0x56, 0xce, 0x43, 0x56, 0x70, 0xb8, 0x84, 0x6d, 0xd9, 0x24, 0x49, 0x36, 0x4d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9f\x72\x49\x57\xca\xd7\x15\xb1\xe6\x89\xb5\x8d\xec\x5f\x24\xeb\x42\x69\x5a\x73\x70\xb5\x56", 23, { 0xf2, 0xbf, 0x7a, 0x59, 0x6e, 0x6c, 0x2f, 0xcf, 0x5b, 0xaa, 0x02, 0x31, 0xac, 0x48, 0x5d, 0xe9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4e\xec\xbd\x3d\xa2\x11\x70\x9c\xa8\x2e\xdb\xca\x6b\xbb\x74\x69\x1e\xa7\x03\x0b\x1b\xcd\x2e\xf0", 24, { 0x68, 0x75, 0x89, 0x8f, 0xaf, 0xdb, 0x8e, 0x21, 0x92, 0xab, 0x3a, 0xd2, 0x25, 0xad, 0xc1, 0x26 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x74\x84\x9f\xed\x38\x55\xd4\x69\x44\xc8\x82\x82\xc2\x57\xa7\x4d\x43\x84\x2b\x3a\x75\x06\x32\x95\x81", 25, { 0x03, 0x4c, 0x88, 0xfc, 0x08, 0x2e, 0x21, 0x1e, 0x9f, 0xac, 0x56, 0x0c, 0xfc, 0x96, 0xbf, 0xec }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1e\x01\x28\x03\x09\x8a\xfe\xa7\x8e\x95\x42\x5d\xb7\x8d\x46\x38\x9c\xe5\xa1\xe8\x5a\x25\x70\xd2\x23\x95", 26, { 0x0d, 0xb4, 0xe1, 0xa3, 0x6a, 0xed, 0xb5, 0x0b, 0x0f, 0xa1, 0x90, 0xf1, 0x48, 0xb7, 0x47, 0xd8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbc\xc9\x70\x84\xfc\x6c\x51\x35\xb1\x1c\xe4\x67\x2f\x97\xe4\x80\x7c\x36\x59\x55\x51\xbf\x6d\x98\x3d\xe8\x5f", 27, { 0x6b, 0x15, 0x3d, 0x7d, 0xe7, 0x46, 0x1f, 0xe1, 0xb8, 0x15, 0xe7, 0xc8, 0x75, 0x66, 0x19, 0xf5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdf\xe9\x69\x90\x4d\x76\xbc\xbb\xdf\x03\x74\x42\x55\x4a\x37\xa3\xba\x6a\x5a\x09\x92\xbf\x17\xff\xa0\xed\x6d\x3f", 28, { 0x6d, 0x27, 0xc4, 0x1a, 0xa8, 0xa4, 0x76, 0x37, 0x72, 0x9d, 0x84, 0xbe, 0x00, 0x7b, 0x7b, 0xf6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x51\xfc\x95\xa9\xc8\x9d\x1c\x4f\x87\x8b\xa2\xad\xb7\x0d\x2d\xf6\x14\x98\x2b\x89\x77\x91\x02\x83\x01\x2f\x56\x6e\xe1", 29, { 0x65, 0xa5, 0xce, 0x1b, 0x75, 0x9d, 0x8f, 0xd3, 0x5f, 0x84, 0x26, 0x59, 0x32, 0x0d, 0x9c, 0x5f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7f\xd6\x16\xc3\x81\xc3\x7c\xd6\x70\xff\xe4\x77\x1f\xcd\x09\x7f\x7f\x2b\x71\x26\x3d\xc9\xdb\x92\x88\xa5\xd4\x00\xf0\x44", 30, { 0x99, 0xfa, 0xec, 0x52, 0x11, 0x1b, 0xfc, 0x3a, 0xba, 0xe5, 0x96, 0xbc, 0xa7, 0xb4, 0xa8, 0x3c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x68\x8e\x6a\x8e\xf6\xa2\x70\x47\x1d\xfb\x45\x26\xd2\x52\x56\x94\x94\xac\xbc\x02\xb6\x3f\xde\xe7\xdb\xfe\x34\x55\x81\xc3\x26", 31, { 0x14, 0x6f, 0xe7, 0x1d, 0x1c, 0xa6, 0x6d, 0xc6, 0xd5, 0x33, 0xbb, 0xf5, 0xdc, 0x90, 0x83, 0xf7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x37\xb3\x18\x13\x29\xe2\xa2\x6d\xf4\xce\x2b\x01\xa5\x9f\x4b\x54\x48\x10\xb1\x29\x46\xcb\x13\x20\x58\xcf\xb0\x78\x27\x0d\x7e\xf5", 32, { 0x41, 0x97, 0x27, 0x98, 0x5b, 0x0a, 0x50, 0x29, 0x3f, 0x71, 0xa0, 0x20, 0xfa, 0x18, 0x13, 0x9b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x82\x13\xf6\xdd\x3b\xdf\x78\x1c\x9e\xd6\x5b\x87\x8f\xcd\x95\x3d\x3f\x43\x04\x2a\x8b\xb2\x57\xa5\xf1\xfa\x9c\x39\x2f\xfe\x66\x81\x7a", 33, { 0x96, 0xda, 0xe6, 0x6e, 0xda, 0xaf, 0x1c, 0x5c, 0xb6, 0x68, 0x6c, 0xb5, 0x2a, 0x53, 0x52, 0x21 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4a\x9a\x2c\x58\xf1\xd6\x21\x1a\x76\x7f\xbc\xfa\xe0\x66\x35\xcd\xf1\x17\x22\x64\x6f\xbd\x13\x85\xa1\xb5\x5b\x81\xd6\xad\xee\x72\x1e\x79", 34, { 0x2c, 0x13, 0x32, 0xbe, 0x4b, 0xee, 0x1e, 0x36, 0x8a, 0xcd, 0x5c, 0x1c, 0x5f, 0x5a, 0x7e, 0xce }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x66\x13\x1c\x72\x20\x3c\xf3\x8b\x83\xf8\x5e\xf2\x60\x44\xdc\x5e\x75\x67\x08\xfb\x0c\xe9\x07\xf0\xc1\x31\x1a\x89\x60\xbf\x53\x06\xed\x02\x64", 35, { 0x8a, 0x9e, 0x07, 0x96, 0x6b, 0xeb, 0x7e, 0xc2, 0x3f, 0xca, 0xe4, 0x74, 0x0f, 0x8a, 0xd0, 0xb1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xff\xbd\xd6\x92\x72\xc1\x9e\xc9\x6b\xe3\xfb\xca\x4e\x88\x26\x7f\xc4\x36\xf0\x70\x40\x4f\x53\x4d\x2d\xfc\xb3\xab\xb6\x25\xb7\xcc\x31\x9c\xbf\x97", 36, { 0x6d, 0x72, 0xeb, 0xd3, 0xf4, 0x77, 0x52, 0x8b, 0xb9, 0x10, 0x42, 0x47, 0x1d, 0xcc, 0xa3, 0xa4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x29\x59\x01\xa6\x06\xe0\x43\x7e\x5b\xbf\x37\xda\xcc\x33\x6e\x20\x9a\xeb\xfa\xf5\xcd\xe4\xa5\xec\xfd\x73\xc7\x59\xbc\x61\xc8\x44\xa3\x30\x33\x79\xf8", 37, { 0xd1, 0x39, 0xc1, 0x5b, 0x60, 0xb6, 0x53, 0x6e, 0xda, 0x86, 0xc6, 0x34, 0xa7, 0x8f, 0xe9, 0x66 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7c\x72\xbd\xf9\x7d\x2c\x1b\xc8\xa9\x38\x5c\xf2\x76\x3c\x94\x9d\x3d\xe7\xd9\x4e\x3a\xc7\x0f\x55\xb0\xc7\xdf\xd5\x29\x49\xc6\x74\xdb\xdc\x49\x9b\x27\x9a", 38, { 0x8e, 0x6e, 0x12, 0xe2, 0x8f, 0xd3, 0x0d, 0x34, 0xac, 0x81, 0xc6, 0xe6, 0xe8, 0xf2, 0x84, 0x03 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x46\x6a\x3b\x21\x66\x3c\xd6\x2c\xaf\xd2\x2b\xcd\x36\x1e\xdf\x49\xf2\xae\x2d\x8f\xab\xb3\x29\x57\x10\xae\x22\xd4\xe8\xb6\x20\x15\x61\x68\x8c\xfd\x85\x6b\xef", 39, { 0x73, 0x15, 0x7b, 0xcb, 0xa7, 0x03, 0x3b, 0xb0, 0xac, 0x14, 0x75, 0x41, 0xe5, 0x83, 0xb4, 0x66 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdd\xca\x9e\xd3\xab\xc8\xe1\xc5\xe2\x05\x7d\x7c\xf5\xec\x31\x14\x71\xdd\xda\x73\xae\x5e\xbd\xcd\x31\x6e\x74\x42\xa1\xfa\x74\xa4\x64\x69\x37\x57\xd6\x52\x0a\x51", 40, { 0x41, 0x74, 0x00, 0x0d, 0xee, 0x8b, 0x3e, 0x10, 0xac, 0x8e, 0x4e, 0x41, 0x25, 0x38, 0xa6, 0xf0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x26\x4d\x75\x42\xcc\xe7\x42\xcd\xaa\xaf\x2c\xf3\xbf\x6d\x26\x91\x82\x72\x44\x00\xe1\x0b\x4a\xda\xd5\x0f\xd0\xdc\xa2\x98\x0e\xe7\xa8\xce\x4a\x21\xe9\xdf\xdb\x38\x18", 41, { 0x46, 0x5e, 0x28, 0x3e, 0x2d, 0x14, 0x30, 0xbf, 0x07, 0x39, 0x12, 0x33, 0x8e, 0x1b, 0xcd, 0x05 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0b\xd8\xc7\x5a\xdb\x62\xd1\x9c\x71\x8b\x69\x90\xfb\xe2\x74\x45\x41\x9d\x87\x61\x5e\x61\xea\xfe\x8c\xb0\xbe\x1f\x18\xef\x3a\xce\x74\x13\x11\xd3\x6b\xe8\xf0\x12\x6f\xfe", 42, { 0x19, 0xae, 0x68, 0x51, 0xdb, 0xf7, 0xfa, 0xe7, 0x3c, 0xdc, 0x83, 0x35, 0x95, 0xb7, 0x9e, 0xd8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x23\x82\x0e\x30\x57\xc6\x83\xd2\x7a\x69\x69\x76\xbf\xbb\x8b\x5b\xbd\x42\xd6\x73\xb7\xdf\x70\x10\xf6\x7f\xe1\x2a\x53\x7a\x6f\x4f\xd1\x8b\x89\x27\x66\x6d\x59\xa3\xdb\x0e\x7c", 43, { 0xfc, 0xe5, 0x55, 0x88, 0x24, 0xff, 0x12, 0x50, 0x72, 0x7d, 0xbb, 0x96, 0xda, 0xfa, 0x2a, 0xd0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc2\xc9\x72\xce\xff\xc3\x27\x5e\x5b\x92\x60\x81\x02\x9b\xb1\x02\x9d\x5d\x66\x77\x33\x17\x80\xaf\xbc\x86\x4d\x47\x44\xcc\xa3\x5b\xb9\x6c\xb9\x5a\x51\x72\xa1\xf3\x9a\xb0\x66\x2c", 44, { 0x4e, 0x95, 0x9e, 0x13, 0xba, 0x8e, 0x68, 0xa8, 0xd2, 0xcb, 0x9c, 0xd6, 0xb0, 0x91, 0x48, 0xc9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1f\x22\xbe\x91\xb4\x73\x6c\x89\x5f\x99\x35\xc4\xe3\x9b\x7c\xd0\xea\x73\x7c\xcb\xce\x0e\x22\x33\x04\x6f\x85\xd9\x25\xf4\x03\xf4\x9b\xb1\xf9\x52\xe4\xf8\x1e\xa9\x86\xfb\x7d\x0c\x8f", 45, { 0x32, 0x7d, 0xcc, 0x9a, 0x8b, 0x86, 0x41, 0xe3, 0x94, 0x5d, 0xb2, 0xa1, 0xc4, 0xf2, 0xb9, 0x9a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x88\x0d\x79\xc8\xf2\xee\x8f\x76\x10\x42\x5d\xcc\x5f\xa6\x55\xf0\x43\x4c\x5f\xa8\x6b\xb7\x0a\xa1\x51\x11\xdd\x5c\xe1\x2c\xcc\xb6\x31\x13\xc6\x12\x6f\x4c\x6b\x24\xd9\xae\xdb\x5d\xe4\xd9", 46, { 0x9d, 0x7d, 0x73, 0xcf, 0x4b, 0x16, 0x28, 0xd1, 0x06, 0x3a, 0xde, 0xde, 0xf5, 0xdd, 0x8a, 0xda }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaa\xee\x80\x55\xef\x7b\x73\x4a\x7c\x5e\xe2\xd9\x27\x95\xef\x17\x47\x49\x7b\xa4\x3b\xfc\x0c\xeb\x24\x4e\xca\xf8\xb2\x6b\xa4\xf0\x1c\x14\x90\x32\x29\x49\xef\x09\x6c\x91\x0e\x0a\x8d\xe5\xc9", 47, { 0x00, 0xf1, 0x9c, 0x62, 0x0b, 0xe5, 0x13, 0xde, 0x01, 0x5e, 0x1c, 0xe9, 0xf5, 0x8d, 0x5e, 0x54 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x11\xc1\x3f\x4a\xd2\x5b\xba\xef\x1e\x7c\x66\x4a\xb5\xe6\xaa\x41\xc2\xef\x56\x56\xf7\x91\x45\x01\x45\x9e\xab\x3a\x38\x10\x01\x13\xee\x7f\x8a\x81\xb2\xab\x80\x3b\x39\x39\xe0\xba\x78\x7b\xcf\x61", 48, { 0xa9, 0x50, 0x1d, 0x59, 0x8d, 0x20, 0x34, 0xca, 0x14, 0xc3, 0xfe, 0xc6, 0xd2, 0x01, 0xcb, 0xc6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x20\x68\xa7\xb7\xb8\xab\xa3\xcf\x55\xd7\x23\xc9\xf7\xb7\x9b\x71\x83\xc3\x1e\x04\x59\xaf\x83\x13\x91\x1e\x31\x81\xd7\x75\x8d\xa6\xe0\xca\xfc\x96\x88\xfa\x97\x7c\x8a\xd9\x6b\x1f\xdb\x85\x69\x87\xa3", 49, { 0xc3, 0xf7, 0x89, 0x76, 0x95, 0xe3, 0xbd, 0x8c, 0xca, 0x78, 0xfd, 0x14, 0x43, 0xd5, 0x3b, 0xc0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd4\xf1\xb9\xd9\xeb\xf5\x9d\x7a\xf0\xcd\x01\x65\xd7\x98\xb6\xd6\x59\x49\xd8\x7d\x03\x55\x2c\x3a\x6b\xf7\xa1\x78\x7d\x1e\xf9\x23\xf3\xf5\x81\x47\xe3\x0c\xfc\x46\x72\x28\x9e\xb6\xa6\xa4\x34\xd5\x5a\x81", 50, { 0x1c, 0x9d, 0x43, 0x52, 0xba, 0x7f, 0xc6, 0x30, 0x6b, 0x72, 0xd7, 0x96, 0x5b, 0xd1, 0x2d, 0xbf }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x61\xa9\x4a\x12\x02\xb8\x4e\x3d\xb3\x61\xa4\x6e\x6b\xd6\x66\x1e\x42\xb7\x1a\xfb\x54\x4b\x68\xb5\xbd\x5d\xe6\x65\xc3\xb1\x0f\x99\x13\x22\x53\x00\x24\x59\x48\xaf\xb8\x2c\xfe\x0d\x81\x90\x70\x62\xe0\x3c\x15", 51, { 0x7e, 0x5a, 0xb7, 0x6b, 0xb6, 0x54, 0xdf, 0x9e, 0x2f, 0xb5, 0x77, 0xf1, 0x9a, 0x6a, 0x59, 0x79 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf6\xc8\xdd\x96\xe9\xc2\xef\x9b\x8f\x09\x3f\xbf\x85\xd5\xfa\xa2\x55\xb5\x70\x1c\xc1\x15\x6b\x8e\xb0\xdf\x26\x55\xb2\x3e\xec\x58\x32\x7e\x4f\xc1\x37\x10\x01\xc8\xd6\xa9\x52\xab\x38\x89\x46\xba\x44\xd9\x52\x8e", 52, { 0xb9, 0x98, 0x85, 0xa3, 0x53, 0x84, 0x15, 0xf4, 0x7d, 0xbe, 0x68, 0xff, 0x96, 0x56, 0x6a, 0xc5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe9\x2d\xb3\x5a\x09\x2a\x6c\x59\x05\x41\xda\x67\xe1\x99\xf5\xac\x14\x0b\x25\x73\xef\x47\xbe\x19\xa7\x14\x1a\x20\x01\xb4\x52\x63\x99\x65\x98\x64\xce\x04\x34\xc1\x4d\xcd\x19\xc5\x39\x3d\x24\x1b\xf4\x18\xf0\x9e\x8d", 53, { 0x78, 0x0a, 0x2e, 0xce, 0x91, 0xb5, 0xd9, 0xa2, 0xc1, 0x7f, 0xab, 0xd3, 0x93, 0x73, 0xc5, 0xf2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x86\x58\x4b\xc6\x59\x8a\x58\xc0\x6a\xc4\x5e\x45\x21\xaf\xb1\xb2\x12\x54\xd0\x7f\xc4\xbf\xf8\x6d\x8e\x2f\xd3\x4b\x9b\xf6\x4e\x64\x0c\xf3\x88\x88\x3c\xaa\xe6\xb5\x1f\xfd\x43\x63\xc3\x89\x45\x69\xf9\xa0\xcb\x8f\x0d\xde", 54, { 0x20, 0x66, 0xd7, 0xd2, 0x54, 0xf6, 0x4a, 0x99, 0xbd, 0x73, 0xde, 0x75, 0x3b, 0x07, 0xaa, 0x2a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x82\xb1\xb0\x6a\x97\x8c\xf7\xcb\x86\x28\x7c\x64\x11\xe2\xa2\x8e\x4d\x15\xf7\x50\xd6\x64\xb2\xbd\x23\xa7\x5b\xeb\xf4\x70\x8a\x8b\xe8\x39\xc7\x2a\x2b\x2b\x91\x03\x4c\x8d\x7a\x7e\x2c\xc8\x6f\x49\x12\x13\x16\x12\xdc\xbf\x50", 55, { 0x0b, 0x6a, 0x58, 0xcd, 0x5c, 0x4b, 0xa5, 0xbe, 0xff, 0xdb, 0xff, 0x98, 0x89, 0x58, 0xe4, 0xe9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xde\x50\x21\xdd\x09\x91\x17\x1f\xda\xad\x39\xf7\xc2\x53\x9e\xcc\x32\xa2\x48\xaa\x16\x1c\x2d\x86\xf1\xb9\xe2\xa0\x96\x18\xe6\x01\x80\xd0\x89\x24\xcf\xe5\x77\xb1\xe0\x57\xe5\x64\x87\xd4\x57\x0d\xeb\x8d\x0b\xb0\xff\x25\x06\xcc", 56, { 0xcb, 0x43, 0x10, 0xa9, 0x26, 0xff, 0xaf, 0x74, 0xd9, 0xde, 0xc4, 0xab, 0xa2, 0x97, 0x12, 0x12 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x99\xc6\xb8\xb9\x30\x4e\x4e\x2a\x37\xa7\x95\xd2\x10\x35\x86\x24\xaf\x68\x72\x32\xcc\x71\xcb\xb7\xc4\x11\x8c\x30\x0d\x8c\x46\x24\x54\xbd\xc8\x85\x35\x43\x6b\x2f\x96\xd9\xf7\x8d\xa0\xc4\x36\x5b\x5b\x65\x13\x85\xe6\xee\x6d\x2f\x4f", 57, { 0x69, 0x64, 0x39, 0x12, 0xc7, 0x7b, 0x98, 0x65, 0xf1, 0x8b, 0xc8, 0x61, 0xad, 0x18, 0x5e, 0x44 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x31\x7e\xce\x15\x94\xe2\x73\x37\x21\x47\x28\xf8\xba\xb0\x73\x32\x69\x65\xf7\x54\xd6\x7b\x3a\xfa\xd2\xfc\x82\x28\x0f\xb2\xd8\x22\xf2\x95\x2e\xea\x81\xce\x9c\x57\x77\x67\xc6\xce\x77\x92\x5a\xa0\x5d\x93\xb6\x00\xaf\x4a\xa6\x9f\x32\x61", 58, { 0xc3, 0xc8, 0x1d, 0xfd, 0x52, 0x98, 0x05, 0x1b, 0xe1, 0x01, 0x1e, 0xbf, 0x18, 0xbd, 0x55, 0x5d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4b\xe6\x99\x0e\x17\xcf\x58\x85\xf4\x60\x98\xfe\x84\xc6\x43\x5e\x84\x0a\x3e\x84\x4a\x72\xb7\x33\x6d\x77\x94\x97\x83\x5d\x0a\x76\x05\x75\x4f\xf4\x4f\xeb\x67\x02\xc4\x4c\x1b\x65\x0f\x99\x09\x5f\x84\x00\xd4\xfc\xa4\x3d\x7b\xfa\xbf\x8d\xc7", 59, { 0x81, 0x50, 0x46, 0x50, 0xc1, 0x0e, 0x9f, 0xb5, 0x07, 0xaf, 0xde, 0xd3, 0x59, 0xfe, 0xcc, 0x22 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x55\xb4\x4a\xde\x6f\xd4\x28\xf6\xd9\xe5\x0a\x23\xc1\x42\x82\x50\xf8\x20\xe4\x4c\x9e\xeb\x05\xfc\x6b\xce\x95\xaf\x9d\x52\x16\x8f\x7a\x1e\x78\x32\x81\xdd\x53\x50\x31\x3d\xc0\x8f\x75\x13\xd5\x7b\xaa\x9b\xbb\x91\x4f\xdd\x6c\x7a\x48\x2c\x0e\x55", 60, { 0xb4, 0xc3, 0xbe, 0x48, 0x13, 0x1d, 0x4c, 0xa6, 0x77, 0x96, 0xfb, 0x46, 0x00, 0xaa, 0xe0, 0x23 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xcf\xc9\xe7\x2d\xf7\xa4\xfd\x8a\xde\x42\x4b\x23\x6f\xba\xa1\xb1\xd1\xd9\x19\xde\x70\x65\x31\x5c\xa6\x7f\x8a\x13\x05\x21\x3c\x72\x43\xc7\xd4\xe7\xc3\x2b\xeb\x69\xbc\x28\x64\x32\x08\xc0\x41\x8b\x8b\x39\x22\xbf\x3e\x62\x5c\x31\xd7\xf3\xb2\x8a\x17", 61, { 0xae, 0x50, 0xbd, 0x11, 0xb4, 0x2e, 0x1b, 0x32, 0xbc, 0x0a, 0x61, 0xb0, 0x07, 0x0c, 0xb7, 0x6e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x12\xb3\x0a\xb0\xf2\xaf\x00\xd0\x96\x57\x55\x4e\xb4\xf0\x42\x70\xb4\x34\x21\x56\xd7\xc5\x61\x07\x75\x4f\x94\x17\x5e\x39\xa3\xf1\x62\x07\x21\xc7\xed\x4f\xbc\x13\xca\x55\xd0\xc8\x08\x46\x15\x1a\xfa\x0d\x79\xe7\x58\xd6\x09\xc0\x82\x1d\x08\x98\xe5\x72", 62, { 0xb6, 0x1f, 0xc7, 0x47, 0x6f, 0x2c, 0x1a, 0x33, 0xcd, 0x50, 0x40, 0xd0, 0x30, 0xd4, 0x96, 0x9f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x22\x09\x76\xcb\xba\x3d\x5c\x85\x60\x7f\xaa\xf9\x5e\x5e\x4a\xb7\x71\x7b\xf5\x62\x95\xf0\x5e\x28\xf9\x5d\x6e\xdb\x12\x90\xaa\xb1\xcc\xd0\xb2\x95\xdb\xc7\xe3\x27\x2f\x09\x1b\x57\x85\x45\x9c\x99\x1a\x07\x09\xc5\x7a\x27\x8e\x8f\x77\xd2\x1d\x9e\x36\x32\xd3", 63, { 0x54, 0xbb, 0x99, 0xe2, 0xff, 0x14, 0xe1, 0xce, 0xa6, 0xb9, 0x6b, 0x77, 0xf9, 0x1f, 0x52, 0xd7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4a\x64\xbd\x79\xf7\x86\x17\x25\x09\x6d\xa5\x01\x83\xc7\xaf\x23\x3f\xd2\x31\x9c\xcc\x2c\x3f\x8d\xdf\xc7\x12\x72\x78\xf8\xb3\x82\x93\xae\x42\x2f\x86\xbf\xe3\xc8\xfd\x5e\x46\x3f\x90\xa9\xd2\x04\xfe\x5f\x6e\x0f\x09\xaf\xeb\xfd\xed\x2b\x11\x52\x7e\xdc\x45\xdd", 64, { 0xa7, 0x71, 0x25, 0x07, 0x06, 0x4e, 0x0a, 0x46, 0xbb, 0x2f, 0xd6, 0x8a, 0x0b, 0x19, 0xda, 0x2f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdd\x6e\xd4\x39\xd6\x8c\xde\x6f\xda\x47\xe1\xb9\x94\xaf\xe1\x62\x29\x84\x32\xc9\x11\x06\xe2\x84\x8d\xe9\xc5\xa0\xc4\x65\x1d\x07\x7e\x69\xe6\xfb\x7c\xef\xbc\xbe\x71\x6b\x6a\x54\xa1\x5d\x10\x60\x15\x06\xf0\x2b\x78\x37\xd5\xc4\x92\x44\x20\x41\x5e\x18\x70\x23\xc9", 65, { 0x7e, 0x44, 0xc6, 0xdd, 0x7f, 0x97, 0x6b, 0x87, 0x68, 0x0a, 0xd6, 0x98, 0xec, 0x78, 0x88, 0x0b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x62\xed\xd8\x0a\xed\x32\x59\x98\x0e\xd4\xf4\xcd\x36\x93\x24\x15\xa7\x1d\x9c\xd2\x44\x79\x63\xd0\x81\x16\x18\x60\x79\x71\x57\x13\x1e\x5d\x34\x15\x8a\xf2\xe4\x23\x75\x14\x7c\x2a\xc0\x9f\xd1\x7e\x2d\x2c\x7d\xb3\x32\x83\x03\x1c\xe2\x9d\x0a\xdd\x0b\x54\xc6\xaf\x5f\xa9", 66, { 0x1e, 0x1d, 0x15, 0x6e, 0x61, 0xaf, 0x88, 0x11, 0x0d, 0x63, 0xfc, 0x25, 0x8a, 0x13, 0x66, 0xb9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x74\x30\xca\xb2\x03\xe5\xe2\x1e\xd0\xcd\x7d\x66\x8a\xa2\x5c\x92\x35\xaf\x04\xa5\x4a\x49\xad\xa7\xfb\xeb\x54\x4d\x93\xf2\xeb\x46\xfc\xf1\xb1\x24\x5a\xb2\x9c\xe5\xd5\xca\xf1\x1e\x75\xd8\xf6\xc3\x26\x5a\xc0\x95\xda\x2b\x26\x28\xcd\x9d\xd6\x90\xe4\x2f\x85\xa8\x2f\xeb\x42", 67, { 0x8a, 0x89, 0xe2, 0xa9, 0xd2, 0xbb, 0xeb, 0x0c, 0xd6, 0x6c, 0xe7, 0x6b, 0xbd, 0xe1, 0xd3, 0xa7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfe\x8e\x5f\xe4\x5e\x6f\x35\xa2\xfa\xb5\x71\xc1\x33\xb4\x47\x68\x06\x59\x97\x8f\x16\x67\x06\x16\x52\xdc\xba\xf2\x42\x72\xb1\x82\xf3\x41\xbf\x00\x7d\x81\x22\x12\x2e\x6e\xc3\x80\x55\x44\x0c\x01\xac\x6a\x60\x2e\x63\xab\x3b\x98\xc5\x9f\xe8\xf5\x89\x28\xd9\x75\xb8\x18\xa6\x33", 68, { 0x27, 0x2d, 0x93, 0x98, 0x27, 0x31, 0xa7, 0x1c, 0x09, 0x80, 0xd8, 0x3b, 0xcf, 0xde, 0x6f, 0x7a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x35\xf0\xa5\xc6\xee\xc3\x22\xf8\x9e\x3a\x3b\x8e\x3c\xb0\x5b\x46\x03\x7d\x51\xdf\x1f\x50\x0c\x52\xf1\xb6\xf5\x1e\xff\xb7\xe9\xc1\x7b\x9f\xd2\x42\x6e\xda\xe1\xeb\x81\xf9\x69\x15\x68\xd1\x5b\x1b\xec\xc2\x5a\x71\x93\x15\x7a\xcd\xed\x7f\x9a\x83\x7e\xc2\x5b\xee\x43\x73\xbc\x0a\xe3", 69, { 0x00, 0x4e, 0xc2, 0xb8, 0x3e, 0xdf, 0x71, 0x7c, 0xc0, 0x9c, 0xd3, 0x98, 0x85, 0x4d, 0xc7, 0x95 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd6\x54\x1f\x73\xe5\x2b\x98\xe6\x70\x34\xf2\x10\x5e\x6b\xd0\x55\x11\x87\x2b\xf2\xe8\x5d\xa6\xe7\xde\xd1\xff\x80\x4f\x79\xa2\x7f\xdb\xd0\x58\xe8\x63\x13\x1c\x69\x31\xbb\x0e\x63\x34\x98\x81\x99\x68\x87\x2f\x74\x54\xd0\x8c\xf0\xad\x1e\x37\x27\x18\x1b\x8d\x78\x0d\xa8\x58\x54\xd7\xb6", 70, { 0x81, 0x58, 0x80, 0xad, 0x21, 0x1f, 0x75, 0x90, 0x18, 0x1c, 0x0a, 0xb5, 0xf2, 0xa3, 0x72, 0x34 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa5\xa5\xb7\xc4\xb3\xda\x29\xf5\x07\x93\x3e\xcd\x9d\xe6\x28\x88\x38\x4c\xd4\x17\xdb\x2c\xb2\xb8\x50\x01\x90\x30\xe5\x2a\xa4\xa8\x37\x4e\xa8\x21\x26\x69\x20\x96\xe8\x78\xb7\xad\x39\xbd\xc7\x19\xb0\xaf\xf8\x8f\x2d\x82\x00\x62\x6f\x4e\x88\xbd\xc2\xdf\x2f\x7d\xd5\x18\xa7\xa9\xa9\x04\xfd", 71, { 0xfb, 0x0d, 0x18, 0xc6, 0xe4, 0x89, 0x48, 0xb1, 0xf6, 0xfd, 0xeb, 0xe2, 0xc1, 0xf1, 0xf3, 0x23 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8e\xa6\x7b\xf7\x7b\xc8\x6d\x96\x16\xf6\xce\xbb\x5a\x73\x1e\xe6\x2e\x6d\x93\x19\xa2\xb3\xe6\xdb\xc8\x84\xb7\x58\x2d\x83\x9e\xa6\xf3\xc6\xcf\x22\x8c\x0d\x69\xf9\x15\x0f\x5b\xc3\x4d\xf0\xf3\x49\x30\xd0\x05\x67\x34\x7d\xb4\x0d\x1f\x48\xe0\x5f\x83\xf5\x2c\xfc\xd7\xcc\xaa\x5c\x34\xcc\x26\x53", 72, { 0x36, 0x75, 0xbc, 0x48, 0xda, 0x88, 0x50, 0x72, 0x0e, 0xf7, 0x29, 0x63, 0x24, 0x34, 0xe3, 0x39 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa9\xff\x0c\xb2\x3b\xe9\xf7\x0c\x7c\x1a\xd6\x96\xc6\xe3\xbd\x28\x15\x25\x46\x60\x7e\x45\xa1\xe6\x50\x3b\x3f\xc9\xc6\xca\x17\x08\x65\xca\x94\x2e\xf8\xa1\x1b\x14\x26\xd0\x3c\xca\xad\xa9\x74\x91\x3d\x1e\x9d\xff\xf3\xb5\xf3\x45\x70\x99\xc3\x8e\x96\xca\xb2\x7d\xdf\x73\xa7\xd9\x59\x5c\x56\x45\x42", 73, { 0x2e, 0x33, 0xf2, 0x55, 0x54, 0x86, 0xb7, 0xa7, 0x53, 0x25, 0xf2, 0xe5, 0x8a, 0x28, 0xf6, 0x82 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x76\x6a\x28\x3c\x94\x4e\xab\x2c\x39\x99\xe0\xb5\x8c\x14\x00\x4c\x68\x68\xcd\xf8\x90\x69\x16\xa9\xff\xf9\x59\x32\x5e\x9a\x82\xe3\x8f\x94\xd2\xc7\x66\xbf\xdb\x77\x78\xee\xa7\x99\x0b\xf8\xf9\xf9\x2d\x64\xab\x41\xe0\xb0\x36\x58\x72\x3e\x50\x55\xec\xdc\xb0\x1f\xa0\xee\xed\xa3\xe5\x3a\x84\xb0\xe0\x50", 74, { 0xfd, 0xff, 0x52, 0x9f, 0xba, 0xe5, 0xe2, 0x49, 0xa8, 0xfa, 0x24, 0xec, 0xa0, 0xc7, 0x0b, 0x65 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\x72\x78\x94\x14\x89\x6b\xea\x4c\xc5\x7f\xfc\x42\x80\xd0\x2a\x64\x98\x48\x0f\xb2\x08\x2e\xad\x9d\x23\xd5\x34\x0b\x6c\x74\x74\x78\x14\x16\xdc\x36\x11\xa8\x2e\xd4\xd7\x30\xc1\x9d\xb5\x1d\x72\x38\xcf\xb9\x28\x6d\xb4\xba\x03\x07\x9b\xf8\x21\xd4\x3f\x3a\x0c\xc9\x54\x29\xc3\x42\xa4\x66\x64\x68\xcb\xb7", 75, { 0x17, 0x43, 0xcd, 0x6e, 0xf2, 0xfb, 0x65, 0xa6, 0x27, 0x7f, 0x7b, 0x30, 0xa9, 0x73, 0xb9, 0xe3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x73\xac\x8b\x5c\xc9\x6f\xcd\x80\x1b\xc4\x35\xcb\x26\x4d\x60\x14\x74\x42\xbd\x34\xce\x90\x05\xf6\x3f\x1d\x58\x2a\xc0\x2a\xf6\xd9\x85\xd2\x96\x92\xe3\xaf\x66\xe3\xdc\x9c\xa0\xe3\x49\x94\xc6\xec\xa2\xb9\x7a\x67\x6d\x71\xfc\xc0\x41\xab\x40\x78\x76\x40\xab\x58\x6c\x74\x6a\xc3\x74\x9b\x6f\x25\x5e\xd8\x09\x88", 76, { 0x1d, 0xc9, 0xfa, 0xc0, 0x76, 0x7a, 0xd0, 0x00, 0x3b, 0xec, 0xae, 0x60, 0x8f, 0xb8, 0x72, 0xb3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9f\x01\x1f\x45\x1f\x9e\x09\xd7\x9d\x10\x0c\xcb\xc0\xcf\x6f\xd3\xbb\xcc\x3e\xfb\x9b\xf5\x9b\xf3\x30\xd7\xbb\x8a\x96\x5d\x84\x3c\x5f\xb6\xc2\xe2\x5e\x55\x00\x87\x12\x12\x09\x5b\xae\x6e\xfb\xc1\xc1\xf3\x04\x83\x87\xba\xbc\x25\xcb\x06\x1f\x57\x77\x0e\x25\x83\xba\xd8\x00\x87\xd4\x41\xf2\x7d\x81\x19\xc8\xb5\x00", 77, { 0x7e, 0x0a, 0x91, 0xef, 0x91, 0x65, 0x79, 0x1f, 0x66, 0x8b, 0x7e, 0xb7, 0xb3, 0xe1, 0x02, 0x61 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6b\xf6\xc4\xbe\xda\x50\xb6\xa4\x26\x63\x5e\xfa\xce\x6e\xcf\xf6\xd0\x00\xe3\xe5\x8c\x2f\xf8\xf5\xc7\x72\xbb\x9d\xca\x1c\x1c\xa9\xaa\x76\x61\xe5\xa3\x77\x56\x65\x9e\x22\xa2\x70\xd2\x7c\x36\x07\x86\x29\xde\x15\xf4\xa3\xfa\x34\x4a\x15\x46\x19\xca\xda\xd4\x9e\x11\x8d\x1c\x6b\x74\xcc\x2a\x3f\x86\x8e\xf5\xe0\xb6\x1e", 78, { 0xd2, 0x81, 0xce, 0x6f, 0x24, 0x4b, 0x96, 0x1b, 0x08, 0x0c, 0x6e, 0x2e, 0x55, 0xd5, 0x40, 0x8b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd0\x9d\x15\xb4\xf9\x7d\x36\xae\x4f\x06\x2e\x70\x21\xab\xbb\xd5\x22\xd3\x81\x50\x78\x82\x6f\xa4\xf3\xa6\x41\x3c\x5b\x00\x1e\x27\xe2\xad\x61\xb4\xb8\x51\x75\xa7\xbe\xdf\xd9\x15\x52\x06\x43\xe1\x49\x3b\xe1\xd3\xfa\x5f\xba\x52\x77\x0e\x33\xbe\xd7\x84\xae\x6c\xaf\x2b\x4d\x3f\x9f\xc5\xd4\xdf\x08\x32\xac\x99\xdb\xdf\x04", 79, { 0xb0, 0xc7, 0xe4, 0x19, 0x13, 0x5d, 0x32, 0x5b, 0x90, 0x39, 0x3c, 0x85, 0x8c, 0xd8, 0x61, 0xfd }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x8d\xcb\x12\x2a\x27\x37\x78\x2a\x79\xea\xc1\xa9\x6e\x1e\x0a\xc0\x7b\x0a\xbd\x67\x31\x0d\x79\xac\xf3\x74\x0e\x90\xc1\xe8\xa4\x7e\x32\x77\xfb\x69\x80\x3d\xcc\x81\xbd\xae\x4f\x91\x24\x83\xd6\xf8\x8b\x3f\x96\x41\xf4\x5d\x86\x62\x42\x18\x61\x8e\x08\xd6\xc5\xb7\x7d\x32\x7d\xa3\x8c\xa5\xdc\xaa\x08\xd0\x40\x0a\xfd\x68\xb6", 80, { 0x6a, 0xa7, 0xac, 0x63, 0x95, 0x32, 0x9d, 0xb9, 0x93, 0x8b, 0x41, 0xfe, 0xd5, 0x77, 0x03, 0x84 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe6\x21\xbe\xbc\xe1\x6a\xea\x21\x53\xb9\x93\x09\x27\xb4\x5e\x0d\x51\xb1\xf1\x7f\xee\xcd\xa3\xcb\xf9\x1d\xc2\xf8\xa7\xfc\x80\x4e\x61\x84\x7a\x12\x5c\x18\xe6\x6d\xd6\x1d\x59\x6b\xee\xc8\x33\x1e\x20\x12\xa8\xe3\x5d\xc9\x6b\xbc\xc3\xc0\xf9\xdd\xfe\x27\x7f\x42\x3a\xf5\x68\x7d\xc4\x81\x87\x8e\x3c\x30\xde\xea\x79\x49\x09\x9e\xf9", 81, { 0xa4, 0x46, 0x74, 0x55, 0xda, 0x5c, 0x22, 0x46, 0xf2, 0xb8, 0xd1, 0x7a, 0x5e, 0xa9, 0x22, 0x09 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe5\x4a\x8d\x03\x02\x32\xd5\x5c\xb6\xe8\x50\xa1\x80\x19\x36\x47\xba\x7c\xe0\x2d\x2a\x00\xa7\xdb\xb9\x95\xeb\x5a\x3b\x94\x30\xaf\x6c\xcc\x62\xf5\xfc\x2a\x39\x16\xc1\x04\xb7\x26\x0c\x02\xcf\x5c\x16\xa9\x20\xad\x98\x85\xde\x07\x79\xf3\xd2\x27\xa2\x88\x78\x17\xee\x22\x46\x48\x3d\x89\x0c\x47\xa7\xc1\x76\x1f\xce\xee\xaf\x4c\x4d\xe4", 82, { 0x67, 0x67, 0xb5, 0x70, 0xa1, 0xd2, 0x3b, 0x5c, 0xb5, 0xea, 0xb7, 0xf3, 0x39, 0xa9, 0xef, 0xf7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x20\x57\x4d\x4b\x56\x13\x36\x6b\x02\x72\x81\x9a\x19\x04\xac\x3f\x1c\x0e\x47\x82\x72\x43\x2c\x92\xf1\x22\xcc\x92\x7b\xeb\xa3\x21\xc5\x3f\xcd\x84\x33\x53\xb3\x73\xdf\xd0\xdd\x7d\xb9\x4b\xec\x18\xc8\x5c\x9f\x49\x8f\x5d\x12\xec\x8a\xc1\x08\xa1\xd7\x0e\x5d\x53\xf2\x78\x9e\x66\x99\x1c\xb4\x7c\xce\xd5\xbb\xe4\xfb\xbf\xf0\xa1\x2f\x46\xc9", 83, { 0xb9, 0x7f, 0x77, 0xa3, 0xd3, 0x37, 0x5f, 0x32, 0xbd, 0x36, 0x3b, 0x21, 0xb8, 0xd0, 0x42, 0xef }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x12\x87\xe9\x1f\x42\xa8\x91\x87\xce\x68\x88\xbe\x6f\x8c\x18\x42\x24\xac\xc1\xfd\xfd\x33\x15\x1c\x85\x83\x34\xff\xcd\x35\xe0\x49\x11\x7e\x3c\x16\x0a\xad\x26\x4c\xcf\xd0\x2d\x0b\x69\x76\x31\x3e\xf2\x90\x96\x53\x68\x71\x24\x07\x13\xf5\x7f\x5a\x91\xbd\x3e\xa2\x7b\x98\xa9\xbc\xb6\xfd\x14\x5d\x58\xb4\xd2\x86\x34\x95\xd8\x16\x04\x69\xf0\x79", 84, { 0x1d, 0x33, 0x53, 0x15, 0xa2, 0x3a, 0x5b, 0x3d, 0x37, 0x92, 0x65, 0xc7, 0x04, 0xb6, 0x7a, 0xd8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x32\xed\x96\x7e\x43\xf4\x73\x47\xe0\xac\x73\x59\x83\xf9\x85\xd4\xba\xfd\xef\xbc\x1b\xb9\x4b\x75\xc5\xcd\x21\x4e\x8e\x5b\x22\x34\xce\x0a\xff\x87\xc7\x26\xe4\x09\xaf\xe5\x95\xf2\x5c\xc5\x23\x22\x8c\x10\x4a\x6e\xcd\x81\x6a\x1b\x0f\x01\x20\x69\xc4\x8a\x81\x46\xb1\x2d\xf3\x24\x55\x2e\xa7\xe4\xf2\x4d\xb6\xf1\x3c\x20\xd7\x6a\x9d\x9b\xbb\x77\x23", 85, { 0x2d, 0x58, 0x23, 0x43, 0xe5, 0xa1, 0xc3, 0x4b, 0x28, 0x16, 0x9e, 0x76, 0xb5, 0x07, 0xd4, 0x3a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb2\x05\xbd\x07\x15\xe9\xec\xdb\x1a\x60\x75\x4f\xb9\x05\x59\x9f\xb0\x90\x1d\x9d\xc7\xec\xda\x56\x2e\xf6\x70\x64\x02\xd4\xdb\xd0\xee\xf0\x9e\xa1\xee\x90\x5b\x06\x2f\x14\x84\x1b\x13\xcb\x2c\x5b\x50\x71\xf7\xa3\x38\x49\x30\xdf\x13\xd3\xf9\x53\xa8\x2b\x9d\x88\xdb\xfe\x02\xd1\x70\x29\x3a\x78\xed\xf0\x38\x8a\x9e\xd7\x9f\x3c\xb2\x20\xb6\xf9\x83\xe2", 86, { 0x88, 0xef, 0x98, 0xec, 0xda, 0x19, 0xbe, 0xbe, 0x17, 0xb8, 0xe4, 0x4d, 0xea, 0x79, 0xc2, 0x82 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x78\x09\xf3\xc3\xc8\xdf\xf2\x52\xc2\xff\x1b\x03\x2d\x8a\x7e\xc8\x0c\x67\x79\x48\x54\x10\xbf\xbe\xb7\xf6\x7a\x71\x9f\x92\x8d\xcb\x36\x0a\xf2\x19\xa2\x7c\x43\xde\x4e\xe9\x54\xd4\x64\xc1\xfd\x80\x57\x07\xf5\x71\x9c\x20\xd9\x15\x78\x3e\x4d\x37\xf4\x64\x39\x19\xee\x15\x35\x29\x4a\x9d\xff\x64\x45\xfb\x29\x44\xe9\x69\xd0\x67\x9d\x8a\x86\xbe\xd4\x2f\x51", 87, { 0x5a, 0x35, 0x4a, 0x9b, 0x4a, 0x1f, 0x23, 0x3b, 0x70, 0x42, 0xbb, 0x52, 0x31, 0x27, 0xee, 0xee }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6e\xe6\xc6\xcd\x46\xfb\x60\x6c\xdd\x23\x5d\xde\x48\x84\xb7\x8c\x76\xab\xe7\x3d\x28\x03\x77\xdb\x8f\x63\x26\x50\x83\xc1\xb1\x8b\x5e\x04\x44\x9f\x73\xf8\x7d\x0a\x2e\x5b\x19\x12\xca\x14\x3d\x4b\xa9\x83\x63\x36\x53\xf3\xdf\x04\x0d\x2c\x0d\x78\x15\x26\x19\xea\x79\xd7\x6b\x67\x91\x2d\xad\xf6\x1f\x18\x7a\xf6\x01\xbe\xa4\xa3\x90\xd2\x22\xb7\x99\xff\x95\x2c", 88, { 0xdd, 0x18, 0xb1, 0x72, 0xbb, 0x74, 0x5b, 0xfc, 0x9b, 0x3f, 0x66, 0xec, 0xc2, 0x0a, 0x43, 0xcc }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf6\x7e\x75\x20\xc8\xc7\xdc\xd2\x52\x63\xef\xc9\x75\xe0\xe5\x14\xc4\xde\xb5\xac\x43\x47\x60\xf5\xc1\x9c\xd8\x63\xcf\x6a\x8c\x3a\x5c\xdb\x91\x6e\xee\x68\x6e\xa8\x7f\xac\x84\x6a\xf2\x54\x18\x49\x30\x33\xff\x59\xe4\x72\xe5\xa8\xcf\xe5\x39\xe0\xc8\x78\xb8\x10\x54\xc8\x95\x84\xde\xce\x42\xd0\x93\xb6\xde\xec\xdc\xce\x3b\x79\x79\x99\x8a\x22\x37\x04\xa6\x1d\x4d", 89, { 0x95, 0xd2, 0xf3, 0xfa, 0x24, 0xcf, 0xd0, 0x6d, 0xca, 0x74, 0x7b, 0x13, 0x05, 0x68, 0xcd, 0x51 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb0\xfa\xd1\x59\x6e\x0f\x92\xf2\xc9\xb5\x87\xe9\xbc\xcd\xad\x21\x84\xb2\xf4\x08\x90\x42\x87\xb1\x96\x8c\x29\x90\xbf\x18\xbb\xd1\x02\xcd\xda\x55\x8f\x83\xa5\x4a\x61\x26\x9c\x65\xf6\x83\xa4\xbf\x1b\xb2\x27\x49\xe0\x20\x58\xee\xac\x38\x94\x44\x69\xae\xe4\xed\xdf\x68\x9f\x90\x1f\x09\x2c\x6f\x15\x1a\xe5\xa6\x41\xd7\x18\xff\x7f\x94\x27\x74\x02\xca\xcf\x42\x5f\xc2", 90, { 0x1c, 0x07, 0x39, 0x77, 0xf3, 0x7e, 0xb5, 0x17, 0xb5, 0x1c, 0x09, 0x97, 0xbb, 0x47, 0x34, 0xe3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x85\xa6\xc5\xdd\xfc\x37\x4b\x7e\xc4\xdf\x62\x94\x0c\x77\x6a\xc7\x88\xfe\x60\x3e\x6d\x76\xb4\x0b\x99\x5c\x38\x34\xd1\xc2\x35\x5f\x22\x0a\x98\x19\x68\x41\x4a\xc3\xed\x15\x9d\x19\x29\x75\xe1\x60\xa8\xc4\x17\x2c\x09\xb9\xbd\xcb\x22\xd5\xc8\x51\x41\x82\xb0\x41\x8d\xc5\xa5\xd5\x8c\xa0\xdf\xeb\xbe\x07\x13\x8c\x66\x7c\x01\x19\x68\x49\x2a\x14\x4d\x5a\xa0\x88\x64\xb4\xf5", 91, { 0x6b, 0xcf, 0x3d, 0x4f, 0x7a, 0x79, 0xf2, 0x5e, 0xe8, 0xd1, 0xda, 0xe9, 0x5e, 0xb1, 0x9c, 0xc5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x17\x04\x96\x55\x9e\xec\x2a\xb0\x86\xcb\xe8\x0f\xaa\xdb\x88\x08\xe0\xa7\xa1\x4d\x26\xee\xe3\x5e\x6b\xa0\xee\x5f\xf7\x05\xcc\x04\x77\xfd\x12\xa8\xa9\x62\x8e\x7d\xa0\x89\xad\xde\xb4\xe8\x6c\xc1\x0a\xd1\xf9\x48\xbc\x5c\xe6\x76\xa4\x64\x08\xfe\xca\xa7\xf2\x37\x68\x11\x09\x2d\x96\x12\x44\xd1\x96\x2b\x83\x50\xbe\x89\x88\x80\xfe\xc8\x96\x77\x0d\xd8\xa4\x36\x35\xfd\x3e\x83", 92, { 0x0a, 0x40, 0xa5, 0x22, 0x7b, 0xe3, 0x34, 0x40, 0xb1, 0x02, 0xa4, 0xf4, 0x4a, 0x1d, 0x26, 0xcb }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb7\xf0\xf9\xd4\xdc\x23\x91\x67\x99\x22\xa1\x6f\xdd\x15\xfd\x68\x7b\x62\xaf\x8c\xaf\x6f\x8d\x5e\x4f\x85\x74\x63\x8f\xd0\x23\xf0\x71\x83\xb6\x1f\xc7\x18\xbc\xdb\xe6\xb5\xf8\x1b\xe9\xaa\xb1\x2c\x9f\x17\xb6\x26\x12\xab\xf2\x80\xb5\x87\xa7\xc0\x29\x40\x4b\x4a\xac\x03\xfc\x5a\x1e\xd3\xa0\x0d\xb1\xef\x9d\x99\x2d\x4f\x32\x9e\xde\x4c\x70\x94\x1b\x5f\xd9\x63\x73\x01\x93\x11\x75", 93, { 0x83, 0x24, 0x5e, 0x67, 0xff, 0x3f, 0xf3, 0xac, 0x7f, 0x5d, 0x83, 0xda, 0x0f, 0x0f, 0x3b, 0x66 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb2\x49\x95\x1c\x16\x9f\xcb\xd5\x39\x4f\x81\x2f\xf3\xe5\xae\x1e\x67\x13\xc2\xec\xa5\xb2\x19\xbd\x70\x56\x89\xbd\x19\x8c\x1a\xe8\x8a\xb2\xd5\x75\x5f\x73\xb5\xe0\x2e\xdf\xba\x93\xe7\x23\x1d\x30\x57\xe9\x9e\x7e\xc7\x4f\xf9\xed\xc1\x7c\x77\xc7\xf2\xe5\xa0\xf5\x2b\x1b\x0e\x6c\x81\x4e\x5c\x32\x95\x62\x3e\x11\xee\xac\xab\xd6\x82\x49\x34\x46\x54\x1b\x78\x9f\x37\x61\xb0\xc6\xb0\xf2", 94, { 0xc1, 0xa1, 0x23, 0x7f, 0xf0, 0x11, 0x23, 0xcf, 0x64, 0xb1, 0x96, 0x5d, 0xb6, 0xb5, 0x34, 0xe0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x66\x12\xf9\x16\x43\xb3\x22\x01\x05\xc0\x53\xed\x8f\xdd\x2c\xd2\x1a\x85\x4d\xc5\x8a\xfa\xf1\xeb\xdb\xc6\xb5\x18\xba\xec\x77\x08\x30\xb0\x59\x38\x79\x00\xe5\x62\xf3\x7e\x4b\x94\x32\x2b\xc5\xec\x30\xb1\x1b\xf2\xa2\x4d\x42\x92\x65\x57\x20\xb4\x17\x6f\x6b\x7a\xc3\x46\xaf\x15\xb4\x06\x6e\x44\x6a\x5f\x61\x6b\xaa\x2f\xdd\x4c\xb0\xcd\x51\x64\x80\xf3\xec\xe4\x5b\x45\x5b\x4a\x4c\x82\xb0", 95, { 0x5c, 0xe8, 0x8d, 0x8c, 0xb0, 0x07, 0x9f, 0xc3, 0x82, 0x01, 0x92, 0x4f, 0x7d, 0xb2, 0x46, 0x76 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9c\xe1\x46\x5e\x41\xf7\x79\x61\x7c\xaf\x58\x7a\x85\x7d\x1e\x98\x46\x5f\x4e\x53\xaf\x2a\xa0\x91\xb6\xff\x86\x4b\xef\xdd\x59\x6a\xc3\x50\x25\xcb\x50\x48\x0d\x62\xdd\x04\x5d\x7a\xf8\x2d\x2a\x1a\x2e\xff\xa8\x83\x67\xa2\x08\xd7\xdb\x97\x0b\xd4\xb5\x4e\x28\xbd\x42\xd4\x56\x59\xd6\xa9\x77\x15\x3c\xb0\x61\x44\xd7\x3f\x89\x87\x59\x56\x4e\x48\x1f\xed\xe0\x60\x28\x66\xcb\xd9\xb1\x22\x24\xcd", 96, { 0x13, 0x2f, 0xc8, 0x0f, 0xaf, 0x52, 0x90, 0x3f, 0x45, 0x2f, 0x80, 0x39, 0xa5, 0x04, 0x8c, 0xd4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6e\x2f\x4e\x6d\x66\x1f\x69\x1e\x6c\xf4\x59\xbd\x35\x37\x6e\x03\x1b\x28\xb5\x04\x6d\x0f\xda\xd1\x70\xb1\xb8\x3e\xf7\xde\x7f\xbe\x9a\x27\x81\x6a\x96\xae\x99\x20\x41\x16\x38\xc8\x28\x98\x0d\xb2\xc7\x37\x51\x1b\xe4\x0c\xac\xcf\x88\xbb\xc7\xe8\x9b\x06\x6f\xb4\x1b\x80\x62\xb5\xf8\x59\xba\xc2\x90\x58\xf3\x4a\xc2\xe8\x9b\xb8\xb1\x49\x95\xf3\x17\xe7\x09\xfd\x43\xc8\xec\xbb\xb0\x1e\x27\xd3\x44", 97, { 0xe5, 0x04, 0x88, 0xc9, 0xa8, 0x97, 0xde, 0x0f, 0xc3, 0x2b, 0xee, 0x13, 0xc6, 0x06, 0x7c, 0x2d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfc\x66\xb1\x22\x26\x80\xa5\x2c\x01\x7e\x26\x18\xa9\x4a\x3a\x2d\x21\xf6\xed\x9b\xa5\xa5\xfe\x75\x1c\x1a\x9a\x4c\xa9\xdb\x40\x69\x61\x01\xc3\xa6\x17\x9f\x6e\xe9\x52\xcd\x41\x3e\x60\x50\x5a\x91\x84\xe7\x6f\x05\x4a\x34\x78\xf3\xfc\x46\x69\x82\x2d\xbf\x1d\xdf\x72\xa7\x4e\x19\x30\xcc\xc1\x9c\x91\xd3\x7f\x48\x91\xe0\x3d\x2e\x34\xdd\xdd\xe7\xda\x6b\x0d\x90\xaa\x63\x0e\x65\x2c\x07\x8f\xf9\xf3\xcb", 98, { 0xf8, 0x09, 0xb6, 0x5e, 0xb8, 0xfb, 0xde, 0x39, 0xd6, 0xfe, 0x1c, 0xd8, 0x44, 0x48, 0x7f, 0x01 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb7\x0f\x77\xb9\x42\x19\x01\x85\xc3\x4a\xbf\x2d\x07\x5a\xf7\x4c\x9a\xd6\x59\xfd\x63\x21\x6d\x66\x6a\x0b\x2b\xe8\xba\x0b\xa9\xe1\x62\x1c\xef\x1c\x95\x32\xe6\xd6\xf1\x58\x6f\x6e\xdd\x68\x91\xa8\x0b\x66\xca\x9d\x1d\x79\x86\x43\x64\x86\xad\x95\xc3\x6a\x57\x5f\xb2\xd4\x9b\xa8\x5e\xbe\x85\xbb\xee\x86\x25\xd4\xe1\xad\xc4\x64\x93\x2b\x32\x01\xde\x6c\x3b\xed\xdd\xeb\x38\x41\xcc\x6a\xc1\xb7\x0b\xcb\x80", 99, { 0x4e, 0x3f, 0xa9, 0x33, 0xaf, 0x6e, 0x3a, 0xac, 0xc0, 0x29, 0x88, 0x8f, 0x91, 0x86, 0xc9, 0x7c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x11\x42\x8e\x21\x28\x9e\xe8\x65\x94\x38\x7c\x56\xf5\x97\xb8\x95\xdc\x4c\xcf\xcf\x5a\xbc\x4e\x4e\x22\xfa\x5d\xab\x5d\xd2\x95\xa2\x0b\xe3\x78\xfe\x10\xe4\x91\xb3\xe3\x07\x29\x0a\xce\x7a\xa3\xf7\xe2\x0a\x75\x86\x7b\xe2\xc3\x74\x6c\x72\x9a\xda\xc6\x6b\xc5\x04\x4a\xe6\x50\x60\x69\xa4\x97\x92\xf3\x70\x09\xa4\x64\xa1\x7f\x5b\xc8\xbc\x33\xa5\x47\x36\x5e\x2e\x51\x56\x72\x11\x66\x39\xf1\xab\x82\xef\xe8\x8c", 100, { 0xbe, 0x63, 0xc5, 0x40, 0x5e, 0x75, 0x2c, 0x1d, 0x52, 0xb3, 0x28, 0x39, 0x09, 0x05, 0x7b, 0x4d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x24\xc3\x0c\x87\xfa\x99\x6f\xe9\x2b\x6f\xdf\xc6\x40\x06\xdc\x6f\xb0\x9a\x33\xff\x06\xcc\x3b\x15\xb1\xa1\xab\x9c\x68\xa3\x17\xc5\x38\x25\x05\x16\x2b\xa4\xb0\x9c\x97\x49\x58\x3c\x00\x8c\x44\x28\xab\xf2\x56\x6d\xc0\xf6\x49\xa8\x1a\x06\x89\xd8\xaf\xa4\xae\x4f\x97\xad\x97\xc3\xba\xb7\x1f\x81\x1b\x93\x7f\xc1\xbb\xf1\x40\x14\x2b\x23\xda\xfa\xb2\xfa\xee\x90\x16\xcd\x1d\x66\x0b\x98\x83\x6f\x35\x40\xd4\x11\xdc", 101, { 0xd6, 0x38, 0x85, 0xcf, 0x1e, 0xaf, 0x84, 0xf1, 0x6a, 0x8f, 0x77, 0xc8, 0xab, 0x9e, 0x1a, 0x64 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf4\x11\x5d\x2b\xb0\xe6\x59\x25\xdb\xa3\x78\x25\x10\xd5\x2b\x10\xfa\x81\x90\x19\x59\xfc\x49\x30\x21\x6a\x68\x08\xc1\xd1\x86\xc3\x81\xd9\xf3\x3d\x04\x22\x07\xf2\xed\x42\x97\x8d\x9e\x59\x83\x0e\x1c\x53\x6d\x96\x0f\xba\x84\xd2\xe5\x36\x7e\x02\x15\xa2\xa4\xa5\x81\xcb\x07\xc3\xf4\xc7\xd0\xd6\xcb\xf0\xb5\x56\xb1\x7c\x88\xe0\x83\xba\xe9\x02\x52\xeb\x1c\xa5\x86\xbb\xf5\x18\x1f\x5a\xf0\xb5\x17\x3c\x5d\x32\xe4\x69", 102, { 0x7b, 0xe8, 0xa1, 0x02, 0xa6, 0x52, 0xe9, 0x3b, 0x9d, 0xb4, 0xbc, 0x95, 0xba, 0x9e, 0xd1, 0x07 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb8\x86\x19\x81\x17\x75\x2c\x50\xbc\xba\x52\x0a\xca\xd0\x87\x23\x15\x5e\xaa\xcd\x12\x3d\xc4\x0f\xed\x27\x69\x7f\xba\xfd\x37\x9c\xc3\xb4\x7b\xca\xff\xde\xf4\xea\xa4\xd1\xaf\x95\xd4\x76\x11\xf6\x72\xb0\xf3\x41\x18\x66\xe7\xd4\x21\x2f\x9a\xe8\xe1\x99\x52\xf4\xf4\x16\x96\x9e\xb4\x84\xec\x5e\xc4\x57\xbd\xb2\xc9\x66\x55\xf8\x39\x4e\x07\xeb\x4b\x87\x6d\xbc\x0e\x01\xcd\xcc\x96\x7a\x98\x04\x50\x5f\x0c\xd2\x77\x5c\xf9", 103, { 0x60, 0xd0, 0x9d, 0x98, 0xae, 0xef, 0x2b, 0x51, 0xa0, 0x3c, 0x5d, 0x3c, 0x71, 0xa6, 0x4a, 0x5b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\x9f\x82\xa0\xb2\x6f\x14\xb6\xbc\x6c\xee\x89\x9e\xf0\x93\x3a\xdd\x39\xd1\x28\x7f\x9d\x13\x6d\x62\xdb\x43\x82\x39\x8e\x5a\xfe\x24\xbb\x85\x7b\xeb\x89\xf5\x99\xd8\x10\x44\x1c\x2e\x49\x7f\x31\x49\x26\xd4\xce\x53\xbb\xd9\x37\xa0\x99\x76\x9c\xa7\x3c\x71\xdf\x9e\x9a\x94\x74\xb1\xdb\x7d\x62\xde\x28\x02\x66\x70\x9d\x3e\x36\x15\x58\x3d\xe3\x9e\xb3\x40\x57\x54\x8e\xad\xfe\xf1\xc5\x96\x82\x42\xc1\xe4\xae\x57\x2a\x20\x74", 104, { 0x1a, 0xe2, 0xe9, 0xa9, 0xb1, 0xf0, 0x27, 0x90, 0x7d, 0xf3, 0x66, 0x14, 0x07, 0xe0, 0xe9, 0xdc }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x63\xba\xdd\x0a\x37\x2d\xc6\x2e\x56\x54\x40\x8b\xb4\x49\xbb\x34\x10\xbd\x9a\x4d\xeb\x6d\xbc\xc8\x23\xb4\xa7\x4d\x31\x39\x51\x33\xfc\xc8\x8a\xab\x57\x3f\x09\xfd\x1e\x9f\x11\xea\xe8\x42\xbf\x2f\x69\x2b\xf3\x2b\x67\x79\xd9\x98\x57\xf6\x13\x75\x94\xcc\x85\x04\x3b\x57\xbc\xef\xa5\x16\xfb\x86\x82\xba\xe4\x23\x8e\x61\xc0\xaf\xf3\xdc\x6b\x3d\x3b\x2c\xdf\xd4\xf0\x0c\x5b\x4a\xd3\xa8\x2f\x4b\xb5\x6b\x27\x79\xf5\xf6\x91\xae\x96", 105, { 0x0c, 0x2a, 0x47, 0x52, 0xba, 0xb6, 0xca, 0x3e, 0xb2, 0x6e, 0x64, 0x53, 0x9f, 0x3d, 0x3f, 0xf2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2c\xed\x5c\xfb\x6a\x31\x16\x42\xd4\xb6\x27\x3b\xcb\xc2\x60\x04\x7a\xb3\xf0\x42\x90\xc4\x6b\xfe\x08\x7f\xed\x19\x23\xbf\x58\x6d\x78\x61\xb8\x82\x21\x87\xc8\xea\x17\x88\x8e\x3a\x98\x77\x21\xa5\xc4\x4f\x8b\x36\x48\xb8\xc9\xaa\x31\x78\xef\xe7\xe2\x79\x68\x1d\x21\x72\x5b\x78\x4b\x35\x2a\x7f\xa8\x95\x14\x0c\xd9\xf2\xfa\xe8\x6e\x63\x3f\x02\x94\x7e\xc8\x4c\xeb\xc7\x23\x33\x76\xb2\xc4\xb9\xac\x56\x6a\x30\xab\xb1\xa0\x95\x8c\x92", 106, { 0x73, 0x8a, 0xe1, 0x0f, 0xcf, 0x84, 0x6e, 0xf5, 0x84, 0xab, 0x8b, 0x58, 0xd5, 0x1b, 0xc8, 0x95 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5f\x86\xd1\x27\xd0\xe1\xfb\x23\x30\xfb\x39\x8b\xcd\x7a\x3a\x1e\x2d\xd0\x23\x5f\x4d\x54\x9d\x40\x07\xfe\x05\x6d\x8d\xbf\xc7\x32\x11\x7b\xc5\x09\x87\xa4\xf0\xc4\x82\x74\xfa\x53\x3b\xc7\x22\x33\xb1\x92\x2e\x74\xea\x04\x77\x64\x57\x37\x1e\xdd\x55\x93\x5c\x28\xd0\xc0\xf8\x8d\x02\x45\xd1\x79\x59\xc2\x9b\x49\x77\xc6\xa7\xb9\x53\x4e\xda\xe4\x7c\xdb\xbf\xf7\x7e\x2e\xb9\x76\x5d\xa3\x51\x2a\x3e\x28\xae\xa6\x26\xd8\x22\x75\xd9\x38\xe0", 107, { 0x4e, 0x61, 0xed, 0x55, 0xbd, 0x31, 0x31, 0x6f, 0xa6, 0xa6, 0x8f, 0xde, 0x2b, 0x8f, 0x51, 0x60 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe3\xe4\x0c\xcc\x64\xb7\xd7\x6b\xa4\xea\xee\xfa\x2b\xa0\x38\x9a\xac\x09\x84\xa8\xeb\x01\x87\x2b\x4a\xd6\x71\x67\xee\x27\x2a\x8e\x92\xe7\x2e\x96\xe8\x81\x02\x26\xa7\x16\x51\xa9\x36\xe1\xa8\x85\xf3\xbc\xcb\x66\x20\xbb\xb2\xb4\x6a\xf6\x23\x23\x18\x65\xed\x68\xcd\xe3\xbe\x09\xf9\x55\xa2\x4d\xe2\xe4\x18\x53\x4b\x66\xd3\x3f\xbe\xda\x0a\x8f\x7b\x12\x7c\x8b\xfd\x6b\x04\xdb\x25\xb8\xd4\x33\x06\x3d\x51\x29\x4c\xd7\x8b\x26\x49\x39\x57\x7b", 108, { 0x35, 0x50, 0xf9, 0xfe, 0xb2, 0x42, 0x8e, 0x9b, 0x20, 0x2d, 0x1f, 0xd7, 0x1b, 0x32, 0x8a, 0x93 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9d\x51\x0b\x8b\x82\xc9\xd6\x26\xb2\xa9\xb9\xf7\xf5\x19\x26\x13\x4a\x44\x33\xb1\xb1\x59\x7b\xf9\x93\xab\x92\xf5\xcf\xf8\x22\xa4\x63\xc7\xa7\x2d\xb2\xea\xc3\x31\x77\x23\x3e\x39\x47\xe3\x9e\x4e\xbc\x2e\x5f\xa8\x44\x9a\xd0\x7e\x84\x75\x8a\xfc\x6a\x06\x8d\x53\xce\xec\xf8\xea\xc4\xa4\x65\xb2\x80\x26\xdf\x97\xe6\xae\x81\x12\xae\x98\xac\xdb\x31\x64\xe4\xbc\xd2\xda\x47\x81\x0b\x47\xac\x0c\x13\xe5\x54\x85\x29\x58\x4f\xae\x80\x55\x6f\x54\xc7", 109, { 0x3a, 0xf8, 0x64, 0x70, 0xe9, 0x73, 0x58, 0x6b, 0x98, 0xb5, 0xdd, 0xbd, 0xfc, 0x56, 0x38, 0xc1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5d\xe1\xe1\x54\xa7\x6d\x0f\xec\x1c\x4a\xb7\x31\x7c\x9e\xc7\xa9\x9e\x92\x52\x67\xd4\x0f\xc2\x58\x6d\x17\x28\x2c\x54\xc2\xb4\xde\xd5\xd3\x40\xe2\x80\xf6\x06\xeb\x26\x98\x73\x56\x00\x63\x13\x36\xf0\x55\xab\xfc\xdf\x7c\x65\xc3\x45\x50\x26\x36\xc6\xac\xfc\x1f\xfa\x6b\xb3\x8c\x45\x9b\x86\xa0\xe5\x61\xf3\xf3\x0b\x69\xa7\xa7\x20\x07\x99\x08\x28\xef\x33\xdf\x44\x8d\xaa\x54\x51\x02\x6f\x7d\xae\xbc\xbd\x87\x1c\xb1\x53\x7f\xbe\x38\x3c\xbe\x3f\x84", 110, { 0x96, 0x3d, 0x85, 0x1f, 0xc8, 0xcf, 0x7e, 0x10, 0xe1, 0x2c, 0x33, 0xe0, 0x8a, 0x3b, 0x50, 0x98 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc9\xef\x12\xbd\xa1\xbe\xd5\xbd\xef\x1f\xcf\x64\xb9\x38\x98\x98\x51\xec\xd8\xdc\xe4\x05\x27\x8c\x2f\xfd\x14\xb2\x52\x69\x41\x89\xbd\x03\xac\x8c\x47\x52\x08\x39\x5d\xf8\x49\x67\x57\x98\x3f\x41\xe6\x62\x5a\xde\xaa\x3c\x8c\x7e\xe0\x8e\x4c\x64\x39\xaa\xb6\x4b\xc5\xd7\xcf\x86\x0e\xf9\xe7\xb7\x42\xde\x17\x2b\x87\x27\xea\xd1\x73\xd1\x18\xd5\x94\x5f\x6d\xde\x29\xa6\xc9\xe0\xf4\x34\x40\x9e\x27\x5e\x61\xc0\x7b\xe5\x94\x8c\x60\x44\x9d\x44\x4f\x99\x3d", 111, { 0x50, 0x81, 0x50, 0xba, 0x15, 0x74, 0xa5, 0xf8, 0x00, 0x23, 0x1f, 0xe5, 0xf0, 0x1a, 0xef, 0x6f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1c\x3b\x2d\xf7\xd7\x25\xa2\xf0\xfd\xcf\xb8\xf0\xbb\x88\xbc\x85\x57\x26\x8d\x46\x4e\x12\x4c\x35\x0b\x7d\xa0\x3e\x46\xb1\xa2\xdc\xf8\x82\x6c\xdb\xf6\xe3\x39\x38\x31\x95\x39\x24\x89\xf9\xf4\x27\x49\x07\x58\x62\x43\x57\x61\xed\x89\x5d\x63\x5e\xc5\xb2\xf7\x6b\x36\x8d\x80\xa7\x48\x50\x59\x68\xce\x3e\x9d\xca\xde\x4b\x92\xcc\x49\x0c\xb2\x97\xb5\xce\x58\xdf\x59\xc2\x04\x62\x55\x56\x4b\x8e\xac\x9e\x5e\x40\xdf\xf1\x34\xa6\x27\x91\x57\x45\x4e\x82\x48\x16", 112, { 0x24, 0xfa, 0x3a, 0xa0, 0x34, 0xeb, 0x16, 0x59, 0xd6, 0x98, 0xf1, 0x66, 0xad, 0xfb, 0xf7, 0x93 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2a\x7b\x90\xcc\xb7\xfa\x65\x31\xd0\x72\xf5\xae\x8a\xa0\x51\xe9\x2d\xfc\xf9\x89\xd0\x4a\x00\x15\x90\x4f\xdc\xfa\x6c\xa1\xcc\xab\xc0\x98\xe6\xe3\x5c\x61\xbc\x06\x41\x30\xaa\xa5\xf7\x95\xbf\x20\x8e\xe8\x46\x66\x2f\xdf\xf0\xd9\x5d\x3e\x9f\x4c\xce\xad\xd1\x2e\xe0\xa5\xa7\xc0\xba\x84\x91\x82\x00\xc1\x99\xac\x32\x39\x48\xd8\xa2\xa8\x38\xbd\x10\x33\x38\x15\xe3\x21\x15\xa0\x06\xaa\x0b\x42\x5d\xe8\xc8\x48\xe3\xea\x19\xc8\x62\xe8\x34\x26\xcd\x90\xa1\xb3\x3d", 113, { 0xa1, 0xc5, 0xd1, 0x2c, 0x14, 0xcf, 0xb3, 0xd5, 0x90, 0xa0, 0xe8, 0x8d, 0xef, 0x19, 0xa2, 0xdc }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7f\xc5\x6f\x87\xcb\x0c\xef\x76\xbd\xb2\x5a\xaa\x9c\x2f\x8d\x0c\xa4\x3d\x5f\xec\x16\x87\xfe\xba\x69\xef\x78\x5e\x9e\x7c\x56\x34\xb1\xdf\x63\xa7\x2b\xa0\x8a\x69\xd4\xea\xdd\x4c\x86\xef\xb2\xc0\x1d\xf9\xe8\xea\x8b\x0f\x47\x5d\x08\x40\x05\x77\x66\x8f\x65\x5a\x82\x7a\x7a\x86\xd7\x29\x0a\x10\x2c\x30\x8d\x81\x6e\x01\x55\x4e\x98\xf1\xc7\xef\xce\xe5\xc7\x9e\x8a\x99\x32\xad\xed\x8c\x85\x84\x37\x8c\x9b\x36\x52\xd9\x93\xc0\x89\xf9\xd0\xdd\x56\x18\x19\x89\x58\x19", 114, { 0x65, 0x16, 0xd9, 0xfd, 0x97, 0x36, 0x97, 0x2c, 0x1d, 0x90, 0xe6, 0xb9, 0x11, 0x75, 0x7e, 0xd1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe1\x10\x63\x3d\xa2\xd1\xb2\x6e\x62\x94\x37\x29\x58\x85\x13\x06\xa7\xcd\x21\xe6\x49\xcc\xad\xb8\x07\xf4\x43\xe7\xa4\x45\xa1\x64\x1a\x61\xce\x4b\xfc\x4b\x44\x35\xfa\xc0\x48\x19\x83\x32\x5b\xdf\x85\x5d\xc8\x83\x50\x88\x5e\xe2\x98\x5a\x38\x25\x99\x57\xb8\xc7\x55\xf5\x92\x44\xf9\x5f\x04\x5f\x5e\xc5\x24\x10\xab\x5e\x51\x09\x17\xfb\xcb\xe4\xcc\x49\x5f\xeb\xe7\xa3\x3b\x83\x9c\x92\xe0\x35\x77\xe2\x34\x5a\xbd\x62\xb7\x63\xf1\x37\xce\xc3\x72\xdd\x3b\x79\x41\xbc\xae", 115, { 0xdd, 0xa6, 0xd8, 0x85, 0x1a, 0x69, 0x15, 0x50, 0xbb, 0x0b, 0x98, 0x6a, 0x04, 0x95, 0x94, 0x7b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3d\xe1\x62\x74\x46\x57\x63\x4e\xb6\x51\xca\x5d\xa3\x63\x3b\x38\xc3\x6c\xa7\x20\xb3\x17\xaa\x4b\xe4\x7d\x84\x5c\x23\xe8\xb2\xf4\xc3\xb3\x28\x62\x68\x4d\x2e\x76\x73\x5c\xd4\x73\x05\xfe\x13\x22\xb2\x2a\x82\x03\xc4\x35\xb1\x9f\x29\x71\x26\xf9\xfa\xf0\xf2\x22\xa8\x66\xee\xec\xc5\x2c\x97\xb6\x6d\x61\x83\x67\x4f\x2b\x80\x76\x5b\x1b\x48\x25\x0a\xaf\xe2\xcd\x45\xf0\x97\x55\xf3\x3c\x8f\xbc\x22\x1e\x09\xd6\xd1\x59\x34\x14\x57\x04\xac\x7b\x74\xcf\x94\xb7\xf3\x63\x4c\x49", 116, { 0xc8, 0x45, 0x92, 0xb3, 0xa3, 0xee, 0xed, 0x4c, 0x7d, 0xad, 0x54, 0x75, 0xbd, 0x5e, 0xc8, 0x88 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\xe8\xcf\xdb\xec\xa0\xac\xb4\x01\xb0\x9f\x46\x64\xff\xcc\xe5\xff\x37\x97\x92\xe7\xe9\x22\xf6\x69\xcd\x64\x6a\xac\x27\xe3\x33\x03\x44\x0e\xcb\xd2\x23\x39\x5a\x19\x31\x35\x44\xa2\x2d\x8b\xdb\xc3\x2b\x55\x35\xd1\xb4\xba\x19\x21\x0a\x04\x13\xbc\x89\x60\xa7\x9e\x28\x31\xa2\xab\x1f\x10\x8c\x2f\xa3\x65\x39\x10\xcd\x9b\x7e\x93\x99\x03\x01\xc7\x09\x47\x2a\x92\x69\x88\x36\x56\xae\x17\x6a\x3f\xf8\xcd\x64\x2b\x37\x08\x8c\x37\xe9\x42\xaa\xe2\x01\x4f\x92\xe1\xe3\x33\xfa\x7f", 117, { 0xce, 0x59, 0x2a, 0x66, 0xbd, 0x8e, 0xcc, 0x02, 0x56, 0xa9, 0xb2, 0x02, 0x08, 0x00, 0x60, 0xf2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8c\x9d\x6c\xad\xcf\x04\x56\xad\xba\x5d\x3f\x57\x17\x76\x14\x07\x0e\xf2\xa1\x24\xe8\xe1\x1b\x4d\xee\xfb\xd9\x21\x70\x7a\x23\xab\xe1\x91\x23\x69\x20\x8c\xf9\xf8\xd2\x85\xea\x5d\xea\xc0\xb8\xf2\x4a\xa4\x0c\xeb\x83\x57\x10\x84\xb9\xf4\x19\xc9\xa2\x6c\x82\x01\xad\xf6\x94\xb8\x3f\x34\xa1\x68\x18\xe4\x30\xc3\xd4\x3f\x52\xa0\x8e\xf2\x13\x7f\x9f\xb6\x0c\xba\x84\x8e\x15\x4b\xdd\x9c\x19\x34\x92\xa1\x02\x8f\x10\x10\xd2\x32\xb1\xcd\xd3\xfe\x3a\x87\xe7\xc5\x7e\xae\xf9\xd5\x1f\x13", 118, { 0x21, 0xc8, 0x1d, 0xc6, 0x45, 0xbe, 0xfc, 0x87, 0x21, 0x04, 0xc5, 0xc2, 0x14, 0x3b, 0x40, 0x91 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x94\x25\x74\x1c\x92\x1b\x86\xa0\xec\xf8\x35\x65\xb1\xe1\x78\x33\x12\x8b\xc2\x94\x9a\x81\x7f\x2b\x7a\x15\xbd\xaf\x02\xe1\xe8\x82\x2c\xf9\xae\xf2\x53\xaf\x01\x0b\x01\x01\x3b\x16\xe5\xa3\x5b\xb3\xe3\xa5\x6d\x8e\x46\xc2\x08\xc1\x11\x44\xf1\xc6\x73\x96\xdd\x17\x58\x68\x54\x64\x1c\x79\xb1\x70\x5a\x04\x46\x89\xe3\xc9\x9c\xa2\xcb\xb6\xd8\x0e\x9d\x32\x39\xdb\xae\x07\xbd\xc9\x8f\xe9\xe3\xe6\x9c\xa7\x8c\xc7\xb1\xed\xfb\x65\xfc\xb3\xfb\x91\xee\x46\x20\x15\x4b\xf1\x25\x69\x62\x48\x74", 119, { 0xc1, 0x1f, 0x44, 0xbf, 0x5d, 0x95, 0xee, 0x5f, 0x2e, 0x4f, 0xef, 0x28, 0x62, 0xf6, 0xe7, 0x5c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0f\x56\x10\xc5\x8c\x9a\xce\xde\x03\x7b\xeb\x78\x6f\xd7\x81\x42\x7c\xeb\xc4\xff\x03\x4a\x0f\xca\x20\xea\x8a\x7a\xf2\x59\x76\x20\xef\x0d\x15\xad\xe1\xd8\x39\xb1\x81\x7a\x67\x3e\xae\x50\xa6\xeb\x4a\x2b\xea\xf4\xb2\x3c\x18\x7f\xd8\x2b\xb6\xf9\xfe\x46\x31\x9f\x10\xd6\xc9\x19\x9f\x8e\x1d\x40\x76\x1d\x4e\x00\xdb\xe3\xd3\x59\x63\xbf\xd9\x7f\x72\x07\x55\x22\x4f\x91\xa7\xc8\xe0\xee\xec\x55\x06\xb7\xe0\xad\x97\xff\x6e\x70\xf4\xe8\xd7\xe4\x47\x51\x7a\xf1\x5c\xad\x45\x45\x18\xef\xb9\x98", 120, { 0xf6, 0x28, 0x50, 0x22, 0xdd, 0x55, 0xfc, 0xba, 0xb4, 0x4c, 0xc4, 0x1f, 0xa7, 0x92, 0x8a, 0x03 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9a\xa1\x93\x09\xec\x14\x1c\xa7\x65\xb2\x0f\x0d\x9f\x6f\x22\x25\x11\x5e\x33\x0d\x48\x60\x10\x16\xc7\xf7\xe3\xe9\x77\x38\x38\xc4\xcc\xdf\xad\xe2\x77\x7c\x35\xf9\xc1\xcc\x08\xdd\x8b\x23\x2b\x42\xdf\x04\x97\x9e\x32\xd3\x09\x2d\x38\xa1\x65\x0e\x64\x27\xc8\x8b\xfb\xcf\x29\x76\xd4\xeb\xaa\xae\xae\x08\x81\xc1\x2e\x5d\x7d\xab\x73\x5e\x38\xbd\x58\x6e\xd8\x99\x45\xb1\x81\x5a\xb2\xff\x5b\xd0\x3a\xf4\x3b\xe8\x57\x24\xf0\x2b\xc0\x6c\x2d\x5d\x5c\x64\x0e\x45\xe1\xf0\x48\x8d\x0e\xf6\xf2\xbf\x81", 121, { 0xec, 0x78, 0x08, 0x73, 0x5a, 0xc1, 0xb9, 0x65, 0xd2, 0xa0, 0x7c, 0x7c, 0xfb, 0x45, 0x7b, 0xb2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x29\xea\x6f\x36\x04\xe5\x78\x9c\xd3\x17\x5e\x55\xeb\x7b\xd3\x8b\xfa\xbf\x55\xea\x79\xd0\xf4\x3d\x3e\xfd\x31\xa8\x2d\xca\x02\x7f\x0f\x54\xf3\xc2\x7b\x5c\x66\x37\xf0\xf1\xfb\x22\x05\xbe\x0b\xa2\xb7\xee\x4d\xab\xe2\xb7\x9b\x9b\xcb\x8a\xcf\x7b\xda\xd5\xc7\xd5\x65\x73\x89\x2d\xa6\xb2\x7f\x1d\xcf\xfe\xe3\x10\x34\x2e\x36\x9b\xa7\x6b\xe9\x73\xe2\xb9\x1f\x0f\x1c\x23\x8a\xdb\xbe\x87\x72\x15\x2f\xfb\xd4\x48\xcc\xdb\xa7\x63\xf3\x71\x3a\x76\x3e\x3f\xb9\x08\xce\xeb\xce\x17\xbd\xc8\x63\xad\xb5\xfd", 122, { 0x41, 0x22, 0x16, 0xa5, 0xec, 0x77, 0xcc, 0x6c, 0x26, 0x63, 0x46, 0xa1, 0xf4, 0xe3, 0x94, 0x6e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x86\x1b\x9f\x54\x66\xd5\x73\xa1\x7a\xe9\x2e\xcc\xc1\x1d\xe2\x7e\x24\xa5\xe7\x64\xf7\x7e\x2f\x23\x9e\x6a\xb7\xd8\x4c\x88\x1a\x4a\xe7\x8f\x40\xaf\x08\xa7\x33\x17\x1e\xe4\x12\x79\xb1\x60\x1e\x59\xc4\xf3\xf1\x12\x55\x91\xcf\xc5\xfe\x41\x15\xde\xbd\xb6\xce\x40\xd1\x8c\x65\x0d\xbb\x20\x74\x13\x64\x0c\xbb\xd6\x5d\x3e\x2c\x36\x40\xb3\x22\xbd\x36\xd5\xb2\x87\x93\x6f\x1a\xce\x9b\x49\x57\x12\x68\x65\xd2\xe1\xe3\xd4\x3a\x48\xef\x35\x6d\xd6\xa6\xcb\x8f\x49\xbb\x3a\x3d\xd8\xff\xde\xdc\x1c\xff\xc9\x0b", 123, { 0x09, 0xff, 0x3e, 0x2d, 0x99, 0x55, 0xc5, 0x1e, 0x17, 0xcc, 0xc1, 0xdd, 0x07, 0x11, 0x8a, 0x62 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9c\xca\x57\x37\xf3\xd0\x6e\x4c\xa0\xe5\x57\x89\x6a\x65\x34\x6c\x6e\x72\x1d\xcd\xc7\x59\xdb\x07\xd8\x13\x40\x50\x39\xe7\x21\x2a\x3b\x2d\xf2\xf2\x1a\x2d\xfc\x96\xbe\x25\x3d\x64\x2e\x69\xdc\xfd\x92\xa5\x47\x68\xe2\x3e\xeb\x43\x31\xd7\x8f\x14\x90\xf0\x4e\xbd\xa0\xa8\x2f\x0e\xb8\xa3\x62\x75\xae\x06\x1a\xd0\x46\x9f\x01\x63\x35\x22\x5d\xe5\xd0\x8e\xbd\xb5\x56\xaf\x5f\x2a\xd6\xbc\x22\x07\xbf\x20\x22\x0d\x02\x56\xf5\xab\xe6\xed\x81\xd1\x68\xab\x78\xe2\x4c\xce\x72\xc8\xc4\x6d\xa5\x21\xbc\xfe\x43\x97", 124, { 0xe3, 0xc6, 0x50, 0x53, 0x82, 0x8e, 0xf8, 0xd1, 0x42, 0x08, 0xdc, 0xf3, 0x3b, 0x60, 0x8d, 0xc7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\xf1\x71\x4d\x8b\x79\xdf\x75\x2d\x6a\x08\xfe\xd7\x3d\x08\x6b\x46\x31\x15\xbf\xca\x8c\x9b\x94\xf2\x00\xf8\x4c\xd6\x28\xd1\x5e\x01\x31\x0f\xd2\xf9\x96\x7a\xc8\x6b\x03\xf0\x31\xf8\x5b\x41\xa1\x96\xd5\xaa\x3d\xa4\x41\xed\xcf\x8f\x69\x09\xf8\x1a\x92\x9b\x85\x4d\x22\xd1\xda\xfc\x5b\x07\x8a\xf2\x45\x00\x09\xbb\xaa\xc2\x79\x0b\x3b\x0e\xa0\xce\xd0\x7a\xfb\xcd\xcd\x2d\xeb\xfa\xa0\x37\x0e\x58\x66\x8a\xa9\x89\xad\x99\x41\xf5\x54\x8c\x49\x94\x8f\x1d\xf5\x59\x07\x12\x2d\x3c\x1e\x57\x9d\xe2\x50\xb7\xe9\xea", 125, { 0x8e, 0xb8, 0x75, 0x22, 0x66, 0x98, 0xd0, 0x80, 0x2d, 0xcc, 0x7a, 0x6e, 0x92, 0x96, 0x2e, 0xe8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb5\x37\xfe\xd6\xa3\x0f\x84\x94\x70\x46\x6f\xa9\x55\xe9\xb5\xf9\x6e\xe7\x1a\x35\xdd\x8c\x26\xe1\x0f\x98\x38\x00\x16\xfc\xb5\x5f\x36\x30\x59\x7c\x7b\x33\xad\x11\x87\x20\x99\x40\x6a\x6a\x11\x5c\xaa\xb4\xeb\x51\x62\x50\xd1\xb2\x86\x51\x52\x5d\x44\x4e\x13\xcd\x86\xb6\x22\xfc\x94\xcb\x6b\xf3\xd7\x3d\x43\xef\xb8\x64\x22\x32\xa7\x18\x6e\x63\x38\x30\x72\xa2\x67\x96\x6d\x2c\xfc\x04\xc7\xa8\x0a\x5d\x5e\x0c\x91\xaa\xff\x2f\x43\xaf\xf1\xeb\x64\x29\xab\xee\xca\xa7\xa5\x1e\x04\x02\x4b\xa6\x97\x7b\x0e\xa2\x63\x6f", 126, { 0x97, 0xa7, 0x1a, 0x12, 0xd4, 0x55, 0xc2, 0x52, 0x09, 0xa9, 0x14, 0xbd, 0x78, 0x17, 0xf5, 0xd7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x95\x63\x25\xb9\x12\x5f\x16\xa4\xaf\xb8\xb0\x8b\x26\x67\x90\x10\x70\x05\x76\xf5\x95\x36\x6a\x9a\xa2\xb2\xfa\x13\xb9\xf1\x9e\xe5\x42\x73\x3c\x5e\x3f\xa9\xc6\x8e\xbe\x83\x01\xe5\x67\x97\x61\x6b\x35\xea\x11\x96\x42\x5f\x0e\xcb\xba\xba\x73\x74\xf2\x4f\xcf\xba\x91\x4b\xb2\xdf\xec\x9e\x47\x3b\x70\x84\x1b\xd2\x38\xaf\xfc\x8e\xbf\x13\xfc\x1d\xaf\x4d\x95\x69\xd8\xb1\xe6\xb0\x3c\xee\x1c\x41\x47\x60\xec\xd2\x1c\xf2\x3c\x80\x0a\xae\xe1\x63\x1d\xe3\x83\xcd\xd1\xf2\x9d\x20\xe2\xb5\xa1\x49\x3e\x8b\x38\xdd\x1c\x04\xa7", 127, { 0x94, 0x7d, 0x6b, 0x70, 0x52, 0xe6, 0x4a, 0xbd, 0xc1, 0x5b, 0xbc, 0x11, 0x26, 0x8c, 0x48, 0xb3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xce\x26\x26\x4d\xca\xd2\x5a\x49\x30\xcf\xf6\x38\xaf\x9a\x68\x1c\x7d\x2f\xfb\x58\x31\xdd\x49\xd7\x3e\x32\x3e\x4d\x0d\x16\xc4\x96\xb6\xf4\x10\x3a\x5a\x13\x89\x12\x1f\x03\x50\x04\xc9\x32\x70\xe9\xf2\x9e\xa4\x90\xe6\xa5\xbf\xdc\x1d\xf8\xbc\x08\x55\xae\x62\x0b\x4c\x75\x93\x16\x17\xe3\x32\x3b\x22\xea\xaf\x27\xc5\x6a\x31\x10\x7f\xe1\x5f\xaa\xd1\x3d\xca\x52\xb9\xd2\xfa\x4e\xc9\x67\x13\x2c\xe4\x6b\x23\x46\x95\x45\x0b\x67\x0c\xc9\x08\x88\xb6\xc6\xde\xb3\x78\xbc\xa0\x09\x87\xab\x1e\xdf\xe7\x06\xeb\x02\x7d\xc7\x09\x1b", 128, { 0x14, 0x39, 0x8a, 0x7a, 0x34, 0x95, 0xeb, 0x11, 0x5f, 0xf6, 0x04, 0x23, 0x14, 0xa9, 0xb1, 0x51 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x9c\x34\x2e\x69\x3f\xc8\x3c\xb2\xe3\x4f\x09\xb2\xca\xab\xf8\x31\xf3\xdc\x12\x9c\xf1\x6f\x25\x79\xd7\x84\x09\x85\x50\x7a\xfe\x6d\xcb\x39\x31\x25\xd3\x1b\x5d\xe7\x7c\x78\x8e\xcb\xf9\xcc\x02\xff\x4b\x87\x28\xa4\x14\x72\xca\x46\x8a\xb9\x46\xf5\x87\x99\xf7\x04\xbc\xa6\xb4\x5e\x06\xb9\x6e\x80\xd9\x76\xfd\x16\xd8\x76\xf4\x36\x87\x15\xb0\x33\x18\xd9\x70\x1f\x61\x7d\x9e\xe1\xef\x9a\x2c\xee\x34\xf1\x1a\xa7\xdb\x57\x14\x4f\x3c\x3d\x37\xa8\xeb\xdb\xf4\x29\x6b\xf9\x0d\xdd\x00\x5a\xbd\xda\xa2\xc5\xf4\x5d\x0e\xb1\xc0\x7f", 129, { 0xa6, 0x03, 0x6e, 0x71, 0xb9, 0x65, 0xc3, 0x1c, 0xaa, 0x8e, 0x3b, 0xc0, 0xab, 0x74, 0x07, 0xf0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf6\x8c\xc7\x96\x58\xa8\xf1\x2b\xec\xc3\x22\x93\xb6\x31\x25\x2c\xbc\xa8\xa4\x36\xd2\xa8\x53\x4b\x91\x85\x2d\x7c\x66\x12\xd7\x0a\xc6\xec\x20\xbe\x7f\x60\xaa\xe5\x2a\xfa\xa2\xec\xbd\xab\xaa\x93\x3d\x95\xd9\xd1\x90\x77\xd8\x45\x70\xb0\x2d\x54\x7c\xf1\x94\xe3\x68\x84\x89\xb2\x55\x33\xe3\x53\x3c\xd6\x9a\xc7\x83\x7d\xa9\xb4\xb2\x36\x0f\x44\x3f\x7b\xef\x9c\x85\x3b\xd7\xf7\xd3\x83\x1d\x5f\xa1\xc9\x65\x08\xde\xd5\x40\x49\x65\x4c\xef\x37\x8d\xdb\x45\xe0\xdf\xfc\xaa\x21\xe3\x68\x3b\x25\x13\x19\x0f\x7a\xf1\xfb\x95\xd1\x34\x2f", 130, { 0x93, 0xfb, 0xf2, 0x73, 0x89, 0x24, 0x2e, 0x2d, 0xf7, 0xf6, 0x94, 0x0b, 0xfe, 0x0f, 0xfc, 0x89 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x19\x52\x1e\xfa\x65\x9a\xe9\x50\x84\x52\x5f\xf9\xa2\x6d\x89\x5e\x0f\xfd\x7f\xf3\x62\xb3\x5e\x40\xba\xf1\x58\x8d\x20\x8e\xe6\x29\x08\x25\x18\x57\xf7\x1a\x0c\xd6\x3e\x2b\x7d\x0c\xe4\xae\x73\xce\xa2\x6d\x18\xce\x07\x1a\xab\xa2\xbc\x70\x8d\x6d\xe2\xe9\x79\x2c\x97\x16\xd1\x9f\x98\x9e\x13\xd1\x00\xd5\x6a\x46\x2f\xf8\x61\xc1\xc6\x03\xb2\xaf\xce\x2f\x3d\x33\xf8\x0b\x14\xcf\xff\x36\xb3\xab\x2a\xb7\x4d\x86\xed\xf9\x41\x36\xaf\x66\xac\xdd\xa7\x9e\x18\xaa\xdf\x54\x51\x49\x5b\xc5\x58\xe9\x53\xd6\x71\xe7\x9b\xca\x57\x1c\x23\x9d\x90", 131, { 0xf0, 0x21, 0xdf, 0x96, 0x22, 0x89, 0xf7, 0xca, 0x7b, 0x3d, 0x32, 0xbe, 0xc3, 0x70, 0x87, 0x87 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\x9b\xff\xdb\xf9\x2f\xf0\xc5\x04\x70\xf4\x5a\xfe\x52\xf4\xf9\x50\x52\xb1\x41\xb5\xb0\xe5\x27\xea\xda\xf8\x2a\xf1\xe9\x5c\x9d\x01\x44\x85\x23\x0d\x62\x88\x3a\xef\xae\x4f\xed\x31\x83\x77\xad\x78\x56\xc6\x3b\x8e\xf3\x4c\xbc\x0a\xe0\x15\xee\x9e\xde\x87\x7a\xfd\x8d\x5f\x5f\x67\x2f\x42\x8e\xd2\x85\x03\x95\xb7\xd5\x70\x73\x76\x0d\xd9\x8a\x66\x02\x1e\xb2\x7d\xd1\x74\x69\x99\x66\xb4\x29\x69\x1b\x5f\xd2\xfa\x78\x32\x47\xe2\x19\x62\x15\x03\xad\x75\x4c\xfc\x1a\xbd\x72\x32\xbe\x71\x8d\x76\xd1\x69\x5f\x53\xe6\x76\xaf\xf7\x90\x5b\xc1", 132, { 0x6e, 0x38, 0x9a, 0xae, 0x82, 0xdf, 0x52, 0xff, 0xe8, 0xed, 0xfc, 0x75, 0xe6, 0x9a, 0xdc, 0x14 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbc\x21\x6c\xe7\x51\x8e\xc2\x30\x89\x6e\x19\x3f\xc0\x21\x46\x38\xe6\x0e\x57\xd3\x29\x04\x49\x92\x43\xc2\x60\x0f\x5d\x92\x27\x6f\x9e\x0f\x04\xf3\x55\x08\x77\xad\xbf\x7d\xef\x4f\x75\xc6\x49\x1e\x75\xd3\xe6\x06\xcb\x8e\x67\xc8\xdb\x5d\x08\x4f\x4e\xc3\x96\x20\x97\x26\x0e\xee\x21\xab\xd4\x4d\x17\x3d\x8c\x7f\xcf\xad\x99\x6b\xd4\xf4\x30\xab\x8e\x93\x18\xc4\x90\x1b\x00\x71\x7e\xc9\x7c\x18\x99\x49\x9e\x5e\xe9\x9b\x2d\xd6\x06\x13\x85\xd4\x82\x7a\x0a\x60\xf6\x53\x4a\x46\xa8\x38\xaf\x4b\xd6\x62\xdd\x7a\xa1\x46\xae\x9c\x99\x5d\xc7\xc5\xe1", 133, { 0xc4, 0xd1, 0x37, 0xe5, 0xf5, 0x29, 0xa4, 0xa2, 0xf0, 0xf2, 0x27, 0x54, 0x17, 0x1f, 0x12, 0x2c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfd\xd7\x0b\xff\x63\x6c\x52\x42\xd2\x71\x43\xd0\xd4\x48\x5b\x4b\x9f\x80\x1f\x20\x93\x33\x6e\x6c\xe0\xff\xee\x8a\x45\x9f\xa8\x3d\xf3\x25\xb0\x77\x90\xd6\xfd\xc4\x57\xa2\x57\x56\x5c\x3e\x6e\xad\xed\xe0\x06\xe3\x14\x96\x50\x91\x3a\x44\x55\x62\xe6\x38\x8b\x32\xa2\x6c\x8a\xe2\xfe\x57\xd8\xbb\xae\x70\xe0\x7c\xce\x40\x02\x01\x46\x22\xc4\x92\x49\x9a\x25\xc6\xf7\x50\x12\x12\x23\xa8\xf2\xf3\x2e\xfe\x5c\xb3\x12\x83\xe8\xda\x7b\xaf\x23\x35\x0f\x62\x9c\x7c\xcf\x9b\x1b\xa2\x95\xd3\xf1\xbe\xbd\xf7\x6b\x91\xe1\x01\x60\xb3\xbc\x32\xea\x5f\x30\xee", 134, { 0xec, 0x22, 0x50, 0xb3, 0x22, 0x24, 0x26, 0x6d, 0x36, 0xda, 0xd2, 0xa4, 0xc6, 0xc7, 0xd1, 0x20 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x31\xd7\x62\x33\x63\x75\x03\xb7\xc0\x50\xaa\x9e\xd1\x87\x5d\xd5\xb8\x2d\x2f\x0e\xa3\xd1\x03\x58\x5a\xa8\x6e\x5a\xf8\x5a\xbb\x2b\xb7\x66\x08\xd1\xe4\x32\x8d\x55\xf1\xb3\xfd\x7f\xa9\xb5\x04\x34\x7e\xc7\xf1\x68\xfe\xc7\x6e\xc1\x64\x05\x6a\xca\x4b\x17\x17\xd0\x7e\x39\x0f\x5d\xea\x5e\x92\x4e\xb5\xd7\xea\x93\x67\x9f\xef\x83\x46\x41\xa7\xda\xc1\x66\x05\x50\x02\xff\xd2\xd6\xa6\x0b\xa9\x70\x89\x05\x1c\xaa\xba\xee\xf5\xb8\x8e\xf2\x96\x2e\xd0\xba\x82\x58\x16\x4d\xf4\x37\x2f\xa3\xad\x19\xb8\xc8\xcc\xd3\xce\xa9\xd5\x9e\xdd\x7f\xd4\x8c\x97\xd5\x9a", 135, { 0x24, 0x9d, 0xa1, 0xd8, 0x65, 0x77, 0x2f, 0x84, 0x7f, 0x6b, 0x6a, 0xc7, 0xec, 0x38, 0x7c, 0x68 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa5\x01\x37\x26\xa2\xa7\x79\x20\x45\xf0\xa1\x7e\x53\x8c\x72\x49\x2f\x09\x96\x7a\x15\x85\x67\xfe\xef\x7e\x5a\xd9\xd7\xc5\x08\x66\x2a\x91\xda\xbd\x45\xb0\x51\x2d\xdf\xd9\xf0\xe8\x03\x1c\xc6\xbe\xa8\x7a\x9c\x02\xef\x91\xb7\x89\xf8\x70\x4a\xd0\x60\x89\x7b\x3d\x5b\xc4\x10\x7e\x6b\xb0\xb6\x0e\xbb\xd4\xee\xd6\x1a\x24\x94\xf0\x97\x8f\x0d\x86\xb5\xb5\x0d\xd9\x4b\xb6\x03\x5e\xfb\x26\x21\x02\x4c\x1c\x0b\x8f\x67\x6a\x1b\x27\x6b\xe6\x4f\xec\x6d\xe7\xd0\xc2\x0f\xcc\x1f\x2c\xbb\xb6\xde\x53\x7d\x55\x39\x25\x7b\xe0\xef\x9a\x11\x1e\x01\x12\x8d\xa2\xf5\xdb", 136, { 0x77, 0xfc, 0x95, 0x17, 0xdd, 0xeb, 0xc5, 0xa5, 0x2f, 0x8d, 0x90, 0xd8, 0xd1, 0x38, 0x80, 0x09 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x84\x14\xc7\xce\xcf\xa9\x6d\x18\x26\xb4\x06\x16\x56\x56\x9e\x5a\x22\x51\xa0\xcb\xb4\xfb\xd9\xe9\xbe\x4e\x25\x2d\x32\x1c\xb8\x8e\x9a\x60\x0b\x20\x14\xaf\x60\xd7\xee\xcd\xf4\x6a\xda\x5b\xc1\x53\xce\xae\xed\xf2\x7b\xbc\xd2\xd1\x67\x30\xab\x03\xa9\x9d\xd7\xa5\x41\xce\xcd\x86\x11\x3b\x9d\xe3\x7c\x99\x1f\x4b\x9a\x89\xba\xa1\x15\x70\xd2\x40\xa3\x66\xcf\x39\x20\x47\xc7\xb7\x46\xe8\xc7\x84\x0c\x64\xc3\xa4\x99\x94\x17\x1f\xe4\x9c\xb9\xdd\xea\xa2\xfe\xa9\x8a\x9a\x05\x58\x00\x3d\xc4\x03\xfc\x18\xad\x6f\x5e\xc1\xfc\x8e\x91\x24\xa0\x1e\x81\xfb\xc3\x70\x3a", 137, { 0xd2, 0x39, 0x29, 0x3a, 0xe7, 0x3c, 0xc8, 0x48, 0x93, 0x9d, 0x84, 0x3d, 0x11, 0x7c, 0xd9, 0x72 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5c\xf8\x43\x1f\x6c\x00\xcf\xc3\x31\x39\xdd\x67\x86\xa4\x13\x11\x27\x91\x4e\x45\xec\xe9\x28\x62\x13\x18\x99\x9c\xb6\x95\xb9\x92\x5b\x0f\xa3\x8c\xaa\x36\x76\x52\x39\x23\x75\xab\x83\x64\x4e\x71\xf8\xa8\x78\x4d\x2e\x03\xb5\x15\x35\xdf\xb7\xbf\x08\x80\xdf\x00\x1e\x32\x20\x85\x20\x11\x02\xcd\xb6\x75\xc3\xa1\x7b\xf8\x98\x31\x0f\x25\x11\xcd\x4a\xbe\x9a\x3c\x8d\xaa\x1d\xbd\x35\x79\xc5\x97\x29\x96\xde\x5f\x93\x08\xd8\xc6\xac\xe4\x6a\x1c\xaf\x53\xd4\x65\xef\x3c\x3c\x16\x04\x8d\x3a\x6d\x21\x2b\x6f\x6a\x81\x74\x50\x6d\x00\x6d\x01\x6d\xc6\x8d\x5c\xd2\x1e\x25", 138, { 0x0e, 0xfb, 0x6c, 0xcd, 0xb4, 0x7f, 0xb9, 0xa7, 0x2b, 0xcc, 0x94, 0x5f, 0x1f, 0x1c, 0x9b, 0x52 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x10\xf0\x65\x6a\xe6\x21\x1d\x21\x1f\x7e\x21\xe5\xfa\x3a\xf3\x18\x52\x9b\x31\x64\x63\x95\x27\xed\xad\x04\x7d\x15\xf1\x85\x11\xeb\x58\xf2\xe0\x31\xb3\x79\x1d\x08\xdd\x59\x64\x3a\x3d\x38\x08\x24\x68\x23\x88\x3e\xe3\x22\x21\x48\x06\x77\x7d\x13\xfb\x73\x89\xea\xe6\xf6\x64\x9b\x1f\x81\x73\x25\x9a\xf9\x91\xff\x68\xfb\x64\x03\x56\xd6\xcb\xf6\xb3\x29\x73\xb4\x30\x1a\x89\xfc\xdf\x30\x89\xd6\x5e\xce\x35\x9d\x0d\x4d\xa2\xad\x7a\xb5\x6c\xa9\xde\x17\x0a\x69\xc1\x89\x3c\x7f\xb8\xbf\xa1\x65\x4f\x42\x65\x44\x01\x50\x17\x63\x64\x51\x98\x2a\x62\xf1\x2f\xd2\xa1\xde\xba", 139, { 0x7c, 0xea, 0xd6, 0xf2, 0x79, 0xc5, 0xbc, 0xa4, 0x89, 0x86, 0xfc, 0x29, 0x94, 0x1c, 0x8b, 0xee }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xac\x04\x20\xff\x0a\x4b\x0f\x21\xce\xd6\xf6\x2e\x8d\x87\x43\xd5\x5f\xc4\x67\x35\x45\x9c\x50\xd0\x38\x01\x80\x9e\xca\x33\xca\x3e\x7b\x3e\xa9\x48\x9b\x99\x3d\xbd\xd6\xf0\xe3\xa0\x61\xfc\x6f\x9e\xc0\x8d\x09\xe8\x31\xa9\xa1\x21\xb8\xcf\x10\x73\xc8\x54\xcd\xbc\x8b\xef\x48\xe6\xce\x50\xe6\x55\x8c\xea\x9a\x79\x16\xd2\x1c\x83\xdc\xbf\xc9\x34\xda\x31\x17\xd0\xa1\xaf\xb3\x32\x00\x29\x39\xf9\x50\x7b\x8f\xe0\x59\x12\xdf\x2c\xe4\xa9\x2f\x3e\xde\x2d\x9e\x48\x26\xbf\x3d\x1c\xf4\xd7\x87\x20\xe5\x86\x7f\x5e\xa7\xd4\x65\xb8\x3d\x47\x14\x38\xef\x85\xfb\x86\xd2\x11\xb5\x73", 140, { 0x2d, 0xe4, 0xcd, 0x76, 0x59, 0x59, 0x50, 0x08, 0xc3, 0xaf, 0xda, 0xd6, 0x68, 0x92, 0x96, 0xd3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xef\x31\x48\xb1\x13\xf0\xf7\xa5\x33\x40\xc4\x55\x79\x37\x86\x7c\xef\x7a\xa2\xbd\xc7\xb7\x69\xf4\x44\x4c\x0e\xa7\x49\x05\x42\x9b\x7c\x02\x6e\x83\x17\xb7\x8c\xd4\x4b\x0e\xa3\xb4\x50\xa7\xdd\x10\x0e\x3f\x46\xcc\x61\x2e\x23\x16\x0d\x0a\xed\xd4\x3e\x6a\xe9\x3b\xba\xc5\x65\x81\xa5\x78\x91\xaa\xf0\xe6\xf7\x7f\x60\xb9\x98\x9e\x36\x47\xa5\xaa\x80\x11\xd6\xa2\xfc\x65\x6b\x4f\xa4\x23\xbd\xd7\xdb\x9c\x80\x70\x32\x96\x98\x2e\xd7\x6c\x94\xfc\x9a\x52\xcb\xa9\x9d\xb7\x12\x1a\x98\xc3\x17\x9e\xc7\xff\x5d\x5f\x70\x14\xd4\xf3\x14\xac\x14\x12\x32\x75\x36\x62\xb2\x44\x4f\x6f\xf5", 141, { 0x5c, 0xf1, 0xaa, 0x0f, 0x1a, 0x4b, 0xef, 0x0b, 0x9d, 0x3e, 0xba, 0x20, 0x09, 0xb6, 0xbe, 0x59 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x56\x8a\xb6\x76\xb1\xe1\xe0\x1d\xa9\x78\x0c\x20\x7e\x96\x45\x96\x23\x40\x13\x9a\x19\x74\x2d\x18\x7a\xff\x4c\x37\x12\xfb\x1a\x63\xa8\xe9\x49\xf6\x5a\x66\xc1\x82\x26\x8d\xf1\xbd\x85\xea\x47\x0a\x31\x16\xba\xa0\x08\xf4\x84\x59\x09\x86\xee\x19\x7b\x6d\x43\xd9\x2c\xfb\xe6\x4f\xd7\xf6\x80\x3c\x9f\xec\x51\x51\xb8\x2e\xa8\xbf\x25\x6a\x6e\x5a\x9b\xe9\xdc\x69\x85\x61\x4c\x0c\x21\x78\x2d\x4a\xc7\xd6\x11\xb7\x4a\xe5\xe1\xbe\x77\x28\x30\x91\xba\x35\xac\xaa\xe1\x50\xb1\xfc\xf8\xa6\xf7\xbb\x52\x23\x6c\xc5\xa9\xf0\x1d\xab\x5d\x8c\x4d\x60\xd8\x86\xa8\x7d\x13\xd4\x91\x2f\x31\xd4", 142, { 0xcb, 0x47, 0xda, 0xb2, 0x8e, 0x25, 0x2b, 0x75, 0xc9, 0x37, 0x45, 0x95, 0x31, 0x20, 0x1f, 0x6c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x98\xbe\x49\xdc\x07\xba\x41\x7f\x9b\xc4\xd5\x5f\x50\xf6\xb7\xaa\x56\xf0\xd1\x33\x1f\x80\xa6\x2d\x9a\xed\xd6\x86\x7a\xe0\xc0\xde\xaf\xf0\x42\x22\xf6\xc9\x9c\xc9\x8c\xf8\x72\xab\xfe\x55\xf0\x79\x1c\x0c\x08\xdd\x0b\x4a\xd6\x2f\x7a\x82\x25\xd0\xed\x59\x0b\x27\x35\x34\xaf\x36\x00\x5b\x2b\xd8\x8c\xca\x8c\x99\x77\x94\xf6\x32\xb3\xf5\xe5\x9f\x95\xf2\x8e\xdf\x0c\xaf\x64\x48\xee\x4d\xb6\x84\x6e\x7d\x75\x2c\xaa\xa6\x14\xff\x61\xaf\x88\xbe\xc2\x69\x6f\xa8\x5f\x9c\x4d\x8d\x41\xad\xf1\x91\x15\xe8\xf6\x80\x83\x70\x65\xc8\x9f\xc0\x78\x17\x78\xdd\x79\x92\xce\x1a\xc9\xae\xe2\x87\xfd", 143, { 0x25, 0x55, 0x2f, 0xfb, 0x95, 0x22, 0x2a, 0xea, 0xac, 0x33, 0xb7, 0x28, 0x61, 0xa0, 0x65, 0x9b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaf\x65\xf8\x23\xbb\x92\xad\x22\x9a\x57\xa3\x3f\x0d\xae\x76\xbc\xc8\x0b\xf1\x9b\x0d\xee\x34\x80\xe5\x98\x81\xb4\xfe\xda\xa3\x46\x1c\x08\xfb\x4c\x3d\x0d\x28\x47\x4e\x98\x52\xa4\x83\x74\x13\x5f\x57\xf6\x03\xc2\x20\x8f\xdf\x4b\x4d\x82\x55\xac\x40\xaf\x6f\xec\xc2\x8d\x99\xab\x27\x36\x51\x82\xff\x9c\x6a\x89\x76\xd9\xfc\xf2\x49\xa5\xeb\xd2\x65\xe1\x13\x00\x1e\x50\x0d\x16\x08\x65\xa1\x95\x76\x36\xc8\x25\x8d\x90\x5c\xf9\x03\x25\x5e\x51\x7a\xe1\xe3\x19\x73\x5a\x9d\xaf\xf0\x66\x02\xc2\xab\xc6\x1b\x55\xec\xff\xeb\xe3\x0b\x49\x7a\x9d\x82\xa1\x7d\xcf\xae\xf9\xa3\x60\x22\x90\x7e\x78", 144, { 0x6d, 0xea, 0x3a, 0xd4, 0x25, 0x47, 0x84, 0x4e, 0x6a, 0x6c, 0x75, 0xcd, 0x94, 0xd4, 0x93, 0xef }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa8\x5c\x0c\x3c\xd5\xa2\xe2\xb5\x48\xa8\xf4\xce\x7f\x83\x03\x7c\x55\x0a\xa3\xf8\x1c\xeb\xe8\x28\x53\xdb\xad\x1c\x04\xe9\x80\xb3\xbd\xec\x2d\x5e\x28\x1b\xe6\xfc\x4a\xbb\x0c\xe5\x54\xf3\x9c\x02\x29\xbb\x39\x19\x6d\xf3\xd1\x27\x46\x90\xef\xe6\xb3\xf1\x9d\x6e\x85\x50\xf4\xf8\xfd\x53\x42\xbd\x04\xc2\xd6\xfd\x01\x54\x6a\x1b\x5b\xa2\x2e\xe5\x8b\x3d\x6d\xf2\xdc\xdb\xde\x24\xc2\xac\x89\x4e\xd4\xcb\x54\xef\x68\xd0\x2a\x1b\xca\x82\xc7\x7a\x18\xa9\x22\x6a\xbd\x02\x76\x40\x88\x4c\xef\xac\x68\x80\xee\x3a\xc6\x1d\xf9\xf5\x7f\xa1\x42\x26\x7d\x13\xd2\x3a\xf1\xbd\x52\xc1\x2f\xf8\x76\x93\x25", 145, { 0xdb, 0x35, 0x6a, 0x9a, 0x9f, 0x39, 0xbc, 0x4e, 0xdc, 0xf9, 0x16, 0x44, 0xc7, 0xfb, 0x4d, 0xb9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1f\x06\x0d\x79\xa6\x8b\x79\x3f\x43\x92\x8c\x54\x4a\x9f\x08\x5a\x16\xb2\x82\x50\xa3\x6f\x3e\xcc\x39\xec\x36\xd8\x43\x1c\x39\x67\x3e\xd2\x30\x72\xcd\x75\x7d\xb4\xe9\x3f\x7c\xfe\x35\x31\x2b\x37\x6f\x97\xe6\xf4\x03\x33\x4b\xb0\xba\x09\x3c\xa8\x8f\xc6\x02\x56\xa2\xce\x8f\x87\x46\xe1\xdc\x1b\x35\x69\x71\x59\xe3\x62\x03\xec\xef\xe6\x37\x7e\xb6\x54\x85\xf0\x02\x1c\x37\x33\xe0\x2a\x91\xc6\x8f\xed\x0b\xcc\x94\x03\xba\xc9\xeb\x83\xcd\xf9\x58\xe6\x32\x4d\xdb\x92\x58\x03\x41\x05\x10\xe0\xd7\x9b\x8d\x0d\x3a\xfb\x8a\x8c\x4a\x24\x8a\x55\x3d\x10\x3b\x11\xcf\x02\xf4\x72\x97\x71\x5d\x2d\x75\x91", 146, { 0x31, 0x6e, 0xe6, 0x46, 0x65, 0xc8, 0x63, 0x25, 0x2b, 0x8f, 0x01, 0xbd, 0x64, 0x08, 0x2c, 0x6e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2e\x95\x28\x7a\x10\xd5\xfc\xf7\x9f\xca\xa0\xee\x91\x7b\x16\x67\xf0\x36\xc3\x3a\x83\x48\xa6\x59\x4b\x58\xa5\xb8\x29\x60\x03\xd5\x9d\x49\xee\xe7\xa9\x23\x35\xa7\xd3\xfe\x17\xb5\x4a\x67\x37\xa9\x20\x82\xab\xb7\xb6\xc1\x33\xfe\x35\x3e\x86\x6d\x38\xbb\xc8\x52\x87\x33\x19\x81\xff\x1c\x47\x1d\x8d\x3c\xa3\x06\x59\x25\xf1\xdf\xff\x4f\x79\xba\xf8\xd0\x3a\x63\x17\xba\x3e\x46\x30\x11\x09\xfd\xd3\x67\x2b\x7a\x36\x16\xf5\xce\x30\x1a\x48\x93\x62\x89\x89\xfc\x70\xaf\xb0\x77\x6d\xca\x80\xfc\x55\x5f\xd1\xf6\xb3\x37\x09\xca\x63\xf9\xa9\x08\x72\x65\x03\x2d\x21\x2a\x0a\x12\x09\x65\x41\xf5\x58\xb8\xd6", 147, { 0xea, 0x55, 0x9c, 0xa7, 0x61, 0xf9, 0x9e, 0xc7, 0x2a, 0x9a, 0x54, 0xba, 0xa7, 0x5b, 0x37, 0xfd }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x23\x39\x02\xc8\x3e\x52\xc0\x42\x30\x67\x00\x0c\xad\x1c\xfd\x17\x5e\xd7\x5c\x36\xaf\xc4\x02\xec\x36\xf2\x90\x60\xbe\x9a\x7c\x6d\xf0\x80\xcd\xd6\x9d\x73\x72\x97\xab\xee\x40\x56\x99\xe1\x87\xf8\xb0\x89\x4f\x50\xc8\x7b\x34\xf3\xb4\xc1\xdb\x27\x4b\x1b\x10\xfa\x14\x67\x7e\x6e\x8d\x1b\x0a\xd2\x18\xee\xcc\x2c\x83\x96\xaa\xd2\x32\xad\x93\x17\xeb\xad\x55\x23\x3e\x1a\x1c\xdc\x8f\xbf\x88\x00\xc1\x10\x69\x55\x81\xae\x1a\xf7\x2c\x0a\x77\xd0\x5e\x21\x7c\x27\x18\x65\x7b\x4f\x8d\xbc\xf9\x7f\x89\xa1\x26\xc2\x7f\x69\xf8\x05\x2d\xa0\xe3\x4e\xee\x92\x37\x0c\x9c\xe5\x15\x89\x1f\x63\x0f\x7b\x97\xd6\x5c\xba", 148, { 0x0f, 0x9d, 0xb8, 0x04, 0x8a, 0x9f, 0x75, 0x74, 0x4a, 0xcd, 0xdd, 0x47, 0xcf, 0x76, 0x81, 0xfa }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x22\x0c\xb4\x0d\x4a\xfa\xce\x1d\x0e\xfd\x74\x8b\x8b\x3b\x3f\x1d\x47\x28\xf5\x13\x1b\x25\x7b\x98\xba\x42\x78\x54\xe2\x24\x89\x1e\x1d\x02\x1a\xcf\x34\xc9\xe7\x32\x31\x60\x10\x17\x10\x06\xd2\x87\x02\xd7\xe8\x11\x5d\x6d\x7d\x43\x23\xa2\xcc\x35\x2c\x74\x56\x3f\xf3\x02\xbf\xca\xfb\xb3\x46\x44\xdc\x76\xdf\x2d\xee\x23\xef\x4e\x90\x00\xa3\x0a\x16\x60\xee\xcd\x4d\x67\x1d\xa1\xab\xe8\x18\xdf\x18\x6f\x37\x02\x53\x5a\xbe\x97\x03\x22\xf7\x51\x5b\xb7\xea\x39\x68\x0a\xbc\x02\xfa\xa4\xa2\x7a\x2c\x73\x80\x1d\x92\xa6\x22\xc4\xff\xad\x15\x7a\xf0\x63\x23\x6f\x99\x48\x6a\x06\x89\xe7\x18\x09\xfc\x56\xc6\xfc\xbd", 149, { 0x76, 0x46, 0xa2, 0x5b, 0x70, 0xce, 0xd9, 0x5e, 0xe2, 0x86, 0xf5, 0xb1, 0xc2, 0x39, 0xd9, 0x4d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xdc\x6d\x8f\xb6\xad\x09\x2d\x16\xd0\xc8\xb1\x1d\x21\xef\x38\x87\x73\x4a\x11\x92\xcd\x4e\xd1\xae\xd5\xcd\x84\xc1\x4b\x54\xfd\x14\xac\x24\x4f\xdd\xf7\xcc\x54\x69\x8b\x5f\x6a\xe6\x2f\x57\x3e\xca\x2c\x06\xc0\xe4\x95\xb5\x36\xfd\xa7\x5b\x6d\x2a\x4b\xfb\x09\xb1\xb8\x9b\xfe\x96\x35\xdc\x17\xc1\xfc\x3b\xb4\xcd\x3a\xe3\x91\x6f\x33\x2c\xc0\x81\x83\xb4\xb9\xaa\x7f\x18\x88\xac\xba\x50\x24\x4a\xa4\xa5\xe0\xd4\x4c\x4f\xfb\x50\x46\xaf\x52\x47\xa7\x25\x34\x29\x2d\x8f\x56\x5e\x7c\x5f\xdd\xea\x83\x58\x99\xbb\xfd\xe5\x52\x92\x14\x16\x3a\x8c\x1f\x37\x81\x4c\x8c\x0f\x08\xc7\xd9\xb2\x2d\xac\xbc\x03\xc5\x6e\x63\xca", 150, { 0x63, 0xf7, 0x3c, 0x3f, 0x15, 0xc6, 0x1c, 0x37, 0x20, 0x84, 0x1a, 0x45, 0x07, 0x6f, 0x04, 0x5b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x28\xef\xd6\x6e\x65\xca\x78\x4f\x96\x3d\xac\xc2\x4f\xb2\x93\xaa\x30\xe8\xf4\xaf\x9a\xc3\x35\x1e\x7e\xac\x86\x5d\x51\xa6\x1d\x09\x1c\xef\x9b\xae\xaf\x4f\x8e\x22\xf5\x00\x10\x7e\x63\x39\x8c\xba\x8b\x59\xa0\xe4\xcd\xad\x1e\xfd\x2c\xde\x2d\x70\x3e\xfa\x8d\x30\x3d\x1d\xf8\x6d\x3c\xbb\xa3\xf2\x73\x8d\xe4\x1e\xbb\x16\xed\x7d\x15\xd1\xb6\x02\x64\xf9\xf9\xe3\x3b\xf4\x57\x11\xd1\x5d\x98\x53\x11\xad\x10\xfe\xce\x85\x1c\x53\x14\x9a\xcc\x75\x99\x3d\x9b\x05\x53\x86\x59\x5c\x23\x1c\x29\x64\xaf\xa4\xa6\x13\x4d\xc4\x21\x85\x1a\xd3\x06\xb6\x2b\x1f\x5d\xd9\xdb\xd9\x6c\x57\x44\xa1\x79\x67\xc9\xaa\xac\x46\xcf\x8a\x13", 151, { 0x62, 0xc8, 0xb6, 0x40, 0xbc, 0xc6, 0xa0, 0x0a, 0xa7, 0xd0, 0x3e, 0x39, 0xf2, 0xb0, 0xea, 0x37 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x14\x8b\xa1\xc0\x4b\xf6\x23\x0d\xdc\xde\xc3\x00\xe7\x16\xfd\xc9\x17\xce\x00\x68\x99\xfd\x37\x6b\xb7\xfa\x73\xd5\x15\x2a\xb7\x1b\x86\xd4\x9f\x48\x8c\x11\x6d\x40\x6a\xdf\xb1\x21\xe8\x54\x95\xc5\xa3\xef\xc2\x64\x0e\x0a\xf3\x57\x09\x6c\x14\xf7\x1c\xfb\x16\xa4\x50\x8e\x52\xe1\xaa\xe0\x97\x9d\x45\xa1\xd2\x8d\x0b\xa7\x59\xb4\x0f\x43\xd4\x04\x8a\xae\xc8\x1e\x71\xa1\xc1\x36\xaf\x03\x1c\x12\x04\xbd\x6e\x31\x79\xaa\x95\x08\x7f\xaa\x59\x67\xa4\xd6\xbd\xfb\xf1\xcd\xe8\xec\xe2\x2d\xab\xa7\x02\x1e\xaf\xb6\x23\x08\x3c\xca\x37\x64\xa8\xdb\xcf\xb0\x5a\x66\x2d\x7c\x7a\xd5\x07\xa2\x37\xfd\xdb\x93\xb4\xc1\xe9\xcb\x90\xd3", 152, { 0x37, 0x36, 0xc5, 0xe7, 0x36, 0x49, 0xee, 0x57, 0x1d, 0x40, 0xa0, 0x4c, 0x9e, 0xde, 0x94, 0x3a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd2\x66\x10\x9b\xcb\xcd\xeb\x30\x7e\x89\xb2\x83\x7d\x38\xdb\x9b\x63\x9c\x69\xfa\x89\xd0\x39\x1f\x62\x97\xea\x25\x74\xcd\x6a\x89\xf3\xff\x1a\x09\xfc\x16\x9d\xa7\x6b\x2e\x42\xcc\x59\x85\x0b\x8a\x35\x8e\x5a\xfa\x7e\x25\x37\xc4\x1a\xde\x40\xbd\x56\x76\x2e\xab\x7b\x6b\xff\x23\x09\xa7\xc6\x93\x93\x57\x0b\x5c\x36\xdb\xe0\x17\xb7\xd6\x81\xf9\x38\x64\xa7\x51\x97\x6b\x69\x2e\x64\x0b\xcf\x1d\x7c\x2f\xf5\x0f\x46\x45\xd9\x5a\x8a\x0a\xc1\xd6\xe9\x7e\x4b\x28\xfd\xf7\x13\x1b\x0e\x52\xfa\x2a\x6d\x44\x19\x1a\x71\xce\x43\xc4\x0b\xcf\x2f\xf0\x08\xb3\x4a\x5d\xe4\x49\x18\xde\x45\xb3\x43\x9e\x1b\x77\x42\x84\x51\xb2\xa7\xb1\x30", 153, { 0x1b, 0xaf, 0xb0, 0x43, 0x8c, 0x29, 0x50, 0xc6, 0x5f, 0x88, 0x3c, 0x47, 0xe5, 0x59, 0x28, 0xf0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6b\x05\x26\x51\x05\x7b\x83\x3d\xcf\xe2\xeb\xa3\xb6\x8f\x03\x34\x1a\xc5\x18\x1f\xbd\xba\x60\x24\xd8\x44\x58\x57\x48\x20\x4d\x74\xe5\xdf\xf7\xd9\xf3\x6e\x3f\x24\xb2\x40\x22\x69\x10\x1a\xad\x10\x7f\x7a\x28\x4a\xe0\xa5\x4f\x2e\x9e\x4c\xbb\x74\xd8\xda\x60\xcc\xb6\x5d\x2f\xdc\xdd\x0e\xdc\xd5\xfd\x7f\xba\xb0\x87\x60\xc2\x0b\x7c\xed\xb2\x9a\x61\xf8\x52\x4b\x4f\x8e\xd1\xfa\x27\x49\x4e\xce\xe2\x32\x74\x2e\x06\x50\x3d\x64\x34\xd1\xd7\xcc\xde\xd4\xa3\xb8\x17\xd1\x5a\xe4\x83\xa6\x4a\x90\x6d\x3f\xbf\x40\xf7\xe0\x7d\x0c\x6c\x12\x68\xa4\xb2\x28\x46\xe4\xdb\x6c\x9d\x10\xda\xeb\xb7\xac\x52\xda\xc4\xfb\x8a\xa4\x1e\x12\x7d\x91", 154, { 0xee, 0xd2, 0x3f, 0xfe, 0x5e, 0xf6, 0x9b, 0x93, 0x25, 0x36, 0x5e, 0xa2, 0x89, 0x96, 0x1b, 0xe0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa7\x97\x0f\x14\x4e\x1b\x59\xb1\xb1\x12\x25\x89\xdd\x6b\x75\x83\x30\xd0\x3e\x19\x5f\x7c\x32\xbc\x94\xb3\xbb\xe5\xb0\xe3\x03\xba\xae\x55\x30\x58\x27\x90\xad\xc3\xf2\x4a\xa4\x68\xe3\x0c\x88\x4a\xb4\x61\xce\xd1\x02\xba\xbb\x2c\x6e\xe1\x58\x5e\xe4\x18\x83\xec\xf8\xce\x20\x22\x6c\xfd\x6c\xfd\xce\x23\x72\xb8\x3e\xda\x96\xf6\x4e\x16\x4e\x88\x02\xfb\xf1\xdc\xf6\x59\xa7\x03\x9f\xc5\x80\x5d\xa9\x55\xa2\xe3\x80\xf7\x9a\x11\xeb\x6e\xd3\x6e\xd2\xea\x24\xb9\x20\x44\x83\xb2\xc3\xd3\xd7\x82\xd0\xed\xec\xc8\xc4\xfe\x80\x40\xe6\x3e\x7a\x12\xc8\x12\x3a\xb5\xec\x01\x0b\x7e\x82\x51\xb5\xc9\x4f\x3e\x30\xc2\xaa\xd6\x72\xd1\xa1\x74\x69", 155, { 0x71, 0x8e, 0xdb, 0xc9, 0x57, 0x5f, 0x0d, 0x0c, 0xec, 0xbe, 0xde, 0xdc, 0xa1, 0x2e, 0x69, 0xb9 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa0\x38\xd6\x05\xca\xd1\xdd\x6c\x21\xa7\xe2\x51\x9c\x74\xb0\x5f\xdb\x33\x21\xcf\x59\x00\x58\x19\x2d\x1b\x98\xc6\x7d\x0b\xbf\x64\x7f\xdf\x63\x94\x2d\x90\x88\x3d\x85\x82\xfa\xe3\x7a\x29\x4d\x12\x7a\xc8\x6f\xf4\x9d\x55\xe7\x02\x67\x79\xac\xd7\x3a\xb3\xa4\x20\x5b\x9c\xb8\xb0\x9f\x45\x90\xb0\xb1\xbc\xf0\xf4\x03\xae\xae\x68\x4f\x26\x4f\xa9\xc9\x74\x3e\xb0\xe3\x28\xa8\xa9\xbc\x3d\xf7\xe2\x26\x54\xe8\xdf\x52\x15\x4b\x8a\x1b\xba\x57\x87\xeb\xa7\xa7\xa6\x4e\x31\xd5\x72\x11\x7f\xb1\xe6\x16\x8e\x1f\x3f\xb7\x4e\x8a\xed\xd5\xea\x09\xa3\x7c\x25\x0c\x8d\x34\xdf\xc2\xa1\xe7\xb8\x0b\x0f\x6a\xcb\x15\xd2\xaa\x9b\x95\x68\x74\x0c\xa4\x9e", 156, { 0x28, 0x35, 0xde, 0xdd, 0xce, 0x7d, 0xf6, 0x36, 0x34, 0x58, 0x67, 0x85, 0xef, 0xd3, 0xd0, 0x4b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe0\x88\x34\x85\x5b\x42\x2d\x81\x50\x97\x28\x7f\x73\x90\xc7\x46\xaa\x84\xaf\xe7\x97\xdb\x23\x4f\xc6\xed\x3e\xfb\x70\x08\xcc\xca\xea\x91\xc6\xee\xad\x41\x69\xfc\x02\x91\xf2\x24\x4a\x31\xf8\x7a\xe7\xb1\x65\x72\xcb\x43\x12\x6b\x9b\x97\xff\x62\x7f\xe6\x2c\xc7\x89\x0b\x16\x6c\xbf\xcb\xd1\x9a\xc7\x35\xbe\x3e\x2e\x25\xea\x41\x54\xe2\x04\xf5\xf8\xe7\xf8\xab\x5c\xbf\x2c\x61\x15\x09\x56\x98\x71\x9b\xf8\x44\x84\xc3\x79\xdd\xd1\xa9\xe1\x93\x92\xd0\x31\x9e\xa5\xbb\x5d\xb3\x13\xac\xe7\x92\x3d\x88\x19\xbc\xa5\xd6\xdf\x43\x56\xe6\x3f\xb9\xf1\x0e\x75\x4a\x56\x10\xaf\xe6\xeb\x97\x61\x96\x8c\xe0\x46\xf0\x0f\x76\xf5\xa6\x72\x15\x1c\x38\xa4", 157, { 0x11, 0xb8, 0xb0, 0x6e, 0xcf, 0xbf, 0xc1, 0x00, 0x35, 0x81, 0x35, 0x3d, 0x73, 0x40, 0x71, 0xab }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb0\x5b\xca\xec\x8e\xbf\x10\xfa\x8f\xd9\x65\x89\x8d\x7a\xfb\xad\xde\x0e\x2d\xbe\xf5\x93\xf1\xe1\x28\x34\x69\x30\x8c\x86\x98\x85\xfc\x5e\x31\xe8\x39\x4c\x8b\x92\x2b\xb9\xb2\x9e\x46\x99\x97\x4b\x08\xcc\x67\xf0\x9e\x17\xf9\x7d\xa6\xb9\x60\xa9\x10\xad\xa0\xbd\x1e\x7c\x7e\xfd\x8a\xbb\x70\xae\xc6\x28\xb4\xc9\x5e\x5d\x7d\x3a\x7a\x2f\x47\xd5\x7f\xa6\x4c\xd6\xd6\x98\x0f\x13\xc4\xe4\x15\xc0\x78\x48\xb3\xdf\x24\xe0\x03\x42\x43\x3c\xf0\x3e\xf8\x1c\x71\xee\x97\xca\xd3\x21\x3d\x14\x2e\xe1\x99\xe5\xf9\xa1\xce\x80\xba\x02\x71\x58\xd6\x42\xad\x8e\x86\x41\x86\x07\xea\x31\x3a\x29\x37\xda\xc3\x33\x0d\x88\x7a\x37\xe4\x92\xd5\xb4\xa4\x87\x51\xd4", 158, { 0x88, 0xe5, 0x0c, 0x22, 0xb2, 0x63, 0x28, 0xbd, 0x76, 0x62, 0x67, 0x97, 0x24, 0xc6, 0x2a, 0x19 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x53\xf6\x6b\x3e\xe8\xda\xc8\x99\x3f\xa0\x74\x9f\x26\xd7\x47\xd9\x94\x73\x64\xfc\xf9\xbe\xdb\xe0\xb1\xdc\x6e\x19\x92\xf9\x71\x34\xa4\x11\xca\x90\xf0\x5b\x18\xd6\x71\x53\xf0\x16\x28\x63\x43\x7f\x4b\x2d\xdb\xbb\x9d\x77\x04\xe5\xd9\xb4\x47\x28\x48\x2b\x52\xf5\x72\xc6\xf3\xe0\xf1\x79\x43\x18\x60\x4d\xe0\x81\x73\x08\x52\x70\x21\x7b\x8f\x02\xfb\x68\x99\x19\xa0\x0d\x45\xf4\x49\x52\x18\x6a\x80\x8a\x4a\xc3\xee\xe9\xec\x33\x51\x83\x25\xf4\x8c\xfd\x98\xff\xd8\xd2\xe1\x66\x19\x44\x3f\x51\x4b\xdd\x4c\x93\x1b\xa0\xe6\xe8\x92\xd1\x32\xcd\xec\x5e\xb7\xfc\x87\xe9\xa5\x83\xf7\x73\x39\x80\x36\xa6\x38\x7b\xf9\xbe\x98\x60\x1d\x16\x3e\x17\x40\x4b\xe2", 159, { 0x5a, 0xc3, 0xb5, 0xfd, 0x87, 0xbf, 0x56, 0xbf, 0x6f, 0x69, 0xe7, 0xac, 0xf6, 0xb7, 0x50, 0x26 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc2\x6d\x0f\x10\x92\xef\x8c\x47\x47\x46\x72\x44\x42\x38\x9f\x59\x48\xfe\x6a\xf6\xd5\x9f\x8c\x49\x1a\x5b\xac\x02\x96\x3d\x86\x2f\x4c\xd3\xb7\x47\xa6\xfa\x27\x42\xe6\xd3\x13\xe5\x45\xd2\xb6\x1c\xaa\xf5\x93\x7f\x08\x11\x62\xf7\x54\x47\x94\x7a\x22\x96\x85\xf1\xdb\x8b\x3e\x3b\x9d\x13\xe3\x4b\xaf\x71\xbf\x6d\x9f\x4a\xea\xa6\xfb\xdd\x95\x38\xa8\x51\xf2\x44\xe2\x27\xc2\x8a\xd0\xcf\x7c\x4c\xc3\x56\x17\x52\x0b\x3c\x75\x06\x76\x64\x6c\xbf\x66\x24\x71\x1b\x8e\x7c\xe3\x85\x49\x64\xf2\xd6\x96\x3e\x2a\x17\xb4\x6b\xa0\x65\x56\xfa\xb7\xed\x84\x7a\x8f\x17\x0e\xf0\x0b\xc0\xad\xe4\x7e\x9f\xb7\x96\xf2\xc9\x7e\x4e\x14\x4f\x47\xd1\xbf\x05\xe2\xef\x23\x5e", 160, { 0x59, 0x21, 0x8f, 0x6b, 0x10, 0x2a, 0x92, 0x6c, 0x6c, 0xbd, 0x52, 0x03, 0x5c, 0x47, 0xa6, 0xc0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xeb\x39\x92\x73\x9b\xd1\xe7\x22\x4b\x5a\x93\x53\x87\x0e\x45\x56\xcb\xed\x35\x68\xdd\x13\x0e\x55\xc6\x23\x76\x37\x6e\xdf\x3b\x5c\xd3\xda\x1b\x45\xe6\x44\x30\xcb\x02\xe4\xf6\x5d\x09\x25\xfb\x64\x1d\x47\x22\xc7\xf8\xb6\x93\x8a\xe9\x78\x42\x91\x6c\xbf\x1b\x83\x64\x9e\xc7\xca\xf7\xd9\x1e\xb6\x06\xd5\x29\xc1\x48\xae\xd2\xed\x02\x67\x2b\x4a\x65\x3c\x57\x94\x83\x14\x19\xf8\xef\x12\xf7\xf7\xf1\x4b\x0a\x64\x63\x92\x65\x87\x2c\x6e\x20\x64\x56\x2d\x00\x15\xcd\x12\xc4\x54\xb6\xa9\x0e\x15\x69\x3c\xec\x50\x0d\x5e\x03\xdc\xcf\xa4\x57\x77\xbf\x74\xb9\xe2\x47\xf5\xce\x29\x48\x26\xb7\x01\xd2\x0a\x62\x49\x80\x01\x6d\xb3\x6e\x33\xb2\x7c\xd9\x25\x73\x57\x51", 161, { 0xfd, 0x5f, 0x53, 0x55, 0x7c, 0xa6, 0xcc, 0x9a, 0x93, 0x96, 0x50, 0x2d, 0xe3, 0xbc, 0xde, 0x90 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6d\x23\x68\x9d\x82\xcf\x6b\x2b\xad\x27\xf5\x32\x1c\x2d\xd3\x66\x15\x79\x8f\x57\x48\x26\x11\x67\x3d\x5d\x61\x66\xec\x7c\x8a\xcc\x6b\xe2\x9a\x92\xc2\x5a\xc7\xad\xda\x21\xac\x28\x94\x95\xb0\xdc\xf7\x7d\x87\xcf\x81\xef\xd2\x27\x9e\xe2\xe2\xc9\x36\x50\x9a\x93\x61\x07\x72\x32\x36\x0d\x98\xa0\xc1\xae\x31\x3d\x12\x24\xbd\x89\x72\xe1\x98\x7c\xb1\x7b\x9c\x82\x9b\x34\xe4\x16\x89\x25\xac\xfa\x13\x07\x54\x10\xe3\x9e\x83\xd9\xa5\xc3\x68\x87\x1a\x0c\x1c\xc0\x4c\x1a\x23\xf2\xdc\x7e\x12\x4d\x77\x48\x4a\x62\x67\x2e\xe2\x56\x45\x56\xa3\xc2\xcd\xc0\x2c\x2b\xca\x53\x36\x19\x30\x83\xf2\xd6\x48\x9b\x8f\xc4\x06\xac\xd8\x5b\x76\x12\xf9\xbf\x55\x9f\x61\xfa\xbc\x67", 162, { 0xb5, 0xc0, 0xce, 0xe9, 0x9a, 0x70, 0x42, 0x5b, 0xc4, 0x6d, 0xf4, 0x0e, 0x8c, 0x2a, 0xf1, 0x63 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc3\xdb\xf7\x28\x38\x6a\x74\x53\x7f\x06\xd7\xbb\x64\x1d\x2a\xd9\x3e\x88\x32\xba\x91\x81\xdd\x86\xd4\x42\xd7\xad\x4e\x3b\x3b\xaf\x1a\xee\x67\x88\x49\x6b\xe8\xb7\x26\x63\x94\xea\x94\xec\xb7\x48\x94\xd0\x65\x5a\xe3\x92\xef\x97\xc0\xfe\x70\x8a\xcb\x6c\x87\xa2\x09\x91\x1f\x96\x04\x01\x69\x73\x10\x45\xeb\x43\xa8\x94\xb2\x5b\xf6\x32\xa3\x42\x71\x62\xf0\x39\xa1\x09\xa6\x6c\xfe\xe1\x62\xb3\xf6\x56\x24\x05\x0e\x01\x3b\x7a\x20\xbe\x60\xfa\xc2\x6c\xdf\x87\xc7\x40\xf0\x25\xdf\xc6\x24\x62\x5a\x76\xfb\x85\x09\xef\x92\x57\x45\xd2\x79\x88\x09\x3e\xa3\xc0\x3a\xe3\x77\x44\x08\xc5\x03\x40\x6c\x8f\x50\xb7\xd1\x91\xd0\x04\xcf\x58\xf4\x0b\x12\xe9\xda\x02\x59\x99\x24", 163, { 0x62, 0xcf, 0x51, 0xd0, 0xdd, 0x5e, 0xaa, 0x1d, 0x2e, 0xbc, 0x45, 0xe8, 0xbe, 0x1e, 0x27, 0xc5 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd6\x9b\x8c\xe4\x3b\x44\xc8\xb3\x53\x9c\xf5\xe1\xfa\x49\xb3\xc6\xac\xeb\x98\x37\x13\xe5\xc5\x14\x31\x3c\x24\xff\x27\x97\x40\x27\xa0\x66\xc0\x42\xdd\x20\x81\x99\x5d\xa4\x4f\x3d\x28\xc1\x40\x57\xb8\xd1\xae\x9d\x85\x80\xcf\xe1\x2c\xaa\xf3\xc3\x3b\x62\x59\x87\x9b\x10\xad\x01\x9a\xb2\x22\xad\x95\x43\x28\xdb\x3e\x38\xca\x07\x90\x27\xa7\x47\x4c\x83\x8b\xdd\x2e\x82\xaa\xec\xb1\x1f\x78\x48\x7c\x3b\x28\x66\x68\xdf\xbf\x72\x2e\x9c\xd3\x80\xb2\x13\xe5\xda\xe6\x91\x58\x78\x5c\xd2\x0e\x8d\x6d\xe7\x9e\x3e\xff\x32\x33\x6d\xf5\x8d\x04\xb4\x39\x8a\x6b\x6e\x5f\xd5\xa5\xef\xf6\xb6\x25\xd3\x70\xb3\x95\x74\xab\x52\x6a\x75\x1b\xfc\x22\x7b\x96\xfd\x1d\xfc\xbc\xa8\x15\x2f", 164, { 0xd4, 0x4e, 0xcd, 0x21, 0xa5, 0x2f, 0xe7, 0xf0, 0xee, 0x4c, 0x55, 0xcd, 0x8a, 0xa7, 0xdc, 0x4c }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x01\x98\x3c\x23\x59\x11\xf1\xec\x7f\x84\x1e\xf7\xe1\x31\x30\x7f\x2b\xe7\xb4\x18\x6e\xe7\x8b\x69\xed\xe7\xc9\xf7\x84\x32\x30\x1c\xb6\xec\x44\x16\x51\x74\x0b\x3b\xc0\xe2\x63\x4b\xed\xaf\xff\xde\xd0\x74\x00\xfc\x99\xcb\x2c\xcb\x76\x52\xcd\x63\x01\xce\x28\xbe\x4a\x6b\x99\xcb\x7c\x21\x48\xa1\x2e\x33\x8a\xd0\x48\xd2\xd6\xd4\x90\xde\x61\xa3\xd0\xcc\x59\x65\xa6\xa2\xbb\x44\xe8\x1f\xd2\x59\xb1\xf9\x4d\xc5\x0d\x3e\xfb\xe1\x3d\xdc\x25\x8d\xa7\x3c\x88\xa5\x5d\x08\xed\x92\x48\x0e\x67\xfc\xf0\x3c\x29\x9d\xeb\xcb\x01\x31\xe1\x79\x75\x8a\x37\xee\x78\xbf\x60\x40\xc9\x84\xbc\x92\xe9\x95\x2b\xd7\xb7\x4d\x33\xb4\xa9\x53\xca\x84\xa9\x73\xc0\x75\x8a\x8b\xcb\xcf\x25\x9c\x31", 165, { 0x92, 0x9b, 0xb5, 0xb5, 0x6a, 0x86, 0x10, 0xb0, 0xb7, 0xe5, 0x9a, 0xc2, 0x89, 0x26, 0x9a, 0x48 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x55\x14\x00\x0c\xc4\x0a\xbb\x3d\x78\xce\xe9\xf0\x2e\xd2\x57\xc7\xe4\x74\x2e\xa5\xdd\xd0\xca\x1a\xc1\x40\xaa\x66\xe0\x71\x7f\x2c\x97\x23\x67\xb4\xcb\x7c\x33\xdd\x93\x0a\xe4\x9d\xf2\x54\x35\x36\xc1\x1b\x52\xf8\xac\x32\xa6\xad\x53\xf7\xd2\xa4\x90\x6d\xb9\x5d\xd8\xf7\xb8\xce\xba\xb3\xf3\x50\x85\x71\xcb\x29\x07\x4f\x6b\xb6\x6f\xf3\x82\x35\x54\x63\x0b\x2d\xce\x84\x47\x7a\xc2\x2d\xcd\xf9\x3c\xe7\xb7\xcc\xf5\x43\xfe\x4a\xf3\xd8\xe0\x86\x50\xd8\x7d\x7a\x12\x4e\x82\xd1\x39\xf7\xfc\x4e\xd8\xba\x4e\xdc\x5b\xc4\x3e\x32\xe7\x44\x29\x22\xdf\xc0\x57\x7f\x82\x13\x69\xa9\xb1\x03\xef\xb7\xce\x83\x16\x3f\xc1\x82\x7e\xc4\x14\x6d\x2a\xbd\x3e\x48\x91\x3e\xfd\x64\xd1\x46\xdc\xbe", 166, { 0x34, 0x76, 0xd8, 0x8f, 0x60, 0x2b, 0x1e, 0x31, 0x24, 0x84, 0xf7, 0xc0, 0x6c, 0xe6, 0x88, 0x4d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x03\xa4\xd4\xf4\xa9\x86\x0f\xe5\x44\x9f\xc7\xe3\x03\xf4\x4d\x97\x95\x44\x26\x72\x1f\x12\x50\xcc\x4a\x50\xa2\x9b\x73\xa9\x51\xd0\x06\x6b\x8f\x51\xe5\x10\x4d\x8f\x01\x68\x22\xc5\x0c\x64\x44\xcc\x45\x81\xb2\x9c\x72\xce\x74\x63\xec\x9c\xfa\x3b\xd4\xc2\xa2\x8c\x64\x8a\x55\xfe\x60\x3c\x51\x18\xaa\x44\x01\x7a\xf5\x02\x07\xb3\x92\x2f\x5c\xc0\x66\xe7\x8f\x22\xfd\x57\x29\x9b\xb7\x03\x32\x84\x20\xb4\xcc\xce\x5e\xfd\xfc\x93\xc3\x69\x89\x58\x82\x43\xfd\xe2\x7f\x02\xc8\xb1\x3f\x4e\x84\x1d\xff\xb3\x54\x0c\xe0\xe1\x65\x4e\x3f\x9d\x96\x95\x23\x48\x34\x14\xd0\x0a\xde\xb2\x78\x9b\x88\xeb\x11\xae\x9a\x44\x42\xfa\x38\x69\x77\xe6\x9d\xe4\x13\xd0\xa0\x7c\xc5\xfa\x59\x28\xf4\x11\xdd", 167, { 0x8e, 0x0a, 0xc8, 0xfc, 0x3e, 0xdd, 0xb3, 0xf5, 0x3b, 0x8d, 0x4d, 0xfd, 0xac, 0xbe, 0x7e, 0x2e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xae\x54\x5b\x24\xdd\x9a\x7d\x0c\x63\x4c\xe7\x77\x4c\xb1\xdd\x8f\x18\xe8\x22\x29\x77\x15\x43\x47\xa3\xb6\x7d\xb8\x5a\x14\x4c\xda\x77\xd4\x91\x80\x2c\xad\x5e\xee\xde\x34\x62\x01\x9d\xd2\xec\x6c\x3f\xd8\x9d\x1c\x18\xa9\xaf\xbd\x57\x15\xdc\x56\x00\xc7\xec\x10\x81\xd4\xde\x14\xf4\x73\xb2\x91\xf0\xcc\xd1\xdd\x0c\xe9\x1a\xb3\xf1\xc9\x8a\x9b\x1b\x93\x87\x67\x2c\xe8\xc9\xd9\xed\x51\xe6\x62\xe2\xd8\x78\x05\x88\xb2\xec\x5a\x2d\x19\xea\xaf\x6c\x38\x5c\x49\x44\x40\x1e\xc8\xd5\x98\x40\xa8\xb6\x31\xfa\xe4\xf5\xf7\x2d\xb5\xac\x63\x92\x78\x3c\x2d\x81\xad\x29\x1f\x60\x1b\x92\x05\xa6\x12\x4b\xc1\x8b\xc8\x99\x7b\x4e\xe5\x89\xf5\x22\x1a\xed\xfc\xb6\xec\xf4\xfa\x60\x8f\x65\xa9\xe5\xed", 168, { 0x77, 0x8c, 0x9e, 0x7c, 0x8c, 0x2b, 0x00, 0xa3, 0x26, 0x62, 0x11, 0x70, 0x3a, 0xe1, 0x62, 0x5b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x78\xe2\xe7\xc6\x51\x93\xec\xf1\x19\xcf\x07\xc0\xbb\x00\x25\x81\x38\x37\xf5\x21\xa8\xa4\x75\xec\xce\x21\x16\x6f\x56\xe8\x8b\x7f\xad\x66\x33\x52\x7d\x27\x21\xca\xc4\xf0\xc4\xd2\x90\xeb\x38\xe1\x59\xfd\x28\x9c\xfb\x34\x5d\x98\x4e\x5c\xe8\x3d\x64\xb1\xe8\xc6\x5e\xae\xf9\x64\xeb\x04\x39\x82\x5e\xa6\xf8\x24\x6b\x01\xfc\x69\x7f\x49\x6d\x2f\xb9\xef\x63\xd5\x88\x2e\x0b\x1b\xe2\xc5\x70\x26\x1d\xbf\xec\xa1\x6e\x6e\x2a\xfd\xfd\x76\xd6\xd8\xa1\x05\xe4\x7b\x3d\x20\x7a\x7e\xb6\x19\x7b\x86\x90\x1d\xb1\x2f\x24\xe9\x96\x04\x80\x9d\xbf\xab\xdb\xa9\xe6\x1e\xb3\xe4\x92\x14\x85\xbb\x65\x7e\x28\x86\x02\x2d\xc7\xf6\x99\x90\x79\xab\x10\x9b\x7f\xe2\xcf\xc4\x19\x4c\x28\x27\x05\xf9\x62\xca\x95", 169, { 0x0c, 0xf1, 0xe5, 0x46, 0x88, 0x85, 0xe9, 0x7a, 0x00, 0x08, 0xbf, 0xe5, 0x0b, 0x81, 0x55, 0xec }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x73\x61\xfa\x6c\xe8\xf3\xd4\xd4\x7f\xb9\xe0\xbf\xcb\xb0\xd7\x59\x5d\x5b\x85\x46\x73\x8f\xc9\x7d\xcf\xda\xba\xc0\xa3\x91\xe4\xb7\xa8\x75\xb0\xa8\x4e\x01\xe1\xd6\x0e\x53\x3b\x73\xdb\xb4\x3e\x42\xb6\xc6\x10\xce\x61\x49\x78\x40\x2b\x8a\x06\xe1\xea\x68\x51\x2d\x07\x04\x59\x90\xb3\x04\x0a\xc0\x38\x84\xe2\xb6\x6a\x9b\xa9\x4a\x3c\x85\x5f\x6a\x6f\x72\x34\xf6\x64\xea\xb1\x3b\x13\xdb\xf4\x0b\x14\x41\x18\x75\xdb\x70\xb3\x27\x01\x01\x79\x5c\xbd\x57\xfd\x83\x71\xcc\x98\x6e\x61\x7d\x62\x33\x7e\xaf\x5d\xa3\x60\xdd\xb2\x64\x53\x5f\x13\xae\x88\xb8\x3f\x9e\x6d\x7c\xa4\x3a\x17\xdc\x1e\x02\xda\xd0\xde\x2f\xfb\xe0\x66\x8b\x7d\x8e\xb0\xec\x17\x63\x6e\x4e\x47\x95\x6d\x8c\x80\x51\x13\xbb\x7f\xab", 170, { 0x46, 0x56, 0xb9, 0xc5, 0xa9, 0x38, 0x86, 0xec, 0xb8, 0x20, 0x03, 0xdb, 0xb1, 0xc2, 0x84, 0xd8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x07\x23\xbc\x20\xef\xdb\xfb\xc4\x54\x00\x01\x0c\xa3\x92\x64\x3a\x4d\xeb\x7c\x61\x0d\xdc\x76\x14\x49\x65\x87\xaf\x92\x11\x3c\x41\x46\xec\xf0\x15\x55\x22\x58\xdc\x20\x36\x38\x78\x7d\xdb\x38\x67\xd7\x72\xd1\xca\x73\x21\x62\x11\xcd\x8c\x5f\x45\x21\x33\xa8\xf2\x05\x68\xf8\xaf\x33\xeb\x74\x4c\x65\x24\x63\x96\x59\xfc\xfd\xc9\xf4\x58\x5c\x93\x83\x32\x8f\xc1\x1c\x56\xce\x88\x23\xb7\xc7\x72\xe8\x6c\x17\xe4\x6e\x4a\xd4\x48\x47\x1e\x47\xdb\x9a\x87\xb7\x14\x47\x6e\x60\xb0\x21\x24\x83\x57\x5a\x16\x97\xec\xfd\x2f\x9d\x76\x94\xca\x91\xa6\xe9\x53\xfc\x04\xea\x79\xa6\xba\xa5\x11\x69\xfd\x73\x8a\x21\x14\x32\x09\xc0\x06\xab\x21\x7e\xe4\x12\x30\x2d\xb0\xab\x59\xaa\xe9\x89\x19\x70\xb4\x71\x88\x46", 171, { 0xea, 0xdb, 0xc3, 0x9a, 0xf7, 0x45, 0x25, 0xa6, 0xbb, 0x14, 0x02, 0x97, 0x30, 0xae, 0x75, 0xc7 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa9\xde\x2f\x19\x37\x1e\x80\xe4\xb4\x9a\xf6\xcb\x04\x33\xca\x48\xe5\xc7\x4f\x7c\xd6\xd2\xea\xa7\xa2\x31\xb2\xb3\x8d\x02\xa0\xeb\x19\xa8\x73\xc9\x75\xeb\x23\xec\x83\x3c\xff\x28\x85\x15\x65\xb8\x63\x7f\x1e\x8e\x9b\xad\x54\xcb\xc5\xc6\x30\x4a\xc2\xc0\x14\x57\x81\x68\x72\x7e\x6d\x7e\x47\x7d\x77\xfc\x38\x5b\xbb\x77\x47\x92\xd1\x9f\x32\x67\xb3\xe1\x68\x5b\x46\x2b\xa8\xba\x87\xcf\x39\x50\x53\x81\xc0\x3b\xd2\x7b\xc1\xdc\x82\xc0\xb5\xe7\xdc\x7c\xc3\x9a\xa4\x8a\x1f\x0b\xd2\x10\xfc\x99\x18\x45\x2f\x84\x10\x53\x61\x99\x04\x58\xf1\x06\x59\x86\x64\x4c\x98\x69\x89\x51\x1a\x48\x2e\x95\x50\xa5\x78\x7d\xac\xe0\xe3\xcb\x30\xf8\xd7\x2f\x91\x70\xe3\xf6\x07\x50\x98\xe1\xb4\x42\x04\x11\xae\xdd\xca\x1d", 172, { 0x6d, 0xb0, 0x2c, 0x2a, 0xe2, 0xf9, 0xc9, 0xa2, 0x0a, 0x36, 0xf9, 0x94, 0x5f, 0x28, 0x33, 0xf3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xab\x00\xdb\x46\x48\x54\xd3\xc2\xf6\xf3\xf2\x34\x82\x27\xb5\x3d\x3f\x4a\x10\x2c\xd1\xcd\x4b\xd1\x99\x55\x76\x6f\xb8\x00\x8a\xcf\xc2\xc6\x1e\x71\x01\xfa\xc3\xde\x63\xee\xfc\x19\x01\xb6\xdd\x34\x4c\x06\x3f\xfe\xd6\x35\x9d\xda\xba\x62\x8e\xab\xaa\xb5\xdf\xeb\x93\xbf\x4c\xdb\xef\xfb\xdb\xd4\xa6\x76\xd6\xbd\xa2\x8a\x63\x96\xee\xc6\xc1\x30\x89\xea\x21\xff\xcd\x0d\x1f\x08\x77\xe1\xdb\xf4\x52\x0f\xb8\x47\x85\xbc\xb1\xaa\x75\x2d\x53\x64\x58\x87\x5b\xe7\x58\xaf\xec\x87\x5f\x50\x6c\x45\x85\xfb\xfd\xca\x14\x68\x93\x6f\x34\xda\xb7\x79\x38\xa1\xd7\x62\x83\xb9\x47\x52\x18\x90\xd8\xad\xbe\xe5\x13\xc5\xcc\xcc\x13\xb0\x96\xce\xfc\x35\x74\x2d\x1c\xe0\x6c\x44\x9c\x35\x7b\x0d\xe2\x01\x85\xbd\x87\xcc\xd6", 173, { 0xfb, 0x6c, 0x0f, 0xbd, 0xe3, 0x87, 0x1b, 0x0a, 0xb2, 0x35, 0xf1, 0xb1, 0x53, 0x60, 0xd6, 0xd2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8a\xf0\x6a\x54\x8c\x8b\xb1\x44\xc1\xa8\x44\xb5\x2b\xf1\x8e\x8c\x14\x88\xcb\x2d\x72\xbb\x40\xc3\x65\x66\x8b\x2d\xdc\xe6\x15\x86\x58\xb5\xa3\x4e\xc9\xa7\x0c\x3a\x94\xc0\x05\x94\xb6\xb0\x18\x50\x02\xec\xb3\xad\x86\x69\x5d\x84\x0c\xf7\x03\x31\xbc\x39\x71\x1b\xdf\x3d\xdc\xe1\xbe\xbc\x9b\x22\xa8\xef\xf6\xe9\x13\x0b\x17\xb4\xda\x5b\x1e\x1f\xa5\xf9\x50\x32\x67\x29\x6f\x44\x00\x52\x24\x89\x02\x9a\x99\x3f\x90\x1d\x23\x72\x62\xc9\x1d\x67\xe6\xd9\xd0\xab\x81\xeb\x8e\xb8\xf3\xc0\xde\x40\xd9\x90\xd1\x19\x4b\x08\x73\xc6\xa5\xe1\x5d\x9e\x64\x1e\x68\x9c\x26\xe2\x7c\xc2\xd3\xeb\x86\x2a\xdb\xaf\x87\xaa\x95\x11\xc9\x23\xc7\xc0\x2e\x66\x43\x2d\xa1\xc4\xae\x26\xad\x31\x5c\x14\x2c\x14\x57\xcd\x17\xae\x7f\x17", 174, { 0xf9, 0x28, 0x28, 0x66, 0x7b, 0xe7, 0x4e, 0x18, 0xda, 0xce, 0xe9, 0x8d, 0xff, 0xab, 0x12, 0x98 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7d\x24\xcb\xba\x8f\x2a\xad\x41\xd8\x4e\x94\x4d\x89\xdf\x8b\x95\xf2\x78\xff\x7d\x0d\x2c\x9d\x52\x35\x4f\x5a\x20\xf4\xdf\x8c\x30\xf9\x8e\x35\x22\x28\x6d\x61\xa3\xcc\x36\xa5\xca\xe8\x36\xc7\x14\xab\xd5\x7c\xfa\x01\xc4\x4c\x2d\x46\xc1\x92\x6e\x15\x0a\x9f\x0b\x3f\x5c\xff\xf9\xd8\xa6\xd3\x8b\x6b\x4f\x5d\xcd\x4d\x21\x9b\x7f\x0f\xd0\x0a\xb1\x0d\x2b\x8b\xf8\x23\xde\x63\x4a\x7f\xe1\x5d\x7b\x92\x81\x0a\x55\x21\x09\x29\x4d\x78\x0d\x21\xe8\xbd\x52\xaa\xaa\x62\x5d\x8c\xb6\xb4\x97\x80\x07\x91\x19\x33\x49\x36\x1a\x68\x55\x36\xf2\x3c\x48\x87\xca\x85\x3f\xb7\xe3\x54\xb0\x3c\x7f\x9a\x68\xe8\x6f\xe7\x1d\x7b\x3a\x4d\xaf\x53\xe7\x63\x00\x3e\x68\x66\x6c\x70\xa3\x79\xe7\x90\x1e\x0d\xb2\xec\x45\x5b\xba\xcd\x5b\x0e", 175, { 0xeb, 0xa1, 0xc8, 0x38, 0xbc, 0x82, 0x3d, 0x39, 0xc0, 0x92, 0xec, 0xdb, 0xa3, 0xa7, 0xc6, 0x56 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8d\xe6\xfb\xff\xf9\xe6\x4a\x18\x43\x2d\xbc\x59\x01\x9a\x7f\xf9\x95\x83\x87\xa4\x46\xbe\x37\xe3\xfc\xdc\xa9\x9a\x98\x76\x9a\xaa\xee\x9f\xf5\xb7\x60\x79\xfa\x04\x18\xe3\x0b\x79\xe1\x50\x13\xc7\xa2\xb3\x93\xa2\x79\x96\x4b\x2d\x70\x4a\x81\x74\xdf\x39\xf1\x12\x5e\x57\x51\xf3\x64\xb7\x7f\x34\x81\x3a\x49\x27\x34\x62\xd9\x72\x6a\x44\xbb\x56\x94\x9c\x8c\x0e\x63\xfb\x42\x4e\x23\x1b\x12\xea\xb1\x53\x02\x98\x1a\x25\x0b\xce\xd2\xf5\xea\xc5\x8e\xd5\x83\xa0\xbe\x7b\xf2\xa5\xaa\x54\x30\xa9\x28\xb1\x5f\x8b\xf8\x1f\xb3\xd6\xbc\xd6\xfc\x8a\x96\x47\xd3\xf5\x60\xd8\x61\xba\x83\xac\xc7\xf3\x74\x9b\x2d\x73\xd1\x41\x6b\x24\x14\x32\x4d\x8f\xf1\x4b\x86\x7b\x52\x24\x35\xac\xed\xa1\x0c\xcc\x7e\xa8\x23\x68\xa6\xed\x58\x11", 176, { 0x48, 0xe5, 0x26, 0x3b, 0x57, 0x15, 0x53, 0xb3, 0x89, 0x25, 0x12, 0x09, 0x49, 0xd9, 0xd6, 0xd2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x60\xe8\x60\xa3\x1c\xe8\x6f\xa2\x7a\x41\x80\xbf\xa4\xa1\x41\x7b\x48\x81\x9e\xe3\x31\xb7\xe9\x79\x81\x27\xa3\x33\x8d\x9a\xea\x9c\x55\xa7\x7e\x19\x9e\xcd\x71\x47\xae\xa3\x6b\x7f\xa3\x26\x97\x7b\x71\x32\x2e\x12\x76\x0c\x9e\x1f\xbc\x1c\x56\x80\xca\xb8\x31\x3a\x27\x1b\x7c\xba\x6c\x74\xa6\x36\x05\x1b\x83\x32\x84\xde\x3d\x1f\xa1\x7a\xd7\x1e\xd2\x25\x5f\xe2\x83\x48\xb0\xb3\xf3\x4a\xe1\x8e\xab\x88\x4e\x69\x9b\x60\x41\x95\xd2\x6d\x3c\x3d\xd9\xcd\xe5\x0b\xad\x9d\x8e\xea\x58\x86\x60\xe6\x2b\x71\x25\x2f\x9a\x56\xaf\x3c\xb4\x32\xe7\x0b\x3d\x17\x75\x87\x69\x5d\x09\x03\x38\xf6\x45\xe3\x69\xdf\x47\x5b\x1c\xb3\xd6\x4e\x07\x5a\x28\x58\x54\xde\x4d\xe7\x16\x5e\x3c\x84\x67\x1b\x78\x30\x1f\xaf\x5f\xe9\x33\x5e\x0f\x4c\xa7", 177, { 0x3d, 0x14, 0xce, 0xb4, 0x3a, 0x69, 0xc6, 0xb9, 0x35, 0x2a, 0x07, 0x20, 0x11, 0x8a, 0x7d, 0x87 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x85\xf5\x54\x31\x2f\xf4\x40\x6c\xc7\x2e\x93\xb5\xe7\x71\x35\xa6\x4f\x41\xb7\x2d\xf1\x7e\xb4\x48\x28\xb2\x53\x5f\x09\xf9\xe8\x3d\xd2\x8d\xba\xad\x80\xed\xdf\xad\x7c\xaa\x44\x51\x75\xce\xc9\x37\x49\xe9\x89\xa3\x1c\xb9\x37\x37\x8c\x75\xa3\x50\xfb\xb6\x5c\xff\x0b\x03\x70\xa2\x28\xf7\x4f\x1f\x3e\x11\xce\xbc\x8c\x18\x47\x9e\x90\x29\xdd\xdd\x22\x5f\xdd\x40\x9d\x1d\x40\x9a\x37\xfa\x4d\xc0\x72\x4a\x5b\x25\xab\x45\xb4\x15\xd0\xd7\x96\x8a\x2f\x03\x53\xae\x69\xf4\x98\xee\x85\xa2\xca\xb7\x21\x1d\x8c\xd0\xc3\x7a\x5d\x54\x4d\x57\x5f\x4a\x8f\x0c\x32\xe3\xf7\x6f\xff\x4f\x63\x44\x91\x3c\x17\x40\x9d\xec\xca\xb8\x22\xf1\xdb\xeb\xeb\x88\xa1\xe8\x32\x90\xdf\x1d\x5f\x25\x57\x7e\xed\xde\x75\x4e\x6e\x9f\x2c\x8d\xa5\x1b\xde\xff", 178, { 0xaa, 0x31, 0x4b, 0xfa, 0x31, 0x2f, 0x20, 0xf7, 0x63, 0xcf, 0x19, 0xbd, 0x14, 0xf2, 0xac, 0xda }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd1\xe9\x75\xd4\x09\x42\x8f\xf9\xc2\x55\xd6\xfa\x6e\x47\x6d\x92\x3f\xca\x86\xd1\x09\x59\x10\xe8\x46\x0d\x8e\x94\x33\x1f\x03\x25\x17\xfb\x09\x2a\xa3\xfd\x02\xbb\x75\xca\x65\x63\xb7\x4e\x3a\xa7\xe4\x4d\xa1\x37\xab\xa8\x8b\xb1\xec\x2f\x8c\x0c\xdf\x1d\xc9\xa7\x54\x34\x0c\xee\x14\x76\xf6\xa6\x67\x7d\x54\xd7\xaf\x77\x8a\x53\x32\xc2\x2b\xe6\xf5\x20\xab\x1c\xc3\x97\x2c\xa9\x4d\xe8\x74\x79\x6b\xa9\x00\x55\x81\x01\x32\x2e\xfc\x00\xa5\x0a\xfc\x99\xa1\x88\x0c\x3d\xaa\x11\x0c\x14\x33\x9d\x30\xda\x70\x1f\x21\x55\x49\x8f\x41\x6e\x6a\x92\x0c\xf3\x77\xc7\x9a\xe8\x5d\xb0\x40\x86\xc4\x3b\x56\xd1\xa0\xec\x14\xd9\xe7\xaa\x96\x8d\x5d\x23\xff\x36\x8a\xdc\xb9\x98\xce\xd8\xda\xa0\x8b\xe4\xa2\xc9\x80\x7d\x21\x12\x36\x5f\xf6\x94\x92", 179, { 0x24, 0x4a, 0x76, 0x30, 0xfe, 0x50, 0x3c, 0xd3, 0x96, 0x8d, 0xed, 0x72, 0xd2, 0xd1, 0x92, 0x63 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xac\x31\xc2\x8b\xb5\x5a\x42\xf6\x67\x8b\x62\x7d\x55\xb8\x38\xaf\x5d\x0f\x5b\x31\xfa\x7a\x38\x11\x26\x42\x11\x3b\xea\xcd\x98\x04\x83\x88\x24\xe4\x32\xe0\x8e\x41\xa1\x69\xab\x66\xed\x22\x65\x92\x54\xd0\x78\x2d\x7c\x86\xc6\x16\x5e\x46\x58\x17\xcd\xc2\xf2\x7a\xa7\x3b\x52\xb5\x97\x8b\x05\x40\x84\x3d\xe5\x87\x99\xda\x32\xfb\xf2\x3f\x4c\x43\xe0\x29\x0a\x91\xd9\xd3\xbb\x0f\xff\xb6\xb7\x77\x4b\x6f\xa0\xc2\x56\xbf\x3a\xf8\xc4\xac\xe4\x26\x4d\xc4\xb3\x6e\x69\x81\x2a\x38\x97\xc8\x97\x87\x4b\x8c\x0c\x66\x72\x90\xf9\x80\xa3\x49\x63\xcf\xe3\xe1\xc3\x6d\x15\x58\x7d\x86\xfc\xc5\xfb\x6f\xee\xbb\x66\xcf\x18\xc6\x01\xfb\x68\x15\x22\x60\x1b\x31\xcd\x19\xe3\xeb\xee\xa1\xb4\x55\x33\xa2\x2b\xe6\x84\xec\x9b\xc1\x20\x81\xb6\x0f\x55\xcd", 180, { 0x74, 0x83, 0x94, 0xea, 0x7a, 0x82, 0x27, 0x87, 0x79, 0x88, 0xa8, 0x23, 0x8f, 0xc2, 0x4e, 0xaa }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd5\x88\xdb\xf3\xe4\x11\xce\x42\xed\x80\x47\xc6\x3f\x7b\x96\xfb\x3b\x7e\x1d\x9d\xba\xfb\xcc\x9b\x1e\x9b\x34\x29\xf4\xa3\x4a\xf4\x43\x72\xbb\x71\x74\x26\xe6\x4f\xdd\x5f\x7b\x0b\xec\x1b\xae\xa1\xec\xc0\x17\x60\x77\x39\x29\xd7\x79\x38\x4c\xeb\xdc\x99\x9a\x0a\xd5\xe7\x33\x7a\xca\xf7\x3e\xcb\xdf\xb2\x7c\x6b\x1c\xf1\x8a\x58\x3c\x81\xb3\xf0\x15\x45\x6f\xe4\x9f\x7b\x7d\x4b\xa2\x17\x98\xd3\x00\x4b\xd9\x12\x9c\x28\xa8\xfa\xe6\x5e\x60\x6b\x05\x1f\x7f\xe3\x9f\x22\x86\x50\x48\xc4\x73\x06\x84\x48\xd9\xcc\x7b\x3f\x99\x11\x38\x03\x3f\x3c\x9d\x5d\xfb\x21\xe7\x47\x3a\x8f\xda\xcb\xe0\x06\x89\x0a\x24\x86\xc4\x58\x09\x82\x1e\x85\x75\xf4\x99\x37\xf0\x8a\xf0\x72\xfa\xfe\x81\x3a\x08\x83\xd6\x50\x1d\x5b\xcf\x17\x02\x85\x6d\x9a\x22\x94\x3d", 181, { 0x15, 0xb7, 0x30, 0xcc, 0x2e, 0x0b, 0x5f, 0x0f, 0x3f, 0x7d, 0x9a, 0x52, 0x62, 0x75, 0x4d, 0x08 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa7\x04\x9b\x5f\x13\x65\x45\x32\x21\xf1\x01\x9e\xfe\x9e\x5a\xfd\x63\xa5\x64\xa6\x5d\x1e\x52\x18\x29\x38\x25\xc0\x39\x12\x7f\x67\x53\x38\x96\x3b\xd9\xbd\x44\x78\x23\xf1\x3a\xb3\x08\xbf\x55\xc3\x7c\xa6\x09\x4c\x53\x52\xf9\xe9\x24\xd6\xa9\xf6\x48\x88\x4b\xf7\x02\x7a\xb5\xa8\xb9\x90\x74\xa1\x60\x43\xfa\xa6\xf6\xf1\xf2\x89\x29\xde\xb5\xbc\x16\xcb\xd4\x77\x2b\x31\xd5\x82\x2e\x1a\xfc\xa0\x56\x9d\x3e\x98\x97\xf4\x5b\xe1\xfb\x3b\x04\xe9\x2c\xc7\x37\x02\x0e\x21\xac\xe9\x89\x9e\x67\xf5\x64\x9c\x6e\xd9\x4d\x5b\x95\x15\xf5\x75\x75\xff\x58\xfb\x7b\x6a\x1a\x2e\x1c\xf0\x0d\xd7\x26\xe2\xcf\x44\x32\xc8\x91\xdf\x36\x96\xf2\x6c\x37\x6e\x09\xde\x1b\x0c\x82\xd7\x9c\xd3\xdf\xbb\x59\x71\xe0\x70\x07\x31\xfe\xb4\xc4\xdd\x10\x1a\x8c\x4d\x11\xa2", 182, { 0x96, 0x00, 0xc5, 0x60, 0xaa, 0xdd, 0xfd, 0x65, 0xc4, 0x77, 0x58, 0x7b, 0x27, 0x5e, 0xcd, 0xef }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc4\x90\xf9\xf4\xf4\xb6\xc7\x39\x92\x39\xa0\x96\xf9\x06\x11\x46\x79\x2b\x71\x53\x87\x1e\x62\xf1\x15\xa7\x76\x77\xfd\x6b\xed\xfb\x96\x17\x9d\x88\x69\x25\xeb\xfe\xfe\x4e\xf5\x87\xcf\x8c\xd2\xb2\x5e\xcb\xf1\x2d\x62\x2b\x9e\x23\x1d\xf4\xa3\x30\xc9\x17\x0b\xfd\x30\x5d\x01\x7d\x5b\x2f\xd8\xc3\x62\x00\x24\x7d\x62\x5b\x05\x11\x8d\x84\x84\x52\x5c\xce\x15\xdf\xdf\x79\x3c\x18\x34\x45\x4d\xbe\x16\x97\x4b\x26\x8d\x47\xf2\x1a\xc3\x04\xd1\x4d\xf7\x65\x8e\x78\x8b\x8c\x4d\x15\x37\x79\x2c\xb7\x60\xe9\xe5\x04\x83\xe8\x97\x51\xcb\xfa\x9e\xd8\xc3\xe2\x9e\x98\x26\x0d\x9f\xc9\xd1\x9e\x52\xfb\xd9\x17\x72\xca\xb9\xa0\x46\x40\xa4\xf7\x43\xc7\xf9\xf5\xce\xc9\xd5\xb9\x1e\xe6\xc2\x73\x40\xd1\x8c\xcf\x34\xc8\x34\xfb\x35\xae\xfe\x57\x16\xc6\xa5\xb9\xc8", 183, { 0xef, 0xfd, 0x81, 0xc1, 0x6c, 0x60, 0x89, 0x07, 0x98, 0xf3, 0x9c, 0xe6, 0x82, 0x4e, 0x17, 0xaa }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0e\xaf\x59\xf8\x36\xdb\x60\xd5\x3b\xb6\x08\xef\xa5\x4c\x6f\x3b\x59\xfc\xfe\x33\x1b\x65\x70\x1a\xa4\x7c\x82\x5d\x5c\xc0\x36\x15\xb5\x84\xc3\xaa\x24\x6b\x1c\x91\xbc\xf3\x1b\x35\x68\x28\x4a\xf4\xc4\x78\x4e\x40\x99\xa7\xf1\xe6\xf3\xd9\xca\x6b\xe1\xcc\x8b\x92\xc9\x29\xe7\xfb\x65\xef\x1e\xe5\x5e\x0f\x26\x14\x83\x17\x77\xce\xa6\x06\x74\xff\x13\x3e\x71\x7c\xae\x97\x65\x64\xa8\x8f\x2d\xa3\xdd\xa0\x7a\x90\xce\xaa\x59\xb6\x36\x90\x5d\xb0\x4b\xdf\x6b\x2e\x92\xa8\x22\x14\x5f\x6e\xe5\xc1\xe8\x3b\x86\x6d\x05\xcd\x90\xab\x87\xee\x31\x0e\x32\xe1\xc2\xe8\x58\xf8\xf5\x2d\x13\x43\x9a\x77\x1e\x62\x0e\x23\x50\x7c\x40\x98\xb7\x48\x61\xa8\x4d\x48\x28\x0e\x59\x16\xbf\x17\x65\xd7\x4d\x5e\xd8\xcc\x21\xb0\x2f\x07\x78\x0e\xdc\x3a\xeb\xd0\xbb\xab\x78\xe6", 184, { 0xe5, 0xf6, 0xa3, 0x02, 0x8d, 0x9c, 0x95, 0x97, 0xf0, 0x29, 0x88, 0x10, 0x26, 0xed, 0xac, 0x58 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x2d\x43\x2a\x3a\xd3\xc6\x68\x31\xe9\x1e\xd8\x51\x3c\xd0\xee\xfd\xc9\x90\x15\x5b\xf4\xef\x78\x56\x62\x32\x6d\xbf\x73\x3f\x7e\x8e\x5f\xb1\x16\x47\xec\x0a\xc5\x78\xc9\x08\x30\x5e\x8b\x10\x98\xa8\x41\xc7\x05\x53\xb5\xc0\x0e\xb4\x42\x4f\x48\x94\x4d\x7c\x49\x75\x61\x13\x58\xf3\xeb\xd9\xb2\x46\x8e\xd9\x7b\xe4\x24\xdc\x40\x43\x53\xf6\x25\xbc\xc7\x3d\xb0\x8b\x11\x95\x30\xf3\x1c\xa7\xcb\x7f\x47\xf0\x23\x62\x24\xf5\xa5\x00\xcd\x95\x6e\x86\xde\x77\xd9\xb3\x12\xa1\xa9\xba\x7d\x2a\xd0\x40\x63\x08\xda\x80\xb4\x03\xf9\x8e\x25\xcb\xad\xb9\xec\x24\x10\x09\x18\x3f\xbb\xe7\x8a\x25\x58\xdc\x94\x4c\xc6\x72\x2c\x4c\xe2\x37\xcc\xab\xf8\xdf\xea\xd4\xc6\x89\x0f\x27\x29\x1a\x97\x2a\x67\xc6\x04\xdc\x18\xad\xfe\x2a\xb1\xa1\xeb\x7b\xae\x06\x27\x66\x5c\xd3\xe0", 185, { 0x57, 0xa9, 0xed, 0x9a, 0xe3, 0x2c, 0x62, 0x78, 0x43, 0x4c, 0x1b, 0x41, 0xd3, 0x3c, 0x09, 0xe6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x83\x40\xb5\x91\x5f\x27\x52\x19\x89\xcc\xaa\x77\xc9\x1f\x9a\x25\x71\x38\x7b\x0d\xcb\xd8\xe7\x2c\xb1\x97\x9b\xc2\x3c\xb0\x78\x33\x94\x65\xa4\x7e\xe7\x10\xcd\x57\x75\xc8\x8e\xe2\xc7\xac\xea\x0e\xff\xcf\xf5\x8c\x4b\xc0\x91\x6b\x74\xb4\x56\x52\x93\x52\x8b\x59\xe2\x1b\x51\x84\xb0\x75\xe0\xdc\x6e\x52\xe8\x2c\xe7\x81\x19\x55\x8d\x91\xbe\x4e\xee\x5e\x84\xbc\x46\x39\x59\x2a\x2d\xb8\x70\xe5\x71\x17\x60\x77\xfe\x49\x6c\xbe\xfa\x9f\xde\xa8\xed\x14\x8c\x8d\x1e\x32\x7c\x28\xf9\xa5\xa4\x33\xab\x5b\xca\x9f\xd0\x54\x8a\x6d\x44\x0b\x76\x2c\x16\x81\x57\x0f\x9b\xe2\x92\xaa\x9e\xd6\xa6\x49\xb5\x67\xd2\xed\xaf\x8a\xd3\xe4\x29\x4c\xcb\x04\x40\x9a\x3e\x83\x60\xad\x35\x76\x3b\x10\x85\xe4\xd6\x4f\x2a\x87\xbd\x3e\xcc\x1e\x57\xe3\x64\x71\x54\x01\xf8\xe3\x42\x42", 186, { 0xcb, 0x49, 0xbe, 0x32, 0xa6, 0x87, 0x50, 0x00, 0x6b, 0x95, 0x12, 0xf2, 0x40, 0x2b, 0x3e, 0x10 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x82\xad\x3f\x00\xef\xbd\xc9\xaf\x43\x2a\xb1\xeb\xd9\x52\x2f\x1a\xc8\x92\x0e\xbe\x62\xa1\x08\x5a\xd6\x89\x2c\xfd\xf5\x43\x7b\x6f\x11\xef\x93\xf7\x01\xad\x83\xc7\x42\x1b\xbd\x06\x38\x6b\x29\x78\x92\x1f\x56\xcb\xcb\x64\xcb\x80\xcc\x09\x7c\x73\xae\x1a\x58\x09\x9e\x1d\xff\xf6\xda\xe8\x91\xa8\xd7\x1d\xa2\x54\x85\x44\x49\x9b\xaa\x83\x58\xd8\x6b\xfc\xa6\x09\xea\xc3\x87\x57\x08\x7a\x5d\x43\x4b\x8c\x48\x6f\xdb\x02\xf8\x07\xa7\x05\xa4\xca\xa5\xf1\x13\xb9\x36\x11\xd8\x5a\xa7\xfd\x9b\xa9\xd4\x8d\x91\x9c\xe7\x79\x0d\x52\x3e\x8f\x30\xd7\x6b\x8f\xbd\x96\x54\xa6\x07\x5c\x7b\x85\x0b\x04\x59\x1e\x9a\xc5\xe3\xfb\xaf\x14\x2e\x3b\xdf\x37\x2e\x29\xee\x68\x9a\x7a\x7d\xa2\xec\x23\xe1\x0b\x84\xd5\x10\xfd\xec\x16\xb5\xb2\x36\xfd\x63\x8c\x82\x8a\xe5\xff\x9c\x9f\xb4", 187, { 0x19, 0x6a, 0xcb, 0x09, 0x35, 0x27, 0xb3, 0x8d, 0xd4, 0xcb, 0x04, 0x0f, 0x85, 0xa6, 0x19, 0x58 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x1c\xc2\x9f\x82\xba\x82\xa2\xf3\x43\xc2\x52\x6b\x18\xda\x65\x02\xa2\xdb\xb7\x94\xf6\xf3\x03\xf6\x24\xe8\x3e\x43\x1d\xc2\x90\x54\x3e\x86\xef\x4d\x7d\x1c\x5a\x54\x2f\x52\xb0\x5d\x73\xf9\x2a\x21\x3f\x2d\x7b\x2d\x05\xb3\x83\x17\x01\x7b\xaa\xcb\x22\x44\xdf\x03\x92\x5e\x2d\xd5\xe4\x8b\xf7\x66\xd9\xff\xd0\xbc\xcf\x87\xf9\xb2\xc7\xc6\x78\x04\x11\x99\xd1\x8a\x96\x9c\x64\x82\xc2\xc6\x62\x06\x0c\x30\x6d\x9c\x23\xf3\xcc\xec\xb6\x2e\x48\x8c\xe0\x27\xa6\xf8\x2f\x89\xc0\x9d\x50\xcb\x42\x14\x58\xb1\xfe\x6c\xb1\xec\xed\xa0\x9f\xdd\xc3\x27\x6e\x78\x2d\xab\x3a\x43\xaa\xd1\x5b\x7c\x03\x37\x6b\x5a\x68\x7c\xf4\x6c\x29\x78\xbb\x1e\x0e\x8c\xa3\x5b\x53\x15\x40\x4c\x43\xfa\xf9\x3d\x6f\x65\xd9\xa1\x8b\x8f\xf2\x2c\xe6\xb3\x6e\x1e\x85\x24\x33\xa0\xdb\x7a\x32\x46\x26\xe8", 188, { 0x6e, 0xa3, 0x09, 0xda, 0xde, 0xad, 0x44, 0xc1, 0x7b, 0x3f, 0xcd, 0x70, 0x94, 0x3c, 0x2a, 0x39 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4d\xb5\x68\xa9\xe3\x5e\x00\x99\xf9\x68\xe5\xe0\x06\xac\x80\xc9\x5b\xda\x23\xb1\x2d\xb9\x29\x1a\x40\x8b\xaa\xdf\x32\x8e\xdb\x82\x62\x9f\x01\xa1\x7b\xfa\x10\x88\xa1\x1c\xe4\xdf\x36\xc9\x1b\x84\x49\x2a\x8d\x74\x9b\x0e\x69\xe2\x50\x51\xed\x6a\x2f\x5a\xc1\x5f\x96\xbd\xf1\x40\xfd\x02\x85\x4a\x24\x7d\xbf\x27\xdc\x5c\xf1\xc4\x6f\xbf\xf8\x40\xae\x01\x59\x00\x95\x16\xf6\xdf\x9c\x0d\x6c\x83\x9d\xb4\x0c\xcb\x5c\x5a\x75\x64\xb8\xaf\xcb\x7b\x6d\xc8\x96\x8c\x84\x3f\x39\x59\x58\x78\x0c\xf7\x45\xfe\x19\x02\xee\x0b\x70\xf1\x2b\x26\x27\x84\x8e\xe7\xf2\x5a\x90\xd6\x5b\x9f\x5d\x72\x9e\xe2\x39\x4d\x23\x04\x8d\x54\x98\x4c\x92\x2d\xaa\x98\x99\xb9\x61\xaf\xf4\xb9\x16\xb1\x85\x8c\x11\xaf\xe1\x16\xc3\x57\x1f\xbd\x9c\xc8\x43\x8d\x8a\x84\x42\x7b\x10\x83\xb2\xc7\xfe\x64\x10", 189, { 0x84, 0x35, 0x9a, 0xad, 0x8c, 0xa1, 0x8d, 0xfc, 0x2a, 0xaf, 0xbc, 0xa9, 0x59, 0x79, 0xf1, 0xae }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7a\xd3\xbf\xad\x0f\xab\x95\x35\x2e\xe6\xe9\xdd\x93\x58\x68\x29\x0e\x26\x43\x57\xa3\x43\x1e\x6b\xd1\x87\x20\xd8\xf0\x69\x2b\xc8\xb3\x59\x25\x08\xce\xbd\x75\x93\xb1\x85\x8a\xba\x71\x6d\x95\xec\xc8\xcf\x57\x28\x33\x22\x14\xfc\x39\x13\xa7\x38\xcc\x3e\xaf\x34\xc8\x89\xe7\xbb\x98\x1d\x94\x93\xf8\x02\x17\xaa\xd5\x56\xa2\xdf\x50\x2a\x07\x69\xe1\xf9\xac\xe8\x98\xc6\x9b\x06\x7f\xd1\xb6\xca\x1c\xf5\x08\x79\x13\xa1\x36\x29\xe7\x71\x14\xe3\xe1\x68\x53\x74\x09\xcc\x59\xd0\x51\x9f\x29\x24\xd2\xb5\x81\x77\x2d\x77\x03\xfc\x14\x32\x8b\xf6\xe1\x1c\x9f\x48\x63\xe5\x04\x98\xba\xf6\x6d\x1f\x58\x4a\x4f\x11\x27\xe5\xd0\xa3\xc9\xf4\xdd\xbd\xfb\x83\x5a\x3e\x13\xd5\x75\xe6\xa8\x63\x14\xe5\x50\x74\x6c\xfd\x84\x55\xb3\x56\xa0\x36\xed\xde\x07\xa1\xe3\x5a\x64\x97\x33\x0e\x0b\x49", 190, { 0x15, 0x6b, 0xec, 0xbe, 0xf4, 0xb1, 0x19, 0x29, 0x9b, 0x9c, 0x5a, 0x59, 0xd9, 0x1c, 0x8f, 0x68 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x80\x05\x7d\x70\xc9\xfe\x0a\x49\xd8\xf3\x91\x31\xd1\x47\x63\xd8\xea\x8b\x46\x25\x39\xed\x95\xa6\xa8\x3d\x85\xb2\x06\x9d\x82\x1e\x38\xc5\xb8\x98\x8d\xf0\xad\xa3\x2f\x67\x0b\x2f\xb4\xa8\x7c\xd4\xd4\x33\xae\xab\x36\xf0\x76\xc9\x63\x40\x10\x59\xdc\x9e\x84\x55\x46\xf2\x25\xe1\xc3\x72\x34\x44\x5d\x35\xa1\x83\x9c\x56\xf1\x9c\x37\xc1\x3b\x5c\xe7\x9d\x4c\xdd\x56\x56\xea\xa0\x37\x45\x36\x43\x6f\xff\x2a\xdf\x70\x37\x42\x00\xa7\x51\x38\x42\x0b\x84\xe7\x84\xd6\xaa\x51\xcc\x51\xa7\xbc\xb7\xc7\x74\xf7\x9b\x9b\xc7\xba\x3b\x76\x61\x2b\x25\x98\xf3\x7d\xac\x50\xae\xb3\x7e\x87\x66\x83\xe1\x76\x61\x55\x8e\x78\xc2\x6a\x2a\xf9\x8d\x1a\x5d\x8e\x56\x36\x91\x1f\x8b\x8c\x49\x3f\x5a\x88\x1b\x9c\x40\xf7\x4c\x92\x30\xe7\x06\xda\x5c\xab\x38\x5f\xa2\xfb\x0a\x31\x96\x37\xfc\x92\x28\xcc", 191, { 0xaf, 0x3e, 0x62, 0xef, 0x2b, 0x45, 0x27, 0x17, 0x20, 0x4f, 0x50, 0xb2, 0xb9, 0xa7, 0x9b, 0x48 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9a\x2e\xf2\xaf\xde\x68\x21\x07\x22\xd0\xfd\xe7\xc0\xb0\x16\x39\x48\xc6\x0d\xb6\x5d\x0b\xfc\x11\x2c\xb2\x83\x34\x8a\x2c\x70\xa1\xa9\x68\x0a\xfb\x77\x19\xfa\x9e\x94\x2f\xd7\x68\xed\x67\x4c\x9b\xfa\xfe\xe8\xdb\x90\x81\x82\x51\x63\xc0\x47\xf2\x1c\xe0\x62\xda\x13\x90\x46\xd2\xaa\x54\x9b\xf1\x45\xfd\xc3\x5e\xe9\x39\x07\x33\x70\x46\x63\x7d\x66\xc2\xea\x60\x84\x9f\xd7\x57\xc7\x32\x32\x9a\x2b\x6a\x1c\x98\x09\x1d\xb7\xa3\x0a\x7e\xb4\xac\xc7\xab\x7a\x23\xff\x63\xf0\x00\x74\xd5\xe7\xe0\x62\x93\x27\x47\x9d\xa6\x14\x04\x46\xbb\xfd\xb2\x29\x7a\x02\x5a\xb6\xf7\x9f\x36\x9a\x41\xd9\x91\xfa\x18\x03\xca\x4c\xbd\x2d\x77\xd1\xe1\x2a\xa5\xb3\xbf\x3d\x3e\xb7\x45\x60\x84\x9e\x6d\x30\xb9\x1e\xab\x78\xe1\x78\x7f\x58\x9f\xb6\x2a\x11\x3c\x83\x7d\x70\xc7\xa6\xcc\xd5\x56\x1d\x02\xe0\x6a", 192, { 0xc8, 0x67, 0xcd, 0x31, 0xf4, 0xb8, 0x95, 0x60, 0x67, 0xc3, 0xcd, 0x10, 0xe4, 0x31, 0xe5, 0x8e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd2\xce\xb7\x71\xfc\xfc\xf5\x64\x15\xde\x32\x91\x73\xe8\x2b\x73\x86\x5c\x8e\xbd\xad\x1a\x65\x76\xb5\x99\x1c\x3d\xee\xf3\x30\xae\xec\x1a\x76\xdd\xd7\x28\x06\xff\x6f\xd5\xc2\x29\xa1\x02\x86\x30\xbe\x72\xee\xaf\x5e\x98\xbe\x26\xd0\x8a\xf2\x3f\x3c\x15\x63\x2d\x58\xeb\x13\x2d\xc3\xf8\x15\x2e\x01\xd3\x1c\x8d\x14\x4f\x9e\xf9\xb3\x30\xa4\x76\x2a\xfa\x31\x7d\xcd\xe5\x4c\x40\x1a\xee\xac\x0a\x6a\x07\x00\xc5\x54\x6f\xd8\x96\x9f\x1c\x33\xa3\xe1\x54\xa6\xf4\xb8\x5a\x25\x77\xa4\x46\x71\x1d\x80\xee\x1e\x23\x9b\x00\x40\x6b\x77\x32\xb2\x08\x1d\x90\x02\xd9\x1b\xf4\xfc\x4c\x1c\x94\xd1\x44\x22\xb5\xe4\x15\x62\x7e\x32\xac\xbc\xe7\x5b\xcc\xd5\xd0\x51\x73\xd3\x2e\x9c\x5b\xb4\x60\x47\x9c\x4b\xa0\x6b\x6e\xd9\x94\x55\x0d\x44\x04\x57\xb5\xf6\xa7\x28\xcd\x55\x16\xf8\x20\xda\xe2\x15\x46\xd0", 193, { 0x0e, 0x63, 0xa1, 0x87, 0xec, 0x2a, 0x99, 0xd9, 0x1d, 0xec, 0x28, 0x37, 0x05, 0xb3, 0xe9, 0x44 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc1\x33\x21\xab\xe3\x5b\x83\x03\x63\x73\xed\x2b\xd9\x66\x72\x72\x0c\xef\xbb\xf6\xc4\x07\x23\x20\xbe\xe9\x02\xbf\xb9\xbe\x08\xc4\xae\xeb\xbf\x98\x1c\xf3\x32\x16\x81\x09\xac\x28\xe5\x36\x99\x01\x8f\x23\x8a\xf4\xdb\x84\x54\xf0\x24\x21\x57\x99\xdb\x82\xdc\x03\xb9\x37\x98\x0d\x11\xc1\x4e\x58\x3e\x21\x90\xe3\x3c\xfa\xa5\x44\x53\x65\x86\x85\xee\x51\x03\x99\x8a\x95\x03\x7a\xca\x94\xe8\xe0\xa7\x8c\x11\x9f\xc4\x7b\x79\x9e\xdf\xae\x7c\x6f\x64\xe7\xba\x90\x1c\x2a\x14\x3d\x02\x24\xd4\xf0\x36\x39\xe9\x77\x0b\x29\x4f\xaf\x3b\x5d\x8d\xe2\x3a\xd4\x58\xbb\xa7\xa5\x55\xe2\xdf\x30\xfc\x38\xac\xe5\x98\xb0\x1b\xb0\x6b\xc8\x6b\x00\xee\xa3\x21\x73\x35\xc5\x39\x20\x71\x6a\x77\x80\x90\x83\xdb\xf9\xff\x4e\x32\x09\x8f\x91\xc9\x0b\x75\x72\x3d\xa9\x6b\xf6\x6e\xdf\xf5\x14\x92\xa7\xbe\x75\x65\x47", 194, { 0xa3, 0x61, 0x94, 0x86, 0x67, 0x56, 0xab, 0x69, 0x85, 0x9b, 0xbc, 0xa2, 0x1c, 0x09, 0x1e, 0x31 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x21\xcb\x7e\x33\xc3\xcb\xbd\xa0\x5d\xc8\xe1\xa6\x97\xee\x36\x10\x10\x17\x6b\xc4\x7a\x4d\x82\xc9\xe3\xdd\xe0\xfa\x0e\x14\x84\x46\xff\x99\x54\xa1\x96\x66\x93\x8b\x53\x65\x70\x3b\x38\xa3\xb7\x68\xcc\x33\xaa\xb3\x3b\xa2\xeb\xb4\x9b\x12\x90\x9f\x49\xf5\x59\x93\x72\x68\xfd\x7f\xae\x29\xa0\xb1\xc6\x37\x62\xfc\x96\x05\x11\x86\x0e\x5a\xfe\x2c\x52\xc8\xed\x92\x01\xc6\x26\xca\x93\x6c\xa8\x9f\xdc\xcb\x7d\x80\xad\xe7\x29\x04\x9a\x53\x3c\x1e\xd5\x67\x07\xde\x39\x1f\x6b\xe1\x63\x93\xcd\x57\xfb\x0f\x25\xaf\x11\xce\x36\xe1\xa1\x58\xd8\x57\x39\x75\x71\x79\xb2\xcc\x82\xd4\x19\x1d\x5d\xe6\xb2\x18\xf5\x88\x12\xd8\xce\xf8\x6b\xff\x13\x82\xe5\x6e\xc6\xcb\x27\xa1\x11\xba\xf4\xa6\xbc\x04\xf2\xb8\xb8\x52\x87\x7c\xd8\x10\xdc\xd7\x9f\xd4\x03\x6a\x34\x69\x35\xab\x72\x78\x34\xa1\x1c\xd2\xcf\x3c\x2e", 195, { 0x6f, 0x1c, 0xed, 0x06, 0x68, 0x7c, 0x13, 0x93, 0x1d, 0x84, 0xbc, 0xd5, 0x40, 0xbb, 0x5a, 0x78 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5c\x84\x4e\x4e\x98\x3f\x2a\x61\xcc\x41\xd8\x3a\xd1\x1c\xf1\x6e\x79\xda\x1d\x43\x9e\x3e\x27\xc7\xc3\x22\xba\xfc\x6a\xff\xbb\x31\xf2\x8b\x42\x6c\x29\x7d\x35\x03\x76\x6c\x83\x4a\x9c\xd5\xfb\x66\x2c\x3c\xc6\x40\x8a\x69\x87\x95\x99\xd3\x0e\x2b\x06\x1b\xb3\x1e\x2e\xaf\x55\x59\xad\x8f\xef\x20\x84\x2c\xd3\xc9\xe6\x6c\x87\x8b\x9f\xcb\x39\x6e\x22\x9b\xdf\x62\x2d\x6c\xef\x6c\x1b\x86\xb8\xfb\xc6\x93\x5c\x59\x16\x5a\x6a\x3d\x2b\xa6\x1c\x7d\x23\x45\x2a\xe0\x88\x2c\x48\x11\x59\xb8\x43\xb0\xb3\x0f\xb4\x83\x1c\xa5\x5e\xca\x6c\xda\x2a\xb0\x59\xc1\xbc\xdd\x9d\xfc\xb1\x28\xc6\xc3\x78\x6a\x9a\x03\xca\x6e\x24\xa3\xc7\x04\x5f\xe1\xae\x35\x7e\xdb\x39\x90\xd6\x2a\x93\xa3\x69\xa9\xf7\x86\x10\x53\xe6\x91\x44\x4a\x04\x2d\x89\xf4\x90\xc8\x77\x40\x7e\xe2\x66\x07\x33\x45\xb5\x8d\xdd\x51\xb7\x26\x6c\x75", 196, { 0x26, 0xa3, 0xf1, 0x62, 0xb9, 0x04, 0xc2, 0x92, 0x0c, 0x08, 0x6f, 0x8a, 0x4a, 0x9e, 0x80, 0xaf }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3b\xf5\x30\xba\xb7\xd0\x10\x79\x11\x3f\x64\x2d\x09\xa4\x70\x63\x45\x74\x7e\xce\xfa\xa3\x97\x77\x35\x1e\xdd\x11\xc4\x72\x88\x6a\xc3\x8a\x7b\xfe\xc6\x95\x82\xa6\xa0\x06\x2b\x6d\xce\xb5\x3e\x83\x83\x23\xda\x4b\x51\xda\x2d\x8f\x71\xf3\xcf\xd3\xaf\xb2\xbc\xc7\xf5\x4b\xec\xd6\x72\xc8\x91\xdb\x66\x02\xec\xf3\x8d\xcc\xcc\x6d\x25\x30\xa5\xde\x9e\xd1\x49\x52\xde\x6f\x45\x9d\x2d\x89\xdb\xcf\xc4\x1d\x97\xc5\xed\x8b\x90\xdc\xd6\x98\x3d\xc1\xf8\x8e\xf1\x64\x1f\x80\xf4\x0b\x15\xaa\x40\x83\xef\xf7\xd5\x71\xf3\x9d\xb9\xc6\x24\xe4\x90\x50\x6d\x04\xd3\x6e\x66\x2b\xb0\xdc\xc5\x9d\x7e\xac\x64\xf6\xdb\x56\xea\x8b\x65\xe6\x19\xef\x11\x53\xb4\x91\x2b\xf0\x0b\x82\xea\xfc\x24\x55\xaf\x54\x88\x20\xda\x48\xa7\x9e\x49\x8a\xe8\x76\x6f\x42\x51\x97\x0c\x3f\xd0\xba\x8e\x49\x24\x09\x04\x92\x6b\xde\xbb\x4a\x48", 197, { 0x8e, 0x2a, 0x66, 0x4b, 0x0e, 0xe7, 0x3f, 0xaa, 0x95, 0xa8, 0x6c, 0x1d, 0xeb, 0x22, 0xdb, 0xd8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa4\x77\x52\xb0\xda\x4f\x08\x52\x36\x26\x41\xa1\xe6\xc2\x55\x7f\xf1\x8a\x53\x87\xbc\xe0\x55\xf7\xa9\x19\xef\x39\xda\x15\xc1\x0c\x13\x80\x2c\x53\xbe\xa4\x21\x7a\x07\xe8\x15\x81\x27\xe8\x11\xa7\xbf\x32\xe5\xb3\x5a\x9b\x7c\xe1\x15\x3d\x4b\x68\x5b\x0e\xe4\xa4\xc8\x1d\xa7\xe5\x2f\x6b\x97\xd4\xb7\x63\x4a\x7c\x20\xf7\xfa\xfc\x23\x59\xba\xc8\xf8\x53\xc2\x97\xf1\x44\xeb\xed\x44\xb8\x36\x45\xe6\xa2\x86\xda\x92\x38\x6e\x12\xe8\x6b\x25\x88\xb3\x02\x96\xb4\x43\x52\x94\x39\xf9\x9c\x2b\xcc\xe1\x03\x12\xbc\x79\x28\x3c\x21\x90\x64\x8d\xa5\x4a\xa1\xaa\xea\x40\xd6\xe9\x97\xc4\x1d\x68\x02\x42\x72\x39\x7b\xc2\x0a\xbb\x33\x89\x4d\x04\xc8\xdf\x72\x7a\x6e\xec\xb6\x81\xbb\xbc\x39\x4e\x0f\x62\x75\xda\x9d\x38\x5b\xf3\x1b\x44\x0c\x6c\x02\xb6\x31\x75\x82\x8d\xf7\x05\x06\x5a\xaa\x73\x5f\x1d\xed\x25\x8f\x4b\x93", 198, { 0xfd, 0x93, 0x65, 0x5a, 0xe8, 0xb0, 0xde, 0x62, 0x06, 0x84, 0x76, 0x4f, 0x5b, 0x47, 0xf7, 0xd4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x5f\x35\xf1\x1e\x3d\x90\xf2\xd2\xbc\x31\x6c\x74\xf2\x42\x39\xa4\x5e\x6c\x92\xd4\x5a\x6a\xcd\xe4\xad\x28\x47\x5c\x3d\x97\x5c\x45\xe1\x10\x93\xa4\x55\x62\xd7\x94\x46\x7a\xe0\xff\x8e\xae\xb1\xf9\x7a\xa6\x3a\xb9\x46\xe7\x1d\x34\xaa\xfd\x8d\x57\x8d\x45\x53\xe1\xd8\x54\xeb\xdc\x66\x07\xcb\xb6\x17\x28\xc3\x00\x04\xba\x7f\xc2\xcc\xe2\x2a\x78\x0d\x72\x2d\xae\xef\x12\x15\x33\xda\x0d\x93\xfd\x47\xb6\x9c\x99\xb4\x75\xb1\x4c\xb1\x71\x39\xcc\x18\xdb\x0a\x94\x5a\xd5\x06\xe8\xf3\xfe\xe2\x65\xff\x9c\x02\x44\xe7\x64\x80\x2b\x34\xe8\x4c\xaf\x84\x9e\x6d\x6b\x99\x88\x66\xb6\x8f\x85\xb3\x03\x26\x34\x73\xda\x3d\x81\x1f\x6f\x60\xcd\x78\xdc\x78\xbe\x7f\x00\xa1\xa0\x9e\xf3\x19\x76\xe4\x25\x53\xa2\x6e\x12\x2b\x2c\xe1\xa3\x35\xb2\x13\x25\x2e\xed\xc9\xde\x94\xdb\x9b\x51\x51\x8e\xf4\x10\x93\x91\x36\x39\xb7\xf2\xfa", 199, { 0x05, 0x5a, 0x5c, 0xa0, 0xac, 0x17, 0x39, 0x3b, 0x11, 0x90, 0x08, 0xf7, 0x91, 0x12, 0x33, 0xbd }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8e\x63\xf1\x75\x35\xb3\x43\xf6\x08\x8a\x03\x8b\x9a\x0b\x36\xc4\xc8\x20\xf9\x8f\xf7\x37\x4a\x42\xef\x0d\x6f\xb8\x53\xa2\x06\x92\xbc\x4c\xaa\x9f\x72\xe8\x3f\x56\xc6\x2b\xdb\x80\x0f\x16\x51\xf2\x3f\x88\x5b\x78\x21\xed\x63\xce\x31\x15\xee\xc8\x17\x1f\xa6\x91\xc2\x94\x02\x10\x1e\x90\x94\x66\x71\x1a\xef\x94\x57\x95\x32\x3a\x58\x50\x36\x7a\x23\x38\x50\xfb\x6a\xad\xc3\x09\x59\x71\xc5\xda\xb3\xbd\x2c\xec\x8c\x6e\xb5\x89\x9d\x5c\xf1\x6c\x47\xcb\xcd\x7e\x27\xfb\xbc\xb9\x52\xda\x83\x2e\x2d\xda\xa0\x21\xec\xdd\x58\x52\xa5\x4b\x5c\x57\x10\x46\x17\x24\xdd\xf5\x97\xad\xb2\xfd\x15\xa2\xc0\x0e\x22\x59\x01\x99\x71\xca\x10\x9f\x3b\xb3\xa4\xa5\x52\xdc\xaa\xc4\xc6\x75\xff\xdd\x2e\x9b\xc7\xe9\x94\xf9\x6d\x6e\xff\x8b\x37\x0d\x9d\x7e\x84\x38\x8d\x34\xa5\x02\x47\x63\x56\x0f\xa9\x5d\xd8\xaa\x9e\x6a\xac\xf5\x6d\x51", 200, { 0x09, 0x82, 0x5e, 0x9d, 0x4d, 0x7d, 0x4f, 0xf4, 0xcb, 0xc6, 0x86, 0xe7, 0xc4, 0xdb, 0x1a, 0xb4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xed\x3b\x9c\xf6\x4b\x62\x7e\x1d\xa0\x7c\x60\x4d\x30\x7c\x4c\xcf\x82\x05\x78\xd6\xd5\x5e\x4e\xb8\x41\x82\x19\x5a\x6c\x55\x49\xab\xe5\xf0\x63\x47\x20\x1d\x88\x3b\x0e\xde\x9f\xe8\x59\x28\x22\x00\x39\xad\x82\xae\xf6\xd7\x38\xd2\xfa\xd0\x69\x6a\x92\xbe\x35\x0c\x41\x0c\x9d\x8f\xc1\xe4\x0e\xca\x97\xb9\x8e\x74\x51\x00\x82\x2a\x5f\xfe\x19\x90\x8c\xbc\x59\x8f\x17\x18\xc4\xbc\x72\xf6\xa6\xd8\x96\x93\xfe\x74\x01\xfa\x07\xad\x4d\x8f\x62\x15\x6e\xc8\xe1\xb2\x88\xfc\xf2\x20\x6b\x53\xa6\xd1\xac\xde\x5d\x75\x61\xc0\x10\x75\x78\x89\x3b\x98\xb4\xa3\x65\xc9\x46\xe5\x4d\xf0\x04\x45\xb3\xfc\x48\xaa\xc0\x02\x68\xe0\x12\x7f\xcd\xa5\x68\xb9\xb2\xe0\xe7\x44\x7b\xf1\x07\xa1\xaf\x23\x1d\x01\x94\x3e\x85\x27\x66\x3a\x6b\x6b\x33\x0e\x36\xda\x56\xa5\x93\x7b\x8e\xf2\x19\xad\xba\x1a\x9e\xac\x33\xd0\x16\x32\xc6\xbf\x22\x3a\x4c", 201, { 0x67, 0xe6, 0x8a, 0xc1, 0xa4, 0x4c, 0x07, 0xb7, 0xd2, 0x7e, 0x82, 0x85, 0x0f, 0x8c, 0x27, 0xed }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x20\x3d\xdf\xe8\x6b\x7e\x63\xdd\x2a\x0a\x4c\x0a\xe8\x1a\xa9\x02\x49\xa5\x73\xcc\x33\xaa\x0e\x34\x2a\x1c\xef\xcc\xba\x69\x57\x82\x0d\xa9\x3d\xdf\x9c\x60\x49\xda\x02\xf0\xfd\x57\xec\x9e\xee\x3f\x2d\x3e\x30\x3c\xee\x7e\xd1\x11\x03\xcd\x7b\x95\x58\xe6\x3d\x4a\x8a\xfd\x63\x9e\x92\x84\x81\xbd\x9c\x9a\x8f\x11\xf6\x11\x2e\x57\x24\x1a\x09\x5f\x10\x8f\x57\x60\x5e\xdd\x7c\xf5\xde\x8c\xcf\xb8\x1b\x6d\x77\x7a\x10\x5f\x6e\x1c\xfa\xbd\xa7\x0d\x49\x68\x4c\x60\xb0\x6c\x20\x88\x5b\x51\x04\xb4\x40\x01\x95\xc1\x8f\x51\xf2\xe0\x43\x2d\x9b\xc6\xda\x65\x75\x89\x21\x0e\xea\x1e\x29\x96\x2d\x6c\x56\x68\x9b\x0c\x95\x38\x3d\xa0\xad\xeb\x6a\xcd\xaf\x26\x89\xd6\x88\x72\xf5\xd6\xb5\x09\xf9\x9a\x15\x40\xfa\x19\xda\x90\xb4\x90\x99\x42\x9c\x3e\x82\xb7\x65\xb9\xa9\x51\x9f\xec\x82\x02\x79\xae\x6c\x6f\xa7\xff\x64\xc0\x5f\xe1\xda\x07", 202, { 0xee, 0x3e, 0xeb, 0xd8, 0x7a, 0x38, 0xa2, 0x68, 0xcc, 0xf5, 0x88, 0x6a, 0xe0, 0x3a, 0xba, 0xac }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7d\xd1\xa0\x4a\xc6\xe0\xff\x2e\x49\x73\xe4\x42\xe1\x93\x38\xe6\xd8\xf2\x4d\xd7\xa6\x7b\x74\x58\xd7\x94\xab\xfd\x0a\xf3\x73\x17\x15\x1a\xc0\xb7\x46\x70\x0a\x61\xc5\xfe\x81\x4f\x15\xc3\x5d\x5e\xb9\xb4\x53\x99\xf3\x53\x23\x61\xa7\xea\x4e\x36\x5f\x64\xe6\x24\x68\xc9\x7d\xcc\x19\x54\x3f\x0e\x33\x33\x1c\x50\x64\xdb\x1d\x6e\xe6\x05\xd8\x3e\x44\x48\xff\xbe\x3d\x54\x12\xdc\xc1\xc8\x35\xe2\x18\xb1\x1c\x7d\x22\xa0\x22\x68\xb9\x67\x79\xba\x32\x6f\x7c\xc8\x03\xb9\x21\xb8\x7e\x6f\x8a\xa3\xbc\x26\xba\x66\x95\xb3\x64\x06\xcb\xa7\xdf\xbd\x46\x68\x37\xa5\x7a\xed\x5d\x00\xe4\x15\x7e\x22\xb4\xa5\x71\xfb\x85\xdd\x49\x45\x47\xb5\x0a\x46\x3e\xb9\x79\x42\x23\x7e\x0c\x81\x68\xc0\x01\xf8\x99\x19\x8b\x97\xde\x60\x26\x2f\x9d\x9c\x0c\xfd\x3c\xa4\xc0\xd7\x04\x54\xc7\xf1\x21\x6e\x76\x4c\xc6\x0a\xe7\xbd\x6d\xbb\x05\x96\x3c\x40\xc7", 203, { 0x5d, 0x3b, 0xc3, 0x5e, 0xdc, 0x45, 0x22, 0x74, 0x96, 0x59, 0x61, 0x19, 0xb7, 0x97, 0x5f, 0x60 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf3\x83\xe4\x7a\xa2\x62\x73\x36\xb0\x88\xd9\x72\x8c\x16\x58\xb4\xdb\xa1\x65\x61\xd7\x56\x20\xb2\x64\x39\x6f\xc7\xb1\x86\xb6\xd6\x87\x38\x34\x7c\x32\xa7\xfd\x34\x08\x4c\x90\xe5\x9a\xa1\x14\x95\x77\x23\x34\x3c\x97\x79\x93\xb3\x6b\xaf\xee\xcb\x7f\x9b\xcd\x7a\xc8\x60\xe6\x31\x90\x10\x0e\x49\xfb\x6d\xdc\x9b\x35\xc8\xdc\x2e\x3a\x0b\x6d\x0b\x41\xd2\x38\x2d\xc6\xb3\x4d\x95\x32\x9e\xdc\x79\x2a\x60\x8c\x9c\x71\x42\x7b\xb9\x7b\xce\xd3\x19\x8f\xb1\x05\x44\x97\xbc\xa5\xd4\x87\x05\xe2\x65\x68\x2a\xa0\xa8\x00\xb5\x34\x97\x20\x9b\xbb\xc3\x8a\xdf\x17\xc8\x7c\x54\x88\xe3\xdd\x7f\xe3\x9a\x03\x9a\x71\x99\x1f\xb5\x66\x9d\x46\xf8\xfb\x89\x1c\x03\x2b\x96\x1f\x76\x08\xa8\x8d\x8c\xb7\xbb\xf3\xe2\x0e\x7c\x54\x56\xc8\xf4\xf2\x0b\x63\x5f\xbc\x88\x97\x1b\x53\x00\x72\xbc\xbb\xac\x14\x3c\x9b\x54\x05\x50\x30\xee\x2e\xd5\xd4\x5d\x7b\x69", 204, { 0x91, 0x24, 0x52, 0x7f, 0x19, 0x7f, 0xae, 0x81, 0x27, 0xa6, 0x98, 0xe8, 0xa1, 0xc3, 0x1d, 0xf4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x27\x5a\x0a\x17\xd7\x70\x10\x2a\x12\x21\x49\x22\x85\x26\x19\xc5\x0f\xd4\x44\x4c\x07\x9a\x47\xbe\x26\xa7\x51\x5b\x13\xa8\xe1\x2e\x8a\xaf\xfd\xc6\x28\x2f\x0c\xfe\xd5\x24\x51\xf7\xce\x50\x04\x27\x4d\x9f\x0e\x8b\xd8\xac\x62\xf8\x23\x5c\xf3\x8f\xa3\xa8\x55\x4f\xb1\x79\xf4\xc5\x56\xac\xeb\xde\xb9\x35\x82\xdd\x22\x5f\x47\x67\xaa\x31\xc7\xbb\x82\xed\xe9\x00\xdc\xb2\xe8\xb7\x79\x41\xeb\x50\xd0\xdc\x43\xd8\xd8\x4a\x40\xcf\x72\xf8\xb0\x18\x76\x39\xf5\x09\x59\xae\xc2\xa2\x78\xc1\x72\xdb\x03\x4b\x05\x16\x89\x56\xb7\xb4\x1b\xfc\x3f\xc4\x20\x6e\xa1\xd5\xb5\x11\xb0\xec\xbe\xc2\x24\x91\x8e\x3a\x53\x04\x2f\x8d\x90\x8d\x4e\xcd\x1d\xf1\xc6\xcb\xcd\x00\xc7\xfd\x3b\x4c\xa3\x7b\xa1\xf4\x35\x24\x56\x9e\xee\xdd\xe6\x83\x7d\xf9\xcf\xa3\x1a\xb5\xd6\x1a\x70\xda\x04\x8b\x25\x85\x41\xb8\x07\x03\x8b\x34\xd4\xd6\xd3\x2f\xa6\xd5\x74\x71\xf9", 205, { 0xaf, 0x74, 0x5b, 0xa6, 0xbe, 0xb5, 0x95, 0xdd, 0x3a, 0xa9, 0x3e, 0x1c, 0x12, 0x8f, 0x4a, 0x81 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6f\x51\x62\x5a\x10\x89\x45\xae\x9c\xda\x85\x1d\x18\x8f\x28\x99\x68\x27\x60\x0f\x33\x84\x40\x28\xe2\xcc\x8c\xbc\xc8\xe0\xa9\xd4\x5c\x77\xb3\x5a\xa1\xd6\xad\x5f\xa6\x2e\xd3\x09\x29\x92\x0c\x17\x57\x93\x7c\x13\xaf\x7a\x35\x13\x04\x21\x0d\x2b\xa1\x6e\x8a\x72\x86\x6d\xfa\xaf\xd1\x09\xa0\xa1\x38\x67\x08\xe8\xb3\xe0\x7c\x93\x37\x98\x8f\x47\x9c\xbf\xd6\x08\xa0\x64\xb7\xa7\x04\xf1\x59\xc8\xd4\x47\xbb\x8f\xc4\x77\xe0\xe7\xb6\x19\x28\x6f\x58\x4d\xbb\x01\xeb\x4c\x1e\xdf\x1e\xa9\xe7\x7c\x18\x2a\x8d\xe5\x95\x3d\x59\xca\x28\x19\x79\x2d\x9e\x72\x33\xa6\x83\xd8\x37\x50\xbe\xad\x0d\x54\x57\xc1\xad\x10\x5a\x8c\x2d\xe3\xd3\x07\x95\x97\xf8\x27\xce\x6c\x66\xf7\xb9\xbd\x84\x51\x5d\x51\x04\x38\x38\x41\x88\xd5\xb6\x81\x61\x0d\xbf\x0c\x72\xbb\x6b\xb0\x33\x8f\xd1\x73\xd1\x82\xfd\xa1\x73\xf5\xff\x73\x98\x65\x20\x5e\x9c\xcd\x30\xf5\x5a\x99", 206, { 0x69, 0x2b, 0x76, 0x76, 0x70, 0x75, 0xc8, 0x00, 0xd0, 0x62, 0xd9, 0xc8, 0xd8, 0x37, 0xe6, 0xe6 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xfb\x7b\xea\x42\xda\x09\x8b\x8a\x65\x58\x9c\x56\x46\x2c\xc5\x23\x29\x5e\x33\x26\xcf\x84\x00\x04\x42\x3e\xb0\x2b\x23\x20\xd7\xcb\x1f\x37\xd9\x75\x80\x3a\xca\x4e\xe0\x4f\x73\xef\xf8\x76\x76\xdd\x96\x96\x89\xa0\xad\x22\xde\x82\x86\x68\xa3\xe6\x15\x76\xa5\x42\x66\xa9\x10\xba\x36\xd3\x51\x5a\x9e\x08\x1c\xf0\xea\x06\x89\x84\x88\x3e\x59\x75\x1c\x83\x57\x32\xb1\x4e\xda\x91\x09\xab\x67\xcf\x15\xc4\x73\x25\x80\x08\x45\x03\x65\xf8\xfa\xec\x22\x8e\xa3\xed\x44\x4a\x89\xbb\xa1\xda\x90\x68\x85\x65\xb9\xc2\x04\x74\xc1\x48\x6f\x7d\xe7\xca\xe1\x0e\xcb\x9c\xf9\x93\x72\x76\xa2\xc4\x66\xeb\x0d\xad\xfa\x84\xc0\x5b\xab\x79\xc8\x20\xa2\x0b\x0a\x84\x57\x81\xb8\xc8\x4f\xbc\xdf\x17\x05\x79\x1c\x4c\xe7\x23\x6f\x5a\x77\x53\x27\x5c\x92\xe5\xfd\x3a\xce\xb8\x3d\xf4\xfc\x01\x1f\x8e\xcd\x4c\x34\x99\x90\x11\xfc\x59\x19\xef\x94\x98\xbe\x88\x8c\x06\x7b", 207, { 0xdc, 0x06, 0x1a, 0x7c, 0xe0, 0x3b, 0x42, 0x40, 0xac, 0xe3, 0xdd, 0xf7, 0x63, 0xae, 0xaa, 0x36 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\xd7\x4b\x35\xf2\xdc\xab\x1b\x79\xa9\x55\x29\x39\x47\x48\xc6\x80\x28\xe3\x8e\xdc\xbd\x07\x2a\x51\x24\xea\x5a\x37\xff\x7b\x14\xae\x60\x6d\xc6\xbf\xe0\xe3\xb8\x11\xcf\xb6\x8d\x45\x85\x66\xe8\xee\xd7\x9a\x2c\x30\xa5\x55\x5b\xf4\x91\xb8\x20\xc5\xca\x6e\xe8\x4a\x06\xb7\x2a\x60\x8e\x15\xc8\xd4\x73\x8d\x8d\xba\xde\x9a\xd6\x6c\x85\xb4\x4e\x22\x3a\x77\xd2\x2b\x9d\x74\x73\xc6\xf2\x91\x99\x9f\x0d\x1d\x44\xe9\x6a\x74\x6e\x14\x59\x4b\x8d\x2c\x56\x99\x35\xce\x77\x23\xd9\xc7\xfe\xa2\xb1\x4a\x0e\x92\xb8\xce\x7b\x9a\xcd\x82\xba\x93\xf9\x6e\xf7\x36\xd0\x27\x46\x67\xf0\x2e\xf1\x18\xa7\xe7\xf0\xdb\xb1\x31\x76\x08\x1e\xa6\xa8\x87\x52\x70\x68\x3b\x26\xc6\x50\x0c\x2d\x02\xbb\x8e\x11\x61\xfd\x53\x1b\x56\xb2\xca\xd1\x8b\x34\xd2\xb9\x75\x26\xdf\x3c\x92\x2d\xc7\xa6\x42\xbf\x2a\x4a\x40\x13\x7c\xc2\xbb\x38\xb1\x54\x15\x42\x83\x71\x37\x9f\x63\x57", 208, { 0x90, 0x71, 0x3e, 0x92, 0x18, 0x0b, 0x7f, 0xec, 0xf7, 0x44, 0x3a, 0xd3, 0x5c, 0x05, 0xb4, 0xfe }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8f\x87\xfa\xd6\xa7\x92\x5a\x2f\x63\x63\xc6\x17\xd7\x82\x1a\xdc\xc2\x48\xd8\x9f\xab\xf3\xd1\xbf\x97\xd9\x6d\x57\x64\xba\x97\xdd\xc6\x2e\x47\xeb\xdb\x3d\xad\x1a\x6c\x0d\xf7\x0a\xc2\xb6\xbf\x7f\x23\x32\x14\xa6\xe8\x70\x24\x75\x3c\x87\x83\x30\x73\x07\x1a\x07\x04\x6c\xaf\xdd\x25\xac\x0c\x23\x01\xf0\xcf\xe3\x99\x5f\xce\xd9\x34\x15\x24\xbb\x84\x32\xdc\x9a\x57\x0f\x39\x60\xf6\x8c\xa0\x79\x1e\x85\x23\x8f\x98\x63\xab\x6d\x77\xce\xc1\x05\xee\x80\xf9\x8d\xcb\x35\xfb\xc3\x94\xbf\x2f\x52\x3d\x35\x05\x4d\x83\x4b\xde\xd8\xe7\xbd\x9a\xe6\x4a\xe6\xbf\x1c\x22\x6d\x42\xd4\x56\x1e\xf6\x3f\xbc\xd7\x8e\xa2\x2c\x99\x50\xc1\x41\xbe\x59\x59\xac\x4a\x87\xc6\x34\x59\x06\xc5\x4e\xb8\x7a\x54\x54\x90\xc6\xb6\x65\x3d\x77\x92\xda\x3e\xd1\x3b\x60\x45\x74\x0b\xb7\x6d\xa9\xe8\x06\x8b\x4f\xe8\xd8\x9c\x5c\x11\xb7\x5e\x12\x39\x63\xfc\xc1\x0c\xaf\xe1\x32\x2c\xf9", 209, { 0x72, 0x27, 0x02, 0xd5, 0x86, 0x5b, 0x0b, 0x2b, 0x77, 0x13, 0x3a, 0x71, 0x39, 0x5b, 0x88, 0x5d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xae\xb7\x73\x44\x46\xcd\x54\xf4\x06\x6b\x5f\x25\x12\xea\xe3\xa8\xcb\x90\xad\x9a\x5c\xba\xef\xa3\x74\xa6\x3c\xc8\x0e\xda\xb0\xee\x6b\x35\x2d\xec\x22\x90\xc0\x4b\x4e\x11\x21\x9d\xe5\x0c\x59\x77\x28\x95\x7e\x0c\x36\xa6\x9a\x67\xbc\xe9\xaa\x44\xc7\x24\xc2\x8c\xba\x3f\x4e\x6c\x5b\xf2\x73\x11\x07\x0f\x93\x01\x06\x69\xef\x19\xf9\x60\x68\x1f\x70\x0a\x5e\x03\x98\x00\xb9\xb7\x11\xc2\x06\xa8\xde\xc8\xb9\xd7\x76\x26\x91\x99\xf7\xda\x19\xe7\x7a\xb6\x4a\x63\x81\xe4\x4e\xe8\x8d\x1b\x5f\xcc\xcd\x5d\xce\xb5\xf0\x6a\x20\x14\x1c\xc5\x52\x43\xf7\x60\x3e\x37\xe2\xe6\x16\xe2\x45\xa5\x0c\x28\x05\x17\x14\x7b\x12\x0b\xc1\x15\x1e\x75\x4c\xd1\x68\xce\xb4\xa7\xb6\x29\xff\xc2\x61\xd4\x9e\x40\x8a\xa7\xee\x85\x6b\xec\xdb\x3c\xc8\xeb\x9f\xec\x83\x10\xa8\x32\x4f\xbb\x98\xa1\x7d\xa4\x66\x33\xf2\xe9\xa2\x6a\x3a\xb6\xd5\x07\xb5\x90\x06\x66\xef\x3e\x59\x74\x0e\x54", 210, { 0x00, 0xbf, 0x87, 0x36, 0xd5, 0xe8, 0x54, 0x2f, 0x00, 0xca, 0x28, 0x9c, 0xe1, 0x28, 0xe5, 0x7e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x4e\x64\x5d\x38\x78\x24\xa4\x15\xb7\x32\x9f\xda\x8c\x13\xf9\x1f\x4d\x04\x3b\x07\xe1\x26\x16\xc2\x17\xd6\x4f\x2c\xa4\x1b\x47\x93\xb7\x39\x26\x96\x3b\x62\xa4\x28\xa8\x8c\x74\xb4\x86\x5e\x4d\x5b\x80\x44\x95\x58\x21\xa2\xac\x85\x2d\x24\xd3\xf7\x9e\x34\xb8\xc3\x3a\x85\x9f\xe4\xcd\xcc\x2e\x35\x09\x8f\xd5\x98\xf6\x15\xd8\x39\x17\x7d\xfa\xed\x1b\xeb\xc8\xb4\x3c\xdd\x7f\x5d\x38\x9c\x9b\x49\xea\xcd\xfd\x47\x85\x27\xb7\x9f\x6c\x3f\x77\x2a\xb0\x7f\x8f\x9e\x26\x35\x9d\xe8\x24\xc7\xdc\xb2\xd9\x05\x05\x04\x46\x97\xe3\x06\xdd\x95\x72\xe3\xb4\x35\xb3\xca\x66\x9f\x0f\x0e\x86\xdd\x65\x6e\xc1\xee\xb2\x6e\x8f\xf9\x5c\xe4\x95\x9f\x1b\x8f\x9b\x69\x84\xe0\x25\x61\x34\xdd\xb0\xbc\x95\x1b\x8b\xb4\x50\xe9\x4f\x74\x4f\x8c\xfc\x2d\x6d\xa4\xb1\x46\xbd\xad\x07\xb0\x74\xa1\x0b\x57\x74\xbb\xd7\xb4\x76\x57\xcc\x7f\xd2\xf5\x6e\x82\xee\x5d\xdc\x89\x41\xdc\xea\x76", 211, { 0xfa, 0xb4, 0x08, 0xeb, 0xfa, 0x54, 0xe3, 0x20, 0xe9, 0x99, 0x17, 0x29, 0x29, 0xf5, 0xeb, 0xb1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x03\xac\xdd\x71\x73\x72\xc2\x3c\xc4\xe0\x6b\xa4\xa5\x7b\x07\x13\x6c\x77\x5d\x43\xde\xbe\xa5\x0d\x9d\x0f\x03\x5f\x2e\x43\xa1\x4c\xa6\xab\x67\x3e\xf1\x96\x5a\x47\xbf\xef\x8e\x94\x0c\x02\xc9\x02\x4a\x5f\xb6\xcb\x2c\xd7\xc3\x59\x11\xa3\x98\x3b\x0c\xa5\x33\x35\x8c\xc6\xa4\x71\xad\x7e\x62\xd4\x1a\x72\x49\x6c\x9c\x37\x31\x05\x44\x34\x2c\xdb\x31\xa6\x5b\x69\xff\xbe\x6d\x60\xcc\xe5\xb6\xb3\xe8\x1f\xe8\xcf\x18\x8d\x70\xe8\x87\x0c\x6f\x6f\x4a\xfc\x53\xa0\x8e\x1b\x12\x37\x61\x8f\x03\x42\x19\x02\x59\x12\x65\xe7\x3c\x4b\xee\xdc\x85\x1b\xa9\x28\x16\x87\xbc\x63\xd4\xe1\x0a\x35\x43\x56\x5d\x36\xbc\xa3\x2f\xf5\x4d\xe8\x15\x15\x2d\x95\xc9\x91\xda\x81\xd2\x1f\xd1\x19\xd2\xb2\xea\xb5\x6c\x1a\x4d\x06\xcf\xc7\x14\xac\xe4\xab\x7f\xe4\x10\x3d\xce\x5f\xa6\x99\xbf\x2d\xec\xc4\xa4\xd8\xc8\x0e\x20\x8e\x08\x90\x7e\x76\x4b\xd5\xad\x23\x8e\x95\xdc\x26\x57\x9d\xae\xbd", 212, { 0xe8, 0x18, 0xd0, 0x40, 0x9b, 0xb0, 0x23, 0xd1, 0x12, 0xb7, 0xa8, 0xcc, 0xdb, 0xb8, 0x5e, 0xb0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x78\xca\x1a\xaa\x80\x33\xe3\x1f\xc4\x67\xae\xd5\x05\xcb\xc5\x3c\xbe\x26\x67\xcd\x0d\x38\xc9\x7b\x3b\x84\xae\x48\xea\x2f\x9e\xf3\xda\x01\xc6\xce\x57\x88\x6b\xae\x43\x5b\x0c\xfd\xbc\x7c\x14\xe9\x69\xd7\x39\xbf\x66\xe7\x74\x52\xc9\x78\x9d\x95\xd1\x87\xa2\x49\xab\x45\x63\xcf\xe0\x3a\x2e\x1f\x5e\x87\xd2\xd1\x20\x44\x62\x59\x7d\x08\x88\x50\x0b\x86\x83\xed\x2d\x54\xbe\x92\x40\xc7\x0e\x83\x5e\xfb\x88\xb1\xcd\xef\xfd\xb5\x08\xcd\x14\xd8\x67\x46\x02\x4e\x6d\x1c\xe8\x84\xae\xb9\xc8\x8f\x5b\xfd\x25\xc3\x6c\x15\x37\x65\x68\x86\xc8\x78\xd4\x4a\xae\xb3\x36\x11\xe5\x94\xc4\xa8\x48\x8e\xae\x77\xec\x5e\x05\x24\x1a\x7c\x46\x56\xe6\xac\x87\x94\x70\xb3\x3d\x4b\xb7\x27\xa8\xee\x15\x60\xdc\x38\x5b\x8b\x6c\x8d\x89\xdd\xb4\x7e\x2a\xe3\xc3\x6c\x4a\xf8\xe3\x43\x15\xd1\xc7\x68\x0e\x32\x51\xae\xe8\xc3\xfd\x81\x05\xfd\xed\x25\x88\x3f\x91\x19\x19\xfd\xf2\x95\x35\x17\x9c", 213, { 0xc0, 0xa9, 0x36, 0x91, 0xae, 0x59, 0x54, 0xe1, 0x90, 0xbf, 0x8f, 0x65, 0xc7, 0x08, 0x89, 0x62 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x33\x2e\x48\x26\xaa\xc6\xb5\x5f\xb4\x64\xa5\x17\x12\xf1\x50\x87\xa6\x52\xd0\x5e\xbd\x82\x34\x69\x6f\x4a\xb4\xdd\x1f\xa0\xfe\x44\x1e\x9a\xaf\x02\x6c\x0d\xdd\x83\x9e\xc7\xd1\x04\xdb\x64\xd2\xfa\x00\xd1\x1c\x22\xe4\x5b\xf0\x26\xb5\x73\xc5\xe9\x81\x00\x9c\x70\xd1\x61\x71\x6c\x70\xfe\xcd\x68\x49\x89\x78\x8b\x6e\xd7\x4c\x0b\x35\x55\x26\x2f\x7d\x28\xf5\xfe\x0e\xe5\xf4\x89\x1e\xea\xf4\xd2\xf0\x57\xd2\x58\x97\xac\x09\x40\xd9\x01\x60\x21\x2f\xdc\xc4\x6c\xe8\xb2\x30\x77\x6c\xfd\xc8\x24\x9e\xf6\x06\x32\x5b\xf0\x0b\x20\x20\x51\x17\xb9\xc8\x2d\x14\x41\x72\x80\x4d\x3a\x81\x08\x3c\xd3\xbd\xbd\x80\xee\x96\xee\xed\xcd\x89\xfa\xbe\x58\x9c\xa7\xe5\x0d\x03\x22\x83\x84\xe5\x93\x74\x9e\x38\x5c\x01\x4a\xc8\xef\xb9\xf3\x57\x49\x59\x89\xdf\x0f\xe8\x2b\xf3\x43\xe0\x6e\x43\xa3\x86\x4d\x3e\x9e\x5b\xad\xd2\xf4\xab\x8b\x4f\xe9\x42\xc4\x69\x25\x3e\x80\x5c\x2b\x00\x3c\x2a\x74", 214, { 0x60, 0x47, 0x87, 0xbd, 0xbc, 0x4a, 0x9d, 0xcc, 0x51, 0x19, 0xbe, 0xfd, 0x54, 0x82, 0x87, 0x82 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3c\x73\x00\x28\x30\xe9\xb7\x78\xf2\x94\x76\x9a\xe1\x27\x74\x62\x3d\x3c\xdb\x7a\xd3\x1d\xc8\x3e\xd1\x2e\x6f\x36\xb8\xfb\x5c\x31\x6f\xda\xd4\xfa\x73\x3d\x5a\xba\x2c\x96\x4d\xea\x5b\xe7\xae\xf2\xb0\xe5\x00\x63\x78\xc8\x48\xce\x74\xb2\x34\x3f\xc5\xb9\x58\x59\x03\x93\x93\x0f\x6c\xdd\x90\xfc\x39\x08\x69\x60\x0c\xe0\x65\xb8\x86\xba\xe2\xf9\xf6\x3a\x4e\x68\x2c\xbe\x4f\x19\x6b\x6b\x03\x02\x7c\xd2\x61\xbb\xdf\x3e\xbe\xd4\x1d\x9c\x6c\xd2\x39\x08\x7d\xc8\x45\xf0\xa5\x8f\x10\xe7\x3d\xa2\xfd\x08\x64\x98\xef\x05\x40\x3e\x60\xcb\x62\x50\x91\xd3\x48\xd4\xdc\x08\xfc\x14\x25\x50\xd9\x36\x6f\xba\x6d\x79\x8a\x42\x7a\x0e\xea\x43\x17\x91\x94\x7a\xf4\x22\x31\xb2\xba\x25\x45\x12\x91\x92\x79\xff\xbb\xf9\x14\xaf\x5d\x16\x88\x4c\x5e\x0c\x29\xc0\x68\x42\xf8\x23\x0c\xd7\x9e\xbf\x02\xc3\x74\xbc\x8e\x8b\xbf\x6d\xfd\xa0\xf9\x35\x4f\x55\x4a\x17\xef\x7c\x16\xda\x9d\x9c\xb0\xd5\x6c", 215, { 0x9f, 0x07, 0x30, 0xc6, 0x81, 0xe5, 0xb3, 0x2c, 0x28, 0x8e, 0x78, 0x51, 0x93, 0xde, 0x42, 0x5f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd0\x2c\x5c\xe7\x3f\x51\xc7\x4f\x33\xad\x1b\x00\xd8\xc3\x58\xf2\x93\x60\x5f\x5a\xfd\x0c\x7d\x70\x7b\x9b\x98\x4c\x7b\xe3\xf4\xea\x4d\x87\xa3\x4c\x9b\xf2\x87\xbe\x87\x60\x05\x35\x60\x16\x48\xd1\x00\xb2\x2f\x82\xc4\x9d\xd4\xc6\x29\x9c\xba\x90\x00\x86\x92\x45\x4d\x10\xaa\xdf\xc2\xc4\xf3\x34\xd3\x10\xad\x51\x76\x7b\xb1\x00\x79\xf2\x5b\x6a\x7f\x41\x12\xd5\x98\x9d\x75\x8d\x7c\x5e\x23\xe1\x64\xc9\x27\x45\x86\x0b\xfe\x95\x2b\x43\x47\x79\x6e\xb6\x07\xe3\x93\x26\x95\xb5\x01\x3c\x28\x80\xdd\x22\xfb\x68\x45\x2d\x1a\x23\x26\xb8\xcd\x20\xbb\x0c\x9e\xc4\xa2\x7b\x07\xcf\x9c\x8c\xbd\xdd\xe1\x50\x93\x09\x1e\xd3\x0d\xac\x0d\xae\x82\x43\xae\xba\xec\x6f\x27\xdf\x50\x15\x35\x0a\xc4\xa5\x4e\x3d\x22\x78\x55\xc0\x48\x53\xf9\x75\x08\x09\xab\x49\xb3\x3c\x3a\xc6\x3d\x43\x0c\xc6\x0d\x28\xfb\x42\x64\xc8\xc9\x49\x67\x1d\x42\x0c\xca\x99\xed\x16\x1b\xa8\x6e\x98\xa8\x58\x7b\xe2\x0f\x15", 216, { 0xa6, 0xa5, 0x85, 0xaa, 0x5a, 0xae, 0x5b, 0xdc, 0xc7, 0x29, 0x53, 0x55, 0x13, 0x71, 0x93, 0xef }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x79\xee\x60\x8d\xb2\x17\xf0\xb2\x35\xe7\xbd\xde\x4b\x0d\x79\x10\x91\x6d\x35\x54\xb7\x52\xab\x41\xd4\xbf\x28\x9c\x63\xe3\x14\x1b\xde\xaa\x1f\x43\xf5\x70\x0a\x72\x6b\xd0\x0f\xf9\x8e\x9b\xef\x61\x51\xe5\x96\xcf\x07\x39\x6c\x82\xbe\xec\x3a\x78\x36\x8f\xb7\x30\x7d\x7e\xaf\x8b\x28\x95\xcf\xcc\x2f\x02\x0f\xbe\x66\x36\xbc\xf5\x94\xf6\x21\x2c\x32\x8e\xd1\xce\xc1\x24\x94\x90\xc8\x2a\xec\x3b\x69\xed\x42\x87\x9f\x4b\xb2\x23\x17\x81\x70\xd2\xa7\x22\xd5\xaf\x6f\x24\x0a\x91\x8b\x15\x50\x89\x72\x6b\xe9\x88\xee\xf8\xa6\x1e\xb8\x7c\x0e\x5d\xaf\x55\x28\xdc\xb5\x51\xe6\xd7\x26\xa4\x2e\x74\xf6\xf5\x85\x20\x66\x92\x5a\x18\x63\xc4\xed\x04\x7b\x3e\xda\xbd\x7c\xaf\x46\x2f\xab\x77\xa5\x5a\x9e\x76\x25\x73\xb7\xff\xba\x27\x3d\xeb\xc7\xff\x18\xca\x66\xde\x29\x35\x54\xa8\x44\x3f\x7c\xfd\xcb\x0a\x1e\x23\xe8\x75\x9c\x02\x66\xf3\xe1\x48\x2d\x77\x6e\xad\x58\x8b\x02\x51\xf5\x80\xe6\x41\x58", 217, { 0xf2, 0xd7, 0x83, 0x16, 0xed, 0x22, 0x8c, 0xde, 0xa0, 0xe8, 0x95, 0x2a, 0x6c, 0x79, 0xc1, 0x12 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc0\xd2\x18\x1c\x3f\x7f\xc2\xb7\x10\xca\x5c\xb9\x14\x82\x37\xa1\xcd\xce\xfc\x5c\x50\x3e\xe9\x5b\x59\x6c\x39\x4f\x79\x4e\xa2\x84\x6a\x1c\xf8\xd7\x83\xd8\xef\x56\x46\x7f\xfd\x72\x17\xca\x5e\xe3\x08\xa1\x31\x19\xcf\x1d\xc0\x5a\xd9\x38\xdd\x7c\x77\x14\x67\x41\x37\xe4\xec\x4a\x4e\x7b\x68\xba\x30\x6f\x2c\x68\x42\xea\xda\xc0\xa7\x0d\x8d\x37\x37\x00\x15\x68\x8e\x9a\x60\xd0\x40\xaa\xf4\x23\x2a\xe0\x98\x48\xe4\x5b\x13\xf8\x52\xd0\x0c\xee\x5a\x53\x10\xcc\xb0\xc6\xb2\x8a\xcc\xdb\xcd\x9b\xfd\xc7\xe5\x9e\x97\x85\xac\xbd\x48\xc3\xa0\xa6\x89\x6d\xd1\x24\x30\xd5\xc1\x59\x22\x7c\x64\x9a\x25\x80\x46\xe7\xd3\xa1\xcc\x05\xaa\xf1\x92\x3a\x41\x18\xf4\xa5\x95\x41\xa8\x37\x82\xa5\x88\x52\x4d\xb2\x6e\xfc\x5e\xd7\x39\xc0\x0b\xef\xec\x21\x8f\x47\xf5\xbc\x19\x4e\x8a\xf9\x01\xd8\x2f\x6d\x15\x0e\x55\xd0\x12\xf6\x1c\x96\x2e\x9b\x39\x2c\xd2\xd9\xf3\xd0\x65\xc7\x47\x0d\x44\xc1\x2c\xd2\xce\x10", 218, { 0xdf, 0x39, 0x06, 0xcc, 0xa4, 0x24, 0x46, 0xc5, 0xa8, 0xd7, 0xba, 0x98, 0x18, 0xc2, 0xff, 0x44 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf1\x2e\x9b\x39\xc2\xab\xcc\xdf\x49\x44\x7d\x55\x70\x03\x57\xc4\x45\x3b\x43\xf5\xf7\x5f\x39\xbc\xfd\x7e\x36\x02\x56\x5c\x4c\x6d\xeb\x2e\xd3\xae\x10\xf1\xbd\x66\x29\x67\x07\xb6\x69\xaf\x4c\x62\xb6\x80\x74\xa1\xa9\x02\x89\x83\xb1\x49\xaa\xff\x57\x6e\x18\x98\x9c\x4c\x6e\xac\x7e\xd4\xed\x59\x99\x0e\xf5\x0c\xeb\xac\x90\xa7\xb0\x4c\x29\x4e\x6c\x4b\x5a\xcf\x07\x40\xe3\xac\x12\x1c\xb6\xc5\x27\xdc\x2e\xa6\x6f\xe8\x60\x6b\x3e\x0c\x8a\x4c\xd8\x10\xa9\xc9\x57\xf5\x26\x73\xa4\xcf\xb0\x54\xa3\x3a\x25\xfc\x6b\x7a\xa9\x29\xb2\x33\xda\x12\x48\xc1\x1a\x50\xba\x35\x0b\x6a\x17\xed\x19\xfb\xcf\xcf\x30\x82\xb6\x22\x8f\xc6\x28\x08\xb4\xe4\x47\x9c\x77\xf6\x60\xa4\x33\x62\x6c\xf3\x1f\xbc\xb2\x5e\xba\x59\x8a\x58\x65\x71\x3c\x2d\x0a\xf0\x06\xd8\xfa\xd9\x3c\x81\xd5\x57\x8a\x96\xa2\x62\x55\x84\xff\x0a\x40\x12\x72\x64\xcb\x5a\xdd\x0e\x15\x66\x10\x5f\xc2\x63\x79\x30\xf7\x84\xf6\x42\x82\x76\xcb", 219, { 0x9a, 0x70, 0x70, 0xa9, 0xb4, 0x61, 0xe5, 0x09, 0x0c, 0xb2, 0x96, 0x1f, 0xf2, 0x98, 0x95, 0xe3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x4a\x17\x7b\xaf\xa0\xb6\x26\x01\x80\x28\xb2\x18\xfa\xa7\xfe\xb7\x7c\x9d\x29\xa0\xfa\x85\xc6\x3f\xb7\xee\xbc\x87\xb3\x9e\xbd\xdb\xb1\xd3\x61\x22\xe4\xa5\xde\xfd\x35\x87\x66\x15\x34\xec\x1d\x8d\x98\x06\xb6\x97\x74\xa9\xa9\x22\xf9\x4e\x13\xb1\xe2\x34\x29\x47\x80\xa1\x5a\x7e\x62\x47\x01\xb8\xa0\xc1\xc4\x6c\xc4\x3c\x8c\xa2\x56\x33\x21\x7a\x03\x52\x60\xe6\x69\x7c\x1c\x77\x82\xe8\x8f\x55\xaa\x66\x7b\x49\x4e\xc0\xe2\xf4\x33\x3b\x5e\x23\x60\x3d\x1e\x3a\xaa\x08\x7d\xcc\xda\xa4\x40\x4d\x7c\xdb\x6c\xdf\x47\x5e\xc2\x48\x24\x06\xd9\x05\xdd\x34\xd6\x78\x63\x59\xc9\x3c\xbc\x91\xa7\x99\x87\x6a\xe0\x13\x2d\xc4\x9d\x1d\xa6\xd0\x98\xeb\xe5\x3a\x97\x65\xe1\x63\x86\x37\x41\xc7\x30\x05\xa4\x7e\x9a\xbc\x8a\xde\xfc\x04\xe2\x3d\x5d\xd1\x30\xd4\xc9\x19\x5a\xbf\x32\xa0\x10\x20\xe1\xee\xd7\x64\x97\x63\xb0\x9e\x44\x61\x69\x0f\x63\xa7\x7f\xc7\xf0\xbe\xae\x64\x07\x8b\x18\xf9\x1b\x05\x0d\x0b\xcf\x01", 220, { 0x8a, 0xd2, 0x4d, 0x87, 0x81, 0x67, 0x56, 0xc3, 0xa6, 0x51, 0x29, 0xe9, 0xa8, 0x9f, 0x1d, 0xc2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7d\xb5\x74\x2a\xf7\xeb\x20\x0c\x5d\xdb\x67\x4f\x27\x6f\xb9\x00\x50\xef\x58\x0b\xe0\xc4\xf3\xc5\x17\x57\xe4\xa6\x33\x18\x03\x14\xdf\x9b\x25\x5a\x38\xdc\x35\xb7\x7c\xa3\xec\x93\x51\x03\x30\xcd\xb0\xfc\x07\x2f\x6c\x40\x36\x03\x63\x13\x7a\xbf\x3f\x4b\x62\xdb\xe9\x77\xc7\xc3\x8c\x1c\xe9\xe8\x41\x1a\x28\xf1\x5c\x2e\x5c\x10\x52\x91\xd1\x6f\x46\xbd\xe2\xc8\x2f\x4f\x30\x14\xa6\x08\x80\x5b\x51\xed\x2f\xaa\xe8\x8f\x52\x23\xe1\x65\x6e\x2e\xbc\x55\xd0\xce\xed\x51\x8b\x0e\x61\x1e\x0c\x99\xae\x30\x5b\x69\xdc\xb2\xf0\x98\xca\xa2\x30\x52\x3f\x18\x83\xec\x8e\xa6\x12\x0d\xe5\xdb\x22\x0a\x32\xe2\x08\x50\xb1\x48\xc8\xfa\x17\xdb\x4e\x83\x54\xad\x48\x95\x09\x38\x9e\x00\x86\x9b\x8f\xc6\x7e\x03\x69\x53\x4a\x25\xe5\xca\xd6\xe7\x1d\x7a\x2c\x1e\x2a\x6f\x9b\x72\x5e\x25\x83\x5e\x1b\x58\xc0\x54\x4e\xf7\xb1\xfd\x8c\x36\xe4\x9e\xc7\xc2\x60\x96\xac\x10\x8e\x04\x9d\xcf\xc4\x85\x46\x7c\x6f\x1b\xde\x13\xdd", 221, { 0x11, 0xa3, 0xea, 0x6a, 0x2d, 0xee, 0x6c, 0xd5, 0xd4, 0xd9, 0xde, 0x9e, 0x00, 0x76, 0x0c, 0xd3 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x29\xfc\xe3\xa5\x9b\x13\x7b\xb3\x22\x8c\xc0\xf4\x9d\x7e\x20\x9a\x93\x0d\xe1\x0c\xdd\x5c\x93\x6e\x61\x30\xa4\xc8\xf8\x22\x12\xd5\x71\x80\x3b\x6b\xaf\xc2\xd0\x81\xed\xa4\xe8\xe2\x22\xe4\x31\x6d\x80\x9a\x41\x06\x16\x2f\x0a\x1d\x95\xfb\x6c\xd9\x2f\x7f\xe5\xe0\x9b\x3c\x63\xc5\x35\x2e\x3a\x0f\x43\xe8\x31\xe2\x53\x4d\xb7\x4d\xc0\xe8\x33\x2f\x53\xe9\x79\xc6\x05\xbd\x58\xd6\xe2\x48\x50\x72\x0a\xc2\x61\x6a\xd2\x2b\xfe\x51\x07\x6c\x21\x29\x52\x0c\x78\xad\xb7\x8b\xbd\x3b\x38\x5f\x23\x5d\x96\x88\xec\xf3\x37\xd2\x17\xfe\x23\xa7\x37\x0b\x28\x8e\x5f\x3a\x1e\x44\x3a\xe9\x45\x75\x37\x02\xca\x17\xe1\xdf\x69\x64\x4c\xd5\x2c\x72\xab\x64\x51\x70\xff\xf9\x49\x7f\xea\x5d\xdd\x2a\xa2\xbe\x6b\x84\x01\x58\x4f\xdd\xb8\xc0\x5d\x20\xa4\xcd\x8a\xcc\x39\x23\xaa\x8d\x1b\x5d\x53\x76\xcb\xd6\xe1\xde\x7e\x15\x93\xd4\x0a\xd3\xd3\x40\xf9\xa9\x93\x97\xc0\x5a\xd3\x3a\x09\xbb\x3f\x6c\x2d\x3b\xf4\xee\xbe\x13\x63\x39", 222, { 0x88, 0x92, 0xcd, 0x7f, 0x51, 0x5f, 0xd0, 0x0d, 0x4e, 0x0f, 0x7b, 0x98, 0x75, 0xa3, 0xbc, 0x7e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x3f\x0b\x4e\x57\xf7\xe5\xf0\x5f\xda\x6b\x3a\x8b\xa8\x10\x37\xf8\x12\x45\x90\xf9\x16\x5b\x2c\x17\x6c\x10\xef\xa9\x18\xb8\xa4\x0c\x20\x09\xf5\x80\x58\x83\x97\x9f\x59\x7a\x82\x7b\x90\xc2\x5e\x52\x72\xf5\xfa\xf0\xcd\x63\xf5\xa2\x3a\x97\x7f\xd2\xaf\x82\x3a\x44\x31\x47\x3a\xec\xa6\xa2\x2b\x69\xc8\xf6\x92\x22\x36\xf1\x2c\xfc\xa5\xde\x72\xb5\x33\x86\x3e\xe0\xdc\xc4\x87\x7d\x05\xa4\x48\x34\x36\x37\x80\x2e\xe5\xf6\x52\x91\x6d\xd0\x4c\x96\x1e\xd3\xc4\x48\x6d\x73\x5e\xda\x4c\x79\xab\xa5\x95\x8a\xec\xbe\x9f\x52\xf4\x31\xf3\x4e\x2b\xdc\x19\x34\xaf\xe9\x8b\xff\x94\xe9\xcb\x9a\x4c\x8a\x90\x28\x22\xf5\x1c\xee\xe0\xc6\xa9\xde\x91\xa9\x01\xc1\x61\x8d\x2d\x00\xa0\x88\x45\x0e\xe5\x47\x67\x75\x4f\x30\xc2\x7c\xe7\x16\xd2\x72\x21\x98\xa6\x9b\x82\x17\x5c\xb4\x5b\x51\xaf\x23\xb3\x9f\xa7\xc0\x43\xc7\x6f\x3a\x9a\x7f\x43\x27\x61\x7f\x88\xac\xb9\x41\xf5\xc5\xc0\x58\xef\x32\x33\x6a\xf3\xff\x2d\xcc\x2d\xae\x0e", 223, { 0x01, 0xee, 0xfc, 0xcf, 0xf4, 0x83, 0xfd, 0x73, 0xc0, 0x07, 0x8d, 0x6d, 0xe4, 0x05, 0xae, 0xc8 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb8\x25\x02\x77\x2d\x99\x6b\x71\x64\x65\x09\xad\xea\x9e\x5e\xe6\x5f\xbf\x95\x63\xc9\xfb\x69\x98\x95\xb1\xb4\xec\x2c\xfe\x95\x96\x2e\x6c\x3c\xa0\x4e\xc7\x55\x0e\xca\x10\x0e\x18\x85\x8b\xc7\x92\xc2\xf3\x55\x6d\x7f\xce\xf3\x56\x6c\xdb\xc6\x7c\x87\xa7\x0c\x6f\x55\x3f\xe0\x24\xbe\xff\xac\x15\x86\x89\x2b\x85\x64\xd2\x19\xe1\xc1\x56\x7a\x42\x0e\x6b\x84\x0f\xc2\xb3\x2b\xc0\xef\xac\x47\xbd\x80\x62\x63\x64\x11\x43\x24\x2a\x6b\x13\x54\xd8\x9a\xf6\x8a\xf7\xad\xab\x78\x47\x0a\xd8\xd1\x68\x6b\x7f\xd5\x9c\x79\x90\x7a\xa4\x03\x99\x38\xc6\xdb\x99\x71\xf0\x4d\xf2\x7c\xf7\x3d\x7c\x4d\xf8\xdc\xb6\xc2\xdf\x07\x17\x8c\x06\x3c\x82\xb8\xf5\x39\xd9\xd9\x48\x33\xa9\xd4\xae\xb0\x03\x48\x0d\x01\x6a\x98\xc3\x60\xe8\x96\x08\xa2\x3b\xcd\x6f\x98\x2d\x6b\x8b\x08\x01\xc9\xae\x43\x09\x99\xcd\x63\x55\xab\x7f\x23\x85\x5c\x24\x5b\xc0\x9b\x23\x16\xbd\x99\x4b\x51\xfe\x0d\x5b\x53\x1d\x21\x9d\xa4\x3f\xfc\xad\xab\xa5\xed\x57", 224, { 0x03, 0xe5, 0xd1, 0xd0, 0xaf, 0x2a, 0x72, 0xab, 0x3c, 0xa0, 0xdc, 0x8e, 0x46, 0xe4, 0x33, 0x69 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe7\x61\x30\x9e\xca\x25\x61\xd9\x2d\x37\x7a\xf9\x74\x80\x8a\xe5\x40\xc4\xf5\x06\xca\xed\x62\xde\xe3\x80\x45\xd3\x85\x31\x08\x0a\x14\x91\xd8\x6f\x37\xe5\x0b\xd0\x4e\x13\x29\x29\x8f\xb6\x9e\xfb\xc0\x50\xfa\xd5\x93\x9f\xe2\xf4\x99\x08\x97\x06\xe4\x30\x20\x0b\x3e\xaa\x17\x54\xff\xca\x0e\xae\x8f\x98\x9c\x98\x79\xe1\x07\xaf\x27\x67\x8f\x2b\x40\x38\x55\x82\x9b\x1c\xe7\x2a\xde\x27\x69\x7c\xb7\x6f\x61\xb4\xb7\xd8\x1e\x15\xc6\x0b\xc6\x29\x47\x85\xfb\x26\xc9\xcb\x29\x6c\x66\xbc\x6f\x2b\xbc\xff\x28\x22\x85\x9a\x15\x82\xd6\xa4\x29\xf1\xf1\x13\xf0\xaa\xc6\xaf\x9c\xc1\x0d\x28\xad\x84\xf9\x42\x3c\xfe\x99\x2e\xe5\x95\xd0\xf5\x4f\xd3\xef\x0d\x5a\x41\xec\x0e\xe3\x6f\x42\x7e\x36\x11\x64\xc8\x11\x44\xdf\x4c\x51\xee\x0b\x90\x3c\x42\x6d\x93\x6a\x63\xac\x42\x50\x20\x2e\x04\x6a\xde\x4f\x70\x05\x93\x3e\x1e\xa6\xee\x73\x9b\x1a\x95\xd0\x76\x1b\x86\x54\x77\x9c\x9e\x76\xf0\xb2\x38\x24\x2b\x1e\xee\x57\x02\x7b\x7b\x52", 225, { 0x1e, 0x37, 0x6b, 0x9f, 0xa2, 0xf6, 0xbd, 0xe8, 0x1e, 0x4e, 0xdc, 0xe4, 0x20, 0xaf, 0x0b, 0x93 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x8e\x01\xc1\x78\xf7\xf3\xe5\xc8\x6b\xab\x98\xf6\x2a\x40\x71\x27\xbd\xd1\x76\x48\x46\x71\xba\x0b\xf3\xaf\x20\x7f\x8d\xc0\x3d\x4a\x2d\x4b\x5c\x86\x0d\xd1\x9b\x36\x7c\xb7\x32\x64\xeb\xf2\xd4\xd8\x25\x4e\x2e\x76\x9c\x5b\x8c\x35\xde\xf4\x9b\xb8\x27\x6d\x49\x8a\x0f\x58\xc8\xfb\x64\xf4\xb2\x91\x12\x34\x47\x2d\x3f\x67\xd1\xbc\x74\x88\x28\x96\xf5\x24\x52\x76\x31\xe4\x42\x16\x54\xb6\xc1\x67\xfa\x9c\x6a\x6a\xff\x11\xcf\xae\x72\x13\xba\x66\xa8\xd2\x8e\x26\x6c\xf3\xcb\x3a\x54\x81\xb0\xa3\x2f\x71\xfa\xaf\x9a\xd0\xcb\x34\xb2\x8b\xa6\x69\xe3\xdb\x97\x60\xdf\x4b\x6f\x24\xab\x67\x2d\x6b\xd3\x03\x79\xf8\xbe\x25\x49\x90\x1c\x90\xa6\x96\x7b\xed\x89\x45\xf9\x98\xdf\x8a\x14\x05\xac\x7c\x9d\xce\x4c\x79\xcc\x5a\xd4\xde\x6c\x2b\x96\x62\x37\xc3\xc3\x10\x3c\x34\x2b\xdf\x7c\x43\x21\xef\x95\x38\x7a\x62\x96\x45\xb4\xd5\xf1\x90\x32\x7a\x8e\xdf\xa5\xd3\xfc\xdf\x87\x0d\xc2\x11\xc1\xf7\xd4\x52\x6d\x9d\x21\x05\xb5\x85\x49\xdf", 226, { 0xfc, 0xeb, 0xea, 0x4e, 0x08, 0xfa, 0x14, 0xd6, 0xcc, 0x61, 0x90, 0xfa, 0x48, 0x06, 0x9e, 0x7a }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xda\x85\x6c\x4e\x51\x3f\x1e\x87\x08\x3b\x76\x2b\xc6\x9f\x46\x95\xb0\x8d\x65\xc2\xe7\x19\x27\xde\x4f\xe6\xee\x67\x6b\x5c\xda\x00\x64\x88\x9c\xd4\x29\x8f\x68\xa5\xaf\xd0\x08\x70\x59\x96\x0e\xbf\x74\x76\x22\x8b\xd9\x4b\x79\xcb\xb5\xcc\x66\x9d\x66\xc7\x0a\x10\x7b\xfc\x28\x8c\xde\x99\x13\xdf\x0e\x4d\xc8\xe4\x84\x0a\x18\xd2\x37\x5c\xfe\x1e\x3b\x61\x0f\x0e\x85\x64\x0f\xdc\xc9\x1a\x9f\x83\x84\x78\x14\x28\x16\x2f\x64\x28\x07\xc6\x3a\xba\x6a\x52\x29\x41\x5e\xd3\xfc\x31\xb1\x2e\x2c\x9b\xa0\xc3\x6b\x56\xba\xaa\x5d\xcc\xe2\x8f\x66\x5e\x73\x27\x9e\x75\x7e\x4e\xe1\x26\x2e\xbf\x04\x81\x4d\x6f\x22\x77\xdf\x86\x14\x65\xec\xfb\xfe\x41\x5c\xca\x06\x60\xfa\xd5\x20\xe1\x9b\x55\x05\xba\x58\xfb\x43\x5d\xf6\xa7\x6d\x06\x67\xc4\x72\xa4\x6a\x3e\x0b\x61\x4d\x21\x4e\xd0\xd2\xcf\x60\xb2\x30\xdd\x47\x65\x30\x8c\xde\xea\x78\xdf\xe1\x91\xe5\x5d\x28\x43\x11\x65\xf1\x6c\xf4\x29\x56\x83\xa6\x49\xdd\x37\x42\x0c\x2e\x37\xe7\x3d\xdf", 227, { 0xe2, 0x2e, 0xd4, 0x1d, 0xb5, 0x4e, 0xf8, 0x9c, 0x90, 0x06, 0xb3, 0xdc, 0x67, 0x84, 0x36, 0xff }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x9e\xd8\xa0\x6c\xfa\xc3\x10\x42\xf8\x1f\x36\xfa\xad\xae\xe8\xa3\x83\x22\x1b\x38\xbe\xdc\x86\x31\xaa\xcf\xd6\x35\x63\x83\x87\xec\x40\x36\x66\xf3\xdd\x1d\xa0\xe9\xc4\xc8\x85\xa6\xb8\xa3\xdf\x8c\x9d\x98\xe9\xf5\x07\xd2\xee\xcb\x5d\x9d\x80\x37\xaa\x69\x51\x72\x00\xee\xb1\xb7\x89\x69\xa4\x59\x2b\x04\x9f\xf0\xd7\x53\xdf\xaf\x6f\xfa\x66\xd1\x51\x6d\x94\x32\x85\xd0\x5e\xfa\x7f\xfd\x2d\x74\x91\xa3\x55\xfd\xf0\x8b\x30\x17\x60\xf6\xd7\x9d\x7f\x23\x7c\x11\xac\xed\x67\x11\x92\x90\x8b\xe9\x54\x8c\xc4\x41\x57\xa2\xb0\xf7\xa6\xfb\x27\x08\x06\x68\x58\xa7\x97\xc4\x81\x70\x24\x76\x4a\xb6\x07\x13\xbf\xf8\xbc\x20\xe9\x73\x00\xf5\x08\xd1\xa5\xbc\x6e\xff\xf5\x99\xfa\x1c\xc1\xe4\x30\x8d\x05\x91\xf2\x2d\x39\xb1\xdd\xa2\x36\x11\x43\xcb\xc3\x00\xc0\x55\xbc\x2f\x7b\x6d\xde\xb1\xfb\x8f\x31\x21\xa3\x7d\x12\xe2\xcc\x4c\xdc\x81\x7d\x99\x33\x38\xc9\xd8\xed\x8c\xc6\xcc\x9c\x15\x25\x13\xbc\x5e\x73\xd9\x76\xe2\xeb\xad\x0f\x37\xf5\x70", 228, { 0x55, 0xd9, 0x74, 0x7a, 0xdd, 0xdb, 0x7e, 0x9a, 0x38, 0xc0, 0x19, 0xe1, 0xa7, 0xca, 0x59, 0x91 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf0\x47\x3f\x69\x52\xb8\x77\x76\x86\x6d\xa2\x5e\xde\x26\x1c\x41\x3b\x43\x2c\x30\x34\xa6\x43\xd9\xe0\xb5\xd2\x5b\x41\x7f\xc5\x38\x4d\xf6\x9f\x68\x9a\x5a\x33\x8a\xa5\xb7\xfc\x36\xbe\x85\x1a\x6d\x94\x6d\xe9\x32\x59\x2b\x40\x32\x91\x8e\x43\x9e\x7d\x9d\xe6\x1a\x1e\xd4\xfe\xcd\xe8\x8c\x05\x99\x05\x78\x6a\x65\x42\x4b\x93\x95\x9a\x77\x70\x9b\x5d\x11\xbd\xa7\xfd\xd0\xd4\x7a\x75\x35\x2c\x58\x57\xc4\x72\x1c\x70\x70\x42\x65\x19\x14\x82\xee\x1d\x1e\x5b\xfc\x42\x46\xd5\xf0\x76\x7c\x0f\xfc\x98\xe0\x17\xf2\xdf\xeb\x6c\x38\xeb\xab\x0d\xd8\x66\x2b\x3d\xb4\x56\xf1\xd6\xd7\x03\xa0\x47\xe6\x7f\xbe\x2c\xb5\xd7\x90\x88\xf6\xd5\x22\xa2\x0c\x6e\x63\x79\xfd\xcf\x6c\xe4\x86\xff\xe1\x4b\x49\x30\x70\xfc\x22\xa8\x77\x2b\x97\x47\xc2\x89\x6d\xb4\x71\x7f\x57\x28\xf8\x07\xca\xd6\x41\x27\xec\xf6\xec\x0c\xaa\x6d\xb6\xbf\xe9\x1b\xf7\x86\xd4\xc0\x45\xd9\x54\x8b\x37\xff\x9e\x41\x44\x46\xe5\x07\xc9\xdb\x31\xcc\x29\x4b\x48\x55\x0e\x97\xc8\xe6", 229, { 0xd9, 0xf5, 0xd6, 0x7b, 0x77, 0x59, 0xa0, 0xb5, 0x8b, 0xaf, 0xaa, 0xc9, 0xea, 0x60, 0xdf, 0xe2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xce\xed\x56\x8a\xea\x09\xf1\x00\xb0\x28\x60\x42\x00\xa4\xca\xb2\x2b\x31\x64\xe4\xf7\xb2\x44\x02\xbf\xb9\x55\xe0\xb7\x9a\x63\x9d\x4e\x2a\x56\xf2\xac\x19\x7c\x1a\x5b\xe9\xff\x5e\x02\x8a\x75\x3c\x4b\x94\x96\x33\xe6\x20\x09\x2e\xa7\x44\x57\x8b\xcb\x28\x01\xc6\x58\xc9\xac\xc6\xa2\x4a\x7a\xc4\xe9\xf2\x75\xd4\x20\xc7\x25\x12\xc9\xc4\x41\x6a\xfb\xb9\x82\x03\x85\xc0\x92\x49\x2d\x57\x24\x95\x11\x1f\x1d\x7c\x2f\x30\xef\xb1\x00\x17\x07\x97\x3f\x6d\x5d\x67\xc7\x15\x28\xfb\x9a\x11\xb4\x35\xfe\x01\x4b\x0e\xc1\x3a\x50\x3f\x9e\x7f\x6c\x85\xb8\x5f\xdf\x95\x43\x2a\xf8\x9c\x42\x91\xa0\x71\x6a\xd9\x10\x5a\x26\xbc\xa3\x78\xb4\xdc\xc5\xd0\x6c\xe4\x0b\xf6\x21\x3e\x5d\x58\xa0\x6a\x4e\x24\x56\x02\x8c\xd7\x0e\x47\x73\x64\xd7\x66\xbc\xfd\x03\x4d\x52\x80\x4c\x25\x45\x81\x12\x6b\xd7\xf0\xc0\xae\xb4\x67\x4c\xe7\x3f\x13\xdc\x70\x08\x3c\x86\xa3\x5a\x72\x30\x10\xf0\x56\x97\x5a\xc7\x02\x6b\xae\x0e\x16\x96\xe1\x3a\x60\x9d\x26\x36\x27\x1f\x69", 230, { 0xc7, 0xb4, 0xa5, 0x2d, 0xd4, 0x3e, 0xbe, 0xcb, 0x90, 0xc5, 0x10, 0x56, 0x22, 0x68, 0xc4, 0x02 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb8\x14\x7b\x4a\xaf\xbe\x8f\xb9\xd8\xd0\x9b\x2a\x70\xd9\x43\x75\x04\xb0\xb3\x4e\x64\x82\xdd\x5c\xb6\x7a\xde\xf7\xa6\x0b\x7e\x83\xbb\xdd\xd6\x64\xc5\x51\x0c\x9c\x72\xb3\x3a\x08\x01\xfb\x6d\x34\x0e\x40\xc9\xd6\x8b\xba\xca\xee\xcf\x72\xa5\x78\xc8\x88\xcd\xca\x4d\x21\x91\x90\x8e\xeb\xe2\x62\xad\x4e\x33\xff\x65\x30\x79\x29\xe8\x65\x52\x1c\xc7\xb2\x42\xac\x0b\x7c\x18\xfa\x61\x12\x6f\xd2\x71\x94\x50\xa5\x4f\x7e\xf5\x1e\x0a\xd5\xa8\x62\x63\xec\xca\xe9\x98\xd3\xf0\xf4\x5d\x5d\x28\xaa\xec\xcd\x59\xd3\x33\x1c\xc8\x30\x2c\xea\xb7\x74\x4b\xff\x28\xe3\x10\x7c\xbf\x86\xbc\xa2\xc5\x08\x20\x3e\x49\x31\x90\xb0\x61\xfc\xf7\x97\x8e\x56\x05\x1c\x3d\x76\x83\xd7\x6a\xd3\xc6\x61\x5f\xc7\x42\x77\x9b\xbe\x36\xc7\xcd\x1a\x85\x5b\xff\xa7\xa5\x9f\xd0\xb6\xb0\x10\xda\xd8\x98\x83\x32\x38\x78\x0f\x0d\x96\x05\x99\x7f\xdc\x23\xfa\x5f\x5e\x94\xcf\x47\xb3\xcb\xdc\xb8\x2a\xdf\x1d\x5a\xeb\x9b\x6b\x60\xac\xb2\xc8\x0a\x0c\x0f\x47\x44\x90\x4b\x9b\x6c", 231, { 0x40, 0xc0, 0x57, 0x95, 0x6a, 0x81, 0x82, 0x29, 0x3b, 0xd0, 0x98, 0x14, 0x84, 0xa7, 0xa4, 0xd1 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x37\x38\x3a\x31\xbb\x9a\x2d\x97\x67\xf5\x77\x16\x90\x82\x1f\xe2\xb1\x3b\xdc\x46\x27\x15\x5d\x2a\x85\x4e\x32\xb3\x95\xdc\x5a\x09\xec\x05\x69\x34\x29\x0c\x56\x1f\xca\x09\xdf\xbf\xaa\xd2\x99\x4d\x1b\x15\x98\xaf\x9c\x88\xb6\xf5\x37\x37\x84\xfe\x7a\xfc\xcb\x3b\x0f\x0d\xbd\x8b\xfa\xaf\xbd\x46\x6f\x09\xc8\x56\x4e\x13\x7e\x7f\x3c\xad\xd1\xbe\x5f\xcc\x49\xcf\xb5\xcf\xf1\xc9\x12\xf0\xe1\xe5\xb4\xd6\x69\x5c\x84\x46\xd7\x6e\xec\xfa\xe6\x7e\x4f\x8a\xc3\x5a\x29\x87\xbd\x99\xc5\xa7\x88\x1e\x95\x1a\x2d\xb9\x31\xfb\x92\xec\xef\xe2\xa1\xca\x1b\x96\x18\xfb\xd3\xe0\xed\xdd\x82\x7a\x5c\xc5\xf7\x26\x8e\x63\x21\xdc\xe7\x43\x69\x1b\xed\x70\xac\x61\xd0\x33\xd4\xb6\x9a\xf9\x12\x62\xf4\x52\xb9\xbe\x92\x16\xba\x28\x3c\xa2\xb8\x10\x7a\x40\xc7\x2f\xdc\xa5\xc6\xd8\xe3\x93\x56\x66\x8f\x9f\x76\xd5\x86\x0d\xbd\x6d\xde\xd7\x33\x99\x87\xcd\xcb\xd6\x58\xd6\x81\xc7\xb4\x54\x0c\x65\xd9\xa5\x41\x53\xc5\xc6\x04\x4f\xc5\x13\xeb\xc5\x9b\x2a\x70\x7e\x4b\xed", 232, { 0x0f, 0x8c, 0xf7, 0x8f, 0xe2, 0x33, 0xb8, 0xdb, 0x7b, 0x4b, 0x15, 0x6c, 0x88, 0x92, 0xce, 0x22 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd3\x75\x82\xa5\x8a\xca\xa4\x44\x66\xd0\x70\xc3\x44\x41\x52\xaa\x6c\x91\x46\xae\x89\x5f\x64\x74\x45\x08\x0c\x74\x81\x56\xae\xf9\x2e\x56\x36\x44\xcb\x47\x13\xd0\x7b\xae\xe3\xb1\xc2\x87\xbd\x16\xdc\x96\x1a\xed\xba\xdb\x60\xa5\x99\x23\x0d\x0f\x41\xbb\x7c\x5e\xd8\x40\x57\x4d\x60\x92\x9a\x5f\xd4\xe7\x3f\x42\xda\xfb\x8c\x4d\x24\x65\xf5\x28\x69\x05\xae\x8b\xfc\x9a\xd2\x1f\x06\x70\x29\x80\x65\x36\x99\x64\x1f\xee\x2c\xd5\x84\xfd\xba\x9a\xe0\x62\x33\xb4\xda\x03\x8b\x04\x6d\x23\x42\x0a\x80\xf1\x8f\xc8\x23\x3a\x28\xc5\x68\x3d\xb1\x2d\xdc\x9f\xbf\x15\xa1\x75\x87\xdd\x29\x7f\x27\xae\x91\x75\x91\x23\x98\x78\x10\x05\x3a\xab\x78\x2e\xed\xdb\xee\x8e\x77\x59\x51\x4c\x6a\xe9\x44\x04\x3d\xd3\xda\x2f\x09\x16\xdc\xa0\xdd\xbc\xb9\x2b\xbe\x49\x0b\x60\x3e\x4d\xc2\x75\xb7\x19\xef\x42\x25\x8e\x2f\x65\x9d\x11\xb2\x85\x6e\x9a\xe7\xb4\xd3\xec\xc6\xee\x51\xdf\xb9\xbe\xb3\xd9\x28\x00\xa0\x5b\xa0\xc1\xd6\xb7\x9f\x42\x05\xe0\xfe\x1c\x4a\x5a\xfb\x7d\x46", 233, { 0xe5, 0x61, 0x01, 0x70, 0x0e, 0x76, 0x73, 0x8d, 0xa8, 0x90, 0x1c, 0xda, 0x14, 0x27, 0xde, 0xf4 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x50\xe2\x90\xdb\xc4\x58\xfb\x83\xe0\x44\x82\x4c\x6c\x5a\xc9\x74\x59\x45\x36\x9c\x7a\x71\xf5\xac\x52\x72\x15\x44\x08\x14\xcf\xda\x77\x00\xe7\x75\x62\x07\x2c\x05\xc5\x0e\x19\x5c\x46\x96\x9e\xcd\xca\xe7\xf8\x60\x25\xd9\xbd\xaf\xe9\x3f\xf4\x60\x5f\xf0\x60\x3f\x94\x73\xde\xf6\x8a\x46\xe4\x6c\x90\xcb\x29\xb8\xac\xd0\x63\xc1\x34\xba\x2c\x74\x7c\x4d\xfe\xa0\xa9\x1a\x5d\x71\xa4\x85\x14\x87\x2a\x71\x97\xb2\x01\x8b\x87\x4c\x45\x30\x55\x33\xe1\xfc\xfe\x62\x19\xf0\xf4\x2c\x43\x3f\x1d\x14\x96\xb5\xf4\x4b\x1a\xc4\xce\xc7\xbf\x2d\x37\xfc\x8a\x48\x7b\x39\xea\xef\x40\xa2\x29\x0d\x50\xc6\xfe\xbe\x75\xdc\x3f\x23\x7d\x9f\xb3\xc6\x5d\xc3\x05\xa4\x72\x12\xd5\xdb\xe2\x28\xe9\xf1\x21\xc7\x81\xbe\x90\xd8\xc8\xf8\x40\xff\x66\x59\xd4\xd9\x32\x6f\x83\xd5\x05\x00\x3d\xac\xaa\x17\xe5\x7e\xf1\xaf\xbd\x8b\xe3\xfb\xe0\x8a\x0f\x50\xe8\xa9\x03\xb0\xaf\x22\xd7\xf4\x33\x77\xe3\x95\x93\x4a\x90\x17\x36\xdb\x4c\x12\x0b\x1e\x97\xde\xea\x78\x3b\xda\x19\x16\x98\x59", 234, { 0x2d, 0x01, 0x5b, 0x45, 0xca, 0x44, 0x57, 0xf8, 0xea, 0xbb, 0x14, 0x25, 0xd1, 0x7b, 0x62, 0xec }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xeb\xea\x1d\x2a\x84\x43\xd3\xc3\xb7\x08\x13\x09\x10\x91\x58\xbf\xed\x23\x2f\x88\xc7\x05\x4b\x9a\x8f\x43\xb5\x01\x33\xff\x20\x8d\x3f\x6e\x5a\x5a\xa0\x76\xdf\xfa\x85\xe2\x88\x41\x5e\x40\x61\xac\x06\x58\x97\x6e\xfd\x49\x90\x19\xce\x41\x15\xe6\x90\xd8\xaa\xa1\x87\x0a\xff\x33\xea\xcf\x7f\xcd\xbf\x59\x05\xaf\xe3\xea\xae\x92\x26\x4f\xc9\xb8\x92\xfc\xeb\x8e\xcc\xc5\x20\xfa\x94\x37\x3c\x47\x67\x91\x4f\xab\x44\x62\x36\x71\x8b\xc0\x4e\xc7\x00\x22\x44\x26\xef\xdb\x08\x59\x6a\x34\xe0\x2d\xae\x24\x99\xb4\xa4\xae\xd8\x35\x83\xd7\x8e\xb3\x92\x43\x8a\x18\x0b\x6b\x28\xff\x1b\x7d\x27\x1b\x07\xd1\x98\x46\x68\x03\xf3\x2a\x97\xb1\x44\x86\x23\xd2\x82\x1e\x7f\xb1\x00\x42\xb9\x86\xfd\xf8\x65\xaf\x56\xc8\x98\x90\x5b\x25\x10\x04\xbe\x73\x71\x7e\xa7\xb9\xaa\xc1\xe5\xe5\x76\x38\x40\xb6\xff\xf2\xea\x4a\x9d\x3e\x14\x44\xbb\xdf\x9c\x99\xda\xed\xe3\xf8\xaf\x48\xbd\xd4\x68\xb9\x82\x0f\x0d\xa6\x41\x44\x01\x72\x14\xb1\xa7\x6f\x8f\xbf\x21\x81\x52\x30\x33\x50\xbe", 235, { 0x92, 0x09, 0x96, 0x7f, 0x5b, 0x1d, 0x4f, 0x40, 0xe8, 0xc7, 0x0d, 0x8f, 0x7e, 0xd7, 0x63, 0x43 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xe4\x46\x29\xc4\x48\x89\x72\xd9\x5c\x32\xc8\x06\x5e\xe2\xb7\x1b\x18\x27\x15\x03\xc3\x1b\xfb\x33\x97\x29\x61\x3d\xf0\xef\x55\x81\x1e\x3f\xd8\x02\xc9\x40\x55\x56\xff\xb2\xbf\xb8\xdc\x4f\x45\x38\xd5\x4c\xb5\x11\xa1\xff\x6b\x1b\xc4\x9a\xf3\x57\xb9\x15\x43\xa8\xbb\x2a\x8e\xa1\x30\x7a\xc6\x79\xb3\xcd\xb1\x1b\xbc\x77\xa7\x5a\xee\xd5\xe5\x42\xfd\xf7\x91\x8a\x3a\x58\x4b\x25\xbd\xc8\x6c\xf7\x2e\x6b\xde\xa5\x30\xda\x98\x85\x6a\x67\xb4\xb5\x32\x7d\x2e\x47\xd8\x26\x3b\x9a\x8d\xa7\x44\xc4\xef\x46\x7e\x2b\x32\x2c\x27\x33\xec\x64\x5e\x11\x7c\x03\x9f\xbe\x18\x62\xdb\x08\x73\x87\x30\xc2\x07\xa2\x4a\x1c\x04\xb3\x55\x0d\xd5\x49\x9e\xec\x4b\x64\xc5\x1f\x68\x7c\xa1\xea\xca\x9b\xb0\x69\xb3\xa5\x39\x99\xb1\xb8\x00\x90\xee\xae\xa5\xcd\x16\xbf\x9a\xaa\xe0\x44\xbf\xee\x3c\x96\x9c\x7f\x17\x15\x3a\x34\xce\x44\x9e\xc9\x2d\x12\xe3\xec\x22\x34\xf3\x74\x02\xad\xe2\xb1\x77\x6f\xe7\xde\x06\x1b\xf7\xb3\x39\xe5\x00\x17\x6d\x93\xbf\xf3\x3a\xa4\x3e\x22\x7a\x8d\xee\x84", 236, { 0x53, 0x0e, 0x63, 0xd7, 0x2d, 0xd0, 0xbc, 0x79, 0xa2, 0x08, 0xa2, 0x58, 0x61, 0x64, 0x23, 0x51 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf8\x1f\x5c\x32\xb7\x04\x93\xcb\xdc\x68\x0f\xed\x39\xb4\x59\xc0\x76\x75\x44\xac\xde\x5b\xc2\x2a\xc3\x5e\x63\xb8\x8f\xfb\x6c\xe6\x69\x9c\x90\x8e\x80\x16\x4e\x21\xf7\x4c\xe6\x1b\x6d\xf1\xf9\x98\x28\x6a\xbc\x01\xdd\xd1\xd8\xdf\x1e\x16\xe2\xd0\x60\x40\x72\x96\xa8\xd1\xe2\x4d\xd2\x48\xa5\xb5\x7e\xc0\x41\xad\x97\xb6\xea\xc1\x81\xe8\xbd\xda\xdf\x58\x95\x14\xfe\x70\x8e\xad\xe1\x3f\x14\x18\xe9\xe1\xa6\x31\x21\xfd\x2d\x8c\x24\x68\xf3\xe6\xab\xe8\x42\xbd\xb7\x13\x9a\xfc\x57\x55\x8d\xce\x17\x0f\x3b\x93\x05\xdd\x66\xf0\x61\xf0\x31\x01\xe0\x9a\x7a\xaa\x9d\xe9\xd0\x0b\x9d\x6a\x13\x11\xfd\x0f\xa7\x29\xba\x2b\x54\x10\x1d\x99\xbe\xc6\xc1\xfd\x7b\xa1\x42\x22\xd6\x7e\x84\x83\x20\x12\x9d\xe5\xad\x5e\x60\x21\x72\x41\x87\x00\x39\x27\x7c\x3e\x7e\xe0\xc4\xb1\xea\x8b\x09\x83\x69\xb1\xc2\x9b\xea\x6e\x81\x1b\xb2\xc9\xd8\x02\x5e\x25\xe9\xf0\x73\xd1\x89\x0a\xa3\xba\x11\xf4\x9f\x40\xc1\xfb\x93\x25\xd0\x55\x43\xa2\x14\x7f\xc0\x94\x4a\xc6\xc6\xd3\x03\xe2\xb5\xa4\x2c", 237, { 0x78, 0xa2, 0x83, 0x25, 0x5d, 0x8e, 0x55, 0xc1, 0x14, 0xb5, 0xee, 0x4c, 0xc1, 0x74, 0x53, 0x04 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbc\x2a\x44\x38\x51\x3a\xa4\xec\xae\x4b\x35\xc6\x1b\x8e\xd9\x0b\x54\x1c\xf8\x6c\xf2\xac\xb4\x54\xe9\xef\x34\xd1\x2a\x88\x1d\x1c\x69\xab\x1f\xc6\xf9\x51\xab\x81\xd3\x15\xc3\x89\xb5\xaf\xe9\xad\x67\x0a\x39\xfe\x19\x03\x93\x12\xe8\xc0\xf0\xf5\x7f\xab\xd6\xae\xda\x0a\xe6\x69\x26\x3d\x93\x46\xc4\x93\xed\xbd\x6d\xc8\x9b\xab\x6f\x1f\xe7\xfe\x16\x18\xf4\xfa\x26\xcf\x0a\x25\x84\xf1\x12\xd5\xf4\x5b\x1d\x54\xfc\x51\x1e\xad\xe8\x57\xb8\x16\xe7\xaf\x32\xf9\x53\x70\x88\xa1\x0e\x40\x9b\x7e\x07\xae\x88\x14\xdc\x2e\x15\x86\x9a\xb2\x47\xbb\x9f\xe1\x12\x2a\xa1\xf6\x28\x48\xc7\x38\xf3\x8b\xf5\x11\x9d\x19\x25\xce\x4c\x12\xf0\xf2\x6c\x77\x2d\x37\x24\xb5\xb0\x22\xea\xd2\x34\x42\x32\x33\x53\x05\x41\x07\xb1\x36\x21\x54\x39\x16\xad\x9c\x7f\x16\xcc\x2b\x45\x2f\xba\x00\x19\xdf\x82\x56\x1b\xc1\x88\xcd\xdd\xc7\x42\x3a\x63\x16\x07\x08\x49\x7d\x00\x49\x04\x93\x3b\x5d\x41\x6d\xde\x3d\x69\xf9\x78\x65\x46\xfb\x73\x5c\xbf\xa1\xa6\xe1\xbf\xc4\x07\xb4\x34\xbe\x7d\xfd\x34\xe2", 238, { 0xb6, 0xbc, 0xec, 0x14, 0x2d, 0x49, 0xb6, 0x90, 0x18, 0xf9, 0x7b, 0xa5, 0x1b, 0xe9, 0x0c, 0x12 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd4\x5d\x39\x9c\xca\x90\x8d\x26\x46\xbc\xc1\xe4\xa8\x58\x57\x5e\x3b\xbc\x7f\xd7\xc7\x41\xfe\x8e\x44\x14\x2b\x91\xa9\x9c\x14\x38\xe1\x85\xbd\x45\xdf\x69\x88\x96\xc9\x1b\xb0\x84\x4f\x8f\xef\xdc\x1f\x69\x40\x78\x71\x20\xbf\x79\xbd\xcf\xac\x22\x8d\x98\x8e\x54\x6c\xb5\x74\xa2\xfe\x1d\x57\x10\x29\xcf\x9b\x6d\x71\xbd\xb4\x4a\x62\x58\xe5\x96\x26\xb4\x24\xd7\x36\x58\x1a\x07\x2d\xa5\x46\x09\xb8\xe1\x41\xc6\xaa\xde\x1c\xe9\x2c\x4b\xe5\x33\x12\x97\x49\x7b\x48\x7d\x53\x46\x6b\x31\x53\xff\x74\x25\xda\xd3\x8f\x78\xe1\x2b\x0a\xfc\x09\xc7\x69\xe2\xfc\x74\x96\x04\xf3\x69\x35\xcf\x52\x44\x16\xcb\x6e\x9c\xc4\xc9\x6e\x42\x3a\xa8\x4f\x19\xb5\xc3\x01\x8f\xa5\xfa\xaf\xb7\xbd\x5c\x1c\x05\x29\x6e\x29\xa5\xdf\x1b\x73\x78\x0f\x37\x19\xac\xb4\xb1\x9b\xf6\x4c\x55\xdd\x6f\xa4\x3c\x4b\x08\xcd\xd1\x17\xab\x2b\x80\x9e\xf0\xab\xfc\xe9\x79\x14\x2d\x50\xeb\x77\xb5\x38\x89\xc1\x1e\xfc\x6e\x6f\xa2\xe9\x67\x60\x95\x64\x6b\xc6\x73\x27\xb8\x36\x82\xa8\x8b\xe0\x24\x9a\x7b\xd8\xbb\x8c", 239, { 0x9e, 0x1e, 0x8a, 0x93, 0x65, 0x23, 0xbe, 0x28, 0x19, 0x89, 0x4c, 0xa5, 0x58, 0xc6, 0x31, 0x08 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x72\x92\x38\xb0\x49\x6d\x43\xb7\xff\x66\x01\xd7\x96\xed\x84\xee\x8b\xd4\xd5\xc0\xf0\x64\x96\x5d\x27\x8a\x57\x9e\x3d\x2f\x78\xcd\xe0\xa5\xb6\x64\xff\x3d\x53\xee\xfc\xf5\xe6\x0a\x90\x4e\xbc\x8f\x3c\x3c\xea\xc9\x68\x37\xf1\xe0\x1a\x6f\x0c\x59\x54\x1c\x18\xb6\x0a\xf3\x20\x39\xbe\xb4\x85\xc7\xba\xe0\xc6\xe7\xea\x89\xf2\xe9\x53\x41\xa7\x23\x34\x34\xc5\x57\xb7\x52\xb5\x30\x54\xa4\x4f\xeb\xc3\xc0\x6d\x13\x9b\x58\x0a\x64\x8c\xec\x15\xd1\x35\xa0\xd8\xa2\xa3\x28\x00\xb5\x68\xdf\x48\xe4\x53\xf7\xc6\x87\xd1\xcb\xd2\x10\xdf\x51\x8f\xd5\xab\xab\x17\xeb\xc7\xdc\x47\x2d\x08\x98\x24\x5c\x01\x34\xe8\x60\x17\xbc\xad\xad\x41\x23\xb5\xc1\x5f\x95\x54\xc9\x33\xe9\x7a\x64\x00\x32\xe1\x7f\xbd\x74\xcf\x5f\xf6\x74\x88\xbd\x40\xa9\x54\x0b\x57\x4e\x28\xd5\xd6\x99\xf4\x43\x91\x05\x88\xbb\x92\xcc\x24\xa3\xaf\x71\x9a\x44\xc5\x79\x22\xca\x93\x39\xba\x67\x35\xcb\x38\x98\x3a\x1a\xee\x80\x65\x1d\xf8\x70\xfd\x21\x24\x88\xd1\x3e\x7f\x76\xcc\xeb\x78\x5d\x30\xae\xb3\xd2\x72\xec\x6d\x00", 240, { 0x32, 0x30, 0x23, 0x6a, 0x09, 0x78, 0x4b, 0x95, 0x15, 0x31, 0x10, 0x58, 0xba, 0xcc, 0x32, 0x4e }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xb2\xde\x87\xeb\xd6\xa4\x31\xd1\x42\x74\x34\xad\x36\xeb\xdb\xd5\xc3\x84\x7f\xc3\x6b\x26\xae\xf0\x54\xd7\xf8\xdc\x29\x8f\x55\x2b\x8e\x27\x36\xe9\x3d\x70\x26\xee\xc2\x60\x1d\x5d\xcf\x68\x62\x46\x3d\xe1\x19\x6b\xa0\xa4\x70\x20\x85\xb8\x62\x4b\x4a\x26\x27\x8b\x9a\xe9\x39\x76\x85\x02\x02\xfa\x38\xa7\x27\xe4\x5d\x9b\x6b\x7f\x12\x99\x41\x55\x7e\xea\xf3\x11\x16\x16\x68\x84\x6b\xb7\x95\xc6\xac\x69\x83\x75\xc0\xdd\xf8\x19\xf8\x0d\xc5\xa8\x75\x8a\xac\x25\x16\xf1\xeb\x62\x1b\x7c\x69\xe7\x5b\xb4\x7c\xeb\x1e\x44\x55\x7f\x98\xe9\x09\xca\x03\x86\x3c\x6f\x57\x54\x6c\x0b\xa9\x37\xd7\xda\x1e\x2b\x0a\x79\x8a\xdd\x08\xc6\xa9\x56\x13\xe3\xf8\xd2\x1a\x5a\x31\xaf\xbe\x5a\x62\x81\x02\x20\xa9\x42\x8f\x71\x8e\xa7\xa2\x43\xfd\x8d\x93\x7c\xde\x92\x03\xd2\x53\xc1\xa0\xd1\x8d\x65\x97\xfb\x4b\xfe\x98\x09\xf1\x52\x7f\x50\x41\x9a\xa4\x3f\xb8\xdd\xc0\x04\x87\x5b\x7a\x4f\x2c\x1f\x8d\x2f\xad\xb8\x98\x18\x71\x01\x83\x05\xbb\x1b\x88\xba\xc3\x7c\xe5\x23\x73\x21\x1d\xd8\xbb\xdf\xe5\xc2\x91", 241, { 0x93, 0x4c, 0xcc, 0x99, 0x4e, 0xac, 0x76, 0x01, 0xbd, 0x95, 0x4b, 0x71, 0x97, 0xc2, 0xb6, 0x4b }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xd7\xb2\xd7\x89\x08\xdd\x01\x0c\xff\x6f\x1c\x38\xa9\x8f\x1e\x54\x49\x85\x52\xee\x84\x6a\xbd\x93\x9a\x6e\xa1\x2b\xaf\xc6\x1f\xee\x47\x30\xf7\x07\xd1\x24\x6c\xc3\x5a\x99\x43\x76\x62\x70\xe9\xeb\xcc\x81\xb4\x85\xee\x41\x42\xf6\xc9\x0d\xfe\x9b\x52\x15\xc1\x73\xef\xe7\x94\xbb\xfd\x97\x94\x27\x8e\x89\xee\xbe\x30\xdb\x0a\x52\xe8\x71\xc5\x9b\x3e\x9e\xd6\xf0\x72\x6b\x52\xa1\xcc\x88\x4a\xf3\x11\xcd\x92\xb9\x11\x6b\x9d\x8b\x5e\xb3\x84\xa6\x17\x83\x25\x60\xe2\x49\x68\x46\xf8\xb5\x9d\xd4\x59\xff\x01\xcf\x21\xd2\x60\x43\xf3\xd4\xd4\x15\x91\xd2\xab\x44\x8e\x8d\x67\xc0\x1a\x1b\xde\xe7\xfd\xfc\x82\x98\x9f\xba\xbb\xf6\x43\x3b\x70\xbb\x54\xa7\xa5\x36\xd8\xf0\x3e\xe2\x01\x02\xe2\xa5\xe2\x89\xfb\xa2\x3f\x59\xd9\xbb\x7d\x7f\xf6\xa6\xb8\xe2\x54\xaa\xf3\x94\x03\xf7\x6a\xbb\xbf\xa0\x04\x16\xb5\x36\xe5\x2e\x66\x02\x1f\x1c\xa5\xde\x88\xf1\xba\xb0\xa6\xc5\xa9\x84\xc7\x5f\x8d\x45\x2e\x7e\x1d\x18\x67\xc2\x50\x56\xbc\x3a\x1d\x24\xc0\x8b\x5c\xb0\x08\xb9\xc8\x09\xfa\x95\x25\x9b\xbd\xc3", 242, { 0x02, 0x2b, 0x4e, 0xda, 0x1a, 0x44, 0x77, 0x00, 0x7e, 0xbc, 0x69, 0xdc, 0x8d, 0x36, 0x54, 0xec }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x7e\x46\x50\x67\x88\x1b\xb7\x6c\x23\xb3\x4f\x70\xfe\x2b\x43\x4f\x59\xbf\x17\x4b\xe6\x02\x61\xd5\xc9\xb7\x98\xfb\xbf\x50\x05\x6d\x5a\x00\xd6\x2d\x6a\x7f\x51\xd3\x78\x5a\x26\x7a\x6c\xf4\xdd\x4b\x4e\x1d\x6e\xa3\x29\x4c\xef\xe4\x0b\x7c\x68\xd5\x2a\xa1\xc2\xb7\x21\xc6\xde\xe5\x57\xc5\xc3\x26\x81\xa2\xef\x93\x3d\x84\xce\x1f\xdf\x50\x49\xc8\x49\xe3\x75\x59\xf3\xec\x6c\xd9\x0b\x65\x39\x94\xb6\xac\xed\xc3\x74\x42\xce\xda\xa1\x1e\xaf\x6f\x17\xaf\x5b\xc2\xf1\x6d\x2b\xed\x6b\x1b\xb7\xa9\xe5\x9b\xa9\xba\x06\x6d\xad\xf8\xfd\xc6\x84\xfc\xe3\x49\x38\x63\x3d\x64\x6a\xc2\x9d\x4a\xc7\x26\x67\x88\x99\x46\xb1\x46\x7a\x48\x44\x1d\x23\x2c\xc0\x8f\x62\xd9\xdb\x27\x2a\xc2\xc9\x2e\xc4\x35\xb8\x07\x24\x40\x73\x28\x56\x40\x26\xb5\x17\x07\x41\xbb\x80\xa9\x75\x05\xdd\xe3\xdb\x9f\x9c\x29\x34\xe5\x61\x4b\x4b\x46\x37\xc3\x77\x9b\xe0\x9d\x3c\x1e\x4d\x03\x11\x08\x29\x64\x3d\xcb\x8f\x41\xdb\xe9\xdd\x94\xfc\x6f\xa0\xdd\xeb\x12\xae\xca\x8b\xe4\x53\x82\xdd\xb3\xa3\x8e\x9e\xff\xef\x64\x0d\x95\x52", 243, { 0x9b, 0x3c, 0x03, 0x49, 0xe3, 0x82, 0x8c, 0x8e, 0xfb, 0x2f, 0xc9, 0x7b, 0xee, 0x4c, 0x16, 0x17 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x92\xcb\xcc\x6b\x83\xda\x5b\x25\xf1\xc8\xd6\xb1\xe8\xe5\xc3\x95\x73\xaf\x5d\xde\xe5\x4f\xe4\x71\xc5\x3c\x9f\x80\x57\xfe\x70\x18\xc3\x0d\x12\xd6\xe5\xd8\xf1\xba\xb0\xe1\xa5\x13\x3f\x05\x0d\x9a\x7a\xd9\x04\x9b\x61\x30\xc3\x4e\xf8\xba\xd3\x44\xcf\xc7\xac\xfd\x2d\x29\xef\x96\xd9\x36\x3d\x9f\x84\xec\xb2\x0b\xd6\x30\x02\x41\x13\x2f\x2e\x4f\x6a\xe5\xe2\x3e\xda\xbc\x6e\x80\xc1\x4c\x5f\x86\x03\x41\xba\x6e\xd3\x5a\xd4\xda\x21\x8e\xd1\xdc\xa0\x49\xb7\x0d\x73\xd4\x2e\xbd\x73\xd2\xd6\x44\x1f\xe6\x45\x77\x21\x72\x9b\x36\x79\x7b\xc4\x23\x48\xa8\x4a\x6d\x3b\x69\xd4\xca\x92\x35\x40\x83\xcc\xeb\x58\xa9\xf1\x5a\x33\x65\x7c\xdc\x2b\x6d\xe2\x1d\x76\x93\xc3\xf9\x63\x77\xac\x84\x33\x5d\x87\x23\x92\x19\xa0\xd7\xb0\x27\x54\x9a\x01\xd7\x58\xe2\x8d\xa5\xa3\x42\xf4\xa7\xf9\x30\x02\x1f\x16\xe1\xeb\x30\x73\x50\x23\xae\xb7\x5e\xdc\x0e\xbd\x14\x1d\x7c\x3e\x04\x7c\x0c\x1b\xcd\x78\x08\x4a\xbc\x75\x68\x5a\x8f\x54\x5f\xa4\x56\xae\x12\x10\x73\xae\x64\x81\xc0\x88\xec\xde\xcf\x9a\x08\xbe\x4c\x1d\x0b", 244, { 0x74, 0x8d, 0xdc, 0x08, 0x81, 0xb7, 0x48, 0x31, 0x0b, 0xac, 0x8b, 0x95, 0x9a, 0xee, 0x5a, 0xfc }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaf\x7f\x88\x91\x24\xee\x81\xf4\xf8\x20\x80\xd7\xa3\x7b\x03\xdf\xf8\x4f\x68\x82\x98\xec\x6a\xf7\xf7\xed\x3a\x4d\x08\x98\x39\x98\x88\x5d\x50\x46\xe4\x7c\xed\x8f\xc8\xc4\x9a\x0b\x46\x76\x3b\x5d\x9f\x48\xe4\x0d\xb0\x85\x55\x74\xfb\x51\x13\xd0\x51\x0b\x24\x77\x1a\xcb\x66\x29\x41\x0b\x8c\x7e\xbe\x61\xb6\x7e\xc1\x6a\xac\x4f\x78\xc3\xb8\x09\x7d\x31\x1d\xa6\xdf\xe0\x37\x15\xcb\xc9\x30\x6d\xd8\x2c\x5c\x3e\xec\x3d\x32\x04\xcd\xdb\xe8\xb5\x48\x7b\xaa\x7a\xf8\x23\x76\x7a\xb3\x93\x97\xd1\x97\x7e\xbb\x9f\xac\xf5\xb3\x3d\x36\xe5\xc8\x8b\x9a\xb7\xb4\x65\xea\x15\x44\x34\x0f\xcd\x88\xa0\x92\xce\xb3\x63\x07\x4e\x96\x39\x16\x0e\xb4\xf4\x27\xb5\x01\xab\xa9\x59\x3c\x12\x00\x1d\xe6\xe6\x09\xf4\xdd\x7f\x4b\x84\x9a\x87\xbb\x25\x04\xc9\x2b\x08\xee\x23\x51\x75\x34\x96\x70\x2c\x6d\x7c\xa5\xed\x4d\xd9\xd0\x13\x9a\xc9\x1d\x5c\xc9\x19\x2e\xc4\x35\xf2\xe7\x8e\xfb\xb1\xd5\x64\x74\xd2\x3c\x96\x50\x0a\xbb\x7e\x4b\x73\x9e\x04\x8f\xe2\xc0\x3e\xa6\x54\x1b\x2f\x1a\x87\xee\xb0\xac\xa6\x89\x6d\x2d\x1c\xb8", 245, { 0x64, 0x0a, 0x21, 0xd7, 0x1f, 0x9e, 0xd7, 0xcd, 0x82, 0xd1, 0xb8, 0xb3, 0x7e, 0xb4, 0xa8, 0x66 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x06\xfb\x8a\xca\x55\x1c\xd3\x3d\xcf\xf0\x54\x07\x03\x96\x31\x83\x40\xde\xcb\xf7\x54\xe6\x4e\xbe\x6e\x53\x66\x17\x25\x2e\x11\x88\x92\x58\x8f\xf0\x97\xab\x77\x28\x43\xaf\xe4\x55\x4e\xf6\xcc\xce\xbf\x15\x70\xa4\xad\x3f\xef\xd2\x21\x7f\xf6\x02\x1b\x92\x92\xfa\xac\x5e\x26\xa1\x40\x13\x78\xb2\xfe\xdd\xe5\xfc\x48\x43\xb5\x53\x5d\x1f\x89\x17\x1e\x3a\xf1\x5e\xee\x83\x1a\xc1\xb2\xec\xa5\xc0\xf7\xe2\x92\xd3\x33\x67\x5b\x0e\x24\xcd\x1d\x6f\x55\x10\xf1\xc7\xbf\xd1\x5a\x43\x8c\xeb\xd6\x97\xf7\xb4\x97\xc6\x4f\xd2\x4c\x90\x19\xb7\x18\x77\x55\xba\xa4\x70\xd9\xd3\x50\x23\xda\xf3\x84\xdf\x8a\xfe\x25\x1e\xdb\x66\x24\xaf\x61\x65\x30\x86\x55\xd7\x8b\x1c\xb5\xb1\xfa\x84\x89\x22\xd6\x0c\x41\x44\x40\x8c\x3b\x7f\x72\x4e\x60\x7b\x30\x99\xee\xbf\x5c\xdc\x50\xeb\xa9\x74\x29\x8e\x68\x1a\x6f\xa5\x7e\xec\xb4\xb1\x77\x16\x81\x73\xb3\x1d\xdb\x47\xbe\xc8\xe7\x1a\xbe\xab\xa9\x0a\x05\x51\xe8\x99\xc7\x05\x2e\x8c\xe5\x3d\xeb\x66\xe7\xa4\xb9\x7c\x09\xc3\xbb\xb5\x6c\x4b\x1e\xe0\x6d\x01\xc1\xb2\x13\x46\xf1\x5a", 246, { 0xb9, 0x5e, 0x62, 0x77, 0x29, 0xc0, 0xa2, 0xbd, 0x30, 0xef, 0x76, 0xa4, 0x2d, 0x67, 0xa4, 0xb2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa2\x42\x4d\xc3\x4c\xad\xc9\x66\x07\x39\xce\xc9\x7a\x9f\x7d\x97\x11\x45\x14\x5d\x30\x89\x6a\xdf\x83\xad\x94\x15\x74\x5f\xaa\xc5\xb6\xe3\xa3\xbe\xfe\xdf\x5d\xae\xd2\xc3\xba\xa1\x7a\xd3\xe4\x16\x12\xd2\xb0\xbf\xc1\x4c\x20\xd6\x04\x81\x03\x17\x24\xe9\xb7\x5e\xc6\x68\x0f\xdd\xa1\x10\x4f\xf9\x4a\x8d\x54\xc2\x2b\x31\xd1\x0d\x92\x9d\xb3\x30\xe5\x08\xa6\x5a\xf4\x2f\xb1\x8c\x67\xd9\xfd\x38\x56\x06\xb3\x74\xf7\xb4\x03\xdb\x72\x4d\x40\x01\xd1\xb0\x28\x90\x13\xda\x42\x04\x60\x31\x60\xff\x56\x6d\x44\x49\x81\x23\x5f\x68\xea\xf0\xb4\xd8\xc6\x3e\xdc\xe8\x4f\xb6\x22\x31\xb0\x42\xce\xb3\x1a\xbd\x7f\x8d\xf4\x3a\xb1\x59\x2f\xee\x5f\x22\xb7\xbb\xc2\x02\x05\x59\x37\x5d\xd1\x23\x3e\xb4\xe5\x7c\x9e\x26\x0d\xdc\xa7\x8a\x2b\x7b\x90\x21\x67\x98\xfe\xfb\x83\x66\xa6\xe9\x4c\x94\x09\x1b\x2c\x77\x5e\x55\xdd\xd7\x8e\xd2\x38\x53\x59\xb5\x2c\x71\x96\x28\xca\x46\x97\x14\x7c\xbe\xaa\x7b\x56\x89\xbc\x75\x84\xa3\x19\xc5\xe3\x7d\x4f\x17\xad\xcd\x30\xd8\x4c\xef\xf5\xb2\x4f\xf6\x7f\xa3\x7a\x54\xb9\xb9\xf7\x21\x1a", 247, { 0x98, 0x8d, 0x87, 0xaa, 0xc7, 0xf9, 0xad, 0x6e, 0x99, 0x00, 0xf9, 0x61, 0x74, 0x29, 0xad, 0xca }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x6c\xab\x0b\x47\x97\xa4\xdb\xd5\x15\xae\xa0\x2c\xf4\x05\x7a\x87\x59\x24\x05\x17\xf0\xbc\x5f\x47\x0d\xc0\xd8\x1b\x64\x9d\x35\xb2\x61\x87\xa1\xea\x25\xef\x31\x22\x1e\x11\x12\x1a\x42\xa9\x52\xf7\xe8\xc5\x47\x64\x43\xb6\x9f\xd2\x7b\x20\x06\xdf\x6a\x31\x6e\xd5\xf0\xee\xfe\x49\xf3\xa9\x99\xe4\xf6\x8f\x09\x3e\x55\x5e\xc8\xe6\x1a\x33\x6b\x7e\x7f\x81\xac\x03\x01\x1e\x12\x2b\x1e\x77\x3f\xe7\xab\xe4\xd5\x08\xd4\x16\x06\xfe\xb0\xad\xb8\xbb\x7f\xe6\x51\xb5\x84\x72\x24\x0b\x79\x62\x77\xbf\xb4\x3d\x30\x21\xd4\x34\x1c\x4d\x27\x6d\xdc\xcb\x9c\x7b\x6d\x54\x5f\xef\x52\xb4\x17\x08\x60\xcb\xb8\x85\x26\xad\x05\x9b\xf7\xe9\xa6\x03\x95\xe7\xe1\x2a\x7b\x6a\xf8\x8c\xc7\x36\x1f\x1b\xc2\xcb\x19\xd9\x0d\x4f\x6e\x85\x6b\x89\x4b\x71\x25\x09\xf6\x72\x1e\x66\xec\xf2\x73\xa0\x98\x20\xce\xa4\xb2\x46\x48\xed\x32\x3a\xf8\x47\xf0\xee\x1d\xae\xda\x23\xe3\x56\xd1\x3a\xd6\xc4\x20\x2b\xe0\x19\x99\x8e\x00\x6f\x4e\xd7\x8a\x5c\xe9\x9f\x14\x94\xa9\x1d\x04\xab\xf9\xb3\xb4\xf7\xaf\xa5\x3f\x93\xde\xe4\xeb\x81\x58\x09\x33\xe7", 248, { 0xaf, 0x11, 0x9d, 0x89, 0x3d, 0x36, 0x81, 0xb4, 0x1a, 0x91, 0x0b, 0x44, 0x0c, 0xe4, 0x73, 0xf2 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xc3\x5d\x6f\x7a\x56\x15\x22\xf8\x31\x9b\xe0\xcf\x57\x07\xda\xdb\x49\xac\x08\x4d\x3f\xcf\xf1\xa7\x05\x73\x1a\xe3\x71\x50\x09\xb3\x7d\xe1\xf4\xe4\x05\x9c\x0b\xdc\x1e\x3d\x5f\x42\x10\x3c\x6d\xbc\xf2\x5d\x4b\xd3\xe1\x66\x6e\xf4\xdc\xea\x16\x90\x3f\x44\x56\x62\xda\xa0\xc3\xd0\xae\x33\xb9\x6b\x43\x8a\x45\x91\xa9\x00\xb2\x32\x09\x4a\xb3\xaf\xe6\x2c\x2a\xde\xf6\x4e\x93\x2a\x97\x29\x10\xd8\xf0\x1c\x11\x64\xa5\x9b\x9f\x0a\x36\x87\x46\x60\xf5\x98\x9d\x20\xa2\xf6\x73\x04\xa4\xe7\x98\xca\xe6\xa3\x45\x57\x4c\x44\x29\xf8\xd1\xd9\x10\xc3\x3f\x9a\x32\x1c\x89\x35\x16\x53\xc8\x47\x21\x6b\xd0\xe6\xbf\xf6\x6f\x5b\x2d\x1c\x42\xed\xe0\xba\x33\xd8\x95\xa6\x92\x5d\xf6\x11\xcf\xf3\xe6\x06\xd2\x9b\x69\x0f\xf7\x51\x33\xf6\xa9\x9e\xcc\xa9\x9a\x4b\x5c\x37\x9c\x30\x19\xf7\x1f\x2a\x49\xc7\x48\x2a\xf6\x72\xaa\x6a\x2e\x2b\xa3\xbb\xf4\x36\x55\xfb\xc7\xa6\x40\xa2\xcc\x41\x79\x7b\x9a\x7f\x89\x6f\xa2\xb1\xe5\x7c\x39\x3f\x05\xc5\x44\x0a\x22\xc4\x7f\xf0\x91\x9b\x6a\x6d\xb7\x87\xd0\x5e\xa8\x75\xf5\xe1\x61\xaf\x5b\x59\x9d", 249, { 0x49, 0x19, 0x39, 0x2e, 0xe6, 0x98, 0xbd, 0xe8, 0x33, 0xe7, 0x7f, 0x85, 0xcb, 0x16, 0x46, 0xeb }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xaf\x31\x8e\x57\x14\x59\xf1\xde\xb2\x14\xfd\x8e\xc4\x4d\xb8\x30\x3c\x7f\x59\xf0\x3b\x43\x03\xf7\x9d\x79\xaf\xa5\xab\x13\x29\x6c\xf4\x79\x31\x4c\x35\x9c\xc2\xe6\x75\x9b\x6f\x40\x2e\x0b\xe8\x14\xa5\xe7\x9c\xd5\x5b\x14\x79\x3f\x9c\x8e\xce\x99\x34\x35\x52\x8a\x41\x2e\x3e\x95\x24\xf7\x95\x33\x91\x0b\x84\x8c\xc6\x2e\xe3\xd1\xd9\x56\xdb\x39\x29\x36\xa2\x95\xf6\x68\x62\x92\x0d\x35\x39\x8b\x9c\x04\x59\x09\x24\x5e\x4e\xd8\x8c\x9a\x60\xc6\x51\x2a\x0e\xfb\xdb\x80\xbb\xf0\xeb\x9e\x65\x0e\x31\x39\x8f\xe3\xfb\x89\x41\x03\x07\xb0\x26\x79\x79\xc4\xd3\xe9\xe8\x7b\x27\x43\x92\x72\xcd\x26\xb0\x1a\xde\xcf\xe5\x3f\xa4\xbc\xcf\x36\x7a\xe1\xc0\xa3\xcf\x86\x87\xe4\x49\xbb\x67\x1e\x05\x79\x29\xe2\xfd\x57\x4d\x7b\x83\xe5\x5c\xd6\xea\xa9\x59\x0e\x43\xb4\x56\x94\x45\xdf\x22\xf8\x46\xa7\x20\x56\x66\xa2\x33\x5f\xcb\x9d\xd5\x03\x06\x55\x47\xb8\x94\xce\xe3\x6a\x81\x52\x8d\xff\x27\x09\x48\x85\x15\x32\xe4\xfb\x0b\xfc\xd5\xb9\x21\x03\x20\x7d\x06\x6a\x6e\x12\x66\x91\x43\x9e\x65\x73\x48\x89\x49\x9f\xc4\x06\x34\xd1\x29\x3f", 250, { 0x7c, 0x09, 0xc7, 0x86, 0x67, 0x7f, 0xd7, 0x70, 0x09, 0x34, 0xc4, 0x7d, 0xa5, 0x07, 0x09, 0x7f }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x0e\x2d\xcb\x21\x81\x17\xab\xc1\x1e\xb1\x72\x69\x9d\xf2\x79\x44\x41\x60\x05\xa1\x5a\x6a\x90\xe7\xe4\x64\x42\x16\x4d\x1f\x7f\xf5\x54\x24\x9a\xde\x0d\x8d\xa7\x22\x01\x81\x6d\x1a\x72\x4a\x7a\xcb\xbb\x15\x51\x35\xd6\x45\xbf\x38\xf8\x73\x4c\x24\x57\x06\xcc\xdc\x0b\x6c\x15\xa5\x12\xf2\xca\x90\x6e\x46\x56\x82\x69\x86\xf5\xdd\xf9\x04\xec\xcd\x3e\x99\xd9\x31\x27\xa3\x25\x23\x35\x9c\x95\x26\x58\x58\x00\xeb\xf5\xdb\x1b\xc0\x09\xd4\x70\x96\x67\xba\x6d\xad\x1d\x82\x99\xde\xf5\xfa\xe1\x84\x17\xc5\x11\x08\xcc\xf3\x5e\x08\x5d\x3c\x20\x24\x1a\xda\x9d\x65\x76\x00\xff\x49\x4f\xfa\x68\x6f\x4c\xe2\x1c\xdb\x60\xfc\xdd\xe7\x6b\xaf\x54\xc7\xff\x21\xab\xb7\x3f\x6d\x37\xc3\xe4\x84\x53\x32\x59\x9d\x48\x90\x06\x5a\x68\x57\xab\x79\x3a\x3a\xe2\x33\xcf\x0d\xc6\x34\x33\x54\xb3\x38\xff\x66\x23\x3f\x0c\x3d\xb7\x6c\x42\xdd\x57\x80\x8e\x5f\x70\xed\xf2\x9a\x5c\x9a\xb6\x6c\xe0\x33\xbc\xaa\xce\x29\xf1\xa2\xcb\x4d\xdf\x49\x2b\x04\x60\x06\xf8\x28\x6e\x1a\x12\x7c\x15\xaa\x70\xc9\x89\x6a\x84\x99\x54\xe8\xbd\x8f\xa7\x72\x26\x61\xd2", 251, { 0xb3, 0x4a, 0x6d, 0xad, 0x44, 0xc4, 0x04, 0xa4, 0x65, 0x17, 0xe7, 0x33, 0x5a, 0xd6, 0x98, 0x59 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xa5\x2c\x74\xcf\x94\x7c\x13\xf9\x91\x0b\x4b\xda\x9b\x2f\x65\x21\x64\xeb\x01\xb3\xfd\x48\xcb\xd8\x20\xde\xdd\x96\x1a\x72\xb1\x1b\x53\xb9\xc1\x53\x7b\x3b\xbd\x9a\x53\x53\x68\x8b\x15\x53\x10\xf7\x81\xc4\xa8\xf2\x86\xca\x83\x07\x89\xa6\xaf\x8b\x54\x56\xec\x0f\x9e\x57\x48\xef\x33\x8a\x58\x07\xc0\x34\x15\x86\x3d\x20\x50\xda\xf7\xdf\xd3\xcb\x39\x30\x16\xa4\x96\x7a\x9b\x8b\xd6\x76\xe7\xf2\x7b\xe9\x1d\x26\xee\x8f\x38\x05\x4b\x14\xe4\xcc\xc6\x3b\xfa\x0e\xb8\x22\x96\xc1\x4a\x9c\xd7\x73\xbc\xbe\x33\x9a\x53\x76\x74\x08\xdd\x54\x53\x7d\xe2\x6c\xaf\x57\x69\x54\x6a\x64\x64\x49\xe1\xd8\xb9\x6e\x06\x5a\xed\x34\x1b\x38\x6f\xd5\x0c\xbc\x7f\xf9\x6a\x96\xb9\x7c\x00\x78\x42\x47\x14\xc1\x8d\x5b\x3b\x51\xcb\xec\xd9\x7b\xed\xaa\x35\x18\x57\x1a\x35\xb8\x22\x23\xba\xf4\x0e\xa5\x9a\xdf\x03\x44\x36\x9b\x42\x43\xb8\x07\x2d\x8a\xeb\x96\xaf\xca\xb7\x3b\x49\xb7\x37\x80\xba\x74\x79\xb6\x4b\x0d\xd1\x47\xb4\x1d\xda\x27\xae\x90\x0b\x69\x16\x83\xf1\xee\xbb\x48\x0e\x38\xc4\x85\x4e\x5c\xc1\x7c\x22\x16\x4c\x65\x3c\xf7\x5b\xf7\xe5\xb9", 252, { 0xdc, 0x2a, 0xf1, 0x01, 0x65, 0x86, 0xb7, 0x25, 0x94, 0xcb, 0x82, 0x3e, 0x4d, 0x4f, 0xbe, 0x81 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x26\x05\xfe\xb3\xaf\x45\x91\x67\xf3\x2d\x13\x39\xab\xf7\x38\x3b\xbf\xc3\x73\x23\x48\xda\x09\x5e\x40\x10\xd1\x3d\xc9\x44\x8a\x4e\x16\x02\xd9\xc6\xfa\x47\xdd\x19\x0b\x64\x70\xac\x72\xfb\xfd\xa2\x52\x26\xf9\xd3\xd3\xb8\x00\xdb\xca\x9b\x8c\x4e\x07\x58\x54\x09\x3a\xb6\x3f\xa4\x82\x79\x03\x03\x94\x4b\x5f\x0c\x84\xb9\xf1\x73\x33\x54\xb4\xb0\x56\xf8\x1a\x12\x1e\x29\xc2\xed\x89\x99\xd7\xef\x45\xc6\x04\x91\x3c\xc0\x17\xa9\xc1\x08\x31\x1c\x55\x94\xa7\xb0\x15\xf0\x79\xff\xc4\x7e\x6d\x87\x71\xde\xc7\xdf\xc5\x68\xa6\x04\xeb\xd6\xfe\xd2\x1c\xff\x2d\x8e\xc6\xbe\x3c\xa0\x58\xf1\xb5\x5e\xac\x9d\x1c\x03\x12\x2f\x0b\xbe\xf5\xdd\xed\xe7\x2d\x2b\x57\x4c\xe0\x8a\xfe\xaa\x15\x1b\x59\x37\xd7\x91\xd4\x5c\x02\x34\xad\x80\xad\x01\x6f\x00\x34\xef\x09\x3b\xe0\x4c\x8b\xc9\x35\x46\x7c\xcb\xd9\x86\xda\x5d\x1c\xf7\xaf\x28\x28\xa5\x4c\x15\xc6\xc0\x25\x1c\xca\xbf\x48\x3a\x1d\xa1\x7b\x81\x65\x4e\xf2\x49\x53\x1c\xaa\x84\x88\x6f\x65\x30\x25\x78\x42\xe5\xee\x1e\xf8\x8e\x19\xf9\xaf\x34\xb9\x7a\x7b\xf6\xc2\x29\x75\x15\xb8\x07\x78\x2c\xf9", 253, { 0x84, 0x6b, 0xe9, 0x6b, 0xfc, 0xff, 0x73, 0x49, 0xce, 0xf5, 0x59, 0xf8, 0x85, 0x75, 0x4b, 0x6d }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\x12\x75\x7c\xa3\xe7\x74\x65\x23\x81\x28\xf1\x5b\x1f\x2d\x8b\x6f\x44\xe0\xcd\x2d\xd8\xdb\x77\x16\x6c\x0b\x7b\x0d\x9b\x70\x34\x9b\x8c\x71\xb7\xdd\x93\xda\x42\x0b\xf7\x73\xd2\xa5\xce\x3e\xd1\x3c\x05\x4c\xeb\xda\x7c\x3c\x01\x0f\x4e\x51\x37\x99\x2e\x2f\x28\xaf\xed\x32\x39\xea\x18\x6b\x0b\xd0\xbd\x39\x0a\xff\x4e\x7f\x22\xf3\x9f\x87\x92\x74\x0a\x73\xd8\x9f\xb2\x5b\xcc\x8e\xe4\x08\xc9\xa7\x99\x4c\x06\x7e\x18\xfc\x02\x68\xb8\x8c\x1e\x9d\xc3\x45\x44\x08\x77\x25\xc5\xaf\x26\x53\x41\xba\x7d\x3d\xbf\x22\xe1\x50\xdd\xf7\xf5\x53\x21\x4d\x38\x61\x6d\xc4\xcc\x81\x91\xb3\x51\xe3\xfb\xf1\xf0\xba\x89\x3f\x74\xb0\x7f\x55\x92\x0a\x94\x88\x49\x5a\x27\x14\x64\xdb\x8f\x0c\x1d\x6c\x90\xdb\xdc\x2c\xe9\x76\x1d\xae\x09\x20\x6f\xd9\xe2\xd9\x98\x5f\xd7\x64\xd6\xd8\xcf\xf4\x40\x7a\x6b\x72\x4b\x77\x54\x6d\x69\xf4\xad\x9f\xcc\xa1\xa8\x18\x49\xf9\x34\x0a\x57\x18\xd4\x30\x36\x34\x8b\xdb\x2c\xb9\xf4\x9a\xea\x05\x6e\x85\x0e\xbd\x73\x26\xc2\xca\x0a\x05\x81\xf4\x53\xcf\xfa\x19\x40\x22\x0d\x09\x63\xf8\xf2\x01\xe1\xad\x79\xc3\x86\xae\x6b\x4e", 254, { 0x23, 0xe9, 0x88, 0x6a, 0xc2, 0x8c, 0x64, 0x59, 0xdb, 0xa2, 0xe7, 0x84, 0x10, 0x37, 0x53, 0xd0 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xf3\xc0\x10\x3f\xf2\xea\xca\xc4\xea\x01\xdf\x39\x6d\xce\x54\x61\xef\xdd\xf4\x42\x92\xe5\x70\x9d\x1c\xcf\xa0\x08\x0a\x65\xe8\xaa\xbe\x98\xb6\x93\xd3\x6d\x27\xb5\x91\x86\xc9\x83\x7c\x49\x7b\x25\x07\xaf\x71\x55\x66\xab\x54\xd9\x81\x34\x86\x9d\x04\xf1\x83\x6c\x93\x80\x63\x4b\x1b\x64\x7b\x72\x44\x89\x24\xe8\x02\x74\x93\xba\x4b\x0b\xe7\xd7\xe3\xfe\x42\x8b\x53\xd1\x0e\x96\xf8\x88\x61\xe9\x37\xee\x7b\xfc\xce\x81\x6c\xce\x46\xfd\xd3\x7a\x84\x83\xc1\x73\x7f\x66\xbb\x5c\x0c\x93\xde\x86\xd6\x9a\x1d\x07\x69\x5d\xa6\x73\x6d\x54\x64\x3a\xef\x7a\x9d\x9e\xdb\xd7\xba\x4f\x86\xab\x27\xa4\x68\x34\x51\x78\xe7\x1c\xcc\x9f\x4e\x83\x97\x04\xdc\xa4\x77\x61\xf9\x26\x7f\x99\x84\x01\xb1\xb5\x47\x0b\xbf\x79\x8c\x1f\xea\xa2\xc9\xe8\x0c\xbf\x76\x4f\xb1\xa9\xff\x7f\x5f\xa1\xd5\x91\xf6\x04\xa0\xd9\x32\xad\x8f\xcc\x4e\xe7\xcf\x8c\xc3\x0d\x19\x12\x2f\xc1\x66\xf7\x50\xc5\xbe\xdf\x2f\x79\x2e\x83\x59\xf1\xd8\x59\x48\xb2\x24\xe1\xe1\x0a\x15\x8e\x17\x09\xb6\x50\xad\x1f\xb3\xba\x18\x54\x03\xd5\x82\x1e\xc3\x80\xeb\xe2\x1f\x82\x6a\x0a\x69\x2e\x92", 255, { 0xe8, 0x99, 0x39, 0xbb, 0x59, 0x6c, 0x74, 0x74, 0x67, 0x04, 0x26, 0x4c, 0xd3, 0xaf, 0x38, 0x31 }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, { "\xbf\x4b\xb1\xf0\x43\x19\xfc\xb0\xee\x40\x48\x5f\xc3\xdc\x4a\xca\xaf\x65\xf5\x06\x5d\x88\xe7\x89\xb8\x14\x71\x76\xfe\x0b\x46\xf6\x7e\xd9\xbf\xc1\xee\xa1\xc8\xbd\x6b\xb2\x6b\xbd\x0d\x18\xf7\x6a\x26\x4f\xcc\x3f\x18\x13\xc6\xae\xd0\x53\x44\x60\xe3\x43\xd4\x9a\x43\x91\x7c\xbb\x9d\xaf\xa7\xe1\x53\x4f\xab\xac\x11\xed\xf3\x1a\x0e\x85\xce\x92\xe1\x66\xd3\xfc\xfd\x1f\xee\x0d\xcb\x95\x0c\xa0\x63\x36\x5f\x40\xe6\x48\x4e\xc2\x7a\x5b\xfd\x0f\xe3\xdd\x74\x00\xbb\xcc\x6e\x62\x4e\x86\xc0\x18\x14\xbc\x64\x60\xcb\x85\x22\x2e\x31\x8f\xda\xb4\x5b\x70\x70\x03\xb5\x1a\x54\xcb\x97\x6d\xac\x3e\x7f\xe7\x21\x13\xf1\x77\x43\xa7\xe8\x6f\x9a\x3e\xf7\x97\x4a\x66\x01\x5d\x62\x7c\x91\x2a\xc1\x48\xd7\xd1\xa5\xc4\x40\x21\xd1\xfa\xb1\x9a\x5b\x0b\x5f\x3c\x0f\x4b\x4d\x7a\x83\x8a\x63\x4e\xb9\x6e\x28\x66\x6a\xfc\x1d\x7c\xf5\x35\xb5\xc3\xe4\xdd\xf4\x7d\x16\x57\xa2\xa9\x8f\xab\x2c\xda\xd9\xaa\x18\x23\x14\x29\x23\x2f\xa1\x69\xf9\x6d\x67\x97\x91\x68\xc0\x6e\x22\x34\x04\xfa\xc5\x04\xb0\x78\xa8\xd9\x32\x5a\xec\x55\x53\x66\x1d\xae\x41\xfe\x4b\xbe\x38\x7a", 256, { 0xf9, 0xd0, 0x4d, 0xbb, 0xc9, 0x3f, 0xc3, 0xa4, 0x73, 0xd0, 0xd2, 0x2a, 0xb4, 0x79, 0x0a, 0xcb }, { 0x5d, 0x79, 0x66, 0xa7, 0x73, 0x27, 0x02, 0x2f, 0x6a, 0xa1, 0x9e, 0xc1, 0x14, 0x8c, 0x9e, 0x43 } }, snapraid-14.9/cmdline/state.c000066400000000000000000004616771522717156100162030ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "elem.h" #include "import.h" #include "search.h" #include "state.h" #include "support.h" #include "parity.h" #include "stream.h" #include "handle.h" #include "io.h" #include "thermal.h" #include "raid/raid.h" #include "raid/cpu.h" /** * Configure the multithread support. * * Multi thread for write could be either faster or slower, depending * on the specific conditions. With multithreads it's likely faster * writing to disk, but you'll need to access multiple times the same data, * being potentially slower. * * Multi thread for verify is instead always generally faster, * so we enable it if possible. */ #if HAVE_THREAD /* #define HAVE_MT_WRITE 1 */ #define HAVE_MT_VERIFY 1 #endif const char* lev_name(unsigned l) { switch (l) { case 0 : return "Parity"; case 1 : return "2-Parity"; case 2 : return "3-Parity"; case 3 : return "4-Parity"; case 4 : return "5-Parity"; case 5 : return "6-Parity"; } return "invalid"; } const char* lev_config_name(unsigned l) { switch (l) { case 0 : return "parity"; case 1 : return "2-parity"; case 2 : return "3-parity"; case 3 : return "4-parity"; case 4 : return "5-parity"; case 5 : return "6-parity"; } return "invalid"; } static int lev_config_scan(const char* s, unsigned* level, unsigned* mode) { if (strcmp(s, "parity") == 0 || strcmp(s, "1-parity") == 0) { *level = 0; return 0; } if (strcmp(s, "q-parity") == 0 || strcmp(s, "2-parity") == 0) { *level = 1; return 0; } if (strcmp(s, "r-parity") == 0 || strcmp(s, "3-parity") == 0) { *level = 2; return 0; } if (strcmp(s, "4-parity") == 0) { *level = 3; return 0; } if (strcmp(s, "5-parity") == 0) { *level = 4; return 0; } if (strcmp(s, "6-parity") == 0) { *level = 5; return 0; } if (strcmp(s, "z-parity") == 0) { *level = 2; if (mode) *mode = RAID_MODE_VANDERMONDE; return 0; } return -1; } const char* lev_raid_name(unsigned mode, unsigned n) { switch (n) { case 1 : return "par1"; case 2 : return "par2"; case 3 : if (mode == RAID_MODE_CAUCHY) return "par3"; else return "parz"; case 4 : return "par4"; case 5 : return "par5"; case 6 : return "par6"; } return 0; } void state_init(struct snapraid_state* state) { unsigned l, s, i; memset(&state->opt, 0, sizeof(state->opt)); state->mapped_device = 0; state->filter_hidden = 0; state->autosave = 0; state->need_write = 0; state->written = 0; state->checked_read = 0; state->block_size = 256 * KIBI; /* default 256 KiB */ state->raid_mode = RAID_MODE_CAUCHY; state->file_mode = ADVISE_DEFAULT; for (l = 0; l < LEV_MAX; ++l) { state->parity[l].split_mac = 0; for (s = 0; s < SPLIT_MAX; ++s) { state->parity[l].split_map[s].path[0] = 0; state->parity[l].split_map[s].uuid[0] = 0; state->parity[l].split_map[s].fstype[0] = 0; state->parity[l].split_map[s].fslabel[0] = 0; state->parity[l].split_map[s].size = PARITY_SIZE_INVALID; state->parity[l].split_map[s].device = 0; } state->parity[l].smartctl[0] = 0; for (i = 0; i < SMART_IGNORE_MAX; ++i) state->parity[l].smartignore[i] = 0; state->parity[l].total_blocks = 0; state->parity[l].free_blocks = 0; state->parity[l].skip_access = 0; state->parity[l].tick = 0; state->parity[l].cached_blocks = 0; state->parity[l].is_excluded_by_filter = 0; } state->tick_io = 0; state->tick_misc = 0; state->tick_sched = 0; state->tick_raid = 0; state->tick_hash = 0; state->tick_last = os_tick(); state->share[0] = 0; state->pool[0] = 0; state->pool_device = 0; state->lockfile[0] = 0; state->level = 1; /* default is the lowest protection */ state->clear_past_hash = 0; state->no_conf = 0; for (i = 0; i < SMART_IGNORE_MAX; ++i) state->smartignore[i] = 0; state->rehash_blocks = 0; state->bad_blocks = 0; state->unsynced_blocks = 0; state->unscrubbed_blocks = 0; state->thermal_stop_gathering = 0; state->thermal_ambient_temperature = 0; state->thermal_highest_temperature = 0; state->thermal_first = 0; state->thermal_latest = 0; state->thermal_temperature_limit = 0; state->thermal_cooldown_time = 0; tommy_list_init(&state->disklist); tommy_list_init(&state->extralist); tommy_list_init(&state->maplist); tommy_list_init(&state->contentlist); tommy_list_init(&state->filterlist); tommy_list_init(&state->importlist); tommy_list_init(&state->thermallist); tommy_hashdyn_init(&state->importset); tommy_hashdyn_init(&state->previmportset); tommy_hashdyn_init(&state->searchset); tommy_arrayblkof_init(&state->infoarr, sizeof(snapraid_info)); tommy_list_init(&state->bucketlist); } void state_done(struct snapraid_state* state) { tommy_list_foreach(&state->disklist, (tommy_foreach_func*)disk_free); tommy_list_foreach(&state->extralist, (tommy_foreach_func*)extra_free); tommy_list_foreach(&state->maplist, (tommy_foreach_func*)map_free); tommy_list_foreach(&state->contentlist, (tommy_foreach_func*)content_free); tommy_list_foreach(&state->filterlist, (tommy_foreach_func*)filter_free); tommy_list_foreach(&state->importlist, (tommy_foreach_func*)import_file_free); tommy_list_foreach(&state->thermallist, (tommy_foreach_func*)thermal_free); tommy_hashdyn_foreach(&state->searchset, (tommy_foreach_func*)search_file_free); tommy_hashdyn_done(&state->importset); tommy_hashdyn_done(&state->previmportset); tommy_hashdyn_done(&state->searchset); tommy_arrayblkof_done(&state->infoarr); tommy_list_foreach(&state->bucketlist, (tommy_foreach_func*)bucket_free); } /** * Check the configuration. */ static void state_config_check(struct snapraid_state* state, const char* path, tommy_list* filterlist_disk) { tommy_node* i; unsigned l, s; /* check for parity level */ if (state->raid_mode == RAID_MODE_VANDERMONDE) { if (state->level > 3) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Using z-parity limits you to a maximum of 3 parities.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STIO */ } } for (l = 0; l < state->level; ++l) { if (state->parity[l].split_mac == 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Missing '%s' specification in '%s'\n", lev_config_name(l), path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } if (tommy_list_empty(&state->contentlist)) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Missing 'content' specification in '%s'\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* check for equal paths */ for (i = state->contentlist; i != 0; i = i->next) { struct snapraid_content* content = i->data; for (l = 0; l < state->level; ++l) { for (s = 0; s < state->parity[l].split_mac; ++s) { if (pathcmp(state->parity[l].split_map[s].path, content->content) == 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Same path used for '%s' and 'content' as '%s'\n", lev_config_name(l), content->content); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } } /* check device of data disks */ if (!state->opt.skip_device && !state->opt.skip_disk_access) { for (i = state->disklist; i != 0; i = i->next) { tommy_node* j; struct snapraid_disk* disk = i->data; /* skip data disks that are not accessible */ if (disk->skip_access) continue; #ifdef _WIN32 if (disk->device == 0) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Disk '%s' has a zero serial number.\n", disk->dir); log_fatal(ESOFT, "This is not necessarily wrong, but for using SnapRAID\n"); log_fatal(ESOFT, "it's better to change the serial number of the disk.\n"); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif for (j = i->next; j != 0; j = j->next) { struct snapraid_disk* other = j->data; if (disk->device == other->device) { if (state->opt.force_device) { /* note that we just ignore the issue */ /* and we DON'T mark the disk to be skipped */ /* because we want to use these disks */ if (!state->opt.no_warnings) log_fatal(EUSER, "DANGER! Ignoring that disks '%s' and '%s' are on the same device\n", disk->name, other->name); } else { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Disks '%s' and '%s' are on the same device.\n", disk->dir, other->dir); #ifdef _WIN32 log_fatal(ESOFT, "Both have the serial number '%" PRIx64 "'.\n", disk->device); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'\n"); log_fatal(ESOFT, "to change one of the disk serial.\n"); #endif /* in "fix" we allow to continue anyway */ if (strcmp(state->command, "fix") == 0) { log_fatal(ESOFT, "You can '%s' anyway, using 'snapraid --force-device %s'.\n", state->command, state->command); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } if (!state->opt.skip_parity_access) { for (l = 0; l < state->level; ++l) { for (s = 0; s < state->parity[l].split_mac; ++s) { if (disk->device == state->parity[l].split_map[s].device) { if (state->opt.force_device) { /* note that we just ignore the issue */ /* and we DON'T mark the disk to be skipped */ /* because we want to use these disks */ if (!state->opt.no_warnings) log_fatal(EUSER, "DANGER! Ignoring that disks '%s' and %s '%s' are on the same device\n", disk->dir, lev_name(l), state->parity[l].split_map[s].path); } else { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Disk '%s' and %s '%s' are on the same device.\n", disk->dir, lev_name(l), state->parity[l].split_map[s].path); #ifdef _WIN32 log_fatal(ESOFT, "Both have the serial number '%" PRIx64 "'.\n", disk->device); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'\n"); log_fatal(ESOFT, "to change one of the disk serial.\n"); #endif exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } } } if (state->pool[0] != 0 && disk->device == state->pool_device) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Disk '%s' and pool '%s' are on the same device.\n", disk->dir, state->pool); #ifdef _WIN32 log_fatal(ESOFT, "Both have the serial number '%" PRIx64 "'.\n", disk->device); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'\n"); log_fatal(ESOFT, "to change one of the disk serial.\n"); #endif exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } /* check device of parity disks */ if (!state->opt.skip_device && !state->opt.skip_parity_access) { for (l = 0; l < state->level; ++l) { for (s = 0; s < state->parity[l].split_mac; ++s) { unsigned j, t; /* skip parity disks that are not accessible */ if (state->parity[l].skip_access) continue; #ifdef _WIN32 if (state->parity[l].split_map[s].device == 0) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Disk '%s' has a zero serial number.\n", state->parity[l].split_map[s].path); log_fatal(ESOFT, "This is not necessarily wrong, but for using SnapRAID\n"); log_fatal(ESOFT, "it's better to change the serial number of the disk.\n"); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif for (j = l + 1; j < state->level; ++j) { for (t = 0; t < state->parity[j].split_mac; ++t) { if (state->parity[l].split_map[s].device == state->parity[j].split_map[t].device) { if (state->opt.force_device) { /* note that we just ignore the issue */ /* and we DON'T mark the disk to be skipped */ /* because we want to use these disks */ if (!state->opt.no_warnings) log_fatal(EUSER, "DANGER! Skipping parities '%s' and '%s' on the same device\n", lev_config_name(l), lev_config_name(j)); } else { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Parity '%s' and '%s' are on the same device.\n", state->parity[l].split_map[s].path, state->parity[j].split_map[t].path); #ifdef _WIN32 log_fatal(ESOFT, "Both have the serial number '%" PRIx64 "'.\n", state->parity[l].split_map[s].device); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'\n"); log_fatal(ESOFT, "to change one of the disk serial.\n"); #endif /* in "fix" we allow to continue anyway */ if (strcmp(state->command, "fix") == 0) { log_fatal(ESOFT, "You can '%s' anyway, using 'snapraid --force-device %s'.\n", state->command, state->command); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } } if (state->pool[0] != 0 && state->pool_device == state->parity[l].split_map[s].device) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Pool '%s' and parity '%s' are on the same device.\n", state->pool, state->parity[l].split_map[s].path); #ifdef _WIN32 log_fatal(ESOFT, "Both have the serial number '%" PRIx64 "'.\n", state->pool_device); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'\n"); log_fatal(ESOFT, "to change one of the disk serial.\n"); #endif exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } } /* check device of pool disk */ #ifdef _WIN32 if (!state->opt.skip_device) { if (state->pool[0] != 0 && state->pool_device == 0) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Disk '%s' has a zero serial number.\n", state->pool); log_fatal(ESOFT, "This is not necessarily wrong, but for using SnapRAID\n"); log_fatal(ESOFT, "it's better to change the serial number of the disk.\n"); log_fatal(ESOFT, "Try using the 'VolumeID' tool by 'Mark Russinovich'.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } #endif /* count the content files */ if (!state->opt.skip_device && !state->opt.skip_content_access) { unsigned content_count; content_count = 0; for (i = state->contentlist; i != 0; i = i->next) { tommy_node* j; struct snapraid_content* content = i->data; /* check if there are others in the same disk */ for (j = i->next; j != 0; j = j->next) { struct snapraid_content* other = j->data; if (content->device == other->device) { log_error(ESOFT, "WARNING! Content files on the same disk: '%s' and '%s'.\n", content->content, other->content); break; } } if (j != 0) { /* skip it */ continue; } ++content_count; } if (content_count < state->level + 1) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You must have at least %d 'content' files in different disks.\n", state->level + 1); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /* check for speed */ #ifdef CONFIG_X86 if (!raid_cpu_has_ssse3()) #endif if (state->raid_mode == RAID_MODE_CAUCHY && !state->opt.no_warnings) { if (state->level == 3) { log_error(ESOFT, "WARNING! Your CPU doesn't have a fast implementation for triple parity.\n"); log_error(ESOFT, "WARNING! It's recommended to switch to 'z-parity' instead than '3-parity'.\n"); } else if (state->level > 3) { log_error(ESOFT, "WARNING! Your CPU doesn't have a fast implementation beyond triple parity.\n"); log_error(ESOFT, "WARNING! It's recommended to reduce the parity levels to triple parity.\n"); } } /* ensure that specified filter disks are valid ones */ for (i = tommy_list_head(filterlist_disk); i != 0; i = i->next) { tommy_node* j; struct snapraid_filter* filter = i->data; for (j = state->disklist; j != 0; j = j->next) { struct snapraid_disk* disk = j->data; if (wnmatch(filter->pattern, disk->name) == 0) break; } if (j == 0) { for (j = state->extralist; j != 0; j = j->next) { struct snapraid_extra* extra = j->data; if (wnmatch(filter->pattern, extra->name) == 0) break; } } if (j == 0) { /* check matching with parity disks */ for (l = 0; l < state->level; ++l) if (wnmatch(filter->pattern, lev_config_name(l)) == 0) break; if (l == state->level) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Option -d, --filter-disk %s doesn't match any data or parity or extra disk.\n", filter->pattern); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } } /** * Validate the smartctl command. * * It must contains only one %s string, and not other % chars. */ static int validate_smartctl(const char* custom) { const char* s = custom; int arg = 0; while (*s) { if (s[0] == '%' && s[1] == 's') { if (arg) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } arg = 1; } else if (s[0] == '%') { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } ++s; } return 0; } void state_config(struct snapraid_state* state, const char* path, const char* command, struct snapraid_option* opt, tommy_list* filterlist_disk) { STREAM* f; unsigned line; tommy_node* i; unsigned l, s; /* copy the options */ state->opt = *opt; /* if unset, sort by physical order */ if (!state->opt.force_order) state->opt.force_order = SORT_PHYSICAL; /* adjust file mode */ if (state->opt.file_mode != ADVISE_DEFAULT) { state->file_mode = state->opt.file_mode; } else { /* default mode, if nothing is specified */ state->file_mode = ADVISE_DISCARD; } /* store current command */ state->command = command; log_tag("conf:file:%s\n", esc_tag(path)); f = sopen_read(path, 0); if (!f) { /* LCOV_EXCL_START */ if (errno == ENOENT) { log_fatal(errno, "No configuration file found at '%s'\n", path); } else if (errno == EACCES) { log_fatal(errno, "You do not have rights to access the configuration file '%s'\n", path); } else { log_fatal(errno, "Error opening the configuration file '%s'. %s.\n", path, strerror(errno)); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } line = 1; while (1) { char tag[PATH_MAX]; char buffer[PATH_MAX]; int ret; int c; unsigned level; /* skip initial spaces */ sgetspace(f); /* read the command */ ret = sgettok(f, tag, sizeof(tag)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Error reading the configuration file '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* skip spaces after the command */ sgetspace(f); if (strcmp(tag, "blocksize") == 0 /* block_size is the old format of the option */ || strcmp(tag, "block_size") == 0) { ret = sgetu32(f, &state->block_size); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'blocksize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (state->block_size < 1) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Too small 'blocksize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (state->block_size > 16 * KIBI) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Too big 'blocksize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* check if it's a power of 2 */ if ((state->block_size & (state->block_size - 1)) != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Not power of 2 'blocksize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } state->block_size *= KIBI; } else if (strcmp(tag, "hashsize") == 0 || strcmp(tag, "hash_size") == 0 /* v11.0 used incorrectly this one, kept now for backward compatibility */ ) { uint32_t hash_size; ret = sgetu32(f, &hash_size); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'hashsize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (hash_size < 2) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Too small 'hashsize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (hash_size > HASH_MAX) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Too big 'hashsize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* check if it's a power of 2 */ if ((hash_size & (hash_size - 1)) != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Not power of 2 'hashsize' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } BLOCK_HASH_SIZE = hash_size; } else if (lev_config_scan(tag, &level, &state->raid_mode) == 0) { char device[PATH_MAX]; char* split_map[SPLIT_MAX + 1]; unsigned split_mac; char* slash; uint64_t dev; int skip_access; if (state->parity[level].split_mac != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Multiple '%s' specification in '%s' at line %u\n", tag, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = sgetlasttok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid '%s' specification in '%s' at line %u\n", tag, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty '%s' specification in '%s' at line %u\n", tag, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } split_mac = strsplit(split_map, SPLIT_MAX + 1, buffer, ","); if (split_mac > SPLIT_MAX) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Too many files in '%s' specification in '%s' at line %u\n", tag, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } skip_access = 0; state->parity[level].split_mac = split_mac; for (s = 0; s < split_mac; ++s) { char uuid[UUID_MAX]; pathimport(state->parity[level].split_map[s].path, sizeof(state->parity[level].split_map[s].path), split_map[s]); if (!state->opt.skip_parity_access) { struct stat st; /* get the device of the directory containing the parity file */ pathimport(device, sizeof(device), split_map[s]); slash = strrchr(device, '/'); if (slash) slash[1] = 0; else pathcpy(device, sizeof(device), "."); if (stat(device, &st) == 0) { dev = st.st_dev; /* read the uuid, if unsupported use an empty one */ if (devuuid(dev, split_map[s], uuid, sizeof(uuid)) != 0) { *uuid = 0; } } else { /* if the disk can be skipped */ if (state->opt.force_device) { /* use a fake device, and mark the disk to be skipped */ dev = 0; *uuid = 0; skip_access = 1; log_fatal(errno, "DANGER! Skipping inaccessible parity disk '%s'...\n", tag); } else { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing 'parity' dir '%s' specification in '%s' at line %u\n", device, path, line); /* in "fix" we allow to continue anyway */ if (strcmp(state->command, "fix") == 0) { log_fatal(errno, "You can '%s' anyway, using 'snapraid --force-device %s'.\n", state->command, state->command); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } else { /* use a fake device */ dev = 0; *uuid = 0; } state->parity[level].split_map[s].device = dev; pathcpy(state->parity[level].split_map[s].uuid, sizeof(state->parity[level].split_map[s].uuid), uuid); } /* store the global parity skip_access */ state->parity[level].skip_access = skip_access; /* adjust the level */ if (state->level < level + 1) state->level = level + 1; } else if (strcmp(tag, "share") == 0) { if (*state->share) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Multiple 'share' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = sgetlasttok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'share' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'share' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } pathimport(state->share, sizeof(state->share), buffer); } else if (strcmp(tag, "pool") == 0) { struct stat st; if (*state->pool) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Multiple 'pool' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ret = sgetlasttok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'pool' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'pool' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } pathimport(state->pool, sizeof(state->pool), buffer); /* get the device of the directory containing the pool tree */ if (stat(buffer, &st) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing 'pool' dir '%s' specification in '%s' at line %u\n", buffer, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } state->pool_device = st.st_dev; } else if (strcmp(tag, "content") == 0) { struct snapraid_content* content; char device[PATH_MAX]; char* slash; struct stat st; uint64_t dev; ret = sgetlasttok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'content' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (pathcmp(buffer, "/dev/null") == 0 || pathcmp(buffer, "NUL") == 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "You cannot use the null device as 'content' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'content' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* check if the content file is already specified */ for (i = state->contentlist; i != 0; i = i->next) { content = i->data; if (pathcmp(content->content, buffer) == 0) break; } if (i) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Duplicate 'content' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* get the device of the directory containing the content file */ pathimport(device, sizeof(device), buffer); slash = strrchr(device, '/'); if (slash) slash[1] = 0; else pathcpy(device, sizeof(device), "."); if (stat(device, &st) == 0) { dev = st.st_dev; } else { if (state->opt.skip_content_access) { /* use a fake device */ dev = 0; log_fatal(errno, "WARNING! Skipping inaccessible content file '%s'...\n", buffer); } else { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing 'content' dir '%s' specification in '%s' at line %u\n", device, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /* set the lock file at the first accessible content file */ if (state->lockfile[0] == 0 && dev != 0) { pathcpy(state->lockfile, sizeof(state->lockfile), buffer); pathcat(state->lockfile, sizeof(state->lockfile), ".lock"); } content = content_alloc(buffer, dev); tommy_list_insert_tail(&state->contentlist, &content->node, content); } else if (strcmp(tag, "data") == 0 || strcmp(tag, "disk") == 0) { /* "disk" is the deprecated name up to SnapRAID 9.x */ char dir[PATH_MAX]; char device[PATH_MAX]; char uuid[UUID_MAX]; struct snapraid_disk* disk; uint64_t dev; int skip_access; ret = sgettok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'data' name specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'data' name specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } sgetspace(f); ret = sgetlasttok(f, dir, sizeof(dir)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'data' dir specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*dir) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'data' dir specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* get the device of the dir */ pathimport(device, sizeof(device), dir); /* check if the disk name already exists */ for (i = state->disklist; i != 0; i = i->next) { disk = i->data; if (strcmp(disk->name, buffer) == 0) break; } if (i) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Duplicate 'data' name '%s' at line %u\n", buffer, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* if the disk has to be present */ skip_access = 0; if (!state->opt.skip_disk_access) { struct stat st; if (stat(device, &st) == 0) { dev = st.st_dev; /* read the uuid, if unsupported use an empty one */ if (devuuid(dev, dir, uuid, sizeof(uuid)) != 0) { *uuid = 0; } /* fake a different UUID when testing */ if (state->opt.fake_uuid) { snprintf(uuid, sizeof(uuid), "fake-uuid-%d", state->opt.fake_uuid); --state->opt.fake_uuid; } } else { /* if the disk can be skipped */ if (state->opt.force_device) { /* use a fake device, and mark the disk to be skipped */ dev = 0; *uuid = 0; skip_access = 1; log_fatal(errno, "DANGER! Skipping inaccessible data disk '%s'...\n", buffer); } else { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing 'disk' '%s' specification in '%s' at line %u\n", dir, device, line); /* in "fix" we allow to continue anyway */ if (strcmp(state->command, "fix") == 0) { log_fatal(errno, "You can '%s' anyway, using 'snapraid --force-device %s'.\n", state->command, state->command); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } else { /* use a fake device */ dev = 0; *uuid = 0; } disk = disk_alloc(buffer, dir, dev, uuid, skip_access); tommy_list_insert_tail(&state->disklist, &disk->node, disk); } else if (strcmp(tag, "extra") == 0) { char dir[PATH_MAX]; char device[PATH_MAX]; char uuid[UUID_MAX]; struct snapraid_extra* extra; uint64_t dev; ret = sgettok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'extra' name specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'extra' name specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } sgetspace(f); ret = sgetlasttok(f, dir, sizeof(dir)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'extra' dir specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*dir) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'extra' dir specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* get the device of the dir */ pathimport(device, sizeof(device), dir); /* check if the disk name already exists */ for (i = state->extralist; i != 0; i = i->next) { extra = i->data; if (strcmp(extra->name, buffer) == 0) break; } if (i) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Duplicate 'extra' name '%s' at line %u\n", buffer, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* if the disk has to be present */ if (!state->opt.skip_disk_access) { struct stat st; if (stat(device, &st) == 0) { dev = st.st_dev; /* read the uuid, if unsupported use an empty one */ if (devuuid(dev, dir, uuid, sizeof(uuid)) != 0) { *uuid = 0; } /* fake a different UUID when testing */ if (state->opt.fake_uuid) { snprintf(uuid, sizeof(uuid), "fake-uuid-%d", state->opt.fake_uuid); --state->opt.fake_uuid; } } else { /* use a fake device, and mark the disk to be skipped */ dev = 0; *uuid = 0; } } else { /* use a fake device */ dev = 0; *uuid = 0; } extra = extra_alloc(buffer, dir, dev, uuid); tommy_list_insert_tail(&state->extralist, &extra->node, extra); } else if (strcmp(tag, "smartctl") == 0) { char custom[PATH_MAX]; ret = sgettok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartctl' name in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'smartctl' name in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } sgetspace(f); ret = sgetlasttok(f, custom, sizeof(custom)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartctl' option in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*custom) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'smartctl' option in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (validate_smartctl(custom) != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartctl' option in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* search for parity */ if (lev_config_scan(buffer, &level, 0) == 0) { if (state->parity[level].smartctl[0] != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Duplicate parity 'smartctl' '%s' at line %u\n", buffer, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } pathcpy(state->parity[level].smartctl, sizeof(state->parity[level].smartctl), custom); } else { /* search the disk */ struct snapraid_disk* found_disk = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (strcmp(disk->name, buffer) == 0) { found_disk = disk; break; } } struct snapraid_extra* found_extra = 0; for (i = state->extralist; i != 0; i = i->next) { struct snapraid_extra* extra = i->data; if (strcmp(extra->name, buffer) == 0) { found_extra = extra; break; } } if (found_disk) { if (found_disk->smartctl[0] != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Duplicate 'smartctl' name '%s' at line %u\n", buffer, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } pathcpy(found_disk->smartctl, sizeof(found_disk->smartctl), custom); } else if (found_extra) { if (found_extra->smartctl[0] != 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Duplicate 'smartctl' name '%s' at line %u\n", buffer, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } pathcpy(found_extra->smartctl, sizeof(found_extra->smartctl), custom); } else { /* LCOV_EXCL_START */ log_fatal(EUSER, "Unknown 'smartctl' name '%s' at line %u\n", buffer, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } else if (strcmp(tag, "smartignore") == 0) { int* smart; ret = sgettok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartignore' name in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'smartignore' name in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } sgetspace(f); if (strcmp(buffer, "*") == 0) { smart = state->smartignore; } else if (lev_config_scan(buffer, &level, 0) == 0) { /* search for parity */ smart = state->parity[level].smartignore; } else { /* search the disk */ struct snapraid_disk* found_disk = 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (strcmp(disk->name, buffer) == 0) { found_disk = disk; break; } } struct snapraid_extra* found_extra = 0; for (i = state->extralist; i != 0; i = i->next) { struct snapraid_extra* extra = i->data; if (strcmp(extra->name, buffer) == 0) { found_extra = extra; break; } } if (found_disk) { smart = found_disk->smartignore; } else if (found_extra) { smart = found_extra->smartignore; } else { /* LCOV_EXCL_START */ log_fatal(EUSER, "Unknown 'smartignore' name '%s' at line %u\n", buffer, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } int si = 0; while (1) { char* e; ret = sgettok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartignore' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) break; if (si == SMART_IGNORE_MAX) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Too many 'smartignore' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } smart[si] = strtoul(buffer, &e, 0); if (!e || *e) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartignore' specification in '%s' at line %u. It should be a number.\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (smart[si] < 1 || smart[si] >= 256) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartignore' specification in '%s' at line %u. It should be between 1 and 255.\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ++si; sgetspace(f); } if (si == 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'smartignore' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } else if (strcmp(tag, "temp_limit") == 0) { unsigned temp; ret = sgetu32(f, &temp); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'temp_limit' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (temp < 40 || temp > 70) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'temp_limit' temperature specification in '%s' at line %u. It must be between 40 and 70\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } state->thermal_temperature_limit = temp; } else if (strcmp(tag, "temp_sleep") == 0) { unsigned time; ret = sgetu32(f, &time); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'temp_sleep' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (time < 3 || time > 120) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'temp_sleep' temperature specification in '%s' at line %u. It must be between 3 and 120\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } state->thermal_cooldown_time = time * 60; } else if (strcmp(tag, "nohidden") == 0) { state->filter_hidden = 1; } else if (strcmp(tag, "exclude") == 0) { struct snapraid_filter* filter; ret = sgetlasttok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'exclude' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'exclude' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } filter = filter_alloc_file(-1, "", buffer); if (!filter) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'exclude' specification '%s' in '%s' at line %u\n", buffer, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } tommy_list_insert_tail(&state->filterlist, &filter->node, filter); } else if (strcmp(tag, "include") == 0) { struct snapraid_filter* filter; ret = sgetlasttok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'include' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'include' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } filter = filter_alloc_file(1, "", buffer); if (!filter) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'include' specification '%s' in '%s' at line %u\n", buffer, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } tommy_list_insert_tail(&state->filterlist, &filter->node, filter); } else if (strcmp(tag, "autosave") == 0) { char* e; ret = sgetlasttok(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'autosave' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!*buffer) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Empty 'autosave' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } state->autosave = strtoul(buffer, &e, 0); if (!e || *e) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid 'autosave' specification in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* convert to GB */ state->autosave *= GIGA; } else if (tag[0] == 0) { /* allow empty lines */ } else if (tag[0] == '#') { ret = sgetline(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid comment in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } else { /* LCOV_EXCL_START */ log_fatal(EUSER, "Invalid command '%s' in '%s' at line %u\n", tag, path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* skip final spaces */ sgetspace(f); /* next line */ c = sgeteol(f); if (c == EOF) { break; } if (c != '\n') { /* LCOV_EXCL_START */ log_fatal(EUSER, "Extra data in '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ++line; } if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading the configuration file '%s' at line %u\n", path, line); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } sclose(f); state_config_check(state, path, filterlist_disk); /* select the default hash */ if (state->opt.force_murmur3) { state->besthash = HASH_MURMUR3; } else if (state->opt.force_spooky2) { state->besthash = HASH_SPOOKY2; } else { state->besthash = membesthash(); } /* by default use the best hash */ state->hash = state->besthash; /* by default use a random hash seed */ if (randomize(state->hashseed, HASH_MAX) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to retrieve random values.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* no previous hash by default */ state->prevhash = HASH_UNDEFINED; /* intentionally not set the prevhashseed, if used valgrind will warn about it */ log_tag("blocksize:%u\n", state->block_size); for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; log_tag("data:%s:%s:%s\n", esc_tag(disk->name), esc_tag(disk->dir), disk->uuid); } for (i = state->extralist; i != 0; i = i->next) { struct snapraid_extra* extra = i->data; log_tag("extra:%s:%s:%s\n", esc_tag(extra->name), esc_tag(extra->dir), extra->uuid); } log_tag("mode:%s\n", lev_raid_name(state->raid_mode, state->level)); for (l = 0; l < state->level; ++l) { log_tag("%s:%s:%s\n", lev_config_name(l), esc_tag(state->parity[l].split_map[0].path), state->parity[l].split_map[0].uuid); for (s = 1; s < state->parity[l].split_mac; ++s) { log_tag("%s/%u:%s:%s\n", lev_config_name(l), s, esc_tag(state->parity[l].split_map[s].path), state->parity[l].split_map[s].uuid); } } if (state->pool[0] != 0) log_tag("pool:%s\n", esc_tag(state->pool)); if (state->share[0] != 0) log_tag("share:%s\n", esc_tag(state->share)); if (state->autosave != 0) log_tag("autosave:%" PRIu64 "\n", state->autosave); for (i = tommy_list_head(&state->filterlist); i != 0; i = i->next) { char out[PATH_MAX]; struct snapraid_filter* filter = i->data; log_tag("filter:%s\n", esc_tag(filter_type(filter, out, sizeof(out)))); } if (state->filter_hidden) log_tag("filter:nohidden:\n"); log_flush(); } /** * Find a disk by name. */ static struct snapraid_disk* find_disk_by_name(struct snapraid_state* state, const char* name) { tommy_node* i; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (strcmp(disk->name, name) == 0) return disk; } if (state->no_conf) { /* without a configuration file, add disks automatically */ struct snapraid_disk* disk; disk = disk_alloc(name, "DUMMY/", -1, "", 0); tommy_list_insert_tail(&state->disklist, &disk->node, disk); return disk; } return 0; } /** * Find a disk by UUID. */ static struct snapraid_disk* find_disk_by_uuid(struct snapraid_state* state, const char* uuid) { tommy_node* i; struct snapraid_disk* found = 0; /* special test case to find the first matching UUID */ /* when testing UUID are all equal or not supported */ /* and we should handle this case specifically */ if (state->opt.match_first_uuid) return state->disklist->data; /* LCOV_EXCL_START */ /* never find an empty uuid */ if (!*uuid) return 0; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (strcmp(disk->uuid, uuid) == 0) { /* never match duplicate UUID */ if (found) return 0; found = disk; } } return found; /* LCOV_EXCL_STOP */ } /** * Update the disk mapping if required. */ static void state_map(struct snapraid_state* state) { unsigned hole; tommy_node* i; unsigned uuid_mismatch; unsigned diskcount; unsigned l, s; /* remove all the mapping without a disk */ /* this happens when a disk is removed from the configuration file */ /* From SnapRAID 4.0 mappings are automatically removed if a disk is not used */ /* when saving the content file, but we keep this code to import older content files. */ for (i = state->maplist; i != 0; ) { struct snapraid_map* map = i->data; struct snapraid_disk* disk; disk = find_disk_by_name(state, map->name); /* go to the next mapping before removing */ i = i->next; if (disk == 0) { /* disk not found, remove the mapping */ tommy_list_remove_existing(&state->maplist, &map->node); map_free(map); } } /* maps each unmapped disk present in the configuration file in the first available hole */ /* this happens when you add disks for the first time in the configuration file */ hole = 0; /* first position to try */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; struct snapraid_map* map; tommy_node* j; /* check if the disk is already mapped */ for (j = state->maplist; j != 0; j = j->next) { map = j->data; if (strcmp(disk->name, map->name) == 0) { /* mapping found */ break; } } if (j != 0) { /* mapping is present, then copy the free blocks into to disk */ disk->total_blocks = map->total_blocks; disk->free_blocks = map->free_blocks; continue; } /* mapping not found, search for an hole */ while (1) { for (j = state->maplist; j != 0; j = j->next) { map = j->data; if (map->position == hole) { /* position already used */ break; } } if (j == 0) { /* hole found */ break; } /* try with the next one */ ++hole; } /* insert the new mapping */ map = map_alloc(disk->name, hole, 0, 0, ""); tommy_list_insert_tail(&state->maplist, &map->node, map); } /* without configuration don't check for number of data disks or uuid changes */ if (state->no_conf) return; /* counter for the number of UUID mismatches */ uuid_mismatch = 0; /* check if mapping match the disk uuid */ if (!state->opt.skip_disk_access) { for (i = state->maplist; i != 0; i = i->next) { struct snapraid_map* map = i->data; struct snapraid_disk* disk; disk = find_disk_by_name(state, map->name); if (disk == 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Mapping not found for '%s'\n", map->name); os_abort(); /* LCOV_EXCL_STOP */ } if (disk->has_unsupported_uuid) { /* if uuid is not available, skip this one */ continue; } /* if the uuid is changed */ if (strcmp(disk->uuid, map->uuid) != 0) { /* mark the disk as with an UUID change */ disk->has_different_uuid = 1; /* if the previous uuid is available */ if (map->uuid[0] != 0) { /* count the number of uuid change */ ++uuid_mismatch; log_error(ESOFT, "UUID change for disk '%s' from '%s' to '%s'\n", disk->name, map->uuid, disk->uuid); } else { /* no message here, because having a disk without */ /* UUID is the normal state of an empty disk */ disk->had_empty_uuid = 1; } /* update the uuid in the mapping, */ pathcpy(map->uuid, sizeof(map->uuid), disk->uuid); /* write the new state with the new uuid */ state->need_write = 1; } } } /* check the parity uuid */ if (!state->opt.skip_parity_access) { for (l = 0; l < state->level; ++l) { for (s = 0; s < state->parity[l].split_mac; ++s) { char uuid[UUID_MAX]; int ret; ret = devuuid(state->parity[l].split_map[s].device, state->parity[l].split_map[s].path, uuid, sizeof(uuid)); if (ret != 0) { /* uuid not available, just ignore */ continue; } /* if the uuid is changed */ if (strcmp(uuid, state->parity[l].split_map[s].uuid) != 0) { /* if the previous uuid is available */ if (state->parity[l].split_map[s].uuid[0] != 0) { /* count the number of uuid change */ ++uuid_mismatch; log_error(ESOFT, "UUID change for parity '%s/%u' from '%s' to '%s'\n", lev_config_name(l), s, state->parity[l].split_map[s].uuid, uuid); } /* update the uuid */ pathcpy(state->parity[l].split_map[s].uuid, sizeof(state->parity[l].split_map[s].uuid), uuid); /* write the new state with the new uuid */ state->need_write = 1; } } } } if (!state->opt.force_uuid && uuid_mismatch > state->level) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Too many disks have changed UUIDs since the last 'sync'.\n"); log_fatal(ESOFT, "If this happened because you actually replaced them,\n"); log_fatal(ESOFT, "you can still '%s', using 'snapraid --force-uuid %s'.\n", state->command, state->command); log_fatal(ESOFT, "Alternatively, you may have misconfigured the disk mount points,\n"); log_fatal(ESOFT, "and you need to restore the mount points to the state of the latest sync.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* count the number of data disks, including holes left after removing some */ diskcount = 0; for (i = state->maplist; i != 0; i = i->next) { struct snapraid_map* map = i->data; if (map->position + 1 > diskcount) diskcount = map->position + 1; } /* ensure to don't go over the limit of the RAID engine */ if (diskcount > RAID_DATA_MAX) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "Too many data disks. Maximum allowed is %u.\n", RAID_DATA_MAX); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* now count the real number of data disks, excluding holes left after removing some */ diskcount = tommy_list_count(&state->maplist); /* recommend number of parities */ if (!state->opt.no_warnings) { /* LCOV_EXCL_START */ if (diskcount >= 36 && state->level < 6) { log_error(EUSER, "WARNING! For %u disks, it's recommended to use six parity levels.\n", diskcount); } else if (diskcount >= 29 && state->level < 5) { log_error(EUSER, "WARNING! For %u disks, it's recommended to use five parity levels.\n", diskcount); } else if (diskcount >= 22 && state->level < 4) { log_error(EUSER, "WARNING! For %u disks, it's recommended to use four parity levels.\n", diskcount); } else if (diskcount >= 15 && state->level < 3) { log_error(EUSER, "WARNING! For %u disks, it's recommended to use three parity levels.\n", diskcount); } else if (diskcount >= 5 && state->level < 2) { log_error(EUSER, "WARNING! For %u disks, it's recommended to use two parity levels.\n", diskcount); } /* LCOV_EXCL_STOP */ } } void state_refresh(struct snapraid_state* state) { tommy_node* i; unsigned l, s; uint64_t bs = (uint64_t)state->block_size; /* for all disks */ for (i = state->maplist; i != 0; i = i->next) { struct snapraid_map* map = i->data; struct snapraid_disk* disk; uint64_t total_space; uint64_t free_space; int ret; disk = find_disk_by_name(state, map->name); if (disk == 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Mapping not found for '%s'\n", map->name); os_abort(); /* LCOV_EXCL_STOP */ } if (disk->skip_access) continue; ret = fsinfo(disk->dir, 0, 0, &total_space, &free_space, disk->fstype, sizeof(disk->fstype), disk->fslabel, sizeof(disk->fslabel)); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing disk '%s' to retrieve file-system info. %s.\n", disk->dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* set the new free blocks */ map->total_blocks = total_space / bs; map->free_blocks = free_space / bs; /* also update the disk info */ disk->total_blocks = map->total_blocks; disk->free_blocks = map->free_blocks; log_tag("fsinfo_data_split:%s:%" PRIu64 ":%" PRIu64 ":%s:%s\n", esc_tag(disk->name), disk->total_blocks * bs, disk->free_blocks * bs, disk->fstype, disk->fslabel); log_tag("fsinfo_data:%s:%" PRIu64 ":%" PRIu64 "\n", esc_tag(disk->name), disk->total_blocks * bs, disk->free_blocks * bs); } /* for all parities */ for (l = 0; l < state->level; ++l) { /* set the new free blocks */ state->parity[l].total_blocks = 0; state->parity[l].free_blocks = 0; if (state->parity[l].skip_access) continue; for (s = 0; s < state->parity[l].split_mac; ++s) { struct snapraid_split* split = &state->parity[l].split_map[s]; uint64_t total_space; uint64_t free_space; int ret; ret = fsinfo(split->path, 0, 0, &total_space, &free_space, split->fstype, sizeof(split->fstype), split->fslabel, sizeof(split->fslabel)); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing file '%s' to retrieve file-system info. %s.\n", split->path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #ifdef WIN32 /* * Take into account the space we have to leave free * to avoid the waring about low space */ if (free_space >= WINDOWS_SPACEHOLDER_SIZE) free_space -= WINDOWS_SPACEHOLDER_SIZE; else free_space = 0; #endif /* add the new free blocks */ uint64_t split_total_blocks = total_space / bs; uint64_t split_free_blocks = free_space / bs; state->parity[l].total_blocks += split_total_blocks; state->parity[l].free_blocks += split_free_blocks; if (s == 0) log_tag("fsinfo_parity_split:%s:%" PRIu64 ":%" PRIu64 ":%s:%s\n", lev_config_name(l), split_total_blocks * bs, split_free_blocks * bs, split->fstype, split->fslabel); else log_tag("fsinfo_parity_split:%s/%u:%" PRIu64 ":%" PRIu64 ":%s:%s\n", lev_config_name(l), s, split_total_blocks * bs, split_free_blocks * bs, split->fstype, split->fslabel); } log_tag("fsinfo_parity:%s:%" PRIu64 ":%" PRIu64 "\n", lev_config_name(l), state->parity[l].total_blocks * bs, state->parity[l].free_blocks * bs); } /* for all extra disks */ for (i = state->extralist; i != 0; i = i->next) { struct snapraid_extra* extra = i->data; uint64_t total_space; uint64_t free_space; int ret; ret = fsinfo(extra->dir, 0, 0, &total_space, &free_space, extra->fstype, sizeof(extra->fstype), extra->fslabel, sizeof(extra->fslabel)); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error accessing disk '%s' to retrieve file-system info. %s.\n", extra->dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } log_tag("fsinfo_extra:%s:%" PRIu64 ":%" PRIu64 "\n", esc_tag(extra->name), total_space, free_space); } /* note what we don't set need_write = 1, because we don't want */ /* to update the content file only for the free space info. */ } /** * Check the content. */ static void state_content_check(struct snapraid_state* state, const char* path) { tommy_node* i; /* check that any map has different name and position */ for (i = state->maplist; i != 0; i = i->next) { struct snapraid_map* map = i->data; tommy_node* j; for (j = i->next; j != 0; j = j->next) { struct snapraid_map* other = j->data; if (strcmp(map->name, other->name) == 0) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "Conflicting 'map' disk specification in '%s'\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (map->position == other->position) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "Conflicting 'map' index specification in '%s'\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } } /** * Check if the position is REQUIRED, or we can completely clear it from the state. * * Note that position with only DELETED blocks are discharged. */ static int fs_position_is_required(struct snapraid_state* state, block_off_t pos) { tommy_node* i; /* check for each disk */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; struct snapraid_block* block = fs_par2block_find(disk, pos); /* if we have at least one file, the position is needed */ if (block_has_file(block)) return 1; } return 0; } /** * Check if the info block is REQUIREQ. * * This is used to ensure that we keep the last check used for scrubbing. * and that we add it when importing old context files. * * Note that you can have position without info blocks, for example * if all the blocks are not synced. * * Note also that not requiring an info block, doesn't mean that if present it * can be discarded. */ static int fs_info_is_required(struct snapraid_state* state, block_off_t pos) { tommy_node* i; /* check for each disk */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; struct snapraid_block* block = fs_par2block_find(disk, pos); /* if we have at least one synced file, the info is required */ if (block_state_get(block) == BLOCK_STATE_BLK) return 1; } return 0; } static void fs_position_clear_deleted(struct snapraid_state* state, block_off_t pos) { tommy_node* i; /* check for each disk if block is really used */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; struct snapraid_block* block = fs_par2block_find(disk, pos); /* if the block is deleted */ if (block_state_get(block) == BLOCK_STATE_DELETED) { /* set it to empty */ fs_deallocate(disk, pos); } } } /** * Check if a block position in a disk is deleted. */ static int fs_is_block_deleted(struct snapraid_disk* disk, block_off_t pos) { struct snapraid_block* block = fs_par2block_find(disk, pos); return block_state_get(block) == BLOCK_STATE_DELETED; } /** * Check if a block parity needs sync * * This is the same logic used in "status" to detect an incomplete "sync", * that ignores invalid block, if they are not used by a file in any disk. * * This means that DELETED blocks won't necessarily imply an invalid parity. */ static int fs_is_block_unsynced(struct snapraid_state* state, block_off_t pos) { int one_invalid = 0; int one_valid = 0; for (tommy_node* i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; struct snapraid_block* block = fs_par2block_find(disk, pos); if (block_has_file(block)) one_valid = 1; if (block_has_invalid_parity(block)) one_invalid = 1; if (one_invalid && one_valid) return 1; } return 0; } /** * Flush the file checking the final CRC. * We exploit the fact that the CRC is always stored in the last 4 bytes. */ static void decoding_error(const char* path, STREAM* f) { unsigned char buf[4]; uint32_t crc_stored; uint32_t crc_computed; if (seof(f)) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "Unexpected end of content file '%s' at offset %" PRIi64 "\n", path, stell(f)); log_fatal(ECONTENT, "This content file is truncated. Please use an alternate copy.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading the content file '%s' at offset %" PRIi64 "\n", path, stell(f)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } log_fatal(ECONTENT, "Error decoding '%s' at offset %" PRIi64 "\n", path, stell(f)); if (sdeplete(f, buf) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to flush content file '%s' at offset %" PRIi64 "\n", path, stell(f)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* get the stored crc from the last four bytes */ crc_stored = buf[0] | (uint32_t)buf[1] << 8 | (uint32_t)buf[2] << 16 | (uint32_t)buf[3] << 24; /* get the computed crc */ crc_computed = scrc(f); /* adjust the stored crc to include itself */ crc_stored = crc32c(crc_stored, buf, 4); if (crc_computed != crc_stored) { log_fatal(ECONTENT, "CRC mismatch in '%s'\n", path); log_fatal(ECONTENT, "This content file is damaged! Please use an alternate copy.\n"); exit(EXIT_FAILURE); } else { log_fatal(ECONTENT, "The CRC of the file is correct!\n"); } } static void state_read_content(struct snapraid_state* state, const char* path, STREAM* f) { block_off_t blockmax; unsigned count_file; unsigned count_hardlink; unsigned count_symlink; unsigned count_dir; unsigned count_bad; unsigned count_rehash; unsigned count_unsynced; unsigned count_unscrubbed; int crc_checked; char buffer[PATH_MAX]; int ret; tommy_array disk_mapping; uint32_t mapping_max; tommy_hashdyn bucket_hash; blockmax = 0; count_file = 0; count_hardlink = 0; count_symlink = 0; count_dir = 0; count_bad = 0; count_rehash = 0; count_unsynced = 0; count_unscrubbed = 0; crc_checked = 0; mapping_max = 0; tommy_array_init(&disk_mapping); tommy_hashdyn_init(&bucket_hash); /* mark all disks as single threads */ for (tommy_node* i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; disk->single_thread = 1; } ret = sread(f, buffer, 12); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid header!\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* * File format versions: * - SNAPCNT1/SnapRAID 4.0 First version. * - SNAPCNT2/SnapRAID 7.0 Adds entries 'M' and 'P', to add free_blocks support. * The previous 'm' entry is now deprecated, but supported for importing. * Similarly for text file, we add 'mapping' and 'parity' deprecating 'map'. * - SNAPCNT3/SnapRAID 11.0 Adds entry 'y' for hash size. * - SNAPCNT3/SnapRAID 11.0 Adds entry 'Q' for multi parity file. * The previous 'P' entry is now deprecated, but supported for importing. */ if (memcmp(buffer, "SNAPCNT1\n\3\0\0", 12) != 0 && memcmp(buffer, "SNAPCNT2\n\3\0\0", 12) != 0 && memcmp(buffer, "SNAPCNT3\n\3\0\0", 12) != 0 ) { /* LCOV_EXCL_START */ if (memcmp(buffer, "SNAPCNT", 7) != 0) { decoding_error(path, f); log_fatal(ECONTENT, "Invalid header!\n"); os_abort(); } else { log_fatal(ECONTENT, "The content file '%s' was generated with a newer version of SnapRAID!\n", path); exit(EXIT_FAILURE); } /* LCOV_EXCL_STOP */ } while (1) { int c; /* read the command */ c = sgetc(f); if (c == EOF) { break; } if (c == 'f') { /* file */ char sub[PATH_MAX]; uint64_t v_size; uint64_t v_mtime_sec; uint32_t v_mtime_nsec; uint64_t v_inode; uint32_t v_idx; struct snapraid_file* file; struct snapraid_disk* disk; uint32_t mapping; ret = sgetb32(f, &mapping); if (ret < 0 || mapping >= mapping_max) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: File mapping index out of range\n"); os_abort(); /* LCOV_EXCL_STOP */ } disk = tommy_array_get(&disk_mapping, mapping); ret = sgetb64(f, &v_size); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (state->block_size == 0) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Zero blocksize\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* check for impossible file size to avoid to crash for a too big allocation */ if (v_size / state->block_size > blockmax) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: File size too big!\n"); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb64(f, &v_mtime_sec); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_mtime_nsec); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } /* STAT_NSEC_INVALID is encoded as 0 */ if (v_mtime_nsec == 0) v_mtime_nsec = STAT_NSEC_INVALID; else --v_mtime_nsec; ret = sgetb64(f, &v_inode); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetbs(f, sub, sizeof(sub)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (!*sub) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Null file!\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* allocate the file */ file = file_alloc(state->block_size, sub, v_size, v_mtime_sec, v_mtime_nsec, v_inode, 0); /* insert the file in the file containers */ tommy_hashdyn_insert(&disk->inodeset, &file->nodeset, file, file_inode_hash(file->inode)); tommy_hashdyn_insert(&disk->pathset, &file->pathset, file, file_path_hash(file->sub)); tommy_hashdyn_insert(&disk->stampset, &file->stampset, file, file_stamp_hash(file->size, file->mtime_sec, file->mtime_nsec)); tommy_list_insert_tail(&disk->filelist, &file->nodelist, file); /* read all the blocks */ v_idx = 0; while (v_idx < file->blockmax) { block_off_t v_pos; uint32_t v_count; /* get the "subcommand */ c = sgetc(f); ret = sgetb32(f, &v_pos); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_count); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (v_count > file->blockmax || v_idx > file->blockmax - v_count) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Block number out of range\n"); os_abort(); /* LCOV_EXCL_STOP */ } if (v_count > blockmax || v_pos > blockmax - v_count) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Block size %u/%u!\n", blockmax, v_pos + v_count); os_abort(); /* LCOV_EXCL_STOP */ } /* fill the blocks in the run */ while (v_count) { struct snapraid_block* block = fs_file2block_get(file, v_idx); switch (c) { case 'b' : block_state_set(block, BLOCK_STATE_BLK); break; case 'n' : /* deprecated NEW blocks are converted to CHG ones */ block_state_set(block, BLOCK_STATE_CHG); break; case 'g' : block_state_set(block, BLOCK_STATE_CHG); break; case 'p' : block_state_set(block, BLOCK_STATE_REP); break; default : /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid block type!\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* read the hash only for 'blk/chg/rep', and not for 'new' */ if (c != 'n') { ret = sread(f, block->hash, BLOCK_HASH_SIZE); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } } else { /* set the ZERO hash for deprecated NEW blocks */ hash_zero_set(block->hash); } /* if the block contains a hash of past data */ /* and we are clearing such indeterminate hashes */ if (state->clear_past_hash && block_has_past_hash(block) ) { /* set the hash value to INVALID */ hash_invalid_set(block->hash); } /* if we are disabling the copy optimization */ /* we want also to clear any already previously stored information */ /* in other sync commands */ /* note that this is required only in sync, and we detect */ /* this using the clear_past_hash flag */ if (state->clear_past_hash && state->opt.force_nocopy && block_state_get(block) == BLOCK_STATE_REP ) { /* set the hash value to INVALID */ hash_invalid_set(block->hash); /* convert from REP to CHG block */ block_state_set(block, BLOCK_STATE_CHG); } /* set the parity association */ fs_allocate(disk, v_pos, file, v_idx); /* go to the next block */ ++v_idx; ++v_pos; --v_count; } } /* stat */ ++count_file; } else if (c == 'i') { /* "inf" command */ snapraid_info info; uint32_t v_pos; uint64_t v_oldest; ret = sgetb64(f, &v_oldest); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } v_pos = 0; while (v_pos < blockmax) { int bad; int rehash; int justsynced; uint64_t t64; uint32_t flag; uint32_t v_count; ret = sgetb32(f, &v_count); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (v_count > blockmax || v_pos > blockmax - v_count) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Info size %u/%u!\n", blockmax, v_pos + v_count); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &flag); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } /* if there is an info */ if ((flag & 1) != 0) { /* read the time */ ret = sgetb64(f, &t64); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } /* analyze the flags */ bad = (flag & 2) != 0; rehash = (flag & 4) != 0; justsynced = (flag & 8) != 0; if (bad) count_bad += v_count; if (rehash) count_rehash += v_count; if (justsynced) count_unscrubbed += v_count; if (rehash && state->prevhash == HASH_UNDEFINED) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Missing previous checksum!\n"); os_abort(); /* LCOV_EXCL_STOP */ } info = info_make(t64 + v_oldest, bad, rehash, justsynced); bucket_insert(&bucket_hash, t64 + v_oldest, v_count, justsynced); } else { info = 0; } while (v_count) { /* insert the info in the array */ info_set(&state->infoarr, v_pos, info); /* ensure that an info is present only for used positions */ if (fs_info_is_required(state, v_pos)) { if (!info) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Missing info!\n"); os_abort(); /* LCOV_EXCL_STOP */ } } else { /* extra info are accepted for backward compatibility */ /* they are discarded at the first write */ } if (fs_is_block_unsynced(state, v_pos)) ++count_unsynced; /* go to next block */ ++v_pos; --v_count; } } } else if (c == 'h') { /* hole */ uint32_t v_pos; struct snapraid_disk* disk; uint32_t mapping; ret = sgetb32(f, &mapping); if (ret < 0 || mapping >= mapping_max) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Hole mapping index out of range\n"); os_abort(); /* LCOV_EXCL_STOP */ } disk = tommy_array_get(&disk_mapping, mapping); v_pos = 0; while (v_pos < blockmax) { uint32_t v_idx; uint32_t v_count; struct snapraid_file* deleted; ret = sgetb32(f, &v_count); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (v_count > blockmax || v_pos > blockmax - v_count) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Hole size %u/%u!\n", blockmax, v_pos + v_count); os_abort(); /* LCOV_EXCL_STOP */ } /* get the sub-command */ c = sgetc(f); switch (c) { case 'o' : /* if it's a run of deleted blocks */ /* allocate a fake deleted file */ deleted = file_alloc(state->block_size, "", v_count * (data_off_t)state->block_size, 0, 0, 0, 0); /* mark the file as deleted */ file_flag_set(deleted, FILE_IS_DELETED); /* insert it in the list of deleted files */ tommy_list_insert_tail(&disk->deletedlist, &deleted->nodelist, deleted); /* process all blocks */ v_idx = 0; while (v_count) { struct snapraid_block* block = fs_file2block_get(deleted, v_idx); /* set the block as deleted */ block_state_set(block, BLOCK_STATE_DELETED); /* read the hash */ ret = sread(f, block->hash, BLOCK_HASH_SIZE); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } /* if we are clearing indeterminate hashes */ if (state->clear_past_hash) { /* set the hash value to INVALID */ hash_invalid_set(block->hash); } /* insert the block in the block array */ fs_allocate(disk, v_pos, deleted, v_idx); /* go to next block */ ++v_pos; ++v_idx; --v_count; } break; case 'O' : /* go to the next run */ v_pos += v_count; break; default : /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid hole type!\n"); os_abort(); /* LCOV_EXCL_STOP */ } } } else if (c == 's') { /* symlink */ char sub[PATH_MAX]; char linkto[PATH_MAX]; struct snapraid_link* slink; struct snapraid_disk* disk; uint32_t mapping; ret = sgetb32(f, &mapping); if (ret < 0 || mapping >= mapping_max) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Symlink mapping index out of range\n"); os_abort(); /* LCOV_EXCL_STOP */ } disk = tommy_array_get(&disk_mapping, mapping); ret = sgetbs(f, sub, sizeof(sub)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (!*sub) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Null symlink!\n"); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetbs(f, linkto, sizeof(linkto)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } /* allocate the link as symbolic link */ slink = link_alloc(sub, linkto, FILE_IS_SYMLINK); /* insert the link in the link containers */ tommy_hashdyn_insert(&disk->linkset, &slink->nodeset, slink, link_name_hash(slink->sub)); tommy_list_insert_tail(&disk->linklist, &slink->nodelist, slink); /* stat */ ++count_symlink; } else if (c == 'a') { /* hardlink */ char sub[PATH_MAX]; char linkto[PATH_MAX]; struct snapraid_link* slink; struct snapraid_disk* disk; uint32_t mapping; ret = sgetb32(f, &mapping); if (ret < 0 || mapping >= mapping_max) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Hardlink mapping index out of range!\n"); os_abort(); /* LCOV_EXCL_STOP */ } disk = tommy_array_get(&disk_mapping, mapping); ret = sgetbs(f, sub, sizeof(sub)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (!*sub) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Null hardlink!\n"); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetbs(f, linkto, sizeof(linkto)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (!*linkto) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Empty hardlink '%s'!\n", sub); os_abort(); /* LCOV_EXCL_STOP */ } /* allocate the link as hard link */ slink = link_alloc(sub, linkto, FILE_IS_HARDLINK); /* insert the link in the link containers */ tommy_hashdyn_insert(&disk->linkset, &slink->nodeset, slink, link_name_hash(slink->sub)); tommy_list_insert_tail(&disk->linklist, &slink->nodelist, slink); /* stat */ ++count_hardlink; } else if (c == 'r') { /* dir */ char sub[PATH_MAX]; struct snapraid_dir* dir; struct snapraid_disk* disk; uint32_t mapping; ret = sgetb32(f, &mapping); if (ret < 0 || mapping >= mapping_max) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Dir mapping index out of range!\n"); os_abort(); /* LCOV_EXCL_STOP */ } disk = tommy_array_get(&disk_mapping, mapping); ret = sgetbs(f, sub, sizeof(sub)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (!*sub) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EINTERNAL, "Internal inconsistency: Null dir!\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* allocate the dir */ dir = dir_alloc(sub); /* insert the dir in the dir containers */ tommy_hashdyn_insert(&disk->dirset, &dir->nodeset, dir, dir_name_hash(dir->sub)); tommy_list_insert_tail(&disk->dirlist, &dir->nodelist, dir); /* stat */ ++count_dir; } else if (c == 'c') { /* get the subcommand */ c = sgetc(f); switch (c) { case 'u' : state->hash = HASH_MURMUR3; break; case 'k' : state->hash = HASH_SPOOKY2; break; case 'm' : state->hash = HASH_METRO; break; default : /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid checksum!\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* read the seed */ ret = sread(f, state->hashseed, HASH_MAX); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } } else if (c == 'C') { /* get the sub-command */ c = sgetc(f); switch (c) { case 'u' : state->prevhash = HASH_MURMUR3; break; case 'k' : state->prevhash = HASH_SPOOKY2; break; case 'm' : state->prevhash = HASH_METRO; break; default : /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid checksum!\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* read the seed */ ret = sread(f, state->prevhashseed, HASH_MAX); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } } else if (c == 'z') { uint32_t block_size; ret = sgetb32(f, &block_size); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (block_size == 0) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Zero 'blocksize' specification in the content file!\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* without configuration, auto assign the block size */ if (state->no_conf) { state->block_size = block_size; } if (block_size != state->block_size) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EUSER, "Mismatching 'blocksize' specification in the content file!\n"); log_fatal(EUSER, "Please restore the 'blocksize' value in the configuration file to '%u'\n", block_size / KIBI); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } else if (c == 'y') { uint32_t hash_size; ret = sgetb32(f, &hash_size); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (hash_size < 2 || hash_size > HASH_MAX) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid 'hashsize' specification in the content file!\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* without configuration, auto assign the block size */ if (state->no_conf) { BLOCK_HASH_SIZE = hash_size; } if ((int)hash_size != BLOCK_HASH_SIZE) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EUSER, "Mismatching 'hashsize' specification in the content file!\n"); log_fatal(EUSER, "Please restore the 'hashsize' value in the configuration file to '%u'\n", hash_size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } else if (c == 'x') { ret = sgetb32(f, &blockmax); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } } else if (c == 'm' || c == 'M') { struct snapraid_map* map; char uuid[UUID_MAX]; uint32_t v_pos; uint32_t v_total_blocks; uint32_t v_free_blocks; struct snapraid_disk* disk; ret = sgetbs(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_pos); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } /* from SnapRAID 7.0 the 'M' command includes the free space */ if (c == 'M') { ret = sgetb32(f, &v_total_blocks); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_free_blocks); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } log_tag("content_data:%s:%" PRIi64 ":%" PRIi64 "\n", esc_tag(buffer), v_total_blocks * (uint64_t)state->block_size, v_free_blocks * (uint64_t)state->block_size); } else { v_total_blocks = 0; v_free_blocks = 0; } /* read the uuid */ ret = sgetbs(f, uuid, sizeof(uuid)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } log_tag("content_data_split:%s:%s\n", esc_tag(buffer), uuid); /* find the disk */ disk = find_disk_by_name(state, buffer); if (!disk) { /* search by UUID if renamed */ disk = find_disk_by_uuid(state, uuid); if (disk) { log_error(EUSER, "WARNING! Renaming disk '%s' to '%s'\n", buffer, disk->name); /* write the new state with the new name */ state->need_write = 1; } } if (!disk) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EUSER, "Disk '%s' with uuid '%s' not present in the configuration file!\n", buffer, uuid); log_fatal(EUSER, "If you have removed it from the configuration file, please restore it\n"); /* if it's a command without UUID, it cannot autorename using UUID */ if (state->opt.skip_disk_access) log_fatal(EUSER, "If you have renamed it, run 'sync' to update the new name\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } map = map_alloc(disk->name, v_pos, v_total_blocks, v_free_blocks, uuid); tommy_list_insert_tail(&state->maplist, &map->node, map); /* insert in the mapping vector */ tommy_array_grow(&disk_mapping, mapping_max + 1); tommy_array_set(&disk_mapping, mapping_max, disk); ++mapping_max; } else if (c == 'P') { /* from SnapRAID 7.0 the 'P' command includes the free space */ /* from SnapRAID 11.0 the 'P' command is deprecated by 'Q' */ char v_uuid[UUID_MAX]; uint32_t v_level; uint32_t v_total_blocks; uint32_t v_free_blocks; ret = sgetb32(f, &v_level); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_total_blocks); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_free_blocks); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetbs(f, v_uuid, sizeof(v_uuid)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (v_level >= LEV_MAX) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid parity level '%u' in the configuration file!\n", v_level); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } log_tag("content_parity:%s:%" PRIi64 ":%" PRIi64 "\n", lev_config_name(v_level), v_total_blocks * (uint64_t)state->block_size, v_free_blocks * (uint64_t)state->block_size); /* auto configure if configuration is missing */ if (state->no_conf) { if (v_level >= state->level) state->level = v_level + 1; } /* if we use this parity entry */ if (v_level < state->level) { /* if the configuration has more splits, keep them */ if (state->parity[v_level].split_mac < 1) state->parity[v_level].split_mac = 1; /* set the parity info */ pathcpy(state->parity[v_level].split_map[0].uuid, sizeof(state->parity[v_level].split_map[0].uuid), v_uuid); state->parity[v_level].total_blocks = v_total_blocks; state->parity[v_level].free_blocks = v_free_blocks; log_tag("content_parity_split:%s:%s:%s:%" PRIi64 "\n", lev_config_name(v_level), /* P command always has a single split */ state->parity[v_level].split_map[0].uuid, esc_tag(state->parity[v_level].split_map[0].path), state->parity[v_level].split_map[0].size); } } else if (c == 'Q') { /* from SnapRAID 11.0 the 'Q' command include size info and multi file support */ uint32_t v_level; uint32_t v_total_blocks; uint32_t v_free_blocks; uint32_t v_split_mac; unsigned s; ret = sgetb32(f, &v_level); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_total_blocks); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_free_blocks); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb32(f, &v_split_mac); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } if (v_split_mac > SPLIT_MAX) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Too many splits '%u' in the content file!\n", v_split_mac); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (v_level >= LEV_MAX) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid parity level '%u' in the configuration file!\n", v_level); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* auto configure if configuration is missing */ if (state->no_conf) { if (v_level >= state->level) state->level = v_level + 1; if (state->parity[v_level].split_mac < v_split_mac) state->parity[v_level].split_mac = v_split_mac; } /* if we use this parity entry */ if (v_level < state->level) { /* set the parity info */ state->parity[v_level].total_blocks = v_total_blocks; state->parity[v_level].free_blocks = v_free_blocks; } log_tag("content_parity:%s:%" PRIi64 ":%" PRIi64 "\n", lev_config_name(v_level), v_total_blocks * (uint64_t)state->block_size, v_free_blocks * (uint64_t)state->block_size); for (s = 0; s < v_split_mac; ++s) { char v_path[PATH_MAX]; char v_uuid[UUID_MAX]; uint64_t v_size; ret = sgetbs(f, v_path, sizeof(v_path)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetbs(f, v_uuid, sizeof(v_uuid)); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } ret = sgetb64(f, &v_size); if (ret < 0) { /* LCOV_EXCL_START */ decoding_error(path, f); os_abort(); /* LCOV_EXCL_STOP */ } /* if we use this parity entry */ if (v_level < state->level) { /* if this split was removed from the configuration */ if (s >= state->parity[v_level].split_mac) { /* if the file is used, we really need it */ if (v_size != 0) { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(EUSER, "Parity '%s' misses used file '%u'!\n", lev_config_name(v_level), s); log_fatal(EUSER, "If you have removed it from the configuration file, please restore it\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* otherwise we can drop it */ log_error(EUSER, "WARNING! Dropping from '%s' unused split '%u'\n", lev_config_name(v_level), s); } else { char parity_name[64]; /* we copy the path only if without configuration file */ if (state->no_conf) pathcpy(state->parity[v_level].split_map[s].path, sizeof(state->parity[v_level].split_map[s].path), v_path); /* set the split info */ pathcpy(state->parity[v_level].split_map[s].uuid, sizeof(state->parity[v_level].split_map[s].uuid), v_uuid); state->parity[v_level].split_map[s].size = v_size; if (s == 0) pathcpy(parity_name, sizeof(parity_name), lev_config_name(v_level)); else pathprint(parity_name, sizeof(parity_name), "%s/%u", lev_config_name(v_level), s); log_tag("content_parity_split:%s:%s:%s:%" PRIi64 "\n", parity_name, state->parity[v_level].split_map[s].uuid, esc_tag(state->parity[v_level].split_map[s].path), state->parity[v_level].split_map[s].size); } } } } else if (c == 'N') { uint32_t crc_stored; uint32_t crc_computed; /* get the crc before reading it from the file */ crc_computed = scrc(f); ret = sgetble32(f, &crc_stored); if (ret < 0) { /* LCOV_EXCL_START */ /* here don't call decoding_error() because it's too late to get the crc */ log_fatal(errno, "Error reading the CRC in '%s' at offset %" PRIi64 "\n", path, stell(f)); log_fatal(errno, "This content file is damaged! Use an alternate copy.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (crc_stored != crc_computed) { /* LCOV_EXCL_START */ /* here don't call decoding_error() because it's too late to get the crc */ log_fatal(ECONTENT, "CRC mismatch in '%s'\n", path); log_fatal(ECONTENT, "The content file is damaged! Please use an alternate copy.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } crc_checked = 1; } else { /* LCOV_EXCL_START */ decoding_error(path, f); log_fatal(ECONTENT, "Invalid command '%c'!\n", (char)c); os_abort(); /* LCOV_EXCL_STOP */ } } /* mark all disks as multi threads */ for (tommy_node* i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; disk->single_thread = 0; } tommy_array_done(&disk_mapping); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reading the content file '%s' at offset %" PRIi64 "\n", path, stell(f)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!crc_checked) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "Reached the end of '%s' without finding the expected CRC\n", path); log_fatal(ECONTENT, "This content file is truncated or damaged! Use an alternate copy.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* check the file-system on all disks */ state_fscheck(state, "after read"); /* check that the stored parity size matches the loaded state */ if (blockmax != parity_allocated_size(state)) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Parity size %u/%u in '%s' at offset %" PRIi64 "\n", blockmax, parity_allocated_size(state), path, stell(f)); if (state->opt.skip_content_check) { log_fatal(ECONTENT, "Overriding.\n"); blockmax = parity_allocated_size(state); } else { exit(EXIT_FAILURE); } /* LCOV_EXCL_STOP */ } msg_verbose("%8u files\n", count_file); msg_verbose("%8u hardlinks\n", count_hardlink); msg_verbose("%8u symlinks\n", count_symlink); msg_verbose("%8u empty dirs\n", count_dir); log_tag("content_info:file:%u\n", count_file); log_tag("content_info:hardlink:%u\n", count_hardlink); log_tag("content_info:symlink:%u\n", count_symlink); log_tag("content_info:dir_empty:%u\n", count_dir); log_tag("content_info:block:%u\n", blockmax); log_tag("content_info:block_bad:%u\n", count_bad); log_tag("content_info:block_rehash:%u\n", count_rehash); log_tag("content_info:block_unsynced:%u\n", count_unsynced); log_tag("content_info:block_unscrubbed:%u\n", count_unscrubbed); /* store the blocks counters */ state->rehash_blocks = count_rehash; state->bad_blocks = count_bad; state->unsynced_blocks = count_unsynced; state->unscrubbed_blocks = count_unscrubbed; /* store the bucket info list */ bucket_to_list(&bucket_hash, &state->bucketlist, &state->bucketcount); tommy_hashdyn_done(&bucket_hash); } struct state_write_thread_context { struct snapraid_state* state; #if HAVE_MT_WRITE thread_id_t thread; #endif /* input */ block_off_t blockmax; time_t info_oldest; time_t info_now; int info_has_rehash; STREAM* f; int first; /* output (required to postpone the output to the terminal after the latest write) */ uint32_t crc; unsigned count_file; unsigned count_hardlink; unsigned count_symlink; unsigned count_dir; unsigned count_bad; unsigned count_rehash; unsigned count_unsynced; unsigned count_unscrubbed; }; static void* state_write_thread(void* arg) { struct state_write_thread_context* context = arg; struct snapraid_state* state = context->state; block_off_t blockmax = context->blockmax; time_t info_oldest = context->info_oldest; time_t info_now = context->info_now; int info_has_rehash = context->info_has_rehash; STREAM* f = context->f; uint32_t crc; uint64_t t64; unsigned count_file; unsigned count_hardlink; unsigned count_symlink; unsigned count_dir; unsigned count_bad; unsigned count_rehash; unsigned count_unsynced; unsigned count_unscrubbed; tommy_node* i; block_off_t idx; block_off_t begin; unsigned l, s; tommy_hashdyn bucket_hash; count_file = 0; count_hardlink = 0; count_symlink = 0; count_dir = 0; count_bad = 0; count_rehash = 0; count_unsynced = 0; count_unscrubbed = 0; tommy_hashdyn_init(&bucket_hash); /* force version 3 a we want to always store the parity size */ /* write header */ swrite("SNAPCNT3\n\3\0\0", 12, f); /* write block size and block max */ sputc('z', f); sputb32(state->block_size, f); sputc('x', f); sputb32(blockmax, f); /* hash size */ sputc('y', f); sputb32(BLOCK_HASH_SIZE, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } sputc('c', f); if (state->hash == HASH_MURMUR3) { sputc('u', f); } else if (state->hash == HASH_SPOOKY2) { sputc('k', f); } else if (state->hash == HASH_METRO) { sputc('m', f); } else { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Unexpected hash when writing the content file '%s'.\n", serrorfile(f)); goto bail; /* LCOV_EXCL_STOP */ } swrite(state->hashseed, HASH_MAX, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* previous hash only present */ if (state->prevhash != HASH_UNDEFINED) { /* if at least one rehash tag found, we have to save the previous hash */ if (info_has_rehash) { sputc('C', f); if (state->prevhash == HASH_MURMUR3) { sputc('u', f); } else if (state->prevhash == HASH_SPOOKY2) { sputc('k', f); } else if (state->prevhash == HASH_METRO) { sputc('m', f); } else { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Unexpected prevhash when writing the content file '%s'.\n", serrorfile(f)); goto bail; /* LCOV_EXCL_STOP */ } swrite(state->prevhashseed, HASH_MAX, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } } } /* for each map */ for (i = state->maplist; i != 0; i = i->next) { struct snapraid_map* map = i->data; struct snapraid_disk* disk; /* find the disk for this mapping */ disk = find_disk_by_name(state, map->name); if (!disk) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Unmapped disk '%s'\n", map->name); goto bail; /* LCOV_EXCL_STOP */ } /* save the mapping only if disk is mapped */ if (disk->mapping_idx != -1) { sputc('M', f); sputbs(map->name, f); sputb32(map->position, f); sputb32(map->total_blocks, f); sputb32(map->free_blocks, f); sputbs(map->uuid, f); if (context->first) { log_tag("content_data:%s:%" PRIi64 ":%" PRIi64 "\n", esc_tag(map->name), map->total_blocks * (uint64_t)state->block_size, map->free_blocks * (uint64_t)state->block_size); log_tag("content_data_split:%s:%s\n", esc_tag(map->name), map->uuid); } if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } } } /* for each parity */ for (l = 0; l < state->level; ++l) { sputc('Q', f); sputb32(l, f); sputb32(state->parity[l].total_blocks, f); sputb32(state->parity[l].free_blocks, f); if (context->first) { log_tag("content_parity:%s:%" PRIi64 ":%" PRIi64 "\n", lev_config_name(l), state->parity[l].total_blocks * (uint64_t)state->block_size, state->parity[l].free_blocks * (uint64_t)state->block_size); } sputb32(state->parity[l].split_mac, f); for (s = 0; s < state->parity[l].split_mac; ++s) { char parity_name[64]; sputbs(state->parity[l].split_map[s].path, f); sputbs(state->parity[l].split_map[s].uuid, f); sputb64(state->parity[l].split_map[s].size, f); if (s == 0) pathcpy(parity_name, sizeof(parity_name), lev_config_name(l)); else pathprint(parity_name, sizeof(parity_name), "%s/%u", lev_config_name(l), s); if (context->first) { log_tag("content_parity_split:%s:%s:%s:%" PRIi64 "\n", parity_name, state->parity[l].split_map[s].uuid, state->parity[l].split_map[s].path, state->parity[l].split_map[s].size); } } if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } } /* for each disk */ for (i = state->disklist; i != 0; i = i->next) { tommy_node* j; struct snapraid_disk* disk = i->data; /* if the disk is not mapped, skip it */ if (disk->mapping_idx < 0) continue; /* for each file */ for (j = disk->filelist; j != 0; j = j->next) { struct snapraid_file* file = j->data; uint64_t size; uint64_t mtime_sec; int32_t mtime_nsec; uint64_t inode; size = file->size; mtime_sec = file->mtime_sec; mtime_nsec = file->mtime_nsec; inode = file->inode; sputc('f', f); sputb32(disk->mapping_idx, f); sputb64(size, f); sputb64(mtime_sec, f); /* encode STAT_NSEC_INVALID as 0 */ if (mtime_nsec == STAT_NSEC_INVALID) sputb32(0, f); else sputb32(mtime_nsec + 1, f); sputb64(inode, f); sputbs(file->sub, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* for all the blocks of the file */ begin = 0; while (begin < file->blockmax) { unsigned v_state = block_state_get(fs_file2block_get(file, begin)); block_off_t v_pos = fs_file2par_get(disk, file, begin); uint32_t v_count; block_off_t end; /* find the end of run of blocks */ end = begin + 1; while (end < file->blockmax) { if (v_state != block_state_get(fs_file2block_get(file, end))) break; if (v_pos + (end - begin) != fs_file2par_get(disk, file, end)) break; ++end; } switch (v_state) { case BLOCK_STATE_BLK : sputc('b', f); break; case BLOCK_STATE_CHG : sputc('g', f); break; case BLOCK_STATE_REP : sputc('p', f); break; default : /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: State for block %u state %u\n", v_pos, v_state); goto bail; /* LCOV_EXCL_STOP */ } sputb32(v_pos, f); v_count = end - begin; sputb32(v_count, f); /* write hashes */ for (idx = begin; idx < end; ++idx) { struct snapraid_block* block = fs_file2block_get(file, idx); swrite(block->hash, BLOCK_HASH_SIZE, f); } if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* next begin position */ begin = end; } ++count_file; } /* for each link */ for (j = disk->linklist; j != 0; j = j->next) { struct snapraid_link* slink = j->data; switch (link_flag_get(slink, FILE_IS_LINK_MASK)) { case FILE_IS_HARDLINK : sputc('a', f); ++count_hardlink; break; case FILE_IS_SYMLINK : sputc('s', f); ++count_symlink; break; } sputb32(disk->mapping_idx, f); sputbs(slink->sub, f); sputbs(slink->linkto, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } } /* for each dir */ for (j = disk->dirlist; j != 0; j = j->next) { struct snapraid_dir* dir = j->data; sputc('r', f); sputb32(disk->mapping_idx, f); sputbs(dir->sub, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } ++count_dir; } /* deleted blocks of the disk */ sputc('h', f); sputb32(disk->mapping_idx, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } begin = 0; while (begin < blockmax) { int is_deleted; block_off_t end; is_deleted = fs_is_block_deleted(disk, begin); /* find the end of run of blocks */ end = begin + 1; while (end < blockmax && is_deleted == fs_is_block_deleted(disk, end) ) { ++end; } sputb32(end - begin, f); if (is_deleted) { /* write the run of deleted blocks with hash */ sputc('o', f); /* write all the hash */ while (begin < end) { struct snapraid_block* block = fs_par2block_get(disk, begin); swrite(block->hash, BLOCK_HASH_SIZE, f); ++begin; } } else { /* write the run of blocks without hash */ /* they can be either used or empty blocks */ sputc('O', f); /* next begin position */ begin = end; } if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } } } /* write the info for each block */ sputc('i', f); /* ensure to write a 64 bit time */ t64 = info_oldest; sputb64(t64, f); begin = 0; while (begin < blockmax) { snapraid_info info; block_off_t end; block_off_t count; time_t t; unsigned flag; info = info_get(&state->infoarr, begin); /* avoid this slow operation if not needed */ if (context->first && fs_is_block_unsynced(state, begin)) ++count_unsynced; /* find the end of run of blocks */ end = begin + 1; while (end < blockmax && info == info_get(&state->infoarr, end) ) { if (context->first && fs_is_block_unsynced(state, end)) ++count_unsynced; ++end; } count = end - begin; sputb32(count, f); /* if there is info */ if (info) { /* other flags */ flag = 1; /* info is present */ if (info_get_bad(info)) { flag |= 2; if (context->first) count_bad += count; } if (info_get_rehash(info)) { flag |= 4; if (context->first) count_rehash += count; } if (info_get_justsynced(info)) { flag |= 8; if (context->first) count_unscrubbed += count; } sputb32(flag, f); t = info_get_time(info); if (context->first) bucket_insert(&bucket_hash, t, count, flag & 8); /* truncate any time that is in the future */ if (t > info_now) t = info_now; /* the oldest info is computed only on required blocks, so it may not be the absolute oldest */ if (t < info_oldest) t = 0; else t -= info_oldest; /* ensure to write a 64 bit time */ t64 = t; sputb64(t64, f); } else { /* write a special 0 flag to mark missing info */ sputb32(0, f); } if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* next begin position */ begin = end; } sputc('N', f); /* flush data written to the disk */ if (sflush(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s' (in flush before crc). %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* get the file crc */ crc = scrc(f); /* compare the crc of the data written to file */ /* with the one of the data written to the stream */ if (crc != scrc_stream(f)) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "CRC mismatch while writing the content stream.\n"); log_fatal(ECONTENT, "DANGER! Your RAM memory is faulty! DO NOT PROCEED UNTIL FIXED!\n"); log_fatal(ECONTENT, "Try running a memory test like http://www.memtest86.com/\n"); goto bail; /* LCOV_EXCL_STOP */ } sputble32(crc, f); if (serror(f)) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s'. %s.\n", serrorfile(f), strerror(errno)); goto bail; /* LCOV_EXCL_STOP */ } /* set output variables */ context->crc = crc; context->count_file = count_file; context->count_hardlink = count_hardlink; context->count_symlink = count_symlink; context->count_dir = count_dir; context->count_bad = count_bad; context->count_rehash = count_rehash; context->count_unsynced = count_unsynced; context->count_unscrubbed = count_unscrubbed; /* store the bucket info list */ if (context->first) bucket_to_list(&bucket_hash, &state->bucketlist, &state->bucketcount); tommy_hashdyn_done(&bucket_hash); return 0; bail: tommy_hashdyn_done(&bucket_hash); return context; } static void state_write_content(struct snapraid_state* state, uint32_t* out_crc) { #if HAVE_MT_WRITE int fail; int first; #else STREAM* f; unsigned count_content; unsigned k; struct state_write_thread_context* context; void* retval; #endif tommy_node* i; block_off_t blockmax; time_t info_oldest; time_t info_now; int info_has_rehash; int mapping_idx; block_off_t idx; uint32_t crc; unsigned count_file; unsigned count_hardlink; unsigned count_symlink; unsigned count_dir; unsigned count_bad; unsigned count_rehash; unsigned count_unsynced; unsigned count_unscrubbed; /* blocks of all array */ blockmax = parity_allocated_size(state); /* check the file-system on all disks */ state_fscheck(state, "before write"); /* clear the info for unused blocks */ /* and get some other info */ info_oldest = 0; /* oldest time in info */ info_now = time(0); /* get the present time */ info_has_rehash = 0; /* if there is a rehash info */ for (idx = 0; idx < blockmax; ++idx) { /* if the position is used */ if (fs_position_is_required(state, idx)) { snapraid_info info = info_get(&state->infoarr, idx); /* only if there is some info to store */ if (info) { time_t info_time = info_get_time(info); if (!info_oldest || info_time < info_oldest) info_oldest = info_time; if (info_get_rehash(info)) info_has_rehash = 1; } } else { /* clear any previous info */ info_set(&state->infoarr, idx, 0); /* and clear any deleted blocks */ fs_position_clear_deleted(state, idx); } } if (info_has_rehash && state->prevhash == HASH_UNDEFINED) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Rehash blocks found but previous checksum is missing!\n"); os_abort(); /* LCOV_EXCL_STOP */ } /* map disks */ mapping_idx = 0; for (i = state->maplist; i != 0; i = i->next) { struct snapraid_map* map = i->data; struct snapraid_disk* disk; /* find the disk for this mapping */ disk = find_disk_by_name(state, map->name); if (!disk) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: Unmapped disk '%s'\n", map->name); os_abort(); /* LCOV_EXCL_STOP */ } /* save the mapping only for not empty disks */ if (!fs_is_empty(disk, blockmax)) { /* assign the mapping index used to identify disks */ disk->mapping_idx = mapping_idx; ++mapping_idx; } else { /* mark the disk as without mapping */ disk->mapping_idx = -1; } } #if HAVE_MT_WRITE /* start all writing threads */ first = 1; i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; struct state_write_thread_context* context; char tmp[PATH_MAX]; STREAM* f; msg_progress("Saving state to %s...\n", content->content); log_tag("content_write:%s\n", esc_tag(content->content)); pathprint(tmp, sizeof(tmp), "%s.tmp", content->content); /* ensure to delete a previous stale file */ if (remove(tmp) != 0) { if (errno != ENOENT) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing the stale content file '%s'. %s.\n", tmp, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } f = sopen_write(tmp); if (f == 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening the temporary content file '%s'. %s.\n", tmp, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* allocate the thread context */ context = malloc_nofail(sizeof(struct state_write_thread_context)); content->context = context; /* initialize */ context->state = state; context->blockmax = blockmax; context->info_oldest = info_oldest; context->info_now = info_now; context->info_has_rehash = info_has_rehash; context->f = f; context->first = first; first = 0; thread_create(&context->thread, state_write_thread, context); i = i->next; } /* join all thread */ fail = 0; first = 1; crc = 0; count_file = 0; count_hardlink = 0; count_symlink = 0; count_dir = 0; count_bad = 0; count_rehash = 0; count_unsynced = 0; count_unscrubbed = 0; i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; struct state_write_thread_context* context = content->context; void* retval; thread_join(context->thread, &retval); if (retval) { /* LCOV_EXCL_START */ fail = 1; /* LCOV_EXCL_STOP */ } else { STREAM* f = context->f; /* Use the sequence fflush() -> fsync() -> fclose() -> rename() to ensure */ /* than even in a system crash event we have one valid copy of the file. */ if (sflush(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s', in flush(). %s.\n", serrorfile(f), strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #if HAVE_FSYNC if (ssync(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s' in sync(). %s.\n", serrorfile(f), strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif if (sclose(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing the content file. %s.\n", strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (first) { first = 0; crc = context->crc; count_file = context->count_file; count_hardlink = context->count_hardlink; count_symlink = context->count_symlink; count_dir = context->count_dir; cound_bad = context->count_bad; count_rehash = context->count_rehash; count_unsynced = context->count_unsynced; count_unscrubbed = context->count_unscrubbed; } else { if (crc != context->crc) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "Different CRCs writing content streams.\n"); log_fatal(ECONTENT, "DANGER! Your RAM memory is broken! DO NOT PROCEED UNTIL FIXED!\n"); log_fatal(ECONTENT, "Try running a memory test like http://www.memtest86.com/\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } } free(context); i = i->next; } /* abort on failure */ if (fail) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #else /* count the content files */ count_content = 0; i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; msg_progress("Saving state to %s...\n", content->content); ++count_content; i = i->next; } /* open all the content files */ f = sopen_multi_write(count_content, STREAM_FLAGS_SEQUENTIAL | STREAM_FLAGS_CRC); if (!f) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening the content files.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } k = 0; i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; char tmp[PATH_MAX]; pathprint(tmp, sizeof(tmp), "%s.tmp", content->content); /* ensure to delete a previous stale file */ if (remove(tmp) != 0) { if (errno != ENOENT) { /* LCOV_EXCL_START */ log_fatal(errno, "Error removing the stale content file '%s'. %s.\n", tmp, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } if (sopen_multi_file(f, k, tmp) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening the temporary content file '%s'. %s.\n", tmp, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } ++k; i = i->next; } /* allocate the thread context */ context = malloc_nofail(sizeof(struct state_write_thread_context)); /* initialize */ context->state = state; context->blockmax = blockmax; context->info_oldest = info_oldest; context->info_now = info_now; context->info_has_rehash = info_has_rehash; context->f = f; context->first = 1; retval = state_write_thread(context); /* abort on failure */ if (retval) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* Use the sequence fflush() -> fsync() -> fclose() -> rename() to ensure */ /* than even in a system crash event we have one valid copy of the file. */ if (sflush(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s', in flush(). %s.\n", serrorfile(f), strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #if HAVE_FSYNC if (ssync(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error writing the content file '%s' in sync(). %s.\n", serrorfile(f), strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif if (sclose(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing the content file. %s.\n", strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } crc = context->crc; count_file = context->count_file; count_hardlink = context->count_hardlink; count_symlink = context->count_symlink; count_dir = context->count_dir; count_bad = context->count_bad; count_rehash = context->count_rehash; count_unsynced = context->count_unsynced; count_unscrubbed = context->count_unscrubbed; free(context); #endif msg_verbose("%8u files\n", count_file); msg_verbose("%8u hardlinks\n", count_hardlink); msg_verbose("%8u symlinks\n", count_symlink); msg_verbose("%8u empty dirs\n", count_dir); log_tag("content_info:file:%u\n", count_file); log_tag("content_info:hardlink:%u\n", count_hardlink); log_tag("content_info:symlink:%u\n", count_symlink); log_tag("content_info:dir_empty:%u\n", count_dir); log_tag("content_info:block:%u\n", blockmax); log_tag("content_info:block_bad:%u\n", count_bad); log_tag("content_info:block_rehash:%u\n", count_rehash); log_tag("content_info:block_unsynced:%u\n", count_unsynced); log_tag("content_info:block_unscrubbed:%u\n", count_unscrubbed); /* store the blocks counters */ state->rehash_blocks = count_rehash; state->bad_blocks = count_bad; state->unsynced_blocks = count_unsynced; state->unscrubbed_blocks = count_unscrubbed; *out_crc = crc; } void state_probe(struct snapraid_state* state) { char path[PATH_MAX]; struct stat st; tommy_node* node; /* iterate over all the available content files and check the first one present */ node = tommy_list_head(&state->contentlist); while (node) { struct snapraid_content* content = node->data; pathcpy(path, sizeof(path), content->content); if (stat(path, &st) == 0) { /* if found stop the search */ break; } /* next content file */ node = node->next; } /* if not found, assume empty */ if (!node) return; if (!state->no_conf) { /* intentionally don't output the content path because it's not really read */ log_tag("content_info:probe_unixtime:%" PRId64 "\n", (int64_t)st.st_mtime); log_flush(); } } void state_read(struct snapraid_state* state) { STREAM* f; char path[PATH_MAX]; struct stat st; tommy_node* node; int ret; int c; /* iterate over all the available content files and load the first one present */ f = 0; node = tommy_list_head(&state->contentlist); while (node) { struct snapraid_content* content = node->data; pathcpy(path, sizeof(path), content->content); msg_progress("Loading state from %s...\n", path); f = sopen_read(path, STREAM_FLAGS_SEQUENTIAL | STREAM_FLAGS_CRC); if (f != 0) { /* if found stop the search */ break; } else { /* if it's real error of an existing file, abort */ if (errno != ENOENT) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening the content file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* otherwise continue */ if (node->next) { log_error(errno, "WARNING! Content file '%s' not found, attempting with another copy...\n", path); /* ensure to rewrite all the content files */ state->need_write = 1; } } /* next content file */ node = node->next; } /* if not found, assume empty */ if (!f) { log_error(EUSER, "No content file found. Assuming empty.\n"); /* create the initial mapping */ state_map(state); return; } /* get the stat of the content file */ ret = fstat(shandle(f), &st); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error stating the content file '%s'. %s.\n", path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (!state->no_conf) { log_tag("content:%s\n", esc_tag(path)); log_tag("content_info:read_unixtime:%" PRId64 "\n", (int64_t)st.st_mtime); log_flush(); } /* go further to check other content files */ while (node) { char other_path[PATH_MAX]; struct stat other_st; struct snapraid_content* content = node->data; pathcpy(other_path, sizeof(other_path), content->content); ret = stat(other_path, &other_st); if (ret != 0) { /* allow missing content files, but not any other kind of error */ if (errno != ENOENT) { /* LCOV_EXCL_START */ log_fatal(errno, "Error stating the content file '%s'. %s.\n", other_path, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* ensure to rewrite all the content files */ state->need_write = 1; } else { /* if the size is different */ if (other_st.st_size != st.st_size) { log_error(ECONTENT, "WARNING! Content files '%s' and '%s' have a different size!\n", path, other_path); log_error(ECONTENT, "Likely one of the two is broken!\n"); /* ensure to rewrite all the content files */ state->need_write = 1; } } /* next content file */ node = node->next; } /* start with a undefined default. */ /* it's for compatibility with version 1.0 where MD5 was implicit. */ state->hash = HASH_UNDEFINED; /* start with a zero seed, it was the default in old versions */ memset(state->hashseed, 0, HASH_MAX); /* previous hash, start with an undefined value */ state->prevhash = HASH_UNDEFINED; /* intentionally not set the prevhashseed, if used valgrind will warn about it */ /* get the first char to detect the file type */ c = sgetc(f); sungetc(c, f); /* guess the file type from the first char */ if (c == 'S') { state_read_content(state, path, f); } else { /* LCOV_EXCL_START */ log_fatal(EUSER, "From SnapRAID v9.0 the text content file is not supported anymore.\n"); log_fatal(EUSER, "You have first to upgrade to SnapRAID v8.1 to convert it to binary format.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } sclose(f); if (state->hash == HASH_UNDEFINED) { /* LCOV_EXCL_START */ log_fatal(EUSER, "The checksum to use is not specified.\n"); log_fatal(EUSER, "This happens because you are likely upgrading from SnapRAID 1.0.\n"); log_fatal(EUSER, "To use a new SnapRAID you must restart from scratch,\n"); log_fatal(EUSER, "deleting all the content and parity files.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* update the mapping */ state_map(state); state_content_check(state, path); /* mark that we read the content file, and it passed all the checks */ state->checked_read = 1; } struct state_verify_thread_context { struct snapraid_state* state; struct snapraid_content* content; #if HAVE_MT_VERIFY thread_id_t thread; #else void* retval; #endif /* input */ uint32_t crc; STREAM* f; }; static void* state_verify_thread(void* arg) { struct state_verify_thread_context* context = arg; struct snapraid_content* content = context->content; STREAM* f = context->f; unsigned char buf[4]; uint32_t crc_stored; uint32_t crc_computed; uint64_t start; start = os_tick_ms(); if (sdeplete(f, buf) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to flush content file '%s'. %s.\n", serrorfile(f), strerror(errno)); return context; /* LCOV_EXCL_STOP */ } /* get the stored crc from the last four bytes */ crc_stored = buf[0] | (uint32_t)buf[1] << 8 | (uint32_t)buf[2] << 16 | (uint32_t)buf[3] << 24; if (crc_stored != context->crc) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "DANGER! Wrong stored CRC in '%s'\n", serrorfile(f)); return context; /* LCOV_EXCL_STOP */ } /* get the computed crc */ crc_computed = scrc(f); /* adjust the stored crc to include itself */ crc_stored = crc32c(crc_stored, buf, 4); if (crc_computed != crc_stored) { /* LCOV_EXCL_START */ log_fatal(ECONTENT, "DANGER! Wrong file CRC in '%s'\n", serrorfile(f)); return context; /* LCOV_EXCL_STOP */ } msg_progress("Verified %s in %" PRIu64 " seconds\n", content->content, (os_tick_ms() - start) / 1000); return 0; } static void state_verify_content(struct snapraid_state* state, uint32_t crc) { tommy_node* i; int fail; msg_progress("Verifying...\n"); /* start all reading threads */ i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; struct state_verify_thread_context* context; char tmp[PATH_MAX]; STREAM* f; pathprint(tmp, sizeof(tmp), "%s.tmp", content->content); f = sopen_read(tmp, STREAM_FLAGS_SEQUENTIAL | STREAM_FLAGS_CRC); if (f == 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error reopening the temporary content file '%s'. %s.\n", tmp, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* allocate the thread context */ context = malloc_nofail(sizeof(struct state_verify_thread_context)); content->context = context; /* initialize */ context->state = state; context->content = content; context->crc = crc; context->f = f; #if HAVE_MT_VERIFY thread_create(&context->thread, state_verify_thread, context); #else context->retval = state_verify_thread(context); #endif i = i->next; } /* join all thread */ fail = 0; i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; struct state_verify_thread_context* context = content->context; void* retval; #if HAVE_MT_VERIFY thread_join(context->thread, &retval); #else retval = context->retval; #endif if (retval) { /* LCOV_EXCL_START */ fail = 1; /* LCOV_EXCL_STOP */ } else { STREAM* f = context->f; if (sclose(f) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing the content file. %s.\n", strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } free(context); i = i->next; } /* abort on failure */ if (fail) { /* LCOV_EXCL_START */ exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } static void state_rename_content(struct snapraid_state* state) { tommy_node* i; #if defined(_linux) /* this sequence is linux specific */ i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; char tmp[PATH_MAX]; char dir[PATH_MAX]; char* slash; int handle; pathcpy(dir, sizeof(dir), content->content); slash = strrchr(dir, '/'); if (slash) slash[1] = 0; else pathcpy(dir, sizeof(dir), "."); /* open the directory to get the handle */ handle = open(dir, O_RDONLY | O_DIRECTORY); if (handle < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error opening the directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* now rename the just written copy with the correct name */ pathprint(tmp, sizeof(tmp), "%s.tmp", content->content); if (rename(tmp, content->content) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error renaming the content file '%s' to '%s'. %s.\n", tmp, content->content, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* sync the directory */ if (fsync(handle) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error syncing the directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (close(handle) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error closing the directory '%s'. %s.\n", dir, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } i = i->next; } #else i = tommy_list_head(&state->contentlist); while (i) { struct snapraid_content* content = i->data; char tmp[PATH_MAX]; /* now renames the just written copy with the correct name */ pathprint(tmp, sizeof(tmp), "%s.tmp", content->content); if (rename(tmp, content->content) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Error renaming the content file '%s' to '%s' in rename(). %s.\n", tmp, content->content, strerror(errno)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } i = i->next; } #endif } void state_write(struct snapraid_state* state) { uint32_t crc; time_t now; /* write all the content files */ state_write_content(state, &crc); /* verify the just written files */ state_verify_content(state, crc); /* rename the new files, over the old ones */ state_rename_content(state); /* log the write time of the content file */ now = time(0); log_tag("content_info:write_unixtime:%" PRId64 "\n", (int64_t)now); log_flush(); state->need_write = 0; /* no write needed anymore */ state->checked_read = 0; /* what we wrote is not checked in read */ state->written = 1; } void state_skip(struct snapraid_state* state) { tommy_node* i; /* for each disk */ for (i = state->disklist; i != 0; i = i->next) { tommy_node* j; struct snapraid_disk* disk = i->data; if (!disk->skip_access) continue; /* for each file */ for (j = tommy_list_head(&disk->filelist); j != 0; j = j->next) { struct snapraid_file* file = j->data; file_flag_set(file, FILE_IS_EXCLUDED); } /* for each link */ for (j = tommy_list_head(&disk->linklist); j != 0; j = j->next) { struct snapraid_link* slink = j->data; link_flag_set(slink, FILE_IS_EXCLUDED); } /* for each dir */ for (j = tommy_list_head(&disk->dirlist); j != 0; j = j->next) { struct snapraid_dir* dir = j->data; dir_flag_set(dir, FILE_IS_EXCLUDED); } } } void state_filter(struct snapraid_state* state, tommy_list* filterlist_file, tommy_list* filterlist_disk, int filter_missing, int filter_error) { tommy_node* i; unsigned l; /* if no filter, include all */ if (!filter_missing && !filter_error && tommy_list_empty(filterlist_file) && tommy_list_empty(filterlist_disk)) return; msg_progress("Selecting...\n"); for (i = tommy_list_head(filterlist_disk); i != 0; i = i->next) { struct snapraid_filter* filter = i->data; msg_verbose("\t%s%s\n", filter->pattern, filter->is_disk ? "//" : ""); } for (i = tommy_list_head(filterlist_file); i != 0; i = i->next) { struct snapraid_filter* filter = i->data; msg_verbose("\t%s%s\n", filter->pattern, filter->is_dir ? "/" : ""); } if (filter_missing) msg_verbose("\t\n"); if (filter_error) msg_verbose("\t\n"); /* for each disk */ for (i = state->disklist; i != 0; i = i->next) { tommy_node* j; struct snapraid_disk* disk = i->data; /* if we filter for presence, we have to access the disk, so better to print something */ if (filter_missing) msg_progress("Scanning disk %s...\n", disk->name); /* for each file */ for (j = tommy_list_head(&disk->filelist); j != 0; j = j->next) { struct snapraid_file* file = j->data; if (filter_path(filterlist_disk, 0, disk->name, file->sub) != 0 || filter_path(filterlist_file, 0, disk->name, file->sub) != 0 || filter_existence(filter_missing, disk->dir, file->sub) != 0 || filter_correctness(filter_error, &state->infoarr, disk, file) != 0 ) { file_flag_set(file, FILE_IS_EXCLUDED); } } /* for each link */ for (j = tommy_list_head(&disk->linklist); j != 0; j = j->next) { struct snapraid_link* slink = j->data; if (filter_path(filterlist_disk, 0, disk->name, slink->sub) != 0 || filter_path(filterlist_file, 0, disk->name, slink->sub) != 0 || filter_existence(filter_missing, disk->dir, slink->sub) != 0 ) { link_flag_set(slink, FILE_IS_EXCLUDED); } } /* for each empty dir */ for (j = tommy_list_head(&disk->dirlist); j != 0; j = j->next) { struct snapraid_dir* dir = j->data; if (filter_emptydir(filterlist_disk, 0, disk->name, dir->sub) != 0 || filter_emptydir(filterlist_file, 0, disk->name, dir->sub) != 0 || filter_existence(filter_missing, disk->dir, dir->sub) != 0 ) { dir_flag_set(dir, FILE_IS_EXCLUDED); } } } /* if we are filtering by disk, exclude any parity not explicitly included */ if (!tommy_list_empty(filterlist_disk)) { /* for each parity disk */ for (l = 0; l < state->level; ++l) { /* check if the parity is excluded by name */ if (filter_path(filterlist_disk, 0, lev_config_name(l), 0) != 0) { /* excluded the parity from further operation */ state->parity[l].is_excluded_by_filter = 1; } } } else { /* if we are filtering by file, exclude all parity */ if (filter_missing || !tommy_list_empty(filterlist_file)) { /* for each parity disk */ for (l = 0; l < state->level; ++l) { state->parity[l].is_excluded_by_filter = 1; } } } } int state_progress_begin(struct snapraid_state* state, block_off_t blockstart, block_off_t blockmax, block_off_t countmax) { time_t now; if (state->opt.gui) { log_tag("run:begin:%u:%u:%u\n", blockstart, blockmax, countmax); log_flush(); } now = time(0); state->progress_whole_start = now; state->progress_tick = 0; state->progress_ptr = 0; state->progress_wasted = 0; /* start of thermal control */ if (!state_thermal_begin(state, now)) return -1; /* stop if requested */ if (global_interrupt) { /* LCOV_EXCL_START */ if (!state->opt.gui) { msg_status("Not starting due to interruption\n"); } log_tag("sigint:0: SIGINT received\n"); log_flush(); return 1; /* LCOV_EXCL_STOP */ } return 0; } void state_progress_end(struct snapraid_state* state, block_off_t countpos, block_off_t countmax, data_off_t countsize, const char* msg) { if (state->opt.gui) { log_tag("run:end\n"); log_flush(); } else if (countmax == 0) { if (state->need_write || state->written) { msg_status("100%% completed\n"); } else { msg_status("%s", msg); } } else { time_t now; time_t elapsed; unsigned countsize_MB = (countsize + MEGA - 1) / MEGA; now = time(0); elapsed = now - state->progress_whole_start - state->progress_wasted; msg_bar("%u%% completed, %u MB accessed", muldiv(countpos, 100, countmax), countsize_MB); msg_bar(" in %u:%02u", (unsigned)(elapsed / 3600), (unsigned)((elapsed % 3600) / 60)); msg_bar("\n"); msg_flush(); } } void state_progress_stop(struct snapraid_state* state) { time_t now; now = time(0); state->progress_interruption = now; } void state_progress_restart(struct snapraid_state* state) { time_t now; now = time(0); /* reset the progress counter */ state->progress_tick = 0; state->progress_ptr = 0; if (now >= state->progress_interruption) /* avoid degenerated cases when the clock is manually adjusted */ state->progress_wasted += now - state->progress_interruption; } /** * Set the latest os_tick data in the progress vector. */ static void state_progress_latest(struct snapraid_state* state) { tommy_node* i; unsigned l; state->progress_tick_misc[state->progress_ptr] = state->tick_misc; state->progress_tick_sched[state->progress_ptr] = state->tick_sched; state->progress_tick_raid[state->progress_ptr] = state->tick_raid; state->progress_tick_hash[state->progress_ptr] = state->tick_hash; state->progress_tick_io[state->progress_ptr] = state->tick_io; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; disk->progress_tick[state->progress_ptr] = disk->tick; } for (l = 0; l < state->level; ++l) state->parity[l].progress_tick[state->progress_ptr] = state->parity[l].tick; } /** * Number of columns */ #define GRAPH_COLUMN 78 /** * Get the reference value, 0 if index is PROGRESS_MAX */ #define ref(map, index) (index < PROGRESS_MAX ? map[index] : 0) static struct snapraid_thermal* state_thermal_find(struct snapraid_state* state, const char* name) { tommy_node* i; struct snapraid_thermal* found = 0; for (i = tommy_list_head(&state->thermallist); i != 0; i = i->next) { struct snapraid_thermal* thermal = i->data; if (strcmp(thermal->name, name) == 0) { if (found == 0 /* if multiple matches, return the one with highest temperature */ || found->latest_temperature < thermal->latest_temperature /* or, if the temperature is equal, the one with the higher r_squared */ || (found->latest_temperature == thermal->latest_temperature && found->params.r_squared < thermal->params.r_squared) ) { found = thermal; } } } return found; } #define THERMAL_PAD " " static void state_progress_graph(struct snapraid_state* state, struct snapraid_io* io, unsigned current, unsigned oldest) { uint64_t v; uint64_t tick_total; unsigned bar; tommy_node* i; unsigned l; size_t pad; size_t pre; tick_total = 0; tick_total += state->progress_tick_misc[current] - ref(state->progress_tick_misc, oldest); tick_total += state->progress_tick_sched[current] - ref(state->progress_tick_sched, oldest); tick_total += state->progress_tick_raid[current] - ref(state->progress_tick_raid, oldest); tick_total += state->progress_tick_hash[current] - ref(state->progress_tick_hash, oldest); tick_total += state->progress_tick_io[current] - ref(state->progress_tick_io, oldest); if (!tick_total) return; pad = 4; for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; size_t len = strlen(disk->name); if (pad < len) pad = len; } for (l = 0; l < state->level; ++l) { size_t len = strlen(lev_config_name(l)); if (pad < len) pad = len; } /* extra space */ pad += 1; pre = 4; if (pad + pre + 30 < GRAPH_COLUMN) bar = GRAPH_COLUMN - pad - pre; else bar = 30; /* at least a bar of 30 */ if (io) { const char* legend = "cached blocks (instant, more is better)"; /* refresh the cached blocks info */ io_refresh(io); printf("\n"); for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; v = disk->cached_blocks; printr(disk->name, pad); printf("%4" PRIu64 " | ", v); if (disk->progress_file && disk->progress_file->sub) printf("%s", disk->progress_file->sub); else printf("-"); printf("\n"); } for (l = 0; l < state->level; ++l) { v = state->parity[l].cached_blocks; printr(lev_config_name(l), pad); printf("%4" PRIu64 " | ", v); printc('o', v * bar / io->io_max); printf("\n"); } printc(' ', pad); printf(" |_"); printc('_', bar); printf("\n"); printc(' ', 5 + pad + 1 + bar / 2 - strlen(legend) / 2); printf("%s", legend); printf("\n"); } printf("\n"); pre = 4; if (state->thermal_temperature_limit != 0) pre += strlen(THERMAL_PAD); if (pad + pre + 30 < GRAPH_COLUMN) bar = GRAPH_COLUMN - pad - pre; else bar = 30; /* at least a bar of 30 */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; v = disk->progress_tick[current] - ref(disk->progress_tick, oldest); printr(disk->name, pad); if (state->thermal_temperature_limit != 0) { struct snapraid_thermal* thermal = state_thermal_find(state, disk->name); if (thermal) { if (thermal->params.r_squared >= THERMAL_R_SQUARED_LIMIT) printf(" %2u (%2u)", thermal->latest_temperature, (int)thermal->params.t_steady); else printf(" %2u ", thermal->latest_temperature); } else { printf(THERMAL_PAD); } } printf("%3u%% | ", muldiv(v, 100, tick_total)); printc('*', v * bar / tick_total); printf("\n"); /* clear the file in progress */ disk->progress_file = 0; } for (l = 0; l < state->level; ++l) { v = state->parity[l].progress_tick[current] - ref(state->parity[l].progress_tick, oldest); printr(lev_config_name(l), pad); if (state->thermal_temperature_limit != 0) { struct snapraid_thermal* thermal = state_thermal_find(state, lev_config_name(l)); if (thermal) { if (thermal->params.r_squared >= THERMAL_R_SQUARED_LIMIT) printf(" %2u (%2u)", thermal->latest_temperature, (int)thermal->params.t_steady); else printf(" %2u ", thermal->latest_temperature); } else { printf(THERMAL_PAD); } } printf("%3u%% | ", muldiv(v, 100, tick_total)); printc('*', v * bar / tick_total); printf("\n"); } v = state->progress_tick_raid[current] - ref(state->progress_tick_raid, oldest); printr("raid", pad); if (state->thermal_temperature_limit != 0) printf(THERMAL_PAD); printf("%3u%% | ", muldiv(v, 100, tick_total)); printc('*', v * bar / tick_total); printf("\n"); v = state->progress_tick_hash[current] - ref(state->progress_tick_hash, oldest); printr("hash", pad); if (state->thermal_temperature_limit != 0) printf(THERMAL_PAD); printf("%3u%% | ", muldiv(v, 100, tick_total)); printc('*', v * bar / tick_total); printf("\n"); v = state->progress_tick_sched[current] - ref(state->progress_tick_sched, oldest); printr("sched", pad); if (state->thermal_temperature_limit != 0) printf(THERMAL_PAD); printf("%3u%% | ", muldiv(v, 100, tick_total)); printc('*', v * bar / tick_total); printf("\n"); v = state->progress_tick_misc[current] - ref(state->progress_tick_misc, oldest); printr("misc", pad); if (state->thermal_temperature_limit != 0) printf(THERMAL_PAD); printf("%3u%% | ", muldiv(v, 100, tick_total)); printc('*', v * bar / tick_total); printf("\n"); printc(' ', pad); if (state->thermal_temperature_limit != 0) printf(THERMAL_PAD); printf(" |_"); printc('_', bar); printf("\n"); if (oldest == PROGRESS_MAX) { const char* legend = "wait time (total, less is better)"; if (state->thermal_temperature_limit != 0) printf(THERMAL_PAD); printc(' ', 5 + pad + 1 + bar / 2 - strlen(legend) / 2); printf("%s", legend); printf("\n"); } else { const char* legend_d = "wait time (last %d secs, less is better)"; if (state->thermal_temperature_limit != 0) printf(THERMAL_PAD); printc(' ', 5 + pad + 1 + bar / 2 - strlen(legend_d) / 2); printf(legend_d, PROGRESS_MAX); printf("\n"); } printf("\n"); } int state_progress(struct snapraid_state* state, struct snapraid_io* io, block_off_t blockpos, block_off_t countpos, block_off_t countmax, data_off_t countsize) { time_t now; int pred; now = time(0); /* thermal measure */ if (now > state->thermal_latest + THERMAL_PERIOD_SECONDS || state->opt.fake_device) { state->thermal_latest = now; state_thermal(state, now); } /* previous position */ pred = state->progress_ptr + PROGRESS_MAX - 1; if (pred >= PROGRESS_MAX) pred -= PROGRESS_MAX; /* if the previous measure is different */ if (state->progress_tick == 0 || state->progress_time[pred] != now ) { time_t elapsed; unsigned out_perc = 0; unsigned out_size_speed = 0; unsigned out_block_speed = 0; unsigned out_cpu = 0; unsigned out_eta = 0; int out_temperature = 0; int out_steady = 0; int out_computed = 0; /* store the new measure */ state->progress_time[state->progress_ptr] = now; state->progress_pos[state->progress_ptr] = countpos; state->progress_size[state->progress_ptr] = countsize; state_progress_latest(state); elapsed = now - state->progress_whole_start - state->progress_wasted; /* completion percentage */ if (countmax) out_perc = muldiv(countpos, 100, countmax); /* if we have at least 5 measures */ if (state->progress_tick >= 5 /* or if we are running in test mode, with at least one measure */ || (state->opt.force_progress && state->progress_tick >= 1) ) { int oldest; int past; time_t delta_time; block_off_t delta_pos; data_off_t delta_size; uint64_t tick_cpu; uint64_t tick_total; uint64_t delta_tick_cpu; uint64_t delta_tick_total; uint64_t oldest_tick_cpu; uint64_t oldest_tick_total; tommy_node* i; /* number of past measures */ past = state->progress_tick; /* drop the oldest ones, to promptly */ /* skip the startup phase */ past -= past / 5; /* check how much we can go in the past */ if (past >= PROGRESS_MAX - 1) { /* the vector is filled, so we are already in position */ /* to get the possible oldest one */ oldest = state->progress_ptr + 1; } else { /* go backward the number of positions selected */ oldest = state->progress_ptr + PROGRESS_MAX - past; } if (oldest >= PROGRESS_MAX) oldest -= PROGRESS_MAX; tick_cpu = state->progress_tick_misc[state->progress_ptr] + state->progress_tick_sched[state->progress_ptr] + state->progress_tick_raid[state->progress_ptr] + state->progress_tick_hash[state->progress_ptr]; tick_total = tick_cpu + state->progress_tick_io[state->progress_ptr]; oldest_tick_cpu = state->progress_tick_misc[oldest] + state->progress_tick_sched[oldest] + state->progress_tick_raid[oldest] + state->progress_tick_hash[oldest]; oldest_tick_total = oldest_tick_cpu + state->progress_tick_io[oldest]; delta_time = now - state->progress_time[oldest]; delta_pos = countpos - state->progress_pos[oldest]; delta_size = countsize - state->progress_size[oldest]; delta_tick_cpu = tick_cpu - oldest_tick_cpu; delta_tick_total = tick_total - oldest_tick_total; /* estimate the speed in MB/s */ if (delta_time != 0) out_size_speed = (unsigned)(delta_size / MEGA / delta_time); /* estimate the speed in block/s */ if (delta_time != 0) out_block_speed = (unsigned)(delta_pos / delta_time); /* estimate the cpu usage percentage */ if (delta_tick_total != 0) out_cpu = muldiv(delta_tick_cpu, 100, delta_tick_total); /* estimate the remaining time in minutes */ if (delta_pos != 0) out_eta = muldiv(countmax - countpos, delta_time, delta_pos); if (state->opt.force_stats) { os_clear(); state_progress_graph(state, io, state->progress_ptr, oldest); } if (state->thermal_temperature_limit != 0) { /* get the max temperature */ out_temperature = 0; for (i = tommy_list_head(&state->thermallist); i != 0; i = i->next) { struct snapraid_thermal* thermal = i->data; if (out_temperature < thermal->latest_temperature) { out_temperature = thermal->latest_temperature; if (thermal->params.r_squared >= THERMAL_R_SQUARED_LIMIT) out_steady = thermal->params.t_steady; else out_steady = 0; } } } else { out_temperature = 0; out_steady = 0; } /* we have the output value */ out_computed = 1; } if (state->opt.gui) { char str_eta[32]; char str_size_speed[32]; char str_cpu[32]; char str_temp[32]; char str_steady[32]; if (out_computed) { snprintf(str_eta, sizeof(str_eta), "%u", out_eta); snprintf(str_size_speed, sizeof(str_size_speed), "%u", out_size_speed); snprintf(str_cpu, sizeof(str_cpu), "%u", out_cpu); } else { str_eta[0] = 0; str_size_speed[0] = 0; str_cpu[0] = 0; } if (out_temperature) { snprintf(str_temp, sizeof(str_temp), "%u", out_temperature); } else { str_temp[0] = 0; } if (out_steady) { snprintf(str_steady, sizeof(str_steady), "%u", out_steady); } else { str_steady[0] = 0; } log_tag("run:pos:%u:%u:%" PRIu64 ":%u:%s:%s:%s:%" PRIu64 ":%s:%s\n", blockpos, countpos, countsize, out_perc, str_eta, str_size_speed, str_cpu, (uint64_t)elapsed, str_temp, str_steady); log_flush(); } else { msg_bar("%u%%, %u MB", out_perc, (unsigned)(countsize / MEGA)); if (out_computed) { msg_bar(", %u MB/s", out_size_speed); msg_bar(", %u stripe/s", out_block_speed); msg_bar(", CPU %u%%", out_cpu); if (out_temperature != 0) { if (out_steady != 0) msg_bar(", Tmax %u (%u)", out_temperature, out_steady); else msg_bar(", Tmax %u", out_temperature); } unsigned out_eta_minutes = out_eta / 60; /* minutes */ msg_bar(", %u:%02u ETA", out_eta_minutes / 60, out_eta_minutes % 60); } msg_bar("\r"); msg_flush(); } /* next position to fill */ ++state->progress_ptr; if (state->progress_ptr >= PROGRESS_MAX) state->progress_ptr -= PROGRESS_MAX; /* one more measure */ ++state->progress_tick; } /* stop if requested */ if (global_interrupt) { /* LCOV_EXCL_START */ if (!state->opt.gui) { msg_bar("\n"); msg_flush(); } log_fatal(EUSER, "Stopping for interruption at block %u\n", blockpos); log_tag("sigint:%u: SIGINT received\n", blockpos); log_flush(); return 1; /* LCOV_EXCL_STOP */ } return 0; } void state_usage_waste(struct snapraid_state* state) { uint64_t now = os_tick(); state->tick_last = now; } void state_usage_misc(struct snapraid_state* state) { uint64_t now = os_tick(); uint64_t delta = now - state->tick_last; /* increment the time spent in computations */ state->tick_misc += delta; state->tick_last = now; } void state_usage_sched(struct snapraid_state* state) { uint64_t now = os_tick(); uint64_t delta = now - state->tick_last; /* increment the time spent in computations */ state->tick_sched += delta; state->tick_last = now; } void state_usage_raid(struct snapraid_state* state) { uint64_t now = os_tick(); uint64_t delta = now - state->tick_last; /* increment the time spent in computations */ state->tick_raid += delta; state->tick_last = now; } void state_usage_hash(struct snapraid_state* state) { uint64_t now = os_tick(); uint64_t delta = now - state->tick_last; /* increment the time spent in computations */ state->tick_hash += delta; state->tick_last = now; } void state_usage_file(struct snapraid_state* state, struct snapraid_disk* disk, struct snapraid_file* file) { (void)state; disk->progress_file = file; } void state_usage_disk(struct snapraid_state* state, struct snapraid_handle* handle_map, unsigned* waiting_map, unsigned waiting_mac) { uint64_t now = os_tick(); uint64_t delta = now - state->tick_last; unsigned i; /* increment the time spent in the data disks */ for (i = 0; i < waiting_mac; ++i) { struct snapraid_disk* disk = handle_map[waiting_map[i]].disk; if (!disk) continue; disk->tick += delta; } state->tick_io += delta; state->tick_last = now; } void state_usage_parity(struct snapraid_state* state, unsigned* waiting_map, unsigned waiting_mac) { uint64_t now = os_tick(); uint64_t delta = now - state->tick_last; unsigned i; /* increment the time spent in the parity disk */ for (i = 0; i < waiting_mac; ++i) state->parity[waiting_map[i]].tick += delta; state->tick_io += delta; state->tick_last = now; } void state_usage_print(struct snapraid_state* state) { /* set the latest data */ state_progress_latest(state); if (msg_level < MSG_PROGRESS) return; /* print a graph for it */ state_progress_graph(state, 0, state->progress_ptr, PROGRESS_MAX); } void state_fscheck(struct snapraid_state* state, const char* ope) { tommy_node* i; /* check the file-system on all disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; if (fs_check(disk) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency: File-system check for disk '%s' %s\n", disk->name, ope); os_abort(); /* LCOV_EXCL_STOP */ } } } void generate_configuration(const char* path) { struct snapraid_state state; struct snapraid_content* content; unsigned l, s; tommy_node* j; state_init(&state); /* mark that we are without a configuration file */ state.no_conf = 1; /* create the dummy content entry */ content = content_alloc(path, -1); /* adds the content entry */ tommy_list_insert_tail(&state.contentlist, &content->node, content); /* read the content file */ state_read(&state); /* output a dummy configuration file */ printf("# Configuration file generated from %s\n", path); printf("\n"); printf("# Use this blocksize\n"); printf("blocksize %u\n", state.block_size / KIBI); printf("\n"); printf("# Use this hashsize\n"); printf("hashsize %u\n", BLOCK_HASH_SIZE); printf("\n"); for (l = 0; l < state.level; ++l) { printf("# Set the correct path for the %s files\n", lev_name(l)); printf("# You had %u of them:\n", state.parity[l].split_mac); for (s = 0; s < state.parity[l].split_mac; ++s) { printf("# %u:\n", s); printf("# PATH:"); if (state.parity[l].split_map[s].path[0]) printf("%s", state.parity[l].split_map[s].path); else printf("?"); printf("\n"); printf("# SIZE:"); if (state.parity[l].split_map[s].size != PARITY_SIZE_INVALID) printf("%" PRIu64, state.parity[l].split_map[s].size); else printf("?"); printf("\n"); printf("# UUID:"); if (state.parity[l].split_map[s].uuid[0]) printf("%s", state.parity[l].split_map[s].uuid); else printf("?"); printf("\n"); printf("#\n"); } printf("%s ENTER_HERE_THE_PARITY_FILES_COMMA_SEPARATED\n", lev_config_name(l)); printf("\n"); } printf("# Add any other content file\n"); printf("content %s\n", path); printf("\n"); for (j = state.maplist; j; j = j->next) { struct snapraid_map* map = j->data; struct snapraid_disk* disk; printf("# Set the correct dir for disk '%s'\n", map->name); if (map->uuid[0]) printf("# Disk '%s' is the one with id '%s'\n", map->name, map->uuid); disk = find_disk_by_name(&state, map->name); if (disk && disk->filelist) { struct snapraid_file* file = disk->filelist->data; if (file) { printf("# and containing: %s\n", fmt_poll(disk, file->sub)); } } printf("data %s ENTER_HERE_THE_DIR\n", map->name); printf("\n"); } state_done(&state); } /** * Flush and sync the parity files. */ int state_flush(struct snapraid_state* state, struct snapraid_io* io, struct snapraid_parity_handle* parity_handle, block_off_t blockcur) { unsigned l; if (io) io_flush(io); /* flush all parity handles to ensure data is written to disk */ for (l = 0; l < state->level; ++l) { int ret = parity_sync(&parity_handle[l]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_error_io:%u:%s: Sync error. %s.\n", blockcur, lev_config_name(l), strerror(errno)); log_fatal(errno, "DANGER! Unexpected input/output error in disk %s. It isn't possible to continue.\n", lev_config_name(l)); return -1; /* LCOV_EXCL_STOP */ } } return 0; } void state_load_ignore_file(tommy_list* filter_list, const char* path, const char* sub) { STREAM* f; int line; f = sopen_read(path, 0); if (!f) { /* LCOV_EXCL_START */ log_error(errno, "Error opening the ignore file '%s'. %s.\n", path, strerror(errno)); return; /* LCOV_EXCL_STOP */ } line = 1; while (1) { char buffer[PATH_MAX]; int ret; int c; /* skip initial spaces */ sgetspace(f); /* get the whole line */ ret = sgetline(f, buffer, sizeof(buffer)); if (ret < 0) { /* LCOV_EXCL_START */ log_error(EUSER, "Too long line in '%s' at line %u\n", path, line); break; /* LCOV_EXCL_STOP */ } if (buffer[0] == 0) { /* allow empty lines */ } else if (buffer[0] == '#') { /* ignore comment lines */ } else { struct snapraid_filter* filter; filter = filter_alloc_file(-1, sub, buffer); if (!filter) { /* LCOV_EXCL_START */ log_error(EUSER, "Invalid ignore specification '%s' in '%s' at line %u\n", buffer, path, line); break; /* LCOV_EXCL_STOP */ } tommy_list_insert_tail(filter_list, &filter->node, filter); } /* next line */ c = sgeteol(f); if (c == EOF) { break; } if (c != '\n') { /* LCOV_EXCL_START */ log_error(EUSER, "Extra data in '%s' at line %u\n", path, line); break; /* LCOV_EXCL_STOP */ } ++line; } if (serror(f)) { /* LCOV_EXCL_START */ log_error(errno, "Error reading the ignore file '%s' at line %u\n", path, line); /* LCOV_EXCL_STOP */ } sclose(f); } snapraid-14.9/cmdline/state.h000066400000000000000000000364671522717156100162030ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __STATE_H #define __STATE_H #include "elem.h" struct snapraid_handle; struct snapraid_io; /****************************************************************************/ /* parity level */ /** * Max level of parity supported. */ #define LEV_MAX 6 /** * Return the parity name: Parity, 2-Parity, 3-Parity, 4-Parity, 5-Parity, 6-Parity. */ const char* lev_name(unsigned level); /** * Return the parity name used in the config file: parity, 2-parity, 3-parity, 4-parity, 5-parity, 6-parity. */ const char* lev_config_name(unsigned level); /****************************************************************************/ /* state */ /** * Units for disk space. */ #define KILO (1000) #define MEGA (1000 * 1000) #define GIGA (1000 * 1000 * 1000) #define TERA (1000 * 1000 * 1000 * (uint64_t)1000) #define KIBI (1024) #define MEBI (1024 * 1024) #define GIBI (1024 * 1024 * 1024) #define TEBI (1024 * 1024 * 1024 * (uint64_t)1024) #define SORT_PHYSICAL 1 /**< Sort by physical order. */ #define SORT_INODE 2 /**< Sort by inode. */ #define SORT_ALPHA 3 /**< Sort by alphabetic order. */ #define SORT_DIR 4 /**< Sort by directory order. */ /** * Options set only at startup. * For all these options a value of 0 means nothing set, and to use the default. */ struct snapraid_option { int gui; /**< GUI output. */ int gui_verbose; /**< GUI verbose output. */ int gui_rescan_after; /**< GUI force a rescan after the command. */ int gui_touch_before; /**< GUI force a touch before the command. */ unsigned gui_threshold_removes; /**< GUI abort sync if too many removed files */ unsigned gui_threshold_updates; /**< GUI abort sync if too many updated files */ int auditonly; /**< In check, checks only the hash and not the parity. */ int badfileonly; /**< In fix, fixes only files marked as bad. */ int badblockonly; /**< In fix, fixes only the blocks marked as bad. */ int syncedonly; /**< In fix, fixes only files that are synced. */ int prehash; /**< Enables the prehash mode for sync. */ unsigned io_error_limit; /**< Max number of input/output errors before aborting. */ int force_zero; /**< Forced dangerous operations of syncing files now with zero size. */ int force_empty; /**< Forced dangerous operations of syncing disks now empty. */ int force_uuid; /**< Forced dangerous operations of syncing disks with uuid changed. */ int force_device; /**< Forced dangerous operations of using disks with save device id. */ int force_nocopy; /**< Force dangerous operations of syncing files without using copy detection. */ int force_full; /**< Force a full parity update. */ int force_realloc; /**< Force a full reallocation and parity update. */ uint64_t parity_tail; /**< Limit the reallocation of the location at the specified parity tail */ int expect_unrecoverable; /**< Expect presence of unrecoverable error in checking or fixing. */ int expect_recoverable; /**< Expect presence of recoverable error in checking. */ int skip_device; /**< Skip devices matching checks. */ int skip_sign; /**< Skip the sign check for content files. */ int skip_fallocate; /**< Skip the use of fallocate(). */ int skip_space_holder; /**< Skip the use of spaceholder file. */ int file_mode; /**< File mode. Mask of ADVISE_* flags. */ int skip_lock; /**< Skip the lock file protection. */ int skip_self; /**< Skip the self-test. */ int skip_content_check; /**< Relax some content file checks. */ int skip_parity_access; /**< Skip the parity access for commands that don't need it. */ int skip_disk_access; /**< Skip the data disk access for commands that don't need it. */ int skip_content_access; /**< Skip the content access for commands that don't need it. */ int kill_after_sync; /**< Kill the process after sync without saving the final state. */ int force_murmur3; /**< Force Murmur3 choice. */ int force_spooky2; /**< Force Spooky2 choice. */ int force_order; /**< Force sorting order. One of the SORT_* defines. */ unsigned force_scrub_at; /**< Force scrub for the specified number of blocks. */ int force_scrub_even; /**< Force scrub of all the even blocks. */ int force_content_write; /**< Force the update of the content file. */ int skip_content_write; /**< Skip the update of the content file. */ int force_scan_winfind; /**< Force the use of FindFirst/Next in Windows to list directories. */ int force_progress; /**< Force the use of the progress status. */ unsigned force_autosave_at; /**< Force autosave at the specified block. */ int fake_device; /**< Fake device data. */ int no_warnings; /**< Remove some warning messages. */ int expected_missing; /**< If missing files are expected and should not be reported. */ int fake_uuid; /**< Set fakes UUID for testing. */ int match_first_uuid; /**< Force the matching of the first UUID. */ int force_parity_update; /**< Force parity update even if data is not changed. */ unsigned io_cache; /**< Number of IO buffers to use. 0 for default. */ int force_stats; /**< Force stats print during process. */ uint64_t parity_limit_size; /**< Test limit for parity files. */ int skip_multi_scan; /**< Don't use threads in scan. */ uint64_t bwlimit; /**< Bandwidth limit in bytes per second. */ }; struct snapraid_state { struct snapraid_option opt; /**< Setup options. */ int mapped_device; /**< Devices were already mapped */ int filter_hidden; /**< Filter out hidden files. */ uint64_t autosave; /**< Autosave after the specified amount of data. 0 to disable. */ int need_write; /**< If the state is changed. */ int written; /**< If the state was written at least one time */ int checked_read; /**< If the state was read and checked. */ uint32_t block_size; /**< Block size in bytes. */ unsigned raid_mode; /**< Raid mode to use. RAID_MODE_DEFAULT or RAID_MODE_ALTERNATE. */ int file_mode; /**< File access mode. Combination of ADVISE_* flags. */ struct snapraid_parity parity[LEV_MAX]; /**< Parity vector. */ char share[PATH_MAX]; /**< Path of the share tree. If !=0 pool links are created in a different way. */ char pool[PATH_MAX]; /**< Path of the pool tree. */ uint64_t pool_device; /**< Device identifier of the pool. */ unsigned char hashseed[HASH_MAX]; /**< Hash seed. Just after a uint64 to provide a minimal alignment. */ unsigned char prevhashseed[HASH_MAX]; /**< Previous hash seed. In case of rehash. */ char lockfile[PATH_MAX]; /**< Path of the lock file to use. */ unsigned level; /**< Number of parity levels. 1 for PAR1, 2 for PAR2. */ unsigned hash; /**< Hash kind used. */ unsigned prevhash; /**< Previous hash kind used. In case of rehash. */ unsigned besthash; /**< Best hash suggested. */ const char* command; /**< Command running. */ int smartignore[SMART_IGNORE_MAX]; /**< Smart attributes to ignore for all devices. */ uint32_t rehash_blocks; /**< Blocks marked rehash */ uint32_t bad_blocks; /**< Blocks marked bad */ uint32_t unsynced_blocks; /**< If the parity is invalid, and a sync is needed. */ uint32_t unscrubbed_blocks; /**< Blocks never scrubbed */ uint32_t removed_files; /**< Files removed. Updated in scan */ uint32_t updated_files; /**< Files updated. Updated in scan */ tommy_list contentlist; /**< List of content files. */ tommy_list disklist; /**< List of all the data disks. */ tommy_list extralist; /**< List of all the other disks. */ tommy_list maplist; /**< List of all the disk mappings. */ tommy_list filterlist; /**< List of inclusion/exclusion. */ tommy_list importlist; /**< List of import file. */ tommy_hashdyn importset; /**< Hashtable by hash of all the import blocks. */ tommy_hashdyn previmportset; /**< Hashtable by prevhash of all the import blocks. Valid only if we are in a rehash state. */ tommy_hashdyn searchset; /**< Hashtable by timestamp of all the search files. */ tommy_arrayblkof infoarr; /**< Block information array. */ tommy_list bucketlist; /**< Sorted list of info bucket. Derived from infoarr, but updated only state_read()/state_write() */ block_off_t bucketcount; /**< Sum of all the counts of the list */ /* Thermal */ tommy_list thermallist; /**< List of all thermal state */ int thermal_stop_gathering; /**< If thermal data gathering is stopped */ int thermal_ambient_temperature; /**< Ambient themperature. 0 if not available */ int thermal_highest_temperature; /**< Current highest temperature */ time_t thermal_first; /**< Time of the first measure */ time_t thermal_latest; /**< Time of latest measure */ int thermal_cooldown_time; /**< Cooldown wait time in seconds */ int thermal_temperature_limit; /**< Upper limit temperature of the operating range */ /** * Cumulative time used for computations. */ uint64_t tick_misc; uint64_t tick_sched; uint64_t tick_raid; uint64_t tick_hash; /** * Cumulative time used for all io operations of disks. */ uint64_t tick_io; /** * Last time used for time measure. */ uint64_t tick_last; int clear_past_hash; /**< Clear all the hash from CHG and DELETED blocks when reading the state from an incomplete sync. */ time_t progress_whole_start; /**< Initial start of the whole process. */ time_t progress_interruption; /**< Time of the start of the progress interruption. */ time_t progress_wasted; /**< Time wasted in interruptions. */ time_t progress_time[PROGRESS_MAX]; /**< Last times of progress. */ block_off_t progress_pos[PROGRESS_MAX]; /**< Last positions of progress. */ data_off_t progress_size[PROGRESS_MAX]; /**< Last sizes of progress. */ uint64_t progress_tick_misc[PROGRESS_MAX]; /**< Last cpu ticks of progress. */ uint64_t progress_tick_sched[PROGRESS_MAX]; /**< Last scheduling ticks of progress. */ uint64_t progress_tick_raid[PROGRESS_MAX]; /**< Last raid ticks of progress. */ uint64_t progress_tick_hash[PROGRESS_MAX]; /**< Last hash ticks of progress. */ uint64_t progress_tick_io[PROGRESS_MAX]; /**< Last io ticks of progress. */ int progress_ptr; /**< Pointer to the next position to fill. Rolling over. */ int progress_tick; /**< Number of measures done. */ int no_conf; /**< Automatically add missing info. Used to load content without a configuration file. */ }; /** * Initialize the state. */ void state_init(struct snapraid_state* state); /** * Deinitialize the state. */ void state_done(struct snapraid_state* state); /** * Read the configuration file. */ void state_config(struct snapraid_state* state, const char* path, const char* command, struct snapraid_option* opt, tommy_list* filterlist_disk); /** * Probe the state. */ void state_probe(struct snapraid_state* state); /** * Read the state. */ void state_read(struct snapraid_state* state); /** * Write the new state. */ void state_write(struct snapraid_state* state); /** * Diff all the disks. */ int state_diff(struct snapraid_state* state); /** * Scan all the disks to update the state. */ void state_scan(struct snapraid_state* state); /** * Set the nanosecond timestamp of all files that have a zero value. */ void state_touch(struct snapraid_state* state); /** * Devices operations. */ int state_device(struct snapraid_state* state, int operation, tommy_list* filterlist_disk); /** * Sync the parity data. */ int state_sync(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount); /** * Check (and fixes) all the files and parity data. * \param fix If we have to fix, after checking. */ int state_check(struct snapraid_state* state, int fix, block_off_t blockstart, block_off_t blockcount); /** * Dry the files. */ int state_dry(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount); /** * Rehash the files. */ void state_rehash(struct snapraid_state* state); /** * Scrub levels. */ #define SCRUB_AUTO -1 /**< Automatic selection. */ #define SCRUB_BAD -2 /**< Scrub only the bad blocks. */ #define SCRUB_NEW -3 /**< Scrub the new blocks. */ #define SCRUB_FULL -4 /**< Scrub everything. */ #define SCRUB_EVEN -5 /**< Even blocks. */ /** * Scrub the files. */ int state_scrub(struct snapraid_state* state, int plan, int olderthan); /** * Print the status. */ int state_status(struct snapraid_state* state); /** * Find duplicates. */ void state_dup(struct snapraid_state* state); /** * List content. */ void state_list(struct snapraid_state* state); /** * Create pool tree. */ void state_pool(struct snapraid_state* state); /** * Refresh the free space info. * * Note that it requires disks access. */ void state_refresh(struct snapraid_state* state); /** * Skip files, symlinks and dirs. * Apply any skip access disk. */ void state_skip(struct snapraid_state* state); /** * Filter files, symlinks and dirs. * Apply an additional filter to the list currently loaded. */ void state_filter(struct snapraid_state* state, tommy_list* filterlist_file, tommy_list* filterlist_disk, int filter_missing, int filter_error); /** * Begin the progress visualization. */ int state_progress_begin(struct snapraid_state* state, block_off_t blockstart, block_off_t blockmax, block_off_t countmax); /** * End the progress visualization. */ void state_progress_end(struct snapraid_state* state, block_off_t countpos, block_off_t countmax, data_off_t countsize, const char* msg); /** * Write the progress. */ int state_progress(struct snapraid_state* state, struct snapraid_io* io, block_off_t blockpos, block_off_t countpos, block_off_t countmax, data_off_t countsize); /** * Stop temporarily the progress. */ void state_progress_stop(struct snapraid_state* state); /** * Restart the progress. */ void state_progress_restart(struct snapraid_state* state); /** * Set the usage time as wasted one not counted. */ void state_usage_waste(struct snapraid_state* state); /** * Set the usage time for CPU. */ void state_usage_misc(struct snapraid_state* state); void state_usage_sched(struct snapraid_state* state); void state_usage_raid(struct snapraid_state* state); void state_usage_hash(struct snapraid_state* state); /** * Set the last file used */ void state_usage_file(struct snapraid_state* state, struct snapraid_disk* disk, struct snapraid_file* file); /** * Set the usage time for a set of data disks. */ void state_usage_disk(struct snapraid_state* state, struct snapraid_handle* handle_map, unsigned* waiting_map, unsigned waiting_mac); /** * Set the usage time for a set of parity disk. */ void state_usage_parity(struct snapraid_state* state, unsigned* waiting_map, unsigned waiting_mac); /** * Print the stats of the usage time. */ void state_usage_print(struct snapraid_state* state); /** * Check the file-system on all disks. * On error it aborts. */ void state_fscheck(struct snapraid_state* state, const char* ope); /** * Measure the temperature of all disks */ void state_thermal(struct snapraid_state* state, time_t now); /** * Check if the temperature is outside the operating range */ int state_thermal_alarm(struct snapraid_state* state); /** * Cool down the system */ void state_thermal_cooldown(struct snapraid_state* state); /** * Start of thermal processing */ int state_thermal_begin(struct snapraid_state* state, time_t now); /** * Load the ignore file .snapraidignore */ void state_load_ignore_file(tommy_list* filter_list, const char* path, const char* sub); /** * Report attributes into the log */ void state_attr(struct snapraid_state* state, tommy_list* low); /****************************************************************************/ /* misc */ /** * Generate a dummy configuration file from a content file. */ void generate_configuration(const char* content); #endif snapraid-14.9/cmdline/status.c000066400000000000000000000350051522717156100163640ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "elem.h" #include "state.h" #include "parity.h" #include "handle.h" #include "raid/raid.h" /****************************************************************************/ /* status */ unsigned day_ago(time_t ref, time_t now) { /* in case some dates is in the future */ if (now < ref) return 0; return (now - ref) / (24 * 3600); } #define GRAPH_COLUMN 70 #define GRAPH_ROW 15 /** * Bit used to mark unscrubbed time info. */ #define TIME_NEW 1 int state_status(struct snapraid_state* state) { block_off_t blockmax; block_off_t i; time_t now; block_off_t count; unsigned l; unsigned dayoldest, daymedian, daynewest; unsigned bar_scrubbed[GRAPH_COLUMN]; unsigned bar_new[GRAPH_COLUMN]; unsigned barmax; time_t oldest, newest, median; unsigned x, y; tommy_node* node_disk; unsigned file_count; unsigned file_fragmented; unsigned extra_fragment; unsigned file_zerosubsecond; uint64_t file_size; uint64_t file_block_count; uint64_t file_block_free; block_off_t parity_block_free; uint64_t all_wasted; int free_not_zero; /* get the present time */ now = time(0); /* keep track if at least a free info is available */ free_not_zero = 0; blockmax = parity_allocated_size(state); log_tag("summary:block_size:%u\n", state->block_size); log_tag("summary:parity_block_count:%u\n", blockmax); /* get the minimum parity free space */ parity_block_free = state->parity[0].free_blocks; for (l = 0; l < state->level; ++l) { log_tag("summary:parity_block_total:%s:%u\n", lev_config_name(l), state->parity[l].total_blocks); log_tag("summary:parity_block_free:%s:%u\n", lev_config_name(l), state->parity[l].free_blocks); if (state->parity[l].free_blocks < parity_block_free) parity_block_free = state->parity[l].free_blocks; if (state->parity[l].free_blocks != 0) free_not_zero = 1; } log_tag("summary:parity_block_free_min:%u\n", parity_block_free); printf("SnapRAID status report:\n"); printf("\n"); printf(" Files Fragmented Excess Wasted Used Free Use Name\n"); printf(" Files Fragments GB GB GB\n"); /* count fragments */ file_count = 0; file_size = 0; file_block_count = 0; file_block_free = 0; file_fragmented = 0; extra_fragment = 0; file_zerosubsecond = 0; all_wasted = 0; for (node_disk = state->disklist; node_disk != 0; node_disk = node_disk->next) { struct snapraid_disk* disk = node_disk->data; tommy_node* node; block_off_t j; unsigned disk_file_count = 0; unsigned disk_file_fragmented = 0; unsigned disk_extra_fragment = 0; unsigned disk_file_zerosubsecond = 0; block_off_t disk_block_count = 0; uint64_t disk_file_size = 0; block_off_t disk_block_latest_used = 0; block_off_t disk_block_max_by_space; block_off_t disk_block_max_by_parity; block_off_t disk_block_max; uint64_t disk_used_bytes; uint64_t disk_free_bytes; int64_t wasted; /* for each file in the disk */ node = disk->filelist; while (node) { struct snapraid_file* file; file = node->data; node = node->next; /* next node */ if (file->mtime_nsec == STAT_NSEC_INVALID || file->mtime_nsec == 0 ) { ++file_zerosubsecond; ++disk_file_zerosubsecond; if (disk_file_zerosubsecond < 50) log_tag("zerosubsecond:%s:%s: \n", disk->name, file->sub); if (disk_file_zerosubsecond == 50) log_tag("zerosubsecond:%s:%s: (more follow)\n", disk->name, file->sub); } /* check fragmentation */ if (file->blockmax != 0) { block_off_t prev_pos; block_off_t last_pos; int fragmented; fragmented = 0; prev_pos = fs_file2par_get(disk, file, 0); for (j = 1; j < file->blockmax; ++j) { block_off_t parity_pos = fs_file2par_get(disk, file, j); if (prev_pos + 1 != parity_pos) { fragmented = 1; ++extra_fragment; ++disk_extra_fragment; } prev_pos = parity_pos; } /* keep track of latest block used */ last_pos = fs_file2par_get(disk, file, file->blockmax - 1); if (last_pos > disk_block_latest_used) { disk_block_latest_used = last_pos; } if (fragmented) { ++file_fragmented; ++disk_file_fragmented; } disk_block_count += file->blockmax; } /* count files */ ++file_count; ++disk_file_count; file_size += file->size; file_block_count += file->blockmax; disk_file_size += file->size; } if (disk->free_blocks != 0) free_not_zero = 1; /* get the free block info */ disk_block_max_by_space = disk_block_count + disk->free_blocks; disk_block_max_by_parity = blockmax + parity_block_free; /* the maximum usable space in a disk is limited by the smallest */ /* of the disk size and the parity size */ /* the wasted space is the space that we have to leave */ /* free on the data disk, when the parity is filled up */ if (disk_block_max_by_space < disk_block_max_by_parity) { disk_block_max = disk_block_max_by_space; } else { disk_block_max = disk_block_max_by_parity; } /* wasted space is the difference of the two maximum size */ /* if negative, it's extra space available in parity */ wasted = (int64_t)disk_block_max_by_space - (int64_t)disk_block_max_by_parity; wasted *= state->block_size; if (wasted > 0) all_wasted += wasted; file_block_free += disk_block_max - disk_block_count; printf("%8u", disk_file_count); printf("%8u", disk_file_fragmented); printf("%8u", disk_extra_fragment); if (wasted < -100LL * GIGA) { printf(" -"); } else { printf("%8.1f", (double)wasted / GIGA); } printf("%8" PRIu64, disk_file_size / GIGA); if (disk_block_max == 0 && disk_block_count == 0) { /* if the disk is empty and we don't have the free space info */ printf(" -"); printf(" - "); } else { printf("%8" PRIu64, (disk_block_max - disk_block_count) * (uint64_t)state->block_size / GIGA); printf(" %3u%%", muldiv(disk_block_count, 100, disk_block_max)); } printf(" %s\n", disk->name); log_tag("summary:disk_file_count:%s:%u\n", disk->name, disk_file_count); log_tag("summary:disk_block_count:%s:%u\n", disk->name, disk_block_count); log_tag("summary:disk_fragmented_file_count:%s:%u\n", disk->name, disk_file_fragmented); log_tag("summary:disk_excess_fragment_count:%s:%u\n", disk->name, disk_extra_fragment); log_tag("summary:disk_zerosubsecond_file_count:%s:%u\n", disk->name, disk_file_zerosubsecond); log_tag("summary:disk_file_size:%s:%" PRIu64 "\n", disk->name, disk_file_size); log_tag("summary:disk_block_allocated:%s:%u\n", disk->name, disk_block_latest_used + 1); log_tag("summary:disk_block_total:%s:%u\n", disk->name, disk->total_blocks); log_tag("summary:disk_block_free:%s:%u\n", disk->name, disk->free_blocks); log_tag("summary:disk_block_max_by_space:%s:%u\n", disk->name, disk_block_max_by_space); log_tag("summary:disk_block_max_by_parity:%s:%u\n", disk->name, disk_block_max_by_parity); log_tag("summary:disk_block_max:%s:%u\n", disk->name, disk_block_max); log_tag("summary:disk_space_wasted:%s:%" PRId64 "\n", disk->name, wasted); disk_used_bytes = disk_block_count * (uint64_t)state->block_size; disk_free_bytes = (disk_block_max - disk_block_count) * (uint64_t)state->block_size; log_tag("summary:disk_used:%s:%" PRIu64 "\n", disk->name, disk_used_bytes); log_tag("summary:disk_free:%s:%" PRIu64 "\n", disk->name, disk_free_bytes); log_tag("summary:disk_use_percent:%s:%u\n", disk->name, muldiv(disk_block_count, 100, disk_block_max)); } /* totals */ printf(" --------------------------------------------------------------------------\n"); printf("%8u", file_count); printf("%8u", file_fragmented); printf("%8u", extra_fragment); printf("%8.1f", (double)all_wasted / GIGA); printf("%8" PRIu64, file_size / GIGA); printf("%8" PRIu64, file_block_free * state->block_size / GIGA); printf(" %3u%%", muldiv(file_block_count, 100, file_block_count + file_block_free)); printf("\n"); /* warn about invalid data free info */ if (!free_not_zero) printf("\nWARNING! Free space info will be valid after the first sync.\n"); log_tag("summary:file_count:%u\n", file_count); log_tag("summary:file_block_count:%" PRIu64 "\n", file_block_count); log_tag("summary:fragmented_file_count:%u\n", file_fragmented); log_tag("summary:excess_fragment_count:%u\n", extra_fragment); log_tag("summary:zerosubsecond_file_count:%u\n", file_zerosubsecond); log_tag("summary:file_size:%" PRIu64 "\n", file_size); log_tag("summary:parity_size:%" PRIu64 "\n", blockmax * (uint64_t)state->block_size); log_tag("summary:parity_size_max:%" PRIu64 "\n", (blockmax + parity_block_free) * (uint64_t)state->block_size); log_tag("summary:hash:%s\n", hash_config_name(state->hash)); log_tag("summary:prev_hash:%s\n", hash_config_name(state->prevhash)); log_tag("summary:best_hash:%s\n", hash_config_name(state->besthash)); log_tag("summary:total_wasted:%" PRIu64 "\n", all_wasted); log_tag("summary:total_used:%" PRIu64 "\n", file_size); log_tag("summary:total_free:%" PRIu64 "\n", file_block_free * state->block_size); log_tag("summary:total_use_percent:%u\n", muldiv(file_block_count, 100, file_block_count + file_block_free)); log_flush(); oldest = 0; median = 0; newest = 0; count = 0; for (tommy_node* j = tommy_list_head(&state->bucketlist); j != 0; j = j->next) { struct snapraid_bucket* bucket = j->data; block_off_t bucket_count = bucket->count_scrubbed + bucket->count_justsynced; if (count == 0) oldest = bucket->time_at; if (count < state->bucketcount / 2) median = bucket->time_at; newest = bucket->time_at; count += bucket_count; } if (!count) { printf("The array is empty.\n"); return 0; } dayoldest = day_ago(oldest, now); daymedian = day_ago(median, now); daynewest = day_ago(newest, now); log_tag("summary:scrub_oldest_days:%u\n", dayoldest); log_tag("summary:scrub_median_days:%u\n", daymedian); log_tag("summary:scrub_newest_days:%u\n", daynewest); /* compute graph limits */ barmax = 0; memset(bar_scrubbed, 0, sizeof(bar_scrubbed)); memset(bar_new, 0, sizeof(bar_new)); for (tommy_node* j = tommy_list_head(&state->bucketlist); j != 0; j = j->next) { struct snapraid_bucket* bucket = j->data; unsigned column = muldiv(bucket->time_at - oldest, GRAPH_COLUMN, newest - oldest + 1); bar_scrubbed[column] += bucket->count_scrubbed; bar_new[column] += bucket->count_justsynced; if (bar_scrubbed[column] + bar_new[column] > barmax) barmax = bar_scrubbed[column] + bar_new[column]; } /* output scrub history as structured data */ log_tag("scrub_graph_range:%u:%u\n", GRAPH_COLUMN, barmax); for (i = 0; i < GRAPH_COLUMN; ++i) { unsigned days_ago = dayoldest - (dayoldest - daynewest) * i / (GRAPH_COLUMN - 1); log_tag("scrub_graph_bar:%u:%u:%u:%u\n", i, days_ago, bar_scrubbed[i], bar_new[i]); } printf("\n\n"); /* print the graph */ for (y = 0; y < GRAPH_ROW; ++y) { if (y == 0) printf("%3u%%|", barmax * 100 / count); else if (y == GRAPH_ROW - 1) printf(" 0%%|"); else if (y == GRAPH_ROW / 2) printf("%3u%%|", barmax * 50 / count); else printf(" |"); for (x = 0; x < GRAPH_COLUMN; ++x) { unsigned pivot_upper = barmax * (GRAPH_ROW - y) / GRAPH_ROW; unsigned pivot_lower = barmax * (GRAPH_ROW - 1 - y) / GRAPH_ROW; unsigned both = bar_scrubbed[x] + bar_new[x]; unsigned scrubbed = bar_scrubbed[x]; if (both > pivot_upper) { if (scrubbed > pivot_lower) printf("*"); else printf("o"); } else if (both > pivot_lower) { if (scrubbed == both) printf("*"); else printf("o"); } else { if (y == GRAPH_ROW - 1) printf("_"); else printf(" "); } } printf("\n"); } printf(" %3u days ago of the last scrub/sync %3u\n", dayoldest, daynewest); printf("\n"); printf("The oldest block was scrubbed %u days ago, the median %u, the newest %u.\n", dayoldest, daymedian, daynewest); printf("\n"); if (newest > now) { printf("WARNING! You have scrub dates in the future! The next sync/scrub will truncate them!\n"); } if (state->unsynced_blocks) { printf("WARNING! The array is NOT fully synced.\n"); printf("You have a sync in progress at %u%%.\n", muldiv(blockmax - state->unsynced_blocks, 100, blockmax)); } else { printf("No sync is in progress.\n"); } if (state->unscrubbed_blocks) { printf("%u%% of the array is not scrubbed.\n", muldiv_upper(state->unscrubbed_blocks, 100, blockmax)); } else { printf("The full array was scrubbed at least one time.\n"); } if (file_zerosubsecond) { printf("You have %u files with a zero sub-second timestamp.\n", file_zerosubsecond); printf("Run 'snapraid touch' to set their sub-second timestamps to a non-zero value.\n"); } else { printf("No file has a zero sub-second timestamp.\n"); } if (state->rehash_blocks) { printf("You have a rehash in progress at %u%%.\n", muldiv(count - state->rehash_blocks, 100, count)); } else { if (state->besthash != state->hash) { printf("No rehash is in progress, but for optimal performance one is recommended.\n"); } else { printf("No rehash is in progress or needed.\n"); } } if (state->bad_blocks) { printf("DANGER! In the array there are %u errors!\n\n", state->bad_blocks); block_off_t bad_range; block_off_t bad_count; block_off_t range_start; block_off_t range_count; printf("They are at blocks:"); /* print some of the errors */ bad_range = 0; bad_count = 0; range_start = 0; range_count = 0; for (i = 0; i <= blockmax; ++i) { /* one extra iteration to print the final range */ snapraid_info info = 0; int is_bad = 0; if (i < blockmax) { info = info_get(&state->infoarr, i); if (info != 0) /* unused blocks are never bad */ is_bad = info_get_bad(info); } if (is_bad) { /* create or extend the range */ if (!range_count) range_start = i; ++range_count; } else { /* break the range */ if (range_count) { if (range_count == 1) { printf(" %u", range_start); } else { printf(" %u-%u", range_start, range_start + range_count - 1); } bad_count += range_count; ++bad_range; range_count = 0; } } if (bad_range > 100) { printf(" and %u more...", state->bad_blocks - bad_count); break; } } printf("\n"); printf("To fix them use the command 'snapraid -e fix'.\n"); printf("The errors will disappear from the 'status' at the next 'scrub' command.\n"); } else { printf("No error detected.\n"); } if (state->bad_blocks) log_tag("summary:exit:bad\n"); else if (state->unsynced_blocks != 0) log_tag("summary:exit:unsynced\n"); else log_tag("summary:exit:ok\n"); return 0; } snapraid-14.9/cmdline/stream.c000066400000000000000000000335351522717156100163420ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "util.h" #include "stream.h" /****************************************************************************/ /* stream */ unsigned STREAM_SIZE = 64 * 1024; STREAM* sopen_read(const char* file, int flags) { #if HAVE_POSIX_FADVISE int ret; #endif STREAM* s = malloc_nofail(sizeof(STREAM)); struct stat st; s->handle_size = 1; s->handle = malloc_nofail(sizeof(struct stream_handle)); s->flags = flags; int open_flags = O_RDONLY | O_BINARY; if (s->flags & STREAM_FLAGS_SEQUENTIAL) open_flags |= O_SEQUENTIAL; pathcpy(s->handle[0].path, sizeof(s->handle[0].path), file); s->handle[0].f = open(file, open_flags); if (s->handle[0].f == -1) { free(s->handle); free(s); return 0; } /* get file info */ if (fstat(s->handle[0].f, &st) != 0) { close(s->handle[0].f); free(s->handle); free(s); return 0; } s->size = st.st_size; #if HAVE_POSIX_FADVISE if (s->flags & STREAM_FLAGS_SEQUENTIAL) { /* advise sequential access */ ret = posix_fadvise_wrapper(s->handle[0].f, 0, 0, POSIX_FADV_SEQUENTIAL); if (ret == ENOSYS) { log_error(errno, "WARNING! fadvise() is not supported in this platform. Performance may not be optimal!\n"); /* call is not supported, like in armhf, see posix_fadvise manpage */ ret = 0; } if (ret != 0) { /* LCOV_EXCL_START */ close(s->handle[0].f); free(s->handle); free(s); errno = ret; /* posix_fadvise return the error code */ return 0; /* LCOV_EXCL_STOP */ } } #endif s->buffer_size = STREAM_SIZE; if (s->buffer_size > s->size) s->buffer_size = s->size; /* allocate only what is necessary */ s->buffer = malloc_nofail_test(s->buffer_size); s->pos = s->buffer; s->end = s->buffer; s->state = STREAM_STATE_READ; s->state_index = 0; s->offset = 0; s->offset_uncached = 0; s->crc = 0; s->crc_uncached = 0; s->crc_stream = CRC_IV; return s; } STREAM* sopen_multi_write(unsigned count, int flags) { unsigned i; STREAM* s = malloc_nofail(sizeof(STREAM)); s->handle_size = count; s->handle = malloc_nofail(count * sizeof(struct stream_handle)); s->flags = flags; for (i = 0; i < count; ++i) s->handle[i].f = -1; s->buffer_size = STREAM_SIZE; s->buffer = malloc_nofail_test(s->buffer_size); s->pos = s->buffer; s->end = s->buffer + s->buffer_size; s->state = STREAM_STATE_WRITE; s->state_index = 0; s->size = 0; s->offset = 0; s->offset_uncached = 0; s->crc = 0; s->crc_uncached = 0; s->crc_stream = CRC_IV; return s; } int sopen_multi_file(STREAM* s, unsigned i, const char* file) { #if HAVE_POSIX_FADVISE int ret; #endif int f; pathcpy(s->handle[i].path, sizeof(s->handle[i].path), file); int open_flags = O_WRONLY | O_CREAT | O_EXCL | O_BINARY; if (s->flags & STREAM_FLAGS_SEQUENTIAL) open_flags |= O_SEQUENTIAL; ; /* O_EXCL to be resilient ensure to always create a new file and not use a stale link to the original file */ f = open(file, open_flags, 0600); if (f == -1) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } #if HAVE_POSIX_FADVISE if (s->flags & STREAM_FLAGS_SEQUENTIAL) { /* advise sequential access */ ret = posix_fadvise_wrapper(f, 0, 0, POSIX_FADV_SEQUENTIAL); if (ret == ENOSYS) { /* call is not supported, like in armhf, see posix_fadvise manpage */ ret = 0; } if (ret != 0) { /* LCOV_EXCL_START */ close(f); errno = ret; /* posix_fadvise return the error code */ return -1; /* LCOV_EXCL_STOP */ } } #endif s->handle[i].f = f; return 0; } STREAM* sopen_write(const char* file, int flags) { STREAM* s = sopen_multi_write(1, flags); if (sopen_multi_file(s, 0, file) != 0) { sclose(s); return 0; } return s; } int sclose(STREAM* s) { int fail = 0; unsigned i; if (s->state == STREAM_STATE_WRITE) { if (sflush(s) != 0) { /* LCOV_EXCL_START */ fail = 1; /* LCOV_EXCL_STOP */ } } for (i = 0; i < s->handle_size; ++i) { /* if open failed, there is nothing to close */ if (s->handle[i].f != -1) { if (close(s->handle[i].f) != 0) { /* LCOV_EXCL_START */ fail = 1; /* LCOV_EXCL_STOP */ } } } free(s->handle); free(s->buffer); free(s); if (fail) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } return 0; } int shandle(STREAM* s) { if (!s->handle_size) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } return s->handle[0].f; } /** * Fill the read stream buffer. * \return 0 if at least on char is read, or EOF on error. */ static int sfill(STREAM* s) { ssize_t ret; if (s->state != STREAM_STATE_READ) { /* LCOV_EXCL_START */ return EOF; /* LCOV_EXCL_STOP */ } /* if we reached the end, doesn't try to read */ if (s->offset >= s->size) { return EOF; } ret = read(s->handle[0].f, s->buffer, s->buffer_size); if (ret < 0) { /* LCOV_EXCL_START */ s->state = STREAM_STATE_ERROR; return EOF; /* LCOV_EXCL_STOP */ } if (ret == 0) { /* nothing mode to read */ s->state = STREAM_STATE_EOF; return EOF; } /* assume that it can be a shorter read, so ret < s->buffer_size doesn't mean that we reached EOF */ /* update the crc */ if (s->flags & STREAM_FLAGS_CRC) { s->crc_uncached = s->crc; s->crc = crc32c(s->crc, s->buffer, ret); } /* update the offset */ s->offset_uncached = s->offset; s->offset += ret; s->pos = s->buffer; s->end = s->buffer + ret; return 0; } int sdeplete(STREAM* s, unsigned char* last) { /* last four bytes */ last[0] = 0; last[1] = 0; last[2] = 0; last[3] = 0; while (1) { /* increase the position up to 4 bytes before the end */ if (s->pos + 4 <= s->end) s->pos = s->end - 4; /* insert the last 4 bytes */ while (s->pos < s->end) { last[0] = last[1]; last[1] = last[2]; last[2] = last[3]; last[3] = *s->pos++; } /* fill again the buffer until the end of the file */ if (sfill(s) != 0) { /* on error fail */ if (serror(s)) { /* LCOV_EXCL_START */ return EOF; /* LCOV_EXCL_STOP */ } /* on EOF terminate */ break; } } return 0; } int sflush(STREAM* s) { ssize_t ret; ssize_t size; unsigned i; if (s->state != STREAM_STATE_WRITE) { /* LCOV_EXCL_START */ return EOF; /* LCOV_EXCL_STOP */ } size = s->pos - s->buffer; if (!size) return 0; for (i = 0; i < s->handle_size; ++i) { ret = write(s->handle[i].f, s->buffer, size); if (ret != size) { /* LCOV_EXCL_START */ s->state = STREAM_STATE_ERROR; s->state_index = i; return EOF; /* LCOV_EXCL_STOP */ } } /* * Update the crc *after* writing the data. * * This must be done after the file write, * to be able to detect memory errors on the buffer, * happening during the write. */ if (s->flags & STREAM_FLAGS_CRC) { s->crc = crc32c(s->crc, s->buffer, size); s->crc_uncached = s->crc; } /* update the offset */ s->offset += size; s->offset_uncached = s->offset; s->pos = s->buffer; return 0; } int64_t stell(STREAM* s) { return s->offset_uncached + (s->pos - s->buffer); } uint32_t scrc(STREAM* s) { assert(s->flags & STREAM_FLAGS_CRC); return crc32c(s->crc_uncached, s->buffer, s->pos - s->buffer); } uint32_t scrc_stream(STREAM* s) { assert(s->flags & STREAM_FLAGS_CRC); return s->crc_stream ^ CRC_IV; } int sgetc_uncached(STREAM* s) { /* if at the end of the buffer, fill it */ if (s->pos == s->end && sfill(s) != 0) return EOF; return *s->pos++; } int sgettok(STREAM* f, char* str, int size) { char* i = str; char* send = str + size; int c; while (1) { c = sgetc(f); if (c == EOF) { break; } if (c == ' ' || c == '\t') { sungetc(c, f); break; } if (c == '\n') { /* remove ending carriage return to support the Windows CR+LF format */ if (i != str && i[-1] == '\r') --i; sungetc(c, f); break; } *i++ = c; if (i == send) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } } *i = 0; return i - str; } int sread(STREAM* f, void* void_data, unsigned size) { unsigned char* data = void_data; /* if there is enough space in memory */ if (sptrlookup(f, size)) { /* optimized version with all the data in memory */ unsigned char* pos = sptrget(f); /* copy it */ while (size--) *data++ = *pos++; sptrset(f, pos); } else { /* standard version using sgetc() */ while (size--) { int c = sgetc(f); if (c == EOF) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } *data++ = c; } } return 0; } int sgetline(STREAM* f, char* str, int size) { char* i = str; char* send = str + size; int c; /* if there is enough data in memory */ if (sptrlookup(f, size)) { /* optimized version with all the data in memory */ unsigned char* pos = sptrget(f); while (1) { c = *pos++; if (c == '\n') { /* remove ending carriage return to support the Windows CR+LF format */ if (i != str && i[-1] == '\r') --i; --pos; break; } if (i + 1 >= send) { /* LCOV_EXCL_START */ *i = 0; --pos; sptrset(f, pos); return -1; /* LCOV_EXCL_STOP */ } *i++ = c; } sptrset(f, pos); } else { while (1) { c = sgetc(f); if (c == EOF) { /* LCOV_EXCL_START */ break; /* LCOV_EXCL_STOP */ } if (c == '\n') { /* remove ending carriage return to support the Windows CR+LF format */ if (i != str && i[-1] == '\r') --i; sungetc(c, f); break; } if (i + 1 >= send) { /* LCOV_EXCL_START */ *i = 0; sungetc(c, f); return -1; /* LCOV_EXCL_STOP */ } *i++ = c; } } *i = 0; return i - str; } int sgetlasttok(STREAM* f, char* str, int size) { int ret; ret = sgetline(f, str, size); if (ret < 0) { /* LCOV_EXCL_START */ return ret; /* LCOV_EXCL_STOP */ } while (ret > 0 && (str[ret - 1] == ' ' || str[ret - 1] == '\t')) --ret; str[ret] = 0; return ret; } int sgetu32(STREAM* f, uint32_t* value) { int c; c = sgetc(f); if (c == '0') { *value = 0; return 0; } else if (c >= '1' && c <= '9') { uint32_t v; v = c - '0'; c = sgetc(f); while (c >= '0' && c <= '9') { uint32_t digit; if (v > 0xFFFFFFFFU / 10) { /* LCOV_EXCL_START */ /* overflow */ return -1; /* LCOV_EXCL_STOP */ } v *= 10; digit = c - '0'; if (v > 0xFFFFFFFFU - digit) { /* LCOV_EXCL_START */ /* overflow */ return -1; /* LCOV_EXCL_STOP */ } v += digit; c = sgetc(f); } *value = v; sungetc(c, f); return 0; } else { /* LCOV_EXCL_START */ /* nothing read */ return -1; /* LCOV_EXCL_STOP */ } } int sgetb32(STREAM* f, uint32_t* value) { uint32_t v; unsigned char b; unsigned char s; int c; v = 0; s = 0; loop: c = sgetc(f); if (c == EOF) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } b = (unsigned char)c; if ((b & 0x80) == 0) { v |= (uint32_t)b << s; s += 7; if (s >= 32) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } goto loop; } v |= (uint32_t)(b & 0x7f) << s; *value = v; return 0; } int sgetb64(STREAM* f, uint64_t* value) { uint64_t v; unsigned char b; unsigned char s; int c; v = 0; s = 0; loop: c = sgetc(f); if (c == EOF) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } b = (unsigned char)c; if ((b & 0x80) == 0) { v |= (uint64_t)b << s; s += 7; if (s >= 64) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } goto loop; } v |= (uint64_t)(b & 0x7f) << s; *value = v; return 0; } int sgetble32(STREAM* f, uint32_t* value) { unsigned char buf[4]; if (sread(f, buf, 4) != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } *value = buf[0] | (uint32_t)buf[1] << 8 | (uint32_t)buf[2] << 16 | (uint32_t)buf[3] << 24; return 0; } int sgetbs(STREAM* f, char* str, int size) { uint32_t len; if (sgetb32(f, &len) < 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } if (len + 1 > (uint32_t)size) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } str[len] = 0; return sread(f, str, (int)len); } int swrite(const void* void_data, unsigned size, STREAM* f) { const unsigned char* data = void_data; /* if there is enough space in memory */ if (sptrlookup(f, size)) { /* optimized version with all the data in memory */ unsigned char* pos = sptrget(f); /** * Update the crc *before* writing the data in the buffer * * This must be done before the memory write, * to be able to detect memory errors on the buffer, * happening before we write it on the file. */ if (f->flags & STREAM_FLAGS_CRC) { f->crc_stream = crc32c_plain(f->crc_stream, data, size); } /* copy it */ while (size--) *pos++ = *data++; sptrset(f, pos); } else { /* standard version using sputc() */ while (size--) { if (sputc(*data++, f) != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } } } return 0; } int sputb32(uint32_t value, STREAM* s) { unsigned char b; unsigned char buf[16]; unsigned i; i = 0; loop: b = value & 0x7f; value >>= 7; if (value) { buf[i++] = b; goto loop; } buf[i++] = b | 0x80; return swrite(buf, i, s); } int sputb64(uint64_t value, STREAM* s) { unsigned char b; unsigned char buf[16]; unsigned i; i = 0; loop: b = value & 0x7f; value >>= 7; if (value) { buf[i++] = b; goto loop; } buf[i++] = b | 0x80; return swrite(buf, i, s); } int sputble32(uint32_t value, STREAM* s) { unsigned char buf[4]; buf[0] = value & 0xFF; buf[1] = (value >> 8) & 0xFF; buf[2] = (value >> 16) & 0xFF; buf[3] = (value >> 24) & 0xFF; return swrite(buf, 4, s); } int sputbs(const char* str, STREAM* f) { size_t len = strlen(str); if (sputb32(len, f) != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } return swrite(str, len, f); } #if HAVE_FSYNC int ssync(STREAM* s) { unsigned i; for (i = 0; i < s->handle_size; ++i) { if (fsync(s->handle[i].f) != 0) { /* LCOV_EXCL_START */ s->state = STREAM_STATE_ERROR; s->state_index = i; return -1; /* LCOV_EXCL_STOP */ } } return 0; } #endif snapraid-14.9/cmdline/stream.h000066400000000000000000000216201522717156100163370ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __STREAM_H #define __STREAM_H #include "util.h" /****************************************************************************/ /* stream */ #define STREAM_FLAGS_SEQUENTIAL 1 /**< Advise a squential read. */ #define STREAM_FLAGS_CRC 2 /**< Enable the CRC computation. */ /** * Size of the buffer of the stream. * * It's not a constant for testing purpose. */ extern unsigned STREAM_SIZE; #define STREAM_STATE_READ 0 /**< The stream is in a normal state of read. */ #define STREAM_STATE_WRITE 1 /**< The stream is in a normal state of write. */ #define STREAM_STATE_ERROR -1 /**< An error was encountered. */ #define STREAM_STATE_EOF 2 /**< The end of file was encountered. */ struct stream_handle { int f; /**< Handle of the file. */ char path[PATH_MAX]; /**< Path of the file. */ }; struct stream { unsigned char* buffer; /**< Buffer of the stream. */ off_t buffer_size; /**< Size of the buffer */ unsigned char* pos; /**< Current position in the buffer. */ unsigned char* end; /**< End position of the buffer. */ struct stream_handle* handle; /**< Set of handles. */ off_t offset; /**< Offset into the file. */ off_t offset_uncached; /**< Offset into the file excluding the cached data. */ off_t size; /**< File size, only in read */ int flags; /**< Flags passed on open */ int state; /**< State of the stream. One of STREAM_STATE. */ int state_index; /**< Index of the handle causing a state change. */ unsigned handle_size; /**< Number of handles. */ /** * CRC of the data read or written in the file. * * If reading, it's the CRC of all data read from the file, * including the one in the buffer. * If writing it's all the data wrote to the file, * excluding the one still in buffer yet to be written. */ uint32_t crc; /** * CRC of the file excluding the cached data in the buffer. * * If reading, it's the CRC of the data read from the file, * excluding the one in the buffer. * If writing it's all the data wrote to the file, * excluding the one still in buffer yet to be written. */ uint32_t crc_uncached; /** * CRC of the data written to the stream. * * This is an extra check of the data that is written to * file to ensure that it's consistent even in case * of memory errors. * * This extra check takes about 2 seconds for each GB of * content file with the Intel CRC instruction, * and about 4 seconds without it. * But usually this doesn't slow down the write process, * as the disk is the bottle-neck. * * Note that this CRC doesn't have the IV processing. * * Not used in reading. * In writing, it's all the data wrote calling sput() functions. */ uint32_t crc_stream; }; /** * Opaque STREAM type. Like ::FILE. */ typedef struct stream STREAM; /** * Open a stream for reading. Like fopen("r"). */ STREAM* sopen_read(const char* file, int flags); /** * Open a stream for writing. Like fopen("w"). */ STREAM* sopen_write(const char* file, int flags); /** * Open a set of streams for writing. Like fopen("w"). */ STREAM* sopen_multi_write(unsigned count, int flags); /** * Specify the file to open. */ int sopen_multi_file(STREAM* s, unsigned i, const char* file); /** * Close a stream. Like fclose(). */ int sclose(STREAM* s); /** * Return the handle of the file. * In case of multi file, the first one is returned. */ int shandle(STREAM* s); /** * Read the stream until the end, and return the latest 4 chars. * The CRC of the file is also computed, and you can get it using scrc(). * \return 0 on success, or EOF on error. */ int sdeplete(STREAM* s, unsigned char* last); /** * Flush the write stream buffer. * \return 0 on success, or EOF on error. */ int sflush(STREAM* s); /** * Get the file pointer. */ int64_t stell(STREAM* s); /** * Get the CRC of the processed data. */ uint32_t scrc(STREAM* s); /** * Get the CRC of the processed data in put. */ uint32_t scrc_stream(STREAM* s); /** * Check if the buffer has enough data loaded. */ static inline int sptrlookup(STREAM* s, int size) { return s->pos + size <= s->end; } /** * Get the current stream ptr. */ static inline unsigned char* sptrget(STREAM* s) { return s->pos; } /** * Set the current stream ptr. */ static inline void sptrset(STREAM* s, unsigned char* ptr) { s->pos = ptr; } /** * Check the error status. Like ferror(). */ static inline int serror(STREAM* s) { return s->state == STREAM_STATE_ERROR; } /** * Check the eof status. Like feof(). */ static inline int seof(STREAM* s) { return s->state == STREAM_STATE_EOF; } /** * Get the index of the handle that caused the error. */ static inline int serrorindex(STREAM* s) { return s->state_index; } /** * Get the path of the handle that caused the error. */ static inline const char* serrorfile(STREAM* s) { return s->handle[s->state_index].path; } /** * Sync the stream. Like fsync(). */ int ssync(STREAM* s); /****************************************************************************/ /* get */ /** * \internal Used by sgetc(). * \note Don't call this directly, but use sgetc(). */ int sgetc_uncached(STREAM* s); /** * Read a char. Like fgetc(). */ static inline int sgetc(STREAM* s) { if (tommy_unlikely(s->pos == s->end)) return sgetc_uncached(s); return *s->pos++; } /** * Unread a char. * Like ungetc() but you have to unget the same char read. */ static inline void sungetc(int c, STREAM* s) { if (c != EOF) --s->pos; } /** * Read a fixed amount of chars. * Return 0 on success, or -1 on error. */ int sread(STREAM* f, void* void_data, unsigned size); /** * Get a char from a stream, ignoring one '\r'. */ static inline int sgeteol(STREAM* f) { int c; c = sgetc(f); if (c == '\r') c = sgetc(f); return c; } /** * Read all the spaces and tabs. * Return the number of spaces and tabs read. */ static inline int sgetspace(STREAM* f) { int count = 0; int c; c = sgetc(f); while (c == ' ' || c == '\t') { ++count; c = sgetc(f); } sungetc(c, f); return count; } /** * Read until the first space or tab. * Stop at the first ' ', '\t', '\n' or EOF. * Return <0 if the buffer is too small, or the number of chars read. */ int sgettok(STREAM* f, char* str, int size); /** * Read until the end of line. * Stop at the first '\n' or EOF. Note that '\n' is left in the stream. * Return <0 if the buffer is too small, or the number of chars read. */ int sgetline(STREAM* f, char* str, int size); /** * Like sgetline() but remove ' ' and '\t' at the end. */ int sgetlasttok(STREAM* f, char* str, int size); /** * Read a 32 bit number. * Stop at the first not digit char or EOF. * Return <0 if there isn't enough to read. */ int sgetu32(STREAM* f, uint32_t* value); /****************************************************************************/ /* binary get */ /** * Read a binary 32 bit number in packet format. * Return <0 if there isn't enough to read. */ int sgetb32(STREAM* f, uint32_t* value); /** * Read a binary 64 bit number in packet format. * Return <0 if there isn't enough to read. */ int sgetb64(STREAM* f, uint64_t* value); /** * Read a binary 32 bit number in little endian format. * Return <0 if there isn't enough to read. */ int sgetble32(STREAM* f, uint32_t* value); /** * Read a binary string. * Return -1 on error or if the buffer is too small, or the number of chars read. */ int sgetbs(STREAM* f, char* str, int size); /****************************************************************************/ /* put */ /** * Write a char. Like fputc(). * Return 0 on success or -1 on error. */ static inline int sputc(int c, STREAM* s) { if (s->pos == s->end) { if (sflush(s) != 0) return -1; } /** * Update the crc *before* writing the data in the buffer * * This must be done before the memory write, * to be able to detect memory errors on the buffer, * happening before we write it on the file. */ if (s->flags & STREAM_FLAGS_CRC) s->crc_stream = crc32c_plain_char(s->crc_stream, c); *s->pos++ = c; return 0; } /** * Write a end of line. * Return 0 on success or -1 on error. */ static inline int sputeol(STREAM* s) { #ifdef _WIN32 if (sputc('\r', s) != 0) return -1; #endif return sputc('\n', s); } /** * Write a sized string. * Return 0 on success or -1 on error. */ int swrite(const void* data, unsigned size, STREAM* f); /****************************************************************************/ /* binary put */ /** * Write a binary 32 bit number in packed format. * Return 0 on success or -1 on error. */ int sputb32(uint32_t value, STREAM* s); /** * Write a binary 64 bit number in packed format. * Return 0 on success or -1 on error. */ int sputb64(uint64_t value, STREAM* s); /** * Write a binary 32 bit number in little endian format. * Return 0 on success or -1 on error. */ int sputble32(uint32_t value, STREAM* s); /** * Write a binary string. * Return 0 on success or -1 on error. */ int sputbs(const char* str, STREAM* s); #endif snapraid-14.9/cmdline/support.c000066400000000000000000002067211522717156100165620ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" /****************************************************************************/ /* esc */ struct esc_thread_pool { char pool[ESC_POOL_MAX][ESC_MAX]; unsigned idx; }; #if HAVE_THREAD static thread_key_t esc_key; static void esc_pool_free(void* ptr) { free(ptr); } #else static struct esc_thread_pool esc_single_pool; #endif char* esc_buf(void) { struct esc_thread_pool* tp; #if HAVE_THREAD tp = thread_getspecific(esc_key); if (!tp) { tp = calloc_nofail(1, sizeof(*tp)); thread_setspecific(esc_key, tp); } #else tp = &esc_single_pool; #endif char* buffer = tp->pool[tp->idx]; tp->idx = (tp->idx + 1) % ESC_POOL_MAX; return buffer; } /****************************************************************************/ /* lock */ /** * Locks used externally. */ #if HAVE_THREAD static thread_mutex_t msg_lock; static thread_mutex_t memory_lock; static thread_mutex_t random_lock; #endif void lock_msg(void) { #if HAVE_THREAD thread_mutex_lock(&msg_lock); #endif } void unlock_msg(void) { #if HAVE_THREAD thread_mutex_unlock(&msg_lock); #endif } void lock_memory(void) { #if HAVE_THREAD thread_mutex_lock(&memory_lock); #endif } void unlock_memory(void) { #if HAVE_THREAD thread_mutex_unlock(&memory_lock); #endif } void lock_random(void) { #if HAVE_THREAD thread_mutex_lock(&random_lock); #endif } void unlock_random(void) { #if HAVE_THREAD thread_mutex_unlock(&random_lock); #endif } void lock_init(void) { #if HAVE_THREAD /* initialize the locks as first operation as log_fatal depends on them */ thread_mutex_init(&msg_lock); thread_mutex_init(&memory_lock); thread_mutex_init(&random_lock); thread_key_create(&esc_key, esc_pool_free); #endif } void lock_done(void) { #if HAVE_THREAD void* tp = thread_getspecific(esc_key); if (tp) { esc_pool_free(tp); thread_setspecific(esc_key, NULL); } thread_key_delete(esc_key); thread_mutex_destroy(&msg_lock); thread_mutex_destroy(&memory_lock); thread_mutex_destroy(&random_lock); #endif } /****************************************************************************/ /* random */ static uint64_t random_state = 1; void random_seed(uint64_t seed) { lock_random(); random_state = seed; unlock_random(); } void random_reseed(void) { uint64_t seed = os_tick(); lock_random(); random_state = seed; unlock_random(); } unsigned char random_u8(void) { return random_u64() & 0xFF; } /* * SplitMix64 * * - Zero-safe: Any 64-bit seed is valid (even 0). * - Full period: Guaranteed to visit every 2^64 value. * - Logic: Uses a Weyl sequence + MurmurHash3-style finalizer. * * See: https://rosettacode.org/wiki/Pseudo-random_numbers/Splitmix64 */ uint64_t random_u64(void) { uint64_t z; lock_random(); z = random_state += 0x9E3779B97F4A7C15ULL; unlock_random(); z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ULL; z = (z ^ (z >> 27)) * 0x94D049BB133111EBULL; return z ^ (z >> 31); } /****************************************************************************/ /* error */ int is_hw(int err) { /* LCOV_EXCL_START */ if (err == EIO) return 1; #ifdef EFSCORRUPTED if (err == EFSCORRUPTED) /* used by XFS inside the kernel - never expected in user mode as converted to EUCLEAN */ return 1; #endif #ifdef EUCLEAN if (err == EUCLEAN) /* used by XFS at user level instead of EFSCORRUPTED */ return 1; #endif #ifdef EBADCRC if (err == EBADCRC) /* used by BTRFS - never expected in user mode as converted to EIO */ return 1; #endif #ifdef EBADMSG if (err == EBADMSG) /* used by BTRFS - never expected in user mode as converted to EIO */ return 1; #endif #ifdef ENOMEDIUM if (err == ENOMEDIUM) /* medium removed */ return 1; #endif #ifdef EHWPOISON if (err == EHWPOISON) /* hardware memory error */ return 1; #endif /* LCOV_EXCL_STOP */ return 0; } void log_fatal_errno(int err, const char* name) { /* LCOV_EXCL_START */ if (err == EIO) { log_fatal(err, "DANGER! Unexpected input/output error in disk %s. It isn't possible to continue.\n", name); #ifdef EFSCORRUPTED } else if (err == EFSCORRUPTED) { log_fatal(err, "DANGER! Unexpected corrupted error in disk %s. It isn't possible to continue.\n", name); #endif #ifdef EUCLEAN } else if (err == EUCLEAN) { log_fatal(err, "DANGER! Unexpected corrupted error in disk %s. It isn't possible to continue.\n", name); #endif #ifdef EBADCRC } else if (err == EBADCRC) { log_fatal(err, "DANGER! Unexpected bad crc error in disk %s. It isn't possible to continue.\n", name); #endif #ifdef EBADMSG } else if (err == EBADMSG) { log_fatal(err, "DANGER! Unexpected bad crc error in disk %s. It isn't possible to continue.\n", name); #endif #ifdef ENOMEDIUM } else if (err == ENOMEDIUM) { log_fatal(err, "DANGER! Unexpected medium removed in disk %s. It isn't possible to continue.\n", name); #endif #ifdef EHWPOISON } else if (err == EHWPOISON) { log_fatal(err, "DANGER! Unexpected memory error in disk %s. It isn't possible to continue.\n", name); #endif } else if (err == EACCES) { log_fatal(err, "WARNING! Grant permission in the disk %s. It isn't possible to continue.\n", name); } else if (err == ENOSPC) { log_fatal(err, "WARNING! Ensure there is free space on the disk %s. It isn't possible to continue.\n", name); } else { log_fatal(err, "WARNING! Without a working %s disk, it isn't possible to continue.\n", name); } /* LCOV_EXCL_STOP */ } void log_error_errno(int err, const char* name) { /* LCOV_EXCL_START */ if (err == EIO) { log_fatal(err, "DANGER! Unexpected input/output error in disk %s.\n", name); #ifdef EFSCORRUPTED } else if (err == EFSCORRUPTED) { log_fatal(err, "DANGER! Unexpected corrupted error in disk %s.\n", name); #endif #ifdef EUCLEAN } else if (err == EUCLEAN) { log_fatal(err, "DANGER! Unexpected corrupted error in disk %s.\n", name); #endif #ifdef EBADCRC } else if (err == EBADCRC) { log_fatal(err, "DANGER! Unexpected bad crc error in disk %s.\n", name); #endif #ifdef EBADMSG } else if (err == EBADMSG) { log_fatal(err, "DANGER! Unexpected bad crc error in disk %s.\n", name); #endif #ifdef ENOMEDIUM } else if (err == ENOMEDIUM) { log_fatal(err, "DANGER! Unexpected medium removed in disk %s.\n", name); #endif #ifdef EHWPOISON } else if (err == EHWPOISON) { log_fatal(err, "DANGER! Unexpected memory error in disk %s.\n", name); #endif /* LCOV_EXCL_STOP */ } else if (err == EACCES) { log_error(err, "WARNING! Grant permission in the disk %s.\n", name); } else if (err == ENOSPC) { log_error(err, "WARNING! Ensure there is free space on the disk %s.\n", name); } else if (err == ENOENT) { log_error(err, "WARNING! You cannot modify files while running.\n"); } } /****************************************************************************/ /* print */ int msg_level = 0; FILE* stdlog = 0; int msg_line_prev = 0; /**< Previous line width on stdout */ int msg_line_curr = 0; /**< Current line width on stdout */ /* * Note that in the following functions we always flush both * stdout and stderr, because we want to ensure that they mixes * well when redirected to files * * The buffering is similar at the "line buffered" one, that * is not available on Windows, so we emulate it in this way. * * For stdlog flushing is limited. To ensure flushing the * caller should use log_flush(). */ static void vmsg(FILE* out, const char* format, va_list ap) { char* dup = strdup_nofail(format); int len = strlen(dup); int written = 0; char control = 0; if (len > 0) { if (dup[len - 1] == '\n') { dup[len - 1] = 0; control = '\n'; } else if (dup[len - 1] == '\r') { dup[len - 1] = 0; control = '\r'; } } if (dup[0]) { written = vfprintf(out, dup, ap); if (written < 0) /* ignore errors */ written = 0; } switch (control) { case 0 : msg_line_curr += written; break; case '\n' : msg_line_curr += written; /* writes spaces to overwrite any previous char */ while (msg_line_curr < msg_line_prev) { fprintf(out, " "); --msg_line_prev; } msg_line_prev = 0; msg_line_curr = 0; fprintf(out, "\n"); break; case '\r' : msg_line_curr += written; /* writes spaces to overwrite any previous char */ while (msg_line_curr < msg_line_prev) { fprintf(out, " "); --msg_line_prev; } msg_line_prev = msg_line_curr; msg_line_curr = 0; fprintf(out, "\r"); } free(dup); } void log_fatal(int err, const char* format, ...) { va_list ap; lock_msg(); if (stdlog) { if (is_hw(err)) fprintf(stdlog, "msg:fatal_hardware: "); else fprintf(stdlog, "msg:fatal: "); va_start(ap, format); vfprintf(stdlog, format, ap); va_end(ap); fflush(stdlog); } va_start(ap, format); vmsg(stderr, format, ap); va_end(ap); fflush(stderr); unlock_msg(); } void log_error(int err, const char* format, ...) { va_list ap; lock_msg(); if (stdlog) { if (is_hw(err)) fprintf(stdlog, "msg:error_hardware: "); else fprintf(stdlog, "msg:error: "); va_start(ap, format); vfprintf(stdlog, format, ap); va_end(ap); fflush(stdlog); } else { va_start(ap, format); vmsg(stderr, format, ap); va_end(ap); fflush(stderr); } unlock_msg(); } void log_expected(int err, const char* format, ...) { va_list ap; lock_msg(); if (stdlog) { if (is_hw(err)) fprintf(stdlog, "msg:error_hardware: "); /* we never expect an hardware error */ else fprintf(stdlog, "msg:expected: "); va_start(ap, format); vfprintf(stdlog, format, ap); va_end(ap); fflush(stdlog); } unlock_msg(); } void log_tag(const char* format, ...) { va_list ap; lock_msg(); if (stdlog) { va_start(ap, format); vfprintf(stdlog, format, ap); va_end(ap); /* here we intentionally don't flush to make the output faster */ } unlock_msg(); } void log_flush(void) { lock_msg(); if (stdlog) fflush(stdlog); fflush(stdout); fflush(stderr); unlock_msg(); } void msg_status(const char* format, ...) { va_list ap; lock_msg(); if (stdlog) { fprintf(stdlog, "msg:status: "); va_start(ap, format); vfprintf(stdlog, format, ap); va_end(ap); fflush(stdlog); } if (msg_level >= MSG_STATUS) { va_start(ap, format); vmsg(stdout, format, ap); va_end(ap); } unlock_msg(); } void msg_info(const char* format, ...) { va_list ap; lock_msg(); /* don't output in stdlog as these messages */ /* are always paired with a msg_tag() call */ if (msg_level >= MSG_INFO) { va_start(ap, format); vmsg(stdout, format, ap); va_end(ap); fflush(stdout); } unlock_msg(); } void msg_progress(const char* format, ...) { va_list ap; lock_msg(); if (stdlog) { fprintf(stdlog, "msg:progress: "); va_start(ap, format); vfprintf(stdlog, format, ap); va_end(ap); fflush(stdlog); } if (msg_level >= MSG_PROGRESS) { va_start(ap, format); vmsg(stdout, format, ap); va_end(ap); fflush(stdout); } unlock_msg(); } void msg_bar(const char* format, ...) { va_list ap; lock_msg(); /* don't output in stdlog as these messages */ /* are intended for screen only */ /* also don't flush stdout as they are intended to be partial messages */ if (msg_level >= MSG_BAR) { va_start(ap, format); vmsg(stdout, format, ap); va_end(ap); } unlock_msg(); } void msg_verbose(const char* format, ...) { va_list ap; lock_msg(); if (stdlog) { fprintf(stdlog, "msg:verbose: "); va_start(ap, format); vfprintf(stdlog, format, ap); va_end(ap); fflush(stdlog); } if (msg_level >= MSG_VERBOSE) { va_start(ap, format); vmsg(stdout, format, ap); va_end(ap); fflush(stdout); } unlock_msg(); } void msg_flush(void) { lock_msg(); fflush(stdout); fflush(stderr); unlock_msg(); } void printc(char c, size_t pad) { while (pad) { /* group writes in long pieces */ char buf[128]; size_t len = pad; if (len >= sizeof(buf)) len = sizeof(buf) - 1; memset(buf, c, len); buf[len] = 0; fputs(buf, stdout); pad -= len; } } void printr(const char* str, size_t pad) { size_t len; len = strlen(str); if (len < pad) printc(' ', pad - len); fputs(str, stdout); } void printl(const char* str, size_t pad) { size_t len; fputs(str, stdout); len = strlen(str); if (len < pad) printc(' ', pad - len); } void printp(double v, size_t pad) { char buf[64]; const char* s = "%"; if (v > 0.1) snprintf(buf, sizeof(buf), "%5.2f%s", v, s); else if (v > 0.01) snprintf(buf, sizeof(buf), "%6.3f%s", v, s); else if (v > 0.001) snprintf(buf, sizeof(buf), "%7.4f%s", v, s); else if (v > 0.0001) snprintf(buf, sizeof(buf), "%8.5f%s", v, s); else if (v > 0.00001) snprintf(buf, sizeof(buf), "%9.6f%s", v, s); else if (v > 0.000001) snprintf(buf, sizeof(buf), "%10.7f%s", v, s); else if (v > 0.0000001) snprintf(buf, sizeof(buf), "%11.8f%s", v, s); else if (v > 0.00000001) snprintf(buf, sizeof(buf), "%12.9f%s", v, s); else if (v > 0.000000001) snprintf(buf, sizeof(buf), "%13.10f%s", v, s); else if (v > 0.0000000001) snprintf(buf, sizeof(buf), "%14.11f%s", v, s); else if (v > 0.00000000001) snprintf(buf, sizeof(buf), "%15.12f%s", v, s); else if (v > 0.000000000001) snprintf(buf, sizeof(buf), "%16.13f%s", v, s); else snprintf(buf, sizeof(buf), "%17.14f%s", v, s); printl(buf, pad); } #define charcat(c) \ do { \ if (p == end) { \ goto bail; \ } \ *p++ = (c); \ } while (0) const char* esc_tag(const char* str) { char* buffer = esc_buf(); char* begin = buffer; char* end = begin + ESC_MAX; char* p = begin; /* copy string with escaping */ while (*str) { char c = *str++; switch (c) { case '\n' : charcat('\\'); charcat('n'); break; case '\r' : charcat('\\'); charcat('r'); break; case ':' : charcat('\\'); charcat('d'); break; case '\\' : charcat('\\'); charcat('\\'); break; default : charcat(c); break; } } /* put final 0 */ if (p == end) goto bail; *p = 0; return begin; bail: /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Escape for log is too long\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #ifdef _WIN32 static int needs_quote(const char* arg) { while (*arg) { char c = *arg; if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '&' || c == '|' || c == '(' || c == ')' || c == '<' || c == '>' || c == '^' || c == '"' || c == '%' || c == '!' || c == '=' || c == ';' || (unsigned char)c < 32 || c == 127) return 1; ++arg; } return 0; } #endif struct stream { const char* str; unsigned idx; const char** map; unsigned max; }; static inline char ssget(struct stream* ss) { /* get the next char */ char c = *ss->str++; /* if one string is finished, go to the next */ while (c == 0 && ss->idx + 1 < ss->max) { ss->str = ss->map[++ss->idx]; c = *ss->str++; } return c; } #ifdef _WIN32 const char* esc_shell_multi(const char** str_map, unsigned str_max, char* buffer) { char* begin = buffer; char* end = begin + ESC_MAX; char* p = begin; struct stream ss; char c; unsigned i; int has_quote; has_quote = 0; for (i = 0; i < str_max; ++i) { if (needs_quote(str_map[i])) has_quote = 1; } ss.idx = 0; ss.str = str_map[0]; ss.map = str_map; ss.max = str_max; if (!has_quote) { c = ssget(&ss); while (c) { charcat(c); c = ssget(&ss); } } else { /* starting quote */ charcat('"'); c = ssget(&ss); while (c) { int bl = 0; while (c == '\\') { ++bl; c = ssget(&ss); } if (c == 0) { /* double backslashes before closing quote */ bl = bl * 2; while (bl--) charcat('\\'); break; } else if (c == '"') { /* double backslashes + escape the quote */ bl = bl * 2 + 1; while (bl--) charcat('\\'); charcat('"'); } else { /* normal backslashes */ while (bl--) charcat('\\'); charcat(c); } c = ssget(&ss); } /* ending quote */ charcat('"'); } /* put final 0 */ charcat(0); return begin; bail: /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Escape for shell is too long\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #else const char* esc_shell_multi(const char** str_map, unsigned str_max, char* buffer) { char* begin = buffer; char* end = begin + ESC_MAX; char* p = begin; struct stream ss; char c; ss.idx = 0; ss.str = str_map[0]; ss.map = str_map; ss.max = str_max; c = ssget(&ss); while (c) { switch (c) { /* special chars that need to be quoted */ case ' ' : /* space */ case '\t' : /* tab */ case '\n' : /* newline */ case '\r' : /* carriage return */ case '~' : /* home */ case '`' : /* command */ case '#' : /* comment */ case '$' : /* variable */ case '&' : /* background job */ case '*' : /* wildcard */ case '(' : /* shell */ case ')' : /* shell */ case '\\' : /* quote */ case '|' : /* pipe */ case '[' : /* wildcard */ case ']' : /* wildcard */ case '{' : /* code */ case '}' : /* code */ case ';' : /* separator */ case '\'' : /* quote */ case '"' : /* quote */ case '<' : /* redirect */ case '>' : /* redirect */ case '?' : /* wildcard */ case '=' : /* assignment */ case '!' : /* history expansion */ charcat('\\'); charcat(c); break; default : /* check for control characters */ if ((unsigned char)c < 32 || c == 127) { charcat('\\'); charcat(c); } else { charcat(c); } break; } c = ssget(&ss); } /* put final 0 */ charcat(0); return begin; bail: /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Escape for shell is too long\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #endif char* strpolish(char* s) { char* i = s; while (*i) { if (isspace((unsigned char)*i) || !isprint((unsigned char)*i)) *i = ' '; ++i; } return s; } unsigned strsplit(char** split_map, unsigned split_max, char* str, const char* delimiters) { unsigned mac = 0; /* skip initial delimiters */ str += strspn(str, delimiters); while (*str != 0 && mac < split_max) { /* start of the token */ split_map[mac] = str; ++mac; /* find the first delimiter or the end of the string */ str += strcspn(str, delimiters); /* put the final terminator if missing */ if (*str != 0) *str++ = 0; /* skip trailing delimiters */ str += strspn(str, delimiters); } return mac; } char* strtrim(char* str) { char* begin; char* end; begin = str; while (begin[0] && isspace((unsigned char)begin[0])) ++begin; end = begin + strlen(begin); while (end > begin && isspace((unsigned char)end[-1])) --end; end[0] = 0; if (begin != end) memmove(str, begin, end - begin + 1); return str; } char* strlwr(char* str) { char* s = str; while (*s) { *s = tolower((unsigned char)*s); ++s; } return str; } char* worddigitstr(const char* haystack, const char* needle) { size_t len = strlen(needle); const char* s; if (len == 0) return NULL; for (s = haystack; (s = strstr(s, needle)) != NULL; ++s) { /* left boundary */ if (s == haystack || isspace((unsigned char)s[-1]) || isdigit((unsigned char)s[-1])) { /* right boundary */ if (s[len] == '\0' || isspace((unsigned char)s[len]) || isdigit((unsigned char)s[len])) { return (char*)s; } } } return NULL; } /****************************************************************************/ /* path */ void pathcpy(char* dst, size_t size, const char* src) { size_t len = strlen(src); if (len + 1 > size) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Path too long '%s'\n", src); os_abort(); /* LCOV_EXCL_STOP */ } memcpy(dst, src, len + 1); } void pathcat(char* dst, size_t size, const char* src) { size_t dst_len = strlen(dst); size_t src_len = strlen(src); if (dst_len + src_len + 1 > size) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Path too long '%s%s'\n", dst, src); os_abort(); /* LCOV_EXCL_STOP */ } memcpy(dst + dst_len, src, src_len + 1); } void pathcatl(char* dst, size_t dst_len, size_t size, const char* src) { size_t src_len = strlen(src); if (dst_len + src_len + 1 > size) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Path too long '%s%s'\n", dst, src); os_abort(); /* LCOV_EXCL_STOP */ } memcpy(dst + dst_len, src, src_len + 1); } void pathcatc(char* dst, size_t size, char c) { size_t dst_len = strlen(dst); if (dst_len + 2 > size) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Path too long '%s%c'\n", dst, c); os_abort(); /* LCOV_EXCL_STOP */ } dst[dst_len] = c; dst[dst_len + 1] = 0; } void pathimport(char* dst, size_t size, const char* src) { pathcpy(dst, size, src); #ifdef _WIN32 /* convert the Windows dir separator '\' to C '/', */ /* and the Windows escaping char '^' to the fnmatch '\' */ while (*dst) { switch (*dst) { case '\\' : *dst = '/'; break; case '^' : *dst = '\\'; break; } ++dst; } #endif } void pathexport(char* dst, size_t size, const char* src) { pathcpy(dst, size, src); #ifdef _WIN32 /* invert the import */ while (*dst) { switch (*dst) { case '/' : *dst = '\\'; break; case '\\' : *dst = '^'; break; } ++dst; } #endif } void pathprint(char* dst, size_t size, const char* format, ...) { size_t len; va_list ap; va_start(ap, format); len = vsnprintf(dst, size, format, ap); va_end(ap); if (len >= size) { /* LCOV_EXCL_START */ if (size > 0) { dst[size - 1] = 0; log_fatal(EINTERNAL, "Path too long '%s...'\n", dst); } else { log_fatal(EINTERNAL, "Path too long for empty size'\n"); } os_abort(); /* LCOV_EXCL_STOP */ } } void pathslash(char* dst, size_t size) { size_t len = strlen(dst); if (len > 0 && dst[len - 1] != '/') { if (len + 2 > size) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Path too long '%s/'\n", dst); os_abort(); /* LCOV_EXCL_STOP */ } dst[len] = '/'; dst[len + 1] = 0; } } void pathcut(char* dst) { char* slash = strrchr(dst, '/'); if (slash) slash[1] = 0; else dst[0] = 0; } int pathcmp(const char* a, const char* b) { #ifdef _WIN32 char ai[PATH_MAX]; char bi[PATH_MAX]; /* import to convert \ to / */ pathimport(ai, sizeof(ai), a); pathimport(bi, sizeof(bi), b); /* case insensitive compare in Windows */ return stricmp(ai, bi); #else return strcmp(a, b); #endif } int path_is_root_of(const char* root, const char* path) { while (*root && *path) { #ifdef _WIN32 /* case insensitive compare in Windows */ char r = tolower((unsigned char)*root); char p = tolower((unsigned char)*path); if (r == '\\') r = '/'; if (p == '\\') p = '/'; if (r != p) return 0; #else if (*root != *path) return 0; #endif ++root; ++path; } return *root == 0 && *path != 0; } /****************************************************************************/ /* file-system */ int mkancestor(const char* file) { char dir[PATH_MAX]; struct stat st; char* c; pathcpy(dir, sizeof(dir), file); c = strrchr(dir, '/'); if (!c) { /* no ancestor */ return 0; } /* clear the file */ *c = 0; /* if it's the root dir */ if (*dir == 0) { /* nothing more to do */ return 0; } #ifdef _WIN32 /* if it's a drive specification like "C:" */ if (isalpha((unsigned char)dir[0]) && dir[1] == ':' && dir[2] == 0) { /* nothing more to do */ return 0; } #endif /* * Check if the dir already exists using lstat(). * * Note that in Windows when dealing with read-only media * you cannot try to create the directory, and expecting * the EEXIST error because the call will fail with ERROR_WRITE_PROTECTED. * * Also in Windows it's better to use lstat() than stat() because it * doesn't need to open the dir with CreateFile(). */ if (lstat(dir, &st) == 0) { /* it already exists */ return 0; } /* recursively create them all */ if (mkancestor(dir) != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } /* create it */ int ret = mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); if (ret != 0 && errno != EEXIST) { /* LCOV_EXCL_START */ log_fatal(errno, "Error creating directory '%s'. %s.\n", dir, strerror(errno)); return -1; /* LCOV_EXCL_STOP */ } return 0; } int fmtime(int f, int64_t mtime_sec, int mtime_nsec) { #if HAVE_FUTIMENS struct timespec tv[2]; #else struct timeval tv[2]; #endif int ret; #if HAVE_FUTIMENS /* futimens() is preferred because it gives nanosecond precision */ tv[0].tv_sec = mtime_sec; if (mtime_nsec != STAT_NSEC_INVALID) tv[0].tv_nsec = mtime_nsec; else tv[0].tv_nsec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_nsec = tv[0].tv_nsec; ret = futimens(f, tv); #elif HAVE_FUTIMES /* fallback to futimes() if nanosecond precision is not available */ tv[0].tv_sec = mtime_sec; if (mtime_nsec != STAT_NSEC_INVALID) tv[0].tv_usec = mtime_nsec / 1000; else tv[0].tv_usec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_usec = tv[0].tv_usec; ret = futimes(f, tv); #elif HAVE_FUTIMESAT /* fallback to futimesat() for Solaris, it only has futimesat() */ tv[0].tv_sec = mtime_sec; if (mtime_nsec != STAT_NSEC_INVALID) tv[0].tv_usec = mtime_nsec / 1000; else tv[0].tv_usec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_usec = tv[0].tv_usec; ret = futimesat(f, 0, tv); #else #error No function available to set file timestamps with sub-second precision #endif return ret; } int lmtime(const char* path, int64_t mtime_sec, int mtime_nsec) { #if HAVE_UTIMENSAT struct timespec tv[2]; #else struct timeval tv[2]; #endif int ret; #if HAVE_UTIMENSAT /* utimensat() is preferred because it gives nanosecond precision */ tv[0].tv_sec = mtime_sec; if (mtime_nsec != STAT_NSEC_INVALID) tv[0].tv_nsec = mtime_nsec; else tv[0].tv_nsec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_nsec = tv[0].tv_nsec; ret = utimensat(AT_FDCWD, path, tv, AT_SYMLINK_NOFOLLOW); #elif HAVE_LUTIMES /* fallback to lutimes() if nanosecond precision is not available */ tv[0].tv_sec = mtime_sec; if (mtime_nsec != STAT_NSEC_INVALID) tv[0].tv_usec = mtime_nsec / 1000; else tv[0].tv_usec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_usec = tv[0].tv_usec; ret = lutimes(path, tv); #elif HAVE_FUTIMESAT /* fallback to futimesat() for Solaris, it only has futimesat() */ tv[0].tv_sec = mtime_sec; if (mtime_nsec != STAT_NSEC_INVALID) tv[0].tv_usec = mtime_nsec / 1000; else tv[0].tv_usec = 0; tv[1].tv_sec = tv[0].tv_sec; tv[1].tv_usec = tv[0].tv_usec; ret = futimesat(AT_FDCWD, path, tv); #else #error No function available to set file timestamps with sub-second precision #endif return ret; } /****************************************************************************/ /* advise */ void advise_init(struct advise_struct* advise, int mode) { advise->mode = mode; advise->dirty_begin = 0; advise->dirty_end = 0; } int advise_flags(struct advise_struct* advise) { int flags = 0; if (advise->mode == ADVISE_SEQUENTIAL || advise->mode == ADVISE_FLUSH || advise->mode == ADVISE_FLUSH_WINDOW || advise->mode == ADVISE_DISCARD || advise->mode == ADVISE_DISCARD_WINDOW ) flags |= O_SEQUENTIAL; #if HAVE_DIRECT_IO if (advise->mode == ADVISE_DIRECT) flags |= O_DIRECT; #endif return flags; } int advise_open(struct advise_struct* advise, int f) { (void)advise; (void)f; #if HAVE_POSIX_FADVISE if (advise->mode == ADVISE_SEQUENTIAL || advise->mode == ADVISE_FLUSH || advise->mode == ADVISE_FLUSH_WINDOW || advise->mode == ADVISE_DISCARD || advise->mode == ADVISE_DISCARD_WINDOW ) { int ret; /* advise noreuse access, this avoids to pollute the page cache */ /* supported from Linux Kernel 6.3 with this commit: https://github.com/torvalds/linux/commit/17e810229cb3068b692fa078bd9b3a6527e0866a */ ret = posix_fadvise_wrapper(f, 0, 0, POSIX_FADV_NOREUSE); if (ret == ENOSYS) { /* call is not supported */ ret = 0; } if (ret != 0) { /* LCOV_EXCL_START */ errno = ret; /* posix_fadvise return the error code */ return -1; /* LCOV_EXCL_STOP */ } /* advise sequential access, this doubles the read-ahead window size */ ret = posix_fadvise_wrapper(f, 0, 0, POSIX_FADV_SEQUENTIAL); if (ret == ENOSYS) { /* call is not supported, like in armhf, see posix_fadvise manpage */ ret = 0; } if (ret != 0) { /* LCOV_EXCL_START */ errno = ret; /* posix_fadvise return the error code */ return -1; /* LCOV_EXCL_STOP */ } } #endif return 0; } int advise_write(struct advise_struct* advise, int f, data_off_t offset, data_off_t size) { data_off_t flush_offset; data_off_t flush_size; data_off_t discard_offset; data_off_t discard_size; (void)f; (void)flush_offset; (void)flush_size; (void)discard_offset; (void)discard_size; flush_offset = 0; flush_size = 0; discard_offset = 0; discard_size = 0; /* * Follow Linus recommendations about fast writes. * * Linus "Unexpected splice "always copy" behavior observed" * http://thread.gmane.org/gmane.linux.kernel/987247/focus=988070 * --- * I have had _very_ good experiences with even a rather trivial * file writer that basically used (iirc) 8MB windows, and the logic was very * trivial: * * - before writing a new 8M window, do "start writeback" * (SYNC_FILE_RANGE_WRITE) on the previous window, and do * a wait (SYNC_FILE_RANGE_WAIT_AFTER) on the window before that. * * in fact, in its simplest form, you can do it like this (this is from my * "overwrite disk images" program that I use on old disks): * * for (index = 0; index < max_index ;index++) { * if (write(fd, buffer, BUFSIZE) != BUFSIZE) * break; * // This won't block, but will start writeout asynchronously * sync_file_range(fd, index*BUFSIZE, BUFSIZE, SYNC_FILE_RANGE_WRITE); * // This does a blocking write-and-wait on any old ranges * if (index) * sync_file_range(fd, (index-1)*BUFSIZE, BUFSIZE, SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER); * } * * and even if you don't actually do a discard (maybe we should add a * SYNC_FILE_RANGE_DISCARD bit, right now you'd need to do a separate * fadvise(FADV_DONTNEED) to throw it out) the system behavior is pretty * nice, because the heavy writer gets good IO performance _and_ leaves only * easy-to-free pages around after itself. * --- * * Linus "Unexpected splice "always copy" behavior observed" * http://thread.gmane.org/gmane.linux.kernel/987247/focus=988176 * --- * The behavior for dirty page writeback is _not_ well defined, and * if you do POSIX_FADV_DONTNEED, I would suggest you do it as part of that * writeback logic, ie you do it only on ranges that you have just waited on. * * IOW, in my example, you'd couple the * * sync_file_range(fd, (index-1)*BUFSIZE, BUFSIZE, SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER); * * with a * * posix_fadvise(fd, (index-1)*BUFSIZE, BUFSIZE, POSIX_FADV_DONTNEED); * * afterwards to throw out the pages that you just waited for. * --- */ switch (advise->mode) { case ADVISE_FLUSH : flush_offset = offset; flush_size = size; break; case ADVISE_DISCARD : discard_offset = offset; discard_size = size; break; case ADVISE_FLUSH_WINDOW : /* if the dirty range can be extended */ if (advise->dirty_end == offset) { /* extent the dirty range */ advise->dirty_end += size; /* if we reached the window size */ if (advise->dirty_end - advise->dirty_begin >= ADVISE_WINDOW_SIZE) { /* flush the window */ flush_offset = advise->dirty_begin; flush_size = ADVISE_WINDOW_SIZE; /* remove it from the dirty range */ advise->dirty_begin += ADVISE_WINDOW_SIZE; } } else { /* otherwise flush the existing dirty */ flush_offset = advise->dirty_begin; flush_size = advise->dirty_end - advise->dirty_begin; /* and set the new range as dirty */ advise->dirty_begin = offset; advise->dirty_end = offset + size; } break; case ADVISE_DISCARD_WINDOW : /* if the dirty range can be extended */ if (advise->dirty_end == offset) { /* extent the dirty range */ advise->dirty_end += size; /* if we reached the double window size */ if (advise->dirty_end - advise->dirty_begin >= 2 * ADVISE_WINDOW_SIZE) { /* discard the first window */ discard_offset = advise->dirty_begin; discard_size = ADVISE_WINDOW_SIZE; /* remove it from the dirty range */ advise->dirty_begin += ADVISE_WINDOW_SIZE; /* flush the second window */ flush_offset = advise->dirty_begin; flush_size = ADVISE_WINDOW_SIZE; } } else { /* otherwise discard the existing dirty */ discard_offset = advise->dirty_begin; discard_size = advise->dirty_end - advise->dirty_begin; /* and set the new range as dirty */ advise->dirty_begin = offset; advise->dirty_end = offset + size; } break; } #if HAVE_SYNC_FILE_RANGE if (flush_size != 0) { int ret; /* start writing immediately */ ret = sync_file_range(f, flush_offset, flush_size, SYNC_FILE_RANGE_WRITE); if (ret != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } } #endif #if HAVE_SYNC_FILE_RANGE && HAVE_POSIX_FADVISE if (discard_size != 0) { int ret; /* send the data to the disk and wait until it's written */ ret = sync_file_range(f, discard_offset, discard_size, SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER); if (ret != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } /* flush the data from the cache */ ret = posix_fadvise_wrapper(f, discard_offset, discard_size, POSIX_FADV_DONTNEED); if (ret == ENOSYS) { /* call is not supported */ ret = 0; } if (ret != 0) { /* LCOV_EXCL_START */ errno = ret; /* posix_fadvise return the error code */ return -1; /* LCOV_EXCL_STOP */ } } #endif return 0; } int advise_read(struct advise_struct* advise, int f, data_off_t offset, data_off_t size) { (void)advise; (void)f; (void)offset; (void)size; #if HAVE_POSIX_FADVISE if (advise->mode == ADVISE_DISCARD || advise->mode == ADVISE_DISCARD_WINDOW ) { int ret; /* flush the data from the cache */ ret = posix_fadvise_wrapper(f, offset, size, POSIX_FADV_DONTNEED); if (ret == ENOSYS) { /* call is not supported */ ret = 0; } if (ret != 0) { /* LCOV_EXCL_START */ errno = ret; /* posix_fadvise return the error code */ return -1; /* LCOV_EXCL_STOP */ } } #endif /* * Here we cannot call posix_fadvise(..., POSIX_FADV_WILLNEED) for the next block * because it may be blocking. * * Ted Ts'o "posix_fadvise(POSIX_FADV_WILLNEED) waits before returning?" * https://lkml.org/lkml/2010/12/6/122 * --- * readahead and posix_fadvise(POSIX_FADV_WILLNEED) work exactly the same * way, and in fact share mostly the same code path (see * force_page_cache_readahead() in mm/readahead.c). * * They are asynchronous in that there is no guarantee the pages will be * in the page cache by the time they return. But at the same time, they * are not guaranteed to be non-blocking. That is, the work of doing the * readahead does not take place in a kernel thread. So if you try to * request I/O than will fit in the request queue, the system call will * block until some I/O is completed so that more I/O requested cam be * loaded onto the request queue. * * The only way to fix this would be to either put the work on a kernel * thread (i.e., some kind of workqueue) or in a userspace thread. For * ion programmer wondering what to do today, I'd suggest the * latter since it will be more portable across various kernel versions. * * This does leave the question about whether we should change the kernel * to allow readahead() and posix_fadvise(POSIX_FADV_WILLNEED) to be * non-blocking and do this work in a workqueue (or via some kind of * callback/continuation scheme). My worry is just doing this if a user * application does something crazy, like request gigabytes and gigabytes * of readahead, and then repented of their craziness, there should be a * way of cancelling the readahead request. Today, the user can just * kill the application. But if we simply shove the work to a kernel * thread, it becomes a lot harder to cancel the readahead request. We'd * have to invent a new API, and then have a way to know whether the user * has access to kill a particular readahead request, etc. * --- */ return 0; } void advise_close(struct advise_struct* advise, int f) { data_off_t flush_offset; data_off_t flush_size; data_off_t discard_offset; data_off_t discard_size; (void)advise; (void)f; (void)flush_offset; (void)flush_size; (void)discard_offset; (void)discard_size; flush_offset = 0; flush_size = 0; discard_offset = 0; discard_size = 0; /* assume it's a write if advise->dirty_begin != advise->dirty_end */ switch (advise->mode) { case ADVISE_FLUSH_WINDOW : flush_offset = advise->dirty_begin; flush_size = advise->dirty_end - advise->dirty_begin; break; case ADVISE_DISCARD_WINDOW : discard_offset = advise->dirty_begin; discard_size = advise->dirty_end - advise->dirty_begin; break; } #if HAVE_SYNC_FILE_RANGE if (flush_size != 0) { /* start writing immediately */ sync_file_range(f, flush_offset, flush_size, SYNC_FILE_RANGE_WRITE); } #endif #if HAVE_SYNC_FILE_RANGE && HAVE_POSIX_FADVISE if (discard_size != 0) { int ret; /* send the data to the disk and wait until it's written */ ret = sync_file_range(f, discard_offset, discard_size, SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER); if (ret != 0) { /* LCOV_EXCL_START */ return; /* LCOV_EXCL_STOP */ } /* flush the data from the cache */ posix_fadvise_wrapper(f, discard_offset, discard_size, POSIX_FADV_DONTNEED); } #endif advise->dirty_begin = 0; advise->dirty_end = 0; } /****************************************************************************/ /* memory */ /** * Cumulative amount of memory allocated. */ static size_t mcounter; size_t malloc_counter_get(void) { size_t ret; lock_memory(); ret = mcounter; unlock_memory(); return ret; } void malloc_counter_inc(size_t inc) { lock_memory(); mcounter += inc; unlock_memory(); } /* LCOV_EXCL_START */ static ssize_t malloc_print(int f, const char* str) { ssize_t len = 0; while (str[len]) ++len; return write(f, str, len); } /* LCOV_EXCL_STOP */ /* LCOV_EXCL_START */ static ssize_t malloc_printn(int f, size_t value) { char buf[32]; int i; if (!value) return write(f, "0", 1); i = sizeof(buf); while (value) { buf[--i] = (value % 10) + '0'; value /= 10; } return write(f, buf + i, sizeof(buf) - i); } /* LCOV_EXCL_STOP */ /* LCOV_EXCL_START */ void malloc_fail(size_t size) { /* don't use printf to avoid any possible extra allocation */ int f = 2; /* stderr */ malloc_print(f, "Failed for Low Memory!\n"); malloc_print(f, "Allocating "); malloc_printn(f, size); malloc_print(f, " bytes.\n"); malloc_print(f, "Already allocated "); malloc_printn(f, malloc_counter_get()); malloc_print(f, " bytes.\n"); if (sizeof(void*) == 4) { malloc_print(f, "You are currently using a 32 bits executable.\n"); malloc_print(f, "If you have more than 4GB of memory, please upgrade to a 64 bits one.\n"); } } /* LCOV_EXCL_STOP */ void* malloc_nofail(size_t size) { void* ptr = malloc(size); if (!ptr) { /* LCOV_EXCL_START */ malloc_fail(size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } #ifndef CHECKER /* Don't preinitialize when running for valgrind */ /* Here we preinitialize the memory to ensure that the OS is really allocating it */ /* and not only reserving the addressable space. */ /* Otherwise we are risking that the OOM (Out Of Memory) killer in Linux will kill the process. */ /* Filling the memory doesn't ensure to disable OOM, but it increase a lot the chances to */ /* get a real error from malloc() instead than a process killed. */ /* Note that calloc() doesn't have the same effect. */ memset(ptr, 0xA5, size); #endif malloc_counter_inc(size); return ptr; } void* calloc_nofail(size_t count, size_t size) { void* ptr; size *= count; /* see the note in malloc_nofail() of why we don't use calloc() */ ptr = malloc(size); if (!ptr) { /* LCOV_EXCL_START */ malloc_fail(size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } memset(ptr, 0, size); malloc_counter_inc(size); return ptr; } char* strdup_nofail(const char* str) { size_t size; char* ptr; size = strlen(str) + 1; ptr = malloc(size); if (!ptr) { /* LCOV_EXCL_START */ malloc_fail(size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } memcpy(ptr, str, size); malloc_counter_inc(size); return ptr; } /****************************************************************************/ /* smartctl */ /** * Match a string with the specified pattern. * Like sscanf() a space match any sequence of spaces. * Return 0 if it matches. */ static int smatch(const char* str, const char* pattern) { while (*pattern) { if (isspace((unsigned char)*pattern)) { ++pattern; while (isspace((unsigned char)*str)) ++str; } else if (*pattern == *str) { ++pattern; ++str; } else return -1; } return 0; } int is_sep(char c) { return c == '.' || c == ',' || c == '\'' || c == ' ' /* 0xa0 converted by space for no code page */ || c == (char)0xa0; /* french */ } /* * snumber() * * Matches a literal prefix (the second argument), then parses the following * unsigned 64-bit integer, allowing thousand separators. * * Whitespace is flexible around the prefix and before the number. * Commas are ignored during number parsing but basic validation is applied. * * Returns: * 1 - successfully parsed a valid uint64_t * 0 - prefix mismatch, no digits found, invalid format or overflow */ int snumber(const char* str, const char* prefix, uint64_t* value) { const char* s = str; const char* f = prefix; /* match literal prefix, tolerating whitespace differences */ while (*f) { /* skip whitespace in both strings */ while (isspace((unsigned char)*f)) ++f; while (isspace((unsigned char)*s)) ++s; if (*f == 0) break; if (*s != *f) return 0; /* prefix mismatch */ ++s; ++f; } /* skip whitespace before the number starts */ while (isspace((unsigned char)*s)) ++s; uint64_t num = 0; int digits_seen = 0; int sep_seen = 0; /* parse digits, ignoring commas */ while (*s) { if (*s >= '0' && *s <= '9') { unsigned digit = (unsigned)(*s - '0'); /* check for uint64_t overflow before multiplying */ if (num > (UINT64_MAX - digit) / 10ULL) return 0; num = num * 10ULL + digit; ++digits_seen; sep_seen = 0; } else if (is_sep(*s)) { /* disallow leading separators */ if (digits_seen == 0) return 0; /* if two consecutive separators, stop parsing */ if (sep_seen) break; sep_seen = 1; } else { /* any other character ends the number */ break; } ++s; } /* require at least one digit */ if (digits_seen == 0) return 0; *value = num; return 1; } int smartctl_attribute(FILE* f, const char* file, const char* name, struct smart_attr* smart, uint64_t* info, char* serial, char* family, char* model, char* inter) { unsigned i; int inside; struct smart_attr dummy_smart[SMART_COUNT]; uint64_t dummy_info[INFO_COUNT]; char dummy_serial[SMART_MAX]; char dummy_family[SMART_MAX]; char dummy_model[SMART_MAX]; char dummy_interface[SMART_MAX]; /* dummy attributes */ if (!smart) smart = dummy_smart; if (!info) info = dummy_info; if (!serial) serial = dummy_serial; if (!family) family = dummy_family; if (!model) model = dummy_model; if (!inter) inter = dummy_interface; /* preclear attributes */ *serial = 0; *family = 0; *model = 0; *inter = 0; memset(smart, 0, sizeof(struct smart_attr) * SMART_COUNT); for (i = 0; i < SMART_COUNT; ++i) { smart[i].raw = SMART_UNASSIGNED; smart[i].norm = SMART_UNASSIGNED; smart[i].worst = SMART_UNASSIGNED; smart[i].thresh = SMART_UNASSIGNED; } for (i = 0; i < INFO_COUNT; ++i) info[i] = SMART_UNASSIGNED; /* read the file */ inside = 0; while (1) { char buf[256]; unsigned id; uint64_t raw; char* s; s = fgets(buf, sizeof(buf), f); if (s == 0) break; /* remove extraneous chars */ s = strpolish(buf); log_tag("smartctl:%s:%s:out: %s\n", file, name, s); /* skip initial spaces */ while (isspace((unsigned char)*s)) ++s; if (*s == 0) { inside = 0; /* common */ } else if (smatch(s, "Rotation Rate: Solid State") == 0) { info[INFO_ROTATION_RATE] = 0; } else if (sscanf(s, "Rotation Rate: %" SCNu64, &info[INFO_ROTATION_RATE]) == 1) { } else if (snumber(s, "User Capacity:", &raw) == 1) { info[INFO_SIZE] = raw; } else if (sscanf(s, "Model Family: %63[^\n]", family) == 1) { strtrim(family); } else if (sscanf(s, "Device Model: %63[^\n]", model) == 1) { strtrim(model); } else if (sscanf(s, "Serial number: %63s", serial) == 1) { /* SCSI */ strtrim(serial); } else if (sscanf(s, "Serial Number: %63s", serial) == 1) { /*ATA / NVMe */ strtrim(serial); /* SCSI */ /* Vendor: WD Product: WD4001FYYG-01SL3 Revision: VR08 Compliance: SPC-4 User Capacity: 4,000,787,030,016 bytes [4.00 TB] Logical block size: 512 bytes Rotation Rate: 7200 rpm Form Factor: 3.5 inches Logical Unit id: 0x50000c0f01f55dd0 Serial number: WMC1F0D41KD5 Device type: disk Transport protocol: SAS (SPL-3) Local Time is: Fri Jan 28 14:14:51 2022 CET SMART support is: Available - device has SMART capability. SMART support is: Enabled Temperature Warning: Enabled Current Drive Temperature: 38 C Drive Trip Temperature: 65 C Manufactured in week 25 of year 2012 Specified cycle count over device lifetime: 10000 Accumulated start-stop cycles: 103 Specified load-unload count over device lifetime: 300000 Accumulated load-unload cycles: 103 Elements in grown defect list: 5 Vendor (Seagate) cache information Blocks sent to initiator = 569127595 Blocks received from initiator = 2633690060 Blocks read from cache and sent to initiator = 1881027254 Number of read and write commands whose size <= segment size = 181284019 Number of read and write commands whose size > segment size = 0 Vendor (Seagate/Hitachi) factory information number of hours powered up = 25024.80 number of minutes until next internal SMART test = 42 */ } else if (sscanf(s, "Transport protocol: %63[^\n]", inter) == 1) { if (strcmp(inter, "Fibre channel (FCP-4)") == 0) strcpy(inter, "Fibre"); else if (strcmp(inter, "SSA") == 0) strcpy(inter, "SSA"); else if (strcmp(inter, "IEEE 1394 (SBP-3)") == 0) strcpy(inter, "FireWire"); else if (strcmp(inter, "RDMA (SRP)") == 0) strcpy(inter, "SCSI"); else if (strcmp(inter, "iSCSI") == 0) strcpy(inter, "iSCSI"); else if (strcmp(inter, "SAS (SPL-4)") == 0) strcpy(inter, "SAS"); else if (strcmp(inter, "ADT") == 0) strcpy(inter, "SCSI"); else if (strcmp(inter, "ATA (ACS-2)") == 0) strcpy(inter, "SATA"); else if (strcmp(inter, "UAS") == 0) strcpy(inter, "USB"); else if (strcmp(inter, "SOP") == 0) strcpy(inter, "NVMe"); else if (strcmp(inter, "PCIe") == 0) strcpy(inter, "PCIe"); else strcpy(inter, "SCSI"); /* map generic attributes to SMART attr */ } else if (sscanf(s, "Elements in grown defect list: %" SCNu64, &smart[SMART_REALLOCATED_SECTOR_COUNT].raw) == 1) { pathcpy(smart[SMART_REALLOCATED_SECTOR_COUNT].name, sizeof(smart[SMART_REALLOCATED_SECTOR_COUNT].name), "Elements_In_Grown_Defect_List"); } else if (sscanf(s, "Current Drive Temperature: %" SCNu64, &smart[SMART_TEMPERATURE_CELSIUS].raw) == 1) { pathcpy(smart[SMART_TEMPERATURE_CELSIUS].name, sizeof(smart[SMART_TEMPERATURE_CELSIUS].name), "Current_Drive_Temperature"); } else if (sscanf(s, "Drive Trip Temperature: %" SCNu64, &smart[SMART_AIRFLOW_TEMPERATURE_CELSIUS].raw) == 1) { pathcpy(smart[SMART_AIRFLOW_TEMPERATURE_CELSIUS].name, sizeof(smart[SMART_AIRFLOW_TEMPERATURE_CELSIUS].name), "Drive_Trip_Temperature"); } else if (sscanf(s, "Accumulated start-stop cycles: %" SCNu64, &smart[SMART_START_STOP_COUNT].raw) == 1) { pathcpy(smart[SMART_START_STOP_COUNT].name, sizeof(smart[SMART_START_STOP_COUNT].name), "Accumulated_Start-Stop_Cycles"); } else if (sscanf(s, "Accumulated load-unload cycles: %" SCNu64, &smart[SMART_LOAD_CYCLE_COUNT].raw) == 1) { pathcpy(smart[SMART_LOAD_CYCLE_COUNT].name, sizeof(smart[SMART_LOAD_CYCLE_COUNT].name), "Accumulated_Load-Unload_Cycles"); } else if (sscanf(s, " number of hours powered up = %" SCNu64, &smart[SMART_POWER_ON_HOURS].raw) == 1) { /* note "n" of "number" lower case */ pathcpy(smart[SMART_POWER_ON_HOURS].name, sizeof(smart[SMART_POWER_ON_HOURS].name), "Number_Of_Hours_Powered_Up"); /* special entries */ } else if (sscanf(s, "Non-medium error count: %" SCNu64, &raw) == 1) { smart[SMART_ERROR_PROTOCOL].raw = raw; /* ATA */ /* ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0 3 Spin_Up_Time 0x0027 172 169 021 Pre-fail Always - 8383 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 24 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 7 Seek_Error_Rate 0x002e 200 200 000 Old_age Always - 0 9 Power_On_Hours 0x0032 083 083 000 Old_age Always - 12471 10 Spin_Retry_Count 0x0032 100 253 000 Old_age Always - 0 11 Calibration_Retry_Count 0x0032 100 253 000 Old_age Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 24 192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 9 193 Load_Cycle_Count 0x0032 157 157 000 Old_age Always - 131565 194 Temperature_Celsius 0x0022 127 119 000 Old_age Always - 25 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0 198 Offline_Uncorrectable 0x0030 100 253 000 Old_age Offline - 0 199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0 200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age Offline - 0 */ } else if (smatch(s, "ATA Version is:") == 0) { strcpy(inter, "ATA"); } else if (smatch(s, "SATA Version is:") == 0) { strcpy(inter, "SATA"); } else if (smatch(s, "Transport Type: PCIe") == 0) { strcpy(inter, "PCIe"); } else if (smatch(s, "Transport Type: Parallel") == 0) { strcpy(inter, "PATA"); /* special entries */ } else if (smatch(s, "No Errors Logged") == 0) { smart[SMART_ERROR_PROTOCOL].raw = 0; } else if (sscanf(s, "ATA Error Count: %" SCNu64, &raw) == 1) { smart[SMART_ERROR_PROTOCOL].raw = raw; /* NVME */ /* Critical Warning: 0x00 Temperature: 55 Celsius Available Spare: 100% Available Spare Threshold: 10% Percentage Used: 8% Data Units Read: 213,006,510 [109 TB] Data Units Written: 549,370,112 [281 TB] Host Read Commands: 11,210,192,197 Host Write Commands: 20,687,602,229 Controller Busy Time: 14,055 Power Cycles: 39 Power On Hours: 4,204 Unsafe Shutdowns: 9 Media and Data Integrity Errors: 0 Error Information Log Entries: 1,479,242 Warning Comp. Temperature Time: 0 Critical Comp. Temperature Time: 0 Temperature Sensor 2: 75 Celsius Thermal Temp. 1 Total Time: 58745 */ } else if (smatch(s, "NVMe Version:") == 0) { strcpy(inter, "NVMe"); /* special entries */ } else if (snumber(s, "Media and Data Integrity Errors:", &raw) == 1) { smart[SMART_ERROR_MEDIUM].raw = raw; } else if (snumber(s, "Error Information Log Entries:", &raw) == 1) { smart[SMART_ERROR_PROTOCOL].raw = raw; } else if (sscanf(s, "Percentage Used: %" SCNu64 "%%", &raw) == 1) { smart[SMART_WEAR_LEVEL].raw = raw; /* take care that it can be greather than 100%, meaning that it's used over the expected lifetime */ /* map generic attributes to SMART attr */ } else if (sscanf(s, "Temperature: %" SCNu64, &smart[SMART_TEMPERATURE_CELSIUS].raw) == 1) { pathcpy(smart[SMART_TEMPERATURE_CELSIUS].name, sizeof(smart[SMART_TEMPERATURE_CELSIUS].name), "Temperature"); } else if (snumber(s, "Power On Hours:", &smart[SMART_POWER_ON_HOURS].raw) == 1) { pathcpy(smart[SMART_POWER_ON_HOURS].name, sizeof(smart[SMART_POWER_ON_HOURS].name), "Power_On_Hours"); } else if (snumber(s, "Power Cycles:", &smart[SMART_POWER_CYCLE_COUNT].raw) == 1) { pathcpy(smart[SMART_POWER_CYCLE_COUNT].name, sizeof(smart[SMART_POWER_CYCLE_COUNT].name), "Power_Cycles"); /* map specific attributes to UNUSED SMART attr */ } else if (sscanf(s, "Critical Warning: %" SCNx64, &smart[SMART_NVME_CRITICAL_WARNING].raw) == 1) { pathcpy(smart[SMART_NVME_CRITICAL_WARNING].name, sizeof(smart[SMART_NVME_CRITICAL_WARNING].name), "Critical_Warning"); } else if (sscanf(s, "Available Spare: %" SCNu64 "%%", &smart[SMART_NVME_AVAILABLE_SPARE].raw) == 1) { pathcpy(smart[SMART_NVME_AVAILABLE_SPARE].name, sizeof(smart[SMART_NVME_AVAILABLE_SPARE].name), "Available_Spare"); } else if (snumber(s, "Data Units Read:", &smart[SMART_NVME_DATA_UNITS_READ].raw) == 1) { pathcpy(smart[SMART_NVME_DATA_UNITS_READ].name, sizeof(smart[SMART_NVME_DATA_UNITS_READ].name), "Data_Units_Read"); } else if (snumber(s, "Data Units Written:", &smart[SMART_NVME_DATA_UNITS_WRITTEN].raw) == 1) { pathcpy(smart[SMART_NVME_DATA_UNITS_WRITTEN].name, sizeof(smart[SMART_NVME_DATA_UNITS_WRITTEN].name), "Data_Units_Written"); } else if (snumber(s, "Host Read Commands:", &smart[SMART_NVME_HOST_READ_COMMANDS].raw) == 1) { pathcpy(smart[SMART_NVME_HOST_READ_COMMANDS].name, sizeof(smart[SMART_NVME_HOST_READ_COMMANDS].name), "Host_Read_Commands"); } else if (snumber(s, "Host Write Commands:", &smart[SMART_NVME_HOST_WRITE_COMMANDS].raw) == 1) { pathcpy(smart[SMART_NVME_HOST_WRITE_COMMANDS].name, sizeof(smart[SMART_NVME_HOST_WRITE_COMMANDS].name), "Host_Write_Commands"); } else if (snumber(s, "Controller Busy Time:", &smart[SMART_NVME_CONTROLLER_BUSY_TIME].raw) == 1) { pathcpy(smart[SMART_NVME_CONTROLLER_BUSY_TIME].name, sizeof(smart[SMART_NVME_CONTROLLER_BUSY_TIME].name), "Controller_Busy_Time"); } else if (snumber(s, "Unsafe Shutdowns:", &smart[SMART_NVME_UNSAFE_SHUTDOWNS].raw) == 1) { pathcpy(smart[SMART_NVME_UNSAFE_SHUTDOWNS].name, sizeof(smart[SMART_NVME_UNSAFE_SHUTDOWNS].name), "Unsafe_Shutdowns"); /* smartctl doesn't print this with command, but %d */ } else if (snumber(s, "Warning Comp. Temperature Time:", &smart[SMART_NVME_WARNING_COMP_TEMPERATURE_TIME].raw) == 1) { pathcpy(smart[SMART_NVME_WARNING_COMP_TEMPERATURE_TIME].name, sizeof(smart[SMART_NVME_WARNING_COMP_TEMPERATURE_TIME].name), "Warning_Comp_Temperature_Time"); /* smartctl doesn't print this with command, but %d */ } else if (snumber(s, "Critical Comp. Temperature Time:", &smart[SMART_NVME_CRITICAL_COMP_TEMPERATURE_TIME].raw) == 1) { pathcpy(smart[SMART_NVME_CRITICAL_COMP_TEMPERATURE_TIME].name, sizeof(smart[SMART_NVME_CRITICAL_COMP_TEMPERATURE_TIME].name), "Critical_Comp_Temperature_Time"); /* ATA Attributes table */ } else if (smatch(s, "ID#") == 0) { inside = 1; } else if (inside) { char id_name[128] = { 0 }; char type[64] = { 0 }; char updated[64] = { 0 }; char when_failed[64] = { 0 }; char norm[64] = { 0 }; char worst[64] = { 0 }; char thresh[64] = { 0 }; uint64_t min, max, avg; int format_minmax = 0; int format_avg = 0; int flags; unsigned long v; char* e; /* 194 Temperature_Celsius 0x0002 240 240 000 Old_age Always - 27 (Min/Max 16/60) */ if (sscanf(s, "%u %127s %*s %63s %63s %63s %63s %63s %63s %" SCNu64 " (Min/Max %" SCNu64 "/%" SCNu64 ")", &id, id_name, norm, worst, thresh, type, updated, when_failed, &raw, &min, &max) == 11) { format_minmax = 1; /* 3 Spin_Up_Time 0x0007 149 149 024 Pre-fail Always - 442 (Average 441) */ } else if (sscanf(s, "%u %127s %*s %63s %63s %63s %63s %63s %63s %" SCNu64 " (Average %" SCNu64 ")", &id, id_name, norm, worst, thresh, type, updated, when_failed, &raw, &avg) == 10) { format_avg = 1; } else if (sscanf(s, "%u %127s %*s %63s %63s %63s %63s %63s %63s %" SCNu64, &id, id_name, norm, worst, thresh, type, updated, when_failed, &raw) == 9) { } else { log_fatal(EEXTERNAL, "Invalid smartctl line '%s'.\n", s); return -1; } if (id >= 256) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Invalid SMART id '%u'.\n", id); return -1; /* LCOV_EXCL_STOP */ } flags = 0; if (strcmp(type, "Pre-fail") == 0) flags |= SMART_ATTR_TYPE_PREFAIL; else if (strcmp(type, "Old_age") == 0) flags |= SMART_ATTR_TYPE_OLDAGE; if (strcmp(updated, "Always") == 0) flags |= SMART_ATTR_UPDATE_ALWAYS; else if (strcmp(updated, "Offline") == 0) flags |= SMART_ATTR_UPDATE_OFFLINE; if (strcmp(when_failed, "FAILING_NOW") == 0) flags |= SMART_ATTR_WHEN_FAILED_NOW; else if (strcmp(when_failed, "In_the_past") == 0) flags |= SMART_ATTR_WHEN_FAILED_PAST; else if (strcmp(when_failed, "-") == 0) flags |= SMART_ATTR_WHEN_FAILED_NEVER; /* revert the min/max decoding done by smartctl */ if (format_minmax && raw <= 0xFFFFUL && min <= 0xFFFFUL && max <= 0xFFFFUL) { raw |= min << 16; raw |= max << 32; } /* revert the avg decoding done by smartctl */ if (format_avg && raw <= 0xFFFFUL && avg <= 0xFFFFUL) { raw |= avg << 16; } smart[id].raw = raw; v = strtoul(norm, &e, 10); if (e != norm || *e == 0) { smart[id].norm = v; } else { smart[id].norm = SMART_UNASSIGNED; } v = strtoul(worst, &e, 10); if (e != worst || *e == 0) { smart[id].worst = v; } else { smart[id].worst = SMART_UNASSIGNED; } v = strtoul(thresh, &e, 10); if (e != thresh || *e == 0) { smart[id].thresh = v; } else { smart[id].thresh = SMART_UNASSIGNED; } smart[id].flags = flags; pathcpy(smart[id].name, sizeof(smart[id].name), id_name); /* * Map normalized health percentage to our unified wear level for SSDs * 177: Wear_Leveling_Count (Samsung/Crucial) * 231: SSD_Life_Left (Kingston/WD) * 233: Media_Wearout_Indicator (Intel) */ if (smart[id].norm != SMART_UNASSIGNED && smart[id].norm <= 100) { if (strcmp(id_name, "Wear_Leveling_Count") == 0 || strcmp(id_name, "SSD_Life_Left") == 0 || strcmp(id_name, "Media_Wearout_Indicator") == 0) { smart[SMART_WEAR_LEVEL].raw = 100 - smart[id].norm; } } } } return 0; } int smartctl_flush(FILE* f, const char* file, const char* name) { /* read the file */ while (1) { char buf[256]; char* s; s = fgets(buf, sizeof(buf), f); if (s == 0) break; /* remove extraneous chars */ s = strpolish(buf); log_tag("smartctl:%s:%s:out: %s\n", file, name, s); } return 0; } int smart_temp(devinfo_t* devinfo) { uint64_t t = devinfo->smart[SMART_TEMPERATURE_CELSIUS].raw; if (t == SMART_UNASSIGNED) t = devinfo->smart[SMART_AIRFLOW_TEMPERATURE_CELSIUS].raw; if (t == SMART_UNASSIGNED) return -1; /* mask out min/max values */ t &= 0xFFFFUL; if (t == 0) return -1; if (t > 100) return -1; return t; } /****************************************************************************/ /* thread */ #if HAVE_THREAD void thread_mutex_init(thread_mutex_t* mutex) { if (pthread_mutex_init(mutex, 0) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_mutex_init().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_mutex_destroy(thread_mutex_t* mutex) { if (pthread_mutex_destroy(mutex) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to thread_mutex_destroy().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_mutex_lock(thread_mutex_t* mutex) { if (pthread_mutex_lock(mutex) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_mutex_lock().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_mutex_unlock(thread_mutex_t* mutex) { if (pthread_mutex_unlock(mutex) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_mutex_unlock().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_cond_init(thread_cond_t* cond) { if (pthread_cond_init(cond, 0) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_cond_init().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_cond_destroy(thread_cond_t* cond) { if (pthread_cond_destroy(cond) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_cond_destroy().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_cond_signal(thread_cond_t* cond) { if (pthread_cond_signal(cond) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_cond_signal().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_cond_broadcast(thread_cond_t* cond) { if (pthread_cond_broadcast(cond) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_cond_broadcast().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } void thread_cond_wait(thread_cond_t* cond, thread_mutex_t* mutex) { if (pthread_cond_wait(cond, mutex) != 0) { /* LCOV_EXCL_START */ fprintf(stderr, "Failed call to pthread_cond_wait().\n"); /* cannot use log_fatal() because it needs locks */ os_abort(); /* LCOV_EXCL_STOP */ } } /** * Implementation note about conditional variables. * * The conditional variables can be signaled inside or outside the mutex, * what is better it's debatable but in general doing that outside the mutex, * reduces the number of context switches. * * But when testing with helgrind and drd, this disallows such tools to * to see the dependency between the signal and the wait. * * To avoid it we signal everything inside the mutex. And we do this in both * test mode (with CHECKER defined) and release mode (CHECKER not defined), * to be on the safe side and avoid any difference in behaviour between test and * release. * * Here some interesting discussion: * * Condvars: signal with mutex locked or not? * http://www.domaigne.com/blog/computing/condvars-signal-with-mutex-locked-or-not/ * * Calling pthread_cond_signal without locking mutex * http://stackoverflow.com/questions/4544234/calling-pthread-cond-signal-without-locking-mutex/4544494#4544494 */ /** * Control when to signal the condition variables. */ int thread_cond_signal_outside = 0; void thread_cond_signal_and_unlock(thread_cond_t* cond, thread_mutex_t* mutex) { if (thread_cond_signal_outside) { /* without the thread checker unlock before signaling, */ /* this reduces the number of context switches */ thread_mutex_unlock(mutex); } thread_cond_signal(cond); if (!thread_cond_signal_outside) { /* with the thread checker unlock after signaling */ /* to make explicit the condition and mutex relation */ thread_mutex_unlock(mutex); } } void thread_cond_broadcast_and_unlock(thread_cond_t* cond, thread_mutex_t* mutex) { if (thread_cond_signal_outside) { /* without the thread checker unlock before signaling, */ /* this reduces the number of context switches */ thread_mutex_unlock(mutex); } thread_cond_broadcast(cond); if (!thread_cond_signal_outside) { /* with the thread checker unlock after signaling */ /* to make explicit the condition and mutex relation */ thread_mutex_unlock(mutex); } } void thread_create(thread_id_t* thread, void* (*func)(void*), void* arg) { if (pthread_create(thread, 0, func, arg) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed call to pthread_create().\n"); os_abort(); /* LCOV_EXCL_STOP */ } } void thread_join(thread_id_t thread, void** retval) { if (pthread_join(thread, retval) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Failed call to pthread_join().\n"); os_abort(); /* LCOV_EXCL_STOP */ } } void thread_yield(void) { #ifdef __MINGW32__ Sleep(0); #else sched_yield(); #endif } #endif int thread_key_create(thread_key_t* key, void (*destructor)(void*)) { return pthread_key_create(key, destructor); } int thread_key_delete(thread_key_t key) { return pthread_key_delete(key); } void* thread_getspecific(thread_key_t key) { return pthread_getspecific(key); } int thread_setspecific(thread_key_t key, void* value) { return pthread_setspecific(key, value); } /****************************************************************************/ /* wnmatch */ /** * Helper function for case-insensitive character comparison */ static inline int char_match(char p, char t) { #ifdef WIN32 return tolower((unsigned char)p) == tolower((unsigned char)t); #else return p == t; #endif } /** * Match character class [...] * Return 0 if NOT matched */ static const char* match_class(const char* p, char t) { int negate = 0; int matched = 0; if (*p == '!' || *p == '^') { negate = 1; ++p; } while (*p && *p != ']') { if (p[1] == '-' && p[2] != ']' && p[2] != 0) { /* range [a-z] */ char start = *p; char end = p[2]; #ifdef WIN32 start = tolower((unsigned char)start); end = tolower((unsigned char)end); t = tolower((unsigned char)t); #endif if (t >= start && t <= end) matched = 1; p += 3; } else { /* single character */ if (char_match(*p, t)) matched = 1; ++p; } } if (*p == ']') ++p; if (negate) matched = !matched; if (!matched) return 0; return p; } int wnmatch_sub(const char* p, const char* t, int match_sub) { char p1 = 0; /* previous char */ while (*p) { char p0 = *p; switch (p0) { case '?' : /* ? matches any single character except / */ if (*t == 0 || *t == '/') return 1; ++p; ++t; break; case '*' : /* check for ** */ if (p[1] == '*') { /* skip the ** */ p += 2; /* munge all * */ while (*p == '*') ++p; /* if its not near a slash, it's like a single * */ if (p1 == '/' || *p == '/') { /* a ** at end matches everything */ if (*p == 0) return 0; /* * In between slashes matches to nothing * * Check for /##/ or ^##/ (^ start of string) * * This is required for: * "/##/file.txt" matching "/file.txt" * "##/file.txt" matching "file.txt" * "x##/file.txt" NOT matching "xfile.txt" */ if (*p == '/' && (p1 == 0 || p1 == '/')) { /* try reducing to nothing */ if (wnmatch_sub(p + 1, t, match_sub) == 0) return 0; /* otherwise / should match in the text */ } /* try matching with 0 or more characters */ while (*t) { if (wnmatch_sub(p, t, match_sub) == 0) return 0; ++t; } /* try matching at the end */ return wnmatch_sub(p, t, match_sub); } } else { /* skip the * */ ++p; } /* a * at end matches rest of segment */ if (*p == 0) { while (*t && *t != '/') ++t; return *t != 0; } /* try matching with 0 or more characters */ while (*t && *t != '/') { if (wnmatch_sub(p, t, match_sub) == 0) return 0; ++t; } /* try matching at the end */ return wnmatch_sub(p, t, match_sub); case '[' : /* character class */ if (*t == 0 || *t == '/') return 1; p = match_class(p + 1, *t); if (!p) return 1; ++t; break; default : /* literal character */ if (*t == 0 || !char_match(*p, *t)) return 1; ++p; ++t; break; } p1 = p0; } /* if we match sub directory */ if (match_sub) { /* match successfully only if we are at a directory border */ return *t != '/'; } else { /* match successfully if we've consumed all text */ return *t != 0; } } snapraid-14.9/cmdline/support.h000066400000000000000000000340121522717156100165570ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __SUPPORT_H #define __SUPPORT_H /****************************************************************************/ /* lock */ /** * Initialize and destroy the locks. */ void lock_init(void); void lock_done(void); /** * Lock used for printf. * * In Windows printf() is not atomic, and multiple threads * will have output interleaved. * * Note that even defining __USE_MINGW_ANSI_STDIO the problem persists. * * See for example: * * Weird output when I use pthread and printf. * http://stackoverflow.com/questions/13190254/weird-output-when-i-use-pthread-and-printf * * This is also required in other OS because we split output in stdlog in * two fprintf calls. */ void lock_msg(void); void unlock_msg(void); /** * Lock used for memory counter. */ void lock_memory(void); void unlock_memory(void); /****************************************************************************/ /* random */ /** * Seed the random pseudo random number generator */ void random_seed(uint64_t seed); /** * Reseed the random pseudo random number generator with the tick count */ void random_reseed(void); /** * Return a pseudo random number of 8 bits */ unsigned char random_u8(void); /** * Return a pseudo random number of 64 bits */ uint64_t random_u64(void); /****************************************************************************/ /* error */ /** * Return if the error is at hardware level */ int is_hw(int err); /** * Log errors with standard messages */ void log_fatal_errno(int err, const char* name); void log_error_errno(int err, const char* name); /****************************************************************************/ /* log */ /** * Pointer to log function. */ typedef void log_ptr(int err, const char* format, ...) __attribute__((format(attribute_printf, 2, 3))); /** * Fatal error messages. * * Messages printed before an early termination. * * These messages go in the log file and in stderr unconditionally. */ void log_fatal(int err, const char* format, ...) __attribute__((format(attribute_printf, 2, 3))); /** * Unexpected error messages. * * Messages reporting error conditions that don't prevent the program to run. * * Some of them could be also serious errors, like "silent errors". * In such case, the summary result is always printed as error, * and we are sure to notify the user in some way. * * These messages go in the log file if specified, otherwise they go in stderr. */ void log_error(int err, const char* format, ...) __attribute__((format(attribute_printf, 2, 3))); /** * Expected error messages, without fallback to stderr. * * These errors are "someway" expected, and then they never go to screen. * For example, when undeleting missing files, the messages for missing files * are not shown. * * These messages go in the log file if specified, otherwise they are lost. */ void log_expected(int err, const char* format, ...) __attribute__((format(attribute_printf, 2, 3))); /** * Tag messages. * * Messages are in tag format, like "tag:entry:...". * * These messages never go on the screen, but only in the log file if specified. * * Note that this function, allows not \n terminated strings. * * These messages are buffered. Use msg_flush() to flush them. */ void log_tag(const char* format, ...) __attribute__((format(attribute_printf, 1, 2))); /** * Flush the log. */ void log_flush(void); /****************************************************************************/ /* message */ /** * Pointer to msg function. */ typedef void msg_ptr(const char* format, ...) __attribute__((format(attribute_printf, 1, 2))); /** * Message levels. * * The levels control the amount of information printed on the screen. * Note that log_fatal(), log_error(), log_expected() and log_tag() are not affected by this option. * * From the most quiet to the most verbose. */ #define MSG_STATUS -3 #define MSG_INFO -2 #define MSG_PROGRESS -1 #define MSG_BAR 0 #define MSG_VERBOSE 1 /** * Selected message level. */ extern int msg_level; /** * State messages. * * Messages that tell what the program is doing or did, but limited to few lines. * They are status information, and summary results. */ void msg_status(const char* format, ...) __attribute__((format(attribute_printf, 1, 2))); /** * Info messages. * * Messages that tell what was done. * Potentially a lot of messages are possible. They can still be on the screen, * as losing them we don't lose information. * * These messages never go in the log file, because there is always a corresponding log_tag(). */ void msg_info(const char* format, ...) __attribute__((format(attribute_printf, 1, 2))); /** * Progress messages. * * Message that tell the progress of program. * * These messages also go in the log file. */ void msg_progress(const char* format, ...) __attribute__((format(attribute_printf, 1, 2))); /** * Progress bar messages. * * Message that show the percentage of the progress. * * These messages never go in the log file. * * These messages are buffered. Use msg_flush() to flush them. */ void msg_bar(const char* format, ...) __attribute__((format(attribute_printf, 1, 2))); /** * Verbose messages. * * Message that tell what is already expected. * * These messages also go in the log file. */ void msg_verbose(const char* format, ...) __attribute__((format(attribute_printf, 1, 2))); /** * Flush the output. */ void msg_flush(void); /****************************************************************************/ /* print */ /** * Print a repeated char. */ void printc(char c, size_t pad); /** * Print a string with right space padding. */ void printr(const char* str, size_t pad); /** * Print a string with left space padding. */ void printl(const char* str, size_t pad); /** * Print a probability with space padding. */ void printp(double v, size_t pad); /****************************************************************************/ /* string */ #define ESC_MAX (PATH_MAX * 2 + 1) #define ESC_POOL_MAX 8 /** * Escape a string for the log. * * Chars ':', '\n', '\r' and '\' are escaped to '\d', '\\n', '\\r' and '\\'. */ const char* esc_tag(const char* str); /** * Get a dynamically allocated buffer of ESC_MAX size from a circular pool. */ char* esc_buf(void); /** * Escape a string for the shell. * * \param buffer Preallocated buffer of ESC_MAX size. */ const char* esc_shell_multi(const char** str_map, unsigned str_max, char* buffer); static inline const char* esc_shell(const char* str, char* buffer) { return esc_shell_multi(&str, 1, buffer); } /** * Polish a string. * * Not printable chars are replaced by spaces. * * Note that the passed string is modified. */ char* strpolish(char* s); /** * Split a string in multiple tokens separated by delimiters. * * Multiple delimiters are grouped together. */ unsigned strsplit(char** split_map, unsigned split_max, char* line, const char* delimiters); /** * Trim spaces from the start and the end */ char* strtrim(char* s); /** * Lower case */ char* strlwr(char* s); /* * Find the first occurrence of 'needle' in 'haystack' only if it * appears as a separate word (space, number or string boundaries). * * Returns a pointer to the beginning of the match, or NULL if not found. */ char* worddigitstr(const char* haystack, const char* needle); /****************************************************************************/ /* path */ /** * Copy a path limiting the size. * Abort if too long. */ void pathcpy(char* dst, size_t size, const char* src); /** * Concatenate a path limiting the size. * Abort if too long. */ void pathcat(char* dst, size_t size, const char* src); /** * Concatenate a path limiting the size knowing the length. * Abort if too long. */ void pathcatl(char* dst, size_t dst_len, size_t size, const char* src); /** * Concatenate a path limiting the size. * Abort if too long. */ void pathcatc(char* dst, size_t size, char c); /** * Import a path limiting the size. * In Windows all the backslash are converted to the C standard of forward slash. * Abort if too long. */ void pathimport(char* dst, size_t size, const char* src); /** * Export a path limiting the size. * In Windows all the C slashes are converted to the Windows backslash. * Abort if too long. */ void pathexport(char* dst, size_t size, const char* src); /** * Print a path. * Abort if too long. */ void pathprint(char* dst, size_t size, const char* format, ...) __attribute__((format(attribute_printf, 3, 4))); /** * Ensure the presence of a terminating slash, if it isn't empty. * Abort if too long. */ void pathslash(char* dst, size_t size); /** * Cut everything after the latest slash. * * If the string doesn't contain any slash, it returns the empty string. */ void pathcut(char* dst); /** * Compare two paths. * In Windows it's case insensitive and assumes \ equal at /. */ int pathcmp(const char* a, const char* b); /** * Check if the root is matching the start of the specified path. * * The root MUST end with a /. * * In Windows it's case insensitive and assumes \ equal at /. */ int path_is_root_of(const char* root, const char* path); /****************************************************************************/ /* file-system */ /** * Create all the ancestor directories if missing. * The file name, after the last /, is ignored. */ int mkancestor(const char* file); /** * Change the modification time of an open file. */ int fmtime(int f, int64_t mtime_sec, int mtime_nsec); /** * Change the modification time of a file or link. * Note that links are NOT deferenced. */ int lmtime(const char* path, int64_t mtime_sec, int mtime_nsec); /****************************************************************************/ /* advise */ /** * Advise modes. */ #define ADVISE_DEFAULT 0 /**< Default mode. */ #define ADVISE_NONE 1 /**< Bare read/write mode. */ #define ADVISE_SEQUENTIAL 2 /**< Sequential mode. */ #define ADVISE_FLUSH 3 /**< Flush mode. */ #define ADVISE_FLUSH_WINDOW 4 /**< Flush mode with a window of 8MB. */ #define ADVISE_DISCARD 5 /**< Discard the cache after every operation. */ #define ADVISE_DISCARD_WINDOW 6 /**< Discard the cache with a window of 8MB. */ #define ADVISE_DIRECT 7 /**< Direct mode. */ #define ADVISE_WINDOW_SIZE (8 * 1024 * 1024) /**< Window size. */ struct advise_struct { int mode; data_off_t dirty_begin; data_off_t dirty_end; }; void advise_init(struct advise_struct* advise, int mode); int advise_flags(struct advise_struct* advise); int advise_open(struct advise_struct* advise, int f); int advise_write(struct advise_struct* advise, int f, data_off_t offset, data_off_t size); int advise_read(struct advise_struct* advise, int f, data_off_t offset, data_off_t size); void advise_close(struct advise_struct* advise, int f); /****************************************************************************/ /* memory */ /** * Return the size of the cumulative allocated memory. */ size_t malloc_counter_get(void); /** * Safe malloc. * If no memory is available, it aborts. */ void* malloc_nofail(size_t size); /** * Safe cmalloc. * If no memory is available, it aborts. */ void* calloc_nofail(size_t count, size_t size); /** * Safe strdup. * If no memory is available, it aborts. */ char* strdup_nofail(const char* str); /** * Helper for printing an error about a failed allocation. */ void malloc_fail(size_t size); /****************************************************************************/ /* smartctl */ /** * Read smartctl attributes from a stream. * Return 0 on success. */ int smartctl_attribute(FILE* f, const char* file, const char* name, struct smart_attr* smart, uint64_t* info, char* serial, char* family, char* model, char* interf); /** * Flush smartctl output from a stream. */ int smartctl_flush(FILE* f, const char* file, const char* name); /** * Extract the temperature from the SMART info. * Return -1 if missing */ int smart_temp(devinfo_t* devinfo); /****************************************************************************/ /* thread */ #if HAVE_THREAD /** * Control when to signal the condition variables. * * Default is inside the mutex. * * Ensure to change that before starting any thread. */ extern int thread_cond_signal_outside; /** * Thread wrappers to handle error conditions. */ void thread_mutex_init(thread_mutex_t* mutex); void thread_mutex_destroy(thread_mutex_t* mutex); void thread_mutex_lock(thread_mutex_t* mutex); void thread_mutex_unlock(thread_mutex_t* mutex); void thread_cond_init(thread_cond_t* cond); void thread_cond_destroy(thread_cond_t* cond); void thread_cond_signal(thread_cond_t* cond); void thread_cond_broadcast(thread_cond_t* cond); void thread_cond_wait(thread_cond_t* cond, thread_mutex_t* mutex); void thread_cond_signal_and_unlock(thread_cond_t* cond, thread_mutex_t* mutex); void thread_cond_broadcast_and_unlock(thread_cond_t* cond, thread_mutex_t* mutex); void thread_create(thread_id_t* thread, void* (*func)(void*), void* arg); void thread_join(thread_id_t thread, void** retval); void thread_yield(void); int thread_key_create(thread_key_t* key, void (*destructor)(void*)); int thread_key_delete(thread_key_t key); void* thread_getspecific(thread_key_t key); int thread_setspecific(thread_key_t key, void* value); #endif /****************************************************************************/ /* match */ /* * Wild match function. * * If match_sub is !=0, it matches sub directory. Specifically it matches if the * string "t" is not fully consumed and the next character to consume is a /. * * - ? matches any single character except / * - * matches any sequence of characters except / * - ** (nearby a /) matches everything including / * - ** (not near a /) like * * - ##/ reduces to nothing in addition to the normal matching of ** (using # instead of * to not mess the C comment) * - [...] matches character classes with support for ranges and negation lile [!...] or [^...], except / * * \return 0 if it matches */ int wnmatch_sub(const char* p, const char* t, int match_sub); static inline int wnmatch(const char* p, const char* t) { return wnmatch_sub(p, t, 0); } #endif snapraid-14.9/cmdline/sync.c000066400000000000000000001421741522717156100160230ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "elem.h" #include "state.h" #include "parity.h" #include "handle.h" #include "io.h" #include "raid/raid.h" /****************************************************************************/ /* hash */ static const char* es(int err) { if (is_hw(err)) return "error_io"; else return "error"; } static int state_hash_process(struct snapraid_state* state, block_off_t blockstart, block_off_t blockmax, int* skip_sync) { struct snapraid_handle* handle; unsigned diskmax; block_off_t blockcur; unsigned j; void* buffer; void* buffer_alloc; data_off_t countsize; block_off_t countpos; block_off_t countmax; int ret; unsigned soft_error; unsigned silent_error; unsigned io_error; /* maps the disks to handles */ handle = handle_mapping(state, &diskmax); /* buffer for reading */ buffer = malloc_nofail_direct(state->block_size, &buffer_alloc); if (!state->opt.skip_self) mtest_vector(1, state->block_size, &buffer); soft_error = 0; silent_error = 0; io_error = 0; /* first count the number of blocks to process */ countmax = 0; for (j = 0; j < diskmax; ++j) { struct snapraid_disk* disk = handle[j].disk; /* if no disk, nothing to check */ if (!disk) continue; for (blockcur = blockstart; blockcur < blockmax; ++blockcur) { struct snapraid_block* block; unsigned block_state; block = fs_par2block_find(disk, blockcur); /* get the state of the block */ block_state = block_state_get(block); /* process REP and CHG blocks */ if (block_state != BLOCK_STATE_REP && block_state != BLOCK_STATE_CHG) continue; ++countmax; } } /* drop until now */ state_usage_waste(state); countsize = 0; countpos = 0; blockcur = blockstart; int alert = state_progress_begin(state, blockstart, blockmax, countmax); if (alert > 0) goto end; if (alert < 0) goto bail; for (j = 0; j < diskmax; ++j) { struct snapraid_disk* disk = handle[j].disk; /* if no disk, nothing to check */ if (!disk) continue; for (blockcur = blockstart; blockcur < blockmax; ++blockcur) { snapraid_info info; int rehash; struct snapraid_block* block; int read_size; unsigned char hash[HASH_MAX]; unsigned block_state; struct snapraid_file* file; block_off_t file_pos; block = fs_par2block_find(disk, blockcur); /* get the state of the block */ block_state = block_state_get(block); /* process REP and CHG blocks */ if (block_state != BLOCK_STATE_REP && block_state != BLOCK_STATE_CHG) continue; /* get the file of this block */ file = fs_par2file_get(disk, blockcur, &file_pos); /* get block specific info */ info = info_get(&state->infoarr, blockcur); /* if we have to use the old hash */ rehash = info_get_rehash(info); /* until now is misc */ state_usage_misc(state); /* if the file is different than the current one, close it */ if (handle[j].file != 0 && handle[j].file != file) { /* keep a pointer at the file we are going to close for error reporting */ struct snapraid_file* report = handle[j].file; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ /* This one is really an unexpected error, because we are only reading */ /* and closing a descriptor should never fail */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(report->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", blockcur); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } goto bail; /* LCOV_EXCL_STOP */ } } ret = handle_open(&handle[j], file, state->file_mode, 0); if (ret == -1) { log_tag("%s:%u:%s:%s: Open error. %s.\n", es(errno), blockcur, disk->name, esc_tag(file->sub), strerror(errno)); if (errno == ENOENT) { log_error_errno(errno, disk->name); ++soft_error; /* if the file is missing, it means that it was removed during sync */ /* this isn't a serious error, so we skip this block, and continue with others */ continue; } if (errno == EACCES) { log_error_errno(errno, disk->name); ++soft_error; /* this isn't a serious error, so we skip this block, and continue with others */ continue; } /* LCOV_EXCL_START */ log_fatal_errno(errno, disk->name); if (is_hw(errno)) { log_fatal(errno, "Stopping at block %u\n", blockcur); ++io_error; } else { log_fatal(errno, "Stopping to allow recovery. Try with 'snapraid check -f /%s'\n", fmt_poll(disk, file->sub)); ++soft_error; } goto bail; /* LCOV_EXCL_STOP */ } /* check if the file is changed */ if (handle[j].st.st_size != file->size || handle[j].st.st_mtime != file->mtime_sec || STAT_NSEC(&handle[j].st) != file->mtime_nsec || handle[j].st.st_ino != file->inode ) { if (handle[j].st.st_size != file->size) { log_tag("error:%u:%s:%s: Unexpected size change\n", blockcur, disk->name, esc_tag(file->sub)); log_error(ESOFT, "Unexpected size change at file '%s' from %" PRIu64 " to %" PRIu64 ".\n", handle[j].path, file->size, (uint64_t)handle[j].st.st_size); } else if (handle[j].st.st_mtime != file->mtime_sec || STAT_NSEC(&handle[j].st) != file->mtime_nsec) { log_tag("error:%u:%s:%s: Unexpected time change\n", blockcur, disk->name, esc_tag(file->sub)); log_error(ESOFT, "Unexpected time change at file '%s' from %" PRIu64 ".%d to %" PRIu64 ".%d.\n", handle[j].path, file->mtime_sec, file->mtime_nsec, (uint64_t)handle[j].st.st_mtime, STAT_NSEC(&handle[j].st)); } else { log_tag("error:%u:%s:%s: Unexpected inode change\n", blockcur, disk->name, esc_tag(file->sub)); log_error(ESOFT, "Unexpected inode change from %" PRIu64 " to %" PRIu64 " at file '%s'.\n", file->inode, (uint64_t)handle[j].st.st_ino, handle[j].path); } log_error_errno(ENOENT, disk->name); /* same message for ENOENT */ ++soft_error; /* if the file is changed, it means that it was modified during sync */ /* this isn't a serious error, so we skip this block, and continue with others */ continue; } read_size = handle_read(&handle[j], file_pos, buffer, state->block_size, 0); if (read_size == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Read error at position %u. %s.\n", es(errno), blockcur, disk->name, esc_tag(file->sub), file_pos, strerror(errno)); log_fatal_errno(errno, disk->name); if (is_hw(errno)) { log_fatal(errno, "Stopping at block %u\n", blockcur); ++io_error; } else { log_fatal(errno, "Stopping to allow recovery. Try with 'snapraid check -f /%s'\n", fmt_poll(disk, file->sub)); ++soft_error; } goto bail; /* LCOV_EXCL_STOP */ } /* until now is disk */ state_usage_disk(state, handle, &j, 1); state_usage_file(state, disk, file); countsize += read_size; /* now compute the hash */ if (rehash) { memhash(state->prevhash, state->prevhashseed, hash, buffer, read_size); } else { memhash(state->hash, state->hashseed, hash, buffer, read_size); } /* until now is hash */ state_usage_hash(state); if (block_state == BLOCK_STATE_REP) { /* compare the hash */ if (memcmp(hash, block->hash, BLOCK_HASH_SIZE) != 0) { log_tag("error_data:%u:%s:%s: Unexpected data change\n", blockcur, disk->name, esc_tag(file->sub)); log_error(EDATA, "Data change at file '%s' at position '%u'\n", handle[j].path, file_pos); log_error(EDATA, "WARNING! Unexpected data modification of a file without parity!\n"); if (file_flag_has(file, FILE_IS_COPY)) { log_error(EDATA, "This file was detected as a copy of another file with the same name, size,\n"); log_error(EDATA, "and timestamp, but the file data isn't matching the assumed copy.\n"); log_error(EDATA, "If this is a false positive, and the files are expected to be different,\n"); log_error(EDATA, "you can 'sync' anyway using 'snapraid --force-nocopy sync'\n"); } else { log_error(EDATA, "Try removing the file from the array and rerun the 'sync' command!\n"); } ++silent_error; continue; } } else { /* the only other case is BLOCK_STATE_CHG */ assert(block_state == BLOCK_STATE_CHG); /* copy the hash in the block */ memcpy(block->hash, hash, BLOCK_HASH_SIZE); /* and mark the block as hashed */ block_state_set(block, BLOCK_STATE_REP); /* mark the state as needing write */ state->need_write = 1; } /* count the number of processed block */ ++countpos; /* progress */ if (state_progress(state, 0, blockcur, countpos, countmax, countsize)) { /* LCOV_EXCL_START */ *skip_sync = 1; /* avoid to run the next sync due user interruption */ break; /* LCOV_EXCL_STOP */ } } /* close the last file in the disk */ if (handle[j].file != 0) { /* keep a pointer at the file we are going to close for error reporting */ struct snapraid_file* report = handle[j].file; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ /* This one is really an unexpected error, because we are only reading */ /* and closing a descriptor should never fail */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockmax, disk->name, esc_tag(report->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", blockmax); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } goto bail; /* LCOV_EXCL_STOP */ } } } end: state_progress_end(state, countpos, countmax, countsize, "Nothing to hash.\n"); /* note that at this point no io_error is possible */ /* because at the first one we bail out */ assert(io_error == 0); if (soft_error || io_error || silent_error) { msg_status("\n"); msg_status("%8u soft errors\n", soft_error); msg_status("%8u io errors\n", io_error); msg_status("%8u data errors\n", silent_error); } else { msg_status("Everything OK\n"); } if (soft_error) log_fatal(ESOFT, "WARNING! Unexpected soft errors!\n"); log_tag("hash_summary:error_soft:%u\n", soft_error); /* proceed without bailing out */ goto finish; bail: /* close files left open */ for (j = 0; j < diskmax; ++j) { struct snapraid_file* file = handle[j].file; struct snapraid_disk* disk = handle[j].disk; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } finish: free(handle); free(buffer_alloc); if (soft_error + io_error + silent_error != 0) return -1; if (alert < 0) return -1; return 0; } /****************************************************************************/ /* sync */ /** * Sync plan to use. */ struct snapraid_plan { unsigned handle_max; struct snapraid_handle* handle_map; int force_full; }; /** * A block that failed the hash check, or that was deleted. */ struct failed_struct { unsigned index; /**< Index of the failed block. */ unsigned size; /**< Size of the block. */ struct snapraid_block* block; /**< The failed block, or BLOCK_DELETED for a deleted block */ }; /** * Comparison function for sorting by index. */ int failed_compare_by_index(const void* void_a, const void* void_b) { const struct failed_struct* a = void_a; const struct failed_struct* b = void_b; if (a->index < b->index) return -1; if (a->index > b->index) return 1; return 0; } /** * Buffer for storing the new hashes. */ struct snapraid_rehash { unsigned char hash[HASH_MAX]; struct snapraid_block* block; }; /** * Check if we have to process the specified block index ::i. */ static int block_is_enabled(struct snapraid_plan* plan, block_off_t i) { unsigned j; int one_invalid; int one_valid; /* for each disk */ one_invalid = 0; one_valid = 0; for (j = 0; j < plan->handle_max; ++j) { struct snapraid_block* block; struct snapraid_disk* disk = plan->handle_map[j].disk; /* if no disk, nothing to check */ if (!disk) continue; block = fs_par2block_find(disk, i); if (block_has_file(block)) one_valid = 1; if (block_has_invalid_parity(block) || plan->force_full) one_invalid = 1; } /* if none valid or none invalid, we don't need to update */ if (!one_invalid || !one_valid) return 0; return 1; } static void sync_data_reader(struct snapraid_worker* worker, struct snapraid_task* task) { struct snapraid_io* io = worker->io; struct snapraid_state* state = io->state; struct snapraid_handle* handle = worker->handle; struct snapraid_disk* disk = handle->disk; block_off_t blockcur = task->position; unsigned char* buffer = task->buffer; int ret; /* if the disk position is not used */ if (!disk) { /* use an empty block */ memset(buffer, 0, state->block_size); task->state = TASK_STATE_DONE; return; } /* get the block */ task->block = fs_par2block_find(disk, blockcur); /* if the block has no file, meaning that it's EMPTY or DELETED, */ /* it doesn't participate in the new parity computation */ if (!block_has_file(task->block)) { /* use an empty block */ memset(buffer, 0, state->block_size); task->state = TASK_STATE_DONE; return; } /* get the file of this block */ task->file = fs_par2file_get(disk, blockcur, &task->file_pos); /* if the file is different than the current one, close it */ if (handle->file != 0 && handle->file != task->file) { /* keep a pointer at the file we are going to close for error reporting */ struct snapraid_file* report = handle->file; ret = handle_close(handle); if (ret == -1) { /* LCOV_EXCL_START */ /* This one is really an unexpected error, because we are only reading */ /* and closing a descriptor should never fail */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(report->sub), strerror(errno)); log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping at block %u\n", blockcur); if (is_hw(errno)) { task->state = TASK_STATE_IOERROR; } else { task->state = TASK_STATE_ERROR; } return; /* LCOV_EXCL_STOP */ } } ret = handle_open(handle, task->file, state->file_mode, 0); if (ret == -1) { log_tag("%s:%u:%s:%s: Open error. %s.\n", es(errno), blockcur, disk->name, esc_tag(task->file->sub), strerror(errno)); if (errno == ENOENT) { log_error_errno(errno, disk->name); /* if the file is missing, it means that it was removed during sync */ /* this isn't a serious error, so we skip this block, and continue with others */ task->state = TASK_STATE_ERROR_CONTINUE; return; } if (errno == EACCES) { log_error_errno(errno, disk->name); /* this isn't a serious error, so we skip this block, and continue with others */ task->state = TASK_STATE_ERROR_CONTINUE; return; } /* LCOV_EXCL_START */ log_fatal_errno(errno, disk->name); if (is_hw(errno)) { log_fatal(errno, "Stopping at block %u\n", blockcur); task->state = TASK_STATE_IOERROR; } else { log_fatal(errno, "Stopping to allow recovery. Try with 'snapraid check -f /%s'\n", fmt_poll(disk, task->file->sub)); task->state = TASK_STATE_ERROR; } return; /* LCOV_EXCL_STOP */ } /* check if the file is changed */ if (handle->st.st_size != task->file->size || handle->st.st_mtime != task->file->mtime_sec || STAT_NSEC(&handle->st) != task->file->mtime_nsec || handle->st.st_ino != task->file->inode ) { log_tag("error:%u:%s:%s: Unexpected attribute change\n", blockcur, disk->name, esc_tag(task->file->sub)); if (handle->st.st_size != task->file->size) { log_error(ESOFT, "Unexpected size change at file '%s' from %" PRIu64 " to %" PRIu64 ".\n", handle->path, task->file->size, (uint64_t)handle->st.st_size); } else if (handle->st.st_mtime != task->file->mtime_sec || STAT_NSEC(&handle->st) != task->file->mtime_nsec) { log_error(ESOFT, "Unexpected time change at file '%s' from %" PRIu64 ".%d to %" PRIu64 ".%d.\n", handle->path, task->file->mtime_sec, task->file->mtime_nsec, (uint64_t)handle->st.st_mtime, STAT_NSEC(&handle->st)); } else { log_error(ESOFT, "Unexpected inode change from %" PRIu64 " to %" PRIu64 " at file '%s'.\n", task->file->inode, (uint64_t)handle->st.st_ino, handle->path); } log_error_errno(ENOENT, disk->name); /* same message for ENOENT */ /* if the file is changed, it means that it was modified during sync */ /* this isn't a serious error, so we skip this block, and continue with others */ task->state = TASK_STATE_ERROR_CONTINUE; return; } task->read_size = handle_read(handle, task->file_pos, buffer, state->block_size, 0); if (task->read_size == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Read error at position %u. %s.\n", es(errno), blockcur, disk->name, esc_tag(task->file->sub), task->file_pos, strerror(errno)); if (is_hw(errno)) { log_fatal_errno(errno, disk->name); /* continue until the error limit is reached */ task->state = TASK_STATE_IOERROR_CONTINUE; } else { log_fatal_errno(errno, disk->name); log_fatal(errno, "Stopping to allow recovery. Try with 'snapraid check -f /%s'\n", fmt_poll(disk, task->file->sub)); task->state = TASK_STATE_ERROR; } return; /* LCOV_EXCL_STOP */ } /* store the path of the opened file */ pathcpy(task->path, sizeof(task->path), handle->path); task->state = TASK_STATE_DONE; } static void sync_parity_writer(struct snapraid_worker* worker, struct snapraid_task* task) { struct snapraid_io* io = worker->io; struct snapraid_state* state = io->state; struct snapraid_parity_handle* parity_handle = worker->parity_handle; unsigned level = parity_handle->level; block_off_t blockcur = task->position; unsigned char* buffer = task->buffer; int ret; /* write parity */ ret = parity_write(parity_handle, blockcur, buffer, state->block_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Write error. %s.\n", es(errno), blockcur, lev_config_name(level), strerror(errno)); if (is_hw(errno)) { log_fatal_errno(errno, lev_config_name(level)); /* continue until the error limit is reached */ task->state = TASK_STATE_IOERROR_CONTINUE; } else { log_fatal_errno(errno, lev_config_name(level)); log_fatal(errno, "Stopping at block %u\n", blockcur); task->state = TASK_STATE_ERROR; } return; /* LCOV_EXCL_STOP */ } task->state = TASK_STATE_DONE; } static int state_sync_process(struct snapraid_state* state, struct snapraid_parity_handle* parity_handle, block_off_t blockstart, block_off_t blockmax) { struct snapraid_io io; struct snapraid_plan plan; struct snapraid_handle* handle; void* rehandle_alloc; struct snapraid_rehash* rehandle; unsigned diskmax; block_off_t blockcur; unsigned j; void* zero_alloc; void** zero; void* copy_alloc; void** copy; unsigned buffermax; data_off_t countsize; block_off_t countpos; block_off_t countmax; block_off_t autosavedone; block_off_t autosavelimit; block_off_t autosavemissing; int ret; unsigned soft_error; unsigned silent_error; unsigned io_error; time_t now; struct failed_struct* failed; int* failed_map; unsigned l; unsigned* waiting_map; unsigned waiting_mac; bit_vect_t* block_enabled; /* the sync process assumes that all the hashes are correct */ /* including the ones from CHG and DELETED blocks */ assert(state->clear_past_hash != 0); /* get the present time */ now = time(0); /* maps the disks to handles */ handle = handle_mapping(state, &diskmax); /* rehash buffers */ rehandle = malloc_nofail_align(diskmax * sizeof(struct snapraid_rehash), &rehandle_alloc); /* we need 1 * data + 1 * parity */ buffermax = diskmax + state->level; /* initialize the io threads */ io_init(&io, state, state->opt.io_cache, buffermax, sync_data_reader, handle, diskmax, 0, sync_parity_writer, parity_handle, state->level); /* allocate the copy buffer */ copy = malloc_nofail_vector_align(diskmax, diskmax, state->block_size, ©_alloc); /* allocate and fill the zero buffer */ zero = malloc_nofail_align(state->block_size, &zero_alloc); memset(zero, 0, state->block_size); raid_zero(zero); failed = malloc_nofail(diskmax * sizeof(struct failed_struct)); failed_map = malloc_nofail(diskmax * sizeof(unsigned)); /* possibly waiting disks */ waiting_mac = diskmax > RAID_PARITY_MAX ? diskmax : RAID_PARITY_MAX; waiting_map = malloc_nofail(waiting_mac * sizeof(unsigned)); soft_error = 0; silent_error = 0; io_error = 0; msg_progress("Selecting...\n"); /* first count the number of blocks to process */ countmax = 0; plan.handle_max = diskmax; plan.handle_map = handle; plan.force_full = state->opt.force_full; block_enabled = calloc_nofail(1, bit_vect_size(blockmax)); /* preinitialize to 0 */ for (blockcur = blockstart; blockcur < blockmax; ++blockcur) { if (!block_is_enabled(&plan, blockcur)) continue; bit_vect_set(block_enabled, blockcur); ++countmax; } /* compute the autosave size for all disk, even if not read */ /* this makes sense because the speed should be almost the same */ /* if the disks are read in parallel */ autosavelimit = state->autosave / (diskmax * state->block_size); autosavemissing = countmax; /* blocks to do */ autosavedone = 0; /* blocks done */ /* drop until now */ state_usage_waste(state); countsize = 0; countpos = 0; blockcur = blockstart; msg_progress("Syncing...\n"); /* start all the worker threads */ io_start(&io, blockstart, blockmax, block_enabled); int alert = state_progress_begin(state, blockstart, blockmax, countmax); if (alert > 0) goto end; if (alert < 0) goto bail; while (1) { unsigned failed_count; int error_on_this_block; int silent_error_on_this_block; int io_error_on_this_block; int fixed_error_on_this_block; int parity_needs_to_be_updated; int parity_going_to_be_updated; snapraid_info info; int rehash; void** buffer; int writer_error[IO_WRITER_ERROR_MAX]; /* go to the next block */ blockcur = io_read_next(&io, &buffer); if (blockcur >= blockmax) break; /* until now is scheduling */ state_usage_sched(state); /* one more block processed for autosave */ ++autosavedone; --autosavemissing; /* by default process the block, and skip it if something goes wrong */ error_on_this_block = 0; silent_error_on_this_block = 0; io_error_on_this_block = 0; fixed_error_on_this_block = 0; /* keep track of the number of failed blocks */ failed_count = 0; /* get block specific info */ info = info_get(&state->infoarr, blockcur); /* if we have to use the old hash */ rehash = info_get_rehash(info); /* if the parity requires to be updated */ /* It could happens that all the blocks are EMPTY/BLK and CHG but with the hash */ /* still matching because the specific CHG block was not modified. */ /* In such case, we can avoid to update parity, because it would be the same as before */ /* Note that CHG/DELETED blocks already present in the content file loaded */ /* have the hash cleared (::clear_past_hash flag), and then they won't never match the hash. */ /* We are treating only CHG blocks created at runtime. */ parity_needs_to_be_updated = state->opt.force_full || state->opt.force_parity_update; /* if the parity is going to be updated */ parity_going_to_be_updated = 0; /* if the block is marked as bad, we force the parity update */ /* because the bad block may be the result of a wrong parity */ if (info_get_bad(info)) parity_needs_to_be_updated = 1; /* for each disk, process the block */ for (j = 0; j < diskmax; ++j) { struct snapraid_task* task; int read_size; unsigned char hash[HASH_MAX]; struct snapraid_block* block; unsigned block_state; struct snapraid_disk* disk; struct snapraid_file* file; block_off_t file_pos; unsigned diskcur; /* until now is misc */ state_usage_misc(state); task = io_data_read(&io, &diskcur, waiting_map, &waiting_mac); /* until now is disk */ state_usage_disk(state, handle, waiting_map, waiting_mac); /* get the results */ disk = task->disk; block = task->block; file = task->file; file_pos = task->file_pos; read_size = task->read_size; /* by default no rehash in case of "continue" */ rehandle[diskcur].block = 0; /* if the disk position is not used */ if (!disk) continue; state_usage_file(state, disk, file); /* get the state of the block */ block_state = block_state_get(block); /* if the block has invalid parity, */ /* we have to take care of it in case of recover */ if (block_has_invalid_parity(block)) { /* store it in the failed set, because */ /* the parity may be still computed with the previous content */ failed[failed_count].index = diskcur; failed[failed_count].size = state->block_size; failed[failed_count].block = block; ++failed_count; /* if the block has invalid parity, we have to update the parity */ /* to include this block change */ /* This also apply to CHG blocks, but we are going to handle */ /* later this case to do the updates only if really needed */ if (block_state != BLOCK_STATE_CHG) parity_needs_to_be_updated = 1; /* note that DELETE blocks are skipped in the next check */ /* and we have to store them in the failed blocks */ /* before skipping */ /* follow */ } /* if the block is not used */ if (!block_has_file(block)) continue; /* handle error conditions */ if (task->state == TASK_STATE_IOERROR) { /* LCOV_EXCL_START */ ++io_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR) { /* LCOV_EXCL_START */ ++soft_error; goto bail; /* LCOV_EXCL_STOP */ } if (task->state == TASK_STATE_ERROR_CONTINUE) { ++soft_error; error_on_this_block = 1; continue; } if (task->state == TASK_STATE_IOERROR_CONTINUE) { ++io_error; if (io_error >= state->opt.io_error_limit) { /* LCOV_EXCL_START */ log_fatal(EIO, "DANGER! Too many input/output errors in the %s disk. It isn't possible to continue.\n", disk->dir); log_fatal(EIO, "Stopping at block %u\n", blockcur); goto bail; /* LCOV_EXCL_STOP */ } /* otherwise continue */ io_error_on_this_block = 1; continue; } if (task->state != TASK_STATE_DONE) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in task state\n"); os_abort(); /* LCOV_EXCL_STOP */ } countsize += read_size; /* now compute the hash */ if (rehash) { memhash(state->prevhash, state->prevhashseed, hash, buffer[diskcur], read_size); /* compute the new hash, and store it */ rehandle[diskcur].block = block; memhash(state->hash, state->hashseed, rehandle[diskcur].hash, buffer[diskcur], read_size); } else { memhash(state->hash, state->hashseed, hash, buffer[diskcur], read_size); } /* until now is hash */ state_usage_hash(state); if (block_has_updated_hash(block)) { /* compare the hash */ if (memcmp(hash, block->hash, BLOCK_HASH_SIZE) != 0) { /* if the file has invalid parity, it's a REP changed during the sync */ if (block_has_invalid_parity(block)) { log_tag("error:%u:%s:%s: Unexpected data change\n", blockcur, disk->name, esc_tag(file->sub)); log_error(ESOFT, "Data change at file '%s' at position '%u'\n", task->path, file_pos); log_error(ESOFT, "WARNING! Unexpected data modification of a file without parity!\n"); if (file_flag_has(file, FILE_IS_COPY)) { log_error(ESOFT, "This file was detected as a copy of another file with the same name, size,\n"); log_error(ESOFT, "and timestamp, but the file data isn't matching the assumed copy.\n"); log_error(ESOFT, "If this is a false positive, and the files are expected to be different,\n"); log_error(ESOFT, "you can 'sync' anyway using 'snapraid --force-nocopy sync'\n"); } else { log_error(ESOFT, "Try removing the file from the array and rerun the 'sync' command!\n"); } ++soft_error; /* if the file is changed, it means that it was modified during sync */ /* this isn't a serious error, so we skip this block, and continue with others */ error_on_this_block = 1; continue; } else { /* otherwise it's a BLK with silent error */ unsigned diff = memdiff(hash, block->hash, BLOCK_HASH_SIZE); log_tag("error_data:%u:%s:%s: Data error at position %u, diff hash bits %u/%u\n", blockcur, disk->name, esc_tag(file->sub), file_pos, diff, BLOCK_HASH_SIZE * 8); log_error(EDATA, "Data error in file '%s' at position '%u', diff hash bits %u/%u\n", task->path, file_pos, diff, BLOCK_HASH_SIZE * 8); /* save the failed block for the fix */ failed[failed_count].index = diskcur; failed[failed_count].size = read_size; failed[failed_count].block = block; ++failed_count; /* silent errors are very rare, and are not a signal that a disk */ /* is going to fail. So, we just continue marking the block as bad */ /* just like in scrub */ ++silent_error; silent_error_on_this_block = 1; continue; } } } else { /* if until now the parity doesn't need to be updated */ if (!parity_needs_to_be_updated) { /* for sure it's a CHG block, because EMPTY are processed before with "continue" */ /* and BLK and REP have "block_has_updated_hash()" as 1, and all the others */ /* have "parity_needs_to_be_updated" already at 1 */ assert(block_state_get(block) == BLOCK_STATE_CHG); /* if the hash represents the data unequivocally */ if (hash_is_unique(block->hash)) { /* check if the hash is changed */ if (memcmp(hash, block->hash, BLOCK_HASH_SIZE) != 0) { /* the block is different, and we must update parity */ parity_needs_to_be_updated = 1; } } else { /* if the hash is already invalid, we update parity */ parity_needs_to_be_updated = 1; } } /* copy the hash in the block, but doesn't mark the block as hashed */ /* this allow in case of skipped block to do not save the failed computation */ memcpy(block->hash, hash, BLOCK_HASH_SIZE); /* note that in case of rehash, this is the wrong hash, */ /* but it will be overwritten later */ } } /* if we have only silent errors we can try to fix them on-the-fly */ /* note the fix is not written to disk, but used only to */ /* compute the new parity */ if (!error_on_this_block && !io_error_on_this_block && silent_error_on_this_block) { unsigned failed_mac; int something_to_recover = 0; /* sort the failed vector */ /* because with threads it may be in any order */ /* but RAID requires the indexes to be sorted */ qsort(failed, failed_count, sizeof(failed[0]), failed_compare_by_index); /* setup the blocks to recover */ failed_mac = 0; for (j = 0; j < failed_count; ++j) { unsigned char* block_buffer = buffer[failed[j].index]; unsigned char* block_copy = copy[failed[j].index]; unsigned block_state = block_state_get(failed[j].block); /* we try to recover only if at least one BLK is present */ if (block_state == BLOCK_STATE_BLK) something_to_recover = 1; /* save a copy of the content just read */ /* that it's going to be overwritten by the recovering function */ memcpy(block_copy, block_buffer, state->block_size); if (block_state == BLOCK_STATE_CHG && hash_is_zero(failed[j].block->hash) ) { /* if the block was filled with 0, restore this state */ /* and avoid to recover it */ memset(block_buffer, 0, state->block_size); } else { /* if we have too many failures, we cannot recover */ if (failed_mac >= state->level) break; /* otherwise it has to be recovered */ failed_map[failed_mac++] = failed[j].index; } } /* if we have something to recover and enough parity */ if (something_to_recover && j == failed_count) { /* until now is misc */ state_usage_misc(state); /* read the parity */ /* we are sure that parity exists because */ /* we have at least one BLK block */ for (l = 0; l < state->level; ++l) { ret = parity_read(&parity_handle[l], blockcur, buffer[diskmax + l], state->block_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Read error. %s.\n", es(errno), blockcur, lev_config_name(l), strerror(errno)); if (is_hw(errno)) { log_fatal_errno(errno, lev_config_name(l)); if (io_error >= state->opt.io_error_limit) { log_fatal(errno, "DANGER! Too many input/output errors in the %s disk. It isn't possible to continue.\n", lev_config_name(l)); log_fatal(errno, "Stopping at block %u\n", blockcur); ++io_error; goto bail; } ++io_error; io_error_on_this_block = 1; continue; } log_fatal_errno(errno, lev_config_name(l)); log_fatal(errno, "Stopping at block %u\n", blockcur); ++soft_error; goto bail; /* LCOV_EXCL_STOP */ } /* until now is parity */ state_usage_parity(state, &l, 1); } /* if no error in parity read */ if (!io_error_on_this_block) { /* try to fix the data */ /* note that this is a simple fix algorithm, that doesn't take into */ /* account the case of a wrong parity */ /* only 'fix' supports the most advanced fixing */ raid_rec(failed_mac, failed_map, diskmax, state->level, state->block_size, buffer); /* until now is raid */ state_usage_raid(state); /* check the result and prepare the data */ for (j = 0; j < failed_count; ++j) { unsigned char hash[HASH_MAX]; unsigned char* block_buffer = buffer[failed[j].index]; unsigned char* block_copy = copy[failed[j].index]; unsigned block_state = block_state_get(failed[j].block); if (block_state == BLOCK_STATE_BLK) { unsigned size = failed[j].size; /* compute the hash of the recovered block */ if (rehash) { memhash(state->prevhash, state->prevhashseed, hash, block_buffer, size); } else { memhash(state->hash, state->hashseed, hash, block_buffer, size); } /* until now is hash */ state_usage_hash(state); /* if the hash doesn't match */ if (memcmp(hash, failed[j].block->hash, BLOCK_HASH_SIZE) != 0) { /* we have not recovered */ break; } /* pad with 0 if needed */ if (size < state->block_size) memset(block_buffer + size, 0, state->block_size - size); } else { /* otherwise restore the content */ /* because we are not interested in the old state */ /* that it's recovered for CHG, REP and DELETED blocks */ memcpy(block_buffer, block_copy, state->block_size); } } /* if all is processed, we have fixed it */ if (j == failed_count) fixed_error_on_this_block = 1; } } } /* if we have read all the data required and it's correct, proceed with the parity */ if (!error_on_this_block && !io_error_on_this_block && (!silent_error_on_this_block || fixed_error_on_this_block) ) { /* update the parity only if really needed */ if (parity_needs_to_be_updated) { /* compute the parity */ raid_gen(diskmax, state->level, state->block_size, buffer); /* until now is raid */ state_usage_raid(state); /* mark that the parity is going to be written */ parity_going_to_be_updated = 1; } /* for each disk, mark the blocks as processed */ for (j = 0; j < diskmax; ++j) { struct snapraid_block* block; if (!handle[j].disk) continue; block = fs_par2block_find(handle[j].disk, blockcur); if (block == BLOCK_NULL) { /* nothing to do */ continue; } /* if it's a deleted block */ if (block_state_get(block) == BLOCK_STATE_DELETED) { /* the parity is now updated without this block, so it's now empty */ fs_deallocate(handle[j].disk, blockcur); continue; } /* now all the blocks have the hash and the parity computed */ block_state_set(block, BLOCK_STATE_BLK); } /* we update the info block only if we really have updated the parity */ /* because otherwise the time/justsynced info would be misleading as we didn't */ /* wrote the parity at this time */ /* we also update the info block only if no silent error was found */ /* because has no sense to refresh the time for data that we know bad */ if (parity_needs_to_be_updated && !silent_error_on_this_block ) { /* if rehash is needed */ if (rehash) { /* store all the new hash already computed */ for (j = 0; j < diskmax; ++j) { if (rehandle[j].block) memcpy(rehandle[j].block->hash, rehandle[j].hash, BLOCK_HASH_SIZE); } } /* update the time info of the block */ /* we are also clearing any previous bad and rehash flag */ info_set(&state->infoarr, blockcur, info_make(now, 0, 0, 1)); } } /* if a silent (even if corrected) or input/output error was found */ /* mark the block as bad to have check/fix to handle it */ /* because our correction is in memory only and not yet written */ if (silent_error_on_this_block || io_error_on_this_block) { /* set the error status keeping the other info */ info_set(&state->infoarr, blockcur, info_set_bad(info)); } /* finally schedule parity write */ /* Note that the calls to io_parity_write() are mandatory */ /* even if the parity doesn't need to be updated */ /* This because we want to keep track of the time usage */ state_usage_misc(state); /* write start */ io_write_preset(&io, blockcur, !parity_going_to_be_updated); /* write the parity */ for (l = 0; l < state->level; ++l) { unsigned levcur; io_parity_write(&io, &levcur, waiting_map, &waiting_mac); /* until now is parity */ state_usage_parity(state, waiting_map, waiting_mac); } /* write finished */ io_write_next(&io, blockcur, !parity_going_to_be_updated, writer_error); /* handle errors reported */ for (j = 0; j < IO_WRITER_ERROR_MAX; ++j) { if (writer_error[j]) { switch (j + IO_WRITER_ERROR_BASE) { case TASK_STATE_IOERROR_CONTINUE : ++io_error; if (io_error >= state->opt.io_error_limit) { /* LCOV_EXCL_START */ log_fatal(EIO, "DANGER! Too many input/output errors in a parity disk. It isn't possible to continue.\n"); log_fatal(EIO, "Stopping at block %u\n", blockcur); goto bail; /* LCOV_EXCL_STOP */ } break; case TASK_STATE_ERROR_CONTINUE : ++soft_error; break; case TASK_STATE_IOERROR : /* LCOV_EXCL_START */ ++io_error; goto bail; /* LCOV_EXCL_STOP */ case TASK_STATE_ERROR : /* LCOV_EXCL_START */ ++soft_error; goto bail; /* LCOV_EXCL_STOP */ } } } /* mark the state as needing write */ state->need_write = 1; /* count the number of processed block */ ++countpos; /* progress */ if (state_progress(state, &io, blockcur, countpos, countmax, countsize)) { /* LCOV_EXCL_START */ break; /* LCOV_EXCL_STOP */ } /* thermal control */ if (state_thermal_alarm(state)) { /* until now is misc */ state_usage_misc(state); state_progress_stop(state); /* before spinning down flush all the caches */ ret = state_flush(state, &io, parity_handle, blockcur); if (ret == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Stopping at block %u\n", blockcur); ++io_error; goto bail; /* LCOV_EXCL_STOP */ } state_thermal_cooldown(state); state_progress_restart(state); /* drop until now */ state_usage_waste(state); } /* autosave */ if ((state->autosave != 0 && autosavedone >= autosavelimit /* if we have reached the limit */ && autosavemissing >= autosavelimit) /* if we have at least a full step to do */ /* or if we have a forced autosave at the specified block */ || (state->opt.force_autosave_at != 0 && state->opt.force_autosave_at == blockcur) ) { autosavedone = 0; /* restart the counter */ /* until now is misc */ state_usage_misc(state); state_progress_stop(state); msg_progress("Autosaving...\n"); /* before writing the new content file we ensure that */ /* the parity is really written flushing the disk cache */ ret = state_flush(state, &io, parity_handle, blockcur); if (ret == -1) { /* LCOV_EXCL_START */ log_fatal(EIO, "Stopping at block %u\n", blockcur); ++io_error; goto bail; /* LCOV_EXCL_STOP */ } /* now we can safely write the content file */ state_write(state); state_progress_restart(state); /* drop until now */ state_usage_waste(state); } } end: state_progress_end(state, countpos, countmax, countsize, "Nothing to sync.\n"); /* before returning we ensure that */ /* the parity is really written flushing the disk cache */ ret = state_flush(state, &io, parity_handle, blockcur); if (ret == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Stopping at block %u\n", blockcur); ++io_error; goto bail; /* LCOV_EXCL_STOP */ } /* save the new state if required */ if (!state->opt.kill_after_sync) { if ((state->need_write || state->opt.force_content_write)) state_write(state); } else { log_fatal(EUSER, "WARNING! Skipped writing state due to --test-kill-after-sync option.\n"); } state_usage_print(state); if (soft_error || silent_error || io_error) { msg_status("\n"); msg_status("%8u soft errors\n", soft_error); msg_status("%8u io errors\n", io_error); msg_status("%8u data errors\n", silent_error); } else { /* print the result only if processed something */ if (countpos != 0) msg_status("Everything OK\n"); } if (soft_error) log_fatal(ESOFT, "WARNING! Unexpected soft errors!\n"); if (io_error) log_fatal(EIO, "DANGER! Unexpected input/output errors! The failing blocks are now marked as bad!\n"); if (silent_error) log_fatal(EDATA, "DANGER! Unexpected silent data errors! The failing blocks are now marked as bad!\n"); if (io_error || silent_error) { log_fatal(ESOFT, "Use 'snapraid status' to list the bad blocks.\n"); log_fatal(ESOFT, "Use 'snapraid -e fix' to recover.\n"); } log_tag("summary:error_soft:%u\n", soft_error); log_tag("summary:error_io:%u\n", io_error); log_tag("summary:error_data:%u\n", silent_error); if (soft_error + silent_error + io_error == 0) log_tag("summary:exit:ok\n"); else if (silent_error + io_error == 0) log_tag("summary:exit:warning\n"); else log_tag("summary:exit:error\n"); log_flush(); bail: /* stop all the worker threads */ io_stop(&io); for (j = 0; j < diskmax; ++j) { struct snapraid_file* file = handle[j].file; struct snapraid_disk* disk = handle[j].disk; ret = handle_close(&handle[j]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("%s:%u:%s:%s: Close error. %s.\n", es(errno), blockcur, disk->name, esc_tag(file->sub), strerror(errno)); log_fatal_errno(errno, disk->name); if (is_hw(errno)) { ++io_error; } else { ++soft_error; } /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } free(handle); free(zero_alloc); free(copy_alloc); free(copy); free(rehandle_alloc); free(failed); free(failed_map); free(waiting_map); io_done(&io); free(block_enabled); if (state->opt.expect_recoverable) { if (soft_error + silent_error + io_error == 0) return -1; } else { if (soft_error + silent_error + io_error != 0) return -1; } if (alert < 0) return -1; return 0; } int state_sync(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount) { block_off_t blockmax; block_off_t used_paritymax; block_off_t file_paritymax; data_off_t size; int ret; struct snapraid_parity_handle parity_handle[LEV_MAX]; unsigned process_error; unsigned l; int skip_sync = 0; msg_progress("Initializing...\n"); blockmax = parity_allocated_size(state); size = blockmax * (data_off_t)state->block_size; /* minimum size of the parity files we expect */ used_paritymax = parity_used_size(state); /* effective size of the parity files */ file_paritymax = 0; if (blockstart > blockmax) { /* LCOV_EXCL_START */ log_fatal(EUSER, "Error in the starting block %u. It is larger than the parity size %u.\n", blockstart, blockmax); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* adjust the number of block to process */ if (blockcount != 0 && blockcount < blockmax - blockstart) { blockmax = blockstart + blockcount; } for (l = 0; l < state->level; ++l) { data_off_t out_size; block_off_t parityblocks; /* create the file and open for writing */ ret = parity_create(&parity_handle[l], &state->parity[l], l, state->file_mode, state->block_size, state->opt.parity_limit_size); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Create error. %s.\n", es(errno), 0, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } /* number of block in the parity file */ parity_size(&parity_handle[l], &out_size); parityblocks = out_size / state->block_size; /* if the file is too small */ if (parityblocks < used_paritymax) { log_fatal(ESOFT, "WARNING! The %s parity has only %u blocks instead of %u.\n", lev_name(l), parityblocks, used_paritymax); } /* keep the smallest parity number of blocks */ if (l == 0 || file_paritymax > parityblocks) file_paritymax = parityblocks; } /* if we do a full parity realloc or computation, having a wrong parity size is expected */ if (!state->opt.force_realloc && !state->opt.force_full) { /* if the parities are too small */ if (file_paritymax < used_paritymax) { /* LCOV_EXCL_START */ log_fatal(ESOFT, "DANGER! One or more the parity files are smaller than expected!\n"); if (file_paritymax != 0) { log_fatal(ESOFT, "If this happens because you are using an old content file,\n"); log_fatal(ESOFT, "you can 'sync' anyway using 'snapraid --force-full sync'\n"); log_fatal(ESOFT, "to force a full rebuild of the parity.\n"); } else { log_fatal(ESOFT, "It's possible that the parity disks are not mounted.\n"); log_fatal(ESOFT, "If instead you are adding a new parity level, you can 'sync' using\n"); log_fatal(ESOFT, "'snapraid --force-full sync' to force a full rebuild of the parity.\n"); } exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } process_error = 0; if (state->opt.prehash) { msg_progress("Hashing...\n"); ret = state_hash_process(state, blockstart, blockmax, &skip_sync); if (ret == -1) { /* LCOV_EXCL_START */ ++process_error; /* on any error do NOT proceeed with the sync */ skip_sync = 1; /* LCOV_EXCL_STOP */ } } if (!skip_sync) { msg_progress("Resizing...\n"); /* now change the size of all parities */ for (l = 0; l < state->level; ++l) { int is_modified; /* change the size of the parity file, truncating or extending it */ /* from this point all the DELETED blocks after the end of the parity are invalid */ /* and they are automatically removed when we save the new content file */ ret = parity_chsize(&parity_handle[l], &state->parity[l], &is_modified, size, state->block_size, state->opt.skip_fallocate, state->opt.skip_space_holder); if (ret == -1) { /* LCOV_EXCL_START */ data_off_t out_size; parity_size(&parity_handle[l], &out_size); parity_overflow(state, out_size); log_fatal(errno, "WARNING! Without a usable %s file, it isn't possible to sync.\n", lev_name(l)); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (is_modified) state->need_write = 1; } /* after resizing parity files, refresh again the free info */ state_refresh(state); /** * Save the new state before the sync but after the hashing phase * * This allows to recover after an aborted sync, and at the same time * it allows to recover broken copied/moved files identified in the * hashing phase. * * For example, think at this case: * - Add some files at the array * - Run a sync command, it will recompute the parity adding the new files * - Abort the sync command before it stores the new content file * - Delete the not yet synced files from the array * - Run a new sync command * * The sync command has no way to know that the parity file was modified * because the files triggering these changes are now deleted and they aren't * listed in the content file. * Instead, saving the new content file in advance, keeps track of all the parity * that may be modified. */ if (!state->opt.skip_content_write) { if (state->need_write) state_write(state); } else { log_fatal(EUSER, "WARNING! Skipped state write for --test-skip-content-write option.\n"); } /* skip degenerated cases of empty parity, or skipping all */ if (blockstart < blockmax) { ret = state_sync_process(state, parity_handle, blockstart, blockmax); if (ret == -1) { /* LCOV_EXCL_START */ ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } else { msg_status("Nothing to sync.\n"); } } for (l = 0; l < state->level; ++l) { ret = parity_close(&parity_handle[l]); if (ret == -1) { /* LCOV_EXCL_START */ log_tag("parity_%s:%u:%s: Close error. %s.\n", es(errno), blockmax, lev_config_name(l), strerror(errno)); log_fatal_errno(errno, lev_config_name(l)); ++process_error; /* continue, as we are already exiting */ /* LCOV_EXCL_STOP */ } } if (process_error != 0) return -1; return 0; } snapraid-14.9/cmdline/thermal.c000066400000000000000000000242241522717156100164760ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2025 Andrea Mazzoleni #include "portable.h" #include "thermal.h" #include "state.h" #include "io.h" #include struct snapraid_thermal* thermal_alloc(uint64_t dev, const char* name) { struct snapraid_thermal* thermal = malloc_nofail(sizeof(struct snapraid_thermal)); thermal->device = dev; thermal->latest_temperature = 0; thermal->count = 0; pathcpy(thermal->name, sizeof(thermal->name), name); return thermal; } void thermal_free(struct snapraid_thermal* thermal) { free(thermal); } /* * Fit exponential heating model to data using least squares */ struct snapraid_thermal_params fit_thermal_model(const struct snapraid_thermal_point* points, int n_points, double t_ambient) { struct snapraid_thermal_params model; double t_steady_try; double k_try; memset(&model, 0, sizeof(model)); model.t_ambient = t_ambient; /* at least four points to have a result */ if (n_points < 4) return model; double last_temp = points[n_points - 1].temperature; /* iterative refinement to find best k_heat and t_steady */ double best_error = 1e10; double best_k = 0; double best_t_steady = 0; /* grid search for parameters */ for (t_steady_try = last_temp + 2.0; t_steady_try <= last_temp + 25.0; t_steady_try += 0.5) { for (k_try = 0.00001; k_try <= 0.001; k_try *= 1.2) { double error = 0.0; int i; /* calculate error for this parameter set */ for (i = 0; i < n_points; i++) { double t = points[i].time; double t_predicted = t_steady_try - (t_steady_try - points[0].temperature) * exp(-k_try * t); double diff = points[i].temperature - t_predicted; error += diff * diff; } if (error < best_error) { best_error = error; best_k = k_try; best_t_steady = t_steady_try; } } } model.k_heat = best_k; model.t_steady = best_t_steady; /* calculate quality metrics */ double sum_squared_residuals = 0.0; double sum_total = 0.0; double mean_temp = 0.0; model.max_error = 0.0; int i; /* calculate mean temperature */ for (i = 0; i < n_points; i++) mean_temp += points[i].temperature; mean_temp /= n_points; /* calculate R-squared and errors */ for (i = 0; i < n_points; i++) { double t = points[i].time; double t_predicted = model.t_steady - (model.t_steady - points[0].temperature) * exp(-model.k_heat * t); double residual = points[i].temperature - t_predicted; sum_squared_residuals += residual * residual; sum_total += (points[i].temperature - mean_temp) * (points[i].temperature - mean_temp); double abs_error = fabs(residual); if (abs_error > model.max_error) { model.max_error = abs_error; } } model.rmse = sqrt(sum_squared_residuals / n_points); model.r_squared = 1.0 - (sum_squared_residuals / sum_total); return model; } void state_thermal(struct snapraid_state* state, time_t now) { tommy_node* i; unsigned j; tommy_list high; tommy_list low; int ret; if (state->thermal_temperature_limit == 0) return; tommy_list_init(&high); tommy_list_init(&low); /* for all disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; devinfo_t* entry; entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = disk->device; device_name_set(entry, disk->name, 0); pathcpy(entry->mount, sizeof(entry->mount), disk->dir); pathcpy(entry->smartctl, sizeof(entry->smartctl), disk->smartctl); memcpy(entry->smartignore, disk->smartignore, sizeof(entry->smartignore)); tommy_list_insert_tail(&high, &entry->node, entry); } /* for all parities */ for (j = 0; j < state->level; ++j) { devinfo_t* entry; unsigned s; for (s = 0; s < state->parity[j].split_mac; ++s) { entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = state->parity[j].split_map[s].device; device_name_set(entry, lev_config_name(j), s); pathcpy(entry->mount, sizeof(entry->mount), state->parity[j].split_map[s].path); pathcpy(entry->smartctl, sizeof(entry->smartctl), state->parity[j].smartctl); memcpy(entry->smartignore, state->parity[j].smartignore, sizeof(entry->smartignore)); pathcut(entry->mount); /* remove the parity file */ tommy_list_insert_tail(&high, &entry->node, entry); } } /* with a GUI always gives time reference */ if (state->opt.gui) log_tag("unixtime:%" PRIi64 "\n", (int64_t)now); if (state->opt.fake_device) { ret = devtest(&high, &low, DEVICE_SMART); } else { ret = devquery(&high, &low, DEVICE_SMART); } /* on error, just disable thermal gathering */ if (ret != 0) return; /* if the list is empty, it's not supported in this platform */ if (tommy_list_empty(&low)) return; /* report new attribute */ state_attr(state, &low); /* if ambient temperature is not set, set it now with the lowest HD temperature */ if (state->thermal_ambient_temperature == 0) { state->thermal_ambient_temperature = ambient_temperature(); for (i = tommy_list_head(&low); i != 0; i = i->next) { devinfo_t* devinfo = i->data; int temp = smart_temp(devinfo); if (temp < 0) continue; log_tag("thermal:system:candidate:%d\n", temp); if (state->thermal_ambient_temperature == 0 || state->thermal_ambient_temperature > temp) state->thermal_ambient_temperature = temp; } log_tag("thermal:system:final:%d\n", state->thermal_ambient_temperature); } int highest_temperature = 0; for (i = tommy_list_head(&low); i != 0; i = i->next) { tommy_node* t; struct snapraid_thermal* found; devinfo_t* devinfo = i->data; unsigned k; int temperature = smart_temp(devinfo); if (temperature < 0) continue; /* search of the entry */ found = 0; for (t = tommy_list_head(&state->thermallist); t != 0; t = t->next) { struct snapraid_thermal* thermal = t->data; if (thermal->device == devinfo->device) { found = thermal; break; } } /* if not found, create it */ if (found == 0) { found = thermal_alloc(devinfo->device, devinfo->name); tommy_list_insert_tail(&state->thermallist, &found->node, found); } found->latest_temperature = temperature; if (highest_temperature < temperature) highest_temperature = temperature; log_tag("thermal:current:%s:%" PRIu64 ":%d\n", devinfo->name, devinfo->device, temperature); if (state->thermal_stop_gathering) continue; if (found->count + 1 >= THERMAL_MAX) /* keep one extra space at the end */ continue; /* only monotone increasing temperature */ if (found->count > 0 && found->data[found->count - 1].temperature >= temperature) continue; /* insert the new data point */ found->data[found->count].temperature = temperature; found->data[found->count].time = now - state->thermal_first; ++found->count; if (state->opt.fake_device) { /* fill with fake data */ found->data[0].time = 0; found->data[0].temperature = 27; found->data[1].time = 100; found->data[1].temperature = 28; found->data[2].time = 300; found->data[2].temperature = 29; found->data[3].time = 700; found->data[3].temperature = 30; found->data[4].time = 1500; found->data[4].temperature = 31; found->count = 5; } /* log the new data */ log_tag("thermal:heat:%s:%" PRIu64 ":%u:", devinfo->name, devinfo->device, found->count); for (k = 0; k < found->count; ++k) log_tag("%s%d/%d", k > 0 ? "," : "", (int)found->data[k].temperature, (int)found->data[k].time); log_tag("\n"); /* estimate parameters */ found->params = fit_thermal_model(found->data, found->count, state->thermal_ambient_temperature); log_tag("thermal:params:%s:%" PRIu64 ":%g:%g:%g:%g:%g:%g\n", devinfo->name, devinfo->device, found->params.k_heat, found->params.t_ambient, found->params.t_steady, found->params.rmse, found->params.r_squared, found->params.max_error); } /* always update the highest temperature */ state->thermal_highest_temperature = highest_temperature; log_tag("thermal:highest:%d\n", highest_temperature); log_flush(); tommy_list_foreach(&high, free); tommy_list_foreach(&low, free); } int state_thermal_alarm(struct snapraid_state* state) { /* if no limit, there is no thermal support */ if (state->thermal_temperature_limit == 0) return 0; if (state->thermal_highest_temperature <= state->thermal_temperature_limit) return 0; return 1; } void state_thermal_cooldown(struct snapraid_state* state) { int sleep_time = state->thermal_cooldown_time; if (sleep_time == 0) sleep_time = 5 * 60; /* default sleep time */ if (sleep_time < 3 * 60) sleep_time = 3 * 60; /* minimum sleep time */ /* from now on, stop any further data gathering as the heating is interrupted */ state->thermal_stop_gathering = 1; log_tag("thermal:spindown\n"); state_device(state, DEVICE_DOWN, 0); msg_progress("Cooldown...\n"); log_tag("thermal:cooldown:%d\n", sleep_time); printf("Waiting for %d minutes...\n", sleep_time / 60); log_flush(); /* every 30 seconds spin down any disk that was spunup */ while (sleep_time > 0) { state_device(state, DEVICE_DOWNIFUP, 0); sleep(30); sleep_time -= 30; } if (!global_interrupt) { /* don't wake-up if we are interrupting */ log_tag("thermal:spinup\n"); /* spinup */ state_device(state, DEVICE_UP, 0); /* log new thermal info */ state_thermal(state, 0); } } int state_thermal_begin(struct snapraid_state* state, time_t now) { if (state->thermal_temperature_limit == 0) return 1; /* initial thermal measure */ state->thermal_first = now; state->thermal_latest = now; state_thermal(state, now); if (state->thermal_ambient_temperature != 0) { printf("System temperature is %u degrees\n", state->thermal_ambient_temperature); if (state->thermal_temperature_limit != 0 && state->thermal_temperature_limit <= state->thermal_ambient_temperature) { /* LCOV_EXCL_START */ log_fatal(EENVIRONMENT, "DANGER! System temperature of %d degrees is higher than the temperature limit of %d degrees. Unable to proceed!\n", state->thermal_ambient_temperature, state->thermal_temperature_limit); log_flush(); return 0; /* LCOV_EXCL_STOP */ } } if (state_thermal_alarm(state)) { /* LCOV_EXCL_START */ log_fatal(EENVIRONMENT, "DANGER! Hard disk temperature of %d degrees is already outside the operating range. Unable to proceed!\n", state->thermal_highest_temperature); log_flush(); return 0; /* LCOV_EXCL_STOP */ } return 1; } snapraid-14.9/cmdline/thermal.h000066400000000000000000000032531522717156100165020ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2025 Andrea Mazzoleni #ifndef __THERMAL_H #define __THERMAL_H #include "elem.h" /****************************************************************************/ /* thermal */ /** * Period of temperature measures */ #define THERMAL_PERIOD_SECONDS 30 /** * Max number of temperature measures */ #define THERMAL_MAX 100 /** * Minimum value of the R^2 to consider valid a measure */ #define THERMAL_R_SQUARED_LIMIT 0.9 struct snapraid_thermal_point { double temperature; /**< Temperatures in celsius */ double time; /**< Time in seconds */ }; struct snapraid_thermal_params { double k_heat; /**< Heating coefficient */ double t_steady; /**< Steady state temperature during heating */ double t_ambient; /**< Ambient temperature */ double rmse; /**< Root mean square error of the fit */ double r_squared; /**< Coefficient of determination */ double max_error; /**< Maximum absolute error in fit */ }; struct snapraid_thermal { uint64_t device; /**< Device ID. */ char name[PATH_MAX]; /**< Name of the disk. Note that it's not unique as more physical disks may map to the same logical disk */ int latest_temperature; /**< Latest temperature */ struct snapraid_thermal_point data[THERMAL_MAX]; /**< Measures. Stopped after the first sleep. */ unsigned count; /**< Number of measures */ struct snapraid_thermal_params params; /**< Estimated thermal parameters */ tommy_node node; /**< Next node in the list. */ }; /** * Allocate a thermal state. */ struct snapraid_thermal* thermal_alloc(uint64_t dev, const char* name); /** * Deallocate a thermal state. */ void thermal_free(struct snapraid_thermal* thermal); #endif snapraid-14.9/cmdline/touch.c000066400000000000000000000103351522717156100161620ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2014 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "elem.h" #include "state.h" #include "handle.h" void state_touch(struct snapraid_state* state) { tommy_node* i; unsigned counter = 0; msg_progress("Setting sub-second timestamps...\n"); /* for all disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; tommy_node* j; /* for all files */ for (j = disk->filelist; j != 0; j = j->next) { struct snapraid_file* file = j->data; /* if the file has a zero nanosecond timestamp */ /* note that symbolic links are not in the file list */ /* and then are not processed */ if (file->mtime_nsec == 0) { char path[PATH_MAX]; struct stat st; int f; int ret; int nsec; int flags; pathprint(path, sizeof(path), "%s%s", disk->dir, file->sub); /* set a new nanosecond timestamp different than 0 */ do { uint32_t nano; /* get a random nanosecond value */ if (randomize(&nano, sizeof(nano)) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to retrieve random values.\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } nsec = nano % 1000000000; } while (nsec == 0); /* O_BINARY: open as binary file (Windows only) */ /* O_NOFOLLOW: do not follow links to ensure to open the real file */ flags = O_BINARY | O_NOFOLLOW; #ifdef _WIN32 /* in Windows we must have write access at the file */ flags |= O_RDWR; #else /* in all others platforms, read access is enough */ flags |= O_RDONLY; #endif /* open it */ f = open(path, flags); #ifdef _WIN32 if (f == -1) { /* LCOV_EXCL_START */ if (errno == EACCES) { int attributes = windows_get_file_attributes(path); if (attributes != -1 && (attributes & FILE_ATTRIBUTE_READONLY) != 0) { /* remove read only attribute */ if (windows_set_file_attributes(path, attributes & ~FILE_ATTRIBUTE_READONLY) == 0) { f = open(path, flags); if (windows_set_file_attributes(path, attributes) != 0) { log_error(errno, "Error restoring read-only attribute for '%s'. %s.\n", path, strerror(errno)); } } } } /* LCOV_EXCL_STOP */ } #endif if (f == -1) { /* LCOV_EXCL_START */ log_error(errno, "Error opening file '%s'. %s.\n", path, strerror(errno)); continue; /* LCOV_EXCL_STOP */ } /* get the present timestamp, that may be different than the one */ /* in the content file */ ret = fstat(f, &st); if (ret == -1) { /* LCOV_EXCL_START */ close(f); log_error(errno, "Error accessing file '%s'. %s.\n", path, strerror(errno)); continue; /* LCOV_EXCL_STOP */ } /* set the tweaked modification time, with new nano seconds */ ret = fmtime(f, st.st_mtime, nsec); if (ret != 0) { /* LCOV_EXCL_START */ close(f); log_error(errno, "Error timing file '%s'. %s.\n", path, strerror(errno)); continue; /* LCOV_EXCL_STOP */ } /* uses fstat again to get the present timestamp */ /* this is needed because the value read */ /* may be different than the written one */ ret = fstat(f, &st); if (ret == -1) { /* LCOV_EXCL_START */ close(f); log_error(errno, "Error accessing file '%s'. %s.\n", path, strerror(errno)); continue; /* LCOV_EXCL_STOP */ } /* close it */ ret = close(f); if (ret != 0) { /* LCOV_EXCL_START */ log_error(errno, "Error closing file '%s'. %s.\n", path, strerror(errno)); continue; /* LCOV_EXCL_STOP */ } /* set the same nanosecond value in the content file */ /* note that if the seconds value is already matching */ /* the file won't be synced because the content file will */ /* contain the new updated timestamp */ file->mtime_nsec = STAT_NSEC(&st); /* state changed, we need to update it */ state->need_write = 1; log_tag("touch:%s:%s: %" PRIu64 ".%d\n", disk->name, esc_tag(file->sub), (uint64_t)st.st_mtime, STAT_NSEC(&st)); msg_info("touch %s\n", fmt_term(disk, file->sub)); ++counter; } } } msg_status("\n"); msg_status("%8u touched files\n", counter); } snapraid-14.9/cmdline/unix.c000066400000000000000000002101041522717156100160170ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2013 Andrea Mazzoleni #include "portable.h" #ifndef __MINGW32__ /* Only for Unix */ #include "support.h" /****************************************************************************/ /* access */ #if !HAVE_EACCESS /** * Check effective user's permissions for a file. * Conceptually identical to access(), but uses the effective UID/GID. */ int eaccess(const char* pathname, int mode) { return faccessat(AT_FDCWD, pathname, mode, AT_EACCESS); } #endif /** * Exit codes. */ int exit_success = 0; int exit_failure = 1; int exit_sync_needed = 2; #if HAVE_POSIX_FADVISE /** * Wrapper around posix_fadvise() that handles ENOENT by converting it to * ENOSYS. * * Why can posix_fadvise() return ENOENT? * * According to POSIX and the Linux kernel's standard fadvise64 implementation * (mm/fadvise.c), posix_fadvise() should only return EBADF (bad file * descriptor), ESPIPE (fd refers to a pipe or FIFO), or EINVAL (invalid * advice value or arguments). ENOENT is never generated by the kernel's * generic path. * * However, the VFS layer allows individual filesystems to provide their own * .fadvise() method, which is called instead of (or in addition to) the * generic implementation. Certain filesystem drivers can return ENOENT in * this method for reasons that are completely unrelated to the file not * existing (the file is clearly open, we have a valid fd): * * - NFS: A stale NFS inode can be revalidated against the server while * fadvise is being processed. If the server-side file has been removed or * renamed, the revalidation discovers the inode is gone and returns * -ENOENT, even though the client still holds an open file descriptor. * * - FUSE-based filesystems (mergerfs, sshfs, rclone, etc.): The FUSE daemon * receives the fadvise request and may forward it to an underlying backend. * If that backend cannot find the file (e.g., the backing path has changed, * the FUSE daemon is partially initialised, or the daemon translates the * request and the target layer returns an error), the daemon may return * ENOENT to the kernel. * * - Overlayfs (used by Docker, Podman, LXC): The overlayfs .fadvise() * implementation delegates to the lower or upper layer. If the lookup * through the overlay stack fails to find the real inode (e.g., the upper * directory entry is absent and the lower copy is in a weird state), the * delegation can return ENOENT. * * - Other network or virtual filesystems: Any out-of-tree or in-tree * filesystem that implements .fadvise() and performs a path or inode * lookup as part of processing the hint can propagate ENOENT if that * internal lookup fails. * * Because posix_fadvise() is always an advisory hint, it never affects * correctness, only performance, it is safe to treat unexpected errors, * including ENOENT, as "not supported" (ENOSYS) and continue. */ int posix_fadvise_wrapper(int fd, off_t offset, off_t len, int advice) { int ret = posix_fadvise(fd, offset, len, advice); if (ret == ENOENT) return ENOSYS; return ret; } #endif int open_noatime(const char* file, int flags) { #ifdef O_NOATIME int f = open(file, flags | O_NOATIME); /* only root is allowed to use O_NOATIME, in case retry without it */ if (f == -1 && errno == EPERM) f = open(file, flags); return f; #else return open(file, flags); #endif } int dirent_hidden(struct dirent* dd) { return dd->d_name[0] == '.'; } const char* stat_desc(struct stat* st) { if (S_ISREG(st->st_mode)) return "regular"; if (S_ISDIR(st->st_mode)) return "directory"; if (S_ISCHR(st->st_mode)) return "character"; if (S_ISBLK(st->st_mode)) return "block-device"; if (S_ISFIFO(st->st_mode)) return "fifo"; if (S_ISLNK(st->st_mode)) return "symlink"; if (S_ISSOCK(st->st_mode)) return "socket"; return "unknown"; } static const char* smartctl_paths[] = { /* Linux & BSD */ "/usr/sbin/smartctl", "/sbin/smartctl", "/usr/local/sbin/smartctl", "/usr/bin/smartctl", "/usr/local/bin/smartctl", /* macOS (Intel & Apple Silicon) */ "/opt/homebrew/sbin/smartctl", 0 }; const char* find_smartctl(void) { int i; for (i = 0; smartctl_paths[i]; ++i) { if (eaccess(smartctl_paths[i], X_OK) == 0) return smartctl_paths[i]; } return 0; } /** * Read a file from sys * * Return -1 on error, otherwise the size of data read */ #if HAVE_LINUX_DEVICE static int sysread(const char* path, char* buf, size_t buf_size) { int f; int ret; int len; f = open(path, O_RDONLY); if (f == -1) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } len = read(f, buf, buf_size); if (len < 0) { /* LCOV_EXCL_START */ close(f); return -1; /* LCOV_EXCL_STOP */ } ret = close(f); if (ret != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } return len; } #endif #if HAVE_LINUX_DEVICE /* * sysread_vpd_pg83 — parse raw binary VPD page 0x83 (Device Identification) * from a sysfs vpd_pg83 file and extract the first NAA (Network Address * Authority) designator for the Logical Unit (ASSOCIATION == 0x00). */ static int sysattr_vpd_pg80(const char* path, char* dst, size_t dst_size) { unsigned char buf[512]; int ret = sysread(path, (char*)buf, sizeof(buf)); /* need at least the header */ if (ret < 4) return -1; /* validate page code */ if (buf[1] != 0x80) return -1; /* clamp to what was actually read */ size_t page_len = buf[3]; size_t available = (size_t)ret - 4; if (available < page_len) page_len = available; /* if empty */ if (page_len == 0) return -1; /* if too bit to store the 0 termination */ if (4 + page_len + 1 > sizeof(buf)) return -1; char* attr = (char*)buf + 4; attr[page_len] = 0; strtrim(attr); /* if empty */ if (!*attr) return -1; pathcpy(dst, dst_size, attr); return 0; } #endif /* * sysread_vpd_pg83 — parse raw binary VPD page 0x83 (Device Identification) * from a sysfs vpd_pg83 file and extract the first NAA (Network Address * Authority) designator for the Logical Unit (ASSOCIATION == 0x00). * * The result is written into dst as a lowercase hex string, * e.g.: "5000c500abcdef01" (8-byte / NAA type 1,2,3,5) * "6000c500abcdef010000000000000000" (16-byte / NAA type 6) * * VPD page 0x83 wire format (SPC-4 §7.7.2) * * Page header — 4 bytes: * [0] peripheral qualifier (7:5) | device type (4:0) * [1] page code = 0x83 * [2] PAGE LENGTH MSB } 16-bit big-endian: number of bytes that follow * [3] PAGE LENGTH LSB } the header (i.e. total descriptor bytes) * * Then a sequence of Designation Descriptors: * [+0] PROTOCOL ID (7:4) | CODE SET (3:0) * 0x1 = binary, 0x2 = ASCII, 0x3 = UTF-8 * [+1] PIV (7) | reserved (6) | ASSOCIATION (5:4) | DESIGNATOR TYPE (3:0) * ASSOCIATION: 0x0 = logical unit ← we want only this * 0x1 = target port * 0x2 = target device * DESIGNATOR TYPE: 0x3 = NAA ← we want only this * [+2] reserved * [+3] DESIGNATOR LENGTH = N (bytes that follow in this descriptor) * [+4 â€Ļ +4+N-1] DESIGNATOR (binary for NAA) * * NAA subtypes (top nibble of designator byte 0) * * 0x1 NAA IEEE Extended → 8 bytes * 0x2 NAA Locally Assigned → 8 bytes * 0x3 NAA IEEE Registered → 8 bytes (most common on SATA/SAS) * 0x5 NAA IEEE Registered → 8 bytes * 0x6 NAA IEEE Registered Ext. → 16 bytes * others: reserved * * The DESIGNATOR LENGTH from the descriptor header must agree with the * expected length for the NAA subtype. If they disagree, the descriptor * is malformed and must be skipped. * * Returns 0 and fills dst on success, -1 if no valid NAA LU descriptor found. */ #if HAVE_LINUX_DEVICE static int sysattr_vpd_pg83(const char* path, char* dst, size_t dst_size) { unsigned char buf[4096]; int ret = sysread(path, (char*)buf, sizeof(buf)); if (ret < 4) return -1; /* validate page code */ if (buf[1] != 0x83) return -1; size_t page_len = ((size_t)buf[2] << 8) | buf[3]; /* clamp to what was actually read */ size_t available = (size_t)ret - 4; if (page_len > available) page_len = available; /* if empty */ if (page_len == 0) return -1; /* * Walk every Designation Descriptor looking for the first NAA descriptor * that is associated with the Logical Unit (ASSOCIATION == 0x00). * * We take the first one found rather than scoring: all NAA subtypes are * globally unique by construction; the first LU-associated NAA is the * canonical device WWN. */ size_t offset = 0; while (offset + 4 <= page_len) { const unsigned char* desc = buf + 4 + offset; unsigned code_set = desc[0] & 0x0f; unsigned assoc = (desc[1] >> 4) & 0x03; unsigned dtype = desc[1] & 0x0f; size_t id_len = desc[3]; /* bounds check: the full descriptor must lie within page_len */ if (offset + 4 + id_len > page_len) break; /* malformed page — stop iterating */ /* skip anything that is not an LU-associated NAA descriptor */ if (assoc != 0x00 || dtype != 0x03) goto next; /* * NAA is always binary (CODE SET == 0x01). * Reject if the device mis-advertises it as ASCII (defensive). */ if (code_set != 0x01) goto next; /* if empty */ if (id_len == 0) goto next; /* * Validate NAA subtype vs. expected byte length. * The NAA value is the top nibble of the first byte of the * designator (NOT the descriptor header byte). */ unsigned naa = (desc[4] >> 4) & 0x0f; size_t expected = 0; switch (naa) { case 0x1 : /* IEEE Extended */ case 0x2 : /* Locally Assigned */ case 0x3 : /* IEEE Registered */ case 0x5 : /* IEEE Registered */ expected = 8; break; case 0x6 : /* IEEE Registered Extended */ expected = 16; break; default : goto next; } /* DESIGNATOR LENGTH must match the NAA subtype exactly */ if (id_len != expected) goto next; if (dst_size < id_len * 2 + 1) return -1; for (size_t i = 0; i < id_len; i++) snprintf(dst + i * 2, 3, "%02x", desc[4 + i]); dst[id_len * 2] = 0; return 0; next: offset += 4 + id_len; } return -1; } #endif /** * Read a file from sys. * Trim spaces. * Always put an ending 0. * Do not report error on reading. * Return an error if truncated * * Return -1 on error, 0 on success */ #if HAVE_LINUX_DEVICE static int sysattr(const char* path, char* buf, size_t buf_size) { int len; len = sysread(path, buf, buf_size); if (len < 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } if ((size_t)len + 1 > buf_size) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } buf[len] = 0; strtrim(buf); return 0; } #endif /** * Get the device file from the device number. * * It uses /proc/self/mountinfo. * * Null devices (major==0) are resolved to the device indicated in mountinfo. */ #if HAVE_LINUX_DEVICE static int devresolve_proc(uint64_t device, char* path, size_t path_size) { FILE* f; char match[32]; /* generate the matching string */ snprintf(match, sizeof(match), "%u:%u", major(device), minor(device)); f = fopen("/proc/self/mountinfo", "r"); if (!f) { log_tag("resolve:proc:%u:%u: failed to open /proc/self/mountinfo\n", major(device), minor(device)); return -1; } /* * mountinfo format * 0 - mount ID * 1 - parent ID * 2 - major:minor * 3 - root * 4 - mount point * 5 - options * 6 - "-" (separator) * 7 - fs * 8 - mount source - /dev/device */ while (1) { char buf[256]; char* first_map[8]; unsigned first_mac; char* second_map[8]; unsigned second_mac; char* s; struct stat st; char* separator; char* majorminor; char* mountpoint; char* fs; char* mountsource; s = fgets(buf, sizeof(buf), f); if (s == 0) break; /* find the separator position */ separator = strstr(s, " - "); if (!separator) continue; /* skip the separator */ *separator = 0; separator += 3; /* split the line */ first_mac = strsplit(first_map, 8, s, " \t\r\n"); second_mac = strsplit(second_map, 8, separator, " \t\r\n"); /* if too short, it's the wrong line */ if (first_mac < 5) continue; if (second_mac < 2) continue; majorminor = first_map[2]; mountpoint = first_map[4]; fs = second_map[0]; mountsource = second_map[1]; /* compare major:minor from mountinfo */ if (strcmp(majorminor, match) == 0) { /* * Accept only /dev/... mountsource * * This excludes ZFS that uses a bare label for mountsource, like "tank". * * 410 408 0:193 / /XXX rw,relatime shared:217 - zfs tank/system/data/var/lib/docker/XXX rw,xattr,noacl * * Also excludes AUTOFS unmounted devices that point to a fake filesystem * used to remount them at the first use. * * 97 25 0:42 / /XXX rw,relatime shared:76 - autofs /etc/auto.seed rw,fd=6,pgrp=952,timeout=30,minproto=5,maxproto=5,indirect */ if (strncmp(mountsource, "/dev/", 5) != 0) { log_tag("resolve:proc:%u:%u: match skipped for not /dev/ mountsource for %s %s\n", major(device), minor(device), fs, mountsource); continue; } pathcpy(path, path_size, mountsource); log_tag("resolve:proc:%u:%u: found device %s matching device %s\n", major(device), minor(device), path, match); fclose(f); return 0; } /* get the device of the mount point */ /* in Btrfs it could be different than the one in mountinfo */ if (stat(mountpoint, &st) == 0 && st.st_dev == device) { if (strncmp(mountsource, "/dev/", 5) != 0) { log_tag("resolve:proc:%u:%u: match skipped for not /dev/ mountsource for %s %s\n", major(device), minor(device), fs, mountsource); continue; } pathcpy(path, path_size, mountsource); log_tag("resolve:proc:%u:%u: found device %s matching mountpoint %s\n", major(device), minor(device), path, mountpoint); fclose(f); return 0; } } log_tag("resolve:proc:%u:%u: not found\n", major(device), minor(device)); fclose(f); return -1; } #endif /** * Get the device of a virtual superblock. * * This is intended to resolve the case of Btrfs filesystems that * create a virtual superblock (major==0) not backed by any low * level device. * * See: * Bug 711881 - too funny btrfs st_dev numbers * https://bugzilla.redhat.com/show_bug.cgi?id=711881 */ #if HAVE_LINUX_DEVICE static int devdereference(uint64_t device, uint64_t* new_device) { char path[PATH_MAX]; struct stat st; /* use the proc interface to get the device containing the filesystem */ if (devresolve_proc(device, path, sizeof(path)) != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } /* check the device */ if (stat(path, &st) != 0) { /* LCOV_EXCL_START */ log_tag("dereference:%u:%u: failed to stat %s\n", major(device), minor(device), path); return -1; /* LCOV_EXCL_STOP */ } if (major(st.st_rdev) == 0) { /* LCOV_EXCL_START */ log_tag("dereference:%u:%u: still null device %s -> %u:%u\n", major(device), minor(device), path, major(st.st_rdev), minor(st.st_rdev)); return -1; /* LCOV_EXCL_STOP */ } *new_device = st.st_rdev; log_tag("dereference:%u:%u: found %u:%u\n", major(device), minor(device), major(st.st_rdev), minor(st.st_rdev)); return 0; } #endif /** * Read a file extracting the specified tag TAG=VALUE format. * Return !=0 on error. */ #if HAVE_LINUX_DEVICE static int tagread(const char* path, const char* tag, char* value, size_t value_size) { int ret; char buf[512]; size_t tag_len; char* i; char* e; ret = sysread(path, buf, sizeof(buf)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to read '%s'.\n", path); return -1; /* LCOV_EXCL_STOP */ } if ((size_t)ret + 1 > sizeof(buf)) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Too long read '%s'.\n", path); return -1; /* LCOV_EXCL_STOP */ } /* ending 0 */ buf[ret] = 0; tag_len = strlen(tag); for (i = buf; *i; ++i) { char* p = i; /* start with a space */ if (p != buf) { if (!isspace((unsigned char)*p)) continue; ++p; } if (strncmp(p, tag, tag_len) != 0) continue; p += tag_len; /* end with a = */ if (*p != '=') continue; ++p; /* found */ i = p; break; } if (!*i) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Missing tag '%s' for '%s'.\n", tag, path); return -1; /* LCOV_EXCL_STOP */ } /* terminate at the first space */ e = i; while (*e != 0 && !isspace((unsigned char)*e)) ++e; *e = 0; if (!*i) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Empty tag '%s' for '%s'.\n", tag, path); return -1; /* LCOV_EXCL_STOP */ } pathprint(value, value_size, "%s", i); return 0; } #endif /** * Get the device file from the device number. * * It uses /sys/dev/block/.../uevent. * * For null device (major==0) it fails. */ #if HAVE_LINUX_DEVICE static int devresolve_sys(dev_t device, char* path, size_t path_size) { struct stat st; char buf[PATH_MAX]; /* default device path from device number */ pathprint(path, path_size, "/sys/dev/block/%u:%u/uevent", major(device), minor(device)); if (tagread(path, "DEVNAME", buf, sizeof(buf)) != 0) { /* LCOV_EXCL_START */ log_tag("resolve:sys:%u:%u: failed to read DEVNAME tag '%s'\n", major(device), minor(device), path); return -1; /* LCOV_EXCL_STOP */ } /* set the real device path */ pathprint(path, path_size, "/dev/%s", buf); /* check the device */ if (stat(path, &st) != 0) { /* LCOV_EXCL_START */ log_tag("resolve:sys:%u:%u: failed to stat '%s'\n", major(device), minor(device), path); return -1; /* LCOV_EXCL_STOP */ } if (st.st_rdev != device) { /* LCOV_EXCL_START */ log_tag("resolve:sys:%u:%u: unexpected device '%u:%u' for '%s'.\n", major(device), minor(device), major(st.st_rdev), minor(st.st_rdev), path); return -1; /* LCOV_EXCL_STOP */ } log_tag("resolve:sys:%u:%u:%s: found\n", major(device), minor(device), path); return 0; } #endif /** * Get the device file from the device number. */ #if HAVE_LINUX_DEVICE static int devresolve(uint64_t device, char* path, size_t path_size) { if (devresolve_sys(device, path, path_size) == 0) return 0; return -1; } #endif /** * Cache used by blkid. */ #if HAVE_BLKID static blkid_cache cache = 0; #endif /** * Get the UUID using the /dev/disk/by-uuid/ links. * It doesn't require root permission, and the uuid are always updated. * It doesn't work with Btrfs file-systems that don't export the main UUID * in /dev/disk/by-uuid/. */ #if HAVE_LINUX_DEVICE static int devuuid_dev(uint64_t device, char* uuid, size_t uuid_size) { int ret; DIR* d; struct dirent* dd; struct stat st; /* scan the UUID directory searching for the device */ d = opendir("/dev/disk/by-uuid"); if (!d) { log_tag("uuid:by-uuid:%u:%u: opendir(/dev/disk/by-uuid) failed, %s\n", major(device), minor(device), strerror(errno)); /* directory missing?, likely we are not in Linux */ return -1; } int dir_fd = dirfd(d); if (dir_fd == -1) { log_tag("uuid:by-uuid:%u:%u: dirfd(/dev/disk/by-uuid) failed, %s\n", major(device), minor(device), strerror(errno)); closedir(d); return -1; } while ((dd = readdir(d)) != 0) { /* skip "." and ".." files, UUIDs never start with '.' */ if (dd->d_name[0] == '.') continue; ret = fstatat(dir_fd, dd->d_name, &st, 0); if (ret != 0) { log_tag("uuid:by-uuid:%u:%u: fstatat(%s) failed, %s\n", major(device), minor(device), dd->d_name, strerror(errno)); /* generic error, ignore and continue the search */ continue; } /* if it matches, we have the uuid */ if (S_ISBLK(st.st_mode) && st.st_rdev == (dev_t)device) { char buf[PATH_MAX]; char path[PATH_MAX]; /* resolve the link */ pathprint(path, sizeof(path), "/dev/disk/by-uuid/%s", dd->d_name); ret = readlink(path, buf, sizeof(buf)); if (ret < 0 || ret >= PATH_MAX) { log_tag("uuid:by-uuid:%u:%u: readlink(/dev/disk/by-uuid/%s) failed, %s\n", major(device), minor(device), dd->d_name, strerror(errno)); /* generic error, ignore and continue the search */ continue; } buf[ret] = 0; /* found */ pathcpy(uuid, uuid_size, dd->d_name); log_tag("uuid:by-uuid:%u:%u:%s: found %s\n", major(device), minor(device), uuid, buf); closedir(d); return 0; } } log_tag("uuid:by-uuid:%u:%u: /dev/disk/by-uuid doesn't contain a matching block device\n", major(device), minor(device)); /* not found */ closedir(d); return -1; } #endif /** * Get the UUID using libblkid. * It uses a cache to work without root permission, resulting in UUID * not necessarily recent. * We could call blkid_probe_all() to refresh the UUID, but it would * require root permission to read the superblocks, and resulting in * all the disks spinning. */ #if HAVE_BLKID static int devuuid_blkid(uint64_t device, char* uuid, size_t uuid_size) { char* devname; char* uuidname; devname = blkid_devno_to_devname(device); if (!devname) { log_tag("uuid:blkid:%u:%u: blkid_devno_to_devname() failed, %s\n", major(device), minor(device), strerror(errno)); /* device mapping failed */ return -1; } uuidname = blkid_get_tag_value(cache, "UUID", devname); if (!uuidname) { log_tag("uuid:blkid:%u:%u: blkid_get_tag_value(UUID,%s) failed, %s\n", major(device), minor(device), devname, strerror(errno)); /* uuid mapping failed */ free(devname); return -1; } pathcpy(uuid, uuid_size, uuidname); log_tag("uuid:blkid:%u:%u:%s: found %s\n", major(device), minor(device), uuid, devname); free(devname); free(uuidname); return 0; } #endif /** * Get the LABEL using libblkid. * It uses a cache to work without root permission, resulting in LABEL * not necessarily recent. */ #if HAVE_BLKID static int devuuid_label(uint64_t device, char* label, size_t label_size) { char* devname; char* labelname; devname = blkid_devno_to_devname(device); if (!devname) { log_tag("label:blkid:%u:%u: blkid_devno_to_devname() failed, %s\n", major(device), minor(device), strerror(errno)); /* device mapping failed */ return -1; } labelname = blkid_get_tag_value(cache, "LABEL", devname); if (!labelname) { log_tag("label:blkid:%u:%u: blkid_get_tag_value(LABEL,%s) failed, %s\n", major(device), minor(device), devname, strerror(errno)); free(devname); /* label mapping failed */ return -1; } pathcpy(label, label_size, labelname); log_tag("label:blkid:%u:%u:%s: found %s\n", major(device), minor(device), label, devname); free(devname); free(labelname); return 0; } #endif #ifdef __APPLE__ static int devuuid_darwin(const char* path, char* uuid, size_t uuid_size) { CFStringRef path_apple = 0; DASessionRef session = 0; CFURLRef path_appler = 0; int result = -1; *uuid = 0; path_apple = CFStringCreateWithCString(kCFAllocatorDefault, path, kCFStringEncodingUTF8); if (!path_apple) goto bail; session = DASessionCreate(kCFAllocatorDefault); if (!session) goto bail; path_appler = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path_apple, kCFURLPOSIXPathStyle, false); if (!path_appler) goto bail; /* find the mount point */ DADiskRef disk = NULL; while (path_appler) { disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, path_appler); if (disk) break; CFURLRef parent = CFURLCreateCopyDeletingLastPathComponent(kCFAllocatorDefault, path_appler); if (!parent) break; /* check if we hit the root (parent == child) */ if (CFEqual(parent, path_appler)) { CFRelease(parent); break; } CFRelease(path_appler); path_appler = parent; } /* safely extract the UUID */ if (disk) { CFDictionaryRef description = DADiskCopyDescription(disk); if (description) { /* key might not exist for NTFS/ExFAT on some drivers */ const void* value = (CFUUIDRef)CFDictionaryGetValue(description, kDADiskDescriptionVolumeUUIDKey); CFStringRef uuid_string = NULL; if (value) { if (CFGetTypeID(value) == CFUUIDGetTypeID()) { uuid_string = CFUUIDCreateString(kCFAllocatorDefault, (CFUUIDRef)value); } else if (CFGetTypeID(value) == CFStringGetTypeID()) { /* if it's already a string, retain it so we can release it later consistently */ uuid_string = (CFStringRef)CFRetain(value); } } if (uuid_string) { if (CFStringGetCString(uuid_string, uuid, uuid_size, kCFStringEncodingUTF8)) { result = 0; /* success */ } CFRelease(uuid_string); } CFRelease(description); } CFRelease(disk); } bail: /* clean up */ if (path_appler) CFRelease(path_appler); if (session) CFRelease(session); if (path_apple) CFRelease(path_apple); return result; } #endif int devuuid(uint64_t device, const char* path, char* uuid, size_t uuid_size) { (void)path; (void)device; #ifdef __APPLE__ if (devuuid_darwin(path, uuid, uuid_size) == 0) return 0; #endif #if HAVE_LINUX_DEVICE /* if the major is the null device */ if (major(device) == 0) { /* obtain the real device */ if (devdereference(device, &device) != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } } #endif /* first try with the /dev/disk/by-uuid version */ #if HAVE_LINUX_DEVICE if (devuuid_dev(device, uuid, uuid_size) == 0) return 0; #else log_tag("uuid:by-uuid:%u:%u: by-uuid not supported\n", major(device), minor(device)); #endif /* fall back to blkid for other cases */ #if HAVE_BLKID if (devuuid_blkid(device, uuid, uuid_size) == 0) return 0; #else log_tag("uuid:blkid:%u:%u: blkid support not compiled in\n", major(device), minor(device)); #endif log_tag("uuid:notfound:%u:%u:\n", major(device), minor(device)); /* not supported */ (void)uuid; (void)uuid_size; return -1; } int filephy(const char* path, uint64_t size, uint64_t* physical) { #if HAVE_LINUX_FIEMAP_H /* In Linux get the real physical address of the file */ /* Note that FIEMAP doesn't require root permission */ int f; struct fiemap* fiemap; size_t fiemap_size; unsigned int blknum; f = open(path, O_RDONLY); if (f == -1) { return -1; } /* first try with FIEMAP */ /* if works for ext2, ext3, ext4, xfs, btrfs */ fiemap_size = sizeof(struct fiemap) + sizeof(struct fiemap_extent); fiemap = malloc_nofail(fiemap_size); memset(fiemap, 0, fiemap_size); fiemap->fm_start = 0; fiemap->fm_length = ~0ULL; fiemap->fm_flags = FIEMAP_FLAG_SYNC; /* required to ensure that just created files report a valid address and not 0 */ fiemap->fm_extent_count = 1; /* we are interested only at the first block */ if (ioctl(f, FS_IOC_FIEMAP, fiemap) != -1) { uint32_t flags = fiemap->fm_extents[0].fe_flags; uint64_t offset = fiemap->fm_extents[0].fe_physical; /* check some condition for validating the offset */ if (flags & FIEMAP_EXTENT_DATA_INLINE) { /* if the data is inline, we don't have an offset to report */ *physical = FILEPHY_WITHOUT_OFFSET; } else if (flags & FIEMAP_EXTENT_UNKNOWN) { /* if the offset is unknown, we don't have an offset to report */ *physical = FILEPHY_WITHOUT_OFFSET; } else if (offset == 0) { /* 0 is the general fallback for file-systems when */ /* they don't have an offset to report */ *physical = FILEPHY_WITHOUT_OFFSET; } else { /* finally report the real offset */ *physical = offset + FILEPHY_REAL_OFFSET; } free(fiemap); if (close(f) == -1) return -1; return 0; } free(fiemap); /* if the file is empty, FIBMAP doesn't work, and we don't even try to use it */ if (size == 0) { *physical = FILEPHY_WITHOUT_OFFSET; if (close(f) == -1) return -1; return 0; } /* then try with FIBMAP */ /* it works for jfs, reiserfs, ntfs-3g */ /* in exfat it always returns 0, that it's anyway better than the fake inodes */ blknum = 0; /* first block */ if (ioctl(f, FIBMAP, &blknum) != -1) { *physical = blknum + FILEPHY_REAL_OFFSET; if (close(f) == -1) return -1; return 0; } /* otherwise don't use anything, and keep the directory traversal order */ /* at now this should happen only for vfat */ /* and it's surely better than using fake inodes */ *physical = FILEPHY_UNREPORTED_OFFSET; if (close(f) == -1) return -1; #else /* In a generic Unix use a dummy value for all the files */ /* We don't want to risk to use the inode without knowing */ /* if it really improves performance. */ /* In this way we keep them in the directory traversal order */ /* that at least keeps files in the same directory together. */ /* Note also that in newer file-system with snapshot, like ZFS, */ /* the inode doesn't represent even more the disk position, because files */ /* are not overwritten in place, but rewritten in another location */ /* of the disk. */ *physical = FILEPHY_UNREPORTED_OFFSET; (void)path; /* not used here */ (void)size; #endif return 0; } /* from man statfs */ #define ADFS_SUPER_MAGIC 0xadf5 #define AFFS_SUPER_MAGIC 0xADFF #define BDEVFS_MAGIC 0x62646576 #define BEFS_SUPER_MAGIC 0x42465331 #define BFS_MAGIC 0x1BADFACE #define BINFMTFS_MAGIC 0x42494e4d #define BTRFS_SUPER_MAGIC 0x9123683E #define CGROUP_SUPER_MAGIC 0x27e0eb #define CIFS_MAGIC_NUMBER 0xFF534D42 #define CODA_SUPER_MAGIC 0x73757245 #define COH_SUPER_MAGIC 0x012FF7B7 #define CRAMFS_MAGIC 0x28cd3d45 #define DEBUGFS_MAGIC 0x64626720 #define DEVFS_SUPER_MAGIC 0x1373 #define DEVPTS_SUPER_MAGIC 0x1cd1 #define EFIVARFS_MAGIC 0xde5e81e4 #define EFS_SUPER_MAGIC 0x00414A53 #define EXT_SUPER_MAGIC 0x137D #define EXT2_OLD_SUPER_MAGIC 0xEF51 #define EXT4_SUPER_MAGIC 0xEF53 /* also ext2/ext3 */ #define FUSE_SUPER_MAGIC 0x65735546 #define FUTEXFS_SUPER_MAGIC 0xBAD1DEA #define HFS_SUPER_MAGIC 0x4244 #define HFSPLUS_SUPER_MAGIC 0x482b #define HOSTFS_SUPER_MAGIC 0x00c0ffee #define HPFS_SUPER_MAGIC 0xF995E849 #define HUGETLBFS_MAGIC 0x958458f6 #define ISOFS_SUPER_MAGIC 0x9660 #define JFFS2_SUPER_MAGIC 0x72b6 #define JFS_SUPER_MAGIC 0x3153464a #define MINIX_SUPER_MAGIC 0x137F #define MINIX_SUPER_MAGIC2 0x138F #define MINIX2_SUPER_MAGIC 0x2468 #define MINIX2_SUPER_MAGIC2 0x2478 #define MINIX3_SUPER_MAGIC 0x4d5a #define MQUEUE_MAGIC 0x19800202 #define MSDOS_SUPER_MAGIC 0x4d44 #define NCP_SUPER_MAGIC 0x564c #define NFS_SUPER_MAGIC 0x6969 #define NILFS_SUPER_MAGIC 0x3434 #define NTFS_SB_MAGIC 0x5346544e #define OCFS2_SUPER_MAGIC 0x7461636f #define OPENPROM_SUPER_MAGIC 0x9fa1 #define PIPEFS_MAGIC 0x50495045 #define PROC_SUPER_MAGIC 0x9fa0 #define PSTOREFS_MAGIC 0x6165676C #define QNX4_SUPER_MAGIC 0x002f #define QNX6_SUPER_MAGIC 0x68191122 #define RAMFS_MAGIC 0x858458f6 #define REISERFS_SUPER_MAGIC 0x52654973 #define ROMFS_MAGIC 0x7275 #define SELINUX_MAGIC 0xf97cff8c #define SMACK_MAGIC 0x43415d53 #define SMB_SUPER_MAGIC 0x517B #define SOCKFS_MAGIC 0x534F434B #define SQUASHFS_MAGIC 0x73717368 #define SYSFS_MAGIC 0x62656572 #define SYSV2_SUPER_MAGIC 0x012FF7B6 #define SYSV4_SUPER_MAGIC 0x012FF7B5 #define TMPFS_MAGIC 0x01021994 #define UDF_SUPER_MAGIC 0x15013346 #define UFS_MAGIC 0x00011954 #define USBDEVICE_SUPER_MAGIC 0x9fa2 #define V9FS_MAGIC 0x01021997 #define VXFS_SUPER_MAGIC 0xa501FCF5 #define XENFS_SUPER_MAGIC 0xabba1974 #define XENIX_SUPER_MAGIC 0x012FF7B4 #define XFS_SUPER_MAGIC 0x58465342 #define _XIAFS_SUPER_MAGIC 0x012FD16D #define AFS_SUPER_MAGIC 0x5346414F #define AUFS_SUPER_MAGIC 0x61756673 #define ANON_INODE_FS_SUPER_MAGIC 0x09041934 #define CEPH_SUPER_MAGIC 0x00C36400 #define ECRYPTFS_SUPER_MAGIC 0xF15F #define FAT_SUPER_MAGIC 0x4006 #define FHGFS_SUPER_MAGIC 0x19830326 #define FUSEBLK_SUPER_MAGIC 0x65735546 #define FUSECTL_SUPER_MAGIC 0x65735543 #define GFS_SUPER_MAGIC 0x1161970 #define GPFS_SUPER_MAGIC 0x47504653 #define MTD_INODE_FS_SUPER_MAGIC 0x11307854 #define INOTIFYFS_SUPER_MAGIC 0x2BAD1DEA #define ISOFS_R_WIN_SUPER_MAGIC 0x4004 #define ISOFS_WIN_SUPER_MAGIC 0x4000 #define JFFS_SUPER_MAGIC 0x07C0 #define KAFS_SUPER_MAGIC 0x6B414653 #define LUSTRE_SUPER_MAGIC 0x0BD00BD0 #define NFSD_SUPER_MAGIC 0x6E667364 #define PANFS_SUPER_MAGIC 0xAAD7AAEA #define RPC_PIPEFS_SUPER_MAGIC 0x67596969 #define SECURITYFS_SUPER_MAGIC 0x73636673 #define UFS_BYTESWAPPED_SUPER_MAGIC 0x54190100 #define VMHGFS_SUPER_MAGIC 0xBACBACBC #define VZFS_SUPER_MAGIC 0x565A4653 #define ZFS_SUPER_MAGIC 0x2FC12FC1 struct filesystem_entry { unsigned id; const char* name; int remote; } FILESYSTEMS[] = { { ADFS_SUPER_MAGIC, "adfs", 0 }, { AFFS_SUPER_MAGIC, "affs", 0 }, { AFS_SUPER_MAGIC, "afs", 1 }, { AUFS_SUPER_MAGIC, "aufs", 1 }, { BEFS_SUPER_MAGIC, "befs", 0 }, { BDEVFS_MAGIC, "bdevfs", 0 }, { BFS_MAGIC, "bfs", 0 }, { BINFMTFS_MAGIC, "binfmt_misc", 0 }, { BTRFS_SUPER_MAGIC, "btrfs", 0 }, { CEPH_SUPER_MAGIC, "ceph", 1 }, { CGROUP_SUPER_MAGIC, "cgroupfs", 0 }, { CIFS_MAGIC_NUMBER, "cifs", 1 }, { CODA_SUPER_MAGIC, "coda", 1 }, { COH_SUPER_MAGIC, "coh", 0 }, { CRAMFS_MAGIC, "cramfs", 0 }, { DEBUGFS_MAGIC, "debugfs", 0 }, { DEVFS_SUPER_MAGIC, "devfs", 0 }, { DEVPTS_SUPER_MAGIC, "devpts", 0 }, { ECRYPTFS_SUPER_MAGIC, "ecryptfs", 0 }, { EFS_SUPER_MAGIC, "efs", 0 }, { EXT_SUPER_MAGIC, "ext", 0 }, { EXT4_SUPER_MAGIC, "ext4", 0 }, { EXT2_OLD_SUPER_MAGIC, "ext2", 0 }, { FAT_SUPER_MAGIC, "fat", 0 }, { FHGFS_SUPER_MAGIC, "fhgfs", 1 }, { FUSEBLK_SUPER_MAGIC, "fuseblk", 1 }, { FUSECTL_SUPER_MAGIC, "fusectl", 1 }, { FUTEXFS_SUPER_MAGIC, "futexfs", 0 }, { GFS_SUPER_MAGIC, "gfs/gfs2", 1 }, { GPFS_SUPER_MAGIC, "gpfs", 1 }, { HFS_SUPER_MAGIC, "hfs", 0 }, { HFSPLUS_SUPER_MAGIC, "hfsplus", 0 }, { HPFS_SUPER_MAGIC, "hpfs", 0 }, { HUGETLBFS_MAGIC, "hugetlbfs", 0 }, { MTD_INODE_FS_SUPER_MAGIC, "inodefs", 0 }, { INOTIFYFS_SUPER_MAGIC, "inotifyfs", 0 }, { ISOFS_SUPER_MAGIC, "isofs", 0 }, { ISOFS_R_WIN_SUPER_MAGIC, "isofs", 0 }, { ISOFS_WIN_SUPER_MAGIC, "isofs", 0 }, { JFFS_SUPER_MAGIC, "jffs", 0 }, { JFFS2_SUPER_MAGIC, "jffs2", 0 }, { JFS_SUPER_MAGIC, "jfs", 0 }, { KAFS_SUPER_MAGIC, "k-afs", 1 }, { LUSTRE_SUPER_MAGIC, "lustre", 1 }, { MINIX_SUPER_MAGIC, "minix", 0 }, { MINIX_SUPER_MAGIC2, "minix", 0 }, { MINIX2_SUPER_MAGIC, "minix2", 0 }, { MINIX2_SUPER_MAGIC2, "minix2", 0 }, { MINIX3_SUPER_MAGIC, "minix3", 0 }, { MQUEUE_MAGIC, "mqueue", 0 }, { MSDOS_SUPER_MAGIC, "msdos", 0 }, { NCP_SUPER_MAGIC, "novell", 1 }, { NFS_SUPER_MAGIC, "nfs", 1 }, { NFSD_SUPER_MAGIC, "nfsd", 1 }, { NILFS_SUPER_MAGIC, "nilfs", 0 }, { NTFS_SB_MAGIC, "ntfs", 0 }, { OPENPROM_SUPER_MAGIC, "openprom", 0 }, { OCFS2_SUPER_MAGIC, "ocfs2", 1 }, { PANFS_SUPER_MAGIC, "panfs", 1 }, { PIPEFS_MAGIC, "pipefs", 1 }, { PROC_SUPER_MAGIC, "proc", 0 }, { PSTOREFS_MAGIC, "pstorefs", 0 }, { QNX4_SUPER_MAGIC, "qnx4", 0 }, { QNX6_SUPER_MAGIC, "qnx6", 0 }, { RAMFS_MAGIC, "ramfs", 0 }, { REISERFS_SUPER_MAGIC, "reiserfs", 0 }, { ROMFS_MAGIC, "romfs", 0 }, { RPC_PIPEFS_SUPER_MAGIC, "rpc_pipefs", 0 }, { SECURITYFS_SUPER_MAGIC, "securityfs", 0 }, { SELINUX_MAGIC, "selinux", 0 }, { SMB_SUPER_MAGIC, "smb", 1 }, { SOCKFS_MAGIC, "sockfs", 0 }, { SQUASHFS_MAGIC, "squashfs", 0 }, { SYSFS_MAGIC, "sysfs", 0 }, { SYSV2_SUPER_MAGIC, "sysv2", 0 }, { SYSV4_SUPER_MAGIC, "sysv4", 0 }, { TMPFS_MAGIC, "tmpfs", 0 }, { UDF_SUPER_MAGIC, "udf", 0 }, { UFS_MAGIC, "ufs", 0 }, { UFS_BYTESWAPPED_SUPER_MAGIC, "ufs", 0 }, { USBDEVICE_SUPER_MAGIC, "usbdevfs", 0 }, { V9FS_MAGIC, "v9fs", 0 }, { VMHGFS_SUPER_MAGIC, "vmhgfs", 1 }, { VXFS_SUPER_MAGIC, "vxfs", 0 }, { VZFS_SUPER_MAGIC, "vzfs", 0 }, { XENFS_SUPER_MAGIC, "xenfs", 0 }, { XENIX_SUPER_MAGIC, "xenix", 0 }, { XFS_SUPER_MAGIC, "xfs", 0 }, { _XIAFS_SUPER_MAGIC, "xia", 0 }, { ZFS_SUPER_MAGIC, "zfs", 0 }, { 0 } }; int fsinfo(const char* path, int* has_persistent_inode, int* has_syncronized_hardlinks, uint64_t* total_space, uint64_t* free_space, char* fstype, size_t fstype_size, char* fslabel, size_t fslabel_size) { #if HAVE_STATFS struct statfs st; if (statfs(path, &st) != 0) { char dir[PATH_MAX]; char* slash; if (errno != ENOENT) { return -1; } /* if it doesn't exist, we assume a file */ /* and we check for the containing dir */ if (strlen(path) + 1 > sizeof(dir)) { errno = ENAMETOOLONG; return -1; } strcpy(dir, path); slash = strrchr(dir, '/'); if (!slash) return -1; *slash = 0; if (statfs(dir, &st) != 0) return -1; } #endif /* to get the fs type check "man stat" or "stat -f -t FILE" */ if (has_persistent_inode) { #if HAVE_STATFS && HAVE_STRUCT_STATFS_F_TYPE switch (st.f_type) { case FUSEBLK_SUPER_MAGIC : /* FUSE, "fuseblk" in the stat command */ case MSDOS_SUPER_MAGIC : /* VFAT, "msdos" in the stat command */ *has_persistent_inode = 0; break; default : /* by default assume yes */ *has_persistent_inode = 1; break; } #else /* in Unix inodes are persistent by default */ *has_persistent_inode = 1; #endif } if (has_syncronized_hardlinks) { #if HAVE_STATFS && HAVE_STRUCT_STATFS_F_TYPE switch (st.f_type) { case NTFS_SB_MAGIC : /* NTFS */ case MSDOS_SUPER_MAGIC : /* VFAT, "msdos" in the stat command */ *has_syncronized_hardlinks = 0; break; default : /* by default assume yes */ *has_syncronized_hardlinks = 1; break; } #else /* in Unix hardlinks share the same metadata by default */ *has_syncronized_hardlinks = 1; #endif } if (total_space) { #if HAVE_STATFS *total_space = st.f_bsize * (uint64_t)st.f_blocks; #else *total_space = 0; #endif } if (free_space) { #if HAVE_STATFS *free_space = st.f_bsize * (uint64_t)st.f_bfree; #else *free_space = 0; #endif } const char* ptype = 0; #if HAVE_STATFS && HAVE_STRUCT_STATFS_F_FSTYPENAME /* get the filesystem type directly from the struct (Mac OS X) */ ptype = st.f_fstypename; #elif HAVE_STATFS && HAVE_STRUCT_STATFS_F_TYPE /* get the filesystem type from f_type (Linux) */ /* from: https://github.com/influxdata/gopsutil/blob/master/disk/disk_linux.go */ for (int i = 0; FILESYSTEMS[i].id != 0; ++i) { if (st.f_type == FILESYSTEMS[i].id) { ptype = FILESYSTEMS[i].name; break; } } #endif if (fstype) { fstype[0] = 0; if (ptype) snprintf(fstype, fstype_size, "%s", ptype); } if (fslabel) { fslabel[0] = 0; #if HAVE_BLKID struct stat fst; if (stat(path, &fst) == 0) devuuid_label(fst.st_dev, fslabel, fslabel_size); #else (void)fslabel_size; #endif } return 0; } uint64_t os_tick(void) { #if HAVE_MACH_ABSOLUTE_TIME /* for Mac OS X */ return mach_absolute_time(); #elif HAVE_CLOCK_GETTIME && (defined(CLOCK_MONOTONIC) || defined(CLOCK_MONOTONIC_RAW)) /* for Linux */ struct timespec tv; /* nanosecond precision with clock_gettime() */ #if defined(CLOCK_MONOTONIC_RAW) if (clock_gettime(CLOCK_MONOTONIC_RAW, &tv) != 0) { #else if (clock_gettime(CLOCK_MONOTONIC, &tv) != 0) { #endif return 0; } return tv.tv_sec * 1000000000ULL + tv.tv_nsec; #else /* other platforms */ struct timeval tv; /* microsecond precision with gettimeofday() */ if (gettimeofday(&tv, 0) != 0) { return 0; } return tv.tv_sec * 1000000ULL + tv.tv_usec; #endif } uint64_t os_tick_ms(void) { struct timeval tv; if (gettimeofday(&tv, 0) != 0) return 0; return tv.tv_sec * 1000ULL + tv.tv_usec / 1000; } int randomize(void* ptr, size_t size) { int f; ssize_t ret; f = open("/dev/urandom", O_RDONLY); if (f == -1) return -1; ret = read(f, ptr, size); if (ret < 0 || (size_t)ret != size) { close(f); return -1; } if (close(f) != 0) return -1; return 0; } /** * Read a file extracting the contained device number in %u:%u format. * Return 0 on error. */ #if HAVE_LINUX_DEVICE static dev_t devread(const char* path) { int f; int ret; int len; char buf[64]; char* e; unsigned ma; unsigned mi; f = open(path, O_RDONLY); if (f == -1) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to open '%s'.\n", path); return 0; /* LCOV_EXCL_STOP */ } len = read(f, buf, sizeof(buf)); if (len < 0) { /* LCOV_EXCL_START */ close(f); log_fatal(errno, "Failed to read '%s'.\n", path); return 0; /* LCOV_EXCL_STOP */ } if (len == sizeof(buf)) { /* LCOV_EXCL_START */ close(f); log_fatal(EEXTERNAL, "Too long read '%s'.\n", path); return 0; /* LCOV_EXCL_STOP */ } ret = close(f); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to close '%s'.\n", path); return 0; /* LCOV_EXCL_STOP */ } buf[len] = 0; ma = strtoul(buf, &e, 10); if (*e != ':') { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Invalid format in '%s' for '%s'.\n", path, buf); return 0; /* LCOV_EXCL_STOP */ } mi = strtoul(e + 1, &e, 10); if (*e != 0 && !isspace((unsigned char)*e)) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Invalid format in '%s' for '%s'.\n", path, buf); return 0; /* LCOV_EXCL_STOP */ } return makedev(ma, mi); } #endif /** * Read a device tree filling the specified list of disk_t entries. */ #if HAVE_LINUX_DEVICE static int devtree(devinfo_t* parent, dev_t device, tommy_list* list) { char path[PATH_MAX]; DIR* d; int slaves = 0; pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/slaves", major(device), minor(device)); /* check if there is a slaves list */ d = opendir(path); if (d != 0) { struct dirent* dd; while ((dd = readdir(d)) != 0) { if (dd->d_name[0] != '.') { dev_t subdev; /* for each slave, expand the full potential tree */ pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/slaves/%s/dev", major(device), minor(device), dd->d_name); subdev = devread(path); if (!subdev) { /* LCOV_EXCL_START */ closedir(d); return -1; /* LCOV_EXCL_STOP */ } if (devtree(parent, subdev, list) != 0) { /* LCOV_EXCL_START */ closedir(d); return -1; /* LCOV_EXCL_STOP */ } ++slaves; } } closedir(d); } /* if no slaves found */ if (!slaves) { /* this is a raw device */ devinfo_t* devinfo; /* check if it's a real device */ pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/device", major(device), minor(device)); if (eaccess(path, F_OK) != 0) { /* get the parent device */ pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/../dev", major(device), minor(device)); device = devread(path); if (!device) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } } /* get the device file */ if (devresolve(device, path, sizeof(path)) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to resolve device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } devinfo = calloc_nofail(1, sizeof(devinfo_t)); devinfo->device = device; pathcpy(devinfo->name, sizeof(devinfo->name), parent->name); pathcpy(devinfo->smartctl, sizeof(devinfo->smartctl), parent->smartctl); memcpy(devinfo->smartignore, parent->smartignore, sizeof(devinfo->smartignore)); pathcpy(devinfo->file, sizeof(devinfo->file), path); devinfo->parent = parent; /* insert in the list */ tommy_list_insert_tail(list, &devinfo->node, devinfo); } return 0; } #endif /** * Compute disk usage by aggregating access statistics. */ #if HAVE_LINUX_DEVICE static int devstat(dev_t device, uint64_t* count) { char path[PATH_MAX]; char buf[512]; int token; int ret; char* i; *count = 0; pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/stat", major(device), minor(device)); ret = sysread(path, buf, sizeof(buf)); if (ret < 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to read '%s'.\n", path); return -1; /* LCOV_EXCL_STOP */ } if ((size_t)ret + 1 > sizeof(buf)) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Too long read '%s'.\n", path); return -1; /* LCOV_EXCL_STOP */ } /* ending 0 */ buf[ret] = 0; i = buf; token = 1; /* token number */ while (*i) { char* n; char* e; unsigned long long v; /* skip spaces */ while (*i && isspace((unsigned char)*i)) ++i; /* read digits */ n = i; while (*i && isdigit((unsigned char)*i)) ++i; if (i == n) /* if no digit, abort */ break; if (*i == 0 || !isspace((unsigned char)*i)) /* if no space, abort */ break; *i++ = 0; /* put a terminator */ v = strtoull(n, &e, 10); if (*e != 0) break; /* sum reads and writes completed */ if (token == 1 || token == 5) { *count += v; if (token == 5) break; /* stop here */ } ++token; } return 0; } #endif /** * Get SMART attributes. */ #if HAVE_LINUX_DEVICE static int devsmart(dev_t device, const char* name, const char* smartctl, struct smart_attr* smart, uint64_t* info, char* serial, char* family, char* model, char* interface) { char cmd[PATH_MAX + 64]; char file[PATH_MAX]; FILE* f; int ret; const char* x; x = find_smartctl(); if (!x) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Cannot find smartctl.\n"); return -1; /* LCOV_EXCL_STOP */ } if (devresolve(device, file, sizeof(file)) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to resolve device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } /* if there is a custom smartctl command */ if (smartctl[0]) { char option[PATH_MAX]; snprintf(option, sizeof(option), smartctl, file); snprintf(cmd, sizeof(cmd), "%s -a %s", x, option); } else { snprintf(cmd, sizeof(cmd), "%s -a %s", x, file); } log_tag("smartctl:%s:%s:run: %s\n", file, name, cmd); f = popen(cmd, "r"); if (!f) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (from popen).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (smartctl_attribute(f, file, name, smart, info, serial, family, model, interface) != 0) { /* LCOV_EXCL_START */ pclose(f); log_tag("device:%s:%s:shell\n", file, name); return -1; /* LCOV_EXCL_STOP */ } ret = pclose(f); log_tag("smartctl:%s:%s:ret: %x\n", file, name, ret); if (!WIFEXITED(ret)) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:abort\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (not exited).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (WEXITSTATUS(ret) == 127) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (from sh).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } /* store the return smartctl return value */ smart[SMART_FLAGS].raw = WEXITSTATUS(ret); return 0; } #endif /** * Get device attributes. */ #if HAVE_LINUX_DEVICE static void devattr(dev_t device, uint64_t* info, char* serial, char* family, char* model, char* interface) { char path[PATH_MAX]; char buf[512]; int ret; (void)family; /* not available, smartctl uses an internal database to get it */ if (info[INFO_SIZE] == SMART_UNASSIGNED) { pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/size", major(device), minor(device)); if (sysattr(path, buf, sizeof(buf)) == 0) { char* e; uint64_t v; v = strtoul(buf, &e, 10); if (*e == 0) info[INFO_SIZE] = v * 512; } } if (info[INFO_ROTATION_RATE] == SMART_UNASSIGNED) { pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/queue/rotational", major(device), minor(device)); if (sysattr(path, buf, sizeof(buf)) == 0) { char* e; uint64_t v; v = strtoul(buf, &e, 10); if (*e == 0) info[INFO_ROTATION_RATE] = v; } } if (*model == 0) { pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/device/model", major(device), minor(device)); if (sysattr(path, buf, sizeof(buf)) == 0) { if (buf[0] != 0) pathcpy(model, SMART_MAX, buf); } } if (*serial == 0) { pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/device/serial", major(device), minor(device)); if (sysattr(path, buf, sizeof(buf)) == 0) { if (buf[0] != 0) pathcpy(serial, SMART_MAX, buf); } } if (*serial == 0) { pathprint(path, sizeof(path), "/sys/dev/block/%u:%u/device/vpd_pg80", major(device), minor(device)); if (sysattr_vpd_pg80(path, buf, sizeof(buf)) == 0) { if (buf[0] != 0) pathcpy(serial, SMART_MAX, buf); } } /* always override interface if it's usb */ pathprint(path, sizeof(path), "/sys/dev/block/%u:%u", major(device), minor(device)); ret = readlink(path, buf, sizeof(buf)); if (ret > 0 && (unsigned)ret < sizeof(buf)) { buf[ret] = 0; if (strstr(buf, "usb") != 0) strcpy(interface, "USB"); } } #endif /** * Get POWER state. */ #if HAVE_LINUX_DEVICE static int devprobe(dev_t device, const char* name, const char* smartctl, int* power, struct smart_attr* smart, uint64_t* info, char* serial, char* family, char* model, char* interface) { char cmd[PATH_MAX + 64]; char file[PATH_MAX]; FILE* f; int ret; const char* x; x = find_smartctl(); if (!x) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Cannot find smartctl.\n"); return -1; /* LCOV_EXCL_STOP */ } if (devresolve(device, file, sizeof(file)) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to resolve device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } /* if there is a custom smartctl command */ if (smartctl[0]) { char option[PATH_MAX]; snprintf(option, sizeof(option), smartctl, file); snprintf(cmd, sizeof(cmd), "%s -n standby,3 -a %s", x, option); } else { snprintf(cmd, sizeof(cmd), "%s -n standby,3 -a %s", x, file); } log_tag("smartctl:%s:%s:run: %s\n", file, name, cmd); f = popen(cmd, "r"); if (!f) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (from popen).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (smartctl_attribute(f, file, name, smart, info, serial, family, model, interface) != 0) { /* LCOV_EXCL_START */ pclose(f); log_tag("device:%s:%s:shell\n", file, name); return -1; /* LCOV_EXCL_STOP */ } ret = pclose(f); log_tag("smartctl:%s:%s:ret: %x\n", file, name, ret); if (!WIFEXITED(ret)) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:abort\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (not exited).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (WEXITSTATUS(ret) == 127) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (from sh).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (WEXITSTATUS(ret) == 3) { log_tag("attr:%s:%s:power:standby\n", file, name); *power = POWER_STANDBY; } else { log_tag("attr:%s:%s:power:active\n", file, name); *power = POWER_ACTIVE; /* store the smartctl return value */ if (smart) smart[SMART_FLAGS].raw = WEXITSTATUS(ret); } return 0; } #endif /** * Spin down a specific device. */ #if HAVE_LINUX_DEVICE static int devdown(dev_t device, const char* name, const char* smartctl) { char cmd[PATH_MAX + 64]; char file[PATH_MAX]; FILE* f; int ret; const char* x; x = find_smartctl(); if (!x) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Cannot find smartctl.\n"); return -1; /* LCOV_EXCL_STOP */ } if (devresolve(device, file, sizeof(file)) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to resolve device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } /* if there is a custom smartctl command */ if (smartctl[0]) { char option[PATH_MAX]; snprintf(option, sizeof(option), smartctl, file); snprintf(cmd, sizeof(cmd), "%s -s standby,now %s", x, option); } else { snprintf(cmd, sizeof(cmd), "%s -s standby,now %s", x, file); } log_tag("smartctl:%s:%s:run: %s\n", file, name, cmd); f = popen(cmd, "r"); if (!f) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (from popen).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (smartctl_flush(f, file, name) != 0) { /* LCOV_EXCL_START */ pclose(f); log_tag("device:%s:%s:shell\n", file, name); return -1; /* LCOV_EXCL_STOP */ } ret = pclose(f); log_tag("smartctl:%s:%s:ret: %x\n", file, name, ret); if (!WIFEXITED(ret)) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:abort\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (not exited).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (WEXITSTATUS(ret) == 127) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:shell\n", file, name); log_fatal(EEXTERNAL, "Failed to run '%s' (from sh).\n", cmd); return -1; /* LCOV_EXCL_STOP */ } if (WEXITSTATUS(ret) != 0) { /* LCOV_EXCL_START */ log_tag("device:%s:%s:exit:%d\n", file, name, WEXITSTATUS(ret)); log_fatal(EEXTERNAL, "Failed to run '%s' with return code %xh.\n", cmd, WEXITSTATUS(ret)); return -1; /* LCOV_EXCL_STOP */ } log_tag("attr:%s:%s:power:down\n", file, name); return 0; } #endif /** * Spin down a specific device if it's up. */ #if HAVE_LINUX_DEVICE static int devdownifup(dev_t device, const char* name, const char* smartctl, int* power) { *power = POWER_UNKNOWN; if (devprobe(device, name, smartctl, power, 0, 0, 0, 0, 0, 0) != 0) return -1; if (*power == POWER_ACTIVE) return devdown(device, name, smartctl); return 0; } #endif /** * Spin up a specific device. */ #if HAVE_LINUX_DEVICE static int devup(dev_t device, const char* name) { char file[PATH_MAX]; int ret; int f; void* buf; uint64_t size; uint64_t offset; if (devresolve(device, file, sizeof(file)) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to resolve device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } /* O_DIRECT requires memory aligned to the block size */ if (posix_memalign(&buf, 4096, 4096) != 0) { /* LCOV_EXCL_START */ log_fatal(errno, "Failed to allocate aligned memory for device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } f = open(file, O_RDONLY | O_DIRECT); if (f < 0) { /* LCOV_EXCL_START */ free(buf); log_tag("device:%s:%s:error:%d\n", file, name, errno); log_fatal(errno, "Failed to open device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } if (ioctl(f, BLKGETSIZE64, &size) < 0) { /* LCOV_EXCL_START */ close(f); free(buf); log_tag("device:%s:%s:error:%d\n", file, name, errno); log_fatal(errno, "Failed to get device size '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } /* select a random offset */ uint64_t blocks = size / 4096; offset = blocks > 0 ? (random_u64() % blocks) * 4096 : 0; #if HAVE_POSIX_FADVISE /* clear cache */ ret = posix_fadvise_wrapper(f, offset, 4096, POSIX_FADV_DONTNEED); if (ret == ENOSYS) { /* call is not supported */ ret = 0; } if (ret != 0) { /* LCOV_EXCL_START */ close(f); free(buf); log_tag("device:%s:%s:error:%d\n", file, name, errno); log_fatal(errno, "Failed to advise device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } #endif ret = pread(f, buf, 4096, offset); if (ret < 0) { /* LCOV_EXCL_START */ close(f); free(buf); log_tag("device:%s:%s:error:%d\n", file, name, errno); log_fatal(errno, "Failed to read device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } ret = close(f); if (ret < 0) { /* LCOV_EXCL_START */ free(buf); log_tag("device:%s:%s:error:%d\n", file, name, errno); log_fatal(errno, "Failed to close device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } log_tag("attr:%s:%s:power:up\n", file, name); free(buf); return 0; } #endif /** * Thread for spinning up. * * Note that filling up the devinfo object is done inside this thread, * to avoid to block the main thread if the device need to be spin up * to handle stat/resolve requests. */ static void* thread_spinup(void* arg) { #if HAVE_LINUX_DEVICE devinfo_t* devinfo = arg; uint64_t start; start = os_tick_ms(); if (devup(devinfo->device, devinfo->name) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } msg_status("Spunup device '%s' for disk '%s' in %" PRIu64 " ms.\n", devinfo->file, devinfo->name, os_tick_ms() - start); /* after the spin up, get SMART info */ if (devsmart(devinfo->device, devinfo->name, devinfo->smartctl, devinfo->smart, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } /* * Retrieve some attributes directly from the system. * * smartctl intentionally skips queries on devices in standby mode * to prevent accidentally spinning them up. */ devattr(devinfo->device, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf); return 0; #else (void)arg; return (void*)-1; #endif } /** * Thread for spinning down. */ static void* thread_spindown(void* arg) { #if HAVE_LINUX_DEVICE devinfo_t* devinfo = arg; uint64_t start; start = os_tick_ms(); if (devdown(devinfo->device, devinfo->name, devinfo->smartctl) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } msg_status("Spundown device '%s' for disk '%s' in %" PRIu64 " ms.\n", devinfo->file, devinfo->name, os_tick_ms() - start); return 0; #else (void)arg; return (void*)-1; #endif } /** * Thread for spinning down. */ static void* thread_spindownifup(void* arg) { #if HAVE_LINUX_DEVICE devinfo_t* devinfo = arg; uint64_t start; int power; start = os_tick_ms(); if (devdownifup(devinfo->device, devinfo->name, devinfo->smartctl, &power) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } if (power == POWER_ACTIVE) msg_status("Spundown device '%s' for disk '%s' in %" PRIu64 " ms.\n", devinfo->file, devinfo->name, os_tick_ms() - start); return 0; #else (void)arg; return (void*)-1; #endif } /** * Thread for getting smart info. */ static void* thread_smart(void* arg) { #if HAVE_LINUX_DEVICE devinfo_t* devinfo = arg; if (devsmart(devinfo->device, devinfo->name, devinfo->smartctl, devinfo->smart, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } /* * Retrieve some attributes directly from the system. * * smartctl intentionally skips queries on devices in standby mode * to prevent accidentally spinning them up. */ devattr(devinfo->device, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf); return 0; #else (void)arg; return (void*)-1; #endif } /** * Thread for getting power info. */ static void* thread_probe(void* arg) { #if HAVE_LINUX_DEVICE devinfo_t* devinfo = arg; if (devprobe(devinfo->device, devinfo->name, devinfo->smartctl, &devinfo->power, devinfo->smart, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf) != 0) { /* LCOV_EXCL_START */ return (void*)-1; /* LCOV_EXCL_STOP */ } /* * Retrieve some attributes directly from the system. * * smartctl intentionally skips queries on devices in standby mode * to prevent accidentally spinning them up. */ devattr(devinfo->device, devinfo->info, devinfo->serial, devinfo->family, devinfo->model, devinfo->interf); return 0; #else (void)arg; return (void*)-1; #endif } static int device_thread(tommy_list* list, void* (*func)(void* arg)) { int fail = 0; tommy_node* i; #if HAVE_THREAD /* start all threads */ for (i = tommy_list_head(list); i != 0; i = i->next) { devinfo_t* devinfo = i->data; thread_create(&devinfo->thread, func, devinfo); } /* join all threads */ for (i = tommy_list_head(list); i != 0; i = i->next) { devinfo_t* devinfo = i->data; void* retval; thread_join(devinfo->thread, &retval); if (retval != 0) ++fail; } #else for (i = tommy_list_head(list); i != 0; i = i->next) { devinfo_t* devinfo = i->data; if (func(devinfo) != 0) ++fail; } #endif if (fail != 0) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } return 0; } int devquery(tommy_list* high, tommy_list* low, int operation) { void* (*func)(void* arg) = 0; #if HAVE_LINUX_DEVICE tommy_node* i; struct stat st; /* sysfs interface is required */ if (stat("/sys/dev/block", &st) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Missing interface /sys/dev/block.\n"); return -1; /* LCOV_EXCL_STOP */ } /* for each high device */ for (i = tommy_list_head(high); i != 0; i = i->next) { devinfo_t* devinfo = i->data; uint64_t device = devinfo->device; uint64_t access_stat; #if HAVE_SYNCFS if (operation == DEVICE_DOWN) { /* flush the high level filesystem before spinning down */ int f = open(devinfo->mount, O_RDONLY); if (f >= 0) { syncfs(f); close(f); } } #endif /* if the major is the null device, find the real one */ if (major(device) == 0) { /* obtain the real device */ if (devdereference(device, &device) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to dereference device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } } /* retrieve access stat for the high level device */ if (devstat(device, &access_stat) == 0) { /* cumulate access stat in the first split */ if (devinfo->split) devinfo->split->access_stat += access_stat; else devinfo->access_stat += access_stat; } /* get the device file */ if (devresolve(device, devinfo->file, sizeof(devinfo->file)) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to resolve device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } /* expand the tree of devices */ if (devtree(devinfo, device, low) != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "Failed to expand device '%u:%u'.\n", major(device), minor(device)); return -1; /* LCOV_EXCL_STOP */ } } #else (void)high; #endif switch (operation) { case DEVICE_UP : func = thread_spinup; break; case DEVICE_DOWN : func = thread_spindown; break; case DEVICE_SMART : func = thread_smart; break; case DEVICE_PROBE : func = thread_probe; break; case DEVICE_DOWNIFUP : func = thread_spindownifup; break; } if (!func) return 0; return device_thread(low, func); } void os_default_conf(char* conf, size_t conf_size, const char* argv0) { (void)argv0; #ifdef SYSCONFDIR /* if it exists, give precedence at sysconfdir, usually /usr/local/etc */ if (eaccess(SYSCONFDIR "/" PACKAGE ".conf", F_OK) == 0) { pathcpy(conf, conf_size, SYSCONFDIR "/" PACKAGE ".conf"); } else /* otherwise fallback to plain /etc */ #endif { pathcpy(conf, conf_size, "/etc/" PACKAGE ".conf"); } } void os_init(int opt) { #if HAVE_BLKID int ret; ret = blkid_get_cache(&cache, NULL); if (ret != 0) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "WARNING Failed to get blkid cache\n"); /* LCOV_EXCL_STOP */ } #endif /* set LC_ALL=C to make smartctl ignoring the locale when printing info */ setenv("LC_ALL", "C", 1); (void)opt; } void os_done(void) { #if HAVE_BLKID if (cache != 0) blkid_put_cache(cache); #endif } /* LCOV_EXCL_START */ void os_abort(void) { #if HAVE_BACKTRACE && HAVE_BACKTRACE_SYMBOLS void* stack[32]; char** messages; size_t size; unsigned i; #endif printf("Stacktrace of " PACKAGE " v" VERSION); #ifdef _linux printf(", linux"); #endif #ifdef __GNUC__ printf(", gcc " __VERSION__); #endif printf(", %d-bit", (int)sizeof(void*) * 8); printf(", PATH_MAX=%d", PATH_MAX); printf("\n"); #if HAVE_BACKTRACE && HAVE_BACKTRACE_SYMBOLS size = backtrace(stack, 32); messages = backtrace_symbols(stack, size); for (i = 1; i < size; ++i) { const char* msg; if (messages) msg = messages[i]; else msg = ""; printf("[bt] %02u: %s\n", i, msg); if (messages) { int ret; char addr2line[1024]; size_t j = 0; while (msg[j] != '(' && msg[j] != ' ' && msg[j] != 0) ++j; snprintf(addr2line, sizeof(addr2line), "addr2line %p -e %.*s", stack[i], (unsigned)j, msg); ret = system(addr2line); if (WIFEXITED(ret) && WEXITSTATUS(ret) != 0) printf("exit:%d\n", WEXITSTATUS(ret)); if (WIFSIGNALED(ret)) printf("signal:%d\n", WTERMSIG(ret)); } } #endif printf("Please report this error to the SnapRAID Forum:\n"); printf("https://sourceforge.net/p/snapraid/discussion/1677233/\n"); abort(); } /* LCOV_EXCL_STOP */ void os_clear(void) { /* ANSI codes */ printf("\033[H"); /* cursor at topleft */ printf("\033[2J"); /* clear screen */ } size_t direct_size(void) { long size; size = sysconf(_SC_PAGESIZE); if (size == -1) { /* LCOV_EXCL_START */ log_fatal(EEXTERNAL, "No page size\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return size; } #if HAVE_LINUX_DEVICE /* List of possible ambient temperature labels */ const char* AMBIENT_LABEL[] = { "systin", "auxtin", "mb", "m/b", "board", "motherboard", "system", "chassis", "case", "room", "ambient", 0 }; int ambient_temperature(void) { DIR* dir; struct dirent* entry; int lowest_temp = 0; dir = opendir("/sys/class/hwmon"); if (!dir) return 0; /* iterate through hwmon devices */ while ((entry = readdir(dir)) != NULL) { char path[PATH_MAX]; DIR* hwmon_dir; struct dirent* hwmon_entry; if (strncmp(entry->d_name, "hwmon", 5) != 0) continue; pathprint(path, sizeof(path), "/sys/class/hwmon/%s", entry->d_name); /* iterate through temp*_input files */ hwmon_dir = opendir(path); if (!hwmon_dir) continue; while ((hwmon_entry = readdir(hwmon_dir)) != NULL) { char hwmon_name[PATH_MAX]; char value[128]; char name[128]; char label[128]; char* dash; char* e; long temp; if (strncmp(hwmon_entry->d_name, "temp", 4) != 0) continue; /* make a copy to allow modifications in place */ pathcpy(hwmon_name, sizeof(hwmon_name), hwmon_entry->d_name); dash = strrchr(hwmon_name, '_'); if (dash == 0) continue; if (strcmp(dash, "_input") != 0) continue; /* read the temperature */ pathprint(path, sizeof(path), "/sys/class/hwmon/%s/%s", entry->d_name, hwmon_name); if (sysattr(path, value, sizeof(value)) != 0) continue; temp = strtol(value, &e, 10) / 1000; if (*e != 0 && !isspace((unsigned char)*e)) continue; /* cut the file name at "_input" */ *dash = 0; /* read the corresponding name */ pathprint(path, sizeof(path), "/sys/class/hwmon/%s/name", entry->d_name); if (sysattr(path, name, sizeof(name)) != 0) { /* fallback to using the hwmon name */ pathcpy(name, sizeof(name), entry->d_name); } /* read the corresponding label file */ pathprint(path, sizeof(path), "/sys/class/hwmon/%s/%s_label", entry->d_name, hwmon_name); if (sysattr(path, label, sizeof(label)) != 0) { /* fallback to using the temp* name (e.g., temp1, temp2) */ pathcpy(label, sizeof(label), hwmon_name); } log_tag("thermal:ambient:device:%s:%s:%s:%s:%ld\n", entry->d_name, name, hwmon_name, label, temp); /* check if temperature is in reasonable range */ if (temp < 15 || temp > 40) continue; /* lower case */ strlwr(label); /* check if label matches possible ambient labels */ for (int i = 0; AMBIENT_LABEL[i]; ++i) { if (worddigitstr(label, AMBIENT_LABEL[i]) != 0) { log_tag("thermal:ambient:candidate:%ld\n", temp); if (lowest_temp == 0 || lowest_temp > temp) lowest_temp = temp; break; } } /* accept also generic "temp1" */ if (strcmp(label, "temp1") == 0) { log_tag("thermal:ambient:candidate:%ld\n", temp); if (lowest_temp == 0 || lowest_temp > temp) lowest_temp = temp; } } closedir(hwmon_dir); } closedir(dir); return lowest_temp; } #else int ambient_temperature(void) { return 0; } #endif int devmap(void) { #if HAVE_LINUX_DEVICE char path[PATH_MAX]; DIR* d = opendir("/sys/block"); if (!d) return -1; struct dirent* dd; while (1) { char buf[256]; dd = readdir(d); if (dd == 0) break; if (dd->d_name[0] == '.') continue; /* verify it has a hardware device link (excludes virtual disks) */ pathprint(path, sizeof(path), "/sys/block/%s/device", dd->d_name); if (eaccess(path, F_OK) != 0) continue; /* device/serial */ pathprint(path, sizeof(path), "/sys/block/%s/device/serial", dd->d_name); if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); } /* device/vpd_pg80 */ pathprint(path, sizeof(path), "/sys/block/%s/device/vpd_pg80", dd->d_name); if (sysattr_vpd_pg80(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); } /* device/vpd_pg83 */ pathprint(path, sizeof(path), "/sys/block/%s/device/vpd_pg83", dd->d_name); if (sysattr_vpd_pg83(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:naa.%s\n", dd->d_name, esc_tag(buf)); } /* device/WWN */ pathprint(path, sizeof(path), "/sys/block/%s/device/wwn", dd->d_name); if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); } /* device/WWID */ pathprint(path, sizeof(path), "/sys/block/%s/device/wwid", dd->d_name); if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); } /* WWN */ pathprint(path, sizeof(path), "/sys/block/%s/wwn", dd->d_name); if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); } /* WWID */ pathprint(path, sizeof(path), "/sys/block/%s/wwid", dd->d_name); if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); } /* uuid */ pathprint(path, sizeof(path), "/sys/block/%s/uuid", dd->d_name); if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); } } closedir(d); #endif return 0; } #endif snapraid-14.9/cmdline/unix.h000066400000000000000000000034341522717156100160320ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __UNIX_H #define __UNIX_H #ifdef __linux__ #define HAVE_LINUX_DEVICE 1 /**< In Linux enables special device support. */ #define HAVE_DIRECT_IO 1 /**< Support O_DIRECT in open(). */ #endif #define O_BINARY 0 /**< Not used in Unix. */ #define O_SEQUENTIAL 0 /**< In Unix posix_fadvise() shall be used. */ #if HAVE_POSIX_FADVISE int posix_fadvise_wrapper(int fd, off_t offset, off_t len, int advice); #endif /** * If nanoseconds are not supported, we report the special STAT_NSEC_INVALID value, * to mark that it's undefined. */ #define STAT_NSEC_INVALID -1 /* Check if we have nanoseconds support */ #if HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC #define STAT_NSEC(st) ((int)(st)->st_mtim.tv_nsec) /* Linux */ #elif HAVE_STRUCT_STAT_ST_MTIMENSEC #define STAT_NSEC(st) ((int)(st)->st_mtimensec) /* NetBSD */ #elif HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC #define STAT_NSEC(st) ((int)(st)->st_mtimespec.tv_nsec) /* FreeBSD, Mac OS X */ #else #define STAT_NSEC(st) STAT_NSEC_INVALID #endif /** * Open a file with the O_NOATIME flag to avoid to update the access time. */ int open_noatime(const char* file, int flags); /** * Check if the specified file is hidden. */ int dirent_hidden(struct dirent* dd); /** * Return a description of the file type. */ const char* stat_desc(struct stat* st); /** * Return the alignment requirement for direct IO. */ size_t direct_size(void); /****************************************************************************/ /* thread */ #if HAVE_PTHREAD_H #include #endif #if HAVE_PTHREAD_CREATE #define HAVE_THREAD 1 typedef pthread_t thread_id_t; typedef pthread_mutex_t thread_mutex_t; typedef pthread_cond_t thread_cond_t; typedef pthread_key_t thread_key_t; #endif #endif snapraid-14.9/cmdline/util.c000066400000000000000000000617401522717156100160230ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #include "portable.h" #include "support.h" #include "util.h" #include "raid/cpu.h" #include "raid/memory.h" /****************************************************************************/ /* memory */ void* malloc_nofail_align(size_t size, void** freeptr) { void* ptr; ptr = raid_malloc(size, freeptr); if (!ptr) { /* LCOV_EXCL_START */ malloc_fail(size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return ptr; } void* malloc_nofail_direct(size_t size, void** freeptr) { void* ptr; ptr = raid_malloc_align(size, direct_size(), freeptr); if (!ptr) { /* LCOV_EXCL_START */ malloc_fail(size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return ptr; } void** malloc_nofail_vector_align(int nd, int n, size_t size, void** freeptr) { void* ptr; ptr = raid_malloc_vector(nd, n, size, freeptr); if (!ptr) { /* LCOV_EXCL_START */ malloc_fail(n * size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return ptr; } void** malloc_nofail_vector_direct(int nd, int n, size_t size, void** freeptr) { void* ptr; ptr = raid_malloc_vector_align(nd, n, size, direct_size(), 0, freeptr); if (!ptr) { /* LCOV_EXCL_START */ malloc_fail(n * size); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } return ptr; } void* malloc_nofail_test(size_t size) { void* ptr; ptr = malloc_nofail(size); mtest_vector(1, size, &ptr); return ptr; } /** * Fast memory test. * * It's similar at raid_mtest_vector() but faster because * we have a lot of buffers to verify. */ static int fast_mtest_vector(int n, size_t size, void** vv) { int i, j; /* test with all the bits */ for (i = 0; i < 8; ++i) { unsigned char value = 1 << i; /* fill first */ memset(vv[0], value, size); /* copy to the next */ for (j = 1; j < n; ++j) memcpy(vv[j], vv[j - 1], size); /* compare with the previous */ for (j = 1; j <= n; ++j) if (memcmp(vv[j % n], vv[j - 1], size) != 0) return -1; } return 0; } void mtest_vector(int n, size_t size, void** vv) { if (fast_mtest_vector(n, size, vv) != 0) { /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "DANGER! Your RAM memory is broken! DO NOT PROCEED UNTIL FIXED!\n"); log_fatal(EINTERNAL, "Try running a memory test like http://www.memtest86.com/\n"); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } /****************************************************************************/ /* crc */ uint32_t CRC32C_0[256] = { 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb, 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b, 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24, 0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b, 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384, 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54, 0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b, 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a, 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, 0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5, 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa, 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, 0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a, 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a, 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, 0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48, 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957, 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687, 0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198, 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927, 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38, 0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8, 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7, 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096, 0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789, 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859, 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, 0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9, 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6, 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36, 0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829, 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c, 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93, 0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043, 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c, 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3, 0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc, 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c, 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, 0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652, 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d, 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, 0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982, 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d, 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622, 0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2, 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed, 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530, 0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f, 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff, 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, 0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f, 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540, 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, 0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f, 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee, 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, 0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321, 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e, 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81, 0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e, 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e, 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351 }; uint32_t CRC32C_1[256] = { 0x00000000, 0x13a29877, 0x274530ee, 0x34e7a899, 0x4e8a61dc, 0x5d28f9ab, 0x69cf5132, 0x7a6dc945, 0x9d14c3b8, 0x8eb65bcf, 0xba51f356, 0xa9f36b21, 0xd39ea264, 0xc03c3a13, 0xf4db928a, 0xe7790afd, 0x3fc5f181, 0x2c6769f6, 0x1880c16f, 0x0b225918, 0x714f905d, 0x62ed082a, 0x560aa0b3, 0x45a838c4, 0xa2d13239, 0xb173aa4e, 0x859402d7, 0x96369aa0, 0xec5b53e5, 0xfff9cb92, 0xcb1e630b, 0xd8bcfb7c, 0x7f8be302, 0x6c297b75, 0x58ced3ec, 0x4b6c4b9b, 0x310182de, 0x22a31aa9, 0x1644b230, 0x05e62a47, 0xe29f20ba, 0xf13db8cd, 0xc5da1054, 0xd6788823, 0xac154166, 0xbfb7d911, 0x8b507188, 0x98f2e9ff, 0x404e1283, 0x53ec8af4, 0x670b226d, 0x74a9ba1a, 0x0ec4735f, 0x1d66eb28, 0x298143b1, 0x3a23dbc6, 0xdd5ad13b, 0xcef8494c, 0xfa1fe1d5, 0xe9bd79a2, 0x93d0b0e7, 0x80722890, 0xb4958009, 0xa737187e, 0xff17c604, 0xecb55e73, 0xd852f6ea, 0xcbf06e9d, 0xb19da7d8, 0xa23f3faf, 0x96d89736, 0x857a0f41, 0x620305bc, 0x71a19dcb, 0x45463552, 0x56e4ad25, 0x2c896460, 0x3f2bfc17, 0x0bcc548e, 0x186eccf9, 0xc0d23785, 0xd370aff2, 0xe797076b, 0xf4359f1c, 0x8e585659, 0x9dface2e, 0xa91d66b7, 0xbabffec0, 0x5dc6f43d, 0x4e646c4a, 0x7a83c4d3, 0x69215ca4, 0x134c95e1, 0x00ee0d96, 0x3409a50f, 0x27ab3d78, 0x809c2506, 0x933ebd71, 0xa7d915e8, 0xb47b8d9f, 0xce1644da, 0xddb4dcad, 0xe9537434, 0xfaf1ec43, 0x1d88e6be, 0x0e2a7ec9, 0x3acdd650, 0x296f4e27, 0x53028762, 0x40a01f15, 0x7447b78c, 0x67e52ffb, 0xbf59d487, 0xacfb4cf0, 0x981ce469, 0x8bbe7c1e, 0xf1d3b55b, 0xe2712d2c, 0xd69685b5, 0xc5341dc2, 0x224d173f, 0x31ef8f48, 0x050827d1, 0x16aabfa6, 0x6cc776e3, 0x7f65ee94, 0x4b82460d, 0x5820de7a, 0xfbc3faf9, 0xe861628e, 0xdc86ca17, 0xcf245260, 0xb5499b25, 0xa6eb0352, 0x920cabcb, 0x81ae33bc, 0x66d73941, 0x7575a136, 0x419209af, 0x523091d8, 0x285d589d, 0x3bffc0ea, 0x0f186873, 0x1cbaf004, 0xc4060b78, 0xd7a4930f, 0xe3433b96, 0xf0e1a3e1, 0x8a8c6aa4, 0x992ef2d3, 0xadc95a4a, 0xbe6bc23d, 0x5912c8c0, 0x4ab050b7, 0x7e57f82e, 0x6df56059, 0x1798a91c, 0x043a316b, 0x30dd99f2, 0x237f0185, 0x844819fb, 0x97ea818c, 0xa30d2915, 0xb0afb162, 0xcac27827, 0xd960e050, 0xed8748c9, 0xfe25d0be, 0x195cda43, 0x0afe4234, 0x3e19eaad, 0x2dbb72da, 0x57d6bb9f, 0x447423e8, 0x70938b71, 0x63311306, 0xbb8de87a, 0xa82f700d, 0x9cc8d894, 0x8f6a40e3, 0xf50789a6, 0xe6a511d1, 0xd242b948, 0xc1e0213f, 0x26992bc2, 0x353bb3b5, 0x01dc1b2c, 0x127e835b, 0x68134a1e, 0x7bb1d269, 0x4f567af0, 0x5cf4e287, 0x04d43cfd, 0x1776a48a, 0x23910c13, 0x30339464, 0x4a5e5d21, 0x59fcc556, 0x6d1b6dcf, 0x7eb9f5b8, 0x99c0ff45, 0x8a626732, 0xbe85cfab, 0xad2757dc, 0xd74a9e99, 0xc4e806ee, 0xf00fae77, 0xe3ad3600, 0x3b11cd7c, 0x28b3550b, 0x1c54fd92, 0x0ff665e5, 0x759baca0, 0x663934d7, 0x52de9c4e, 0x417c0439, 0xa6050ec4, 0xb5a796b3, 0x81403e2a, 0x92e2a65d, 0xe88f6f18, 0xfb2df76f, 0xcfca5ff6, 0xdc68c781, 0x7b5fdfff, 0x68fd4788, 0x5c1aef11, 0x4fb87766, 0x35d5be23, 0x26772654, 0x12908ecd, 0x013216ba, 0xe64b1c47, 0xf5e98430, 0xc10e2ca9, 0xd2acb4de, 0xa8c17d9b, 0xbb63e5ec, 0x8f844d75, 0x9c26d502, 0x449a2e7e, 0x5738b609, 0x63df1e90, 0x707d86e7, 0x0a104fa2, 0x19b2d7d5, 0x2d557f4c, 0x3ef7e73b, 0xd98eedc6, 0xca2c75b1, 0xfecbdd28, 0xed69455f, 0x97048c1a, 0x84a6146d, 0xb041bcf4, 0xa3e32483 }; uint32_t CRC32C_2[256] = { 0x00000000, 0xa541927e, 0x4f6f520d, 0xea2ec073, 0x9edea41a, 0x3b9f3664, 0xd1b1f617, 0x74f06469, 0x38513ec5, 0x9d10acbb, 0x773e6cc8, 0xd27ffeb6, 0xa68f9adf, 0x03ce08a1, 0xe9e0c8d2, 0x4ca15aac, 0x70a27d8a, 0xd5e3eff4, 0x3fcd2f87, 0x9a8cbdf9, 0xee7cd990, 0x4b3d4bee, 0xa1138b9d, 0x045219e3, 0x48f3434f, 0xedb2d131, 0x079c1142, 0xa2dd833c, 0xd62de755, 0x736c752b, 0x9942b558, 0x3c032726, 0xe144fb14, 0x4405696a, 0xae2ba919, 0x0b6a3b67, 0x7f9a5f0e, 0xdadbcd70, 0x30f50d03, 0x95b49f7d, 0xd915c5d1, 0x7c5457af, 0x967a97dc, 0x333b05a2, 0x47cb61cb, 0xe28af3b5, 0x08a433c6, 0xade5a1b8, 0x91e6869e, 0x34a714e0, 0xde89d493, 0x7bc846ed, 0x0f382284, 0xaa79b0fa, 0x40577089, 0xe516e2f7, 0xa9b7b85b, 0x0cf62a25, 0xe6d8ea56, 0x43997828, 0x37691c41, 0x92288e3f, 0x78064e4c, 0xdd47dc32, 0xc76580d9, 0x622412a7, 0x880ad2d4, 0x2d4b40aa, 0x59bb24c3, 0xfcfab6bd, 0x16d476ce, 0xb395e4b0, 0xff34be1c, 0x5a752c62, 0xb05bec11, 0x151a7e6f, 0x61ea1a06, 0xc4ab8878, 0x2e85480b, 0x8bc4da75, 0xb7c7fd53, 0x12866f2d, 0xf8a8af5e, 0x5de93d20, 0x29195949, 0x8c58cb37, 0x66760b44, 0xc337993a, 0x8f96c396, 0x2ad751e8, 0xc0f9919b, 0x65b803e5, 0x1148678c, 0xb409f5f2, 0x5e273581, 0xfb66a7ff, 0x26217bcd, 0x8360e9b3, 0x694e29c0, 0xcc0fbbbe, 0xb8ffdfd7, 0x1dbe4da9, 0xf7908dda, 0x52d11fa4, 0x1e704508, 0xbb31d776, 0x511f1705, 0xf45e857b, 0x80aee112, 0x25ef736c, 0xcfc1b31f, 0x6a802161, 0x56830647, 0xf3c29439, 0x19ec544a, 0xbcadc634, 0xc85da25d, 0x6d1c3023, 0x8732f050, 0x2273622e, 0x6ed23882, 0xcb93aafc, 0x21bd6a8f, 0x84fcf8f1, 0xf00c9c98, 0x554d0ee6, 0xbf63ce95, 0x1a225ceb, 0x8b277743, 0x2e66e53d, 0xc448254e, 0x6109b730, 0x15f9d359, 0xb0b84127, 0x5a968154, 0xffd7132a, 0xb3764986, 0x1637dbf8, 0xfc191b8b, 0x595889f5, 0x2da8ed9c, 0x88e97fe2, 0x62c7bf91, 0xc7862def, 0xfb850ac9, 0x5ec498b7, 0xb4ea58c4, 0x11abcaba, 0x655baed3, 0xc01a3cad, 0x2a34fcde, 0x8f756ea0, 0xc3d4340c, 0x6695a672, 0x8cbb6601, 0x29faf47f, 0x5d0a9016, 0xf84b0268, 0x1265c21b, 0xb7245065, 0x6a638c57, 0xcf221e29, 0x250cde5a, 0x804d4c24, 0xf4bd284d, 0x51fcba33, 0xbbd27a40, 0x1e93e83e, 0x5232b292, 0xf77320ec, 0x1d5de09f, 0xb81c72e1, 0xccec1688, 0x69ad84f6, 0x83834485, 0x26c2d6fb, 0x1ac1f1dd, 0xbf8063a3, 0x55aea3d0, 0xf0ef31ae, 0x841f55c7, 0x215ec7b9, 0xcb7007ca, 0x6e3195b4, 0x2290cf18, 0x87d15d66, 0x6dff9d15, 0xc8be0f6b, 0xbc4e6b02, 0x190ff97c, 0xf321390f, 0x5660ab71, 0x4c42f79a, 0xe90365e4, 0x032da597, 0xa66c37e9, 0xd29c5380, 0x77ddc1fe, 0x9df3018d, 0x38b293f3, 0x7413c95f, 0xd1525b21, 0x3b7c9b52, 0x9e3d092c, 0xeacd6d45, 0x4f8cff3b, 0xa5a23f48, 0x00e3ad36, 0x3ce08a10, 0x99a1186e, 0x738fd81d, 0xd6ce4a63, 0xa23e2e0a, 0x077fbc74, 0xed517c07, 0x4810ee79, 0x04b1b4d5, 0xa1f026ab, 0x4bdee6d8, 0xee9f74a6, 0x9a6f10cf, 0x3f2e82b1, 0xd50042c2, 0x7041d0bc, 0xad060c8e, 0x08479ef0, 0xe2695e83, 0x4728ccfd, 0x33d8a894, 0x96993aea, 0x7cb7fa99, 0xd9f668e7, 0x9557324b, 0x3016a035, 0xda386046, 0x7f79f238, 0x0b899651, 0xaec8042f, 0x44e6c45c, 0xe1a75622, 0xdda47104, 0x78e5e37a, 0x92cb2309, 0x378ab177, 0x437ad51e, 0xe63b4760, 0x0c158713, 0xa954156d, 0xe5f54fc1, 0x40b4ddbf, 0xaa9a1dcc, 0x0fdb8fb2, 0x7b2bebdb, 0xde6a79a5, 0x3444b9d6, 0x91052ba8 }; uint32_t CRC32C_3[256] = { 0x00000000, 0xdd45aab8, 0xbf672381, 0x62228939, 0x7b2231f3, 0xa6679b4b, 0xc4451272, 0x1900b8ca, 0xf64463e6, 0x2b01c95e, 0x49234067, 0x9466eadf, 0x8d665215, 0x5023f8ad, 0x32017194, 0xef44db2c, 0xe964b13d, 0x34211b85, 0x560392bc, 0x8b463804, 0x924680ce, 0x4f032a76, 0x2d21a34f, 0xf06409f7, 0x1f20d2db, 0xc2657863, 0xa047f15a, 0x7d025be2, 0x6402e328, 0xb9474990, 0xdb65c0a9, 0x06206a11, 0xd725148b, 0x0a60be33, 0x6842370a, 0xb5079db2, 0xac072578, 0x71428fc0, 0x136006f9, 0xce25ac41, 0x2161776d, 0xfc24ddd5, 0x9e0654ec, 0x4343fe54, 0x5a43469e, 0x8706ec26, 0xe524651f, 0x3861cfa7, 0x3e41a5b6, 0xe3040f0e, 0x81268637, 0x5c632c8f, 0x45639445, 0x98263efd, 0xfa04b7c4, 0x27411d7c, 0xc805c650, 0x15406ce8, 0x7762e5d1, 0xaa274f69, 0xb327f7a3, 0x6e625d1b, 0x0c40d422, 0xd1057e9a, 0xaba65fe7, 0x76e3f55f, 0x14c17c66, 0xc984d6de, 0xd0846e14, 0x0dc1c4ac, 0x6fe34d95, 0xb2a6e72d, 0x5de23c01, 0x80a796b9, 0xe2851f80, 0x3fc0b538, 0x26c00df2, 0xfb85a74a, 0x99a72e73, 0x44e284cb, 0x42c2eeda, 0x9f874462, 0xfda5cd5b, 0x20e067e3, 0x39e0df29, 0xe4a57591, 0x8687fca8, 0x5bc25610, 0xb4868d3c, 0x69c32784, 0x0be1aebd, 0xd6a40405, 0xcfa4bccf, 0x12e11677, 0x70c39f4e, 0xad8635f6, 0x7c834b6c, 0xa1c6e1d4, 0xc3e468ed, 0x1ea1c255, 0x07a17a9f, 0xdae4d027, 0xb8c6591e, 0x6583f3a6, 0x8ac7288a, 0x57828232, 0x35a00b0b, 0xe8e5a1b3, 0xf1e51979, 0x2ca0b3c1, 0x4e823af8, 0x93c79040, 0x95e7fa51, 0x48a250e9, 0x2a80d9d0, 0xf7c57368, 0xeec5cba2, 0x3380611a, 0x51a2e823, 0x8ce7429b, 0x63a399b7, 0xbee6330f, 0xdcc4ba36, 0x0181108e, 0x1881a844, 0xc5c402fc, 0xa7e68bc5, 0x7aa3217d, 0x52a0c93f, 0x8fe56387, 0xedc7eabe, 0x30824006, 0x2982f8cc, 0xf4c75274, 0x96e5db4d, 0x4ba071f5, 0xa4e4aad9, 0x79a10061, 0x1b838958, 0xc6c623e0, 0xdfc69b2a, 0x02833192, 0x60a1b8ab, 0xbde41213, 0xbbc47802, 0x6681d2ba, 0x04a35b83, 0xd9e6f13b, 0xc0e649f1, 0x1da3e349, 0x7f816a70, 0xa2c4c0c8, 0x4d801be4, 0x90c5b15c, 0xf2e73865, 0x2fa292dd, 0x36a22a17, 0xebe780af, 0x89c50996, 0x5480a32e, 0x8585ddb4, 0x58c0770c, 0x3ae2fe35, 0xe7a7548d, 0xfea7ec47, 0x23e246ff, 0x41c0cfc6, 0x9c85657e, 0x73c1be52, 0xae8414ea, 0xcca69dd3, 0x11e3376b, 0x08e38fa1, 0xd5a62519, 0xb784ac20, 0x6ac10698, 0x6ce16c89, 0xb1a4c631, 0xd3864f08, 0x0ec3e5b0, 0x17c35d7a, 0xca86f7c2, 0xa8a47efb, 0x75e1d443, 0x9aa50f6f, 0x47e0a5d7, 0x25c22cee, 0xf8878656, 0xe1873e9c, 0x3cc29424, 0x5ee01d1d, 0x83a5b7a5, 0xf90696d8, 0x24433c60, 0x4661b559, 0x9b241fe1, 0x8224a72b, 0x5f610d93, 0x3d4384aa, 0xe0062e12, 0x0f42f53e, 0xd2075f86, 0xb025d6bf, 0x6d607c07, 0x7460c4cd, 0xa9256e75, 0xcb07e74c, 0x16424df4, 0x106227e5, 0xcd278d5d, 0xaf050464, 0x7240aedc, 0x6b401616, 0xb605bcae, 0xd4273597, 0x09629f2f, 0xe6264403, 0x3b63eebb, 0x59416782, 0x8404cd3a, 0x9d0475f0, 0x4041df48, 0x22635671, 0xff26fcc9, 0x2e238253, 0xf36628eb, 0x9144a1d2, 0x4c010b6a, 0x5501b3a0, 0x88441918, 0xea669021, 0x37233a99, 0xd867e1b5, 0x05224b0d, 0x6700c234, 0xba45688c, 0xa345d046, 0x7e007afe, 0x1c22f3c7, 0xc167597f, 0xc747336e, 0x1a0299d6, 0x782010ef, 0xa565ba57, 0xbc65029d, 0x6120a825, 0x0302211c, 0xde478ba4, 0x31035088, 0xec46fa30, 0x8e647309, 0x5321d9b1, 0x4a21617b, 0x9764cbc3, 0xf54642fa, 0x2803e842 }; #if HAVE_SSE42 int crc_x86; #endif uint32_t crc32c_gen(uint32_t crc, const unsigned char* ptr, unsigned size) { crc ^= CRC_IV; crc = crc32c_gen_plain(crc, ptr, size); crc ^= CRC_IV; return crc; } #if HAVE_SSE42 uint32_t crc32c_x86(uint32_t crc, const unsigned char* ptr, unsigned size) { crc ^= CRC_IV; crc = crc32c_x86_plain(crc, ptr, size); crc ^= CRC_IV; return crc; } #endif uint32_t (*crc32c)(uint32_t crc, const unsigned char* ptr, unsigned size); void crc32c_init(void) { crc32c = crc32c_gen; #if HAVE_SSE42 if (raid_cpu_has_crc32()) { crc_x86 = 1; crc32c = crc32c_x86; } #endif } /****************************************************************************/ /* byte operations */ /* * Rotate left. * In x86/x64 they are optimized with a single assembler instruction. */ static inline uint32_t util_rotl32(uint32_t x, int8_t r) { return (x << r) | (x >> (32 - r)); } static inline uint64_t util_rotl64(uint64_t x, int8_t r) { return (x << r) | (x >> (64 - r)); } /* * Rotate right. * In x86/x64 they are optimized with a single assembler instruction. */ static inline uint32_t util_rotr32(uint32_t x, int8_t r) { return (x >> r) | (x << (32 - r)); } static inline uint64_t util_rotr64(uint64_t x, int8_t r) { return (x >> r) | (x << (64 - r)); } /** * Swap endianness. * They are needed only if BigEndian. */ #if defined(__GNUC__) #define util_swap32(x) __builtin_bswap32(x) #define util_swap64(x) __builtin_bswap64(x) #elif HAVE_BYTESWAP_H #include #define util_swap32(x) bswap_32(x) #define util_swap64(x) bswap_64(x) #else static inline uint32_t util_swap32(uint32_t v) { return (util_rotl32(v, 8) & 0x00ff00ff) | (util_rotl32(v, 24) & 0xff00ff00); } static inline uint64_t util_swap64(uint64_t v) { return (util_rotl64(v, 8) & 0x000000ff000000ffULL) | (util_rotl64(v, 24) & 0x0000ff000000ff00ULL) | (util_rotl64(v, 40) & 0x00ff000000ff0000ULL) | (util_rotl64(v, 56) & 0xff000000ff000000ULL); } #endif static inline uint8_t util_read8(const void* void_ptr) { const uint8_t* ptr = void_ptr; return ptr[0]; } static inline uint16_t util_read16(const void* void_ptr) { const uint8_t* ptr = void_ptr; return ptr[0] + (ptr[1] << 8); } static inline uint32_t util_read32(const void* ptr) { uint32_t v; memcpy(&v, ptr, sizeof(v)); #if WORDS_BIGENDIAN v = util_swap32(v); #endif return v; } static inline uint64_t util_read64(const void* ptr) { uint64_t v; memcpy(&v, ptr, sizeof(v)); #if WORDS_BIGENDIAN v = util_swap64(v); #endif return v; } static inline void util_write32(void* ptr, uint32_t v) { #if WORDS_BIGENDIAN v = util_swap32(v); #endif memcpy(ptr, &v, sizeof(v)); } static inline void util_write64(void* ptr, uint64_t v) { #if WORDS_BIGENDIAN v = util_swap64(v); #endif memcpy(ptr, &v, sizeof(v)); } /* * 64*64 -> 128bit multiply function. * * @param A Address of 64-bit number. * @param B Address of 64-bit number. * * Calculates 128-bit C = *A * *B. * * Overwrites A contents with C's low 64 bits. * Overwrites B contents with C's high 64 bits. */ #if defined(__x86_64__) || defined(_M_X64) /* * This is intentionally placed before the __SIZEOF_INT128__ implementation. * * This implementation happens to generate more efficient code. * While this likely depends only on the compiler, as long as it remains faster, * we will keep it in this order. */ static inline void util_mum(uint64_t* A, uint64_t* B) { uint64_t a = *A; uint64_t b = *B; uint64_t low, high; __asm__ ( "mulq %3" : "=a" (low), "=d" (high) : "a" (a), "rm" (b) : "cc" ); *A = low; *B = high; } #elif defined(__SIZEOF_INT128__) static inline void util_mum(uint64_t* A, uint64_t* B) { __uint128_t product = ((__uint128_t)*A) * ((__uint128_t)*B); *A = (uint64_t)product; *B = (uint64_t)(product >> 64); } #elif defined(__aarch64__) || defined(_M_ARM64) /* * This is intentionally placed after the __SIZEOF_INT128__ implementation. * * Although the code looks correct, there is a report of this * implementation failing the self-test on macOS (Darwin 25.4.0, arm64) * with Apple clang 21.0.0 (clang-2100.0.123.102). * * See: https://github.com/amadvance/snapraid/issues/43 * * Note that the implementation is the same of OpenSSL: * * #elif defined(__aarch64__) && defined(SIXTY_FOUR_BIT_LONG) * #if defined(__GNUC__) && __GNUC__ >= 2 * #define BN_UMULT_HIGH(a, b) ({ \ * register BN_ULONG ret; \ * asm ("umulh %0,%1,%2" \ * : "=r"(ret) \ * : "r"(a), "r"(b)); \ * ret; }) * #endif * #endif * * See: https://github.com/openssl/openssl/blob/0463cbf185680e66a3a8960f10cd33001377d28e/crypto/bn/bn_local.h#L439 */ static inline void util_mum(uint64_t* A, uint64_t* B) { uint64_t a = *A; uint64_t b = *B; uint64_t low = a * b; uint64_t high; __asm__ ( "umulh %0, %1, %2" : "=r" (high) : "r" (a), "r" (b) ); *A = low; *B = high; } #else static inline void util_mum(uint64_t* A, uint64_t* B) { uint64_t a = *A; uint64_t b = *B; uint64_t a_lo = (uint32_t)a; uint64_t a_hi = a >> 32; uint64_t b_lo = (uint32_t)b; uint64_t b_hi = b >> 32; uint64_t p0 = a_lo * b_lo; uint64_t p1 = a_lo * b_hi; uint64_t p2 = a_hi * b_lo; uint64_t p3 = a_hi * b_hi; uint64_t middle = p1 + (p0 >> 32) + (uint32_t)p2; uint64_t low = (middle << 32) | (uint32_t)p0; uint64_t high = p3 + (middle >> 32) + (p2 >> 32); *A = low; *B = high; } #endif int util_selftest(void) { /* rotate left 32-bit */ if (util_rotl32(0x00000001U, 1) != 0x00000002U) return -1; if (util_rotl32(0x80000000U, 1) != 0x00000001U) return -1; if (util_rotl32(0x00000001U, 31) != 0x80000000U) return -1; if (util_rotl32(0x12345678U, 4) != 0x23456781U) return -1; if (util_rotl32(0x12345678U, 0) != 0x12345678U) return -1; if (util_rotl32(0x12345678U, 32) != 0x12345678U) return -1; /* r % 32 == 0 */ /* rotate right 32-bit */ if (util_rotr32(0x00000001U, 1) != 0x80000000U) return -1; if (util_rotr32(0x80000000U, 1) != 0x40000000U) return -1; if (util_rotr32(0x00000002U, 1) != 0x00000001U) return -1; if (util_rotr32(0x12345678U, 4) != 0x81234567U) return -1; /* rotate left 64-bit */ if (util_rotl64(1ULL, 1) != 2ULL) return -1; if (util_rotl64(1ULL << 63, 1) != 1ULL) return -1; if (util_rotl64(0x123456789ABCDEF0ULL, 8) != 0x3456789ABCDEF012ULL) return -1; if (util_rotl64(0x123456789ABCDEF0ULL, 0) != 0x123456789ABCDEF0ULL) return -1; /* rotate right 64-bit */ if (util_rotr64(1ULL, 1) != (1ULL << 63)) return -1; if (util_rotr64(2ULL, 1) != 1ULL) return -1; if (util_rotr64(0x123456789ABCDEF0ULL, 8) != 0xF0123456789ABCDEULL) return -1; /* util_mum tests */ uint64_t a, b; /* small values */ a = 3; b = 4; util_mum(&a, &b); if (a != 12 || b != 0) return -1; /* 1 * anything */ a = 0xFFFFFFFFFFFFFFFFULL; b = 1; util_mum(&a, &b); if (a != 0xFFFFFFFFFFFFFFFFULL || b != 0) return -1; /* (2^32) * (2^32) = 2^64 */ a = 1ULL << 32; b = 1ULL << 32; util_mum(&a, &b); if (a != 0 || b != 1) return -1; /* max uint64 * max uint64 */ a = 0xFFFFFFFFFFFFFFFFULL; b = 0xFFFFFFFFFFFFFFFFULL; util_mum(&a, &b); if (a != 1 || b != 0xFFFFFFFFFFFFFFFEULL) return -1; /* larger random-ish test */ a = 0x0123456789ABCDEFULL; b = 0xFEDCBA9876543210ULL; util_mum(&a, &b); if (a != 0x2236D88FE5618CF0ULL || b != 0x121FA00AD77D742ULL) return -1; return 0; } /****************************************************************************/ /* hash */ const char* memhashname(unsigned kind) { switch (kind) { case HASH_MURMUR3 : return "murmur3"; case HASH_SPOOKY2 : return "spooky2"; case HASH_METRO : return "metro"; case HASH_MUSEAIR : return "museair"; } return 0; } unsigned membesthash(void) { #ifdef CONFIG_X86 if (sizeof(void*) == 4 && !raid_cpu_has_slowmult()) return HASH_MURMUR3; else return HASH_SPOOKY2; #else if (sizeof(void*) == 4) return HASH_MURMUR3; else return HASH_SPOOKY2; #endif } #include "murmur3.c" #include "spooky2.c" #include "metro.c" #include "museair.c" void memhash(unsigned kind, const unsigned char* seed, void* digest, const void* src, size_t size) { switch (kind) { case HASH_MURMUR3 : MurmurHash3_x86_128(src, size, seed, digest); break; case HASH_SPOOKY2 : SpookyHash128(src, size, seed, digest); break; case HASH_METRO : MetroHash128(src, size, seed, digest); break; case HASH_MUSEAIR : MuseAirLoong(src, size, seed, digest); break; default : /* LCOV_EXCL_START */ log_fatal(EINTERNAL, "Internal inconsistency in hash function %u\n", kind); exit(EXIT_FAILURE); break; /* LCOV_EXCL_STOP */ } } const char* hash_config_name(unsigned kind) { switch (kind) { case HASH_UNDEFINED : return "undefined"; case HASH_MURMUR3 : return "murmur3"; case HASH_SPOOKY2 : return "spooky2"; case HASH_METRO : return "metro"; case HASH_MUSEAIR : return "museair"; default : /* LCOV_EXCL_START */ return "unknown"; /* LCOV_EXCL_STOP */ } } unsigned memdiff(const unsigned char* data1, const unsigned char* data2, size_t size) { size_t i; unsigned count; count = 0; for (i = 0; i < size; ++i) { unsigned j; unsigned char diff = data1[i] ^ data2[i]; for (j = 0; j < 8; ++j) { if ((diff & 1) != 0) ++count; diff >>= 1; } } return count; } /****************************************************************************/ /* lock */ #if HAVE_LOCKFILE int lock_lock(const char* file) { int f; f = open(file, O_RDONLY | O_CREAT, 0600); if (f == -1) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } /* exclusive lock, not blocking */ if (flock(f, LOCK_EX | LOCK_NB) == -1) { /* LCOV_EXCL_START */ close(f); return -1; /* LCOV_EXCL_STOP */ } return f; } #endif #if HAVE_LOCKFILE int lock_unlock(int f) { /* * Intentionally don't remove the lock file. * Removing it just introduces race course with other process * that could have already opened it. */ if (close(f) == -1) { /* LCOV_EXCL_START */ return -1; /* LCOV_EXCL_STOP */ } return 0; } #endif /****************************************************************************/ /* muldiv */ unsigned muldiv(uint64_t v, uint64_t mul, uint64_t div) { if (!div) return 0; return (uint32_t)(v * mul / div); } unsigned muldiv_upper(uint64_t v, uint64_t mul, uint64_t div) { if (!div) return 0; return (uint32_t)((v * mul + div - 1) / div); } snapraid-14.9/cmdline/util.h000066400000000000000000000133701522717156100160240ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2011 Andrea Mazzoleni #ifndef __UTIL_H #define __UTIL_H /****************************************************************************/ /* memory */ /** * Safe aligned malloc. * If no memory is available, it aborts. */ void* malloc_nofail_align(size_t size, void** freeptr); /** * Safe aligned malloc. Usable for direct io. */ void* malloc_nofail_direct(size_t size, void** freeptr); /** * Safe aligned vector allocation. * If no memory is available, it aborts. */ void** malloc_nofail_vector_align(int nd, int n, size_t size, void** freeptr); /** * Safe page vector allocation. Usable for direct io. * If no memory is available, it aborts. */ void** malloc_nofail_vector_direct(int nd, int n, size_t size, void** freeptr); /** * Safe allocation with memory test. */ void* malloc_nofail_test(size_t size); /** * Test the memory vector for RAM problems. * If a problem is found, it crashes. */ void mtest_vector(int n, size_t size, void** vv); /****************************************************************************/ /* crc */ /** * CRC initial value. * Using a not zero value allows to detect a leading run of zeros. */ #define CRC_IV 0xffffffffU /** * CRC-32 (Castagnoli) table. */ extern uint32_t CRC32C_0[256]; extern uint32_t CRC32C_1[256]; extern uint32_t CRC32C_2[256]; extern uint32_t CRC32C_3[256]; /** * If the CPU support the CRC instructions. */ #if HAVE_SSE42 extern int crc_x86; #endif /** * Compute CRC-32 (Castagnoli) for a single byte without the IV. */ static inline uint32_t crc32c_plain_char(uint32_t crc, unsigned char c) { #if HAVE_SSE42 if (tommy_likely(crc_x86)) { asm ("crc32b %1, %0\n" : "+r" (crc) : "m" (c)); return crc; } #endif return CRC32C_0[(crc ^ c) & 0xff] ^ (crc >> 8); } /** * Compute the CRC-32 (Castagnoli) without the IV. */ static inline uint32_t crc32c_gen_plain(uint32_t crc, const unsigned char* ptr, unsigned size) { while (size >= 4) { crc ^= ptr[0] | (uint32_t)ptr[1] << 8 | (uint32_t)ptr[2] << 16 | (uint32_t)ptr[3] << 24; crc = CRC32C_3[crc & 0xff] ^ CRC32C_2[(crc >> 8) & 0xff] ^ CRC32C_1[(crc >> 16) & 0xff] ^ CRC32C_0[crc >> 24]; ptr += 4; size -= 4; } while (size) { crc = CRC32C_0[(crc ^ *ptr) & 0xff] ^ (crc >> 8); ++ptr; --size; } return crc; } /** * Compute the CRC-32 (Castagnoli) without the IV. */ #if HAVE_SSE42 static inline uint32_t crc32c_x86_plain(uint32_t crc, const unsigned char* ptr, unsigned size) { #ifdef CONFIG_X86_64 uint64_t crc64 = crc; while (size >= 8) { asm ("crc32q %1, %0\n" : "+r" (crc64) : "m" (*(const uint64_t*)ptr)); ptr += 8; size -= 8; } crc = crc64; #else while (size >= 4) { asm ("crc32l %1, %0\n" : "+r" (crc) : "m" (*(const uint32_t*)ptr)); ptr += 4; size -= 4; } #endif while (size) { asm ("crc32b %1, %0\n" : "+r" (crc) : "m" (*ptr)); ++ptr; --size; } return crc; } #endif /** * Compute CRC-32 (Castagnoli) without the IV. */ static inline uint32_t crc32c_plain(uint32_t crc, const unsigned char* ptr, unsigned size) { #if HAVE_SSE42 if (tommy_likely(crc_x86)) { return crc32c_x86_plain(crc, ptr, size); } #endif return crc32c_gen_plain(crc, ptr, size); } /** * Compute the CRC-32 (Castagnoli) */ extern uint32_t (*crc32c)(uint32_t crc, const unsigned char* ptr, unsigned size); /** * Internal entry points for testing. */ uint32_t crc32c_gen(uint32_t crc, const unsigned char* ptr, unsigned size); uint32_t crc32c_x86(uint32_t crc, const unsigned char* ptr, unsigned size); /** * Initialize the CRC-32 (Castagnoli) support. */ void crc32c_init(void); /****************************************************************************/ /* hash */ /** * Size of the hash. */ #define HASH_MAX 16 /** * Hash kinds. */ #define HASH_UNDEFINED 0 #define HASH_MURMUR3 1 #define HASH_SPOOKY2 2 #define HASH_METRO 3 #define HASH_MUSEAIR 4 /** * Return the hash that is expected to be the fastest in this architecture */ unsigned membesthash(void); /** * Return the name of the hash */ const char* memhashname(unsigned kind); /** * Compute the HASH of a memory block. * Seed is a 128 bit vector. */ void memhash(unsigned kind, const unsigned char* seed, void* digest, const void* src, size_t size); /** * Return the hash name. */ const char* hash_config_name(unsigned kind); /** * Count the number of different bits in the two buffers. */ unsigned memdiff(const unsigned char* data1, const unsigned char* data2, size_t size); /** * Unit test */ int util_selftest(void); /****************************************************************************/ /* lock */ /** * Create and locks the lock file. * Return -1 on error, otherwise it's the file handle to pass to lock_unlock(). */ int lock_lock(const char* file); /** * Unlock the lock file. * Return -1 on error. */ int lock_unlock(int f); /****************************************************************************/ /* bitvect */ typedef unsigned char bit_vect_t; #define BIT_VECT_SIZE (sizeof(bit_vect_t) * 8) static inline size_t bit_vect_size(size_t max) { return (max + BIT_VECT_SIZE - 1) / BIT_VECT_SIZE; } static inline void bit_vect_set(bit_vect_t* bit_vect, size_t off) { bit_vect_t mask = 1 << (off % BIT_VECT_SIZE); bit_vect[off / BIT_VECT_SIZE] |= mask; } static inline void bit_vect_clear(bit_vect_t* bit_vect, size_t off) { bit_vect_t mask = 1 << (off % BIT_VECT_SIZE); bit_vect[off / BIT_VECT_SIZE] &= ~mask; } static inline int bit_vect_test(bit_vect_t* bit_vect, size_t off) { bit_vect_t mask = 1 << (off % BIT_VECT_SIZE); return (bit_vect[off / BIT_VECT_SIZE] & mask) != 0; } /****************************************************************************/ /* muldiv */ unsigned muldiv(uint64_t v, uint64_t mul, uint64_t div); unsigned muldiv_upper(uint64_t v, uint64_t mul, uint64_t div); #endif snapraid-14.9/configure.ac000066400000000000000000000311571522717156100155540ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.65]) dnl Get version number from git m4_define([git_revision], m4_esyscmd_s([./autover.sh])) AC_INIT([SnapRAID CLI], [git_revision], [], [snapraid], [https://www.snapraid.it]) AM_INIT_AUTOMAKE([foreign no-dependencies subdir-objects]) AC_CONFIG_SRCDIR([cmdline/snapraid.c]) AC_CONFIG_HEADERS([config.h]) AC_CANONICAL_HOST dnl Enables as many system-specific extensions as reasonably possible AC_USE_SYSTEM_EXTENSIONS dnl Checks for programs. AC_PROG_CC AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind],[]) AC_CHECK_PROG([WINE],[wine64],[wine64],[]) AC_CHECK_PROG([SDE],[sde64],[sde64],[]) AC_CHECK_PROG([ADVD2],[advd2],[advd2],[]) AM_CONDITIONAL(HAVE_ADVD2, [test x"$ADVD2" != x]) # Check if we are targeting Windows is_windows=no AS_CASE([$host_os], [mingw*|msys*|cygwin*], [is_windows=yes]) AM_CONDITIONAL([HOST_WINDOWS], [test "x$is_windows" = "xyes"]) # Check for Windows-specific tools only if on Windows if test "x$is_windows" = "xyes"; then AC_CHECK_TOOL([WINDMC], [windmc]) AC_CHECK_TOOL([WINDRES], [windres]) fi dnl Options to improve stacktrace (some disabled as no crash reported by years) AC_CHECK_CC_OPT([-fno-omit-frame-pointer], CFLAGS="$CFLAGS -fno-omit-frame-pointer", []) # AC_CHECK_CC_OPT([-fno-inline-functions-called-once], CFLAGS="$CFLAGS -fno-inline-functions-called-once", []) # AC_CHECK_CC_OPT([-fno-inline-small-functions], CFLAGS="$CFLAGS -fno-inline-small-functions", []) # AC_CHECK_CC_OPT([-fno-optimize-sibling-calls], CFLAGS="$CFLAGS -fno-optimize-sibling-calls", []) AC_CHECK_CC_OPT([-rdynamic], CFLAGS="$CFLAGS -rdynamic", []) # This the new default for gcc 10 AC_CHECK_CC_OPT([-fno-common], CFLAGS="$CFLAGS -fno-common", []) dnl Checks for system. AC_SYS_LARGEFILE dnl Checks for header files. AC_HEADER_ASSERT AC_HEADER_DIRENT AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([fcntl.h stddef.h stdint.h stdlib.h string.h limits.h time.h sys/time.h]) AC_CHECK_HEADERS([unistd.h getopt.h io.h inttypes.h byteswap.h]) AC_CHECK_HEADERS([pthread.h math.h]) AC_CHECK_HEADERS([sys/file.h sys/ioctl.h sys/sysmacros.h sys/mkdev.h sys/mount.h]) AC_CHECK_HEADERS([linux/fiemap.h linux/fs.h mach/mach_time.h execinfo.h]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_C_VOLATILE AC_TYPE_SIZE_T AC_TYPE_OFF_T AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T AC_TYPE_INT8_T AC_STRUCT_DIRENT_D_INO AC_STRUCT_DIRENT_D_TYPE AC_CHECK_MEMBERS([struct stat.st_nlink, struct stat.st_mtim.tv_nsec, struct stat.st_mtimensec, struct stat.st_mtimespec.tv_nsec], [], [], [[ #if HAVE_SYS_TYPES_H #include #endif #if HAVE_SYS_STAT_H #include #endif #if HAVE_UNISTD_H #include #endif ]]) dnl Checks for library functions. AC_CHECK_FUNCS([memset strchr strerror strrchr mkdir gettimeofday strtoul]) AC_CHECK_FUNCS([getopt getopt_long snprintf vsnprintf sigaction]) AC_CHECK_FUNCS([ftruncate fallocate access]) AC_CHECK_FUNCS([fsync posix_fadvise sync_file_range syncfs]) AC_CHECK_FUNCS([getc_unlocked ferror_unlocked]) AC_CHECK_FUNCS([futimes futimens futimesat localtime_r lutimes utimensat]) AC_CHECK_FUNCS([fstatat flock]) AC_CHECK_FUNCS([mach_absolute_time]) AC_CHECK_FUNCS([backtrace backtrace_symbols]) AC_SEARCH_LIBS([clock_gettime], [rt]) AC_CHECK_FUNCS([clock_gettime]) AC_CHECK_CC_OPT([-pthread], CFLAGS="$CFLAGS -pthread", CFLAGS="$CFLAGS -D_REENTRANT") AC_CHECK_FUNCS([pthread_create]) AC_SEARCH_LIBS([exp], [m]) AC_CHECK_FUNCS([eaccess faccessat]) dnl Checks for statfs for linux avoiding to include sys/mount.h that is required only in darwin dnl In glibc since 7eae6a91e9b1670330c9f15730082c91c0b1d570, milestone 2.36, sys/mount.h defines fsconfig_command which conflicts with linux/mount.h AC_CHECK_HEADERS([sys/vfs.h sys/statfs.h]) AC_CHECK_DECLS([statfs], [], [ AC_CHECK_HEADERS([sys/param.h sys/mount.h]) ], [[ #if HAVE_SYS_VFS_H #include #endif #if HAVE_SYS_STATFS_H #include #endif ]]) AC_CHECK_FUNCS([statfs]) AC_CHECK_MEMBERS([struct statfs.f_type], [], [], [[ #if HAVE_SYS_PARAM_H #include #endif #if HAVE_SYS_MOUNT_H #include #endif #if HAVE_SYS_VFS_H #include #endif #if HAVE_SYS_STATFS_H #include #endif ]]) AC_CHECK_MEMBERS([struct statfs.f_fstypename], [], [], [[ #if HAVE_SYS_PARAM_H #include #endif #if HAVE_SYS_MOUNT_H #include #endif #if HAVE_SYS_VFS_H #include #endif #if HAVE_SYS_STATFS_H #include #endif ]]) dnl Checks for libblkid AC_ARG_WITH([blkid], AS_HELP_STRING([--without-blkid], [Ignore presence of blkid and disable it])) AS_IF([test "x$with_blkid" != "xno"], [AC_SEARCH_LIBS([blkid_probe_all], [blkid], [have_blkid=yes], [have_blkid=no])], [have_blkid=no]) AS_IF([test "x$have_blkid" = "xyes"], [ AC_CHECK_HEADERS([blkid/blkid.h]) AC_CHECK_FUNCS([blkid_devno_to_devname blkid_get_tag_value]) ], [AS_IF([test "x$with_blkid" = "xyes"], [AC_MSG_ERROR([blkid requested but not found]) ]) ]) dnl Checks for architecture AC_C_BIGENDIAN dnl Checks for compiler AC_CHECK_CC_OPT([-Wall], CFLAGS="$CFLAGS -Wall", []) AC_CHECK_CC_OPT([-Wextra], CFLAGS="$CFLAGS -Wextra", []) AC_CHECK_CC_OPT([-Wuninitialized], CFLAGS="$CFLAGS -Wuninitialized", []) AC_CHECK_CC_OPT([-Wshadow], CFLAGS="$CFLAGS -Wshadow", []) dnl Disable warning about zero-length-bounds raised by gcc 10 on linux kernel header on the fm_extents field AC_CHECK_CC_OPT([-Wno-zero-length-bounds], CFLAGS="$CFLAGS -Wno-zero-length-bounds", []) dnl Checks for asm AC_ARG_ENABLE([asm], AS_HELP_STRING([--disable-asm], [Disable inline assembly])) AS_IF([test "x$enable_asm" != "xno"], [AC_DEFINE([HAVE_ASSEMBLY], [1], [Define to 1 if inline assembly should be used.])] dnl AS_IF(HAVE_ASSEMBLY) NOT closed here dnl Checks for AS supporting the SSE2 instructions. AC_MSG_CHECKING([for sse2]) asmsse2=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) void f(void) { asm volatile("pxor %xmm0,%xmm1"); } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_SSE2], [1], [Define to 1 if sse2 is supported by the assembler.]) asmsse2=yes]) AC_MSG_RESULT([$asmsse2]) dnl Checks for AS supporting the SSSE3 instructions. AC_MSG_CHECKING([for ssse3]) asmssse3=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) void f(void) { asm volatile("pshufb %xmm0,%xmm1"); } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_SSSE3], [1], [Define to 1 if ssse3 is supported by the assembler.]) asmssse3=yes]) AC_MSG_RESULT([$asmssse3]) dnl Checks for AS supporting the SSE4.2 instructions. AC_MSG_CHECKING([for sse42]) asmsse42=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) unsigned f(unsigned crc, unsigned char b) { asm volatile("crc32b %1, %0" : "+r" (crc) : "rm" (b)); return crc; } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_SSE42], [1], [Define to 1 if sse4.2 is supported by the assembler.]) asmsse42=yes]) AC_MSG_RESULT([$asmsse42]) dnl Checks for AS supporting the AVX2 instructions. AC_MSG_CHECKING([for avx2]) asmavx2=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) void f(void* ptr) { asm volatile("vbroadcasti128 %0, %%ymm0" : : "m" (ptr)); } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_AVX2], [1], [Define to 1 if avx2 is supported by the assembler.]) asmavx2=yes]) AC_MSG_RESULT([$asmavx2]) dnl AS_IF(HAVE_ASSEMBLY) closed here ) dnl Checks for test environment AS_CASE([$host], [*-*-mingw*], [ TESTENV="$WINE" FAILENV="$TESTENV" ], [POSIX=1] ) AM_CONDITIONAL(HAVE_POSIX, [test x"$POSIX" != x]) AM_CONDITIONAL(HAVE_DISK_ARBITRATION, [test "$(uname)" == Darwin]) AC_ARG_ENABLE([profiler], [AS_HELP_STRING([--enable-profiler],[enable the use of gprof for code coverage])], [ CFLAGS="-O2 -pg -g -pthread" ], []) AC_ARG_ENABLE([coverage], [AS_HELP_STRING([--enable-coverage],[enable the use of gcov for code coverage])], [ CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage -pthread" ], []) AC_ARG_ENABLE([valgrind], [AS_HELP_STRING([--enable-valgrind],[enable the use of valgrind in testing])], [ TESTENV="$VALGRIND --leak-check=full --suppressions=valgrind.supp --error-exitcode=1" FAILENV="$VALGRIND --error-exitcode=1" CFLAGS="$CFLAGS -DCHECKER" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([sgcheck], [AS_HELP_STRING([--enable-sgcheck],[enable the use of sgcheck in testing])], [ TESTENV="$VALGRIND --tool=exp-sgcheck --suppressions=valgrind.supp --error-exitcode=1" FAILENV="$TESTENV" CFLAGS="$CFLAGS -DCHECKER" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([helgrind], [AS_HELP_STRING([--enable-helgrind],[enable the use of helgrind in testing])], [ TESTENV="$VALGRIND --tool=helgrind --suppressions=valgrind.supp --fair-sched=try --error-exitcode=1" FAILENV="$TESTENV" CFLAGS="$CFLAGS -DCHECKER" THREAD_CHECKER=1 ], []) AC_ARG_ENABLE([drd], [AS_HELP_STRING([--enable-drd],[enable the use of drd in testing])], [ TESTENV="$VALGRIND --tool=drd --suppressions=valgrind.supp --fair-sched=try --error-exitcode=1" FAILENV="$TESTENV" CFLAGS="$CFLAGS -DCHECKER" THREAD_CHECKER=1 ], []) AC_ARG_ENABLE([asan], [AS_HELP_STRING([--enable-asan],[enable the use of AddressSanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=address" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([msan], [AS_HELP_STRING([--enable-msan],[enable the use of MemorySanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=memory" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([ubsan], [AS_HELP_STRING([--enable-ubsan],[enable the use of UndefinedBehaviourSanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=undefined -fno-sanitize=function" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([tsan], [AS_HELP_STRING([--enable-tsan],[enable the use of ThreadSanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=thread" dnl Use MEMORY_CHECKER instead of THREAD_CHECKER to run the full and long test MEMORY_CHECKER=1 ], []) AM_CONDITIONAL(HAVE_MEMORY_CHECKER, [test x"$MEMORY_CHECKER" != x]) AM_CONDITIONAL(HAVE_THREAD_CHECKER, [test x"$THREAD_CHECKER" != x]) AC_ARG_ENABLE([sde], [AS_HELP_STRING([--enable-sde],[enable the use of SDE emulator in testing])], dnl p4p -> Pentium4 Prescott with SSE2 dnl mrm -> Merom with SSSE3 dnl nhm -> Nehalem with SSE4.2 dnl hsw -> Haswell with AVX2 dnl knl -> Knights Landing with AVX512 [ TESTENV_SSE2="$SDE -chip-check-exe-only -p4p --" TESTENV_SSSE3="$SDE -chip-check-exe-only -mrm --" TESTENV_SSE42="$SDE -nhm --" TESTENV_AVX2="$SDE -hsw --" EMULATOR=1 # Target CPU compatible with P4 Prescott CFLAGS="$CFLAGS -march=athlon64" ], []) AM_CONDITIONAL(HAVE_EMULATOR, [test x"$EMULATOR" != x]) AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug],[enable debugging])], [ CFLAGS="-Og -g -pthread -Wall -Wextra" AC_CHECK_CC_OPT([-rdynamic], CFLAGS="$CFLAGS -rdynamic", []) ], []) AC_ARG_ENABLE([warning-as-error], [AS_HELP_STRING([--enable-warning-as-error],[stop build on warnings])], [ AC_CHECK_CC_OPT([-Werror], CFLAGS="$CFLAGS -Werror", []) dnl This avoid the Darwin error: clang: error: argument unused during compilation: '-pthread' dnl See: https://llvm.org/bugs/show_bug.cgi?id=7798 AC_CHECK_CC_OPT([-Wno-error=unused-command-line-argument], CFLAGS="$CFLAGS -Wno-error=unused-command-line-argument", []) ], []) AC_ARG_ENABLE([warning], [AS_HELP_STRING([--enable-warning],[enable extra warning])], [ AC_CHECK_CC_OPT([-Wpointer-arith], CFLAGS="$CFLAGS -Wpointer-arith", []) AC_CHECK_CC_OPT([-Wcast-qual], CFLAGS="$CFLAGS -Wcast-qual", []) AC_CHECK_CC_OPT([-Wunused], CFLAGS="$CFLAGS -Wunused", []) AC_CHECK_CC_OPT([-Wunreachable-code], CFLAGS="$CFLAGS -Wunreachable-code", []) AC_CHECK_CC_OPT([-Wpadded], CFLAGS="$CFLAGS -Wpadded", []) AC_CHECK_CC_OPT([-Weverything], CFLAGS="$CFLAGS -Weverything", []) ], []) AC_ARG_VAR([TESTENV], [Test environment]) AC_ARG_VAR([FAILENV], [Test environment for failing tests]) AC_ARG_VAR([TESTENV_SSE2], [Test environment for SSE2]) AC_ARG_VAR([TESTENV_SSSE3], [Test environment for SSSE3]) AC_ARG_VAR([TESTENV_SSE42], [Test environment for SSE42]) AC_ARG_VAR([TESTENV_AVX2], [Test environment for AVX2]) AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([pkg/snapraid.info pkg/control pkg/snapraid.spec pkg/.PKGINFO pkg/PKGBUILD pkg/.SRCINFO]) AC_CONFIG_FILES([makeslackware.sh], [chmod a+x makeslackware.sh]) AC_CONFIG_FILES([makeslackdist.sh], [chmod a+x makeslackdist.sh]) AC_CONFIG_FILES([pkg/snapraid.SlackBuild], [chmod a+x pkg/snapraid.SlackBuild]) AC_CONFIG_FILES([makedeb.sh], [chmod a+x makedeb.sh]) AC_CONFIG_FILES([makerpm.sh], [chmod a+x makerpm.sh]) AC_CONFIG_FILES([makearch.sh], [chmod a+x makearch.sh]) AC_CONFIG_FILES([makearchdist.sh], [chmod a+x makearchdist.sh]) AC_OUTPUT snapraid-14.9/configure.windows-x64000077500000000000000000000001131522717156100172710ustar00rootroot00000000000000./configure --host=x86_64-w64-mingw32.static --build=`./config.guess` $@ snapraid-14.9/configure.windows-x86000077500000000000000000000001111522717156100172730ustar00rootroot00000000000000./configure --host=i686-w64-mingw32.static --build=`./config.guess` $@ snapraid-14.9/doc/000077500000000000000000000000001522717156100140245ustar00rootroot00000000000000snapraid-14.9/doc/snapraid-de.1000066400000000000000000002252461522717156100163100ustar00rootroot00000000000000.TH "SnapRAID Sicherung fÃŧr Festplatten\-Arrays" 1 .SH NAME snapraid \- SnapRAID Sicherung fÃŧr Festplatten\-Arrays .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAID ist ein Sicherungsprogramm, das fÃŧr Festplatten\-Arrays entwickelt wurde und Paritätsinformationen zur Datenwiederherstellung bei Ausfall von bis zu sechs Festplatten speichert. .PP SnapRAID ist hauptsächlich fÃŧr Home\-Media\-Center mit großen, selten geänderten Dateien konzipiert und bietet folgende Funktionen: .PD 0 .IP \(bu Sie kÃļnnen bereits mit Dateien gefÃŧllte Festplatten verwenden, ohne sie neu formatieren zu mÃŧssen, und wie gewohnt darauf zugreifen. .IP \(bu Alle Ihre Daten werden gehasht, um die Datenintegrität zu gewährleisten und stille Beschädigung (silent corruption) zu verhindern. .IP \(bu Wenn die Anzahl der ausgefallenen Festplatten die Paritätsanzahl Ãŧberschreitet, beschränkt sich der Datenverlust auf die betroffenen Festplatten; Daten auf anderen Festplatten bleiben zugänglich. .IP \(bu Wenn Sie versehentlich Dateien auf einer Festplatte lÃļschen, ist eine Wiederherstellung mÃļglich. .IP \(bu Festplatten kÃļnnen unterschiedliche GrÃļßen haben. .IP \(bu Sie kÃļnnen jederzeit Festplatten hinzufÃŧgen. .IP \(bu SnapRAID sperrt Ihre Daten nicht ein; Sie kÃļnnen die Verwendung jederzeit beenden, ohne neu formatieren oder Daten verschieben zu mÃŧssen. .IP \(bu Um auf eine Datei zuzugreifen, muss nur eine einzige Festplatte drehen (spinnen), was Strom spart und Geräusche reduziert. .PD .PP FÃŧr weitere Informationen besuchen Sie bitte die offizielle SnapRAID\-Website: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID ist ein Hybrid aus einem RAID\- und einem Sicherungsprogramm, das darauf abzielt, die besten Vorteile beider zu kombinieren. Es hat jedoch einige Einschränkungen, die Sie vor der Verwendung berÃŧcksichtigen sollten. .PP Die Haupteinschränkung besteht darin, dass wenn eine Festplatte ausfällt und Sie in letzter Zeit keine Synchronisierung durchgefÃŧhrt haben, Sie mÃļglicherweise nicht vollständig wiederherstellen kÃļnnen. Genauer gesagt kÃļnnen Sie mÃļglicherweise nicht bis zur GrÃļße der geänderten oder gelÃļschten Dateien seit der letzten \`sync\`\-Operation wiederherstellen. Dies tritt auch dann auf, wenn die geänderten oder gelÃļschten Dateien sich nicht auf der ausgefallenen Festplatte befinden. Aus diesem Grund ist SnapRAID besser fÃŧr Daten geeignet, die sich selten ändern. .PP Andererseits verhindern neu hinzugefÃŧgte Dateien die Wiederherstellung von bereits vorhandenen Dateien nicht. Sie verlieren nur die kÃŧrzlich hinzugefÃŧgten Dateien, wenn diese sich auf der ausgefallenen Festplatte befinden. .PP Weitere Einschränkungen von SnapRAID sind: .PD 0 .IP \(bu Mit SnapRAID haben Sie immer noch separate Dateisysteme fÃŧr jede Festplatte. Mit RAID erhalten Sie ein einziges großes Dateisystem. .IP \(bu SnapRAID streift (stripes) keine Daten. Mit RAID erhalten Sie einen Geschwindigkeitsvorteil durch Striping. .IP \(bu SnapRAID unterstÃŧtzt keine Echtzeit\-Wiederherstellung. Mit RAID mÃŧssen Sie die Arbeit nicht unterbrechen, wenn eine Festplatte ausfällt. .IP \(bu SnapRAID kann Daten nur von einer begrenzten Anzahl von Festplattenausfällen wiederherstellen. Mit einer Sicherung kÃļnnen Sie von einem vollständigen Ausfall des gesamten Festplatten\-Arrays wiederherstellen. .IP \(bu Nur Dateinamen, Zeitstempel, symbolische Links (symlinks) und Hardlinks werden gespeichert. Berechtigungen, EigentÃŧmerschaft und erweiterte Attribute werden nicht gespeichert. .PD .SH GETTING STARTED Um SnapRAID zu verwenden, mÃŧssen Sie zuerst eine Festplatte in Ihrem Festplatten\-Array auswählen, die fÃŧr \`parity\`\-Informationen reserviert wird. Mit einer Festplatte fÃŧr Parität kÃļnnen Sie von einem einzelnen Festplattenausfall wiederherstellen, ähnlich wie bei RAID5. .PP Wenn Sie von mehr Festplattenausfällen wiederherstellen mÃļchten, ähnlich wie bei RAID6, mÃŧssen Sie zusätzliche Festplatten fÃŧr Parität reservieren. Jede zusätzliche Paritätsfestplatte ermÃļglicht die Wiederherstellung von einem weiteren Festplattenausfall. .PP Als Paritätsfestplatten mÃŧssen Sie die grÃļßten Festplatten im Array auswählen, da die Paritätsinformationen auf die GrÃļße der grÃļßten Datenfestplatte im Array anwachsen kÃļnnen. .PP Diese Festplatten werden zum Speichern der \`parity\`\-Dateien reserviert. Sie sollten Ihre Daten nicht darauf speichern. .PP Anschließend mÃŧssen Sie die \`data\`\-Festplatten definieren, die Sie mit SnapRAID schÃŧtzen mÃļchten. Der Schutz ist effektiver, wenn diese Festplatten Daten enthalten, die sich selten ändern. Aus diesem Grund ist es besser, die Windows C:\\\-Festplatte oder die Unix\-Verzeichnisse /home, /var und /tmp NICHT einzuschließen. .PP Die Liste der Dateien wird in den \`content\`\-Dateien gespeichert, die normalerweise auf den Daten\-, Paritäts\- oder Boot\-Festplatten gespeichert werden. Diese Datei enthält die Details Ihrer Sicherung, einschließlich aller PrÃŧfsummen zur ÜberprÃŧfung ihrer Integrität. Die \`content\`\-Datei wird in mehreren Kopien gespeichert, und jede Kopie muss sich auf einer anderen Festplatte befinden, um sicherzustellen, dass selbst bei mehreren Festplattenausfällen mindestens eine Kopie verfÃŧgbar ist. .PP Angenommen, Sie sind nur an einer Paritätsstufe des Schutzes interessiert und Ihre Festplatten befinden sich unter: .PP .RS 4 /mnt/diskp <\- ausgewählte Festplatte fÃŧr Parität .PD 0 .PP .PD /mnt/disk1 <\- erste zu schÃŧtzende Festplatte .PD 0 .PP .PD /mnt/disk2 <\- zweite zu schÃŧtzende Festplatte .PD 0 .PP .PD /mnt/disk3 <\- dritte zu schÃŧtzende Festplatte .PD 0 .PD .RE .PP Sie mÃŧssen die Konfigurationsdatei /etc/snapraid.conf mit den folgenden Optionen erstellen: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Wenn Sie Windows verwenden, sollten Sie das Windows\-Pfadformat mit Laufwerksbuchstaben und Backslashes anstelle von Slashes verwenden. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Wenn Sie viele Festplatten haben und keine Laufwerksbuchstaben mehr verfÃŧgbar sind, kÃļnnen Sie Festplatten direkt in Unterordnern einhängen (mounten). Siehe: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP Zu diesem Zeitpunkt sind Sie bereit, den Befehl \`sync\` auszufÃŧhren, um die Paritätsinformationen zu erstellen. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Dieser Vorgang kann beim ersten Mal mehrere Stunden dauern, abhängig von der GrÃļße der bereits auf den Festplatten vorhandenen Daten. Wenn die Festplatten leer sind, ist der Vorgang sofort abgeschlossen. .PP Sie kÃļnnen ihn jederzeit durch DrÃŧcken von Strg+C anhalten, und beim nächsten Lauf wird er dort fortgesetzt, wo er unterbrochen wurde. .PP Wenn dieser Befehl abgeschlossen ist, sind Ihre Daten SICHER. .PP Jetzt kÃļnnen Sie Ihr Array nach Belieben verwenden und die Paritätsinformationen regelmäßig durch AusfÃŧhren des \`sync\`\-Befehls aktualisieren. .SS Scrubbing Um die Daten und die Parität regelmäßig auf Fehler zu ÃŧberprÃŧfen, kÃļnnen Sie den Befehl \`scrub\` ausfÃŧhren. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Dieser Befehl vergleicht die Daten in Ihrem Array mit dem Hash, der während des \`sync\`\-Befehls berechnet wurde, um die Integrität zu ÃŧberprÃŧfen. .PP Jeder Lauf des Befehls ÃŧberprÃŧft ungefähr 8% des Arrays, ausgenommen Daten, die bereits in den letzten 10 Tagen gescrubbed wurden. Sie kÃļnnen die Option \-p, \-\-plan verwenden, um eine andere Menge anzugeben, und die Option \-o, \-\-older\-than, um ein anderes Alter in Tagen anzugeben. Zum Beispiel, um 5% des Arrays auf BlÃļcke zu ÃŧberprÃŧfen, die älter als 20 Tage sind, verwenden Sie: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Wenn während des Vorgangs stille oder Eingabe\-/Ausgabefehler gefunden werden, werden die entsprechenden BlÃļcke in der \`content\`\-Datei als fehlerhaft (bad) markiert und im Befehl \`status\` aufgelistet. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Um sie zu beheben, kÃļnnen Sie den Befehl \`fix\` verwenden und dabei nach fehlerhaften BlÃļcken mit der Option \-e, \-\-filter\-error filtern: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP Beim nächsten \`scrub\` verschwinden die Fehler aus dem \`status\`\-Bericht, wenn sie tatsächlich behoben sind. Um es schneller zu machen, kÃļnnen Sie \-p bad verwenden, um nur als fehlerhaft markierte BlÃļcke zu scrubben. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP Das AusfÃŧhren von \`scrub\` auf einem nicht synchronisierten Array kann Fehler melden, die durch entfernte oder geänderte Dateien verursacht wurden. Diese Fehler werden in der \`scrub\`\-Ausgabe gemeldet, aber die zugehÃļrigen BlÃļcke werden nicht als fehlerhaft markiert. .SS Pooling Hinweis: Die unten beschriebene Pooling\-Funktion wurde durch das Tool mergerfs ersetzt, das jetzt die empfohlene Option fÃŧr Linux\-Benutzer in der SnapRAID\-Community ist. Mergefs bietet eine flexiblere und effizientere MÃļglichkeit, mehrere Laufwerke zu einem einzigen, vereinheitlichten Einhängepunkt (Mount Point) zusammenzufassen, was einen nahtlosen Zugriff auf Dateien Ãŧber Ihr gesamtes Array hinweg ermÃļglicht, ohne auf symbolische Links angewiesen zu sein. Es lässt sich gut mit SnapRAID zum Paritätsschutz integrieren und wird häufig in Setups wie OpenMediaVault (OMV) oder benutzerdefinierten NAS\-Konfigurationen verwendet. .PP Um alle Dateien in Ihrem Array im selben Verzeichnisbaum anzuzeigen, kÃļnnen Sie die \`pooling\`\-Funktion aktivieren. Sie erstellt eine schreibgeschÃŧtzte virtuelle Ansicht aller Dateien in Ihrem Array mithilfe symbolischer Links. .PP Sie kÃļnnen das \`pooling\`\-Verzeichnis in der Konfigurationsdatei mit folgender Option konfigurieren: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP oder, wenn Sie Windows verwenden, mit: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP und anschließend den Befehl \`pool\` ausfÃŧhren, um die virtuelle Ansicht zu erstellen oder zu aktualisieren. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Wenn Sie eine Unix\-Plattform verwenden und dieses Verzeichnis Ãŧber das Netzwerk fÃŧr Windows\- oder Unix\-Maschinen freigeben mÃļchten, sollten Sie die folgenden Optionen zu Ihrer /etc/samba/smb.conf hinzufÃŧgen: .PP .RS 4 # Im globalen Abschnitt von smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # Im Freigabe\-Abschnitt von smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP In Windows erfordert die Freigabe symbolischer Links Ãŧber ein Netzwerk, dass Clients diese remote auflÃļsen. Um dies zu ermÃļglichen, mÃŧssen Sie neben der Freigabe des Pool\-Verzeichnisses auch alle Festplatten unabhängig freigeben, indem Sie die in der Konfigurationsdatei definierten Festplattennamen als Freigabepunkte verwenden. Sie mÃŧssen auch in der Option \`share\` der Konfigurationsdatei den Windows UNC\-Pfad angeben, den Remote\-Clients benÃļtigen, um auf diese freigegebenen Festplatten zuzugreifen. .PP Zum Beispiel, wenn Sie von einem Server namens \`darkstar\` aus arbeiten, kÃļnnen Sie die Optionen verwenden: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP und die folgenden Verzeichnisse Ãŧber das Netzwerk freigeben: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP um Remote\-Clients den Zugriff auf alle Dateien unter \\\\darkstar\\pool zu ermÃļglichen. .PP MÃļglicherweise mÃŧssen Sie auch Remote\-Clients konfigurieren, um den Zugriff auf Remote\-Symlinks mit dem Befehl zu aktivieren: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAID funktioniert eher wie ein Sicherungsprogramm als ein RAID\-System und kann verwendet werden, um Dateien in ihren vorherigen Zustand wiederherzustellen oder das LÃļschen rÃŧckgängig zu machen, indem die Option \-f, \-\-filter verwendet wird: .PP .RS 4 snapraid fix \-f DATEI .PD 0 .PD .RE .PP oder fÃŧr ein Verzeichnis: .PP .RS 4 snapraid fix \-f VERZEICHNIS/ .PD 0 .PD .RE .PP Sie kÃļnnen es auch verwenden, um nur versehentlich gelÃļschte Dateien innerhalb eines Verzeichnisses wiederherzustellen, indem Sie die Option \-m, \-\-filter\-missing verwenden, die nur fehlende Dateien wiederherstellt und alle anderen unberÃŧhrt lässt. .PP .RS 4 snapraid fix \-m \-f VERZEICHNIS/ .PD 0 .PD .RE .PP Oder um alle gelÃļschten Dateien auf allen Laufwerken wiederherzustellen mit: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering Das Schlimmste ist passiert, und Sie haben eine oder mehrere Festplatten verloren! .PP KEINE PANIK! Sie werden in der Lage sein, sie wiederherzustellen! .PP Das erste, was Sie tun mÃŧssen, ist, weitere Änderungen an Ihrem Festplatten\-Array zu vermeiden. Deaktivieren Sie alle Remote\-Verbindungen dazu und alle geplanten Prozesse, einschließlich geplanter SnapRAID\-nächtlicher \`sync\`\- oder \`scrub\`\-Läufe. .PP Fahren Sie dann mit den folgenden Schritten fort. .SS STEP 1 \-> Reconfigure Sie benÃļtigen etwas Platz zur Wiederherstellung, idealerweise auf zusätzlichen Ersatzfestplatten, aber eine externe USB\-Festplatte oder eine Remote\-Festplatte ist ausreichend. .PP Ändern Sie die SnapRAID\-Konfigurationsdatei so, dass die \`data\`\- oder \`parity\`\-Option der ausgefallenen Festplatte auf einen Ort mit genÃŧgend leerem Speicherplatz zur Wiederherstellung der Dateien zeigt. .PP Wenn zum Beispiel die Festplatte \`d1\` ausgefallen ist, ändern Sie von: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP zu: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Wenn die wiederherzustellende Festplatte eine Paritätsfestplatte ist, aktualisieren Sie die entsprechende \`parity\`\-Option. Wenn Sie mehrere ausgefallene Festplatten haben, aktualisieren Sie alle ihre Konfigurationsoptionen. .SS STEP 2 \-> Fix FÃŧhren Sie den \`fix\`\-Befehl aus und speichern Sie das Protokoll in einer externen Datei mit: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP Wobei NAME der Name der Festplatte ist, wie z.B. \`d1\` in unserem vorherigen Beispiel. Wenn die wiederherzustellende Festplatte eine Paritätsfestplatte ist, verwenden Sie die Namen \`parity\`, \`2\-parity\`, usw. Wenn Sie mehrere ausgefallene Festplatten haben, verwenden Sie mehrere \-d\-Optionen, um alle anzugeben. .PP Dieser Befehl wird lange dauern. .PP Stellen Sie sicher, dass Sie einige Gigabyte frei haben, um die Datei fix.log zu speichern. FÃŧhren Sie ihn von einer Festplatte mit ausreichend freiem Speicherplatz aus. .PP Jetzt haben Sie alles wiederhergestellt, was wiederherstellbar ist. Wenn einige Dateien teilweise oder vollständig nicht wiederherstellbar sind, werden sie umbenannt, indem die Erweiterung \`.unrecoverable\` hinzugefÃŧgt wird. .PP Sie finden eine detaillierte Liste aller nicht wiederherstellbaren BlÃļcke in der Datei fix.log, indem Sie alle Zeilen ÃŧberprÃŧfen, die mit \`unrecoverable:\` beginnen. .PP Wenn Sie mit der Wiederherstellung nicht zufrieden sind, kÃļnnen Sie sie so oft wie gewÃŧnscht wiederholen. .PP Wenn Sie zum Beispiel Dateien nach dem letzten \`sync\` aus dem Array entfernt haben, kann dies dazu fÃŧhren, dass einige Dateien nicht wiederhergestellt werden. In diesem Fall kÃļnnen Sie den \`fix\` mithilfe der Option \-i, \-\-import wiederholen, wobei Sie angeben, wo sich diese Dateien jetzt befinden, um sie erneut in den Wiederherstellungsprozess einzubeziehen. .PP Wenn Sie mit der Wiederherstellung zufrieden sind, kÃļnnen Sie fortfahren, aber beachten Sie, dass Sie nach der Synchronisierung den \`fix\`\-Befehl nicht mehr wiederholen kÃļnnen! .SS STEP 3 \-> Check Als vorsichtige ÜberprÃŧfung kÃļnnen Sie jetzt einen \`check\`\-Befehl ausfÃŧhren, um sicherzustellen, dass auf der wiederhergestellten Festplatte alles korrekt ist. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP Wobei NAME der Name der Festplatte ist, wie z.B. \`d1\` in unserem vorherigen Beispiel. .PP Die Optionen \-d und \-a weisen SnapRAID an, nur die angegebene Festplatte zu ÃŧberprÃŧfen und alle Paritätsdaten zu ignorieren. .PP Dieser Befehl wird lange dauern, aber wenn Sie nicht Ãŧbermäßig vorsichtig sind, kÃļnnen Sie ihn Ãŧberspringen. .SS STEP 4 \-> Sync FÃŧhren Sie den \`sync\`\-Befehl aus, um das Array mit der neuen Festplatte zu resynchronisieren. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Wenn alles wiederhergestellt ist, ist dieser Befehl sofort. .SH COMMANDS SnapRAID bietet einige einfache Befehle, mit denen Sie: .PD 0 .IP \(bu Den Status des Arrays ausgeben \-> \`status\` .IP \(bu Die Festplatten steuern \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Eine Sicherung/einen Snapshot erstellen \-> \`sync\` .IP \(bu Daten regelmäßig ÃŧberprÃŧfen \-> \`scrub\` .IP \(bu Die letzte Sicherung/den letzten Snapshot wiederherstellen \-> \`fix\`. .PD .PP Befehle mÃŧssen in Kleinbuchstaben geschrieben werden. .SS status Gibt eine Zusammenfassung des Zustands des Festplatten\-Arrays aus. .PP Es enthält Informationen zur Paritätsfragmentierung, wie alt die BlÃļcke sind, ohne ÜberprÃŧfung, und alle aufgezeichneten stillen Fehler, die beim Scrubbing aufgetreten sind. .PP Die präsentierten Informationen beziehen sich auf den letzten Zeitpunkt, zu dem Sie \`sync\` ausgefÃŧhrt haben. Spätere Änderungen werden nicht berÃŧcksichtigt. .PP Wenn fehlerhafte BlÃļcke erkannt wurden, werden deren Blocknummern aufgelistet. Um sie zu beheben, kÃļnnen Sie den Befehl \`fix \-e\` verwenden. .PP Es zeigt auch ein Diagramm an, das den letzten Zeitpunkt darstellt, zu dem jeder Block gescrubbed oder synchronisiert wurde. Gescrubbed BlÃļcke werden mit \`*\`, BlÃļcke, die synchronisiert, aber noch nicht gescrubbed wurden, mit \`o\` angezeigt. .PP Es wird nichts geändert. .SS smart Gibt einen SMART\-Bericht aller Festplatten im System aus. .PP Es enthält eine Schätzung der Ausfallwahrscheinlichkeit im nächsten Jahr, sodass Sie die Wartungsersetzung von Festplatten planen kÃļnnen, die verdächtige Attribute aufweisen. .PP Diese Wahrscheinlichkeitsschätzung wird durch Korrelation der SMART\-Attribute der Festplatten mit den Backblaze\-Daten erhalten, die unter folgender Adresse verfÃŧgbar sind: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Wenn SMART meldet, dass eine Festplatte ausfällt, wird \`FAIL\` oder \`PREFAIL\` fÃŧr diese Festplatte gedruckt, und SnapRAID endet mit einem Fehler. In diesem Fall wird ein sofortiger Austausch der Festplatte dringend empfohlen. .PP Weitere mÃļgliche Statuszeichenfolgen sind: .RS 4 .PD 0 .HP 4 .I logfail In der Vergangenheit lagen einige Attribute unter dem Schwellenwert. .HP 4 .I logerr Das Gerätefehlerprotokoll enthält Fehler. .HP 4 .I selferr Das Geräte\-Selbsttestprotokoll enthält Fehler. .PD .RE .PP Wenn die Option \-v, \-\-verbose angegeben ist, wird eine tiefere statistische Analyse bereitgestellt. Diese Analyse kann Ihnen bei der Entscheidung helfen, ob Sie mehr oder weniger Parität benÃļtigen. .PP Dieser Befehl verwendet das \`smartctl\`\-Tool und entspricht dem AusfÃŧhren von \`smartctl \-a\` auf allen Geräten. .PP Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, kÃļnnen Sie einen benutzerdefinierten Befehl mithilfe der \`smartctl\`\-Option in der Konfigurationsdatei angeben. .PP Es wird nichts geändert. .SS probe Gibt den POWER\-Zustand aller Festplatten im System aus. .PP \`Standby\` bedeutet, dass die Festplatte nicht dreht. \`Active\` bedeutet, dass die Festplatte dreht. .PP Dieser Befehl verwendet das \`smartctl\`\-Tool und entspricht dem AusfÃŧhren von \`smartctl \-n standby \-i\` auf allen Geräten. .PP Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, kÃļnnen Sie einen benutzerdefinierten Befehl mithilfe der \`smartctl\`\-Option in der Konfigurationsdatei angeben. .PP Es wird nichts geändert. .SS up Dreht alle Festplatten des Arrays hoch (spins up). .PP Sie kÃļnnen nur bestimmte Festplatten mithilfe der Option \-d, \-\-filter\-disk hochdrehen. .PP Das gleichzeitige Hochdrehen aller Festplatten erfordert viel Strom. Stellen Sie sicher, dass Ihr Netzteil dies aushalten kann. .PP Es wird nichts geändert. .SS down Dreht alle Festplatten des Arrays herunter (spins down). .PP Dieser Befehl verwendet das \`smartctl\`\-Tool und entspricht dem AusfÃŧhren von \`smartctl \-s standby,now\` auf allen Geräten. .PP Sie kÃļnnen nur bestimmte Festplatten mithilfe der Option \-d, \-\-filter\-disk herunterdrehen. .PP Um automatisch bei einem Fehler herunterzufahren, kÃļnnen Sie die Option \-s, \-\-spin\-down\-on\-error mit jedem anderen Befehl verwenden, was dem manuellen AusfÃŧhren von \`down\` bei Auftreten eines Fehlers entspricht. .PP Es wird nichts geändert. .SS diff Listet alle Dateien auf, die seit dem letzten \`sync\` geändert wurden und deren Paritätsdaten neu berechnet werden mÃŧssen. .PP Dieser Befehl ÃŧberprÃŧft nicht die Dateidaten, sondern nur den Dateizeitstempel, die GrÃļße und die Inode. .PP Nach dem Auflisten aller geänderten Dateien wird eine Zusammenfassung der Änderungen präsentiert, gruppiert nach: .RS 4 .PD 0 .HP 4 .I equal Dateien, die sich seitdem nicht geändert haben. .HP 4 .I added Neu hinzugefÃŧgte Dateien, die vorher nicht vorhanden waren. .HP 4 .I removed Entfernte Dateien. .HP 4 .I updated Dateien mit einer anderen GrÃļße oder einem anderen Zeitstempel, was bedeutet, dass sie geändert wurden. .HP 4 .I moved Auf derselben Festplatte in ein anderes Verzeichnis verschobene Dateien. Sie werden durch denselben Namen, dieselbe GrÃļße, denselben Zeitstempel und dieselbe Inode, aber ein anderes Verzeichnis identifiziert. .HP 4 .I copied Dateien, die auf dieselbe oder eine andere Festplatte kopiert wurden, wobei die Originaldatei noch vorhanden ist. Sie werden dadurch identifiziert, dass sie denselben Namen, dieselbe GrÃļße und denselben Zeitstempel haben. Wenn der Subsekunden\-Zeitstempel Null ist, muss der vollständige Pfad Ãŧbereinstimmen, um identifiziert zu werden, nicht nur der Name. .HP 4 .I relocated Dateien, die auf dieselbe oder eine andere Festplatte verschoben wurden, wobei das Original verschwunden ist. Sie werden dadurch identifiziert, dass sie denselben Namen, dieselbe GrÃļße und denselben Zeitstempel haben. Wenn der Subsekunden\-Zeitstempel Null ist, muss der vollständige Pfad Ãŧbereinstimmen, um identifiziert zu werden. Im Gegensatz zu \'moved\' Dateien auf derselben Festplatte haben verschobene Dateien einen anderen Inode. .HP 4 .I restored Dateien mit einem anderen Inode, aber passendem Verzeichnis, Namen, GrÃļße und Zeitstempel. Dies sind in der Regel Dateien, die nach dem LÃļschen wiederhergestellt wurden. .PD .RE .PP Wenn ein \`sync\` erforderlich ist, ist der RÃŧckgabecode des Prozesses 2 anstelle des Standardwerts 0. Der RÃŧckgabecode 1 wird fÃŧr eine allgemeine Fehlerbedingung verwendet. .PP Es wird nichts geändert. .SS sync Aktualisiert die Paritätsinformationen. Alle geänderten Dateien im Festplatten\-Array werden gelesen, und die entsprechenden Paritätsdaten werden aktualisiert. .PP Sie kÃļnnen diesen Vorgang jederzeit durch DrÃŧcken von Strg+C anhalten, ohne die bereits geleistete Arbeit zu verlieren. Beim nächsten Lauf wird der \`sync\`\-Vorgang dort fortgesetzt, wo er unterbrochen wurde. .PP Wenn während des Vorgangs stille oder Eingabe\-/Ausgabefehler gefunden werden, werden die entsprechenden BlÃļcke als fehlerhaft markiert. .PP Dateien werden durch Pfad und/oder Inode identifiziert und anhand von GrÃļße und Zeitstempel ÃŧberprÃŧft. Wenn die DateigrÃļße oder der Zeitstempel abweicht, werden die Paritätsdaten fÃŧr die gesamte Datei neu berechnet. Wenn die Datei auf derselben Festplatte verschoben oder umbenannt wird und dieselbe Inode beibehält, wird die Parität nicht neu berechnet. Wenn die Datei auf eine andere Festplatte verschoben wird, wird die Parität neu berechnet, aber die zuvor berechneten Hash\-Informationen werden beibehalten. .PP Die \`content\`\- und \`parity\`\-Dateien werden bei Bedarf geändert. Die Dateien im Array werden NICHT geändert. .SS scrub Scrubbt das Array und ÃŧberprÃŧft auf stille oder Eingabe\-/Ausgabefehler auf Daten\- und Paritätsfestplatten. .PP Jede AusfÃŧhrung ÃŧberprÃŧft ungefähr 8% des Arrays, ausgenommen Daten, die bereits in den letzten 10 Tagen gescrubbed wurden. Dies bedeutet, dass Scrubbing einmal pro Woche sicherstellt, dass jedes Bit an Daten mindestens einmal alle drei Monate ÃŧberprÃŧft wird. .PP Sie kÃļnnen einen anderen Scrub\-Plan oder eine andere Menge mithilfe der Option \-p, \-\-plan definieren, die Folgendes akzeptiert: bad \- Scrubbt als fehlerhaft markierte BlÃļcke. new \- Scrubbt gerade synchronisierte BlÃļcke, die noch nicht gescrubbed .PP .RS 4 wurden. .RE .RS 0 .PD 0 .HP 4 .I full Scrubbt alles. .HP 4 .I 0\-100 Scrubbt den angegebenen Prozentsatz der BlÃļcke. .PD .RE .PP Wenn Sie einen Prozentsatz angeben, kÃļnnen Sie auch die Option \-o, \-\-older\-than verwenden, um festzulegen, wie alt der Block sein soll. Die ältesten BlÃļcke werden zuerst gescrubbed, um eine optimale ÜberprÃŧfung zu gewährleisten. Wenn Sie nur die gerade synchronisierten BlÃļcke scrubben mÃļchten, die noch nicht gescrubbed wurden, verwenden Sie die Option \`\-p new\`. .PP Um Details zum Scrub\-Status zu erhalten, verwenden Sie den Befehl \`status\`. .PP FÃŧr jeden gefundenen stillen oder Eingabe\-/Ausgabefehler werden die entsprechenden BlÃļcke in der \`content\`\-Datei als fehlerhaft (bad) markiert. Diese fehlerhaften BlÃļcke werden in \`status\` aufgelistet und kÃļnnen mit \`fix \-e\` behoben werden. Nach der Behebung werden sie beim nächsten Scrub erneut ÃŧberprÃŧft, und wenn sie als korrigiert befunden werden, wird die fehlerhafte Markierung entfernt. Um nur die fehlerhaften BlÃļcke zu scrubben, kÃļnnen Sie den Befehl \`scrub \-p bad\` verwenden. .PP Es wird empfohlen, \`scrub\` nur auf einem synchronisierten Array auszufÃŧhren, um gemeldete Fehler zu vermeiden, die durch nicht synchronisierte Daten verursacht werden. Diese Fehler werden als keine stillen Fehler erkannt, und die BlÃļcke werden nicht als fehlerhaft markiert, aber solche Fehler werden in der Ausgabe des Befehls gemeldet. .PP Die \`content\`\-Datei wird geändert, um die Zeit der letzten ÜberprÃŧfung fÃŧr jeden Block zu aktualisieren und fehlerhafte BlÃļcke zu markieren. Die \`parity\`\-Dateien werden NICHT geändert. Die Dateien im Array werden NICHT geändert. .SS fix Behebt alle Dateien und die Paritätsdaten. .PP Alle Dateien und Paritätsdaten werden mit dem Snapshot\-Zustand verglichen, der beim letzten \`sync\` gespeichert wurde. Wenn eine Abweichung gefunden wird, wird sie auf den gespeicherten Snapshot zurÃŧckgesetzt. .PP WARNUNG! Der Befehl \`fix\` unterscheidet nicht zwischen Fehlern und beabsichtigten Änderungen. Er setzt den Dateizustand bedingungslos auf den letzten \`sync\` zurÃŧck. .PP Wenn keine andere Option angegeben ist, wird das gesamte Array verarbeitet. Verwenden Sie die Filteroptionen, um eine Teilmenge von Dateien oder Festplatten fÃŧr die Operation auszuwählen. .PP Um nur die BlÃļcke zu beheben, die während \`sync\` und \`scrub\` als fehlerhaft markiert wurden, verwenden Sie die Option \-e, \-\-filter\-error. Im Gegensatz zu anderen Filteroptionen wendet diese Behebungen nur auf Dateien an, die seit dem letzten \`sync\` unverändert sind. .PP SnapRAID benennt alle Dateien, die nicht behoben werden kÃļnnen, durch HinzufÃŧgen der Erweiterung \`.unrecoverable\` um. .PP Vor dem Beheben wird das gesamte Array gescannt, um alle Dateien zu finden, die seit der letzten \`sync\`\-Operation verschoben wurden. Diese Dateien werden anhand ihres Zeitstempels identifiziert, wobei Name und Verzeichnis ignoriert werden, und werden bei Bedarf im Wiederherstellungsprozess verwendet. Wenn Sie einige davon außerhalb des Arrays verschoben haben, kÃļnnen Sie die Option \-i, \-\-import verwenden, um zusätzliche Verzeichnisse zum Scannen anzugeben. .PP Dateien werden nur anhand des Pfads identifiziert, nicht anhand der Inode. .PP Die \`content\`\-Datei wird NICHT geändert. Die \`parity\`\-Dateien werden bei Bedarf geändert. Die Dateien im Array werden bei Bedarf geändert. .SS check ÜberprÃŧft alle Dateien und die Paritätsdaten. .PP Es funktioniert wie \`fix\`, simuliert jedoch nur eine Wiederherstellung, und es werden keine Änderungen in das Array geschrieben. .PP Dieser Befehl ist primär fÃŧr manuelle ÜberprÃŧfung gedacht, wie z.B. nach einem Wiederherstellungsprozess oder unter anderen speziellen Bedingungen. FÃŧr regelmäßige und geplante ÜberprÃŧfungen verwenden Sie \`scrub\`. .PP Wenn Sie die Option \-a, \-\-audit\-only verwenden, wird nur der Hash der Dateien ÃŧberprÃŧft, und die Paritätsdaten werden fÃŧr einen schnelleren Lauf ignoriert. .PP Dateien werden nur anhand des Pfads identifiziert, nicht anhand der Inode. .PP Es wird nichts geändert. .SS list Listet alle Dateien auf, die sich zum Zeitpunkt des letzten \`sync\` im Array befanden. .PP Mit \-v oder \-\-verbose wird auch die Untersekundenzeit angezeigt. .PP Es wird nichts geändert. .SS dup Listet alle doppelten Dateien auf. Zwei Dateien gelten als gleich, wenn ihre Hashes Ãŧbereinstimmen. Die Dateidaten werden nicht gelesen; es werden nur die vorab berechneten Hashes verwendet. .PP Es wird nichts geändert. .SS pool Erstellt oder aktualisiert eine virtuelle Ansicht aller Dateien in Ihrem Festplatten\-Array im \`pooling\`\-Verzeichnis. .PP Die Dateien werden nicht kopiert, sondern mithilfe symbolischer Links verknÃŧpft. .PP Beim Aktualisieren werden alle vorhandenen symbolischen Links und leeren Unterverzeichnisse gelÃļscht und durch die neue Ansicht des Arrays ersetzt. Alle anderen regulären Dateien bleiben erhalten. .PP Außerhalb des Pool\-Verzeichnisses wird nichts geändert. .SS devices Gibt die Low\-Level\-Geräte aus, die vom Array verwendet werden. .PP Dieser Befehl zeigt die Gerätezuordnungen im Array an und ist hauptsächlich als Skriptschnittstelle gedacht. .PP Die ersten beiden Spalten sind die Low\-Level\-Geräte\-ID und der Pfad. Die nächsten beiden Spalten sind die High\-Level\-Geräte\-ID und der Pfad. Die letzte Spalte ist der Festplattenname im Array. .PP In den meisten Fällen haben Sie ein Low\-Level\-Gerät fÃŧr jede Festplatte im Array, aber in einigen komplexeren Konfigurationen kÃļnnen mehrere Low\-Level\-Geräte von einer einzigen Festplatte im Array verwendet werden. .PP Es wird nichts geändert. .SS touch Setzt einen beliebigen Untersekunden\-Zeitstempel fÃŧr alle Dateien, deren Untersekunden\-Zeitstempel auf Null gesetzt ist. .PP Dies verbessert die Fähigkeit von SnapRAID, verschobene und kopierte Dateien zu erkennen, da es den Zeitstempel fast eindeutig macht und mÃļgliche Duplikate reduziert. .PP Genauer gesagt, wenn der Untersekunden\-Zeitstempel nicht Null ist, wird eine verschobene oder kopierte Datei als solche identifiziert, wenn sie mit Name, GrÃļße und Zeitstempel Ãŧbereinstimmt. Wenn der Untersekunden\-Zeitstempel Null ist, wird sie nur als Kopie betrachtet, wenn der vollständige Pfad, die GrÃļße und der Zeitstempel alle Ãŧbereinstimmen. .PP Der Zeitstempel mit Sekundenpräzision wird nicht geändert, sodass alle Daten und Zeiten Ihrer Dateien erhalten bleiben. .SS rehash Plant eine Neu\-Hash\-Berechnung (rehash) des gesamten Arrays. .PP Dieser Befehl ändert die verwendete Hash\-Art, typischerweise beim Upgrade von einem 32\-Bit\-System auf ein 64\-Bit\-System, um von MurmurHash3 auf den schnelleren SpookyHash umzuschalten. .PP Wenn Sie bereits den optimalen Hash verwenden, tut dieser Befehl nichts und informiert Sie darÃŧber, dass keine Aktion erforderlich ist. .PP Die Neu\-Hash\-Berechnung wird nicht sofort durchgefÃŧhrt, sondern findet schrittweise während \`sync\` und \`scrub\` statt. .PP Sie kÃļnnen den Neu\-Hash\-Zustand mithilfe von \`status\` ÃŧberprÃŧfen. .PP Während der Neu\-Hash\-Berechnung behält SnapRAID die volle Funktionalität bei, mit der einzigen Ausnahme, dass \`dup\` keine doppelten Dateien mit einem anderen Hash erkennen kann. .SS locate Lokalisiert Dateien, die auf den Paritätsfestplatten gespeichert sind. FÃŧr jede Ãŧbereinstimmende Datei wird deren Position innerhalb der Paritätsdatei und die Anzahl der belegten Fragmente ausgegeben. .PP Sie kÃļnnen die Option \-t, \-\-tail verwenden, um den Vorgang auf Dateien zu beschränken, die den angegebenen Endbereich (Tail) der Parität belegen. .PP Wenn Sie diese Dateien neu zuweisen mÃļchten, kÃļnnen Sie die Option \-W, \-\-force\-realloc\-tail verwenden. Beachten Sie, dass solche Dateien während des Neuzuweisungsprozesses nicht durch die Parität geschÃŧtzt sind. .SH OPTIONS SnapRAID bietet die folgenden Optionen: .TP .B \-c, \-\-conf CONFIG Wählt die zu verwendende Konfigurationsdatei aus. Wenn nicht angegeben, wird unter Unix die Datei \`/usr/local/etc/snapraid.conf\` verwendet, falls sie existiert, andernfalls \`/etc/snapraid.conf\`. Unter Windows wird die Datei \`snapraid.conf\` im selben Verzeichnis wie \`snapraid.exe\` verwendet. .TP .B \-f, \-\-filter PATTERN Filtert die zu verarbeitenden Dateien in \`check\` und \`fix\`. Nur die Dateien, die dem angegebenen Muster entsprechen, werden verarbeitet. Diese Option kann mehrmals verwendet werden. Weitere Details zu Musterspezifikationen finden Sie im Abschnitt PATTERN. Unter Unix stellen Sie sicher, dass Globbing\-Zeichen in AnfÃŧhrungszeichen gesetzt werden, wenn sie verwendet werden. Diese Option kann nur mit \`check\` und \`fix\` verwendet werden. Sie kann nicht mit \`sync\` und \`scrub\` verwendet werden, da diese immer das gesamte Array verarbeiten. .TP .B \-d, \-\-filter\-disk NAME Filtert die zu verarbeitenden Festplatten in \`check\`, \`fix\`, \`up\` und \`down\`. Sie mÃŧssen einen Festplattennamen angeben, wie in der Konfigurationsdatei definiert. Sie kÃļnnen auch Paritätsfestplatten mit den Namen \`parity\`, \`2\-parity\`, \`3\-parity\`, usw. angeben, um Vorgänge auf eine bestimmte Paritätsfestplatte zu beschränken. Wenn Sie mehrere \-\-filter, \-\-filter\-disk und \-\-filter\-missing Optionen kombinieren, werden nur Dateien ausgewählt, die allen Filtern entsprechen. Diese Option kann mehrmals verwendet werden. Diese Option kann nur mit \`check\`, \`fix\`, \`up\` und \`down\` verwendet werden. Sie kann nicht mit \`sync\` und \`scrub\` verwendet werden, da diese immer das gesamte Array verarbeiten. .TP .B \-m, \-\-filter\-missing Filtert die zu verarbeitenden Dateien in \`check\` und \`fix\`. Nur die Dateien, die im Array fehlen oder gelÃļscht wurden, werden verarbeitet. Bei Verwendung mit \`fix\` fungiert dies als \`undelete\`\-Befehl (Wiederherstellung von GelÃļschtem). Wenn Sie mehrere \-\-filter, \-\-filter\-disk und \-\-filter\-missing Optionen kombinieren, werden nur Dateien ausgewählt, die allen Filtern entsprechen. Diese Option kann nur mit \`check\` und \`fix\` verwendet werden. Sie kann nicht mit \`sync\` und \`scrub\` verwendet werden, da diese immer das gesamte Array verarbeiten. .TP .B \-e, \-\-filter\-error Verarbeitet die Dateien mit Fehlern in \`check\` und \`fix\`. Es verarbeitet nur Dateien, deren BlÃļcke während \`sync\` und \`scrub\` als mit stillen oder Eingabe\-/Ausgabefehlern markiert wurden, wie in \`status\` aufgelistet. Diese Option kann nur mit \`check\` und \`fix\` verwendet werden. .TP .B \-p, \-\-plan PERC|bad|new|full Wählt den Scrub\-Plan aus. Wenn PERC ein numerischer Wert von 0 bis 100 ist, wird er als Prozentsatz der zu scrubbenden BlÃļcke interpretiert. Anstelle eines Prozentsatzes kÃļnnen Sie einen Plan angeben: \`bad\` scrubbt fehlerhafte BlÃļcke, \`new\` scrubbt BlÃļcke, die noch nicht gescrubbed wurden, und \`full\` scrubbt alles. Diese Option kann nur mit \`scrub\` verwendet werden. .TP .B \-o, \-\-older\-than DAYS Wählt den ältesten Teil des Arrays aus, der in \`scrub\` verarbeitet werden soll. DAYS ist das Mindestalter in Tagen, damit ein Block gescrubbed werden kann; der Standardwert ist 10. BlÃļcke, die als fehlerhaft markiert sind, werden immer gescrubbed, unabhängig von dieser Option. Diese Option kann nur mit \`scrub\` verwendet werden. .TP .B \-a, \-\-audit\-only ÜberprÃŧft in \`check\` den Hash der Dateien, ohne die Paritätsdaten zu ÃŧberprÃŧfen. Wenn Sie nur an der ÜberprÃŧfung der Dateidaten interessiert sind, kann diese Option den ÜberprÃŧfungsprozess erheblich beschleunigen. Diese Option kann nur mit \`check\` verwendet werden. .TP .B \-h, \-\-pre\-hash FÃŧhrt in \`sync\` eine vorläufige Hash\-Phase aller neuen Daten zur zusätzlichen ÜberprÃŧfung vor der Paritätsberechnung durch. Normalerweise wird in \`sync\` keine vorläufige Hash\-Berechnung durchgefÃŧhrt, und die neuen Daten werden unmittelbar vor der Paritätsberechnung gehasht, wenn sie zum ersten Mal gelesen werden. Dieser Vorgang tritt auf, wenn das System unter starker Last steht, wobei alle Festplatten drehen und eine ausgelastete CPU vorliegt. Dies ist ein Extremzustand fÃŧr die Maschine, und wenn sie ein latentes Hardwareproblem hat, kÃļnnen stille Fehler unentdeckt bleiben, da die Daten noch nicht gehasht sind. Um dieses Risiko zu vermeiden, kÃļnnen Sie den \`pre\-hash\`\-Modus aktivieren, um alle Daten zweimal lesen zu lassen und so ihre Integrität sicherzustellen. Diese Option ÃŧberprÃŧft auch im Array verschobene Dateien, um sicherzustellen, dass die Verschiebeoperation erfolgreich war, und ermÃļglicht es Ihnen, bei Bedarf eine \`fix\`\-Operation durchzufÃŧhren, bevor Sie fortfahren. Diese Option kann nur mit \`sync\` verwendet werden. .TP .B \-i, \-\-import DIR Importiert aus dem angegebenen Verzeichnis alle Dateien, die nach dem letzten \`sync\` aus dem Array gelÃļscht wurden. Wenn Sie solche Dateien noch haben, kÃļnnen sie von \`check\` und \`fix\` verwendet werden, um den Wiederherstellungsprozess zu verbessern. Die Dateien werden gelesen, auch in Unterverzeichnissen, und unabhängig von ihrem Namen identifiziert. Diese Option kann nur mit \`check\` und \`fix\` verwendet werden. .TP .B \-s, \-\-spin\-down\-on\-error Dreht bei jedem Fehler alle verwalteten Festplatten herunter, bevor mit einem von Null verschiedenen Statuscode beendet wird. Dies verhindert, dass die Laufwerke nach einem abgebrochenen Vorgang aktiv bleiben und drehen, was unnÃļtige Hitzeentwicklung und Stromverbrauch vermeiden hilft. Verwenden Sie diese Option, um sicherzustellen, dass die Festplatten auch bei einem Befehlsfehler sicher gestoppt werden. .TP .B \-w, \-\-bw\-limit RATE Wendet eine globale Bandbreitenbegrenzung fÃŧr alle Festplatten an. RATE ist die Anzahl der Bytes pro Sekunde. Sie kÃļnnen einen Multiplikator wie K, M oder G angeben (z.B. \-\-bw\-limit 1G). .TP .B \-t, \-\-tail GRÖSSE Beschränkt die Dateiliste auf diejenigen, die nicht mehr als die angegebene Tail\-GrÃļße der Paritätsfestplatten belegen. Sie kÃļnnen Multiplikatoren wie K, M, G oder T verwenden (z. B. \-\-tail 1G). Diese Option ist nur in Verbindung mit dem Befehl \`locate\` gÃŧltig. .TP .B \-A, \-\-stats Aktiviert eine erweiterte Statusansicht, die zusätzliche Informationen anzeigt. Der Bildschirm zeigt zwei Diagramme an: Das erste Diagramm zeigt die Anzahl der gepufferten Stripes fÃŧr jede Festplatte sowie den Dateipfad der Datei, auf die derzeit auf dieser Festplatte zugegriffen wird. Typischerweise hat die langsamste Festplatte keinen verfÃŧgbaren Puffer, was die maximal erreichbare Bandbreite bestimmt. Das zweite Diagramm zeigt den Prozentsatz der Wartezeit Ãŧber die letzten 100 Sekunden. Es wird erwartet, dass die langsamste Festplatte die meiste Wartezeit verursacht, während andere Festplatten wenig oder keine Wartezeit haben sollten, da sie ihre gepufferten Stripes verwenden kÃļnnen. Dieses Diagramm zeigt auch die Zeit an, die mit Warten auf Hash\-Berechnungen und RAID\-Berechnungen verbracht wurde. Alle Berechnungen laufen parallel zu den Festplattenoperationen. Solange fÃŧr mindestens eine Festplatte eine messbare Wartezeit vorhanden ist, deutet dies daher darauf hin, dass die CPU schnell genug ist, um mit der Arbeitslast Schritt zu halten. .TP .B \-Z, \-\-force\-zero Erzwingt den unsicheren Vorgang der Synchronisierung einer Datei mit NullgrÃļße, die zuvor nicht Null war. Wenn SnapRAID eine solche Bedingung erkennt, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, leicht zu erkennen, wann nach einem Systemabsturz einige zugegriffene Dateien abgeschnitten (truncated) wurden. Dies ist eine mÃļgliche Bedingung unter Linux mit den ext3/ext4\-Dateisystemen. Diese Option kann nur mit \`sync\` verwendet werden. .TP .B \-E, \-\-force\-empty Erzwingt den unsicheren Vorgang der Synchronisierung einer Festplatte, bei der alle ursprÃŧnglichen Dateien fehlen. Wenn SnapRAID erkennt, dass alle ursprÃŧnglich auf der Festplatte vorhandenen Dateien fehlen oder Ãŧberschrieben wurden, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, leicht zu erkennen, wann ein Daten\-Dateisystem nicht gemountet (eingehängt) ist. Diese Option kann nur mit \`sync\` verwendet werden. .TP .B \-U, \-\-force\-uuid Erzwingt den unsicheren Vorgang der Synchronisierung, ÜberprÃŧfung und Behebung mit Festplatten, deren UUID geändert wurde. Wenn SnapRAID erkennt, dass einige Festplatten ihre UUID geändert haben, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, zu erkennen, wann Ihre Festplatten an den falschen Einhängepunkten gemountet sind. Es ist jedoch erlaubt, eine einzelne UUID\-Änderung mit einfacher Parität zu haben und mehr mit mehrfacher Parität, da dies der normale Fall beim Austausch von Festplatten nach einer Wiederherstellung ist. Diese Option kann nur mit \`sync\`, \`check\` oder \`fix\` verwendet werden. .TP .B \-D, \-\-force\-device Erzwingt den unsicheren Vorgang der Behebung mit unzugänglichen Festplatten oder mit Festplatten auf demselben physischen Gerät. Wenn Sie beispielsweise zwei Datenfestplatten verloren haben und eine Ersatzfestplatte haben, um nur die erste wiederherzustellen, kÃļnnen Sie die zweite unzugängliche Festplatte ignorieren. Oder wenn Sie eine Festplatte in dem auf einer bereits verwendeten Festplatte verbleibenden freien Speicherplatz wiederherstellen mÃļchten, wobei sie dasselbe physische Gerät gemeinsam nutzen. Diese Option kann nur mit \`fix\` verwendet werden. .TP .B \-N, \-\-force\-nocopy Deaktiviert in \`sync\`, \`check\` und \`fix\` die Kopiererkennungsheuristik. Ohne diese Option geht SnapRAID davon aus, dass Dateien mit den gleichen Attributen, wie Name, GrÃļße und Zeitstempel, Kopien mit denselben Daten sind. Dies ermÃļglicht die Identifizierung von kopierten oder von einer Festplatte auf eine andere verschobenen Dateien und die Wiederverwendung der bereits berechneten Hash\-Informationen, um stille Fehler zu erkennen oder fehlende Dateien wiederherzustellen. In einigen seltenen Fällen kann dieses Verhalten zu falsch positiven Ergebnissen oder einem langsamen Vorgang aufgrund vieler Hash\-ÜberprÃŧfungen fÃŧhren, und diese Option ermÃļglicht es Ihnen, solche Probleme zu beheben. Diese Option kann nur mit \`sync\`, \`check\` und \`fix\` verwendet werden. .TP .B \-F, \-\-force\-full Erzwingt in \`sync\` eine vollständige Neuberechnung der Parität. Diese Option kann verwendet werden, wenn Sie eine neue Paritätsstufe hinzufÃŧgen oder wenn Sie zu einer alten Content\-Datei mit neueren Paritätsdaten zurÃŧckgekehrt sind. Anstatt die Parität von Grund auf neu zu erstellen, ermÃļglicht dies die Wiederverwendung der in der Content\-Datei vorhandenen Hashes zur Validierung von Daten und zur Aufrechterhaltung des Datenschutzes während des \`sync\`\-Vorgangs unter Verwendung der vorhandenen Paritätsdaten. Diese Option kann nur mit \`sync\` verwendet werden. .TP .B \-R, \-\-force\-realloc Erzwingt in \`sync\` eine vollständige Neuallokation von Dateien und eine Wiederherstellung der Parität. Diese Option kann verwendet werden, um alle Dateien vollständig neu zuzuweisen und die Fragmentierung zu entfernen, während die in der Content\-Datei vorhandenen Hashes zur Validierung von Daten wiederverwendet werden. Diese Option kann nur mit \`sync\` verwendet werden. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, sie nicht zu verwenden. Sie haben während der \`sync\`\-Operation KEINEN Datenschutz. .TP .B \-W, \-\-force\-realloc\-tail GRÖSSE Funktioniert wie \-R, \-\-force\-realloc, ist jedoch auf den angegebenen Endbereich (die letzten GRÖSSE Bytes) jeder Paritätsdatei beschränkt. Erzwingt die Neuzuweisung (Verschiebung) aller Dateifragmente/\-blÃļcke, die derzeit in diesem Endabschnitt gespeichert sind, sodass sie an beliebiger Stelle in den Paritätsdateien platziert werden kÃļnnen, wo freier Speicherplatz verfÃŧgbar ist (einschließlich vorhandener LÃŧcken). Der Hauptzweck dieser Option besteht darin, die GrÃļße der Paritätsdatei auf der Festplatte zu verringern. Wenn die Neuzuweisung den gesamten Endabschnitt erfolgreich leert (keine BlÃļcke verbleiben dort), wird die Paritätsdatei gekÃŧrzt, wodurch der ungenutzte Endbereich freigegeben wird. Sie kÃļnnen Multiplikatoren wie K, M, G oder T verwenden (z. B. \-\-force\-realloc\-tail 1G). Sie kÃļnnen locate \-t, \-\-tail verwenden, um die betroffenen Dateien im Voraus zu ermitteln. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht und es wird dringend empfohlen, sie nicht zu verwenden. Während des \`sync\`\-Vorgangs besteht fÃŧr die betroffenen Dateien KEIN Datenschutz. .TP .B \-l, \-\-log FILE Schreibt ein detailliertes Protokoll in die angegebene Datei. Wenn diese Option nicht angegeben ist, werden unerwartete Fehler auf dem Bildschirm ausgegeben, was bei vielen Fehlern mÃļglicherweise zu einer Ãŧbermäßigen Ausgabe fÃŧhrt. Wenn \-l, \-\-log angegeben ist, werden nur schwerwiegende Fehler, die SnapRAID zum Stoppen bringen, auf dem Bildschirm ausgegeben. Wenn der Pfad mit \`>>\` beginnt, wird die Datei im Anhängemodus (append mode) geÃļffnet. Vorkommen von \`%D\` und \`%T\` im Namen werden durch Datum und Uhrzeit im Format YYYYMMDD bzw. HHMMSS ersetzt. In Windows\-Batch\-Dateien mÃŧssen Sie das \`%\`\-Zeichen verdoppeln, z.B. result\-%%D.log. Um \`>>\` zu verwenden, mÃŧssen Sie den Namen in AnfÃŧhrungszeichen setzen, z.B. \`\[dq]>>result.log\[dq]\`. Um das Protokoll an die Standardausgabe oder den Standardfehler auszugeben, kÃļnnen Sie \`\[dq]>&1\[dq]\` bzw. \`\[dq]>&2\[dq]\` verwenden. Beschreibungen der Protokoll\-Tags finden Sie in der Datei snapraid_log.txt oder in der Manpage. .TP .B \-L, \-\-error\-limit NUMBER Legt ein neues Fehlerlimit fest, bevor die AusfÃŧhrung gestoppt wird. Standardmäßig stoppt SnapRAID, wenn es mehr als 100 Eingabe\-/Ausgabefehler feststellt, was darauf hindeutet, dass eine Festplatte wahrscheinlich ausfällt. Diese Option wirkt sich auf \`sync\` und \`scrub\` aus, denen es gestattet ist, nach dem ersten Satz von Festplattenfehlern fortzufahren, um ihre Vorgänge abzuschließen. \`check\` und \`fix\` stoppen jedoch immer beim ersten Fehler. .TP .B \-S, \-\-start BLKSTART Startet die Verarbeitung ab der angegebenen Blocknummer. Dies kann nÃŧtzlich sein, um die ÜberprÃŧfung oder Behebung spezifischer BlÃļcke im Falle einer beschädigten Festplatte zu wiederholen. Diese Option ist hauptsächlich fÃŧr die erweiterte manuelle Wiederherstellung gedacht. .TP .B \-B, \-\-count BLKCOUNT Verarbeitet nur die angegebene Anzahl von BlÃļcken. Diese Option ist hauptsächlich fÃŧr die erweiterte manuelle Wiederherstellung gedacht. .TP .B \-C, \-\-gen\-conf CONTENT Generiert eine Dummy\-Konfigurationsdatei aus einer vorhandenen Content\-Datei. Die Konfigurationsdatei wird in die Standardausgabe geschrieben und Ãŧberschreibt keine vorhandene. Diese Konfigurationsdatei enthält auch die Informationen, die zur Rekonstruktion der Festplatten\-Einhängepunkte erforderlich sind, falls Sie das gesamte System verlieren. .TP .B \-v, \-\-verbose Gibt mehr Informationen auf dem Bildschirm aus. Wenn einmal angegeben, werden ausgeschlossene Dateien und zusätzliche Statistiken gedruckt. Diese Option hat keine Auswirkung auf die Protokolldateien. .TP .B \-q, \-\-quiet Gibt weniger Informationen auf dem Bildschirm aus. Wenn einmal angegeben, wird die Fortschrittsleiste entfernt; zweimal, die laufenden Operationen; dreimal, die Info\-Meldungen; viermal, die Statusmeldungen. Schwerwiegende Fehler werden immer auf dem Bildschirm ausgegeben. Diese Option hat keine Auswirkung auf die Protokolldateien. .TP .B \-H, \-\-help Gibt eine kurze Hilfeanzeige aus. .TP .B \-V, \-\-version Gibt die Programmversion aus. .SH CONFIGURATION SnapRAID benÃļtigt eine Konfigurationsdatei, um zu wissen, wo sich Ihr Festplatten\-Array befindet und wo die Paritätsinformationen gespeichert werden sollen. .PP Unter Unix wird die Datei \`/usr/local/etc/snapraid.conf\` verwendet, falls sie existiert, andernfalls \`/etc/snapraid.conf\`. Unter Windows wird die Datei \`snapraid.conf\` im selben Verzeichnis wie \`snapraid.exe\` verwendet. .PP Sie muss die folgenden Optionen (Groß\- und Kleinschreibung beachten) enthalten: .SS parity FILE [,FILE] ... Definiert die Dateien, die zum Speichern der Paritätsinformationen verwendet werden sollen. Die Parität ermÃļglicht den Schutz vor einem einzelnen Festplattenausfall, ähnlich wie bei RAID5. .PP Sie kÃļnnen mehrere Dateien angeben, die sich auf unterschiedlichen Festplatten befinden mÃŧssen. Wenn eine Datei nicht mehr wachsen kann, wird die nächste verwendet. Der gesamte verfÃŧgbare Platz muss mindestens so groß sein wie die grÃļßte Datenfestplatte im Array. .PP Sie kÃļnnen später zusätzliche Paritätsdateien hinzufÃŧgen, aber Sie kÃļnnen sie nicht neu anordnen oder entfernen. .PP Das Reservieren der Paritätsfestplatten fÃŧr Parität stellt sicher, dass sie nicht fragmentiert werden, was die Leistung verbessert. .PP Unter Windows werden 256 MB auf jeder Festplatte ungenutzt gelassen, um die Warnung vor vollen Festplatten zu vermeiden. .PP Diese Option ist obligatorisch und kann nur einmal verwendet werden. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... Definiert die Dateien, die zum Speichern zusätzlicher Paritätsinformationen verwendet werden sollen. .PP FÃŧr jede angegebene Paritätsstufe wird eine zusätzliche Schutzstufe aktiviert: .PD 0 .IP \(bu 2\-parity aktiviert RAID6 Dual\-Parität. .IP \(bu 3\-parity aktiviert Triple\-Parität. .IP \(bu 4\-parity aktiviert Quad\- (vierfache) Parität. .IP \(bu 5\-parity aktiviert Penta\- (fÃŧnffache) Parität. .IP \(bu 6\-parity aktiviert Hexa\- (sechsfache) Parität. .PD .PP Jede Paritätsstufe erfordert die Anwesenheit aller vorherigen Paritätsstufen. .PP Die gleichen Überlegungen wie bei der Option \`parity\` gelten. .PP Diese Optionen sind optional und kÃļnnen nur einmal verwendet werden. .SS z\-parity FILE [,FILE] ... Definiert eine alternative Datei und ein alternatives Format zum Speichern von Triple\-Parität. .PP Diese Option ist eine Alternative zu \`3\-parity\`, die primär fÃŧr Low\-End\-CPUs wie ARM oder AMD Phenom, Athlon und Opteron gedacht ist, die den SSSE3\-Befehlssatz nicht unterstÃŧtzen. In solchen Fällen bietet sie eine bessere Leistung. .PP Dieses Format ähnelt dem von ZFS RAIDZ3, ist aber schneller. Wie ZFS funktioniert es nicht jenseits der Triple\-Parität. .PP Bei Verwendung von \`3\-parity\` werden Sie gewarnt, wenn das \`z\-parity\`\-Format zur Leistungsverbesserung empfohlen wird. .PP Es ist mÃļglich, von einem Format in ein anderes zu konvertieren, indem die Konfigurationsdatei mit der gewÃŧnschten z\-parity\- oder 3\-parity\-Datei angepasst und \`fix\` zur Neuerstellung verwendet wird. .SS content FILE Definiert die Datei, die zum Speichern der Liste und PrÃŧfsummen aller im Festplatten\-Array vorhandenen Dateien verwendet werden soll. .PP Sie kann auf einer fÃŧr Daten, Parität oder einer anderen verfÃŧgbaren Festplatte platziert werden. Wenn Sie eine Datenfestplatte verwenden, wird diese Datei automatisch vom \`sync\`\-Vorgang ausgeschlossen. .PP Diese Option ist obligatorisch und kann mehrmals verwendet werden, um mehrere Kopien derselben Datei zu speichern. .PP Sie mÃŧssen mindestens eine Kopie fÃŧr jede verwendete Paritätsfestplatte plus eine speichern. Die Verwendung zusätzlicher Kopien schadet nicht. .SS data NAME DIR Definiert den Namen und den Einhängepunkt (Mount Point) der Datenfestplatten im Array. NAME wird zur Identifizierung der Festplatte verwendet und muss eindeutig sein. DIR ist der Einhängepunkt der Festplatte im Dateisystem. .PP Sie kÃļnnen den Einhängepunkt nach Bedarf ändern, solange Sie den NAME unverändert lassen. .PP Sie sollten eine Option fÃŧr jede Datenfestplatte im Array verwenden. .PP Sie kÃļnnen eine Festplatte später umbenennen, indem Sie den NAME direkt in der Konfigurationsdatei ändern und dann einen \`sync\`\-Befehl ausfÃŧhren. Im Falle einer Umbenennung erfolgt die Zuordnung mithilfe der gespeicherten UUID der Festplatten. .SS extra NAME DIR Definiert den Namen und Einhängepunkt zusätzlicher Festplatten, die mit den Befehlen \`smart\` und \`probe\` Ãŧberwacht werden sollen. .PP Dies ist nÃŧtzlich fÃŧr die Überwachung von Festplatten, die nicht Teil des Arrays sind, aber fÃŧr das Funktionieren des Systems erforderlich sind, wie z. B. die Boot\-Festplatte. .PP Beachten Sie, dass solche Festplatten nicht von den Befehlen \`up\` und \`down\` betroffen sind, da von ihnen erwartet wird, dass sie sich immer drehen. .SS nohidden Schließt alle versteckten Dateien und Verzeichnisse aus. Unter Unix sind versteckte Dateien solche, die mit \`.\` beginnen. Unter Windows sind es solche mit dem versteckten Attribut. .SS exclude/include PATTERN Definiert die Datei\- oder Verzeichnismuster, die im \`sync\`\-Vorgang ausgeschlossen oder eingeschlossen werden sollen. Alle Muster werden in der angegebenen Reihenfolge verarbeitet. .PP Wenn das erste Ãŧbereinstimmende Muster ein \`exclude\`\-Muster ist, wird die Datei ausgeschlossen. Wenn es ein \`include\`\-Muster ist, wird die Datei eingeschlossen. Wenn kein Muster Ãŧbereinstimmt, wird die Datei ausgeschlossen, wenn das zuletzt angegebene Muster ein \`include\` ist, oder eingeschlossen, wenn das zuletzt angegebene Muster ein \`exclude\` ist. .PP Weitere Details zu Musterspezifikationen finden Sie im Abschnitt PATTERN. .PP Diese Option kann mehrmals verwendet werden. .SS blocksize SIZE_IN_KIBIBYTES Definiert die grundlegende BlockgrÃļße in Kibibytes fÃŧr die Parität. Ein Kibibyte entspricht 1024 Bytes. .PP Die Standard\-BlockgrÃļße ist 256, was fÃŧr die meisten Fälle ausreichen sollte. .PP WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert zukÃŧnftig zu ändern, mÃŧssen Sie die gesamte Parität neu erstellen! .PP Ein Grund fÃŧr die Verwendung einer anderen BlockgrÃļße ist, wenn Sie viele kleine Dateien in der GrÃļßenordnung von Millionen haben. .PP FÃŧr jede Datei, auch wenn sie nur wenige Bytes groß ist, wird ein ganzer Block Parität zugewiesen, und bei vielen Dateien kann dies zu erheblichem ungenutztem Paritätsplatz fÃŧhren. Wenn Sie die Paritätsfestplatte vollständig fÃŧllen, dÃŧrfen Sie keine weiteren Dateien zu den Datenfestplatten hinzufÃŧgen. Der verschwendete Paritätsplatz akkumuliert sich jedoch nicht Ãŧber die Datenfestplatten hinweg. Verschwendeter Platz, der durch eine hohe Anzahl von Dateien auf einer Datenfestplatte entsteht, begrenzt nur die Datenmenge auf dieser Datenfestplatte, nicht auf anderen. .PP Als Annäherung kÃļnnen Sie davon ausgehen, dass die Hälfte der BlockgrÃļße fÃŧr jede Datei verschwendet wird. Mit beispielsweise 100.000 Dateien und einer BlockgrÃļße von 256 KiB verschwenden Sie 12,8 GB Parität, was zu 12,8 GB weniger verfÃŧgbarem Speicherplatz auf der Datenfestplatte fÃŧhren kann. .PP Sie kÃļnnen die Menge des verschwendeten Platzes auf jeder Festplatte mithilfe von \`status\` ÃŧberprÃŧfen. Dies ist die Menge an Platz, die Sie auf den Datenfestplatten freilassen oder fÃŧr Dateien verwenden mÃŧssen, die nicht im Array enthalten sind. Wenn dieser Wert negativ ist, bedeutet dies, dass Sie kurz davor sind, die Parität zu fÃŧllen, und er stellt den Platz dar, den Sie noch verschwenden kÃļnnen. .PP Um dieses Problem zu vermeiden, kÃļnnen Sie eine grÃļßere Partition fÃŧr die Parität verwenden. Wenn die Paritätspartition beispielsweise 12,8 GB grÃļßer ist als die Datenfestplatten, haben Sie genÃŧgend zusätzlichen Platz, um bis zu 100.000 Dateien auf jeder Datenfestplatte ohne verschwendeten Platz zu verarbeiten. .PP Ein Trick, um eine grÃļßere Paritätspartition unter Linux zu erhalten, ist die Formatierung mit dem Befehl: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Dies fÃŧhrt zu etwa 1,5% zusätzlichem Speicherplatz, ungefähr 60 GB fÃŧr eine 4 TB Festplatte, was etwa 460.000 Dateien auf jeder Datenfestplatte ohne verschwendeten Platz ermÃļglicht. .SS hashsize SIZE_IN_BYTES Definiert die Hash\-GrÃļße in Bytes fÃŧr die gespeicherten BlÃļcke. .PP Die Standard\-Hash\-GrÃļße beträgt 16 Bytes (128 Bit), was fÃŧr die meisten Fälle ausreichen sollte. .PP WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert zukÃŧnftig zu ändern, mÃŧssen Sie die gesamte Parität neu erstellen! .PP Ein Grund fÃŧr die Verwendung einer anderen Hash\-GrÃļße ist, wenn Ihr System Ãŧber begrenzten Speicher verfÃŧgt. Als Faustregel benÃļtigt SnapRAID typischerweise 1 GiB RAM fÃŧr jede 16 TB Daten im Array. .PP Genauer gesagt benÃļtigt SnapRAID zum Speichern der Hashes der Daten ungefähr TS*(1+HS)/BS Bytes RAM, wobei TS die GesamtgrÃļße in Bytes Ihres Festplatten\-Arrays ist, BS die BlockgrÃļße in Bytes und HS die Hash\-GrÃļße in Bytes. .PP Mit beispielsweise 8 Festplatten à 4 TB, einer BlockgrÃļße von 256 KiB (1 KiB = 1024 Bytes) und einer Hash\-GrÃļße von 16 erhalten Sie: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB .PD 0 .PD .PP Bei einem Wechsel zu einer Hash\-GrÃļße von 8 erhalten Sie: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB .PD 0 .PD .PP Bei einem Wechsel zu einer BlockgrÃļße von 512 erhalten Sie: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB .PD 0 .PD .PP Bei einem Wechsel zu einer Hash\-GrÃļße von 8 und einer BlockgrÃļße von 512 erhalten Sie: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES Speichert den Zustand beim Synchronisieren oder Scrubben automatisch nach der angegebenen Menge an verarbeiteten GB. Diese Option ist nÃŧtzlich, um zu vermeiden, dass lange \`sync\`\-Befehle von vorne gestartet werden mÃŧssen, wenn sie durch einen Maschinenabsturz oder ein anderes Ereignis unterbrochen werden. .SS temp_limit TEMPERATURE_CELSIUS Legt die maximal zulässige Festplattentemperatur in Celsius fest. Wenn angegeben, ÃŧberprÃŧft SnapRAID regelmäßig die Temperatur aller Festplatten mithilfe des smartctl\-Tools. Die aktuellen Festplattentemperaturen werden während des Betriebs von SnapRAID angezeigt. Wenn eine Festplatte diesen Grenzwert Ãŧberschreitet, werden alle Vorgänge gestoppt, und die Festplatten werden fÃŧr die durch die Option \`temp_sleep\` definierte Dauer heruntergefahren (in den Standby\-Modus versetzt). Nach der Schlafperiode werden die Vorgänge fortgesetzt und mÃļglicherweise erneut pausiert, wenn der Temperaturgrenzwert erneut erreicht wird. .PP Während des Betriebs analysiert SnapRAID auch die Heizkurve jeder Festplatte und schätzt die langfristige stationäre Temperatur, die erwartet wird, wenn die Aktivität fortgesetzt wird. Die Schätzung wird nur durchgefÃŧhrt, nachdem die Festplattentemperatur viermal angestiegen ist, um sicherzustellen, dass genÃŧgend Datenpunkte zur VerfÃŧgung stehen, um einen zuverlässigen Trend festzustellen. Diese vorhergesagte stationäre Temperatur wird in Klammern neben dem aktuellen Wert angezeigt und hilft bei der Beurteilung, ob die KÃŧhlung des Systems ausreichend ist. Diese geschätzte Temperatur dient nur zu Informationszwecken und hat keine Auswirkung auf das Verhalten von SnapRAID. Die Aktionen des Programms basieren ausschließlich auf den tatsächlich gemessenen Festplattentemperaturen. .PP Um diese Analyse durchzufÃŧhren, benÃļtigt SnapRAID eine Referenz fÃŧr die Systemtemperatur. Es versucht zunächst, diese von verfÃŧgbaren Hardwaresensoren zu lesen. Wenn kein Systemsensor zugänglich ist, wird die niedrigste zu Beginn des Laufs gemessene Festplattentemperatur als Fallback\-Referenz verwendet. .PP Normalerweise zeigt SnapRAID nur die Temperatur der heißesten Festplatte an. Um die Temperatur aller Festplatten anzuzeigen, verwenden Sie die Option \-A oder \-\-stats. .SS temp_sleep TIME_IN_MINUTES Legt die Standby\-Zeit in Minuten fest, wenn der Temperaturgrenzwert erreicht wird. Während dieser Zeit bleiben die Festplatten heruntergefahren. Der Standardwert ist 5 Minuten. .SS pool DIR Definiert das Pooling\-Verzeichnis, in dem die virtuelle Ansicht des Festplatten\-Arrays mithilfe des Befehls \`pool\` erstellt wird. .PP Das Verzeichnis muss bereits existieren. .SS share UNC_DIR Definiert den Windows UNC\-Pfad, der fÃŧr den Remote\-Zugriff auf die Festplatten erforderlich ist. .PP Wenn diese Option angegeben ist, verwenden die im Pool\-Verzeichnis erstellten symbolischen Links diesen UNC\-Pfad, um auf die Festplatten zuzugreifen. Ohne diese Option verwenden die generierten symbolischen Links nur lokale Pfade, was die Freigabe des Pool\-Verzeichnisses Ãŧber das Netzwerk nicht ermÃļglicht. .PP Die symbolischen Links werden unter Verwendung des angegebenen UNC\-Pfads gebildet, wobei der in der \`data\`\-Option angegebene Festplattenname und schließlich das Dateiverzeichnis und der Name hinzugefÃŧgt werden. .PP Diese Option ist nur fÃŧr Windows erforderlich. .SS smartctl DISK/PARITY OPTIONS... Definiert benutzerdefinierte smartctl\-Optionen, um die SMART\-Attribute fÃŧr jede Festplatte abzurufen. Dies kann fÃŧr RAID\-Controller und einige USB\-Festplatten erforderlich sein, die nicht automatisch erkannt werden kÃļnnen. Der Platzhalter %s wird durch den Gerätenamen ersetzt, ist aber fÃŧr feste Geräte wie RAID\-Controller optional. .PP DISK ist derselbe Festplattenname, der in der \`data\`\-Option angegeben ist. PARITY ist einer der Paritätsnamen: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` oder \`z\-parity\`. .PP In den angegebenen OPTIONS wird die Zeichenfolge \`%s\` durch den Gerätenamen ersetzt. Bei RAID\-Controllern ist das Gerät wahrscheinlich fest, und Sie mÃŧssen \`%s\` mÃļglicherweise nicht verwenden. .PP Weitere mÃļgliche Optionen finden Sie in der smartmontools\-Dokumentation: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP Zum Beispiel: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignoriert das angegebene SMART\-Attribut bei der Berechnung der Wahrscheinlichkeit eines Festplattenausfalls. Diese Option ist nÃŧtzlich, wenn eine Festplatte ungewÃļhnliche oder irrefÃŧhrende Werte fÃŧr ein bestimmtes Attribut meldet. .PP DISK ist derselbe Festplattenname, der in der \`data\`\-Option angegeben ist. PARITY ist einer der Paritätsnamen: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` oder \`z\-parity\`. Der Sonderwert * kann verwendet werden, um das Attribut auf allen Festplatten zu ignorieren. .PP Um beispielsweise das Attribut \`Current Pending Sector Count\` auf allen Festplatten zu ignorieren: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Um es nur auf der ersten Paritätsfestplatte zu ignorieren: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples Ein Beispiel fÃŧr eine typische Konfiguration fÃŧr Unix ist: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Ein Beispiel fÃŧr eine typische Konfiguration fÃŧr Windows ist: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN Muster bieten eine flexible MÃļglichkeit, Dateien fÃŧr die Einbeziehung oder den Ausschluss zu filtern. Durch die Verwendung von Globbing\-Zeichen kÃļnnen Sie Regeln definieren, die mit bestimmten Dateinamen oder ganzen Verzeichnisstrukturen Ãŧbereinstimmen, ohne jeden Pfad manuell auflisten zu mÃŧssen. .PP Das Fragezeichen \`?\` entspricht einem beliebigen einzelnen Zeichen außer dem Verzeichnistrennzeichen. Dies macht es nÃŧtzlich fÃŧr den Abgleich von Dateinamen mit variablen Zeichen, während das Muster auf eine einzelne Verzeichnisebene beschränkt bleibt. .PP Der einfache Stern \`*\` entspricht einer beliebigen Folge von Zeichen, aber wie das Fragezeichen Ãŧberschreitet er niemals Verzeichnisgrenzen. Er stoppt beim Schrägstrich, was ihn fÃŧr den Abgleich innerhalb einer einzelnen Pfadkomponente geeignet macht. Dies ist das Standardverhalten von Wildcards, das vom Shell\- Globbing bekannt ist. .PP Der Doppelstern \`**\` ist mächtiger; er entspricht jeder Folge von Zeichen einschließlich Verzeichnistrennzeichen. Dies ermÃļglicht es Mustern, Ãŧber mehrere Verzeichnisebenen hinweg Ãŧbereinzustimmen. Wenn \`**\` direkt in ein Muster eingebettet ist, kann es null oder mehr Zeichen einschließlich Schrägstrichen zwischen dem umgebenden wÃļrtlichen Text entsprechen. .PP Die wichtigste Verwendung von \`**\` ist in der speziellen Form \`/**/\`. Dies entspricht null oder mehr vollständigen Verzeichnisebenen, was es mÃļglich macht, Dateien in jeder Tiefe eines Verzeichnisbaums abzugleichen, ohne die genaue Pfadstruktur zu kennen. Zum Beispiel entspricht das Muster \`src/**/main.js\` dem Pfad \`src/main.js\` (Überspringen von null Verzeichnissen), \`src/ui/main.js\` (Überspringen eines Verzeichnisses) und \`src/ui/components/main.js\` (Überspringen von zwei Verzeichnissen). .PP Zeichenklassen mit eckigen Klammern \`[]\` entsprechen einem einzelnen Zeichen aus einer bestimmten Menge oder einem Bereich. Wie die anderen Einzelzeichenmuster entsprechen sie nicht den Verzeichnistrennzeichen. Klassen unterstÃŧtzen Bereiche und Negierung durch ein Ausrufezeichen. .PP Der grundlegende Unterschied, den man sich merken sollte, ist, dass \`*\`, \`?\` und Zeichenklassen alle Verzeichnisgrenzen respektieren und nur innerhalb einer einzelnen Pfadkomponente Ãŧbereinstimmen, während \`**\` das einzige Muster ist, das Ãŧber Verzeichnistrennzeichen hinweg Ãŧbereinstimmen kann. .PP Es gibt vier verschiedene Arten von Mustern: .TP .B FILE Wählt jede Datei mit dem Namen FILE aus. Dieses Muster gilt nur fÃŧr Dateien, nicht fÃŧr Verzeichnisse. .TP .B DIR/ Wählt jedes Verzeichnis mit dem Namen DIR und alles darin aus. Dieses Muster gilt nur fÃŧr Verzeichnisse, nicht fÃŧr Dateien. .TP .B /PATH/FILE Wählt den exakt angegebenen Dateipfad aus. Dieses Muster gilt nur fÃŧr Dateien, nicht fÃŧr Verzeichnisse. .TP .B /PATH/DIR/ Wählt den exakt angegebenen Verzeichnispfad und alles darin aus. Dieses Muster gilt nur fÃŧr Verzeichnisse, nicht fÃŧr Dateien. .PP Wenn Sie einen absoluten Pfad angeben, der mit / beginnt, wird er auf das Array\-Stammverzeichnis angewendet, nicht auf das lokale Dateisystem\-Stammverzeichnis. .PP Unter Windows kÃļnnen Sie den Backslash \\ anstelle des Forward\-Slash / verwenden. Windows\-Systemverzeichnisse, Junctions, Einhängepunkte (Mount Points) und andere spezielle Windows\-Verzeichnisse werden als Dateien behandelt, was bedeutet, dass Sie zum Ausschließen eine Dateiregel verwenden mÃŧssen, nicht eine Verzeichnisregel. .PP Wenn der Dateiname ein Zeichen \`*\`, \`?\`, \`[\`, oder \`]\` enthält, mÃŧssen Sie es escapen, um zu vermeiden, dass es als Globbing\-Zeichen interpretiert wird. Unter Unix ist das Escape\-Zeichen \`\\\`; unter Windows ist es \`^\`. Wenn sich das Muster in der Befehlszeile befindet, mÃŧssen Sie das Escape\-Zeichen verdoppeln, um zu vermeiden, dass es von der Befehlsshell interpretiert wird. .PP In der Konfigurationsdatei kÃļnnen Sie verschiedene Strategien zum Filtern der zu verarbeitenden Dateien verwenden. Der einfachste Ansatz besteht darin, nur \`exclude\`\-Regeln zu verwenden, um alle Dateien und Verzeichnisse zu entfernen, die Sie nicht verarbeiten mÃļchten. Zum Beispiel: .PP .RS 4 # Schließt jede Datei namens \`*.unrecoverable\` aus .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Schließt das Stammverzeichnis \`/lost+found\` aus .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Schließt jedes Unterverzeichnis namens \`tmp\` aus .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP Der gegenteilige Ansatz besteht darin, nur die Dateien zu definieren, die Sie verarbeiten mÃļchten, indem Sie nur \`include\`\-Regeln verwenden. Zum Beispiel: .PP .RS 4 # Schließt nur einige Verzeichnisse ein .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Der letzte Ansatz besteht darin, \`exclude\`\- und \`include\`\-Regeln zu mischen. In diesem Fall ist die Reihenfolge der Regeln wichtig. FrÃŧhere Regeln haben Vorrang vor späteren. Zur Vereinfachung kÃļnnen Sie zuerst alle \`exclude\`\-Regeln und dann alle \`include\`\-Regeln auflisten. Zum Beispiel: .PP .RS 4 # Schließt jede Datei namens \`*.unrecoverable\` aus .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Schließt jedes Unterverzeichnis namens \`tmp\` aus .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Schließt nur einige Verzeichnisse ein .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP In der Befehlszeile kÃļnnen Sie mit der Option \-f nur \`include\`\-Muster verwenden. Zum Beispiel: .PP .RS 4 # ÜberprÃŧft nur die .mp3\-Dateien. .PD 0 .PP .PD # Unter Unix AnfÃŧhrungszeichen verwenden, um die Globbing\-Erweiterung durch die Shell zu vermeiden. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP Unter Unix mÃŧssen Sie Globbing\-Zeichen in der Befehlszeile in AnfÃŧhrungszeichen setzen, um zu verhindern, dass die Shell sie erweitert. .SH DATEIEN IGNORIEREN Zusätzlich zu den globalen Regeln in der Konfigurationsdatei kÃļnnen Sie \`.snapraidignore\`\-Dateien in jedem Verzeichnis innerhalb des Arrays platzieren, um dezentrale Ausschlussregeln zu definieren. .PP Regeln, die in \`.snapraidignore\` definiert sind, werden nach den Regeln in der Konfigurationsdatei angewendet. Dies bedeutet, dass sie eine hÃļhere Priorität haben und verwendet werden kÃļnnen, um Dateien auszuschließen, die zuvor durch die globale Konfiguration eingeschlossen wurden. Effektiv wird eine Datei ausgeschlossen, wenn eine lokale Regel zutrifft, unabhängig von den globalen Include\-Einstellungen. .PP Die Musterlogik in \`.snapraidignore\` spiegelt die globale Konfiguration wider, verankert die Muster jedoch an dem Verzeichnis, in dem sich die Datei befindet: .TP .B FILE Wählt jede Datei namens FILE in diesem Verzeichnis oder darunter aus. Dies folgt denselben Globbing\-Regeln wie das globale Muster. .TP .B DIR/ Wählt jedes Verzeichnis namens DIR und alles darin aus, das sich in diesem Verzeichnis oder darunter befindet. .TP .B /PATH/FILE Wählt die exakt angegebene Datei relativ zum Speicherort der \`.snapraidignore\`\-Datei aus. .TP .B /PATH/DIR/ Wählt das exakt angegebene Verzeichnis und alles darin aus, relativ zum Speicherort der \`.snapraidignore\`\-Datei. .PP Im Gegensatz zur globalen Konfiguration unterstÃŧtzen \`.snapraidignore\`\-Dateien nur Ausschlussregeln; Sie kÃļnnen keine \`include\`\-Muster oder Negationen (!) verwenden. .PP Wenn Sie beispielsweise eine \`.snapraidignore\` in \`/mnt/disk1/projects/\` haben: .PP .RS 4 # Schließt NUR /mnt/disk1/projects/output.bin aus .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Schließt jedes Verzeichnis namens \`build\` innerhalb von projects/ aus .PD 0 .PP .PD build/ .PD 0 .PP .PD # Schließt jede .tmp\-Datei innerhalb von projects/ oder deren Unterordnern aus .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID speichert die Liste und PrÃŧfsummen Ihrer Dateien in der Content\-Datei. .PP Es ist eine Binärdatei, die alle im Festplatten\-Array vorhandenen Dateien auflistet, zusammen mit allen PrÃŧfsummen zur ÜberprÃŧfung ihrer Integrität. .PP Diese Datei wird von den Befehlen \`sync\` und \`scrub\` gelesen und geschrieben und von den Befehlen \`fix\`, \`check\` und \`status\` gelesen. .SH PARITY SnapRAID speichert die Paritätsinformationen Ihres Arrays in den Paritätsdateien. .PP Dies sind Binärdateien, die die berechnete Parität aller in der \`content\`\-Datei definierten BlÃļcke enthalten. .PP Diese Dateien werden von den Befehlen \`sync\` und \`fix\` gelesen und geschrieben und nur von den Befehlen \`scrub\` und \`check\` gelesen. .SH ENCODING SnapRAID ignoriert unter Unix jede Kodierung. Es liest und speichert die Dateinamen mit derselben Kodierung, die vom Dateisystem verwendet wird. .PP Unter Windows werden alle vom Dateisystem gelesenen Namen konvertiert und im UTF\-8\-Format verarbeitet. .PP Um Dateinamen korrekt auszugeben, mÃŧssen Sie die Windows\-Konsole mit dem Befehl \`chcp 65001\` auf den UTF\-8\-Modus einstellen und eine TrueType\-Schriftart wie \`Lucida Console\` als Konsolenschriftart verwenden. Dies betrifft nur die gedruckten Dateinamen; wenn Sie die Konsolenausgabe in eine Datei umleiten, ist die resultierende Datei immer im UTF\-8\-Format. .SH COPYRIGHT Diese Datei ist Copyright (C) 2025 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-de.d000066400000000000000000002170651522717156100163730ustar00rootroot00000000000000Name{number} snapraid - SnapRAID Sicherung fÃŧr Festplatten-Arrays Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAID ist ein Sicherungsprogramm, das fÃŧr Festplatten-Arrays entwickelt wurde und Paritätsinformationen zur Datenwiederherstellung bei Ausfall von bis zu sechs Festplatten speichert. SnapRAID ist hauptsächlich fÃŧr Home-Media-Center mit großen, selten geänderten Dateien konzipiert und bietet folgende Funktionen: * Sie kÃļnnen bereits mit Dateien gefÃŧllte Festplatten verwenden, ohne sie neu formatieren zu mÃŧssen, und wie gewohnt darauf zugreifen. * Alle Ihre Daten werden gehasht, um die Datenintegrität zu gewährleisten und stille Beschädigung (silent corruption) zu verhindern. * Wenn die Anzahl der ausgefallenen Festplatten die Paritätsanzahl Ãŧberschreitet, beschränkt sich der Datenverlust auf die betroffenen Festplatten; Daten auf anderen Festplatten bleiben zugänglich. * Wenn Sie versehentlich Dateien auf einer Festplatte lÃļschen, ist eine Wiederherstellung mÃļglich. * Festplatten kÃļnnen unterschiedliche GrÃļßen haben. * Sie kÃļnnen jederzeit Festplatten hinzufÃŧgen. * SnapRAID sperrt Ihre Daten nicht ein; Sie kÃļnnen die Verwendung jederzeit beenden, ohne neu formatieren oder Daten verschieben zu mÃŧssen. * Um auf eine Datei zuzugreifen, muss nur eine einzige Festplatte drehen (spinnen), was Strom spart und Geräusche reduziert. FÃŧr weitere Informationen besuchen Sie bitte die offizielle SnapRAID-Website: :https://www.snapraid.it/ Limitations SnapRAID ist ein Hybrid aus einem RAID- und einem Sicherungsprogramm, das darauf abzielt, die besten Vorteile beider zu kombinieren. Es hat jedoch einige Einschränkungen, die Sie vor der Verwendung berÃŧcksichtigen sollten. Die Haupteinschränkung besteht darin, dass wenn eine Festplatte ausfällt und Sie in letzter Zeit keine Synchronisierung durchgefÃŧhrt haben, Sie mÃļglicherweise nicht vollständig wiederherstellen kÃļnnen. Genauer gesagt kÃļnnen Sie mÃļglicherweise nicht bis zur GrÃļße der geänderten oder gelÃļschten Dateien seit der letzten `sync`-Operation wiederherstellen. Dies tritt auch dann auf, wenn die geänderten oder gelÃļschten Dateien sich nicht auf der ausgefallenen Festplatte befinden. Aus diesem Grund ist SnapRAID besser fÃŧr Daten geeignet, die sich selten ändern. Andererseits verhindern neu hinzugefÃŧgte Dateien die Wiederherstellung von bereits vorhandenen Dateien nicht. Sie verlieren nur die kÃŧrzlich hinzugefÃŧgten Dateien, wenn diese sich auf der ausgefallenen Festplatte befinden. Weitere Einschränkungen von SnapRAID sind: * Mit SnapRAID haben Sie immer noch separate Dateisysteme fÃŧr jede Festplatte. Mit RAID erhalten Sie ein einziges großes Dateisystem. * SnapRAID streift (stripes) keine Daten. Mit RAID erhalten Sie einen Geschwindigkeitsvorteil durch Striping. * SnapRAID unterstÃŧtzt keine Echtzeit-Wiederherstellung. Mit RAID mÃŧssen Sie die Arbeit nicht unterbrechen, wenn eine Festplatte ausfällt. * SnapRAID kann Daten nur von einer begrenzten Anzahl von Festplattenausfällen wiederherstellen. Mit einer Sicherung kÃļnnen Sie von einem vollständigen Ausfall des gesamten Festplatten-Arrays wiederherstellen. * Nur Dateinamen, Zeitstempel, symbolische Links (symlinks) und Hardlinks werden gespeichert. Berechtigungen, EigentÃŧmerschaft und erweiterte Attribute werden nicht gespeichert. Getting Started Um SnapRAID zu verwenden, mÃŧssen Sie zuerst eine Festplatte in Ihrem Festplatten-Array auswählen, die fÃŧr `parity`-Informationen reserviert wird. Mit einer Festplatte fÃŧr Parität kÃļnnen Sie von einem einzelnen Festplattenausfall wiederherstellen, ähnlich wie bei RAID5. Wenn Sie von mehr Festplattenausfällen wiederherstellen mÃļchten, ähnlich wie bei RAID6, mÃŧssen Sie zusätzliche Festplatten fÃŧr Parität reservieren. Jede zusätzliche Paritätsfestplatte ermÃļglicht die Wiederherstellung von einem weiteren Festplattenausfall. Als Paritätsfestplatten mÃŧssen Sie die grÃļßten Festplatten im Array auswählen, da die Paritätsinformationen auf die GrÃļße der grÃļßten Datenfestplatte im Array anwachsen kÃļnnen. Diese Festplatten werden zum Speichern der `parity`-Dateien reserviert. Sie sollten Ihre Daten nicht darauf speichern. Anschließend mÃŧssen Sie die `data`-Festplatten definieren, die Sie mit SnapRAID schÃŧtzen mÃļchten. Der Schutz ist effektiver, wenn diese Festplatten Daten enthalten, die sich selten ändern. Aus diesem Grund ist es besser, die Windows C:\-Festplatte oder die Unix-Verzeichnisse /home, /var und /tmp NICHT einzuschließen. Die Liste der Dateien wird in den `content`-Dateien gespeichert, die normalerweise auf den Daten-, Paritäts- oder Boot-Festplatten gespeichert werden. Diese Datei enthält die Details Ihrer Sicherung, einschließlich aller PrÃŧfsummen zur ÜberprÃŧfung ihrer Integrität. Die `content`-Datei wird in mehreren Kopien gespeichert, und jede Kopie muss sich auf einer anderen Festplatte befinden, um sicherzustellen, dass selbst bei mehreren Festplattenausfällen mindestens eine Kopie verfÃŧgbar ist. Angenommen, Sie sind nur an einer Paritätsstufe des Schutzes interessiert und Ihre Festplatten befinden sich unter: :/mnt/diskp <- ausgewählte Festplatte fÃŧr Parität :/mnt/disk1 <- erste zu schÃŧtzende Festplatte :/mnt/disk2 <- zweite zu schÃŧtzende Festplatte :/mnt/disk3 <- dritte zu schÃŧtzende Festplatte Sie mÃŧssen die Konfigurationsdatei /etc/snapraid.conf mit den folgenden Optionen erstellen: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Wenn Sie Windows verwenden, sollten Sie das Windows-Pfadformat mit Laufwerksbuchstaben und Backslashes anstelle von Slashes verwenden. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Wenn Sie viele Festplatten haben und keine Laufwerksbuchstaben mehr verfÃŧgbar sind, kÃļnnen Sie Festplatten direkt in Unterordnern einhängen (mounten). Siehe: :https://www.google.com/search?q=Windows+mount+point Zu diesem Zeitpunkt sind Sie bereit, den Befehl `sync` auszufÃŧhren, um die Paritätsinformationen zu erstellen. :snapraid sync Dieser Vorgang kann beim ersten Mal mehrere Stunden dauern, abhängig von der GrÃļße der bereits auf den Festplatten vorhandenen Daten. Wenn die Festplatten leer sind, ist der Vorgang sofort abgeschlossen. Sie kÃļnnen ihn jederzeit durch DrÃŧcken von Strg+C anhalten, und beim nächsten Lauf wird er dort fortgesetzt, wo er unterbrochen wurde. Wenn dieser Befehl abgeschlossen ist, sind Ihre Daten SICHER. Jetzt kÃļnnen Sie Ihr Array nach Belieben verwenden und die Paritätsinformationen regelmäßig durch AusfÃŧhren des `sync`-Befehls aktualisieren. Scrubbing Um die Daten und die Parität regelmäßig auf Fehler zu ÃŧberprÃŧfen, kÃļnnen Sie den Befehl `scrub` ausfÃŧhren. :snapraid scrub Dieser Befehl vergleicht die Daten in Ihrem Array mit dem Hash, der während des `sync`-Befehls berechnet wurde, um die Integrität zu ÃŧberprÃŧfen. Jeder Lauf des Befehls ÃŧberprÃŧft ungefähr 8% des Arrays, ausgenommen Daten, die bereits in den letzten 10 Tagen gescrubbed wurden. Sie kÃļnnen die Option -p, --plan verwenden, um eine andere Menge anzugeben, und die Option -o, --older-than, um ein anderes Alter in Tagen anzugeben. Zum Beispiel, um 5% des Arrays auf BlÃļcke zu ÃŧberprÃŧfen, die älter als 20 Tage sind, verwenden Sie: :snapraid -p 5 -o 20 scrub Wenn während des Vorgangs stille oder Eingabe-/Ausgabefehler gefunden werden, werden die entsprechenden BlÃļcke in der `content`-Datei als fehlerhaft (bad) markiert und im Befehl `status` aufgelistet. :snapraid status Um sie zu beheben, kÃļnnen Sie den Befehl `fix` verwenden und dabei nach fehlerhaften BlÃļcken mit der Option -e, --filter-error filtern: :snapraid -e fix Beim nächsten `scrub` verschwinden die Fehler aus dem `status`-Bericht, wenn sie tatsächlich behoben sind. Um es schneller zu machen, kÃļnnen Sie -p bad verwenden, um nur als fehlerhaft markierte BlÃļcke zu scrubben. :snapraid -p bad scrub Das AusfÃŧhren von `scrub` auf einem nicht synchronisierten Array kann Fehler melden, die durch entfernte oder geänderte Dateien verursacht wurden. Diese Fehler werden in der `scrub`-Ausgabe gemeldet, aber die zugehÃļrigen BlÃļcke werden nicht als fehlerhaft markiert. Pooling Hinweis: Die unten beschriebene Pooling-Funktion wurde durch das Tool mergerfs ersetzt, das jetzt die empfohlene Option fÃŧr Linux-Benutzer in der SnapRAID-Community ist. Mergefs bietet eine flexiblere und effizientere MÃļglichkeit, mehrere Laufwerke zu einem einzigen, vereinheitlichten Einhängepunkt (Mount Point) zusammenzufassen, was einen nahtlosen Zugriff auf Dateien Ãŧber Ihr gesamtes Array hinweg ermÃļglicht, ohne auf symbolische Links angewiesen zu sein. Es lässt sich gut mit SnapRAID zum Paritätsschutz integrieren und wird häufig in Setups wie OpenMediaVault (OMV) oder benutzerdefinierten NAS-Konfigurationen verwendet. Um alle Dateien in Ihrem Array im selben Verzeichnisbaum anzuzeigen, kÃļnnen Sie die `pooling`-Funktion aktivieren. Sie erstellt eine schreibgeschÃŧtzte virtuelle Ansicht aller Dateien in Ihrem Array mithilfe symbolischer Links. Sie kÃļnnen das `pooling`-Verzeichnis in der Konfigurationsdatei mit folgender Option konfigurieren: :pool /pool oder, wenn Sie Windows verwenden, mit: :pool C:\pool und anschließend den Befehl `pool` ausfÃŧhren, um die virtuelle Ansicht zu erstellen oder zu aktualisieren. :snapraid pool Wenn Sie eine Unix-Plattform verwenden und dieses Verzeichnis Ãŧber das Netzwerk fÃŧr Windows- oder Unix-Maschinen freigeben mÃļchten, sollten Sie die folgenden Optionen zu Ihrer /etc/samba/smb.conf hinzufÃŧgen: :# Im globalen Abschnitt von smb.conf :unix extensions = no :# Im Freigabe-Abschnitt von smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes In Windows erfordert die Freigabe symbolischer Links Ãŧber ein Netzwerk, dass Clients diese remote auflÃļsen. Um dies zu ermÃļglichen, mÃŧssen Sie neben der Freigabe des Pool-Verzeichnisses auch alle Festplatten unabhängig freigeben, indem Sie die in der Konfigurationsdatei definierten Festplattennamen als Freigabepunkte verwenden. Sie mÃŧssen auch in der Option `share` der Konfigurationsdatei den Windows UNC-Pfad angeben, den Remote-Clients benÃļtigen, um auf diese freigegebenen Festplatten zuzugreifen. Zum Beispiel, wenn Sie von einem Server namens `darkstar` aus arbeiten, kÃļnnen Sie die Optionen verwenden: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar und die folgenden Verzeichnisse Ãŧber das Netzwerk freigeben: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array um Remote-Clients den Zugriff auf alle Dateien unter \\darkstar\pool zu ermÃļglichen. MÃļglicherweise mÃŧssen Sie auch Remote-Clients konfigurieren, um den Zugriff auf Remote-Symlinks mit dem Befehl zu aktivieren: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAID funktioniert eher wie ein Sicherungsprogramm als ein RAID-System und kann verwendet werden, um Dateien in ihren vorherigen Zustand wiederherzustellen oder das LÃļschen rÃŧckgängig zu machen, indem die Option -f, --filter verwendet wird: :snapraid fix -f DATEI oder fÃŧr ein Verzeichnis: :snapraid fix -f VERZEICHNIS/ Sie kÃļnnen es auch verwenden, um nur versehentlich gelÃļschte Dateien innerhalb eines Verzeichnisses wiederherzustellen, indem Sie die Option -m, --filter-missing verwenden, die nur fehlende Dateien wiederherstellt und alle anderen unberÃŧhrt lässt. :snapraid fix -m -f VERZEICHNIS/ Oder um alle gelÃļschten Dateien auf allen Laufwerken wiederherzustellen mit: :snapraid fix -m Recovering Das Schlimmste ist passiert, und Sie haben eine oder mehrere Festplatten verloren! KEINE PANIK! Sie werden in der Lage sein, sie wiederherzustellen! Das erste, was Sie tun mÃŧssen, ist, weitere Änderungen an Ihrem Festplatten-Array zu vermeiden. Deaktivieren Sie alle Remote-Verbindungen dazu und alle geplanten Prozesse, einschließlich geplanter SnapRAID-nächtlicher `sync`- oder `scrub`-Läufe. Fahren Sie dann mit den folgenden Schritten fort. STEP 1 -> Reconfigure Sie benÃļtigen etwas Platz zur Wiederherstellung, idealerweise auf zusätzlichen Ersatzfestplatten, aber eine externe USB-Festplatte oder eine Remote-Festplatte ist ausreichend. Ändern Sie die SnapRAID-Konfigurationsdatei so, dass die `data`- oder `parity`-Option der ausgefallenen Festplatte auf einen Ort mit genÃŧgend leerem Speicherplatz zur Wiederherstellung der Dateien zeigt. Wenn zum Beispiel die Festplatte `d1` ausgefallen ist, ändern Sie von: :data d1 /mnt/disk1/ zu: :data d1 /mnt/new_spare_disk/ Wenn die wiederherzustellende Festplatte eine Paritätsfestplatte ist, aktualisieren Sie die entsprechende `parity`-Option. Wenn Sie mehrere ausgefallene Festplatten haben, aktualisieren Sie alle ihre Konfigurationsoptionen. STEP 2 -> Fix FÃŧhren Sie den `fix`-Befehl aus und speichern Sie das Protokoll in einer externen Datei mit: :snapraid -d NAME -l fix.log fix Wobei NAME der Name der Festplatte ist, wie z.B. `d1` in unserem vorherigen Beispiel. Wenn die wiederherzustellende Festplatte eine Paritätsfestplatte ist, verwenden Sie die Namen `parity`, `2-parity`, usw. Wenn Sie mehrere ausgefallene Festplatten haben, verwenden Sie mehrere -d-Optionen, um alle anzugeben. Dieser Befehl wird lange dauern. Stellen Sie sicher, dass Sie einige Gigabyte frei haben, um die Datei fix.log zu speichern. FÃŧhren Sie ihn von einer Festplatte mit ausreichend freiem Speicherplatz aus. Jetzt haben Sie alles wiederhergestellt, was wiederherstellbar ist. Wenn einige Dateien teilweise oder vollständig nicht wiederherstellbar sind, werden sie umbenannt, indem die Erweiterung `.unrecoverable` hinzugefÃŧgt wird. Sie finden eine detaillierte Liste aller nicht wiederherstellbaren BlÃļcke in der Datei fix.log, indem Sie alle Zeilen ÃŧberprÃŧfen, die mit `unrecoverable:` beginnen. Wenn Sie mit der Wiederherstellung nicht zufrieden sind, kÃļnnen Sie sie so oft wie gewÃŧnscht wiederholen. Wenn Sie zum Beispiel Dateien nach dem letzten `sync` aus dem Array entfernt haben, kann dies dazu fÃŧhren, dass einige Dateien nicht wiederhergestellt werden. In diesem Fall kÃļnnen Sie den `fix` mithilfe der Option -i, --import wiederholen, wobei Sie angeben, wo sich diese Dateien jetzt befinden, um sie erneut in den Wiederherstellungsprozess einzubeziehen. Wenn Sie mit der Wiederherstellung zufrieden sind, kÃļnnen Sie fortfahren, aber beachten Sie, dass Sie nach der Synchronisierung den `fix`-Befehl nicht mehr wiederholen kÃļnnen! STEP 3 -> Check Als vorsichtige ÜberprÃŧfung kÃļnnen Sie jetzt einen `check`-Befehl ausfÃŧhren, um sicherzustellen, dass auf der wiederhergestellten Festplatte alles korrekt ist. :snapraid -d NAME -a check Wobei NAME der Name der Festplatte ist, wie z.B. `d1` in unserem vorherigen Beispiel. Die Optionen -d und -a weisen SnapRAID an, nur die angegebene Festplatte zu ÃŧberprÃŧfen und alle Paritätsdaten zu ignorieren. Dieser Befehl wird lange dauern, aber wenn Sie nicht Ãŧbermäßig vorsichtig sind, kÃļnnen Sie ihn Ãŧberspringen. STEP 4 -> Sync FÃŧhren Sie den `sync`-Befehl aus, um das Array mit der neuen Festplatte zu resynchronisieren. :snapraid sync Wenn alles wiederhergestellt ist, ist dieser Befehl sofort. Commands SnapRAID bietet einige einfache Befehle, mit denen Sie: * Den Status des Arrays ausgeben -> `status` * Die Festplatten steuern -> `smart`, `probe`, `up`, `down` * Eine Sicherung/einen Snapshot erstellen -> `sync` * Daten regelmäßig ÃŧberprÃŧfen -> `scrub` * Die letzte Sicherung/den letzten Snapshot wiederherstellen -> `fix`. Befehle mÃŧssen in Kleinbuchstaben geschrieben werden. status Gibt eine Zusammenfassung des Zustands des Festplatten-Arrays aus. Es enthält Informationen zur Paritätsfragmentierung, wie alt die BlÃļcke sind, ohne ÜberprÃŧfung, und alle aufgezeichneten stillen Fehler, die beim Scrubbing aufgetreten sind. Die präsentierten Informationen beziehen sich auf den letzten Zeitpunkt, zu dem Sie `sync` ausgefÃŧhrt haben. Spätere Änderungen werden nicht berÃŧcksichtigt. Wenn fehlerhafte BlÃļcke erkannt wurden, werden deren Blocknummern aufgelistet. Um sie zu beheben, kÃļnnen Sie den Befehl `fix -e` verwenden. Es zeigt auch ein Diagramm an, das den letzten Zeitpunkt darstellt, zu dem jeder Block gescrubbed oder synchronisiert wurde. Gescrubbed BlÃļcke werden mit `*`, BlÃļcke, die synchronisiert, aber noch nicht gescrubbed wurden, mit `o` angezeigt. Es wird nichts geändert. smart Gibt einen SMART-Bericht aller Festplatten im System aus. Es enthält eine Schätzung der Ausfallwahrscheinlichkeit im nächsten Jahr, sodass Sie die Wartungsersetzung von Festplatten planen kÃļnnen, die verdächtige Attribute aufweisen. Diese Wahrscheinlichkeitsschätzung wird durch Korrelation der SMART-Attribute der Festplatten mit den Backblaze-Daten erhalten, die unter folgender Adresse verfÃŧgbar sind: :https://www.backblaze.com/hard-drive-test-data.html Wenn SMART meldet, dass eine Festplatte ausfällt, wird `FAIL` oder `PREFAIL` fÃŧr diese Festplatte gedruckt, und SnapRAID endet mit einem Fehler. In diesem Fall wird ein sofortiger Austausch der Festplatte dringend empfohlen. Weitere mÃļgliche Statuszeichenfolgen sind: logfail - In der Vergangenheit lagen einige Attribute unter dem Schwellenwert. logerr - Das Gerätefehlerprotokoll enthält Fehler. selferr - Das Geräte-Selbsttestprotokoll enthält Fehler. Wenn die Option -v, --verbose angegeben ist, wird eine tiefere statistische Analyse bereitgestellt. Diese Analyse kann Ihnen bei der Entscheidung helfen, ob Sie mehr oder weniger Parität benÃļtigen. Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem AusfÃŧhren von `smartctl -a` auf allen Geräten. Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, kÃļnnen Sie einen benutzerdefinierten Befehl mithilfe der `smartctl`-Option in der Konfigurationsdatei angeben. Es wird nichts geändert. probe Gibt den POWER-Zustand aller Festplatten im System aus. `Standby` bedeutet, dass die Festplatte nicht dreht. `Active` bedeutet, dass die Festplatte dreht. Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem AusfÃŧhren von `smartctl -n standby -i` auf allen Geräten. Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, kÃļnnen Sie einen benutzerdefinierten Befehl mithilfe der `smartctl`-Option in der Konfigurationsdatei angeben. Es wird nichts geändert. up Dreht alle Festplatten des Arrays hoch (spins up). Sie kÃļnnen nur bestimmte Festplatten mithilfe der Option -d, --filter-disk hochdrehen. Das gleichzeitige Hochdrehen aller Festplatten erfordert viel Strom. Stellen Sie sicher, dass Ihr Netzteil dies aushalten kann. Es wird nichts geändert. down Dreht alle Festplatten des Arrays herunter (spins down). Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem AusfÃŧhren von `smartctl -s standby,now` auf allen Geräten. Sie kÃļnnen nur bestimmte Festplatten mithilfe der Option -d, --filter-disk herunterdrehen. Um automatisch bei einem Fehler herunterzufahren, kÃļnnen Sie die Option -s, --spin-down-on-error mit jedem anderen Befehl verwenden, was dem manuellen AusfÃŧhren von `down` bei Auftreten eines Fehlers entspricht. Es wird nichts geändert. diff Listet alle Dateien auf, die seit dem letzten `sync` geändert wurden und deren Paritätsdaten neu berechnet werden mÃŧssen. Dieser Befehl ÃŧberprÃŧft nicht die Dateidaten, sondern nur den Dateizeitstempel, die GrÃļße und die Inode. Nach dem Auflisten aller geänderten Dateien wird eine Zusammenfassung der Änderungen präsentiert, gruppiert nach: equal - Dateien, die sich seitdem nicht geändert haben. added - Neu hinzugefÃŧgte Dateien, die vorher nicht vorhanden waren. removed - Entfernte Dateien. updated - Dateien mit einer anderen GrÃļße oder einem anderen Zeitstempel, was bedeutet, dass sie geändert wurden. moved - Auf derselben Festplatte in ein anderes Verzeichnis verschobene Dateien. Sie werden durch denselben Namen, dieselbe GrÃļße, denselben Zeitstempel und dieselbe Inode, aber ein anderes Verzeichnis identifiziert. copied - Dateien, die auf dieselbe oder eine andere Festplatte kopiert wurden, wobei die Originaldatei noch vorhanden ist. Sie werden dadurch identifiziert, dass sie denselben Namen, dieselbe GrÃļße und denselben Zeitstempel haben. Wenn der Subsekunden-Zeitstempel Null ist, muss der vollständige Pfad Ãŧbereinstimmen, um identifiziert zu werden, nicht nur der Name. relocated - Dateien, die auf dieselbe oder eine andere Festplatte verschoben wurden, wobei das Original verschwunden ist. Sie werden dadurch identifiziert, dass sie denselben Namen, dieselbe GrÃļße und denselben Zeitstempel haben. Wenn der Subsekunden-Zeitstempel Null ist, muss der vollständige Pfad Ãŧbereinstimmen, um identifiziert zu werden. Im Gegensatz zu 'moved' Dateien auf derselben Festplatte haben verschobene Dateien einen anderen Inode. restored - Dateien mit einem anderen Inode, aber passendem Verzeichnis, Namen, GrÃļße und Zeitstempel. Dies sind in der Regel Dateien, die nach dem LÃļschen wiederhergestellt wurden. Wenn ein `sync` erforderlich ist, ist der RÃŧckgabecode des Prozesses 2 anstelle des Standardwerts 0. Der RÃŧckgabecode 1 wird fÃŧr eine allgemeine Fehlerbedingung verwendet. Es wird nichts geändert. sync Aktualisiert die Paritätsinformationen. Alle geänderten Dateien im Festplatten-Array werden gelesen, und die entsprechenden Paritätsdaten werden aktualisiert. Sie kÃļnnen diesen Vorgang jederzeit durch DrÃŧcken von Strg+C anhalten, ohne die bereits geleistete Arbeit zu verlieren. Beim nächsten Lauf wird der `sync`-Vorgang dort fortgesetzt, wo er unterbrochen wurde. Wenn während des Vorgangs stille oder Eingabe-/Ausgabefehler gefunden werden, werden die entsprechenden BlÃļcke als fehlerhaft markiert. Dateien werden durch Pfad und/oder Inode identifiziert und anhand von GrÃļße und Zeitstempel ÃŧberprÃŧft. Wenn die DateigrÃļße oder der Zeitstempel abweicht, werden die Paritätsdaten fÃŧr die gesamte Datei neu berechnet. Wenn die Datei auf derselben Festplatte verschoben oder umbenannt wird und dieselbe Inode beibehält, wird die Parität nicht neu berechnet. Wenn die Datei auf eine andere Festplatte verschoben wird, wird die Parität neu berechnet, aber die zuvor berechneten Hash-Informationen werden beibehalten. Die `content`- und `parity`-Dateien werden bei Bedarf geändert. Die Dateien im Array werden NICHT geändert. scrub Scrubbt das Array und ÃŧberprÃŧft auf stille oder Eingabe-/Ausgabefehler auf Daten- und Paritätsfestplatten. Jede AusfÃŧhrung ÃŧberprÃŧft ungefähr 8% des Arrays, ausgenommen Daten, die bereits in den letzten 10 Tagen gescrubbed wurden. Dies bedeutet, dass Scrubbing einmal pro Woche sicherstellt, dass jedes Bit an Daten mindestens einmal alle drei Monate ÃŧberprÃŧft wird. Sie kÃļnnen einen anderen Scrub-Plan oder eine andere Menge mithilfe der Option -p, --plan definieren, die Folgendes akzeptiert: bad - Scrubbt als fehlerhaft markierte BlÃļcke. new - Scrubbt gerade synchronisierte BlÃļcke, die noch nicht gescrubbed wurden. full - Scrubbt alles. 0-100 - Scrubbt den angegebenen Prozentsatz der BlÃļcke. Wenn Sie einen Prozentsatz angeben, kÃļnnen Sie auch die Option -o, --older-than verwenden, um festzulegen, wie alt der Block sein soll. Die ältesten BlÃļcke werden zuerst gescrubbed, um eine optimale ÜberprÃŧfung zu gewährleisten. Wenn Sie nur die gerade synchronisierten BlÃļcke scrubben mÃļchten, die noch nicht gescrubbed wurden, verwenden Sie die Option `-p new`. Um Details zum Scrub-Status zu erhalten, verwenden Sie den Befehl `status`. FÃŧr jeden gefundenen stillen oder Eingabe-/Ausgabefehler werden die entsprechenden BlÃļcke in der `content`-Datei als fehlerhaft (bad) markiert. Diese fehlerhaften BlÃļcke werden in `status` aufgelistet und kÃļnnen mit `fix -e` behoben werden. Nach der Behebung werden sie beim nächsten Scrub erneut ÃŧberprÃŧft, und wenn sie als korrigiert befunden werden, wird die fehlerhafte Markierung entfernt. Um nur die fehlerhaften BlÃļcke zu scrubben, kÃļnnen Sie den Befehl `scrub -p bad` verwenden. Es wird empfohlen, `scrub` nur auf einem synchronisierten Array auszufÃŧhren, um gemeldete Fehler zu vermeiden, die durch nicht synchronisierte Daten verursacht werden. Diese Fehler werden als keine stillen Fehler erkannt, und die BlÃļcke werden nicht als fehlerhaft markiert, aber solche Fehler werden in der Ausgabe des Befehls gemeldet. Die `content`-Datei wird geändert, um die Zeit der letzten ÜberprÃŧfung fÃŧr jeden Block zu aktualisieren und fehlerhafte BlÃļcke zu markieren. Die `parity`-Dateien werden NICHT geändert. Die Dateien im Array werden NICHT geändert. fix Behebt alle Dateien und die Paritätsdaten. Alle Dateien und Paritätsdaten werden mit dem Snapshot-Zustand verglichen, der beim letzten `sync` gespeichert wurde. Wenn eine Abweichung gefunden wird, wird sie auf den gespeicherten Snapshot zurÃŧckgesetzt. WARNUNG! Der Befehl `fix` unterscheidet nicht zwischen Fehlern und beabsichtigten Änderungen. Er setzt den Dateizustand bedingungslos auf den letzten `sync` zurÃŧck. Wenn keine andere Option angegeben ist, wird das gesamte Array verarbeitet. Verwenden Sie die Filteroptionen, um eine Teilmenge von Dateien oder Festplatten fÃŧr die Operation auszuwählen. Um nur die BlÃļcke zu beheben, die während `sync` und `scrub` als fehlerhaft markiert wurden, verwenden Sie die Option -e, --filter-error. Im Gegensatz zu anderen Filteroptionen wendet diese Behebungen nur auf Dateien an, die seit dem letzten `sync` unverändert sind. SnapRAID benennt alle Dateien, die nicht behoben werden kÃļnnen, durch HinzufÃŧgen der Erweiterung `.unrecoverable` um. Vor dem Beheben wird das gesamte Array gescannt, um alle Dateien zu finden, die seit der letzten `sync`-Operation verschoben wurden. Diese Dateien werden anhand ihres Zeitstempels identifiziert, wobei Name und Verzeichnis ignoriert werden, und werden bei Bedarf im Wiederherstellungsprozess verwendet. Wenn Sie einige davon außerhalb des Arrays verschoben haben, kÃļnnen Sie die Option -i, --import verwenden, um zusätzliche Verzeichnisse zum Scannen anzugeben. Dateien werden nur anhand des Pfads identifiziert, nicht anhand der Inode. Die `content`-Datei wird NICHT geändert. Die `parity`-Dateien werden bei Bedarf geändert. Die Dateien im Array werden bei Bedarf geändert. check ÜberprÃŧft alle Dateien und die Paritätsdaten. Es funktioniert wie `fix`, simuliert jedoch nur eine Wiederherstellung, und es werden keine Änderungen in das Array geschrieben. Dieser Befehl ist primär fÃŧr manuelle ÜberprÃŧfung gedacht, wie z.B. nach einem Wiederherstellungsprozess oder unter anderen speziellen Bedingungen. FÃŧr regelmäßige und geplante ÜberprÃŧfungen verwenden Sie `scrub`. Wenn Sie die Option -a, --audit-only verwenden, wird nur der Hash der Dateien ÃŧberprÃŧft, und die Paritätsdaten werden fÃŧr einen schnelleren Lauf ignoriert. Dateien werden nur anhand des Pfads identifiziert, nicht anhand der Inode. Es wird nichts geändert. list Listet alle Dateien auf, die sich zum Zeitpunkt des letzten `sync` im Array befanden. Mit -v oder --verbose wird auch die Untersekundenzeit angezeigt. Es wird nichts geändert. dup Listet alle doppelten Dateien auf. Zwei Dateien gelten als gleich, wenn ihre Hashes Ãŧbereinstimmen. Die Dateidaten werden nicht gelesen; es werden nur die vorab berechneten Hashes verwendet. Es wird nichts geändert. pool Erstellt oder aktualisiert eine virtuelle Ansicht aller Dateien in Ihrem Festplatten-Array im `pooling`-Verzeichnis. Die Dateien werden nicht kopiert, sondern mithilfe symbolischer Links verknÃŧpft. Beim Aktualisieren werden alle vorhandenen symbolischen Links und leeren Unterverzeichnisse gelÃļscht und durch die neue Ansicht des Arrays ersetzt. Alle anderen regulären Dateien bleiben erhalten. Außerhalb des Pool-Verzeichnisses wird nichts geändert. devices Gibt die Low-Level-Geräte aus, die vom Array verwendet werden. Dieser Befehl zeigt die Gerätezuordnungen im Array an und ist hauptsächlich als Skriptschnittstelle gedacht. Die ersten beiden Spalten sind die Low-Level-Geräte-ID und der Pfad. Die nächsten beiden Spalten sind die High-Level-Geräte-ID und der Pfad. Die letzte Spalte ist der Festplattenname im Array. In den meisten Fällen haben Sie ein Low-Level-Gerät fÃŧr jede Festplatte im Array, aber in einigen komplexeren Konfigurationen kÃļnnen mehrere Low-Level-Geräte von einer einzigen Festplatte im Array verwendet werden. Es wird nichts geändert. touch Setzt einen beliebigen Untersekunden-Zeitstempel fÃŧr alle Dateien, deren Untersekunden-Zeitstempel auf Null gesetzt ist. Dies verbessert die Fähigkeit von SnapRAID, verschobene und kopierte Dateien zu erkennen, da es den Zeitstempel fast eindeutig macht und mÃļgliche Duplikate reduziert. Genauer gesagt, wenn der Untersekunden-Zeitstempel nicht Null ist, wird eine verschobene oder kopierte Datei als solche identifiziert, wenn sie mit Name, GrÃļße und Zeitstempel Ãŧbereinstimmt. Wenn der Untersekunden-Zeitstempel Null ist, wird sie nur als Kopie betrachtet, wenn der vollständige Pfad, die GrÃļße und der Zeitstempel alle Ãŧbereinstimmen. Der Zeitstempel mit Sekundenpräzision wird nicht geändert, sodass alle Daten und Zeiten Ihrer Dateien erhalten bleiben. rehash Plant eine Neu-Hash-Berechnung (rehash) des gesamten Arrays. Dieser Befehl ändert die verwendete Hash-Art, typischerweise beim Upgrade von einem 32-Bit-System auf ein 64-Bit-System, um von MurmurHash3 auf den schnelleren SpookyHash umzuschalten. Wenn Sie bereits den optimalen Hash verwenden, tut dieser Befehl nichts und informiert Sie darÃŧber, dass keine Aktion erforderlich ist. Die Neu-Hash-Berechnung wird nicht sofort durchgefÃŧhrt, sondern findet schrittweise während `sync` und `scrub` statt. Sie kÃļnnen den Neu-Hash-Zustand mithilfe von `status` ÃŧberprÃŧfen. Während der Neu-Hash-Berechnung behält SnapRAID die volle Funktionalität bei, mit der einzigen Ausnahme, dass `dup` keine doppelten Dateien mit einem anderen Hash erkennen kann. locate Lokalisiert Dateien, die auf den Paritätsfestplatten gespeichert sind. FÃŧr jede Ãŧbereinstimmende Datei wird deren Position innerhalb der Paritätsdatei und die Anzahl der belegten Fragmente ausgegeben. Sie kÃļnnen die Option -t, --tail verwenden, um den Vorgang auf Dateien zu beschränken, die den angegebenen Endbereich (Tail) der Parität belegen. Wenn Sie diese Dateien neu zuweisen mÃļchten, kÃļnnen Sie die Option -W, --force-realloc-tail verwenden. Beachten Sie, dass solche Dateien während des Neuzuweisungsprozesses nicht durch die Parität geschÃŧtzt sind. Options SnapRAID bietet die folgenden Optionen: -c, --conf CONFIG Wählt die zu verwendende Konfigurationsdatei aus. Wenn nicht angegeben, wird unter Unix die Datei `/usr/local/etc/snapraid.conf` verwendet, falls sie existiert, andernfalls `/etc/snapraid.conf`. Unter Windows wird die Datei `snapraid.conf` im selben Verzeichnis wie `snapraid.exe` verwendet. -f, --filter PATTERN Filtert die zu verarbeitenden Dateien in `check` und `fix`. Nur die Dateien, die dem angegebenen Muster entsprechen, werden verarbeitet. Diese Option kann mehrmals verwendet werden. Weitere Details zu Musterspezifikationen finden Sie im Abschnitt PATTERN. Unter Unix stellen Sie sicher, dass Globbing-Zeichen in AnfÃŧhrungszeichen gesetzt werden, wenn sie verwendet werden. Diese Option kann nur mit `check` und `fix` verwendet werden. Sie kann nicht mit `sync` und `scrub` verwendet werden, da diese immer das gesamte Array verarbeiten. -d, --filter-disk NAME Filtert die zu verarbeitenden Festplatten in `check`, `fix`, `up` und `down`. Sie mÃŧssen einen Festplattennamen angeben, wie in der Konfigurationsdatei definiert. Sie kÃļnnen auch Paritätsfestplatten mit den Namen `parity`, `2-parity`, `3-parity`, usw. angeben, um Vorgänge auf eine bestimmte Paritätsfestplatte zu beschränken. Wenn Sie mehrere --filter, --filter-disk und --filter-missing Optionen kombinieren, werden nur Dateien ausgewählt, die allen Filtern entsprechen. Diese Option kann mehrmals verwendet werden. Diese Option kann nur mit `check`, `fix`, `up` und `down` verwendet werden. Sie kann nicht mit `sync` und `scrub` verwendet werden, da diese immer das gesamte Array verarbeiten. -m, --filter-missing Filtert die zu verarbeitenden Dateien in `check` und `fix`. Nur die Dateien, die im Array fehlen oder gelÃļscht wurden, werden verarbeitet. Bei Verwendung mit `fix` fungiert dies als `undelete`-Befehl (Wiederherstellung von GelÃļschtem). Wenn Sie mehrere --filter, --filter-disk und --filter-missing Optionen kombinieren, werden nur Dateien ausgewählt, die allen Filtern entsprechen. Diese Option kann nur mit `check` und `fix` verwendet werden. Sie kann nicht mit `sync` und `scrub` verwendet werden, da diese immer das gesamte Array verarbeiten. -e, --filter-error Verarbeitet die Dateien mit Fehlern in `check` und `fix`. Es verarbeitet nur Dateien, deren BlÃļcke während `sync` und `scrub` als mit stillen oder Eingabe-/Ausgabefehlern markiert wurden, wie in `status` aufgelistet. Diese Option kann nur mit `check` und `fix` verwendet werden. -p, --plan PERC|bad|new|full Wählt den Scrub-Plan aus. Wenn PERC ein numerischer Wert von 0 bis 100 ist, wird er als Prozentsatz der zu scrubbenden BlÃļcke interpretiert. Anstelle eines Prozentsatzes kÃļnnen Sie einen Plan angeben: `bad` scrubbt fehlerhafte BlÃļcke, `new` scrubbt BlÃļcke, die noch nicht gescrubbed wurden, und `full` scrubbt alles. Diese Option kann nur mit `scrub` verwendet werden. -o, --older-than DAYS Wählt den ältesten Teil des Arrays aus, der in `scrub` verarbeitet werden soll. DAYS ist das Mindestalter in Tagen, damit ein Block gescrubbed werden kann; der Standardwert ist 10. BlÃļcke, die als fehlerhaft markiert sind, werden immer gescrubbed, unabhängig von dieser Option. Diese Option kann nur mit `scrub` verwendet werden. -a, --audit-only ÜberprÃŧft in `check` den Hash der Dateien, ohne die Paritätsdaten zu ÃŧberprÃŧfen. Wenn Sie nur an der ÜberprÃŧfung der Dateidaten interessiert sind, kann diese Option den ÜberprÃŧfungsprozess erheblich beschleunigen. Diese Option kann nur mit `check` verwendet werden. -h, --pre-hash FÃŧhrt in `sync` eine vorläufige Hash-Phase aller neuen Daten zur zusätzlichen ÜberprÃŧfung vor der Paritätsberechnung durch. Normalerweise wird in `sync` keine vorläufige Hash-Berechnung durchgefÃŧhrt, und die neuen Daten werden unmittelbar vor der Paritätsberechnung gehasht, wenn sie zum ersten Mal gelesen werden. Dieser Vorgang tritt auf, wenn das System unter starker Last steht, wobei alle Festplatten drehen und eine ausgelastete CPU vorliegt. Dies ist ein Extremzustand fÃŧr die Maschine, und wenn sie ein latentes Hardwareproblem hat, kÃļnnen stille Fehler unentdeckt bleiben, da die Daten noch nicht gehasht sind. Um dieses Risiko zu vermeiden, kÃļnnen Sie den `pre-hash`-Modus aktivieren, um alle Daten zweimal lesen zu lassen und so ihre Integrität sicherzustellen. Diese Option ÃŧberprÃŧft auch im Array verschobene Dateien, um sicherzustellen, dass die Verschiebeoperation erfolgreich war, und ermÃļglicht es Ihnen, bei Bedarf eine `fix`-Operation durchzufÃŧhren, bevor Sie fortfahren. Diese Option kann nur mit `sync` verwendet werden. -i, --import DIR Importiert aus dem angegebenen Verzeichnis alle Dateien, die nach dem letzten `sync` aus dem Array gelÃļscht wurden. Wenn Sie solche Dateien noch haben, kÃļnnen sie von `check` und `fix` verwendet werden, um den Wiederherstellungsprozess zu verbessern. Die Dateien werden gelesen, auch in Unterverzeichnissen, und unabhängig von ihrem Namen identifiziert. Diese Option kann nur mit `check` und `fix` verwendet werden. -s, --spin-down-on-error Dreht bei jedem Fehler alle verwalteten Festplatten herunter, bevor mit einem von Null verschiedenen Statuscode beendet wird. Dies verhindert, dass die Laufwerke nach einem abgebrochenen Vorgang aktiv bleiben und drehen, was unnÃļtige Hitzeentwicklung und Stromverbrauch vermeiden hilft. Verwenden Sie diese Option, um sicherzustellen, dass die Festplatten auch bei einem Befehlsfehler sicher gestoppt werden. -w, --bw-limit RATE Wendet eine globale Bandbreitenbegrenzung fÃŧr alle Festplatten an. RATE ist die Anzahl der Bytes pro Sekunde. Sie kÃļnnen einen Multiplikator wie K, M oder G angeben (z.B. --bw-limit 1G). -t, --tail GRÖSSE Beschränkt die Dateiliste auf diejenigen, die nicht mehr als die angegebene Tail-GrÃļße der Paritätsfestplatten belegen. Sie kÃļnnen Multiplikatoren wie K, M, G oder T verwenden (z. B. --tail 1G). Diese Option ist nur in Verbindung mit dem Befehl `locate` gÃŧltig. -A, --stats Aktiviert eine erweiterte Statusansicht, die zusätzliche Informationen anzeigt. Der Bildschirm zeigt zwei Diagramme an: Das erste Diagramm zeigt die Anzahl der gepufferten Stripes fÃŧr jede Festplatte sowie den Dateipfad der Datei, auf die derzeit auf dieser Festplatte zugegriffen wird. Typischerweise hat die langsamste Festplatte keinen verfÃŧgbaren Puffer, was die maximal erreichbare Bandbreite bestimmt. Das zweite Diagramm zeigt den Prozentsatz der Wartezeit Ãŧber die letzten 100 Sekunden. Es wird erwartet, dass die langsamste Festplatte die meiste Wartezeit verursacht, während andere Festplatten wenig oder keine Wartezeit haben sollten, da sie ihre gepufferten Stripes verwenden kÃļnnen. Dieses Diagramm zeigt auch die Zeit an, die mit Warten auf Hash-Berechnungen und RAID-Berechnungen verbracht wurde. Alle Berechnungen laufen parallel zu den Festplattenoperationen. Solange fÃŧr mindestens eine Festplatte eine messbare Wartezeit vorhanden ist, deutet dies daher darauf hin, dass die CPU schnell genug ist, um mit der Arbeitslast Schritt zu halten. -Z, --force-zero Erzwingt den unsicheren Vorgang der Synchronisierung einer Datei mit NullgrÃļße, die zuvor nicht Null war. Wenn SnapRAID eine solche Bedingung erkennt, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, leicht zu erkennen, wann nach einem Systemabsturz einige zugegriffene Dateien abgeschnitten (truncated) wurden. Dies ist eine mÃļgliche Bedingung unter Linux mit den ext3/ext4-Dateisystemen. Diese Option kann nur mit `sync` verwendet werden. -E, --force-empty Erzwingt den unsicheren Vorgang der Synchronisierung einer Festplatte, bei der alle ursprÃŧnglichen Dateien fehlen. Wenn SnapRAID erkennt, dass alle ursprÃŧnglich auf der Festplatte vorhandenen Dateien fehlen oder Ãŧberschrieben wurden, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, leicht zu erkennen, wann ein Daten-Dateisystem nicht gemountet (eingehängt) ist. Diese Option kann nur mit `sync` verwendet werden. -U, --force-uuid Erzwingt den unsicheren Vorgang der Synchronisierung, ÜberprÃŧfung und Behebung mit Festplatten, deren UUID geändert wurde. Wenn SnapRAID erkennt, dass einige Festplatten ihre UUID geändert haben, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, zu erkennen, wann Ihre Festplatten an den falschen Einhängepunkten gemountet sind. Es ist jedoch erlaubt, eine einzelne UUID-Änderung mit einfacher Parität zu haben und mehr mit mehrfacher Parität, da dies der normale Fall beim Austausch von Festplatten nach einer Wiederherstellung ist. Diese Option kann nur mit `sync`, `check` oder `fix` verwendet werden. -D, --force-device Erzwingt den unsicheren Vorgang der Behebung mit unzugänglichen Festplatten oder mit Festplatten auf demselben physischen Gerät. Wenn Sie beispielsweise zwei Datenfestplatten verloren haben und eine Ersatzfestplatte haben, um nur die erste wiederherzustellen, kÃļnnen Sie die zweite unzugängliche Festplatte ignorieren. Oder wenn Sie eine Festplatte in dem auf einer bereits verwendeten Festplatte verbleibenden freien Speicherplatz wiederherstellen mÃļchten, wobei sie dasselbe physische Gerät gemeinsam nutzen. Diese Option kann nur mit `fix` verwendet werden. -N, --force-nocopy Deaktiviert in `sync`, `check` und `fix` die Kopiererkennungsheuristik. Ohne diese Option geht SnapRAID davon aus, dass Dateien mit den gleichen Attributen, wie Name, GrÃļße und Zeitstempel, Kopien mit denselben Daten sind. Dies ermÃļglicht die Identifizierung von kopierten oder von einer Festplatte auf eine andere verschobenen Dateien und die Wiederverwendung der bereits berechneten Hash-Informationen, um stille Fehler zu erkennen oder fehlende Dateien wiederherzustellen. In einigen seltenen Fällen kann dieses Verhalten zu falsch positiven Ergebnissen oder einem langsamen Vorgang aufgrund vieler Hash-ÜberprÃŧfungen fÃŧhren, und diese Option ermÃļglicht es Ihnen, solche Probleme zu beheben. Diese Option kann nur mit `sync`, `check` und `fix` verwendet werden. -F, --force-full Erzwingt in `sync` eine vollständige Neuberechnung der Parität. Diese Option kann verwendet werden, wenn Sie eine neue Paritätsstufe hinzufÃŧgen oder wenn Sie zu einer alten Content-Datei mit neueren Paritätsdaten zurÃŧckgekehrt sind. Anstatt die Parität von Grund auf neu zu erstellen, ermÃļglicht dies die Wiederverwendung der in der Content-Datei vorhandenen Hashes zur Validierung von Daten und zur Aufrechterhaltung des Datenschutzes während des `sync`-Vorgangs unter Verwendung der vorhandenen Paritätsdaten. Diese Option kann nur mit `sync` verwendet werden. -R, --force-realloc Erzwingt in `sync` eine vollständige Neuallokation von Dateien und eine Wiederherstellung der Parität. Diese Option kann verwendet werden, um alle Dateien vollständig neu zuzuweisen und die Fragmentierung zu entfernen, während die in der Content-Datei vorhandenen Hashes zur Validierung von Daten wiederverwendet werden. Diese Option kann nur mit `sync` verwendet werden. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, sie nicht zu verwenden. Sie haben während der `sync`-Operation KEINEN Datenschutz. -W, --force-realloc-tail GRÖSSE Funktioniert wie -R, --force-realloc, ist jedoch auf den angegebenen Endbereich (die letzten GRÖSSE Bytes) jeder Paritätsdatei beschränkt. Erzwingt die Neuzuweisung (Verschiebung) aller Dateifragmente/-blÃļcke, die derzeit in diesem Endabschnitt gespeichert sind, sodass sie an beliebiger Stelle in den Paritätsdateien platziert werden kÃļnnen, wo freier Speicherplatz verfÃŧgbar ist (einschließlich vorhandener LÃŧcken). Der Hauptzweck dieser Option besteht darin, die GrÃļße der Paritätsdatei auf der Festplatte zu verringern. Wenn die Neuzuweisung den gesamten Endabschnitt erfolgreich leert (keine BlÃļcke verbleiben dort), wird die Paritätsdatei gekÃŧrzt, wodurch der ungenutzte Endbereich freigegeben wird. Sie kÃļnnen Multiplikatoren wie K, M, G oder T verwenden (z. B. --force-realloc-tail 1G). Sie kÃļnnen locate -t, --tail verwenden, um die betroffenen Dateien im Voraus zu ermitteln. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht und es wird dringend empfohlen, sie nicht zu verwenden. Während des `sync`-Vorgangs besteht fÃŧr die betroffenen Dateien KEIN Datenschutz. -l, --log FILE Schreibt ein detailliertes Protokoll in die angegebene Datei. Wenn diese Option nicht angegeben ist, werden unerwartete Fehler auf dem Bildschirm ausgegeben, was bei vielen Fehlern mÃļglicherweise zu einer Ãŧbermäßigen Ausgabe fÃŧhrt. Wenn -l, --log angegeben ist, werden nur schwerwiegende Fehler, die SnapRAID zum Stoppen bringen, auf dem Bildschirm ausgegeben. Wenn der Pfad mit `>>` beginnt, wird die Datei im Anhängemodus (append mode) geÃļffnet. Vorkommen von `%D` und `%T` im Namen werden durch Datum und Uhrzeit im Format YYYYMMDD bzw. HHMMSS ersetzt. In Windows-Batch-Dateien mÃŧssen Sie das `%`-Zeichen verdoppeln, z.B. result-%%D.log. Um `>>` zu verwenden, mÃŧssen Sie den Namen in AnfÃŧhrungszeichen setzen, z.B. `">>result.log"`. Um das Protokoll an die Standardausgabe oder den Standardfehler auszugeben, kÃļnnen Sie `">&1"` bzw. `">&2"` verwenden. Beschreibungen der Protokoll-Tags finden Sie in der Datei snapraid_log.txt oder in der Manpage. -L, --error-limit NUMBER Legt ein neues Fehlerlimit fest, bevor die AusfÃŧhrung gestoppt wird. Standardmäßig stoppt SnapRAID, wenn es mehr als 100 Eingabe-/Ausgabefehler feststellt, was darauf hindeutet, dass eine Festplatte wahrscheinlich ausfällt. Diese Option wirkt sich auf `sync` und `scrub` aus, denen es gestattet ist, nach dem ersten Satz von Festplattenfehlern fortzufahren, um ihre Vorgänge abzuschließen. `check` und `fix` stoppen jedoch immer beim ersten Fehler. -S, --start BLKSTART Startet die Verarbeitung ab der angegebenen Blocknummer. Dies kann nÃŧtzlich sein, um die ÜberprÃŧfung oder Behebung spezifischer BlÃļcke im Falle einer beschädigten Festplatte zu wiederholen. Diese Option ist hauptsächlich fÃŧr die erweiterte manuelle Wiederherstellung gedacht. -B, --count BLKCOUNT Verarbeitet nur die angegebene Anzahl von BlÃļcken. Diese Option ist hauptsächlich fÃŧr die erweiterte manuelle Wiederherstellung gedacht. -C, --gen-conf CONTENT Generiert eine Dummy-Konfigurationsdatei aus einer vorhandenen Content-Datei. Die Konfigurationsdatei wird in die Standardausgabe geschrieben und Ãŧberschreibt keine vorhandene. Diese Konfigurationsdatei enthält auch die Informationen, die zur Rekonstruktion der Festplatten-Einhängepunkte erforderlich sind, falls Sie das gesamte System verlieren. -v, --verbose Gibt mehr Informationen auf dem Bildschirm aus. Wenn einmal angegeben, werden ausgeschlossene Dateien und zusätzliche Statistiken gedruckt. Diese Option hat keine Auswirkung auf die Protokolldateien. -q, --quiet Gibt weniger Informationen auf dem Bildschirm aus. Wenn einmal angegeben, wird die Fortschrittsleiste entfernt; zweimal, die laufenden Operationen; dreimal, die Info-Meldungen; viermal, die Statusmeldungen. Schwerwiegende Fehler werden immer auf dem Bildschirm ausgegeben. Diese Option hat keine Auswirkung auf die Protokolldateien. -H, --help Gibt eine kurze Hilfeanzeige aus. -V, --version Gibt die Programmversion aus. Configuration SnapRAID benÃļtigt eine Konfigurationsdatei, um zu wissen, wo sich Ihr Festplatten-Array befindet und wo die Paritätsinformationen gespeichert werden sollen. Unter Unix wird die Datei `/usr/local/etc/snapraid.conf` verwendet, falls sie existiert, andernfalls `/etc/snapraid.conf`. Unter Windows wird die Datei `snapraid.conf` im selben Verzeichnis wie `snapraid.exe` verwendet. Sie muss die folgenden Optionen (Groß- und Kleinschreibung beachten) enthalten: parity FILE [,FILE] ... Definiert die Dateien, die zum Speichern der Paritätsinformationen verwendet werden sollen. Die Parität ermÃļglicht den Schutz vor einem einzelnen Festplattenausfall, ähnlich wie bei RAID5. Sie kÃļnnen mehrere Dateien angeben, die sich auf unterschiedlichen Festplatten befinden mÃŧssen. Wenn eine Datei nicht mehr wachsen kann, wird die nächste verwendet. Der gesamte verfÃŧgbare Platz muss mindestens so groß sein wie die grÃļßte Datenfestplatte im Array. Sie kÃļnnen später zusätzliche Paritätsdateien hinzufÃŧgen, aber Sie kÃļnnen sie nicht neu anordnen oder entfernen. Das Reservieren der Paritätsfestplatten fÃŧr Parität stellt sicher, dass sie nicht fragmentiert werden, was die Leistung verbessert. Unter Windows werden 256 MB auf jeder Festplatte ungenutzt gelassen, um die Warnung vor vollen Festplatten zu vermeiden. Diese Option ist obligatorisch und kann nur einmal verwendet werden. (2,3,4,5,6)-parity FILE [,FILE] ... Definiert die Dateien, die zum Speichern zusätzlicher Paritätsinformationen verwendet werden sollen. FÃŧr jede angegebene Paritätsstufe wird eine zusätzliche Schutzstufe aktiviert: * 2-parity aktiviert RAID6 Dual-Parität. * 3-parity aktiviert Triple-Parität. * 4-parity aktiviert Quad- (vierfache) Parität. * 5-parity aktiviert Penta- (fÃŧnffache) Parität. * 6-parity aktiviert Hexa- (sechsfache) Parität. Jede Paritätsstufe erfordert die Anwesenheit aller vorherigen Paritätsstufen. Die gleichen Überlegungen wie bei der Option `parity` gelten. Diese Optionen sind optional und kÃļnnen nur einmal verwendet werden. z-parity FILE [,FILE] ... Definiert eine alternative Datei und ein alternatives Format zum Speichern von Triple-Parität. Diese Option ist eine Alternative zu `3-parity`, die primär fÃŧr Low-End-CPUs wie ARM oder AMD Phenom, Athlon und Opteron gedacht ist, die den SSSE3-Befehlssatz nicht unterstÃŧtzen. In solchen Fällen bietet sie eine bessere Leistung. Dieses Format ähnelt dem von ZFS RAIDZ3, ist aber schneller. Wie ZFS funktioniert es nicht jenseits der Triple-Parität. Bei Verwendung von `3-parity` werden Sie gewarnt, wenn das `z-parity`-Format zur Leistungsverbesserung empfohlen wird. Es ist mÃļglich, von einem Format in ein anderes zu konvertieren, indem die Konfigurationsdatei mit der gewÃŧnschten z-parity- oder 3-parity-Datei angepasst und `fix` zur Neuerstellung verwendet wird. content FILE Definiert die Datei, die zum Speichern der Liste und PrÃŧfsummen aller im Festplatten-Array vorhandenen Dateien verwendet werden soll. Sie kann auf einer fÃŧr Daten, Parität oder einer anderen verfÃŧgbaren Festplatte platziert werden. Wenn Sie eine Datenfestplatte verwenden, wird diese Datei automatisch vom `sync`-Vorgang ausgeschlossen. Diese Option ist obligatorisch und kann mehrmals verwendet werden, um mehrere Kopien derselben Datei zu speichern. Sie mÃŧssen mindestens eine Kopie fÃŧr jede verwendete Paritätsfestplatte plus eine speichern. Die Verwendung zusätzlicher Kopien schadet nicht. data NAME DIR Definiert den Namen und den Einhängepunkt (Mount Point) der Datenfestplatten im Array. NAME wird zur Identifizierung der Festplatte verwendet und muss eindeutig sein. DIR ist der Einhängepunkt der Festplatte im Dateisystem. Sie kÃļnnen den Einhängepunkt nach Bedarf ändern, solange Sie den NAME unverändert lassen. Sie sollten eine Option fÃŧr jede Datenfestplatte im Array verwenden. Sie kÃļnnen eine Festplatte später umbenennen, indem Sie den NAME direkt in der Konfigurationsdatei ändern und dann einen `sync`-Befehl ausfÃŧhren. Im Falle einer Umbenennung erfolgt die Zuordnung mithilfe der gespeicherten UUID der Festplatten. extra NAME DIR Definiert den Namen und Einhängepunkt zusätzlicher Festplatten, die mit den Befehlen `smart` und `probe` Ãŧberwacht werden sollen. Dies ist nÃŧtzlich fÃŧr die Überwachung von Festplatten, die nicht Teil des Arrays sind, aber fÃŧr das Funktionieren des Systems erforderlich sind, wie z. B. die Boot-Festplatte. Beachten Sie, dass solche Festplatten nicht von den Befehlen `up` und `down` betroffen sind, da von ihnen erwartet wird, dass sie sich immer drehen. nohidden Schließt alle versteckten Dateien und Verzeichnisse aus. Unter Unix sind versteckte Dateien solche, die mit `.` beginnen. Unter Windows sind es solche mit dem versteckten Attribut. exclude/include PATTERN Definiert die Datei- oder Verzeichnismuster, die im `sync`-Vorgang ausgeschlossen oder eingeschlossen werden sollen. Alle Muster werden in der angegebenen Reihenfolge verarbeitet. Wenn das erste Ãŧbereinstimmende Muster ein `exclude`-Muster ist, wird die Datei ausgeschlossen. Wenn es ein `include`-Muster ist, wird die Datei eingeschlossen. Wenn kein Muster Ãŧbereinstimmt, wird die Datei ausgeschlossen, wenn das zuletzt angegebene Muster ein `include` ist, oder eingeschlossen, wenn das zuletzt angegebene Muster ein `exclude` ist. Weitere Details zu Musterspezifikationen finden Sie im Abschnitt PATTERN. Diese Option kann mehrmals verwendet werden. blocksize SIZE_IN_KIBIBYTES Definiert die grundlegende BlockgrÃļße in Kibibytes fÃŧr die Parität. Ein Kibibyte entspricht 1024 Bytes. Die Standard-BlockgrÃļße ist 256, was fÃŧr die meisten Fälle ausreichen sollte. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert zukÃŧnftig zu ändern, mÃŧssen Sie die gesamte Parität neu erstellen! Ein Grund fÃŧr die Verwendung einer anderen BlockgrÃļße ist, wenn Sie viele kleine Dateien in der GrÃļßenordnung von Millionen haben. FÃŧr jede Datei, auch wenn sie nur wenige Bytes groß ist, wird ein ganzer Block Parität zugewiesen, und bei vielen Dateien kann dies zu erheblichem ungenutztem Paritätsplatz fÃŧhren. Wenn Sie die Paritätsfestplatte vollständig fÃŧllen, dÃŧrfen Sie keine weiteren Dateien zu den Datenfestplatten hinzufÃŧgen. Der verschwendete Paritätsplatz akkumuliert sich jedoch nicht Ãŧber die Datenfestplatten hinweg. Verschwendeter Platz, der durch eine hohe Anzahl von Dateien auf einer Datenfestplatte entsteht, begrenzt nur die Datenmenge auf dieser Datenfestplatte, nicht auf anderen. Als Annäherung kÃļnnen Sie davon ausgehen, dass die Hälfte der BlockgrÃļße fÃŧr jede Datei verschwendet wird. Mit beispielsweise 100.000 Dateien und einer BlockgrÃļße von 256 KiB verschwenden Sie 12,8 GB Parität, was zu 12,8 GB weniger verfÃŧgbarem Speicherplatz auf der Datenfestplatte fÃŧhren kann. Sie kÃļnnen die Menge des verschwendeten Platzes auf jeder Festplatte mithilfe von `status` ÃŧberprÃŧfen. Dies ist die Menge an Platz, die Sie auf den Datenfestplatten freilassen oder fÃŧr Dateien verwenden mÃŧssen, die nicht im Array enthalten sind. Wenn dieser Wert negativ ist, bedeutet dies, dass Sie kurz davor sind, die Parität zu fÃŧllen, und er stellt den Platz dar, den Sie noch verschwenden kÃļnnen. Um dieses Problem zu vermeiden, kÃļnnen Sie eine grÃļßere Partition fÃŧr die Parität verwenden. Wenn die Paritätspartition beispielsweise 12,8 GB grÃļßer ist als die Datenfestplatten, haben Sie genÃŧgend zusätzlichen Platz, um bis zu 100.000 Dateien auf jeder Datenfestplatte ohne verschwendeten Platz zu verarbeiten. Ein Trick, um eine grÃļßere Paritätspartition unter Linux zu erhalten, ist die Formatierung mit dem Befehl: :mkfs.ext4 -m 0 -T largefile4 DEVICE Dies fÃŧhrt zu etwa 1,5% zusätzlichem Speicherplatz, ungefähr 60 GB fÃŧr eine 4 TB Festplatte, was etwa 460.000 Dateien auf jeder Datenfestplatte ohne verschwendeten Platz ermÃļglicht. hashsize SIZE_IN_BYTES Definiert die Hash-GrÃļße in Bytes fÃŧr die gespeicherten BlÃļcke. Die Standard-Hash-GrÃļße beträgt 16 Bytes (128 Bit), was fÃŧr die meisten Fälle ausreichen sollte. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert zukÃŧnftig zu ändern, mÃŧssen Sie die gesamte Parität neu erstellen! Ein Grund fÃŧr die Verwendung einer anderen Hash-GrÃļße ist, wenn Ihr System Ãŧber begrenzten Speicher verfÃŧgt. Als Faustregel benÃļtigt SnapRAID typischerweise 1 GiB RAM fÃŧr jede 16 TB Daten im Array. Genauer gesagt benÃļtigt SnapRAID zum Speichern der Hashes der Daten ungefähr TS*(1+HS)/BS Bytes RAM, wobei TS die GesamtgrÃļße in Bytes Ihres Festplatten-Arrays ist, BS die BlockgrÃļße in Bytes und HS die Hash-GrÃļße in Bytes. Mit beispielsweise 8 Festplatten à 4 TB, einer BlockgrÃļße von 256 KiB (1 KiB = 1024 Bytes) und einer Hash-GrÃļße von 16 erhalten Sie: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Bei einem Wechsel zu einer Hash-GrÃļße von 8 erhalten Sie: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Bei einem Wechsel zu einer BlockgrÃļße von 512 erhalten Sie: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Bei einem Wechsel zu einer Hash-GrÃļße von 8 und einer BlockgrÃļße von 512 erhalten Sie: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB autosave SIZE_IN_GIGABYTES Speichert den Zustand beim Synchronisieren oder Scrubben automatisch nach der angegebenen Menge an verarbeiteten GB. Diese Option ist nÃŧtzlich, um zu vermeiden, dass lange `sync`-Befehle von vorne gestartet werden mÃŧssen, wenn sie durch einen Maschinenabsturz oder ein anderes Ereignis unterbrochen werden. temp_limit TEMPERATURE_CELSIUS Legt die maximal zulässige Festplattentemperatur in Celsius fest. Wenn angegeben, ÃŧberprÃŧft SnapRAID regelmäßig die Temperatur aller Festplatten mithilfe des smartctl-Tools. Die aktuellen Festplattentemperaturen werden während des Betriebs von SnapRAID angezeigt. Wenn eine Festplatte diesen Grenzwert Ãŧberschreitet, werden alle Vorgänge gestoppt, und die Festplatten werden fÃŧr die durch die Option `temp_sleep` definierte Dauer heruntergefahren (in den Standby-Modus versetzt). Nach der Schlafperiode werden die Vorgänge fortgesetzt und mÃļglicherweise erneut pausiert, wenn der Temperaturgrenzwert erneut erreicht wird. Während des Betriebs analysiert SnapRAID auch die Heizkurve jeder Festplatte und schätzt die langfristige stationäre Temperatur, die erwartet wird, wenn die Aktivität fortgesetzt wird. Die Schätzung wird nur durchgefÃŧhrt, nachdem die Festplattentemperatur viermal angestiegen ist, um sicherzustellen, dass genÃŧgend Datenpunkte zur VerfÃŧgung stehen, um einen zuverlässigen Trend festzustellen. Diese vorhergesagte stationäre Temperatur wird in Klammern neben dem aktuellen Wert angezeigt und hilft bei der Beurteilung, ob die KÃŧhlung des Systems ausreichend ist. Diese geschätzte Temperatur dient nur zu Informationszwecken und hat keine Auswirkung auf das Verhalten von SnapRAID. Die Aktionen des Programms basieren ausschließlich auf den tatsächlich gemessenen Festplattentemperaturen. Um diese Analyse durchzufÃŧhren, benÃļtigt SnapRAID eine Referenz fÃŧr die Systemtemperatur. Es versucht zunächst, diese von verfÃŧgbaren Hardwaresensoren zu lesen. Wenn kein Systemsensor zugänglich ist, wird die niedrigste zu Beginn des Laufs gemessene Festplattentemperatur als Fallback-Referenz verwendet. Normalerweise zeigt SnapRAID nur die Temperatur der heißesten Festplatte an. Um die Temperatur aller Festplatten anzuzeigen, verwenden Sie die Option -A oder --stats. temp_sleep TIME_IN_MINUTES Legt die Standby-Zeit in Minuten fest, wenn der Temperaturgrenzwert erreicht wird. Während dieser Zeit bleiben die Festplatten heruntergefahren. Der Standardwert ist 5 Minuten. pool DIR Definiert das Pooling-Verzeichnis, in dem die virtuelle Ansicht des Festplatten-Arrays mithilfe des Befehls `pool` erstellt wird. Das Verzeichnis muss bereits existieren. share UNC_DIR Definiert den Windows UNC-Pfad, der fÃŧr den Remote-Zugriff auf die Festplatten erforderlich ist. Wenn diese Option angegeben ist, verwenden die im Pool-Verzeichnis erstellten symbolischen Links diesen UNC-Pfad, um auf die Festplatten zuzugreifen. Ohne diese Option verwenden die generierten symbolischen Links nur lokale Pfade, was die Freigabe des Pool-Verzeichnisses Ãŧber das Netzwerk nicht ermÃļglicht. Die symbolischen Links werden unter Verwendung des angegebenen UNC-Pfads gebildet, wobei der in der `data`-Option angegebene Festplattenname und schließlich das Dateiverzeichnis und der Name hinzugefÃŧgt werden. Diese Option ist nur fÃŧr Windows erforderlich. smartctl DISK/PARITY OPTIONS... Definiert benutzerdefinierte smartctl-Optionen, um die SMART-Attribute fÃŧr jede Festplatte abzurufen. Dies kann fÃŧr RAID-Controller und einige USB-Festplatten erforderlich sein, die nicht automatisch erkannt werden kÃļnnen. Der Platzhalter %s wird durch den Gerätenamen ersetzt, ist aber fÃŧr feste Geräte wie RAID-Controller optional. DISK ist derselbe Festplattenname, der in der `data`-Option angegeben ist. PARITY ist einer der Paritätsnamen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` oder `z-parity`. In den angegebenen OPTIONS wird die Zeichenfolge `%s` durch den Gerätenamen ersetzt. Bei RAID-Controllern ist das Gerät wahrscheinlich fest, und Sie mÃŧssen `%s` mÃļglicherweise nicht verwenden. Weitere mÃļgliche Optionen finden Sie in der smartmontools-Dokumentation: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices Zum Beispiel: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignoriert das angegebene SMART-Attribut bei der Berechnung der Wahrscheinlichkeit eines Festplattenausfalls. Diese Option ist nÃŧtzlich, wenn eine Festplatte ungewÃļhnliche oder irrefÃŧhrende Werte fÃŧr ein bestimmtes Attribut meldet. DISK ist derselbe Festplattenname, der in der `data`-Option angegeben ist. PARITY ist einer der Paritätsnamen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` oder `z-parity`. Der Sonderwert * kann verwendet werden, um das Attribut auf allen Festplatten zu ignorieren. Um beispielsweise das Attribut `Current Pending Sector Count` auf allen Festplatten zu ignorieren: :smartignore * 197 Um es nur auf der ersten Paritätsfestplatte zu ignorieren: :smartignore parity 197 Examples Ein Beispiel fÃŧr eine typische Konfiguration fÃŧr Unix ist: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Ein Beispiel fÃŧr eine typische Konfiguration fÃŧr Windows ist: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern Muster bieten eine flexible MÃļglichkeit, Dateien fÃŧr die Einbeziehung oder den Ausschluss zu filtern. Durch die Verwendung von Globbing-Zeichen kÃļnnen Sie Regeln definieren, die mit bestimmten Dateinamen oder ganzen Verzeichnisstrukturen Ãŧbereinstimmen, ohne jeden Pfad manuell auflisten zu mÃŧssen. Das Fragezeichen `?` entspricht einem beliebigen einzelnen Zeichen außer dem Verzeichnistrennzeichen. Dies macht es nÃŧtzlich fÃŧr den Abgleich von Dateinamen mit variablen Zeichen, während das Muster auf eine einzelne Verzeichnisebene beschränkt bleibt. Der einfache Stern `*` entspricht einer beliebigen Folge von Zeichen, aber wie das Fragezeichen Ãŧberschreitet er niemals Verzeichnisgrenzen. Er stoppt beim Schrägstrich, was ihn fÃŧr den Abgleich innerhalb einer einzelnen Pfadkomponente geeignet macht. Dies ist das Standardverhalten von Wildcards, das vom Shell- Globbing bekannt ist. Der Doppelstern `**` ist mächtiger; er entspricht jeder Folge von Zeichen einschließlich Verzeichnistrennzeichen. Dies ermÃļglicht es Mustern, Ãŧber mehrere Verzeichnisebenen hinweg Ãŧbereinzustimmen. Wenn `**` direkt in ein Muster eingebettet ist, kann es null oder mehr Zeichen einschließlich Schrägstrichen zwischen dem umgebenden wÃļrtlichen Text entsprechen. Die wichtigste Verwendung von `**` ist in der speziellen Form `/**/`. Dies entspricht null oder mehr vollständigen Verzeichnisebenen, was es mÃļglich macht, Dateien in jeder Tiefe eines Verzeichnisbaums abzugleichen, ohne die genaue Pfadstruktur zu kennen. Zum Beispiel entspricht das Muster `src/**/main.js` dem Pfad `src/main.js` (Überspringen von null Verzeichnissen), `src/ui/main.js` (Überspringen eines Verzeichnisses) und `src/ui/components/main.js` (Überspringen von zwei Verzeichnissen). Zeichenklassen mit eckigen Klammern `[]` entsprechen einem einzelnen Zeichen aus einer bestimmten Menge oder einem Bereich. Wie die anderen Einzelzeichenmuster entsprechen sie nicht den Verzeichnistrennzeichen. Klassen unterstÃŧtzen Bereiche und Negierung durch ein Ausrufezeichen. Der grundlegende Unterschied, den man sich merken sollte, ist, dass `*`, `?` und Zeichenklassen alle Verzeichnisgrenzen respektieren und nur innerhalb einer einzelnen Pfadkomponente Ãŧbereinstimmen, während `**` das einzige Muster ist, das Ãŧber Verzeichnistrennzeichen hinweg Ãŧbereinstimmen kann. Es gibt vier verschiedene Arten von Mustern: =FILE Wählt jede Datei mit dem Namen FILE aus. Dieses Muster gilt nur fÃŧr Dateien, nicht fÃŧr Verzeichnisse. =DIR/ Wählt jedes Verzeichnis mit dem Namen DIR und alles darin aus. Dieses Muster gilt nur fÃŧr Verzeichnisse, nicht fÃŧr Dateien. =/PATH/FILE Wählt den exakt angegebenen Dateipfad aus. Dieses Muster gilt nur fÃŧr Dateien, nicht fÃŧr Verzeichnisse. =/PATH/DIR/ Wählt den exakt angegebenen Verzeichnispfad und alles darin aus. Dieses Muster gilt nur fÃŧr Verzeichnisse, nicht fÃŧr Dateien. Wenn Sie einen absoluten Pfad angeben, der mit / beginnt, wird er auf das Array-Stammverzeichnis angewendet, nicht auf das lokale Dateisystem-Stammverzeichnis. Unter Windows kÃļnnen Sie den Backslash \ anstelle des Forward-Slash / verwenden. Windows-Systemverzeichnisse, Junctions, Einhängepunkte (Mount Points) und andere spezielle Windows-Verzeichnisse werden als Dateien behandelt, was bedeutet, dass Sie zum Ausschließen eine Dateiregel verwenden mÃŧssen, nicht eine Verzeichnisregel. Wenn der Dateiname ein Zeichen `*`, `?`, `[`, oder `]` enthält, mÃŧssen Sie es escapen, um zu vermeiden, dass es als Globbing-Zeichen interpretiert wird. Unter Unix ist das Escape-Zeichen `\`; unter Windows ist es `^`. Wenn sich das Muster in der Befehlszeile befindet, mÃŧssen Sie das Escape-Zeichen verdoppeln, um zu vermeiden, dass es von der Befehlsshell interpretiert wird. In der Konfigurationsdatei kÃļnnen Sie verschiedene Strategien zum Filtern der zu verarbeitenden Dateien verwenden. Der einfachste Ansatz besteht darin, nur `exclude`-Regeln zu verwenden, um alle Dateien und Verzeichnisse zu entfernen, die Sie nicht verarbeiten mÃļchten. Zum Beispiel: :# Schließt jede Datei namens `*.unrecoverable` aus :exclude *.unrecoverable :# Schließt das Stammverzeichnis `/lost+found` aus :exclude /lost+found/ :# Schließt jedes Unterverzeichnis namens `tmp` aus :exclude tmp/ Der gegenteilige Ansatz besteht darin, nur die Dateien zu definieren, die Sie verarbeiten mÃļchten, indem Sie nur `include`-Regeln verwenden. Zum Beispiel: :# Schließt nur einige Verzeichnisse ein :include /movies/ :include /musics/ :include /pictures/ Der letzte Ansatz besteht darin, `exclude`- und `include`-Regeln zu mischen. In diesem Fall ist die Reihenfolge der Regeln wichtig. FrÃŧhere Regeln haben Vorrang vor späteren. Zur Vereinfachung kÃļnnen Sie zuerst alle `exclude`-Regeln und dann alle `include`-Regeln auflisten. Zum Beispiel: :# Schließt jede Datei namens `*.unrecoverable` aus :exclude *.unrecoverable :# Schließt jedes Unterverzeichnis namens `tmp` aus :exclude tmp/ :# Schließt nur einige Verzeichnisse ein :include /movies/ :include /musics/ :include /pictures/ In der Befehlszeile kÃļnnen Sie mit der Option -f nur `include`-Muster verwenden. Zum Beispiel: :# ÜberprÃŧft nur die .mp3-Dateien. :# Unter Unix AnfÃŧhrungszeichen verwenden, um die Globbing-Erweiterung durch die Shell zu vermeiden. :snapraid -f "*.mp3" check Unter Unix mÃŧssen Sie Globbing-Zeichen in der Befehlszeile in AnfÃŧhrungszeichen setzen, um zu verhindern, dass die Shell sie erweitert. Dateien Ignorieren Zusätzlich zu den globalen Regeln in der Konfigurationsdatei kÃļnnen Sie `.snapraidignore`-Dateien in jedem Verzeichnis innerhalb des Arrays platzieren, um dezentrale Ausschlussregeln zu definieren. Regeln, die in `.snapraidignore` definiert sind, werden nach den Regeln in der Konfigurationsdatei angewendet. Dies bedeutet, dass sie eine hÃļhere Priorität haben und verwendet werden kÃļnnen, um Dateien auszuschließen, die zuvor durch die globale Konfiguration eingeschlossen wurden. Effektiv wird eine Datei ausgeschlossen, wenn eine lokale Regel zutrifft, unabhängig von den globalen Include-Einstellungen. Die Musterlogik in `.snapraidignore` spiegelt die globale Konfiguration wider, verankert die Muster jedoch an dem Verzeichnis, in dem sich die Datei befindet: =FILE Wählt jede Datei namens FILE in diesem Verzeichnis oder darunter aus. Dies folgt denselben Globbing-Regeln wie das globale Muster. =DIR/ Wählt jedes Verzeichnis namens DIR und alles darin aus, das sich in diesem Verzeichnis oder darunter befindet. =/PATH/FILE Wählt die exakt angegebene Datei relativ zum Speicherort der `.snapraidignore`-Datei aus. =/PATH/DIR/ Wählt das exakt angegebene Verzeichnis und alles darin aus, relativ zum Speicherort der `.snapraidignore`-Datei. Im Gegensatz zur globalen Konfiguration unterstÃŧtzen `.snapraidignore`-Dateien nur Ausschlussregeln; Sie kÃļnnen keine `include`-Muster oder Negationen (!) verwenden. Wenn Sie beispielsweise eine `.snapraidignore` in `/mnt/disk1/projects/` haben: :# Schließt NUR /mnt/disk1/projects/output.bin aus :/output.bin :# Schließt jedes Verzeichnis namens `build` innerhalb von projects/ aus :build/ :# Schließt jede .tmp-Datei innerhalb von projects/ oder deren Unterordnern aus :*.tmp Content SnapRAID speichert die Liste und PrÃŧfsummen Ihrer Dateien in der Content-Datei. Es ist eine Binärdatei, die alle im Festplatten-Array vorhandenen Dateien auflistet, zusammen mit allen PrÃŧfsummen zur ÜberprÃŧfung ihrer Integrität. Diese Datei wird von den Befehlen `sync` und `scrub` gelesen und geschrieben und von den Befehlen `fix`, `check` und `status` gelesen. Parity SnapRAID speichert die Paritätsinformationen Ihres Arrays in den Paritätsdateien. Dies sind Binärdateien, die die berechnete Parität aller in der `content`-Datei definierten BlÃļcke enthalten. Diese Dateien werden von den Befehlen `sync` und `fix` gelesen und geschrieben und nur von den Befehlen `scrub` und `check` gelesen. Encoding SnapRAID ignoriert unter Unix jede Kodierung. Es liest und speichert die Dateinamen mit derselben Kodierung, die vom Dateisystem verwendet wird. Unter Windows werden alle vom Dateisystem gelesenen Namen konvertiert und im UTF-8-Format verarbeitet. Um Dateinamen korrekt auszugeben, mÃŧssen Sie die Windows-Konsole mit dem Befehl `chcp 65001` auf den UTF-8-Modus einstellen und eine TrueType-Schriftart wie `Lucida Console` als Konsolenschriftart verwenden. Dies betrifft nur die gedruckten Dateinamen; wenn Sie die Konsolenausgabe in eine Datei umleiten, ist die resultierende Datei immer im UTF-8-Format. Copyright Diese Datei ist Copyright (C) 2025 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-de.txt000066400000000000000000002272361522717156100167700ustar00rootroot00000000000000 ========================================= SnapRAID Sicherung fÃŧr Festplatten-Arrays ========================================= 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAID ist ein Sicherungsprogramm, das fÃŧr Festplatten-Arrays entwickelt wurde und Paritätsinformationen zur Datenwiederherstellung bei Ausfall von bis zu sechs Festplatten speichert. SnapRAID ist hauptsächlich fÃŧr Home-Media-Center mit großen, selten geänderten Dateien konzipiert und bietet folgende Funktionen: * Sie kÃļnnen bereits mit Dateien gefÃŧllte Festplatten verwenden, ohne sie neu formatieren zu mÃŧssen, und wie gewohnt darauf zugreifen. * Alle Ihre Daten werden gehasht, um die Datenintegrität zu gewährleisten und stille Beschädigung (silent corruption) zu verhindern. * Wenn die Anzahl der ausgefallenen Festplatten die Paritätsanzahl Ãŧberschreitet, beschränkt sich der Datenverlust auf die betroffenen Festplatten; Daten auf anderen Festplatten bleiben zugänglich. * Wenn Sie versehentlich Dateien auf einer Festplatte lÃļschen, ist eine Wiederherstellung mÃļglich. * Festplatten kÃļnnen unterschiedliche GrÃļßen haben. * Sie kÃļnnen jederzeit Festplatten hinzufÃŧgen. * SnapRAID sperrt Ihre Daten nicht ein; Sie kÃļnnen die Verwendung jederzeit beenden, ohne neu formatieren oder Daten verschieben zu mÃŧssen. * Um auf eine Datei zuzugreifen, muss nur eine einzige Festplatte drehen (spinnen), was Strom spart und Geräusche reduziert. FÃŧr weitere Informationen besuchen Sie bitte die offizielle SnapRAID-Website: https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID ist ein Hybrid aus einem RAID- und einem Sicherungsprogramm, das darauf abzielt, die besten Vorteile beider zu kombinieren. Es hat jedoch einige Einschränkungen, die Sie vor der Verwendung berÃŧcksichtigen sollten. Die Haupteinschränkung besteht darin, dass wenn eine Festplatte ausfällt und Sie in letzter Zeit keine Synchronisierung durchgefÃŧhrt haben, Sie mÃļglicherweise nicht vollständig wiederherstellen kÃļnnen. Genauer gesagt kÃļnnen Sie mÃļglicherweise nicht bis zur GrÃļße der geänderten oder gelÃļschten Dateien seit der letzten `sync`-Operation wiederherstellen. Dies tritt auch dann auf, wenn die geänderten oder gelÃļschten Dateien sich nicht auf der ausgefallenen Festplatte befinden. Aus diesem Grund ist SnapRAID besser fÃŧr Daten geeignet, die sich selten ändern. Andererseits verhindern neu hinzugefÃŧgte Dateien die Wiederherstellung von bereits vorhandenen Dateien nicht. Sie verlieren nur die kÃŧrzlich hinzugefÃŧgten Dateien, wenn diese sich auf der ausgefallenen Festplatte befinden. Weitere Einschränkungen von SnapRAID sind: * Mit SnapRAID haben Sie immer noch separate Dateisysteme fÃŧr jede Festplatte. Mit RAID erhalten Sie ein einziges großes Dateisystem. * SnapRAID streift (stripes) keine Daten. Mit RAID erhalten Sie einen Geschwindigkeitsvorteil durch Striping. * SnapRAID unterstÃŧtzt keine Echtzeit-Wiederherstellung. Mit RAID mÃŧssen Sie die Arbeit nicht unterbrechen, wenn eine Festplatte ausfällt. * SnapRAID kann Daten nur von einer begrenzten Anzahl von Festplattenausfällen wiederherstellen. Mit einer Sicherung kÃļnnen Sie von einem vollständigen Ausfall des gesamten Festplatten-Arrays wiederherstellen. * Nur Dateinamen, Zeitstempel, symbolische Links (symlinks) und Hardlinks werden gespeichert. Berechtigungen, EigentÃŧmerschaft und erweiterte Attribute werden nicht gespeichert. 4 GETTING STARTED ================= Um SnapRAID zu verwenden, mÃŧssen Sie zuerst eine Festplatte in Ihrem Festplatten-Array auswählen, die fÃŧr `parity`-Informationen reserviert wird. Mit einer Festplatte fÃŧr Parität kÃļnnen Sie von einem einzelnen Festplattenausfall wiederherstellen, ähnlich wie bei RAID5. Wenn Sie von mehr Festplattenausfällen wiederherstellen mÃļchten, ähnlich wie bei RAID6, mÃŧssen Sie zusätzliche Festplatten fÃŧr Parität reservieren. Jede zusätzliche Paritätsfestplatte ermÃļglicht die Wiederherstellung von einem weiteren Festplattenausfall. Als Paritätsfestplatten mÃŧssen Sie die grÃļßten Festplatten im Array auswählen, da die Paritätsinformationen auf die GrÃļße der grÃļßten Datenfestplatte im Array anwachsen kÃļnnen. Diese Festplatten werden zum Speichern der `parity`-Dateien reserviert. Sie sollten Ihre Daten nicht darauf speichern. Anschließend mÃŧssen Sie die `data`-Festplatten definieren, die Sie mit SnapRAID schÃŧtzen mÃļchten. Der Schutz ist effektiver, wenn diese Festplatten Daten enthalten, die sich selten ändern. Aus diesem Grund ist es besser, die Windows C:\-Festplatte oder die Unix-Verzeichnisse /home, /var und /tmp NICHT einzuschließen. Die Liste der Dateien wird in den `content`-Dateien gespeichert, die normalerweise auf den Daten-, Paritäts- oder Boot-Festplatten gespeichert werden. Diese Datei enthält die Details Ihrer Sicherung, einschließlich aller PrÃŧfsummen zur ÜberprÃŧfung ihrer Integrität. Die `content`-Datei wird in mehreren Kopien gespeichert, und jede Kopie muss sich auf einer anderen Festplatte befinden, um sicherzustellen, dass selbst bei mehreren Festplattenausfällen mindestens eine Kopie verfÃŧgbar ist. Angenommen, Sie sind nur an einer Paritätsstufe des Schutzes interessiert und Ihre Festplatten befinden sich unter: /mnt/diskp <- ausgewählte Festplatte fÃŧr Parität /mnt/disk1 <- erste zu schÃŧtzende Festplatte /mnt/disk2 <- zweite zu schÃŧtzende Festplatte /mnt/disk3 <- dritte zu schÃŧtzende Festplatte Sie mÃŧssen die Konfigurationsdatei /etc/snapraid.conf mit den folgenden Optionen erstellen: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Wenn Sie Windows verwenden, sollten Sie das Windows-Pfadformat mit Laufwerksbuchstaben und Backslashes anstelle von Slashes verwenden. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Wenn Sie viele Festplatten haben und keine Laufwerksbuchstaben mehr verfÃŧgbar sind, kÃļnnen Sie Festplatten direkt in Unterordnern einhängen (mounten). Siehe: https://www.google.com/search?q=Windows+mount+point Zu diesem Zeitpunkt sind Sie bereit, den Befehl `sync` auszufÃŧhren, um die Paritätsinformationen zu erstellen. snapraid sync Dieser Vorgang kann beim ersten Mal mehrere Stunden dauern, abhängig von der GrÃļße der bereits auf den Festplatten vorhandenen Daten. Wenn die Festplatten leer sind, ist der Vorgang sofort abgeschlossen. Sie kÃļnnen ihn jederzeit durch DrÃŧcken von Strg+C anhalten, und beim nächsten Lauf wird er dort fortgesetzt, wo er unterbrochen wurde. Wenn dieser Befehl abgeschlossen ist, sind Ihre Daten SICHER. Jetzt kÃļnnen Sie Ihr Array nach Belieben verwenden und die Paritätsinformationen regelmäßig durch AusfÃŧhren des `sync`-Befehls aktualisieren. 4.1 Scrubbing ------------- Um die Daten und die Parität regelmäßig auf Fehler zu ÃŧberprÃŧfen, kÃļnnen Sie den Befehl `scrub` ausfÃŧhren. snapraid scrub Dieser Befehl vergleicht die Daten in Ihrem Array mit dem Hash, der während des `sync`-Befehls berechnet wurde, um die Integrität zu ÃŧberprÃŧfen. Jeder Lauf des Befehls ÃŧberprÃŧft ungefähr 8% des Arrays, ausgenommen Daten, die bereits in den letzten 10 Tagen gescrubbed wurden. Sie kÃļnnen die Option -p, --plan verwenden, um eine andere Menge anzugeben, und die Option -o, --older-than, um ein anderes Alter in Tagen anzugeben. Zum Beispiel, um 5% des Arrays auf BlÃļcke zu ÃŧberprÃŧfen, die älter als 20 Tage sind, verwenden Sie: snapraid -p 5 -o 20 scrub Wenn während des Vorgangs stille oder Eingabe-/Ausgabefehler gefunden werden, werden die entsprechenden BlÃļcke in der `content`-Datei als fehlerhaft (bad) markiert und im Befehl `status` aufgelistet. snapraid status Um sie zu beheben, kÃļnnen Sie den Befehl `fix` verwenden und dabei nach fehlerhaften BlÃļcken mit der Option -e, --filter-error filtern: snapraid -e fix Beim nächsten `scrub` verschwinden die Fehler aus dem `status`-Bericht, wenn sie tatsächlich behoben sind. Um es schneller zu machen, kÃļnnen Sie -p bad verwenden, um nur als fehlerhaft markierte BlÃļcke zu scrubben. snapraid -p bad scrub Das AusfÃŧhren von `scrub` auf einem nicht synchronisierten Array kann Fehler melden, die durch entfernte oder geänderte Dateien verursacht wurden. Diese Fehler werden in der `scrub`-Ausgabe gemeldet, aber die zugehÃļrigen BlÃļcke werden nicht als fehlerhaft markiert. 4.2 Pooling ----------- Hinweis: Die unten beschriebene Pooling-Funktion wurde durch das Tool mergerfs ersetzt, das jetzt die empfohlene Option fÃŧr Linux-Benutzer in der SnapRAID-Community ist. Mergefs bietet eine flexiblere und effizientere MÃļglichkeit, mehrere Laufwerke zu einem einzigen, vereinheitlichten Einhängepunkt (Mount Point) zusammenzufassen, was einen nahtlosen Zugriff auf Dateien Ãŧber Ihr gesamtes Array hinweg ermÃļglicht, ohne auf symbolische Links angewiesen zu sein. Es lässt sich gut mit SnapRAID zum Paritätsschutz integrieren und wird häufig in Setups wie OpenMediaVault (OMV) oder benutzerdefinierten NAS-Konfigurationen verwendet. Um alle Dateien in Ihrem Array im selben Verzeichnisbaum anzuzeigen, kÃļnnen Sie die `pooling`-Funktion aktivieren. Sie erstellt eine schreibgeschÃŧtzte virtuelle Ansicht aller Dateien in Ihrem Array mithilfe symbolischer Links. Sie kÃļnnen das `pooling`-Verzeichnis in der Konfigurationsdatei mit folgender Option konfigurieren: pool /pool oder, wenn Sie Windows verwenden, mit: pool C:\pool und anschließend den Befehl `pool` ausfÃŧhren, um die virtuelle Ansicht zu erstellen oder zu aktualisieren. snapraid pool Wenn Sie eine Unix-Plattform verwenden und dieses Verzeichnis Ãŧber das Netzwerk fÃŧr Windows- oder Unix-Maschinen freigeben mÃļchten, sollten Sie die folgenden Optionen zu Ihrer /etc/samba/smb.conf hinzufÃŧgen: # Im globalen Abschnitt von smb.conf unix extensions = no # Im Freigabe-Abschnitt von smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes In Windows erfordert die Freigabe symbolischer Links Ãŧber ein Netzwerk, dass Clients diese remote auflÃļsen. Um dies zu ermÃļglichen, mÃŧssen Sie neben der Freigabe des Pool-Verzeichnisses auch alle Festplatten unabhängig freigeben, indem Sie die in der Konfigurationsdatei definierten Festplattennamen als Freigabepunkte verwenden. Sie mÃŧssen auch in der Option `share` der Konfigurationsdatei den Windows UNC-Pfad angeben, den Remote-Clients benÃļtigen, um auf diese freigegebenen Festplatten zuzugreifen. Zum Beispiel, wenn Sie von einem Server namens `darkstar` aus arbeiten, kÃļnnen Sie die Optionen verwenden: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar und die folgenden Verzeichnisse Ãŧber das Netzwerk freigeben: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array um Remote-Clients den Zugriff auf alle Dateien unter \\darkstar\pool zu ermÃļglichen. MÃļglicherweise mÃŧssen Sie auch Remote-Clients konfigurieren, um den Zugriff auf Remote-Symlinks mit dem Befehl zu aktivieren: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAID funktioniert eher wie ein Sicherungsprogramm als ein RAID-System und kann verwendet werden, um Dateien in ihren vorherigen Zustand wiederherzustellen oder das LÃļschen rÃŧckgängig zu machen, indem die Option -f, --filter verwendet wird: snapraid fix -f DATEI oder fÃŧr ein Verzeichnis: snapraid fix -f VERZEICHNIS/ Sie kÃļnnen es auch verwenden, um nur versehentlich gelÃļschte Dateien innerhalb eines Verzeichnisses wiederherzustellen, indem Sie die Option -m, --filter-missing verwenden, die nur fehlende Dateien wiederherstellt und alle anderen unberÃŧhrt lässt. snapraid fix -m -f VERZEICHNIS/ Oder um alle gelÃļschten Dateien auf allen Laufwerken wiederherzustellen mit: snapraid fix -m 4.4 Recovering -------------- Das Schlimmste ist passiert, und Sie haben eine oder mehrere Festplatten verloren! KEINE PANIK! Sie werden in der Lage sein, sie wiederherzustellen! Das erste, was Sie tun mÃŧssen, ist, weitere Änderungen an Ihrem Festplatten-Array zu vermeiden. Deaktivieren Sie alle Remote-Verbindungen dazu und alle geplanten Prozesse, einschließlich geplanter SnapRAID-nächtlicher `sync`- oder `scrub`-Läufe. Fahren Sie dann mit den folgenden Schritten fort. ---- 4.4.1 STEP 1 -> Reconfigure ---- Sie benÃļtigen etwas Platz zur Wiederherstellung, idealerweise auf zusätzlichen Ersatzfestplatten, aber eine externe USB-Festplatte oder eine Remote-Festplatte ist ausreichend. Ändern Sie die SnapRAID-Konfigurationsdatei so, dass die `data`- oder `parity`-Option der ausgefallenen Festplatte auf einen Ort mit genÃŧgend leerem Speicherplatz zur Wiederherstellung der Dateien zeigt. Wenn zum Beispiel die Festplatte `d1` ausgefallen ist, ändern Sie von: data d1 /mnt/disk1/ zu: data d1 /mnt/new_spare_disk/ Wenn die wiederherzustellende Festplatte eine Paritätsfestplatte ist, aktualisieren Sie die entsprechende `parity`-Option. Wenn Sie mehrere ausgefallene Festplatten haben, aktualisieren Sie alle ihre Konfigurationsoptionen. ---- 4.4.2 STEP 2 -> Fix ---- FÃŧhren Sie den `fix`-Befehl aus und speichern Sie das Protokoll in einer externen Datei mit: snapraid -d NAME -l fix.log fix Wobei NAME der Name der Festplatte ist, wie z.B. `d1` in unserem vorherigen Beispiel. Wenn die wiederherzustellende Festplatte eine Paritätsfestplatte ist, verwenden Sie die Namen `parity`, `2-parity`, usw. Wenn Sie mehrere ausgefallene Festplatten haben, verwenden Sie mehrere -d-Optionen, um alle anzugeben. Dieser Befehl wird lange dauern. Stellen Sie sicher, dass Sie einige Gigabyte frei haben, um die Datei fix.log zu speichern. FÃŧhren Sie ihn von einer Festplatte mit ausreichend freiem Speicherplatz aus. Jetzt haben Sie alles wiederhergestellt, was wiederherstellbar ist. Wenn einige Dateien teilweise oder vollständig nicht wiederherstellbar sind, werden sie umbenannt, indem die Erweiterung `.unrecoverable` hinzugefÃŧgt wird. Sie finden eine detaillierte Liste aller nicht wiederherstellbaren BlÃļcke in der Datei fix.log, indem Sie alle Zeilen ÃŧberprÃŧfen, die mit `unrecoverable:` beginnen. Wenn Sie mit der Wiederherstellung nicht zufrieden sind, kÃļnnen Sie sie so oft wie gewÃŧnscht wiederholen. Wenn Sie zum Beispiel Dateien nach dem letzten `sync` aus dem Array entfernt haben, kann dies dazu fÃŧhren, dass einige Dateien nicht wiederhergestellt werden. In diesem Fall kÃļnnen Sie den `fix` mithilfe der Option -i, --import wiederholen, wobei Sie angeben, wo sich diese Dateien jetzt befinden, um sie erneut in den Wiederherstellungsprozess einzubeziehen. Wenn Sie mit der Wiederherstellung zufrieden sind, kÃļnnen Sie fortfahren, aber beachten Sie, dass Sie nach der Synchronisierung den `fix`-Befehl nicht mehr wiederholen kÃļnnen! ---- 4.4.3 STEP 3 -> Check ---- Als vorsichtige ÜberprÃŧfung kÃļnnen Sie jetzt einen `check`-Befehl ausfÃŧhren, um sicherzustellen, dass auf der wiederhergestellten Festplatte alles korrekt ist. snapraid -d NAME -a check Wobei NAME der Name der Festplatte ist, wie z.B. `d1` in unserem vorherigen Beispiel. Die Optionen -d und -a weisen SnapRAID an, nur die angegebene Festplatte zu ÃŧberprÃŧfen und alle Paritätsdaten zu ignorieren. Dieser Befehl wird lange dauern, aber wenn Sie nicht Ãŧbermäßig vorsichtig sind, kÃļnnen Sie ihn Ãŧberspringen. ---- 4.4.4 STEP 4 -> Sync ---- FÃŧhren Sie den `sync`-Befehl aus, um das Array mit der neuen Festplatte zu resynchronisieren. snapraid sync Wenn alles wiederhergestellt ist, ist dieser Befehl sofort. 5 COMMANDS ========== SnapRAID bietet einige einfache Befehle, mit denen Sie: * Den Status des Arrays ausgeben -> `status` * Die Festplatten steuern -> `smart`, `probe`, `up`, `down` * Eine Sicherung/einen Snapshot erstellen -> `sync` * Daten regelmäßig ÃŧberprÃŧfen -> `scrub` * Die letzte Sicherung/den letzten Snapshot wiederherstellen -> `fix`. Befehle mÃŧssen in Kleinbuchstaben geschrieben werden. 5.1 status ---------- Gibt eine Zusammenfassung des Zustands des Festplatten-Arrays aus. Es enthält Informationen zur Paritätsfragmentierung, wie alt die BlÃļcke sind, ohne ÜberprÃŧfung, und alle aufgezeichneten stillen Fehler, die beim Scrubbing aufgetreten sind. Die präsentierten Informationen beziehen sich auf den letzten Zeitpunkt, zu dem Sie `sync` ausgefÃŧhrt haben. Spätere Änderungen werden nicht berÃŧcksichtigt. Wenn fehlerhafte BlÃļcke erkannt wurden, werden deren Blocknummern aufgelistet. Um sie zu beheben, kÃļnnen Sie den Befehl `fix -e` verwenden. Es zeigt auch ein Diagramm an, das den letzten Zeitpunkt darstellt, zu dem jeder Block gescrubbed oder synchronisiert wurde. Gescrubbed BlÃļcke werden mit `*`, BlÃļcke, die synchronisiert, aber noch nicht gescrubbed wurden, mit `o` angezeigt. Es wird nichts geändert. 5.2 smart --------- Gibt einen SMART-Bericht aller Festplatten im System aus. Es enthält eine Schätzung der Ausfallwahrscheinlichkeit im nächsten Jahr, sodass Sie die Wartungsersetzung von Festplatten planen kÃļnnen, die verdächtige Attribute aufweisen. Diese Wahrscheinlichkeitsschätzung wird durch Korrelation der SMART-Attribute der Festplatten mit den Backblaze-Daten erhalten, die unter folgender Adresse verfÃŧgbar sind: https://www.backblaze.com/hard-drive-test-data.html Wenn SMART meldet, dass eine Festplatte ausfällt, wird `FAIL` oder `PREFAIL` fÃŧr diese Festplatte gedruckt, und SnapRAID endet mit einem Fehler. In diesem Fall wird ein sofortiger Austausch der Festplatte dringend empfohlen. Weitere mÃļgliche Statuszeichenfolgen sind: logfail - In der Vergangenheit lagen einige Attribute unter dem Schwellenwert. logerr - Das Gerätefehlerprotokoll enthält Fehler. selferr - Das Geräte-Selbsttestprotokoll enthält Fehler. Wenn die Option -v, --verbose angegeben ist, wird eine tiefere statistische Analyse bereitgestellt. Diese Analyse kann Ihnen bei der Entscheidung helfen, ob Sie mehr oder weniger Parität benÃļtigen. Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem AusfÃŧhren von `smartctl -a` auf allen Geräten. Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, kÃļnnen Sie einen benutzerdefinierten Befehl mithilfe der `smartctl`-Option in der Konfigurationsdatei angeben. Es wird nichts geändert. 5.3 probe --------- Gibt den POWER-Zustand aller Festplatten im System aus. `Standby` bedeutet, dass die Festplatte nicht dreht. `Active` bedeutet, dass die Festplatte dreht. Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem AusfÃŧhren von `smartctl -n standby -i` auf allen Geräten. Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, kÃļnnen Sie einen benutzerdefinierten Befehl mithilfe der `smartctl`-Option in der Konfigurationsdatei angeben. Es wird nichts geändert. 5.4 up ------ Dreht alle Festplatten des Arrays hoch (spins up). Sie kÃļnnen nur bestimmte Festplatten mithilfe der Option -d, --filter-disk hochdrehen. Das gleichzeitige Hochdrehen aller Festplatten erfordert viel Strom. Stellen Sie sicher, dass Ihr Netzteil dies aushalten kann. Es wird nichts geändert. 5.5 down -------- Dreht alle Festplatten des Arrays herunter (spins down). Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem AusfÃŧhren von `smartctl -s standby,now` auf allen Geräten. Sie kÃļnnen nur bestimmte Festplatten mithilfe der Option -d, --filter-disk herunterdrehen. Um automatisch bei einem Fehler herunterzufahren, kÃļnnen Sie die Option -s, --spin-down-on-error mit jedem anderen Befehl verwenden, was dem manuellen AusfÃŧhren von `down` bei Auftreten eines Fehlers entspricht. Es wird nichts geändert. 5.6 diff -------- Listet alle Dateien auf, die seit dem letzten `sync` geändert wurden und deren Paritätsdaten neu berechnet werden mÃŧssen. Dieser Befehl ÃŧberprÃŧft nicht die Dateidaten, sondern nur den Dateizeitstempel, die GrÃļße und die Inode. Nach dem Auflisten aller geänderten Dateien wird eine Zusammenfassung der Änderungen präsentiert, gruppiert nach: equal - Dateien, die sich seitdem nicht geändert haben. added - Neu hinzugefÃŧgte Dateien, die vorher nicht vorhanden waren. removed - Entfernte Dateien. updated - Dateien mit einer anderen GrÃļße oder einem anderen Zeitstempel, was bedeutet, dass sie geändert wurden. moved - Auf derselben Festplatte in ein anderes Verzeichnis verschobene Dateien. Sie werden durch denselben Namen, dieselbe GrÃļße, denselben Zeitstempel und dieselbe Inode, aber ein anderes Verzeichnis identifiziert. copied - Dateien, die auf dieselbe oder eine andere Festplatte kopiert wurden, wobei die Originaldatei noch vorhanden ist. Sie werden dadurch identifiziert, dass sie denselben Namen, dieselbe GrÃļße und denselben Zeitstempel haben. Wenn der Subsekunden-Zeitstempel Null ist, muss der vollständige Pfad Ãŧbereinstimmen, um identifiziert zu werden, nicht nur der Name. relocated - Dateien, die auf dieselbe oder eine andere Festplatte verschoben wurden, wobei das Original verschwunden ist. Sie werden dadurch identifiziert, dass sie denselben Namen, dieselbe GrÃļße und denselben Zeitstempel haben. Wenn der Subsekunden-Zeitstempel Null ist, muss der vollständige Pfad Ãŧbereinstimmen, um identifiziert zu werden. Im Gegensatz zu 'moved' Dateien auf derselben Festplatte haben verschobene Dateien einen anderen Inode. restored - Dateien mit einem anderen Inode, aber passendem Verzeichnis, Namen, GrÃļße und Zeitstempel. Dies sind in der Regel Dateien, die nach dem LÃļschen wiederhergestellt wurden. Wenn ein `sync` erforderlich ist, ist der RÃŧckgabecode des Prozesses 2 anstelle des Standardwerts 0. Der RÃŧckgabecode 1 wird fÃŧr eine allgemeine Fehlerbedingung verwendet. Es wird nichts geändert. 5.7 sync -------- Aktualisiert die Paritätsinformationen. Alle geänderten Dateien im Festplatten-Array werden gelesen, und die entsprechenden Paritätsdaten werden aktualisiert. Sie kÃļnnen diesen Vorgang jederzeit durch DrÃŧcken von Strg+C anhalten, ohne die bereits geleistete Arbeit zu verlieren. Beim nächsten Lauf wird der `sync`-Vorgang dort fortgesetzt, wo er unterbrochen wurde. Wenn während des Vorgangs stille oder Eingabe-/Ausgabefehler gefunden werden, werden die entsprechenden BlÃļcke als fehlerhaft markiert. Dateien werden durch Pfad und/oder Inode identifiziert und anhand von GrÃļße und Zeitstempel ÃŧberprÃŧft. Wenn die DateigrÃļße oder der Zeitstempel abweicht, werden die Paritätsdaten fÃŧr die gesamte Datei neu berechnet. Wenn die Datei auf derselben Festplatte verschoben oder umbenannt wird und dieselbe Inode beibehält, wird die Parität nicht neu berechnet. Wenn die Datei auf eine andere Festplatte verschoben wird, wird die Parität neu berechnet, aber die zuvor berechneten Hash-Informationen werden beibehalten. Die `content`- und `parity`-Dateien werden bei Bedarf geändert. Die Dateien im Array werden NICHT geändert. 5.8 scrub --------- Scrubbt das Array und ÃŧberprÃŧft auf stille oder Eingabe-/Ausgabefehler auf Daten- und Paritätsfestplatten. Jede AusfÃŧhrung ÃŧberprÃŧft ungefähr 8% des Arrays, ausgenommen Daten, die bereits in den letzten 10 Tagen gescrubbed wurden. Dies bedeutet, dass Scrubbing einmal pro Woche sicherstellt, dass jedes Bit an Daten mindestens einmal alle drei Monate ÃŧberprÃŧft wird. Sie kÃļnnen einen anderen Scrub-Plan oder eine andere Menge mithilfe der Option -p, --plan definieren, die Folgendes akzeptiert: bad - Scrubbt als fehlerhaft markierte BlÃļcke. new - Scrubbt gerade synchronisierte BlÃļcke, die noch nicht gescrubbed wurden. full - Scrubbt alles. 0-100 - Scrubbt den angegebenen Prozentsatz der BlÃļcke. Wenn Sie einen Prozentsatz angeben, kÃļnnen Sie auch die Option -o, --older-than verwenden, um festzulegen, wie alt der Block sein soll. Die ältesten BlÃļcke werden zuerst gescrubbed, um eine optimale ÜberprÃŧfung zu gewährleisten. Wenn Sie nur die gerade synchronisierten BlÃļcke scrubben mÃļchten, die noch nicht gescrubbed wurden, verwenden Sie die Option `-p new`. Um Details zum Scrub-Status zu erhalten, verwenden Sie den Befehl `status`. FÃŧr jeden gefundenen stillen oder Eingabe-/Ausgabefehler werden die entsprechenden BlÃļcke in der `content`-Datei als fehlerhaft (bad) markiert. Diese fehlerhaften BlÃļcke werden in `status` aufgelistet und kÃļnnen mit `fix -e` behoben werden. Nach der Behebung werden sie beim nächsten Scrub erneut ÃŧberprÃŧft, und wenn sie als korrigiert befunden werden, wird die fehlerhafte Markierung entfernt. Um nur die fehlerhaften BlÃļcke zu scrubben, kÃļnnen Sie den Befehl `scrub -p bad` verwenden. Es wird empfohlen, `scrub` nur auf einem synchronisierten Array auszufÃŧhren, um gemeldete Fehler zu vermeiden, die durch nicht synchronisierte Daten verursacht werden. Diese Fehler werden als keine stillen Fehler erkannt, und die BlÃļcke werden nicht als fehlerhaft markiert, aber solche Fehler werden in der Ausgabe des Befehls gemeldet. Die `content`-Datei wird geändert, um die Zeit der letzten ÜberprÃŧfung fÃŧr jeden Block zu aktualisieren und fehlerhafte BlÃļcke zu markieren. Die `parity`-Dateien werden NICHT geändert. Die Dateien im Array werden NICHT geändert. 5.9 fix ------- Behebt alle Dateien und die Paritätsdaten. Alle Dateien und Paritätsdaten werden mit dem Snapshot-Zustand verglichen, der beim letzten `sync` gespeichert wurde. Wenn eine Abweichung gefunden wird, wird sie auf den gespeicherten Snapshot zurÃŧckgesetzt. WARNUNG! Der Befehl `fix` unterscheidet nicht zwischen Fehlern und beabsichtigten Änderungen. Er setzt den Dateizustand bedingungslos auf den letzten `sync` zurÃŧck. Wenn keine andere Option angegeben ist, wird das gesamte Array verarbeitet. Verwenden Sie die Filteroptionen, um eine Teilmenge von Dateien oder Festplatten fÃŧr die Operation auszuwählen. Um nur die BlÃļcke zu beheben, die während `sync` und `scrub` als fehlerhaft markiert wurden, verwenden Sie die Option -e, --filter-error. Im Gegensatz zu anderen Filteroptionen wendet diese Behebungen nur auf Dateien an, die seit dem letzten `sync` unverändert sind. SnapRAID benennt alle Dateien, die nicht behoben werden kÃļnnen, durch HinzufÃŧgen der Erweiterung `.unrecoverable` um. Vor dem Beheben wird das gesamte Array gescannt, um alle Dateien zu finden, die seit der letzten `sync`-Operation verschoben wurden. Diese Dateien werden anhand ihres Zeitstempels identifiziert, wobei Name und Verzeichnis ignoriert werden, und werden bei Bedarf im Wiederherstellungsprozess verwendet. Wenn Sie einige davon außerhalb des Arrays verschoben haben, kÃļnnen Sie die Option -i, --import verwenden, um zusätzliche Verzeichnisse zum Scannen anzugeben. Dateien werden nur anhand des Pfads identifiziert, nicht anhand der Inode. Die `content`-Datei wird NICHT geändert. Die `parity`-Dateien werden bei Bedarf geändert. Die Dateien im Array werden bei Bedarf geändert. 5.10 check ---------- ÜberprÃŧft alle Dateien und die Paritätsdaten. Es funktioniert wie `fix`, simuliert jedoch nur eine Wiederherstellung, und es werden keine Änderungen in das Array geschrieben. Dieser Befehl ist primär fÃŧr manuelle ÜberprÃŧfung gedacht, wie z.B. nach einem Wiederherstellungsprozess oder unter anderen speziellen Bedingungen. FÃŧr regelmäßige und geplante ÜberprÃŧfungen verwenden Sie `scrub`. Wenn Sie die Option -a, --audit-only verwenden, wird nur der Hash der Dateien ÃŧberprÃŧft, und die Paritätsdaten werden fÃŧr einen schnelleren Lauf ignoriert. Dateien werden nur anhand des Pfads identifiziert, nicht anhand der Inode. Es wird nichts geändert. 5.11 list --------- Listet alle Dateien auf, die sich zum Zeitpunkt des letzten `sync` im Array befanden. Mit -v oder --verbose wird auch die Untersekundenzeit angezeigt. Es wird nichts geändert. 5.12 dup -------- Listet alle doppelten Dateien auf. Zwei Dateien gelten als gleich, wenn ihre Hashes Ãŧbereinstimmen. Die Dateidaten werden nicht gelesen; es werden nur die vorab berechneten Hashes verwendet. Es wird nichts geändert. 5.13 pool --------- Erstellt oder aktualisiert eine virtuelle Ansicht aller Dateien in Ihrem Festplatten-Array im `pooling`-Verzeichnis. Die Dateien werden nicht kopiert, sondern mithilfe symbolischer Links verknÃŧpft. Beim Aktualisieren werden alle vorhandenen symbolischen Links und leeren Unterverzeichnisse gelÃļscht und durch die neue Ansicht des Arrays ersetzt. Alle anderen regulären Dateien bleiben erhalten. Außerhalb des Pool-Verzeichnisses wird nichts geändert. 5.14 devices ------------ Gibt die Low-Level-Geräte aus, die vom Array verwendet werden. Dieser Befehl zeigt die Gerätezuordnungen im Array an und ist hauptsächlich als Skriptschnittstelle gedacht. Die ersten beiden Spalten sind die Low-Level-Geräte-ID und der Pfad. Die nächsten beiden Spalten sind die High-Level-Geräte-ID und der Pfad. Die letzte Spalte ist der Festplattenname im Array. In den meisten Fällen haben Sie ein Low-Level-Gerät fÃŧr jede Festplatte im Array, aber in einigen komplexeren Konfigurationen kÃļnnen mehrere Low-Level-Geräte von einer einzigen Festplatte im Array verwendet werden. Es wird nichts geändert. 5.15 touch ---------- Setzt einen beliebigen Untersekunden-Zeitstempel fÃŧr alle Dateien, deren Untersekunden-Zeitstempel auf Null gesetzt ist. Dies verbessert die Fähigkeit von SnapRAID, verschobene und kopierte Dateien zu erkennen, da es den Zeitstempel fast eindeutig macht und mÃļgliche Duplikate reduziert. Genauer gesagt, wenn der Untersekunden-Zeitstempel nicht Null ist, wird eine verschobene oder kopierte Datei als solche identifiziert, wenn sie mit Name, GrÃļße und Zeitstempel Ãŧbereinstimmt. Wenn der Untersekunden-Zeitstempel Null ist, wird sie nur als Kopie betrachtet, wenn der vollständige Pfad, die GrÃļße und der Zeitstempel alle Ãŧbereinstimmen. Der Zeitstempel mit Sekundenpräzision wird nicht geändert, sodass alle Daten und Zeiten Ihrer Dateien erhalten bleiben. 5.16 rehash ----------- Plant eine Neu-Hash-Berechnung (rehash) des gesamten Arrays. Dieser Befehl ändert die verwendete Hash-Art, typischerweise beim Upgrade von einem 32-Bit-System auf ein 64-Bit-System, um von MurmurHash3 auf den schnelleren SpookyHash umzuschalten. Wenn Sie bereits den optimalen Hash verwenden, tut dieser Befehl nichts und informiert Sie darÃŧber, dass keine Aktion erforderlich ist. Die Neu-Hash-Berechnung wird nicht sofort durchgefÃŧhrt, sondern findet schrittweise während `sync` und `scrub` statt. Sie kÃļnnen den Neu-Hash-Zustand mithilfe von `status` ÃŧberprÃŧfen. Während der Neu-Hash-Berechnung behält SnapRAID die volle Funktionalität bei, mit der einzigen Ausnahme, dass `dup` keine doppelten Dateien mit einem anderen Hash erkennen kann. 5.17 locate ----------- Lokalisiert Dateien, die auf den Paritätsfestplatten gespeichert sind. FÃŧr jede Ãŧbereinstimmende Datei wird deren Position innerhalb der Paritätsdatei und die Anzahl der belegten Fragmente ausgegeben. Sie kÃļnnen die Option -t, --tail verwenden, um den Vorgang auf Dateien zu beschränken, die den angegebenen Endbereich (Tail) der Parität belegen. Wenn Sie diese Dateien neu zuweisen mÃļchten, kÃļnnen Sie die Option -W, --force-realloc-tail verwenden. Beachten Sie, dass solche Dateien während des Neuzuweisungsprozesses nicht durch die Parität geschÃŧtzt sind. 6 OPTIONS ========= SnapRAID bietet die folgenden Optionen: -c, --conf CONFIG Wählt die zu verwendende Konfigurationsdatei aus. Wenn nicht angegeben, wird unter Unix die Datei `/usr/local/etc/snapraid.conf` verwendet, falls sie existiert, andernfalls `/etc/snapraid.conf`. Unter Windows wird die Datei `snapraid.conf` im selben Verzeichnis wie `snapraid.exe` verwendet. -f, --filter PATTERN Filtert die zu verarbeitenden Dateien in `check` und `fix`. Nur die Dateien, die dem angegebenen Muster entsprechen, werden verarbeitet. Diese Option kann mehrmals verwendet werden. Weitere Details zu Musterspezifikationen finden Sie im Abschnitt PATTERN. Unter Unix stellen Sie sicher, dass Globbing-Zeichen in AnfÃŧhrungszeichen gesetzt werden, wenn sie verwendet werden. Diese Option kann nur mit `check` und `fix` verwendet werden. Sie kann nicht mit `sync` und `scrub` verwendet werden, da diese immer das gesamte Array verarbeiten. -d, --filter-disk NAME Filtert die zu verarbeitenden Festplatten in `check`, `fix`, `up` und `down`. Sie mÃŧssen einen Festplattennamen angeben, wie in der Konfigurationsdatei definiert. Sie kÃļnnen auch Paritätsfestplatten mit den Namen `parity`, `2-parity`, `3-parity`, usw. angeben, um Vorgänge auf eine bestimmte Paritätsfestplatte zu beschränken. Wenn Sie mehrere --filter, --filter-disk und --filter-missing Optionen kombinieren, werden nur Dateien ausgewählt, die allen Filtern entsprechen. Diese Option kann mehrmals verwendet werden. Diese Option kann nur mit `check`, `fix`, `up` und `down` verwendet werden. Sie kann nicht mit `sync` und `scrub` verwendet werden, da diese immer das gesamte Array verarbeiten. -m, --filter-missing Filtert die zu verarbeitenden Dateien in `check` und `fix`. Nur die Dateien, die im Array fehlen oder gelÃļscht wurden, werden verarbeitet. Bei Verwendung mit `fix` fungiert dies als `undelete`-Befehl (Wiederherstellung von GelÃļschtem). Wenn Sie mehrere --filter, --filter-disk und --filter-missing Optionen kombinieren, werden nur Dateien ausgewählt, die allen Filtern entsprechen. Diese Option kann nur mit `check` und `fix` verwendet werden. Sie kann nicht mit `sync` und `scrub` verwendet werden, da diese immer das gesamte Array verarbeiten. -e, --filter-error Verarbeitet die Dateien mit Fehlern in `check` und `fix`. Es verarbeitet nur Dateien, deren BlÃļcke während `sync` und `scrub` als mit stillen oder Eingabe-/Ausgabefehlern markiert wurden, wie in `status` aufgelistet. Diese Option kann nur mit `check` und `fix` verwendet werden. -p, --plan PERC|bad|new|full Wählt den Scrub-Plan aus. Wenn PERC ein numerischer Wert von 0 bis 100 ist, wird er als Prozentsatz der zu scrubbenden BlÃļcke interpretiert. Anstelle eines Prozentsatzes kÃļnnen Sie einen Plan angeben: `bad` scrubbt fehlerhafte BlÃļcke, `new` scrubbt BlÃļcke, die noch nicht gescrubbed wurden, und `full` scrubbt alles. Diese Option kann nur mit `scrub` verwendet werden. -o, --older-than DAYS Wählt den ältesten Teil des Arrays aus, der in `scrub` verarbeitet werden soll. DAYS ist das Mindestalter in Tagen, damit ein Block gescrubbed werden kann; der Standardwert ist 10. BlÃļcke, die als fehlerhaft markiert sind, werden immer gescrubbed, unabhängig von dieser Option. Diese Option kann nur mit `scrub` verwendet werden. -a, --audit-only ÜberprÃŧft in `check` den Hash der Dateien, ohne die Paritätsdaten zu ÃŧberprÃŧfen. Wenn Sie nur an der ÜberprÃŧfung der Dateidaten interessiert sind, kann diese Option den ÜberprÃŧfungsprozess erheblich beschleunigen. Diese Option kann nur mit `check` verwendet werden. -h, --pre-hash FÃŧhrt in `sync` eine vorläufige Hash-Phase aller neuen Daten zur zusätzlichen ÜberprÃŧfung vor der Paritätsberechnung durch. Normalerweise wird in `sync` keine vorläufige Hash-Berechnung durchgefÃŧhrt, und die neuen Daten werden unmittelbar vor der Paritätsberechnung gehasht, wenn sie zum ersten Mal gelesen werden. Dieser Vorgang tritt auf, wenn das System unter starker Last steht, wobei alle Festplatten drehen und eine ausgelastete CPU vorliegt. Dies ist ein Extremzustand fÃŧr die Maschine, und wenn sie ein latentes Hardwareproblem hat, kÃļnnen stille Fehler unentdeckt bleiben, da die Daten noch nicht gehasht sind. Um dieses Risiko zu vermeiden, kÃļnnen Sie den `pre-hash`-Modus aktivieren, um alle Daten zweimal lesen zu lassen und so ihre Integrität sicherzustellen. Diese Option ÃŧberprÃŧft auch im Array verschobene Dateien, um sicherzustellen, dass die Verschiebeoperation erfolgreich war, und ermÃļglicht es Ihnen, bei Bedarf eine `fix`-Operation durchzufÃŧhren, bevor Sie fortfahren. Diese Option kann nur mit `sync` verwendet werden. -i, --import DIR Importiert aus dem angegebenen Verzeichnis alle Dateien, die nach dem letzten `sync` aus dem Array gelÃļscht wurden. Wenn Sie solche Dateien noch haben, kÃļnnen sie von `check` und `fix` verwendet werden, um den Wiederherstellungsprozess zu verbessern. Die Dateien werden gelesen, auch in Unterverzeichnissen, und unabhängig von ihrem Namen identifiziert. Diese Option kann nur mit `check` und `fix` verwendet werden. -s, --spin-down-on-error Dreht bei jedem Fehler alle verwalteten Festplatten herunter, bevor mit einem von Null verschiedenen Statuscode beendet wird. Dies verhindert, dass die Laufwerke nach einem abgebrochenen Vorgang aktiv bleiben und drehen, was unnÃļtige Hitzeentwicklung und Stromverbrauch vermeiden hilft. Verwenden Sie diese Option, um sicherzustellen, dass die Festplatten auch bei einem Befehlsfehler sicher gestoppt werden. -w, --bw-limit RATE Wendet eine globale Bandbreitenbegrenzung fÃŧr alle Festplatten an. RATE ist die Anzahl der Bytes pro Sekunde. Sie kÃļnnen einen Multiplikator wie K, M oder G angeben (z.B. --bw-limit 1G). -t, --tail GRÖSSE Beschränkt die Dateiliste auf diejenigen, die nicht mehr als die angegebene Tail-GrÃļße der Paritätsfestplatten belegen. Sie kÃļnnen Multiplikatoren wie K, M, G oder T verwenden (z. B. --tail 1G). Diese Option ist nur in Verbindung mit dem Befehl `locate` gÃŧltig. -A, --stats Aktiviert eine erweiterte Statusansicht, die zusätzliche Informationen anzeigt. Der Bildschirm zeigt zwei Diagramme an: Das erste Diagramm zeigt die Anzahl der gepufferten Stripes fÃŧr jede Festplatte sowie den Dateipfad der Datei, auf die derzeit auf dieser Festplatte zugegriffen wird. Typischerweise hat die langsamste Festplatte keinen verfÃŧgbaren Puffer, was die maximal erreichbare Bandbreite bestimmt. Das zweite Diagramm zeigt den Prozentsatz der Wartezeit Ãŧber die letzten 100 Sekunden. Es wird erwartet, dass die langsamste Festplatte die meiste Wartezeit verursacht, während andere Festplatten wenig oder keine Wartezeit haben sollten, da sie ihre gepufferten Stripes verwenden kÃļnnen. Dieses Diagramm zeigt auch die Zeit an, die mit Warten auf Hash-Berechnungen und RAID-Berechnungen verbracht wurde. Alle Berechnungen laufen parallel zu den Festplattenoperationen. Solange fÃŧr mindestens eine Festplatte eine messbare Wartezeit vorhanden ist, deutet dies daher darauf hin, dass die CPU schnell genug ist, um mit der Arbeitslast Schritt zu halten. -Z, --force-zero Erzwingt den unsicheren Vorgang der Synchronisierung einer Datei mit NullgrÃļße, die zuvor nicht Null war. Wenn SnapRAID eine solche Bedingung erkennt, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, leicht zu erkennen, wann nach einem Systemabsturz einige zugegriffene Dateien abgeschnitten (truncated) wurden. Dies ist eine mÃļgliche Bedingung unter Linux mit den ext3/ext4-Dateisystemen. Diese Option kann nur mit `sync` verwendet werden. -E, --force-empty Erzwingt den unsicheren Vorgang der Synchronisierung einer Festplatte, bei der alle ursprÃŧnglichen Dateien fehlen. Wenn SnapRAID erkennt, dass alle ursprÃŧnglich auf der Festplatte vorhandenen Dateien fehlen oder Ãŧberschrieben wurden, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, leicht zu erkennen, wann ein Daten-Dateisystem nicht gemountet (eingehängt) ist. Diese Option kann nur mit `sync` verwendet werden. -U, --force-uuid Erzwingt den unsicheren Vorgang der Synchronisierung, ÜberprÃŧfung und Behebung mit Festplatten, deren UUID geändert wurde. Wenn SnapRAID erkennt, dass einige Festplatten ihre UUID geändert haben, stoppt es den Vorgang, es sei denn, Sie geben diese Option an. Dies ermÃļglicht es Ihnen, zu erkennen, wann Ihre Festplatten an den falschen Einhängepunkten gemountet sind. Es ist jedoch erlaubt, eine einzelne UUID-Änderung mit einfacher Parität zu haben und mehr mit mehrfacher Parität, da dies der normale Fall beim Austausch von Festplatten nach einer Wiederherstellung ist. Diese Option kann nur mit `sync`, `check` oder `fix` verwendet werden. -D, --force-device Erzwingt den unsicheren Vorgang der Behebung mit unzugänglichen Festplatten oder mit Festplatten auf demselben physischen Gerät. Wenn Sie beispielsweise zwei Datenfestplatten verloren haben und eine Ersatzfestplatte haben, um nur die erste wiederherzustellen, kÃļnnen Sie die zweite unzugängliche Festplatte ignorieren. Oder wenn Sie eine Festplatte in dem auf einer bereits verwendeten Festplatte verbleibenden freien Speicherplatz wiederherstellen mÃļchten, wobei sie dasselbe physische Gerät gemeinsam nutzen. Diese Option kann nur mit `fix` verwendet werden. -N, --force-nocopy Deaktiviert in `sync`, `check` und `fix` die Kopiererkennungsheuristik. Ohne diese Option geht SnapRAID davon aus, dass Dateien mit den gleichen Attributen, wie Name, GrÃļße und Zeitstempel, Kopien mit denselben Daten sind. Dies ermÃļglicht die Identifizierung von kopierten oder von einer Festplatte auf eine andere verschobenen Dateien und die Wiederverwendung der bereits berechneten Hash-Informationen, um stille Fehler zu erkennen oder fehlende Dateien wiederherzustellen. In einigen seltenen Fällen kann dieses Verhalten zu falsch positiven Ergebnissen oder einem langsamen Vorgang aufgrund vieler Hash-ÜberprÃŧfungen fÃŧhren, und diese Option ermÃļglicht es Ihnen, solche Probleme zu beheben. Diese Option kann nur mit `sync`, `check` und `fix` verwendet werden. -F, --force-full Erzwingt in `sync` eine vollständige Neuberechnung der Parität. Diese Option kann verwendet werden, wenn Sie eine neue Paritätsstufe hinzufÃŧgen oder wenn Sie zu einer alten Content-Datei mit neueren Paritätsdaten zurÃŧckgekehrt sind. Anstatt die Parität von Grund auf neu zu erstellen, ermÃļglicht dies die Wiederverwendung der in der Content-Datei vorhandenen Hashes zur Validierung von Daten und zur Aufrechterhaltung des Datenschutzes während des `sync`-Vorgangs unter Verwendung der vorhandenen Paritätsdaten. Diese Option kann nur mit `sync` verwendet werden. -R, --force-realloc Erzwingt in `sync` eine vollständige Neuallokation von Dateien und eine Wiederherstellung der Parität. Diese Option kann verwendet werden, um alle Dateien vollständig neu zuzuweisen und die Fragmentierung zu entfernen, während die in der Content-Datei vorhandenen Hashes zur Validierung von Daten wiederverwendet werden. Diese Option kann nur mit `sync` verwendet werden. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, sie nicht zu verwenden. Sie haben während der `sync`-Operation KEINEN Datenschutz. -W, --force-realloc-tail GRÖSSE Funktioniert wie -R, --force-realloc, ist jedoch auf den angegebenen Endbereich (die letzten GRÖSSE Bytes) jeder Paritätsdatei beschränkt. Erzwingt die Neuzuweisung (Verschiebung) aller Dateifragmente/-blÃļcke, die derzeit in diesem Endabschnitt gespeichert sind, sodass sie an beliebiger Stelle in den Paritätsdateien platziert werden kÃļnnen, wo freier Speicherplatz verfÃŧgbar ist (einschließlich vorhandener LÃŧcken). Der Hauptzweck dieser Option besteht darin, die GrÃļße der Paritätsdatei auf der Festplatte zu verringern. Wenn die Neuzuweisung den gesamten Endabschnitt erfolgreich leert (keine BlÃļcke verbleiben dort), wird die Paritätsdatei gekÃŧrzt, wodurch der ungenutzte Endbereich freigegeben wird. Sie kÃļnnen Multiplikatoren wie K, M, G oder T verwenden (z. B. --force-realloc-tail 1G). Sie kÃļnnen locate -t, --tail verwenden, um die betroffenen Dateien im Voraus zu ermitteln. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht und es wird dringend empfohlen, sie nicht zu verwenden. Während des `sync`-Vorgangs besteht fÃŧr die betroffenen Dateien KEIN Datenschutz. -l, --log FILE Schreibt ein detailliertes Protokoll in die angegebene Datei. Wenn diese Option nicht angegeben ist, werden unerwartete Fehler auf dem Bildschirm ausgegeben, was bei vielen Fehlern mÃļglicherweise zu einer Ãŧbermäßigen Ausgabe fÃŧhrt. Wenn -l, --log angegeben ist, werden nur schwerwiegende Fehler, die SnapRAID zum Stoppen bringen, auf dem Bildschirm ausgegeben. Wenn der Pfad mit `>>` beginnt, wird die Datei im Anhängemodus (append mode) geÃļffnet. Vorkommen von `%D` und `%T` im Namen werden durch Datum und Uhrzeit im Format YYYYMMDD bzw. HHMMSS ersetzt. In Windows-Batch-Dateien mÃŧssen Sie das `%`-Zeichen verdoppeln, z.B. result-%%D.log. Um `>>` zu verwenden, mÃŧssen Sie den Namen in AnfÃŧhrungszeichen setzen, z.B. `">>result.log"`. Um das Protokoll an die Standardausgabe oder den Standardfehler auszugeben, kÃļnnen Sie `">&1"` bzw. `">&2"` verwenden. Beschreibungen der Protokoll-Tags finden Sie in der Datei snapraid_log.txt oder in der Manpage. -L, --error-limit NUMBER Legt ein neues Fehlerlimit fest, bevor die AusfÃŧhrung gestoppt wird. Standardmäßig stoppt SnapRAID, wenn es mehr als 100 Eingabe-/Ausgabefehler feststellt, was darauf hindeutet, dass eine Festplatte wahrscheinlich ausfällt. Diese Option wirkt sich auf `sync` und `scrub` aus, denen es gestattet ist, nach dem ersten Satz von Festplattenfehlern fortzufahren, um ihre Vorgänge abzuschließen. `check` und `fix` stoppen jedoch immer beim ersten Fehler. -S, --start BLKSTART Startet die Verarbeitung ab der angegebenen Blocknummer. Dies kann nÃŧtzlich sein, um die ÜberprÃŧfung oder Behebung spezifischer BlÃļcke im Falle einer beschädigten Festplatte zu wiederholen. Diese Option ist hauptsächlich fÃŧr die erweiterte manuelle Wiederherstellung gedacht. -B, --count BLKCOUNT Verarbeitet nur die angegebene Anzahl von BlÃļcken. Diese Option ist hauptsächlich fÃŧr die erweiterte manuelle Wiederherstellung gedacht. -C, --gen-conf CONTENT Generiert eine Dummy-Konfigurationsdatei aus einer vorhandenen Content-Datei. Die Konfigurationsdatei wird in die Standardausgabe geschrieben und Ãŧberschreibt keine vorhandene. Diese Konfigurationsdatei enthält auch die Informationen, die zur Rekonstruktion der Festplatten-Einhängepunkte erforderlich sind, falls Sie das gesamte System verlieren. -v, --verbose Gibt mehr Informationen auf dem Bildschirm aus. Wenn einmal angegeben, werden ausgeschlossene Dateien und zusätzliche Statistiken gedruckt. Diese Option hat keine Auswirkung auf die Protokolldateien. -q, --quiet Gibt weniger Informationen auf dem Bildschirm aus. Wenn einmal angegeben, wird die Fortschrittsleiste entfernt; zweimal, die laufenden Operationen; dreimal, die Info-Meldungen; viermal, die Statusmeldungen. Schwerwiegende Fehler werden immer auf dem Bildschirm ausgegeben. Diese Option hat keine Auswirkung auf die Protokolldateien. -H, --help Gibt eine kurze Hilfeanzeige aus. -V, --version Gibt die Programmversion aus. 7 CONFIGURATION =============== SnapRAID benÃļtigt eine Konfigurationsdatei, um zu wissen, wo sich Ihr Festplatten-Array befindet und wo die Paritätsinformationen gespeichert werden sollen. Unter Unix wird die Datei `/usr/local/etc/snapraid.conf` verwendet, falls sie existiert, andernfalls `/etc/snapraid.conf`. Unter Windows wird die Datei `snapraid.conf` im selben Verzeichnis wie `snapraid.exe` verwendet. Sie muss die folgenden Optionen (Groß- und Kleinschreibung beachten) enthalten: 7.1 parity FILE [,FILE] ... --------------------------- Definiert die Dateien, die zum Speichern der Paritätsinformationen verwendet werden sollen. Die Parität ermÃļglicht den Schutz vor einem einzelnen Festplattenausfall, ähnlich wie bei RAID5. Sie kÃļnnen mehrere Dateien angeben, die sich auf unterschiedlichen Festplatten befinden mÃŧssen. Wenn eine Datei nicht mehr wachsen kann, wird die nächste verwendet. Der gesamte verfÃŧgbare Platz muss mindestens so groß sein wie die grÃļßte Datenfestplatte im Array. Sie kÃļnnen später zusätzliche Paritätsdateien hinzufÃŧgen, aber Sie kÃļnnen sie nicht neu anordnen oder entfernen. Das Reservieren der Paritätsfestplatten fÃŧr Parität stellt sicher, dass sie nicht fragmentiert werden, was die Leistung verbessert. Unter Windows werden 256 MB auf jeder Festplatte ungenutzt gelassen, um die Warnung vor vollen Festplatten zu vermeiden. Diese Option ist obligatorisch und kann nur einmal verwendet werden. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- Definiert die Dateien, die zum Speichern zusätzlicher Paritätsinformationen verwendet werden sollen. FÃŧr jede angegebene Paritätsstufe wird eine zusätzliche Schutzstufe aktiviert: * 2-parity aktiviert RAID6 Dual-Parität. * 3-parity aktiviert Triple-Parität. * 4-parity aktiviert Quad- (vierfache) Parität. * 5-parity aktiviert Penta- (fÃŧnffache) Parität. * 6-parity aktiviert Hexa- (sechsfache) Parität. Jede Paritätsstufe erfordert die Anwesenheit aller vorherigen Paritätsstufen. Die gleichen Überlegungen wie bei der Option `parity` gelten. Diese Optionen sind optional und kÃļnnen nur einmal verwendet werden. 7.3 z-parity FILE [,FILE] ... ----------------------------- Definiert eine alternative Datei und ein alternatives Format zum Speichern von Triple-Parität. Diese Option ist eine Alternative zu `3-parity`, die primär fÃŧr Low-End-CPUs wie ARM oder AMD Phenom, Athlon und Opteron gedacht ist, die den SSSE3-Befehlssatz nicht unterstÃŧtzen. In solchen Fällen bietet sie eine bessere Leistung. Dieses Format ähnelt dem von ZFS RAIDZ3, ist aber schneller. Wie ZFS funktioniert es nicht jenseits der Triple-Parität. Bei Verwendung von `3-parity` werden Sie gewarnt, wenn das `z-parity`-Format zur Leistungsverbesserung empfohlen wird. Es ist mÃļglich, von einem Format in ein anderes zu konvertieren, indem die Konfigurationsdatei mit der gewÃŧnschten z-parity- oder 3-parity-Datei angepasst und `fix` zur Neuerstellung verwendet wird. 7.4 content FILE ---------------- Definiert die Datei, die zum Speichern der Liste und PrÃŧfsummen aller im Festplatten-Array vorhandenen Dateien verwendet werden soll. Sie kann auf einer fÃŧr Daten, Parität oder einer anderen verfÃŧgbaren Festplatte platziert werden. Wenn Sie eine Datenfestplatte verwenden, wird diese Datei automatisch vom `sync`-Vorgang ausgeschlossen. Diese Option ist obligatorisch und kann mehrmals verwendet werden, um mehrere Kopien derselben Datei zu speichern. Sie mÃŧssen mindestens eine Kopie fÃŧr jede verwendete Paritätsfestplatte plus eine speichern. Die Verwendung zusätzlicher Kopien schadet nicht. 7.5 data NAME DIR ----------------- Definiert den Namen und den Einhängepunkt (Mount Point) der Datenfestplatten im Array. NAME wird zur Identifizierung der Festplatte verwendet und muss eindeutig sein. DIR ist der Einhängepunkt der Festplatte im Dateisystem. Sie kÃļnnen den Einhängepunkt nach Bedarf ändern, solange Sie den NAME unverändert lassen. Sie sollten eine Option fÃŧr jede Datenfestplatte im Array verwenden. Sie kÃļnnen eine Festplatte später umbenennen, indem Sie den NAME direkt in der Konfigurationsdatei ändern und dann einen `sync`-Befehl ausfÃŧhren. Im Falle einer Umbenennung erfolgt die Zuordnung mithilfe der gespeicherten UUID der Festplatten. 7.6 extra NAME DIR ------------------ Definiert den Namen und Einhängepunkt zusätzlicher Festplatten, die mit den Befehlen `smart` und `probe` Ãŧberwacht werden sollen. Dies ist nÃŧtzlich fÃŧr die Überwachung von Festplatten, die nicht Teil des Arrays sind, aber fÃŧr das Funktionieren des Systems erforderlich sind, wie z. B. die Boot-Festplatte. Beachten Sie, dass solche Festplatten nicht von den Befehlen `up` und `down` betroffen sind, da von ihnen erwartet wird, dass sie sich immer drehen. 7.7 nohidden ------------ Schließt alle versteckten Dateien und Verzeichnisse aus. Unter Unix sind versteckte Dateien solche, die mit `.` beginnen. Unter Windows sind es solche mit dem versteckten Attribut. 7.8 exclude/include PATTERN --------------------------- Definiert die Datei- oder Verzeichnismuster, die im `sync`-Vorgang ausgeschlossen oder eingeschlossen werden sollen. Alle Muster werden in der angegebenen Reihenfolge verarbeitet. Wenn das erste Ãŧbereinstimmende Muster ein `exclude`-Muster ist, wird die Datei ausgeschlossen. Wenn es ein `include`-Muster ist, wird die Datei eingeschlossen. Wenn kein Muster Ãŧbereinstimmt, wird die Datei ausgeschlossen, wenn das zuletzt angegebene Muster ein `include` ist, oder eingeschlossen, wenn das zuletzt angegebene Muster ein `exclude` ist. Weitere Details zu Musterspezifikationen finden Sie im Abschnitt PATTERN. Diese Option kann mehrmals verwendet werden. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- Definiert die grundlegende BlockgrÃļße in Kibibytes fÃŧr die Parität. Ein Kibibyte entspricht 1024 Bytes. Die Standard-BlockgrÃļße ist 256, was fÃŧr die meisten Fälle ausreichen sollte. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert zukÃŧnftig zu ändern, mÃŧssen Sie die gesamte Parität neu erstellen! Ein Grund fÃŧr die Verwendung einer anderen BlockgrÃļße ist, wenn Sie viele kleine Dateien in der GrÃļßenordnung von Millionen haben. FÃŧr jede Datei, auch wenn sie nur wenige Bytes groß ist, wird ein ganzer Block Parität zugewiesen, und bei vielen Dateien kann dies zu erheblichem ungenutztem Paritätsplatz fÃŧhren. Wenn Sie die Paritätsfestplatte vollständig fÃŧllen, dÃŧrfen Sie keine weiteren Dateien zu den Datenfestplatten hinzufÃŧgen. Der verschwendete Paritätsplatz akkumuliert sich jedoch nicht Ãŧber die Datenfestplatten hinweg. Verschwendeter Platz, der durch eine hohe Anzahl von Dateien auf einer Datenfestplatte entsteht, begrenzt nur die Datenmenge auf dieser Datenfestplatte, nicht auf anderen. Als Annäherung kÃļnnen Sie davon ausgehen, dass die Hälfte der BlockgrÃļße fÃŧr jede Datei verschwendet wird. Mit beispielsweise 100.000 Dateien und einer BlockgrÃļße von 256 KiB verschwenden Sie 12,8 GB Parität, was zu 12,8 GB weniger verfÃŧgbarem Speicherplatz auf der Datenfestplatte fÃŧhren kann. Sie kÃļnnen die Menge des verschwendeten Platzes auf jeder Festplatte mithilfe von `status` ÃŧberprÃŧfen. Dies ist die Menge an Platz, die Sie auf den Datenfestplatten freilassen oder fÃŧr Dateien verwenden mÃŧssen, die nicht im Array enthalten sind. Wenn dieser Wert negativ ist, bedeutet dies, dass Sie kurz davor sind, die Parität zu fÃŧllen, und er stellt den Platz dar, den Sie noch verschwenden kÃļnnen. Um dieses Problem zu vermeiden, kÃļnnen Sie eine grÃļßere Partition fÃŧr die Parität verwenden. Wenn die Paritätspartition beispielsweise 12,8 GB grÃļßer ist als die Datenfestplatten, haben Sie genÃŧgend zusätzlichen Platz, um bis zu 100.000 Dateien auf jeder Datenfestplatte ohne verschwendeten Platz zu verarbeiten. Ein Trick, um eine grÃļßere Paritätspartition unter Linux zu erhalten, ist die Formatierung mit dem Befehl: mkfs.ext4 -m 0 -T largefile4 DEVICE Dies fÃŧhrt zu etwa 1,5% zusätzlichem Speicherplatz, ungefähr 60 GB fÃŧr eine 4 TB Festplatte, was etwa 460.000 Dateien auf jeder Datenfestplatte ohne verschwendeten Platz ermÃļglicht. 7.10 hashsize SIZE_IN_BYTES --------------------------- Definiert die Hash-GrÃļße in Bytes fÃŧr die gespeicherten BlÃļcke. Die Standard-Hash-GrÃļße beträgt 16 Bytes (128 Bit), was fÃŧr die meisten Fälle ausreichen sollte. WARNUNG! Diese Option ist nur fÃŧr Experten gedacht, und es wird dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert zukÃŧnftig zu ändern, mÃŧssen Sie die gesamte Parität neu erstellen! Ein Grund fÃŧr die Verwendung einer anderen Hash-GrÃļße ist, wenn Ihr System Ãŧber begrenzten Speicher verfÃŧgt. Als Faustregel benÃļtigt SnapRAID typischerweise 1 GiB RAM fÃŧr jede 16 TB Daten im Array. Genauer gesagt benÃļtigt SnapRAID zum Speichern der Hashes der Daten ungefähr TS*(1+HS)/BS Bytes RAM, wobei TS die GesamtgrÃļße in Bytes Ihres Festplatten-Arrays ist, BS die BlockgrÃļße in Bytes und HS die Hash-GrÃļße in Bytes. Mit beispielsweise 8 Festplatten à 4 TB, einer BlockgrÃļße von 256 KiB (1 KiB = 1024 Bytes) und einer Hash-GrÃļße von 16 erhalten Sie: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Bei einem Wechsel zu einer Hash-GrÃļße von 8 erhalten Sie: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Bei einem Wechsel zu einer BlockgrÃļße von 512 erhalten Sie: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Bei einem Wechsel zu einer Hash-GrÃļße von 8 und einer BlockgrÃļße von 512 erhalten Sie: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- Speichert den Zustand beim Synchronisieren oder Scrubben automatisch nach der angegebenen Menge an verarbeiteten GB. Diese Option ist nÃŧtzlich, um zu vermeiden, dass lange `sync`-Befehle von vorne gestartet werden mÃŧssen, wenn sie durch einen Maschinenabsturz oder ein anderes Ereignis unterbrochen werden. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Legt die maximal zulässige Festplattentemperatur in Celsius fest. Wenn angegeben, ÃŧberprÃŧft SnapRAID regelmäßig die Temperatur aller Festplatten mithilfe des smartctl-Tools. Die aktuellen Festplattentemperaturen werden während des Betriebs von SnapRAID angezeigt. Wenn eine Festplatte diesen Grenzwert Ãŧberschreitet, werden alle Vorgänge gestoppt, und die Festplatten werden fÃŧr die durch die Option `temp_sleep` definierte Dauer heruntergefahren (in den Standby-Modus versetzt). Nach der Schlafperiode werden die Vorgänge fortgesetzt und mÃļglicherweise erneut pausiert, wenn der Temperaturgrenzwert erneut erreicht wird. Während des Betriebs analysiert SnapRAID auch die Heizkurve jeder Festplatte und schätzt die langfristige stationäre Temperatur, die erwartet wird, wenn die Aktivität fortgesetzt wird. Die Schätzung wird nur durchgefÃŧhrt, nachdem die Festplattentemperatur viermal angestiegen ist, um sicherzustellen, dass genÃŧgend Datenpunkte zur VerfÃŧgung stehen, um einen zuverlässigen Trend festzustellen. Diese vorhergesagte stationäre Temperatur wird in Klammern neben dem aktuellen Wert angezeigt und hilft bei der Beurteilung, ob die KÃŧhlung des Systems ausreichend ist. Diese geschätzte Temperatur dient nur zu Informationszwecken und hat keine Auswirkung auf das Verhalten von SnapRAID. Die Aktionen des Programms basieren ausschließlich auf den tatsächlich gemessenen Festplattentemperaturen. Um diese Analyse durchzufÃŧhren, benÃļtigt SnapRAID eine Referenz fÃŧr die Systemtemperatur. Es versucht zunächst, diese von verfÃŧgbaren Hardwaresensoren zu lesen. Wenn kein Systemsensor zugänglich ist, wird die niedrigste zu Beginn des Laufs gemessene Festplattentemperatur als Fallback-Referenz verwendet. Normalerweise zeigt SnapRAID nur die Temperatur der heißesten Festplatte an. Um die Temperatur aller Festplatten anzuzeigen, verwenden Sie die Option -A oder --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Legt die Standby-Zeit in Minuten fest, wenn der Temperaturgrenzwert erreicht wird. Während dieser Zeit bleiben die Festplatten heruntergefahren. Der Standardwert ist 5 Minuten. 7.14 pool DIR ------------- Definiert das Pooling-Verzeichnis, in dem die virtuelle Ansicht des Festplatten-Arrays mithilfe des Befehls `pool` erstellt wird. Das Verzeichnis muss bereits existieren. 7.15 share UNC_DIR ------------------ Definiert den Windows UNC-Pfad, der fÃŧr den Remote-Zugriff auf die Festplatten erforderlich ist. Wenn diese Option angegeben ist, verwenden die im Pool-Verzeichnis erstellten symbolischen Links diesen UNC-Pfad, um auf die Festplatten zuzugreifen. Ohne diese Option verwenden die generierten symbolischen Links nur lokale Pfade, was die Freigabe des Pool-Verzeichnisses Ãŧber das Netzwerk nicht ermÃļglicht. Die symbolischen Links werden unter Verwendung des angegebenen UNC-Pfads gebildet, wobei der in der `data`-Option angegebene Festplattenname und schließlich das Dateiverzeichnis und der Name hinzugefÃŧgt werden. Diese Option ist nur fÃŧr Windows erforderlich. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ Definiert benutzerdefinierte smartctl-Optionen, um die SMART-Attribute fÃŧr jede Festplatte abzurufen. Dies kann fÃŧr RAID-Controller und einige USB-Festplatten erforderlich sein, die nicht automatisch erkannt werden kÃļnnen. Der Platzhalter %s wird durch den Gerätenamen ersetzt, ist aber fÃŧr feste Geräte wie RAID-Controller optional. DISK ist derselbe Festplattenname, der in der `data`-Option angegeben ist. PARITY ist einer der Paritätsnamen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` oder `z-parity`. In den angegebenen OPTIONS wird die Zeichenfolge `%s` durch den Gerätenamen ersetzt. Bei RAID-Controllern ist das Gerät wahrscheinlich fest, und Sie mÃŧssen `%s` mÃļglicherweise nicht verwenden. Weitere mÃļgliche Optionen finden Sie in der smartmontools-Dokumentation: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices Zum Beispiel: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignoriert das angegebene SMART-Attribut bei der Berechnung der Wahrscheinlichkeit eines Festplattenausfalls. Diese Option ist nÃŧtzlich, wenn eine Festplatte ungewÃļhnliche oder irrefÃŧhrende Werte fÃŧr ein bestimmtes Attribut meldet. DISK ist derselbe Festplattenname, der in der `data`-Option angegeben ist. PARITY ist einer der Paritätsnamen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` oder `z-parity`. Der Sonderwert * kann verwendet werden, um das Attribut auf allen Festplatten zu ignorieren. Um beispielsweise das Attribut `Current Pending Sector Count` auf allen Festplatten zu ignorieren: smartignore * 197 Um es nur auf der ersten Paritätsfestplatte zu ignorieren: smartignore parity 197 7.18 Examples ------------- Ein Beispiel fÃŧr eine typische Konfiguration fÃŧr Unix ist: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Ein Beispiel fÃŧr eine typische Konfiguration fÃŧr Windows ist: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= Muster bieten eine flexible MÃļglichkeit, Dateien fÃŧr die Einbeziehung oder den Ausschluss zu filtern. Durch die Verwendung von Globbing-Zeichen kÃļnnen Sie Regeln definieren, die mit bestimmten Dateinamen oder ganzen Verzeichnisstrukturen Ãŧbereinstimmen, ohne jeden Pfad manuell auflisten zu mÃŧssen. Das Fragezeichen `?` entspricht einem beliebigen einzelnen Zeichen außer dem Verzeichnistrennzeichen. Dies macht es nÃŧtzlich fÃŧr den Abgleich von Dateinamen mit variablen Zeichen, während das Muster auf eine einzelne Verzeichnisebene beschränkt bleibt. Der einfache Stern `*` entspricht einer beliebigen Folge von Zeichen, aber wie das Fragezeichen Ãŧberschreitet er niemals Verzeichnisgrenzen. Er stoppt beim Schrägstrich, was ihn fÃŧr den Abgleich innerhalb einer einzelnen Pfadkomponente geeignet macht. Dies ist das Standardverhalten von Wildcards, das vom Shell- Globbing bekannt ist. Der Doppelstern `**` ist mächtiger; er entspricht jeder Folge von Zeichen einschließlich Verzeichnistrennzeichen. Dies ermÃļglicht es Mustern, Ãŧber mehrere Verzeichnisebenen hinweg Ãŧbereinzustimmen. Wenn `**` direkt in ein Muster eingebettet ist, kann es null oder mehr Zeichen einschließlich Schrägstrichen zwischen dem umgebenden wÃļrtlichen Text entsprechen. Die wichtigste Verwendung von `**` ist in der speziellen Form `/**/`. Dies entspricht null oder mehr vollständigen Verzeichnisebenen, was es mÃļglich macht, Dateien in jeder Tiefe eines Verzeichnisbaums abzugleichen, ohne die genaue Pfadstruktur zu kennen. Zum Beispiel entspricht das Muster `src/**/main.js` dem Pfad `src/main.js` (Überspringen von null Verzeichnissen), `src/ui/main.js` (Überspringen eines Verzeichnisses) und `src/ui/components/main.js` (Überspringen von zwei Verzeichnissen). Zeichenklassen mit eckigen Klammern `[]` entsprechen einem einzelnen Zeichen aus einer bestimmten Menge oder einem Bereich. Wie die anderen Einzelzeichenmuster entsprechen sie nicht den Verzeichnistrennzeichen. Klassen unterstÃŧtzen Bereiche und Negierung durch ein Ausrufezeichen. Der grundlegende Unterschied, den man sich merken sollte, ist, dass `*`, `?` und Zeichenklassen alle Verzeichnisgrenzen respektieren und nur innerhalb einer einzelnen Pfadkomponente Ãŧbereinstimmen, während `**` das einzige Muster ist, das Ãŧber Verzeichnistrennzeichen hinweg Ãŧbereinstimmen kann. Es gibt vier verschiedene Arten von Mustern: FILE Wählt jede Datei mit dem Namen FILE aus. Dieses Muster gilt nur fÃŧr Dateien, nicht fÃŧr Verzeichnisse. DIR/ Wählt jedes Verzeichnis mit dem Namen DIR und alles darin aus. Dieses Muster gilt nur fÃŧr Verzeichnisse, nicht fÃŧr Dateien. /PATH/FILE Wählt den exakt angegebenen Dateipfad aus. Dieses Muster gilt nur fÃŧr Dateien, nicht fÃŧr Verzeichnisse. /PATH/DIR/ Wählt den exakt angegebenen Verzeichnispfad und alles darin aus. Dieses Muster gilt nur fÃŧr Verzeichnisse, nicht fÃŧr Dateien. Wenn Sie einen absoluten Pfad angeben, der mit / beginnt, wird er auf das Array-Stammverzeichnis angewendet, nicht auf das lokale Dateisystem-Stammverzeichnis. Unter Windows kÃļnnen Sie den Backslash \ anstelle des Forward-Slash / verwenden. Windows-Systemverzeichnisse, Junctions, Einhängepunkte (Mount Points) und andere spezielle Windows-Verzeichnisse werden als Dateien behandelt, was bedeutet, dass Sie zum Ausschließen eine Dateiregel verwenden mÃŧssen, nicht eine Verzeichnisregel. Wenn der Dateiname ein Zeichen `*`, `?`, `[`, oder `]` enthält, mÃŧssen Sie es escapen, um zu vermeiden, dass es als Globbing-Zeichen interpretiert wird. Unter Unix ist das Escape-Zeichen `\`; unter Windows ist es `^`. Wenn sich das Muster in der Befehlszeile befindet, mÃŧssen Sie das Escape-Zeichen verdoppeln, um zu vermeiden, dass es von der Befehlsshell interpretiert wird. In der Konfigurationsdatei kÃļnnen Sie verschiedene Strategien zum Filtern der zu verarbeitenden Dateien verwenden. Der einfachste Ansatz besteht darin, nur `exclude`-Regeln zu verwenden, um alle Dateien und Verzeichnisse zu entfernen, die Sie nicht verarbeiten mÃļchten. Zum Beispiel: # Schließt jede Datei namens `*.unrecoverable` aus exclude *.unrecoverable # Schließt das Stammverzeichnis `/lost+found` aus exclude /lost+found/ # Schließt jedes Unterverzeichnis namens `tmp` aus exclude tmp/ Der gegenteilige Ansatz besteht darin, nur die Dateien zu definieren, die Sie verarbeiten mÃļchten, indem Sie nur `include`-Regeln verwenden. Zum Beispiel: # Schließt nur einige Verzeichnisse ein include /movies/ include /musics/ include /pictures/ Der letzte Ansatz besteht darin, `exclude`- und `include`-Regeln zu mischen. In diesem Fall ist die Reihenfolge der Regeln wichtig. FrÃŧhere Regeln haben Vorrang vor späteren. Zur Vereinfachung kÃļnnen Sie zuerst alle `exclude`-Regeln und dann alle `include`-Regeln auflisten. Zum Beispiel: # Schließt jede Datei namens `*.unrecoverable` aus exclude *.unrecoverable # Schließt jedes Unterverzeichnis namens `tmp` aus exclude tmp/ # Schließt nur einige Verzeichnisse ein include /movies/ include /musics/ include /pictures/ In der Befehlszeile kÃļnnen Sie mit der Option -f nur `include`-Muster verwenden. Zum Beispiel: # ÜberprÃŧft nur die .mp3-Dateien. # Unter Unix AnfÃŧhrungszeichen verwenden, um die Globbing-Erweiterung durch die Shell zu vermeiden. snapraid -f "*.mp3" check Unter Unix mÃŧssen Sie Globbing-Zeichen in der Befehlszeile in AnfÃŧhrungszeichen setzen, um zu verhindern, dass die Shell sie erweitert. 9 DATEIEN IGNORIEREN ==================== Zusätzlich zu den globalen Regeln in der Konfigurationsdatei kÃļnnen Sie `.snapraidignore`-Dateien in jedem Verzeichnis innerhalb des Arrays platzieren, um dezentrale Ausschlussregeln zu definieren. Regeln, die in `.snapraidignore` definiert sind, werden nach den Regeln in der Konfigurationsdatei angewendet. Dies bedeutet, dass sie eine hÃļhere Priorität haben und verwendet werden kÃļnnen, um Dateien auszuschließen, die zuvor durch die globale Konfiguration eingeschlossen wurden. Effektiv wird eine Datei ausgeschlossen, wenn eine lokale Regel zutrifft, unabhängig von den globalen Include-Einstellungen. Die Musterlogik in `.snapraidignore` spiegelt die globale Konfiguration wider, verankert die Muster jedoch an dem Verzeichnis, in dem sich die Datei befindet: FILE Wählt jede Datei namens FILE in diesem Verzeichnis oder darunter aus. Dies folgt denselben Globbing-Regeln wie das globale Muster. DIR/ Wählt jedes Verzeichnis namens DIR und alles darin aus, das sich in diesem Verzeichnis oder darunter befindet. /PATH/FILE Wählt die exakt angegebene Datei relativ zum Speicherort der `.snapraidignore`-Datei aus. /PATH/DIR/ Wählt das exakt angegebene Verzeichnis und alles darin aus, relativ zum Speicherort der `.snapraidignore`-Datei. Im Gegensatz zur globalen Konfiguration unterstÃŧtzen `.snapraidignore`-Dateien nur Ausschlussregeln; Sie kÃļnnen keine `include`-Muster oder Negationen (!) verwenden. Wenn Sie beispielsweise eine `.snapraidignore` in `/mnt/disk1/projects/` haben: # Schließt NUR /mnt/disk1/projects/output.bin aus /output.bin # Schließt jedes Verzeichnis namens `build` innerhalb von projects/ aus build/ # Schließt jede .tmp-Datei innerhalb von projects/ oder deren Unterordnern aus *.tmp 10 CONTENT ========== SnapRAID speichert die Liste und PrÃŧfsummen Ihrer Dateien in der Content-Datei. Es ist eine Binärdatei, die alle im Festplatten-Array vorhandenen Dateien auflistet, zusammen mit allen PrÃŧfsummen zur ÜberprÃŧfung ihrer Integrität. Diese Datei wird von den Befehlen `sync` und `scrub` gelesen und geschrieben und von den Befehlen `fix`, `check` und `status` gelesen. 11 PARITY ========= SnapRAID speichert die Paritätsinformationen Ihres Arrays in den Paritätsdateien. Dies sind Binärdateien, die die berechnete Parität aller in der `content`-Datei definierten BlÃļcke enthalten. Diese Dateien werden von den Befehlen `sync` und `fix` gelesen und geschrieben und nur von den Befehlen `scrub` und `check` gelesen. 12 ENCODING =========== SnapRAID ignoriert unter Unix jede Kodierung. Es liest und speichert die Dateinamen mit derselben Kodierung, die vom Dateisystem verwendet wird. Unter Windows werden alle vom Dateisystem gelesenen Namen konvertiert und im UTF-8-Format verarbeitet. Um Dateinamen korrekt auszugeben, mÃŧssen Sie die Windows-Konsole mit dem Befehl `chcp 65001` auf den UTF-8-Modus einstellen und eine TrueType-Schriftart wie `Lucida Console` als Konsolenschriftart verwenden. Dies betrifft nur die gedruckten Dateinamen; wenn Sie die Konsolenausgabe in eine Datei umleiten, ist die resultierende Datei immer im UTF-8-Format. 13 COPYRIGHT ============ Diese Datei ist Copyright (C) 2025 Andrea Mazzoleni 14 SEE ALSO =========== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-es.1000066400000000000000000002123501522717156100163170ustar00rootroot00000000000000.TH "SnapRAID Backup para Arrays de Discos" 1 .SH NAME snapraid \- SnapRAID Backup para Arrays de Discos .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAID es un programa de copia de seguridad diseÃąado para arrays de discos, que almacena informaciÃŗn de paridad para la recuperaciÃŗn de datos en caso de hasta seis fallos de disco. .PP Destinado principalmente a centros de medios domÊsticos con archivos grandes y que cambian con poca frecuencia, SnapRAID ofrece varias características: .PD 0 .IP \(bu Puede utilizar discos ya llenos de archivos sin la necesidad de reformatearlos, accediendo a ellos como de costumbre. .IP \(bu Todos sus datos son hasheados para asegurar la integridad de los datos y prevenir la corrupciÃŗn silenciosa. .IP \(bu Cuando el nÃēmero de discos fallidos excede el recuento de paridad, la pÊrdida de datos se limita a los discos afectados; los datos en otros discos siguen siendo accesibles. .IP \(bu Si elimina archivos accidentalmente en un disco, la recuperaciÃŗn es posible. .IP \(bu Los discos pueden tener diferentes tamaÃąos. .IP \(bu Puede agregar discos en cualquier momento. .IP \(bu SnapRAID no bloquea sus datos; puede dejar de usarlo en cualquier momento sin reformatear ni mover datos. .IP \(bu Para acceder a un archivo, solo un Ãēnico disco necesita girar, ahorrando energía y reduciendo el ruido. .PD .PP Para mÃĄs informaciÃŗn, visite el sitio oficial de SnapRAID: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID es un híbrido entre un programa RAID y un programa de copia de seguridad, con el objetivo de combinar los mejores beneficios de ambos. Sin embargo, tiene algunas limitaciones que debe considerar antes de usarlo. .PP La principal limitaciÃŗn es que si un disco falla y no ha sincronizado recientemente, es posible que no pueda recuperarse por completo. MÃĄs específicamente, es posible que no pueda recuperar hasta el tamaÃąo de los archivos cambiados o eliminados desde la Ãēltima operaciÃŗn de sincronizaciÃŗn. Esto ocurre incluso si los archivos cambiados o eliminados no estÃĄn en el disco fallido. Esta es la razÃŗn por la que SnapRAID es mÃĄs adecuado para datos que rara vez cambian. .PP Por otro lado, los archivos reciÊn agregados no impiden la recuperaciÃŗn de los archivos ya existentes. Solo perderÃĄ los archivos reciÊn agregados si estÃĄn en el disco fallido. .PP Otras limitaciones de SnapRAID son: .PD 0 .IP \(bu Con SnapRAID, aÃēn tiene sistemas de archivos separados para cada disco. Con RAID, obtiene un Ãēnico sistema de archivos grande. .IP \(bu SnapRAID no distribuye (stripe) los datos. Con RAID, obtiene un aumento de velocidad con la distribuciÃŗn. .IP \(bu SnapRAID no admite la recuperaciÃŗn en tiempo real. Con RAID, no tiene que dejar de trabajar cuando falla un disco. .IP \(bu SnapRAID puede recuperar datos solo de un nÃēmero limitado de fallos de disco. Con una copia de seguridad, puede recuperarse de un fallo completo de todo el array de discos. .IP \(bu Solo se guardan nombres de archivo, marcas de tiempo, enlaces simbÃŗlicos y enlaces duros. Los permisos, la propiedad y los atributos extendidos no se guardan. .PD .SH GETTING STARTED Para usar SnapRAID, primero debe seleccionar un disco en su array de discos para dedicarlo a la informaciÃŗn de \`parity\` (paridad). Con un disco para paridad, podrÃĄ recuperarse de un solo fallo de disco, similar a RAID5. .PP Si desea recuperarse de mÃĄs fallos de disco, similar a RAID6, debe reservar discos adicionales para la paridad. Cada disco de paridad adicional permite la recuperaciÃŗn de un fallo de disco mÃĄs. .PP Como discos de paridad, debe elegir los discos mÃĄs grandes del array, ya que la informaciÃŗn de paridad puede crecer hasta el tamaÃąo del disco de datos mÃĄs grande del array. .PP Estos discos estarÃĄn dedicados a almacenar los archivos de \`parity\`. No debe almacenar sus datos en ellos. .PP Luego, debe definir los discos de \`data\` (datos) que desea proteger con SnapRAID. La protecciÃŗn es mÃĄs efectiva si estos discos contienen datos que rara vez cambian. Por esta razÃŗn, es mejor NO incluir el disco C:\\ de Windows o los directorios /home, /var y /tmp de Unix. .PP La lista de archivos se guarda en los archivos de \`content\` (contenido), generalmente almacenados en los discos de datos, paridad o de arranque. Este archivo contiene los detalles de su copia de seguridad, incluyendo todas las sumas de comprobaciÃŗn para verificar su integridad. El archivo de \`content\` se almacena en mÃēltiples copias, y cada copia debe estar en un disco diferente para asegurar que, incluso en caso de mÃēltiples fallos de disco, al menos una copia estÊ disponible. .PP Por ejemplo, suponga que solo estÃĄ interesado en un nivel de paridad de protecciÃŗn, y sus discos estÃĄn ubicados en: .PP .RS 4 /mnt/diskp <\- disco seleccionado para paridad .PD 0 .PP .PD /mnt/disk1 <\- primer disco a proteger .PD 0 .PP .PD /mnt/disk2 <\- segundo disco a proteger .PD 0 .PP .PD /mnt/disk3 <\- tercer disco a proteger .PD 0 .PD .RE .PP Debe crear el archivo de configuraciÃŗn /etc/snapraid.conf con las siguientes opciones: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Si estÃĄ en Windows, debe usar el formato de ruta de Windows, con letras de unidad y barras invertidas en lugar de barras. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Si tiene muchos discos y se queda sin letras de unidad, puede montar discos directamente en subcarpetas. Consulte: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP En este punto, estÃĄ listo para ejecutar el comando \`sync\` (sincronizar) para construir la informaciÃŗn de paridad. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Este proceso puede llevar varias horas la primera vez, dependiendo del tamaÃąo de los datos ya presentes en los discos. Si los discos estÃĄn vacíos, el proceso es inmediato. .PP Puede detenerlo en cualquier momento presionando Ctrl+C, y en la siguiente ejecuciÃŗn, se reanudarÃĄ donde se interrumpiÃŗ. .PP Cuando este comando se complete, sus datos estarÃĄn SEGUROS. .PP Ahora puede comenzar a usar su array como desee y periÃŗdicamente actualizar la informaciÃŗn de paridad ejecutando el comando \`sync\`. .SS Scrubbing Para verificar periÃŗdicamente los datos y la paridad en busca de errores, puede ejecutar el comando \`scrub\` (fregar/limpiar). .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Este comando compara los datos de su array con el hash calculado durante el comando \`sync\` para verificar la integridad. .PP Cada ejecuciÃŗn del comando verifica aproximadamente el 8% del array, excluyendo los datos ya fregados en los 10 días anteriores. Puede usar la opciÃŗn \-p, \-\-plan para especificar una cantidad diferente y la opciÃŗn \-o, \-\-older\-than para especificar una edad diferente en días. Por ejemplo, para verificar el 5% del array en busca de bloques con mÃĄs de 20 días, use: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Si se encuentran errores silenciosos o de entrada/salida durante el proceso, los bloques correspondientes se marcan como defectuosos en el archivo de \`content\` y se listan en el comando \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Para corregirlos, puede usar el comando \`fix\` (arreglar), filtrando por bloques defectuosos con la opciÃŗn \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP En el siguiente \`scrub\`, los errores desaparecerÃĄn del informe de \`status\` si realmente se han corregido. Para hacerlo mÃĄs rÃĄpido, puede usar \-p bad para fregar solo los bloques marcados como defectuosos. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP Ejecutar \`scrub\` en un array no sincronizado puede reportar errores causados por archivos eliminados o modificados. Estos errores se informan en la salida de \`scrub\`, pero los bloques relacionados no se marcan como defectuosos. .SS Pooling Nota: La funciÃŗn de pooling descrita a continuaciÃŗn ha sido sustituida por la herramienta mergerfs, que ahora es la opciÃŗn recomendada para los usuarios de Linux en la comunidad SnapRAID. Mergefs proporciona una forma mÃĄs flexible y eficiente de agrupar mÃēltiples unidades en un Ãēnico punto de montaje unificado, permitiendo un acceso sin problemas a los archivos en todo su array sin depender de enlaces simbÃŗlicos. Se integra bien con SnapRAID para la protecciÃŗn de paridad y se usa comÃēnmente en configuraciones como OpenMediaVault (OMV) o configuraciones NAS personalizadas. .PP Para que todos los archivos de su array se muestren en el mismo ÃĄrbol de directorios, puede habilitar la funciÃŗn de \`pooling\` (agrupaciÃŗn). Crea una vista virtual de solo lectura de todos los archivos de su array utilizando enlaces simbÃŗlicos. .PP Puede configurar el directorio de \`pooling\` en el archivo de configuraciÃŗn con: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP o, si estÃĄ en Windows, con: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP y luego ejecute el comando \`pool\` para crear o actualizar la vista virtual. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Si estÃĄ utilizando una plataforma Unix y desea compartir este directorio a travÊs de la red con mÃĄquinas Windows o Unix, debe agregar las siguientes opciones a su /etc/samba/smb.conf: .PP .RS 4 # En la secciÃŗn global de smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # En la secciÃŗn de compartir de smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP En Windows, compartir enlaces simbÃŗlicos a travÊs de una red requiere que los clientes los resuelvan de forma remota. Para habilitar esto, ademÃĄs de compartir el directorio pool, tambiÊn debe compartir todos los discos de forma independiente, utilizando los nombres de disco definidos en el archivo de configuraciÃŗn como puntos de recurso compartido. TambiÊn debe especificar en la opciÃŗn \`share\` del archivo de configuraciÃŗn la ruta UNC de Windows que los clientes remotos necesitan usar para acceder a estos discos compartidos. .PP Por ejemplo, operando desde un servidor llamado \`darkstar\`, puede usar las opciones: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP y compartir los siguientes directorios a travÊs de la red: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP para permitir que los clientes remotos accedan a todos los archivos en \\\\darkstar\\pool. .PP TambiÊn puede que deba configurar los clientes remotos para habilitar el acceso a enlaces simbÃŗlicos remotos con el comando: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAID funciona mÃĄs como un programa de copia de seguridad que como un sistema RAID, y se puede usar para restaurar o recuperar archivos a su estado anterior usando la opciÃŗn \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP o para un directorio: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP TambiÊn puede usarlo para recuperar solo archivos eliminados accidentalmente dentro de un directorio usando la opciÃŗn \-m, \-\-filter\-missing, que restaura solo archivos faltantes, dejando todos los demÃĄs intactos. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP O para recuperar todos los archivos eliminados en todas las unidades con: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering Ha sucedido lo peor, ÂĄy ha perdido uno o mÃĄs discos! .PP ÂĄNO ENTRE EN PÁNICO! ÂĄPodrÃĄ recuperarlos! .PP Lo primero que debe hacer es evitar mÃĄs cambios en su array de discos. Deshabilite cualquier conexiÃŗn remota a Êl y cualquier proceso programado, incluida cualquier sincronizaciÃŗn o fregado nocturno programado de SnapRAID. .PP Luego, proceda con los siguientes pasos. .SS STEP 1 \-> Reconfigure Necesita algo de espacio para recuperarse, idealmente en discos de repuesto adicionales, pero un disco USB externo o un disco remoto serÃĄn suficientes. .PP Modifique el archivo de configuraciÃŗn de SnapRAID para hacer que la opciÃŗn \`data\` o \`parity\` del disco fallido apunte a una ubicaciÃŗn con suficiente espacio vacío para recuperar los archivos. .PP Por ejemplo, si el disco \`d1\` ha fallado, cambie de: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP a: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Si el disco a recuperar es un disco de paridad, actualice la opciÃŗn \`parity\` apropiada. Si tiene varios discos fallidos, actualice todas sus opciones de configuraciÃŗn. .SS STEP 2 \-> Fix Ejecute el comando fix, almacenando el registro en un archivo externo con: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP Donde NAME es el nombre del disco, como \`d1\` en nuestro ejemplo anterior. Si el disco a recuperar es un disco de paridad, use los nombres \`parity\`, \`2\-parity\`, etc. Si tiene varios discos fallidos, use varias opciones \-d para especificarlos todos. .PP Este comando tardarÃĄ mucho tiempo. .PP AsegÃērese de tener unos pocos gigabytes libres para almacenar el archivo fix.log. EjecÃētelo desde un disco con suficiente espacio libre. .PP Ahora ha recuperado todo lo que es recuperable. Si algunos archivos son parcial o totalmente irrecuperables, se les cambiarÃĄ el nombre agregando la extensiÃŗn \`.unrecoverable\`. .PP Puede encontrar una lista detallada de todos los bloques irrecuperables en el archivo fix.log buscando todas las líneas que comienzan con \`unrecoverable:\`. .PP Si no estÃĄ satisfecho con la recuperaciÃŗn, puede volver a intentarlo tantas veces como desee. .PP Por ejemplo, si ha eliminado archivos del array despuÊs de la Ãēltima \`sync\`, esto puede resultar en que algunos archivos no se recuperen. En este caso, puede volver a intentar el \`fix\` usando la opciÃŗn \-i, \-\-import, especificando dÃŗnde estÃĄn esos archivos ahora para incluirlos nuevamente en el proceso de recuperaciÃŗn. .PP Si estÃĄ satisfecho con la recuperaciÃŗn, puede continuar, ÂĄpero tenga en cuenta que despuÊs de sincronizar, no puede volver a intentar el comando \`fix\`! .SS STEP 3 \-> Check Como verificaciÃŗn cautelosa, ahora puede ejecutar un comando \`check\` (comprobar) para asegurarse de que todo estÊ correcto en el disco recuperado. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP Donde NAME es el nombre del disco, como \`d1\` en nuestro ejemplo anterior. .PP Las opciones \-d y \-a le dicen a SnapRAID que compruebe solo el disco especificado e ignore todos los datos de paridad. .PP Este comando tardarÃĄ mucho tiempo, pero si no es demasiado cauteloso, puede omitirlo. .SS STEP 4 \-> Sync Ejecute el comando \`sync\` para resincronizar el array con el nuevo disco. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Si todo se recupera, este comando es inmediato. .SH COMMANDS SnapRAID proporciona algunos comandos simples que le permiten: .PD 0 .IP \(bu Imprimir el estado del array \-> \`status\` .IP \(bu Controlar los discos \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Hacer una copia de seguridad/instantÃĄnea \-> \`sync\` .IP \(bu Comprobar periÃŗdicamente los datos \-> \`scrub\` .IP \(bu Restaurar la Ãēltima copia de seguridad/instantÃĄnea \-> \`fix\`. .PD .PP Los comandos deben escribirse en minÃēsculas. .SS status Imprime un resumen del estado del array de discos. .PP Incluye informaciÃŗn sobre la fragmentaciÃŗn de la paridad, la antigÃŧedad de los bloques sin verificar y todos los errores silenciosos registrados encontrados durante el fregado. .PP La informaciÃŗn presentada se refiere a la Ãēltima vez que ejecutÃŗ \`sync\`. Las modificaciones posteriores no se tienen en cuenta. .PP Si se detectaron bloques defectuosos, se enumeran sus nÃēmeros de bloque. Para corregirlos, puede usar el comando \`fix \-e\`. .PP TambiÊn muestra un grÃĄfico que representa la Ãēltima vez que cada bloque fue fregado o sincronizado. Los bloques fregados se muestran con \`*\`, los bloques sincronizados pero aÃēn no fregados con \`o\`. .PP Nada se modifica. .SS smart Imprime un informe SMART de todos los discos del sistema. .PP Incluye una estimaciÃŗn de la probabilidad de fallo en el prÃŗximo aÃąo, lo que le permite planificar reemplazos de mantenimiento de discos que muestren atributos sospechosos. .PP Esta estimaciÃŗn de probabilidad se obtiene correlacionando los atributos SMART de los discos con los datos de Backblaze disponibles en: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Si SMART informa que un disco estÃĄ fallando, se imprime \`FAIL\` o \`PREFAIL\` para ese disco, y SnapRAID regresa con un error. En este caso, se recomienda encarecidamente el reemplazo inmediato del disco. .PP Otras posibles cadenas de estado son: .RS 4 .PD 0 .HP 4 .I logfail En el pasado, algunos atributos estaban por debajo del umbral. .HP 4 .I logerr El registro de errores del dispositivo contiene errores. .HP 4 .I selferr El registro de autoprueba del dispositivo contiene errores. .PD .RE .PP Si se especifica la opciÃŗn \-v, \-\-verbose, se proporciona un anÃĄlisis estadístico mÃĄs profundo. Este anÃĄlisis puede ayudarle a decidir si necesita mÃĄs o menos paridad. .PP Este comando utiliza la herramienta \`smartctl\` y es equivalente a ejecutar \`smartctl \-a\` en todos los dispositivos. .PP Si sus dispositivos no se detectan automÃĄticamente correctamente, puede especificar un comando personalizado utilizando la opciÃŗn \`smartctl\` en el archivo de configuraciÃŗn. .PP Nada se modifica. .SS probe Imprime el estado de ENERGÍA de todos los discos del sistema. .PP \`Standby\` significa que el disco no estÃĄ girando. \`Active\` significa que el disco estÃĄ girando. .PP Este comando utiliza la herramienta \`smartctl\` y es equivalente a ejecutar \`smartctl \-n standby \-i\` en todos los dispositivos. .PP Si sus dispositivos no se detectan automÃĄticamente correctamente, puede especificar un comando personalizado utilizando la opciÃŗn \`smartctl\` en el archivo de configuraciÃŗn. .PP Nada se modifica. .SS up Pone en marcha (gira) todos los discos del array. .PP Puede poner en marcha solo discos específicos usando la opciÃŗn \-d, \-\-filter\-disk. .PP Poner en marcha todos los discos al mismo tiempo requiere mucha energía. AsegÃērese de que su fuente de alimentaciÃŗn pueda soportarlo. .PP Nada se modifica. .SS down Detiene (deja de girar) todos los discos del array. .PP Este comando utiliza la herramienta \`smartctl\` y es equivalente a ejecutar \`smartctl \-s standby,now\` en todos los dispositivos. .PP Puede detener solo discos específicos usando la opciÃŗn \-d, \-\-filter\-disk. .PP Para detener automÃĄticamente en caso de error, puede usar la opciÃŗn \-s, \-\-spin\-down\-on\-error con cualquier otro comando, lo cual es equivalente a ejecutar \`down\` manualmente cuando ocurre un error. .PP Nada se modifica. .SS diff Enumera todos los archivos modificados desde el Ãēltimo \`sync\` que necesitan que se vuelva a calcular su informaciÃŗn de paridad. .PP Este comando no verifica los datos del archivo, sino solo la marca de tiempo, el tamaÃąo y el inodo del archivo. .PP DespuÊs de enumerar todos los archivos cambiados, se presenta un resumen de los cambios, agrupados por: .RS 4 .PD 0 .HP 4 .I equal Archivos sin cambios desde antes. .HP 4 .I added Archivos agregados que no estaban presentes antes. .HP 4 .I removed Archivos eliminados. .HP 4 .I updated Archivos con un tamaÃąo o marca de tiempo diferente, lo que significa que fueron modificados. .HP 4 .I moved Archivos movidos a un directorio diferente en el mismo disco. Se identifican por tener el mismo nombre, tamaÃąo, marca de tiempo e inodo, pero un directorio diferente. .HP 4 .I copied Archivos copiados en el mismo disco o en uno diferente donde el archivo original todavía existe. Se identifican por tener el mismo nombre, tamaÃąo y marca de tiempo. Si la marca de tiempo de subsegundo es cero, la ruta completa debe coincidir para ser identificado, no solo el nombre. .HP 4 .I relocated Archivos movidos en el mismo disco o en uno diferente donde el original ha desaparecido. Se identifican por tener el mismo nombre, tamaÃąo y marca de tiempo. Si la marca de tiempo de subsegundo es cero, la ruta completa debe coincidir para ser identificado. A diferencia de los archivos \`moved\` en el mismo disco, los archivos reubicados tienen un inodo diferente. .HP 4 .I restored Archivos con un inodo diferente pero con directorio, nombre, tamaÃąo y marca de tiempo coincidentes. Estos son usualmente archivos restaurados despuÊs de haber sido eliminados. .PD .RE .PP Si se requiere un \`sync\`, el cÃŗdigo de retorno del proceso es 2, en lugar del valor predeterminado 0. El cÃŗdigo de retorno 1 se utiliza para una condiciÃŗn de error genÊrico. .PP Nada se modifica. .SS sync Actualiza la informaciÃŗn de paridad. Todos los archivos modificados en el array de discos se leen y la informaciÃŗn de paridad correspondiente se actualiza. .PP Puede detener este proceso en cualquier momento presionando Ctrl+C, sin perder el trabajo ya realizado. En la siguiente ejecuciÃŗn, el proceso \`sync\` se reanudarÃĄ donde se interrumpiÃŗ. .PP Si se encuentran errores silenciosos o de entrada/salida durante el proceso, los bloques correspondientes se marcan como defectuosos. .PP Los archivos se identifican por ruta y/o inodo y se verifican por tamaÃąo y marca de tiempo. Si el tamaÃąo o la marca de tiempo del archivo difieren, la informaciÃŗn de paridad se vuelve a calcular para todo el archivo. Si el archivo se mueve o se renombra en el mismo disco, manteniendo el mismo inodo, la paridad no se vuelve a calcular. Si el archivo se mueve a otro disco, la paridad se vuelve a calcular, pero la informaciÃŗn de hash calculada previamente se mantiene. .PP Los archivos \`content\` y \`parity\` se modifican si es necesario. Los archivos en el array NO se modifican. .SS scrub Frota (scrubs) el array, buscando errores silenciosos o de entrada/salida en los discos de datos y paridad. .PP Cada invocaciÃŗn verifica aproximadamente el 8% del array, excluyendo los datos ya fregados en los Ãēltimos 10 días. Esto significa que fregar una vez a la semana asegura que cada bit de datos se verifique al menos una vez cada tres meses. .PP Puede definir un plan de fregado o una cantidad diferente utilizando la opciÃŗn \-p, \-\-plan, que acepta: bad \- Fregar bloques marcados como defectuosos. new \- Fregar bloques reciÊn sincronizados que aÃēn no han sido fregados. full \- Fregar todo. 0\-100 \- Fregar el porcentaje especificado de bloques. .PP Si especifica un valor de porcentaje, tambiÊn puede usar la opciÃŗn \-o, \-\-older\-than para definir la antigÃŧedad del bloque. Los bloques mÃĄs antiguos se friegan primero, asegurando una verificaciÃŗn Ãŗptima. Si desea fregar solo los bloques reciÊn sincronizados que aÃēn no han sido fregados, use la opciÃŗn \`\-p new\`. .PP Para obtener detalles del estado del fregado, use el comando \`status\`. .PP Para cualquier error silencioso o de entrada/salida encontrado, los bloques correspondientes se marcan como defectuosos en el archivo \`content\`. Estos bloques defectuosos se enumeran en \`status\` y se pueden corregir con \`fix \-e\`. DespuÊs de la correcciÃŗn, en el siguiente fregado, se volverÃĄn a verificar y, si se encuentran corregidos, se eliminarÃĄ la marca de defectuoso. Para fregar solo los bloques defectuosos, puede usar el comando \`scrub \-p bad\`. .PP Se recomienda ejecutar \`scrub\` solo en un array sincronizado para evitar errores reportados causados por datos no sincronizados. Estos errores se reconocen como no siendo errores silenciosos y los bloques no se marcan como defectuosos, pero tales errores se informan en la salida del comando. .PP El archivo \`content\` se modifica para actualizar el tiempo de la Ãēltima verificaciÃŗn de cada bloque y para marcar bloques defectuosos. Los archivos \`parity\` NO se modifican. Los archivos en el array NO se modifican. .SS fix Corrige todos los archivos y la informaciÃŗn de paridad. .PP Todos los archivos y la informaciÃŗn de paridad se comparan con el estado de instantÃĄnea guardado en el Ãēltimo \`sync\`. Si se encuentra una diferencia, se revierte a la instantÃĄnea almacenada. .PP ÂĄADVERTENCIA! El comando \`fix\` no diferencia entre errores y modificaciones intencionales. Revierte incondicionalmente el estado del archivo al Ãēltimo \`sync\`. .PP Si no se especifica otra opciÃŗn, se procesa todo el array. Utilice las opciones de filtro para seleccionar un subconjunto de archivos o discos para operar. .PP Para corregir solo los bloques marcados como defectuosos durante \`sync\` y \`scrub\`, use la opciÃŗn \-e, \-\-filter\-error. A diferencia de otras opciones de filtro, esta aplica correcciones solo a archivos que no han cambiado desde el Ãēltimo \`sync\`. .PP SnapRAID cambia el nombre de todos los archivos que no se pueden corregir agregando la extensiÃŗn \`.unrecoverable\`. .PP Antes de corregir, se escanea todo el array para encontrar cualquier archivo movido desde la Ãēltima operaciÃŗn de \`sync\`. Estos archivos se identifican por su marca de tiempo, ignorando su nombre y directorio, y se utilizan en el proceso de recuperaciÃŗn si es necesario. Si moviÃŗ algunos de ellos fuera del array, puede usar la opciÃŗn \-i, \-\-import para especificar directorios adicionales para escanear. .PP Los archivos se identifican solo por ruta, no por inodo. .PP El archivo \`content\` NO se modifica. Los archivos \`parity\` se modifican si es necesario. Los archivos en el array se modifican si es necesario. .SS check Verifica todos los archivos y la informaciÃŗn de paridad. .PP Funciona como \`fix\`, pero solo simula una recuperaciÃŗn y no se escriben cambios en el array. .PP Este comando estÃĄ destinado principalmente a la verificaciÃŗn manual, como despuÊs de un proceso de recuperaciÃŗn o en otras condiciones especiales. Para comprobaciones periÃŗdicas y programadas, use \`scrub\`. .PP Si usa la opciÃŗn \-a, \-\-audit\-only, solo se verifican los datos del archivo y se ignora la informaciÃŗn de paridad para una ejecuciÃŗn mÃĄs rÃĄpida. .PP Los archivos se identifican solo por ruta, no por inodo. .PP Nada se modifica. .SS list Enumera todos los archivos contenidos en el array en el momento del Ãēltimo \`sync\`. .PP Con \-v o \-\-verbose, tambiÊn se muestra el tiempo de subsegundo. .PP Nada se modifica. .SS dup Enumera todos los archivos duplicados. Se supone que dos archivos son iguales si sus hashes coinciden. Los datos del archivo no se leen; solo se utilizan los hashes precalculados. .PP Nada se modifica. .SS pool Crea o actualiza una vista virtual de todos los archivos de su array de discos en el directorio de \`pooling\`. .PP Los archivos no se copian sino que se enlazan usando enlaces simbÃŗlicos. .PP Al actualizar, todos los enlaces simbÃŗlicos existentes y los subdirectorios vacíos se eliminan y se reemplazan con la nueva vista del array. Cualquier otro archivo regular se deja en su lugar. .PP Nada se modifica fuera del directorio pool. .SS devices Imprime los dispositivos de bajo nivel utilizados por el array. .PP Este comando muestra las asociaciones de dispositivos en el array y estÃĄ destinado principalmente como una interfaz de script. .PP Las primeras dos columnas son el ID y la ruta del dispositivo de bajo nivel. Las siguientes dos columnas son el ID y la ruta del dispositivo de alto nivel. La Ãēltima columna es el nombre del disco en el array. .PP En la mayoría de los casos, tiene un dispositivo de bajo nivel para cada disco en el array, pero en algunas configuraciones mÃĄs complejas, puede tener mÃēltiples dispositivos de bajo nivel utilizados por un solo disco en el array. .PP Nada se modifica. .SS touch Establece una marca de tiempo de subsegundo arbitraria para todos los archivos que la tienen establecida en cero. .PP Esto mejora la capacidad de SnapRAID para reconocer archivos movidos y copiados, ya que hace que la marca de tiempo sea casi Ãēnica, reduciendo posibles duplicados. .PP MÃĄs específicamente, si la marca de tiempo de subsegundo no es cero, un archivo movido o copiado se identifica como tal si coincide con el nombre, el tamaÃąo y la marca de tiempo. Si la marca de tiempo de subsegundo es cero, se considera una copia solo si la ruta completa, el tamaÃąo y la marca de tiempo coinciden. .PP La marca de tiempo de precisiÃŗn de segundo no se modifica, por lo que se conservarÃĄn todas las fechas y horas de sus archivos. .SS rehash Programa un nuevo cÃĄlculo de hash (rehash) de todo el array. .PP Este comando cambia el tipo de hash utilizado, típicamente al actualizar de un sistema de 32 bits a uno de 64 bits, para cambiar de MurmurHash3 al mÃĄs rÃĄpido SpookyHash. .PP Si ya estÃĄ utilizando el hash Ãŗptimo, este comando no hace nada y le informa que no se necesita ninguna acciÃŗn. .PP El nuevo cÃĄlculo de hash no se realiza inmediatamente, sino que tiene lugar progresivamente durante \`sync\` y \`scrub\`. .PP Puede verificar el estado del nuevo cÃĄlculo de hash usando \`status\`. .PP Durante el nuevo cÃĄlculo de hash, SnapRAID mantiene la funcionalidad completa, con la Ãēnica excepciÃŗn de que \`dup\` no puede detectar archivos duplicados utilizando un hash diferente. .SS locate Localiza archivos almacenados en los discos de paridad. Para cada archivo coincidente, imprime su ubicaciÃŗn dentro del archivo de paridad y el nÃēmero de fragmentos que ocupa. .PP Puede usar la opciÃŗn \-t, \-\-tail para restringir la operaciÃŗn a los archivos que ocupan la porciÃŗn final especificada de la paridad. .PP Si desea reasignar estos archivos, puede usar la opciÃŗn \-W, \-\-force\-realloc\-tail. Tenga en cuenta que dichos archivos no estarÃĄn protegidos por la paridad durante el proceso de reasignaciÃŗn. .SH OPTIONS SnapRAID proporciona las siguientes opciones: .TP .B \-c, \-\-conf CONFIG Selecciona el archivo de configuraciÃŗn a usar. Si no se especifica, en Unix utiliza el archivo \`/usr/local/etc/snapraid.conf\` si existe, de lo contrario \`/etc/snapraid.conf\`. En Windows, utiliza el archivo \`snapraid.conf\` en el mismo directorio que \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Filtra los archivos a procesar en \`check\` y \`fix\`. Solo se procesan los archivos que coinciden con el patrÃŗn especificado. Esta opciÃŗn se puede usar varias veces. Consulte la secciÃŗn PATTERN para obtener mÃĄs detalles sobre las especificaciones de patrones. En Unix, asegÃērese de que los caracteres globbing estÊn entre comillas si se usan. Esta opciÃŗn solo se puede usar con \`check\` y \`fix\`. No se puede usar con \`sync\` y \`scrub\`, ya que siempre procesan todo el array. .TP .B \-d, \-\-filter\-disk NAME Filtra los discos a procesar en \`check\`, \`fix\`, \`up\` y \`down\`. Debe especificar un nombre de disco como se define en el archivo de configuraciÃŗn. TambiÊn puede especificar discos de paridad con los nombres: \`parity\`, \`2\-parity\`, \`3\-parity\`, etc., para limitar las operaciones a un disco de paridad específico. Si combina mÃēltiples opciones \-\-filter, \-\-filter\-disk y \-\-filter\-missing, solo se seleccionan los archivos que coinciden con todos los filtros. Esta opciÃŗn se puede usar varias veces. Esta opciÃŗn solo se puede usar con \`check\`, \`fix\`, \`up\` y \`down\`. No se puede usar con \`sync\` y \`scrub\`, ya que siempre procesan todo el array. .TP .B \-m, \-\-filter\-missing Filtra los archivos a procesar en \`check\` y \`fix\`. Solo se procesan los archivos faltantes o eliminados del array. Cuando se usa con \`fix\`, esto actÃēa como un comando de \`undelete\` (recuperaciÃŗn). Si combina mÃēltiples opciones \-\-filter, \-\-filter\-disk y \-\-filter\-missing, solo se seleccionan los archivos que coinciden con todos los filtros. Esta opciÃŗn solo se puede usar con \`check\` y \`fix\`. No se puede usar con \`sync\` y \`scrub\`, ya que siempre procesan todo el array. .TP .B \-e, \-\-filter\-error Procesa los archivos con errores en \`check\` y \`fix\`. Solo procesa archivos que tienen bloques marcados con errores silenciosos o de entrada/salida durante \`sync\` y \`scrub\`, segÃēn se enumeran en \`status\`. Esta opciÃŗn solo se puede usar con \`check\` y \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Selecciona el plan de fregado (scrub). Si PERC es un valor numÊrico de 0 a 100, se interpreta como el porcentaje de bloques a fregar. En lugar de un porcentaje, puede especificar un plan: \`bad\` friega bloques defectuosos, \`new\` friega bloques aÃēn no fregados, y \`full\` friega todo. Esta opciÃŗn solo se puede usar con \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Selecciona la parte mÃĄs antigua del array para procesar en \`scrub\`. DAYS es la edad mínima en días para que un bloque sea fregado; el valor predeterminado es 10. Los bloques marcados como defectuosos siempre se friegan independientemente de esta opciÃŗn. Esta opciÃŗn solo se puede usar con \`scrub\`. .TP .B \-a, \-\-audit\-only En \`check\`, verifica el hash de los archivos sin verificar la informaciÃŗn de paridad. Si solo estÃĄ interesado en verificar los datos del archivo, esta opciÃŗn puede acelerar significativamente el proceso de verificaciÃŗn. Esta opciÃŗn solo se puede usar con \`check\`. .TP .B \-h, \-\-pre\-hash En \`sync\`, ejecuta una fase de hash preliminar de todos los datos nuevos para una verificaciÃŗn adicional antes del cÃĄlculo de paridad. Normalmente, en \`sync\`, no se realiza un hash preliminar, y los nuevos datos se hashean justo antes del cÃĄlculo de paridad cuando se leen por primera vez. Este proceso ocurre cuando el sistema estÃĄ bajo una gran carga, con todos los discos girando y una CPU ocupada. Esta es una condiciÃŗn extrema para la mÃĄquina, y si tiene un problema de hardware latente, los errores silenciosos pueden pasar desapercibidos porque los datos aÃēn no estÃĄn hasheados. Para evitar este riesgo, puede habilitar el modo \`pre\-hash\` para que todos los datos se lean dos veces para garantizar su integridad. Esta opciÃŗn tambiÊn verifica los archivos movidos dentro del array para asegurar que la operaciÃŗn de movimiento fue exitosa y, si es necesario, le permite ejecutar una operaciÃŗn de correcciÃŗn antes de continuar. Esta opciÃŗn solo se puede usar con \`sync\`. .TP .B \-i, \-\-import DIR Importa desde el directorio especificado cualquier archivo eliminado del array despuÊs del Ãēltimo \`sync\`. Si aÃēn tiene dichos archivos, \`check\` y \`fix\` pueden usarlos para mejorar el proceso de recuperaciÃŗn. Los archivos se leen, incluso en subdirectorios, y se identifican independientemente de su nombre. Esta opciÃŗn solo se puede usar con \`check\` y \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error En cualquier error, detiene todos los discos gestionados antes de salir con un cÃŗdigo de estado distinto de cero. Esto evita que las unidades permanezcan activas y girando despuÊs de una operaciÃŗn abortada, lo que ayuda a evitar la acumulaciÃŗn de calor innecesaria y el consumo de energía. Use esta opciÃŗn para asegurarse de que los discos se detengan de forma segura incluso cuando un comando falla. .TP .B \-w, \-\-bw\-limit RATE Aplica un límite de ancho de banda global para todos los discos. RATE es el nÃēmero de bytes por segundo. Puede especificar un multiplicador como K, M o G (por ejemplo, \-\-bw\-limit 1G). .TP .B \-t, \-\-tail TAMAÑO Limita la lista de archivos a aquellos que no usan mÃĄs del tamaÃąo de cola especificado de los discos de paridad. Puede usar multiplicadores como K, M, G o T (por ejemplo, \-\-tail 1G). Esta opciÃŗn solo es vÃĄlida cuando se usa junto con el comando \`locate\`. .TP .B \-A, \-\-stats Habilita una vista de estado extendida que muestra informaciÃŗn adicional. La pantalla muestra dos grÃĄficos: El primer grÃĄfico muestra el nÃēmero de franjas (stripes) almacenadas en bÃēfer para cada disco, junto con la ruta del archivo al que se estÃĄ accediendo actualmente en ese disco. Normalmente, el disco mÃĄs lento no tendrÃĄ bÃēfer disponible, lo que determina el ancho de banda mÃĄximo alcanzable. El segundo grÃĄfico muestra el porcentaje de tiempo dedicado a esperar durante los Ãēltimos 100 segundos. Se espera que el disco mÃĄs lento cause la mayor parte del tiempo de espera, mientras que otros discos deberían tener poco o ningÃēn tiempo de espera porque pueden usar sus franjas almacenadas en bÃēfer. Este grÃĄfico tambiÊn muestra el tiempo dedicado a esperar los cÃĄlculos de hash y los cÃĄlculos RAID. Todos los cÃĄlculos se ejecutan en paralelo con las operaciones de disco. Por lo tanto, mientras haya un tiempo de espera medible para al menos un disco, indica que la CPU es lo suficientemente rÃĄpida para mantenerse al día con la carga de trabajo. .TP .B \-Z, \-\-force\-zero Fuerza la operaciÃŗn insegura de sincronizar un archivo con tamaÃąo cero que antes no era cero. Si SnapRAID detecta tal condiciÃŗn, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar fÃĄcilmente cuando, despuÊs de un fallo del sistema, algunos archivos accedidos fueron truncados. Esta es una posible condiciÃŗn en Linux con los sistemas de archivos ext3/ext4. Esta opciÃŗn solo se puede usar con \`sync\`. .TP .B \-E, \-\-force\-empty Fuerza la operaciÃŗn insegura de sincronizar un disco con todos los archivos originales faltantes. Si SnapRAID detecta que todos los archivos originalmente presentes en el disco faltan o han sido reescritos, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar fÃĄcilmente cuando un sistema de archivos de datos no estÃĄ montado. Sin embargo, se permite tener un solo cambio de UUID con paridad simple, y mÃĄs con paridad mÃēltiple, porque este es el caso normal al reemplazar discos despuÊs de una recuperaciÃŗn. Esta opciÃŗn solo se puede usar con \`sync\`. .TP .B \-U, \-\-force\-uuid Fuerza la operaciÃŗn insegura de sincronizar, verificar y corregir con discos que han cambiado su UUID. Si SnapRAID detecta que algunos discos han cambiado el UUID, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar cuando sus discos estÃĄn montados en los puntos de montaje incorrectos. Esta opciÃŗn solo se puede usar con \`sync\`, \`check\` o \`fix\`. .TP .B \-D, \-\-force\-device Fuerza la operaciÃŗn insegura de corregir con discos inaccesibles o con discos en el mismo dispositivo físico. Por ejemplo, si perdiÃŗ dos discos de datos y tiene un disco de repuesto para recuperar solo el primero, puede ignorar el segundo disco inaccesible. O, si desea recuperar un disco en el espacio libre que queda en un disco ya usado, compartiendo el mismo dispositivo físico. Esta opciÃŗn solo se puede usar con \`fix\`. .TP .B \-N, \-\-force\-nocopy En \`sync\`, \`check\` y \`fix\`, deshabilita la heurística de detecciÃŗn de copias. Sin esta opciÃŗn, SnapRAID asume que los archivos con los mismos atributos, como nombre, tamaÃąo y marca de tiempo, son copias con los mismos datos. Esto permite la identificaciÃŗn de archivos copiados o movidos de un disco a otro y reutiliza la informaciÃŗn de hash ya calculada para detectar errores silenciosos o recuperar archivos faltantes. En algunos casos raros, este comportamiento puede dar lugar a falsos positivos o a un proceso lento debido a muchas verificaciones de hash, y esta opciÃŗn le permite resolver tales problemas. Esta opciÃŗn solo se puede usar con \`sync\`, \`check\` y \`fix\`. .TP .B \-F, \-\-force\-full En \`sync\`, fuerza un recÃĄlculo completo de la paridad. Esta opciÃŗn se puede usar cuando agrega un nuevo nivel de paridad o si revirtiÃŗ a un archivo de contenido antiguo utilizando datos de paridad mÃĄs recientes. En lugar de recrear la paridad desde cero, esto le permite reutilizar los hashes presentes en el archivo de contenido para validar los datos y mantener la protecciÃŗn de datos durante el proceso \`sync\` utilizando los datos de paridad existentes. Esta opciÃŗn solo se puede usar con \`sync\`. .TP .B \-R, \-\-force\-realloc En \`sync\`, fuerza una reasignaciÃŗn completa de archivos y la reconstrucciÃŗn de la paridad. Esta opciÃŗn se puede usar para reasignar completamente todos los archivos, eliminando la fragmentaciÃŗn, mientras se reutilizan los hashes presentes en el archivo de contenido para validar los datos. Esta opciÃŗn solo se puede usar con \`sync\`. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no usarla. NO tiene protecciÃŗn de datos durante la operaciÃŗn \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail TAMAÑO Funciona como \-R, \-\-force\-realloc, pero limitado a la porciÃŗn final especificada (Ãēltimos TAMAÑO bytes) de cada archivo de paridad. Fuerza la reasignaciÃŗn (movimiento) de cualquier fragmento/bloque de archivo actualmente almacenado en esa secciÃŗn final, permitiendo que se coloquen en cualquier lugar de los archivos de paridad donde haya espacio libre disponible (incluyendo huecos existentes). El propÃŗsito principal de esta opciÃŗn es reducir el tamaÃąo en disco del archivo de paridad. Si la reasignaciÃŗn vacía con Êxito toda la secciÃŗn final (no quedan bloques usÃĄndola), el archivo de paridad se trunca, recuperando el espacio final no utilizado. Puede usar multiplicadores como K, M, G o T (por ejemplo, \-\-force\-realloc\-tail 1G). Puede usar locate \-t, \-\-tail para conocer de antemano los archivos afectados. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no usarla. Usted NO tiene protecciÃŗn de datos durante la operaciÃŗn \`sync\` para los archivos afectados. .TP .B \-l, \-\-log FILE Escribe un registro detallado en el archivo especificado. Si no se especifica esta opciÃŗn, los errores inesperados se imprimen en la pantalla, lo que puede resultar en una salida excesiva en caso de muchos errores. Cuando se especifica \-l, \-\-log, solo los errores fatales que hacen que SnapRAID se detenga se imprimen en la pantalla. Si la ruta comienza con \`>>\`, el archivo se abre en modo de anexar. Las ocurrencias de \`%D\` y \`%T\` en el nombre se reemplazan con la fecha y hora en el formato AAAA MM DD y HH MM SS. En archivos por lotes de Windows, debe duplicar el carÃĄcter \`%\`, por ejemplo, resultado\-%%D.log. Para usar \`>>\`, debe encerrar el nombre entre comillas, por ejemplo, \`\[dq]>>resultado.log\[dq]\`. Para enviar el registro a la salida estÃĄndar o al error estÃĄndar, puede usar \`\[dq]>&1\[dq]\` y \`\[dq]>&2\[dq]\`, respectivamente. Consulte el archivo snapraid_log.txt o la pÃĄgina del manual para obtener descripciones de las etiquetas de registro. .TP .B \-L, \-\-error\-limit NUMBER Establece un nuevo límite de error antes de detener la ejecuciÃŗn. De forma predeterminada, SnapRAID se detiene si encuentra mÃĄs de 100 errores de entrada/salida, lo que indica que es probable que un disco estÊ fallando. Esta opciÃŗn afecta a \`sync\` y \`scrub\`, a los que se les permite continuar despuÊs del primer conjunto de errores de disco para intentar completar sus operaciones. Sin embargo, \`check\` y \`fix\` siempre se detienen en el primer error. .TP .B \-S, \-\-start BLKSTART Comienza a procesar desde el nÃēmero de bloque especificado. Esto puede ser Ãētil para reintentar verificar o corregir bloques específicos en caso de un disco daÃąado. Esta opciÃŗn es principalmente para recuperaciÃŗn manual avanzada. .TP .B \-B, \-\-count BLKCOUNT Procesa solo el nÃēmero de bloques especificado. Esta opciÃŗn es principalmente para recuperaciÃŗn manual avanzada. .TP .B \-C, \-\-gen\-conf CONTENT Genera un archivo de configuraciÃŗn ficticio a partir de un archivo de contenido existente. El archivo de configuraciÃŗn se escribe en la salida estÃĄndar y no sobrescribe uno existente. Este archivo de configuraciÃŗn tambiÊn contiene la informaciÃŗn necesaria para reconstruir los puntos de montaje del disco en caso de que pierda todo el sistema. .TP .B \-v, \-\-verbose Imprime mÃĄs informaciÃŗn en la pantalla. Si se especifica una vez, imprime archivos excluidos y estadísticas adicionales. Esta opciÃŗn no tiene efecto en los archivos de registro. .TP .B \-q, \-\-quiet Imprime menos informaciÃŗn en la pantalla. Si se especifica una vez, elimina la barra de progreso; dos veces, las operaciones en ejecuciÃŗn; tres veces, los mensajes de informaciÃŗn; cuatro veces, los mensajes de estado. Los errores fatales siempre se imprimen en la pantalla. Esta opciÃŗn no tiene efecto en los archivos de registro. .TP .B \-H, \-\-help Imprime una pantalla de ayuda corta. .TP .B \-V, \-\-version Imprime la versiÃŗn del programa. .SH CONFIGURATION SnapRAID requiere un archivo de configuraciÃŗn para saber dÃŗnde se encuentra su array de discos y dÃŗnde almacenar la informaciÃŗn de paridad. .PP En Unix, utiliza el archivo \`/usr/local/etc/snapraid.conf\` si existe, de lo contrario \`/etc/snapraid.conf\`. En Windows, utiliza el archivo \`snapraid.conf\` en el mismo directorio que \`snapraid.exe\`. .PP Debe contener las siguientes opciones (distingue entre mayÃēsculas y minÃēsculas): .SS parity FILE [,FILE] ... Define los archivos a usar para almacenar la informaciÃŗn de paridad. La paridad permite la protecciÃŗn contra un solo fallo de disco, similar a RAID5. .PP Puede especificar varios archivos, que deben estar en discos diferentes. Cuando un archivo no puede crecer mÃĄs, se utiliza el siguiente. El espacio total disponible debe ser al menos tan grande como el disco de datos mÃĄs grande del array. .PP Puede agregar archivos de paridad adicionales mÃĄs tarde, pero no puede reordenarlos ni eliminarlos. .PP Mantener los discos de paridad reservados para la paridad asegura que no se fragmenten, mejorando el rendimiento. .PP En Windows, se dejan 256 MB sin usar en cada disco para evitar la advertencia sobre discos llenos. .PP Esta opciÃŗn es obligatoria y solo se puede usar una vez. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... Define los archivos a usar para almacenar informaciÃŗn de paridad adicional. .PP Para cada nivel de paridad especificado, se habilita un nivel adicional de protecciÃŗn: .PD 0 .IP \(bu 2\-parity habilita la paridad dual RAID6. .IP \(bu 3\-parity habilita la paridad triple. .IP \(bu 4\-parity habilita la paridad cuÃĄdruple. .IP \(bu 5\-parity habilita la paridad quíntuple. .IP \(bu 6\-parity habilita la paridad sÊxtuple. .PD .PP Cada nivel de paridad requiere la presencia de todos los niveles de paridad anteriores. .PP Se aplican las mismas consideraciones que para la opciÃŗn \`parity\`. .PP Estas opciones son opcionales y solo se pueden usar una vez. .SS z\-parity FILE [,FILE] ... Define un archivo y un formato alternativos para almacenar paridad triple. .PP Esta opciÃŗn es una alternativa a \`3\-parity\`, destinada principalmente a CPU de gama baja como ARM o AMD Phenom, Athlon y Opteron que no admiten el conjunto de instrucciones SSSE3. En tales casos, proporciona un mejor rendimiento. .PP Este formato es similar pero mÃĄs rÃĄpido que el utilizado por ZFS RAIDZ3. Al igual que ZFS, no funciona mÃĄs allÃĄ de la paridad triple. .PP Al usar \`3\-parity\`, se le advertirÃĄ si se recomienda usar el formato \`z\-parity\` para mejorar el rendimiento. .PP Es posible convertir de un formato a otro ajustando el archivo de configuraciÃŗn con el archivo z\-parity o 3\-parity deseado y usando \`fix\` para recrearlo. .SS content FILE Define el archivo a usar para almacenar la lista y las sumas de comprobaciÃŗn de todos los archivos presentes en su array de discos. .PP Se puede colocar en un disco utilizado para datos, paridad o cualquier otro disco disponible. Si usa un disco de datos, este archivo se excluye automÃĄticamente del proceso \`sync\`. .PP Esta opciÃŗn es obligatoria y se puede usar varias veces para guardar mÃēltiples copias del mismo archivo. .PP Debe almacenar al menos una copia por cada disco de paridad utilizado mÃĄs uno. Usar copias adicionales no perjudica. .SS data NAME DIR Define el nombre y el punto de montaje de los discos de datos en el array. NAME se usa para identificar el disco y debe ser Ãēnico. DIR es el punto de montaje del disco en el sistema de archivos. .PP Puede cambiar el punto de montaje segÃēn sea necesario, siempre que mantenga el NAME fijo. .PP Debe usar una opciÃŗn para cada disco de datos en el array. .PP Puede cambiar el nombre de un disco mÃĄs tarde cambiando el NAME directamente en el archivo de configuraciÃŗn y luego ejecutando un comando \`sync\`. En el caso de cambiar el nombre, la asociaciÃŗn se realiza utilizando el UUID almacenado de los discos. .SS extra NAME DIR Define el nombre y el punto de montaje de discos adicionales para monitorear con los comandos \`smart\` y \`probe\`. .PP Esto es Ãētil para monitorear discos que no forman parte de la matriz pero que son necesarios para que el sistema funcione, como el disco de arranque. .PP Tenga en cuenta que dichos discos no se ven afectados por los comandos \`up\` y \`down\` porque se espera que estÊn siempre girando. .SS nohidden Excluye todos los archivos y directorios ocultos. En Unix, los archivos ocultos son los que comienzan con \`.\`. En Windows, son los que tienen el atributo oculto. .SS exclude/include PATTERN Define los patrones de archivo o directorio a excluir o incluir en el proceso de sincronizaciÃŗn. Todos los patrones se procesan en el orden especificado. .PP Si el primer patrÃŗn que coincide es un \`exclude\`, el archivo se excluye. Si es un \`include\`, el archivo se incluye. Si ningÃēn patrÃŗn coincide, el archivo se excluye si el Ãēltimo patrÃŗn especificado es un \`include\`, o se incluye si el Ãēltimo patrÃŗn especificado es un \`exclude\`. .PP Consulte la secciÃŗn PATTERN para obtener mÃĄs detalles sobre las especificaciones de patrones. .PP Esta opciÃŗn se puede usar varias veces. .SS blocksize SIZE_IN_KIBIBYTES Define el tamaÃąo de bloque bÃĄsico en kibibytes para la paridad. Un kibibyte es 1024 bytes. .PP El tamaÃąo de bloque predeterminado es 256, que debería funcionar para la mayoría de los casos. .PP ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no cambiar este valor. Para cambiar este valor en el futuro, ÂĄtendrÃĄ que recrear toda la paridad! .PP Una razÃŗn para usar un tamaÃąo de bloque diferente es si tiene muchos archivos pequeÃąos, del orden de millones. .PP Para cada archivo, incluso si solo son unos pocos bytes, se asigna un bloque completo de paridad, y con muchos archivos, esto puede resultar en un espacio de paridad no utilizado significativo. Cuando llena completamente el disco de paridad, no se le permite agregar mÃĄs archivos a los discos de datos. Sin embargo, la paridad desperdiciada no se acumula en los discos de datos. El espacio desperdiciado resultante de un alto nÃēmero de archivos en un disco de datos limita solo la cantidad de datos en ese disco de datos, no en otros. .PP Como aproximaciÃŗn, puede suponer que se desperdicia la mitad del tamaÃąo del bloque para cada archivo. Por ejemplo, con 100,000 archivos y un tamaÃąo de bloque de 256 KiB, desperdiciarÃĄ 12.8 GB de paridad, lo que puede resultar en 12.8 GB menos de espacio disponible en el disco de datos. .PP Puede verificar la cantidad de espacio desperdiciado en cada disco usando \`status\`. Este es el espacio que debe dejar libre en los discos de datos o usar para archivos no incluidos en el array. Si este valor es negativo, significa que estÃĄ cerca de llenar la paridad, y representa el espacio que aÃēn puede desperdiciar. .PP Para evitar este problema, puede usar una particiÃŗn mÃĄs grande para la paridad. Por ejemplo, si la particiÃŗn de paridad es 12.8 GB mÃĄs grande que los discos de datos, tiene suficiente espacio extra para manejar hasta 100,000 archivos en cada disco de datos sin ningÃēn espacio desperdiciado. .PP Un truco para obtener una particiÃŗn de paridad mÃĄs grande en Linux es formatearla con el comando: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Esto resulta en aproximadamente un 1.5% de espacio extra, aproximadamente 60 GB para un disco de 4 TB, lo que permite alrededor de 460,000 archivos en cada disco de datos sin ningÃēn espacio desperdiciado. .SS hashsize SIZE_IN_BYTES Define el tamaÃąo del hash en bytes para los bloques guardados. .PP El tamaÃąo de hash predeterminado es de 16 bytes (128 bits), que debería funcionar para la mayoría de los casos. .PP ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no cambiar este valor. Para cambiar este valor en el futuro, ÂĄtendrÃĄ que recrear toda la paridad! .PP Una razÃŗn para usar un tamaÃąo de hash diferente es si su sistema tiene memoria limitada. Como regla general, SnapRAID típicamente requiere 1 GiB de RAM por cada 16 TB de datos en el array. .PP Específicamente, para almacenar los hashes de los datos, SnapRAID requiere aproximadamente TS*(1+HS)/BS bytes de RAM, donde TS es el tamaÃąo total en bytes de su array de discos, BS es el tamaÃąo de bloque en bytes, y HS es el tamaÃąo de hash en bytes. .PP Por ejemplo, con 8 discos de 4 TB, un tamaÃąo de bloque de 256 KiB (1 KiB = 1024 bytes) y un tamaÃąo de hash de 16, obtiene: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB .PD 0 .PD .PP Cambiando a un tamaÃąo de hash de 8, obtiene: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB .PD 0 .PD .PP Cambiando a un tamaÃąo de bloque de 512, obtiene: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB .PD 0 .PD .PP Cambiando tanto a un tamaÃąo de hash de 8 como a un tamaÃąo de bloque de 512, obtiene: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES Guarda automÃĄticamente el estado al sincronizar o fregar despuÊs de la cantidad especificada de GB procesados. Esta opciÃŗn es Ãētil para evitar reiniciar comandos \`sync\` largos desde cero si son interrumpidos por un fallo de la mÃĄquina o cualquier otro evento. .SS temp_limit TEMPERATURE_CELSIUS Establece la temperatura mÃĄxima permitida del disco en Celsius. Cuando se especifica, SnapRAID verifica periÃŗdicamente la temperatura de todos los discos utilizando la herramienta smartctl. Las temperaturas actuales del disco se muestran mientras SnapRAID estÃĄ operando. Si algÃēn disco excede este límite, todas las operaciones se detienen y los discos se detienen (se ponen en espera) durante la duraciÃŗn definida por la opciÃŗn \`temp_sleep\`. DespuÊs del período de espera, las operaciones se reanudan, pausÃĄndose potencialmente de nuevo si se alcanza el límite de temperatura una vez mÃĄs. .PP Durante la operaciÃŗn, SnapRAID tambiÊn analiza la curva de calentamiento de cada disco y estima la temperatura constante a largo plazo que se espera que alcancen si la actividad continÃēa. La estimaciÃŗn se realiza solo despuÊs de que la temperatura del disco haya aumentado cuatro veces, asegurando que haya suficientes puntos de datos disponibles para establecer una tendencia confiable. Esta temperatura constante predicha se muestra entre parÊntesis junto al valor actual y ayuda a evaluar si la refrigeraciÃŗn del sistema es adecuada. Esta temperatura estimada es solo para fines informativos y no tiene ningÃēn efecto en el comportamiento de SnapRAID. Las acciones del programa se basan Ãēnicamente en las temperaturas reales medidas del disco. .PP Para realizar este anÃĄlisis, SnapRAID necesita una referencia para la temperatura del sistema. Primero intenta leerla de los sensores de hardware disponibles. Si no se puede acceder a ningÃēn sensor del sistema, utiliza la temperatura del disco mÃĄs baja medida al comienzo de la ejecuciÃŗn como referencia de respaldo. .PP Normalmente, SnapRAID solo muestra la temperatura del disco mÃĄs caliente. Para mostrar la temperatura de todos los discos, use la opciÃŗn \-A o \-\-stats. .SS temp_sleep TIME_IN_MINUTES Establece el tiempo de espera, en minutos, cuando se alcanza el límite de temperatura. Durante este período, los discos permanecen detenidos. El valor predeterminado es de 5 minutos. .SS pool DIR Define el directorio de agrupaciÃŗn (pooling) donde se crea la vista virtual del array de discos utilizando el comando \`pool\`. .PP El directorio ya debe existir. .SS share UNC_DIR Define la ruta UNC de Windows requerida para acceder a los discos de forma remota. .PP Si se especifica esta opciÃŗn, los enlaces simbÃŗlicos creados en el directorio pool utilizan esta ruta UNC para acceder a los discos. Sin esta opciÃŗn, los enlaces simbÃŗlicos generados utilizan solo rutas locales, lo que no permite compartir el directorio pool a travÊs de la red. .PP Los enlaces simbÃŗlicos se forman utilizando la ruta UNC especificada, agregando el nombre del disco como se especifica en la opciÃŗn \`data\`, y finalmente agregando el directorio y el nombre del archivo. .PP Esta opciÃŗn solo es necesaria para Windows. .SS smartctl DISK/PARITY OPTIONS... Define opciones personalizadas de smartctl para obtener los atributos SMART de cada disco. Esto puede ser necesario para controladores RAID y algunos discos USB que no se pueden detectar automÃĄticamente. El marcador de posiciÃŗn %s se reemplaza por el nombre del dispositivo, pero es opcional para dispositivos fijos como controladores RAID. .PP DISK es el mismo nombre de disco especificado en la opciÃŗn \`data\`. PARITY es uno de los nombres de paridad: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` o \`z\-parity\`. .PP En las OPCIONES especificadas, la cadena \`%s\` se reemplaza por el nombre del dispositivo. Para los controladores RAID, el dispositivo es probable que sea fijo y es posible que no necesite usar \`%s\`. .PP Consulte la documentaciÃŗn de smartmontools para conocer las posibles opciones: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP Por ejemplo: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignora el atributo SMART especificado al calcular la probabilidad de fallo del disco. Esta opciÃŗn es Ãētil si un disco informa valores inusuales o engaÃąosos para un atributo en particular. .PP DISK es el mismo nombre de disco especificado en la opciÃŗn \`data\`. PARITY es uno de los nombres de paridad: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` o \`z\-parity\`. El valor especial * se puede usar para ignorar el atributo en todos los discos. .PP Por ejemplo, para ignorar el atributo \`Current Pending Sector Count\` en todos los discos: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Para ignorarlo solo en el primer disco de paridad: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples Un ejemplo de una configuraciÃŗn típica para Unix es: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Un ejemplo de una configuraciÃŗn típica para Windows es: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN Los patrones proporcionan una forma flexible de filtrar archivos para su inclusiÃŗn o exclusiÃŗn. Al usar caracteres de globbing, puede definir reglas que coincidan con nombres de archivos específicos o estructuras de directorios completas sin enumerar cada ruta manualmente. .PP El signo de interrogaciÃŗn \`?\` coincide con cualquier carÃĄcter individual excepto el separador de directorios. Esto lo hace Ãētil para hacer coincidir nombres de archivos con caracteres variables manteniendo el patrÃŗn limitado a un solo nivel de directorio. .PP El asterisco simple \`*\` coincide con cualquier secuencia de caracteres, pero al igual que el signo de interrogaciÃŗn, nunca cruza los límites de los directorios. Se detiene en la barra diagonal, lo que lo hace adecuado para buscar coincidencias dentro de un solo componente de ruta. Este es el comportamiento estÃĄndar de los comodines familiar del globbing de la shell. .PP el doble asterisco \`**\` es mÃĄs potente, coincide con cualquier secuencia de caracteres, incluidos los separadores de directorios. Esto permite que los patrones coincidan a travÊs de mÃēltiples niveles de directorio. Cuando \`**\` aparece incrustado directamente en un patrÃŗn, puede coincidir con cero o mÃĄs caracteres, incluidas las barras diagonales entre el texto literal circundante. .PP El uso mÃĄs importante de \`**\` es en la forma especial \`/**/\`. Esta coincide con cero o mÃĄs niveles de directorio completos, lo que permite que los archivos coincidan a cualquier profundidad en un ÃĄrbol de directorios sin conocer la estructura exacta de la ruta. Por ejemplo, el patrÃŗn \`src/**/main.js\` coincide con \`src/main.js\` (saltando cero directorios), \`src/ui/main.js\` (saltando un directorio) y \`src/ui/components/main.js\` (saltando dos directorios). .PP Las clases de caracteres que utilizan corchetes \`[]\` coinciden con un solo carÃĄcter de un conjunto o rango especificado. Al igual que los otros patrones de un solo carÃĄcter, no coinciden con los separadores de directorios. Las clases admiten rangos y negaciÃŗn mediante un signo de exclamaciÃŗn. .PP La distinciÃŗn fundamental que debe recordar es que \`*\`, \`?\` y las clases de caracteres respetan los límites de los directorios y solo coinciden dentro de un Ãēnico componente de ruta, mientras que \`**\` es el Ãēnico patrÃŗn que puede coincidir a travÊs de los separadores de directorios. .PP Hay cuatro tipos diferentes de patrones: .TP .B FILE Selecciona cualquier archivo llamado FILE. Este patrÃŗn se aplica solo a archivos, no a directorios. .TP .B DIR/ Selecciona cualquier directorio llamado DIR y todo lo que hay dentro. Este patrÃŗn se aplica solo a directorios, no a archivos. .TP .B /PATH/FILE Selecciona la ruta exacta del archivo especificado. Este patrÃŗn se aplica solo a archivos, no a directorios. .TP .B /PATH/DIR/ Selecciona la ruta exacta del directorio especificado y todo lo que hay dentro. Este patrÃŗn se aplica solo a directorios, no a archivos. .PP Cuando especifica una ruta absoluta que comienza con /, se aplica en el directorio raíz del array, no en el directorio raíz del sistema de archivos local. .PP En Windows, puede usar la barra invertida \\ en lugar de la barra /. Los directorios del sistema de Windows, las uniones, los puntos de montaje y otros directorios especiales de Windows se tratan como archivos, lo que significa que para excluirlos, debe usar una regla de archivo, no una de directorio. .PP Si el nombre del archivo contiene un carÃĄcter \`*\`, \`?\`, \`[\`, o \`]\`, debe escaparlo para evitar que se interprete como un carÃĄcter globbing. En Unix, el carÃĄcter de escape es \`\\\`; en Windows, es \`^\`. Cuando el patrÃŗn estÃĄ en la línea de comandos, debe duplicar el carÃĄcter de escape para evitar que sea interpretado por el shell de comandos. .PP En el archivo de configuraciÃŗn, puede usar diferentes estrategias para filtrar los archivos a procesar. El enfoque mÃĄs simple es usar solo reglas \`exclude\` para eliminar todos los archivos y directorios que no desea procesar. Por ejemplo: .PP .RS 4 # Excluye cualquier archivo llamado \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Excluye el directorio raíz \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Excluye cualquier subdirectorio llamado \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP El enfoque opuesto es definir solo los archivos que desea procesar, utilizando solo reglas \`include\`. Por ejemplo: .PP .RS 4 # Incluye solo algunos directorios .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP El enfoque final es mezclar reglas \`exclude\` e \`include\`. En este caso, el orden de las reglas es importante. Las reglas anteriores tienen precedencia sobre las posteriores. Para simplificar, puede enumerar todas las reglas \`exclude\` primero y luego todas las reglas \`include\`. Por ejemplo: .PP .RS 4 # Excluye cualquier archivo llamado \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Excluye cualquier subdirectorio llamado \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Incluye solo algunos directorios .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP En la línea de comandos, usando la opciÃŗn \-f, solo puede usar patrones \`include\`. Por ejemplo: .PP .RS 4 # Verifica solo los archivos .mp3. .PD 0 .PP .PD # En Unix, use comillas para evitar la expansiÃŗn globbing por el shell. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP En Unix, al usar caracteres globbing en la línea de comandos, debe ponerlos entre comillas para evitar que el shell los expanda. .SH IGNORAR ARCHIVOS AdemÃĄs de las reglas globales en el archivo de configuraciÃŗn, puedes colocar archivos \`.snapraidignore\` en cualquier directorio dentro del array para definir reglas de exclusiÃŗn descentralizadas. .PP Las reglas definidas en \`.snapraidignore\` se aplican despuÊs de las reglas del archivo de configuraciÃŗn. Esto significa que tienen una prioridad mÃĄs alta y pueden usarse para excluir archivos que fueron incluidos previamente por la configuraciÃŗn global. Efectivamente, si una regla local coincide, el archivo se excluye independientemente de los ajustes de inclusiÃŗn globales. .PP La lÃŗgica de patrones en \`.snapraidignore\` refleja la configuraciÃŗn global pero ancla los patrones al directorio donde se encuentra el archivo: .TP .B FILE Selecciona cualquier archivo llamado FILE en este directorio o por debajo. Esto sigue las mismas reglas de globbing que el patrÃŗn global. .TP .B DIR/ Selecciona cualquier directorio llamado DIR y todo su contenido, ubicado en este directorio o por debajo. .TP .B /PATH/FILE Selecciona el archivo exacto especificado relativo a la ubicaciÃŗn del archivo \`.snapraidignore\`. .TP .B /PATH/DIR/ Selecciona el directorio exacto especificado y todo su contenido, relativo a la ubicaciÃŗn del archivo \`.snapraidignore\`. .PP A diferencia de la configuraciÃŗn global, los archivos \`.snapraidignore\` solo admiten reglas de exclusiÃŗn; no se pueden usar patrones \`include\` o negaciÃŗn (!). .PP Por ejemplo, si tienes un \`.snapraidignore\` en \`/mnt/disk1/projects/\`: .PP .RS 4 # Excluye SOLO /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Excluye cualquier directorio llamado \`build\` dentro de projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Excluye cualquier archivo .tmp dentro de projects/ o sus subcarpetas .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID almacena la lista y las sumas de comprobaciÃŗn de sus archivos en el archivo de contenido. .PP Es un archivo binario que enumera todos los archivos presentes en su array de discos, junto con todas las sumas de comprobaciÃŗn para verificar su integridad. .PP Este archivo es leído y escrito por los comandos \`sync\` y \`scrub\` y leído por los comandos \`fix\`, \`check\` y \`status\`. .SH PARITY SnapRAID almacena la informaciÃŗn de paridad de su array en los archivos de paridad. .PP Estos son archivos binarios que contienen la paridad calculada de todos los bloques definidos en el archivo \`content\`. .PP Estos archivos son leídos y escritos por los comandos \`sync\` y \`fix\` y solo leídos por los comandos \`scrub\` y \`check\`. .SH ENCODING SnapRAID en Unix ignora cualquier codificaciÃŗn. Lee y almacena los nombres de archivo con la misma codificaciÃŗn utilizada por el sistema de archivos. .PP En Windows, todos los nombres leídos del sistema de archivos se convierten y procesan en formato UTF\-8. .PP Para que los nombres de archivo se impriman correctamente, debe configurar la consola de Windows en modo UTF\-8 con el comando \`chcp 65001\` y usar una fuente TrueType como \`Lucida Console\` como fuente de la consola. Esto afecta solo a los nombres de archivo impresos; si redirige la salida de la consola a un archivo, el archivo resultante siempre estÃĄ en formato UTF\-8. .SH COPYRIGHT Este archivo es Copyright (C) 2025 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-es.d000066400000000000000000002046051522717156100164060ustar00rootroot00000000000000Name{number} snapraid - SnapRAID Backup para Arrays de Discos Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAID es un programa de copia de seguridad diseÃąado para arrays de discos, que almacena informaciÃŗn de paridad para la recuperaciÃŗn de datos en caso de hasta seis fallos de disco. Destinado principalmente a centros de medios domÊsticos con archivos grandes y que cambian con poca frecuencia, SnapRAID ofrece varias características: * Puede utilizar discos ya llenos de archivos sin la necesidad de reformatearlos, accediendo a ellos como de costumbre. * Todos sus datos son hasheados para asegurar la integridad de los datos y prevenir la corrupciÃŗn silenciosa. * Cuando el nÃēmero de discos fallidos excede el recuento de paridad, la pÊrdida de datos se limita a los discos afectados; los datos en otros discos siguen siendo accesibles. * Si elimina archivos accidentalmente en un disco, la recuperaciÃŗn es posible. * Los discos pueden tener diferentes tamaÃąos. * Puede agregar discos en cualquier momento. * SnapRAID no bloquea sus datos; puede dejar de usarlo en cualquier momento sin reformatear ni mover datos. * Para acceder a un archivo, solo un Ãēnico disco necesita girar, ahorrando energía y reduciendo el ruido. Para mÃĄs informaciÃŗn, visite el sitio oficial de SnapRAID: :https://www.snapraid.it/ Limitations SnapRAID es un híbrido entre un programa RAID y un programa de copia de seguridad, con el objetivo de combinar los mejores beneficios de ambos. Sin embargo, tiene algunas limitaciones que debe considerar antes de usarlo. La principal limitaciÃŗn es que si un disco falla y no ha sincronizado recientemente, es posible que no pueda recuperarse por completo. MÃĄs específicamente, es posible que no pueda recuperar hasta el tamaÃąo de los archivos cambiados o eliminados desde la Ãēltima operaciÃŗn de sincronizaciÃŗn. Esto ocurre incluso si los archivos cambiados o eliminados no estÃĄn en el disco fallido. Esta es la razÃŗn por la que SnapRAID es mÃĄs adecuado para datos que rara vez cambian. Por otro lado, los archivos reciÊn agregados no impiden la recuperaciÃŗn de los archivos ya existentes. Solo perderÃĄ los archivos reciÊn agregados si estÃĄn en el disco fallido. Otras limitaciones de SnapRAID son: * Con SnapRAID, aÃēn tiene sistemas de archivos separados para cada disco. Con RAID, obtiene un Ãēnico sistema de archivos grande. * SnapRAID no distribuye (stripe) los datos. Con RAID, obtiene un aumento de velocidad con la distribuciÃŗn. * SnapRAID no admite la recuperaciÃŗn en tiempo real. Con RAID, no tiene que dejar de trabajar cuando falla un disco. * SnapRAID puede recuperar datos solo de un nÃēmero limitado de fallos de disco. Con una copia de seguridad, puede recuperarse de un fallo completo de todo el array de discos. * Solo se guardan nombres de archivo, marcas de tiempo, enlaces simbÃŗlicos y enlaces duros. Los permisos, la propiedad y los atributos extendidos no se guardan. Getting Started Para usar SnapRAID, primero debe seleccionar un disco en su array de discos para dedicarlo a la informaciÃŗn de `parity` (paridad). Con un disco para paridad, podrÃĄ recuperarse de un solo fallo de disco, similar a RAID5. Si desea recuperarse de mÃĄs fallos de disco, similar a RAID6, debe reservar discos adicionales para la paridad. Cada disco de paridad adicional permite la recuperaciÃŗn de un fallo de disco mÃĄs. Como discos de paridad, debe elegir los discos mÃĄs grandes del array, ya que la informaciÃŗn de paridad puede crecer hasta el tamaÃąo del disco de datos mÃĄs grande del array. Estos discos estarÃĄn dedicados a almacenar los archivos de `parity`. No debe almacenar sus datos en ellos. Luego, debe definir los discos de `data` (datos) que desea proteger con SnapRAID. La protecciÃŗn es mÃĄs efectiva si estos discos contienen datos que rara vez cambian. Por esta razÃŗn, es mejor NO incluir el disco C:\ de Windows o los directorios /home, /var y /tmp de Unix. La lista de archivos se guarda en los archivos de `content` (contenido), generalmente almacenados en los discos de datos, paridad o de arranque. Este archivo contiene los detalles de su copia de seguridad, incluyendo todas las sumas de comprobaciÃŗn para verificar su integridad. El archivo de `content` se almacena en mÃēltiples copias, y cada copia debe estar en un disco diferente para asegurar que, incluso en caso de mÃēltiples fallos de disco, al menos una copia estÊ disponible. Por ejemplo, suponga que solo estÃĄ interesado en un nivel de paridad de protecciÃŗn, y sus discos estÃĄn ubicados en: :/mnt/diskp <- disco seleccionado para paridad :/mnt/disk1 <- primer disco a proteger :/mnt/disk2 <- segundo disco a proteger :/mnt/disk3 <- tercer disco a proteger Debe crear el archivo de configuraciÃŗn /etc/snapraid.conf con las siguientes opciones: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Si estÃĄ en Windows, debe usar el formato de ruta de Windows, con letras de unidad y barras invertidas en lugar de barras. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Si tiene muchos discos y se queda sin letras de unidad, puede montar discos directamente en subcarpetas. Consulte: :https://www.google.com/search?q=Windows+mount+point En este punto, estÃĄ listo para ejecutar el comando `sync` (sincronizar) para construir la informaciÃŗn de paridad. :snapraid sync Este proceso puede llevar varias horas la primera vez, dependiendo del tamaÃąo de los datos ya presentes en los discos. Si los discos estÃĄn vacíos, el proceso es inmediato. Puede detenerlo en cualquier momento presionando Ctrl+C, y en la siguiente ejecuciÃŗn, se reanudarÃĄ donde se interrumpiÃŗ. Cuando este comando se complete, sus datos estarÃĄn SEGUROS. Ahora puede comenzar a usar su array como desee y periÃŗdicamente actualizar la informaciÃŗn de paridad ejecutando el comando `sync`. Scrubbing Para verificar periÃŗdicamente los datos y la paridad en busca de errores, puede ejecutar el comando `scrub` (fregar/limpiar). :snapraid scrub Este comando compara los datos de su array con el hash calculado durante el comando `sync` para verificar la integridad. Cada ejecuciÃŗn del comando verifica aproximadamente el 8% del array, excluyendo los datos ya fregados en los 10 días anteriores. Puede usar la opciÃŗn -p, --plan para especificar una cantidad diferente y la opciÃŗn -o, --older-than para especificar una edad diferente en días. Por ejemplo, para verificar el 5% del array en busca de bloques con mÃĄs de 20 días, use: :snapraid -p 5 -o 20 scrub Si se encuentran errores silenciosos o de entrada/salida durante el proceso, los bloques correspondientes se marcan como defectuosos en el archivo de `content` y se listan en el comando `status`. :snapraid status Para corregirlos, puede usar el comando `fix` (arreglar), filtrando por bloques defectuosos con la opciÃŗn -e, --filter-error: :snapraid -e fix En el siguiente `scrub`, los errores desaparecerÃĄn del informe de `status` si realmente se han corregido. Para hacerlo mÃĄs rÃĄpido, puede usar -p bad para fregar solo los bloques marcados como defectuosos. :snapraid -p bad scrub Ejecutar `scrub` en un array no sincronizado puede reportar errores causados por archivos eliminados o modificados. Estos errores se informan en la salida de `scrub`, pero los bloques relacionados no se marcan como defectuosos. Pooling Nota: La funciÃŗn de pooling descrita a continuaciÃŗn ha sido sustituida por la herramienta mergerfs, que ahora es la opciÃŗn recomendada para los usuarios de Linux en la comunidad SnapRAID. Mergefs proporciona una forma mÃĄs flexible y eficiente de agrupar mÃēltiples unidades en un Ãēnico punto de montaje unificado, permitiendo un acceso sin problemas a los archivos en todo su array sin depender de enlaces simbÃŗlicos. Se integra bien con SnapRAID para la protecciÃŗn de paridad y se usa comÃēnmente en configuraciones como OpenMediaVault (OMV) o configuraciones NAS personalizadas. Para que todos los archivos de su array se muestren en el mismo ÃĄrbol de directorios, puede habilitar la funciÃŗn de `pooling` (agrupaciÃŗn). Crea una vista virtual de solo lectura de todos los archivos de su array utilizando enlaces simbÃŗlicos. Puede configurar el directorio de `pooling` en el archivo de configuraciÃŗn con: :pool /pool o, si estÃĄ en Windows, con: :pool C:\pool y luego ejecute el comando `pool` para crear o actualizar la vista virtual. :snapraid pool Si estÃĄ utilizando una plataforma Unix y desea compartir este directorio a travÊs de la red con mÃĄquinas Windows o Unix, debe agregar las siguientes opciones a su /etc/samba/smb.conf: :# En la secciÃŗn global de smb.conf :unix extensions = no :# En la secciÃŗn de compartir de smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes En Windows, compartir enlaces simbÃŗlicos a travÊs de una red requiere que los clientes los resuelvan de forma remota. Para habilitar esto, ademÃĄs de compartir el directorio pool, tambiÊn debe compartir todos los discos de forma independiente, utilizando los nombres de disco definidos en el archivo de configuraciÃŗn como puntos de recurso compartido. TambiÊn debe especificar en la opciÃŗn `share` del archivo de configuraciÃŗn la ruta UNC de Windows que los clientes remotos necesitan usar para acceder a estos discos compartidos. Por ejemplo, operando desde un servidor llamado `darkstar`, puede usar las opciones: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar y compartir los siguientes directorios a travÊs de la red: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array para permitir que los clientes remotos accedan a todos los archivos en \\darkstar\pool. TambiÊn puede que deba configurar los clientes remotos para habilitar el acceso a enlaces simbÃŗlicos remotos con el comando: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAID funciona mÃĄs como un programa de copia de seguridad que como un sistema RAID, y se puede usar para restaurar o recuperar archivos a su estado anterior usando la opciÃŗn -f, --filter: :snapraid fix -f FILE o para un directorio: :snapraid fix -f DIR/ TambiÊn puede usarlo para recuperar solo archivos eliminados accidentalmente dentro de un directorio usando la opciÃŗn -m, --filter-missing, que restaura solo archivos faltantes, dejando todos los demÃĄs intactos. :snapraid fix -m -f DIR/ O para recuperar todos los archivos eliminados en todas las unidades con: :snapraid fix -m Recovering Ha sucedido lo peor, ÂĄy ha perdido uno o mÃĄs discos! ÂĄNO ENTRE EN PÁNICO! ÂĄPodrÃĄ recuperarlos! Lo primero que debe hacer es evitar mÃĄs cambios en su array de discos. Deshabilite cualquier conexiÃŗn remota a Êl y cualquier proceso programado, incluida cualquier sincronizaciÃŗn o fregado nocturno programado de SnapRAID. Luego, proceda con los siguientes pasos. STEP 1 -> Reconfigure Necesita algo de espacio para recuperarse, idealmente en discos de repuesto adicionales, pero un disco USB externo o un disco remoto serÃĄn suficientes. Modifique el archivo de configuraciÃŗn de SnapRAID para hacer que la opciÃŗn `data` o `parity` del disco fallido apunte a una ubicaciÃŗn con suficiente espacio vacío para recuperar los archivos. Por ejemplo, si el disco `d1` ha fallado, cambie de: :data d1 /mnt/disk1/ a: :data d1 /mnt/new_spare_disk/ Si el disco a recuperar es un disco de paridad, actualice la opciÃŗn `parity` apropiada. Si tiene varios discos fallidos, actualice todas sus opciones de configuraciÃŗn. STEP 2 -> Fix Ejecute el comando fix, almacenando el registro en un archivo externo con: :snapraid -d NAME -l fix.log fix Donde NAME es el nombre del disco, como `d1` en nuestro ejemplo anterior. Si el disco a recuperar es un disco de paridad, use los nombres `parity`, `2-parity`, etc. Si tiene varios discos fallidos, use varias opciones -d para especificarlos todos. Este comando tardarÃĄ mucho tiempo. AsegÃērese de tener unos pocos gigabytes libres para almacenar el archivo fix.log. EjecÃētelo desde un disco con suficiente espacio libre. Ahora ha recuperado todo lo que es recuperable. Si algunos archivos son parcial o totalmente irrecuperables, se les cambiarÃĄ el nombre agregando la extensiÃŗn `.unrecoverable`. Puede encontrar una lista detallada de todos los bloques irrecuperables en el archivo fix.log buscando todas las líneas que comienzan con `unrecoverable:`. Si no estÃĄ satisfecho con la recuperaciÃŗn, puede volver a intentarlo tantas veces como desee. Por ejemplo, si ha eliminado archivos del array despuÊs de la Ãēltima `sync`, esto puede resultar en que algunos archivos no se recuperen. En este caso, puede volver a intentar el `fix` usando la opciÃŗn -i, --import, especificando dÃŗnde estÃĄn esos archivos ahora para incluirlos nuevamente en el proceso de recuperaciÃŗn. Si estÃĄ satisfecho con la recuperaciÃŗn, puede continuar, ÂĄpero tenga en cuenta que despuÊs de sincronizar, no puede volver a intentar el comando `fix`! STEP 3 -> Check Como verificaciÃŗn cautelosa, ahora puede ejecutar un comando `check` (comprobar) para asegurarse de que todo estÊ correcto en el disco recuperado. :snapraid -d NAME -a check Donde NAME es el nombre del disco, como `d1` en nuestro ejemplo anterior. Las opciones -d y -a le dicen a SnapRAID que compruebe solo el disco especificado e ignore todos los datos de paridad. Este comando tardarÃĄ mucho tiempo, pero si no es demasiado cauteloso, puede omitirlo. STEP 4 -> Sync Ejecute el comando `sync` para resincronizar el array con el nuevo disco. :snapraid sync Si todo se recupera, este comando es inmediato. Commands SnapRAID proporciona algunos comandos simples que le permiten: * Imprimir el estado del array -> `status` * Controlar los discos -> `smart`, `probe`, `up`, `down` * Hacer una copia de seguridad/instantÃĄnea -> `sync` * Comprobar periÃŗdicamente los datos -> `scrub` * Restaurar la Ãēltima copia de seguridad/instantÃĄnea -> `fix`. Los comandos deben escribirse en minÃēsculas. status Imprime un resumen del estado del array de discos. Incluye informaciÃŗn sobre la fragmentaciÃŗn de la paridad, la antigÃŧedad de los bloques sin verificar y todos los errores silenciosos registrados encontrados durante el fregado. La informaciÃŗn presentada se refiere a la Ãēltima vez que ejecutÃŗ `sync`. Las modificaciones posteriores no se tienen en cuenta. Si se detectaron bloques defectuosos, se enumeran sus nÃēmeros de bloque. Para corregirlos, puede usar el comando `fix -e`. TambiÊn muestra un grÃĄfico que representa la Ãēltima vez que cada bloque fue fregado o sincronizado. Los bloques fregados se muestran con `*`, los bloques sincronizados pero aÃēn no fregados con `o`. Nada se modifica. smart Imprime un informe SMART de todos los discos del sistema. Incluye una estimaciÃŗn de la probabilidad de fallo en el prÃŗximo aÃąo, lo que le permite planificar reemplazos de mantenimiento de discos que muestren atributos sospechosos. Esta estimaciÃŗn de probabilidad se obtiene correlacionando los atributos SMART de los discos con los datos de Backblaze disponibles en: :https://www.backblaze.com/hard-drive-test-data.html Si SMART informa que un disco estÃĄ fallando, se imprime `FAIL` o `PREFAIL` para ese disco, y SnapRAID regresa con un error. En este caso, se recomienda encarecidamente el reemplazo inmediato del disco. Otras posibles cadenas de estado son: logfail - En el pasado, algunos atributos estaban por debajo del umbral. logerr - El registro de errores del dispositivo contiene errores. selferr - El registro de autoprueba del dispositivo contiene errores. Si se especifica la opciÃŗn -v, --verbose, se proporciona un anÃĄlisis estadístico mÃĄs profundo. Este anÃĄlisis puede ayudarle a decidir si necesita mÃĄs o menos paridad. Este comando utiliza la herramienta `smartctl` y es equivalente a ejecutar `smartctl -a` en todos los dispositivos. Si sus dispositivos no se detectan automÃĄticamente correctamente, puede especificar un comando personalizado utilizando la opciÃŗn `smartctl` en el archivo de configuraciÃŗn. Nada se modifica. probe Imprime el estado de ENERGÍA de todos los discos del sistema. `Standby` significa que el disco no estÃĄ girando. `Active` significa que el disco estÃĄ girando. Este comando utiliza la herramienta `smartctl` y es equivalente a ejecutar `smartctl -n standby -i` en todos los dispositivos. Si sus dispositivos no se detectan automÃĄticamente correctamente, puede especificar un comando personalizado utilizando la opciÃŗn `smartctl` en el archivo de configuraciÃŗn. Nada se modifica. up Pone en marcha (gira) todos los discos del array. Puede poner en marcha solo discos específicos usando la opciÃŗn -d, --filter-disk. Poner en marcha todos los discos al mismo tiempo requiere mucha energía. AsegÃērese de que su fuente de alimentaciÃŗn pueda soportarlo. Nada se modifica. down Detiene (deja de girar) todos los discos del array. Este comando utiliza la herramienta `smartctl` y es equivalente a ejecutar `smartctl -s standby,now` en todos los dispositivos. Puede detener solo discos específicos usando la opciÃŗn -d, --filter-disk. Para detener automÃĄticamente en caso de error, puede usar la opciÃŗn -s, --spin-down-on-error con cualquier otro comando, lo cual es equivalente a ejecutar `down` manualmente cuando ocurre un error. Nada se modifica. diff Enumera todos los archivos modificados desde el Ãēltimo `sync` que necesitan que se vuelva a calcular su informaciÃŗn de paridad. Este comando no verifica los datos del archivo, sino solo la marca de tiempo, el tamaÃąo y el inodo del archivo. DespuÊs de enumerar todos los archivos cambiados, se presenta un resumen de los cambios, agrupados por: equal - Archivos sin cambios desde antes. added - Archivos agregados que no estaban presentes antes. removed - Archivos eliminados. updated - Archivos con un tamaÃąo o marca de tiempo diferente, lo que significa que fueron modificados. moved - Archivos movidos a un directorio diferente en el mismo disco. Se identifican por tener el mismo nombre, tamaÃąo, marca de tiempo e inodo, pero un directorio diferente. copied - Archivos copiados en el mismo disco o en uno diferente donde el archivo original todavía existe. Se identifican por tener el mismo nombre, tamaÃąo y marca de tiempo. Si la marca de tiempo de subsegundo es cero, la ruta completa debe coincidir para ser identificado, no solo el nombre. relocated - Archivos movidos en el mismo disco o en uno diferente donde el original ha desaparecido. Se identifican por tener el mismo nombre, tamaÃąo y marca de tiempo. Si la marca de tiempo de subsegundo es cero, la ruta completa debe coincidir para ser identificado. A diferencia de los archivos `moved` en el mismo disco, los archivos reubicados tienen un inodo diferente. restored - Archivos con un inodo diferente pero con directorio, nombre, tamaÃąo y marca de tiempo coincidentes. Estos son usualmente archivos restaurados despuÊs de haber sido eliminados. Si se requiere un `sync`, el cÃŗdigo de retorno del proceso es 2, en lugar del valor predeterminado 0. El cÃŗdigo de retorno 1 se utiliza para una condiciÃŗn de error genÊrico. Nada se modifica. sync Actualiza la informaciÃŗn de paridad. Todos los archivos modificados en el array de discos se leen y la informaciÃŗn de paridad correspondiente se actualiza. Puede detener este proceso en cualquier momento presionando Ctrl+C, sin perder el trabajo ya realizado. En la siguiente ejecuciÃŗn, el proceso `sync` se reanudarÃĄ donde se interrumpiÃŗ. Si se encuentran errores silenciosos o de entrada/salida durante el proceso, los bloques correspondientes se marcan como defectuosos. Los archivos se identifican por ruta y/o inodo y se verifican por tamaÃąo y marca de tiempo. Si el tamaÃąo o la marca de tiempo del archivo difieren, la informaciÃŗn de paridad se vuelve a calcular para todo el archivo. Si el archivo se mueve o se renombra en el mismo disco, manteniendo el mismo inodo, la paridad no se vuelve a calcular. Si el archivo se mueve a otro disco, la paridad se vuelve a calcular, pero la informaciÃŗn de hash calculada previamente se mantiene. Los archivos `content` y `parity` se modifican si es necesario. Los archivos en el array NO se modifican. scrub Frota (scrubs) el array, buscando errores silenciosos o de entrada/salida en los discos de datos y paridad. Cada invocaciÃŗn verifica aproximadamente el 8% del array, excluyendo los datos ya fregados en los Ãēltimos 10 días. Esto significa que fregar una vez a la semana asegura que cada bit de datos se verifique al menos una vez cada tres meses. Puede definir un plan de fregado o una cantidad diferente utilizando la opciÃŗn -p, --plan, que acepta: bad - Fregar bloques marcados como defectuosos. new - Fregar bloques reciÊn sincronizados que aÃēn no han sido fregados. full - Fregar todo. 0-100 - Fregar el porcentaje especificado de bloques. Si especifica un valor de porcentaje, tambiÊn puede usar la opciÃŗn -o, --older-than para definir la antigÃŧedad del bloque. Los bloques mÃĄs antiguos se friegan primero, asegurando una verificaciÃŗn Ãŗptima. Si desea fregar solo los bloques reciÊn sincronizados que aÃēn no han sido fregados, use la opciÃŗn `-p new`. Para obtener detalles del estado del fregado, use el comando `status`. Para cualquier error silencioso o de entrada/salida encontrado, los bloques correspondientes se marcan como defectuosos en el archivo `content`. Estos bloques defectuosos se enumeran en `status` y se pueden corregir con `fix -e`. DespuÊs de la correcciÃŗn, en el siguiente fregado, se volverÃĄn a verificar y, si se encuentran corregidos, se eliminarÃĄ la marca de defectuoso. Para fregar solo los bloques defectuosos, puede usar el comando `scrub -p bad`. Se recomienda ejecutar `scrub` solo en un array sincronizado para evitar errores reportados causados por datos no sincronizados. Estos errores se reconocen como no siendo errores silenciosos y los bloques no se marcan como defectuosos, pero tales errores se informan en la salida del comando. El archivo `content` se modifica para actualizar el tiempo de la Ãēltima verificaciÃŗn de cada bloque y para marcar bloques defectuosos. Los archivos `parity` NO se modifican. Los archivos en el array NO se modifican. fix Corrige todos los archivos y la informaciÃŗn de paridad. Todos los archivos y la informaciÃŗn de paridad se comparan con el estado de instantÃĄnea guardado en el Ãēltimo `sync`. Si se encuentra una diferencia, se revierte a la instantÃĄnea almacenada. ÂĄADVERTENCIA! El comando `fix` no diferencia entre errores y modificaciones intencionales. Revierte incondicionalmente el estado del archivo al Ãēltimo `sync`. Si no se especifica otra opciÃŗn, se procesa todo el array. Utilice las opciones de filtro para seleccionar un subconjunto de archivos o discos para operar. Para corregir solo los bloques marcados como defectuosos durante `sync` y `scrub`, use la opciÃŗn -e, --filter-error. A diferencia de otras opciones de filtro, esta aplica correcciones solo a archivos que no han cambiado desde el Ãēltimo `sync`. SnapRAID cambia el nombre de todos los archivos que no se pueden corregir agregando la extensiÃŗn `.unrecoverable`. Antes de corregir, se escanea todo el array para encontrar cualquier archivo movido desde la Ãēltima operaciÃŗn de `sync`. Estos archivos se identifican por su marca de tiempo, ignorando su nombre y directorio, y se utilizan en el proceso de recuperaciÃŗn si es necesario. Si moviÃŗ algunos de ellos fuera del array, puede usar la opciÃŗn -i, --import para especificar directorios adicionales para escanear. Los archivos se identifican solo por ruta, no por inodo. El archivo `content` NO se modifica. Los archivos `parity` se modifican si es necesario. Los archivos en el array se modifican si es necesario. check Verifica todos los archivos y la informaciÃŗn de paridad. Funciona como `fix`, pero solo simula una recuperaciÃŗn y no se escriben cambios en el array. Este comando estÃĄ destinado principalmente a la verificaciÃŗn manual, como despuÊs de un proceso de recuperaciÃŗn o en otras condiciones especiales. Para comprobaciones periÃŗdicas y programadas, use `scrub`. Si usa la opciÃŗn -a, --audit-only, solo se verifican los datos del archivo y se ignora la informaciÃŗn de paridad para una ejecuciÃŗn mÃĄs rÃĄpida. Los archivos se identifican solo por ruta, no por inodo. Nada se modifica. list Enumera todos los archivos contenidos en el array en el momento del Ãēltimo `sync`. Con -v o --verbose, tambiÊn se muestra el tiempo de subsegundo. Nada se modifica. dup Enumera todos los archivos duplicados. Se supone que dos archivos son iguales si sus hashes coinciden. Los datos del archivo no se leen; solo se utilizan los hashes precalculados. Nada se modifica. pool Crea o actualiza una vista virtual de todos los archivos de su array de discos en el directorio de `pooling`. Los archivos no se copian sino que se enlazan usando enlaces simbÃŗlicos. Al actualizar, todos los enlaces simbÃŗlicos existentes y los subdirectorios vacíos se eliminan y se reemplazan con la nueva vista del array. Cualquier otro archivo regular se deja en su lugar. Nada se modifica fuera del directorio pool. devices Imprime los dispositivos de bajo nivel utilizados por el array. Este comando muestra las asociaciones de dispositivos en el array y estÃĄ destinado principalmente como una interfaz de script. Las primeras dos columnas son el ID y la ruta del dispositivo de bajo nivel. Las siguientes dos columnas son el ID y la ruta del dispositivo de alto nivel. La Ãēltima columna es el nombre del disco en el array. En la mayoría de los casos, tiene un dispositivo de bajo nivel para cada disco en el array, pero en algunas configuraciones mÃĄs complejas, puede tener mÃēltiples dispositivos de bajo nivel utilizados por un solo disco en el array. Nada se modifica. touch Establece una marca de tiempo de subsegundo arbitraria para todos los archivos que la tienen establecida en cero. Esto mejora la capacidad de SnapRAID para reconocer archivos movidos y copiados, ya que hace que la marca de tiempo sea casi Ãēnica, reduciendo posibles duplicados. MÃĄs específicamente, si la marca de tiempo de subsegundo no es cero, un archivo movido o copiado se identifica como tal si coincide con el nombre, el tamaÃąo y la marca de tiempo. Si la marca de tiempo de subsegundo es cero, se considera una copia solo si la ruta completa, el tamaÃąo y la marca de tiempo coinciden. La marca de tiempo de precisiÃŗn de segundo no se modifica, por lo que se conservarÃĄn todas las fechas y horas de sus archivos. rehash Programa un nuevo cÃĄlculo de hash (rehash) de todo el array. Este comando cambia el tipo de hash utilizado, típicamente al actualizar de un sistema de 32 bits a uno de 64 bits, para cambiar de MurmurHash3 al mÃĄs rÃĄpido SpookyHash. Si ya estÃĄ utilizando el hash Ãŗptimo, este comando no hace nada y le informa que no se necesita ninguna acciÃŗn. El nuevo cÃĄlculo de hash no se realiza inmediatamente, sino que tiene lugar progresivamente durante `sync` y `scrub`. Puede verificar el estado del nuevo cÃĄlculo de hash usando `status`. Durante el nuevo cÃĄlculo de hash, SnapRAID mantiene la funcionalidad completa, con la Ãēnica excepciÃŗn de que `dup` no puede detectar archivos duplicados utilizando un hash diferente. locate Localiza archivos almacenados en los discos de paridad. Para cada archivo coincidente, imprime su ubicaciÃŗn dentro del archivo de paridad y el nÃēmero de fragmentos que ocupa. Puede usar la opciÃŗn -t, --tail para restringir la operaciÃŗn a los archivos que ocupan la porciÃŗn final especificada de la paridad. Si desea reasignar estos archivos, puede usar la opciÃŗn -W, --force-realloc-tail. Tenga en cuenta que dichos archivos no estarÃĄn protegidos por la paridad durante el proceso de reasignaciÃŗn. Options SnapRAID proporciona las siguientes opciones: -c, --conf CONFIG Selecciona el archivo de configuraciÃŗn a usar. Si no se especifica, en Unix utiliza el archivo `/usr/local/etc/snapraid.conf` si existe, de lo contrario `/etc/snapraid.conf`. En Windows, utiliza el archivo `snapraid.conf` en el mismo directorio que `snapraid.exe`. -f, --filter PATTERN Filtra los archivos a procesar en `check` y `fix`. Solo se procesan los archivos que coinciden con el patrÃŗn especificado. Esta opciÃŗn se puede usar varias veces. Consulte la secciÃŗn PATTERN para obtener mÃĄs detalles sobre las especificaciones de patrones. En Unix, asegÃērese de que los caracteres globbing estÊn entre comillas si se usan. Esta opciÃŗn solo se puede usar con `check` y `fix`. No se puede usar con `sync` y `scrub`, ya que siempre procesan todo el array. -d, --filter-disk NAME Filtra los discos a procesar en `check`, `fix`, `up` y `down`. Debe especificar un nombre de disco como se define en el archivo de configuraciÃŗn. TambiÊn puede especificar discos de paridad con los nombres: `parity`, `2-parity`, `3-parity`, etc., para limitar las operaciones a un disco de paridad específico. Si combina mÃēltiples opciones --filter, --filter-disk y --filter-missing, solo se seleccionan los archivos que coinciden con todos los filtros. Esta opciÃŗn se puede usar varias veces. Esta opciÃŗn solo se puede usar con `check`, `fix`, `up` y `down`. No se puede usar con `sync` y `scrub`, ya que siempre procesan todo el array. -m, --filter-missing Filtra los archivos a procesar en `check` y `fix`. Solo se procesan los archivos faltantes o eliminados del array. Cuando se usa con `fix`, esto actÃēa como un comando de `undelete` (recuperaciÃŗn). Si combina mÃēltiples opciones --filter, --filter-disk y --filter-missing, solo se seleccionan los archivos que coinciden con todos los filtros. Esta opciÃŗn solo se puede usar con `check` y `fix`. No se puede usar con `sync` y `scrub`, ya que siempre procesan todo el array. -e, --filter-error Procesa los archivos con errores en `check` y `fix`. Solo procesa archivos que tienen bloques marcados con errores silenciosos o de entrada/salida durante `sync` y `scrub`, segÃēn se enumeran en `status`. Esta opciÃŗn solo se puede usar con `check` y `fix`. -p, --plan PERC|bad|new|full Selecciona el plan de fregado (scrub). Si PERC es un valor numÊrico de 0 a 100, se interpreta como el porcentaje de bloques a fregar. En lugar de un porcentaje, puede especificar un plan: `bad` friega bloques defectuosos, `new` friega bloques aÃēn no fregados, y `full` friega todo. Esta opciÃŗn solo se puede usar con `scrub`. -o, --older-than DAYS Selecciona la parte mÃĄs antigua del array para procesar en `scrub`. DAYS es la edad mínima en días para que un bloque sea fregado; el valor predeterminado es 10. Los bloques marcados como defectuosos siempre se friegan independientemente de esta opciÃŗn. Esta opciÃŗn solo se puede usar con `scrub`. -a, --audit-only En `check`, verifica el hash de los archivos sin verificar la informaciÃŗn de paridad. Si solo estÃĄ interesado en verificar los datos del archivo, esta opciÃŗn puede acelerar significativamente el proceso de verificaciÃŗn. Esta opciÃŗn solo se puede usar con `check`. -h, --pre-hash En `sync`, ejecuta una fase de hash preliminar de todos los datos nuevos para una verificaciÃŗn adicional antes del cÃĄlculo de paridad. Normalmente, en `sync`, no se realiza un hash preliminar, y los nuevos datos se hashean justo antes del cÃĄlculo de paridad cuando se leen por primera vez. Este proceso ocurre cuando el sistema estÃĄ bajo una gran carga, con todos los discos girando y una CPU ocupada. Esta es una condiciÃŗn extrema para la mÃĄquina, y si tiene un problema de hardware latente, los errores silenciosos pueden pasar desapercibidos porque los datos aÃēn no estÃĄn hasheados. Para evitar este riesgo, puede habilitar el modo `pre-hash` para que todos los datos se lean dos veces para garantizar su integridad. Esta opciÃŗn tambiÊn verifica los archivos movidos dentro del array para asegurar que la operaciÃŗn de movimiento fue exitosa y, si es necesario, le permite ejecutar una operaciÃŗn de correcciÃŗn antes de continuar. Esta opciÃŗn solo se puede usar con `sync`. -i, --import DIR Importa desde el directorio especificado cualquier archivo eliminado del array despuÊs del Ãēltimo `sync`. Si aÃēn tiene dichos archivos, `check` y `fix` pueden usarlos para mejorar el proceso de recuperaciÃŗn. Los archivos se leen, incluso en subdirectorios, y se identifican independientemente de su nombre. Esta opciÃŗn solo se puede usar con `check` y `fix`. -s, --spin-down-on-error En cualquier error, detiene todos los discos gestionados antes de salir con un cÃŗdigo de estado distinto de cero. Esto evita que las unidades permanezcan activas y girando despuÊs de una operaciÃŗn abortada, lo que ayuda a evitar la acumulaciÃŗn de calor innecesaria y el consumo de energía. Use esta opciÃŗn para asegurarse de que los discos se detengan de forma segura incluso cuando un comando falla. -w, --bw-limit RATE Aplica un límite de ancho de banda global para todos los discos. RATE es el nÃēmero de bytes por segundo. Puede especificar un multiplicador como K, M o G (por ejemplo, --bw-limit 1G). -t, --tail TAMAÑO Limita la lista de archivos a aquellos que no usan mÃĄs del tamaÃąo de cola especificado de los discos de paridad. Puede usar multiplicadores como K, M, G o T (por ejemplo, --tail 1G). Esta opciÃŗn solo es vÃĄlida cuando se usa junto con el comando `locate`. -A, --stats Habilita una vista de estado extendida que muestra informaciÃŗn adicional. La pantalla muestra dos grÃĄficos: El primer grÃĄfico muestra el nÃēmero de franjas (stripes) almacenadas en bÃēfer para cada disco, junto con la ruta del archivo al que se estÃĄ accediendo actualmente en ese disco. Normalmente, el disco mÃĄs lento no tendrÃĄ bÃēfer disponible, lo que determina el ancho de banda mÃĄximo alcanzable. El segundo grÃĄfico muestra el porcentaje de tiempo dedicado a esperar durante los Ãēltimos 100 segundos. Se espera que el disco mÃĄs lento cause la mayor parte del tiempo de espera, mientras que otros discos deberían tener poco o ningÃēn tiempo de espera porque pueden usar sus franjas almacenadas en bÃēfer. Este grÃĄfico tambiÊn muestra el tiempo dedicado a esperar los cÃĄlculos de hash y los cÃĄlculos RAID. Todos los cÃĄlculos se ejecutan en paralelo con las operaciones de disco. Por lo tanto, mientras haya un tiempo de espera medible para al menos un disco, indica que la CPU es lo suficientemente rÃĄpida para mantenerse al día con la carga de trabajo. -Z, --force-zero Fuerza la operaciÃŗn insegura de sincronizar un archivo con tamaÃąo cero que antes no era cero. Si SnapRAID detecta tal condiciÃŗn, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar fÃĄcilmente cuando, despuÊs de un fallo del sistema, algunos archivos accedidos fueron truncados. Esta es una posible condiciÃŗn en Linux con los sistemas de archivos ext3/ext4. Esta opciÃŗn solo se puede usar con `sync`. -E, --force-empty Fuerza la operaciÃŗn insegura de sincronizar un disco con todos los archivos originales faltantes. Si SnapRAID detecta que todos los archivos originalmente presentes en el disco faltan o han sido reescritos, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar fÃĄcilmente cuando un sistema de archivos de datos no estÃĄ montado. Sin embargo, se permite tener un solo cambio de UUID con paridad simple, y mÃĄs con paridad mÃēltiple, porque este es el caso normal al reemplazar discos despuÊs de una recuperaciÃŗn. Esta opciÃŗn solo se puede usar con `sync`. -U, --force-uuid Fuerza la operaciÃŗn insegura de sincronizar, verificar y corregir con discos que han cambiado su UUID. Si SnapRAID detecta que algunos discos han cambiado el UUID, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar cuando sus discos estÃĄn montados en los puntos de montaje incorrectos. Esta opciÃŗn solo se puede usar con `sync`, `check` o `fix`. -D, --force-device Fuerza la operaciÃŗn insegura de corregir con discos inaccesibles o con discos en el mismo dispositivo físico. Por ejemplo, si perdiÃŗ dos discos de datos y tiene un disco de repuesto para recuperar solo el primero, puede ignorar el segundo disco inaccesible. O, si desea recuperar un disco en el espacio libre que queda en un disco ya usado, compartiendo el mismo dispositivo físico. Esta opciÃŗn solo se puede usar con `fix`. -N, --force-nocopy En `sync`, `check` y `fix`, deshabilita la heurística de detecciÃŗn de copias. Sin esta opciÃŗn, SnapRAID asume que los archivos con los mismos atributos, como nombre, tamaÃąo y marca de tiempo, son copias con los mismos datos. Esto permite la identificaciÃŗn de archivos copiados o movidos de un disco a otro y reutiliza la informaciÃŗn de hash ya calculada para detectar errores silenciosos o recuperar archivos faltantes. En algunos casos raros, este comportamiento puede dar lugar a falsos positivos o a un proceso lento debido a muchas verificaciones de hash, y esta opciÃŗn le permite resolver tales problemas. Esta opciÃŗn solo se puede usar con `sync`, `check` y `fix`. -F, --force-full En `sync`, fuerza un recÃĄlculo completo de la paridad. Esta opciÃŗn se puede usar cuando agrega un nuevo nivel de paridad o si revirtiÃŗ a un archivo de contenido antiguo utilizando datos de paridad mÃĄs recientes. En lugar de recrear la paridad desde cero, esto le permite reutilizar los hashes presentes en el archivo de contenido para validar los datos y mantener la protecciÃŗn de datos durante el proceso `sync` utilizando los datos de paridad existentes. Esta opciÃŗn solo se puede usar con `sync`. -R, --force-realloc En `sync`, fuerza una reasignaciÃŗn completa de archivos y la reconstrucciÃŗn de la paridad. Esta opciÃŗn se puede usar para reasignar completamente todos los archivos, eliminando la fragmentaciÃŗn, mientras se reutilizan los hashes presentes en el archivo de contenido para validar los datos. Esta opciÃŗn solo se puede usar con `sync`. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no usarla. NO tiene protecciÃŗn de datos durante la operaciÃŗn `sync`. -W, --force-realloc-tail TAMAÑO Funciona como -R, --force-realloc, pero limitado a la porciÃŗn final especificada (Ãēltimos TAMAÑO bytes) de cada archivo de paridad. Fuerza la reasignaciÃŗn (movimiento) de cualquier fragmento/bloque de archivo actualmente almacenado en esa secciÃŗn final, permitiendo que se coloquen en cualquier lugar de los archivos de paridad donde haya espacio libre disponible (incluyendo huecos existentes). El propÃŗsito principal de esta opciÃŗn es reducir el tamaÃąo en disco del archivo de paridad. Si la reasignaciÃŗn vacía con Êxito toda la secciÃŗn final (no quedan bloques usÃĄndola), el archivo de paridad se trunca, recuperando el espacio final no utilizado. Puede usar multiplicadores como K, M, G o T (por ejemplo, --force-realloc-tail 1G). Puede usar locate -t, --tail para conocer de antemano los archivos afectados. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no usarla. Usted NO tiene protecciÃŗn de datos durante la operaciÃŗn `sync` para los archivos afectados. -l, --log FILE Escribe un registro detallado en el archivo especificado. Si no se especifica esta opciÃŗn, los errores inesperados se imprimen en la pantalla, lo que puede resultar en una salida excesiva en caso de muchos errores. Cuando se especifica -l, --log, solo los errores fatales que hacen que SnapRAID se detenga se imprimen en la pantalla. Si la ruta comienza con `>>`, el archivo se abre en modo de anexar. Las ocurrencias de `%D` y `%T` en el nombre se reemplazan con la fecha y hora en el formato AAAA MM DD y HH MM SS. En archivos por lotes de Windows, debe duplicar el carÃĄcter `%`, por ejemplo, resultado-%%D.log. Para usar `>>`, debe encerrar el nombre entre comillas, por ejemplo, `">>resultado.log"`. Para enviar el registro a la salida estÃĄndar o al error estÃĄndar, puede usar `">&1"` y `">&2"`, respectivamente. Consulte el archivo snapraid_log.txt o la pÃĄgina del manual para obtener descripciones de las etiquetas de registro. -L, --error-limit NUMBER Establece un nuevo límite de error antes de detener la ejecuciÃŗn. De forma predeterminada, SnapRAID se detiene si encuentra mÃĄs de 100 errores de entrada/salida, lo que indica que es probable que un disco estÊ fallando. Esta opciÃŗn afecta a `sync` y `scrub`, a los que se les permite continuar despuÊs del primer conjunto de errores de disco para intentar completar sus operaciones. Sin embargo, `check` y `fix` siempre se detienen en el primer error. -S, --start BLKSTART Comienza a procesar desde el nÃēmero de bloque especificado. Esto puede ser Ãētil para reintentar verificar o corregir bloques específicos en caso de un disco daÃąado. Esta opciÃŗn es principalmente para recuperaciÃŗn manual avanzada. -B, --count BLKCOUNT Procesa solo el nÃēmero de bloques especificado. Esta opciÃŗn es principalmente para recuperaciÃŗn manual avanzada. -C, --gen-conf CONTENT Genera un archivo de configuraciÃŗn ficticio a partir de un archivo de contenido existente. El archivo de configuraciÃŗn se escribe en la salida estÃĄndar y no sobrescribe uno existente. Este archivo de configuraciÃŗn tambiÊn contiene la informaciÃŗn necesaria para reconstruir los puntos de montaje del disco en caso de que pierda todo el sistema. -v, --verbose Imprime mÃĄs informaciÃŗn en la pantalla. Si se especifica una vez, imprime archivos excluidos y estadísticas adicionales. Esta opciÃŗn no tiene efecto en los archivos de registro. -q, --quiet Imprime menos informaciÃŗn en la pantalla. Si se especifica una vez, elimina la barra de progreso; dos veces, las operaciones en ejecuciÃŗn; tres veces, los mensajes de informaciÃŗn; cuatro veces, los mensajes de estado. Los errores fatales siempre se imprimen en la pantalla. Esta opciÃŗn no tiene efecto en los archivos de registro. -H, --help Imprime una pantalla de ayuda corta. -V, --version Imprime la versiÃŗn del programa. Configuration SnapRAID requiere un archivo de configuraciÃŗn para saber dÃŗnde se encuentra su array de discos y dÃŗnde almacenar la informaciÃŗn de paridad. En Unix, utiliza el archivo `/usr/local/etc/snapraid.conf` si existe, de lo contrario `/etc/snapraid.conf`. En Windows, utiliza el archivo `snapraid.conf` en el mismo directorio que `snapraid.exe`. Debe contener las siguientes opciones (distingue entre mayÃēsculas y minÃēsculas): parity FILE [,FILE] ... Define los archivos a usar para almacenar la informaciÃŗn de paridad. La paridad permite la protecciÃŗn contra un solo fallo de disco, similar a RAID5. Puede especificar varios archivos, que deben estar en discos diferentes. Cuando un archivo no puede crecer mÃĄs, se utiliza el siguiente. El espacio total disponible debe ser al menos tan grande como el disco de datos mÃĄs grande del array. Puede agregar archivos de paridad adicionales mÃĄs tarde, pero no puede reordenarlos ni eliminarlos. Mantener los discos de paridad reservados para la paridad asegura que no se fragmenten, mejorando el rendimiento. En Windows, se dejan 256 MB sin usar en cada disco para evitar la advertencia sobre discos llenos. Esta opciÃŗn es obligatoria y solo se puede usar una vez. (2,3,4,5,6)-parity FILE [,FILE] ... Define los archivos a usar para almacenar informaciÃŗn de paridad adicional. Para cada nivel de paridad especificado, se habilita un nivel adicional de protecciÃŗn: * 2-parity habilita la paridad dual RAID6. * 3-parity habilita la paridad triple. * 4-parity habilita la paridad cuÃĄdruple. * 5-parity habilita la paridad quíntuple. * 6-parity habilita la paridad sÊxtuple. Cada nivel de paridad requiere la presencia de todos los niveles de paridad anteriores. Se aplican las mismas consideraciones que para la opciÃŗn `parity`. Estas opciones son opcionales y solo se pueden usar una vez. z-parity FILE [,FILE] ... Define un archivo y un formato alternativos para almacenar paridad triple. Esta opciÃŗn es una alternativa a `3-parity`, destinada principalmente a CPU de gama baja como ARM o AMD Phenom, Athlon y Opteron que no admiten el conjunto de instrucciones SSSE3. En tales casos, proporciona un mejor rendimiento. Este formato es similar pero mÃĄs rÃĄpido que el utilizado por ZFS RAIDZ3. Al igual que ZFS, no funciona mÃĄs allÃĄ de la paridad triple. Al usar `3-parity`, se le advertirÃĄ si se recomienda usar el formato `z-parity` para mejorar el rendimiento. Es posible convertir de un formato a otro ajustando el archivo de configuraciÃŗn con el archivo z-parity o 3-parity deseado y usando `fix` para recrearlo. content FILE Define el archivo a usar para almacenar la lista y las sumas de comprobaciÃŗn de todos los archivos presentes en su array de discos. Se puede colocar en un disco utilizado para datos, paridad o cualquier otro disco disponible. Si usa un disco de datos, este archivo se excluye automÃĄticamente del proceso `sync`. Esta opciÃŗn es obligatoria y se puede usar varias veces para guardar mÃēltiples copias del mismo archivo. Debe almacenar al menos una copia por cada disco de paridad utilizado mÃĄs uno. Usar copias adicionales no perjudica. data NAME DIR Define el nombre y el punto de montaje de los discos de datos en el array. NAME se usa para identificar el disco y debe ser Ãēnico. DIR es el punto de montaje del disco en el sistema de archivos. Puede cambiar el punto de montaje segÃēn sea necesario, siempre que mantenga el NAME fijo. Debe usar una opciÃŗn para cada disco de datos en el array. Puede cambiar el nombre de un disco mÃĄs tarde cambiando el NAME directamente en el archivo de configuraciÃŗn y luego ejecutando un comando `sync`. En el caso de cambiar el nombre, la asociaciÃŗn se realiza utilizando el UUID almacenado de los discos. extra NAME DIR Define el nombre y el punto de montaje de discos adicionales para monitorear con los comandos `smart` y `probe`. Esto es Ãētil para monitorear discos que no forman parte de la matriz pero que son necesarios para que el sistema funcione, como el disco de arranque. Tenga en cuenta que dichos discos no se ven afectados por los comandos `up` y `down` porque se espera que estÊn siempre girando. nohidden Excluye todos los archivos y directorios ocultos. En Unix, los archivos ocultos son los que comienzan con `.`. En Windows, son los que tienen el atributo oculto. exclude/include PATTERN Define los patrones de archivo o directorio a excluir o incluir en el proceso de sincronizaciÃŗn. Todos los patrones se procesan en el orden especificado. Si el primer patrÃŗn que coincide es un `exclude`, el archivo se excluye. Si es un `include`, el archivo se incluye. Si ningÃēn patrÃŗn coincide, el archivo se excluye si el Ãēltimo patrÃŗn especificado es un `include`, o se incluye si el Ãēltimo patrÃŗn especificado es un `exclude`. Consulte la secciÃŗn PATTERN para obtener mÃĄs detalles sobre las especificaciones de patrones. Esta opciÃŗn se puede usar varias veces. blocksize SIZE_IN_KIBIBYTES Define el tamaÃąo de bloque bÃĄsico en kibibytes para la paridad. Un kibibyte es 1024 bytes. El tamaÃąo de bloque predeterminado es 256, que debería funcionar para la mayoría de los casos. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no cambiar este valor. Para cambiar este valor en el futuro, ÂĄtendrÃĄ que recrear toda la paridad! Una razÃŗn para usar un tamaÃąo de bloque diferente es si tiene muchos archivos pequeÃąos, del orden de millones. Para cada archivo, incluso si solo son unos pocos bytes, se asigna un bloque completo de paridad, y con muchos archivos, esto puede resultar en un espacio de paridad no utilizado significativo. Cuando llena completamente el disco de paridad, no se le permite agregar mÃĄs archivos a los discos de datos. Sin embargo, la paridad desperdiciada no se acumula en los discos de datos. El espacio desperdiciado resultante de un alto nÃēmero de archivos en un disco de datos limita solo la cantidad de datos en ese disco de datos, no en otros. Como aproximaciÃŗn, puede suponer que se desperdicia la mitad del tamaÃąo del bloque para cada archivo. Por ejemplo, con 100,000 archivos y un tamaÃąo de bloque de 256 KiB, desperdiciarÃĄ 12.8 GB de paridad, lo que puede resultar en 12.8 GB menos de espacio disponible en el disco de datos. Puede verificar la cantidad de espacio desperdiciado en cada disco usando `status`. Este es el espacio que debe dejar libre en los discos de datos o usar para archivos no incluidos en el array. Si este valor es negativo, significa que estÃĄ cerca de llenar la paridad, y representa el espacio que aÃēn puede desperdiciar. Para evitar este problema, puede usar una particiÃŗn mÃĄs grande para la paridad. Por ejemplo, si la particiÃŗn de paridad es 12.8 GB mÃĄs grande que los discos de datos, tiene suficiente espacio extra para manejar hasta 100,000 archivos en cada disco de datos sin ningÃēn espacio desperdiciado. Un truco para obtener una particiÃŗn de paridad mÃĄs grande en Linux es formatearla con el comando: :mkfs.ext4 -m 0 -T largefile4 DEVICE Esto resulta en aproximadamente un 1.5% de espacio extra, aproximadamente 60 GB para un disco de 4 TB, lo que permite alrededor de 460,000 archivos en cada disco de datos sin ningÃēn espacio desperdiciado. hashsize SIZE_IN_BYTES Define el tamaÃąo del hash en bytes para los bloques guardados. El tamaÃąo de hash predeterminado es de 16 bytes (128 bits), que debería funcionar para la mayoría de los casos. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no cambiar este valor. Para cambiar este valor en el futuro, ÂĄtendrÃĄ que recrear toda la paridad! Una razÃŗn para usar un tamaÃąo de hash diferente es si su sistema tiene memoria limitada. Como regla general, SnapRAID típicamente requiere 1 GiB de RAM por cada 16 TB de datos en el array. Específicamente, para almacenar los hashes de los datos, SnapRAID requiere aproximadamente TS*(1+HS)/BS bytes de RAM, donde TS es el tamaÃąo total en bytes de su array de discos, BS es el tamaÃąo de bloque en bytes, y HS es el tamaÃąo de hash en bytes. Por ejemplo, con 8 discos de 4 TB, un tamaÃąo de bloque de 256 KiB (1 KiB = 1024 bytes) y un tamaÃąo de hash de 16, obtiene: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Cambiando a un tamaÃąo de hash de 8, obtiene: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Cambiando a un tamaÃąo de bloque de 512, obtiene: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Cambiando tanto a un tamaÃąo de hash de 8 como a un tamaÃąo de bloque de 512, obtiene: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB autosave SIZE_IN_GIGABYTES Guarda automÃĄticamente el estado al sincronizar o fregar despuÊs de la cantidad especificada de GB procesados. Esta opciÃŗn es Ãētil para evitar reiniciar comandos `sync` largos desde cero si son interrumpidos por un fallo de la mÃĄquina o cualquier otro evento. temp_limit TEMPERATURE_CELSIUS Establece la temperatura mÃĄxima permitida del disco en Celsius. Cuando se especifica, SnapRAID verifica periÃŗdicamente la temperatura de todos los discos utilizando la herramienta smartctl. Las temperaturas actuales del disco se muestran mientras SnapRAID estÃĄ operando. Si algÃēn disco excede este límite, todas las operaciones se detienen y los discos se detienen (se ponen en espera) durante la duraciÃŗn definida por la opciÃŗn `temp_sleep`. DespuÊs del período de espera, las operaciones se reanudan, pausÃĄndose potencialmente de nuevo si se alcanza el límite de temperatura una vez mÃĄs. Durante la operaciÃŗn, SnapRAID tambiÊn analiza la curva de calentamiento de cada disco y estima la temperatura constante a largo plazo que se espera que alcancen si la actividad continÃēa. La estimaciÃŗn se realiza solo despuÊs de que la temperatura del disco haya aumentado cuatro veces, asegurando que haya suficientes puntos de datos disponibles para establecer una tendencia confiable. Esta temperatura constante predicha se muestra entre parÊntesis junto al valor actual y ayuda a evaluar si la refrigeraciÃŗn del sistema es adecuada. Esta temperatura estimada es solo para fines informativos y no tiene ningÃēn efecto en el comportamiento de SnapRAID. Las acciones del programa se basan Ãēnicamente en las temperaturas reales medidas del disco. Para realizar este anÃĄlisis, SnapRAID necesita una referencia para la temperatura del sistema. Primero intenta leerla de los sensores de hardware disponibles. Si no se puede acceder a ningÃēn sensor del sistema, utiliza la temperatura del disco mÃĄs baja medida al comienzo de la ejecuciÃŗn como referencia de respaldo. Normalmente, SnapRAID solo muestra la temperatura del disco mÃĄs caliente. Para mostrar la temperatura de todos los discos, use la opciÃŗn -A o --stats. temp_sleep TIME_IN_MINUTES Establece el tiempo de espera, en minutos, cuando se alcanza el límite de temperatura. Durante este período, los discos permanecen detenidos. El valor predeterminado es de 5 minutos. pool DIR Define el directorio de agrupaciÃŗn (pooling) donde se crea la vista virtual del array de discos utilizando el comando `pool`. El directorio ya debe existir. share UNC_DIR Define la ruta UNC de Windows requerida para acceder a los discos de forma remota. Si se especifica esta opciÃŗn, los enlaces simbÃŗlicos creados en el directorio pool utilizan esta ruta UNC para acceder a los discos. Sin esta opciÃŗn, los enlaces simbÃŗlicos generados utilizan solo rutas locales, lo que no permite compartir el directorio pool a travÊs de la red. Los enlaces simbÃŗlicos se forman utilizando la ruta UNC especificada, agregando el nombre del disco como se especifica en la opciÃŗn `data`, y finalmente agregando el directorio y el nombre del archivo. Esta opciÃŗn solo es necesaria para Windows. smartctl DISK/PARITY OPTIONS... Define opciones personalizadas de smartctl para obtener los atributos SMART de cada disco. Esto puede ser necesario para controladores RAID y algunos discos USB que no se pueden detectar automÃĄticamente. El marcador de posiciÃŗn %s se reemplaza por el nombre del dispositivo, pero es opcional para dispositivos fijos como controladores RAID. DISK es el mismo nombre de disco especificado en la opciÃŗn `data`. PARITY es uno de los nombres de paridad: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. En las OPCIONES especificadas, la cadena `%s` se reemplaza por el nombre del dispositivo. Para los controladores RAID, el dispositivo es probable que sea fijo y es posible que no necesite usar `%s`. Consulte la documentaciÃŗn de smartmontools para conocer las posibles opciones: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices Por ejemplo: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignora el atributo SMART especificado al calcular la probabilidad de fallo del disco. Esta opciÃŗn es Ãētil si un disco informa valores inusuales o engaÃąosos para un atributo en particular. DISK es el mismo nombre de disco especificado en la opciÃŗn `data`. PARITY es uno de los nombres de paridad: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. El valor especial * se puede usar para ignorar el atributo en todos los discos. Por ejemplo, para ignorar el atributo `Current Pending Sector Count` en todos los discos: :smartignore * 197 Para ignorarlo solo en el primer disco de paridad: :smartignore parity 197 Examples Un ejemplo de una configuraciÃŗn típica para Unix es: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Un ejemplo de una configuraciÃŗn típica para Windows es: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern Los patrones proporcionan una forma flexible de filtrar archivos para su inclusiÃŗn o exclusiÃŗn. Al usar caracteres de globbing, puede definir reglas que coincidan con nombres de archivos específicos o estructuras de directorios completas sin enumerar cada ruta manualmente. El signo de interrogaciÃŗn `?` coincide con cualquier carÃĄcter individual excepto el separador de directorios. Esto lo hace Ãētil para hacer coincidir nombres de archivos con caracteres variables manteniendo el patrÃŗn limitado a un solo nivel de directorio. El asterisco simple `*` coincide con cualquier secuencia de caracteres, pero al igual que el signo de interrogaciÃŗn, nunca cruza los límites de los directorios. Se detiene en la barra diagonal, lo que lo hace adecuado para buscar coincidencias dentro de un solo componente de ruta. Este es el comportamiento estÃĄndar de los comodines familiar del globbing de la shell. el doble asterisco `**` es mÃĄs potente, coincide con cualquier secuencia de caracteres, incluidos los separadores de directorios. Esto permite que los patrones coincidan a travÊs de mÃēltiples niveles de directorio. Cuando `**` aparece incrustado directamente en un patrÃŗn, puede coincidir con cero o mÃĄs caracteres, incluidas las barras diagonales entre el texto literal circundante. El uso mÃĄs importante de `**` es en la forma especial `/**/`. Esta coincide con cero o mÃĄs niveles de directorio completos, lo que permite que los archivos coincidan a cualquier profundidad en un ÃĄrbol de directorios sin conocer la estructura exacta de la ruta. Por ejemplo, el patrÃŗn `src/**/main.js` coincide con `src/main.js` (saltando cero directorios), `src/ui/main.js` (saltando un directorio) y `src/ui/components/main.js` (saltando dos directorios). Las clases de caracteres que utilizan corchetes `[]` coinciden con un solo carÃĄcter de un conjunto o rango especificado. Al igual que los otros patrones de un solo carÃĄcter, no coinciden con los separadores de directorios. Las clases admiten rangos y negaciÃŗn mediante un signo de exclamaciÃŗn. La distinciÃŗn fundamental que debe recordar es que `*`, `?` y las clases de caracteres respetan los límites de los directorios y solo coinciden dentro de un Ãēnico componente de ruta, mientras que `**` es el Ãēnico patrÃŗn que puede coincidir a travÊs de los separadores de directorios. Hay cuatro tipos diferentes de patrones: =FILE Selecciona cualquier archivo llamado FILE. Este patrÃŗn se aplica solo a archivos, no a directorios. =DIR/ Selecciona cualquier directorio llamado DIR y todo lo que hay dentro. Este patrÃŗn se aplica solo a directorios, no a archivos. =/PATH/FILE Selecciona la ruta exacta del archivo especificado. Este patrÃŗn se aplica solo a archivos, no a directorios. =/PATH/DIR/ Selecciona la ruta exacta del directorio especificado y todo lo que hay dentro. Este patrÃŗn se aplica solo a directorios, no a archivos. Cuando especifica una ruta absoluta que comienza con /, se aplica en el directorio raíz del array, no en el directorio raíz del sistema de archivos local. En Windows, puede usar la barra invertida \ en lugar de la barra /. Los directorios del sistema de Windows, las uniones, los puntos de montaje y otros directorios especiales de Windows se tratan como archivos, lo que significa que para excluirlos, debe usar una regla de archivo, no una de directorio. Si el nombre del archivo contiene un carÃĄcter `*`, `?`, `[`, o `]`, debe escaparlo para evitar que se interprete como un carÃĄcter globbing. En Unix, el carÃĄcter de escape es `\`; en Windows, es `^`. Cuando el patrÃŗn estÃĄ en la línea de comandos, debe duplicar el carÃĄcter de escape para evitar que sea interpretado por el shell de comandos. En el archivo de configuraciÃŗn, puede usar diferentes estrategias para filtrar los archivos a procesar. El enfoque mÃĄs simple es usar solo reglas `exclude` para eliminar todos los archivos y directorios que no desea procesar. Por ejemplo: :# Excluye cualquier archivo llamado `*.unrecoverable` :exclude *.unrecoverable :# Excluye el directorio raíz `/lost+found` :exclude /lost+found/ :# Excluye cualquier subdirectorio llamado `tmp` :exclude tmp/ El enfoque opuesto es definir solo los archivos que desea procesar, utilizando solo reglas `include`. Por ejemplo: :# Incluye solo algunos directorios :include /movies/ :include /musics/ :include /pictures/ El enfoque final es mezclar reglas `exclude` e `include`. En este caso, el orden de las reglas es importante. Las reglas anteriores tienen precedencia sobre las posteriores. Para simplificar, puede enumerar todas las reglas `exclude` primero y luego todas las reglas `include`. Por ejemplo: :# Excluye cualquier archivo llamado `*.unrecoverable` :exclude *.unrecoverable :# Excluye cualquier subdirectorio llamado `tmp` :exclude tmp/ :# Incluye solo algunos directorios :include /movies/ :include /musics/ :include /pictures/ En la línea de comandos, usando la opciÃŗn -f, solo puede usar patrones `include`. Por ejemplo: :# Verifica solo los archivos .mp3. :# En Unix, use comillas para evitar la expansiÃŗn globbing por el shell. :snapraid -f "*.mp3" check En Unix, al usar caracteres globbing en la línea de comandos, debe ponerlos entre comillas para evitar que el shell los expanda. Ignorar Archivos AdemÃĄs de las reglas globales en el archivo de configuraciÃŗn, puedes colocar archivos `.snapraidignore` en cualquier directorio dentro del array para definir reglas de exclusiÃŗn descentralizadas. Las reglas definidas en `.snapraidignore` se aplican despuÊs de las reglas del archivo de configuraciÃŗn. Esto significa que tienen una prioridad mÃĄs alta y pueden usarse para excluir archivos que fueron incluidos previamente por la configuraciÃŗn global. Efectivamente, si una regla local coincide, el archivo se excluye independientemente de los ajustes de inclusiÃŗn globales. La lÃŗgica de patrones en `.snapraidignore` refleja la configuraciÃŗn global pero ancla los patrones al directorio donde se encuentra el archivo: =FILE Selecciona cualquier archivo llamado FILE en este directorio o por debajo. Esto sigue las mismas reglas de globbing que el patrÃŗn global. =DIR/ Selecciona cualquier directorio llamado DIR y todo su contenido, ubicado en este directorio o por debajo. =/PATH/FILE Selecciona el archivo exacto especificado relativo a la ubicaciÃŗn del archivo `.snapraidignore`. =/PATH/DIR/ Selecciona el directorio exacto especificado y todo su contenido, relativo a la ubicaciÃŗn del archivo `.snapraidignore`. A diferencia de la configuraciÃŗn global, los archivos `.snapraidignore` solo admiten reglas de exclusiÃŗn; no se pueden usar patrones `include` o negaciÃŗn (!). Por ejemplo, si tienes un `.snapraidignore` en `/mnt/disk1/projects/`: :# Excluye SOLO /mnt/disk1/projects/output.bin :/output.bin :# Excluye cualquier directorio llamado `build` dentro de projects/ :build/ :# Excluye cualquier archivo .tmp dentro de projects/ o sus subcarpetas :*.tmp Content SnapRAID almacena la lista y las sumas de comprobaciÃŗn de sus archivos en el archivo de contenido. Es un archivo binario que enumera todos los archivos presentes en su array de discos, junto con todas las sumas de comprobaciÃŗn para verificar su integridad. Este archivo es leído y escrito por los comandos `sync` y `scrub` y leído por los comandos `fix`, `check` y `status`. Parity SnapRAID almacena la informaciÃŗn de paridad de su array en los archivos de paridad. Estos son archivos binarios que contienen la paridad calculada de todos los bloques definidos en el archivo `content`. Estos archivos son leídos y escritos por los comandos `sync` y `fix` y solo leídos por los comandos `scrub` y `check`. Encoding SnapRAID en Unix ignora cualquier codificaciÃŗn. Lee y almacena los nombres de archivo con la misma codificaciÃŗn utilizada por el sistema de archivos. En Windows, todos los nombres leídos del sistema de archivos se convierten y procesan en formato UTF-8. Para que los nombres de archivo se impriman correctamente, debe configurar la consola de Windows en modo UTF-8 con el comando `chcp 65001` y usar una fuente TrueType como `Lucida Console` como fuente de la consola. Esto afecta solo a los nombres de archivo impresos; si redirige la salida de la consola a un archivo, el archivo resultante siempre estÃĄ en formato UTF-8. Copyright Este archivo es Copyright (C) 2025 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-es.txt000066400000000000000000002147751522717156100170130ustar00rootroot00000000000000 ===================================== SnapRAID Backup para Arrays de Discos ===================================== 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAID es un programa de copia de seguridad diseÃąado para arrays de discos, que almacena informaciÃŗn de paridad para la recuperaciÃŗn de datos en caso de hasta seis fallos de disco. Destinado principalmente a centros de medios domÊsticos con archivos grandes y que cambian con poca frecuencia, SnapRAID ofrece varias características: * Puede utilizar discos ya llenos de archivos sin la necesidad de reformatearlos, accediendo a ellos como de costumbre. * Todos sus datos son hasheados para asegurar la integridad de los datos y prevenir la corrupciÃŗn silenciosa. * Cuando el nÃēmero de discos fallidos excede el recuento de paridad, la pÊrdida de datos se limita a los discos afectados; los datos en otros discos siguen siendo accesibles. * Si elimina archivos accidentalmente en un disco, la recuperaciÃŗn es posible. * Los discos pueden tener diferentes tamaÃąos. * Puede agregar discos en cualquier momento. * SnapRAID no bloquea sus datos; puede dejar de usarlo en cualquier momento sin reformatear ni mover datos. * Para acceder a un archivo, solo un Ãēnico disco necesita girar, ahorrando energía y reduciendo el ruido. Para mÃĄs informaciÃŗn, visite el sitio oficial de SnapRAID: https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID es un híbrido entre un programa RAID y un programa de copia de seguridad, con el objetivo de combinar los mejores beneficios de ambos. Sin embargo, tiene algunas limitaciones que debe considerar antes de usarlo. La principal limitaciÃŗn es que si un disco falla y no ha sincronizado recientemente, es posible que no pueda recuperarse por completo. MÃĄs específicamente, es posible que no pueda recuperar hasta el tamaÃąo de los archivos cambiados o eliminados desde la Ãēltima operaciÃŗn de sincronizaciÃŗn. Esto ocurre incluso si los archivos cambiados o eliminados no estÃĄn en el disco fallido. Esta es la razÃŗn por la que SnapRAID es mÃĄs adecuado para datos que rara vez cambian. Por otro lado, los archivos reciÊn agregados no impiden la recuperaciÃŗn de los archivos ya existentes. Solo perderÃĄ los archivos reciÊn agregados si estÃĄn en el disco fallido. Otras limitaciones de SnapRAID son: * Con SnapRAID, aÃēn tiene sistemas de archivos separados para cada disco. Con RAID, obtiene un Ãēnico sistema de archivos grande. * SnapRAID no distribuye (stripe) los datos. Con RAID, obtiene un aumento de velocidad con la distribuciÃŗn. * SnapRAID no admite la recuperaciÃŗn en tiempo real. Con RAID, no tiene que dejar de trabajar cuando falla un disco. * SnapRAID puede recuperar datos solo de un nÃēmero limitado de fallos de disco. Con una copia de seguridad, puede recuperarse de un fallo completo de todo el array de discos. * Solo se guardan nombres de archivo, marcas de tiempo, enlaces simbÃŗlicos y enlaces duros. Los permisos, la propiedad y los atributos extendidos no se guardan. 4 GETTING STARTED ================= Para usar SnapRAID, primero debe seleccionar un disco en su array de discos para dedicarlo a la informaciÃŗn de `parity` (paridad). Con un disco para paridad, podrÃĄ recuperarse de un solo fallo de disco, similar a RAID5. Si desea recuperarse de mÃĄs fallos de disco, similar a RAID6, debe reservar discos adicionales para la paridad. Cada disco de paridad adicional permite la recuperaciÃŗn de un fallo de disco mÃĄs. Como discos de paridad, debe elegir los discos mÃĄs grandes del array, ya que la informaciÃŗn de paridad puede crecer hasta el tamaÃąo del disco de datos mÃĄs grande del array. Estos discos estarÃĄn dedicados a almacenar los archivos de `parity`. No debe almacenar sus datos en ellos. Luego, debe definir los discos de `data` (datos) que desea proteger con SnapRAID. La protecciÃŗn es mÃĄs efectiva si estos discos contienen datos que rara vez cambian. Por esta razÃŗn, es mejor NO incluir el disco C:\ de Windows o los directorios /home, /var y /tmp de Unix. La lista de archivos se guarda en los archivos de `content` (contenido), generalmente almacenados en los discos de datos, paridad o de arranque. Este archivo contiene los detalles de su copia de seguridad, incluyendo todas las sumas de comprobaciÃŗn para verificar su integridad. El archivo de `content` se almacena en mÃēltiples copias, y cada copia debe estar en un disco diferente para asegurar que, incluso en caso de mÃēltiples fallos de disco, al menos una copia estÊ disponible. Por ejemplo, suponga que solo estÃĄ interesado en un nivel de paridad de protecciÃŗn, y sus discos estÃĄn ubicados en: /mnt/diskp <- disco seleccionado para paridad /mnt/disk1 <- primer disco a proteger /mnt/disk2 <- segundo disco a proteger /mnt/disk3 <- tercer disco a proteger Debe crear el archivo de configuraciÃŗn /etc/snapraid.conf con las siguientes opciones: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Si estÃĄ en Windows, debe usar el formato de ruta de Windows, con letras de unidad y barras invertidas en lugar de barras. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Si tiene muchos discos y se queda sin letras de unidad, puede montar discos directamente en subcarpetas. Consulte: https://www.google.com/search?q=Windows+mount+point En este punto, estÃĄ listo para ejecutar el comando `sync` (sincronizar) para construir la informaciÃŗn de paridad. snapraid sync Este proceso puede llevar varias horas la primera vez, dependiendo del tamaÃąo de los datos ya presentes en los discos. Si los discos estÃĄn vacíos, el proceso es inmediato. Puede detenerlo en cualquier momento presionando Ctrl+C, y en la siguiente ejecuciÃŗn, se reanudarÃĄ donde se interrumpiÃŗ. Cuando este comando se complete, sus datos estarÃĄn SEGUROS. Ahora puede comenzar a usar su array como desee y periÃŗdicamente actualizar la informaciÃŗn de paridad ejecutando el comando `sync`. 4.1 Scrubbing ------------- Para verificar periÃŗdicamente los datos y la paridad en busca de errores, puede ejecutar el comando `scrub` (fregar/limpiar). snapraid scrub Este comando compara los datos de su array con el hash calculado durante el comando `sync` para verificar la integridad. Cada ejecuciÃŗn del comando verifica aproximadamente el 8% del array, excluyendo los datos ya fregados en los 10 días anteriores. Puede usar la opciÃŗn -p, --plan para especificar una cantidad diferente y la opciÃŗn -o, --older-than para especificar una edad diferente en días. Por ejemplo, para verificar el 5% del array en busca de bloques con mÃĄs de 20 días, use: snapraid -p 5 -o 20 scrub Si se encuentran errores silenciosos o de entrada/salida durante el proceso, los bloques correspondientes se marcan como defectuosos en el archivo de `content` y se listan en el comando `status`. snapraid status Para corregirlos, puede usar el comando `fix` (arreglar), filtrando por bloques defectuosos con la opciÃŗn -e, --filter-error: snapraid -e fix En el siguiente `scrub`, los errores desaparecerÃĄn del informe de `status` si realmente se han corregido. Para hacerlo mÃĄs rÃĄpido, puede usar -p bad para fregar solo los bloques marcados como defectuosos. snapraid -p bad scrub Ejecutar `scrub` en un array no sincronizado puede reportar errores causados por archivos eliminados o modificados. Estos errores se informan en la salida de `scrub`, pero los bloques relacionados no se marcan como defectuosos. 4.2 Pooling ----------- Nota: La funciÃŗn de pooling descrita a continuaciÃŗn ha sido sustituida por la herramienta mergerfs, que ahora es la opciÃŗn recomendada para los usuarios de Linux en la comunidad SnapRAID. Mergefs proporciona una forma mÃĄs flexible y eficiente de agrupar mÃēltiples unidades en un Ãēnico punto de montaje unificado, permitiendo un acceso sin problemas a los archivos en todo su array sin depender de enlaces simbÃŗlicos. Se integra bien con SnapRAID para la protecciÃŗn de paridad y se usa comÃēnmente en configuraciones como OpenMediaVault (OMV) o configuraciones NAS personalizadas. Para que todos los archivos de su array se muestren en el mismo ÃĄrbol de directorios, puede habilitar la funciÃŗn de `pooling` (agrupaciÃŗn). Crea una vista virtual de solo lectura de todos los archivos de su array utilizando enlaces simbÃŗlicos. Puede configurar el directorio de `pooling` en el archivo de configuraciÃŗn con: pool /pool o, si estÃĄ en Windows, con: pool C:\pool y luego ejecute el comando `pool` para crear o actualizar la vista virtual. snapraid pool Si estÃĄ utilizando una plataforma Unix y desea compartir este directorio a travÊs de la red con mÃĄquinas Windows o Unix, debe agregar las siguientes opciones a su /etc/samba/smb.conf: # En la secciÃŗn global de smb.conf unix extensions = no # En la secciÃŗn de compartir de smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes En Windows, compartir enlaces simbÃŗlicos a travÊs de una red requiere que los clientes los resuelvan de forma remota. Para habilitar esto, ademÃĄs de compartir el directorio pool, tambiÊn debe compartir todos los discos de forma independiente, utilizando los nombres de disco definidos en el archivo de configuraciÃŗn como puntos de recurso compartido. TambiÊn debe especificar en la opciÃŗn `share` del archivo de configuraciÃŗn la ruta UNC de Windows que los clientes remotos necesitan usar para acceder a estos discos compartidos. Por ejemplo, operando desde un servidor llamado `darkstar`, puede usar las opciones: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar y compartir los siguientes directorios a travÊs de la red: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array para permitir que los clientes remotos accedan a todos los archivos en \\darkstar\pool. TambiÊn puede que deba configurar los clientes remotos para habilitar el acceso a enlaces simbÃŗlicos remotos con el comando: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAID funciona mÃĄs como un programa de copia de seguridad que como un sistema RAID, y se puede usar para restaurar o recuperar archivos a su estado anterior usando la opciÃŗn -f, --filter: snapraid fix -f FILE o para un directorio: snapraid fix -f DIR/ TambiÊn puede usarlo para recuperar solo archivos eliminados accidentalmente dentro de un directorio usando la opciÃŗn -m, --filter-missing, que restaura solo archivos faltantes, dejando todos los demÃĄs intactos. snapraid fix -m -f DIR/ O para recuperar todos los archivos eliminados en todas las unidades con: snapraid fix -m 4.4 Recovering -------------- Ha sucedido lo peor, ÂĄy ha perdido uno o mÃĄs discos! ÂĄNO ENTRE EN PÁNICO! ÂĄPodrÃĄ recuperarlos! Lo primero que debe hacer es evitar mÃĄs cambios en su array de discos. Deshabilite cualquier conexiÃŗn remota a Êl y cualquier proceso programado, incluida cualquier sincronizaciÃŗn o fregado nocturno programado de SnapRAID. Luego, proceda con los siguientes pasos. ---- 4.4.1 STEP 1 -> Reconfigure ---- Necesita algo de espacio para recuperarse, idealmente en discos de repuesto adicionales, pero un disco USB externo o un disco remoto serÃĄn suficientes. Modifique el archivo de configuraciÃŗn de SnapRAID para hacer que la opciÃŗn `data` o `parity` del disco fallido apunte a una ubicaciÃŗn con suficiente espacio vacío para recuperar los archivos. Por ejemplo, si el disco `d1` ha fallado, cambie de: data d1 /mnt/disk1/ a: data d1 /mnt/new_spare_disk/ Si el disco a recuperar es un disco de paridad, actualice la opciÃŗn `parity` apropiada. Si tiene varios discos fallidos, actualice todas sus opciones de configuraciÃŗn. ---- 4.4.2 STEP 2 -> Fix ---- Ejecute el comando fix, almacenando el registro en un archivo externo con: snapraid -d NAME -l fix.log fix Donde NAME es el nombre del disco, como `d1` en nuestro ejemplo anterior. Si el disco a recuperar es un disco de paridad, use los nombres `parity`, `2-parity`, etc. Si tiene varios discos fallidos, use varias opciones -d para especificarlos todos. Este comando tardarÃĄ mucho tiempo. AsegÃērese de tener unos pocos gigabytes libres para almacenar el archivo fix.log. EjecÃētelo desde un disco con suficiente espacio libre. Ahora ha recuperado todo lo que es recuperable. Si algunos archivos son parcial o totalmente irrecuperables, se les cambiarÃĄ el nombre agregando la extensiÃŗn `.unrecoverable`. Puede encontrar una lista detallada de todos los bloques irrecuperables en el archivo fix.log buscando todas las líneas que comienzan con `unrecoverable:`. Si no estÃĄ satisfecho con la recuperaciÃŗn, puede volver a intentarlo tantas veces como desee. Por ejemplo, si ha eliminado archivos del array despuÊs de la Ãēltima `sync`, esto puede resultar en que algunos archivos no se recuperen. En este caso, puede volver a intentar el `fix` usando la opciÃŗn -i, --import, especificando dÃŗnde estÃĄn esos archivos ahora para incluirlos nuevamente en el proceso de recuperaciÃŗn. Si estÃĄ satisfecho con la recuperaciÃŗn, puede continuar, ÂĄpero tenga en cuenta que despuÊs de sincronizar, no puede volver a intentar el comando `fix`! ---- 4.4.3 STEP 3 -> Check ---- Como verificaciÃŗn cautelosa, ahora puede ejecutar un comando `check` (comprobar) para asegurarse de que todo estÊ correcto en el disco recuperado. snapraid -d NAME -a check Donde NAME es el nombre del disco, como `d1` en nuestro ejemplo anterior. Las opciones -d y -a le dicen a SnapRAID que compruebe solo el disco especificado e ignore todos los datos de paridad. Este comando tardarÃĄ mucho tiempo, pero si no es demasiado cauteloso, puede omitirlo. ---- 4.4.4 STEP 4 -> Sync ---- Ejecute el comando `sync` para resincronizar el array con el nuevo disco. snapraid sync Si todo se recupera, este comando es inmediato. 5 COMMANDS ========== SnapRAID proporciona algunos comandos simples que le permiten: * Imprimir el estado del array -> `status` * Controlar los discos -> `smart`, `probe`, `up`, `down` * Hacer una copia de seguridad/instantÃĄnea -> `sync` * Comprobar periÃŗdicamente los datos -> `scrub` * Restaurar la Ãēltima copia de seguridad/instantÃĄnea -> `fix`. Los comandos deben escribirse en minÃēsculas. 5.1 status ---------- Imprime un resumen del estado del array de discos. Incluye informaciÃŗn sobre la fragmentaciÃŗn de la paridad, la antigÃŧedad de los bloques sin verificar y todos los errores silenciosos registrados encontrados durante el fregado. La informaciÃŗn presentada se refiere a la Ãēltima vez que ejecutÃŗ `sync`. Las modificaciones posteriores no se tienen en cuenta. Si se detectaron bloques defectuosos, se enumeran sus nÃēmeros de bloque. Para corregirlos, puede usar el comando `fix -e`. TambiÊn muestra un grÃĄfico que representa la Ãēltima vez que cada bloque fue fregado o sincronizado. Los bloques fregados se muestran con `*`, los bloques sincronizados pero aÃēn no fregados con `o`. Nada se modifica. 5.2 smart --------- Imprime un informe SMART de todos los discos del sistema. Incluye una estimaciÃŗn de la probabilidad de fallo en el prÃŗximo aÃąo, lo que le permite planificar reemplazos de mantenimiento de discos que muestren atributos sospechosos. Esta estimaciÃŗn de probabilidad se obtiene correlacionando los atributos SMART de los discos con los datos de Backblaze disponibles en: https://www.backblaze.com/hard-drive-test-data.html Si SMART informa que un disco estÃĄ fallando, se imprime `FAIL` o `PREFAIL` para ese disco, y SnapRAID regresa con un error. En este caso, se recomienda encarecidamente el reemplazo inmediato del disco. Otras posibles cadenas de estado son: logfail - En el pasado, algunos atributos estaban por debajo del umbral. logerr - El registro de errores del dispositivo contiene errores. selferr - El registro de autoprueba del dispositivo contiene errores. Si se especifica la opciÃŗn -v, --verbose, se proporciona un anÃĄlisis estadístico mÃĄs profundo. Este anÃĄlisis puede ayudarle a decidir si necesita mÃĄs o menos paridad. Este comando utiliza la herramienta `smartctl` y es equivalente a ejecutar `smartctl -a` en todos los dispositivos. Si sus dispositivos no se detectan automÃĄticamente correctamente, puede especificar un comando personalizado utilizando la opciÃŗn `smartctl` en el archivo de configuraciÃŗn. Nada se modifica. 5.3 probe --------- Imprime el estado de ENERGÍA de todos los discos del sistema. `Standby` significa que el disco no estÃĄ girando. `Active` significa que el disco estÃĄ girando. Este comando utiliza la herramienta `smartctl` y es equivalente a ejecutar `smartctl -n standby -i` en todos los dispositivos. Si sus dispositivos no se detectan automÃĄticamente correctamente, puede especificar un comando personalizado utilizando la opciÃŗn `smartctl` en el archivo de configuraciÃŗn. Nada se modifica. 5.4 up ------ Pone en marcha (gira) todos los discos del array. Puede poner en marcha solo discos específicos usando la opciÃŗn -d, --filter-disk. Poner en marcha todos los discos al mismo tiempo requiere mucha energía. AsegÃērese de que su fuente de alimentaciÃŗn pueda soportarlo. Nada se modifica. 5.5 down -------- Detiene (deja de girar) todos los discos del array. Este comando utiliza la herramienta `smartctl` y es equivalente a ejecutar `smartctl -s standby,now` en todos los dispositivos. Puede detener solo discos específicos usando la opciÃŗn -d, --filter-disk. Para detener automÃĄticamente en caso de error, puede usar la opciÃŗn -s, --spin-down-on-error con cualquier otro comando, lo cual es equivalente a ejecutar `down` manualmente cuando ocurre un error. Nada se modifica. 5.6 diff -------- Enumera todos los archivos modificados desde el Ãēltimo `sync` que necesitan que se vuelva a calcular su informaciÃŗn de paridad. Este comando no verifica los datos del archivo, sino solo la marca de tiempo, el tamaÃąo y el inodo del archivo. DespuÊs de enumerar todos los archivos cambiados, se presenta un resumen de los cambios, agrupados por: equal - Archivos sin cambios desde antes. added - Archivos agregados que no estaban presentes antes. removed - Archivos eliminados. updated - Archivos con un tamaÃąo o marca de tiempo diferente, lo que significa que fueron modificados. moved - Archivos movidos a un directorio diferente en el mismo disco. Se identifican por tener el mismo nombre, tamaÃąo, marca de tiempo e inodo, pero un directorio diferente. copied - Archivos copiados en el mismo disco o en uno diferente donde el archivo original todavía existe. Se identifican por tener el mismo nombre, tamaÃąo y marca de tiempo. Si la marca de tiempo de subsegundo es cero, la ruta completa debe coincidir para ser identificado, no solo el nombre. relocated - Archivos movidos en el mismo disco o en uno diferente donde el original ha desaparecido. Se identifican por tener el mismo nombre, tamaÃąo y marca de tiempo. Si la marca de tiempo de subsegundo es cero, la ruta completa debe coincidir para ser identificado. A diferencia de los archivos `moved` en el mismo disco, los archivos reubicados tienen un inodo diferente. restored - Archivos con un inodo diferente pero con directorio, nombre, tamaÃąo y marca de tiempo coincidentes. Estos son usualmente archivos restaurados despuÊs de haber sido eliminados. Si se requiere un `sync`, el cÃŗdigo de retorno del proceso es 2, en lugar del valor predeterminado 0. El cÃŗdigo de retorno 1 se utiliza para una condiciÃŗn de error genÊrico. Nada se modifica. 5.7 sync -------- Actualiza la informaciÃŗn de paridad. Todos los archivos modificados en el array de discos se leen y la informaciÃŗn de paridad correspondiente se actualiza. Puede detener este proceso en cualquier momento presionando Ctrl+C, sin perder el trabajo ya realizado. En la siguiente ejecuciÃŗn, el proceso `sync` se reanudarÃĄ donde se interrumpiÃŗ. Si se encuentran errores silenciosos o de entrada/salida durante el proceso, los bloques correspondientes se marcan como defectuosos. Los archivos se identifican por ruta y/o inodo y se verifican por tamaÃąo y marca de tiempo. Si el tamaÃąo o la marca de tiempo del archivo difieren, la informaciÃŗn de paridad se vuelve a calcular para todo el archivo. Si el archivo se mueve o se renombra en el mismo disco, manteniendo el mismo inodo, la paridad no se vuelve a calcular. Si el archivo se mueve a otro disco, la paridad se vuelve a calcular, pero la informaciÃŗn de hash calculada previamente se mantiene. Los archivos `content` y `parity` se modifican si es necesario. Los archivos en el array NO se modifican. 5.8 scrub --------- Frota (scrubs) el array, buscando errores silenciosos o de entrada/salida en los discos de datos y paridad. Cada invocaciÃŗn verifica aproximadamente el 8% del array, excluyendo los datos ya fregados en los Ãēltimos 10 días. Esto significa que fregar una vez a la semana asegura que cada bit de datos se verifique al menos una vez cada tres meses. Puede definir un plan de fregado o una cantidad diferente utilizando la opciÃŗn -p, --plan, que acepta: bad - Fregar bloques marcados como defectuosos. new - Fregar bloques reciÊn sincronizados que aÃēn no han sido fregados. full - Fregar todo. 0-100 - Fregar el porcentaje especificado de bloques. Si especifica un valor de porcentaje, tambiÊn puede usar la opciÃŗn -o, --older-than para definir la antigÃŧedad del bloque. Los bloques mÃĄs antiguos se friegan primero, asegurando una verificaciÃŗn Ãŗptima. Si desea fregar solo los bloques reciÊn sincronizados que aÃēn no han sido fregados, use la opciÃŗn `-p new`. Para obtener detalles del estado del fregado, use el comando `status`. Para cualquier error silencioso o de entrada/salida encontrado, los bloques correspondientes se marcan como defectuosos en el archivo `content`. Estos bloques defectuosos se enumeran en `status` y se pueden corregir con `fix -e`. DespuÊs de la correcciÃŗn, en el siguiente fregado, se volverÃĄn a verificar y, si se encuentran corregidos, se eliminarÃĄ la marca de defectuoso. Para fregar solo los bloques defectuosos, puede usar el comando `scrub -p bad`. Se recomienda ejecutar `scrub` solo en un array sincronizado para evitar errores reportados causados por datos no sincronizados. Estos errores se reconocen como no siendo errores silenciosos y los bloques no se marcan como defectuosos, pero tales errores se informan en la salida del comando. El archivo `content` se modifica para actualizar el tiempo de la Ãēltima verificaciÃŗn de cada bloque y para marcar bloques defectuosos. Los archivos `parity` NO se modifican. Los archivos en el array NO se modifican. 5.9 fix ------- Corrige todos los archivos y la informaciÃŗn de paridad. Todos los archivos y la informaciÃŗn de paridad se comparan con el estado de instantÃĄnea guardado en el Ãēltimo `sync`. Si se encuentra una diferencia, se revierte a la instantÃĄnea almacenada. ÂĄADVERTENCIA! El comando `fix` no diferencia entre errores y modificaciones intencionales. Revierte incondicionalmente el estado del archivo al Ãēltimo `sync`. Si no se especifica otra opciÃŗn, se procesa todo el array. Utilice las opciones de filtro para seleccionar un subconjunto de archivos o discos para operar. Para corregir solo los bloques marcados como defectuosos durante `sync` y `scrub`, use la opciÃŗn -e, --filter-error. A diferencia de otras opciones de filtro, esta aplica correcciones solo a archivos que no han cambiado desde el Ãēltimo `sync`. SnapRAID cambia el nombre de todos los archivos que no se pueden corregir agregando la extensiÃŗn `.unrecoverable`. Antes de corregir, se escanea todo el array para encontrar cualquier archivo movido desde la Ãēltima operaciÃŗn de `sync`. Estos archivos se identifican por su marca de tiempo, ignorando su nombre y directorio, y se utilizan en el proceso de recuperaciÃŗn si es necesario. Si moviÃŗ algunos de ellos fuera del array, puede usar la opciÃŗn -i, --import para especificar directorios adicionales para escanear. Los archivos se identifican solo por ruta, no por inodo. El archivo `content` NO se modifica. Los archivos `parity` se modifican si es necesario. Los archivos en el array se modifican si es necesario. 5.10 check ---------- Verifica todos los archivos y la informaciÃŗn de paridad. Funciona como `fix`, pero solo simula una recuperaciÃŗn y no se escriben cambios en el array. Este comando estÃĄ destinado principalmente a la verificaciÃŗn manual, como despuÊs de un proceso de recuperaciÃŗn o en otras condiciones especiales. Para comprobaciones periÃŗdicas y programadas, use `scrub`. Si usa la opciÃŗn -a, --audit-only, solo se verifican los datos del archivo y se ignora la informaciÃŗn de paridad para una ejecuciÃŗn mÃĄs rÃĄpida. Los archivos se identifican solo por ruta, no por inodo. Nada se modifica. 5.11 list --------- Enumera todos los archivos contenidos en el array en el momento del Ãēltimo `sync`. Con -v o --verbose, tambiÊn se muestra el tiempo de subsegundo. Nada se modifica. 5.12 dup -------- Enumera todos los archivos duplicados. Se supone que dos archivos son iguales si sus hashes coinciden. Los datos del archivo no se leen; solo se utilizan los hashes precalculados. Nada se modifica. 5.13 pool --------- Crea o actualiza una vista virtual de todos los archivos de su array de discos en el directorio de `pooling`. Los archivos no se copian sino que se enlazan usando enlaces simbÃŗlicos. Al actualizar, todos los enlaces simbÃŗlicos existentes y los subdirectorios vacíos se eliminan y se reemplazan con la nueva vista del array. Cualquier otro archivo regular se deja en su lugar. Nada se modifica fuera del directorio pool. 5.14 devices ------------ Imprime los dispositivos de bajo nivel utilizados por el array. Este comando muestra las asociaciones de dispositivos en el array y estÃĄ destinado principalmente como una interfaz de script. Las primeras dos columnas son el ID y la ruta del dispositivo de bajo nivel. Las siguientes dos columnas son el ID y la ruta del dispositivo de alto nivel. La Ãēltima columna es el nombre del disco en el array. En la mayoría de los casos, tiene un dispositivo de bajo nivel para cada disco en el array, pero en algunas configuraciones mÃĄs complejas, puede tener mÃēltiples dispositivos de bajo nivel utilizados por un solo disco en el array. Nada se modifica. 5.15 touch ---------- Establece una marca de tiempo de subsegundo arbitraria para todos los archivos que la tienen establecida en cero. Esto mejora la capacidad de SnapRAID para reconocer archivos movidos y copiados, ya que hace que la marca de tiempo sea casi Ãēnica, reduciendo posibles duplicados. MÃĄs específicamente, si la marca de tiempo de subsegundo no es cero, un archivo movido o copiado se identifica como tal si coincide con el nombre, el tamaÃąo y la marca de tiempo. Si la marca de tiempo de subsegundo es cero, se considera una copia solo si la ruta completa, el tamaÃąo y la marca de tiempo coinciden. La marca de tiempo de precisiÃŗn de segundo no se modifica, por lo que se conservarÃĄn todas las fechas y horas de sus archivos. 5.16 rehash ----------- Programa un nuevo cÃĄlculo de hash (rehash) de todo el array. Este comando cambia el tipo de hash utilizado, típicamente al actualizar de un sistema de 32 bits a uno de 64 bits, para cambiar de MurmurHash3 al mÃĄs rÃĄpido SpookyHash. Si ya estÃĄ utilizando el hash Ãŗptimo, este comando no hace nada y le informa que no se necesita ninguna acciÃŗn. El nuevo cÃĄlculo de hash no se realiza inmediatamente, sino que tiene lugar progresivamente durante `sync` y `scrub`. Puede verificar el estado del nuevo cÃĄlculo de hash usando `status`. Durante el nuevo cÃĄlculo de hash, SnapRAID mantiene la funcionalidad completa, con la Ãēnica excepciÃŗn de que `dup` no puede detectar archivos duplicados utilizando un hash diferente. 5.17 locate ----------- Localiza archivos almacenados en los discos de paridad. Para cada archivo coincidente, imprime su ubicaciÃŗn dentro del archivo de paridad y el nÃēmero de fragmentos que ocupa. Puede usar la opciÃŗn -t, --tail para restringir la operaciÃŗn a los archivos que ocupan la porciÃŗn final especificada de la paridad. Si desea reasignar estos archivos, puede usar la opciÃŗn -W, --force-realloc-tail. Tenga en cuenta que dichos archivos no estarÃĄn protegidos por la paridad durante el proceso de reasignaciÃŗn. 6 OPTIONS ========= SnapRAID proporciona las siguientes opciones: -c, --conf CONFIG Selecciona el archivo de configuraciÃŗn a usar. Si no se especifica, en Unix utiliza el archivo `/usr/local/etc/snapraid.conf` si existe, de lo contrario `/etc/snapraid.conf`. En Windows, utiliza el archivo `snapraid.conf` en el mismo directorio que `snapraid.exe`. -f, --filter PATTERN Filtra los archivos a procesar en `check` y `fix`. Solo se procesan los archivos que coinciden con el patrÃŗn especificado. Esta opciÃŗn se puede usar varias veces. Consulte la secciÃŗn PATTERN para obtener mÃĄs detalles sobre las especificaciones de patrones. En Unix, asegÃērese de que los caracteres globbing estÊn entre comillas si se usan. Esta opciÃŗn solo se puede usar con `check` y `fix`. No se puede usar con `sync` y `scrub`, ya que siempre procesan todo el array. -d, --filter-disk NAME Filtra los discos a procesar en `check`, `fix`, `up` y `down`. Debe especificar un nombre de disco como se define en el archivo de configuraciÃŗn. TambiÊn puede especificar discos de paridad con los nombres: `parity`, `2-parity`, `3-parity`, etc., para limitar las operaciones a un disco de paridad específico. Si combina mÃēltiples opciones --filter, --filter-disk y --filter-missing, solo se seleccionan los archivos que coinciden con todos los filtros. Esta opciÃŗn se puede usar varias veces. Esta opciÃŗn solo se puede usar con `check`, `fix`, `up` y `down`. No se puede usar con `sync` y `scrub`, ya que siempre procesan todo el array. -m, --filter-missing Filtra los archivos a procesar en `check` y `fix`. Solo se procesan los archivos faltantes o eliminados del array. Cuando se usa con `fix`, esto actÃēa como un comando de `undelete` (recuperaciÃŗn). Si combina mÃēltiples opciones --filter, --filter-disk y --filter-missing, solo se seleccionan los archivos que coinciden con todos los filtros. Esta opciÃŗn solo se puede usar con `check` y `fix`. No se puede usar con `sync` y `scrub`, ya que siempre procesan todo el array. -e, --filter-error Procesa los archivos con errores en `check` y `fix`. Solo procesa archivos que tienen bloques marcados con errores silenciosos o de entrada/salida durante `sync` y `scrub`, segÃēn se enumeran en `status`. Esta opciÃŗn solo se puede usar con `check` y `fix`. -p, --plan PERC|bad|new|full Selecciona el plan de fregado (scrub). Si PERC es un valor numÊrico de 0 a 100, se interpreta como el porcentaje de bloques a fregar. En lugar de un porcentaje, puede especificar un plan: `bad` friega bloques defectuosos, `new` friega bloques aÃēn no fregados, y `full` friega todo. Esta opciÃŗn solo se puede usar con `scrub`. -o, --older-than DAYS Selecciona la parte mÃĄs antigua del array para procesar en `scrub`. DAYS es la edad mínima en días para que un bloque sea fregado; el valor predeterminado es 10. Los bloques marcados como defectuosos siempre se friegan independientemente de esta opciÃŗn. Esta opciÃŗn solo se puede usar con `scrub`. -a, --audit-only En `check`, verifica el hash de los archivos sin verificar la informaciÃŗn de paridad. Si solo estÃĄ interesado en verificar los datos del archivo, esta opciÃŗn puede acelerar significativamente el proceso de verificaciÃŗn. Esta opciÃŗn solo se puede usar con `check`. -h, --pre-hash En `sync`, ejecuta una fase de hash preliminar de todos los datos nuevos para una verificaciÃŗn adicional antes del cÃĄlculo de paridad. Normalmente, en `sync`, no se realiza un hash preliminar, y los nuevos datos se hashean justo antes del cÃĄlculo de paridad cuando se leen por primera vez. Este proceso ocurre cuando el sistema estÃĄ bajo una gran carga, con todos los discos girando y una CPU ocupada. Esta es una condiciÃŗn extrema para la mÃĄquina, y si tiene un problema de hardware latente, los errores silenciosos pueden pasar desapercibidos porque los datos aÃēn no estÃĄn hasheados. Para evitar este riesgo, puede habilitar el modo `pre-hash` para que todos los datos se lean dos veces para garantizar su integridad. Esta opciÃŗn tambiÊn verifica los archivos movidos dentro del array para asegurar que la operaciÃŗn de movimiento fue exitosa y, si es necesario, le permite ejecutar una operaciÃŗn de correcciÃŗn antes de continuar. Esta opciÃŗn solo se puede usar con `sync`. -i, --import DIR Importa desde el directorio especificado cualquier archivo eliminado del array despuÊs del Ãēltimo `sync`. Si aÃēn tiene dichos archivos, `check` y `fix` pueden usarlos para mejorar el proceso de recuperaciÃŗn. Los archivos se leen, incluso en subdirectorios, y se identifican independientemente de su nombre. Esta opciÃŗn solo se puede usar con `check` y `fix`. -s, --spin-down-on-error En cualquier error, detiene todos los discos gestionados antes de salir con un cÃŗdigo de estado distinto de cero. Esto evita que las unidades permanezcan activas y girando despuÊs de una operaciÃŗn abortada, lo que ayuda a evitar la acumulaciÃŗn de calor innecesaria y el consumo de energía. Use esta opciÃŗn para asegurarse de que los discos se detengan de forma segura incluso cuando un comando falla. -w, --bw-limit RATE Aplica un límite de ancho de banda global para todos los discos. RATE es el nÃēmero de bytes por segundo. Puede especificar un multiplicador como K, M o G (por ejemplo, --bw-limit 1G). -t, --tail TAMAÑO Limita la lista de archivos a aquellos que no usan mÃĄs del tamaÃąo de cola especificado de los discos de paridad. Puede usar multiplicadores como K, M, G o T (por ejemplo, --tail 1G). Esta opciÃŗn solo es vÃĄlida cuando se usa junto con el comando `locate`. -A, --stats Habilita una vista de estado extendida que muestra informaciÃŗn adicional. La pantalla muestra dos grÃĄficos: El primer grÃĄfico muestra el nÃēmero de franjas (stripes) almacenadas en bÃēfer para cada disco, junto con la ruta del archivo al que se estÃĄ accediendo actualmente en ese disco. Normalmente, el disco mÃĄs lento no tendrÃĄ bÃēfer disponible, lo que determina el ancho de banda mÃĄximo alcanzable. El segundo grÃĄfico muestra el porcentaje de tiempo dedicado a esperar durante los Ãēltimos 100 segundos. Se espera que el disco mÃĄs lento cause la mayor parte del tiempo de espera, mientras que otros discos deberían tener poco o ningÃēn tiempo de espera porque pueden usar sus franjas almacenadas en bÃēfer. Este grÃĄfico tambiÊn muestra el tiempo dedicado a esperar los cÃĄlculos de hash y los cÃĄlculos RAID. Todos los cÃĄlculos se ejecutan en paralelo con las operaciones de disco. Por lo tanto, mientras haya un tiempo de espera medible para al menos un disco, indica que la CPU es lo suficientemente rÃĄpida para mantenerse al día con la carga de trabajo. -Z, --force-zero Fuerza la operaciÃŗn insegura de sincronizar un archivo con tamaÃąo cero que antes no era cero. Si SnapRAID detecta tal condiciÃŗn, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar fÃĄcilmente cuando, despuÊs de un fallo del sistema, algunos archivos accedidos fueron truncados. Esta es una posible condiciÃŗn en Linux con los sistemas de archivos ext3/ext4. Esta opciÃŗn solo se puede usar con `sync`. -E, --force-empty Fuerza la operaciÃŗn insegura de sincronizar un disco con todos los archivos originales faltantes. Si SnapRAID detecta que todos los archivos originalmente presentes en el disco faltan o han sido reescritos, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar fÃĄcilmente cuando un sistema de archivos de datos no estÃĄ montado. Sin embargo, se permite tener un solo cambio de UUID con paridad simple, y mÃĄs con paridad mÃēltiple, porque este es el caso normal al reemplazar discos despuÊs de una recuperaciÃŗn. Esta opciÃŗn solo se puede usar con `sync`. -U, --force-uuid Fuerza la operaciÃŗn insegura de sincronizar, verificar y corregir con discos que han cambiado su UUID. Si SnapRAID detecta que algunos discos han cambiado el UUID, detiene el procedimiento a menos que especifique esta opciÃŗn. Esto le permite detectar cuando sus discos estÃĄn montados en los puntos de montaje incorrectos. Esta opciÃŗn solo se puede usar con `sync`, `check` o `fix`. -D, --force-device Fuerza la operaciÃŗn insegura de corregir con discos inaccesibles o con discos en el mismo dispositivo físico. Por ejemplo, si perdiÃŗ dos discos de datos y tiene un disco de repuesto para recuperar solo el primero, puede ignorar el segundo disco inaccesible. O, si desea recuperar un disco en el espacio libre que queda en un disco ya usado, compartiendo el mismo dispositivo físico. Esta opciÃŗn solo se puede usar con `fix`. -N, --force-nocopy En `sync`, `check` y `fix`, deshabilita la heurística de detecciÃŗn de copias. Sin esta opciÃŗn, SnapRAID asume que los archivos con los mismos atributos, como nombre, tamaÃąo y marca de tiempo, son copias con los mismos datos. Esto permite la identificaciÃŗn de archivos copiados o movidos de un disco a otro y reutiliza la informaciÃŗn de hash ya calculada para detectar errores silenciosos o recuperar archivos faltantes. En algunos casos raros, este comportamiento puede dar lugar a falsos positivos o a un proceso lento debido a muchas verificaciones de hash, y esta opciÃŗn le permite resolver tales problemas. Esta opciÃŗn solo se puede usar con `sync`, `check` y `fix`. -F, --force-full En `sync`, fuerza un recÃĄlculo completo de la paridad. Esta opciÃŗn se puede usar cuando agrega un nuevo nivel de paridad o si revirtiÃŗ a un archivo de contenido antiguo utilizando datos de paridad mÃĄs recientes. En lugar de recrear la paridad desde cero, esto le permite reutilizar los hashes presentes en el archivo de contenido para validar los datos y mantener la protecciÃŗn de datos durante el proceso `sync` utilizando los datos de paridad existentes. Esta opciÃŗn solo se puede usar con `sync`. -R, --force-realloc En `sync`, fuerza una reasignaciÃŗn completa de archivos y la reconstrucciÃŗn de la paridad. Esta opciÃŗn se puede usar para reasignar completamente todos los archivos, eliminando la fragmentaciÃŗn, mientras se reutilizan los hashes presentes en el archivo de contenido para validar los datos. Esta opciÃŗn solo se puede usar con `sync`. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no usarla. NO tiene protecciÃŗn de datos durante la operaciÃŗn `sync`. -W, --force-realloc-tail TAMAÑO Funciona como -R, --force-realloc, pero limitado a la porciÃŗn final especificada (Ãēltimos TAMAÑO bytes) de cada archivo de paridad. Fuerza la reasignaciÃŗn (movimiento) de cualquier fragmento/bloque de archivo actualmente almacenado en esa secciÃŗn final, permitiendo que se coloquen en cualquier lugar de los archivos de paridad donde haya espacio libre disponible (incluyendo huecos existentes). El propÃŗsito principal de esta opciÃŗn es reducir el tamaÃąo en disco del archivo de paridad. Si la reasignaciÃŗn vacía con Êxito toda la secciÃŗn final (no quedan bloques usÃĄndola), el archivo de paridad se trunca, recuperando el espacio final no utilizado. Puede usar multiplicadores como K, M, G o T (por ejemplo, --force-realloc-tail 1G). Puede usar locate -t, --tail para conocer de antemano los archivos afectados. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no usarla. Usted NO tiene protecciÃŗn de datos durante la operaciÃŗn `sync` para los archivos afectados. -l, --log FILE Escribe un registro detallado en el archivo especificado. Si no se especifica esta opciÃŗn, los errores inesperados se imprimen en la pantalla, lo que puede resultar en una salida excesiva en caso de muchos errores. Cuando se especifica -l, --log, solo los errores fatales que hacen que SnapRAID se detenga se imprimen en la pantalla. Si la ruta comienza con `>>`, el archivo se abre en modo de anexar. Las ocurrencias de `%D` y `%T` en el nombre se reemplazan con la fecha y hora en el formato AAAA MM DD y HH MM SS. En archivos por lotes de Windows, debe duplicar el carÃĄcter `%`, por ejemplo, resultado-%%D.log. Para usar `>>`, debe encerrar el nombre entre comillas, por ejemplo, `">>resultado.log"`. Para enviar el registro a la salida estÃĄndar o al error estÃĄndar, puede usar `">&1"` y `">&2"`, respectivamente. Consulte el archivo snapraid_log.txt o la pÃĄgina del manual para obtener descripciones de las etiquetas de registro. -L, --error-limit NUMBER Establece un nuevo límite de error antes de detener la ejecuciÃŗn. De forma predeterminada, SnapRAID se detiene si encuentra mÃĄs de 100 errores de entrada/salida, lo que indica que es probable que un disco estÊ fallando. Esta opciÃŗn afecta a `sync` y `scrub`, a los que se les permite continuar despuÊs del primer conjunto de errores de disco para intentar completar sus operaciones. Sin embargo, `check` y `fix` siempre se detienen en el primer error. -S, --start BLKSTART Comienza a procesar desde el nÃēmero de bloque especificado. Esto puede ser Ãētil para reintentar verificar o corregir bloques específicos en caso de un disco daÃąado. Esta opciÃŗn es principalmente para recuperaciÃŗn manual avanzada. -B, --count BLKCOUNT Procesa solo el nÃēmero de bloques especificado. Esta opciÃŗn es principalmente para recuperaciÃŗn manual avanzada. -C, --gen-conf CONTENT Genera un archivo de configuraciÃŗn ficticio a partir de un archivo de contenido existente. El archivo de configuraciÃŗn se escribe en la salida estÃĄndar y no sobrescribe uno existente. Este archivo de configuraciÃŗn tambiÊn contiene la informaciÃŗn necesaria para reconstruir los puntos de montaje del disco en caso de que pierda todo el sistema. -v, --verbose Imprime mÃĄs informaciÃŗn en la pantalla. Si se especifica una vez, imprime archivos excluidos y estadísticas adicionales. Esta opciÃŗn no tiene efecto en los archivos de registro. -q, --quiet Imprime menos informaciÃŗn en la pantalla. Si se especifica una vez, elimina la barra de progreso; dos veces, las operaciones en ejecuciÃŗn; tres veces, los mensajes de informaciÃŗn; cuatro veces, los mensajes de estado. Los errores fatales siempre se imprimen en la pantalla. Esta opciÃŗn no tiene efecto en los archivos de registro. -H, --help Imprime una pantalla de ayuda corta. -V, --version Imprime la versiÃŗn del programa. 7 CONFIGURATION =============== SnapRAID requiere un archivo de configuraciÃŗn para saber dÃŗnde se encuentra su array de discos y dÃŗnde almacenar la informaciÃŗn de paridad. En Unix, utiliza el archivo `/usr/local/etc/snapraid.conf` si existe, de lo contrario `/etc/snapraid.conf`. En Windows, utiliza el archivo `snapraid.conf` en el mismo directorio que `snapraid.exe`. Debe contener las siguientes opciones (distingue entre mayÃēsculas y minÃēsculas): 7.1 parity FILE [,FILE] ... --------------------------- Define los archivos a usar para almacenar la informaciÃŗn de paridad. La paridad permite la protecciÃŗn contra un solo fallo de disco, similar a RAID5. Puede especificar varios archivos, que deben estar en discos diferentes. Cuando un archivo no puede crecer mÃĄs, se utiliza el siguiente. El espacio total disponible debe ser al menos tan grande como el disco de datos mÃĄs grande del array. Puede agregar archivos de paridad adicionales mÃĄs tarde, pero no puede reordenarlos ni eliminarlos. Mantener los discos de paridad reservados para la paridad asegura que no se fragmenten, mejorando el rendimiento. En Windows, se dejan 256 MB sin usar en cada disco para evitar la advertencia sobre discos llenos. Esta opciÃŗn es obligatoria y solo se puede usar una vez. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- Define los archivos a usar para almacenar informaciÃŗn de paridad adicional. Para cada nivel de paridad especificado, se habilita un nivel adicional de protecciÃŗn: * 2-parity habilita la paridad dual RAID6. * 3-parity habilita la paridad triple. * 4-parity habilita la paridad cuÃĄdruple. * 5-parity habilita la paridad quíntuple. * 6-parity habilita la paridad sÊxtuple. Cada nivel de paridad requiere la presencia de todos los niveles de paridad anteriores. Se aplican las mismas consideraciones que para la opciÃŗn `parity`. Estas opciones son opcionales y solo se pueden usar una vez. 7.3 z-parity FILE [,FILE] ... ----------------------------- Define un archivo y un formato alternativos para almacenar paridad triple. Esta opciÃŗn es una alternativa a `3-parity`, destinada principalmente a CPU de gama baja como ARM o AMD Phenom, Athlon y Opteron que no admiten el conjunto de instrucciones SSSE3. En tales casos, proporciona un mejor rendimiento. Este formato es similar pero mÃĄs rÃĄpido que el utilizado por ZFS RAIDZ3. Al igual que ZFS, no funciona mÃĄs allÃĄ de la paridad triple. Al usar `3-parity`, se le advertirÃĄ si se recomienda usar el formato `z-parity` para mejorar el rendimiento. Es posible convertir de un formato a otro ajustando el archivo de configuraciÃŗn con el archivo z-parity o 3-parity deseado y usando `fix` para recrearlo. 7.4 content FILE ---------------- Define el archivo a usar para almacenar la lista y las sumas de comprobaciÃŗn de todos los archivos presentes en su array de discos. Se puede colocar en un disco utilizado para datos, paridad o cualquier otro disco disponible. Si usa un disco de datos, este archivo se excluye automÃĄticamente del proceso `sync`. Esta opciÃŗn es obligatoria y se puede usar varias veces para guardar mÃēltiples copias del mismo archivo. Debe almacenar al menos una copia por cada disco de paridad utilizado mÃĄs uno. Usar copias adicionales no perjudica. 7.5 data NAME DIR ----------------- Define el nombre y el punto de montaje de los discos de datos en el array. NAME se usa para identificar el disco y debe ser Ãēnico. DIR es el punto de montaje del disco en el sistema de archivos. Puede cambiar el punto de montaje segÃēn sea necesario, siempre que mantenga el NAME fijo. Debe usar una opciÃŗn para cada disco de datos en el array. Puede cambiar el nombre de un disco mÃĄs tarde cambiando el NAME directamente en el archivo de configuraciÃŗn y luego ejecutando un comando `sync`. En el caso de cambiar el nombre, la asociaciÃŗn se realiza utilizando el UUID almacenado de los discos. 7.6 extra NAME DIR ------------------ Define el nombre y el punto de montaje de discos adicionales para monitorear con los comandos `smart` y `probe`. Esto es Ãētil para monitorear discos que no forman parte de la matriz pero que son necesarios para que el sistema funcione, como el disco de arranque. Tenga en cuenta que dichos discos no se ven afectados por los comandos `up` y `down` porque se espera que estÊn siempre girando. 7.7 nohidden ------------ Excluye todos los archivos y directorios ocultos. En Unix, los archivos ocultos son los que comienzan con `.`. En Windows, son los que tienen el atributo oculto. 7.8 exclude/include PATTERN --------------------------- Define los patrones de archivo o directorio a excluir o incluir en el proceso de sincronizaciÃŗn. Todos los patrones se procesan en el orden especificado. Si el primer patrÃŗn que coincide es un `exclude`, el archivo se excluye. Si es un `include`, el archivo se incluye. Si ningÃēn patrÃŗn coincide, el archivo se excluye si el Ãēltimo patrÃŗn especificado es un `include`, o se incluye si el Ãēltimo patrÃŗn especificado es un `exclude`. Consulte la secciÃŗn PATTERN para obtener mÃĄs detalles sobre las especificaciones de patrones. Esta opciÃŗn se puede usar varias veces. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- Define el tamaÃąo de bloque bÃĄsico en kibibytes para la paridad. Un kibibyte es 1024 bytes. El tamaÃąo de bloque predeterminado es 256, que debería funcionar para la mayoría de los casos. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no cambiar este valor. Para cambiar este valor en el futuro, ÂĄtendrÃĄ que recrear toda la paridad! Una razÃŗn para usar un tamaÃąo de bloque diferente es si tiene muchos archivos pequeÃąos, del orden de millones. Para cada archivo, incluso si solo son unos pocos bytes, se asigna un bloque completo de paridad, y con muchos archivos, esto puede resultar en un espacio de paridad no utilizado significativo. Cuando llena completamente el disco de paridad, no se le permite agregar mÃĄs archivos a los discos de datos. Sin embargo, la paridad desperdiciada no se acumula en los discos de datos. El espacio desperdiciado resultante de un alto nÃēmero de archivos en un disco de datos limita solo la cantidad de datos en ese disco de datos, no en otros. Como aproximaciÃŗn, puede suponer que se desperdicia la mitad del tamaÃąo del bloque para cada archivo. Por ejemplo, con 100,000 archivos y un tamaÃąo de bloque de 256 KiB, desperdiciarÃĄ 12.8 GB de paridad, lo que puede resultar en 12.8 GB menos de espacio disponible en el disco de datos. Puede verificar la cantidad de espacio desperdiciado en cada disco usando `status`. Este es el espacio que debe dejar libre en los discos de datos o usar para archivos no incluidos en el array. Si este valor es negativo, significa que estÃĄ cerca de llenar la paridad, y representa el espacio que aÃēn puede desperdiciar. Para evitar este problema, puede usar una particiÃŗn mÃĄs grande para la paridad. Por ejemplo, si la particiÃŗn de paridad es 12.8 GB mÃĄs grande que los discos de datos, tiene suficiente espacio extra para manejar hasta 100,000 archivos en cada disco de datos sin ningÃēn espacio desperdiciado. Un truco para obtener una particiÃŗn de paridad mÃĄs grande en Linux es formatearla con el comando: mkfs.ext4 -m 0 -T largefile4 DEVICE Esto resulta en aproximadamente un 1.5% de espacio extra, aproximadamente 60 GB para un disco de 4 TB, lo que permite alrededor de 460,000 archivos en cada disco de datos sin ningÃēn espacio desperdiciado. 7.10 hashsize SIZE_IN_BYTES --------------------------- Define el tamaÃąo del hash en bytes para los bloques guardados. El tamaÃąo de hash predeterminado es de 16 bytes (128 bits), que debería funcionar para la mayoría de los casos. ÂĄADVERTENCIA! Esta opciÃŗn es solo para expertos y se recomienda encarecidamente no cambiar este valor. Para cambiar este valor en el futuro, ÂĄtendrÃĄ que recrear toda la paridad! Una razÃŗn para usar un tamaÃąo de hash diferente es si su sistema tiene memoria limitada. Como regla general, SnapRAID típicamente requiere 1 GiB de RAM por cada 16 TB de datos en el array. Específicamente, para almacenar los hashes de los datos, SnapRAID requiere aproximadamente TS*(1+HS)/BS bytes de RAM, donde TS es el tamaÃąo total en bytes de su array de discos, BS es el tamaÃąo de bloque en bytes, y HS es el tamaÃąo de hash en bytes. Por ejemplo, con 8 discos de 4 TB, un tamaÃąo de bloque de 256 KiB (1 KiB = 1024 bytes) y un tamaÃąo de hash de 16, obtiene: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Cambiando a un tamaÃąo de hash de 8, obtiene: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Cambiando a un tamaÃąo de bloque de 512, obtiene: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Cambiando tanto a un tamaÃąo de hash de 8 como a un tamaÃąo de bloque de 512, obtiene: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- Guarda automÃĄticamente el estado al sincronizar o fregar despuÊs de la cantidad especificada de GB procesados. Esta opciÃŗn es Ãētil para evitar reiniciar comandos `sync` largos desde cero si son interrumpidos por un fallo de la mÃĄquina o cualquier otro evento. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Establece la temperatura mÃĄxima permitida del disco en Celsius. Cuando se especifica, SnapRAID verifica periÃŗdicamente la temperatura de todos los discos utilizando la herramienta smartctl. Las temperaturas actuales del disco se muestran mientras SnapRAID estÃĄ operando. Si algÃēn disco excede este límite, todas las operaciones se detienen y los discos se detienen (se ponen en espera) durante la duraciÃŗn definida por la opciÃŗn `temp_sleep`. DespuÊs del período de espera, las operaciones se reanudan, pausÃĄndose potencialmente de nuevo si se alcanza el límite de temperatura una vez mÃĄs. Durante la operaciÃŗn, SnapRAID tambiÊn analiza la curva de calentamiento de cada disco y estima la temperatura constante a largo plazo que se espera que alcancen si la actividad continÃēa. La estimaciÃŗn se realiza solo despuÊs de que la temperatura del disco haya aumentado cuatro veces, asegurando que haya suficientes puntos de datos disponibles para establecer una tendencia confiable. Esta temperatura constante predicha se muestra entre parÊntesis junto al valor actual y ayuda a evaluar si la refrigeraciÃŗn del sistema es adecuada. Esta temperatura estimada es solo para fines informativos y no tiene ningÃēn efecto en el comportamiento de SnapRAID. Las acciones del programa se basan Ãēnicamente en las temperaturas reales medidas del disco. Para realizar este anÃĄlisis, SnapRAID necesita una referencia para la temperatura del sistema. Primero intenta leerla de los sensores de hardware disponibles. Si no se puede acceder a ningÃēn sensor del sistema, utiliza la temperatura del disco mÃĄs baja medida al comienzo de la ejecuciÃŗn como referencia de respaldo. Normalmente, SnapRAID solo muestra la temperatura del disco mÃĄs caliente. Para mostrar la temperatura de todos los discos, use la opciÃŗn -A o --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Establece el tiempo de espera, en minutos, cuando se alcanza el límite de temperatura. Durante este período, los discos permanecen detenidos. El valor predeterminado es de 5 minutos. 7.14 pool DIR ------------- Define el directorio de agrupaciÃŗn (pooling) donde se crea la vista virtual del array de discos utilizando el comando `pool`. El directorio ya debe existir. 7.15 share UNC_DIR ------------------ Define la ruta UNC de Windows requerida para acceder a los discos de forma remota. Si se especifica esta opciÃŗn, los enlaces simbÃŗlicos creados en el directorio pool utilizan esta ruta UNC para acceder a los discos. Sin esta opciÃŗn, los enlaces simbÃŗlicos generados utilizan solo rutas locales, lo que no permite compartir el directorio pool a travÊs de la red. Los enlaces simbÃŗlicos se forman utilizando la ruta UNC especificada, agregando el nombre del disco como se especifica en la opciÃŗn `data`, y finalmente agregando el directorio y el nombre del archivo. Esta opciÃŗn solo es necesaria para Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ Define opciones personalizadas de smartctl para obtener los atributos SMART de cada disco. Esto puede ser necesario para controladores RAID y algunos discos USB que no se pueden detectar automÃĄticamente. El marcador de posiciÃŗn %s se reemplaza por el nombre del dispositivo, pero es opcional para dispositivos fijos como controladores RAID. DISK es el mismo nombre de disco especificado en la opciÃŗn `data`. PARITY es uno de los nombres de paridad: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. En las OPCIONES especificadas, la cadena `%s` se reemplaza por el nombre del dispositivo. Para los controladores RAID, el dispositivo es probable que sea fijo y es posible que no necesite usar `%s`. Consulte la documentaciÃŗn de smartmontools para conocer las posibles opciones: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices Por ejemplo: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignora el atributo SMART especificado al calcular la probabilidad de fallo del disco. Esta opciÃŗn es Ãētil si un disco informa valores inusuales o engaÃąosos para un atributo en particular. DISK es el mismo nombre de disco especificado en la opciÃŗn `data`. PARITY es uno de los nombres de paridad: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. El valor especial * se puede usar para ignorar el atributo en todos los discos. Por ejemplo, para ignorar el atributo `Current Pending Sector Count` en todos los discos: smartignore * 197 Para ignorarlo solo en el primer disco de paridad: smartignore parity 197 7.18 Examples ------------- Un ejemplo de una configuraciÃŗn típica para Unix es: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Un ejemplo de una configuraciÃŗn típica para Windows es: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= Los patrones proporcionan una forma flexible de filtrar archivos para su inclusiÃŗn o exclusiÃŗn. Al usar caracteres de globbing, puede definir reglas que coincidan con nombres de archivos específicos o estructuras de directorios completas sin enumerar cada ruta manualmente. El signo de interrogaciÃŗn `?` coincide con cualquier carÃĄcter individual excepto el separador de directorios. Esto lo hace Ãētil para hacer coincidir nombres de archivos con caracteres variables manteniendo el patrÃŗn limitado a un solo nivel de directorio. El asterisco simple `*` coincide con cualquier secuencia de caracteres, pero al igual que el signo de interrogaciÃŗn, nunca cruza los límites de los directorios. Se detiene en la barra diagonal, lo que lo hace adecuado para buscar coincidencias dentro de un solo componente de ruta. Este es el comportamiento estÃĄndar de los comodines familiar del globbing de la shell. el doble asterisco `**` es mÃĄs potente, coincide con cualquier secuencia de caracteres, incluidos los separadores de directorios. Esto permite que los patrones coincidan a travÊs de mÃēltiples niveles de directorio. Cuando `**` aparece incrustado directamente en un patrÃŗn, puede coincidir con cero o mÃĄs caracteres, incluidas las barras diagonales entre el texto literal circundante. El uso mÃĄs importante de `**` es en la forma especial `/**/`. Esta coincide con cero o mÃĄs niveles de directorio completos, lo que permite que los archivos coincidan a cualquier profundidad en un ÃĄrbol de directorios sin conocer la estructura exacta de la ruta. Por ejemplo, el patrÃŗn `src/**/main.js` coincide con `src/main.js` (saltando cero directorios), `src/ui/main.js` (saltando un directorio) y `src/ui/components/main.js` (saltando dos directorios). Las clases de caracteres que utilizan corchetes `[]` coinciden con un solo carÃĄcter de un conjunto o rango especificado. Al igual que los otros patrones de un solo carÃĄcter, no coinciden con los separadores de directorios. Las clases admiten rangos y negaciÃŗn mediante un signo de exclamaciÃŗn. La distinciÃŗn fundamental que debe recordar es que `*`, `?` y las clases de caracteres respetan los límites de los directorios y solo coinciden dentro de un Ãēnico componente de ruta, mientras que `**` es el Ãēnico patrÃŗn que puede coincidir a travÊs de los separadores de directorios. Hay cuatro tipos diferentes de patrones: FILE Selecciona cualquier archivo llamado FILE. Este patrÃŗn se aplica solo a archivos, no a directorios. DIR/ Selecciona cualquier directorio llamado DIR y todo lo que hay dentro. Este patrÃŗn se aplica solo a directorios, no a archivos. /PATH/FILE Selecciona la ruta exacta del archivo especificado. Este patrÃŗn se aplica solo a archivos, no a directorios. /PATH/DIR/ Selecciona la ruta exacta del directorio especificado y todo lo que hay dentro. Este patrÃŗn se aplica solo a directorios, no a archivos. Cuando especifica una ruta absoluta que comienza con /, se aplica en el directorio raíz del array, no en el directorio raíz del sistema de archivos local. En Windows, puede usar la barra invertida \ en lugar de la barra /. Los directorios del sistema de Windows, las uniones, los puntos de montaje y otros directorios especiales de Windows se tratan como archivos, lo que significa que para excluirlos, debe usar una regla de archivo, no una de directorio. Si el nombre del archivo contiene un carÃĄcter `*`, `?`, `[`, o `]`, debe escaparlo para evitar que se interprete como un carÃĄcter globbing. En Unix, el carÃĄcter de escape es `\`; en Windows, es `^`. Cuando el patrÃŗn estÃĄ en la línea de comandos, debe duplicar el carÃĄcter de escape para evitar que sea interpretado por el shell de comandos. En el archivo de configuraciÃŗn, puede usar diferentes estrategias para filtrar los archivos a procesar. El enfoque mÃĄs simple es usar solo reglas `exclude` para eliminar todos los archivos y directorios que no desea procesar. Por ejemplo: # Excluye cualquier archivo llamado `*.unrecoverable` exclude *.unrecoverable # Excluye el directorio raíz `/lost+found` exclude /lost+found/ # Excluye cualquier subdirectorio llamado `tmp` exclude tmp/ El enfoque opuesto es definir solo los archivos que desea procesar, utilizando solo reglas `include`. Por ejemplo: # Incluye solo algunos directorios include /movies/ include /musics/ include /pictures/ El enfoque final es mezclar reglas `exclude` e `include`. En este caso, el orden de las reglas es importante. Las reglas anteriores tienen precedencia sobre las posteriores. Para simplificar, puede enumerar todas las reglas `exclude` primero y luego todas las reglas `include`. Por ejemplo: # Excluye cualquier archivo llamado `*.unrecoverable` exclude *.unrecoverable # Excluye cualquier subdirectorio llamado `tmp` exclude tmp/ # Incluye solo algunos directorios include /movies/ include /musics/ include /pictures/ En la línea de comandos, usando la opciÃŗn -f, solo puede usar patrones `include`. Por ejemplo: # Verifica solo los archivos .mp3. # En Unix, use comillas para evitar la expansiÃŗn globbing por el shell. snapraid -f "*.mp3" check En Unix, al usar caracteres globbing en la línea de comandos, debe ponerlos entre comillas para evitar que el shell los expanda. 9 IGNORAR ARCHIVOS ================== AdemÃĄs de las reglas globales en el archivo de configuraciÃŗn, puedes colocar archivos `.snapraidignore` en cualquier directorio dentro del array para definir reglas de exclusiÃŗn descentralizadas. Las reglas definidas en `.snapraidignore` se aplican despuÊs de las reglas del archivo de configuraciÃŗn. Esto significa que tienen una prioridad mÃĄs alta y pueden usarse para excluir archivos que fueron incluidos previamente por la configuraciÃŗn global. Efectivamente, si una regla local coincide, el archivo se excluye independientemente de los ajustes de inclusiÃŗn globales. La lÃŗgica de patrones en `.snapraidignore` refleja la configuraciÃŗn global pero ancla los patrones al directorio donde se encuentra el archivo: FILE Selecciona cualquier archivo llamado FILE en este directorio o por debajo. Esto sigue las mismas reglas de globbing que el patrÃŗn global. DIR/ Selecciona cualquier directorio llamado DIR y todo su contenido, ubicado en este directorio o por debajo. /PATH/FILE Selecciona el archivo exacto especificado relativo a la ubicaciÃŗn del archivo `.snapraidignore`. /PATH/DIR/ Selecciona el directorio exacto especificado y todo su contenido, relativo a la ubicaciÃŗn del archivo `.snapraidignore`. A diferencia de la configuraciÃŗn global, los archivos `.snapraidignore` solo admiten reglas de exclusiÃŗn; no se pueden usar patrones `include` o negaciÃŗn (!). Por ejemplo, si tienes un `.snapraidignore` en `/mnt/disk1/projects/`: # Excluye SOLO /mnt/disk1/projects/output.bin /output.bin # Excluye cualquier directorio llamado `build` dentro de projects/ build/ # Excluye cualquier archivo .tmp dentro de projects/ o sus subcarpetas *.tmp 10 CONTENT ========== SnapRAID almacena la lista y las sumas de comprobaciÃŗn de sus archivos en el archivo de contenido. Es un archivo binario que enumera todos los archivos presentes en su array de discos, junto con todas las sumas de comprobaciÃŗn para verificar su integridad. Este archivo es leído y escrito por los comandos `sync` y `scrub` y leído por los comandos `fix`, `check` y `status`. 11 PARITY ========= SnapRAID almacena la informaciÃŗn de paridad de su array en los archivos de paridad. Estos son archivos binarios que contienen la paridad calculada de todos los bloques definidos en el archivo `content`. Estos archivos son leídos y escritos por los comandos `sync` y `fix` y solo leídos por los comandos `scrub` y `check`. 12 ENCODING =========== SnapRAID en Unix ignora cualquier codificaciÃŗn. Lee y almacena los nombres de archivo con la misma codificaciÃŗn utilizada por el sistema de archivos. En Windows, todos los nombres leídos del sistema de archivos se convierten y procesan en formato UTF-8. Para que los nombres de archivo se impriman correctamente, debe configurar la consola de Windows en modo UTF-8 con el comando `chcp 65001` y usar una fuente TrueType como `Lucida Console` como fuente de la consola. Esto afecta solo a los nombres de archivo impresos; si redirige la salida de la consola a un archivo, el archivo resultante siempre estÃĄ en formato UTF-8. 13 COPYRIGHT ============ Este archivo es Copyright (C) 2025 Andrea Mazzoleni 14 SEE ALSO =========== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-fr.1000066400000000000000000002251501522717156100163210ustar00rootroot00000000000000.TH "Sauvegarde SnapRAID pour baies de disques" 1 .SH NAME snapraid \- Sauvegarde SnapRAID pour baies de disques .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter MOTIF] [\-d, \-\-filter\-disk NOM] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DOSSIER] .PD 0 .PP .PD [\-p, \-\-plan PERC|mauvais|nouveau|complet] .PD 0 .PP .PD [\-o, \-\-older\-than JOURS] [\-l, \-\-log FICHIER] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit DÉBIT] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NOMBRE] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENU] .PD 0 .PD .SH DESCRIPTION SnapRAID est un programme de sauvegarde conçu pour les baies de disques, stockant les informations de paritÊ pour la rÊcupÊration des donnÊes en cas de dÊfaillance de six disques maximum. .PP Principalement destinÊ aux centres multimÊdia domestiques avec des fichiers volumineux et peu souvent modifiÊs, SnapRAID offre plusieurs fonctionnalitÊs : .PD 0 .IP \(bu Vous pouvez utiliser des disques dÊjà remplis de fichiers sans avoir besoin de les reformater, en y accÊdant comme d\'habitude. .IP \(bu Toutes vos donnÊes sont hachÊes pour garantir l\'intÊgritÊ des donnÊes et prÊvenir la corruption silencieuse. .IP \(bu Lorsque le nombre de disques dÊfaillants dÊpasse le nombre de paritÊs, la perte de donnÊes est limitÊe aux disques affectÊs ; les donnÊes sur les autres disques restent accessibles. .IP \(bu Si vous supprimez accidentellement des fichiers sur un disque, la rÊcupÊration est possible. .IP \(bu Les disques peuvent avoir des tailles diffÊrentes. .IP \(bu Vous pouvez ajouter des disques à tout moment. .IP \(bu SnapRAID ne verrouille pas vos donnÊes ; vous pouvez arrÃĒter de l\'utiliser à tout moment sans reformater ni dÊplacer de donnÊes. .IP \(bu Pour accÊder à un fichier, un seul disque doit tourner, ce qui Êconomise de l\'Ênergie et rÊduit le bruit. .PD .PP Pour plus d\'informations, veuillez visiter le site officiel de SnapRAID : .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID est un hybride entre un programme RAID et un programme de sauvegarde, visant à combiner les meilleurs avantages des deux. Cependant, il a quelques limitations que vous devriez considÊrer avant de l\'utiliser. .PP La principale limitation est que si un disque tombe en panne et que vous n\'avez pas synchronisÊ rÊcemment, vous pourriez ne pas ÃĒtre en mesure de rÊcupÊrer complètement. Plus prÊcisÊment, vous pourriez ne pas ÃĒtre en mesure de rÊcupÊrer jusqu\'à la taille des fichiers modifiÊs ou supprimÊs depuis la dernière opÊration de synchronisation. Cela se produit mÃĒme si les fichiers modifiÊs ou supprimÊs ne se trouvent pas sur le disque dÊfaillant. C\'est pourquoi SnapRAID est mieux adaptÊ aux donnÊes qui changent rarement. .PP D\'un autre côtÊ, les fichiers nouvellement ajoutÊs n\'empÃĒchent pas la rÊcupÊration des fichiers dÊjà existants. Vous ne perdrez que les fichiers rÊcemment ajoutÊs s\'ils se trouvent sur le disque dÊfaillant. .PP Les autres limitations de SnapRAID sont : .PD 0 .IP \(bu Avec SnapRAID, vous avez toujours des systèmes de fichiers sÊparÊs pour chaque disque. Avec le RAID, vous obtenez un seul grand système de fichiers. .IP \(bu SnapRAID ne fait pas de striping (entrelacement) des donnÊes. Avec le RAID, vous obtenez un gain de vitesse avec le striping. .IP \(bu SnapRAID ne prend pas en charge la rÊcupÊration en temps rÊel. Avec le RAID, vous n\'avez pas à arrÃĒter de travailler lorsqu\'un disque tombe en panne. .IP \(bu SnapRAID ne peut rÊcupÊrer des donnÊes que pour un nombre limitÊ de dÊfaillances de disques. Avec une sauvegarde, vous pouvez rÊcupÊrer d\'une dÊfaillance complète de toute la baie de disques. .IP \(bu Seuls les noms de fichiers, les horodatages, les liens symboliques et les liens matÊriels sont sauvegardÊs. Les permissions, la propriÊtÊ et les attributs Êtendus ne sont pas sauvegardÊs. .PD .SH DÊMARRER Pour utiliser SnapRAID, vous devez d\'abord sÊlectionner un disque dans votre baie de disques pour le dÊdier aux informations de \`paritÊ\`. Avec un disque pour la paritÊ, vous pourrez rÊcupÊrer d\'une seule dÊfaillance de disque, similaire au RAID5. .PP Si vous souhaitez rÊcupÊrer de plus de dÊfaillances de disques, similaire au RAID6, vous devez rÊserver des disques supplÊmentaires pour la paritÊ. Chaque disque de paritÊ supplÊmentaire permet la rÊcupÊration d\'une dÊfaillance de disque de plus. .PP Comme disques de paritÊ, vous devez choisir les plus grands disques de la baie, car les informations de paritÊ peuvent atteindre la taille du plus grand disque de donnÊes de la baie. .PP Ces disques seront dÊdiÊs au stockage des fichiers de \`paritÊ\`. Vous ne devriez pas y stocker vos donnÊes. .PP Ensuite, vous devez dÊfinir les disques de \`donnÊes\` que vous souhaitez protÊger avec SnapRAID. La protection est plus efficace si ces disques contiennent des donnÊes qui changent rarement. Pour cette raison, il est prÊfÊrable de NE PAS inclure le disque C:\\ de Windows ou les rÊpertoires /home, /var et /tmp d\'Unix. .PP La liste des fichiers est enregistrÊe dans les fichiers \`content\` (contenu), gÊnÊralement stockÊs sur les disques de donnÊes, de paritÊ ou de dÊmarrage. Ce fichier contient les dÊtails de votre sauvegarde, y compris toutes les sommes de contrôle pour vÊrifier son intÊgritÊ. Le fichier \`content\` est stockÊ en plusieurs copies, et chaque copie doit se trouver sur un disque diffÊrent pour garantir qu\'au moins une copie soit disponible, mÃĒme en cas de dÊfaillances de disques multiples. .PP Par exemple, supposons que vous ne soyez intÊressÊ que par un seul niveau de protection de paritÊ, et que vos disques se trouvent à : .PP .RS 4 /mnt/diskp <\- disque sÊlectionnÊ pour la paritÊ .PD 0 .PP .PD /mnt/disk1 <\- premier disque à protÊger .PD 0 .PP .PD /mnt/disk2 <\- deuxième disque à protÊger .PD 0 .PP .PD /mnt/disk3 <\- troisième disque à protÊger .PD 0 .PD .RE .PP Vous devez crÊer le fichier de configuration /etc/snapraid.conf avec les options suivantes : .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Si vous ÃĒtes sous Windows, vous devez utiliser le format de chemin Windows, avec des lettres de lecteur et des barres obliques inverses au lieu de barres obliques. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Si vous avez de nombreux disques et manquez de lettres de lecteur, vous pouvez monter les disques directement dans des sous\-dossiers. Voir : .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP À ce stade, vous ÃĒtes prÃĒt à exÊcuter la commande \`sync\` (synchroniser) pour construire les informations de paritÊ. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Ce processus peut prendre plusieurs heures la première fois, en fonction de la taille des donnÊes dÊjà prÊsentes sur les disques. Si les disques sont vides, le processus est immÊdiat. .PP Vous pouvez l\'arrÃĒter à tout moment en appuyant sur Ctrl+C, et lors de la prochaine exÊcution, il reprendra là oÚ il a ÊtÊ interrompu. .PP Lorsque cette commande est terminÊe, vos donnÊes sont EN SÉCURITÉ. .PP Vous pouvez maintenant commencer à utiliser votre baie comme vous le souhaitez et mettre à jour pÊriodiquement les informations de paritÊ en exÊcutant la commande \`sync\`. .SS Nettoyage (Scrubbing) Pour vÊrifier pÊriodiquement les donnÊes et la paritÊ à la recherche d\'erreurs, vous pouvez exÊcuter la commande \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Cette commande compare les donnÊes de votre baie avec le hachage calculÊ lors de la commande \`sync\` pour vÊrifier l\'intÊgritÊ. .PP Chaque exÊcution de la commande vÊrifie environ 8 % de la baie, en excluant les donnÊes dÊjà nettoyÊes au cours des 10 jours prÊcÊdents. Vous pouvez utiliser l\'option \-p, \-\-plan pour spÊcifier une quantitÊ diffÊrente et l\'option \-o, \-\-older\-than pour spÊcifier un Ãĸge diffÊrent en jours. Par exemple, pour vÊrifier 5 % de la baie pour les blocs de plus de 20 jours, utilisez : .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Si des erreurs silencieuses ou d\'entrÊe/sortie sont trouvÊes pendant le processus, les blocs correspondants sont marquÊs comme mauvais dans le fichier \`content\` et listÊs dans la commande \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Pour les corriger, vous pouvez utiliser la commande \`fix\`, en filtrant les mauvais blocs avec l\'option \-e, \-\-filter\-error : .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP Lors du prochain \`scrub\`, les erreurs disparaÃŽtront du rapport \`status\` si elles sont rÊellement corrigÊes. Pour accÊlÊrer, vous pouvez utiliser \-p mauvais pour nettoyer uniquement les blocs marquÊs comme mauvais. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP L\'exÊcution de \`scrub\` sur une baie non synchronisÊe peut signaler des erreurs causÊes par des fichiers supprimÊs ou modifiÊs. Ces erreurs sont signalÊes dans la sortie de \`scrub\`, mais les blocs associÊs ne sont pas marquÊs comme mauvais. .SS Mise en commun (Pooling) Note : La fonctionnalitÊ de mise en commun dÊcrite ci\-dessous a ÊtÊ remplacÊe par l\'outil mergerfs, qui est dÊsormais l\'option recommandÊe pour les utilisateurs Linux de la communautÊ SnapRAID. Mergefs offre un moyen plus flexible et efficace de regrouper plusieurs disques dans un seul point de montage unifiÊ, permettant un accès transparent aux fichiers sur toute votre baie sans dÊpendre de liens symboliques. Il s\'intègre bien avec SnapRAID pour la protection par paritÊ et est couramment utilisÊ dans des configurations comme OpenMediaVault (OMV) ou des configurations NAS personnalisÊes. .PP Pour que tous les fichiers de votre baie apparaissent dans la mÃĒme arborescence de rÊpertoires, vous pouvez activer la fonctionnalitÊ de \`pooling\`. Elle crÊe une vue virtuelle en lecture seule de tous les fichiers de votre baie à l\'aide de liens symboliques. .PP Vous pouvez configurer le rÊpertoire de \`pooling\` dans le fichier de configuration avec : .PP .RS 4 pool /pool .PD 0 .PD .RE .PP ou, si vous ÃĒtes sous Windows, avec : .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP puis exÊcutez la commande \`pool\` pour crÊer ou mettre à jour la vue virtuelle. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Si vous utilisez une plateforme Unix et souhaitez partager ce rÊpertoire sur le rÊseau avec des machines Windows ou Unix, vous devez ajouter les options suivantes à votre /etc/samba/smb.conf : .PP .RS 4 # Dans la section globale de smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # Dans la section de partage de smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP Sous Windows, le partage de liens symboliques sur un rÊseau nÊcessite que les clients les rÊsolvent à distance. Pour activer cela, en plus de partager le rÊpertoire du pool, vous devez Êgalement partager tous les disques indÊpendamment, en utilisant les noms de disques dÊfinis dans le fichier de configuration comme points de partage. Vous devez Êgalement spÊcifier dans l\'option \`share\` du fichier de configuration le chemin UNC Windows que les clients distants doivent utiliser pour accÊder à ces disques partagÊs. .PP Par exemple, en opÊrant à partir d\'un serveur nommÊ \`darkstar\`, vous pouvez utiliser les options : .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP et partager les rÊpertoires suivants sur le rÊseau : .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP pour permettre aux clients distants d\'accÊder à tous les fichiers à \\\\darkstar\\pool. .PP Vous pourriez Êgalement avoir besoin de configurer les clients distants pour activer l\'accès aux liens symboliques distants avec la commande : .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Restauration (Undeleting) SnapRAID fonctionne davantage comme un programme de sauvegarde qu\'un système RAID, et il peut ÃĒtre utilisÊ pour restaurer ou rÊcupÊrer des fichiers dans leur Êtat prÊcÊdent à l\'aide de l\'option \-f, \-\-filter : .PP .RS 4 snapraid fix \-f FICHIER .PD 0 .PD .RE .PP ou pour un rÊpertoire : .PP .RS 4 snapraid fix \-f DOSSIER/ .PD 0 .PD .RE .PP Vous pouvez Êgalement l\'utiliser pour rÊcupÊrer uniquement les fichiers accidentellement supprimÊs à l\'intÊrieur d\'un rÊpertoire en utilisant l\'option \-m, \-\-filter\-missing, qui ne restaure que les fichiers manquants, laissant tous les autres intacts. .PP .RS 4 snapraid fix \-m \-f DOSSIER/ .PD 0 .PD .RE .PP Ou pour rÊcupÊrer tous les fichiers supprimÊs sur tous les lecteurs avec : .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS RÊcupÊration Le pire est arrivÊ, et vous avez perdu un ou plusieurs disques ! .PP NE PANIQUEZ PAS ! Vous pourrez les rÊcupÊrer ! .PP La première chose à faire est d\'Êviter d\'autres modifications sur votre baie de disques. DÊsactivez toute connexion à distance et tout processus planifiÊ, y compris toute synchronisation ou nettoyage SnapRAID nocturne planifiÊ. .PP ProcÊdez ensuite aux Êtapes suivantes. .SS ÉTAPE 1 \-> Reconfigurer Vous avez besoin d\'espace pour rÊcupÊrer, idÊalement sur des disques de rechange supplÊmentaires, mais un disque USB externe ou un disque distant suffira. .PP Modifiez le fichier de configuration SnapRAID pour que l\'option \`data\` ou \`parity\` du disque dÊfaillant pointe vers un emplacement avec suffisamment d\'espace vide pour rÊcupÊrer les fichiers. .PP Par exemple, si le disque \`d1\` a ÊchouÊ, passez de : .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP à : .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Si le disque à rÊcupÊrer est un disque de paritÊ, mettez à jour l\'option \`parity\` appropriÊe. Si vous avez plusieurs disques dÊfaillants, mettez à jour toutes leurs options de configuration. .SS ÉTAPE 2 \-> Corriger (Fix) ExÊcutez la commande fix, en stockant le journal dans un fichier externe avec : .PP .RS 4 snapraid \-d NOM \-l fix.log fix .PD 0 .PD .RE .PP OÚ NOM est le nom du disque, tel que \`d1\` dans notre exemple prÊcÊdent. Si le disque à rÊcupÊrer est un disque de paritÊ, utilisez les noms \`parity\`, \`2\-parity\`, etc. Si vous avez plusieurs disques dÊfaillants, utilisez plusieurs options \-d pour les spÊcifier tous. .PP Cette commande prendra beaucoup de temps. .PP Assurez\-vous d\'avoir quelques gigaoctets libres pour stocker le fichier fix.log. ExÊcutez\-la à partir d\'un disque avec suffisamment d\'espace libre. .PP Vous avez maintenant rÊcupÊrÊ tout ce qui est rÊcupÊrable. Si certains fichiers sont partiellement ou totalement irrÊcupÊrables, ils seront renommÊs en ajoutant l\'extension \`.unrecoverable\`. .PP Vous pouvez trouver une liste dÊtaillÊe de tous les blocs irrÊcupÊrables dans le fichier fix.log en vÊrifiant toutes les lignes commençant par \`unrecoverable:\`. .PP Si la rÊcupÊration ne vous satisfait pas, vous pouvez rÊessayer autant de fois que vous le souhaitez. .PP Par exemple, si vous avez supprimÊ des fichiers de la baie après le dernier \`sync\`, cela peut entraÃŽner la non\-rÊcupÊration de certains fichiers. Dans ce cas, vous pouvez rÊessayer le \`fix\` en utilisant l\'option \-i, \-\-import, en spÊcifiant oÚ se trouvent maintenant ces fichiers pour les inclure à nouveau dans le processus de rÊcupÊration. .PP Si vous ÃĒtes satisfait de la rÊcupÊration, vous pouvez continuer, mais notez qu\'après la synchronisation, vous ne pouvez plus rÊessayer la commande \`fix\` ! .SS ÉTAPE 3 \-> VÊrifier (Check) Par prÊcaution, vous pouvez maintenant exÊcuter une commande \`check\` pour vous assurer que tout est correct sur le disque rÊcupÊrÊ. .PP .RS 4 snapraid \-d NOM \-a check .PD 0 .PD .RE .PP OÚ NOM est le nom du disque, tel que \`d1\` dans notre exemple prÊcÊdent. .PP Les options \-d et \-a indiquent à SnapRAID de vÊrifier uniquement le disque spÊcifiÊ et d\'ignorer toutes les donnÊes de paritÊ. .PP Cette commande prendra beaucoup de temps, mais si vous n\'ÃĒtes pas trop prudent, vous pouvez la sauter. .SS ÉTAPE 4 \-> Synchroniser (Sync) ExÊcutez la commande \`sync\` pour resynchroniser la baie avec le nouveau disque. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Si tout est rÊcupÊrÊ, cette commande est immÊdiate. .SH COMMANDES SnapRAID fournit quelques commandes simples qui vous permettent de : .PD 0 .IP \(bu Afficher l\'Êtat de la baie de disques \-> \`status\` .IP \(bu Contrôler les disques \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Faire une sauvegarde/instantanÊ \-> \`sync\` .IP \(bu VÊrifier pÊriodiquement les donnÊes \-> \`scrub\` .IP \(bu Restaurer la dernière sauvegarde/instantanÊ \-> \`fix\`. .PD .PP Les commandes doivent ÃĒtre Êcrites en minuscules. .SS status Affiche un rÊsumÊ de l\'Êtat de la baie de disques. .PP Il comprend des informations sur la fragmentation de la paritÊ, l\'Ãĸge des blocs sans vÊrification, et toutes les erreurs silencieuses enregistrÊes rencontrÊes lors du nettoyage. .PP Les informations prÊsentÊes se rÊfèrent au dernier moment oÚ vous avez exÊcutÊ \`sync\`. Les modifications ultÊrieures ne sont pas prises en compte. .PP Si des mauvais blocs ont ÊtÊ dÊtectÊs, leurs numÊros de blocs sont listÊs. Pour les corriger, vous pouvez utiliser la commande \`fix \-e\`. .PP Il montre Êgalement un graphique reprÊsentant la dernière fois que chaque bloc a ÊtÊ nettoyÊ ou synchronisÊ. Les blocs nettoyÊs sont affichÊs avec \`*\`, les blocs synchronisÊs mais pas encore nettoyÊs avec \`o\`. .PP Rien n\'est modifiÊ. .SS smart Affiche un rapport SMART de tous les disques du système. .PP Il comprend une estimation de la probabilitÊ de dÊfaillance au cours de la prochaine annÊe, vous permettant de planifier les remplacements de maintenance des disques qui prÊsentent des attributs suspects. .PP Cette estimation de probabilitÊ est obtenue en corrÊlant les attributs SMART des disques avec les donnÊes Backblaze disponibles à : .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Si SMART signale qu\'un disque est en panne, \`FAIL\` ou \`PREFAIL\` est affichÊ pour ce disque, et SnapRAID retourne une erreur. Dans ce cas, le remplacement immÊdiat du disque est fortement recommandÊ. .PP Les autres chaÃŽnes d\'Êtat possibles sont : .RS 4 .PD 0 .HP 4 .I logfail Dans le passÊ, certains attributs Êtaient infÊrieurs au seuil. .HP 4 .I logerr Le journal d\'erreurs du pÊriphÊrique contient des erreurs. .HP 4 .I selferr Le journal d\'auto\-test du pÊriphÊrique contient des erreurs. .PD .RE .PP Si l\'option \-v, \-\-verbose est spÊcifiÊe, une analyse statistique plus approfondie est fournie. Cette analyse peut vous aider à dÊcider si vous avez besoin de plus ou moins de paritÊ. .PP Cette commande utilise l\'outil \`smartctl\` et Êquivaut à exÊcuter \`smartctl \-a\` sur tous les pÊriphÊriques. .PP Si vos pÊriphÊriques ne sont pas dÊtectÊs automatiquement correctement, vous pouvez spÊcifier une commande personnalisÊe en utilisant l\'option \`smartctl\` dans le fichier de configuration. .PP Rien n\'est modifiÊ. .SS probe Affiche l\'Êtat d\'ALIMENTATION de tous les disques du système. .PP \`Standby\` signifie que le disque ne tourne pas. \`Active\` signifie que le disque tourne. .PP Cette commande utilise l\'outil \`smartctl\` et Êquivaut à exÊcuter \`smartctl \-n standby \-i\` sur tous les pÊriphÊriques. .PP Si vos pÊriphÊriques ne sont pas dÊtectÊs automatiquement correctement, vous pouvez spÊcifier une commande personnalisÊe en utilisant l\'option \`smartctl\` dans le fichier de configuration. .PP Rien n\'est modifiÊ. .SS up Fait tourner (spin up) tous les disques de la baie. .PP Vous pouvez faire tourner uniquement des disques spÊcifiques en utilisant l\'option \-d, \-\-filter\-disk. .PP Faire tourner tous les disques en mÃĒme temps nÊcessite beaucoup d\'Ênergie. Assurez\-vous que votre alimentation peut le supporter. .PP Rien n\'est modifiÊ. .SS down ArrÃĒte (spin down) tous les disques de la baie. .PP Cette commande utilise l\'outil \`smartctl\` et Êquivaut à exÊcuter \`smartctl \-s standby,now\` sur tous les pÊriphÊriques. .PP Vous pouvez arrÃĒter uniquement des disques spÊcifiques en utilisant l\'option \-d, \-\-filter\-disk. .PP Pour arrÃĒter automatiquement en cas d\'erreur, vous pouvez utiliser l\'option \-s, \-\-spin\-down\-on\-error avec toute autre commande, ce qui Êquivaut à exÊcuter \`down\` manuellement lorsqu\'une erreur se produit. .PP Rien n\'est modifiÊ. .SS diff Liste tous les fichiers modifiÊs depuis le dernier \`sync\` qui nÊcessitent la recomputation de leurs donnÊes de paritÊ. .PP Cette commande ne vÊrifie pas les donnÊes des fichiers, mais uniquement l\'horodatage, la taille et l\'inode du fichier. .PP Après avoir listÊ tous les fichiers modifiÊs, un rÊsumÊ des modifications est prÊsentÊ, regroupÊ par : .RS 4 .PD 0 .HP 4 .I equal Fichiers inchangÊs par rapport à avant. .HP 4 .I added Fichiers ajoutÊs qui n\'Êtaient pas prÊsents auparavant. .HP 4 .I removed Fichiers supprimÊs. .HP 4 .I updated Fichiers avec une taille ou un horodatage diffÊrent, signifiant qu\'ils ont ÊtÊ modifiÊs. .HP 4 .I moved Fichiers dÊplacÊs vers un rÊpertoire diffÊrent sur le mÃĒme disque. Ils sont identifiÊs par le mÃĒme nom, la mÃĒme taille, le mÃĒme horodatage et le mÃĒme inode, mais un rÊpertoire diffÊrent. .HP 4 .I copied Fichiers copiÊs sur le mÃĒme disque ou sur un disque diffÊrent oÚ le fichier original existe toujours. Ils sont identifiÊs par le fait qu\'ils ont le mÃĒme nom, la mÃĒme taille et le mÃĒme horodatage. Si l\'horodatage à la sous\-seconde est nul, le chemin complet doit correspondre pour ÃĒtre identifiÊ, pas seulement le nom. .HP 4 .I relocated Fichiers dÊplacÊs sur le mÃĒme disque ou sur un disque diffÊrent oÚ l\'original a disparu. Ils sont identifiÊs par le fait qu\'ils ont le mÃĒme nom, la mÃĒme taille et le mÃĒme horodatage. Si l\'horodatage à la sous\-seconde est nul, le chemin complet doit correspondre pour ÃĒtre identifiÊ. Contrairement aux fichiers \'moved\' sur le mÃĒme disque, les fichiers relocalisÊs ont un inode diffÊrent. .HP 4 .I restored Fichiers avec un inode diffÊrent mais dont le rÊpertoire, le nom, la taille et l\'horodatage correspondent. Il s\'agit gÊnÊralement de fichiers restaurÊs après avoir ÊtÊ supprimÊs. .PD .RE .PP Si un \`sync\` est requis, le code de retour du processus est 2, au lieu du 0 par dÊfaut. Le code de retour 1 est utilisÊ pour une condition d\'erreur gÊnÊrique. .PP Rien n\'est modifiÊ. .SS sync Met à jour les informations de paritÊ. Tous les fichiers modifiÊs dans la baie de disques sont lus, et les donnÊes de paritÊ correspondantes sont mises à jour. .PP Vous pouvez arrÃĒter ce processus à tout moment en appuyant sur Ctrl+C, sans perdre le travail dÊjà effectuÊ. Lors de la prochaine exÊcution, le processus \`sync\` reprendra là oÚ il a ÊtÊ interrompu. .PP Si des erreurs silencieuses ou d\'entrÊe/sortie sont trouvÊes pendant le processus, les blocs correspondants sont marquÊs comme mauvais. .PP Les fichiers sont identifiÊs par chemin et/ou inode et vÊrifiÊs par taille et horodatage. Si la taille ou l\'horodatage du fichier diffère, les donnÊes de paritÊ sont recomptÊes pour l\'ensemble du fichier. Si le fichier est dÊplacÊ ou renommÊ sur le mÃĒme disque, en gardant le mÃĒme inode, la paritÊ n\'est pas recomptÊe. Si le fichier est dÊplacÊ vers un autre disque, la paritÊ est recomptÊe, mais les informations de hachage prÊcÊdemment calculÊes sont conservÊes. .PP Les fichiers \`content\` et \`parity\` sont modifiÊs si nÊcessaire. Les fichiers dans la baie NE SONT PAS modifiÊs. .SS scrub Nettoie la baie, vÊrifiant les erreurs silencieuses ou d\'entrÊe/sortie dans les disques de donnÊes et de paritÊ. .PP Chaque invocation vÊrifie environ 8 % de la baie, en excluant les donnÊes dÊjà nettoyÊes au cours des 10 derniers jours. Cela signifie qu\'un nettoyage une fois par semaine garantit que chaque bit de donnÊes est vÊrifiÊ au moins une fois tous les trois mois. .PP Vous pouvez dÊfinir un plan de nettoyage ou une quantitÊ diffÊrente en utilisant l\'option \-p, \-\-plan, qui accepte : bad \- Nettoyer les blocs marquÊs mauvais. new \- Nettoyer les blocs juste synchronisÊs qui n\'ont pas encore ÊtÊ nettoyÊs. full \- Nettoyer tout. 0\-100 \- Nettoyer le pourcentage spÊcifiÊ de blocs. .PP Si vous spÊcifiez un pourcentage, vous pouvez Êgalement utiliser l\'option \-o, \-\-older\-than pour dÊfinir l\'Ãĸge que le bloc doit avoir. Les blocs les plus anciens sont nettoyÊs en premier, assurant une vÊrification optimale. Si vous souhaitez nettoyer uniquement les blocs juste synchronisÊs qui n\'ont pas encore ÊtÊ nettoyÊs, utilisez l\'option \`\-p new\`. .PP Pour obtenir des dÊtails sur l\'Êtat du nettoyage, utilisez la commande \`status\`. .PP Pour toute erreur silencieuse ou d\'entrÊe/sortie trouvÊe, les blocs correspondants sont marquÊs comme mauvais dans le fichier \`content\`. Ces mauvais blocs sont listÊs dans \`status\` et peuvent ÃĒtre corrigÊs avec \`fix \-e\`. Après la correction, lors du prochain nettoyage, ils seront revÊrifiÊs, et s\'ils sont jugÊs corrigÊs, la marque \[dq]mauvais\[dq] sera supprimÊe. Pour nettoyer uniquement les mauvais blocs, vous pouvez utiliser la commande \`scrub \-p bad\`. .PP Il est recommandÊ d\'exÊcuter \`scrub\` uniquement sur une baie synchronisÊe pour Êviter les erreurs signalÊes causÊes par des donnÊes non synchronisÊes. Ces erreurs sont reconnues comme n\'Êtant pas des erreurs silencieuses, et les blocs ne sont pas marquÊs comme mauvais, mais de telles erreurs sont signalÊes dans la sortie de la commande. .PP Le fichier \`content\` est modifiÊ pour mettre à jour l\'heure de la dernière vÊrification de chaque bloc et pour marquer les mauvais blocs. Les fichiers \`parity\` NE SONT PAS modifiÊs. Les fichiers dans la baie NE SONT PAS modifiÊs. .SS fix Corrige tous les fichiers et les donnÊes de paritÊ. .PP Tous les fichiers et les donnÊes de paritÊ sont comparÊs à l\'Êtat de l\'instantanÊ enregistrÊ lors du dernier \`sync\`. Si une diffÊrence est trouvÊe, elle est rÊtablie à l\'instantanÊ stockÊ. .PP AVERTISSEMENT ! La commande \`fix\` ne fait pas de distinction entre les erreurs et les modifications intentionnelles. Elle rÊtablit inconditionnellement l\'Êtat du fichier au dernier \`sync\`. .PP Si aucune autre option n\'est spÊcifiÊe, l\'intÊgralitÊ de la baie est traitÊe. Utilisez les options de filtre pour sÊlectionner un sous\-ensemble de fichiers ou de disques sur lesquels opÊrer. .PP Pour corriger uniquement les blocs marquÊs mauvais pendant \`sync\` et \`scrub\`, utilisez l\'option \-e, \-\-filter\-error. Contrairement aux autres options de filtre, celle\-ci applique des corrections uniquement aux fichiers qui sont inchangÊs depuis le dernier \`sync\`. .PP SnapRAID renomme tous les fichiers qui ne peuvent pas ÃĒtre corrigÊs en ajoutant l\'extension \`.unrecoverable\`. .PP Avant de corriger, l\'intÊgralitÊ de la baie est scannÊe pour trouver tout fichier dÊplacÊ depuis la dernière opÊration \`sync\`. Ces fichiers sont identifiÊs par leur horodatage, ignorant leur nom et leur rÊpertoire, et sont utilisÊs dans le processus de rÊcupÊration si nÊcessaire. Si vous en avez dÊplacÊ certains en dehors de la baie, vous pouvez utiliser l\'option \-i, \-\-import pour spÊcifier des rÊpertoires supplÊmentaires à scanner. .PP Les fichiers sont identifiÊs uniquement par chemin, pas par inode. .PP Le fichier \`content\` N\'EST PAS modifiÊ. Les fichiers \`parity\` sont modifiÊs si nÊcessaire. Les fichiers dans la baie sont modifiÊs si nÊcessaire. .SS check VÊrifie tous les fichiers et les donnÊes de paritÊ. .PP Il fonctionne comme \`fix\`, mais il simule seulement une rÊcupÊration et aucune modification n\'est Êcrite sur la baie. .PP Cette commande est principalement destinÊe à la vÊrification manuelle, comme après un processus de rÊcupÊration ou dans d\'autres conditions spÊciales. Pour les vÊrifications pÊriodiques et planifiÊes, utilisez \`scrub\`. .PP Si vous utilisez l\'option \-a, \-\-audit\-only, seules les donnÊes des fichiers sont vÊrifiÊes, et les donnÊes de paritÊ sont ignorÊes pour une exÊcution plus rapide. .PP Les fichiers sont identifiÊs uniquement par chemin, pas par inode. .PP Rien n\'est modifiÊ. .SS list Liste tous les fichiers contenus dans la baie au moment du dernier \`sync\`. .PP Avec \-v ou \-\-verbose, l\'heure en sous\-seconde est Êgalement affichÊe. .PP Rien n\'est modifiÊ. .SS dup Liste tous les fichiers en double. Deux fichiers sont considÊrÊs comme Êgaux si leurs hachages correspondent. Les donnÊes des fichiers ne sont pas lues ; seuls les hachages prÊcalculÊs sont utilisÊs. .PP Rien n\'est modifiÊ. .SS pool CrÊe ou met à jour une vue virtuelle de tous les fichiers de votre baie de disques dans le rÊpertoire \`pooling\`. .PP Les fichiers ne sont pas copiÊs mais liÊs à l\'aide de liens symboliques. .PP Lors de la mise à jour, tous les liens symboliques et les sous\-rÊpertoires vides existants sont supprimÊs et remplacÊs par la nouvelle vue de la baie. Tout autre fichier ordinaire est laissÊ en place. .PP Rien n\'est modifiÊ en dehors du rÊpertoire du pool. .SS devices Affiche les pÊriphÊriques de bas niveau utilisÊs par la baie. .PP Cette commande affiche les associations de pÊriphÊriques dans la baie et est principalement destinÊe à ÃĒtre une interface de script. .PP Les deux premières colonnes sont l\'ID et le chemin du pÊriphÊrique de bas niveau. Les deux colonnes suivantes sont l\'ID et le chemin du pÊriphÊrique de haut niveau. La dernière colonne est le nom du disque dans la baie. .PP Dans la plupart des cas, vous avez un pÊriphÊrique de bas niveau pour chaque disque de la baie, mais dans certaines configurations plus complexes, vous pouvez avoir plusieurs pÊriphÊriques de bas niveau utilisÊs par un seul disque de la baie. .PP Rien n\'est modifiÊ. .SS touch DÊfinit un horodatage arbitraire en sous\-seconde pour tous les fichiers qui l\'ont dÊfini à zÊro. .PP Cela amÊliore la capacitÊ de SnapRAID à reconnaÃŽtre les fichiers dÊplacÊs et copiÊs, car cela rend l\'horodatage presque unique, rÊduisant les doublons possibles. .PP Plus prÊcisÊment, si l\'horodatage en sous\-seconde n\'est pas zÊro, un fichier dÊplacÊ ou copiÊ est identifiÊ comme tel s\'il correspond au nom, à la taille et à l\'horodatage. Si l\'horodatage en sous\-seconde est zÊro, il est considÊrÊ comme une copie uniquement si le chemin complet, la taille et l\'horodatage correspondent tous. .PP L\'horodatage à la seconde près n\'est pas modifiÊ, de sorte que toutes les dates et heures de vos fichiers seront prÊservÊes. .SS rehash Planifie un nouveau hachage de toute la baie. .PP Cette commande change le type de hachage utilisÊ, gÊnÊralement lors de la mise à niveau d\'un système 32 bits vers un système 64 bits, pour passer de MurmurHash3 au plus rapide SpookyHash. .PP Si vous utilisez dÊjà le hachage optimal, cette commande ne fait rien et vous informe qu\'aucune action n\'est nÊcessaire. .PP Le nouveau hachage n\'est pas effectuÊ immÊdiatement, mais a lieu progressivement pendant \`sync\` et \`scrub\`. .PP Vous pouvez vÊrifier l\'Êtat du nouveau hachage en utilisant \`status\`. .PP Pendant le nouveau hachage, SnapRAID conserve toutes ses fonctionnalitÊs, à la seule exception que \`dup\` ne peut pas dÊtecter les fichiers en double utilisant un hachage diffÊrent. .SS locate Localise les fichiers stockÊs sur les disques de paritÊ. Pour chaque fichier correspondant, il affiche son emplacement dans le fichier de paritÊ et le nombre de fragments qu\'il occupe. .PP Vous pouvez utiliser l\'option \-t, \-\-tail pour restreindre l\'opÊration aux fichiers occupant la partie terminale spÊcifiÊe de la paritÊ. .PP Si vous souhaitez rÊallouer ces fichiers, vous pouvez alors utiliser l\'option \-W, \-\-force\-realloc\-tail. Sachez que ces fichiers ne seront pas protÊgÊs par la paritÊ pendant le processus de rÊallocation. .SH OPTIONS SnapRAID fournit les options suivantes : .TP .B \-c, \-\-conf CONFIG SÊlectionne le fichier de configuration à utiliser. S\'il n\'est pas spÊcifiÊ, sous Unix, il utilise le fichier \`/usr/local/etc/snapraid.conf\` s\'il existe, sinon \`/etc/snapraid.conf\`. Sous Windows, il utilise le fichier \`snapraid.conf\` dans le mÃĒme rÊpertoire que \`snapraid.exe\`. .TP .B \-f, \-\-filter MOTIF Filtre les fichiers à traiter dans \`check\` et \`fix\`. Seuls les fichiers correspondant au motif spÊcifiÊ sont traitÊs. Cette option peut ÃĒtre utilisÊe plusieurs fois. Voir la section MOTIF pour plus de dÊtails sur les spÊcifications de motifs. Sous Unix, assurez\-vous que les caractères de globbing sont entre guillemets s\'ils sont utilisÊs. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`check\` et \`fix\`. Elle ne peut pas ÃĒtre utilisÊe avec \`sync\` et \`scrub\`, car ils traitent toujours l\'intÊgralitÊ de la baie. .TP .B \-d, \-\-filter\-disk NOM Filtre les disques à traiter dans \`check\`, \`fix\`, \`up\` et \`down\`. Vous devez spÊcifier un nom de disque tel que dÊfini dans le fichier de configuration. Vous pouvez Êgalement spÊcifier des disques de paritÊ avec les noms : \`parity\`, \`2\-parity\`, \`3\-parity\`, etc., pour limiter les opÊrations à un disque de paritÊ spÊcifique. Si vous combinez plusieurs options \-\-filter, \-\-filter\-disk et \-\-filter\-missing, seuls les fichiers correspondant à tous les filtres sont sÊlectionnÊs. Cette option peut ÃĒtre utilisÊe plusieurs fois. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`check\`, \`fix\`, \`up\` et \`down\`. Elle ne peut pas ÃĒtre utilisÊe avec \`sync\` et \`scrub\`, car ils traitent toujours l\'intÊgralitÊ de la baie. .TP .B \-m, \-\-filter\-missing Filtre les fichiers à traiter dans \`check\` et \`fix\`. Seuls les fichiers manquants ou supprimÊs de la baie sont traitÊs. Lorsqu\'elle est utilisÊe avec \`fix\`, cela agit comme une commande \`undelete\` (restaurer). Si vous combinez plusieurs options \-\-filter, \-\-filter\-disk et \-\-filter\-missing, seuls les fichiers correspondant à tous les filtres sont sÊlectionnÊs. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`check\` et \`fix\`. Elle ne peut pas ÃĒtre utilisÊe avec \`sync\` et \`scrub\`, car ils traitent toujours l\'intÊgralitÊ de la baie. .TP .B \-e, \-\-filter\-error Traite les fichiers avec des erreurs dans \`check\` et \`fix\`. Il ne traite que les fichiers qui ont des blocs marquÊs avec des erreurs silencieuses ou d\'entrÊe/sortie pendant \`sync\` et \`scrub\`, tels que listÊs dans \`status\`. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`check\` et \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full SÊlectionne le plan de nettoyage. Si PERC est une valeur numÊrique de 0 à 100, elle est interprÊtÊe comme le pourcentage de blocs à nettoyer. Au lieu d\'un pourcentage, vous pouvez spÊcifier un plan : \`bad\` nettoie les mauvais blocs, \`new\` nettoie les blocs qui n\'ont pas encore ÊtÊ nettoyÊs, et \`full\` nettoie tout. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`scrub\`. .TP .B \-o, \-\-older\-than JOURS SÊlectionne la partie la plus ancienne de la baie à traiter dans \`scrub\`. JOURS est l\'Ãĸge minimum en jours pour qu\'un bloc soit nettoyÊ ; la valeur par dÊfaut est 10. Les blocs marquÊs comme mauvais sont toujours nettoyÊs, quelle que soit cette option. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`scrub\`. .TP .B \-a, \-\-audit\-only Dans \`check\`, vÊrifie le hachage des fichiers sans vÊrifier les donnÊes de paritÊ. Si vous ÃĒtes intÊressÊ uniquement par la vÊrification des donnÊes des fichiers, cette option peut accÊlÊrer considÊrablement le processus de vÊrification. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`check\`. .TP .B \-h, \-\-pre\-hash Dans \`sync\`, exÊcute une phase de hachage prÊliminaire de toutes les nouvelles donnÊes pour une vÊrification supplÊmentaire avant le calcul de la paritÊ. Habituellement, dans \`sync\`, aucun hachage prÊliminaire n\'est effectuÊ, et les nouvelles donnÊes sont hachÊes juste avant le calcul de la paritÊ lorsqu\'elles sont lues pour la première fois. Ce processus se produit lorsque le système est soumis à une lourde charge, avec tous les disques en rotation et un processeur occupÊ. Il s\'agit d\'une condition extrÃĒme pour la machine, et si elle prÊsente un problème matÊriel latent, des erreurs silencieuses peuvent passer inaperçues car les donnÊes ne sont pas encore hachÊes. Pour Êviter ce risque, vous pouvez activer le mode \`pre\-hash\` pour que toutes les donnÊes soient lues deux fois afin de garantir leur intÊgritÊ. Cette option vÊrifie Êgalement les fichiers dÊplacÊs au sein de la baie pour s\'assurer que l\'opÊration de dÊplacement a rÊussi et, si nÊcessaire, vous permet d\'exÊcuter une opÊration fix avant de continuer. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`sync\`. .TP .B \-i, \-\-import DOSSIER Importe à partir du rÊpertoire spÊcifiÊ tous les fichiers supprimÊs de la baie après le dernier \`sync\`. Si vous avez toujours de tels fichiers, ils peuvent ÃĒtre utilisÊs par \`check\` et \`fix\` pour amÊliorer le processus de rÊcupÊration. Les fichiers sont lus, y compris dans les sous\-rÊpertoires, et sont identifiÊs quel que soit leur nom. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`check\` et \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error En cas d\'erreur, arrÃĒte (spin down) tous les disques gÊrÊs avant de quitter avec un code d\'Êtat non nul. Cela empÃĒche les lecteurs de rester actifs et en rotation après une opÊration interrompue, aidant à Êviter une accumulation inutile de chaleur et une consommation d\'Ênergie. Utilisez cette option pour vous assurer que les disques sont arrÃĒtÊs en toute sÊcuritÊ mÃĒme lorsqu\'une commande Êchoue. .TP .B \-w, \-\-bw\-limit DÉBIT Applique une limite de bande passante globale pour tous les disques. Le DÉBIT est le nombre d\'octets par seconde. Vous pouvez spÊcifier un multiplicateur tel que K, M ou G (par exemple, \-\-bw\-limit 1G). .TP .B \-t, \-\-tail TAILLE Limite la liste des fichiers à ceux n\'utilisant pas plus que la taille de queue spÊcifiÊe des disques de paritÊ. Vous pouvez utiliser des multiplicateurs tels que K, M, G ou T (ex: \-\-tail 1G). Cette option n\'est valide que lorsqu\'elle est utilisÊe avec la commande \`locate\`. .TP .B \-A, \-\-stats Active une vue d\'Êtat Êtendue qui affiche des informations supplÊmentaires. L\'Êcran affiche deux graphiques : Le premier graphique montre le nombre de bandes mises en mÊmoire tampon pour chaque disque, ainsi que le chemin d\'accès au fichier en cours d\'accès sur ce disque. GÊnÊralement, le disque le plus lent n\'aura pas de tampon disponible, ce qui dÊtermine la bande passante maximale rÊalisable. Le deuxième graphique montre le pourcentage de temps passÊ en attente au cours des 100 dernières secondes. Le disque le plus lent est censÊ causer la majeure partie du temps d\'attente, tandis que les autres disques devraient avoir peu ou pas de temps d\'attente car ils peuvent utiliser leurs bandes mises en mÊmoire tampon. Ce graphique montre Êgalement le temps passÊ en attente pour les calculs de hachage et les calculs RAID. Tous les calculs s\'exÊcutent en parallèle avec les opÊrations de disque. Par consÊquent, tant qu\'il y a un temps d\'attente mesurable pour au moins un disque, cela indique que le processeur est suffisamment rapide pour suivre la charge de travail. .TP .B \-Z, \-\-force\-zero Force l\'opÊration non sÊcurisÊe de synchronisation d\'un fichier de taille zÊro qui Êtait auparavant non nul. Si SnapRAID dÊtecte une telle condition, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter facilement quand, après un plantage du système, certains fichiers accÊdÊs ont ÊtÊ tronquÊs. C\'est une condition possible sous Linux avec les systèmes de fichiers ext3/ext4. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`sync\`. .TP .B \-E, \-\-force\-empty Force l\'opÊration non sÊcurisÊe de synchronisation d\'un disque avec tous les fichiers originaux manquants. Si SnapRAID dÊtecte que tous les fichiers initialement prÊsents sur le disque sont manquants ou rÊÊcrits, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter facilement lorsqu\'un système de fichiers de donnÊes n\'est pas montÊ. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`sync\`. .TP .B \-U, \-\-force\-uuid Force l\'opÊration non sÊcurisÊe de synchronisation, vÊrification et correction avec des disques qui ont changÊ leur UUID. Si SnapRAID dÊtecte que certains disques ont changÊ d\'UUID, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter lorsque vos disques sont montÊs aux mauvais points de montage. Il est cependant autorisÊ d\'avoir un seul changement d\'UUID avec une seule paritÊ, et plus avec une paritÊ multiple, car c\'est le cas normal lors du remplacement des disques après une rÊcupÊration. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`sync\`, \`check\` ou \`fix\`. .TP .B \-D, \-\-force\-device Force l\'opÊration non sÊcurisÊe de correction avec des disques inaccessibles ou avec des disques sur le mÃĒme pÊriphÊrique physique. Par exemple, si vous avez perdu deux disques de donnÊes et que vous avez un disque de rechange pour ne rÊcupÊrer que le premier, vous pouvez ignorer le deuxième disque inaccessible. Ou, si vous souhaitez rÊcupÊrer un disque dans l\'espace libre restant sur un disque dÊjà utilisÊ, partageant le mÃĒme pÊriphÊrique physique. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`fix\`. .TP .B \-N, \-\-force\-nocopy Dans \`sync\`, \`check\` et \`fix\`, dÊsactive l\'heuristique de dÊtection de copie. Sans cette option, SnapRAID suppose que les fichiers ayant les mÃĒmes attributs, tels que le nom, la taille et l\'horodatage, sont des copies avec les mÃĒmes donnÊes. Cela permet d\'identifier les fichiers copiÊs ou dÊplacÊs d\'un disque à un autre et rÊutilise les informations de hachage dÊjà calculÊes pour dÊtecter les erreurs silencieuses ou pour rÊcupÊrer les fichiers manquants. Dans de rares cas, ce comportement peut entraÃŽner des faux positifs ou un processus lent en raison de nombreuses vÊrifications de hachage, et cette option vous permet de rÊsoudre de tels problèmes. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`sync\`, \`check\` et \`fix\`. .TP .B \-F, \-\-force\-full Dans \`sync\`, force un recomptage complet de la paritÊ. Cette option peut ÃĒtre utilisÊe lorsque vous ajoutez un nouveau niveau de paritÊ ou si vous ÃĒtes revenu à un ancien fichier de contenu utilisant des donnÊes de paritÊ plus rÊcentes. Au lieu de recrÊer la paritÊ à partir de zÊro, cela vous permet de rÊutiliser les hachages prÊsents dans le fichier de contenu pour valider les donnÊes et maintenir la protection des donnÊes pendant le processus \`sync\` en utilisant les donnÊes de paritÊ existantes. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`sync\`. .TP .B \-R, \-\-force\-realloc Dans \`sync\`, force une rÊallocation complète des fichiers et une reconstruction de la paritÊ. Cette option peut ÃĒtre utilisÊe pour rÊallouer complètement tous les fichiers, en supprimant la fragmentation, tout en rÊutilisant les hachages prÊsents dans le fichier de contenu pour valider les donnÊes. Cette option ne peut ÃĒtre utilisÊe qu\'avec \`sync\`. AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas l\'utiliser. Vous N\'AVEZ AUCUNE protection des donnÊes pendant l\'opÊration \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail TAILLE Fonctionne comme \-R, \-\-force\-realloc, maar limitÊ à la partie terminale spÊcifiÊe (les derniers TAILLE octets) de chaque fichier de paritÊ. Force la rÊallocation (dÊplacement) de tout fragment/bloc de fichier actuellement stockÊ dans cette section terminale, leur permettant d\'ÃĒtre placÊs n\'importe oÚ dans le(s) fichier(s) de paritÊ oÚ de l\'espace libre est disponible (y compris les trous existants). Le but principal de cette option est de rÊduire la taille sur disque du fichier de paritÊ. Si la rÊallocation rÊussit à vider toute la section terminale (plus aucun bloc ne l\'utilise), le fichier de paritÊ est tronquÊ, rÊcupÊrant l\'espace terminal inutilisÊ. Vous pouvez utiliser des multiplicateurs tels que K, M, G ou T (ex: \-\-force\-realloc\-tail 1G). Vous pouvez utiliser locate \-t, \-\-tail pour connaÃŽtre à l\'avance les fichiers affectÊs. AVERTISSEMENT ! Cette option est rÊservÊe aux experts et il est fortement recommandÊ de ne pas l\'utiliser. Vous n\'avez PAS de protection des donnÊes pendant l\'opÊration \`sync\` pour les fichiers affectÊs. .TP .B \-l, \-\-log FICHIER Écrit un journal dÊtaillÊ dans le fichier spÊcifiÊ. Si cette option n\'est pas spÊcifiÊe, les erreurs inattendues sont imprimÊes à l\'Êcran, ce qui peut entraÃŽner une sortie excessive en cas de nombreuses erreurs. Lorsque \-l, \-\-log est spÊcifiÊ, seules les erreurs fatales qui entraÃŽnent l\'arrÃĒt de SnapRAID sont imprimÊes à l\'Êcran. Si le chemin commence par \`>>\`, le fichier est ouvert en mode ajout. Les occurrences de \`%D\` et \`%T\` dans le nom sont remplacÊes par la date et l\'heure au format YYYYMMDD et HHMMSS. Dans les fichiers batch Windows, vous devez doubler le caractère \`%\`, par exemple, result\-%%D.log. Pour utiliser \`>>\`, vous devez encadrer le nom de guillemets, par exemple, \`\[dq]>>result.log\[dq]\`. Pour sortir le journal sur la sortie standard ou l\'erreur standard, vous pouvez utiliser \`\[dq]>&1\[dq]\` et \`\[dq]>&2\[dq]\`, respectivement. Consultez le fichier ou la page de manuel snapraid_log.txt pour les descriptions des balises de journal. .TP .B \-L, \-\-error\-limit NOMBRE DÊfinit une nouvelle limite d\'erreurs avant d\'arrÃĒter l\'exÊcution. Par dÊfaut, SnapRAID s\'arrÃĒte s\'il rencontre plus de 100 erreurs d\'entrÊe/sortie, indiquant qu\'un disque est probablement en panne. Cette option affecte \`sync\` et \`scrub\`, qui sont autorisÊs à continuer après le premier ensemble d\'erreurs de disque pour essayer de terminer leurs opÊrations. Cependant, \`check\` et \`fix\` s\'arrÃĒtent toujours à la première erreur. .TP .B \-S, \-\-start BLKSTART Commence le traitement à partir du numÊro de bloc spÊcifiÊ. Cela peut ÃĒtre utile pour rÊessayer de vÊrifier ou de corriger des blocs spÊcifiques en cas de disque endommagÊ. Cette option est principalement destinÊe à la rÊcupÊration manuelle avancÊe. .TP .B \-B, \-\-count BLKCOUNT Ne traite que le nombre de blocs spÊcifiÊ. Cette option est principalement destinÊe à la rÊcupÊration manuelle avancÊe. .TP .B \-C, \-\-gen\-conf CONTENU GÊnère un fichier de configuration factice à partir d\'un fichier de contenu existant. Le fichier de configuration est Êcrit sur la sortie standard et n\'Êcrase pas un fichier existant. Ce fichier de configuration contient Êgalement les informations nÊcessaires pour reconstruire les points de montage du disque au cas oÚ vous perdriez l\'intÊgralitÊ du système. .TP .B \-v, \-\-verbose Affiche plus d\'informations à l\'Êcran. S\'il est spÊcifiÊ une fois, il affiche les fichiers exclus et des statistiques supplÊmentaires. Cette option n\'a aucun effet sur les fichiers journaux. .TP .B \-q, \-\-quiet Affiche moins d\'informations à l\'Êcran. S\'il est spÊcifiÊ une fois, il supprime la barre de progression ; deux fois, les opÊrations en cours ; trois fois, les messages d\'information ; quatre fois, les messages d\'Êtat. Les erreurs fatales sont toujours imprimÊes à l\'Êcran. Cette option n\'a aucun effet sur les fichiers journaux. .TP .B \-H, \-\-help Affiche un Êcran d\'aide court. .TP .B \-V, \-\-version Affiche la version du programme. .SH CONFIGURATION SnapRAID nÊcessite un fichier de configuration pour savoir oÚ se trouve votre baie de disques et oÚ stocker les informations de paritÊ. .PP Sous Unix, il utilise le fichier \`/usr/local/etc/snapraid.conf\` s\'il existe, sinon \`/etc/snapraid.conf\`. Sous Windows, il utilise le fichier \`snapraid.conf\` dans le mÃĒme rÊpertoire que \`snapraid.exe\`. .PP Il doit contenir les options suivantes (sensibles à la casse) : .SS parity FICHIER [,FICHIER] ... DÊfinit les fichiers à utiliser pour stocker les informations de paritÊ. La paritÊ permet une protection contre une seule dÊfaillance de disque, similaire au RAID5. .PP Vous pouvez spÊcifier plusieurs fichiers, qui doivent se trouver sur des disques diffÊrents. Lorsqu\'un fichier ne peut plus grandir, le suivant est utilisÊ. L\'espace total disponible doit ÃĒtre au moins aussi grand que le plus grand disque de donnÊes de la baie. .PP Vous pouvez ajouter des fichiers de paritÊ supplÊmentaires plus tard, mais vous ne pouvez pas les rÊorganiser ni les supprimer. .PP Garder les disques de paritÊ rÊservÊs à la paritÊ garantit qu\'ils ne deviennent pas fragmentÊs, amÊliorant les performances. .PP Sous Windows, 256 Mo sont laissÊs inutilisÊs sur chaque disque pour Êviter l\'avertissement concernant les disques pleins. .PP Cette option est obligatoire et ne peut ÃĒtre utilisÊe qu\'une seule fois. .SS (2,3,4,5,6)\-parity FICHIER [,FICHIER] ... DÊfinit les fichiers à utiliser pour stocker les informations de paritÊ supplÊmentaires. .PP Pour chaque niveau de paritÊ spÊcifiÊ, un niveau de protection supplÊmentaire est activÊ : .PD 0 .IP \(bu 2\-parity active la double paritÊ RAID6. .IP \(bu 3\-parity active la triple paritÊ. .IP \(bu 4\-parity active la quadruple (quatre) paritÊ. .IP \(bu 5\-parity active la penta (cinq) paritÊ. .IP \(bu 6\-parity active l\'hexa (six) paritÊ. .PD .PP Chaque niveau de paritÊ nÊcessite la prÊsence de tous les niveaux de paritÊ prÊcÊdents. .PP Les mÃĒmes considÊrations que pour l\'option \`parity\` s\'appliquent. .PP Ces options sont facultatives et ne peuvent ÃĒtre utilisÊes qu\'une seule fois. .SS z\-parity FICHIER [,FICHIER] ... DÊfinit un fichier et un format alternatifs pour stocker la triple paritÊ. .PP Cette option est une alternative à \`3\-parity\`, principalement destinÊe aux processeurs bas de gamme comme ARM ou AMD Phenom, Athlon et Opteron qui ne prennent pas en charge l\'ensemble d\'instructions SSSE3. Dans de tels cas, elle offre de meilleures performances. .PP Ce format est similaire mais plus rapide que celui utilisÊ par ZFS RAIDZ3. Comme ZFS, il ne fonctionne pas au\-delà de la triple paritÊ. .PP Lors de l\'utilisation de \`3\-parity\`, vous serez averti s\'il est recommandÊ d\'utiliser le format \`z\-parity\` pour une amÊlioration des performances. .PP Il est possible de convertir d\'un format à l\'autre en ajustant le fichier de configuration avec le fichier z\-parity ou 3\-parity souhaitÊ et en utilisant \`fix\` pour le recrÊer. .SS content FICHIER DÊfinit le fichier à utiliser pour stocker la liste et les sommes de contrôle de tous les fichiers prÊsents dans votre baie de disques. .PP Il peut ÃĒtre placÊ sur un disque utilisÊ pour les donnÊes, la paritÊ, ou tout autre disque disponible. Si vous utilisez un disque de donnÊes, ce fichier est automatiquement exclu du processus \`sync\`. .PP Cette option est obligatoire et peut ÃĒtre utilisÊe plusieurs fois pour enregistrer plusieurs copies du mÃĒme fichier. .PP Vous devez stocker au moins une copie pour chaque disque de paritÊ utilisÊ plus un. L\'utilisation de copies supplÊmentaires ne nuit pas. .SS data NOM DOSSIER DÊfinit le nom et le point de montage des disques de donnÊes dans la baie. NOM est utilisÊ pour identifier le disque et doit ÃĒtre unique. DOSSIER est le point de montage du disque dans le système de fichiers. .PP Vous pouvez modifier le point de montage au besoin, tant que vous gardez le NOM fixe. .PP Vous devriez utiliser une option pour chaque disque de donnÊes de la baie. .PP Vous pouvez renommer un disque plus tard en changeant le NOM directement dans le fichier de configuration, puis en exÊcutant une commande \`sync\`. Dans le cas d\'un renommage, l\'association est faite en utilisant l\'UUID stockÊ des disques. .SS extra NAME DIR DÊfinit le nom et le point de montage de disques supplÊmentaires à surveiller avec les commandes \`smart\` et \`probe\`. .PP Ceci est utile pour surveiller des disques qui ne font pas partie de la grappe mais qui sont nÊcessaires au fonctionnement du système, comme le disque de dÊmarrage. .PP Notez que ces disques ne sont pas affectÊs par les commandes \`up\` et \`down\` car ils sont censÊs toujours ÃĒtre en rotation. .SS nohidden Exclut tous les fichiers et rÊpertoires cachÊs. Sous Unix, les fichiers cachÊs sont ceux commençant par \`.\`. Sous Windows, ce sont ceux avec l\'attribut cachÊ. .SS exclude/include MOTIF DÊfinit les motifs de fichiers ou de rÊpertoires à exclure ou à inclure dans le processus de synchronisation. Tous les motifs sont traitÊs dans l\'ordre spÊcifiÊ. .PP Si le premier motif qui correspond est un \`exclude\` (exclure), le fichier est exclu. S\'il s\'agit d\'un \`include\` (inclure), le fichier est inclus. Si aucun motif ne correspond, le fichier est exclu si le dernier motif spÊcifiÊ est un \`include\`, ou inclus si le dernier motif spÊcifiÊ est un \`exclude\`. .PP Voir la section MOTIF pour plus de dÊtails sur les spÊcifications de motifs. .PP Cette option peut ÃĒtre utilisÊe plusieurs fois. .SS blocksize TAILLE_EN_KIBIOCTETS DÊfinit la taille de bloc de base en kibioctets pour la paritÊ. Un kibioctet est de 1024 octets. .PP La taille de bloc par dÊfaut est de 256, ce qui devrait fonctionner dans la plupart des cas. .PP AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas modifier cette valeur. Pour modifier cette valeur à l\'avenir, vous devrez recrÊer l\'intÊgralitÊ de la paritÊ ! .PP Une raison d\'utiliser une taille de bloc diffÊrente est si vous avez beaucoup de petits fichiers, de l\'ordre de millions. .PP Pour chaque fichier, mÃĒme s\'il ne contient que quelques octets, un bloc entier de paritÊ est allouÊ, et avec de nombreux fichiers, cela peut entraÃŽner un espace de paritÊ inutilisÊ important. Lorsque vous remplissez complètement le disque de paritÊ, vous n\'ÃĒtes pas autorisÊ à ajouter plus de fichiers aux disques de donnÊes. Cependant, la paritÊ gaspillÊe ne s\'accumule pas sur les disques de donnÊes. L\'espace gaspillÊ rÊsultant d\'un grand nombre de fichiers sur un disque de donnÊes limite uniquement la quantitÊ de donnÊes sur ce disque de donnÊes, pas les autres. .PP À titre d\'approximation, vous pouvez supposer que la moitiÊ de la taille de bloc est gaspillÊe pour chaque fichier. Par exemple, avec 100 000 fichiers et une taille de bloc de 256 Kio, vous gaspillerez 12,8 Go de paritÊ, ce qui peut entraÃŽner 12,8 Go d\'espace en moins disponible sur le disque de donnÊes. .PP Vous pouvez vÊrifier la quantitÊ d\'espace gaspillÊ sur chaque disque en utilisant \`status\`. C\'est la quantitÊ d\'espace que vous devez laisser libre sur les disques de donnÊes ou utiliser pour les fichiers non inclus dans la baie. Si cette valeur est nÊgative, cela signifie que vous ÃĒtes près de remplir la paritÊ, et cela reprÊsente l\'espace que vous pouvez encore gaspiller. .PP Pour Êviter ce problème, vous pouvez utiliser une partition plus grande pour la paritÊ. Par exemple, si la partition de paritÊ est 12,8 Go plus grande que les disques de donnÊes, vous avez suffisamment d\'espace supplÊmentaire pour gÊrer jusqu\'à 100 000 fichiers sur chaque disque de donnÊes sans aucun espace gaspillÊ. .PP Une astuce pour obtenir une partition de paritÊ plus grande sous Linux est de la formater avec la commande : .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Cela se traduit par environ 1,5 % d\'espace supplÊmentaire, environ 60 Go pour un disque de 4 To, ce qui permet environ 460 000 fichiers sur chaque disque de donnÊes sans aucun espace gaspillÊ. .SS hashsize TAILLE_EN_OCTETS DÊfinit la taille du hachage en octets pour les blocs enregistrÊs. .PP La taille de hachage par dÊfaut est de 16 octets (128 bits), ce qui devrait fonctionner dans la plupart des cas. .PP AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas modifier cette valeur. Pour modifier cette valeur à l\'avenir, vous devrez recrÊer l\'intÊgralitÊ de la paritÊ ! .PP Une raison d\'utiliser une taille de hachage diffÊrente est si votre système a une mÊmoire limitÊe. En règle gÊnÊrale, SnapRAID nÊcessite gÊnÊralement 1 Gio de RAM pour chaque 16 To de donnÊes dans la baie. .PP Plus prÊcisÊment, pour stocker les hachages des donnÊes, SnapRAID nÊcessite environ TS*(1+HS)/BS octets de RAM, oÚ TS est la taille totale en octets de votre baie de disques, BS est la taille de bloc en octets, et HS est la taille de hachage en octets. .PP Par exemple, avec 8 disques de 4 To, une taille de bloc de 256 Kio (1 Kio = 1024 octets) et une taille de hachage de 16, vous obtenez : .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 Gio .PD 0 .PD .PP En passant à une taille de hachage de 8, vous obtenez : .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 Gio .PD 0 .PD .PP En passant à une taille de bloc de 512, vous obtenez : .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 Gio .PD 0 .PD .PP En passant à la fois à une taille de hachage de 8 et à une taille de bloc de 512, vous obtenez : .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 Gio .PD 0 .PD .SS autosave TAILLE_EN_GIGAOCTETS Enregistre automatiquement l\'Êtat lors de la synchronisation ou du nettoyage après la quantitÊ spÊcifiÊe de Go traitÊs. Cette option est utile pour Êviter de redÊmarrer de longues commandes \`sync\` à partir de zÊro si elles sont interrompues par un plantage de la machine ou tout autre ÊvÊnement. .SS temp_limit TEMPÉRATURE_CELSIUS DÊfinit la tempÊrature maximale autorisÊe du disque en Celsius. Lorsqu\'elle est spÊcifiÊe, SnapRAID vÊrifie pÊriodiquement la tempÊrature de tous les disques à l\'aide de l\'outil smartctl. Les tempÊratures actuelles des disques sont affichÊes pendant que SnapRAID fonctionne. Si un disque dÊpasse cette limite, toutes les opÊrations s\'arrÃĒtent et les disques sont arrÃĒtÊs (mis en veille) pendant la durÊe dÊfinie par l\'option \`temp_sleep\`. Après la pÊriode de veille, les opÊrations reprennent, pouvant s\'arrÃĒter à nouveau si la limite de tempÊrature est de nouveau atteinte. .PP Pendant le fonctionnement, SnapRAID analyse Êgalement la courbe de chauffe de chaque disque et estime la tempÊrature stable à long terme qu\'ils sont censÊs atteindre si l\'activitÊ continue. L\'estimation n\'est effectuÊe qu\'après que la tempÊrature du disque a augmentÊ quatre fois, garantissant que suffisamment de points de donnÊes sont disponibles pour Êtablir une tendance fiable. Cette tempÊrature stable prÊdite est affichÊe entre parenthèses à côtÊ de la valeur actuelle et aide à Êvaluer si le refroidissement du système est adÊquat. Cette tempÊrature estimÊe est uniquement à titre informatif et n\'a aucun effet sur le comportement de SnapRAID. Les actions du programme sont basÊes uniquement sur les tempÊratures rÊelles mesurÊes des disques. .PP Pour effectuer cette analyse, SnapRAID a besoin d\'une rÊfÊrence pour la tempÊrature du système. Il tente d\'abord de la lire à partir des capteurs matÊriels disponibles. Si aucun capteur système n\'est accessible, il utilise la tempÊrature de disque la plus basse mesurÊe au dÊbut de l\'exÊcution comme rÊfÊrence de secours. .PP Normalement, SnapRAID n\'affiche que la tempÊrature du disque le plus chaud. Pour afficher la tempÊrature de tous les disques, utilisez l\'option \-A ou \-\-stats. .SS temp_sleep TEMPS_EN_MINUTES DÊfinit le temps de veille, en minutes, lorsque la limite de tempÊrature est atteinte. Pendant cette pÊriode, les disques restent arrÃĒtÊs. La valeur par dÊfaut est de 5 minutes. .SS pool DOSSIER DÊfinit le rÊpertoire de mise en commun oÚ la vue virtuelle de la baie de disques est crÊÊe à l\'aide de la commande \`pool\`. .PP Le rÊpertoire doit dÊjà exister. .SS share CHEMIN_UNC DÊfinit le chemin UNC Windows requis pour accÊder aux disques à distance. .PP Si cette option est spÊcifiÊe, les liens symboliques crÊÊs dans le rÊpertoire du pool utilisent ce chemin UNC pour accÊder aux disques. Sans cette option, les liens symboliques gÊnÊrÊs utilisent uniquement des chemins locaux, ce qui ne permet pas de partager le rÊpertoire du pool sur le rÊseau. .PP Les liens symboliques sont formÊs en utilisant le chemin UNC spÊcifiÊ, en ajoutant le nom du disque tel que spÊcifiÊ dans l\'option \`data\`, et en ajoutant enfin le rÊpertoire et le nom du fichier. .PP Cette option est requise uniquement pour Windows. .SS smartctl DISQUE/PARITÉ OPTIONS... DÊfinit les options smartctl personnalisÊes pour obtenir les attributs SMART de chaque disque. Cela peut ÃĒtre nÊcessaire pour les contrôleurs RAID et certains disques USB qui ne peuvent pas ÃĒtre dÊtectÊs automatiquement. Le placeholder %s est remplacÊ par le nom du pÊriphÊrique, mais il est facultatif pour les pÊriphÊriques fixes comme les contrôleurs RAID. .PP DISQUE est le mÃĒme nom de disque spÊcifiÊ dans l\'option \`data\`. PARITÉ est l\'un des noms de paritÊ : \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` ou \`z\-parity\`. .PP Dans les OPTIONS spÊcifiÊes, la chaÃŽne \`%s\` est remplacÊe par le nom du pÊriphÊrique. Pour les contrôleurs RAID, le pÊriphÊrique est probablement fixe, et vous n\'aurez peut\-ÃĒtre pas besoin d\'utiliser \`%s\`. .PP Consultez la documentation smartmontools pour les options possibles : .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP Par exemple : .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISQUE/PARITÉ ATTR [ATTR...] Ignore l\'attribut SMART spÊcifiÊ lors du calcul de la probabilitÊ de dÊfaillance du disque. Cette option est utile si un disque signale des valeurs inhabituelles ou trompeuses pour un attribut particulier. .PP DISQUE est le mÃĒme nom de disque spÊcifiÊ dans l\'option \`data\`. PARITÉ est l\'un des noms de paritÊ : \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` ou \`z\-parity\`. La valeur spÊciale * peut ÃĒtre utilisÊe pour ignorer l\'attribut sur tous les disques. .PP Par exemple, pour ignorer l\'attribut \`Current Pending Sector Count\` sur tous les disques : .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Pour l\'ignorer uniquement sur le premier disque de paritÊ : .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Exemples Un exemple de configuration typique pour Unix est : .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Un exemple de configuration typique pour Windows est : .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH MOTIF (PATTERN) Les motifs offrent un moyen flexible de filtrer les fichiers à inclure ou à exclure. En utilisant des caractères de \[dq]globbing\[dq], vous pouvez dÊfinir des règles qui correspondent à des noms de fichiers spÊcifiques ou à des structures de rÊpertoires entières sans lister chaque chemin manuellement. .PP Le point d\'interrogation \`?\` correspond à n\'importe quel caractère unique, sauf le sÊparateur de rÊpertoire. Cela le rend utile pour faire correspondre des noms de fichiers avec des caractères variables tout en limitant le motif à un seul niveau de rÊpertoire. .PP L\'Êtoile simple \`*\` correspond à n\'importe quelle sÊquence de caractères, mais comme le point d\'interrogation, elle ne traverse jamais les frontières des rÊpertoires. Elle s\'arrÃĒte à la barre oblique, ce qui la rend adaptÊe à la recherche de correspondances au sein d\'un seul composant de chemin. Il s\'agit du comportement standard des jokers familier du \[dq]globbing\[dq] shell. .PP La double Êtoile \`**\` est plus puissante, elle correspond à n\'importe quelle sÊquence de caractères, y compris les sÊparateurs de rÊpertoires. Cela permet aux motifs de correspondre sur plusieurs niveaux de rÊpertoires. Lorsque \`**\` apparaÃŽt directement intÊgrÊ dans un motif, il peut correspondre à zÊro ou plusieurs caractères, y compris les barres obliques entre le texte littÊral environnant. .PP L\'utilisation la plus importante de \`**\` est sous la forme spÊciale \`/**/\`. Celle\-ci correspond à zÊro ou plusieurs niveaux de rÊpertoires complets, ce qui permet de faire correspondre des fichiers à n\'importe quelle profondeur dans une arborescence de rÊpertoires sans connaÃŽtre la structure exacte du chemin. Par exemple, le motif \`src/**/main.js\` correspond à \`src/main.js\` (saut de zÊro rÊpertoire), \`src/ui/main.js\` (saut d\'un rÊpertoire), et \`src/ui/components/main.js\` (saut de deux rÊpertoires). .PP Les classes de caractères utilisant des crochets \`[]\` correspondent à un seul caractère d\'un ensemble ou d\'une plage spÊcifiÊs. Comme les autres motifs à caractère unique, elles ne correspondent pas aux sÊparateurs de rÊpertoires. Les classes supportent les plages et la nÊgation à l\'aide d\'un point d\'exclamation. .PP La distinction fondamentale à retenir est que \`*\`, \`?\` et les classes de caractères respectent tous les limites des rÊpertoires et ne correspondent qu\'au sein d\'un seul composant de chemin, alors que \`**\` est le seul motif qui peut correspondre à travers les sÊparateurs de rÊpertoires. .PP Il existe quatre types de motifs diffÊrents : .TP .B FILE SÊlectionne n\'importe quel fichier nommÊ FILE. Ce motif s\'applique uniquement aux fichiers, pas aux rÊpertoires. .TP .B DIR/ SÊlectionne n\'importe quel rÊpertoire nommÊ DIR et tout son contenu. Ce motif s\'applique uniquement aux rÊpertoires, pas aux fichiers. .TP .B /PATH/FILE SÊlectionne le chemin exact du fichier spÊcifiÊ. Ce motif s\'applique uniquement aux fichiers, pas aux rÊpertoires. .TP .B /PATH/DIR/ SÊlectionne le chemin exact du rÊpertoire spÊcifiÊ et tout son contenu. Ce motif s\'applique uniquement aux rÊpertoires, pas aux fichiers. .PP Lorsque vous spÊcifiez un chemin absolu commençant par /, il est appliquÊ à la racine de la baie, et non à la racine du système de fichiers local. .PP Sous Windows, vous pouvez utiliser la barre oblique inverse \\ au lieu de la barre oblique /. Les rÊpertoires système Windows, les jonctions, les points de montage et les autres rÊpertoires spÊciaux Windows sont traitÊs comme des fichiers, ce qui signifie que pour les exclure, vous devez utiliser une règle de fichier, pas une règle de rÊpertoire. .PP Si le nom de fichier contient un caractère \`*\`, \`?\`, \`[\`, ou \`]\`, vous devez l\'Êchapper pour Êviter qu\'il ne soit interprÊtÊ comme un caractère de globbing. Sous Unix, le caractère d\'Êchappement est \`\\\` ; sous Windows, c\'est \`^\`. Lorsque le motif est sur la ligne de commande, vous devez doubler le caractère d\'Êchappement pour Êviter qu\'il ne soit interprÊtÊ par le shell de commande. .PP Dans le fichier de configuration, vous pouvez utiliser diffÊrentes stratÊgies pour filtrer les fichiers à traiter. L\'approche la plus simple consiste à n\'utiliser que des règles \`exclude\` pour supprimer tous les fichiers et rÊpertoires que vous ne voulez pas traiter. Par exemple : .PP .RS 4 # Exclut tout fichier nommÊ \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exclut le rÊpertoire racine \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Exclut tout sous\-rÊpertoire nommÊ \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP L\'approche opposÊe consiste à ne dÊfinir que les fichiers que vous souhaitez traiter, en n\'utilisant que des règles \`include\`. Par exemple : .PP .RS 4 # Inclut uniquement certains rÊpertoires .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP L\'approche finale consiste à mÊlanger les règles \`exclude\` et \`include\`. Dans ce cas, l\'ordre des règles est important. Les règles antÊrieures ont prÊsÊance sur les règles ultÊrieures. Pour simplifier, vous pouvez lister toutes les règles \`exclude\` d\'abord, puis toutes les règles \`include\`. Par exemple : .PP .RS 4 # Exclut tout fichier nommÊ \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exclut tout sous\-rÊpertoire nommÊ \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Inclut uniquement certains rÊpertoires .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Sur la ligne de commande, en utilisant l\'option \-f, vous ne pouvez utiliser que des motifs \`include\`. Par exemple : .PP .RS 4 # VÊrifie uniquement les fichiers .mp3. .PD 0 .PP .PD # Sous Unix, utilisez des guillemets pour Êviter l\'expansion .PD 0 .PP .PD # du globbing par le shell. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP Sous Unix, lorsque vous utilisez des caractères de globbing sur la ligne de commande, vous devez les mettre entre guillemets pour empÃĒcher le shell de les dÊvelopper. .SH IGNORER DES FICHIERS (IGNORE FILES) En plus des règles globales du fichier de configuration, vous pouvez placer des fichiers \`.snapraidignore\` dans n\'importe quel rÊpertoire de la grappe pour dÊfinir des règles d\'exclusion dÊcentralisÊes. .PP Les règles dÊfinies dans \`.snapraidignore\` sont appliquÊes après les règles du fichier de configuration. Cela signifie qu\'elles ont une prioritÊ plus ÊlevÊe et peuvent ÃĒtre utilisÊes pour exclure des fichiers qui Êtaient prÊcÊdemment inclus par la configuration globale. En pratique, si une règle locale correspond, le fichier est exclu quels que soient les paramètres d\'inclusion globaux. .PP La logique des motifs dans \`.snapraidignore\` reflète la configuration globale mais ancre les motifs au rÊpertoire oÚ se trouve le fichier : .TP .B FILE SÊlectionne n\'importe quel fichier nommÊ FILE dans ce rÊpertoire ou en dessous. Cela suit les mÃĒmes règles de globbing que le motif global. .TP .B DIR/ SÊlectionne n\'importe quel rÊpertoire nommÊ DIR et tout son contenu, rÊsidant dans ce rÊpertoire ou en dessous. .TP .B /PATH/FILE SÊlectionne le fichier exact spÊcifiÊ par rapport à l\'emplacement du fichier \`.snapraidignore\`. .TP .B /PATH/DIR/ SÊlectionne le rÊpertoire exact spÊcifiÊ et tout son contenu, par rapport à l\'emplacement du fichier \`.snapraidignore\`. .PP Contrairement à la configuration globale, les fichiers \`.snapraidignore\` ne prennent en charge que les règles d\'exclusion ; vous ne pouvez pas utiliser de motifs \`include\` ou de nÊgation (!). .PP Par exemple, si vous avez un \`.snapraidignore\` dans \`/mnt/disk1/projects/\` : .PP .RS 4 # Exclut UNIQUEMENT /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Exclut tout rÊpertoire nommÊ \`build\` dans projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Exclut tout fichier .tmp dans projects/ ou ses sous\-dossiers .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENU (CONTENT) SnapRAID stocke la liste et les sommes de contrôle de vos fichiers dans le fichier de contenu. .PP Il s\'agit d\'un fichier binaire qui rÊpertorie tous les fichiers prÊsents dans votre baie de disques, ainsi que toutes les sommes de contrôle pour vÊrifier leur intÊgritÊ. .PP Ce fichier est lu et Êcrit par les commandes \`sync\` et \`scrub\` et lu par les commandes \`fix\`, \`check\` et \`status\`. .SH PARITÊ (PARITY) SnapRAID stocke les informations de paritÊ de votre baie dans les fichiers de paritÊ. .PP Ce sont des fichiers binaires contenant la paritÊ calculÊe de tous les blocs dÊfinis dans le fichier \`content\`. .PP Ces fichiers sont lus et Êcrits par les commandes \`sync\` et \`fix\` et lus uniquement par les commandes \`scrub\` et \`check\`. .SH ENCODAGE SnapRAID sous Unix ignore tout encodage. Il lit et stocke les noms de fichiers avec le mÃĒme encodage utilisÊ par le système de fichiers. .PP Sous Windows, tous les noms lus à partir du système de fichiers sont convertis et traitÊs au format UTF\-8. .PP Pour que les noms de fichiers soient imprimÊs correctement, vous devez dÊfinir la console Windows en mode UTF\-8 avec la commande \`chcp 65001\` et utiliser une police TrueType comme \`Lucida Console\` comme police de console. Cela n\'affecte que les noms de fichiers imprimÊs ; si vous redirigez la sortie de la console vers un fichier, le fichier rÊsultant est toujours au format UTF\-8. .SH DROITS D\'AUTEUR (COPYRIGHT) Ce fichier est Copyright (C) 2025 Andrea Mazzoleni .SH VOIR AUSSI (SEE ALSO) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-fr.d000066400000000000000000002165721522717156100164140ustar00rootroot00000000000000Name{number} snapraid - Sauvegarde SnapRAID pour baies de disques Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter MOTIF] [-d, --filter-disk NOM] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DOSSIER] : [-p, --plan PERC|mauvais|nouveau|complet] : [-o, --older-than JOURS] [-l, --log FICHIER] : [-s, --spin-down-on-error] [-w, --bw-limit DÉBIT] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NOMBRE] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENU] Description SnapRAID est un programme de sauvegarde conçu pour les baies de disques, stockant les informations de paritÊ pour la rÊcupÊration des donnÊes en cas de dÊfaillance de six disques maximum. Principalement destinÊ aux centres multimÊdia domestiques avec des fichiers volumineux et peu souvent modifiÊs, SnapRAID offre plusieurs fonctionnalitÊs : * Vous pouvez utiliser des disques dÊjà remplis de fichiers sans avoir besoin de les reformater, en y accÊdant comme d'habitude. * Toutes vos donnÊes sont hachÊes pour garantir l'intÊgritÊ des donnÊes et prÊvenir la corruption silencieuse. * Lorsque le nombre de disques dÊfaillants dÊpasse le nombre de paritÊs, la perte de donnÊes est limitÊe aux disques affectÊs ; les donnÊes sur les autres disques restent accessibles. * Si vous supprimez accidentellement des fichiers sur un disque, la rÊcupÊration est possible. * Les disques peuvent avoir des tailles diffÊrentes. * Vous pouvez ajouter des disques à tout moment. * SnapRAID ne verrouille pas vos donnÊes ; vous pouvez arrÃĒter de l'utiliser à tout moment sans reformater ni dÊplacer de donnÊes. * Pour accÊder à un fichier, un seul disque doit tourner, ce qui Êconomise de l'Ênergie et rÊduit le bruit. Pour plus d'informations, veuillez visiter le site officiel de SnapRAID : :https://www.snapraid.it/ Limitations SnapRAID est un hybride entre un programme RAID et un programme de sauvegarde, visant à combiner les meilleurs avantages des deux. Cependant, il a quelques limitations que vous devriez considÊrer avant de l'utiliser. La principale limitation est que si un disque tombe en panne et que vous n'avez pas synchronisÊ rÊcemment, vous pourriez ne pas ÃĒtre en mesure de rÊcupÊrer complètement. Plus prÊcisÊment, vous pourriez ne pas ÃĒtre en mesure de rÊcupÊrer jusqu'à la taille des fichiers modifiÊs ou supprimÊs depuis la dernière opÊration de synchronisation. Cela se produit mÃĒme si les fichiers modifiÊs ou supprimÊs ne se trouvent pas sur le disque dÊfaillant. C'est pourquoi SnapRAID est mieux adaptÊ aux donnÊes qui changent rarement. D'un autre côtÊ, les fichiers nouvellement ajoutÊs n'empÃĒchent pas la rÊcupÊration des fichiers dÊjà existants. Vous ne perdrez que les fichiers rÊcemment ajoutÊs s'ils se trouvent sur le disque dÊfaillant. Les autres limitations de SnapRAID sont : * Avec SnapRAID, vous avez toujours des systèmes de fichiers sÊparÊs pour chaque disque. Avec le RAID, vous obtenez un seul grand système de fichiers. * SnapRAID ne fait pas de striping (entrelacement) des donnÊes. Avec le RAID, vous obtenez un gain de vitesse avec le striping. * SnapRAID ne prend pas en charge la rÊcupÊration en temps rÊel. Avec le RAID, vous n'avez pas à arrÃĒter de travailler lorsqu'un disque tombe en panne. * SnapRAID ne peut rÊcupÊrer des donnÊes que pour un nombre limitÊ de dÊfaillances de disques. Avec une sauvegarde, vous pouvez rÊcupÊrer d'une dÊfaillance complète de toute la baie de disques. * Seuls les noms de fichiers, les horodatages, les liens symboliques et les liens matÊriels sont sauvegardÊs. Les permissions, la propriÊtÊ et les attributs Êtendus ne sont pas sauvegardÊs. DÊmarrer Pour utiliser SnapRAID, vous devez d'abord sÊlectionner un disque dans votre baie de disques pour le dÊdier aux informations de `paritÊ`. Avec un disque pour la paritÊ, vous pourrez rÊcupÊrer d'une seule dÊfaillance de disque, similaire au RAID5. Si vous souhaitez rÊcupÊrer de plus de dÊfaillances de disques, similaire au RAID6, vous devez rÊserver des disques supplÊmentaires pour la paritÊ. Chaque disque de paritÊ supplÊmentaire permet la rÊcupÊration d'une dÊfaillance de disque de plus. Comme disques de paritÊ, vous devez choisir les plus grands disques de la baie, car les informations de paritÊ peuvent atteindre la taille du plus grand disque de donnÊes de la baie. Ces disques seront dÊdiÊs au stockage des fichiers de `paritÊ`. Vous ne devriez pas y stocker vos donnÊes. Ensuite, vous devez dÊfinir les disques de `donnÊes` que vous souhaitez protÊger avec SnapRAID. La protection est plus efficace si ces disques contiennent des donnÊes qui changent rarement. Pour cette raison, il est prÊfÊrable de NE PAS inclure le disque C:\ de Windows ou les rÊpertoires /home, /var et /tmp d'Unix. La liste des fichiers est enregistrÊe dans les fichiers `content` (contenu), gÊnÊralement stockÊs sur les disques de donnÊes, de paritÊ ou de dÊmarrage. Ce fichier contient les dÊtails de votre sauvegarde, y compris toutes les sommes de contrôle pour vÊrifier son intÊgritÊ. Le fichier `content` est stockÊ en plusieurs copies, et chaque copie doit se trouver sur un disque diffÊrent pour garantir qu'au moins une copie soit disponible, mÃĒme en cas de dÊfaillances de disques multiples. Par exemple, supposons que vous ne soyez intÊressÊ que par un seul niveau de protection de paritÊ, et que vos disques se trouvent à : :/mnt/diskp <- disque sÊlectionnÊ pour la paritÊ :/mnt/disk1 <- premier disque à protÊger :/mnt/disk2 <- deuxième disque à protÊger :/mnt/disk3 <- troisième disque à protÊger Vous devez crÊer le fichier de configuration /etc/snapraid.conf avec les options suivantes : :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Si vous ÃĒtes sous Windows, vous devez utiliser le format de chemin Windows, avec des lettres de lecteur et des barres obliques inverses au lieu de barres obliques. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Si vous avez de nombreux disques et manquez de lettres de lecteur, vous pouvez monter les disques directement dans des sous-dossiers. Voir : :https://www.google.com/search?q=Windows+mount+point À ce stade, vous ÃĒtes prÃĒt à exÊcuter la commande `sync` (synchroniser) pour construire les informations de paritÊ. :snapraid sync Ce processus peut prendre plusieurs heures la première fois, en fonction de la taille des donnÊes dÊjà prÊsentes sur les disques. Si les disques sont vides, le processus est immÊdiat. Vous pouvez l'arrÃĒter à tout moment en appuyant sur Ctrl+C, et lors de la prochaine exÊcution, il reprendra là oÚ il a ÊtÊ interrompu. Lorsque cette commande est terminÊe, vos donnÊes sont EN SÉCURITÉ. Vous pouvez maintenant commencer à utiliser votre baie comme vous le souhaitez et mettre à jour pÊriodiquement les informations de paritÊ en exÊcutant la commande `sync`. Nettoyage (Scrubbing) Pour vÊrifier pÊriodiquement les donnÊes et la paritÊ à la recherche d'erreurs, vous pouvez exÊcuter la commande `scrub`. :snapraid scrub Cette commande compare les donnÊes de votre baie avec le hachage calculÊ lors de la commande `sync` pour vÊrifier l'intÊgritÊ. Chaque exÊcution de la commande vÊrifie environ 8 % de la baie, en excluant les donnÊes dÊjà nettoyÊes au cours des 10 jours prÊcÊdents. Vous pouvez utiliser l'option -p, --plan pour spÊcifier une quantitÊ diffÊrente et l'option -o, --older-than pour spÊcifier un Ãĸge diffÊrent en jours. Par exemple, pour vÊrifier 5 % de la baie pour les blocs de plus de 20 jours, utilisez : :snapraid -p 5 -o 20 scrub Si des erreurs silencieuses ou d'entrÊe/sortie sont trouvÊes pendant le processus, les blocs correspondants sont marquÊs comme mauvais dans le fichier `content` et listÊs dans la commande `status`. :snapraid status Pour les corriger, vous pouvez utiliser la commande `fix`, en filtrant les mauvais blocs avec l'option -e, --filter-error : :snapraid -e fix Lors du prochain `scrub`, les erreurs disparaÃŽtront du rapport `status` si elles sont rÊellement corrigÊes. Pour accÊlÊrer, vous pouvez utiliser -p mauvais pour nettoyer uniquement les blocs marquÊs comme mauvais. :snapraid -p bad scrub L'exÊcution de `scrub` sur une baie non synchronisÊe peut signaler des erreurs causÊes par des fichiers supprimÊs ou modifiÊs. Ces erreurs sont signalÊes dans la sortie de `scrub`, mais les blocs associÊs ne sont pas marquÊs comme mauvais. Mise en commun (Pooling) Note : La fonctionnalitÊ de mise en commun dÊcrite ci-dessous a ÊtÊ remplacÊe par l'outil mergerfs, qui est dÊsormais l'option recommandÊe pour les utilisateurs Linux de la communautÊ SnapRAID. Mergefs offre un moyen plus flexible et efficace de regrouper plusieurs disques dans un seul point de montage unifiÊ, permettant un accès transparent aux fichiers sur toute votre baie sans dÊpendre de liens symboliques. Il s'intègre bien avec SnapRAID pour la protection par paritÊ et est couramment utilisÊ dans des configurations comme OpenMediaVault (OMV) ou des configurations NAS personnalisÊes. Pour que tous les fichiers de votre baie apparaissent dans la mÃĒme arborescence de rÊpertoires, vous pouvez activer la fonctionnalitÊ de `pooling`. Elle crÊe une vue virtuelle en lecture seule de tous les fichiers de votre baie à l'aide de liens symboliques. Vous pouvez configurer le rÊpertoire de `pooling` dans le fichier de configuration avec : :pool /pool ou, si vous ÃĒtes sous Windows, avec : :pool C:\pool puis exÊcutez la commande `pool` pour crÊer ou mettre à jour la vue virtuelle. :snapraid pool Si vous utilisez une plateforme Unix et souhaitez partager ce rÊpertoire sur le rÊseau avec des machines Windows ou Unix, vous devez ajouter les options suivantes à votre /etc/samba/smb.conf : :# Dans la section globale de smb.conf :unix extensions = no :# Dans la section de partage de smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes Sous Windows, le partage de liens symboliques sur un rÊseau nÊcessite que les clients les rÊsolvent à distance. Pour activer cela, en plus de partager le rÊpertoire du pool, vous devez Êgalement partager tous les disques indÊpendamment, en utilisant les noms de disques dÊfinis dans le fichier de configuration comme points de partage. Vous devez Êgalement spÊcifier dans l'option `share` du fichier de configuration le chemin UNC Windows que les clients distants doivent utiliser pour accÊder à ces disques partagÊs. Par exemple, en opÊrant à partir d'un serveur nommÊ `darkstar`, vous pouvez utiliser les options : :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar et partager les rÊpertoires suivants sur le rÊseau : :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array pour permettre aux clients distants d'accÊder à tous les fichiers à \\darkstar\pool. Vous pourriez Êgalement avoir besoin de configurer les clients distants pour activer l'accès aux liens symboliques distants avec la commande : :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Restauration (Undeleting) SnapRAID fonctionne davantage comme un programme de sauvegarde qu'un système RAID, et il peut ÃĒtre utilisÊ pour restaurer ou rÊcupÊrer des fichiers dans leur Êtat prÊcÊdent à l'aide de l'option -f, --filter : :snapraid fix -f FICHIER ou pour un rÊpertoire : :snapraid fix -f DOSSIER/ Vous pouvez Êgalement l'utiliser pour rÊcupÊrer uniquement les fichiers accidentellement supprimÊs à l'intÊrieur d'un rÊpertoire en utilisant l'option -m, --filter-missing, qui ne restaure que les fichiers manquants, laissant tous les autres intacts. :snapraid fix -m -f DOSSIER/ Ou pour rÊcupÊrer tous les fichiers supprimÊs sur tous les lecteurs avec : :snapraid fix -m RÊcupÊration Le pire est arrivÊ, et vous avez perdu un ou plusieurs disques ! NE PANIQUEZ PAS ! Vous pourrez les rÊcupÊrer ! La première chose à faire est d'Êviter d'autres modifications sur votre baie de disques. DÊsactivez toute connexion à distance et tout processus planifiÊ, y compris toute synchronisation ou nettoyage SnapRAID nocturne planifiÊ. ProcÊdez ensuite aux Êtapes suivantes. ÉTAPE 1 -> Reconfigurer Vous avez besoin d'espace pour rÊcupÊrer, idÊalement sur des disques de rechange supplÊmentaires, mais un disque USB externe ou un disque distant suffira. Modifiez le fichier de configuration SnapRAID pour que l'option `data` ou `parity` du disque dÊfaillant pointe vers un emplacement avec suffisamment d'espace vide pour rÊcupÊrer les fichiers. Par exemple, si le disque `d1` a ÊchouÊ, passez de : :data d1 /mnt/disk1/ à : :data d1 /mnt/new_spare_disk/ Si le disque à rÊcupÊrer est un disque de paritÊ, mettez à jour l'option `parity` appropriÊe. Si vous avez plusieurs disques dÊfaillants, mettez à jour toutes leurs options de configuration. ÉTAPE 2 -> Corriger (Fix) ExÊcutez la commande fix, en stockant le journal dans un fichier externe avec : :snapraid -d NOM -l fix.log fix OÚ NOM est le nom du disque, tel que `d1` dans notre exemple prÊcÊdent. Si le disque à rÊcupÊrer est un disque de paritÊ, utilisez les noms `parity`, `2-parity`, etc. Si vous avez plusieurs disques dÊfaillants, utilisez plusieurs options -d pour les spÊcifier tous. Cette commande prendra beaucoup de temps. Assurez-vous d'avoir quelques gigaoctets libres pour stocker le fichier fix.log. ExÊcutez-la à partir d'un disque avec suffisamment d'espace libre. Vous avez maintenant rÊcupÊrÊ tout ce qui est rÊcupÊrable. Si certains fichiers sont partiellement ou totalement irrÊcupÊrables, ils seront renommÊs en ajoutant l'extension `.unrecoverable`. Vous pouvez trouver une liste dÊtaillÊe de tous les blocs irrÊcupÊrables dans le fichier fix.log en vÊrifiant toutes les lignes commençant par `unrecoverable:`. Si la rÊcupÊration ne vous satisfait pas, vous pouvez rÊessayer autant de fois que vous le souhaitez. Par exemple, si vous avez supprimÊ des fichiers de la baie après le dernier `sync`, cela peut entraÃŽner la non-rÊcupÊration de certains fichiers. Dans ce cas, vous pouvez rÊessayer le `fix` en utilisant l'option -i, --import, en spÊcifiant oÚ se trouvent maintenant ces fichiers pour les inclure à nouveau dans le processus de rÊcupÊration. Si vous ÃĒtes satisfait de la rÊcupÊration, vous pouvez continuer, mais notez qu'après la synchronisation, vous ne pouvez plus rÊessayer la commande `fix` ! ÉTAPE 3 -> VÊrifier (Check) Par prÊcaution, vous pouvez maintenant exÊcuter une commande `check` pour vous assurer que tout est correct sur le disque rÊcupÊrÊ. :snapraid -d NOM -a check OÚ NOM est le nom du disque, tel que `d1` dans notre exemple prÊcÊdent. Les options -d et -a indiquent à SnapRAID de vÊrifier uniquement le disque spÊcifiÊ et d'ignorer toutes les donnÊes de paritÊ. Cette commande prendra beaucoup de temps, mais si vous n'ÃĒtes pas trop prudent, vous pouvez la sauter. ÉTAPE 4 -> Synchroniser (Sync) ExÊcutez la commande `sync` pour resynchroniser la baie avec le nouveau disque. :snapraid sync Si tout est rÊcupÊrÊ, cette commande est immÊdiate. Commandes SnapRAID fournit quelques commandes simples qui vous permettent de : * Afficher l'Êtat de la baie de disques -> `status` * Contrôler les disques -> `smart`, `probe`, `up`, `down` * Faire une sauvegarde/instantanÊ -> `sync` * VÊrifier pÊriodiquement les donnÊes -> `scrub` * Restaurer la dernière sauvegarde/instantanÊ -> `fix`. Les commandes doivent ÃĒtre Êcrites en minuscules. status Affiche un rÊsumÊ de l'Êtat de la baie de disques. Il comprend des informations sur la fragmentation de la paritÊ, l'Ãĸge des blocs sans vÊrification, et toutes les erreurs silencieuses enregistrÊes rencontrÊes lors du nettoyage. Les informations prÊsentÊes se rÊfèrent au dernier moment oÚ vous avez exÊcutÊ `sync`. Les modifications ultÊrieures ne sont pas prises en compte. Si des mauvais blocs ont ÊtÊ dÊtectÊs, leurs numÊros de blocs sont listÊs. Pour les corriger, vous pouvez utiliser la commande `fix -e`. Il montre Êgalement un graphique reprÊsentant la dernière fois que chaque bloc a ÊtÊ nettoyÊ ou synchronisÊ. Les blocs nettoyÊs sont affichÊs avec `*`, les blocs synchronisÊs mais pas encore nettoyÊs avec `o`. Rien n'est modifiÊ. smart Affiche un rapport SMART de tous les disques du système. Il comprend une estimation de la probabilitÊ de dÊfaillance au cours de la prochaine annÊe, vous permettant de planifier les remplacements de maintenance des disques qui prÊsentent des attributs suspects. Cette estimation de probabilitÊ est obtenue en corrÊlant les attributs SMART des disques avec les donnÊes Backblaze disponibles à : :https://www.backblaze.com/hard-drive-test-data.html Si SMART signale qu'un disque est en panne, `FAIL` ou `PREFAIL` est affichÊ pour ce disque, et SnapRAID retourne une erreur. Dans ce cas, le remplacement immÊdiat du disque est fortement recommandÊ. Les autres chaÃŽnes d'Êtat possibles sont : logfail - Dans le passÊ, certains attributs Êtaient infÊrieurs au seuil. logerr - Le journal d'erreurs du pÊriphÊrique contient des erreurs. selferr - Le journal d'auto-test du pÊriphÊrique contient des erreurs. Si l'option -v, --verbose est spÊcifiÊe, une analyse statistique plus approfondie est fournie. Cette analyse peut vous aider à dÊcider si vous avez besoin de plus ou moins de paritÊ. Cette commande utilise l'outil `smartctl` et Êquivaut à exÊcuter `smartctl -a` sur tous les pÊriphÊriques. Si vos pÊriphÊriques ne sont pas dÊtectÊs automatiquement correctement, vous pouvez spÊcifier une commande personnalisÊe en utilisant l'option `smartctl` dans le fichier de configuration. Rien n'est modifiÊ. probe Affiche l'Êtat d'ALIMENTATION de tous les disques du système. `Standby` signifie que le disque ne tourne pas. `Active` signifie que le disque tourne. Cette commande utilise l'outil `smartctl` et Êquivaut à exÊcuter `smartctl -n standby -i` sur tous les pÊriphÊriques. Si vos pÊriphÊriques ne sont pas dÊtectÊs automatiquement correctement, vous pouvez spÊcifier une commande personnalisÊe en utilisant l'option `smartctl` dans le fichier de configuration. Rien n'est modifiÊ. up Fait tourner (spin up) tous les disques de la baie. Vous pouvez faire tourner uniquement des disques spÊcifiques en utilisant l'option -d, --filter-disk. Faire tourner tous les disques en mÃĒme temps nÊcessite beaucoup d'Ênergie. Assurez-vous que votre alimentation peut le supporter. Rien n'est modifiÊ. down ArrÃĒte (spin down) tous les disques de la baie. Cette commande utilise l'outil `smartctl` et Êquivaut à exÊcuter `smartctl -s standby,now` sur tous les pÊriphÊriques. Vous pouvez arrÃĒter uniquement des disques spÊcifiques en utilisant l'option -d, --filter-disk. Pour arrÃĒter automatiquement en cas d'erreur, vous pouvez utiliser l'option -s, --spin-down-on-error avec toute autre commande, ce qui Êquivaut à exÊcuter `down` manuellement lorsqu'une erreur se produit. Rien n'est modifiÊ. diff Liste tous les fichiers modifiÊs depuis le dernier `sync` qui nÊcessitent la recomputation de leurs donnÊes de paritÊ. Cette commande ne vÊrifie pas les donnÊes des fichiers, mais uniquement l'horodatage, la taille et l'inode du fichier. Après avoir listÊ tous les fichiers modifiÊs, un rÊsumÊ des modifications est prÊsentÊ, regroupÊ par : equal - Fichiers inchangÊs par rapport à avant. added - Fichiers ajoutÊs qui n'Êtaient pas prÊsents auparavant. removed - Fichiers supprimÊs. updated - Fichiers avec une taille ou un horodatage diffÊrent, signifiant qu'ils ont ÊtÊ modifiÊs. moved - Fichiers dÊplacÊs vers un rÊpertoire diffÊrent sur le mÃĒme disque. Ils sont identifiÊs par le mÃĒme nom, la mÃĒme taille, le mÃĒme horodatage et le mÃĒme inode, mais un rÊpertoire diffÊrent. copied - Fichiers copiÊs sur le mÃĒme disque ou sur un disque diffÊrent oÚ le fichier original existe toujours. Ils sont identifiÊs par le fait qu'ils ont le mÃĒme nom, la mÃĒme taille et le mÃĒme horodatage. Si l'horodatage à la sous-seconde est nul, le chemin complet doit correspondre pour ÃĒtre identifiÊ, pas seulement le nom. relocated - Fichiers dÊplacÊs sur le mÃĒme disque ou sur un disque diffÊrent oÚ l'original a disparu. Ils sont identifiÊs par le fait qu'ils ont le mÃĒme nom, la mÃĒme taille et le mÃĒme horodatage. Si l'horodatage à la sous-seconde est nul, le chemin complet doit correspondre pour ÃĒtre identifiÊ. Contrairement aux fichiers 'moved' sur le mÃĒme disque, les fichiers relocalisÊs ont un inode diffÊrent. restored - Fichiers avec un inode diffÊrent mais dont le rÊpertoire, le nom, la taille et l'horodatage correspondent. Il s'agit gÊnÊralement de fichiers restaurÊs après avoir ÊtÊ supprimÊs. Si un `sync` est requis, le code de retour du processus est 2, au lieu du 0 par dÊfaut. Le code de retour 1 est utilisÊ pour une condition d'erreur gÊnÊrique. Rien n'est modifiÊ. sync Met à jour les informations de paritÊ. Tous les fichiers modifiÊs dans la baie de disques sont lus, et les donnÊes de paritÊ correspondantes sont mises à jour. Vous pouvez arrÃĒter ce processus à tout moment en appuyant sur Ctrl+C, sans perdre le travail dÊjà effectuÊ. Lors de la prochaine exÊcution, le processus `sync` reprendra là oÚ il a ÊtÊ interrompu. Si des erreurs silencieuses ou d'entrÊe/sortie sont trouvÊes pendant le processus, les blocs correspondants sont marquÊs comme mauvais. Les fichiers sont identifiÊs par chemin et/ou inode et vÊrifiÊs par taille et horodatage. Si la taille ou l'horodatage du fichier diffère, les donnÊes de paritÊ sont recomptÊes pour l'ensemble du fichier. Si le fichier est dÊplacÊ ou renommÊ sur le mÃĒme disque, en gardant le mÃĒme inode, la paritÊ n'est pas recomptÊe. Si le fichier est dÊplacÊ vers un autre disque, la paritÊ est recomptÊe, mais les informations de hachage prÊcÊdemment calculÊes sont conservÊes. Les fichiers `content` et `parity` sont modifiÊs si nÊcessaire. Les fichiers dans la baie NE SONT PAS modifiÊs. scrub Nettoie la baie, vÊrifiant les erreurs silencieuses ou d'entrÊe/sortie dans les disques de donnÊes et de paritÊ. Chaque invocation vÊrifie environ 8 % de la baie, en excluant les donnÊes dÊjà nettoyÊes au cours des 10 derniers jours. Cela signifie qu'un nettoyage une fois par semaine garantit que chaque bit de donnÊes est vÊrifiÊ au moins une fois tous les trois mois. Vous pouvez dÊfinir un plan de nettoyage ou une quantitÊ diffÊrente en utilisant l'option -p, --plan, qui accepte : bad - Nettoyer les blocs marquÊs mauvais. new - Nettoyer les blocs juste synchronisÊs qui n'ont pas encore ÊtÊ nettoyÊs. full - Nettoyer tout. 0-100 - Nettoyer le pourcentage spÊcifiÊ de blocs. Si vous spÊcifiez un pourcentage, vous pouvez Êgalement utiliser l'option -o, --older-than pour dÊfinir l'Ãĸge que le bloc doit avoir. Les blocs les plus anciens sont nettoyÊs en premier, assurant une vÊrification optimale. Si vous souhaitez nettoyer uniquement les blocs juste synchronisÊs qui n'ont pas encore ÊtÊ nettoyÊs, utilisez l'option `-p new`. Pour obtenir des dÊtails sur l'Êtat du nettoyage, utilisez la commande `status`. Pour toute erreur silencieuse ou d'entrÊe/sortie trouvÊe, les blocs correspondants sont marquÊs comme mauvais dans le fichier `content`. Ces mauvais blocs sont listÊs dans `status` et peuvent ÃĒtre corrigÊs avec `fix -e`. Après la correction, lors du prochain nettoyage, ils seront revÊrifiÊs, et s'ils sont jugÊs corrigÊs, la marque "mauvais" sera supprimÊe. Pour nettoyer uniquement les mauvais blocs, vous pouvez utiliser la commande `scrub -p bad`. Il est recommandÊ d'exÊcuter `scrub` uniquement sur une baie synchronisÊe pour Êviter les erreurs signalÊes causÊes par des donnÊes non synchronisÊes. Ces erreurs sont reconnues comme n'Êtant pas des erreurs silencieuses, et les blocs ne sont pas marquÊs comme mauvais, mais de telles erreurs sont signalÊes dans la sortie de la commande. Le fichier `content` est modifiÊ pour mettre à jour l'heure de la dernière vÊrification de chaque bloc et pour marquer les mauvais blocs. Les fichiers `parity` NE SONT PAS modifiÊs. Les fichiers dans la baie NE SONT PAS modifiÊs. fix Corrige tous les fichiers et les donnÊes de paritÊ. Tous les fichiers et les donnÊes de paritÊ sont comparÊs à l'Êtat de l'instantanÊ enregistrÊ lors du dernier `sync`. Si une diffÊrence est trouvÊe, elle est rÊtablie à l'instantanÊ stockÊ. AVERTISSEMENT ! La commande `fix` ne fait pas de distinction entre les erreurs et les modifications intentionnelles. Elle rÊtablit inconditionnellement l'Êtat du fichier au dernier `sync`. Si aucune autre option n'est spÊcifiÊe, l'intÊgralitÊ de la baie est traitÊe. Utilisez les options de filtre pour sÊlectionner un sous-ensemble de fichiers ou de disques sur lesquels opÊrer. Pour corriger uniquement les blocs marquÊs mauvais pendant `sync` et `scrub`, utilisez l'option -e, --filter-error. Contrairement aux autres options de filtre, celle-ci applique des corrections uniquement aux fichiers qui sont inchangÊs depuis le dernier `sync`. SnapRAID renomme tous les fichiers qui ne peuvent pas ÃĒtre corrigÊs en ajoutant l'extension `.unrecoverable`. Avant de corriger, l'intÊgralitÊ de la baie est scannÊe pour trouver tout fichier dÊplacÊ depuis la dernière opÊration `sync`. Ces fichiers sont identifiÊs par leur horodatage, ignorant leur nom et leur rÊpertoire, et sont utilisÊs dans le processus de rÊcupÊration si nÊcessaire. Si vous en avez dÊplacÊ certains en dehors de la baie, vous pouvez utiliser l'option -i, --import pour spÊcifier des rÊpertoires supplÊmentaires à scanner. Les fichiers sont identifiÊs uniquement par chemin, pas par inode. Le fichier `content` N'EST PAS modifiÊ. Les fichiers `parity` sont modifiÊs si nÊcessaire. Les fichiers dans la baie sont modifiÊs si nÊcessaire. check VÊrifie tous les fichiers et les donnÊes de paritÊ. Il fonctionne comme `fix`, mais il simule seulement une rÊcupÊration et aucune modification n'est Êcrite sur la baie. Cette commande est principalement destinÊe à la vÊrification manuelle, comme après un processus de rÊcupÊration ou dans d'autres conditions spÊciales. Pour les vÊrifications pÊriodiques et planifiÊes, utilisez `scrub`. Si vous utilisez l'option -a, --audit-only, seules les donnÊes des fichiers sont vÊrifiÊes, et les donnÊes de paritÊ sont ignorÊes pour une exÊcution plus rapide. Les fichiers sont identifiÊs uniquement par chemin, pas par inode. Rien n'est modifiÊ. list Liste tous les fichiers contenus dans la baie au moment du dernier `sync`. Avec -v ou --verbose, l'heure en sous-seconde est Êgalement affichÊe. Rien n'est modifiÊ. dup Liste tous les fichiers en double. Deux fichiers sont considÊrÊs comme Êgaux si leurs hachages correspondent. Les donnÊes des fichiers ne sont pas lues ; seuls les hachages prÊcalculÊs sont utilisÊs. Rien n'est modifiÊ. pool CrÊe ou met à jour une vue virtuelle de tous les fichiers de votre baie de disques dans le rÊpertoire `pooling`. Les fichiers ne sont pas copiÊs mais liÊs à l'aide de liens symboliques. Lors de la mise à jour, tous les liens symboliques et les sous-rÊpertoires vides existants sont supprimÊs et remplacÊs par la nouvelle vue de la baie. Tout autre fichier ordinaire est laissÊ en place. Rien n'est modifiÊ en dehors du rÊpertoire du pool. devices Affiche les pÊriphÊriques de bas niveau utilisÊs par la baie. Cette commande affiche les associations de pÊriphÊriques dans la baie et est principalement destinÊe à ÃĒtre une interface de script. Les deux premières colonnes sont l'ID et le chemin du pÊriphÊrique de bas niveau. Les deux colonnes suivantes sont l'ID et le chemin du pÊriphÊrique de haut niveau. La dernière colonne est le nom du disque dans la baie. Dans la plupart des cas, vous avez un pÊriphÊrique de bas niveau pour chaque disque de la baie, mais dans certaines configurations plus complexes, vous pouvez avoir plusieurs pÊriphÊriques de bas niveau utilisÊs par un seul disque de la baie. Rien n'est modifiÊ. touch DÊfinit un horodatage arbitraire en sous-seconde pour tous les fichiers qui l'ont dÊfini à zÊro. Cela amÊliore la capacitÊ de SnapRAID à reconnaÃŽtre les fichiers dÊplacÊs et copiÊs, car cela rend l'horodatage presque unique, rÊduisant les doublons possibles. Plus prÊcisÊment, si l'horodatage en sous-seconde n'est pas zÊro, un fichier dÊplacÊ ou copiÊ est identifiÊ comme tel s'il correspond au nom, à la taille et à l'horodatage. Si l'horodatage en sous-seconde est zÊro, il est considÊrÊ comme une copie uniquement si le chemin complet, la taille et l'horodatage correspondent tous. L'horodatage à la seconde près n'est pas modifiÊ, de sorte que toutes les dates et heures de vos fichiers seront prÊservÊes. rehash Planifie un nouveau hachage de toute la baie. Cette commande change le type de hachage utilisÊ, gÊnÊralement lors de la mise à niveau d'un système 32 bits vers un système 64 bits, pour passer de MurmurHash3 au plus rapide SpookyHash. Si vous utilisez dÊjà le hachage optimal, cette commande ne fait rien et vous informe qu'aucune action n'est nÊcessaire. Le nouveau hachage n'est pas effectuÊ immÊdiatement, mais a lieu progressivement pendant `sync` et `scrub`. Vous pouvez vÊrifier l'Êtat du nouveau hachage en utilisant `status`. Pendant le nouveau hachage, SnapRAID conserve toutes ses fonctionnalitÊs, à la seule exception que `dup` ne peut pas dÊtecter les fichiers en double utilisant un hachage diffÊrent. locate Localise les fichiers stockÊs sur les disques de paritÊ. Pour chaque fichier correspondant, il affiche son emplacement dans le fichier de paritÊ et le nombre de fragments qu'il occupe. Vous pouvez utiliser l'option -t, --tail pour restreindre l'opÊration aux fichiers occupant la partie terminale spÊcifiÊe de la paritÊ. Si vous souhaitez rÊallouer ces fichiers, vous pouvez alors utiliser l'option -W, --force-realloc-tail. Sachez que ces fichiers ne seront pas protÊgÊs par la paritÊ pendant le processus de rÊallocation. Options SnapRAID fournit les options suivantes : -c, --conf CONFIG SÊlectionne le fichier de configuration à utiliser. S'il n'est pas spÊcifiÊ, sous Unix, il utilise le fichier `/usr/local/etc/snapraid.conf` s'il existe, sinon `/etc/snapraid.conf`. Sous Windows, il utilise le fichier `snapraid.conf` dans le mÃĒme rÊpertoire que `snapraid.exe`. -f, --filter MOTIF Filtre les fichiers à traiter dans `check` et `fix`. Seuls les fichiers correspondant au motif spÊcifiÊ sont traitÊs. Cette option peut ÃĒtre utilisÊe plusieurs fois. Voir la section MOTIF pour plus de dÊtails sur les spÊcifications de motifs. Sous Unix, assurez-vous que les caractères de globbing sont entre guillemets s'ils sont utilisÊs. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. Elle ne peut pas ÃĒtre utilisÊe avec `sync` et `scrub`, car ils traitent toujours l'intÊgralitÊ de la baie. -d, --filter-disk NOM Filtre les disques à traiter dans `check`, `fix`, `up` et `down`. Vous devez spÊcifier un nom de disque tel que dÊfini dans le fichier de configuration. Vous pouvez Êgalement spÊcifier des disques de paritÊ avec les noms : `parity`, `2-parity`, `3-parity`, etc., pour limiter les opÊrations à un disque de paritÊ spÊcifique. Si vous combinez plusieurs options --filter, --filter-disk et --filter-missing, seuls les fichiers correspondant à tous les filtres sont sÊlectionnÊs. Cette option peut ÃĒtre utilisÊe plusieurs fois. Cette option ne peut ÃĒtre utilisÊe qu'avec `check`, `fix`, `up` et `down`. Elle ne peut pas ÃĒtre utilisÊe avec `sync` et `scrub`, car ils traitent toujours l'intÊgralitÊ de la baie. -m, --filter-missing Filtre les fichiers à traiter dans `check` et `fix`. Seuls les fichiers manquants ou supprimÊs de la baie sont traitÊs. Lorsqu'elle est utilisÊe avec `fix`, cela agit comme une commande `undelete` (restaurer). Si vous combinez plusieurs options --filter, --filter-disk et --filter-missing, seuls les fichiers correspondant à tous les filtres sont sÊlectionnÊs. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. Elle ne peut pas ÃĒtre utilisÊe avec `sync` et `scrub`, car ils traitent toujours l'intÊgralitÊ de la baie. -e, --filter-error Traite les fichiers avec des erreurs dans `check` et `fix`. Il ne traite que les fichiers qui ont des blocs marquÊs avec des erreurs silencieuses ou d'entrÊe/sortie pendant `sync` et `scrub`, tels que listÊs dans `status`. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. -p, --plan PERC|bad|new|full SÊlectionne le plan de nettoyage. Si PERC est une valeur numÊrique de 0 à 100, elle est interprÊtÊe comme le pourcentage de blocs à nettoyer. Au lieu d'un pourcentage, vous pouvez spÊcifier un plan : `bad` nettoie les mauvais blocs, `new` nettoie les blocs qui n'ont pas encore ÊtÊ nettoyÊs, et `full` nettoie tout. Cette option ne peut ÃĒtre utilisÊe qu'avec `scrub`. -o, --older-than JOURS SÊlectionne la partie la plus ancienne de la baie à traiter dans `scrub`. JOURS est l'Ãĸge minimum en jours pour qu'un bloc soit nettoyÊ ; la valeur par dÊfaut est 10. Les blocs marquÊs comme mauvais sont toujours nettoyÊs, quelle que soit cette option. Cette option ne peut ÃĒtre utilisÊe qu'avec `scrub`. -a, --audit-only Dans `check`, vÊrifie le hachage des fichiers sans vÊrifier les donnÊes de paritÊ. Si vous ÃĒtes intÊressÊ uniquement par la vÊrification des donnÊes des fichiers, cette option peut accÊlÊrer considÊrablement le processus de vÊrification. Cette option ne peut ÃĒtre utilisÊe qu'avec `check`. -h, --pre-hash Dans `sync`, exÊcute une phase de hachage prÊliminaire de toutes les nouvelles donnÊes pour une vÊrification supplÊmentaire avant le calcul de la paritÊ. Habituellement, dans `sync`, aucun hachage prÊliminaire n'est effectuÊ, et les nouvelles donnÊes sont hachÊes juste avant le calcul de la paritÊ lorsqu'elles sont lues pour la première fois. Ce processus se produit lorsque le système est soumis à une lourde charge, avec tous les disques en rotation et un processeur occupÊ. Il s'agit d'une condition extrÃĒme pour la machine, et si elle prÊsente un problème matÊriel latent, des erreurs silencieuses peuvent passer inaperçues car les donnÊes ne sont pas encore hachÊes. Pour Êviter ce risque, vous pouvez activer le mode `pre-hash` pour que toutes les donnÊes soient lues deux fois afin de garantir leur intÊgritÊ. Cette option vÊrifie Êgalement les fichiers dÊplacÊs au sein de la baie pour s'assurer que l'opÊration de dÊplacement a rÊussi et, si nÊcessaire, vous permet d'exÊcuter une opÊration fix avant de continuer. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -i, --import DOSSIER Importe à partir du rÊpertoire spÊcifiÊ tous les fichiers supprimÊs de la baie après le dernier `sync`. Si vous avez toujours de tels fichiers, ils peuvent ÃĒtre utilisÊs par `check` et `fix` pour amÊliorer le processus de rÊcupÊration. Les fichiers sont lus, y compris dans les sous-rÊpertoires, et sont identifiÊs quel que soit leur nom. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. -s, --spin-down-on-error En cas d'erreur, arrÃĒte (spin down) tous les disques gÊrÊs avant de quitter avec un code d'Êtat non nul. Cela empÃĒche les lecteurs de rester actifs et en rotation après une opÊration interrompue, aidant à Êviter une accumulation inutile de chaleur et une consommation d'Ênergie. Utilisez cette option pour vous assurer que les disques sont arrÃĒtÊs en toute sÊcuritÊ mÃĒme lorsqu'une commande Êchoue. -w, --bw-limit DÉBIT Applique une limite de bande passante globale pour tous les disques. Le DÉBIT est le nombre d'octets par seconde. Vous pouvez spÊcifier un multiplicateur tel que K, M ou G (par exemple, --bw-limit 1G). -t, --tail TAILLE Limite la liste des fichiers à ceux n'utilisant pas plus que la taille de queue spÊcifiÊe des disques de paritÊ. Vous pouvez utiliser des multiplicateurs tels que K, M, G ou T (ex: --tail 1G). Cette option n'est valide que lorsqu'elle est utilisÊe avec la commande `locate`. -A, --stats Active une vue d'Êtat Êtendue qui affiche des informations supplÊmentaires. L'Êcran affiche deux graphiques : Le premier graphique montre le nombre de bandes mises en mÊmoire tampon pour chaque disque, ainsi que le chemin d'accès au fichier en cours d'accès sur ce disque. GÊnÊralement, le disque le plus lent n'aura pas de tampon disponible, ce qui dÊtermine la bande passante maximale rÊalisable. Le deuxième graphique montre le pourcentage de temps passÊ en attente au cours des 100 dernières secondes. Le disque le plus lent est censÊ causer la majeure partie du temps d'attente, tandis que les autres disques devraient avoir peu ou pas de temps d'attente car ils peuvent utiliser leurs bandes mises en mÊmoire tampon. Ce graphique montre Êgalement le temps passÊ en attente pour les calculs de hachage et les calculs RAID. Tous les calculs s'exÊcutent en parallèle avec les opÊrations de disque. Par consÊquent, tant qu'il y a un temps d'attente mesurable pour au moins un disque, cela indique que le processeur est suffisamment rapide pour suivre la charge de travail. -Z, --force-zero Force l'opÊration non sÊcurisÊe de synchronisation d'un fichier de taille zÊro qui Êtait auparavant non nul. Si SnapRAID dÊtecte une telle condition, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter facilement quand, après un plantage du système, certains fichiers accÊdÊs ont ÊtÊ tronquÊs. C'est une condition possible sous Linux avec les systèmes de fichiers ext3/ext4. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -E, --force-empty Force l'opÊration non sÊcurisÊe de synchronisation d'un disque avec tous les fichiers originaux manquants. Si SnapRAID dÊtecte que tous les fichiers initialement prÊsents sur le disque sont manquants ou rÊÊcrits, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter facilement lorsqu'un système de fichiers de donnÊes n'est pas montÊ. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -U, --force-uuid Force l'opÊration non sÊcurisÊe de synchronisation, vÊrification et correction avec des disques qui ont changÊ leur UUID. Si SnapRAID dÊtecte que certains disques ont changÊ d'UUID, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter lorsque vos disques sont montÊs aux mauvais points de montage. Il est cependant autorisÊ d'avoir un seul changement d'UUID avec une seule paritÊ, et plus avec une paritÊ multiple, car c'est le cas normal lors du remplacement des disques après une rÊcupÊration. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`, `check` ou `fix`. -D, --force-device Force l'opÊration non sÊcurisÊe de correction avec des disques inaccessibles ou avec des disques sur le mÃĒme pÊriphÊrique physique. Par exemple, si vous avez perdu deux disques de donnÊes et que vous avez un disque de rechange pour ne rÊcupÊrer que le premier, vous pouvez ignorer le deuxième disque inaccessible. Ou, si vous souhaitez rÊcupÊrer un disque dans l'espace libre restant sur un disque dÊjà utilisÊ, partageant le mÃĒme pÊriphÊrique physique. Cette option ne peut ÃĒtre utilisÊe qu'avec `fix`. -N, --force-nocopy Dans `sync`, `check` et `fix`, dÊsactive l'heuristique de dÊtection de copie. Sans cette option, SnapRAID suppose que les fichiers ayant les mÃĒmes attributs, tels que le nom, la taille et l'horodatage, sont des copies avec les mÃĒmes donnÊes. Cela permet d'identifier les fichiers copiÊs ou dÊplacÊs d'un disque à un autre et rÊutilise les informations de hachage dÊjà calculÊes pour dÊtecter les erreurs silencieuses ou pour rÊcupÊrer les fichiers manquants. Dans de rares cas, ce comportement peut entraÃŽner des faux positifs ou un processus lent en raison de nombreuses vÊrifications de hachage, et cette option vous permet de rÊsoudre de tels problèmes. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`, `check` et `fix`. -F, --force-full Dans `sync`, force un recomptage complet de la paritÊ. Cette option peut ÃĒtre utilisÊe lorsque vous ajoutez un nouveau niveau de paritÊ ou si vous ÃĒtes revenu à un ancien fichier de contenu utilisant des donnÊes de paritÊ plus rÊcentes. Au lieu de recrÊer la paritÊ à partir de zÊro, cela vous permet de rÊutiliser les hachages prÊsents dans le fichier de contenu pour valider les donnÊes et maintenir la protection des donnÊes pendant le processus `sync` en utilisant les donnÊes de paritÊ existantes. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -R, --force-realloc Dans `sync`, force une rÊallocation complète des fichiers et une reconstruction de la paritÊ. Cette option peut ÃĒtre utilisÊe pour rÊallouer complètement tous les fichiers, en supprimant la fragmentation, tout en rÊutilisant les hachages prÊsents dans le fichier de contenu pour valider les donnÊes. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas l'utiliser. Vous N'AVEZ AUCUNE protection des donnÊes pendant l'opÊration `sync`. -W, --force-realloc-tail TAILLE Fonctionne comme -R, --force-realloc, maar limitÊ à la partie terminale spÊcifiÊe (les derniers TAILLE octets) de chaque fichier de paritÊ. Force la rÊallocation (dÊplacement) de tout fragment/bloc de fichier actuellement stockÊ dans cette section terminale, leur permettant d'ÃĒtre placÊs n'importe oÚ dans le(s) fichier(s) de paritÊ oÚ de l'espace libre est disponible (y compris les trous existants). Le but principal de cette option est de rÊduire la taille sur disque du fichier de paritÊ. Si la rÊallocation rÊussit à vider toute la section terminale (plus aucun bloc ne l'utilise), le fichier de paritÊ est tronquÊ, rÊcupÊrant l'espace terminal inutilisÊ. Vous pouvez utiliser des multiplicateurs tels que K, M, G ou T (ex: --force-realloc-tail 1G). Vous pouvez utiliser locate -t, --tail pour connaÃŽtre à l'avance les fichiers affectÊs. AVERTISSEMENT ! Cette option est rÊservÊe aux experts et il est fortement recommandÊ de ne pas l'utiliser. Vous n'avez PAS de protection des donnÊes pendant l'opÊration `sync` pour les fichiers affectÊs. -l, --log FICHIER Écrit un journal dÊtaillÊ dans le fichier spÊcifiÊ. Si cette option n'est pas spÊcifiÊe, les erreurs inattendues sont imprimÊes à l'Êcran, ce qui peut entraÃŽner une sortie excessive en cas de nombreuses erreurs. Lorsque -l, --log est spÊcifiÊ, seules les erreurs fatales qui entraÃŽnent l'arrÃĒt de SnapRAID sont imprimÊes à l'Êcran. Si le chemin commence par `>>`, le fichier est ouvert en mode ajout. Les occurrences de `%D` et `%T` dans le nom sont remplacÊes par la date et l'heure au format YYYYMMDD et HHMMSS. Dans les fichiers batch Windows, vous devez doubler le caractère `%`, par exemple, result-%%D.log. Pour utiliser `>>`, vous devez encadrer le nom de guillemets, par exemple, `">>result.log"`. Pour sortir le journal sur la sortie standard ou l'erreur standard, vous pouvez utiliser `">&1"` et `">&2"`, respectivement. Consultez le fichier ou la page de manuel snapraid_log.txt pour les descriptions des balises de journal. -L, --error-limit NOMBRE DÊfinit une nouvelle limite d'erreurs avant d'arrÃĒter l'exÊcution. Par dÊfaut, SnapRAID s'arrÃĒte s'il rencontre plus de 100 erreurs d'entrÊe/sortie, indiquant qu'un disque est probablement en panne. Cette option affecte `sync` et `scrub`, qui sont autorisÊs à continuer après le premier ensemble d'erreurs de disque pour essayer de terminer leurs opÊrations. Cependant, `check` et `fix` s'arrÃĒtent toujours à la première erreur. -S, --start BLKSTART Commence le traitement à partir du numÊro de bloc spÊcifiÊ. Cela peut ÃĒtre utile pour rÊessayer de vÊrifier ou de corriger des blocs spÊcifiques en cas de disque endommagÊ. Cette option est principalement destinÊe à la rÊcupÊration manuelle avancÊe. -B, --count BLKCOUNT Ne traite que le nombre de blocs spÊcifiÊ. Cette option est principalement destinÊe à la rÊcupÊration manuelle avancÊe. -C, --gen-conf CONTENU GÊnère un fichier de configuration factice à partir d'un fichier de contenu existant. Le fichier de configuration est Êcrit sur la sortie standard et n'Êcrase pas un fichier existant. Ce fichier de configuration contient Êgalement les informations nÊcessaires pour reconstruire les points de montage du disque au cas oÚ vous perdriez l'intÊgralitÊ du système. -v, --verbose Affiche plus d'informations à l'Êcran. S'il est spÊcifiÊ une fois, il affiche les fichiers exclus et des statistiques supplÊmentaires. Cette option n'a aucun effet sur les fichiers journaux. -q, --quiet Affiche moins d'informations à l'Êcran. S'il est spÊcifiÊ une fois, il supprime la barre de progression ; deux fois, les opÊrations en cours ; trois fois, les messages d'information ; quatre fois, les messages d'Êtat. Les erreurs fatales sont toujours imprimÊes à l'Êcran. Cette option n'a aucun effet sur les fichiers journaux. -H, --help Affiche un Êcran d'aide court. -V, --version Affiche la version du programme. Configuration SnapRAID nÊcessite un fichier de configuration pour savoir oÚ se trouve votre baie de disques et oÚ stocker les informations de paritÊ. Sous Unix, il utilise le fichier `/usr/local/etc/snapraid.conf` s'il existe, sinon `/etc/snapraid.conf`. Sous Windows, il utilise le fichier `snapraid.conf` dans le mÃĒme rÊpertoire que `snapraid.exe`. Il doit contenir les options suivantes (sensibles à la casse) : parity FICHIER [,FICHIER] ... DÊfinit les fichiers à utiliser pour stocker les informations de paritÊ. La paritÊ permet une protection contre une seule dÊfaillance de disque, similaire au RAID5. Vous pouvez spÊcifier plusieurs fichiers, qui doivent se trouver sur des disques diffÊrents. Lorsqu'un fichier ne peut plus grandir, le suivant est utilisÊ. L'espace total disponible doit ÃĒtre au moins aussi grand que le plus grand disque de donnÊes de la baie. Vous pouvez ajouter des fichiers de paritÊ supplÊmentaires plus tard, mais vous ne pouvez pas les rÊorganiser ni les supprimer. Garder les disques de paritÊ rÊservÊs à la paritÊ garantit qu'ils ne deviennent pas fragmentÊs, amÊliorant les performances. Sous Windows, 256 Mo sont laissÊs inutilisÊs sur chaque disque pour Êviter l'avertissement concernant les disques pleins. Cette option est obligatoire et ne peut ÃĒtre utilisÊe qu'une seule fois. (2,3,4,5,6)-parity FICHIER [,FICHIER] ... DÊfinit les fichiers à utiliser pour stocker les informations de paritÊ supplÊmentaires. Pour chaque niveau de paritÊ spÊcifiÊ, un niveau de protection supplÊmentaire est activÊ : * 2-parity active la double paritÊ RAID6. * 3-parity active la triple paritÊ. * 4-parity active la quadruple (quatre) paritÊ. * 5-parity active la penta (cinq) paritÊ. * 6-parity active l'hexa (six) paritÊ. Chaque niveau de paritÊ nÊcessite la prÊsence de tous les niveaux de paritÊ prÊcÊdents. Les mÃĒmes considÊrations que pour l'option `parity` s'appliquent. Ces options sont facultatives et ne peuvent ÃĒtre utilisÊes qu'une seule fois. z-parity FICHIER [,FICHIER] ... DÊfinit un fichier et un format alternatifs pour stocker la triple paritÊ. Cette option est une alternative à `3-parity`, principalement destinÊe aux processeurs bas de gamme comme ARM ou AMD Phenom, Athlon et Opteron qui ne prennent pas en charge l'ensemble d'instructions SSSE3. Dans de tels cas, elle offre de meilleures performances. Ce format est similaire mais plus rapide que celui utilisÊ par ZFS RAIDZ3. Comme ZFS, il ne fonctionne pas au-delà de la triple paritÊ. Lors de l'utilisation de `3-parity`, vous serez averti s'il est recommandÊ d'utiliser le format `z-parity` pour une amÊlioration des performances. Il est possible de convertir d'un format à l'autre en ajustant le fichier de configuration avec le fichier z-parity ou 3-parity souhaitÊ et en utilisant `fix` pour le recrÊer. content FICHIER DÊfinit le fichier à utiliser pour stocker la liste et les sommes de contrôle de tous les fichiers prÊsents dans votre baie de disques. Il peut ÃĒtre placÊ sur un disque utilisÊ pour les donnÊes, la paritÊ, ou tout autre disque disponible. Si vous utilisez un disque de donnÊes, ce fichier est automatiquement exclu du processus `sync`. Cette option est obligatoire et peut ÃĒtre utilisÊe plusieurs fois pour enregistrer plusieurs copies du mÃĒme fichier. Vous devez stocker au moins une copie pour chaque disque de paritÊ utilisÊ plus un. L'utilisation de copies supplÊmentaires ne nuit pas. data NOM DOSSIER DÊfinit le nom et le point de montage des disques de donnÊes dans la baie. NOM est utilisÊ pour identifier le disque et doit ÃĒtre unique. DOSSIER est le point de montage du disque dans le système de fichiers. Vous pouvez modifier le point de montage au besoin, tant que vous gardez le NOM fixe. Vous devriez utiliser une option pour chaque disque de donnÊes de la baie. Vous pouvez renommer un disque plus tard en changeant le NOM directement dans le fichier de configuration, puis en exÊcutant une commande `sync`. Dans le cas d'un renommage, l'association est faite en utilisant l'UUID stockÊ des disques. extra NAME DIR DÊfinit le nom et le point de montage de disques supplÊmentaires à surveiller avec les commandes `smart` et `probe`. Ceci est utile pour surveiller des disques qui ne font pas partie de la grappe mais qui sont nÊcessaires au fonctionnement du système, comme le disque de dÊmarrage. Notez que ces disques ne sont pas affectÊs par les commandes `up` et `down` car ils sont censÊs toujours ÃĒtre en rotation. nohidden Exclut tous les fichiers et rÊpertoires cachÊs. Sous Unix, les fichiers cachÊs sont ceux commençant par `.`. Sous Windows, ce sont ceux avec l'attribut cachÊ. exclude/include MOTIF DÊfinit les motifs de fichiers ou de rÊpertoires à exclure ou à inclure dans le processus de synchronisation. Tous les motifs sont traitÊs dans l'ordre spÊcifiÊ. Si le premier motif qui correspond est un `exclude` (exclure), le fichier est exclu. S'il s'agit d'un `include` (inclure), le fichier est inclus. Si aucun motif ne correspond, le fichier est exclu si le dernier motif spÊcifiÊ est un `include`, ou inclus si le dernier motif spÊcifiÊ est un `exclude`. Voir la section MOTIF pour plus de dÊtails sur les spÊcifications de motifs. Cette option peut ÃĒtre utilisÊe plusieurs fois. blocksize TAILLE_EN_KIBIOCTETS DÊfinit la taille de bloc de base en kibioctets pour la paritÊ. Un kibioctet est de 1024 octets. La taille de bloc par dÊfaut est de 256, ce qui devrait fonctionner dans la plupart des cas. AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas modifier cette valeur. Pour modifier cette valeur à l'avenir, vous devrez recrÊer l'intÊgralitÊ de la paritÊ ! Une raison d'utiliser une taille de bloc diffÊrente est si vous avez beaucoup de petits fichiers, de l'ordre de millions. Pour chaque fichier, mÃĒme s'il ne contient que quelques octets, un bloc entier de paritÊ est allouÊ, et avec de nombreux fichiers, cela peut entraÃŽner un espace de paritÊ inutilisÊ important. Lorsque vous remplissez complètement le disque de paritÊ, vous n'ÃĒtes pas autorisÊ à ajouter plus de fichiers aux disques de donnÊes. Cependant, la paritÊ gaspillÊe ne s'accumule pas sur les disques de donnÊes. L'espace gaspillÊ rÊsultant d'un grand nombre de fichiers sur un disque de donnÊes limite uniquement la quantitÊ de donnÊes sur ce disque de donnÊes, pas les autres. À titre d'approximation, vous pouvez supposer que la moitiÊ de la taille de bloc est gaspillÊe pour chaque fichier. Par exemple, avec 100 000 fichiers et une taille de bloc de 256 Kio, vous gaspillerez 12,8 Go de paritÊ, ce qui peut entraÃŽner 12,8 Go d'espace en moins disponible sur le disque de donnÊes. Vous pouvez vÊrifier la quantitÊ d'espace gaspillÊ sur chaque disque en utilisant `status`. C'est la quantitÊ d'espace que vous devez laisser libre sur les disques de donnÊes ou utiliser pour les fichiers non inclus dans la baie. Si cette valeur est nÊgative, cela signifie que vous ÃĒtes près de remplir la paritÊ, et cela reprÊsente l'espace que vous pouvez encore gaspiller. Pour Êviter ce problème, vous pouvez utiliser une partition plus grande pour la paritÊ. Par exemple, si la partition de paritÊ est 12,8 Go plus grande que les disques de donnÊes, vous avez suffisamment d'espace supplÊmentaire pour gÊrer jusqu'à 100 000 fichiers sur chaque disque de donnÊes sans aucun espace gaspillÊ. Une astuce pour obtenir une partition de paritÊ plus grande sous Linux est de la formater avec la commande : :mkfs.ext4 -m 0 -T largefile4 DEVICE Cela se traduit par environ 1,5 % d'espace supplÊmentaire, environ 60 Go pour un disque de 4 To, ce qui permet environ 460 000 fichiers sur chaque disque de donnÊes sans aucun espace gaspillÊ. hashsize TAILLE_EN_OCTETS DÊfinit la taille du hachage en octets pour les blocs enregistrÊs. La taille de hachage par dÊfaut est de 16 octets (128 bits), ce qui devrait fonctionner dans la plupart des cas. AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas modifier cette valeur. Pour modifier cette valeur à l'avenir, vous devrez recrÊer l'intÊgralitÊ de la paritÊ ! Une raison d'utiliser une taille de hachage diffÊrente est si votre système a une mÊmoire limitÊe. En règle gÊnÊrale, SnapRAID nÊcessite gÊnÊralement 1 Gio de RAM pour chaque 16 To de donnÊes dans la baie. Plus prÊcisÊment, pour stocker les hachages des donnÊes, SnapRAID nÊcessite environ TS*(1+HS)/BS octets de RAM, oÚ TS est la taille totale en octets de votre baie de disques, BS est la taille de bloc en octets, et HS est la taille de hachage en octets. Par exemple, avec 8 disques de 4 To, une taille de bloc de 256 Kio (1 Kio = 1024 octets) et une taille de hachage de 16, vous obtenez : :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 Gio En passant à une taille de hachage de 8, vous obtenez : :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 Gio En passant à une taille de bloc de 512, vous obtenez : :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 Gio En passant à la fois à une taille de hachage de 8 et à une taille de bloc de 512, vous obtenez : :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 Gio autosave TAILLE_EN_GIGAOCTETS Enregistre automatiquement l'Êtat lors de la synchronisation ou du nettoyage après la quantitÊ spÊcifiÊe de Go traitÊs. Cette option est utile pour Êviter de redÊmarrer de longues commandes `sync` à partir de zÊro si elles sont interrompues par un plantage de la machine ou tout autre ÊvÊnement. temp_limit TEMPÉRATURE_CELSIUS DÊfinit la tempÊrature maximale autorisÊe du disque en Celsius. Lorsqu'elle est spÊcifiÊe, SnapRAID vÊrifie pÊriodiquement la tempÊrature de tous les disques à l'aide de l'outil smartctl. Les tempÊratures actuelles des disques sont affichÊes pendant que SnapRAID fonctionne. Si un disque dÊpasse cette limite, toutes les opÊrations s'arrÃĒtent et les disques sont arrÃĒtÊs (mis en veille) pendant la durÊe dÊfinie par l'option `temp_sleep`. Après la pÊriode de veille, les opÊrations reprennent, pouvant s'arrÃĒter à nouveau si la limite de tempÊrature est de nouveau atteinte. Pendant le fonctionnement, SnapRAID analyse Êgalement la courbe de chauffe de chaque disque et estime la tempÊrature stable à long terme qu'ils sont censÊs atteindre si l'activitÊ continue. L'estimation n'est effectuÊe qu'après que la tempÊrature du disque a augmentÊ quatre fois, garantissant que suffisamment de points de donnÊes sont disponibles pour Êtablir une tendance fiable. Cette tempÊrature stable prÊdite est affichÊe entre parenthèses à côtÊ de la valeur actuelle et aide à Êvaluer si le refroidissement du système est adÊquat. Cette tempÊrature estimÊe est uniquement à titre informatif et n'a aucun effet sur le comportement de SnapRAID. Les actions du programme sont basÊes uniquement sur les tempÊratures rÊelles mesurÊes des disques. Pour effectuer cette analyse, SnapRAID a besoin d'une rÊfÊrence pour la tempÊrature du système. Il tente d'abord de la lire à partir des capteurs matÊriels disponibles. Si aucun capteur système n'est accessible, il utilise la tempÊrature de disque la plus basse mesurÊe au dÊbut de l'exÊcution comme rÊfÊrence de secours. Normalement, SnapRAID n'affiche que la tempÊrature du disque le plus chaud. Pour afficher la tempÊrature de tous les disques, utilisez l'option -A ou --stats. temp_sleep TEMPS_EN_MINUTES DÊfinit le temps de veille, en minutes, lorsque la limite de tempÊrature est atteinte. Pendant cette pÊriode, les disques restent arrÃĒtÊs. La valeur par dÊfaut est de 5 minutes. pool DOSSIER DÊfinit le rÊpertoire de mise en commun oÚ la vue virtuelle de la baie de disques est crÊÊe à l'aide de la commande `pool`. Le rÊpertoire doit dÊjà exister. share CHEMIN_UNC DÊfinit le chemin UNC Windows requis pour accÊder aux disques à distance. Si cette option est spÊcifiÊe, les liens symboliques crÊÊs dans le rÊpertoire du pool utilisent ce chemin UNC pour accÊder aux disques. Sans cette option, les liens symboliques gÊnÊrÊs utilisent uniquement des chemins locaux, ce qui ne permet pas de partager le rÊpertoire du pool sur le rÊseau. Les liens symboliques sont formÊs en utilisant le chemin UNC spÊcifiÊ, en ajoutant le nom du disque tel que spÊcifiÊ dans l'option `data`, et en ajoutant enfin le rÊpertoire et le nom du fichier. Cette option est requise uniquement pour Windows. smartctl DISQUE/PARITÉ OPTIONS... DÊfinit les options smartctl personnalisÊes pour obtenir les attributs SMART de chaque disque. Cela peut ÃĒtre nÊcessaire pour les contrôleurs RAID et certains disques USB qui ne peuvent pas ÃĒtre dÊtectÊs automatiquement. Le placeholder %s est remplacÊ par le nom du pÊriphÊrique, mais il est facultatif pour les pÊriphÊriques fixes comme les contrôleurs RAID. DISQUE est le mÃĒme nom de disque spÊcifiÊ dans l'option `data`. PARITÉ est l'un des noms de paritÊ : `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. Dans les OPTIONS spÊcifiÊes, la chaÃŽne `%s` est remplacÊe par le nom du pÊriphÊrique. Pour les contrôleurs RAID, le pÊriphÊrique est probablement fixe, et vous n'aurez peut-ÃĒtre pas besoin d'utiliser `%s`. Consultez la documentation smartmontools pour les options possibles : :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices Par exemple : :smartctl parity -d sat %s smartignore DISQUE/PARITÉ ATTR [ATTR...] Ignore l'attribut SMART spÊcifiÊ lors du calcul de la probabilitÊ de dÊfaillance du disque. Cette option est utile si un disque signale des valeurs inhabituelles ou trompeuses pour un attribut particulier. DISQUE est le mÃĒme nom de disque spÊcifiÊ dans l'option `data`. PARITÉ est l'un des noms de paritÊ : `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. La valeur spÊciale * peut ÃĒtre utilisÊe pour ignorer l'attribut sur tous les disques. Par exemple, pour ignorer l'attribut `Current Pending Sector Count` sur tous les disques : :smartignore * 197 Pour l'ignorer uniquement sur le premier disque de paritÊ : :smartignore parity 197 Exemples Un exemple de configuration typique pour Unix est : :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Un exemple de configuration typique pour Windows est : :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Motif (Pattern) Les motifs offrent un moyen flexible de filtrer les fichiers à inclure ou à exclure. En utilisant des caractères de "globbing", vous pouvez dÊfinir des règles qui correspondent à des noms de fichiers spÊcifiques ou à des structures de rÊpertoires entières sans lister chaque chemin manuellement. Le point d'interrogation `?` correspond à n'importe quel caractère unique, sauf le sÊparateur de rÊpertoire. Cela le rend utile pour faire correspondre des noms de fichiers avec des caractères variables tout en limitant le motif à un seul niveau de rÊpertoire. L'Êtoile simple `*` correspond à n'importe quelle sÊquence de caractères, mais comme le point d'interrogation, elle ne traverse jamais les frontières des rÊpertoires. Elle s'arrÃĒte à la barre oblique, ce qui la rend adaptÊe à la recherche de correspondances au sein d'un seul composant de chemin. Il s'agit du comportement standard des jokers familier du "globbing" shell. La double Êtoile `**` est plus puissante, elle correspond à n'importe quelle sÊquence de caractères, y compris les sÊparateurs de rÊpertoires. Cela permet aux motifs de correspondre sur plusieurs niveaux de rÊpertoires. Lorsque `**` apparaÃŽt directement intÊgrÊ dans un motif, il peut correspondre à zÊro ou plusieurs caractères, y compris les barres obliques entre le texte littÊral environnant. L'utilisation la plus importante de `**` est sous la forme spÊciale `/**/`. Celle-ci correspond à zÊro ou plusieurs niveaux de rÊpertoires complets, ce qui permet de faire correspondre des fichiers à n'importe quelle profondeur dans une arborescence de rÊpertoires sans connaÃŽtre la structure exacte du chemin. Par exemple, le motif `src/**/main.js` correspond à `src/main.js` (saut de zÊro rÊpertoire), `src/ui/main.js` (saut d'un rÊpertoire), et `src/ui/components/main.js` (saut de deux rÊpertoires). Les classes de caractères utilisant des crochets `[]` correspondent à un seul caractère d'un ensemble ou d'une plage spÊcifiÊs. Comme les autres motifs à caractère unique, elles ne correspondent pas aux sÊparateurs de rÊpertoires. Les classes supportent les plages et la nÊgation à l'aide d'un point d'exclamation. La distinction fondamentale à retenir est que `*`, `?` et les classes de caractères respectent tous les limites des rÊpertoires et ne correspondent qu'au sein d'un seul composant de chemin, alors que `**` est le seul motif qui peut correspondre à travers les sÊparateurs de rÊpertoires. Il existe quatre types de motifs diffÊrents : =FILE SÊlectionne n'importe quel fichier nommÊ FILE. Ce motif s'applique uniquement aux fichiers, pas aux rÊpertoires. =DIR/ SÊlectionne n'importe quel rÊpertoire nommÊ DIR et tout son contenu. Ce motif s'applique uniquement aux rÊpertoires, pas aux fichiers. =/PATH/FILE SÊlectionne le chemin exact du fichier spÊcifiÊ. Ce motif s'applique uniquement aux fichiers, pas aux rÊpertoires. =/PATH/DIR/ SÊlectionne le chemin exact du rÊpertoire spÊcifiÊ et tout son contenu. Ce motif s'applique uniquement aux rÊpertoires, pas aux fichiers. Lorsque vous spÊcifiez un chemin absolu commençant par /, il est appliquÊ à la racine de la baie, et non à la racine du système de fichiers local. Sous Windows, vous pouvez utiliser la barre oblique inverse \ au lieu de la barre oblique /. Les rÊpertoires système Windows, les jonctions, les points de montage et les autres rÊpertoires spÊciaux Windows sont traitÊs comme des fichiers, ce qui signifie que pour les exclure, vous devez utiliser une règle de fichier, pas une règle de rÊpertoire. Si le nom de fichier contient un caractère `*`, `?`, `[`, ou `]`, vous devez l'Êchapper pour Êviter qu'il ne soit interprÊtÊ comme un caractère de globbing. Sous Unix, le caractère d'Êchappement est `\` ; sous Windows, c'est `^`. Lorsque le motif est sur la ligne de commande, vous devez doubler le caractère d'Êchappement pour Êviter qu'il ne soit interprÊtÊ par le shell de commande. Dans le fichier de configuration, vous pouvez utiliser diffÊrentes stratÊgies pour filtrer les fichiers à traiter. L'approche la plus simple consiste à n'utiliser que des règles `exclude` pour supprimer tous les fichiers et rÊpertoires que vous ne voulez pas traiter. Par exemple : :# Exclut tout fichier nommÊ `*.unrecoverable` :exclude *.unrecoverable :# Exclut le rÊpertoire racine `/lost+found` :exclude /lost+found/ :# Exclut tout sous-rÊpertoire nommÊ `tmp` :exclude tmp/ L'approche opposÊe consiste à ne dÊfinir que les fichiers que vous souhaitez traiter, en n'utilisant que des règles `include`. Par exemple : :# Inclut uniquement certains rÊpertoires :include /movies/ :include /musics/ :include /pictures/ L'approche finale consiste à mÊlanger les règles `exclude` et `include`. Dans ce cas, l'ordre des règles est important. Les règles antÊrieures ont prÊsÊance sur les règles ultÊrieures. Pour simplifier, vous pouvez lister toutes les règles `exclude` d'abord, puis toutes les règles `include`. Par exemple : :# Exclut tout fichier nommÊ `*.unrecoverable` :exclude *.unrecoverable :# Exclut tout sous-rÊpertoire nommÊ `tmp` :exclude tmp/ :# Inclut uniquement certains rÊpertoires :include /movies/ :include /musics/ :include /pictures/ Sur la ligne de commande, en utilisant l'option -f, vous ne pouvez utiliser que des motifs `include`. Par exemple : :# VÊrifie uniquement les fichiers .mp3. :# Sous Unix, utilisez des guillemets pour Êviter l'expansion :# du globbing par le shell. :snapraid -f "*.mp3" check Sous Unix, lorsque vous utilisez des caractères de globbing sur la ligne de commande, vous devez les mettre entre guillemets pour empÃĒcher le shell de les dÊvelopper. Ignorer des Fichiers (Ignore Files) En plus des règles globales du fichier de configuration, vous pouvez placer des fichiers `.snapraidignore` dans n'importe quel rÊpertoire de la grappe pour dÊfinir des règles d'exclusion dÊcentralisÊes. Les règles dÊfinies dans `.snapraidignore` sont appliquÊes après les règles du fichier de configuration. Cela signifie qu'elles ont une prioritÊ plus ÊlevÊe et peuvent ÃĒtre utilisÊes pour exclure des fichiers qui Êtaient prÊcÊdemment inclus par la configuration globale. En pratique, si une règle locale correspond, le fichier est exclu quels que soient les paramètres d'inclusion globaux. La logique des motifs dans `.snapraidignore` reflète la configuration globale mais ancre les motifs au rÊpertoire oÚ se trouve le fichier : =FILE SÊlectionne n'importe quel fichier nommÊ FILE dans ce rÊpertoire ou en dessous. Cela suit les mÃĒmes règles de globbing que le motif global. =DIR/ SÊlectionne n'importe quel rÊpertoire nommÊ DIR et tout son contenu, rÊsidant dans ce rÊpertoire ou en dessous. =/PATH/FILE SÊlectionne le fichier exact spÊcifiÊ par rapport à l'emplacement du fichier `.snapraidignore`. =/PATH/DIR/ SÊlectionne le rÊpertoire exact spÊcifiÊ et tout son contenu, par rapport à l'emplacement du fichier `.snapraidignore`. Contrairement à la configuration globale, les fichiers `.snapraidignore` ne prennent en charge que les règles d'exclusion ; vous ne pouvez pas utiliser de motifs `include` ou de nÊgation (!). Par exemple, si vous avez un `.snapraidignore` dans `/mnt/disk1/projects/` : :# Exclut UNIQUEMENT /mnt/disk1/projects/output.bin :/output.bin :# Exclut tout rÊpertoire nommÊ `build` dans projects/ :build/ :# Exclut tout fichier .tmp dans projects/ ou ses sous-dossiers :*.tmp Contenu (Content) SnapRAID stocke la liste et les sommes de contrôle de vos fichiers dans le fichier de contenu. Il s'agit d'un fichier binaire qui rÊpertorie tous les fichiers prÊsents dans votre baie de disques, ainsi que toutes les sommes de contrôle pour vÊrifier leur intÊgritÊ. Ce fichier est lu et Êcrit par les commandes `sync` et `scrub` et lu par les commandes `fix`, `check` et `status`. ParitÊ (Parity) SnapRAID stocke les informations de paritÊ de votre baie dans les fichiers de paritÊ. Ce sont des fichiers binaires contenant la paritÊ calculÊe de tous les blocs dÊfinis dans le fichier `content`. Ces fichiers sont lus et Êcrits par les commandes `sync` et `fix` et lus uniquement par les commandes `scrub` et `check`. Encodage SnapRAID sous Unix ignore tout encodage. Il lit et stocke les noms de fichiers avec le mÃĒme encodage utilisÊ par le système de fichiers. Sous Windows, tous les noms lus à partir du système de fichiers sont convertis et traitÊs au format UTF-8. Pour que les noms de fichiers soient imprimÊs correctement, vous devez dÊfinir la console Windows en mode UTF-8 avec la commande `chcp 65001` et utiliser une police TrueType comme `Lucida Console` comme police de console. Cela n'affecte que les noms de fichiers imprimÊs ; si vous redirigez la sortie de la console vers un fichier, le fichier rÊsultant est toujours au format UTF-8. Droits d'auteur (Copyright) Ce fichier est Copyright (C) 2025 Andrea Mazzoleni Voir aussi (See Also) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-fr.txt000066400000000000000000002273451522717156100170100ustar00rootroot00000000000000 ========================================= Sauvegarde SnapRAID pour baies de disques ========================================= 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter MOTIF] [-d, --filter-disk NOM] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DOSSIER] [-p, --plan PERC|mauvais|nouveau|complet] [-o, --older-than JOURS] [-l, --log FICHIER] [-s, --spin-down-on-error] [-w, --bw-limit DÉBIT] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NOMBRE] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENU] 2 DESCRIPTION ============= SnapRAID est un programme de sauvegarde conçu pour les baies de disques, stockant les informations de paritÊ pour la rÊcupÊration des donnÊes en cas de dÊfaillance de six disques maximum. Principalement destinÊ aux centres multimÊdia domestiques avec des fichiers volumineux et peu souvent modifiÊs, SnapRAID offre plusieurs fonctionnalitÊs : * Vous pouvez utiliser des disques dÊjà remplis de fichiers sans avoir besoin de les reformater, en y accÊdant comme d'habitude. * Toutes vos donnÊes sont hachÊes pour garantir l'intÊgritÊ des donnÊes et prÊvenir la corruption silencieuse. * Lorsque le nombre de disques dÊfaillants dÊpasse le nombre de paritÊs, la perte de donnÊes est limitÊe aux disques affectÊs ; les donnÊes sur les autres disques restent accessibles. * Si vous supprimez accidentellement des fichiers sur un disque, la rÊcupÊration est possible. * Les disques peuvent avoir des tailles diffÊrentes. * Vous pouvez ajouter des disques à tout moment. * SnapRAID ne verrouille pas vos donnÊes ; vous pouvez arrÃĒter de l'utiliser à tout moment sans reformater ni dÊplacer de donnÊes. * Pour accÊder à un fichier, un seul disque doit tourner, ce qui Êconomise de l'Ênergie et rÊduit le bruit. Pour plus d'informations, veuillez visiter le site officiel de SnapRAID : https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID est un hybride entre un programme RAID et un programme de sauvegarde, visant à combiner les meilleurs avantages des deux. Cependant, il a quelques limitations que vous devriez considÊrer avant de l'utiliser. La principale limitation est que si un disque tombe en panne et que vous n'avez pas synchronisÊ rÊcemment, vous pourriez ne pas ÃĒtre en mesure de rÊcupÊrer complètement. Plus prÊcisÊment, vous pourriez ne pas ÃĒtre en mesure de rÊcupÊrer jusqu'à la taille des fichiers modifiÊs ou supprimÊs depuis la dernière opÊration de synchronisation. Cela se produit mÃĒme si les fichiers modifiÊs ou supprimÊs ne se trouvent pas sur le disque dÊfaillant. C'est pourquoi SnapRAID est mieux adaptÊ aux donnÊes qui changent rarement. D'un autre côtÊ, les fichiers nouvellement ajoutÊs n'empÃĒchent pas la rÊcupÊration des fichiers dÊjà existants. Vous ne perdrez que les fichiers rÊcemment ajoutÊs s'ils se trouvent sur le disque dÊfaillant. Les autres limitations de SnapRAID sont : * Avec SnapRAID, vous avez toujours des systèmes de fichiers sÊparÊs pour chaque disque. Avec le RAID, vous obtenez un seul grand système de fichiers. * SnapRAID ne fait pas de striping (entrelacement) des donnÊes. Avec le RAID, vous obtenez un gain de vitesse avec le striping. * SnapRAID ne prend pas en charge la rÊcupÊration en temps rÊel. Avec le RAID, vous n'avez pas à arrÃĒter de travailler lorsqu'un disque tombe en panne. * SnapRAID ne peut rÊcupÊrer des donnÊes que pour un nombre limitÊ de dÊfaillances de disques. Avec une sauvegarde, vous pouvez rÊcupÊrer d'une dÊfaillance complète de toute la baie de disques. * Seuls les noms de fichiers, les horodatages, les liens symboliques et les liens matÊriels sont sauvegardÊs. Les permissions, la propriÊtÊ et les attributs Êtendus ne sont pas sauvegardÊs. 4 DÊMARRER ========== Pour utiliser SnapRAID, vous devez d'abord sÊlectionner un disque dans votre baie de disques pour le dÊdier aux informations de `paritÊ`. Avec un disque pour la paritÊ, vous pourrez rÊcupÊrer d'une seule dÊfaillance de disque, similaire au RAID5. Si vous souhaitez rÊcupÊrer de plus de dÊfaillances de disques, similaire au RAID6, vous devez rÊserver des disques supplÊmentaires pour la paritÊ. Chaque disque de paritÊ supplÊmentaire permet la rÊcupÊration d'une dÊfaillance de disque de plus. Comme disques de paritÊ, vous devez choisir les plus grands disques de la baie, car les informations de paritÊ peuvent atteindre la taille du plus grand disque de donnÊes de la baie. Ces disques seront dÊdiÊs au stockage des fichiers de `paritÊ`. Vous ne devriez pas y stocker vos donnÊes. Ensuite, vous devez dÊfinir les disques de `donnÊes` que vous souhaitez protÊger avec SnapRAID. La protection est plus efficace si ces disques contiennent des donnÊes qui changent rarement. Pour cette raison, il est prÊfÊrable de NE PAS inclure le disque C:\ de Windows ou les rÊpertoires /home, /var et /tmp d'Unix. La liste des fichiers est enregistrÊe dans les fichiers `content` (contenu), gÊnÊralement stockÊs sur les disques de donnÊes, de paritÊ ou de dÊmarrage. Ce fichier contient les dÊtails de votre sauvegarde, y compris toutes les sommes de contrôle pour vÊrifier son intÊgritÊ. Le fichier `content` est stockÊ en plusieurs copies, et chaque copie doit se trouver sur un disque diffÊrent pour garantir qu'au moins une copie soit disponible, mÃĒme en cas de dÊfaillances de disques multiples. Par exemple, supposons que vous ne soyez intÊressÊ que par un seul niveau de protection de paritÊ, et que vos disques se trouvent à : /mnt/diskp <- disque sÊlectionnÊ pour la paritÊ /mnt/disk1 <- premier disque à protÊger /mnt/disk2 <- deuxième disque à protÊger /mnt/disk3 <- troisième disque à protÊger Vous devez crÊer le fichier de configuration /etc/snapraid.conf avec les options suivantes : parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Si vous ÃĒtes sous Windows, vous devez utiliser le format de chemin Windows, avec des lettres de lecteur et des barres obliques inverses au lieu de barres obliques. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Si vous avez de nombreux disques et manquez de lettres de lecteur, vous pouvez monter les disques directement dans des sous-dossiers. Voir : https://www.google.com/search?q=Windows+mount+point À ce stade, vous ÃĒtes prÃĒt à exÊcuter la commande `sync` (synchroniser) pour construire les informations de paritÊ. snapraid sync Ce processus peut prendre plusieurs heures la première fois, en fonction de la taille des donnÊes dÊjà prÊsentes sur les disques. Si les disques sont vides, le processus est immÊdiat. Vous pouvez l'arrÃĒter à tout moment en appuyant sur Ctrl+C, et lors de la prochaine exÊcution, il reprendra là oÚ il a ÊtÊ interrompu. Lorsque cette commande est terminÊe, vos donnÊes sont EN SÉCURITÉ. Vous pouvez maintenant commencer à utiliser votre baie comme vous le souhaitez et mettre à jour pÊriodiquement les informations de paritÊ en exÊcutant la commande `sync`. 4.1 Nettoyage (Scrubbing) ------------------------- Pour vÊrifier pÊriodiquement les donnÊes et la paritÊ à la recherche d'erreurs, vous pouvez exÊcuter la commande `scrub`. snapraid scrub Cette commande compare les donnÊes de votre baie avec le hachage calculÊ lors de la commande `sync` pour vÊrifier l'intÊgritÊ. Chaque exÊcution de la commande vÊrifie environ 8 % de la baie, en excluant les donnÊes dÊjà nettoyÊes au cours des 10 jours prÊcÊdents. Vous pouvez utiliser l'option -p, --plan pour spÊcifier une quantitÊ diffÊrente et l'option -o, --older-than pour spÊcifier un Ãĸge diffÊrent en jours. Par exemple, pour vÊrifier 5 % de la baie pour les blocs de plus de 20 jours, utilisez : snapraid -p 5 -o 20 scrub Si des erreurs silencieuses ou d'entrÊe/sortie sont trouvÊes pendant le processus, les blocs correspondants sont marquÊs comme mauvais dans le fichier `content` et listÊs dans la commande `status`. snapraid status Pour les corriger, vous pouvez utiliser la commande `fix`, en filtrant les mauvais blocs avec l'option -e, --filter-error : snapraid -e fix Lors du prochain `scrub`, les erreurs disparaÃŽtront du rapport `status` si elles sont rÊellement corrigÊes. Pour accÊlÊrer, vous pouvez utiliser -p mauvais pour nettoyer uniquement les blocs marquÊs comme mauvais. snapraid -p bad scrub L'exÊcution de `scrub` sur une baie non synchronisÊe peut signaler des erreurs causÊes par des fichiers supprimÊs ou modifiÊs. Ces erreurs sont signalÊes dans la sortie de `scrub`, mais les blocs associÊs ne sont pas marquÊs comme mauvais. 4.2 Mise en commun (Pooling) ---------------------------- Note : La fonctionnalitÊ de mise en commun dÊcrite ci-dessous a ÊtÊ remplacÊe par l'outil mergerfs, qui est dÊsormais l'option recommandÊe pour les utilisateurs Linux de la communautÊ SnapRAID. Mergefs offre un moyen plus flexible et efficace de regrouper plusieurs disques dans un seul point de montage unifiÊ, permettant un accès transparent aux fichiers sur toute votre baie sans dÊpendre de liens symboliques. Il s'intègre bien avec SnapRAID pour la protection par paritÊ et est couramment utilisÊ dans des configurations comme OpenMediaVault (OMV) ou des configurations NAS personnalisÊes. Pour que tous les fichiers de votre baie apparaissent dans la mÃĒme arborescence de rÊpertoires, vous pouvez activer la fonctionnalitÊ de `pooling`. Elle crÊe une vue virtuelle en lecture seule de tous les fichiers de votre baie à l'aide de liens symboliques. Vous pouvez configurer le rÊpertoire de `pooling` dans le fichier de configuration avec : pool /pool ou, si vous ÃĒtes sous Windows, avec : pool C:\pool puis exÊcutez la commande `pool` pour crÊer ou mettre à jour la vue virtuelle. snapraid pool Si vous utilisez une plateforme Unix et souhaitez partager ce rÊpertoire sur le rÊseau avec des machines Windows ou Unix, vous devez ajouter les options suivantes à votre /etc/samba/smb.conf : # Dans la section globale de smb.conf unix extensions = no # Dans la section de partage de smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes Sous Windows, le partage de liens symboliques sur un rÊseau nÊcessite que les clients les rÊsolvent à distance. Pour activer cela, en plus de partager le rÊpertoire du pool, vous devez Êgalement partager tous les disques indÊpendamment, en utilisant les noms de disques dÊfinis dans le fichier de configuration comme points de partage. Vous devez Êgalement spÊcifier dans l'option `share` du fichier de configuration le chemin UNC Windows que les clients distants doivent utiliser pour accÊder à ces disques partagÊs. Par exemple, en opÊrant à partir d'un serveur nommÊ `darkstar`, vous pouvez utiliser les options : data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar et partager les rÊpertoires suivants sur le rÊseau : \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array pour permettre aux clients distants d'accÊder à tous les fichiers à \\darkstar\pool. Vous pourriez Êgalement avoir besoin de configurer les clients distants pour activer l'accès aux liens symboliques distants avec la commande : fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Restauration (Undeleting) ----------------------------- SnapRAID fonctionne davantage comme un programme de sauvegarde qu'un système RAID, et il peut ÃĒtre utilisÊ pour restaurer ou rÊcupÊrer des fichiers dans leur Êtat prÊcÊdent à l'aide de l'option -f, --filter : snapraid fix -f FICHIER ou pour un rÊpertoire : snapraid fix -f DOSSIER/ Vous pouvez Êgalement l'utiliser pour rÊcupÊrer uniquement les fichiers accidentellement supprimÊs à l'intÊrieur d'un rÊpertoire en utilisant l'option -m, --filter-missing, qui ne restaure que les fichiers manquants, laissant tous les autres intacts. snapraid fix -m -f DOSSIER/ Ou pour rÊcupÊrer tous les fichiers supprimÊs sur tous les lecteurs avec : snapraid fix -m 4.4 RÊcupÊration ---------------- Le pire est arrivÊ, et vous avez perdu un ou plusieurs disques ! NE PANIQUEZ PAS ! Vous pourrez les rÊcupÊrer ! La première chose à faire est d'Êviter d'autres modifications sur votre baie de disques. DÊsactivez toute connexion à distance et tout processus planifiÊ, y compris toute synchronisation ou nettoyage SnapRAID nocturne planifiÊ. ProcÊdez ensuite aux Êtapes suivantes. ---- 4.4.1 ÉTAPE 1 -> Reconfigurer ---- Vous avez besoin d'espace pour rÊcupÊrer, idÊalement sur des disques de rechange supplÊmentaires, mais un disque USB externe ou un disque distant suffira. Modifiez le fichier de configuration SnapRAID pour que l'option `data` ou `parity` du disque dÊfaillant pointe vers un emplacement avec suffisamment d'espace vide pour rÊcupÊrer les fichiers. Par exemple, si le disque `d1` a ÊchouÊ, passez de : data d1 /mnt/disk1/ à : data d1 /mnt/new_spare_disk/ Si le disque à rÊcupÊrer est un disque de paritÊ, mettez à jour l'option `parity` appropriÊe. Si vous avez plusieurs disques dÊfaillants, mettez à jour toutes leurs options de configuration. ---- 4.4.2 ÉTAPE 2 -> Corriger (Fix) ---- ExÊcutez la commande fix, en stockant le journal dans un fichier externe avec : snapraid -d NOM -l fix.log fix OÚ NOM est le nom du disque, tel que `d1` dans notre exemple prÊcÊdent. Si le disque à rÊcupÊrer est un disque de paritÊ, utilisez les noms `parity`, `2-parity`, etc. Si vous avez plusieurs disques dÊfaillants, utilisez plusieurs options -d pour les spÊcifier tous. Cette commande prendra beaucoup de temps. Assurez-vous d'avoir quelques gigaoctets libres pour stocker le fichier fix.log. ExÊcutez-la à partir d'un disque avec suffisamment d'espace libre. Vous avez maintenant rÊcupÊrÊ tout ce qui est rÊcupÊrable. Si certains fichiers sont partiellement ou totalement irrÊcupÊrables, ils seront renommÊs en ajoutant l'extension `.unrecoverable`. Vous pouvez trouver une liste dÊtaillÊe de tous les blocs irrÊcupÊrables dans le fichier fix.log en vÊrifiant toutes les lignes commençant par `unrecoverable:`. Si la rÊcupÊration ne vous satisfait pas, vous pouvez rÊessayer autant de fois que vous le souhaitez. Par exemple, si vous avez supprimÊ des fichiers de la baie après le dernier `sync`, cela peut entraÃŽner la non-rÊcupÊration de certains fichiers. Dans ce cas, vous pouvez rÊessayer le `fix` en utilisant l'option -i, --import, en spÊcifiant oÚ se trouvent maintenant ces fichiers pour les inclure à nouveau dans le processus de rÊcupÊration. Si vous ÃĒtes satisfait de la rÊcupÊration, vous pouvez continuer, mais notez qu'après la synchronisation, vous ne pouvez plus rÊessayer la commande `fix` ! ---- 4.4.3 ÉTAPE 3 -> VÊrifier (Check) ---- Par prÊcaution, vous pouvez maintenant exÊcuter une commande `check` pour vous assurer que tout est correct sur le disque rÊcupÊrÊ. snapraid -d NOM -a check OÚ NOM est le nom du disque, tel que `d1` dans notre exemple prÊcÊdent. Les options -d et -a indiquent à SnapRAID de vÊrifier uniquement le disque spÊcifiÊ et d'ignorer toutes les donnÊes de paritÊ. Cette commande prendra beaucoup de temps, mais si vous n'ÃĒtes pas trop prudent, vous pouvez la sauter. ---- 4.4.4 ÉTAPE 4 -> Synchroniser (Sync) ---- ExÊcutez la commande `sync` pour resynchroniser la baie avec le nouveau disque. snapraid sync Si tout est rÊcupÊrÊ, cette commande est immÊdiate. 5 COMMANDES =========== SnapRAID fournit quelques commandes simples qui vous permettent de : * Afficher l'Êtat de la baie de disques -> `status` * Contrôler les disques -> `smart`, `probe`, `up`, `down` * Faire une sauvegarde/instantanÊ -> `sync` * VÊrifier pÊriodiquement les donnÊes -> `scrub` * Restaurer la dernière sauvegarde/instantanÊ -> `fix`. Les commandes doivent ÃĒtre Êcrites en minuscules. 5.1 status ---------- Affiche un rÊsumÊ de l'Êtat de la baie de disques. Il comprend des informations sur la fragmentation de la paritÊ, l'Ãĸge des blocs sans vÊrification, et toutes les erreurs silencieuses enregistrÊes rencontrÊes lors du nettoyage. Les informations prÊsentÊes se rÊfèrent au dernier moment oÚ vous avez exÊcutÊ `sync`. Les modifications ultÊrieures ne sont pas prises en compte. Si des mauvais blocs ont ÊtÊ dÊtectÊs, leurs numÊros de blocs sont listÊs. Pour les corriger, vous pouvez utiliser la commande `fix -e`. Il montre Êgalement un graphique reprÊsentant la dernière fois que chaque bloc a ÊtÊ nettoyÊ ou synchronisÊ. Les blocs nettoyÊs sont affichÊs avec `*`, les blocs synchronisÊs mais pas encore nettoyÊs avec `o`. Rien n'est modifiÊ. 5.2 smart --------- Affiche un rapport SMART de tous les disques du système. Il comprend une estimation de la probabilitÊ de dÊfaillance au cours de la prochaine annÊe, vous permettant de planifier les remplacements de maintenance des disques qui prÊsentent des attributs suspects. Cette estimation de probabilitÊ est obtenue en corrÊlant les attributs SMART des disques avec les donnÊes Backblaze disponibles à : https://www.backblaze.com/hard-drive-test-data.html Si SMART signale qu'un disque est en panne, `FAIL` ou `PREFAIL` est affichÊ pour ce disque, et SnapRAID retourne une erreur. Dans ce cas, le remplacement immÊdiat du disque est fortement recommandÊ. Les autres chaÃŽnes d'Êtat possibles sont : logfail - Dans le passÊ, certains attributs Êtaient infÊrieurs au seuil. logerr - Le journal d'erreurs du pÊriphÊrique contient des erreurs. selferr - Le journal d'auto-test du pÊriphÊrique contient des erreurs. Si l'option -v, --verbose est spÊcifiÊe, une analyse statistique plus approfondie est fournie. Cette analyse peut vous aider à dÊcider si vous avez besoin de plus ou moins de paritÊ. Cette commande utilise l'outil `smartctl` et Êquivaut à exÊcuter `smartctl -a` sur tous les pÊriphÊriques. Si vos pÊriphÊriques ne sont pas dÊtectÊs automatiquement correctement, vous pouvez spÊcifier une commande personnalisÊe en utilisant l'option `smartctl` dans le fichier de configuration. Rien n'est modifiÊ. 5.3 probe --------- Affiche l'Êtat d'ALIMENTATION de tous les disques du système. `Standby` signifie que le disque ne tourne pas. `Active` signifie que le disque tourne. Cette commande utilise l'outil `smartctl` et Êquivaut à exÊcuter `smartctl -n standby -i` sur tous les pÊriphÊriques. Si vos pÊriphÊriques ne sont pas dÊtectÊs automatiquement correctement, vous pouvez spÊcifier une commande personnalisÊe en utilisant l'option `smartctl` dans le fichier de configuration. Rien n'est modifiÊ. 5.4 up ------ Fait tourner (spin up) tous les disques de la baie. Vous pouvez faire tourner uniquement des disques spÊcifiques en utilisant l'option -d, --filter-disk. Faire tourner tous les disques en mÃĒme temps nÊcessite beaucoup d'Ênergie. Assurez-vous que votre alimentation peut le supporter. Rien n'est modifiÊ. 5.5 down -------- ArrÃĒte (spin down) tous les disques de la baie. Cette commande utilise l'outil `smartctl` et Êquivaut à exÊcuter `smartctl -s standby,now` sur tous les pÊriphÊriques. Vous pouvez arrÃĒter uniquement des disques spÊcifiques en utilisant l'option -d, --filter-disk. Pour arrÃĒter automatiquement en cas d'erreur, vous pouvez utiliser l'option -s, --spin-down-on-error avec toute autre commande, ce qui Êquivaut à exÊcuter `down` manuellement lorsqu'une erreur se produit. Rien n'est modifiÊ. 5.6 diff -------- Liste tous les fichiers modifiÊs depuis le dernier `sync` qui nÊcessitent la recomputation de leurs donnÊes de paritÊ. Cette commande ne vÊrifie pas les donnÊes des fichiers, mais uniquement l'horodatage, la taille et l'inode du fichier. Après avoir listÊ tous les fichiers modifiÊs, un rÊsumÊ des modifications est prÊsentÊ, regroupÊ par : equal - Fichiers inchangÊs par rapport à avant. added - Fichiers ajoutÊs qui n'Êtaient pas prÊsents auparavant. removed - Fichiers supprimÊs. updated - Fichiers avec une taille ou un horodatage diffÊrent, signifiant qu'ils ont ÊtÊ modifiÊs. moved - Fichiers dÊplacÊs vers un rÊpertoire diffÊrent sur le mÃĒme disque. Ils sont identifiÊs par le mÃĒme nom, la mÃĒme taille, le mÃĒme horodatage et le mÃĒme inode, mais un rÊpertoire diffÊrent. copied - Fichiers copiÊs sur le mÃĒme disque ou sur un disque diffÊrent oÚ le fichier original existe toujours. Ils sont identifiÊs par le fait qu'ils ont le mÃĒme nom, la mÃĒme taille et le mÃĒme horodatage. Si l'horodatage à la sous-seconde est nul, le chemin complet doit correspondre pour ÃĒtre identifiÊ, pas seulement le nom. relocated - Fichiers dÊplacÊs sur le mÃĒme disque ou sur un disque diffÊrent oÚ l'original a disparu. Ils sont identifiÊs par le fait qu'ils ont le mÃĒme nom, la mÃĒme taille et le mÃĒme horodatage. Si l'horodatage à la sous-seconde est nul, le chemin complet doit correspondre pour ÃĒtre identifiÊ. Contrairement aux fichiers 'moved' sur le mÃĒme disque, les fichiers relocalisÊs ont un inode diffÊrent. restored - Fichiers avec un inode diffÊrent mais dont le rÊpertoire, le nom, la taille et l'horodatage correspondent. Il s'agit gÊnÊralement de fichiers restaurÊs après avoir ÊtÊ supprimÊs. Si un `sync` est requis, le code de retour du processus est 2, au lieu du 0 par dÊfaut. Le code de retour 1 est utilisÊ pour une condition d'erreur gÊnÊrique. Rien n'est modifiÊ. 5.7 sync -------- Met à jour les informations de paritÊ. Tous les fichiers modifiÊs dans la baie de disques sont lus, et les donnÊes de paritÊ correspondantes sont mises à jour. Vous pouvez arrÃĒter ce processus à tout moment en appuyant sur Ctrl+C, sans perdre le travail dÊjà effectuÊ. Lors de la prochaine exÊcution, le processus `sync` reprendra là oÚ il a ÊtÊ interrompu. Si des erreurs silencieuses ou d'entrÊe/sortie sont trouvÊes pendant le processus, les blocs correspondants sont marquÊs comme mauvais. Les fichiers sont identifiÊs par chemin et/ou inode et vÊrifiÊs par taille et horodatage. Si la taille ou l'horodatage du fichier diffère, les donnÊes de paritÊ sont recomptÊes pour l'ensemble du fichier. Si le fichier est dÊplacÊ ou renommÊ sur le mÃĒme disque, en gardant le mÃĒme inode, la paritÊ n'est pas recomptÊe. Si le fichier est dÊplacÊ vers un autre disque, la paritÊ est recomptÊe, mais les informations de hachage prÊcÊdemment calculÊes sont conservÊes. Les fichiers `content` et `parity` sont modifiÊs si nÊcessaire. Les fichiers dans la baie NE SONT PAS modifiÊs. 5.8 scrub --------- Nettoie la baie, vÊrifiant les erreurs silencieuses ou d'entrÊe/sortie dans les disques de donnÊes et de paritÊ. Chaque invocation vÊrifie environ 8 % de la baie, en excluant les donnÊes dÊjà nettoyÊes au cours des 10 derniers jours. Cela signifie qu'un nettoyage une fois par semaine garantit que chaque bit de donnÊes est vÊrifiÊ au moins une fois tous les trois mois. Vous pouvez dÊfinir un plan de nettoyage ou une quantitÊ diffÊrente en utilisant l'option -p, --plan, qui accepte : bad - Nettoyer les blocs marquÊs mauvais. new - Nettoyer les blocs juste synchronisÊs qui n'ont pas encore ÊtÊ nettoyÊs. full - Nettoyer tout. 0-100 - Nettoyer le pourcentage spÊcifiÊ de blocs. Si vous spÊcifiez un pourcentage, vous pouvez Êgalement utiliser l'option -o, --older-than pour dÊfinir l'Ãĸge que le bloc doit avoir. Les blocs les plus anciens sont nettoyÊs en premier, assurant une vÊrification optimale. Si vous souhaitez nettoyer uniquement les blocs juste synchronisÊs qui n'ont pas encore ÊtÊ nettoyÊs, utilisez l'option `-p new`. Pour obtenir des dÊtails sur l'Êtat du nettoyage, utilisez la commande `status`. Pour toute erreur silencieuse ou d'entrÊe/sortie trouvÊe, les blocs correspondants sont marquÊs comme mauvais dans le fichier `content`. Ces mauvais blocs sont listÊs dans `status` et peuvent ÃĒtre corrigÊs avec `fix -e`. Après la correction, lors du prochain nettoyage, ils seront revÊrifiÊs, et s'ils sont jugÊs corrigÊs, la marque "mauvais" sera supprimÊe. Pour nettoyer uniquement les mauvais blocs, vous pouvez utiliser la commande `scrub -p bad`. Il est recommandÊ d'exÊcuter `scrub` uniquement sur une baie synchronisÊe pour Êviter les erreurs signalÊes causÊes par des donnÊes non synchronisÊes. Ces erreurs sont reconnues comme n'Êtant pas des erreurs silencieuses, et les blocs ne sont pas marquÊs comme mauvais, mais de telles erreurs sont signalÊes dans la sortie de la commande. Le fichier `content` est modifiÊ pour mettre à jour l'heure de la dernière vÊrification de chaque bloc et pour marquer les mauvais blocs. Les fichiers `parity` NE SONT PAS modifiÊs. Les fichiers dans la baie NE SONT PAS modifiÊs. 5.9 fix ------- Corrige tous les fichiers et les donnÊes de paritÊ. Tous les fichiers et les donnÊes de paritÊ sont comparÊs à l'Êtat de l'instantanÊ enregistrÊ lors du dernier `sync`. Si une diffÊrence est trouvÊe, elle est rÊtablie à l'instantanÊ stockÊ. AVERTISSEMENT ! La commande `fix` ne fait pas de distinction entre les erreurs et les modifications intentionnelles. Elle rÊtablit inconditionnellement l'Êtat du fichier au dernier `sync`. Si aucune autre option n'est spÊcifiÊe, l'intÊgralitÊ de la baie est traitÊe. Utilisez les options de filtre pour sÊlectionner un sous-ensemble de fichiers ou de disques sur lesquels opÊrer. Pour corriger uniquement les blocs marquÊs mauvais pendant `sync` et `scrub`, utilisez l'option -e, --filter-error. Contrairement aux autres options de filtre, celle-ci applique des corrections uniquement aux fichiers qui sont inchangÊs depuis le dernier `sync`. SnapRAID renomme tous les fichiers qui ne peuvent pas ÃĒtre corrigÊs en ajoutant l'extension `.unrecoverable`. Avant de corriger, l'intÊgralitÊ de la baie est scannÊe pour trouver tout fichier dÊplacÊ depuis la dernière opÊration `sync`. Ces fichiers sont identifiÊs par leur horodatage, ignorant leur nom et leur rÊpertoire, et sont utilisÊs dans le processus de rÊcupÊration si nÊcessaire. Si vous en avez dÊplacÊ certains en dehors de la baie, vous pouvez utiliser l'option -i, --import pour spÊcifier des rÊpertoires supplÊmentaires à scanner. Les fichiers sont identifiÊs uniquement par chemin, pas par inode. Le fichier `content` N'EST PAS modifiÊ. Les fichiers `parity` sont modifiÊs si nÊcessaire. Les fichiers dans la baie sont modifiÊs si nÊcessaire. 5.10 check ---------- VÊrifie tous les fichiers et les donnÊes de paritÊ. Il fonctionne comme `fix`, mais il simule seulement une rÊcupÊration et aucune modification n'est Êcrite sur la baie. Cette commande est principalement destinÊe à la vÊrification manuelle, comme après un processus de rÊcupÊration ou dans d'autres conditions spÊciales. Pour les vÊrifications pÊriodiques et planifiÊes, utilisez `scrub`. Si vous utilisez l'option -a, --audit-only, seules les donnÊes des fichiers sont vÊrifiÊes, et les donnÊes de paritÊ sont ignorÊes pour une exÊcution plus rapide. Les fichiers sont identifiÊs uniquement par chemin, pas par inode. Rien n'est modifiÊ. 5.11 list --------- Liste tous les fichiers contenus dans la baie au moment du dernier `sync`. Avec -v ou --verbose, l'heure en sous-seconde est Êgalement affichÊe. Rien n'est modifiÊ. 5.12 dup -------- Liste tous les fichiers en double. Deux fichiers sont considÊrÊs comme Êgaux si leurs hachages correspondent. Les donnÊes des fichiers ne sont pas lues ; seuls les hachages prÊcalculÊs sont utilisÊs. Rien n'est modifiÊ. 5.13 pool --------- CrÊe ou met à jour une vue virtuelle de tous les fichiers de votre baie de disques dans le rÊpertoire `pooling`. Les fichiers ne sont pas copiÊs mais liÊs à l'aide de liens symboliques. Lors de la mise à jour, tous les liens symboliques et les sous-rÊpertoires vides existants sont supprimÊs et remplacÊs par la nouvelle vue de la baie. Tout autre fichier ordinaire est laissÊ en place. Rien n'est modifiÊ en dehors du rÊpertoire du pool. 5.14 devices ------------ Affiche les pÊriphÊriques de bas niveau utilisÊs par la baie. Cette commande affiche les associations de pÊriphÊriques dans la baie et est principalement destinÊe à ÃĒtre une interface de script. Les deux premières colonnes sont l'ID et le chemin du pÊriphÊrique de bas niveau. Les deux colonnes suivantes sont l'ID et le chemin du pÊriphÊrique de haut niveau. La dernière colonne est le nom du disque dans la baie. Dans la plupart des cas, vous avez un pÊriphÊrique de bas niveau pour chaque disque de la baie, mais dans certaines configurations plus complexes, vous pouvez avoir plusieurs pÊriphÊriques de bas niveau utilisÊs par un seul disque de la baie. Rien n'est modifiÊ. 5.15 touch ---------- DÊfinit un horodatage arbitraire en sous-seconde pour tous les fichiers qui l'ont dÊfini à zÊro. Cela amÊliore la capacitÊ de SnapRAID à reconnaÃŽtre les fichiers dÊplacÊs et copiÊs, car cela rend l'horodatage presque unique, rÊduisant les doublons possibles. Plus prÊcisÊment, si l'horodatage en sous-seconde n'est pas zÊro, un fichier dÊplacÊ ou copiÊ est identifiÊ comme tel s'il correspond au nom, à la taille et à l'horodatage. Si l'horodatage en sous-seconde est zÊro, il est considÊrÊ comme une copie uniquement si le chemin complet, la taille et l'horodatage correspondent tous. L'horodatage à la seconde près n'est pas modifiÊ, de sorte que toutes les dates et heures de vos fichiers seront prÊservÊes. 5.16 rehash ----------- Planifie un nouveau hachage de toute la baie. Cette commande change le type de hachage utilisÊ, gÊnÊralement lors de la mise à niveau d'un système 32 bits vers un système 64 bits, pour passer de MurmurHash3 au plus rapide SpookyHash. Si vous utilisez dÊjà le hachage optimal, cette commande ne fait rien et vous informe qu'aucune action n'est nÊcessaire. Le nouveau hachage n'est pas effectuÊ immÊdiatement, mais a lieu progressivement pendant `sync` et `scrub`. Vous pouvez vÊrifier l'Êtat du nouveau hachage en utilisant `status`. Pendant le nouveau hachage, SnapRAID conserve toutes ses fonctionnalitÊs, à la seule exception que `dup` ne peut pas dÊtecter les fichiers en double utilisant un hachage diffÊrent. 5.17 locate ----------- Localise les fichiers stockÊs sur les disques de paritÊ. Pour chaque fichier correspondant, il affiche son emplacement dans le fichier de paritÊ et le nombre de fragments qu'il occupe. Vous pouvez utiliser l'option -t, --tail pour restreindre l'opÊration aux fichiers occupant la partie terminale spÊcifiÊe de la paritÊ. Si vous souhaitez rÊallouer ces fichiers, vous pouvez alors utiliser l'option -W, --force-realloc-tail. Sachez que ces fichiers ne seront pas protÊgÊs par la paritÊ pendant le processus de rÊallocation. 6 OPTIONS ========= SnapRAID fournit les options suivantes : -c, --conf CONFIG SÊlectionne le fichier de configuration à utiliser. S'il n'est pas spÊcifiÊ, sous Unix, il utilise le fichier `/usr/local/etc/snapraid.conf` s'il existe, sinon `/etc/snapraid.conf`. Sous Windows, il utilise le fichier `snapraid.conf` dans le mÃĒme rÊpertoire que `snapraid.exe`. -f, --filter MOTIF Filtre les fichiers à traiter dans `check` et `fix`. Seuls les fichiers correspondant au motif spÊcifiÊ sont traitÊs. Cette option peut ÃĒtre utilisÊe plusieurs fois. Voir la section MOTIF pour plus de dÊtails sur les spÊcifications de motifs. Sous Unix, assurez-vous que les caractères de globbing sont entre guillemets s'ils sont utilisÊs. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. Elle ne peut pas ÃĒtre utilisÊe avec `sync` et `scrub`, car ils traitent toujours l'intÊgralitÊ de la baie. -d, --filter-disk NOM Filtre les disques à traiter dans `check`, `fix`, `up` et `down`. Vous devez spÊcifier un nom de disque tel que dÊfini dans le fichier de configuration. Vous pouvez Êgalement spÊcifier des disques de paritÊ avec les noms : `parity`, `2-parity`, `3-parity`, etc., pour limiter les opÊrations à un disque de paritÊ spÊcifique. Si vous combinez plusieurs options --filter, --filter-disk et --filter-missing, seuls les fichiers correspondant à tous les filtres sont sÊlectionnÊs. Cette option peut ÃĒtre utilisÊe plusieurs fois. Cette option ne peut ÃĒtre utilisÊe qu'avec `check`, `fix`, `up` et `down`. Elle ne peut pas ÃĒtre utilisÊe avec `sync` et `scrub`, car ils traitent toujours l'intÊgralitÊ de la baie. -m, --filter-missing Filtre les fichiers à traiter dans `check` et `fix`. Seuls les fichiers manquants ou supprimÊs de la baie sont traitÊs. Lorsqu'elle est utilisÊe avec `fix`, cela agit comme une commande `undelete` (restaurer). Si vous combinez plusieurs options --filter, --filter-disk et --filter-missing, seuls les fichiers correspondant à tous les filtres sont sÊlectionnÊs. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. Elle ne peut pas ÃĒtre utilisÊe avec `sync` et `scrub`, car ils traitent toujours l'intÊgralitÊ de la baie. -e, --filter-error Traite les fichiers avec des erreurs dans `check` et `fix`. Il ne traite que les fichiers qui ont des blocs marquÊs avec des erreurs silencieuses ou d'entrÊe/sortie pendant `sync` et `scrub`, tels que listÊs dans `status`. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. -p, --plan PERC|bad|new|full SÊlectionne le plan de nettoyage. Si PERC est une valeur numÊrique de 0 à 100, elle est interprÊtÊe comme le pourcentage de blocs à nettoyer. Au lieu d'un pourcentage, vous pouvez spÊcifier un plan : `bad` nettoie les mauvais blocs, `new` nettoie les blocs qui n'ont pas encore ÊtÊ nettoyÊs, et `full` nettoie tout. Cette option ne peut ÃĒtre utilisÊe qu'avec `scrub`. -o, --older-than JOURS SÊlectionne la partie la plus ancienne de la baie à traiter dans `scrub`. JOURS est l'Ãĸge minimum en jours pour qu'un bloc soit nettoyÊ ; la valeur par dÊfaut est 10. Les blocs marquÊs comme mauvais sont toujours nettoyÊs, quelle que soit cette option. Cette option ne peut ÃĒtre utilisÊe qu'avec `scrub`. -a, --audit-only Dans `check`, vÊrifie le hachage des fichiers sans vÊrifier les donnÊes de paritÊ. Si vous ÃĒtes intÊressÊ uniquement par la vÊrification des donnÊes des fichiers, cette option peut accÊlÊrer considÊrablement le processus de vÊrification. Cette option ne peut ÃĒtre utilisÊe qu'avec `check`. -h, --pre-hash Dans `sync`, exÊcute une phase de hachage prÊliminaire de toutes les nouvelles donnÊes pour une vÊrification supplÊmentaire avant le calcul de la paritÊ. Habituellement, dans `sync`, aucun hachage prÊliminaire n'est effectuÊ, et les nouvelles donnÊes sont hachÊes juste avant le calcul de la paritÊ lorsqu'elles sont lues pour la première fois. Ce processus se produit lorsque le système est soumis à une lourde charge, avec tous les disques en rotation et un processeur occupÊ. Il s'agit d'une condition extrÃĒme pour la machine, et si elle prÊsente un problème matÊriel latent, des erreurs silencieuses peuvent passer inaperçues car les donnÊes ne sont pas encore hachÊes. Pour Êviter ce risque, vous pouvez activer le mode `pre-hash` pour que toutes les donnÊes soient lues deux fois afin de garantir leur intÊgritÊ. Cette option vÊrifie Êgalement les fichiers dÊplacÊs au sein de la baie pour s'assurer que l'opÊration de dÊplacement a rÊussi et, si nÊcessaire, vous permet d'exÊcuter une opÊration fix avant de continuer. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -i, --import DOSSIER Importe à partir du rÊpertoire spÊcifiÊ tous les fichiers supprimÊs de la baie après le dernier `sync`. Si vous avez toujours de tels fichiers, ils peuvent ÃĒtre utilisÊs par `check` et `fix` pour amÊliorer le processus de rÊcupÊration. Les fichiers sont lus, y compris dans les sous-rÊpertoires, et sont identifiÊs quel que soit leur nom. Cette option ne peut ÃĒtre utilisÊe qu'avec `check` et `fix`. -s, --spin-down-on-error En cas d'erreur, arrÃĒte (spin down) tous les disques gÊrÊs avant de quitter avec un code d'Êtat non nul. Cela empÃĒche les lecteurs de rester actifs et en rotation après une opÊration interrompue, aidant à Êviter une accumulation inutile de chaleur et une consommation d'Ênergie. Utilisez cette option pour vous assurer que les disques sont arrÃĒtÊs en toute sÊcuritÊ mÃĒme lorsqu'une commande Êchoue. -w, --bw-limit DÉBIT Applique une limite de bande passante globale pour tous les disques. Le DÉBIT est le nombre d'octets par seconde. Vous pouvez spÊcifier un multiplicateur tel que K, M ou G (par exemple, --bw-limit 1G). -t, --tail TAILLE Limite la liste des fichiers à ceux n'utilisant pas plus que la taille de queue spÊcifiÊe des disques de paritÊ. Vous pouvez utiliser des multiplicateurs tels que K, M, G ou T (ex: --tail 1G). Cette option n'est valide que lorsqu'elle est utilisÊe avec la commande `locate`. -A, --stats Active une vue d'Êtat Êtendue qui affiche des informations supplÊmentaires. L'Êcran affiche deux graphiques : Le premier graphique montre le nombre de bandes mises en mÊmoire tampon pour chaque disque, ainsi que le chemin d'accès au fichier en cours d'accès sur ce disque. GÊnÊralement, le disque le plus lent n'aura pas de tampon disponible, ce qui dÊtermine la bande passante maximale rÊalisable. Le deuxième graphique montre le pourcentage de temps passÊ en attente au cours des 100 dernières secondes. Le disque le plus lent est censÊ causer la majeure partie du temps d'attente, tandis que les autres disques devraient avoir peu ou pas de temps d'attente car ils peuvent utiliser leurs bandes mises en mÊmoire tampon. Ce graphique montre Êgalement le temps passÊ en attente pour les calculs de hachage et les calculs RAID. Tous les calculs s'exÊcutent en parallèle avec les opÊrations de disque. Par consÊquent, tant qu'il y a un temps d'attente mesurable pour au moins un disque, cela indique que le processeur est suffisamment rapide pour suivre la charge de travail. -Z, --force-zero Force l'opÊration non sÊcurisÊe de synchronisation d'un fichier de taille zÊro qui Êtait auparavant non nul. Si SnapRAID dÊtecte une telle condition, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter facilement quand, après un plantage du système, certains fichiers accÊdÊs ont ÊtÊ tronquÊs. C'est une condition possible sous Linux avec les systèmes de fichiers ext3/ext4. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -E, --force-empty Force l'opÊration non sÊcurisÊe de synchronisation d'un disque avec tous les fichiers originaux manquants. Si SnapRAID dÊtecte que tous les fichiers initialement prÊsents sur le disque sont manquants ou rÊÊcrits, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter facilement lorsqu'un système de fichiers de donnÊes n'est pas montÊ. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -U, --force-uuid Force l'opÊration non sÊcurisÊe de synchronisation, vÊrification et correction avec des disques qui ont changÊ leur UUID. Si SnapRAID dÊtecte que certains disques ont changÊ d'UUID, il arrÃĒte de procÊder à moins que vous ne spÊcifiiez cette option. Cela vous permet de dÊtecter lorsque vos disques sont montÊs aux mauvais points de montage. Il est cependant autorisÊ d'avoir un seul changement d'UUID avec une seule paritÊ, et plus avec une paritÊ multiple, car c'est le cas normal lors du remplacement des disques après une rÊcupÊration. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`, `check` ou `fix`. -D, --force-device Force l'opÊration non sÊcurisÊe de correction avec des disques inaccessibles ou avec des disques sur le mÃĒme pÊriphÊrique physique. Par exemple, si vous avez perdu deux disques de donnÊes et que vous avez un disque de rechange pour ne rÊcupÊrer que le premier, vous pouvez ignorer le deuxième disque inaccessible. Ou, si vous souhaitez rÊcupÊrer un disque dans l'espace libre restant sur un disque dÊjà utilisÊ, partageant le mÃĒme pÊriphÊrique physique. Cette option ne peut ÃĒtre utilisÊe qu'avec `fix`. -N, --force-nocopy Dans `sync`, `check` et `fix`, dÊsactive l'heuristique de dÊtection de copie. Sans cette option, SnapRAID suppose que les fichiers ayant les mÃĒmes attributs, tels que le nom, la taille et l'horodatage, sont des copies avec les mÃĒmes donnÊes. Cela permet d'identifier les fichiers copiÊs ou dÊplacÊs d'un disque à un autre et rÊutilise les informations de hachage dÊjà calculÊes pour dÊtecter les erreurs silencieuses ou pour rÊcupÊrer les fichiers manquants. Dans de rares cas, ce comportement peut entraÃŽner des faux positifs ou un processus lent en raison de nombreuses vÊrifications de hachage, et cette option vous permet de rÊsoudre de tels problèmes. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`, `check` et `fix`. -F, --force-full Dans `sync`, force un recomptage complet de la paritÊ. Cette option peut ÃĒtre utilisÊe lorsque vous ajoutez un nouveau niveau de paritÊ ou si vous ÃĒtes revenu à un ancien fichier de contenu utilisant des donnÊes de paritÊ plus rÊcentes. Au lieu de recrÊer la paritÊ à partir de zÊro, cela vous permet de rÊutiliser les hachages prÊsents dans le fichier de contenu pour valider les donnÊes et maintenir la protection des donnÊes pendant le processus `sync` en utilisant les donnÊes de paritÊ existantes. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. -R, --force-realloc Dans `sync`, force une rÊallocation complète des fichiers et une reconstruction de la paritÊ. Cette option peut ÃĒtre utilisÊe pour rÊallouer complètement tous les fichiers, en supprimant la fragmentation, tout en rÊutilisant les hachages prÊsents dans le fichier de contenu pour valider les donnÊes. Cette option ne peut ÃĒtre utilisÊe qu'avec `sync`. AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas l'utiliser. Vous N'AVEZ AUCUNE protection des donnÊes pendant l'opÊration `sync`. -W, --force-realloc-tail TAILLE Fonctionne comme -R, --force-realloc, maar limitÊ à la partie terminale spÊcifiÊe (les derniers TAILLE octets) de chaque fichier de paritÊ. Force la rÊallocation (dÊplacement) de tout fragment/bloc de fichier actuellement stockÊ dans cette section terminale, leur permettant d'ÃĒtre placÊs n'importe oÚ dans le(s) fichier(s) de paritÊ oÚ de l'espace libre est disponible (y compris les trous existants). Le but principal de cette option est de rÊduire la taille sur disque du fichier de paritÊ. Si la rÊallocation rÊussit à vider toute la section terminale (plus aucun bloc ne l'utilise), le fichier de paritÊ est tronquÊ, rÊcupÊrant l'espace terminal inutilisÊ. Vous pouvez utiliser des multiplicateurs tels que K, M, G ou T (ex: --force-realloc-tail 1G). Vous pouvez utiliser locate -t, --tail pour connaÃŽtre à l'avance les fichiers affectÊs. AVERTISSEMENT ! Cette option est rÊservÊe aux experts et il est fortement recommandÊ de ne pas l'utiliser. Vous n'avez PAS de protection des donnÊes pendant l'opÊration `sync` pour les fichiers affectÊs. -l, --log FICHIER Écrit un journal dÊtaillÊ dans le fichier spÊcifiÊ. Si cette option n'est pas spÊcifiÊe, les erreurs inattendues sont imprimÊes à l'Êcran, ce qui peut entraÃŽner une sortie excessive en cas de nombreuses erreurs. Lorsque -l, --log est spÊcifiÊ, seules les erreurs fatales qui entraÃŽnent l'arrÃĒt de SnapRAID sont imprimÊes à l'Êcran. Si le chemin commence par `>>`, le fichier est ouvert en mode ajout. Les occurrences de `%D` et `%T` dans le nom sont remplacÊes par la date et l'heure au format YYYYMMDD et HHMMSS. Dans les fichiers batch Windows, vous devez doubler le caractère `%`, par exemple, result-%%D.log. Pour utiliser `>>`, vous devez encadrer le nom de guillemets, par exemple, `">>result.log"`. Pour sortir le journal sur la sortie standard ou l'erreur standard, vous pouvez utiliser `">&1"` et `">&2"`, respectivement. Consultez le fichier ou la page de manuel snapraid_log.txt pour les descriptions des balises de journal. -L, --error-limit NOMBRE DÊfinit une nouvelle limite d'erreurs avant d'arrÃĒter l'exÊcution. Par dÊfaut, SnapRAID s'arrÃĒte s'il rencontre plus de 100 erreurs d'entrÊe/sortie, indiquant qu'un disque est probablement en panne. Cette option affecte `sync` et `scrub`, qui sont autorisÊs à continuer après le premier ensemble d'erreurs de disque pour essayer de terminer leurs opÊrations. Cependant, `check` et `fix` s'arrÃĒtent toujours à la première erreur. -S, --start BLKSTART Commence le traitement à partir du numÊro de bloc spÊcifiÊ. Cela peut ÃĒtre utile pour rÊessayer de vÊrifier ou de corriger des blocs spÊcifiques en cas de disque endommagÊ. Cette option est principalement destinÊe à la rÊcupÊration manuelle avancÊe. -B, --count BLKCOUNT Ne traite que le nombre de blocs spÊcifiÊ. Cette option est principalement destinÊe à la rÊcupÊration manuelle avancÊe. -C, --gen-conf CONTENU GÊnère un fichier de configuration factice à partir d'un fichier de contenu existant. Le fichier de configuration est Êcrit sur la sortie standard et n'Êcrase pas un fichier existant. Ce fichier de configuration contient Êgalement les informations nÊcessaires pour reconstruire les points de montage du disque au cas oÚ vous perdriez l'intÊgralitÊ du système. -v, --verbose Affiche plus d'informations à l'Êcran. S'il est spÊcifiÊ une fois, il affiche les fichiers exclus et des statistiques supplÊmentaires. Cette option n'a aucun effet sur les fichiers journaux. -q, --quiet Affiche moins d'informations à l'Êcran. S'il est spÊcifiÊ une fois, il supprime la barre de progression ; deux fois, les opÊrations en cours ; trois fois, les messages d'information ; quatre fois, les messages d'Êtat. Les erreurs fatales sont toujours imprimÊes à l'Êcran. Cette option n'a aucun effet sur les fichiers journaux. -H, --help Affiche un Êcran d'aide court. -V, --version Affiche la version du programme. 7 CONFIGURATION =============== SnapRAID nÊcessite un fichier de configuration pour savoir oÚ se trouve votre baie de disques et oÚ stocker les informations de paritÊ. Sous Unix, il utilise le fichier `/usr/local/etc/snapraid.conf` s'il existe, sinon `/etc/snapraid.conf`. Sous Windows, il utilise le fichier `snapraid.conf` dans le mÃĒme rÊpertoire que `snapraid.exe`. Il doit contenir les options suivantes (sensibles à la casse) : 7.1 parity FICHIER [,FICHIER] ... --------------------------------- DÊfinit les fichiers à utiliser pour stocker les informations de paritÊ. La paritÊ permet une protection contre une seule dÊfaillance de disque, similaire au RAID5. Vous pouvez spÊcifier plusieurs fichiers, qui doivent se trouver sur des disques diffÊrents. Lorsqu'un fichier ne peut plus grandir, le suivant est utilisÊ. L'espace total disponible doit ÃĒtre au moins aussi grand que le plus grand disque de donnÊes de la baie. Vous pouvez ajouter des fichiers de paritÊ supplÊmentaires plus tard, mais vous ne pouvez pas les rÊorganiser ni les supprimer. Garder les disques de paritÊ rÊservÊs à la paritÊ garantit qu'ils ne deviennent pas fragmentÊs, amÊliorant les performances. Sous Windows, 256 Mo sont laissÊs inutilisÊs sur chaque disque pour Êviter l'avertissement concernant les disques pleins. Cette option est obligatoire et ne peut ÃĒtre utilisÊe qu'une seule fois. 7.2 (2,3,4,5,6)-parity FICHIER [,FICHIER] ... --------------------------------------------- DÊfinit les fichiers à utiliser pour stocker les informations de paritÊ supplÊmentaires. Pour chaque niveau de paritÊ spÊcifiÊ, un niveau de protection supplÊmentaire est activÊ : * 2-parity active la double paritÊ RAID6. * 3-parity active la triple paritÊ. * 4-parity active la quadruple (quatre) paritÊ. * 5-parity active la penta (cinq) paritÊ. * 6-parity active l'hexa (six) paritÊ. Chaque niveau de paritÊ nÊcessite la prÊsence de tous les niveaux de paritÊ prÊcÊdents. Les mÃĒmes considÊrations que pour l'option `parity` s'appliquent. Ces options sont facultatives et ne peuvent ÃĒtre utilisÊes qu'une seule fois. 7.3 z-parity FICHIER [,FICHIER] ... ----------------------------------- DÊfinit un fichier et un format alternatifs pour stocker la triple paritÊ. Cette option est une alternative à `3-parity`, principalement destinÊe aux processeurs bas de gamme comme ARM ou AMD Phenom, Athlon et Opteron qui ne prennent pas en charge l'ensemble d'instructions SSSE3. Dans de tels cas, elle offre de meilleures performances. Ce format est similaire mais plus rapide que celui utilisÊ par ZFS RAIDZ3. Comme ZFS, il ne fonctionne pas au-delà de la triple paritÊ. Lors de l'utilisation de `3-parity`, vous serez averti s'il est recommandÊ d'utiliser le format `z-parity` pour une amÊlioration des performances. Il est possible de convertir d'un format à l'autre en ajustant le fichier de configuration avec le fichier z-parity ou 3-parity souhaitÊ et en utilisant `fix` pour le recrÊer. 7.4 content FICHIER ------------------- DÊfinit le fichier à utiliser pour stocker la liste et les sommes de contrôle de tous les fichiers prÊsents dans votre baie de disques. Il peut ÃĒtre placÊ sur un disque utilisÊ pour les donnÊes, la paritÊ, ou tout autre disque disponible. Si vous utilisez un disque de donnÊes, ce fichier est automatiquement exclu du processus `sync`. Cette option est obligatoire et peut ÃĒtre utilisÊe plusieurs fois pour enregistrer plusieurs copies du mÃĒme fichier. Vous devez stocker au moins une copie pour chaque disque de paritÊ utilisÊ plus un. L'utilisation de copies supplÊmentaires ne nuit pas. 7.5 data NOM DOSSIER -------------------- DÊfinit le nom et le point de montage des disques de donnÊes dans la baie. NOM est utilisÊ pour identifier le disque et doit ÃĒtre unique. DOSSIER est le point de montage du disque dans le système de fichiers. Vous pouvez modifier le point de montage au besoin, tant que vous gardez le NOM fixe. Vous devriez utiliser une option pour chaque disque de donnÊes de la baie. Vous pouvez renommer un disque plus tard en changeant le NOM directement dans le fichier de configuration, puis en exÊcutant une commande `sync`. Dans le cas d'un renommage, l'association est faite en utilisant l'UUID stockÊ des disques. 7.6 extra NAME DIR ------------------ DÊfinit le nom et le point de montage de disques supplÊmentaires à surveiller avec les commandes `smart` et `probe`. Ceci est utile pour surveiller des disques qui ne font pas partie de la grappe mais qui sont nÊcessaires au fonctionnement du système, comme le disque de dÊmarrage. Notez que ces disques ne sont pas affectÊs par les commandes `up` et `down` car ils sont censÊs toujours ÃĒtre en rotation. 7.7 nohidden ------------ Exclut tous les fichiers et rÊpertoires cachÊs. Sous Unix, les fichiers cachÊs sont ceux commençant par `.`. Sous Windows, ce sont ceux avec l'attribut cachÊ. 7.8 exclude/include MOTIF ------------------------- DÊfinit les motifs de fichiers ou de rÊpertoires à exclure ou à inclure dans le processus de synchronisation. Tous les motifs sont traitÊs dans l'ordre spÊcifiÊ. Si le premier motif qui correspond est un `exclude` (exclure), le fichier est exclu. S'il s'agit d'un `include` (inclure), le fichier est inclus. Si aucun motif ne correspond, le fichier est exclu si le dernier motif spÊcifiÊ est un `include`, ou inclus si le dernier motif spÊcifiÊ est un `exclude`. Voir la section MOTIF pour plus de dÊtails sur les spÊcifications de motifs. Cette option peut ÃĒtre utilisÊe plusieurs fois. 7.9 blocksize TAILLE_EN_KIBIOCTETS ---------------------------------- DÊfinit la taille de bloc de base en kibioctets pour la paritÊ. Un kibioctet est de 1024 octets. La taille de bloc par dÊfaut est de 256, ce qui devrait fonctionner dans la plupart des cas. AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas modifier cette valeur. Pour modifier cette valeur à l'avenir, vous devrez recrÊer l'intÊgralitÊ de la paritÊ ! Une raison d'utiliser une taille de bloc diffÊrente est si vous avez beaucoup de petits fichiers, de l'ordre de millions. Pour chaque fichier, mÃĒme s'il ne contient que quelques octets, un bloc entier de paritÊ est allouÊ, et avec de nombreux fichiers, cela peut entraÃŽner un espace de paritÊ inutilisÊ important. Lorsque vous remplissez complètement le disque de paritÊ, vous n'ÃĒtes pas autorisÊ à ajouter plus de fichiers aux disques de donnÊes. Cependant, la paritÊ gaspillÊe ne s'accumule pas sur les disques de donnÊes. L'espace gaspillÊ rÊsultant d'un grand nombre de fichiers sur un disque de donnÊes limite uniquement la quantitÊ de donnÊes sur ce disque de donnÊes, pas les autres. À titre d'approximation, vous pouvez supposer que la moitiÊ de la taille de bloc est gaspillÊe pour chaque fichier. Par exemple, avec 100 000 fichiers et une taille de bloc de 256 Kio, vous gaspillerez 12,8 Go de paritÊ, ce qui peut entraÃŽner 12,8 Go d'espace en moins disponible sur le disque de donnÊes. Vous pouvez vÊrifier la quantitÊ d'espace gaspillÊ sur chaque disque en utilisant `status`. C'est la quantitÊ d'espace que vous devez laisser libre sur les disques de donnÊes ou utiliser pour les fichiers non inclus dans la baie. Si cette valeur est nÊgative, cela signifie que vous ÃĒtes près de remplir la paritÊ, et cela reprÊsente l'espace que vous pouvez encore gaspiller. Pour Êviter ce problème, vous pouvez utiliser une partition plus grande pour la paritÊ. Par exemple, si la partition de paritÊ est 12,8 Go plus grande que les disques de donnÊes, vous avez suffisamment d'espace supplÊmentaire pour gÊrer jusqu'à 100 000 fichiers sur chaque disque de donnÊes sans aucun espace gaspillÊ. Une astuce pour obtenir une partition de paritÊ plus grande sous Linux est de la formater avec la commande : mkfs.ext4 -m 0 -T largefile4 DEVICE Cela se traduit par environ 1,5 % d'espace supplÊmentaire, environ 60 Go pour un disque de 4 To, ce qui permet environ 460 000 fichiers sur chaque disque de donnÊes sans aucun espace gaspillÊ. 7.10 hashsize TAILLE_EN_OCTETS ------------------------------ DÊfinit la taille du hachage en octets pour les blocs enregistrÊs. La taille de hachage par dÊfaut est de 16 octets (128 bits), ce qui devrait fonctionner dans la plupart des cas. AVERTISSEMENT ! Cette option est rÊservÊe aux experts, et il est fortement recommandÊ de ne pas modifier cette valeur. Pour modifier cette valeur à l'avenir, vous devrez recrÊer l'intÊgralitÊ de la paritÊ ! Une raison d'utiliser une taille de hachage diffÊrente est si votre système a une mÊmoire limitÊe. En règle gÊnÊrale, SnapRAID nÊcessite gÊnÊralement 1 Gio de RAM pour chaque 16 To de donnÊes dans la baie. Plus prÊcisÊment, pour stocker les hachages des donnÊes, SnapRAID nÊcessite environ TS*(1+HS)/BS octets de RAM, oÚ TS est la taille totale en octets de votre baie de disques, BS est la taille de bloc en octets, et HS est la taille de hachage en octets. Par exemple, avec 8 disques de 4 To, une taille de bloc de 256 Kio (1 Kio = 1024 octets) et une taille de hachage de 16, vous obtenez : RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 Gio En passant à une taille de hachage de 8, vous obtenez : RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 Gio En passant à une taille de bloc de 512, vous obtenez : RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 Gio En passant à la fois à une taille de hachage de 8 et à une taille de bloc de 512, vous obtenez : RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 Gio 7.11 autosave TAILLE_EN_GIGAOCTETS ---------------------------------- Enregistre automatiquement l'Êtat lors de la synchronisation ou du nettoyage après la quantitÊ spÊcifiÊe de Go traitÊs. Cette option est utile pour Êviter de redÊmarrer de longues commandes `sync` à partir de zÊro si elles sont interrompues par un plantage de la machine ou tout autre ÊvÊnement. 7.12 temp_limit TEMPÉRATURE_CELSIUS ----------------------------------- DÊfinit la tempÊrature maximale autorisÊe du disque en Celsius. Lorsqu'elle est spÊcifiÊe, SnapRAID vÊrifie pÊriodiquement la tempÊrature de tous les disques à l'aide de l'outil smartctl. Les tempÊratures actuelles des disques sont affichÊes pendant que SnapRAID fonctionne. Si un disque dÊpasse cette limite, toutes les opÊrations s'arrÃĒtent et les disques sont arrÃĒtÊs (mis en veille) pendant la durÊe dÊfinie par l'option `temp_sleep`. Après la pÊriode de veille, les opÊrations reprennent, pouvant s'arrÃĒter à nouveau si la limite de tempÊrature est de nouveau atteinte. Pendant le fonctionnement, SnapRAID analyse Êgalement la courbe de chauffe de chaque disque et estime la tempÊrature stable à long terme qu'ils sont censÊs atteindre si l'activitÊ continue. L'estimation n'est effectuÊe qu'après que la tempÊrature du disque a augmentÊ quatre fois, garantissant que suffisamment de points de donnÊes sont disponibles pour Êtablir une tendance fiable. Cette tempÊrature stable prÊdite est affichÊe entre parenthèses à côtÊ de la valeur actuelle et aide à Êvaluer si le refroidissement du système est adÊquat. Cette tempÊrature estimÊe est uniquement à titre informatif et n'a aucun effet sur le comportement de SnapRAID. Les actions du programme sont basÊes uniquement sur les tempÊratures rÊelles mesurÊes des disques. Pour effectuer cette analyse, SnapRAID a besoin d'une rÊfÊrence pour la tempÊrature du système. Il tente d'abord de la lire à partir des capteurs matÊriels disponibles. Si aucun capteur système n'est accessible, il utilise la tempÊrature de disque la plus basse mesurÊe au dÊbut de l'exÊcution comme rÊfÊrence de secours. Normalement, SnapRAID n'affiche que la tempÊrature du disque le plus chaud. Pour afficher la tempÊrature de tous les disques, utilisez l'option -A ou --stats. 7.13 temp_sleep TEMPS_EN_MINUTES -------------------------------- DÊfinit le temps de veille, en minutes, lorsque la limite de tempÊrature est atteinte. Pendant cette pÊriode, les disques restent arrÃĒtÊs. La valeur par dÊfaut est de 5 minutes. 7.14 pool DOSSIER ----------------- DÊfinit le rÊpertoire de mise en commun oÚ la vue virtuelle de la baie de disques est crÊÊe à l'aide de la commande `pool`. Le rÊpertoire doit dÊjà exister. 7.15 share CHEMIN_UNC --------------------- DÊfinit le chemin UNC Windows requis pour accÊder aux disques à distance. Si cette option est spÊcifiÊe, les liens symboliques crÊÊs dans le rÊpertoire du pool utilisent ce chemin UNC pour accÊder aux disques. Sans cette option, les liens symboliques gÊnÊrÊs utilisent uniquement des chemins locaux, ce qui ne permet pas de partager le rÊpertoire du pool sur le rÊseau. Les liens symboliques sont formÊs en utilisant le chemin UNC spÊcifiÊ, en ajoutant le nom du disque tel que spÊcifiÊ dans l'option `data`, et en ajoutant enfin le rÊpertoire et le nom du fichier. Cette option est requise uniquement pour Windows. 7.16 smartctl DISQUE/PARITÉ OPTIONS... -------------------------------------- DÊfinit les options smartctl personnalisÊes pour obtenir les attributs SMART de chaque disque. Cela peut ÃĒtre nÊcessaire pour les contrôleurs RAID et certains disques USB qui ne peuvent pas ÃĒtre dÊtectÊs automatiquement. Le placeholder %s est remplacÊ par le nom du pÊriphÊrique, mais il est facultatif pour les pÊriphÊriques fixes comme les contrôleurs RAID. DISQUE est le mÃĒme nom de disque spÊcifiÊ dans l'option `data`. PARITÉ est l'un des noms de paritÊ : `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. Dans les OPTIONS spÊcifiÊes, la chaÃŽne `%s` est remplacÊe par le nom du pÊriphÊrique. Pour les contrôleurs RAID, le pÊriphÊrique est probablement fixe, et vous n'aurez peut-ÃĒtre pas besoin d'utiliser `%s`. Consultez la documentation smartmontools pour les options possibles : https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices Par exemple : smartctl parity -d sat %s 7.17 smartignore DISQUE/PARITÉ ATTR [ATTR...] --------------------------------------------- Ignore l'attribut SMART spÊcifiÊ lors du calcul de la probabilitÊ de dÊfaillance du disque. Cette option est utile si un disque signale des valeurs inhabituelles ou trompeuses pour un attribut particulier. DISQUE est le mÃĒme nom de disque spÊcifiÊ dans l'option `data`. PARITÉ est l'un des noms de paritÊ : `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. La valeur spÊciale * peut ÃĒtre utilisÊe pour ignorer l'attribut sur tous les disques. Par exemple, pour ignorer l'attribut `Current Pending Sector Count` sur tous les disques : smartignore * 197 Pour l'ignorer uniquement sur le premier disque de paritÊ : smartignore parity 197 7.18 Exemples ------------- Un exemple de configuration typique pour Unix est : parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Un exemple de configuration typique pour Windows est : parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 MOTIF (PATTERN) ================= Les motifs offrent un moyen flexible de filtrer les fichiers à inclure ou à exclure. En utilisant des caractères de "globbing", vous pouvez dÊfinir des règles qui correspondent à des noms de fichiers spÊcifiques ou à des structures de rÊpertoires entières sans lister chaque chemin manuellement. Le point d'interrogation `?` correspond à n'importe quel caractère unique, sauf le sÊparateur de rÊpertoire. Cela le rend utile pour faire correspondre des noms de fichiers avec des caractères variables tout en limitant le motif à un seul niveau de rÊpertoire. L'Êtoile simple `*` correspond à n'importe quelle sÊquence de caractères, mais comme le point d'interrogation, elle ne traverse jamais les frontières des rÊpertoires. Elle s'arrÃĒte à la barre oblique, ce qui la rend adaptÊe à la recherche de correspondances au sein d'un seul composant de chemin. Il s'agit du comportement standard des jokers familier du "globbing" shell. La double Êtoile `**` est plus puissante, elle correspond à n'importe quelle sÊquence de caractères, y compris les sÊparateurs de rÊpertoires. Cela permet aux motifs de correspondre sur plusieurs niveaux de rÊpertoires. Lorsque `**` apparaÃŽt directement intÊgrÊ dans un motif, il peut correspondre à zÊro ou plusieurs caractères, y compris les barres obliques entre le texte littÊral environnant. L'utilisation la plus importante de `**` est sous la forme spÊciale `/**/`. Celle-ci correspond à zÊro ou plusieurs niveaux de rÊpertoires complets, ce qui permet de faire correspondre des fichiers à n'importe quelle profondeur dans une arborescence de rÊpertoires sans connaÃŽtre la structure exacte du chemin. Par exemple, le motif `src/**/main.js` correspond à `src/main.js` (saut de zÊro rÊpertoire), `src/ui/main.js` (saut d'un rÊpertoire), et `src/ui/components/main.js` (saut de deux rÊpertoires). Les classes de caractères utilisant des crochets `[]` correspondent à un seul caractère d'un ensemble ou d'une plage spÊcifiÊs. Comme les autres motifs à caractère unique, elles ne correspondent pas aux sÊparateurs de rÊpertoires. Les classes supportent les plages et la nÊgation à l'aide d'un point d'exclamation. La distinction fondamentale à retenir est que `*`, `?` et les classes de caractères respectent tous les limites des rÊpertoires et ne correspondent qu'au sein d'un seul composant de chemin, alors que `**` est le seul motif qui peut correspondre à travers les sÊparateurs de rÊpertoires. Il existe quatre types de motifs diffÊrents : FILE SÊlectionne n'importe quel fichier nommÊ FILE. Ce motif s'applique uniquement aux fichiers, pas aux rÊpertoires. DIR/ SÊlectionne n'importe quel rÊpertoire nommÊ DIR et tout son contenu. Ce motif s'applique uniquement aux rÊpertoires, pas aux fichiers. /PATH/FILE SÊlectionne le chemin exact du fichier spÊcifiÊ. Ce motif s'applique uniquement aux fichiers, pas aux rÊpertoires. /PATH/DIR/ SÊlectionne le chemin exact du rÊpertoire spÊcifiÊ et tout son contenu. Ce motif s'applique uniquement aux rÊpertoires, pas aux fichiers. Lorsque vous spÊcifiez un chemin absolu commençant par /, il est appliquÊ à la racine de la baie, et non à la racine du système de fichiers local. Sous Windows, vous pouvez utiliser la barre oblique inverse \ au lieu de la barre oblique /. Les rÊpertoires système Windows, les jonctions, les points de montage et les autres rÊpertoires spÊciaux Windows sont traitÊs comme des fichiers, ce qui signifie que pour les exclure, vous devez utiliser une règle de fichier, pas une règle de rÊpertoire. Si le nom de fichier contient un caractère `*`, `?`, `[`, ou `]`, vous devez l'Êchapper pour Êviter qu'il ne soit interprÊtÊ comme un caractère de globbing. Sous Unix, le caractère d'Êchappement est `\` ; sous Windows, c'est `^`. Lorsque le motif est sur la ligne de commande, vous devez doubler le caractère d'Êchappement pour Êviter qu'il ne soit interprÊtÊ par le shell de commande. Dans le fichier de configuration, vous pouvez utiliser diffÊrentes stratÊgies pour filtrer les fichiers à traiter. L'approche la plus simple consiste à n'utiliser que des règles `exclude` pour supprimer tous les fichiers et rÊpertoires que vous ne voulez pas traiter. Par exemple : # Exclut tout fichier nommÊ `*.unrecoverable` exclude *.unrecoverable # Exclut le rÊpertoire racine `/lost+found` exclude /lost+found/ # Exclut tout sous-rÊpertoire nommÊ `tmp` exclude tmp/ L'approche opposÊe consiste à ne dÊfinir que les fichiers que vous souhaitez traiter, en n'utilisant que des règles `include`. Par exemple : # Inclut uniquement certains rÊpertoires include /movies/ include /musics/ include /pictures/ L'approche finale consiste à mÊlanger les règles `exclude` et `include`. Dans ce cas, l'ordre des règles est important. Les règles antÊrieures ont prÊsÊance sur les règles ultÊrieures. Pour simplifier, vous pouvez lister toutes les règles `exclude` d'abord, puis toutes les règles `include`. Par exemple : # Exclut tout fichier nommÊ `*.unrecoverable` exclude *.unrecoverable # Exclut tout sous-rÊpertoire nommÊ `tmp` exclude tmp/ # Inclut uniquement certains rÊpertoires include /movies/ include /musics/ include /pictures/ Sur la ligne de commande, en utilisant l'option -f, vous ne pouvez utiliser que des motifs `include`. Par exemple : # VÊrifie uniquement les fichiers .mp3. # Sous Unix, utilisez des guillemets pour Êviter l'expansion # du globbing par le shell. snapraid -f "*.mp3" check Sous Unix, lorsque vous utilisez des caractères de globbing sur la ligne de commande, vous devez les mettre entre guillemets pour empÃĒcher le shell de les dÊvelopper. 9 IGNORER DES FICHIERS (IGNORE FILES) ===================================== En plus des règles globales du fichier de configuration, vous pouvez placer des fichiers `.snapraidignore` dans n'importe quel rÊpertoire de la grappe pour dÊfinir des règles d'exclusion dÊcentralisÊes. Les règles dÊfinies dans `.snapraidignore` sont appliquÊes après les règles du fichier de configuration. Cela signifie qu'elles ont une prioritÊ plus ÊlevÊe et peuvent ÃĒtre utilisÊes pour exclure des fichiers qui Êtaient prÊcÊdemment inclus par la configuration globale. En pratique, si une règle locale correspond, le fichier est exclu quels que soient les paramètres d'inclusion globaux. La logique des motifs dans `.snapraidignore` reflète la configuration globale mais ancre les motifs au rÊpertoire oÚ se trouve le fichier : FILE SÊlectionne n'importe quel fichier nommÊ FILE dans ce rÊpertoire ou en dessous. Cela suit les mÃĒmes règles de globbing que le motif global. DIR/ SÊlectionne n'importe quel rÊpertoire nommÊ DIR et tout son contenu, rÊsidant dans ce rÊpertoire ou en dessous. /PATH/FILE SÊlectionne le fichier exact spÊcifiÊ par rapport à l'emplacement du fichier `.snapraidignore`. /PATH/DIR/ SÊlectionne le rÊpertoire exact spÊcifiÊ et tout son contenu, par rapport à l'emplacement du fichier `.snapraidignore`. Contrairement à la configuration globale, les fichiers `.snapraidignore` ne prennent en charge que les règles d'exclusion ; vous ne pouvez pas utiliser de motifs `include` ou de nÊgation (!). Par exemple, si vous avez un `.snapraidignore` dans `/mnt/disk1/projects/` : # Exclut UNIQUEMENT /mnt/disk1/projects/output.bin /output.bin # Exclut tout rÊpertoire nommÊ `build` dans projects/ build/ # Exclut tout fichier .tmp dans projects/ ou ses sous-dossiers *.tmp 10 CONTENU (CONTENT) ==================== SnapRAID stocke la liste et les sommes de contrôle de vos fichiers dans le fichier de contenu. Il s'agit d'un fichier binaire qui rÊpertorie tous les fichiers prÊsents dans votre baie de disques, ainsi que toutes les sommes de contrôle pour vÊrifier leur intÊgritÊ. Ce fichier est lu et Êcrit par les commandes `sync` et `scrub` et lu par les commandes `fix`, `check` et `status`. 11 PARITÊ (PARITY) ================== SnapRAID stocke les informations de paritÊ de votre baie dans les fichiers de paritÊ. Ce sont des fichiers binaires contenant la paritÊ calculÊe de tous les blocs dÊfinis dans le fichier `content`. Ces fichiers sont lus et Êcrits par les commandes `sync` et `fix` et lus uniquement par les commandes `scrub` et `check`. 12 ENCODAGE =========== SnapRAID sous Unix ignore tout encodage. Il lit et stocke les noms de fichiers avec le mÃĒme encodage utilisÊ par le système de fichiers. Sous Windows, tous les noms lus à partir du système de fichiers sont convertis et traitÊs au format UTF-8. Pour que les noms de fichiers soient imprimÊs correctement, vous devez dÊfinir la console Windows en mode UTF-8 avec la commande `chcp 65001` et utiliser une police TrueType comme `Lucida Console` comme police de console. Cela n'affecte que les noms de fichiers imprimÊs ; si vous redirigez la sortie de la console vers un fichier, le fichier rÊsultant est toujours au format UTF-8. 13 DROITS D'AUTEUR (COPYRIGHT) ============================== Ce fichier est Copyright (C) 2025 Andrea Mazzoleni 14 VOIR AUSSI (SEE ALSO) ======================== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-it.1000066400000000000000000002132411522717156100163240ustar00rootroot00000000000000.TH "Backup SnapRAID per Array di Dischi" 1 .SH NAME snapraid \- Backup SnapRAID per Array di Dischi .SH SINOSSI snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIZIONE SnapRAID è un programma di backup progettato per array di dischi, che memorizza informazioni di parità per il recupero dati in caso di guasto fino a sei dischi. .PP Destinato principalmente a centri multimediali domestici con file grandi e che cambiano raramente, SnapRAID offre diverse funzionalità: .PD 0 .IP \(bu È possibile utilizzare dischi già pieni di file senza la necessità di riformattarli, accedendovi come al solito. .IP \(bu Tutti i dati sono sottoposti ad hashing per garantire l\'integrità dei dati e prevenire la corruzione silente. .IP \(bu Quando il numero di dischi guasti supera il conteggio di parità, la perdita di dati è confinata ai dischi interessati; i dati sugli altri dischi rimangono accessibili. .IP \(bu Se si eliminano accidentalmente dei file su un disco, il recupero è possibile. .IP \(bu I dischi possono avere dimensioni diverse. .IP \(bu È possibile aggiungere dischi in qualsiasi momento. .IP \(bu SnapRAID non blocca i dati; è possibile smettere di usarlo in qualsiasi momento senza riformattare o spostare i dati. .IP \(bu Per accedere a un file, è necessario far girare solo un singolo disco, risparmiando energia e riducendo il rumore. .PD .PP Per maggiori informazioni, si prega di visitare il sito ufficiale SnapRAID: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITAZIONI SnapRAID è un ibrido tra un programma RAID e un programma di backup, che mira a combinare i migliori vantaggi di entrambi. Tuttavia, ha alcune limitazioni che si dovrebbero considerare prima di usarlo. .PP La limitazione principale è che se un disco si guasta e non si è effettuato un sync di recente, potrebbe non essere possibile recuperare completamente. PiÚ specificamente, potrebbe non essere possibile recuperare fino alla dimensione dei file modificati o eliminati dall\'ultima operazione di sync. CiÃ˛ accade anche se i file modificati o eliminati non si trovano sul disco guasto. Questo è il motivo per cui SnapRAID è piÚ adatto per dati che cambiano raramente. .PP D\'altra parte, i file appena aggiunti non impediscono il recupero dei file già esistenti. Si perderanno solo i file aggiunti di recente se si trovano sul disco guasto. .PP Altre limitazioni di SnapRAID sono: .PD 0 .IP \(bu Con SnapRAID, si hanno ancora file system separati per ogni disco. Con RAID, si ottiene un unico grande file system. .IP \(bu SnapRAID non esegue lo striping dei dati. Con RAID, si ottiene un aumento di velocità con lo striping. .IP \(bu SnapRAID non supporta il recupero in tempo reale. Con RAID, non si deve smettere di lavorare quando un disco si guasta. .IP \(bu SnapRAID puÃ˛ recuperare i dati solo da un numero limitato di guasti del disco. Con un backup, è possibile recuperare da un guasto completo dell\'intero array di dischi. .IP \(bu Vengono salvati solo nomi di file, timestamp, symlink e hardlink. Permessi, proprietà e attributi estesi non vengono salvati. .PD .SH INIZIARE Per usare SnapRAID, è necessario prima selezionare un disco nell\'array di dischi da dedicare alle informazioni di \`parity\` (parità). Con un disco per la parità, si sarà in grado di recuperare da un singolo guasto del disco, in modo simile a RAID5. .PP Se si desidera recuperare da piÚ guasti del disco, in modo simile a RAID6, è necessario riservare dischi aggiuntivi per la parità. Ogni disco di parità aggiuntivo consente il recupero da un guasto in piÚ del disco. .PP Come dischi di parità, è necessario scegliere i dischi piÚ grandi dell\'array, poichÊ le informazioni di parità possono crescere fino alle dimensioni del piÚ grande disco dati nell\'array. .PP Questi dischi saranno dedicati alla memorizzazione dei file di \`parity\`. Non si dovrebbero memorizzare i propri dati su di essi. .PP Quindi, è necessario definire i dischi \`data\` (dati) che si desidera proteggere con SnapRAID. La protezione è piÚ efficace se questi dischi contengono dati che cambiano raramente. Per questo motivo, è meglio NON includere il disco C:\\ di Windows o le directory Unix /home, /var, e /tmp. .PP L\'elenco dei file viene salvato nei file \`content\` (contenuto), di solito memorizzati sui dischi dati, di parità o di avvio. Questo file contiene i dettagli del backup, inclusi tutti i checksum per verificarne l\'integrità. Il file \`content\` viene memorizzato in piÚ copie e ogni copia deve essere su un disco diverso per garantire che, anche in caso di guasti multipli del disco, sia disponibile almeno una copia. .PP Ad esempio, supponiamo di essere interessati a un solo livello di protezione con parità e che i dischi si trovino in: .PP .RS 4 /mnt/diskp <\- disco selezionato per la parità .PD 0 .PP .PD /mnt/disk1 <\- primo disco da proteggere .PD 0 .PP .PD /mnt/disk2 <\- secondo disco da proteggere .PD 0 .PP .PD /mnt/disk3 <\- terzo disco da proteggere .PD 0 .PD .RE .PP È necessario creare il file di configurazione /etc/snapraid.conf con le seguenti opzioni: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Se si è su Windows, si dovrebbe usare il formato del percorso di Windows, con lettere di unità e backslash invece di slash. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Se si hanno molti dischi e si esauriscono le lettere di unità, è possibile montare i dischi direttamente nelle sottocartelle. Vedi: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP A questo punto, si è pronti per eseguire il comando \`sync\` per costruire le informazioni di parità. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Questo processo puÃ˛ richiedere diverse ore la prima volta, a seconda delle dimensioni dei dati già presenti sui dischi. Se i dischi sono vuoti, il processo è immediato. .PP È possibile interromperlo in qualsiasi momento premendo Ctrl+C e, alla prossima esecuzione, riprenderà da dove è stato interrotto. .PP Quando questo comando è completato, i dati sono SICURI. .PP Ora è possibile iniziare a usare l\'array come si desidera e aggiornare periodicamente le informazioni di parità eseguendo il comando \`sync\`. .SS Scrubbing Per controllare periodicamente i dati e la parità per gli errori, è possibile eseguire il comando \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Questo comando confronta i dati nell\'array con l\'hash calcolato durante il comando \`sync\` per verificarne l\'integrità. .PP Ogni esecuzione del comando controlla circa l\'8% dell\'array, escludendo i dati già sottoposti a scrub nei 10 giorni precedenti. È possibile utilizzare l\'opzione \-p, \-\-plan per specificare un importo diverso e l\'opzione \-o, \-\-older\-than per specificare un\'età diversa in giorni. Ad esempio, per controllare il 5% dell\'array per blocchi piÚ vecchi di 20 giorni, usare: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Se vengono trovati errori silenti o di input/output durante il processo, i blocchi corrispondenti vengono contrassegnati come bad (cattivi) nel file \`content\` ed elencati nel comando \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Per correggerli, è possibile utilizzare il comando \`fix\`, filtrando i blocchi bad con l\'opzione \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP Al prossimo \`scrub\`, gli errori scompariranno dal report \`status\` se sono stati veramente corretti. Per renderlo piÚ veloce, è possibile utilizzare \-p bad per eseguire lo scrub solo dei blocchi contrassegnati come bad. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP L\'esecuzione di \`scrub\` su un array non sincronizzato puÃ˛ riportare errori causati da file rimossi o modificati. Questi errori sono riportati nell\'output di \`scrub\`, ma i blocchi correlati non sono contrassegnati come bad. .SS Pooling Nota: La funzionalità di pooling descritta di seguito è stata sostituita dallo strumento mergerfs, che è ora l\'opzione consigliata per gli utenti Linux nella comunità SnapRAID. Mergefs fornisce un modo piÚ flessibile ed efficiente per raggruppare piÚ unità in un singolo punto di montaggio unificato, consentendo un accesso trasparente ai file attraverso l\'array senza fare affidamento sui collegamenti simbolici. Si integra bene con SnapRAID per la protezione della parità ed è comunemente usato in configurazioni come OpenMediaVault (OMV) o NAS personalizzati. .PP Per avere tutti i file nell\'array mostrati nello stesso albero di directory, è possibile abilitare la funzionalità di \`pooling\`. Crea una vista virtuale di sola lettura di tutti i file nell\'array utilizzando collegamenti simbolici. .PP È possibile configurare la directory di \`pooling\` nel file di configurazione con: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP o, se si è su Windows, con: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP e quindi eseguire il comando \`pool\` per creare o aggiornare la vista virtuale. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Se si sta utilizzando una piattaforma Unix e si desidera condividere questa directory sulla rete con macchine Windows o Unix, è necessario aggiungere le seguenti opzioni al file /etc/samba/smb.conf: .PP .RS 4 # Nella sezione globale di smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # Nella sezione di condivisione di smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP In Windows, la condivisione di collegamenti simbolici su una rete richiede che i client li risolvano da remoto. Per abilitare questo, oltre a condividere la directory pool, è necessario condividere anche tutti i dischi in modo indipendente, utilizzando i nomi dei dischi definiti nel file di configurazione come punti di condivisione. È inoltre necessario specificare nell\'opzione \`share\` del file di configurazione il percorso UNC di Windows che i client remoti devono utilizzare per accedere a questi dischi condivisi. .PP Ad esempio, operando da un server chiamato \`darkstar\`, è possibile utilizzare le opzioni: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP e condividere le seguenti directory sulla rete: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP per consentire ai client remoti di accedere a tutti i file in \\\\darkstar\\pool. .PP Potrebbe anche essere necessario configurare i client remoti per abilitare l\'accesso ai symlink remoti con il comando: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Annullamento Eliminazione SnapRAID funziona piÚ come un programma di backup che come un sistema RAID e puÃ˛ essere utilizzato per ripristinare o annullare l\'eliminazione dei file al loro stato precedente utilizzando l\'opzione \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP o per una directory: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP È anche possibile usarlo per recuperare solo i file eliminati accidentalmente all\'interno di una directory utilizzando l\'opzione \-m, \-\-filter\-missing, che ripristina solo i file mancanti, lasciando tutti gli altri intatti. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP O per recuperare tutti i file eliminati su tutte le unità con: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recupero È successo il peggio e si è perso uno o piÚ dischi! .PP NON FARSI PRENDERE DAL PANICO! Sarà possibile recuperarli! .PP La prima cosa da fare è evitare ulteriori modifiche all\'array di dischi. Disabilitare qualsiasi connessione remota ad esso e qualsiasi processo pianificato, incluso qualsiasi sync o scrub notturno pianificato di SnapRAID. .PP Quindi procedere con i seguenti passaggi. .SS PASSO 1 \-> Riconfigurazione È necessario un po\' di spazio per recuperare, idealmente su dischi di riserva aggiuntivi, ma un disco USB esterno o un disco remoto saranno sufficienti. .PP Modificare il file di configurazione SnapRAID per far puntare l\'opzione \`data\` o \`parity\` del disco guasto a una posizione con spazio vuoto sufficiente per recuperare i file. .PP Ad esempio, se il disco \`d1\` è guasto, cambiare da: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP a: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Se il disco da recuperare è un disco di parità, aggiornare l\'opzione \`parity\` appropriata. Se si hanno piÚ dischi guasti, aggiornare tutte le loro opzioni di configurazione. .SS PASSO 2 \-> Correzione (Fix) Eseguire il comando fix, memorizzando il log in un file esterno con: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP Dove NAME è il nome del disco, come \`d1\` nel nostro esempio precedente. Se il disco da recuperare è un disco di parità, usare i nomi \`parity\`, \`2\-parity\`, ecc. Se si hanno piÚ dischi guasti, usare piÚ opzioni \-d per specificarli tutti. .PP Questo comando richiederà molto tempo. .PP Assicurarsi di avere alcuni gigabyte liberi per memorizzare il file fix.log. Eseguirlo da un disco con spazio libero sufficiente. .PP Ora si è recuperato tutto ciÃ˛ che è recuperabile. Se alcuni file sono parzialmente o totalmente irrecuperabili, verranno rinominati aggiungendo l\'estensione \`.unrecoverable\`. .PP È possibile trovare un elenco dettagliato di tutti i blocchi irrecuperabili nel file fix.log controllando tutte le righe che iniziano con \`unrecoverable:\`. .PP Se non si è soddisfatti del recupero, è possibile riprovare tutte le volte che si desidera. .PP Ad esempio, se si sono rimossi file dall\'array dopo l\'ultimo \`sync\`, questo puÃ˛ comportare che alcuni file non vengano recuperati. In questo caso, è possibile riprovare il \`fix\` usando l\'opzione \-i, \-\-import, specificando dove si trovano ora questi file per includerli di nuovo nel processo di recupero. .PP Se si è soddisfatti del recupero, è possibile procedere oltre, ma notare che dopo la sincronizzazione, non è piÚ possibile riprovare il comando \`fix\`! .SS PASSO 3 \-> Controllo (Check) Come controllo cauto, è ora possibile eseguire un comando \`check\` per assicurarsi che tutto sia corretto sul disco recuperato. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP Dove NAME è il nome del disco, come \`d1\` nel nostro esempio precedente. .PP Le opzioni \-d e \-a dicono a SnapRAID di controllare solo il disco specificato e di ignorare tutti i dati di parità. .PP Questo comando richiederà molto tempo, ma se non si è eccessivamente cauti, è possibile saltarlo. .SS PASSO 4 \-> Sincronizzazione (Sync) Eseguire il comando \`sync\` per risincronizzare l\'array con il nuovo disco. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Se tutto è recuperato, questo comando è immediato. .SH COMANDI SnapRAID fornisce alcuni semplici comandi che consentono di: .PD 0 .IP \(bu Stampare lo stato dell\'array \-> \`status\` .IP \(bu Controllare i dischi \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Effettuare un backup/snapshot \-> \`sync\` .IP \(bu Controllare periodicamente i dati \-> \`scrub\` .IP \(bu Ripristinare l\'ultimo backup/snapshot \-> \`fix\`. .PD .PP I comandi devono essere scritti in minuscolo. .SS status Stampa un riepilogo dello stato dell\'array di dischi. .PP Include informazioni sulla frammentazione della parità, quanto sono vecchi i blocchi senza essere controllati e tutti gli errori silenti registrati incontrati durante lo scrubbing. .PP Le informazioni presentate si riferiscono all\'ultima volta che si è eseguito \`sync\`. Le modifiche successive non vengono prese in considerazione. .PP Se sono stati rilevati blocchi bad, vengono elencati i loro numeri di blocco. Per correggerli, è possibile utilizzare il comando \`fix \-e\`. .PP Mostra anche un grafico che rappresenta l\'ultima volta che ogni blocco è stato sottoposto a scrub o sincronizzato. I blocchi sottoposti a scrub sono mostrati con \`*\`, i blocchi sincronizzati ma non ancora sottoposti a scrub con \`o\`. .PP Nulla viene modificato. .SS smart Stampa un report SMART di tutti i dischi nel sistema. .PP Include una stima della probabilità di guasto nel prossimo anno, consentendo di pianificare sostituzioni di manutenzione di dischi che mostrano attributi sospetti. .PP Questa stima della probabilità è ottenuta correlando gli attributi SMART dei dischi con i dati Backblaze disponibili all\'indirizzo: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Se SMART segnala che un disco sta per guastarsi, viene stampato \`FAIL\` o \`PREFAIL\` per quel disco e SnapRAID restituisce un errore. In questo caso, si raccomanda vivamente la sostituzione immediata del disco. .PP Altre possibili stringhe di stato sono: .RS 4 .PD 0 .HP 4 .I logfail In passato, alcuni attributi erano inferiori alla soglia. .HP 4 .I logerr Il log degli errori del dispositivo contiene errori. .HP 4 .I selferr Il log dell\'autotest del dispositivo contiene errori. .PD .RE .PP Se viene specificata l\'opzione \-v, \-\-verbose, viene fornita un\'analisi statistica piÚ approfondita. Questa analisi puÃ˛ aiutare a decidere se è necessaria piÚ o meno parità. .PP Questo comando utilizza lo strumento \`smartctl\` ed è equivalente all\'esecuzione di \`smartctl \-a\` su tutti i dispositivi. .PP Se i dispositivi non vengono rilevati automaticamente correttamente, è possibile specificare un comando personalizzato utilizzando l\'opzione \`smartctl\` nel file di configurazione. .PP Nulla viene modificato. .SS probe Stampa lo stato POWER di tutti i dischi nel sistema. .PP \`Standby\` significa che il disco non sta girando. \`Active\` significa che il disco sta girando. .PP Questo comando utilizza lo strumento \`smartctl\` ed è equivalente all\'esecuzione di \`smartctl \-n standby \-i\` su tutti i dispositivi. .PP Se i dispositivi non vengono rilevati automaticamente correttamente, è possibile specificare un comando personalizzato utilizzando l\'opzione \`smartctl\` nel file di configurazione. .PP Nulla viene modificato. .SS up Fa girare tutti i dischi dell\'array. .PP È possibile far girare solo dischi specifici utilizzando l\'opzione \-d, \-\-filter\-disk. .PP Far girare tutti i dischi contemporaneamente richiede molta energia. Assicurarsi che l\'alimentatore possa sostenerlo. .PP Nulla viene modificato. .SS down Ferma tutti i dischi dell\'array. .PP Questo comando utilizza lo strumento \`smartctl\` ed è equivalente all\'esecuzione di \`smartctl \-s standby,now\` su tutti i dispositivi. .PP È possibile fermare solo dischi specifici utilizzando l\'opzione \-d, \-\-filter\-disk. .PP Per fermare automaticamente in caso di errore, è possibile utilizzare l\'opzione \-s, \-\-spin\-down\-on\-error con qualsiasi altro comando, che è equivalente all\'esecuzione manuale di \`down\` quando si verifica un errore. .PP Nulla viene modificato. .SS diff Elenca tutti i file modificati dall\'ultimo \`sync\` che devono avere i loro dati di parità ricalcolati. .PP Questo comando non controlla i dati del file, ma solo il timestamp del file, le dimensioni e l\'inode. .PP Dopo aver elencato tutti i file modificati, viene presentato un riepilogo delle modifiche, raggruppate per: .RS 4 .PD 0 .HP 4 .I equal File invariati rispetto a prima. .HP 4 .I added File aggiunti che non erano presenti prima. .HP 4 .I removed File rimossi. .HP 4 .I updated File con dimensioni o timestamp diversi, il che significa che sono stati modificati. .HP 4 .I moved File spostati in una directory diversa sullo stesso disco. Sono identificati dall\'avere lo stesso nome, dimensioni, timestamp e inode, ma una directory diversa. .HP 4 .I copied File copiati sullo stesso disco o su un disco diverso dove il file originale esiste ancora. Sono identificati dall\'avere lo stesso nome, dimensione e timestamp. Se il timestamp al sottomultiplo del secondo è zero, il percorso completo deve corrispondere per essere identificato, non solo il nome. .HP 4 .I relocated File spostati sullo stesso disco o su un disco diverso dove l\'originale è scomparso. Sono identificati dall\' avere lo stesso nome, dimensione e timestamp. Se il timestamp al sottomultiplo del secondo è zero, il percorso completo deve corrispondere per essere identificato. A differenza dei file \`moved\` sullo stesso disco, i file ricollocati hanno un inode diverso. .HP 4 .I restored File con un inode diverso ma directory, nome, dimensione e timestamp corrispondenti. Questi sono solitamente file ripristinati dopo essere stati eliminati. .PD .RE .PP Se è richiesto un \`sync\`, il codice di ritorno del processo è 2, invece del predefinito 0. Il codice di ritorno 1 è utilizzato per una condizione di errore generica. .PP Nulla viene modificato. .SS sync Aggiorna le informazioni di parità. Tutti i file modificati nell\'array di dischi vengono letti e i dati di parità corrispondenti vengono aggiornati. .PP È possibile interrompere questo processo in qualsiasi momento premendo Ctrl+C, senza perdere il lavoro già svolto. Alla prossima esecuzione, il processo \`sync\` riprenderà da dove è stato interrotto. .PP Se vengono trovati errori silenti o di input/output durante il processo, i blocchi corrispondenti vengono contrassegnati come bad. .PP I file sono identificati dal percorso e/o dall\'inode e controllati per dimensione e timestamp. Se la dimensione o il timestamp del file differiscono, i dati di parità vengono ricalcolati per l\'intero file. Se il file viene spostato o rinominato sullo stesso disco, mantenendo lo stesso inode, la parità non viene ricalcolata. Se il file viene spostato su un altro disco, la parità viene ricalcolata, ma le informazioni di hash precedentemente calcolate vengono mantenute. .PP I file \`content\` e \`parity\` vengono modificati se necessario. I file nell\'array NON vengono modificati. .SS scrub Esegue lo scrub dell\'array, controllando la presenza di errori silenti o di input/output nei dischi dati e di parità. .PP Ogni invocazione controlla circa l\'8% dell\'array, escludendo i dati già sottoposti a scrub negli ultimi 10 giorni. CiÃ˛ significa che eseguire lo scrubbing una volta alla settimana garantisce che ogni bit di dati venga controllato almeno una volta ogni tre mesi. .PP È possibile definire un piano o una quantità di scrub diversa utilizzando l\'opzione \-p, \-\-plan, che accetta: bad \- Esegue lo scrub dei blocchi contrassegnati come bad. new \- Esegue lo scrub dei blocchi appena sincronizzati non ancora .PP .RS 4 sottoposti a scrub. .RE .RS 0 .PD 0 .HP 4 .I full Esegue lo scrub di tutto. .HP 4 .I 0\-100 Esegue lo scrub della percentuale specificata di blocchi. .PD .RE .PP Se si specifica una quantità percentuale, è anche possibile utilizzare l\'opzione \-o, \-\-older\-than per definire quanto deve essere vecchio il blocco. I blocchi piÚ vecchi vengono sottoposti a scrub per primi, garantendo un controllo ottimale. Se si desidera eseguire lo scrub solo dei blocchi appena sincronizzati non ancora sottoposti a scrub, utilizzare l\'opzione \`\-p new\`. .PP Per ottenere i dettagli dello stato dello scrub, utilizzare il comando \`status\`. .PP Per qualsiasi errore silente o di input/output trovato, i blocchi corrispondenti vengono contrassegnati come bad nel file \`content\`. Questi blocchi bad sono elencati in \`status\` e possono essere corretti con \`fix \-e\`. Dopo la correzione, al prossimo scrub, verranno ricontrollati e, se trovati corretti, il contrassegno bad verrà rimosso. Per eseguire lo scrub solo dei blocchi bad, è possibile utilizzare il comando \`scrub \-p bad\`. .PP Si consiglia di eseguire \`scrub\` solo su un array sincronizzato per evitare errori segnalati causati da dati non sincronizzati. Questi errori sono riconosciuti come non essendo errori silenti e i blocchi non vengono contrassegnati come bad, ma tali errori sono riportati nell\'output del comando. .PP Il file \`content\` viene modificato per aggiornare l\'ora dell\'ultimo controllo per ogni blocco e per contrassegnare i blocchi bad. I file \`parity\` NON vengono modificati. I file nell\'array NON vengono modificati. .SS fix Corregge tutti i file e i dati di parità. .PP Tutti i file e i dati di parità vengono confrontati con lo stato snapshot salvato nell\'ultimo \`sync\`. Se viene trovata una differenza, viene ripristinata allo snapshot memorizzato. .PP ATTENZIONE! Il comando \`fix\` non differenzia tra errori e modifiche intenzionali. Ripristina incondizionatamente lo stato del file all\'ultimo \`sync\`. .PP Se non viene specificata nessun\'altra opzione, l\'intero array viene elaborato. Utilizzare le opzioni di filtro per selezionare un sottoinsieme di file o dischi su cui operare. .PP Per correggere solo i blocchi contrassegnati come bad durante \`sync\` e \`scrub\`, utilizzare l\'opzione \-e, \-\-filter\-error. A differenza di altre opzioni di filtro, questa applica correzioni solo ai file che sono invariati dall\'ultimo \`sync\`. .PP SnapRAID rinomina tutti i file che non possono essere corretti aggiungendo l\'estensione \`.unrecoverable\`. .PP Prima di correggere, l\'intero array viene scansionato per trovare eventuali file spostati dall\'ultima operazione di \`sync\`. Questi file sono identificati dal loro timestamp, ignorando il loro nome e la directory, e vengono utilizzati nel processo di recupero se necessario. Se alcuni di essi sono stati spostati al di fuori dell\'array, è possibile utilizzare l\'opzione \-i, \-\-import per specificare directory aggiuntive da scansionare. .PP I file sono identificati solo dal percorso, non dall\'inode. .PP Il file \`content\` NON viene modificato. I file \`parity\` vengono modificati se necessario. I file nell\'array vengono modificati se necessario. .SS check Verifica tutti i file e i dati di parità. .PP Funziona come \`fix\`, ma simula solo un recupero e nessuna modifica viene scritta nell\'array. .PP Questo comando è destinato principalmente alla verifica manuale, ad esempio dopo un processo di recupero o in altre condizioni speciali. Per i controlli periodici e pianificati, utilizzare \`scrub\`. .PP Se si utilizza l\'opzione \-a, \-\-audit\-only, viene controllato solo l\'hash dei file e i dati di parità vengono ignorati per un\'esecuzione piÚ veloce. .PP I file sono identificati solo dal percorso, non dall\'inode. .PP Nulla viene modificato. .SS list Elenca tutti i file contenuti nell\'array al momento dell\'ultimo \`sync\`. .PP Con \-v o \-\-verbose, viene mostrato anche il tempo sotto il secondo. .PP Nulla viene modificato. .SS dup Elenca tutti i file duplicati. Due file sono considerati uguali se i loro hash corrispondono. I dati del file non vengono letti; vengono utilizzati solo gli hash precalcolati. .PP Nulla viene modificato. .SS pool Crea o aggiorna una vista virtuale di tutti i file nell\'array di dischi nella directory di \`pooling\`. .PP I file non vengono copiati ma collegati utilizzando collegamenti simbolici. .PP Durante l\'aggiornamento, tutti i collegamenti simbolici esistenti e le sottodirectory vuote vengono eliminati e sostituiti con la nuova vista dell\'array. Qualsiasi altro file regolare viene lasciato al suo posto. .PP Nulla viene modificato al di fuori della directory pool. .SS devices Stampa i dispositivi di basso livello utilizzati dall\'array. .PP Questo comando visualizza le associazioni dei dispositivi nell\'array ed è principalmente destinato come interfaccia script. .PP Le prime due colonne sono l\'ID e il percorso del dispositivo di basso livello. Le due colonne successive sono l\'ID e il percorso del dispositivo di alto livello. L\'ultima colonna è il nome del disco nell\'array. .PP Nella maggior parte dei casi, si ha un dispositivo di basso livello per ogni disco nell\'array, ma in alcune configurazioni piÚ complesse, si potrebbe avere piÚ dispositivi di basso livello utilizzati da un singolo disco nell\'array. .PP Nulla viene modificato. .SS touch Imposta un timestamp arbitrario sotto il secondo per tutti i file che lo hanno impostato a zero. .PP Questo migliora la capacità di SnapRAID di riconoscere i file spostati e copiati, poichÊ rende il timestamp quasi unico, riducendo possibili duplicati. .PP PiÚ specificamente, se il timestamp sotto il secondo non è zero, un file spostato o copiato viene identificato come tale se corrisponde al nome, alle dimensioni e al timestamp. Se il timestamp sotto il secondo è zero, è considerato una copia solo se il percorso completo, le dimensioni e il timestamp corrispondono tutti. .PP Il timestamp di precisione al secondo non viene modificato, quindi tutte le date e gli orari dei file saranno conservati. .SS rehash Pianifica un rehash dell\'intero array. .PP Questo comando cambia il tipo di hash utilizzato, in genere quando si esegue l\'aggiornamento da un sistema a 32 bit a uno a 64 bit, per passare da MurmurHash3 al piÚ veloce SpookyHash. .PP Se si sta già utilizzando l\'hash ottimale, questo comando non fa nulla e informa che non è necessaria alcuna azione. .PP Il rehash non viene eseguito immediatamente ma avviene progressivamente durante \`sync\` e \`scrub\`. .PP È possibile controllare lo stato del rehash utilizzando \`status\`. .PP Durante il rehash, SnapRAID mantiene la piena funzionalità, con l\'unica eccezione che \`dup\` non è in grado di rilevare file duplicati utilizzando un hash diverso. .SS locate Individua i file memorizzati nei dischi di parità. Per ogni file corrispondente, stampa la sua posizione all\'interno del file di parità e il numero di frammenti che occupa. .PP È possibile utilizzare l\'opzione \-t, \-\-tail per limitare l\'operazione ai file che occupano la porzione di coda specificata della parità. Se si desidera riallocare questi file, è possibile utilizzare l\'opzione \-W, \-\-force\-realloc\-tail. .PP Si tenga presente che tali file non saranno protetti dalla parità durante il processo di riallocazione. .SH OPZIONI SnapRAID fornisce le seguenti opzioni: .TP .B \-c, \-\-conf CONFIG Seleziona il file di configurazione da utilizzare. Se non specificato, in Unix utilizza il file \`/usr/local/etc/snapraid.conf\` se esiste, altrimenti \`/etc/snapraid.conf\`. In Windows, utilizza il file \`snapraid.conf\` nella stessa directory di \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Filtra i file da elaborare in \`check\` e \`fix\`. Vengono elaborati solo i file che corrispondono al modello specificato. Questa opzione puÃ˛ essere utilizzata piÚ volte. Vedere la sezione PATTERN per maggiori dettagli sulle specifiche del modello. In Unix, assicurarsi che i caratteri di globbing siano citati se usati. Questa opzione puÃ˛ essere utilizzata solo con \`check\` e \`fix\`. Non puÃ˛ essere utilizzata con \`sync\` e \`scrub\`, poichÊ elaborano sempre l\'intero array. .TP .B \-d, \-\-filter\-disk NAME Filtra i dischi da elaborare in \`check\`, \`fix\`, \`up\` e \`down\`. È necessario specificare un nome di disco come definito nel file di configurazione. È anche possibile specificare i dischi di parità con i nomi: \`parity\`, \`2\-parity\`, \`3\-parity\`, ecc., per limitare le operazioni a un disco di parità specifico. Se si combinano piÚ opzioni \-\-filter, \-\-filter\-disk e \-\-filter\-missing, vengono selezionati solo i file che corrispondono a tutti i filtri. Questa opzione puÃ˛ essere utilizzata piÚ volte. Questa opzione puÃ˛ essere utilizzata solo con \`check\`, \`fix\`, \`up\` e \`down\`. Non puÃ˛ essere utilizzata con \`sync\` e \`scrub\`, poichÊ elaborano sempre l\'intero array. .TP .B \-m, \-\-filter\-missing Filtra i file da elaborare in \`check\` e \`fix\`. Vengono elaborati solo i file mancanti o eliminati dall\'array. Quando usato con \`fix\`, questo agisce come un comando di \`undelete\` (annullamento eliminazione). Se si combinano piÚ opzioni \-\-filter, \-\-filter\-disk e \-\-filter\-missing, vengono selezionati solo i file che corrispondono a tutti i filtri. Questa opzione puÃ˛ essere utilizzata solo con \`check\` e \`fix\`. Non puÃ˛ essere utilizzata con \`sync\` e \`scrub\`, poichÊ elaborano sempre l\'intero array. .TP .B \-e, \-\-filter\-error Elabora i file con errori in \`check\` e \`fix\`. Elabora solo i file che hanno blocchi contrassegnati con errori silenti o di input/output durante \`sync\` e \`scrub\`, come elencato in \`status\`. Questa opzione puÃ˛ essere utilizzata solo con \`check\` e \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Seleziona il piano di scrub. Se PERC è un valore numerico da 0 a 100, viene interpretato come la percentuale di blocchi da sottoporre a scrub. Invece di una percentuale, è possibile specificare un piano: \`bad\` esegue lo scrub dei blocchi bad, \`new\` esegue lo scrub dei blocchi non ancora sottoposti a scrub, e \`full\` esegue lo scrub di tutto. Questa opzione puÃ˛ essere utilizzata solo con \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Seleziona la parte piÚ vecchia dell\'array da elaborare in \`scrub\`. DAYS è l\'età minima in giorni per un blocco da sottoporre a scrub; il valore predefinito è 10. I blocchi contrassegnati come bad vengono sempre sottoposti a scrub indipendentemente da questa opzione. Questa opzione puÃ˛ essere utilizzata solo con \`scrub\`. .TP .B \-a, \-\-audit\-only In \`check\`, verifica l\'hash dei file senza controllare i dati di parità. Se si è interessati solo al controllo dei dati del file, questa opzione puÃ˛ velocizzare significativamente il processo di controllo. Questa opzione puÃ˛ essere utilizzata solo con \`check\`. .TP .B \-h, \-\-pre\-hash In \`sync\`, esegue una fase preliminare di hashing di tutti i nuovi dati per una verifica aggiuntiva prima del calcolo della parità. Di solito, in \`sync\`, non viene eseguito alcun hashing preliminare e i nuovi dati vengono sottoposti a hash subito prima del calcolo della parità quando vengono letti per la prima volta. Questo processo si verifica quando il sistema è sotto carico pesante, con tutti i dischi che girano e una CPU occupata. Questa è una condizione estrema per la macchina e, se presenta un problema hardware latente, gli errori silenti potrebbero non essere rilevati perchÊ i dati non sono ancora stati sottoposti a hash. Per evitare questo rischio, è possibile abilitare la modalità \`pre\-hash\` per far leggere tutti i dati due volte per garantirne l\'integrità. Questa opzione verifica anche i file spostati all\'interno dell\'array per garantire che l\'operazione di spostamento sia andata a buon fine e, se necessario, consente di eseguire un\'operazione di fix prima di procedere. Questa opzione puÃ˛ essere utilizzata solo con \`sync\`. .TP .B \-i, \-\-import DIR Importa dalla directory specificata tutti i file eliminati dall\'array dopo l\'ultimo \`sync\`. Se si hanno ancora tali file, possono essere utilizzati da \`check\` e \`fix\` per migliorare il processo di recupero. I file vengono letti, anche nelle sottodirectory, e sono identificati indipendentemente dal loro nome. Questa opzione puÃ˛ essere utilizzata solo con \`check\` e \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error In caso di errore, ferma (spin down) tutti i dischi gestiti prima di uscire con un codice di stato non zero. CiÃ˛ impedisce alle unità di rimanere attive e in rotazione dopo un\'operazione interrotta, contribuendo a evitare inutili accumuli di calore e consumo di energia. Utilizzare questa opzione per garantire che i dischi siano arrestati in modo sicuro anche in caso di errore di un comando. .TP .B \-w, \-\-bw\-limit RATE Applica un limite di larghezza di banda globale per tutti i dischi. RATE è il numero di byte al secondo. È possibile specificare un moltiplicatore come K, M, G o T (ad esempio, \-\-bw\-limit 1G). .TP .B \-t, \-\-tail DIMENSIONE Limita l\'elenco dei file a quelli che non utilizzano piÚ della dimensione di coda specificata dei dischi di parità. È possibile utilizzare moltiplicatori come K, M, G o T (ad es. \-\-tail 1G). Questa opzione è valida solo se utilizzata insieme al comando \`locate\`. .TP .B \-A, \-\-stats Abilita una vista dello stato estesa che mostra informazioni aggiuntive. La schermata visualizza due grafici: Il primo grafico mostra il numero di stripe bufferizzate per ciascun disco, insieme al percorso del file attualmente acceduto su quel disco. In genere, il disco piÚ lento non avrà buffer disponibile, il che determina la larghezza di banda massima raggiungibile. Il secondo grafico mostra la percentuale di tempo trascorso in attesa negli ultimi 100 secondi. Si prevede che il disco piÚ lento causi la maggior parte del tempo di attesa, mentre gli altri dischi dovrebbero avere poco o nessun tempo di attesa perchÊ possono utilizzare le loro stripe bufferizzate. Questo grafico mostra anche il tempo trascorso in attesa per i calcoli di hash e i calcoli RAID. Tutti i calcoli vengono eseguiti in parallelo con le operazioni su disco. Pertanto, finchÊ c\'è un tempo di attesa misurabile per almeno un disco, ciÃ˛ indica che la CPU è abbastanza veloce da tenere il passo con il carico di lavoro. .TP .B \-Z, \-\-force\-zero Forza l\'operazione non sicura di sincronizzazione di un file con dimensione zero che in precedenza era non zero. Se SnapRAID rileva una tale condizione, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare facilmente quando, dopo un arresto anomalo del sistema, alcuni file a cui si è acceduto sono stati troncati. Questa è una possibile condizione in Linux con i file system ext3/ext4. Questa opzione puÃ˛ essere utilizzata solo con \`sync\`. .TP .B \-E, \-\-force\-empty Forza l\'operazione non sicura di sincronizzazione di un disco con tutti i file originali mancanti. Se SnapRAID rileva che tutti i file originariamente presenti sul disco sono mancanti o riscritti, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare facilmente quando un file system di dati non è montato. Questa opzione puÃ˛ essere utilizzata solo con \`sync\`. .TP .B \-U, \-\-force\-uuid Forza l\'operazione non sicura di sincronizzazione, controllo e correzione con dischi che hanno cambiato il loro UUID. Se SnapRAID rileva che alcuni dischi hanno cambiato UUID, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare quando i dischi sono montati sui punti di montaggio sbagliati. Tuttavia, è consentito avere un singolo cambio di UUID con parità singola e di piÚ con parità multipla, perchÊ questo è il caso normale quando si sostituiscono i dischi dopo un recupero. Questa opzione puÃ˛ essere utilizzata solo con \`sync\`, \`check\` o \`fix\`. .TP .B \-D, \-\-force\-device Forza l\'operazione non sicura di correzione con dischi inaccessibili o con dischi sullo stesso dispositivo fisico. Ad esempio, se si sono persi due dischi dati e si ha un disco di riserva per recuperare solo il primo, è possibile ignorare il secondo disco inaccessibile. Oppure, se si desidera recuperare un disco nello spazio libero rimasto su un disco già utilizzato, condividendo lo stesso dispositivo fisico. Questa opzione puÃ˛ essere utilizzata solo con \`fix\`. .TP .B \-N, \-\-force\-nocopy In \`sync\`, \`check\` e \`fix\`, disabilita l\'euristica di rilevamento della copia. Senza questa opzione, SnapRAID presume che i file con gli stessi attributi, come nome, dimensione e timestamp, siano copie con gli stessi dati. CiÃ˛ consente l\'identificazione di file copiati o spostati da un disco all\'altro e riutilizza le informazioni di hash già calcolate per rilevare errori silenti o per recuperare file mancanti. In alcuni rari casi, questo comportamento puÃ˛ comportare falsi positivi o un processo lento a causa di molte verifiche di hash, e questa opzione consente di risolvere tali problemi. Questa opzione puÃ˛ essere utilizzata solo con \`sync\`, \`check\` e \`fix\`. .TP .B \-F, \-\-force\-full In \`sync\`, forza un ricalcolo completo della parità. Questa opzione puÃ˛ essere utilizzata quando si aggiunge un nuovo livello di parità o se si è tornati a un vecchio file di contenuto utilizzando dati di parità piÚ recenti. Invece di ricreare la parità da zero, questo consente di riutilizzare gli hash presenti nel file di contenuto per convalidare i dati e mantenere la protezione dei dati durante il processo \`sync\` utilizzando i dati di parità esistenti. Questa opzione puÃ˛ essere utilizzata solo con \`sync\`. .TP .B \-R, \-\-force\-realloc In \`sync\`, forza una riallocazione completa dei file e la ricostruzione della parità. Questa opzione puÃ˛ essere utilizzata per riallocare completamente tutti i file, rimuovendo la frammentazione, riutilizzando gli hash presenti nel file di contenuto per convalidare i dati. Questa opzione puÃ˛ essere utilizzata solo con \`sync\`. ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato utilizzarla. NON si ha protezione dei dati durante l\'operazione \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail DIMENSIONE Funziona come \-R, \-\-force\-realloc, ma limitatamente alla porzione di coda specificata (ultimi DIMENSIONE byte) di ogni file di parità. Forza la riallocazione (spostamento) di qualsiasi frammento/blocco di file attualmente memorizzato in quella sezione di coda, consentendo loro di essere posizionati ovunque nei file di parità dove sia disponibile spazio libero (inclusi i buchi esistenti). Lo scopo principale di questa opzione è ridurre la dimensione su disco del file di parità. Se la riallocazione svuota con successo l\'intera sezione di coda (non rimangono blocchi che la utilizzano), il file di parità viene troncato, recuperando lo spazio di coda inutilizzato. È possibile utilizzare moltiplicatori come K, M, G o T (ad es. \-\-force\-realloc\-tail 1G). È possibile utilizzare locate \-t, \-\-tail per conoscere in anticipo i file interessati. ATTENZIONE! Questa opzione è solo per esperti ed è caldamente raccomandato di non usarla. NON si ha protezione dei dati durante l\'operazione di \`sync\` per i file interessati. .TP .B \-l, \-\-log FILE Scrive un log dettagliato nel file specificato. Se questa opzione non è specificata, gli errori imprevisti vengono stampati sullo schermo, potenzialmente resulting in un output eccessivo in caso di molti errori. Quando \-l, \-\-log è specificato, vengono stampati sullo schermo solo gli errori fatali che causano l\'arresto di SnapRAID. Se il percorso inizia con \`>>\`, il file viene aperto in modalità append. Le occorrenze di \`%D\` e \`%T\` nel nome vengono sostituite con la data e l\'ora nel formato YYYYMMDD e HHMMSS. Nei file batch di Windows, è necessario raddoppiare il carattere \`%\`, ad esempio result\-%%D.log. Per utilizzare \`>>\`, è necessario racchiudere il nome tra virgolette, ad esempio \`\[dq]>>result.log\[dq]\`. Per indirizzare l\'output del log all\'output standard o all\'errore standard, è possibile utilizzare \`\[dq]>&1\[dq]\` e \`\[dq]>&2\[dq]\`, rispettivamente. Vedere il file snapraid_log.txt o la pagina man per le descrizioni dei tag di log. .TP .B \-L, \-\-error\-limit NUMBER Imposta un nuovo limite di errore prima di interrompere l\'esecuzione. Per impostazione predefinita, SnapRAID si interrompe se incontra piÚ di 100 errori di input/output, indicando che un disco sta probabilmente fallendo. Questa opzione influisce su \`sync\` e \`scrub\`, a cui è consentito continuare dopo il primo set di errori del disco per cercare di completare le loro operazioni. Tuttavia, \`check\` e \`fix\` si interrompono sempre al primo errore. .TP .B \-S, \-\-start BLKSTART Avvia l\'elaborazione dal numero di blocco specificato. CiÃ˛ puÃ˛ essere utile per riprovare a controllare o correggere blocchi specifici in caso di disco danneggiato. Questa opzione è principalmente per il recupero manuale avanzato. .TP .B \-B, \-\-count BLKCOUNT Elabora solo il numero specificato di blocchi. Questa opzione è principalmente per il recupero manuale avanzato. .TP .B \-C, \-\-gen\-conf CONTENT Genera un file di configurazione fittizio da un file di contenuto esistente. Il file di configurazione viene scritto nell\'output standard e non sovrascrive uno esistente. Questo file di configurazione contiene anche le informazioni necessarie per ricostruire i punti di montaggio del disco nel caso in cui si perda l\'intero sistema. .TP .B \-v, \-\-verbose Stampa piÚ informazioni sullo schermo. Se specificato una volta, stampa i file esclusi e statistiche aggiuntive. Questa opzione non ha effetto sui file di log. .TP .B \-q, \-\-quiet Stampa meno informazioni sullo schermo. Se specificato una volta, rimuove la barra di avanzamento; due volte, le operazioni in corso; tre volte, i messaggi di informazione; quattro volte, i messaggi di stato. Gli errori fatali vengono sempre stampati sullo schermo. Questa opzione non ha effetto sui file di log. .TP .B \-H, \-\-help Stampa una breve schermata di aiuto. .TP .B \-V, \-\-version Stampa la versione del programma. .SH CONFIGURAZIONE SnapRAID richiede un file di configurazione per sapere dove si trova l\'array di dischi e dove memorizzare le informazioni di parità. .PP In Unix, utilizza il file \`/usr/local/etc/snapraid.conf\` se esiste, altrimenti \`/etc/snapraid.conf\`. In Windows, utilizza il file \`snapraid.conf\` nella stessa directory di \`snapraid.exe\`. .PP Deve contenere le seguenti opzioni (sensibili al maiuscolo/minuscolo): .SS parity FILE [,FILE] ... Definisce i file da utilizzare per memorizzare le informazioni di parità. La parità consente la protezione da un singolo guasto del disco, simile a RAID5. .PP È possibile specificare piÚ file, che devono essere su dischi diversi. Quando un file non puÃ˛ piÚ crescere, viene utilizzato il successivo. Lo spazio totale disponibile deve essere almeno grande quanto il disco dati piÚ grande dell\'array. .PP È possibile aggiungere file di parità aggiuntivi in seguito, ma non è possibile riordinarli o rimuoverli. .PP Mantenere i dischi di parità riservati alla parità garantisce che non diventino frammentati, migliorando le prestazioni. .PP In Windows, 256 MB vengono lasciati inutilizzati su ogni disco per evitare l\'avviso sui dischi pieni. .PP Questa opzione è obbligatoria e puÃ˛ essere utilizzata solo una volta. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... Definisce i file da utilizzare per memorizzare informazioni di parità extra. .PP Per ogni livello di parità specificato, è abilitato un livello aggiuntivo di protezione: .PD 0 .IP \(bu 2\-parity abilita la doppia parità RAID6. .IP \(bu 3\-parity abilita la tripla parità. .IP \(bu 4\-parity abilita la parità quadrupla. .IP \(bu 5\-parity abilita la parità quintupla. .IP \(bu 6\-parity abilita la parità esapla. .PD .PP Ogni livello di parità richiede la presenza di tutti i livelli di parità precedenti. .PP Si applicano le stesse considerazioni dell\'opzione \`parity\`. .PP Queste opzioni sono facoltative e possono essere utilizzate solo una volta. .SS z\-parity FILE [,FILE] ... Definisce un file e un formato alternativi per memorizzare la tripla parità. .PP Questa opzione è un\'alternativa a \`3\-parity\`, destinata principalmente a CPU di fascia bassa come ARM o AMD Phenom, Athlon e Opteron che non supportano il set di istruzioni SSSE3. In tali casi, fornisce prestazioni migliori. .PP Questo formato è simile ma piÚ veloce di quello utilizzato da ZFS RAIDZ3. Come ZFS, non funziona oltre la tripla parità. .PP Quando si utilizza \`3\-parity\`, si verrà avvisati se è consigliato utilizzare il formato \`z\-parity\` per un miglioramento delle prestazioni. .PP È possibile convertire da un formato all\'altro regolando il file di configurazione con il file z\-parity o 3\-parity desiderato e utilizzando \`fix\` per ricrearlo. .SS content FILE Definisce il file da utilizzare per memorizzare l\'elenco e i checksum di tutti i file presenti nell\'array di dischi. .PP PuÃ˛ essere posizionato su un disco utilizzato per dati, parità o qualsiasi altro disco disponibile. Se si utilizza un disco dati, questo file viene automaticamente escluso dal processo \`sync\`. .PP Questa opzione è obbligatoria e puÃ˛ essere utilizzata piÚ volte per salvare piÚ copie dello stesso file. .PP È necessario memorizzare almeno una copia per ogni disco di parità utilizzato piÚ uno. L\'utilizzo di copie aggiuntive non è dannoso. .SS data NAME DIR Definisce il nome e il punto di montaggio dei dischi dati nell\'array. NAME viene utilizzato per identificare il disco e deve essere unico. DIR è il punto di montaggio del disco nel file system. .PP È possibile cambiare il punto di montaggio secondo necessità, purchÊ si mantenga fisso NAME. .PP È necessario utilizzare un\'opzione per ogni disco dati nell\'array. .PP È possibile rinominare un disco in seguito modificando NAME direttamente nel file di configurazione e quindi eseguendo un comando \`sync\`. In caso di ridenominazione, l\'associazione viene eseguita utilizzando l\'UUID memorizzato dei dischi. .SS extra NAME DIR Definisce il nome e il punto di montaggio di dischi aggiuntivi da monitorare con i comandi \`smart\` e \`probe\`. .PP Questo è utile per monitorare i dischi che non fanno parte dell\' array ma sono necessari per il funzionamento del sistema, come il disco di avvio. .PP Si noti che tali dischi non sono influenzati dai comandi \`up\` e \`down\` perchÊ si prevede che siano sempre in rotazione. .SS nohidden Esclude tutti i file e le directory nascosti. In Unix, i file nascosti sono quelli che iniziano con \`.\`. In Windows, sono quelli con l\'attributo nascosto. .SS exclude/include PATTERN Definisce i modelli di file o directory da escludere o includere nel processo di sync. Tutti i modelli vengono elaborati nell\'ordine specificato. .PP Se il primo modello che corrisponde è un \`exclude\`, il file viene escluso. Se è un \`include\`, il file viene incluso. Se nessun modello corrisponde, il file viene escluso se l\'ultimo modello specificato è un \`include\`, o incluso se l\'ultimo modello specificato è un \`exclude\`. .PP Vedere la sezione PATTERN per maggiori dettagli sulle specifiche del modello. .PP Questa opzione puÃ˛ essere utilizzata piÚ volte. .SS blocksize SIZE_IN_KIBIBYTES Definisce la dimensione di blocco di base in kibibyte per la parità. Un kibibyte è 1024 byte. .PP La dimensione di blocco predefinita è 256, che dovrebbe funzionare nella maggior parte dei casi. .PP ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato modificare questo valore. Per modificare questo valore in futuro, sarà necessario ricreare l\'intera parità! .PP Un motivo per utilizzare una dimensione di blocco diversa è se si hanno molti file piccoli, nell\'ordine dei milioni. .PP Per ogni file, anche se solo pochi byte, viene allocato un intero blocco di parità e, con molti file, ciÃ˛ puÃ˛ comportare uno spazio di parità inutilizzato significativo. Quando si riempie completamente il disco di parità, non è consentito aggiungere altri file ai dischi dati. Tuttavia, la parità sprecata non si accumula tra i dischi dati. Lo spazio sprecato risultante da un numero elevato di file su un disco dati limita solo la quantità di dati su quel disco dati, non gli altri. .PP Come approssimazione, si puÃ˛ presumere che metà della dimensione del blocco sia sprecata per ogni file. Ad esempio, con 100.000 file e una dimensione di blocco di 256 KiB, si sprecheranno 12,8 GB di parità, il che puÃ˛ comportare 12,8 GB in meno di spazio disponibile sul disco dati. .PP È possibile controllare la quantità di spazio sprecato su ogni disco utilizzando \`status\`. Questa è la quantità di spazio che è necessario lasciare libero sui dischi dati o utilizzare per i file non inclusi nell\'array. Se questo valore è negativo, significa che si è vicini a riempire la parità e rappresenta lo spazio che è ancora possibile sprecare. .PP Per evitare questo problema, è possibile utilizzare una partizione piÚ grande per la parità. Ad esempio, se la partizione di parità è 12,8 GB piÚ grande dei dischi dati, si ha abbastanza spazio extra per gestire fino a 100.000 file su ogni disco dati senza alcuno spreco di spazio. .PP Un trucco per ottenere una partizione di parità piÚ grande in Linux è formattarla con il comando: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP CiÃ˛ si traduce in circa l\'1,5% di spazio extra, circa 60 GB per un disco da 4 TB, che consente circa 460.000 file su ogni disco dati senza alcuno spreco di spazio. .SS hashsize SIZE_IN_BYTES Definisce la dimensione dell\'hash in byte per i blocchi salvati. .PP La dimensione di hash predefinita è 16 byte (128 bit), che dovrebbe funzionare nella maggior parte dei casi. .PP ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato modificare questo valore. Per modificare questo valore in futuro, sarà necessario ricreare l\'intera parità! .PP Un motivo per utilizzare una dimensione di hash diversa è se il sistema ha memoria limitata. Come regola generale, SnapRAID tipicamente richiede 1 GiB di RAM per ogni 16 TB di dati nell\'array. .PP Nello specifico, per memorizzare gli hash dei dati, SnapRAID richiede circa $TS*(1+HS)/BS$ byte di RAM, dove $TS$ è la dimensione totale in byte dell\'array di dischi, $BS$ è la dimensione del blocco in byte e $HS$ è la dimensione dell\'hash in byte. .PP Ad esempio, con 8 dischi da 4 TB, una dimensione di blocco di 256 KiB ($1 \\text{ KiB} = 1024 \\text{ byte}$) e una dimensione di hash di 16, si ottiene: .PP RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93 \\text{ GiB}$ .PD 0 .PD .PP Passando a una dimensione di hash di 8, si ottiene: .PP RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02 \\text{ GiB}$ .PD 0 .PD .PP Passando a una dimensione di blocco di 512, si ottiene: .PP RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96 \\text{ GiB}$ .PD 0 .PD .PP Passando sia a una dimensione di hash di 8 che a una dimensione di blocco di 512, si ottiene: .PP RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51 \\text{ GiB}$ .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES Salva automaticamente lo stato durante la sincronizzazione o lo scrubbing dopo la quantità specificata di GB elaborati. Questa opzione è utile per evitare di riavviare lunghi comandi \`sync\` da zero se interrotti da un arresto anomalo della macchina o qualsiasi altro evento. .SS temp_limit TEMPERATURE_CELSIUS Imposta la temperatura massima del disco consentita in Celsius. Se specificato, SnapRAID controlla periodicamente la temperatura di tutti i dischi utilizzando lo strumento smartctl. Le temperature attuali dei dischi vengono visualizzate mentre SnapRAID è in funzione. Se un disco supera questo limite, tutte le operazioni si interrompono e i dischi vengono messi in stand\-by (spin down) per la durata definita dall\'opzione \`temp_sleep\`. Dopo il periodo di sonno, le operazioni riprendono, potenzialmente mettendosi in pausa di nuovo se il limite di temperatura viene raggiunto ancora una volta. .PP Durante il funzionamento, SnapRAID analizza anche la curva di riscaldamento di ciascun disco e stima la temperatura costante a lungo termine che dovrebbero raggiungere se l\'attività continua. La stima viene eseguita solo dopo che la temperatura del disco è aumentata quattro volte, garantendo che siano disponibili abbastanza punti dati per stabilire una tendenza affidabile. Questa temperatura costante prevista è mostrata tra parentesi accanto al valore attuale e aiuta a valutare se il raffreddamento del sistema è adeguato. Questa temperatura stimata è solo a scopo informativo e non ha alcun effetto sul comportamento di SnapRAID. Le azioni del programma si basano esclusivamente sulle temperature effettive misurate del disco. .PP Per eseguire questa analisi, SnapRAID necessita di un riferimento per la temperatura del sistema. Tenta prima di leggerla dai sensori hardware disponibili. Se non è possibile accedere a nessun sensore di sistema, utilizza la temperatura del disco piÚ bassa misurata all\'inizio dell\'esecuzione come riferimento di riserva. .PP Normalmente, SnapRAID mostra solo la temperatura del disco piÚ caldo. Per visualizzare la temperatura di tutti i dischi, utilizzare l\'opzione \-A o \-\-stats. .SS temp_sleep TIME_IN_MINUTES Imposta il tempo di stand\-by, in minuti, quando il limite di temperatura viene raggiunto. Durante questo periodo, i dischi rimangono fermi (spin down). Il valore predefinito è 5 minuti. .SS pool DIR Definisce la directory di pooling in cui viene creata la vista virtuale dell\'array di dischi utilizzando il comando \`pool\`. .PP La directory deve già esistere. .SS share UNC_DIR Definisce il percorso UNC di Windows necessario per accedere ai dischi da remoto. .PP Se questa opzione è specificata, i collegamenti simbolici creati nella directory pool utilizzano questo percorso UNC per accedere ai dischi. Senza questa opzione, i collegamenti simbolici generati utilizzano solo percorsi locali, il che non consente la condivisione della directory pool sulla rete. .PP I collegamenti simbolici sono formati utilizzando il percorso UNC specificato, aggiungendo il nome del disco come specificato nell\'opzione \`data\` e infine aggiungendo la directory e il nome del file. .PP Questa opzione è richiesta solo per Windows. .SS smartctl DISK/PARITY OPTIONS... Definisce opzioni smartctl personalizzate per ottenere gli attributi SMART per ogni disco. CiÃ˛ potrebbe essere richiesto per controller RAID e alcuni dischi USB che non possono essere rilevati automaticamente. Il segnaposto %s viene sostituito dal nome del dispositivo, ma è facoltativo per dispositivi fissi come i controller RAID. .PP DISK è lo stesso nome del disco specificato nell\'opzione \`data\`. PARITY è uno dei nomi di parità: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` o \`z\-parity\`. .PP Nelle OPTIONS specificate, la stringa \`%s\` viene sostituita dal nome del dispositivo. Per i controller RAID, il dispositivo è probabilmente fisso e potrebbe non essere necessario utilizzare \`%s\`. .PP Fare riferimento alla documentazione di smartmontools per le possibili opzioni: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP Ad esempio: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignora l\'attributo SMART specificato durante il calcolo della probabilità di guasto del disco. Questa opzione è utile se un disco segnala valori insoliti o fuorvianti per un particolare attributo. .PP DISK è lo stesso nome del disco specificato nell\'opzione \`data\`. PARITY è uno dei nomi di parità: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` o \`z\-parity\`. Il valore speciale * puÃ˛ essere utilizzato per ignorare l\'attributo su tutti i dischi. .PP Ad esempio, per ignorare l\'attributo \`Current Pending Sector Count\` su tutti i dischi: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Per ignorarlo solo sul primo disco di parità: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Esempi Un esempio di configurazione tipica per Unix è: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Un esempio di configurazione tipica per Windows è: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN I pattern offrono un modo flessibile per filtrare i file da includere o escludere. Usando i caratteri globbing, è possibile definire regole che corrispondano a nomi di file specifici o a intere strutture di directory senza elencare manualmente ogni percorso. .PP Il punto interrogativo \`?\` corrisponde a qualsiasi carattere singolo eccetto il separatore di directory. Questo lo rende utile per far corrispondere nomi di file con caratteri variabili mantenendo il pattern confinato a un singolo livello di directory. .PP L\'asterisco singolo \`*\` corrisponde a qualsiasi sequenza di caratteri, ma come il punto interrogativo, non attraversa mai i confini delle directory. Si ferma allo slash in avanti, rendendolo adatto per la corrispondenza all\'interno di un singolo componente del percorso. Questo è il comportamento standard dei wildcard familiare dal globbing della shell. .PP Il doppio asterisco \`**\` è piÚ potente, corrisponde a qualsiasi sequenza di caratteri inclusi i separatori di directory. CiÃ˛ consente ai pattern di corrispondere attraverso piÚ livelli di directory. Quando \`**\` appare inserito direttamente in un pattern, puÃ˛ corrispondere a zero o piÚ caratteri inclusi gli slash tra il testo letterale circostante. .PP L\'uso piÚ importante di \`**\` è nella forma speciale \`/**/\`. Questa corrisponde a zero o piÚ livelli di directory completi, rendendo possibile la corrispondenza di file a qualsiasi profondità in un albero di directory senza conoscere l\'esatta struttura del percorso. Per esempio, il pattern \`src/**/main.js\` corrisponde a \`src/main.js\` (saltando zero directory), \`src/ui/main.js\` (saltando una directory), e \`src/ui/components/main.js\` (saltando due directory). .PP Le classi di caratteri che usano le parentesi quadre \`[]\` corrispondono a un singolo carattere da un set o intervallo specificato. Come gli altri pattern a carattere singolo, esse non corrispondono ai separatori di directory. Le classi supportano intervalli e la negazione usando un punto esclamativo. .PP La distinzione fondamentale da ricordare è che \`*\`, \`?\` e le classi di caratteri rispettano tutti i confini delle directory e corrispondono solo all\'interno di un singolo componente del percorso, mentre \`**\` è l\'unico pattern che puÃ˛ corrispondere attraverso i separatori di directory. .PP Esistono quattro diversi tipi di pattern: .TP .B FILE Seleziona qualsiasi file chiamato FILE. Questo pattern si applica solo ai file, non alle directory. .TP .B DIR/ Seleziona qualsiasi directory chiamata DIR e tutto ciÃ˛ che contiene. Questo pattern si applica solo alle directory, non ai file. .TP .B /PATH/FILE Seleziona l\'esatto percorso del file specificato. Questo pattern si applica solo ai file, non alle directory. .TP .B /PATH/DIR/ Seleziona l\'esatto percorso della directory specificata e tutto ciÃ˛ che contiene. Questo pattern si applica solo alle directory, non ai file. .PP Quando si specifica un percorso assoluto che inizia con /, viene applicato alla directory radice dell\'array, non alla directory radice del file system locale. .PP In Windows, è possibile utilizzare il backslash \\ invece dello slash in avanti /. Le directory di sistema di Windows, le junction, i punti di montaggio e altre directory speciali di Windows sono trattati come file, il che significa che per escluderli, è necessario utilizzare una regola di file, non una di directory. .PP Se il nome del file contiene un carattere \`*\`, \`?\`, \`[\` o \`]\`, è necessario eseguirne l\'escape per evitare che venga interpretato come un carattere di globbing. In Unix, il carattere di escape è \`\\\`; in Windows, è \`^\`. Quando il pattern è sulla riga di comando, è necessario raddoppiare il carattere di escape per evitare che venga interpretato dalla shell dei comandi. .PP Nel file di configurazione, è possibile utilizzare diverse strategie per filtrare i file da elaborare. L\'approccio piÚ semplice è utilizzare solo regole \`exclude\` per rimuovere tutti i file e le directory che non si desidera elaborare. Ad esempio: .PP .RS 4 # Esclude qualsiasi file denominato \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Esclude la directory radice \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Esclude qualsiasi sottodirectory denominata \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP L\'approccio opposto è definire solo i file che si desidera elaborare, utilizzando solo regole \`include\`. Ad esempio: .PP .RS 4 # Include solo alcune directory .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP L\'approccio finale è mescolare regole \`exclude\` e \`include\`. In questo caso, l\'ordine delle regole è importante. Le regole precedenti hanno la precedenza su quelle successive. Per semplificare, è possibile elencare prima tutte le regole \`exclude\` e poi tutte le regole \`include\`. Ad esempio: .PP .RS 4 # Esclude qualsiasi file denominato \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Esclude qualsiasi sottodirectory denominata \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Include solo alcune directory .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Sulla riga di comando, utilizzando l\'opzione \-f, è possibile utilizzare solo pattern \`include\`. Ad esempio: .PP .RS 4 # Controlla solo i file .mp3. .PD 0 .PP .PD # In Unix, utilizzare le virgolette per evitare l\'espansione .PD 0 .PP .PD # del globbing da parte della shell. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP In Unix, quando si utilizzano caratteri di globbing sulla riga di comando, è necessario citarli per impedire alla shell di espanderli. .SH IGNORE FILE In aggiunta alle regole globali nel file di configurazione, è possibile inserire file \`.snapraidignore\` in qualsiasi directory all\'interno dell\'array per definire regole di esclusione decentralizzate. .PP Le regole definite in \`.snapraidignore\` vengono applicate dopo le regole nel file di configurazione. CiÃ˛ significa che hanno una priorità piÚ alta e possono essere utilizzate per escludere file che erano stati precedentemente inclusi dalla configurazione globale. In pratica, se una regola locale corrisponde, il file viene escluso indipendentemente dalle impostazioni di inclusione globali. .PP La logica dei pattern in \`.snapraidignore\` rispecchia la configurazione globale ma ancora i pattern alla directory in cui si trova il file: .TP .B FILE Seleziona qualsiasi file chiamato FILE in questa directory o sotto di essa. Segue le stesse regole di globbing del pattern globale. .TP .B DIR/ Seleziona qualsiasi directory chiamata DIR e tutto ciÃ˛ che contiene, che risieda in questa directory o sotto di essa. .TP .B /PATH/FILE Seleziona l\'esatto file specificato relativo alla posizione del file \`.snapraidignore\`. .TP .B /PATH/DIR/ Seleziona l\'esatta directory specificata e tutto ciÃ˛ che contiene, relativa alla posizione del file \`.snapraidignore\`. .PP A differenza della configurazione globale, i file \`.snapraidignore\` supportano solo regole di esclusione; non è possibile utilizzare pattern \`include\` o negazioni (!). .PP Ad esempio, se hai un \`.snapraidignore\` in \`/mnt/disk1/projects/\`: .PP .RS 4 # Esclude SOLO /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Esclude qualsiasi directory chiamata \`build\` all\'interno di projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Esclude qualsiasi file .tmp all\'interno di projects/ o delle sue sottocartelle .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID memorizza l\'elenco e i checksum dei file nel file di contenuto. .PP È un file binario che elenca tutti i file presenti nell\'array di dischi, insieme a tutti i checksum per verificarne l\'integrità. .PP Questo file viene letto e scritto dai comandi \`sync\` e \`scrub\` e letto dai comandi \`fix\`, \`check\` e \`status\`. .SH PARITY SnapRAID memorizza le informazioni di parità dell\'array nei file di parità. .PP Questi sono file binari contenenti la parità calcolata di tutti i blocchi definiti nel file \`content\`. .PP Questi file vengono letti e scritti dai comandi \`sync\` e \`fix\` e solo letti dai comandi \`scrub\` e \`check\`. .SH CODIFICA SnapRAID in Unix ignora qualsiasi codifica. Legge e memorizza i nomi dei file con la stessa codifica utilizzata dal file system. .PP In Windows, tutti i nomi letti dal file system vengono convertiti e elaborati in formato UTF\-8. .PP Per avere i nomi dei file stampati correttamente, è necessario impostare la console di Windows in modalità UTF\-8 con il comando \`chcp 65001\` e utilizzare un carattere TrueType come \`Lucida Console\` come carattere della console. Questo influisce solo sui nomi dei file stampati; se si reindirizza l\'output della console a un file, il file risultante è sempre in formato UTF\-8. .SH COPYRIGHT Questo file è Copyright (C) 2025 Andrea Mazzoleni .SH VEDI ANCHE snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-it.d000066400000000000000000002050621522717156100164110ustar00rootroot00000000000000Name{number} snapraid - Backup SnapRAID per Array di Dischi Sinossi :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Descrizione SnapRAID è un programma di backup progettato per array di dischi, che memorizza informazioni di parità per il recupero dati in caso di guasto fino a sei dischi. Destinato principalmente a centri multimediali domestici con file grandi e che cambiano raramente, SnapRAID offre diverse funzionalità: * È possibile utilizzare dischi già pieni di file senza la necessità di riformattarli, accedendovi come al solito. * Tutti i dati sono sottoposti ad hashing per garantire l'integrità dei dati e prevenire la corruzione silente. * Quando il numero di dischi guasti supera il conteggio di parità, la perdita di dati è confinata ai dischi interessati; i dati sugli altri dischi rimangono accessibili. * Se si eliminano accidentalmente dei file su un disco, il recupero è possibile. * I dischi possono avere dimensioni diverse. * È possibile aggiungere dischi in qualsiasi momento. * SnapRAID non blocca i dati; è possibile smettere di usarlo in qualsiasi momento senza riformattare o spostare i dati. * Per accedere a un file, è necessario far girare solo un singolo disco, risparmiando energia e riducendo il rumore. Per maggiori informazioni, si prega di visitare il sito ufficiale SnapRAID: :https://www.snapraid.it/ Limitazioni SnapRAID è un ibrido tra un programma RAID e un programma di backup, che mira a combinare i migliori vantaggi di entrambi. Tuttavia, ha alcune limitazioni che si dovrebbero considerare prima di usarlo. La limitazione principale è che se un disco si guasta e non si è effettuato un sync di recente, potrebbe non essere possibile recuperare completamente. PiÚ specificamente, potrebbe non essere possibile recuperare fino alla dimensione dei file modificati o eliminati dall'ultima operazione di sync. CiÃ˛ accade anche se i file modificati o eliminati non si trovano sul disco guasto. Questo è il motivo per cui SnapRAID è piÚ adatto per dati che cambiano raramente. D'altra parte, i file appena aggiunti non impediscono il recupero dei file già esistenti. Si perderanno solo i file aggiunti di recente se si trovano sul disco guasto. Altre limitazioni di SnapRAID sono: * Con SnapRAID, si hanno ancora file system separati per ogni disco. Con RAID, si ottiene un unico grande file system. * SnapRAID non esegue lo striping dei dati. Con RAID, si ottiene un aumento di velocità con lo striping. * SnapRAID non supporta il recupero in tempo reale. Con RAID, non si deve smettere di lavorare quando un disco si guasta. * SnapRAID puÃ˛ recuperare i dati solo da un numero limitato di guasti del disco. Con un backup, è possibile recuperare da un guasto completo dell'intero array di dischi. * Vengono salvati solo nomi di file, timestamp, symlink e hardlink. Permessi, proprietà e attributi estesi non vengono salvati. Iniziare Per usare SnapRAID, è necessario prima selezionare un disco nell'array di dischi da dedicare alle informazioni di `parity` (parità). Con un disco per la parità, si sarà in grado di recuperare da un singolo guasto del disco, in modo simile a RAID5. Se si desidera recuperare da piÚ guasti del disco, in modo simile a RAID6, è necessario riservare dischi aggiuntivi per la parità. Ogni disco di parità aggiuntivo consente il recupero da un guasto in piÚ del disco. Come dischi di parità, è necessario scegliere i dischi piÚ grandi dell'array, poichÊ le informazioni di parità possono crescere fino alle dimensioni del piÚ grande disco dati nell'array. Questi dischi saranno dedicati alla memorizzazione dei file di `parity`. Non si dovrebbero memorizzare i propri dati su di essi. Quindi, è necessario definire i dischi `data` (dati) che si desidera proteggere con SnapRAID. La protezione è piÚ efficace se questi dischi contengono dati che cambiano raramente. Per questo motivo, è meglio NON includere il disco C:\ di Windows o le directory Unix /home, /var, e /tmp. L'elenco dei file viene salvato nei file `content` (contenuto), di solito memorizzati sui dischi dati, di parità o di avvio. Questo file contiene i dettagli del backup, inclusi tutti i checksum per verificarne l'integrità. Il file `content` viene memorizzato in piÚ copie e ogni copia deve essere su un disco diverso per garantire che, anche in caso di guasti multipli del disco, sia disponibile almeno una copia. Ad esempio, supponiamo di essere interessati a un solo livello di protezione con parità e che i dischi si trovino in: :/mnt/diskp <- disco selezionato per la parità :/mnt/disk1 <- primo disco da proteggere :/mnt/disk2 <- secondo disco da proteggere :/mnt/disk3 <- terzo disco da proteggere È necessario creare il file di configurazione /etc/snapraid.conf con le seguenti opzioni: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Se si è su Windows, si dovrebbe usare il formato del percorso di Windows, con lettere di unità e backslash invece di slash. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Se si hanno molti dischi e si esauriscono le lettere di unità, è possibile montare i dischi direttamente nelle sottocartelle. Vedi: :https://www.google.com/search?q=Windows+mount+point A questo punto, si è pronti per eseguire il comando `sync` per costruire le informazioni di parità. :snapraid sync Questo processo puÃ˛ richiedere diverse ore la prima volta, a seconda delle dimensioni dei dati già presenti sui dischi. Se i dischi sono vuoti, il processo è immediato. È possibile interromperlo in qualsiasi momento premendo Ctrl+C e, alla prossima esecuzione, riprenderà da dove è stato interrotto. Quando questo comando è completato, i dati sono SICURI. Ora è possibile iniziare a usare l'array come si desidera e aggiornare periodicamente le informazioni di parità eseguendo il comando `sync`. Scrubbing Per controllare periodicamente i dati e la parità per gli errori, è possibile eseguire il comando `scrub`. :snapraid scrub Questo comando confronta i dati nell'array con l'hash calcolato durante il comando `sync` per verificarne l'integrità. Ogni esecuzione del comando controlla circa l'8% dell'array, escludendo i dati già sottoposti a scrub nei 10 giorni precedenti. È possibile utilizzare l'opzione -p, --plan per specificare un importo diverso e l'opzione -o, --older-than per specificare un'età diversa in giorni. Ad esempio, per controllare il 5% dell'array per blocchi piÚ vecchi di 20 giorni, usare: :snapraid -p 5 -o 20 scrub Se vengono trovati errori silenti o di input/output durante il processo, i blocchi corrispondenti vengono contrassegnati come bad (cattivi) nel file `content` ed elencati nel comando `status`. :snapraid status Per correggerli, è possibile utilizzare il comando `fix`, filtrando i blocchi bad con l'opzione -e, --filter-error: :snapraid -e fix Al prossimo `scrub`, gli errori scompariranno dal report `status` se sono stati veramente corretti. Per renderlo piÚ veloce, è possibile utilizzare -p bad per eseguire lo scrub solo dei blocchi contrassegnati come bad. :snapraid -p bad scrub L'esecuzione di `scrub` su un array non sincronizzato puÃ˛ riportare errori causati da file rimossi o modificati. Questi errori sono riportati nell'output di `scrub`, ma i blocchi correlati non sono contrassegnati come bad. Pooling Nota: La funzionalità di pooling descritta di seguito è stata sostituita dallo strumento mergerfs, che è ora l'opzione consigliata per gli utenti Linux nella comunità SnapRAID. Mergefs fornisce un modo piÚ flessibile ed efficiente per raggruppare piÚ unità in un singolo punto di montaggio unificato, consentendo un accesso trasparente ai file attraverso l'array senza fare affidamento sui collegamenti simbolici. Si integra bene con SnapRAID per la protezione della parità ed è comunemente usato in configurazioni come OpenMediaVault (OMV) o NAS personalizzati. Per avere tutti i file nell'array mostrati nello stesso albero di directory, è possibile abilitare la funzionalità di `pooling`. Crea una vista virtuale di sola lettura di tutti i file nell'array utilizzando collegamenti simbolici. È possibile configurare la directory di `pooling` nel file di configurazione con: :pool /pool o, se si è su Windows, con: :pool C:\pool e quindi eseguire il comando `pool` per creare o aggiornare la vista virtuale. :snapraid pool Se si sta utilizzando una piattaforma Unix e si desidera condividere questa directory sulla rete con macchine Windows o Unix, è necessario aggiungere le seguenti opzioni al file /etc/samba/smb.conf: :# Nella sezione globale di smb.conf :unix extensions = no :# Nella sezione di condivisione di smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes In Windows, la condivisione di collegamenti simbolici su una rete richiede che i client li risolvano da remoto. Per abilitare questo, oltre a condividere la directory pool, è necessario condividere anche tutti i dischi in modo indipendente, utilizzando i nomi dei dischi definiti nel file di configurazione come punti di condivisione. È inoltre necessario specificare nell'opzione `share` del file di configurazione il percorso UNC di Windows che i client remoti devono utilizzare per accedere a questi dischi condivisi. Ad esempio, operando da un server chiamato `darkstar`, è possibile utilizzare le opzioni: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar e condividere le seguenti directory sulla rete: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array per consentire ai client remoti di accedere a tutti i file in \\darkstar\pool. Potrebbe anche essere necessario configurare i client remoti per abilitare l'accesso ai symlink remoti con il comando: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Annullamento Eliminazione SnapRAID funziona piÚ come un programma di backup che come un sistema RAID e puÃ˛ essere utilizzato per ripristinare o annullare l'eliminazione dei file al loro stato precedente utilizzando l'opzione -f, --filter: :snapraid fix -f FILE o per una directory: :snapraid fix -f DIR/ È anche possibile usarlo per recuperare solo i file eliminati accidentalmente all'interno di una directory utilizzando l'opzione -m, --filter-missing, che ripristina solo i file mancanti, lasciando tutti gli altri intatti. :snapraid fix -m -f DIR/ O per recuperare tutti i file eliminati su tutte le unità con: :snapraid fix -m Recupero È successo il peggio e si è perso uno o piÚ dischi! NON FARSI PRENDERE DAL PANICO! Sarà possibile recuperarli! La prima cosa da fare è evitare ulteriori modifiche all'array di dischi. Disabilitare qualsiasi connessione remota ad esso e qualsiasi processo pianificato, incluso qualsiasi sync o scrub notturno pianificato di SnapRAID. Quindi procedere con i seguenti passaggi. PASSO 1 -> Riconfigurazione È necessario un po' di spazio per recuperare, idealmente su dischi di riserva aggiuntivi, ma un disco USB esterno o un disco remoto saranno sufficienti. Modificare il file di configurazione SnapRAID per far puntare l'opzione `data` o `parity` del disco guasto a una posizione con spazio vuoto sufficiente per recuperare i file. Ad esempio, se il disco `d1` è guasto, cambiare da: :data d1 /mnt/disk1/ a: :data d1 /mnt/new_spare_disk/ Se il disco da recuperare è un disco di parità, aggiornare l'opzione `parity` appropriata. Se si hanno piÚ dischi guasti, aggiornare tutte le loro opzioni di configurazione. PASSO 2 -> Correzione (Fix) Eseguire il comando fix, memorizzando il log in un file esterno con: :snapraid -d NAME -l fix.log fix Dove NAME è il nome del disco, come `d1` nel nostro esempio precedente. Se il disco da recuperare è un disco di parità, usare i nomi `parity`, `2-parity`, ecc. Se si hanno piÚ dischi guasti, usare piÚ opzioni -d per specificarli tutti. Questo comando richiederà molto tempo. Assicurarsi di avere alcuni gigabyte liberi per memorizzare il file fix.log. Eseguirlo da un disco con spazio libero sufficiente. Ora si è recuperato tutto ciÃ˛ che è recuperabile. Se alcuni file sono parzialmente o totalmente irrecuperabili, verranno rinominati aggiungendo l'estensione `.unrecoverable`. È possibile trovare un elenco dettagliato di tutti i blocchi irrecuperabili nel file fix.log controllando tutte le righe che iniziano con `unrecoverable:`. Se non si è soddisfatti del recupero, è possibile riprovare tutte le volte che si desidera. Ad esempio, se si sono rimossi file dall'array dopo l'ultimo `sync`, questo puÃ˛ comportare che alcuni file non vengano recuperati. In questo caso, è possibile riprovare il `fix` usando l'opzione -i, --import, specificando dove si trovano ora questi file per includerli di nuovo nel processo di recupero. Se si è soddisfatti del recupero, è possibile procedere oltre, ma notare che dopo la sincronizzazione, non è piÚ possibile riprovare il comando `fix`! PASSO 3 -> Controllo (Check) Come controllo cauto, è ora possibile eseguire un comando `check` per assicurarsi che tutto sia corretto sul disco recuperato. :snapraid -d NAME -a check Dove NAME è il nome del disco, come `d1` nel nostro esempio precedente. Le opzioni -d e -a dicono a SnapRAID di controllare solo il disco specificato e di ignorare tutti i dati di parità. Questo comando richiederà molto tempo, ma se non si è eccessivamente cauti, è possibile saltarlo. PASSO 4 -> Sincronizzazione (Sync) Eseguire il comando `sync` per risincronizzare l'array con il nuovo disco. :snapraid sync Se tutto è recuperato, questo comando è immediato. Comandi SnapRAID fornisce alcuni semplici comandi che consentono di: * Stampare lo stato dell'array -> `status` * Controllare i dischi -> `smart`, `probe`, `up`, `down` * Effettuare un backup/snapshot -> `sync` * Controllare periodicamente i dati -> `scrub` * Ripristinare l'ultimo backup/snapshot -> `fix`. I comandi devono essere scritti in minuscolo. status Stampa un riepilogo dello stato dell'array di dischi. Include informazioni sulla frammentazione della parità, quanto sono vecchi i blocchi senza essere controllati e tutti gli errori silenti registrati incontrati durante lo scrubbing. Le informazioni presentate si riferiscono all'ultima volta che si è eseguito `sync`. Le modifiche successive non vengono prese in considerazione. Se sono stati rilevati blocchi bad, vengono elencati i loro numeri di blocco. Per correggerli, è possibile utilizzare il comando `fix -e`. Mostra anche un grafico che rappresenta l'ultima volta che ogni blocco è stato sottoposto a scrub o sincronizzato. I blocchi sottoposti a scrub sono mostrati con `*`, i blocchi sincronizzati ma non ancora sottoposti a scrub con `o`. Nulla viene modificato. smart Stampa un report SMART di tutti i dischi nel sistema. Include una stima della probabilità di guasto nel prossimo anno, consentendo di pianificare sostituzioni di manutenzione di dischi che mostrano attributi sospetti. Questa stima della probabilità è ottenuta correlando gli attributi SMART dei dischi con i dati Backblaze disponibili all'indirizzo: :https://www.backblaze.com/hard-drive-test-data.html Se SMART segnala che un disco sta per guastarsi, viene stampato `FAIL` o `PREFAIL` per quel disco e SnapRAID restituisce un errore. In questo caso, si raccomanda vivamente la sostituzione immediata del disco. Altre possibili stringhe di stato sono: logfail - In passato, alcuni attributi erano inferiori alla soglia. logerr - Il log degli errori del dispositivo contiene errori. selferr - Il log dell'autotest del dispositivo contiene errori. Se viene specificata l'opzione -v, --verbose, viene fornita un'analisi statistica piÚ approfondita. Questa analisi puÃ˛ aiutare a decidere se è necessaria piÚ o meno parità. Questo comando utilizza lo strumento `smartctl` ed è equivalente all'esecuzione di `smartctl -a` su tutti i dispositivi. Se i dispositivi non vengono rilevati automaticamente correttamente, è possibile specificare un comando personalizzato utilizzando l'opzione `smartctl` nel file di configurazione. Nulla viene modificato. probe Stampa lo stato POWER di tutti i dischi nel sistema. `Standby` significa che il disco non sta girando. `Active` significa che il disco sta girando. Questo comando utilizza lo strumento `smartctl` ed è equivalente all'esecuzione di `smartctl -n standby -i` su tutti i dispositivi. Se i dispositivi non vengono rilevati automaticamente correttamente, è possibile specificare un comando personalizzato utilizzando l'opzione `smartctl` nel file di configurazione. Nulla viene modificato. up Fa girare tutti i dischi dell'array. È possibile far girare solo dischi specifici utilizzando l'opzione -d, --filter-disk. Far girare tutti i dischi contemporaneamente richiede molta energia. Assicurarsi che l'alimentatore possa sostenerlo. Nulla viene modificato. down Ferma tutti i dischi dell'array. Questo comando utilizza lo strumento `smartctl` ed è equivalente all'esecuzione di `smartctl -s standby,now` su tutti i dispositivi. È possibile fermare solo dischi specifici utilizzando l'opzione -d, --filter-disk. Per fermare automaticamente in caso di errore, è possibile utilizzare l'opzione -s, --spin-down-on-error con qualsiasi altro comando, che è equivalente all'esecuzione manuale di `down` quando si verifica un errore. Nulla viene modificato. diff Elenca tutti i file modificati dall'ultimo `sync` che devono avere i loro dati di parità ricalcolati. Questo comando non controlla i dati del file, ma solo il timestamp del file, le dimensioni e l'inode. Dopo aver elencato tutti i file modificati, viene presentato un riepilogo delle modifiche, raggruppate per: equal - File invariati rispetto a prima. added - File aggiunti che non erano presenti prima. removed - File rimossi. updated - File con dimensioni o timestamp diversi, il che significa che sono stati modificati. moved - File spostati in una directory diversa sullo stesso disco. Sono identificati dall'avere lo stesso nome, dimensioni, timestamp e inode, ma una directory diversa. copied - File copiati sullo stesso disco o su un disco diverso dove il file originale esiste ancora. Sono identificati dall'avere lo stesso nome, dimensione e timestamp. Se il timestamp al sottomultiplo del secondo è zero, il percorso completo deve corrispondere per essere identificato, non solo il nome. relocated - File spostati sullo stesso disco o su un disco diverso dove l'originale è scomparso. Sono identificati dall' avere lo stesso nome, dimensione e timestamp. Se il timestamp al sottomultiplo del secondo è zero, il percorso completo deve corrispondere per essere identificato. A differenza dei file `moved` sullo stesso disco, i file ricollocati hanno un inode diverso. restored - File con un inode diverso ma directory, nome, dimensione e timestamp corrispondenti. Questi sono solitamente file ripristinati dopo essere stati eliminati. Se è richiesto un `sync`, il codice di ritorno del processo è 2, invece del predefinito 0. Il codice di ritorno 1 è utilizzato per una condizione di errore generica. Nulla viene modificato. sync Aggiorna le informazioni di parità. Tutti i file modificati nell'array di dischi vengono letti e i dati di parità corrispondenti vengono aggiornati. È possibile interrompere questo processo in qualsiasi momento premendo Ctrl+C, senza perdere il lavoro già svolto. Alla prossima esecuzione, il processo `sync` riprenderà da dove è stato interrotto. Se vengono trovati errori silenti o di input/output durante il processo, i blocchi corrispondenti vengono contrassegnati come bad. I file sono identificati dal percorso e/o dall'inode e controllati per dimensione e timestamp. Se la dimensione o il timestamp del file differiscono, i dati di parità vengono ricalcolati per l'intero file. Se il file viene spostato o rinominato sullo stesso disco, mantenendo lo stesso inode, la parità non viene ricalcolata. Se il file viene spostato su un altro disco, la parità viene ricalcolata, ma le informazioni di hash precedentemente calcolate vengono mantenute. I file `content` e `parity` vengono modificati se necessario. I file nell'array NON vengono modificati. scrub Esegue lo scrub dell'array, controllando la presenza di errori silenti o di input/output nei dischi dati e di parità. Ogni invocazione controlla circa l'8% dell'array, escludendo i dati già sottoposti a scrub negli ultimi 10 giorni. CiÃ˛ significa che eseguire lo scrubbing una volta alla settimana garantisce che ogni bit di dati venga controllato almeno una volta ogni tre mesi. È possibile definire un piano o una quantità di scrub diversa utilizzando l'opzione -p, --plan, che accetta: bad - Esegue lo scrub dei blocchi contrassegnati come bad. new - Esegue lo scrub dei blocchi appena sincronizzati non ancora sottoposti a scrub. full - Esegue lo scrub di tutto. 0-100 - Esegue lo scrub della percentuale specificata di blocchi. Se si specifica una quantità percentuale, è anche possibile utilizzare l'opzione -o, --older-than per definire quanto deve essere vecchio il blocco. I blocchi piÚ vecchi vengono sottoposti a scrub per primi, garantendo un controllo ottimale. Se si desidera eseguire lo scrub solo dei blocchi appena sincronizzati non ancora sottoposti a scrub, utilizzare l'opzione `-p new`. Per ottenere i dettagli dello stato dello scrub, utilizzare il comando `status`. Per qualsiasi errore silente o di input/output trovato, i blocchi corrispondenti vengono contrassegnati come bad nel file `content`. Questi blocchi bad sono elencati in `status` e possono essere corretti con `fix -e`. Dopo la correzione, al prossimo scrub, verranno ricontrollati e, se trovati corretti, il contrassegno bad verrà rimosso. Per eseguire lo scrub solo dei blocchi bad, è possibile utilizzare il comando `scrub -p bad`. Si consiglia di eseguire `scrub` solo su un array sincronizzato per evitare errori segnalati causati da dati non sincronizzati. Questi errori sono riconosciuti come non essendo errori silenti e i blocchi non vengono contrassegnati come bad, ma tali errori sono riportati nell'output del comando. Il file `content` viene modificato per aggiornare l'ora dell'ultimo controllo per ogni blocco e per contrassegnare i blocchi bad. I file `parity` NON vengono modificati. I file nell'array NON vengono modificati. fix Corregge tutti i file e i dati di parità. Tutti i file e i dati di parità vengono confrontati con lo stato snapshot salvato nell'ultimo `sync`. Se viene trovata una differenza, viene ripristinata allo snapshot memorizzato. ATTENZIONE! Il comando `fix` non differenzia tra errori e modifiche intenzionali. Ripristina incondizionatamente lo stato del file all'ultimo `sync`. Se non viene specificata nessun'altra opzione, l'intero array viene elaborato. Utilizzare le opzioni di filtro per selezionare un sottoinsieme di file o dischi su cui operare. Per correggere solo i blocchi contrassegnati come bad durante `sync` e `scrub`, utilizzare l'opzione -e, --filter-error. A differenza di altre opzioni di filtro, questa applica correzioni solo ai file che sono invariati dall'ultimo `sync`. SnapRAID rinomina tutti i file che non possono essere corretti aggiungendo l'estensione `.unrecoverable`. Prima di correggere, l'intero array viene scansionato per trovare eventuali file spostati dall'ultima operazione di `sync`. Questi file sono identificati dal loro timestamp, ignorando il loro nome e la directory, e vengono utilizzati nel processo di recupero se necessario. Se alcuni di essi sono stati spostati al di fuori dell'array, è possibile utilizzare l'opzione -i, --import per specificare directory aggiuntive da scansionare. I file sono identificati solo dal percorso, non dall'inode. Il file `content` NON viene modificato. I file `parity` vengono modificati se necessario. I file nell'array vengono modificati se necessario. check Verifica tutti i file e i dati di parità. Funziona come `fix`, ma simula solo un recupero e nessuna modifica viene scritta nell'array. Questo comando è destinato principalmente alla verifica manuale, ad esempio dopo un processo di recupero o in altre condizioni speciali. Per i controlli periodici e pianificati, utilizzare `scrub`. Se si utilizza l'opzione -a, --audit-only, viene controllato solo l'hash dei file e i dati di parità vengono ignorati per un'esecuzione piÚ veloce. I file sono identificati solo dal percorso, non dall'inode. Nulla viene modificato. list Elenca tutti i file contenuti nell'array al momento dell'ultimo `sync`. Con -v o --verbose, viene mostrato anche il tempo sotto il secondo. Nulla viene modificato. dup Elenca tutti i file duplicati. Due file sono considerati uguali se i loro hash corrispondono. I dati del file non vengono letti; vengono utilizzati solo gli hash precalcolati. Nulla viene modificato. pool Crea o aggiorna una vista virtuale di tutti i file nell'array di dischi nella directory di `pooling`. I file non vengono copiati ma collegati utilizzando collegamenti simbolici. Durante l'aggiornamento, tutti i collegamenti simbolici esistenti e le sottodirectory vuote vengono eliminati e sostituiti con la nuova vista dell'array. Qualsiasi altro file regolare viene lasciato al suo posto. Nulla viene modificato al di fuori della directory pool. devices Stampa i dispositivi di basso livello utilizzati dall'array. Questo comando visualizza le associazioni dei dispositivi nell'array ed è principalmente destinato come interfaccia script. Le prime due colonne sono l'ID e il percorso del dispositivo di basso livello. Le due colonne successive sono l'ID e il percorso del dispositivo di alto livello. L'ultima colonna è il nome del disco nell'array. Nella maggior parte dei casi, si ha un dispositivo di basso livello per ogni disco nell'array, ma in alcune configurazioni piÚ complesse, si potrebbe avere piÚ dispositivi di basso livello utilizzati da un singolo disco nell'array. Nulla viene modificato. touch Imposta un timestamp arbitrario sotto il secondo per tutti i file che lo hanno impostato a zero. Questo migliora la capacità di SnapRAID di riconoscere i file spostati e copiati, poichÊ rende il timestamp quasi unico, riducendo possibili duplicati. PiÚ specificamente, se il timestamp sotto il secondo non è zero, un file spostato o copiato viene identificato come tale se corrisponde al nome, alle dimensioni e al timestamp. Se il timestamp sotto il secondo è zero, è considerato una copia solo se il percorso completo, le dimensioni e il timestamp corrispondono tutti. Il timestamp di precisione al secondo non viene modificato, quindi tutte le date e gli orari dei file saranno conservati. rehash Pianifica un rehash dell'intero array. Questo comando cambia il tipo di hash utilizzato, in genere quando si esegue l'aggiornamento da un sistema a 32 bit a uno a 64 bit, per passare da MurmurHash3 al piÚ veloce SpookyHash. Se si sta già utilizzando l'hash ottimale, questo comando non fa nulla e informa che non è necessaria alcuna azione. Il rehash non viene eseguito immediatamente ma avviene progressivamente durante `sync` e `scrub`. È possibile controllare lo stato del rehash utilizzando `status`. Durante il rehash, SnapRAID mantiene la piena funzionalità, con l'unica eccezione che `dup` non è in grado di rilevare file duplicati utilizzando un hash diverso. locate Individua i file memorizzati nei dischi di parità. Per ogni file corrispondente, stampa la sua posizione all'interno del file di parità e il numero di frammenti che occupa. È possibile utilizzare l'opzione -t, --tail per limitare l'operazione ai file che occupano la porzione di coda specificata della parità. Se si desidera riallocare questi file, è possibile utilizzare l'opzione -W, --force-realloc-tail. Si tenga presente che tali file non saranno protetti dalla parità durante il processo di riallocazione. Opzioni SnapRAID fornisce le seguenti opzioni: -c, --conf CONFIG Seleziona il file di configurazione da utilizzare. Se non specificato, in Unix utilizza il file `/usr/local/etc/snapraid.conf` se esiste, altrimenti `/etc/snapraid.conf`. In Windows, utilizza il file `snapraid.conf` nella stessa directory di `snapraid.exe`. -f, --filter PATTERN Filtra i file da elaborare in `check` e `fix`. Vengono elaborati solo i file che corrispondono al modello specificato. Questa opzione puÃ˛ essere utilizzata piÚ volte. Vedere la sezione PATTERN per maggiori dettagli sulle specifiche del modello. In Unix, assicurarsi che i caratteri di globbing siano citati se usati. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. Non puÃ˛ essere utilizzata con `sync` e `scrub`, poichÊ elaborano sempre l'intero array. -d, --filter-disk NAME Filtra i dischi da elaborare in `check`, `fix`, `up` e `down`. È necessario specificare un nome di disco come definito nel file di configurazione. È anche possibile specificare i dischi di parità con i nomi: `parity`, `2-parity`, `3-parity`, ecc., per limitare le operazioni a un disco di parità specifico. Se si combinano piÚ opzioni --filter, --filter-disk e --filter-missing, vengono selezionati solo i file che corrispondono a tutti i filtri. Questa opzione puÃ˛ essere utilizzata piÚ volte. Questa opzione puÃ˛ essere utilizzata solo con `check`, `fix`, `up` e `down`. Non puÃ˛ essere utilizzata con `sync` e `scrub`, poichÊ elaborano sempre l'intero array. -m, --filter-missing Filtra i file da elaborare in `check` e `fix`. Vengono elaborati solo i file mancanti o eliminati dall'array. Quando usato con `fix`, questo agisce come un comando di `undelete` (annullamento eliminazione). Se si combinano piÚ opzioni --filter, --filter-disk e --filter-missing, vengono selezionati solo i file che corrispondono a tutti i filtri. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. Non puÃ˛ essere utilizzata con `sync` e `scrub`, poichÊ elaborano sempre l'intero array. -e, --filter-error Elabora i file con errori in `check` e `fix`. Elabora solo i file che hanno blocchi contrassegnati con errori silenti o di input/output durante `sync` e `scrub`, come elencato in `status`. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. -p, --plan PERC|bad|new|full Seleziona il piano di scrub. Se PERC è un valore numerico da 0 a 100, viene interpretato come la percentuale di blocchi da sottoporre a scrub. Invece di una percentuale, è possibile specificare un piano: `bad` esegue lo scrub dei blocchi bad, `new` esegue lo scrub dei blocchi non ancora sottoposti a scrub, e `full` esegue lo scrub di tutto. Questa opzione puÃ˛ essere utilizzata solo con `scrub`. -o, --older-than DAYS Seleziona la parte piÚ vecchia dell'array da elaborare in `scrub`. DAYS è l'età minima in giorni per un blocco da sottoporre a scrub; il valore predefinito è 10. I blocchi contrassegnati come bad vengono sempre sottoposti a scrub indipendentemente da questa opzione. Questa opzione puÃ˛ essere utilizzata solo con `scrub`. -a, --audit-only In `check`, verifica l'hash dei file senza controllare i dati di parità. Se si è interessati solo al controllo dei dati del file, questa opzione puÃ˛ velocizzare significativamente il processo di controllo. Questa opzione puÃ˛ essere utilizzata solo con `check`. -h, --pre-hash In `sync`, esegue una fase preliminare di hashing di tutti i nuovi dati per una verifica aggiuntiva prima del calcolo della parità. Di solito, in `sync`, non viene eseguito alcun hashing preliminare e i nuovi dati vengono sottoposti a hash subito prima del calcolo della parità quando vengono letti per la prima volta. Questo processo si verifica quando il sistema è sotto carico pesante, con tutti i dischi che girano e una CPU occupata. Questa è una condizione estrema per la macchina e, se presenta un problema hardware latente, gli errori silenti potrebbero non essere rilevati perchÊ i dati non sono ancora stati sottoposti a hash. Per evitare questo rischio, è possibile abilitare la modalità `pre-hash` per far leggere tutti i dati due volte per garantirne l'integrità. Questa opzione verifica anche i file spostati all'interno dell'array per garantire che l'operazione di spostamento sia andata a buon fine e, se necessario, consente di eseguire un'operazione di fix prima di procedere. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -i, --import DIR Importa dalla directory specificata tutti i file eliminati dall'array dopo l'ultimo `sync`. Se si hanno ancora tali file, possono essere utilizzati da `check` e `fix` per migliorare il processo di recupero. I file vengono letti, anche nelle sottodirectory, e sono identificati indipendentemente dal loro nome. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. -s, --spin-down-on-error In caso di errore, ferma (spin down) tutti i dischi gestiti prima di uscire con un codice di stato non zero. CiÃ˛ impedisce alle unità di rimanere attive e in rotazione dopo un'operazione interrotta, contribuendo a evitare inutili accumuli di calore e consumo di energia. Utilizzare questa opzione per garantire che i dischi siano arrestati in modo sicuro anche in caso di errore di un comando. -w, --bw-limit RATE Applica un limite di larghezza di banda globale per tutti i dischi. RATE è il numero di byte al secondo. È possibile specificare un moltiplicatore come K, M, G o T (ad esempio, --bw-limit 1G). -t, --tail DIMENSIONE Limita l'elenco dei file a quelli che non utilizzano piÚ della dimensione di coda specificata dei dischi di parità. È possibile utilizzare moltiplicatori come K, M, G o T (ad es. --tail 1G). Questa opzione è valida solo se utilizzata insieme al comando `locate`. -A, --stats Abilita una vista dello stato estesa che mostra informazioni aggiuntive. La schermata visualizza due grafici: Il primo grafico mostra il numero di stripe bufferizzate per ciascun disco, insieme al percorso del file attualmente acceduto su quel disco. In genere, il disco piÚ lento non avrà buffer disponibile, il che determina la larghezza di banda massima raggiungibile. Il secondo grafico mostra la percentuale di tempo trascorso in attesa negli ultimi 100 secondi. Si prevede che il disco piÚ lento causi la maggior parte del tempo di attesa, mentre gli altri dischi dovrebbero avere poco o nessun tempo di attesa perchÊ possono utilizzare le loro stripe bufferizzate. Questo grafico mostra anche il tempo trascorso in attesa per i calcoli di hash e i calcoli RAID. Tutti i calcoli vengono eseguiti in parallelo con le operazioni su disco. Pertanto, finchÊ c'è un tempo di attesa misurabile per almeno un disco, ciÃ˛ indica che la CPU è abbastanza veloce da tenere il passo con il carico di lavoro. -Z, --force-zero Forza l'operazione non sicura di sincronizzazione di un file con dimensione zero che in precedenza era non zero. Se SnapRAID rileva una tale condizione, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare facilmente quando, dopo un arresto anomalo del sistema, alcuni file a cui si è acceduto sono stati troncati. Questa è una possibile condizione in Linux con i file system ext3/ext4. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -E, --force-empty Forza l'operazione non sicura di sincronizzazione di un disco con tutti i file originali mancanti. Se SnapRAID rileva che tutti i file originariamente presenti sul disco sono mancanti o riscritti, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare facilmente quando un file system di dati non è montato. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -U, --force-uuid Forza l'operazione non sicura di sincronizzazione, controllo e correzione con dischi che hanno cambiato il loro UUID. Se SnapRAID rileva che alcuni dischi hanno cambiato UUID, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare quando i dischi sono montati sui punti di montaggio sbagliati. Tuttavia, è consentito avere un singolo cambio di UUID con parità singola e di piÚ con parità multipla, perchÊ questo è il caso normale quando si sostituiscono i dischi dopo un recupero. Questa opzione puÃ˛ essere utilizzata solo con `sync`, `check` o `fix`. -D, --force-device Forza l'operazione non sicura di correzione con dischi inaccessibili o con dischi sullo stesso dispositivo fisico. Ad esempio, se si sono persi due dischi dati e si ha un disco di riserva per recuperare solo il primo, è possibile ignorare il secondo disco inaccessibile. Oppure, se si desidera recuperare un disco nello spazio libero rimasto su un disco già utilizzato, condividendo lo stesso dispositivo fisico. Questa opzione puÃ˛ essere utilizzata solo con `fix`. -N, --force-nocopy In `sync`, `check` e `fix`, disabilita l'euristica di rilevamento della copia. Senza questa opzione, SnapRAID presume che i file con gli stessi attributi, come nome, dimensione e timestamp, siano copie con gli stessi dati. CiÃ˛ consente l'identificazione di file copiati o spostati da un disco all'altro e riutilizza le informazioni di hash già calcolate per rilevare errori silenti o per recuperare file mancanti. In alcuni rari casi, questo comportamento puÃ˛ comportare falsi positivi o un processo lento a causa di molte verifiche di hash, e questa opzione consente di risolvere tali problemi. Questa opzione puÃ˛ essere utilizzata solo con `sync`, `check` e `fix`. -F, --force-full In `sync`, forza un ricalcolo completo della parità. Questa opzione puÃ˛ essere utilizzata quando si aggiunge un nuovo livello di parità o se si è tornati a un vecchio file di contenuto utilizzando dati di parità piÚ recenti. Invece di ricreare la parità da zero, questo consente di riutilizzare gli hash presenti nel file di contenuto per convalidare i dati e mantenere la protezione dei dati durante il processo `sync` utilizzando i dati di parità esistenti. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -R, --force-realloc In `sync`, forza una riallocazione completa dei file e la ricostruzione della parità. Questa opzione puÃ˛ essere utilizzata per riallocare completamente tutti i file, rimuovendo la frammentazione, riutilizzando gli hash presenti nel file di contenuto per convalidare i dati. Questa opzione puÃ˛ essere utilizzata solo con `sync`. ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato utilizzarla. NON si ha protezione dei dati durante l'operazione `sync`. -W, --force-realloc-tail DIMENSIONE Funziona come -R, --force-realloc, ma limitatamente alla porzione di coda specificata (ultimi DIMENSIONE byte) di ogni file di parità. Forza la riallocazione (spostamento) di qualsiasi frammento/blocco di file attualmente memorizzato in quella sezione di coda, consentendo loro di essere posizionati ovunque nei file di parità dove sia disponibile spazio libero (inclusi i buchi esistenti). Lo scopo principale di questa opzione è ridurre la dimensione su disco del file di parità. Se la riallocazione svuota con successo l'intera sezione di coda (non rimangono blocchi che la utilizzano), il file di parità viene troncato, recuperando lo spazio di coda inutilizzato. È possibile utilizzare moltiplicatori come K, M, G o T (ad es. --force-realloc-tail 1G). È possibile utilizzare locate -t, --tail per conoscere in anticipo i file interessati. ATTENZIONE! Questa opzione è solo per esperti ed è caldamente raccomandato di non usarla. NON si ha protezione dei dati durante l'operazione di `sync` per i file interessati. -l, --log FILE Scrive un log dettagliato nel file specificato. Se questa opzione non è specificata, gli errori imprevisti vengono stampati sullo schermo, potenzialmente resulting in un output eccessivo in caso di molti errori. Quando -l, --log è specificato, vengono stampati sullo schermo solo gli errori fatali che causano l'arresto di SnapRAID. Se il percorso inizia con `>>`, il file viene aperto in modalità append. Le occorrenze di `%D` e `%T` nel nome vengono sostituite con la data e l'ora nel formato YYYYMMDD e HHMMSS. Nei file batch di Windows, è necessario raddoppiare il carattere `%`, ad esempio result-%%D.log. Per utilizzare `>>`, è necessario racchiudere il nome tra virgolette, ad esempio `">>result.log"`. Per indirizzare l'output del log all'output standard o all'errore standard, è possibile utilizzare `">&1"` e `">&2"`, rispettivamente. Vedere il file snapraid_log.txt o la pagina man per le descrizioni dei tag di log. -L, --error-limit NUMBER Imposta un nuovo limite di errore prima di interrompere l'esecuzione. Per impostazione predefinita, SnapRAID si interrompe se incontra piÚ di 100 errori di input/output, indicando che un disco sta probabilmente fallendo. Questa opzione influisce su `sync` e `scrub`, a cui è consentito continuare dopo il primo set di errori del disco per cercare di completare le loro operazioni. Tuttavia, `check` e `fix` si interrompono sempre al primo errore. -S, --start BLKSTART Avvia l'elaborazione dal numero di blocco specificato. CiÃ˛ puÃ˛ essere utile per riprovare a controllare o correggere blocchi specifici in caso di disco danneggiato. Questa opzione è principalmente per il recupero manuale avanzato. -B, --count BLKCOUNT Elabora solo il numero specificato di blocchi. Questa opzione è principalmente per il recupero manuale avanzato. -C, --gen-conf CONTENT Genera un file di configurazione fittizio da un file di contenuto esistente. Il file di configurazione viene scritto nell'output standard e non sovrascrive uno esistente. Questo file di configurazione contiene anche le informazioni necessarie per ricostruire i punti di montaggio del disco nel caso in cui si perda l'intero sistema. -v, --verbose Stampa piÚ informazioni sullo schermo. Se specificato una volta, stampa i file esclusi e statistiche aggiuntive. Questa opzione non ha effetto sui file di log. -q, --quiet Stampa meno informazioni sullo schermo. Se specificato una volta, rimuove la barra di avanzamento; due volte, le operazioni in corso; tre volte, i messaggi di informazione; quattro volte, i messaggi di stato. Gli errori fatali vengono sempre stampati sullo schermo. Questa opzione non ha effetto sui file di log. -H, --help Stampa una breve schermata di aiuto. -V, --version Stampa la versione del programma. Configurazione SnapRAID richiede un file di configurazione per sapere dove si trova l'array di dischi e dove memorizzare le informazioni di parità. In Unix, utilizza il file `/usr/local/etc/snapraid.conf` se esiste, altrimenti `/etc/snapraid.conf`. In Windows, utilizza il file `snapraid.conf` nella stessa directory di `snapraid.exe`. Deve contenere le seguenti opzioni (sensibili al maiuscolo/minuscolo): parity FILE [,FILE] ... Definisce i file da utilizzare per memorizzare le informazioni di parità. La parità consente la protezione da un singolo guasto del disco, simile a RAID5. È possibile specificare piÚ file, che devono essere su dischi diversi. Quando un file non puÃ˛ piÚ crescere, viene utilizzato il successivo. Lo spazio totale disponibile deve essere almeno grande quanto il disco dati piÚ grande dell'array. È possibile aggiungere file di parità aggiuntivi in seguito, ma non è possibile riordinarli o rimuoverli. Mantenere i dischi di parità riservati alla parità garantisce che non diventino frammentati, migliorando le prestazioni. In Windows, 256 MB vengono lasciati inutilizzati su ogni disco per evitare l'avviso sui dischi pieni. Questa opzione è obbligatoria e puÃ˛ essere utilizzata solo una volta. (2,3,4,5,6)-parity FILE [,FILE] ... Definisce i file da utilizzare per memorizzare informazioni di parità extra. Per ogni livello di parità specificato, è abilitato un livello aggiuntivo di protezione: * 2-parity abilita la doppia parità RAID6. * 3-parity abilita la tripla parità. * 4-parity abilita la parità quadrupla. * 5-parity abilita la parità quintupla. * 6-parity abilita la parità esapla. Ogni livello di parità richiede la presenza di tutti i livelli di parità precedenti. Si applicano le stesse considerazioni dell'opzione `parity`. Queste opzioni sono facoltative e possono essere utilizzate solo una volta. z-parity FILE [,FILE] ... Definisce un file e un formato alternativi per memorizzare la tripla parità. Questa opzione è un'alternativa a `3-parity`, destinata principalmente a CPU di fascia bassa come ARM o AMD Phenom, Athlon e Opteron che non supportano il set di istruzioni SSSE3. In tali casi, fornisce prestazioni migliori. Questo formato è simile ma piÚ veloce di quello utilizzato da ZFS RAIDZ3. Come ZFS, non funziona oltre la tripla parità. Quando si utilizza `3-parity`, si verrà avvisati se è consigliato utilizzare il formato `z-parity` per un miglioramento delle prestazioni. È possibile convertire da un formato all'altro regolando il file di configurazione con il file z-parity o 3-parity desiderato e utilizzando `fix` per ricrearlo. content FILE Definisce il file da utilizzare per memorizzare l'elenco e i checksum di tutti i file presenti nell'array di dischi. PuÃ˛ essere posizionato su un disco utilizzato per dati, parità o qualsiasi altro disco disponibile. Se si utilizza un disco dati, questo file viene automaticamente escluso dal processo `sync`. Questa opzione è obbligatoria e puÃ˛ essere utilizzata piÚ volte per salvare piÚ copie dello stesso file. È necessario memorizzare almeno una copia per ogni disco di parità utilizzato piÚ uno. L'utilizzo di copie aggiuntive non è dannoso. data NAME DIR Definisce il nome e il punto di montaggio dei dischi dati nell'array. NAME viene utilizzato per identificare il disco e deve essere unico. DIR è il punto di montaggio del disco nel file system. È possibile cambiare il punto di montaggio secondo necessità, purchÊ si mantenga fisso NAME. È necessario utilizzare un'opzione per ogni disco dati nell'array. È possibile rinominare un disco in seguito modificando NAME direttamente nel file di configurazione e quindi eseguendo un comando `sync`. In caso di ridenominazione, l'associazione viene eseguita utilizzando l'UUID memorizzato dei dischi. extra NAME DIR Definisce il nome e il punto di montaggio di dischi aggiuntivi da monitorare con i comandi `smart` e `probe`. Questo è utile per monitorare i dischi che non fanno parte dell' array ma sono necessari per il funzionamento del sistema, come il disco di avvio. Si noti che tali dischi non sono influenzati dai comandi `up` e `down` perchÊ si prevede che siano sempre in rotazione. nohidden Esclude tutti i file e le directory nascosti. In Unix, i file nascosti sono quelli che iniziano con `.`. In Windows, sono quelli con l'attributo nascosto. exclude/include PATTERN Definisce i modelli di file o directory da escludere o includere nel processo di sync. Tutti i modelli vengono elaborati nell'ordine specificato. Se il primo modello che corrisponde è un `exclude`, il file viene escluso. Se è un `include`, il file viene incluso. Se nessun modello corrisponde, il file viene escluso se l'ultimo modello specificato è un `include`, o incluso se l'ultimo modello specificato è un `exclude`. Vedere la sezione PATTERN per maggiori dettagli sulle specifiche del modello. Questa opzione puÃ˛ essere utilizzata piÚ volte. blocksize SIZE_IN_KIBIBYTES Definisce la dimensione di blocco di base in kibibyte per la parità. Un kibibyte è 1024 byte. La dimensione di blocco predefinita è 256, che dovrebbe funzionare nella maggior parte dei casi. ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato modificare questo valore. Per modificare questo valore in futuro, sarà necessario ricreare l'intera parità! Un motivo per utilizzare una dimensione di blocco diversa è se si hanno molti file piccoli, nell'ordine dei milioni. Per ogni file, anche se solo pochi byte, viene allocato un intero blocco di parità e, con molti file, ciÃ˛ puÃ˛ comportare uno spazio di parità inutilizzato significativo. Quando si riempie completamente il disco di parità, non è consentito aggiungere altri file ai dischi dati. Tuttavia, la parità sprecata non si accumula tra i dischi dati. Lo spazio sprecato risultante da un numero elevato di file su un disco dati limita solo la quantità di dati su quel disco dati, non gli altri. Come approssimazione, si puÃ˛ presumere che metà della dimensione del blocco sia sprecata per ogni file. Ad esempio, con 100.000 file e una dimensione di blocco di 256 KiB, si sprecheranno 12,8 GB di parità, il che puÃ˛ comportare 12,8 GB in meno di spazio disponibile sul disco dati. È possibile controllare la quantità di spazio sprecato su ogni disco utilizzando `status`. Questa è la quantità di spazio che è necessario lasciare libero sui dischi dati o utilizzare per i file non inclusi nell'array. Se questo valore è negativo, significa che si è vicini a riempire la parità e rappresenta lo spazio che è ancora possibile sprecare. Per evitare questo problema, è possibile utilizzare una partizione piÚ grande per la parità. Ad esempio, se la partizione di parità è 12,8 GB piÚ grande dei dischi dati, si ha abbastanza spazio extra per gestire fino a 100.000 file su ogni disco dati senza alcuno spreco di spazio. Un trucco per ottenere una partizione di parità piÚ grande in Linux è formattarla con il comando: :mkfs.ext4 -m 0 -T largefile4 DEVICE CiÃ˛ si traduce in circa l'1,5% di spazio extra, circa 60 GB per un disco da 4 TB, che consente circa 460.000 file su ogni disco dati senza alcuno spreco di spazio. hashsize SIZE_IN_BYTES Definisce la dimensione dell'hash in byte per i blocchi salvati. La dimensione di hash predefinita è 16 byte (128 bit), che dovrebbe funzionare nella maggior parte dei casi. ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato modificare questo valore. Per modificare questo valore in futuro, sarà necessario ricreare l'intera parità! Un motivo per utilizzare una dimensione di hash diversa è se il sistema ha memoria limitata. Come regola generale, SnapRAID tipicamente richiede 1 GiB di RAM per ogni 16 TB di dati nell'array. Nello specifico, per memorizzare gli hash dei dati, SnapRAID richiede circa $TS*(1+HS)/BS$ byte di RAM, dove $TS$ è la dimensione totale in byte dell'array di dischi, $BS$ è la dimensione del blocco in byte e $HS$ è la dimensione dell'hash in byte. Ad esempio, con 8 dischi da 4 TB, una dimensione di blocco di 256 KiB ($1 \text{ KiB} = 1024 \text{ byte}$) e una dimensione di hash di 16, si ottiene: :RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93 \text{ GiB}$ Passando a una dimensione di hash di 8, si ottiene: :RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02 \text{ GiB}$ Passando a una dimensione di blocco di 512, si ottiene: :RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96 \text{ GiB}$ Passando sia a una dimensione di hash di 8 che a una dimensione di blocco di 512, si ottiene: :RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51 \text{ GiB}$ autosave SIZE_IN_GIGABYTES Salva automaticamente lo stato durante la sincronizzazione o lo scrubbing dopo la quantità specificata di GB elaborati. Questa opzione è utile per evitare di riavviare lunghi comandi `sync` da zero se interrotti da un arresto anomalo della macchina o qualsiasi altro evento. temp_limit TEMPERATURE_CELSIUS Imposta la temperatura massima del disco consentita in Celsius. Se specificato, SnapRAID controlla periodicamente la temperatura di tutti i dischi utilizzando lo strumento smartctl. Le temperature attuali dei dischi vengono visualizzate mentre SnapRAID è in funzione. Se un disco supera questo limite, tutte le operazioni si interrompono e i dischi vengono messi in stand-by (spin down) per la durata definita dall'opzione `temp_sleep`. Dopo il periodo di sonno, le operazioni riprendono, potenzialmente mettendosi in pausa di nuovo se il limite di temperatura viene raggiunto ancora una volta. Durante il funzionamento, SnapRAID analizza anche la curva di riscaldamento di ciascun disco e stima la temperatura costante a lungo termine che dovrebbero raggiungere se l'attività continua. La stima viene eseguita solo dopo che la temperatura del disco è aumentata quattro volte, garantendo che siano disponibili abbastanza punti dati per stabilire una tendenza affidabile. Questa temperatura costante prevista è mostrata tra parentesi accanto al valore attuale e aiuta a valutare se il raffreddamento del sistema è adeguato. Questa temperatura stimata è solo a scopo informativo e non ha alcun effetto sul comportamento di SnapRAID. Le azioni del programma si basano esclusivamente sulle temperature effettive misurate del disco. Per eseguire questa analisi, SnapRAID necessita di un riferimento per la temperatura del sistema. Tenta prima di leggerla dai sensori hardware disponibili. Se non è possibile accedere a nessun sensore di sistema, utilizza la temperatura del disco piÚ bassa misurata all'inizio dell'esecuzione come riferimento di riserva. Normalmente, SnapRAID mostra solo la temperatura del disco piÚ caldo. Per visualizzare la temperatura di tutti i dischi, utilizzare l'opzione -A o --stats. temp_sleep TIME_IN_MINUTES Imposta il tempo di stand-by, in minuti, quando il limite di temperatura viene raggiunto. Durante questo periodo, i dischi rimangono fermi (spin down). Il valore predefinito è 5 minuti. pool DIR Definisce la directory di pooling in cui viene creata la vista virtuale dell'array di dischi utilizzando il comando `pool`. La directory deve già esistere. share UNC_DIR Definisce il percorso UNC di Windows necessario per accedere ai dischi da remoto. Se questa opzione è specificata, i collegamenti simbolici creati nella directory pool utilizzano questo percorso UNC per accedere ai dischi. Senza questa opzione, i collegamenti simbolici generati utilizzano solo percorsi locali, il che non consente la condivisione della directory pool sulla rete. I collegamenti simbolici sono formati utilizzando il percorso UNC specificato, aggiungendo il nome del disco come specificato nell'opzione `data` e infine aggiungendo la directory e il nome del file. Questa opzione è richiesta solo per Windows. smartctl DISK/PARITY OPTIONS... Definisce opzioni smartctl personalizzate per ottenere gli attributi SMART per ogni disco. CiÃ˛ potrebbe essere richiesto per controller RAID e alcuni dischi USB che non possono essere rilevati automaticamente. Il segnaposto %s viene sostituito dal nome del dispositivo, ma è facoltativo per dispositivi fissi come i controller RAID. DISK è lo stesso nome del disco specificato nell'opzione `data`. PARITY è uno dei nomi di parità: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. Nelle OPTIONS specificate, la stringa `%s` viene sostituita dal nome del dispositivo. Per i controller RAID, il dispositivo è probabilmente fisso e potrebbe non essere necessario utilizzare `%s`. Fare riferimento alla documentazione di smartmontools per le possibili opzioni: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices Ad esempio: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignora l'attributo SMART specificato durante il calcolo della probabilità di guasto del disco. Questa opzione è utile se un disco segnala valori insoliti o fuorvianti per un particolare attributo. DISK è lo stesso nome del disco specificato nell'opzione `data`. PARITY è uno dei nomi di parità: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. Il valore speciale * puÃ˛ essere utilizzato per ignorare l'attributo su tutti i dischi. Ad esempio, per ignorare l'attributo `Current Pending Sector Count` su tutti i dischi: :smartignore * 197 Per ignorarlo solo sul primo disco di parità: :smartignore parity 197 Esempi Un esempio di configurazione tipica per Unix è: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Un esempio di configurazione tipica per Windows è: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern I pattern offrono un modo flessibile per filtrare i file da includere o escludere. Usando i caratteri globbing, è possibile definire regole che corrispondano a nomi di file specifici o a intere strutture di directory senza elencare manualmente ogni percorso. Il punto interrogativo `?` corrisponde a qualsiasi carattere singolo eccetto il separatore di directory. Questo lo rende utile per far corrispondere nomi di file con caratteri variabili mantenendo il pattern confinato a un singolo livello di directory. L'asterisco singolo `*` corrisponde a qualsiasi sequenza di caratteri, ma come il punto interrogativo, non attraversa mai i confini delle directory. Si ferma allo slash in avanti, rendendolo adatto per la corrispondenza all'interno di un singolo componente del percorso. Questo è il comportamento standard dei wildcard familiare dal globbing della shell. Il doppio asterisco `**` è piÚ potente, corrisponde a qualsiasi sequenza di caratteri inclusi i separatori di directory. CiÃ˛ consente ai pattern di corrispondere attraverso piÚ livelli di directory. Quando `**` appare inserito direttamente in un pattern, puÃ˛ corrispondere a zero o piÚ caratteri inclusi gli slash tra il testo letterale circostante. L'uso piÚ importante di `**` è nella forma speciale `/**/`. Questa corrisponde a zero o piÚ livelli di directory completi, rendendo possibile la corrispondenza di file a qualsiasi profondità in un albero di directory senza conoscere l'esatta struttura del percorso. Per esempio, il pattern `src/**/main.js` corrisponde a `src/main.js` (saltando zero directory), `src/ui/main.js` (saltando una directory), e `src/ui/components/main.js` (saltando due directory). Le classi di caratteri che usano le parentesi quadre `[]` corrispondono a un singolo carattere da un set o intervallo specificato. Come gli altri pattern a carattere singolo, esse non corrispondono ai separatori di directory. Le classi supportano intervalli e la negazione usando un punto esclamativo. La distinzione fondamentale da ricordare è che `*`, `?` e le classi di caratteri rispettano tutti i confini delle directory e corrispondono solo all'interno di un singolo componente del percorso, mentre `**` è l'unico pattern che puÃ˛ corrispondere attraverso i separatori di directory. Esistono quattro diversi tipi di pattern: =FILE Seleziona qualsiasi file chiamato FILE. Questo pattern si applica solo ai file, non alle directory. =DIR/ Seleziona qualsiasi directory chiamata DIR e tutto ciÃ˛ che contiene. Questo pattern si applica solo alle directory, non ai file. =/PATH/FILE Seleziona l'esatto percorso del file specificato. Questo pattern si applica solo ai file, non alle directory. =/PATH/DIR/ Seleziona l'esatto percorso della directory specificata e tutto ciÃ˛ che contiene. Questo pattern si applica solo alle directory, non ai file. Quando si specifica un percorso assoluto che inizia con /, viene applicato alla directory radice dell'array, non alla directory radice del file system locale. In Windows, è possibile utilizzare il backslash \ invece dello slash in avanti /. Le directory di sistema di Windows, le junction, i punti di montaggio e altre directory speciali di Windows sono trattati come file, il che significa che per escluderli, è necessario utilizzare una regola di file, non una di directory. Se il nome del file contiene un carattere `*`, `?`, `[` o `]`, è necessario eseguirne l'escape per evitare che venga interpretato come un carattere di globbing. In Unix, il carattere di escape è `\`; in Windows, è `^`. Quando il pattern è sulla riga di comando, è necessario raddoppiare il carattere di escape per evitare che venga interpretato dalla shell dei comandi. Nel file di configurazione, è possibile utilizzare diverse strategie per filtrare i file da elaborare. L'approccio piÚ semplice è utilizzare solo regole `exclude` per rimuovere tutti i file e le directory che non si desidera elaborare. Ad esempio: :# Esclude qualsiasi file denominato `*.unrecoverable` :exclude *.unrecoverable :# Esclude la directory radice `/lost+found` :exclude /lost+found/ :# Esclude qualsiasi sottodirectory denominata `tmp` :exclude tmp/ L'approccio opposto è definire solo i file che si desidera elaborare, utilizzando solo regole `include`. Ad esempio: :# Include solo alcune directory :include /movies/ :include /musics/ :include /pictures/ L'approccio finale è mescolare regole `exclude` e `include`. In questo caso, l'ordine delle regole è importante. Le regole precedenti hanno la precedenza su quelle successive. Per semplificare, è possibile elencare prima tutte le regole `exclude` e poi tutte le regole `include`. Ad esempio: :# Esclude qualsiasi file denominato `*.unrecoverable` :exclude *.unrecoverable :# Esclude qualsiasi sottodirectory denominata `tmp` :exclude tmp/ :# Include solo alcune directory :include /movies/ :include /musics/ :include /pictures/ Sulla riga di comando, utilizzando l'opzione -f, è possibile utilizzare solo pattern `include`. Ad esempio: :# Controlla solo i file .mp3. :# In Unix, utilizzare le virgolette per evitare l'espansione :# del globbing da parte della shell. :snapraid -f "*.mp3" check In Unix, quando si utilizzano caratteri di globbing sulla riga di comando, è necessario citarli per impedire alla shell di espanderli. Ignore File In aggiunta alle regole globali nel file di configurazione, è possibile inserire file `.snapraidignore` in qualsiasi directory all'interno dell'array per definire regole di esclusione decentralizzate. Le regole definite in `.snapraidignore` vengono applicate dopo le regole nel file di configurazione. CiÃ˛ significa che hanno una priorità piÚ alta e possono essere utilizzate per escludere file che erano stati precedentemente inclusi dalla configurazione globale. In pratica, se una regola locale corrisponde, il file viene escluso indipendentemente dalle impostazioni di inclusione globali. La logica dei pattern in `.snapraidignore` rispecchia la configurazione globale ma ancora i pattern alla directory in cui si trova il file: =FILE Seleziona qualsiasi file chiamato FILE in questa directory o sotto di essa. Segue le stesse regole di globbing del pattern globale. =DIR/ Seleziona qualsiasi directory chiamata DIR e tutto ciÃ˛ che contiene, che risieda in questa directory o sotto di essa. =/PATH/FILE Seleziona l'esatto file specificato relativo alla posizione del file `.snapraidignore`. =/PATH/DIR/ Seleziona l'esatta directory specificata e tutto ciÃ˛ che contiene, relativa alla posizione del file `.snapraidignore`. A differenza della configurazione globale, i file `.snapraidignore` supportano solo regole di esclusione; non è possibile utilizzare pattern `include` o negazioni (!). Ad esempio, se hai un `.snapraidignore` in `/mnt/disk1/projects/`: :# Esclude SOLO /mnt/disk1/projects/output.bin :/output.bin :# Esclude qualsiasi directory chiamata `build` all'interno di projects/ :build/ :# Esclude qualsiasi file .tmp all'interno di projects/ o delle sue sottocartelle :*.tmp Content SnapRAID memorizza l'elenco e i checksum dei file nel file di contenuto. È un file binario che elenca tutti i file presenti nell'array di dischi, insieme a tutti i checksum per verificarne l'integrità. Questo file viene letto e scritto dai comandi `sync` e `scrub` e letto dai comandi `fix`, `check` e `status`. Parity SnapRAID memorizza le informazioni di parità dell'array nei file di parità. Questi sono file binari contenenti la parità calcolata di tutti i blocchi definiti nel file `content`. Questi file vengono letti e scritti dai comandi `sync` e `fix` e solo letti dai comandi `scrub` e `check`. Codifica SnapRAID in Unix ignora qualsiasi codifica. Legge e memorizza i nomi dei file con la stessa codifica utilizzata dal file system. In Windows, tutti i nomi letti dal file system vengono convertiti e elaborati in formato UTF-8. Per avere i nomi dei file stampati correttamente, è necessario impostare la console di Windows in modalità UTF-8 con il comando `chcp 65001` e utilizzare un carattere TrueType come `Lucida Console` come carattere della console. Questo influisce solo sui nomi dei file stampati; se si reindirizza l'output della console a un file, il file risultante è sempre in formato UTF-8. Copyright Questo file è Copyright (C) 2025 Andrea Mazzoleni Vedi Anche snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-it.txt000066400000000000000000002153201522717156100170030ustar00rootroot00000000000000 =================================== Backup SnapRAID per Array di Dischi =================================== 1 SINOSSI ========= snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIZIONE ============= SnapRAID è un programma di backup progettato per array di dischi, che memorizza informazioni di parità per il recupero dati in caso di guasto fino a sei dischi. Destinato principalmente a centri multimediali domestici con file grandi e che cambiano raramente, SnapRAID offre diverse funzionalità: * È possibile utilizzare dischi già pieni di file senza la necessità di riformattarli, accedendovi come al solito. * Tutti i dati sono sottoposti ad hashing per garantire l'integrità dei dati e prevenire la corruzione silente. * Quando il numero di dischi guasti supera il conteggio di parità, la perdita di dati è confinata ai dischi interessati; i dati sugli altri dischi rimangono accessibili. * Se si eliminano accidentalmente dei file su un disco, il recupero è possibile. * I dischi possono avere dimensioni diverse. * È possibile aggiungere dischi in qualsiasi momento. * SnapRAID non blocca i dati; è possibile smettere di usarlo in qualsiasi momento senza riformattare o spostare i dati. * Per accedere a un file, è necessario far girare solo un singolo disco, risparmiando energia e riducendo il rumore. Per maggiori informazioni, si prega di visitare il sito ufficiale SnapRAID: https://www.snapraid.it/ 3 LIMITAZIONI ============= SnapRAID è un ibrido tra un programma RAID e un programma di backup, che mira a combinare i migliori vantaggi di entrambi. Tuttavia, ha alcune limitazioni che si dovrebbero considerare prima di usarlo. La limitazione principale è che se un disco si guasta e non si è effettuato un sync di recente, potrebbe non essere possibile recuperare completamente. PiÚ specificamente, potrebbe non essere possibile recuperare fino alla dimensione dei file modificati o eliminati dall'ultima operazione di sync. CiÃ˛ accade anche se i file modificati o eliminati non si trovano sul disco guasto. Questo è il motivo per cui SnapRAID è piÚ adatto per dati che cambiano raramente. D'altra parte, i file appena aggiunti non impediscono il recupero dei file già esistenti. Si perderanno solo i file aggiunti di recente se si trovano sul disco guasto. Altre limitazioni di SnapRAID sono: * Con SnapRAID, si hanno ancora file system separati per ogni disco. Con RAID, si ottiene un unico grande file system. * SnapRAID non esegue lo striping dei dati. Con RAID, si ottiene un aumento di velocità con lo striping. * SnapRAID non supporta il recupero in tempo reale. Con RAID, non si deve smettere di lavorare quando un disco si guasta. * SnapRAID puÃ˛ recuperare i dati solo da un numero limitato di guasti del disco. Con un backup, è possibile recuperare da un guasto completo dell'intero array di dischi. * Vengono salvati solo nomi di file, timestamp, symlink e hardlink. Permessi, proprietà e attributi estesi non vengono salvati. 4 INIZIARE ========== Per usare SnapRAID, è necessario prima selezionare un disco nell'array di dischi da dedicare alle informazioni di `parity` (parità). Con un disco per la parità, si sarà in grado di recuperare da un singolo guasto del disco, in modo simile a RAID5. Se si desidera recuperare da piÚ guasti del disco, in modo simile a RAID6, è necessario riservare dischi aggiuntivi per la parità. Ogni disco di parità aggiuntivo consente il recupero da un guasto in piÚ del disco. Come dischi di parità, è necessario scegliere i dischi piÚ grandi dell'array, poichÊ le informazioni di parità possono crescere fino alle dimensioni del piÚ grande disco dati nell'array. Questi dischi saranno dedicati alla memorizzazione dei file di `parity`. Non si dovrebbero memorizzare i propri dati su di essi. Quindi, è necessario definire i dischi `data` (dati) che si desidera proteggere con SnapRAID. La protezione è piÚ efficace se questi dischi contengono dati che cambiano raramente. Per questo motivo, è meglio NON includere il disco C:\ di Windows o le directory Unix /home, /var, e /tmp. L'elenco dei file viene salvato nei file `content` (contenuto), di solito memorizzati sui dischi dati, di parità o di avvio. Questo file contiene i dettagli del backup, inclusi tutti i checksum per verificarne l'integrità. Il file `content` viene memorizzato in piÚ copie e ogni copia deve essere su un disco diverso per garantire che, anche in caso di guasti multipli del disco, sia disponibile almeno una copia. Ad esempio, supponiamo di essere interessati a un solo livello di protezione con parità e che i dischi si trovino in: /mnt/diskp <- disco selezionato per la parità /mnt/disk1 <- primo disco da proteggere /mnt/disk2 <- secondo disco da proteggere /mnt/disk3 <- terzo disco da proteggere È necessario creare il file di configurazione /etc/snapraid.conf con le seguenti opzioni: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Se si è su Windows, si dovrebbe usare il formato del percorso di Windows, con lettere di unità e backslash invece di slash. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Se si hanno molti dischi e si esauriscono le lettere di unità, è possibile montare i dischi direttamente nelle sottocartelle. Vedi: https://www.google.com/search?q=Windows+mount+point A questo punto, si è pronti per eseguire il comando `sync` per costruire le informazioni di parità. snapraid sync Questo processo puÃ˛ richiedere diverse ore la prima volta, a seconda delle dimensioni dei dati già presenti sui dischi. Se i dischi sono vuoti, il processo è immediato. È possibile interromperlo in qualsiasi momento premendo Ctrl+C e, alla prossima esecuzione, riprenderà da dove è stato interrotto. Quando questo comando è completato, i dati sono SICURI. Ora è possibile iniziare a usare l'array come si desidera e aggiornare periodicamente le informazioni di parità eseguendo il comando `sync`. 4.1 Scrubbing ------------- Per controllare periodicamente i dati e la parità per gli errori, è possibile eseguire il comando `scrub`. snapraid scrub Questo comando confronta i dati nell'array con l'hash calcolato durante il comando `sync` per verificarne l'integrità. Ogni esecuzione del comando controlla circa l'8% dell'array, escludendo i dati già sottoposti a scrub nei 10 giorni precedenti. È possibile utilizzare l'opzione -p, --plan per specificare un importo diverso e l'opzione -o, --older-than per specificare un'età diversa in giorni. Ad esempio, per controllare il 5% dell'array per blocchi piÚ vecchi di 20 giorni, usare: snapraid -p 5 -o 20 scrub Se vengono trovati errori silenti o di input/output durante il processo, i blocchi corrispondenti vengono contrassegnati come bad (cattivi) nel file `content` ed elencati nel comando `status`. snapraid status Per correggerli, è possibile utilizzare il comando `fix`, filtrando i blocchi bad con l'opzione -e, --filter-error: snapraid -e fix Al prossimo `scrub`, gli errori scompariranno dal report `status` se sono stati veramente corretti. Per renderlo piÚ veloce, è possibile utilizzare -p bad per eseguire lo scrub solo dei blocchi contrassegnati come bad. snapraid -p bad scrub L'esecuzione di `scrub` su un array non sincronizzato puÃ˛ riportare errori causati da file rimossi o modificati. Questi errori sono riportati nell'output di `scrub`, ma i blocchi correlati non sono contrassegnati come bad. 4.2 Pooling ----------- Nota: La funzionalità di pooling descritta di seguito è stata sostituita dallo strumento mergerfs, che è ora l'opzione consigliata per gli utenti Linux nella comunità SnapRAID. Mergefs fornisce un modo piÚ flessibile ed efficiente per raggruppare piÚ unità in un singolo punto di montaggio unificato, consentendo un accesso trasparente ai file attraverso l'array senza fare affidamento sui collegamenti simbolici. Si integra bene con SnapRAID per la protezione della parità ed è comunemente usato in configurazioni come OpenMediaVault (OMV) o NAS personalizzati. Per avere tutti i file nell'array mostrati nello stesso albero di directory, è possibile abilitare la funzionalità di `pooling`. Crea una vista virtuale di sola lettura di tutti i file nell'array utilizzando collegamenti simbolici. È possibile configurare la directory di `pooling` nel file di configurazione con: pool /pool o, se si è su Windows, con: pool C:\pool e quindi eseguire il comando `pool` per creare o aggiornare la vista virtuale. snapraid pool Se si sta utilizzando una piattaforma Unix e si desidera condividere questa directory sulla rete con macchine Windows o Unix, è necessario aggiungere le seguenti opzioni al file /etc/samba/smb.conf: # Nella sezione globale di smb.conf unix extensions = no # Nella sezione di condivisione di smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes In Windows, la condivisione di collegamenti simbolici su una rete richiede che i client li risolvano da remoto. Per abilitare questo, oltre a condividere la directory pool, è necessario condividere anche tutti i dischi in modo indipendente, utilizzando i nomi dei dischi definiti nel file di configurazione come punti di condivisione. È inoltre necessario specificare nell'opzione `share` del file di configurazione il percorso UNC di Windows che i client remoti devono utilizzare per accedere a questi dischi condivisi. Ad esempio, operando da un server chiamato `darkstar`, è possibile utilizzare le opzioni: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar e condividere le seguenti directory sulla rete: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array per consentire ai client remoti di accedere a tutti i file in \\darkstar\pool. Potrebbe anche essere necessario configurare i client remoti per abilitare l'accesso ai symlink remoti con il comando: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Annullamento Eliminazione ----------------------------- SnapRAID funziona piÚ come un programma di backup che come un sistema RAID e puÃ˛ essere utilizzato per ripristinare o annullare l'eliminazione dei file al loro stato precedente utilizzando l'opzione -f, --filter: snapraid fix -f FILE o per una directory: snapraid fix -f DIR/ È anche possibile usarlo per recuperare solo i file eliminati accidentalmente all'interno di una directory utilizzando l'opzione -m, --filter-missing, che ripristina solo i file mancanti, lasciando tutti gli altri intatti. snapraid fix -m -f DIR/ O per recuperare tutti i file eliminati su tutte le unità con: snapraid fix -m 4.4 Recupero ------------ È successo il peggio e si è perso uno o piÚ dischi! NON FARSI PRENDERE DAL PANICO! Sarà possibile recuperarli! La prima cosa da fare è evitare ulteriori modifiche all'array di dischi. Disabilitare qualsiasi connessione remota ad esso e qualsiasi processo pianificato, incluso qualsiasi sync o scrub notturno pianificato di SnapRAID. Quindi procedere con i seguenti passaggi. ---- 4.4.1 PASSO 1 -> Riconfigurazione ---- È necessario un po' di spazio per recuperare, idealmente su dischi di riserva aggiuntivi, ma un disco USB esterno o un disco remoto saranno sufficienti. Modificare il file di configurazione SnapRAID per far puntare l'opzione `data` o `parity` del disco guasto a una posizione con spazio vuoto sufficiente per recuperare i file. Ad esempio, se il disco `d1` è guasto, cambiare da: data d1 /mnt/disk1/ a: data d1 /mnt/new_spare_disk/ Se il disco da recuperare è un disco di parità, aggiornare l'opzione `parity` appropriata. Se si hanno piÚ dischi guasti, aggiornare tutte le loro opzioni di configurazione. ---- 4.4.2 PASSO 2 -> Correzione (Fix) ---- Eseguire il comando fix, memorizzando il log in un file esterno con: snapraid -d NAME -l fix.log fix Dove NAME è il nome del disco, come `d1` nel nostro esempio precedente. Se il disco da recuperare è un disco di parità, usare i nomi `parity`, `2-parity`, ecc. Se si hanno piÚ dischi guasti, usare piÚ opzioni -d per specificarli tutti. Questo comando richiederà molto tempo. Assicurarsi di avere alcuni gigabyte liberi per memorizzare il file fix.log. Eseguirlo da un disco con spazio libero sufficiente. Ora si è recuperato tutto ciÃ˛ che è recuperabile. Se alcuni file sono parzialmente o totalmente irrecuperabili, verranno rinominati aggiungendo l'estensione `.unrecoverable`. È possibile trovare un elenco dettagliato di tutti i blocchi irrecuperabili nel file fix.log controllando tutte le righe che iniziano con `unrecoverable:`. Se non si è soddisfatti del recupero, è possibile riprovare tutte le volte che si desidera. Ad esempio, se si sono rimossi file dall'array dopo l'ultimo `sync`, questo puÃ˛ comportare che alcuni file non vengano recuperati. In questo caso, è possibile riprovare il `fix` usando l'opzione -i, --import, specificando dove si trovano ora questi file per includerli di nuovo nel processo di recupero. Se si è soddisfatti del recupero, è possibile procedere oltre, ma notare che dopo la sincronizzazione, non è piÚ possibile riprovare il comando `fix`! ---- 4.4.3 PASSO 3 -> Controllo (Check) ---- Come controllo cauto, è ora possibile eseguire un comando `check` per assicurarsi che tutto sia corretto sul disco recuperato. snapraid -d NAME -a check Dove NAME è il nome del disco, come `d1` nel nostro esempio precedente. Le opzioni -d e -a dicono a SnapRAID di controllare solo il disco specificato e di ignorare tutti i dati di parità. Questo comando richiederà molto tempo, ma se non si è eccessivamente cauti, è possibile saltarlo. ---- 4.4.4 PASSO 4 -> Sincronizzazione (Sync) ---- Eseguire il comando `sync` per risincronizzare l'array con il nuovo disco. snapraid sync Se tutto è recuperato, questo comando è immediato. 5 COMANDI ========= SnapRAID fornisce alcuni semplici comandi che consentono di: * Stampare lo stato dell'array -> `status` * Controllare i dischi -> `smart`, `probe`, `up`, `down` * Effettuare un backup/snapshot -> `sync` * Controllare periodicamente i dati -> `scrub` * Ripristinare l'ultimo backup/snapshot -> `fix`. I comandi devono essere scritti in minuscolo. 5.1 status ---------- Stampa un riepilogo dello stato dell'array di dischi. Include informazioni sulla frammentazione della parità, quanto sono vecchi i blocchi senza essere controllati e tutti gli errori silenti registrati incontrati durante lo scrubbing. Le informazioni presentate si riferiscono all'ultima volta che si è eseguito `sync`. Le modifiche successive non vengono prese in considerazione. Se sono stati rilevati blocchi bad, vengono elencati i loro numeri di blocco. Per correggerli, è possibile utilizzare il comando `fix -e`. Mostra anche un grafico che rappresenta l'ultima volta che ogni blocco è stato sottoposto a scrub o sincronizzato. I blocchi sottoposti a scrub sono mostrati con `*`, i blocchi sincronizzati ma non ancora sottoposti a scrub con `o`. Nulla viene modificato. 5.2 smart --------- Stampa un report SMART di tutti i dischi nel sistema. Include una stima della probabilità di guasto nel prossimo anno, consentendo di pianificare sostituzioni di manutenzione di dischi che mostrano attributi sospetti. Questa stima della probabilità è ottenuta correlando gli attributi SMART dei dischi con i dati Backblaze disponibili all'indirizzo: https://www.backblaze.com/hard-drive-test-data.html Se SMART segnala che un disco sta per guastarsi, viene stampato `FAIL` o `PREFAIL` per quel disco e SnapRAID restituisce un errore. In questo caso, si raccomanda vivamente la sostituzione immediata del disco. Altre possibili stringhe di stato sono: logfail - In passato, alcuni attributi erano inferiori alla soglia. logerr - Il log degli errori del dispositivo contiene errori. selferr - Il log dell'autotest del dispositivo contiene errori. Se viene specificata l'opzione -v, --verbose, viene fornita un'analisi statistica piÚ approfondita. Questa analisi puÃ˛ aiutare a decidere se è necessaria piÚ o meno parità. Questo comando utilizza lo strumento `smartctl` ed è equivalente all'esecuzione di `smartctl -a` su tutti i dispositivi. Se i dispositivi non vengono rilevati automaticamente correttamente, è possibile specificare un comando personalizzato utilizzando l'opzione `smartctl` nel file di configurazione. Nulla viene modificato. 5.3 probe --------- Stampa lo stato POWER di tutti i dischi nel sistema. `Standby` significa che il disco non sta girando. `Active` significa che il disco sta girando. Questo comando utilizza lo strumento `smartctl` ed è equivalente all'esecuzione di `smartctl -n standby -i` su tutti i dispositivi. Se i dispositivi non vengono rilevati automaticamente correttamente, è possibile specificare un comando personalizzato utilizzando l'opzione `smartctl` nel file di configurazione. Nulla viene modificato. 5.4 up ------ Fa girare tutti i dischi dell'array. È possibile far girare solo dischi specifici utilizzando l'opzione -d, --filter-disk. Far girare tutti i dischi contemporaneamente richiede molta energia. Assicurarsi che l'alimentatore possa sostenerlo. Nulla viene modificato. 5.5 down -------- Ferma tutti i dischi dell'array. Questo comando utilizza lo strumento `smartctl` ed è equivalente all'esecuzione di `smartctl -s standby,now` su tutti i dispositivi. È possibile fermare solo dischi specifici utilizzando l'opzione -d, --filter-disk. Per fermare automaticamente in caso di errore, è possibile utilizzare l'opzione -s, --spin-down-on-error con qualsiasi altro comando, che è equivalente all'esecuzione manuale di `down` quando si verifica un errore. Nulla viene modificato. 5.6 diff -------- Elenca tutti i file modificati dall'ultimo `sync` che devono avere i loro dati di parità ricalcolati. Questo comando non controlla i dati del file, ma solo il timestamp del file, le dimensioni e l'inode. Dopo aver elencato tutti i file modificati, viene presentato un riepilogo delle modifiche, raggruppate per: equal - File invariati rispetto a prima. added - File aggiunti che non erano presenti prima. removed - File rimossi. updated - File con dimensioni o timestamp diversi, il che significa che sono stati modificati. moved - File spostati in una directory diversa sullo stesso disco. Sono identificati dall'avere lo stesso nome, dimensioni, timestamp e inode, ma una directory diversa. copied - File copiati sullo stesso disco o su un disco diverso dove il file originale esiste ancora. Sono identificati dall'avere lo stesso nome, dimensione e timestamp. Se il timestamp al sottomultiplo del secondo è zero, il percorso completo deve corrispondere per essere identificato, non solo il nome. relocated - File spostati sullo stesso disco o su un disco diverso dove l'originale è scomparso. Sono identificati dall' avere lo stesso nome, dimensione e timestamp. Se il timestamp al sottomultiplo del secondo è zero, il percorso completo deve corrispondere per essere identificato. A differenza dei file `moved` sullo stesso disco, i file ricollocati hanno un inode diverso. restored - File con un inode diverso ma directory, nome, dimensione e timestamp corrispondenti. Questi sono solitamente file ripristinati dopo essere stati eliminati. Se è richiesto un `sync`, il codice di ritorno del processo è 2, invece del predefinito 0. Il codice di ritorno 1 è utilizzato per una condizione di errore generica. Nulla viene modificato. 5.7 sync -------- Aggiorna le informazioni di parità. Tutti i file modificati nell'array di dischi vengono letti e i dati di parità corrispondenti vengono aggiornati. È possibile interrompere questo processo in qualsiasi momento premendo Ctrl+C, senza perdere il lavoro già svolto. Alla prossima esecuzione, il processo `sync` riprenderà da dove è stato interrotto. Se vengono trovati errori silenti o di input/output durante il processo, i blocchi corrispondenti vengono contrassegnati come bad. I file sono identificati dal percorso e/o dall'inode e controllati per dimensione e timestamp. Se la dimensione o il timestamp del file differiscono, i dati di parità vengono ricalcolati per l'intero file. Se il file viene spostato o rinominato sullo stesso disco, mantenendo lo stesso inode, la parità non viene ricalcolata. Se il file viene spostato su un altro disco, la parità viene ricalcolata, ma le informazioni di hash precedentemente calcolate vengono mantenute. I file `content` e `parity` vengono modificati se necessario. I file nell'array NON vengono modificati. 5.8 scrub --------- Esegue lo scrub dell'array, controllando la presenza di errori silenti o di input/output nei dischi dati e di parità. Ogni invocazione controlla circa l'8% dell'array, escludendo i dati già sottoposti a scrub negli ultimi 10 giorni. CiÃ˛ significa che eseguire lo scrubbing una volta alla settimana garantisce che ogni bit di dati venga controllato almeno una volta ogni tre mesi. È possibile definire un piano o una quantità di scrub diversa utilizzando l'opzione -p, --plan, che accetta: bad - Esegue lo scrub dei blocchi contrassegnati come bad. new - Esegue lo scrub dei blocchi appena sincronizzati non ancora sottoposti a scrub. full - Esegue lo scrub di tutto. 0-100 - Esegue lo scrub della percentuale specificata di blocchi. Se si specifica una quantità percentuale, è anche possibile utilizzare l'opzione -o, --older-than per definire quanto deve essere vecchio il blocco. I blocchi piÚ vecchi vengono sottoposti a scrub per primi, garantendo un controllo ottimale. Se si desidera eseguire lo scrub solo dei blocchi appena sincronizzati non ancora sottoposti a scrub, utilizzare l'opzione `-p new`. Per ottenere i dettagli dello stato dello scrub, utilizzare il comando `status`. Per qualsiasi errore silente o di input/output trovato, i blocchi corrispondenti vengono contrassegnati come bad nel file `content`. Questi blocchi bad sono elencati in `status` e possono essere corretti con `fix -e`. Dopo la correzione, al prossimo scrub, verranno ricontrollati e, se trovati corretti, il contrassegno bad verrà rimosso. Per eseguire lo scrub solo dei blocchi bad, è possibile utilizzare il comando `scrub -p bad`. Si consiglia di eseguire `scrub` solo su un array sincronizzato per evitare errori segnalati causati da dati non sincronizzati. Questi errori sono riconosciuti come non essendo errori silenti e i blocchi non vengono contrassegnati come bad, ma tali errori sono riportati nell'output del comando. Il file `content` viene modificato per aggiornare l'ora dell'ultimo controllo per ogni blocco e per contrassegnare i blocchi bad. I file `parity` NON vengono modificati. I file nell'array NON vengono modificati. 5.9 fix ------- Corregge tutti i file e i dati di parità. Tutti i file e i dati di parità vengono confrontati con lo stato snapshot salvato nell'ultimo `sync`. Se viene trovata una differenza, viene ripristinata allo snapshot memorizzato. ATTENZIONE! Il comando `fix` non differenzia tra errori e modifiche intenzionali. Ripristina incondizionatamente lo stato del file all'ultimo `sync`. Se non viene specificata nessun'altra opzione, l'intero array viene elaborato. Utilizzare le opzioni di filtro per selezionare un sottoinsieme di file o dischi su cui operare. Per correggere solo i blocchi contrassegnati come bad durante `sync` e `scrub`, utilizzare l'opzione -e, --filter-error. A differenza di altre opzioni di filtro, questa applica correzioni solo ai file che sono invariati dall'ultimo `sync`. SnapRAID rinomina tutti i file che non possono essere corretti aggiungendo l'estensione `.unrecoverable`. Prima di correggere, l'intero array viene scansionato per trovare eventuali file spostati dall'ultima operazione di `sync`. Questi file sono identificati dal loro timestamp, ignorando il loro nome e la directory, e vengono utilizzati nel processo di recupero se necessario. Se alcuni di essi sono stati spostati al di fuori dell'array, è possibile utilizzare l'opzione -i, --import per specificare directory aggiuntive da scansionare. I file sono identificati solo dal percorso, non dall'inode. Il file `content` NON viene modificato. I file `parity` vengono modificati se necessario. I file nell'array vengono modificati se necessario. 5.10 check ---------- Verifica tutti i file e i dati di parità. Funziona come `fix`, ma simula solo un recupero e nessuna modifica viene scritta nell'array. Questo comando è destinato principalmente alla verifica manuale, ad esempio dopo un processo di recupero o in altre condizioni speciali. Per i controlli periodici e pianificati, utilizzare `scrub`. Se si utilizza l'opzione -a, --audit-only, viene controllato solo l'hash dei file e i dati di parità vengono ignorati per un'esecuzione piÚ veloce. I file sono identificati solo dal percorso, non dall'inode. Nulla viene modificato. 5.11 list --------- Elenca tutti i file contenuti nell'array al momento dell'ultimo `sync`. Con -v o --verbose, viene mostrato anche il tempo sotto il secondo. Nulla viene modificato. 5.12 dup -------- Elenca tutti i file duplicati. Due file sono considerati uguali se i loro hash corrispondono. I dati del file non vengono letti; vengono utilizzati solo gli hash precalcolati. Nulla viene modificato. 5.13 pool --------- Crea o aggiorna una vista virtuale di tutti i file nell'array di dischi nella directory di `pooling`. I file non vengono copiati ma collegati utilizzando collegamenti simbolici. Durante l'aggiornamento, tutti i collegamenti simbolici esistenti e le sottodirectory vuote vengono eliminati e sostituiti con la nuova vista dell'array. Qualsiasi altro file regolare viene lasciato al suo posto. Nulla viene modificato al di fuori della directory pool. 5.14 devices ------------ Stampa i dispositivi di basso livello utilizzati dall'array. Questo comando visualizza le associazioni dei dispositivi nell'array ed è principalmente destinato come interfaccia script. Le prime due colonne sono l'ID e il percorso del dispositivo di basso livello. Le due colonne successive sono l'ID e il percorso del dispositivo di alto livello. L'ultima colonna è il nome del disco nell'array. Nella maggior parte dei casi, si ha un dispositivo di basso livello per ogni disco nell'array, ma in alcune configurazioni piÚ complesse, si potrebbe avere piÚ dispositivi di basso livello utilizzati da un singolo disco nell'array. Nulla viene modificato. 5.15 touch ---------- Imposta un timestamp arbitrario sotto il secondo per tutti i file che lo hanno impostato a zero. Questo migliora la capacità di SnapRAID di riconoscere i file spostati e copiati, poichÊ rende il timestamp quasi unico, riducendo possibili duplicati. PiÚ specificamente, se il timestamp sotto il secondo non è zero, un file spostato o copiato viene identificato come tale se corrisponde al nome, alle dimensioni e al timestamp. Se il timestamp sotto il secondo è zero, è considerato una copia solo se il percorso completo, le dimensioni e il timestamp corrispondono tutti. Il timestamp di precisione al secondo non viene modificato, quindi tutte le date e gli orari dei file saranno conservati. 5.16 rehash ----------- Pianifica un rehash dell'intero array. Questo comando cambia il tipo di hash utilizzato, in genere quando si esegue l'aggiornamento da un sistema a 32 bit a uno a 64 bit, per passare da MurmurHash3 al piÚ veloce SpookyHash. Se si sta già utilizzando l'hash ottimale, questo comando non fa nulla e informa che non è necessaria alcuna azione. Il rehash non viene eseguito immediatamente ma avviene progressivamente durante `sync` e `scrub`. È possibile controllare lo stato del rehash utilizzando `status`. Durante il rehash, SnapRAID mantiene la piena funzionalità, con l'unica eccezione che `dup` non è in grado di rilevare file duplicati utilizzando un hash diverso. 5.17 locate ----------- Individua i file memorizzati nei dischi di parità. Per ogni file corrispondente, stampa la sua posizione all'interno del file di parità e il numero di frammenti che occupa. È possibile utilizzare l'opzione -t, --tail per limitare l'operazione ai file che occupano la porzione di coda specificata della parità. Se si desidera riallocare questi file, è possibile utilizzare l'opzione -W, --force-realloc-tail. Si tenga presente che tali file non saranno protetti dalla parità durante il processo di riallocazione. 6 OPZIONI ========= SnapRAID fornisce le seguenti opzioni: -c, --conf CONFIG Seleziona il file di configurazione da utilizzare. Se non specificato, in Unix utilizza il file `/usr/local/etc/snapraid.conf` se esiste, altrimenti `/etc/snapraid.conf`. In Windows, utilizza il file `snapraid.conf` nella stessa directory di `snapraid.exe`. -f, --filter PATTERN Filtra i file da elaborare in `check` e `fix`. Vengono elaborati solo i file che corrispondono al modello specificato. Questa opzione puÃ˛ essere utilizzata piÚ volte. Vedere la sezione PATTERN per maggiori dettagli sulle specifiche del modello. In Unix, assicurarsi che i caratteri di globbing siano citati se usati. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. Non puÃ˛ essere utilizzata con `sync` e `scrub`, poichÊ elaborano sempre l'intero array. -d, --filter-disk NAME Filtra i dischi da elaborare in `check`, `fix`, `up` e `down`. È necessario specificare un nome di disco come definito nel file di configurazione. È anche possibile specificare i dischi di parità con i nomi: `parity`, `2-parity`, `3-parity`, ecc., per limitare le operazioni a un disco di parità specifico. Se si combinano piÚ opzioni --filter, --filter-disk e --filter-missing, vengono selezionati solo i file che corrispondono a tutti i filtri. Questa opzione puÃ˛ essere utilizzata piÚ volte. Questa opzione puÃ˛ essere utilizzata solo con `check`, `fix`, `up` e `down`. Non puÃ˛ essere utilizzata con `sync` e `scrub`, poichÊ elaborano sempre l'intero array. -m, --filter-missing Filtra i file da elaborare in `check` e `fix`. Vengono elaborati solo i file mancanti o eliminati dall'array. Quando usato con `fix`, questo agisce come un comando di `undelete` (annullamento eliminazione). Se si combinano piÚ opzioni --filter, --filter-disk e --filter-missing, vengono selezionati solo i file che corrispondono a tutti i filtri. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. Non puÃ˛ essere utilizzata con `sync` e `scrub`, poichÊ elaborano sempre l'intero array. -e, --filter-error Elabora i file con errori in `check` e `fix`. Elabora solo i file che hanno blocchi contrassegnati con errori silenti o di input/output durante `sync` e `scrub`, come elencato in `status`. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. -p, --plan PERC|bad|new|full Seleziona il piano di scrub. Se PERC è un valore numerico da 0 a 100, viene interpretato come la percentuale di blocchi da sottoporre a scrub. Invece di una percentuale, è possibile specificare un piano: `bad` esegue lo scrub dei blocchi bad, `new` esegue lo scrub dei blocchi non ancora sottoposti a scrub, e `full` esegue lo scrub di tutto. Questa opzione puÃ˛ essere utilizzata solo con `scrub`. -o, --older-than DAYS Seleziona la parte piÚ vecchia dell'array da elaborare in `scrub`. DAYS è l'età minima in giorni per un blocco da sottoporre a scrub; il valore predefinito è 10. I blocchi contrassegnati come bad vengono sempre sottoposti a scrub indipendentemente da questa opzione. Questa opzione puÃ˛ essere utilizzata solo con `scrub`. -a, --audit-only In `check`, verifica l'hash dei file senza controllare i dati di parità. Se si è interessati solo al controllo dei dati del file, questa opzione puÃ˛ velocizzare significativamente il processo di controllo. Questa opzione puÃ˛ essere utilizzata solo con `check`. -h, --pre-hash In `sync`, esegue una fase preliminare di hashing di tutti i nuovi dati per una verifica aggiuntiva prima del calcolo della parità. Di solito, in `sync`, non viene eseguito alcun hashing preliminare e i nuovi dati vengono sottoposti a hash subito prima del calcolo della parità quando vengono letti per la prima volta. Questo processo si verifica quando il sistema è sotto carico pesante, con tutti i dischi che girano e una CPU occupata. Questa è una condizione estrema per la macchina e, se presenta un problema hardware latente, gli errori silenti potrebbero non essere rilevati perchÊ i dati non sono ancora stati sottoposti a hash. Per evitare questo rischio, è possibile abilitare la modalità `pre-hash` per far leggere tutti i dati due volte per garantirne l'integrità. Questa opzione verifica anche i file spostati all'interno dell'array per garantire che l'operazione di spostamento sia andata a buon fine e, se necessario, consente di eseguire un'operazione di fix prima di procedere. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -i, --import DIR Importa dalla directory specificata tutti i file eliminati dall'array dopo l'ultimo `sync`. Se si hanno ancora tali file, possono essere utilizzati da `check` e `fix` per migliorare il processo di recupero. I file vengono letti, anche nelle sottodirectory, e sono identificati indipendentemente dal loro nome. Questa opzione puÃ˛ essere utilizzata solo con `check` e `fix`. -s, --spin-down-on-error In caso di errore, ferma (spin down) tutti i dischi gestiti prima di uscire con un codice di stato non zero. CiÃ˛ impedisce alle unità di rimanere attive e in rotazione dopo un'operazione interrotta, contribuendo a evitare inutili accumuli di calore e consumo di energia. Utilizzare questa opzione per garantire che i dischi siano arrestati in modo sicuro anche in caso di errore di un comando. -w, --bw-limit RATE Applica un limite di larghezza di banda globale per tutti i dischi. RATE è il numero di byte al secondo. È possibile specificare un moltiplicatore come K, M, G o T (ad esempio, --bw-limit 1G). -t, --tail DIMENSIONE Limita l'elenco dei file a quelli che non utilizzano piÚ della dimensione di coda specificata dei dischi di parità. È possibile utilizzare moltiplicatori come K, M, G o T (ad es. --tail 1G). Questa opzione è valida solo se utilizzata insieme al comando `locate`. -A, --stats Abilita una vista dello stato estesa che mostra informazioni aggiuntive. La schermata visualizza due grafici: Il primo grafico mostra il numero di stripe bufferizzate per ciascun disco, insieme al percorso del file attualmente acceduto su quel disco. In genere, il disco piÚ lento non avrà buffer disponibile, il che determina la larghezza di banda massima raggiungibile. Il secondo grafico mostra la percentuale di tempo trascorso in attesa negli ultimi 100 secondi. Si prevede che il disco piÚ lento causi la maggior parte del tempo di attesa, mentre gli altri dischi dovrebbero avere poco o nessun tempo di attesa perchÊ possono utilizzare le loro stripe bufferizzate. Questo grafico mostra anche il tempo trascorso in attesa per i calcoli di hash e i calcoli RAID. Tutti i calcoli vengono eseguiti in parallelo con le operazioni su disco. Pertanto, finchÊ c'è un tempo di attesa misurabile per almeno un disco, ciÃ˛ indica che la CPU è abbastanza veloce da tenere il passo con il carico di lavoro. -Z, --force-zero Forza l'operazione non sicura di sincronizzazione di un file con dimensione zero che in precedenza era non zero. Se SnapRAID rileva una tale condizione, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare facilmente quando, dopo un arresto anomalo del sistema, alcuni file a cui si è acceduto sono stati troncati. Questa è una possibile condizione in Linux con i file system ext3/ext4. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -E, --force-empty Forza l'operazione non sicura di sincronizzazione di un disco con tutti i file originali mancanti. Se SnapRAID rileva che tutti i file originariamente presenti sul disco sono mancanti o riscritti, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare facilmente quando un file system di dati non è montato. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -U, --force-uuid Forza l'operazione non sicura di sincronizzazione, controllo e correzione con dischi che hanno cambiato il loro UUID. Se SnapRAID rileva che alcuni dischi hanno cambiato UUID, interrompe la prosecuzione a meno che non si specifichi questa opzione. CiÃ˛ consente di rilevare quando i dischi sono montati sui punti di montaggio sbagliati. Tuttavia, è consentito avere un singolo cambio di UUID con parità singola e di piÚ con parità multipla, perchÊ questo è il caso normale quando si sostituiscono i dischi dopo un recupero. Questa opzione puÃ˛ essere utilizzata solo con `sync`, `check` o `fix`. -D, --force-device Forza l'operazione non sicura di correzione con dischi inaccessibili o con dischi sullo stesso dispositivo fisico. Ad esempio, se si sono persi due dischi dati e si ha un disco di riserva per recuperare solo il primo, è possibile ignorare il secondo disco inaccessibile. Oppure, se si desidera recuperare un disco nello spazio libero rimasto su un disco già utilizzato, condividendo lo stesso dispositivo fisico. Questa opzione puÃ˛ essere utilizzata solo con `fix`. -N, --force-nocopy In `sync`, `check` e `fix`, disabilita l'euristica di rilevamento della copia. Senza questa opzione, SnapRAID presume che i file con gli stessi attributi, come nome, dimensione e timestamp, siano copie con gli stessi dati. CiÃ˛ consente l'identificazione di file copiati o spostati da un disco all'altro e riutilizza le informazioni di hash già calcolate per rilevare errori silenti o per recuperare file mancanti. In alcuni rari casi, questo comportamento puÃ˛ comportare falsi positivi o un processo lento a causa di molte verifiche di hash, e questa opzione consente di risolvere tali problemi. Questa opzione puÃ˛ essere utilizzata solo con `sync`, `check` e `fix`. -F, --force-full In `sync`, forza un ricalcolo completo della parità. Questa opzione puÃ˛ essere utilizzata quando si aggiunge un nuovo livello di parità o se si è tornati a un vecchio file di contenuto utilizzando dati di parità piÚ recenti. Invece di ricreare la parità da zero, questo consente di riutilizzare gli hash presenti nel file di contenuto per convalidare i dati e mantenere la protezione dei dati durante il processo `sync` utilizzando i dati di parità esistenti. Questa opzione puÃ˛ essere utilizzata solo con `sync`. -R, --force-realloc In `sync`, forza una riallocazione completa dei file e la ricostruzione della parità. Questa opzione puÃ˛ essere utilizzata per riallocare completamente tutti i file, rimuovendo la frammentazione, riutilizzando gli hash presenti nel file di contenuto per convalidare i dati. Questa opzione puÃ˛ essere utilizzata solo con `sync`. ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato utilizzarla. NON si ha protezione dei dati durante l'operazione `sync`. -W, --force-realloc-tail DIMENSIONE Funziona come -R, --force-realloc, ma limitatamente alla porzione di coda specificata (ultimi DIMENSIONE byte) di ogni file di parità. Forza la riallocazione (spostamento) di qualsiasi frammento/blocco di file attualmente memorizzato in quella sezione di coda, consentendo loro di essere posizionati ovunque nei file di parità dove sia disponibile spazio libero (inclusi i buchi esistenti). Lo scopo principale di questa opzione è ridurre la dimensione su disco del file di parità. Se la riallocazione svuota con successo l'intera sezione di coda (non rimangono blocchi che la utilizzano), il file di parità viene troncato, recuperando lo spazio di coda inutilizzato. È possibile utilizzare moltiplicatori come K, M, G o T (ad es. --force-realloc-tail 1G). È possibile utilizzare locate -t, --tail per conoscere in anticipo i file interessati. ATTENZIONE! Questa opzione è solo per esperti ed è caldamente raccomandato di non usarla. NON si ha protezione dei dati durante l'operazione di `sync` per i file interessati. -l, --log FILE Scrive un log dettagliato nel file specificato. Se questa opzione non è specificata, gli errori imprevisti vengono stampati sullo schermo, potenzialmente resulting in un output eccessivo in caso di molti errori. Quando -l, --log è specificato, vengono stampati sullo schermo solo gli errori fatali che causano l'arresto di SnapRAID. Se il percorso inizia con `>>`, il file viene aperto in modalità append. Le occorrenze di `%D` e `%T` nel nome vengono sostituite con la data e l'ora nel formato YYYYMMDD e HHMMSS. Nei file batch di Windows, è necessario raddoppiare il carattere `%`, ad esempio result-%%D.log. Per utilizzare `>>`, è necessario racchiudere il nome tra virgolette, ad esempio `">>result.log"`. Per indirizzare l'output del log all'output standard o all'errore standard, è possibile utilizzare `">&1"` e `">&2"`, rispettivamente. Vedere il file snapraid_log.txt o la pagina man per le descrizioni dei tag di log. -L, --error-limit NUMBER Imposta un nuovo limite di errore prima di interrompere l'esecuzione. Per impostazione predefinita, SnapRAID si interrompe se incontra piÚ di 100 errori di input/output, indicando che un disco sta probabilmente fallendo. Questa opzione influisce su `sync` e `scrub`, a cui è consentito continuare dopo il primo set di errori del disco per cercare di completare le loro operazioni. Tuttavia, `check` e `fix` si interrompono sempre al primo errore. -S, --start BLKSTART Avvia l'elaborazione dal numero di blocco specificato. CiÃ˛ puÃ˛ essere utile per riprovare a controllare o correggere blocchi specifici in caso di disco danneggiato. Questa opzione è principalmente per il recupero manuale avanzato. -B, --count BLKCOUNT Elabora solo il numero specificato di blocchi. Questa opzione è principalmente per il recupero manuale avanzato. -C, --gen-conf CONTENT Genera un file di configurazione fittizio da un file di contenuto esistente. Il file di configurazione viene scritto nell'output standard e non sovrascrive uno esistente. Questo file di configurazione contiene anche le informazioni necessarie per ricostruire i punti di montaggio del disco nel caso in cui si perda l'intero sistema. -v, --verbose Stampa piÚ informazioni sullo schermo. Se specificato una volta, stampa i file esclusi e statistiche aggiuntive. Questa opzione non ha effetto sui file di log. -q, --quiet Stampa meno informazioni sullo schermo. Se specificato una volta, rimuove la barra di avanzamento; due volte, le operazioni in corso; tre volte, i messaggi di informazione; quattro volte, i messaggi di stato. Gli errori fatali vengono sempre stampati sullo schermo. Questa opzione non ha effetto sui file di log. -H, --help Stampa una breve schermata di aiuto. -V, --version Stampa la versione del programma. 7 CONFIGURAZIONE ================ SnapRAID richiede un file di configurazione per sapere dove si trova l'array di dischi e dove memorizzare le informazioni di parità. In Unix, utilizza il file `/usr/local/etc/snapraid.conf` se esiste, altrimenti `/etc/snapraid.conf`. In Windows, utilizza il file `snapraid.conf` nella stessa directory di `snapraid.exe`. Deve contenere le seguenti opzioni (sensibili al maiuscolo/minuscolo): 7.1 parity FILE [,FILE] ... --------------------------- Definisce i file da utilizzare per memorizzare le informazioni di parità. La parità consente la protezione da un singolo guasto del disco, simile a RAID5. È possibile specificare piÚ file, che devono essere su dischi diversi. Quando un file non puÃ˛ piÚ crescere, viene utilizzato il successivo. Lo spazio totale disponibile deve essere almeno grande quanto il disco dati piÚ grande dell'array. È possibile aggiungere file di parità aggiuntivi in seguito, ma non è possibile riordinarli o rimuoverli. Mantenere i dischi di parità riservati alla parità garantisce che non diventino frammentati, migliorando le prestazioni. In Windows, 256 MB vengono lasciati inutilizzati su ogni disco per evitare l'avviso sui dischi pieni. Questa opzione è obbligatoria e puÃ˛ essere utilizzata solo una volta. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- Definisce i file da utilizzare per memorizzare informazioni di parità extra. Per ogni livello di parità specificato, è abilitato un livello aggiuntivo di protezione: * 2-parity abilita la doppia parità RAID6. * 3-parity abilita la tripla parità. * 4-parity abilita la parità quadrupla. * 5-parity abilita la parità quintupla. * 6-parity abilita la parità esapla. Ogni livello di parità richiede la presenza di tutti i livelli di parità precedenti. Si applicano le stesse considerazioni dell'opzione `parity`. Queste opzioni sono facoltative e possono essere utilizzate solo una volta. 7.3 z-parity FILE [,FILE] ... ----------------------------- Definisce un file e un formato alternativi per memorizzare la tripla parità. Questa opzione è un'alternativa a `3-parity`, destinata principalmente a CPU di fascia bassa come ARM o AMD Phenom, Athlon e Opteron che non supportano il set di istruzioni SSSE3. In tali casi, fornisce prestazioni migliori. Questo formato è simile ma piÚ veloce di quello utilizzato da ZFS RAIDZ3. Come ZFS, non funziona oltre la tripla parità. Quando si utilizza `3-parity`, si verrà avvisati se è consigliato utilizzare il formato `z-parity` per un miglioramento delle prestazioni. È possibile convertire da un formato all'altro regolando il file di configurazione con il file z-parity o 3-parity desiderato e utilizzando `fix` per ricrearlo. 7.4 content FILE ---------------- Definisce il file da utilizzare per memorizzare l'elenco e i checksum di tutti i file presenti nell'array di dischi. PuÃ˛ essere posizionato su un disco utilizzato per dati, parità o qualsiasi altro disco disponibile. Se si utilizza un disco dati, questo file viene automaticamente escluso dal processo `sync`. Questa opzione è obbligatoria e puÃ˛ essere utilizzata piÚ volte per salvare piÚ copie dello stesso file. È necessario memorizzare almeno una copia per ogni disco di parità utilizzato piÚ uno. L'utilizzo di copie aggiuntive non è dannoso. 7.5 data NAME DIR ----------------- Definisce il nome e il punto di montaggio dei dischi dati nell'array. NAME viene utilizzato per identificare il disco e deve essere unico. DIR è il punto di montaggio del disco nel file system. È possibile cambiare il punto di montaggio secondo necessità, purchÊ si mantenga fisso NAME. È necessario utilizzare un'opzione per ogni disco dati nell'array. È possibile rinominare un disco in seguito modificando NAME direttamente nel file di configurazione e quindi eseguendo un comando `sync`. In caso di ridenominazione, l'associazione viene eseguita utilizzando l'UUID memorizzato dei dischi. 7.6 extra NAME DIR ------------------ Definisce il nome e il punto di montaggio di dischi aggiuntivi da monitorare con i comandi `smart` e `probe`. Questo è utile per monitorare i dischi che non fanno parte dell' array ma sono necessari per il funzionamento del sistema, come il disco di avvio. Si noti che tali dischi non sono influenzati dai comandi `up` e `down` perchÊ si prevede che siano sempre in rotazione. 7.7 nohidden ------------ Esclude tutti i file e le directory nascosti. In Unix, i file nascosti sono quelli che iniziano con `.`. In Windows, sono quelli con l'attributo nascosto. 7.8 exclude/include PATTERN --------------------------- Definisce i modelli di file o directory da escludere o includere nel processo di sync. Tutti i modelli vengono elaborati nell'ordine specificato. Se il primo modello che corrisponde è un `exclude`, il file viene escluso. Se è un `include`, il file viene incluso. Se nessun modello corrisponde, il file viene escluso se l'ultimo modello specificato è un `include`, o incluso se l'ultimo modello specificato è un `exclude`. Vedere la sezione PATTERN per maggiori dettagli sulle specifiche del modello. Questa opzione puÃ˛ essere utilizzata piÚ volte. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- Definisce la dimensione di blocco di base in kibibyte per la parità. Un kibibyte è 1024 byte. La dimensione di blocco predefinita è 256, che dovrebbe funzionare nella maggior parte dei casi. ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato modificare questo valore. Per modificare questo valore in futuro, sarà necessario ricreare l'intera parità! Un motivo per utilizzare una dimensione di blocco diversa è se si hanno molti file piccoli, nell'ordine dei milioni. Per ogni file, anche se solo pochi byte, viene allocato un intero blocco di parità e, con molti file, ciÃ˛ puÃ˛ comportare uno spazio di parità inutilizzato significativo. Quando si riempie completamente il disco di parità, non è consentito aggiungere altri file ai dischi dati. Tuttavia, la parità sprecata non si accumula tra i dischi dati. Lo spazio sprecato risultante da un numero elevato di file su un disco dati limita solo la quantità di dati su quel disco dati, non gli altri. Come approssimazione, si puÃ˛ presumere che metà della dimensione del blocco sia sprecata per ogni file. Ad esempio, con 100.000 file e una dimensione di blocco di 256 KiB, si sprecheranno 12,8 GB di parità, il che puÃ˛ comportare 12,8 GB in meno di spazio disponibile sul disco dati. È possibile controllare la quantità di spazio sprecato su ogni disco utilizzando `status`. Questa è la quantità di spazio che è necessario lasciare libero sui dischi dati o utilizzare per i file non inclusi nell'array. Se questo valore è negativo, significa che si è vicini a riempire la parità e rappresenta lo spazio che è ancora possibile sprecare. Per evitare questo problema, è possibile utilizzare una partizione piÚ grande per la parità. Ad esempio, se la partizione di parità è 12,8 GB piÚ grande dei dischi dati, si ha abbastanza spazio extra per gestire fino a 100.000 file su ogni disco dati senza alcuno spreco di spazio. Un trucco per ottenere una partizione di parità piÚ grande in Linux è formattarla con il comando: mkfs.ext4 -m 0 -T largefile4 DEVICE CiÃ˛ si traduce in circa l'1,5% di spazio extra, circa 60 GB per un disco da 4 TB, che consente circa 460.000 file su ogni disco dati senza alcuno spreco di spazio. 7.10 hashsize SIZE_IN_BYTES --------------------------- Definisce la dimensione dell'hash in byte per i blocchi salvati. La dimensione di hash predefinita è 16 byte (128 bit), che dovrebbe funzionare nella maggior parte dei casi. ATTENZIONE! Questa opzione è solo per esperti ed è vivamente sconsigliato modificare questo valore. Per modificare questo valore in futuro, sarà necessario ricreare l'intera parità! Un motivo per utilizzare una dimensione di hash diversa è se il sistema ha memoria limitata. Come regola generale, SnapRAID tipicamente richiede 1 GiB di RAM per ogni 16 TB di dati nell'array. Nello specifico, per memorizzare gli hash dei dati, SnapRAID richiede circa $TS*(1+HS)/BS$ byte di RAM, dove $TS$ è la dimensione totale in byte dell'array di dischi, $BS$ è la dimensione del blocco in byte e $HS$ è la dimensione dell'hash in byte. Ad esempio, con 8 dischi da 4 TB, una dimensione di blocco di 256 KiB ($1 \text{ KiB} = 1024 \text{ byte}$) e una dimensione di hash di 16, si ottiene: RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93 \text{ GiB}$ Passando a una dimensione di hash di 8, si ottiene: RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02 \text{ GiB}$ Passando a una dimensione di blocco di 512, si ottiene: RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96 \text{ GiB}$ Passando sia a una dimensione di hash di 8 che a una dimensione di blocco di 512, si ottiene: RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51 \text{ GiB}$ 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- Salva automaticamente lo stato durante la sincronizzazione o lo scrubbing dopo la quantità specificata di GB elaborati. Questa opzione è utile per evitare di riavviare lunghi comandi `sync` da zero se interrotti da un arresto anomalo della macchina o qualsiasi altro evento. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Imposta la temperatura massima del disco consentita in Celsius. Se specificato, SnapRAID controlla periodicamente la temperatura di tutti i dischi utilizzando lo strumento smartctl. Le temperature attuali dei dischi vengono visualizzate mentre SnapRAID è in funzione. Se un disco supera questo limite, tutte le operazioni si interrompono e i dischi vengono messi in stand-by (spin down) per la durata definita dall'opzione `temp_sleep`. Dopo il periodo di sonno, le operazioni riprendono, potenzialmente mettendosi in pausa di nuovo se il limite di temperatura viene raggiunto ancora una volta. Durante il funzionamento, SnapRAID analizza anche la curva di riscaldamento di ciascun disco e stima la temperatura costante a lungo termine che dovrebbero raggiungere se l'attività continua. La stima viene eseguita solo dopo che la temperatura del disco è aumentata quattro volte, garantendo che siano disponibili abbastanza punti dati per stabilire una tendenza affidabile. Questa temperatura costante prevista è mostrata tra parentesi accanto al valore attuale e aiuta a valutare se il raffreddamento del sistema è adeguato. Questa temperatura stimata è solo a scopo informativo e non ha alcun effetto sul comportamento di SnapRAID. Le azioni del programma si basano esclusivamente sulle temperature effettive misurate del disco. Per eseguire questa analisi, SnapRAID necessita di un riferimento per la temperatura del sistema. Tenta prima di leggerla dai sensori hardware disponibili. Se non è possibile accedere a nessun sensore di sistema, utilizza la temperatura del disco piÚ bassa misurata all'inizio dell'esecuzione come riferimento di riserva. Normalmente, SnapRAID mostra solo la temperatura del disco piÚ caldo. Per visualizzare la temperatura di tutti i dischi, utilizzare l'opzione -A o --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Imposta il tempo di stand-by, in minuti, quando il limite di temperatura viene raggiunto. Durante questo periodo, i dischi rimangono fermi (spin down). Il valore predefinito è 5 minuti. 7.14 pool DIR ------------- Definisce la directory di pooling in cui viene creata la vista virtuale dell'array di dischi utilizzando il comando `pool`. La directory deve già esistere. 7.15 share UNC_DIR ------------------ Definisce il percorso UNC di Windows necessario per accedere ai dischi da remoto. Se questa opzione è specificata, i collegamenti simbolici creati nella directory pool utilizzano questo percorso UNC per accedere ai dischi. Senza questa opzione, i collegamenti simbolici generati utilizzano solo percorsi locali, il che non consente la condivisione della directory pool sulla rete. I collegamenti simbolici sono formati utilizzando il percorso UNC specificato, aggiungendo il nome del disco come specificato nell'opzione `data` e infine aggiungendo la directory e il nome del file. Questa opzione è richiesta solo per Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ Definisce opzioni smartctl personalizzate per ottenere gli attributi SMART per ogni disco. CiÃ˛ potrebbe essere richiesto per controller RAID e alcuni dischi USB che non possono essere rilevati automaticamente. Il segnaposto %s viene sostituito dal nome del dispositivo, ma è facoltativo per dispositivi fissi come i controller RAID. DISK è lo stesso nome del disco specificato nell'opzione `data`. PARITY è uno dei nomi di parità: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. Nelle OPTIONS specificate, la stringa `%s` viene sostituita dal nome del dispositivo. Per i controller RAID, il dispositivo è probabilmente fisso e potrebbe non essere necessario utilizzare `%s`. Fare riferimento alla documentazione di smartmontools per le possibili opzioni: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices Ad esempio: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignora l'attributo SMART specificato durante il calcolo della probabilità di guasto del disco. Questa opzione è utile se un disco segnala valori insoliti o fuorvianti per un particolare attributo. DISK è lo stesso nome del disco specificato nell'opzione `data`. PARITY è uno dei nomi di parità: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. Il valore speciale * puÃ˛ essere utilizzato per ignorare l'attributo su tutti i dischi. Ad esempio, per ignorare l'attributo `Current Pending Sector Count` su tutti i dischi: smartignore * 197 Per ignorarlo solo sul primo disco di parità: smartignore parity 197 7.18 Esempi ----------- Un esempio di configurazione tipica per Unix è: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Un esempio di configurazione tipica per Windows è: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= I pattern offrono un modo flessibile per filtrare i file da includere o escludere. Usando i caratteri globbing, è possibile definire regole che corrispondano a nomi di file specifici o a intere strutture di directory senza elencare manualmente ogni percorso. Il punto interrogativo `?` corrisponde a qualsiasi carattere singolo eccetto il separatore di directory. Questo lo rende utile per far corrispondere nomi di file con caratteri variabili mantenendo il pattern confinato a un singolo livello di directory. L'asterisco singolo `*` corrisponde a qualsiasi sequenza di caratteri, ma come il punto interrogativo, non attraversa mai i confini delle directory. Si ferma allo slash in avanti, rendendolo adatto per la corrispondenza all'interno di un singolo componente del percorso. Questo è il comportamento standard dei wildcard familiare dal globbing della shell. Il doppio asterisco `**` è piÚ potente, corrisponde a qualsiasi sequenza di caratteri inclusi i separatori di directory. CiÃ˛ consente ai pattern di corrispondere attraverso piÚ livelli di directory. Quando `**` appare inserito direttamente in un pattern, puÃ˛ corrispondere a zero o piÚ caratteri inclusi gli slash tra il testo letterale circostante. L'uso piÚ importante di `**` è nella forma speciale `/**/`. Questa corrisponde a zero o piÚ livelli di directory completi, rendendo possibile la corrispondenza di file a qualsiasi profondità in un albero di directory senza conoscere l'esatta struttura del percorso. Per esempio, il pattern `src/**/main.js` corrisponde a `src/main.js` (saltando zero directory), `src/ui/main.js` (saltando una directory), e `src/ui/components/main.js` (saltando due directory). Le classi di caratteri che usano le parentesi quadre `[]` corrispondono a un singolo carattere da un set o intervallo specificato. Come gli altri pattern a carattere singolo, esse non corrispondono ai separatori di directory. Le classi supportano intervalli e la negazione usando un punto esclamativo. La distinzione fondamentale da ricordare è che `*`, `?` e le classi di caratteri rispettano tutti i confini delle directory e corrispondono solo all'interno di un singolo componente del percorso, mentre `**` è l'unico pattern che puÃ˛ corrispondere attraverso i separatori di directory. Esistono quattro diversi tipi di pattern: FILE Seleziona qualsiasi file chiamato FILE. Questo pattern si applica solo ai file, non alle directory. DIR/ Seleziona qualsiasi directory chiamata DIR e tutto ciÃ˛ che contiene. Questo pattern si applica solo alle directory, non ai file. /PATH/FILE Seleziona l'esatto percorso del file specificato. Questo pattern si applica solo ai file, non alle directory. /PATH/DIR/ Seleziona l'esatto percorso della directory specificata e tutto ciÃ˛ che contiene. Questo pattern si applica solo alle directory, non ai file. Quando si specifica un percorso assoluto che inizia con /, viene applicato alla directory radice dell'array, non alla directory radice del file system locale. In Windows, è possibile utilizzare il backslash \ invece dello slash in avanti /. Le directory di sistema di Windows, le junction, i punti di montaggio e altre directory speciali di Windows sono trattati come file, il che significa che per escluderli, è necessario utilizzare una regola di file, non una di directory. Se il nome del file contiene un carattere `*`, `?`, `[` o `]`, è necessario eseguirne l'escape per evitare che venga interpretato come un carattere di globbing. In Unix, il carattere di escape è `\`; in Windows, è `^`. Quando il pattern è sulla riga di comando, è necessario raddoppiare il carattere di escape per evitare che venga interpretato dalla shell dei comandi. Nel file di configurazione, è possibile utilizzare diverse strategie per filtrare i file da elaborare. L'approccio piÚ semplice è utilizzare solo regole `exclude` per rimuovere tutti i file e le directory che non si desidera elaborare. Ad esempio: # Esclude qualsiasi file denominato `*.unrecoverable` exclude *.unrecoverable # Esclude la directory radice `/lost+found` exclude /lost+found/ # Esclude qualsiasi sottodirectory denominata `tmp` exclude tmp/ L'approccio opposto è definire solo i file che si desidera elaborare, utilizzando solo regole `include`. Ad esempio: # Include solo alcune directory include /movies/ include /musics/ include /pictures/ L'approccio finale è mescolare regole `exclude` e `include`. In questo caso, l'ordine delle regole è importante. Le regole precedenti hanno la precedenza su quelle successive. Per semplificare, è possibile elencare prima tutte le regole `exclude` e poi tutte le regole `include`. Ad esempio: # Esclude qualsiasi file denominato `*.unrecoverable` exclude *.unrecoverable # Esclude qualsiasi sottodirectory denominata `tmp` exclude tmp/ # Include solo alcune directory include /movies/ include /musics/ include /pictures/ Sulla riga di comando, utilizzando l'opzione -f, è possibile utilizzare solo pattern `include`. Ad esempio: # Controlla solo i file .mp3. # In Unix, utilizzare le virgolette per evitare l'espansione # del globbing da parte della shell. snapraid -f "*.mp3" check In Unix, quando si utilizzano caratteri di globbing sulla riga di comando, è necessario citarli per impedire alla shell di espanderli. 9 IGNORE FILE ============= In aggiunta alle regole globali nel file di configurazione, è possibile inserire file `.snapraidignore` in qualsiasi directory all'interno dell'array per definire regole di esclusione decentralizzate. Le regole definite in `.snapraidignore` vengono applicate dopo le regole nel file di configurazione. CiÃ˛ significa che hanno una priorità piÚ alta e possono essere utilizzate per escludere file che erano stati precedentemente inclusi dalla configurazione globale. In pratica, se una regola locale corrisponde, il file viene escluso indipendentemente dalle impostazioni di inclusione globali. La logica dei pattern in `.snapraidignore` rispecchia la configurazione globale ma ancora i pattern alla directory in cui si trova il file: FILE Seleziona qualsiasi file chiamato FILE in questa directory o sotto di essa. Segue le stesse regole di globbing del pattern globale. DIR/ Seleziona qualsiasi directory chiamata DIR e tutto ciÃ˛ che contiene, che risieda in questa directory o sotto di essa. /PATH/FILE Seleziona l'esatto file specificato relativo alla posizione del file `.snapraidignore`. /PATH/DIR/ Seleziona l'esatta directory specificata e tutto ciÃ˛ che contiene, relativa alla posizione del file `.snapraidignore`. A differenza della configurazione globale, i file `.snapraidignore` supportano solo regole di esclusione; non è possibile utilizzare pattern `include` o negazioni (!). Ad esempio, se hai un `.snapraidignore` in `/mnt/disk1/projects/`: # Esclude SOLO /mnt/disk1/projects/output.bin /output.bin # Esclude qualsiasi directory chiamata `build` all'interno di projects/ build/ # Esclude qualsiasi file .tmp all'interno di projects/ o delle sue sottocartelle *.tmp 10 CONTENT ========== SnapRAID memorizza l'elenco e i checksum dei file nel file di contenuto. È un file binario che elenca tutti i file presenti nell'array di dischi, insieme a tutti i checksum per verificarne l'integrità. Questo file viene letto e scritto dai comandi `sync` e `scrub` e letto dai comandi `fix`, `check` e `status`. 11 PARITY ========= SnapRAID memorizza le informazioni di parità dell'array nei file di parità. Questi sono file binari contenenti la parità calcolata di tutti i blocchi definiti nel file `content`. Questi file vengono letti e scritti dai comandi `sync` e `fix` e solo letti dai comandi `scrub` e `check`. 12 CODIFICA =========== SnapRAID in Unix ignora qualsiasi codifica. Legge e memorizza i nomi dei file con la stessa codifica utilizzata dal file system. In Windows, tutti i nomi letti dal file system vengono convertiti e elaborati in formato UTF-8. Per avere i nomi dei file stampati correttamente, è necessario impostare la console di Windows in modalità UTF-8 con il comando `chcp 65001` e utilizzare un carattere TrueType come `Lucida Console` come carattere della console. Questo influisce solo sui nomi dei file stampati; se si reindirizza l'output della console a un file, il file risultante è sempre in formato UTF-8. 13 COPYRIGHT ============ Questo file è Copyright (C) 2025 Andrea Mazzoleni 14 VEDI ANCHE ============= snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ja.1000066400000000000000000002527571522717156100163210ustar00rootroot00000000000000.TH "Disk Arrayᔍ SnapRAID バックã‚ĸップ" 1 .SH NAME snapraid \- Disk Arrayᔍ SnapRAID バックã‚ĸップ .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAIDã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦã‚¤į”¨ãŽãƒãƒƒã‚¯ã‚ĸッププログナムで、最大6å°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒį™ēį”Ÿã—ãŸå ´åˆãŽ デãƒŧã‚ŋ垊旧ぎためãĢパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã—ぞす。 .PP ä¸ģãĢ大厚量で、更新é ģåēĻぎäŊŽã„ãƒ•ã‚Ąã‚¤ãƒĢã‚’æ‰ąã†ãƒ›ãƒŧãƒ ãƒĄãƒ‡ã‚Ŗã‚ĸã‚ģãƒŗã‚ŋãƒŧã‚’å¯žčąĄã¨ã—ãĻおり、 SnapRAIDãĢはいくつかぎ抟čƒŊがありぞす。 .PD 0 .IP \(bu ãƒ•ã‚Ąã‚¤ãƒĢがæ—ĸãĢå…ĨãŖãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã€å†ãƒ•ã‚ŠãƒŧマットせずãĢããŽãžãžåˆŠį”¨ã§ãã€é€šå¸¸é€šã‚Š ã‚ĸクã‚ģ゚できぞす。 .IP \(bu すずãĻぎデãƒŧã‚ŋãŒãƒãƒƒã‚ˇãƒĨ化され、デãƒŧã‚ŋぎ整合性をįĸēäŋã—、ã‚ĩイãƒŦãƒŗãƒˆãĒį ´æã‚’é˜˛ãŽãžã™ã€‚ .IP \(bu éšœåŽŗãŒį™ēį”Ÿã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽæ•°ãŒãƒ‘ãƒĒãƒ†ã‚Ŗæ•°ã‚’čļ…えた場合、デãƒŧã‚ŋãŽæå¤ąã¯åŊąéŸŋã‚’å—ã‘ãŸãƒ‡ã‚Ŗã‚šã‚¯ãĢ 限厚され、äģ–ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒ‡ãƒŧã‚ŋはåŧ•きįļšãã‚ĸクã‚ģ゚可čƒŊです。 .IP \(bu čĒ¤ãŖãĻãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽãƒ•ã‚Ąã‚¤ãƒĢを削除した場合でも、垊旧が可čƒŊです。 .IP \(bu ãƒ‡ã‚Ŗã‚šã‚¯ã¯į•°ãĒるã‚ĩイã‚ēã§ã‚ãŖãĻも構いぞせん。 .IP \(bu ã„ã¤ã§ã‚‚ãƒ‡ã‚Ŗã‚šã‚¯ã‚’čŋŊ加できぞす。 .IP \(bu SnapRAIDはデãƒŧã‚ŋをロックしぞせん。いつでも再フりãƒŧマットやデãƒŧã‚ŋį§ģ動ãĒしãĢåˆŠį”¨ã‚’ 停æ­ĸできぞす。 .IP \(bu ãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ĸクã‚ģ゚するためãĢã‚šãƒ”ãƒŗã•ã›ã‚‹åŋ…čĻãŒã‚ã‚‹ãŽã¯1å°ãŽãƒ‡ã‚Ŗã‚šã‚¯ã ã‘ã§ã‚ã‚Šã€ ᜁé›ģåŠ›ã¨é¨’éŸŗäŊŽæ¸›ãĢåŊšįĢ‹ãĄãžã™ã€‚ .PD .PP čŠŗį´°ãĢついãĻは、SnapRAIDぎå…Ŧåŧã‚ĩイトをごčĻ§ãã ã•ã„ã€‚ .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAIDはRAIDとバックã‚ĸッププログナムぎハイブãƒĒãƒƒãƒ‰ã§ã‚ã‚Šã€ä¸Ąæ–šãŽåˆŠį‚šã‚’įĩ„ãŋ合わせることを į›ŽæŒ‡ã—ãĻいぞす。ただし、äŊŋį”¨ã™ã‚‹å‰ãĢč€ƒæ…Žã™ãšãã„ãã¤ã‹ãŽåˆļ限がありぞす。 .PP ä¸ģãĒåˆļé™ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ã€æœ€čŋ‘ \`sync\` ã‚’åŽŸčĄŒã—ãĻいãĒい場合、厌全ãĢ垊旧できãĒい 可čƒŊ性があることです。 ã‚ˆã‚Šå…ˇäŊ“įš„ãĢは、最垌ぎ \`sync\` 操äŊœäģĨ降ãĢå¤‰æ›´ãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎã‚ĩイã‚ēぞでぎデãƒŧã‚ŋが 垊旧できãĒい可čƒŊ性がありぞす。 ã“ã‚Œã¯ã€å¤‰æ›´ãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãŒæ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢãĒい場合でもį™ēį”Ÿã—ãžã™ã€‚ こぎため、SnapRAIDは**ã‚ãŖãŸãĢ変更されãĒい**デãƒŧã‚ŋãĢ遊しãĻいぞす。 .PP 一斚で、新しくčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢは、æ—ĸãĢå­˜åœ¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎ垊旧をåĻ¨ã’ãžã›ã‚“ã€‚ 新しくčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãŒæ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢある場合ãĢぎãŋã€ãã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒå¤ąã‚ã‚Œãžã™ã€‚ .PP そぎäģ–ぎSnapRAIDぎåˆļ限はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ .PD 0 .IP \(bu SnapRAIDã§ã¯ã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãĢ寞しãĻ**個åˆĨãŽãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ **がäŋæŒã•れぞす。 RAIDでは、単一ぎ大きãĒãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŒåž—ã‚‰ã‚Œãžã™ã€‚ .IP \(bu SnapRAIDは**デãƒŧã‚ŋã‚’ã‚šãƒˆãƒŠã‚¤ãƒ”ãƒŗã‚°ã—ãžã›ã‚“**。 RAIDã§ã¯ã€ã‚šãƒˆãƒŠã‚¤ãƒ”ãƒŗã‚°ãĢより速åēĻが向上しぞす。 .IP \(bu SnapRAIDは**ãƒĒã‚ĸãƒĢã‚ŋイムぎ垊旧をã‚ĩポãƒŧトしぞせん**。 RAIDã§ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻもäŊœæĨ­ã‚’停æ­ĸするåŋ…čĻã¯ã‚ã‚Šãžã›ã‚“ã€‚ .IP \(bu SnapRAIDは**é™ã‚‰ã‚ŒãŸæ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗ**からぎãŋデãƒŧã‚ŋを垊旧できぞす。 バックã‚ĸãƒƒãƒ—ã§ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ全äŊ“ぎ厌全ãĒéšœåŽŗã‹ã‚‰åžŠæ—§ã§ããžã™ã€‚ .IP \(bu **ãƒ•ã‚Ąã‚¤ãƒĢ名、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã€ãŠã‚ˆãŗãƒãƒŧドãƒĒãƒŗã‚¯**ぎãŋがäŋå­˜ã•れぞす。 ã‚ĸクã‚ģã‚šč¨ąå¯ã€æ‰€æœ‰æ¨Šã€ãŠã‚ˆãŗæ‹Ąåŧĩåąžæ€§ã¯äŋå­˜ã•れぞせん。 .PD .SH GETTING STARTED SnapRAIDをäŊŋį”¨ã™ã‚‹ãĢã¯ã€ãžãšãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎ1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ \`parity\` æƒ…å ąå°‚į”¨ãĢ 選択するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢ1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’äŊŋį”¨ã™ã‚‹ã¨ã€RAID5と同様ãĢã€å˜ä¸€ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰ 垊旧できぞす。 .PP RAID6と同様ãĢã€ã‚ˆã‚Šå¤šããŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰åžŠæ—§ã—ãŸã„å ´åˆã¯ã€ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢčŋŊåŠ ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ įĸēäŋã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’čŋŊåŠ ã™ã‚‹ãŸãŗãĢã€åžŠæ—§ã§ãã‚‹ãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒ1つåĸ—えぞす。 .PP パãƒĒãƒ†ã‚Ŗæƒ…å ąã¯ã‚ĸãƒŦイ内ぎ**最大ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯**ぎã‚ĩイã‚ēãĢぞでåĸ—える可čƒŊ性があるため、 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã¨ã—ãĻは、ã‚ĸãƒŦイ内ぎ**æœ€å¤§ãŽãƒ‡ã‚Ŗã‚šã‚¯**を選択するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯ã€\`parity\` ãƒ•ã‚Ąã‚¤ãƒĢぎäŋå­˜å°‚ᔍãĢãĒりぞす。 **デãƒŧã‚ŋをäŋå­˜ã—ãĒいでください**。 .PP æŦĄãĢ、SnapRAIDでäŋč­ˇã—たい \`data\` ãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŽšįžŠã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢåĢぞれるデãƒŧã‚ŋãŒã‚ãŖãŸãĢ変更されãĒい場合ãĢ、äŋč­ˇãŒæœ€ã‚‚åŠšæžœįš„ã§ã™ã€‚ こぎため、WindowsぎC:\\ãƒ‡ã‚Ŗã‚šã‚¯ã‚„Unixぎ/home、/var、/tmpãƒ‡ã‚ŖãƒŦクトãƒĒをåĢめãĒい斚が č‰¯ã„ã§ã—ã‚‡ã†ã€‚ .PP ãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¯ \`content\` ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã•れ、通常はデãƒŧã‚ŋ、パãƒĒãƒ†ã‚Ŗã€ãžãŸã¯ ブãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ãĢäŋå­˜ã•れぞす。 ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢãĢは、バックã‚ĸãƒƒãƒ—ãŽčŠŗį´°ã¨ã€ããŽæ•´åˆæ€§ã‚’æ¤œč¨ŧするためぎすずãĻぎ チェックã‚ĩムがåĢぞれãĻいぞす。 \`content\` ãƒ•ã‚Ąã‚¤ãƒĢは**č¤‡æ•°ãŽã‚ŗãƒ”ãƒŧ**でäŋå­˜ã•ã‚Œã€č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒį™ēį”Ÿã—ãŸå ´åˆã§ã‚‚ã€ 少ãĒくとも1ã¤ãŽã‚ŗãƒ”ãƒŧãŒåˆŠį”¨å¯čƒŊであることをäŋč¨ŧするためãĢ、**å„ã‚ŗãƒ”ãƒŧã¯į•°ãĒã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãĢ** 配įŊŽã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP たとえば、1ãƒŦベãƒĢぎパãƒĒãƒ†ã‚Ŗäŋč­ˇãŽãŋãĢé–ĸåŋƒãŒã‚ã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæŦĄãŽå ´æ‰€ãĢあるとしぞす。 .PP .RS 4 /mnt/diskp <\- パãƒĒãƒ†ã‚Ŗį”¨ãĢé¸æŠžã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ .PD 0 .PP .PD /mnt/disk1 <\- äŋč­ˇã™ã‚‹æœ€åˆãŽãƒ‡ã‚Ŗã‚šã‚¯ .PD 0 .PP .PD /mnt/disk2 <\- äŋč­ˇã™ã‚‹2į•Ēį›ŽãŽãƒ‡ã‚Ŗã‚šã‚¯ .PD 0 .PP .PD /mnt/disk3 <\- äŋč­ˇã™ã‚‹3į•Ēį›ŽãŽãƒ‡ã‚Ŗã‚šã‚¯ .PD 0 .PD .RE .PP æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢ \`/etc/snapraid.conf\` をæŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§äŊœæˆã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP WindowsをäŊŋį”¨ã—ãĻã„ã‚‹å ´åˆã¯ã€ã‚šãƒŠãƒƒã‚ˇãƒĨではãĒããƒ‰ãƒŠã‚¤ãƒ–æ–‡å­—ã¨ãƒãƒƒã‚¯ã‚šãƒŠãƒƒã‚ˇãƒĨを äŊŋį”¨ã—ãŸWindowsぎパ゚åŊĸåŧã‚’äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP ãƒ‡ã‚Ŗã‚šã‚¯ãŒå¤šããĻドナイブ文字が不čļŗã™ã‚‹å ´åˆã¯ã€ã‚ĩブフりãƒĢダãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’ į›´æŽĨマã‚Ļãƒŗãƒˆã§ããžã™ã€‚å‚į…§īŧš .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP ã“ãŽæ™‚į‚šã§ã€ãƒ‘ãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’æ§‹į¯‰ã™ã‚‹ãŸã‚ãĢ \`sync\` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã™ã‚‹æē–備が整いぞした。 .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP こぎプロã‚ģ゚は、æ—ĸãĢãƒ‡ã‚Ŗã‚šã‚¯ãĢ存在するデãƒŧã‚ŋぎã‚ĩイã‚ēãĢåŋœã˜ãĻ、初回は数時間かかる å ´åˆãŒã‚ã‚Šãžã™ã€‚ãƒ‡ã‚Ŗã‚šã‚¯ãŒįŠēぎ場合は、プロã‚ģã‚šã¯åŗåē§ãĢ厌äē†ã—ぞす。 .PP Ctrl+CをæŠŧすことでいつでも停æ­ĸでき、æŦĄå›žãŽåŽŸčĄŒæ™‚ãĢは中断された場所から再開されぞす。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ãŒåŽŒäē†ã™ã‚‹ã¨ã€ãƒ‡ãƒŧã‚ŋは**SAFE**ãĢãĒりぞす。 .PP これで、ã‚ĸãƒŦイをč‡Ēį”ąãĢäŊŋã„å§‹ã‚ã€åŽšæœŸįš„ãĢ \`sync\` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’ 更新できぞす。 .SS Scrubbing デãƒŧã‚ŋとパãƒĒãƒ†ã‚ŖãŽã‚¨ãƒŠãƒŧã‚’åŽšæœŸįš„ãĢチェックするãĢは、\`scrub\` ã‚ŗãƒžãƒŗãƒ‰ã‚’ åŽŸčĄŒã§ããžã™ã€‚ .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€é…åˆ—å†…ãŽãƒ‡ãƒŧã‚ŋを \`sync\` ã‚ŗãƒžãƒŗãƒ‰ä¸­ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨと比čŧƒã—ãĻ、 整合性を検č¨ŧしぞす。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã‚’1å›žåŽŸčĄŒã™ã‚‹ã¨ã€å‰å›žãŽ10æ—Ĩ間でæ—ĸãĢ゚クナブされたデãƒŧã‚ŋを除いãĻ、 ã‚ĸãƒŦã‚¤ãŽį´„8%がチェックされぞす。 \-p, \-\-plan ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻį•°ãĒる量を指厚でき、 \-o, \-\-older\-than ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻį•°ãĒるįĩŒéŽæ—Ĩ数で 指厚できぞす。 たとえば、20æ—ĨäģĨ上įĩŒéŽã—たブロックぎ5%をチェックするãĢは、æŦĄãŽã‚ˆã†ãĢäŊŋį”¨ã—ãžã™ã€‚ .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP プロã‚ģ゚中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€ 寞åŋœã™ã‚‹ãƒ–ロックは \`content\` ãƒ•ã‚Ąã‚¤ãƒĢå†…ã§ä¸č‰¯ã¨ã—ãĻマãƒŧクされ、 \`status\` ã‚ŗãƒžãƒŗãƒ‰ã§ä¸€čĻ§čĄ¨į¤ēされぞす。 .PP .RS 4 snapraid status .PD 0 .PD .RE .PP それらをäŋŽæ­Ŗã™ã‚‹ãĢは、\-e, \-\-filter\-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãĻ、 \`fix\` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP æŦĄå›žãŽ \`scrub\` で、エナãƒŧがæœŦåŊ“ãĢäŋŽæ­Ŗã•れãĻいれば、\`status\` ãƒŦポãƒŧトから エナãƒŧはæļˆãˆãžã™ã€‚よりéĢ˜é€ŸãĢするためãĢ、\`\-p bad\` をäŊŋį”¨ã—ãĻä¸č‰¯ã¨ã—ãĻマãƒŧクされた ブロックぎãŋを゚クナブできぞす。 .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP æœĒ同期ぎã‚ĸãƒŦイで \`scrub\` ã‚’åŽŸčĄŒã™ã‚‹ã¨ã€å‰Šé™¤ãžãŸã¯å¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ˆãŖãĻ åŧ•きčĩˇã“されたエナãƒŧãŒå ąå‘Šã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚¨ãƒŠãƒŧは \`scrub\` ぎ å‡ēåŠ›ã§å ąå‘Šã•ã‚Œãžã™ãŒã€é–ĸé€Ŗã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞせん。 .SS Pooling æŗ¨: ここでčĒŦ明するプãƒŧãƒĒãƒŗã‚°æŠŸčƒŊは、**mergerfs** ツãƒŧãƒĢãĢå–ãŖãĻäģŖã‚ã‚‰ã‚Œãžã—た。 mergerfs は、SnapRAIDã‚ŗãƒŸãƒĨãƒ‹ãƒ†ã‚ŖãŽLinuxãƒĻãƒŧã‚ļãƒŧãĢ推åĨ¨ã•れるã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã™ã€‚ Mergefs ã¯ã€č¤‡æ•°ãŽãƒ‰ãƒŠã‚¤ãƒ–ã‚’å˜ä¸€ãŽįĩąåˆã•れたマã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆãĢプãƒŧãƒĢするためぎ、 より柔čģŸã§åŠšįŽ‡įš„ãĒæ–šæŗ•ã‚’æäž›ã—ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ãĢé ŧることãĒくã‚ĸãƒŦイ全äŊ“ぎ ãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ˇãƒŧムãƒŦ゚ãĢã‚ĸクã‚ģ゚できぞす。これは、パãƒĒãƒ†ã‚Ŗäŋč­ˇãŽãŸã‚ãĢSnapRAIDと うぞくįĩąåˆã•れãĻおり、OpenMediaVault (OMV) やã‚Ģ゚ã‚ŋムNAS構成ãĒおぎã‚ģットã‚ĸップで 一čˆŦįš„ãĢäŊŋį”¨ã•ã‚ŒãĻいぞす。 .PP ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒツãƒĒãƒŧãĢ襨į¤ēさせるãĢは、 \`pooling\` 抟čƒŊを有劚ãĢã§ããžã™ã€‚ã“ã‚Œã¯ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’äŊŋį”¨ã—ãĻ、 ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎčĒ­ãŋå–ã‚Šå°‚į”¨ãŽäģŽæƒŗãƒ“ãƒĨãƒŧをäŊœæˆã—ぞす。 .PP æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで \`pooling\` ãƒ‡ã‚ŖãƒŦクトãƒĒをæŦĄãŽã‚ˆã†ãĢ構成できぞす。 .PP .RS 4 pool /pool .PD 0 .PD .RE .PP ぞたは、Windowsぎ場合は、æŦĄãŽã‚ˆã†ãĢしぞす。 .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP そしãĻ、\`pool\` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻäģŽæƒŗãƒ“ãƒĨãƒŧをäŊœæˆãžãŸã¯æ›´æ–°ã—ぞす。 .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP UnixプナットフりãƒŧムをäŊŋį”¨ã—ãĻãŠã‚Šã€ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをWindowsぞたはUnixãƒžã‚ˇãƒŗãĢ ネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã—たい場合は、\`/etc/samba/smb.conf\` ãĢæŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ čŋŊ加するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP .RS 4 # smb.conf ぎ global ã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§ .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # smb.conf ぎ share ã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§ .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP Windowsでは、ネットワãƒŧクįĩŒį”ąã§ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’å…ąæœ‰ã™ã‚‹ãĢは、クナイã‚ĸãƒŗãƒˆãŒ それらをãƒĒãƒĸãƒŧãƒˆã§č§Ŗæąēするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ã“ã‚Œã‚’æœ‰åŠšãĢするãĢは、プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒを å…ąæœ‰ã™ã‚‹ã“ã¨ãĢ加えãĻã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãŸ**ãƒ‡ã‚Ŗã‚šã‚¯å**ã‚’å…ąæœ‰ãƒã‚¤ãƒŗãƒˆã¨ã—ãĻ äŊŋį”¨ã—ãĻ、**すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’å€‹åˆĨãĢ**å…ąæœ‰ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãžãŸã€ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆãŒ ã“ã‚Œã‚‰ãŽå…ąæœ‰ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ĸクã‚ģ゚するためãĢäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚‹Windows UNCパ゚を、 æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢぎ \`share\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP たとえば、\`darkstar\` という名前ぎã‚ĩãƒŧバãƒŧで操äŊœã—ãĻいる場合、æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã§ããžã™ã€‚ .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP そしãĻ、æŦĄãŽãƒ‡ã‚ŖãƒŦクトãƒĒをネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã—ぞす。 .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP これãĢより、ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆã¯ \`\\\\darkstar\\pool\` ですずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢãĢ ã‚ĸクã‚ģ゚できるようãĢãĒりぞす。 .PP ぞた、ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆãŒãƒĒãƒĸãƒŧãƒˆã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¸ãŽã‚ĸクã‚ģ゚を有劚ãĢするためãĢ、 æŦĄãŽã‚ŗãƒžãƒŗãƒ‰ã§æ§‹æˆã™ã‚‹åŋ…čĻãŒã‚ã‚‹å ´åˆã‚‚ã‚ã‚Šãžã™ã€‚ .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAIDはRAIDã‚ˇã‚šãƒ†ãƒ ã‚ˆã‚Šã‚‚ãƒãƒƒã‚¯ã‚ĸッププログナムぎようãĢ抟čƒŊし、 \-f, \-\-filter ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻãƒ•ã‚Ąã‚¤ãƒĢをäģĨ前ぎįŠļ態ãĢåžŠå…ƒãžãŸã¯å‰Šé™¤č§Ŗé™¤ã™ã‚‹ãŸã‚ãĢ äŊŋį”¨ã§ããžã™ã€‚ .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP ãžãŸã¯ãƒ‡ã‚ŖãƒŦクトãƒĒぎ場合はīŧš .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP ぞた、\-m, \-\-filter\-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€ãƒ‡ã‚ŖãƒŦクトãƒĒ内ぎ**čĒ¤ãŖãĻå‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎãŋ**を 垊旧するためãĢäŊŋį”¨ã™ã‚‹ã“ã¨ã‚‚ã§ããžã™ã€‚ã“ã‚ŒãĢより、不čļŗã—ãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが垊元され、 äģ–ãŽãƒ•ã‚Ąã‚¤ãƒĢはすずãĻそぎぞぞ掋されぞす。 .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP ぞたは、すずãĻぎドナイブ上ぎすずãĻãŽå‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢを垊旧するãĢはīŧš .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering 最æ‚Ēぎä狿…‹ãŒį™ēį”Ÿã—ã€1台äģĨä¸ŠãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’å¤ąã„ãžã—ãŸīŧ .PP **パニックãĢãĒらãĒいでくださいīŧ** 垊旧できぞすīŧ .PP 最初ãĢčĄŒã†ãšãã“ã¨ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイへぎ**さらãĒる変更をéŋける**ことです。 ãƒĒãƒĸãƒŧトæŽĨįļšã€ãŠã‚ˆãŗã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたSnapRAIDぎ夜間 \`sync\` や \`scrub\` をåĢむ、 すずãĻãŽã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたプロã‚ģã‚šã‚’į„ĄåŠšãĢしãĻください。 .PP æŦĄãĢ、æŦĄãŽæ‰‹é †ãĢ進ãŋぞす。 .SS STEP 1 \-> Reconfigure 垊旧ぎためãĢいくらかぎ゚ペãƒŧ゚がåŋ…čĻã§ã™ã€‚į†æƒŗįš„ãĢはčŋŊ加ぎ äēˆå‚™ãƒ‡ã‚Ŗã‚šã‚¯ã§ã™ãŒã€å¤–部USBãƒ‡ã‚Ŗã‚šã‚¯ã‚„ãƒĒãƒĸãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ã§ã‚‚ååˆ†ã§ã™ã€‚ .PP SnapRAIDãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを変更しãĻã€æ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽ \`data\` ぞたは \`parity\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ã€ãƒ•ã‚Ąã‚¤ãƒĢを垊旧するためぎ十分ãĒįŠēき厚量ぎある場所ãĢ 向けぞす。 .PP ãŸã¨ãˆã°ã€ãƒ‡ã‚Ŗã‚šã‚¯ \`d1\` が故障した場合、æŦĄãŽã‚ˆã†ãĢ変更しぞす。 .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP からīŧš .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP åžŠæ—§ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãŒãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆã¯ã€éŠåˆ‡ãĒ \`parity\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ 更新しぞす。 č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻいる場合は、すずãĻぎ構成ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æ›´æ–°ã—ãžã™ã€‚ .SS STEP 2 \-> Fix ãƒ­ã‚°ã‚’å¤–éƒ¨ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ãĻ、\`fix\` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãžã™ã€‚ .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP ここで NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã§ã‚ã‚Šã€å‰ãŽäž‹ã§ã¯ \`d1\` ぎようãĒもぎです。 åžŠæ—§ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãŒãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆã¯ã€\`parity\`、\`2\-parity\` ãĒおぎ 名前をäŊŋį”¨ã—ãžã™ã€‚ č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻã„ã‚‹å ´åˆã¯ã€č¤‡æ•°ãŽ \`\-d\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ すずãĻを指厚しぞす。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯æ™‚é–“ãŒã‹ã‹ã‚Šãžã™ã€‚ .PP \`fix.log\` ãƒ•ã‚Ąã‚¤ãƒĢをäŋå­˜ã™ã‚‹ãŸã‚ãĢ数ゎã‚ŦバイトぎįŠēき厚量があることをįĸēčĒã—ãĻください。 十分ãĒįŠēãåŽšé‡ãŽã‚ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰åŽŸčĄŒã—ãĻください。 .PP これで、垊旧可čƒŊãĒすずãĻãŽã‚‚ãŽãŒåžŠæ—§ã•ã‚Œãžã—ãŸã€‚ä¸€éƒ¨ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒéƒ¨åˆ†įš„ãžãŸã¯åŽŒå…¨ãĢ 垊旧できãĒい場合、それらは \`.unrecoverable\` æ‹Ąåŧĩ子をčŋŊ加しãĻ名前が変更されぞす。 .PP \`fix.log\` ãƒ•ã‚Ąã‚¤ãƒĢで、\`unrecoverable:\` で始ぞるすずãĻãŽčĄŒã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã€ すずãĻぎ垊旧不čƒŊãĒãƒ–ãƒ­ãƒƒã‚¯ãŽčŠŗį´°ãĒãƒĒ゚トをčĻ‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ .PP 垊旧ãĢæē€čļŗã§ããĒい場合は、äŊ•åēĻでも再čŠĻčĄŒã§ããžã™ã€‚ .PP たとえば、最垌ぎ \`sync\` ぎ垌ãĢã‚ĸãƒŦã‚¤ã‹ã‚‰ãƒ•ã‚Ąã‚¤ãƒĢを削除した場合、 これãĢã‚ˆã‚Šä¸€éƒ¨ãŽãƒ•ã‚Ąã‚¤ãƒĢが垊旧されãĒい可čƒŊ性がありぞす。 こぎ場合、\-i, \-\-import ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒįžåœ¨ãŠã“ãĢあるかを指厚することで、 垊旧プロã‚ģ゚ãĢそれらを再åēĻåĢめるようãĢ \`fix\` を再čŠĻčĄŒã§ããžã™ã€‚ .PP 垊旧ãĢæē€čļŗã—ãĻいる場合は、さらãĢé€˛ã‚€ã“ã¨ãŒã§ããžã™ãŒã€**sync** ãŽåŽŸčĄŒåžŒãĢは \`fix\` ã‚ŗãƒžãƒŗãƒ‰ã‚’**再čŠĻčĄŒã§ããĒい**ことãĢæŗ¨æ„ã—ãĻくださいīŧ .SS STEP 3 \-> Check 慎重ãĒチェックとしãĻ、\`check\` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻã€åžŠæ—§ã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽ すずãĻãŒæ­Ŗã—ã„ã“ã¨ã‚’įĸēčĒã§ããžã™ã€‚ .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP ここで NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã§ã‚ã‚Šã€å‰ãŽäž‹ã§ã¯ \`d1\` ぎようãĒもぎです。 .PP \`\-d\` ãŠã‚ˆãŗ \`\-a\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€SnapRAIDãĢ**æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋ**をチェックし、 **すずãĻぎパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã‚’į„ĄčĻ–**するようãĢ指į¤ēしぞす。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯æ™‚é–“ãŒã‹ã‹ã‚Šãžã™ãŒã€éŽåēĻãĢ慎重でãĒい場合ぱキップできぞす。 .SS STEP 4 \-> Sync \`sync\` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻ、ã‚ĸãƒŦã‚¤ã‚’æ–°ã—ã„ãƒ‡ã‚Ŗã‚šã‚¯ã¨å†åŒæœŸã—ãžã™ã€‚ .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP すずãĻが垊旧されãĻã„ã‚Œã°ã€ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯åŗåē§ãĢ厌äē†ã—ぞす。 .SH COMMANDS SnapRAIDは、æŦĄãŽã“とを可čƒŊãĢã™ã‚‹ã„ãã¤ã‹ãŽį°Ąå˜ãĒã‚ŗãƒžãƒŗãƒ‰ã‚’æäž›ã—ãžã™ã€‚ .PD 0 .IP \(bu ã‚ĸãƒŦイぎįŠļ態ぎæĻ‚čĻã‚’å‡ē力 \-> \`status\` .IP \(bu ãƒ‡ã‚Ŗã‚šã‚¯ãŽåˆļåžĄ \-> \`smart\`、\`probe\`、\`up\`、\`down\` .IP \(bu バックã‚ĸップ/ã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãŽäŊœæˆ \-> \`sync\` .IP \(bu デãƒŧã‚ŋãŽåŽšæœŸįš„ãĒチェック \-> \`scrub\` .IP \(bu 最垌ぎバックã‚ĸップ/ã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãŽåžŠå…ƒ \-> \`fix\`。 .PD .PP ã‚ŗãƒžãƒŗãƒ‰ã¯**小文字**ã§č¨˜čŋ°ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .SS status ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎįŠļ態ぎæĻ‚čĻã‚’å‡ē力しぞす。 .PP これãĢは、パãƒĒãƒ†ã‚ŖãŽæ–­į‰‡åŒ–ã€ãƒã‚§ãƒƒã‚¯ãĒã—ã§ãŽãƒ–ãƒ­ãƒƒã‚¯ãŽå¤ã•ã€ãŠã‚ˆãŗ ã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°ä¸­ãĢ遭遇したすずãĻãŽč¨˜éŒ˛ã•ã‚ŒãŸã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧãĢé–ĸã™ã‚‹æƒ…å ąãŒ åĢぞれぞす。 .PP 提į¤ēã•ã‚Œã‚‹æƒ…å ąã¯ã€æœ€åžŒãĢ \`sync\` ã‚’åŽŸčĄŒã—ãŸæ™‚į‚šãŽã‚‚ãŽã§ã™ã€‚ それäģĨé™ãŽå¤‰æ›´ã¯č€ƒæ…Žã•ã‚Œãžã›ã‚“ã€‚ .PP ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ãŒæ¤œå‡ēされた場合、それらぎブロックį•ĒåˇãŒä¸€čĻ§čĄ¨į¤ēされぞす。 それらをäŋŽæ­Ŗã™ã‚‹ãĢは、\`fix \-e\` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ .PP ぞた、各ブロックが最垌ãĢ゚クナブぞたは同期された時期をį¤ēã™ã‚°ãƒŠãƒ•ã‚‚čĄ¨į¤ēされぞす。 ゚クナブされたブロックは \`*\` で、同期されたがぞだ゚クナブされãĻいãĒいブロックは \`o\` で į¤ēされぞす。 .PP äŊ•も変更されぞせん。 .SS smart ã‚ˇã‚šãƒ†ãƒ å†…ãŽã™ãšãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTãƒŦポãƒŧトをå‡ē力しぞす。 .PP これãĢは、įŋŒåš´ãŽæ•…éšœįĸēįŽ‡ãŽæŽ¨åŽšå€¤ãŒåĢぞれãĻãŠã‚Šã€į–‘ã‚ã—ã„åąžæ€§ã‚’į¤ēã™ãƒ‡ã‚Ŗã‚šã‚¯ãŽ ãƒĄãƒŗãƒ†ãƒŠãƒŗã‚šä礿›ã‚’č¨ˆį”ģできぞす。 .PP こぎįĸēįŽ‡æŽ¨åŽšã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTåąžæ€§ã‚’æŦĄãŽå ´æ‰€ã§åˆŠį”¨å¯čƒŊãĒBackblazeぎデãƒŧã‚ŋと ᛏé–ĸさせることで垗られぞす。 .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP SMARTãŒãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻã„ã‚‹ã¨å ąå‘Šã—ãŸå ´åˆã€ããŽãƒ‡ã‚Ŗã‚šã‚¯ãĢ寞しãĻ \`FAIL\` ぞたは \`PREFAIL\` が å‡ē力され、SnapRAIDはエナãƒŧをčŋ”しぞす。 こぎ場合、**ãƒ‡ã‚Ŗã‚šã‚¯ãŽåŗæ™‚ä礿›**がåŧˇãæŽ¨åĨ¨ã•れぞす。 .PP そぎäģ–ぎ可čƒŊãĒ゚テãƒŧã‚ŋ゚文字列はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ .RS 4 .PD 0 .HP 4 .I logfail 過åŽģãĢã€ä¸€éƒ¨ãŽåąžæ€§ãŒã—ãã„å€¤ã‚ˆã‚Šã‚‚äŊŽã‹ãŖãŸã€‚ .HP 4 .I logerr デバイ゚ぎエナãƒŧログãĢエナãƒŧがåĢぞれãĻいる。 .HP 4 .I selferr デバイ゚ぎã‚ģãƒĢフテ゚トログãĢエナãƒŧがåĢぞれãĻいる。 .PD .RE .TP .B \-v, \-\-verbose ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻã„ã‚‹å ´åˆã€ã‚ˆã‚ŠčŠŗį´°ãĒįĩąč¨ˆåˆ†æžãŒæäž›ã•れぞす。 こぎ分析は、より多くぞたはより少ãĒいパãƒĒãƒ†ã‚ŖãŒåŋ…čĻã‹ãŠã†ã‹ã‚’æąē厚するぎãĢåŊšįĢ‹ãĄãžã™ã€‚ .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ \`smartctl\` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で \`smartctl \-a\` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ .PP ãƒ‡ãƒã‚¤ã‚šãŒæ­Ŗã—ãč‡Ē動検å‡ēされãĒã„å ´åˆã¯ã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで \`smartctl\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã—ãĻã‚Ģ゚ã‚ŋãƒ ã‚ŗãƒžãƒŗãƒ‰ã‚’æŒ‡åŽšã§ããžã™ã€‚ .PP äŊ•も変更されぞせん。 .SS probe ã‚ˇã‚šãƒ†ãƒ å†…ãŽã™ãšãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽPOWERįŠļ態をå‡ē力しぞす。 .PP \`Standby\` ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻいãĒã„ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚\`Active\` は ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻã„ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ \`smartctl\` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で \`smartctl \-n standby \-i\` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ .PP ãƒ‡ãƒã‚¤ã‚šãŒæ­Ŗã—ãč‡Ē動検å‡ēされãĒã„å ´åˆã¯ã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで \`smartctl\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã—ãĻã‚Ģ゚ã‚ŋãƒ ã‚ŗãƒžãƒŗãƒ‰ã‚’æŒ‡åŽšã§ããžã™ã€‚ .PP äŊ•も変更されぞせん。 .SS up ã‚ĸãƒŦイぎすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã‚šãƒ”ãƒŗã‚ĸップしぞす。 .TP .B \-d, \-\-filter\-disk ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į‰šåŽšãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋã‚’ã‚šãƒ”ãƒŗã‚ĸップできぞす。 .PP すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŒæ™‚ãĢã‚šãƒ”ãƒŗã‚ĸップするãĢは、多くぎé›ģ力がåŋ…čĻã§ã™ã€‚ é›ģæēãŒãã‚ŒãĢč€ãˆã‚‰ã‚Œã‚‹ã“ã¨ã‚’įĸēčĒã—ãĻください。 .PP äŊ•も変更されぞせん。 .SS down ã‚ĸãƒŦイぎすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãžã™ã€‚ .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ \`smartctl\` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で \`smartctl \-s standby,now\` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ .TP .B \-d, \-\-filter\-disk ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į‰šåŽšãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋã‚’ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã§ããžã™ã€‚ .PP エナãƒŧ時ãĢč‡Ēå‹•įš„ãĢã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã™ã‚‹ãĢは、äģ–ぎäģģæ„ãŽã‚ŗãƒžãƒŗãƒ‰ã§ \-s, \-\-spin\-down\-on\-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã§ããžã™ã€‚ã“ã‚Œã¯ã€ã‚¨ãƒŠãƒŧがį™ēį”Ÿã—ãŸã¨ããĢ手動で \`down\` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨åŒį­‰ã§ã™ã€‚ .PP äŊ•も変更されぞせん。 .SS diff 最垌ぎ \`sync\` äģĨ降ãĢ変更され、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã‚’å†č¨ˆįŽ—ã™ã‚‹åŋ…čĻãŒã‚ã‚‹ã™ãšãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを 一čĻ§čĄ¨į¤ēしぞす。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋã¯ãƒã‚§ãƒƒã‚¯ã›ãšã€ãƒ•ã‚Ąã‚¤ãƒĢぎã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ã‚ĩイã‚ē、 ãŠã‚ˆãŗinodeぎãŋをチェックしぞす。 .PP 変更されたすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを一čĻ§čĄ¨į¤ēした垌、変更ぎæĻ‚čĻãŒ æŦĄãŽã‚ˆã†ãĢグãƒĢãƒŧプ化されãĻ提į¤ēされぞす。 .RS 4 .PD 0 .HP 4 .I equal 変更されãĻいãĒã„ãƒ•ã‚Ąã‚¤ãƒĢ。 .HP 4 .I added äģĨ前は存在しãĒã‹ãŖãŸčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 .HP 4 .I removed å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 .HP 4 .I updated ã‚ĩイã‚ēぞたはã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒį•°ãĒã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ。これは、 å¤‰æ›´ã•ã‚ŒãŸã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ .HP 4 .I moved åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽį•°ãĒã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 同じ名前、ã‚ĩイã‚ē、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ãŠã‚ˆãŗinodeã‚’æŒãĄãžã™ãŒã€ãƒ‡ã‚ŖãƒŦクトãƒĒが į•°ãĒã‚‹ã“ã¨ã§č­˜åˆĨされぞす。 .HP 4 .I copied å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢãŒãžã å­˜åœ¨ã™ã‚‹ã€åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ãžãŸã¯åˆĨぎ ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 これらは、同じ名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’æŒã¤ã“ã¨ ãĢã‚ˆãŖãĻ識åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロぎ場合、名前だけでãĒくフãƒĢパ゚ ãŒä¸€č‡´ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .HP 4 .I relocated ã‚ĒãƒĒジナãƒĢがæļˆå¤ąã—ãŸã€åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ãžãŸã¯åˆĨãŽãƒ‡ã‚Ŗ ゚クãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 これらは、同じ名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’æŒã¤ã“ã¨ ãĢã‚ˆãŖãĻ識åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧãƒ­ãŽå ´åˆã€č­˜åˆĨするãĢはフãƒĢパ゚が ä¸€č‡´ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽ \'moved\' ãƒ•ã‚Ąã‚¤ãƒĢã¨ã¯į•°ãĒり、再配įŊŽã•れた ãƒ•ã‚Ąã‚¤ãƒĢã¯į•°ãĒる inode ã‚’æŒãĄãžã™ã€‚ .HP 4 .I restored inode ã¯į•°ãĒã‚‹ãŒã€ãƒ‡ã‚ŖãƒŦクトãƒĒ、名前、ã‚ĩイã‚ē、お ã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ。 これらは通常、削除された垌ãĢåžŠå…ƒã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢです。 .PD .RE .PP \`sync\` がåŋ…čρãĒ場合、プロã‚ģ゚はデフりãƒĢトぎ0ではãĒく、ãƒĒã‚ŋãƒŧãƒŗã‚ŗãƒŧド2をčŋ”しぞす。 ãƒĒã‚ŋãƒŧãƒŗã‚ŗãƒŧド1は、一čˆŦįš„ãĒエナãƒŧįŠļ態ãĢäŊŋį”¨ã•ã‚Œãžã™ã€‚ .PP äŊ•も変更されぞせん。 .SS sync パãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’æ›´æ–°ã—ãžã™ã€‚ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎすずãĻãŽå¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢがčĒ­ãŋ取られ、 寞åŋœã™ã‚‹ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋが更新されぞす。 .PP Ctrl+CをæŠŧすことでいつでもこぎプロã‚ģ゚を停æ­ĸでき、 æ—ĸãĢ厌äē†ã—たäŊœæĨ­ã‚’å¤ąã†ã“ã¨ã¯ã‚ã‚Šãžã›ã‚“ã€‚ æŦĄå›žãŽåŽŸčĄŒæ™‚ãĢは、\`sync\` プロã‚ģ゚は中断された場所から 再開されぞす。 .PP プロã‚ģ゚中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€ 寞åŋœã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞす。 .PP ãƒ•ã‚Ąã‚¤ãƒĢã¯ãƒ‘ã‚šãŠã‚ˆãŗ/ぞたはinodeãĢã‚ˆãŖãĻ識åˆĨされ、ã‚ĩイã‚ēとã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĢã‚ˆãŖãĻ チェックされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēぞたはã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒį•°ãĒる場合、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã¯ãƒ•ã‚Ąã‚¤ãƒĢ全äŊ“で å†č¨ˆįŽ—ã•ã‚Œãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢãŒåŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§į§ģ動ぞたは名前が変更され、同じinodeがäŋæŒã•れãĻいる場合、 パãƒĒãƒ†ã‚Ŗã¯å†č¨ˆįŽ—ã•ã‚Œãžã›ã‚“ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢがåˆĨãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢį§ģ動された場合、パãƒĒãƒ†ã‚Ŗã¯å†č¨ˆįŽ—ã•ã‚Œãžã™ãŒã€ äģĨ前ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨæƒ…å ąã¯äŋæŒã•れぞす。 .PP \`content\` ãƒ•ã‚Ąã‚¤ãƒĢと \`parity\` ãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 .SS scrub ã‚ĸãƒŦイを゚クナブし、デãƒŧã‚ŋãŠã‚ˆãŗãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧを チェックしぞす。 .PP 1回ぎå‘ŧãŗå‡ēしごとãĢ、最垌ぎ10æ—Ĩ間でæ—ĸãĢ゚クナブされたデãƒŧã‚ŋを除いãĻ、 ã‚ĸãƒŦã‚¤ãŽį´„8%がチェックされぞす。 ã“ã‚Œã¯ã€é€ąãĢ1å›žã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°ã‚’åŽŸčĄŒã™ã‚‹ã¨ã€ã™ãšãĻぎデãƒŧã‚ŋが少ãĒくとも3か月ãĢ1回は ãƒã‚§ãƒƒã‚¯ã•ã‚Œã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ .TP .B \-p, \-\-plan ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į•°ãĒã‚‹ã‚šã‚¯ãƒŠãƒ–ãƒ—ãƒŠãƒŗãžãŸã¯é‡ã‚’åŽšįžŠã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯äģĨ下を受けå…Ĩれぞす。 bad \- ä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックを゚クナブしぞす。 new \- ぞだ゚クナブされãĻいãĒい、同期されたばかりぎブロックを゚クナブしぞす。 full \- すずãĻを゚クナブしぞす。 0\-100 \- 指厚されたパãƒŧã‚ģãƒŗãƒ†ãƒŧジぎブロックを゚クナブしぞす。 .PP パãƒŧã‚ģãƒŗãƒ†ãƒŧジぎ量を指厚する場合、\-o, \-\-older\-than ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ、 ブロックがおれくらいぎ古さであるåŋ…čĻãŒã‚ã‚‹ã‹ã‚’åŽšįžŠã™ã‚‹ã“ã¨ã‚‚ã§ããžã™ã€‚ 最も古いブロックが最初ãĢ゚クナブされ、最遊ãĒチェックがäŋč¨ŧされぞす。 ぞだ゚クナブされãĻいãĒい、同期されたばかりぎブロックぎãŋを゚クナブしたい場合は、 \`\-p new\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ .PP ゚クナブ゚テãƒŧã‚ŋã‚šãŽčŠŗį´°ã‚’å–åž—ã™ã‚‹ãĢは、\`status\` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãžã™ã€‚ .PP čĻ‹ã¤ã‹ãŖãŸã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧごとãĢ、寞åŋœã™ã‚‹ãƒ–ロックは \`content\` ãƒ•ã‚Ąã‚¤ãƒĢå†…ã§ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞす。 ã“ã‚Œã‚‰ãŽä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã¯ \`status\` で一čĻ§čĄ¨į¤ēされ、\`fix \-e\` でäŋŽæ­Ŗã§ããžã™ã€‚ äŋŽæ­ŖåžŒã€æŦĄå›žãŽã‚šã‚¯ãƒŠãƒ–で再チェックされ、äŋŽæ­Ŗã•れãĻいると判明した場合、 ä¸č‰¯ãƒžãƒŧクは削除されぞす。 ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ãŽãŋを゚クナブするãĢは、\`scrub \-p bad\` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ .PP æœĒ同期ぎデãƒŧã‚ŋãĢã‚ˆãŖãĻåŧ•きčĩˇã“ã•ã‚ŒãŸå ąå‘Šã•ã‚ŒãŸã‚¨ãƒŠãƒŧをéŋけるためãĢ、 \`scrub\` は**同期された**ã‚ĸãƒŦイでぎãŋåŽŸčĄŒã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚¨ãƒŠãƒŧは ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧではãĒいとčĒč­˜ã•ã‚Œã€ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞせんが、 そぎようãĒエナãƒŧã¯ã‚ŗãƒžãƒŗãƒ‰ãŽå‡ēåŠ›ã§å ąå‘Šã•ã‚Œãžã™ã€‚ .PP \`content\` ãƒ•ã‚Ąã‚¤ãƒĢは、各ブロックぎ最垌ぎチェック時åˆģã‚’æ›´æ–°ã—ã€ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ マãƒŧクするためãĢ変更されぞす。 \`parity\` ãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 .SS fix すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŋŽæ­Ŗã—ぞす。 .PP すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋは、最垌ぎ \`sync\` でäŋå­˜ã•ã‚ŒãŸã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆįŠļ態と 比čŧƒã•れぞす。 違いがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€äŋå­˜ã•ã‚ŒãŸã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãĢ**元ãĢæˆģされぞす**。 .PP **č­Ļ告īŧ** \`fix\` ã‚ŗãƒžãƒŗãƒ‰ã¯ã€ã‚¨ãƒŠãƒŧã¨æ„å›ŗįš„ãĒ変更をåŒēåˆĨしぞせん。 ãƒ•ã‚Ąã‚¤ãƒĢぎ_įŠļ態を_最垌ぎ \`sync\` ãĢ**į„ĄæĄäģļãĢ元ãĢæˆģしぞす**。 .PP äģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいãĒい場合、ã‚ĸãƒŦイ全äŊ“がå‡Ļį†ã•ã‚Œãžã™ã€‚ ãƒ•ã‚ŖãƒĢã‚ŋã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ、操äŊœã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽã‚ĩブã‚ģットを 選択しぞす。 .PP \`sync\` ãŠã‚ˆãŗ \`scrub\` 中ãĢä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックぎãŋをäŋŽæ­Ŗã™ã‚‹ãĢは、 \-e, \-\-filter\-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ äģ–ãŽãƒ•ã‚ŖãƒĢã‚ŋã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¨ã¯į•°ãĒり、これは最新ぎ \`sync\` äģĨ降ãĢ**変更されãĻいãĒい** ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋäŋŽæ­Ŗã‚’éŠį”¨ã—ãžã™ã€‚ .PP SnapRAIDは、äŋŽæ­Ŗã§ããĒいすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎ名前を \`.unrecoverable\` æ‹Ąåŧĩ子を čŋŊ加しãĻ変更しぞす。 .PP äŋŽæ­Ŗã™ã‚‹å‰ãĢ、ã‚ĸãƒŦイ全äŊ“ãŒã‚šã‚­ãƒŖãƒŗã•ã‚Œã€æœ€åžŒãŽ \`sync\` 操äŊœäģĨ降ãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢが čĻ‹ã¤ã‘ã‚‰ã‚Œãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢã¯ã€åå‰ã‚’į„ĄčĻ–ã—ãĻã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĢã‚ˆãŖãĻ識åˆĨされ、 åŋ…čρãĢåŋœã˜ãĻ垊旧プロã‚ģ゚でäŊŋį”¨ã•ã‚Œãžã™ã€‚ それらぎいくつかをã‚ĸãƒŦイ外ãĢį§ģ動した場合は、\-i, \-\-import ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ ã‚šã‚­ãƒŖãƒŗã™ã‚‹čŋŊåŠ ãŽãƒ‡ã‚ŖãƒŦクトãƒĒを指厚できぞす。 .PP ãƒ•ã‚Ąã‚¤ãƒĢは**パ゚ãĢã‚ˆãŖãĻぎãŋ**識åˆĨされ、inodeãĢã‚ˆãŖãĻã¯č­˜åˆĨされぞせん。 .PP \`content\` ãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 \`parity\` ãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 .SS check すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋを検č¨ŧしぞす。 .PP \`fix\` ぎようãĢ抟čƒŊしぞすが、垊旧を**ã‚ˇãƒŸãƒĨãƒŦãƒŧトするだけ**で、ã‚ĸãƒŦイãĢ**変更は書きčžŧぞれぞせん**。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€ä¸ģãĢ垊旧プロã‚ģ゚垌やそぎäģ–ãŽį‰šæŽŠãĒæĄäģļ下でぎ手動検č¨ŧを į›Žįš„ã¨ã—ãĻいぞす。 åŽšæœŸįš„ã§ã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたチェックãĢは、\`scrub\` をäŊŋį”¨ã—ãžã™ã€‚ .TP .B \-a, \-\-audit\-only ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ**ãƒãƒƒã‚ˇãƒĨぎãŋ**がチェックされ、 パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã¯į„ĄčĻ–ã•ã‚Œã‚‹ãŸã‚ã€ãƒã‚§ãƒƒã‚¯ãƒ—ãƒ­ã‚ģ゚が大嚅ãĢéĢ˜é€ŸåŒ–ã•ã‚Œãžã™ã€‚ .PP ãƒ•ã‚Ąã‚¤ãƒĢは**パ゚ãĢã‚ˆãŖãĻぎãŋ**識åˆĨされ、inodeãĢã‚ˆãŖãĻã¯č­˜åˆĨされぞせん。 .PP äŊ•も変更されぞせん。 .SS list 最垌ぎ \`sync\` ãŽæ™‚į‚šãŽã‚ĸãƒŦイãĢåĢぞれるすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを 一čĻ§čĄ¨į¤ēしぞす。 .TP .B \-v ぞたは \-\-verbose をäŊŋį”¨ã™ã‚‹ã¨ã€ã‚ĩãƒ–į§’ãŽæ™‚é–“ã‚‚čĄ¨į¤ēされぞす。 .PP äŊ•も変更されぞせん。 .SS dup すずãĻãŽé‡č¤‡ãƒ•ã‚Ąã‚¤ãƒĢを一čĻ§čĄ¨į¤ēã—ãžã™ã€‚ãƒãƒƒã‚ˇãƒĨãŒä¸€č‡´ã™ã‚‹å ´åˆã€2ã¤ãŽãƒ•ã‚Ąã‚¤ãƒĢã¯į­‰ã—ã„ã¨čĻ‹ãĒされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋはčĒ­ãŋ取られず、äē‹å‰ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨぎãŋがäŊŋį”¨ã•ã‚Œãžã™ã€‚ .PP äŊ•も変更されぞせん。 .SS pool \`pooling\` ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎäģŽæƒŗãƒ“ãƒĨãƒŧを äŊœæˆãžãŸã¯æ›´æ–°ã—ぞす。 .PP ãƒ•ã‚Ąã‚¤ãƒĢã¯ã‚ŗãƒ”ãƒŧã•ã‚Œãšã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’äŊŋį”¨ã—ãĻãƒĒãƒŗã‚¯ã•ã‚Œãžã™ã€‚ .PP 更新時、æ—ĸ存ぎすずãĻãŽã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¨įŠēぎã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒは削除され、 ã‚ĸãƒŦイぎ新しいビãƒĨãƒŧãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚そぎäģ–ãŽé€šå¸¸ãŽãƒ•ã‚Ąã‚¤ãƒĢはそぎぞぞ掋されぞす。 .PP プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒ外はäŊ•も変更されぞせん。 .SS devices ã‚ĸãƒŦイでäŊŋį”¨ã•ã‚Œã‚‹äŊŽãƒŦベãƒĢデバイ゚をå‡ē力しぞす。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€ã‚ĸãƒŦイ内ぎデバイ゚ぎé–ĸ逪äģ˜ã‘ã‚’čĄ¨į¤ēし、ä¸ģãĢ゚クãƒĒãƒ—ãƒˆã‚¤ãƒŗã‚ŋãƒŧフェイ゚を į›Žįš„ã¨ã—ãĻいぞす。 .PP 最初ぎ2つぎ列は、äŊŽãƒŦベãƒĢデバイ゚IDとパ゚です。 æŦĄãŽ2つぎ列は、é̘ãƒŦベãƒĢデバイ゚IDとパ゚です。 最垌ぎ列は、ã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ .PP ãģとんおぎ場合、ã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ1つぎäŊŽãƒŦベãƒĢデバイ゚がありぞすが、 ã‚ˆã‚Šč¤‡é›‘ãĒ構成では、単一ぎã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ã§č¤‡æ•°ãŽäŊŽãƒŦベãƒĢデバイ゚が äŊŋį”¨ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šãžã™ã€‚ .PP äŊ•も変更されぞせん。 .SS touch ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロãĢč¨­åŽšã•ã‚ŒãĻいるすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢãĢ、äģģæ„ãŽã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’ č¨­åŽšã—ãžã™ã€‚ .PP これãĢより、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒãģãŧ一意ãĢãĒã‚Šã€é‡č¤‡ãŽå¯čƒŊ性が減るため、 SnapRAIDがį§ģå‹•ãŠã‚ˆãŗã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢをčĒč­˜ã™ã‚‹čƒŊ力が向上しぞす。 .PP ã‚ˆã‚Šå…ˇäŊ“įš„ãĢは、ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロでãĒい場合、į§ģå‹•ãžãŸã¯ã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢは、 名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒä¸€č‡´ã™ã‚‹å ´åˆãĢãã†ã§ã‚ã‚‹ã¨č­˜åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロぎ場合、フãƒĢパ゚、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŽã™ãšãĻが ä¸€č‡´ã™ã‚‹å ´åˆãĢぎãŋã‚ŗãƒ”ãƒŧとčĻ‹ãĒされぞす。 .PP į§’į˛žåēĻぎã‚ŋイム゚ã‚ŋãƒŗãƒ—ã¯å¤‰æ›´ã•ã‚ŒãĒã„ãŸã‚ã€ãƒ•ã‚Ąã‚¤ãƒĢぎすずãĻぎæ—Ĩäģ˜ã¨æ™‚åˆģは äŋæŒã•れぞす。 .SS rehash ã‚ĸãƒŦイ全äŊ“ぎãƒĒãƒãƒƒã‚ˇãƒĨã‚’ã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢしぞす。 .PP ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€äŊŋį”¨ã•ã‚Œã‚‹ãƒãƒƒã‚ˇãƒĨãŽį¨ŽéĄžã‚’å¤‰æ›´ã—ãžã™ã€‚ã“ã‚Œã¯é€šå¸¸ã€32ãƒ“ãƒƒãƒˆã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰ 64ãƒ“ãƒƒãƒˆã‚ˇã‚šãƒ†ãƒ ãĢã‚ĸップグãƒŦãƒŧドするときãĢ、MurmurHash3からよりéĢ˜é€ŸãĒSpookyHashãĢ 切りæ›ŋえるためãĢčĄŒã‚ã‚Œãžã™ã€‚ .PP æ—ĸãĢ最遊ãĒãƒãƒƒã‚ˇãƒĨをäŊŋį”¨ã—ãĻã„ã‚‹å ´åˆã€ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯äŊ•もせず、ã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãŒä¸čĻã§ã‚ã‚‹ã“ã¨ã‚’ 通įŸĨしぞす。 .PP ãƒĒãƒãƒƒã‚ˇãƒĨはすぐãĢã¯åŽŸčĄŒã•ã‚Œãšã€\`sync\` ãŠã‚ˆãŗ \`scrub\` ぎ間ãĢ垐々ãĢåŽŸčĄŒã•ã‚Œãžã™ã€‚ .PP \`status\` をäŊŋį”¨ã—ãĻãƒĒãƒãƒƒã‚ˇãƒĨぎįŠļ態をįĸēčĒã§ããžã™ã€‚ .PP ãƒĒãƒãƒƒã‚ˇãƒĨ中もSnapRAIDは厌全ãĒ抟čƒŊをįļ­æŒã—ぞすが、唯一ぎ䞋外としãĻ、 \`dup\` ã¯į•°ãĒã‚‹ãƒãƒƒã‚ˇãƒĨをäŊŋį”¨ã—ãĻã„ã‚‹é‡č¤‡ãƒ•ã‚Ąã‚¤ãƒĢを検å‡ēできぞせん。 .SS locate パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãĢäŋå­˜ã•れãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを検į´ĸã—ãžã™ã€‚ä¸€č‡´ã™ã‚‹å„ãƒ•ã‚Ąã‚¤ãƒĢãĢついãĻ、 パãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢ内でぎäŊįŊŽã¨ã€ãã‚ŒãŒå æœ‰ã™ã‚‹ãƒ•ãƒŠã‚°ãƒĄãƒŗãƒˆãŽæ•°ã‚’å‡ē力しぞす。 .TP .B \-t, \-\-tail ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ãƒ‘ãƒĒãƒ†ã‚ŖãŽæŒ‡åŽšã•ã‚ŒãŸæœĢ尞部分を占有する ãƒ•ã‚Ąã‚¤ãƒĢãĢ操äŊœã‚’åˆļ限できぞす。 .PP ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢを再配įŊŽã—たい場合は、\-W, \-\-force\-realloc\-tail ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã§ããžã™ã€‚ 再配įŊŽãƒ—ロã‚ģã‚šä¸­ã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢはパãƒĒãƒ†ã‚ŖãĢã‚ˆãŖãĻäŋč­ˇã•れãĒいことãĢ æŗ¨æ„ã—ãĻください。 .SH OPTIONS SnapRAIDãĢは、æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒã‚ã‚Šãžã™ã€‚ .TP .B \-c, \-\-conf CONFIG äŊŋį”¨ã™ã‚‹æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。指厚されãĻいãĒい場合、Unixでは、存在すれば \`/usr/local/etc/snapraid.conf\` をäŊŋį”¨ã—ã€ãã‚ŒäģĨ外ぎ場合は \`/etc/snapraid.conf\` を äŊŋį”¨ã—ãžã™ã€‚ Windowsでは、\`snapraid.exe\` ã¨åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒãĢある \`snapraid.conf\` ãƒ•ã‚Ąã‚¤ãƒĢを äŊŋį”¨ã—ãžã™ã€‚ .TP .B \-f, \-\-filter PATTERN \`check\` ãŠã‚ˆãŗ \`fix\` でå‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ 指厚されたパã‚ŋãƒŧãƒŗãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋがå‡Ļį†ã•ã‚Œãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ パã‚ŋãƒŧãƒŗä앿§˜ãŽčŠŗį´°ãĢついãĻは、PATTERNã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‚’å‚į…§ã—ãĻください。 Unixでは、グロブ文字をäŊŋį”¨ã™ã‚‹å ´åˆã¯åŧ•ᔍįŦĻã§å›˛ã‚€ã‚ˆã†ãĢしãĻください。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`check\` ãŠã‚ˆãŗ \`fix\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€\`sync\` ãŠã‚ˆãŗ \`scrub\` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ .TP .B \-d, \-\-filter\-disk NAME \`check\`、\`fix\`、\`up\`ã€ãŠã‚ˆãŗ \`down\` でå‡Ļį†ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯åã‚’æŒ‡åŽšã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ \`parity\`、\`2\-parity\`、\`3\-parity\` ãĒおぎ名前でパãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚‚æŒ‡åŽšã—ãĻ、 į‰šåŽšãŽãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãĢ操äŊœã‚’限厚できぞす。 č¤‡æ•°ãŽ \-\-filter、\-\-filter\-diskã€ãŠã‚ˆãŗ \-\-filter\-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĩ„ãŋ合わせると、 すずãĻãŽãƒ•ã‚ŖãƒĢã‚ŋãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが選択されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`check\`、\`fix\`、\`up\`ã€ãŠã‚ˆãŗ \`down\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€\`sync\` ãŠã‚ˆãŗ \`scrub\` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ .TP .B \-m, \-\-filter\-missing \`check\` ãŠã‚ˆãŗ \`fix\` でå‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ ã‚ĸãƒŦイから不čļŗãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎãŋがå‡Ļį†ã•ã‚Œãžã™ã€‚ \`fix\` ã¨ä¸€įˇ’ãĢäŊŋį”¨ã™ã‚‹ã¨ã€ã“ã‚Œã¯ \`undelete\` ã‚ŗãƒžãƒŗãƒ‰ã¨ã—ãĻ抟čƒŊしぞす。 č¤‡æ•°ãŽ \-\-filter、\-\-filter\-diskã€ãŠã‚ˆãŗ \-\-filter\-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĩ„ãŋ合わせると、 すずãĻãŽãƒ•ã‚ŖãƒĢã‚ŋãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが選択されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`check\` ãŠã‚ˆãŗ \`fix\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€\`sync\` ãŠã‚ˆãŗ \`scrub\` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ .TP .B \-e, \-\-filter\-error \`check\` ãŠã‚ˆãŗ \`fix\` でエナãƒŧãŽã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをå‡Ļį†ã—ãžã™ã€‚ \`status\` で一čĻ§čĄ¨į¤ēされãĻいるようãĢ、\`sync\` ãŠã‚ˆãŗ \`scrub\` 中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたは å…Ĩå‡ē力エナãƒŧでマãƒŧã‚¯ã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢぎãŋをå‡Ļį†ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`check\` ãŠã‚ˆãŗ \`fix\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-p, \-\-plan PERC|bad|new|full ã‚šã‚¯ãƒŠãƒ–ãƒ—ãƒŠãƒŗã‚’é¸æŠžã—ãžã™ã€‚PERCが0から100ぞでぎ数値である場合、 ゚クナブするブロックぎパãƒŧã‚ģãƒŗãƒ†ãƒŧジとしãĻč§Ŗé‡ˆã•ã‚Œãžã™ã€‚ パãƒŧã‚ģãƒŗãƒ†ãƒŧジぎäģŖã‚ã‚ŠãĢã€ãƒ—ãƒŠãƒŗã‚’æŒ‡åŽšã§ããžã™ã€‚ \`bad\` ã¯ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ã‚šã‚¯ãƒŠãƒ–ã—ã€\`new\` はぞだ゚クナブされãĻいãĒいブロックを゚クナブし、 \`full\` はすずãĻを゚クナブしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`scrub\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-o, \-\-older\-than DAYS \`scrub\` でå‡Ļį†ã™ã‚‹ã‚ĸãƒŦイぎ最も古い部分を選択しぞす。 DAYS は、ブロックが゚クナブされるためぎ最小įĩŒéŽæ—Ĩ数であり、デフりãƒĢトは10です。 ä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックは、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢé–ĸäŋ‚ãĒく常ãĢ゚クナブされぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`scrub\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-a, \-\-audit\-only \`check\` で、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをチェックせずãĢãƒ•ã‚Ąã‚¤ãƒĢãŽãƒãƒƒã‚ˇãƒĨを検č¨ŧしぞす。 ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋぎãŋぎチェックãĢé–ĸåŋƒãŒã‚る場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒã‚§ãƒƒã‚¯ãƒ—ãƒ­ã‚ģ゚を 大嚅ãĢéĢ˜é€ŸåŒ–ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`check\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-h, \-\-pre\-hash \`sync\` で、パãƒĒãƒ†ã‚Ŗč¨ˆįŽ—ãŽå‰ãŽčŋŊ加検č¨ŧぎためãĢ、すずãĻぎ新しいデãƒŧã‚ŋぎ äēˆå‚™ãƒãƒƒã‚ˇãƒĨ化フェãƒŧã‚ēã‚’åŽŸčĄŒã—ãžã™ã€‚ 通常、\`sync\` では、äēˆå‚™ãƒãƒƒã‚ˇãƒĨåŒ–ã¯čĄŒã‚ã‚Œãšã€æ–°ã—ã„ãƒ‡ãƒŧã‚ŋはパãƒĒãƒ†ã‚Ŗč¨ˆįŽ—ãŽį›´å‰ãĢ、 最初ãĢčĒ­ãŋ取られたときãĢãƒãƒƒã‚ˇãƒĨ化されぞす。 こぎプロã‚ģã‚šã¯ã€ã‚ˇã‚šãƒ†ãƒ ãŒé‡ã„č˛ čˇãŽä¸‹ãĢあり、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻおり、CPUが ビジãƒŧãĒときãĢį™ēį”Ÿã—ãžã™ã€‚ ã“ã‚Œã¯ãƒžã‚ˇãƒŗãĢã¨ãŖãĻæĨĩį̝ãĒįŠļ態であり、æŊœåœ¨įš„ãĒハãƒŧドã‚Ļェã‚ĸãŽå•éĄŒãŒã‚ã‚‹å ´åˆã€ デãƒŧã‚ŋãŒãžã ãƒãƒƒã‚ˇãƒĨ化されãĻいãĒいため、ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧが検å‡ēされãĒいぞぞãĢãĒる 可čƒŊ性がありぞす。 こぎãƒĒ゚クを回éŋするためãĢ、\`pre\-hash\` ãƒĸãƒŧドを有劚ãĢしãĻ、すずãĻぎデãƒŧã‚ŋを2回čĒ­ãŋ取り、 そぎ整合性をįĸēäŋã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ã‚ĸãƒŦイ内でį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢも検č¨ŧしãĻ、į§ģ動操äŊœãŒæˆåŠŸã—ãŸã“ã¨ã‚’ įĸēčĒã—ã€åŋ…čρãĢåŋœã˜ãĻ、įļščĄŒã™ã‚‹å‰ãĢäŋŽæ­Ŗæ“äŊœã‚’åŽŸčĄŒã§ãã‚‹ã‚ˆã†ãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`sync\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-i, \-\-import DIR 最垌ぎ \`sync\` ぎ垌ãĢã‚ĸãƒŦã‚¤ã‹ã‚‰å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢã‚’ã€æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚ŖãƒŦクトãƒĒから ã‚¤ãƒŗãƒãƒŧトしぞす。 ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’ãžã æŒãŖãĻいる場合、それらは垊旧プロã‚ģ゚を攚善するためãĢ \`check\` ãŠã‚ˆãŗ \`fix\` でäŊŋį”¨ã§ããžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢは、ã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒをåĢめãĻčĒ­ãŋ取られ、名前ãĢé–ĸäŋ‚ãĒãč­˜åˆĨされぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`check\` ãŠã‚ˆãŗ \`fix\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-s, \-\-spin\-down\-on\-error エナãƒŧがį™ēį”Ÿã—ãŸå ´åˆã€éžã‚ŧロぎ゚テãƒŧã‚ŋã‚šã‚ŗãƒŧドでįĩ‚äē†ã™ã‚‹å‰ãĢã€įŽĄį†ã•ã‚ŒãĻいるすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãžã™ã€‚ã“ã‚ŒãĢより、中断された操äŊœåžŒãĢドナイブがã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãĒãžãžã‚šãƒ”ãƒŗã—įļšã‘、 不čρãĒį†ąãŽč“„įŠã¨é›ģ力æļˆč˛ģを回éŋするぎãĢåŊšįĢ‹ãĄãžã™ã€‚ ã‚ŗãƒžãƒŗãƒ‰ãŒå¤ąæ•—ã—ãŸå ´åˆã§ã‚‚ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒåŽ‰å…¨ãĢ停æ­ĸされるようãĢ、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ .TP .B \-w, \-\-bw\-limit RATE すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢグロãƒŧバãƒĢãĒ帯域嚅åˆļé™ã‚’éŠį”¨ã—ãžã™ã€‚RATE は 1į§’ã‚ãŸã‚ŠãŽãƒã‚¤ãƒˆæ•°ã§ã™ã€‚K、M、GãĒおぎ䚗数を指厚できぞす (例īŧš\-\-bw\-limit 1G)。 .TP .B \-t, \-\-tail ã‚ĩイã‚ē ãƒ•ã‚Ąã‚¤ãƒĢãƒĒ゚トを、パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽæŒ‡åŽšã•ã‚ŒãŸæœĢå°žã‚ĩイã‚ēäģĨ下を äŊŋį”¨ã—ãĻいるもぎãĢåˆļ限しぞす。 K、M、G、T ãĒおぎ倍数をäŊŋį”¨ã§ããžã™īŧˆäž‹īŧš\-\-tail 1Gīŧ‰ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`locate\` ã‚ŗãƒžãƒŗãƒ‰ã¨ä¸€įˇ’ãĢäŊŋį”¨ã•ã‚ŒãŸå ´åˆãĢぎãŋ 有劚です。 .TP .B \-A, \-\-stats čŋŊåŠ æƒ…å ąã‚’čĄ¨į¤ēã™ã‚‹æ‹Ąåŧĩ゚テãƒŧã‚ŋ゚ビãƒĨãƒŧを有劚ãĢしぞす。 į”ģéĸãĢは2ã¤ãŽã‚°ãƒŠãƒ•ãŒčĄ¨į¤ēされぞす。 æœ€åˆãŽã‚°ãƒŠãƒ•ã¯ã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒãƒƒãƒ•ã‚ĄãƒĒãƒŗã‚°ã•ã‚ŒãŸã‚šãƒˆãƒŠã‚¤ãƒ—ãŽæ•°ã¨ã€ããŽãƒ‡ã‚Ŗã‚šã‚¯ã§įžåœ¨ ã‚ĸクã‚ģ゚されãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ•ã‚Ąã‚¤ãƒĢパ゚をį¤ēã—ãžã™ã€‚é€šå¸¸ã€æœ€ã‚‚é…ã„ãƒ‡ã‚Ŗã‚šã‚¯ãĢは ãƒãƒƒãƒ•ã‚ĄãŒåˆŠį”¨ã§ããšã€ã“ã‚ŒãŒé”æˆå¯čƒŊãĒ最大帯域嚅をæąē厚しぞす。 2į•Ēį›ŽãŽã‚°ãƒŠãƒ•ã¯ã€éŽåŽģ100į§’é–“ãĢ垅抟ãĢč˛ģやされた時間ぎパãƒŧã‚ģãƒŗãƒ†ãƒŧジをį¤ēしぞす。 æœ€ã‚‚é…ã„ãƒ‡ã‚Ŗã‚šã‚¯ãŒåž…æŠŸæ™‚é–“ãŽãģとんおをåŧ•きčĩˇã“すとä爿ƒŗã•れ、äģ–ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯ ãƒãƒƒãƒ•ã‚ĄãƒĒãƒŗã‚°ã•ã‚ŒãŸã‚šãƒˆãƒŠã‚¤ãƒ—ã‚’äŊŋį”¨ã§ãã‚‹ãŸã‚ã€åž…æŠŸæ™‚é–“ãŒãģã¨ã‚“ãŠãžãŸã¯ãžãŖãŸããĒいはずです。 ã“ãŽã‚°ãƒŠãƒ•ã¯ã€ãƒãƒƒã‚ˇãƒĨč¨ˆįŽ—ã¨RAIDč¨ˆįŽ—ãĢč˛ģやされた垅抟時間もį¤ēしぞす。 すずãĻãŽč¨ˆįŽ—ã¯ãƒ‡ã‚Ŗã‚šã‚¯æ“äŊœã¨ä¸ĻčĄŒã—ãĻåŽŸčĄŒã•ã‚Œãžã™ã€‚ ã—ãŸãŒãŖãĻ、少ãĒくとも1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã§æ¸Ŧ厚可čƒŊãĒ垅抟時間がある限り、 CPUがワãƒŧクロãƒŧドãĢčŋŊいつくぎãĢ十分速いことをį¤ēしãĻいぞす。 .TP .B \-Z, \-\-force\-zero äģĨ前は非ã‚ŧãƒ­ã ãŖãŸã‚ĩイã‚ēãŽãƒ•ã‚Ąã‚¤ãƒĢをã‚ŧロで同期するという厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDがこぎようãĒįŠļ態を検å‡ēした場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、 įļščĄŒã‚’停æ­ĸしぞす。 これãĢã‚ˆã‚Šã€ã‚ˇã‚šãƒ†ãƒ ã‚¯ãƒŠãƒƒã‚ˇãƒĨ垌ãĢ一部ぎã‚ĸクã‚ģã‚šã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢが切り捨ãĻられたときãĢ、 ãã‚Œã‚’į°Ąå˜ãĢ検å‡ēできぞす。 これは、ext3/ext4ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã‚’äŊŋį”¨ã—ãŸLinuxでčĩˇã“りうるįŠļ態です。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`sync\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-E, \-\-force\-empty å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢがすずãĻ不čļŗã—ãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŒæœŸã™ã‚‹ã¨ã„ã†åŽ‰å…¨ã§ãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDãŒã€å…ƒã€…ãƒ‡ã‚Ŗã‚šã‚¯ãĢ存在しãĻいたすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢが不čļŗã—ãĻいるか、 書き換えられãĻいることを検å‡ēした場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、 įļščĄŒã‚’停æ­ĸしぞす。 これãĢより、デãƒŧã‚ŋãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŒãƒžã‚Ļãƒŗãƒˆã•ã‚ŒãĻいãĒいときãĢã€ãã‚Œã‚’į°Ąå˜ãĢ 検å‡ēできぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`sync\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-U, \-\-force\-uuid UUIDãŒå¤‰æ›´ã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ã¨ãŽåŒæœŸã€ãƒã‚§ãƒƒã‚¯ã€ãŠã‚ˆãŗäŋŽæ­Ŗã¨ã„う厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDãŒä¸€éƒ¨ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒUUIDを変更したことを検å‡ēした場合、 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、įļščĄŒã‚’停æ­ĸしぞす。 これãĢã‚ˆã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒé–“é•ãŖãŸãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆãĢマã‚Ļãƒŗãƒˆã•ã‚ŒãĻいるときãĢ、それを検å‡ēできぞす。 ただし、単一パãƒĒãƒ†ã‚Ŗã§ãŽå˜ä¸€ãŽUUIDå¤‰æ›´ã€ãŠã‚ˆãŗč¤‡æ•°ãŽãƒ‘ãƒĒãƒ†ã‚Ŗã§ãŽã‚ˆã‚Šå¤šããŽUUID変更は č¨ąå¯ã•ã‚ŒãĻいぞす。これは、垊旧垌ãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’ä礿›ã™ã‚‹ã¨ããŽé€šå¸¸ãŽã‚ąãƒŧ゚であるためです。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`sync\`、\`check\`、ぞたは \`fix\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-D, \-\-force\-device ã‚ĸクã‚ģ゚できãĒã„ãƒ‡ã‚Ŗã‚šã‚¯ã€ãžãŸã¯åŒã˜į‰Šį†ãƒ‡ãƒã‚¤ã‚šä¸ŠãŽãƒ‡ã‚Ŗã‚šã‚¯ã¨ãŽäŋŽæ­Ŗã¨ã„う厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 たとえば、2台ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚’å¤ąã„ã€æœ€åˆãŽ1台だけを垊旧するためぎäēˆå‚™ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚る場合、 2į•Ēį›ŽãŽã‚ĸクã‚ģ゚できãĒã„ãƒ‡ã‚Ŗã‚šã‚¯ã‚’į„ĄčĻ–ã§ããžã™ã€‚ ぞたは、æ—ĸãĢ**äŊŋį”¨ã•ã‚ŒãĻいる**ãƒ‡ã‚Ŗã‚šã‚¯ãĢ掋されたįŠēき厚量ãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’åžŠæ—§ã—ãŸã„å ´åˆã€ åŒã˜į‰Šį†ãƒ‡ãƒã‚¤ã‚šã‚’å…ąæœ‰ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`fix\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-N, \-\-force\-nocopy \`sync\`、\`check\`ã€ãŠã‚ˆãŗ \`fix\` ã§ã€ã‚ŗãƒ”ãƒŧ検å‡ēヒãƒĨãƒŧãƒĒã‚šãƒ†ã‚Ŗãƒƒã‚¯ã‚’į„ĄåŠšãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒãĒい場合、SnapRAIDは、名前、ã‚ĩイã‚ē、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĒãŠãŽåŒã˜åąžæ€§ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢが、 同じデãƒŧã‚ŋã‚’æŒã¤ã‚ŗãƒ”ãƒŧであるとčĻ‹ãĒしぞす。 これãĢã‚ˆã‚Šã€ã‚ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰åˆĨãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ŗãƒ”ãƒŧぞたはį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢã‚’č­˜åˆĨし、 æ—ĸãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨæƒ…å ąã‚’å†åˆŠį”¨ã—ãĻ、ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧを検å‡ēしたり、不čļŗã—ãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを 垊旧したりできぞす。 ぞれãĢ、こぎ動äŊœãŒčĒ¤æ¤œå‡ēã‚„ã€å¤šããŽãƒãƒƒã‚ˇãƒĨ検č¨ŧãĢよるプロã‚ģ゚ぎ遅åģļãĢつãĒがる可čƒŊ性があり、 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ããŽã‚ˆã†ãĒå•éĄŒã‚’č§Ŗæąēできぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`sync\`、\`check\`ã€ãŠã‚ˆãŗ \`fix\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-F, \-\-force\-full \`sync\` で、パãƒĒãƒ†ã‚ŖãŽåŽŒå…¨ãĒå†č¨ˆįŽ—ã‚’åŧˇåˆļしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€æ–°ã—ã„ãƒ‘ãƒĒãƒ†ã‚ŖãƒŦベãƒĢをčŋŊ加する場合、ぞたはより新しいパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŊŋį”¨ã—ãĻ å¤ã„ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢæˆģした場合ãĢäŊŋį”¨ã§ããžã™ã€‚ パãƒĒãƒ†ã‚Ŗã‚’æœ€åˆã‹ã‚‰å†äŊœæˆã™ã‚‹äģŖã‚ã‚ŠãĢ、これãĢã‚ˆã‚Šã€ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢå­˜åœ¨ã™ã‚‹ãƒãƒƒã‚ˇãƒĨを å†åˆŠį”¨ã—ãĻデãƒŧã‚ŋを検č¨ŧし、æ—ĸ存ぎパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŊŋį”¨ã—ãĻ \`sync\` プロã‚ģ゚中ãĢデãƒŧã‚ŋäŋč­ˇã‚’ įļ­æŒã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`sync\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ .TP .B \-R, \-\-force\-realloc \`sync\` ã§ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ厌全ãĒå†å‰˛ã‚ŠåŊ“ãĻとパãƒĒãƒ†ã‚ŖãŽå†æ§‹į¯‰ã‚’åŧˇåˆļしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢå­˜åœ¨ã™ã‚‹ãƒãƒƒã‚ˇãƒĨã‚’å†åˆŠį”¨ã—ãĻデãƒŧã‚ŋを検č¨ŧしãĒがら、 æ–­į‰‡åŒ–ã‚’å‰Šé™¤ã—ãĻ、すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを厌全ãĢå†å‰˛ã‚ŠåŊ“ãĻするためãĢäŊŋį”¨ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€\`sync\` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、äŊŋį”¨ã—ãĒいことをåŧˇã お勧めしぞす。 \`sync\` 操äŊœä¸­ãĢデãƒŧã‚ŋäŋč­ˇã¯ã‚りぞせん。 .TP .B \-W, \-\-force\-realloc\-tail ã‚ĩイã‚ē \-R, \-\-force\-realloc と同様ãĢ動äŊœã—ぞすが、各パãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢぎ 指厚されたæœĢ尞部分īŧˆæœ€åžŒãŽã€Œã‚ĩイã‚ē」バイトīŧ‰ãĢåˆļ限されぞす。 įžåœ¨ããŽæœĢå°žã‚ģã‚¯ã‚ˇãƒ§ãƒŗãĢäŋå­˜ã•れãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãƒ•ãƒŠã‚°ãƒĄãƒŗãƒˆ/ブロックぎ 再配įŊŽīŧˆį§ģ動īŧ‰ã‚’åŧˇåˆļし、įŠēき゚ペãƒŧ゚があるパãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢ内ぎ äģģæ„ãŽå ´æ‰€īŧˆæ—ĸ存ぎホãƒŧãƒĢをåĢむīŧ‰ãĢ配įŊŽã§ãã‚‹ã‚ˆã†ãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŽä¸ģãĒį›Žįš„ã¯ã€ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§ãŽã‚ĩイã‚ēを į¸Žå°ã™ã‚‹ã“ã¨ã§ã™ã€‚ 再配įŊŽãĢã‚ˆãŖãĻæœĢå°žã‚ģã‚¯ã‚ˇãƒ§ãƒŗå…¨äŊ“ãŒæ­Ŗå¸¸ãĢクãƒĒã‚ĸされた場合 īŧˆãã‚Œã‚’äŊŋį”¨ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ãŒæŽ‹ãŖãĻいãĒい場合īŧ‰ã€ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢは åˆ‡ã‚ŠčŠ°ã‚ã‚‰ã‚Œã€æœĒäŊŋį”¨ãŽæœĢ尞゚ペãƒŧ゚が回収されぞす。 K、M、G、T ãĒおぎ倍数をäŊŋį”¨ã§ããžã™īŧˆäž‹īŧš \-\-force\-realloc\-tail 1Gīŧ‰ã€‚ locate \-t, \-\-tail をäŊŋį”¨ã—ãĻ、åŊąéŸŋã‚’å—ã‘ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをäē‹å‰ãĢ įŸĨることができぞす。 č­Ļ告īŧ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧãƒˆå°‚į”¨ã§ã‚ã‚Šã€äŊŋį”¨ã—ãĒいことが åŧˇãæŽ¨åĨ¨ã•れぞす。 åŊąéŸŋã‚’å—ã‘ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãĢついãĻは、\`sync\` 操äŊœä¸­ãĢデãƒŧã‚ŋäŋč­ˇã¯ čĄŒã‚ã‚Œãžã›ã‚“ã€‚ .TP .B \-l, \-\-log FILE čŠŗį´°ãĒãƒ­ã‚°ã‚’æŒ‡åŽšã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãĢ書きčžŧãŋぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいãĒい場合、ä爿œŸã—ãĒいエナãƒŧがį”ģéĸãĢå‡ē力され、 多くぎエナãƒŧがį™ēį”Ÿã—ãŸå ´åˆãĢ過剰ãĒå‡ē力ãĢãĒる可čƒŊ性がありぞす。 \-l, \-\-log が指厚されãĻいる場合、SnapRAIDが停æ­ĸする原因とãĒã‚‹č‡´å‘Ŋįš„ãĒエナãƒŧぎãŋが į”ģéĸãĢå‡ē力されぞす。 パ゚が \`>>\` ã§å§‹ãžã‚‹å ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢはčŋŊ記ãƒĸãƒŧドで開かれぞす。 名前ãĢ \`%D\` と \`%T\` がå‡ēįžã™ã‚‹ã¨ã€ãã‚Œãžã‚ŒYYYYMMDDとHHMMSSぎåŊĸåŧã§ æ—Ĩäģ˜ã¨æ™‚åˆģãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚Windowsãƒãƒƒãƒãƒ•ã‚Ąã‚¤ãƒĢでは、\`%\` 文字を 2倍ãĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚äž‹īŧšresult\-%%D.log。\`>>\` をäŊŋį”¨ã™ã‚‹ãĢは、 名前をåŧ•ᔍįŦĻã§å›˛ã‚€åŋ…čĻãŒã‚ã‚Šãžã™ã€‚äž‹īŧš\`\[dq]>>result.log\[dq]\`。 ログを標æē–å‡ē力ぞたは標æē–エナãƒŧãĢå‡ē力するãĢは、それぞれ \`\[dq]>&1\[dq]\` ãŠã‚ˆãŗ \`\[dq]>&2\[dq]\` を äŊŋį”¨ã§ããžã™ã€‚ ログã‚ŋグぎčĒŦ明ãĢついãĻは、snapraid_log.txtãƒ•ã‚Ąã‚¤ãƒĢぞたはmanペãƒŧã‚¸ã‚’å‚į…§ã—ãĻください。 .TP .B \-L, \-\-error\-limit NUMBER åŽŸčĄŒã‚’åœæ­ĸする前ぎ新しいエナãƒŧåˆļé™ã‚’č¨­åŽšã—ãžã™ã€‚ デフりãƒĢトでは、SnapRAIDは100をčļ…えるå…Ĩå‡ē力エナãƒŧãĢ遭遇した場合ãĢ停æ­ĸしぞす。 ã“ã‚Œã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻいる可čƒŊ性がéĢ˜ã„ã“ã¨ã‚’į¤ēしãĻいぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ \`sync\` と \`scrub\` ãĢåŊąéŸŋã—ã€æœ€åˆãŽä¸€é€ŖãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚¨ãƒŠãƒŧぎ垌ãĢ įļščĄŒã—ãĻ操äŊœã‚’åތäē†ã—ã‚ˆã†ã¨ã™ã‚‹ã“ã¨ãŒč¨ąå¯ã•ã‚Œãžã™ã€‚ ただし、\`check\` と \`fix\` は常ãĢ最初ぎエナãƒŧで停æ­ĸしぞす。 .TP .B \-S, \-\-start BLKSTART 指厚されたブロックį•Ēåˇã‹ã‚‰å‡Ļį†ã‚’é–‹å§‹ã—ãžã™ã€‚ ã“ã‚Œã¯ã€į ´æã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆãĢį‰šåŽšãŽãƒ–ãƒ­ãƒƒã‚¯ã‚’å†čŠĻčĄŒã—ãĻチェックぞたはäŋŽæ­Ŗã™ã‚‹ãŽãĢ åŊšįĢ‹ãĄãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ä¸ģãĢé̘åēĻãĒæ‰‹å‹•åžŠæ—§ã‚’į›Žįš„ã¨ã—ãĻいぞす。 .TP .B \-B, \-\-count BLKCOUNT 指厚された数ぎブロックぎãŋをå‡Ļį†ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ä¸ģãĢé̘åēĻãĒæ‰‹å‹•åžŠæ—§ã‚’į›Žįš„ã¨ã—ãĻいぞす。 .TP .B \-C, \-\-gen\-conf CONTENT æ—ĸå­˜ãŽã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢからダミãƒŧãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã‚’į”Ÿæˆã—ãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢは標æē–å‡ē力ãĢ書きčžŧぞれ、æ—ĸå­˜ãŽãƒ•ã‚Ąã‚¤ãƒĢを上書きしぞせん。 ã“ãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢãĢã¯ã€ã‚ˇã‚šãƒ†ãƒ å…¨äŊ“ã‚’å¤ąãŖãŸå ´åˆãĢãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’ å†æ§‹į¯‰ã™ã‚‹ãŸã‚ãĢåŋ…čρãĒæƒ…å ąã‚‚åĢぞれãĻいぞす。 .TP .B \-v, \-\-verbose į”ģéĸãĢã‚ˆã‚Šå¤šããŽæƒ…å ąã‚’å‡ē力しぞす。 1å›žæŒ‡åŽšã™ã‚‹ã¨ã€é™¤å¤–ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢとčŋŊ加ぎįĩąč¨ˆãŒå‡ē力されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒ­ã‚°ãƒ•ã‚Ąã‚¤ãƒĢãĢはåŊąéŸŋしぞせん。 .TP .B \-q, \-\-quiet į”ģéĸãĢå‡ēåŠ›ã•ã‚Œã‚‹æƒ…å ąã‚’æ¸›ã‚‰ã—ãžã™ã€‚ 1回指厚すると、プログãƒŦ゚バãƒŧが削除されぞす。2å›žæŒ‡åŽšã™ã‚‹ã¨ã€åŽŸčĄŒä¸­ãŽæ“äŊœãŒå‰Šé™¤ã•れぞす。 3å›žæŒ‡åŽšã™ã‚‹ã¨ã€æƒ…å ąãƒĄãƒƒã‚ģãƒŧジが削除されぞす。4回指厚すると、゚テãƒŧã‚ŋã‚šãƒĄãƒƒã‚ģãƒŧジが削除されぞす。 致å‘Ŋįš„ãĒエナãƒŧは常ãĢį”ģéĸãĢå‡ē力されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒ­ã‚°ãƒ•ã‚Ąã‚¤ãƒĢãĢはåŊąéŸŋしぞせん。 .TP .B \-H, \-\-help įŸ­ã„ãƒ˜ãƒĢプį”ģéĸをå‡ē力しぞす。 .TP .B \-V, \-\-version プログナムぎバãƒŧã‚¸ãƒ§ãƒŗã‚’å‡ē力しぞす。 .SH CONFIGURATION SnapRAIDã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎ場所とパãƒĒãƒ†ã‚Ŗæƒ…å ąãŽäŋå­˜å ´æ‰€ã‚’įŸĨるためãĢã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを åŋ…čĻã¨ã—ãžã™ã€‚ .PP Unixでは、存在すれば \`/usr/local/etc/snapraid.conf\` をäŊŋį”¨ã—ã€ãã‚ŒäģĨ外ぎ場合は \`/etc/snapraid.conf\` をäŊŋį”¨ã—ãžã™ã€‚ Windowsでは、\`snapraid.exe\` ã¨åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒãĢある \`snapraid.conf\` ãƒ•ã‚Ąã‚¤ãƒĢを äŊŋį”¨ã—ãžã™ã€‚ .PP æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’åĢめるåŋ…čĻãŒã‚ã‚Šãžã™īŧˆå¤§æ–‡å­—と小文字をåŒēåˆĨしぞすīŧ‰ã€‚ .SS parity FILE [,FILE] ... パãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’åŽšįžŠã—ãžã™ã€‚ パãƒĒãƒ†ã‚Ŗã¯ã€RAID5と同様ãĢã€å˜ä¸€ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰ãŽäŋč­ˇã‚’有劚ãĢしぞす。 .PP č¤‡æ•°ãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’æŒ‡åŽšã§ãã€ãã‚Œã‚‰ã¯į•°ãĒã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢ存在するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢがそれäģĨä¸Šæˆé•ˇã§ããĒくãĒると、æŦĄãŽãƒ•ã‚Ąã‚¤ãƒĢがäŊŋį”¨ã•ã‚Œãžã™ã€‚ åˆŠį”¨å¯čƒŊãĒįˇåŽšé‡ã¯ã€ã‚ĸãƒŦイ内ぎ**最大ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯**と少ãĒくとも同じ大きさでãĒければãĒりぞせん。 .PP 垌でčŋŊ加ぎパãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加することはできぞすが、 それらをä¸Ļずæ›ŋえたり削除したりすることはできぞせん。 .PP パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢäēˆį´„しãĻãŠãã“ã¨ã§ã€ãã‚Œã‚‰ãŒæ–­į‰‡åŒ–ã•ã‚Œã‚‹ãŽã‚’é˜˛ãŽã€ パフりãƒŧãƒžãƒŗã‚šã‚’å‘ä¸Šã•ã›ãžã™ã€‚ .PP Windowsでは、フãƒĢãƒ‡ã‚Ŗã‚šã‚¯ãĢé–ĸするč­Ļ告をéŋけるためãĢã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãĢ256 MBがæœĒäŊŋį”¨ã§ 掋されぞす。 .PP こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯åŋ…須であり、1回ぎãŋäŊŋį”¨ã§ããžã™ã€‚ .SS (2,3,4,5,6)\-parity FILE [,FILE] ... čŋŊ加ぎパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’åŽšįžŠã—ãžã™ã€‚ .PP 指厚されたパãƒĒãƒ†ã‚ŖãƒŦベãƒĢごとãĢ、1つぎčŋŊ加ぎäŋč­ˇãƒŦベãƒĢが有劚ãĢãĒりぞす。 .PD 0 .IP \(bu 2\-parity は RAID6 デãƒĨã‚ĸãƒĢパãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 .IP \(bu 3\-parity は トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 .IP \(bu 4\-parity は クã‚ĸッドīŧˆ4つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 .IP \(bu 5\-parity は ãƒšãƒŗã‚ŋīŧˆ5つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 .IP \(bu 6\-parity は ヘキã‚ĩīŧˆ6つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 .PD .PP 各パãƒĒãƒ†ã‚ŖãƒŦベãƒĢãĢは、äģĨ前ぎすずãĻぎパãƒĒãƒ†ã‚ŖãƒŦベãƒĢが存在するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP \`parity\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¨åŒã˜č€ƒæ…Žäē‹é …ãŒéŠį”¨ã•ã‚Œãžã™ã€‚ .PP これらぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã‚ã‚Šã€1回ぎãŋäŊŋį”¨ã§ããžã™ã€‚ .SS z\-parity FILE [,FILE] ... トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’äŋå­˜ã™ã‚‹ãŸã‚ãŽäģŖæ›ŋãƒ•ã‚Ąã‚¤ãƒĢとフりãƒŧãƒžãƒƒãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ .PP こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ \`3\-parity\` ぎäģŖæ›ŋであり、ä¸ģãĢARMやSSSE3å‘Ŋäģ¤ã‚ģットをã‚ĩポãƒŧトしãĻいãĒい AMD Phenom、Athlon、OpteronãĒおぎロãƒŧã‚¨ãƒŗãƒ‰CPUã‚’å¯žčąĄã¨ã—ãĻいぞす。 こぎようãĒå ´åˆã€ã‚ˆã‚Šč‰¯ã„ãƒ‘ãƒ•ã‚Šãƒŧãƒžãƒŗã‚šã‚’æäž›ã—ãžã™ã€‚ .PP こぎフりãƒŧマットは、ZFS RAIDZ3でäŊŋį”¨ã•ã‚Œã‚‹ã‚‚ãŽã¨äŧŧãĻいぞすが、よりéĢ˜é€Ÿã§ã™ã€‚ ZFSと同様ãĢ、トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’čļ…えãĻは抟čƒŊしぞせん。 .PP \`3\-parity\` をäŊŋį”¨ã—ãĻいる場合、パフりãƒŧãƒžãƒŗã‚šå‘ä¸ŠãŽãŸã‚ãĢ \`z\-parity\` フりãƒŧマットぎ äŊŋį”¨ãŒæŽ¨åĨ¨ã•れる場合はč­Ļå‘ŠãŒčĄ¨į¤ēされぞす。 .PP æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã‚’į›Žįš„ãŽ \`z\-parity\` ぞたは \`3\-parity\` ãƒ•ã‚Ąã‚¤ãƒĢでčĒŋ整し、 \`fix\` をäŊŋį”¨ã—ãĻ再äŊœæˆã™ã‚‹ã“とで、あるフりãƒŧマットからåˆĨぎフりãƒŧマットãĢ 変換することが可čƒŊです。 .SS content FILE ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイãĢ存在するすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¨ãƒã‚§ãƒƒã‚¯ã‚ĩムをäŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを åŽšįžŠã—ãžã™ã€‚ .PP デãƒŧã‚ŋ、パãƒĒãƒ†ã‚Ŗã€ãžãŸã¯ããŽäģ–ãŽåˆŠį”¨å¯čƒŊãĒãƒ‡ã‚Ŗã‚šã‚¯ãĢ配įŊŽã§ããžã™ã€‚ デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢは \`sync\` プロã‚ģ゚からč‡Ēå‹•įš„ãĢ 除外されぞす。 .PP こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯åŋ…é ˆã§ã‚ã‚Šã€åŒã˜ãƒ•ã‚Ąã‚¤ãƒĢã‚’č¤‡æ•°ã‚ŗãƒ”ãƒŧäŋå­˜ã™ã‚‹ãŸã‚ãĢč¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ .PP äŊŋį”¨ã™ã‚‹ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ**少ãĒくとも1ã¤ãŽã‚ŗãƒ”ãƒŧ**と、さらãĢ**1ã¤ãŽã‚ŗãƒ”ãƒŧ**を äŋå­˜ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚čŋŊåŠ ãŽã‚ŗãƒ”ãƒŧをäŊŋį”¨ã—ãĻã‚‚åŽŗã¯ã‚ã‚Šãžã›ã‚“ã€‚ .SS data NAME DIR ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã¨ãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‚’č­˜åˆĨするためãĢäŊŋį”¨ã•ã‚Œã€**一意である**åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ DIR ã¯ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽ**マã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆ**です。 .PP NAME をå›ē厚したぞぞãĢしãĻおけば、åŋ…čρãĢåŋœã˜ãĻマã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’å¤‰æ›´ã§ããžã™ã€‚ .PP ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ1つぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§į›´æŽĨ NAME を変更しãĻから \`sync\` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã™ã‚‹ã“ã¨ã§ã€ åžŒã§ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã‚’å¤‰æ›´ã§ããžã™ã€‚ 名前変更ぎ場合、é–ĸ逪äģ˜ã‘ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽäŋå­˜ã•れたUUIDをäŊŋį”¨ã—ãĻčĄŒã‚ã‚Œãžã™ã€‚ .SS extra NAME DIR \`smart\` ãŠã‚ˆãŗ \`probe\` ã‚ŗãƒžãƒŗãƒ‰ã§į›ŖčĻ–ã™ã‚‹čŋŊåŠ ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã¨ãƒžã‚Ļ ãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ .PP これは、ブãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ãĒお、ã‚ĸãƒŦイぎ一部ではãĒã„ãŒã‚ˇã‚šãƒ†ãƒ ãŽæŠŸčƒŊãĢåŋ… čρãĒãƒ‡ã‚Ŗã‚šã‚¯ã‚’į›ŖčĻ–ã™ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ .PP ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯å¸¸ãĢ回čģĸしãĻいることが期垅されるため、\`up\` およ ãŗ \`down\` ã‚ŗãƒžãƒŗãƒ‰ãŽåŊąéŸŋを受けãĒいことãĢæŗ¨æ„ã—ãĻください。 .SS nohidden すずãĻãŽéš ã—ãƒ•ã‚Ąã‚¤ãƒĢã¨ãƒ‡ã‚ŖãƒŦクトãƒĒを除外しぞす。 Unixã§ã¯ã€éš ã—ãƒ•ã‚Ąã‚¤ãƒĢは \`.\` ã§å§‹ãžã‚‹ãƒ•ã‚Ąã‚¤ãƒĢです。 Windowsã§ã¯ã€éš ã—åąžæ€§ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢです。 .SS exclude/include PATTERN syncプロã‚ģ゚で除外ぞたはåĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯ãƒ‡ã‚ŖãƒŦクトãƒĒぎパã‚ŋãƒŧãƒŗã‚’åŽšįžŠã—ãžã™ã€‚ すずãĻぎパã‚ŋãƒŧãƒŗã¯æŒ‡åŽšã•ã‚ŒãŸé †åēã§å‡Ļį†ã•ã‚Œãžã™ã€‚ .PP ä¸€č‡´ã™ã‚‹æœ€åˆãŽãƒ‘ã‚ŋãƒŧãƒŗãŒ \`exclude\` ãŽå ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢは除外されぞす。 \`include\` ãŽå ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢはåĢぞれぞす。 パã‚ŋãƒŧãƒŗãŒä¸€č‡´ã—ãĒい場合、最垌ãĢ指厚されたパã‚ŋãƒŧãƒŗãŒ \`include\` ãŽå ´åˆã¯ãƒ•ã‚Ąã‚¤ãƒĢは除外され、 \`exclude\` ぎ場合はåĢぞれぞす。 .PP パã‚ŋãƒŧãƒŗä앿§˜ãŽčŠŗį´°ãĢついãĻは、PATTERNã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‚’å‚į…§ã—ãĻください。 .PP こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ .SS blocksize SIZE_IN_KIBIBYTES パãƒĒãƒ†ã‚ŖãŽåŸēæœŦブロックã‚ĩイã‚ēをキビバイト単äŊã§åŽšįžŠã—ãžã™ã€‚ 1キビバイトは1024バイトです。 .PP デフりãƒĢトぎブロックã‚ĩイã‚ēは256であり、ãģとんおぎ場合ãĢ抟čƒŊするはずです。 .PP **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、こぎ値を変更しãĒいことをåŧˇã お勧めしぞす。äģŠåžŒã“ぎ値を変更するãĢは、パãƒĒãƒ†ã‚Ŗå…¨äŊ“ã‚’**再äŊœæˆ**するåŋ…čĻãŒã‚ã‚Šãžã™īŧ .PP į•°ãĒるブロックã‚ĩイã‚ēをäŊŋį”¨ã™ã‚‹į†į”ąãŽ1ã¤ã¯ã€æ•°į™žä¸‡ãŽã‚Ēãƒŧダãƒŧぎ**多くぎ小さãĒãƒ•ã‚Ąã‚¤ãƒĢ**を æŒãŖãĻいる場合です。 .PP ãƒ•ã‚Ąã‚¤ãƒĢごとãĢã€ãŸã¨ãˆæ•°ãƒã‚¤ãƒˆã§ã‚ãŖãĻも、パãƒĒãƒ†ã‚ŖãŽ**ブロック全äŊ“**ãŒå‰˛ã‚ŠåŊ“ãĻられ、 ãƒ•ã‚Ąã‚¤ãƒĢが多いと、これãĢより**かãĒりぎæœĒäŊŋį”¨ãƒ‘ãƒĒãƒ†ã‚Ŗã‚šãƒšãƒŧ゚**がį™ēį”Ÿã™ã‚‹å¯čƒŊ性がありぞす。 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŽŒå…¨ãĢ埋めると、デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãĢãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加することは**č¨ąå¯ã•ã‚Œãžã›ã‚“**。 ただし、æĩĒč˛ģされたパãƒĒãƒ†ã‚Ŗã¯ãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯é–“ã§č“„įŠã•ã‚Œãžã›ã‚“ã€‚ãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽå¤šæ•°ãŽãƒ•ã‚Ąã‚¤ãƒĢから į”Ÿã˜ã‚‹æĩĒč˛ģ゚ペãƒŧ゚は、**そぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽãƒ‡ãƒŧã‚ŋ量**ぎãŋをåˆļ限し、äģ–ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãĢは åŊąéŸŋしぞせん。 .PP æĻ‚įŽ—ã¨ã—ãĻã€ãƒ•ã‚Ąã‚¤ãƒĢごとãĢブロックã‚ĩイã‚ēぎ半分がæĩĒč˛ģされるとäģŽåŽšã§ããžã™ã€‚ たとえば、100,000ãƒ•ã‚Ąã‚¤ãƒĢと256 KiBぎブロックã‚ĩイã‚ēがある場合、12.8 GBぎパãƒĒãƒ†ã‚ŖãŒæĩĒč˛ģされ、 これãĢよりデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§12.8 GB少ãĒい゚ペãƒŧã‚šã—ã‹åˆŠį”¨ã§ããĒくãĒる可čƒŊ性がありぞす。 .PP \`status\` をäŊŋį”¨ã—ãĻã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽæĩĒč˛ģ゚ペãƒŧ゚ぎ量をįĸēčĒã§ããžã™ã€‚ これは、デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢ**įŠēき**としãĻ掋すåŋ…čĻãŒã‚ã‚‹ã€ãžãŸã¯ã‚ĸãƒŦイãĢåĢぞれãĒã„ãƒ•ã‚Ąã‚¤ãƒĢãĢ äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚‹ã‚šãƒšãƒŧ゚ぎ量です。 ã“ãŽå€¤ãŒč˛ ãŽå ´åˆã€ãƒ‘ãƒĒãƒ†ã‚ŖãŒæē€æ¯ãĢčŋ‘ãĨいãĻã„ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ã€ãžã æĩĒč˛ģできる゚ペãƒŧ゚を čĄ¨ã—ãžã™ã€‚ .PP ã“ãŽå•éĄŒã‚’å›žéŋするためãĢ、パãƒĒãƒ†ã‚ŖãĢより大きãĒパãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã§ããžã™ã€‚ たとえば、パãƒĒãƒ†ã‚Ŗãƒ‘ãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗãŒãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚ˆã‚Šã‚‚12.8 GB大きい場合、 各デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã§æœ€å¤§100,000ãƒ•ã‚Ąã‚¤ãƒĢをå‡Ļį†ã™ã‚‹ãŽãĢ十分ãĒčŋŊ加゚ペãƒŧ゚があり、 æĩĒč˛ģ゚ペãƒŧ゚はありぞせん。 .PP Linuxでより大きãĒパãƒĒãƒ†ã‚Ŗãƒ‘ãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗã‚’å–åž—ã™ã‚‹ãƒˆãƒĒックは、æŦĄãŽã‚ŗãƒžãƒŗãƒ‰ã§ フりãƒŧマットすることです。 .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP これãĢã‚ˆã‚Šã€į´„1.5%ぎčŋŊ加゚ペãƒŧ゚、4 TBãƒ‡ã‚Ŗã‚šã‚¯ã§į´„60 GBが垗られ、 æĩĒč˛ģ゚ペãƒŧ゚ãĒしで各デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã§į´„460,000ãƒ•ã‚Ąã‚¤ãƒĢが可čƒŊãĢãĒりぞす。 .SS hashsize SIZE_IN_BYTES äŋå­˜ã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ãŽãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēをバイト単äŊã§åŽšįžŠã—ãžã™ã€‚ .PP デフりãƒĢãƒˆãŽãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēは16バイトīŧˆ128ビットīŧ‰ã§ã‚り、ãģとんおぎ場合ãĢ抟čƒŊするはずです。 .PP **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、こぎ値を変更しãĒいことをåŧˇã お勧めしぞす。äģŠåžŒã“ぎ値を変更するãĢは、パãƒĒãƒ†ã‚Ŗå…¨äŊ“ã‚’**再äŊœæˆ**するåŋ…čĻãŒã‚ã‚Šãžã™īŧ .PP į•°ãĒã‚‹ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēをäŊŋį”¨ã™ã‚‹į†į”ąãŽ1ã¤ã¯ã€ã‚ˇã‚šãƒ†ãƒ ãŽãƒĄãƒĸãƒĒがåˆļ限されãĻいる場合です。 įĩŒé¨“則としãĻ、SnapRAIDは通常、ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋ16 TBごとãĢ1 GiBぎRAMをåŋ…čĻã¨ã—ãžã™ã€‚ .PP å…ˇäŊ“įš„ãĢは、デãƒŧã‚ŋãŽãƒãƒƒã‚ˇãƒĨをäŋå­˜ã™ã‚‹ãŸã‚ãĢ、SnapRAIDは į´„ $TS \\cdot (1 + HS) / BS$ バイトぎRAMをåŋ…čĻã¨ã—ãžã™ã€‚ ここで、TSã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦã‚¤ãŽåˆč¨ˆã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã€BSはブロックã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã€HSã¯ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã§ã™ã€‚ .PP たとえば、4 TBãŽãƒ‡ã‚Ŗã‚šã‚¯8台、ブロックã‚ĩイã‚ē256 KiBīŧˆ1 KiB = 1024バイトīŧ‰ã€ ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ē16ぎ場合īŧš .PP RAM = $(8 \\cdot 4 \\cdot 10^{12}) \\cdot (1 + 16) / (256 \\cdot 2^{10}) = 1.93 \\text{ GiB}$ .PD 0 .PD .PP ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēを8ãĢ切りæ›ŋえるとīŧš .PP RAM = $(8 \\cdot 4 \\cdot 10^{12}) \\cdot (1 + 8) / (256 \\cdot 2^{10}) = 1.02 \\text{ GiB}$ .PD 0 .PD .PP ブロックã‚ĩイã‚ēを512ãĢ切りæ›ŋえるとīŧš .PP RAM = $(8 \\cdot 4 \\cdot 10^{12}) \\cdot (1 + 16) / (512 \\cdot 2^{10}) = 0.96 \\text{ GiB}$ .PD 0 .PD .PP ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēを8、ブロックã‚ĩイã‚ēを512ãŽä¸Ąæ–šãĢ切りæ›ŋえるとīŧš .PP RAM = $(8 \\cdot 4 \\cdot 10^{12}) \\cdot (1 + 8) / (512 \\cdot 2^{10}) = 0.51 \\text{ GiB}$ .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES å‡Ļį†ã•ã‚ŒãŸæŒ‡åŽšã•ã‚ŒãŸGB量垌ãĢã€åŒæœŸãžãŸã¯ã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°æ™‚ãĢįŠļ態をč‡Ēå‹•įš„ãĢäŋå­˜ã—ぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ãƒžã‚ˇãƒŗã‚¯ãƒŠãƒƒã‚ˇãƒĨやそぎäģ–ãŽã‚¤ãƒ™ãƒŗãƒˆãĢã‚ˆãŖãĻ中断された場合ãĢ、 é•ˇã„ \`sync\` ã‚ŗãƒžãƒŗãƒ‰ã‚’æœ€åˆã‹ã‚‰å†čĩˇå‹•するぎをéŋけるぎãĢåŊšįĢ‹ãĄãžã™ã€‚ .SS temp_limit TEMPERATURE_CELSIUS č¨ąåŽšã•ã‚Œã‚‹æœ€å¤§ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻã‚’æ‘‚æ°ã§č¨­åŽšã—ãžã™ã€‚æŒ‡åŽšã•ã‚ŒãĻいる場合、 SnapRAIDは smartctl ツãƒŧãƒĢをäŊŋį”¨ã—ãĻすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻã‚’åŽšæœŸįš„ãĢチェックしぞす。 SnapRAIDが動äŊœã—ãĻã„ã‚‹é–“ã€įžåœ¨ãŽãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻãŒčĄ¨į¤ēされぞす。 ã„ãšã‚Œã‹ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒã“ãŽåˆļ限をčļ…えると、すずãĻぎ操äŊœãŒåœæ­ĸã—ã€ãƒ‡ã‚Ŗã‚šã‚¯ã¯ \`temp_sleep\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§åŽšįžŠã•ã‚ŒãŸæœŸé–“ã€ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗīŧˆã‚šã‚ŋãƒŗãƒã‚¤įŠļ態ãĢį§ģ行īŧ‰ã•れぞす。 ゚ãƒĒãƒŧプ期間垌、操äŊœã¯å†é–‹ã•れぞすが、渊åēĻåˆļ限ãĢ再åēĻé”ã—ãŸå ´åˆã¯å†ãŗä¸€æ™‚åœæ­ĸする 可čƒŊ性がありぞす。 .PP 操äŊœä¸­ã€SnapRAIDã¯å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽåŠ į†ąæ›˛įˇšã‚‚åˆ†æžã—ã€ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ“ãƒ†ã‚ŖãŒįļ™įļšã—た場合ãĢ 達するとä爿ƒŗã•ã‚Œã‚‹é•ˇæœŸįš„ãĒ厉厚渊åēĻã‚’æŽ¨åŽšã—ãžã™ã€‚æŽ¨åŽšã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻが4回上昇した 垌ãĢぎãŋåŽŸčĄŒã•ã‚Œã€äŋĄé ŧできる傞向をįĸēįĢ‹ã™ã‚‹ãŽãĢ十分ãĒデãƒŧã‚ŋãƒã‚¤ãƒŗãƒˆãŒåˆŠį”¨å¯čƒŊであることを äŋč¨ŧしぞす。 こぎä爿¸Ŧされる厉厚渊åēĻã¯ã€įžåœ¨ãŽå€¤ãŽæ¨ĒãĢæ‹Ŧåŧ§ã§čĄ¨į¤ēã•ã‚Œã€ã‚ˇã‚šãƒ†ãƒ ãŽå†ˇå´ãŒ éŠåˆ‡ã‹ãŠã†ã‹ã‚’čŠ•äžĄã™ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ã“ãŽæŽ¨åŽšæ¸ŠåēĻã¯æƒ…å ąæäž›ãŽãŋã‚’į›Žįš„ã¨ã—ãĻおり、 SnapRAIDぎ動äŊœãĢはåŊąéŸŋしぞせん。プログナムぎ動äŊœã¯ã€åŽŸéš›ãŽæ¸ŦåŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻãĢぎãŋ åŸēãĨいãĻいぞす。 .PP ã“ãŽåˆ†æžã‚’åŽŸčĄŒã™ã‚‹ãŸã‚ãĢ、SnapRAIDã¯ã‚ˇã‚šãƒ†ãƒ æ¸ŠåēĻãŽå‚į…§ãŒåŋ…čĻã§ã™ã€‚ ãžãšã€åˆŠį”¨å¯čƒŊãĒハãƒŧドã‚Ļェã‚ĸã‚ģãƒŗã‚ĩãƒŧからčĒ­ãŋå–ã‚ã†ã¨ã—ãžã™ã€‚ã‚ˇã‚šãƒ†ãƒ ã‚ģãƒŗã‚ĩãƒŧãĢ ã‚ĸクã‚ģ゚できãĒã„å ´åˆã¯ã€åŽŸčĄŒé–‹å§‹æ™‚ãĢæ¸Ŧ厚された最もäŊŽã„ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻをフりãƒŧãƒĢãƒãƒƒã‚¯å‚į…§ã¨ã—ãĻ äŊŋį”¨ã—ãžã™ã€‚ .PP 通常、SnapRAIDã¯æœ€ã‚‚į†ąã„ãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻぎãŋã‚’čĄ¨į¤ēしぞす。 すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻã‚’čĄ¨į¤ēするãĢは、\-A ぞたは \-\-stats ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ .SS temp_sleep TIME_IN_MINUTES 渊åēĻåˆļ限ãĢ達したときぎ゚ã‚ŋãƒŗãƒã‚¤æ™‚é–“īŧˆåˆ†å˜äŊīŧ‰ã‚’č¨­åŽšã—ãžã™ã€‚ã“ãŽæœŸé–“ä¸­ã€ãƒ‡ã‚Ŗã‚šã‚¯ã¯ ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãŸãžãžã§ã™ã€‚ãƒ‡ãƒ•ã‚ŠãƒĢトは5分です。 .SS pool DIR \`pool\` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãĻãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎäģŽæƒŗãƒ“ãƒĨãƒŧがäŊœæˆã•れるプãƒŧãƒĒãƒŗã‚°ãƒ‡ã‚ŖãƒŦクトãƒĒを åŽšįžŠã—ãžã™ã€‚ .PP ãƒ‡ã‚ŖãƒŦクトãƒĒはæ—ĸãĢ存在しãĻいるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .SS share UNC_DIR ãƒ‡ã‚Ŗã‚šã‚¯ãĢãƒĒãƒĸãƒŧトでã‚ĸクã‚ģ゚するためãĢåŋ…čρãĒWindows UNCãƒ‘ã‚šã‚’åŽšįžŠã—ãžã™ã€‚ .PP こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいる場合、プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒãĢäŊœæˆã•ã‚ŒãŸã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ã€ ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ĸクã‚ģ゚するためãĢこぎUNCパ゚をäŊŋį”¨ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒãĒã„å ´åˆã€į”Ÿæˆã•ã‚ŒãŸã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ãƒ­ãƒŧã‚ĢãƒĢパ゚ぎãŋをäŊŋį”¨ã—ã€ プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒをネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã™ã‚‹ã“とはできぞせん。 .PP ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ã€æŒ‡åŽšã•ã‚ŒãŸUNCパ゚をäŊŋį”¨ã—ãĻåŊĸ成され、\`data\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯åã‚’čŋŊ加し、最垌ãĢãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ‡ã‚ŖãƒŦクトãƒĒと名前をčŋŊ加しぞす。 .PP こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯Windowsでぎãŋåŋ…čĻã§ã™ã€‚ .SS smartctl DISK/PARITY OPTIONS... å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTåąžæ€§ã‚’å–åž—ã™ã‚‹ãŸã‚ãŽã‚Ģ゚ã‚ŋムsmartctlã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’åŽšįžŠã—ãžã™ã€‚ これは、RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧや一部ぎUSBãƒ‡ã‚Ŗã‚šã‚¯ãŒč‡Ē動検å‡ēできãĒい場合ãĢåŋ…čρãĢãĒる ことがありぞす。\`%s\` プãƒŦãƒŧ゚ホãƒĢダãƒŧはデバイ゚名ãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ãŒã€ RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧãĒおぎå›ē厚デバイ゚ではã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã™ã€‚ .PP DISK は \`data\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã•ã‚ŒãŸãŽã¨åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ PARITY はパãƒĒãƒ†ã‚ŖåãŽã„ãšã‚Œã‹ã§ã™īŧš\`parity\`、\`2\-parity\`、\`3\-parity\`、 \`4\-parity\`、\`5\-parity\`、\`6\-parity\`、ぞたは \`z\-parity\`。 .PP 指厚された OPTIONS で、\`%s\` 文字列はデバイ゚名ãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚ RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧぎ場合、デバイ゚はå›ē厚されãĻいる可čƒŊ性がéĢ˜ã„ãŸã‚ã€ \`%s\` をäŊŋį”¨ã™ã‚‹åŋ…čĻã¯ãĒいかもしれぞせん。 .PP äŊŋį”¨å¯čƒŊãĒã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢついãĻは、smartmontoolsぎドキãƒĨãƒĄãƒŗãƒˆã‚’å‚į…§ã—ãĻください。 .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP 例īŧš .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] ãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŽįĸēįŽ‡ã‚’č¨ˆįŽ—ã™ã‚‹ã¨ããĢ、指厚されたSMARTåąžæ€§ã‚’į„ĄčĻ–ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒį‰šåŽšãŽåąžæ€§ãĢついãĻᕰ叏ãĒ値ぞたはčĒ¤č§Ŗã‚’æ‹›ãå€¤ã‚’å ąå‘Šã™ã‚‹å ´åˆãĢ åŊšįĢ‹ãĄãžã™ã€‚ .PP DISK は \`data\` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã•ã‚ŒãŸãŽã¨åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ PARITY はパãƒĒãƒ†ã‚ŖåãŽã„ãšã‚Œã‹ã§ã™īŧš\`parity\`、\`2\-parity\`、\`3\-parity\`、 \`4\-parity\`、\`5\-parity\`、\`6\-parity\`、ぞたは \`z\-parity\`。 į‰šæŽŠãĒ値 \`*\` は、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã§åąžæ€§ã‚’į„ĄčĻ–ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã§ããžã™ã€‚ .PP 䞋としãĻ、すずãĻぎデã‚Ŗã‚šã‚¯ã§ \`Current Pending Sector Count\` åąžæ€§ã‚’į„ĄčĻ–ã™ã‚‹ãĢはīŧš .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP 最初ぎパãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã§ãŽãŋį„ĄčĻ–ã™ã‚‹ãĢはīŧš .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples Unixぎ一čˆŦįš„ãĒ構成ぎ䞋はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Windowsぎ一čˆŦįš„ãĒ構成ぎ䞋はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN パã‚ŋãƒŧãƒŗã¯ã€åĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯é™¤å¤–ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã™ã‚‹ãŸã‚ãŽæŸ”čģŸãĒæ–šæŗ•ã‚’ 提䞛しぞす。グロブ文字をäŊŋį”¨ã™ã‚‹ã“ã¨ã§ã€ã™ãšãĻぎパ゚を手動でãƒĒ゚トすることãĒく、 į‰šåŽšãŽãƒ•ã‚Ąã‚¤ãƒĢåã‚„ãƒ‡ã‚ŖãƒŦクトãƒĒ構造全äŊ“ãĢä¸€č‡´ã™ã‚‹ãƒĢãƒŧãƒĢã‚’åŽšįžŠã§ããžã™ã€‚ .PP į–‘å•įŦĻ \`?\` ã¯ã€ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字を除くäģģæ„ãŽ1文字ãĢä¸€č‡´ã—ãžã™ã€‚ これãĢより、パã‚ŋãƒŧãƒŗã‚’å˜ä¸€ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢãĢ限厚したぞぞ、可変文字を æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢåã¨ä¸€č‡´ã•ã›ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ .PP 単一ぎã‚ĸ゚ã‚ŋãƒĒ゚ク \`*\` はäģģæ„ãŽæ–‡å­—列ãĢä¸€č‡´ã—ãžã™ãŒã€į–‘å•įŦĻと同様ãĢ ãƒ‡ã‚ŖãƒŦクトãƒĒぎåĸƒį•Œã‚’čļŠãˆã‚‹ã“ã¨ã¯ã‚ã‚Šãžã›ã‚“ã€‚ã‚šãƒŠãƒƒã‚ˇãƒĨで停æ­ĸするため、 å˜ä¸€ãŽãƒ‘ã‚šã‚ŗãƒŗãƒãƒŧãƒãƒŗãƒˆå†…ã§ãŽä¸€č‡´ãĢ遊しãĻã„ãžã™ã€‚ã“ã‚Œã¯ã€ã‚ˇã‚§ãƒĢぎ グロブでおãĒじãŋぎ標æē–įš„ãĒワイãƒĢドã‚Ģãƒŧドぎ動äŊœã§ã™ã€‚ .PP ダブãƒĢã‚ĸ゚ã‚ŋãƒĒ゚ク \`**\` はよりåŧˇåŠ›ã§ã€ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字をåĢむ äģģæ„ãŽæ–‡å­—列ãĢä¸€č‡´ã—ãžã™ã€‚ã“ã‚ŒãĢより、パã‚ŋãƒŧãƒŗãŒč¤‡æ•°ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢを ãžãŸã„ã§ä¸€č‡´ã§ãã‚‹ã‚ˆã†ãĢãĒりぞす。\`**\` がパã‚ŋãƒŧãƒŗå†…ãĢį›´æŽĨ埋めčžŧぞれãĻいる場合、 å‘¨å›˛ãŽãƒĒテナãƒĢテキ゚トぎ間ãĢã‚ã‚‹ã‚šãƒŠãƒƒã‚ˇãƒĨをåĢむ0文字äģĨ上ぎ文字ãĢä¸€č‡´ã—ãžã™ã€‚ .PP \`**\` ぎ最も重čρãĒäŊŋã„æ–šã¯ã€į‰šåˆĨãĒåŊĸåŧã§ã‚ã‚‹ \`/**/\` です。これは 0個äģĨ上ぎ厌全ãĒãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢãĢä¸€č‡´ã—ã€æ­ŖįĸēãĒパ゚構造をįŸĨらãĒくãĻも、 ãƒ‡ã‚ŖãƒŦクトãƒĒツãƒĒãƒŧ内ぎäģģæ„ãŽæˇąã•ãĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã¨ä¸€č‡´ã•ã›ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ 䞋えば、パã‚ŋãƒŧãƒŗ \`src/**/main.js\` は \`src/main.js\`īŧˆãƒ‡ã‚ŖãƒŦクトãƒĒを0個゚キップīŧ‰ã€ \`src/ui/main.js\`īŧˆ1個゚キップīŧ‰ã€\`src/ui/components/main.js\`īŧˆ2個゚キップīŧ‰ ãĢä¸€č‡´ã—ãžã™ã€‚ .PP 角æ‹Ŧåŧ§ \`[]\` をäŊŋį”¨ã—ãŸæ–‡å­—ã‚¯ãƒŠã‚šã¯ã€æŒ‡åŽšã•ã‚ŒãŸã‚ģãƒƒãƒˆãžãŸã¯į¯„å›˛ãŽ äģģæ„ãŽ1文字ãĢä¸€č‡´ã—ãžã™ã€‚äģ–ぎ単一文字パã‚ŋãƒŧãƒŗã¨åŒæ§˜ãĢ、 ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字ãĢã¯ä¸€č‡´ã—ãžã›ã‚“ã€‚ã‚¯ãƒŠã‚šã¯į¯„å›˛ã¨ã€æ„Ÿå˜†įŦĻを äŊŋį”¨ã—ãŸåĻ厚をã‚ĩポãƒŧトしãĻいぞす。 .PP čĻšãˆãĻおくずき栚æœŦįš„ãĒ違いは、\`*\`、\`?\`ã€ãŠã‚ˆãŗæ–‡å­—ã‚¯ãƒŠã‚šã¯ã™ãšãĻ ãƒ‡ã‚ŖãƒŦクトãƒĒぎåĸƒį•Œã‚’å°Šé‡ã—ã€å˜ä¸€ãŽãƒ‘ã‚šã‚ŗãƒŗãƒãƒŧãƒãƒŗãƒˆå†…ã§ãŽãŋä¸€č‡´ã™ã‚‹ãŽãĢ寞し、 \`**\` ã¯ãƒ‡ã‚ŖãƒŦクトãƒĒåŒēåˆ‡ã‚Šæ–‡å­—ã‚’ãžãŸã„ã§ä¸€č‡´ã§ãã‚‹å”¯ä¸€ãŽãƒ‘ã‚ŋãƒŧãƒŗã§ã‚ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚ .PP 4ã¤ãŽį•°ãĒã‚‹į¨ŽéĄžãŽãƒ‘ã‚ŋãƒŧãƒŗãŒã‚ã‚Šãžã™ã€‚ .TP .B FILE FILE という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ .TP .B DIR/ DIR という名前ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒとそぎ中ぎすずãĻを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ‡ã‚ŖãƒŦクトãƒĒãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ•ã‚Ąã‚¤ãƒĢãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ .TP .B /PATH/FILE æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒãƒ•ã‚Ąã‚¤ãƒĢ パ゚を選択しぞす。こぎパã‚ŋãƒŧãƒŗã¯ ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ .TP .B /PATH/DIR/ æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒãƒ‡ã‚ŖãƒŦクトãƒĒ パ゚とそぎ中ぎすずãĻを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ‡ã‚ŖãƒŦクトãƒĒãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ•ã‚Ąã‚¤ãƒĢãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ .TP .B / で始ぞるįĩļ寞パ゚を指厚する場合、それはロãƒŧã‚ĢãƒĢãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŽãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒではãĒく、 **ã‚ĸãƒŦイぎãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒ**ãĢéŠį”¨ã•ã‚Œãžã™ã€‚ .PP Windowsでは、フりワãƒŧãƒ‰ã‚šãƒŠãƒƒã‚ˇãƒĨ / ぎäģŖã‚ã‚ŠãĢãƒãƒƒã‚¯ã‚šãƒŠãƒƒã‚ˇãƒĨ \\ をäŊŋį”¨ã§ããžã™ã€‚ Windowsã‚ˇã‚šãƒ†ãƒ ãƒ‡ã‚ŖãƒŦクトãƒĒã€ã‚¸ãƒŖãƒŗã‚¯ã‚ˇãƒ§ãƒŗã€ãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã€ãŠã‚ˆãŗããŽäģ–ぎWindowsぎ į‰šæŽŠãƒ‡ã‚ŖãƒŦクトãƒĒã¯ãƒ•ã‚Ąã‚¤ãƒĢとしãĻæ‰ąã‚ã‚Œãžã™ã€‚ã¤ãžã‚Šã€ãã‚Œã‚‰ã‚’é™¤å¤–ã™ã‚‹ãĢは、 ãƒ‡ã‚ŖãƒŦクトãƒĒãƒĢãƒŧãƒĢではãĒく**ãƒ•ã‚Ąã‚¤ãƒĢãƒĢãƒŧãƒĢ**をäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP ãƒ•ã‚Ąã‚¤ãƒĢ名ãĢ \`*\`、\`?\`、\`[\`、ぞたは \`]\` 文字がåĢぞれãĻいる場合は、 グロブ文字としãĻč§Ŗé‡ˆã•ã‚ŒãĒいようãĢ**ã‚¨ã‚šã‚ąãƒŧプ**するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ Unixã§ã¯ã‚¨ã‚šã‚ąãƒŧプ文字は \`\\\` です。Windowsでは \`^\` です。 パã‚ŋãƒŧãƒŗãŒã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗãĢã‚ã‚‹å ´åˆã¯ã€ã‚ŗãƒžãƒŗãƒ‰ã‚ˇã‚§ãƒĢãĢã‚ˆãŖãĻč§Ŗé‡ˆã•ã‚Œã‚‹ãŽã‚’é˜˛ããŸã‚ãĢ、 ã‚¨ã‚šã‚ąãƒŧプ文字を**2倍**ãĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .PP æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢでは、å‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã™ã‚‹ãŸã‚ãĢį•°ãĒるæˆĻį•ĨをäŊŋį”¨ã§ããžã™ã€‚ æœ€ã‚‚į°Ąå˜ãĒã‚ĸプロãƒŧチは、**除外**したいすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢã¨ãƒ‡ã‚ŖãƒŦクトãƒĒを削除するためãĢ、 \`exclude\` ãƒĢãƒŧãƒĢぎãŋをäŊŋį”¨ã™ã‚‹ã“ã¨ã§ã™ã€‚äž‹īŧš .PP .RS 4 # \`*.unrecoverable\` という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを除外 .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # ãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒ \`/lost+found\` を除外 .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # \`tmp\` という名前ぎäģģæ„ãŽã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒを除外 .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP 反寞ぎã‚ĸプロãƒŧチは、\`include\` ãƒĢãƒŧãƒĢぎãŋをäŊŋį”¨ã—ãĻ、**å‡Ļį†ã—ãŸã„ãƒ•ã‚Ąã‚¤ãƒĢぎãŋ**を åŽšįžŠã™ã‚‹ã“ã¨ã§ã™ã€‚äž‹īŧš .PP .RS 4 # ä¸€éƒ¨ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぎãŋをåĢめる .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP æœ€åžŒãŽæ–šæŗ•ã¨ã—ãĻは、\`exclude\` と \`include\` ãƒĢãƒŧãƒĢã‚’æˇˇåœ¨ã•ã›ãžã™ã€‚ã“ãŽå ´åˆã€ **ãƒĢãƒŧãƒĢぎ順åēãŒé‡čρ**です。前ぎãƒĢãƒŧãƒĢは垌ぎãƒĢãƒŧãƒĢよりもå„Ē先されぞす。 į°Ąį´ åŒ–ã™ã‚‹ãŸã‚ãĢ、すずãĻぎ \`exclude\` ãƒĢãƒŧãƒĢを最初ãĢãƒĒ゚トし、æŦĄãĢすずãĻぎ \`include\` ãƒĢãƒŧãƒĢをãƒĒ゚トできぞす。䞋īŧš .PP .RS 4 # \`*.unrecoverable\` という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを除外 .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # \`tmp\` という名前ぎäģģæ„ãŽã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒを除外 .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # ä¸€éƒ¨ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぎãŋをåĢめる .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP ã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗã§ \-f ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€\`include\` パã‚ŋãƒŧãƒŗãŽãŋを äŊŋį”¨ã§ããžã™ã€‚äž‹īŧš .PP .RS 4 # .mp3 ãƒ•ã‚Ąã‚¤ãƒĢぎãŋをチェック。 .PD 0 .PP .PD # Unixã§ã¯ã€ã‚ˇã‚§ãƒĢãĢã‚ˆã‚‹ã‚°ãƒ­ãƒ–åą•é–‹ã‚’é˜˛ããŸã‚ãĢåŧ•ᔍįŦĻをäŊŋį”¨ã€‚ .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP Unixã§ã¯ã€ã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗã§ã‚°ãƒ­ãƒ–æ–‡å­—ã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€ã‚ˇã‚§ãƒĢãŒãã‚Œã‚‰ã‚’åą•é–‹ã™ã‚‹ãŽã‚’ é˜˛ããŸã‚ãĢåŧ•ᔍįŦĻã§å›˛ã‚€åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ .SH IGNORE FILE č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢぎグロãƒŧバãƒĢãƒĢãƒŧãƒĢãĢ加えãĻ、ã‚ĸãƒŦイ内ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãĢ .snapraidignore ãƒ•ã‚Ąã‚¤ãƒĢを配įŊŽã—ãĻã€åˆ†æ•Ŗåž‹ãŽé™¤å¤–ãƒĢãƒŧãƒĢã‚’åŽšįžŠã§ããžã™ã€‚ .PP \`.snapraidignore\` ã§åŽšįžŠã•ã‚ŒãŸãƒĢãƒŧãƒĢã¯ã€č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢぎãƒĢãƒŧãƒĢぎ垌ãĢ éŠį”¨ã•ã‚Œãžã™ã€‚ã“ã‚Œã¯ã€ãã‚Œã‚‰ãŒã‚ˆã‚ŠéĢ˜ã„å„Ē先åēĻã‚’æŒãĄã€ã‚°ãƒ­ãƒŧバãƒĢč¨­åŽšã§ äģĨ前ãĢåĢぞれãĻã„ãŸãƒ•ã‚Ąã‚¤ãƒĢを除外するためãĢäŊŋį”¨ã§ãã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ äē‹åŽŸä¸Šã€ãƒ­ãƒŧã‚ĢãƒĢãƒĢãƒŧãƒĢãŒä¸€č‡´ã™ã‚‹å ´åˆã€ã‚°ãƒ­ãƒŧバãƒĢãĒ包åĢč¨­åŽšãĢé–ĸäŋ‚ãĒく、 ãƒ•ã‚Ąã‚¤ãƒĢは除外されぞす。 .PP \`.snapraidignore\` ぎパã‚ŋãƒŧãƒŗãƒ­ã‚¸ãƒƒã‚¯ã¯ã‚°ãƒ­ãƒŧバãƒĢč¨­åŽšã‚’åæ˜ ã—ãĻいぞすが、 パã‚ŋãƒŧãƒŗã¯ããŽãƒ•ã‚Ąã‚¤ãƒĢが配įŊŽã•れãĻã„ã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒãĢå›ē厚されぞすīŧš .TP .B FILE ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぞたはそぎ下ãĢある、FILE という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを 選択しぞす。これは、グロãƒŧバãƒĢパã‚ŋãƒŧãƒŗã¨åŒã˜ã‚°ãƒ­ãƒƒãƒ“ãƒŗã‚°ãƒĢãƒŧãƒĢãĢ垓いぞす。 .TP .B DIR/ ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぞたはそぎ下ãĢある、DIR という名前ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒと そぎ中ぎすずãĻを選択しぞす。 .TP .B /PATH/FILE \`.snapraidignore\` ãƒ•ã‚Ąã‚¤ãƒĢぎ場所をåŸēæē–ãĢしãĻã€æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒ ãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。 .TP .B /PATH/DIR/ \`.snapraidignore\` ãƒ•ã‚Ąã‚¤ãƒĢぎ場所をåŸēæē–ãĢしãĻã€æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒ ãƒ‡ã‚ŖãƒŦクトãƒĒとそぎ中ぎすずãĻを選択しぞす。 .PP グロãƒŧバãƒĢč¨­åŽšã¨ã¯į•°ãĒり、\`.snapraidignore\` ãƒ•ã‚Ąã‚¤ãƒĢは除外ãƒĢãƒŧãƒĢぎãŋを ã‚ĩポãƒŧトしぞす。\`include\` パã‚ŋãƒŧãƒŗã‚„åĻ厚 (!) はäŊŋį”¨ã§ããžã›ã‚“ã€‚ .PP たとえば、\`/mnt/disk1/projects/\` ãĢ \`.snapraidignore\` がある場合īŧš .PP .RS 4 # /mnt/disk1/projects/output.bin ぎãŋを除外 .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # projects/ 内ぎ \`build\` ã¨ã„ã†åå‰ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをすずãĻ除外 .PD 0 .PP .PD build/ .PD 0 .PP .PD # projects/ ぞたはそぎã‚ĩブフりãƒĢダ内ぎすずãĻぎ .tmp ãƒ•ã‚Ąã‚¤ãƒĢを除外 .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAIDã¯ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¨ãƒã‚§ãƒƒã‚¯ã‚ĩãƒ ã‚’ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ぞす。 .PP これはバイナãƒĒãƒ•ã‚Ąã‚¤ãƒĢã§ã‚ã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイãĢ存在するすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢと、 それらぎ整合性を検č¨ŧするためぎすずãĻぎチェックã‚ĩムを一čĻ§čĄ¨į¤ēしぞす。 .PP ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢは \`sync\` ãŠã‚ˆãŗ \`scrub\` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ書きされ、 \`fix\`、\`check\`ã€ãŠã‚ˆãŗ \`status\` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ取られぞす。 .SH PARITY SnapRAIDは、ã‚ĸãƒŦイぎパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ぞす。 .PP これらはバイナãƒĒãƒ•ã‚Ąã‚¤ãƒĢであり、\`content\` ãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãŸã™ãšãĻぎブロックぎ č¨ˆįŽ—ã•ã‚ŒãŸãƒ‘ãƒĒãƒ†ã‚ŖãŒåĢぞれãĻいぞす。 .PP ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢは \`sync\` ãŠã‚ˆãŗ \`fix\` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ書きされ、 \`scrub\` ãŠã‚ˆãŗ \`check\` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻ**čĒ­ãŋ取られるだけ**です。 .SH ENCODING UnixぎSnapRAIDã¯ã€ã‚¨ãƒŗã‚ŗãƒŧãƒ‡ã‚Ŗãƒŗã‚°ã‚’į„ĄčĻ–ã—ãžã™ã€‚ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã§äŊŋį”¨ã•ã‚ŒãĻいる ãŽã¨åŒã˜ã‚¨ãƒŗã‚ŗãƒŧãƒ‡ã‚Ŗãƒŗã‚°ã§ãƒ•ã‚Ąã‚¤ãƒĢ名をčĒ­ãŋ取り、äŋå­˜ã—ぞす。 .PP Windowsã§ã¯ã€ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰čĒ­ãŋ取られたすずãĻぎ名前はUTF\-8åŊĸåŧãĢ変換され、 å‡Ļį†ã•ã‚Œãžã™ã€‚ .PP ãƒ•ã‚Ąã‚¤ãƒĢåã‚’æ­Ŗã—ãå‡ē力するãĢは、\`chcp 65001\` ã‚ŗãƒžãƒŗãƒ‰ã§Windowsã‚ŗãƒŗã‚ŊãƒŧãƒĢをUTF\-8ãƒĸãƒŧドãĢč¨­åŽšã—ã€ ã‚ŗãƒŗã‚ŊãƒŧãƒĢãƒ•ã‚Šãƒŗãƒˆã¨ã—ãĻ \`Lucida Console\` ãĒおぎTrueTypeãƒ•ã‚Šãƒŗãƒˆã‚’**äŊŋį”¨ã™ã‚‹**åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ これはå‡ēåŠ›ã•ã‚Œã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ名ãĢぎãŋåŊąéŸŋã—ãžã™ã€‚ã‚ŗãƒŗã‚ŊãƒŧãƒĢå‡ēåŠ›ã‚’ãƒ•ã‚Ąã‚¤ãƒĢãĢãƒĒダイãƒŦクトする場合、 įĩæžœãŽãƒ•ã‚Ąã‚¤ãƒĢは常ãĢUTF\-8åŊĸåŧãĢãĒりぞす。 .SH COPYRIGHT This file is Copyright (C) 2025 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ja.d000066400000000000000000002444731522717156100164000ustar00rootroot00000000000000Name{number} snapraid - Disk Arrayᔍ SnapRAID バックã‚ĸップ Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAIDã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦã‚¤į”¨ãŽãƒãƒƒã‚¯ã‚ĸッププログナムで、最大6å°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒį™ēį”Ÿã—ãŸå ´åˆãŽ デãƒŧã‚ŋ垊旧ぎためãĢパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã—ぞす。 ä¸ģãĢ大厚量で、更新é ģåēĻぎäŊŽã„ãƒ•ã‚Ąã‚¤ãƒĢã‚’æ‰ąã†ãƒ›ãƒŧãƒ ãƒĄãƒ‡ã‚Ŗã‚ĸã‚ģãƒŗã‚ŋãƒŧã‚’å¯žčąĄã¨ã—ãĻおり、 SnapRAIDãĢはいくつかぎ抟čƒŊがありぞす。 * ãƒ•ã‚Ąã‚¤ãƒĢがæ—ĸãĢå…ĨãŖãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã€å†ãƒ•ã‚ŠãƒŧマットせずãĢããŽãžãžåˆŠį”¨ã§ãã€é€šå¸¸é€šã‚Š ã‚ĸクã‚ģ゚できぞす。 * すずãĻぎデãƒŧã‚ŋãŒãƒãƒƒã‚ˇãƒĨ化され、デãƒŧã‚ŋぎ整合性をįĸēäŋã—、ã‚ĩイãƒŦãƒŗãƒˆãĒį ´æã‚’é˜˛ãŽãžã™ã€‚ * éšœåŽŗãŒį™ēį”Ÿã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽæ•°ãŒãƒ‘ãƒĒãƒ†ã‚Ŗæ•°ã‚’čļ…えた場合、デãƒŧã‚ŋãŽæå¤ąã¯åŊąéŸŋã‚’å—ã‘ãŸãƒ‡ã‚Ŗã‚šã‚¯ãĢ 限厚され、äģ–ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒ‡ãƒŧã‚ŋはåŧ•きįļšãã‚ĸクã‚ģ゚可čƒŊです。 * čĒ¤ãŖãĻãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽãƒ•ã‚Ąã‚¤ãƒĢを削除した場合でも、垊旧が可čƒŊです。 * ãƒ‡ã‚Ŗã‚šã‚¯ã¯į•°ãĒるã‚ĩイã‚ēã§ã‚ãŖãĻも構いぞせん。 * ã„ã¤ã§ã‚‚ãƒ‡ã‚Ŗã‚šã‚¯ã‚’čŋŊ加できぞす。 * SnapRAIDはデãƒŧã‚ŋをロックしぞせん。いつでも再フりãƒŧマットやデãƒŧã‚ŋį§ģ動ãĒしãĢåˆŠį”¨ã‚’ 停æ­ĸできぞす。 * ãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ĸクã‚ģ゚するためãĢã‚šãƒ”ãƒŗã•ã›ã‚‹åŋ…čĻãŒã‚ã‚‹ãŽã¯1å°ãŽãƒ‡ã‚Ŗã‚šã‚¯ã ã‘ã§ã‚ã‚Šã€ ᜁé›ģåŠ›ã¨é¨’éŸŗäŊŽæ¸›ãĢåŊšįĢ‹ãĄãžã™ã€‚ čŠŗį´°ãĢついãĻは、SnapRAIDぎå…Ŧåŧã‚ĩイトをごčĻ§ãã ã•ã„ã€‚ :https://www.snapraid.it/ Limitations SnapRAIDはRAIDとバックã‚ĸッププログナムぎハイブãƒĒãƒƒãƒ‰ã§ã‚ã‚Šã€ä¸Ąæ–šãŽåˆŠį‚šã‚’įĩ„ãŋ合わせることを į›ŽæŒ‡ã—ãĻいぞす。ただし、äŊŋį”¨ã™ã‚‹å‰ãĢč€ƒæ…Žã™ãšãã„ãã¤ã‹ãŽåˆļ限がありぞす。 ä¸ģãĒåˆļé™ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ã€æœ€čŋ‘ `sync` ã‚’åŽŸčĄŒã—ãĻいãĒい場合、厌全ãĢ垊旧できãĒい 可čƒŊ性があることです。 ã‚ˆã‚Šå…ˇäŊ“įš„ãĢは、最垌ぎ `sync` 操äŊœäģĨ降ãĢå¤‰æ›´ãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎã‚ĩイã‚ēぞでぎデãƒŧã‚ŋが 垊旧できãĒい可čƒŊ性がありぞす。 ã“ã‚Œã¯ã€å¤‰æ›´ãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãŒæ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢãĒい場合でもį™ēį”Ÿã—ãžã™ã€‚ こぎため、SnapRAIDは**ã‚ãŖãŸãĢ変更されãĒい**デãƒŧã‚ŋãĢ遊しãĻいぞす。 一斚で、新しくčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢは、æ—ĸãĢå­˜åœ¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎ垊旧をåĻ¨ã’ãžã›ã‚“ã€‚ 新しくčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãŒæ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢある場合ãĢぎãŋã€ãã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒå¤ąã‚ã‚Œãžã™ã€‚ そぎäģ–ぎSnapRAIDぎåˆļ限はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ * SnapRAIDã§ã¯ã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãĢ寞しãĻ**個åˆĨãŽãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ **がäŋæŒã•れぞす。 RAIDでは、単一ぎ大きãĒãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŒåž—ã‚‰ã‚Œãžã™ã€‚ * SnapRAIDは**デãƒŧã‚ŋã‚’ã‚šãƒˆãƒŠã‚¤ãƒ”ãƒŗã‚°ã—ãžã›ã‚“**。 RAIDã§ã¯ã€ã‚šãƒˆãƒŠã‚¤ãƒ”ãƒŗã‚°ãĢより速åēĻが向上しぞす。 * SnapRAIDは**ãƒĒã‚ĸãƒĢã‚ŋイムぎ垊旧をã‚ĩポãƒŧトしぞせん**。 RAIDã§ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻもäŊœæĨ­ã‚’停æ­ĸするåŋ…čĻã¯ã‚ã‚Šãžã›ã‚“ã€‚ * SnapRAIDは**é™ã‚‰ã‚ŒãŸæ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗ**からぎãŋデãƒŧã‚ŋを垊旧できぞす。 バックã‚ĸãƒƒãƒ—ã§ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ全äŊ“ぎ厌全ãĒéšœåŽŗã‹ã‚‰åžŠæ—§ã§ããžã™ã€‚ * **ãƒ•ã‚Ąã‚¤ãƒĢ名、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã€ãŠã‚ˆãŗãƒãƒŧドãƒĒãƒŗã‚¯**ぎãŋがäŋå­˜ã•れぞす。 ã‚ĸクã‚ģã‚šč¨ąå¯ã€æ‰€æœ‰æ¨Šã€ãŠã‚ˆãŗæ‹Ąåŧĩåąžæ€§ã¯äŋå­˜ã•れぞせん。 Getting Started SnapRAIDをäŊŋį”¨ã™ã‚‹ãĢã¯ã€ãžãšãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎ1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ `parity` æƒ…å ąå°‚į”¨ãĢ 選択するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢ1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’äŊŋį”¨ã™ã‚‹ã¨ã€RAID5と同様ãĢã€å˜ä¸€ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰ 垊旧できぞす。 RAID6と同様ãĢã€ã‚ˆã‚Šå¤šããŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰åžŠæ—§ã—ãŸã„å ´åˆã¯ã€ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢčŋŊåŠ ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ įĸēäŋã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’čŋŊåŠ ã™ã‚‹ãŸãŗãĢã€åžŠæ—§ã§ãã‚‹ãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒ1つåĸ—えぞす。 パãƒĒãƒ†ã‚Ŗæƒ…å ąã¯ã‚ĸãƒŦイ内ぎ**最大ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯**ぎã‚ĩイã‚ēãĢぞでåĸ—える可čƒŊ性があるため、 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã¨ã—ãĻは、ã‚ĸãƒŦイ内ぎ**æœ€å¤§ãŽãƒ‡ã‚Ŗã‚šã‚¯**を選択するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯ã€`parity` ãƒ•ã‚Ąã‚¤ãƒĢぎäŋå­˜å°‚ᔍãĢãĒりぞす。 **デãƒŧã‚ŋをäŋå­˜ã—ãĒいでください**。 æŦĄãĢ、SnapRAIDでäŋč­ˇã—たい `data` ãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŽšįžŠã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢåĢぞれるデãƒŧã‚ŋãŒã‚ãŖãŸãĢ変更されãĒい場合ãĢ、äŋč­ˇãŒæœ€ã‚‚åŠšæžœįš„ã§ã™ã€‚ こぎため、WindowsぎC:\ãƒ‡ã‚Ŗã‚šã‚¯ã‚„Unixぎ/home、/var、/tmpãƒ‡ã‚ŖãƒŦクトãƒĒをåĢめãĒい斚が č‰¯ã„ã§ã—ã‚‡ã†ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¯ `content` ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã•れ、通常はデãƒŧã‚ŋ、パãƒĒãƒ†ã‚Ŗã€ãžãŸã¯ ブãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ãĢäŋå­˜ã•れぞす。 ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢãĢは、バックã‚ĸãƒƒãƒ—ãŽčŠŗį´°ã¨ã€ããŽæ•´åˆæ€§ã‚’æ¤œč¨ŧするためぎすずãĻぎ チェックã‚ĩムがåĢぞれãĻいぞす。 `content` ãƒ•ã‚Ąã‚¤ãƒĢは**č¤‡æ•°ãŽã‚ŗãƒ”ãƒŧ**でäŋå­˜ã•ã‚Œã€č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒį™ēį”Ÿã—ãŸå ´åˆã§ã‚‚ã€ 少ãĒくとも1ã¤ãŽã‚ŗãƒ”ãƒŧãŒåˆŠį”¨å¯čƒŊであることをäŋč¨ŧするためãĢ、**å„ã‚ŗãƒ”ãƒŧã¯į•°ãĒã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãĢ** 配įŊŽã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ たとえば、1ãƒŦベãƒĢぎパãƒĒãƒ†ã‚Ŗäŋč­ˇãŽãŋãĢé–ĸåŋƒãŒã‚ã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæŦĄãŽå ´æ‰€ãĢあるとしぞす。 :/mnt/diskp <- パãƒĒãƒ†ã‚Ŗį”¨ãĢé¸æŠžã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ :/mnt/disk1 <- äŋč­ˇã™ã‚‹æœ€åˆãŽãƒ‡ã‚Ŗã‚šã‚¯ :/mnt/disk2 <- äŋč­ˇã™ã‚‹2į•Ēį›ŽãŽãƒ‡ã‚Ŗã‚šã‚¯ :/mnt/disk3 <- äŋč­ˇã™ã‚‹3į•Ēį›ŽãŽãƒ‡ã‚Ŗã‚šã‚¯ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢ `/etc/snapraid.conf` をæŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§äŊœæˆã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ WindowsをäŊŋį”¨ã—ãĻã„ã‚‹å ´åˆã¯ã€ã‚šãƒŠãƒƒã‚ˇãƒĨではãĒããƒ‰ãƒŠã‚¤ãƒ–æ–‡å­—ã¨ãƒãƒƒã‚¯ã‚šãƒŠãƒƒã‚ˇãƒĨを äŊŋį”¨ã—ãŸWindowsぎパ゚åŊĸåŧã‚’äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ ãƒ‡ã‚Ŗã‚šã‚¯ãŒå¤šããĻドナイブ文字が不čļŗã™ã‚‹å ´åˆã¯ã€ã‚ĩブフりãƒĢダãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’ į›´æŽĨマã‚Ļãƒŗãƒˆã§ããžã™ã€‚å‚į…§īŧš :https://www.google.com/search?q=Windows+mount+point ã“ãŽæ™‚į‚šã§ã€ãƒ‘ãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’æ§‹į¯‰ã™ã‚‹ãŸã‚ãĢ `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã™ã‚‹æē–備が整いぞした。 :snapraid sync こぎプロã‚ģ゚は、æ—ĸãĢãƒ‡ã‚Ŗã‚šã‚¯ãĢ存在するデãƒŧã‚ŋぎã‚ĩイã‚ēãĢåŋœã˜ãĻ、初回は数時間かかる å ´åˆãŒã‚ã‚Šãžã™ã€‚ãƒ‡ã‚Ŗã‚šã‚¯ãŒįŠēぎ場合は、プロã‚ģã‚šã¯åŗåē§ãĢ厌äē†ã—ぞす。 Ctrl+CをæŠŧすことでいつでも停æ­ĸでき、æŦĄå›žãŽåŽŸčĄŒæ™‚ãĢは中断された場所から再開されぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ãŒåŽŒäē†ã™ã‚‹ã¨ã€ãƒ‡ãƒŧã‚ŋは**SAFE**ãĢãĒりぞす。 これで、ã‚ĸãƒŦイをč‡Ēį”ąãĢäŊŋã„å§‹ã‚ã€åŽšæœŸįš„ãĢ `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’ 更新できぞす。 Scrubbing デãƒŧã‚ŋとパãƒĒãƒ†ã‚ŖãŽã‚¨ãƒŠãƒŧã‚’åŽšæœŸįš„ãĢチェックするãĢは、`scrub` ã‚ŗãƒžãƒŗãƒ‰ã‚’ åŽŸčĄŒã§ããžã™ã€‚ :snapraid scrub ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€é…åˆ—å†…ãŽãƒ‡ãƒŧã‚ŋを `sync` ã‚ŗãƒžãƒŗãƒ‰ä¸­ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨと比čŧƒã—ãĻ、 整合性を検č¨ŧしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã‚’1å›žåŽŸčĄŒã™ã‚‹ã¨ã€å‰å›žãŽ10æ—Ĩ間でæ—ĸãĢ゚クナブされたデãƒŧã‚ŋを除いãĻ、 ã‚ĸãƒŦã‚¤ãŽį´„8%がチェックされぞす。 -p, --plan ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻį•°ãĒる量を指厚でき、 -o, --older-than ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻį•°ãĒるįĩŒéŽæ—Ĩ数で 指厚できぞす。 たとえば、20æ—ĨäģĨ上įĩŒéŽã—たブロックぎ5%をチェックするãĢは、æŦĄãŽã‚ˆã†ãĢäŊŋį”¨ã—ãžã™ã€‚ :snapraid -p 5 -o 20 scrub プロã‚ģ゚中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€ 寞åŋœã™ã‚‹ãƒ–ロックは `content` ãƒ•ã‚Ąã‚¤ãƒĢå†…ã§ä¸č‰¯ã¨ã—ãĻマãƒŧクされ、 `status` ã‚ŗãƒžãƒŗãƒ‰ã§ä¸€čĻ§čĄ¨į¤ēされぞす。 :snapraid status それらをäŋŽæ­Ŗã™ã‚‹ãĢは、-e, --filter-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãĻ、 `fix` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ :snapraid -e fix æŦĄå›žãŽ `scrub` で、エナãƒŧがæœŦåŊ“ãĢäŋŽæ­Ŗã•れãĻいれば、`status` ãƒŦポãƒŧトから エナãƒŧはæļˆãˆãžã™ã€‚よりéĢ˜é€ŸãĢするためãĢ、`-p bad` をäŊŋį”¨ã—ãĻä¸č‰¯ã¨ã—ãĻマãƒŧクされた ブロックぎãŋを゚クナブできぞす。 :snapraid -p bad scrub æœĒ同期ぎã‚ĸãƒŦイで `scrub` ã‚’åŽŸčĄŒã™ã‚‹ã¨ã€å‰Šé™¤ãžãŸã¯å¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ˆãŖãĻ åŧ•きčĩˇã“されたエナãƒŧãŒå ąå‘Šã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚¨ãƒŠãƒŧは `scrub` ぎ å‡ēåŠ›ã§å ąå‘Šã•ã‚Œãžã™ãŒã€é–ĸé€Ŗã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞせん。 Pooling æŗ¨: ここでčĒŦ明するプãƒŧãƒĒãƒŗã‚°æŠŸčƒŊは、**mergerfs** ツãƒŧãƒĢãĢå–ãŖãĻäģŖã‚ã‚‰ã‚Œãžã—た。 mergerfs は、SnapRAIDã‚ŗãƒŸãƒĨãƒ‹ãƒ†ã‚ŖãŽLinuxãƒĻãƒŧã‚ļãƒŧãĢ推åĨ¨ã•れるã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã™ã€‚ Mergefs ã¯ã€č¤‡æ•°ãŽãƒ‰ãƒŠã‚¤ãƒ–ã‚’å˜ä¸€ãŽįĩąåˆã•れたマã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆãĢプãƒŧãƒĢするためぎ、 より柔čģŸã§åŠšįŽ‡įš„ãĒæ–šæŗ•ã‚’æäž›ã—ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ãĢé ŧることãĒくã‚ĸãƒŦイ全äŊ“ぎ ãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ˇãƒŧムãƒŦ゚ãĢã‚ĸクã‚ģ゚できぞす。これは、パãƒĒãƒ†ã‚Ŗäŋč­ˇãŽãŸã‚ãĢSnapRAIDと うぞくįĩąåˆã•れãĻおり、OpenMediaVault (OMV) やã‚Ģ゚ã‚ŋムNAS構成ãĒおぎã‚ģットã‚ĸップで 一čˆŦįš„ãĢäŊŋį”¨ã•ã‚ŒãĻいぞす。 ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒツãƒĒãƒŧãĢ襨į¤ēさせるãĢは、 `pooling` 抟čƒŊを有劚ãĢã§ããžã™ã€‚ã“ã‚Œã¯ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’äŊŋį”¨ã—ãĻ、 ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎčĒ­ãŋå–ã‚Šå°‚į”¨ãŽäģŽæƒŗãƒ“ãƒĨãƒŧをäŊœæˆã—ぞす。 æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで `pooling` ãƒ‡ã‚ŖãƒŦクトãƒĒをæŦĄãŽã‚ˆã†ãĢ構成できぞす。 :pool /pool ぞたは、Windowsぎ場合は、æŦĄãŽã‚ˆã†ãĢしぞす。 :pool C:\pool そしãĻ、`pool` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻäģŽæƒŗãƒ“ãƒĨãƒŧをäŊœæˆãžãŸã¯æ›´æ–°ã—ぞす。 :snapraid pool UnixプナットフりãƒŧムをäŊŋį”¨ã—ãĻãŠã‚Šã€ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをWindowsぞたはUnixãƒžã‚ˇãƒŗãĢ ネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã—たい場合は、`/etc/samba/smb.conf` ãĢæŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ čŋŊ加するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ :# smb.conf ぎ global ã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§ :unix extensions = no :# smb.conf ぎ share ã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§ :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes Windowsでは、ネットワãƒŧクįĩŒį”ąã§ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’å…ąæœ‰ã™ã‚‹ãĢは、クナイã‚ĸãƒŗãƒˆãŒ それらをãƒĒãƒĸãƒŧãƒˆã§č§Ŗæąēするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ã“ã‚Œã‚’æœ‰åŠšãĢするãĢは、プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒを å…ąæœ‰ã™ã‚‹ã“ã¨ãĢ加えãĻã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãŸ**ãƒ‡ã‚Ŗã‚šã‚¯å**ã‚’å…ąæœ‰ãƒã‚¤ãƒŗãƒˆã¨ã—ãĻ äŊŋį”¨ã—ãĻ、**すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’å€‹åˆĨãĢ**å…ąæœ‰ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãžãŸã€ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆãŒ ã“ã‚Œã‚‰ãŽå…ąæœ‰ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ĸクã‚ģ゚するためãĢäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚‹Windows UNCパ゚を、 æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢぎ `share` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ たとえば、`darkstar` という名前ぎã‚ĩãƒŧバãƒŧで操äŊœã—ãĻいる場合、æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã§ããžã™ã€‚ :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar そしãĻ、æŦĄãŽãƒ‡ã‚ŖãƒŦクトãƒĒをネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã—ぞす。 :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array これãĢより、ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆã¯ `\\darkstar\pool` ですずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢãĢ ã‚ĸクã‚ģ゚できるようãĢãĒりぞす。 ぞた、ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆãŒãƒĒãƒĸãƒŧãƒˆã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¸ãŽã‚ĸクã‚ģ゚を有劚ãĢするためãĢ、 æŦĄãŽã‚ŗãƒžãƒŗãƒ‰ã§æ§‹æˆã™ã‚‹åŋ…čĻãŒã‚ã‚‹å ´åˆã‚‚ã‚ã‚Šãžã™ã€‚ :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAIDはRAIDã‚ˇã‚šãƒ†ãƒ ã‚ˆã‚Šã‚‚ãƒãƒƒã‚¯ã‚ĸッププログナムぎようãĢ抟čƒŊし、 -f, --filter ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻãƒ•ã‚Ąã‚¤ãƒĢをäģĨ前ぎįŠļ態ãĢåžŠå…ƒãžãŸã¯å‰Šé™¤č§Ŗé™¤ã™ã‚‹ãŸã‚ãĢ äŊŋį”¨ã§ããžã™ã€‚ :snapraid fix -f FILE ãžãŸã¯ãƒ‡ã‚ŖãƒŦクトãƒĒぎ場合はīŧš :snapraid fix -f DIR/ ぞた、-m, --filter-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€ãƒ‡ã‚ŖãƒŦクトãƒĒ内ぎ**čĒ¤ãŖãĻå‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎãŋ**を 垊旧するためãĢäŊŋį”¨ã™ã‚‹ã“ã¨ã‚‚ã§ããžã™ã€‚ã“ã‚ŒãĢより、不čļŗã—ãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが垊元され、 äģ–ãŽãƒ•ã‚Ąã‚¤ãƒĢはすずãĻそぎぞぞ掋されぞす。 :snapraid fix -m -f DIR/ ぞたは、すずãĻぎドナイブ上ぎすずãĻãŽå‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢを垊旧するãĢはīŧš :snapraid fix -m Recovering 最æ‚Ēぎä狿…‹ãŒį™ēį”Ÿã—ã€1台äģĨä¸ŠãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’å¤ąã„ãžã—ãŸīŧ **パニックãĢãĒらãĒいでくださいīŧ** 垊旧できぞすīŧ 最初ãĢčĄŒã†ãšãã“ã¨ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイへぎ**さらãĒる変更をéŋける**ことです。 ãƒĒãƒĸãƒŧトæŽĨįļšã€ãŠã‚ˆãŗã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたSnapRAIDぎ夜間 `sync` や `scrub` をåĢむ、 すずãĻãŽã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたプロã‚ģã‚šã‚’į„ĄåŠšãĢしãĻください。 æŦĄãĢ、æŦĄãŽæ‰‹é †ãĢ進ãŋぞす。 STEP 1 -> Reconfigure 垊旧ぎためãĢいくらかぎ゚ペãƒŧ゚がåŋ…čĻã§ã™ã€‚į†æƒŗįš„ãĢはčŋŊ加ぎ äēˆå‚™ãƒ‡ã‚Ŗã‚šã‚¯ã§ã™ãŒã€å¤–部USBãƒ‡ã‚Ŗã‚šã‚¯ã‚„ãƒĒãƒĸãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ã§ã‚‚ååˆ†ã§ã™ã€‚ SnapRAIDãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを変更しãĻã€æ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽ `data` ぞたは `parity` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ã€ãƒ•ã‚Ąã‚¤ãƒĢを垊旧するためぎ十分ãĒįŠēき厚量ぎある場所ãĢ 向けぞす。 ãŸã¨ãˆã°ã€ãƒ‡ã‚Ŗã‚šã‚¯ `d1` が故障した場合、æŦĄãŽã‚ˆã†ãĢ変更しぞす。 :data d1 /mnt/disk1/ からīŧš :data d1 /mnt/new_spare_disk/ åžŠæ—§ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãŒãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆã¯ã€éŠåˆ‡ãĒ `parity` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ 更新しぞす。 č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻいる場合は、すずãĻぎ構成ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æ›´æ–°ã—ãžã™ã€‚ STEP 2 -> Fix ãƒ­ã‚°ã‚’å¤–éƒ¨ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ãĻ、`fix` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãžã™ã€‚ :snapraid -d NAME -l fix.log fix ここで NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã§ã‚ã‚Šã€å‰ãŽäž‹ã§ã¯ `d1` ぎようãĒもぎです。 åžŠæ—§ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãŒãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆã¯ã€`parity`、`2-parity` ãĒおぎ 名前をäŊŋį”¨ã—ãžã™ã€‚ č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻã„ã‚‹å ´åˆã¯ã€č¤‡æ•°ãŽ `-d` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ すずãĻを指厚しぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯æ™‚é–“ãŒã‹ã‹ã‚Šãžã™ã€‚ `fix.log` ãƒ•ã‚Ąã‚¤ãƒĢをäŋå­˜ã™ã‚‹ãŸã‚ãĢ数ゎã‚ŦバイトぎįŠēき厚量があることをįĸēčĒã—ãĻください。 十分ãĒįŠēãåŽšé‡ãŽã‚ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰åŽŸčĄŒã—ãĻください。 これで、垊旧可čƒŊãĒすずãĻãŽã‚‚ãŽãŒåžŠæ—§ã•ã‚Œãžã—ãŸã€‚ä¸€éƒ¨ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒéƒ¨åˆ†įš„ãžãŸã¯åŽŒå…¨ãĢ 垊旧できãĒい場合、それらは `.unrecoverable` æ‹Ąåŧĩ子をčŋŊ加しãĻ名前が変更されぞす。 `fix.log` ãƒ•ã‚Ąã‚¤ãƒĢで、`unrecoverable:` で始ぞるすずãĻãŽčĄŒã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã€ すずãĻぎ垊旧不čƒŊãĒãƒ–ãƒ­ãƒƒã‚¯ãŽčŠŗį´°ãĒãƒĒ゚トをčĻ‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ 垊旧ãĢæē€čļŗã§ããĒい場合は、äŊ•åēĻでも再čŠĻčĄŒã§ããžã™ã€‚ たとえば、最垌ぎ `sync` ぎ垌ãĢã‚ĸãƒŦã‚¤ã‹ã‚‰ãƒ•ã‚Ąã‚¤ãƒĢを削除した場合、 これãĢã‚ˆã‚Šä¸€éƒ¨ãŽãƒ•ã‚Ąã‚¤ãƒĢが垊旧されãĒい可čƒŊ性がありぞす。 こぎ場合、-i, --import ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒįžåœ¨ãŠã“ãĢあるかを指厚することで、 垊旧プロã‚ģ゚ãĢそれらを再åēĻåĢめるようãĢ `fix` を再čŠĻčĄŒã§ããžã™ã€‚ 垊旧ãĢæē€čļŗã—ãĻいる場合は、さらãĢé€˛ã‚€ã“ã¨ãŒã§ããžã™ãŒã€**sync** ãŽåŽŸčĄŒåžŒãĢは `fix` ã‚ŗãƒžãƒŗãƒ‰ã‚’**再čŠĻčĄŒã§ããĒい**ことãĢæŗ¨æ„ã—ãĻくださいīŧ STEP 3 -> Check 慎重ãĒチェックとしãĻ、`check` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻã€åžŠæ—§ã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽ すずãĻãŒæ­Ŗã—ã„ã“ã¨ã‚’įĸēčĒã§ããžã™ã€‚ :snapraid -d NAME -a check ここで NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã§ã‚ã‚Šã€å‰ãŽäž‹ã§ã¯ `d1` ぎようãĒもぎです。 `-d` ãŠã‚ˆãŗ `-a` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€SnapRAIDãĢ**æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋ**をチェックし、 **すずãĻぎパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã‚’į„ĄčĻ–**するようãĢ指į¤ēしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯æ™‚é–“ãŒã‹ã‹ã‚Šãžã™ãŒã€éŽåēĻãĢ慎重でãĒい場合ぱキップできぞす。 STEP 4 -> Sync `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻ、ã‚ĸãƒŦã‚¤ã‚’æ–°ã—ã„ãƒ‡ã‚Ŗã‚šã‚¯ã¨å†åŒæœŸã—ãžã™ã€‚ :snapraid sync すずãĻが垊旧されãĻã„ã‚Œã°ã€ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯åŗåē§ãĢ厌äē†ã—ぞす。 Commands SnapRAIDは、æŦĄãŽã“とを可čƒŊãĢã™ã‚‹ã„ãã¤ã‹ãŽį°Ąå˜ãĒã‚ŗãƒžãƒŗãƒ‰ã‚’æäž›ã—ãžã™ã€‚ * ã‚ĸãƒŦイぎįŠļ態ぎæĻ‚čĻã‚’å‡ē力 -> `status` * ãƒ‡ã‚Ŗã‚šã‚¯ãŽåˆļåžĄ -> `smart`、`probe`、`up`、`down` * バックã‚ĸップ/ã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãŽäŊœæˆ -> `sync` * デãƒŧã‚ŋãŽåŽšæœŸįš„ãĒチェック -> `scrub` * 最垌ぎバックã‚ĸップ/ã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãŽåžŠå…ƒ -> `fix`。 ã‚ŗãƒžãƒŗãƒ‰ã¯**小文字**ã§č¨˜čŋ°ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ status ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎįŠļ態ぎæĻ‚čĻã‚’å‡ē力しぞす。 これãĢは、パãƒĒãƒ†ã‚ŖãŽæ–­į‰‡åŒ–ã€ãƒã‚§ãƒƒã‚¯ãĒã—ã§ãŽãƒ–ãƒ­ãƒƒã‚¯ãŽå¤ã•ã€ãŠã‚ˆãŗ ã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°ä¸­ãĢ遭遇したすずãĻãŽč¨˜éŒ˛ã•ã‚ŒãŸã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧãĢé–ĸã™ã‚‹æƒ…å ąãŒ åĢぞれぞす。 提į¤ēã•ã‚Œã‚‹æƒ…å ąã¯ã€æœ€åžŒãĢ `sync` ã‚’åŽŸčĄŒã—ãŸæ™‚į‚šãŽã‚‚ãŽã§ã™ã€‚ それäģĨé™ãŽå¤‰æ›´ã¯č€ƒæ…Žã•ã‚Œãžã›ã‚“ã€‚ ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ãŒæ¤œå‡ēされた場合、それらぎブロックį•ĒåˇãŒä¸€čĻ§čĄ¨į¤ēされぞす。 それらをäŋŽæ­Ŗã™ã‚‹ãĢは、`fix -e` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ ぞた、各ブロックが最垌ãĢ゚クナブぞたは同期された時期をį¤ēã™ã‚°ãƒŠãƒ•ã‚‚čĄ¨į¤ēされぞす。 ゚クナブされたブロックは `*` で、同期されたがぞだ゚クナブされãĻいãĒいブロックは `o` で į¤ēされぞす。 äŊ•も変更されぞせん。 smart ã‚ˇã‚šãƒ†ãƒ å†…ãŽã™ãšãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTãƒŦポãƒŧトをå‡ē力しぞす。 これãĢは、įŋŒåš´ãŽæ•…éšœįĸēįŽ‡ãŽæŽ¨åŽšå€¤ãŒåĢぞれãĻãŠã‚Šã€į–‘ã‚ã—ã„åąžæ€§ã‚’į¤ēã™ãƒ‡ã‚Ŗã‚šã‚¯ãŽ ãƒĄãƒŗãƒ†ãƒŠãƒŗã‚šä礿›ã‚’č¨ˆį”ģできぞす。 こぎįĸēįŽ‡æŽ¨åŽšã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTåąžæ€§ã‚’æŦĄãŽå ´æ‰€ã§åˆŠį”¨å¯čƒŊãĒBackblazeぎデãƒŧã‚ŋと ᛏé–ĸさせることで垗られぞす。 :https://www.backblaze.com/hard-drive-test-data.html SMARTãŒãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻã„ã‚‹ã¨å ąå‘Šã—ãŸå ´åˆã€ããŽãƒ‡ã‚Ŗã‚šã‚¯ãĢ寞しãĻ `FAIL` ぞたは `PREFAIL` が å‡ē力され、SnapRAIDはエナãƒŧをčŋ”しぞす。 こぎ場合、**ãƒ‡ã‚Ŗã‚šã‚¯ãŽåŗæ™‚ä礿›**がåŧˇãæŽ¨åĨ¨ã•れぞす。 そぎäģ–ぎ可čƒŊãĒ゚テãƒŧã‚ŋ゚文字列はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ logfail - 過åŽģãĢã€ä¸€éƒ¨ãŽåąžæ€§ãŒã—ãã„å€¤ã‚ˆã‚Šã‚‚äŊŽã‹ãŖãŸã€‚ logerr - デバイ゚ぎエナãƒŧログãĢエナãƒŧがåĢぞれãĻいる。 selferr - デバイ゚ぎã‚ģãƒĢフテ゚トログãĢエナãƒŧがåĢぞれãĻいる。 -v, --verbose ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻã„ã‚‹å ´åˆã€ã‚ˆã‚ŠčŠŗį´°ãĒįĩąč¨ˆåˆ†æžãŒæäž›ã•れぞす。 こぎ分析は、より多くぞたはより少ãĒいパãƒĒãƒ†ã‚ŖãŒåŋ…čĻã‹ãŠã†ã‹ã‚’æąē厚するぎãĢåŊšįĢ‹ãĄãžã™ã€‚ ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ `smartctl` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で `smartctl -a` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ ãƒ‡ãƒã‚¤ã‚šãŒæ­Ŗã—ãč‡Ē動検å‡ēされãĒã„å ´åˆã¯ã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで `smartctl` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã—ãĻã‚Ģ゚ã‚ŋãƒ ã‚ŗãƒžãƒŗãƒ‰ã‚’æŒ‡åŽšã§ããžã™ã€‚ äŊ•も変更されぞせん。 probe ã‚ˇã‚šãƒ†ãƒ å†…ãŽã™ãšãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽPOWERįŠļ態をå‡ē力しぞす。 `Standby` ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻいãĒã„ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚`Active` は ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻã„ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ `smartctl` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で `smartctl -n standby -i` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ ãƒ‡ãƒã‚¤ã‚šãŒæ­Ŗã—ãč‡Ē動検å‡ēされãĒã„å ´åˆã¯ã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで `smartctl` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã—ãĻã‚Ģ゚ã‚ŋãƒ ã‚ŗãƒžãƒŗãƒ‰ã‚’æŒ‡åŽšã§ããžã™ã€‚ äŊ•も変更されぞせん。 up ã‚ĸãƒŦイぎすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã‚šãƒ”ãƒŗã‚ĸップしぞす。 -d, --filter-disk ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į‰šåŽšãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋã‚’ã‚šãƒ”ãƒŗã‚ĸップできぞす。 すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŒæ™‚ãĢã‚šãƒ”ãƒŗã‚ĸップするãĢは、多くぎé›ģ力がåŋ…čĻã§ã™ã€‚ é›ģæēãŒãã‚ŒãĢč€ãˆã‚‰ã‚Œã‚‹ã“ã¨ã‚’įĸēčĒã—ãĻください。 äŊ•も変更されぞせん。 down ã‚ĸãƒŦイぎすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãžã™ã€‚ ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ `smartctl` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で `smartctl -s standby,now` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ -d, --filter-disk ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į‰šåŽšãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋã‚’ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã§ããžã™ã€‚ エナãƒŧ時ãĢč‡Ēå‹•įš„ãĢã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã™ã‚‹ãĢは、äģ–ぎäģģæ„ãŽã‚ŗãƒžãƒŗãƒ‰ã§ -s, --spin-down-on-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã§ããžã™ã€‚ã“ã‚Œã¯ã€ã‚¨ãƒŠãƒŧがį™ēį”Ÿã—ãŸã¨ããĢ手動で `down` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨åŒį­‰ã§ã™ã€‚ äŊ•も変更されぞせん。 diff 最垌ぎ `sync` äģĨ降ãĢ変更され、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã‚’å†č¨ˆįŽ—ã™ã‚‹åŋ…čĻãŒã‚ã‚‹ã™ãšãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを 一čĻ§čĄ¨į¤ēしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋã¯ãƒã‚§ãƒƒã‚¯ã›ãšã€ãƒ•ã‚Ąã‚¤ãƒĢぎã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ã‚ĩイã‚ē、 ãŠã‚ˆãŗinodeぎãŋをチェックしぞす。 変更されたすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを一čĻ§čĄ¨į¤ēした垌、変更ぎæĻ‚čĻãŒ æŦĄãŽã‚ˆã†ãĢグãƒĢãƒŧプ化されãĻ提į¤ēされぞす。 equal - 変更されãĻいãĒã„ãƒ•ã‚Ąã‚¤ãƒĢ。 added - äģĨ前は存在しãĒã‹ãŖãŸčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 removed - å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 updated - ã‚ĩイã‚ēぞたはã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒį•°ãĒã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ。これは、 å¤‰æ›´ã•ã‚ŒãŸã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ moved - åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽį•°ãĒã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 同じ名前、ã‚ĩイã‚ē、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ãŠã‚ˆãŗinodeã‚’æŒãĄãžã™ãŒã€ãƒ‡ã‚ŖãƒŦクトãƒĒが į•°ãĒã‚‹ã“ã¨ã§č­˜åˆĨされぞす。 copied - å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢãŒãžã å­˜åœ¨ã™ã‚‹ã€åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ãžãŸã¯åˆĨぎ ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 これらは、同じ名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’æŒã¤ã“ã¨ ãĢã‚ˆãŖãĻ識åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロぎ場合、名前だけでãĒくフãƒĢパ゚ ãŒä¸€č‡´ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ relocated - ã‚ĒãƒĒジナãƒĢがæļˆå¤ąã—ãŸã€åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ãžãŸã¯åˆĨãŽãƒ‡ã‚Ŗ ゚クãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 これらは、同じ名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’æŒã¤ã“ã¨ ãĢã‚ˆãŖãĻ識åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧãƒ­ãŽå ´åˆã€č­˜åˆĨするãĢはフãƒĢパ゚が ä¸€č‡´ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽ 'moved' ãƒ•ã‚Ąã‚¤ãƒĢã¨ã¯į•°ãĒり、再配įŊŽã•れた ãƒ•ã‚Ąã‚¤ãƒĢã¯į•°ãĒる inode ã‚’æŒãĄãžã™ã€‚ restored - inode ã¯į•°ãĒã‚‹ãŒã€ãƒ‡ã‚ŖãƒŦクトãƒĒ、名前、ã‚ĩイã‚ē、お ã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ。 これらは通常、削除された垌ãĢåžŠå…ƒã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢです。 `sync` がåŋ…čρãĒ場合、プロã‚ģ゚はデフりãƒĢトぎ0ではãĒく、ãƒĒã‚ŋãƒŧãƒŗã‚ŗãƒŧド2をčŋ”しぞす。 ãƒĒã‚ŋãƒŧãƒŗã‚ŗãƒŧド1は、一čˆŦįš„ãĒエナãƒŧįŠļ態ãĢäŊŋį”¨ã•ã‚Œãžã™ã€‚ äŊ•も変更されぞせん。 sync パãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’æ›´æ–°ã—ãžã™ã€‚ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎすずãĻãŽå¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢがčĒ­ãŋ取られ、 寞åŋœã™ã‚‹ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋが更新されぞす。 Ctrl+CをæŠŧすことでいつでもこぎプロã‚ģ゚を停æ­ĸでき、 æ—ĸãĢ厌äē†ã—たäŊœæĨ­ã‚’å¤ąã†ã“ã¨ã¯ã‚ã‚Šãžã›ã‚“ã€‚ æŦĄå›žãŽåŽŸčĄŒæ™‚ãĢは、`sync` プロã‚ģ゚は中断された場所から 再開されぞす。 プロã‚ģ゚中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€ 寞åŋœã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢã¯ãƒ‘ã‚šãŠã‚ˆãŗ/ぞたはinodeãĢã‚ˆãŖãĻ識åˆĨされ、ã‚ĩイã‚ēとã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĢã‚ˆãŖãĻ チェックされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēぞたはã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒį•°ãĒる場合、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã¯ãƒ•ã‚Ąã‚¤ãƒĢ全äŊ“で å†č¨ˆįŽ—ã•ã‚Œãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢãŒåŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§į§ģ動ぞたは名前が変更され、同じinodeがäŋæŒã•れãĻいる場合、 パãƒĒãƒ†ã‚Ŗã¯å†č¨ˆįŽ—ã•ã‚Œãžã›ã‚“ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢがåˆĨãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢį§ģ動された場合、パãƒĒãƒ†ã‚Ŗã¯å†č¨ˆįŽ—ã•ã‚Œãžã™ãŒã€ äģĨ前ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨæƒ…å ąã¯äŋæŒã•れぞす。 `content` ãƒ•ã‚Ąã‚¤ãƒĢと `parity` ãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 scrub ã‚ĸãƒŦイを゚クナブし、デãƒŧã‚ŋãŠã‚ˆãŗãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧを チェックしぞす。 1回ぎå‘ŧãŗå‡ēしごとãĢ、最垌ぎ10æ—Ĩ間でæ—ĸãĢ゚クナブされたデãƒŧã‚ŋを除いãĻ、 ã‚ĸãƒŦã‚¤ãŽį´„8%がチェックされぞす。 ã“ã‚Œã¯ã€é€ąãĢ1å›žã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°ã‚’åŽŸčĄŒã™ã‚‹ã¨ã€ã™ãšãĻぎデãƒŧã‚ŋが少ãĒくとも3か月ãĢ1回は ãƒã‚§ãƒƒã‚¯ã•ã‚Œã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ -p, --plan ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į•°ãĒã‚‹ã‚šã‚¯ãƒŠãƒ–ãƒ—ãƒŠãƒŗãžãŸã¯é‡ã‚’åŽšįžŠã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯äģĨ下を受けå…Ĩれぞす。 bad - ä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックを゚クナブしぞす。 new - ぞだ゚クナブされãĻいãĒい、同期されたばかりぎブロックを゚クナブしぞす。 full - すずãĻを゚クナブしぞす。 0-100 - 指厚されたパãƒŧã‚ģãƒŗãƒ†ãƒŧジぎブロックを゚クナブしぞす。 パãƒŧã‚ģãƒŗãƒ†ãƒŧジぎ量を指厚する場合、-o, --older-than ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ、 ブロックがおれくらいぎ古さであるåŋ…čĻãŒã‚ã‚‹ã‹ã‚’åŽšįžŠã™ã‚‹ã“ã¨ã‚‚ã§ããžã™ã€‚ 最も古いブロックが最初ãĢ゚クナブされ、最遊ãĒチェックがäŋč¨ŧされぞす。 ぞだ゚クナブされãĻいãĒい、同期されたばかりぎブロックぎãŋを゚クナブしたい場合は、 `-p new` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ ゚クナブ゚テãƒŧã‚ŋã‚šãŽčŠŗį´°ã‚’å–åž—ã™ã‚‹ãĢは、`status` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãžã™ã€‚ čĻ‹ã¤ã‹ãŖãŸã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧごとãĢ、寞åŋœã™ã‚‹ãƒ–ロックは `content` ãƒ•ã‚Ąã‚¤ãƒĢå†…ã§ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞす。 ã“ã‚Œã‚‰ãŽä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã¯ `status` で一čĻ§čĄ¨į¤ēされ、`fix -e` でäŋŽæ­Ŗã§ããžã™ã€‚ äŋŽæ­ŖåžŒã€æŦĄå›žãŽã‚šã‚¯ãƒŠãƒ–で再チェックされ、äŋŽæ­Ŗã•れãĻいると判明した場合、 ä¸č‰¯ãƒžãƒŧクは削除されぞす。 ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ãŽãŋを゚クナブするãĢは、`scrub -p bad` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ æœĒ同期ぎデãƒŧã‚ŋãĢã‚ˆãŖãĻåŧ•きčĩˇã“ã•ã‚ŒãŸå ąå‘Šã•ã‚ŒãŸã‚¨ãƒŠãƒŧをéŋけるためãĢ、 `scrub` は**同期された**ã‚ĸãƒŦイでぎãŋåŽŸčĄŒã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚¨ãƒŠãƒŧは ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧではãĒいとčĒč­˜ã•ã‚Œã€ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞせんが、 そぎようãĒエナãƒŧã¯ã‚ŗãƒžãƒŗãƒ‰ãŽå‡ēåŠ›ã§å ąå‘Šã•ã‚Œãžã™ã€‚ `content` ãƒ•ã‚Ąã‚¤ãƒĢは、各ブロックぎ最垌ぎチェック時åˆģã‚’æ›´æ–°ã—ã€ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ マãƒŧクするためãĢ変更されぞす。 `parity` ãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 fix すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŋŽæ­Ŗã—ぞす。 すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋは、最垌ぎ `sync` でäŋå­˜ã•ã‚ŒãŸã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆįŠļ態と 比čŧƒã•れぞす。 違いがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€äŋå­˜ã•ã‚ŒãŸã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãĢ**元ãĢæˆģされぞす**。 **č­Ļ告īŧ** `fix` ã‚ŗãƒžãƒŗãƒ‰ã¯ã€ã‚¨ãƒŠãƒŧã¨æ„å›ŗįš„ãĒ変更をåŒēåˆĨしぞせん。 ãƒ•ã‚Ąã‚¤ãƒĢぎ_įŠļ態を_最垌ぎ `sync` ãĢ**į„ĄæĄäģļãĢ元ãĢæˆģしぞす**。 äģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいãĒい場合、ã‚ĸãƒŦイ全äŊ“がå‡Ļį†ã•ã‚Œãžã™ã€‚ ãƒ•ã‚ŖãƒĢã‚ŋã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ、操äŊœã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽã‚ĩブã‚ģットを 選択しぞす。 `sync` ãŠã‚ˆãŗ `scrub` 中ãĢä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックぎãŋをäŋŽæ­Ŗã™ã‚‹ãĢは、 -e, --filter-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ äģ–ãŽãƒ•ã‚ŖãƒĢã‚ŋã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¨ã¯į•°ãĒり、これは最新ぎ `sync` äģĨ降ãĢ**変更されãĻいãĒい** ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋäŋŽæ­Ŗã‚’éŠį”¨ã—ãžã™ã€‚ SnapRAIDは、äŋŽæ­Ŗã§ããĒいすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎ名前を `.unrecoverable` æ‹Ąåŧĩ子を čŋŊ加しãĻ変更しぞす。 äŋŽæ­Ŗã™ã‚‹å‰ãĢ、ã‚ĸãƒŦイ全äŊ“ãŒã‚šã‚­ãƒŖãƒŗã•ã‚Œã€æœ€åžŒãŽ `sync` 操äŊœäģĨ降ãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢが čĻ‹ã¤ã‘ã‚‰ã‚Œãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢã¯ã€åå‰ã‚’į„ĄčĻ–ã—ãĻã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĢã‚ˆãŖãĻ識åˆĨされ、 åŋ…čρãĢåŋœã˜ãĻ垊旧プロã‚ģ゚でäŊŋį”¨ã•ã‚Œãžã™ã€‚ それらぎいくつかをã‚ĸãƒŦイ外ãĢį§ģ動した場合は、-i, --import ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ ã‚šã‚­ãƒŖãƒŗã™ã‚‹čŋŊåŠ ãŽãƒ‡ã‚ŖãƒŦクトãƒĒを指厚できぞす。 ãƒ•ã‚Ąã‚¤ãƒĢは**パ゚ãĢã‚ˆãŖãĻぎãŋ**識åˆĨされ、inodeãĢã‚ˆãŖãĻã¯č­˜åˆĨされぞせん。 `content` ãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 `parity` ãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 check すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋを検č¨ŧしぞす。 `fix` ぎようãĢ抟čƒŊしぞすが、垊旧を**ã‚ˇãƒŸãƒĨãƒŦãƒŧトするだけ**で、ã‚ĸãƒŦイãĢ**変更は書きčžŧぞれぞせん**。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€ä¸ģãĢ垊旧プロã‚ģ゚垌やそぎäģ–ãŽį‰šæŽŠãĒæĄäģļ下でぎ手動検č¨ŧを į›Žįš„ã¨ã—ãĻいぞす。 åŽšæœŸįš„ã§ã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたチェックãĢは、`scrub` をäŊŋį”¨ã—ãžã™ã€‚ -a, --audit-only ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ**ãƒãƒƒã‚ˇãƒĨぎãŋ**がチェックされ、 パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã¯į„ĄčĻ–ã•ã‚Œã‚‹ãŸã‚ã€ãƒã‚§ãƒƒã‚¯ãƒ—ãƒ­ã‚ģ゚が大嚅ãĢéĢ˜é€ŸåŒ–ã•ã‚Œãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢは**パ゚ãĢã‚ˆãŖãĻぎãŋ**識åˆĨされ、inodeãĢã‚ˆãŖãĻã¯č­˜åˆĨされぞせん。 äŊ•も変更されぞせん。 list 最垌ぎ `sync` ãŽæ™‚į‚šãŽã‚ĸãƒŦイãĢåĢぞれるすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを 一čĻ§čĄ¨į¤ēしぞす。 -v ぞたは --verbose をäŊŋį”¨ã™ã‚‹ã¨ã€ã‚ĩãƒ–į§’ãŽæ™‚é–“ã‚‚čĄ¨į¤ēされぞす。 äŊ•も変更されぞせん。 dup すずãĻãŽé‡č¤‡ãƒ•ã‚Ąã‚¤ãƒĢを一čĻ§čĄ¨į¤ēã—ãžã™ã€‚ãƒãƒƒã‚ˇãƒĨãŒä¸€č‡´ã™ã‚‹å ´åˆã€2ã¤ãŽãƒ•ã‚Ąã‚¤ãƒĢã¯į­‰ã—ã„ã¨čĻ‹ãĒされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋはčĒ­ãŋ取られず、äē‹å‰ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨぎãŋがäŊŋį”¨ã•ã‚Œãžã™ã€‚ äŊ•も変更されぞせん。 pool `pooling` ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎäģŽæƒŗãƒ“ãƒĨãƒŧを äŊœæˆãžãŸã¯æ›´æ–°ã—ぞす。 ãƒ•ã‚Ąã‚¤ãƒĢã¯ã‚ŗãƒ”ãƒŧã•ã‚Œãšã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’äŊŋį”¨ã—ãĻãƒĒãƒŗã‚¯ã•ã‚Œãžã™ã€‚ 更新時、æ—ĸ存ぎすずãĻãŽã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¨įŠēぎã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒは削除され、 ã‚ĸãƒŦイぎ新しいビãƒĨãƒŧãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚そぎäģ–ãŽé€šå¸¸ãŽãƒ•ã‚Ąã‚¤ãƒĢはそぎぞぞ掋されぞす。 プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒ外はäŊ•も変更されぞせん。 devices ã‚ĸãƒŦイでäŊŋį”¨ã•ã‚Œã‚‹äŊŽãƒŦベãƒĢデバイ゚をå‡ē力しぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€ã‚ĸãƒŦイ内ぎデバイ゚ぎé–ĸ逪äģ˜ã‘ã‚’čĄ¨į¤ēし、ä¸ģãĢ゚クãƒĒãƒ—ãƒˆã‚¤ãƒŗã‚ŋãƒŧフェイ゚を į›Žįš„ã¨ã—ãĻいぞす。 最初ぎ2つぎ列は、äŊŽãƒŦベãƒĢデバイ゚IDとパ゚です。 æŦĄãŽ2つぎ列は、é̘ãƒŦベãƒĢデバイ゚IDとパ゚です。 最垌ぎ列は、ã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ ãģとんおぎ場合、ã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ1つぎäŊŽãƒŦベãƒĢデバイ゚がありぞすが、 ã‚ˆã‚Šč¤‡é›‘ãĒ構成では、単一ぎã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ã§č¤‡æ•°ãŽäŊŽãƒŦベãƒĢデバイ゚が äŊŋį”¨ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šãžã™ã€‚ äŊ•も変更されぞせん。 touch ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロãĢč¨­åŽšã•ã‚ŒãĻいるすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢãĢ、äģģæ„ãŽã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’ č¨­åŽšã—ãžã™ã€‚ これãĢより、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒãģãŧ一意ãĢãĒã‚Šã€é‡č¤‡ãŽå¯čƒŊ性が減るため、 SnapRAIDがį§ģå‹•ãŠã‚ˆãŗã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢをčĒč­˜ã™ã‚‹čƒŊ力が向上しぞす。 ã‚ˆã‚Šå…ˇäŊ“įš„ãĢは、ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロでãĒい場合、į§ģå‹•ãžãŸã¯ã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢは、 名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒä¸€č‡´ã™ã‚‹å ´åˆãĢãã†ã§ã‚ã‚‹ã¨č­˜åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロぎ場合、フãƒĢパ゚、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŽã™ãšãĻが ä¸€č‡´ã™ã‚‹å ´åˆãĢぎãŋã‚ŗãƒ”ãƒŧとčĻ‹ãĒされぞす。 į§’į˛žåēĻぎã‚ŋイム゚ã‚ŋãƒŗãƒ—ã¯å¤‰æ›´ã•ã‚ŒãĒã„ãŸã‚ã€ãƒ•ã‚Ąã‚¤ãƒĢぎすずãĻぎæ—Ĩäģ˜ã¨æ™‚åˆģは äŋæŒã•れぞす。 rehash ã‚ĸãƒŦイ全äŊ“ぎãƒĒãƒãƒƒã‚ˇãƒĨã‚’ã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€äŊŋį”¨ã•ã‚Œã‚‹ãƒãƒƒã‚ˇãƒĨãŽį¨ŽéĄžã‚’å¤‰æ›´ã—ãžã™ã€‚ã“ã‚Œã¯é€šå¸¸ã€32ãƒ“ãƒƒãƒˆã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰ 64ãƒ“ãƒƒãƒˆã‚ˇã‚šãƒ†ãƒ ãĢã‚ĸップグãƒŦãƒŧドするときãĢ、MurmurHash3からよりéĢ˜é€ŸãĒSpookyHashãĢ 切りæ›ŋえるためãĢčĄŒã‚ã‚Œãžã™ã€‚ æ—ĸãĢ最遊ãĒãƒãƒƒã‚ˇãƒĨをäŊŋį”¨ã—ãĻã„ã‚‹å ´åˆã€ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯äŊ•もせず、ã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãŒä¸čĻã§ã‚ã‚‹ã“ã¨ã‚’ 通įŸĨしぞす。 ãƒĒãƒãƒƒã‚ˇãƒĨはすぐãĢã¯åŽŸčĄŒã•ã‚Œãšã€`sync` ãŠã‚ˆãŗ `scrub` ぎ間ãĢ垐々ãĢåŽŸčĄŒã•ã‚Œãžã™ã€‚ `status` をäŊŋį”¨ã—ãĻãƒĒãƒãƒƒã‚ˇãƒĨぎįŠļ態をįĸēčĒã§ããžã™ã€‚ ãƒĒãƒãƒƒã‚ˇãƒĨ中もSnapRAIDは厌全ãĒ抟čƒŊをįļ­æŒã—ぞすが、唯一ぎ䞋外としãĻ、 `dup` ã¯į•°ãĒã‚‹ãƒãƒƒã‚ˇãƒĨをäŊŋį”¨ã—ãĻã„ã‚‹é‡č¤‡ãƒ•ã‚Ąã‚¤ãƒĢを検å‡ēできぞせん。 locate パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãĢäŋå­˜ã•れãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを検į´ĸã—ãžã™ã€‚ä¸€č‡´ã™ã‚‹å„ãƒ•ã‚Ąã‚¤ãƒĢãĢついãĻ、 パãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢ内でぎäŊįŊŽã¨ã€ãã‚ŒãŒå æœ‰ã™ã‚‹ãƒ•ãƒŠã‚°ãƒĄãƒŗãƒˆãŽæ•°ã‚’å‡ē力しぞす。 -t, --tail ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ãƒ‘ãƒĒãƒ†ã‚ŖãŽæŒ‡åŽšã•ã‚ŒãŸæœĢ尞部分を占有する ãƒ•ã‚Ąã‚¤ãƒĢãĢ操äŊœã‚’åˆļ限できぞす。 ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢを再配įŊŽã—たい場合は、-W, --force-realloc-tail ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã§ããžã™ã€‚ 再配įŊŽãƒ—ロã‚ģã‚šä¸­ã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢはパãƒĒãƒ†ã‚ŖãĢã‚ˆãŖãĻäŋč­ˇã•れãĒいことãĢ æŗ¨æ„ã—ãĻください。 Options SnapRAIDãĢは、æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒã‚ã‚Šãžã™ã€‚ -c, --conf CONFIG äŊŋį”¨ã™ã‚‹æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。指厚されãĻいãĒい場合、Unixでは、存在すれば `/usr/local/etc/snapraid.conf` をäŊŋį”¨ã—ã€ãã‚ŒäģĨ外ぎ場合は `/etc/snapraid.conf` を äŊŋį”¨ã—ãžã™ã€‚ Windowsでは、`snapraid.exe` ã¨åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒãĢある `snapraid.conf` ãƒ•ã‚Ąã‚¤ãƒĢを äŊŋį”¨ã—ãžã™ã€‚ -f, --filter PATTERN `check` ãŠã‚ˆãŗ `fix` でå‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ 指厚されたパã‚ŋãƒŧãƒŗãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋがå‡Ļį†ã•ã‚Œãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ パã‚ŋãƒŧãƒŗä앿§˜ãŽčŠŗį´°ãĢついãĻは、PATTERNã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‚’å‚į…§ã—ãĻください。 Unixでは、グロブ文字をäŊŋį”¨ã™ã‚‹å ´åˆã¯åŧ•ᔍįŦĻã§å›˛ã‚€ã‚ˆã†ãĢしãĻください。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€`sync` ãŠã‚ˆãŗ `scrub` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ -d, --filter-disk NAME `check`、`fix`、`up`ã€ãŠã‚ˆãŗ `down` でå‡Ļį†ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯åã‚’æŒ‡åŽšã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ `parity`、`2-parity`、`3-parity` ãĒおぎ名前でパãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚‚æŒ‡åŽšã—ãĻ、 į‰šåŽšãŽãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãĢ操äŊœã‚’限厚できぞす。 č¤‡æ•°ãŽ --filter、--filter-diskã€ãŠã‚ˆãŗ --filter-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĩ„ãŋ合わせると、 すずãĻãŽãƒ•ã‚ŖãƒĢã‚ŋãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが選択されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check`、`fix`、`up`ã€ãŠã‚ˆãŗ `down` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€`sync` ãŠã‚ˆãŗ `scrub` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ -m, --filter-missing `check` ãŠã‚ˆãŗ `fix` でå‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ ã‚ĸãƒŦイから不čļŗãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎãŋがå‡Ļį†ã•ã‚Œãžã™ã€‚ `fix` ã¨ä¸€įˇ’ãĢäŊŋį”¨ã™ã‚‹ã¨ã€ã“ã‚Œã¯ `undelete` ã‚ŗãƒžãƒŗãƒ‰ã¨ã—ãĻ抟čƒŊしぞす。 č¤‡æ•°ãŽ --filter、--filter-diskã€ãŠã‚ˆãŗ --filter-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĩ„ãŋ合わせると、 すずãĻãŽãƒ•ã‚ŖãƒĢã‚ŋãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが選択されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€`sync` ãŠã‚ˆãŗ `scrub` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ -e, --filter-error `check` ãŠã‚ˆãŗ `fix` でエナãƒŧãŽã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをå‡Ļį†ã—ãžã™ã€‚ `status` で一čĻ§čĄ¨į¤ēされãĻいるようãĢ、`sync` ãŠã‚ˆãŗ `scrub` 中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたは å…Ĩå‡ē力エナãƒŧでマãƒŧã‚¯ã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢぎãŋをå‡Ļį†ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -p, --plan PERC|bad|new|full ã‚šã‚¯ãƒŠãƒ–ãƒ—ãƒŠãƒŗã‚’é¸æŠžã—ãžã™ã€‚PERCが0から100ぞでぎ数値である場合、 ゚クナブするブロックぎパãƒŧã‚ģãƒŗãƒ†ãƒŧジとしãĻč§Ŗé‡ˆã•ã‚Œãžã™ã€‚ パãƒŧã‚ģãƒŗãƒ†ãƒŧジぎäģŖã‚ã‚ŠãĢã€ãƒ—ãƒŠãƒŗã‚’æŒ‡åŽšã§ããžã™ã€‚ `bad` ã¯ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ã‚šã‚¯ãƒŠãƒ–ã—ã€`new` はぞだ゚クナブされãĻいãĒいブロックを゚クナブし、 `full` はすずãĻを゚クナブしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`scrub` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -o, --older-than DAYS `scrub` でå‡Ļį†ã™ã‚‹ã‚ĸãƒŦイぎ最も古い部分を選択しぞす。 DAYS は、ブロックが゚クナブされるためぎ最小įĩŒéŽæ—Ĩ数であり、デフりãƒĢトは10です。 ä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックは、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢé–ĸäŋ‚ãĒく常ãĢ゚クナブされぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`scrub` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -a, --audit-only `check` で、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをチェックせずãĢãƒ•ã‚Ąã‚¤ãƒĢãŽãƒãƒƒã‚ˇãƒĨを検č¨ŧしぞす。 ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋぎãŋぎチェックãĢé–ĸåŋƒãŒã‚る場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒã‚§ãƒƒã‚¯ãƒ—ãƒ­ã‚ģ゚を 大嚅ãĢéĢ˜é€ŸåŒ–ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -h, --pre-hash `sync` で、パãƒĒãƒ†ã‚Ŗč¨ˆįŽ—ãŽå‰ãŽčŋŊ加検č¨ŧぎためãĢ、すずãĻぎ新しいデãƒŧã‚ŋぎ äēˆå‚™ãƒãƒƒã‚ˇãƒĨ化フェãƒŧã‚ēã‚’åŽŸčĄŒã—ãžã™ã€‚ 通常、`sync` では、äēˆå‚™ãƒãƒƒã‚ˇãƒĨåŒ–ã¯čĄŒã‚ã‚Œãšã€æ–°ã—ã„ãƒ‡ãƒŧã‚ŋはパãƒĒãƒ†ã‚Ŗč¨ˆįŽ—ãŽį›´å‰ãĢ、 最初ãĢčĒ­ãŋ取られたときãĢãƒãƒƒã‚ˇãƒĨ化されぞす。 こぎプロã‚ģã‚šã¯ã€ã‚ˇã‚šãƒ†ãƒ ãŒé‡ã„č˛ čˇãŽä¸‹ãĢあり、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻおり、CPUが ビジãƒŧãĒときãĢį™ēį”Ÿã—ãžã™ã€‚ ã“ã‚Œã¯ãƒžã‚ˇãƒŗãĢã¨ãŖãĻæĨĩį̝ãĒįŠļ態であり、æŊœåœ¨įš„ãĒハãƒŧドã‚Ļェã‚ĸãŽå•éĄŒãŒã‚ã‚‹å ´åˆã€ デãƒŧã‚ŋãŒãžã ãƒãƒƒã‚ˇãƒĨ化されãĻいãĒいため、ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧが検å‡ēされãĒいぞぞãĢãĒる 可čƒŊ性がありぞす。 こぎãƒĒ゚クを回éŋするためãĢ、`pre-hash` ãƒĸãƒŧドを有劚ãĢしãĻ、すずãĻぎデãƒŧã‚ŋを2回čĒ­ãŋ取り、 そぎ整合性をįĸēäŋã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ã‚ĸãƒŦイ内でį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢも検č¨ŧしãĻ、į§ģ動操äŊœãŒæˆåŠŸã—ãŸã“ã¨ã‚’ įĸēčĒã—ã€åŋ…čρãĢåŋœã˜ãĻ、įļščĄŒã™ã‚‹å‰ãĢäŋŽæ­Ŗæ“äŊœã‚’åŽŸčĄŒã§ãã‚‹ã‚ˆã†ãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -i, --import DIR 最垌ぎ `sync` ぎ垌ãĢã‚ĸãƒŦã‚¤ã‹ã‚‰å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢã‚’ã€æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚ŖãƒŦクトãƒĒから ã‚¤ãƒŗãƒãƒŧトしぞす。 ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’ãžã æŒãŖãĻいる場合、それらは垊旧プロã‚ģ゚を攚善するためãĢ `check` ãŠã‚ˆãŗ `fix` でäŊŋį”¨ã§ããžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢは、ã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒをåĢめãĻčĒ­ãŋ取られ、名前ãĢé–ĸäŋ‚ãĒãč­˜åˆĨされぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -s, --spin-down-on-error エナãƒŧがį™ēį”Ÿã—ãŸå ´åˆã€éžã‚ŧロぎ゚テãƒŧã‚ŋã‚šã‚ŗãƒŧドでįĩ‚äē†ã™ã‚‹å‰ãĢã€įŽĄį†ã•ã‚ŒãĻいるすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãžã™ã€‚ã“ã‚ŒãĢより、中断された操äŊœåžŒãĢドナイブがã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãĒãžãžã‚šãƒ”ãƒŗã—įļšã‘、 不čρãĒį†ąãŽč“„įŠã¨é›ģ力æļˆč˛ģを回éŋするぎãĢåŊšįĢ‹ãĄãžã™ã€‚ ã‚ŗãƒžãƒŗãƒ‰ãŒå¤ąæ•—ã—ãŸå ´åˆã§ã‚‚ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒåŽ‰å…¨ãĢ停æ­ĸされるようãĢ、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ -w, --bw-limit RATE すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢグロãƒŧバãƒĢãĒ帯域嚅åˆļé™ã‚’éŠį”¨ã—ãžã™ã€‚RATE は 1į§’ã‚ãŸã‚ŠãŽãƒã‚¤ãƒˆæ•°ã§ã™ã€‚K、M、GãĒおぎ䚗数を指厚できぞす (例īŧš--bw-limit 1G)。 -t, --tail ã‚ĩイã‚ē ãƒ•ã‚Ąã‚¤ãƒĢãƒĒ゚トを、パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽæŒ‡åŽšã•ã‚ŒãŸæœĢå°žã‚ĩイã‚ēäģĨ下を äŊŋį”¨ã—ãĻいるもぎãĢåˆļ限しぞす。 K、M、G、T ãĒおぎ倍数をäŊŋį”¨ã§ããžã™īŧˆäž‹īŧš--tail 1Gīŧ‰ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`locate` ã‚ŗãƒžãƒŗãƒ‰ã¨ä¸€įˇ’ãĢäŊŋį”¨ã•ã‚ŒãŸå ´åˆãĢぎãŋ 有劚です。 -A, --stats čŋŊåŠ æƒ…å ąã‚’čĄ¨į¤ēã™ã‚‹æ‹Ąåŧĩ゚テãƒŧã‚ŋ゚ビãƒĨãƒŧを有劚ãĢしぞす。 į”ģéĸãĢは2ã¤ãŽã‚°ãƒŠãƒ•ãŒčĄ¨į¤ēされぞす。 æœ€åˆãŽã‚°ãƒŠãƒ•ã¯ã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒãƒƒãƒ•ã‚ĄãƒĒãƒŗã‚°ã•ã‚ŒãŸã‚šãƒˆãƒŠã‚¤ãƒ—ãŽæ•°ã¨ã€ããŽãƒ‡ã‚Ŗã‚šã‚¯ã§įžåœ¨ ã‚ĸクã‚ģ゚されãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ•ã‚Ąã‚¤ãƒĢパ゚をį¤ēã—ãžã™ã€‚é€šå¸¸ã€æœ€ã‚‚é…ã„ãƒ‡ã‚Ŗã‚šã‚¯ãĢは ãƒãƒƒãƒ•ã‚ĄãŒåˆŠį”¨ã§ããšã€ã“ã‚ŒãŒé”æˆå¯čƒŊãĒ最大帯域嚅をæąē厚しぞす。 2į•Ēį›ŽãŽã‚°ãƒŠãƒ•ã¯ã€éŽåŽģ100į§’é–“ãĢ垅抟ãĢč˛ģやされた時間ぎパãƒŧã‚ģãƒŗãƒ†ãƒŧジをį¤ēしぞす。 æœ€ã‚‚é…ã„ãƒ‡ã‚Ŗã‚šã‚¯ãŒåž…æŠŸæ™‚é–“ãŽãģとんおをåŧ•きčĩˇã“すとä爿ƒŗã•れ、äģ–ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯ ãƒãƒƒãƒ•ã‚ĄãƒĒãƒŗã‚°ã•ã‚ŒãŸã‚šãƒˆãƒŠã‚¤ãƒ—ã‚’äŊŋį”¨ã§ãã‚‹ãŸã‚ã€åž…æŠŸæ™‚é–“ãŒãģã¨ã‚“ãŠãžãŸã¯ãžãŖãŸããĒいはずです。 ã“ãŽã‚°ãƒŠãƒ•ã¯ã€ãƒãƒƒã‚ˇãƒĨč¨ˆįŽ—ã¨RAIDč¨ˆįŽ—ãĢč˛ģやされた垅抟時間もį¤ēしぞす。 すずãĻãŽč¨ˆįŽ—ã¯ãƒ‡ã‚Ŗã‚šã‚¯æ“äŊœã¨ä¸ĻčĄŒã—ãĻåŽŸčĄŒã•ã‚Œãžã™ã€‚ ã—ãŸãŒãŖãĻ、少ãĒくとも1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã§æ¸Ŧ厚可čƒŊãĒ垅抟時間がある限り、 CPUがワãƒŧクロãƒŧドãĢčŋŊいつくぎãĢ十分速いことをį¤ēしãĻいぞす。 -Z, --force-zero äģĨ前は非ã‚ŧãƒ­ã ãŖãŸã‚ĩイã‚ēãŽãƒ•ã‚Ąã‚¤ãƒĢをã‚ŧロで同期するという厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDがこぎようãĒįŠļ態を検å‡ēした場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、 įļščĄŒã‚’停æ­ĸしぞす。 これãĢã‚ˆã‚Šã€ã‚ˇã‚šãƒ†ãƒ ã‚¯ãƒŠãƒƒã‚ˇãƒĨ垌ãĢ一部ぎã‚ĸクã‚ģã‚šã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢが切り捨ãĻられたときãĢ、 ãã‚Œã‚’į°Ąå˜ãĢ検å‡ēできぞす。 これは、ext3/ext4ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã‚’äŊŋį”¨ã—ãŸLinuxでčĩˇã“りうるįŠļ態です。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -E, --force-empty å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢがすずãĻ不čļŗã—ãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŒæœŸã™ã‚‹ã¨ã„ã†åŽ‰å…¨ã§ãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDãŒã€å…ƒã€…ãƒ‡ã‚Ŗã‚šã‚¯ãĢ存在しãĻいたすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢが不čļŗã—ãĻいるか、 書き換えられãĻいることを検å‡ēした場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、 įļščĄŒã‚’停æ­ĸしぞす。 これãĢより、デãƒŧã‚ŋãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŒãƒžã‚Ļãƒŗãƒˆã•ã‚ŒãĻいãĒいときãĢã€ãã‚Œã‚’į°Ąå˜ãĢ 検å‡ēできぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -U, --force-uuid UUIDãŒå¤‰æ›´ã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ã¨ãŽåŒæœŸã€ãƒã‚§ãƒƒã‚¯ã€ãŠã‚ˆãŗäŋŽæ­Ŗã¨ã„う厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDãŒä¸€éƒ¨ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒUUIDを変更したことを検å‡ēした場合、 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、įļščĄŒã‚’停æ­ĸしぞす。 これãĢã‚ˆã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒé–“é•ãŖãŸãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆãĢマã‚Ļãƒŗãƒˆã•ã‚ŒãĻいるときãĢ、それを検å‡ēできぞす。 ただし、単一パãƒĒãƒ†ã‚Ŗã§ãŽå˜ä¸€ãŽUUIDå¤‰æ›´ã€ãŠã‚ˆãŗč¤‡æ•°ãŽãƒ‘ãƒĒãƒ†ã‚Ŗã§ãŽã‚ˆã‚Šå¤šããŽUUID変更は č¨ąå¯ã•ã‚ŒãĻいぞす。これは、垊旧垌ãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’ä礿›ã™ã‚‹ã¨ããŽé€šå¸¸ãŽã‚ąãƒŧ゚であるためです。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync`、`check`、ぞたは `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -D, --force-device ã‚ĸクã‚ģ゚できãĒã„ãƒ‡ã‚Ŗã‚šã‚¯ã€ãžãŸã¯åŒã˜į‰Šį†ãƒ‡ãƒã‚¤ã‚šä¸ŠãŽãƒ‡ã‚Ŗã‚šã‚¯ã¨ãŽäŋŽæ­Ŗã¨ã„う厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 たとえば、2台ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚’å¤ąã„ã€æœ€åˆãŽ1台だけを垊旧するためぎäēˆå‚™ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚る場合、 2į•Ēį›ŽãŽã‚ĸクã‚ģ゚できãĒã„ãƒ‡ã‚Ŗã‚šã‚¯ã‚’į„ĄčĻ–ã§ããžã™ã€‚ ぞたは、æ—ĸãĢ**äŊŋį”¨ã•ã‚ŒãĻいる**ãƒ‡ã‚Ŗã‚šã‚¯ãĢ掋されたįŠēき厚量ãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’åžŠæ—§ã—ãŸã„å ´åˆã€ åŒã˜į‰Šį†ãƒ‡ãƒã‚¤ã‚šã‚’å…ąæœ‰ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -N, --force-nocopy `sync`、`check`ã€ãŠã‚ˆãŗ `fix` ã§ã€ã‚ŗãƒ”ãƒŧ検å‡ēヒãƒĨãƒŧãƒĒã‚šãƒ†ã‚Ŗãƒƒã‚¯ã‚’į„ĄåŠšãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒãĒい場合、SnapRAIDは、名前、ã‚ĩイã‚ē、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĒãŠãŽåŒã˜åąžæ€§ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢが、 同じデãƒŧã‚ŋã‚’æŒã¤ã‚ŗãƒ”ãƒŧであるとčĻ‹ãĒしぞす。 これãĢã‚ˆã‚Šã€ã‚ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰åˆĨãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ŗãƒ”ãƒŧぞたはį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢã‚’č­˜åˆĨし、 æ—ĸãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨæƒ…å ąã‚’å†åˆŠį”¨ã—ãĻ、ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧを検å‡ēしたり、不čļŗã—ãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを 垊旧したりできぞす。 ぞれãĢ、こぎ動äŊœãŒčĒ¤æ¤œå‡ēã‚„ã€å¤šããŽãƒãƒƒã‚ˇãƒĨ検č¨ŧãĢよるプロã‚ģ゚ぎ遅åģļãĢつãĒがる可čƒŊ性があり、 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ããŽã‚ˆã†ãĒå•éĄŒã‚’č§Ŗæąēできぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync`、`check`ã€ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -F, --force-full `sync` で、パãƒĒãƒ†ã‚ŖãŽåŽŒå…¨ãĒå†č¨ˆįŽ—ã‚’åŧˇåˆļしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€æ–°ã—ã„ãƒ‘ãƒĒãƒ†ã‚ŖãƒŦベãƒĢをčŋŊ加する場合、ぞたはより新しいパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŊŋį”¨ã—ãĻ å¤ã„ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢæˆģした場合ãĢäŊŋį”¨ã§ããžã™ã€‚ パãƒĒãƒ†ã‚Ŗã‚’æœ€åˆã‹ã‚‰å†äŊœæˆã™ã‚‹äģŖã‚ã‚ŠãĢ、これãĢã‚ˆã‚Šã€ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢå­˜åœ¨ã™ã‚‹ãƒãƒƒã‚ˇãƒĨを å†åˆŠį”¨ã—ãĻデãƒŧã‚ŋを検č¨ŧし、æ—ĸ存ぎパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŊŋį”¨ã—ãĻ `sync` プロã‚ģ゚中ãĢデãƒŧã‚ŋäŋč­ˇã‚’ įļ­æŒã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -R, --force-realloc `sync` ã§ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ厌全ãĒå†å‰˛ã‚ŠåŊ“ãĻとパãƒĒãƒ†ã‚ŖãŽå†æ§‹į¯‰ã‚’åŧˇåˆļしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢå­˜åœ¨ã™ã‚‹ãƒãƒƒã‚ˇãƒĨã‚’å†åˆŠį”¨ã—ãĻデãƒŧã‚ŋを検č¨ŧしãĒがら、 æ–­į‰‡åŒ–ã‚’å‰Šé™¤ã—ãĻ、すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを厌全ãĢå†å‰˛ã‚ŠåŊ“ãĻするためãĢäŊŋį”¨ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、äŊŋį”¨ã—ãĒいことをåŧˇã お勧めしぞす。 `sync` 操äŊœä¸­ãĢデãƒŧã‚ŋäŋč­ˇã¯ã‚りぞせん。 -W, --force-realloc-tail ã‚ĩイã‚ē -R, --force-realloc と同様ãĢ動äŊœã—ぞすが、各パãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢぎ 指厚されたæœĢ尞部分īŧˆæœ€åžŒãŽã€Œã‚ĩイã‚ē」バイトīŧ‰ãĢåˆļ限されぞす。 įžåœ¨ããŽæœĢå°žã‚ģã‚¯ã‚ˇãƒ§ãƒŗãĢäŋå­˜ã•れãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãƒ•ãƒŠã‚°ãƒĄãƒŗãƒˆ/ブロックぎ 再配įŊŽīŧˆį§ģ動īŧ‰ã‚’åŧˇåˆļし、įŠēき゚ペãƒŧ゚があるパãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢ内ぎ äģģæ„ãŽå ´æ‰€īŧˆæ—ĸ存ぎホãƒŧãƒĢをåĢむīŧ‰ãĢ配įŊŽã§ãã‚‹ã‚ˆã†ãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŽä¸ģãĒį›Žįš„ã¯ã€ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§ãŽã‚ĩイã‚ēを į¸Žå°ã™ã‚‹ã“ã¨ã§ã™ã€‚ 再配įŊŽãĢã‚ˆãŖãĻæœĢå°žã‚ģã‚¯ã‚ˇãƒ§ãƒŗå…¨äŊ“ãŒæ­Ŗå¸¸ãĢクãƒĒã‚ĸされた場合 īŧˆãã‚Œã‚’äŊŋį”¨ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ãŒæŽ‹ãŖãĻいãĒい場合īŧ‰ã€ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢは åˆ‡ã‚ŠčŠ°ã‚ã‚‰ã‚Œã€æœĒäŊŋį”¨ãŽæœĢ尞゚ペãƒŧ゚が回収されぞす。 K、M、G、T ãĒおぎ倍数をäŊŋį”¨ã§ããžã™īŧˆäž‹īŧš --force-realloc-tail 1Gīŧ‰ã€‚ locate -t, --tail をäŊŋį”¨ã—ãĻ、åŊąéŸŋã‚’å—ã‘ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをäē‹å‰ãĢ įŸĨることができぞす。 č­Ļ告īŧ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧãƒˆå°‚į”¨ã§ã‚ã‚Šã€äŊŋį”¨ã—ãĒいことが åŧˇãæŽ¨åĨ¨ã•れぞす。 åŊąéŸŋã‚’å—ã‘ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãĢついãĻは、`sync` 操äŊœä¸­ãĢデãƒŧã‚ŋäŋč­ˇã¯ čĄŒã‚ã‚Œãžã›ã‚“ã€‚ -l, --log FILE čŠŗį´°ãĒãƒ­ã‚°ã‚’æŒ‡åŽšã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãĢ書きčžŧãŋぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいãĒい場合、ä爿œŸã—ãĒいエナãƒŧがį”ģéĸãĢå‡ē力され、 多くぎエナãƒŧがį™ēį”Ÿã—ãŸå ´åˆãĢ過剰ãĒå‡ē力ãĢãĒる可čƒŊ性がありぞす。 -l, --log が指厚されãĻいる場合、SnapRAIDが停æ­ĸする原因とãĒã‚‹č‡´å‘Ŋįš„ãĒエナãƒŧぎãŋが į”ģéĸãĢå‡ē力されぞす。 パ゚が `>>` ã§å§‹ãžã‚‹å ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢはčŋŊ記ãƒĸãƒŧドで開かれぞす。 名前ãĢ `%D` と `%T` がå‡ēįžã™ã‚‹ã¨ã€ãã‚Œãžã‚ŒYYYYMMDDとHHMMSSぎåŊĸåŧã§ æ—Ĩäģ˜ã¨æ™‚åˆģãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚Windowsãƒãƒƒãƒãƒ•ã‚Ąã‚¤ãƒĢでは、`%` 文字を 2倍ãĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚äž‹īŧšresult-%%D.log。`>>` をäŊŋį”¨ã™ã‚‹ãĢは、 名前をåŧ•ᔍįŦĻã§å›˛ã‚€åŋ…čĻãŒã‚ã‚Šãžã™ã€‚äž‹īŧš`">>result.log"`。 ログを標æē–å‡ē力ぞたは標æē–エナãƒŧãĢå‡ē力するãĢは、それぞれ `">&1"` ãŠã‚ˆãŗ `">&2"` を äŊŋį”¨ã§ããžã™ã€‚ ログã‚ŋグぎčĒŦ明ãĢついãĻは、snapraid_log.txtãƒ•ã‚Ąã‚¤ãƒĢぞたはmanペãƒŧã‚¸ã‚’å‚į…§ã—ãĻください。 -L, --error-limit NUMBER åŽŸčĄŒã‚’åœæ­ĸする前ぎ新しいエナãƒŧåˆļé™ã‚’č¨­åŽšã—ãžã™ã€‚ デフりãƒĢトでは、SnapRAIDは100をčļ…えるå…Ĩå‡ē力エナãƒŧãĢ遭遇した場合ãĢ停æ­ĸしぞす。 ã“ã‚Œã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻいる可čƒŊ性がéĢ˜ã„ã“ã¨ã‚’į¤ēしãĻいぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ `sync` と `scrub` ãĢåŊąéŸŋã—ã€æœ€åˆãŽä¸€é€ŖãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚¨ãƒŠãƒŧぎ垌ãĢ įļščĄŒã—ãĻ操äŊœã‚’åތäē†ã—ã‚ˆã†ã¨ã™ã‚‹ã“ã¨ãŒč¨ąå¯ã•ã‚Œãžã™ã€‚ ただし、`check` と `fix` は常ãĢ最初ぎエナãƒŧで停æ­ĸしぞす。 -S, --start BLKSTART 指厚されたブロックį•Ēåˇã‹ã‚‰å‡Ļį†ã‚’é–‹å§‹ã—ãžã™ã€‚ ã“ã‚Œã¯ã€į ´æã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆãĢį‰šåŽšãŽãƒ–ãƒ­ãƒƒã‚¯ã‚’å†čŠĻčĄŒã—ãĻチェックぞたはäŋŽæ­Ŗã™ã‚‹ãŽãĢ åŊšįĢ‹ãĄãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ä¸ģãĢé̘åēĻãĒæ‰‹å‹•åžŠæ—§ã‚’į›Žįš„ã¨ã—ãĻいぞす。 -B, --count BLKCOUNT 指厚された数ぎブロックぎãŋをå‡Ļį†ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ä¸ģãĢé̘åēĻãĒæ‰‹å‹•åžŠæ—§ã‚’į›Žįš„ã¨ã—ãĻいぞす。 -C, --gen-conf CONTENT æ—ĸå­˜ãŽã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢからダミãƒŧãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã‚’į”Ÿæˆã—ãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢは標æē–å‡ē力ãĢ書きčžŧぞれ、æ—ĸå­˜ãŽãƒ•ã‚Ąã‚¤ãƒĢを上書きしぞせん。 ã“ãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢãĢã¯ã€ã‚ˇã‚šãƒ†ãƒ å…¨äŊ“ã‚’å¤ąãŖãŸå ´åˆãĢãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’ å†æ§‹į¯‰ã™ã‚‹ãŸã‚ãĢåŋ…čρãĒæƒ…å ąã‚‚åĢぞれãĻいぞす。 -v, --verbose į”ģéĸãĢã‚ˆã‚Šå¤šããŽæƒ…å ąã‚’å‡ē力しぞす。 1å›žæŒ‡åŽšã™ã‚‹ã¨ã€é™¤å¤–ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢとčŋŊ加ぎįĩąč¨ˆãŒå‡ē力されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒ­ã‚°ãƒ•ã‚Ąã‚¤ãƒĢãĢはåŊąéŸŋしぞせん。 -q, --quiet į”ģéĸãĢå‡ēåŠ›ã•ã‚Œã‚‹æƒ…å ąã‚’æ¸›ã‚‰ã—ãžã™ã€‚ 1回指厚すると、プログãƒŦ゚バãƒŧが削除されぞす。2å›žæŒ‡åŽšã™ã‚‹ã¨ã€åŽŸčĄŒä¸­ãŽæ“äŊœãŒå‰Šé™¤ã•れぞす。 3å›žæŒ‡åŽšã™ã‚‹ã¨ã€æƒ…å ąãƒĄãƒƒã‚ģãƒŧジが削除されぞす。4回指厚すると、゚テãƒŧã‚ŋã‚šãƒĄãƒƒã‚ģãƒŧジが削除されぞす。 致å‘Ŋįš„ãĒエナãƒŧは常ãĢį”ģéĸãĢå‡ē力されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒ­ã‚°ãƒ•ã‚Ąã‚¤ãƒĢãĢはåŊąéŸŋしぞせん。 -H, --help įŸ­ã„ãƒ˜ãƒĢプį”ģéĸをå‡ē力しぞす。 -V, --version プログナムぎバãƒŧã‚¸ãƒ§ãƒŗã‚’å‡ē力しぞす。 Configuration SnapRAIDã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎ場所とパãƒĒãƒ†ã‚Ŗæƒ…å ąãŽäŋå­˜å ´æ‰€ã‚’įŸĨるためãĢã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを åŋ…čĻã¨ã—ãžã™ã€‚ Unixでは、存在すれば `/usr/local/etc/snapraid.conf` をäŊŋį”¨ã—ã€ãã‚ŒäģĨ外ぎ場合は `/etc/snapraid.conf` をäŊŋį”¨ã—ãžã™ã€‚ Windowsでは、`snapraid.exe` ã¨åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒãĢある `snapraid.conf` ãƒ•ã‚Ąã‚¤ãƒĢを äŊŋį”¨ã—ãžã™ã€‚ æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’åĢめるåŋ…čĻãŒã‚ã‚Šãžã™īŧˆå¤§æ–‡å­—と小文字をåŒēåˆĨしぞすīŧ‰ã€‚ parity FILE [,FILE] ... パãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’åŽšįžŠã—ãžã™ã€‚ パãƒĒãƒ†ã‚Ŗã¯ã€RAID5と同様ãĢã€å˜ä¸€ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰ãŽäŋč­ˇã‚’有劚ãĢしぞす。 č¤‡æ•°ãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’æŒ‡åŽšã§ãã€ãã‚Œã‚‰ã¯į•°ãĒã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢ存在するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢがそれäģĨä¸Šæˆé•ˇã§ããĒくãĒると、æŦĄãŽãƒ•ã‚Ąã‚¤ãƒĢがäŊŋį”¨ã•ã‚Œãžã™ã€‚ åˆŠį”¨å¯čƒŊãĒįˇåŽšé‡ã¯ã€ã‚ĸãƒŦイ内ぎ**最大ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯**と少ãĒくとも同じ大きさでãĒければãĒりぞせん。 垌でčŋŊ加ぎパãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加することはできぞすが、 それらをä¸Ļずæ›ŋえたり削除したりすることはできぞせん。 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢäēˆį´„しãĻãŠãã“ã¨ã§ã€ãã‚Œã‚‰ãŒæ–­į‰‡åŒ–ã•ã‚Œã‚‹ãŽã‚’é˜˛ãŽã€ パフりãƒŧãƒžãƒŗã‚šã‚’å‘ä¸Šã•ã›ãžã™ã€‚ Windowsでは、フãƒĢãƒ‡ã‚Ŗã‚šã‚¯ãĢé–ĸするč­Ļ告をéŋけるためãĢã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãĢ256 MBがæœĒäŊŋį”¨ã§ 掋されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯åŋ…須であり、1回ぎãŋäŊŋį”¨ã§ããžã™ã€‚ (2,3,4,5,6)-parity FILE [,FILE] ... čŋŊ加ぎパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’åŽšįžŠã—ãžã™ã€‚ 指厚されたパãƒĒãƒ†ã‚ŖãƒŦベãƒĢごとãĢ、1つぎčŋŊ加ぎäŋč­ˇãƒŦベãƒĢが有劚ãĢãĒりぞす。 * 2-parity は RAID6 デãƒĨã‚ĸãƒĢパãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 3-parity は トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 4-parity は クã‚ĸッドīŧˆ4つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 5-parity は ãƒšãƒŗã‚ŋīŧˆ5つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 6-parity は ヘキã‚ĩīŧˆ6つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 各パãƒĒãƒ†ã‚ŖãƒŦベãƒĢãĢは、äģĨ前ぎすずãĻぎパãƒĒãƒ†ã‚ŖãƒŦベãƒĢが存在するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ `parity` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¨åŒã˜č€ƒæ…Žäē‹é …ãŒéŠį”¨ã•ã‚Œãžã™ã€‚ これらぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã‚ã‚Šã€1回ぎãŋäŊŋį”¨ã§ããžã™ã€‚ z-parity FILE [,FILE] ... トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’äŋå­˜ã™ã‚‹ãŸã‚ãŽäģŖæ›ŋãƒ•ã‚Ąã‚¤ãƒĢとフりãƒŧãƒžãƒƒãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ `3-parity` ぎäģŖæ›ŋであり、ä¸ģãĢARMやSSSE3å‘Ŋäģ¤ã‚ģットをã‚ĩポãƒŧトしãĻいãĒい AMD Phenom、Athlon、OpteronãĒおぎロãƒŧã‚¨ãƒŗãƒ‰CPUã‚’å¯žčąĄã¨ã—ãĻいぞす。 こぎようãĒå ´åˆã€ã‚ˆã‚Šč‰¯ã„ãƒ‘ãƒ•ã‚Šãƒŧãƒžãƒŗã‚šã‚’æäž›ã—ãžã™ã€‚ こぎフりãƒŧマットは、ZFS RAIDZ3でäŊŋį”¨ã•ã‚Œã‚‹ã‚‚ãŽã¨äŧŧãĻいぞすが、よりéĢ˜é€Ÿã§ã™ã€‚ ZFSと同様ãĢ、トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’čļ…えãĻは抟čƒŊしぞせん。 `3-parity` をäŊŋį”¨ã—ãĻいる場合、パフりãƒŧãƒžãƒŗã‚šå‘ä¸ŠãŽãŸã‚ãĢ `z-parity` フりãƒŧマットぎ äŊŋį”¨ãŒæŽ¨åĨ¨ã•れる場合はč­Ļå‘ŠãŒčĄ¨į¤ēされぞす。 æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã‚’į›Žįš„ãŽ `z-parity` ぞたは `3-parity` ãƒ•ã‚Ąã‚¤ãƒĢでčĒŋ整し、 `fix` をäŊŋį”¨ã—ãĻ再äŊœæˆã™ã‚‹ã“とで、あるフりãƒŧマットからåˆĨぎフりãƒŧマットãĢ 変換することが可čƒŊです。 content FILE ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイãĢ存在するすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¨ãƒã‚§ãƒƒã‚¯ã‚ĩムをäŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを åŽšįžŠã—ãžã™ã€‚ デãƒŧã‚ŋ、パãƒĒãƒ†ã‚Ŗã€ãžãŸã¯ããŽäģ–ãŽåˆŠį”¨å¯čƒŊãĒãƒ‡ã‚Ŗã‚šã‚¯ãĢ配įŊŽã§ããžã™ã€‚ デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢは `sync` プロã‚ģ゚からč‡Ēå‹•įš„ãĢ 除外されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯åŋ…é ˆã§ã‚ã‚Šã€åŒã˜ãƒ•ã‚Ąã‚¤ãƒĢã‚’č¤‡æ•°ã‚ŗãƒ”ãƒŧäŋå­˜ã™ã‚‹ãŸã‚ãĢč¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ äŊŋį”¨ã™ã‚‹ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ**少ãĒくとも1ã¤ãŽã‚ŗãƒ”ãƒŧ**と、さらãĢ**1ã¤ãŽã‚ŗãƒ”ãƒŧ**を äŋå­˜ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚čŋŊåŠ ãŽã‚ŗãƒ”ãƒŧをäŊŋį”¨ã—ãĻã‚‚åŽŗã¯ã‚ã‚Šãžã›ã‚“ã€‚ data NAME DIR ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã¨ãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‚’č­˜åˆĨするためãĢäŊŋį”¨ã•ã‚Œã€**一意である**åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ DIR ã¯ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽ**マã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆ**です。 NAME をå›ē厚したぞぞãĢしãĻおけば、åŋ…čρãĢåŋœã˜ãĻマã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’å¤‰æ›´ã§ããžã™ã€‚ ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ1つぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§į›´æŽĨ NAME を変更しãĻから `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã™ã‚‹ã“ã¨ã§ã€ åžŒã§ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã‚’å¤‰æ›´ã§ããžã™ã€‚ 名前変更ぎ場合、é–ĸ逪äģ˜ã‘ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽäŋå­˜ã•れたUUIDをäŊŋį”¨ã—ãĻčĄŒã‚ã‚Œãžã™ã€‚ extra NAME DIR `smart` ãŠã‚ˆãŗ `probe` ã‚ŗãƒžãƒŗãƒ‰ã§į›ŖčĻ–ã™ã‚‹čŋŊåŠ ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã¨ãƒžã‚Ļ ãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ これは、ブãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ãĒお、ã‚ĸãƒŦイぎ一部ではãĒã„ãŒã‚ˇã‚šãƒ†ãƒ ãŽæŠŸčƒŊãĢåŋ… čρãĒãƒ‡ã‚Ŗã‚šã‚¯ã‚’į›ŖčĻ–ã™ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯å¸¸ãĢ回čģĸしãĻいることが期垅されるため、`up` およ ãŗ `down` ã‚ŗãƒžãƒŗãƒ‰ãŽåŊąéŸŋを受けãĒいことãĢæŗ¨æ„ã—ãĻください。 nohidden すずãĻãŽéš ã—ãƒ•ã‚Ąã‚¤ãƒĢã¨ãƒ‡ã‚ŖãƒŦクトãƒĒを除外しぞす。 Unixã§ã¯ã€éš ã—ãƒ•ã‚Ąã‚¤ãƒĢは `.` ã§å§‹ãžã‚‹ãƒ•ã‚Ąã‚¤ãƒĢです。 Windowsã§ã¯ã€éš ã—åąžæ€§ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢです。 exclude/include PATTERN syncプロã‚ģ゚で除外ぞたはåĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯ãƒ‡ã‚ŖãƒŦクトãƒĒぎパã‚ŋãƒŧãƒŗã‚’åŽšįžŠã—ãžã™ã€‚ すずãĻぎパã‚ŋãƒŧãƒŗã¯æŒ‡åŽšã•ã‚ŒãŸé †åēã§å‡Ļį†ã•ã‚Œãžã™ã€‚ ä¸€č‡´ã™ã‚‹æœ€åˆãŽãƒ‘ã‚ŋãƒŧãƒŗãŒ `exclude` ãŽå ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢは除外されぞす。 `include` ãŽå ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢはåĢぞれぞす。 パã‚ŋãƒŧãƒŗãŒä¸€č‡´ã—ãĒい場合、最垌ãĢ指厚されたパã‚ŋãƒŧãƒŗãŒ `include` ãŽå ´åˆã¯ãƒ•ã‚Ąã‚¤ãƒĢは除外され、 `exclude` ぎ場合はåĢぞれぞす。 パã‚ŋãƒŧãƒŗä앿§˜ãŽčŠŗį´°ãĢついãĻは、PATTERNã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‚’å‚į…§ã—ãĻください。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ blocksize SIZE_IN_KIBIBYTES パãƒĒãƒ†ã‚ŖãŽåŸēæœŦブロックã‚ĩイã‚ēをキビバイト単äŊã§åŽšįžŠã—ãžã™ã€‚ 1キビバイトは1024バイトです。 デフりãƒĢトぎブロックã‚ĩイã‚ēは256であり、ãģとんおぎ場合ãĢ抟čƒŊするはずです。 **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、こぎ値を変更しãĒいことをåŧˇã お勧めしぞす。äģŠåžŒã“ぎ値を変更するãĢは、パãƒĒãƒ†ã‚Ŗå…¨äŊ“ã‚’**再äŊœæˆ**するåŋ…čĻãŒã‚ã‚Šãžã™īŧ į•°ãĒるブロックã‚ĩイã‚ēをäŊŋį”¨ã™ã‚‹į†į”ąãŽ1ã¤ã¯ã€æ•°į™žä¸‡ãŽã‚Ēãƒŧダãƒŧぎ**多くぎ小さãĒãƒ•ã‚Ąã‚¤ãƒĢ**を æŒãŖãĻいる場合です。 ãƒ•ã‚Ąã‚¤ãƒĢごとãĢã€ãŸã¨ãˆæ•°ãƒã‚¤ãƒˆã§ã‚ãŖãĻも、パãƒĒãƒ†ã‚ŖãŽ**ブロック全äŊ“**ãŒå‰˛ã‚ŠåŊ“ãĻられ、 ãƒ•ã‚Ąã‚¤ãƒĢが多いと、これãĢより**かãĒりぎæœĒäŊŋį”¨ãƒ‘ãƒĒãƒ†ã‚Ŗã‚šãƒšãƒŧ゚**がį™ēį”Ÿã™ã‚‹å¯čƒŊ性がありぞす。 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŽŒå…¨ãĢ埋めると、デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãĢãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加することは**č¨ąå¯ã•ã‚Œãžã›ã‚“**。 ただし、æĩĒč˛ģされたパãƒĒãƒ†ã‚Ŗã¯ãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯é–“ã§č“„įŠã•ã‚Œãžã›ã‚“ã€‚ãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽå¤šæ•°ãŽãƒ•ã‚Ąã‚¤ãƒĢから į”Ÿã˜ã‚‹æĩĒč˛ģ゚ペãƒŧ゚は、**そぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽãƒ‡ãƒŧã‚ŋ量**ぎãŋをåˆļ限し、äģ–ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãĢは åŊąéŸŋしぞせん。 æĻ‚įŽ—ã¨ã—ãĻã€ãƒ•ã‚Ąã‚¤ãƒĢごとãĢブロックã‚ĩイã‚ēぎ半分がæĩĒč˛ģされるとäģŽåŽšã§ããžã™ã€‚ たとえば、100,000ãƒ•ã‚Ąã‚¤ãƒĢと256 KiBぎブロックã‚ĩイã‚ēがある場合、12.8 GBぎパãƒĒãƒ†ã‚ŖãŒæĩĒč˛ģされ、 これãĢよりデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§12.8 GB少ãĒい゚ペãƒŧã‚šã—ã‹åˆŠį”¨ã§ããĒくãĒる可čƒŊ性がありぞす。 `status` をäŊŋį”¨ã—ãĻã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽæĩĒč˛ģ゚ペãƒŧ゚ぎ量をįĸēčĒã§ããžã™ã€‚ これは、デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢ**įŠēき**としãĻ掋すåŋ…čĻãŒã‚ã‚‹ã€ãžãŸã¯ã‚ĸãƒŦイãĢåĢぞれãĒã„ãƒ•ã‚Ąã‚¤ãƒĢãĢ äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚‹ã‚šãƒšãƒŧ゚ぎ量です。 ã“ãŽå€¤ãŒč˛ ãŽå ´åˆã€ãƒ‘ãƒĒãƒ†ã‚ŖãŒæē€æ¯ãĢčŋ‘ãĨいãĻã„ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ã€ãžã æĩĒč˛ģできる゚ペãƒŧ゚を čĄ¨ã—ãžã™ã€‚ ã“ãŽå•éĄŒã‚’å›žéŋするためãĢ、パãƒĒãƒ†ã‚ŖãĢより大きãĒパãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã§ããžã™ã€‚ たとえば、パãƒĒãƒ†ã‚Ŗãƒ‘ãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗãŒãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚ˆã‚Šã‚‚12.8 GB大きい場合、 各デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã§æœ€å¤§100,000ãƒ•ã‚Ąã‚¤ãƒĢをå‡Ļį†ã™ã‚‹ãŽãĢ十分ãĒčŋŊ加゚ペãƒŧ゚があり、 æĩĒč˛ģ゚ペãƒŧ゚はありぞせん。 Linuxでより大きãĒパãƒĒãƒ†ã‚Ŗãƒ‘ãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗã‚’å–åž—ã™ã‚‹ãƒˆãƒĒックは、æŦĄãŽã‚ŗãƒžãƒŗãƒ‰ã§ フりãƒŧマットすることです。 :mkfs.ext4 -m 0 -T largefile4 DEVICE これãĢã‚ˆã‚Šã€į´„1.5%ぎčŋŊ加゚ペãƒŧ゚、4 TBãƒ‡ã‚Ŗã‚šã‚¯ã§į´„60 GBが垗られ、 æĩĒč˛ģ゚ペãƒŧ゚ãĒしで各デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã§į´„460,000ãƒ•ã‚Ąã‚¤ãƒĢが可čƒŊãĢãĒりぞす。 hashsize SIZE_IN_BYTES äŋå­˜ã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ãŽãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēをバイト単äŊã§åŽšįžŠã—ãžã™ã€‚ デフりãƒĢãƒˆãŽãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēは16バイトīŧˆ128ビットīŧ‰ã§ã‚り、ãģとんおぎ場合ãĢ抟čƒŊするはずです。 **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、こぎ値を変更しãĒいことをåŧˇã お勧めしぞす。äģŠåžŒã“ぎ値を変更するãĢは、パãƒĒãƒ†ã‚Ŗå…¨äŊ“ã‚’**再äŊœæˆ**するåŋ…čĻãŒã‚ã‚Šãžã™īŧ į•°ãĒã‚‹ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēをäŊŋį”¨ã™ã‚‹į†į”ąãŽ1ã¤ã¯ã€ã‚ˇã‚šãƒ†ãƒ ãŽãƒĄãƒĸãƒĒがåˆļ限されãĻいる場合です。 įĩŒé¨“則としãĻ、SnapRAIDは通常、ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋ16 TBごとãĢ1 GiBぎRAMをåŋ…čĻã¨ã—ãžã™ã€‚ å…ˇäŊ“įš„ãĢは、デãƒŧã‚ŋãŽãƒãƒƒã‚ˇãƒĨをäŋå­˜ã™ã‚‹ãŸã‚ãĢ、SnapRAIDは į´„ $TS \cdot (1 + HS) / BS$ バイトぎRAMをåŋ…čĻã¨ã—ãžã™ã€‚ ここで、TSã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦã‚¤ãŽåˆč¨ˆã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã€BSはブロックã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã€HSã¯ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã§ã™ã€‚ たとえば、4 TBãŽãƒ‡ã‚Ŗã‚šã‚¯8台、ブロックã‚ĩイã‚ē256 KiBīŧˆ1 KiB = 1024バイトīŧ‰ã€ ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ē16ぎ場合īŧš :RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 16) / (256 \cdot 2^{10}) = 1.93 \text{ GiB}$ ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēを8ãĢ切りæ›ŋえるとīŧš :RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 8) / (256 \cdot 2^{10}) = 1.02 \text{ GiB}$ ブロックã‚ĩイã‚ēを512ãĢ切りæ›ŋえるとīŧš :RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 16) / (512 \cdot 2^{10}) = 0.96 \text{ GiB}$ ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēを8、ブロックã‚ĩイã‚ēを512ãŽä¸Ąæ–šãĢ切りæ›ŋえるとīŧš :RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 8) / (512 \cdot 2^{10}) = 0.51 \text{ GiB}$ autosave SIZE_IN_GIGABYTES å‡Ļį†ã•ã‚ŒãŸæŒ‡åŽšã•ã‚ŒãŸGB量垌ãĢã€åŒæœŸãžãŸã¯ã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°æ™‚ãĢįŠļ態をč‡Ēå‹•įš„ãĢäŋå­˜ã—ぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ãƒžã‚ˇãƒŗã‚¯ãƒŠãƒƒã‚ˇãƒĨやそぎäģ–ãŽã‚¤ãƒ™ãƒŗãƒˆãĢã‚ˆãŖãĻ中断された場合ãĢ、 é•ˇã„ `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’æœ€åˆã‹ã‚‰å†čĩˇå‹•するぎをéŋけるぎãĢåŊšįĢ‹ãĄãžã™ã€‚ temp_limit TEMPERATURE_CELSIUS č¨ąåŽšã•ã‚Œã‚‹æœ€å¤§ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻã‚’æ‘‚æ°ã§č¨­åŽšã—ãžã™ã€‚æŒ‡åŽšã•ã‚ŒãĻいる場合、 SnapRAIDは smartctl ツãƒŧãƒĢをäŊŋį”¨ã—ãĻすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻã‚’åŽšæœŸįš„ãĢチェックしぞす。 SnapRAIDが動äŊœã—ãĻã„ã‚‹é–“ã€įžåœ¨ãŽãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻãŒčĄ¨į¤ēされぞす。 ã„ãšã‚Œã‹ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒã“ãŽåˆļ限をčļ…えると、すずãĻぎ操äŊœãŒåœæ­ĸã—ã€ãƒ‡ã‚Ŗã‚šã‚¯ã¯ `temp_sleep` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§åŽšįžŠã•ã‚ŒãŸæœŸé–“ã€ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗīŧˆã‚šã‚ŋãƒŗãƒã‚¤įŠļ態ãĢį§ģ行īŧ‰ã•れぞす。 ゚ãƒĒãƒŧプ期間垌、操äŊœã¯å†é–‹ã•れぞすが、渊åēĻåˆļ限ãĢ再åēĻé”ã—ãŸå ´åˆã¯å†ãŗä¸€æ™‚åœæ­ĸする 可čƒŊ性がありぞす。 操äŊœä¸­ã€SnapRAIDã¯å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽåŠ į†ąæ›˛įˇšã‚‚åˆ†æžã—ã€ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ“ãƒ†ã‚ŖãŒįļ™įļšã—た場合ãĢ 達するとä爿ƒŗã•ã‚Œã‚‹é•ˇæœŸįš„ãĒ厉厚渊åēĻã‚’æŽ¨åŽšã—ãžã™ã€‚æŽ¨åŽšã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻが4回上昇した 垌ãĢぎãŋåŽŸčĄŒã•ã‚Œã€äŋĄé ŧできる傞向をįĸēįĢ‹ã™ã‚‹ãŽãĢ十分ãĒデãƒŧã‚ŋãƒã‚¤ãƒŗãƒˆãŒåˆŠį”¨å¯čƒŊであることを äŋč¨ŧしぞす。 こぎä爿¸Ŧされる厉厚渊åēĻã¯ã€įžåœ¨ãŽå€¤ãŽæ¨ĒãĢæ‹Ŧåŧ§ã§čĄ¨į¤ēã•ã‚Œã€ã‚ˇã‚šãƒ†ãƒ ãŽå†ˇå´ãŒ éŠåˆ‡ã‹ãŠã†ã‹ã‚’čŠ•äžĄã™ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ã“ãŽæŽ¨åŽšæ¸ŠåēĻã¯æƒ…å ąæäž›ãŽãŋã‚’į›Žįš„ã¨ã—ãĻおり、 SnapRAIDぎ動äŊœãĢはåŊąéŸŋしぞせん。プログナムぎ動äŊœã¯ã€åŽŸéš›ãŽæ¸ŦåŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻãĢぎãŋ åŸēãĨいãĻいぞす。 ã“ãŽåˆ†æžã‚’åŽŸčĄŒã™ã‚‹ãŸã‚ãĢ、SnapRAIDã¯ã‚ˇã‚šãƒ†ãƒ æ¸ŠåēĻãŽå‚į…§ãŒåŋ…čĻã§ã™ã€‚ ãžãšã€åˆŠį”¨å¯čƒŊãĒハãƒŧドã‚Ļェã‚ĸã‚ģãƒŗã‚ĩãƒŧからčĒ­ãŋå–ã‚ã†ã¨ã—ãžã™ã€‚ã‚ˇã‚šãƒ†ãƒ ã‚ģãƒŗã‚ĩãƒŧãĢ ã‚ĸクã‚ģ゚できãĒã„å ´åˆã¯ã€åŽŸčĄŒé–‹å§‹æ™‚ãĢæ¸Ŧ厚された最もäŊŽã„ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻをフりãƒŧãƒĢãƒãƒƒã‚¯å‚į…§ã¨ã—ãĻ äŊŋį”¨ã—ãžã™ã€‚ 通常、SnapRAIDã¯æœ€ã‚‚į†ąã„ãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻぎãŋã‚’čĄ¨į¤ēしぞす。 すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻã‚’čĄ¨į¤ēするãĢは、-A ぞたは --stats ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ temp_sleep TIME_IN_MINUTES 渊åēĻåˆļ限ãĢ達したときぎ゚ã‚ŋãƒŗãƒã‚¤æ™‚é–“īŧˆåˆ†å˜äŊīŧ‰ã‚’č¨­åŽšã—ãžã™ã€‚ã“ãŽæœŸé–“ä¸­ã€ãƒ‡ã‚Ŗã‚šã‚¯ã¯ ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãŸãžãžã§ã™ã€‚ãƒ‡ãƒ•ã‚ŠãƒĢトは5分です。 pool DIR `pool` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãĻãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎäģŽæƒŗãƒ“ãƒĨãƒŧがäŊœæˆã•れるプãƒŧãƒĒãƒŗã‚°ãƒ‡ã‚ŖãƒŦクトãƒĒを åŽšįžŠã—ãžã™ã€‚ ãƒ‡ã‚ŖãƒŦクトãƒĒはæ—ĸãĢ存在しãĻいるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ share UNC_DIR ãƒ‡ã‚Ŗã‚šã‚¯ãĢãƒĒãƒĸãƒŧトでã‚ĸクã‚ģ゚するためãĢåŋ…čρãĒWindows UNCãƒ‘ã‚šã‚’åŽšįžŠã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいる場合、プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒãĢäŊœæˆã•ã‚ŒãŸã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ã€ ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ĸクã‚ģ゚するためãĢこぎUNCパ゚をäŊŋį”¨ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒãĒã„å ´åˆã€į”Ÿæˆã•ã‚ŒãŸã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ãƒ­ãƒŧã‚ĢãƒĢパ゚ぎãŋをäŊŋį”¨ã—ã€ プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒをネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã™ã‚‹ã“とはできぞせん。 ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ã€æŒ‡åŽšã•ã‚ŒãŸUNCパ゚をäŊŋį”¨ã—ãĻåŊĸ成され、`data` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯åã‚’čŋŊ加し、最垌ãĢãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ‡ã‚ŖãƒŦクトãƒĒと名前をčŋŊ加しぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯Windowsでぎãŋåŋ…čĻã§ã™ã€‚ smartctl DISK/PARITY OPTIONS... å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTåąžæ€§ã‚’å–åž—ã™ã‚‹ãŸã‚ãŽã‚Ģ゚ã‚ŋムsmartctlã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’åŽšįžŠã—ãžã™ã€‚ これは、RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧや一部ぎUSBãƒ‡ã‚Ŗã‚šã‚¯ãŒč‡Ē動検å‡ēできãĒい場合ãĢåŋ…čρãĢãĒる ことがありぞす。`%s` プãƒŦãƒŧ゚ホãƒĢダãƒŧはデバイ゚名ãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ãŒã€ RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧãĒおぎå›ē厚デバイ゚ではã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã™ã€‚ DISK は `data` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã•ã‚ŒãŸãŽã¨åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ PARITY はパãƒĒãƒ†ã‚ŖåãŽã„ãšã‚Œã‹ã§ã™īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity`、ぞたは `z-parity`。 指厚された OPTIONS で、`%s` 文字列はデバイ゚名ãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚ RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧぎ場合、デバイ゚はå›ē厚されãĻいる可čƒŊ性がéĢ˜ã„ãŸã‚ã€ `%s` をäŊŋį”¨ã™ã‚‹åŋ…čĻã¯ãĒいかもしれぞせん。 äŊŋį”¨å¯čƒŊãĒã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢついãĻは、smartmontoolsぎドキãƒĨãƒĄãƒŗãƒˆã‚’å‚į…§ã—ãĻください。 :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices 例īŧš :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] ãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŽįĸēįŽ‡ã‚’č¨ˆįŽ—ã™ã‚‹ã¨ããĢ、指厚されたSMARTåąžæ€§ã‚’į„ĄčĻ–ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒį‰šåŽšãŽåąžæ€§ãĢついãĻᕰ叏ãĒ値ぞたはčĒ¤č§Ŗã‚’æ‹›ãå€¤ã‚’å ąå‘Šã™ã‚‹å ´åˆãĢ åŊšįĢ‹ãĄãžã™ã€‚ DISK は `data` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã•ã‚ŒãŸãŽã¨åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ PARITY はパãƒĒãƒ†ã‚ŖåãŽã„ãšã‚Œã‹ã§ã™īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity`、ぞたは `z-parity`。 į‰šæŽŠãĒ値 `*` は、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã§åąžæ€§ã‚’į„ĄčĻ–ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã§ããžã™ã€‚ 䞋としãĻ、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã§ `Current Pending Sector Count` åąžæ€§ã‚’į„ĄčĻ–ã™ã‚‹ãĢはīŧš :smartignore * 197 最初ぎパãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã§ãŽãŋį„ĄčĻ–ã™ã‚‹ãĢはīŧš :smartignore parity 197 Examples Unixぎ一čˆŦįš„ãĒ構成ぎ䞋はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Windowsぎ一čˆŦįš„ãĒ構成ぎ䞋はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern パã‚ŋãƒŧãƒŗã¯ã€åĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯é™¤å¤–ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã™ã‚‹ãŸã‚ãŽæŸ”čģŸãĒæ–šæŗ•ã‚’ 提䞛しぞす。グロブ文字をäŊŋį”¨ã™ã‚‹ã“ã¨ã§ã€ã™ãšãĻぎパ゚を手動でãƒĒ゚トすることãĒく、 į‰šåŽšãŽãƒ•ã‚Ąã‚¤ãƒĢåã‚„ãƒ‡ã‚ŖãƒŦクトãƒĒ構造全äŊ“ãĢä¸€č‡´ã™ã‚‹ãƒĢãƒŧãƒĢã‚’åŽšįžŠã§ããžã™ã€‚ į–‘å•įŦĻ `?` ã¯ã€ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字を除くäģģæ„ãŽ1文字ãĢä¸€č‡´ã—ãžã™ã€‚ これãĢより、パã‚ŋãƒŧãƒŗã‚’å˜ä¸€ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢãĢ限厚したぞぞ、可変文字を æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢåã¨ä¸€č‡´ã•ã›ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ 単一ぎã‚ĸ゚ã‚ŋãƒĒ゚ク `*` はäģģæ„ãŽæ–‡å­—列ãĢä¸€č‡´ã—ãžã™ãŒã€į–‘å•įŦĻと同様ãĢ ãƒ‡ã‚ŖãƒŦクトãƒĒぎåĸƒį•Œã‚’čļŠãˆã‚‹ã“ã¨ã¯ã‚ã‚Šãžã›ã‚“ã€‚ã‚šãƒŠãƒƒã‚ˇãƒĨで停æ­ĸするため、 å˜ä¸€ãŽãƒ‘ã‚šã‚ŗãƒŗãƒãƒŧãƒãƒŗãƒˆå†…ã§ãŽä¸€č‡´ãĢ遊しãĻã„ãžã™ã€‚ã“ã‚Œã¯ã€ã‚ˇã‚§ãƒĢぎ グロブでおãĒじãŋぎ標æē–įš„ãĒワイãƒĢドã‚Ģãƒŧドぎ動äŊœã§ã™ã€‚ ダブãƒĢã‚ĸ゚ã‚ŋãƒĒ゚ク `**` はよりåŧˇåŠ›ã§ã€ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字をåĢむ äģģæ„ãŽæ–‡å­—列ãĢä¸€č‡´ã—ãžã™ã€‚ã“ã‚ŒãĢより、パã‚ŋãƒŧãƒŗãŒč¤‡æ•°ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢを ãžãŸã„ã§ä¸€č‡´ã§ãã‚‹ã‚ˆã†ãĢãĒりぞす。`**` がパã‚ŋãƒŧãƒŗå†…ãĢį›´æŽĨ埋めčžŧぞれãĻいる場合、 å‘¨å›˛ãŽãƒĒテナãƒĢテキ゚トぎ間ãĢã‚ã‚‹ã‚šãƒŠãƒƒã‚ˇãƒĨをåĢむ0文字äģĨ上ぎ文字ãĢä¸€č‡´ã—ãžã™ã€‚ `**` ぎ最も重čρãĒäŊŋã„æ–šã¯ã€į‰šåˆĨãĒåŊĸåŧã§ã‚ã‚‹ `/**/` です。これは 0個äģĨ上ぎ厌全ãĒãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢãĢä¸€č‡´ã—ã€æ­ŖįĸēãĒパ゚構造をįŸĨらãĒくãĻも、 ãƒ‡ã‚ŖãƒŦクトãƒĒツãƒĒãƒŧ内ぎäģģæ„ãŽæˇąã•ãĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã¨ä¸€č‡´ã•ã›ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ 䞋えば、パã‚ŋãƒŧãƒŗ `src/**/main.js` は `src/main.js`īŧˆãƒ‡ã‚ŖãƒŦクトãƒĒを0個゚キップīŧ‰ã€ `src/ui/main.js`īŧˆ1個゚キップīŧ‰ã€`src/ui/components/main.js`īŧˆ2個゚キップīŧ‰ ãĢä¸€č‡´ã—ãžã™ã€‚ 角æ‹Ŧåŧ§ `[]` をäŊŋį”¨ã—ãŸæ–‡å­—ã‚¯ãƒŠã‚šã¯ã€æŒ‡åŽšã•ã‚ŒãŸã‚ģãƒƒãƒˆãžãŸã¯į¯„å›˛ãŽ äģģæ„ãŽ1文字ãĢä¸€č‡´ã—ãžã™ã€‚äģ–ぎ単一文字パã‚ŋãƒŧãƒŗã¨åŒæ§˜ãĢ、 ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字ãĢã¯ä¸€č‡´ã—ãžã›ã‚“ã€‚ã‚¯ãƒŠã‚šã¯į¯„å›˛ã¨ã€æ„Ÿå˜†įŦĻを äŊŋį”¨ã—ãŸåĻ厚をã‚ĩポãƒŧトしãĻいぞす。 čĻšãˆãĻおくずき栚æœŦįš„ãĒ違いは、`*`、`?`ã€ãŠã‚ˆãŗæ–‡å­—ã‚¯ãƒŠã‚šã¯ã™ãšãĻ ãƒ‡ã‚ŖãƒŦクトãƒĒぎåĸƒį•Œã‚’å°Šé‡ã—ã€å˜ä¸€ãŽãƒ‘ã‚šã‚ŗãƒŗãƒãƒŧãƒãƒŗãƒˆå†…ã§ãŽãŋä¸€č‡´ã™ã‚‹ãŽãĢ寞し、 `**` ã¯ãƒ‡ã‚ŖãƒŦクトãƒĒåŒēåˆ‡ã‚Šæ–‡å­—ã‚’ãžãŸã„ã§ä¸€č‡´ã§ãã‚‹å”¯ä¸€ãŽãƒ‘ã‚ŋãƒŧãƒŗã§ã‚ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚ 4ã¤ãŽį•°ãĒã‚‹į¨ŽéĄžãŽãƒ‘ã‚ŋãƒŧãƒŗãŒã‚ã‚Šãžã™ã€‚ =FILE FILE という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ =DIR/ DIR という名前ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒとそぎ中ぎすずãĻを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ‡ã‚ŖãƒŦクトãƒĒãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ•ã‚Ąã‚¤ãƒĢãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ =/PATH/FILE æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒãƒ•ã‚Ąã‚¤ãƒĢ パ゚を選択しぞす。こぎパã‚ŋãƒŧãƒŗã¯ ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ =/PATH/DIR/ æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒãƒ‡ã‚ŖãƒŦクトãƒĒ パ゚とそぎ中ぎすずãĻを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ‡ã‚ŖãƒŦクトãƒĒãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ•ã‚Ąã‚¤ãƒĢãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ / で始ぞるįĩļ寞パ゚を指厚する場合、それはロãƒŧã‚ĢãƒĢãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŽãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒではãĒく、 **ã‚ĸãƒŦイぎãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒ**ãĢéŠį”¨ã•ã‚Œãžã™ã€‚ Windowsでは、フりワãƒŧãƒ‰ã‚šãƒŠãƒƒã‚ˇãƒĨ / ぎäģŖã‚ã‚ŠãĢãƒãƒƒã‚¯ã‚šãƒŠãƒƒã‚ˇãƒĨ \ をäŊŋį”¨ã§ããžã™ã€‚ Windowsã‚ˇã‚šãƒ†ãƒ ãƒ‡ã‚ŖãƒŦクトãƒĒã€ã‚¸ãƒŖãƒŗã‚¯ã‚ˇãƒ§ãƒŗã€ãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã€ãŠã‚ˆãŗããŽäģ–ぎWindowsぎ į‰šæŽŠãƒ‡ã‚ŖãƒŦクトãƒĒã¯ãƒ•ã‚Ąã‚¤ãƒĢとしãĻæ‰ąã‚ã‚Œãžã™ã€‚ã¤ãžã‚Šã€ãã‚Œã‚‰ã‚’é™¤å¤–ã™ã‚‹ãĢは、 ãƒ‡ã‚ŖãƒŦクトãƒĒãƒĢãƒŧãƒĢではãĒく**ãƒ•ã‚Ąã‚¤ãƒĢãƒĢãƒŧãƒĢ**をäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢ名ãĢ `*`、`?`、`[`、ぞたは `]` 文字がåĢぞれãĻいる場合は、 グロブ文字としãĻč§Ŗé‡ˆã•ã‚ŒãĒいようãĢ**ã‚¨ã‚šã‚ąãƒŧプ**するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ Unixã§ã¯ã‚¨ã‚šã‚ąãƒŧプ文字は `\` です。Windowsでは `^` です。 パã‚ŋãƒŧãƒŗãŒã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗãĢã‚ã‚‹å ´åˆã¯ã€ã‚ŗãƒžãƒŗãƒ‰ã‚ˇã‚§ãƒĢãĢã‚ˆãŖãĻč§Ŗé‡ˆã•ã‚Œã‚‹ãŽã‚’é˜˛ããŸã‚ãĢ、 ã‚¨ã‚šã‚ąãƒŧプ文字を**2倍**ãĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢでは、å‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã™ã‚‹ãŸã‚ãĢį•°ãĒるæˆĻį•ĨをäŊŋį”¨ã§ããžã™ã€‚ æœ€ã‚‚į°Ąå˜ãĒã‚ĸプロãƒŧチは、**除外**したいすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢã¨ãƒ‡ã‚ŖãƒŦクトãƒĒを削除するためãĢ、 `exclude` ãƒĢãƒŧãƒĢぎãŋをäŊŋį”¨ã™ã‚‹ã“ã¨ã§ã™ã€‚äž‹īŧš :# `*.unrecoverable` という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを除外 :exclude *.unrecoverable :# ãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒ `/lost+found` を除外 :exclude /lost+found/ :# `tmp` という名前ぎäģģæ„ãŽã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒを除外 :exclude tmp/ 反寞ぎã‚ĸプロãƒŧチは、`include` ãƒĢãƒŧãƒĢぎãŋをäŊŋį”¨ã—ãĻ、**å‡Ļį†ã—ãŸã„ãƒ•ã‚Ąã‚¤ãƒĢぎãŋ**を åŽšįžŠã™ã‚‹ã“ã¨ã§ã™ã€‚äž‹īŧš :# ä¸€éƒ¨ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぎãŋをåĢめる :include /movies/ :include /musics/ :include /pictures/ æœ€åžŒãŽæ–šæŗ•ã¨ã—ãĻは、`exclude` と `include` ãƒĢãƒŧãƒĢã‚’æˇˇåœ¨ã•ã›ãžã™ã€‚ã“ãŽå ´åˆã€ **ãƒĢãƒŧãƒĢぎ順åēãŒé‡čρ**です。前ぎãƒĢãƒŧãƒĢは垌ぎãƒĢãƒŧãƒĢよりもå„Ē先されぞす。 į°Ąį´ åŒ–ã™ã‚‹ãŸã‚ãĢ、すずãĻぎ `exclude` ãƒĢãƒŧãƒĢを最初ãĢãƒĒ゚トし、æŦĄãĢすずãĻぎ `include` ãƒĢãƒŧãƒĢをãƒĒ゚トできぞす。䞋īŧš :# `*.unrecoverable` という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを除外 :exclude *.unrecoverable :# `tmp` という名前ぎäģģæ„ãŽã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒを除外 :exclude tmp/ :# ä¸€éƒ¨ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぎãŋをåĢめる :include /movies/ :include /musics/ :include /pictures/ ã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗã§ -f ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€`include` パã‚ŋãƒŧãƒŗãŽãŋを äŊŋį”¨ã§ããžã™ã€‚äž‹īŧš :# .mp3 ãƒ•ã‚Ąã‚¤ãƒĢぎãŋをチェック。 :# Unixã§ã¯ã€ã‚ˇã‚§ãƒĢãĢã‚ˆã‚‹ã‚°ãƒ­ãƒ–åą•é–‹ã‚’é˜˛ããŸã‚ãĢåŧ•ᔍįŦĻをäŊŋį”¨ã€‚ :snapraid -f "*.mp3" check Unixã§ã¯ã€ã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗã§ã‚°ãƒ­ãƒ–æ–‡å­—ã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€ã‚ˇã‚§ãƒĢãŒãã‚Œã‚‰ã‚’åą•é–‹ã™ã‚‹ãŽã‚’ é˜˛ããŸã‚ãĢåŧ•ᔍįŦĻã§å›˛ã‚€åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ Ignore File č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢぎグロãƒŧバãƒĢãƒĢãƒŧãƒĢãĢ加えãĻ、ã‚ĸãƒŦイ内ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãĢ .snapraidignore ãƒ•ã‚Ąã‚¤ãƒĢを配įŊŽã—ãĻã€åˆ†æ•Ŗåž‹ãŽé™¤å¤–ãƒĢãƒŧãƒĢã‚’åŽšįžŠã§ããžã™ã€‚ `.snapraidignore` ã§åŽšįžŠã•ã‚ŒãŸãƒĢãƒŧãƒĢã¯ã€č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢぎãƒĢãƒŧãƒĢぎ垌ãĢ éŠį”¨ã•ã‚Œãžã™ã€‚ã“ã‚Œã¯ã€ãã‚Œã‚‰ãŒã‚ˆã‚ŠéĢ˜ã„å„Ē先åēĻã‚’æŒãĄã€ã‚°ãƒ­ãƒŧバãƒĢč¨­åŽšã§ äģĨ前ãĢåĢぞれãĻã„ãŸãƒ•ã‚Ąã‚¤ãƒĢを除外するためãĢäŊŋį”¨ã§ãã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ äē‹åŽŸä¸Šã€ãƒ­ãƒŧã‚ĢãƒĢãƒĢãƒŧãƒĢãŒä¸€č‡´ã™ã‚‹å ´åˆã€ã‚°ãƒ­ãƒŧバãƒĢãĒ包åĢč¨­åŽšãĢé–ĸäŋ‚ãĒく、 ãƒ•ã‚Ąã‚¤ãƒĢは除外されぞす。 `.snapraidignore` ぎパã‚ŋãƒŧãƒŗãƒ­ã‚¸ãƒƒã‚¯ã¯ã‚°ãƒ­ãƒŧバãƒĢč¨­åŽšã‚’åæ˜ ã—ãĻいぞすが、 パã‚ŋãƒŧãƒŗã¯ããŽãƒ•ã‚Ąã‚¤ãƒĢが配įŊŽã•れãĻã„ã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒãĢå›ē厚されぞすīŧš =FILE ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぞたはそぎ下ãĢある、FILE という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを 選択しぞす。これは、グロãƒŧバãƒĢパã‚ŋãƒŧãƒŗã¨åŒã˜ã‚°ãƒ­ãƒƒãƒ“ãƒŗã‚°ãƒĢãƒŧãƒĢãĢ垓いぞす。 =DIR/ ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぞたはそぎ下ãĢある、DIR という名前ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒと そぎ中ぎすずãĻを選択しぞす。 =/PATH/FILE `.snapraidignore` ãƒ•ã‚Ąã‚¤ãƒĢぎ場所をåŸēæē–ãĢしãĻã€æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒ ãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。 =/PATH/DIR/ `.snapraidignore` ãƒ•ã‚Ąã‚¤ãƒĢぎ場所をåŸēæē–ãĢしãĻã€æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒ ãƒ‡ã‚ŖãƒŦクトãƒĒとそぎ中ぎすずãĻを選択しぞす。 グロãƒŧバãƒĢč¨­åŽšã¨ã¯į•°ãĒり、`.snapraidignore` ãƒ•ã‚Ąã‚¤ãƒĢは除外ãƒĢãƒŧãƒĢぎãŋを ã‚ĩポãƒŧトしぞす。`include` パã‚ŋãƒŧãƒŗã‚„åĻ厚 (!) はäŊŋį”¨ã§ããžã›ã‚“ã€‚ たとえば、`/mnt/disk1/projects/` ãĢ `.snapraidignore` がある場合īŧš :# /mnt/disk1/projects/output.bin ぎãŋを除外 :/output.bin :# projects/ 内ぎ `build` ã¨ã„ã†åå‰ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをすずãĻ除外 :build/ :# projects/ ぞたはそぎã‚ĩブフりãƒĢダ内ぎすずãĻぎ .tmp ãƒ•ã‚Ąã‚¤ãƒĢを除外 :*.tmp Content SnapRAIDã¯ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¨ãƒã‚§ãƒƒã‚¯ã‚ĩãƒ ã‚’ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ぞす。 これはバイナãƒĒãƒ•ã‚Ąã‚¤ãƒĢã§ã‚ã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイãĢ存在するすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢと、 それらぎ整合性を検č¨ŧするためぎすずãĻぎチェックã‚ĩムを一čĻ§čĄ¨į¤ēしぞす。 ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢは `sync` ãŠã‚ˆãŗ `scrub` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ書きされ、 `fix`、`check`ã€ãŠã‚ˆãŗ `status` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ取られぞす。 Parity SnapRAIDは、ã‚ĸãƒŦイぎパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ぞす。 これらはバイナãƒĒãƒ•ã‚Ąã‚¤ãƒĢであり、`content` ãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãŸã™ãšãĻぎブロックぎ č¨ˆįŽ—ã•ã‚ŒãŸãƒ‘ãƒĒãƒ†ã‚ŖãŒåĢぞれãĻいぞす。 ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢは `sync` ãŠã‚ˆãŗ `fix` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ書きされ、 `scrub` ãŠã‚ˆãŗ `check` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻ**čĒ­ãŋ取られるだけ**です。 Encoding UnixぎSnapRAIDã¯ã€ã‚¨ãƒŗã‚ŗãƒŧãƒ‡ã‚Ŗãƒŗã‚°ã‚’į„ĄčĻ–ã—ãžã™ã€‚ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã§äŊŋį”¨ã•ã‚ŒãĻいる ãŽã¨åŒã˜ã‚¨ãƒŗã‚ŗãƒŧãƒ‡ã‚Ŗãƒŗã‚°ã§ãƒ•ã‚Ąã‚¤ãƒĢ名をčĒ­ãŋ取り、äŋå­˜ã—ぞす。 Windowsã§ã¯ã€ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰čĒ­ãŋ取られたすずãĻぎ名前はUTF-8åŊĸåŧãĢ変換され、 å‡Ļį†ã•ã‚Œãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢåã‚’æ­Ŗã—ãå‡ē力するãĢは、`chcp 65001` ã‚ŗãƒžãƒŗãƒ‰ã§Windowsã‚ŗãƒŗã‚ŊãƒŧãƒĢをUTF-8ãƒĸãƒŧドãĢč¨­åŽšã—ã€ ã‚ŗãƒŗã‚ŊãƒŧãƒĢãƒ•ã‚Šãƒŗãƒˆã¨ã—ãĻ `Lucida Console` ãĒおぎTrueTypeãƒ•ã‚Šãƒŗãƒˆã‚’**äŊŋį”¨ã™ã‚‹**åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ これはå‡ēåŠ›ã•ã‚Œã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ名ãĢぎãŋåŊąéŸŋã—ãžã™ã€‚ã‚ŗãƒŗã‚ŊãƒŧãƒĢå‡ēåŠ›ã‚’ãƒ•ã‚Ąã‚¤ãƒĢãĢãƒĒダイãƒŦクトする場合、 įĩæžœãŽãƒ•ã‚Ąã‚¤ãƒĢは常ãĢUTF-8åŊĸåŧãĢãĒりぞす。 Copyright This file is Copyright (C) 2025 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ja.txt000066400000000000000000002540601522717156100167650ustar00rootroot00000000000000 =========================== Disk Arrayᔍ SnapRAID バックã‚ĸップ =========================== 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAIDã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦã‚¤į”¨ãŽãƒãƒƒã‚¯ã‚ĸッププログナムで、最大6å°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒį™ēį”Ÿã—ãŸå ´åˆãŽ デãƒŧã‚ŋ垊旧ぎためãĢパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã—ぞす。 ä¸ģãĢ大厚量で、更新é ģåēĻぎäŊŽã„ãƒ•ã‚Ąã‚¤ãƒĢã‚’æ‰ąã†ãƒ›ãƒŧãƒ ãƒĄãƒ‡ã‚Ŗã‚ĸã‚ģãƒŗã‚ŋãƒŧã‚’å¯žčąĄã¨ã—ãĻおり、 SnapRAIDãĢはいくつかぎ抟čƒŊがありぞす。 * ãƒ•ã‚Ąã‚¤ãƒĢがæ—ĸãĢå…ĨãŖãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã€å†ãƒ•ã‚ŠãƒŧマットせずãĢããŽãžãžåˆŠį”¨ã§ãã€é€šå¸¸é€šã‚Š ã‚ĸクã‚ģ゚できぞす。 * すずãĻぎデãƒŧã‚ŋãŒãƒãƒƒã‚ˇãƒĨ化され、デãƒŧã‚ŋぎ整合性をįĸēäŋã—、ã‚ĩイãƒŦãƒŗãƒˆãĒį ´æã‚’é˜˛ãŽãžã™ã€‚ * éšœåŽŗãŒį™ēį”Ÿã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽæ•°ãŒãƒ‘ãƒĒãƒ†ã‚Ŗæ•°ã‚’čļ…えた場合、デãƒŧã‚ŋãŽæå¤ąã¯åŊąéŸŋã‚’å—ã‘ãŸãƒ‡ã‚Ŗã‚šã‚¯ãĢ 限厚され、äģ–ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒ‡ãƒŧã‚ŋはåŧ•きįļšãã‚ĸクã‚ģ゚可čƒŊです。 * čĒ¤ãŖãĻãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽãƒ•ã‚Ąã‚¤ãƒĢを削除した場合でも、垊旧が可čƒŊです。 * ãƒ‡ã‚Ŗã‚šã‚¯ã¯į•°ãĒるã‚ĩイã‚ēã§ã‚ãŖãĻも構いぞせん。 * ã„ã¤ã§ã‚‚ãƒ‡ã‚Ŗã‚šã‚¯ã‚’čŋŊ加できぞす。 * SnapRAIDはデãƒŧã‚ŋをロックしぞせん。いつでも再フりãƒŧマットやデãƒŧã‚ŋį§ģ動ãĒしãĢåˆŠį”¨ã‚’ 停æ­ĸできぞす。 * ãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ĸクã‚ģ゚するためãĢã‚šãƒ”ãƒŗã•ã›ã‚‹åŋ…čĻãŒã‚ã‚‹ãŽã¯1å°ãŽãƒ‡ã‚Ŗã‚šã‚¯ã ã‘ã§ã‚ã‚Šã€ ᜁé›ģåŠ›ã¨é¨’éŸŗäŊŽæ¸›ãĢåŊšįĢ‹ãĄãžã™ã€‚ čŠŗį´°ãĢついãĻは、SnapRAIDぎå…Ŧåŧã‚ĩイトをごčĻ§ãã ã•ã„ã€‚ https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAIDはRAIDとバックã‚ĸッププログナムぎハイブãƒĒãƒƒãƒ‰ã§ã‚ã‚Šã€ä¸Ąæ–šãŽåˆŠį‚šã‚’įĩ„ãŋ合わせることを į›ŽæŒ‡ã—ãĻいぞす。ただし、äŊŋį”¨ã™ã‚‹å‰ãĢč€ƒæ…Žã™ãšãã„ãã¤ã‹ãŽåˆļ限がありぞす。 ä¸ģãĒåˆļé™ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ã€æœ€čŋ‘ `sync` ã‚’åŽŸčĄŒã—ãĻいãĒい場合、厌全ãĢ垊旧できãĒい 可čƒŊ性があることです。 ã‚ˆã‚Šå…ˇäŊ“įš„ãĢは、最垌ぎ `sync` 操äŊœäģĨ降ãĢå¤‰æ›´ãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎã‚ĩイã‚ēぞでぎデãƒŧã‚ŋが 垊旧できãĒい可čƒŊ性がありぞす。 ã“ã‚Œã¯ã€å¤‰æ›´ãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãŒæ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢãĒい場合でもį™ēį”Ÿã—ãžã™ã€‚ こぎため、SnapRAIDは**ã‚ãŖãŸãĢ変更されãĒい**デãƒŧã‚ŋãĢ遊しãĻいぞす。 一斚で、新しくčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢは、æ—ĸãĢå­˜åœ¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎ垊旧をåĻ¨ã’ãžã›ã‚“ã€‚ 新しくčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãŒæ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢある場合ãĢぎãŋã€ãã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒå¤ąã‚ã‚Œãžã™ã€‚ そぎäģ–ぎSnapRAIDぎåˆļ限はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ * SnapRAIDã§ã¯ã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãĢ寞しãĻ**個åˆĨãŽãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ **がäŋæŒã•れぞす。 RAIDでは、単一ぎ大きãĒãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŒåž—ã‚‰ã‚Œãžã™ã€‚ * SnapRAIDは**デãƒŧã‚ŋã‚’ã‚šãƒˆãƒŠã‚¤ãƒ”ãƒŗã‚°ã—ãžã›ã‚“**。 RAIDã§ã¯ã€ã‚šãƒˆãƒŠã‚¤ãƒ”ãƒŗã‚°ãĢより速åēĻが向上しぞす。 * SnapRAIDは**ãƒĒã‚ĸãƒĢã‚ŋイムぎ垊旧をã‚ĩポãƒŧトしぞせん**。 RAIDã§ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻもäŊœæĨ­ã‚’停æ­ĸするåŋ…čĻã¯ã‚ã‚Šãžã›ã‚“ã€‚ * SnapRAIDは**é™ã‚‰ã‚ŒãŸæ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗ**からぎãŋデãƒŧã‚ŋを垊旧できぞす。 バックã‚ĸãƒƒãƒ—ã§ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ全äŊ“ぎ厌全ãĒéšœåŽŗã‹ã‚‰åžŠæ—§ã§ããžã™ã€‚ * **ãƒ•ã‚Ąã‚¤ãƒĢ名、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã€ãŠã‚ˆãŗãƒãƒŧドãƒĒãƒŗã‚¯**ぎãŋがäŋå­˜ã•れぞす。 ã‚ĸクã‚ģã‚šč¨ąå¯ã€æ‰€æœ‰æ¨Šã€ãŠã‚ˆãŗæ‹Ąåŧĩåąžæ€§ã¯äŋå­˜ã•れぞせん。 4 GETTING STARTED ================= SnapRAIDをäŊŋį”¨ã™ã‚‹ãĢã¯ã€ãžãšãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎ1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ `parity` æƒ…å ąå°‚į”¨ãĢ 選択するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢ1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’äŊŋį”¨ã™ã‚‹ã¨ã€RAID5と同様ãĢã€å˜ä¸€ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰ 垊旧できぞす。 RAID6と同様ãĢã€ã‚ˆã‚Šå¤šããŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰åžŠæ—§ã—ãŸã„å ´åˆã¯ã€ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢčŋŊåŠ ãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ įĸēäŋã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’čŋŊåŠ ã™ã‚‹ãŸãŗãĢã€åžŠæ—§ã§ãã‚‹ãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒ1つåĸ—えぞす。 パãƒĒãƒ†ã‚Ŗæƒ…å ąã¯ã‚ĸãƒŦイ内ぎ**最大ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯**ぎã‚ĩイã‚ēãĢぞでåĸ—える可čƒŊ性があるため、 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã¨ã—ãĻは、ã‚ĸãƒŦイ内ぎ**æœ€å¤§ãŽãƒ‡ã‚Ŗã‚šã‚¯**を選択するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯ã€`parity` ãƒ•ã‚Ąã‚¤ãƒĢぎäŋå­˜å°‚ᔍãĢãĒりぞす。 **デãƒŧã‚ŋをäŋå­˜ã—ãĒいでください**。 æŦĄãĢ、SnapRAIDでäŋč­ˇã—たい `data` ãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŽšįžŠã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢåĢぞれるデãƒŧã‚ŋãŒã‚ãŖãŸãĢ変更されãĒい場合ãĢ、äŋč­ˇãŒæœ€ã‚‚åŠšæžœįš„ã§ã™ã€‚ こぎため、WindowsぎC:\ãƒ‡ã‚Ŗã‚šã‚¯ã‚„Unixぎ/home、/var、/tmpãƒ‡ã‚ŖãƒŦクトãƒĒをåĢめãĒい斚が č‰¯ã„ã§ã—ã‚‡ã†ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¯ `content` ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã•れ、通常はデãƒŧã‚ŋ、パãƒĒãƒ†ã‚Ŗã€ãžãŸã¯ ブãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ãĢäŋå­˜ã•れぞす。 ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢãĢは、バックã‚ĸãƒƒãƒ—ãŽčŠŗį´°ã¨ã€ããŽæ•´åˆæ€§ã‚’æ¤œč¨ŧするためぎすずãĻぎ チェックã‚ĩムがåĢぞれãĻいぞす。 `content` ãƒ•ã‚Ąã‚¤ãƒĢは**č¤‡æ•°ãŽã‚ŗãƒ”ãƒŧ**でäŋå­˜ã•ã‚Œã€č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŒį™ēį”Ÿã—ãŸå ´åˆã§ã‚‚ã€ 少ãĒくとも1ã¤ãŽã‚ŗãƒ”ãƒŧãŒåˆŠį”¨å¯čƒŊであることをäŋč¨ŧするためãĢ、**å„ã‚ŗãƒ”ãƒŧã¯į•°ãĒã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãĢ** 配įŊŽã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ たとえば、1ãƒŦベãƒĢぎパãƒĒãƒ†ã‚Ŗäŋč­ˇãŽãŋãĢé–ĸåŋƒãŒã‚ã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæŦĄãŽå ´æ‰€ãĢあるとしぞす。 /mnt/diskp <- パãƒĒãƒ†ã‚Ŗį”¨ãĢé¸æŠžã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ /mnt/disk1 <- äŋč­ˇã™ã‚‹æœ€åˆãŽãƒ‡ã‚Ŗã‚šã‚¯ /mnt/disk2 <- äŋč­ˇã™ã‚‹2į•Ēį›ŽãŽãƒ‡ã‚Ŗã‚šã‚¯ /mnt/disk3 <- äŋč­ˇã™ã‚‹3į•Ēį›ŽãŽãƒ‡ã‚Ŗã‚šã‚¯ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢ `/etc/snapraid.conf` をæŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§äŊœæˆã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ WindowsをäŊŋį”¨ã—ãĻã„ã‚‹å ´åˆã¯ã€ã‚šãƒŠãƒƒã‚ˇãƒĨではãĒããƒ‰ãƒŠã‚¤ãƒ–æ–‡å­—ã¨ãƒãƒƒã‚¯ã‚šãƒŠãƒƒã‚ˇãƒĨを äŊŋį”¨ã—ãŸWindowsぎパ゚åŊĸåŧã‚’äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ ãƒ‡ã‚Ŗã‚šã‚¯ãŒå¤šããĻドナイブ文字が不čļŗã™ã‚‹å ´åˆã¯ã€ã‚ĩブフりãƒĢダãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’ į›´æŽĨマã‚Ļãƒŗãƒˆã§ããžã™ã€‚å‚į…§īŧš https://www.google.com/search?q=Windows+mount+point ã“ãŽæ™‚į‚šã§ã€ãƒ‘ãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’æ§‹į¯‰ã™ã‚‹ãŸã‚ãĢ `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã™ã‚‹æē–備が整いぞした。 snapraid sync こぎプロã‚ģ゚は、æ—ĸãĢãƒ‡ã‚Ŗã‚šã‚¯ãĢ存在するデãƒŧã‚ŋぎã‚ĩイã‚ēãĢåŋœã˜ãĻ、初回は数時間かかる å ´åˆãŒã‚ã‚Šãžã™ã€‚ãƒ‡ã‚Ŗã‚šã‚¯ãŒįŠēぎ場合は、プロã‚ģã‚šã¯åŗåē§ãĢ厌äē†ã—ぞす。 Ctrl+CをæŠŧすことでいつでも停æ­ĸでき、æŦĄå›žãŽåŽŸčĄŒæ™‚ãĢは中断された場所から再開されぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ãŒåŽŒäē†ã™ã‚‹ã¨ã€ãƒ‡ãƒŧã‚ŋは**SAFE**ãĢãĒりぞす。 これで、ã‚ĸãƒŦイをč‡Ēį”ąãĢäŊŋã„å§‹ã‚ã€åŽšæœŸįš„ãĢ `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’ 更新できぞす。 4.1 Scrubbing ------------- デãƒŧã‚ŋとパãƒĒãƒ†ã‚ŖãŽã‚¨ãƒŠãƒŧã‚’åŽšæœŸįš„ãĢチェックするãĢは、`scrub` ã‚ŗãƒžãƒŗãƒ‰ã‚’ åŽŸčĄŒã§ããžã™ã€‚ snapraid scrub ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€é…åˆ—å†…ãŽãƒ‡ãƒŧã‚ŋを `sync` ã‚ŗãƒžãƒŗãƒ‰ä¸­ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨと比čŧƒã—ãĻ、 整合性を検č¨ŧしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã‚’1å›žåŽŸčĄŒã™ã‚‹ã¨ã€å‰å›žãŽ10æ—Ĩ間でæ—ĸãĢ゚クナブされたデãƒŧã‚ŋを除いãĻ、 ã‚ĸãƒŦã‚¤ãŽį´„8%がチェックされぞす。 -p, --plan ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻį•°ãĒる量を指厚でき、 -o, --older-than ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻį•°ãĒるįĩŒéŽæ—Ĩ数で 指厚できぞす。 たとえば、20æ—ĨäģĨ上įĩŒéŽã—たブロックぎ5%をチェックするãĢは、æŦĄãŽã‚ˆã†ãĢäŊŋį”¨ã—ãžã™ã€‚ snapraid -p 5 -o 20 scrub プロã‚ģ゚中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€ 寞åŋœã™ã‚‹ãƒ–ロックは `content` ãƒ•ã‚Ąã‚¤ãƒĢå†…ã§ä¸č‰¯ã¨ã—ãĻマãƒŧクされ、 `status` ã‚ŗãƒžãƒŗãƒ‰ã§ä¸€čĻ§čĄ¨į¤ēされぞす。 snapraid status それらをäŋŽæ­Ŗã™ã‚‹ãĢは、-e, --filter-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãĻ、 `fix` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ snapraid -e fix æŦĄå›žãŽ `scrub` で、エナãƒŧがæœŦåŊ“ãĢäŋŽæ­Ŗã•れãĻいれば、`status` ãƒŦポãƒŧトから エナãƒŧはæļˆãˆãžã™ã€‚よりéĢ˜é€ŸãĢするためãĢ、`-p bad` をäŊŋį”¨ã—ãĻä¸č‰¯ã¨ã—ãĻマãƒŧクされた ブロックぎãŋを゚クナブできぞす。 snapraid -p bad scrub æœĒ同期ぎã‚ĸãƒŦイで `scrub` ã‚’åŽŸčĄŒã™ã‚‹ã¨ã€å‰Šé™¤ãžãŸã¯å¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ˆãŖãĻ åŧ•きčĩˇã“されたエナãƒŧãŒå ąå‘Šã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚¨ãƒŠãƒŧは `scrub` ぎ å‡ēåŠ›ã§å ąå‘Šã•ã‚Œãžã™ãŒã€é–ĸé€Ŗã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞせん。 4.2 Pooling ----------- æŗ¨: ここでčĒŦ明するプãƒŧãƒĒãƒŗã‚°æŠŸčƒŊは、**mergerfs** ツãƒŧãƒĢãĢå–ãŖãĻäģŖã‚ã‚‰ã‚Œãžã—た。 mergerfs は、SnapRAIDã‚ŗãƒŸãƒĨãƒ‹ãƒ†ã‚ŖãŽLinuxãƒĻãƒŧã‚ļãƒŧãĢ推åĨ¨ã•れるã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã™ã€‚ Mergefs ã¯ã€č¤‡æ•°ãŽãƒ‰ãƒŠã‚¤ãƒ–ã‚’å˜ä¸€ãŽįĩąåˆã•れたマã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆãĢプãƒŧãƒĢするためぎ、 より柔čģŸã§åŠšįŽ‡įš„ãĒæ–šæŗ•ã‚’æäž›ã—ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ãĢé ŧることãĒくã‚ĸãƒŦイ全äŊ“ぎ ãƒ•ã‚Ąã‚¤ãƒĢãĢã‚ˇãƒŧムãƒŦ゚ãĢã‚ĸクã‚ģ゚できぞす。これは、パãƒĒãƒ†ã‚Ŗäŋč­ˇãŽãŸã‚ãĢSnapRAIDと うぞくįĩąåˆã•れãĻおり、OpenMediaVault (OMV) やã‚Ģ゚ã‚ŋムNAS構成ãĒおぎã‚ģットã‚ĸップで 一čˆŦįš„ãĢäŊŋį”¨ã•ã‚ŒãĻいぞす。 ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒツãƒĒãƒŧãĢ襨į¤ēさせるãĢは、 `pooling` 抟čƒŊを有劚ãĢã§ããžã™ã€‚ã“ã‚Œã¯ã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’äŊŋį”¨ã—ãĻ、 ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎčĒ­ãŋå–ã‚Šå°‚į”¨ãŽäģŽæƒŗãƒ“ãƒĨãƒŧをäŊœæˆã—ぞす。 æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで `pooling` ãƒ‡ã‚ŖãƒŦクトãƒĒをæŦĄãŽã‚ˆã†ãĢ構成できぞす。 pool /pool ぞたは、Windowsぎ場合は、æŦĄãŽã‚ˆã†ãĢしぞす。 pool C:\pool そしãĻ、`pool` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻäģŽæƒŗãƒ“ãƒĨãƒŧをäŊœæˆãžãŸã¯æ›´æ–°ã—ぞす。 snapraid pool UnixプナットフりãƒŧムをäŊŋį”¨ã—ãĻãŠã‚Šã€ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをWindowsぞたはUnixãƒžã‚ˇãƒŗãĢ ネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã—たい場合は、`/etc/samba/smb.conf` ãĢæŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ čŋŊ加するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ # smb.conf ぎ global ã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§ unix extensions = no # smb.conf ぎ share ã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§ [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes Windowsでは、ネットワãƒŧクįĩŒį”ąã§ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’å…ąæœ‰ã™ã‚‹ãĢは、クナイã‚ĸãƒŗãƒˆãŒ それらをãƒĒãƒĸãƒŧãƒˆã§č§Ŗæąēするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ã“ã‚Œã‚’æœ‰åŠšãĢするãĢは、プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒを å…ąæœ‰ã™ã‚‹ã“ã¨ãĢ加えãĻã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãŸ**ãƒ‡ã‚Ŗã‚šã‚¯å**ã‚’å…ąæœ‰ãƒã‚¤ãƒŗãƒˆã¨ã—ãĻ äŊŋį”¨ã—ãĻ、**すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’å€‹åˆĨãĢ**å…ąæœ‰ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãžãŸã€ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆãŒ ã“ã‚Œã‚‰ãŽå…ąæœ‰ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ĸクã‚ģ゚するためãĢäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚‹Windows UNCパ゚を、 æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢぎ `share` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ たとえば、`darkstar` という名前ぎã‚ĩãƒŧバãƒŧで操äŊœã—ãĻいる場合、æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã§ããžã™ã€‚ data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar そしãĻ、æŦĄãŽãƒ‡ã‚ŖãƒŦクトãƒĒをネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã—ぞす。 \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array これãĢより、ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆã¯ `\\darkstar\pool` ですずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢãĢ ã‚ĸクã‚ģ゚できるようãĢãĒりぞす。 ぞた、ãƒĒãƒĸãƒŧトクナイã‚ĸãƒŗãƒˆãŒãƒĒãƒĸãƒŧãƒˆã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¸ãŽã‚ĸクã‚ģ゚を有劚ãĢするためãĢ、 æŦĄãŽã‚ŗãƒžãƒŗãƒ‰ã§æ§‹æˆã™ã‚‹åŋ…čĻãŒã‚ã‚‹å ´åˆã‚‚ã‚ã‚Šãžã™ã€‚ fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAIDはRAIDã‚ˇã‚šãƒ†ãƒ ã‚ˆã‚Šã‚‚ãƒãƒƒã‚¯ã‚ĸッププログナムぎようãĢ抟čƒŊし、 -f, --filter ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻãƒ•ã‚Ąã‚¤ãƒĢをäģĨ前ぎįŠļ態ãĢåžŠå…ƒãžãŸã¯å‰Šé™¤č§Ŗé™¤ã™ã‚‹ãŸã‚ãĢ äŊŋį”¨ã§ããžã™ã€‚ snapraid fix -f FILE ãžãŸã¯ãƒ‡ã‚ŖãƒŦクトãƒĒぎ場合はīŧš snapraid fix -f DIR/ ぞた、-m, --filter-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€ãƒ‡ã‚ŖãƒŦクトãƒĒ内ぎ**čĒ¤ãŖãĻå‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎãŋ**を 垊旧するためãĢäŊŋį”¨ã™ã‚‹ã“ã¨ã‚‚ã§ããžã™ã€‚ã“ã‚ŒãĢより、不čļŗã—ãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが垊元され、 äģ–ãŽãƒ•ã‚Ąã‚¤ãƒĢはすずãĻそぎぞぞ掋されぞす。 snapraid fix -m -f DIR/ ぞたは、すずãĻぎドナイブ上ぎすずãĻãŽå‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢを垊旧するãĢはīŧš snapraid fix -m 4.4 Recovering -------------- 最æ‚Ēぎä狿…‹ãŒį™ēį”Ÿã—ã€1台äģĨä¸ŠãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’å¤ąã„ãžã—ãŸīŧ **パニックãĢãĒらãĒいでくださいīŧ** 垊旧できぞすīŧ 最初ãĢčĄŒã†ãšãã“ã¨ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイへぎ**さらãĒる変更をéŋける**ことです。 ãƒĒãƒĸãƒŧトæŽĨįļšã€ãŠã‚ˆãŗã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたSnapRAIDぎ夜間 `sync` や `scrub` をåĢむ、 すずãĻãŽã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたプロã‚ģã‚šã‚’į„ĄåŠšãĢしãĻください。 æŦĄãĢ、æŦĄãŽæ‰‹é †ãĢ進ãŋぞす。 ---- 4.4.1 STEP 1 -> Reconfigure ---- 垊旧ぎためãĢいくらかぎ゚ペãƒŧ゚がåŋ…čĻã§ã™ã€‚į†æƒŗįš„ãĢはčŋŊ加ぎ äēˆå‚™ãƒ‡ã‚Ŗã‚šã‚¯ã§ã™ãŒã€å¤–部USBãƒ‡ã‚Ŗã‚šã‚¯ã‚„ãƒĒãƒĸãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ã§ã‚‚ååˆ†ã§ã™ã€‚ SnapRAIDãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを変更しãĻã€æ•…éšœã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽ `data` ぞたは `parity` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ã€ãƒ•ã‚Ąã‚¤ãƒĢを垊旧するためぎ十分ãĒįŠēき厚量ぎある場所ãĢ 向けぞす。 ãŸã¨ãˆã°ã€ãƒ‡ã‚Ŗã‚šã‚¯ `d1` が故障した場合、æŦĄãŽã‚ˆã†ãĢ変更しぞす。 data d1 /mnt/disk1/ からīŧš data d1 /mnt/new_spare_disk/ åžŠæ—§ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãŒãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆã¯ã€éŠåˆ‡ãĒ `parity` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ 更新しぞす。 č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻいる場合は、すずãĻぎ構成ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æ›´æ–°ã—ãžã™ã€‚ ---- 4.4.2 STEP 2 -> Fix ---- ãƒ­ã‚°ã‚’å¤–éƒ¨ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ãĻ、`fix` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãžã™ã€‚ snapraid -d NAME -l fix.log fix ここで NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã§ã‚ã‚Šã€å‰ãŽäž‹ã§ã¯ `d1` ぎようãĒもぎです。 åžŠæ—§ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ãŒãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆã¯ã€`parity`、`2-parity` ãĒおぎ 名前をäŊŋį”¨ã—ãžã™ã€‚ č¤‡æ•°ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻã„ã‚‹å ´åˆã¯ã€č¤‡æ•°ãŽ `-d` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ すずãĻを指厚しぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯æ™‚é–“ãŒã‹ã‹ã‚Šãžã™ã€‚ `fix.log` ãƒ•ã‚Ąã‚¤ãƒĢをäŋå­˜ã™ã‚‹ãŸã‚ãĢ数ゎã‚ŦバイトぎįŠēき厚量があることをįĸēčĒã—ãĻください。 十分ãĒįŠēãåŽšé‡ãŽã‚ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰åŽŸčĄŒã—ãĻください。 これで、垊旧可čƒŊãĒすずãĻãŽã‚‚ãŽãŒåžŠæ—§ã•ã‚Œãžã—ãŸã€‚ä¸€éƒ¨ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒéƒ¨åˆ†įš„ãžãŸã¯åŽŒå…¨ãĢ 垊旧できãĒい場合、それらは `.unrecoverable` æ‹Ąåŧĩ子をčŋŊ加しãĻ名前が変更されぞす。 `fix.log` ãƒ•ã‚Ąã‚¤ãƒĢで、`unrecoverable:` で始ぞるすずãĻãŽčĄŒã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã€ すずãĻぎ垊旧不čƒŊãĒãƒ–ãƒ­ãƒƒã‚¯ãŽčŠŗį´°ãĒãƒĒ゚トをčĻ‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ 垊旧ãĢæē€čļŗã§ããĒい場合は、äŊ•åēĻでも再čŠĻčĄŒã§ããžã™ã€‚ たとえば、最垌ぎ `sync` ぎ垌ãĢã‚ĸãƒŦã‚¤ã‹ã‚‰ãƒ•ã‚Ąã‚¤ãƒĢを削除した場合、 これãĢã‚ˆã‚Šä¸€éƒ¨ãŽãƒ•ã‚Ąã‚¤ãƒĢが垊旧されãĒい可čƒŊ性がありぞす。 こぎ場合、-i, --import ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢãŒįžåœ¨ãŠã“ãĢあるかを指厚することで、 垊旧プロã‚ģ゚ãĢそれらを再åēĻåĢめるようãĢ `fix` を再čŠĻčĄŒã§ããžã™ã€‚ 垊旧ãĢæē€čļŗã—ãĻいる場合は、さらãĢé€˛ã‚€ã“ã¨ãŒã§ããžã™ãŒã€**sync** ãŽåŽŸčĄŒåžŒãĢは `fix` ã‚ŗãƒžãƒŗãƒ‰ã‚’**再čŠĻčĄŒã§ããĒい**ことãĢæŗ¨æ„ã—ãĻくださいīŧ ---- 4.4.3 STEP 3 -> Check ---- 慎重ãĒチェックとしãĻ、`check` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻã€åžŠæ—§ã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽ すずãĻãŒæ­Ŗã—ã„ã“ã¨ã‚’įĸēčĒã§ããžã™ã€‚ snapraid -d NAME -a check ここで NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã§ã‚ã‚Šã€å‰ãŽäž‹ã§ã¯ `d1` ぎようãĒもぎです。 `-d` ãŠã‚ˆãŗ `-a` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€SnapRAIDãĢ**æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋ**をチェックし、 **すずãĻぎパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã‚’į„ĄčĻ–**するようãĢ指į¤ēしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯æ™‚é–“ãŒã‹ã‹ã‚Šãžã™ãŒã€éŽåēĻãĢ慎重でãĒい場合ぱキップできぞす。 ---- 4.4.4 STEP 4 -> Sync ---- `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã—ãĻ、ã‚ĸãƒŦã‚¤ã‚’æ–°ã—ã„ãƒ‡ã‚Ŗã‚šã‚¯ã¨å†åŒæœŸã—ãžã™ã€‚ snapraid sync すずãĻが垊旧されãĻã„ã‚Œã°ã€ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯åŗåē§ãĢ厌äē†ã—ぞす。 5 COMMANDS ========== SnapRAIDは、æŦĄãŽã“とを可čƒŊãĢã™ã‚‹ã„ãã¤ã‹ãŽį°Ąå˜ãĒã‚ŗãƒžãƒŗãƒ‰ã‚’æäž›ã—ãžã™ã€‚ * ã‚ĸãƒŦイぎįŠļ態ぎæĻ‚čĻã‚’å‡ē力 -> `status` * ãƒ‡ã‚Ŗã‚šã‚¯ãŽåˆļåžĄ -> `smart`、`probe`、`up`、`down` * バックã‚ĸップ/ã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãŽäŊœæˆ -> `sync` * デãƒŧã‚ŋãŽåŽšæœŸįš„ãĒチェック -> `scrub` * 最垌ぎバックã‚ĸップ/ã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãŽåžŠå…ƒ -> `fix`。 ã‚ŗãƒžãƒŗãƒ‰ã¯**小文字**ã§č¨˜čŋ°ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ 5.1 status ---------- ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎįŠļ態ぎæĻ‚čĻã‚’å‡ē力しぞす。 これãĢは、パãƒĒãƒ†ã‚ŖãŽæ–­į‰‡åŒ–ã€ãƒã‚§ãƒƒã‚¯ãĒã—ã§ãŽãƒ–ãƒ­ãƒƒã‚¯ãŽå¤ã•ã€ãŠã‚ˆãŗ ã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°ä¸­ãĢ遭遇したすずãĻãŽč¨˜éŒ˛ã•ã‚ŒãŸã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧãĢé–ĸã™ã‚‹æƒ…å ąãŒ åĢぞれぞす。 提į¤ēã•ã‚Œã‚‹æƒ…å ąã¯ã€æœ€åžŒãĢ `sync` ã‚’åŽŸčĄŒã—ãŸæ™‚į‚šãŽã‚‚ãŽã§ã™ã€‚ それäģĨé™ãŽå¤‰æ›´ã¯č€ƒæ…Žã•ã‚Œãžã›ã‚“ã€‚ ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ãŒæ¤œå‡ēされた場合、それらぎブロックį•ĒåˇãŒä¸€čĻ§čĄ¨į¤ēされぞす。 それらをäŋŽæ­Ŗã™ã‚‹ãĢは、`fix -e` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ ぞた、各ブロックが最垌ãĢ゚クナブぞたは同期された時期をį¤ēã™ã‚°ãƒŠãƒ•ã‚‚čĄ¨į¤ēされぞす。 ゚クナブされたブロックは `*` で、同期されたがぞだ゚クナブされãĻいãĒいブロックは `o` で į¤ēされぞす。 äŊ•も変更されぞせん。 5.2 smart --------- ã‚ˇã‚šãƒ†ãƒ å†…ãŽã™ãšãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTãƒŦポãƒŧトをå‡ē力しぞす。 これãĢは、įŋŒåš´ãŽæ•…éšœįĸēįŽ‡ãŽæŽ¨åŽšå€¤ãŒåĢぞれãĻãŠã‚Šã€į–‘ã‚ã—ã„åąžæ€§ã‚’į¤ēã™ãƒ‡ã‚Ŗã‚šã‚¯ãŽ ãƒĄãƒŗãƒ†ãƒŠãƒŗã‚šä礿›ã‚’č¨ˆį”ģできぞす。 こぎįĸēįŽ‡æŽ¨åŽšã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTåąžæ€§ã‚’æŦĄãŽå ´æ‰€ã§åˆŠį”¨å¯čƒŊãĒBackblazeぎデãƒŧã‚ŋと ᛏé–ĸさせることで垗られぞす。 https://www.backblaze.com/hard-drive-test-data.html SMARTãŒãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻã„ã‚‹ã¨å ąå‘Šã—ãŸå ´åˆã€ããŽãƒ‡ã‚Ŗã‚šã‚¯ãĢ寞しãĻ `FAIL` ぞたは `PREFAIL` が å‡ē力され、SnapRAIDはエナãƒŧをčŋ”しぞす。 こぎ場合、**ãƒ‡ã‚Ŗã‚šã‚¯ãŽåŗæ™‚ä礿›**がåŧˇãæŽ¨åĨ¨ã•れぞす。 そぎäģ–ぎ可čƒŊãĒ゚テãƒŧã‚ŋ゚文字列はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ logfail - 過åŽģãĢã€ä¸€éƒ¨ãŽåąžæ€§ãŒã—ãã„å€¤ã‚ˆã‚Šã‚‚äŊŽã‹ãŖãŸã€‚ logerr - デバイ゚ぎエナãƒŧログãĢエナãƒŧがåĢぞれãĻいる。 selferr - デバイ゚ぎã‚ģãƒĢフテ゚トログãĢエナãƒŧがåĢぞれãĻいる。 -v, --verbose ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻã„ã‚‹å ´åˆã€ã‚ˆã‚ŠčŠŗį´°ãĒįĩąč¨ˆåˆ†æžãŒæäž›ã•れぞす。 こぎ分析は、より多くぞたはより少ãĒいパãƒĒãƒ†ã‚ŖãŒåŋ…čĻã‹ãŠã†ã‹ã‚’æąē厚するぎãĢåŊšįĢ‹ãĄãžã™ã€‚ ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ `smartctl` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で `smartctl -a` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ ãƒ‡ãƒã‚¤ã‚šãŒæ­Ŗã—ãč‡Ē動検å‡ēされãĒã„å ´åˆã¯ã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで `smartctl` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã—ãĻã‚Ģ゚ã‚ŋãƒ ã‚ŗãƒžãƒŗãƒ‰ã‚’æŒ‡åŽšã§ããžã™ã€‚ äŊ•も変更されぞせん。 5.3 probe --------- ã‚ˇã‚šãƒ†ãƒ å†…ãŽã™ãšãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽPOWERįŠļ態をå‡ē力しぞす。 `Standby` ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻいãĒã„ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚`Active` は ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻã„ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ `smartctl` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で `smartctl -n standby -i` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ ãƒ‡ãƒã‚¤ã‚šãŒæ­Ŗã—ãč‡Ē動検å‡ēされãĒã„å ´åˆã¯ã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢで `smartctl` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã—ãĻã‚Ģ゚ã‚ŋãƒ ã‚ŗãƒžãƒŗãƒ‰ã‚’æŒ‡åŽšã§ããžã™ã€‚ äŊ•も変更されぞせん。 5.4 up ------ ã‚ĸãƒŦイぎすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã‚šãƒ”ãƒŗã‚ĸップしぞす。 -d, --filter-disk ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į‰šåŽšãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋã‚’ã‚šãƒ”ãƒŗã‚ĸップできぞす。 すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŒæ™‚ãĢã‚šãƒ”ãƒŗã‚ĸップするãĢは、多くぎé›ģ力がåŋ…čĻã§ã™ã€‚ é›ģæēãŒãã‚ŒãĢč€ãˆã‚‰ã‚Œã‚‹ã“ã¨ã‚’įĸēčĒã—ãĻください。 äŊ•も変更されぞせん。 5.5 down -------- ã‚ĸãƒŦイぎすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãžã™ã€‚ ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ `smartctl` ツãƒŧãƒĢをäŊŋį”¨ã—ã€ã™ãšãĻぎデバイ゚で `smartctl -s standby,now` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨ åŒį­‰ã§ã™ã€‚ -d, --filter-disk ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į‰šåŽšãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽãŋã‚’ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã§ããžã™ã€‚ エナãƒŧ時ãĢč‡Ēå‹•įš„ãĢã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã™ã‚‹ãĢは、äģ–ぎäģģæ„ãŽã‚ŗãƒžãƒŗãƒ‰ã§ -s, --spin-down-on-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã§ããžã™ã€‚ã“ã‚Œã¯ã€ã‚¨ãƒŠãƒŧがį™ēį”Ÿã—ãŸã¨ããĢ手動で `down` ã‚’åŽŸčĄŒã™ã‚‹ãŽã¨åŒį­‰ã§ã™ã€‚ äŊ•も変更されぞせん。 5.6 diff -------- 最垌ぎ `sync` äģĨ降ãĢ変更され、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã‚’å†č¨ˆįŽ—ã™ã‚‹åŋ…čĻãŒã‚ã‚‹ã™ãšãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを 一čĻ§čĄ¨į¤ēしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋã¯ãƒã‚§ãƒƒã‚¯ã›ãšã€ãƒ•ã‚Ąã‚¤ãƒĢぎã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ã‚ĩイã‚ē、 ãŠã‚ˆãŗinodeぎãŋをチェックしぞす。 変更されたすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを一čĻ§čĄ¨į¤ēした垌、変更ぎæĻ‚čĻãŒ æŦĄãŽã‚ˆã†ãĢグãƒĢãƒŧプ化されãĻ提į¤ēされぞす。 equal - 変更されãĻいãĒã„ãƒ•ã‚Ąã‚¤ãƒĢ。 added - äģĨ前は存在しãĒã‹ãŖãŸčŋŊåŠ ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 removed - å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 updated - ã‚ĩイã‚ēぞたはã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒį•°ãĒã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ。これは、 å¤‰æ›´ã•ã‚ŒãŸã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ moved - åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽį•°ãĒã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 同じ名前、ã‚ĩイã‚ē、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ã€ãŠã‚ˆãŗinodeã‚’æŒãĄãžã™ãŒã€ãƒ‡ã‚ŖãƒŦクトãƒĒが į•°ãĒã‚‹ã“ã¨ã§č­˜åˆĨされぞす。 copied - å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢãŒãžã å­˜åœ¨ã™ã‚‹ã€åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ãžãŸã¯åˆĨぎ ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 これらは、同じ名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’æŒã¤ã“ã¨ ãĢã‚ˆãŖãĻ識åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロぎ場合、名前だけでãĒくフãƒĢパ゚ ãŒä¸€č‡´ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ relocated - ã‚ĒãƒĒジナãƒĢがæļˆå¤ąã—ãŸã€åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ãžãŸã¯åˆĨãŽãƒ‡ã‚Ŗ ゚クãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ。 これらは、同じ名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’æŒã¤ã“ã¨ ãĢã‚ˆãŖãĻ識åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧãƒ­ãŽå ´åˆã€č­˜åˆĨするãĢはフãƒĢパ゚が ä¸€č‡´ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽ 'moved' ãƒ•ã‚Ąã‚¤ãƒĢã¨ã¯į•°ãĒり、再配įŊŽã•れた ãƒ•ã‚Ąã‚¤ãƒĢã¯į•°ãĒる inode ã‚’æŒãĄãžã™ã€‚ restored - inode ã¯į•°ãĒã‚‹ãŒã€ãƒ‡ã‚ŖãƒŦクトãƒĒ、名前、ã‚ĩイã‚ē、お ã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ。 これらは通常、削除された垌ãĢåžŠå…ƒã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢです。 `sync` がåŋ…čρãĒ場合、プロã‚ģ゚はデフりãƒĢトぎ0ではãĒく、ãƒĒã‚ŋãƒŧãƒŗã‚ŗãƒŧド2をčŋ”しぞす。 ãƒĒã‚ŋãƒŧãƒŗã‚ŗãƒŧド1は、一čˆŦįš„ãĒエナãƒŧįŠļ態ãĢäŊŋį”¨ã•ã‚Œãžã™ã€‚ äŊ•も変更されぞせん。 5.7 sync -------- パãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’æ›´æ–°ã—ãžã™ã€‚ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎすずãĻãŽå¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢがčĒ­ãŋ取られ、 寞åŋœã™ã‚‹ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋが更新されぞす。 Ctrl+CをæŠŧすことでいつでもこぎプロã‚ģ゚を停æ­ĸでき、 æ—ĸãĢ厌äē†ã—たäŊœæĨ­ã‚’å¤ąã†ã“ã¨ã¯ã‚ã‚Šãžã›ã‚“ã€‚ æŦĄå›žãŽåŽŸčĄŒæ™‚ãĢは、`sync` プロã‚ģ゚は中断された場所から 再開されぞす。 プロã‚ģ゚中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€ 寞åŋœã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢã¯ãƒ‘ã‚šãŠã‚ˆãŗ/ぞたはinodeãĢã‚ˆãŖãĻ識åˆĨされ、ã‚ĩイã‚ēとã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĢã‚ˆãŖãĻ チェックされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēぞたはã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒį•°ãĒる場合、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã¯ãƒ•ã‚Ąã‚¤ãƒĢ全äŊ“で å†č¨ˆįŽ—ã•ã‚Œãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢãŒåŒã˜ãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§į§ģ動ぞたは名前が変更され、同じinodeがäŋæŒã•れãĻいる場合、 パãƒĒãƒ†ã‚Ŗã¯å†č¨ˆįŽ—ã•ã‚Œãžã›ã‚“ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢがåˆĨãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢį§ģ動された場合、パãƒĒãƒ†ã‚Ŗã¯å†č¨ˆįŽ—ã•ã‚Œãžã™ãŒã€ äģĨ前ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨæƒ…å ąã¯äŋæŒã•れぞす。 `content` ãƒ•ã‚Ąã‚¤ãƒĢと `parity` ãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 5.8 scrub --------- ã‚ĸãƒŦイを゚クナブし、デãƒŧã‚ŋãŠã‚ˆãŗãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧを チェックしぞす。 1回ぎå‘ŧãŗå‡ēしごとãĢ、最垌ぎ10æ—Ĩ間でæ—ĸãĢ゚クナブされたデãƒŧã‚ŋを除いãĻ、 ã‚ĸãƒŦã‚¤ãŽį´„8%がチェックされぞす。 ã“ã‚Œã¯ã€é€ąãĢ1å›žã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°ã‚’åŽŸčĄŒã™ã‚‹ã¨ã€ã™ãšãĻぎデãƒŧã‚ŋが少ãĒくとも3か月ãĢ1回は ãƒã‚§ãƒƒã‚¯ã•ã‚Œã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ -p, --plan ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻã€į•°ãĒã‚‹ã‚šã‚¯ãƒŠãƒ–ãƒ—ãƒŠãƒŗãžãŸã¯é‡ã‚’åŽšįžŠã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯äģĨ下を受けå…Ĩれぞす。 bad - ä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックを゚クナブしぞす。 new - ぞだ゚クナブされãĻいãĒい、同期されたばかりぎブロックを゚クナブしぞす。 full - すずãĻを゚クナブしぞす。 0-100 - 指厚されたパãƒŧã‚ģãƒŗãƒ†ãƒŧジぎブロックを゚クナブしぞす。 パãƒŧã‚ģãƒŗãƒ†ãƒŧジぎ量を指厚する場合、-o, --older-than ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ、 ブロックがおれくらいぎ古さであるåŋ…čĻãŒã‚ã‚‹ã‹ã‚’åŽšįžŠã™ã‚‹ã“ã¨ã‚‚ã§ããžã™ã€‚ 最も古いブロックが最初ãĢ゚クナブされ、最遊ãĒチェックがäŋč¨ŧされぞす。 ぞだ゚クナブされãĻいãĒい、同期されたばかりぎブロックぎãŋを゚クナブしたい場合は、 `-p new` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ ゚クナブ゚テãƒŧã‚ŋã‚šãŽčŠŗį´°ã‚’å–åž—ã™ã‚‹ãĢは、`status` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãžã™ã€‚ čĻ‹ã¤ã‹ãŖãŸã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたはå…Ĩå‡ē力エナãƒŧごとãĢ、寞åŋœã™ã‚‹ãƒ–ロックは `content` ãƒ•ã‚Ąã‚¤ãƒĢå†…ã§ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞす。 ã“ã‚Œã‚‰ãŽä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã¯ `status` で一čĻ§čĄ¨į¤ēされ、`fix -e` でäŋŽæ­Ŗã§ããžã™ã€‚ äŋŽæ­ŖåžŒã€æŦĄå›žãŽã‚šã‚¯ãƒŠãƒ–で再チェックされ、äŋŽæ­Ŗã•れãĻいると判明した場合、 ä¸č‰¯ãƒžãƒŧクは削除されぞす。 ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ãŽãŋを゚クナブするãĢは、`scrub -p bad` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã§ããžã™ã€‚ æœĒ同期ぎデãƒŧã‚ŋãĢã‚ˆãŖãĻåŧ•きčĩˇã“ã•ã‚ŒãŸå ąå‘Šã•ã‚ŒãŸã‚¨ãƒŠãƒŧをéŋけるためãĢ、 `scrub` は**同期された**ã‚ĸãƒŦイでぎãŋåŽŸčĄŒã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚¨ãƒŠãƒŧは ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧではãĒいとčĒč­˜ã•ã‚Œã€ãƒ–ãƒ­ãƒƒã‚¯ã¯ä¸č‰¯ã¨ã—ãĻマãƒŧクされぞせんが、 そぎようãĒエナãƒŧã¯ã‚ŗãƒžãƒŗãƒ‰ãŽå‡ēåŠ›ã§å ąå‘Šã•ã‚Œãžã™ã€‚ `content` ãƒ•ã‚Ąã‚¤ãƒĢは、各ブロックぎ最垌ぎチェック時åˆģã‚’æ›´æ–°ã—ã€ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ マãƒŧクするためãĢ変更されぞす。 `parity` ãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 5.9 fix ------- すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŋŽæ­Ŗã—ぞす。 すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋは、最垌ぎ `sync` でäŋå­˜ã•ã‚ŒãŸã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆįŠļ態と 比čŧƒã•れぞす。 違いがčĻ‹ã¤ã‹ãŖãŸå ´åˆã€äŋå­˜ã•ã‚ŒãŸã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆãĢ**元ãĢæˆģされぞす**。 **č­Ļ告īŧ** `fix` ã‚ŗãƒžãƒŗãƒ‰ã¯ã€ã‚¨ãƒŠãƒŧã¨æ„å›ŗįš„ãĒ変更をåŒēåˆĨしぞせん。 ãƒ•ã‚Ąã‚¤ãƒĢぎ_įŠļ態を_最垌ぎ `sync` ãĢ**į„ĄæĄäģļãĢ元ãĢæˆģしぞす**。 äģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいãĒい場合、ã‚ĸãƒŦイ全äŊ“がå‡Ļį†ã•ã‚Œãžã™ã€‚ ãƒ•ã‚ŖãƒĢã‚ŋã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ、操äŊœã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽã‚ĩブã‚ģットを 選択しぞす。 `sync` ãŠã‚ˆãŗ `scrub` 中ãĢä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックぎãŋをäŋŽæ­Ŗã™ã‚‹ãĢは、 -e, --filter-error ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ äģ–ãŽãƒ•ã‚ŖãƒĢã‚ŋã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¨ã¯į•°ãĒり、これは最新ぎ `sync` äģĨ降ãĢ**変更されãĻいãĒい** ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋäŋŽæ­Ŗã‚’éŠį”¨ã—ãžã™ã€‚ SnapRAIDは、äŋŽæ­Ŗã§ããĒいすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎ名前を `.unrecoverable` æ‹Ąåŧĩ子を čŋŊ加しãĻ変更しぞす。 äŋŽæ­Ŗã™ã‚‹å‰ãĢ、ã‚ĸãƒŦイ全äŊ“ãŒã‚šã‚­ãƒŖãƒŗã•ã‚Œã€æœ€åžŒãŽ `sync` 操äŊœäģĨ降ãĢį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢが čĻ‹ã¤ã‘ã‚‰ã‚Œãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢã¯ã€åå‰ã‚’į„ĄčĻ–ã—ãĻã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĢã‚ˆãŖãĻ識åˆĨされ、 åŋ…čρãĢåŋœã˜ãĻ垊旧プロã‚ģ゚でäŊŋį”¨ã•ã‚Œãžã™ã€‚ それらぎいくつかをã‚ĸãƒŦイ外ãĢį§ģ動した場合は、-i, --import ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãĻ ã‚šã‚­ãƒŖãƒŗã™ã‚‹čŋŊåŠ ãŽãƒ‡ã‚ŖãƒŦクトãƒĒを指厚できぞす。 ãƒ•ã‚Ąã‚¤ãƒĢは**パ゚ãĢã‚ˆãŖãĻぎãŋ**識åˆĨされ、inodeãĢã‚ˆãŖãĻã¯č­˜åˆĨされぞせん。 `content` ãƒ•ã‚Ąã‚¤ãƒĢは**変更されぞせん**。 `parity` ãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 ã‚ĸãƒŦã‚¤å†…ãŽãƒ•ã‚Ąã‚¤ãƒĢはåŋ…čρãĢåŋœã˜ãĻ変更されぞす。 5.10 check ---------- すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢとパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋを検č¨ŧしぞす。 `fix` ぎようãĢ抟čƒŊしぞすが、垊旧を**ã‚ˇãƒŸãƒĨãƒŦãƒŧトするだけ**で、ã‚ĸãƒŦイãĢ**変更は書きčžŧぞれぞせん**。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€ä¸ģãĢ垊旧プロã‚ģ゚垌やそぎäģ–ãŽį‰šæŽŠãĒæĄäģļ下でぎ手動検č¨ŧを į›Žįš„ã¨ã—ãĻいぞす。 åŽšæœŸįš„ã§ã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢされたチェックãĢは、`scrub` をäŊŋį”¨ã—ãžã™ã€‚ -a, --audit-only ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ**ãƒãƒƒã‚ˇãƒĨぎãŋ**がチェックされ、 パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋã¯į„ĄčĻ–ã•ã‚Œã‚‹ãŸã‚ã€ãƒã‚§ãƒƒã‚¯ãƒ—ãƒ­ã‚ģ゚が大嚅ãĢéĢ˜é€ŸåŒ–ã•ã‚Œãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢは**パ゚ãĢã‚ˆãŖãĻぎãŋ**識åˆĨされ、inodeãĢã‚ˆãŖãĻã¯č­˜åˆĨされぞせん。 äŊ•も変更されぞせん。 5.11 list --------- 最垌ぎ `sync` ãŽæ™‚į‚šãŽã‚ĸãƒŦイãĢåĢぞれるすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを 一čĻ§čĄ¨į¤ēしぞす。 -v ぞたは --verbose をäŊŋį”¨ã™ã‚‹ã¨ã€ã‚ĩãƒ–į§’ãŽæ™‚é–“ã‚‚čĄ¨į¤ēされぞす。 äŊ•も変更されぞせん。 5.12 dup -------- すずãĻãŽé‡č¤‡ãƒ•ã‚Ąã‚¤ãƒĢを一čĻ§čĄ¨į¤ēã—ãžã™ã€‚ãƒãƒƒã‚ˇãƒĨãŒä¸€č‡´ã™ã‚‹å ´åˆã€2ã¤ãŽãƒ•ã‚Ąã‚¤ãƒĢã¯į­‰ã—ã„ã¨čĻ‹ãĒされぞす。 ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋはčĒ­ãŋ取られず、äē‹å‰ãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨぎãŋがäŊŋį”¨ã•ã‚Œãžã™ã€‚ äŊ•も変更されぞせん。 5.13 pool --------- `pooling` ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイ内ぎすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎäģŽæƒŗãƒ“ãƒĨãƒŧを äŊœæˆãžãŸã¯æ›´æ–°ã—ぞす。 ãƒ•ã‚Ąã‚¤ãƒĢã¯ã‚ŗãƒ”ãƒŧã•ã‚Œãšã€ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã‚’äŊŋį”¨ã—ãĻãƒĒãƒŗã‚¯ã•ã‚Œãžã™ã€‚ 更新時、æ—ĸ存ぎすずãĻãŽã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¨įŠēぎã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒは削除され、 ã‚ĸãƒŦイぎ新しいビãƒĨãƒŧãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚そぎäģ–ãŽé€šå¸¸ãŽãƒ•ã‚Ąã‚¤ãƒĢはそぎぞぞ掋されぞす。 プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒ外はäŊ•も変更されぞせん。 5.14 devices ------------ ã‚ĸãƒŦイでäŊŋį”¨ã•ã‚Œã‚‹äŊŽãƒŦベãƒĢデバイ゚をå‡ē力しぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€ã‚ĸãƒŦイ内ぎデバイ゚ぎé–ĸ逪äģ˜ã‘ã‚’čĄ¨į¤ēし、ä¸ģãĢ゚クãƒĒãƒ—ãƒˆã‚¤ãƒŗã‚ŋãƒŧフェイ゚を į›Žįš„ã¨ã—ãĻいぞす。 最初ぎ2つぎ列は、äŊŽãƒŦベãƒĢデバイ゚IDとパ゚です。 æŦĄãŽ2つぎ列は、é̘ãƒŦベãƒĢデバイ゚IDとパ゚です。 最垌ぎ列は、ã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ ãģとんおぎ場合、ã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ1つぎäŊŽãƒŦベãƒĢデバイ゚がありぞすが、 ã‚ˆã‚Šč¤‡é›‘ãĒ構成では、単一ぎã‚ĸãƒŦã‚¤å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ã§č¤‡æ•°ãŽäŊŽãƒŦベãƒĢデバイ゚が äŊŋį”¨ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šãžã™ã€‚ äŊ•も変更されぞせん。 5.15 touch ---------- ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロãĢč¨­åŽšã•ã‚ŒãĻいるすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢãĢ、äģģæ„ãŽã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ã‚’ č¨­åŽšã—ãžã™ã€‚ これãĢより、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒãģãŧ一意ãĢãĒã‚Šã€é‡č¤‡ãŽå¯čƒŊ性が減るため、 SnapRAIDがį§ģå‹•ãŠã‚ˆãŗã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢをčĒč­˜ã™ã‚‹čƒŊ力が向上しぞす。 ã‚ˆã‚Šå…ˇäŊ“įš„ãĢは、ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロでãĒい場合、į§ģå‹•ãžãŸã¯ã‚ŗãƒ”ãƒŧã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢは、 名前、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒä¸€č‡´ã™ã‚‹å ´åˆãĢãã†ã§ã‚ã‚‹ã¨č­˜åˆĨされぞす。 ã‚ĩãƒ–į§’ãŽã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŒã‚ŧロぎ場合、フãƒĢパ゚、ã‚ĩイã‚ēã€ãŠã‚ˆãŗã‚ŋイム゚ã‚ŋãƒŗãƒ—ãŽã™ãšãĻが ä¸€č‡´ã™ã‚‹å ´åˆãĢぎãŋã‚ŗãƒ”ãƒŧとčĻ‹ãĒされぞす。 į§’į˛žåēĻぎã‚ŋイム゚ã‚ŋãƒŗãƒ—ã¯å¤‰æ›´ã•ã‚ŒãĒã„ãŸã‚ã€ãƒ•ã‚Ąã‚¤ãƒĢぎすずãĻぎæ—Ĩäģ˜ã¨æ™‚åˆģは äŋæŒã•れぞす。 5.16 rehash ----------- ã‚ĸãƒŦイ全äŊ“ぎãƒĒãƒãƒƒã‚ˇãƒĨã‚’ã‚šã‚ąã‚¸ãƒĨãƒŧãƒĢしぞす。 ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯ã€äŊŋį”¨ã•ã‚Œã‚‹ãƒãƒƒã‚ˇãƒĨãŽį¨ŽéĄžã‚’å¤‰æ›´ã—ãžã™ã€‚ã“ã‚Œã¯é€šå¸¸ã€32ãƒ“ãƒƒãƒˆã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰ 64ãƒ“ãƒƒãƒˆã‚ˇã‚šãƒ†ãƒ ãĢã‚ĸップグãƒŦãƒŧドするときãĢ、MurmurHash3からよりéĢ˜é€ŸãĒSpookyHashãĢ 切りæ›ŋえるためãĢčĄŒã‚ã‚Œãžã™ã€‚ æ—ĸãĢ最遊ãĒãƒãƒƒã‚ˇãƒĨをäŊŋį”¨ã—ãĻã„ã‚‹å ´åˆã€ã“ãŽã‚ŗãƒžãƒŗãƒ‰ã¯äŊ•もせず、ã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãŒä¸čĻã§ã‚ã‚‹ã“ã¨ã‚’ 通įŸĨしぞす。 ãƒĒãƒãƒƒã‚ˇãƒĨはすぐãĢã¯åŽŸčĄŒã•ã‚Œãšã€`sync` ãŠã‚ˆãŗ `scrub` ぎ間ãĢ垐々ãĢåŽŸčĄŒã•ã‚Œãžã™ã€‚ `status` をäŊŋį”¨ã—ãĻãƒĒãƒãƒƒã‚ˇãƒĨぎįŠļ態をįĸēčĒã§ããžã™ã€‚ ãƒĒãƒãƒƒã‚ˇãƒĨ中もSnapRAIDは厌全ãĒ抟čƒŊをįļ­æŒã—ぞすが、唯一ぎ䞋外としãĻ、 `dup` ã¯į•°ãĒã‚‹ãƒãƒƒã‚ˇãƒĨをäŊŋį”¨ã—ãĻã„ã‚‹é‡č¤‡ãƒ•ã‚Ąã‚¤ãƒĢを検å‡ēできぞせん。 5.17 locate ----------- パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãĢäŋå­˜ã•れãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを検į´ĸã—ãžã™ã€‚ä¸€č‡´ã™ã‚‹å„ãƒ•ã‚Ąã‚¤ãƒĢãĢついãĻ、 パãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢ内でぎäŊįŊŽã¨ã€ãã‚ŒãŒå æœ‰ã™ã‚‹ãƒ•ãƒŠã‚°ãƒĄãƒŗãƒˆãŽæ•°ã‚’å‡ē力しぞす。 -t, --tail ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ãƒ‘ãƒĒãƒ†ã‚ŖãŽæŒ‡åŽšã•ã‚ŒãŸæœĢ尞部分を占有する ãƒ•ã‚Ąã‚¤ãƒĢãĢ操äŊœã‚’åˆļ限できぞす。 ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢを再配įŊŽã—たい場合は、-W, --force-realloc-tail ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ äŊŋį”¨ã§ããžã™ã€‚ 再配įŊŽãƒ—ロã‚ģã‚šä¸­ã€ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢはパãƒĒãƒ†ã‚ŖãĢã‚ˆãŖãĻäŋč­ˇã•れãĒいことãĢ æŗ¨æ„ã—ãĻください。 6 OPTIONS ========= SnapRAIDãĢは、æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒã‚ã‚Šãžã™ã€‚ -c, --conf CONFIG äŊŋį”¨ã™ã‚‹æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。指厚されãĻいãĒい場合、Unixでは、存在すれば `/usr/local/etc/snapraid.conf` をäŊŋį”¨ã—ã€ãã‚ŒäģĨ外ぎ場合は `/etc/snapraid.conf` を äŊŋį”¨ã—ãžã™ã€‚ Windowsでは、`snapraid.exe` ã¨åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒãĢある `snapraid.conf` ãƒ•ã‚Ąã‚¤ãƒĢを äŊŋį”¨ã—ãžã™ã€‚ -f, --filter PATTERN `check` ãŠã‚ˆãŗ `fix` でå‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ 指厚されたパã‚ŋãƒŧãƒŗãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋがå‡Ļį†ã•ã‚Œãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ パã‚ŋãƒŧãƒŗä앿§˜ãŽčŠŗį´°ãĢついãĻは、PATTERNã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‚’å‚į…§ã—ãĻください。 Unixでは、グロブ文字をäŊŋį”¨ã™ã‚‹å ´åˆã¯åŧ•ᔍįŦĻã§å›˛ã‚€ã‚ˆã†ãĢしãĻください。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€`sync` ãŠã‚ˆãŗ `scrub` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ -d, --filter-disk NAME `check`、`fix`、`up`ã€ãŠã‚ˆãŗ `down` でå‡Ļį†ã™ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯åã‚’æŒ‡åŽšã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ `parity`、`2-parity`、`3-parity` ãĒおぎ名前でパãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚‚æŒ‡åŽšã—ãĻ、 į‰šåŽšãŽãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãĢ操äŊœã‚’限厚できぞす。 č¤‡æ•°ãŽ --filter、--filter-diskã€ãŠã‚ˆãŗ --filter-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĩ„ãŋ合わせると、 すずãĻãŽãƒ•ã‚ŖãƒĢã‚ŋãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが選択されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check`、`fix`、`up`ã€ãŠã‚ˆãŗ `down` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€`sync` ãŠã‚ˆãŗ `scrub` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ -m, --filter-missing `check` ãŠã‚ˆãŗ `fix` でå‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã—ãžã™ã€‚ ã‚ĸãƒŦイから不čļŗãžãŸã¯å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢぎãŋがå‡Ļį†ã•ã‚Œãžã™ã€‚ `fix` ã¨ä¸€įˇ’ãĢäŊŋį”¨ã™ã‚‹ã¨ã€ã“ã‚Œã¯ `undelete` ã‚ŗãƒžãƒŗãƒ‰ã¨ã—ãĻ抟čƒŊしぞす。 č¤‡æ•°ãŽ --filter、--filter-diskã€ãŠã‚ˆãŗ --filter-missing ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĩ„ãŋ合わせると、 すずãĻãŽãƒ•ã‚ŖãƒĢã‚ŋãĢä¸€č‡´ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎãŋが選択されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ これらは常ãĢã‚ĸãƒŦイ全äŊ“ã‚’å‡Ļį†ã™ã‚‹ãŸã‚ã€`sync` ãŠã‚ˆãŗ `scrub` では äŊŋį”¨ã§ããžã›ã‚“ã€‚ -e, --filter-error `check` ãŠã‚ˆãŗ `fix` でエナãƒŧãŽã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをå‡Ļį†ã—ãžã™ã€‚ `status` で一čĻ§čĄ¨į¤ēされãĻいるようãĢ、`sync` ãŠã‚ˆãŗ `scrub` 中ãĢã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧぞたは å…Ĩå‡ē力エナãƒŧでマãƒŧã‚¯ã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢぎãŋをå‡Ļį†ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -p, --plan PERC|bad|new|full ã‚šã‚¯ãƒŠãƒ–ãƒ—ãƒŠãƒŗã‚’é¸æŠžã—ãžã™ã€‚PERCが0から100ぞでぎ数値である場合、 ゚クナブするブロックぎパãƒŧã‚ģãƒŗãƒ†ãƒŧジとしãĻč§Ŗé‡ˆã•ã‚Œãžã™ã€‚ パãƒŧã‚ģãƒŗãƒ†ãƒŧジぎäģŖã‚ã‚ŠãĢã€ãƒ—ãƒŠãƒŗã‚’æŒ‡åŽšã§ããžã™ã€‚ `bad` ã¯ä¸č‰¯ãƒ–ãƒ­ãƒƒã‚¯ã‚’ã‚šã‚¯ãƒŠãƒ–ã—ã€`new` はぞだ゚クナブされãĻいãĒいブロックを゚クナブし、 `full` はすずãĻを゚クナブしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`scrub` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -o, --older-than DAYS `scrub` でå‡Ļį†ã™ã‚‹ã‚ĸãƒŦイぎ最も古い部分を選択しぞす。 DAYS は、ブロックが゚クナブされるためぎ最小įĩŒéŽæ—Ĩ数であり、デフりãƒĢトは10です。 ä¸č‰¯ã¨ã—ãĻマãƒŧクされたブロックは、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢé–ĸäŋ‚ãĒく常ãĢ゚クナブされぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`scrub` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -a, --audit-only `check` で、パãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをチェックせずãĢãƒ•ã‚Ąã‚¤ãƒĢãŽãƒãƒƒã‚ˇãƒĨを検č¨ŧしぞす。 ãƒ•ã‚Ąã‚¤ãƒĢデãƒŧã‚ŋぎãŋぎチェックãĢé–ĸåŋƒãŒã‚る場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒã‚§ãƒƒã‚¯ãƒ—ãƒ­ã‚ģ゚を 大嚅ãĢéĢ˜é€ŸåŒ–ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -h, --pre-hash `sync` で、パãƒĒãƒ†ã‚Ŗč¨ˆįŽ—ãŽå‰ãŽčŋŊ加検č¨ŧぎためãĢ、すずãĻぎ新しいデãƒŧã‚ŋぎ äēˆå‚™ãƒãƒƒã‚ˇãƒĨ化フェãƒŧã‚ēã‚’åŽŸčĄŒã—ãžã™ã€‚ 通常、`sync` では、äēˆå‚™ãƒãƒƒã‚ˇãƒĨåŒ–ã¯čĄŒã‚ã‚Œãšã€æ–°ã—ã„ãƒ‡ãƒŧã‚ŋはパãƒĒãƒ†ã‚Ŗč¨ˆįŽ—ãŽį›´å‰ãĢ、 最初ãĢčĒ­ãŋ取られたときãĢãƒãƒƒã‚ˇãƒĨ化されぞす。 こぎプロã‚ģã‚šã¯ã€ã‚ˇã‚šãƒ†ãƒ ãŒé‡ã„č˛ čˇãŽä¸‹ãĢあり、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚šãƒ”ãƒŗã—ãĻおり、CPUが ビジãƒŧãĒときãĢį™ēį”Ÿã—ãžã™ã€‚ ã“ã‚Œã¯ãƒžã‚ˇãƒŗãĢã¨ãŖãĻæĨĩį̝ãĒįŠļ態であり、æŊœåœ¨įš„ãĒハãƒŧドã‚Ļェã‚ĸãŽå•éĄŒãŒã‚ã‚‹å ´åˆã€ デãƒŧã‚ŋãŒãžã ãƒãƒƒã‚ˇãƒĨ化されãĻいãĒいため、ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧが検å‡ēされãĒいぞぞãĢãĒる 可čƒŊ性がありぞす。 こぎãƒĒ゚クを回éŋするためãĢ、`pre-hash` ãƒĸãƒŧドを有劚ãĢしãĻ、すずãĻぎデãƒŧã‚ŋを2回čĒ­ãŋ取り、 そぎ整合性をįĸēäŋã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ã‚ĸãƒŦイ内でį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢも検č¨ŧしãĻ、į§ģ動操äŊœãŒæˆåŠŸã—ãŸã“ã¨ã‚’ įĸēčĒã—ã€åŋ…čρãĢåŋœã˜ãĻ、įļščĄŒã™ã‚‹å‰ãĢäŋŽæ­Ŗæ“äŊœã‚’åŽŸčĄŒã§ãã‚‹ã‚ˆã†ãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -i, --import DIR 最垌ぎ `sync` ぎ垌ãĢã‚ĸãƒŦã‚¤ã‹ã‚‰å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢã‚’ã€æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚ŖãƒŦクトãƒĒから ã‚¤ãƒŗãƒãƒŧトしぞす。 ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’ãžã æŒãŖãĻいる場合、それらは垊旧プロã‚ģ゚を攚善するためãĢ `check` ãŠã‚ˆãŗ `fix` でäŊŋį”¨ã§ããžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢは、ã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒをåĢめãĻčĒ­ãŋ取られ、名前ãĢé–ĸäŋ‚ãĒãč­˜åˆĨされぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`check` ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -s, --spin-down-on-error エナãƒŧがį™ēį”Ÿã—ãŸå ´åˆã€éžã‚ŧロぎ゚テãƒŧã‚ŋã‚šã‚ŗãƒŧドでįĩ‚äē†ã™ã‚‹å‰ãĢã€įŽĄį†ã•ã‚ŒãĻいるすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚’ ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãžã™ã€‚ã“ã‚ŒãĢより、中断された操äŊœåžŒãĢドナイブがã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãĒãžãžã‚šãƒ”ãƒŗã—įļšã‘、 不čρãĒį†ąãŽč“„įŠã¨é›ģ力æļˆč˛ģを回éŋするぎãĢåŊšįĢ‹ãĄãžã™ã€‚ ã‚ŗãƒžãƒŗãƒ‰ãŒå¤ąæ•—ã—ãŸå ´åˆã§ã‚‚ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒåŽ‰å…¨ãĢ停æ­ĸされるようãĢ、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ -w, --bw-limit RATE すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢグロãƒŧバãƒĢãĒ帯域嚅åˆļé™ã‚’éŠį”¨ã—ãžã™ã€‚RATE は 1į§’ã‚ãŸã‚ŠãŽãƒã‚¤ãƒˆæ•°ã§ã™ã€‚K、M、GãĒおぎ䚗数を指厚できぞす (例īŧš--bw-limit 1G)。 -t, --tail ã‚ĩイã‚ē ãƒ•ã‚Ąã‚¤ãƒĢãƒĒ゚トを、パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ãŽæŒ‡åŽšã•ã‚ŒãŸæœĢå°žã‚ĩイã‚ēäģĨ下を äŊŋį”¨ã—ãĻいるもぎãĢåˆļ限しぞす。 K、M、G、T ãĒおぎ倍数をäŊŋį”¨ã§ããžã™īŧˆäž‹īŧš--tail 1Gīŧ‰ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`locate` ã‚ŗãƒžãƒŗãƒ‰ã¨ä¸€įˇ’ãĢäŊŋį”¨ã•ã‚ŒãŸå ´åˆãĢぎãŋ 有劚です。 -A, --stats čŋŊåŠ æƒ…å ąã‚’čĄ¨į¤ēã™ã‚‹æ‹Ąåŧĩ゚テãƒŧã‚ŋ゚ビãƒĨãƒŧを有劚ãĢしぞす。 į”ģéĸãĢは2ã¤ãŽã‚°ãƒŠãƒ•ãŒčĄ¨į¤ēされぞす。 æœ€åˆãŽã‚°ãƒŠãƒ•ã¯ã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒãƒƒãƒ•ã‚ĄãƒĒãƒŗã‚°ã•ã‚ŒãŸã‚šãƒˆãƒŠã‚¤ãƒ—ãŽæ•°ã¨ã€ããŽãƒ‡ã‚Ŗã‚šã‚¯ã§įžåœ¨ ã‚ĸクã‚ģ゚されãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ•ã‚Ąã‚¤ãƒĢパ゚をį¤ēã—ãžã™ã€‚é€šå¸¸ã€æœ€ã‚‚é…ã„ãƒ‡ã‚Ŗã‚šã‚¯ãĢは ãƒãƒƒãƒ•ã‚ĄãŒåˆŠį”¨ã§ããšã€ã“ã‚ŒãŒé”æˆå¯čƒŊãĒ最大帯域嚅をæąē厚しぞす。 2į•Ēį›ŽãŽã‚°ãƒŠãƒ•ã¯ã€éŽåŽģ100į§’é–“ãĢ垅抟ãĢč˛ģやされた時間ぎパãƒŧã‚ģãƒŗãƒ†ãƒŧジをį¤ēしぞす。 æœ€ã‚‚é…ã„ãƒ‡ã‚Ŗã‚šã‚¯ãŒåž…æŠŸæ™‚é–“ãŽãģとんおをåŧ•きčĩˇã“すとä爿ƒŗã•れ、äģ–ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯ ãƒãƒƒãƒ•ã‚ĄãƒĒãƒŗã‚°ã•ã‚ŒãŸã‚šãƒˆãƒŠã‚¤ãƒ—ã‚’äŊŋį”¨ã§ãã‚‹ãŸã‚ã€åž…æŠŸæ™‚é–“ãŒãģã¨ã‚“ãŠãžãŸã¯ãžãŖãŸããĒいはずです。 ã“ãŽã‚°ãƒŠãƒ•ã¯ã€ãƒãƒƒã‚ˇãƒĨč¨ˆįŽ—ã¨RAIDč¨ˆįŽ—ãĢč˛ģやされた垅抟時間もį¤ēしぞす。 すずãĻãŽč¨ˆįŽ—ã¯ãƒ‡ã‚Ŗã‚šã‚¯æ“äŊœã¨ä¸ĻčĄŒã—ãĻåŽŸčĄŒã•ã‚Œãžã™ã€‚ ã—ãŸãŒãŖãĻ、少ãĒくとも1ã¤ãŽãƒ‡ã‚Ŗã‚šã‚¯ã§æ¸Ŧ厚可čƒŊãĒ垅抟時間がある限り、 CPUがワãƒŧクロãƒŧドãĢčŋŊいつくぎãĢ十分速いことをį¤ēしãĻいぞす。 -Z, --force-zero äģĨ前は非ã‚ŧãƒ­ã ãŖãŸã‚ĩイã‚ēãŽãƒ•ã‚Ąã‚¤ãƒĢをã‚ŧロで同期するという厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDがこぎようãĒįŠļ態を検å‡ēした場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、 įļščĄŒã‚’停æ­ĸしぞす。 これãĢã‚ˆã‚Šã€ã‚ˇã‚šãƒ†ãƒ ã‚¯ãƒŠãƒƒã‚ˇãƒĨ垌ãĢ一部ぎã‚ĸクã‚ģã‚šã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢが切り捨ãĻられたときãĢ、 ãã‚Œã‚’į°Ąå˜ãĢ検å‡ēできぞす。 これは、ext3/ext4ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã‚’äŊŋį”¨ã—ãŸLinuxでčĩˇã“りうるįŠļ態です。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -E, --force-empty å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢがすずãĻ不čļŗã—ãĻã„ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŒæœŸã™ã‚‹ã¨ã„ã†åŽ‰å…¨ã§ãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDãŒã€å…ƒã€…ãƒ‡ã‚Ŗã‚šã‚¯ãĢ存在しãĻいたすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢが不čļŗã—ãĻいるか、 書き換えられãĻいることを検å‡ēした場合、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、 įļščĄŒã‚’停æ­ĸしぞす。 これãĢより、デãƒŧã‚ŋãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŒãƒžã‚Ļãƒŗãƒˆã•ã‚ŒãĻいãĒいときãĢã€ãã‚Œã‚’į°Ąå˜ãĢ 検å‡ēできぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -U, --force-uuid UUIDãŒå¤‰æ›´ã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯ã¨ãŽåŒæœŸã€ãƒã‚§ãƒƒã‚¯ã€ãŠã‚ˆãŗäŋŽæ­Ŗã¨ã„う厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 SnapRAIDãŒä¸€éƒ¨ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒUUIDを変更したことを検å‡ēした場合、 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’æŒ‡åŽšã—ãĒい限り、įļščĄŒã‚’停æ­ĸしぞす。 これãĢã‚ˆã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒé–“é•ãŖãŸãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆãĢマã‚Ļãƒŗãƒˆã•ã‚ŒãĻいるときãĢ、それを検å‡ēできぞす。 ただし、単一パãƒĒãƒ†ã‚Ŗã§ãŽå˜ä¸€ãŽUUIDå¤‰æ›´ã€ãŠã‚ˆãŗč¤‡æ•°ãŽãƒ‘ãƒĒãƒ†ã‚Ŗã§ãŽã‚ˆã‚Šå¤šããŽUUID変更は č¨ąå¯ã•ã‚ŒãĻいぞす。これは、垊旧垌ãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’ä礿›ã™ã‚‹ã¨ããŽé€šå¸¸ãŽã‚ąãƒŧ゚であるためです。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync`、`check`、ぞたは `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -D, --force-device ã‚ĸクã‚ģ゚できãĒã„ãƒ‡ã‚Ŗã‚šã‚¯ã€ãžãŸã¯åŒã˜į‰Šį†ãƒ‡ãƒã‚¤ã‚šä¸ŠãŽãƒ‡ã‚Ŗã‚šã‚¯ã¨ãŽäŋŽæ­Ŗã¨ã„う厉全でãĒい操äŊœã‚’åŧˇåˆļしぞす。 たとえば、2台ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚’å¤ąã„ã€æœ€åˆãŽ1台だけを垊旧するためぎäēˆå‚™ãƒ‡ã‚Ŗã‚šã‚¯ãŒã‚る場合、 2į•Ēį›ŽãŽã‚ĸクã‚ģ゚できãĒã„ãƒ‡ã‚Ŗã‚šã‚¯ã‚’į„ĄčĻ–ã§ããžã™ã€‚ ぞたは、æ—ĸãĢ**äŊŋį”¨ã•ã‚ŒãĻいる**ãƒ‡ã‚Ŗã‚šã‚¯ãĢ掋されたįŠēき厚量ãĢãƒ‡ã‚Ŗã‚šã‚¯ã‚’åžŠæ—§ã—ãŸã„å ´åˆã€ åŒã˜į‰Šį†ãƒ‡ãƒã‚¤ã‚šã‚’å…ąæœ‰ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -N, --force-nocopy `sync`、`check`ã€ãŠã‚ˆãŗ `fix` ã§ã€ã‚ŗãƒ”ãƒŧ検å‡ēヒãƒĨãƒŧãƒĒã‚šãƒ†ã‚Ŗãƒƒã‚¯ã‚’į„ĄåŠšãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒãĒい場合、SnapRAIDは、名前、ã‚ĩイã‚ē、ã‚ŋイム゚ã‚ŋãƒŗãƒ—ãĒãŠãŽåŒã˜åąžæ€§ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢが、 同じデãƒŧã‚ŋã‚’æŒã¤ã‚ŗãƒ”ãƒŧであるとčĻ‹ãĒしぞす。 これãĢã‚ˆã‚Šã€ã‚ã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰åˆĨãŽãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ŗãƒ”ãƒŧぞたはį§ģå‹•ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢã‚’č­˜åˆĨし、 æ—ĸãĢč¨ˆįŽ—ã•ã‚ŒãŸãƒãƒƒã‚ˇãƒĨæƒ…å ąã‚’å†åˆŠį”¨ã—ãĻ、ã‚ĩイãƒŦãƒŗãƒˆã‚¨ãƒŠãƒŧを検å‡ēしたり、不čļŗã—ãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを 垊旧したりできぞす。 ぞれãĢ、こぎ動äŊœãŒčĒ¤æ¤œå‡ēã‚„ã€å¤šããŽãƒãƒƒã‚ˇãƒĨ検č¨ŧãĢよるプロã‚ģ゚ぎ遅åģļãĢつãĒがる可čƒŊ性があり、 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹ã¨ã€ããŽã‚ˆã†ãĒå•éĄŒã‚’č§Ŗæąēできぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync`、`check`ã€ãŠã‚ˆãŗ `fix` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -F, --force-full `sync` で、パãƒĒãƒ†ã‚ŖãŽåŽŒå…¨ãĒå†č¨ˆįŽ—ã‚’åŧˇåˆļしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€æ–°ã—ã„ãƒ‘ãƒĒãƒ†ã‚ŖãƒŦベãƒĢをčŋŊ加する場合、ぞたはより新しいパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŊŋį”¨ã—ãĻ å¤ã„ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢæˆģした場合ãĢäŊŋį”¨ã§ããžã™ã€‚ パãƒĒãƒ†ã‚Ŗã‚’æœ€åˆã‹ã‚‰å†äŊœæˆã™ã‚‹äģŖã‚ã‚ŠãĢ、これãĢã‚ˆã‚Šã€ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢå­˜åœ¨ã™ã‚‹ãƒãƒƒã‚ˇãƒĨを å†åˆŠį”¨ã—ãĻデãƒŧã‚ŋを検č¨ŧし、æ—ĸ存ぎパãƒĒãƒ†ã‚Ŗãƒ‡ãƒŧã‚ŋをäŊŋį”¨ã—ãĻ `sync` プロã‚ģ゚中ãĢデãƒŧã‚ŋäŋč­ˇã‚’ įļ­æŒã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ -R, --force-realloc `sync` ã§ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ厌全ãĒå†å‰˛ã‚ŠåŊ“ãĻとパãƒĒãƒ†ã‚ŖãŽå†æ§‹į¯‰ã‚’åŧˇåˆļしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢå­˜åœ¨ã™ã‚‹ãƒãƒƒã‚ˇãƒĨã‚’å†åˆŠį”¨ã—ãĻデãƒŧã‚ŋを検č¨ŧしãĒがら、 æ–­į‰‡åŒ–ã‚’å‰Šé™¤ã—ãĻ、すずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢを厌全ãĢå†å‰˛ã‚ŠåŊ“ãĻするためãĢäŊŋį”¨ã§ããžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€`sync` ぎãŋでäŊŋį”¨ã§ããžã™ã€‚ **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、äŊŋį”¨ã—ãĒいことをåŧˇã お勧めしぞす。 `sync` 操äŊœä¸­ãĢデãƒŧã‚ŋäŋč­ˇã¯ã‚りぞせん。 -W, --force-realloc-tail ã‚ĩイã‚ē -R, --force-realloc と同様ãĢ動äŊœã—ぞすが、各パãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢぎ 指厚されたæœĢ尞部分īŧˆæœ€åžŒãŽã€Œã‚ĩイã‚ē」バイトīŧ‰ãĢåˆļ限されぞす。 įžåœ¨ããŽæœĢå°žã‚ģã‚¯ã‚ˇãƒ§ãƒŗãĢäŋå­˜ã•れãĻã„ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãƒ•ãƒŠã‚°ãƒĄãƒŗãƒˆ/ブロックぎ 再配įŊŽīŧˆį§ģ動īŧ‰ã‚’åŧˇåˆļし、įŠēき゚ペãƒŧ゚があるパãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢ内ぎ äģģæ„ãŽå ´æ‰€īŧˆæ—ĸ存ぎホãƒŧãƒĢをåĢむīŧ‰ãĢ配įŊŽã§ãã‚‹ã‚ˆã†ãĢしぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŽä¸ģãĒį›Žįš„ã¯ã€ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§ãŽã‚ĩイã‚ēを į¸Žå°ã™ã‚‹ã“ã¨ã§ã™ã€‚ 再配įŊŽãĢã‚ˆãŖãĻæœĢå°žã‚ģã‚¯ã‚ˇãƒ§ãƒŗå…¨äŊ“ãŒæ­Ŗå¸¸ãĢクãƒĒã‚ĸされた場合 īŧˆãã‚Œã‚’äŊŋį”¨ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ãŒæŽ‹ãŖãĻいãĒい場合īŧ‰ã€ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢは åˆ‡ã‚ŠčŠ°ã‚ã‚‰ã‚Œã€æœĒäŊŋį”¨ãŽæœĢ尞゚ペãƒŧ゚が回収されぞす。 K、M、G、T ãĒおぎ倍数をäŊŋį”¨ã§ããžã™īŧˆäž‹īŧš --force-realloc-tail 1Gīŧ‰ã€‚ locate -t, --tail をäŊŋį”¨ã—ãĻ、åŊąéŸŋã‚’å—ã‘ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをäē‹å‰ãĢ įŸĨることができぞす。 č­Ļ告īŧ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧãƒˆå°‚į”¨ã§ã‚ã‚Šã€äŊŋį”¨ã—ãĒいことが åŧˇãæŽ¨åĨ¨ã•れぞす。 åŊąéŸŋã‚’å—ã‘ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãĢついãĻは、`sync` 操äŊœä¸­ãĢデãƒŧã‚ŋäŋč­ˇã¯ čĄŒã‚ã‚Œãžã›ã‚“ã€‚ -l, --log FILE čŠŗį´°ãĒãƒ­ã‚°ã‚’æŒ‡åŽšã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãĢ書きčžŧãŋぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいãĒい場合、ä爿œŸã—ãĒいエナãƒŧがį”ģéĸãĢå‡ē力され、 多くぎエナãƒŧがį™ēį”Ÿã—ãŸå ´åˆãĢ過剰ãĒå‡ē力ãĢãĒる可čƒŊ性がありぞす。 -l, --log が指厚されãĻいる場合、SnapRAIDが停æ­ĸする原因とãĒã‚‹č‡´å‘Ŋįš„ãĒエナãƒŧぎãŋが į”ģéĸãĢå‡ē力されぞす。 パ゚が `>>` ã§å§‹ãžã‚‹å ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢはčŋŊ記ãƒĸãƒŧドで開かれぞす。 名前ãĢ `%D` と `%T` がå‡ēįžã™ã‚‹ã¨ã€ãã‚Œãžã‚ŒYYYYMMDDとHHMMSSぎåŊĸåŧã§ æ—Ĩäģ˜ã¨æ™‚åˆģãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚Windowsãƒãƒƒãƒãƒ•ã‚Ąã‚¤ãƒĢでは、`%` 文字を 2倍ãĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚äž‹īŧšresult-%%D.log。`>>` をäŊŋį”¨ã™ã‚‹ãĢは、 名前をåŧ•ᔍįŦĻã§å›˛ã‚€åŋ…čĻãŒã‚ã‚Šãžã™ã€‚äž‹īŧš`">>result.log"`。 ログを標æē–å‡ē力ぞたは標æē–エナãƒŧãĢå‡ē力するãĢは、それぞれ `">&1"` ãŠã‚ˆãŗ `">&2"` を äŊŋį”¨ã§ããžã™ã€‚ ログã‚ŋグぎčĒŦ明ãĢついãĻは、snapraid_log.txtãƒ•ã‚Ąã‚¤ãƒĢぞたはmanペãƒŧã‚¸ã‚’å‚į…§ã—ãĻください。 -L, --error-limit NUMBER åŽŸčĄŒã‚’åœæ­ĸする前ぎ新しいエナãƒŧåˆļé™ã‚’č¨­åŽšã—ãžã™ã€‚ デフりãƒĢトでは、SnapRAIDは100をčļ…えるå…Ĩå‡ē力エナãƒŧãĢ遭遇した場合ãĢ停æ­ĸしぞす。 ã“ã‚Œã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒæ•…éšœã—ãĻいる可čƒŊ性がéĢ˜ã„ã“ã¨ã‚’į¤ēしãĻいぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ `sync` と `scrub` ãĢåŊąéŸŋã—ã€æœ€åˆãŽä¸€é€ŖãŽãƒ‡ã‚Ŗã‚šã‚¯ã‚¨ãƒŠãƒŧぎ垌ãĢ įļščĄŒã—ãĻ操äŊœã‚’åތäē†ã—ã‚ˆã†ã¨ã™ã‚‹ã“ã¨ãŒč¨ąå¯ã•ã‚Œãžã™ã€‚ ただし、`check` と `fix` は常ãĢ最初ぎエナãƒŧで停æ­ĸしぞす。 -S, --start BLKSTART 指厚されたブロックį•Ēåˇã‹ã‚‰å‡Ļį†ã‚’é–‹å§‹ã—ãžã™ã€‚ ã“ã‚Œã¯ã€į ´æã—ãŸãƒ‡ã‚Ŗã‚šã‚¯ãŽå ´åˆãĢį‰šåŽšãŽãƒ–ãƒ­ãƒƒã‚¯ã‚’å†čŠĻčĄŒã—ãĻチェックぞたはäŋŽæ­Ŗã™ã‚‹ãŽãĢ åŊšįĢ‹ãĄãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ä¸ģãĢé̘åēĻãĒæ‰‹å‹•åžŠæ—§ã‚’į›Žįš„ã¨ã—ãĻいぞす。 -B, --count BLKCOUNT 指厚された数ぎブロックぎãŋをå‡Ļį†ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ä¸ģãĢé̘åēĻãĒæ‰‹å‹•åžŠæ—§ã‚’į›Žįš„ã¨ã—ãĻいぞす。 -C, --gen-conf CONTENT æ—ĸå­˜ãŽã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢからダミãƒŧãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã‚’į”Ÿæˆã—ãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢは標æē–å‡ē力ãĢ書きčžŧぞれ、æ—ĸå­˜ãŽãƒ•ã‚Ąã‚¤ãƒĢを上書きしぞせん。 ã“ãŽæ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢãĢã¯ã€ã‚ˇã‚šãƒ†ãƒ å…¨äŊ“ã‚’å¤ąãŖãŸå ´åˆãĢãƒ‡ã‚Ŗã‚šã‚¯ãŽãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’ å†æ§‹į¯‰ã™ã‚‹ãŸã‚ãĢåŋ…čρãĒæƒ…å ąã‚‚åĢぞれãĻいぞす。 -v, --verbose į”ģéĸãĢã‚ˆã‚Šå¤šããŽæƒ…å ąã‚’å‡ē力しぞす。 1å›žæŒ‡åŽšã™ã‚‹ã¨ã€é™¤å¤–ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢとčŋŊ加ぎįĩąč¨ˆãŒå‡ē力されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒ­ã‚°ãƒ•ã‚Ąã‚¤ãƒĢãĢはåŊąéŸŋしぞせん。 -q, --quiet į”ģéĸãĢå‡ēåŠ›ã•ã‚Œã‚‹æƒ…å ąã‚’æ¸›ã‚‰ã—ãžã™ã€‚ 1回指厚すると、プログãƒŦ゚バãƒŧが削除されぞす。2å›žæŒ‡åŽšã™ã‚‹ã¨ã€åŽŸčĄŒä¸­ãŽæ“äŊœãŒå‰Šé™¤ã•れぞす。 3å›žæŒ‡åŽšã™ã‚‹ã¨ã€æƒ…å ąãƒĄãƒƒã‚ģãƒŧジが削除されぞす。4回指厚すると、゚テãƒŧã‚ŋã‚šãƒĄãƒƒã‚ģãƒŧジが削除されぞす。 致å‘Ŋįš„ãĒエナãƒŧは常ãĢį”ģéĸãĢå‡ē力されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ãƒ­ã‚°ãƒ•ã‚Ąã‚¤ãƒĢãĢはåŊąéŸŋしぞせん。 -H, --help įŸ­ã„ãƒ˜ãƒĢプį”ģéĸをå‡ē力しぞす。 -V, --version プログナムぎバãƒŧã‚¸ãƒ§ãƒŗã‚’å‡ē力しぞす。 7 CONFIGURATION =============== SnapRAIDã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎ場所とパãƒĒãƒ†ã‚Ŗæƒ…å ąãŽäŋå­˜å ´æ‰€ã‚’įŸĨるためãĢã€æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢを åŋ…čĻã¨ã—ãžã™ã€‚ Unixでは、存在すれば `/usr/local/etc/snapraid.conf` をäŊŋį”¨ã—ã€ãã‚ŒäģĨ外ぎ場合は `/etc/snapraid.conf` をäŊŋį”¨ã—ãžã™ã€‚ Windowsでは、`snapraid.exe` ã¨åŒã˜ãƒ‡ã‚ŖãƒŦクトãƒĒãĢある `snapraid.conf` ãƒ•ã‚Ąã‚¤ãƒĢを äŊŋį”¨ã—ãžã™ã€‚ æŦĄãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’åĢめるåŋ…čĻãŒã‚ã‚Šãžã™īŧˆå¤§æ–‡å­—と小文字をåŒēåˆĨしぞすīŧ‰ã€‚ 7.1 parity FILE [,FILE] ... --------------------------- パãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’åŽšįžŠã—ãžã™ã€‚ パãƒĒãƒ†ã‚Ŗã¯ã€RAID5と同様ãĢã€å˜ä¸€ãŽãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗã‹ã‚‰ãŽäŋč­ˇã‚’有劚ãĢしぞす。 č¤‡æ•°ãŽãƒ•ã‚Ąã‚¤ãƒĢã‚’æŒ‡åŽšã§ãã€ãã‚Œã‚‰ã¯į•°ãĒã‚‹ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢ存在するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢがそれäģĨä¸Šæˆé•ˇã§ããĒくãĒると、æŦĄãŽãƒ•ã‚Ąã‚¤ãƒĢがäŊŋį”¨ã•ã‚Œãžã™ã€‚ åˆŠį”¨å¯čƒŊãĒįˇåŽšé‡ã¯ã€ã‚ĸãƒŦイ内ぎ**最大ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯**と少ãĒくとも同じ大きさでãĒければãĒりぞせん。 垌でčŋŊ加ぎパãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加することはできぞすが、 それらをä¸Ļずæ›ŋえたり削除したりすることはできぞせん。 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’ãƒ‘ãƒĒãƒ†ã‚Ŗį”¨ãĢäēˆį´„しãĻãŠãã“ã¨ã§ã€ãã‚Œã‚‰ãŒæ–­į‰‡åŒ–ã•ã‚Œã‚‹ãŽã‚’é˜˛ãŽã€ パフりãƒŧãƒžãƒŗã‚šã‚’å‘ä¸Šã•ã›ãžã™ã€‚ Windowsでは、フãƒĢãƒ‡ã‚Ŗã‚šã‚¯ãĢé–ĸするč­Ļ告をéŋけるためãĢã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãĢ256 MBがæœĒäŊŋį”¨ã§ 掋されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯åŋ…須であり、1回ぎãŋäŊŋį”¨ã§ããžã™ã€‚ 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- čŋŊ加ぎパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’åŽšįžŠã—ãžã™ã€‚ 指厚されたパãƒĒãƒ†ã‚ŖãƒŦベãƒĢごとãĢ、1つぎčŋŊ加ぎäŋč­ˇãƒŦベãƒĢが有劚ãĢãĒりぞす。 * 2-parity は RAID6 デãƒĨã‚ĸãƒĢパãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 3-parity は トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 4-parity は クã‚ĸッドīŧˆ4つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 5-parity は ãƒšãƒŗã‚ŋīŧˆ5つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 * 6-parity は ヘキã‚ĩīŧˆ6つīŧ‰ãƒ‘ãƒĒãƒ†ã‚Ŗã‚’æœ‰åŠšãĢしぞす。 各パãƒĒãƒ†ã‚ŖãƒŦベãƒĢãĢは、äģĨ前ぎすずãĻぎパãƒĒãƒ†ã‚ŖãƒŦベãƒĢが存在するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ `parity` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¨åŒã˜č€ƒæ…Žäē‹é …ãŒéŠį”¨ã•ã‚Œãžã™ã€‚ これらぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã‚ã‚Šã€1回ぎãŋäŊŋį”¨ã§ããžã™ã€‚ 7.3 z-parity FILE [,FILE] ... ----------------------------- トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’äŋå­˜ã™ã‚‹ãŸã‚ãŽäģŖæ›ŋãƒ•ã‚Ąã‚¤ãƒĢとフりãƒŧãƒžãƒƒãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ `3-parity` ぎäģŖæ›ŋであり、ä¸ģãĢARMやSSSE3å‘Ŋäģ¤ã‚ģットをã‚ĩポãƒŧトしãĻいãĒい AMD Phenom、Athlon、OpteronãĒおぎロãƒŧã‚¨ãƒŗãƒ‰CPUã‚’å¯žčąĄã¨ã—ãĻいぞす。 こぎようãĒå ´åˆã€ã‚ˆã‚Šč‰¯ã„ãƒ‘ãƒ•ã‚Šãƒŧãƒžãƒŗã‚šã‚’æäž›ã—ãžã™ã€‚ こぎフりãƒŧマットは、ZFS RAIDZ3でäŊŋį”¨ã•ã‚Œã‚‹ã‚‚ãŽã¨äŧŧãĻいぞすが、よりéĢ˜é€Ÿã§ã™ã€‚ ZFSと同様ãĢ、トãƒĒプãƒĢパãƒĒãƒ†ã‚Ŗã‚’čļ…えãĻは抟čƒŊしぞせん。 `3-parity` をäŊŋį”¨ã—ãĻいる場合、パフりãƒŧãƒžãƒŗã‚šå‘ä¸ŠãŽãŸã‚ãĢ `z-parity` フりãƒŧマットぎ äŊŋį”¨ãŒæŽ¨åĨ¨ã•れる場合はč­Ļå‘ŠãŒčĄ¨į¤ēされぞす。 æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã‚’į›Žįš„ãŽ `z-parity` ぞたは `3-parity` ãƒ•ã‚Ąã‚¤ãƒĢでčĒŋ整し、 `fix` をäŊŋį”¨ã—ãĻ再äŊœæˆã™ã‚‹ã“とで、あるフりãƒŧマットからåˆĨぎフりãƒŧマットãĢ 変換することが可čƒŊです。 7.4 content FILE ---------------- ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイãĢ存在するすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¨ãƒã‚§ãƒƒã‚¯ã‚ĩムをäŋå­˜ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを åŽšįžŠã—ãžã™ã€‚ デãƒŧã‚ŋ、パãƒĒãƒ†ã‚Ŗã€ãžãŸã¯ããŽäģ–ãŽåˆŠį”¨å¯čƒŊãĒãƒ‡ã‚Ŗã‚šã‚¯ãĢ配įŊŽã§ããžã™ã€‚ デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢは `sync` プロã‚ģ゚からč‡Ēå‹•įš„ãĢ 除外されぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯åŋ…é ˆã§ã‚ã‚Šã€åŒã˜ãƒ•ã‚Ąã‚¤ãƒĢã‚’č¤‡æ•°ã‚ŗãƒ”ãƒŧäŋå­˜ã™ã‚‹ãŸã‚ãĢč¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ äŊŋį”¨ã™ã‚‹ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ**少ãĒくとも1ã¤ãŽã‚ŗãƒ”ãƒŧ**と、さらãĢ**1ã¤ãŽã‚ŗãƒ”ãƒŧ**を äŋå­˜ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚čŋŊåŠ ãŽã‚ŗãƒ”ãƒŧをäŊŋį”¨ã—ãĻã‚‚åŽŗã¯ã‚ã‚Šãžã›ã‚“ã€‚ 7.5 data NAME DIR ----------------- ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã¨ãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ NAME ã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‚’č­˜åˆĨするためãĢäŊŋį”¨ã•ã‚Œã€**一意である**åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ DIR ã¯ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ å†…ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽ**マã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆ**です。 NAME をå›ē厚したぞぞãĢしãĻおけば、åŋ…čρãĢåŋœã˜ãĻマã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’å¤‰æ›´ã§ããžã™ã€‚ ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã”ã¨ãĢ1つぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢã§į›´æŽĨ NAME を変更しãĻから `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’åŽŸčĄŒã™ã‚‹ã“ã¨ã§ã€ åžŒã§ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã‚’å¤‰æ›´ã§ããžã™ã€‚ 名前変更ぎ場合、é–ĸ逪äģ˜ã‘ã¯ãƒ‡ã‚Ŗã‚šã‚¯ãŽäŋå­˜ã•れたUUIDをäŊŋį”¨ã—ãĻčĄŒã‚ã‚Œãžã™ã€‚ 7.6 extra NAME DIR ------------------ `smart` ãŠã‚ˆãŗ `probe` ã‚ŗãƒžãƒŗãƒ‰ã§į›ŖčĻ–ã™ã‚‹čŋŊåŠ ãƒ‡ã‚Ŗã‚šã‚¯ãŽåå‰ã¨ãƒžã‚Ļ ãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã‚’åŽšįžŠã—ãžã™ã€‚ これは、ブãƒŧãƒˆãƒ‡ã‚Ŗã‚šã‚¯ãĒお、ã‚ĸãƒŦイぎ一部ではãĒã„ãŒã‚ˇã‚šãƒ†ãƒ ãŽæŠŸčƒŊãĢåŋ… čρãĒãƒ‡ã‚Ŗã‚šã‚¯ã‚’į›ŖčĻ–ã™ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ ã“ã‚Œã‚‰ãŽãƒ‡ã‚Ŗã‚šã‚¯ã¯å¸¸ãĢ回čģĸしãĻいることが期垅されるため、`up` およ ãŗ `down` ã‚ŗãƒžãƒŗãƒ‰ãŽåŊąéŸŋを受けãĒいことãĢæŗ¨æ„ã—ãĻください。 7.7 nohidden ------------ すずãĻãŽéš ã—ãƒ•ã‚Ąã‚¤ãƒĢã¨ãƒ‡ã‚ŖãƒŦクトãƒĒを除外しぞす。 Unixã§ã¯ã€éš ã—ãƒ•ã‚Ąã‚¤ãƒĢは `.` ã§å§‹ãžã‚‹ãƒ•ã‚Ąã‚¤ãƒĢです。 Windowsã§ã¯ã€éš ã—åąžæ€§ã‚’æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢです。 7.8 exclude/include PATTERN --------------------------- syncプロã‚ģ゚で除外ぞたはåĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯ãƒ‡ã‚ŖãƒŦクトãƒĒぎパã‚ŋãƒŧãƒŗã‚’åŽšįžŠã—ãžã™ã€‚ すずãĻぎパã‚ŋãƒŧãƒŗã¯æŒ‡åŽšã•ã‚ŒãŸé †åēã§å‡Ļį†ã•ã‚Œãžã™ã€‚ ä¸€č‡´ã™ã‚‹æœ€åˆãŽãƒ‘ã‚ŋãƒŧãƒŗãŒ `exclude` ãŽå ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢは除外されぞす。 `include` ãŽå ´åˆã€ãƒ•ã‚Ąã‚¤ãƒĢはåĢぞれぞす。 パã‚ŋãƒŧãƒŗãŒä¸€č‡´ã—ãĒい場合、最垌ãĢ指厚されたパã‚ŋãƒŧãƒŗãŒ `include` ãŽå ´åˆã¯ãƒ•ã‚Ąã‚¤ãƒĢは除外され、 `exclude` ぎ場合はåĢぞれぞす。 パã‚ŋãƒŧãƒŗä앿§˜ãŽčŠŗį´°ãĢついãĻは、PATTERNã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‚’å‚į…§ã—ãĻください。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯č¤‡æ•°å›žäŊŋį”¨ã§ããžã™ã€‚ 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- パãƒĒãƒ†ã‚ŖãŽåŸēæœŦブロックã‚ĩイã‚ēをキビバイト単äŊã§åŽšįžŠã—ãžã™ã€‚ 1キビバイトは1024バイトです。 デフりãƒĢトぎブロックã‚ĩイã‚ēは256であり、ãģとんおぎ場合ãĢ抟čƒŊするはずです。 **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、こぎ値を変更しãĒいことをåŧˇã お勧めしぞす。äģŠåžŒã“ぎ値を変更するãĢは、パãƒĒãƒ†ã‚Ŗå…¨äŊ“ã‚’**再äŊœæˆ**するåŋ…čĻãŒã‚ã‚Šãžã™īŧ į•°ãĒるブロックã‚ĩイã‚ēをäŊŋį”¨ã™ã‚‹į†į”ąãŽ1ã¤ã¯ã€æ•°į™žä¸‡ãŽã‚Ēãƒŧダãƒŧぎ**多くぎ小さãĒãƒ•ã‚Ąã‚¤ãƒĢ**を æŒãŖãĻいる場合です。 ãƒ•ã‚Ąã‚¤ãƒĢごとãĢã€ãŸã¨ãˆæ•°ãƒã‚¤ãƒˆã§ã‚ãŖãĻも、パãƒĒãƒ†ã‚ŖãŽ**ブロック全äŊ“**ãŒå‰˛ã‚ŠåŊ“ãĻられ、 ãƒ•ã‚Ąã‚¤ãƒĢが多いと、これãĢより**かãĒりぎæœĒäŊŋį”¨ãƒ‘ãƒĒãƒ†ã‚Ŗã‚šãƒšãƒŧ゚**がį™ēį”Ÿã™ã‚‹å¯čƒŊ性がありぞす。 パãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã‚’åŽŒå…¨ãĢ埋めると、デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãĢãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加することは**č¨ąå¯ã•ã‚Œãžã›ã‚“**。 ただし、æĩĒč˛ģされたパãƒĒãƒ†ã‚Ŗã¯ãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯é–“ã§č“„įŠã•ã‚Œãžã›ã‚“ã€‚ãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽå¤šæ•°ãŽãƒ•ã‚Ąã‚¤ãƒĢから į”Ÿã˜ã‚‹æĩĒč˛ģ゚ペãƒŧ゚は、**そぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãŽãƒ‡ãƒŧã‚ŋ量**ぎãŋをåˆļ限し、äģ–ぎデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ãĢは åŊąéŸŋしぞせん。 æĻ‚įŽ—ã¨ã—ãĻã€ãƒ•ã‚Ąã‚¤ãƒĢごとãĢブロックã‚ĩイã‚ēぎ半分がæĩĒč˛ģされるとäģŽåŽšã§ããžã™ã€‚ たとえば、100,000ãƒ•ã‚Ąã‚¤ãƒĢと256 KiBぎブロックã‚ĩイã‚ēがある場合、12.8 GBぎパãƒĒãƒ†ã‚ŖãŒæĩĒč˛ģされ、 これãĢよりデãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸Šã§12.8 GB少ãĒい゚ペãƒŧã‚šã—ã‹åˆŠį”¨ã§ããĒくãĒる可čƒŊ性がありぞす。 `status` をäŊŋį”¨ã—ãĻã€å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽæĩĒč˛ģ゚ペãƒŧ゚ぎ量をįĸēčĒã§ããžã™ã€‚ これは、デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢ**įŠēき**としãĻ掋すåŋ…čĻãŒã‚ã‚‹ã€ãžãŸã¯ã‚ĸãƒŦイãĢåĢぞれãĒã„ãƒ•ã‚Ąã‚¤ãƒĢãĢ äŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚‹ã‚šãƒšãƒŧ゚ぎ量です。 ã“ãŽå€¤ãŒč˛ ãŽå ´åˆã€ãƒ‘ãƒĒãƒ†ã‚ŖãŒæē€æ¯ãĢčŋ‘ãĨいãĻã„ã‚‹ã“ã¨ã‚’æ„å‘ŗã—ã€ãžã æĩĒč˛ģできる゚ペãƒŧ゚を čĄ¨ã—ãžã™ã€‚ ã“ãŽå•éĄŒã‚’å›žéŋするためãĢ、パãƒĒãƒ†ã‚ŖãĢより大きãĒパãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã§ããžã™ã€‚ たとえば、パãƒĒãƒ†ã‚Ŗãƒ‘ãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗãŒãƒ‡ãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã‚ˆã‚Šã‚‚12.8 GB大きい場合、 各デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã§æœ€å¤§100,000ãƒ•ã‚Ąã‚¤ãƒĢをå‡Ļį†ã™ã‚‹ãŽãĢ十分ãĒčŋŊ加゚ペãƒŧ゚があり、 æĩĒč˛ģ゚ペãƒŧ゚はありぞせん。 Linuxでより大きãĒパãƒĒãƒ†ã‚Ŗãƒ‘ãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗã‚’å–åž—ã™ã‚‹ãƒˆãƒĒックは、æŦĄãŽã‚ŗãƒžãƒŗãƒ‰ã§ フりãƒŧマットすることです。 mkfs.ext4 -m 0 -T largefile4 DEVICE これãĢã‚ˆã‚Šã€į´„1.5%ぎčŋŊ加゚ペãƒŧ゚、4 TBãƒ‡ã‚Ŗã‚šã‚¯ã§į´„60 GBが垗られ、 æĩĒč˛ģ゚ペãƒŧ゚ãĒしで各デãƒŧã‚ŋãƒ‡ã‚Ŗã‚šã‚¯ã§į´„460,000ãƒ•ã‚Ąã‚¤ãƒĢが可čƒŊãĢãĒりぞす。 7.10 hashsize SIZE_IN_BYTES --------------------------- äŋå­˜ã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ãŽãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēをバイト単äŊã§åŽšįžŠã—ãžã™ã€‚ デフりãƒĢãƒˆãŽãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēは16バイトīŧˆ128ビットīŧ‰ã§ã‚り、ãģとんおぎ場合ãĢ抟čƒŊするはずです。 **č­Ļ告īŧ** こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã‚¨ã‚­ã‚šãƒ‘ãƒŧトぎãŋã‚’å¯žčąĄã¨ã—ãĻおり、こぎ値を変更しãĒいことをåŧˇã お勧めしぞす。äģŠåžŒã“ぎ値を変更するãĢは、パãƒĒãƒ†ã‚Ŗå…¨äŊ“ã‚’**再äŊœæˆ**するåŋ…čĻãŒã‚ã‚Šãžã™īŧ į•°ãĒã‚‹ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēをäŊŋį”¨ã™ã‚‹į†į”ąãŽ1ã¤ã¯ã€ã‚ˇã‚šãƒ†ãƒ ãŽãƒĄãƒĸãƒĒがåˆļ限されãĻいる場合です。 įĩŒé¨“則としãĻ、SnapRAIDは通常、ã‚ĸãƒŦイ内ぎデãƒŧã‚ŋ16 TBごとãĢ1 GiBぎRAMをåŋ…čĻã¨ã—ãžã™ã€‚ å…ˇäŊ“įš„ãĢは、デãƒŧã‚ŋãŽãƒãƒƒã‚ˇãƒĨをäŋå­˜ã™ã‚‹ãŸã‚ãĢ、SnapRAIDは į´„ $TS \cdot (1 + HS) / BS$ バイトぎRAMをåŋ…čĻã¨ã—ãžã™ã€‚ ここで、TSã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦã‚¤ãŽåˆč¨ˆã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã€BSはブロックã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã€HSã¯ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēīŧˆãƒã‚¤ãƒˆīŧ‰ã§ã™ã€‚ たとえば、4 TBãŽãƒ‡ã‚Ŗã‚šã‚¯8台、ブロックã‚ĩイã‚ē256 KiBīŧˆ1 KiB = 1024バイトīŧ‰ã€ ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ē16ぎ場合īŧš RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 16) / (256 \cdot 2^{10}) = 1.93 \text{ GiB}$ ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēを8ãĢ切りæ›ŋえるとīŧš RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 8) / (256 \cdot 2^{10}) = 1.02 \text{ GiB}$ ブロックã‚ĩイã‚ēを512ãĢ切りæ›ŋえるとīŧš RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 16) / (512 \cdot 2^{10}) = 0.96 \text{ GiB}$ ãƒãƒƒã‚ˇãƒĨã‚ĩイã‚ēを8、ブロックã‚ĩイã‚ēを512ãŽä¸Ąæ–šãĢ切りæ›ŋえるとīŧš RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 8) / (512 \cdot 2^{10}) = 0.51 \text{ GiB}$ 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- å‡Ļį†ã•ã‚ŒãŸæŒ‡åŽšã•ã‚ŒãŸGB量垌ãĢã€åŒæœŸãžãŸã¯ã‚šã‚¯ãƒŠãƒ“ãƒŗã‚°æ™‚ãĢįŠļ態をč‡Ēå‹•įš„ãĢäŋå­˜ã—ぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ãƒžã‚ˇãƒŗã‚¯ãƒŠãƒƒã‚ˇãƒĨやそぎäģ–ãŽã‚¤ãƒ™ãƒŗãƒˆãĢã‚ˆãŖãĻ中断された場合ãĢ、 é•ˇã„ `sync` ã‚ŗãƒžãƒŗãƒ‰ã‚’æœ€åˆã‹ã‚‰å†čĩˇå‹•するぎをéŋけるぎãĢåŊšįĢ‹ãĄãžã™ã€‚ 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- č¨ąåŽšã•ã‚Œã‚‹æœ€å¤§ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻã‚’æ‘‚æ°ã§č¨­åŽšã—ãžã™ã€‚æŒ‡åŽšã•ã‚ŒãĻいる場合、 SnapRAIDは smartctl ツãƒŧãƒĢをäŊŋį”¨ã—ãĻすずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻã‚’åŽšæœŸįš„ãĢチェックしぞす。 SnapRAIDが動äŊœã—ãĻã„ã‚‹é–“ã€įžåœ¨ãŽãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻãŒčĄ¨į¤ēされぞす。 ã„ãšã‚Œã‹ãŽãƒ‡ã‚Ŗã‚šã‚¯ãŒã“ãŽåˆļ限をčļ…えると、すずãĻぎ操äŊœãŒåœæ­ĸã—ã€ãƒ‡ã‚Ŗã‚šã‚¯ã¯ `temp_sleep` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§åŽšįžŠã•ã‚ŒãŸæœŸé–“ã€ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗīŧˆã‚šã‚ŋãƒŗãƒã‚¤įŠļ態ãĢį§ģ行īŧ‰ã•れぞす。 ゚ãƒĒãƒŧプ期間垌、操äŊœã¯å†é–‹ã•れぞすが、渊åēĻåˆļ限ãĢ再åēĻé”ã—ãŸå ´åˆã¯å†ãŗä¸€æ™‚åœæ­ĸする 可čƒŊ性がありぞす。 操äŊœä¸­ã€SnapRAIDã¯å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽåŠ į†ąæ›˛įˇšã‚‚åˆ†æžã—ã€ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ“ãƒ†ã‚ŖãŒįļ™įļšã—た場合ãĢ 達するとä爿ƒŗã•ã‚Œã‚‹é•ˇæœŸįš„ãĒ厉厚渊åēĻã‚’æŽ¨åŽšã—ãžã™ã€‚æŽ¨åŽšã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻが4回上昇した 垌ãĢぎãŋåŽŸčĄŒã•ã‚Œã€äŋĄé ŧできる傞向をįĸēįĢ‹ã™ã‚‹ãŽãĢ十分ãĒデãƒŧã‚ŋãƒã‚¤ãƒŗãƒˆãŒåˆŠį”¨å¯čƒŊであることを äŋč¨ŧしぞす。 こぎä爿¸Ŧされる厉厚渊åēĻã¯ã€įžåœ¨ãŽå€¤ãŽæ¨ĒãĢæ‹Ŧåŧ§ã§čĄ¨į¤ēã•ã‚Œã€ã‚ˇã‚šãƒ†ãƒ ãŽå†ˇå´ãŒ éŠåˆ‡ã‹ãŠã†ã‹ã‚’čŠ•äžĄã™ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ã“ãŽæŽ¨åŽšæ¸ŠåēĻã¯æƒ…å ąæäž›ãŽãŋã‚’į›Žįš„ã¨ã—ãĻおり、 SnapRAIDぎ動äŊœãĢはåŊąéŸŋしぞせん。プログナムぎ動äŊœã¯ã€åŽŸéš›ãŽæ¸ŦåŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻãĢぎãŋ åŸēãĨいãĻいぞす。 ã“ãŽåˆ†æžã‚’åŽŸčĄŒã™ã‚‹ãŸã‚ãĢ、SnapRAIDã¯ã‚ˇã‚šãƒ†ãƒ æ¸ŠåēĻãŽå‚į…§ãŒåŋ…čĻã§ã™ã€‚ ãžãšã€åˆŠį”¨å¯čƒŊãĒハãƒŧドã‚Ļェã‚ĸã‚ģãƒŗã‚ĩãƒŧからčĒ­ãŋå–ã‚ã†ã¨ã—ãžã™ã€‚ã‚ˇã‚šãƒ†ãƒ ã‚ģãƒŗã‚ĩãƒŧãĢ ã‚ĸクã‚ģ゚できãĒã„å ´åˆã¯ã€åŽŸčĄŒé–‹å§‹æ™‚ãĢæ¸Ŧ厚された最もäŊŽã„ãƒ‡ã‚Ŗã‚šã‚¯æ¸ŠåēĻをフりãƒŧãƒĢãƒãƒƒã‚¯å‚į…§ã¨ã—ãĻ äŊŋį”¨ã—ãžã™ã€‚ 通常、SnapRAIDã¯æœ€ã‚‚į†ąã„ãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻぎãŋã‚’čĄ¨į¤ēしぞす。 すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ãŽæ¸ŠåēĻã‚’čĄ¨į¤ēするãĢは、-A ぞたは --stats ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã—ãžã™ã€‚ 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- 渊åēĻåˆļ限ãĢ達したときぎ゚ã‚ŋãƒŗãƒã‚¤æ™‚é–“īŧˆåˆ†å˜äŊīŧ‰ã‚’č¨­åŽšã—ãžã™ã€‚ã“ãŽæœŸé–“ä¸­ã€ãƒ‡ã‚Ŗã‚šã‚¯ã¯ ã‚šãƒ”ãƒŗãƒ€ã‚Ļãƒŗã—ãŸãžãžã§ã™ã€‚ãƒ‡ãƒ•ã‚ŠãƒĢトは5分です。 7.14 pool DIR ------------- `pool` ã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãĻãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイぎäģŽæƒŗãƒ“ãƒĨãƒŧがäŊœæˆã•れるプãƒŧãƒĒãƒŗã‚°ãƒ‡ã‚ŖãƒŦクトãƒĒを åŽšįžŠã—ãžã™ã€‚ ãƒ‡ã‚ŖãƒŦクトãƒĒはæ—ĸãĢ存在しãĻいるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ 7.15 share UNC_DIR ------------------ ãƒ‡ã‚Ŗã‚šã‚¯ãĢãƒĒãƒĸãƒŧトでã‚ĸクã‚ģ゚するためãĢåŋ…čρãĒWindows UNCãƒ‘ã‚šã‚’åŽšįžŠã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒæŒ‡åŽšã•ã‚ŒãĻいる場合、プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒãĢäŊœæˆã•ã‚ŒãŸã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ã€ ãƒ‡ã‚Ŗã‚šã‚¯ãĢã‚ĸクã‚ģ゚するためãĢこぎUNCパ゚をäŊŋį”¨ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŒãĒã„å ´åˆã€į”Ÿæˆã•ã‚ŒãŸã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ãƒ­ãƒŧã‚ĢãƒĢパ゚ぎãŋをäŊŋį”¨ã—ã€ プãƒŧãƒĢãƒ‡ã‚ŖãƒŦクトãƒĒをネットワãƒŧクįĩŒį”ąã§å…ąæœ‰ã™ã‚‹ã“とはできぞせん。 ã‚ˇãƒŗãƒœãƒĒックãƒĒãƒŗã‚¯ã¯ã€æŒ‡åŽšã•ã‚ŒãŸUNCパ゚をäŊŋį”¨ã—ãĻåŊĸ成され、`data` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ æŒ‡åŽšã•ã‚ŒãŸãƒ‡ã‚Ŗã‚šã‚¯åã‚’čŋŊ加し、最垌ãĢãƒ•ã‚Ąã‚¤ãƒĢãŽãƒ‡ã‚ŖãƒŦクトãƒĒと名前をčŋŊ加しぞす。 こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯Windowsでぎãŋåŋ…čĻã§ã™ã€‚ 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ å„ãƒ‡ã‚Ŗã‚šã‚¯ãŽSMARTåąžæ€§ã‚’å–åž—ã™ã‚‹ãŸã‚ãŽã‚Ģ゚ã‚ŋムsmartctlã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’åŽšįžŠã—ãžã™ã€‚ これは、RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧや一部ぎUSBãƒ‡ã‚Ŗã‚šã‚¯ãŒč‡Ē動検å‡ēできãĒい場合ãĢåŋ…čρãĢãĒる ことがありぞす。`%s` プãƒŦãƒŧ゚ホãƒĢダãƒŧはデバイ゚名ãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ãŒã€ RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧãĒおぎå›ē厚デバイ゚ではã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã™ã€‚ DISK は `data` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã•ã‚ŒãŸãŽã¨åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ PARITY はパãƒĒãƒ†ã‚ŖåãŽã„ãšã‚Œã‹ã§ã™īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity`、ぞたは `z-parity`。 指厚された OPTIONS で、`%s` 文字列はデバイ゚名ãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚ RAIDã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧぎ場合、デバイ゚はå›ē厚されãĻいる可čƒŊ性がéĢ˜ã„ãŸã‚ã€ `%s` をäŊŋį”¨ã™ã‚‹åŋ…čĻã¯ãĒいかもしれぞせん。 äŊŋį”¨å¯čƒŊãĒã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢついãĻは、smartmontoolsぎドキãƒĨãƒĄãƒŗãƒˆã‚’å‚į…§ã—ãĻください。 https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices 例īŧš smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- ãƒ‡ã‚Ŗã‚šã‚¯éšœåŽŗãŽįĸēįŽ‡ã‚’č¨ˆįŽ—ã™ã‚‹ã¨ããĢ、指厚されたSMARTåąžæ€§ã‚’į„ĄčĻ–ã—ãžã™ã€‚ こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ãŒį‰šåŽšãŽåąžæ€§ãĢついãĻᕰ叏ãĒ値ぞたはčĒ¤č§Ŗã‚’æ‹›ãå€¤ã‚’å ąå‘Šã™ã‚‹å ´åˆãĢ åŊšįĢ‹ãĄãžã™ã€‚ DISK は `data` ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§æŒ‡åŽšã•ã‚ŒãŸãŽã¨åŒã˜ãƒ‡ã‚Ŗã‚šã‚¯åã§ã™ã€‚ PARITY はパãƒĒãƒ†ã‚ŖåãŽã„ãšã‚Œã‹ã§ã™īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity`、ぞたは `z-parity`。 į‰šæŽŠãĒ値 `*` は、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã§åąžæ€§ã‚’į„ĄčĻ–ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã§ããžã™ã€‚ 䞋としãĻ、すずãĻãŽãƒ‡ã‚Ŗã‚šã‚¯ã§ `Current Pending Sector Count` åąžæ€§ã‚’į„ĄčĻ–ã™ã‚‹ãĢはīŧš smartignore * 197 最初ぎパãƒĒãƒ†ã‚Ŗãƒ‡ã‚Ŗã‚šã‚¯ã§ãŽãŋį„ĄčĻ–ã™ã‚‹ãĢはīŧš smartignore parity 197 7.18 Examples ------------- Unixぎ一čˆŦįš„ãĒ構成ぎ䞋はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Windowsぎ一čˆŦįš„ãĒ構成ぎ䞋はæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= パã‚ŋãƒŧãƒŗã¯ã€åĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢãžãŸã¯é™¤å¤–ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã™ã‚‹ãŸã‚ãŽæŸ”čģŸãĒæ–šæŗ•ã‚’ 提䞛しぞす。グロブ文字をäŊŋį”¨ã™ã‚‹ã“ã¨ã§ã€ã™ãšãĻぎパ゚を手動でãƒĒ゚トすることãĒく、 į‰šåŽšãŽãƒ•ã‚Ąã‚¤ãƒĢåã‚„ãƒ‡ã‚ŖãƒŦクトãƒĒ構造全äŊ“ãĢä¸€č‡´ã™ã‚‹ãƒĢãƒŧãƒĢã‚’åŽšįžŠã§ããžã™ã€‚ į–‘å•įŦĻ `?` ã¯ã€ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字を除くäģģæ„ãŽ1文字ãĢä¸€č‡´ã—ãžã™ã€‚ これãĢより、パã‚ŋãƒŧãƒŗã‚’å˜ä¸€ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢãĢ限厚したぞぞ、可変文字を æŒã¤ãƒ•ã‚Ąã‚¤ãƒĢåã¨ä¸€č‡´ã•ã›ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ 単一ぎã‚ĸ゚ã‚ŋãƒĒ゚ク `*` はäģģæ„ãŽæ–‡å­—列ãĢä¸€č‡´ã—ãžã™ãŒã€į–‘å•įŦĻと同様ãĢ ãƒ‡ã‚ŖãƒŦクトãƒĒぎåĸƒį•Œã‚’čļŠãˆã‚‹ã“ã¨ã¯ã‚ã‚Šãžã›ã‚“ã€‚ã‚šãƒŠãƒƒã‚ˇãƒĨで停æ­ĸするため、 å˜ä¸€ãŽãƒ‘ã‚šã‚ŗãƒŗãƒãƒŧãƒãƒŗãƒˆå†…ã§ãŽä¸€č‡´ãĢ遊しãĻã„ãžã™ã€‚ã“ã‚Œã¯ã€ã‚ˇã‚§ãƒĢぎ グロブでおãĒじãŋぎ標æē–įš„ãĒワイãƒĢドã‚Ģãƒŧドぎ動äŊœã§ã™ã€‚ ダブãƒĢã‚ĸ゚ã‚ŋãƒĒ゚ク `**` はよりåŧˇåŠ›ã§ã€ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字をåĢむ äģģæ„ãŽæ–‡å­—列ãĢä¸€č‡´ã—ãžã™ã€‚ã“ã‚ŒãĢより、パã‚ŋãƒŧãƒŗãŒč¤‡æ•°ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢを ãžãŸã„ã§ä¸€č‡´ã§ãã‚‹ã‚ˆã†ãĢãĒりぞす。`**` がパã‚ŋãƒŧãƒŗå†…ãĢį›´æŽĨ埋めčžŧぞれãĻいる場合、 å‘¨å›˛ãŽãƒĒテナãƒĢテキ゚トぎ間ãĢã‚ã‚‹ã‚šãƒŠãƒƒã‚ˇãƒĨをåĢむ0文字äģĨ上ぎ文字ãĢä¸€č‡´ã—ãžã™ã€‚ `**` ぎ最も重čρãĒäŊŋã„æ–šã¯ã€į‰šåˆĨãĒåŊĸåŧã§ã‚ã‚‹ `/**/` です。これは 0個äģĨ上ぎ厌全ãĒãƒ‡ã‚ŖãƒŦクトãƒĒãƒŦベãƒĢãĢä¸€č‡´ã—ã€æ­ŖįĸēãĒパ゚構造をįŸĨらãĒくãĻも、 ãƒ‡ã‚ŖãƒŦクトãƒĒツãƒĒãƒŧ内ぎäģģæ„ãŽæˇąã•ãĢã‚ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã¨ä¸€č‡´ã•ã›ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ 䞋えば、パã‚ŋãƒŧãƒŗ `src/**/main.js` は `src/main.js`īŧˆãƒ‡ã‚ŖãƒŦクトãƒĒを0個゚キップīŧ‰ã€ `src/ui/main.js`īŧˆ1個゚キップīŧ‰ã€`src/ui/components/main.js`īŧˆ2個゚キップīŧ‰ ãĢä¸€č‡´ã—ãžã™ã€‚ 角æ‹Ŧåŧ§ `[]` をäŊŋį”¨ã—ãŸæ–‡å­—ã‚¯ãƒŠã‚šã¯ã€æŒ‡åŽšã•ã‚ŒãŸã‚ģãƒƒãƒˆãžãŸã¯į¯„å›˛ãŽ äģģæ„ãŽ1文字ãĢä¸€č‡´ã—ãžã™ã€‚äģ–ぎ単一文字パã‚ŋãƒŧãƒŗã¨åŒæ§˜ãĢ、 ãƒ‡ã‚ŖãƒŦクトãƒĒåŒē切り文字ãĢã¯ä¸€č‡´ã—ãžã›ã‚“ã€‚ã‚¯ãƒŠã‚šã¯į¯„å›˛ã¨ã€æ„Ÿå˜†įŦĻを äŊŋį”¨ã—ãŸåĻ厚をã‚ĩポãƒŧトしãĻいぞす。 čĻšãˆãĻおくずき栚æœŦįš„ãĒ違いは、`*`、`?`ã€ãŠã‚ˆãŗæ–‡å­—ã‚¯ãƒŠã‚šã¯ã™ãšãĻ ãƒ‡ã‚ŖãƒŦクトãƒĒぎåĸƒį•Œã‚’å°Šé‡ã—ã€å˜ä¸€ãŽãƒ‘ã‚šã‚ŗãƒŗãƒãƒŧãƒãƒŗãƒˆå†…ã§ãŽãŋä¸€č‡´ã™ã‚‹ãŽãĢ寞し、 `**` ã¯ãƒ‡ã‚ŖãƒŦクトãƒĒåŒēåˆ‡ã‚Šæ–‡å­—ã‚’ãžãŸã„ã§ä¸€č‡´ã§ãã‚‹å”¯ä¸€ãŽãƒ‘ã‚ŋãƒŧãƒŗã§ã‚ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚ 4ã¤ãŽį•°ãĒã‚‹į¨ŽéĄžãŽãƒ‘ã‚ŋãƒŧãƒŗãŒã‚ã‚Šãžã™ã€‚ FILE FILE という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ DIR/ DIR という名前ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒとそぎ中ぎすずãĻを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ‡ã‚ŖãƒŦクトãƒĒãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ•ã‚Ąã‚¤ãƒĢãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ /PATH/FILE æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒãƒ•ã‚Ąã‚¤ãƒĢ パ゚を選択しぞす。こぎパã‚ŋãƒŧãƒŗã¯ ãƒ•ã‚Ąã‚¤ãƒĢãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ‡ã‚ŖãƒŦクトãƒĒãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ /PATH/DIR/ æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒãƒ‡ã‚ŖãƒŦクトãƒĒ パ゚とそぎ中ぎすずãĻを選択しぞす。 こぎパã‚ŋãƒŧãƒŗã¯ãƒ‡ã‚ŖãƒŦクトãƒĒãĢぎãŋéŠį”¨ã•ã‚Œã€ãƒ•ã‚Ąã‚¤ãƒĢãĢã¯éŠį”¨ã•ã‚Œãžã›ã‚“ã€‚ / で始ぞるįĩļ寞パ゚を指厚する場合、それはロãƒŧã‚ĢãƒĢãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ãŽãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒではãĒく、 **ã‚ĸãƒŦイぎãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒ**ãĢéŠį”¨ã•ã‚Œãžã™ã€‚ Windowsでは、フりワãƒŧãƒ‰ã‚šãƒŠãƒƒã‚ˇãƒĨ / ぎäģŖã‚ã‚ŠãĢãƒãƒƒã‚¯ã‚šãƒŠãƒƒã‚ˇãƒĨ \ をäŊŋį”¨ã§ããžã™ã€‚ Windowsã‚ˇã‚šãƒ†ãƒ ãƒ‡ã‚ŖãƒŦクトãƒĒã€ã‚¸ãƒŖãƒŗã‚¯ã‚ˇãƒ§ãƒŗã€ãƒžã‚Ļãƒŗãƒˆãƒã‚¤ãƒŗãƒˆã€ãŠã‚ˆãŗããŽäģ–ぎWindowsぎ į‰šæŽŠãƒ‡ã‚ŖãƒŦクトãƒĒã¯ãƒ•ã‚Ąã‚¤ãƒĢとしãĻæ‰ąã‚ã‚Œãžã™ã€‚ã¤ãžã‚Šã€ãã‚Œã‚‰ã‚’é™¤å¤–ã™ã‚‹ãĢは、 ãƒ‡ã‚ŖãƒŦクトãƒĒãƒĢãƒŧãƒĢではãĒく**ãƒ•ã‚Ąã‚¤ãƒĢãƒĢãƒŧãƒĢ**をäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢ名ãĢ `*`、`?`、`[`、ぞたは `]` 文字がåĢぞれãĻいる場合は、 グロブ文字としãĻč§Ŗé‡ˆã•ã‚ŒãĒいようãĢ**ã‚¨ã‚šã‚ąãƒŧプ**するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ Unixã§ã¯ã‚¨ã‚šã‚ąãƒŧプ文字は `\` です。Windowsでは `^` です。 パã‚ŋãƒŧãƒŗãŒã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗãĢã‚ã‚‹å ´åˆã¯ã€ã‚ŗãƒžãƒŗãƒ‰ã‚ˇã‚§ãƒĢãĢã‚ˆãŖãĻč§Ŗé‡ˆã•ã‚Œã‚‹ãŽã‚’é˜˛ããŸã‚ãĢ、 ã‚¨ã‚šã‚ąãƒŧプ文字を**2倍**ãĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ æ§‹æˆãƒ•ã‚Ąã‚¤ãƒĢでは、å‡Ļį†ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒĒãƒŗã‚°ã™ã‚‹ãŸã‚ãĢį•°ãĒるæˆĻį•ĨをäŊŋį”¨ã§ããžã™ã€‚ æœ€ã‚‚į°Ąå˜ãĒã‚ĸプロãƒŧチは、**除外**したいすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢã¨ãƒ‡ã‚ŖãƒŦクトãƒĒを削除するためãĢ、 `exclude` ãƒĢãƒŧãƒĢぎãŋをäŊŋį”¨ã™ã‚‹ã“ã¨ã§ã™ã€‚äž‹īŧš # `*.unrecoverable` という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを除外 exclude *.unrecoverable # ãƒĢãƒŧãƒˆãƒ‡ã‚ŖãƒŦクトãƒĒ `/lost+found` を除外 exclude /lost+found/ # `tmp` という名前ぎäģģæ„ãŽã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒを除外 exclude tmp/ 反寞ぎã‚ĸプロãƒŧチは、`include` ãƒĢãƒŧãƒĢぎãŋをäŊŋį”¨ã—ãĻ、**å‡Ļį†ã—ãŸã„ãƒ•ã‚Ąã‚¤ãƒĢぎãŋ**を åŽšįžŠã™ã‚‹ã“ã¨ã§ã™ã€‚äž‹īŧš # ä¸€éƒ¨ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぎãŋをåĢめる include /movies/ include /musics/ include /pictures/ æœ€åžŒãŽæ–šæŗ•ã¨ã—ãĻは、`exclude` と `include` ãƒĢãƒŧãƒĢã‚’æˇˇåœ¨ã•ã›ãžã™ã€‚ã“ãŽå ´åˆã€ **ãƒĢãƒŧãƒĢぎ順åēãŒé‡čρ**です。前ぎãƒĢãƒŧãƒĢは垌ぎãƒĢãƒŧãƒĢよりもå„Ē先されぞす。 į°Ąį´ åŒ–ã™ã‚‹ãŸã‚ãĢ、すずãĻぎ `exclude` ãƒĢãƒŧãƒĢを最初ãĢãƒĒ゚トし、æŦĄãĢすずãĻぎ `include` ãƒĢãƒŧãƒĢをãƒĒ゚トできぞす。䞋īŧš # `*.unrecoverable` という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを除外 exclude *.unrecoverable # `tmp` という名前ぎäģģæ„ãŽã‚ĩãƒ–ãƒ‡ã‚ŖãƒŦクトãƒĒを除外 exclude tmp/ # ä¸€éƒ¨ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぎãŋをåĢめる include /movies/ include /musics/ include /pictures/ ã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗã§ -f ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€`include` パã‚ŋãƒŧãƒŗãŽãŋを äŊŋį”¨ã§ããžã™ã€‚äž‹īŧš # .mp3 ãƒ•ã‚Ąã‚¤ãƒĢぎãŋをチェック。 # Unixã§ã¯ã€ã‚ˇã‚§ãƒĢãĢã‚ˆã‚‹ã‚°ãƒ­ãƒ–åą•é–‹ã‚’é˜˛ããŸã‚ãĢåŧ•ᔍįŦĻをäŊŋį”¨ã€‚ snapraid -f "*.mp3" check Unixã§ã¯ã€ã‚ŗãƒžãƒŗãƒ‰ãƒŠã‚¤ãƒŗã§ã‚°ãƒ­ãƒ–æ–‡å­—ã‚’äŊŋį”¨ã™ã‚‹å ´åˆã€ã‚ˇã‚§ãƒĢãŒãã‚Œã‚‰ã‚’åą•é–‹ã™ã‚‹ãŽã‚’ é˜˛ããŸã‚ãĢåŧ•ᔍįŦĻã§å›˛ã‚€åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ 9 IGNORE FILE ============= č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢぎグロãƒŧバãƒĢãƒĢãƒŧãƒĢãĢ加えãĻ、ã‚ĸãƒŦイ内ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒãĢ .snapraidignore ãƒ•ã‚Ąã‚¤ãƒĢを配įŊŽã—ãĻã€åˆ†æ•Ŗåž‹ãŽé™¤å¤–ãƒĢãƒŧãƒĢã‚’åŽšįžŠã§ããžã™ã€‚ `.snapraidignore` ã§åŽšįžŠã•ã‚ŒãŸãƒĢãƒŧãƒĢã¯ã€č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢぎãƒĢãƒŧãƒĢぎ垌ãĢ éŠį”¨ã•ã‚Œãžã™ã€‚ã“ã‚Œã¯ã€ãã‚Œã‚‰ãŒã‚ˆã‚ŠéĢ˜ã„å„Ē先åēĻã‚’æŒãĄã€ã‚°ãƒ­ãƒŧバãƒĢč¨­åŽšã§ äģĨ前ãĢåĢぞれãĻã„ãŸãƒ•ã‚Ąã‚¤ãƒĢを除外するためãĢäŊŋį”¨ã§ãã‚‹ã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚ äē‹åŽŸä¸Šã€ãƒ­ãƒŧã‚ĢãƒĢãƒĢãƒŧãƒĢãŒä¸€č‡´ã™ã‚‹å ´åˆã€ã‚°ãƒ­ãƒŧバãƒĢãĒ包åĢč¨­åŽšãĢé–ĸäŋ‚ãĒく、 ãƒ•ã‚Ąã‚¤ãƒĢは除外されぞす。 `.snapraidignore` ぎパã‚ŋãƒŧãƒŗãƒ­ã‚¸ãƒƒã‚¯ã¯ã‚°ãƒ­ãƒŧバãƒĢč¨­åŽšã‚’åæ˜ ã—ãĻいぞすが、 パã‚ŋãƒŧãƒŗã¯ããŽãƒ•ã‚Ąã‚¤ãƒĢが配įŊŽã•れãĻã„ã‚‹ãƒ‡ã‚ŖãƒŦクトãƒĒãĢå›ē厚されぞすīŧš FILE ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぞたはそぎ下ãĢある、FILE という名前ぎäģģæ„ãŽãƒ•ã‚Ąã‚¤ãƒĢを 選択しぞす。これは、グロãƒŧバãƒĢパã‚ŋãƒŧãƒŗã¨åŒã˜ã‚°ãƒ­ãƒƒãƒ“ãƒŗã‚°ãƒĢãƒŧãƒĢãĢ垓いぞす。 DIR/ ã“ãŽãƒ‡ã‚ŖãƒŦクトãƒĒぞたはそぎ下ãĢある、DIR という名前ぎäģģæ„ãŽãƒ‡ã‚ŖãƒŦクトãƒĒと そぎ中ぎすずãĻを選択しぞす。 /PATH/FILE `.snapraidignore` ãƒ•ã‚Ąã‚¤ãƒĢぎ場所をåŸēæē–ãĢしãĻã€æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒ ãƒ•ã‚Ąã‚¤ãƒĢを選択しぞす。 /PATH/DIR/ `.snapraidignore` ãƒ•ã‚Ąã‚¤ãƒĢぎ場所をåŸēæē–ãĢしãĻã€æŒ‡åŽšã•ã‚ŒãŸæ­ŖįĸēãĒ ãƒ‡ã‚ŖãƒŦクトãƒĒとそぎ中ぎすずãĻを選択しぞす。 グロãƒŧバãƒĢč¨­åŽšã¨ã¯į•°ãĒり、`.snapraidignore` ãƒ•ã‚Ąã‚¤ãƒĢは除外ãƒĢãƒŧãƒĢぎãŋを ã‚ĩポãƒŧトしぞす。`include` パã‚ŋãƒŧãƒŗã‚„åĻ厚 (!) はäŊŋį”¨ã§ããžã›ã‚“ã€‚ たとえば、`/mnt/disk1/projects/` ãĢ `.snapraidignore` がある場合īŧš # /mnt/disk1/projects/output.bin ぎãŋを除外 /output.bin # projects/ 内ぎ `build` ã¨ã„ã†åå‰ãŽãƒ‡ã‚ŖãƒŦクトãƒĒをすずãĻ除外 build/ # projects/ ぞたはそぎã‚ĩブフりãƒĢダ内ぎすずãĻぎ .tmp ãƒ•ã‚Ąã‚¤ãƒĢを除外 *.tmp 10 CONTENT ========== SnapRAIDã¯ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ一čĻ§ã¨ãƒã‚§ãƒƒã‚¯ã‚ĩãƒ ã‚’ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ぞす。 これはバイナãƒĒãƒ•ã‚Ąã‚¤ãƒĢã§ã‚ã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸãƒŦイãĢ存在するすずãĻãŽãƒ•ã‚Ąã‚¤ãƒĢと、 それらぎ整合性を検č¨ŧするためぎすずãĻぎチェックã‚ĩムを一čĻ§čĄ¨į¤ēしぞす。 ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢは `sync` ãŠã‚ˆãŗ `scrub` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ書きされ、 `fix`、`check`ã€ãŠã‚ˆãŗ `status` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ取られぞす。 11 PARITY ========= SnapRAIDは、ã‚ĸãƒŦイぎパãƒĒãƒ†ã‚Ŗæƒ…å ąã‚’ãƒ‘ãƒĒãƒ†ã‚Ŗãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã—ぞす。 これらはバイナãƒĒãƒ•ã‚Ąã‚¤ãƒĢであり、`content` ãƒ•ã‚Ąã‚¤ãƒĢã§åŽšįžŠã•ã‚ŒãŸã™ãšãĻぎブロックぎ č¨ˆįŽ—ã•ã‚ŒãŸãƒ‘ãƒĒãƒ†ã‚ŖãŒåĢぞれãĻいぞす。 ã“ã‚Œã‚‰ãŽãƒ•ã‚Ąã‚¤ãƒĢは `sync` ãŠã‚ˆãŗ `fix` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻčĒ­ãŋ書きされ、 `scrub` ãŠã‚ˆãŗ `check` ã‚ŗãƒžãƒŗãƒ‰ãĢã‚ˆãŖãĻ**čĒ­ãŋ取られるだけ**です。 12 ENCODING =========== UnixぎSnapRAIDã¯ã€ã‚¨ãƒŗã‚ŗãƒŧãƒ‡ã‚Ŗãƒŗã‚°ã‚’į„ĄčĻ–ã—ãžã™ã€‚ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã§äŊŋį”¨ã•ã‚ŒãĻいる ãŽã¨åŒã˜ã‚¨ãƒŗã‚ŗãƒŧãƒ‡ã‚Ŗãƒŗã‚°ã§ãƒ•ã‚Ąã‚¤ãƒĢ名をčĒ­ãŋ取り、äŋå­˜ã—ぞす。 Windowsã§ã¯ã€ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰čĒ­ãŋ取られたすずãĻぎ名前はUTF-8åŊĸåŧãĢ変換され、 å‡Ļį†ã•ã‚Œãžã™ã€‚ ãƒ•ã‚Ąã‚¤ãƒĢåã‚’æ­Ŗã—ãå‡ē力するãĢは、`chcp 65001` ã‚ŗãƒžãƒŗãƒ‰ã§Windowsã‚ŗãƒŗã‚ŊãƒŧãƒĢをUTF-8ãƒĸãƒŧドãĢč¨­åŽšã—ã€ ã‚ŗãƒŗã‚ŊãƒŧãƒĢãƒ•ã‚Šãƒŗãƒˆã¨ã—ãĻ `Lucida Console` ãĒおぎTrueTypeãƒ•ã‚Šãƒŗãƒˆã‚’**äŊŋį”¨ã™ã‚‹**åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ これはå‡ēåŠ›ã•ã‚Œã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ名ãĢぎãŋåŊąéŸŋã—ãžã™ã€‚ã‚ŗãƒŗã‚ŊãƒŧãƒĢå‡ēåŠ›ã‚’ãƒ•ã‚Ąã‚¤ãƒĢãĢãƒĒダイãƒŦクトする場合、 įĩæžœãŽãƒ•ã‚Ąã‚¤ãƒĢは常ãĢUTF-8åŊĸåŧãĢãĒりぞす。 13 COPYRIGHT ============ This file is Copyright (C) 2025 Andrea Mazzoleni 14 SEE ALSO =========== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ko.1000066400000000000000000002235301522717156100163230ustar00rootroot00000000000000.TH "ë””ėŠ¤íŦ ė–´ë ˆė´ëĨŧ ėœ„í•œ SnapRAID ë°ąė—…" 1 .SH NAME snapraid \- ë””ėŠ¤íŦ ė–´ë ˆė´ëĨŧ ėœ„í•œ SnapRAID ë°ąė—… .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAID는 ë””ėŠ¤íŦ ė–´ë ˆė´ëĨŧ ėœ„í•´ ė„¤ęŗ„ëœ ë°ąė—… 프로그램ėœŧ로, ėĩœëŒ€ 6ę°œė˜ ë””ėŠ¤íŦ 똤ëĨ˜ę°€ ë°œėƒí•´ë„ ë°ė´í„°ëĨŧ ëŗĩęĩŦ하기 ėœ„í•œ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ합니다. .PP ėŖŧ로 íŦęŗ  ėžėŖŧ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” 파ėŧė„ 氀맄 홈 ë¯¸ë””ė–´ ė„ŧ터ëĨŧ ėœ„í•´ ęŗ ė•ˆëœ SnapRAID는 ë‹¤ėŒęŗŧ ę°™ė€ ëLJ 氀맀 기ëŠĨė„ 렜ęŗĩ합니다: .PD 0 .IP \(bu 파ėŧė„ ë‹¤ė‹œ íŦ맷할 í•„ėš” ė—†ė´ ė´ë¯¸ 파ėŧ로 ėą„ė›Œė§„ ë””ėŠ¤íŦëĨŧ í™œėšŠí•  눘 ėžˆėœŧ늰, í‰ė†Œė˛˜ëŸŧ ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. .IP \(bu ë°ė´í„° ëŦ´ę˛°ė„ąė„ ëŗ´ėžĨí•˜ęŗ  ëŦ´ë‹¨ ė†ėƒė„ ë°Šė§€í•˜ę¸° ėœ„í•´ ëĒ¨ë“  ë°ė´í„°ę°€ í•´ė‹œëŠë‹ˆë‹¤. .IP \(bu ė‹¤íŒ¨í•œ ë””ėŠ¤íŦė˜ ėˆ˜ę°€ 패ëĻŦ티 눘ëĨŧ 봈ęŗŧ하는 ę˛Ŋ뚰, ë°ė´í„° ė†ė‹¤ė€ 똁í–Ĩė„ ë°›ė€ ë””ėŠ¤íŦ로 ė œí•œë˜ëŠ°, 다ëĨ¸ ë””ėŠ¤íŦė˜ ë°ė´í„°ëŠ” ęŗ„ė† ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. .IP \(bu ė‹¤ėˆ˜ëĄœ ë””ėŠ¤íŦė˜ 파ėŧė„ ė‚­ė œí•œ ę˛Ŋėš°ė—ë„ ëŗĩęĩŦ가 가ëŠĨ합니다. .IP \(bu ë””ėŠ¤íŦ는 ė„œëĄœ 다ëĨ¸ íŦ기ëĨŧ ę°€ė§ˆ 눘 ėžˆėŠĩ니다. .IP \(bu ė–¸ė œë“ ė§€ ë””ėŠ¤íŦëĨŧ ėļ”가할 눘 ėžˆėŠĩ니다. .IP \(bu SnapRAID는 ë°ė´í„°ëĨŧ ę°€ë‘ė§€ ė•ŠėŠĩ니다. ė–¸ė œë“ ė§€ íŦ맷하거나 ë°ė´í„°ëĨŧ ė´ë™í•  í•„ėš” ė—†ė´ ė‚ŦėšŠė„ ė¤‘ë‹¨í•  눘 ėžˆėŠĩ니다. .IP \(bu 파ėŧ뗐 ė•Ąė„¸ėŠ¤í•˜ë ¤ëŠ´ 단ėŧ ë””ėŠ¤íŦ만 íšŒė „í•˜ëŠ´ ë˜ë¯€ëĄœ, ė „ë Ĩė„ 레ė•Ŋí•˜ęŗ  ė†ŒėŒė„ 뤄ėŧ 눘 ėžˆėŠĩ니다. .PD .PP 더 ėžė„¸í•œ ė •ëŗ´ëŠ” ęŗĩė‹ SnapRAID ė‚Ŧė´íŠ¸ëĨŧ ë°ŠëŦ¸í•˜ė‹­ė‹œė˜¤: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID는 RAID뙀 ë°ąė—… í”„ëĄœęˇ¸ëž¨ė˜ í•˜ė´ë¸ŒëĻŦ드로, 두 ę°€ė§€ė˜ ėžĨė ė„ 결합하는 ę˛ƒė„ ëĒŠí‘œëĄœ 합니다. í•˜ė§€ë§Œ, ė‚ŦėšŠ 렄뗐 ęŗ ë ¤í•´ė•ŧ 할 ëLJ 氀맀 ė œí•œ ė‚Ŧí•­ė´ ėžˆėŠĩ니다. .PP ėŖŧėš” ė œí•œ ė‚Ŧí•­ė€ ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•˜ęŗ  ėĩœęˇŧ뗐 동기화(sync)í•˜ė§€ ė•Šė€ ę˛Ŋ뚰, ė™„ė „ížˆ ëŗĩęĩŦí•˜ė§€ ëĒģ할 눘 ėžˆë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 더 ęĩŦ랴렁ėœŧ로, ë§ˆė§€ë§‰ 동기화 ėž‘ė—… ė´í›„ ëŗ€ę˛Ŋ되거나 ė‚­ė œëœ 파ėŧė˜ íŦ기만íŧ ëŗĩęĩŦ가 ëļˆę°€ëŠĨ할 눘 ėžˆėŠĩ니다. ė´ëŠ” ëŗ€ę˛Ŋ되거나 ė‚­ė œëœ 파ėŧė´ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ뗐 ėžˆė§€ ė•Šë”ëŧ도 ë°œėƒí•Šë‹ˆë‹¤. ė´ę˛ƒė´ SnapRAID가 **ęą°ė˜ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” ë°ė´í„°**뗐 더 ė í•Ší•œ ė´ėœ ėž…ë‹ˆë‹¤. .PP ë°˜ëŠ´ė—, ėƒˆëĄœ ėļ”ę°€ëœ 파ėŧė€ ė´ë¯¸ ėĄ´ėžŦ하는 파ėŧė˜ ëŗĩęĩŦëĨŧ ë°Ší•´í•˜ė§€ ė•ŠėŠĩ니다. ėƒˆëĄœ ėļ”ę°€ëœ 파ėŧė´ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ뗐 ėžˆëŠ” ę˛Ŋėš°ė—ë§Œ 해당 파ėŧė„ ėžƒę˛Œ 됩니다. .PP 기타 SnapRAID ė œí•œ ė‚Ŧí•­ė€ ë‹¤ėŒęŗŧ 같ėŠĩ니다: .PD 0 .IP \(bu SnapRAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ė—Ŧė „ížˆ 각 ë””ėŠ¤íŦ뗐 대해 ëŗ„ë„ė˜ 파ėŧ ė‹œėŠ¤í…œė´ ėžˆėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ í•˜ë‚˜ė˜ 큰 파ėŧ ė‹œėŠ¤í…œė„ ė–ģėŠĩ니다. .IP \(bu SnapRAID는 ë°ė´í„°ëĨŧ ėŠ¤íŠ¸ëŧė´í•‘í•˜ė§€ ė•ŠėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ėŠ¤íŠ¸ëŧė´í•‘ėœŧ로 ė†ë„ í–Ĩėƒė„ ė–ģėŠĩ니다. .IP \(bu SnapRAID는 ė‹¤ė‹œę°„ ëŗĩęĩŦëĨŧ ė§€ė›í•˜ė§€ ė•ŠėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ë””ėŠ¤íŦ가 ė‹¤íŒ¨í–ˆė„ 때 ėž‘ė—…ė„ 늈ėļœ í•„ėš”ę°€ ė—†ėŠĩ니다. .IP \(bu SnapRAID는 ė œí•œëœ ėˆ˜ė˜ ë””ėŠ¤íŦ 똤ëĨ˜ė—ė„œë§Œ ë°ė´í„°ëĨŧ ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. ë°ąė—…ė„ ė‚ŦėšŠí•˜ëŠ´ 렄랴 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ė™„ė „í•œ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. .IP \(bu 파ėŧ ė´ëĻ„, íƒ€ėž„ėŠ¤íƒŦ프, ė‹ŦëŗŧëĻ­ 링íŦ, 하드 링íŦ만 ė €ėžĨ됩니다. ęļŒí•œ, ė†Œėœ ęļŒ, 확ėžĨ ė†ė„ąė€ ė €ėžĨë˜ė§€ ė•ŠėŠĩ니다. .PD .SH GETTING STARTED SnapRAIDëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´, ë¨ŧė € ë””ėŠ¤íŦ ė–´ë ˆė´ė—ė„œ í•˜ë‚˜ė˜ ë””ėŠ¤íŦëĨŧ \`parity\`(패ëĻŦ티) ė •ëŗ´ ė „ėšŠėœŧ로 ė„ íƒí•´ė•ŧ 합니다. í•˜ë‚˜ė˜ 패ëĻŦ티 ë””ėŠ¤íŦ로 RAID5뙀 뜠ė‚Ŧ하게 단ėŧ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. .PP RAID6뙀 뜠ė‚Ŧ하게 더 ë§Žė€ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ하려면, ėļ”ę°€ ë””ėŠ¤íŦëĨŧ 패ëĻŦí‹°ėšŠėœŧ로 똈ė•Ŋ해ė•ŧ 합니다. ėļ”ę°€ 패ëĻŦ티 ë””ėŠ¤íŦ 하나당 í•˜ë‚˜ė˜ ë””ėŠ¤íŦ 똤ëĨ˜ė— 대한 ëŗĩęĩŦëĨŧ 더 í—ˆėšŠí•Šë‹ˆë‹¤. .PP 패ëĻŦ티 ë””ėŠ¤íŦ로는 ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 ë””ėŠ¤íŦëĨŧ ė„ íƒí•´ė•ŧ 합니다. 패ëĻŦ티 ė •ëŗ´ę°€ ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 **ë°ė´í„° ë””ėŠ¤íŦ**ė˜ íŦ기만íŧ ėģ¤ė§ˆ 눘 ėžˆę¸° 때ëŦ¸ėž…니다. .PP ė´ ë””ėŠ¤íŦë“¤ė€ \`parity\` 파ėŧė„ ė €ėžĨ하는 데 ė „ë…í•˜ę˛Œ 됩니다. ė—Ŧ揰뗐 ë°ė´í„°ëĨŧ ė €ėžĨí•´ė„œëŠ” ė•ˆ 됩니다. .PP ë‹¤ėŒėœŧ로, SnapRAID로 ëŗ´í˜¸í•˜ë ¤ëŠ” \`data\`(ë°ė´í„°) ë””ėŠ¤íŦëĨŧ ė •ė˜í•´ė•ŧ 합니다. ė´ ë””ėŠ¤íŦë“¤ė´ **ęą°ė˜ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” ë°ė´í„°**ëĨŧ íŦ함할 때 ëŗ´í˜¸ 효ęŗŧ가 더 ėĸ‹ėŠĩ니다. ė´ëŸŦ한 ė´ėœ ëĄœ, Windows C:\\ ë””ėŠ¤íŦ나 Unixė˜ /home, /var, /tmp 디렉토ëĻŦëĨŧ íŦí•¨í•˜ė§€ ė•ŠëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. .PP 파ėŧ ëĒŠëĄė€ \`content\` 파ėŧ뗐 ė €ėžĨ되늰, ëŗ´í†ĩ ë°ė´í„°, 패ëĻŦ티, 또는 ëļ€íЏ ë””ėŠ¤íŦ뗐 ė €ėžĨ됩니다. ė´ 파ėŧė—ëŠ” ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•œ ëĒ¨ë“  랴íŦė„Ŧė„ íŦ함하ė—Ŧ ë°ąė—…ė— 대한 넏ëļ€ ė •ëŗ´ę°€ ë“¤ė–´ ėžˆėŠĩ니다. \`content\` 파ėŧė€ ė—ŦëŸŦ ëŗĩė‚Ŧëŗ¸ėœŧ로 ė €ėžĨ되늰, ë‹¤ė¤‘ ë””ėŠ¤íŦ 똤ëĨ˜ė˜ ę˛Ŋėš°ė—ë„ ė ė–´ë„ í•˜ë‚˜ė˜ ëŗĩė‚Ŧëŗ¸ė„ ė‚ŦėšŠí•  눘 ėžˆë„ëĄ 각 ëŗĩė‚Ŧëŗ¸ė€ ė„œëĄœ 다ëĨ¸ ë””ėŠ¤íŦ뗐 ėžˆė–´ė•ŧ 합니다. .PP 똈ëĨŧ ë“¤ė–´, í•˜ë‚˜ė˜ 패ëĻŦ티 ëŗ´í˜¸ ėˆ˜ė¤€ë§Œ ė›í•˜ęŗ  ë””ėŠ¤íŦ가 ë‹¤ėŒęŗŧ ę°™ė´ ėœ„ėš˜í•œë‹¤ęŗ  ę°€ė •í•´ ë´…ė‹œë‹¤: .PP .RS 4 /mnt/diskp <\- 패ëĻŦí‹°ėšŠėœŧ로 ė„ íƒëœ ë””ėŠ¤íŦ .PD 0 .PP .PD /mnt/disk1 <\- ëŗ´í˜¸í•  ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ .PD 0 .PP .PD /mnt/disk2 <\- ëŗ´í˜¸í•  두 ë˛ˆė§¸ ë””ėŠ¤íŦ .PD 0 .PP .PD /mnt/disk3 <\- ëŗ´í˜¸í•  넏 ë˛ˆė§¸ ë””ėŠ¤íŦ .PD 0 .PD .RE .PP ë‹¤ėŒ ė˜ĩė…˜ėœŧ로 네렕 파ėŧ /etc/snapraid.confëĨŧ ėƒė„ąí•´ė•ŧ 합니다: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP WindowsëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, ėŠŦëž˜ė‹œ ëŒ€ė‹  드ëŧė´ë¸Œ ëŦ¸ėž 및 ë°ąėŠŦëž˜ė‹œëĨŧ ė‚ŦėšŠí•˜ëŠ” Windows ę˛Ŋ로 í˜•ė‹ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP ë””ėŠ¤íŦ가 ë§Žė•„ 드ëŧė´ë¸Œ ëŦ¸ėžę°€ ëļ€ėĄąí•œ ę˛Ŋ뚰, ë””ėŠ¤íŦëĨŧ í•˜ėœ„ í´ë”ė— 링렑 ë§ˆėš´íŠ¸í•  눘 ėžˆėŠĩ니다. ë‹¤ėŒė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP ė´ ė‹œė ė—ė„œ, 패ëĻŦ티 ė •ëŗ´ëĨŧ 빌드하기 ėœ„í•´ \`sync\` ëĒ…ë šė„ ė‹¤í–‰í•  ė¤€ëš„ę°€ ë˜ė—ˆėŠĩ니다. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP ė´ í”„ëĄœė„¸ėŠ¤ëŠ” ë””ėŠ¤íŦ뗐 ė´ë¯¸ ėĄ´ėžŦ하는 ë°ė´í„°ė˜ íŦ揰뗐 따ëŧ ė˛Ģ ė‹¤í–‰ ė‹œ ëLJ ė‹œę°„ė´ 깸ëĻ´ 눘 ėžˆėŠĩ니다. ë””ėŠ¤íŦ가 ëš„ė–´ ėžˆėœŧ늴 í”„ëĄœė„¸ėŠ¤ëŠ” ėĻ‰ė‹œ ė™„ëŖŒëŠë‹ˆë‹¤. .PP Ctrl+CëĨŧ 눌ëŸŦ ė–¸ė œë“ ė§€ ė¤‘ė§€í•  눘 ėžˆėœŧ늰, ë‹¤ėŒ ė‹¤í–‰ ė‹œ ė¤‘ë‹¨ëœ ęŗŗė—ė„œ ėžŦ개됩니다. .PP ė´ ëĒ…ë šė´ ė™„ëŖŒë˜ëŠ´ ë°ė´í„°ëŠ” **SAFE**합니다. .PP ė´ė œ ė–´ë ˆė´ëĨŧ ė›í•˜ëŠ” 대로 ė‚ŦėšŠí•˜ęŗ  ėŖŧ揰렁ėœŧ로 \`sync\` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė—…ë°ė´íŠ¸í•  눘 ėžˆėŠĩ니다. .SS Scrubbing ėŖŧ揰렁ėœŧ로 ë°ė´í„° 및 패ëĻŦí‹°ė˜ 똤ëĨ˜ëĨŧ í™•ė¸í•˜ë ¤ëŠ´ \`scrub\` ëĒ…ë šė„ ė‹¤í–‰í•  눘 ėžˆėŠĩ니다. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP ė´ ëĒ…ë šė€ ë°ė´í„° ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•´ ė–´ë ˆė´ė˜ ë°ė´í„°ëĨŧ \`sync\` ëĒ…ë š 뤑뗐 ęŗ„ė‚°ëœ í•´ė‹œė™€ 비ęĩí•Šë‹ˆë‹¤. .PP ė´ ëĒ…ë šė„ ė‹¤í–‰í•  때마다 ė´ė „ė— 10ėŧ ė´ë‚´ė— 늤íŦëŸŊ된 ë°ė´í„°ëĨŧ ė œė™¸í•˜ęŗ  ė–´ë ˆė´ė˜ ė•Ŋ 8%ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 다ëĨ¸ ė–‘ė„ ė§€ė •í•˜ë ¤ëŠ´ \-p, \-\-plan ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ęŗ , 다ëĨ¸ ėŧë š(days)ė„ ė§€ė •í•˜ë ¤ëŠ´ \-o, \-\-older\-than ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 20ėŧëŗ´ë‹¤ ė˜¤ëž˜ëœ ë¸”ëĄė— 대해 ė–´ë ˆė´ė˜ 5%ëĨŧ í™•ė¸í•˜ë ¤ëŠ´ ë‹¤ėŒęŗŧ ę°™ė´ ė‚ŦėšŠí•Šë‹ˆë‹¤: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP ė´ í”„ëĄœė„¸ėŠ¤ 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ 발ę˛Ŧ되늴, 해당 ë¸”ëĄė€ \`content\` 파ėŧ뗐 bad로 í‘œė‹œë˜ëŠ° \`status\` ëĒ…ë šė— ë‚˜ė—´ëŠë‹ˆë‹¤. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP ė´ë“¤ė„ ėˆ˜ė •í•˜ë ¤ëŠ´ \-e, \-\-filter\-error ė˜ĩė…˜ėœŧ로 bad ë¸”ëĄė„ 필터링하ė—Ŧ \`fix\` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP ë‹¤ėŒ \`scrub\` ė‹œė— 똤ëĨ˜ę°€ ė‹¤ė œëĄœ ėˆ˜ė •ë˜ëŠ´ \`status\` ëŗ´ęŗ ė„œė—ė„œ ė‚Ŧëŧė§‘ë‹ˆë‹¤. 더 ëš ëĨ´ę˛Œ 하려면, \`\-p bad\`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ bad로 í‘œė‹œëœ 블록만 늤íŦëŸŊ할 눘 ėžˆėŠĩ니다. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP ë™ę¸°í™”ë˜ė§€ ė•Šė€ ė–´ë ˆė´ė—ė„œ \`scrub\`ė„ ė‹¤í–‰í•˜ëŠ´ ė œęą°ë˜ęą°ë‚˜ ėˆ˜ė •ëœ 파ėŧ로 ė¸í•œ 똤ëĨ˜ę°€ ëŗ´ęŗ ë  눘 ėžˆėŠĩ니다. ė´ëŸŦ한 똤ëĨ˜ëŠ” \`scrub\` ėļœë Ĩė—ëŠ” ëŗ´ęŗ ë˜ė§€ë§Œ, 관련 ë¸”ëĄė€ bad로 í‘œė‹œë˜ė§€ ė•ŠėŠĩ니다. .SS Pooling 및溠: ė•„ëž˜ė— 네ëĒ…ëœ 풀링(pooling) 기ëŠĨė€ **mergerfs** 도ęĩŦ로 ëŒ€ė˛´ë˜ė—ˆėœŧ늰, ė´ëŠ” SnapRAID ėģ¤ëŽ¤ë‹ˆí‹°ė—ė„œ Linux ė‚ŦėšŠėžëĨŧ ėœ„í•œ ęļŒėžĨ ė˜ĩė…˜ėž…ë‹ˆë‹¤. Mergefs는 ė—ŦëŸŦ 드ëŧė´ë¸ŒëĨŧ 단ėŧ í†ĩ합 ë§ˆėš´íŠ¸ 맀렐ėœŧ로 풀링하는 더 ėœ ė—°í•˜ęŗ  íš¨ėœ¨ė ė¸ ë°Šë˛•ė„ 렜ęŗĩ하ė—Ŧ, ė‹ŦëŗŧëĻ­ 링íŦ뗐 ė˜ėĄ´í•˜ė§€ ė•Šęŗ  ė–´ë ˆė´ ė „ė˛´ė˜ 파ėŧ뗐 대한 ė›í™œí•œ ė•Ąė„¸ėŠ¤ëĨŧ í—ˆėšŠí•Šë‹ˆë‹¤. ė´ëŠ” 패ëĻŦ티 ëŗ´í˜¸ëĨŧ ėœ„í•œ SnapRAID뙀 ėž˜ í†ĩ합되며, OpenMediaVault (OMV) 또는 ė‚ŦėšŠėž ė •ė˜ NAS ęĩŦė„ąęŗŧ ę°™ė€ ė„¤ė •ė—ė„œ 흔히 ė‚ŦėšŠëŠë‹ˆë‹¤. .PP ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧė„ 동ėŧ한 디렉토ëĻŦ 트ëĻŦ뗐 í‘œė‹œí•˜ë ¤ëŠ´, \`pooling\` 기ëŠĨė„ í™œė„ąí™”í•  눘 ėžˆėŠĩ니다. ė´ 기ëŠĨė€ ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧ뗐 대한 ėŊ기 ė „ėšŠ ę°€ėƒ 롰ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤. .PP 네렕 파ėŧė—ė„œ \`pooling\` 디렉토ëĻŦëĨŧ ë‹¤ėŒęŗŧ ę°™ė´ ęĩŦė„ąí•  눘 ėžˆėŠĩ니다: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP 또는 Windowsė—ė„œ ë‹¤ėŒęŗŧ ę°™ė´ 합니다: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP ꡸ëĻŦęŗ  ë‚˜ė„œ \`pool\` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ę°€ėƒ 롰ëĨŧ ėƒė„ąí•˜ęą°ë‚˜ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Unix 플ëžĢíŧė„ ė‚ŦėšŠí•˜ęŗ  ė´ 디렉토ëĻŦëĨŧ Windows 또는 Unix ėģ´í“¨í„°ė— ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ęŗĩėœ í•˜ë ¤ëŠ´, /etc/samba/smb.conf뗐 ë‹¤ėŒ ė˜ĩė…˜ė„ ėļ”가해ė•ŧ 합니다: .PP .RS 4 # smb.confė˜ global ė„šė…˜ė—ė„œ .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # smb.confė˜ share ė„šė…˜ė—ė„œ .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP Windowsė—ė„œ ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ęŗĩėœ í•˜ë ¤ëŠ´ 클ëŧė´ė–¸íŠ¸ę°€ ė›ę˛Šėœŧ로 ė´ë“¤ė„ í•´ė„í•´ė•ŧ 합니다. ė´ëĨŧ í™œė„ąí™”í•˜ę¸° ėœ„í•´, 풀 디렉토ëĻŦëĨŧ ęŗĩėœ í•˜ëŠ” 것 ė™¸ė—ë„, 네렕 파ėŧ뗐 ė •ė˜ëœ ë””ėŠ¤íŦ ė´ëĻ„ė„ ęŗĩ뜠 맀렐ėœŧ로 ė‚ŦėšŠí•˜ė—Ŧ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ 독ëĻŊ렁ėœŧ로 ęŗĩėœ í•´ė•ŧ 합니다. 또한 네렕 파ėŧė˜ \`share\` ė˜ĩė…˜ė—ė„œ ė›ę˛Š 클ëŧė´ė–¸íŠ¸ę°€ ė´ëŸŦ한 ęŗĩ뜠 ë””ėŠ¤íŦ뗐 ė•Ąė„¸ėŠ¤í•˜ëŠ” 데 í•„ėš”í•œ Windows UNC ę˛Ŋ로ëĨŧ ė§€ė •í•´ė•ŧ 합니다. .PP 똈ëĨŧ ë“¤ė–´, \`darkstar\`ëŧ는 ė„œë˛„ė—ė„œ ėž‘ė—…í•˜ëŠ” ę˛Ŋ뚰, ë‹¤ėŒ ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP ꡸ëĻŦęŗ  ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ë‹¤ėŒ 디렉토ëĻŦëĨŧ ęŗĩėœ í•Šë‹ˆë‹¤: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP ė´ë ‡ę˛Œ 하면 ė›ę˛Š 클ëŧė´ė–¸íŠ¸ę°€ \\\\darkstar\\poolė—ė„œ ëĒ¨ë“  파ėŧ뗐 ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. .PP 또한 ë‹¤ėŒ ëĒ…ë šėœŧ로 ė›ę˛Š 클ëŧė´ė–¸íŠ¸ëĨŧ ęĩŦė„ąí•˜ė—Ŧ ė›ę˛Š ė‹ŦëŗŧëĻ­ 링íŦ뗐 대한 ė•Ąė„¸ėŠ¤ëĨŧ í™œė„ąí™”í•´ė•ŧ 할 ėˆ˜ë„ ėžˆėŠĩ니다: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAID는 RAID ė‹œėŠ¤í…œëŗ´ë‹¤ëŠ” ë°ąė—… í”„ëĄœęˇ¸ëž¨ė˛˜ëŸŧ ėž‘ë™í•˜ëŠ°, \-f, \-\-filter ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 파ėŧė´ë‚˜ 디렉토ëĻŦëĨŧ ė´ė „ ėƒíƒœëĄœ ëŗĩė›í•˜ęą°ë‚˜ ė‚­ė œ ėˇ¨ė†Œí•  눘 ėžˆėŠĩ니다: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP 또는 디렉토ëĻŦ뗐 대해: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP 또한 \-m, \-\-filter\-missing ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 디렉토ëĻŦ ë‚´ė—ė„œ ė‹¤ėˆ˜ëĄœ ė‚­ė œëœ 파ėŧ만 ëŗĩęĩŦ할 ėˆ˜ë„ ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ 누ëŊ된 파ėŧ만 ëŗĩė›í•˜ęŗ  다ëĨ¸ 파ėŧė€ 그대로 둡니다. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP 또는 ëĒ¨ë“  드ëŧė´ë¸Œė—ė„œ ė‚­ė œëœ ëĒ¨ë“  파ėŧė„ ë‹¤ėŒėœŧ로 ëŗĩęĩŦ합니다: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering ėĩœė•…ė˜ ėƒí™Šė´ ë°œėƒí•˜ė—Ŧ 하나 ė´ėƒė˜ ë””ėŠ¤íŦëĨŧ ėžƒė—ˆėŠĩ니다! .PP **íŒ¨ë‹‰í•˜ė§€ ë§ˆė‹­ė‹œė˜¤!** ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다! .PP 가ėžĨ ë¨ŧė € 해ė•ŧ 할 ėŧė€ ë””ėŠ¤íŦ ė–´ë ˆė´ė— 대한 ėļ”ę°€ ëŗ€ę˛Ŋė„ í”ŧ하는 ę˛ƒėž…ë‹ˆë‹¤. ëĒ¨ë“  ė›ę˛Š 뗰枰ęŗŧ SnapRAID ė•ŧ간 동기화 또는 늤íŦëŸŊė„ íŦ함한 ëĒ¨ë“  똈ė•Ŋ된 í”„ëĄœė„¸ėŠ¤ëĨŧ ëš„í™œė„ąí™”í•˜ė‹­ė‹œė˜¤. .PP 그런 ë‹¤ėŒ ë‹¤ėŒ ë‹¨ęŗ„ëĨŧ ė§„í–‰í•˜ė‹­ė‹œė˜¤. .SS STEP 1 \-> Reconfigure ëŗĩęĩŦ할 ęŗĩę°„ė´ í•„ėš”í•˜ëŠ°, ė´ėƒė ėœŧ로는 ėļ”ę°€ ė˜ˆëš„ ë””ėŠ¤íŦ뗐, í•˜ė§€ë§Œ 뙏ëļ€ USB ë””ėŠ¤íŦ 또는 ė›ę˛Š ë””ėŠ¤íŦ로도 ėļŠëļ„핊니다. .PP SnapRAID 네렕 파ėŧė„ ėˆ˜ė •í•˜ė—Ŧ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦė˜ \`data\` 또는 \`parity\` ė˜ĩė…˜ė´ 파ėŧė„ ëŗĩęĩŦ할 눘 ėžˆëŠ” ėļŠëļ„한 뚈 ęŗĩę°„ė´ ėžˆëŠ” ėœ„ėš˜ëĨŧ 가ëĻŦ키도록 합니다. .PP 똈ëĨŧ ë“¤ė–´, ë””ėŠ¤íŦ \`d1\`ė´ ė‹¤íŒ¨í•œ ę˛Ŋ뚰, ë‹¤ėŒė—ė„œ ëŗ€ę˛Ŋ합니다: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP ë‹¤ėŒėœŧ로: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP ëŗĩęĩŦ할 ë””ėŠ¤íŦ가 패ëĻŦ티 ë””ėŠ¤íŦė¸ ę˛Ŋ뚰, ė ė ˆí•œ \`parity\` ė˜ĩė…˜ė„ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ė—ŦëŸŦ ę°œė˜ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, ëĒ¨ë“  ęĩŦė„ą ė˜ĩė…˜ė„ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. .SS STEP 2 \-> Fix 로그ëĨŧ 뙏ëļ€ íŒŒėŧ뗐 ė €ėžĨí•˜ëŠ´ė„œ fix ëĒ…ë šė„ ė‹¤í–‰í•Šë‹ˆë‹¤: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP ė—Ŧę¸°ė„œ NAMEė€ ė´ė „ ė˜ˆė œė˜ \`d1\`ęŗŧ ę°™ė€ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. ëŗĩęĩŦ할 ë””ėŠ¤íŦ가 패ëĻŦ티 ë””ėŠ¤íŦė¸ ę˛Ŋ뚰, \`parity\`, \`2\-parity\` ë“ąė˜ ė´ëĻ„ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ė—ŦëŸŦ ę°œė˜ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, ė—ŦëŸŦ \-d ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ëĒ¨ë‘ ė§€ė •í•Šë‹ˆë‹¤. .PP ė´ ëĒ…ë šė€ ė˜¤ëžœ ė‹œę°„ė´ 깸ëĻŊ니다. .PP fix.log 파ėŧė„ ė €ėžĨ할 ëLJ ę¸°ę°€ë°”ė´íŠ¸ė˜ ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ”ė§€ í™•ė¸í•˜ė‹­ė‹œė˜¤. ėļŠëļ„한 ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ” ë””ėŠ¤íŦė—ė„œ ė‹¤í–‰í•˜ė‹­ė‹œė˜¤. .PP ė´ė œ ëŗĩęĩŦ할 눘 ėžˆëŠ” ëĒ¨ë“  ę˛ƒė„ ëŗĩęĩŦ했ėŠĩ니다. ėŧëļ€ íŒŒėŧė´ ëļ€ëļ„렁ėœŧ로 또는 ė™„ė „ížˆ ëŗĩęĩŦ ëļˆę°€ëŠĨ한 ę˛Ŋ뚰, \`.unrecoverable\` 확ėžĨėžę°€ ėļ”ę°€ë˜ė–´ ė´ëĻ„ė´ ëŗ€ę˛Ŋ됩니다. .PP \`unrecoverable:\`로 ė‹œėž‘í•˜ëŠ” ëĒ¨ë“  ė¤„ė„ í™•ė¸í•˜ė—Ŧ fix.log 파ėŧė—ė„œ ëŗĩęĩŦ ëļˆę°€ëŠĨ한 ëĒ¨ë“  ë¸”ëĄė˜ ėžė„¸í•œ ëĒŠëĄė„ ė°žė„ 눘 ėžˆėŠĩ니다. .PP ëŗĩęĩŦ가 ë§ŒėĄąėŠ¤ëŸŊė§€ ė•Šėœŧ늴, ė›í•˜ëŠ” 만íŧ ė—ŦëŸŦ 번 ėžŦė‹œë„í•  눘 ėžˆėŠĩ니다. .PP 똈ëĨŧ ë“¤ė–´, ë§ˆė§€ë§‰ \`sync\` ė´í›„ ė–´ë ˆė´ė—ė„œ 파ėŧė„ ė œęą°í•œ ę˛Ŋ뚰, ėŧëļ€ íŒŒėŧė´ ëŗĩęĩŦë˜ė§€ ė•Šė„ 눘 ėžˆėŠĩ니다. ė´ ę˛Ŋ뚰, \-i, \-\-import ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ \`fix\`ëĨŧ ėžŦė‹œë„í•˜ęŗ , ė´ 파ėŧë“¤ė´ 현ėžŦ ė–´ë””ė— ėžˆëŠ”ė§€ ė§€ė •í•˜ė—Ŧ ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ė— ë‹¤ė‹œ íŦí•¨ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. .PP ëŗĩęĩŦ가 ë§ŒėĄąėŠ¤ëŸŊ다면 ęŗ„ė† ė§„í–‰í•  눘 ėžˆė§€ë§Œ, 동기화 í›„ė—ëŠ” \`fix\` ëĒ…ë šė„ 더 ė´ėƒ ėžŦė‹œë„í•  눘 ė—†ë‹¤ëŠ” 렐뗐 ėœ ė˜í•˜ė‹­ė‹œė˜¤! .SS STEP 3 \-> Check ėĄ°ė‹Ŧ늤ëŸŦ뚴 í™•ė¸ėœŧ로, ė´ė œ \`check\` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ëŗĩęĩŦ된 ë””ėŠ¤íŦė˜ ëĒ¨ë“  ę˛ƒė´ ė˜Ŧ바ëĨ¸ė§€ í™•ė¸í•  눘 ėžˆėŠĩ니다. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP ė—Ŧę¸°ė„œ NAMEė€ ė´ė „ ė˜ˆė œė˜ \`d1\`ęŗŧ ę°™ė€ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. .TP .B \-d 및 \-a ė˜ĩė…˜ė€ SnapRAIDė—ę˛Œ ė§€ė •ëœ ë””ėŠ¤íŦ만 í™•ė¸í•˜ęŗ  ëĒ¨ë“  패ëĻŦ티 ë°ė´í„°ëĨŧ ëŦ´ė‹œí•˜ë„록 ė§€ė‹œí•Šë‹ˆë‹¤. .PP ė´ ëĒ…ë šė€ ė˜¤ëžœ ė‹œę°„ė´ 깸ëĻŦė§€ë§Œ, ė§€ë‚˜ėš˜ę˛Œ ėĄ°ė‹Ŧ늤ëŸŊė§€ ė•Šë‹¤ëŠ´ 건너뛸 눘 ėžˆėŠĩ니다. .SS STEP 4 \-> Sync \`sync\` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ 냈 ë””ėŠ¤íŦ로 ė–´ë ˆė´ëĨŧ ėžŦ동기화합니다. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP ëĒ¨ë“  ę˛ƒė´ ëŗĩęĩŦ되늴 ė´ ëĒ…ë šė€ ėĻ‰ė‹œ ė™„ëŖŒëŠë‹ˆë‹¤. .SH COMMANDS SnapRAID는 ë‹¤ėŒė„ í—ˆėšŠí•˜ëŠ” ëLJ 氀맀 간단한 ëĒ…ë šė„ 렜ęŗĩ합니다: .PD 0 .IP \(bu ė–´ë ˆė´ė˜ ėƒíƒœ ėļœë Ĩ \-> \`status\` .IP \(bu ë””ėŠ¤íŦ ė œė–´ \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu ë°ąė—…/ėŠ¤ëƒ…ėƒˇ ėƒė„ą \-> \`sync\` .IP \(bu ėŖŧ揰렁ėœŧ로 ë°ė´í„° í™•ė¸ \-> \`scrub\` .IP \(bu ë§ˆė§€ë§‰ ë°ąė—…/ėŠ¤ëƒ…ėƒˇ ëŗĩ뛐 \-> \`fix\`. .PD .PP ëĒ…ë šė€ ė†ŒëŦ¸ėžëĄœ ėž‘ė„ąí•´ė•ŧ 합니다. .SS status ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ėƒíƒœ ėš”ė•Ŋė„ ėļœë Ĩ합니다. .PP 패ëĻŦ티 단편화, í™•ė¸ ė—†ė´ ë¸”ëĄė´ ė–ŧ마나 ė˜¤ëž˜ë˜ė—ˆëŠ”ė§€, ꡸ëĻŦęŗ  늤íŦëŸŊ 뤑뗐 ë°œėƒí•œ ëĒ¨ë“  기록된 ëŦ´ë‹¨ 똤ëĨ˜ė— 대한 ė •ëŗ´ëĨŧ íŦ함합니다. .PP ė œė‹œëœ ė •ëŗ´ëŠ” ë§ˆė§€ë§‰ėœŧ로 \`sync\`ëĨŧ ė‹¤í–‰í–ˆė„ 때ëĨŧ 나타냅니다. ë‚˜ė¤‘ė— ėˆ˜ė •ëœ ë‚´ėšŠė€ ęŗ ë ¤ë˜ė§€ ė•ŠėŠĩ니다. .PP bad ë¸”ëĄė´ ę°ė§€ë˜ëŠ´ 해당 블록 번호가 ë‚˜ė—´ëŠë‹ˆë‹¤. ė´ë“¤ė„ ėˆ˜ė •í•˜ë ¤ëŠ´ \`fix \-e\` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .PP 또한 각 ë¸”ëĄė´ ë§ˆė§€ë§‰ėœŧ로 늤íŦëŸŊ되거나 동기화된 ė‹œę°„ė„ 나타내는 그래프ëĨŧ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. 늤íŦëŸŊ된 ë¸”ëĄė€ \`*\`, ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ ë¸”ëĄė€ \`o\`로 í‘œė‹œëŠë‹ˆë‹¤. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS smart ė‹œėŠ¤í…œė˜ ëĒ¨ë“  ë””ėŠ¤íŦ뗐 대한 SMART ëŗ´ęŗ ė„œëĨŧ ėļœë Ĩ합니다. .PP í–Ĩ후 1년 ë™ė•ˆė˜ ė‹¤íŒ¨ 확ëĨ  ėļ”ė •ėš˜ëĨŧ íŦ함하ė—Ŧ, ė˜ė‹Ŧ늤ëŸŦ뚴 ė†ė„ąė„ ëŗ´ė´ëŠ” ë””ėŠ¤íŦė˜ ėœ ė§€ ëŗ´ėˆ˜ ęĩė˛´ëĨŧ ęŗ„íší•  눘 ėžˆėŠĩ니다. .PP ė´ 확ëĨ  ėļ”ė •ėš˜ëŠ” ë‹¤ėŒė—ė„œ ė‚ŦėšŠ 가ëŠĨ한 Backblaze ë°ė´í„°ė™€ ë””ėŠ¤íŦė˜ SMART ė†ė„ąė„ ėƒí˜¸ ė—°ę´€ė‹œėŧœ ė–ģėŠĩ니다: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP SMART가 ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•˜ęŗ  ėžˆë‹¤ęŗ  ëŗ´ęŗ í•˜ëŠ´, 해당 ë””ėŠ¤íŦ뗐 대해 \`FAIL\` 또는 \`PREFAIL\`ė´ ėļœë Ĩ되늰, SnapRAID는 똤ëĨ˜ëĨŧ 반환하며 ėĸ…ëŖŒëŠë‹ˆë‹¤. ė´ ę˛Ŋ뚰, ë””ėŠ¤íŦė˜ ėĻ‰ę°ė ė¸ ęĩė˛´ę°€ 강ë Ĩ히 ęļŒėžĨ됩니다. .PP 다ëĨ¸ 가ëŠĨ한 ėƒíƒœ ëŦ¸ėžė—´ė€ ë‹¤ėŒęŗŧ 같ėŠĩ니다: .RS 4 .PD 0 .HP 4 .I logfail ęŗŧęą°ė— ėŧëļ€ ė†ė„ąė´ ėž„ęŗ„ę°’ëŗ´ë‹¤ ë‚Žė•˜ėŠĩ니다. .HP 4 .I logerr ėžĨėš˜ 똤ëĨ˜ ëĄœęˇ¸ė— 똤ëĨ˜ę°€ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. .HP 4 .I selferr ėžĨėš˜ ėžė˛´ í…ŒėŠ¤íŠ¸ ëĄœęˇ¸ė— 똤ëĨ˜ę°€ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. .PD .RE .TP .B \-v, \-\-verbose ė˜ĩė…˜ė´ ė§€ė •ë˜ëŠ´, 더 ęšŠė€ í†ĩęŗ„ ëļ„ė„ė´ 렜ęŗĩ됩니다. ė´ ëļ„ė„ė€ 더 많거나 ė ė€ 패ëĻŦ티가 í•„ėš”í•œė§€ ę˛°ė •í•˜ëŠ” 데 ë„ė›€ė´ 될 눘 ėžˆėŠĩ니다. .PP ė´ ëĒ…ë šė€ \`smartctl\` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ \`smartctl \-a\`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. .PP ėžĨėš˜ę°€ ė˜Ŧ바ëĨ´ę˛Œ ėžë™ ę°ė§€ë˜ė§€ ė•Šėœŧ늴, 네렕 파ėŧė—ė„œ \`smartctl\` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ė‚ŦėšŠėž ė •ė˜ ëĒ…ë šė„ ė§€ė •í•  눘 ėžˆėŠĩ니다. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS probe ė‹œėŠ¤í…œė˜ ëĒ¨ë“  ë””ėŠ¤íŦė˜ POWER ėƒíƒœëĨŧ ėļœë Ĩ합니다. .PP \`Standby\`는 ë””ėŠ¤íŦ가 íšŒė „í•˜ė§€ ė•ŠėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. \`Active\`는 ë””ėŠ¤íŦ가 íšŒė „í•˜ęŗ  ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. .PP ė´ ëĒ…ë šė€ \`smartctl\` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ \`smartctl \-n standby \-i\`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. .PP ėžĨėš˜ę°€ ė˜Ŧ바ëĨ´ę˛Œ ėžë™ ę°ė§€ë˜ė§€ ė•Šėœŧ늴, 네렕 파ėŧė—ė„œ \`smartctl\` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ė‚ŦėšŠėž ė •ė˜ ëĒ…ë šė„ ė§€ė •í•  눘 ėžˆėŠĩ니다. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS up ė–´ë ˆė´ė˜ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ė‹œí‚ĩ니다(spin up). .TP .B \-d, \-\-filter\-disk ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ íŠšė • ë””ėŠ¤íŦ만 íšŒė „ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. .PP ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ ë™ė‹œė— íšŒė „ė‹œí‚¤ë ¤ëŠ´ ë§Žė€ ė „ë Ĩė´ í•„ėš”í•Šë‹ˆë‹¤. 렄뛐 ęŗĩ급 ėžĨėš˜ę°€ ė´ëĨŧ ė§€íƒąí•  눘 ėžˆëŠ”ė§€ í™•ė¸í•˜ė‹­ė‹œė˜¤. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS down ė–´ë ˆė´ė˜ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ ė¤‘ė§€í•Šë‹ˆë‹¤(spin down). .PP ė´ ëĒ…ë šė€ \`smartctl\` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ \`smartctl \-s standby,now\`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. .TP .B \-d, \-\-filter\-disk ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ íŠšė • ë””ėŠ¤íŦ만 íšŒė „ ė¤‘ė§€í•  눘 ėžˆėŠĩ니다. .PP 똤ëĨ˜ ë°œėƒ ė‹œ ėžë™ėœŧ로 íšŒė „ ė¤‘ė§€í•˜ë ¤ëŠ´, 다ëĨ¸ ëĒ…ë šęŗŧ 함ęģ˜ \-s, \-\-spin\-down\-on\-error ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ė´ëŠ” 똤ëĨ˜ ë°œėƒ ė‹œ ėˆ˜ë™ėœŧ로 \`down\`ė„ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS diff ë§ˆė§€ë§‰ \`sync\` ė´í›„ ėˆ˜ė •ë˜ė–´ 패ëĻŦ티 ë°ė´í„°ëĨŧ ėžŦęŗ„ė‚°í•´ė•ŧ 하는 ëĒ¨ë“  파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. .PP ė´ ëĒ…ë šė€ 파ėŧ ë°ė´í„°ëĨŧ í™•ė¸í•˜ė§€ ė•Šęŗ , 파ėŧ íƒ€ėž„ėŠ¤íƒŦ프, íŦ기 및 ė•„ė´ë…¸ë“œ(inode)만 í™•ė¸í•Šë‹ˆë‹¤. .PP ëĒ¨ë“  ëŗ€ę˛Ŋ된 파ėŧė„ ë‚˜ė—´í•œ 후, ë‹¤ėŒęŗŧ ę°™ė´ ęˇ¸ëŖší™”ëœ ëŗ€ę˛Ŋ ė‚Ŧ항 ėš”ė•Ŋė´ ė œė‹œëŠë‹ˆë‹¤: .RS 4 .PD 0 .HP 4 .I equal ė´ė „ęŗŧ ëŗ€ę˛Ŋë˜ė§€ ė•Šė€ 파ėŧ. .HP 4 .I added ė´ė „ė— ė—†ë˜ ėļ”ę°€ëœ 파ėŧ. .HP 4 .I removed ė œęą°ëœ 파ėŧ. .HP 4 .I updated íŦ기 또는 íƒ€ėž„ėŠ¤íƒŦ프가 다ëĨ¸ 파ėŧ, ėω ėˆ˜ė •ëœ 파ėŧ. .HP 4 .I moved 동ėŧ한 ë””ėŠ¤íŦė˜ 다ëĨ¸ 디렉토ëĻŦ로 ė´ë™ëœ 파ėŧ. ė´ë“¤ė€ ė´ëĻ„, íŦ기, íƒ€ėž„ėŠ¤íƒŦ프 및 ė•„ė´ë…¸ë“œę°€ 동ėŧí•˜ė§€ë§Œ 디렉토ëĻŦ가 다ëĨ¸ 것ėœŧ로 ė‹ëŗ„ëŠë‹ˆë‹¤. .HP 4 .I copied ė›ëŗ¸ 파ėŧė´ ė—Ŧė „ížˆ ėĄ´ėžŦ하는 동ėŧ한 ë””ėŠ¤íŦ 또는 다ëĨ¸ ë””ėŠ¤íŦ뗐 ëŗĩė‚Ŧ된 파ėŧ. ė´ë“¤ė€ 동ėŧ한 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ 氀말ėœŧëĄœė¨ ė‹ëŗ„ëŠë‹ˆ 다. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, ė´ëĻ„ëŋë§Œ ė•„ë‹ˆëŧ 렄랴 ę˛Ŋ로가 ėŧėš˜í•´ė•ŧ ė‹ëŗ„ëŠë‹ˆë‹¤. .HP 4 .I relocated ė›ëŗ¸ė´ ė‚Ŧëŧė§„ 동ėŧ한 ë””ėŠ¤íŦ 또는 다ëĨ¸ ë””ėŠ¤íŦ로 ė´ 동된 파ėŧ. ė´ë“¤ė€ 동ėŧ한 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ 氀말ėœŧëĄœė¨ ė‹ëŗ„ëŠë‹ˆ 다. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, ė‹ëŗ„ė„ ėœ„í•´ 렄랴 ę˛Ŋ로가 ėŧėš˜ 해ė•ŧ 합니다. 동ėŧ한 ë””ėŠ¤íŦė˜ \'moved\' 파ėŧęŗŧ ë‹ŦëĻŦ, ėžŦë°°ėš˜ëœ 파ėŧė€ 다ëĨ¸ inodeëĨŧ ę°€ė§‘ë‹ˆë‹¤. .HP 4 .I restored inode는 다ëĨ´ė§€ë§Œ 디렉토ëĻŦ, ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ 프가 ėŧėš˜í•˜ëŠ” 파ėŧ. ė´ë“¤ė€ 대개 ė‚­ė œëœ 후 ëŗĩęĩŦ된 파ėŧë“¤ėž…ë‹ˆë‹¤. .PD .RE .PP \`sync\`가 í•„ėš”í•œ ę˛Ŋ뚰, í”„ëĄœė„¸ėŠ¤ 반환 ėŊ”드는 ę¸°ëŗ¸ 0 ëŒ€ė‹  2ėž…ë‹ˆë‹¤. 반환 ėŊ”드 1ė€ ėŧë°˜ė ė¸ 똤ëĨ˜ ėĄ°ęą´ė— ė‚ŦėšŠëŠë‹ˆë‹¤. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS sync 패ëĻŦ티 ė •ëŗ´ëĨŧ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ëĒ¨ë“  ėˆ˜ė •ëœ 파ėŧė„ ėŊęŗ  해당 패ëĻŦ티 ë°ė´í„°ëĨŧ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. .PP ė´ë¯¸ ėˆ˜í–‰ëœ ėž‘ė—…ė„ ėžƒė§€ ė•Šęŗ  Ctrl+CëĨŧ 눌ëŸŦ ė–¸ė œë“ ė§€ ė´ í”„ëĄœė„¸ėŠ¤ëĨŧ ė¤‘ė§€í•  눘 ėžˆėŠĩ니다. ë‹¤ėŒ ė‹¤í–‰ ė‹œ \`sync\` í”„ëĄœė„¸ėŠ¤ëŠ” ė¤‘ë‹¨ëœ ęŗŗė—ė„œ ėžŦ개됩니다. .PP ė´ í”„ëĄœė„¸ėŠ¤ 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ 발ę˛Ŧ되늴, 해당 ë¸”ëĄė€ bad로 í‘œė‹œëŠë‹ˆë‹¤. .PP 파ėŧė€ ę˛Ŋ로 및/또는 ė•„ė´ë…¸ë“œëĄœ ė‹ëŗ„ë˜ëŠ° íŦ揰뙀 íƒ€ėž„ėŠ¤íƒŦ프로 í™•ė¸ëŠë‹ˆë‹¤. 파ėŧ íŦ기 또는 íƒ€ėž„ėŠ¤íƒŦ프가 다ëĨ´ëŠ´ 렄랴 파ėŧ뗐 대해 패ëĻŦ티 ë°ė´í„°ę°€ ėžŦęŗ„ė‚°ëŠë‹ˆë‹¤. 파ėŧė´ 동ėŧ한 ë””ėŠ¤íŦė—ė„œ ė´ë™ë˜ęą°ë‚˜ ė´ëĻ„ė´ ëŗ€ę˛Ŋë˜ęŗ  동ėŧ한 ė•„ė´ë…¸ë“œëĨŧ ėœ ė§€í•˜ëŠ´ 패ëĻŦ티는 ėžŦęŗ„ė‚°ë˜ė§€ ė•ŠėŠĩ니다. 파ėŧė´ 다ëĨ¸ ë””ėŠ¤íŦ로 ė´ë™ë˜ëŠ´ 패ëĻŦ티는 ėžŦęŗ„ė‚°ë˜ė§€ë§Œ, ė´ė „ė— ęŗ„ė‚°ëœ í•´ė‹œ ė •ëŗ´ëŠ” ėœ ė§€ëŠë‹ˆë‹¤. .PP \`content\` 및 \`parity\` 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS scrub ė–´ë ˆė´ëĨŧ 늤íŦëŸŊ하ė—Ŧ ë°ė´í„° 및 패ëĻŦ티 ë””ėŠ¤íŦė˜ ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. .PP 각 호ėļœė€ ė´ė „ė— 10ėŧ ė´ë‚´ė— 늤íŦëŸŊ된 ë°ė´í„°ëĨŧ ė œė™¸í•˜ęŗ  ė–´ë ˆė´ė˜ ė•Ŋ 8%ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. ė´ëŠ” ėŧėŖŧėŧ뗐 한 번 늤íŦëŸŊ하면 ëĒ¨ë“  ë°ė´í„° 비트가 ė ė–´ë„ 3ę°œė›”ë§ˆë‹¤ 한 ë˛ˆė”Š í™•ė¸ë¨ė„ ė˜ë¯¸í•Šë‹ˆë‹¤. .TP .B \-p, \-\-plan ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 다ëĨ¸ 늤íŦëŸŊ ęŗ„íš 또는 ė–‘ė„ ė •ė˜í•  눘 ėžˆėœŧ늰, ë‹¤ėŒ ę°’ė„ í—ˆėšŠí•Šë‹ˆë‹¤: bad \- bad로 í‘œė‹œëœ 블록 늤íŦëŸŊ. new \- ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 블록 늤íŦëŸŊ. full \- ëĒ¨ë“  것 늤íŦëŸŊ. 0\-100 \- ė§€ė •ëœ ëš„ėœ¨ė˜ 블록 늤íŦëŸŊ. .PP ë°ąëļ„ėœ¨ ė–‘ė„ ė§€ė •í•˜ëŠ´, \-o, \-\-older\-than ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ë¸”ëĄė´ ė–ŧ마나 ė˜¤ëž˜ë˜ė—ˆëŠ”ė§€ ė •ė˜í•  ėˆ˜ë„ ėžˆėŠĩ니다. 가ėžĨ ė˜¤ëž˜ëœ ë¸”ëĄė´ ë¨ŧė € 늤íŦëŸŊë˜ė–´ ėĩœė ė˜ í™•ė¸ė„ ëŗ´ėžĨ합니다. ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 블록만 늤íŦëŸŊ하려면, \`\-p new\` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. .PP 늤íŦëŸŊ ėƒíƒœė˜ 넏ëļ€ ė •ëŗ´ëĨŧ ė–ģėœŧ려늴 \`status\` ëĒ…ë šė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. .PP 발ę˛Ŧ된 ëĒ¨ë“  ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ė— 대해, 해당 ë¸”ëĄė€ \`content\` 파ėŧ뗐 bad로 í‘œė‹œëŠë‹ˆë‹¤. ė´ëŸŦ한 bad ë¸”ëĄė€ \`status\`뗐 ë‚˜ė—´ë˜ëŠ° \`fix \-e\`로 ėˆ˜ė •í•  눘 ėžˆėŠĩ니다. ėˆ˜ė • 후, ë‹¤ėŒ 늤íŦëŸŊ ė‹œė— ë‹¤ė‹œ í™•ė¸ë˜ëŠ°, ėˆ˜ė •ëœ 것ėœŧ로 발ę˛Ŧ되늴 bad í‘œė‹œëŠ” ė œęą°ëŠë‹ˆë‹¤. bad 블록만 늤íŦëŸŊ하려면 \`scrub \-p bad\` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .PP ë™ę¸°í™”ë˜ė§€ ė•Šė€ ë°ė´í„°ëĄœ ė¸í•œ ëŗ´ęŗ ëœ 똤ëĨ˜ëĨŧ í”ŧ하기 ėœ„í•´ 동기화된 ė–´ë ˆė´ė—ė„œë§Œ \`scrub\`ė„ ė‹¤í–‰í•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. ė´ëŸŦ한 똤ëĨ˜ëŠ” ëŦ´ë‹¨ 똤ëĨ˜ę°€ ė•„ë‹Œ 것ėœŧ로 ė¸ė‹ë˜ëŠ°, ë¸”ëĄė€ bad로 í‘œė‹œë˜ė§€ ė•Šė§€ë§Œ, ė´ëŸŦ한 똤ëĨ˜ëŠ” ëĒ…ë šė˜ ėļœë Ĩ뗐 ëŗ´ęŗ ëŠë‹ˆë‹¤. .PP \`content\` 파ėŧė€ 각 ë¸”ëĄė˜ ë§ˆė§€ë§‰ í™•ė¸ ė‹œę°„ė„ ė—…ë°ė´íŠ¸í•˜ęŗ  bad ë¸”ëĄė„ í‘œė‹œí•˜ę¸° ėœ„í•´ ėˆ˜ė •ëŠë‹ˆë‹¤. \`parity\` 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. ė–´ë ˆė´ė˜ 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS fix ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëĨŧ ėˆ˜ė •í•Šë‹ˆë‹¤. .PP ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëŠ” ë§ˆė§€ë§‰ \`sync\`뗐 ė €ėžĨ된 ėŠ¤ëƒ…ėƒˇ ėƒíƒœė™€ 비ęĩëŠë‹ˆë‹¤. ė°¨ė´ę°€ 발ę˛Ŧ되늴 ė €ėžĨ된 ėŠ¤ëƒ…ėƒˇėœŧ로 ë˜ëŒë ¤ė§‘ë‹ˆë‹¤. .PP **ę˛Ŋęŗ !** \`fix\` ëĒ…ë šė€ 똤ëĨ˜ė™€ ė˜ë„ė ė¸ ėˆ˜ė • ė‚Ŧė´ëĨŧ ęĩŦëŗ„í•˜ė§€ ė•ŠėŠĩ니다. 파ėŧ ėƒíƒœëĨŧ ëŦ´ėĄ°ęą´ ë§ˆė§€ë§‰ \`sync\`로 되돌ëĻŊ니다. .PP 다ëĨ¸ ė˜ĩė…˜ė´ ė§€ė •ë˜ė§€ ė•Šėœŧ늴 렄랴 ė–´ë ˆė´ę°€ 래ëĻŦ됩니다. 필터 ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 래ëĻŦ할 파ėŧ 또는 ë””ėŠ¤íŦė˜ í•˜ėœ„ ė§‘í•Šė„ ė„ íƒí•˜ė‹­ė‹œė˜¤. .PP \`sync\` 및 \`scrub\` 뤑뗐 bad로 í‘œė‹œëœ 블록만 ėˆ˜ė •í•˜ë ¤ëŠ´, \-e, \-\-filter\-error ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 다ëĨ¸ 필터 ė˜ĩė…˜ęŗŧ ë‹ŦëĻŦ, ė´ ė˜ĩė…˜ė€ ėĩœė‹  \`sync\` ė´í›„ ëŗ€ę˛Ŋë˜ė§€ ė•Šė€ 파ėŧė—ë§Œ ėˆ˜ė •ė„ ė ėšŠí•Šë‹ˆë‹¤. .PP SnapRAID는 ėˆ˜ė •í•  눘 ė—†ëŠ” ëĒ¨ë“  파ėŧ뗐 \`.unrecoverable\` 확ėžĨėžëĨŧ ėļ”ę°€í•˜ė—Ŧ ė´ëĻ„ė„ ëŗ€ę˛Ŋ합니다. .PP ėˆ˜ė •í•˜ę¸° 렄뗐, 렄랴 ė–´ë ˆė´ëĨŧ 늤ėē”하ė—Ŧ ë§ˆė§€ë§‰ \`sync\` ė´í›„ ė´ë™ëœ 파ėŧė„ ė°žėŠĩ니다. ė´ 파ėŧë“¤ė€ ė´ëĻ„ęŗŧ 디렉토ëĻŦëĨŧ ëŦ´ė‹œí•˜ęŗ  íƒ€ėž„ėŠ¤íƒŦ프로 ė‹ëŗ„ë˜ëŠ°, í•„ėš”í•œ ę˛Ŋ뚰 ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ė— ė‚ŦėšŠëŠë‹ˆë‹¤. ėŧëļ€ íŒŒėŧė„ ė–´ë ˆė´ 뙏ëļ€ëĄœ ė´ë™í•œ ę˛Ŋ뚰, \-i, \-\-import ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ėļ”ę°€ëĄœ 늤ėē”í•  디렉토ëĻŦëĨŧ ė§€ė •í•  눘 ėžˆėŠĩ니다. .PP 파ėŧė€ ė•„ė´ë…¸ë“œę°€ ė•„ë‹Œ ę˛Ŋ로로만 ė‹ëŗ„ëŠë‹ˆë‹¤. .PP \`content\` 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. \`parity\` 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. .SS check ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. .PP \`fix\`래ëŸŧ ėž‘ë™í•˜ė§€ë§Œ, ëŗĩęĩŦëĨŧ ė‹œëŽŦë ˆė´ė…˜í•  ëŋė´ëа ė–´ë ˆė´ė— ė–´ë–¤ ëŗ€ę˛Ŋ ė‚Ŧ항도 ę¸°ëĄë˜ė§€ ė•ŠėŠĩ니다. .PP ė´ ëĒ…ë šė€ ėŖŧ로 ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ 후 또는 기타 íŠšëŗ„í•œ ėĄ°ęą´ė—ė„œė™€ ę°™ė´ ėˆ˜ë™ í™•ė¸ė„ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ėŖŧę¸°ė ė´ęŗ  똈ė•Ŋ된 í™•ė¸ė„ ėœ„í•´ė„œëŠ” \`scrub\`ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. .TP .B \-a, \-\-audit\-only ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ 파ėŧ ë°ė´í„°ë§Œ í™•ė¸í•˜ęŗ  패ëĻŦ티 ë°ė´í„°ëŠ” ëŦ´ė‹œí•˜ė—Ŧ ė‹¤í–‰ ė†ë„ëĨŧ 높ėŧ 눘 ėžˆėŠĩ니다. .PP 파ėŧė€ ė•„ė´ë…¸ë“œę°€ ė•„ë‹Œ ę˛Ŋ로로만 ė‹ëŗ„ëŠë‹ˆë‹¤. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS list ë§ˆė§€ë§‰ \`sync\` ė‹œė ė— ė–´ë ˆė´ė— íŦ함된 ëĒ¨ë“  파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. .TP .B \-v 또는 \-\-verboseëĨŧ ė‚ŦėšŠí•˜ëŠ´ í•˜ėœ„ 봈 ė‹œę°„ë„ í‘œė‹œëŠë‹ˆë‹¤. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS dup ëĒ¨ë“  뤑ëŗĩ 파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. 두 파ėŧė˜ í•´ė‹œę°€ ėŧėš˜í•˜ëŠ´ 동ėŧ한 것ėœŧ로 간ėŖŧ됩니다. 파ėŧ ë°ė´í„°ëŠ” ėŊė§€ ė•Šęŗ , 미ëĻŦ ęŗ„ė‚°ëœ í•´ė‹œë§Œ ė‚ŦėšŠëŠë‹ˆë‹¤. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS pool \`pooling\` 디렉토ëĻŦė—ė„œ ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧ뗐 대한 ę°€ėƒ 롰ëĨŧ ėƒė„ąí•˜ęą°ë‚˜ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. .PP 파ėŧė€ ëŗĩė‚Ŧë˜ė§€ ė•Šęŗ  ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė—°ę˛°ëŠë‹ˆë‹¤. .PP ė—…ë°ė´íŠ¸ ė‹œ, ëĒ¨ë“  ę¸°ėĄ´ ė‹ŦëŗŧëĻ­ 링íŦ뙀 뚈 í•˜ėœ„ 디렉토ëĻŦ는 ė‚­ė œë˜ęŗ  ė–´ë ˆė´ė˜ 냈 뷰로 ëŒ€ė˛´ëŠë‹ˆë‹¤. 다ëĨ¸ ėŧ반 파ėŧė€ ė œėžëĻŦ뗐 남ėŠĩ니다. .PP 풀 디렉토ëĻŦ 뙏ëļ€ė—ė„œëŠ” ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS devices ė–´ë ˆė´ė—ė„œ ė‚ŦėšŠë˜ëŠ” ė €ėˆ˜ė¤€(low\-level) ėžĨėš˜ëĨŧ ėļœë Ĩ합니다. .PP ė´ ëĒ…ë šė€ ė–´ë ˆė´ė˜ ėžĨėš˜ ė—°ę˛°ė„ í‘œė‹œí•˜ëŠ°, ėŖŧ로 늤íŦëĻŊ트 ė¸í„°íŽ˜ė´ėŠ¤ëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. .PP ė˛˜ėŒ 두 ė—´ė€ ė €ėˆ˜ė¤€ ėžĨėš˜ ID 및 ę˛ŊëĄœėž…ë‹ˆë‹¤. ë‹¤ėŒ 두 ė—´ė€ ęŗ ėˆ˜ė¤€(high\-level) ėžĨėš˜ ID 및 ę˛ŊëĄœėž…ë‹ˆë‹¤. ë§ˆė§€ë§‰ ė—´ė€ ė–´ë ˆė´ė˜ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. .PP 대ëļ€ëļ„ė˜ ę˛Ŋ뚰, ė–´ë ˆė´ė˜ 각 ë””ėŠ¤íŦ뗐 대해 í•˜ë‚˜ė˜ ė €ėˆ˜ė¤€ ėžĨėš˜ę°€ ėžˆė§€ë§Œ, ėŧëļ€ ë” ëŗĩėžĄí•œ ęĩŦė„ąė—ė„œëŠ” 단ėŧ ė–´ë ˆė´ ë””ėŠ¤íŦ뗐 ė˜í•´ ė‚ŦėšŠë˜ëŠ” ė—ŦëŸŦ ė €ėˆ˜ė¤€ ėžĨėš˜ę°€ ėžˆė„ 눘 ėžˆėŠĩ니다. .PP ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. .SS touch í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ėœŧ로 ė„¤ė •ëœ ëĒ¨ë“  파ėŧ뗐 ėž„ė˜ė˜ í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ ė„¤ė •í•Šë‹ˆë‹¤. .PP ė´ëŠ” íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ ęą°ė˜ ęŗ ėœ í•˜ę˛Œ ë§Œë“¤ė–´ 가ëŠĨ한 뤑ëŗĩė„ ė¤„ė´ë¯€ëĄœ, SnapRAID가 ė´ë™ë˜ęą°ë‚˜ ëŗĩė‚Ŧ된 파ėŧė„ ė¸ė‹í•˜ëŠ” ëŠĨë Ĩė„ í–Ĩėƒė‹œí‚ĩ니다. .PP 더 ęĩŦ랴렁ėœŧ로, í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė´ ė•„ë‹Œ ę˛Ŋ뚰, ė´ë™ë˜ęą°ë‚˜ ëŗĩė‚Ŧ된 파ėŧė€ ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프가 ėŧėš˜í•˜ëŠ´ 그렇게 ė‹ëŗ„ëŠë‹ˆë‹¤. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, 렄랴 ę˛Ŋ로, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프가 ëĒ¨ë‘ ėŧėš˜í•˜ëŠ” ę˛Ŋėš°ė—ë§Œ ëŗĩė‚Ŧëŗ¸ėœŧ로 간ėŖŧ됩니다. .PP 봈 ë‹¨ėœ„ ė •ë°€ë„ė˜ íƒ€ėž„ėŠ¤íƒŦ프는 ėˆ˜ė •ë˜ė§€ ė•Šėœŧë¯€ëĄœ, 파ėŧė˜ ëĒ¨ë“  ë‚ ė§œė™€ ė‹œę°„ė€ ëŗ´ėĄ´ëŠë‹ˆë‹¤. .SS rehash 렄랴 ė–´ë ˆė´ė˜ ėžŦí•´ė‹œ(rehash)ëĨŧ 똈ė•Ŋ합니다. .PP ė´ ëĒ…ë šė€ ė‚ŦėšŠë˜ëŠ” í•´ė‹œ ėĸ…ëĨ˜ëĨŧ ëŗ€ę˛Ŋ하며, ėŧë°˜ė ėœŧ로 32비트 ė‹œėŠ¤í…œė—ė„œ 64비트 ė‹œėŠ¤í…œėœŧ로 ė—…ęˇ¸ë ˆė´ë“œí•  때 MurmurHash3ė—ė„œ 더 ëš ëĨ¸ SpookyHash로 ė „í™˜í•˜ę¸° ėœ„í•´ ė‚ŦėšŠëŠë‹ˆë‹¤. .PP ė´ë¯¸ ėĩœė ė˜ í•´ė‹œëĨŧ ė‚ŦėšŠí•˜ęŗ  ėžˆë‹¤ëŠ´, ė´ ëĒ…ë šė€ ė•„ëŦ´ę˛ƒë„ í•˜ė§€ ė•Šęŗ  ėĄ°ėš˜ę°€ í•„ėš”í•˜ė§€ ė•ŠėŒė„ ė•Œë ¤ė¤ë‹ˆë‹¤. .PP ėžŦí•´ė‹œëŠ” ėĻ‰ė‹œ ėˆ˜í–‰ë˜ė§€ ė•Šęŗ  \`sync\` 및 \`scrub\` 뤑뗐 렐맄렁ėœŧ로 ė§„í–‰ëŠë‹ˆë‹¤. .PP \`status\`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėžŦí•´ė‹œ ėƒíƒœëĨŧ í™•ė¸í•  눘 ėžˆėŠĩ니다. .PP ėžŦí•´ė‹œ ė¤‘ė—ë„ SnapRAID는 렄랴 기ëŠĨė„ ėœ ė§€í•˜ëŠ°, 뜠ėŧ한 ė˜ˆė™¸ëŠ” \`dup\`가 다ëĨ¸ í•´ė‹œëĨŧ ė‚ŦėšŠí•˜ëŠ” 뤑ëŗĩ 파ėŧė„ ę°ė§€í•  눘 ė—†ë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. .SS locate 패ëĻŦ티 ë””ėŠ¤íŦ뗐 ė €ėžĨ된 파ėŧė„ ė°žėŠĩ니다. ėŧėš˜í•˜ëŠ” 각 파ėŧ뗐 대해 패ëĻŦ티 파ėŧ ë‚´ė˜ ėœ„ėš˜ė™€ ė ėœ í•˜ęŗ  ėžˆëŠ” ėĄ°ę°(fragment)ė˜ 눘ëĨŧ ėļœë Ĩ합니다. .TP .B \-t, \-\-tail ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 패ëĻŦí‹°ė˜ ė§€ė •ëœ ęŧŦëĻŦ(tail) ëļ€ëļ„ė„ ė ėœ í•˜ëŠ” 파ėŧ로 ėž‘ė—…ė„ ė œí•œí•  눘 ėžˆėŠĩ니다. .PP ė´ 파ėŧë“¤ė„ ėžŦ할당하려면 \-W, \-\-force\-realloc\-tail ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ėžŦ할당 ęŗŧė • ë™ė•ˆ 해당 파ėŧë“¤ė€ 패ëĻŦí‹°ė— ė˜í•´ ëŗ´í˜¸ë˜ė§€ ė•Šėœŧë¯€ëĄœ ėŖŧė˜í•˜ė‹­ė‹œė˜¤. .SH OPTIONS SnapRAID는 ë‹¤ėŒ ė˜ĩė…˜ė„ 렜ęŗĩ합니다: .TP .B \-c, \-\-conf CONFIG ė‚ŦėšŠí•  네렕 파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė§€ė •í•˜ė§€ ė•Šėœŧ늴 Unixė—ė„œëŠ” \`/usr/local/etc/snapraid.conf\` 파ėŧė´ ėĄ´ėžŦ하면 ė‚ŦėšŠí•˜ęŗ , ęˇ¸ë ‡ė§€ ė•Šėœŧ늴 \`/etc/snapraid.conf\`ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. Windowsė—ė„œëŠ” \`snapraid.exe\`뙀 ę°™ė€ 디렉토ëĻŦ뗐 ėžˆëŠ” \`snapraid.conf\` 파ėŧė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. .TP .B \-f, \-\-filter PATTERN \`check\` 및 \`fix\`ė—ė„œ 래ëĻŦ할 파ėŧė„ 필터링합니다. ė§€ė •ëœ 패턴ęŗŧ ėŧėš˜í•˜ëŠ” 파ėŧ만 래ëĻŦ됩니다. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 패턴 ė‚Ŧ떑뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ PATTERN ė„šė…˜ė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. Unixė—ė„œëŠ” 글로빙 ëŦ¸ėžę°€ ė‚ŦėšŠë˜ëŠ” ę˛Ŋ뚰 ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다. ė´ ė˜ĩė…˜ė€ \`check\` 및 \`fix\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. \`sync\` 및 \`scrub\`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. .TP .B \-d, \-\-filter\-disk NAME \`check\`, \`fix\`, \`up\`, 및 \`down\`ė—ė„œ 래ëĻŦ할 ë””ėŠ¤íŦëĨŧ 필터링합니다. 네렕 파ėŧ뗐 ė •ė˜ëœ ë””ėŠ¤íŦ ė´ëĻ„ė„ ė§€ė •í•´ė•ŧ 합니다. 또한 \`parity\`, \`2\-parity\`, \`3\-parity\` ë“ąė˜ ė´ëĻ„ėœŧ로 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ ė§€ė •í•˜ė—Ŧ íŠšė • 패ëĻŦ티 ë””ėŠ¤íŦ로 ėž‘ė—…ė„ ė œí•œí•  눘 ėžˆėŠĩ니다. ė—ŦëŸŦ \-\-filter, \-\-filter\-disk, \-\-filter\-missing ė˜ĩė…˜ė„ 결합하면, ëĒ¨ë“  í•„í„°ė™€ ėŧėš˜í•˜ëŠ” 파ėŧ만 ė„ íƒëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ \`check\`, \`fix\`, \`up\`, 및 \`down\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. \`sync\` 및 \`scrub\`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. .TP .B \-m, \-\-filter\-missing \`check\` 및 \`fix\`ė—ė„œ 래ëĻŦ할 파ėŧė„ 필터링합니다. ė–´ë ˆė´ė—ė„œ 누ëŊ되거나 ė‚­ė œëœ 파ėŧ만 래ëĻŦ됩니다. \`fix\`뙀 함ęģ˜ ė‚ŦėšŠí•˜ëŠ´, ė´ ė˜ĩė…˜ė€ \`undelete\` ëĒ…ë š ė—­í• ė„ 합니다. ė—ŦëŸŦ \-\-filter, \-\-filter\-disk, \-\-filter\-missing ė˜ĩė…˜ė„ 결합하면, ëĒ¨ë“  í•„í„°ė™€ ėŧėš˜í•˜ëŠ” 파ėŧ만 ė„ íƒëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ \`check\` 및 \`fix\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. \`sync\` 및 \`scrub\`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. .TP .B \-e, \-\-filter\-error \`check\` 및 \`fix\`ė—ė„œ 똤ëĨ˜ę°€ ėžˆëŠ” 파ėŧė„ 래ëĻŦ합니다. \`status\`뗐 ë‚˜ė—´ëœ 대로 \`sync\` 및 \`scrub\` 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ í‘œė‹œëœ ë¸”ëĄė„ 氀맄 파ėŧ만 래ëĻŦ합니다. ė´ ė˜ĩė…˜ė€ \`check\` 및 \`fix\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-p, \-\-plan PERC|bad|new|full 늤íŦëŸŊ ęŗ„íšė„ ė„ íƒí•Šë‹ˆë‹¤. PERC가 0ė—ė„œ 100 ė‚Ŧė´ė˜ ėˆĢėž ę°’ė¸ ę˛Ŋ뚰, 늤íŦëŸŊ할 ë¸”ëĄė˜ ë°ąëļ„ėœ¨ëĄœ í•´ė„ëŠë‹ˆë‹¤. ë°ąëļ„ėœ¨ ëŒ€ė‹  ęŗ„íšė„ ė§€ė •í•  눘 ėžˆėŠĩ니다: \`bad\`는 bad ë¸”ëĄė„ 늤íŦëŸŊí•˜ęŗ , \`new\`는 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 막 동기화된 ë¸”ëĄė„ 늤íŦëŸŊ하며, \`full\`ė€ ëĒ¨ë“  ę˛ƒė„ 늤íŦëŸŊ합니다. ė´ ė˜ĩė…˜ė€ \`scrub\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-o, \-\-older\-than DAYS \`scrub\`ė—ė„œ 래ëĻŦ할 ė–´ë ˆė´ė˜ 가ėžĨ ė˜¤ëž˜ëœ ëļ€ëļ„ė„ ė„ íƒí•Šë‹ˆë‹¤. DAYS는 ë¸”ëĄė´ 늤íŦëŸŊë˜ė–´ė•ŧ 하는 ėĩœė†Œ ėŧë š(days)ė´ëŠ°, ę¸°ëŗ¸ę°’ė€ 10ėž…ë‹ˆë‹¤. bad로 í‘œė‹œëœ ë¸”ëĄė€ ė´ ė˜ĩė…˜ė— ę´€ęŗ„ė—†ė´ í•­ėƒ 늤íŦëŸŊ됩니다. ė´ ė˜ĩė…˜ė€ \`scrub\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-a, \-\-audit\-only \`check\`ė—ė„œ 패ëĻŦ티 ë°ė´í„°ëĨŧ í™•ė¸í•˜ė§€ ė•Šęŗ  파ėŧė˜ í•´ė‹œëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 파ėŧ ë°ė´í„°ë§Œ í™•ė¸í•˜ëŠ” 데 관ė‹Ŧė´ ėžˆë‹¤ëŠ´, ė´ ė˜ĩė…˜ė€ í™•ė¸ í”„ëĄœė„¸ėŠ¤ė˜ ė†ë„ëĨŧ ėƒë‹šížˆ 높ėŧ 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ \`check\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-h, \-\-pre\-hash \`sync\`ė—ė„œ 패ëĻŦ티 ęŗ„ė‚° 렄뗐 ėļ”ę°€ í™•ė¸ė„ ėœ„í•´ ëĒ¨ë“  냈 ë°ė´í„°ė— 대한 ė˜ˆëš„ í•´ė‹œ ë‹¨ęŗ„ëĨŧ ė‹¤í–‰í•Šë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 \`sync\`ė—ė„œëŠ” ė˜ˆëš„ í•´ė‹œę°€ ėˆ˜í–‰ë˜ė§€ ė•Šėœŧ늰, 냈 ë°ė´í„°ëŠ” 패ëĻŦ티 ęŗ„ė‚° 링렄뗐 ė˛˜ėŒ ėŊė„ 때 í•´ė‹œëŠë‹ˆë‹¤. ė´ í”„ëĄœė„¸ėŠ¤ëŠ” ëĒ¨ë“  ë””ėŠ¤íŦ가 íšŒė „í•˜ęŗ  CPU가 ë°”ėœ, ė‹œėŠ¤í…œė´ ęŗŧëļ€í•˜ ėƒíƒœėŧ 때 ë°œėƒí•Šë‹ˆë‹¤. ė´ëŠ” ę¸°ęŗ„ė˜ 극한 ėĄ°ęą´ė´ëŠ°, ėž ėžŦ된 í•˜ë“œė›¨ė–´ ëŦ¸ė œę°€ ėžˆëŠ” ę˛Ŋ뚰 ë°ė´í„°ę°€ 땄링 í•´ė‹œë˜ė§€ ė•Šė•˜ę¸° 때ëŦ¸ė— ëŦ´ë‹¨ 똤ëĨ˜ę°€ ę°ė§€ë˜ė§€ ė•Šęŗ  ė§€ë‚˜ę°ˆ 눘 ėžˆėŠĩ니다. ė´ëŸŦ한 ėœ„í—˜ė„ í”ŧ하려면, \`pre\-hash\` ëĒ¨ë“œëĨŧ í™œė„ąí™”í•˜ė—Ŧ ëĒ¨ë“  ë°ė´í„°ëĨŧ 두 번 ėŊė–´ ëŦ´ę˛°ė„ąė„ ëŗ´ėžĨ할 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ 또한 ė–´ë ˆė´ ë‚´ė—ė„œ ė´ë™ëœ 파ėŧė„ í™•ė¸í•˜ė—Ŧ ė´ë™ ėž‘ė—…ė´ ė„ąęŗĩí–ˆëŠ”ė§€ í™•ė¸í•˜ęŗ , í•„ėš”í•œ ę˛Ŋ뚰 ęŗ„ė† ė§„í–‰í•˜ę¸° 렄뗐 fix ėž‘ė—…ė„ ė‹¤í–‰í•  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė€ \`sync\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-i, \-\-import DIR ė§€ė •ëœ 디렉토ëĻŦė—ė„œ ë§ˆė§€ë§‰ \`sync\` ė´í›„ ė–´ë ˆė´ė—ė„œ ė‚­ė œëœ 파ėŧė„ 氀렏ė˜ĩ니다. ė´ëŸŦ한 파ėŧė´ ė—Ŧė „ížˆ ėžˆëŠ” ę˛Ŋ뚰, ė´ë“¤ė€ \`check\` 및 \`fix\`뗐 ė˜í•´ ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ëĨŧ ę°œė„ í•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 파ėŧė€ í•˜ėœ„ 디렉토ëĻŦëĨŧ íŦ함하ė—Ŧ ėŊ히며, ė´ëτ뗐 ę´€ęŗ„ė—†ė´ ė‹ëŗ„ëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ \`check\` 및 \`fix\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-s, \-\-spin\-down\-on\-error 똤ëĨ˜ ë°œėƒ ė‹œ, 0ė´ ė•„ë‹Œ ėƒíƒœ ėŊ”ë“œëĄœ ėĸ…ëŖŒí•˜ę¸° 렄뗐 관ëĻŦ되는 ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ė¤‘ë‹¨ëœ ėž‘ė—… í›„ė— 드ëŧė´ë¸Œę°€ ęŗ„ė† í™œė„ą ėƒíƒœëĄœ íšŒė „í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•˜ė—Ŧ ëļˆí•„ėš”í•œ ė—´ ėļ•렁 및 ė „ë Ĩ ė†Œëš„ëĨŧ ë°Šė§€í•˜ëŠ” 데 ë„ė›€ė´ 됩니다. ëĒ…ë šė´ ė‹¤íŒ¨í•˜ë”ëŧ도 ë””ėŠ¤íŦ가 ė•ˆė „í•˜ę˛Œ ė¤‘ė§€ë˜ë„ëĄ ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. .TP .B \-w, \-\-bw\-limit RATE ëĒ¨ë“  ë””ėŠ¤íŦ뗐 대한 ė „ė—­ ëŒ€ė—­í­ ė œí•œė„ ė ėšŠí•Šë‹ˆë‹¤. RATE는 ė´ˆë‹š ë°”ė´íŠ¸ ėˆ˜ėž…ë‹ˆë‹¤. K, M, 또는 G뙀 ę°™ė€ ėŠšėˆ˜(똈: \-\-bw\-limit 1G)ëĨŧ ė§€ė •í•  눘 ėžˆėŠĩ니다. .TP .B \-t, \-\-tail íŦ기 패ëĻŦ티 ë””ėŠ¤íŦė˜ ė§€ė •ëœ ęŧŦëĻŦ íŦ기 ė´í•˜ëĨŧ ė‚ŦėšŠí•˜ëŠ” 파ėŧ로 ëĒŠëĄė„ ė œí•œí•Šë‹ˆë‹¤. K, M, G, T뙀 ę°™ė€ ë°°ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다 (똈: \-\-tail 1G). ė´ ė˜ĩė…˜ė€ \`locate\` ëĒ…ë šęŗŧ 함ęģ˜ ė‚ŦėšŠí•  때만 ėœ íš¨í•Šë‹ˆë‹¤. .TP .B \-A, \-\-stats ėļ”ę°€ ė •ëŗ´ëĨŧ ëŗ´ė—ŦėŖŧ는 확ėžĨ된 ėƒíƒœ ëŗ´ę¸°ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. í™”ëŠ´ė—ëŠ” 두 ę°œė˜ 그래프가 í‘œė‹œëŠë‹ˆë‹¤: ė˛Ģ ë˛ˆė§¸ 그래프는 각 ë””ėŠ¤íŦ뗐 대한 버íŧ링된 ėŠ¤íŠ¸ëŧė´í”„ ėˆ˜ė™€ 함ęģ˜ í•´ë‹š ë””ėŠ¤íŦė—ė„œ 현ėžŦ ė•Ąė„¸ėŠ¤ ė¤‘ė¸ 파ėŧė˜ ę˛Ŋ로ëĨŧ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 가ėžĨ 느ëϰ ë””ėŠ¤íŦ는 ė‚ŦėšŠ 가ëŠĨ한 버íŧ가 ė—†ėœŧ늰, ė´ëŠ” ë‹Ŧė„ą 가ëŠĨ한 ėĩœëŒ€ ëŒ€ė—­í­ė„ ę˛°ė •í•Šë‹ˆë‹¤. 두 ë˛ˆė§¸ 그래프는 ė§€ë‚œ 100봈 ë™ė•ˆ 대기하는 데 ė†Œëš„ëœ ė‹œę°„ė˜ ë°ąëļ„ėœ¨ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. 가ėžĨ 느ëϰ ë””ėŠ¤íŦ가 대ëļ€ëļ„ė˜ 대기 ė‹œę°„ė„ ėœ ë°œí•  것ėœŧ로 ė˜ˆėƒë˜ëŠ°, 다ëĨ¸ ë””ėŠ¤íŦ는 버íŧ링된 ėŠ¤íŠ¸ëŧė´í”„ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėœŧë¯€ëĄœ 대기 ė‹œę°„ė´ ęą°ė˜ 또는 ė „í˜€ 뗆떴ė•ŧ 합니다. ė´ 그래프는 또한 í•´ė‹œ ęŗ„ė‚° 및 RAID ęŗ„ė‚°ė„ ėœ„í•´ ė†Œëš„ëœ ė‹œę°„ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. ëĒ¨ë“  ęŗ„ė‚°ė€ ë””ėŠ¤íŦ ėž‘ė—…ęŗŧ ëŗ‘ë Ŧ로 ė‹¤í–‰ëŠë‹ˆë‹¤. 따ëŧė„œ ė ė–´ë„ í•˜ë‚˜ė˜ ë””ėŠ¤íŦ뗐 대해 ė¸Ąė • 가ëŠĨ한 대기 ė‹œę°„ė´ ėžˆëŠ” 한, ė´ëŠ” CPU가 ė›ŒíŦëĄœë“œė— ėļŠëļ„히 ëš ëĨ´ë‹¤ëŠ” ę˛ƒė„ 나타냅니다. .TP .B \-Z, \-\-force\-zero ė´ė „ė— 0ė´ ė•„ë‹ˆė—ˆë˜ íŦ기가 0ė¸ 파ėŧė˜ 동기화ëŧ는 ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ė„ ę°•ė œí•Šë‹ˆë‹¤. SnapRAID가 ė´ëŸŦ한 ėĄ°ęą´ė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ė‹œėŠ¤í…œ ėļŠëŒ 후 ėŧëļ€ ė•Ąė„¸ėŠ¤ëœ 파ėŧė´ ėž˜ë ¸ė„ 때 ė‰Ŋ枌 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ė´ëŠ” ext3/ext4 파ėŧ ė‹œėŠ¤í…œė„ ė‚ŦėšŠí•˜ëŠ” Linuxė—ė„œ 가ëŠĨ한 ėĄ°ęą´ėž…ë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ \`sync\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-E, \-\-force\-empty ė›ëž˜ ë””ėŠ¤íŦ뗐 ėžˆë˜ ëĒ¨ë“  파ėŧė´ 누ëŊ된 ë””ėŠ¤íŦė˜ 동기화ëŧ는 ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ė„ ę°•ė œí•Šë‹ˆë‹¤. SnapRAID가 ë””ėŠ¤íŦ뗐 ė›ëž˜ ėžˆë˜ ëĒ¨ë“  파ėŧė´ 누ëŊ되거나 ë‹¤ė‹œ ėž‘ė„ąë˜ė—ˆėŒė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ë°ė´í„° 파ėŧ ė‹œėŠ¤í…œė´ ë§ˆėš´íŠ¸ë˜ė§€ ė•Šė•˜ė„ 때 ė‰Ŋ枌 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė€ \`sync\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-U, \-\-force\-uuid UUID가 ëŗ€ę˛Ŋ된 ë””ėŠ¤íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 동기화, í™•ė¸ 및 ėˆ˜ė •ė„ ę°•ė œí•˜ëŠ” ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ėž…ë‹ˆë‹¤. SnapRAID가 ėŧëļ€ ë””ėŠ¤íŦė˜ UUID가 ëŗ€ę˛Ŋë˜ė—ˆėŒė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ë””ėŠ¤íŦ가 ėž˜ëĒģ된 ë§ˆėš´íŠ¸ 맀렐뗐 ë§ˆėš´íŠ¸ë˜ė—ˆė„ 때 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ꡸ëŸŦ나 단ėŧ 패ëĻŦ티ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰 í•˜ë‚˜ė˜ UUID ëŗ€ę˛Ŋė´ í—ˆėšŠë˜ëŠ°, ė—ŦëŸŦ 패ëĻŦ티ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰 더 ë§Žė€ ëŗ€ę˛Ŋė´ í—ˆėšŠëŠë‹ˆë‹¤. ė´ëŠ” ëŗĩęĩŦ 후 ë””ėŠ¤íŦëĨŧ ęĩė˛´í•  ë•Œė˜ ėŧë°˜ė ė¸ ę˛Ŋėš°ė´ę¸° 때ëŦ¸ėž…니다. ė´ ė˜ĩė…˜ė€ \`sync\`, \`check\`, 또는 \`fix\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-D, \-\-force\-device ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ë””ėŠ¤íŦ 또는 동ėŧ한 ëŦŧëĻŦ렁 ėžĨėš˜ė— ėžˆëŠ” ë””ėŠ¤íŦ로 ėˆ˜ė •ė„ ę°•ė œí•˜ëŠ” ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´, 두 ę°œė˜ ë°ė´í„° ë””ėŠ¤íŦëĨŧ ėžƒęŗ  ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ만 ëŗĩęĩŦ하기 ėœ„í•´ ė˜ˆëš„ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, 두 ë˛ˆė§¸ ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ë””ėŠ¤íŦëĨŧ ëŦ´ė‹œí•  눘 ėžˆėŠĩ니다. 또는 ė´ë¯¸ ė‚ŦėšŠ ė¤‘ė¸ ë””ėŠ¤íŦ뗐 ë‚¨ė€ ė—Ŧ뜠 ęŗĩ氄뗐 ë””ėŠ¤íŦëĨŧ ëŗĩęĩŦ하려는 ę˛Ŋ뚰, 동ėŧ한 ëŦŧëĻŦ렁 ėžĨėš˜ëĨŧ ęŗĩėœ í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ \`fix\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-N, \-\-force\-nocopy \`sync\`, \`check\`, 및 \`fix\`ė—ė„œ ëŗĩė‚Ŧ 氐맀 발ę˛Ŧ법(heuristic)ė„ ëš„í™œė„ąí™”í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė—†ėœŧ늴 SnapRAID는 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦí”„ė™€ ę°™ė€ 동ėŧ한 ė†ė„ąė„ 氀맄 파ėŧė´ 동ėŧ한 ë°ė´í„°ëĨŧ 氀맄 ëŗĩė‚Ŧëŗ¸ė´ëŧęŗ  ę°€ė •í•Šë‹ˆë‹¤. ė´ëŠ” 한 ë””ėŠ¤íŦė—ė„œ 다ëĨ¸ ë””ėŠ¤íŦ로 ëŗĩė‚Ŧ되거나 ė´ë™ëœ 파ėŧė„ ė‹ëŗ„í•˜ęŗ , ė´ë¯¸ ęŗ„ė‚°ëœ í•´ė‹œ ė •ëŗ´ëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ëŦ´ë‹¨ 똤ëĨ˜ëĨŧ ę°ė§€í•˜ęą°ë‚˜ 누ëŊ된 파ėŧė„ ëŗĩęĩŦ할 눘 ėžˆë„ëĄ 합니다. ėŧëļ€ ë“œëŦ¸ ę˛Ŋėš°ė— ė´ ë™ėž‘ė€ ė˜¤íƒ(false positives) 또는 ë§Žė€ í•´ė‹œ í™•ė¸ėœŧ로 ė¸í•œ 느ëϰ í”„ëĄœė„¸ėŠ¤ëĨŧ ė´ˆëž˜í•  눘 ėžˆėœŧ늰, ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ ė´ëŸŦ한 ëŦ¸ė œëĨŧ 해결할 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ \`sync\`, \`check\`, 및 \`fix\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-F, \-\-force\-full \`sync\`ė—ė„œ 패ëĻŦí‹°ė˜ 렄랴 ėžŦęŗ„ė‚°ė„ ę°•ė œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ 냈 패ëĻŦ티 ėˆ˜ė¤€ė„ ėļ”ę°€í•˜ęą°ë‚˜, 더 ėĩœęˇŧė˜ 패ëĻŦ티 ë°ė´í„°ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė´ė „ content 파ėŧ로 ë˜ëŒë ¸ė„ 때 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ė˛˜ėŒëļ€í„° 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•˜ëŠ” ëŒ€ė‹ , ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ content 파ėŧ뗐 ėžˆëŠ” í•´ė‹œëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ë°ė´í„°ëĨŧ 검ėĻí•˜ęŗ  ę¸°ėĄ´ 패ëĻŦ티 ë°ė´í„°ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ \`sync\` í”„ëĄœė„¸ėŠ¤ 뤑뗐 ë°ė´í„° ëŗ´í˜¸ëĨŧ ėœ ė§€í•  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ \`sync\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .TP .B \-R, \-\-force\-realloc \`sync\`ė—ė„œ 파ėŧė˜ 렄랴 ėžŦ할당 및 패ëĻŦ티 ėžŦ빌드ëĨŧ ę°•ė œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ content 파ėŧ뗐 ėžˆëŠ” í•´ė‹œëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ë°ė´í„°ëĨŧ 검ėĻí•˜ëŠ´ė„œ 단편화ëĨŧ ė œęą°í•˜ęŗ  ëĒ¨ë“  파ėŧė„ ė™„ė „ížˆ ėžŦ할당하는 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ \`sync\`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė‚ŦėšŠí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. \`sync\` ėž‘ė—… ė¤‘ė—ëŠ” ë°ė´í„° ëŗ´í˜¸ę°€ ė—†ėŠĩ니다. .TP .B \-W, \-\-force\-realloc\-tail íŦ기 \-R, \-\-force\-reallocęŗŧ ę°™ė´ ėž‘ë™í•˜ė§€ë§Œ, 각 패ëĻŦ티 파ėŧė˜ ė§€ė •ëœ ęŧŦëĻŦ ëļ€ëļ„(ë§ˆė§€ë§‰ \'íŦ기\' ë°”ė´íŠ¸)ėœŧ로 ė œí•œëŠë‹ˆë‹¤. 현ėžŦ 해당 ęŧŦëĻŦ ė„šė…˜ė— ė €ėžĨ된 ëĒ¨ë“  파ėŧ ėĄ°ę°/ë¸”ëĄė˜ ėžŦ할당(ė´ë™)ė„ ę°•ė œí•˜ė—Ŧ, ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ” 패ëĻŦ티 파ėŧ ë‚´ė˜ ė–´ëŠ ęŗŗė´ë“ (ę¸°ėĄ´ 뚈 ęŗĩ간 íŦ함) ë°°ėš˜ë  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė˜ ėŖŧėš” ëĒŠė ė€ 패ëĻŦ티 파ėŧė˜ ë””ėŠ¤íŦ냁 íŦ기ëĨŧ ė¤„ė´ëŠ” ę˛ƒėž…ë‹ˆë‹¤. ėžŦí• ë‹šė„ í†ĩ해 렄랴 ęŧŦëĻŦ ė„šė…˜ė´ ė„ąęŗĩ렁ėœŧ로 ëš„ė›Œė§€ëŠ´(ë‚¨ė€ ë¸”ëĄė´ ė—†ėŒ), 패ëĻŦ티 파ėŧė´ ėž˜ëĻŦęŗ (truncated) ė‚ŦėšŠë˜ė§€ ė•ŠëŠ” ęŧŦëĻŦ ęŗĩę°„ė„ íšŒėˆ˜í•Šë‹ˆë‹¤. K, M, G, T뙀 ę°™ė€ ë°°ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다 (똈: \-\-force\-realloc\-tail 1G). locate \-t, \-\-tailė„ ė‚ŦėšŠí•˜ė—Ŧ 똁í–Ĩė„ 받는 파ėŧė„ ė‚Ŧ렄뗐 í™•ė¸í•  눘 ėžˆėŠĩ니다. ę˛Ŋęŗ ! ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė‚ŦėšŠí•˜ė§€ ė•Šė„ ę˛ƒė„ 강ë Ĩ히 ęļŒėžĨ합니다. 똁í–Ĩė„ 받는 파ėŧ뗐 ëŒ€í•´ė„œëŠ” \`sync\` ėž‘ė—… ë™ė•ˆ ë°ė´í„° ëŗ´í˜¸ëĨŧ ë°›ė„ 눘 ė—†ėŠĩ니다. .TP .B \-l, \-\-log FILE ė§€ė •ëœ 파ėŧ뗐 ėžė„¸í•œ 로그ëĨŧ 기록합니다. ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•Šėœŧ늴 ė˜ˆėƒėš˜ ëĒģ한 똤ëĨ˜ę°€ í™”ëŠ´ė— ėļœë Ĩë˜ė–´, ë§Žė€ 똤ëĨ˜ę°€ ë°œėƒí•˜ëŠ” ę˛Ŋ뚰 ęŗŧ도한 ėļœë Ĩė´ ë°œėƒí•  눘 ėžˆėŠĩ니다. \-l, \-\-log가 ė§€ė •ë˜ëŠ´ SnapRAID가 ė¤‘ė§€ë˜ëŠ” ėš˜ëĒ…ė ė¸ 똤ëĨ˜ë§Œ í™”ëŠ´ė— ėļœë Ĩ됩니다. ę˛Ŋ로가 \`>>\`로 ė‹œėž‘í•˜ëŠ´ 파ėŧė´ ėļ”ę°€ ëĒ¨ë“œëĄœ ė—´ëĻŊ니다. ė´ëĻ„ė˜ \`%D\`뙀 \`%T\`는 YYYYMMDD 및 HHMMSS í˜•ė‹ė˜ ë‚ ė§œ 및 ė‹œę°„ėœŧ로 ëŒ€ė˛´ëŠë‹ˆë‹¤. Windows ë°°ėš˜ 파ėŧė—ė„œëŠ” \`%\` ëŦ¸ėžëĨŧ 두 배로 늘려ė•ŧ 합니다(똈: result\-%%D.log). \`>>\`ëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė´ëĻ„ė„ ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다(똈: \`\[dq]>>result.log\[dq]\`). 로그ëĨŧ í‘œė¤€ ėļœë Ĩ 또는 í‘œė¤€ 똤ëĨ˜ëĄœ ėļœë Ĩ하려면 각각 \`\[dq]>&1\[dq]\` 및 \`\[dq]>&2\[dq]\`ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 로그 태그 네ëĒ…ė€ snapraid_log.txt 파ėŧ 또는 man íŽ˜ė´ė§€ëĨŧ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. .TP .B \-L, \-\-error\-limit NUMBER ė‹¤í–‰ė„ ė¤‘ė§€í•˜ę¸° 렄뗐 ėƒˆëĄœėš´ 똤ëĨ˜ ė œí•œė„ ė„¤ė •í•Šë‹ˆë‹¤. ę¸°ëŗ¸ė ėœŧ로 SnapRAID는 100氜 ė´ėƒė˜ ėž…ėļœë Ĩ 똤ëĨ˜ę°€ ë°œėƒí•˜ëŠ´ ė¤‘ė§€ëŠë‹ˆë‹¤. ė´ëŠ” ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•  가ëŠĨė„ąė´ ėžˆėŒė„ 나타냅니다. ė´ ė˜ĩė…˜ė€ \`sync\` 및 \`scrub\`뗐 똁í–Ĩė„ ë¯¸ėš˜ëŠ°, ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ 똤ëĨ˜ ė„¸íŠ¸ í›„ė— ęŗ„ė† ė§„í–‰í•˜ė—Ŧ ėž‘ė—…ė„ ė™„ëŖŒí•˜ë ¤ęŗ  ė‹œë„í•  눘 ėžˆë„ëĄ í—ˆėšŠí•Šë‹ˆë‹¤. ꡸ëŸŦ나 \`check\` 및 \`fix\`는 í•­ėƒ ė˛Ģ ë˛ˆė§¸ 똤ëĨ˜ė—ė„œ ė¤‘ė§€ëŠë‹ˆë‹¤. .TP .B \-S, \-\-start BLKSTART ė§€ė •ëœ 블록 번호ëļ€í„° 래ëĻŦëĨŧ ė‹œėž‘í•Šë‹ˆë‹¤. ė´ëŠ” ė†ėƒëœ ë””ėŠ¤íŦė˜ ę˛Ŋ뚰 íŠšė • ë¸”ëĄė„ ë‹¤ė‹œ í™•ė¸í•˜ęą°ë‚˜ ėˆ˜ė •í•˜ëŠ” 데 ėœ ėšŠí•  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ ėŖŧ로 溠揉 ėˆ˜ë™ ëŗĩęĩŦëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. .TP .B \-B, \-\-count BLKCOUNT ė§€ė •ëœ ėˆ˜ė˜ 블록만 래ëĻŦ합니다. ė´ ė˜ĩė…˜ė€ ėŖŧ로 溠揉 ėˆ˜ë™ ëŗĩęĩŦëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. .TP .B \-C, \-\-gen\-conf CONTENT ę¸°ėĄ´ content 파ėŧė—ė„œ 더미 네렕 파ėŧė„ ėƒė„ąí•Šë‹ˆë‹¤. 네렕 파ėŧė€ í‘œė¤€ ėļœë Ĩėœŧ로 ėž‘ė„ąë˜ëŠ° ę¸°ėĄ´ 파ėŧė„ ëŽė–´ė“°ė§€ ė•ŠėŠĩ니다. ė´ 네렕 파ėŧė—ëŠ” 렄랴 ė‹œėŠ¤í…œė„ ėžƒė„ ę˛Ŋ뚰 ë””ėŠ¤íŦ ë§ˆėš´íŠ¸ ė§€ė ė„ ėžŦęĩŦė„ąí•˜ëŠ” 데 í•„ėš”í•œ ė •ëŗ´ë„ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. .TP .B \-v, \-\-verbose í™”ëŠ´ė— 더 ë§Žė€ ė •ëŗ´ëĨŧ ėļœë Ĩ합니다. 한 번 ė§€ė •í•˜ëŠ´ ė œė™¸ëœ 파ėŧ 및 ėļ”ę°€ í†ĩęŗ„ëĨŧ ėļœë Ĩ합니다. ė´ ė˜ĩė…˜ė€ 로그 파ėŧė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. .TP .B \-q, \-\-quiet í™”ëŠ´ė— 더 ė ė€ ė •ëŗ´ëĨŧ ėļœë Ĩ합니다. 한 번 ė§€ė •í•˜ëŠ´ ė§„í–‰ëĨ  í‘œė‹œė¤„ė„ ė œęą°í•˜ęŗ , 두 번 ė§€ė •í•˜ëŠ´ ė‹¤í–‰ ė¤‘ė¸ ėž‘ė—…ė„ ė œęą°í•˜ëŠ°, 넏 번 ė§€ė •í•˜ëŠ´ ė •ëŗ´ ëŠ”ė‹œė§€ëĨŧ ė œęą°í•˜ęŗ , 네 번 ė§€ė •í•˜ëŠ´ ėƒíƒœ ëŠ”ė‹œė§€ëĨŧ ė œęą°í•Šë‹ˆë‹¤. ėš˜ëĒ…ė ė¸ 똤ëĨ˜ëŠ” í•­ėƒ í™”ëŠ´ė— ėļœë Ĩ됩니다. ė´ ė˜ĩė…˜ė€ 로그 파ėŧė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. .TP .B \-H, \-\-help 간단한 ë„ė›€ë§ í™”ëŠ´ė„ ėļœë Ĩ합니다. .TP .B \-V, \-\-version 프로그램 ë˛„ė „ė„ ėļœë Ĩ합니다. .SH CONFIGURATION SnapRAID는 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ėœ„ėš˜ė™€ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ할 ėœ„ėš˜ëĨŧ ė•Œę¸° ėœ„í•´ 네렕 파ėŧė´ í•„ėš”í•Šë‹ˆë‹¤. .PP Unixė—ė„œëŠ” \`/usr/local/etc/snapraid.conf\` 파ėŧė´ ėĄ´ėžŦ하면 ė‚ŦėšŠí•˜ęŗ , ęˇ¸ë ‡ė§€ ė•Šėœŧ늴 \`/etc/snapraid.conf\`ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. Windowsė—ė„œëŠ” \`snapraid.exe\`뙀 ę°™ė€ 디렉토ëĻŦ뗐 ėžˆëŠ” \`snapraid.conf\` 파ėŧė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. .PP ë‹¤ėŒ ė˜ĩė…˜ė´ íŦí•¨ë˜ė–´ė•ŧ 합니다(ëŒ€ė†ŒëŦ¸ėž ęĩŦëļ„): .SS parity FILE [,FILE] ... 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. 패ëĻŦ티는 RAID5뙀 뜠ė‚Ŧ하게 단ėŧ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗ´í˜¸ëĨŧ 가ëŠĨ하게 합니다. .PP ė—ŦëŸŦ 파ėŧė„ ė§€ė •í•  눘 ėžˆėœŧ늰, ė´ë“¤ė€ ė„œëĄœ 다ëĨ¸ ë””ėŠ¤íŦ뗐 ėžˆė–´ė•ŧ 합니다. í•˜ë‚˜ė˜ 파ėŧė´ 더 ė´ėƒ ėģ¤ė§ˆ 눘 ė—†ė„ 때 ë‹¤ėŒ 파ėŧė´ ė‚ŦėšŠëŠë‹ˆë‹¤. ė´ ė‚ŦėšŠ 가ëŠĨ한 ęŗĩę°„ė€ ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 ë°ė´í„° ë””ėŠ¤íŦëŗ´ë‹¤ ė ė–´ë„ ėģ¤ė•ŧ 합니다. .PP ë‚˜ė¤‘ė— ėļ”ę°€ 패ëĻŦ티 파ėŧė„ ėļ”가할 눘 ėžˆė§€ë§Œ, ėˆœė„œëĨŧ 바꾸거나 ė œęą°í•  ėˆ˜ëŠ” ė—†ėŠĩ니다. .PP 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ 패ëĻŦí‹°ėšŠėœŧ로 똈ė•Ŋ하면 ë‹¨íŽ¸í™”ë˜ė§€ ė•Šė•„ ė„ąëŠĨė´ í–ĨėƒëŠë‹ˆë‹¤. .PP Windowsė—ė„œëŠ” ë””ėŠ¤íŦ가 가득 ė°ŧ다는 ę˛Ŋęŗ ëĨŧ í”ŧ하기 ėœ„í•´ 각 ë””ėŠ¤íŦ뗐 256MB가 ė‚ŦėšŠë˜ė§€ ė•Šė€ ėą„ëĄœ 남ėŠĩ니다. .PP ė´ ė˜ĩė…˜ė€ í•„ėˆ˜ė´ëŠ° 한 번만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... ėļ”ę°€ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. .PP ė§€ė •ëœ 각 패ëĻŦ티 ėˆ˜ė¤€ė— 대해 í•˜ë‚˜ė˜ ėļ”ę°€ ëŗ´í˜¸ ėˆ˜ė¤€ė´ í™œė„ąí™”ëŠë‹ˆë‹¤: .PD 0 .IP \(bu 2\-parity는 RAID6 ė´ė¤‘ 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. .IP \(bu 3\-parity는 ė‚ŧ뤑 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. .IP \(bu 4\-parity는 ėŋŧ드(4뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. .IP \(bu 5\-parity는 펜타(5뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. .IP \(bu 6\-parity는 í—Ĩė‚Ŧ(6뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. .PD .PP 각 패ëĻŦ티 ėˆ˜ė¤€ė€ ëĒ¨ë“  ė´ė „ 패ëĻŦ티 ėˆ˜ė¤€ė˜ ėĄ´ėžŦëĨŧ í•„ėš”ëĄœ 합니다. .PP \`parity\` ė˜ĩė…˜ęŗŧ 동ėŧ한 ęŗ ë ¤ ė‚Ŧí•­ė´ ė ėšŠëŠë‹ˆë‹¤. .PP ė´ ė˜ĩė…˜ė€ ė„ íƒ ė‚Ŧí•­ė´ëŠ° 한 번만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. .SS z\-parity FILE [,FILE] ... ė‚ŧ뤑 패ëĻŦ티ëĨŧ ė €ėžĨ하는 ëŒ€ė˛´ 파ėŧ 및 í˜•ė‹ė„ ė •ė˜í•Šë‹ˆë‹¤. .PP ė´ ė˜ĩė…˜ė€ \`3\-parity\`ė˜ ëŒ€ė•ˆė´ëŠ°, ėŖŧ로 SSSE3 ëĒ…ë šė–´ ė„¸íŠ¸ëĨŧ ė§€ė›í•˜ė§€ ė•ŠëŠ” ARM 또는 AMD Phenom, Athlon, Opteronęŗŧ ę°™ė€ ė €ę°€í˜• CPUëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ė´ëŸŦ한 ę˛Ŋ뚰 더 ë‚˜ė€ ė„ąëŠĨė„ 렜ęŗĩ합니다. .PP ė´ í˜•ė‹ė€ ZFS RAIDZ3ė—ė„œ ė‚ŦėšŠë˜ëŠ” 것ęŗŧ 뜠ė‚Ŧí•˜ė§€ë§Œ 더 ëš ëĻ…ë‹ˆë‹¤. ZFS뙀 마ė°Ŧę°€ė§€ëĄœ ė‚ŧ뤑 패ëĻŦ티 ė´ėƒė—ė„œëŠ” ėž‘ë™í•˜ė§€ ė•ŠėŠĩ니다. .PP \`3\-parity\`ëĨŧ ė‚ŦėšŠí•  때 ė„ąëŠĨ í–Ĩėƒė„ ėœ„í•´ \`z\-parity\` í˜•ė‹ė„ ė‚ŦėšŠí•˜ëŠ” ę˛ƒė´ ęļŒėžĨ되는 ę˛Ŋ뚰 ę˛Ŋęŗ ëĨŧ 받게 됩니다. .PP ė›í•˜ëŠ” z\-parity 또는 3\-parity 파ėŧ로 네렕 파ėŧė„ ėĄ°ė •í•˜ęŗ  \`fix\`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ë‹¤ė‹œ ėƒė„ąí•¨ėœŧëĄœė¨ 한 í˜•ė‹ė—ė„œ 다ëĨ¸ í˜•ė‹ėœŧ로 ëŗ€í™˜í•  눘 ėžˆėŠĩ니다. .SS content FILE ë””ėŠ¤íŦ ė–´ë ˆė´ė— ėžˆëŠ” ëĒ¨ë“  파ėŧė˜ ëĒŠëĄęŗŧ 랴íŦė„Ŧė„ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. .PP ë°ė´í„°, 패ëĻŦ티 또는 ė‚ŦėšŠ 가ëŠĨ한 다ëĨ¸ ë””ėŠ¤íŦ뗐 ë°°ėš˜í•  눘 ėžˆėŠĩ니다. ë°ė´í„° ë””ėŠ¤íŦëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, ė´ 파ėŧė€ \`sync\` í”„ëĄœė„¸ėŠ¤ė—ė„œ ėžë™ėœŧ로 ė œė™¸ëŠë‹ˆë‹¤. .PP ė´ ė˜ĩė…˜ė€ í•„ėˆ˜ė´ëŠ° 동ėŧ한 파ėŧė˜ ė—ŦëŸŦ ëŗĩė‚Ŧëŗ¸ė„ ė €ėžĨ하기 ėœ„í•´ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. .PP ė‚ŦėšŠëœ 각 패ëĻŦ티 ë””ėŠ¤íŦ뗐 대해 ėĩœė†Œí•œ í•˜ë‚˜ė˜ ëŗĩė‚Ŧëŗ¸ė„ ė €ėžĨ해ė•ŧ 하며, 하나ëĨŧ 더 ėļ”가해ė•ŧ 합니다. ėļ”ę°€ ëŗĩė‚Ŧëŗ¸ė„ ė‚ŦėšŠí•´ë„ í•´ëĄ­ė§€ ė•ŠėŠĩ니다. .SS data NAME DIR ė–´ë ˆė´ė˜ ë°ė´í„° ë””ėŠ¤íŦė˜ ė´ëĻ„ęŗŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ė •ė˜í•Šë‹ˆë‹¤. NAMEė€ ë””ėŠ¤íŦëĨŧ ė‹ëŗ„í•˜ëŠ” 데 ė‚ŦėšŠë˜ëŠ° ęŗ ėœ í•´ė•ŧ 합니다. DIRė€ 파ėŧ ė‹œėŠ¤í…œė—ė„œ ë””ėŠ¤íŦė˜ ë§ˆėš´íŠ¸ ė§€ė ėž…ë‹ˆë‹¤. .PP NAMEė„ ęŗ ė •ëœ ėƒíƒœëĄœ ėœ ė§€í•˜ëŠ” 한, í•„ėš”ė— 따ëŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ëŗ€ę˛Ŋ할 눘 ėžˆėŠĩ니다. .PP ė–´ë ˆė´ė˜ 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 대해 í•˜ë‚˜ė˜ ė˜ĩė…˜ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. .PP ë‚˜ė¤‘ė— 네렕 파ėŧė—ė„œ 링렑 NAMEė„ ëŗ€ę˛Ŋí•˜ęŗ  \`sync\` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ë””ėŠ¤íŦė˜ ė´ëĻ„ė„ 바ęŋ€ 눘 ėžˆėŠĩ니다. ė´ëĻ„ ëŗ€ę˛Ŋė˜ ę˛Ŋ뚰, ë””ėŠ¤íŦė˜ ė €ėžĨ된 UUIDëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė—°ę˛°ëŠë‹ˆë‹¤. .SS extra NAME DIR \`smart\` 및 \`probe\` ëĒ…ë šėœŧ로 ëĒ¨ë‹ˆí„°ë§í•  ėļ”ę°€ ë””ėŠ¤íŦė˜ ė´ëĻ„ęŗŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ė •ė˜í•Šë‹ˆë‹¤. .PP ė´ę˛ƒė€ ëļ€íŒ… ë””ėŠ¤íŦ뙀 ę°™ė´ ė–´ë ˆė´ė˜ ėŧëļ€ëŠ” ė•„ë‹ˆė§€ë§Œ ė‹œėŠ¤í…œ ėž‘ë™ė— í•„ėš” 한 ë””ėŠ¤íŦëĨŧ ëĒ¨ë‹ˆí„°ë§í•˜ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. .PP ė´ëŸŦ한 ë””ėŠ¤íŦ는 í•­ėƒ íšŒė „í•  것ėœŧ로 ė˜ˆėƒë˜ë¯€ëĄœ \`up\` 및 \`down\` ëĒ…ë šė˜ 똁í–Ĩė„ ë°›ė§€ ė•ŠėŠĩ니다. .SS nohidden ëĒ¨ë“  ėˆ¨ę˛¨ė§„ 파ėŧ 및 디렉토ëĻŦëĨŧ ė œė™¸í•Šë‹ˆë‹¤. Unixė—ė„œëŠ” ėˆ¨ę˛¨ė§„ 파ėŧė€ \'.\'ėœŧ로 ė‹œėž‘í•˜ëŠ” 파ėŧėž…ë‹ˆë‹¤. Windowsė—ė„œëŠ” ėˆ¨ęš€ ė†ė„ąė„ 氀맄 파ėŧėž…ë‹ˆë‹¤. .SS exclude/include PATTERN sync í”„ëĄœė„¸ėŠ¤ė—ė„œ ė œė™¸í•˜ęą°ë‚˜ íŦ함할 파ėŧ 또는 디렉토ëĻŦ íŒ¨í„´ė„ ė •ė˜í•Šë‹ˆë‹¤. ëĒ¨ë“  íŒ¨í„´ė€ ė§€ė •ëœ ėˆœė„œëŒ€ëĄœ 래ëĻŦ됩니다. .PP ėŧėš˜í•˜ëŠ” ė˛Ģ ë˛ˆė§¸ íŒ¨í„´ė´ \`exclude\` íŒ¨í„´ė´ëŠ´ 파ėŧė€ ė œė™¸ëŠë‹ˆë‹¤. \`include\` íŒ¨í„´ė´ëŠ´ 파ėŧė€ íŦ함됩니다. ėŧėš˜í•˜ëŠ” íŒ¨í„´ė´ ė—†ėœŧ늴, ė§€ė •ëœ ë§ˆė§€ë§‰ íŒ¨í„´ė´ \`include\`ė´ëŠ´ 파ėŧė€ ė œė™¸ë˜ęŗ , \`exclude\`ė´ëŠ´ íŦ함됩니다. .PP 패턴 ė‚Ŧ떑뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ PATTERN ė„šė…˜ė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. .PP ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. .SS blocksize SIZE_IN_KIBIBYTES 패ëĻŦí‹°ė˜ ę¸°ëŗ¸ 블록 íŦ기ëĨŧ í‚¤ëš„ë°”ė´íŠ¸(kibibyte) ë‹¨ėœ„ëĄœ ė •ė˜í•Šë‹ˆë‹¤. 1í‚¤ëš„ë°”ė´íŠ¸ëŠ” 1024ë°”ė´íŠ¸ėž…ë‹ˆë‹¤. .PP ę¸°ëŗ¸ 블록 íŦ기는 256ė´ëŠ°, 대ëļ€ëļ„ė˜ ę˛Ŋėš°ė— ėž‘ë™í•´ė•ŧ 합니다. .PP **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė´ ę°’ė„ ëŗ€ę˛Ŋí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. ë‚˜ė¤‘ė— ė´ ę°’ė„ ëŗ€ę˛Ŋ하려면 렄랴 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•´ė•ŧ 합니다! .PP 다ëĨ¸ 블록 íŦ기ëĨŧ ė‚ŦėšŠí•˜ëŠ” ė´ėœ ëŠ” ėˆ˜ë°ąë§Œ ę°œė˜ ėž‘ė€ 파ėŧė´ ë§Žė€ ę˛Ŋėš°ėž…ë‹ˆë‹¤. .PP 각 파ėŧ뗐 대해, ëLJ ë°”ė´íŠ¸ë§Œ ėžˆė–´ë„ 렄랴 패ëĻŦ티 ë¸”ëĄė´ 할당되며, 파ėŧė´ 많ėœŧ늴 ėƒë‹ší•œ 미ė‚ŦėšŠ 패ëĻŦ티 ęŗĩę°„ė´ ë°œėƒí•  눘 ėžˆėŠĩ니다. 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ ė™„ė „ížˆ ėą„ėš°ëŠ´ ë°ė´í„° ë””ėŠ¤íŦ뗐 더 ė´ėƒ 파ėŧė„ ėļ”가할 눘 ė—†ėŠĩ니다. ꡸ëŸŦ나 낭비된 패ëĻŦ티는 ë°ė´í„° ë””ėŠ¤íŦ 렄랴뗐 ęą¸ėŗ ėļ•ė ë˜ė§€ ė•ŠėŠĩ니다. ë°ė´í„° ë””ėŠ¤íŦė˜ ë§Žė€ 파ėŧ로 ė¸í•´ ë°œėƒí•˜ëŠ” 낭비된 ęŗĩę°„ė€ 다ëĨ¸ ë°ė´í„° ë””ėŠ¤íŦ가 ė•„ë‹Œ 해당 ë°ė´í„° ë””ėŠ¤íŦė˜ ë°ė´í„° ė–‘ë§Œ ė œí•œí•Šë‹ˆë‹¤. .PP 대ëžĩ렁ėœŧ로, 각 파ėŧ뗐 대해 블록 íŦę¸°ė˜ ė ˆë°˜ė´ ë‚­ëš„ëœë‹¤ęŗ  ę°€ė •í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 100,000ę°œė˜ 파ėŧęŗŧ 256KiB 블록 íŦ기로 12.8GBė˜ 패ëĻŦ티가 낭비되며, ė´ëŠ” ë°ė´í„° ë””ėŠ¤íŦė—ė„œ 12.8GBė˜ ė‚ŦėšŠ 가ëŠĨ한 ęŗĩę°„ė´ ė¤„ė–´ë“¤ 눘 ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. .PP \`status\`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 각 ë””ėŠ¤íŦė˜ 낭비된 ęŗĩę°„ė˜ ė–‘ė„ í™•ė¸í•  눘 ėžˆėŠĩ니다. ė´ëŠ” ë°ė´í„° ë””ėŠ¤íŦ뗐 ëš„ė›Œ 두거나 ė–´ë ˆė´ė— íŦí•¨ë˜ė§€ ė•Šė€ 파ėŧ뗐 ė‚ŦėšŠí•´ė•ŧ 하는 ęŗĩę°„ė˜ ė–‘ėž…ë‹ˆë‹¤. ė´ ę°’ė´ ėŒėˆ˜ė´ëŠ´ 패ëĻŦ티ëĨŧ ęą°ė˜ ėą„ėš°ęŗ  ėžˆėŒė„ ė˜ë¯¸í•˜ëŠ°, ė—Ŧė „ížˆ 낭비할 눘 ėžˆëŠ” ęŗĩę°„ė„ 나타냅니다. .PP ė´ ëŦ¸ė œëĨŧ í”ŧ하려면 패ëĻŦí‹°ė— 대해 더 큰 íŒŒí‹°ė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 패ëĻŦ티 íŒŒí‹°ė…˜ė´ ë°ė´í„° ë””ėŠ¤íŦëŗ´ë‹¤ 12.8GB 더 큰 ę˛Ŋ뚰, 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 ėĩœëŒ€ 100,000ę°œė˜ 파ėŧė„ 낭비되는 ęŗĩ간 ė—†ė´ 래ëĻŦ할 눘 ėžˆëŠ” ėļŠëļ„한 ėļ”ę°€ ęŗĩę°„ė´ ėžˆėŠĩ니다. .PP Linuxė—ė„œ 더 큰 패ëĻŦ티 íŒŒí‹°ė…˜ė„ ė–ģ는 트ëĻ­ė€ ë‹¤ėŒ ëĒ…ë šėœŧ로 íŦ맷하는 ę˛ƒėž…ë‹ˆë‹¤: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP ė´ëĄœ ė¸í•´ ė•Ŋ 1.5%ė˜ ėļ”ę°€ ęŗĩę°„ė´ ë°œėƒí•˜ëŠ°, 4TB ë””ėŠ¤íŦė˜ ę˛Ŋ뚰 ė•Ŋ 60GB로, 낭비되는 ęŗĩ간 ė—†ė´ 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 ė•Ŋ 460,000ę°œė˜ 파ėŧė„ í—ˆėšŠí•Šë‹ˆë‹¤. .SS hashsize SIZE_IN_BYTES ė €ėžĨ된 ë¸”ëĄė˜ í•´ė‹œ íŦ기ëĨŧ ë°”ė´íŠ¸ ë‹¨ėœ„ëĄœ ė •ė˜í•Šë‹ˆë‹¤. .PP ę¸°ëŗ¸ í•´ė‹œ íŦ기는 16ë°”ė´íŠ¸(128비트)ė´ëŠ°, 대ëļ€ëļ„ė˜ ę˛Ŋėš°ė— ėž‘ë™í•´ė•ŧ 합니다. .PP **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė´ ę°’ė„ ëŗ€ę˛Ŋí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. ë‚˜ė¤‘ė— ė´ ę°’ė„ ëŗ€ę˛Ŋ하려면 렄랴 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•´ė•ŧ 합니다! .PP 다ëĨ¸ í•´ė‹œ íŦ기ëĨŧ ė‚ŦėšŠí•˜ëŠ” ė´ėœ ëŠ” ė‹œėŠ¤í…œė˜ 메ëǍëĻŦ가 ė œí•œė ė¸ ę˛Ŋėš°ėž…ë‹ˆë‹¤. ę˛Ŋí—˜ėƒ SnapRAID는 ė–´ë ˆė´ė˜ 16TB ë°ė´í„°ë‹š ėŧë°˜ė ėœŧ로 1GiBė˜ RAMė„ í•„ėš”ëĄœ 합니다. .PP ęĩŦ랴렁ėœŧ로, ë°ė´í„°ė˜ í•´ė‹œëĨŧ ė €ėžĨ하기 ėœ„í•´ SnapRAID는 대ëžĩ TS*(1+HS)/BS ë°”ė´íŠ¸ė˜ RAMė„ í•„ėš”ëĄœ 합니다. ė—Ŧę¸°ė„œ TS는 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ė´ íŦ기(ë°”ė´íŠ¸), BS는 블록 íŦ기(ë°”ė´íŠ¸), HS는 í•´ė‹œ íŦ기(ë°”ė´íŠ¸)ėž…ë‹ˆë‹¤. .PP 똈ëĨŧ ë“¤ė–´, 4TB ë””ėŠ¤íŦ 8氜, 블록 íŦ기 256KiB (1KiB = 1024ë°”ė´íŠ¸), í•´ė‹œ íŦ기 16ė¸ ę˛Ŋ뚰 ë‹¤ėŒęŗŧ 같ėŠĩ니다: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB .PD 0 .PD .PP í•´ė‹œ íŦ기ëĨŧ 8로 ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB .PD 0 .PD .PP 블록 íŦ기ëĨŧ 512로 ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB .PD 0 .PD .PP í•´ė‹œ íŦ기ëĨŧ 8로, 블록 íŦ기ëĨŧ 512로 ëĒ¨ë‘ ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES ė§€ė •ëœ GB ė–‘ė´ 래ëĻŦ된 후 동기화 또는 늤íŦëŸŊ ė‹œ ėƒíƒœëĨŧ ėžë™ėœŧ로 ė €ėžĨ합니다. ė´ ė˜ĩė…˜ė€ 揰溄 ėļŠëŒ 또는 기타 ė´ë˛¤íŠ¸ëĄœ ė¸í•´ ė¤‘ë‹¨ëœ ę˛Ŋ뚰 긴 \`sync\` ëĒ…ë šė„ ė˛˜ėŒëļ€í„° ë‹¤ė‹œ ė‹œėž‘í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•˜ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. .SS temp_limit TEMPERATURE_CELSIUS í—ˆėšŠë˜ëŠ” ėĩœëŒ€ ë””ėŠ¤íŦ ė˜¨ë„ëĨŧ ė„­ė”¨ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ė§€ė •ë˜ëŠ´ SnapRAID는 smartctl 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėŖŧ揰렁ėœŧ로 ëĒ¨ë“  ë””ėŠ¤íŦė˜ ė˜¨ë„ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. SnapRAID가 ėž‘ë™í•˜ëŠ” ë™ė•ˆ 현ėžŦ ë””ėŠ¤íŦ ė˜¨ë„ę°€ í‘œė‹œëŠë‹ˆë‹¤. ė–´ë–¤ ë””ėŠ¤íŦëŧ도 ė´ ė œí•œė„ 봈ęŗŧ하면 ëĒ¨ë“  ėž‘ė—…ė´ ė¤‘ė§€ë˜ęŗ , ë””ėŠ¤íŦ는 \`temp_sleep\` ė˜ĩė…˜ėœŧ로 ė •ė˜ëœ 기간 ë™ė•ˆ íšŒė „ ė¤‘ė§€ëŠë‹ˆë‹¤(대기 ëĒ¨ë“œëĄœ ė „í™˜ë¨). ė ˆė „ 기간 후 ėž‘ė—…ė´ ėžŦ개되며, ė˜¨ë„ ė œí•œė— ë‹¤ė‹œ 도ë‹Ŧ하면 ë‹¤ė‹œ ėŧė‹œ ė¤‘ė§€ë  눘 ėžˆėŠĩ니다. .PP ėž‘ë™ 뤑뗐 SnapRAID는 각 ë””ėŠ¤íŦė˜ 氀뗴 ęŗĄė„ ė„ ëļ„ė„í•˜ęŗ  í™œë™ė´ ęŗ„ė†ë˜ëŠ´ 도ë‹Ŧ할 것ėœŧ로 ė˜ˆėƒë˜ëŠ” ėžĨ기 ė •ėƒ ė˜¨ë„ëĨŧ ėļ”ė •í•Šë‹ˆë‹¤. ėļ”ė •ė€ ë””ėŠ¤íŦ ė˜¨ë„ę°€ 네 번 ėĻę°€í•œ í›„ė—ë§Œ ėˆ˜í–‰ë˜ė–´, ė‹ ëĸ°í•  눘 ėžˆëŠ” ėļ”넏ëĨŧ ė„¤ė •í•˜ę¸°ė— ėļŠëļ„한 ë°ė´í„° íŦė¸íŠ¸ę°€ í™•ëŗ´ë˜ë„ëĄ 합니다. ė´ ė˜ˆė¸Ąëœ ė •ėƒ ė˜¨ë„ëŠ” 현ėžŦ 값 ė˜†ė— 괄호 ė•ˆė— í‘œė‹œë˜ëŠ°, ė‹œėŠ¤í…œė˜ ëƒ‰ę°ė´ ė ė ˆí•œė§€ 평가하는 데 ë„ė›€ė´ 됩니다. ė´ ėļ”ė • ė˜¨ë„ëŠ” ė •ëŗ´ 렜ęŗĩ ëĒŠė ėŧ ëŋė´ëа SnapRAIDė˜ ë™ėž‘ė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. í”„ëĄœęˇ¸ëž¨ė˜ ë™ėž‘ė€ ė˜¤ëĄœė§€ ė‹¤ė œ ė¸Ąė •ëœ ë””ėŠ¤íŦ ė˜¨ë„ė— 기반합니다. .PP ė´ ëļ„ė„ė„ ėˆ˜í–‰í•˜ë ¤ëŠ´ SnapRAID는 ė‹œėŠ¤í…œ ė˜¨ë„ė— 대한 ė°¸ėĄ°ę°€ í•„ėš”í•Šë‹ˆë‹¤. ë¨ŧė € ė‚ŦėšŠ 가ëŠĨ한 í•˜ë“œė›¨ė–´ ė„ŧė„œė—ė„œ ėŊėœŧë ¤ęŗ  ė‹œë„í•Šë‹ˆë‹¤. ė‹œėŠ¤í…œ ė„ŧė„œė— ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ę˛Ŋ뚰, ė‹¤í–‰ ė‹œėž‘ ė‹œ ė¸Ąė •ëœ 가ėžĨ ë‚Žė€ ë””ėŠ¤íŦ ė˜¨ë„ëĨŧ ëŒ€ė˛´ ė°¸ėĄ°ëĄœ ė‚ŦėšŠí•Šë‹ˆë‹¤. .PP ėŧë°˜ė ėœŧ로 SnapRAID는 가ėžĨ ëœ¨ęą°ėš´ ë””ėŠ¤íŦė˜ ė˜¨ë„ë§Œ í‘œė‹œí•Šë‹ˆë‹¤. ëĒ¨ë“  ë””ėŠ¤íŦė˜ ė˜¨ë„ëĨŧ í‘œė‹œí•˜ë ¤ëŠ´ \-A 또는 \-\-stats ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. .SS temp_sleep TIME_IN_MINUTES ė˜¨ë„ ė œí•œė— 도ë‹Ŧí–ˆė„ ë•Œė˜ 대기 ė‹œę°„(ëļ„)ė„ ė„¤ė •í•Šë‹ˆë‹¤. ė´ 기간 ë™ė•ˆ ë””ėŠ¤íŦ는 íšŒė „ 뤑맀 ėƒíƒœëĨŧ ėœ ė§€í•Šë‹ˆë‹¤. ę¸°ëŗ¸ę°’ė€ 5ëļ„ėž…ë‹ˆë‹¤. .SS pool DIR \`pool\` ëĒ…ë šė„ ė‚ŦėšŠí•˜ė—Ŧ ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ę°€ėƒ 뷰가 ėƒė„ąë˜ëŠ” 풀링 디렉토ëĻŦëĨŧ ė •ė˜í•Šë‹ˆë‹¤. .PP 디렉토ëĻŦ는 ė´ë¯¸ ėĄ´ėžŦ해ė•ŧ 합니다. .SS share UNC_DIR ë””ėŠ¤íŦ뗐 ė›ę˛Šėœŧ로 ė•Ąė„¸ėŠ¤í•˜ëŠ” 데 í•„ėš”í•œ Windows UNC ę˛Ŋ로ëĨŧ ė •ė˜í•Šë‹ˆë‹¤. .PP ė´ ė˜ĩė…˜ė´ ė§€ė •ë˜ëŠ´ 풀 디렉토ëĻŦ뗐 ėƒė„ąëœ ė‹ŦëŗŧëĻ­ 링íŦ는 ė´ UNC ę˛Ŋ로ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ë””ėŠ¤íŦ뗐 ė•Ąė„¸ėŠ¤í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė—†ėœŧ늴 ėƒė„ąëœ ė‹ŦëŗŧëĻ­ 링íŦ는 로ėģŦ ę˛Ŋ로만 ė‚ŦėšŠí•˜ëŠ°, ė´ëŠ” ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 풀 디렉토ëĻŦëĨŧ ęŗĩėœ í•˜ëŠ” ę˛ƒė„ í—ˆėšŠí•˜ė§€ ė•ŠėŠĩ니다. .PP ė‹ŦëŗŧëĻ­ 링íŦ는 ė§€ė •ëœ UNC ę˛Ŋ로ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ í˜•ė„ąë˜ëŠ°, \`data\` ė˜ĩė…˜ė— ė§€ė •ëœ ë””ėŠ¤íŦ ė´ëĻ„ė´ ėļ”ę°€ë˜ęŗ , ë§ˆė§€ë§‰ėœŧ로 파ėŧ 디렉토ëĻŦ뙀 ė´ëĻ„ė´ ėļ”ę°€ëŠë‹ˆë‹¤. .PP ė´ ė˜ĩė…˜ė€ Windowsė—ë§Œ í•„ėš”í•Šë‹ˆë‹¤. .SS smartctl DISK/PARITY OPTIONS... 각 ë””ėŠ¤íŦ뗐 대한 SMART ė†ė„ąė„ ė–ģ기 ėœ„í•œ ė‚ŦėšŠėž ė •ė˜ smartctl ė˜ĩė…˜ė„ ė •ė˜í•Šë‹ˆë‹¤. ė´ëŠ” RAID ėģ¨íŠ¸ëĄ¤ëŸŦ 및 ėŧëļ€ ėžë™ ę°ė§€í•  눘 ė—†ëŠ” USB ë””ėŠ¤íŦ뗐 í•„ėš”í•  눘 ėžˆėŠĩ니다. %s ėžëĻŦ í‘œė‹œėžëŠ” ėžĨėš˜ ė´ëĻ„ėœŧ로 ëŒ€ė˛´ë˜ė§€ë§Œ, RAID ėģ¨íŠ¸ëĄ¤ëŸŦ뙀 ę°™ė€ ęŗ ė •ëœ ėžĨėš˜ė—ė„œëŠ” ė„ íƒ ė‚Ŧí•­ėž…ë‹ˆë‹¤. .PP DISK는 \`data\` ė˜ĩė…˜ė— ė§€ė •ëœ 것ęŗŧ 동ėŧ한 ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. PARITY는 \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\`, 또는 \`z\-parity\` 뤑 í•˜ë‚˜ė˜ 패ëĻŦ티 ė´ëĻ„ėž…ë‹ˆë‹¤. .PP ė§€ė •ëœ OPTIONSė—ė„œ \`%s\` ëŦ¸ėžė—´ė€ ėžĨėš˜ ė´ëĻ„ėœŧ로 ëŒ€ė˛´ëŠë‹ˆë‹¤. RAID ėģ¨íŠ¸ëĄ¤ëŸŦė˜ ę˛Ŋ뚰 ėžĨėš˜ę°€ ęŗ ė •ë˜ė–´ ėžˆė„ 가ëŠĨė„ąė´ 높ėœŧë¯€ëĄœ \`%s\`ëĨŧ ė‚ŦėšŠí•  í•„ėš”ę°€ ė—†ė„ 눘 ėžˆėŠĩ니다. .PP 가ëŠĨ한 ė˜ĩė…˜ė€ smartmontools 네ëĒ…ė„œëĨŧ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP 똈: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] ë””ėŠ¤íŦ ė‹¤íŒ¨ 확ëĨ ė„ ęŗ„ė‚°í•  때 ė§€ė •ëœ SMART ė†ė„ąė„ ëŦ´ė‹œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ë””ėŠ¤íŦ가 íŠšė • ė†ė„ąė— 대해 íŠšė´í•˜ęą°ë‚˜ ė˜¤í•´ė˜ ė†Œė§€ę°€ ėžˆëŠ” ę°’ė„ ëŗ´ęŗ í•˜ëŠ” ę˛Ŋėš°ė— ėœ ėšŠí•Šë‹ˆë‹¤. .PP DISK는 \`data\` ė˜ĩė…˜ė— ė§€ė •ëœ 것ęŗŧ 동ėŧ한 ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. PARITY는 \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\`, 또는 \`z\-parity\` 뤑 í•˜ë‚˜ė˜ 패ëĻŦ티 ė´ëĻ„ėž…ë‹ˆë‹¤. íŠšėˆ˜ 값 *는 ëĒ¨ë“  ë””ėŠ¤íŦė—ė„œ ė†ė„ąė„ ëŦ´ė‹œí•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. .PP 똈ëĨŧ ë“¤ė–´, ëĒ¨ë“  ë””ėŠ¤íŦė—ė„œ \`Current Pending Sector Count\` ė†ė„ąė„ ëŦ´ė‹œí•˜ë ¤ëŠ´: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP ė˛Ģ ë˛ˆė§¸ 패ëĻŦ티 ë””ėŠ¤íŦė—ė„œë§Œ ëŦ´ė‹œí•˜ë ¤ëŠ´: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples Unixė˜ ėŧë°˜ė ė¸ 네렕 ė˜ˆëŠ” ë‹¤ėŒęŗŧ 같ėŠĩ니다: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Windowsė˜ ėŧë°˜ė ė¸ 네렕 ė˜ˆëŠ” ë‹¤ėŒęŗŧ 같ėŠĩ니다: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN íŒ¨í„´ė€ íŦ함하거나 ė œė™¸í•  파ėŧė„ 필터링하는 ėœ ė—°í•œ ë°Šë˛•ė„ 렜ęŗĩ합니다. 글로빙(globbing) ëŦ¸ėžëĨŧ ė‚ŦėšŠí•˜ëŠ´ ëĒ¨ë“  ę˛Ŋ로ëĨŧ ėŧėŧė´ ë‚˜ė—´í•˜ė§€ ė•Šęŗ ë„ íŠšė • 파ėŧ ė´ëĻ„ė´ë‚˜ 렄랴 디렉토ëĻŦ ęĩŦėĄ°ė™€ ėŧėš˜í•˜ëŠ” ęˇœėš™ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. .PP ëŦŧėŒí‘œ \`?\`는 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ ė œė™¸í•œ ëĒ¨ë“  단ėŧ ëŦ¸ėžė™€ ėŧėš˜í•Šë‹ˆë‹¤. ė´ëŠ” íŒ¨í„´ė„ 단ėŧ 디렉토ëĻŦ ėˆ˜ė¤€ėœŧ로 ė œí•œí•˜ëŠ´ė„œ ę°€ëŗ€ ëŦ¸ėžę°€ íŦ함된 파ėŧ ė´ëĻ„ė„ ėŧėš˜ė‹œí‚¤ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. .PP 단ėŧ ëŗ„í‘œ \`*\`는 ëĒ¨ë“  ëŦ¸ėž ė‹œí€€ėŠ¤ė™€ ėŧėš˜í•˜ė§€ë§Œ, ëŦŧėŒí‘œė™€ 마ė°Ŧę°€ė§€ëĄœ 디렉토ëĻŦ ę˛Ŋęŗ„ëĨŧ ë„˜ė§€ ė•ŠėŠĩ니다. ėŠŦëž˜ė‹œė—ė„œ 늈ėļ”ë¯€ëĄœ 단ėŧ ę˛Ŋ로 ęĩŦė„ą ėš”ė†Œ ë‚´ė—ė„œė˜ ėŧėš˜ė— ė í•Ší•Šë‹ˆë‹¤. ė´ëŠ” ė‰˜ ę¸€ëĄœëš™ė—ė„œ ėĩėˆ™í•œ í‘œė¤€ 뙀ėŧë“œėš´ë“œ ë™ėž‘ėž…ë‹ˆë‹¤. .PP ė´ė¤‘ ëŗ„í‘œ \`**\`는 더 강ë Ĩ하며 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ íŦ함한 ëĒ¨ë“  ëŦ¸ėž ė‹œí€€ėŠ¤ė™€ ėŧėš˜í•Šë‹ˆë‹¤. ė´ëĨŧ í†ĩ해 íŒ¨í„´ė´ ė—ŦëŸŦ 디렉토ëĻŦ ėˆ˜ė¤€ė—ė„œ ėŧėš˜í•  눘 ėžˆėŠĩ니다. \`**\`가 패턴 ë‚´ė— 링렑 íŦ함된 ę˛Ŋ뚰, ėŖŧëŗ€ ëĻŦ터럴 í…ėŠ¤íŠ¸ ė‚Ŧė´ė˜ ėŠŦëž˜ė‹œëĨŧ íŦ함하ė—Ŧ 0氜 ė´ėƒė˜ ëŦ¸ėžė™€ ėŧėš˜í•  눘 ėžˆėŠĩ니다. .PP \`**\`ė˜ 가ėžĨ ė¤‘ėš”í•œ ėšŠë„ëŠ” íŠšėˆ˜ í˜•ė‹ė¸ \`/**/\`ėž…ë‹ˆë‹¤. ė´ëŠ” 0氜 ė´ėƒė˜ 렄랴 디렉토ëĻŦ ėˆ˜ė¤€ęŗŧ ėŧėš˜í•˜ë¯€ëĄœ ė •í™•í•œ ę˛Ŋ로 ęĩŦėĄ°ëĨŧ ëǍëĨ´ë”ëŧ도 디렉토ëĻŦ 트ëĻŦė˜ ëĒ¨ë“  ęšŠė´ė—ė„œ 파ėŧęŗŧ ėŧėš˜ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, \`src/**/main.js\` íŒ¨í„´ė€ \`src/main.js\`(0ę°œė˜ 디렉토ëĻŦ 건너뜀), \`src/ui/main.js\`(1ę°œė˜ 디렉토ëĻŦ 건너뜀), \`src/ui/components/main.js\` (2ę°œė˜ 디렉토ëĻŦ 건너뜀)뙀 ėŧėš˜í•Šë‹ˆë‹¤. .PP 대괄호 \`[]\`ëĨŧ ė‚ŦėšŠí•˜ëŠ” ëŦ¸ėž í´ëž˜ėŠ¤ëŠ” ė§€ė •ëœ ė„¸íŠ¸ 또는 ë˛”ėœ„ė—ė„œ 단ėŧ ëŦ¸ėžė™€ ėŧėš˜í•Šë‹ˆë‹¤. 다ëĨ¸ 단ėŧ ëŦ¸ėž 패턴ęŗŧ 마ė°Ŧę°€ė§€ëĄœ 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ė™€ëŠ” ėŧėš˜í•˜ė§€ ė•ŠėŠĩ니다. í´ëž˜ėŠ¤ëŠ” ë˛”ėœ„ 및 느낌표ëĨŧ ė‚ŦėšŠí•œ ëļ€ė •ė„ ė§€ė›í•Šë‹ˆë‹¤. .PP 기ė–ĩ해ė•ŧ 할 ęˇŧëŗ¸ė ė¸ ė°¨ė´ė ė€ \`*\`, \`?\` 및 ëŦ¸ėž í´ëž˜ėŠ¤ëŠ” ëĒ¨ë‘ 디렉토ëĻŦ ę˛Ŋęŗ„ëĨŧ ė¤€ėˆ˜í•˜ęŗ  단ėŧ ę˛Ŋ로 ęĩŦė„ą ėš”ė†Œ ë‚´ė—ė„œë§Œ ėŧėš˜í•˜ëŠ” 반늴, \`**\`는 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ ę°€ëĄœė§ˆëŸŦ ėŧėš˜í•  눘 ėžˆëŠ” 뜠ėŧ한 íŒ¨í„´ė´ëŧ는 ę˛ƒėž…ë‹ˆë‹¤. .PP 네 氀맀 ėœ í˜•ė˜ íŒ¨í„´ė´ ėžˆėŠĩ니다: .TP .B FILE FILEė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 디렉토ëĻŦ가 ė•„ë‹Œ 파ėŧė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. .TP .B DIR/ DIRė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  ę˛ƒė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 파ėŧė´ ė•„ë‹Œ 디렉토ëĻŦė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. .TP .B /PATH/FILE ė§€ė •ëœ ė •í™•í•œ 파ėŧ ę˛Ŋ로ëĨŧ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 디렉토ëĻŦ가 ė•„ë‹Œ 파ėŧė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. .TP .B /PATH/DIR/ ė§€ė •ëœ ė •í™•í•œ 디렉토ëĻŦ ę˛ŊëĄœė™€ ꡸ ė•ˆė˜ ëĒ¨ë“  ę˛ƒė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 파ėŧė´ ė•„ë‹Œ 디렉토ëĻŦė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. .TP .B /로 ė‹œėž‘í•˜ëŠ” ė ˆëŒ€ ę˛Ŋ로ëĨŧ ė§€ė •í•˜ëŠ´ 로ėģŦ 파ėŧ ė‹œėŠ¤í…œė˜ ëŖ¨íŠ¸ 디렉토ëĻŦ가 ė•„ë‹Œ ė–´ë ˆė´ ëŖ¨íŠ¸ 디렉토ëĻŦ뗐 ė ėšŠëŠë‹ˆë‹¤. .PP Windowsė—ė„œëŠ” ė •ë°Ší–Ĩ ėŠŦëž˜ė‹œ / ëŒ€ė‹  ė—­ėŠŦëž˜ė‹œ \\ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. Windows ė‹œėŠ¤í…œ 디렉토ëĻŦ, ė ‘í•Šė (junctions), ë§ˆėš´íŠ¸ 맀렐 및 기타 Windows íŠšėˆ˜ 디렉토ëĻŦ는 파ėŧ로 ėˇ¨ę¸‰ëŠë‹ˆë‹¤. ėω, ė´ë“¤ė„ ė œė™¸í•˜ë ¤ëŠ´ 디렉토ëĻŦ ęˇœėš™ė´ ė•„ë‹Œ 파ėŧ ęˇœėš™ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. .PP 파ėŧ ė´ëτ뗐 \`*\`, \`?\`, \`[\`, 또는 \`]\` ëŦ¸ėžę°€ íŦ함된 ę˛Ŋ뚰, 글로빙 ëŦ¸ėžëĄœ í•´ė„ë˜ëŠ” ę˛ƒė„ í”ŧ하기 ėœ„í•´ ė´ėŠ¤ėŧ€ė´í”„í•´ė•ŧ 합니다. Unixė—ė„œëŠ” ė´ėŠ¤ėŧ€ė´í”„ ëŦ¸ėžę°€ \`\\\`ė´ęŗ , Windowsė—ė„œëŠ” \`^\`ėž…ë‹ˆë‹¤. íŒ¨í„´ė´ ëĒ…ë šė¤„ė— ėžˆëŠ” ę˛Ŋ뚰, ëĒ…ë š 녏뗐 ė˜í•´ í•´ė„ë˜ëŠ” ę˛ƒė„ í”ŧ하기 ėœ„í•´ ė´ėŠ¤ėŧ€ė´í”„ ëŦ¸ėžëĨŧ 두 배로 늘려ė•ŧ 합니다. .PP 네렕 파ėŧė—ė„œëŠ” 래ëĻŦ할 파ėŧė„ 필터링하기 ėœ„í•´ 다ëĨ¸ ė „ëžĩė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 가ėžĨ 간단한 ė ‘ęˇŧ ë°Šė‹ė€ ė›í•˜ė§€ ė•ŠëŠ” ëĒ¨ë“  파ėŧęŗŧ 디렉토ëĻŦëĨŧ ė œęą°í•˜ę¸° ėœ„í•´ \`exclude\` ęˇœėš™ë§Œ ė‚ŦėšŠí•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´: .PP .RS 4 # \`*.unrecoverable\`ė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧ ė œė™¸ .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # ëŖ¨íŠ¸ 디렉토ëĻŦ \`/lost+found\` ė œė™¸ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # \`tmp\`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  í•˜ėœ„ 디렉토ëĻŦ ė œė™¸ .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP 반대 ė ‘ęˇŧ ë°Šė‹ė€ \`include\` ęˇœėš™ë§Œ ė‚ŦėšŠí•˜ė—Ŧ 래ëĻŦ하려는 파ėŧ만 ė •ė˜í•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´: .PP .RS 4 # ėŧëļ€ ë””ë ‰í† ëĻŦ만 íŦ함 .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP ėĩœėĸ… ė ‘ęˇŧ ë°Šė‹ė€ \`exclude\` 및 \`include\` ęˇœėš™ė„ í˜ŧ합하는 ę˛ƒėž…ë‹ˆë‹¤. ė´ ę˛Ŋ뚰 ęˇœėš™ė˜ ėˆœė„œę°€ ė¤‘ėš”í•Šë‹ˆë‹¤. ė•žė„  ęˇœėš™ė´ ë’¤ė˜ ęˇœėš™ëŗ´ë‹¤ ėš°ė„ í•Šë‹ˆë‹¤. ë‹¨ėˆœí™”ëĨŧ ėœ„í•´ ëĒ¨ë“  \`exclude\` ęˇœėš™ė„ ë¨ŧė € ë‚˜ė—´í•œ ë‹¤ėŒ ëĒ¨ë“  \`include\` ęˇœėš™ė„ ë‚˜ė—´í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´: .PP .RS 4 # \`*.unrecoverable\`ė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧ ė œė™¸ .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # \`tmp\`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  í•˜ėœ„ 디렉토ëĻŦ ė œė™¸ .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # ėŧëļ€ ë””ë ‰í† ëĻŦ만 íŦ함 .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP ëĒ…ë šė¤„ė—ė„œ \-f ė˜ĩė…˜ė„ ė‚ŦėšŠí•  때 \`include\` 패턴만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´: .PP .RS 4 # .mp3 파ėŧ만 í™•ė¸. .PD 0 .PP .PD # Unixė—ė„œëŠ” 녏뗐 ė˜í•œ 글로빙 확ėžĨė„ í”ŧ하기 ėœ„í•´ ë”°ė˜´í‘œëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP Unixė—ė„œëŠ” ëĒ…ë šė¤„ė—ė„œ 글로빙 ëŦ¸ėžëĨŧ ė‚ŦėšŠí•  때 ė…¸ė´ 확ėžĨ하는 ę˛ƒė„ ë°Šė§€í•˜ę¸° ėœ„í•´ ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다. .SH IGNORE FILE 네렕 파ėŧė˜ ė „ė—­ ęˇœėš™ ė™¸ė—ë„, ë°°ė—´ ë‚´ė˜ ëĒ¨ë“  디렉토ëĻŦ뗐 \`.snapraidignore\` 파ėŧė„ ë°°ėš˜í•˜ė—Ŧ ëļ„ė‚°ëœ ė œė™¸ ęˇœėš™ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. .PP \`.snapraidignore\`뗐 ė •ė˜ëœ ęˇœėš™ė€ 네렕 파ėŧė˜ ęˇœėš™ ë‹¤ėŒė— ė ėšŠëŠë‹ˆë‹¤. ė´ëŠ” 해당 ęˇœėš™ë“¤ė´ 더 ë†’ė€ ėš°ė„ ėˆœėœ„ëĨŧ ę°€ė§€ëŠ°, ė „ė—­ 네렕뗐 ė˜í•´ ė´ė „ė— íŦí•¨ë˜ė—ˆë˜ 파ėŧë“¤ė„ ė œė™¸í•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. ė‚Ŧė‹¤ėƒ 로ėģŦ ęˇœėš™ė´ ėŧėš˜í•˜ëŠ´, ė „ė—­ íŦ함 네렕ęŗŧ ę´€ęŗ„ė—†ė´ 해당 파ėŧė€ ė œė™¸ëŠë‹ˆë‹¤. .PP \`.snapraidignore\`ė˜ 패턴 ëĄœė§ė€ ė „ė—­ ė„¤ė •ė„ 따ëĨ´ė§€ë§Œ, íŒ¨í„´ė€ 해당 파ėŧė´ ėœ„ėš˜í•œ 디렉토ëĻŦëĨŧ 揰뤀ėœŧ로 ęŗ ė •ëŠë‹ˆë‹¤: .TP .B FILE ė´ 디렉토ëĻŦ 또는 ꡸ í•˜ėœ„ė—ė„œ FILEė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ëŠ” ė „ė—­ 패턴ęŗŧ 동ėŧ한 글로빙(globbing) ęˇœėš™ė„ 따ëĻ…ë‹ˆë‹¤. .TP .B DIR/ ė´ 디렉토ëĻŦ 또는 ꡸ í•˜ėœ„ė—ė„œ DIRė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  항ëĒŠė„ ė„ íƒí•Šë‹ˆë‹¤. .TP .B /PATH/FILE \`.snapraidignore\` 파ėŧė˜ ėœ„ėš˜ëĨŧ 揰뤀ėœŧ로 ė§€ė •ëœ ė •í™•í•œ 파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. .TP .B /PATH/DIR/ \`.snapraidignore\` 파ėŧė˜ ėœ„ėš˜ëĨŧ 揰뤀ėœŧ로 ė§€ė •ëœ ė •í™•í•œ 디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  항ëĒŠė„ ė„ íƒí•Šë‹ˆë‹¤. .PP ė „ė—­ 네렕ęŗŧ ë‹ŦëĻŦ, \`.snapraidignore\` 파ėŧė€ ė œė™¸ ęˇœėš™ë§Œ ė§€ė›í•Šë‹ˆë‹¤. \`include\` íŒ¨í„´ė´ë‚˜ ëļ€ė •(!)ė€ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. .PP 똈ëĨŧ ë“¤ė–´, \`/mnt/disk1/projects/\`뗐 \`.snapraidignore\`가 ėžˆëŠ” ę˛Ŋ뚰: .PP .RS 4 # /mnt/disk1/projects/output.bin만 ė œė™¸ .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # projects/ 내ëļ€ė˜ \`build\`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ ė œė™¸ .PD 0 .PP .PD build/ .PD 0 .PP .PD # projects/ 또는 ꡸ í•˜ėœ„ í´ë”ė˜ ëĒ¨ë“  .tmp 파ėŧ ė œė™¸ .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID는 content 파ėŧ뗐 파ėŧ ëĒŠëĄęŗŧ 랴íŦė„Ŧė„ ė €ėžĨ합니다. .PP ė´ę˛ƒė€ ë””ėŠ¤íŦ ė–´ë ˆė´ė— ėžˆëŠ” ëĒ¨ë“  파ėŧė˜ ëĒŠëĄęŗŧ ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•œ ëĒ¨ë“  랴íŦė„Ŧė„ ë‚˜ė—´í•˜ëŠ” ė´ė§„ 파ėŧėž…ë‹ˆë‹¤. .PP ė´ 파ėŧė€ \`sync\` 및 \`scrub\` ëĒ…ë šė— ė˜í•´ ėŊęŗ  ė“°ė—Ŧė§€ëŠ°, \`fix\`, \`check\`, 및 \`status\` ëĒ…ë šė— ė˜í•´ ėŊí˜€ė§‘ë‹ˆë‹¤. .SH PARITY SnapRAID는 패ëĻŦ티 파ėŧ뗐 ė–´ë ˆė´ė˜ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ합니다. .PP ė´ë“¤ė€ \`content\` 파ėŧ뗐 ė •ė˜ëœ ëĒ¨ë“  ë¸”ëĄė˜ ęŗ„ė‚°ëœ 패ëĻŦ티ëĨŧ íŦ함하는 ė´ė§„ 파ėŧėž…ë‹ˆë‹¤. .PP ė´ 파ėŧë“¤ė€ \`sync\` 및 \`fix\` ëĒ…ë šė— ė˜í•´ ėŊęŗ  ė“°ė—Ŧė§€ëŠ°, \`scrub\` 및 \`check\` ëĒ…ë šė— ė˜í•´ė„œë§Œ ėŊí˜€ė§‘ë‹ˆë‹¤. .SH ENCODING Unixė˜ SnapRAID는 ė¸ėŊ”ë”Šė„ ëŦ´ė‹œí•Šë‹ˆë‹¤. 파ėŧ ė‹œėŠ¤í…œė—ė„œ ė‚ŦėšŠë˜ëŠ” 것ęŗŧ 동ėŧ한 ė¸ėŊ”딊ėœŧ로 파ėŧ ė´ëĻ„ė„ ėŊęŗ  ė €ėžĨ합니다. .PP Windowsė—ė„œëŠ” 파ėŧ ė‹œėŠ¤í…œė—ė„œ ėŊė€ ëĒ¨ë“  ė´ëĻ„ė´ UTF\-8 í˜•ė‹ėœŧ로 ëŗ€í™˜ë˜ęŗ  래ëĻŦ됩니다. .PP 파ėŧ ė´ëĻ„ė´ ė˜Ŧ바ëĨ´ę˛Œ ėļœë Ĩ되도록 하려면, \`chcp 65001\` ëĒ…ë šėœŧ로 Windows ėŊ˜ė†”ė„ UTF\-8 ëĒ¨ë“œëĄœ ė„¤ė •í•˜ęŗ  ėŊ˜ė†” 글ęŧ´ëĄœ \`Lucida Console\`ęŗŧ ę°™ė€ TrueType 글ęŧ´ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. ė´ëŠ” ėļœë Ĩ되는 파ėŧ ė´ëĻ„ė—ë§Œ 똁í–Ĩė„ ë¯¸ėš˜ëŠ°, ėŊ˜ė†” ėļœë Ĩė„ 파ėŧ로 ëĻŦë””ë ‰ė…˜í•˜ëŠ” ę˛Ŋ뚰 결ęŗŧ 파ėŧė€ í•­ėƒ UTF\-8 í˜•ė‹ėž…ë‹ˆë‹¤. .SH COPYRIGHT This file is Copyright (C) 2025 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ko.d000066400000000000000000002154211522717156100164060ustar00rootroot00000000000000Name{number} snapraid - ë””ėŠ¤íŦ ė–´ë ˆė´ëĨŧ ėœ„í•œ SnapRAID ë°ąė—… Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAID는 ë””ėŠ¤íŦ ė–´ë ˆė´ëĨŧ ėœ„í•´ ė„¤ęŗ„ëœ ë°ąė—… 프로그램ėœŧ로, ėĩœëŒ€ 6ę°œė˜ ë””ėŠ¤íŦ 똤ëĨ˜ę°€ ë°œėƒí•´ë„ ë°ė´í„°ëĨŧ ëŗĩęĩŦ하기 ėœ„í•œ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ합니다. ėŖŧ로 íŦęŗ  ėžėŖŧ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” 파ėŧė„ 氀맄 홈 ë¯¸ë””ė–´ ė„ŧ터ëĨŧ ėœ„í•´ ęŗ ė•ˆëœ SnapRAID는 ë‹¤ėŒęŗŧ ę°™ė€ ëLJ 氀맀 기ëŠĨė„ 렜ęŗĩ합니다: * 파ėŧė„ ë‹¤ė‹œ íŦ맷할 í•„ėš” ė—†ė´ ė´ë¯¸ 파ėŧ로 ėą„ė›Œė§„ ë””ėŠ¤íŦëĨŧ í™œėšŠí•  눘 ėžˆėœŧ늰, í‰ė†Œė˛˜ëŸŧ ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. * ë°ė´í„° ëŦ´ę˛°ė„ąė„ ëŗ´ėžĨí•˜ęŗ  ëŦ´ë‹¨ ė†ėƒė„ ë°Šė§€í•˜ę¸° ėœ„í•´ ëĒ¨ë“  ë°ė´í„°ę°€ í•´ė‹œëŠë‹ˆë‹¤. * ė‹¤íŒ¨í•œ ë””ėŠ¤íŦė˜ ėˆ˜ę°€ 패ëĻŦ티 눘ëĨŧ 봈ęŗŧ하는 ę˛Ŋ뚰, ë°ė´í„° ė†ė‹¤ė€ 똁í–Ĩė„ ë°›ė€ ë””ėŠ¤íŦ로 ė œí•œë˜ëŠ°, 다ëĨ¸ ë””ėŠ¤íŦė˜ ë°ė´í„°ëŠ” ęŗ„ė† ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. * ė‹¤ėˆ˜ëĄœ ë””ėŠ¤íŦė˜ 파ėŧė„ ė‚­ė œí•œ ę˛Ŋėš°ė—ë„ ëŗĩęĩŦ가 가ëŠĨ합니다. * ë””ėŠ¤íŦ는 ė„œëĄœ 다ëĨ¸ íŦ기ëĨŧ ę°€ė§ˆ 눘 ėžˆėŠĩ니다. * ė–¸ė œë“ ė§€ ë””ėŠ¤íŦëĨŧ ėļ”가할 눘 ėžˆėŠĩ니다. * SnapRAID는 ë°ė´í„°ëĨŧ ę°€ë‘ė§€ ė•ŠėŠĩ니다. ė–¸ė œë“ ė§€ íŦ맷하거나 ë°ė´í„°ëĨŧ ė´ë™í•  í•„ėš” ė—†ė´ ė‚ŦėšŠė„ ė¤‘ë‹¨í•  눘 ėžˆėŠĩ니다. * 파ėŧ뗐 ė•Ąė„¸ėŠ¤í•˜ë ¤ëŠ´ 단ėŧ ë””ėŠ¤íŦ만 íšŒė „í•˜ëŠ´ ë˜ë¯€ëĄœ, ė „ë Ĩė„ 레ė•Ŋí•˜ęŗ  ė†ŒėŒė„ 뤄ėŧ 눘 ėžˆėŠĩ니다. 더 ėžė„¸í•œ ė •ëŗ´ëŠ” ęŗĩė‹ SnapRAID ė‚Ŧė´íŠ¸ëĨŧ ë°ŠëŦ¸í•˜ė‹­ė‹œė˜¤: :https://www.snapraid.it/ Limitations SnapRAID는 RAID뙀 ë°ąė—… í”„ëĄœęˇ¸ëž¨ė˜ í•˜ė´ë¸ŒëĻŦ드로, 두 ę°€ė§€ė˜ ėžĨė ė„ 결합하는 ę˛ƒė„ ëĒŠí‘œëĄœ 합니다. í•˜ė§€ë§Œ, ė‚ŦėšŠ 렄뗐 ęŗ ë ¤í•´ė•ŧ 할 ëLJ 氀맀 ė œí•œ ė‚Ŧí•­ė´ ėžˆėŠĩ니다. ėŖŧėš” ė œí•œ ė‚Ŧí•­ė€ ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•˜ęŗ  ėĩœęˇŧ뗐 동기화(sync)í•˜ė§€ ė•Šė€ ę˛Ŋ뚰, ė™„ė „ížˆ ëŗĩęĩŦí•˜ė§€ ëĒģ할 눘 ėžˆë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 더 ęĩŦ랴렁ėœŧ로, ë§ˆė§€ë§‰ 동기화 ėž‘ė—… ė´í›„ ëŗ€ę˛Ŋ되거나 ė‚­ė œëœ 파ėŧė˜ íŦ기만íŧ ëŗĩęĩŦ가 ëļˆę°€ëŠĨ할 눘 ėžˆėŠĩ니다. ė´ëŠ” ëŗ€ę˛Ŋ되거나 ė‚­ė œëœ 파ėŧė´ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ뗐 ėžˆė§€ ė•Šë”ëŧ도 ë°œėƒí•Šë‹ˆë‹¤. ė´ę˛ƒė´ SnapRAID가 **ęą°ė˜ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” ë°ė´í„°**뗐 더 ė í•Ší•œ ė´ėœ ėž…ë‹ˆë‹¤. ë°˜ëŠ´ė—, ėƒˆëĄœ ėļ”ę°€ëœ 파ėŧė€ ė´ë¯¸ ėĄ´ėžŦ하는 파ėŧė˜ ëŗĩęĩŦëĨŧ ë°Ší•´í•˜ė§€ ė•ŠėŠĩ니다. ėƒˆëĄœ ėļ”ę°€ëœ 파ėŧė´ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ뗐 ėžˆëŠ” ę˛Ŋėš°ė—ë§Œ 해당 파ėŧė„ ėžƒę˛Œ 됩니다. 기타 SnapRAID ė œí•œ ė‚Ŧí•­ė€ ë‹¤ėŒęŗŧ 같ėŠĩ니다: * SnapRAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ė—Ŧė „ížˆ 각 ë””ėŠ¤íŦ뗐 대해 ëŗ„ë„ė˜ 파ėŧ ė‹œėŠ¤í…œė´ ėžˆėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ í•˜ë‚˜ė˜ 큰 파ėŧ ė‹œėŠ¤í…œė„ ė–ģėŠĩ니다. * SnapRAID는 ë°ė´í„°ëĨŧ ėŠ¤íŠ¸ëŧė´í•‘í•˜ė§€ ė•ŠėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ėŠ¤íŠ¸ëŧė´í•‘ėœŧ로 ė†ë„ í–Ĩėƒė„ ė–ģėŠĩ니다. * SnapRAID는 ė‹¤ė‹œę°„ ëŗĩęĩŦëĨŧ ė§€ė›í•˜ė§€ ė•ŠėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ë””ėŠ¤íŦ가 ė‹¤íŒ¨í–ˆė„ 때 ėž‘ė—…ė„ 늈ėļœ í•„ėš”ę°€ ė—†ėŠĩ니다. * SnapRAID는 ė œí•œëœ ėˆ˜ė˜ ë””ėŠ¤íŦ 똤ëĨ˜ė—ė„œë§Œ ë°ė´í„°ëĨŧ ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. ë°ąė—…ė„ ė‚ŦėšŠí•˜ëŠ´ 렄랴 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ė™„ė „í•œ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. * 파ėŧ ė´ëĻ„, íƒ€ėž„ėŠ¤íƒŦ프, ė‹ŦëŗŧëĻ­ 링íŦ, 하드 링íŦ만 ė €ėžĨ됩니다. ęļŒí•œ, ė†Œėœ ęļŒ, 확ėžĨ ė†ė„ąė€ ė €ėžĨë˜ė§€ ė•ŠėŠĩ니다. Getting Started SnapRAIDëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´, ë¨ŧė € ë””ėŠ¤íŦ ė–´ë ˆė´ė—ė„œ í•˜ë‚˜ė˜ ë””ėŠ¤íŦëĨŧ `parity`(패ëĻŦ티) ė •ëŗ´ ė „ėšŠėœŧ로 ė„ íƒí•´ė•ŧ 합니다. í•˜ë‚˜ė˜ 패ëĻŦ티 ë””ėŠ¤íŦ로 RAID5뙀 뜠ė‚Ŧ하게 단ėŧ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. RAID6뙀 뜠ė‚Ŧ하게 더 ë§Žė€ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ하려면, ėļ”ę°€ ë””ėŠ¤íŦëĨŧ 패ëĻŦí‹°ėšŠėœŧ로 똈ė•Ŋ해ė•ŧ 합니다. ėļ”ę°€ 패ëĻŦ티 ë””ėŠ¤íŦ 하나당 í•˜ë‚˜ė˜ ë””ėŠ¤íŦ 똤ëĨ˜ė— 대한 ëŗĩęĩŦëĨŧ 더 í—ˆėšŠí•Šë‹ˆë‹¤. 패ëĻŦ티 ë””ėŠ¤íŦ로는 ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 ë””ėŠ¤íŦëĨŧ ė„ íƒí•´ė•ŧ 합니다. 패ëĻŦ티 ė •ëŗ´ę°€ ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 **ë°ė´í„° ë””ėŠ¤íŦ**ė˜ íŦ기만íŧ ėģ¤ė§ˆ 눘 ėžˆę¸° 때ëŦ¸ėž…니다. ė´ ë””ėŠ¤íŦë“¤ė€ `parity` 파ėŧė„ ė €ėžĨ하는 데 ė „ë…í•˜ę˛Œ 됩니다. ė—Ŧ揰뗐 ë°ė´í„°ëĨŧ ė €ėžĨí•´ė„œëŠ” ė•ˆ 됩니다. ë‹¤ėŒėœŧ로, SnapRAID로 ëŗ´í˜¸í•˜ë ¤ëŠ” `data`(ë°ė´í„°) ë””ėŠ¤íŦëĨŧ ė •ė˜í•´ė•ŧ 합니다. ė´ ë””ėŠ¤íŦë“¤ė´ **ęą°ė˜ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” ë°ė´í„°**ëĨŧ íŦ함할 때 ëŗ´í˜¸ 효ęŗŧ가 더 ėĸ‹ėŠĩ니다. ė´ëŸŦ한 ė´ėœ ëĄœ, Windows C:\ ë””ėŠ¤íŦ나 Unixė˜ /home, /var, /tmp 디렉토ëĻŦëĨŧ íŦí•¨í•˜ė§€ ė•ŠëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. 파ėŧ ëĒŠëĄė€ `content` 파ėŧ뗐 ė €ėžĨ되늰, ëŗ´í†ĩ ë°ė´í„°, 패ëĻŦ티, 또는 ëļ€íЏ ë””ėŠ¤íŦ뗐 ė €ėžĨ됩니다. ė´ 파ėŧė—ëŠ” ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•œ ëĒ¨ë“  랴íŦė„Ŧė„ íŦ함하ė—Ŧ ë°ąė—…ė— 대한 넏ëļ€ ė •ëŗ´ę°€ ë“¤ė–´ ėžˆėŠĩ니다. `content` 파ėŧė€ ė—ŦëŸŦ ëŗĩė‚Ŧëŗ¸ėœŧ로 ė €ėžĨ되늰, ë‹¤ė¤‘ ë””ėŠ¤íŦ 똤ëĨ˜ė˜ ę˛Ŋėš°ė—ë„ ė ė–´ë„ í•˜ë‚˜ė˜ ëŗĩė‚Ŧëŗ¸ė„ ė‚ŦėšŠí•  눘 ėžˆë„ëĄ 각 ëŗĩė‚Ŧëŗ¸ė€ ė„œëĄœ 다ëĨ¸ ë””ėŠ¤íŦ뗐 ėžˆė–´ė•ŧ 합니다. 똈ëĨŧ ë“¤ė–´, í•˜ë‚˜ė˜ 패ëĻŦ티 ëŗ´í˜¸ ėˆ˜ė¤€ë§Œ ė›í•˜ęŗ  ë””ėŠ¤íŦ가 ë‹¤ėŒęŗŧ ę°™ė´ ėœ„ėš˜í•œë‹¤ęŗ  ę°€ė •í•´ ë´…ė‹œë‹¤: :/mnt/diskp <- 패ëĻŦí‹°ėšŠėœŧ로 ė„ íƒëœ ë””ėŠ¤íŦ :/mnt/disk1 <- ëŗ´í˜¸í•  ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ :/mnt/disk2 <- ëŗ´í˜¸í•  두 ë˛ˆė§¸ ë””ėŠ¤íŦ :/mnt/disk3 <- ëŗ´í˜¸í•  넏 ë˛ˆė§¸ ë””ėŠ¤íŦ ë‹¤ėŒ ė˜ĩė…˜ėœŧ로 네렕 파ėŧ /etc/snapraid.confëĨŧ ėƒė„ąí•´ė•ŧ 합니다: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ WindowsëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, ėŠŦëž˜ė‹œ ëŒ€ė‹  드ëŧė´ë¸Œ ëŦ¸ėž 및 ë°ąėŠŦëž˜ė‹œëĨŧ ė‚ŦėšŠí•˜ëŠ” Windows ę˛Ŋ로 í˜•ė‹ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ ë””ėŠ¤íŦ가 ë§Žė•„ 드ëŧė´ë¸Œ ëŦ¸ėžę°€ ëļ€ėĄąí•œ ę˛Ŋ뚰, ë””ėŠ¤íŦëĨŧ í•˜ėœ„ í´ë”ė— 링렑 ë§ˆėš´íŠ¸í•  눘 ėžˆėŠĩ니다. ë‹¤ėŒė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤: :https://www.google.com/search?q=Windows+mount+point ė´ ė‹œė ė—ė„œ, 패ëĻŦ티 ė •ëŗ´ëĨŧ 빌드하기 ėœ„í•´ `sync` ëĒ…ë šė„ ė‹¤í–‰í•  ė¤€ëš„ę°€ ë˜ė—ˆėŠĩ니다. :snapraid sync ė´ í”„ëĄœė„¸ėŠ¤ëŠ” ë””ėŠ¤íŦ뗐 ė´ë¯¸ ėĄ´ėžŦ하는 ë°ė´í„°ė˜ íŦ揰뗐 따ëŧ ė˛Ģ ė‹¤í–‰ ė‹œ ëLJ ė‹œę°„ė´ 깸ëĻ´ 눘 ėžˆėŠĩ니다. ë””ėŠ¤íŦ가 ëš„ė–´ ėžˆėœŧ늴 í”„ëĄœė„¸ėŠ¤ëŠ” ėĻ‰ė‹œ ė™„ëŖŒëŠë‹ˆë‹¤. Ctrl+CëĨŧ 눌ëŸŦ ė–¸ė œë“ ė§€ ė¤‘ė§€í•  눘 ėžˆėœŧ늰, ë‹¤ėŒ ė‹¤í–‰ ė‹œ ė¤‘ë‹¨ëœ ęŗŗė—ė„œ ėžŦ개됩니다. ė´ ëĒ…ë šė´ ė™„ëŖŒë˜ëŠ´ ë°ė´í„°ëŠ” **SAFE**합니다. ė´ė œ ė–´ë ˆė´ëĨŧ ė›í•˜ëŠ” 대로 ė‚ŦėšŠí•˜ęŗ  ėŖŧ揰렁ėœŧ로 `sync` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė—…ë°ė´íŠ¸í•  눘 ėžˆėŠĩ니다. Scrubbing ėŖŧ揰렁ėœŧ로 ë°ė´í„° 및 패ëĻŦí‹°ė˜ 똤ëĨ˜ëĨŧ í™•ė¸í•˜ë ¤ëŠ´ `scrub` ëĒ…ë šė„ ė‹¤í–‰í•  눘 ėžˆėŠĩ니다. :snapraid scrub ė´ ëĒ…ë šė€ ë°ė´í„° ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•´ ė–´ë ˆė´ė˜ ë°ė´í„°ëĨŧ `sync` ëĒ…ë š 뤑뗐 ęŗ„ė‚°ëœ í•´ė‹œė™€ 비ęĩí•Šë‹ˆë‹¤. ė´ ëĒ…ë šė„ ė‹¤í–‰í•  때마다 ė´ė „ė— 10ėŧ ė´ë‚´ė— 늤íŦëŸŊ된 ë°ė´í„°ëĨŧ ė œė™¸í•˜ęŗ  ė–´ë ˆė´ė˜ ė•Ŋ 8%ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 다ëĨ¸ ė–‘ė„ ė§€ė •í•˜ë ¤ëŠ´ -p, --plan ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ęŗ , 다ëĨ¸ ėŧë š(days)ė„ ė§€ė •í•˜ë ¤ëŠ´ -o, --older-than ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 20ėŧëŗ´ë‹¤ ė˜¤ëž˜ëœ ë¸”ëĄė— 대해 ė–´ë ˆė´ė˜ 5%ëĨŧ í™•ė¸í•˜ë ¤ëŠ´ ë‹¤ėŒęŗŧ ę°™ė´ ė‚ŦėšŠí•Šë‹ˆë‹¤: :snapraid -p 5 -o 20 scrub ė´ í”„ëĄœė„¸ėŠ¤ 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ 발ę˛Ŧ되늴, 해당 ë¸”ëĄė€ `content` 파ėŧ뗐 bad로 í‘œė‹œë˜ëŠ° `status` ëĒ…ë šė— ë‚˜ė—´ëŠë‹ˆë‹¤. :snapraid status ė´ë“¤ė„ ėˆ˜ė •í•˜ë ¤ëŠ´ -e, --filter-error ė˜ĩė…˜ėœŧ로 bad ë¸”ëĄė„ 필터링하ė—Ŧ `fix` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. :snapraid -e fix ë‹¤ėŒ `scrub` ė‹œė— 똤ëĨ˜ę°€ ė‹¤ė œëĄœ ėˆ˜ė •ë˜ëŠ´ `status` ëŗ´ęŗ ė„œė—ė„œ ė‚Ŧëŧė§‘ë‹ˆë‹¤. 더 ëš ëĨ´ę˛Œ 하려면, `-p bad`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ bad로 í‘œė‹œëœ 블록만 늤íŦëŸŊ할 눘 ėžˆėŠĩ니다. :snapraid -p bad scrub ë™ę¸°í™”ë˜ė§€ ė•Šė€ ė–´ë ˆė´ė—ė„œ `scrub`ė„ ė‹¤í–‰í•˜ëŠ´ ė œęą°ë˜ęą°ë‚˜ ėˆ˜ė •ëœ 파ėŧ로 ė¸í•œ 똤ëĨ˜ę°€ ëŗ´ęŗ ë  눘 ėžˆėŠĩ니다. ė´ëŸŦ한 똤ëĨ˜ëŠ” `scrub` ėļœë Ĩė—ëŠ” ëŗ´ęŗ ë˜ė§€ë§Œ, 관련 ë¸”ëĄė€ bad로 í‘œė‹œë˜ė§€ ė•ŠėŠĩ니다. Pooling 및溠: ė•„ëž˜ė— 네ëĒ…ëœ 풀링(pooling) 기ëŠĨė€ **mergerfs** 도ęĩŦ로 ëŒ€ė˛´ë˜ė—ˆėœŧ늰, ė´ëŠ” SnapRAID ėģ¤ëŽ¤ë‹ˆí‹°ė—ė„œ Linux ė‚ŦėšŠėžëĨŧ ėœ„í•œ ęļŒėžĨ ė˜ĩė…˜ėž…ë‹ˆë‹¤. Mergefs는 ė—ŦëŸŦ 드ëŧė´ë¸ŒëĨŧ 단ėŧ í†ĩ합 ë§ˆėš´íŠ¸ 맀렐ėœŧ로 풀링하는 더 ėœ ė—°í•˜ęŗ  íš¨ėœ¨ė ė¸ ë°Šë˛•ė„ 렜ęŗĩ하ė—Ŧ, ė‹ŦëŗŧëĻ­ 링íŦ뗐 ė˜ėĄ´í•˜ė§€ ė•Šęŗ  ė–´ë ˆė´ ė „ė˛´ė˜ 파ėŧ뗐 대한 ė›í™œí•œ ė•Ąė„¸ėŠ¤ëĨŧ í—ˆėšŠí•Šë‹ˆë‹¤. ė´ëŠ” 패ëĻŦ티 ëŗ´í˜¸ëĨŧ ėœ„í•œ SnapRAID뙀 ėž˜ í†ĩ합되며, OpenMediaVault (OMV) 또는 ė‚ŦėšŠėž ė •ė˜ NAS ęĩŦė„ąęŗŧ ę°™ė€ ė„¤ė •ė—ė„œ 흔히 ė‚ŦėšŠëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧė„ 동ėŧ한 디렉토ëĻŦ 트ëĻŦ뗐 í‘œė‹œí•˜ë ¤ëŠ´, `pooling` 기ëŠĨė„ í™œė„ąí™”í•  눘 ėžˆėŠĩ니다. ė´ 기ëŠĨė€ ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧ뗐 대한 ėŊ기 ė „ėšŠ ę°€ėƒ 롰ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤. 네렕 파ėŧė—ė„œ `pooling` 디렉토ëĻŦëĨŧ ë‹¤ėŒęŗŧ ę°™ė´ ęĩŦė„ąí•  눘 ėžˆėŠĩ니다: :pool /pool 또는 Windowsė—ė„œ ë‹¤ėŒęŗŧ ę°™ė´ 합니다: :pool C:\pool ꡸ëĻŦęŗ  ë‚˜ė„œ `pool` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ę°€ėƒ 롰ëĨŧ ėƒė„ąí•˜ęą°ë‚˜ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. :snapraid pool Unix 플ëžĢíŧė„ ė‚ŦėšŠí•˜ęŗ  ė´ 디렉토ëĻŦëĨŧ Windows 또는 Unix ėģ´í“¨í„°ė— ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ęŗĩėœ í•˜ë ¤ëŠ´, /etc/samba/smb.conf뗐 ë‹¤ėŒ ė˜ĩė…˜ė„ ėļ”가해ė•ŧ 합니다: :# smb.confė˜ global ė„šė…˜ė—ė„œ :unix extensions = no :# smb.confė˜ share ė„šė…˜ė—ė„œ :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes Windowsė—ė„œ ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ęŗĩėœ í•˜ë ¤ëŠ´ 클ëŧė´ė–¸íŠ¸ę°€ ė›ę˛Šėœŧ로 ė´ë“¤ė„ í•´ė„í•´ė•ŧ 합니다. ė´ëĨŧ í™œė„ąí™”í•˜ę¸° ėœ„í•´, 풀 디렉토ëĻŦëĨŧ ęŗĩėœ í•˜ëŠ” 것 ė™¸ė—ë„, 네렕 파ėŧ뗐 ė •ė˜ëœ ë””ėŠ¤íŦ ė´ëĻ„ė„ ęŗĩ뜠 맀렐ėœŧ로 ė‚ŦėšŠí•˜ė—Ŧ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ 독ëĻŊ렁ėœŧ로 ęŗĩėœ í•´ė•ŧ 합니다. 또한 네렕 파ėŧė˜ `share` ė˜ĩė…˜ė—ė„œ ė›ę˛Š 클ëŧė´ė–¸íŠ¸ę°€ ė´ëŸŦ한 ęŗĩ뜠 ë””ėŠ¤íŦ뗐 ė•Ąė„¸ėŠ¤í•˜ëŠ” 데 í•„ėš”í•œ Windows UNC ę˛Ŋ로ëĨŧ ė§€ė •í•´ė•ŧ 합니다. 똈ëĨŧ ë“¤ė–´, `darkstar`ëŧ는 ė„œë˛„ė—ė„œ ėž‘ė—…í•˜ëŠ” ę˛Ŋ뚰, ë‹¤ėŒ ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar ꡸ëĻŦęŗ  ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ë‹¤ėŒ 디렉토ëĻŦëĨŧ ęŗĩėœ í•Šë‹ˆë‹¤: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array ė´ë ‡ę˛Œ 하면 ė›ę˛Š 클ëŧė´ė–¸íŠ¸ę°€ \\darkstar\poolė—ė„œ ëĒ¨ë“  파ėŧ뗐 ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. 또한 ë‹¤ėŒ ëĒ…ë šėœŧ로 ė›ę˛Š 클ëŧė´ė–¸íŠ¸ëĨŧ ęĩŦė„ąí•˜ė—Ŧ ė›ę˛Š ė‹ŦëŗŧëĻ­ 링íŦ뗐 대한 ė•Ąė„¸ėŠ¤ëĨŧ í™œė„ąí™”í•´ė•ŧ 할 ėˆ˜ë„ ėžˆėŠĩ니다: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAID는 RAID ė‹œėŠ¤í…œëŗ´ë‹¤ëŠ” ë°ąė—… í”„ëĄœęˇ¸ëž¨ė˛˜ëŸŧ ėž‘ë™í•˜ëŠ°, -f, --filter ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 파ėŧė´ë‚˜ 디렉토ëĻŦëĨŧ ė´ė „ ėƒíƒœëĄœ ëŗĩė›í•˜ęą°ë‚˜ ė‚­ė œ ėˇ¨ė†Œí•  눘 ėžˆėŠĩ니다: :snapraid fix -f FILE 또는 디렉토ëĻŦ뗐 대해: :snapraid fix -f DIR/ 또한 -m, --filter-missing ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 디렉토ëĻŦ ë‚´ė—ė„œ ė‹¤ėˆ˜ëĄœ ė‚­ė œëœ 파ėŧ만 ëŗĩęĩŦ할 ėˆ˜ë„ ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ 누ëŊ된 파ėŧ만 ëŗĩė›í•˜ęŗ  다ëĨ¸ 파ėŧė€ 그대로 둡니다. :snapraid fix -m -f DIR/ 또는 ëĒ¨ë“  드ëŧė´ë¸Œė—ė„œ ė‚­ė œëœ ëĒ¨ë“  파ėŧė„ ë‹¤ėŒėœŧ로 ëŗĩęĩŦ합니다: :snapraid fix -m Recovering ėĩœė•…ė˜ ėƒí™Šė´ ë°œėƒí•˜ė—Ŧ 하나 ė´ėƒė˜ ë””ėŠ¤íŦëĨŧ ėžƒė—ˆėŠĩ니다! **íŒ¨ë‹‰í•˜ė§€ ë§ˆė‹­ė‹œė˜¤!** ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다! 가ėžĨ ë¨ŧė € 해ė•ŧ 할 ėŧė€ ë””ėŠ¤íŦ ė–´ë ˆė´ė— 대한 ėļ”ę°€ ëŗ€ę˛Ŋė„ í”ŧ하는 ę˛ƒėž…ë‹ˆë‹¤. ëĒ¨ë“  ė›ę˛Š 뗰枰ęŗŧ SnapRAID ė•ŧ간 동기화 또는 늤íŦëŸŊė„ íŦ함한 ëĒ¨ë“  똈ė•Ŋ된 í”„ëĄœė„¸ėŠ¤ëĨŧ ëš„í™œė„ąí™”í•˜ė‹­ė‹œė˜¤. 그런 ë‹¤ėŒ ë‹¤ėŒ ë‹¨ęŗ„ëĨŧ ė§„í–‰í•˜ė‹­ė‹œė˜¤. STEP 1 -> Reconfigure ëŗĩęĩŦ할 ęŗĩę°„ė´ í•„ėš”í•˜ëŠ°, ė´ėƒė ėœŧ로는 ėļ”ę°€ ė˜ˆëš„ ë””ėŠ¤íŦ뗐, í•˜ė§€ë§Œ 뙏ëļ€ USB ë””ėŠ¤íŦ 또는 ė›ę˛Š ë””ėŠ¤íŦ로도 ėļŠëļ„핊니다. SnapRAID 네렕 파ėŧė„ ėˆ˜ė •í•˜ė—Ŧ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦė˜ `data` 또는 `parity` ė˜ĩė…˜ė´ 파ėŧė„ ëŗĩęĩŦ할 눘 ėžˆëŠ” ėļŠëļ„한 뚈 ęŗĩę°„ė´ ėžˆëŠ” ėœ„ėš˜ëĨŧ 가ëĻŦ키도록 합니다. 똈ëĨŧ ë“¤ė–´, ë””ėŠ¤íŦ `d1`ė´ ė‹¤íŒ¨í•œ ę˛Ŋ뚰, ë‹¤ėŒė—ė„œ ëŗ€ę˛Ŋ합니다: :data d1 /mnt/disk1/ ë‹¤ėŒėœŧ로: :data d1 /mnt/new_spare_disk/ ëŗĩęĩŦ할 ë””ėŠ¤íŦ가 패ëĻŦ티 ë””ėŠ¤íŦė¸ ę˛Ŋ뚰, ė ė ˆí•œ `parity` ė˜ĩė…˜ė„ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ė—ŦëŸŦ ę°œė˜ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, ëĒ¨ë“  ęĩŦė„ą ė˜ĩė…˜ė„ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. STEP 2 -> Fix 로그ëĨŧ 뙏ëļ€ íŒŒėŧ뗐 ė €ėžĨí•˜ëŠ´ė„œ fix ëĒ…ë šė„ ė‹¤í–‰í•Šë‹ˆë‹¤: :snapraid -d NAME -l fix.log fix ė—Ŧę¸°ė„œ NAMEė€ ė´ė „ ė˜ˆė œė˜ `d1`ęŗŧ ę°™ė€ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. ëŗĩęĩŦ할 ë””ėŠ¤íŦ가 패ëĻŦ티 ë””ėŠ¤íŦė¸ ę˛Ŋ뚰, `parity`, `2-parity` ë“ąė˜ ė´ëĻ„ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ė—ŦëŸŦ ę°œė˜ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, ė—ŦëŸŦ -d ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ëĒ¨ë‘ ė§€ė •í•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ ė˜¤ëžœ ė‹œę°„ė´ 깸ëĻŊ니다. fix.log 파ėŧė„ ė €ėžĨ할 ëLJ ę¸°ę°€ë°”ė´íŠ¸ė˜ ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ”ė§€ í™•ė¸í•˜ė‹­ė‹œė˜¤. ėļŠëļ„한 ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ” ë””ėŠ¤íŦė—ė„œ ė‹¤í–‰í•˜ė‹­ė‹œė˜¤. ė´ė œ ëŗĩęĩŦ할 눘 ėžˆëŠ” ëĒ¨ë“  ę˛ƒė„ ëŗĩęĩŦ했ėŠĩ니다. ėŧëļ€ íŒŒėŧė´ ëļ€ëļ„렁ėœŧ로 또는 ė™„ė „ížˆ ëŗĩęĩŦ ëļˆę°€ëŠĨ한 ę˛Ŋ뚰, `.unrecoverable` 확ėžĨėžę°€ ėļ”ę°€ë˜ė–´ ė´ëĻ„ė´ ëŗ€ę˛Ŋ됩니다. `unrecoverable:`로 ė‹œėž‘í•˜ëŠ” ëĒ¨ë“  ė¤„ė„ í™•ė¸í•˜ė—Ŧ fix.log 파ėŧė—ė„œ ëŗĩęĩŦ ëļˆę°€ëŠĨ한 ëĒ¨ë“  ë¸”ëĄė˜ ėžė„¸í•œ ëĒŠëĄė„ ė°žė„ 눘 ėžˆėŠĩ니다. ëŗĩęĩŦ가 ë§ŒėĄąėŠ¤ëŸŊė§€ ė•Šėœŧ늴, ė›í•˜ëŠ” 만íŧ ė—ŦëŸŦ 번 ėžŦė‹œë„í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, ë§ˆė§€ë§‰ `sync` ė´í›„ ė–´ë ˆė´ė—ė„œ 파ėŧė„ ė œęą°í•œ ę˛Ŋ뚰, ėŧëļ€ íŒŒėŧė´ ëŗĩęĩŦë˜ė§€ ė•Šė„ 눘 ėžˆėŠĩ니다. ė´ ę˛Ŋ뚰, -i, --import ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ `fix`ëĨŧ ėžŦė‹œë„í•˜ęŗ , ė´ 파ėŧë“¤ė´ 현ėžŦ ė–´ë””ė— ėžˆëŠ”ė§€ ė§€ė •í•˜ė—Ŧ ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ė— ë‹¤ė‹œ íŦí•¨ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. ëŗĩęĩŦ가 ë§ŒėĄąėŠ¤ëŸŊ다면 ęŗ„ė† ė§„í–‰í•  눘 ėžˆė§€ë§Œ, 동기화 í›„ė—ëŠ” `fix` ëĒ…ë šė„ 더 ė´ėƒ ėžŦė‹œë„í•  눘 ė—†ë‹¤ëŠ” 렐뗐 ėœ ė˜í•˜ė‹­ė‹œė˜¤! STEP 3 -> Check ėĄ°ė‹Ŧ늤ëŸŦ뚴 í™•ė¸ėœŧ로, ė´ė œ `check` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ëŗĩęĩŦ된 ë””ėŠ¤íŦė˜ ëĒ¨ë“  ę˛ƒė´ ė˜Ŧ바ëĨ¸ė§€ í™•ė¸í•  눘 ėžˆėŠĩ니다. :snapraid -d NAME -a check ė—Ŧę¸°ė„œ NAMEė€ ė´ė „ ė˜ˆė œė˜ `d1`ęŗŧ ę°™ė€ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. -d 및 -a ė˜ĩė…˜ė€ SnapRAIDė—ę˛Œ ė§€ė •ëœ ë””ėŠ¤íŦ만 í™•ė¸í•˜ęŗ  ëĒ¨ë“  패ëĻŦ티 ë°ė´í„°ëĨŧ ëŦ´ė‹œí•˜ë„록 ė§€ė‹œí•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ ė˜¤ëžœ ė‹œę°„ė´ 깸ëĻŦė§€ë§Œ, ė§€ë‚˜ėš˜ę˛Œ ėĄ°ė‹Ŧ늤ëŸŊė§€ ė•Šë‹¤ëŠ´ 건너뛸 눘 ėžˆėŠĩ니다. STEP 4 -> Sync `sync` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ 냈 ë””ėŠ¤íŦ로 ė–´ë ˆė´ëĨŧ ėžŦ동기화합니다. :snapraid sync ëĒ¨ë“  ę˛ƒė´ ëŗĩęĩŦ되늴 ė´ ëĒ…ë šė€ ėĻ‰ė‹œ ė™„ëŖŒëŠë‹ˆë‹¤. Commands SnapRAID는 ë‹¤ėŒė„ í—ˆėšŠí•˜ëŠ” ëLJ 氀맀 간단한 ëĒ…ë šė„ 렜ęŗĩ합니다: * ė–´ë ˆė´ė˜ ėƒíƒœ ėļœë Ĩ -> `status` * ë””ėŠ¤íŦ ė œė–´ -> `smart`, `probe`, `up`, `down` * ë°ąė—…/ėŠ¤ëƒ…ėƒˇ ėƒė„ą -> `sync` * ėŖŧ揰렁ėœŧ로 ë°ė´í„° í™•ė¸ -> `scrub` * ë§ˆė§€ë§‰ ë°ąė—…/ėŠ¤ëƒ…ėƒˇ ëŗĩ뛐 -> `fix`. ëĒ…ë šė€ ė†ŒëŦ¸ėžëĄœ ėž‘ė„ąí•´ė•ŧ 합니다. status ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ėƒíƒœ ėš”ė•Ŋė„ ėļœë Ĩ합니다. 패ëĻŦ티 단편화, í™•ė¸ ė—†ė´ ë¸”ëĄė´ ė–ŧ마나 ė˜¤ëž˜ë˜ė—ˆëŠ”ė§€, ꡸ëĻŦęŗ  늤íŦëŸŊ 뤑뗐 ë°œėƒí•œ ëĒ¨ë“  기록된 ëŦ´ë‹¨ 똤ëĨ˜ė— 대한 ė •ëŗ´ëĨŧ íŦ함합니다. ė œė‹œëœ ė •ëŗ´ëŠ” ë§ˆė§€ë§‰ėœŧ로 `sync`ëĨŧ ė‹¤í–‰í–ˆė„ 때ëĨŧ 나타냅니다. ë‚˜ė¤‘ė— ėˆ˜ė •ëœ ë‚´ėšŠė€ ęŗ ë ¤ë˜ė§€ ė•ŠėŠĩ니다. bad ë¸”ëĄė´ ę°ė§€ë˜ëŠ´ 해당 블록 번호가 ë‚˜ė—´ëŠë‹ˆë‹¤. ė´ë“¤ė„ ėˆ˜ė •í•˜ë ¤ëŠ´ `fix -e` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 또한 각 ë¸”ëĄė´ ë§ˆė§€ë§‰ėœŧ로 늤íŦëŸŊ되거나 동기화된 ė‹œę°„ė„ 나타내는 그래프ëĨŧ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. 늤íŦëŸŊ된 ë¸”ëĄė€ `*`, ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ ë¸”ëĄė€ `o`로 í‘œė‹œëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. smart ė‹œėŠ¤í…œė˜ ëĒ¨ë“  ë””ėŠ¤íŦ뗐 대한 SMART ëŗ´ęŗ ė„œëĨŧ ėļœë Ĩ합니다. í–Ĩ후 1년 ë™ė•ˆė˜ ė‹¤íŒ¨ 확ëĨ  ėļ”ė •ėš˜ëĨŧ íŦ함하ė—Ŧ, ė˜ė‹Ŧ늤ëŸŦ뚴 ė†ė„ąė„ ëŗ´ė´ëŠ” ë””ėŠ¤íŦė˜ ėœ ė§€ ëŗ´ėˆ˜ ęĩė˛´ëĨŧ ęŗ„íší•  눘 ėžˆėŠĩ니다. ė´ 확ëĨ  ėļ”ė •ėš˜ëŠ” ë‹¤ėŒė—ė„œ ė‚ŦėšŠ 가ëŠĨ한 Backblaze ë°ė´í„°ė™€ ë””ėŠ¤íŦė˜ SMART ė†ė„ąė„ ėƒí˜¸ ė—°ę´€ė‹œėŧœ ė–ģėŠĩ니다: :https://www.backblaze.com/hard-drive-test-data.html SMART가 ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•˜ęŗ  ėžˆë‹¤ęŗ  ëŗ´ęŗ í•˜ëŠ´, 해당 ë””ėŠ¤íŦ뗐 대해 `FAIL` 또는 `PREFAIL`ė´ ėļœë Ĩ되늰, SnapRAID는 똤ëĨ˜ëĨŧ 반환하며 ėĸ…ëŖŒëŠë‹ˆë‹¤. ė´ ę˛Ŋ뚰, ë””ėŠ¤íŦė˜ ėĻ‰ę°ė ė¸ ęĩė˛´ę°€ 강ë Ĩ히 ęļŒėžĨ됩니다. 다ëĨ¸ 가ëŠĨ한 ėƒíƒœ ëŦ¸ėžė—´ė€ ë‹¤ėŒęŗŧ 같ėŠĩ니다: logfail - ęŗŧęą°ė— ėŧëļ€ ė†ė„ąė´ ėž„ęŗ„ę°’ëŗ´ë‹¤ ë‚Žė•˜ėŠĩ니다. logerr - ėžĨėš˜ 똤ëĨ˜ ëĄœęˇ¸ė— 똤ëĨ˜ę°€ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. selferr - ėžĨėš˜ ėžė˛´ í…ŒėŠ¤íŠ¸ ëĄœęˇ¸ė— 똤ëĨ˜ę°€ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. -v, --verbose ė˜ĩė…˜ė´ ė§€ė •ë˜ëŠ´, 더 ęšŠė€ í†ĩęŗ„ ëļ„ė„ė´ 렜ęŗĩ됩니다. ė´ ëļ„ė„ė€ 더 많거나 ė ė€ 패ëĻŦ티가 í•„ėš”í•œė§€ ę˛°ė •í•˜ëŠ” 데 ë„ė›€ė´ 될 눘 ėžˆėŠĩ니다. ė´ ëĒ…ë šė€ `smartctl` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ `smartctl -a`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. ėžĨėš˜ę°€ ė˜Ŧ바ëĨ´ę˛Œ ėžë™ ę°ė§€ë˜ė§€ ė•Šėœŧ늴, 네렕 파ėŧė—ė„œ `smartctl` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ė‚ŦėšŠėž ė •ė˜ ëĒ…ë šė„ ė§€ė •í•  눘 ėžˆėŠĩ니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. probe ė‹œėŠ¤í…œė˜ ëĒ¨ë“  ë””ėŠ¤íŦė˜ POWER ėƒíƒœëĨŧ ėļœë Ĩ합니다. `Standby`는 ë””ėŠ¤íŦ가 íšŒė „í•˜ė§€ ė•ŠėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. `Active`는 ë””ėŠ¤íŦ가 íšŒė „í•˜ęŗ  ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ `smartctl` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ `smartctl -n standby -i`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. ėžĨėš˜ę°€ ė˜Ŧ바ëĨ´ę˛Œ ėžë™ ę°ė§€ë˜ė§€ ė•Šėœŧ늴, 네렕 파ėŧė—ė„œ `smartctl` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ė‚ŦėšŠėž ė •ė˜ ëĒ…ë šė„ ė§€ė •í•  눘 ėžˆėŠĩ니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. up ė–´ë ˆė´ė˜ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ė‹œí‚ĩ니다(spin up). -d, --filter-disk ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ íŠšė • ë””ėŠ¤íŦ만 íšŒė „ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ ë™ė‹œė— íšŒė „ė‹œí‚¤ë ¤ëŠ´ ë§Žė€ ė „ë Ĩė´ í•„ėš”í•Šë‹ˆë‹¤. 렄뛐 ęŗĩ급 ėžĨėš˜ę°€ ė´ëĨŧ ė§€íƒąí•  눘 ėžˆëŠ”ė§€ í™•ė¸í•˜ė‹­ė‹œė˜¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. down ė–´ë ˆė´ė˜ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ ė¤‘ė§€í•Šë‹ˆë‹¤(spin down). ė´ ëĒ…ë šė€ `smartctl` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ `smartctl -s standby,now`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. -d, --filter-disk ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ íŠšė • ë””ėŠ¤íŦ만 íšŒė „ ė¤‘ė§€í•  눘 ėžˆėŠĩ니다. 똤ëĨ˜ ë°œėƒ ė‹œ ėžë™ėœŧ로 íšŒė „ ė¤‘ė§€í•˜ë ¤ëŠ´, 다ëĨ¸ ëĒ…ë šęŗŧ 함ęģ˜ -s, --spin-down-on-error ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ė´ëŠ” 똤ëĨ˜ ë°œėƒ ė‹œ ėˆ˜ë™ėœŧ로 `down`ė„ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. diff ë§ˆė§€ë§‰ `sync` ė´í›„ ėˆ˜ė •ë˜ė–´ 패ëĻŦ티 ë°ė´í„°ëĨŧ ėžŦęŗ„ė‚°í•´ė•ŧ 하는 ëĒ¨ë“  파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ 파ėŧ ë°ė´í„°ëĨŧ í™•ė¸í•˜ė§€ ė•Šęŗ , 파ėŧ íƒ€ėž„ėŠ¤íƒŦ프, íŦ기 및 ė•„ė´ë…¸ë“œ(inode)만 í™•ė¸í•Šë‹ˆë‹¤. ëĒ¨ë“  ëŗ€ę˛Ŋ된 파ėŧė„ ë‚˜ė—´í•œ 후, ë‹¤ėŒęŗŧ ę°™ė´ ęˇ¸ëŖší™”ëœ ëŗ€ę˛Ŋ ė‚Ŧ항 ėš”ė•Ŋė´ ė œė‹œëŠë‹ˆë‹¤: equal - ė´ė „ęŗŧ ëŗ€ę˛Ŋë˜ė§€ ė•Šė€ 파ėŧ. added - ė´ė „ė— ė—†ë˜ ėļ”ę°€ëœ 파ėŧ. removed - ė œęą°ëœ 파ėŧ. updated - íŦ기 또는 íƒ€ėž„ėŠ¤íƒŦ프가 다ëĨ¸ 파ėŧ, ėω ėˆ˜ė •ëœ 파ėŧ. moved - 동ėŧ한 ë””ėŠ¤íŦė˜ 다ëĨ¸ 디렉토ëĻŦ로 ė´ë™ëœ 파ėŧ. ė´ë“¤ė€ ė´ëĻ„, íŦ기, íƒ€ėž„ėŠ¤íƒŦ프 및 ė•„ė´ë…¸ë“œę°€ 동ėŧí•˜ė§€ë§Œ 디렉토ëĻŦ가 다ëĨ¸ 것ėœŧ로 ė‹ëŗ„ëŠë‹ˆë‹¤. copied - ė›ëŗ¸ 파ėŧė´ ė—Ŧė „ížˆ ėĄ´ėžŦ하는 동ėŧ한 ë””ėŠ¤íŦ 또는 다ëĨ¸ ë””ėŠ¤íŦ뗐 ëŗĩė‚Ŧ된 파ėŧ. ė´ë“¤ė€ 동ėŧ한 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ 氀말ėœŧëĄœė¨ ė‹ëŗ„ëŠë‹ˆ 다. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, ė´ëĻ„ëŋë§Œ ė•„ë‹ˆëŧ 렄랴 ę˛Ŋ로가 ėŧėš˜í•´ė•ŧ ė‹ëŗ„ëŠë‹ˆë‹¤. relocated - ė›ëŗ¸ė´ ė‚Ŧëŧė§„ 동ėŧ한 ë””ėŠ¤íŦ 또는 다ëĨ¸ ë””ėŠ¤íŦ로 ė´ 동된 파ėŧ. ė´ë“¤ė€ 동ėŧ한 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ 氀말ėœŧëĄœė¨ ė‹ëŗ„ëŠë‹ˆ 다. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, ė‹ëŗ„ė„ ėœ„í•´ 렄랴 ę˛Ŋ로가 ėŧėš˜ 해ė•ŧ 합니다. 동ėŧ한 ë””ėŠ¤íŦė˜ 'moved' 파ėŧęŗŧ ë‹ŦëĻŦ, ėžŦë°°ėš˜ëœ 파ėŧė€ 다ëĨ¸ inodeëĨŧ ę°€ė§‘ë‹ˆë‹¤. restored - inode는 다ëĨ´ė§€ë§Œ 디렉토ëĻŦ, ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ 프가 ėŧėš˜í•˜ëŠ” 파ėŧ. ė´ë“¤ė€ 대개 ė‚­ė œëœ 후 ëŗĩęĩŦ된 파ėŧë“¤ėž…ë‹ˆë‹¤. `sync`가 í•„ėš”í•œ ę˛Ŋ뚰, í”„ëĄœė„¸ėŠ¤ 반환 ėŊ”드는 ę¸°ëŗ¸ 0 ëŒ€ė‹  2ėž…ë‹ˆë‹¤. 반환 ėŊ”드 1ė€ ėŧë°˜ė ė¸ 똤ëĨ˜ ėĄ°ęą´ė— ė‚ŦėšŠëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. sync 패ëĻŦ티 ė •ëŗ´ëĨŧ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ëĒ¨ë“  ėˆ˜ė •ëœ 파ėŧė„ ėŊęŗ  해당 패ëĻŦ티 ë°ė´í„°ëĨŧ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ė´ë¯¸ ėˆ˜í–‰ëœ ėž‘ė—…ė„ ėžƒė§€ ė•Šęŗ  Ctrl+CëĨŧ 눌ëŸŦ ė–¸ė œë“ ė§€ ė´ í”„ëĄœė„¸ėŠ¤ëĨŧ ė¤‘ė§€í•  눘 ėžˆėŠĩ니다. ë‹¤ėŒ ė‹¤í–‰ ė‹œ `sync` í”„ëĄœė„¸ėŠ¤ëŠ” ė¤‘ë‹¨ëœ ęŗŗė—ė„œ ėžŦ개됩니다. ė´ í”„ëĄœė„¸ėŠ¤ 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ 발ę˛Ŧ되늴, 해당 ë¸”ëĄė€ bad로 í‘œė‹œëŠë‹ˆë‹¤. 파ėŧė€ ę˛Ŋ로 및/또는 ė•„ė´ë…¸ë“œëĄœ ė‹ëŗ„ë˜ëŠ° íŦ揰뙀 íƒ€ėž„ėŠ¤íƒŦ프로 í™•ė¸ëŠë‹ˆë‹¤. 파ėŧ íŦ기 또는 íƒ€ėž„ėŠ¤íƒŦ프가 다ëĨ´ëŠ´ 렄랴 파ėŧ뗐 대해 패ëĻŦ티 ë°ė´í„°ę°€ ėžŦęŗ„ė‚°ëŠë‹ˆë‹¤. 파ėŧė´ 동ėŧ한 ë””ėŠ¤íŦė—ė„œ ė´ë™ë˜ęą°ë‚˜ ė´ëĻ„ė´ ëŗ€ę˛Ŋë˜ęŗ  동ėŧ한 ė•„ė´ë…¸ë“œëĨŧ ėœ ė§€í•˜ëŠ´ 패ëĻŦ티는 ėžŦęŗ„ė‚°ë˜ė§€ ė•ŠėŠĩ니다. 파ėŧė´ 다ëĨ¸ ë””ėŠ¤íŦ로 ė´ë™ë˜ëŠ´ 패ëĻŦ티는 ėžŦęŗ„ė‚°ë˜ė§€ë§Œ, ė´ė „ė— ęŗ„ė‚°ëœ í•´ė‹œ ė •ëŗ´ëŠ” ėœ ė§€ëŠë‹ˆë‹¤. `content` 및 `parity` 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. scrub ė–´ë ˆė´ëĨŧ 늤íŦëŸŊ하ė—Ŧ ë°ė´í„° 및 패ëĻŦ티 ë””ėŠ¤íŦė˜ ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 각 호ėļœė€ ė´ė „ė— 10ėŧ ė´ë‚´ė— 늤íŦëŸŊ된 ë°ė´í„°ëĨŧ ė œė™¸í•˜ęŗ  ė–´ë ˆė´ė˜ ė•Ŋ 8%ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. ė´ëŠ” ėŧėŖŧėŧ뗐 한 번 늤íŦëŸŊ하면 ëĒ¨ë“  ë°ė´í„° 비트가 ė ė–´ë„ 3ę°œė›”ë§ˆë‹¤ 한 ë˛ˆė”Š í™•ė¸ë¨ė„ ė˜ë¯¸í•Šë‹ˆë‹¤. -p, --plan ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 다ëĨ¸ 늤íŦëŸŊ ęŗ„íš 또는 ė–‘ė„ ė •ė˜í•  눘 ėžˆėœŧ늰, ë‹¤ėŒ ę°’ė„ í—ˆėšŠí•Šë‹ˆë‹¤: bad - bad로 í‘œė‹œëœ 블록 늤íŦëŸŊ. new - ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 블록 늤íŦëŸŊ. full - ëĒ¨ë“  것 늤íŦëŸŊ. 0-100 - ė§€ė •ëœ ëš„ėœ¨ė˜ 블록 늤íŦëŸŊ. ë°ąëļ„ėœ¨ ė–‘ė„ ė§€ė •í•˜ëŠ´, -o, --older-than ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ë¸”ëĄė´ ė–ŧ마나 ė˜¤ëž˜ë˜ė—ˆëŠ”ė§€ ė •ė˜í•  ėˆ˜ë„ ėžˆėŠĩ니다. 가ėžĨ ė˜¤ëž˜ëœ ë¸”ëĄė´ ë¨ŧė € 늤íŦëŸŊë˜ė–´ ėĩœė ė˜ í™•ė¸ė„ ëŗ´ėžĨ합니다. ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 블록만 늤íŦëŸŊ하려면, `-p new` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 늤íŦëŸŊ ėƒíƒœė˜ 넏ëļ€ ė •ëŗ´ëĨŧ ė–ģėœŧ려늴 `status` ëĒ…ë šė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 발ę˛Ŧ된 ëĒ¨ë“  ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ė— 대해, 해당 ë¸”ëĄė€ `content` 파ėŧ뗐 bad로 í‘œė‹œëŠë‹ˆë‹¤. ė´ëŸŦ한 bad ë¸”ëĄė€ `status`뗐 ë‚˜ė—´ë˜ëŠ° `fix -e`로 ėˆ˜ė •í•  눘 ėžˆėŠĩ니다. ėˆ˜ė • 후, ë‹¤ėŒ 늤íŦëŸŊ ė‹œė— ë‹¤ė‹œ í™•ė¸ë˜ëŠ°, ėˆ˜ė •ëœ 것ėœŧ로 발ę˛Ŧ되늴 bad í‘œė‹œëŠ” ė œęą°ëŠë‹ˆë‹¤. bad 블록만 늤íŦëŸŊ하려면 `scrub -p bad` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ë™ę¸°í™”ë˜ė§€ ė•Šė€ ë°ė´í„°ëĄœ ė¸í•œ ëŗ´ęŗ ëœ 똤ëĨ˜ëĨŧ í”ŧ하기 ėœ„í•´ 동기화된 ė–´ë ˆė´ė—ė„œë§Œ `scrub`ė„ ė‹¤í–‰í•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. ė´ëŸŦ한 똤ëĨ˜ëŠ” ëŦ´ë‹¨ 똤ëĨ˜ę°€ ė•„ë‹Œ 것ėœŧ로 ė¸ė‹ë˜ëŠ°, ë¸”ëĄė€ bad로 í‘œė‹œë˜ė§€ ė•Šė§€ë§Œ, ė´ëŸŦ한 똤ëĨ˜ëŠ” ëĒ…ë šė˜ ėļœë Ĩ뗐 ëŗ´ęŗ ëŠë‹ˆë‹¤. `content` 파ėŧė€ 각 ë¸”ëĄė˜ ë§ˆė§€ë§‰ í™•ė¸ ė‹œę°„ė„ ė—…ë°ė´íŠ¸í•˜ęŗ  bad ë¸”ëĄė„ í‘œė‹œí•˜ę¸° ėœ„í•´ ėˆ˜ė •ëŠë‹ˆë‹¤. `parity` 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. ė–´ë ˆė´ė˜ 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. fix ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëĨŧ ėˆ˜ė •í•Šë‹ˆë‹¤. ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëŠ” ë§ˆė§€ë§‰ `sync`뗐 ė €ėžĨ된 ėŠ¤ëƒ…ėƒˇ ėƒíƒœė™€ 비ęĩëŠë‹ˆë‹¤. ė°¨ė´ę°€ 발ę˛Ŧ되늴 ė €ėžĨ된 ėŠ¤ëƒ…ėƒˇėœŧ로 ë˜ëŒë ¤ė§‘ë‹ˆë‹¤. **ę˛Ŋęŗ !** `fix` ëĒ…ë šė€ 똤ëĨ˜ė™€ ė˜ë„ė ė¸ ėˆ˜ė • ė‚Ŧė´ëĨŧ ęĩŦëŗ„í•˜ė§€ ė•ŠėŠĩ니다. 파ėŧ ėƒíƒœëĨŧ ëŦ´ėĄ°ęą´ ë§ˆė§€ë§‰ `sync`로 되돌ëĻŊ니다. 다ëĨ¸ ė˜ĩė…˜ė´ ė§€ė •ë˜ė§€ ė•Šėœŧ늴 렄랴 ė–´ë ˆė´ę°€ 래ëĻŦ됩니다. 필터 ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 래ëĻŦ할 파ėŧ 또는 ë””ėŠ¤íŦė˜ í•˜ėœ„ ė§‘í•Šė„ ė„ íƒí•˜ė‹­ė‹œė˜¤. `sync` 및 `scrub` 뤑뗐 bad로 í‘œė‹œëœ 블록만 ėˆ˜ė •í•˜ë ¤ëŠ´, -e, --filter-error ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 다ëĨ¸ 필터 ė˜ĩė…˜ęŗŧ ë‹ŦëĻŦ, ė´ ė˜ĩė…˜ė€ ėĩœė‹  `sync` ė´í›„ ëŗ€ę˛Ŋë˜ė§€ ė•Šė€ 파ėŧė—ë§Œ ėˆ˜ė •ė„ ė ėšŠí•Šë‹ˆë‹¤. SnapRAID는 ėˆ˜ė •í•  눘 ė—†ëŠ” ëĒ¨ë“  파ėŧ뗐 `.unrecoverable` 확ėžĨėžëĨŧ ėļ”ę°€í•˜ė—Ŧ ė´ëĻ„ė„ ëŗ€ę˛Ŋ합니다. ėˆ˜ė •í•˜ę¸° 렄뗐, 렄랴 ė–´ë ˆė´ëĨŧ 늤ėē”하ė—Ŧ ë§ˆė§€ë§‰ `sync` ė´í›„ ė´ë™ëœ 파ėŧė„ ė°žėŠĩ니다. ė´ 파ėŧë“¤ė€ ė´ëĻ„ęŗŧ 디렉토ëĻŦëĨŧ ëŦ´ė‹œí•˜ęŗ  íƒ€ėž„ėŠ¤íƒŦ프로 ė‹ëŗ„ë˜ëŠ°, í•„ėš”í•œ ę˛Ŋ뚰 ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ė— ė‚ŦėšŠëŠë‹ˆë‹¤. ėŧëļ€ íŒŒėŧė„ ė–´ë ˆė´ 뙏ëļ€ëĄœ ė´ë™í•œ ę˛Ŋ뚰, -i, --import ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ėļ”ę°€ëĄœ 늤ėē”í•  디렉토ëĻŦëĨŧ ė§€ė •í•  눘 ėžˆėŠĩ니다. 파ėŧė€ ė•„ė´ë…¸ë“œę°€ ė•„ë‹Œ ę˛Ŋ로로만 ė‹ëŗ„ëŠë‹ˆë‹¤. `content` 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. `parity` 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. check ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. `fix`래ëŸŧ ėž‘ë™í•˜ė§€ë§Œ, ëŗĩęĩŦëĨŧ ė‹œëŽŦë ˆė´ė…˜í•  ëŋė´ëа ė–´ë ˆė´ė— ė–´ë–¤ ëŗ€ę˛Ŋ ė‚Ŧ항도 ę¸°ëĄë˜ė§€ ė•ŠėŠĩ니다. ė´ ëĒ…ë šė€ ėŖŧ로 ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ 후 또는 기타 íŠšëŗ„í•œ ėĄ°ęą´ė—ė„œė™€ ę°™ė´ ėˆ˜ë™ í™•ė¸ė„ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ėŖŧę¸°ė ė´ęŗ  똈ė•Ŋ된 í™•ė¸ė„ ėœ„í•´ė„œëŠ” `scrub`ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. -a, --audit-only ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ 파ėŧ ë°ė´í„°ë§Œ í™•ė¸í•˜ęŗ  패ëĻŦ티 ë°ė´í„°ëŠ” ëŦ´ė‹œí•˜ė—Ŧ ė‹¤í–‰ ė†ë„ëĨŧ 높ėŧ 눘 ėžˆėŠĩ니다. 파ėŧė€ ė•„ė´ë…¸ë“œę°€ ė•„ë‹Œ ę˛Ŋ로로만 ė‹ëŗ„ëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. list ë§ˆė§€ë§‰ `sync` ė‹œė ė— ė–´ë ˆė´ė— íŦ함된 ëĒ¨ë“  파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. -v 또는 --verboseëĨŧ ė‚ŦėšŠí•˜ëŠ´ í•˜ėœ„ 봈 ė‹œę°„ë„ í‘œė‹œëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. dup ëĒ¨ë“  뤑ëŗĩ 파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. 두 파ėŧė˜ í•´ė‹œę°€ ėŧėš˜í•˜ëŠ´ 동ėŧ한 것ėœŧ로 간ėŖŧ됩니다. 파ėŧ ë°ė´í„°ëŠ” ėŊė§€ ė•Šęŗ , 미ëĻŦ ęŗ„ė‚°ëœ í•´ė‹œë§Œ ė‚ŦėšŠëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. pool `pooling` 디렉토ëĻŦė—ė„œ ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧ뗐 대한 ę°€ėƒ 롰ëĨŧ ėƒė„ąí•˜ęą°ë‚˜ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. 파ėŧė€ ëŗĩė‚Ŧë˜ė§€ ė•Šęŗ  ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė—°ę˛°ëŠë‹ˆë‹¤. ė—…ë°ė´íŠ¸ ė‹œ, ëĒ¨ë“  ę¸°ėĄ´ ė‹ŦëŗŧëĻ­ 링íŦ뙀 뚈 í•˜ėœ„ 디렉토ëĻŦ는 ė‚­ė œë˜ęŗ  ė–´ë ˆė´ė˜ 냈 뷰로 ëŒ€ė˛´ëŠë‹ˆë‹¤. 다ëĨ¸ ėŧ반 파ėŧė€ ė œėžëĻŦ뗐 남ėŠĩ니다. 풀 디렉토ëĻŦ 뙏ëļ€ė—ė„œëŠ” ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. devices ė–´ë ˆė´ė—ė„œ ė‚ŦėšŠë˜ëŠ” ė €ėˆ˜ė¤€(low-level) ėžĨėš˜ëĨŧ ėļœë Ĩ합니다. ė´ ëĒ…ë šė€ ė–´ë ˆė´ė˜ ėžĨėš˜ ė—°ę˛°ė„ í‘œė‹œí•˜ëŠ°, ėŖŧ로 늤íŦëĻŊ트 ė¸í„°íŽ˜ė´ėŠ¤ëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ė˛˜ėŒ 두 ė—´ė€ ė €ėˆ˜ė¤€ ėžĨėš˜ ID 및 ę˛ŊëĄœėž…ë‹ˆë‹¤. ë‹¤ėŒ 두 ė—´ė€ ęŗ ėˆ˜ė¤€(high-level) ėžĨėš˜ ID 및 ę˛ŊëĄœėž…ë‹ˆë‹¤. ë§ˆė§€ë§‰ ė—´ė€ ė–´ë ˆė´ė˜ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. 대ëļ€ëļ„ė˜ ę˛Ŋ뚰, ė–´ë ˆė´ė˜ 각 ë””ėŠ¤íŦ뗐 대해 í•˜ë‚˜ė˜ ė €ėˆ˜ė¤€ ėžĨėš˜ę°€ ėžˆė§€ë§Œ, ėŧëļ€ ë” ëŗĩėžĄí•œ ęĩŦė„ąė—ė„œëŠ” 단ėŧ ė–´ë ˆė´ ë””ėŠ¤íŦ뗐 ė˜í•´ ė‚ŦėšŠë˜ëŠ” ė—ŦëŸŦ ė €ėˆ˜ė¤€ ėžĨėš˜ę°€ ėžˆė„ 눘 ėžˆėŠĩ니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. touch í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ėœŧ로 ė„¤ė •ëœ ëĒ¨ë“  파ėŧ뗐 ėž„ė˜ė˜ í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ ė„¤ė •í•Šë‹ˆë‹¤. ė´ëŠ” íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ ęą°ė˜ ęŗ ėœ í•˜ę˛Œ ë§Œë“¤ė–´ 가ëŠĨ한 뤑ëŗĩė„ ė¤„ė´ë¯€ëĄœ, SnapRAID가 ė´ë™ë˜ęą°ë‚˜ ëŗĩė‚Ŧ된 파ėŧė„ ė¸ė‹í•˜ëŠ” ëŠĨë Ĩė„ í–Ĩėƒė‹œí‚ĩ니다. 더 ęĩŦ랴렁ėœŧ로, í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė´ ė•„ë‹Œ ę˛Ŋ뚰, ė´ë™ë˜ęą°ë‚˜ ëŗĩė‚Ŧ된 파ėŧė€ ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프가 ėŧėš˜í•˜ëŠ´ 그렇게 ė‹ëŗ„ëŠë‹ˆë‹¤. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, 렄랴 ę˛Ŋ로, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프가 ëĒ¨ë‘ ėŧėš˜í•˜ëŠ” ę˛Ŋėš°ė—ë§Œ ëŗĩė‚Ŧëŗ¸ėœŧ로 간ėŖŧ됩니다. 봈 ë‹¨ėœ„ ė •ë°€ë„ė˜ íƒ€ėž„ėŠ¤íƒŦ프는 ėˆ˜ė •ë˜ė§€ ė•Šėœŧë¯€ëĄœ, 파ėŧė˜ ëĒ¨ë“  ë‚ ė§œė™€ ė‹œę°„ė€ ëŗ´ėĄ´ëŠë‹ˆë‹¤. rehash 렄랴 ė–´ë ˆė´ė˜ ėžŦí•´ė‹œ(rehash)ëĨŧ 똈ė•Ŋ합니다. ė´ ëĒ…ë šė€ ė‚ŦėšŠë˜ëŠ” í•´ė‹œ ėĸ…ëĨ˜ëĨŧ ëŗ€ę˛Ŋ하며, ėŧë°˜ė ėœŧ로 32비트 ė‹œėŠ¤í…œė—ė„œ 64비트 ė‹œėŠ¤í…œėœŧ로 ė—…ęˇ¸ë ˆė´ë“œí•  때 MurmurHash3ė—ė„œ 더 ëš ëĨ¸ SpookyHash로 ė „í™˜í•˜ę¸° ėœ„í•´ ė‚ŦėšŠëŠë‹ˆë‹¤. ė´ë¯¸ ėĩœė ė˜ í•´ė‹œëĨŧ ė‚ŦėšŠí•˜ęŗ  ėžˆë‹¤ëŠ´, ė´ ëĒ…ë šė€ ė•„ëŦ´ę˛ƒë„ í•˜ė§€ ė•Šęŗ  ėĄ°ėš˜ę°€ í•„ėš”í•˜ė§€ ė•ŠėŒė„ ė•Œë ¤ė¤ë‹ˆë‹¤. ėžŦí•´ė‹œëŠ” ėĻ‰ė‹œ ėˆ˜í–‰ë˜ė§€ ė•Šęŗ  `sync` 및 `scrub` 뤑뗐 렐맄렁ėœŧ로 ė§„í–‰ëŠë‹ˆë‹¤. `status`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėžŦí•´ė‹œ ėƒíƒœëĨŧ í™•ė¸í•  눘 ėžˆėŠĩ니다. ėžŦí•´ė‹œ ė¤‘ė—ë„ SnapRAID는 렄랴 기ëŠĨė„ ėœ ė§€í•˜ëŠ°, 뜠ėŧ한 ė˜ˆė™¸ëŠ” `dup`가 다ëĨ¸ í•´ė‹œëĨŧ ė‚ŦėšŠí•˜ëŠ” 뤑ëŗĩ 파ėŧė„ ę°ė§€í•  눘 ė—†ë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. locate 패ëĻŦ티 ë””ėŠ¤íŦ뗐 ė €ėžĨ된 파ėŧė„ ė°žėŠĩ니다. ėŧėš˜í•˜ëŠ” 각 파ėŧ뗐 대해 패ëĻŦ티 파ėŧ ë‚´ė˜ ėœ„ėš˜ė™€ ė ėœ í•˜ęŗ  ėžˆëŠ” ėĄ°ę°(fragment)ė˜ 눘ëĨŧ ėļœë Ĩ합니다. -t, --tail ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 패ëĻŦí‹°ė˜ ė§€ė •ëœ ęŧŦëĻŦ(tail) ëļ€ëļ„ė„ ė ėœ í•˜ëŠ” 파ėŧ로 ėž‘ė—…ė„ ė œí•œí•  눘 ėžˆėŠĩ니다. ė´ 파ėŧë“¤ė„ ėžŦ할당하려면 -W, --force-realloc-tail ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ėžŦ할당 ęŗŧė • ë™ė•ˆ 해당 파ėŧë“¤ė€ 패ëĻŦí‹°ė— ė˜í•´ ëŗ´í˜¸ë˜ė§€ ė•Šėœŧë¯€ëĄœ ėŖŧė˜í•˜ė‹­ė‹œė˜¤. Options SnapRAID는 ë‹¤ėŒ ė˜ĩė…˜ė„ 렜ęŗĩ합니다: -c, --conf CONFIG ė‚ŦėšŠí•  네렕 파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė§€ė •í•˜ė§€ ė•Šėœŧ늴 Unixė—ė„œëŠ” `/usr/local/etc/snapraid.conf` 파ėŧė´ ėĄ´ėžŦ하면 ė‚ŦėšŠí•˜ęŗ , ęˇ¸ë ‡ė§€ ė•Šėœŧ늴 `/etc/snapraid.conf`ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. Windowsė—ė„œëŠ” `snapraid.exe`뙀 ę°™ė€ 디렉토ëĻŦ뗐 ėžˆëŠ” `snapraid.conf` 파ėŧė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. -f, --filter PATTERN `check` 및 `fix`ė—ė„œ 래ëĻŦ할 파ėŧė„ 필터링합니다. ė§€ė •ëœ 패턴ęŗŧ ėŧėš˜í•˜ëŠ” 파ėŧ만 래ëĻŦ됩니다. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 패턴 ė‚Ŧ떑뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ PATTERN ė„šė…˜ė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. Unixė—ė„œëŠ” 글로빙 ëŦ¸ėžę°€ ė‚ŦėšŠë˜ëŠ” ę˛Ŋ뚰 ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. `sync` 및 `scrub`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. -d, --filter-disk NAME `check`, `fix`, `up`, 및 `down`ė—ė„œ 래ëĻŦ할 ë””ėŠ¤íŦëĨŧ 필터링합니다. 네렕 파ėŧ뗐 ė •ė˜ëœ ë””ėŠ¤íŦ ė´ëĻ„ė„ ė§€ė •í•´ė•ŧ 합니다. 또한 `parity`, `2-parity`, `3-parity` ë“ąė˜ ė´ëĻ„ėœŧ로 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ ė§€ė •í•˜ė—Ŧ íŠšė • 패ëĻŦ티 ë””ėŠ¤íŦ로 ėž‘ė—…ė„ ė œí•œí•  눘 ėžˆėŠĩ니다. ė—ŦëŸŦ --filter, --filter-disk, --filter-missing ė˜ĩė…˜ė„ 결합하면, ëĒ¨ë“  í•„í„°ė™€ ėŧėš˜í•˜ëŠ” 파ėŧ만 ė„ íƒëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `check`, `fix`, `up`, 및 `down`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. `sync` 및 `scrub`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. -m, --filter-missing `check` 및 `fix`ė—ė„œ 래ëĻŦ할 파ėŧė„ 필터링합니다. ė–´ë ˆė´ė—ė„œ 누ëŊ되거나 ė‚­ė œëœ 파ėŧ만 래ëĻŦ됩니다. `fix`뙀 함ęģ˜ ė‚ŦėšŠí•˜ëŠ´, ė´ ė˜ĩė…˜ė€ `undelete` ëĒ…ë š ė—­í• ė„ 합니다. ė—ŦëŸŦ --filter, --filter-disk, --filter-missing ė˜ĩė…˜ė„ 결합하면, ëĒ¨ë“  í•„í„°ė™€ ėŧėš˜í•˜ëŠ” 파ėŧ만 ė„ íƒëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. `sync` 및 `scrub`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. -e, --filter-error `check` 및 `fix`ė—ė„œ 똤ëĨ˜ę°€ ėžˆëŠ” 파ėŧė„ 래ëĻŦ합니다. `status`뗐 ë‚˜ė—´ëœ 대로 `sync` 및 `scrub` 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ í‘œė‹œëœ ë¸”ëĄė„ 氀맄 파ėŧ만 래ëĻŦ합니다. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -p, --plan PERC|bad|new|full 늤íŦëŸŊ ęŗ„íšė„ ė„ íƒí•Šë‹ˆë‹¤. PERC가 0ė—ė„œ 100 ė‚Ŧė´ė˜ ėˆĢėž ę°’ė¸ ę˛Ŋ뚰, 늤íŦëŸŊ할 ë¸”ëĄė˜ ë°ąëļ„ėœ¨ëĄœ í•´ė„ëŠë‹ˆë‹¤. ë°ąëļ„ėœ¨ ëŒ€ė‹  ęŗ„íšė„ ė§€ė •í•  눘 ėžˆėŠĩ니다: `bad`는 bad ë¸”ëĄė„ 늤íŦëŸŊí•˜ęŗ , `new`는 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 막 동기화된 ë¸”ëĄė„ 늤íŦëŸŊ하며, `full`ė€ ëĒ¨ë“  ę˛ƒė„ 늤íŦëŸŊ합니다. ė´ ė˜ĩė…˜ė€ `scrub`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -o, --older-than DAYS `scrub`ė—ė„œ 래ëĻŦ할 ė–´ë ˆė´ė˜ 가ėžĨ ė˜¤ëž˜ëœ ëļ€ëļ„ė„ ė„ íƒí•Šë‹ˆë‹¤. DAYS는 ë¸”ëĄė´ 늤íŦëŸŊë˜ė–´ė•ŧ 하는 ėĩœė†Œ ėŧë š(days)ė´ëŠ°, ę¸°ëŗ¸ę°’ė€ 10ėž…ë‹ˆë‹¤. bad로 í‘œė‹œëœ ë¸”ëĄė€ ė´ ė˜ĩė…˜ė— ę´€ęŗ„ė—†ė´ í•­ėƒ 늤íŦëŸŊ됩니다. ė´ ė˜ĩė…˜ė€ `scrub`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -a, --audit-only `check`ė—ė„œ 패ëĻŦ티 ë°ė´í„°ëĨŧ í™•ė¸í•˜ė§€ ė•Šęŗ  파ėŧė˜ í•´ė‹œëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 파ėŧ ë°ė´í„°ë§Œ í™•ė¸í•˜ëŠ” 데 관ė‹Ŧė´ ėžˆë‹¤ëŠ´, ė´ ė˜ĩė…˜ė€ í™•ė¸ í”„ëĄœė„¸ėŠ¤ė˜ ė†ë„ëĨŧ ėƒë‹šížˆ 높ėŧ 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `check`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -h, --pre-hash `sync`ė—ė„œ 패ëĻŦ티 ęŗ„ė‚° 렄뗐 ėļ”ę°€ í™•ė¸ė„ ėœ„í•´ ëĒ¨ë“  냈 ë°ė´í„°ė— 대한 ė˜ˆëš„ í•´ė‹œ ë‹¨ęŗ„ëĨŧ ė‹¤í–‰í•Šë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 `sync`ė—ė„œëŠ” ė˜ˆëš„ í•´ė‹œę°€ ėˆ˜í–‰ë˜ė§€ ė•Šėœŧ늰, 냈 ë°ė´í„°ëŠ” 패ëĻŦ티 ęŗ„ė‚° 링렄뗐 ė˛˜ėŒ ėŊė„ 때 í•´ė‹œëŠë‹ˆë‹¤. ė´ í”„ëĄœė„¸ėŠ¤ëŠ” ëĒ¨ë“  ë””ėŠ¤íŦ가 íšŒė „í•˜ęŗ  CPU가 ë°”ėœ, ė‹œėŠ¤í…œė´ ęŗŧëļ€í•˜ ėƒíƒœėŧ 때 ë°œėƒí•Šë‹ˆë‹¤. ė´ëŠ” ę¸°ęŗ„ė˜ 극한 ėĄ°ęą´ė´ëŠ°, ėž ėžŦ된 í•˜ë“œė›¨ė–´ ëŦ¸ė œę°€ ėžˆëŠ” ę˛Ŋ뚰 ë°ė´í„°ę°€ 땄링 í•´ė‹œë˜ė§€ ė•Šė•˜ę¸° 때ëŦ¸ė— ëŦ´ë‹¨ 똤ëĨ˜ę°€ ę°ė§€ë˜ė§€ ė•Šęŗ  ė§€ë‚˜ę°ˆ 눘 ėžˆėŠĩ니다. ė´ëŸŦ한 ėœ„í—˜ė„ í”ŧ하려면, `pre-hash` ëĒ¨ë“œëĨŧ í™œė„ąí™”í•˜ė—Ŧ ëĒ¨ë“  ë°ė´í„°ëĨŧ 두 번 ėŊė–´ ëŦ´ę˛°ė„ąė„ ëŗ´ėžĨ할 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ 또한 ė–´ë ˆė´ ë‚´ė—ė„œ ė´ë™ëœ 파ėŧė„ í™•ė¸í•˜ė—Ŧ ė´ë™ ėž‘ė—…ė´ ė„ąęŗĩí–ˆëŠ”ė§€ í™•ė¸í•˜ęŗ , í•„ėš”í•œ ę˛Ŋ뚰 ęŗ„ė† ė§„í–‰í•˜ę¸° 렄뗐 fix ėž‘ė—…ė„ ė‹¤í–‰í•  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -i, --import DIR ė§€ė •ëœ 디렉토ëĻŦė—ė„œ ë§ˆė§€ë§‰ `sync` ė´í›„ ė–´ë ˆė´ė—ė„œ ė‚­ė œëœ 파ėŧė„ 氀렏ė˜ĩ니다. ė´ëŸŦ한 파ėŧė´ ė—Ŧė „ížˆ ėžˆëŠ” ę˛Ŋ뚰, ė´ë“¤ė€ `check` 및 `fix`뗐 ė˜í•´ ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ëĨŧ ę°œė„ í•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 파ėŧė€ í•˜ėœ„ 디렉토ëĻŦëĨŧ íŦ함하ė—Ŧ ėŊ히며, ė´ëτ뗐 ę´€ęŗ„ė—†ė´ ė‹ëŗ„ëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -s, --spin-down-on-error 똤ëĨ˜ ë°œėƒ ė‹œ, 0ė´ ė•„ë‹Œ ėƒíƒœ ėŊ”ë“œëĄœ ėĸ…ëŖŒí•˜ę¸° 렄뗐 관ëĻŦ되는 ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ė¤‘ë‹¨ëœ ėž‘ė—… í›„ė— 드ëŧė´ë¸Œę°€ ęŗ„ė† í™œė„ą ėƒíƒœëĄœ íšŒė „í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•˜ė—Ŧ ëļˆí•„ėš”í•œ ė—´ ėļ•렁 및 ė „ë Ĩ ė†Œëš„ëĨŧ ë°Šė§€í•˜ëŠ” 데 ë„ė›€ė´ 됩니다. ëĒ…ë šė´ ė‹¤íŒ¨í•˜ë”ëŧ도 ë””ėŠ¤íŦ가 ė•ˆė „í•˜ę˛Œ ė¤‘ė§€ë˜ë„ëĄ ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. -w, --bw-limit RATE ëĒ¨ë“  ë””ėŠ¤íŦ뗐 대한 ė „ė—­ ëŒ€ė—­í­ ė œí•œė„ ė ėšŠí•Šë‹ˆë‹¤. RATE는 ė´ˆë‹š ë°”ė´íŠ¸ ėˆ˜ėž…ë‹ˆë‹¤. K, M, 또는 G뙀 ę°™ė€ ėŠšėˆ˜(똈: --bw-limit 1G)ëĨŧ ė§€ė •í•  눘 ėžˆėŠĩ니다. -t, --tail íŦ기 패ëĻŦ티 ë””ėŠ¤íŦė˜ ė§€ė •ëœ ęŧŦëĻŦ íŦ기 ė´í•˜ëĨŧ ė‚ŦėšŠí•˜ëŠ” 파ėŧ로 ëĒŠëĄė„ ė œí•œí•Šë‹ˆë‹¤. K, M, G, T뙀 ę°™ė€ ë°°ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다 (똈: --tail 1G). ė´ ė˜ĩė…˜ė€ `locate` ëĒ…ë šęŗŧ 함ęģ˜ ė‚ŦėšŠí•  때만 ėœ íš¨í•Šë‹ˆë‹¤. -A, --stats ėļ”ę°€ ė •ëŗ´ëĨŧ ëŗ´ė—ŦėŖŧ는 확ėžĨ된 ėƒíƒœ ëŗ´ę¸°ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. í™”ëŠ´ė—ëŠ” 두 ę°œė˜ 그래프가 í‘œė‹œëŠë‹ˆë‹¤: ė˛Ģ ë˛ˆė§¸ 그래프는 각 ë””ėŠ¤íŦ뗐 대한 버íŧ링된 ėŠ¤íŠ¸ëŧė´í”„ ėˆ˜ė™€ 함ęģ˜ í•´ë‹š ë””ėŠ¤íŦė—ė„œ 현ėžŦ ė•Ąė„¸ėŠ¤ ė¤‘ė¸ 파ėŧė˜ ę˛Ŋ로ëĨŧ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 가ėžĨ 느ëϰ ë””ėŠ¤íŦ는 ė‚ŦėšŠ 가ëŠĨ한 버íŧ가 ė—†ėœŧ늰, ė´ëŠ” ë‹Ŧė„ą 가ëŠĨ한 ėĩœëŒ€ ëŒ€ė—­í­ė„ ę˛°ė •í•Šë‹ˆë‹¤. 두 ë˛ˆė§¸ 그래프는 ė§€ë‚œ 100봈 ë™ė•ˆ 대기하는 데 ė†Œëš„ëœ ė‹œę°„ė˜ ë°ąëļ„ėœ¨ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. 가ėžĨ 느ëϰ ë””ėŠ¤íŦ가 대ëļ€ëļ„ė˜ 대기 ė‹œę°„ė„ ėœ ë°œí•  것ėœŧ로 ė˜ˆėƒë˜ëŠ°, 다ëĨ¸ ë””ėŠ¤íŦ는 버íŧ링된 ėŠ¤íŠ¸ëŧė´í”„ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėœŧë¯€ëĄœ 대기 ė‹œę°„ė´ ęą°ė˜ 또는 ė „í˜€ 뗆떴ė•ŧ 합니다. ė´ 그래프는 또한 í•´ė‹œ ęŗ„ė‚° 및 RAID ęŗ„ė‚°ė„ ėœ„í•´ ė†Œëš„ëœ ė‹œę°„ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. ëĒ¨ë“  ęŗ„ė‚°ė€ ë””ėŠ¤íŦ ėž‘ė—…ęŗŧ ëŗ‘ë Ŧ로 ė‹¤í–‰ëŠë‹ˆë‹¤. 따ëŧė„œ ė ė–´ë„ í•˜ë‚˜ė˜ ë””ėŠ¤íŦ뗐 대해 ė¸Ąė • 가ëŠĨ한 대기 ė‹œę°„ė´ ėžˆëŠ” 한, ė´ëŠ” CPU가 ė›ŒíŦëĄœë“œė— ėļŠëļ„히 ëš ëĨ´ë‹¤ëŠ” ę˛ƒė„ 나타냅니다. -Z, --force-zero ė´ė „ė— 0ė´ ė•„ë‹ˆė—ˆë˜ íŦ기가 0ė¸ 파ėŧė˜ 동기화ëŧ는 ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ė„ ę°•ė œí•Šë‹ˆë‹¤. SnapRAID가 ė´ëŸŦ한 ėĄ°ęą´ė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ė‹œėŠ¤í…œ ėļŠëŒ 후 ėŧëļ€ ė•Ąė„¸ėŠ¤ëœ 파ėŧė´ ėž˜ë ¸ė„ 때 ė‰Ŋ枌 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ė´ëŠ” ext3/ext4 파ėŧ ė‹œėŠ¤í…œė„ ė‚ŦėšŠí•˜ëŠ” Linuxė—ė„œ 가ëŠĨ한 ėĄ°ęą´ėž…ë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -E, --force-empty ė›ëž˜ ë””ėŠ¤íŦ뗐 ėžˆë˜ ëĒ¨ë“  파ėŧė´ 누ëŊ된 ë””ėŠ¤íŦė˜ 동기화ëŧ는 ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ė„ ę°•ė œí•Šë‹ˆë‹¤. SnapRAID가 ë””ėŠ¤íŦ뗐 ė›ëž˜ ėžˆë˜ ëĒ¨ë“  파ėŧė´ 누ëŊ되거나 ë‹¤ė‹œ ėž‘ė„ąë˜ė—ˆėŒė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ë°ė´í„° 파ėŧ ė‹œėŠ¤í…œė´ ë§ˆėš´íŠ¸ë˜ė§€ ė•Šė•˜ė„ 때 ė‰Ŋ枌 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -U, --force-uuid UUID가 ëŗ€ę˛Ŋ된 ë””ėŠ¤íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 동기화, í™•ė¸ 및 ėˆ˜ė •ė„ ę°•ė œí•˜ëŠ” ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ėž…ë‹ˆë‹¤. SnapRAID가 ėŧëļ€ ë””ėŠ¤íŦė˜ UUID가 ëŗ€ę˛Ŋë˜ė—ˆėŒė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ë””ėŠ¤íŦ가 ėž˜ëĒģ된 ë§ˆėš´íŠ¸ 맀렐뗐 ë§ˆėš´íŠ¸ë˜ė—ˆė„ 때 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ꡸ëŸŦ나 단ėŧ 패ëĻŦ티ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰 í•˜ë‚˜ė˜ UUID ëŗ€ę˛Ŋė´ í—ˆėšŠë˜ëŠ°, ė—ŦëŸŦ 패ëĻŦ티ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰 더 ë§Žė€ ëŗ€ę˛Ŋė´ í—ˆėšŠëŠë‹ˆë‹¤. ė´ëŠ” ëŗĩęĩŦ 후 ë””ėŠ¤íŦëĨŧ ęĩė˛´í•  ë•Œė˜ ėŧë°˜ė ė¸ ę˛Ŋėš°ė´ę¸° 때ëŦ¸ėž…니다. ė´ ė˜ĩė…˜ė€ `sync`, `check`, 또는 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -D, --force-device ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ë””ėŠ¤íŦ 또는 동ėŧ한 ëŦŧëĻŦ렁 ėžĨėš˜ė— ėžˆëŠ” ë””ėŠ¤íŦ로 ėˆ˜ė •ė„ ę°•ė œí•˜ëŠ” ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´, 두 ę°œė˜ ë°ė´í„° ë””ėŠ¤íŦëĨŧ ėžƒęŗ  ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ만 ëŗĩęĩŦ하기 ėœ„í•´ ė˜ˆëš„ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, 두 ë˛ˆė§¸ ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ë””ėŠ¤íŦëĨŧ ëŦ´ė‹œí•  눘 ėžˆėŠĩ니다. 또는 ė´ë¯¸ ė‚ŦėšŠ ė¤‘ė¸ ë””ėŠ¤íŦ뗐 ë‚¨ė€ ė—Ŧ뜠 ęŗĩ氄뗐 ë””ėŠ¤íŦëĨŧ ëŗĩęĩŦ하려는 ę˛Ŋ뚰, 동ėŧ한 ëŦŧëĻŦ렁 ėžĨėš˜ëĨŧ ęŗĩėœ í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -N, --force-nocopy `sync`, `check`, 및 `fix`ė—ė„œ ëŗĩė‚Ŧ 氐맀 발ę˛Ŧ법(heuristic)ė„ ëš„í™œė„ąí™”í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė—†ėœŧ늴 SnapRAID는 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦí”„ė™€ ę°™ė€ 동ėŧ한 ė†ė„ąė„ 氀맄 파ėŧė´ 동ėŧ한 ë°ė´í„°ëĨŧ 氀맄 ëŗĩė‚Ŧëŗ¸ė´ëŧęŗ  ę°€ė •í•Šë‹ˆë‹¤. ė´ëŠ” 한 ë””ėŠ¤íŦė—ė„œ 다ëĨ¸ ë””ėŠ¤íŦ로 ëŗĩė‚Ŧ되거나 ė´ë™ëœ 파ėŧė„ ė‹ëŗ„í•˜ęŗ , ė´ë¯¸ ęŗ„ė‚°ëœ í•´ė‹œ ė •ëŗ´ëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ëŦ´ë‹¨ 똤ëĨ˜ëĨŧ ę°ė§€í•˜ęą°ë‚˜ 누ëŊ된 파ėŧė„ ëŗĩęĩŦ할 눘 ėžˆë„ëĄ 합니다. ėŧëļ€ ë“œëŦ¸ ę˛Ŋėš°ė— ė´ ë™ėž‘ė€ ė˜¤íƒ(false positives) 또는 ë§Žė€ í•´ė‹œ í™•ė¸ėœŧ로 ė¸í•œ 느ëϰ í”„ëĄœė„¸ėŠ¤ëĨŧ ė´ˆëž˜í•  눘 ėžˆėœŧ늰, ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ ė´ëŸŦ한 ëŦ¸ė œëĨŧ 해결할 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `sync`, `check`, 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -F, --force-full `sync`ė—ė„œ 패ëĻŦí‹°ė˜ 렄랴 ėžŦęŗ„ė‚°ė„ ę°•ė œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ 냈 패ëĻŦ티 ėˆ˜ė¤€ė„ ėļ”ę°€í•˜ęą°ë‚˜, 더 ėĩœęˇŧė˜ 패ëĻŦ티 ë°ė´í„°ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė´ė „ content 파ėŧ로 ë˜ëŒë ¸ė„ 때 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ė˛˜ėŒëļ€í„° 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•˜ëŠ” ëŒ€ė‹ , ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ content 파ėŧ뗐 ėžˆëŠ” í•´ė‹œëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ë°ė´í„°ëĨŧ 검ėĻí•˜ęŗ  ę¸°ėĄ´ 패ëĻŦ티 ë°ė´í„°ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ `sync` í”„ëĄœė„¸ėŠ¤ 뤑뗐 ë°ė´í„° ëŗ´í˜¸ëĨŧ ėœ ė§€í•  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -R, --force-realloc `sync`ė—ė„œ 파ėŧė˜ 렄랴 ėžŦ할당 및 패ëĻŦ티 ėžŦ빌드ëĨŧ ę°•ė œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ content 파ėŧ뗐 ėžˆëŠ” í•´ė‹œëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ë°ė´í„°ëĨŧ 검ėĻí•˜ëŠ´ė„œ 단편화ëĨŧ ė œęą°í•˜ęŗ  ëĒ¨ë“  파ėŧė„ ė™„ė „ížˆ ėžŦ할당하는 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė‚ŦėšŠí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. `sync` ėž‘ė—… ė¤‘ė—ëŠ” ë°ė´í„° ëŗ´í˜¸ę°€ ė—†ėŠĩ니다. -W, --force-realloc-tail íŦ기 -R, --force-reallocęŗŧ ę°™ė´ ėž‘ë™í•˜ė§€ë§Œ, 각 패ëĻŦ티 파ėŧė˜ ė§€ė •ëœ ęŧŦëĻŦ ëļ€ëļ„(ë§ˆė§€ë§‰ 'íŦ기' ë°”ė´íŠ¸)ėœŧ로 ė œí•œëŠë‹ˆë‹¤. 현ėžŦ 해당 ęŧŦëĻŦ ė„šė…˜ė— ė €ėžĨ된 ëĒ¨ë“  파ėŧ ėĄ°ę°/ë¸”ëĄė˜ ėžŦ할당(ė´ë™)ė„ ę°•ė œí•˜ė—Ŧ, ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ” 패ëĻŦ티 파ėŧ ë‚´ė˜ ė–´ëŠ ęŗŗė´ë“ (ę¸°ėĄ´ 뚈 ęŗĩ간 íŦ함) ë°°ėš˜ë  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė˜ ėŖŧėš” ëĒŠė ė€ 패ëĻŦ티 파ėŧė˜ ë””ėŠ¤íŦ냁 íŦ기ëĨŧ ė¤„ė´ëŠ” ę˛ƒėž…ë‹ˆë‹¤. ėžŦí• ë‹šė„ í†ĩ해 렄랴 ęŧŦëĻŦ ė„šė…˜ė´ ė„ąęŗĩ렁ėœŧ로 ëš„ė›Œė§€ëŠ´(ë‚¨ė€ ë¸”ëĄė´ ė—†ėŒ), 패ëĻŦ티 파ėŧė´ ėž˜ëĻŦęŗ (truncated) ė‚ŦėšŠë˜ė§€ ė•ŠëŠ” ęŧŦëĻŦ ęŗĩę°„ė„ íšŒėˆ˜í•Šë‹ˆë‹¤. K, M, G, T뙀 ę°™ė€ ë°°ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다 (똈: --force-realloc-tail 1G). locate -t, --tailė„ ė‚ŦėšŠí•˜ė—Ŧ 똁í–Ĩė„ 받는 파ėŧė„ ė‚Ŧ렄뗐 í™•ė¸í•  눘 ėžˆėŠĩ니다. ę˛Ŋęŗ ! ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė‚ŦėšŠí•˜ė§€ ė•Šė„ ę˛ƒė„ 강ë Ĩ히 ęļŒėžĨ합니다. 똁í–Ĩė„ 받는 파ėŧ뗐 ëŒ€í•´ė„œëŠ” `sync` ėž‘ė—… ë™ė•ˆ ë°ė´í„° ëŗ´í˜¸ëĨŧ ë°›ė„ 눘 ė—†ėŠĩ니다. -l, --log FILE ė§€ė •ëœ 파ėŧ뗐 ėžė„¸í•œ 로그ëĨŧ 기록합니다. ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•Šėœŧ늴 ė˜ˆėƒėš˜ ëĒģ한 똤ëĨ˜ę°€ í™”ëŠ´ė— ėļœë Ĩë˜ė–´, ë§Žė€ 똤ëĨ˜ę°€ ë°œėƒí•˜ëŠ” ę˛Ŋ뚰 ęŗŧ도한 ėļœë Ĩė´ ë°œėƒí•  눘 ėžˆėŠĩ니다. -l, --log가 ė§€ė •ë˜ëŠ´ SnapRAID가 ė¤‘ė§€ë˜ëŠ” ėš˜ëĒ…ė ė¸ 똤ëĨ˜ë§Œ í™”ëŠ´ė— ėļœë Ĩ됩니다. ę˛Ŋ로가 `>>`로 ė‹œėž‘í•˜ëŠ´ 파ėŧė´ ėļ”ę°€ ëĒ¨ë“œëĄœ ė—´ëĻŊ니다. ė´ëĻ„ė˜ `%D`뙀 `%T`는 YYYYMMDD 및 HHMMSS í˜•ė‹ė˜ ë‚ ė§œ 및 ė‹œę°„ėœŧ로 ëŒ€ė˛´ëŠë‹ˆë‹¤. Windows ë°°ėš˜ 파ėŧė—ė„œëŠ” `%` ëŦ¸ėžëĨŧ 두 배로 늘려ė•ŧ 합니다(똈: result-%%D.log). `>>`ëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė´ëĻ„ė„ ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다(똈: `">>result.log"`). 로그ëĨŧ í‘œė¤€ ėļœë Ĩ 또는 í‘œė¤€ 똤ëĨ˜ëĄœ ėļœë Ĩ하려면 각각 `">&1"` 및 `">&2"`ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 로그 태그 네ëĒ…ė€ snapraid_log.txt 파ėŧ 또는 man íŽ˜ė´ė§€ëĨŧ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. -L, --error-limit NUMBER ė‹¤í–‰ė„ ė¤‘ė§€í•˜ę¸° 렄뗐 ėƒˆëĄœėš´ 똤ëĨ˜ ė œí•œė„ ė„¤ė •í•Šë‹ˆë‹¤. ę¸°ëŗ¸ė ėœŧ로 SnapRAID는 100氜 ė´ėƒė˜ ėž…ėļœë Ĩ 똤ëĨ˜ę°€ ë°œėƒí•˜ëŠ´ ė¤‘ė§€ëŠë‹ˆë‹¤. ė´ëŠ” ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•  가ëŠĨė„ąė´ ėžˆėŒė„ 나타냅니다. ė´ ė˜ĩė…˜ė€ `sync` 및 `scrub`뗐 똁í–Ĩė„ ë¯¸ėš˜ëŠ°, ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ 똤ëĨ˜ ė„¸íŠ¸ í›„ė— ęŗ„ė† ė§„í–‰í•˜ė—Ŧ ėž‘ė—…ė„ ė™„ëŖŒí•˜ë ¤ęŗ  ė‹œë„í•  눘 ėžˆë„ëĄ í—ˆėšŠí•Šë‹ˆë‹¤. ꡸ëŸŦ나 `check` 및 `fix`는 í•­ėƒ ė˛Ģ ë˛ˆė§¸ 똤ëĨ˜ė—ė„œ ė¤‘ė§€ëŠë‹ˆë‹¤. -S, --start BLKSTART ė§€ė •ëœ 블록 번호ëļ€í„° 래ëĻŦëĨŧ ė‹œėž‘í•Šë‹ˆë‹¤. ė´ëŠ” ė†ėƒëœ ë””ėŠ¤íŦė˜ ę˛Ŋ뚰 íŠšė • ë¸”ëĄė„ ë‹¤ė‹œ í™•ė¸í•˜ęą°ë‚˜ ėˆ˜ė •í•˜ëŠ” 데 ėœ ėšŠí•  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ ėŖŧ로 溠揉 ėˆ˜ë™ ëŗĩęĩŦëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. -B, --count BLKCOUNT ė§€ė •ëœ ėˆ˜ė˜ 블록만 래ëĻŦ합니다. ė´ ė˜ĩė…˜ė€ ėŖŧ로 溠揉 ėˆ˜ë™ ëŗĩęĩŦëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. -C, --gen-conf CONTENT ę¸°ėĄ´ content 파ėŧė—ė„œ 더미 네렕 파ėŧė„ ėƒė„ąí•Šë‹ˆë‹¤. 네렕 파ėŧė€ í‘œė¤€ ėļœë Ĩėœŧ로 ėž‘ė„ąë˜ëŠ° ę¸°ėĄ´ 파ėŧė„ ëŽė–´ė“°ė§€ ė•ŠėŠĩ니다. ė´ 네렕 파ėŧė—ëŠ” 렄랴 ė‹œėŠ¤í…œė„ ėžƒė„ ę˛Ŋ뚰 ë””ėŠ¤íŦ ë§ˆėš´íŠ¸ ė§€ė ė„ ėžŦęĩŦė„ąí•˜ëŠ” 데 í•„ėš”í•œ ė •ëŗ´ë„ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. -v, --verbose í™”ëŠ´ė— 더 ë§Žė€ ė •ëŗ´ëĨŧ ėļœë Ĩ합니다. 한 번 ė§€ė •í•˜ëŠ´ ė œė™¸ëœ 파ėŧ 및 ėļ”ę°€ í†ĩęŗ„ëĨŧ ėļœë Ĩ합니다. ė´ ė˜ĩė…˜ė€ 로그 파ėŧė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. -q, --quiet í™”ëŠ´ė— 더 ė ė€ ė •ëŗ´ëĨŧ ėļœë Ĩ합니다. 한 번 ė§€ė •í•˜ëŠ´ ė§„í–‰ëĨ  í‘œė‹œė¤„ė„ ė œęą°í•˜ęŗ , 두 번 ė§€ė •í•˜ëŠ´ ė‹¤í–‰ ė¤‘ė¸ ėž‘ė—…ė„ ė œęą°í•˜ëŠ°, 넏 번 ė§€ė •í•˜ëŠ´ ė •ëŗ´ ëŠ”ė‹œė§€ëĨŧ ė œęą°í•˜ęŗ , 네 번 ė§€ė •í•˜ëŠ´ ėƒíƒœ ëŠ”ė‹œė§€ëĨŧ ė œęą°í•Šë‹ˆë‹¤. ėš˜ëĒ…ė ė¸ 똤ëĨ˜ëŠ” í•­ėƒ í™”ëŠ´ė— ėļœë Ĩ됩니다. ė´ ė˜ĩė…˜ė€ 로그 파ėŧė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. -H, --help 간단한 ë„ė›€ë§ í™”ëŠ´ė„ ėļœë Ĩ합니다. -V, --version 프로그램 ë˛„ė „ė„ ėļœë Ĩ합니다. Configuration SnapRAID는 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ėœ„ėš˜ė™€ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ할 ėœ„ėš˜ëĨŧ ė•Œę¸° ėœ„í•´ 네렕 파ėŧė´ í•„ėš”í•Šë‹ˆë‹¤. Unixė—ė„œëŠ” `/usr/local/etc/snapraid.conf` 파ėŧė´ ėĄ´ėžŦ하면 ė‚ŦėšŠí•˜ęŗ , ęˇ¸ë ‡ė§€ ė•Šėœŧ늴 `/etc/snapraid.conf`ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. Windowsė—ė„œëŠ” `snapraid.exe`뙀 ę°™ė€ 디렉토ëĻŦ뗐 ėžˆëŠ” `snapraid.conf` 파ėŧė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ë‹¤ėŒ ė˜ĩė…˜ė´ íŦí•¨ë˜ė–´ė•ŧ 합니다(ëŒ€ė†ŒëŦ¸ėž ęĩŦëļ„): parity FILE [,FILE] ... 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. 패ëĻŦ티는 RAID5뙀 뜠ė‚Ŧ하게 단ėŧ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗ´í˜¸ëĨŧ 가ëŠĨ하게 합니다. ė—ŦëŸŦ 파ėŧė„ ė§€ė •í•  눘 ėžˆėœŧ늰, ė´ë“¤ė€ ė„œëĄœ 다ëĨ¸ ë””ėŠ¤íŦ뗐 ėžˆė–´ė•ŧ 합니다. í•˜ë‚˜ė˜ 파ėŧė´ 더 ė´ėƒ ėģ¤ė§ˆ 눘 ė—†ė„ 때 ë‹¤ėŒ 파ėŧė´ ė‚ŦėšŠëŠë‹ˆë‹¤. ė´ ė‚ŦėšŠ 가ëŠĨ한 ęŗĩę°„ė€ ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 ë°ė´í„° ë””ėŠ¤íŦëŗ´ë‹¤ ė ė–´ë„ ėģ¤ė•ŧ 합니다. ë‚˜ė¤‘ė— ėļ”ę°€ 패ëĻŦ티 파ėŧė„ ėļ”가할 눘 ėžˆė§€ë§Œ, ėˆœė„œëĨŧ 바꾸거나 ė œęą°í•  ėˆ˜ëŠ” ė—†ėŠĩ니다. 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ 패ëĻŦí‹°ėšŠėœŧ로 똈ė•Ŋ하면 ë‹¨íŽ¸í™”ë˜ė§€ ė•Šė•„ ė„ąëŠĨė´ í–ĨėƒëŠë‹ˆë‹¤. Windowsė—ė„œëŠ” ë””ėŠ¤íŦ가 가득 ė°ŧ다는 ę˛Ŋęŗ ëĨŧ í”ŧ하기 ėœ„í•´ 각 ë””ėŠ¤íŦ뗐 256MB가 ė‚ŦėšŠë˜ė§€ ė•Šė€ ėą„ëĄœ 남ėŠĩ니다. ė´ ė˜ĩė…˜ė€ í•„ėˆ˜ė´ëŠ° 한 번만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. (2,3,4,5,6)-parity FILE [,FILE] ... ėļ”ę°€ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. ė§€ė •ëœ 각 패ëĻŦ티 ėˆ˜ė¤€ė— 대해 í•˜ë‚˜ė˜ ėļ”ę°€ ëŗ´í˜¸ ėˆ˜ė¤€ė´ í™œė„ąí™”ëŠë‹ˆë‹¤: * 2-parity는 RAID6 ė´ė¤‘ 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 3-parity는 ė‚ŧ뤑 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 4-parity는 ėŋŧ드(4뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 5-parity는 펜타(5뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 6-parity는 í—Ĩė‚Ŧ(6뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. 각 패ëĻŦ티 ėˆ˜ė¤€ė€ ëĒ¨ë“  ė´ė „ 패ëĻŦ티 ėˆ˜ė¤€ė˜ ėĄ´ėžŦëĨŧ í•„ėš”ëĄœ 합니다. `parity` ė˜ĩė…˜ęŗŧ 동ėŧ한 ęŗ ë ¤ ė‚Ŧí•­ė´ ė ėšŠëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ė„ íƒ ė‚Ŧí•­ė´ëŠ° 한 번만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. z-parity FILE [,FILE] ... ė‚ŧ뤑 패ëĻŦ티ëĨŧ ė €ėžĨ하는 ëŒ€ė˛´ 파ėŧ 및 í˜•ė‹ė„ ė •ė˜í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `3-parity`ė˜ ëŒ€ė•ˆė´ëŠ°, ėŖŧ로 SSSE3 ëĒ…ë šė–´ ė„¸íŠ¸ëĨŧ ė§€ė›í•˜ė§€ ė•ŠëŠ” ARM 또는 AMD Phenom, Athlon, Opteronęŗŧ ę°™ė€ ė €ę°€í˜• CPUëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ė´ëŸŦ한 ę˛Ŋ뚰 더 ë‚˜ė€ ė„ąëŠĨė„ 렜ęŗĩ합니다. ė´ í˜•ė‹ė€ ZFS RAIDZ3ė—ė„œ ė‚ŦėšŠë˜ëŠ” 것ęŗŧ 뜠ė‚Ŧí•˜ė§€ë§Œ 더 ëš ëĻ…ë‹ˆë‹¤. ZFS뙀 마ė°Ŧę°€ė§€ëĄœ ė‚ŧ뤑 패ëĻŦ티 ė´ėƒė—ė„œëŠ” ėž‘ë™í•˜ė§€ ė•ŠėŠĩ니다. `3-parity`ëĨŧ ė‚ŦėšŠí•  때 ė„ąëŠĨ í–Ĩėƒė„ ėœ„í•´ `z-parity` í˜•ė‹ė„ ė‚ŦėšŠí•˜ëŠ” ę˛ƒė´ ęļŒėžĨ되는 ę˛Ŋ뚰 ę˛Ŋęŗ ëĨŧ 받게 됩니다. ė›í•˜ëŠ” z-parity 또는 3-parity 파ėŧ로 네렕 파ėŧė„ ėĄ°ė •í•˜ęŗ  `fix`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ë‹¤ė‹œ ėƒė„ąí•¨ėœŧëĄœė¨ 한 í˜•ė‹ė—ė„œ 다ëĨ¸ í˜•ė‹ėœŧ로 ëŗ€í™˜í•  눘 ėžˆėŠĩ니다. content FILE ë””ėŠ¤íŦ ė–´ë ˆė´ė— ėžˆëŠ” ëĒ¨ë“  파ėŧė˜ ëĒŠëĄęŗŧ 랴íŦė„Ŧė„ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. ë°ė´í„°, 패ëĻŦ티 또는 ė‚ŦėšŠ 가ëŠĨ한 다ëĨ¸ ë””ėŠ¤íŦ뗐 ë°°ėš˜í•  눘 ėžˆėŠĩ니다. ë°ė´í„° ë””ėŠ¤íŦëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, ė´ 파ėŧė€ `sync` í”„ëĄœė„¸ėŠ¤ė—ė„œ ėžë™ėœŧ로 ė œė™¸ëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ í•„ėˆ˜ė´ëŠ° 동ėŧ한 파ėŧė˜ ė—ŦëŸŦ ëŗĩė‚Ŧëŗ¸ė„ ė €ėžĨ하기 ėœ„í•´ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė‚ŦėšŠëœ 각 패ëĻŦ티 ë””ėŠ¤íŦ뗐 대해 ėĩœė†Œí•œ í•˜ë‚˜ė˜ ëŗĩė‚Ŧëŗ¸ė„ ė €ėžĨ해ė•ŧ 하며, 하나ëĨŧ 더 ėļ”가해ė•ŧ 합니다. ėļ”ę°€ ëŗĩė‚Ŧëŗ¸ė„ ė‚ŦėšŠí•´ë„ í•´ëĄ­ė§€ ė•ŠėŠĩ니다. data NAME DIR ė–´ë ˆė´ė˜ ë°ė´í„° ë””ėŠ¤íŦė˜ ė´ëĻ„ęŗŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ė •ė˜í•Šë‹ˆë‹¤. NAMEė€ ë””ėŠ¤íŦëĨŧ ė‹ëŗ„í•˜ëŠ” 데 ė‚ŦėšŠë˜ëŠ° ęŗ ėœ í•´ė•ŧ 합니다. DIRė€ 파ėŧ ė‹œėŠ¤í…œė—ė„œ ë””ėŠ¤íŦė˜ ë§ˆėš´íŠ¸ ė§€ė ėž…ë‹ˆë‹¤. NAMEė„ ęŗ ė •ëœ ėƒíƒœëĄœ ėœ ė§€í•˜ëŠ” 한, í•„ėš”ė— 따ëŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ëŗ€ę˛Ŋ할 눘 ėžˆėŠĩ니다. ė–´ë ˆė´ė˜ 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 대해 í•˜ë‚˜ė˜ ė˜ĩė…˜ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. ë‚˜ė¤‘ė— 네렕 파ėŧė—ė„œ 링렑 NAMEė„ ëŗ€ę˛Ŋí•˜ęŗ  `sync` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ë””ėŠ¤íŦė˜ ė´ëĻ„ė„ 바ęŋ€ 눘 ėžˆėŠĩ니다. ė´ëĻ„ ëŗ€ę˛Ŋė˜ ę˛Ŋ뚰, ë””ėŠ¤íŦė˜ ė €ėžĨ된 UUIDëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė—°ę˛°ëŠë‹ˆë‹¤. extra NAME DIR `smart` 및 `probe` ëĒ…ë šėœŧ로 ëĒ¨ë‹ˆí„°ë§í•  ėļ”ę°€ ë””ėŠ¤íŦė˜ ė´ëĻ„ęŗŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ė •ė˜í•Šë‹ˆë‹¤. ė´ę˛ƒė€ ëļ€íŒ… ë””ėŠ¤íŦ뙀 ę°™ė´ ė–´ë ˆė´ė˜ ėŧëļ€ëŠ” ė•„ë‹ˆė§€ë§Œ ė‹œėŠ¤í…œ ėž‘ë™ė— í•„ėš” 한 ë””ėŠ¤íŦëĨŧ ëĒ¨ë‹ˆí„°ë§í•˜ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. ė´ëŸŦ한 ë””ėŠ¤íŦ는 í•­ėƒ íšŒė „í•  것ėœŧ로 ė˜ˆėƒë˜ë¯€ëĄœ `up` 및 `down` ëĒ…ë šė˜ 똁í–Ĩė„ ë°›ė§€ ė•ŠėŠĩ니다. nohidden ëĒ¨ë“  ėˆ¨ę˛¨ė§„ 파ėŧ 및 디렉토ëĻŦëĨŧ ė œė™¸í•Šë‹ˆë‹¤. Unixė—ė„œëŠ” ėˆ¨ę˛¨ė§„ 파ėŧė€ '.'ėœŧ로 ė‹œėž‘í•˜ëŠ” 파ėŧėž…ë‹ˆë‹¤. Windowsė—ė„œëŠ” ėˆ¨ęš€ ė†ė„ąė„ 氀맄 파ėŧėž…ë‹ˆë‹¤. exclude/include PATTERN sync í”„ëĄœė„¸ėŠ¤ė—ė„œ ė œė™¸í•˜ęą°ë‚˜ íŦ함할 파ėŧ 또는 디렉토ëĻŦ íŒ¨í„´ė„ ė •ė˜í•Šë‹ˆë‹¤. ëĒ¨ë“  íŒ¨í„´ė€ ė§€ė •ëœ ėˆœė„œëŒ€ëĄœ 래ëĻŦ됩니다. ėŧėš˜í•˜ëŠ” ė˛Ģ ë˛ˆė§¸ íŒ¨í„´ė´ `exclude` íŒ¨í„´ė´ëŠ´ 파ėŧė€ ė œė™¸ëŠë‹ˆë‹¤. `include` íŒ¨í„´ė´ëŠ´ 파ėŧė€ íŦ함됩니다. ėŧėš˜í•˜ëŠ” íŒ¨í„´ė´ ė—†ėœŧ늴, ė§€ė •ëœ ë§ˆė§€ë§‰ íŒ¨í„´ė´ `include`ė´ëŠ´ 파ėŧė€ ė œė™¸ë˜ęŗ , `exclude`ė´ëŠ´ íŦ함됩니다. 패턴 ė‚Ŧ떑뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ PATTERN ė„šė…˜ė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. blocksize SIZE_IN_KIBIBYTES 패ëĻŦí‹°ė˜ ę¸°ëŗ¸ 블록 íŦ기ëĨŧ í‚¤ëš„ë°”ė´íŠ¸(kibibyte) ë‹¨ėœ„ëĄœ ė •ė˜í•Šë‹ˆë‹¤. 1í‚¤ëš„ë°”ė´íŠ¸ëŠ” 1024ë°”ė´íŠ¸ėž…ë‹ˆë‹¤. ę¸°ëŗ¸ 블록 íŦ기는 256ė´ëŠ°, 대ëļ€ëļ„ė˜ ę˛Ŋėš°ė— ėž‘ë™í•´ė•ŧ 합니다. **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė´ ę°’ė„ ëŗ€ę˛Ŋí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. ë‚˜ė¤‘ė— ė´ ę°’ė„ ëŗ€ę˛Ŋ하려면 렄랴 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•´ė•ŧ 합니다! 다ëĨ¸ 블록 íŦ기ëĨŧ ė‚ŦėšŠí•˜ëŠ” ė´ėœ ëŠ” ėˆ˜ë°ąë§Œ ę°œė˜ ėž‘ė€ 파ėŧė´ ë§Žė€ ę˛Ŋėš°ėž…ë‹ˆë‹¤. 각 파ėŧ뗐 대해, ëLJ ë°”ė´íŠ¸ë§Œ ėžˆė–´ë„ 렄랴 패ëĻŦ티 ë¸”ëĄė´ 할당되며, 파ėŧė´ 많ėœŧ늴 ėƒë‹ší•œ 미ė‚ŦėšŠ 패ëĻŦ티 ęŗĩę°„ė´ ë°œėƒí•  눘 ėžˆėŠĩ니다. 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ ė™„ė „ížˆ ėą„ėš°ëŠ´ ë°ė´í„° ë””ėŠ¤íŦ뗐 더 ė´ėƒ 파ėŧė„ ėļ”가할 눘 ė—†ėŠĩ니다. ꡸ëŸŦ나 낭비된 패ëĻŦ티는 ë°ė´í„° ë””ėŠ¤íŦ 렄랴뗐 ęą¸ėŗ ėļ•ė ë˜ė§€ ė•ŠėŠĩ니다. ë°ė´í„° ë””ėŠ¤íŦė˜ ë§Žė€ 파ėŧ로 ė¸í•´ ë°œėƒí•˜ëŠ” 낭비된 ęŗĩę°„ė€ 다ëĨ¸ ë°ė´í„° ë””ėŠ¤íŦ가 ė•„ë‹Œ 해당 ë°ė´í„° ë””ėŠ¤íŦė˜ ë°ė´í„° ė–‘ë§Œ ė œí•œí•Šë‹ˆë‹¤. 대ëžĩ렁ėœŧ로, 각 파ėŧ뗐 대해 블록 íŦę¸°ė˜ ė ˆë°˜ė´ ë‚­ëš„ëœë‹¤ęŗ  ę°€ė •í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 100,000ę°œė˜ 파ėŧęŗŧ 256KiB 블록 íŦ기로 12.8GBė˜ 패ëĻŦ티가 낭비되며, ė´ëŠ” ë°ė´í„° ë””ėŠ¤íŦė—ė„œ 12.8GBė˜ ė‚ŦėšŠ 가ëŠĨ한 ęŗĩę°„ė´ ė¤„ė–´ë“¤ 눘 ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. `status`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 각 ë””ėŠ¤íŦė˜ 낭비된 ęŗĩę°„ė˜ ė–‘ė„ í™•ė¸í•  눘 ėžˆėŠĩ니다. ė´ëŠ” ë°ė´í„° ë””ėŠ¤íŦ뗐 ëš„ė›Œ 두거나 ė–´ë ˆė´ė— íŦí•¨ë˜ė§€ ė•Šė€ 파ėŧ뗐 ė‚ŦėšŠí•´ė•ŧ 하는 ęŗĩę°„ė˜ ė–‘ėž…ë‹ˆë‹¤. ė´ ę°’ė´ ėŒėˆ˜ė´ëŠ´ 패ëĻŦ티ëĨŧ ęą°ė˜ ėą„ėš°ęŗ  ėžˆėŒė„ ė˜ë¯¸í•˜ëŠ°, ė—Ŧė „ížˆ 낭비할 눘 ėžˆëŠ” ęŗĩę°„ė„ 나타냅니다. ė´ ëŦ¸ė œëĨŧ í”ŧ하려면 패ëĻŦí‹°ė— 대해 더 큰 íŒŒí‹°ė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 패ëĻŦ티 íŒŒí‹°ė…˜ė´ ë°ė´í„° ë””ėŠ¤íŦëŗ´ë‹¤ 12.8GB 더 큰 ę˛Ŋ뚰, 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 ėĩœëŒ€ 100,000ę°œė˜ 파ėŧė„ 낭비되는 ęŗĩ간 ė—†ė´ 래ëĻŦ할 눘 ėžˆëŠ” ėļŠëļ„한 ėļ”ę°€ ęŗĩę°„ė´ ėžˆėŠĩ니다. Linuxė—ė„œ 더 큰 패ëĻŦ티 íŒŒí‹°ė…˜ė„ ė–ģ는 트ëĻ­ė€ ë‹¤ėŒ ëĒ…ë šėœŧ로 íŦ맷하는 ę˛ƒėž…ë‹ˆë‹¤: :mkfs.ext4 -m 0 -T largefile4 DEVICE ė´ëĄœ ė¸í•´ ė•Ŋ 1.5%ė˜ ėļ”ę°€ ęŗĩę°„ė´ ë°œėƒí•˜ëŠ°, 4TB ë””ėŠ¤íŦė˜ ę˛Ŋ뚰 ė•Ŋ 60GB로, 낭비되는 ęŗĩ간 ė—†ė´ 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 ė•Ŋ 460,000ę°œė˜ 파ėŧė„ í—ˆėšŠí•Šë‹ˆë‹¤. hashsize SIZE_IN_BYTES ė €ėžĨ된 ë¸”ëĄė˜ í•´ė‹œ íŦ기ëĨŧ ë°”ė´íŠ¸ ë‹¨ėœ„ëĄœ ė •ė˜í•Šë‹ˆë‹¤. ę¸°ëŗ¸ í•´ė‹œ íŦ기는 16ë°”ė´íŠ¸(128비트)ė´ëŠ°, 대ëļ€ëļ„ė˜ ę˛Ŋėš°ė— ėž‘ë™í•´ė•ŧ 합니다. **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė´ ę°’ė„ ëŗ€ę˛Ŋí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. ë‚˜ė¤‘ė— ė´ ę°’ė„ ëŗ€ę˛Ŋ하려면 렄랴 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•´ė•ŧ 합니다! 다ëĨ¸ í•´ė‹œ íŦ기ëĨŧ ė‚ŦėšŠí•˜ëŠ” ė´ėœ ëŠ” ė‹œėŠ¤í…œė˜ 메ëǍëĻŦ가 ė œí•œė ė¸ ę˛Ŋėš°ėž…ë‹ˆë‹¤. ę˛Ŋí—˜ėƒ SnapRAID는 ė–´ë ˆė´ė˜ 16TB ë°ė´í„°ë‹š ėŧë°˜ė ėœŧ로 1GiBė˜ RAMė„ í•„ėš”ëĄœ 합니다. ęĩŦ랴렁ėœŧ로, ë°ė´í„°ė˜ í•´ė‹œëĨŧ ė €ėžĨ하기 ėœ„í•´ SnapRAID는 대ëžĩ TS*(1+HS)/BS ë°”ė´íŠ¸ė˜ RAMė„ í•„ėš”ëĄœ 합니다. ė—Ŧę¸°ė„œ TS는 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ė´ íŦ기(ë°”ė´íŠ¸), BS는 블록 íŦ기(ë°”ė´íŠ¸), HS는 í•´ė‹œ íŦ기(ë°”ė´íŠ¸)ėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´, 4TB ë””ėŠ¤íŦ 8氜, 블록 íŦ기 256KiB (1KiB = 1024ë°”ė´íŠ¸), í•´ė‹œ íŦ기 16ė¸ ę˛Ŋ뚰 ë‹¤ėŒęŗŧ 같ėŠĩ니다: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB í•´ė‹œ íŦ기ëĨŧ 8로 ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB 블록 íŦ기ëĨŧ 512로 ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB í•´ė‹œ íŦ기ëĨŧ 8로, 블록 íŦ기ëĨŧ 512로 ëĒ¨ë‘ ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB autosave SIZE_IN_GIGABYTES ė§€ė •ëœ GB ė–‘ė´ 래ëĻŦ된 후 동기화 또는 늤íŦëŸŊ ė‹œ ėƒíƒœëĨŧ ėžë™ėœŧ로 ė €ėžĨ합니다. ė´ ė˜ĩė…˜ė€ 揰溄 ėļŠëŒ 또는 기타 ė´ë˛¤íŠ¸ëĄœ ė¸í•´ ė¤‘ë‹¨ëœ ę˛Ŋ뚰 긴 `sync` ëĒ…ë šė„ ė˛˜ėŒëļ€í„° ë‹¤ė‹œ ė‹œėž‘í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•˜ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. temp_limit TEMPERATURE_CELSIUS í—ˆėšŠë˜ëŠ” ėĩœëŒ€ ë””ėŠ¤íŦ ė˜¨ë„ëĨŧ ė„­ė”¨ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ė§€ė •ë˜ëŠ´ SnapRAID는 smartctl 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėŖŧ揰렁ėœŧ로 ëĒ¨ë“  ë””ėŠ¤íŦė˜ ė˜¨ë„ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. SnapRAID가 ėž‘ë™í•˜ëŠ” ë™ė•ˆ 현ėžŦ ë””ėŠ¤íŦ ė˜¨ë„ę°€ í‘œė‹œëŠë‹ˆë‹¤. ė–´ë–¤ ë””ėŠ¤íŦëŧ도 ė´ ė œí•œė„ 봈ęŗŧ하면 ëĒ¨ë“  ėž‘ė—…ė´ ė¤‘ė§€ë˜ęŗ , ë””ėŠ¤íŦ는 `temp_sleep` ė˜ĩė…˜ėœŧ로 ė •ė˜ëœ 기간 ë™ė•ˆ íšŒė „ ė¤‘ė§€ëŠë‹ˆë‹¤(대기 ëĒ¨ë“œëĄœ ė „í™˜ë¨). ė ˆė „ 기간 후 ėž‘ė—…ė´ ėžŦ개되며, ė˜¨ë„ ė œí•œė— ë‹¤ė‹œ 도ë‹Ŧ하면 ë‹¤ė‹œ ėŧė‹œ ė¤‘ė§€ë  눘 ėžˆėŠĩ니다. ėž‘ë™ 뤑뗐 SnapRAID는 각 ë””ėŠ¤íŦė˜ 氀뗴 ęŗĄė„ ė„ ëļ„ė„í•˜ęŗ  í™œë™ė´ ęŗ„ė†ë˜ëŠ´ 도ë‹Ŧ할 것ėœŧ로 ė˜ˆėƒë˜ëŠ” ėžĨ기 ė •ėƒ ė˜¨ë„ëĨŧ ėļ”ė •í•Šë‹ˆë‹¤. ėļ”ė •ė€ ë””ėŠ¤íŦ ė˜¨ë„ę°€ 네 번 ėĻę°€í•œ í›„ė—ë§Œ ėˆ˜í–‰ë˜ė–´, ė‹ ëĸ°í•  눘 ėžˆëŠ” ėļ”넏ëĨŧ ė„¤ė •í•˜ę¸°ė— ėļŠëļ„한 ë°ė´í„° íŦė¸íŠ¸ę°€ í™•ëŗ´ë˜ë„ëĄ 합니다. ė´ ė˜ˆė¸Ąëœ ė •ėƒ ė˜¨ë„ëŠ” 현ėžŦ 값 ė˜†ė— 괄호 ė•ˆė— í‘œė‹œë˜ëŠ°, ė‹œėŠ¤í…œė˜ ëƒ‰ę°ė´ ė ė ˆí•œė§€ 평가하는 데 ë„ė›€ė´ 됩니다. ė´ ėļ”ė • ė˜¨ë„ëŠ” ė •ëŗ´ 렜ęŗĩ ëĒŠė ėŧ ëŋė´ëа SnapRAIDė˜ ë™ėž‘ė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. í”„ëĄœęˇ¸ëž¨ė˜ ë™ėž‘ė€ ė˜¤ëĄœė§€ ė‹¤ė œ ė¸Ąė •ëœ ë””ėŠ¤íŦ ė˜¨ë„ė— 기반합니다. ė´ ëļ„ė„ė„ ėˆ˜í–‰í•˜ë ¤ëŠ´ SnapRAID는 ė‹œėŠ¤í…œ ė˜¨ë„ė— 대한 ė°¸ėĄ°ę°€ í•„ėš”í•Šë‹ˆë‹¤. ë¨ŧė € ė‚ŦėšŠ 가ëŠĨ한 í•˜ë“œė›¨ė–´ ė„ŧė„œė—ė„œ ėŊėœŧë ¤ęŗ  ė‹œë„í•Šë‹ˆë‹¤. ė‹œėŠ¤í…œ ė„ŧė„œė— ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ę˛Ŋ뚰, ė‹¤í–‰ ė‹œėž‘ ė‹œ ė¸Ąė •ëœ 가ėžĨ ë‚Žė€ ë””ėŠ¤íŦ ė˜¨ë„ëĨŧ ëŒ€ė˛´ ė°¸ėĄ°ëĄœ ė‚ŦėšŠí•Šë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 SnapRAID는 가ėžĨ ëœ¨ęą°ėš´ ë””ėŠ¤íŦė˜ ė˜¨ë„ë§Œ í‘œė‹œí•Šë‹ˆë‹¤. ëĒ¨ë“  ë””ėŠ¤íŦė˜ ė˜¨ë„ëĨŧ í‘œė‹œí•˜ë ¤ëŠ´ -A 또는 --stats ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. temp_sleep TIME_IN_MINUTES ė˜¨ë„ ė œí•œė— 도ë‹Ŧí–ˆė„ ë•Œė˜ 대기 ė‹œę°„(ëļ„)ė„ ė„¤ė •í•Šë‹ˆë‹¤. ė´ 기간 ë™ė•ˆ ë””ėŠ¤íŦ는 íšŒė „ 뤑맀 ėƒíƒœëĨŧ ėœ ė§€í•Šë‹ˆë‹¤. ę¸°ëŗ¸ę°’ė€ 5ëļ„ėž…ë‹ˆë‹¤. pool DIR `pool` ëĒ…ë šė„ ė‚ŦėšŠí•˜ė—Ŧ ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ę°€ėƒ 뷰가 ėƒė„ąë˜ëŠ” 풀링 디렉토ëĻŦëĨŧ ė •ė˜í•Šë‹ˆë‹¤. 디렉토ëĻŦ는 ė´ë¯¸ ėĄ´ėžŦ해ė•ŧ 합니다. share UNC_DIR ë””ėŠ¤íŦ뗐 ė›ę˛Šėœŧ로 ė•Ąė„¸ėŠ¤í•˜ëŠ” 데 í•„ėš”í•œ Windows UNC ę˛Ŋ로ëĨŧ ė •ė˜í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė§€ė •ë˜ëŠ´ 풀 디렉토ëĻŦ뗐 ėƒė„ąëœ ė‹ŦëŗŧëĻ­ 링íŦ는 ė´ UNC ę˛Ŋ로ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ë””ėŠ¤íŦ뗐 ė•Ąė„¸ėŠ¤í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė—†ėœŧ늴 ėƒė„ąëœ ė‹ŦëŗŧëĻ­ 링íŦ는 로ėģŦ ę˛Ŋ로만 ė‚ŦėšŠí•˜ëŠ°, ė´ëŠ” ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 풀 디렉토ëĻŦëĨŧ ęŗĩėœ í•˜ëŠ” ę˛ƒė„ í—ˆėšŠí•˜ė§€ ė•ŠėŠĩ니다. ė‹ŦëŗŧëĻ­ 링íŦ는 ė§€ė •ëœ UNC ę˛Ŋ로ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ í˜•ė„ąë˜ëŠ°, `data` ė˜ĩė…˜ė— ė§€ė •ëœ ë””ėŠ¤íŦ ė´ëĻ„ė´ ėļ”ę°€ë˜ęŗ , ë§ˆė§€ë§‰ėœŧ로 파ėŧ 디렉토ëĻŦ뙀 ė´ëĻ„ė´ ėļ”ę°€ëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ Windowsė—ë§Œ í•„ėš”í•Šë‹ˆë‹¤. smartctl DISK/PARITY OPTIONS... 각 ë””ėŠ¤íŦ뗐 대한 SMART ė†ė„ąė„ ė–ģ기 ėœ„í•œ ė‚ŦėšŠėž ė •ė˜ smartctl ė˜ĩė…˜ė„ ė •ė˜í•Šë‹ˆë‹¤. ė´ëŠ” RAID ėģ¨íŠ¸ëĄ¤ëŸŦ 및 ėŧëļ€ ėžë™ ę°ė§€í•  눘 ė—†ëŠ” USB ë””ėŠ¤íŦ뗐 í•„ėš”í•  눘 ėžˆėŠĩ니다. %s ėžëĻŦ í‘œė‹œėžëŠ” ėžĨėš˜ ė´ëĻ„ėœŧ로 ëŒ€ė˛´ë˜ė§€ë§Œ, RAID ėģ¨íŠ¸ëĄ¤ëŸŦ뙀 ę°™ė€ ęŗ ė •ëœ ėžĨėš˜ė—ė„œëŠ” ė„ íƒ ė‚Ŧí•­ėž…ë‹ˆë‹¤. DISK는 `data` ė˜ĩė…˜ė— ė§€ė •ëœ 것ęŗŧ 동ėŧ한 ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. PARITY는 `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, 또는 `z-parity` 뤑 í•˜ë‚˜ė˜ 패ëĻŦ티 ė´ëĻ„ėž…ë‹ˆë‹¤. ė§€ė •ëœ OPTIONSė—ė„œ `%s` ëŦ¸ėžė—´ė€ ėžĨėš˜ ė´ëĻ„ėœŧ로 ëŒ€ė˛´ëŠë‹ˆë‹¤. RAID ėģ¨íŠ¸ëĄ¤ëŸŦė˜ ę˛Ŋ뚰 ėžĨėš˜ę°€ ęŗ ė •ë˜ė–´ ėžˆė„ 가ëŠĨė„ąė´ 높ėœŧë¯€ëĄœ `%s`ëĨŧ ė‚ŦėšŠí•  í•„ėš”ę°€ ė—†ė„ 눘 ėžˆėŠĩ니다. 가ëŠĨ한 ė˜ĩė…˜ė€ smartmontools 네ëĒ…ė„œëĨŧ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices 똈: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] ë””ėŠ¤íŦ ė‹¤íŒ¨ 확ëĨ ė„ ęŗ„ė‚°í•  때 ė§€ė •ëœ SMART ė†ė„ąė„ ëŦ´ė‹œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ë””ėŠ¤íŦ가 íŠšė • ė†ė„ąė— 대해 íŠšė´í•˜ęą°ë‚˜ ė˜¤í•´ė˜ ė†Œė§€ę°€ ėžˆëŠ” ę°’ė„ ëŗ´ęŗ í•˜ëŠ” ę˛Ŋėš°ė— ėœ ėšŠí•Šë‹ˆë‹¤. DISK는 `data` ė˜ĩė…˜ė— ė§€ė •ëœ 것ęŗŧ 동ėŧ한 ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. PARITY는 `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, 또는 `z-parity` 뤑 í•˜ë‚˜ė˜ 패ëĻŦ티 ė´ëĻ„ėž…ë‹ˆë‹¤. íŠšėˆ˜ 값 *는 ëĒ¨ë“  ë””ėŠ¤íŦė—ė„œ ė†ė„ąė„ ëŦ´ė‹œí•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, ëĒ¨ë“  ë””ėŠ¤íŦė—ė„œ `Current Pending Sector Count` ė†ė„ąė„ ëŦ´ė‹œí•˜ë ¤ëŠ´: :smartignore * 197 ė˛Ģ ë˛ˆė§¸ 패ëĻŦ티 ë””ėŠ¤íŦė—ė„œë§Œ ëŦ´ė‹œí•˜ë ¤ëŠ´: :smartignore parity 197 Examples Unixė˜ ėŧë°˜ė ė¸ 네렕 ė˜ˆëŠ” ë‹¤ėŒęŗŧ 같ėŠĩ니다: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Windowsė˜ ėŧë°˜ė ė¸ 네렕 ė˜ˆëŠ” ë‹¤ėŒęŗŧ 같ėŠĩ니다: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern íŒ¨í„´ė€ íŦ함하거나 ė œė™¸í•  파ėŧė„ 필터링하는 ėœ ė—°í•œ ë°Šë˛•ė„ 렜ęŗĩ합니다. 글로빙(globbing) ëŦ¸ėžëĨŧ ė‚ŦėšŠí•˜ëŠ´ ëĒ¨ë“  ę˛Ŋ로ëĨŧ ėŧėŧė´ ë‚˜ė—´í•˜ė§€ ė•Šęŗ ë„ íŠšė • 파ėŧ ė´ëĻ„ė´ë‚˜ 렄랴 디렉토ëĻŦ ęĩŦėĄ°ė™€ ėŧėš˜í•˜ëŠ” ęˇœėš™ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. ëŦŧėŒí‘œ `?`는 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ ė œė™¸í•œ ëĒ¨ë“  단ėŧ ëŦ¸ėžė™€ ėŧėš˜í•Šë‹ˆë‹¤. ė´ëŠ” íŒ¨í„´ė„ 단ėŧ 디렉토ëĻŦ ėˆ˜ė¤€ėœŧ로 ė œí•œí•˜ëŠ´ė„œ ę°€ëŗ€ ëŦ¸ėžę°€ íŦ함된 파ėŧ ė´ëĻ„ė„ ėŧėš˜ė‹œí‚¤ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. 단ėŧ ëŗ„í‘œ `*`는 ëĒ¨ë“  ëŦ¸ėž ė‹œí€€ėŠ¤ė™€ ėŧėš˜í•˜ė§€ë§Œ, ëŦŧėŒí‘œė™€ 마ė°Ŧę°€ė§€ëĄœ 디렉토ëĻŦ ę˛Ŋęŗ„ëĨŧ ë„˜ė§€ ė•ŠėŠĩ니다. ėŠŦëž˜ė‹œė—ė„œ 늈ėļ”ë¯€ëĄœ 단ėŧ ę˛Ŋ로 ęĩŦė„ą ėš”ė†Œ ë‚´ė—ė„œė˜ ėŧėš˜ė— ė í•Ší•Šë‹ˆë‹¤. ė´ëŠ” ė‰˜ ę¸€ëĄœëš™ė—ė„œ ėĩėˆ™í•œ í‘œė¤€ 뙀ėŧë“œėš´ë“œ ë™ėž‘ėž…ë‹ˆë‹¤. ė´ė¤‘ ëŗ„í‘œ `**`는 더 강ë Ĩ하며 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ íŦ함한 ëĒ¨ë“  ëŦ¸ėž ė‹œí€€ėŠ¤ė™€ ėŧėš˜í•Šë‹ˆë‹¤. ė´ëĨŧ í†ĩ해 íŒ¨í„´ė´ ė—ŦëŸŦ 디렉토ëĻŦ ėˆ˜ė¤€ė—ė„œ ėŧėš˜í•  눘 ėžˆėŠĩ니다. `**`가 패턴 ë‚´ė— 링렑 íŦ함된 ę˛Ŋ뚰, ėŖŧëŗ€ ëĻŦ터럴 í…ėŠ¤íŠ¸ ė‚Ŧė´ė˜ ėŠŦëž˜ė‹œëĨŧ íŦ함하ė—Ŧ 0氜 ė´ėƒė˜ ëŦ¸ėžė™€ ėŧėš˜í•  눘 ėžˆėŠĩ니다. `**`ė˜ 가ėžĨ ė¤‘ėš”í•œ ėšŠë„ëŠ” íŠšėˆ˜ í˜•ė‹ė¸ `/**/`ėž…ë‹ˆë‹¤. ė´ëŠ” 0氜 ė´ėƒė˜ 렄랴 디렉토ëĻŦ ėˆ˜ė¤€ęŗŧ ėŧėš˜í•˜ë¯€ëĄœ ė •í™•í•œ ę˛Ŋ로 ęĩŦėĄ°ëĨŧ ëǍëĨ´ë”ëŧ도 디렉토ëĻŦ 트ëĻŦė˜ ëĒ¨ë“  ęšŠė´ė—ė„œ 파ėŧęŗŧ ėŧėš˜ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, `src/**/main.js` íŒ¨í„´ė€ `src/main.js`(0ę°œė˜ 디렉토ëĻŦ 건너뜀), `src/ui/main.js`(1ę°œė˜ 디렉토ëĻŦ 건너뜀), `src/ui/components/main.js` (2ę°œė˜ 디렉토ëĻŦ 건너뜀)뙀 ėŧėš˜í•Šë‹ˆë‹¤. 대괄호 `[]`ëĨŧ ė‚ŦėšŠí•˜ëŠ” ëŦ¸ėž í´ëž˜ėŠ¤ëŠ” ė§€ė •ëœ ė„¸íŠ¸ 또는 ë˛”ėœ„ė—ė„œ 단ėŧ ëŦ¸ėžė™€ ėŧėš˜í•Šë‹ˆë‹¤. 다ëĨ¸ 단ėŧ ëŦ¸ėž 패턴ęŗŧ 마ė°Ŧę°€ė§€ëĄœ 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ė™€ëŠ” ėŧėš˜í•˜ė§€ ė•ŠėŠĩ니다. í´ëž˜ėŠ¤ëŠ” ë˛”ėœ„ 및 느낌표ëĨŧ ė‚ŦėšŠí•œ ëļ€ė •ė„ ė§€ė›í•Šë‹ˆë‹¤. 기ė–ĩ해ė•ŧ 할 ęˇŧëŗ¸ė ė¸ ė°¨ė´ė ė€ `*`, `?` 및 ëŦ¸ėž í´ëž˜ėŠ¤ëŠ” ëĒ¨ë‘ 디렉토ëĻŦ ę˛Ŋęŗ„ëĨŧ ė¤€ėˆ˜í•˜ęŗ  단ėŧ ę˛Ŋ로 ęĩŦė„ą ėš”ė†Œ ë‚´ė—ė„œë§Œ ėŧėš˜í•˜ëŠ” 반늴, `**`는 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ ę°€ëĄœė§ˆëŸŦ ėŧėš˜í•  눘 ėžˆëŠ” 뜠ėŧ한 íŒ¨í„´ė´ëŧ는 ę˛ƒėž…ë‹ˆë‹¤. 네 氀맀 ėœ í˜•ė˜ íŒ¨í„´ė´ ėžˆėŠĩ니다: =FILE FILEė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 디렉토ëĻŦ가 ė•„ë‹Œ 파ėŧė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. =DIR/ DIRė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  ę˛ƒė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 파ėŧė´ ė•„ë‹Œ 디렉토ëĻŦė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. =/PATH/FILE ė§€ė •ëœ ė •í™•í•œ 파ėŧ ę˛Ŋ로ëĨŧ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 디렉토ëĻŦ가 ė•„ë‹Œ 파ėŧė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. =/PATH/DIR/ ė§€ė •ëœ ė •í™•í•œ 디렉토ëĻŦ ę˛ŊëĄœė™€ ꡸ ė•ˆė˜ ëĒ¨ë“  ę˛ƒė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 파ėŧė´ ė•„ë‹Œ 디렉토ëĻŦė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. /로 ė‹œėž‘í•˜ëŠ” ė ˆëŒ€ ę˛Ŋ로ëĨŧ ė§€ė •í•˜ëŠ´ 로ėģŦ 파ėŧ ė‹œėŠ¤í…œė˜ ëŖ¨íŠ¸ 디렉토ëĻŦ가 ė•„ë‹Œ ė–´ë ˆė´ ëŖ¨íŠ¸ 디렉토ëĻŦ뗐 ė ėšŠëŠë‹ˆë‹¤. Windowsė—ė„œëŠ” ė •ë°Ší–Ĩ ėŠŦëž˜ė‹œ / ëŒ€ė‹  ė—­ėŠŦëž˜ė‹œ \ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. Windows ė‹œėŠ¤í…œ 디렉토ëĻŦ, ė ‘í•Šė (junctions), ë§ˆėš´íŠ¸ 맀렐 및 기타 Windows íŠšėˆ˜ 디렉토ëĻŦ는 파ėŧ로 ėˇ¨ę¸‰ëŠë‹ˆë‹¤. ėω, ė´ë“¤ė„ ė œė™¸í•˜ë ¤ëŠ´ 디렉토ëĻŦ ęˇœėš™ė´ ė•„ë‹Œ 파ėŧ ęˇœėš™ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. 파ėŧ ė´ëτ뗐 `*`, `?`, `[`, 또는 `]` ëŦ¸ėžę°€ íŦ함된 ę˛Ŋ뚰, 글로빙 ëŦ¸ėžëĄœ í•´ė„ë˜ëŠ” ę˛ƒė„ í”ŧ하기 ėœ„í•´ ė´ėŠ¤ėŧ€ė´í”„í•´ė•ŧ 합니다. Unixė—ė„œëŠ” ė´ėŠ¤ėŧ€ė´í”„ ëŦ¸ėžę°€ `\`ė´ęŗ , Windowsė—ė„œëŠ” `^`ėž…ë‹ˆë‹¤. íŒ¨í„´ė´ ëĒ…ë šė¤„ė— ėžˆëŠ” ę˛Ŋ뚰, ëĒ…ë š 녏뗐 ė˜í•´ í•´ė„ë˜ëŠ” ę˛ƒė„ í”ŧ하기 ėœ„í•´ ė´ėŠ¤ėŧ€ė´í”„ ëŦ¸ėžëĨŧ 두 배로 늘려ė•ŧ 합니다. 네렕 파ėŧė—ė„œëŠ” 래ëĻŦ할 파ėŧė„ 필터링하기 ėœ„í•´ 다ëĨ¸ ė „ëžĩė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 가ėžĨ 간단한 ė ‘ęˇŧ ë°Šė‹ė€ ė›í•˜ė§€ ė•ŠëŠ” ëĒ¨ë“  파ėŧęŗŧ 디렉토ëĻŦëĨŧ ė œęą°í•˜ę¸° ėœ„í•´ `exclude` ęˇœėš™ë§Œ ė‚ŦėšŠí•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´: :# `*.unrecoverable`ė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧ ė œė™¸ :exclude *.unrecoverable :# ëŖ¨íŠ¸ 디렉토ëĻŦ `/lost+found` ė œė™¸ :exclude /lost+found/ :# `tmp`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  í•˜ėœ„ 디렉토ëĻŦ ė œė™¸ :exclude tmp/ 반대 ė ‘ęˇŧ ë°Šė‹ė€ `include` ęˇœėš™ë§Œ ė‚ŦėšŠí•˜ė—Ŧ 래ëĻŦ하려는 파ėŧ만 ė •ė˜í•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´: :# ėŧëļ€ ë””ë ‰í† ëĻŦ만 íŦ함 :include /movies/ :include /musics/ :include /pictures/ ėĩœėĸ… ė ‘ęˇŧ ë°Šė‹ė€ `exclude` 및 `include` ęˇœėš™ė„ í˜ŧ합하는 ę˛ƒėž…ë‹ˆë‹¤. ė´ ę˛Ŋ뚰 ęˇœėš™ė˜ ėˆœė„œę°€ ė¤‘ėš”í•Šë‹ˆë‹¤. ė•žė„  ęˇœėš™ė´ ë’¤ė˜ ęˇœėš™ëŗ´ë‹¤ ėš°ė„ í•Šë‹ˆë‹¤. ë‹¨ėˆœí™”ëĨŧ ėœ„í•´ ëĒ¨ë“  `exclude` ęˇœėš™ė„ ë¨ŧė € ë‚˜ė—´í•œ ë‹¤ėŒ ëĒ¨ë“  `include` ęˇœėš™ė„ ë‚˜ė—´í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´: :# `*.unrecoverable`ė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧ ė œė™¸ :exclude *.unrecoverable :# `tmp`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  í•˜ėœ„ 디렉토ëĻŦ ė œė™¸ :exclude tmp/ :# ėŧëļ€ ë””ë ‰í† ëĻŦ만 íŦ함 :include /movies/ :include /musics/ :include /pictures/ ëĒ…ë šė¤„ė—ė„œ -f ė˜ĩė…˜ė„ ė‚ŦėšŠí•  때 `include` 패턴만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´: :# .mp3 파ėŧ만 í™•ė¸. :# Unixė—ė„œëŠ” 녏뗐 ė˜í•œ 글로빙 확ėžĨė„ í”ŧ하기 ėœ„í•´ ë”°ė˜´í‘œëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. :snapraid -f "*.mp3" check Unixė—ė„œëŠ” ëĒ…ë šė¤„ė—ė„œ 글로빙 ëŦ¸ėžëĨŧ ė‚ŦėšŠí•  때 ė…¸ė´ 확ėžĨ하는 ę˛ƒė„ ë°Šė§€í•˜ę¸° ėœ„í•´ ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다. Ignore File 네렕 파ėŧė˜ ė „ė—­ ęˇœėš™ ė™¸ė—ë„, ë°°ė—´ ë‚´ė˜ ëĒ¨ë“  디렉토ëĻŦ뗐 `.snapraidignore` 파ėŧė„ ë°°ėš˜í•˜ė—Ŧ ëļ„ė‚°ëœ ė œė™¸ ęˇœėš™ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. `.snapraidignore`뗐 ė •ė˜ëœ ęˇœėš™ė€ 네렕 파ėŧė˜ ęˇœėš™ ë‹¤ėŒė— ė ėšŠëŠë‹ˆë‹¤. ė´ëŠ” 해당 ęˇœėš™ë“¤ė´ 더 ë†’ė€ ėš°ė„ ėˆœėœ„ëĨŧ ę°€ė§€ëŠ°, ė „ė—­ 네렕뗐 ė˜í•´ ė´ė „ė— íŦí•¨ë˜ė—ˆë˜ 파ėŧë“¤ė„ ė œė™¸í•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. ė‚Ŧė‹¤ėƒ 로ėģŦ ęˇœėš™ė´ ėŧėš˜í•˜ëŠ´, ė „ė—­ íŦ함 네렕ęŗŧ ę´€ęŗ„ė—†ė´ 해당 파ėŧė€ ė œė™¸ëŠë‹ˆë‹¤. `.snapraidignore`ė˜ 패턴 ëĄœė§ė€ ė „ė—­ ė„¤ė •ė„ 따ëĨ´ė§€ë§Œ, íŒ¨í„´ė€ 해당 파ėŧė´ ėœ„ėš˜í•œ 디렉토ëĻŦëĨŧ 揰뤀ėœŧ로 ęŗ ė •ëŠë‹ˆë‹¤: =FILE ė´ 디렉토ëĻŦ 또는 ꡸ í•˜ėœ„ė—ė„œ FILEė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ëŠ” ė „ė—­ 패턴ęŗŧ 동ėŧ한 글로빙(globbing) ęˇœėš™ė„ 따ëĻ…ë‹ˆë‹¤. =DIR/ ė´ 디렉토ëĻŦ 또는 ꡸ í•˜ėœ„ė—ė„œ DIRė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  항ëĒŠė„ ė„ íƒí•Šë‹ˆë‹¤. =/PATH/FILE `.snapraidignore` 파ėŧė˜ ėœ„ėš˜ëĨŧ 揰뤀ėœŧ로 ė§€ė •ëœ ė •í™•í•œ 파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. =/PATH/DIR/ `.snapraidignore` 파ėŧė˜ ėœ„ėš˜ëĨŧ 揰뤀ėœŧ로 ė§€ė •ëœ ė •í™•í•œ 디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  항ëĒŠė„ ė„ íƒí•Šë‹ˆë‹¤. ė „ė—­ 네렕ęŗŧ ë‹ŦëĻŦ, `.snapraidignore` 파ėŧė€ ė œė™¸ ęˇœėš™ë§Œ ė§€ė›í•Šë‹ˆë‹¤. `include` íŒ¨í„´ė´ë‚˜ ëļ€ė •(!)ė€ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. 똈ëĨŧ ë“¤ė–´, `/mnt/disk1/projects/`뗐 `.snapraidignore`가 ėžˆëŠ” ę˛Ŋ뚰: :# /mnt/disk1/projects/output.bin만 ė œė™¸ :/output.bin :# projects/ 내ëļ€ė˜ `build`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ ė œė™¸ :build/ :# projects/ 또는 ꡸ í•˜ėœ„ í´ë”ė˜ ëĒ¨ë“  .tmp 파ėŧ ė œė™¸ :*.tmp Content SnapRAID는 content 파ėŧ뗐 파ėŧ ëĒŠëĄęŗŧ 랴íŦė„Ŧė„ ė €ėžĨ합니다. ė´ę˛ƒė€ ë””ėŠ¤íŦ ė–´ë ˆė´ė— ėžˆëŠ” ëĒ¨ë“  파ėŧė˜ ëĒŠëĄęŗŧ ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•œ ëĒ¨ë“  랴íŦė„Ŧė„ ë‚˜ė—´í•˜ëŠ” ė´ė§„ 파ėŧėž…ë‹ˆë‹¤. ė´ 파ėŧė€ `sync` 및 `scrub` ëĒ…ë šė— ė˜í•´ ėŊęŗ  ė“°ė—Ŧė§€ëŠ°, `fix`, `check`, 및 `status` ëĒ…ë šė— ė˜í•´ ėŊí˜€ė§‘ë‹ˆë‹¤. Parity SnapRAID는 패ëĻŦ티 파ėŧ뗐 ė–´ë ˆė´ė˜ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ합니다. ė´ë“¤ė€ `content` 파ėŧ뗐 ė •ė˜ëœ ëĒ¨ë“  ë¸”ëĄė˜ ęŗ„ė‚°ëœ 패ëĻŦ티ëĨŧ íŦ함하는 ė´ė§„ 파ėŧėž…ë‹ˆë‹¤. ė´ 파ėŧë“¤ė€ `sync` 및 `fix` ëĒ…ë šė— ė˜í•´ ėŊęŗ  ė“°ė—Ŧė§€ëŠ°, `scrub` 및 `check` ëĒ…ë šė— ė˜í•´ė„œë§Œ ėŊí˜€ė§‘ë‹ˆë‹¤. Encoding Unixė˜ SnapRAID는 ė¸ėŊ”ë”Šė„ ëŦ´ė‹œí•Šë‹ˆë‹¤. 파ėŧ ė‹œėŠ¤í…œė—ė„œ ė‚ŦėšŠë˜ëŠ” 것ęŗŧ 동ėŧ한 ė¸ėŊ”딊ėœŧ로 파ėŧ ė´ëĻ„ė„ ėŊęŗ  ė €ėžĨ합니다. Windowsė—ė„œëŠ” 파ėŧ ė‹œėŠ¤í…œė—ė„œ ėŊė€ ëĒ¨ë“  ė´ëĻ„ė´ UTF-8 í˜•ė‹ėœŧ로 ëŗ€í™˜ë˜ęŗ  래ëĻŦ됩니다. 파ėŧ ė´ëĻ„ė´ ė˜Ŧ바ëĨ´ę˛Œ ėļœë Ĩ되도록 하려면, `chcp 65001` ëĒ…ë šėœŧ로 Windows ėŊ˜ė†”ė„ UTF-8 ëĒ¨ë“œëĄœ ė„¤ė •í•˜ęŗ  ėŊ˜ė†” 글ęŧ´ëĄœ `Lucida Console`ęŗŧ ę°™ė€ TrueType 글ęŧ´ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. ė´ëŠ” ėļœë Ĩ되는 파ėŧ ė´ëĻ„ė—ë§Œ 똁í–Ĩė„ ë¯¸ėš˜ëŠ°, ėŊ˜ė†” ėļœë Ĩė„ 파ėŧ로 ëĻŦë””ë ‰ė…˜í•˜ëŠ” ę˛Ŋ뚰 결ęŗŧ 파ėŧė€ í•­ėƒ UTF-8 í˜•ė‹ėž…ë‹ˆë‹¤. Copyright This file is Copyright (C) 2025 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ko.txt000066400000000000000000002251651522717156100170100ustar00rootroot00000000000000 ======================= ë””ėŠ¤íŦ ė–´ë ˆė´ëĨŧ ėœ„í•œ SnapRAID ë°ąė—… ======================= 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAID는 ë””ėŠ¤íŦ ė–´ë ˆė´ëĨŧ ėœ„í•´ ė„¤ęŗ„ëœ ë°ąė—… 프로그램ėœŧ로, ėĩœëŒ€ 6ę°œė˜ ë””ėŠ¤íŦ 똤ëĨ˜ę°€ ë°œėƒí•´ë„ ë°ė´í„°ëĨŧ ëŗĩęĩŦ하기 ėœ„í•œ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ합니다. ėŖŧ로 íŦęŗ  ėžėŖŧ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” 파ėŧė„ 氀맄 홈 ë¯¸ë””ė–´ ė„ŧ터ëĨŧ ėœ„í•´ ęŗ ė•ˆëœ SnapRAID는 ë‹¤ėŒęŗŧ ę°™ė€ ëLJ 氀맀 기ëŠĨė„ 렜ęŗĩ합니다: * 파ėŧė„ ë‹¤ė‹œ íŦ맷할 í•„ėš” ė—†ė´ ė´ë¯¸ 파ėŧ로 ėą„ė›Œė§„ ë””ėŠ¤íŦëĨŧ í™œėšŠí•  눘 ėžˆėœŧ늰, í‰ė†Œė˛˜ëŸŧ ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. * ë°ė´í„° ëŦ´ę˛°ė„ąė„ ëŗ´ėžĨí•˜ęŗ  ëŦ´ë‹¨ ė†ėƒė„ ë°Šė§€í•˜ę¸° ėœ„í•´ ëĒ¨ë“  ë°ė´í„°ę°€ í•´ė‹œëŠë‹ˆë‹¤. * ė‹¤íŒ¨í•œ ë””ėŠ¤íŦė˜ ėˆ˜ę°€ 패ëĻŦ티 눘ëĨŧ 봈ęŗŧ하는 ę˛Ŋ뚰, ë°ė´í„° ė†ė‹¤ė€ 똁í–Ĩė„ ë°›ė€ ë””ėŠ¤íŦ로 ė œí•œë˜ëŠ°, 다ëĨ¸ ë””ėŠ¤íŦė˜ ë°ė´í„°ëŠ” ęŗ„ė† ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. * ė‹¤ėˆ˜ëĄœ ë””ėŠ¤íŦė˜ 파ėŧė„ ė‚­ė œí•œ ę˛Ŋėš°ė—ë„ ëŗĩęĩŦ가 가ëŠĨ합니다. * ë””ėŠ¤íŦ는 ė„œëĄœ 다ëĨ¸ íŦ기ëĨŧ ę°€ė§ˆ 눘 ėžˆėŠĩ니다. * ė–¸ė œë“ ė§€ ë””ėŠ¤íŦëĨŧ ėļ”가할 눘 ėžˆėŠĩ니다. * SnapRAID는 ë°ė´í„°ëĨŧ ę°€ë‘ė§€ ė•ŠėŠĩ니다. ė–¸ė œë“ ė§€ íŦ맷하거나 ë°ė´í„°ëĨŧ ė´ë™í•  í•„ėš” ė—†ė´ ė‚ŦėšŠė„ ė¤‘ë‹¨í•  눘 ėžˆėŠĩ니다. * 파ėŧ뗐 ė•Ąė„¸ėŠ¤í•˜ë ¤ëŠ´ 단ėŧ ë””ėŠ¤íŦ만 íšŒė „í•˜ëŠ´ ë˜ë¯€ëĄœ, ė „ë Ĩė„ 레ė•Ŋí•˜ęŗ  ė†ŒėŒė„ 뤄ėŧ 눘 ėžˆėŠĩ니다. 더 ėžė„¸í•œ ė •ëŗ´ëŠ” ęŗĩė‹ SnapRAID ė‚Ŧė´íŠ¸ëĨŧ ë°ŠëŦ¸í•˜ė‹­ė‹œė˜¤: https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID는 RAID뙀 ë°ąė—… í”„ëĄœęˇ¸ëž¨ė˜ í•˜ė´ë¸ŒëĻŦ드로, 두 ę°€ė§€ė˜ ėžĨė ė„ 결합하는 ę˛ƒė„ ëĒŠí‘œëĄœ 합니다. í•˜ė§€ë§Œ, ė‚ŦėšŠ 렄뗐 ęŗ ë ¤í•´ė•ŧ 할 ëLJ 氀맀 ė œí•œ ė‚Ŧí•­ė´ ėžˆėŠĩ니다. ėŖŧėš” ė œí•œ ė‚Ŧí•­ė€ ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•˜ęŗ  ėĩœęˇŧ뗐 동기화(sync)í•˜ė§€ ė•Šė€ ę˛Ŋ뚰, ė™„ė „ížˆ ëŗĩęĩŦí•˜ė§€ ëĒģ할 눘 ėžˆë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 더 ęĩŦ랴렁ėœŧ로, ë§ˆė§€ë§‰ 동기화 ėž‘ė—… ė´í›„ ëŗ€ę˛Ŋ되거나 ė‚­ė œëœ 파ėŧė˜ íŦ기만íŧ ëŗĩęĩŦ가 ëļˆę°€ëŠĨ할 눘 ėžˆėŠĩ니다. ė´ëŠ” ëŗ€ę˛Ŋ되거나 ė‚­ė œëœ 파ėŧė´ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ뗐 ėžˆė§€ ė•Šë”ëŧ도 ë°œėƒí•Šë‹ˆë‹¤. ė´ę˛ƒė´ SnapRAID가 **ęą°ė˜ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” ë°ė´í„°**뗐 더 ė í•Ší•œ ė´ėœ ėž…ë‹ˆë‹¤. ë°˜ëŠ´ė—, ėƒˆëĄœ ėļ”ę°€ëœ 파ėŧė€ ė´ë¯¸ ėĄ´ėžŦ하는 파ėŧė˜ ëŗĩęĩŦëĨŧ ë°Ší•´í•˜ė§€ ė•ŠėŠĩ니다. ėƒˆëĄœ ėļ”ę°€ëœ 파ėŧė´ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ뗐 ėžˆëŠ” ę˛Ŋėš°ė—ë§Œ 해당 파ėŧė„ ėžƒę˛Œ 됩니다. 기타 SnapRAID ė œí•œ ė‚Ŧí•­ė€ ë‹¤ėŒęŗŧ 같ėŠĩ니다: * SnapRAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ė—Ŧė „ížˆ 각 ë””ėŠ¤íŦ뗐 대해 ëŗ„ë„ė˜ 파ėŧ ė‹œėŠ¤í…œė´ ėžˆėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ í•˜ë‚˜ė˜ 큰 파ėŧ ė‹œėŠ¤í…œė„ ė–ģėŠĩ니다. * SnapRAID는 ë°ė´í„°ëĨŧ ėŠ¤íŠ¸ëŧė´í•‘í•˜ė§€ ė•ŠėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ėŠ¤íŠ¸ëŧė´í•‘ėœŧ로 ė†ë„ í–Ĩėƒė„ ė–ģėŠĩ니다. * SnapRAID는 ė‹¤ė‹œę°„ ëŗĩęĩŦëĨŧ ė§€ė›í•˜ė§€ ė•ŠėŠĩ니다. RAIDëĨŧ ė‚ŦėšŠí•˜ëŠ´ ë””ėŠ¤íŦ가 ė‹¤íŒ¨í–ˆė„ 때 ėž‘ė—…ė„ 늈ėļœ í•„ėš”ę°€ ė—†ėŠĩ니다. * SnapRAID는 ė œí•œëœ ėˆ˜ė˜ ë””ėŠ¤íŦ 똤ëĨ˜ė—ė„œë§Œ ë°ė´í„°ëĨŧ ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. ë°ąė—…ė„ ė‚ŦėšŠí•˜ëŠ´ 렄랴 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ė™„ė „í•œ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. * 파ėŧ ė´ëĻ„, íƒ€ėž„ėŠ¤íƒŦ프, ė‹ŦëŗŧëĻ­ 링íŦ, 하드 링íŦ만 ė €ėžĨ됩니다. ęļŒí•œ, ė†Œėœ ęļŒ, 확ėžĨ ė†ė„ąė€ ė €ėžĨë˜ė§€ ė•ŠėŠĩ니다. 4 GETTING STARTED ================= SnapRAIDëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´, ë¨ŧė € ë””ėŠ¤íŦ ė–´ë ˆė´ė—ė„œ í•˜ë‚˜ė˜ ë””ėŠ¤íŦëĨŧ `parity`(패ëĻŦ티) ė •ëŗ´ ė „ėšŠėœŧ로 ė„ íƒí•´ė•ŧ 합니다. í•˜ë‚˜ė˜ 패ëĻŦ티 ë””ėŠ¤íŦ로 RAID5뙀 뜠ė‚Ŧ하게 단ėŧ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다. RAID6뙀 뜠ė‚Ŧ하게 더 ë§Žė€ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗĩęĩŦ하려면, ėļ”ę°€ ë””ėŠ¤íŦëĨŧ 패ëĻŦí‹°ėšŠėœŧ로 똈ė•Ŋ해ė•ŧ 합니다. ėļ”ę°€ 패ëĻŦ티 ë””ėŠ¤íŦ 하나당 í•˜ë‚˜ė˜ ë””ėŠ¤íŦ 똤ëĨ˜ė— 대한 ëŗĩęĩŦëĨŧ 더 í—ˆėšŠí•Šë‹ˆë‹¤. 패ëĻŦ티 ë””ėŠ¤íŦ로는 ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 ë””ėŠ¤íŦëĨŧ ė„ íƒí•´ė•ŧ 합니다. 패ëĻŦ티 ė •ëŗ´ę°€ ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 **ë°ė´í„° ë””ėŠ¤íŦ**ė˜ íŦ기만íŧ ėģ¤ė§ˆ 눘 ėžˆę¸° 때ëŦ¸ėž…니다. ė´ ë””ėŠ¤íŦë“¤ė€ `parity` 파ėŧė„ ė €ėžĨ하는 데 ė „ë…í•˜ę˛Œ 됩니다. ė—Ŧ揰뗐 ë°ė´í„°ëĨŧ ė €ėžĨí•´ė„œëŠ” ė•ˆ 됩니다. ë‹¤ėŒėœŧ로, SnapRAID로 ëŗ´í˜¸í•˜ë ¤ëŠ” `data`(ë°ė´í„°) ë””ėŠ¤íŦëĨŧ ė •ė˜í•´ė•ŧ 합니다. ė´ ë””ėŠ¤íŦë“¤ė´ **ęą°ė˜ ëŗ€ę˛Ŋë˜ė§€ ė•ŠëŠ” ë°ė´í„°**ëĨŧ íŦ함할 때 ëŗ´í˜¸ 효ęŗŧ가 더 ėĸ‹ėŠĩ니다. ė´ëŸŦ한 ė´ėœ ëĄœ, Windows C:\ ë””ėŠ¤íŦ나 Unixė˜ /home, /var, /tmp 디렉토ëĻŦëĨŧ íŦí•¨í•˜ė§€ ė•ŠëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. 파ėŧ ëĒŠëĄė€ `content` 파ėŧ뗐 ė €ėžĨ되늰, ëŗ´í†ĩ ë°ė´í„°, 패ëĻŦ티, 또는 ëļ€íЏ ë””ėŠ¤íŦ뗐 ė €ėžĨ됩니다. ė´ 파ėŧė—ëŠ” ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•œ ëĒ¨ë“  랴íŦė„Ŧė„ íŦ함하ė—Ŧ ë°ąė—…ė— 대한 넏ëļ€ ė •ëŗ´ę°€ ë“¤ė–´ ėžˆėŠĩ니다. `content` 파ėŧė€ ė—ŦëŸŦ ëŗĩė‚Ŧëŗ¸ėœŧ로 ė €ėžĨ되늰, ë‹¤ė¤‘ ë””ėŠ¤íŦ 똤ëĨ˜ė˜ ę˛Ŋėš°ė—ë„ ė ė–´ë„ í•˜ë‚˜ė˜ ëŗĩė‚Ŧëŗ¸ė„ ė‚ŦėšŠí•  눘 ėžˆë„ëĄ 각 ëŗĩė‚Ŧëŗ¸ė€ ė„œëĄœ 다ëĨ¸ ë””ėŠ¤íŦ뗐 ėžˆė–´ė•ŧ 합니다. 똈ëĨŧ ë“¤ė–´, í•˜ë‚˜ė˜ 패ëĻŦ티 ëŗ´í˜¸ ėˆ˜ė¤€ë§Œ ė›í•˜ęŗ  ë””ėŠ¤íŦ가 ë‹¤ėŒęŗŧ ę°™ė´ ėœ„ėš˜í•œë‹¤ęŗ  ę°€ė •í•´ ë´…ė‹œë‹¤: /mnt/diskp <- 패ëĻŦí‹°ėšŠėœŧ로 ė„ íƒëœ ë””ėŠ¤íŦ /mnt/disk1 <- ëŗ´í˜¸í•  ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ /mnt/disk2 <- ëŗ´í˜¸í•  두 ë˛ˆė§¸ ë””ėŠ¤íŦ /mnt/disk3 <- ëŗ´í˜¸í•  넏 ë˛ˆė§¸ ë””ėŠ¤íŦ ë‹¤ėŒ ė˜ĩė…˜ėœŧ로 네렕 파ėŧ /etc/snapraid.confëĨŧ ėƒė„ąí•´ė•ŧ 합니다: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ WindowsëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, ėŠŦëž˜ė‹œ ëŒ€ė‹  드ëŧė´ë¸Œ ëŦ¸ėž 및 ë°ąėŠŦëž˜ė‹œëĨŧ ė‚ŦėšŠí•˜ëŠ” Windows ę˛Ŋ로 í˜•ė‹ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ ë””ėŠ¤íŦ가 ë§Žė•„ 드ëŧė´ë¸Œ ëŦ¸ėžę°€ ëļ€ėĄąí•œ ę˛Ŋ뚰, ë””ėŠ¤íŦëĨŧ í•˜ėœ„ í´ë”ė— 링렑 ë§ˆėš´íŠ¸í•  눘 ėžˆėŠĩ니다. ë‹¤ėŒė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤: https://www.google.com/search?q=Windows+mount+point ė´ ė‹œė ė—ė„œ, 패ëĻŦ티 ė •ëŗ´ëĨŧ 빌드하기 ėœ„í•´ `sync` ëĒ…ë šė„ ė‹¤í–‰í•  ė¤€ëš„ę°€ ë˜ė—ˆėŠĩ니다. snapraid sync ė´ í”„ëĄœė„¸ėŠ¤ëŠ” ë””ėŠ¤íŦ뗐 ė´ë¯¸ ėĄ´ėžŦ하는 ë°ė´í„°ė˜ íŦ揰뗐 따ëŧ ė˛Ģ ė‹¤í–‰ ė‹œ ëLJ ė‹œę°„ė´ 깸ëĻ´ 눘 ėžˆėŠĩ니다. ë””ėŠ¤íŦ가 ëš„ė–´ ėžˆėœŧ늴 í”„ëĄœė„¸ėŠ¤ëŠ” ėĻ‰ė‹œ ė™„ëŖŒëŠë‹ˆë‹¤. Ctrl+CëĨŧ 눌ëŸŦ ė–¸ė œë“ ė§€ ė¤‘ė§€í•  눘 ėžˆėœŧ늰, ë‹¤ėŒ ė‹¤í–‰ ė‹œ ė¤‘ë‹¨ëœ ęŗŗė—ė„œ ėžŦ개됩니다. ė´ ëĒ…ë šė´ ė™„ëŖŒë˜ëŠ´ ë°ė´í„°ëŠ” **SAFE**합니다. ė´ė œ ė–´ë ˆė´ëĨŧ ė›í•˜ëŠ” 대로 ė‚ŦėšŠí•˜ęŗ  ėŖŧ揰렁ėœŧ로 `sync` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė—…ë°ė´íŠ¸í•  눘 ėžˆėŠĩ니다. 4.1 Scrubbing ------------- ėŖŧ揰렁ėœŧ로 ë°ė´í„° 및 패ëĻŦí‹°ė˜ 똤ëĨ˜ëĨŧ í™•ė¸í•˜ë ¤ëŠ´ `scrub` ëĒ…ë šė„ ė‹¤í–‰í•  눘 ėžˆėŠĩ니다. snapraid scrub ė´ ëĒ…ë šė€ ë°ė´í„° ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•´ ė–´ë ˆė´ė˜ ë°ė´í„°ëĨŧ `sync` ëĒ…ë š 뤑뗐 ęŗ„ė‚°ëœ í•´ė‹œė™€ 비ęĩí•Šë‹ˆë‹¤. ė´ ëĒ…ë šė„ ė‹¤í–‰í•  때마다 ė´ė „ė— 10ėŧ ė´ë‚´ė— 늤íŦëŸŊ된 ë°ė´í„°ëĨŧ ė œė™¸í•˜ęŗ  ė–´ë ˆė´ė˜ ė•Ŋ 8%ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 다ëĨ¸ ė–‘ė„ ė§€ė •í•˜ë ¤ëŠ´ -p, --plan ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ęŗ , 다ëĨ¸ ėŧë š(days)ė„ ė§€ė •í•˜ë ¤ëŠ´ -o, --older-than ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 20ėŧëŗ´ë‹¤ ė˜¤ëž˜ëœ ë¸”ëĄė— 대해 ė–´ë ˆė´ė˜ 5%ëĨŧ í™•ė¸í•˜ë ¤ëŠ´ ë‹¤ėŒęŗŧ ę°™ė´ ė‚ŦėšŠí•Šë‹ˆë‹¤: snapraid -p 5 -o 20 scrub ė´ í”„ëĄœė„¸ėŠ¤ 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ 발ę˛Ŧ되늴, 해당 ë¸”ëĄė€ `content` 파ėŧ뗐 bad로 í‘œė‹œë˜ëŠ° `status` ëĒ…ë šė— ë‚˜ė—´ëŠë‹ˆë‹¤. snapraid status ė´ë“¤ė„ ėˆ˜ė •í•˜ë ¤ëŠ´ -e, --filter-error ė˜ĩė…˜ėœŧ로 bad ë¸”ëĄė„ 필터링하ė—Ŧ `fix` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. snapraid -e fix ë‹¤ėŒ `scrub` ė‹œė— 똤ëĨ˜ę°€ ė‹¤ė œëĄœ ėˆ˜ė •ë˜ëŠ´ `status` ëŗ´ęŗ ė„œė—ė„œ ė‚Ŧëŧė§‘ë‹ˆë‹¤. 더 ëš ëĨ´ę˛Œ 하려면, `-p bad`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ bad로 í‘œė‹œëœ 블록만 늤íŦëŸŊ할 눘 ėžˆėŠĩ니다. snapraid -p bad scrub ë™ę¸°í™”ë˜ė§€ ė•Šė€ ė–´ë ˆė´ė—ė„œ `scrub`ė„ ė‹¤í–‰í•˜ëŠ´ ė œęą°ë˜ęą°ë‚˜ ėˆ˜ė •ëœ 파ėŧ로 ė¸í•œ 똤ëĨ˜ę°€ ëŗ´ęŗ ë  눘 ėžˆėŠĩ니다. ė´ëŸŦ한 똤ëĨ˜ëŠ” `scrub` ėļœë Ĩė—ëŠ” ëŗ´ęŗ ë˜ė§€ë§Œ, 관련 ë¸”ëĄė€ bad로 í‘œė‹œë˜ė§€ ė•ŠėŠĩ니다. 4.2 Pooling ----------- 및溠: ė•„ëž˜ė— 네ëĒ…ëœ 풀링(pooling) 기ëŠĨė€ **mergerfs** 도ęĩŦ로 ëŒ€ė˛´ë˜ė—ˆėœŧ늰, ė´ëŠ” SnapRAID ėģ¤ëŽ¤ë‹ˆí‹°ė—ė„œ Linux ė‚ŦėšŠėžëĨŧ ėœ„í•œ ęļŒėžĨ ė˜ĩė…˜ėž…ë‹ˆë‹¤. Mergefs는 ė—ŦëŸŦ 드ëŧė´ë¸ŒëĨŧ 단ėŧ í†ĩ합 ë§ˆėš´íŠ¸ 맀렐ėœŧ로 풀링하는 더 ėœ ė—°í•˜ęŗ  íš¨ėœ¨ė ė¸ ë°Šë˛•ė„ 렜ęŗĩ하ė—Ŧ, ė‹ŦëŗŧëĻ­ 링íŦ뗐 ė˜ėĄ´í•˜ė§€ ė•Šęŗ  ė–´ë ˆė´ ė „ė˛´ė˜ 파ėŧ뗐 대한 ė›í™œí•œ ė•Ąė„¸ėŠ¤ëĨŧ í—ˆėšŠí•Šë‹ˆë‹¤. ė´ëŠ” 패ëĻŦ티 ëŗ´í˜¸ëĨŧ ėœ„í•œ SnapRAID뙀 ėž˜ í†ĩ합되며, OpenMediaVault (OMV) 또는 ė‚ŦėšŠėž ė •ė˜ NAS ęĩŦė„ąęŗŧ ę°™ė€ ė„¤ė •ė—ė„œ 흔히 ė‚ŦėšŠëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧė„ 동ėŧ한 디렉토ëĻŦ 트ëĻŦ뗐 í‘œė‹œí•˜ë ¤ëŠ´, `pooling` 기ëŠĨė„ í™œė„ąí™”í•  눘 ėžˆėŠĩ니다. ė´ 기ëŠĨė€ ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧ뗐 대한 ėŊ기 ė „ėšŠ ę°€ėƒ 롰ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤. 네렕 파ėŧė—ė„œ `pooling` 디렉토ëĻŦëĨŧ ë‹¤ėŒęŗŧ ę°™ė´ ęĩŦė„ąí•  눘 ėžˆėŠĩ니다: pool /pool 또는 Windowsė—ė„œ ë‹¤ėŒęŗŧ ę°™ė´ 합니다: pool C:\pool ꡸ëĻŦęŗ  ë‚˜ė„œ `pool` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ę°€ėƒ 롰ëĨŧ ėƒė„ąí•˜ęą°ë‚˜ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. snapraid pool Unix 플ëžĢíŧė„ ė‚ŦėšŠí•˜ęŗ  ė´ 디렉토ëĻŦëĨŧ Windows 또는 Unix ėģ´í“¨í„°ė— ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ęŗĩėœ í•˜ë ¤ëŠ´, /etc/samba/smb.conf뗐 ë‹¤ėŒ ė˜ĩė…˜ė„ ėļ”가해ė•ŧ 합니다: # smb.confė˜ global ė„šė…˜ė—ė„œ unix extensions = no # smb.confė˜ share ė„šė…˜ė—ė„œ [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes Windowsė—ė„œ ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ęŗĩėœ í•˜ë ¤ëŠ´ 클ëŧė´ė–¸íŠ¸ę°€ ė›ę˛Šėœŧ로 ė´ë“¤ė„ í•´ė„í•´ė•ŧ 합니다. ė´ëĨŧ í™œė„ąí™”í•˜ę¸° ėœ„í•´, 풀 디렉토ëĻŦëĨŧ ęŗĩėœ í•˜ëŠ” 것 ė™¸ė—ë„, 네렕 파ėŧ뗐 ė •ė˜ëœ ë””ėŠ¤íŦ ė´ëĻ„ė„ ęŗĩ뜠 맀렐ėœŧ로 ė‚ŦėšŠí•˜ė—Ŧ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ 독ëĻŊ렁ėœŧ로 ęŗĩėœ í•´ė•ŧ 합니다. 또한 네렕 파ėŧė˜ `share` ė˜ĩė…˜ė—ė„œ ė›ę˛Š 클ëŧė´ė–¸íŠ¸ę°€ ė´ëŸŦ한 ęŗĩ뜠 ë””ėŠ¤íŦ뗐 ė•Ąė„¸ėŠ¤í•˜ëŠ” 데 í•„ėš”í•œ Windows UNC ę˛Ŋ로ëĨŧ ė§€ė •í•´ė•ŧ 합니다. 똈ëĨŧ ë“¤ė–´, `darkstar`ëŧ는 ė„œë˛„ė—ė„œ ėž‘ė—…í•˜ëŠ” ę˛Ŋ뚰, ë‹¤ėŒ ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar ꡸ëĻŦęŗ  ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 ë‹¤ėŒ 디렉토ëĻŦëĨŧ ęŗĩėœ í•Šë‹ˆë‹¤: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array ė´ë ‡ę˛Œ 하면 ė›ę˛Š 클ëŧė´ė–¸íŠ¸ę°€ \\darkstar\poolė—ė„œ ëĒ¨ë“  파ėŧ뗐 ė•Ąė„¸ėŠ¤í•  눘 ėžˆėŠĩ니다. 또한 ë‹¤ėŒ ëĒ…ë šėœŧ로 ė›ę˛Š 클ëŧė´ė–¸íŠ¸ëĨŧ ęĩŦė„ąí•˜ė—Ŧ ė›ę˛Š ė‹ŦëŗŧëĻ­ 링íŦ뗐 대한 ė•Ąė„¸ėŠ¤ëĨŧ í™œė„ąí™”í•´ė•ŧ 할 ėˆ˜ë„ ėžˆėŠĩ니다: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAID는 RAID ė‹œėŠ¤í…œëŗ´ë‹¤ëŠ” ë°ąė—… í”„ëĄœęˇ¸ëž¨ė˛˜ëŸŧ ėž‘ë™í•˜ëŠ°, -f, --filter ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 파ėŧė´ë‚˜ 디렉토ëĻŦëĨŧ ė´ė „ ėƒíƒœëĄœ ëŗĩė›í•˜ęą°ë‚˜ ė‚­ė œ ėˇ¨ė†Œí•  눘 ėžˆėŠĩ니다: snapraid fix -f FILE 또는 디렉토ëĻŦ뗐 대해: snapraid fix -f DIR/ 또한 -m, --filter-missing ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 디렉토ëĻŦ ë‚´ė—ė„œ ė‹¤ėˆ˜ëĄœ ė‚­ė œëœ 파ėŧ만 ëŗĩęĩŦ할 ėˆ˜ë„ ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ 누ëŊ된 파ėŧ만 ëŗĩė›í•˜ęŗ  다ëĨ¸ 파ėŧė€ 그대로 둡니다. snapraid fix -m -f DIR/ 또는 ëĒ¨ë“  드ëŧė´ë¸Œė—ė„œ ė‚­ė œëœ ëĒ¨ë“  파ėŧė„ ë‹¤ėŒėœŧ로 ëŗĩęĩŦ합니다: snapraid fix -m 4.4 Recovering -------------- ėĩœė•…ė˜ ėƒí™Šė´ ë°œėƒí•˜ė—Ŧ 하나 ė´ėƒė˜ ë””ėŠ¤íŦëĨŧ ėžƒė—ˆėŠĩ니다! **íŒ¨ë‹‰í•˜ė§€ ë§ˆė‹­ė‹œė˜¤!** ëŗĩęĩŦ할 눘 ėžˆėŠĩ니다! 가ėžĨ ë¨ŧė € 해ė•ŧ 할 ėŧė€ ë””ėŠ¤íŦ ė–´ë ˆė´ė— 대한 ėļ”ę°€ ëŗ€ę˛Ŋė„ í”ŧ하는 ę˛ƒėž…ë‹ˆë‹¤. ëĒ¨ë“  ė›ę˛Š 뗰枰ęŗŧ SnapRAID ė•ŧ간 동기화 또는 늤íŦëŸŊė„ íŦ함한 ëĒ¨ë“  똈ė•Ŋ된 í”„ëĄœė„¸ėŠ¤ëĨŧ ëš„í™œė„ąí™”í•˜ė‹­ė‹œė˜¤. 그런 ë‹¤ėŒ ë‹¤ėŒ ë‹¨ęŗ„ëĨŧ ė§„í–‰í•˜ė‹­ė‹œė˜¤. ---- 4.4.1 STEP 1 -> Reconfigure ---- ëŗĩęĩŦ할 ęŗĩę°„ė´ í•„ėš”í•˜ëŠ°, ė´ėƒė ėœŧ로는 ėļ”ę°€ ė˜ˆëš„ ë””ėŠ¤íŦ뗐, í•˜ė§€ë§Œ 뙏ëļ€ USB ë””ėŠ¤íŦ 또는 ė›ę˛Š ë””ėŠ¤íŦ로도 ėļŠëļ„핊니다. SnapRAID 네렕 파ėŧė„ ėˆ˜ė •í•˜ė—Ŧ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦė˜ `data` 또는 `parity` ė˜ĩė…˜ė´ 파ėŧė„ ëŗĩęĩŦ할 눘 ėžˆëŠ” ėļŠëļ„한 뚈 ęŗĩę°„ė´ ėžˆëŠ” ėœ„ėš˜ëĨŧ 가ëĻŦ키도록 합니다. 똈ëĨŧ ë“¤ė–´, ë””ėŠ¤íŦ `d1`ė´ ė‹¤íŒ¨í•œ ę˛Ŋ뚰, ë‹¤ėŒė—ė„œ ëŗ€ę˛Ŋ합니다: data d1 /mnt/disk1/ ë‹¤ėŒėœŧ로: data d1 /mnt/new_spare_disk/ ëŗĩęĩŦ할 ë””ėŠ¤íŦ가 패ëĻŦ티 ë””ėŠ¤íŦė¸ ę˛Ŋ뚰, ė ė ˆí•œ `parity` ė˜ĩė…˜ė„ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ė—ŦëŸŦ ę°œė˜ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, ëĒ¨ë“  ęĩŦė„ą ė˜ĩė…˜ė„ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ---- 4.4.2 STEP 2 -> Fix ---- 로그ëĨŧ 뙏ëļ€ íŒŒėŧ뗐 ė €ėžĨí•˜ëŠ´ė„œ fix ëĒ…ë šė„ ė‹¤í–‰í•Šë‹ˆë‹¤: snapraid -d NAME -l fix.log fix ė—Ŧę¸°ė„œ NAMEė€ ė´ė „ ė˜ˆė œė˜ `d1`ęŗŧ ę°™ė€ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. ëŗĩęĩŦ할 ë””ėŠ¤íŦ가 패ëĻŦ티 ë””ėŠ¤íŦė¸ ę˛Ŋ뚰, `parity`, `2-parity` ë“ąė˜ ė´ëĻ„ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ė—ŦëŸŦ ę°œė˜ ė‹¤íŒ¨í•œ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, ė—ŦëŸŦ -d ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ëĒ¨ë‘ ė§€ė •í•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ ė˜¤ëžœ ė‹œę°„ė´ 깸ëĻŊ니다. fix.log 파ėŧė„ ė €ėžĨ할 ëLJ ę¸°ę°€ë°”ė´íŠ¸ė˜ ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ”ė§€ í™•ė¸í•˜ė‹­ė‹œė˜¤. ėļŠëļ„한 ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ” ë””ėŠ¤íŦė—ė„œ ė‹¤í–‰í•˜ė‹­ė‹œė˜¤. ė´ė œ ëŗĩęĩŦ할 눘 ėžˆëŠ” ëĒ¨ë“  ę˛ƒė„ ëŗĩęĩŦ했ėŠĩ니다. ėŧëļ€ íŒŒėŧė´ ëļ€ëļ„렁ėœŧ로 또는 ė™„ė „ížˆ ëŗĩęĩŦ ëļˆę°€ëŠĨ한 ę˛Ŋ뚰, `.unrecoverable` 확ėžĨėžę°€ ėļ”ę°€ë˜ė–´ ė´ëĻ„ė´ ëŗ€ę˛Ŋ됩니다. `unrecoverable:`로 ė‹œėž‘í•˜ëŠ” ëĒ¨ë“  ė¤„ė„ í™•ė¸í•˜ė—Ŧ fix.log 파ėŧė—ė„œ ëŗĩęĩŦ ëļˆę°€ëŠĨ한 ëĒ¨ë“  ë¸”ëĄė˜ ėžė„¸í•œ ëĒŠëĄė„ ė°žė„ 눘 ėžˆėŠĩ니다. ëŗĩęĩŦ가 ë§ŒėĄąėŠ¤ëŸŊė§€ ė•Šėœŧ늴, ė›í•˜ëŠ” 만íŧ ė—ŦëŸŦ 번 ėžŦė‹œë„í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, ë§ˆė§€ë§‰ `sync` ė´í›„ ė–´ë ˆė´ė—ė„œ 파ėŧė„ ė œęą°í•œ ę˛Ŋ뚰, ėŧëļ€ íŒŒėŧė´ ëŗĩęĩŦë˜ė§€ ė•Šė„ 눘 ėžˆėŠĩ니다. ė´ ę˛Ŋ뚰, -i, --import ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ `fix`ëĨŧ ėžŦė‹œë„í•˜ęŗ , ė´ 파ėŧë“¤ė´ 현ėžŦ ė–´ë””ė— ėžˆëŠ”ė§€ ė§€ė •í•˜ė—Ŧ ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ė— ë‹¤ė‹œ íŦí•¨ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. ëŗĩęĩŦ가 ë§ŒėĄąėŠ¤ëŸŊ다면 ęŗ„ė† ė§„í–‰í•  눘 ėžˆė§€ë§Œ, 동기화 í›„ė—ëŠ” `fix` ëĒ…ë šė„ 더 ė´ėƒ ėžŦė‹œë„í•  눘 ė—†ë‹¤ëŠ” 렐뗐 ėœ ė˜í•˜ė‹­ė‹œė˜¤! ---- 4.4.3 STEP 3 -> Check ---- ėĄ°ė‹Ŧ늤ëŸŦ뚴 í™•ė¸ėœŧ로, ė´ė œ `check` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ëŗĩęĩŦ된 ë””ėŠ¤íŦė˜ ëĒ¨ë“  ę˛ƒė´ ė˜Ŧ바ëĨ¸ė§€ í™•ė¸í•  눘 ėžˆėŠĩ니다. snapraid -d NAME -a check ė—Ŧę¸°ė„œ NAMEė€ ė´ė „ ė˜ˆė œė˜ `d1`ęŗŧ ę°™ė€ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. -d 및 -a ė˜ĩė…˜ė€ SnapRAIDė—ę˛Œ ė§€ė •ëœ ë””ėŠ¤íŦ만 í™•ė¸í•˜ęŗ  ëĒ¨ë“  패ëĻŦ티 ë°ė´í„°ëĨŧ ëŦ´ė‹œí•˜ë„록 ė§€ė‹œí•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ ė˜¤ëžœ ė‹œę°„ė´ 깸ëĻŦė§€ë§Œ, ė§€ë‚˜ėš˜ę˛Œ ėĄ°ė‹Ŧ늤ëŸŊė§€ ė•Šë‹¤ëŠ´ 건너뛸 눘 ėžˆėŠĩ니다. ---- 4.4.4 STEP 4 -> Sync ---- `sync` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ 냈 ë””ėŠ¤íŦ로 ė–´ë ˆė´ëĨŧ ėžŦ동기화합니다. snapraid sync ëĒ¨ë“  ę˛ƒė´ ëŗĩęĩŦ되늴 ė´ ëĒ…ë šė€ ėĻ‰ė‹œ ė™„ëŖŒëŠë‹ˆë‹¤. 5 COMMANDS ========== SnapRAID는 ë‹¤ėŒė„ í—ˆėšŠí•˜ëŠ” ëLJ 氀맀 간단한 ëĒ…ë šė„ 렜ęŗĩ합니다: * ė–´ë ˆė´ė˜ ėƒíƒœ ėļœë Ĩ -> `status` * ë””ėŠ¤íŦ ė œė–´ -> `smart`, `probe`, `up`, `down` * ë°ąė—…/ėŠ¤ëƒ…ėƒˇ ėƒė„ą -> `sync` * ėŖŧ揰렁ėœŧ로 ë°ė´í„° í™•ė¸ -> `scrub` * ë§ˆė§€ë§‰ ë°ąė—…/ėŠ¤ëƒ…ėƒˇ ëŗĩ뛐 -> `fix`. ëĒ…ë šė€ ė†ŒëŦ¸ėžëĄœ ėž‘ė„ąí•´ė•ŧ 합니다. 5.1 status ---------- ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ėƒíƒœ ėš”ė•Ŋė„ ėļœë Ĩ합니다. 패ëĻŦ티 단편화, í™•ė¸ ė—†ė´ ë¸”ëĄė´ ė–ŧ마나 ė˜¤ëž˜ë˜ė—ˆëŠ”ė§€, ꡸ëĻŦęŗ  늤íŦëŸŊ 뤑뗐 ë°œėƒí•œ ëĒ¨ë“  기록된 ëŦ´ë‹¨ 똤ëĨ˜ė— 대한 ė •ëŗ´ëĨŧ íŦ함합니다. ė œė‹œëœ ė •ëŗ´ëŠ” ë§ˆė§€ë§‰ėœŧ로 `sync`ëĨŧ ė‹¤í–‰í–ˆė„ 때ëĨŧ 나타냅니다. ë‚˜ė¤‘ė— ėˆ˜ė •ëœ ë‚´ėšŠė€ ęŗ ë ¤ë˜ė§€ ė•ŠėŠĩ니다. bad ë¸”ëĄė´ ę°ė§€ë˜ëŠ´ 해당 블록 번호가 ë‚˜ė—´ëŠë‹ˆë‹¤. ė´ë“¤ė„ ėˆ˜ė •í•˜ë ¤ëŠ´ `fix -e` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 또한 각 ë¸”ëĄė´ ë§ˆė§€ë§‰ėœŧ로 늤íŦëŸŊ되거나 동기화된 ė‹œę°„ė„ 나타내는 그래프ëĨŧ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. 늤íŦëŸŊ된 ë¸”ëĄė€ `*`, ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ ë¸”ëĄė€ `o`로 í‘œė‹œëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.2 smart --------- ė‹œėŠ¤í…œė˜ ëĒ¨ë“  ë””ėŠ¤íŦ뗐 대한 SMART ëŗ´ęŗ ė„œëĨŧ ėļœë Ĩ합니다. í–Ĩ후 1년 ë™ė•ˆė˜ ė‹¤íŒ¨ 확ëĨ  ėļ”ė •ėš˜ëĨŧ íŦ함하ė—Ŧ, ė˜ė‹Ŧ늤ëŸŦ뚴 ė†ė„ąė„ ëŗ´ė´ëŠ” ë””ėŠ¤íŦė˜ ėœ ė§€ ëŗ´ėˆ˜ ęĩė˛´ëĨŧ ęŗ„íší•  눘 ėžˆėŠĩ니다. ė´ 확ëĨ  ėļ”ė •ėš˜ëŠ” ë‹¤ėŒė—ė„œ ė‚ŦėšŠ 가ëŠĨ한 Backblaze ë°ė´í„°ė™€ ë””ėŠ¤íŦė˜ SMART ė†ė„ąė„ ėƒí˜¸ ė—°ę´€ė‹œėŧœ ė–ģėŠĩ니다: https://www.backblaze.com/hard-drive-test-data.html SMART가 ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•˜ęŗ  ėžˆë‹¤ęŗ  ëŗ´ęŗ í•˜ëŠ´, 해당 ë””ėŠ¤íŦ뗐 대해 `FAIL` 또는 `PREFAIL`ė´ ėļœë Ĩ되늰, SnapRAID는 똤ëĨ˜ëĨŧ 반환하며 ėĸ…ëŖŒëŠë‹ˆë‹¤. ė´ ę˛Ŋ뚰, ë””ėŠ¤íŦė˜ ėĻ‰ę°ė ė¸ ęĩė˛´ę°€ 강ë Ĩ히 ęļŒėžĨ됩니다. 다ëĨ¸ 가ëŠĨ한 ėƒíƒœ ëŦ¸ėžė—´ė€ ë‹¤ėŒęŗŧ 같ėŠĩ니다: logfail - ęŗŧęą°ė— ėŧëļ€ ė†ė„ąė´ ėž„ęŗ„ę°’ëŗ´ë‹¤ ë‚Žė•˜ėŠĩ니다. logerr - ėžĨėš˜ 똤ëĨ˜ ëĄœęˇ¸ė— 똤ëĨ˜ę°€ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. selferr - ėžĨėš˜ ėžė˛´ í…ŒėŠ¤íŠ¸ ëĄœęˇ¸ė— 똤ëĨ˜ę°€ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. -v, --verbose ė˜ĩė…˜ė´ ė§€ė •ë˜ëŠ´, 더 ęšŠė€ í†ĩęŗ„ ëļ„ė„ė´ 렜ęŗĩ됩니다. ė´ ëļ„ė„ė€ 더 많거나 ė ė€ 패ëĻŦ티가 í•„ėš”í•œė§€ ę˛°ė •í•˜ëŠ” 데 ë„ė›€ė´ 될 눘 ėžˆėŠĩ니다. ė´ ëĒ…ë šė€ `smartctl` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ `smartctl -a`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. ėžĨėš˜ę°€ ė˜Ŧ바ëĨ´ę˛Œ ėžë™ ę°ė§€ë˜ė§€ ė•Šėœŧ늴, 네렕 파ėŧė—ė„œ `smartctl` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ė‚ŦėšŠėž ė •ė˜ ëĒ…ë šė„ ė§€ė •í•  눘 ėžˆėŠĩ니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.3 probe --------- ė‹œėŠ¤í…œė˜ ëĒ¨ë“  ë””ėŠ¤íŦė˜ POWER ėƒíƒœëĨŧ ėļœë Ĩ합니다. `Standby`는 ë””ėŠ¤íŦ가 íšŒė „í•˜ė§€ ė•ŠėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. `Active`는 ë””ėŠ¤íŦ가 íšŒė „í•˜ęŗ  ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ `smartctl` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ `smartctl -n standby -i`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. ėžĨėš˜ę°€ ė˜Ŧ바ëĨ´ę˛Œ ėžë™ ę°ė§€ë˜ė§€ ė•Šėœŧ늴, 네렕 파ėŧė—ė„œ `smartctl` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ė‚ŦėšŠėž ė •ė˜ ëĒ…ë šė„ ė§€ė •í•  눘 ėžˆėŠĩ니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.4 up ------ ė–´ë ˆė´ė˜ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ė‹œí‚ĩ니다(spin up). -d, --filter-disk ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ íŠšė • ë””ėŠ¤íŦ만 íšŒė „ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ ë™ė‹œė— íšŒė „ė‹œí‚¤ë ¤ëŠ´ ë§Žė€ ė „ë Ĩė´ í•„ėš”í•Šë‹ˆë‹¤. 렄뛐 ęŗĩ급 ėžĨėš˜ę°€ ė´ëĨŧ ė§€íƒąí•  눘 ėžˆëŠ”ė§€ í™•ė¸í•˜ė‹­ė‹œė˜¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.5 down -------- ė–´ë ˆė´ė˜ ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ ė¤‘ė§€í•Šë‹ˆë‹¤(spin down). ė´ ëĒ…ë šė€ `smartctl` 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ëŠ°, ëĒ¨ë“  ėžĨėš˜ė—ė„œ `smartctl -s standby,now`ëĨŧ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. -d, --filter-disk ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ íŠšė • ë””ėŠ¤íŦ만 íšŒė „ ė¤‘ė§€í•  눘 ėžˆėŠĩ니다. 똤ëĨ˜ ë°œėƒ ė‹œ ėžë™ėœŧ로 íšŒė „ ė¤‘ė§€í•˜ë ¤ëŠ´, 다ëĨ¸ ëĒ…ë šęŗŧ 함ęģ˜ -s, --spin-down-on-error ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ė´ëŠ” 똤ëĨ˜ ë°œėƒ ė‹œ ėˆ˜ë™ėœŧ로 `down`ė„ ė‹¤í–‰í•˜ëŠ” 것ęŗŧ 동ėŧ합니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.6 diff -------- ë§ˆė§€ë§‰ `sync` ė´í›„ ėˆ˜ė •ë˜ė–´ 패ëĻŦ티 ë°ė´í„°ëĨŧ ėžŦęŗ„ė‚°í•´ė•ŧ 하는 ëĒ¨ë“  파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. ė´ ëĒ…ë šė€ 파ėŧ ë°ė´í„°ëĨŧ í™•ė¸í•˜ė§€ ė•Šęŗ , 파ėŧ íƒ€ėž„ėŠ¤íƒŦ프, íŦ기 및 ė•„ė´ë…¸ë“œ(inode)만 í™•ė¸í•Šë‹ˆë‹¤. ëĒ¨ë“  ëŗ€ę˛Ŋ된 파ėŧė„ ë‚˜ė—´í•œ 후, ë‹¤ėŒęŗŧ ę°™ė´ ęˇ¸ëŖší™”ëœ ëŗ€ę˛Ŋ ė‚Ŧ항 ėš”ė•Ŋė´ ė œė‹œëŠë‹ˆë‹¤: equal - ė´ė „ęŗŧ ëŗ€ę˛Ŋë˜ė§€ ė•Šė€ 파ėŧ. added - ė´ė „ė— ė—†ë˜ ėļ”ę°€ëœ 파ėŧ. removed - ė œęą°ëœ 파ėŧ. updated - íŦ기 또는 íƒ€ėž„ėŠ¤íƒŦ프가 다ëĨ¸ 파ėŧ, ėω ėˆ˜ė •ëœ 파ėŧ. moved - 동ėŧ한 ë””ėŠ¤íŦė˜ 다ëĨ¸ 디렉토ëĻŦ로 ė´ë™ëœ 파ėŧ. ė´ë“¤ė€ ė´ëĻ„, íŦ기, íƒ€ėž„ėŠ¤íƒŦ프 및 ė•„ė´ë…¸ë“œę°€ 동ėŧí•˜ė§€ë§Œ 디렉토ëĻŦ가 다ëĨ¸ 것ėœŧ로 ė‹ëŗ„ëŠë‹ˆë‹¤. copied - ė›ëŗ¸ 파ėŧė´ ė—Ŧė „ížˆ ėĄ´ėžŦ하는 동ėŧ한 ë””ėŠ¤íŦ 또는 다ëĨ¸ ë””ėŠ¤íŦ뗐 ëŗĩė‚Ŧ된 파ėŧ. ė´ë“¤ė€ 동ėŧ한 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ 氀말ėœŧëĄœė¨ ė‹ëŗ„ëŠë‹ˆ 다. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, ė´ëĻ„ëŋë§Œ ė•„ë‹ˆëŧ 렄랴 ę˛Ŋ로가 ėŧėš˜í•´ė•ŧ ė‹ëŗ„ëŠë‹ˆë‹¤. relocated - ė›ëŗ¸ė´ ė‚Ŧëŧė§„ 동ėŧ한 ë””ėŠ¤íŦ 또는 다ëĨ¸ ë””ėŠ¤íŦ로 ė´ 동된 파ėŧ. ė´ë“¤ė€ 동ėŧ한 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ 氀말ėœŧëĄœė¨ ė‹ëŗ„ëŠë‹ˆ 다. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, ė‹ëŗ„ė„ ėœ„í•´ 렄랴 ę˛Ŋ로가 ėŧėš˜ 해ė•ŧ 합니다. 동ėŧ한 ë””ėŠ¤íŦė˜ 'moved' 파ėŧęŗŧ ë‹ŦëĻŦ, ėžŦë°°ėš˜ëœ 파ėŧė€ 다ëĨ¸ inodeëĨŧ ę°€ė§‘ë‹ˆë‹¤. restored - inode는 다ëĨ´ė§€ë§Œ 디렉토ëĻŦ, ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ 프가 ėŧėš˜í•˜ëŠ” 파ėŧ. ė´ë“¤ė€ 대개 ė‚­ė œëœ 후 ëŗĩęĩŦ된 파ėŧë“¤ėž…ë‹ˆë‹¤. `sync`가 í•„ėš”í•œ ę˛Ŋ뚰, í”„ëĄœė„¸ėŠ¤ 반환 ėŊ”드는 ę¸°ëŗ¸ 0 ëŒ€ė‹  2ėž…ë‹ˆë‹¤. 반환 ėŊ”드 1ė€ ėŧë°˜ė ė¸ 똤ëĨ˜ ėĄ°ęą´ė— ė‚ŦėšŠëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.7 sync -------- 패ëĻŦ티 ė •ëŗ´ëĨŧ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ëĒ¨ë“  ėˆ˜ė •ëœ 파ėŧė„ ėŊęŗ  해당 패ëĻŦ티 ë°ė´í„°ëĨŧ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. ė´ë¯¸ ėˆ˜í–‰ëœ ėž‘ė—…ė„ ėžƒė§€ ė•Šęŗ  Ctrl+CëĨŧ 눌ëŸŦ ė–¸ė œë“ ė§€ ė´ í”„ëĄœė„¸ėŠ¤ëĨŧ ė¤‘ė§€í•  눘 ėžˆėŠĩ니다. ë‹¤ėŒ ė‹¤í–‰ ė‹œ `sync` í”„ëĄœė„¸ėŠ¤ëŠ” ė¤‘ë‹¨ëœ ęŗŗė—ė„œ ėžŦ개됩니다. ė´ í”„ëĄœė„¸ėŠ¤ 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ 발ę˛Ŧ되늴, 해당 ë¸”ëĄė€ bad로 í‘œė‹œëŠë‹ˆë‹¤. 파ėŧė€ ę˛Ŋ로 및/또는 ė•„ė´ë…¸ë“œëĄœ ė‹ëŗ„ë˜ëŠ° íŦ揰뙀 íƒ€ėž„ėŠ¤íƒŦ프로 í™•ė¸ëŠë‹ˆë‹¤. 파ėŧ íŦ기 또는 íƒ€ėž„ėŠ¤íƒŦ프가 다ëĨ´ëŠ´ 렄랴 파ėŧ뗐 대해 패ëĻŦ티 ë°ė´í„°ę°€ ėžŦęŗ„ė‚°ëŠë‹ˆë‹¤. 파ėŧė´ 동ėŧ한 ë””ėŠ¤íŦė—ė„œ ė´ë™ë˜ęą°ë‚˜ ė´ëĻ„ė´ ëŗ€ę˛Ŋë˜ęŗ  동ėŧ한 ė•„ė´ë…¸ë“œëĨŧ ėœ ė§€í•˜ëŠ´ 패ëĻŦ티는 ėžŦęŗ„ė‚°ë˜ė§€ ė•ŠėŠĩ니다. 파ėŧė´ 다ëĨ¸ ë””ėŠ¤íŦ로 ė´ë™ë˜ëŠ´ 패ëĻŦ티는 ėžŦęŗ„ė‚°ë˜ė§€ë§Œ, ė´ė „ė— ęŗ„ė‚°ëœ í•´ė‹œ ė •ëŗ´ëŠ” ėœ ė§€ëŠë‹ˆë‹¤. `content` 및 `parity` 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.8 scrub --------- ė–´ë ˆė´ëĨŧ 늤íŦëŸŊ하ė—Ŧ ë°ė´í„° 및 패ëĻŦ티 ë””ėŠ¤íŦė˜ ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 각 호ėļœė€ ė´ė „ė— 10ėŧ ė´ë‚´ė— 늤íŦëŸŊ된 ë°ė´í„°ëĨŧ ė œė™¸í•˜ęŗ  ė–´ë ˆė´ė˜ ė•Ŋ 8%ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. ė´ëŠ” ėŧėŖŧėŧ뗐 한 번 늤íŦëŸŊ하면 ëĒ¨ë“  ë°ė´í„° 비트가 ė ė–´ë„ 3ę°œė›”ë§ˆë‹¤ 한 ë˛ˆė”Š í™•ė¸ë¨ė„ ė˜ë¯¸í•Šë‹ˆë‹¤. -p, --plan ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 다ëĨ¸ 늤íŦëŸŊ ęŗ„íš 또는 ė–‘ė„ ė •ė˜í•  눘 ėžˆėœŧ늰, ë‹¤ėŒ ę°’ė„ í—ˆėšŠí•Šë‹ˆë‹¤: bad - bad로 í‘œė‹œëœ 블록 늤íŦëŸŊ. new - ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 블록 늤íŦëŸŊ. full - ëĒ¨ë“  것 늤íŦëŸŊ. 0-100 - ė§€ė •ëœ ëš„ėœ¨ė˜ 블록 늤íŦëŸŊ. ë°ąëļ„ėœ¨ ė–‘ė„ ė§€ė •í•˜ëŠ´, -o, --older-than ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ë¸”ëĄė´ ė–ŧ마나 ė˜¤ëž˜ë˜ė—ˆëŠ”ė§€ ė •ė˜í•  ėˆ˜ë„ ėžˆėŠĩ니다. 가ėžĨ ė˜¤ëž˜ëœ ë¸”ëĄė´ ë¨ŧė € 늤íŦëŸŊë˜ė–´ ėĩœė ė˜ í™•ė¸ė„ ëŗ´ėžĨ합니다. ë™ę¸°í™”ë˜ė—ˆė§€ë§Œ 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 블록만 늤íŦëŸŊ하려면, `-p new` ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 늤íŦëŸŊ ėƒíƒœė˜ 넏ëļ€ ė •ëŗ´ëĨŧ ė–ģėœŧ려늴 `status` ëĒ…ë šė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 발ę˛Ŧ된 ëĒ¨ë“  ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ė— 대해, 해당 ë¸”ëĄė€ `content` 파ėŧ뗐 bad로 í‘œė‹œëŠë‹ˆë‹¤. ė´ëŸŦ한 bad ë¸”ëĄė€ `status`뗐 ë‚˜ė—´ë˜ëŠ° `fix -e`로 ėˆ˜ė •í•  눘 ėžˆėŠĩ니다. ėˆ˜ė • 후, ë‹¤ėŒ 늤íŦëŸŊ ė‹œė— ë‹¤ė‹œ í™•ė¸ë˜ëŠ°, ėˆ˜ė •ëœ 것ėœŧ로 발ę˛Ŧ되늴 bad í‘œė‹œëŠ” ė œęą°ëŠë‹ˆë‹¤. bad 블록만 늤íŦëŸŊ하려면 `scrub -p bad` ëĒ…ë šė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ë™ę¸°í™”ë˜ė§€ ė•Šė€ ë°ė´í„°ëĄœ ė¸í•œ ëŗ´ęŗ ëœ 똤ëĨ˜ëĨŧ í”ŧ하기 ėœ„í•´ 동기화된 ė–´ë ˆė´ė—ė„œë§Œ `scrub`ė„ ė‹¤í–‰í•˜ëŠ” ę˛ƒė´ ėĸ‹ėŠĩ니다. ė´ëŸŦ한 똤ëĨ˜ëŠ” ëŦ´ë‹¨ 똤ëĨ˜ę°€ ė•„ë‹Œ 것ėœŧ로 ė¸ė‹ë˜ëŠ°, ë¸”ëĄė€ bad로 í‘œė‹œë˜ė§€ ė•Šė§€ë§Œ, ė´ëŸŦ한 똤ëĨ˜ëŠ” ëĒ…ë šė˜ ėļœë Ĩ뗐 ëŗ´ęŗ ëŠë‹ˆë‹¤. `content` 파ėŧė€ 각 ë¸”ëĄė˜ ë§ˆė§€ë§‰ í™•ė¸ ė‹œę°„ė„ ė—…ë°ė´íŠ¸í•˜ęŗ  bad ë¸”ëĄė„ í‘œė‹œí•˜ę¸° ėœ„í•´ ėˆ˜ė •ëŠë‹ˆë‹¤. `parity` 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. ė–´ë ˆė´ė˜ 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.9 fix ------- ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëĨŧ ėˆ˜ė •í•Šë‹ˆë‹¤. ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëŠ” ë§ˆė§€ë§‰ `sync`뗐 ė €ėžĨ된 ėŠ¤ëƒ…ėƒˇ ėƒíƒœė™€ 비ęĩëŠë‹ˆë‹¤. ė°¨ė´ę°€ 발ę˛Ŧ되늴 ė €ėžĨ된 ėŠ¤ëƒ…ėƒˇėœŧ로 ë˜ëŒë ¤ė§‘ë‹ˆë‹¤. **ę˛Ŋęŗ !** `fix` ëĒ…ë šė€ 똤ëĨ˜ė™€ ė˜ë„ė ė¸ ėˆ˜ė • ė‚Ŧė´ëĨŧ ęĩŦëŗ„í•˜ė§€ ė•ŠėŠĩ니다. 파ėŧ ėƒíƒœëĨŧ ëŦ´ėĄ°ęą´ ë§ˆė§€ë§‰ `sync`로 되돌ëĻŊ니다. 다ëĨ¸ ė˜ĩė…˜ė´ ė§€ė •ë˜ė§€ ė•Šėœŧ늴 렄랴 ė–´ë ˆė´ę°€ 래ëĻŦ됩니다. 필터 ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 래ëĻŦ할 파ėŧ 또는 ë””ėŠ¤íŦė˜ í•˜ėœ„ ė§‘í•Šė„ ė„ íƒí•˜ė‹­ė‹œė˜¤. `sync` 및 `scrub` 뤑뗐 bad로 í‘œė‹œëœ 블록만 ėˆ˜ė •í•˜ë ¤ëŠ´, -e, --filter-error ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 다ëĨ¸ 필터 ė˜ĩė…˜ęŗŧ ë‹ŦëĻŦ, ė´ ė˜ĩė…˜ė€ ėĩœė‹  `sync` ė´í›„ ëŗ€ę˛Ŋë˜ė§€ ė•Šė€ 파ėŧė—ë§Œ ėˆ˜ė •ė„ ė ėšŠí•Šë‹ˆë‹¤. SnapRAID는 ėˆ˜ė •í•  눘 ė—†ëŠ” ëĒ¨ë“  파ėŧ뗐 `.unrecoverable` 확ėžĨėžëĨŧ ėļ”ę°€í•˜ė—Ŧ ė´ëĻ„ė„ ëŗ€ę˛Ŋ합니다. ėˆ˜ė •í•˜ę¸° 렄뗐, 렄랴 ė–´ë ˆė´ëĨŧ 늤ėē”하ė—Ŧ ë§ˆė§€ë§‰ `sync` ė´í›„ ė´ë™ëœ 파ėŧė„ ė°žėŠĩ니다. ė´ 파ėŧë“¤ė€ ė´ëĻ„ęŗŧ 디렉토ëĻŦëĨŧ ëŦ´ė‹œí•˜ęŗ  íƒ€ėž„ėŠ¤íƒŦ프로 ė‹ëŗ„ë˜ëŠ°, í•„ėš”í•œ ę˛Ŋ뚰 ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ė— ė‚ŦėšŠëŠë‹ˆë‹¤. ėŧëļ€ íŒŒėŧė„ ė–´ë ˆė´ 뙏ëļ€ëĄœ ė´ë™í•œ ę˛Ŋ뚰, -i, --import ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ ėļ”ę°€ëĄœ 늤ėē”í•  디렉토ëĻŦëĨŧ ė§€ė •í•  눘 ėžˆėŠĩ니다. 파ėŧė€ ė•„ė´ë…¸ë“œę°€ ė•„ë‹Œ ę˛Ŋ로로만 ė‹ëŗ„ëŠë‹ˆë‹¤. `content` 파ėŧė€ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. `parity` 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. ė–´ë ˆė´ė˜ 파ėŧė€ í•„ėš”í•œ ę˛Ŋ뚰 ėˆ˜ė •ëŠë‹ˆë‹¤. 5.10 check ---------- ëĒ¨ë“  파ėŧęŗŧ 패ëĻŦ티 ë°ė´í„°ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. `fix`래ëŸŧ ėž‘ë™í•˜ė§€ë§Œ, ëŗĩęĩŦëĨŧ ė‹œëŽŦë ˆė´ė…˜í•  ëŋė´ëа ė–´ë ˆė´ė— ė–´ë–¤ ëŗ€ę˛Ŋ ė‚Ŧ항도 ę¸°ëĄë˜ė§€ ė•ŠėŠĩ니다. ė´ ëĒ…ë šė€ ėŖŧ로 ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ 후 또는 기타 íŠšëŗ„í•œ ėĄ°ęą´ė—ė„œė™€ ę°™ė´ ėˆ˜ë™ í™•ė¸ė„ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ėŖŧę¸°ė ė´ęŗ  똈ė•Ŋ된 í™•ė¸ė„ ėœ„í•´ė„œëŠ” `scrub`ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. -a, --audit-only ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ 파ėŧ ë°ė´í„°ë§Œ í™•ė¸í•˜ęŗ  패ëĻŦ티 ë°ė´í„°ëŠ” ëŦ´ė‹œí•˜ė—Ŧ ė‹¤í–‰ ė†ë„ëĨŧ 높ėŧ 눘 ėžˆėŠĩ니다. 파ėŧė€ ė•„ė´ë…¸ë“œę°€ ė•„ë‹Œ ę˛Ŋ로로만 ė‹ëŗ„ëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.11 list --------- ë§ˆė§€ë§‰ `sync` ė‹œė ė— ė–´ë ˆė´ė— íŦ함된 ëĒ¨ë“  파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. -v 또는 --verboseëĨŧ ė‚ŦėšŠí•˜ëŠ´ í•˜ėœ„ 봈 ė‹œę°„ë„ í‘œė‹œëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.12 dup -------- ëĒ¨ë“  뤑ëŗĩ 파ėŧė„ ë‚˜ė—´í•Šë‹ˆë‹¤. 두 파ėŧė˜ í•´ė‹œę°€ ėŧėš˜í•˜ëŠ´ 동ėŧ한 것ėœŧ로 간ėŖŧ됩니다. 파ėŧ ë°ė´í„°ëŠ” ėŊė§€ ė•Šęŗ , 미ëĻŦ ęŗ„ė‚°ëœ í•´ė‹œë§Œ ė‚ŦėšŠëŠë‹ˆë‹¤. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.13 pool --------- `pooling` 디렉토ëĻŦė—ė„œ ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ëĒ¨ë“  파ėŧ뗐 대한 ę°€ėƒ 롰ëĨŧ ėƒė„ąí•˜ęą°ë‚˜ ė—…ë°ė´íŠ¸í•Šë‹ˆë‹¤. 파ėŧė€ ëŗĩė‚Ŧë˜ė§€ ė•Šęŗ  ė‹ŦëŗŧëĻ­ 링íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė—°ę˛°ëŠë‹ˆë‹¤. ė—…ë°ė´íŠ¸ ė‹œ, ëĒ¨ë“  ę¸°ėĄ´ ė‹ŦëŗŧëĻ­ 링íŦ뙀 뚈 í•˜ėœ„ 디렉토ëĻŦ는 ė‚­ė œë˜ęŗ  ė–´ë ˆė´ė˜ 냈 뷰로 ëŒ€ė˛´ëŠë‹ˆë‹¤. 다ëĨ¸ ėŧ반 파ėŧė€ ė œėžëĻŦ뗐 남ėŠĩ니다. 풀 디렉토ëĻŦ 뙏ëļ€ė—ė„œëŠ” ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.14 devices ------------ ė–´ë ˆė´ė—ė„œ ė‚ŦėšŠë˜ëŠ” ė €ėˆ˜ė¤€(low-level) ėžĨėš˜ëĨŧ ėļœë Ĩ합니다. ė´ ëĒ…ë šė€ ė–´ë ˆė´ė˜ ėžĨėš˜ ė—°ę˛°ė„ í‘œė‹œí•˜ëŠ°, ėŖŧ로 늤íŦëĻŊ트 ė¸í„°íŽ˜ė´ėŠ¤ëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ė˛˜ėŒ 두 ė—´ė€ ė €ėˆ˜ė¤€ ėžĨėš˜ ID 및 ę˛ŊëĄœėž…ë‹ˆë‹¤. ë‹¤ėŒ 두 ė—´ė€ ęŗ ėˆ˜ė¤€(high-level) ėžĨėš˜ ID 및 ę˛ŊëĄœėž…ë‹ˆë‹¤. ë§ˆė§€ë§‰ ė—´ė€ ė–´ë ˆė´ė˜ ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. 대ëļ€ëļ„ė˜ ę˛Ŋ뚰, ė–´ë ˆė´ė˜ 각 ë””ėŠ¤íŦ뗐 대해 í•˜ë‚˜ė˜ ė €ėˆ˜ė¤€ ėžĨėš˜ę°€ ėžˆė§€ë§Œ, ėŧëļ€ ë” ëŗĩėžĄí•œ ęĩŦė„ąė—ė„œëŠ” 단ėŧ ė–´ë ˆė´ ë””ėŠ¤íŦ뗐 ė˜í•´ ė‚ŦėšŠë˜ëŠ” ė—ŦëŸŦ ė €ėˆ˜ė¤€ ėžĨėš˜ę°€ ėžˆė„ 눘 ėžˆėŠĩ니다. ė•„ëŦ´ę˛ƒë„ ėˆ˜ė •ë˜ė§€ ė•ŠėŠĩ니다. 5.15 touch ---------- í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ėœŧ로 ė„¤ė •ëœ ëĒ¨ë“  파ėŧ뗐 ėž„ė˜ė˜ í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ ė„¤ė •í•Šë‹ˆë‹¤. ė´ëŠ” íƒ€ėž„ėŠ¤íƒŦ프ëĨŧ ęą°ė˜ ęŗ ėœ í•˜ę˛Œ ë§Œë“¤ė–´ 가ëŠĨ한 뤑ëŗĩė„ ė¤„ė´ë¯€ëĄœ, SnapRAID가 ė´ë™ë˜ęą°ë‚˜ ëŗĩė‚Ŧ된 파ėŧė„ ė¸ė‹í•˜ëŠ” ëŠĨë Ĩė„ í–Ĩėƒė‹œí‚ĩ니다. 더 ęĩŦ랴렁ėœŧ로, í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė´ ė•„ë‹Œ ę˛Ŋ뚰, ė´ë™ë˜ęą°ë‚˜ ëŗĩė‚Ŧ된 파ėŧė€ ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프가 ėŧėš˜í•˜ëŠ´ 그렇게 ė‹ëŗ„ëŠë‹ˆë‹¤. í•˜ėœ„ 봈 íƒ€ėž„ėŠ¤íƒŦ프가 0ė¸ ę˛Ŋ뚰, 렄랴 ę˛Ŋ로, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦ프가 ëĒ¨ë‘ ėŧėš˜í•˜ëŠ” ę˛Ŋėš°ė—ë§Œ ëŗĩė‚Ŧëŗ¸ėœŧ로 간ėŖŧ됩니다. 봈 ë‹¨ėœ„ ė •ë°€ë„ė˜ íƒ€ėž„ėŠ¤íƒŦ프는 ėˆ˜ė •ë˜ė§€ ė•Šėœŧë¯€ëĄœ, 파ėŧė˜ ëĒ¨ë“  ë‚ ė§œė™€ ė‹œę°„ė€ ëŗ´ėĄ´ëŠë‹ˆë‹¤. 5.16 rehash ----------- 렄랴 ė–´ë ˆė´ė˜ ėžŦí•´ė‹œ(rehash)ëĨŧ 똈ė•Ŋ합니다. ė´ ëĒ…ë šė€ ė‚ŦėšŠë˜ëŠ” í•´ė‹œ ėĸ…ëĨ˜ëĨŧ ëŗ€ę˛Ŋ하며, ėŧë°˜ė ėœŧ로 32비트 ė‹œėŠ¤í…œė—ė„œ 64비트 ė‹œėŠ¤í…œėœŧ로 ė—…ęˇ¸ë ˆė´ë“œí•  때 MurmurHash3ė—ė„œ 더 ëš ëĨ¸ SpookyHash로 ė „í™˜í•˜ę¸° ėœ„í•´ ė‚ŦėšŠëŠë‹ˆë‹¤. ė´ë¯¸ ėĩœė ė˜ í•´ė‹œëĨŧ ė‚ŦėšŠí•˜ęŗ  ėžˆë‹¤ëŠ´, ė´ ëĒ…ë šė€ ė•„ëŦ´ę˛ƒë„ í•˜ė§€ ė•Šęŗ  ėĄ°ėš˜ę°€ í•„ėš”í•˜ė§€ ė•ŠėŒė„ ė•Œë ¤ė¤ë‹ˆë‹¤. ėžŦí•´ė‹œëŠ” ėĻ‰ė‹œ ėˆ˜í–‰ë˜ė§€ ė•Šęŗ  `sync` 및 `scrub` 뤑뗐 렐맄렁ėœŧ로 ė§„í–‰ëŠë‹ˆë‹¤. `status`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėžŦí•´ė‹œ ėƒíƒœëĨŧ í™•ė¸í•  눘 ėžˆėŠĩ니다. ėžŦí•´ė‹œ ė¤‘ė—ë„ SnapRAID는 렄랴 기ëŠĨė„ ėœ ė§€í•˜ëŠ°, 뜠ėŧ한 ė˜ˆė™¸ëŠ” `dup`가 다ëĨ¸ í•´ė‹œëĨŧ ė‚ŦėšŠí•˜ëŠ” 뤑ëŗĩ 파ėŧė„ ę°ė§€í•  눘 ė—†ë‹¤ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 5.17 locate ----------- 패ëĻŦ티 ë””ėŠ¤íŦ뗐 ė €ėžĨ된 파ėŧė„ ė°žėŠĩ니다. ėŧėš˜í•˜ëŠ” 각 파ėŧ뗐 대해 패ëĻŦ티 파ėŧ ë‚´ė˜ ėœ„ėš˜ė™€ ė ėœ í•˜ęŗ  ėžˆëŠ” ėĄ°ę°(fragment)ė˜ 눘ëĨŧ ėļœë Ĩ합니다. -t, --tail ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė—Ŧ 패ëĻŦí‹°ė˜ ė§€ė •ëœ ęŧŦëĻŦ(tail) ëļ€ëļ„ė„ ė ėœ í•˜ëŠ” 파ėŧ로 ėž‘ė—…ė„ ė œí•œí•  눘 ėžˆėŠĩ니다. ė´ 파ėŧë“¤ė„ ėžŦ할당하려면 -W, --force-realloc-tail ė˜ĩė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ėžŦ할당 ęŗŧė • ë™ė•ˆ 해당 파ėŧë“¤ė€ 패ëĻŦí‹°ė— ė˜í•´ ëŗ´í˜¸ë˜ė§€ ė•Šėœŧë¯€ëĄœ ėŖŧė˜í•˜ė‹­ė‹œė˜¤. 6 OPTIONS ========= SnapRAID는 ë‹¤ėŒ ė˜ĩė…˜ė„ 렜ęŗĩ합니다: -c, --conf CONFIG ė‚ŦėšŠí•  네렕 파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė§€ė •í•˜ė§€ ė•Šėœŧ늴 Unixė—ė„œëŠ” `/usr/local/etc/snapraid.conf` 파ėŧė´ ėĄ´ėžŦ하면 ė‚ŦėšŠí•˜ęŗ , ęˇ¸ë ‡ė§€ ė•Šėœŧ늴 `/etc/snapraid.conf`ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. Windowsė—ė„œëŠ” `snapraid.exe`뙀 ę°™ė€ 디렉토ëĻŦ뗐 ėžˆëŠ” `snapraid.conf` 파ėŧė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. -f, --filter PATTERN `check` 및 `fix`ė—ė„œ 래ëĻŦ할 파ėŧė„ 필터링합니다. ė§€ė •ëœ 패턴ęŗŧ ėŧėš˜í•˜ëŠ” 파ėŧ만 래ëĻŦ됩니다. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 패턴 ė‚Ŧ떑뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ PATTERN ė„šė…˜ė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. Unixė—ė„œëŠ” 글로빙 ëŦ¸ėžę°€ ė‚ŦėšŠë˜ëŠ” ę˛Ŋ뚰 ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. `sync` 및 `scrub`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. -d, --filter-disk NAME `check`, `fix`, `up`, 및 `down`ė—ė„œ 래ëĻŦ할 ë””ėŠ¤íŦëĨŧ 필터링합니다. 네렕 파ėŧ뗐 ė •ė˜ëœ ë””ėŠ¤íŦ ė´ëĻ„ė„ ė§€ė •í•´ė•ŧ 합니다. 또한 `parity`, `2-parity`, `3-parity` ë“ąė˜ ė´ëĻ„ėœŧ로 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ ė§€ė •í•˜ė—Ŧ íŠšė • 패ëĻŦ티 ë””ėŠ¤íŦ로 ėž‘ė—…ė„ ė œí•œí•  눘 ėžˆėŠĩ니다. ė—ŦëŸŦ --filter, --filter-disk, --filter-missing ė˜ĩė…˜ė„ 결합하면, ëĒ¨ë“  í•„í„°ė™€ ėŧėš˜í•˜ëŠ” 파ėŧ만 ė„ íƒëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `check`, `fix`, `up`, 및 `down`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. `sync` 및 `scrub`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. -m, --filter-missing `check` 및 `fix`ė—ė„œ 래ëĻŦ할 파ėŧė„ 필터링합니다. ė–´ë ˆė´ė—ė„œ 누ëŊ되거나 ė‚­ė œëœ 파ėŧ만 래ëĻŦ됩니다. `fix`뙀 함ęģ˜ ė‚ŦėšŠí•˜ëŠ´, ė´ ė˜ĩė…˜ė€ `undelete` ëĒ…ë š ė—­í• ė„ 합니다. ė—ŦëŸŦ --filter, --filter-disk, --filter-missing ė˜ĩė…˜ė„ 결합하면, ëĒ¨ë“  í•„í„°ė™€ ėŧėš˜í•˜ëŠ” 파ėŧ만 ė„ íƒëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. `sync` 및 `scrub`ė€ í•­ėƒ 렄랴 ė–´ë ˆė´ëĨŧ 래ëĻŦí•˜ë¯€ëĄœ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. -e, --filter-error `check` 및 `fix`ė—ė„œ 똤ëĨ˜ę°€ ėžˆëŠ” 파ėŧė„ 래ëĻŦ합니다. `status`뗐 ë‚˜ė—´ëœ 대로 `sync` 및 `scrub` 뤑뗐 ëŦ´ë‹¨ 또는 ėž…ėļœë Ĩ 똤ëĨ˜ę°€ í‘œė‹œëœ ë¸”ëĄė„ 氀맄 파ėŧ만 래ëĻŦ합니다. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -p, --plan PERC|bad|new|full 늤íŦëŸŊ ęŗ„íšė„ ė„ íƒí•Šë‹ˆë‹¤. PERC가 0ė—ė„œ 100 ė‚Ŧė´ė˜ ėˆĢėž ę°’ė¸ ę˛Ŋ뚰, 늤íŦëŸŊ할 ë¸”ëĄė˜ ë°ąëļ„ėœ¨ëĄœ í•´ė„ëŠë‹ˆë‹¤. ë°ąëļ„ėœ¨ ëŒ€ė‹  ęŗ„íšė„ ė§€ė •í•  눘 ėžˆėŠĩ니다: `bad`는 bad ë¸”ëĄė„ 늤íŦëŸŊí•˜ęŗ , `new`는 땄링 늤íŦëŸŊë˜ė§€ ė•Šė€ 막 동기화된 ë¸”ëĄė„ 늤íŦëŸŊ하며, `full`ė€ ëĒ¨ë“  ę˛ƒė„ 늤íŦëŸŊ합니다. ė´ ė˜ĩė…˜ė€ `scrub`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -o, --older-than DAYS `scrub`ė—ė„œ 래ëĻŦ할 ė–´ë ˆė´ė˜ 가ėžĨ ė˜¤ëž˜ëœ ëļ€ëļ„ė„ ė„ íƒí•Šë‹ˆë‹¤. DAYS는 ë¸”ëĄė´ 늤íŦëŸŊë˜ė–´ė•ŧ 하는 ėĩœė†Œ ėŧë š(days)ė´ëŠ°, ę¸°ëŗ¸ę°’ė€ 10ėž…ë‹ˆë‹¤. bad로 í‘œė‹œëœ ë¸”ëĄė€ ė´ ė˜ĩė…˜ė— ę´€ęŗ„ė—†ė´ í•­ėƒ 늤íŦëŸŊ됩니다. ė´ ė˜ĩė…˜ė€ `scrub`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -a, --audit-only `check`ė—ė„œ 패ëĻŦ티 ë°ė´í„°ëĨŧ í™•ė¸í•˜ė§€ ė•Šęŗ  파ėŧė˜ í•´ė‹œëĨŧ í™•ė¸í•Šë‹ˆë‹¤. 파ėŧ ë°ė´í„°ë§Œ í™•ė¸í•˜ëŠ” 데 관ė‹Ŧė´ ėžˆë‹¤ëŠ´, ė´ ė˜ĩė…˜ė€ í™•ė¸ í”„ëĄœė„¸ėŠ¤ė˜ ė†ë„ëĨŧ ėƒë‹šížˆ 높ėŧ 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `check`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -h, --pre-hash `sync`ė—ė„œ 패ëĻŦ티 ęŗ„ė‚° 렄뗐 ėļ”ę°€ í™•ė¸ė„ ėœ„í•´ ëĒ¨ë“  냈 ë°ė´í„°ė— 대한 ė˜ˆëš„ í•´ė‹œ ë‹¨ęŗ„ëĨŧ ė‹¤í–‰í•Šë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 `sync`ė—ė„œëŠ” ė˜ˆëš„ í•´ė‹œę°€ ėˆ˜í–‰ë˜ė§€ ė•Šėœŧ늰, 냈 ë°ė´í„°ëŠ” 패ëĻŦ티 ęŗ„ė‚° 링렄뗐 ė˛˜ėŒ ėŊė„ 때 í•´ė‹œëŠë‹ˆë‹¤. ė´ í”„ëĄœė„¸ėŠ¤ëŠ” ëĒ¨ë“  ë””ėŠ¤íŦ가 íšŒė „í•˜ęŗ  CPU가 ë°”ėœ, ė‹œėŠ¤í…œė´ ęŗŧëļ€í•˜ ėƒíƒœėŧ 때 ë°œėƒí•Šë‹ˆë‹¤. ė´ëŠ” ę¸°ęŗ„ė˜ 극한 ėĄ°ęą´ė´ëŠ°, ėž ėžŦ된 í•˜ë“œė›¨ė–´ ëŦ¸ė œę°€ ėžˆëŠ” ę˛Ŋ뚰 ë°ė´í„°ę°€ 땄링 í•´ė‹œë˜ė§€ ė•Šė•˜ę¸° 때ëŦ¸ė— ëŦ´ë‹¨ 똤ëĨ˜ę°€ ę°ė§€ë˜ė§€ ė•Šęŗ  ė§€ë‚˜ę°ˆ 눘 ėžˆėŠĩ니다. ė´ëŸŦ한 ėœ„í—˜ė„ í”ŧ하려면, `pre-hash` ëĒ¨ë“œëĨŧ í™œė„ąí™”í•˜ė—Ŧ ëĒ¨ë“  ë°ė´í„°ëĨŧ 두 번 ėŊė–´ ëŦ´ę˛°ė„ąė„ ëŗ´ėžĨ할 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ 또한 ė–´ë ˆė´ ë‚´ė—ė„œ ė´ë™ëœ 파ėŧė„ í™•ė¸í•˜ė—Ŧ ė´ë™ ėž‘ė—…ė´ ė„ąęŗĩí–ˆëŠ”ė§€ í™•ė¸í•˜ęŗ , í•„ėš”í•œ ę˛Ŋ뚰 ęŗ„ė† ė§„í–‰í•˜ę¸° 렄뗐 fix ėž‘ė—…ė„ ė‹¤í–‰í•  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -i, --import DIR ė§€ė •ëœ 디렉토ëĻŦė—ė„œ ë§ˆė§€ë§‰ `sync` ė´í›„ ė–´ë ˆė´ė—ė„œ ė‚­ė œëœ 파ėŧė„ 氀렏ė˜ĩ니다. ė´ëŸŦ한 파ėŧė´ ė—Ŧė „ížˆ ėžˆëŠ” ę˛Ŋ뚰, ė´ë“¤ė€ `check` 및 `fix`뗐 ė˜í•´ ëŗĩęĩŦ í”„ëĄœė„¸ėŠ¤ëĨŧ ę°œė„ í•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 파ėŧė€ í•˜ėœ„ 디렉토ëĻŦëĨŧ íŦ함하ė—Ŧ ėŊ히며, ė´ëτ뗐 ę´€ęŗ„ė—†ė´ ė‹ëŗ„ëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `check` 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -s, --spin-down-on-error 똤ëĨ˜ ë°œėƒ ė‹œ, 0ė´ ė•„ë‹Œ ėƒíƒœ ėŊ”ë“œëĄœ ėĸ…ëŖŒí•˜ę¸° 렄뗐 관ëĻŦ되는 ëĒ¨ë“  ë””ėŠ¤íŦëĨŧ íšŒė „ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ė¤‘ë‹¨ëœ ėž‘ė—… í›„ė— 드ëŧė´ë¸Œę°€ ęŗ„ė† í™œė„ą ėƒíƒœëĄœ íšŒė „í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•˜ė—Ŧ ëļˆí•„ėš”í•œ ė—´ ėļ•렁 및 ė „ë Ĩ ė†Œëš„ëĨŧ ë°Šė§€í•˜ëŠ” 데 ë„ė›€ė´ 됩니다. ëĒ…ë šė´ ė‹¤íŒ¨í•˜ë”ëŧ도 ë””ėŠ¤íŦ가 ė•ˆė „í•˜ę˛Œ ė¤‘ė§€ë˜ë„ëĄ ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. -w, --bw-limit RATE ëĒ¨ë“  ë””ėŠ¤íŦ뗐 대한 ė „ė—­ ëŒ€ė—­í­ ė œí•œė„ ė ėšŠí•Šë‹ˆë‹¤. RATE는 ė´ˆë‹š ë°”ė´íŠ¸ ėˆ˜ėž…ë‹ˆë‹¤. K, M, 또는 G뙀 ę°™ė€ ėŠšėˆ˜(똈: --bw-limit 1G)ëĨŧ ė§€ė •í•  눘 ėžˆėŠĩ니다. -t, --tail íŦ기 패ëĻŦ티 ë””ėŠ¤íŦė˜ ė§€ė •ëœ ęŧŦëĻŦ íŦ기 ė´í•˜ëĨŧ ė‚ŦėšŠí•˜ëŠ” 파ėŧ로 ëĒŠëĄė„ ė œí•œí•Šë‹ˆë‹¤. K, M, G, T뙀 ę°™ė€ ë°°ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다 (똈: --tail 1G). ė´ ė˜ĩė…˜ė€ `locate` ëĒ…ë šęŗŧ 함ęģ˜ ė‚ŦėšŠí•  때만 ėœ íš¨í•Šë‹ˆë‹¤. -A, --stats ėļ”ę°€ ė •ëŗ´ëĨŧ ëŗ´ė—ŦėŖŧ는 확ėžĨ된 ėƒíƒœ ëŗ´ę¸°ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. í™”ëŠ´ė—ëŠ” 두 ę°œė˜ 그래프가 í‘œė‹œëŠë‹ˆë‹¤: ė˛Ģ ë˛ˆė§¸ 그래프는 각 ë””ėŠ¤íŦ뗐 대한 버íŧ링된 ėŠ¤íŠ¸ëŧė´í”„ ėˆ˜ė™€ 함ęģ˜ í•´ë‹š ë””ėŠ¤íŦė—ė„œ 현ėžŦ ė•Ąė„¸ėŠ¤ ė¤‘ė¸ 파ėŧė˜ ę˛Ŋ로ëĨŧ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 가ėžĨ 느ëϰ ë””ėŠ¤íŦ는 ė‚ŦėšŠ 가ëŠĨ한 버íŧ가 ė—†ėœŧ늰, ė´ëŠ” ë‹Ŧė„ą 가ëŠĨ한 ėĩœëŒ€ ëŒ€ė—­í­ė„ ę˛°ė •í•Šë‹ˆë‹¤. 두 ë˛ˆė§¸ 그래프는 ė§€ë‚œ 100봈 ë™ė•ˆ 대기하는 데 ė†Œëš„ëœ ė‹œę°„ė˜ ë°ąëļ„ėœ¨ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. 가ėžĨ 느ëϰ ë””ėŠ¤íŦ가 대ëļ€ëļ„ė˜ 대기 ė‹œę°„ė„ ėœ ë°œí•  것ėœŧ로 ė˜ˆėƒë˜ëŠ°, 다ëĨ¸ ë””ėŠ¤íŦ는 버íŧ링된 ėŠ¤íŠ¸ëŧė´í”„ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėœŧë¯€ëĄœ 대기 ė‹œę°„ė´ ęą°ė˜ 또는 ė „í˜€ 뗆떴ė•ŧ 합니다. ė´ 그래프는 또한 í•´ė‹œ ęŗ„ė‚° 및 RAID ęŗ„ė‚°ė„ ėœ„í•´ ė†Œëš„ëœ ė‹œę°„ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. ëĒ¨ë“  ęŗ„ė‚°ė€ ë””ėŠ¤íŦ ėž‘ė—…ęŗŧ ëŗ‘ë Ŧ로 ė‹¤í–‰ëŠë‹ˆë‹¤. 따ëŧė„œ ė ė–´ë„ í•˜ë‚˜ė˜ ë””ėŠ¤íŦ뗐 대해 ė¸Ąė • 가ëŠĨ한 대기 ė‹œę°„ė´ ėžˆëŠ” 한, ė´ëŠ” CPU가 ė›ŒíŦëĄœë“œė— ėļŠëļ„히 ëš ëĨ´ë‹¤ëŠ” ę˛ƒė„ 나타냅니다. -Z, --force-zero ė´ė „ė— 0ė´ ė•„ë‹ˆė—ˆë˜ íŦ기가 0ė¸ 파ėŧė˜ 동기화ëŧ는 ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ė„ ę°•ė œí•Šë‹ˆë‹¤. SnapRAID가 ė´ëŸŦ한 ėĄ°ęą´ė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ė‹œėŠ¤í…œ ėļŠëŒ 후 ėŧëļ€ ė•Ąė„¸ėŠ¤ëœ 파ėŧė´ ėž˜ë ¸ė„ 때 ė‰Ŋ枌 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ė´ëŠ” ext3/ext4 파ėŧ ė‹œėŠ¤í…œė„ ė‚ŦėšŠí•˜ëŠ” Linuxė—ė„œ 가ëŠĨ한 ėĄ°ęą´ėž…ë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -E, --force-empty ė›ëž˜ ë””ėŠ¤íŦ뗐 ėžˆë˜ ëĒ¨ë“  파ėŧė´ 누ëŊ된 ë””ėŠ¤íŦė˜ 동기화ëŧ는 ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ė„ ę°•ė œí•Šë‹ˆë‹¤. SnapRAID가 ë””ėŠ¤íŦ뗐 ė›ëž˜ ėžˆë˜ ëĒ¨ë“  파ėŧė´ 누ëŊ되거나 ë‹¤ė‹œ ėž‘ė„ąë˜ė—ˆėŒė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ë°ė´í„° 파ėŧ ė‹œėŠ¤í…œė´ ë§ˆėš´íŠ¸ë˜ė§€ ė•Šė•˜ė„ 때 ė‰Ŋ枌 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -U, --force-uuid UUID가 ëŗ€ę˛Ŋ된 ë””ėŠ¤íŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 동기화, í™•ė¸ 및 ėˆ˜ė •ė„ ę°•ė œí•˜ëŠ” ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ėž…ë‹ˆë‹¤. SnapRAID가 ėŧëļ€ ë””ėŠ¤íŦė˜ UUID가 ëŗ€ę˛Ŋë˜ė—ˆėŒė„ ę°ė§€í•˜ëŠ´, ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•ŠëŠ” 한 ė§„í–‰ė„ ė¤‘ė§€í•Šë‹ˆë‹¤. ė´ëŠ” ë””ėŠ¤íŦ가 ėž˜ëĒģ된 ë§ˆėš´íŠ¸ 맀렐뗐 ë§ˆėš´íŠ¸ë˜ė—ˆė„ 때 ę°ė§€í•  눘 ėžˆë„ëĄ 합니다. ꡸ëŸŦ나 단ėŧ 패ëĻŦ티ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰 í•˜ë‚˜ė˜ UUID ëŗ€ę˛Ŋė´ í—ˆėšŠë˜ëŠ°, ė—ŦëŸŦ 패ëĻŦ티ëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰 더 ë§Žė€ ëŗ€ę˛Ŋė´ í—ˆėšŠëŠë‹ˆë‹¤. ė´ëŠ” ëŗĩęĩŦ 후 ë””ėŠ¤íŦëĨŧ ęĩė˛´í•  ë•Œė˜ ėŧë°˜ė ė¸ ę˛Ŋėš°ė´ę¸° 때ëŦ¸ėž…니다. ė´ ė˜ĩė…˜ė€ `sync`, `check`, 또는 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -D, --force-device ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ë””ėŠ¤íŦ 또는 동ėŧ한 ëŦŧëĻŦ렁 ėžĨėš˜ė— ėžˆëŠ” ë””ėŠ¤íŦ로 ėˆ˜ė •ė„ ę°•ė œí•˜ëŠ” ė•ˆė „í•˜ė§€ ė•Šė€ ėž‘ė—…ėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´, 두 ę°œė˜ ë°ė´í„° ë””ėŠ¤íŦëĨŧ ėžƒęŗ  ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ만 ëŗĩęĩŦ하기 ėœ„í•´ ė˜ˆëš„ ë””ėŠ¤íŦ가 ėžˆëŠ” ę˛Ŋ뚰, 두 ë˛ˆė§¸ ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ë””ėŠ¤íŦëĨŧ ëŦ´ė‹œí•  눘 ėžˆėŠĩ니다. 또는 ė´ë¯¸ ė‚ŦėšŠ ė¤‘ė¸ ë””ėŠ¤íŦ뗐 ë‚¨ė€ ė—Ŧ뜠 ęŗĩ氄뗐 ë””ėŠ¤íŦëĨŧ ëŗĩęĩŦ하려는 ę˛Ŋ뚰, 동ėŧ한 ëŦŧëĻŦ렁 ėžĨėš˜ëĨŧ ęŗĩėœ í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -N, --force-nocopy `sync`, `check`, 및 `fix`ė—ė„œ ëŗĩė‚Ŧ 氐맀 발ę˛Ŧ법(heuristic)ė„ ëš„í™œė„ąí™”í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė—†ėœŧ늴 SnapRAID는 ė´ëĻ„, íŦ기 및 íƒ€ėž„ėŠ¤íƒŦí”„ė™€ ę°™ė€ 동ėŧ한 ė†ė„ąė„ 氀맄 파ėŧė´ 동ėŧ한 ë°ė´í„°ëĨŧ 氀맄 ëŗĩė‚Ŧëŗ¸ė´ëŧęŗ  ę°€ė •í•Šë‹ˆë‹¤. ė´ëŠ” 한 ë””ėŠ¤íŦė—ė„œ 다ëĨ¸ ë””ėŠ¤íŦ로 ëŗĩė‚Ŧ되거나 ė´ë™ëœ 파ėŧė„ ė‹ëŗ„í•˜ęŗ , ė´ë¯¸ ęŗ„ė‚°ëœ í•´ė‹œ ė •ëŗ´ëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ëŦ´ë‹¨ 똤ëĨ˜ëĨŧ ę°ė§€í•˜ęą°ë‚˜ 누ëŊ된 파ėŧė„ ëŗĩęĩŦ할 눘 ėžˆë„ëĄ 합니다. ėŧëļ€ ë“œëŦ¸ ę˛Ŋėš°ė— ė´ ë™ėž‘ė€ ė˜¤íƒ(false positives) 또는 ë§Žė€ í•´ė‹œ í™•ė¸ėœŧ로 ė¸í•œ 느ëϰ í”„ëĄœė„¸ėŠ¤ëĨŧ ė´ˆëž˜í•  눘 ėžˆėœŧ늰, ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ ė´ëŸŦ한 ëŦ¸ė œëĨŧ 해결할 눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `sync`, `check`, 및 `fix`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -F, --force-full `sync`ė—ė„œ 패ëĻŦí‹°ė˜ 렄랴 ėžŦęŗ„ė‚°ė„ ę°•ė œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ 냈 패ëĻŦ티 ėˆ˜ė¤€ė„ ėļ”ę°€í•˜ęą°ë‚˜, 더 ėĩœęˇŧė˜ 패ëĻŦ티 ë°ė´í„°ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė´ė „ content 파ėŧ로 ë˜ëŒë ¸ė„ 때 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. ė˛˜ėŒëļ€í„° 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•˜ëŠ” ëŒ€ė‹ , ė´ ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ëŠ´ content 파ėŧ뗐 ėžˆëŠ” í•´ė‹œëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ë°ė´í„°ëĨŧ 검ėĻí•˜ęŗ  ę¸°ėĄ´ 패ëĻŦ티 ë°ė´í„°ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ `sync` í”„ëĄœė„¸ėŠ¤ 뤑뗐 ë°ė´í„° ëŗ´í˜¸ëĨŧ ėœ ė§€í•  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. -R, --force-realloc `sync`ė—ė„œ 파ėŧė˜ 렄랴 ėžŦ할당 및 패ëĻŦ티 ėžŦ빌드ëĨŧ ę°•ė œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ content 파ėŧ뗐 ėžˆëŠ” í•´ė‹œëĨŧ ėžŦė‚ŦėšŠí•˜ė—Ŧ ë°ė´í„°ëĨŧ 검ėĻí•˜ëŠ´ė„œ 단편화ëĨŧ ė œęą°í•˜ęŗ  ëĒ¨ë“  파ėŧė„ ė™„ė „ížˆ ėžŦ할당하는 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ `sync`ė—ė„œë§Œ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė‚ŦėšŠí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. `sync` ėž‘ė—… ė¤‘ė—ëŠ” ë°ė´í„° ëŗ´í˜¸ę°€ ė—†ėŠĩ니다. -W, --force-realloc-tail íŦ기 -R, --force-reallocęŗŧ ę°™ė´ ėž‘ë™í•˜ė§€ë§Œ, 각 패ëĻŦ티 파ėŧė˜ ė§€ė •ëœ ęŧŦëĻŦ ëļ€ëļ„(ë§ˆė§€ë§‰ 'íŦ기' ë°”ė´íŠ¸)ėœŧ로 ė œí•œëŠë‹ˆë‹¤. 현ėžŦ 해당 ęŧŦëĻŦ ė„šė…˜ė— ė €ėžĨ된 ëĒ¨ë“  파ėŧ ėĄ°ę°/ë¸”ëĄė˜ ėžŦ할당(ė´ë™)ė„ ę°•ė œí•˜ė—Ŧ, ė—Ŧ뜠 ęŗĩę°„ė´ ėžˆëŠ” 패ëĻŦ티 파ėŧ ë‚´ė˜ ė–´ëŠ ęŗŗė´ë“ (ę¸°ėĄ´ 뚈 ęŗĩ간 íŦ함) ë°°ėš˜ë  눘 ėžˆë„ëĄ 합니다. ė´ ė˜ĩė…˜ė˜ ėŖŧėš” ëĒŠė ė€ 패ëĻŦ티 파ėŧė˜ ë””ėŠ¤íŦ냁 íŦ기ëĨŧ ė¤„ė´ëŠ” ę˛ƒėž…ë‹ˆë‹¤. ėžŦí• ë‹šė„ í†ĩ해 렄랴 ęŧŦëĻŦ ė„šė…˜ė´ ė„ąęŗĩ렁ėœŧ로 ëš„ė›Œė§€ëŠ´(ë‚¨ė€ ë¸”ëĄė´ ė—†ėŒ), 패ëĻŦ티 파ėŧė´ ėž˜ëĻŦęŗ (truncated) ė‚ŦėšŠë˜ė§€ ė•ŠëŠ” ęŧŦëĻŦ ęŗĩę°„ė„ íšŒėˆ˜í•Šë‹ˆë‹¤. K, M, G, T뙀 ę°™ė€ ë°°ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다 (똈: --force-realloc-tail 1G). locate -t, --tailė„ ė‚ŦėšŠí•˜ė—Ŧ 똁í–Ĩė„ 받는 파ėŧė„ ė‚Ŧ렄뗐 í™•ė¸í•  눘 ėžˆėŠĩ니다. ę˛Ŋęŗ ! ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė‚ŦėšŠí•˜ė§€ ė•Šė„ ę˛ƒė„ 강ë Ĩ히 ęļŒėžĨ합니다. 똁í–Ĩė„ 받는 파ėŧ뗐 ëŒ€í•´ė„œëŠ” `sync` ėž‘ė—… ë™ė•ˆ ë°ė´í„° ëŗ´í˜¸ëĨŧ ë°›ė„ 눘 ė—†ėŠĩ니다. -l, --log FILE ė§€ė •ëœ 파ėŧ뗐 ėžė„¸í•œ 로그ëĨŧ 기록합니다. ė´ ė˜ĩė…˜ė„ ė§€ė •í•˜ė§€ ė•Šėœŧ늴 ė˜ˆėƒėš˜ ëĒģ한 똤ëĨ˜ę°€ í™”ëŠ´ė— ėļœë Ĩë˜ė–´, ë§Žė€ 똤ëĨ˜ę°€ ë°œėƒí•˜ëŠ” ę˛Ŋ뚰 ęŗŧ도한 ėļœë Ĩė´ ë°œėƒí•  눘 ėžˆėŠĩ니다. -l, --log가 ė§€ė •ë˜ëŠ´ SnapRAID가 ė¤‘ė§€ë˜ëŠ” ėš˜ëĒ…ė ė¸ 똤ëĨ˜ë§Œ í™”ëŠ´ė— ėļœë Ĩ됩니다. ę˛Ŋ로가 `>>`로 ė‹œėž‘í•˜ëŠ´ 파ėŧė´ ėļ”ę°€ ëĒ¨ë“œëĄœ ė—´ëĻŊ니다. ė´ëĻ„ė˜ `%D`뙀 `%T`는 YYYYMMDD 및 HHMMSS í˜•ė‹ė˜ ë‚ ė§œ 및 ė‹œę°„ėœŧ로 ëŒ€ė˛´ëŠë‹ˆë‹¤. Windows ë°°ėš˜ 파ėŧė—ė„œëŠ” `%` ëŦ¸ėžëĨŧ 두 배로 늘려ė•ŧ 합니다(똈: result-%%D.log). `>>`ëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė´ëĻ„ė„ ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다(똈: `">>result.log"`). 로그ëĨŧ í‘œė¤€ ėļœë Ĩ 또는 í‘œė¤€ 똤ëĨ˜ëĄœ ėļœë Ĩ하려면 각각 `">&1"` 및 `">&2"`ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 로그 태그 네ëĒ…ė€ snapraid_log.txt 파ėŧ 또는 man íŽ˜ė´ė§€ëĨŧ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. -L, --error-limit NUMBER ė‹¤í–‰ė„ ė¤‘ė§€í•˜ę¸° 렄뗐 ėƒˆëĄœėš´ 똤ëĨ˜ ė œí•œė„ ė„¤ė •í•Šë‹ˆë‹¤. ę¸°ëŗ¸ė ėœŧ로 SnapRAID는 100氜 ė´ėƒė˜ ėž…ėļœë Ĩ 똤ëĨ˜ę°€ ë°œėƒí•˜ëŠ´ ė¤‘ė§€ëŠë‹ˆë‹¤. ė´ëŠ” ë””ėŠ¤íŦ가 ė‹¤íŒ¨í•  가ëŠĨė„ąė´ ėžˆėŒė„ 나타냅니다. ė´ ė˜ĩė…˜ė€ `sync` 및 `scrub`뗐 똁í–Ĩė„ ë¯¸ėš˜ëŠ°, ė˛Ģ ë˛ˆė§¸ ë””ėŠ¤íŦ 똤ëĨ˜ ė„¸íŠ¸ í›„ė— ęŗ„ė† ė§„í–‰í•˜ė—Ŧ ėž‘ė—…ė„ ė™„ëŖŒí•˜ë ¤ęŗ  ė‹œë„í•  눘 ėžˆë„ëĄ í—ˆėšŠí•Šë‹ˆë‹¤. ꡸ëŸŦ나 `check` 및 `fix`는 í•­ėƒ ė˛Ģ ë˛ˆė§¸ 똤ëĨ˜ė—ė„œ ė¤‘ė§€ëŠë‹ˆë‹¤. -S, --start BLKSTART ė§€ė •ëœ 블록 번호ëļ€í„° 래ëĻŦëĨŧ ė‹œėž‘í•Šë‹ˆë‹¤. ė´ëŠ” ė†ėƒëœ ë””ėŠ¤íŦė˜ ę˛Ŋ뚰 íŠšė • ë¸”ëĄė„ ë‹¤ė‹œ í™•ė¸í•˜ęą°ë‚˜ ėˆ˜ė •í•˜ëŠ” 데 ėœ ėšŠí•  눘 ėžˆėŠĩ니다. ė´ ė˜ĩė…˜ė€ ėŖŧ로 溠揉 ėˆ˜ë™ ëŗĩęĩŦëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. -B, --count BLKCOUNT ė§€ė •ëœ ėˆ˜ė˜ 블록만 래ëĻŦ합니다. ė´ ė˜ĩė…˜ė€ ėŖŧ로 溠揉 ėˆ˜ë™ ëŗĩęĩŦëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. -C, --gen-conf CONTENT ę¸°ėĄ´ content 파ėŧė—ė„œ 더미 네렕 파ėŧė„ ėƒė„ąí•Šë‹ˆë‹¤. 네렕 파ėŧė€ í‘œė¤€ ėļœë Ĩėœŧ로 ėž‘ė„ąë˜ëŠ° ę¸°ėĄ´ 파ėŧė„ ëŽė–´ė“°ė§€ ė•ŠėŠĩ니다. ė´ 네렕 파ėŧė—ëŠ” 렄랴 ė‹œėŠ¤í…œė„ ėžƒė„ ę˛Ŋ뚰 ë””ėŠ¤íŦ ë§ˆėš´íŠ¸ ė§€ė ė„ ėžŦęĩŦė„ąí•˜ëŠ” 데 í•„ėš”í•œ ė •ëŗ´ë„ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. -v, --verbose í™”ëŠ´ė— 더 ë§Žė€ ė •ëŗ´ëĨŧ ėļœë Ĩ합니다. 한 번 ė§€ė •í•˜ëŠ´ ė œė™¸ëœ 파ėŧ 및 ėļ”ę°€ í†ĩęŗ„ëĨŧ ėļœë Ĩ합니다. ė´ ė˜ĩė…˜ė€ 로그 파ėŧė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. -q, --quiet í™”ëŠ´ė— 더 ė ė€ ė •ëŗ´ëĨŧ ėļœë Ĩ합니다. 한 번 ė§€ė •í•˜ëŠ´ ė§„í–‰ëĨ  í‘œė‹œė¤„ė„ ė œęą°í•˜ęŗ , 두 번 ė§€ė •í•˜ëŠ´ ė‹¤í–‰ ė¤‘ė¸ ėž‘ė—…ė„ ė œęą°í•˜ëŠ°, 넏 번 ė§€ė •í•˜ëŠ´ ė •ëŗ´ ëŠ”ė‹œė§€ëĨŧ ė œęą°í•˜ęŗ , 네 번 ė§€ė •í•˜ëŠ´ ėƒíƒœ ëŠ”ė‹œė§€ëĨŧ ė œęą°í•Šë‹ˆë‹¤. ėš˜ëĒ…ė ė¸ 똤ëĨ˜ëŠ” í•­ėƒ í™”ëŠ´ė— ėļœë Ĩ됩니다. ė´ ė˜ĩė…˜ė€ 로그 파ėŧė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. -H, --help 간단한 ë„ė›€ë§ í™”ëŠ´ė„ ėļœë Ĩ합니다. -V, --version 프로그램 ë˛„ė „ė„ ėļœë Ĩ합니다. 7 CONFIGURATION =============== SnapRAID는 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ėœ„ėš˜ė™€ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ할 ėœ„ėš˜ëĨŧ ė•Œę¸° ėœ„í•´ 네렕 파ėŧė´ í•„ėš”í•Šë‹ˆë‹¤. Unixė—ė„œëŠ” `/usr/local/etc/snapraid.conf` 파ėŧė´ ėĄ´ėžŦ하면 ė‚ŦėšŠí•˜ęŗ , ęˇ¸ë ‡ė§€ ė•Šėœŧ늴 `/etc/snapraid.conf`ëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. Windowsė—ė„œëŠ” `snapraid.exe`뙀 ę°™ė€ 디렉토ëĻŦ뗐 ėžˆëŠ” `snapraid.conf` 파ėŧė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ë‹¤ėŒ ė˜ĩė…˜ė´ íŦí•¨ë˜ė–´ė•ŧ 합니다(ëŒ€ė†ŒëŦ¸ėž ęĩŦëļ„): 7.1 parity FILE [,FILE] ... --------------------------- 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. 패ëĻŦ티는 RAID5뙀 뜠ė‚Ŧ하게 단ėŧ ë””ėŠ¤íŦ 똤ëĨ˜ëĄœëļ€í„° ëŗ´í˜¸ëĨŧ 가ëŠĨ하게 합니다. ė—ŦëŸŦ 파ėŧė„ ė§€ė •í•  눘 ėžˆėœŧ늰, ė´ë“¤ė€ ė„œëĄœ 다ëĨ¸ ë””ėŠ¤íŦ뗐 ėžˆė–´ė•ŧ 합니다. í•˜ë‚˜ė˜ 파ėŧė´ 더 ė´ėƒ ėģ¤ė§ˆ 눘 ė—†ė„ 때 ë‹¤ėŒ 파ėŧė´ ė‚ŦėšŠëŠë‹ˆë‹¤. ė´ ė‚ŦėšŠ 가ëŠĨ한 ęŗĩę°„ė€ ė–´ë ˆė´ė—ė„œ 가ėžĨ 큰 ë°ė´í„° ë””ėŠ¤íŦëŗ´ë‹¤ ė ė–´ë„ ėģ¤ė•ŧ 합니다. ë‚˜ė¤‘ė— ėļ”ę°€ 패ëĻŦ티 파ėŧė„ ėļ”가할 눘 ėžˆė§€ë§Œ, ėˆœė„œëĨŧ 바꾸거나 ė œęą°í•  ėˆ˜ëŠ” ė—†ėŠĩ니다. 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ 패ëĻŦí‹°ėšŠėœŧ로 똈ė•Ŋ하면 ë‹¨íŽ¸í™”ë˜ė§€ ė•Šė•„ ė„ąëŠĨė´ í–ĨėƒëŠë‹ˆë‹¤. Windowsė—ė„œëŠ” ë””ėŠ¤íŦ가 가득 ė°ŧ다는 ę˛Ŋęŗ ëĨŧ í”ŧ하기 ėœ„í•´ 각 ë””ėŠ¤íŦ뗐 256MB가 ė‚ŦėšŠë˜ė§€ ė•Šė€ ėą„ëĄœ 남ėŠĩ니다. ė´ ė˜ĩė…˜ė€ í•„ėˆ˜ė´ëŠ° 한 번만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- ėļ”ę°€ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. ė§€ė •ëœ 각 패ëĻŦ티 ėˆ˜ė¤€ė— 대해 í•˜ë‚˜ė˜ ėļ”ę°€ ëŗ´í˜¸ ėˆ˜ė¤€ė´ í™œė„ąí™”ëŠë‹ˆë‹¤: * 2-parity는 RAID6 ė´ė¤‘ 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 3-parity는 ė‚ŧ뤑 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 4-parity는 ėŋŧ드(4뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 5-parity는 펜타(5뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. * 6-parity는 í—Ĩė‚Ŧ(6뤑) 패ëĻŦ티ëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤. 각 패ëĻŦ티 ėˆ˜ė¤€ė€ ëĒ¨ë“  ė´ė „ 패ëĻŦ티 ėˆ˜ė¤€ė˜ ėĄ´ėžŦëĨŧ í•„ėš”ëĄœ 합니다. `parity` ė˜ĩė…˜ęŗŧ 동ėŧ한 ęŗ ë ¤ ė‚Ŧí•­ė´ ė ėšŠëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ė„ íƒ ė‚Ŧí•­ė´ëŠ° 한 번만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 7.3 z-parity FILE [,FILE] ... ----------------------------- ė‚ŧ뤑 패ëĻŦ티ëĨŧ ė €ėžĨ하는 ëŒ€ė˛´ 파ėŧ 및 í˜•ė‹ė„ ė •ė˜í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ `3-parity`ė˜ ëŒ€ė•ˆė´ëŠ°, ėŖŧ로 SSSE3 ëĒ…ë šė–´ ė„¸íŠ¸ëĨŧ ė§€ė›í•˜ė§€ ė•ŠëŠ” ARM 또는 AMD Phenom, Athlon, Opteronęŗŧ ę°™ė€ ė €ę°€í˜• CPUëĨŧ ėœ„í•œ ę˛ƒėž…ë‹ˆë‹¤. ė´ëŸŦ한 ę˛Ŋ뚰 더 ë‚˜ė€ ė„ąëŠĨė„ 렜ęŗĩ합니다. ė´ í˜•ė‹ė€ ZFS RAIDZ3ė—ė„œ ė‚ŦėšŠë˜ëŠ” 것ęŗŧ 뜠ė‚Ŧí•˜ė§€ë§Œ 더 ëš ëĻ…ë‹ˆë‹¤. ZFS뙀 마ė°Ŧę°€ė§€ëĄœ ė‚ŧ뤑 패ëĻŦ티 ė´ėƒė—ė„œëŠ” ėž‘ë™í•˜ė§€ ė•ŠėŠĩ니다. `3-parity`ëĨŧ ė‚ŦėšŠí•  때 ė„ąëŠĨ í–Ĩėƒė„ ėœ„í•´ `z-parity` í˜•ė‹ė„ ė‚ŦėšŠí•˜ëŠ” ę˛ƒė´ ęļŒėžĨ되는 ę˛Ŋ뚰 ę˛Ŋęŗ ëĨŧ 받게 됩니다. ė›í•˜ëŠ” z-parity 또는 3-parity 파ėŧ로 네렕 파ėŧė„ ėĄ°ė •í•˜ęŗ  `fix`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ë‹¤ė‹œ ėƒė„ąí•¨ėœŧëĄœė¨ 한 í˜•ė‹ė—ė„œ 다ëĨ¸ í˜•ė‹ėœŧ로 ëŗ€í™˜í•  눘 ėžˆėŠĩ니다. 7.4 content FILE ---------------- ë””ėŠ¤íŦ ė–´ë ˆė´ė— ėžˆëŠ” ëĒ¨ë“  파ėŧė˜ ëĒŠëĄęŗŧ 랴íŦė„Ŧė„ ė €ėžĨ하는 데 ė‚ŦėšŠí•  파ėŧė„ ė •ė˜í•Šë‹ˆë‹¤. ë°ė´í„°, 패ëĻŦ티 또는 ė‚ŦėšŠ 가ëŠĨ한 다ëĨ¸ ë””ėŠ¤íŦ뗐 ë°°ėš˜í•  눘 ėžˆėŠĩ니다. ë°ė´í„° ë””ėŠ¤íŦëĨŧ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, ė´ 파ėŧė€ `sync` í”„ëĄœė„¸ėŠ¤ė—ė„œ ėžë™ėœŧ로 ė œė™¸ëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ í•„ėˆ˜ė´ëŠ° 동ėŧ한 파ėŧė˜ ė—ŦëŸŦ ëŗĩė‚Ŧëŗ¸ė„ ė €ėžĨ하기 ėœ„í•´ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. ė‚ŦėšŠëœ 각 패ëĻŦ티 ë””ėŠ¤íŦ뗐 대해 ėĩœė†Œí•œ í•˜ë‚˜ė˜ ëŗĩė‚Ŧëŗ¸ė„ ė €ėžĨ해ė•ŧ 하며, 하나ëĨŧ 더 ėļ”가해ė•ŧ 합니다. ėļ”ę°€ ëŗĩė‚Ŧëŗ¸ė„ ė‚ŦėšŠí•´ë„ í•´ëĄ­ė§€ ė•ŠėŠĩ니다. 7.5 data NAME DIR ----------------- ė–´ë ˆė´ė˜ ë°ė´í„° ë””ėŠ¤íŦė˜ ė´ëĻ„ęŗŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ė •ė˜í•Šë‹ˆë‹¤. NAMEė€ ë””ėŠ¤íŦëĨŧ ė‹ëŗ„í•˜ëŠ” 데 ė‚ŦėšŠë˜ëŠ° ęŗ ėœ í•´ė•ŧ 합니다. DIRė€ 파ėŧ ė‹œėŠ¤í…œė—ė„œ ë””ėŠ¤íŦė˜ ë§ˆėš´íŠ¸ ė§€ė ėž…ë‹ˆë‹¤. NAMEė„ ęŗ ė •ëœ ėƒíƒœëĄœ ėœ ė§€í•˜ëŠ” 한, í•„ėš”ė— 따ëŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ëŗ€ę˛Ŋ할 눘 ėžˆėŠĩ니다. ė–´ë ˆė´ė˜ 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 대해 í•˜ë‚˜ė˜ ė˜ĩė…˜ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. ë‚˜ė¤‘ė— 네렕 파ėŧė—ė„œ 링렑 NAMEė„ ëŗ€ę˛Ŋí•˜ęŗ  `sync` ëĒ…ë šė„ ė‹¤í–‰í•˜ė—Ŧ ë””ėŠ¤íŦė˜ ė´ëĻ„ė„ 바ęŋ€ 눘 ėžˆėŠĩ니다. ė´ëĻ„ ëŗ€ę˛Ŋė˜ ę˛Ŋ뚰, ë””ėŠ¤íŦė˜ ė €ėžĨ된 UUIDëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė—°ę˛°ëŠë‹ˆë‹¤. 7.6 extra NAME DIR ------------------ `smart` 및 `probe` ëĒ…ë šėœŧ로 ëĒ¨ë‹ˆí„°ë§í•  ėļ”ę°€ ë””ėŠ¤íŦė˜ ė´ëĻ„ęŗŧ ë§ˆėš´íŠ¸ ė§€ė ė„ ė •ė˜í•Šë‹ˆë‹¤. ė´ę˛ƒė€ ëļ€íŒ… ë””ėŠ¤íŦ뙀 ę°™ė´ ė–´ë ˆė´ė˜ ėŧëļ€ëŠ” ė•„ë‹ˆė§€ë§Œ ė‹œėŠ¤í…œ ėž‘ë™ė— í•„ėš” 한 ë””ėŠ¤íŦëĨŧ ëĒ¨ë‹ˆí„°ë§í•˜ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. ė´ëŸŦ한 ë””ėŠ¤íŦ는 í•­ėƒ íšŒė „í•  것ėœŧ로 ė˜ˆėƒë˜ë¯€ëĄœ `up` 및 `down` ëĒ…ë šė˜ 똁í–Ĩė„ ë°›ė§€ ė•ŠėŠĩ니다. 7.7 nohidden ------------ ëĒ¨ë“  ėˆ¨ę˛¨ė§„ 파ėŧ 및 디렉토ëĻŦëĨŧ ė œė™¸í•Šë‹ˆë‹¤. Unixė—ė„œëŠ” ėˆ¨ę˛¨ė§„ 파ėŧė€ '.'ėœŧ로 ė‹œėž‘í•˜ëŠ” 파ėŧėž…ë‹ˆë‹¤. Windowsė—ė„œëŠ” ėˆ¨ęš€ ė†ė„ąė„ 氀맄 파ėŧėž…ë‹ˆë‹¤. 7.8 exclude/include PATTERN --------------------------- sync í”„ëĄœė„¸ėŠ¤ė—ė„œ ė œė™¸í•˜ęą°ë‚˜ íŦ함할 파ėŧ 또는 디렉토ëĻŦ íŒ¨í„´ė„ ė •ė˜í•Šë‹ˆë‹¤. ëĒ¨ë“  íŒ¨í„´ė€ ė§€ė •ëœ ėˆœė„œëŒ€ëĄœ 래ëĻŦ됩니다. ėŧėš˜í•˜ëŠ” ė˛Ģ ë˛ˆė§¸ íŒ¨í„´ė´ `exclude` íŒ¨í„´ė´ëŠ´ 파ėŧė€ ė œė™¸ëŠë‹ˆë‹¤. `include` íŒ¨í„´ė´ëŠ´ 파ėŧė€ íŦ함됩니다. ėŧėš˜í•˜ëŠ” íŒ¨í„´ė´ ė—†ėœŧ늴, ė§€ė •ëœ ë§ˆė§€ë§‰ íŒ¨í„´ė´ `include`ė´ëŠ´ 파ėŧė€ ė œė™¸ë˜ęŗ , `exclude`ė´ëŠ´ íŦ함됩니다. 패턴 ė‚Ŧ떑뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ PATTERN ė„šė…˜ė„ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤. ė´ ė˜ĩė…˜ė€ ė—ŦëŸŦ 번 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- 패ëĻŦí‹°ė˜ ę¸°ëŗ¸ 블록 íŦ기ëĨŧ í‚¤ëš„ë°”ė´íŠ¸(kibibyte) ë‹¨ėœ„ëĄœ ė •ė˜í•Šë‹ˆë‹¤. 1í‚¤ëš„ë°”ė´íŠ¸ëŠ” 1024ë°”ė´íŠ¸ėž…ë‹ˆë‹¤. ę¸°ëŗ¸ 블록 íŦ기는 256ė´ëŠ°, 대ëļ€ëļ„ė˜ ę˛Ŋėš°ė— ėž‘ë™í•´ė•ŧ 합니다. **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė´ ę°’ė„ ëŗ€ę˛Ŋí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. ë‚˜ė¤‘ė— ė´ ę°’ė„ ëŗ€ę˛Ŋ하려면 렄랴 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•´ė•ŧ 합니다! 다ëĨ¸ 블록 íŦ기ëĨŧ ė‚ŦėšŠí•˜ëŠ” ė´ėœ ëŠ” ėˆ˜ë°ąë§Œ ę°œė˜ ėž‘ė€ 파ėŧė´ ë§Žė€ ę˛Ŋėš°ėž…ë‹ˆë‹¤. 각 파ėŧ뗐 대해, ëLJ ë°”ė´íŠ¸ë§Œ ėžˆė–´ë„ 렄랴 패ëĻŦ티 ë¸”ëĄė´ 할당되며, 파ėŧė´ 많ėœŧ늴 ėƒë‹ší•œ 미ė‚ŦėšŠ 패ëĻŦ티 ęŗĩę°„ė´ ë°œėƒí•  눘 ėžˆėŠĩ니다. 패ëĻŦ티 ë””ėŠ¤íŦëĨŧ ė™„ė „ížˆ ėą„ėš°ëŠ´ ë°ė´í„° ë””ėŠ¤íŦ뗐 더 ė´ėƒ 파ėŧė„ ėļ”가할 눘 ė—†ėŠĩ니다. ꡸ëŸŦ나 낭비된 패ëĻŦ티는 ë°ė´í„° ë””ėŠ¤íŦ 렄랴뗐 ęą¸ėŗ ėļ•ė ë˜ė§€ ė•ŠėŠĩ니다. ë°ė´í„° ë””ėŠ¤íŦė˜ ë§Žė€ 파ėŧ로 ė¸í•´ ë°œėƒí•˜ëŠ” 낭비된 ęŗĩę°„ė€ 다ëĨ¸ ë°ė´í„° ë””ėŠ¤íŦ가 ė•„ë‹Œ 해당 ë°ė´í„° ë””ėŠ¤íŦė˜ ë°ė´í„° ė–‘ë§Œ ė œí•œí•Šë‹ˆë‹¤. 대ëžĩ렁ėœŧ로, 각 파ėŧ뗐 대해 블록 íŦę¸°ė˜ ė ˆë°˜ė´ ë‚­ëš„ëœë‹¤ęŗ  ę°€ė •í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 100,000ę°œė˜ 파ėŧęŗŧ 256KiB 블록 íŦ기로 12.8GBė˜ 패ëĻŦ티가 낭비되며, ė´ëŠ” ë°ė´í„° ë””ėŠ¤íŦė—ė„œ 12.8GBė˜ ė‚ŦėšŠ 가ëŠĨ한 ęŗĩę°„ė´ ė¤„ė–´ë“¤ 눘 ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. `status`ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ 각 ë””ėŠ¤íŦė˜ 낭비된 ęŗĩę°„ė˜ ė–‘ė„ í™•ė¸í•  눘 ėžˆėŠĩ니다. ė´ëŠ” ë°ė´í„° ë””ėŠ¤íŦ뗐 ëš„ė›Œ 두거나 ė–´ë ˆė´ė— íŦí•¨ë˜ė§€ ė•Šė€ 파ėŧ뗐 ė‚ŦėšŠí•´ė•ŧ 하는 ęŗĩę°„ė˜ ė–‘ėž…ë‹ˆë‹¤. ė´ ę°’ė´ ėŒėˆ˜ė´ëŠ´ 패ëĻŦ티ëĨŧ ęą°ė˜ ėą„ėš°ęŗ  ėžˆėŒė„ ė˜ë¯¸í•˜ëŠ°, ė—Ŧė „ížˆ 낭비할 눘 ėžˆëŠ” ęŗĩę°„ė„ 나타냅니다. ė´ ëŦ¸ė œëĨŧ í”ŧ하려면 패ëĻŦí‹°ė— 대해 더 큰 íŒŒí‹°ė…˜ė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, 패ëĻŦ티 íŒŒí‹°ė…˜ė´ ë°ė´í„° ë””ėŠ¤íŦëŗ´ë‹¤ 12.8GB 더 큰 ę˛Ŋ뚰, 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 ėĩœëŒ€ 100,000ę°œė˜ 파ėŧė„ 낭비되는 ęŗĩ간 ė—†ė´ 래ëĻŦ할 눘 ėžˆëŠ” ėļŠëļ„한 ėļ”ę°€ ęŗĩę°„ė´ ėžˆėŠĩ니다. Linuxė—ė„œ 더 큰 패ëĻŦ티 íŒŒí‹°ė…˜ė„ ė–ģ는 트ëĻ­ė€ ë‹¤ėŒ ëĒ…ë šėœŧ로 íŦ맷하는 ę˛ƒėž…ë‹ˆë‹¤: mkfs.ext4 -m 0 -T largefile4 DEVICE ė´ëĄœ ė¸í•´ ė•Ŋ 1.5%ė˜ ėļ”ę°€ ęŗĩę°„ė´ ë°œėƒí•˜ëŠ°, 4TB ë””ėŠ¤íŦė˜ ę˛Ŋ뚰 ė•Ŋ 60GB로, 낭비되는 ęŗĩ간 ė—†ė´ 각 ë°ė´í„° ë””ėŠ¤íŦ뗐 ė•Ŋ 460,000ę°œė˜ 파ėŧė„ í—ˆėšŠí•Šë‹ˆë‹¤. 7.10 hashsize SIZE_IN_BYTES --------------------------- ė €ėžĨ된 ë¸”ëĄė˜ í•´ė‹œ íŦ기ëĨŧ ë°”ė´íŠ¸ ë‹¨ėœ„ëĄœ ė •ė˜í•Šë‹ˆë‹¤. ę¸°ëŗ¸ í•´ė‹œ íŦ기는 16ë°”ė´íŠ¸(128비트)ė´ëŠ°, 대ëļ€ëļ„ė˜ ę˛Ŋėš°ė— ėž‘ë™í•´ė•ŧ 합니다. **ę˛Ŋęŗ !** ė´ ė˜ĩė…˜ė€ ė „ëŦ¸ę°€ ė „ėšŠė´ëŠ°, ė´ ę°’ė„ ëŗ€ę˛Ŋí•˜ė§€ ė•ŠëŠ” ę˛ƒė´ 강ë Ĩ히 ęļŒėžĨ됩니다. ë‚˜ė¤‘ė— ė´ ę°’ė„ ëŗ€ę˛Ŋ하려면 렄랴 패ëĻŦ티ëĨŧ ë‹¤ė‹œ ėƒė„ąí•´ė•ŧ 합니다! 다ëĨ¸ í•´ė‹œ íŦ기ëĨŧ ė‚ŦėšŠí•˜ëŠ” ė´ėœ ëŠ” ė‹œėŠ¤í…œė˜ 메ëǍëĻŦ가 ė œí•œė ė¸ ę˛Ŋėš°ėž…ë‹ˆë‹¤. ę˛Ŋí—˜ėƒ SnapRAID는 ė–´ë ˆė´ė˜ 16TB ë°ė´í„°ë‹š ėŧë°˜ė ėœŧ로 1GiBė˜ RAMė„ í•„ėš”ëĄœ 합니다. ęĩŦ랴렁ėœŧ로, ë°ė´í„°ė˜ í•´ė‹œëĨŧ ė €ėžĨ하기 ėœ„í•´ SnapRAID는 대ëžĩ TS*(1+HS)/BS ë°”ė´íŠ¸ė˜ RAMė„ í•„ėš”ëĄœ 합니다. ė—Ŧę¸°ė„œ TS는 ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ė´ íŦ기(ë°”ė´íŠ¸), BS는 블록 íŦ기(ë°”ė´íŠ¸), HS는 í•´ė‹œ íŦ기(ë°”ė´íŠ¸)ėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´, 4TB ë””ėŠ¤íŦ 8氜, 블록 íŦ기 256KiB (1KiB = 1024ë°”ė´íŠ¸), í•´ė‹œ íŦ기 16ė¸ ę˛Ŋ뚰 ë‹¤ėŒęŗŧ 같ėŠĩ니다: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB í•´ė‹œ íŦ기ëĨŧ 8로 ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB 블록 íŦ기ëĨŧ 512로 ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB í•´ė‹œ íŦ기ëĨŧ 8로, 블록 íŦ기ëĨŧ 512로 ëĒ¨ë‘ ė „í™˜í•˜ëŠ´ ë‹¤ėŒęŗŧ 같ėŠĩ니다: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- ė§€ė •ëœ GB ė–‘ė´ 래ëĻŦ된 후 동기화 또는 늤íŦëŸŊ ė‹œ ėƒíƒœëĨŧ ėžë™ėœŧ로 ė €ėžĨ합니다. ė´ ė˜ĩė…˜ė€ 揰溄 ėļŠëŒ 또는 기타 ė´ë˛¤íŠ¸ëĄœ ė¸í•´ ė¤‘ë‹¨ëœ ę˛Ŋ뚰 긴 `sync` ëĒ…ë šė„ ė˛˜ėŒëļ€í„° ë‹¤ė‹œ ė‹œėž‘í•˜ëŠ” ę˛ƒė„ ë°Šė§€í•˜ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- í—ˆėšŠë˜ëŠ” ėĩœëŒ€ ë””ėŠ¤íŦ ė˜¨ë„ëĨŧ ė„­ė”¨ëĄœ ė„¤ė •í•Šë‹ˆë‹¤. ė§€ė •ë˜ëŠ´ SnapRAID는 smartctl 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėŖŧ揰렁ėœŧ로 ëĒ¨ë“  ë””ėŠ¤íŦė˜ ė˜¨ë„ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. SnapRAID가 ėž‘ë™í•˜ëŠ” ë™ė•ˆ 현ėžŦ ë””ėŠ¤íŦ ė˜¨ë„ę°€ í‘œė‹œëŠë‹ˆë‹¤. ė–´ë–¤ ë””ėŠ¤íŦëŧ도 ė´ ė œí•œė„ 봈ęŗŧ하면 ëĒ¨ë“  ėž‘ė—…ė´ ė¤‘ė§€ë˜ęŗ , ë””ėŠ¤íŦ는 `temp_sleep` ė˜ĩė…˜ėœŧ로 ė •ė˜ëœ 기간 ë™ė•ˆ íšŒė „ ė¤‘ė§€ëŠë‹ˆë‹¤(대기 ëĒ¨ë“œëĄœ ė „í™˜ë¨). ė ˆė „ 기간 후 ėž‘ė—…ė´ ėžŦ개되며, ė˜¨ë„ ė œí•œė— ë‹¤ė‹œ 도ë‹Ŧ하면 ë‹¤ė‹œ ėŧė‹œ ė¤‘ė§€ë  눘 ėžˆėŠĩ니다. ėž‘ë™ 뤑뗐 SnapRAID는 각 ë””ėŠ¤íŦė˜ 氀뗴 ęŗĄė„ ė„ ëļ„ė„í•˜ęŗ  í™œë™ė´ ęŗ„ė†ë˜ëŠ´ 도ë‹Ŧ할 것ėœŧ로 ė˜ˆėƒë˜ëŠ” ėžĨ기 ė •ėƒ ė˜¨ë„ëĨŧ ėļ”ė •í•Šë‹ˆë‹¤. ėļ”ė •ė€ ë””ėŠ¤íŦ ė˜¨ë„ę°€ 네 번 ėĻę°€í•œ í›„ė—ë§Œ ėˆ˜í–‰ë˜ė–´, ė‹ ëĸ°í•  눘 ėžˆëŠ” ėļ”넏ëĨŧ ė„¤ė •í•˜ę¸°ė— ėļŠëļ„한 ë°ė´í„° íŦė¸íŠ¸ę°€ í™•ëŗ´ë˜ë„ëĄ 합니다. ė´ ė˜ˆė¸Ąëœ ė •ėƒ ė˜¨ë„ëŠ” 현ėžŦ 값 ė˜†ė— 괄호 ė•ˆė— í‘œė‹œë˜ëŠ°, ė‹œėŠ¤í…œė˜ ëƒ‰ę°ė´ ė ė ˆí•œė§€ 평가하는 데 ë„ė›€ė´ 됩니다. ė´ ėļ”ė • ė˜¨ë„ëŠ” ė •ëŗ´ 렜ęŗĩ ëĒŠė ėŧ ëŋė´ëа SnapRAIDė˜ ë™ėž‘ė—ëŠ” 똁í–Ĩė„ ë¯¸ėš˜ė§€ ė•ŠėŠĩ니다. í”„ëĄœęˇ¸ëž¨ė˜ ë™ėž‘ė€ ė˜¤ëĄœė§€ ė‹¤ė œ ė¸Ąė •ëœ ë””ėŠ¤íŦ ė˜¨ë„ė— 기반합니다. ė´ ëļ„ė„ė„ ėˆ˜í–‰í•˜ë ¤ëŠ´ SnapRAID는 ė‹œėŠ¤í…œ ė˜¨ë„ė— 대한 ė°¸ėĄ°ę°€ í•„ėš”í•Šë‹ˆë‹¤. ë¨ŧė € ė‚ŦėšŠ 가ëŠĨ한 í•˜ë“œė›¨ė–´ ė„ŧė„œė—ė„œ ėŊėœŧë ¤ęŗ  ė‹œë„í•Šë‹ˆë‹¤. ė‹œėŠ¤í…œ ė„ŧė„œė— ė•Ąė„¸ėŠ¤í•  눘 ė—†ëŠ” ę˛Ŋ뚰, ė‹¤í–‰ ė‹œėž‘ ė‹œ ė¸Ąė •ëœ 가ėžĨ ë‚Žė€ ë””ėŠ¤íŦ ė˜¨ë„ëĨŧ ëŒ€ė˛´ ė°¸ėĄ°ëĄœ ė‚ŦėšŠí•Šë‹ˆë‹¤. ėŧë°˜ė ėœŧ로 SnapRAID는 가ėžĨ ëœ¨ęą°ėš´ ë””ėŠ¤íŦė˜ ė˜¨ë„ë§Œ í‘œė‹œí•Šë‹ˆë‹¤. ëĒ¨ë“  ë””ėŠ¤íŦė˜ ė˜¨ë„ëĨŧ í‘œė‹œí•˜ë ¤ëŠ´ -A 또는 --stats ė˜ĩė…˜ė„ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- ė˜¨ë„ ė œí•œė— 도ë‹Ŧí–ˆė„ ë•Œė˜ 대기 ė‹œę°„(ëļ„)ė„ ė„¤ė •í•Šë‹ˆë‹¤. ė´ 기간 ë™ė•ˆ ë””ėŠ¤íŦ는 íšŒė „ 뤑맀 ėƒíƒœëĨŧ ėœ ė§€í•Šë‹ˆë‹¤. ę¸°ëŗ¸ę°’ė€ 5ëļ„ėž…ë‹ˆë‹¤. 7.14 pool DIR ------------- `pool` ëĒ…ë šė„ ė‚ŦėšŠí•˜ė—Ŧ ë””ėŠ¤íŦ ė–´ë ˆė´ė˜ ę°€ėƒ 뷰가 ėƒė„ąë˜ëŠ” 풀링 디렉토ëĻŦëĨŧ ė •ė˜í•Šë‹ˆë‹¤. 디렉토ëĻŦ는 ė´ë¯¸ ėĄ´ėžŦ해ė•ŧ 합니다. 7.15 share UNC_DIR ------------------ ë””ėŠ¤íŦ뗐 ė›ę˛Šėœŧ로 ė•Ąė„¸ėŠ¤í•˜ëŠ” 데 í•„ėš”í•œ Windows UNC ę˛Ŋ로ëĨŧ ė •ė˜í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė§€ė •ë˜ëŠ´ 풀 디렉토ëĻŦ뗐 ėƒė„ąëœ ė‹ŦëŗŧëĻ­ 링íŦ는 ė´ UNC ę˛Ŋ로ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ë””ėŠ¤íŦ뗐 ė•Ąė„¸ėŠ¤í•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė´ ė—†ėœŧ늴 ėƒė„ąëœ ė‹ŦëŗŧëĻ­ 링íŦ는 로ėģŦ ę˛Ŋ로만 ė‚ŦėšŠí•˜ëŠ°, ė´ëŠ” ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 풀 디렉토ëĻŦëĨŧ ęŗĩėœ í•˜ëŠ” ę˛ƒė„ í—ˆėšŠí•˜ė§€ ė•ŠėŠĩ니다. ė‹ŦëŗŧëĻ­ 링íŦ는 ė§€ė •ëœ UNC ę˛Ŋ로ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ í˜•ė„ąë˜ëŠ°, `data` ė˜ĩė…˜ė— ė§€ė •ëœ ë””ėŠ¤íŦ ė´ëĻ„ė´ ėļ”ę°€ë˜ęŗ , ë§ˆė§€ë§‰ėœŧ로 파ėŧ 디렉토ëĻŦ뙀 ė´ëĻ„ė´ ėļ”ę°€ëŠë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ Windowsė—ë§Œ í•„ėš”í•Šë‹ˆë‹¤. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ 각 ë””ėŠ¤íŦ뗐 대한 SMART ė†ė„ąė„ ė–ģ기 ėœ„í•œ ė‚ŦėšŠėž ė •ė˜ smartctl ė˜ĩė…˜ė„ ė •ė˜í•Šë‹ˆë‹¤. ė´ëŠ” RAID ėģ¨íŠ¸ëĄ¤ëŸŦ 및 ėŧëļ€ ėžë™ ę°ė§€í•  눘 ė—†ëŠ” USB ë””ėŠ¤íŦ뗐 í•„ėš”í•  눘 ėžˆėŠĩ니다. %s ėžëĻŦ í‘œė‹œėžëŠ” ėžĨėš˜ ė´ëĻ„ėœŧ로 ëŒ€ė˛´ë˜ė§€ë§Œ, RAID ėģ¨íŠ¸ëĄ¤ëŸŦ뙀 ę°™ė€ ęŗ ė •ëœ ėžĨėš˜ė—ė„œëŠ” ė„ íƒ ė‚Ŧí•­ėž…ë‹ˆë‹¤. DISK는 `data` ė˜ĩė…˜ė— ė§€ė •ëœ 것ęŗŧ 동ėŧ한 ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. PARITY는 `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, 또는 `z-parity` 뤑 í•˜ë‚˜ė˜ 패ëĻŦ티 ė´ëĻ„ėž…ë‹ˆë‹¤. ė§€ė •ëœ OPTIONSė—ė„œ `%s` ëŦ¸ėžė—´ė€ ėžĨėš˜ ė´ëĻ„ėœŧ로 ëŒ€ė˛´ëŠë‹ˆë‹¤. RAID ėģ¨íŠ¸ëĄ¤ëŸŦė˜ ę˛Ŋ뚰 ėžĨėš˜ę°€ ęŗ ė •ë˜ė–´ ėžˆė„ 가ëŠĨė„ąė´ 높ėœŧë¯€ëĄœ `%s`ëĨŧ ė‚ŦėšŠí•  í•„ėš”ę°€ ė—†ė„ 눘 ėžˆėŠĩ니다. 가ëŠĨ한 ė˜ĩė…˜ė€ smartmontools 네ëĒ…ė„œëĨŧ ė°¸ėĄ°í•˜ė‹­ė‹œė˜¤: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices 똈: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- ë””ėŠ¤íŦ ė‹¤íŒ¨ 확ëĨ ė„ ęŗ„ė‚°í•  때 ė§€ė •ëœ SMART ė†ė„ąė„ ëŦ´ė‹œí•Šë‹ˆë‹¤. ė´ ė˜ĩė…˜ė€ ë””ėŠ¤íŦ가 íŠšė • ė†ė„ąė— 대해 íŠšė´í•˜ęą°ë‚˜ ė˜¤í•´ė˜ ė†Œė§€ę°€ ėžˆëŠ” ę°’ė„ ëŗ´ęŗ í•˜ëŠ” ę˛Ŋėš°ė— ėœ ėšŠí•Šë‹ˆë‹¤. DISK는 `data` ė˜ĩė…˜ė— ė§€ė •ëœ 것ęŗŧ 동ėŧ한 ë””ėŠ¤íŦ ė´ëĻ„ėž…ë‹ˆë‹¤. PARITY는 `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, 또는 `z-parity` 뤑 í•˜ë‚˜ė˜ 패ëĻŦ티 ė´ëĻ„ėž…ë‹ˆë‹¤. íŠšėˆ˜ 값 *는 ëĒ¨ë“  ë””ėŠ¤íŦė—ė„œ ė†ė„ąė„ ëŦ´ė‹œí•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, ëĒ¨ë“  ë””ėŠ¤íŦė—ė„œ `Current Pending Sector Count` ė†ė„ąė„ ëŦ´ė‹œí•˜ë ¤ëŠ´: smartignore * 197 ė˛Ģ ë˛ˆė§¸ 패ëĻŦ티 ë””ėŠ¤íŦė—ė„œë§Œ ëŦ´ė‹œí•˜ë ¤ëŠ´: smartignore parity 197 7.18 Examples ------------- Unixė˜ ėŧë°˜ė ė¸ 네렕 ė˜ˆëŠ” ë‹¤ėŒęŗŧ 같ėŠĩ니다: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Windowsė˜ ėŧë°˜ė ė¸ 네렕 ė˜ˆëŠ” ë‹¤ėŒęŗŧ 같ėŠĩ니다: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= íŒ¨í„´ė€ íŦ함하거나 ė œė™¸í•  파ėŧė„ 필터링하는 ėœ ė—°í•œ ë°Šë˛•ė„ 렜ęŗĩ합니다. 글로빙(globbing) ëŦ¸ėžëĨŧ ė‚ŦėšŠí•˜ëŠ´ ëĒ¨ë“  ę˛Ŋ로ëĨŧ ėŧėŧė´ ë‚˜ė—´í•˜ė§€ ė•Šęŗ ë„ íŠšė • 파ėŧ ė´ëĻ„ė´ë‚˜ 렄랴 디렉토ëĻŦ ęĩŦėĄ°ė™€ ėŧėš˜í•˜ëŠ” ęˇœėš™ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. ëŦŧėŒí‘œ `?`는 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ ė œė™¸í•œ ëĒ¨ë“  단ėŧ ëŦ¸ėžė™€ ėŧėš˜í•Šë‹ˆë‹¤. ė´ëŠ” íŒ¨í„´ė„ 단ėŧ 디렉토ëĻŦ ėˆ˜ė¤€ėœŧ로 ė œí•œí•˜ëŠ´ė„œ ę°€ëŗ€ ëŦ¸ėžę°€ íŦ함된 파ėŧ ė´ëĻ„ė„ ėŧėš˜ė‹œí‚¤ëŠ” 데 ėœ ėšŠí•Šë‹ˆë‹¤. 단ėŧ ëŗ„í‘œ `*`는 ëĒ¨ë“  ëŦ¸ėž ė‹œí€€ėŠ¤ė™€ ėŧėš˜í•˜ė§€ë§Œ, ëŦŧėŒí‘œė™€ 마ė°Ŧę°€ė§€ëĄœ 디렉토ëĻŦ ę˛Ŋęŗ„ëĨŧ ë„˜ė§€ ė•ŠėŠĩ니다. ėŠŦëž˜ė‹œė—ė„œ 늈ėļ”ë¯€ëĄœ 단ėŧ ę˛Ŋ로 ęĩŦė„ą ėš”ė†Œ ë‚´ė—ė„œė˜ ėŧėš˜ė— ė í•Ší•Šë‹ˆë‹¤. ė´ëŠ” ė‰˜ ę¸€ëĄœëš™ė—ė„œ ėĩėˆ™í•œ í‘œė¤€ 뙀ėŧë“œėš´ë“œ ë™ėž‘ėž…ë‹ˆë‹¤. ė´ė¤‘ ëŗ„í‘œ `**`는 더 강ë Ĩ하며 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ íŦ함한 ëĒ¨ë“  ëŦ¸ėž ė‹œí€€ėŠ¤ė™€ ėŧėš˜í•Šë‹ˆë‹¤. ė´ëĨŧ í†ĩ해 íŒ¨í„´ė´ ė—ŦëŸŦ 디렉토ëĻŦ ėˆ˜ė¤€ė—ė„œ ėŧėš˜í•  눘 ėžˆėŠĩ니다. `**`가 패턴 ë‚´ė— 링렑 íŦ함된 ę˛Ŋ뚰, ėŖŧëŗ€ ëĻŦ터럴 í…ėŠ¤íŠ¸ ė‚Ŧė´ė˜ ėŠŦëž˜ė‹œëĨŧ íŦ함하ė—Ŧ 0氜 ė´ėƒė˜ ëŦ¸ėžė™€ ėŧėš˜í•  눘 ėžˆėŠĩ니다. `**`ė˜ 가ėžĨ ė¤‘ėš”í•œ ėšŠë„ëŠ” íŠšėˆ˜ í˜•ė‹ė¸ `/**/`ėž…ë‹ˆë‹¤. ė´ëŠ” 0氜 ė´ėƒė˜ 렄랴 디렉토ëĻŦ ėˆ˜ė¤€ęŗŧ ėŧėš˜í•˜ë¯€ëĄœ ė •í™•í•œ ę˛Ŋ로 ęĩŦėĄ°ëĨŧ ëǍëĨ´ë”ëŧ도 디렉토ëĻŦ 트ëĻŦė˜ ëĒ¨ë“  ęšŠė´ė—ė„œ 파ėŧęŗŧ ėŧėš˜ė‹œí‚Ŧ 눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´, `src/**/main.js` íŒ¨í„´ė€ `src/main.js`(0ę°œė˜ 디렉토ëĻŦ 건너뜀), `src/ui/main.js`(1ę°œė˜ 디렉토ëĻŦ 건너뜀), `src/ui/components/main.js` (2ę°œė˜ 디렉토ëĻŦ 건너뜀)뙀 ėŧėš˜í•Šë‹ˆë‹¤. 대괄호 `[]`ëĨŧ ė‚ŦėšŠí•˜ëŠ” ëŦ¸ėž í´ëž˜ėŠ¤ëŠ” ė§€ė •ëœ ė„¸íŠ¸ 또는 ë˛”ėœ„ė—ė„œ 단ėŧ ëŦ¸ėžė™€ ėŧėš˜í•Šë‹ˆë‹¤. 다ëĨ¸ 단ėŧ ëŦ¸ėž 패턴ęŗŧ 마ė°Ŧę°€ė§€ëĄœ 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ė™€ëŠ” ėŧėš˜í•˜ė§€ ė•ŠėŠĩ니다. í´ëž˜ėŠ¤ëŠ” ë˛”ėœ„ 및 느낌표ëĨŧ ė‚ŦėšŠí•œ ëļ€ė •ė„ ė§€ė›í•Šë‹ˆë‹¤. 기ė–ĩ해ė•ŧ 할 ęˇŧëŗ¸ė ė¸ ė°¨ė´ė ė€ `*`, `?` 및 ëŦ¸ėž í´ëž˜ėŠ¤ëŠ” ëĒ¨ë‘ 디렉토ëĻŦ ę˛Ŋęŗ„ëĨŧ ė¤€ėˆ˜í•˜ęŗ  단ėŧ ę˛Ŋ로 ęĩŦė„ą ėš”ė†Œ ë‚´ė—ė„œë§Œ ėŧėš˜í•˜ëŠ” 반늴, `**`는 디렉토ëĻŦ ęĩŦëļ„ ę¸°í˜¸ëĨŧ ę°€ëĄœė§ˆëŸŦ ėŧėš˜í•  눘 ėžˆëŠ” 뜠ėŧ한 íŒ¨í„´ė´ëŧ는 ę˛ƒėž…ë‹ˆë‹¤. 네 氀맀 ėœ í˜•ė˜ íŒ¨í„´ė´ ėžˆėŠĩ니다: FILE FILEė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 디렉토ëĻŦ가 ė•„ë‹Œ 파ėŧė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. DIR/ DIRė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  ę˛ƒė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 파ėŧė´ ė•„ë‹Œ 디렉토ëĻŦė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. /PATH/FILE ė§€ė •ëœ ė •í™•í•œ 파ėŧ ę˛Ŋ로ëĨŧ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 디렉토ëĻŦ가 ė•„ë‹Œ 파ėŧė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. /PATH/DIR/ ė§€ė •ëœ ė •í™•í•œ 디렉토ëĻŦ ę˛ŊëĄœė™€ ꡸ ė•ˆė˜ ëĒ¨ë“  ę˛ƒė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ íŒ¨í„´ė€ 파ėŧė´ ė•„ë‹Œ 디렉토ëĻŦė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. /로 ė‹œėž‘í•˜ëŠ” ė ˆëŒ€ ę˛Ŋ로ëĨŧ ė§€ė •í•˜ëŠ´ 로ėģŦ 파ėŧ ė‹œėŠ¤í…œė˜ ëŖ¨íŠ¸ 디렉토ëĻŦ가 ė•„ë‹Œ ė–´ë ˆė´ ëŖ¨íŠ¸ 디렉토ëĻŦ뗐 ė ėšŠëŠë‹ˆë‹¤. Windowsė—ė„œëŠ” ė •ë°Ší–Ĩ ėŠŦëž˜ė‹œ / ëŒ€ė‹  ė—­ėŠŦëž˜ė‹œ \ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. Windows ė‹œėŠ¤í…œ 디렉토ëĻŦ, ė ‘í•Šė (junctions), ë§ˆėš´íŠ¸ 맀렐 및 기타 Windows íŠšėˆ˜ 디렉토ëĻŦ는 파ėŧ로 ėˇ¨ę¸‰ëŠë‹ˆë‹¤. ėω, ė´ë“¤ė„ ė œė™¸í•˜ë ¤ëŠ´ 디렉토ëĻŦ ęˇœėš™ė´ ė•„ë‹Œ 파ėŧ ęˇœėš™ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. 파ėŧ ė´ëτ뗐 `*`, `?`, `[`, 또는 `]` ëŦ¸ėžę°€ íŦ함된 ę˛Ŋ뚰, 글로빙 ëŦ¸ėžëĄœ í•´ė„ë˜ëŠ” ę˛ƒė„ í”ŧ하기 ėœ„í•´ ė´ėŠ¤ėŧ€ė´í”„í•´ė•ŧ 합니다. Unixė—ė„œëŠ” ė´ėŠ¤ėŧ€ė´í”„ ëŦ¸ėžę°€ `\`ė´ęŗ , Windowsė—ė„œëŠ” `^`ėž…ë‹ˆë‹¤. íŒ¨í„´ė´ ëĒ…ë šė¤„ė— ėžˆëŠ” ę˛Ŋ뚰, ëĒ…ë š 녏뗐 ė˜í•´ í•´ė„ë˜ëŠ” ę˛ƒė„ í”ŧ하기 ėœ„í•´ ė´ėŠ¤ėŧ€ė´í”„ ëŦ¸ėžëĨŧ 두 배로 늘려ė•ŧ 합니다. 네렕 파ėŧė—ė„œëŠ” 래ëĻŦ할 파ėŧė„ 필터링하기 ėœ„í•´ 다ëĨ¸ ė „ëžĩė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 가ėžĨ 간단한 ė ‘ęˇŧ ë°Šė‹ė€ ė›í•˜ė§€ ė•ŠëŠ” ëĒ¨ë“  파ėŧęŗŧ 디렉토ëĻŦëĨŧ ė œęą°í•˜ę¸° ėœ„í•´ `exclude` ęˇœėš™ë§Œ ė‚ŦėšŠí•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´: # `*.unrecoverable`ė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧ ė œė™¸ exclude *.unrecoverable # ëŖ¨íŠ¸ 디렉토ëĻŦ `/lost+found` ė œė™¸ exclude /lost+found/ # `tmp`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  í•˜ėœ„ 디렉토ëĻŦ ė œė™¸ exclude tmp/ 반대 ė ‘ęˇŧ ë°Šė‹ė€ `include` ęˇœėš™ë§Œ ė‚ŦėšŠí•˜ė—Ŧ 래ëĻŦ하려는 파ėŧ만 ė •ė˜í•˜ëŠ” ę˛ƒėž…ë‹ˆë‹¤. 똈ëĨŧ ë“¤ė–´: # ėŧëļ€ ë””ë ‰í† ëĻŦ만 íŦ함 include /movies/ include /musics/ include /pictures/ ėĩœėĸ… ė ‘ęˇŧ ë°Šė‹ė€ `exclude` 및 `include` ęˇœėš™ė„ í˜ŧ합하는 ę˛ƒėž…ë‹ˆë‹¤. ė´ ę˛Ŋ뚰 ęˇœėš™ė˜ ėˆœė„œę°€ ė¤‘ėš”í•Šë‹ˆë‹¤. ė•žė„  ęˇœėš™ė´ ë’¤ė˜ ęˇœėš™ëŗ´ë‹¤ ėš°ė„ í•Šë‹ˆë‹¤. ë‹¨ėˆœí™”ëĨŧ ėœ„í•´ ëĒ¨ë“  `exclude` ęˇœėš™ė„ ë¨ŧė € ë‚˜ė—´í•œ ë‹¤ėŒ ëĒ¨ë“  `include` ęˇœėš™ė„ ë‚˜ė—´í•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´: # `*.unrecoverable`ė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧ ė œė™¸ exclude *.unrecoverable # `tmp`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  í•˜ėœ„ 디렉토ëĻŦ ė œė™¸ exclude tmp/ # ėŧëļ€ ë””ë ‰í† ëĻŦ만 íŦ함 include /movies/ include /musics/ include /pictures/ ëĒ…ë šė¤„ė—ė„œ -f ė˜ĩė…˜ė„ ė‚ŦėšŠí•  때 `include` 패턴만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다. 똈ëĨŧ ë“¤ė–´: # .mp3 파ėŧ만 í™•ė¸. # Unixė—ė„œëŠ” 녏뗐 ė˜í•œ 글로빙 확ėžĨė„ í”ŧ하기 ėœ„í•´ ë”°ė˜´í‘œëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤. snapraid -f "*.mp3" check Unixė—ė„œëŠ” ëĒ…ë šė¤„ė—ė„œ 글로빙 ëŦ¸ėžëĨŧ ė‚ŦėšŠí•  때 ė…¸ė´ 확ėžĨ하는 ę˛ƒė„ ë°Šė§€í•˜ę¸° ėœ„í•´ ë”°ė˜´í‘œëĄœ ëŦļė–´ė•ŧ 합니다. 9 IGNORE FILE ============= 네렕 파ėŧė˜ ė „ė—­ ęˇœėš™ ė™¸ė—ë„, ë°°ė—´ ë‚´ė˜ ëĒ¨ë“  디렉토ëĻŦ뗐 `.snapraidignore` 파ėŧė„ ë°°ėš˜í•˜ė—Ŧ ëļ„ė‚°ëœ ė œė™¸ ęˇœėš™ė„ ė •ė˜í•  눘 ėžˆėŠĩ니다. `.snapraidignore`뗐 ė •ė˜ëœ ęˇœėš™ė€ 네렕 파ėŧė˜ ęˇœėš™ ë‹¤ėŒė— ė ėšŠëŠë‹ˆë‹¤. ė´ëŠ” 해당 ęˇœėš™ë“¤ė´ 더 ë†’ė€ ėš°ė„ ėˆœėœ„ëĨŧ ę°€ė§€ëŠ°, ė „ė—­ 네렕뗐 ė˜í•´ ė´ė „ė— íŦí•¨ë˜ė—ˆë˜ 파ėŧë“¤ė„ ė œė™¸í•˜ëŠ” 데 ė‚ŦėšŠë  눘 ėžˆėŒė„ ė˜ë¯¸í•Šë‹ˆë‹¤. ė‚Ŧė‹¤ėƒ 로ėģŦ ęˇœėš™ė´ ėŧėš˜í•˜ëŠ´, ė „ė—­ íŦ함 네렕ęŗŧ ę´€ęŗ„ė—†ė´ 해당 파ėŧė€ ė œė™¸ëŠë‹ˆë‹¤. `.snapraidignore`ė˜ 패턴 ëĄœė§ė€ ė „ė—­ ė„¤ė •ė„ 따ëĨ´ė§€ë§Œ, íŒ¨í„´ė€ 해당 파ėŧė´ ėœ„ėš˜í•œ 디렉토ëĻŦëĨŧ 揰뤀ėœŧ로 ęŗ ė •ëŠë‹ˆë‹¤: FILE ė´ 디렉토ëĻŦ 또는 ꡸ í•˜ėœ„ė—ė„œ FILEė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. ė´ëŠ” ė „ė—­ 패턴ęŗŧ 동ėŧ한 글로빙(globbing) ęˇœėš™ė„ 따ëĻ…ë‹ˆë‹¤. DIR/ ė´ 디렉토ëĻŦ 또는 ꡸ í•˜ėœ„ė—ė„œ DIRė´ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  항ëĒŠė„ ė„ íƒí•Šë‹ˆë‹¤. /PATH/FILE `.snapraidignore` 파ėŧė˜ ėœ„ėš˜ëĨŧ 揰뤀ėœŧ로 ė§€ė •ëœ ė •í™•í•œ 파ėŧė„ ė„ íƒí•Šë‹ˆë‹¤. /PATH/DIR/ `.snapraidignore` 파ėŧė˜ ėœ„ėš˜ëĨŧ 揰뤀ėœŧ로 ė§€ė •ëœ ė •í™•í•œ 디렉토ëĻŦ뙀 ꡸ ė•ˆė˜ ëĒ¨ë“  항ëĒŠė„ ė„ íƒí•Šë‹ˆë‹¤. ė „ė—­ 네렕ęŗŧ ë‹ŦëĻŦ, `.snapraidignore` 파ėŧė€ ė œė™¸ ęˇœėš™ë§Œ ė§€ė›í•Šë‹ˆë‹¤. `include` íŒ¨í„´ė´ë‚˜ ëļ€ė •(!)ė€ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. 똈ëĨŧ ë“¤ė–´, `/mnt/disk1/projects/`뗐 `.snapraidignore`가 ėžˆëŠ” ę˛Ŋ뚰: # /mnt/disk1/projects/output.bin만 ė œė™¸ /output.bin # projects/ 내ëļ€ė˜ `build`ëŧ는 ė´ëĻ„ė˜ ëĒ¨ë“  디렉토ëĻŦ ė œė™¸ build/ # projects/ 또는 ꡸ í•˜ėœ„ í´ë”ė˜ ëĒ¨ë“  .tmp 파ėŧ ė œė™¸ *.tmp 10 CONTENT ========== SnapRAID는 content 파ėŧ뗐 파ėŧ ëĒŠëĄęŗŧ 랴íŦė„Ŧė„ ė €ėžĨ합니다. ė´ę˛ƒė€ ë””ėŠ¤íŦ ė–´ë ˆė´ė— ėžˆëŠ” ëĒ¨ë“  파ėŧė˜ ëĒŠëĄęŗŧ ëŦ´ę˛°ė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•œ ëĒ¨ë“  랴íŦė„Ŧė„ ë‚˜ė—´í•˜ëŠ” ė´ė§„ 파ėŧėž…ë‹ˆë‹¤. ė´ 파ėŧė€ `sync` 및 `scrub` ëĒ…ë šė— ė˜í•´ ėŊęŗ  ė“°ė—Ŧė§€ëŠ°, `fix`, `check`, 및 `status` ëĒ…ë šė— ė˜í•´ ėŊí˜€ė§‘ë‹ˆë‹¤. 11 PARITY ========= SnapRAID는 패ëĻŦ티 파ėŧ뗐 ė–´ë ˆė´ė˜ 패ëĻŦ티 ė •ëŗ´ëĨŧ ė €ėžĨ합니다. ė´ë“¤ė€ `content` 파ėŧ뗐 ė •ė˜ëœ ëĒ¨ë“  ë¸”ëĄė˜ ęŗ„ė‚°ëœ 패ëĻŦ티ëĨŧ íŦ함하는 ė´ė§„ 파ėŧėž…ë‹ˆë‹¤. ė´ 파ėŧë“¤ė€ `sync` 및 `fix` ëĒ…ë šė— ė˜í•´ ėŊęŗ  ė“°ė—Ŧė§€ëŠ°, `scrub` 및 `check` ëĒ…ë šė— ė˜í•´ė„œë§Œ ėŊí˜€ė§‘ë‹ˆë‹¤. 12 ENCODING =========== Unixė˜ SnapRAID는 ė¸ėŊ”ë”Šė„ ëŦ´ė‹œí•Šë‹ˆë‹¤. 파ėŧ ė‹œėŠ¤í…œė—ė„œ ė‚ŦėšŠë˜ëŠ” 것ęŗŧ 동ėŧ한 ė¸ėŊ”딊ėœŧ로 파ėŧ ė´ëĻ„ė„ ėŊęŗ  ė €ėžĨ합니다. Windowsė—ė„œëŠ” 파ėŧ ė‹œėŠ¤í…œė—ė„œ ėŊė€ ëĒ¨ë“  ė´ëĻ„ė´ UTF-8 í˜•ė‹ėœŧ로 ëŗ€í™˜ë˜ęŗ  래ëĻŦ됩니다. 파ėŧ ė´ëĻ„ė´ ė˜Ŧ바ëĨ´ę˛Œ ėļœë Ĩ되도록 하려면, `chcp 65001` ëĒ…ë šėœŧ로 Windows ėŊ˜ė†”ė„ UTF-8 ëĒ¨ë“œëĄœ ė„¤ė •í•˜ęŗ  ėŊ˜ė†” 글ęŧ´ëĄœ `Lucida Console`ęŗŧ ę°™ė€ TrueType 글ęŧ´ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. ė´ëŠ” ėļœë Ĩ되는 파ėŧ ė´ëĻ„ė—ë§Œ 똁í–Ĩė„ ë¯¸ėš˜ëŠ°, ėŊ˜ė†” ėļœë Ĩė„ 파ėŧ로 ëĻŦë””ë ‰ė…˜í•˜ëŠ” ę˛Ŋ뚰 결ęŗŧ 파ėŧė€ í•­ėƒ UTF-8 í˜•ė‹ėž…ë‹ˆë‹¤. 13 COPYRIGHT ============ This file is Copyright (C) 2025 Andrea Mazzoleni 14 SEE ALSO =========== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-pl.1000066400000000000000000002113541522717156100163260ustar00rootroot00000000000000.TH "Kopia zapasowa SnapRAID dla macierzy dyskowych" 1 .SH NAME snapraid \- Kopia zapasowa SnapRAID dla macierzy dyskowych .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAID to program do tworzenia kopii zapasowych przeznaczony dla macierzy dyskowych, przechowujący informacje parzystości do odzyskiwania danych w przypadku awarii do sześciu dyskÃŗw. .PP Przeznaczony gÅ‚Ãŗwnie dla domowych centrÃŗw multimedialnych z duÅŧymi, rzadko zmieniającymi się plikami, SnapRAID oferuje kilka funkcji: .PD 0 .IP \(bu MoÅŧesz uÅŧywać dyskÃŗw juÅŧ wypełnionych plikami bez konieczności ich ponownego formatowania, uzyskując do nich dostęp jak zwykle. .IP \(bu Wszystkie Twoje dane są haszowane, aby zapewnić integralność danych i zapobiec cichej korupcji. .IP \(bu Gdy liczba uszkodzonych dyskÃŗw przekracza liczbę parzystości, utrata danych ogranicza się do dotkniętych dyskÃŗw; dane na innych dyskach pozostają dostępne. .IP \(bu Jeśli przypadkowo usuniesz pliki na dysku, moÅŧliwe jest ich odzyskanie. .IP \(bu Dyski mogą mieć rÃŗÅŧne rozmiary. .IP \(bu MoÅŧesz dodawać dyski w dowolnym momencie. .IP \(bu SnapRAID nie blokuje Twoich danych; moÅŧesz przestać go uÅŧywać w dowolnym momencie bez ponownego formatowania ani przenoszenia danych. .IP \(bu Aby uzyskać dostęp do pliku, wystarczy, Åŧe zakręci się tylko jeden dysk, co oszczędza energię i zmniejsza hałas. .PD .PP Więcej informacji moÅŧna znaleÅēć na oficjalnej stronie SnapRAID: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID to hybryda programu RAID i programu do tworzenia kopii zapasowych, ktÃŗrej celem jest połączenie najlepszych zalet obu. Ma jednak pewne ograniczenia, ktÃŗre naleÅŧy wziąć pod uwagę przed jego uÅŧyciem. .PP GÅ‚Ãŗwnym ograniczeniem jest to, Åŧe jeśli dysk ulegnie awarii, a Ty nie wykonałeś niedawno synchronizacji, moÅŧesz nie być w stanie w pełni odzyskać danych. Dokładniej, moÅŧesz nie być w stanie odzyskać danych o wielkości zmienionych lub usuniętych plikÃŗw od czasu ostatniej operacji synchronizacji. Dzieje się tak, nawet jeśli zmienione lub usunięte pliki nie znajdują się na uszkodzonym dysku. Dlatego SnapRAID jest lepiej dostosowany do danych, ktÃŗre rzadko się zmieniają. .PP Z drugiej strony, nowo dodane pliki nie uniemoÅŧliwiają odzyskania juÅŧ istniejących plikÃŗw. Stracisz tylko ostatnio dodane pliki, jeśli znajdują się one na uszkodzonym dysku. .PP Inne ograniczenia SnapRAID to: .PD 0 .IP \(bu W SnapRAID nadal masz oddzielne systemy plikÃŗw dla kaÅŧdego dysku. W RAID otrzymujesz jeden duÅŧy system plikÃŗw. .IP \(bu SnapRAID nie rozdziela danych. W RAID uzyskujesz wzrost prędkości dzięki rozdzielaniu. .IP \(bu SnapRAID nie obsługuje odzyskiwania w czasie rzeczywistym. W RAID nie musisz przerywać pracy, gdy dysk ulegnie awarii. .IP \(bu SnapRAID moÅŧe odzyskać dane tylko z ograniczonej liczby awarii dyskÃŗw. W przypadku kopii zapasowej moÅŧesz odzyskać dane po całkowitej awarii całej macierzy dyskÃŗw. .IP \(bu Zapisywane są tylko nazwy plikÃŗw, znaczniki czasu, dowiązania symboliczne i dowiązania twarde. Uprawnienia, właścicielstwo i rozszerzone atrybuty nie są zapisywane. .PD .SH GETTING STARTED Aby uÅŧyć SnapRAID, musisz najpierw wybrać jeden dysk w swojej macierzy dyskÃŗw, ktÃŗry zostanie przeznaczony na informacje o \`parzystości\`. Z jednym dyskiem na parzystość będziesz w stanie odzyskać dane po awarii pojedynczego dysku, podobnie jak w RAID5. .PP Jeśli chcesz odzyskać dane po większej liczbie awarii dyskÃŗw, podobnie jak w RAID6, musisz zarezerwować dodatkowe dyski na parzystość. KaÅŧdy dodatkowy dysk parzystości umoÅŧliwia odzyskanie danych po jeszcze jednej awarii dysku. .PP Jako dyski parzystości musisz wybrać największe dyski w macierzy, poniewaÅŧ informacje o parzystości mogą urosnąć do rozmiaru największego dysku danych w macierzy. .PP Dyski te będą przeznaczone do przechowywania plikÃŗw \`parzystości\`. Nie powinieneś na nich przechowywać swoich danych. .PP Następnie musisz zdefiniować dyski \`danych\`, ktÃŗre chcesz chronić za pomocą SnapRAID. Ochrona jest bardziej skuteczna, jeśli te dyski zawierają dane, ktÃŗre rzadko się zmieniają. Z tego powodu lepiej jest NIE włączać dysku C:\\ w systemie Windows ani katalogÃŗw /home, /var i /tmp w systemie Unix. .PP Lista plikÃŗw jest zapisywana w plikach \`zawartości\`, zwykle przechowywanych na dyskach danych, parzystości lub rozruchowych. Plik ten zawiera szczegÃŗÅ‚y Twojej kopii zapasowej, w tym wszystkie sumy kontrolne w celu weryfikacji jej integralności. Plik \`zawartości\` jest przechowywany w wielu kopiach, a kaÅŧda kopia musi znajdować się na innym dysku, aby zapewnić, Åŧe nawet w przypadku wielu awarii dyskÃŗw, przynajmniej jedna kopia jest dostępna. .PP Na przykład, zaÅ‚ÃŗÅŧmy, Åŧe interesuje Cię tylko jeden poziom parzystości i Twoje dyski znajdują się w: .PP .RS 4 /mnt/diskp <\- wybrany dysk dla parzystości .PD 0 .PP .PD /mnt/disk1 <\- pierwszy dysk do ochrony .PD 0 .PP .PD /mnt/disk2 <\- drugi dysk do ochrony .PD 0 .PP .PD /mnt/disk3 <\- trzeci dysk do ochrony .PD 0 .PD .RE .PP Musisz utworzyć plik konfiguracyjny /etc/snapraid.conf z następującymi opcjami: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Jeśli uÅŧywasz systemu Windows, powinieneś uÅŧyć formatu ścieÅŧek Windows, z literami dyskÃŗw i ukośnikami odwrotnymi zamiast ukośnikÃŗw: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Jeśli masz wiele dyskÃŗw i zabrakło Ci liter dyskÃŗw, moÅŧesz zamontować dyski bezpośrednio w podfolderach. Zobacz: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP W tym momencie jesteś gotowy do uruchomienia polecenia \`sync\`, aby zbudować informacje o parzystości. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Ten proces moÅŧe zająć kilka godzin za pierwszym razem, w zaleÅŧności od rozmiaru danych juÅŧ obecnych na dyskach. Jeśli dyski są puste, proces jest natychmiastowy. .PP MoÅŧesz go zatrzymać w dowolnym momencie, naciskając Ctrl+C, a przy następnym uruchomieniu wznowi się w miejscu, w ktÃŗrym został przerwany. .PP Kiedy to polecenie się zakończy, Twoje dane są BEZPIECZNE. .PP Teraz moÅŧesz zacząć uÅŧywać swojej macierzy, jak chcesz, i okresowo aktualizować informacje o parzystości, uruchamiając polecenie \`sync\`. .SS Scrubbing Aby okresowo sprawdzać dane i parzystość pod kątem błędÃŗw, moÅŧesz uruchomić polecenie \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP To polecenie porÃŗwnuje dane w Twojej macierzy z haszem obliczonym podczas polecenia \`sync\`, aby zweryfikować integralność. .PP KaÅŧde uruchomienie polecenia sprawdza około 8% macierzy, z wyłączeniem danych juÅŧ sprawdzonych w ciągu poprzednich 10 dni. MoÅŧesz uÅŧyć opcji \-p, \-\-plan, aby określić inną ilość, oraz opcji \-o, \-\-older\-than, aby określić inny wiek w dniach. Na przykład, aby sprawdzić 5% macierzy dla blokÃŗw starszych niÅŧ 20 dni, uÅŧyj: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, odpowiednie bloki zostaną oznaczone jako złe w pliku \`content\` i wymienione w poleceniu \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Aby je naprawić, moÅŧesz uÅŧyć polecenia \`fix\`, filtrując złe bloki za pomocą opcji \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP Przy następnym \`scrub\`, błędy znikną z raportu \`status\`, jeśli zostały faktycznie naprawione. Aby przyspieszyć, moÅŧesz uÅŧyć \-p bad, aby sprawdzić tylko bloki oznaczone jako złe. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP Uruchomienie \`scrub\` na niezsynchronizowanej macierzy moÅŧe zgłosić błędy spowodowane usuniętymi lub zmodyfikowanymi plikami. Błędy te są zgłaszane w wyniku \`scrub\`, ale powiązane bloki nie są oznaczane jako złe. .SS Pooling Uwaga: Funkcja łączenia w pulę opisana poniÅŧej została zastąpiona przez narzędzie mergerfs, ktÃŗre jest obecnie zalecaną opcją dla uÅŧytkownikÃŗw Linuksa w społeczności SnapRAID. Mergefs zapewnia bardziej elastyczny i wydajny sposÃŗb łączenia wielu dyskÃŗw w jeden ujednolicony punkt montowania, umoÅŧliwiając bezproblemowy dostęp do plikÃŗw w całej macierzy bez polegania na dowiązaniach symbolicznych. Dobrze integruje się z SnapRAID w celu ochrony parzystości i jest powszechnie uÅŧywane w konfiguracjach takich jak OpenMediaVault (OMV) lub niestandardowe konfiguracje NAS. .PP Aby wszystkie pliki w Twojej macierzy były widoczne w tym samym drzewie katalogÃŗw, moÅŧesz włączyć funkcję \`pooling\`. Tworzy ona wirtualny, tylko do odczytu, widok wszystkich plikÃŗw w Twojej macierzy za pomocą dowiązań symbolicznych. .PP Katalog \`pooling\` moÅŧesz skonfigurować w pliku konfiguracyjnym za pomocą: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP lub, jeśli uÅŧywasz systemu Windows, za pomocą: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP a następnie uruchom polecenie \`pool\`, aby utworzyć lub zaktualizować wirtualny widok. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Jeśli uÅŧywasz platformy Unix i chcesz udostępnić ten katalog przez sieć maszynom Windows lub Unix, powinieneś dodać następujące opcje do swojego /etc/samba/smb.conf: .PP .RS 4 # W sekcji globalnej smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # W sekcji udziału smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pula .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP W systemie Windows udostępnianie dowiązań symbolicznych przez sieć wymaga od klientÃŗw zdalnego ich rozwiązywania. Aby to umoÅŧliwić, oprÃŗcz udostępnienia katalogu puli, musisz rÃŗwnieÅŧ udostępnić wszystkie dyski niezaleÅŧnie, uÅŧywając nazw dyskÃŗw zdefiniowanych w pliku konfiguracyjnym jako punkty udostępniania. Musisz rÃŗwnieÅŧ określić w opcji \`share\` w pliku konfiguracyjnym ścieÅŧkę UNC Windows, ktÃŗrej klienci zdalni muszą uÅŧyć, aby uzyskać dostęp do tych udostępnionych dyskÃŗw. .PP Na przykład, działając z serwera o nazwie \`darkstar\`, moÅŧesz uÅŧyć opcji: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP i udostępnić w sieci następujące katalogi: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP aby umoÅŧliwić zdalnym klientom dostęp do wszystkich plikÃŗw pod adresem \\\\darkstar\\pool. .PP MoÅŧesz rÃŗwnieÅŧ potrzebować skonfigurować klientÃŗw zdalnych, aby umoÅŧliwić dostęp do zdalnych dowiązań symbolicznych za pomocą polecenia: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAID działa bardziej jak program do tworzenia kopii zapasowych niÅŧ system RAID i moÅŧe być uÅŧyty do przywrÃŗcenia lub odzyskania usuniętych plikÃŗw do ich poprzedniego stanu za pomocą opcji \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP lub dla katalogu: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP MoÅŧesz go rÃŗwnieÅŧ uÅŧyć do odzyskania tylko przypadkowo usuniętych plikÃŗw wewnątrz katalogu za pomocą opcji \-m, \-\-filter\-missing, ktÃŗra przywraca tylko brakujące pliki, pozostawiając wszystkie inne nienaruszone. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP Lub aby odzyskać wszystkie usunięte pliki na wszystkich dyskach za pomocą: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering Najgorsze się wydarzyło i straciłeś jeden lub więcej dyskÃŗw! .PP NIE PANIKUJ! Będziesz w stanie je odzyskać! .PP Pierwszą rzeczą, ktÃŗrą musisz zrobić, to unikać dalszych zmian w Twojej macierzy dyskÃŗw. Wyłącz wszelkie zdalne połączenia z nią i wszelkie zaplanowane procesy, w tym jakąkolwiek zaplanowaną nocną synchronizację lub scrub SnapRAID. .PP Następnie postępuj zgodnie z poniÅŧszymi krokami. .SS KROK 1 \-> Ponowna konfiguracja Potrzebujesz trochę miejsca do odzyskania, najlepiej na dodatkowych zapasowych dyskach, ale wystarczy zewnętrzny dysk USB lub dysk zdalny. .PP Zmodyfikuj plik konfiguracyjny SnapRAID, aby opcja \`data\` lub \`parity\` uszkodzonego dysku wskazywała na lokalizację z wystarczającą ilością pustego miejsca do odzyskania plikÃŗw. .PP Na przykład, jeśli dysk \`d1\` uległ awarii, zmień z: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP na: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Jeśli dysk do odzyskania jest dyskiem parzystości, zaktualizuj odpowiednią opcję \`parity\`. Jeśli masz wiele uszkodzonych dyskÃŗw, zaktualizuj wszystkie ich opcje konfiguracyjne. .SS KROK 2 \-> Naprawa Uruchom polecenie fix, zapisując log w pliku zewnętrznym za pomocą: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP Gdzie NAME to nazwa dysku, taka jak \`d1\` w naszym poprzednim przykładzie. Jeśli dysk do odzyskania jest dyskiem parzystości, uÅŧyj nazw \`parity\`, \`2\-parity\`, itp. Jeśli masz wiele uszkodzonych dyskÃŗw, uÅŧyj wielu opcji \-d, aby określić wszystkie z nich. .PP To polecenie zajmie duÅŧo czasu. .PP Upewnij się, Åŧe masz kilka gigabajtÃŗw wolnego miejsca na zapisanie pliku fix.log. Uruchom je z dysku z wystarczającą ilością wolnego miejsca. .PP Teraz odzyskałeś wszystko, co jest moÅŧliwe do odzyskania. Jeśli niektÃŗre pliki są częściowo lub całkowicie nie do odzyskania, zostaną one przemianowane poprzez dodanie rozszerzenia \`.unrecoverable\`. .PP SzczegÃŗÅ‚ową listę wszystkich nie do odzyskania blokÃŗw znajdziesz w pliku fix.log, sprawdzając wszystkie linie zaczynające się od \`unrecoverable:\`. .PP Jeśli nie jesteś zadowolony z odzyskiwania, moÅŧesz sprÃŗbować ponownie tyle razy, ile chcesz. .PP Na przykład, jeśli usunąłeś pliki z macierzy po ostatniej \`sync\`, moÅŧe to spowodować, Åŧe niektÃŗre pliki nie zostaną odzyskane. W tym przypadku moÅŧesz ponowić prÃŗbę \`fix\` za pomocą opcji \-i, \-\-import, określając, gdzie te pliki znajdują się teraz, aby włączyć je ponownie do procesu odzyskiwania. .PP Jeśli jesteś zadowolony z odzyskiwania, moÅŧesz kontynuować, ale pamiętaj, Åŧe po synchronizacji nie moÅŧesz juÅŧ ponowić prÃŗby polecenia \`fix\`! .SS KROK 3 \-> Sprawdzenie Jako ostroÅŧne sprawdzenie, moÅŧesz teraz uruchomić polecenie \`check\`, aby upewnić się, Åŧe wszystko jest poprawne na odzyskanym dysku. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP Gdzie NAME to nazwa dysku, taka jak \`d1\` w naszym poprzednim przykładzie. .PP Opcje \-d i \-a mÃŗwią SnapRAID, aby sprawdził tylko określony dysk i zignorował wszystkie dane parzystości. .PP To polecenie zajmie duÅŧo czasu, ale jeśli nie jesteś zbyt ostroÅŧny, moÅŧesz je pominąć. .SS KROK 4 \-> Synchronizacja Uruchom polecenie \`sync\`, aby ponownie zsynchronizować macierz z nowym dyskiem. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Jeśli wszystko zostanie odzyskane, to polecenie jest natychmiastowe. .SH COMMANDS SnapRAID udostępnia kilka prostych poleceń, ktÃŗre pozwalają na: .PD 0 .IP \(bu Wyświetlenie statusu macierzy \-> \`status\` .IP \(bu Kontrolę dyskÃŗw \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Wykonanie kopii zapasowej/migawki \-> \`sync\` .IP \(bu Okresowe sprawdzanie danych \-> \`scrub\` .IP \(bu PrzywrÃŗcenie ostatniej kopii zapasowej/migawki \-> \`fix\`. .PD .PP Polecenia muszą być zapisane małymi literami. .SS status Wyświetla podsumowanie stanu macierzy dyskÃŗw. .PP Zawiera informacje o fragmentacji parzystości, jak stare są bloki bez sprawdzenia i wszystkie zarejestrowane ciche błędy napotkane podczas scrubbingu. .PP Prezentowane informacje odnoszą się do ostatniego momentu, w ktÃŗrym uruchomiłeś \`sync\`. PÃŗÅēniejsze modyfikacje nie są brane pod uwagę. .PP Jeśli wykryto złe bloki, ich numery blokÃŗw są wymienione. Aby je naprawić, moÅŧesz uÅŧyć polecenia \`fix \-e\`. .PP Pokazuje rÃŗwnieÅŧ wykres reprezentujący ostatni raz, kiedy kaÅŧdy blok został sprawdzony lub zsynchronizowany. Sprawdzone bloki są pokazane za pomocą \`*\`, bloki zsynchronizowane, ale jeszcze niesprawdzone, za pomocą \`o\`. .PP Nic nie jest modyfikowane. .SS smart Wyświetla raport SMART wszystkich dyskÃŗw w systemie. .PP Zawiera oszacowanie prawdopodobieństwa awarii w następnym roku, co pozwala zaplanować wymianę konserwacyjną dyskÃŗw, ktÃŗre wykazują podejrzane atrybuty. .PP To oszacowanie prawdopodobieństwa uzyskuje się poprzez skorelowanie atrybutÃŗw SMART dyskÃŗw z danymi Backblaze dostępnymi pod adresem: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Jeśli SMART zgłosi, Åŧe dysk ulega awarii, dla tego dysku wyświetlane jest \`FAIL\` lub \`PREFAIL\`, a SnapRAID zwraca błąd. W takim przypadku natychmiastowa wymiana dysku jest wysoce zalecana. .PP Inne moÅŧliwe ciągi statusu to: .RS 4 .PD 0 .HP 4 .I logfail W przeszłości niektÃŗre atrybuty były niÅŧsze niÅŧ prÃŗg. .HP 4 .I logerr Dziennik błędÃŗw urządzenia zawiera błędy. .HP 4 .I selferr Dziennik autotestu urządzenia zawiera błędy. .PD .RE .PP Jeśli określono opcję \-v, \-\-verbose, dostarczana jest głębsza analiza statystyczna. Ta analiza moÅŧe pomÃŗc Ci zdecydować, czy potrzebujesz więcej czy mniej parzystości. .PP To polecenie uÅŧywa narzędzia \`smartctl\` i jest rÃŗwnowaÅŧne uruchomieniu \`smartctl \-a\` na wszystkich urządzeniach. .PP Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, moÅŧesz określić niestandardowe polecenie za pomocą opcji \`smartctl\` w pliku konfiguracyjnym. .PP Nic nie jest modyfikowane. .SS probe Wyświetla stan ZASILANIA wszystkich dyskÃŗw w systemie. .PP \`Standby\` oznacza, Åŧe dysk się nie kręci. \`Active\` oznacza, Åŧe dysk się kręci. .PP To polecenie uÅŧywa narzędzia \`smartctl\` i jest rÃŗwnowaÅŧne uruchomieniu \`smartctl \-n standby \-i\` na wszystkich urządzeniach. .PP Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, moÅŧesz określić niestandardowe polecenie za pomocą opcji \`smartctl\` w pliku konfiguracyjnym. .PP Nic nie jest modyfikowane. .SS up Rozpędza wszystkie dyski macierzy. .PP MoÅŧesz rozpędzić tylko określone dyski za pomocą opcji \-d, \-\-filter\-disk. .PP Rozpędzanie wszystkich dyskÃŗw w tym samym czasie wymaga duÅŧo energii. Upewnij się, Åŧe TwÃŗj zasilacz jest w stanie to wytrzymać. .PP Nic nie jest modyfikowane. .SS down Zatrzymuje wszystkie dyski macierzy. .PP To polecenie uÅŧywa narzędzia \`smartctl\` i jest rÃŗwnowaÅŧne uruchomieniu \`smartctl \-s standby,now\` na wszystkich urządzeniach. .PP MoÅŧesz zatrzymać tylko określone dyski za pomocą opcji \-d, \-\-filter\-disk. .PP Aby automatycznie zatrzymać dyski w przypadku błędu, moÅŧesz uÅŧyć opcji \-s, \-\-spin\-down\-on\-error z dowolnym innym poleceniem, co jest rÃŗwnowaÅŧne ręcznemu uruchomieniu \`down\`, gdy wystąpi błąd. .PP Nic nie jest modyfikowane. .SS diff Wyświetla listę wszystkich plikÃŗw zmodyfikowanych od ostatniej \`sync\`, ktÃŗre wymagają ponownego obliczenia danych parzystości. .PP To polecenie nie sprawdza danych pliku, a jedynie znacznik czasu pliku, rozmiar i inode. .PP Po wyświetleniu listy wszystkich zmienionych plikÃŗw, prezentowane jest podsumowanie zmian, pogrupowane według: .RS 4 .PD 0 .HP 4 .I equal Pliki niezmienione od wcześniej. .HP 4 .I added Pliki dodane, ktÃŗrych wcześniej nie było. .HP 4 .I removed Pliki usunięte. .HP 4 .I updated Pliki o innym rozmiarze lub znaczniku czasu, co oznacza, Åŧe zostały zmodyfikowane. .HP 4 .I moved Pliki przeniesione do innego katalogu na tym samym dysku. Są one identyfikowane przez tę samą nazwę, rozmiar, znacznik czasu i inode, ale inny katalog. .HP 4 .I copied Pliki skopiowane na ten sam lub inny dysk, gdzie oryginalny plik nadal istnieje. Są one identyfikowane przez posiadanie tej samej nazwy, rozmiaru i znacznika czasu. Jeśli podsekundowy znacznik czasu wynosi zero, pełna ścieÅŧka musi być zgodna, aby plik został zidentyfikowany, a nie tylko nazwa. .HP 4 .I relocated Pliki przeniesione na ten sam lub inny dysk, gdzie oryginał zniknął. Są one identyfikowane przez posiadanie tej samej nazwy, rozmiaru i znacznika czasu. Jeśli podsekundowy znacznik czasu wynosi zero, pełna ścieÅŧka musi być zgodna, aby plik został zidentyfikowany. W przeciwieństwie do plikÃŗw \'moved\' na tym samym dysku, pliki relokowane mają inny i\-węzeł. .HP 4 .I restored Pliki o innym i\-węÅēle, ale pasującym katalogu, nazwie, rozmiarze i znaczniku czasu. Są to zazwyczaj pliki przywrÃŗcone po ich usunięciu. .PD .RE .PP Jeśli wymagana jest \`sync\`, kod powrotu procesu wynosi 2, zamiast domyślnego 0. Kod powrotu 1 jest uÅŧywany dla ogÃŗlnego stanu błędu. .PP Nic nie jest modyfikowane. .SS sync Aktualizuje informacje o parzystości. Wszystkie zmodyfikowane pliki w macierzy dyskÃŗw są odczytywane, a odpowiednie dane parzystości są aktualizowane. .PP MoÅŧesz zatrzymać ten proces w dowolnym momencie, naciskając Ctrl+C, bez utraty juÅŧ wykonanej pracy. Przy następnym uruchomieniu proces \`sync\` wznowi się w miejscu, w ktÃŗrym został przerwany. .PP Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, odpowiednie bloki zostaną oznaczone jako złe. .PP Pliki są identyfikowane po ścieÅŧce i/lub inode i sprawdzane po rozmiarze i znaczniku czasu. Jeśli rozmiar pliku lub znacznik czasu się rÃŗÅŧni, dane parzystości są ponownie obliczane dla całego pliku. Jeśli plik zostanie przeniesiony lub zmieniony na tym samym dysku, zachowując ten sam inode, parzystość nie jest ponownie obliczana. Jeśli plik zostanie przeniesiony na inny dysk, parzystość jest ponownie obliczana, ale wcześniej obliczone informacje o haszu są zachowywane. .PP Pliki \`content\` i \`parity\` są modyfikowane w razie potrzeby. Pliki w macierzy NIE są modyfikowane. .SS scrub Sprawdza macierz, szukając cichych błędÃŗw lub błędÃŗw wejścia/wyjścia w danych i dyskach parzystości. .PP KaÅŧde wywołanie sprawdza około 8% macierzy, z wyłączeniem danych juÅŧ sprawdzonych w ciągu ostatnich 10 dni. Oznacza to, Åŧe sprawdzanie raz w tygodniu zapewnia sprawdzenie kaÅŧdego bitu danych przynajmniej raz na trzy miesiące. .PP MoÅŧesz zdefiniować inny plan sprawdzania lub ilość za pomocą opcji \-p, \-\-plan, ktÃŗra akceptuje: bad \- Sprawdza bloki oznaczone jako złe. new \- Sprawdza bloki właśnie zsynchronizowane, jeszcze niesprawdzone. full \- Sprawdza wszystko. 0\-100 \- Sprawdza określony procent blokÃŗw. .PP Jeśli określisz wartość procentową, moÅŧesz rÃŗwnieÅŧ uÅŧyć opcji \-o, \-\-older\-than, aby zdefiniować, jak stary powinien być blok. Najpierw sprawdzane są najstarsze bloki, co zapewnia optymalne sprawdzenie. Jeśli chcesz sprawdzić tylko bloki właśnie zsynchronizowane, jeszcze niesprawdzone, uÅŧyj opcji \`\-p new\`. .PP Aby uzyskać szczegÃŗÅ‚y statusu sprawdzania, uÅŧyj polecenia \`status\`. .PP Dla kaÅŧdego znalezionego cichego błędu lub błędu wejścia/wyjścia, odpowiednie bloki są oznaczane jako złe w pliku \`content\`. Te złe bloki są wymienione w \`status\` i mogą zostać naprawione za pomocą \`fix \-e\`. Po naprawie, przy następnym sprawdzeniu, zostaną one ponownie sprawdzone, a jeśli okaÅŧe się, Åŧe zostały poprawione, oznaczenie złego zostanie usunięte. Aby sprawdzić tylko złe bloki, moÅŧesz uÅŧyć polecenia \`scrub \-p bad\`. .PP Zaleca się uruchamianie \`scrub\` tylko na zsynchronizowanej macierzy, aby uniknąć zgłaszania błędÃŗw spowodowanych przez niezsynchronizowane dane. Błędy te są rozpoznawane jako nie będące cichymi błędami, a bloki nie są oznaczane jako złe, ale takie błędy są zgłaszane w wyniku polecenia. .PP Plik \`content\` jest modyfikowany w celu zaktualizowania czasu ostatniego sprawdzenia dla kaÅŧdego bloku i oznaczenia złych blokÃŗw. Pliki \`parity\` NIE są modyfikowane. Pliki w macierzy NIE są modyfikowane. .SS fix Naprawia wszystkie pliki i dane parzystości. .PP Wszystkie pliki i dane parzystości są porÃŗwnywane ze stanem migawki zapisanym w ostatniej \`sync\`. Jeśli zostanie znaleziona rÃŗÅŧnica, jest ona przywracana do zapisanego stanu migawki. .PP OSTRZEÅģENIE! Polecenie \`fix\` nie rozrÃŗÅŧnia błędÃŗw od celowych modyfikacji. Bezwarunkowo przywraca stan pliku do ostatniej \`sync\`. .PP Jeśli nie określono Åŧadnej innej opcji, przetwarzana jest cała macierz. UÅŧyj opcji filtra, aby wybrać podzbiÃŗr plikÃŗw lub dyskÃŗw do operacji. .PP Aby naprawić tylko bloki oznaczone jako złe podczas \`sync\` i \`scrub\`, uÅŧyj opcji \-e, \-\-filter\-error. W przeciwieństwie do innych opcji filtra, ta stosuje poprawki tylko do plikÃŗw, ktÃŗre są niezmienione od ostatniej \`sync\`. .PP SnapRAID zmienia nazwy wszystkich plikÃŗw, ktÃŗrych nie moÅŧna naprawić, dodając rozszerzenie \`.unrecoverable\`. .PP Przed naprawą, cała macierz jest skanowana w celu znalezienia wszelkich plikÃŗw przeniesionych od ostatniej operacji \`sync\`. Pliki te są identyfikowane na podstawie ich znacznika czasu, ignorując ich nazwę i katalog, i są uÅŧywane w procesie odzyskiwania, jeśli to konieczne. Jeśli przeniosłeś niektÃŗre z nich poza macierz, moÅŧesz uÅŧyć opcji \-i, \-\-import, aby określić dodatkowe katalogi do skanowania. .PP Pliki są identyfikowane tylko po ścieÅŧce, a nie po inode. .PP Plik \`content\` NIE jest modyfikowany. Pliki \`parity\` są modyfikowane w razie potrzeby. Pliki w macierzy są modyfikowane w razie potrzeby. .SS check Weryfikuje wszystkie pliki i dane parzystości. .PP Działa jak \`fix\`, ale tylko symuluje odzyskiwanie i Åŧadne zmiany nie są zapisywane w macierzy. .PP To polecenie jest przeznaczone gÅ‚Ãŗwnie do ręcznej weryfikacji, takiej jak po procesie odzyskiwania lub w innych specjalnych warunkach. Do okresowych i zaplanowanych sprawdzeń uÅŧyj \`scrub\`. .PP Jeśli uÅŧyjesz opcji \-a, \-\-audit\-only, sprawdzane są tylko dane pliku, a dane parzystości są ignorowane, co zapewnia szybsze działanie. .PP Pliki są identyfikowane tylko po ścieÅŧce, a nie po inode. .PP Nic nie jest modyfikowane. .SS list Wyświetla listę wszystkich plikÃŗw zawartych w macierzy w momencie ostatniej \`sync\`. .PP Z \-v lub \-\-verbose, wyświetlany jest rÃŗwnieÅŧ czas z dokładnością do podsekundy. .PP Nic nie jest modyfikowane. .SS dup Wyświetla listę wszystkich zduplikowanych plikÃŗw. Dwa pliki są uwaÅŧane za rÃŗwne, jeśli ich hasze pasują. Dane pliku nie są odczytywane; uÅŧywane są tylko wcześniej obliczone hasze. .PP Nic nie jest modyfikowane. .SS pool Tworzy lub aktualizuje wirtualny widok wszystkich plikÃŗw w Twojej macierzy dyskÃŗw w katalogu \`pooling\`. .PP Pliki nie są kopiowane, ale linkowane za pomocą dowiązań symbolicznych. .PP Podczas aktualizacji, wszystkie istniejące dowiązania symboliczne i puste podkatalogi są usuwane i zastępowane nowym widokiem macierzy. Wszelkie inne zwykłe pliki pozostają na swoim miejscu. .PP Nic nie jest modyfikowane poza katalogiem puli. .SS devices Wyświetla urządzenia niskiego poziomu uÅŧywane przez macierz. .PP To polecenie wyświetla skojarzenia urządzeń w macierzy i jest przeznaczone gÅ‚Ãŗwnie jako interfejs skryptowy. .PP Pierwsze dwie kolumny to identyfikator i ścieÅŧka urządzenia niskiego poziomu. Następne dwie kolumny to identyfikator i ścieÅŧka urządzenia wysokiego poziomu. Ostatnia kolumna to nazwa dysku w macierzy. .PP W większości przypadkÃŗw masz jedno urządzenie niskiego poziomu dla kaÅŧdego dysku w macierzy, ale w niektÃŗrych bardziej złoÅŧonych konfiguracjach moÅŧesz mieć wiele urządzeń niskiego poziomu uÅŧywanych przez pojedynczy dysk w macierzy. .PP Nic nie jest modyfikowane. .SS touch Ustawia arbitralny znacznik czasu z dokładnością do podsekundy dla wszystkich plikÃŗw, ktÃŗre mają go ustawiony na zero. .PP Poprawia to zdolność SnapRAID do rozpoznawania przeniesionych i skopiowanych plikÃŗw, poniewaÅŧ sprawia, Åŧe znacznik czasu jest prawie unikalny, redukując moÅŧliwe duplikaty. .PP Dokładniej, jeśli znacznik czasu z dokładnością do podsekundy nie jest zerowy, przeniesiony lub skopiowany plik jest identyfikowany jako taki, jeśli pasuje do nazwy, rozmiaru i znacznika czasu. Jeśli znacznik czasu z dokładnością do podsekundy jest zerowy, jest uwaÅŧany za kopię tylko wtedy, gdy pasują pełna ścieÅŧka, rozmiar i znacznik czasu. .PP Znacznik czasu z dokładnością do sekundy nie jest modyfikowany, więc wszystkie daty i czasy Twoich plikÃŗw zostaną zachowane. .SS rehash Planuje ponowne haszowanie całej macierzy. .PP To polecenie zmienia uÅŧywany rodzaj hasza, zazwyczaj podczas aktualizacji z systemu 32\-bitowego na 64\-bitowy, aby przełączyć się z MurmurHash3 na szybszy SpookyHash. .PP Jeśli uÅŧywasz juÅŧ optymalnego hasza, to polecenie nic nie robi i informuje Cię, Åŧe nie jest potrzebne Åŧadne działanie. .PP Ponowne haszowanie nie jest wykonywane natychmiast, ale odbywa się stopniowo podczas \`sync\` i \`scrub\`. .PP MoÅŧesz sprawdzić stan ponownego haszowania za pomocą \`status\`. .PP Podczas ponownego haszowania SnapRAID zachowuje pełną funkcjonalność, z jedynym wyjątkiem, Åŧe \`dup\` nie moÅŧe wykryć zduplikowanych plikÃŗw uÅŧywających innego hasza. .SS locate Lokalizuje pliki zapisane na dyskach parzystości. Dla kaÅŧdego dopasowanego pliku wypisuje jego lokalizację w pliku parzystości oraz liczbę zajmowanych przez niego fragmentÃŗw. .PP MoÅŧesz uÅŧyć opcji \-t, \-\-tail, aby ograniczyć operację do plikÃŗw zajmujących określoną końcową część parzystości. .PP Jeśli chcesz dokonać realokacji tych plikÃŗw, moÅŧesz uÅŧyć opcji \-W, \-\-force\-realloc\-tail. Pamiętaj, Åŧe takie pliki nie będą chronione przez parzystość podczas procesu realokacji. .SH OPTIONS SnapRAID udostępnia następujące opcje: .TP .B \-c, \-\-conf CONFIG Wybiera plik konfiguracyjny do uÅŧycia. Jeśli nie określono, w systemie Unix uÅŧywa pliku \`/usr/local/etc/snapraid.conf\`, jeśli istnieje, w przeciwnym razie \`/etc/snapraid.conf\`. W systemie Windows uÅŧywa pliku \`snapraid.conf\` w tym samym katalogu co \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Filtruje pliki do przetworzenia w \`check\` i \`fix\`. Przetwarzane są tylko pliki pasujące do określonego wzorca. Ta opcja moÅŧe być uÅŧywana wielokrotnie. Zobacz sekcję PATTERN, aby uzyskać więcej szczegÃŗÅ‚Ãŗw na temat specyfikacji wzorcÃŗw. W systemie Unix upewnij się, Åŧe znaki globbing są cytowane, jeśli są uÅŧywane. Ta opcja moÅŧe być uÅŧywana tylko z \`check\` i \`fix\`. Nie moÅŧe być uÅŧywana z \`sync\` i \`scrub\`, poniewaÅŧ zawsze przetwarzają całą macierz. .TP .B \-d, \-\-filter\-disk NAME Filtruje dyski do przetworzenia w \`check\`, \`fix\`, \`up\` i \`down\`. Musisz określić nazwę dysku zdefiniowaną w pliku konfiguracyjnym. MoÅŧesz rÃŗwnieÅŧ określić dyski parzystości za pomocą nazw: \`parity\`, \`2\-parity\`, \`3\-parity\`, itp., aby ograniczyć operacje do określonego dysku parzystości. Jeśli połączysz wiele opcji \-\-filter, \-\-filter\-disk i \-\-filter\-missing, wybrane zostaną tylko pliki pasujące do wszystkich filtrÃŗw. Ta opcja moÅŧe być uÅŧywana wielokrotnie. Ta opcja moÅŧe być uÅŧywana tylko z \`check\`, \`fix\`, \`up\` i \`down\`. Nie moÅŧe być uÅŧywana z \`sync\` i \`scrub\`, poniewaÅŧ zawsze przetwarzają całą macierz. .TP .B \-m, \-\-filter\-missing Filtruje pliki do przetworzenia w \`check\` i \`fix\`. Przetwarzane są tylko pliki brakujące lub usunięte z macierzy. UÅŧyte z \`fix\`, działa to jako polecenie \`undelete\`. Jeśli połączysz wiele opcji \-\-filter, \-\-filter\-disk i \-\-filter\-missing, wybrane zostaną tylko pliki pasujące do wszystkich filtrÃŗw. Ta opcja moÅŧe być uÅŧywana tylko z \`check\` i \`fix\`. Nie moÅŧe być uÅŧywana z \`sync\` i \`scrub\`, poniewaÅŧ zawsze przetwarzają całą macierz. .TP .B \-e, \-\-filter\-error Przetwarza pliki z błędami w \`check\` i \`fix\`. Przetwarza tylko pliki, ktÃŗre mają bloki oznaczone cichymi błędami lub błędami wejścia/wyjścia podczas \`sync\` i \`scrub\`, jak wymieniono w \`status\`. Ta opcja moÅŧe być uÅŧywana tylko z \`check\` i \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Wybiera plan sprawdzania. Jeśli PERC jest wartością numeryczną od 0 do 100, jest interpretowany jako procent blokÃŗw do sprawdzenia. Zamiast wartości procentowej moÅŧesz określić plan: \`bad\` sprawdza złe bloki, \`new\` sprawdza bloki jeszcze niesprawdzone, a \`full\` sprawdza wszystko. Ta opcja moÅŧe być uÅŧywana tylko z \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Wybiera najstarszą część macierzy do przetworzenia w \`scrub\`. DAYS to minimalny wiek w dniach dla bloku, ktÃŗry ma być sprawdzony; domyślnie jest to 10. Bloki oznaczone jako złe są zawsze sprawdzane niezaleÅŧnie od tej opcji. Ta opcja moÅŧe być uÅŧywana tylko z \`scrub\`. .TP .B \-a, \-\-audit\-only W \`check\`, weryfikuje hasz plikÃŗw bez sprawdzania danych parzystości. Jeśli interesuje Cię tylko sprawdzenie danych pliku, ta opcja moÅŧe znacznie przyspieszyć proces sprawdzania. Ta opcja moÅŧe być uÅŧywana tylko z \`check\`. .TP .B \-h, \-\-pre\-hash W \`sync\`, uruchamia wstępną fazę haszowania wszystkich nowych danych w celu dodatkowej weryfikacji przed obliczeniem parzystości. Zazwyczaj w \`sync\` nie jest wykonywane wstępne haszowanie, a nowe dane są haszowane tuÅŧ przed obliczeniem parzystości, gdy są odczytywane po raz pierwszy. Ten proces zachodzi, gdy system jest pod duÅŧym obciąÅŧeniem, wszystkie dyski się kręcą, a CPU jest zajęte. Jest to ekstremalny warunek dla maszyny, a jeśli ma ukryty problem sprzętowy, ciche błędy mogą pozostać niewykryte, poniewaÅŧ dane nie są jeszcze haszowane. Aby uniknąć tego ryzyka, moÅŧesz włączyć tryb \`pre\-hash\`, aby wszystkie dane były odczytywane dwukrotnie w celu zapewnienia ich integralności. Ta opcja weryfikuje rÃŗwnieÅŧ pliki przeniesione wewnątrz macierzy, aby upewnić się, Åŧe operacja przeniesienia zakończyła się pomyślnie, i, jeśli to konieczne, umoÅŧliwia uruchomienie operacji fix przed kontynuowaniem. Ta opcja moÅŧe być uÅŧywana tylko z \`sync\`. .TP .B \-i, \-\-import DIR Importuje z określonego katalogu wszelkie pliki usunięte z macierzy po ostatniej \`sync\`. Jeśli nadal masz takie pliki, mogą być uÅŧyte przez \`check\` i \`fix\`, aby poprawić proces odzyskiwania. Pliki są odczytywane, w tym w podkatalogach, i są identyfikowane niezaleÅŧnie od ich nazwy. Ta opcja moÅŧe być uÅŧywana tylko z \`check\` i \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error W przypadku kaÅŧdego błędu, zatrzymuje wszystkie zarządzane dyski przed wyjściem z niezerowym kodem statusu. Zapobiega to pozostawaniu dyskÃŗw aktywnymi i kręcącymi się po przerwanej operacji, pomagając uniknąć niepotrzebnego gromadzenia się ciepła i zuÅŧycia energii. UÅŧyj tej opcji, aby upewnić się, Åŧe dyski są bezpiecznie zatrzymane, nawet gdy polecenie zakończy się niepowodzeniem. .TP .B \-w, \-\-bw\-limit RATE Stosuje globalne ograniczenie przepustowości dla wszystkich dyskÃŗw. RATE to liczba bajtÃŗw na sekundę. MoÅŧesz określić mnoÅŧnik, taki jak K, M lub G (np. \-\-bw\-limit 1G). .TP .B \-t, \-\-tail ROZMIAR Ogranicza listę plikÃŗw do tych, ktÃŗre nie uÅŧywają więcej niÅŧ określony końcowy rozmiar dyskÃŗw parzystości. MoÅŧesz uÅŧyć mnoÅŧnikÃŗw takich jak K, M, G lub T (np. \-\-tail 1G). Opcja ta jest waÅŧna tylko wtedy, gdy jest uÅŧywana wraz z poleceniem \`locate\`. .TP .B \-A, \-\-stats Włącza rozszerzony widok statusu, ktÃŗry pokazuje dodatkowe informacje. Ekran wyświetla dwa wykresy: Pierwszy wykres pokazuje liczbę buforowanych paskÃŗw dla kaÅŧdego dysku, wraz ze ścieÅŧką pliku, do ktÃŗrego aktualnie uzyskuje się dostęp na tym dysku. Zazwyczaj najwolniejszy dysk nie będzie miał dostępnego bufora, co determinuje maksymalną osiągalną przepustowość. Drugi wykres pokazuje procent czasu spędzonego na czekaniu w ciągu ostatnich 100 sekund. Oczekuje się, Åŧe najwolniejszy dysk spowoduje większość czasu oczekiwania, podczas gdy inne dyski powinny mieć niewielki lub Åŧaden czas oczekiwania, poniewaÅŧ mogą uÅŧywać swoich buforowanych paskÃŗw. Ten wykres pokazuje rÃŗwnieÅŧ czas spędzony na czekaniu na obliczenia hasza i obliczenia RAID. Wszystkie obliczenia są wykonywane rÃŗwnolegle z operacjami dyskowymi. Dlatego, dopÃŗki istnieje mierzalny czas oczekiwania dla przynajmniej jednego dysku, oznacza to, Åŧe CPU jest wystarczająco szybkie, aby nadąÅŧyć za obciąÅŧeniem. .TP .B \-Z, \-\-force\-zero Wymusza niebezpieczną operację synchronizacji pliku o zerowym rozmiarze, ktÃŗry wcześniej był niezerowy. Jeśli SnapRAID wykryje taki stan, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to łatwo wykryć, kiedy po awarii systemu niektÃŗre dostępne pliki zostały obcięte. Jest to moÅŧliwy stan w systemie Linux z systemami plikÃŗw ext3/ext4. Ta opcja moÅŧe być uÅŧywana tylko z \`sync\`. .TP .B \-E, \-\-force\-empty Wymusza niebezpieczną operację synchronizacji dysku z brakującymi wszystkimi oryginalnymi plikami. Jeśli SnapRAID wykryje, Åŧe brakuje wszystkich plikÃŗw pierwotnie obecnych na dysku lub zostały przepisane, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to łatwo wykryć, kiedy system plikÃŗw danych nie jest zamontowany. Ta opcja moÅŧe być uÅŧywana tylko z \`sync\`. .TP .B \-U, \-\-force\-uuid Wymusza niebezpieczną operację synchronizacji, sprawdzania i naprawiania z dyskami, ktÃŗre zmieniły swÃŗj UUID. Jeśli SnapRAID wykryje, Åŧe niektÃŗre dyski zmieniły UUID, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to wykryć, kiedy Twoje dyski są zamontowane w niewłaściwych punktach montowania. Dozwolona jest jednak pojedyncza zmiana UUID z pojedynczą parzystością i więcej z wielokrotną parzystością, poniewaÅŧ jest to normalny przypadek podczas wymiany dyskÃŗw po odzyskaniu. Ta opcja moÅŧe być uÅŧywana tylko z \`sync\`, \`check\` lub \`fix\`. .TP .B \-D, \-\-force\-device Wymusza niebezpieczną operację naprawiania z niedostępnymi dyskami lub z dyskami na tym samym urządzeniu fizycznym. Na przykład, jeśli straciłeś dwa dyski danych i masz zapasowy dysk do odzyskania tylko pierwszego, moÅŧesz zignorować drugi niedostępny dysk. Lub, jeśli chcesz odzyskać dysk w wolnym miejscu pozostawionym na juÅŧ uÅŧywanym dysku, wspÃŗÅ‚dzielącym to samo urządzenie fizyczne. Ta opcja moÅŧe być uÅŧywana tylko z \`fix\`. .TP .B \-N, \-\-force\-nocopy W \`sync\`, \`check\` i \`fix\`, wyłącza heurystykę wykrywania kopii. Bez tej opcji SnapRAID zakłada, Åŧe pliki o tych samych atrybutach, takich jak nazwa, rozmiar i znacznik czasu, są kopiami z tymi samymi danymi. Pozwala to na identyfikację skopiowanych lub przeniesionych plikÃŗw z jednego dysku na inny i ponowne wykorzystanie juÅŧ obliczonych informacji o haszu w celu wykrycia cichych błędÃŗw lub odzyskania brakujących plikÃŗw. W niektÃŗrych rzadkich przypadkach to zachowanie moÅŧe prowadzić do fałszywych alarmÃŗw lub spowolnienia procesu z powodu wielu weryfikacji hasza, a ta opcja pozwala rozwiązać takie problemy. Ta opcja moÅŧe być uÅŧywana tylko z \`sync\`, \`check\` i \`fix\`. .TP .B \-F, \-\-force\-full W \`sync\`, wymusza pełne ponowne obliczenie parzystości. Ta opcja moÅŧe być uÅŧywana, gdy dodajesz nowy poziom parzystości lub jeśli powrÃŗciłeś do starego pliku zawartości, uÅŧywając nowszych danych parzystości. Zamiast ponownego tworzenia parzystości od podstaw, pozwala to na ponowne wykorzystanie haszy obecnych w pliku zawartości do walidacji danych i utrzymania ochrony danych podczas procesu \`sync\` za pomocą istniejących danych parzystości. Ta opcja moÅŧe być uÅŧywana tylko z \`sync\`. .TP .B \-R, \-\-force\-realloc W \`sync\`, wymusza pełną realokację plikÃŗw i przebudowę parzystości. Ta opcja moÅŧe być uÅŧywana do całkowitej realokacji wszystkich plikÃŗw, usuwając fragmentację, jednocześnie ponownie wykorzystując hasze obecne w pliku zawartości do walidacji danych. Ta opcja moÅŧe być uÅŧywana tylko z \`sync\`. OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby jej nie uÅŧywać. NIE MASZ ochrony danych podczas operacji \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail ROZMIAR Działa jak \-R, \-\-force\-realloc, ale ogranicza się do określonej części końcowej (ostatnie ROZMIAR bajtÃŗw) kaÅŧdego pliku parzystości. Wymusza realokację (przeniesienie) wszelkich fragmentÃŗw/blokÃŗw plikÃŗw obecnie przechowywanych w tej sekcji końcowej, pozwalając na ich umieszczenie w dowolnym miejscu w pliku (plikach) parzystości, gdzie dostępne jest wolne miejsce (w tym w istniejących lukach). GÅ‚Ãŗwnym celem tej opcji jest zmniejszenie rozmiaru pliku parzystości na dysku. Jeśli realokacja pomyślnie wyczyści całą sekcję końcową (nie pozostaną Åŧadne bloki korzystające z niej), plik parzystości zostanie przycięty, odzyskując nieuÅŧywane miejsce na końcu. MoÅŧesz uÅŧyć mnoÅŧnikÃŗw takich jak K, M, G lub T (np. \-\-force\-realloc\-tail 1G). MoÅŧesz uÅŧyć locate \-t, \-\-tail, aby wcześniej poznać pliki, ktÃŗrych będzie to dotyczyć. OSTRZEÅģENIE! Ta opcja jest przeznaczona wyłącznie dla ekspertÃŗw i zdecydowanie zaleca się jej nie uÅŧywać. Podczas operacji \`sync\` pliki, ktÃŗrych to dotyczy, NIE mają ochrony danych. .TP .B \-l, \-\-log FILE Zapisuje szczegÃŗÅ‚owy log do określonego pliku. Jeśli ta opcja nie jest określona, nieoczekiwane błędy są drukowane na ekranie, potencjalnie prowadząc do nadmiernego wyjścia w przypadku wielu błędÃŗw. Gdy \-l, \-\-log jest określone, tylko krytyczne błędy, ktÃŗre powodują zatrzymanie SnapRAID, są drukowane na ekranie. Jeśli ścieÅŧka zaczyna się od \`>>\`, plik jest otwierany w trybie dołączania. Wystąpienia \`%D\` i \`%T\` w nazwie są zastępowane datą i czasem w formacie RRRRMMDD i GGMMSS. W plikach wsadowych Windows musisz podwoić znak \`%\`, np. result\-%%D.log. Aby uÅŧyć \`>>\`, musisz ujęć nazwę w cudzysÅ‚Ãŗw, np. \`\[dq]>>result.log\[dq]\`. Aby wyprowadzić log do standardowego wyjścia lub standardowego błędu, moÅŧesz uÅŧyć odpowiednio \`\[dq]>&1\[dq]\` i \`\[dq]>&2\[dq]\`. Opisy tagÃŗw logu znajdziesz w pliku snapraid_log.txt lub na stronie podręcznika. .TP .B \-L, \-\-error\-limit NUMBER Ustawia nowy limit błędÃŗw przed zatrzymaniem wykonania. Domyślnie SnapRAID zatrzymuje się, jeśli napotka więcej niÅŧ 100 błędÃŗw wejścia/wyjścia, co wskazuje, Åŧe dysk prawdopodobnie ulega awarii. Ta opcja dotyczy \`sync\` i \`scrub\`, ktÃŗre mogą kontynuować po pierwszym zestawie błędÃŗw dysku, aby sprÃŗbować ukończyć swoje operacje. Jednak \`check\` i \`fix\` zawsze zatrzymują się przy pierwszym błędzie. .TP .B \-S, \-\-start BLKSTART Zaczyna przetwarzanie od określonego numeru bloku. MoÅŧe to być przydatne do ponownej prÃŗby sprawdzenia lub naprawy określonych blokÃŗw w przypadku uszkodzonego dysku. Ta opcja jest przeznaczona gÅ‚Ãŗwnie do zaawansowanego ręcznego odzyskiwania. .TP .B \-B, \-\-count BLKCOUNT Przetwarza tylko określoną liczbę blokÃŗw. Ta opcja jest przeznaczona gÅ‚Ãŗwnie do zaawansowanego ręcznego odzyskiwania. .TP .B \-C, \-\-gen\-conf CONTENT Generuje atrapę pliku konfiguracyjnego z istniejącego pliku zawartości. Plik konfiguracyjny jest zapisywany na standardowe wyjście i nie nadpisuje istniejącego. Ten plik konfiguracyjny zawiera rÃŗwnieÅŧ informacje potrzebne do rekonstrukcji punktÃŗw montowania dyskÃŗw na wypadek utraty całego systemu. .TP .B \-v, \-\-verbose Wyświetla więcej informacji na ekranie. Jeśli określono raz, drukuje wykluczone pliki i dodatkowe statystyki. Ta opcja nie ma wpływu na pliki logÃŗw. .TP .B \-q, \-\-quiet Wyświetla mniej informacji na ekranie. Jeśli określono raz, usuwa pasek postępu; dwa razy, bieÅŧące operacje; trzy razy, komunikaty informacyjne; cztery razy, komunikaty statusu. Krytyczne błędy są zawsze drukowane na ekranie. Ta opcja nie ma wpływu na pliki logÃŗw. .TP .B \-H, \-\-help Wyświetla krÃŗtki ekran pomocy. .TP .B \-V, \-\-version Wyświetla wersję programu. .SH CONFIGURATION SnapRAID wymaga pliku konfiguracyjnego, aby wiedzieć, gdzie znajduje się Twoja macierz dyskÃŗw i gdzie przechowywać informacje o parzystości. .PP W systemie Unix uÅŧywa pliku \`/usr/local/etc/snapraid.conf\`, jeśli istnieje, w przeciwnym razie \`/etc/snapraid.conf\`. W systemie Windows uÅŧywa pliku \`snapraid.conf\` w tym samym katalogu co \`snapraid.exe\`. .PP Musi zawierać następujące opcje (uwzględniające wielkość liter): .SS parity FILE [,FILE] ... Definiuje pliki do uÅŧycia do przechowywania informacji o parzystości. Parzystość umoÅŧliwia ochronę przed awarią pojedynczego dysku, podobnie jak w RAID5. .PP MoÅŧesz określić wiele plikÃŗw, ktÃŗre muszą znajdować się na rÃŗÅŧnych dyskach. Gdy plik nie moÅŧe juÅŧ rosnąć, uÅŧywany jest następny. Całkowita dostępna przestrzeń musi być co najmniej tak duÅŧa jak największy dysk danych w macierzy. .PP MoÅŧesz dodać dodatkowe pliki parzystości pÃŗÅēniej, ale nie moÅŧesz ich zmieniać kolejności ani usuwać. .PP Trzymanie dyskÃŗw parzystości zarezerwowanych dla parzystości zapewnia, Åŧe nie ulegną fragmentacji, co poprawia wydajność. .PP W systemie Windows 256 MB jest pozostawione niewykorzystane na kaÅŧdym dysku, aby uniknąć ostrzeÅŧenia o pełnych dyskach. .PP Ta opcja jest obowiązkowa i moÅŧe być uÅŧywana tylko raz. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... Definiuje pliki do uÅŧycia do przechowywania dodatkowych informacji o parzystości. .PP Dla kaÅŧdego określonego poziomu parzystości włączany jest jeden dodatkowy poziom ochrony: .PD 0 .IP \(bu 2\-parity włącza podwÃŗjną parzystość RAID6. .IP \(bu 3\-parity włącza potrÃŗjną parzystość. .IP \(bu 4\-parity włącza poczwÃŗrną (cztery) parzystość. .IP \(bu 5\-parity włącza pięciokrotną (pięć) parzystość. .IP \(bu 6\-parity włącza sześciokrotną (sześć) parzystość. .PD .PP KaÅŧdy poziom parzystości wymaga obecności wszystkich poprzednich poziomÃŗw parzystości. .PP Obowiązują te same uwagi, co dla opcji \`parity\`. .PP Te opcje są opcjonalne i mogą być uÅŧywane tylko raz. .SS z\-parity FILE [,FILE] ... Definiuje alternatywny plik i format do przechowywania potrÃŗjnej parzystości. .PP Ta opcja jest alternatywą dla \`3\-parity\`, przeznaczoną gÅ‚Ãŗwnie dla procesorÃŗw niskiej klasy, takich jak ARM lub AMD Phenom, Athlon i Opteron, ktÃŗre nie obsługują zestawu instrukcji SSSE3. W takich przypadkach zapewnia lepszą wydajność. .PP Ten format jest podobny, ale szybszy niÅŧ ten uÅŧywany przez ZFS RAIDZ3. Podobnie jak ZFS, nie działa powyÅŧej potrÃŗjnej parzystości. .PP Podczas uÅŧywania \`3\-parity\` zostaniesz ostrzeÅŧony, jeśli zaleca się uÅŧycie formatu \`z\-parity\` w celu poprawy wydajności. .PP MoÅŧliwa jest konwersja z jednego formatu na inny poprzez dostosowanie pliku konfiguracyjnego z poÅŧądanym plikiem z\-parity lub 3\-parity i uÅŧycie \`fix\` do jego ponownego utworzenia. .SS content FILE Definiuje plik do uÅŧycia do przechowywania listy i sum kontrolnych wszystkich plikÃŗw obecnych w Twojej macierzy dyskÃŗw. .PP MoÅŧe być umieszczony na dysku uÅŧywanym do danych, parzystości lub kaÅŧdym innym dostępnym dysku. Jeśli uÅŧyjesz dysku danych, ten plik jest automatycznie wykluczony z procesu \`sync\`. .PP Ta opcja jest obowiązkowa i moÅŧe być uÅŧywana wielokrotnie do zapisania wielu kopii tego samego pliku. .PP Musisz przechowywać co najmniej jedną kopię dla kaÅŧdego uÅŧywanego dysku parzystości plus jeden. UÅŧywanie dodatkowych kopii nie szkodzi. .SS data NAME DIR Definiuje nazwę i punkt montowania dyskÃŗw danych w macierzy. NAME słuÅŧy do identyfikacji dysku i musi być unikalna. DIR to punkt montowania dysku w systemie plikÃŗw. .PP MoÅŧesz zmieniać punkt montowania w razie potrzeby, o ile zachowasz stałą nazwę NAME. .PP Powinieneś uÅŧyć jednej opcji dla kaÅŧdego dysku danych w macierzy. .PP MoÅŧesz pÃŗÅēniej zmienić nazwę dysku, zmieniając bezpośrednio nazwę NAME w pliku konfiguracyjnym, a następnie uruchamiając polecenie \`sync\`. W przypadku zmiany nazwy, skojarzenie odbywa się za pomocą zapisanego UUID dyskÃŗw. .SS extra NAME DIR Definiuje nazwę i punkt montowania dodatkowych dyskÃŗw do monitorowania za pomocą poleceń \`smart\` oraz \`probe\`. .PP Jest to przydatne do monitorowania dyskÃŗw, ktÃŗre nie są częścią macierzy, ale są wymagane do funkcjonowania systemu, takich jak dysk rozruchowy. .PP NaleÅŧy zauwaÅŧyć, Åŧe polecenia \`up\` i \`down\` nie mają wpływu na takie dyski, poniewaÅŧ oczekuje się, Åŧe będą one zawsze w ruchu. .SS nohidden Wyklucza wszystkie ukryte pliki i katalogi. W systemie Unix ukryte pliki to te zaczynające się od \`.\`. W systemie Windows są to te z atrybutem ukrycia. .SS exclude/include PATTERN Definiuje wzorce plikÃŗw lub katalogÃŗw do wykluczenia lub włączenia do procesu synchronizacji. Wszystkie wzorce są przetwarzane w określonej kolejności. .PP Jeśli pierwszy pasujący wzorzec jest \`exclude\`, plik jest wykluczony. Jeśli jest to \`include\`, plik jest włączony. Jeśli Åŧaden wzorzec nie pasuje, plik jest wykluczony, jeśli ostatni określony wzorzec to \`include\`, lub włączony, jeśli ostatni określony wzorzec to \`exclude\`. .PP Zobacz sekcję PATTERN, aby uzyskać więcej szczegÃŗÅ‚Ãŗw na temat specyfikacji wzorcÃŗw. .PP Ta opcja moÅŧe być uÅŧywana wielokrotnie. .SS blocksize SIZE_IN_KIBIBYTES Definiuje podstawowy rozmiar bloku w kibibajtach dla parzystości. Jeden kibibajt to 1024 bajty. .PP Domyślny rozmiar bloku to 256, co powinno działać w większości przypadkÃŗw. .PP OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, będziesz musiał ponownie utworzyć całą parzystość! .PP Powodem uÅŧycia innego rozmiaru bloku jest posiadanie wielu małych plikÃŗw, rzędu milionÃŗw. .PP Dla kaÅŧdego pliku, nawet jeśli ma tylko kilka bajtÃŗw, alokowany jest cały blok parzystości, a przy wielu plikach moÅŧe to skutkować znaczną nieuÅŧywaną przestrzenią parzystości. Kiedy całkowicie wypełnisz dysk parzystości, nie moÅŧesz dodawać więcej plikÃŗw do dyskÃŗw danych. Jednak marnowana parzystość nie gromadzi się na dyskach danych. Marnowane miejsce wynikające z duÅŧej liczby plikÃŗw na dysku danych ogranicza tylko ilość danych na tym dysku danych, a nie na innych. .PP Jako przybliÅŧenie, moÅŧesz załoÅŧyć, Åŧe połowa rozmiaru bloku jest marnowana dla kaÅŧdego pliku. Na przykład, z 100 000 plikÃŗw i rozmiarem bloku 256 KiB, zmarnujesz 12,8 GB parzystości, co moÅŧe skutkować 12,8 GB mniejszą dostępną przestrzenią na dysku danych. .PP MoÅŧesz sprawdzić ilość zmarnowanego miejsca na kaÅŧdym dysku za pomocą \`status\`. Jest to ilość miejsca, ktÃŗrą musisz pozostawić wolną na dyskach danych lub uÅŧyć dla plikÃŗw nie włączonych do macierzy. Jeśli ta wartość jest ujemna, oznacza to, Åŧe jesteś blisko wypełnienia parzystości i reprezentuje to przestrzeń, ktÃŗrą nadal moÅŧesz zmarnować. .PP Aby uniknąć tego problemu, moÅŧesz uÅŧyć większej partycji dla parzystości. Na przykład, jeśli partycja parzystości jest o 12,8 GB większa niÅŧ dyski danych, masz wystarczająco duÅŧo dodatkowego miejsca, aby obsłuÅŧyć do 100 000 plikÃŗw na kaÅŧdym dysku danych bez marnowania miejsca. .PP Sztuczką, aby uzyskać większą partycję parzystości w systemie Linux, jest sformatowanie jej za pomocą polecenia: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Daje to około 1,5% dodatkowego miejsca, około 60 GB dla dysku 4 TB, co pozwala na około 460 000 plikÃŗw na kaÅŧdym dysku danych bez marnowania miejsca. .SS hashsize SIZE_IN_BYTES Definiuje rozmiar hasza w bajtach dla zapisanych blokÃŗw. .PP Domyślny rozmiar hasza to 16 bajtÃŗw (128 bitÃŗw), co powinno działać w większości przypadkÃŗw. .PP OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, będziesz musiał ponownie utworzyć całą parzystość! .PP Powodem uÅŧycia innego rozmiaru hasza jest to, Åŧe TwÃŗj system ma ograniczoną pamięć. Z reguły, SnapRAID zwykle wymaga 1 GiB pamięci RAM na kaÅŧde 16 TB danych w macierzy. .PP Konkretnie, aby przechowywać hasze danych, SnapRAID wymaga około TS*(1+HS)/BS bajtÃŗw pamięci RAM, gdzie TS to całkowity rozmiar w bajtach Twojej macierzy dyskÃŗw, BS to rozmiar bloku w bajtach, a HS to rozmiar hasza w bajtach. .PP Na przykład, z 8 dyskami po 4 TB, rozmiarem bloku 256 KiB (1 KiB = 1024 bajty) i rozmiarem hasza 16, otrzymujesz: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB .PD 0 .PD .PP Przełączając się na rozmiar hasza 8, otrzymujesz: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB .PD 0 .PD .PP Przełączając się na rozmiar bloku 512, otrzymujesz: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB .PD 0 .PD .PP Przełączając się zarÃŗwno na rozmiar hasza 8, jak i rozmiar bloku 512, otrzymujesz: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES Automatycznie zapisuje stan podczas synchronizacji lub sprawdzania po przetworzeniu określonej ilości GB. Ta opcja jest przydatna, aby uniknąć ponownego uruchamiania długich poleceń \`sync\` od zera, jeśli zostaną przerwane przez awarię maszyny lub inne zdarzenie. .SS temp_limit TEMPERATURE_CELSIUS Ustawia maksymalną dozwoloną temperaturę dysku w stopniach Celsjusza. Po określeniu, SnapRAID okresowo sprawdza temperaturę wszystkich dyskÃŗw za pomocą narzędzia smartctl. Aktualne temperatury dyskÃŗw są wyświetlane podczas działania SnapRAID. Jeśli ktÃŗrykolwiek dysk przekroczy ten limit, wszystkie operacje zostają zatrzymane, a dyski są zatrzymywane (przechodzą w stan gotowości) na czas zdefiniowany przez opcję \`temp_sleep\`. Po okresie uśpienia, operacje są wznawiane, potencjalnie ponownie zatrzymując się, jeśli limit temperatury zostanie ponownie osiągnięty. .PP Podczas działania SnapRAID analizuje rÃŗwnieÅŧ krzywą nagrzewania kaÅŧdego dysku i szacuje długoterminową stałą temperaturę, ktÃŗrą mają osiągnąć, jeśli aktywność będzie kontynuowana. Oszacowanie jest wykonywane tylko po czterokrotnym wzroście temperatury dysku, co zapewnia, Åŧe dostępnych jest wystarczająco duÅŧo punktÃŗw danych do ustalenia wiarygodnego trendu. Ta przewidywana stała temperatura jest pokazywana w nawiasach obok aktualnej wartości i pomaga ocenić, czy chłodzenie systemu jest odpowiednie. Ta szacowana temperatura ma charakter wyłącznie informacyjny i nie ma wpływu na zachowanie SnapRAID. Działania programu opierają się wyłącznie na faktycznie zmierzonych temperaturach dyskÃŗw. .PP Aby wykonać tę analizę, SnapRAID potrzebuje odniesienia dla temperatury systemu. Najpierw prÃŗbuje odczytać ją z dostępnych czujnikÃŗw sprzętowych. Jeśli nie moÅŧna uzyskać dostępu do Åŧadnego czujnika systemu, jako awaryjne odniesienie wykorzystuje najniÅŧszą temperaturę dysku zmierzoną na początku uruchomienia. .PP Normalnie SnapRAID pokazuje tylko temperaturę najgorętszego dysku. Aby wyświetlić temperaturę wszystkich dyskÃŗw, uÅŧyj opcji \-A lub \-\-stats. .SS temp_sleep TIME_IN_MINUTES Ustawia czas gotowości, w minutach, po osiągnięciu limitu temperatury. W tym okresie dyski pozostają zatrzymane. Domyślnie jest to 5 minut. .SS pool DIR Definiuje katalog puli, w ktÃŗrym tworzony jest wirtualny widok macierzy dyskÃŗw za pomocą polecenia \`pool\`. .PP Katalog musi juÅŧ istnieć. .SS share UNC_DIR Definiuje ścieÅŧkę UNC Windows wymaganą do zdalnego dostępu do dyskÃŗw. .PP Jeśli ta opcja jest określona, dowiązania symboliczne utworzone w katalogu puli uÅŧywają tej ścieÅŧki UNC do dostępu do dyskÃŗw. Bez tej opcji generowane dowiązania symboliczne uÅŧywają tylko ścieÅŧek lokalnych, co nie pozwala na udostępnianie katalogu puli w sieci. .PP Dowiązania symboliczne są tworzone przy uÅŧyciu określonej ścieÅŧki UNC, dodając nazwę dysku określoną w opcji \`data\`, a na końcu dodając katalog i nazwę pliku. .PP Ta opcja jest wymagana tylko dla systemu Windows. .SS smartctl DISK/PARITY OPTIONS... Definiuje niestandardowe opcje smartctl do uzyskania atrybutÃŗw SMART dla kaÅŧdego dysku. MoÅŧe to być wymagane dla kontrolerÃŗw RAID i niektÃŗrych dyskÃŗw USB, ktÃŗrych nie moÅŧna wykryć automatycznie. Symbol zastępczy %s jest zastępowany nazwą urządzenia, ale jest opcjonalny dla stałych urządzeń, takich jak kontrolery RAID. .PP DISK to ta sama nazwa dysku określona w opcji \`data\`. PARITY to jedna z nazw parzystości: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` lub \`z\-parity\`. .PP W określonych OPCJACH ciąg \`%s\` jest zastępowany nazwą urządzenia. W przypadku kontrolerÃŗw RAID, urządzenie jest prawdopodobnie stałe i moÅŧe nie być konieczne uÅŧycie \`%s\`. .PP Zapoznaj się z dokumentacją smartmontools, aby uzyskać moÅŧliwe opcje: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP Na przykład: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignoruje określony atrybut SMART podczas obliczania prawdopodobieństwa awarii dysku. Ta opcja jest przydatna, jeśli dysk zgłasza nietypowe lub wprowadzające w błąd wartości dla określonego atrybutu. .PP DISK to ta sama nazwa dysku określona w opcji \`data\`. PARITY to jedna z nazw parzystości: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` lub \`z\-parity\`. Specjalna wartość * moÅŧe być uÅŧyta do zignorowania atrybutu na wszystkich dyskach. .PP Na przykład, aby zignorować atrybut \`Current Pending Sector Count\` na wszystkich dyskach: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Aby zignorować go tylko na pierwszym dysku parzystości: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples Przykład typowej konfiguracji dla systemu Unix: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Przykład typowej konfiguracji dla systemu Windows: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN Wzorce zapewniają elastyczny sposÃŗb filtrowania plikÃŗw do uwzględnienia lub wykluczenia. UÅŧywając znakÃŗw globbingowych, moÅŧna zdefiniować reguły, ktÃŗre pasują do określonych nazw plikÃŗw lub całych struktur katalogÃŗw bez ręcznego wymieniania kaÅŧdej ścieÅŧki. .PP Znak zapytania \`?\` dopasowuje dowolny pojedynczy znak z wyjątkiem separatora katalogÃŗw. Dzięki temu jest przydatny do dopasowywania nazw plikÃŗw ze zmiennymi znakami, przy jednoczesnym ograniczeniu wzorca do jednego poziomu katalogu. .PP Pojedyncza gwiazdka \`*\` dopasowuje dowolną sekwencję znakÃŗw, ale podobnie jak znak zapytania, nigdy nie przekracza granic katalogÃŗw. Zatrzymuje się na ukośniku, co czyni ją odpowiednią do dopasowywania w obrębie jednego składnika ścieÅŧki. Jest to standardowe zachowanie symboli wieloznacznych znane z globbingu powłoki (shell). .PP PodwÃŗjna gwiazdka \`**\` jest potęÅŧniejsza, dopasowuje dowolną sekwencję znakÃŗw, w tym separatory katalogÃŗw. Pozwala to wzorcom dopasowywać się na wielu poziomach katalogÃŗw. Gdy \`**\` pojawia się bezpośrednio wewnątrz wzorca, moÅŧe dopasować zero lub więcej znakÃŗw, w tym ukośniki między otaczającym tekstem dosłownym. .PP NajwaÅŧniejszym zastosowaniem \`**\` jest specjalna forma \`/**/\`. Dopasowuje ona zero lub więcej pełnych poziomÃŗw katalogÃŗw, umoÅŧliwiając dopasowanie plikÃŗw na dowolnej głębokości w drzewie katalogÃŗw bez znajomości dokładnej struktury ścieÅŧki. Na przykład wzorzec \`src/**/main.js\` pasuje do \`src/main.js\` (pomijając zero katalogÃŗw), \`src/ui/main.js\` (pomijając jeden katalog) oraz \`src/ui/components/main.js\` (pomijając dwa katalogi). .PP Klasy znakÃŗw uÅŧywające nawiasÃŗw kwadratowych \`[]\` dopasowują pojedynczy znak z określonego zestawu lub zakresu. Podobnie jak inne wzorce pojedynczych znakÃŗw, nie pasują one do separatorÃŗw katalogÃŗw. Klasy obsługują zakresy i negację za pomocą wykrzyknika. .PP Podstawową rÃŗÅŧnicą, o ktÃŗrej naleÅŧy pamiętać, jest to, Åŧe \`*\`, \`?\` i klasy znakÃŗw wszystkie respektują granice katalogÃŗw i dopasowują się tylko w obrębie jednego składnika ścieÅŧki, podczas gdy \`**\` jest jedynym wzorcem, ktÃŗry moÅŧe dopasowywać się poprzez separatory katalogÃŗw. .PP Istnieją cztery rÃŗÅŧne typy wzorcÃŗw: .TP .B FILE Wybiera dowolny plik o nazwie FILE. Ten wzorzec dotyczy tylko plikÃŗw, a nie katalogÃŗw. .TP .B DIR/ Wybiera dowolny katalog o nazwie DIR i wszystko, co się w nim znajduje. Ten wzorzec dotyczy tylko katalogÃŗw, a nie plikÃŗw. .TP .B /PATH/FILE Wybiera dokładnie określoną ścieÅŧkę pliku. Ten wzorzec dotyczy tylko plikÃŗw, a nie katalogÃŗw. .TP .B /PATH/DIR/ Wybiera dokładnie określoną ścieÅŧkę katalogu i wszystko, co się w nim znajduje. Ten wzorzec dotyczy tylko katalogÃŗw, a nie plikÃŗw. .PP Gdy określisz ścieÅŧkę bezwzględną zaczynającą się od /, jest ona stosowana w katalogu gÅ‚Ãŗwnym macierzy, a nie w katalogu gÅ‚Ãŗwnym lokalnego systemu plikÃŗw. .PP W systemie Windows moÅŧesz uÅŧyć ukośnika odwrotnego \\ zamiast ukośnika /. Katalogi systemowe Windows, połączenia, punkty montowania i inne specjalne katalogi Windows są traktowane jako pliki, co oznacza, Åŧe aby je wykluczyć, musisz uÅŧyć reguły pliku, a nie katalogu. .PP Jeśli nazwa pliku zawiera znak \`*\`, \`?\`, \`[\`, lub \`]\`, musisz go uciec, aby uniknąć interpretacji jako znaku globbing. W systemie Unix znakiem ucieczki jest \`\\\`; w systemie Windows jest to \`^\`. Gdy wzorzec znajduje się w wierszu poleceń, musisz podwoić znak ucieczki, aby uniknąć interpretacji przez powłokę poleceń. .PP W pliku konfiguracyjnym moÅŧesz uÅŧyć rÃŗÅŧnych strategii do filtrowania plikÃŗw do przetworzenia. Najprostszym podejściem jest uÅŧycie tylko reguł \`exclude\`, aby usunąć wszystkie pliki i katalogi, ktÃŗrych nie chcesz przetwarzać. Na przykład: .PP .RS 4 # Wyklucza dowolny plik o nazwie \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Wyklucza katalog gÅ‚Ãŗwny \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Wyklucza dowolny podkatalog o nazwie \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP Odwrotnym podejściem jest zdefiniowanie tylko plikÃŗw, ktÃŗre chcesz przetwarzać, uÅŧywając tylko reguł \`include\`. Na przykład: .PP .RS 4 # Włącza tylko niektÃŗre katalogi .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Ostatecznym podejściem jest mieszanie reguł \`exclude\` i \`include\`. W tym przypadku kolejność reguł jest waÅŧna. Wcześniejsze reguły mają pierwszeństwo przed pÃŗÅēniejszymi. Aby uprościć, moÅŧesz najpierw wymienić wszystkie reguły \`exclude\`, a następnie wszystkie reguły \`include\`. Na przykład: .PP .RS 4 # Wyklucza dowolny plik o nazwie \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Wyklucza dowolny podkatalog o nazwie \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Włącza tylko niektÃŗre katalogi .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP W wierszu poleceń, uÅŧywając opcji \-f, moÅŧesz uÅŧyć tylko wzorcÃŗw \`include\`. Na przykład: .PP .RS 4 # Sprawdza tylko pliki .mp3. .PD 0 .PP .PD # W systemie Unix uÅŧyj cudzysłowÃŗw, aby uniknąć rozszerzenia globbing przez powłokę. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP W systemie Unix, uÅŧywając znakÃŗw globbing w wierszu poleceń, musisz je cytować, aby zapobiec ich rozszerzeniu przez powłokę. .SH IGNORE FILE OprÃŗcz reguł globalnych w pliku konfiguracyjnym, moÅŧesz umieścić pliki \`.snapraidignore\` w dowolnym katalogu w macierzy, aby zdefiniować zdecentralizowane reguły wykluczania. .PP Reguły zdefiniowane w \`.snapraidignore\` są stosowane po regułach w pliku konfiguracyjnym. Oznacza to, Åŧe mają one wyÅŧszy priorytet i mogą być uÅŧywane do wykluczania plikÃŗw, ktÃŗre zostały wcześniej uwzględnione przez konfigurację globalną. Skutecznie, jeśli reguła lokalna pasuje, plik jest wykluczany bez względu na globalne ustawienia uwzględniania. .PP Logika wzorcÃŗw w \`.snapraidignore\` odzwierciedla konfigurację globalną, ale zakotwicza wzorce w katalogu, w ktÃŗrym znajduje się plik: .TP .B FILE Wybiera dowolny plik o nazwie FILE w tym katalogu lub poniÅŧej. Podlega to tym samym zasadom dopasowywania (globbing) co wzorzec globalny. .TP .B DIR/ Wybiera dowolny katalog o nazwie DIR i wszystko w jego wnętrzu, znajdujący się w tym katalogu lub poniÅŧej. .TP .B /PATH/FILE Wybiera dokładnie określony plik względem lokalizacji pliku \`.snapraidignore\`. .TP .B /PATH/DIR/ Wybiera dokładnie określony katalog i wszystko w jego wnętrzu, względem lokalizacji pliku \`.snapraidignore\`. .PP W przeciwieństwie do konfiguracji globalnej, pliki \`.snapraidignore\` obsługują tylko reguły wykluczania; nie moÅŧna uÅŧywać wzorcÃŗw \`include\` ani negacji (!). .PP Na przykład, jeśli masz \`.snapraidignore\` w \`/mnt/disk1/projects/\`: .PP .RS 4 # Wyklucza TYLKO /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Wyklucza kaÅŧdy katalog o nazwie \`build\` wewnątrz projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Wyklucza kaÅŧdy plik .tmp wewnątrz projects/ lub jego podfolderach .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID przechowuje listę i sumy kontrolne Twoich plikÃŗw w pliku zawartości. .PP Jest to plik binarny, ktÃŗry zawiera listę wszystkich plikÃŗw obecnych w Twojej macierzy dyskÃŗw, wraz ze wszystkimi sumami kontrolnymi w celu weryfikacji ich integralności. .PP Ten plik jest odczytywany i zapisywany przez polecenia \`sync\` i \`scrub\` oraz odczytywany przez polecenia \`fix\`, \`check\` i \`status\`. .SH PARITY SnapRAID przechowuje informacje o parzystości Twojej macierzy w plikach parzystości. .PP Są to pliki binarne zawierające obliczoną parzystość wszystkich blokÃŗw zdefiniowanych w pliku \`content\`. .PP Pliki te są odczytywane i zapisywane przez polecenia \`sync\` i \`fix\` oraz tylko odczytywane przez polecenia \`scrub\` i \`check\`. .SH ENCODING SnapRAID w systemie Unix ignoruje wszelkie kodowanie. Odczytuje i przechowuje nazwy plikÃŗw z tym samym kodowaniem uÅŧywanym przez system plikÃŗw. .PP W systemie Windows wszystkie nazwy odczytane z systemu plikÃŗw są konwertowane i przetwarzane w formacie UTF\-8. .PP Aby nazwy plikÃŗw były poprawnie drukowane, musisz ustawić konsolę Windows na tryb UTF\-8 za pomocą polecenia \`chcp 65001\` i uÅŧyć czcionki TrueType, takiej jak \`Lucida Console\`, jako czcionki konsoli. Dotyczy to tylko drukowanych nazw plikÃŗw; jeśli przekierujesz wyjście konsoli do pliku, wynikowy plik jest zawsze w formacie UTF\-8. .SH COPYRIGHT Ten plik jest chroniony prawem autorskim (C) 2025 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-pl.d000066400000000000000000002034161522717156100164110ustar00rootroot00000000000000Name{number} snapraid - Kopia zapasowa SnapRAID dla macierzy dyskowych Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAID to program do tworzenia kopii zapasowych przeznaczony dla macierzy dyskowych, przechowujący informacje parzystości do odzyskiwania danych w przypadku awarii do sześciu dyskÃŗw. Przeznaczony gÅ‚Ãŗwnie dla domowych centrÃŗw multimedialnych z duÅŧymi, rzadko zmieniającymi się plikami, SnapRAID oferuje kilka funkcji: * MoÅŧesz uÅŧywać dyskÃŗw juÅŧ wypełnionych plikami bez konieczności ich ponownego formatowania, uzyskując do nich dostęp jak zwykle. * Wszystkie Twoje dane są haszowane, aby zapewnić integralność danych i zapobiec cichej korupcji. * Gdy liczba uszkodzonych dyskÃŗw przekracza liczbę parzystości, utrata danych ogranicza się do dotkniętych dyskÃŗw; dane na innych dyskach pozostają dostępne. * Jeśli przypadkowo usuniesz pliki na dysku, moÅŧliwe jest ich odzyskanie. * Dyski mogą mieć rÃŗÅŧne rozmiary. * MoÅŧesz dodawać dyski w dowolnym momencie. * SnapRAID nie blokuje Twoich danych; moÅŧesz przestać go uÅŧywać w dowolnym momencie bez ponownego formatowania ani przenoszenia danych. * Aby uzyskać dostęp do pliku, wystarczy, Åŧe zakręci się tylko jeden dysk, co oszczędza energię i zmniejsza hałas. Więcej informacji moÅŧna znaleÅēć na oficjalnej stronie SnapRAID: :https://www.snapraid.it/ Limitations SnapRAID to hybryda programu RAID i programu do tworzenia kopii zapasowych, ktÃŗrej celem jest połączenie najlepszych zalet obu. Ma jednak pewne ograniczenia, ktÃŗre naleÅŧy wziąć pod uwagę przed jego uÅŧyciem. GÅ‚Ãŗwnym ograniczeniem jest to, Åŧe jeśli dysk ulegnie awarii, a Ty nie wykonałeś niedawno synchronizacji, moÅŧesz nie być w stanie w pełni odzyskać danych. Dokładniej, moÅŧesz nie być w stanie odzyskać danych o wielkości zmienionych lub usuniętych plikÃŗw od czasu ostatniej operacji synchronizacji. Dzieje się tak, nawet jeśli zmienione lub usunięte pliki nie znajdują się na uszkodzonym dysku. Dlatego SnapRAID jest lepiej dostosowany do danych, ktÃŗre rzadko się zmieniają. Z drugiej strony, nowo dodane pliki nie uniemoÅŧliwiają odzyskania juÅŧ istniejących plikÃŗw. Stracisz tylko ostatnio dodane pliki, jeśli znajdują się one na uszkodzonym dysku. Inne ograniczenia SnapRAID to: * W SnapRAID nadal masz oddzielne systemy plikÃŗw dla kaÅŧdego dysku. W RAID otrzymujesz jeden duÅŧy system plikÃŗw. * SnapRAID nie rozdziela danych. W RAID uzyskujesz wzrost prędkości dzięki rozdzielaniu. * SnapRAID nie obsługuje odzyskiwania w czasie rzeczywistym. W RAID nie musisz przerywać pracy, gdy dysk ulegnie awarii. * SnapRAID moÅŧe odzyskać dane tylko z ograniczonej liczby awarii dyskÃŗw. W przypadku kopii zapasowej moÅŧesz odzyskać dane po całkowitej awarii całej macierzy dyskÃŗw. * Zapisywane są tylko nazwy plikÃŗw, znaczniki czasu, dowiązania symboliczne i dowiązania twarde. Uprawnienia, właścicielstwo i rozszerzone atrybuty nie są zapisywane. Getting Started Aby uÅŧyć SnapRAID, musisz najpierw wybrać jeden dysk w swojej macierzy dyskÃŗw, ktÃŗry zostanie przeznaczony na informacje o `parzystości`. Z jednym dyskiem na parzystość będziesz w stanie odzyskać dane po awarii pojedynczego dysku, podobnie jak w RAID5. Jeśli chcesz odzyskać dane po większej liczbie awarii dyskÃŗw, podobnie jak w RAID6, musisz zarezerwować dodatkowe dyski na parzystość. KaÅŧdy dodatkowy dysk parzystości umoÅŧliwia odzyskanie danych po jeszcze jednej awarii dysku. Jako dyski parzystości musisz wybrać największe dyski w macierzy, poniewaÅŧ informacje o parzystości mogą urosnąć do rozmiaru największego dysku danych w macierzy. Dyski te będą przeznaczone do przechowywania plikÃŗw `parzystości`. Nie powinieneś na nich przechowywać swoich danych. Następnie musisz zdefiniować dyski `danych`, ktÃŗre chcesz chronić za pomocą SnapRAID. Ochrona jest bardziej skuteczna, jeśli te dyski zawierają dane, ktÃŗre rzadko się zmieniają. Z tego powodu lepiej jest NIE włączać dysku C:\ w systemie Windows ani katalogÃŗw /home, /var i /tmp w systemie Unix. Lista plikÃŗw jest zapisywana w plikach `zawartości`, zwykle przechowywanych na dyskach danych, parzystości lub rozruchowych. Plik ten zawiera szczegÃŗÅ‚y Twojej kopii zapasowej, w tym wszystkie sumy kontrolne w celu weryfikacji jej integralności. Plik `zawartości` jest przechowywany w wielu kopiach, a kaÅŧda kopia musi znajdować się na innym dysku, aby zapewnić, Åŧe nawet w przypadku wielu awarii dyskÃŗw, przynajmniej jedna kopia jest dostępna. Na przykład, zaÅ‚ÃŗÅŧmy, Åŧe interesuje Cię tylko jeden poziom parzystości i Twoje dyski znajdują się w: :/mnt/diskp <- wybrany dysk dla parzystości :/mnt/disk1 <- pierwszy dysk do ochrony :/mnt/disk2 <- drugi dysk do ochrony :/mnt/disk3 <- trzeci dysk do ochrony Musisz utworzyć plik konfiguracyjny /etc/snapraid.conf z następującymi opcjami: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Jeśli uÅŧywasz systemu Windows, powinieneś uÅŧyć formatu ścieÅŧek Windows, z literami dyskÃŗw i ukośnikami odwrotnymi zamiast ukośnikÃŗw: :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Jeśli masz wiele dyskÃŗw i zabrakło Ci liter dyskÃŗw, moÅŧesz zamontować dyski bezpośrednio w podfolderach. Zobacz: :https://www.google.com/search?q=Windows+mount+point W tym momencie jesteś gotowy do uruchomienia polecenia `sync`, aby zbudować informacje o parzystości. :snapraid sync Ten proces moÅŧe zająć kilka godzin za pierwszym razem, w zaleÅŧności od rozmiaru danych juÅŧ obecnych na dyskach. Jeśli dyski są puste, proces jest natychmiastowy. MoÅŧesz go zatrzymać w dowolnym momencie, naciskając Ctrl+C, a przy następnym uruchomieniu wznowi się w miejscu, w ktÃŗrym został przerwany. Kiedy to polecenie się zakończy, Twoje dane są BEZPIECZNE. Teraz moÅŧesz zacząć uÅŧywać swojej macierzy, jak chcesz, i okresowo aktualizować informacje o parzystości, uruchamiając polecenie `sync`. Scrubbing Aby okresowo sprawdzać dane i parzystość pod kątem błędÃŗw, moÅŧesz uruchomić polecenie `scrub`. :snapraid scrub To polecenie porÃŗwnuje dane w Twojej macierzy z haszem obliczonym podczas polecenia `sync`, aby zweryfikować integralność. KaÅŧde uruchomienie polecenia sprawdza około 8% macierzy, z wyłączeniem danych juÅŧ sprawdzonych w ciągu poprzednich 10 dni. MoÅŧesz uÅŧyć opcji -p, --plan, aby określić inną ilość, oraz opcji -o, --older-than, aby określić inny wiek w dniach. Na przykład, aby sprawdzić 5% macierzy dla blokÃŗw starszych niÅŧ 20 dni, uÅŧyj: :snapraid -p 5 -o 20 scrub Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, odpowiednie bloki zostaną oznaczone jako złe w pliku `content` i wymienione w poleceniu `status`. :snapraid status Aby je naprawić, moÅŧesz uÅŧyć polecenia `fix`, filtrując złe bloki za pomocą opcji -e, --filter-error: :snapraid -e fix Przy następnym `scrub`, błędy znikną z raportu `status`, jeśli zostały faktycznie naprawione. Aby przyspieszyć, moÅŧesz uÅŧyć -p bad, aby sprawdzić tylko bloki oznaczone jako złe. :snapraid -p bad scrub Uruchomienie `scrub` na niezsynchronizowanej macierzy moÅŧe zgłosić błędy spowodowane usuniętymi lub zmodyfikowanymi plikami. Błędy te są zgłaszane w wyniku `scrub`, ale powiązane bloki nie są oznaczane jako złe. Pooling Uwaga: Funkcja łączenia w pulę opisana poniÅŧej została zastąpiona przez narzędzie mergerfs, ktÃŗre jest obecnie zalecaną opcją dla uÅŧytkownikÃŗw Linuksa w społeczności SnapRAID. Mergefs zapewnia bardziej elastyczny i wydajny sposÃŗb łączenia wielu dyskÃŗw w jeden ujednolicony punkt montowania, umoÅŧliwiając bezproblemowy dostęp do plikÃŗw w całej macierzy bez polegania na dowiązaniach symbolicznych. Dobrze integruje się z SnapRAID w celu ochrony parzystości i jest powszechnie uÅŧywane w konfiguracjach takich jak OpenMediaVault (OMV) lub niestandardowe konfiguracje NAS. Aby wszystkie pliki w Twojej macierzy były widoczne w tym samym drzewie katalogÃŗw, moÅŧesz włączyć funkcję `pooling`. Tworzy ona wirtualny, tylko do odczytu, widok wszystkich plikÃŗw w Twojej macierzy za pomocą dowiązań symbolicznych. Katalog `pooling` moÅŧesz skonfigurować w pliku konfiguracyjnym za pomocą: :pool /pool lub, jeśli uÅŧywasz systemu Windows, za pomocą: :pool C:\pool a następnie uruchom polecenie `pool`, aby utworzyć lub zaktualizować wirtualny widok. :snapraid pool Jeśli uÅŧywasz platformy Unix i chcesz udostępnić ten katalog przez sieć maszynom Windows lub Unix, powinieneś dodać następujące opcje do swojego /etc/samba/smb.conf: :# W sekcji globalnej smb.conf :unix extensions = no :# W sekcji udziału smb.conf :[pool] :comment = Pula :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes W systemie Windows udostępnianie dowiązań symbolicznych przez sieć wymaga od klientÃŗw zdalnego ich rozwiązywania. Aby to umoÅŧliwić, oprÃŗcz udostępnienia katalogu puli, musisz rÃŗwnieÅŧ udostępnić wszystkie dyski niezaleÅŧnie, uÅŧywając nazw dyskÃŗw zdefiniowanych w pliku konfiguracyjnym jako punkty udostępniania. Musisz rÃŗwnieÅŧ określić w opcji `share` w pliku konfiguracyjnym ścieÅŧkę UNC Windows, ktÃŗrej klienci zdalni muszą uÅŧyć, aby uzyskać dostęp do tych udostępnionych dyskÃŗw. Na przykład, działając z serwera o nazwie `darkstar`, moÅŧesz uÅŧyć opcji: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar i udostępnić w sieci następujące katalogi: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array aby umoÅŧliwić zdalnym klientom dostęp do wszystkich plikÃŗw pod adresem \\darkstar\pool. MoÅŧesz rÃŗwnieÅŧ potrzebować skonfigurować klientÃŗw zdalnych, aby umoÅŧliwić dostęp do zdalnych dowiązań symbolicznych za pomocą polecenia: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAID działa bardziej jak program do tworzenia kopii zapasowych niÅŧ system RAID i moÅŧe być uÅŧyty do przywrÃŗcenia lub odzyskania usuniętych plikÃŗw do ich poprzedniego stanu za pomocą opcji -f, --filter: :snapraid fix -f FILE lub dla katalogu: :snapraid fix -f DIR/ MoÅŧesz go rÃŗwnieÅŧ uÅŧyć do odzyskania tylko przypadkowo usuniętych plikÃŗw wewnątrz katalogu za pomocą opcji -m, --filter-missing, ktÃŗra przywraca tylko brakujące pliki, pozostawiając wszystkie inne nienaruszone. :snapraid fix -m -f DIR/ Lub aby odzyskać wszystkie usunięte pliki na wszystkich dyskach za pomocą: :snapraid fix -m Recovering Najgorsze się wydarzyło i straciłeś jeden lub więcej dyskÃŗw! NIE PANIKUJ! Będziesz w stanie je odzyskać! Pierwszą rzeczą, ktÃŗrą musisz zrobić, to unikać dalszych zmian w Twojej macierzy dyskÃŗw. Wyłącz wszelkie zdalne połączenia z nią i wszelkie zaplanowane procesy, w tym jakąkolwiek zaplanowaną nocną synchronizację lub scrub SnapRAID. Następnie postępuj zgodnie z poniÅŧszymi krokami. KROK 1 -> Ponowna konfiguracja Potrzebujesz trochę miejsca do odzyskania, najlepiej na dodatkowych zapasowych dyskach, ale wystarczy zewnętrzny dysk USB lub dysk zdalny. Zmodyfikuj plik konfiguracyjny SnapRAID, aby opcja `data` lub `parity` uszkodzonego dysku wskazywała na lokalizację z wystarczającą ilością pustego miejsca do odzyskania plikÃŗw. Na przykład, jeśli dysk `d1` uległ awarii, zmień z: :data d1 /mnt/disk1/ na: :data d1 /mnt/new_spare_disk/ Jeśli dysk do odzyskania jest dyskiem parzystości, zaktualizuj odpowiednią opcję `parity`. Jeśli masz wiele uszkodzonych dyskÃŗw, zaktualizuj wszystkie ich opcje konfiguracyjne. KROK 2 -> Naprawa Uruchom polecenie fix, zapisując log w pliku zewnętrznym za pomocą: :snapraid -d NAME -l fix.log fix Gdzie NAME to nazwa dysku, taka jak `d1` w naszym poprzednim przykładzie. Jeśli dysk do odzyskania jest dyskiem parzystości, uÅŧyj nazw `parity`, `2-parity`, itp. Jeśli masz wiele uszkodzonych dyskÃŗw, uÅŧyj wielu opcji -d, aby określić wszystkie z nich. To polecenie zajmie duÅŧo czasu. Upewnij się, Åŧe masz kilka gigabajtÃŗw wolnego miejsca na zapisanie pliku fix.log. Uruchom je z dysku z wystarczającą ilością wolnego miejsca. Teraz odzyskałeś wszystko, co jest moÅŧliwe do odzyskania. Jeśli niektÃŗre pliki są częściowo lub całkowicie nie do odzyskania, zostaną one przemianowane poprzez dodanie rozszerzenia `.unrecoverable`. SzczegÃŗÅ‚ową listę wszystkich nie do odzyskania blokÃŗw znajdziesz w pliku fix.log, sprawdzając wszystkie linie zaczynające się od `unrecoverable:`. Jeśli nie jesteś zadowolony z odzyskiwania, moÅŧesz sprÃŗbować ponownie tyle razy, ile chcesz. Na przykład, jeśli usunąłeś pliki z macierzy po ostatniej `sync`, moÅŧe to spowodować, Åŧe niektÃŗre pliki nie zostaną odzyskane. W tym przypadku moÅŧesz ponowić prÃŗbę `fix` za pomocą opcji -i, --import, określając, gdzie te pliki znajdują się teraz, aby włączyć je ponownie do procesu odzyskiwania. Jeśli jesteś zadowolony z odzyskiwania, moÅŧesz kontynuować, ale pamiętaj, Åŧe po synchronizacji nie moÅŧesz juÅŧ ponowić prÃŗby polecenia `fix`! KROK 3 -> Sprawdzenie Jako ostroÅŧne sprawdzenie, moÅŧesz teraz uruchomić polecenie `check`, aby upewnić się, Åŧe wszystko jest poprawne na odzyskanym dysku. :snapraid -d NAME -a check Gdzie NAME to nazwa dysku, taka jak `d1` w naszym poprzednim przykładzie. Opcje -d i -a mÃŗwią SnapRAID, aby sprawdził tylko określony dysk i zignorował wszystkie dane parzystości. To polecenie zajmie duÅŧo czasu, ale jeśli nie jesteś zbyt ostroÅŧny, moÅŧesz je pominąć. KROK 4 -> Synchronizacja Uruchom polecenie `sync`, aby ponownie zsynchronizować macierz z nowym dyskiem. :snapraid sync Jeśli wszystko zostanie odzyskane, to polecenie jest natychmiastowe. Commands SnapRAID udostępnia kilka prostych poleceń, ktÃŗre pozwalają na: * Wyświetlenie statusu macierzy -> `status` * Kontrolę dyskÃŗw -> `smart`, `probe`, `up`, `down` * Wykonanie kopii zapasowej/migawki -> `sync` * Okresowe sprawdzanie danych -> `scrub` * PrzywrÃŗcenie ostatniej kopii zapasowej/migawki -> `fix`. Polecenia muszą być zapisane małymi literami. status Wyświetla podsumowanie stanu macierzy dyskÃŗw. Zawiera informacje o fragmentacji parzystości, jak stare są bloki bez sprawdzenia i wszystkie zarejestrowane ciche błędy napotkane podczas scrubbingu. Prezentowane informacje odnoszą się do ostatniego momentu, w ktÃŗrym uruchomiłeś `sync`. PÃŗÅēniejsze modyfikacje nie są brane pod uwagę. Jeśli wykryto złe bloki, ich numery blokÃŗw są wymienione. Aby je naprawić, moÅŧesz uÅŧyć polecenia `fix -e`. Pokazuje rÃŗwnieÅŧ wykres reprezentujący ostatni raz, kiedy kaÅŧdy blok został sprawdzony lub zsynchronizowany. Sprawdzone bloki są pokazane za pomocą `*`, bloki zsynchronizowane, ale jeszcze niesprawdzone, za pomocą `o`. Nic nie jest modyfikowane. smart Wyświetla raport SMART wszystkich dyskÃŗw w systemie. Zawiera oszacowanie prawdopodobieństwa awarii w następnym roku, co pozwala zaplanować wymianę konserwacyjną dyskÃŗw, ktÃŗre wykazują podejrzane atrybuty. To oszacowanie prawdopodobieństwa uzyskuje się poprzez skorelowanie atrybutÃŗw SMART dyskÃŗw z danymi Backblaze dostępnymi pod adresem: :https://www.backblaze.com/hard-drive-test-data.html Jeśli SMART zgłosi, Åŧe dysk ulega awarii, dla tego dysku wyświetlane jest `FAIL` lub `PREFAIL`, a SnapRAID zwraca błąd. W takim przypadku natychmiastowa wymiana dysku jest wysoce zalecana. Inne moÅŧliwe ciągi statusu to: logfail - W przeszłości niektÃŗre atrybuty były niÅŧsze niÅŧ prÃŗg. logerr - Dziennik błędÃŗw urządzenia zawiera błędy. selferr - Dziennik autotestu urządzenia zawiera błędy. Jeśli określono opcję -v, --verbose, dostarczana jest głębsza analiza statystyczna. Ta analiza moÅŧe pomÃŗc Ci zdecydować, czy potrzebujesz więcej czy mniej parzystości. To polecenie uÅŧywa narzędzia `smartctl` i jest rÃŗwnowaÅŧne uruchomieniu `smartctl -a` na wszystkich urządzeniach. Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, moÅŧesz określić niestandardowe polecenie za pomocą opcji `smartctl` w pliku konfiguracyjnym. Nic nie jest modyfikowane. probe Wyświetla stan ZASILANIA wszystkich dyskÃŗw w systemie. `Standby` oznacza, Åŧe dysk się nie kręci. `Active` oznacza, Åŧe dysk się kręci. To polecenie uÅŧywa narzędzia `smartctl` i jest rÃŗwnowaÅŧne uruchomieniu `smartctl -n standby -i` na wszystkich urządzeniach. Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, moÅŧesz określić niestandardowe polecenie za pomocą opcji `smartctl` w pliku konfiguracyjnym. Nic nie jest modyfikowane. up Rozpędza wszystkie dyski macierzy. MoÅŧesz rozpędzić tylko określone dyski za pomocą opcji -d, --filter-disk. Rozpędzanie wszystkich dyskÃŗw w tym samym czasie wymaga duÅŧo energii. Upewnij się, Åŧe TwÃŗj zasilacz jest w stanie to wytrzymać. Nic nie jest modyfikowane. down Zatrzymuje wszystkie dyski macierzy. To polecenie uÅŧywa narzędzia `smartctl` i jest rÃŗwnowaÅŧne uruchomieniu `smartctl -s standby,now` na wszystkich urządzeniach. MoÅŧesz zatrzymać tylko określone dyski za pomocą opcji -d, --filter-disk. Aby automatycznie zatrzymać dyski w przypadku błędu, moÅŧesz uÅŧyć opcji -s, --spin-down-on-error z dowolnym innym poleceniem, co jest rÃŗwnowaÅŧne ręcznemu uruchomieniu `down`, gdy wystąpi błąd. Nic nie jest modyfikowane. diff Wyświetla listę wszystkich plikÃŗw zmodyfikowanych od ostatniej `sync`, ktÃŗre wymagają ponownego obliczenia danych parzystości. To polecenie nie sprawdza danych pliku, a jedynie znacznik czasu pliku, rozmiar i inode. Po wyświetleniu listy wszystkich zmienionych plikÃŗw, prezentowane jest podsumowanie zmian, pogrupowane według: equal - Pliki niezmienione od wcześniej. added - Pliki dodane, ktÃŗrych wcześniej nie było. removed - Pliki usunięte. updated - Pliki o innym rozmiarze lub znaczniku czasu, co oznacza, Åŧe zostały zmodyfikowane. moved - Pliki przeniesione do innego katalogu na tym samym dysku. Są one identyfikowane przez tę samą nazwę, rozmiar, znacznik czasu i inode, ale inny katalog. copied - Pliki skopiowane na ten sam lub inny dysk, gdzie oryginalny plik nadal istnieje. Są one identyfikowane przez posiadanie tej samej nazwy, rozmiaru i znacznika czasu. Jeśli podsekundowy znacznik czasu wynosi zero, pełna ścieÅŧka musi być zgodna, aby plik został zidentyfikowany, a nie tylko nazwa. relocated - Pliki przeniesione na ten sam lub inny dysk, gdzie oryginał zniknął. Są one identyfikowane przez posiadanie tej samej nazwy, rozmiaru i znacznika czasu. Jeśli podsekundowy znacznik czasu wynosi zero, pełna ścieÅŧka musi być zgodna, aby plik został zidentyfikowany. W przeciwieństwie do plikÃŗw 'moved' na tym samym dysku, pliki relokowane mają inny i-węzeł. restored - Pliki o innym i-węÅēle, ale pasującym katalogu, nazwie, rozmiarze i znaczniku czasu. Są to zazwyczaj pliki przywrÃŗcone po ich usunięciu. Jeśli wymagana jest `sync`, kod powrotu procesu wynosi 2, zamiast domyślnego 0. Kod powrotu 1 jest uÅŧywany dla ogÃŗlnego stanu błędu. Nic nie jest modyfikowane. sync Aktualizuje informacje o parzystości. Wszystkie zmodyfikowane pliki w macierzy dyskÃŗw są odczytywane, a odpowiednie dane parzystości są aktualizowane. MoÅŧesz zatrzymać ten proces w dowolnym momencie, naciskając Ctrl+C, bez utraty juÅŧ wykonanej pracy. Przy następnym uruchomieniu proces `sync` wznowi się w miejscu, w ktÃŗrym został przerwany. Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, odpowiednie bloki zostaną oznaczone jako złe. Pliki są identyfikowane po ścieÅŧce i/lub inode i sprawdzane po rozmiarze i znaczniku czasu. Jeśli rozmiar pliku lub znacznik czasu się rÃŗÅŧni, dane parzystości są ponownie obliczane dla całego pliku. Jeśli plik zostanie przeniesiony lub zmieniony na tym samym dysku, zachowując ten sam inode, parzystość nie jest ponownie obliczana. Jeśli plik zostanie przeniesiony na inny dysk, parzystość jest ponownie obliczana, ale wcześniej obliczone informacje o haszu są zachowywane. Pliki `content` i `parity` są modyfikowane w razie potrzeby. Pliki w macierzy NIE są modyfikowane. scrub Sprawdza macierz, szukając cichych błędÃŗw lub błędÃŗw wejścia/wyjścia w danych i dyskach parzystości. KaÅŧde wywołanie sprawdza około 8% macierzy, z wyłączeniem danych juÅŧ sprawdzonych w ciągu ostatnich 10 dni. Oznacza to, Åŧe sprawdzanie raz w tygodniu zapewnia sprawdzenie kaÅŧdego bitu danych przynajmniej raz na trzy miesiące. MoÅŧesz zdefiniować inny plan sprawdzania lub ilość za pomocą opcji -p, --plan, ktÃŗra akceptuje: bad - Sprawdza bloki oznaczone jako złe. new - Sprawdza bloki właśnie zsynchronizowane, jeszcze niesprawdzone. full - Sprawdza wszystko. 0-100 - Sprawdza określony procent blokÃŗw. Jeśli określisz wartość procentową, moÅŧesz rÃŗwnieÅŧ uÅŧyć opcji -o, --older-than, aby zdefiniować, jak stary powinien być blok. Najpierw sprawdzane są najstarsze bloki, co zapewnia optymalne sprawdzenie. Jeśli chcesz sprawdzić tylko bloki właśnie zsynchronizowane, jeszcze niesprawdzone, uÅŧyj opcji `-p new`. Aby uzyskać szczegÃŗÅ‚y statusu sprawdzania, uÅŧyj polecenia `status`. Dla kaÅŧdego znalezionego cichego błędu lub błędu wejścia/wyjścia, odpowiednie bloki są oznaczane jako złe w pliku `content`. Te złe bloki są wymienione w `status` i mogą zostać naprawione za pomocą `fix -e`. Po naprawie, przy następnym sprawdzeniu, zostaną one ponownie sprawdzone, a jeśli okaÅŧe się, Åŧe zostały poprawione, oznaczenie złego zostanie usunięte. Aby sprawdzić tylko złe bloki, moÅŧesz uÅŧyć polecenia `scrub -p bad`. Zaleca się uruchamianie `scrub` tylko na zsynchronizowanej macierzy, aby uniknąć zgłaszania błędÃŗw spowodowanych przez niezsynchronizowane dane. Błędy te są rozpoznawane jako nie będące cichymi błędami, a bloki nie są oznaczane jako złe, ale takie błędy są zgłaszane w wyniku polecenia. Plik `content` jest modyfikowany w celu zaktualizowania czasu ostatniego sprawdzenia dla kaÅŧdego bloku i oznaczenia złych blokÃŗw. Pliki `parity` NIE są modyfikowane. Pliki w macierzy NIE są modyfikowane. fix Naprawia wszystkie pliki i dane parzystości. Wszystkie pliki i dane parzystości są porÃŗwnywane ze stanem migawki zapisanym w ostatniej `sync`. Jeśli zostanie znaleziona rÃŗÅŧnica, jest ona przywracana do zapisanego stanu migawki. OSTRZEÅģENIE! Polecenie `fix` nie rozrÃŗÅŧnia błędÃŗw od celowych modyfikacji. Bezwarunkowo przywraca stan pliku do ostatniej `sync`. Jeśli nie określono Åŧadnej innej opcji, przetwarzana jest cała macierz. UÅŧyj opcji filtra, aby wybrać podzbiÃŗr plikÃŗw lub dyskÃŗw do operacji. Aby naprawić tylko bloki oznaczone jako złe podczas `sync` i `scrub`, uÅŧyj opcji -e, --filter-error. W przeciwieństwie do innych opcji filtra, ta stosuje poprawki tylko do plikÃŗw, ktÃŗre są niezmienione od ostatniej `sync`. SnapRAID zmienia nazwy wszystkich plikÃŗw, ktÃŗrych nie moÅŧna naprawić, dodając rozszerzenie `.unrecoverable`. Przed naprawą, cała macierz jest skanowana w celu znalezienia wszelkich plikÃŗw przeniesionych od ostatniej operacji `sync`. Pliki te są identyfikowane na podstawie ich znacznika czasu, ignorując ich nazwę i katalog, i są uÅŧywane w procesie odzyskiwania, jeśli to konieczne. Jeśli przeniosłeś niektÃŗre z nich poza macierz, moÅŧesz uÅŧyć opcji -i, --import, aby określić dodatkowe katalogi do skanowania. Pliki są identyfikowane tylko po ścieÅŧce, a nie po inode. Plik `content` NIE jest modyfikowany. Pliki `parity` są modyfikowane w razie potrzeby. Pliki w macierzy są modyfikowane w razie potrzeby. check Weryfikuje wszystkie pliki i dane parzystości. Działa jak `fix`, ale tylko symuluje odzyskiwanie i Åŧadne zmiany nie są zapisywane w macierzy. To polecenie jest przeznaczone gÅ‚Ãŗwnie do ręcznej weryfikacji, takiej jak po procesie odzyskiwania lub w innych specjalnych warunkach. Do okresowych i zaplanowanych sprawdzeń uÅŧyj `scrub`. Jeśli uÅŧyjesz opcji -a, --audit-only, sprawdzane są tylko dane pliku, a dane parzystości są ignorowane, co zapewnia szybsze działanie. Pliki są identyfikowane tylko po ścieÅŧce, a nie po inode. Nic nie jest modyfikowane. list Wyświetla listę wszystkich plikÃŗw zawartych w macierzy w momencie ostatniej `sync`. Z -v lub --verbose, wyświetlany jest rÃŗwnieÅŧ czas z dokładnością do podsekundy. Nic nie jest modyfikowane. dup Wyświetla listę wszystkich zduplikowanych plikÃŗw. Dwa pliki są uwaÅŧane za rÃŗwne, jeśli ich hasze pasują. Dane pliku nie są odczytywane; uÅŧywane są tylko wcześniej obliczone hasze. Nic nie jest modyfikowane. pool Tworzy lub aktualizuje wirtualny widok wszystkich plikÃŗw w Twojej macierzy dyskÃŗw w katalogu `pooling`. Pliki nie są kopiowane, ale linkowane za pomocą dowiązań symbolicznych. Podczas aktualizacji, wszystkie istniejące dowiązania symboliczne i puste podkatalogi są usuwane i zastępowane nowym widokiem macierzy. Wszelkie inne zwykłe pliki pozostają na swoim miejscu. Nic nie jest modyfikowane poza katalogiem puli. devices Wyświetla urządzenia niskiego poziomu uÅŧywane przez macierz. To polecenie wyświetla skojarzenia urządzeń w macierzy i jest przeznaczone gÅ‚Ãŗwnie jako interfejs skryptowy. Pierwsze dwie kolumny to identyfikator i ścieÅŧka urządzenia niskiego poziomu. Następne dwie kolumny to identyfikator i ścieÅŧka urządzenia wysokiego poziomu. Ostatnia kolumna to nazwa dysku w macierzy. W większości przypadkÃŗw masz jedno urządzenie niskiego poziomu dla kaÅŧdego dysku w macierzy, ale w niektÃŗrych bardziej złoÅŧonych konfiguracjach moÅŧesz mieć wiele urządzeń niskiego poziomu uÅŧywanych przez pojedynczy dysk w macierzy. Nic nie jest modyfikowane. touch Ustawia arbitralny znacznik czasu z dokładnością do podsekundy dla wszystkich plikÃŗw, ktÃŗre mają go ustawiony na zero. Poprawia to zdolność SnapRAID do rozpoznawania przeniesionych i skopiowanych plikÃŗw, poniewaÅŧ sprawia, Åŧe znacznik czasu jest prawie unikalny, redukując moÅŧliwe duplikaty. Dokładniej, jeśli znacznik czasu z dokładnością do podsekundy nie jest zerowy, przeniesiony lub skopiowany plik jest identyfikowany jako taki, jeśli pasuje do nazwy, rozmiaru i znacznika czasu. Jeśli znacznik czasu z dokładnością do podsekundy jest zerowy, jest uwaÅŧany za kopię tylko wtedy, gdy pasują pełna ścieÅŧka, rozmiar i znacznik czasu. Znacznik czasu z dokładnością do sekundy nie jest modyfikowany, więc wszystkie daty i czasy Twoich plikÃŗw zostaną zachowane. rehash Planuje ponowne haszowanie całej macierzy. To polecenie zmienia uÅŧywany rodzaj hasza, zazwyczaj podczas aktualizacji z systemu 32-bitowego na 64-bitowy, aby przełączyć się z MurmurHash3 na szybszy SpookyHash. Jeśli uÅŧywasz juÅŧ optymalnego hasza, to polecenie nic nie robi i informuje Cię, Åŧe nie jest potrzebne Åŧadne działanie. Ponowne haszowanie nie jest wykonywane natychmiast, ale odbywa się stopniowo podczas `sync` i `scrub`. MoÅŧesz sprawdzić stan ponownego haszowania za pomocą `status`. Podczas ponownego haszowania SnapRAID zachowuje pełną funkcjonalność, z jedynym wyjątkiem, Åŧe `dup` nie moÅŧe wykryć zduplikowanych plikÃŗw uÅŧywających innego hasza. locate Lokalizuje pliki zapisane na dyskach parzystości. Dla kaÅŧdego dopasowanego pliku wypisuje jego lokalizację w pliku parzystości oraz liczbę zajmowanych przez niego fragmentÃŗw. MoÅŧesz uÅŧyć opcji -t, --tail, aby ograniczyć operację do plikÃŗw zajmujących określoną końcową część parzystości. Jeśli chcesz dokonać realokacji tych plikÃŗw, moÅŧesz uÅŧyć opcji -W, --force-realloc-tail. Pamiętaj, Åŧe takie pliki nie będą chronione przez parzystość podczas procesu realokacji. Options SnapRAID udostępnia następujące opcje: -c, --conf CONFIG Wybiera plik konfiguracyjny do uÅŧycia. Jeśli nie określono, w systemie Unix uÅŧywa pliku `/usr/local/etc/snapraid.conf`, jeśli istnieje, w przeciwnym razie `/etc/snapraid.conf`. W systemie Windows uÅŧywa pliku `snapraid.conf` w tym samym katalogu co `snapraid.exe`. -f, --filter PATTERN Filtruje pliki do przetworzenia w `check` i `fix`. Przetwarzane są tylko pliki pasujące do określonego wzorca. Ta opcja moÅŧe być uÅŧywana wielokrotnie. Zobacz sekcję PATTERN, aby uzyskać więcej szczegÃŗÅ‚Ãŗw na temat specyfikacji wzorcÃŗw. W systemie Unix upewnij się, Åŧe znaki globbing są cytowane, jeśli są uÅŧywane. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. Nie moÅŧe być uÅŧywana z `sync` i `scrub`, poniewaÅŧ zawsze przetwarzają całą macierz. -d, --filter-disk NAME Filtruje dyski do przetworzenia w `check`, `fix`, `up` i `down`. Musisz określić nazwę dysku zdefiniowaną w pliku konfiguracyjnym. MoÅŧesz rÃŗwnieÅŧ określić dyski parzystości za pomocą nazw: `parity`, `2-parity`, `3-parity`, itp., aby ograniczyć operacje do określonego dysku parzystości. Jeśli połączysz wiele opcji --filter, --filter-disk i --filter-missing, wybrane zostaną tylko pliki pasujące do wszystkich filtrÃŗw. Ta opcja moÅŧe być uÅŧywana wielokrotnie. Ta opcja moÅŧe być uÅŧywana tylko z `check`, `fix`, `up` i `down`. Nie moÅŧe być uÅŧywana z `sync` i `scrub`, poniewaÅŧ zawsze przetwarzają całą macierz. -m, --filter-missing Filtruje pliki do przetworzenia w `check` i `fix`. Przetwarzane są tylko pliki brakujące lub usunięte z macierzy. UÅŧyte z `fix`, działa to jako polecenie `undelete`. Jeśli połączysz wiele opcji --filter, --filter-disk i --filter-missing, wybrane zostaną tylko pliki pasujące do wszystkich filtrÃŗw. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. Nie moÅŧe być uÅŧywana z `sync` i `scrub`, poniewaÅŧ zawsze przetwarzają całą macierz. -e, --filter-error Przetwarza pliki z błędami w `check` i `fix`. Przetwarza tylko pliki, ktÃŗre mają bloki oznaczone cichymi błędami lub błędami wejścia/wyjścia podczas `sync` i `scrub`, jak wymieniono w `status`. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. -p, --plan PERC|bad|new|full Wybiera plan sprawdzania. Jeśli PERC jest wartością numeryczną od 0 do 100, jest interpretowany jako procent blokÃŗw do sprawdzenia. Zamiast wartości procentowej moÅŧesz określić plan: `bad` sprawdza złe bloki, `new` sprawdza bloki jeszcze niesprawdzone, a `full` sprawdza wszystko. Ta opcja moÅŧe być uÅŧywana tylko z `scrub`. -o, --older-than DAYS Wybiera najstarszą część macierzy do przetworzenia w `scrub`. DAYS to minimalny wiek w dniach dla bloku, ktÃŗry ma być sprawdzony; domyślnie jest to 10. Bloki oznaczone jako złe są zawsze sprawdzane niezaleÅŧnie od tej opcji. Ta opcja moÅŧe być uÅŧywana tylko z `scrub`. -a, --audit-only W `check`, weryfikuje hasz plikÃŗw bez sprawdzania danych parzystości. Jeśli interesuje Cię tylko sprawdzenie danych pliku, ta opcja moÅŧe znacznie przyspieszyć proces sprawdzania. Ta opcja moÅŧe być uÅŧywana tylko z `check`. -h, --pre-hash W `sync`, uruchamia wstępną fazę haszowania wszystkich nowych danych w celu dodatkowej weryfikacji przed obliczeniem parzystości. Zazwyczaj w `sync` nie jest wykonywane wstępne haszowanie, a nowe dane są haszowane tuÅŧ przed obliczeniem parzystości, gdy są odczytywane po raz pierwszy. Ten proces zachodzi, gdy system jest pod duÅŧym obciąÅŧeniem, wszystkie dyski się kręcą, a CPU jest zajęte. Jest to ekstremalny warunek dla maszyny, a jeśli ma ukryty problem sprzętowy, ciche błędy mogą pozostać niewykryte, poniewaÅŧ dane nie są jeszcze haszowane. Aby uniknąć tego ryzyka, moÅŧesz włączyć tryb `pre-hash`, aby wszystkie dane były odczytywane dwukrotnie w celu zapewnienia ich integralności. Ta opcja weryfikuje rÃŗwnieÅŧ pliki przeniesione wewnątrz macierzy, aby upewnić się, Åŧe operacja przeniesienia zakończyła się pomyślnie, i, jeśli to konieczne, umoÅŧliwia uruchomienie operacji fix przed kontynuowaniem. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -i, --import DIR Importuje z określonego katalogu wszelkie pliki usunięte z macierzy po ostatniej `sync`. Jeśli nadal masz takie pliki, mogą być uÅŧyte przez `check` i `fix`, aby poprawić proces odzyskiwania. Pliki są odczytywane, w tym w podkatalogach, i są identyfikowane niezaleÅŧnie od ich nazwy. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. -s, --spin-down-on-error W przypadku kaÅŧdego błędu, zatrzymuje wszystkie zarządzane dyski przed wyjściem z niezerowym kodem statusu. Zapobiega to pozostawaniu dyskÃŗw aktywnymi i kręcącymi się po przerwanej operacji, pomagając uniknąć niepotrzebnego gromadzenia się ciepła i zuÅŧycia energii. UÅŧyj tej opcji, aby upewnić się, Åŧe dyski są bezpiecznie zatrzymane, nawet gdy polecenie zakończy się niepowodzeniem. -w, --bw-limit RATE Stosuje globalne ograniczenie przepustowości dla wszystkich dyskÃŗw. RATE to liczba bajtÃŗw na sekundę. MoÅŧesz określić mnoÅŧnik, taki jak K, M lub G (np. --bw-limit 1G). -t, --tail ROZMIAR Ogranicza listę plikÃŗw do tych, ktÃŗre nie uÅŧywają więcej niÅŧ określony końcowy rozmiar dyskÃŗw parzystości. MoÅŧesz uÅŧyć mnoÅŧnikÃŗw takich jak K, M, G lub T (np. --tail 1G). Opcja ta jest waÅŧna tylko wtedy, gdy jest uÅŧywana wraz z poleceniem `locate`. -A, --stats Włącza rozszerzony widok statusu, ktÃŗry pokazuje dodatkowe informacje. Ekran wyświetla dwa wykresy: Pierwszy wykres pokazuje liczbę buforowanych paskÃŗw dla kaÅŧdego dysku, wraz ze ścieÅŧką pliku, do ktÃŗrego aktualnie uzyskuje się dostęp na tym dysku. Zazwyczaj najwolniejszy dysk nie będzie miał dostępnego bufora, co determinuje maksymalną osiągalną przepustowość. Drugi wykres pokazuje procent czasu spędzonego na czekaniu w ciągu ostatnich 100 sekund. Oczekuje się, Åŧe najwolniejszy dysk spowoduje większość czasu oczekiwania, podczas gdy inne dyski powinny mieć niewielki lub Åŧaden czas oczekiwania, poniewaÅŧ mogą uÅŧywać swoich buforowanych paskÃŗw. Ten wykres pokazuje rÃŗwnieÅŧ czas spędzony na czekaniu na obliczenia hasza i obliczenia RAID. Wszystkie obliczenia są wykonywane rÃŗwnolegle z operacjami dyskowymi. Dlatego, dopÃŗki istnieje mierzalny czas oczekiwania dla przynajmniej jednego dysku, oznacza to, Åŧe CPU jest wystarczająco szybkie, aby nadąÅŧyć za obciąÅŧeniem. -Z, --force-zero Wymusza niebezpieczną operację synchronizacji pliku o zerowym rozmiarze, ktÃŗry wcześniej był niezerowy. Jeśli SnapRAID wykryje taki stan, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to łatwo wykryć, kiedy po awarii systemu niektÃŗre dostępne pliki zostały obcięte. Jest to moÅŧliwy stan w systemie Linux z systemami plikÃŗw ext3/ext4. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -E, --force-empty Wymusza niebezpieczną operację synchronizacji dysku z brakującymi wszystkimi oryginalnymi plikami. Jeśli SnapRAID wykryje, Åŧe brakuje wszystkich plikÃŗw pierwotnie obecnych na dysku lub zostały przepisane, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to łatwo wykryć, kiedy system plikÃŗw danych nie jest zamontowany. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -U, --force-uuid Wymusza niebezpieczną operację synchronizacji, sprawdzania i naprawiania z dyskami, ktÃŗre zmieniły swÃŗj UUID. Jeśli SnapRAID wykryje, Åŧe niektÃŗre dyski zmieniły UUID, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to wykryć, kiedy Twoje dyski są zamontowane w niewłaściwych punktach montowania. Dozwolona jest jednak pojedyncza zmiana UUID z pojedynczą parzystością i więcej z wielokrotną parzystością, poniewaÅŧ jest to normalny przypadek podczas wymiany dyskÃŗw po odzyskaniu. Ta opcja moÅŧe być uÅŧywana tylko z `sync`, `check` lub `fix`. -D, --force-device Wymusza niebezpieczną operację naprawiania z niedostępnymi dyskami lub z dyskami na tym samym urządzeniu fizycznym. Na przykład, jeśli straciłeś dwa dyski danych i masz zapasowy dysk do odzyskania tylko pierwszego, moÅŧesz zignorować drugi niedostępny dysk. Lub, jeśli chcesz odzyskać dysk w wolnym miejscu pozostawionym na juÅŧ uÅŧywanym dysku, wspÃŗÅ‚dzielącym to samo urządzenie fizyczne. Ta opcja moÅŧe być uÅŧywana tylko z `fix`. -N, --force-nocopy W `sync`, `check` i `fix`, wyłącza heurystykę wykrywania kopii. Bez tej opcji SnapRAID zakłada, Åŧe pliki o tych samych atrybutach, takich jak nazwa, rozmiar i znacznik czasu, są kopiami z tymi samymi danymi. Pozwala to na identyfikację skopiowanych lub przeniesionych plikÃŗw z jednego dysku na inny i ponowne wykorzystanie juÅŧ obliczonych informacji o haszu w celu wykrycia cichych błędÃŗw lub odzyskania brakujących plikÃŗw. W niektÃŗrych rzadkich przypadkach to zachowanie moÅŧe prowadzić do fałszywych alarmÃŗw lub spowolnienia procesu z powodu wielu weryfikacji hasza, a ta opcja pozwala rozwiązać takie problemy. Ta opcja moÅŧe być uÅŧywana tylko z `sync`, `check` i `fix`. -F, --force-full W `sync`, wymusza pełne ponowne obliczenie parzystości. Ta opcja moÅŧe być uÅŧywana, gdy dodajesz nowy poziom parzystości lub jeśli powrÃŗciłeś do starego pliku zawartości, uÅŧywając nowszych danych parzystości. Zamiast ponownego tworzenia parzystości od podstaw, pozwala to na ponowne wykorzystanie haszy obecnych w pliku zawartości do walidacji danych i utrzymania ochrony danych podczas procesu `sync` za pomocą istniejących danych parzystości. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -R, --force-realloc W `sync`, wymusza pełną realokację plikÃŗw i przebudowę parzystości. Ta opcja moÅŧe być uÅŧywana do całkowitej realokacji wszystkich plikÃŗw, usuwając fragmentację, jednocześnie ponownie wykorzystując hasze obecne w pliku zawartości do walidacji danych. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby jej nie uÅŧywać. NIE MASZ ochrony danych podczas operacji `sync`. -W, --force-realloc-tail ROZMIAR Działa jak -R, --force-realloc, ale ogranicza się do określonej części końcowej (ostatnie ROZMIAR bajtÃŗw) kaÅŧdego pliku parzystości. Wymusza realokację (przeniesienie) wszelkich fragmentÃŗw/blokÃŗw plikÃŗw obecnie przechowywanych w tej sekcji końcowej, pozwalając na ich umieszczenie w dowolnym miejscu w pliku (plikach) parzystości, gdzie dostępne jest wolne miejsce (w tym w istniejących lukach). GÅ‚Ãŗwnym celem tej opcji jest zmniejszenie rozmiaru pliku parzystości na dysku. Jeśli realokacja pomyślnie wyczyści całą sekcję końcową (nie pozostaną Åŧadne bloki korzystające z niej), plik parzystości zostanie przycięty, odzyskując nieuÅŧywane miejsce na końcu. MoÅŧesz uÅŧyć mnoÅŧnikÃŗw takich jak K, M, G lub T (np. --force-realloc-tail 1G). MoÅŧesz uÅŧyć locate -t, --tail, aby wcześniej poznać pliki, ktÃŗrych będzie to dotyczyć. OSTRZEÅģENIE! Ta opcja jest przeznaczona wyłącznie dla ekspertÃŗw i zdecydowanie zaleca się jej nie uÅŧywać. Podczas operacji `sync` pliki, ktÃŗrych to dotyczy, NIE mają ochrony danych. -l, --log FILE Zapisuje szczegÃŗÅ‚owy log do określonego pliku. Jeśli ta opcja nie jest określona, nieoczekiwane błędy są drukowane na ekranie, potencjalnie prowadząc do nadmiernego wyjścia w przypadku wielu błędÃŗw. Gdy -l, --log jest określone, tylko krytyczne błędy, ktÃŗre powodują zatrzymanie SnapRAID, są drukowane na ekranie. Jeśli ścieÅŧka zaczyna się od `>>`, plik jest otwierany w trybie dołączania. Wystąpienia `%D` i `%T` w nazwie są zastępowane datą i czasem w formacie RRRRMMDD i GGMMSS. W plikach wsadowych Windows musisz podwoić znak `%`, np. result-%%D.log. Aby uÅŧyć `>>`, musisz ujęć nazwę w cudzysÅ‚Ãŗw, np. `">>result.log"`. Aby wyprowadzić log do standardowego wyjścia lub standardowego błędu, moÅŧesz uÅŧyć odpowiednio `">&1"` i `">&2"`. Opisy tagÃŗw logu znajdziesz w pliku snapraid_log.txt lub na stronie podręcznika. -L, --error-limit NUMBER Ustawia nowy limit błędÃŗw przed zatrzymaniem wykonania. Domyślnie SnapRAID zatrzymuje się, jeśli napotka więcej niÅŧ 100 błędÃŗw wejścia/wyjścia, co wskazuje, Åŧe dysk prawdopodobnie ulega awarii. Ta opcja dotyczy `sync` i `scrub`, ktÃŗre mogą kontynuować po pierwszym zestawie błędÃŗw dysku, aby sprÃŗbować ukończyć swoje operacje. Jednak `check` i `fix` zawsze zatrzymują się przy pierwszym błędzie. -S, --start BLKSTART Zaczyna przetwarzanie od określonego numeru bloku. MoÅŧe to być przydatne do ponownej prÃŗby sprawdzenia lub naprawy określonych blokÃŗw w przypadku uszkodzonego dysku. Ta opcja jest przeznaczona gÅ‚Ãŗwnie do zaawansowanego ręcznego odzyskiwania. -B, --count BLKCOUNT Przetwarza tylko określoną liczbę blokÃŗw. Ta opcja jest przeznaczona gÅ‚Ãŗwnie do zaawansowanego ręcznego odzyskiwania. -C, --gen-conf CONTENT Generuje atrapę pliku konfiguracyjnego z istniejącego pliku zawartości. Plik konfiguracyjny jest zapisywany na standardowe wyjście i nie nadpisuje istniejącego. Ten plik konfiguracyjny zawiera rÃŗwnieÅŧ informacje potrzebne do rekonstrukcji punktÃŗw montowania dyskÃŗw na wypadek utraty całego systemu. -v, --verbose Wyświetla więcej informacji na ekranie. Jeśli określono raz, drukuje wykluczone pliki i dodatkowe statystyki. Ta opcja nie ma wpływu na pliki logÃŗw. -q, --quiet Wyświetla mniej informacji na ekranie. Jeśli określono raz, usuwa pasek postępu; dwa razy, bieÅŧące operacje; trzy razy, komunikaty informacyjne; cztery razy, komunikaty statusu. Krytyczne błędy są zawsze drukowane na ekranie. Ta opcja nie ma wpływu na pliki logÃŗw. -H, --help Wyświetla krÃŗtki ekran pomocy. -V, --version Wyświetla wersję programu. Configuration SnapRAID wymaga pliku konfiguracyjnego, aby wiedzieć, gdzie znajduje się Twoja macierz dyskÃŗw i gdzie przechowywać informacje o parzystości. W systemie Unix uÅŧywa pliku `/usr/local/etc/snapraid.conf`, jeśli istnieje, w przeciwnym razie `/etc/snapraid.conf`. W systemie Windows uÅŧywa pliku `snapraid.conf` w tym samym katalogu co `snapraid.exe`. Musi zawierać następujące opcje (uwzględniające wielkość liter): parity FILE [,FILE] ... Definiuje pliki do uÅŧycia do przechowywania informacji o parzystości. Parzystość umoÅŧliwia ochronę przed awarią pojedynczego dysku, podobnie jak w RAID5. MoÅŧesz określić wiele plikÃŗw, ktÃŗre muszą znajdować się na rÃŗÅŧnych dyskach. Gdy plik nie moÅŧe juÅŧ rosnąć, uÅŧywany jest następny. Całkowita dostępna przestrzeń musi być co najmniej tak duÅŧa jak największy dysk danych w macierzy. MoÅŧesz dodać dodatkowe pliki parzystości pÃŗÅēniej, ale nie moÅŧesz ich zmieniać kolejności ani usuwać. Trzymanie dyskÃŗw parzystości zarezerwowanych dla parzystości zapewnia, Åŧe nie ulegną fragmentacji, co poprawia wydajność. W systemie Windows 256 MB jest pozostawione niewykorzystane na kaÅŧdym dysku, aby uniknąć ostrzeÅŧenia o pełnych dyskach. Ta opcja jest obowiązkowa i moÅŧe być uÅŧywana tylko raz. (2,3,4,5,6)-parity FILE [,FILE] ... Definiuje pliki do uÅŧycia do przechowywania dodatkowych informacji o parzystości. Dla kaÅŧdego określonego poziomu parzystości włączany jest jeden dodatkowy poziom ochrony: * 2-parity włącza podwÃŗjną parzystość RAID6. * 3-parity włącza potrÃŗjną parzystość. * 4-parity włącza poczwÃŗrną (cztery) parzystość. * 5-parity włącza pięciokrotną (pięć) parzystość. * 6-parity włącza sześciokrotną (sześć) parzystość. KaÅŧdy poziom parzystości wymaga obecności wszystkich poprzednich poziomÃŗw parzystości. Obowiązują te same uwagi, co dla opcji `parity`. Te opcje są opcjonalne i mogą być uÅŧywane tylko raz. z-parity FILE [,FILE] ... Definiuje alternatywny plik i format do przechowywania potrÃŗjnej parzystości. Ta opcja jest alternatywą dla `3-parity`, przeznaczoną gÅ‚Ãŗwnie dla procesorÃŗw niskiej klasy, takich jak ARM lub AMD Phenom, Athlon i Opteron, ktÃŗre nie obsługują zestawu instrukcji SSSE3. W takich przypadkach zapewnia lepszą wydajność. Ten format jest podobny, ale szybszy niÅŧ ten uÅŧywany przez ZFS RAIDZ3. Podobnie jak ZFS, nie działa powyÅŧej potrÃŗjnej parzystości. Podczas uÅŧywania `3-parity` zostaniesz ostrzeÅŧony, jeśli zaleca się uÅŧycie formatu `z-parity` w celu poprawy wydajności. MoÅŧliwa jest konwersja z jednego formatu na inny poprzez dostosowanie pliku konfiguracyjnego z poÅŧądanym plikiem z-parity lub 3-parity i uÅŧycie `fix` do jego ponownego utworzenia. content FILE Definiuje plik do uÅŧycia do przechowywania listy i sum kontrolnych wszystkich plikÃŗw obecnych w Twojej macierzy dyskÃŗw. MoÅŧe być umieszczony na dysku uÅŧywanym do danych, parzystości lub kaÅŧdym innym dostępnym dysku. Jeśli uÅŧyjesz dysku danych, ten plik jest automatycznie wykluczony z procesu `sync`. Ta opcja jest obowiązkowa i moÅŧe być uÅŧywana wielokrotnie do zapisania wielu kopii tego samego pliku. Musisz przechowywać co najmniej jedną kopię dla kaÅŧdego uÅŧywanego dysku parzystości plus jeden. UÅŧywanie dodatkowych kopii nie szkodzi. data NAME DIR Definiuje nazwę i punkt montowania dyskÃŗw danych w macierzy. NAME słuÅŧy do identyfikacji dysku i musi być unikalna. DIR to punkt montowania dysku w systemie plikÃŗw. MoÅŧesz zmieniać punkt montowania w razie potrzeby, o ile zachowasz stałą nazwę NAME. Powinieneś uÅŧyć jednej opcji dla kaÅŧdego dysku danych w macierzy. MoÅŧesz pÃŗÅēniej zmienić nazwę dysku, zmieniając bezpośrednio nazwę NAME w pliku konfiguracyjnym, a następnie uruchamiając polecenie `sync`. W przypadku zmiany nazwy, skojarzenie odbywa się za pomocą zapisanego UUID dyskÃŗw. extra NAME DIR Definiuje nazwę i punkt montowania dodatkowych dyskÃŗw do monitorowania za pomocą poleceń `smart` oraz `probe`. Jest to przydatne do monitorowania dyskÃŗw, ktÃŗre nie są częścią macierzy, ale są wymagane do funkcjonowania systemu, takich jak dysk rozruchowy. NaleÅŧy zauwaÅŧyć, Åŧe polecenia `up` i `down` nie mają wpływu na takie dyski, poniewaÅŧ oczekuje się, Åŧe będą one zawsze w ruchu. nohidden Wyklucza wszystkie ukryte pliki i katalogi. W systemie Unix ukryte pliki to te zaczynające się od `.`. W systemie Windows są to te z atrybutem ukrycia. exclude/include PATTERN Definiuje wzorce plikÃŗw lub katalogÃŗw do wykluczenia lub włączenia do procesu synchronizacji. Wszystkie wzorce są przetwarzane w określonej kolejności. Jeśli pierwszy pasujący wzorzec jest `exclude`, plik jest wykluczony. Jeśli jest to `include`, plik jest włączony. Jeśli Åŧaden wzorzec nie pasuje, plik jest wykluczony, jeśli ostatni określony wzorzec to `include`, lub włączony, jeśli ostatni określony wzorzec to `exclude`. Zobacz sekcję PATTERN, aby uzyskać więcej szczegÃŗÅ‚Ãŗw na temat specyfikacji wzorcÃŗw. Ta opcja moÅŧe być uÅŧywana wielokrotnie. blocksize SIZE_IN_KIBIBYTES Definiuje podstawowy rozmiar bloku w kibibajtach dla parzystości. Jeden kibibajt to 1024 bajty. Domyślny rozmiar bloku to 256, co powinno działać w większości przypadkÃŗw. OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, będziesz musiał ponownie utworzyć całą parzystość! Powodem uÅŧycia innego rozmiaru bloku jest posiadanie wielu małych plikÃŗw, rzędu milionÃŗw. Dla kaÅŧdego pliku, nawet jeśli ma tylko kilka bajtÃŗw, alokowany jest cały blok parzystości, a przy wielu plikach moÅŧe to skutkować znaczną nieuÅŧywaną przestrzenią parzystości. Kiedy całkowicie wypełnisz dysk parzystości, nie moÅŧesz dodawać więcej plikÃŗw do dyskÃŗw danych. Jednak marnowana parzystość nie gromadzi się na dyskach danych. Marnowane miejsce wynikające z duÅŧej liczby plikÃŗw na dysku danych ogranicza tylko ilość danych na tym dysku danych, a nie na innych. Jako przybliÅŧenie, moÅŧesz załoÅŧyć, Åŧe połowa rozmiaru bloku jest marnowana dla kaÅŧdego pliku. Na przykład, z 100 000 plikÃŗw i rozmiarem bloku 256 KiB, zmarnujesz 12,8 GB parzystości, co moÅŧe skutkować 12,8 GB mniejszą dostępną przestrzenią na dysku danych. MoÅŧesz sprawdzić ilość zmarnowanego miejsca na kaÅŧdym dysku za pomocą `status`. Jest to ilość miejsca, ktÃŗrą musisz pozostawić wolną na dyskach danych lub uÅŧyć dla plikÃŗw nie włączonych do macierzy. Jeśli ta wartość jest ujemna, oznacza to, Åŧe jesteś blisko wypełnienia parzystości i reprezentuje to przestrzeń, ktÃŗrą nadal moÅŧesz zmarnować. Aby uniknąć tego problemu, moÅŧesz uÅŧyć większej partycji dla parzystości. Na przykład, jeśli partycja parzystości jest o 12,8 GB większa niÅŧ dyski danych, masz wystarczająco duÅŧo dodatkowego miejsca, aby obsłuÅŧyć do 100 000 plikÃŗw na kaÅŧdym dysku danych bez marnowania miejsca. Sztuczką, aby uzyskać większą partycję parzystości w systemie Linux, jest sformatowanie jej za pomocą polecenia: :mkfs.ext4 -m 0 -T largefile4 DEVICE Daje to około 1,5% dodatkowego miejsca, około 60 GB dla dysku 4 TB, co pozwala na około 460 000 plikÃŗw na kaÅŧdym dysku danych bez marnowania miejsca. hashsize SIZE_IN_BYTES Definiuje rozmiar hasza w bajtach dla zapisanych blokÃŗw. Domyślny rozmiar hasza to 16 bajtÃŗw (128 bitÃŗw), co powinno działać w większości przypadkÃŗw. OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, będziesz musiał ponownie utworzyć całą parzystość! Powodem uÅŧycia innego rozmiaru hasza jest to, Åŧe TwÃŗj system ma ograniczoną pamięć. Z reguły, SnapRAID zwykle wymaga 1 GiB pamięci RAM na kaÅŧde 16 TB danych w macierzy. Konkretnie, aby przechowywać hasze danych, SnapRAID wymaga około TS*(1+HS)/BS bajtÃŗw pamięci RAM, gdzie TS to całkowity rozmiar w bajtach Twojej macierzy dyskÃŗw, BS to rozmiar bloku w bajtach, a HS to rozmiar hasza w bajtach. Na przykład, z 8 dyskami po 4 TB, rozmiarem bloku 256 KiB (1 KiB = 1024 bajty) i rozmiarem hasza 16, otrzymujesz: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB Przełączając się na rozmiar hasza 8, otrzymujesz: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB Przełączając się na rozmiar bloku 512, otrzymujesz: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB Przełączając się zarÃŗwno na rozmiar hasza 8, jak i rozmiar bloku 512, otrzymujesz: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB autosave SIZE_IN_GIGABYTES Automatycznie zapisuje stan podczas synchronizacji lub sprawdzania po przetworzeniu określonej ilości GB. Ta opcja jest przydatna, aby uniknąć ponownego uruchamiania długich poleceń `sync` od zera, jeśli zostaną przerwane przez awarię maszyny lub inne zdarzenie. temp_limit TEMPERATURE_CELSIUS Ustawia maksymalną dozwoloną temperaturę dysku w stopniach Celsjusza. Po określeniu, SnapRAID okresowo sprawdza temperaturę wszystkich dyskÃŗw za pomocą narzędzia smartctl. Aktualne temperatury dyskÃŗw są wyświetlane podczas działania SnapRAID. Jeśli ktÃŗrykolwiek dysk przekroczy ten limit, wszystkie operacje zostają zatrzymane, a dyski są zatrzymywane (przechodzą w stan gotowości) na czas zdefiniowany przez opcję `temp_sleep`. Po okresie uśpienia, operacje są wznawiane, potencjalnie ponownie zatrzymując się, jeśli limit temperatury zostanie ponownie osiągnięty. Podczas działania SnapRAID analizuje rÃŗwnieÅŧ krzywą nagrzewania kaÅŧdego dysku i szacuje długoterminową stałą temperaturę, ktÃŗrą mają osiągnąć, jeśli aktywność będzie kontynuowana. Oszacowanie jest wykonywane tylko po czterokrotnym wzroście temperatury dysku, co zapewnia, Åŧe dostępnych jest wystarczająco duÅŧo punktÃŗw danych do ustalenia wiarygodnego trendu. Ta przewidywana stała temperatura jest pokazywana w nawiasach obok aktualnej wartości i pomaga ocenić, czy chłodzenie systemu jest odpowiednie. Ta szacowana temperatura ma charakter wyłącznie informacyjny i nie ma wpływu na zachowanie SnapRAID. Działania programu opierają się wyłącznie na faktycznie zmierzonych temperaturach dyskÃŗw. Aby wykonać tę analizę, SnapRAID potrzebuje odniesienia dla temperatury systemu. Najpierw prÃŗbuje odczytać ją z dostępnych czujnikÃŗw sprzętowych. Jeśli nie moÅŧna uzyskać dostępu do Åŧadnego czujnika systemu, jako awaryjne odniesienie wykorzystuje najniÅŧszą temperaturę dysku zmierzoną na początku uruchomienia. Normalnie SnapRAID pokazuje tylko temperaturę najgorętszego dysku. Aby wyświetlić temperaturę wszystkich dyskÃŗw, uÅŧyj opcji -A lub --stats. temp_sleep TIME_IN_MINUTES Ustawia czas gotowości, w minutach, po osiągnięciu limitu temperatury. W tym okresie dyski pozostają zatrzymane. Domyślnie jest to 5 minut. pool DIR Definiuje katalog puli, w ktÃŗrym tworzony jest wirtualny widok macierzy dyskÃŗw za pomocą polecenia `pool`. Katalog musi juÅŧ istnieć. share UNC_DIR Definiuje ścieÅŧkę UNC Windows wymaganą do zdalnego dostępu do dyskÃŗw. Jeśli ta opcja jest określona, dowiązania symboliczne utworzone w katalogu puli uÅŧywają tej ścieÅŧki UNC do dostępu do dyskÃŗw. Bez tej opcji generowane dowiązania symboliczne uÅŧywają tylko ścieÅŧek lokalnych, co nie pozwala na udostępnianie katalogu puli w sieci. Dowiązania symboliczne są tworzone przy uÅŧyciu określonej ścieÅŧki UNC, dodając nazwę dysku określoną w opcji `data`, a na końcu dodając katalog i nazwę pliku. Ta opcja jest wymagana tylko dla systemu Windows. smartctl DISK/PARITY OPTIONS... Definiuje niestandardowe opcje smartctl do uzyskania atrybutÃŗw SMART dla kaÅŧdego dysku. MoÅŧe to być wymagane dla kontrolerÃŗw RAID i niektÃŗrych dyskÃŗw USB, ktÃŗrych nie moÅŧna wykryć automatycznie. Symbol zastępczy %s jest zastępowany nazwą urządzenia, ale jest opcjonalny dla stałych urządzeń, takich jak kontrolery RAID. DISK to ta sama nazwa dysku określona w opcji `data`. PARITY to jedna z nazw parzystości: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` lub `z-parity`. W określonych OPCJACH ciąg `%s` jest zastępowany nazwą urządzenia. W przypadku kontrolerÃŗw RAID, urządzenie jest prawdopodobnie stałe i moÅŧe nie być konieczne uÅŧycie `%s`. Zapoznaj się z dokumentacją smartmontools, aby uzyskać moÅŧliwe opcje: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices Na przykład: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignoruje określony atrybut SMART podczas obliczania prawdopodobieństwa awarii dysku. Ta opcja jest przydatna, jeśli dysk zgłasza nietypowe lub wprowadzające w błąd wartości dla określonego atrybutu. DISK to ta sama nazwa dysku określona w opcji `data`. PARITY to jedna z nazw parzystości: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` lub `z-parity`. Specjalna wartość * moÅŧe być uÅŧyta do zignorowania atrybutu na wszystkich dyskach. Na przykład, aby zignorować atrybut `Current Pending Sector Count` na wszystkich dyskach: :smartignore * 197 Aby zignorować go tylko na pierwszym dysku parzystości: :smartignore parity 197 Examples Przykład typowej konfiguracji dla systemu Unix: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Przykład typowej konfiguracji dla systemu Windows: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern Wzorce zapewniają elastyczny sposÃŗb filtrowania plikÃŗw do uwzględnienia lub wykluczenia. UÅŧywając znakÃŗw globbingowych, moÅŧna zdefiniować reguły, ktÃŗre pasują do określonych nazw plikÃŗw lub całych struktur katalogÃŗw bez ręcznego wymieniania kaÅŧdej ścieÅŧki. Znak zapytania `?` dopasowuje dowolny pojedynczy znak z wyjątkiem separatora katalogÃŗw. Dzięki temu jest przydatny do dopasowywania nazw plikÃŗw ze zmiennymi znakami, przy jednoczesnym ograniczeniu wzorca do jednego poziomu katalogu. Pojedyncza gwiazdka `*` dopasowuje dowolną sekwencję znakÃŗw, ale podobnie jak znak zapytania, nigdy nie przekracza granic katalogÃŗw. Zatrzymuje się na ukośniku, co czyni ją odpowiednią do dopasowywania w obrębie jednego składnika ścieÅŧki. Jest to standardowe zachowanie symboli wieloznacznych znane z globbingu powłoki (shell). PodwÃŗjna gwiazdka `**` jest potęÅŧniejsza, dopasowuje dowolną sekwencję znakÃŗw, w tym separatory katalogÃŗw. Pozwala to wzorcom dopasowywać się na wielu poziomach katalogÃŗw. Gdy `**` pojawia się bezpośrednio wewnątrz wzorca, moÅŧe dopasować zero lub więcej znakÃŗw, w tym ukośniki między otaczającym tekstem dosłownym. NajwaÅŧniejszym zastosowaniem `**` jest specjalna forma `/**/`. Dopasowuje ona zero lub więcej pełnych poziomÃŗw katalogÃŗw, umoÅŧliwiając dopasowanie plikÃŗw na dowolnej głębokości w drzewie katalogÃŗw bez znajomości dokładnej struktury ścieÅŧki. Na przykład wzorzec `src/**/main.js` pasuje do `src/main.js` (pomijając zero katalogÃŗw), `src/ui/main.js` (pomijając jeden katalog) oraz `src/ui/components/main.js` (pomijając dwa katalogi). Klasy znakÃŗw uÅŧywające nawiasÃŗw kwadratowych `[]` dopasowują pojedynczy znak z określonego zestawu lub zakresu. Podobnie jak inne wzorce pojedynczych znakÃŗw, nie pasują one do separatorÃŗw katalogÃŗw. Klasy obsługują zakresy i negację za pomocą wykrzyknika. Podstawową rÃŗÅŧnicą, o ktÃŗrej naleÅŧy pamiętać, jest to, Åŧe `*`, `?` i klasy znakÃŗw wszystkie respektują granice katalogÃŗw i dopasowują się tylko w obrębie jednego składnika ścieÅŧki, podczas gdy `**` jest jedynym wzorcem, ktÃŗry moÅŧe dopasowywać się poprzez separatory katalogÃŗw. Istnieją cztery rÃŗÅŧne typy wzorcÃŗw: =FILE Wybiera dowolny plik o nazwie FILE. Ten wzorzec dotyczy tylko plikÃŗw, a nie katalogÃŗw. =DIR/ Wybiera dowolny katalog o nazwie DIR i wszystko, co się w nim znajduje. Ten wzorzec dotyczy tylko katalogÃŗw, a nie plikÃŗw. =/PATH/FILE Wybiera dokładnie określoną ścieÅŧkę pliku. Ten wzorzec dotyczy tylko plikÃŗw, a nie katalogÃŗw. =/PATH/DIR/ Wybiera dokładnie określoną ścieÅŧkę katalogu i wszystko, co się w nim znajduje. Ten wzorzec dotyczy tylko katalogÃŗw, a nie plikÃŗw. Gdy określisz ścieÅŧkę bezwzględną zaczynającą się od /, jest ona stosowana w katalogu gÅ‚Ãŗwnym macierzy, a nie w katalogu gÅ‚Ãŗwnym lokalnego systemu plikÃŗw. W systemie Windows moÅŧesz uÅŧyć ukośnika odwrotnego \ zamiast ukośnika /. Katalogi systemowe Windows, połączenia, punkty montowania i inne specjalne katalogi Windows są traktowane jako pliki, co oznacza, Åŧe aby je wykluczyć, musisz uÅŧyć reguły pliku, a nie katalogu. Jeśli nazwa pliku zawiera znak `*`, `?`, `[`, lub `]`, musisz go uciec, aby uniknąć interpretacji jako znaku globbing. W systemie Unix znakiem ucieczki jest `\`; w systemie Windows jest to `^`. Gdy wzorzec znajduje się w wierszu poleceń, musisz podwoić znak ucieczki, aby uniknąć interpretacji przez powłokę poleceń. W pliku konfiguracyjnym moÅŧesz uÅŧyć rÃŗÅŧnych strategii do filtrowania plikÃŗw do przetworzenia. Najprostszym podejściem jest uÅŧycie tylko reguł `exclude`, aby usunąć wszystkie pliki i katalogi, ktÃŗrych nie chcesz przetwarzać. Na przykład: :# Wyklucza dowolny plik o nazwie `*.unrecoverable` :exclude *.unrecoverable :# Wyklucza katalog gÅ‚Ãŗwny `/lost+found` :exclude /lost+found/ :# Wyklucza dowolny podkatalog o nazwie `tmp` :exclude tmp/ Odwrotnym podejściem jest zdefiniowanie tylko plikÃŗw, ktÃŗre chcesz przetwarzać, uÅŧywając tylko reguł `include`. Na przykład: :# Włącza tylko niektÃŗre katalogi :include /movies/ :include /musics/ :include /pictures/ Ostatecznym podejściem jest mieszanie reguł `exclude` i `include`. W tym przypadku kolejność reguł jest waÅŧna. Wcześniejsze reguły mają pierwszeństwo przed pÃŗÅēniejszymi. Aby uprościć, moÅŧesz najpierw wymienić wszystkie reguły `exclude`, a następnie wszystkie reguły `include`. Na przykład: :# Wyklucza dowolny plik o nazwie `*.unrecoverable` :exclude *.unrecoverable :# Wyklucza dowolny podkatalog o nazwie `tmp` :exclude tmp/ :# Włącza tylko niektÃŗre katalogi :include /movies/ :include /musics/ :include /pictures/ W wierszu poleceń, uÅŧywając opcji -f, moÅŧesz uÅŧyć tylko wzorcÃŗw `include`. Na przykład: :# Sprawdza tylko pliki .mp3. :# W systemie Unix uÅŧyj cudzysłowÃŗw, aby uniknąć rozszerzenia globbing przez powłokę. :snapraid -f "*.mp3" check W systemie Unix, uÅŧywając znakÃŗw globbing w wierszu poleceń, musisz je cytować, aby zapobiec ich rozszerzeniu przez powłokę. Ignore File OprÃŗcz reguł globalnych w pliku konfiguracyjnym, moÅŧesz umieścić pliki `.snapraidignore` w dowolnym katalogu w macierzy, aby zdefiniować zdecentralizowane reguły wykluczania. Reguły zdefiniowane w `.snapraidignore` są stosowane po regułach w pliku konfiguracyjnym. Oznacza to, Åŧe mają one wyÅŧszy priorytet i mogą być uÅŧywane do wykluczania plikÃŗw, ktÃŗre zostały wcześniej uwzględnione przez konfigurację globalną. Skutecznie, jeśli reguła lokalna pasuje, plik jest wykluczany bez względu na globalne ustawienia uwzględniania. Logika wzorcÃŗw w `.snapraidignore` odzwierciedla konfigurację globalną, ale zakotwicza wzorce w katalogu, w ktÃŗrym znajduje się plik: =FILE Wybiera dowolny plik o nazwie FILE w tym katalogu lub poniÅŧej. Podlega to tym samym zasadom dopasowywania (globbing) co wzorzec globalny. =DIR/ Wybiera dowolny katalog o nazwie DIR i wszystko w jego wnętrzu, znajdujący się w tym katalogu lub poniÅŧej. =/PATH/FILE Wybiera dokładnie określony plik względem lokalizacji pliku `.snapraidignore`. =/PATH/DIR/ Wybiera dokładnie określony katalog i wszystko w jego wnętrzu, względem lokalizacji pliku `.snapraidignore`. W przeciwieństwie do konfiguracji globalnej, pliki `.snapraidignore` obsługują tylko reguły wykluczania; nie moÅŧna uÅŧywać wzorcÃŗw `include` ani negacji (!). Na przykład, jeśli masz `.snapraidignore` w `/mnt/disk1/projects/`: :# Wyklucza TYLKO /mnt/disk1/projects/output.bin :/output.bin :# Wyklucza kaÅŧdy katalog o nazwie `build` wewnątrz projects/ :build/ :# Wyklucza kaÅŧdy plik .tmp wewnątrz projects/ lub jego podfolderach :*.tmp Content SnapRAID przechowuje listę i sumy kontrolne Twoich plikÃŗw w pliku zawartości. Jest to plik binarny, ktÃŗry zawiera listę wszystkich plikÃŗw obecnych w Twojej macierzy dyskÃŗw, wraz ze wszystkimi sumami kontrolnymi w celu weryfikacji ich integralności. Ten plik jest odczytywany i zapisywany przez polecenia `sync` i `scrub` oraz odczytywany przez polecenia `fix`, `check` i `status`. Parity SnapRAID przechowuje informacje o parzystości Twojej macierzy w plikach parzystości. Są to pliki binarne zawierające obliczoną parzystość wszystkich blokÃŗw zdefiniowanych w pliku `content`. Pliki te są odczytywane i zapisywane przez polecenia `sync` i `fix` oraz tylko odczytywane przez polecenia `scrub` i `check`. Encoding SnapRAID w systemie Unix ignoruje wszelkie kodowanie. Odczytuje i przechowuje nazwy plikÃŗw z tym samym kodowaniem uÅŧywanym przez system plikÃŗw. W systemie Windows wszystkie nazwy odczytane z systemu plikÃŗw są konwertowane i przetwarzane w formacie UTF-8. Aby nazwy plikÃŗw były poprawnie drukowane, musisz ustawić konsolę Windows na tryb UTF-8 za pomocą polecenia `chcp 65001` i uÅŧyć czcionki TrueType, takiej jak `Lucida Console`, jako czcionki konsoli. Dotyczy to tylko drukowanych nazw plikÃŗw; jeśli przekierujesz wyjście konsoli do pliku, wynikowy plik jest zawsze w formacie UTF-8. Copyright Ten plik jest chroniony prawem autorskim (C) 2025 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-pl.txt000066400000000000000000002133361522717156100170070ustar00rootroot00000000000000 ============================================== Kopia zapasowa SnapRAID dla macierzy dyskowych ============================================== 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAID to program do tworzenia kopii zapasowych przeznaczony dla macierzy dyskowych, przechowujący informacje parzystości do odzyskiwania danych w przypadku awarii do sześciu dyskÃŗw. Przeznaczony gÅ‚Ãŗwnie dla domowych centrÃŗw multimedialnych z duÅŧymi, rzadko zmieniającymi się plikami, SnapRAID oferuje kilka funkcji: * MoÅŧesz uÅŧywać dyskÃŗw juÅŧ wypełnionych plikami bez konieczności ich ponownego formatowania, uzyskując do nich dostęp jak zwykle. * Wszystkie Twoje dane są haszowane, aby zapewnić integralność danych i zapobiec cichej korupcji. * Gdy liczba uszkodzonych dyskÃŗw przekracza liczbę parzystości, utrata danych ogranicza się do dotkniętych dyskÃŗw; dane na innych dyskach pozostają dostępne. * Jeśli przypadkowo usuniesz pliki na dysku, moÅŧliwe jest ich odzyskanie. * Dyski mogą mieć rÃŗÅŧne rozmiary. * MoÅŧesz dodawać dyski w dowolnym momencie. * SnapRAID nie blokuje Twoich danych; moÅŧesz przestać go uÅŧywać w dowolnym momencie bez ponownego formatowania ani przenoszenia danych. * Aby uzyskać dostęp do pliku, wystarczy, Åŧe zakręci się tylko jeden dysk, co oszczędza energię i zmniejsza hałas. Więcej informacji moÅŧna znaleÅēć na oficjalnej stronie SnapRAID: https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID to hybryda programu RAID i programu do tworzenia kopii zapasowych, ktÃŗrej celem jest połączenie najlepszych zalet obu. Ma jednak pewne ograniczenia, ktÃŗre naleÅŧy wziąć pod uwagę przed jego uÅŧyciem. GÅ‚Ãŗwnym ograniczeniem jest to, Åŧe jeśli dysk ulegnie awarii, a Ty nie wykonałeś niedawno synchronizacji, moÅŧesz nie być w stanie w pełni odzyskać danych. Dokładniej, moÅŧesz nie być w stanie odzyskać danych o wielkości zmienionych lub usuniętych plikÃŗw od czasu ostatniej operacji synchronizacji. Dzieje się tak, nawet jeśli zmienione lub usunięte pliki nie znajdują się na uszkodzonym dysku. Dlatego SnapRAID jest lepiej dostosowany do danych, ktÃŗre rzadko się zmieniają. Z drugiej strony, nowo dodane pliki nie uniemoÅŧliwiają odzyskania juÅŧ istniejących plikÃŗw. Stracisz tylko ostatnio dodane pliki, jeśli znajdują się one na uszkodzonym dysku. Inne ograniczenia SnapRAID to: * W SnapRAID nadal masz oddzielne systemy plikÃŗw dla kaÅŧdego dysku. W RAID otrzymujesz jeden duÅŧy system plikÃŗw. * SnapRAID nie rozdziela danych. W RAID uzyskujesz wzrost prędkości dzięki rozdzielaniu. * SnapRAID nie obsługuje odzyskiwania w czasie rzeczywistym. W RAID nie musisz przerywać pracy, gdy dysk ulegnie awarii. * SnapRAID moÅŧe odzyskać dane tylko z ograniczonej liczby awarii dyskÃŗw. W przypadku kopii zapasowej moÅŧesz odzyskać dane po całkowitej awarii całej macierzy dyskÃŗw. * Zapisywane są tylko nazwy plikÃŗw, znaczniki czasu, dowiązania symboliczne i dowiązania twarde. Uprawnienia, właścicielstwo i rozszerzone atrybuty nie są zapisywane. 4 GETTING STARTED ================= Aby uÅŧyć SnapRAID, musisz najpierw wybrać jeden dysk w swojej macierzy dyskÃŗw, ktÃŗry zostanie przeznaczony na informacje o `parzystości`. Z jednym dyskiem na parzystość będziesz w stanie odzyskać dane po awarii pojedynczego dysku, podobnie jak w RAID5. Jeśli chcesz odzyskać dane po większej liczbie awarii dyskÃŗw, podobnie jak w RAID6, musisz zarezerwować dodatkowe dyski na parzystość. KaÅŧdy dodatkowy dysk parzystości umoÅŧliwia odzyskanie danych po jeszcze jednej awarii dysku. Jako dyski parzystości musisz wybrać największe dyski w macierzy, poniewaÅŧ informacje o parzystości mogą urosnąć do rozmiaru największego dysku danych w macierzy. Dyski te będą przeznaczone do przechowywania plikÃŗw `parzystości`. Nie powinieneś na nich przechowywać swoich danych. Następnie musisz zdefiniować dyski `danych`, ktÃŗre chcesz chronić za pomocą SnapRAID. Ochrona jest bardziej skuteczna, jeśli te dyski zawierają dane, ktÃŗre rzadko się zmieniają. Z tego powodu lepiej jest NIE włączać dysku C:\ w systemie Windows ani katalogÃŗw /home, /var i /tmp w systemie Unix. Lista plikÃŗw jest zapisywana w plikach `zawartości`, zwykle przechowywanych na dyskach danych, parzystości lub rozruchowych. Plik ten zawiera szczegÃŗÅ‚y Twojej kopii zapasowej, w tym wszystkie sumy kontrolne w celu weryfikacji jej integralności. Plik `zawartości` jest przechowywany w wielu kopiach, a kaÅŧda kopia musi znajdować się na innym dysku, aby zapewnić, Åŧe nawet w przypadku wielu awarii dyskÃŗw, przynajmniej jedna kopia jest dostępna. Na przykład, zaÅ‚ÃŗÅŧmy, Åŧe interesuje Cię tylko jeden poziom parzystości i Twoje dyski znajdują się w: /mnt/diskp <- wybrany dysk dla parzystości /mnt/disk1 <- pierwszy dysk do ochrony /mnt/disk2 <- drugi dysk do ochrony /mnt/disk3 <- trzeci dysk do ochrony Musisz utworzyć plik konfiguracyjny /etc/snapraid.conf z następującymi opcjami: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Jeśli uÅŧywasz systemu Windows, powinieneś uÅŧyć formatu ścieÅŧek Windows, z literami dyskÃŗw i ukośnikami odwrotnymi zamiast ukośnikÃŗw: parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Jeśli masz wiele dyskÃŗw i zabrakło Ci liter dyskÃŗw, moÅŧesz zamontować dyski bezpośrednio w podfolderach. Zobacz: https://www.google.com/search?q=Windows+mount+point W tym momencie jesteś gotowy do uruchomienia polecenia `sync`, aby zbudować informacje o parzystości. snapraid sync Ten proces moÅŧe zająć kilka godzin za pierwszym razem, w zaleÅŧności od rozmiaru danych juÅŧ obecnych na dyskach. Jeśli dyski są puste, proces jest natychmiastowy. MoÅŧesz go zatrzymać w dowolnym momencie, naciskając Ctrl+C, a przy następnym uruchomieniu wznowi się w miejscu, w ktÃŗrym został przerwany. Kiedy to polecenie się zakończy, Twoje dane są BEZPIECZNE. Teraz moÅŧesz zacząć uÅŧywać swojej macierzy, jak chcesz, i okresowo aktualizować informacje o parzystości, uruchamiając polecenie `sync`. 4.1 Scrubbing ------------- Aby okresowo sprawdzać dane i parzystość pod kątem błędÃŗw, moÅŧesz uruchomić polecenie `scrub`. snapraid scrub To polecenie porÃŗwnuje dane w Twojej macierzy z haszem obliczonym podczas polecenia `sync`, aby zweryfikować integralność. KaÅŧde uruchomienie polecenia sprawdza około 8% macierzy, z wyłączeniem danych juÅŧ sprawdzonych w ciągu poprzednich 10 dni. MoÅŧesz uÅŧyć opcji -p, --plan, aby określić inną ilość, oraz opcji -o, --older-than, aby określić inny wiek w dniach. Na przykład, aby sprawdzić 5% macierzy dla blokÃŗw starszych niÅŧ 20 dni, uÅŧyj: snapraid -p 5 -o 20 scrub Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, odpowiednie bloki zostaną oznaczone jako złe w pliku `content` i wymienione w poleceniu `status`. snapraid status Aby je naprawić, moÅŧesz uÅŧyć polecenia `fix`, filtrując złe bloki za pomocą opcji -e, --filter-error: snapraid -e fix Przy następnym `scrub`, błędy znikną z raportu `status`, jeśli zostały faktycznie naprawione. Aby przyspieszyć, moÅŧesz uÅŧyć -p bad, aby sprawdzić tylko bloki oznaczone jako złe. snapraid -p bad scrub Uruchomienie `scrub` na niezsynchronizowanej macierzy moÅŧe zgłosić błędy spowodowane usuniętymi lub zmodyfikowanymi plikami. Błędy te są zgłaszane w wyniku `scrub`, ale powiązane bloki nie są oznaczane jako złe. 4.2 Pooling ----------- Uwaga: Funkcja łączenia w pulę opisana poniÅŧej została zastąpiona przez narzędzie mergerfs, ktÃŗre jest obecnie zalecaną opcją dla uÅŧytkownikÃŗw Linuksa w społeczności SnapRAID. Mergefs zapewnia bardziej elastyczny i wydajny sposÃŗb łączenia wielu dyskÃŗw w jeden ujednolicony punkt montowania, umoÅŧliwiając bezproblemowy dostęp do plikÃŗw w całej macierzy bez polegania na dowiązaniach symbolicznych. Dobrze integruje się z SnapRAID w celu ochrony parzystości i jest powszechnie uÅŧywane w konfiguracjach takich jak OpenMediaVault (OMV) lub niestandardowe konfiguracje NAS. Aby wszystkie pliki w Twojej macierzy były widoczne w tym samym drzewie katalogÃŗw, moÅŧesz włączyć funkcję `pooling`. Tworzy ona wirtualny, tylko do odczytu, widok wszystkich plikÃŗw w Twojej macierzy za pomocą dowiązań symbolicznych. Katalog `pooling` moÅŧesz skonfigurować w pliku konfiguracyjnym za pomocą: pool /pool lub, jeśli uÅŧywasz systemu Windows, za pomocą: pool C:\pool a następnie uruchom polecenie `pool`, aby utworzyć lub zaktualizować wirtualny widok. snapraid pool Jeśli uÅŧywasz platformy Unix i chcesz udostępnić ten katalog przez sieć maszynom Windows lub Unix, powinieneś dodać następujące opcje do swojego /etc/samba/smb.conf: # W sekcji globalnej smb.conf unix extensions = no # W sekcji udziału smb.conf [pool] comment = Pula path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes W systemie Windows udostępnianie dowiązań symbolicznych przez sieć wymaga od klientÃŗw zdalnego ich rozwiązywania. Aby to umoÅŧliwić, oprÃŗcz udostępnienia katalogu puli, musisz rÃŗwnieÅŧ udostępnić wszystkie dyski niezaleÅŧnie, uÅŧywając nazw dyskÃŗw zdefiniowanych w pliku konfiguracyjnym jako punkty udostępniania. Musisz rÃŗwnieÅŧ określić w opcji `share` w pliku konfiguracyjnym ścieÅŧkę UNC Windows, ktÃŗrej klienci zdalni muszą uÅŧyć, aby uzyskać dostęp do tych udostępnionych dyskÃŗw. Na przykład, działając z serwera o nazwie `darkstar`, moÅŧesz uÅŧyć opcji: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar i udostępnić w sieci następujące katalogi: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array aby umoÅŧliwić zdalnym klientom dostęp do wszystkich plikÃŗw pod adresem \\darkstar\pool. MoÅŧesz rÃŗwnieÅŧ potrzebować skonfigurować klientÃŗw zdalnych, aby umoÅŧliwić dostęp do zdalnych dowiązań symbolicznych za pomocą polecenia: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAID działa bardziej jak program do tworzenia kopii zapasowych niÅŧ system RAID i moÅŧe być uÅŧyty do przywrÃŗcenia lub odzyskania usuniętych plikÃŗw do ich poprzedniego stanu za pomocą opcji -f, --filter: snapraid fix -f FILE lub dla katalogu: snapraid fix -f DIR/ MoÅŧesz go rÃŗwnieÅŧ uÅŧyć do odzyskania tylko przypadkowo usuniętych plikÃŗw wewnątrz katalogu za pomocą opcji -m, --filter-missing, ktÃŗra przywraca tylko brakujące pliki, pozostawiając wszystkie inne nienaruszone. snapraid fix -m -f DIR/ Lub aby odzyskać wszystkie usunięte pliki na wszystkich dyskach za pomocą: snapraid fix -m 4.4 Recovering -------------- Najgorsze się wydarzyło i straciłeś jeden lub więcej dyskÃŗw! NIE PANIKUJ! Będziesz w stanie je odzyskać! Pierwszą rzeczą, ktÃŗrą musisz zrobić, to unikać dalszych zmian w Twojej macierzy dyskÃŗw. Wyłącz wszelkie zdalne połączenia z nią i wszelkie zaplanowane procesy, w tym jakąkolwiek zaplanowaną nocną synchronizację lub scrub SnapRAID. Następnie postępuj zgodnie z poniÅŧszymi krokami. ---- 4.4.1 KROK 1 -> Ponowna konfiguracja ---- Potrzebujesz trochę miejsca do odzyskania, najlepiej na dodatkowych zapasowych dyskach, ale wystarczy zewnętrzny dysk USB lub dysk zdalny. Zmodyfikuj plik konfiguracyjny SnapRAID, aby opcja `data` lub `parity` uszkodzonego dysku wskazywała na lokalizację z wystarczającą ilością pustego miejsca do odzyskania plikÃŗw. Na przykład, jeśli dysk `d1` uległ awarii, zmień z: data d1 /mnt/disk1/ na: data d1 /mnt/new_spare_disk/ Jeśli dysk do odzyskania jest dyskiem parzystości, zaktualizuj odpowiednią opcję `parity`. Jeśli masz wiele uszkodzonych dyskÃŗw, zaktualizuj wszystkie ich opcje konfiguracyjne. ---- 4.4.2 KROK 2 -> Naprawa ---- Uruchom polecenie fix, zapisując log w pliku zewnętrznym za pomocą: snapraid -d NAME -l fix.log fix Gdzie NAME to nazwa dysku, taka jak `d1` w naszym poprzednim przykładzie. Jeśli dysk do odzyskania jest dyskiem parzystości, uÅŧyj nazw `parity`, `2-parity`, itp. Jeśli masz wiele uszkodzonych dyskÃŗw, uÅŧyj wielu opcji -d, aby określić wszystkie z nich. To polecenie zajmie duÅŧo czasu. Upewnij się, Åŧe masz kilka gigabajtÃŗw wolnego miejsca na zapisanie pliku fix.log. Uruchom je z dysku z wystarczającą ilością wolnego miejsca. Teraz odzyskałeś wszystko, co jest moÅŧliwe do odzyskania. Jeśli niektÃŗre pliki są częściowo lub całkowicie nie do odzyskania, zostaną one przemianowane poprzez dodanie rozszerzenia `.unrecoverable`. SzczegÃŗÅ‚ową listę wszystkich nie do odzyskania blokÃŗw znajdziesz w pliku fix.log, sprawdzając wszystkie linie zaczynające się od `unrecoverable:`. Jeśli nie jesteś zadowolony z odzyskiwania, moÅŧesz sprÃŗbować ponownie tyle razy, ile chcesz. Na przykład, jeśli usunąłeś pliki z macierzy po ostatniej `sync`, moÅŧe to spowodować, Åŧe niektÃŗre pliki nie zostaną odzyskane. W tym przypadku moÅŧesz ponowić prÃŗbę `fix` za pomocą opcji -i, --import, określając, gdzie te pliki znajdują się teraz, aby włączyć je ponownie do procesu odzyskiwania. Jeśli jesteś zadowolony z odzyskiwania, moÅŧesz kontynuować, ale pamiętaj, Åŧe po synchronizacji nie moÅŧesz juÅŧ ponowić prÃŗby polecenia `fix`! ---- 4.4.3 KROK 3 -> Sprawdzenie ---- Jako ostroÅŧne sprawdzenie, moÅŧesz teraz uruchomić polecenie `check`, aby upewnić się, Åŧe wszystko jest poprawne na odzyskanym dysku. snapraid -d NAME -a check Gdzie NAME to nazwa dysku, taka jak `d1` w naszym poprzednim przykładzie. Opcje -d i -a mÃŗwią SnapRAID, aby sprawdził tylko określony dysk i zignorował wszystkie dane parzystości. To polecenie zajmie duÅŧo czasu, ale jeśli nie jesteś zbyt ostroÅŧny, moÅŧesz je pominąć. ---- 4.4.4 KROK 4 -> Synchronizacja ---- Uruchom polecenie `sync`, aby ponownie zsynchronizować macierz z nowym dyskiem. snapraid sync Jeśli wszystko zostanie odzyskane, to polecenie jest natychmiastowe. 5 COMMANDS ========== SnapRAID udostępnia kilka prostych poleceń, ktÃŗre pozwalają na: * Wyświetlenie statusu macierzy -> `status` * Kontrolę dyskÃŗw -> `smart`, `probe`, `up`, `down` * Wykonanie kopii zapasowej/migawki -> `sync` * Okresowe sprawdzanie danych -> `scrub` * PrzywrÃŗcenie ostatniej kopii zapasowej/migawki -> `fix`. Polecenia muszą być zapisane małymi literami. 5.1 status ---------- Wyświetla podsumowanie stanu macierzy dyskÃŗw. Zawiera informacje o fragmentacji parzystości, jak stare są bloki bez sprawdzenia i wszystkie zarejestrowane ciche błędy napotkane podczas scrubbingu. Prezentowane informacje odnoszą się do ostatniego momentu, w ktÃŗrym uruchomiłeś `sync`. PÃŗÅēniejsze modyfikacje nie są brane pod uwagę. Jeśli wykryto złe bloki, ich numery blokÃŗw są wymienione. Aby je naprawić, moÅŧesz uÅŧyć polecenia `fix -e`. Pokazuje rÃŗwnieÅŧ wykres reprezentujący ostatni raz, kiedy kaÅŧdy blok został sprawdzony lub zsynchronizowany. Sprawdzone bloki są pokazane za pomocą `*`, bloki zsynchronizowane, ale jeszcze niesprawdzone, za pomocą `o`. Nic nie jest modyfikowane. 5.2 smart --------- Wyświetla raport SMART wszystkich dyskÃŗw w systemie. Zawiera oszacowanie prawdopodobieństwa awarii w następnym roku, co pozwala zaplanować wymianę konserwacyjną dyskÃŗw, ktÃŗre wykazują podejrzane atrybuty. To oszacowanie prawdopodobieństwa uzyskuje się poprzez skorelowanie atrybutÃŗw SMART dyskÃŗw z danymi Backblaze dostępnymi pod adresem: https://www.backblaze.com/hard-drive-test-data.html Jeśli SMART zgłosi, Åŧe dysk ulega awarii, dla tego dysku wyświetlane jest `FAIL` lub `PREFAIL`, a SnapRAID zwraca błąd. W takim przypadku natychmiastowa wymiana dysku jest wysoce zalecana. Inne moÅŧliwe ciągi statusu to: logfail - W przeszłości niektÃŗre atrybuty były niÅŧsze niÅŧ prÃŗg. logerr - Dziennik błędÃŗw urządzenia zawiera błędy. selferr - Dziennik autotestu urządzenia zawiera błędy. Jeśli określono opcję -v, --verbose, dostarczana jest głębsza analiza statystyczna. Ta analiza moÅŧe pomÃŗc Ci zdecydować, czy potrzebujesz więcej czy mniej parzystości. To polecenie uÅŧywa narzędzia `smartctl` i jest rÃŗwnowaÅŧne uruchomieniu `smartctl -a` na wszystkich urządzeniach. Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, moÅŧesz określić niestandardowe polecenie za pomocą opcji `smartctl` w pliku konfiguracyjnym. Nic nie jest modyfikowane. 5.3 probe --------- Wyświetla stan ZASILANIA wszystkich dyskÃŗw w systemie. `Standby` oznacza, Åŧe dysk się nie kręci. `Active` oznacza, Åŧe dysk się kręci. To polecenie uÅŧywa narzędzia `smartctl` i jest rÃŗwnowaÅŧne uruchomieniu `smartctl -n standby -i` na wszystkich urządzeniach. Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, moÅŧesz określić niestandardowe polecenie za pomocą opcji `smartctl` w pliku konfiguracyjnym. Nic nie jest modyfikowane. 5.4 up ------ Rozpędza wszystkie dyski macierzy. MoÅŧesz rozpędzić tylko określone dyski za pomocą opcji -d, --filter-disk. Rozpędzanie wszystkich dyskÃŗw w tym samym czasie wymaga duÅŧo energii. Upewnij się, Åŧe TwÃŗj zasilacz jest w stanie to wytrzymać. Nic nie jest modyfikowane. 5.5 down -------- Zatrzymuje wszystkie dyski macierzy. To polecenie uÅŧywa narzędzia `smartctl` i jest rÃŗwnowaÅŧne uruchomieniu `smartctl -s standby,now` na wszystkich urządzeniach. MoÅŧesz zatrzymać tylko określone dyski za pomocą opcji -d, --filter-disk. Aby automatycznie zatrzymać dyski w przypadku błędu, moÅŧesz uÅŧyć opcji -s, --spin-down-on-error z dowolnym innym poleceniem, co jest rÃŗwnowaÅŧne ręcznemu uruchomieniu `down`, gdy wystąpi błąd. Nic nie jest modyfikowane. 5.6 diff -------- Wyświetla listę wszystkich plikÃŗw zmodyfikowanych od ostatniej `sync`, ktÃŗre wymagają ponownego obliczenia danych parzystości. To polecenie nie sprawdza danych pliku, a jedynie znacznik czasu pliku, rozmiar i inode. Po wyświetleniu listy wszystkich zmienionych plikÃŗw, prezentowane jest podsumowanie zmian, pogrupowane według: equal - Pliki niezmienione od wcześniej. added - Pliki dodane, ktÃŗrych wcześniej nie było. removed - Pliki usunięte. updated - Pliki o innym rozmiarze lub znaczniku czasu, co oznacza, Åŧe zostały zmodyfikowane. moved - Pliki przeniesione do innego katalogu na tym samym dysku. Są one identyfikowane przez tę samą nazwę, rozmiar, znacznik czasu i inode, ale inny katalog. copied - Pliki skopiowane na ten sam lub inny dysk, gdzie oryginalny plik nadal istnieje. Są one identyfikowane przez posiadanie tej samej nazwy, rozmiaru i znacznika czasu. Jeśli podsekundowy znacznik czasu wynosi zero, pełna ścieÅŧka musi być zgodna, aby plik został zidentyfikowany, a nie tylko nazwa. relocated - Pliki przeniesione na ten sam lub inny dysk, gdzie oryginał zniknął. Są one identyfikowane przez posiadanie tej samej nazwy, rozmiaru i znacznika czasu. Jeśli podsekundowy znacznik czasu wynosi zero, pełna ścieÅŧka musi być zgodna, aby plik został zidentyfikowany. W przeciwieństwie do plikÃŗw 'moved' na tym samym dysku, pliki relokowane mają inny i-węzeł. restored - Pliki o innym i-węÅēle, ale pasującym katalogu, nazwie, rozmiarze i znaczniku czasu. Są to zazwyczaj pliki przywrÃŗcone po ich usunięciu. Jeśli wymagana jest `sync`, kod powrotu procesu wynosi 2, zamiast domyślnego 0. Kod powrotu 1 jest uÅŧywany dla ogÃŗlnego stanu błędu. Nic nie jest modyfikowane. 5.7 sync -------- Aktualizuje informacje o parzystości. Wszystkie zmodyfikowane pliki w macierzy dyskÃŗw są odczytywane, a odpowiednie dane parzystości są aktualizowane. MoÅŧesz zatrzymać ten proces w dowolnym momencie, naciskając Ctrl+C, bez utraty juÅŧ wykonanej pracy. Przy następnym uruchomieniu proces `sync` wznowi się w miejscu, w ktÃŗrym został przerwany. Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, odpowiednie bloki zostaną oznaczone jako złe. Pliki są identyfikowane po ścieÅŧce i/lub inode i sprawdzane po rozmiarze i znaczniku czasu. Jeśli rozmiar pliku lub znacznik czasu się rÃŗÅŧni, dane parzystości są ponownie obliczane dla całego pliku. Jeśli plik zostanie przeniesiony lub zmieniony na tym samym dysku, zachowując ten sam inode, parzystość nie jest ponownie obliczana. Jeśli plik zostanie przeniesiony na inny dysk, parzystość jest ponownie obliczana, ale wcześniej obliczone informacje o haszu są zachowywane. Pliki `content` i `parity` są modyfikowane w razie potrzeby. Pliki w macierzy NIE są modyfikowane. 5.8 scrub --------- Sprawdza macierz, szukając cichych błędÃŗw lub błędÃŗw wejścia/wyjścia w danych i dyskach parzystości. KaÅŧde wywołanie sprawdza około 8% macierzy, z wyłączeniem danych juÅŧ sprawdzonych w ciągu ostatnich 10 dni. Oznacza to, Åŧe sprawdzanie raz w tygodniu zapewnia sprawdzenie kaÅŧdego bitu danych przynajmniej raz na trzy miesiące. MoÅŧesz zdefiniować inny plan sprawdzania lub ilość za pomocą opcji -p, --plan, ktÃŗra akceptuje: bad - Sprawdza bloki oznaczone jako złe. new - Sprawdza bloki właśnie zsynchronizowane, jeszcze niesprawdzone. full - Sprawdza wszystko. 0-100 - Sprawdza określony procent blokÃŗw. Jeśli określisz wartość procentową, moÅŧesz rÃŗwnieÅŧ uÅŧyć opcji -o, --older-than, aby zdefiniować, jak stary powinien być blok. Najpierw sprawdzane są najstarsze bloki, co zapewnia optymalne sprawdzenie. Jeśli chcesz sprawdzić tylko bloki właśnie zsynchronizowane, jeszcze niesprawdzone, uÅŧyj opcji `-p new`. Aby uzyskać szczegÃŗÅ‚y statusu sprawdzania, uÅŧyj polecenia `status`. Dla kaÅŧdego znalezionego cichego błędu lub błędu wejścia/wyjścia, odpowiednie bloki są oznaczane jako złe w pliku `content`. Te złe bloki są wymienione w `status` i mogą zostać naprawione za pomocą `fix -e`. Po naprawie, przy następnym sprawdzeniu, zostaną one ponownie sprawdzone, a jeśli okaÅŧe się, Åŧe zostały poprawione, oznaczenie złego zostanie usunięte. Aby sprawdzić tylko złe bloki, moÅŧesz uÅŧyć polecenia `scrub -p bad`. Zaleca się uruchamianie `scrub` tylko na zsynchronizowanej macierzy, aby uniknąć zgłaszania błędÃŗw spowodowanych przez niezsynchronizowane dane. Błędy te są rozpoznawane jako nie będące cichymi błędami, a bloki nie są oznaczane jako złe, ale takie błędy są zgłaszane w wyniku polecenia. Plik `content` jest modyfikowany w celu zaktualizowania czasu ostatniego sprawdzenia dla kaÅŧdego bloku i oznaczenia złych blokÃŗw. Pliki `parity` NIE są modyfikowane. Pliki w macierzy NIE są modyfikowane. 5.9 fix ------- Naprawia wszystkie pliki i dane parzystości. Wszystkie pliki i dane parzystości są porÃŗwnywane ze stanem migawki zapisanym w ostatniej `sync`. Jeśli zostanie znaleziona rÃŗÅŧnica, jest ona przywracana do zapisanego stanu migawki. OSTRZEÅģENIE! Polecenie `fix` nie rozrÃŗÅŧnia błędÃŗw od celowych modyfikacji. Bezwarunkowo przywraca stan pliku do ostatniej `sync`. Jeśli nie określono Åŧadnej innej opcji, przetwarzana jest cała macierz. UÅŧyj opcji filtra, aby wybrać podzbiÃŗr plikÃŗw lub dyskÃŗw do operacji. Aby naprawić tylko bloki oznaczone jako złe podczas `sync` i `scrub`, uÅŧyj opcji -e, --filter-error. W przeciwieństwie do innych opcji filtra, ta stosuje poprawki tylko do plikÃŗw, ktÃŗre są niezmienione od ostatniej `sync`. SnapRAID zmienia nazwy wszystkich plikÃŗw, ktÃŗrych nie moÅŧna naprawić, dodając rozszerzenie `.unrecoverable`. Przed naprawą, cała macierz jest skanowana w celu znalezienia wszelkich plikÃŗw przeniesionych od ostatniej operacji `sync`. Pliki te są identyfikowane na podstawie ich znacznika czasu, ignorując ich nazwę i katalog, i są uÅŧywane w procesie odzyskiwania, jeśli to konieczne. Jeśli przeniosłeś niektÃŗre z nich poza macierz, moÅŧesz uÅŧyć opcji -i, --import, aby określić dodatkowe katalogi do skanowania. Pliki są identyfikowane tylko po ścieÅŧce, a nie po inode. Plik `content` NIE jest modyfikowany. Pliki `parity` są modyfikowane w razie potrzeby. Pliki w macierzy są modyfikowane w razie potrzeby. 5.10 check ---------- Weryfikuje wszystkie pliki i dane parzystości. Działa jak `fix`, ale tylko symuluje odzyskiwanie i Åŧadne zmiany nie są zapisywane w macierzy. To polecenie jest przeznaczone gÅ‚Ãŗwnie do ręcznej weryfikacji, takiej jak po procesie odzyskiwania lub w innych specjalnych warunkach. Do okresowych i zaplanowanych sprawdzeń uÅŧyj `scrub`. Jeśli uÅŧyjesz opcji -a, --audit-only, sprawdzane są tylko dane pliku, a dane parzystości są ignorowane, co zapewnia szybsze działanie. Pliki są identyfikowane tylko po ścieÅŧce, a nie po inode. Nic nie jest modyfikowane. 5.11 list --------- Wyświetla listę wszystkich plikÃŗw zawartych w macierzy w momencie ostatniej `sync`. Z -v lub --verbose, wyświetlany jest rÃŗwnieÅŧ czas z dokładnością do podsekundy. Nic nie jest modyfikowane. 5.12 dup -------- Wyświetla listę wszystkich zduplikowanych plikÃŗw. Dwa pliki są uwaÅŧane za rÃŗwne, jeśli ich hasze pasują. Dane pliku nie są odczytywane; uÅŧywane są tylko wcześniej obliczone hasze. Nic nie jest modyfikowane. 5.13 pool --------- Tworzy lub aktualizuje wirtualny widok wszystkich plikÃŗw w Twojej macierzy dyskÃŗw w katalogu `pooling`. Pliki nie są kopiowane, ale linkowane za pomocą dowiązań symbolicznych. Podczas aktualizacji, wszystkie istniejące dowiązania symboliczne i puste podkatalogi są usuwane i zastępowane nowym widokiem macierzy. Wszelkie inne zwykłe pliki pozostają na swoim miejscu. Nic nie jest modyfikowane poza katalogiem puli. 5.14 devices ------------ Wyświetla urządzenia niskiego poziomu uÅŧywane przez macierz. To polecenie wyświetla skojarzenia urządzeń w macierzy i jest przeznaczone gÅ‚Ãŗwnie jako interfejs skryptowy. Pierwsze dwie kolumny to identyfikator i ścieÅŧka urządzenia niskiego poziomu. Następne dwie kolumny to identyfikator i ścieÅŧka urządzenia wysokiego poziomu. Ostatnia kolumna to nazwa dysku w macierzy. W większości przypadkÃŗw masz jedno urządzenie niskiego poziomu dla kaÅŧdego dysku w macierzy, ale w niektÃŗrych bardziej złoÅŧonych konfiguracjach moÅŧesz mieć wiele urządzeń niskiego poziomu uÅŧywanych przez pojedynczy dysk w macierzy. Nic nie jest modyfikowane. 5.15 touch ---------- Ustawia arbitralny znacznik czasu z dokładnością do podsekundy dla wszystkich plikÃŗw, ktÃŗre mają go ustawiony na zero. Poprawia to zdolność SnapRAID do rozpoznawania przeniesionych i skopiowanych plikÃŗw, poniewaÅŧ sprawia, Åŧe znacznik czasu jest prawie unikalny, redukując moÅŧliwe duplikaty. Dokładniej, jeśli znacznik czasu z dokładnością do podsekundy nie jest zerowy, przeniesiony lub skopiowany plik jest identyfikowany jako taki, jeśli pasuje do nazwy, rozmiaru i znacznika czasu. Jeśli znacznik czasu z dokładnością do podsekundy jest zerowy, jest uwaÅŧany za kopię tylko wtedy, gdy pasują pełna ścieÅŧka, rozmiar i znacznik czasu. Znacznik czasu z dokładnością do sekundy nie jest modyfikowany, więc wszystkie daty i czasy Twoich plikÃŗw zostaną zachowane. 5.16 rehash ----------- Planuje ponowne haszowanie całej macierzy. To polecenie zmienia uÅŧywany rodzaj hasza, zazwyczaj podczas aktualizacji z systemu 32-bitowego na 64-bitowy, aby przełączyć się z MurmurHash3 na szybszy SpookyHash. Jeśli uÅŧywasz juÅŧ optymalnego hasza, to polecenie nic nie robi i informuje Cię, Åŧe nie jest potrzebne Åŧadne działanie. Ponowne haszowanie nie jest wykonywane natychmiast, ale odbywa się stopniowo podczas `sync` i `scrub`. MoÅŧesz sprawdzić stan ponownego haszowania za pomocą `status`. Podczas ponownego haszowania SnapRAID zachowuje pełną funkcjonalność, z jedynym wyjątkiem, Åŧe `dup` nie moÅŧe wykryć zduplikowanych plikÃŗw uÅŧywających innego hasza. 5.17 locate ----------- Lokalizuje pliki zapisane na dyskach parzystości. Dla kaÅŧdego dopasowanego pliku wypisuje jego lokalizację w pliku parzystości oraz liczbę zajmowanych przez niego fragmentÃŗw. MoÅŧesz uÅŧyć opcji -t, --tail, aby ograniczyć operację do plikÃŗw zajmujących określoną końcową część parzystości. Jeśli chcesz dokonać realokacji tych plikÃŗw, moÅŧesz uÅŧyć opcji -W, --force-realloc-tail. Pamiętaj, Åŧe takie pliki nie będą chronione przez parzystość podczas procesu realokacji. 6 OPTIONS ========= SnapRAID udostępnia następujące opcje: -c, --conf CONFIG Wybiera plik konfiguracyjny do uÅŧycia. Jeśli nie określono, w systemie Unix uÅŧywa pliku `/usr/local/etc/snapraid.conf`, jeśli istnieje, w przeciwnym razie `/etc/snapraid.conf`. W systemie Windows uÅŧywa pliku `snapraid.conf` w tym samym katalogu co `snapraid.exe`. -f, --filter PATTERN Filtruje pliki do przetworzenia w `check` i `fix`. Przetwarzane są tylko pliki pasujące do określonego wzorca. Ta opcja moÅŧe być uÅŧywana wielokrotnie. Zobacz sekcję PATTERN, aby uzyskać więcej szczegÃŗÅ‚Ãŗw na temat specyfikacji wzorcÃŗw. W systemie Unix upewnij się, Åŧe znaki globbing są cytowane, jeśli są uÅŧywane. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. Nie moÅŧe być uÅŧywana z `sync` i `scrub`, poniewaÅŧ zawsze przetwarzają całą macierz. -d, --filter-disk NAME Filtruje dyski do przetworzenia w `check`, `fix`, `up` i `down`. Musisz określić nazwę dysku zdefiniowaną w pliku konfiguracyjnym. MoÅŧesz rÃŗwnieÅŧ określić dyski parzystości za pomocą nazw: `parity`, `2-parity`, `3-parity`, itp., aby ograniczyć operacje do określonego dysku parzystości. Jeśli połączysz wiele opcji --filter, --filter-disk i --filter-missing, wybrane zostaną tylko pliki pasujące do wszystkich filtrÃŗw. Ta opcja moÅŧe być uÅŧywana wielokrotnie. Ta opcja moÅŧe być uÅŧywana tylko z `check`, `fix`, `up` i `down`. Nie moÅŧe być uÅŧywana z `sync` i `scrub`, poniewaÅŧ zawsze przetwarzają całą macierz. -m, --filter-missing Filtruje pliki do przetworzenia w `check` i `fix`. Przetwarzane są tylko pliki brakujące lub usunięte z macierzy. UÅŧyte z `fix`, działa to jako polecenie `undelete`. Jeśli połączysz wiele opcji --filter, --filter-disk i --filter-missing, wybrane zostaną tylko pliki pasujące do wszystkich filtrÃŗw. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. Nie moÅŧe być uÅŧywana z `sync` i `scrub`, poniewaÅŧ zawsze przetwarzają całą macierz. -e, --filter-error Przetwarza pliki z błędami w `check` i `fix`. Przetwarza tylko pliki, ktÃŗre mają bloki oznaczone cichymi błędami lub błędami wejścia/wyjścia podczas `sync` i `scrub`, jak wymieniono w `status`. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. -p, --plan PERC|bad|new|full Wybiera plan sprawdzania. Jeśli PERC jest wartością numeryczną od 0 do 100, jest interpretowany jako procent blokÃŗw do sprawdzenia. Zamiast wartości procentowej moÅŧesz określić plan: `bad` sprawdza złe bloki, `new` sprawdza bloki jeszcze niesprawdzone, a `full` sprawdza wszystko. Ta opcja moÅŧe być uÅŧywana tylko z `scrub`. -o, --older-than DAYS Wybiera najstarszą część macierzy do przetworzenia w `scrub`. DAYS to minimalny wiek w dniach dla bloku, ktÃŗry ma być sprawdzony; domyślnie jest to 10. Bloki oznaczone jako złe są zawsze sprawdzane niezaleÅŧnie od tej opcji. Ta opcja moÅŧe być uÅŧywana tylko z `scrub`. -a, --audit-only W `check`, weryfikuje hasz plikÃŗw bez sprawdzania danych parzystości. Jeśli interesuje Cię tylko sprawdzenie danych pliku, ta opcja moÅŧe znacznie przyspieszyć proces sprawdzania. Ta opcja moÅŧe być uÅŧywana tylko z `check`. -h, --pre-hash W `sync`, uruchamia wstępną fazę haszowania wszystkich nowych danych w celu dodatkowej weryfikacji przed obliczeniem parzystości. Zazwyczaj w `sync` nie jest wykonywane wstępne haszowanie, a nowe dane są haszowane tuÅŧ przed obliczeniem parzystości, gdy są odczytywane po raz pierwszy. Ten proces zachodzi, gdy system jest pod duÅŧym obciąÅŧeniem, wszystkie dyski się kręcą, a CPU jest zajęte. Jest to ekstremalny warunek dla maszyny, a jeśli ma ukryty problem sprzętowy, ciche błędy mogą pozostać niewykryte, poniewaÅŧ dane nie są jeszcze haszowane. Aby uniknąć tego ryzyka, moÅŧesz włączyć tryb `pre-hash`, aby wszystkie dane były odczytywane dwukrotnie w celu zapewnienia ich integralności. Ta opcja weryfikuje rÃŗwnieÅŧ pliki przeniesione wewnątrz macierzy, aby upewnić się, Åŧe operacja przeniesienia zakończyła się pomyślnie, i, jeśli to konieczne, umoÅŧliwia uruchomienie operacji fix przed kontynuowaniem. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -i, --import DIR Importuje z określonego katalogu wszelkie pliki usunięte z macierzy po ostatniej `sync`. Jeśli nadal masz takie pliki, mogą być uÅŧyte przez `check` i `fix`, aby poprawić proces odzyskiwania. Pliki są odczytywane, w tym w podkatalogach, i są identyfikowane niezaleÅŧnie od ich nazwy. Ta opcja moÅŧe być uÅŧywana tylko z `check` i `fix`. -s, --spin-down-on-error W przypadku kaÅŧdego błędu, zatrzymuje wszystkie zarządzane dyski przed wyjściem z niezerowym kodem statusu. Zapobiega to pozostawaniu dyskÃŗw aktywnymi i kręcącymi się po przerwanej operacji, pomagając uniknąć niepotrzebnego gromadzenia się ciepła i zuÅŧycia energii. UÅŧyj tej opcji, aby upewnić się, Åŧe dyski są bezpiecznie zatrzymane, nawet gdy polecenie zakończy się niepowodzeniem. -w, --bw-limit RATE Stosuje globalne ograniczenie przepustowości dla wszystkich dyskÃŗw. RATE to liczba bajtÃŗw na sekundę. MoÅŧesz określić mnoÅŧnik, taki jak K, M lub G (np. --bw-limit 1G). -t, --tail ROZMIAR Ogranicza listę plikÃŗw do tych, ktÃŗre nie uÅŧywają więcej niÅŧ określony końcowy rozmiar dyskÃŗw parzystości. MoÅŧesz uÅŧyć mnoÅŧnikÃŗw takich jak K, M, G lub T (np. --tail 1G). Opcja ta jest waÅŧna tylko wtedy, gdy jest uÅŧywana wraz z poleceniem `locate`. -A, --stats Włącza rozszerzony widok statusu, ktÃŗry pokazuje dodatkowe informacje. Ekran wyświetla dwa wykresy: Pierwszy wykres pokazuje liczbę buforowanych paskÃŗw dla kaÅŧdego dysku, wraz ze ścieÅŧką pliku, do ktÃŗrego aktualnie uzyskuje się dostęp na tym dysku. Zazwyczaj najwolniejszy dysk nie będzie miał dostępnego bufora, co determinuje maksymalną osiągalną przepustowość. Drugi wykres pokazuje procent czasu spędzonego na czekaniu w ciągu ostatnich 100 sekund. Oczekuje się, Åŧe najwolniejszy dysk spowoduje większość czasu oczekiwania, podczas gdy inne dyski powinny mieć niewielki lub Åŧaden czas oczekiwania, poniewaÅŧ mogą uÅŧywać swoich buforowanych paskÃŗw. Ten wykres pokazuje rÃŗwnieÅŧ czas spędzony na czekaniu na obliczenia hasza i obliczenia RAID. Wszystkie obliczenia są wykonywane rÃŗwnolegle z operacjami dyskowymi. Dlatego, dopÃŗki istnieje mierzalny czas oczekiwania dla przynajmniej jednego dysku, oznacza to, Åŧe CPU jest wystarczająco szybkie, aby nadąÅŧyć za obciąÅŧeniem. -Z, --force-zero Wymusza niebezpieczną operację synchronizacji pliku o zerowym rozmiarze, ktÃŗry wcześniej był niezerowy. Jeśli SnapRAID wykryje taki stan, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to łatwo wykryć, kiedy po awarii systemu niektÃŗre dostępne pliki zostały obcięte. Jest to moÅŧliwy stan w systemie Linux z systemami plikÃŗw ext3/ext4. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -E, --force-empty Wymusza niebezpieczną operację synchronizacji dysku z brakującymi wszystkimi oryginalnymi plikami. Jeśli SnapRAID wykryje, Åŧe brakuje wszystkich plikÃŗw pierwotnie obecnych na dysku lub zostały przepisane, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to łatwo wykryć, kiedy system plikÃŗw danych nie jest zamontowany. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -U, --force-uuid Wymusza niebezpieczną operację synchronizacji, sprawdzania i naprawiania z dyskami, ktÃŗre zmieniły swÃŗj UUID. Jeśli SnapRAID wykryje, Åŧe niektÃŗre dyski zmieniły UUID, zatrzymuje przetwarzanie, chyba Åŧe określisz tę opcję. Pozwala to wykryć, kiedy Twoje dyski są zamontowane w niewłaściwych punktach montowania. Dozwolona jest jednak pojedyncza zmiana UUID z pojedynczą parzystością i więcej z wielokrotną parzystością, poniewaÅŧ jest to normalny przypadek podczas wymiany dyskÃŗw po odzyskaniu. Ta opcja moÅŧe być uÅŧywana tylko z `sync`, `check` lub `fix`. -D, --force-device Wymusza niebezpieczną operację naprawiania z niedostępnymi dyskami lub z dyskami na tym samym urządzeniu fizycznym. Na przykład, jeśli straciłeś dwa dyski danych i masz zapasowy dysk do odzyskania tylko pierwszego, moÅŧesz zignorować drugi niedostępny dysk. Lub, jeśli chcesz odzyskać dysk w wolnym miejscu pozostawionym na juÅŧ uÅŧywanym dysku, wspÃŗÅ‚dzielącym to samo urządzenie fizyczne. Ta opcja moÅŧe być uÅŧywana tylko z `fix`. -N, --force-nocopy W `sync`, `check` i `fix`, wyłącza heurystykę wykrywania kopii. Bez tej opcji SnapRAID zakłada, Åŧe pliki o tych samych atrybutach, takich jak nazwa, rozmiar i znacznik czasu, są kopiami z tymi samymi danymi. Pozwala to na identyfikację skopiowanych lub przeniesionych plikÃŗw z jednego dysku na inny i ponowne wykorzystanie juÅŧ obliczonych informacji o haszu w celu wykrycia cichych błędÃŗw lub odzyskania brakujących plikÃŗw. W niektÃŗrych rzadkich przypadkach to zachowanie moÅŧe prowadzić do fałszywych alarmÃŗw lub spowolnienia procesu z powodu wielu weryfikacji hasza, a ta opcja pozwala rozwiązać takie problemy. Ta opcja moÅŧe być uÅŧywana tylko z `sync`, `check` i `fix`. -F, --force-full W `sync`, wymusza pełne ponowne obliczenie parzystości. Ta opcja moÅŧe być uÅŧywana, gdy dodajesz nowy poziom parzystości lub jeśli powrÃŗciłeś do starego pliku zawartości, uÅŧywając nowszych danych parzystości. Zamiast ponownego tworzenia parzystości od podstaw, pozwala to na ponowne wykorzystanie haszy obecnych w pliku zawartości do walidacji danych i utrzymania ochrony danych podczas procesu `sync` za pomocą istniejących danych parzystości. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. -R, --force-realloc W `sync`, wymusza pełną realokację plikÃŗw i przebudowę parzystości. Ta opcja moÅŧe być uÅŧywana do całkowitej realokacji wszystkich plikÃŗw, usuwając fragmentację, jednocześnie ponownie wykorzystując hasze obecne w pliku zawartości do walidacji danych. Ta opcja moÅŧe być uÅŧywana tylko z `sync`. OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby jej nie uÅŧywać. NIE MASZ ochrony danych podczas operacji `sync`. -W, --force-realloc-tail ROZMIAR Działa jak -R, --force-realloc, ale ogranicza się do określonej części końcowej (ostatnie ROZMIAR bajtÃŗw) kaÅŧdego pliku parzystości. Wymusza realokację (przeniesienie) wszelkich fragmentÃŗw/blokÃŗw plikÃŗw obecnie przechowywanych w tej sekcji końcowej, pozwalając na ich umieszczenie w dowolnym miejscu w pliku (plikach) parzystości, gdzie dostępne jest wolne miejsce (w tym w istniejących lukach). GÅ‚Ãŗwnym celem tej opcji jest zmniejszenie rozmiaru pliku parzystości na dysku. Jeśli realokacja pomyślnie wyczyści całą sekcję końcową (nie pozostaną Åŧadne bloki korzystające z niej), plik parzystości zostanie przycięty, odzyskując nieuÅŧywane miejsce na końcu. MoÅŧesz uÅŧyć mnoÅŧnikÃŗw takich jak K, M, G lub T (np. --force-realloc-tail 1G). MoÅŧesz uÅŧyć locate -t, --tail, aby wcześniej poznać pliki, ktÃŗrych będzie to dotyczyć. OSTRZEÅģENIE! Ta opcja jest przeznaczona wyłącznie dla ekspertÃŗw i zdecydowanie zaleca się jej nie uÅŧywać. Podczas operacji `sync` pliki, ktÃŗrych to dotyczy, NIE mają ochrony danych. -l, --log FILE Zapisuje szczegÃŗÅ‚owy log do określonego pliku. Jeśli ta opcja nie jest określona, nieoczekiwane błędy są drukowane na ekranie, potencjalnie prowadząc do nadmiernego wyjścia w przypadku wielu błędÃŗw. Gdy -l, --log jest określone, tylko krytyczne błędy, ktÃŗre powodują zatrzymanie SnapRAID, są drukowane na ekranie. Jeśli ścieÅŧka zaczyna się od `>>`, plik jest otwierany w trybie dołączania. Wystąpienia `%D` i `%T` w nazwie są zastępowane datą i czasem w formacie RRRRMMDD i GGMMSS. W plikach wsadowych Windows musisz podwoić znak `%`, np. result-%%D.log. Aby uÅŧyć `>>`, musisz ujęć nazwę w cudzysÅ‚Ãŗw, np. `">>result.log"`. Aby wyprowadzić log do standardowego wyjścia lub standardowego błędu, moÅŧesz uÅŧyć odpowiednio `">&1"` i `">&2"`. Opisy tagÃŗw logu znajdziesz w pliku snapraid_log.txt lub na stronie podręcznika. -L, --error-limit NUMBER Ustawia nowy limit błędÃŗw przed zatrzymaniem wykonania. Domyślnie SnapRAID zatrzymuje się, jeśli napotka więcej niÅŧ 100 błędÃŗw wejścia/wyjścia, co wskazuje, Åŧe dysk prawdopodobnie ulega awarii. Ta opcja dotyczy `sync` i `scrub`, ktÃŗre mogą kontynuować po pierwszym zestawie błędÃŗw dysku, aby sprÃŗbować ukończyć swoje operacje. Jednak `check` i `fix` zawsze zatrzymują się przy pierwszym błędzie. -S, --start BLKSTART Zaczyna przetwarzanie od określonego numeru bloku. MoÅŧe to być przydatne do ponownej prÃŗby sprawdzenia lub naprawy określonych blokÃŗw w przypadku uszkodzonego dysku. Ta opcja jest przeznaczona gÅ‚Ãŗwnie do zaawansowanego ręcznego odzyskiwania. -B, --count BLKCOUNT Przetwarza tylko określoną liczbę blokÃŗw. Ta opcja jest przeznaczona gÅ‚Ãŗwnie do zaawansowanego ręcznego odzyskiwania. -C, --gen-conf CONTENT Generuje atrapę pliku konfiguracyjnego z istniejącego pliku zawartości. Plik konfiguracyjny jest zapisywany na standardowe wyjście i nie nadpisuje istniejącego. Ten plik konfiguracyjny zawiera rÃŗwnieÅŧ informacje potrzebne do rekonstrukcji punktÃŗw montowania dyskÃŗw na wypadek utraty całego systemu. -v, --verbose Wyświetla więcej informacji na ekranie. Jeśli określono raz, drukuje wykluczone pliki i dodatkowe statystyki. Ta opcja nie ma wpływu na pliki logÃŗw. -q, --quiet Wyświetla mniej informacji na ekranie. Jeśli określono raz, usuwa pasek postępu; dwa razy, bieÅŧące operacje; trzy razy, komunikaty informacyjne; cztery razy, komunikaty statusu. Krytyczne błędy są zawsze drukowane na ekranie. Ta opcja nie ma wpływu na pliki logÃŗw. -H, --help Wyświetla krÃŗtki ekran pomocy. -V, --version Wyświetla wersję programu. 7 CONFIGURATION =============== SnapRAID wymaga pliku konfiguracyjnego, aby wiedzieć, gdzie znajduje się Twoja macierz dyskÃŗw i gdzie przechowywać informacje o parzystości. W systemie Unix uÅŧywa pliku `/usr/local/etc/snapraid.conf`, jeśli istnieje, w przeciwnym razie `/etc/snapraid.conf`. W systemie Windows uÅŧywa pliku `snapraid.conf` w tym samym katalogu co `snapraid.exe`. Musi zawierać następujące opcje (uwzględniające wielkość liter): 7.1 parity FILE [,FILE] ... --------------------------- Definiuje pliki do uÅŧycia do przechowywania informacji o parzystości. Parzystość umoÅŧliwia ochronę przed awarią pojedynczego dysku, podobnie jak w RAID5. MoÅŧesz określić wiele plikÃŗw, ktÃŗre muszą znajdować się na rÃŗÅŧnych dyskach. Gdy plik nie moÅŧe juÅŧ rosnąć, uÅŧywany jest następny. Całkowita dostępna przestrzeń musi być co najmniej tak duÅŧa jak największy dysk danych w macierzy. MoÅŧesz dodać dodatkowe pliki parzystości pÃŗÅēniej, ale nie moÅŧesz ich zmieniać kolejności ani usuwać. Trzymanie dyskÃŗw parzystości zarezerwowanych dla parzystości zapewnia, Åŧe nie ulegną fragmentacji, co poprawia wydajność. W systemie Windows 256 MB jest pozostawione niewykorzystane na kaÅŧdym dysku, aby uniknąć ostrzeÅŧenia o pełnych dyskach. Ta opcja jest obowiązkowa i moÅŧe być uÅŧywana tylko raz. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- Definiuje pliki do uÅŧycia do przechowywania dodatkowych informacji o parzystości. Dla kaÅŧdego określonego poziomu parzystości włączany jest jeden dodatkowy poziom ochrony: * 2-parity włącza podwÃŗjną parzystość RAID6. * 3-parity włącza potrÃŗjną parzystość. * 4-parity włącza poczwÃŗrną (cztery) parzystość. * 5-parity włącza pięciokrotną (pięć) parzystość. * 6-parity włącza sześciokrotną (sześć) parzystość. KaÅŧdy poziom parzystości wymaga obecności wszystkich poprzednich poziomÃŗw parzystości. Obowiązują te same uwagi, co dla opcji `parity`. Te opcje są opcjonalne i mogą być uÅŧywane tylko raz. 7.3 z-parity FILE [,FILE] ... ----------------------------- Definiuje alternatywny plik i format do przechowywania potrÃŗjnej parzystości. Ta opcja jest alternatywą dla `3-parity`, przeznaczoną gÅ‚Ãŗwnie dla procesorÃŗw niskiej klasy, takich jak ARM lub AMD Phenom, Athlon i Opteron, ktÃŗre nie obsługują zestawu instrukcji SSSE3. W takich przypadkach zapewnia lepszą wydajność. Ten format jest podobny, ale szybszy niÅŧ ten uÅŧywany przez ZFS RAIDZ3. Podobnie jak ZFS, nie działa powyÅŧej potrÃŗjnej parzystości. Podczas uÅŧywania `3-parity` zostaniesz ostrzeÅŧony, jeśli zaleca się uÅŧycie formatu `z-parity` w celu poprawy wydajności. MoÅŧliwa jest konwersja z jednego formatu na inny poprzez dostosowanie pliku konfiguracyjnego z poÅŧądanym plikiem z-parity lub 3-parity i uÅŧycie `fix` do jego ponownego utworzenia. 7.4 content FILE ---------------- Definiuje plik do uÅŧycia do przechowywania listy i sum kontrolnych wszystkich plikÃŗw obecnych w Twojej macierzy dyskÃŗw. MoÅŧe być umieszczony na dysku uÅŧywanym do danych, parzystości lub kaÅŧdym innym dostępnym dysku. Jeśli uÅŧyjesz dysku danych, ten plik jest automatycznie wykluczony z procesu `sync`. Ta opcja jest obowiązkowa i moÅŧe być uÅŧywana wielokrotnie do zapisania wielu kopii tego samego pliku. Musisz przechowywać co najmniej jedną kopię dla kaÅŧdego uÅŧywanego dysku parzystości plus jeden. UÅŧywanie dodatkowych kopii nie szkodzi. 7.5 data NAME DIR ----------------- Definiuje nazwę i punkt montowania dyskÃŗw danych w macierzy. NAME słuÅŧy do identyfikacji dysku i musi być unikalna. DIR to punkt montowania dysku w systemie plikÃŗw. MoÅŧesz zmieniać punkt montowania w razie potrzeby, o ile zachowasz stałą nazwę NAME. Powinieneś uÅŧyć jednej opcji dla kaÅŧdego dysku danych w macierzy. MoÅŧesz pÃŗÅēniej zmienić nazwę dysku, zmieniając bezpośrednio nazwę NAME w pliku konfiguracyjnym, a następnie uruchamiając polecenie `sync`. W przypadku zmiany nazwy, skojarzenie odbywa się za pomocą zapisanego UUID dyskÃŗw. 7.6 extra NAME DIR ------------------ Definiuje nazwę i punkt montowania dodatkowych dyskÃŗw do monitorowania za pomocą poleceń `smart` oraz `probe`. Jest to przydatne do monitorowania dyskÃŗw, ktÃŗre nie są częścią macierzy, ale są wymagane do funkcjonowania systemu, takich jak dysk rozruchowy. NaleÅŧy zauwaÅŧyć, Åŧe polecenia `up` i `down` nie mają wpływu na takie dyski, poniewaÅŧ oczekuje się, Åŧe będą one zawsze w ruchu. 7.7 nohidden ------------ Wyklucza wszystkie ukryte pliki i katalogi. W systemie Unix ukryte pliki to te zaczynające się od `.`. W systemie Windows są to te z atrybutem ukrycia. 7.8 exclude/include PATTERN --------------------------- Definiuje wzorce plikÃŗw lub katalogÃŗw do wykluczenia lub włączenia do procesu synchronizacji. Wszystkie wzorce są przetwarzane w określonej kolejności. Jeśli pierwszy pasujący wzorzec jest `exclude`, plik jest wykluczony. Jeśli jest to `include`, plik jest włączony. Jeśli Åŧaden wzorzec nie pasuje, plik jest wykluczony, jeśli ostatni określony wzorzec to `include`, lub włączony, jeśli ostatni określony wzorzec to `exclude`. Zobacz sekcję PATTERN, aby uzyskać więcej szczegÃŗÅ‚Ãŗw na temat specyfikacji wzorcÃŗw. Ta opcja moÅŧe być uÅŧywana wielokrotnie. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- Definiuje podstawowy rozmiar bloku w kibibajtach dla parzystości. Jeden kibibajt to 1024 bajty. Domyślny rozmiar bloku to 256, co powinno działać w większości przypadkÃŗw. OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, będziesz musiał ponownie utworzyć całą parzystość! Powodem uÅŧycia innego rozmiaru bloku jest posiadanie wielu małych plikÃŗw, rzędu milionÃŗw. Dla kaÅŧdego pliku, nawet jeśli ma tylko kilka bajtÃŗw, alokowany jest cały blok parzystości, a przy wielu plikach moÅŧe to skutkować znaczną nieuÅŧywaną przestrzenią parzystości. Kiedy całkowicie wypełnisz dysk parzystości, nie moÅŧesz dodawać więcej plikÃŗw do dyskÃŗw danych. Jednak marnowana parzystość nie gromadzi się na dyskach danych. Marnowane miejsce wynikające z duÅŧej liczby plikÃŗw na dysku danych ogranicza tylko ilość danych na tym dysku danych, a nie na innych. Jako przybliÅŧenie, moÅŧesz załoÅŧyć, Åŧe połowa rozmiaru bloku jest marnowana dla kaÅŧdego pliku. Na przykład, z 100 000 plikÃŗw i rozmiarem bloku 256 KiB, zmarnujesz 12,8 GB parzystości, co moÅŧe skutkować 12,8 GB mniejszą dostępną przestrzenią na dysku danych. MoÅŧesz sprawdzić ilość zmarnowanego miejsca na kaÅŧdym dysku za pomocą `status`. Jest to ilość miejsca, ktÃŗrą musisz pozostawić wolną na dyskach danych lub uÅŧyć dla plikÃŗw nie włączonych do macierzy. Jeśli ta wartość jest ujemna, oznacza to, Åŧe jesteś blisko wypełnienia parzystości i reprezentuje to przestrzeń, ktÃŗrą nadal moÅŧesz zmarnować. Aby uniknąć tego problemu, moÅŧesz uÅŧyć większej partycji dla parzystości. Na przykład, jeśli partycja parzystości jest o 12,8 GB większa niÅŧ dyski danych, masz wystarczająco duÅŧo dodatkowego miejsca, aby obsłuÅŧyć do 100 000 plikÃŗw na kaÅŧdym dysku danych bez marnowania miejsca. Sztuczką, aby uzyskać większą partycję parzystości w systemie Linux, jest sformatowanie jej za pomocą polecenia: mkfs.ext4 -m 0 -T largefile4 DEVICE Daje to około 1,5% dodatkowego miejsca, około 60 GB dla dysku 4 TB, co pozwala na około 460 000 plikÃŗw na kaÅŧdym dysku danych bez marnowania miejsca. 7.10 hashsize SIZE_IN_BYTES --------------------------- Definiuje rozmiar hasza w bajtach dla zapisanych blokÃŗw. Domyślny rozmiar hasza to 16 bajtÃŗw (128 bitÃŗw), co powinno działać w większości przypadkÃŗw. OSTRZEÅģENIE! Ta opcja jest tylko dla ekspertÃŗw i jest wysoce zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, będziesz musiał ponownie utworzyć całą parzystość! Powodem uÅŧycia innego rozmiaru hasza jest to, Åŧe TwÃŗj system ma ograniczoną pamięć. Z reguły, SnapRAID zwykle wymaga 1 GiB pamięci RAM na kaÅŧde 16 TB danych w macierzy. Konkretnie, aby przechowywać hasze danych, SnapRAID wymaga około TS*(1+HS)/BS bajtÃŗw pamięci RAM, gdzie TS to całkowity rozmiar w bajtach Twojej macierzy dyskÃŗw, BS to rozmiar bloku w bajtach, a HS to rozmiar hasza w bajtach. Na przykład, z 8 dyskami po 4 TB, rozmiarem bloku 256 KiB (1 KiB = 1024 bajty) i rozmiarem hasza 16, otrzymujesz: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB Przełączając się na rozmiar hasza 8, otrzymujesz: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB Przełączając się na rozmiar bloku 512, otrzymujesz: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB Przełączając się zarÃŗwno na rozmiar hasza 8, jak i rozmiar bloku 512, otrzymujesz: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- Automatycznie zapisuje stan podczas synchronizacji lub sprawdzania po przetworzeniu określonej ilości GB. Ta opcja jest przydatna, aby uniknąć ponownego uruchamiania długich poleceń `sync` od zera, jeśli zostaną przerwane przez awarię maszyny lub inne zdarzenie. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Ustawia maksymalną dozwoloną temperaturę dysku w stopniach Celsjusza. Po określeniu, SnapRAID okresowo sprawdza temperaturę wszystkich dyskÃŗw za pomocą narzędzia smartctl. Aktualne temperatury dyskÃŗw są wyświetlane podczas działania SnapRAID. Jeśli ktÃŗrykolwiek dysk przekroczy ten limit, wszystkie operacje zostają zatrzymane, a dyski są zatrzymywane (przechodzą w stan gotowości) na czas zdefiniowany przez opcję `temp_sleep`. Po okresie uśpienia, operacje są wznawiane, potencjalnie ponownie zatrzymując się, jeśli limit temperatury zostanie ponownie osiągnięty. Podczas działania SnapRAID analizuje rÃŗwnieÅŧ krzywą nagrzewania kaÅŧdego dysku i szacuje długoterminową stałą temperaturę, ktÃŗrą mają osiągnąć, jeśli aktywność będzie kontynuowana. Oszacowanie jest wykonywane tylko po czterokrotnym wzroście temperatury dysku, co zapewnia, Åŧe dostępnych jest wystarczająco duÅŧo punktÃŗw danych do ustalenia wiarygodnego trendu. Ta przewidywana stała temperatura jest pokazywana w nawiasach obok aktualnej wartości i pomaga ocenić, czy chłodzenie systemu jest odpowiednie. Ta szacowana temperatura ma charakter wyłącznie informacyjny i nie ma wpływu na zachowanie SnapRAID. Działania programu opierają się wyłącznie na faktycznie zmierzonych temperaturach dyskÃŗw. Aby wykonać tę analizę, SnapRAID potrzebuje odniesienia dla temperatury systemu. Najpierw prÃŗbuje odczytać ją z dostępnych czujnikÃŗw sprzętowych. Jeśli nie moÅŧna uzyskać dostępu do Åŧadnego czujnika systemu, jako awaryjne odniesienie wykorzystuje najniÅŧszą temperaturę dysku zmierzoną na początku uruchomienia. Normalnie SnapRAID pokazuje tylko temperaturę najgorętszego dysku. Aby wyświetlić temperaturę wszystkich dyskÃŗw, uÅŧyj opcji -A lub --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Ustawia czas gotowości, w minutach, po osiągnięciu limitu temperatury. W tym okresie dyski pozostają zatrzymane. Domyślnie jest to 5 minut. 7.14 pool DIR ------------- Definiuje katalog puli, w ktÃŗrym tworzony jest wirtualny widok macierzy dyskÃŗw za pomocą polecenia `pool`. Katalog musi juÅŧ istnieć. 7.15 share UNC_DIR ------------------ Definiuje ścieÅŧkę UNC Windows wymaganą do zdalnego dostępu do dyskÃŗw. Jeśli ta opcja jest określona, dowiązania symboliczne utworzone w katalogu puli uÅŧywają tej ścieÅŧki UNC do dostępu do dyskÃŗw. Bez tej opcji generowane dowiązania symboliczne uÅŧywają tylko ścieÅŧek lokalnych, co nie pozwala na udostępnianie katalogu puli w sieci. Dowiązania symboliczne są tworzone przy uÅŧyciu określonej ścieÅŧki UNC, dodając nazwę dysku określoną w opcji `data`, a na końcu dodając katalog i nazwę pliku. Ta opcja jest wymagana tylko dla systemu Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ Definiuje niestandardowe opcje smartctl do uzyskania atrybutÃŗw SMART dla kaÅŧdego dysku. MoÅŧe to być wymagane dla kontrolerÃŗw RAID i niektÃŗrych dyskÃŗw USB, ktÃŗrych nie moÅŧna wykryć automatycznie. Symbol zastępczy %s jest zastępowany nazwą urządzenia, ale jest opcjonalny dla stałych urządzeń, takich jak kontrolery RAID. DISK to ta sama nazwa dysku określona w opcji `data`. PARITY to jedna z nazw parzystości: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` lub `z-parity`. W określonych OPCJACH ciąg `%s` jest zastępowany nazwą urządzenia. W przypadku kontrolerÃŗw RAID, urządzenie jest prawdopodobnie stałe i moÅŧe nie być konieczne uÅŧycie `%s`. Zapoznaj się z dokumentacją smartmontools, aby uzyskać moÅŧliwe opcje: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices Na przykład: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignoruje określony atrybut SMART podczas obliczania prawdopodobieństwa awarii dysku. Ta opcja jest przydatna, jeśli dysk zgłasza nietypowe lub wprowadzające w błąd wartości dla określonego atrybutu. DISK to ta sama nazwa dysku określona w opcji `data`. PARITY to jedna z nazw parzystości: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` lub `z-parity`. Specjalna wartość * moÅŧe być uÅŧyta do zignorowania atrybutu na wszystkich dyskach. Na przykład, aby zignorować atrybut `Current Pending Sector Count` na wszystkich dyskach: smartignore * 197 Aby zignorować go tylko na pierwszym dysku parzystości: smartignore parity 197 7.18 Examples ------------- Przykład typowej konfiguracji dla systemu Unix: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Przykład typowej konfiguracji dla systemu Windows: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= Wzorce zapewniają elastyczny sposÃŗb filtrowania plikÃŗw do uwzględnienia lub wykluczenia. UÅŧywając znakÃŗw globbingowych, moÅŧna zdefiniować reguły, ktÃŗre pasują do określonych nazw plikÃŗw lub całych struktur katalogÃŗw bez ręcznego wymieniania kaÅŧdej ścieÅŧki. Znak zapytania `?` dopasowuje dowolny pojedynczy znak z wyjątkiem separatora katalogÃŗw. Dzięki temu jest przydatny do dopasowywania nazw plikÃŗw ze zmiennymi znakami, przy jednoczesnym ograniczeniu wzorca do jednego poziomu katalogu. Pojedyncza gwiazdka `*` dopasowuje dowolną sekwencję znakÃŗw, ale podobnie jak znak zapytania, nigdy nie przekracza granic katalogÃŗw. Zatrzymuje się na ukośniku, co czyni ją odpowiednią do dopasowywania w obrębie jednego składnika ścieÅŧki. Jest to standardowe zachowanie symboli wieloznacznych znane z globbingu powłoki (shell). PodwÃŗjna gwiazdka `**` jest potęÅŧniejsza, dopasowuje dowolną sekwencję znakÃŗw, w tym separatory katalogÃŗw. Pozwala to wzorcom dopasowywać się na wielu poziomach katalogÃŗw. Gdy `**` pojawia się bezpośrednio wewnątrz wzorca, moÅŧe dopasować zero lub więcej znakÃŗw, w tym ukośniki między otaczającym tekstem dosłownym. NajwaÅŧniejszym zastosowaniem `**` jest specjalna forma `/**/`. Dopasowuje ona zero lub więcej pełnych poziomÃŗw katalogÃŗw, umoÅŧliwiając dopasowanie plikÃŗw na dowolnej głębokości w drzewie katalogÃŗw bez znajomości dokładnej struktury ścieÅŧki. Na przykład wzorzec `src/**/main.js` pasuje do `src/main.js` (pomijając zero katalogÃŗw), `src/ui/main.js` (pomijając jeden katalog) oraz `src/ui/components/main.js` (pomijając dwa katalogi). Klasy znakÃŗw uÅŧywające nawiasÃŗw kwadratowych `[]` dopasowują pojedynczy znak z określonego zestawu lub zakresu. Podobnie jak inne wzorce pojedynczych znakÃŗw, nie pasują one do separatorÃŗw katalogÃŗw. Klasy obsługują zakresy i negację za pomocą wykrzyknika. Podstawową rÃŗÅŧnicą, o ktÃŗrej naleÅŧy pamiętać, jest to, Åŧe `*`, `?` i klasy znakÃŗw wszystkie respektują granice katalogÃŗw i dopasowują się tylko w obrębie jednego składnika ścieÅŧki, podczas gdy `**` jest jedynym wzorcem, ktÃŗry moÅŧe dopasowywać się poprzez separatory katalogÃŗw. Istnieją cztery rÃŗÅŧne typy wzorcÃŗw: FILE Wybiera dowolny plik o nazwie FILE. Ten wzorzec dotyczy tylko plikÃŗw, a nie katalogÃŗw. DIR/ Wybiera dowolny katalog o nazwie DIR i wszystko, co się w nim znajduje. Ten wzorzec dotyczy tylko katalogÃŗw, a nie plikÃŗw. /PATH/FILE Wybiera dokładnie określoną ścieÅŧkę pliku. Ten wzorzec dotyczy tylko plikÃŗw, a nie katalogÃŗw. /PATH/DIR/ Wybiera dokładnie określoną ścieÅŧkę katalogu i wszystko, co się w nim znajduje. Ten wzorzec dotyczy tylko katalogÃŗw, a nie plikÃŗw. Gdy określisz ścieÅŧkę bezwzględną zaczynającą się od /, jest ona stosowana w katalogu gÅ‚Ãŗwnym macierzy, a nie w katalogu gÅ‚Ãŗwnym lokalnego systemu plikÃŗw. W systemie Windows moÅŧesz uÅŧyć ukośnika odwrotnego \ zamiast ukośnika /. Katalogi systemowe Windows, połączenia, punkty montowania i inne specjalne katalogi Windows są traktowane jako pliki, co oznacza, Åŧe aby je wykluczyć, musisz uÅŧyć reguły pliku, a nie katalogu. Jeśli nazwa pliku zawiera znak `*`, `?`, `[`, lub `]`, musisz go uciec, aby uniknąć interpretacji jako znaku globbing. W systemie Unix znakiem ucieczki jest `\`; w systemie Windows jest to `^`. Gdy wzorzec znajduje się w wierszu poleceń, musisz podwoić znak ucieczki, aby uniknąć interpretacji przez powłokę poleceń. W pliku konfiguracyjnym moÅŧesz uÅŧyć rÃŗÅŧnych strategii do filtrowania plikÃŗw do przetworzenia. Najprostszym podejściem jest uÅŧycie tylko reguł `exclude`, aby usunąć wszystkie pliki i katalogi, ktÃŗrych nie chcesz przetwarzać. Na przykład: # Wyklucza dowolny plik o nazwie `*.unrecoverable` exclude *.unrecoverable # Wyklucza katalog gÅ‚Ãŗwny `/lost+found` exclude /lost+found/ # Wyklucza dowolny podkatalog o nazwie `tmp` exclude tmp/ Odwrotnym podejściem jest zdefiniowanie tylko plikÃŗw, ktÃŗre chcesz przetwarzać, uÅŧywając tylko reguł `include`. Na przykład: # Włącza tylko niektÃŗre katalogi include /movies/ include /musics/ include /pictures/ Ostatecznym podejściem jest mieszanie reguł `exclude` i `include`. W tym przypadku kolejność reguł jest waÅŧna. Wcześniejsze reguły mają pierwszeństwo przed pÃŗÅēniejszymi. Aby uprościć, moÅŧesz najpierw wymienić wszystkie reguły `exclude`, a następnie wszystkie reguły `include`. Na przykład: # Wyklucza dowolny plik o nazwie `*.unrecoverable` exclude *.unrecoverable # Wyklucza dowolny podkatalog o nazwie `tmp` exclude tmp/ # Włącza tylko niektÃŗre katalogi include /movies/ include /musics/ include /pictures/ W wierszu poleceń, uÅŧywając opcji -f, moÅŧesz uÅŧyć tylko wzorcÃŗw `include`. Na przykład: # Sprawdza tylko pliki .mp3. # W systemie Unix uÅŧyj cudzysłowÃŗw, aby uniknąć rozszerzenia globbing przez powłokę. snapraid -f "*.mp3" check W systemie Unix, uÅŧywając znakÃŗw globbing w wierszu poleceń, musisz je cytować, aby zapobiec ich rozszerzeniu przez powłokę. 9 IGNORE FILE ============= OprÃŗcz reguł globalnych w pliku konfiguracyjnym, moÅŧesz umieścić pliki `.snapraidignore` w dowolnym katalogu w macierzy, aby zdefiniować zdecentralizowane reguły wykluczania. Reguły zdefiniowane w `.snapraidignore` są stosowane po regułach w pliku konfiguracyjnym. Oznacza to, Åŧe mają one wyÅŧszy priorytet i mogą być uÅŧywane do wykluczania plikÃŗw, ktÃŗre zostały wcześniej uwzględnione przez konfigurację globalną. Skutecznie, jeśli reguła lokalna pasuje, plik jest wykluczany bez względu na globalne ustawienia uwzględniania. Logika wzorcÃŗw w `.snapraidignore` odzwierciedla konfigurację globalną, ale zakotwicza wzorce w katalogu, w ktÃŗrym znajduje się plik: FILE Wybiera dowolny plik o nazwie FILE w tym katalogu lub poniÅŧej. Podlega to tym samym zasadom dopasowywania (globbing) co wzorzec globalny. DIR/ Wybiera dowolny katalog o nazwie DIR i wszystko w jego wnętrzu, znajdujący się w tym katalogu lub poniÅŧej. /PATH/FILE Wybiera dokładnie określony plik względem lokalizacji pliku `.snapraidignore`. /PATH/DIR/ Wybiera dokładnie określony katalog i wszystko w jego wnętrzu, względem lokalizacji pliku `.snapraidignore`. W przeciwieństwie do konfiguracji globalnej, pliki `.snapraidignore` obsługują tylko reguły wykluczania; nie moÅŧna uÅŧywać wzorcÃŗw `include` ani negacji (!). Na przykład, jeśli masz `.snapraidignore` w `/mnt/disk1/projects/`: # Wyklucza TYLKO /mnt/disk1/projects/output.bin /output.bin # Wyklucza kaÅŧdy katalog o nazwie `build` wewnątrz projects/ build/ # Wyklucza kaÅŧdy plik .tmp wewnątrz projects/ lub jego podfolderach *.tmp 10 CONTENT ========== SnapRAID przechowuje listę i sumy kontrolne Twoich plikÃŗw w pliku zawartości. Jest to plik binarny, ktÃŗry zawiera listę wszystkich plikÃŗw obecnych w Twojej macierzy dyskÃŗw, wraz ze wszystkimi sumami kontrolnymi w celu weryfikacji ich integralności. Ten plik jest odczytywany i zapisywany przez polecenia `sync` i `scrub` oraz odczytywany przez polecenia `fix`, `check` i `status`. 11 PARITY ========= SnapRAID przechowuje informacje o parzystości Twojej macierzy w plikach parzystości. Są to pliki binarne zawierające obliczoną parzystość wszystkich blokÃŗw zdefiniowanych w pliku `content`. Pliki te są odczytywane i zapisywane przez polecenia `sync` i `fix` oraz tylko odczytywane przez polecenia `scrub` i `check`. 12 ENCODING =========== SnapRAID w systemie Unix ignoruje wszelkie kodowanie. Odczytuje i przechowuje nazwy plikÃŗw z tym samym kodowaniem uÅŧywanym przez system plikÃŗw. W systemie Windows wszystkie nazwy odczytane z systemu plikÃŗw są konwertowane i przetwarzane w formacie UTF-8. Aby nazwy plikÃŗw były poprawnie drukowane, musisz ustawić konsolę Windows na tryb UTF-8 za pomocą polecenia `chcp 65001` i uÅŧyć czcionki TrueType, takiej jak `Lucida Console`, jako czcionki konsoli. Dotyczy to tylko drukowanych nazw plikÃŗw; jeśli przekierujesz wyjście konsoli do pliku, wynikowy plik jest zawsze w formacie UTF-8. 13 COPYRIGHT ============ Ten plik jest chroniony prawem autorskim (C) 2025 Andrea Mazzoleni 14 SEE ALSO =========== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-pt.1000066400000000000000000002115431522717156100163360ustar00rootroot00000000000000.TH "SnapRAID Backup para Arrays de Disco" 1 .SH NAME snapraid \- SnapRAID Backup para Arrays de Disco .SH SINOPSE snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIÃ§ÃŖO SnapRAID Ê um programa de backup projetado para arrays de disco, armazenando informaçÃĩes de paridade para recuperaÃ§ÃŖo de dados no caso de atÊ seis falhas de disco. .PP Destinado principalmente a centros de mídia domÊsticos com arquivos grandes e que mudam com pouca frequÃĒncia, o SnapRAID oferece vÃĄrios recursos: .PD 0 .IP \(bu VocÃĒ pode utilizar discos jÃĄ preenchidos com arquivos sem a necessidade de reformatÃĄ\-los, acessando\-os normalmente. .IP \(bu Todos os seus dados sÃŖo submetidos a hash para garantir a integridade dos dados e prevenir corrupÃ§ÃŖo silenciosa. .IP \(bu Quando o nÃēmero de discos com falha excede a contagem de paridade, a perda de dados Ê confinada aos discos afetados; os dados em outros discos permanecem acessíveis. .IP \(bu Se vocÃĒ acidentalmente excluir arquivos em um disco, a recuperaÃ§ÃŖo Ê possível. .IP \(bu Os discos podem ter tamanhos diferentes. .IP \(bu VocÃĒ pode adicionar discos a qualquer momento. .IP \(bu O SnapRAID nÃŖo prende seus dados; vocÃĒ pode parar de usÃĄ\-lo a qualquer momento sem reformatar ou mover dados. .IP \(bu Para acessar um arquivo, apenas um Ãēnico disco precisa girar (spin), economizando energia e reduzindo o ruído. .PD .PP Para mais informaçÃĩes, visite o site oficial do SnapRAID: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITAçÃĩES SnapRAID Ê um híbrido entre um programa RAID e um programa de backup, visando combinar os melhores benefícios de ambos. No entanto, ele tem algumas limitaçÃĩes que vocÃĒ deve considerar antes de usÃĄ\-lo. .PP A principal limitaÃ§ÃŖo Ê que, se um disco falhar e vocÃĒ nÃŖo tiver sincronizado recentemente, talvez nÃŖo consiga recuperar totalmente. Mais especificamente, vocÃĒ pode nÃŖo conseguir recuperar atÊ o tamanho dos arquivos alterados ou excluídos desde a Ãēltima operaÃ§ÃŖo de sincronizaÃ§ÃŖo. Isso ocorre mesmo que os arquivos alterados ou excluídos nÃŖo estejam no disco com falha. É por isso que o SnapRAID Ê mais adequado para dados que raramente mudam. .PP Por outro lado, arquivos recÊm\-adicionados nÃŖo impedem a recuperaÃ§ÃŖo de arquivos jÃĄ existentes. VocÃĒ perderÃĄ apenas os arquivos adicionados recentemente se estiverem no disco com falha. .PP Outras limitaçÃĩes do SnapRAID sÃŖo: .PD 0 .IP \(bu Com o SnapRAID, vocÃĒ ainda tem sistemas de arquivos separados para cada disco. Com o RAID, vocÃĒ obtÊm um Ãēnico sistema de arquivos grande. .IP \(bu O SnapRAID nÃŖo faz striping de dados. Com o RAID, vocÃĒ obtÊm um aumento de velocidade com striping. .IP \(bu O SnapRAID nÃŖo suporta recuperaÃ§ÃŖo em tempo real. Com o RAID, vocÃĒ nÃŖo precisa parar de trabalhar quando um disco falha. .IP \(bu O SnapRAID pode recuperar dados apenas de um nÃēmero limitado de falhas de disco. Com um backup, vocÃĒ pode recuperar de uma falha completa de todo o array de discos. .IP \(bu Apenas nomes de arquivos, carimbos de data/hora, symlinks e hardlinks sÃŖo salvos. PermissÃĩes, propriedade e atributos estendidos nÃŖo sÃŖo salvos. .PD .SH PRIMEIROS PASSOS Para usar o SnapRAID, vocÃĒ precisa primeiro selecionar um disco em seu array de discos para dedicar às informaçÃĩes de \`parity\` (paridade). Com um disco para paridade, vocÃĒ poderÃĄ recuperar de uma Ãēnica falha de disco, semelhante ao RAID5. .PP Se vocÃĒ quiser recuperar de mais falhas de disco, semelhante ao RAID6, vocÃĒ deve reservar discos adicionais para paridade. Cada disco de paridade adicional permite a recuperaÃ§ÃŖo de mais uma falha de disco. .PP Como discos de paridade, vocÃĒ deve escolher os maiores discos do array, pois a informaÃ§ÃŖo de paridade pode crescer atÊ o tamanho do maior disco de dados no array. .PP Esses discos serÃŖo dedicados a armazenar os arquivos de \`parity\`. VocÃĒ nÃŖo deve armazenar seus dados neles. .PP Em seguida, vocÃĒ deve definir os discos de \`data\` (dados) que deseja proteger com o SnapRAID. A proteÃ§ÃŖo Ê mais eficaz se esses discos contiverem dados que raramente mudam. Por esse motivo, Ê melhor NÃO incluir o disco C:\\ do Windows ou os diretÃŗrios /home, /var e /tmp do Unix. .PP A lista de arquivos Ê salva nos arquivos de \`content\` (conteÃēdo), geralmente armazenados nos discos de dados, paridade ou boot. Este arquivo contÊm os detalhes do seu backup, incluindo todos os checksums para verificar sua integridade. O arquivo de \`content\` Ê armazenado em vÃĄrias cÃŗpias, e cada cÃŗpia deve estar em um disco diferente para garantir que, mesmo em caso de mÃēltiplas falhas de disco, pelo menos uma cÃŗpia esteja disponível. .PP Por exemplo, suponha que vocÃĒ esteja interessado em apenas um nível de proteÃ§ÃŖo de paridade, e seus discos estejam localizados em: .PP .RS 4 /mnt/diskp <\- disco selecionado para paridade .PD 0 .PP .PD /mnt/disk1 <\- primeiro disco a proteger .PD 0 .PP .PD /mnt/disk2 <\- segundo disco a proteger .PD 0 .PP .PD /mnt/disk3 <\- terceiro disco a proteger .PD 0 .PD .RE .PP VocÃĒ deve criar o arquivo de configuraÃ§ÃŖo /etc/snapraid.conf com as seguintes opçÃĩes: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Se vocÃĒ estiver no Windows, deve usar o formato de caminho do Windows, com letras de unidade e barras invertidas em vez de barras. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Se vocÃĒ tiver muitos discos e ficar sem letras de unidade, pode montar discos diretamente em subpastas. Consulte: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP Neste ponto, vocÃĒ estÃĄ pronto para executar o comando \`sync\` para construir as informaçÃĩes de paridade. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Este processo pode levar vÃĄrias horas na primeira vez, dependendo do tamanho dos dados jÃĄ presentes nos discos. Se os discos estiverem vazios, o processo Ê imediato. .PP VocÃĒ pode parÃĄ\-lo a qualquer momento pressionando Ctrl+C e, na prÃŗxima execuÃ§ÃŖo, ele serÃĄ retomado de onde foi interrompido. .PP Quando este comando for concluído, seus dados estarÃŖo SEGUROS. .PP Agora vocÃĒ pode começar a usar seu array como quiser e periodicamente atualizar as informaçÃĩes de paridade executando o comando \`sync\`. .SS Scrubbing Para verificar periodicamente os dados e a paridade em busca de erros, vocÃĒ pode executar o comando \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Este comando compara os dados em seu array com o hash calculado durante o comando \`sync\` para verificar a integridade. .PP Cada execuÃ§ÃŖo do comando verifica aproximadamente 8% do array, excluindo dados jÃĄ examinados nos 10 dias anteriores. VocÃĒ pode usar a opÃ§ÃŖo \-p, \-\-plan para especificar uma quantidade diferente e a opÃ§ÃŖo \-o, \-\-older\-than para especificar uma idade diferente em dias. Por exemplo, para verificar 5% do array em busca de blocos com mais de 20 dias, use: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, os blocos correspondentes serÃŖo marcados como ruins no arquivo de \`content\` e listados no comando \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Para corrigi\-los, vocÃĒ pode usar o comando \`fix\`, filtrando por blocos ruins com a opÃ§ÃŖo \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP Na prÃŗxima execuÃ§ÃŖo de \`scrub\`, os erros desaparecerÃŖo do relatÃŗrio de \`status\` se estiverem realmente corrigidos. Para tornÃĄ\-lo mais rÃĄpido, vocÃĒ pode usar \-p bad para examinar apenas blocos marcados como ruins. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP Executar \`scrub\` em um array nÃŖo sincronizado pode relatar erros causados por arquivos removidos ou modificados. Esses erros sÃŖo relatados na saída de \`scrub\`, mas os blocos relacionados nÃŖo sÃŖo marcados como ruins. .SS Pooling Nota: O recurso de pooling descrito abaixo foi substituído pela ferramenta mergerfs, que agora Ê a opÃ§ÃŖo recomendada para usuÃĄrios Linux na comunidade SnapRAID. Mergefs oferece uma maneira mais flexível e eficiente de agrupar vÃĄrias unidades em um Ãēnico ponto de montagem unificado, permitindo acesso perfeito a arquivos em todo o seu array sem depender de links simbÃŗlicos. Ele se integra bem ao SnapRAID para proteÃ§ÃŖo de paridade e Ê comumente usado em configuraçÃĩes como OpenMediaVault (OMV) ou configuraçÃĩes NAS personalizadas. .PP Para ter todos os arquivos em seu array mostrados na mesma ÃĄrvore de diretÃŗrios, vocÃĒ pode habilitar o recurso de \`pooling\`. Ele cria uma visualizaÃ§ÃŖo virtual somente leitura de todos os arquivos em seu array usando links simbÃŗlicos. .PP VocÃĒ pode configurar o diretÃŗrio de \`pooling\` no arquivo de configuraÃ§ÃŖo com: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP ou, se vocÃĒ estiver no Windows, com: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP e, em seguida, executar o comando \`pool\` para criar ou atualizar a visualizaÃ§ÃŖo virtual. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Se vocÃĒ estiver usando uma plataforma Unix e quiser compartilhar este diretÃŗrio pela rede com mÃĄquinas Windows ou Unix, vocÃĒ deve adicionar as seguintes opçÃĩes ao seu /etc/samba/smb.conf: .PP .RS 4 # Na seÃ§ÃŖo global de smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # Na seÃ§ÃŖo de compartilhamento de smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP No Windows, compartilhar links simbÃŗlicos por uma rede requer que os clientes os resolvam remotamente. Para habilitar isso, alÊm de compartilhar o diretÃŗrio do pool, vocÃĒ tambÊm deve compartilhar todos os discos de forma independente, usando os nomes de disco definidos no arquivo de configuraÃ§ÃŖo como pontos de compartilhamento. VocÃĒ tambÊm deve especificar na opÃ§ÃŖo \`share\` do arquivo de configuraÃ§ÃŖo o caminho UNC do Windows que os clientes remotos precisam usar para acessar esses discos compartilhados. .PP Por exemplo, operando a partir de um servidor chamado \`darkstar\`, vocÃĒ pode usar as opçÃĩes: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP e compartilhar os seguintes diretÃŗrios pela rede: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP para permitir que clientes remotos acessem todos os arquivos em \\\\darkstar\\pool. .PP VocÃĒ tambÊm pode precisar configurar clientes remotos para habilitar o acesso a symlinks remotos com o comando: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Desexcluir (Undeleting) O SnapRAID funciona mais como um programa de backup do que como um sistema RAID, e pode ser usado para restaurar ou desexcluir arquivos para seu estado anterior usando a opÃ§ÃŖo \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP ou para um diretÃŗrio: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP VocÃĒ tambÊm pode usÃĄ\-lo para recuperar apenas arquivos excluídos acidentalmente dentro de um diretÃŗrio usando a opÃ§ÃŖo \-m, \-\-filter\-missing, que restaura apenas arquivos ausentes, deixando todos os outros intocados. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP Ou para recuperar todos os arquivos excluídos em todas as unidades com: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recuperando O pior aconteceu e vocÃĒ perdeu um ou mais discos! .PP NÃO ENTRE EM PÂNICO! VocÃĒ serÃĄ capaz de recuperÃĄ\-los! .PP A primeira coisa que vocÃĒ deve fazer Ê evitar mais alteraçÃĩes em seu array de discos. Desabilite quaisquer conexÃĩes remotas a ele e quaisquer processos agendados, incluindo qualquer sincronizaÃ§ÃŖo noturna ou scrub agendado do SnapRAID. .PP Em seguida, prossiga com as seguintes etapas. .SS PASSO 1 \-> Reconfigurar VocÃĒ precisa de algum espaço para recuperar, idealmente em discos sobressalentes adicionais, mas um disco USB externo ou um disco remoto serÃĄ suficiente. .PP Modifique o arquivo de configuraÃ§ÃŖo do SnapRAID para fazer com que a opÃ§ÃŖo \`data\` ou \`parity\` do disco com falha aponte para um local com espaço vazio suficiente para recuperar os arquivos. .PP Por exemplo, se o disco \`d1\` falhou, mude de: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP para: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Se o disco a ser recuperado for um disco de paridade, atualize a opÃ§ÃŖo \`parity\` apropriada. Se vocÃĒ tiver vÃĄrios discos com falha, atualize todas as opçÃĩes de configuraÃ§ÃŖo deles. .SS PASSO 2 \-> Corrigir Execute o comando fix, armazenando o log em um arquivo externo com: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP Onde NAME Ê o nome do disco, como \`d1\` em nosso exemplo anterior. Se o disco a ser recuperado for um disco de paridade, use os nomes \`parity\`, \`2\-parity\`, etc. Se vocÃĒ tiver vÃĄrios discos com falha, use vÃĄrias opçÃĩes \-d para especificar todos eles. .PP Este comando levarÃĄ muito tempo. .PP Certifique\-se de ter alguns gigabytes livres para armazenar o arquivo fix.log. Execute\-o a partir de um disco com espaço livre suficiente. .PP Agora vocÃĒ recuperou tudo o que Ê recuperÃĄvel. Se alguns arquivos estiverem parcialmente ou totalmente irrecuperÃĄveis, eles serÃŖo renomeados adicionando a extensÃŖo \`.unrecoverable\`. .PP VocÃĒ pode encontrar uma lista detalhada de todos os blocos irrecuperÃĄveis no arquivo fix.log, verificando todas as linhas que começam com \`unrecoverable:\`. .PP Se vocÃĒ nÃŖo estiver satisfeito com a recuperaÃ§ÃŖo, pode tentar novamente quantas vezes quiser. .PP Por exemplo, se vocÃĒ removeu arquivos do array apÃŗs a Ãēltima \`sync\`, isso pode resultar em alguns arquivos nÃŖo sendo recuperados. Neste caso, vocÃĒ pode tentar novamente o \`fix\` usando a opÃ§ÃŖo \-i, \-\-import, especificando onde esses arquivos estÃŖo agora para incluí\-los novamente no processo de recuperaÃ§ÃŖo. .PP Se vocÃĒ estiver satisfeito com a recuperaÃ§ÃŖo, pode prosseguir, mas observe que, apÃŗs a sincronizaÃ§ÃŖo, vocÃĒ nÃŖo pode mais tentar o comando \`fix\` novamente! .SS PASSO 3 \-> Checar Como uma verificaÃ§ÃŖo cautelosa, vocÃĒ pode agora executar um comando \`check\` para garantir que tudo esteja correto no disco recuperado. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP Onde NAME Ê o nome do disco, como \`d1\` em nosso exemplo anterior. .PP As opçÃĩes \-d e \-a dizem ao SnapRAID para verificar apenas o disco especificado e ignorar todos os dados de paridade. .PP Este comando levarÃĄ muito tempo, mas se vocÃĒ nÃŖo for excessivamente cauteloso, pode pulÃĄ\-lo. .SS PASSO 4 \-> Sincronizar Execute o comando \`sync\` para ressincronizar o array com o novo disco. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Se tudo for recuperado, este comando Ê imediato. .SH COMANDOS SnapRAID fornece alguns comandos simples que permitem a vocÃĒ: .PD 0 .IP \(bu Imprimir o status do array \-> \`status\` .IP \(bu Controlar os discos \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Fazer um backup/snapshot \-> \`sync\` .IP \(bu Verificar periodicamente os dados \-> \`scrub\` .IP \(bu Restaurar o Ãēltimo backup/snapshot \-> \`fix\`. .PD .PP Os comandos devem ser escritos em letras minÃēsculas. .SS status Imprime um resumo do estado do array de discos. .PP Inclui informaçÃĩes sobre a fragmentaÃ§ÃŖo da paridade, a idade dos blocos sem verificaÃ§ÃŖo e todos os erros silenciosos registrados encontrados durante o scrubbing. .PP As informaçÃĩes apresentadas referem\-se à Ãēltima vez que vocÃĒ executou \`sync\`. ModificaçÃĩes posteriores nÃŖo sÃŖo levadas em conta. .PP Se blocos ruins foram detectados, seus nÃēmeros de bloco sÃŖo listados. Para corrigi\-los, vocÃĒ pode usar o comando \`fix \-e\`. .PP TambÊm mostra um grÃĄfico que representa a Ãēltima vez que cada bloco foi examinado (scrubbed) ou sincronizado (synced). Blocos examinados sÃŖo mostrados com \`*\`, blocos sincronizados, mas ainda nÃŖo examinados, com \`o\`. .PP Nada Ê modificado. .SS smart Imprime um relatÃŗrio SMART de todos os discos no sistema. .PP Inclui uma estimativa da probabilidade de falha no prÃŗximo ano, permitindo que vocÃĒ planeje substituiçÃĩes de manutenÃ§ÃŖo de discos que mostrem atributos suspeitos. .PP Esta estimativa de probabilidade Ê obtida correlacionando os atributos SMART dos discos com os dados do Backblaze disponíveis em: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Se o SMART relatar que um disco estÃĄ falhando, \`FAIL\` ou \`PREFAIL\` Ê impresso para esse disco, e o SnapRAID retorna com um erro. Neste caso, a substituiÃ§ÃŖo imediata do disco Ê altamente recomendada. .PP Outras possíveis strings de status sÃŖo: .RS 4 .PD 0 .HP 4 .I logfail No passado, alguns atributos estavam abaixo do limite. .HP 4 .I logerr O log de erros do dispositivo contÊm erros. .HP 4 .I selferr O log de autoteste do dispositivo contÊm erros. .PD .RE .PP Se a opÃ§ÃŖo \-v, \-\-verbose for especificada, uma anÃĄlise estatística mais profunda Ê fornecida. Esta anÃĄlise pode ajudÃĄ\-lo a decidir se vocÃĒ precisa de mais ou menos paridade. .PP Este comando usa a ferramenta \`smartctl\` e Ê equivalente a executar \`smartctl \-a\` em todos os dispositivos. .PP Se seus dispositivos nÃŖo forem detectados automaticamente corretamente, vocÃĒ pode especificar um comando personalizado usando a opÃ§ÃŖo \`smartctl\` no arquivo de configuraÃ§ÃŖo. .PP Nada Ê modificado. .SS probe Imprime o estado de ENERGIA de todos os discos no sistema. .PP \`Standby\` significa que o disco nÃŖo estÃĄ girando. \`Active\` significa que o disco estÃĄ girando. .PP Este comando usa a ferramenta \`smartctl\` e Ê equivalente a executar \`smartctl \-n standby \-i\` em todos os dispositivos. .PP Se seus dispositivos nÃŖo forem detectados automaticamente corretamente, vocÃĒ pode especificar um comando personalizado usando a opÃ§ÃŖo \`smartctl\` no arquivo de configuraÃ§ÃŖo. .PP Nada Ê modificado. .SS up Liga (spins up) todos os discos do array. .PP VocÃĒ pode ligar apenas discos específicos usando a opÃ§ÃŖo \-d, \-\-filter\-disk. .PP Ligar todos os discos ao mesmo tempo requer muita energia. Certifique\-se de que sua fonte de alimentaÃ§ÃŖo pode suportar isso. .PP Nada Ê modificado. .SS down Desliga (spins down) todos os discos do array. .PP Este comando usa a ferramenta \`smartctl\` e Ê equivalente a executar \`smartctl \-s standby,now\` em todos os dispositivos. .PP VocÃĒ pode desligar apenas discos específicos usando a opÃ§ÃŖo \-d, \-\-filter\-disk. .PP Para desligar automaticamente em caso de erro, vocÃĒ pode usar a opÃ§ÃŖo \-s, \-\-spin\-down\-on\-error com qualquer outro comando, o que Ê equivalente a executar \`down\` manualmente quando ocorre um erro. .PP Nada Ê modificado. .SS diff Lista todos os arquivos modificados desde o Ãēltimo \`sync\` que precisam ter seus dados de paridade recalculados. .PP Este comando nÃŖo verifica os dados do arquivo, mas apenas o carimbo de data/hora, tamanho e inode do arquivo. .PP ApÃŗs listar todos os arquivos alterados, um resumo das alteraçÃĩes Ê apresentado, agrupado por: .RS 4 .PD 0 .HP 4 .I equal Arquivos inalterados de antes. .HP 4 .I added Arquivos adicionados que nÃŖo estavam presentes antes. .HP 4 .I removed Arquivos removidos. .HP 4 .I updated Arquivos com tamanho ou carimbo de data/hora diferente, o que significa que foram modificados. .HP 4 .I moved Arquivos movidos para um diretÃŗrio diferente no mesmo disco. Eles sÃŖo identificados por terem o mesmo nome, tamanho, carimbo de data/hora e inode, mas um diretÃŗrio diferente. .HP 4 .I copied Arquivos copiados no mesmo disco ou em um disco diferente onde o arquivo original ainda existe. Eles sÃŖo identificados por terem o mesmo nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora de subsegundos for zero, o caminho completo deve corresponder para ser identificado, nÃŖo apenas o nome. .HP 4 .I relocated Arquivos movidos no mesmo disco ou em um disco diferente onde o original desapareceu. Eles sÃŖo identificados por terem o mesmo nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora de subsegundos for zero, o caminho completo deve corresponder para ser identificado. Ao contrÃĄrio dos arquivos \'moved\' no mesmo disco, os arquivos realocados tÃĒm um inode diferente. .HP 4 .I restored Arquivos com um inode diferente, mas com diretÃŗrio, nome, tamanho e carimbo de data/hora correspondentes. Geralmente sÃŖo arquivos restaurados apÃŗs serem excluídos. .PD .RE .PP Se uma \`sync\` for necessÃĄria, o cÃŗdigo de retorno do processo Ê 2, em vez do padrÃŖo 0. O cÃŗdigo de retorno 1 Ê usado para uma condiÃ§ÃŖo de erro genÊrica. .PP Nada Ê modificado. .SS sync Atualiza as informaçÃĩes de paridade. Todos os arquivos modificados no array de discos sÃŖo lidos, e os dados de paridade correspondentes sÃŖo atualizados. .PP VocÃĒ pode parar este processo a qualquer momento pressionando Ctrl+C, sem perder o trabalho jÃĄ feito. Na prÃŗxima execuÃ§ÃŖo, o processo \`sync\` serÃĄ retomado de onde foi interrompido. .PP Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, os blocos correspondentes sÃŖo marcados como ruins. .PP Os arquivos sÃŖo identificados por caminho e/ou inode e verificados por tamanho e carimbo de data/hora. Se o tamanho ou carimbo de data/hora do arquivo for diferente, a paridade dos dados Ê recalculada para todo o arquivo. Se o arquivo for movido ou renomeado no mesmo disco, mantendo o mesmo inode, a paridade nÃŖo Ê recalculada. Se o arquivo for movido para outro disco, a paridade Ê recalculada, mas as informaçÃĩes de hash calculadas anteriormente sÃŖo mantidas. .PP Os arquivos \`content\` e \`parity\` sÃŖo modificados se necessÃĄrio. Os arquivos no array NÃO sÃŖo modificados. .SS scrub Examina (scrubs) o array, verificando se hÃĄ erros silenciosos ou de entrada/saída nos discos de dados e paridade. .PP Cada invocaÃ§ÃŖo verifica aproximadamente 8% do array, excluindo dados jÃĄ examinados nos Ãēltimos 10 dias. Isso significa que examinar (scrubbing) uma vez por semana garante que cada bit de dados seja verificado pelo menos uma vez a cada trÃĒs meses. .PP VocÃĒ pode definir um plano de scrub ou quantidade diferente usando a opÃ§ÃŖo \-p, \-\-plan, que aceita: bad \- Examina blocos marcados como ruins. new \- Examina blocos recÊm\-sincronizados ainda nÃŖo examinados. full \- Examina tudo. 0\-100 \- Examina a porcentagem especificada de blocos. .PP Se vocÃĒ especificar um valor percentual, tambÊm pode usar a opÃ§ÃŖo \-o, \-\-older\-than para definir a idade mínima do bloco. Os blocos mais antigos sÃŖo examinados primeiro, garantindo uma verificaÃ§ÃŖo ideal. Se vocÃĒ quiser examinar apenas os blocos recÊm\-sincronizados ainda nÃŖo examinados, use a opÃ§ÃŖo \`\-p new\`. .PP Para obter detalhes do status do scrub, use o comando \`status\`. .PP Para qualquer erro silencioso ou de entrada/saída encontrado, os blocos correspondentes sÃŖo marcados como ruins no arquivo de \`content\`. Esses blocos ruins sÃŖo listados em \`status\` e podem ser corrigidos com \`fix \-e\`. ApÃŗs a correÃ§ÃŖo, no prÃŗximo scrub, eles serÃŖo verificados novamente e, se considerados corrigidos, a marcaÃ§ÃŖo de ruim serÃĄ removida. Para examinar apenas os blocos ruins, vocÃĒ pode usar o comando \`scrub \-p bad\`. .PP É recomendado executar \`scrub\` apenas em um array sincronizado para evitar erros relatados causados por dados nÃŖo sincronizados. Esses erros sÃŖo reconhecidos como nÃŖo sendo erros silenciosos, e os blocos nÃŖo sÃŖo marcados como ruins, mas tais erros sÃŖo relatados na saída do comando. .PP O arquivo \`content\` Ê modificado para atualizar o tempo da Ãēltima verificaÃ§ÃŖo para cada bloco e para marcar blocos ruins. Os arquivos \`parity\` NÃO sÃŖo modificados. Os arquivos no array NÃO sÃŖo modificados. .SS fix Corrige todos os arquivos e os dados de paridade. .PP Todos os arquivos e dados de paridade sÃŖo comparados com o estado de snapshot salvo na Ãēltima \`sync\`. Se uma diferença for encontrada, ela Ê revertida para o snapshot armazenado. .PP ATENÇÃO! O comando \`fix\` nÃŖo diferencia entre erros e modificaçÃĩes intencionais. Ele reverte incondicionalmente o estado do arquivo para a Ãēltima \`sync\`. .PP Se nenhuma outra opÃ§ÃŖo for especificada, todo o array Ê processado. Use as opçÃĩes de filtro para selecionar um subconjunto de arquivos ou discos para operar. .PP Para corrigir apenas os blocos marcados como ruins durante \`sync\` e \`scrub\`, use a opÃ§ÃŖo \-e, \-\-filter\-error. Ao contrÃĄrio de outras opçÃĩes de filtro, esta aplica correçÃĩes apenas a arquivos que nÃŖo foram alterados desde a Ãēltima \`sync\`. .PP O SnapRAID renomeia todos os arquivos que nÃŖo podem ser corrigidos adicionando a extensÃŖo \`.unrecoverable\`. .PP Antes de corrigir, todo o array Ê escaneado para encontrar quaisquer arquivos movidos desde a Ãēltima operaÃ§ÃŖo \`sync\`. Esses arquivos sÃŖo identificados por seu carimbo de data/hora, ignorando seu nome e diretÃŗrio, e sÃŖo usados no processo de recuperaÃ§ÃŖo, se necessÃĄrio. Se vocÃĒ moveu alguns deles para fora do array, pode usar a opÃ§ÃŖo \-i, \-\-import para especificar diretÃŗrios adicionais para escanear. .PP Os arquivos sÃŖo identificados apenas por caminho, nÃŖo por inode. .PP O arquivo \`content\` NÃO Ê modificado. Os arquivos \`parity\` sÃŖo modificados se necessÃĄrio. Os arquivos no array sÃŖo modificados se necessÃĄrio. .SS check Verifica todos os arquivos e os dados de paridade. .PP Funciona como \`fix\`, mas apenas simula uma recuperaÃ§ÃŖo e nenhuma alteraÃ§ÃŖo Ê escrita no array. .PP Este comando Ê destinado principalmente a verificaçÃĩes manuais, como apÃŗs um processo de recuperaÃ§ÃŖo ou em outras condiçÃĩes especiais. Para verificaçÃĩes periÃŗdicas e agendadas, use \`scrub\`. .PP Se vocÃĒ usar a opÃ§ÃŖo \-a, \-\-audit\-only, apenas os dados do arquivo sÃŖo verificados, e os dados de paridade sÃŖo ignorados para uma execuÃ§ÃŖo mais rÃĄpida. .PP Os arquivos sÃŖo identificados apenas por caminho, nÃŖo por inode. .PP Nada Ê modificado. .SS list Lista todos os arquivos contidos no array no momento da Ãēltima \`sync\`. .PP Com \-v ou \-\-verbose, o tempo sub\-segundo tambÊm Ê mostrado. .PP Nada Ê modificado. .SS dup Lista todos os arquivos duplicados. Dois arquivos sÃŖo considerados iguais se seus hashes corresponderem. Os dados do arquivo nÃŖo sÃŖo lidos; apenas os hashes prÊ\-calculados sÃŖo usados. .PP Nada Ê modificado. .SS pool Cria ou atualiza uma visualizaÃ§ÃŖo virtual de todos os arquivos em seu array de discos no diretÃŗrio \`pooling\`. .PP Os arquivos nÃŖo sÃŖo copiados, mas ligados usando links simbÃŗlicos. .PP Ao atualizar, todos os links simbÃŗlicos existentes e subdiretÃŗrios vazios sÃŖo excluídos e substituídos pela nova visualizaÃ§ÃŖo do array. Quaisquer outros arquivos regulares sÃŖo deixados no lugar. .PP Nada Ê modificado fora do diretÃŗrio do pool. .SS devices Imprime os dispositivos de baixo nível usados pelo array. .PP Este comando exibe as associaçÃĩes de dispositivos no array e destina\-se principalmente como uma interface de script. .PP As duas primeiras colunas sÃŖo o ID do dispositivo de baixo nível e o caminho. As prÃŗximas duas colunas sÃŖo o ID do dispositivo de alto nível e o caminho. A Ãēltima coluna Ê o nome do disco no array. .PP Na maioria dos casos, vocÃĒ tem um dispositivo de baixo nível para cada disco no array, mas em algumas configuraçÃĩes mais complexas, vocÃĒ pode ter vÃĄrios dispositivos de baixo nível usados por um Ãēnico disco no array. .PP Nada Ê modificado. .SS touch Define um carimbo de data/hora sub\-segundo arbitrÃĄrio para todos os arquivos que o tÃĒm definido como zero. .PP Isso melhora a capacidade do SnapRAID de reconhecer arquivos movidos e copiados, pois torna o carimbo de data/hora quase Ãēnico, reduzindo possíveis duplicatas. .PP Mais especificamente, se o carimbo de data/hora sub\-segundo nÃŖo for zero, um arquivo movido ou copiado Ê identificado como tal se corresponder ao nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora sub\-segundo for zero, ele Ê considerado uma cÃŗpia apenas se o caminho completo, tamanho e carimbo de data/hora corresponderem. .PP O carimbo de data/hora de precisÃŖo de segundo nÃŖo Ê modificado, portanto, todas as datas e horas de seus arquivos serÃŖo preservadas. .SS rehash Agenda um novo hash de todo o array. .PP Este comando altera o tipo de hash usado, tipicamente ao atualizar de um sistema de 32 bits para um de 64 bits, para alternar do MurmurHash3 para o mais rÃĄpido SpookyHash. .PP Se vocÃĒ jÃĄ estiver usando o hash ideal, este comando nÃŖo faz nada e informa que nenhuma aÃ§ÃŖo Ê necessÃĄria. .PP O novo hash nÃŖo Ê executado imediatamente, mas ocorre progressivamente durante \`sync\` e \`scrub\`. .PP VocÃĒ pode verificar o estado do novo hash usando \`status\`. .PP Durante o novo hash, o SnapRAID mantÊm a funcionalidade total, com a Ãēnica exceÃ§ÃŖo de que \`dup\` nÃŖo pode detectar arquivos duplicados usando um hash diferente. .SS locate Localiza arquivos armazenados nos discos de paridade. Para cada arquivo correspondente, imprime sua localizaÃ§ÃŖo dentro do arquivo de paridade e o nÃēmero de fragmentos que ocupa. .PP VocÃĒ pode usar a opÃ§ÃŖo \-t, \-\-tail para restringir a operaÃ§ÃŖo aos arquivos que ocupam a parte final especificada da paridade. .PP Se desejar realocar esses arquivos, vocÃĒ poderÃĄ usar a opÃ§ÃŖo \-W, \-\-force\-realloc\-tail. Esteja ciente de que tais arquivos nÃŖo estarÃŖo protegidos pela paridade durante o processo de realocaÃ§ÃŖo. .SH OPçÃĩES SnapRAID fornece as seguintes opçÃĩes: .TP .B \-c, \-\-conf CONFIG Seleciona o arquivo de configuraÃ§ÃŖo a ser usado. Se nÃŖo for especificado, no Unix, ele usa o arquivo \`/usr/local/etc/snapraid.conf\` se existir, caso contrÃĄrio, \`/etc/snapraid.conf\`. No Windows, ele usa o arquivo \`snapraid.conf\` no mesmo diretÃŗrio que \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Filtra os arquivos a serem processados em \`check\` e \`fix\`. Apenas os arquivos que correspondem ao padrÃŖo especificado sÃŖo processados. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. Consulte a seÃ§ÃŖo PATTERN para obter mais detalhes sobre especificaçÃĩes de padrÃŖo. No Unix, certifique\-se de que os caracteres globbing sejam citados, se usados. Esta opÃ§ÃŖo pode ser usada apenas com \`check\` e \`fix\`. NÃŖo pode ser usada com \`sync\` e \`scrub\`, pois eles sempre processam o array inteiro. .TP .B \-d, \-\-filter\-disk NAME Filtra os discos a serem processados em \`check\`, \`fix\`, \`up\` e \`down\`. VocÃĒ deve especificar um nome de disco conforme definido no arquivo de configuraÃ§ÃŖo. VocÃĒ tambÊm pode especificar discos de paridade com os nomes: \`parity\`, \`2\-parity\`, \`3\-parity\`, etc., para limitar as operaçÃĩes a um disco de paridade específico. Se vocÃĒ combinar mÃēltiplas opçÃĩes \-\-filter, \-\-filter\-disk e \-\-filter\-missing, apenas os arquivos que correspondem a todos os filtros sÃŖo selecionados. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. Esta opÃ§ÃŖo pode ser usada apenas com \`check\`, \`fix\`, \`up\` e \`down\`. NÃŖo pode ser usada com \`sync\` e \`scrub\`, pois eles sempre processam o array inteiro. .TP .B \-m, \-\-filter\-missing Filtra os arquivos a serem processados em \`check\` e \`fix\`. Apenas os arquivos ausentes ou excluídos do array sÃŖo processados. Quando usado com \`fix\`, isso age como um comando \`undelete\` (desexcluir). Se vocÃĒ combinar mÃēltiplas opçÃĩes \-\-filter, \-\-filter\-disk e \-\-filter\-missing, apenas os arquivos que correspondem a todos os filtros sÃŖo selecionados. Esta opÃ§ÃŖo pode ser usada apenas com \`check\` e \`fix\`. NÃŖo pode ser usada com \`sync\` e \`scrub\`, pois eles sempre processam o array inteiro. .TP .B \-e, \-\-filter\-error Processa os arquivos com erros em \`check\` e \`fix\`. Processa apenas arquivos que tÃĒm blocos marcados com erros silenciosos ou de entrada/saída durante \`sync\` e \`scrub\`, conforme listado em \`status\`. Esta opÃ§ÃŖo pode ser usada apenas com \`check\` e \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Seleciona o plano de scrub. Se PERC for um valor numÊrico de 0 a 100, ele Ê interpretado como a porcentagem de blocos a serem examinados. Em vez de uma porcentagem, vocÃĒ pode especificar um plano: \`bad\` examina blocos ruins, \`new\` examina blocos ainda nÃŖo examinados, e \`full\` examina tudo. Esta opÃ§ÃŖo pode ser usada apenas com \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Seleciona a parte mais antiga do array a ser processada em \`scrub\`. DAYS Ê a idade mínima em dias para um bloco ser examinado; o padrÃŖo Ê 10. Os blocos marcados como ruins sÃŖo sempre examinados, independentemente desta opÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com \`scrub\`. .TP .B \-a, \-\-audit\-only Em \`check\`, verifica o hash dos arquivos sem verificar os dados de paridade. Se vocÃĒ estiver interessado apenas em verificar os dados do arquivo, esta opÃ§ÃŖo pode acelerar significativamente o processo de verificaÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com \`check\`. .TP .B \-h, \-\-pre\-hash Em \`sync\`, executa uma fase de hash preliminar de todos os novos dados para verificaÃ§ÃŖo adicional antes do cÃĄlculo da paridade. Normalmente, em \`sync\`, nenhum hash preliminar Ê feito, e os novos dados sÃŖo hashados logo antes do cÃĄlculo da paridade, quando sÃŖo lidos pela primeira vez. Este processo ocorre quando o sistema estÃĄ sob carga pesada, com todos os discos girando e uma CPU ocupada. Esta Ê uma condiÃ§ÃŖo extrema para a mÃĄquina, e se ela tiver um problema de hardware latente, erros silenciosos podem passar despercebidos porque os dados ainda nÃŖo foram hashados. Para evitar esse risco, vocÃĒ pode habilitar o modo \`pre\-hash\` para ter todos os dados lidos duas vezes para garantir sua integridade. Esta opÃ§ÃŖo tambÊm verifica arquivos movidos dentro do array para garantir que a operaÃ§ÃŖo de movimentaÃ§ÃŖo foi bem\-sucedida e, se necessÃĄrio, permite que vocÃĒ execute uma operaÃ§ÃŖo fix antes de prosseguir. Esta opÃ§ÃŖo pode ser usada apenas com \`sync\`. .TP .B \-i, \-\-import DIR Importa do diretÃŗrio especificado quaisquer arquivos excluídos do array apÃŗs a Ãēltima \`sync\`. Se vocÃĒ ainda tiver esses arquivos, eles podem ser usados por \`check\` e \`fix\` para melhorar o processo de recuperaÃ§ÃŖo. Os arquivos sÃŖo lidos, incluindo em subdiretÃŗrios, e sÃŖo identificados independentemente de seu nome. Esta opÃ§ÃŖo pode ser usada apenas com \`check\` e \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error Em qualquer erro, desliga (spins down) todos os discos gerenciados antes de sair com um cÃŗdigo de status diferente de zero. Isso impede que as unidades permaneçam ativas e girando apÃŗs uma operaÃ§ÃŖo abortada, ajudando a evitar acÃēmulo desnecessÃĄrio de calor e consumo de energia. Use esta opÃ§ÃŖo para garantir que os discos sejam interrompidos com segurança, mesmo quando um comando falhar. .TP .B \-w, \-\-bw\-limit RATE Aplica um limite de largura de banda global para todos os discos. A RATE Ê o nÃēmero de bytes por segundo. VocÃĒ pode especificar um multiplicador como K, M ou G (por exemplo, \-\-bw\-limit 1G). .TP .B \-t, \-\-tail TAMANHO Limita a listagem de arquivos àqueles que nÃŖo usam mais do que o tamanho final especificado dos discos de paridade. VocÃĒ pode usar multiplicadores como K, M, G ou T (ex: \-\-tail 1G). Esta opÃ§ÃŖo sÃŗ Ê vÃĄlida quando usada em conjunto com o comando \`locate\`. .TP .B \-A, \-\-stats Habilita uma visualizaÃ§ÃŖo de status estendida que mostra informaçÃĩes adicionais. A tela exibe dois grÃĄficos: O primeiro grÃĄfico mostra o nÃēmero de stripes em buffer para cada disco, juntamente com o caminho do arquivo que estÃĄ sendo acessado atualmente nesse disco. Tipicamente, o disco mais lento nÃŖo terÃĄ buffer disponível, o que determina a largura de banda mÃĄxima alcanÃ§ÃĄvel. O segundo grÃĄfico mostra a porcentagem de tempo gasto esperando nos Ãēltimos 100 segundos. Espera\-se que o disco mais lento cause a maior parte do tempo de espera, enquanto outros discos devem ter pouco ou nenhum tempo de espera porque podem usar seus stripes em buffer. Este grÃĄfico tambÊm mostra o tempo gasto esperando por cÃĄlculos de hash e cÃĄlculos RAID. Todos os cÃĄlculos sÃŖo executados em paralelo com as operaçÃĩes de disco. Portanto, enquanto houver tempo de espera mensurÃĄvel para pelo menos um disco, isso indica que a CPU Ê rÃĄpida o suficiente para acompanhar a carga de trabalho. .TP .B \-Z, \-\-force\-zero Força a operaÃ§ÃŖo insegura de sincronizar um arquivo com tamanho zero que era anteriormente nÃŖo zero. Se o SnapRAID detectar tal condiÃ§ÃŖo, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte facilmente quando, apÃŗs uma falha do sistema, alguns arquivos acessados foram truncados. Esta Ê uma condiÃ§ÃŖo possível no Linux com os sistemas de arquivos ext3/ext4. Esta opÃ§ÃŖo pode ser usada apenas com \`sync\`. .TP .B \-E, \-\-force\-empty Força a operaÃ§ÃŖo insegura de sincronizar um disco com todos os arquivos originais ausentes. Se o SnapRAID detectar que todos os arquivos originalmente presentes no disco estÃŖo ausentes ou foram reescritos, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte facilmente quando um sistema de arquivos de dados nÃŖo estÃĄ montado. Esta opÃ§ÃŖo pode ser usada apenas com \`sync\`. .TP .B \-U, \-\-force\-uuid Força a operaÃ§ÃŖo insegura de sincronizar, verificar e corrigir com discos que tiveram seus UUIDs alterados. Se o SnapRAID detectar que alguns discos tiveram seus UUIDs alterados, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte quando seus discos estÃŖo montados nos pontos de montagem errados. No entanto, Ê permitido ter uma Ãēnica mudança de UUID com paridade Ãēnica e mais com paridade mÃēltipla, porque este Ê o caso normal ao substituir discos apÃŗs uma recuperaÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com \`sync\`, \`check\` ou \`fix\`. .TP .B \-D, \-\-force\-device Força a operaÃ§ÃŖo insegura de corrigir com discos inacessíveis ou com discos no mesmo dispositivo físico. Por exemplo, se vocÃĒ perdeu dois discos de dados e tem um disco sobressalente para recuperar apenas o primeiro, vocÃĒ pode ignorar o segundo disco inacessível. Ou, se vocÃĒ quiser recuperar um disco no espaço livre restante em um disco jÃĄ usado, compartilhando o mesmo dispositivo físico. Esta opÃ§ÃŖo pode ser usada apenas com \`fix\`. .TP .B \-N, \-\-force\-nocopy Em \`sync\`, \`check\` e \`fix\`, desabilita a heurística de detecÃ§ÃŖo de cÃŗpia. Sem esta opÃ§ÃŖo, o SnapRAID assume que arquivos com os mesmos atributos, como nome, tamanho e carimbo de data/hora, sÃŖo cÃŗpias com os mesmos dados. Isso permite a identificaÃ§ÃŖo de arquivos copiados ou movidos de um disco para outro e reutiliza as informaçÃĩes de hash jÃĄ calculadas para detectar erros silenciosos ou para recuperar arquivos ausentes. Em alguns casos raros, esse comportamento pode resultar em falsos positivos ou em um processo lento devido a muitas verificaçÃĩes de hash, e esta opÃ§ÃŖo permite que vocÃĒ resolva tais problemas. Esta opÃ§ÃŖo pode ser usada apenas com \`sync\`, \`check\` e \`fix\`. .TP .B \-F, \-\-force\-full Em \`sync\`, força um recÃĄlculo completo da paridade. Esta opÃ§ÃŖo pode ser usada quando vocÃĒ adiciona um novo nível de paridade ou se vocÃĒ reverteu para um arquivo de conteÃēdo antigo usando dados de paridade mais recentes. Em vez de recriar a paridade do zero, isso permite que vocÃĒ reutilize os hashes presentes no arquivo de conteÃēdo para validar dados e manter a proteÃ§ÃŖo de dados durante o processo \`sync\` usando os dados de paridade existentes. Esta opÃ§ÃŖo pode ser usada apenas com \`sync\`. .TP .B \-R, \-\-force\-realloc Em \`sync\`, força uma realocaÃ§ÃŖo completa de arquivos e reconstruÃ§ÃŖo da paridade. Esta opÃ§ÃŖo pode ser usada para realocar completamente todos os arquivos, removendo a fragmentaÃ§ÃŖo, enquanto reutiliza os hashes presentes no arquivo de conteÃēdo para validar dados. Esta opÃ§ÃŖo pode ser usada apenas com \`sync\`. ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo usÃĄ\-la. VocÃĒ NÃO tem proteÃ§ÃŖo de dados durante a operaÃ§ÃŖo \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail TAMANHO Funciona como \-R, \-\-force\-realloc, mas limitado à parte final especificada (Ãēltimos TAMANHO bytes) de cada arquivo de paridade. Força a realocaÃ§ÃŖo (movimentaÃ§ÃŖo) de quaisquer fragmentos/blocos de arquivos atualmente armazenados nessa seÃ§ÃŖo final, permitindo que sejam colocados em qualquer lugar no(s) arquivo(s) de paridade onde houver espaço livre disponível (incluindo espaços vazios existentes). O objetivo principal desta opÃ§ÃŖo Ê diminuir o tamanho em disco do arquivo de paridade. Se a realocaÃ§ÃŖo limpar com sucesso toda a seÃ§ÃŖo final (nenhum bloco permanecer usando\-a), o arquivo de paridade serÃĄ truncado, recuperando o espaço final nÃŖo utilizado. VocÃĒ pode usar multiplicadores como K, M, G ou T (ex: \-\-force\-realloc\-tail 1G). VocÃĒ pode usar locate \-t, \-\-tail para saber antecipadamente os arquivos afetados. AVISO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo utilizÃĄ\-la. VocÃĒ NÃO terÃĄ proteÃ§ÃŖo de datos durante a operaÃ§ÃŖo \`sync\` para os arquivos afetados. .TP .B \-l, \-\-log FILE Escreve um log detalhado para o arquivo especificado. Se esta opÃ§ÃŖo nÃŖo for especificada, erros inesperados sÃŖo impressos na tela, resultando potencialmente em saída excessiva em caso de muitos erros. Quando \-l, \-\-log Ê especificado, apenas erros fatais que fazem o SnapRAID parar sÃŖo impressos na tela. Se o caminho começar com \`>>\`, o arquivo Ê aberto no modo de anexaÃ§ÃŖo. OcorrÃĒncias de \`%D\` e \`%T\` no nome sÃŖo substituídas pela data e hora no formato YYYYMMDD e HHMMSS. Em arquivos em lote do Windows, vocÃĒ deve duplicar o caractere \`%\`, por exemplo, resultado\-%%D.log. Para usar \`>>\`, vocÃĒ deve colocar o nome entre aspas, por exemplo, \`\[dq]>>resultado.log\[dq]\`. Para enviar o log para a saída padrÃŖo ou erro padrÃŖo, vocÃĒ pode usar \`\[dq]>&1\[dq]\` e \`\[dq]>&2\[dq]\`, respectivamente. Consulte o arquivo snapraid_log.txt ou a pÃĄgina man para descriçÃĩes de tags de log. .TP .B \-L, \-\-error\-limit NUMBER Define um novo limite de erro antes de interromper a execuÃ§ÃŖo. Por padrÃŖo, o SnapRAID para se encontrar mais de 100 erros de entrada/saída, indicando que um disco provavelmente estÃĄ falhando. Esta opÃ§ÃŖo afeta \`sync\` e \`scrub\`, que tÃĒm permissÃŖo para continuar apÃŗs o primeiro conjunto de erros de disco para tentar completar suas operaçÃĩes. No entanto, \`check\` e \`fix\` sempre param no primeiro erro. .TP .B \-S, \-\-start BLKSTART Começa o processamento a partir do nÃēmero de bloco especificado. Isso pode ser Ãētil para tentar verificar ou corrigir blocos específicos em caso de um disco danificado. Esta opÃ§ÃŖo Ê principalmente para recuperaÃ§ÃŖo manual avançada. .TP .B \-B, \-\-count BLKCOUNT Processa apenas o nÃēmero especificado de blocos. Esta opÃ§ÃŖo Ê principalmente para recuperaÃ§ÃŖo manual avançada. .TP .B \-C, \-\-gen\-conf CONTENT Gera um arquivo de configuraÃ§ÃŖo dummy a partir de um arquivo de conteÃēdo existente. O arquivo de configuraÃ§ÃŖo Ê escrito na saída padrÃŖo e nÃŖo sobrescreve um existente. Este arquivo de configuraÃ§ÃŖo tambÊm contÊm as informaçÃĩes necessÃĄrias para reconstruir os pontos de montagem do disco, caso vocÃĒ perca todo o sistema. .TP .B \-v, \-\-verbose Imprime mais informaçÃĩes na tela. Se especificado uma vez, ele imprime arquivos excluídos e estatísticas adicionais. Esta opÃ§ÃŖo nÃŖo tem efeito nos arquivos de log. .TP .B \-q, \-\-quiet Imprime menos informaçÃĩes na tela. Se especificado uma vez, remove a barra de progresso; duas vezes, as operaçÃĩes em execuÃ§ÃŖo; trÃĒs vezes, as mensagens de informaÃ§ÃŖo; quatro vezes, as mensagens de status. Erros fatais sÃŖo sempre impressos na tela. Esta opÃ§ÃŖo nÃŖo tem efeito nos arquivos de log. .TP .B \-H, \-\-help Imprime uma tela de ajuda curta. .TP .B \-V, \-\-version Imprime a versÃŖo do programa. .SH CONFIGURAÃ§ÃŖO SnapRAID requer um arquivo de configuraÃ§ÃŖo para saber onde seu array de discos estÃĄ localizado e onde armazenar as informaçÃĩes de paridade. .PP No Unix, ele usa o arquivo \`/usr/local/etc/snapraid.conf\` se existir, caso contrÃĄrio, \`/etc/snapraid.conf\`. No Windows, ele usa o arquivo \`snapraid.conf\` no mesmo diretÃŗrio que \`snapraid.exe\`. .PP Deve conter as seguintes opçÃĩes (sensível a maiÃēsculas/minÃēsculas): .SS parity FILE [,FILE] ... Define os arquivos a serem usados para armazenar as informaçÃĩes de paridade. A paridade permite proteÃ§ÃŖo contra uma Ãēnica falha de disco, semelhante ao RAID5. .PP VocÃĒ pode especificar vÃĄrios arquivos, que devem estar em discos diferentes. Quando um arquivo nÃŖo pode mais crescer, o prÃŗximo Ê usado. O espaço total disponível deve ser pelo menos tÃŖo grande quanto o maior disco de dados no array. .PP VocÃĒ pode adicionar arquivos de paridade adicionais mais tarde, mas vocÃĒ nÃŖo pode reordenar ou removÃĒ\-los. .PP Manter os discos de paridade reservados para paridade garante que eles nÃŖo se fragmentem, melhorando o desempenho. .PP No Windows, 256 MB sÃŖo deixados sem uso em cada disco para evitar o aviso sobre discos cheios. .PP Esta opÃ§ÃŖo Ê obrigatÃŗria e pode ser usada apenas uma vez. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... Define os arquivos a serem usados para armazenar informaçÃĩes de paridade extra. .PP Para cada nível de paridade especificado, um nível adicional de proteÃ§ÃŖo Ê habilitado: .PD 0 .IP \(bu 2\-parity habilita paridade dupla RAID6. .IP \(bu 3\-parity habilita paridade tripla. .IP \(bu 4\-parity habilita paridade quÃĄdrupla (quatro). .IP \(bu 5\-parity habilita paridade penta (cinco). .IP \(bu 6\-parity habilita paridade hexa (seis). .PD .PP Cada nível de paridade requer a presença de todos os níveis de paridade anteriores. .PP As mesmas consideraçÃĩes que para a opÃ§ÃŖo \`parity\` se aplicam. .PP Estas opçÃĩes sÃŖo opcionais e podem ser usadas apenas uma vez. .SS z\-parity FILE [,FILE] ... Define um arquivo e formato alternativo para armazenar paridade tripla. .PP Esta opÃ§ÃŖo Ê uma alternativa a \`3\-parity\`, destinada principalmente a CPUs de baixo custo como ARM ou AMD Phenom, Athlon e Opteron que nÃŖo suportam o conjunto de instruçÃĩes SSSE3. Nesses casos, ela fornece melhor desempenho. .PP Este formato Ê semelhante, mas mais rÃĄpido do que o usado pelo ZFS RAIDZ3. Assim como o ZFS, ele nÃŖo funciona alÊm da paridade tripla. .PP Ao usar \`3\-parity\`, vocÃĒ serÃĄ avisado se for recomendado usar o formato \`z\-parity\` para melhoria de desempenho. .PP É possível converter de um formato para outro ajustando o arquivo de configuraÃ§ÃŖo com o z\-parity ou 3\-parity desejado e usando \`fix\` para recriÃĄ\-lo. .SS content FILE Define o arquivo a ser usado para armazenar a lista e os checksums de todos os arquivos presentes em seu array de discos. .PP Pode ser colocado em um disco usado para dados, paridade ou qualquer outro disco disponível. Se vocÃĒ usar um disco de dados, este arquivo Ê automaticamente excluído do processo \`sync\`. .PP Esta opÃ§ÃŖo Ê obrigatÃŗria e pode ser usada vÃĄrias vezes para salvar mÃēltiplas cÃŗpias do mesmo arquivo. .PP VocÃĒ deve armazenar pelo menos uma cÃŗpia para cada disco de paridade usado mais um. Usar cÃŗpias adicionais nÃŖo prejudica. .SS data NAME DIR Define o nome e o ponto de montagem dos discos de dados no array. NAME Ê usado para identificar o disco e deve ser Ãēnico. DIR Ê o ponto de montagem do disco no sistema de arquivos. .PP VocÃĒ pode alterar o ponto de montagem conforme necessÃĄrio, desde que mantenha o NAME fixo. .PP VocÃĒ deve usar uma opÃ§ÃŖo para cada disco de dados no array. .PP VocÃĒ pode renomear um disco mais tarde alterando o NAME diretamente no arquivo de configuraÃ§ÃŖo e, em seguida, executando um comando \`sync\`. No caso de renomeaÃ§ÃŖo, a associaÃ§ÃŖo Ê feita usando o UUID armazenado dos discos. .SS extra NAME DIR Define o nome e o ponto de montagem de discos adicionais para monitorar com os comandos \`smart\` e \`probe\`. .PP Isso Ê Ãētil para monitorar discos que nÃŖo fazem parte da matriz, mas que sÃŖo necessÃĄrios para o funcionamento do sistema, como o disco de inicializaÃ§ÃŖo. .PP Observe que tais discos nÃŖo sÃŖo afetados pelos comandos \`up\` e \`down\` porque se espera que estejam sempre girando. .SS nohidden Exclui todos os arquivos e diretÃŗrios ocultos. No Unix, arquivos ocultos sÃŖo aqueles que começam com \`.\`. No Windows, sÃŖo aqueles com o atributo oculto. .SS exclude/include PATTERN Define os padrÃĩes de arquivo ou diretÃŗrio a serem excluídos ou incluídos no processo de sincronizaÃ§ÃŖo. Todos os padrÃĩes sÃŖo processados na ordem especificada. .PP Se o primeiro padrÃŖo que corresponde for um \`exclude\`, o arquivo Ê excluído. Se for um \`include\`, o arquivo Ê incluído. Se nenhum padrÃŖo corresponder, o arquivo Ê excluído se o Ãēltimo padrÃŖo especificado for um \`include\`, ou incluído se o Ãēltimo padrÃŖo especificado for um \`exclude\`. .PP Consulte a seÃ§ÃŖo PATTERN para obter mais detalhes sobre especificaçÃĩes de padrÃŖo. .PP Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. .SS blocksize SIZE_IN_KIBIBYTES Define o tamanho bÃĄsico do bloco em kibibytes para a paridade. Um kibibyte Ê 1024 bytes. .PP O \`blocksize\` padrÃŖo Ê 256, o que deve funcionar para a maioria dos casos. .PP ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo alterar este valor. Para alterar este valor no futuro, vocÃĒ precisarÃĄ recriar toda a paridade! .PP Uma razÃŖo para usar um \`blocksize\` diferente Ê se vocÃĒ tiver muitos arquivos pequenos, na ordem de milhÃĩes. .PP Para cada arquivo, mesmo que apenas alguns bytes, um bloco inteiro de paridade Ê alocado, e com muitos arquivos, isso pode resultar em espaço de paridade nÃŖo utilizado significativo. Quando vocÃĒ preenche completamente o disco de paridade, vocÃĒ nÃŖo estÃĄ autorizado a adicionar mais arquivos aos discos de dados. No entanto, a paridade desperdiçada nÃŖo se acumula em todos os discos de dados. O espaço desperdiçado resultante de um grande nÃēmero de arquivos em um disco de dados limita apenas a quantidade de dados nesse disco de dados, nÃŖo em outros. .PP Como uma aproximaÃ§ÃŖo, vocÃĒ pode assumir que metade do tamanho do bloco Ê desperdiçada para cada arquivo. Por exemplo, com 100.000 arquivos e um tamanho de bloco de 256 KiB, vocÃĒ desperdiçarÃĄ 12,8 GB de paridade, o que pode resultar em 12,8 GB a menos de espaço disponível no disco de dados. .PP VocÃĒ pode verificar a quantidade de espaço desperdiçado em cada disco usando \`status\`. Esta Ê a quantidade de espaço que vocÃĒ deve deixar livre nos discos de dados ou usar para arquivos nÃŖo incluídos no array. Se este valor for negativo, significa que vocÃĒ estÃĄ perto de encher a paridade e representa o espaço que vocÃĒ ainda pode desperdiçar. .PP Para evitar esse problema, vocÃĒ pode usar uma partiÃ§ÃŖo maior para paridade. Por exemplo, se a partiÃ§ÃŖo de paridade for 12,8 GB maior que os discos de dados, vocÃĒ tem espaço extra suficiente para lidar com atÊ 100.000 arquivos em cada disco de dados sem qualquer espaço desperdiçado. .PP Um truque para obter uma partiÃ§ÃŖo de paridade maior no Linux Ê formatÃĄ\-la com o comando: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Isso resulta em cerca de 1,5% de espaço extra, aproximadamente 60 GB para um disco de 4 TB, o que permite cerca de 460.000 arquivos em cada disco de dados sem qualquer espaço desperdiçado. .SS hashsize SIZE_IN_BYTES Define o tamanho do hash em bytes para os blocos salvos. .PP O \`hashsize\` padrÃŖo Ê 16 bytes (128 bits), o que deve funcionar para a maioria dos casos. .PP ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo alterar este valor. Para alterar este valor no futuro, vocÃĒ precisarÃĄ recriar toda a paridade! .PP Uma razÃŖo para usar um \`hashsize\` diferente Ê se o seu sistema tiver memÃŗria limitada. Como regra geral, o SnapRAID tipicamente requer 1 GiB de RAM para cada 16 TB de dados no array. .PP Especificamente, para armazenar os hashes dos dados, o SnapRAID requer aproximadamente TS*(1+HS)/BS bytes de RAM, onde TS Ê o tamanho total em bytes do seu array de discos, BS Ê o tamanho do bloco em bytes, e HS Ê o tamanho do hash em bytes. .PP Por exemplo, com 8 discos de 4 TB, um tamanho de bloco de 256 KiB (1 KiB = 1024 bytes), e um tamanho de hash de 16, vocÃĒ obtÊm: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB .PD 0 .PD .PP Mudando para um tamanho de hash de 8, vocÃĒ obtÊm: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB .PD 0 .PD .PP Mudando para um tamanho de bloco de 512, vocÃĒ obtÊm: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB .PD 0 .PD .PP Mudando para um tamanho de hash de 8 e um tamanho de bloco de 512, vocÃĒ obtÊm: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES Salva automaticamente o estado ao sincronizar ou examinar apÃŗs a quantidade especificada de GB processados. Esta opÃ§ÃŖo Ê Ãētil para evitar reiniciar longos comandos \`sync\` do zero se interrompidos por uma falha de mÃĄquina ou qualquer outro evento. .SS temp_limit TEMPERATURE_CELSIUS Define a temperatura mÃĄxima permitida do disco em Celsius. Quando especificado, o SnapRAID verifica periodicamente a temperatura de todos os discos usando a ferramenta smartctl. As temperaturas atuais dos discos sÃŖo exibidas enquanto o SnapRAID estÃĄ operando. Se algum disco exceder este limite, todas as operaçÃĩes param, e os discos sÃŖo desligados (colocados em standby) pela duraÃ§ÃŖo definida pela opÃ§ÃŖo \`temp_sleep\`. ApÃŗs o período de espera, as operaçÃĩes sÃŖo retomadas, potencialmente pausando novamente se o limite de temperatura for atingido mais uma vez. .PP Durante a operaÃ§ÃŖo, o SnapRAID tambÊm analisa a curva de aquecimento de cada disco e estima a temperatura estÃĄvel de longo prazo que eles devem atingir se a atividade continuar. A estimativa Ê realizada apenas depois que a temperatura do disco aumentou quatro vezes, garantindo que pontos de dados suficientes estejam disponíveis para estabelecer uma tendÃĒncia confiÃĄvel. Esta temperatura estÃĄvel prevista Ê mostrada entre parÃĒnteses ao lado do valor atual e ajuda a avaliar se o resfriamento do sistema Ê adequado. Esta temperatura estimada Ê apenas para fins informativos e nÃŖo tem efeito no comportamento do SnapRAID. As açÃĩes do programa sÃŖo baseadas exclusivamente nas temperaturas reais medidas dos discos. .PP Para realizar esta anÃĄlise, o SnapRAID precisa de uma referÃĒncia para a temperatura do sistema. Ele tenta primeiro lÃĒ\-la dos sensores de hardware disponíveis. Se nenhum sensor do sistema puder ser acessado, ele usa a temperatura mais baixa do disco medida no início da execuÃ§ÃŖo como referÃĒncia de fallback. .PP Normalmente, o SnapRAID mostra apenas a temperatura do disco mais quente. Para exibir a temperatura de todos os discos, use a opÃ§ÃŖo \-A ou \-\-stats. .SS temp_sleep TIME_IN_MINUTES Define o tempo de espera (standby time), em minutos, quando o limite de temperatura Ê atingido. Durante este período, os discos permanecem desligados. O padrÃŖo Ê 5 minutos. .SS pool DIR Define o diretÃŗrio de pooling onde a visualizaÃ§ÃŖo virtual do array de discos Ê criada usando o comando \`pool\`. .PP O diretÃŗrio jÃĄ deve existir. .SS share UNC_DIR Define o caminho UNC do Windows necessÃĄrio para acessar os discos remotamente. .PP Se esta opÃ§ÃŖo for especificada, os links simbÃŗlicos criados no diretÃŗrio do pool usam este caminho UNC para acessar os discos. Sem esta opÃ§ÃŖo, os links simbÃŗlicos gerados usam apenas caminhos locais, o que nÃŖo permite compartilhar o diretÃŗrio do pool pela rede. .PP Os links simbÃŗlicos sÃŖo formados usando o caminho UNC especificado, adicionando o nome do disco conforme especificado na opÃ§ÃŖo \`data\`, e finalmente adicionando o diretÃŗrio e nome do arquivo. .PP Esta opÃ§ÃŖo Ê necessÃĄria apenas para Windows. .SS smartctl DISK/PARITY OPTIONS... Define opçÃĩes smartctl personalizadas para obter os atributos SMART para cada disco. Isso pode ser necessÃĄrio para controladores RAID e alguns discos USB que nÃŖo podem ser detectados automaticamente. O placeholder %s Ê substituído pelo nome do dispositivo, mas Ê opcional para dispositivos fixos como controladores RAID. .PP DISK Ê o mesmo nome de disco especificado na opÃ§ÃŖo \`data\`. PARITY Ê um dos nomes de paridade: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` ou \`z\-parity\`. .PP Nas OPTIONS especificadas, a string \`%s\` Ê substituída pelo nome do dispositivo. Para controladores RAID, o dispositivo Ê provavelmente fixo, e vocÃĒ pode nÃŖo precisar usar \`%s\`. .PP Consulte a documentaÃ§ÃŖo do smartmontools para possíveis opçÃĩes: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP Por exemplo: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignora o atributo SMART especificado ao calcular a probabilidade de falha do disco. Esta opÃ§ÃŖo Ê Ãētil se um disco relatar valores incomuns ou enganosos para um atributo específico. .PP DISK Ê o mesmo nome de disco especificado na opÃ§ÃŖo \`data\`. PARITY Ê um dos nomes de paridade: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` ou \`z\-parity\`. O valor especial * pode ser usado para ignorar o atributo em todos os discos. .PP Por exemplo, para ignorar o atributo \`Current Pending Sector Count\` em todos os discos: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Para ignorÃĄ\-lo apenas no primeiro disco de paridade: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Exemplos Um exemplo de uma configuraÃ§ÃŖo típica para Unix Ê: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Um exemplo de uma configuraÃ§ÃŖo típica para Windows Ê: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PADRÃŖO (PATTERN) Os padrÃĩes fornecem uma maneira flexível de filtrar arquivos para inclusÃŖo ou exclusÃŖo. Ao usar caracteres de globbing, vocÃĒ pode definir regras que correspondam a nomes de arquivos específicos ou estruturas de diretÃŗrios inteiras sem listar cada caminho manualmente. .PP O ponto de interrogaÃ§ÃŖo \`?\` corresponde a qualquer caractere Ãēnico, exceto o separador de diretÃŗrios. Isso o torna Ãētil para corresponder nomes de arquivos com caracteres variÃĄveis, mantendo o padrÃŖo confinado a um Ãēnico nível de diretÃŗrio. .PP O asterisco simples \`*\` corresponde a qualquer sequÃĒncia de caracteres, mas, como o ponto de interrogaÃ§ÃŖo, nunca cruza as fronteiras do diretÃŗrio. Ele para na barra invertida, tornando\-o adequado para correspondÃĒncia dentro de um Ãēnico componente de caminho. Este Ê o comportamento padrÃŖo de curinga familiar do globbing de shell. .PP O asterisco duplo \`**\` Ê mais poderoso, ele corresponde a qualquer sequÃĒncia de caracteres, incluindo separadores de diretÃŗrios. Isso permite que os padrÃĩes correspondam em vÃĄrios níveis de diretÃŗrio. Quando o \`**\` aparece incorporado diretamente em um padrÃŖo, ele pode corresponder a zero ou mais caracteres, incluindo barras entre o texto literal circundante. .PP O uso mais importante do \`**\` Ê na forma especial \`/**/\`. Isso corresponde a zero ou mais níveis de diretÃŗrio completos, tornando possível corresponder arquivos em qualquer profundidade em uma ÃĄrvore de diretÃŗrios sem conhecer a estrutura exata do caminho. Por exemplo, o padrÃŖo \`src/**/main.js\` corresponde a \`src/main.js\` (pulando zero diretÃŗrios), \`src/ui/main.js\` (pulando um diretÃŗrio) e \`src/ui/components/main.js\` (pulando dois diretÃŗrios). .PP Classes de caracteres usando colchetes \`[]\` correspondem a um Ãēnico caractere de um conjunto ou intervalo especificado. Como os outros padrÃĩes de caractere Ãēnico, elas nÃŖo correspondem a separadores de diretÃŗrio. As classes suportam intervalos e negaÃ§ÃŖo usando um ponto de exclamaÃ§ÃŖo. .PP A distinÃ§ÃŖo fundamental a ser lembrada Ê que \`*\`, \`?\` e classes de caracteres respeitam os limites do diretÃŗrio e correspondem apenas dentro de um Ãēnico componente de caminho, enquanto \`**\` Ê o Ãēnico padrÃŖo que pode corresponder atravÊs de separadores de diretÃŗrio. .PP Existem quatro tipos diferentes de padrÃĩes: .TP .B FILE Seleciona qualquer arquivo chamado FILE. Este padrÃŖo se aplica apenas a arquivos, nÃŖo a diretÃŗrios. .TP .B DIR/ Seleciona qualquer diretÃŗrio chamado DIR e tudo o que estiver dentro dele. Este padrÃŖo se aplica apenas a diretÃŗrios, nÃŖo a arquivos. .TP .B /PATH/FILE Seleciona o caminho exato do arquivo especificado. Este padrÃŖo se aplica apenas a arquivos, nÃŖo a diretÃŗrios. .TP .B /PATH/DIR/ Seleciona o caminho exato do diretÃŗrio especificado e tudo o que estiver dentro dele. Este padrÃŖo se aplica apenas a diretÃŗrios, nÃŖo a arquivos. .PP Quando vocÃĒ especifica um caminho absoluto começando com /, ele Ê aplicado no diretÃŗrio raiz do array, nÃŖo no diretÃŗrio raiz do sistema de arquivos local. .PP No Windows, vocÃĒ pode usar a barra invertida \\ em vez da barra. DiretÃŗrios do sistema Windows, junctions, pontos de montagem e outros diretÃŗrios especiais do Windows sÃŖo tratados como arquivos, o que significa que para excluí\-los, vocÃĒ deve usar uma regra de arquivo, nÃŖo uma de diretÃŗrio. .PP Se o nome do arquivo contiver um caractere \`*\`, \`?\`, \`[\`, ou \`]\`, vocÃĒ deve escapÃĄ\-lo para evitar que seja interpretado como um caractere globbing. No Unix, o caractere de escape Ê \`\\\`; no Windows, Ê \`^\`. Quando o padrÃŖo estÃĄ na linha de comando, vocÃĒ deve duplicar o caractere de escape para evitar que seja interpretado pelo shell de comando. .PP No arquivo de configuraÃ§ÃŖo, vocÃĒ pode usar diferentes estratÊgias para filtrar os arquivos a serem processados. A abordagem mais simples Ê usar apenas regras \`exclude\` para remover todos os arquivos e diretÃŗrios que vocÃĒ nÃŖo deseja processar. Por exemplo: .PP .RS 4 # Exclui qualquer arquivo chamado \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exclui o diretÃŗrio raiz \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Exclui qualquer subdiretÃŗrio chamado \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP A abordagem oposta Ê definir apenas os arquivos que vocÃĒ deseja processar, usando apenas regras \`include\`. Por exemplo: .PP .RS 4 # Inclui apenas alguns diretÃŗrios .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP A abordagem final Ê misturar regras \`exclude\` e \`include\`. Neste caso, a ordem das regras Ê importante. As regras anteriores tÃĒm precedÃĒncia sobre as posteriores. Para simplificar, vocÃĒ pode listar todas as regras \`exclude\` primeiro e depois todas as regras \`include\`. Por exemplo: .PP .RS 4 # Exclui qualquer arquivo chamado \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exclui qualquer subdiretÃŗrio chamado \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Inclui apenas alguns diretÃŗrios .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Na linha de comando, usando a opÃ§ÃŖo \-f, vocÃĒ pode usar apenas padrÃĩes \`include\`. Por exemplo: .PP .RS 4 # Verifica apenas os arquivos .mp3. .PD 0 .PP .PD # No Unix, use aspas para evitar a expansÃŖo globbing pelo shell. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP No Unix, ao usar caracteres globbing na linha de comando, vocÃĒ deve citÃĄ\-los para evitar que o shell os expanda. .SH IGNORAR ARQUIVOS (IGNORE FILE) AlÊm das regras globais no arquivo de configuraÃ§ÃŖo, vocÃĒ pode colocar arquivos \`.snapraidignore\` em qualquer diretÃŗrio dentro do array para definir regras de exclusÃŖo descentralizadas. .PP As regras definidas em \`.snapraidignore\` sÃŖo aplicadas apÃŗs as regras no arquivo de configuraÃ§ÃŖo. Isso significa que elas tÃĒm uma prioridade maior e podem ser usadas para excluir arquivos que foram anteriormente incluídos pela configuraÃ§ÃŖo global. Efetivamente, se uma regra local corresponder, o arquivo Ê excluído independentemente das configuraçÃĩes globais de inclusÃŖo. .PP A lÃŗgica de padrÃĩes no \`.snapraidignore\` espelha a configuraÃ§ÃŖo global, mas ancora os padrÃĩes ao diretÃŗrio onde o arquivo estÃĄ localizado: .TP .B FILE Seleciona qualquer arquivo chamado FILE neste diretÃŗrio ou abaixo. Isso segue as mesmas regras de globbing do padrÃŖo global. .TP .B DIR/ Seleciona qualquer diretÃŗrio chamado DIR e tudo dentro dele, residente neste diretÃŗrio ou abaixo. .TP .B /PATH/FILE Seleciona o arquivo exato especificado relativo à localizaÃ§ÃŖo do arquivo \`.snapraidignore\`. .TP .B /PATH/DIR/ Seleciona o diretÃŗrio exato especificado e tudo dentro dele, relativo à localizaÃ§ÃŖo do arquivo \`.snapraidignore\`. .PP Ao contrÃĄrio da configuraÃ§ÃŖo global, os arquivos \`.snapraidignore\` suportam apenas regras de exclusÃŖo; vocÃĒ nÃŖo pode usar padrÃĩes \`include\` ou negaÃ§ÃŖo (!). .PP Por exemplo, se vocÃĒ tiver um \`.snapraidignore\` em \`/mnt/disk1/projects/\`: .PP .RS 4 # Exclui APENAS /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Exclui qualquer diretÃŗrio chamado \`build\` dentro de projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Exclui qualquer arquivo .tmp dentro de projects/ ou suas subpastas .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTEÃēDO (CONTENT) SnapRAID armazena a lista e os checksums de seus arquivos no arquivo content. .PP É um arquivo binÃĄrio que lista todos os arquivos presentes em seu array de discos, juntamente com todos os checksums para verificar sua integridade. .PP Este arquivo Ê lido e escrito pelos comandos \`sync\` e \`scrub\` e lido pelos comandos \`fix\`, \`check\` e \`status\`. .SH PARIDADE (PARITY) SnapRAID armazena as informaçÃĩes de paridade do seu array nos arquivos parity. .PP Estes sÃŖo arquivos binÃĄrios contendo a paridade calculada de todos os blocos definidos no arquivo \`content\`. .PP Estes arquivos sÃŖo lidos e escritos pelos comandos \`sync\` e \`fix\` e apenas lidos pelos comandos \`scrub\` e \`check\`. .SH CODIFICAÃ§ÃŖO (ENCODING) SnapRAID no Unix ignora qualquer codificaÃ§ÃŖo. Ele lÃĒ e armazena os nomes de arquivo com a mesma codificaÃ§ÃŖo usada pelo sistema de arquivos. .PP No Windows, todos os nomes lidos do sistema de arquivos sÃŖo convertidos e processados no formato UTF\-8. .PP Para que os nomes de arquivo sejam impressos corretamente, vocÃĒ deve definir o console do Windows para o modo UTF\-8 com o comando \`chcp 65001\` e usar uma fonte TrueType como \`Lucida Console\` como fonte do console. Isso afeta apenas os nomes de arquivo impressos; se vocÃĒ redirecionar a saída do console para um arquivo, o arquivo resultante estarÃĄ sempre no formato UTF\-8. .SH DIREITOS AUTORAIS (COPYRIGHT) Este arquivo Ê Copyright (C) 2025 Andrea Mazzoleni .SH VEJA TAMBÊM (SEE ALSO) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-pt.d000066400000000000000000002036211522717156100164170ustar00rootroot00000000000000Name{number} snapraid - SnapRAID Backup para Arrays de Disco Sinopse :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] DescriÃ§ÃŖo SnapRAID Ê um programa de backup projetado para arrays de disco, armazenando informaçÃĩes de paridade para recuperaÃ§ÃŖo de dados no caso de atÊ seis falhas de disco. Destinado principalmente a centros de mídia domÊsticos com arquivos grandes e que mudam com pouca frequÃĒncia, o SnapRAID oferece vÃĄrios recursos: * VocÃĒ pode utilizar discos jÃĄ preenchidos com arquivos sem a necessidade de reformatÃĄ-los, acessando-os normalmente. * Todos os seus dados sÃŖo submetidos a hash para garantir a integridade dos dados e prevenir corrupÃ§ÃŖo silenciosa. * Quando o nÃēmero de discos com falha excede a contagem de paridade, a perda de dados Ê confinada aos discos afetados; os dados em outros discos permanecem acessíveis. * Se vocÃĒ acidentalmente excluir arquivos em um disco, a recuperaÃ§ÃŖo Ê possível. * Os discos podem ter tamanhos diferentes. * VocÃĒ pode adicionar discos a qualquer momento. * O SnapRAID nÃŖo prende seus dados; vocÃĒ pode parar de usÃĄ-lo a qualquer momento sem reformatar ou mover dados. * Para acessar um arquivo, apenas um Ãēnico disco precisa girar (spin), economizando energia e reduzindo o ruído. Para mais informaçÃĩes, visite o site oficial do SnapRAID: :https://www.snapraid.it/ LimitaçÃĩes SnapRAID Ê um híbrido entre um programa RAID e um programa de backup, visando combinar os melhores benefícios de ambos. No entanto, ele tem algumas limitaçÃĩes que vocÃĒ deve considerar antes de usÃĄ-lo. A principal limitaÃ§ÃŖo Ê que, se um disco falhar e vocÃĒ nÃŖo tiver sincronizado recentemente, talvez nÃŖo consiga recuperar totalmente. Mais especificamente, vocÃĒ pode nÃŖo conseguir recuperar atÊ o tamanho dos arquivos alterados ou excluídos desde a Ãēltima operaÃ§ÃŖo de sincronizaÃ§ÃŖo. Isso ocorre mesmo que os arquivos alterados ou excluídos nÃŖo estejam no disco com falha. É por isso que o SnapRAID Ê mais adequado para dados que raramente mudam. Por outro lado, arquivos recÊm-adicionados nÃŖo impedem a recuperaÃ§ÃŖo de arquivos jÃĄ existentes. VocÃĒ perderÃĄ apenas os arquivos adicionados recentemente se estiverem no disco com falha. Outras limitaçÃĩes do SnapRAID sÃŖo: * Com o SnapRAID, vocÃĒ ainda tem sistemas de arquivos separados para cada disco. Com o RAID, vocÃĒ obtÊm um Ãēnico sistema de arquivos grande. * O SnapRAID nÃŖo faz striping de dados. Com o RAID, vocÃĒ obtÊm um aumento de velocidade com striping. * O SnapRAID nÃŖo suporta recuperaÃ§ÃŖo em tempo real. Com o RAID, vocÃĒ nÃŖo precisa parar de trabalhar quando um disco falha. * O SnapRAID pode recuperar dados apenas de um nÃēmero limitado de falhas de disco. Com um backup, vocÃĒ pode recuperar de uma falha completa de todo o array de discos. * Apenas nomes de arquivos, carimbos de data/hora, symlinks e hardlinks sÃŖo salvos. PermissÃĩes, propriedade e atributos estendidos nÃŖo sÃŖo salvos. Primeiros Passos Para usar o SnapRAID, vocÃĒ precisa primeiro selecionar um disco em seu array de discos para dedicar às informaçÃĩes de `parity` (paridade). Com um disco para paridade, vocÃĒ poderÃĄ recuperar de uma Ãēnica falha de disco, semelhante ao RAID5. Se vocÃĒ quiser recuperar de mais falhas de disco, semelhante ao RAID6, vocÃĒ deve reservar discos adicionais para paridade. Cada disco de paridade adicional permite a recuperaÃ§ÃŖo de mais uma falha de disco. Como discos de paridade, vocÃĒ deve escolher os maiores discos do array, pois a informaÃ§ÃŖo de paridade pode crescer atÊ o tamanho do maior disco de dados no array. Esses discos serÃŖo dedicados a armazenar os arquivos de `parity`. VocÃĒ nÃŖo deve armazenar seus dados neles. Em seguida, vocÃĒ deve definir os discos de `data` (dados) que deseja proteger com o SnapRAID. A proteÃ§ÃŖo Ê mais eficaz se esses discos contiverem dados que raramente mudam. Por esse motivo, Ê melhor NÃO incluir o disco C:\ do Windows ou os diretÃŗrios /home, /var e /tmp do Unix. A lista de arquivos Ê salva nos arquivos de `content` (conteÃēdo), geralmente armazenados nos discos de dados, paridade ou boot. Este arquivo contÊm os detalhes do seu backup, incluindo todos os checksums para verificar sua integridade. O arquivo de `content` Ê armazenado em vÃĄrias cÃŗpias, e cada cÃŗpia deve estar em um disco diferente para garantir que, mesmo em caso de mÃēltiplas falhas de disco, pelo menos uma cÃŗpia esteja disponível. Por exemplo, suponha que vocÃĒ esteja interessado em apenas um nível de proteÃ§ÃŖo de paridade, e seus discos estejam localizados em: :/mnt/diskp <- disco selecionado para paridade :/mnt/disk1 <- primeiro disco a proteger :/mnt/disk2 <- segundo disco a proteger :/mnt/disk3 <- terceiro disco a proteger VocÃĒ deve criar o arquivo de configuraÃ§ÃŖo /etc/snapraid.conf com as seguintes opçÃĩes: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Se vocÃĒ estiver no Windows, deve usar o formato de caminho do Windows, com letras de unidade e barras invertidas em vez de barras. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Se vocÃĒ tiver muitos discos e ficar sem letras de unidade, pode montar discos diretamente em subpastas. Consulte: :https://www.google.com/search?q=Windows+mount+point Neste ponto, vocÃĒ estÃĄ pronto para executar o comando `sync` para construir as informaçÃĩes de paridade. :snapraid sync Este processo pode levar vÃĄrias horas na primeira vez, dependendo do tamanho dos dados jÃĄ presentes nos discos. Se os discos estiverem vazios, o processo Ê imediato. VocÃĒ pode parÃĄ-lo a qualquer momento pressionando Ctrl+C e, na prÃŗxima execuÃ§ÃŖo, ele serÃĄ retomado de onde foi interrompido. Quando este comando for concluído, seus dados estarÃŖo SEGUROS. Agora vocÃĒ pode começar a usar seu array como quiser e periodicamente atualizar as informaçÃĩes de paridade executando o comando `sync`. Scrubbing Para verificar periodicamente os dados e a paridade em busca de erros, vocÃĒ pode executar o comando `scrub`. :snapraid scrub Este comando compara os dados em seu array com o hash calculado durante o comando `sync` para verificar a integridade. Cada execuÃ§ÃŖo do comando verifica aproximadamente 8% do array, excluindo dados jÃĄ examinados nos 10 dias anteriores. VocÃĒ pode usar a opÃ§ÃŖo -p, --plan para especificar uma quantidade diferente e a opÃ§ÃŖo -o, --older-than para especificar uma idade diferente em dias. Por exemplo, para verificar 5% do array em busca de blocos com mais de 20 dias, use: :snapraid -p 5 -o 20 scrub Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, os blocos correspondentes serÃŖo marcados como ruins no arquivo de `content` e listados no comando `status`. :snapraid status Para corrigi-los, vocÃĒ pode usar o comando `fix`, filtrando por blocos ruins com a opÃ§ÃŖo -e, --filter-error: :snapraid -e fix Na prÃŗxima execuÃ§ÃŖo de `scrub`, os erros desaparecerÃŖo do relatÃŗrio de `status` se estiverem realmente corrigidos. Para tornÃĄ-lo mais rÃĄpido, vocÃĒ pode usar -p bad para examinar apenas blocos marcados como ruins. :snapraid -p bad scrub Executar `scrub` em um array nÃŖo sincronizado pode relatar erros causados por arquivos removidos ou modificados. Esses erros sÃŖo relatados na saída de `scrub`, mas os blocos relacionados nÃŖo sÃŖo marcados como ruins. Pooling Nota: O recurso de pooling descrito abaixo foi substituído pela ferramenta mergerfs, que agora Ê a opÃ§ÃŖo recomendada para usuÃĄrios Linux na comunidade SnapRAID. Mergefs oferece uma maneira mais flexível e eficiente de agrupar vÃĄrias unidades em um Ãēnico ponto de montagem unificado, permitindo acesso perfeito a arquivos em todo o seu array sem depender de links simbÃŗlicos. Ele se integra bem ao SnapRAID para proteÃ§ÃŖo de paridade e Ê comumente usado em configuraçÃĩes como OpenMediaVault (OMV) ou configuraçÃĩes NAS personalizadas. Para ter todos os arquivos em seu array mostrados na mesma ÃĄrvore de diretÃŗrios, vocÃĒ pode habilitar o recurso de `pooling`. Ele cria uma visualizaÃ§ÃŖo virtual somente leitura de todos os arquivos em seu array usando links simbÃŗlicos. VocÃĒ pode configurar o diretÃŗrio de `pooling` no arquivo de configuraÃ§ÃŖo com: :pool /pool ou, se vocÃĒ estiver no Windows, com: :pool C:\pool e, em seguida, executar o comando `pool` para criar ou atualizar a visualizaÃ§ÃŖo virtual. :snapraid pool Se vocÃĒ estiver usando uma plataforma Unix e quiser compartilhar este diretÃŗrio pela rede com mÃĄquinas Windows ou Unix, vocÃĒ deve adicionar as seguintes opçÃĩes ao seu /etc/samba/smb.conf: :# Na seÃ§ÃŖo global de smb.conf :unix extensions = no :# Na seÃ§ÃŖo de compartilhamento de smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes No Windows, compartilhar links simbÃŗlicos por uma rede requer que os clientes os resolvam remotamente. Para habilitar isso, alÊm de compartilhar o diretÃŗrio do pool, vocÃĒ tambÊm deve compartilhar todos os discos de forma independente, usando os nomes de disco definidos no arquivo de configuraÃ§ÃŖo como pontos de compartilhamento. VocÃĒ tambÊm deve especificar na opÃ§ÃŖo `share` do arquivo de configuraÃ§ÃŖo o caminho UNC do Windows que os clientes remotos precisam usar para acessar esses discos compartilhados. Por exemplo, operando a partir de um servidor chamado `darkstar`, vocÃĒ pode usar as opçÃĩes: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar e compartilhar os seguintes diretÃŗrios pela rede: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array para permitir que clientes remotos acessem todos os arquivos em \\darkstar\pool. VocÃĒ tambÊm pode precisar configurar clientes remotos para habilitar o acesso a symlinks remotos com o comando: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Desexcluir (Undeleting) O SnapRAID funciona mais como um programa de backup do que como um sistema RAID, e pode ser usado para restaurar ou desexcluir arquivos para seu estado anterior usando a opÃ§ÃŖo -f, --filter: :snapraid fix -f FILE ou para um diretÃŗrio: :snapraid fix -f DIR/ VocÃĒ tambÊm pode usÃĄ-lo para recuperar apenas arquivos excluídos acidentalmente dentro de um diretÃŗrio usando a opÃ§ÃŖo -m, --filter-missing, que restaura apenas arquivos ausentes, deixando todos os outros intocados. :snapraid fix -m -f DIR/ Ou para recuperar todos os arquivos excluídos em todas as unidades com: :snapraid fix -m Recuperando O pior aconteceu e vocÃĒ perdeu um ou mais discos! NÃO ENTRE EM PÂNICO! VocÃĒ serÃĄ capaz de recuperÃĄ-los! A primeira coisa que vocÃĒ deve fazer Ê evitar mais alteraçÃĩes em seu array de discos. Desabilite quaisquer conexÃĩes remotas a ele e quaisquer processos agendados, incluindo qualquer sincronizaÃ§ÃŖo noturna ou scrub agendado do SnapRAID. Em seguida, prossiga com as seguintes etapas. PASSO 1 -> Reconfigurar VocÃĒ precisa de algum espaço para recuperar, idealmente em discos sobressalentes adicionais, mas um disco USB externo ou um disco remoto serÃĄ suficiente. Modifique o arquivo de configuraÃ§ÃŖo do SnapRAID para fazer com que a opÃ§ÃŖo `data` ou `parity` do disco com falha aponte para um local com espaço vazio suficiente para recuperar os arquivos. Por exemplo, se o disco `d1` falhou, mude de: :data d1 /mnt/disk1/ para: :data d1 /mnt/new_spare_disk/ Se o disco a ser recuperado for um disco de paridade, atualize a opÃ§ÃŖo `parity` apropriada. Se vocÃĒ tiver vÃĄrios discos com falha, atualize todas as opçÃĩes de configuraÃ§ÃŖo deles. PASSO 2 -> Corrigir Execute o comando fix, armazenando o log em um arquivo externo com: :snapraid -d NAME -l fix.log fix Onde NAME Ê o nome do disco, como `d1` em nosso exemplo anterior. Se o disco a ser recuperado for um disco de paridade, use os nomes `parity`, `2-parity`, etc. Se vocÃĒ tiver vÃĄrios discos com falha, use vÃĄrias opçÃĩes -d para especificar todos eles. Este comando levarÃĄ muito tempo. Certifique-se de ter alguns gigabytes livres para armazenar o arquivo fix.log. Execute-o a partir de um disco com espaço livre suficiente. Agora vocÃĒ recuperou tudo o que Ê recuperÃĄvel. Se alguns arquivos estiverem parcialmente ou totalmente irrecuperÃĄveis, eles serÃŖo renomeados adicionando a extensÃŖo `.unrecoverable`. VocÃĒ pode encontrar uma lista detalhada de todos os blocos irrecuperÃĄveis no arquivo fix.log, verificando todas as linhas que começam com `unrecoverable:`. Se vocÃĒ nÃŖo estiver satisfeito com a recuperaÃ§ÃŖo, pode tentar novamente quantas vezes quiser. Por exemplo, se vocÃĒ removeu arquivos do array apÃŗs a Ãēltima `sync`, isso pode resultar em alguns arquivos nÃŖo sendo recuperados. Neste caso, vocÃĒ pode tentar novamente o `fix` usando a opÃ§ÃŖo -i, --import, especificando onde esses arquivos estÃŖo agora para incluí-los novamente no processo de recuperaÃ§ÃŖo. Se vocÃĒ estiver satisfeito com a recuperaÃ§ÃŖo, pode prosseguir, mas observe que, apÃŗs a sincronizaÃ§ÃŖo, vocÃĒ nÃŖo pode mais tentar o comando `fix` novamente! PASSO 3 -> Checar Como uma verificaÃ§ÃŖo cautelosa, vocÃĒ pode agora executar um comando `check` para garantir que tudo esteja correto no disco recuperado. :snapraid -d NAME -a check Onde NAME Ê o nome do disco, como `d1` em nosso exemplo anterior. As opçÃĩes -d e -a dizem ao SnapRAID para verificar apenas o disco especificado e ignorar todos os dados de paridade. Este comando levarÃĄ muito tempo, mas se vocÃĒ nÃŖo for excessivamente cauteloso, pode pulÃĄ-lo. PASSO 4 -> Sincronizar Execute o comando `sync` para ressincronizar o array com o novo disco. :snapraid sync Se tudo for recuperado, este comando Ê imediato. Comandos SnapRAID fornece alguns comandos simples que permitem a vocÃĒ: * Imprimir o status do array -> `status` * Controlar os discos -> `smart`, `probe`, `up`, `down` * Fazer um backup/snapshot -> `sync` * Verificar periodicamente os dados -> `scrub` * Restaurar o Ãēltimo backup/snapshot -> `fix`. Os comandos devem ser escritos em letras minÃēsculas. status Imprime um resumo do estado do array de discos. Inclui informaçÃĩes sobre a fragmentaÃ§ÃŖo da paridade, a idade dos blocos sem verificaÃ§ÃŖo e todos os erros silenciosos registrados encontrados durante o scrubbing. As informaçÃĩes apresentadas referem-se à Ãēltima vez que vocÃĒ executou `sync`. ModificaçÃĩes posteriores nÃŖo sÃŖo levadas em conta. Se blocos ruins foram detectados, seus nÃēmeros de bloco sÃŖo listados. Para corrigi-los, vocÃĒ pode usar o comando `fix -e`. TambÊm mostra um grÃĄfico que representa a Ãēltima vez que cada bloco foi examinado (scrubbed) ou sincronizado (synced). Blocos examinados sÃŖo mostrados com `*`, blocos sincronizados, mas ainda nÃŖo examinados, com `o`. Nada Ê modificado. smart Imprime um relatÃŗrio SMART de todos os discos no sistema. Inclui uma estimativa da probabilidade de falha no prÃŗximo ano, permitindo que vocÃĒ planeje substituiçÃĩes de manutenÃ§ÃŖo de discos que mostrem atributos suspeitos. Esta estimativa de probabilidade Ê obtida correlacionando os atributos SMART dos discos com os dados do Backblaze disponíveis em: :https://www.backblaze.com/hard-drive-test-data.html Se o SMART relatar que um disco estÃĄ falhando, `FAIL` ou `PREFAIL` Ê impresso para esse disco, e o SnapRAID retorna com um erro. Neste caso, a substituiÃ§ÃŖo imediata do disco Ê altamente recomendada. Outras possíveis strings de status sÃŖo: logfail - No passado, alguns atributos estavam abaixo do limite. logerr - O log de erros do dispositivo contÊm erros. selferr - O log de autoteste do dispositivo contÊm erros. Se a opÃ§ÃŖo -v, --verbose for especificada, uma anÃĄlise estatística mais profunda Ê fornecida. Esta anÃĄlise pode ajudÃĄ-lo a decidir se vocÃĒ precisa de mais ou menos paridade. Este comando usa a ferramenta `smartctl` e Ê equivalente a executar `smartctl -a` em todos os dispositivos. Se seus dispositivos nÃŖo forem detectados automaticamente corretamente, vocÃĒ pode especificar um comando personalizado usando a opÃ§ÃŖo `smartctl` no arquivo de configuraÃ§ÃŖo. Nada Ê modificado. probe Imprime o estado de ENERGIA de todos os discos no sistema. `Standby` significa que o disco nÃŖo estÃĄ girando. `Active` significa que o disco estÃĄ girando. Este comando usa a ferramenta `smartctl` e Ê equivalente a executar `smartctl -n standby -i` em todos os dispositivos. Se seus dispositivos nÃŖo forem detectados automaticamente corretamente, vocÃĒ pode especificar um comando personalizado usando a opÃ§ÃŖo `smartctl` no arquivo de configuraÃ§ÃŖo. Nada Ê modificado. up Liga (spins up) todos os discos do array. VocÃĒ pode ligar apenas discos específicos usando a opÃ§ÃŖo -d, --filter-disk. Ligar todos os discos ao mesmo tempo requer muita energia. Certifique-se de que sua fonte de alimentaÃ§ÃŖo pode suportar isso. Nada Ê modificado. down Desliga (spins down) todos os discos do array. Este comando usa a ferramenta `smartctl` e Ê equivalente a executar `smartctl -s standby,now` em todos os dispositivos. VocÃĒ pode desligar apenas discos específicos usando a opÃ§ÃŖo -d, --filter-disk. Para desligar automaticamente em caso de erro, vocÃĒ pode usar a opÃ§ÃŖo -s, --spin-down-on-error com qualquer outro comando, o que Ê equivalente a executar `down` manualmente quando ocorre um erro. Nada Ê modificado. diff Lista todos os arquivos modificados desde o Ãēltimo `sync` que precisam ter seus dados de paridade recalculados. Este comando nÃŖo verifica os dados do arquivo, mas apenas o carimbo de data/hora, tamanho e inode do arquivo. ApÃŗs listar todos os arquivos alterados, um resumo das alteraçÃĩes Ê apresentado, agrupado por: equal - Arquivos inalterados de antes. added - Arquivos adicionados que nÃŖo estavam presentes antes. removed - Arquivos removidos. updated - Arquivos com tamanho ou carimbo de data/hora diferente, o que significa que foram modificados. moved - Arquivos movidos para um diretÃŗrio diferente no mesmo disco. Eles sÃŖo identificados por terem o mesmo nome, tamanho, carimbo de data/hora e inode, mas um diretÃŗrio diferente. copied - Arquivos copiados no mesmo disco ou em um disco diferente onde o arquivo original ainda existe. Eles sÃŖo identificados por terem o mesmo nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora de subsegundos for zero, o caminho completo deve corresponder para ser identificado, nÃŖo apenas o nome. relocated - Arquivos movidos no mesmo disco ou em um disco diferente onde o original desapareceu. Eles sÃŖo identificados por terem o mesmo nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora de subsegundos for zero, o caminho completo deve corresponder para ser identificado. Ao contrÃĄrio dos arquivos 'moved' no mesmo disco, os arquivos realocados tÃĒm um inode diferente. restored - Arquivos com um inode diferente, mas com diretÃŗrio, nome, tamanho e carimbo de data/hora correspondentes. Geralmente sÃŖo arquivos restaurados apÃŗs serem excluídos. Se uma `sync` for necessÃĄria, o cÃŗdigo de retorno do processo Ê 2, em vez do padrÃŖo 0. O cÃŗdigo de retorno 1 Ê usado para uma condiÃ§ÃŖo de erro genÊrica. Nada Ê modificado. sync Atualiza as informaçÃĩes de paridade. Todos os arquivos modificados no array de discos sÃŖo lidos, e os dados de paridade correspondentes sÃŖo atualizados. VocÃĒ pode parar este processo a qualquer momento pressionando Ctrl+C, sem perder o trabalho jÃĄ feito. Na prÃŗxima execuÃ§ÃŖo, o processo `sync` serÃĄ retomado de onde foi interrompido. Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, os blocos correspondentes sÃŖo marcados como ruins. Os arquivos sÃŖo identificados por caminho e/ou inode e verificados por tamanho e carimbo de data/hora. Se o tamanho ou carimbo de data/hora do arquivo for diferente, a paridade dos dados Ê recalculada para todo o arquivo. Se o arquivo for movido ou renomeado no mesmo disco, mantendo o mesmo inode, a paridade nÃŖo Ê recalculada. Se o arquivo for movido para outro disco, a paridade Ê recalculada, mas as informaçÃĩes de hash calculadas anteriormente sÃŖo mantidas. Os arquivos `content` e `parity` sÃŖo modificados se necessÃĄrio. Os arquivos no array NÃO sÃŖo modificados. scrub Examina (scrubs) o array, verificando se hÃĄ erros silenciosos ou de entrada/saída nos discos de dados e paridade. Cada invocaÃ§ÃŖo verifica aproximadamente 8% do array, excluindo dados jÃĄ examinados nos Ãēltimos 10 dias. Isso significa que examinar (scrubbing) uma vez por semana garante que cada bit de dados seja verificado pelo menos uma vez a cada trÃĒs meses. VocÃĒ pode definir um plano de scrub ou quantidade diferente usando a opÃ§ÃŖo -p, --plan, que aceita: bad - Examina blocos marcados como ruins. new - Examina blocos recÊm-sincronizados ainda nÃŖo examinados. full - Examina tudo. 0-100 - Examina a porcentagem especificada de blocos. Se vocÃĒ especificar um valor percentual, tambÊm pode usar a opÃ§ÃŖo -o, --older-than para definir a idade mínima do bloco. Os blocos mais antigos sÃŖo examinados primeiro, garantindo uma verificaÃ§ÃŖo ideal. Se vocÃĒ quiser examinar apenas os blocos recÊm-sincronizados ainda nÃŖo examinados, use a opÃ§ÃŖo `-p new`. Para obter detalhes do status do scrub, use o comando `status`. Para qualquer erro silencioso ou de entrada/saída encontrado, os blocos correspondentes sÃŖo marcados como ruins no arquivo de `content`. Esses blocos ruins sÃŖo listados em `status` e podem ser corrigidos com `fix -e`. ApÃŗs a correÃ§ÃŖo, no prÃŗximo scrub, eles serÃŖo verificados novamente e, se considerados corrigidos, a marcaÃ§ÃŖo de ruim serÃĄ removida. Para examinar apenas os blocos ruins, vocÃĒ pode usar o comando `scrub -p bad`. É recomendado executar `scrub` apenas em um array sincronizado para evitar erros relatados causados por dados nÃŖo sincronizados. Esses erros sÃŖo reconhecidos como nÃŖo sendo erros silenciosos, e os blocos nÃŖo sÃŖo marcados como ruins, mas tais erros sÃŖo relatados na saída do comando. O arquivo `content` Ê modificado para atualizar o tempo da Ãēltima verificaÃ§ÃŖo para cada bloco e para marcar blocos ruins. Os arquivos `parity` NÃO sÃŖo modificados. Os arquivos no array NÃO sÃŖo modificados. fix Corrige todos os arquivos e os dados de paridade. Todos os arquivos e dados de paridade sÃŖo comparados com o estado de snapshot salvo na Ãēltima `sync`. Se uma diferença for encontrada, ela Ê revertida para o snapshot armazenado. ATENÇÃO! O comando `fix` nÃŖo diferencia entre erros e modificaçÃĩes intencionais. Ele reverte incondicionalmente o estado do arquivo para a Ãēltima `sync`. Se nenhuma outra opÃ§ÃŖo for especificada, todo o array Ê processado. Use as opçÃĩes de filtro para selecionar um subconjunto de arquivos ou discos para operar. Para corrigir apenas os blocos marcados como ruins durante `sync` e `scrub`, use a opÃ§ÃŖo -e, --filter-error. Ao contrÃĄrio de outras opçÃĩes de filtro, esta aplica correçÃĩes apenas a arquivos que nÃŖo foram alterados desde a Ãēltima `sync`. O SnapRAID renomeia todos os arquivos que nÃŖo podem ser corrigidos adicionando a extensÃŖo `.unrecoverable`. Antes de corrigir, todo o array Ê escaneado para encontrar quaisquer arquivos movidos desde a Ãēltima operaÃ§ÃŖo `sync`. Esses arquivos sÃŖo identificados por seu carimbo de data/hora, ignorando seu nome e diretÃŗrio, e sÃŖo usados no processo de recuperaÃ§ÃŖo, se necessÃĄrio. Se vocÃĒ moveu alguns deles para fora do array, pode usar a opÃ§ÃŖo -i, --import para especificar diretÃŗrios adicionais para escanear. Os arquivos sÃŖo identificados apenas por caminho, nÃŖo por inode. O arquivo `content` NÃO Ê modificado. Os arquivos `parity` sÃŖo modificados se necessÃĄrio. Os arquivos no array sÃŖo modificados se necessÃĄrio. check Verifica todos os arquivos e os dados de paridade. Funciona como `fix`, mas apenas simula uma recuperaÃ§ÃŖo e nenhuma alteraÃ§ÃŖo Ê escrita no array. Este comando Ê destinado principalmente a verificaçÃĩes manuais, como apÃŗs um processo de recuperaÃ§ÃŖo ou em outras condiçÃĩes especiais. Para verificaçÃĩes periÃŗdicas e agendadas, use `scrub`. Se vocÃĒ usar a opÃ§ÃŖo -a, --audit-only, apenas os dados do arquivo sÃŖo verificados, e os dados de paridade sÃŖo ignorados para uma execuÃ§ÃŖo mais rÃĄpida. Os arquivos sÃŖo identificados apenas por caminho, nÃŖo por inode. Nada Ê modificado. list Lista todos os arquivos contidos no array no momento da Ãēltima `sync`. Com -v ou --verbose, o tempo sub-segundo tambÊm Ê mostrado. Nada Ê modificado. dup Lista todos os arquivos duplicados. Dois arquivos sÃŖo considerados iguais se seus hashes corresponderem. Os dados do arquivo nÃŖo sÃŖo lidos; apenas os hashes prÊ-calculados sÃŖo usados. Nada Ê modificado. pool Cria ou atualiza uma visualizaÃ§ÃŖo virtual de todos os arquivos em seu array de discos no diretÃŗrio `pooling`. Os arquivos nÃŖo sÃŖo copiados, mas ligados usando links simbÃŗlicos. Ao atualizar, todos os links simbÃŗlicos existentes e subdiretÃŗrios vazios sÃŖo excluídos e substituídos pela nova visualizaÃ§ÃŖo do array. Quaisquer outros arquivos regulares sÃŖo deixados no lugar. Nada Ê modificado fora do diretÃŗrio do pool. devices Imprime os dispositivos de baixo nível usados pelo array. Este comando exibe as associaçÃĩes de dispositivos no array e destina-se principalmente como uma interface de script. As duas primeiras colunas sÃŖo o ID do dispositivo de baixo nível e o caminho. As prÃŗximas duas colunas sÃŖo o ID do dispositivo de alto nível e o caminho. A Ãēltima coluna Ê o nome do disco no array. Na maioria dos casos, vocÃĒ tem um dispositivo de baixo nível para cada disco no array, mas em algumas configuraçÃĩes mais complexas, vocÃĒ pode ter vÃĄrios dispositivos de baixo nível usados por um Ãēnico disco no array. Nada Ê modificado. touch Define um carimbo de data/hora sub-segundo arbitrÃĄrio para todos os arquivos que o tÃĒm definido como zero. Isso melhora a capacidade do SnapRAID de reconhecer arquivos movidos e copiados, pois torna o carimbo de data/hora quase Ãēnico, reduzindo possíveis duplicatas. Mais especificamente, se o carimbo de data/hora sub-segundo nÃŖo for zero, um arquivo movido ou copiado Ê identificado como tal se corresponder ao nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora sub-segundo for zero, ele Ê considerado uma cÃŗpia apenas se o caminho completo, tamanho e carimbo de data/hora corresponderem. O carimbo de data/hora de precisÃŖo de segundo nÃŖo Ê modificado, portanto, todas as datas e horas de seus arquivos serÃŖo preservadas. rehash Agenda um novo hash de todo o array. Este comando altera o tipo de hash usado, tipicamente ao atualizar de um sistema de 32 bits para um de 64 bits, para alternar do MurmurHash3 para o mais rÃĄpido SpookyHash. Se vocÃĒ jÃĄ estiver usando o hash ideal, este comando nÃŖo faz nada e informa que nenhuma aÃ§ÃŖo Ê necessÃĄria. O novo hash nÃŖo Ê executado imediatamente, mas ocorre progressivamente durante `sync` e `scrub`. VocÃĒ pode verificar o estado do novo hash usando `status`. Durante o novo hash, o SnapRAID mantÊm a funcionalidade total, com a Ãēnica exceÃ§ÃŖo de que `dup` nÃŖo pode detectar arquivos duplicados usando um hash diferente. locate Localiza arquivos armazenados nos discos de paridade. Para cada arquivo correspondente, imprime sua localizaÃ§ÃŖo dentro do arquivo de paridade e o nÃēmero de fragmentos que ocupa. VocÃĒ pode usar a opÃ§ÃŖo -t, --tail para restringir a operaÃ§ÃŖo aos arquivos que ocupam a parte final especificada da paridade. Se desejar realocar esses arquivos, vocÃĒ poderÃĄ usar a opÃ§ÃŖo -W, --force-realloc-tail. Esteja ciente de que tais arquivos nÃŖo estarÃŖo protegidos pela paridade durante o processo de realocaÃ§ÃŖo. OpçÃĩes SnapRAID fornece as seguintes opçÃĩes: -c, --conf CONFIG Seleciona o arquivo de configuraÃ§ÃŖo a ser usado. Se nÃŖo for especificado, no Unix, ele usa o arquivo `/usr/local/etc/snapraid.conf` se existir, caso contrÃĄrio, `/etc/snapraid.conf`. No Windows, ele usa o arquivo `snapraid.conf` no mesmo diretÃŗrio que `snapraid.exe`. -f, --filter PATTERN Filtra os arquivos a serem processados em `check` e `fix`. Apenas os arquivos que correspondem ao padrÃŖo especificado sÃŖo processados. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. Consulte a seÃ§ÃŖo PATTERN para obter mais detalhes sobre especificaçÃĩes de padrÃŖo. No Unix, certifique-se de que os caracteres globbing sejam citados, se usados. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. NÃŖo pode ser usada com `sync` e `scrub`, pois eles sempre processam o array inteiro. -d, --filter-disk NAME Filtra os discos a serem processados em `check`, `fix`, `up` e `down`. VocÃĒ deve especificar um nome de disco conforme definido no arquivo de configuraÃ§ÃŖo. VocÃĒ tambÊm pode especificar discos de paridade com os nomes: `parity`, `2-parity`, `3-parity`, etc., para limitar as operaçÃĩes a um disco de paridade específico. Se vocÃĒ combinar mÃēltiplas opçÃĩes --filter, --filter-disk e --filter-missing, apenas os arquivos que correspondem a todos os filtros sÃŖo selecionados. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. Esta opÃ§ÃŖo pode ser usada apenas com `check`, `fix`, `up` e `down`. NÃŖo pode ser usada com `sync` e `scrub`, pois eles sempre processam o array inteiro. -m, --filter-missing Filtra os arquivos a serem processados em `check` e `fix`. Apenas os arquivos ausentes ou excluídos do array sÃŖo processados. Quando usado com `fix`, isso age como um comando `undelete` (desexcluir). Se vocÃĒ combinar mÃēltiplas opçÃĩes --filter, --filter-disk e --filter-missing, apenas os arquivos que correspondem a todos os filtros sÃŖo selecionados. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. NÃŖo pode ser usada com `sync` e `scrub`, pois eles sempre processam o array inteiro. -e, --filter-error Processa os arquivos com erros em `check` e `fix`. Processa apenas arquivos que tÃĒm blocos marcados com erros silenciosos ou de entrada/saída durante `sync` e `scrub`, conforme listado em `status`. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. -p, --plan PERC|bad|new|full Seleciona o plano de scrub. Se PERC for um valor numÊrico de 0 a 100, ele Ê interpretado como a porcentagem de blocos a serem examinados. Em vez de uma porcentagem, vocÃĒ pode especificar um plano: `bad` examina blocos ruins, `new` examina blocos ainda nÃŖo examinados, e `full` examina tudo. Esta opÃ§ÃŖo pode ser usada apenas com `scrub`. -o, --older-than DAYS Seleciona a parte mais antiga do array a ser processada em `scrub`. DAYS Ê a idade mínima em dias para um bloco ser examinado; o padrÃŖo Ê 10. Os blocos marcados como ruins sÃŖo sempre examinados, independentemente desta opÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com `scrub`. -a, --audit-only Em `check`, verifica o hash dos arquivos sem verificar os dados de paridade. Se vocÃĒ estiver interessado apenas em verificar os dados do arquivo, esta opÃ§ÃŖo pode acelerar significativamente o processo de verificaÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com `check`. -h, --pre-hash Em `sync`, executa uma fase de hash preliminar de todos os novos dados para verificaÃ§ÃŖo adicional antes do cÃĄlculo da paridade. Normalmente, em `sync`, nenhum hash preliminar Ê feito, e os novos dados sÃŖo hashados logo antes do cÃĄlculo da paridade, quando sÃŖo lidos pela primeira vez. Este processo ocorre quando o sistema estÃĄ sob carga pesada, com todos os discos girando e uma CPU ocupada. Esta Ê uma condiÃ§ÃŖo extrema para a mÃĄquina, e se ela tiver um problema de hardware latente, erros silenciosos podem passar despercebidos porque os dados ainda nÃŖo foram hashados. Para evitar esse risco, vocÃĒ pode habilitar o modo `pre-hash` para ter todos os dados lidos duas vezes para garantir sua integridade. Esta opÃ§ÃŖo tambÊm verifica arquivos movidos dentro do array para garantir que a operaÃ§ÃŖo de movimentaÃ§ÃŖo foi bem-sucedida e, se necessÃĄrio, permite que vocÃĒ execute uma operaÃ§ÃŖo fix antes de prosseguir. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -i, --import DIR Importa do diretÃŗrio especificado quaisquer arquivos excluídos do array apÃŗs a Ãēltima `sync`. Se vocÃĒ ainda tiver esses arquivos, eles podem ser usados por `check` e `fix` para melhorar o processo de recuperaÃ§ÃŖo. Os arquivos sÃŖo lidos, incluindo em subdiretÃŗrios, e sÃŖo identificados independentemente de seu nome. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. -s, --spin-down-on-error Em qualquer erro, desliga (spins down) todos os discos gerenciados antes de sair com um cÃŗdigo de status diferente de zero. Isso impede que as unidades permaneçam ativas e girando apÃŗs uma operaÃ§ÃŖo abortada, ajudando a evitar acÃēmulo desnecessÃĄrio de calor e consumo de energia. Use esta opÃ§ÃŖo para garantir que os discos sejam interrompidos com segurança, mesmo quando um comando falhar. -w, --bw-limit RATE Aplica um limite de largura de banda global para todos os discos. A RATE Ê o nÃēmero de bytes por segundo. VocÃĒ pode especificar um multiplicador como K, M ou G (por exemplo, --bw-limit 1G). -t, --tail TAMANHO Limita a listagem de arquivos àqueles que nÃŖo usam mais do que o tamanho final especificado dos discos de paridade. VocÃĒ pode usar multiplicadores como K, M, G ou T (ex: --tail 1G). Esta opÃ§ÃŖo sÃŗ Ê vÃĄlida quando usada em conjunto com o comando `locate`. -A, --stats Habilita uma visualizaÃ§ÃŖo de status estendida que mostra informaçÃĩes adicionais. A tela exibe dois grÃĄficos: O primeiro grÃĄfico mostra o nÃēmero de stripes em buffer para cada disco, juntamente com o caminho do arquivo que estÃĄ sendo acessado atualmente nesse disco. Tipicamente, o disco mais lento nÃŖo terÃĄ buffer disponível, o que determina a largura de banda mÃĄxima alcanÃ§ÃĄvel. O segundo grÃĄfico mostra a porcentagem de tempo gasto esperando nos Ãēltimos 100 segundos. Espera-se que o disco mais lento cause a maior parte do tempo de espera, enquanto outros discos devem ter pouco ou nenhum tempo de espera porque podem usar seus stripes em buffer. Este grÃĄfico tambÊm mostra o tempo gasto esperando por cÃĄlculos de hash e cÃĄlculos RAID. Todos os cÃĄlculos sÃŖo executados em paralelo com as operaçÃĩes de disco. Portanto, enquanto houver tempo de espera mensurÃĄvel para pelo menos um disco, isso indica que a CPU Ê rÃĄpida o suficiente para acompanhar a carga de trabalho. -Z, --force-zero Força a operaÃ§ÃŖo insegura de sincronizar um arquivo com tamanho zero que era anteriormente nÃŖo zero. Se o SnapRAID detectar tal condiÃ§ÃŖo, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte facilmente quando, apÃŗs uma falha do sistema, alguns arquivos acessados foram truncados. Esta Ê uma condiÃ§ÃŖo possível no Linux com os sistemas de arquivos ext3/ext4. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -E, --force-empty Força a operaÃ§ÃŖo insegura de sincronizar um disco com todos os arquivos originais ausentes. Se o SnapRAID detectar que todos os arquivos originalmente presentes no disco estÃŖo ausentes ou foram reescritos, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte facilmente quando um sistema de arquivos de dados nÃŖo estÃĄ montado. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -U, --force-uuid Força a operaÃ§ÃŖo insegura de sincronizar, verificar e corrigir com discos que tiveram seus UUIDs alterados. Se o SnapRAID detectar que alguns discos tiveram seus UUIDs alterados, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte quando seus discos estÃŖo montados nos pontos de montagem errados. No entanto, Ê permitido ter uma Ãēnica mudança de UUID com paridade Ãēnica e mais com paridade mÃēltipla, porque este Ê o caso normal ao substituir discos apÃŗs uma recuperaÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com `sync`, `check` ou `fix`. -D, --force-device Força a operaÃ§ÃŖo insegura de corrigir com discos inacessíveis ou com discos no mesmo dispositivo físico. Por exemplo, se vocÃĒ perdeu dois discos de dados e tem um disco sobressalente para recuperar apenas o primeiro, vocÃĒ pode ignorar o segundo disco inacessível. Ou, se vocÃĒ quiser recuperar um disco no espaço livre restante em um disco jÃĄ usado, compartilhando o mesmo dispositivo físico. Esta opÃ§ÃŖo pode ser usada apenas com `fix`. -N, --force-nocopy Em `sync`, `check` e `fix`, desabilita a heurística de detecÃ§ÃŖo de cÃŗpia. Sem esta opÃ§ÃŖo, o SnapRAID assume que arquivos com os mesmos atributos, como nome, tamanho e carimbo de data/hora, sÃŖo cÃŗpias com os mesmos dados. Isso permite a identificaÃ§ÃŖo de arquivos copiados ou movidos de um disco para outro e reutiliza as informaçÃĩes de hash jÃĄ calculadas para detectar erros silenciosos ou para recuperar arquivos ausentes. Em alguns casos raros, esse comportamento pode resultar em falsos positivos ou em um processo lento devido a muitas verificaçÃĩes de hash, e esta opÃ§ÃŖo permite que vocÃĒ resolva tais problemas. Esta opÃ§ÃŖo pode ser usada apenas com `sync`, `check` e `fix`. -F, --force-full Em `sync`, força um recÃĄlculo completo da paridade. Esta opÃ§ÃŖo pode ser usada quando vocÃĒ adiciona um novo nível de paridade ou se vocÃĒ reverteu para um arquivo de conteÃēdo antigo usando dados de paridade mais recentes. Em vez de recriar a paridade do zero, isso permite que vocÃĒ reutilize os hashes presentes no arquivo de conteÃēdo para validar dados e manter a proteÃ§ÃŖo de dados durante o processo `sync` usando os dados de paridade existentes. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -R, --force-realloc Em `sync`, força uma realocaÃ§ÃŖo completa de arquivos e reconstruÃ§ÃŖo da paridade. Esta opÃ§ÃŖo pode ser usada para realocar completamente todos os arquivos, removendo a fragmentaÃ§ÃŖo, enquanto reutiliza os hashes presentes no arquivo de conteÃēdo para validar dados. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo usÃĄ-la. VocÃĒ NÃO tem proteÃ§ÃŖo de dados durante a operaÃ§ÃŖo `sync`. -W, --force-realloc-tail TAMANHO Funciona como -R, --force-realloc, mas limitado à parte final especificada (Ãēltimos TAMANHO bytes) de cada arquivo de paridade. Força a realocaÃ§ÃŖo (movimentaÃ§ÃŖo) de quaisquer fragmentos/blocos de arquivos atualmente armazenados nessa seÃ§ÃŖo final, permitindo que sejam colocados em qualquer lugar no(s) arquivo(s) de paridade onde houver espaço livre disponível (incluindo espaços vazios existentes). O objetivo principal desta opÃ§ÃŖo Ê diminuir o tamanho em disco do arquivo de paridade. Se a realocaÃ§ÃŖo limpar com sucesso toda a seÃ§ÃŖo final (nenhum bloco permanecer usando-a), o arquivo de paridade serÃĄ truncado, recuperando o espaço final nÃŖo utilizado. VocÃĒ pode usar multiplicadores como K, M, G ou T (ex: --force-realloc-tail 1G). VocÃĒ pode usar locate -t, --tail para saber antecipadamente os arquivos afetados. AVISO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo utilizÃĄ-la. VocÃĒ NÃO terÃĄ proteÃ§ÃŖo de datos durante a operaÃ§ÃŖo `sync` para os arquivos afetados. -l, --log FILE Escreve um log detalhado para o arquivo especificado. Se esta opÃ§ÃŖo nÃŖo for especificada, erros inesperados sÃŖo impressos na tela, resultando potencialmente em saída excessiva em caso de muitos erros. Quando -l, --log Ê especificado, apenas erros fatais que fazem o SnapRAID parar sÃŖo impressos na tela. Se o caminho começar com `>>`, o arquivo Ê aberto no modo de anexaÃ§ÃŖo. OcorrÃĒncias de `%D` e `%T` no nome sÃŖo substituídas pela data e hora no formato YYYYMMDD e HHMMSS. Em arquivos em lote do Windows, vocÃĒ deve duplicar o caractere `%`, por exemplo, resultado-%%D.log. Para usar `>>`, vocÃĒ deve colocar o nome entre aspas, por exemplo, `">>resultado.log"`. Para enviar o log para a saída padrÃŖo ou erro padrÃŖo, vocÃĒ pode usar `">&1"` e `">&2"`, respectivamente. Consulte o arquivo snapraid_log.txt ou a pÃĄgina man para descriçÃĩes de tags de log. -L, --error-limit NUMBER Define um novo limite de erro antes de interromper a execuÃ§ÃŖo. Por padrÃŖo, o SnapRAID para se encontrar mais de 100 erros de entrada/saída, indicando que um disco provavelmente estÃĄ falhando. Esta opÃ§ÃŖo afeta `sync` e `scrub`, que tÃĒm permissÃŖo para continuar apÃŗs o primeiro conjunto de erros de disco para tentar completar suas operaçÃĩes. No entanto, `check` e `fix` sempre param no primeiro erro. -S, --start BLKSTART Começa o processamento a partir do nÃēmero de bloco especificado. Isso pode ser Ãētil para tentar verificar ou corrigir blocos específicos em caso de um disco danificado. Esta opÃ§ÃŖo Ê principalmente para recuperaÃ§ÃŖo manual avançada. -B, --count BLKCOUNT Processa apenas o nÃēmero especificado de blocos. Esta opÃ§ÃŖo Ê principalmente para recuperaÃ§ÃŖo manual avançada. -C, --gen-conf CONTENT Gera um arquivo de configuraÃ§ÃŖo dummy a partir de um arquivo de conteÃēdo existente. O arquivo de configuraÃ§ÃŖo Ê escrito na saída padrÃŖo e nÃŖo sobrescreve um existente. Este arquivo de configuraÃ§ÃŖo tambÊm contÊm as informaçÃĩes necessÃĄrias para reconstruir os pontos de montagem do disco, caso vocÃĒ perca todo o sistema. -v, --verbose Imprime mais informaçÃĩes na tela. Se especificado uma vez, ele imprime arquivos excluídos e estatísticas adicionais. Esta opÃ§ÃŖo nÃŖo tem efeito nos arquivos de log. -q, --quiet Imprime menos informaçÃĩes na tela. Se especificado uma vez, remove a barra de progresso; duas vezes, as operaçÃĩes em execuÃ§ÃŖo; trÃĒs vezes, as mensagens de informaÃ§ÃŖo; quatro vezes, as mensagens de status. Erros fatais sÃŖo sempre impressos na tela. Esta opÃ§ÃŖo nÃŖo tem efeito nos arquivos de log. -H, --help Imprime uma tela de ajuda curta. -V, --version Imprime a versÃŖo do programa. ConfiguraÃ§ÃŖo SnapRAID requer um arquivo de configuraÃ§ÃŖo para saber onde seu array de discos estÃĄ localizado e onde armazenar as informaçÃĩes de paridade. No Unix, ele usa o arquivo `/usr/local/etc/snapraid.conf` se existir, caso contrÃĄrio, `/etc/snapraid.conf`. No Windows, ele usa o arquivo `snapraid.conf` no mesmo diretÃŗrio que `snapraid.exe`. Deve conter as seguintes opçÃĩes (sensível a maiÃēsculas/minÃēsculas): parity FILE [,FILE] ... Define os arquivos a serem usados para armazenar as informaçÃĩes de paridade. A paridade permite proteÃ§ÃŖo contra uma Ãēnica falha de disco, semelhante ao RAID5. VocÃĒ pode especificar vÃĄrios arquivos, que devem estar em discos diferentes. Quando um arquivo nÃŖo pode mais crescer, o prÃŗximo Ê usado. O espaço total disponível deve ser pelo menos tÃŖo grande quanto o maior disco de dados no array. VocÃĒ pode adicionar arquivos de paridade adicionais mais tarde, mas vocÃĒ nÃŖo pode reordenar ou removÃĒ-los. Manter os discos de paridade reservados para paridade garante que eles nÃŖo se fragmentem, melhorando o desempenho. No Windows, 256 MB sÃŖo deixados sem uso em cada disco para evitar o aviso sobre discos cheios. Esta opÃ§ÃŖo Ê obrigatÃŗria e pode ser usada apenas uma vez. (2,3,4,5,6)-parity FILE [,FILE] ... Define os arquivos a serem usados para armazenar informaçÃĩes de paridade extra. Para cada nível de paridade especificado, um nível adicional de proteÃ§ÃŖo Ê habilitado: * 2-parity habilita paridade dupla RAID6. * 3-parity habilita paridade tripla. * 4-parity habilita paridade quÃĄdrupla (quatro). * 5-parity habilita paridade penta (cinco). * 6-parity habilita paridade hexa (seis). Cada nível de paridade requer a presença de todos os níveis de paridade anteriores. As mesmas consideraçÃĩes que para a opÃ§ÃŖo `parity` se aplicam. Estas opçÃĩes sÃŖo opcionais e podem ser usadas apenas uma vez. z-parity FILE [,FILE] ... Define um arquivo e formato alternativo para armazenar paridade tripla. Esta opÃ§ÃŖo Ê uma alternativa a `3-parity`, destinada principalmente a CPUs de baixo custo como ARM ou AMD Phenom, Athlon e Opteron que nÃŖo suportam o conjunto de instruçÃĩes SSSE3. Nesses casos, ela fornece melhor desempenho. Este formato Ê semelhante, mas mais rÃĄpido do que o usado pelo ZFS RAIDZ3. Assim como o ZFS, ele nÃŖo funciona alÊm da paridade tripla. Ao usar `3-parity`, vocÃĒ serÃĄ avisado se for recomendado usar o formato `z-parity` para melhoria de desempenho. É possível converter de um formato para outro ajustando o arquivo de configuraÃ§ÃŖo com o z-parity ou 3-parity desejado e usando `fix` para recriÃĄ-lo. content FILE Define o arquivo a ser usado para armazenar a lista e os checksums de todos os arquivos presentes em seu array de discos. Pode ser colocado em um disco usado para dados, paridade ou qualquer outro disco disponível. Se vocÃĒ usar um disco de dados, este arquivo Ê automaticamente excluído do processo `sync`. Esta opÃ§ÃŖo Ê obrigatÃŗria e pode ser usada vÃĄrias vezes para salvar mÃēltiplas cÃŗpias do mesmo arquivo. VocÃĒ deve armazenar pelo menos uma cÃŗpia para cada disco de paridade usado mais um. Usar cÃŗpias adicionais nÃŖo prejudica. data NAME DIR Define o nome e o ponto de montagem dos discos de dados no array. NAME Ê usado para identificar o disco e deve ser Ãēnico. DIR Ê o ponto de montagem do disco no sistema de arquivos. VocÃĒ pode alterar o ponto de montagem conforme necessÃĄrio, desde que mantenha o NAME fixo. VocÃĒ deve usar uma opÃ§ÃŖo para cada disco de dados no array. VocÃĒ pode renomear um disco mais tarde alterando o NAME diretamente no arquivo de configuraÃ§ÃŖo e, em seguida, executando um comando `sync`. No caso de renomeaÃ§ÃŖo, a associaÃ§ÃŖo Ê feita usando o UUID armazenado dos discos. extra NAME DIR Define o nome e o ponto de montagem de discos adicionais para monitorar com os comandos `smart` e `probe`. Isso Ê Ãētil para monitorar discos que nÃŖo fazem parte da matriz, mas que sÃŖo necessÃĄrios para o funcionamento do sistema, como o disco de inicializaÃ§ÃŖo. Observe que tais discos nÃŖo sÃŖo afetados pelos comandos `up` e `down` porque se espera que estejam sempre girando. nohidden Exclui todos os arquivos e diretÃŗrios ocultos. No Unix, arquivos ocultos sÃŖo aqueles que começam com `.`. No Windows, sÃŖo aqueles com o atributo oculto. exclude/include PATTERN Define os padrÃĩes de arquivo ou diretÃŗrio a serem excluídos ou incluídos no processo de sincronizaÃ§ÃŖo. Todos os padrÃĩes sÃŖo processados na ordem especificada. Se o primeiro padrÃŖo que corresponde for um `exclude`, o arquivo Ê excluído. Se for um `include`, o arquivo Ê incluído. Se nenhum padrÃŖo corresponder, o arquivo Ê excluído se o Ãēltimo padrÃŖo especificado for um `include`, ou incluído se o Ãēltimo padrÃŖo especificado for um `exclude`. Consulte a seÃ§ÃŖo PATTERN para obter mais detalhes sobre especificaçÃĩes de padrÃŖo. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. blocksize SIZE_IN_KIBIBYTES Define o tamanho bÃĄsico do bloco em kibibytes para a paridade. Um kibibyte Ê 1024 bytes. O `blocksize` padrÃŖo Ê 256, o que deve funcionar para a maioria dos casos. ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo alterar este valor. Para alterar este valor no futuro, vocÃĒ precisarÃĄ recriar toda a paridade! Uma razÃŖo para usar um `blocksize` diferente Ê se vocÃĒ tiver muitos arquivos pequenos, na ordem de milhÃĩes. Para cada arquivo, mesmo que apenas alguns bytes, um bloco inteiro de paridade Ê alocado, e com muitos arquivos, isso pode resultar em espaço de paridade nÃŖo utilizado significativo. Quando vocÃĒ preenche completamente o disco de paridade, vocÃĒ nÃŖo estÃĄ autorizado a adicionar mais arquivos aos discos de dados. No entanto, a paridade desperdiçada nÃŖo se acumula em todos os discos de dados. O espaço desperdiçado resultante de um grande nÃēmero de arquivos em um disco de dados limita apenas a quantidade de dados nesse disco de dados, nÃŖo em outros. Como uma aproximaÃ§ÃŖo, vocÃĒ pode assumir que metade do tamanho do bloco Ê desperdiçada para cada arquivo. Por exemplo, com 100.000 arquivos e um tamanho de bloco de 256 KiB, vocÃĒ desperdiçarÃĄ 12,8 GB de paridade, o que pode resultar em 12,8 GB a menos de espaço disponível no disco de dados. VocÃĒ pode verificar a quantidade de espaço desperdiçado em cada disco usando `status`. Esta Ê a quantidade de espaço que vocÃĒ deve deixar livre nos discos de dados ou usar para arquivos nÃŖo incluídos no array. Se este valor for negativo, significa que vocÃĒ estÃĄ perto de encher a paridade e representa o espaço que vocÃĒ ainda pode desperdiçar. Para evitar esse problema, vocÃĒ pode usar uma partiÃ§ÃŖo maior para paridade. Por exemplo, se a partiÃ§ÃŖo de paridade for 12,8 GB maior que os discos de dados, vocÃĒ tem espaço extra suficiente para lidar com atÊ 100.000 arquivos em cada disco de dados sem qualquer espaço desperdiçado. Um truque para obter uma partiÃ§ÃŖo de paridade maior no Linux Ê formatÃĄ-la com o comando: :mkfs.ext4 -m 0 -T largefile4 DEVICE Isso resulta em cerca de 1,5% de espaço extra, aproximadamente 60 GB para um disco de 4 TB, o que permite cerca de 460.000 arquivos em cada disco de dados sem qualquer espaço desperdiçado. hashsize SIZE_IN_BYTES Define o tamanho do hash em bytes para os blocos salvos. O `hashsize` padrÃŖo Ê 16 bytes (128 bits), o que deve funcionar para a maioria dos casos. ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo alterar este valor. Para alterar este valor no futuro, vocÃĒ precisarÃĄ recriar toda a paridade! Uma razÃŖo para usar um `hashsize` diferente Ê se o seu sistema tiver memÃŗria limitada. Como regra geral, o SnapRAID tipicamente requer 1 GiB de RAM para cada 16 TB de dados no array. Especificamente, para armazenar os hashes dos dados, o SnapRAID requer aproximadamente TS*(1+HS)/BS bytes de RAM, onde TS Ê o tamanho total em bytes do seu array de discos, BS Ê o tamanho do bloco em bytes, e HS Ê o tamanho do hash em bytes. Por exemplo, com 8 discos de 4 TB, um tamanho de bloco de 256 KiB (1 KiB = 1024 bytes), e um tamanho de hash de 16, vocÃĒ obtÊm: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Mudando para um tamanho de hash de 8, vocÃĒ obtÊm: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Mudando para um tamanho de bloco de 512, vocÃĒ obtÊm: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Mudando para um tamanho de hash de 8 e um tamanho de bloco de 512, vocÃĒ obtÊm: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB autosave SIZE_IN_GIGABYTES Salva automaticamente o estado ao sincronizar ou examinar apÃŗs a quantidade especificada de GB processados. Esta opÃ§ÃŖo Ê Ãētil para evitar reiniciar longos comandos `sync` do zero se interrompidos por uma falha de mÃĄquina ou qualquer outro evento. temp_limit TEMPERATURE_CELSIUS Define a temperatura mÃĄxima permitida do disco em Celsius. Quando especificado, o SnapRAID verifica periodicamente a temperatura de todos os discos usando a ferramenta smartctl. As temperaturas atuais dos discos sÃŖo exibidas enquanto o SnapRAID estÃĄ operando. Se algum disco exceder este limite, todas as operaçÃĩes param, e os discos sÃŖo desligados (colocados em standby) pela duraÃ§ÃŖo definida pela opÃ§ÃŖo `temp_sleep`. ApÃŗs o período de espera, as operaçÃĩes sÃŖo retomadas, potencialmente pausando novamente se o limite de temperatura for atingido mais uma vez. Durante a operaÃ§ÃŖo, o SnapRAID tambÊm analisa a curva de aquecimento de cada disco e estima a temperatura estÃĄvel de longo prazo que eles devem atingir se a atividade continuar. A estimativa Ê realizada apenas depois que a temperatura do disco aumentou quatro vezes, garantindo que pontos de dados suficientes estejam disponíveis para estabelecer uma tendÃĒncia confiÃĄvel. Esta temperatura estÃĄvel prevista Ê mostrada entre parÃĒnteses ao lado do valor atual e ajuda a avaliar se o resfriamento do sistema Ê adequado. Esta temperatura estimada Ê apenas para fins informativos e nÃŖo tem efeito no comportamento do SnapRAID. As açÃĩes do programa sÃŖo baseadas exclusivamente nas temperaturas reais medidas dos discos. Para realizar esta anÃĄlise, o SnapRAID precisa de uma referÃĒncia para a temperatura do sistema. Ele tenta primeiro lÃĒ-la dos sensores de hardware disponíveis. Se nenhum sensor do sistema puder ser acessado, ele usa a temperatura mais baixa do disco medida no início da execuÃ§ÃŖo como referÃĒncia de fallback. Normalmente, o SnapRAID mostra apenas a temperatura do disco mais quente. Para exibir a temperatura de todos os discos, use a opÃ§ÃŖo -A ou --stats. temp_sleep TIME_IN_MINUTES Define o tempo de espera (standby time), em minutos, quando o limite de temperatura Ê atingido. Durante este período, os discos permanecem desligados. O padrÃŖo Ê 5 minutos. pool DIR Define o diretÃŗrio de pooling onde a visualizaÃ§ÃŖo virtual do array de discos Ê criada usando o comando `pool`. O diretÃŗrio jÃĄ deve existir. share UNC_DIR Define o caminho UNC do Windows necessÃĄrio para acessar os discos remotamente. Se esta opÃ§ÃŖo for especificada, os links simbÃŗlicos criados no diretÃŗrio do pool usam este caminho UNC para acessar os discos. Sem esta opÃ§ÃŖo, os links simbÃŗlicos gerados usam apenas caminhos locais, o que nÃŖo permite compartilhar o diretÃŗrio do pool pela rede. Os links simbÃŗlicos sÃŖo formados usando o caminho UNC especificado, adicionando o nome do disco conforme especificado na opÃ§ÃŖo `data`, e finalmente adicionando o diretÃŗrio e nome do arquivo. Esta opÃ§ÃŖo Ê necessÃĄria apenas para Windows. smartctl DISK/PARITY OPTIONS... Define opçÃĩes smartctl personalizadas para obter os atributos SMART para cada disco. Isso pode ser necessÃĄrio para controladores RAID e alguns discos USB que nÃŖo podem ser detectados automaticamente. O placeholder %s Ê substituído pelo nome do dispositivo, mas Ê opcional para dispositivos fixos como controladores RAID. DISK Ê o mesmo nome de disco especificado na opÃ§ÃŖo `data`. PARITY Ê um dos nomes de paridade: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. Nas OPTIONS especificadas, a string `%s` Ê substituída pelo nome do dispositivo. Para controladores RAID, o dispositivo Ê provavelmente fixo, e vocÃĒ pode nÃŖo precisar usar `%s`. Consulte a documentaÃ§ÃŖo do smartmontools para possíveis opçÃĩes: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices Por exemplo: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignora o atributo SMART especificado ao calcular a probabilidade de falha do disco. Esta opÃ§ÃŖo Ê Ãētil se um disco relatar valores incomuns ou enganosos para um atributo específico. DISK Ê o mesmo nome de disco especificado na opÃ§ÃŖo `data`. PARITY Ê um dos nomes de paridade: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. O valor especial * pode ser usado para ignorar o atributo em todos os discos. Por exemplo, para ignorar o atributo `Current Pending Sector Count` em todos os discos: :smartignore * 197 Para ignorÃĄ-lo apenas no primeiro disco de paridade: :smartignore parity 197 Exemplos Um exemplo de uma configuraÃ§ÃŖo típica para Unix Ê: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Um exemplo de uma configuraÃ§ÃŖo típica para Windows Ê: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 PadrÃŖo (Pattern) Os padrÃĩes fornecem uma maneira flexível de filtrar arquivos para inclusÃŖo ou exclusÃŖo. Ao usar caracteres de globbing, vocÃĒ pode definir regras que correspondam a nomes de arquivos específicos ou estruturas de diretÃŗrios inteiras sem listar cada caminho manualmente. O ponto de interrogaÃ§ÃŖo `?` corresponde a qualquer caractere Ãēnico, exceto o separador de diretÃŗrios. Isso o torna Ãētil para corresponder nomes de arquivos com caracteres variÃĄveis, mantendo o padrÃŖo confinado a um Ãēnico nível de diretÃŗrio. O asterisco simples `*` corresponde a qualquer sequÃĒncia de caracteres, mas, como o ponto de interrogaÃ§ÃŖo, nunca cruza as fronteiras do diretÃŗrio. Ele para na barra invertida, tornando-o adequado para correspondÃĒncia dentro de um Ãēnico componente de caminho. Este Ê o comportamento padrÃŖo de curinga familiar do globbing de shell. O asterisco duplo `**` Ê mais poderoso, ele corresponde a qualquer sequÃĒncia de caracteres, incluindo separadores de diretÃŗrios. Isso permite que os padrÃĩes correspondam em vÃĄrios níveis de diretÃŗrio. Quando o `**` aparece incorporado diretamente em um padrÃŖo, ele pode corresponder a zero ou mais caracteres, incluindo barras entre o texto literal circundante. O uso mais importante do `**` Ê na forma especial `/**/`. Isso corresponde a zero ou mais níveis de diretÃŗrio completos, tornando possível corresponder arquivos em qualquer profundidade em uma ÃĄrvore de diretÃŗrios sem conhecer a estrutura exata do caminho. Por exemplo, o padrÃŖo `src/**/main.js` corresponde a `src/main.js` (pulando zero diretÃŗrios), `src/ui/main.js` (pulando um diretÃŗrio) e `src/ui/components/main.js` (pulando dois diretÃŗrios). Classes de caracteres usando colchetes `[]` correspondem a um Ãēnico caractere de um conjunto ou intervalo especificado. Como os outros padrÃĩes de caractere Ãēnico, elas nÃŖo correspondem a separadores de diretÃŗrio. As classes suportam intervalos e negaÃ§ÃŖo usando um ponto de exclamaÃ§ÃŖo. A distinÃ§ÃŖo fundamental a ser lembrada Ê que `*`, `?` e classes de caracteres respeitam os limites do diretÃŗrio e correspondem apenas dentro de um Ãēnico componente de caminho, enquanto `**` Ê o Ãēnico padrÃŖo que pode corresponder atravÊs de separadores de diretÃŗrio. Existem quatro tipos diferentes de padrÃĩes: =FILE Seleciona qualquer arquivo chamado FILE. Este padrÃŖo se aplica apenas a arquivos, nÃŖo a diretÃŗrios. =DIR/ Seleciona qualquer diretÃŗrio chamado DIR e tudo o que estiver dentro dele. Este padrÃŖo se aplica apenas a diretÃŗrios, nÃŖo a arquivos. =/PATH/FILE Seleciona o caminho exato do arquivo especificado. Este padrÃŖo se aplica apenas a arquivos, nÃŖo a diretÃŗrios. =/PATH/DIR/ Seleciona o caminho exato do diretÃŗrio especificado e tudo o que estiver dentro dele. Este padrÃŖo se aplica apenas a diretÃŗrios, nÃŖo a arquivos. Quando vocÃĒ especifica um caminho absoluto começando com /, ele Ê aplicado no diretÃŗrio raiz do array, nÃŖo no diretÃŗrio raiz do sistema de arquivos local. No Windows, vocÃĒ pode usar a barra invertida \ em vez da barra. DiretÃŗrios do sistema Windows, junctions, pontos de montagem e outros diretÃŗrios especiais do Windows sÃŖo tratados como arquivos, o que significa que para excluí-los, vocÃĒ deve usar uma regra de arquivo, nÃŖo uma de diretÃŗrio. Se o nome do arquivo contiver um caractere `*`, `?`, `[`, ou `]`, vocÃĒ deve escapÃĄ-lo para evitar que seja interpretado como um caractere globbing. No Unix, o caractere de escape Ê `\`; no Windows, Ê `^`. Quando o padrÃŖo estÃĄ na linha de comando, vocÃĒ deve duplicar o caractere de escape para evitar que seja interpretado pelo shell de comando. No arquivo de configuraÃ§ÃŖo, vocÃĒ pode usar diferentes estratÊgias para filtrar os arquivos a serem processados. A abordagem mais simples Ê usar apenas regras `exclude` para remover todos os arquivos e diretÃŗrios que vocÃĒ nÃŖo deseja processar. Por exemplo: :# Exclui qualquer arquivo chamado `*.unrecoverable` :exclude *.unrecoverable :# Exclui o diretÃŗrio raiz `/lost+found` :exclude /lost+found/ :# Exclui qualquer subdiretÃŗrio chamado `tmp` :exclude tmp/ A abordagem oposta Ê definir apenas os arquivos que vocÃĒ deseja processar, usando apenas regras `include`. Por exemplo: :# Inclui apenas alguns diretÃŗrios :include /movies/ :include /musics/ :include /pictures/ A abordagem final Ê misturar regras `exclude` e `include`. Neste caso, a ordem das regras Ê importante. As regras anteriores tÃĒm precedÃĒncia sobre as posteriores. Para simplificar, vocÃĒ pode listar todas as regras `exclude` primeiro e depois todas as regras `include`. Por exemplo: :# Exclui qualquer arquivo chamado `*.unrecoverable` :exclude *.unrecoverable :# Exclui qualquer subdiretÃŗrio chamado `tmp` :exclude tmp/ :# Inclui apenas alguns diretÃŗrios :include /movies/ :include /musics/ :include /pictures/ Na linha de comando, usando a opÃ§ÃŖo -f, vocÃĒ pode usar apenas padrÃĩes `include`. Por exemplo: :# Verifica apenas os arquivos .mp3. :# No Unix, use aspas para evitar a expansÃŖo globbing pelo shell. :snapraid -f "*.mp3" check No Unix, ao usar caracteres globbing na linha de comando, vocÃĒ deve citÃĄ-los para evitar que o shell os expanda. Ignorar Arquivos (Ignore File) AlÊm das regras globais no arquivo de configuraÃ§ÃŖo, vocÃĒ pode colocar arquivos `.snapraidignore` em qualquer diretÃŗrio dentro do array para definir regras de exclusÃŖo descentralizadas. As regras definidas em `.snapraidignore` sÃŖo aplicadas apÃŗs as regras no arquivo de configuraÃ§ÃŖo. Isso significa que elas tÃĒm uma prioridade maior e podem ser usadas para excluir arquivos que foram anteriormente incluídos pela configuraÃ§ÃŖo global. Efetivamente, se uma regra local corresponder, o arquivo Ê excluído independentemente das configuraçÃĩes globais de inclusÃŖo. A lÃŗgica de padrÃĩes no `.snapraidignore` espelha a configuraÃ§ÃŖo global, mas ancora os padrÃĩes ao diretÃŗrio onde o arquivo estÃĄ localizado: =FILE Seleciona qualquer arquivo chamado FILE neste diretÃŗrio ou abaixo. Isso segue as mesmas regras de globbing do padrÃŖo global. =DIR/ Seleciona qualquer diretÃŗrio chamado DIR e tudo dentro dele, residente neste diretÃŗrio ou abaixo. =/PATH/FILE Seleciona o arquivo exato especificado relativo à localizaÃ§ÃŖo do arquivo `.snapraidignore`. =/PATH/DIR/ Seleciona o diretÃŗrio exato especificado e tudo dentro dele, relativo à localizaÃ§ÃŖo do arquivo `.snapraidignore`. Ao contrÃĄrio da configuraÃ§ÃŖo global, os arquivos `.snapraidignore` suportam apenas regras de exclusÃŖo; vocÃĒ nÃŖo pode usar padrÃĩes `include` ou negaÃ§ÃŖo (!). Por exemplo, se vocÃĒ tiver um `.snapraidignore` em `/mnt/disk1/projects/`: :# Exclui APENAS /mnt/disk1/projects/output.bin :/output.bin :# Exclui qualquer diretÃŗrio chamado `build` dentro de projects/ :build/ :# Exclui qualquer arquivo .tmp dentro de projects/ ou suas subpastas :*.tmp ConteÃēdo (Content) SnapRAID armazena a lista e os checksums de seus arquivos no arquivo content. É um arquivo binÃĄrio que lista todos os arquivos presentes em seu array de discos, juntamente com todos os checksums para verificar sua integridade. Este arquivo Ê lido e escrito pelos comandos `sync` e `scrub` e lido pelos comandos `fix`, `check` e `status`. Paridade (Parity) SnapRAID armazena as informaçÃĩes de paridade do seu array nos arquivos parity. Estes sÃŖo arquivos binÃĄrios contendo a paridade calculada de todos os blocos definidos no arquivo `content`. Estes arquivos sÃŖo lidos e escritos pelos comandos `sync` e `fix` e apenas lidos pelos comandos `scrub` e `check`. CodificaÃ§ÃŖo (Encoding) SnapRAID no Unix ignora qualquer codificaÃ§ÃŖo. Ele lÃĒ e armazena os nomes de arquivo com a mesma codificaÃ§ÃŖo usada pelo sistema de arquivos. No Windows, todos os nomes lidos do sistema de arquivos sÃŖo convertidos e processados no formato UTF-8. Para que os nomes de arquivo sejam impressos corretamente, vocÃĒ deve definir o console do Windows para o modo UTF-8 com o comando `chcp 65001` e usar uma fonte TrueType como `Lucida Console` como fonte do console. Isso afeta apenas os nomes de arquivo impressos; se vocÃĒ redirecionar a saída do console para um arquivo, o arquivo resultante estarÃĄ sempre no formato UTF-8. Direitos Autorais (Copyright) Este arquivo Ê Copyright (C) 2025 Andrea Mazzoleni Veja TambÊm (See Also) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-pt.txt000066400000000000000000002140241522717156100170120ustar00rootroot00000000000000 ==================================== SnapRAID Backup para Arrays de Disco ==================================== 1 SINOPSE ========= snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIÃ§ÃŖO =========== SnapRAID Ê um programa de backup projetado para arrays de disco, armazenando informaçÃĩes de paridade para recuperaÃ§ÃŖo de dados no caso de atÊ seis falhas de disco. Destinado principalmente a centros de mídia domÊsticos com arquivos grandes e que mudam com pouca frequÃĒncia, o SnapRAID oferece vÃĄrios recursos: * VocÃĒ pode utilizar discos jÃĄ preenchidos com arquivos sem a necessidade de reformatÃĄ-los, acessando-os normalmente. * Todos os seus dados sÃŖo submetidos a hash para garantir a integridade dos dados e prevenir corrupÃ§ÃŖo silenciosa. * Quando o nÃēmero de discos com falha excede a contagem de paridade, a perda de dados Ê confinada aos discos afetados; os dados em outros discos permanecem acessíveis. * Se vocÃĒ acidentalmente excluir arquivos em um disco, a recuperaÃ§ÃŖo Ê possível. * Os discos podem ter tamanhos diferentes. * VocÃĒ pode adicionar discos a qualquer momento. * O SnapRAID nÃŖo prende seus dados; vocÃĒ pode parar de usÃĄ-lo a qualquer momento sem reformatar ou mover dados. * Para acessar um arquivo, apenas um Ãēnico disco precisa girar (spin), economizando energia e reduzindo o ruído. Para mais informaçÃĩes, visite o site oficial do SnapRAID: https://www.snapraid.it/ 3 LIMITAçÃĩES ============ SnapRAID Ê um híbrido entre um programa RAID e um programa de backup, visando combinar os melhores benefícios de ambos. No entanto, ele tem algumas limitaçÃĩes que vocÃĒ deve considerar antes de usÃĄ-lo. A principal limitaÃ§ÃŖo Ê que, se um disco falhar e vocÃĒ nÃŖo tiver sincronizado recentemente, talvez nÃŖo consiga recuperar totalmente. Mais especificamente, vocÃĒ pode nÃŖo conseguir recuperar atÊ o tamanho dos arquivos alterados ou excluídos desde a Ãēltima operaÃ§ÃŖo de sincronizaÃ§ÃŖo. Isso ocorre mesmo que os arquivos alterados ou excluídos nÃŖo estejam no disco com falha. É por isso que o SnapRAID Ê mais adequado para dados que raramente mudam. Por outro lado, arquivos recÊm-adicionados nÃŖo impedem a recuperaÃ§ÃŖo de arquivos jÃĄ existentes. VocÃĒ perderÃĄ apenas os arquivos adicionados recentemente se estiverem no disco com falha. Outras limitaçÃĩes do SnapRAID sÃŖo: * Com o SnapRAID, vocÃĒ ainda tem sistemas de arquivos separados para cada disco. Com o RAID, vocÃĒ obtÊm um Ãēnico sistema de arquivos grande. * O SnapRAID nÃŖo faz striping de dados. Com o RAID, vocÃĒ obtÊm um aumento de velocidade com striping. * O SnapRAID nÃŖo suporta recuperaÃ§ÃŖo em tempo real. Com o RAID, vocÃĒ nÃŖo precisa parar de trabalhar quando um disco falha. * O SnapRAID pode recuperar dados apenas de um nÃēmero limitado de falhas de disco. Com um backup, vocÃĒ pode recuperar de uma falha completa de todo o array de discos. * Apenas nomes de arquivos, carimbos de data/hora, symlinks e hardlinks sÃŖo salvos. PermissÃĩes, propriedade e atributos estendidos nÃŖo sÃŖo salvos. 4 PRIMEIROS PASSOS ================== Para usar o SnapRAID, vocÃĒ precisa primeiro selecionar um disco em seu array de discos para dedicar às informaçÃĩes de `parity` (paridade). Com um disco para paridade, vocÃĒ poderÃĄ recuperar de uma Ãēnica falha de disco, semelhante ao RAID5. Se vocÃĒ quiser recuperar de mais falhas de disco, semelhante ao RAID6, vocÃĒ deve reservar discos adicionais para paridade. Cada disco de paridade adicional permite a recuperaÃ§ÃŖo de mais uma falha de disco. Como discos de paridade, vocÃĒ deve escolher os maiores discos do array, pois a informaÃ§ÃŖo de paridade pode crescer atÊ o tamanho do maior disco de dados no array. Esses discos serÃŖo dedicados a armazenar os arquivos de `parity`. VocÃĒ nÃŖo deve armazenar seus dados neles. Em seguida, vocÃĒ deve definir os discos de `data` (dados) que deseja proteger com o SnapRAID. A proteÃ§ÃŖo Ê mais eficaz se esses discos contiverem dados que raramente mudam. Por esse motivo, Ê melhor NÃO incluir o disco C:\ do Windows ou os diretÃŗrios /home, /var e /tmp do Unix. A lista de arquivos Ê salva nos arquivos de `content` (conteÃēdo), geralmente armazenados nos discos de dados, paridade ou boot. Este arquivo contÊm os detalhes do seu backup, incluindo todos os checksums para verificar sua integridade. O arquivo de `content` Ê armazenado em vÃĄrias cÃŗpias, e cada cÃŗpia deve estar em um disco diferente para garantir que, mesmo em caso de mÃēltiplas falhas de disco, pelo menos uma cÃŗpia esteja disponível. Por exemplo, suponha que vocÃĒ esteja interessado em apenas um nível de proteÃ§ÃŖo de paridade, e seus discos estejam localizados em: /mnt/diskp <- disco selecionado para paridade /mnt/disk1 <- primeiro disco a proteger /mnt/disk2 <- segundo disco a proteger /mnt/disk3 <- terceiro disco a proteger VocÃĒ deve criar o arquivo de configuraÃ§ÃŖo /etc/snapraid.conf com as seguintes opçÃĩes: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Se vocÃĒ estiver no Windows, deve usar o formato de caminho do Windows, com letras de unidade e barras invertidas em vez de barras. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Se vocÃĒ tiver muitos discos e ficar sem letras de unidade, pode montar discos diretamente em subpastas. Consulte: https://www.google.com/search?q=Windows+mount+point Neste ponto, vocÃĒ estÃĄ pronto para executar o comando `sync` para construir as informaçÃĩes de paridade. snapraid sync Este processo pode levar vÃĄrias horas na primeira vez, dependendo do tamanho dos dados jÃĄ presentes nos discos. Se os discos estiverem vazios, o processo Ê imediato. VocÃĒ pode parÃĄ-lo a qualquer momento pressionando Ctrl+C e, na prÃŗxima execuÃ§ÃŖo, ele serÃĄ retomado de onde foi interrompido. Quando este comando for concluído, seus dados estarÃŖo SEGUROS. Agora vocÃĒ pode começar a usar seu array como quiser e periodicamente atualizar as informaçÃĩes de paridade executando o comando `sync`. 4.1 Scrubbing ------------- Para verificar periodicamente os dados e a paridade em busca de erros, vocÃĒ pode executar o comando `scrub`. snapraid scrub Este comando compara os dados em seu array com o hash calculado durante o comando `sync` para verificar a integridade. Cada execuÃ§ÃŖo do comando verifica aproximadamente 8% do array, excluindo dados jÃĄ examinados nos 10 dias anteriores. VocÃĒ pode usar a opÃ§ÃŖo -p, --plan para especificar uma quantidade diferente e a opÃ§ÃŖo -o, --older-than para especificar uma idade diferente em dias. Por exemplo, para verificar 5% do array em busca de blocos com mais de 20 dias, use: snapraid -p 5 -o 20 scrub Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, os blocos correspondentes serÃŖo marcados como ruins no arquivo de `content` e listados no comando `status`. snapraid status Para corrigi-los, vocÃĒ pode usar o comando `fix`, filtrando por blocos ruins com a opÃ§ÃŖo -e, --filter-error: snapraid -e fix Na prÃŗxima execuÃ§ÃŖo de `scrub`, os erros desaparecerÃŖo do relatÃŗrio de `status` se estiverem realmente corrigidos. Para tornÃĄ-lo mais rÃĄpido, vocÃĒ pode usar -p bad para examinar apenas blocos marcados como ruins. snapraid -p bad scrub Executar `scrub` em um array nÃŖo sincronizado pode relatar erros causados por arquivos removidos ou modificados. Esses erros sÃŖo relatados na saída de `scrub`, mas os blocos relacionados nÃŖo sÃŖo marcados como ruins. 4.2 Pooling ----------- Nota: O recurso de pooling descrito abaixo foi substituído pela ferramenta mergerfs, que agora Ê a opÃ§ÃŖo recomendada para usuÃĄrios Linux na comunidade SnapRAID. Mergefs oferece uma maneira mais flexível e eficiente de agrupar vÃĄrias unidades em um Ãēnico ponto de montagem unificado, permitindo acesso perfeito a arquivos em todo o seu array sem depender de links simbÃŗlicos. Ele se integra bem ao SnapRAID para proteÃ§ÃŖo de paridade e Ê comumente usado em configuraçÃĩes como OpenMediaVault (OMV) ou configuraçÃĩes NAS personalizadas. Para ter todos os arquivos em seu array mostrados na mesma ÃĄrvore de diretÃŗrios, vocÃĒ pode habilitar o recurso de `pooling`. Ele cria uma visualizaÃ§ÃŖo virtual somente leitura de todos os arquivos em seu array usando links simbÃŗlicos. VocÃĒ pode configurar o diretÃŗrio de `pooling` no arquivo de configuraÃ§ÃŖo com: pool /pool ou, se vocÃĒ estiver no Windows, com: pool C:\pool e, em seguida, executar o comando `pool` para criar ou atualizar a visualizaÃ§ÃŖo virtual. snapraid pool Se vocÃĒ estiver usando uma plataforma Unix e quiser compartilhar este diretÃŗrio pela rede com mÃĄquinas Windows ou Unix, vocÃĒ deve adicionar as seguintes opçÃĩes ao seu /etc/samba/smb.conf: # Na seÃ§ÃŖo global de smb.conf unix extensions = no # Na seÃ§ÃŖo de compartilhamento de smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes No Windows, compartilhar links simbÃŗlicos por uma rede requer que os clientes os resolvam remotamente. Para habilitar isso, alÊm de compartilhar o diretÃŗrio do pool, vocÃĒ tambÊm deve compartilhar todos os discos de forma independente, usando os nomes de disco definidos no arquivo de configuraÃ§ÃŖo como pontos de compartilhamento. VocÃĒ tambÊm deve especificar na opÃ§ÃŖo `share` do arquivo de configuraÃ§ÃŖo o caminho UNC do Windows que os clientes remotos precisam usar para acessar esses discos compartilhados. Por exemplo, operando a partir de um servidor chamado `darkstar`, vocÃĒ pode usar as opçÃĩes: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar e compartilhar os seguintes diretÃŗrios pela rede: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array para permitir que clientes remotos acessem todos os arquivos em \\darkstar\pool. VocÃĒ tambÊm pode precisar configurar clientes remotos para habilitar o acesso a symlinks remotos com o comando: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Desexcluir (Undeleting) --------------------------- O SnapRAID funciona mais como um programa de backup do que como um sistema RAID, e pode ser usado para restaurar ou desexcluir arquivos para seu estado anterior usando a opÃ§ÃŖo -f, --filter: snapraid fix -f FILE ou para um diretÃŗrio: snapraid fix -f DIR/ VocÃĒ tambÊm pode usÃĄ-lo para recuperar apenas arquivos excluídos acidentalmente dentro de um diretÃŗrio usando a opÃ§ÃŖo -m, --filter-missing, que restaura apenas arquivos ausentes, deixando todos os outros intocados. snapraid fix -m -f DIR/ Ou para recuperar todos os arquivos excluídos em todas as unidades com: snapraid fix -m 4.4 Recuperando --------------- O pior aconteceu e vocÃĒ perdeu um ou mais discos! NÃO ENTRE EM PÂNICO! VocÃĒ serÃĄ capaz de recuperÃĄ-los! A primeira coisa que vocÃĒ deve fazer Ê evitar mais alteraçÃĩes em seu array de discos. Desabilite quaisquer conexÃĩes remotas a ele e quaisquer processos agendados, incluindo qualquer sincronizaÃ§ÃŖo noturna ou scrub agendado do SnapRAID. Em seguida, prossiga com as seguintes etapas. ---- 4.4.1 PASSO 1 -> Reconfigurar ---- VocÃĒ precisa de algum espaço para recuperar, idealmente em discos sobressalentes adicionais, mas um disco USB externo ou um disco remoto serÃĄ suficiente. Modifique o arquivo de configuraÃ§ÃŖo do SnapRAID para fazer com que a opÃ§ÃŖo `data` ou `parity` do disco com falha aponte para um local com espaço vazio suficiente para recuperar os arquivos. Por exemplo, se o disco `d1` falhou, mude de: data d1 /mnt/disk1/ para: data d1 /mnt/new_spare_disk/ Se o disco a ser recuperado for um disco de paridade, atualize a opÃ§ÃŖo `parity` apropriada. Se vocÃĒ tiver vÃĄrios discos com falha, atualize todas as opçÃĩes de configuraÃ§ÃŖo deles. ---- 4.4.2 PASSO 2 -> Corrigir ---- Execute o comando fix, armazenando o log em um arquivo externo com: snapraid -d NAME -l fix.log fix Onde NAME Ê o nome do disco, como `d1` em nosso exemplo anterior. Se o disco a ser recuperado for um disco de paridade, use os nomes `parity`, `2-parity`, etc. Se vocÃĒ tiver vÃĄrios discos com falha, use vÃĄrias opçÃĩes -d para especificar todos eles. Este comando levarÃĄ muito tempo. Certifique-se de ter alguns gigabytes livres para armazenar o arquivo fix.log. Execute-o a partir de um disco com espaço livre suficiente. Agora vocÃĒ recuperou tudo o que Ê recuperÃĄvel. Se alguns arquivos estiverem parcialmente ou totalmente irrecuperÃĄveis, eles serÃŖo renomeados adicionando a extensÃŖo `.unrecoverable`. VocÃĒ pode encontrar uma lista detalhada de todos os blocos irrecuperÃĄveis no arquivo fix.log, verificando todas as linhas que começam com `unrecoverable:`. Se vocÃĒ nÃŖo estiver satisfeito com a recuperaÃ§ÃŖo, pode tentar novamente quantas vezes quiser. Por exemplo, se vocÃĒ removeu arquivos do array apÃŗs a Ãēltima `sync`, isso pode resultar em alguns arquivos nÃŖo sendo recuperados. Neste caso, vocÃĒ pode tentar novamente o `fix` usando a opÃ§ÃŖo -i, --import, especificando onde esses arquivos estÃŖo agora para incluí-los novamente no processo de recuperaÃ§ÃŖo. Se vocÃĒ estiver satisfeito com a recuperaÃ§ÃŖo, pode prosseguir, mas observe que, apÃŗs a sincronizaÃ§ÃŖo, vocÃĒ nÃŖo pode mais tentar o comando `fix` novamente! ---- 4.4.3 PASSO 3 -> Checar ---- Como uma verificaÃ§ÃŖo cautelosa, vocÃĒ pode agora executar um comando `check` para garantir que tudo esteja correto no disco recuperado. snapraid -d NAME -a check Onde NAME Ê o nome do disco, como `d1` em nosso exemplo anterior. As opçÃĩes -d e -a dizem ao SnapRAID para verificar apenas o disco especificado e ignorar todos os dados de paridade. Este comando levarÃĄ muito tempo, mas se vocÃĒ nÃŖo for excessivamente cauteloso, pode pulÃĄ-lo. ---- 4.4.4 PASSO 4 -> Sincronizar ---- Execute o comando `sync` para ressincronizar o array com o novo disco. snapraid sync Se tudo for recuperado, este comando Ê imediato. 5 COMANDOS ========== SnapRAID fornece alguns comandos simples que permitem a vocÃĒ: * Imprimir o status do array -> `status` * Controlar os discos -> `smart`, `probe`, `up`, `down` * Fazer um backup/snapshot -> `sync` * Verificar periodicamente os dados -> `scrub` * Restaurar o Ãēltimo backup/snapshot -> `fix`. Os comandos devem ser escritos em letras minÃēsculas. 5.1 status ---------- Imprime um resumo do estado do array de discos. Inclui informaçÃĩes sobre a fragmentaÃ§ÃŖo da paridade, a idade dos blocos sem verificaÃ§ÃŖo e todos os erros silenciosos registrados encontrados durante o scrubbing. As informaçÃĩes apresentadas referem-se à Ãēltima vez que vocÃĒ executou `sync`. ModificaçÃĩes posteriores nÃŖo sÃŖo levadas em conta. Se blocos ruins foram detectados, seus nÃēmeros de bloco sÃŖo listados. Para corrigi-los, vocÃĒ pode usar o comando `fix -e`. TambÊm mostra um grÃĄfico que representa a Ãēltima vez que cada bloco foi examinado (scrubbed) ou sincronizado (synced). Blocos examinados sÃŖo mostrados com `*`, blocos sincronizados, mas ainda nÃŖo examinados, com `o`. Nada Ê modificado. 5.2 smart --------- Imprime um relatÃŗrio SMART de todos os discos no sistema. Inclui uma estimativa da probabilidade de falha no prÃŗximo ano, permitindo que vocÃĒ planeje substituiçÃĩes de manutenÃ§ÃŖo de discos que mostrem atributos suspeitos. Esta estimativa de probabilidade Ê obtida correlacionando os atributos SMART dos discos com os dados do Backblaze disponíveis em: https://www.backblaze.com/hard-drive-test-data.html Se o SMART relatar que um disco estÃĄ falhando, `FAIL` ou `PREFAIL` Ê impresso para esse disco, e o SnapRAID retorna com um erro. Neste caso, a substituiÃ§ÃŖo imediata do disco Ê altamente recomendada. Outras possíveis strings de status sÃŖo: logfail - No passado, alguns atributos estavam abaixo do limite. logerr - O log de erros do dispositivo contÊm erros. selferr - O log de autoteste do dispositivo contÊm erros. Se a opÃ§ÃŖo -v, --verbose for especificada, uma anÃĄlise estatística mais profunda Ê fornecida. Esta anÃĄlise pode ajudÃĄ-lo a decidir se vocÃĒ precisa de mais ou menos paridade. Este comando usa a ferramenta `smartctl` e Ê equivalente a executar `smartctl -a` em todos os dispositivos. Se seus dispositivos nÃŖo forem detectados automaticamente corretamente, vocÃĒ pode especificar um comando personalizado usando a opÃ§ÃŖo `smartctl` no arquivo de configuraÃ§ÃŖo. Nada Ê modificado. 5.3 probe --------- Imprime o estado de ENERGIA de todos os discos no sistema. `Standby` significa que o disco nÃŖo estÃĄ girando. `Active` significa que o disco estÃĄ girando. Este comando usa a ferramenta `smartctl` e Ê equivalente a executar `smartctl -n standby -i` em todos os dispositivos. Se seus dispositivos nÃŖo forem detectados automaticamente corretamente, vocÃĒ pode especificar um comando personalizado usando a opÃ§ÃŖo `smartctl` no arquivo de configuraÃ§ÃŖo. Nada Ê modificado. 5.4 up ------ Liga (spins up) todos os discos do array. VocÃĒ pode ligar apenas discos específicos usando a opÃ§ÃŖo -d, --filter-disk. Ligar todos os discos ao mesmo tempo requer muita energia. Certifique-se de que sua fonte de alimentaÃ§ÃŖo pode suportar isso. Nada Ê modificado. 5.5 down -------- Desliga (spins down) todos os discos do array. Este comando usa a ferramenta `smartctl` e Ê equivalente a executar `smartctl -s standby,now` em todos os dispositivos. VocÃĒ pode desligar apenas discos específicos usando a opÃ§ÃŖo -d, --filter-disk. Para desligar automaticamente em caso de erro, vocÃĒ pode usar a opÃ§ÃŖo -s, --spin-down-on-error com qualquer outro comando, o que Ê equivalente a executar `down` manualmente quando ocorre um erro. Nada Ê modificado. 5.6 diff -------- Lista todos os arquivos modificados desde o Ãēltimo `sync` que precisam ter seus dados de paridade recalculados. Este comando nÃŖo verifica os dados do arquivo, mas apenas o carimbo de data/hora, tamanho e inode do arquivo. ApÃŗs listar todos os arquivos alterados, um resumo das alteraçÃĩes Ê apresentado, agrupado por: equal - Arquivos inalterados de antes. added - Arquivos adicionados que nÃŖo estavam presentes antes. removed - Arquivos removidos. updated - Arquivos com tamanho ou carimbo de data/hora diferente, o que significa que foram modificados. moved - Arquivos movidos para um diretÃŗrio diferente no mesmo disco. Eles sÃŖo identificados por terem o mesmo nome, tamanho, carimbo de data/hora e inode, mas um diretÃŗrio diferente. copied - Arquivos copiados no mesmo disco ou em um disco diferente onde o arquivo original ainda existe. Eles sÃŖo identificados por terem o mesmo nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora de subsegundos for zero, o caminho completo deve corresponder para ser identificado, nÃŖo apenas o nome. relocated - Arquivos movidos no mesmo disco ou em um disco diferente onde o original desapareceu. Eles sÃŖo identificados por terem o mesmo nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora de subsegundos for zero, o caminho completo deve corresponder para ser identificado. Ao contrÃĄrio dos arquivos 'moved' no mesmo disco, os arquivos realocados tÃĒm um inode diferente. restored - Arquivos com um inode diferente, mas com diretÃŗrio, nome, tamanho e carimbo de data/hora correspondentes. Geralmente sÃŖo arquivos restaurados apÃŗs serem excluídos. Se uma `sync` for necessÃĄria, o cÃŗdigo de retorno do processo Ê 2, em vez do padrÃŖo 0. O cÃŗdigo de retorno 1 Ê usado para uma condiÃ§ÃŖo de erro genÊrica. Nada Ê modificado. 5.7 sync -------- Atualiza as informaçÃĩes de paridade. Todos os arquivos modificados no array de discos sÃŖo lidos, e os dados de paridade correspondentes sÃŖo atualizados. VocÃĒ pode parar este processo a qualquer momento pressionando Ctrl+C, sem perder o trabalho jÃĄ feito. Na prÃŗxima execuÃ§ÃŖo, o processo `sync` serÃĄ retomado de onde foi interrompido. Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, os blocos correspondentes sÃŖo marcados como ruins. Os arquivos sÃŖo identificados por caminho e/ou inode e verificados por tamanho e carimbo de data/hora. Se o tamanho ou carimbo de data/hora do arquivo for diferente, a paridade dos dados Ê recalculada para todo o arquivo. Se o arquivo for movido ou renomeado no mesmo disco, mantendo o mesmo inode, a paridade nÃŖo Ê recalculada. Se o arquivo for movido para outro disco, a paridade Ê recalculada, mas as informaçÃĩes de hash calculadas anteriormente sÃŖo mantidas. Os arquivos `content` e `parity` sÃŖo modificados se necessÃĄrio. Os arquivos no array NÃO sÃŖo modificados. 5.8 scrub --------- Examina (scrubs) o array, verificando se hÃĄ erros silenciosos ou de entrada/saída nos discos de dados e paridade. Cada invocaÃ§ÃŖo verifica aproximadamente 8% do array, excluindo dados jÃĄ examinados nos Ãēltimos 10 dias. Isso significa que examinar (scrubbing) uma vez por semana garante que cada bit de dados seja verificado pelo menos uma vez a cada trÃĒs meses. VocÃĒ pode definir um plano de scrub ou quantidade diferente usando a opÃ§ÃŖo -p, --plan, que aceita: bad - Examina blocos marcados como ruins. new - Examina blocos recÊm-sincronizados ainda nÃŖo examinados. full - Examina tudo. 0-100 - Examina a porcentagem especificada de blocos. Se vocÃĒ especificar um valor percentual, tambÊm pode usar a opÃ§ÃŖo -o, --older-than para definir a idade mínima do bloco. Os blocos mais antigos sÃŖo examinados primeiro, garantindo uma verificaÃ§ÃŖo ideal. Se vocÃĒ quiser examinar apenas os blocos recÊm-sincronizados ainda nÃŖo examinados, use a opÃ§ÃŖo `-p new`. Para obter detalhes do status do scrub, use o comando `status`. Para qualquer erro silencioso ou de entrada/saída encontrado, os blocos correspondentes sÃŖo marcados como ruins no arquivo de `content`. Esses blocos ruins sÃŖo listados em `status` e podem ser corrigidos com `fix -e`. ApÃŗs a correÃ§ÃŖo, no prÃŗximo scrub, eles serÃŖo verificados novamente e, se considerados corrigidos, a marcaÃ§ÃŖo de ruim serÃĄ removida. Para examinar apenas os blocos ruins, vocÃĒ pode usar o comando `scrub -p bad`. É recomendado executar `scrub` apenas em um array sincronizado para evitar erros relatados causados por dados nÃŖo sincronizados. Esses erros sÃŖo reconhecidos como nÃŖo sendo erros silenciosos, e os blocos nÃŖo sÃŖo marcados como ruins, mas tais erros sÃŖo relatados na saída do comando. O arquivo `content` Ê modificado para atualizar o tempo da Ãēltima verificaÃ§ÃŖo para cada bloco e para marcar blocos ruins. Os arquivos `parity` NÃO sÃŖo modificados. Os arquivos no array NÃO sÃŖo modificados. 5.9 fix ------- Corrige todos os arquivos e os dados de paridade. Todos os arquivos e dados de paridade sÃŖo comparados com o estado de snapshot salvo na Ãēltima `sync`. Se uma diferença for encontrada, ela Ê revertida para o snapshot armazenado. ATENÇÃO! O comando `fix` nÃŖo diferencia entre erros e modificaçÃĩes intencionais. Ele reverte incondicionalmente o estado do arquivo para a Ãēltima `sync`. Se nenhuma outra opÃ§ÃŖo for especificada, todo o array Ê processado. Use as opçÃĩes de filtro para selecionar um subconjunto de arquivos ou discos para operar. Para corrigir apenas os blocos marcados como ruins durante `sync` e `scrub`, use a opÃ§ÃŖo -e, --filter-error. Ao contrÃĄrio de outras opçÃĩes de filtro, esta aplica correçÃĩes apenas a arquivos que nÃŖo foram alterados desde a Ãēltima `sync`. O SnapRAID renomeia todos os arquivos que nÃŖo podem ser corrigidos adicionando a extensÃŖo `.unrecoverable`. Antes de corrigir, todo o array Ê escaneado para encontrar quaisquer arquivos movidos desde a Ãēltima operaÃ§ÃŖo `sync`. Esses arquivos sÃŖo identificados por seu carimbo de data/hora, ignorando seu nome e diretÃŗrio, e sÃŖo usados no processo de recuperaÃ§ÃŖo, se necessÃĄrio. Se vocÃĒ moveu alguns deles para fora do array, pode usar a opÃ§ÃŖo -i, --import para especificar diretÃŗrios adicionais para escanear. Os arquivos sÃŖo identificados apenas por caminho, nÃŖo por inode. O arquivo `content` NÃO Ê modificado. Os arquivos `parity` sÃŖo modificados se necessÃĄrio. Os arquivos no array sÃŖo modificados se necessÃĄrio. 5.10 check ---------- Verifica todos os arquivos e os dados de paridade. Funciona como `fix`, mas apenas simula uma recuperaÃ§ÃŖo e nenhuma alteraÃ§ÃŖo Ê escrita no array. Este comando Ê destinado principalmente a verificaçÃĩes manuais, como apÃŗs um processo de recuperaÃ§ÃŖo ou em outras condiçÃĩes especiais. Para verificaçÃĩes periÃŗdicas e agendadas, use `scrub`. Se vocÃĒ usar a opÃ§ÃŖo -a, --audit-only, apenas os dados do arquivo sÃŖo verificados, e os dados de paridade sÃŖo ignorados para uma execuÃ§ÃŖo mais rÃĄpida. Os arquivos sÃŖo identificados apenas por caminho, nÃŖo por inode. Nada Ê modificado. 5.11 list --------- Lista todos os arquivos contidos no array no momento da Ãēltima `sync`. Com -v ou --verbose, o tempo sub-segundo tambÊm Ê mostrado. Nada Ê modificado. 5.12 dup -------- Lista todos os arquivos duplicados. Dois arquivos sÃŖo considerados iguais se seus hashes corresponderem. Os dados do arquivo nÃŖo sÃŖo lidos; apenas os hashes prÊ-calculados sÃŖo usados. Nada Ê modificado. 5.13 pool --------- Cria ou atualiza uma visualizaÃ§ÃŖo virtual de todos os arquivos em seu array de discos no diretÃŗrio `pooling`. Os arquivos nÃŖo sÃŖo copiados, mas ligados usando links simbÃŗlicos. Ao atualizar, todos os links simbÃŗlicos existentes e subdiretÃŗrios vazios sÃŖo excluídos e substituídos pela nova visualizaÃ§ÃŖo do array. Quaisquer outros arquivos regulares sÃŖo deixados no lugar. Nada Ê modificado fora do diretÃŗrio do pool. 5.14 devices ------------ Imprime os dispositivos de baixo nível usados pelo array. Este comando exibe as associaçÃĩes de dispositivos no array e destina-se principalmente como uma interface de script. As duas primeiras colunas sÃŖo o ID do dispositivo de baixo nível e o caminho. As prÃŗximas duas colunas sÃŖo o ID do dispositivo de alto nível e o caminho. A Ãēltima coluna Ê o nome do disco no array. Na maioria dos casos, vocÃĒ tem um dispositivo de baixo nível para cada disco no array, mas em algumas configuraçÃĩes mais complexas, vocÃĒ pode ter vÃĄrios dispositivos de baixo nível usados por um Ãēnico disco no array. Nada Ê modificado. 5.15 touch ---------- Define um carimbo de data/hora sub-segundo arbitrÃĄrio para todos os arquivos que o tÃĒm definido como zero. Isso melhora a capacidade do SnapRAID de reconhecer arquivos movidos e copiados, pois torna o carimbo de data/hora quase Ãēnico, reduzindo possíveis duplicatas. Mais especificamente, se o carimbo de data/hora sub-segundo nÃŖo for zero, um arquivo movido ou copiado Ê identificado como tal se corresponder ao nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora sub-segundo for zero, ele Ê considerado uma cÃŗpia apenas se o caminho completo, tamanho e carimbo de data/hora corresponderem. O carimbo de data/hora de precisÃŖo de segundo nÃŖo Ê modificado, portanto, todas as datas e horas de seus arquivos serÃŖo preservadas. 5.16 rehash ----------- Agenda um novo hash de todo o array. Este comando altera o tipo de hash usado, tipicamente ao atualizar de um sistema de 32 bits para um de 64 bits, para alternar do MurmurHash3 para o mais rÃĄpido SpookyHash. Se vocÃĒ jÃĄ estiver usando o hash ideal, este comando nÃŖo faz nada e informa que nenhuma aÃ§ÃŖo Ê necessÃĄria. O novo hash nÃŖo Ê executado imediatamente, mas ocorre progressivamente durante `sync` e `scrub`. VocÃĒ pode verificar o estado do novo hash usando `status`. Durante o novo hash, o SnapRAID mantÊm a funcionalidade total, com a Ãēnica exceÃ§ÃŖo de que `dup` nÃŖo pode detectar arquivos duplicados usando um hash diferente. 5.17 locate ----------- Localiza arquivos armazenados nos discos de paridade. Para cada arquivo correspondente, imprime sua localizaÃ§ÃŖo dentro do arquivo de paridade e o nÃēmero de fragmentos que ocupa. VocÃĒ pode usar a opÃ§ÃŖo -t, --tail para restringir a operaÃ§ÃŖo aos arquivos que ocupam a parte final especificada da paridade. Se desejar realocar esses arquivos, vocÃĒ poderÃĄ usar a opÃ§ÃŖo -W, --force-realloc-tail. Esteja ciente de que tais arquivos nÃŖo estarÃŖo protegidos pela paridade durante o processo de realocaÃ§ÃŖo. 6 OPçÃĩES ======== SnapRAID fornece as seguintes opçÃĩes: -c, --conf CONFIG Seleciona o arquivo de configuraÃ§ÃŖo a ser usado. Se nÃŖo for especificado, no Unix, ele usa o arquivo `/usr/local/etc/snapraid.conf` se existir, caso contrÃĄrio, `/etc/snapraid.conf`. No Windows, ele usa o arquivo `snapraid.conf` no mesmo diretÃŗrio que `snapraid.exe`. -f, --filter PATTERN Filtra os arquivos a serem processados em `check` e `fix`. Apenas os arquivos que correspondem ao padrÃŖo especificado sÃŖo processados. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. Consulte a seÃ§ÃŖo PATTERN para obter mais detalhes sobre especificaçÃĩes de padrÃŖo. No Unix, certifique-se de que os caracteres globbing sejam citados, se usados. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. NÃŖo pode ser usada com `sync` e `scrub`, pois eles sempre processam o array inteiro. -d, --filter-disk NAME Filtra os discos a serem processados em `check`, `fix`, `up` e `down`. VocÃĒ deve especificar um nome de disco conforme definido no arquivo de configuraÃ§ÃŖo. VocÃĒ tambÊm pode especificar discos de paridade com os nomes: `parity`, `2-parity`, `3-parity`, etc., para limitar as operaçÃĩes a um disco de paridade específico. Se vocÃĒ combinar mÃēltiplas opçÃĩes --filter, --filter-disk e --filter-missing, apenas os arquivos que correspondem a todos os filtros sÃŖo selecionados. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. Esta opÃ§ÃŖo pode ser usada apenas com `check`, `fix`, `up` e `down`. NÃŖo pode ser usada com `sync` e `scrub`, pois eles sempre processam o array inteiro. -m, --filter-missing Filtra os arquivos a serem processados em `check` e `fix`. Apenas os arquivos ausentes ou excluídos do array sÃŖo processados. Quando usado com `fix`, isso age como um comando `undelete` (desexcluir). Se vocÃĒ combinar mÃēltiplas opçÃĩes --filter, --filter-disk e --filter-missing, apenas os arquivos que correspondem a todos os filtros sÃŖo selecionados. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. NÃŖo pode ser usada com `sync` e `scrub`, pois eles sempre processam o array inteiro. -e, --filter-error Processa os arquivos com erros em `check` e `fix`. Processa apenas arquivos que tÃĒm blocos marcados com erros silenciosos ou de entrada/saída durante `sync` e `scrub`, conforme listado em `status`. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. -p, --plan PERC|bad|new|full Seleciona o plano de scrub. Se PERC for um valor numÊrico de 0 a 100, ele Ê interpretado como a porcentagem de blocos a serem examinados. Em vez de uma porcentagem, vocÃĒ pode especificar um plano: `bad` examina blocos ruins, `new` examina blocos ainda nÃŖo examinados, e `full` examina tudo. Esta opÃ§ÃŖo pode ser usada apenas com `scrub`. -o, --older-than DAYS Seleciona a parte mais antiga do array a ser processada em `scrub`. DAYS Ê a idade mínima em dias para um bloco ser examinado; o padrÃŖo Ê 10. Os blocos marcados como ruins sÃŖo sempre examinados, independentemente desta opÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com `scrub`. -a, --audit-only Em `check`, verifica o hash dos arquivos sem verificar os dados de paridade. Se vocÃĒ estiver interessado apenas em verificar os dados do arquivo, esta opÃ§ÃŖo pode acelerar significativamente o processo de verificaÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com `check`. -h, --pre-hash Em `sync`, executa uma fase de hash preliminar de todos os novos dados para verificaÃ§ÃŖo adicional antes do cÃĄlculo da paridade. Normalmente, em `sync`, nenhum hash preliminar Ê feito, e os novos dados sÃŖo hashados logo antes do cÃĄlculo da paridade, quando sÃŖo lidos pela primeira vez. Este processo ocorre quando o sistema estÃĄ sob carga pesada, com todos os discos girando e uma CPU ocupada. Esta Ê uma condiÃ§ÃŖo extrema para a mÃĄquina, e se ela tiver um problema de hardware latente, erros silenciosos podem passar despercebidos porque os dados ainda nÃŖo foram hashados. Para evitar esse risco, vocÃĒ pode habilitar o modo `pre-hash` para ter todos os dados lidos duas vezes para garantir sua integridade. Esta opÃ§ÃŖo tambÊm verifica arquivos movidos dentro do array para garantir que a operaÃ§ÃŖo de movimentaÃ§ÃŖo foi bem-sucedida e, se necessÃĄrio, permite que vocÃĒ execute uma operaÃ§ÃŖo fix antes de prosseguir. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -i, --import DIR Importa do diretÃŗrio especificado quaisquer arquivos excluídos do array apÃŗs a Ãēltima `sync`. Se vocÃĒ ainda tiver esses arquivos, eles podem ser usados por `check` e `fix` para melhorar o processo de recuperaÃ§ÃŖo. Os arquivos sÃŖo lidos, incluindo em subdiretÃŗrios, e sÃŖo identificados independentemente de seu nome. Esta opÃ§ÃŖo pode ser usada apenas com `check` e `fix`. -s, --spin-down-on-error Em qualquer erro, desliga (spins down) todos os discos gerenciados antes de sair com um cÃŗdigo de status diferente de zero. Isso impede que as unidades permaneçam ativas e girando apÃŗs uma operaÃ§ÃŖo abortada, ajudando a evitar acÃēmulo desnecessÃĄrio de calor e consumo de energia. Use esta opÃ§ÃŖo para garantir que os discos sejam interrompidos com segurança, mesmo quando um comando falhar. -w, --bw-limit RATE Aplica um limite de largura de banda global para todos os discos. A RATE Ê o nÃēmero de bytes por segundo. VocÃĒ pode especificar um multiplicador como K, M ou G (por exemplo, --bw-limit 1G). -t, --tail TAMANHO Limita a listagem de arquivos àqueles que nÃŖo usam mais do que o tamanho final especificado dos discos de paridade. VocÃĒ pode usar multiplicadores como K, M, G ou T (ex: --tail 1G). Esta opÃ§ÃŖo sÃŗ Ê vÃĄlida quando usada em conjunto com o comando `locate`. -A, --stats Habilita uma visualizaÃ§ÃŖo de status estendida que mostra informaçÃĩes adicionais. A tela exibe dois grÃĄficos: O primeiro grÃĄfico mostra o nÃēmero de stripes em buffer para cada disco, juntamente com o caminho do arquivo que estÃĄ sendo acessado atualmente nesse disco. Tipicamente, o disco mais lento nÃŖo terÃĄ buffer disponível, o que determina a largura de banda mÃĄxima alcanÃ§ÃĄvel. O segundo grÃĄfico mostra a porcentagem de tempo gasto esperando nos Ãēltimos 100 segundos. Espera-se que o disco mais lento cause a maior parte do tempo de espera, enquanto outros discos devem ter pouco ou nenhum tempo de espera porque podem usar seus stripes em buffer. Este grÃĄfico tambÊm mostra o tempo gasto esperando por cÃĄlculos de hash e cÃĄlculos RAID. Todos os cÃĄlculos sÃŖo executados em paralelo com as operaçÃĩes de disco. Portanto, enquanto houver tempo de espera mensurÃĄvel para pelo menos um disco, isso indica que a CPU Ê rÃĄpida o suficiente para acompanhar a carga de trabalho. -Z, --force-zero Força a operaÃ§ÃŖo insegura de sincronizar um arquivo com tamanho zero que era anteriormente nÃŖo zero. Se o SnapRAID detectar tal condiÃ§ÃŖo, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte facilmente quando, apÃŗs uma falha do sistema, alguns arquivos acessados foram truncados. Esta Ê uma condiÃ§ÃŖo possível no Linux com os sistemas de arquivos ext3/ext4. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -E, --force-empty Força a operaÃ§ÃŖo insegura de sincronizar um disco com todos os arquivos originais ausentes. Se o SnapRAID detectar que todos os arquivos originalmente presentes no disco estÃŖo ausentes ou foram reescritos, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte facilmente quando um sistema de arquivos de dados nÃŖo estÃĄ montado. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -U, --force-uuid Força a operaÃ§ÃŖo insegura de sincronizar, verificar e corrigir com discos que tiveram seus UUIDs alterados. Se o SnapRAID detectar que alguns discos tiveram seus UUIDs alterados, ele para de prosseguir a menos que vocÃĒ especifique esta opÃ§ÃŖo. Isso permite que vocÃĒ detecte quando seus discos estÃŖo montados nos pontos de montagem errados. No entanto, Ê permitido ter uma Ãēnica mudança de UUID com paridade Ãēnica e mais com paridade mÃēltipla, porque este Ê o caso normal ao substituir discos apÃŗs uma recuperaÃ§ÃŖo. Esta opÃ§ÃŖo pode ser usada apenas com `sync`, `check` ou `fix`. -D, --force-device Força a operaÃ§ÃŖo insegura de corrigir com discos inacessíveis ou com discos no mesmo dispositivo físico. Por exemplo, se vocÃĒ perdeu dois discos de dados e tem um disco sobressalente para recuperar apenas o primeiro, vocÃĒ pode ignorar o segundo disco inacessível. Ou, se vocÃĒ quiser recuperar um disco no espaço livre restante em um disco jÃĄ usado, compartilhando o mesmo dispositivo físico. Esta opÃ§ÃŖo pode ser usada apenas com `fix`. -N, --force-nocopy Em `sync`, `check` e `fix`, desabilita a heurística de detecÃ§ÃŖo de cÃŗpia. Sem esta opÃ§ÃŖo, o SnapRAID assume que arquivos com os mesmos atributos, como nome, tamanho e carimbo de data/hora, sÃŖo cÃŗpias com os mesmos dados. Isso permite a identificaÃ§ÃŖo de arquivos copiados ou movidos de um disco para outro e reutiliza as informaçÃĩes de hash jÃĄ calculadas para detectar erros silenciosos ou para recuperar arquivos ausentes. Em alguns casos raros, esse comportamento pode resultar em falsos positivos ou em um processo lento devido a muitas verificaçÃĩes de hash, e esta opÃ§ÃŖo permite que vocÃĒ resolva tais problemas. Esta opÃ§ÃŖo pode ser usada apenas com `sync`, `check` e `fix`. -F, --force-full Em `sync`, força um recÃĄlculo completo da paridade. Esta opÃ§ÃŖo pode ser usada quando vocÃĒ adiciona um novo nível de paridade ou se vocÃĒ reverteu para um arquivo de conteÃēdo antigo usando dados de paridade mais recentes. Em vez de recriar a paridade do zero, isso permite que vocÃĒ reutilize os hashes presentes no arquivo de conteÃēdo para validar dados e manter a proteÃ§ÃŖo de dados durante o processo `sync` usando os dados de paridade existentes. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. -R, --force-realloc Em `sync`, força uma realocaÃ§ÃŖo completa de arquivos e reconstruÃ§ÃŖo da paridade. Esta opÃ§ÃŖo pode ser usada para realocar completamente todos os arquivos, removendo a fragmentaÃ§ÃŖo, enquanto reutiliza os hashes presentes no arquivo de conteÃēdo para validar dados. Esta opÃ§ÃŖo pode ser usada apenas com `sync`. ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo usÃĄ-la. VocÃĒ NÃO tem proteÃ§ÃŖo de dados durante a operaÃ§ÃŖo `sync`. -W, --force-realloc-tail TAMANHO Funciona como -R, --force-realloc, mas limitado à parte final especificada (Ãēltimos TAMANHO bytes) de cada arquivo de paridade. Força a realocaÃ§ÃŖo (movimentaÃ§ÃŖo) de quaisquer fragmentos/blocos de arquivos atualmente armazenados nessa seÃ§ÃŖo final, permitindo que sejam colocados em qualquer lugar no(s) arquivo(s) de paridade onde houver espaço livre disponível (incluindo espaços vazios existentes). O objetivo principal desta opÃ§ÃŖo Ê diminuir o tamanho em disco do arquivo de paridade. Se a realocaÃ§ÃŖo limpar com sucesso toda a seÃ§ÃŖo final (nenhum bloco permanecer usando-a), o arquivo de paridade serÃĄ truncado, recuperando o espaço final nÃŖo utilizado. VocÃĒ pode usar multiplicadores como K, M, G ou T (ex: --force-realloc-tail 1G). VocÃĒ pode usar locate -t, --tail para saber antecipadamente os arquivos afetados. AVISO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo utilizÃĄ-la. VocÃĒ NÃO terÃĄ proteÃ§ÃŖo de datos durante a operaÃ§ÃŖo `sync` para os arquivos afetados. -l, --log FILE Escreve um log detalhado para o arquivo especificado. Se esta opÃ§ÃŖo nÃŖo for especificada, erros inesperados sÃŖo impressos na tela, resultando potencialmente em saída excessiva em caso de muitos erros. Quando -l, --log Ê especificado, apenas erros fatais que fazem o SnapRAID parar sÃŖo impressos na tela. Se o caminho começar com `>>`, o arquivo Ê aberto no modo de anexaÃ§ÃŖo. OcorrÃĒncias de `%D` e `%T` no nome sÃŖo substituídas pela data e hora no formato YYYYMMDD e HHMMSS. Em arquivos em lote do Windows, vocÃĒ deve duplicar o caractere `%`, por exemplo, resultado-%%D.log. Para usar `>>`, vocÃĒ deve colocar o nome entre aspas, por exemplo, `">>resultado.log"`. Para enviar o log para a saída padrÃŖo ou erro padrÃŖo, vocÃĒ pode usar `">&1"` e `">&2"`, respectivamente. Consulte o arquivo snapraid_log.txt ou a pÃĄgina man para descriçÃĩes de tags de log. -L, --error-limit NUMBER Define um novo limite de erro antes de interromper a execuÃ§ÃŖo. Por padrÃŖo, o SnapRAID para se encontrar mais de 100 erros de entrada/saída, indicando que um disco provavelmente estÃĄ falhando. Esta opÃ§ÃŖo afeta `sync` e `scrub`, que tÃĒm permissÃŖo para continuar apÃŗs o primeiro conjunto de erros de disco para tentar completar suas operaçÃĩes. No entanto, `check` e `fix` sempre param no primeiro erro. -S, --start BLKSTART Começa o processamento a partir do nÃēmero de bloco especificado. Isso pode ser Ãētil para tentar verificar ou corrigir blocos específicos em caso de um disco danificado. Esta opÃ§ÃŖo Ê principalmente para recuperaÃ§ÃŖo manual avançada. -B, --count BLKCOUNT Processa apenas o nÃēmero especificado de blocos. Esta opÃ§ÃŖo Ê principalmente para recuperaÃ§ÃŖo manual avançada. -C, --gen-conf CONTENT Gera um arquivo de configuraÃ§ÃŖo dummy a partir de um arquivo de conteÃēdo existente. O arquivo de configuraÃ§ÃŖo Ê escrito na saída padrÃŖo e nÃŖo sobrescreve um existente. Este arquivo de configuraÃ§ÃŖo tambÊm contÊm as informaçÃĩes necessÃĄrias para reconstruir os pontos de montagem do disco, caso vocÃĒ perca todo o sistema. -v, --verbose Imprime mais informaçÃĩes na tela. Se especificado uma vez, ele imprime arquivos excluídos e estatísticas adicionais. Esta opÃ§ÃŖo nÃŖo tem efeito nos arquivos de log. -q, --quiet Imprime menos informaçÃĩes na tela. Se especificado uma vez, remove a barra de progresso; duas vezes, as operaçÃĩes em execuÃ§ÃŖo; trÃĒs vezes, as mensagens de informaÃ§ÃŖo; quatro vezes, as mensagens de status. Erros fatais sÃŖo sempre impressos na tela. Esta opÃ§ÃŖo nÃŖo tem efeito nos arquivos de log. -H, --help Imprime uma tela de ajuda curta. -V, --version Imprime a versÃŖo do programa. 7 CONFIGURAÃ§ÃŖO ============== SnapRAID requer um arquivo de configuraÃ§ÃŖo para saber onde seu array de discos estÃĄ localizado e onde armazenar as informaçÃĩes de paridade. No Unix, ele usa o arquivo `/usr/local/etc/snapraid.conf` se existir, caso contrÃĄrio, `/etc/snapraid.conf`. No Windows, ele usa o arquivo `snapraid.conf` no mesmo diretÃŗrio que `snapraid.exe`. Deve conter as seguintes opçÃĩes (sensível a maiÃēsculas/minÃēsculas): 7.1 parity FILE [,FILE] ... --------------------------- Define os arquivos a serem usados para armazenar as informaçÃĩes de paridade. A paridade permite proteÃ§ÃŖo contra uma Ãēnica falha de disco, semelhante ao RAID5. VocÃĒ pode especificar vÃĄrios arquivos, que devem estar em discos diferentes. Quando um arquivo nÃŖo pode mais crescer, o prÃŗximo Ê usado. O espaço total disponível deve ser pelo menos tÃŖo grande quanto o maior disco de dados no array. VocÃĒ pode adicionar arquivos de paridade adicionais mais tarde, mas vocÃĒ nÃŖo pode reordenar ou removÃĒ-los. Manter os discos de paridade reservados para paridade garante que eles nÃŖo se fragmentem, melhorando o desempenho. No Windows, 256 MB sÃŖo deixados sem uso em cada disco para evitar o aviso sobre discos cheios. Esta opÃ§ÃŖo Ê obrigatÃŗria e pode ser usada apenas uma vez. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- Define os arquivos a serem usados para armazenar informaçÃĩes de paridade extra. Para cada nível de paridade especificado, um nível adicional de proteÃ§ÃŖo Ê habilitado: * 2-parity habilita paridade dupla RAID6. * 3-parity habilita paridade tripla. * 4-parity habilita paridade quÃĄdrupla (quatro). * 5-parity habilita paridade penta (cinco). * 6-parity habilita paridade hexa (seis). Cada nível de paridade requer a presença de todos os níveis de paridade anteriores. As mesmas consideraçÃĩes que para a opÃ§ÃŖo `parity` se aplicam. Estas opçÃĩes sÃŖo opcionais e podem ser usadas apenas uma vez. 7.3 z-parity FILE [,FILE] ... ----------------------------- Define um arquivo e formato alternativo para armazenar paridade tripla. Esta opÃ§ÃŖo Ê uma alternativa a `3-parity`, destinada principalmente a CPUs de baixo custo como ARM ou AMD Phenom, Athlon e Opteron que nÃŖo suportam o conjunto de instruçÃĩes SSSE3. Nesses casos, ela fornece melhor desempenho. Este formato Ê semelhante, mas mais rÃĄpido do que o usado pelo ZFS RAIDZ3. Assim como o ZFS, ele nÃŖo funciona alÊm da paridade tripla. Ao usar `3-parity`, vocÃĒ serÃĄ avisado se for recomendado usar o formato `z-parity` para melhoria de desempenho. É possível converter de um formato para outro ajustando o arquivo de configuraÃ§ÃŖo com o z-parity ou 3-parity desejado e usando `fix` para recriÃĄ-lo. 7.4 content FILE ---------------- Define o arquivo a ser usado para armazenar a lista e os checksums de todos os arquivos presentes em seu array de discos. Pode ser colocado em um disco usado para dados, paridade ou qualquer outro disco disponível. Se vocÃĒ usar um disco de dados, este arquivo Ê automaticamente excluído do processo `sync`. Esta opÃ§ÃŖo Ê obrigatÃŗria e pode ser usada vÃĄrias vezes para salvar mÃēltiplas cÃŗpias do mesmo arquivo. VocÃĒ deve armazenar pelo menos uma cÃŗpia para cada disco de paridade usado mais um. Usar cÃŗpias adicionais nÃŖo prejudica. 7.5 data NAME DIR ----------------- Define o nome e o ponto de montagem dos discos de dados no array. NAME Ê usado para identificar o disco e deve ser Ãēnico. DIR Ê o ponto de montagem do disco no sistema de arquivos. VocÃĒ pode alterar o ponto de montagem conforme necessÃĄrio, desde que mantenha o NAME fixo. VocÃĒ deve usar uma opÃ§ÃŖo para cada disco de dados no array. VocÃĒ pode renomear um disco mais tarde alterando o NAME diretamente no arquivo de configuraÃ§ÃŖo e, em seguida, executando um comando `sync`. No caso de renomeaÃ§ÃŖo, a associaÃ§ÃŖo Ê feita usando o UUID armazenado dos discos. 7.6 extra NAME DIR ------------------ Define o nome e o ponto de montagem de discos adicionais para monitorar com os comandos `smart` e `probe`. Isso Ê Ãētil para monitorar discos que nÃŖo fazem parte da matriz, mas que sÃŖo necessÃĄrios para o funcionamento do sistema, como o disco de inicializaÃ§ÃŖo. Observe que tais discos nÃŖo sÃŖo afetados pelos comandos `up` e `down` porque se espera que estejam sempre girando. 7.7 nohidden ------------ Exclui todos os arquivos e diretÃŗrios ocultos. No Unix, arquivos ocultos sÃŖo aqueles que começam com `.`. No Windows, sÃŖo aqueles com o atributo oculto. 7.8 exclude/include PATTERN --------------------------- Define os padrÃĩes de arquivo ou diretÃŗrio a serem excluídos ou incluídos no processo de sincronizaÃ§ÃŖo. Todos os padrÃĩes sÃŖo processados na ordem especificada. Se o primeiro padrÃŖo que corresponde for um `exclude`, o arquivo Ê excluído. Se for um `include`, o arquivo Ê incluído. Se nenhum padrÃŖo corresponder, o arquivo Ê excluído se o Ãēltimo padrÃŖo especificado for um `include`, ou incluído se o Ãēltimo padrÃŖo especificado for um `exclude`. Consulte a seÃ§ÃŖo PATTERN para obter mais detalhes sobre especificaçÃĩes de padrÃŖo. Esta opÃ§ÃŖo pode ser usada vÃĄrias vezes. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- Define o tamanho bÃĄsico do bloco em kibibytes para a paridade. Um kibibyte Ê 1024 bytes. O `blocksize` padrÃŖo Ê 256, o que deve funcionar para a maioria dos casos. ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo alterar este valor. Para alterar este valor no futuro, vocÃĒ precisarÃĄ recriar toda a paridade! Uma razÃŖo para usar um `blocksize` diferente Ê se vocÃĒ tiver muitos arquivos pequenos, na ordem de milhÃĩes. Para cada arquivo, mesmo que apenas alguns bytes, um bloco inteiro de paridade Ê alocado, e com muitos arquivos, isso pode resultar em espaço de paridade nÃŖo utilizado significativo. Quando vocÃĒ preenche completamente o disco de paridade, vocÃĒ nÃŖo estÃĄ autorizado a adicionar mais arquivos aos discos de dados. No entanto, a paridade desperdiçada nÃŖo se acumula em todos os discos de dados. O espaço desperdiçado resultante de um grande nÃēmero de arquivos em um disco de dados limita apenas a quantidade de dados nesse disco de dados, nÃŖo em outros. Como uma aproximaÃ§ÃŖo, vocÃĒ pode assumir que metade do tamanho do bloco Ê desperdiçada para cada arquivo. Por exemplo, com 100.000 arquivos e um tamanho de bloco de 256 KiB, vocÃĒ desperdiçarÃĄ 12,8 GB de paridade, o que pode resultar em 12,8 GB a menos de espaço disponível no disco de dados. VocÃĒ pode verificar a quantidade de espaço desperdiçado em cada disco usando `status`. Esta Ê a quantidade de espaço que vocÃĒ deve deixar livre nos discos de dados ou usar para arquivos nÃŖo incluídos no array. Se este valor for negativo, significa que vocÃĒ estÃĄ perto de encher a paridade e representa o espaço que vocÃĒ ainda pode desperdiçar. Para evitar esse problema, vocÃĒ pode usar uma partiÃ§ÃŖo maior para paridade. Por exemplo, se a partiÃ§ÃŖo de paridade for 12,8 GB maior que os discos de dados, vocÃĒ tem espaço extra suficiente para lidar com atÊ 100.000 arquivos em cada disco de dados sem qualquer espaço desperdiçado. Um truque para obter uma partiÃ§ÃŖo de paridade maior no Linux Ê formatÃĄ-la com o comando: mkfs.ext4 -m 0 -T largefile4 DEVICE Isso resulta em cerca de 1,5% de espaço extra, aproximadamente 60 GB para um disco de 4 TB, o que permite cerca de 460.000 arquivos em cada disco de dados sem qualquer espaço desperdiçado. 7.10 hashsize SIZE_IN_BYTES --------------------------- Define o tamanho do hash em bytes para os blocos salvos. O `hashsize` padrÃŖo Ê 16 bytes (128 bits), o que deve funcionar para a maioria dos casos. ATENÇÃO! Esta opÃ§ÃŖo Ê apenas para especialistas e Ê altamente recomendado nÃŖo alterar este valor. Para alterar este valor no futuro, vocÃĒ precisarÃĄ recriar toda a paridade! Uma razÃŖo para usar um `hashsize` diferente Ê se o seu sistema tiver memÃŗria limitada. Como regra geral, o SnapRAID tipicamente requer 1 GiB de RAM para cada 16 TB de dados no array. Especificamente, para armazenar os hashes dos dados, o SnapRAID requer aproximadamente TS*(1+HS)/BS bytes de RAM, onde TS Ê o tamanho total em bytes do seu array de discos, BS Ê o tamanho do bloco em bytes, e HS Ê o tamanho do hash em bytes. Por exemplo, com 8 discos de 4 TB, um tamanho de bloco de 256 KiB (1 KiB = 1024 bytes), e um tamanho de hash de 16, vocÃĒ obtÊm: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Mudando para um tamanho de hash de 8, vocÃĒ obtÊm: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Mudando para um tamanho de bloco de 512, vocÃĒ obtÊm: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Mudando para um tamanho de hash de 8 e um tamanho de bloco de 512, vocÃĒ obtÊm: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- Salva automaticamente o estado ao sincronizar ou examinar apÃŗs a quantidade especificada de GB processados. Esta opÃ§ÃŖo Ê Ãētil para evitar reiniciar longos comandos `sync` do zero se interrompidos por uma falha de mÃĄquina ou qualquer outro evento. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Define a temperatura mÃĄxima permitida do disco em Celsius. Quando especificado, o SnapRAID verifica periodicamente a temperatura de todos os discos usando a ferramenta smartctl. As temperaturas atuais dos discos sÃŖo exibidas enquanto o SnapRAID estÃĄ operando. Se algum disco exceder este limite, todas as operaçÃĩes param, e os discos sÃŖo desligados (colocados em standby) pela duraÃ§ÃŖo definida pela opÃ§ÃŖo `temp_sleep`. ApÃŗs o período de espera, as operaçÃĩes sÃŖo retomadas, potencialmente pausando novamente se o limite de temperatura for atingido mais uma vez. Durante a operaÃ§ÃŖo, o SnapRAID tambÊm analisa a curva de aquecimento de cada disco e estima a temperatura estÃĄvel de longo prazo que eles devem atingir se a atividade continuar. A estimativa Ê realizada apenas depois que a temperatura do disco aumentou quatro vezes, garantindo que pontos de dados suficientes estejam disponíveis para estabelecer uma tendÃĒncia confiÃĄvel. Esta temperatura estÃĄvel prevista Ê mostrada entre parÃĒnteses ao lado do valor atual e ajuda a avaliar se o resfriamento do sistema Ê adequado. Esta temperatura estimada Ê apenas para fins informativos e nÃŖo tem efeito no comportamento do SnapRAID. As açÃĩes do programa sÃŖo baseadas exclusivamente nas temperaturas reais medidas dos discos. Para realizar esta anÃĄlise, o SnapRAID precisa de uma referÃĒncia para a temperatura do sistema. Ele tenta primeiro lÃĒ-la dos sensores de hardware disponíveis. Se nenhum sensor do sistema puder ser acessado, ele usa a temperatura mais baixa do disco medida no início da execuÃ§ÃŖo como referÃĒncia de fallback. Normalmente, o SnapRAID mostra apenas a temperatura do disco mais quente. Para exibir a temperatura de todos os discos, use a opÃ§ÃŖo -A ou --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Define o tempo de espera (standby time), em minutos, quando o limite de temperatura Ê atingido. Durante este período, os discos permanecem desligados. O padrÃŖo Ê 5 minutos. 7.14 pool DIR ------------- Define o diretÃŗrio de pooling onde a visualizaÃ§ÃŖo virtual do array de discos Ê criada usando o comando `pool`. O diretÃŗrio jÃĄ deve existir. 7.15 share UNC_DIR ------------------ Define o caminho UNC do Windows necessÃĄrio para acessar os discos remotamente. Se esta opÃ§ÃŖo for especificada, os links simbÃŗlicos criados no diretÃŗrio do pool usam este caminho UNC para acessar os discos. Sem esta opÃ§ÃŖo, os links simbÃŗlicos gerados usam apenas caminhos locais, o que nÃŖo permite compartilhar o diretÃŗrio do pool pela rede. Os links simbÃŗlicos sÃŖo formados usando o caminho UNC especificado, adicionando o nome do disco conforme especificado na opÃ§ÃŖo `data`, e finalmente adicionando o diretÃŗrio e nome do arquivo. Esta opÃ§ÃŖo Ê necessÃĄria apenas para Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ Define opçÃĩes smartctl personalizadas para obter os atributos SMART para cada disco. Isso pode ser necessÃĄrio para controladores RAID e alguns discos USB que nÃŖo podem ser detectados automaticamente. O placeholder %s Ê substituído pelo nome do dispositivo, mas Ê opcional para dispositivos fixos como controladores RAID. DISK Ê o mesmo nome de disco especificado na opÃ§ÃŖo `data`. PARITY Ê um dos nomes de paridade: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. Nas OPTIONS especificadas, a string `%s` Ê substituída pelo nome do dispositivo. Para controladores RAID, o dispositivo Ê provavelmente fixo, e vocÃĒ pode nÃŖo precisar usar `%s`. Consulte a documentaÃ§ÃŖo do smartmontools para possíveis opçÃĩes: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices Por exemplo: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignora o atributo SMART especificado ao calcular a probabilidade de falha do disco. Esta opÃ§ÃŖo Ê Ãētil se um disco relatar valores incomuns ou enganosos para um atributo específico. DISK Ê o mesmo nome de disco especificado na opÃ§ÃŖo `data`. PARITY Ê um dos nomes de paridade: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` ou `z-parity`. O valor especial * pode ser usado para ignorar o atributo em todos os discos. Por exemplo, para ignorar o atributo `Current Pending Sector Count` em todos os discos: smartignore * 197 Para ignorÃĄ-lo apenas no primeiro disco de paridade: smartignore parity 197 7.18 Exemplos ------------- Um exemplo de uma configuraÃ§ÃŖo típica para Unix Ê: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Um exemplo de uma configuraÃ§ÃŖo típica para Windows Ê: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PADRÃŖO (PATTERN) ================== Os padrÃĩes fornecem uma maneira flexível de filtrar arquivos para inclusÃŖo ou exclusÃŖo. Ao usar caracteres de globbing, vocÃĒ pode definir regras que correspondam a nomes de arquivos específicos ou estruturas de diretÃŗrios inteiras sem listar cada caminho manualmente. O ponto de interrogaÃ§ÃŖo `?` corresponde a qualquer caractere Ãēnico, exceto o separador de diretÃŗrios. Isso o torna Ãētil para corresponder nomes de arquivos com caracteres variÃĄveis, mantendo o padrÃŖo confinado a um Ãēnico nível de diretÃŗrio. O asterisco simples `*` corresponde a qualquer sequÃĒncia de caracteres, mas, como o ponto de interrogaÃ§ÃŖo, nunca cruza as fronteiras do diretÃŗrio. Ele para na barra invertida, tornando-o adequado para correspondÃĒncia dentro de um Ãēnico componente de caminho. Este Ê o comportamento padrÃŖo de curinga familiar do globbing de shell. O asterisco duplo `**` Ê mais poderoso, ele corresponde a qualquer sequÃĒncia de caracteres, incluindo separadores de diretÃŗrios. Isso permite que os padrÃĩes correspondam em vÃĄrios níveis de diretÃŗrio. Quando o `**` aparece incorporado diretamente em um padrÃŖo, ele pode corresponder a zero ou mais caracteres, incluindo barras entre o texto literal circundante. O uso mais importante do `**` Ê na forma especial `/**/`. Isso corresponde a zero ou mais níveis de diretÃŗrio completos, tornando possível corresponder arquivos em qualquer profundidade em uma ÃĄrvore de diretÃŗrios sem conhecer a estrutura exata do caminho. Por exemplo, o padrÃŖo `src/**/main.js` corresponde a `src/main.js` (pulando zero diretÃŗrios), `src/ui/main.js` (pulando um diretÃŗrio) e `src/ui/components/main.js` (pulando dois diretÃŗrios). Classes de caracteres usando colchetes `[]` correspondem a um Ãēnico caractere de um conjunto ou intervalo especificado. Como os outros padrÃĩes de caractere Ãēnico, elas nÃŖo correspondem a separadores de diretÃŗrio. As classes suportam intervalos e negaÃ§ÃŖo usando um ponto de exclamaÃ§ÃŖo. A distinÃ§ÃŖo fundamental a ser lembrada Ê que `*`, `?` e classes de caracteres respeitam os limites do diretÃŗrio e correspondem apenas dentro de um Ãēnico componente de caminho, enquanto `**` Ê o Ãēnico padrÃŖo que pode corresponder atravÊs de separadores de diretÃŗrio. Existem quatro tipos diferentes de padrÃĩes: FILE Seleciona qualquer arquivo chamado FILE. Este padrÃŖo se aplica apenas a arquivos, nÃŖo a diretÃŗrios. DIR/ Seleciona qualquer diretÃŗrio chamado DIR e tudo o que estiver dentro dele. Este padrÃŖo se aplica apenas a diretÃŗrios, nÃŖo a arquivos. /PATH/FILE Seleciona o caminho exato do arquivo especificado. Este padrÃŖo se aplica apenas a arquivos, nÃŖo a diretÃŗrios. /PATH/DIR/ Seleciona o caminho exato do diretÃŗrio especificado e tudo o que estiver dentro dele. Este padrÃŖo se aplica apenas a diretÃŗrios, nÃŖo a arquivos. Quando vocÃĒ especifica um caminho absoluto começando com /, ele Ê aplicado no diretÃŗrio raiz do array, nÃŖo no diretÃŗrio raiz do sistema de arquivos local. No Windows, vocÃĒ pode usar a barra invertida \ em vez da barra. DiretÃŗrios do sistema Windows, junctions, pontos de montagem e outros diretÃŗrios especiais do Windows sÃŖo tratados como arquivos, o que significa que para excluí-los, vocÃĒ deve usar uma regra de arquivo, nÃŖo uma de diretÃŗrio. Se o nome do arquivo contiver um caractere `*`, `?`, `[`, ou `]`, vocÃĒ deve escapÃĄ-lo para evitar que seja interpretado como um caractere globbing. No Unix, o caractere de escape Ê `\`; no Windows, Ê `^`. Quando o padrÃŖo estÃĄ na linha de comando, vocÃĒ deve duplicar o caractere de escape para evitar que seja interpretado pelo shell de comando. No arquivo de configuraÃ§ÃŖo, vocÃĒ pode usar diferentes estratÊgias para filtrar os arquivos a serem processados. A abordagem mais simples Ê usar apenas regras `exclude` para remover todos os arquivos e diretÃŗrios que vocÃĒ nÃŖo deseja processar. Por exemplo: # Exclui qualquer arquivo chamado `*.unrecoverable` exclude *.unrecoverable # Exclui o diretÃŗrio raiz `/lost+found` exclude /lost+found/ # Exclui qualquer subdiretÃŗrio chamado `tmp` exclude tmp/ A abordagem oposta Ê definir apenas os arquivos que vocÃĒ deseja processar, usando apenas regras `include`. Por exemplo: # Inclui apenas alguns diretÃŗrios include /movies/ include /musics/ include /pictures/ A abordagem final Ê misturar regras `exclude` e `include`. Neste caso, a ordem das regras Ê importante. As regras anteriores tÃĒm precedÃĒncia sobre as posteriores. Para simplificar, vocÃĒ pode listar todas as regras `exclude` primeiro e depois todas as regras `include`. Por exemplo: # Exclui qualquer arquivo chamado `*.unrecoverable` exclude *.unrecoverable # Exclui qualquer subdiretÃŗrio chamado `tmp` exclude tmp/ # Inclui apenas alguns diretÃŗrios include /movies/ include /musics/ include /pictures/ Na linha de comando, usando a opÃ§ÃŖo -f, vocÃĒ pode usar apenas padrÃĩes `include`. Por exemplo: # Verifica apenas os arquivos .mp3. # No Unix, use aspas para evitar a expansÃŖo globbing pelo shell. snapraid -f "*.mp3" check No Unix, ao usar caracteres globbing na linha de comando, vocÃĒ deve citÃĄ-los para evitar que o shell os expanda. 9 IGNORAR ARQUIVOS (IGNORE FILE) ================================ AlÊm das regras globais no arquivo de configuraÃ§ÃŖo, vocÃĒ pode colocar arquivos `.snapraidignore` em qualquer diretÃŗrio dentro do array para definir regras de exclusÃŖo descentralizadas. As regras definidas em `.snapraidignore` sÃŖo aplicadas apÃŗs as regras no arquivo de configuraÃ§ÃŖo. Isso significa que elas tÃĒm uma prioridade maior e podem ser usadas para excluir arquivos que foram anteriormente incluídos pela configuraÃ§ÃŖo global. Efetivamente, se uma regra local corresponder, o arquivo Ê excluído independentemente das configuraçÃĩes globais de inclusÃŖo. A lÃŗgica de padrÃĩes no `.snapraidignore` espelha a configuraÃ§ÃŖo global, mas ancora os padrÃĩes ao diretÃŗrio onde o arquivo estÃĄ localizado: FILE Seleciona qualquer arquivo chamado FILE neste diretÃŗrio ou abaixo. Isso segue as mesmas regras de globbing do padrÃŖo global. DIR/ Seleciona qualquer diretÃŗrio chamado DIR e tudo dentro dele, residente neste diretÃŗrio ou abaixo. /PATH/FILE Seleciona o arquivo exato especificado relativo à localizaÃ§ÃŖo do arquivo `.snapraidignore`. /PATH/DIR/ Seleciona o diretÃŗrio exato especificado e tudo dentro dele, relativo à localizaÃ§ÃŖo do arquivo `.snapraidignore`. Ao contrÃĄrio da configuraÃ§ÃŖo global, os arquivos `.snapraidignore` suportam apenas regras de exclusÃŖo; vocÃĒ nÃŖo pode usar padrÃĩes `include` ou negaÃ§ÃŖo (!). Por exemplo, se vocÃĒ tiver um `.snapraidignore` em `/mnt/disk1/projects/`: # Exclui APENAS /mnt/disk1/projects/output.bin /output.bin # Exclui qualquer diretÃŗrio chamado `build` dentro de projects/ build/ # Exclui qualquer arquivo .tmp dentro de projects/ ou suas subpastas *.tmp 10 CONTEÃēDO (CONTENT) ===================== SnapRAID armazena a lista e os checksums de seus arquivos no arquivo content. É um arquivo binÃĄrio que lista todos os arquivos presentes em seu array de discos, juntamente com todos os checksums para verificar sua integridade. Este arquivo Ê lido e escrito pelos comandos `sync` e `scrub` e lido pelos comandos `fix`, `check` e `status`. 11 PARIDADE (PARITY) ==================== SnapRAID armazena as informaçÃĩes de paridade do seu array nos arquivos parity. Estes sÃŖo arquivos binÃĄrios contendo a paridade calculada de todos os blocos definidos no arquivo `content`. Estes arquivos sÃŖo lidos e escritos pelos comandos `sync` e `fix` e apenas lidos pelos comandos `scrub` e `check`. 12 CODIFICAÃ§ÃŖO (ENCODING) ========================= SnapRAID no Unix ignora qualquer codificaÃ§ÃŖo. Ele lÃĒ e armazena os nomes de arquivo com a mesma codificaÃ§ÃŖo usada pelo sistema de arquivos. No Windows, todos os nomes lidos do sistema de arquivos sÃŖo convertidos e processados no formato UTF-8. Para que os nomes de arquivo sejam impressos corretamente, vocÃĒ deve definir o console do Windows para o modo UTF-8 com o comando `chcp 65001` e usar uma fonte TrueType como `Lucida Console` como fonte do console. Isso afeta apenas os nomes de arquivo impressos; se vocÃĒ redirecionar a saída do console para um arquivo, o arquivo resultante estarÃĄ sempre no formato UTF-8. 13 DIREITOS AUTORAIS (COPYRIGHT) ================================ Este arquivo Ê Copyright (C) 2025 Andrea Mazzoleni 14 VEJA TAMBÊM (SEE ALSO) ========================= snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ro.1000066400000000000000000002175271522717156100163430ustar00rootroot00000000000000.TH "SnapRAID Backup pentru Matrici de Discuri" 1 .SH NAME snapraid \- SnapRAID Backup pentru Matrici de Discuri .SH SINTAXă snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIERE SnapRAID este un program de backup conceput pentru matrici de discuri, care stochează informații de paritate pentru recuperarea datelor ÃŽn cazul a pÃĸnă la șase defecte de disc. .PP Destinat ÃŽn principal centrelor media de acasă cu fișiere mari, care se schimbă rar, SnapRAID oferă cÃĸteva caracteristici: .PD 0 .IP \(bu Puteți utiliza discuri deja pline cu fișiere fără nevoia de a le reformat, accesÃĸndu\-le ca de obicei. .IP \(bu Toate datele dvs. sunt hash\-uite pentru a asigura integritatea datelor și a preveni corupția silențioasă. .IP \(bu CÃĸnd numărul de discuri defecte depășește numărul de parități, pierderea de date este limitată la discurile afectate; datele de pe celelalte discuri rămÃĸn accesibile. .IP \(bu Dacă ștergeți accidental fișiere de pe un disc, recuperarea este posibilă. .IP \(bu Discurile pot avea dimensiuni diferite. .IP \(bu Puteți adăuga discuri ÃŽn orice moment. .IP \(bu SnapRAID nu vă blochează datele; puteți ÃŽnceta să\-l utilizați oricÃĸnd fără a reforma sau muta date. .IP \(bu Pentru a accesa un fișier, este necesar să se rotească doar un singur disc, economisind energie și reducÃĸnd zgomotul. .PD .PP Pentru mai multe informații, vă rugăm să vizitați site\-ul oficial SnapRAID: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITăRI SnapRAID este un hibrid ÃŽntre un program RAID și unul de backup, care urmărește să combine cele mai bune beneficii ale ambelor. Cu toate acestea, are unele limitări pe care ar trebui să le luați ÃŽn considerare ÃŽnainte de a\-l utiliza. .PP Principala limitare este că, dacă un disc se defectează și nu ați făcut recent o sincronizare, este posibil să nu puteți recupera complet. Mai exact, este posibil să nu puteți recupera pÃĸnă la dimensiunea fișierelor modificate sau șterse de la ultima operațiune de sincronizare. Acest lucru se ÃŽntÃĸmplă chiar dacă fișierele modificate sau șterse nu sunt pe discul defect. Acesta este motivul pentru care SnapRAID este mai potrivit pentru date care se schimbă rar. .PP Pe de altă parte, fișierele nou adăugate nu ÃŽmpiedică recuperarea fișierelor deja existente. Veți pierde doar fișierele adăugate recent dacă acestea se află pe discul defect. .PP Alte limitări ale SnapRAID sunt: .PD 0 .IP \(bu Cu SnapRAID, aveți ÃŽn continuare sisteme de fișiere separate pentru fiecare disc. Cu RAID, obțineți un singur sistem de fișiere mare. .IP \(bu SnapRAID nu face striping de date. Cu RAID, obțineți un spor de viteză prin striping. .IP \(bu SnapRAID nu suportă recuperarea ÃŽn timp real. Cu RAID, nu trebuie să vă opriți din lucru atunci cÃĸnd un disc se defectează. .IP \(bu SnapRAID poate recupera date doar dintr\-un număr limitat de defecte de disc. Cu un backup, puteți recupera dintr\-o defecțiune completă a ÃŽntregii matrici de discuri. .IP \(bu Sunt salvate doar numele fișierelor, mărcile temporale, symlink\-urile și hardlink\-urile. Permisiunile, proprietarul și atributele extinse nu sunt salvate. .PD .SH NOțIUNI DE BAZă Pentru a utiliza SnapRAID, trebuie mai ÃŽntÃĸi să selectați un disc ÃŽn matricea dvs. de discuri pentru a\-l dedica informațiilor de \`paritate\`. Cu un singur disc pentru paritate, veți putea recupera dintr\-o singură defecțiune de disc, similar cu RAID5. .PP Dacă doriți să recuperați din mai multe defecțiuni de disc, similar cu RAID6, trebuie să rezervați discuri suplimentare pentru paritate. Fiecare disc de paritate suplimentar permite recuperarea dintr\-o defecțiune de disc ÃŽn plus. .PP Ca discuri de paritate, trebuie să le alegeți pe cele mai mari din matrice, deoarece informațiile de paritate pot crește pÃĸnă la dimensiunea celui mai mare disc de date din matrice. .PP Aceste discuri vor fi dedicate stocării fișierelor de \`paritate\`. Nu ar trebui să stocați datele dvs. pe ele. .PP Apoi, trebuie să definiți discurile de \`date\` pe care doriți să le protejați cu SnapRAID. Protecția este mai eficientă dacă aceste discuri conțin date care se schimbă rar. Din acest motiv, este mai bine să NU includeți discul C:\\ al Windows sau directoarele Unix /home, /var și /tmp. .PP Lista de fișiere este salvată ÃŽn fișierele de \`conținut\`, de obicei stocate pe discurile de date, de paritate sau de boot. Acest fișier conține detaliile backup\-ului dvs., inclusiv toate sumele de control (checksums) pentru a\-i verifica integritatea. Fișierul de \`conținut\` este stocat ÃŽn mai multe copii, iar fiecare copie trebuie să fie pe un disc diferit pentru a se asigura că, chiar și ÃŽn cazul a multiple defecte de disc, cel puțin o copie este disponibilă. .PP De exemplu, să presupunem că sunteți interesați doar de un singur nivel de paritate de protecție și discurile dvs. se află la: .PP .RS 4 /mnt/diskp <\- discul selectat pentru paritate .PD 0 .PP .PD /mnt/disk1 <\- primul disc de protejat .PD 0 .PP .PD /mnt/disk2 <\- al doilea disc de protejat .PD 0 .PP .PD /mnt/disk3 <\- al treilea disc de protejat .PD 0 .PD .RE .PP Trebuie să creați fișierul de configurare /etc/snapraid.conf cu următoarele opțiuni: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Dacă sunteți pe Windows, ar trebui să utilizați formatul de cale Windows, cu litere de unitate și backslash\-uri ÃŽn loc de slash\-uri. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Dacă aveți multe discuri și rămÃĸneți fără litere de unitate, puteți monta discurile direct ÃŽn subfoldere. Vedeți: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP În acest moment, sunteți gata să rulați comanda \`sync\` pentru a construi informațiile de paritate. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Acest proces poate dura cÃĸteva ore prima dată, ÃŽn funcție de dimensiunea datelor deja prezente pe discuri. Dacă discurile sunt goale, procesul este imediat. .PP Îl puteți opri oricÃĸnd apăsÃĸnd Ctrl+C, iar la următoarea rulare, va relua de unde a fost ÃŽntrerupt. .PP CÃĸnd această comandă se finalizează, datele dvs. sunt ÎN SIGURANȚĂ. .PP Acum puteți ÃŽncepe să utilizați matricea după cum doriți și să actualizați periodic informațiile de paritate rulÃĸnd comanda \`sync\`. .SS Scrubbing (Verificare) Pentru a verifica periodic datele și paritatea pentru erori, puteți rula comanda \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Această comandă compară datele din matricea dvs. cu hash\-ul calculat ÃŽn timpul comenzii \`sync\` pentru a verifica integritatea. .PP Fiecare rulare a comenzii verifică aproximativ 8% din matrice, excluzÃĸnd datele deja verificate ÃŽn ultimele 10 zile. Puteți utiliza opțiunea \-p, \-\-plan pentru a specifica o cantitate diferită și opțiunea \-o, \-\-older\-than pentru a specifica o vÃĸrstă diferită ÃŽn zile. De exemplu, pentru a verifica 5% din matrice pentru blocuri mai vechi de 20 de zile, utilizați: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Dacă se găsesc erori silențioase sau de intrare/ieșire ÃŽn timpul procesului, blocurile corespunzătoare sunt marcate ca fiind defecte ÃŽn fișierul de \`conținut\` și listate ÃŽn comanda \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Pentru a le repara, puteți utiliza comanda \`fix\`, filtrÃĸnd pentru blocuri defecte cu opțiunea \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP La următorul \`scrub\`, erorile vor dispărea din raportul \`status\` dacă sunt ÃŽntr\-adevăr reparate. Pentru a face mai rapid, puteți utiliza \-p bad pentru a verifica doar blocurile marcate ca defecte. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP Rularea \`scrub\` pe o matrice nesincronizată poate raporta erori cauzate de fișiere eliminate sau modificate. Aceste erori sunt raportate ÃŽn ieșirea \`scrub\`, dar blocurile aferente nu sunt marcate ca defecte. .SS Pooling (Agregare) Notă: Funcționalitatea de pooling descrisă mai jos a fost ÃŽnlocuită de instrumentul mergerfs, care este acum opțiunea recomandată pentru utilizatorii Linux ÃŽn comunitatea SnapRAID. Mergefs oferă o modalitate mai flexibilă și eficientă de a agrega mai multe discuri ÃŽntr\-un singur punct de montare unificat, permițÃĸnd accesul neÃŽntrerupt la fișiere pe toată matricea dvs. fără a se baza pe link\-uri simbolice. Se integrează bine cu SnapRAID pentru protecția parității și este utilizat ÃŽn mod obișnuit ÃŽn configurații precum OpenMediaVault (OMV) sau configurații NAS personalizate. .PP Pentru a avea toate fișierele din matricea dvs. afișate ÃŽn același arbore de directoare, puteți activa funcționalitatea de \`pooling\`. Aceasta creează o vizualizare virtuală doar ÃŽn citire a tuturor fișierelor din matricea dvs. folosind link\-uri simbolice. .PP Puteți configura directorul de \`pooling\` ÃŽn fișierul de configurare cu: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP sau, dacă sunteți pe Windows, cu: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP și apoi rulați comanda \`pool\` pentru a crea sau actualiza vizualizarea virtuală. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Dacă utilizați o platformă Unix și doriți să partajați acest director peste rețea către mașini Windows sau Unix, ar trebui să adăugați următoarele opțiuni la /etc/samba/smb.conf: .PP .RS 4 # În secțiunea global a smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # În secțiunea share a smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP În Windows, partajarea link\-urilor simbolice peste o rețea necesită ca clienții să le rezolve de la distanță. Pentru a permite acest lucru, pe lÃĸngă partajarea directorului pool, trebuie să partajați și toate discurile ÃŽn mod independent, folosind numele discurilor definite ÃŽn fișierul de configurare ca puncte de partajare. De asemenea, trebuie să specificați ÃŽn opțiunea \`share\` din fișierul de configurare calea UNC Windows pe care clienții la distanță trebuie să o folosească pentru a accesa aceste discuri partajate. .PP De exemplu, operÃĸnd de pe un server numit \`darkstar\`, puteți utiliza opțiunile: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP și partajați următoarele directoare peste rețea: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP pentru a permite clienților la distanță să acceseze toate fișierele la \\\\darkstar\\pool. .PP De asemenea, ar putea fi necesar să configurați clienții la distanță pentru a permite accesul la symlink\-uri la distanță cu comanda: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting (Anulare Ștergere) SnapRAID funcționează mai mult ca un program de backup decÃĸt un sistem RAID și poate fi folosit pentru a restaura sau anula ștergerea fișierelor la starea lor anterioară utilizÃĸnd opțiunea \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP sau pentru un director: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP De asemenea, ÃŽl puteți utiliza pentru a recupera doar fișiere șterse accidental ÃŽn interiorul unui director folosind opțiunea \-m, \-\-filter\-missing, care restaurează doar fișierele lipsă, lăsÃĸndu\-le pe toate celelalte neatinse. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP Sau pentru a recupera toate fișierele șterse de pe toate unitățile cu: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recuperare Cel mai rău s\-a ÃŽntÃĸmplat și ați pierdut unul sau mai multe discuri! .PP NU INTRAȚI ÎN PANICĂ! Veți putea să le recuperați! .PP Primul lucru pe care trebuie să\-l faceți este să evitați modificările ulterioare la matricea dvs. de discuri. Dezactivați orice conexiuni la distanță la aceasta și orice procese programate, inclusiv orice sincronizare sau verificare SnapRAID programată pe timp de noapte. .PP Apoi continuați cu următorii pași. .SS PASUL 1 \-> Reconfigurare Aveți nevoie de spațiu pentru a recupera, ideal pe discuri de rezervă suplimentare, dar un disc USB extern sau un disc la distanță vor fi suficiente. .PP Modificați fișierul de configurare SnapRAID pentru a face ca opțiunea \`data\` sau \`parity\` a discului defect să indice o locație cu suficient spațiu gol pentru a recupera fișierele. .PP De exemplu, dacă discul \`d1\` a eșuat, schimbați de la: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP la: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Dacă discul de recuperat este un disc de paritate, actualizați opțiunea \`parity\` corespunzătoare. Dacă aveți mai multe discuri defecte, actualizați toate opțiunile lor de configurare. .SS PASUL 2 \-> Reparare (Fix) Rulați comanda fix, stocÃĸnd jurnalul ÃŽntr\-un fișier extern cu: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP Unde NAME este numele discului, cum ar fi \`d1\` ÃŽn exemplul nostru anterior. Dacă discul de recuperat este un disc de paritate, utilizați numele \`parity\`, \`2\-parity\`, etc. Dacă aveți mai multe discuri defecte, utilizați mai multe opțiuni \-d pentru a le specifica pe toate. .PP Această comandă va dura mult timp. .PP Asigurați\-vă că aveți cÃĸțiva gigabytes liberi pentru a stoca fișierul fix.log. Rulați\-l de pe un disc cu suficient spațiu liber. .PP Acum ați recuperat tot ce este recuperabil. Dacă unele fișiere sunt parțial sau total nerecuperabile, vor fi redenumite adăugÃĸnd extensia \`.unrecoverable\`. .PP Puteți găsi o listă detaliată a tuturor blocurilor nerecuperabile ÃŽn fișierul fix.log verificÃĸnd toate liniile care ÃŽncep cu \`unrecoverable:\`. .PP Dacă nu sunteți mulțumit de recuperare, o puteți reÃŽncerca de cÃĸte ori doriți. .PP De exemplu, dacă ați eliminat fișiere din matrice după ultima \`sync\`, acest lucru poate duce la nerecuperarea unor fișiere. În acest caz, puteți reÃŽncerca \`fix\`\-ul utilizÃĸnd opțiunea \-i, \-\-import, specificÃĸnd unde se află acum aceste fișiere pentru a le include din nou ÃŽn procesul de recuperare. .PP Dacă sunteți mulțumit de recuperare, puteți continua, dar rețineți că după sincronizare, nu mai puteți reÃŽncerca comanda \`fix\` deloc! .SS PASUL 3 \-> Verificare (Check) Ca o verificare prudentă, puteți rula acum o comandă \`check\` pentru a vă asigura că totul este corect pe discul recuperat. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP Unde NAME este numele discului, cum ar fi \`d1\` ÃŽn exemplul nostru anterior. .PP Opțiunile \-d și \-a spun SnapRAID să verifice doar discul specificat și să ignore toate datele de paritate. .PP Această comandă va dura mult timp, dar dacă nu sunteți excesiv de prudent, o puteți sări. .SS PASUL 4 \-> Sincronizare (Sync) Rulați comanda \`sync\` pentru a resincroniza matricea cu noul disc. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Dacă totul este recuperat, această comandă este imediată. .SH COMENZI SnapRAID oferă cÃĸteva comenzi simple care vă permit să: .PD 0 .IP \(bu Tipăriți starea matricei \-> \`status\` .IP \(bu Controlați discurile \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Faceți un backup/snapshot \-> \`sync\` .IP \(bu Verificați periodic datele \-> \`scrub\` .IP \(bu Restaurați ultimul backup/snapshot \-> \`fix\`. .PD .PP Comenzile trebuie scrise cu litere mici. .SS status Tipărește un rezumat al stării matricei de discuri. .PP Include informații despre fragmentarea parității, cÃĸt de vechi sunt blocurile fără verificare și toate erorile silențioase ÃŽnregistrate ÃŽntÃĸlnite ÃŽn timpul verificării (scrubbing). .PP Informațiile prezentate se referă la ultima dată cÃĸnd ați rulat \`sync\`. Modificările ulterioare nu sunt luate ÃŽn considerare. .PP Dacă au fost detectate blocuri defecte, numerele lor de bloc sunt listate. Pentru a le repara, puteți utiliza comanda \`fix \-e\`. .PP De asemenea, arată un grafic care reprezintă ultima dată cÃĸnd fiecare bloc a fost verificat (scrubbed) sau sincronizat. Blocurile verificate sunt afișate cu \`*\`, blocurile sincronizate, dar ÃŽncă neverificate, cu \`o\`. .PP Nimic nu este modificat. .SS smart Tipărește un raport SMART al tuturor discurilor din sistem. .PP Include o estimare a probabilității de eșec ÃŽn anul următor, permițÃĸndu\-vă să planificați ÃŽnlocuiri de ÃŽntreținere a discurilor care prezintă atribute suspecte. .PP Această estimare a probabilității este obținută prin corelarea atributelor SMART ale discurilor cu datele Backblaze disponibile la: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Dacă SMART raportează că un disc este pe cale să eșueze, \`FAIL\` sau \`PREFAIL\` este tipărit pentru acel disc, iar SnapRAID returnează o eroare. În acest caz, ÃŽnlocuirea imediată a discului este puternic recomandată. .PP Alte șiruri de stare posibile sunt: .RS 4 .PD 0 .HP 4 .I logfail În trecut, unele atribute au fost mai mici decÃĸt pragul. .HP 4 .I logerr Jurnalul de erori al dispozitivului conține erori. .HP 4 .I selferr Jurnalul de auto\-test al dispozitivului conține erori. .PD .RE .PP Dacă opțiunea \-v, \-\-verbose este specificată, este furnizată o analiză statistică mai profundă. Această analiză vă poate ajuta să decideți dacă aveți nevoie de mai multă sau mai puțină paritate. .PP Această comandă utilizează instrumentul \`smartctl\` și este echivalentă cu rularea \`smartctl \-a\` pe toate dispozitivele. .PP Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica o comandă personalizată utilizÃĸnd opțiunea \`smartctl\` ÃŽn fișierul de configurare. .PP Nimic nu este modificat. .SS probe Tipărește starea de ALIMENTARE (POWER) a tuturor discurilor din sistem. .PP \`Standby\` ÃŽnseamnă că discul nu se rotește. \`Active\` ÃŽnseamnă că discul se rotește. .PP Această comandă utilizează instrumentul \`smartctl\` și este echivalentă cu rularea \`smartctl \-n standby \-i\` pe toate dispozitivele. .PP Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica o comandă personalizată utilizÃĸnd opțiunea \`smartctl\` ÃŽn fișierul de configurare. .PP Nimic nu este modificat. .SS up Pornirea tuturor discurilor din matrice. .PP Puteți porni doar discuri specifice utilizÃĸnd opțiunea \-d, \-\-filter\-disk. .PP Pornirea tuturor discurilor ÃŽn același timp necesită multă energie. Asigurați\-vă că sursa dvs. de alimentare o poate susține. .PP Nimic nu este modificat. .SS down Oprirea (spin down) tuturor discurilor din matrice. .PP Această comandă utilizează instrumentul \`smartctl\` și este echivalentă cu rularea \`smartctl \-s standby,now\` pe toate dispozitivele. .PP Puteți opri doar discuri specifice utilizÃĸnd opțiunea \-d, \-\-filter\-disk. .PP Pentru a opri automat la eroare, puteți utiliza opțiunea \-s, \-\-spin\-down\-on\-error cu orice altă comandă, care este echivalentă cu rularea manuală a \`down\` atunci cÃĸnd apare o eroare. .PP Nimic nu este modificat. .SS diff Listează toate fișierele modificate de la ultima \`sync\` care trebuie să li se recalculeze datele de paritate. .PP Această comandă nu verifică datele fișierului, ci doar marca temporală, dimensiunea și inodul fișierului. .PP După listarea tuturor fișierelor modificate, este prezentat un rezumat al modificărilor, grupate după: .RS 4 .PD 0 .HP 4 .I equal Fișiere neschimbate față de ÃŽnainte. .HP 4 .I added Fișiere adăugate care nu erau prezente ÃŽnainte. .HP 4 .I removed Fișiere eliminate. .HP 4 .I updated Fișiere cu o dimensiune sau marcă temporală diferită, ceea ce ÃŽnseamnă că au fost modificate. .HP 4 .I moved Fișiere mutate ÃŽntr\-un director diferit pe același disc. Sunt identificate avÃĸnd același nume, dimensiune, marcă temporală și inod, dar un director diferit. .HP 4 .I copied Fișiere copiate pe același disc sau pe un disc diferit unde fișierul original ÃŽncă există. Acestea sunt identificate prin faptul că au același nume, dimensiune și amprentă temporală. Dacă amprenta temporală sub\-secundă este zero, calea completă trebuie să se potrivească pentru a fi identificate, nu doar numele. .HP 4 .I relocated Fișiere mutate pe același disc sau pe un disc diferit unde originalul a dispărut. Acestea sunt identificate prin faptul că au același nume, dimensiune și amprentă temporală. Dacă amprenta temporală sub\-secundă este zero, calea completă trebuie să se potrivească pentru a fi identificate. Spre deosebire de fișierele \'moved\' de pe același disc, fișierele relocate au un inod diferit. .HP 4 .I restored Fișiere cu un inod diferit, dar care se potrivesc ca director, nume, dimensiune și amprentă temporală. Acestea sunt de obicei fișiere restaurate după ce au fost șterse. .PD .RE .PP Dacă este necesară o \`sync\`, codul de retur al procesului este 2, ÃŽn loc de cel implicit 0. Codul de retur 1 este utilizat pentru o condiție de eroare generică. .PP Nimic nu este modificat. .SS sync Actualizează informațiile de paritate. Toate fișierele modificate din matricea de discuri sunt citite și datele de paritate corespunzătoare sunt actualizate. .PP Puteți opri acest proces ÃŽn orice moment apăsÃĸnd Ctrl+C, fără a pierde munca deja efectuată. La următoarea rulare, procesul \`sync\` va relua de unde a fost ÃŽntrerupt. .PP Dacă se găsesc erori silențioase sau de intrare/ieșire ÃŽn timpul procesului, blocurile corespunzătoare sunt marcate ca defecte. .PP Fișierele sunt identificate prin cale și/sau inod și verificate prin dimensiune și marcă temporală. Dacă dimensiunea sau marca temporală a fișierului diferă, datele de paritate sunt recalculate pentru ÃŽntregul fișier. Dacă fișierul este mutat sau redenumit pe același disc, păstrÃĸnd același inod, paritatea nu este recalculată. Dacă fișierul este mutat pe un alt disc, paritatea este recalculată, dar informațiile hash calculate anterior sunt păstrate. .PP Fișierele de \`content\` și \`parity\` sunt modificate dacă este necesar. Fișierele din matrice NU sunt modificate. .SS scrub Verifică (scrubs) matricea, căutÃĸnd erori silențioase sau de intrare/ieșire ÃŽn discurile de date și de paritate. .PP Fiecare invocare verifică aproximativ 8% din matrice, excluzÃĸnd datele deja verificate ÃŽn ultimele 10 zile. Acest lucru ÃŽnseamnă că verificarea o dată pe săptămÃĸnă asigură că fiecare bit de date este verificat cel puțin o dată la trei luni. .PP Puteți defini un plan de verificare sau o cantitate diferită utilizÃĸnd opțiunea \-p, \-\-plan, care acceptă: bad \- Verifică blocurile marcate ca defecte. new \- Verifică blocurile tocmai sincronizate care nu au fost ÃŽncă verificate. full \- Verifică totul. 0\-100 \- Verifică procentul specificat de blocuri. .PP Dacă specificați o valoare procentuală, puteți utiliza și opțiunea \-o, \-\-older\-than pentru a defini cÃĸt de vechi ar trebui să fie blocul. Cele mai vechi blocuri sunt verificate primele, asigurÃĸnd o verificare optimă. Dacă doriți să verificați doar blocurile tocmai sincronizate care nu au fost ÃŽncă verificate, utilizați opțiunea \`\-p new\`. .PP Pentru a obține detalii despre starea verificării, utilizați comanda \`status\`. .PP Pentru orice eroare silențioasă sau de intrare/ieșire găsită, blocurile corespunzătoare sunt marcate ca defecte ÃŽn fișierul de \`content\`. Aceste blocuri defecte sunt listate ÃŽn \`status\` și pot fi reparate cu \`fix \-e\`. După reparare, la următorul scrub, vor fi reverificate, iar dacă se găsesc corectate, marca defectă va fi eliminată. Pentru a verifica doar blocurile defecte, puteți utiliza comanda \`scrub \-p bad\`. .PP Este recomandat să rulați \`scrub\` doar pe o matrice sincronizată pentru a evita erorile raportate cauzate de date nesincronizate. Aceste erori sunt recunoscute ca nefiind erori silențioase, iar blocurile nu sunt marcate ca defecte, dar astfel de erori sunt raportate ÃŽn ieșirea comenzii. .PP Fișierul de \`content\` este modificat pentru a actualiza ora ultimei verificări pentru fiecare bloc și pentru a marca blocurile defecte. Fișierele de \`parity\` NU sunt modificate. Fișierele din matrice NU sunt modificate. .SS fix Repară toate fișierele și datele de paritate. .PP Toate fișierele și datele de paritate sunt comparate cu starea snapshot\-ului salvată la ultima \`sync\`. Dacă se găsește o diferență, este readusă la snapshot\-ul stocat. .PP ATENȚIE! Comanda \`fix\` nu face diferența ÃŽntre erori și modificări intenționate. Ea revine necondiționat la starea fișierului de la ultima \`sync\`. .PP Dacă nu este specificată nicio altă opțiune, ÃŽntreaga matrice este procesată. Utilizați opțiunile de filtrare pentru a selecta un subset de fișiere sau discuri de operat. .PP Pentru a repara doar blocurile marcate ca defecte ÃŽn timpul \`sync\` și \`scrub\`, utilizați opțiunea \-e, \-\-filter\-error. Spre deosebire de alte opțiuni de filtrare, aceasta aplică reparații doar fișierelor care sunt neschimbate de la ultima \`sync\`. .PP SnapRAID redenumește toate fișierele care nu pot fi reparate adăugÃĸnd extensia \`.unrecoverable\`. .PP Înainte de reparare, ÃŽntreaga matrice este scanată pentru a găsi orice fișiere mutate de la ultima operațiune \`sync\`. Aceste fișiere sunt identificate prin marca lor temporală, ignorÃĸnd numele și directorul lor și sunt utilizate ÃŽn procesul de recuperare dacă este necesar. Dacă ați mutat unele dintre ele ÃŽn afara matricei, puteți utiliza opțiunea \-i, \-\-import pentru a specifica directoare suplimentare de scanat. .PP Fișierele sunt identificate doar prin cale, nu prin inod. .PP Fișierul de \`content\` NU este modificat. Fișierele de \`parity\` sunt modificate dacă este necesar. Fișierele din matrice sunt modificate dacă este necesar. .SS check Verifică toate fișierele și datele de paritate. .PP Funcționează ca \`fix\`, dar simulează doar o recuperare și nu sunt scrise modificări ÃŽn matrice. .PP Această comandă este destinată ÃŽn primul rÃĸnd verificării manuale, cum ar fi după un proces de recuperare sau ÃŽn alte condiții speciale. Pentru verificări periodice și programate, utilizați \`scrub\`. .PP Dacă utilizați opțiunea \-a, \-\-audit\-only, doar datele fișierului sunt verificate, iar datele de paritate sunt ignorate pentru o rulare mai rapidă. .PP Fișierele sunt identificate doar prin cale, nu prin inod. .PP Nimic nu este modificat. .SS list Listează toate fișierele conținute ÃŽn matrice la momentul ultimei \`sync\`. .PP Cu \-v sau \-\-verbose, este afișat și timpul sub\-secundă. .PP Nimic nu este modificat. .SS dup Listează toate fișierele duplicate. Două fișiere sunt considerate egale dacă hash\-urile lor se potrivesc. Datele fișierului nu sunt citite; sunt utilizate doar hash\-urile precalculate. .PP Nimic nu este modificat. .SS pool Creează sau actualizează o vizualizare virtuală a tuturor fișierelor din matricea dvs. de discuri ÃŽn directorul de \`pooling\`. .PP Fișierele nu sunt copiate, ci legate folosind link\-uri simbolice. .PP La actualizare, toate link\-urile simbolice existente și subdirectoarele goale sunt șterse și ÃŽnlocuite cu noua vizualizare a matricei. Orice alte fișiere obișnuite sunt lăsate pe loc. .PP Nimic nu este modificat ÃŽn afara directorului pool. .SS devices Tipărește dispozitivele de nivel scăzut utilizate de matrice. .PP Această comandă afișează asocierile de dispozitive din matrice și este destinată ÃŽn principal ca interfață de script. .PP Primele două coloane sunt ID\-ul și calea dispozitivului de nivel scăzut. Următoarele două coloane sunt ID\-ul și calea dispozitivului de nivel ÃŽnalt. Ultima coloană este numele discului din matrice. .PP În majoritatea cazurilor, aveți un dispozitiv de nivel scăzut pentru fiecare disc din matrice, dar ÃŽn unele configurații mai complexe, puteți avea mai multe dispozitive de nivel scăzut utilizate de un singur disc din matrice. .PP Nimic nu este modificat. .SS touch Setează o marcă temporală arbitrară sub\-secundă pentru toate fișierele care o au setată la zero. .PP Acest lucru ÃŽmbunătățește capacitatea SnapRAID de a recunoaște fișierele mutate și copiate, deoarece face ca marca temporală să fie aproape unică, reducÃĸnd posibilele duplicate. .PP Mai exact, dacă marca temporală sub\-secundă nu este zero, un fișier mutat sau copiat este identificat ca atare dacă se potrivește cu numele, dimensiunea și marca temporală. Dacă marca temporală sub\-secundă este zero, este considerat o copie doar dacă calea completă, dimensiunea și marca temporală se potrivesc toate. .PP Marca temporală cu precizie de secundă nu este modificată, deci toate datele și orele fișierelor dvs. vor fi păstrate. .SS rehash Programează o rehash\-uire a ÃŽntregii matrici. .PP Această comandă schimbă tipul de hash utilizat, de obicei la actualizarea de la un sistem pe 32 de biți la unul pe 64 de biți, pentru a trece de la MurmurHash3 la SpookyHash, care este mai rapid. .PP Dacă utilizați deja hash\-ul optim, această comandă nu face nimic și vă informează că nu este necesară nicio acțiune. .PP Rehash\-ul nu este efectuat imediat, ci are loc progresiv ÃŽn timpul \`sync\` și \`scrub\`. .PP Puteți verifica starea rehash\-ului utilizÃĸnd \`status\`. .PP În timpul rehash\-ului, SnapRAID ÃŽČ™i menține funcționalitatea completă, cu singura excepție că \`dup\` nu poate detecta fișierele duplicate folosind un hash diferit. .SS locate Localizează fișierele stocate pe discurile de paritate. Pentru fiecare fișier potrivit, afișează locația acestuia ÃŽn fișierul de paritate și numărul de fragmente pe care le ocupă. .PP Puteți utiliza opțiunea \-t, \-\-tail pentru a restricționa operațiunea la fișierele care ocupă porțiunea finală specificată a parității. Dacă doriți să realocați aceste fișiere, puteți utiliza apoi opțiunea \-W, \-\-force\-realloc\-tail. .PP Rețineți că astfel de fișiere nu vor fi protejate de paritate ÃŽn timpul procesului de realocare. .SH OPțIUNI SnapRAID oferă următoarele opțiuni: .TP .B \-c, \-\-conf CONFIG Selectează fișierul de configurare de utilizat. Dacă nu este specificat, ÃŽn Unix utilizează fișierul \`/usr/local/etc/snapraid.conf\` dacă există, altfel \`/etc/snapraid.conf\`. În Windows, utilizează fișierul \`snapraid.conf\` din același director ca \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Filtrează fișierele de procesat ÃŽn \`check\` și \`fix\`. Sunt procesate doar fișierele care se potrivesc cu modelul specificat. Această opțiune poate fi utilizată de mai multe ori. Vedeți secțiunea PATTERN pentru mai multe detalii despre specificațiile modelului. În Unix, asigurați\-vă că caracterele globbing sunt citate dacă sunt utilizate. Această opțiune poate fi utilizată doar cu \`check\` și \`fix\`. Nu poate fi utilizată cu \`sync\` și \`scrub\`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. .TP .B \-d, \-\-filter\-disk NAME Filtrează discurile de procesat ÃŽn \`check\`, \`fix\`, \`up\` și \`down\`. Trebuie să specificați un nume de disc așa cum este definit ÃŽn fișierul de configurare. Puteți specifica și discurile de paritate cu numele: \`parity\`, \`2\-parity\`, \`3\-parity\`, etc., pentru a limita operațiunile la un anumit disc de paritate. Dacă combinați mai multe opțiuni \-\-filter, \-\-filter\-disk și \-\-filter\-missing, sunt selectate doar fișierele care se potrivesc cu toate filtrele. Această opțiune poate fi utilizată de mai multe ori. Această opțiune poate fi utilizată doar cu \`check\`, \`fix\`, \`up\` și \`down\`. Nu poate fi utilizată cu \`sync\` și \`scrub\`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. .TP .B \-m, \-\-filter\-missing Filtrează fișierele de procesat ÃŽn \`check\` și \`fix\`. Sunt procesate doar fișierele lipsă sau șterse din matrice. CÃĸnd este utilizată cu \`fix\`, aceasta acționează ca o comandă de \`undelete\` (anulare ștergere). Dacă combinați mai multe opțiuni \-\-filter, \-\-filter\-disk și \-\-filter\-missing, sunt selectate doar fișierele care se potrivesc cu toate filtrele. Această opțiune poate fi utilizată doar cu \`check\` și \`fix\`. Nu poate fi utilizată cu \`sync\` și \`scrub\`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. .TP .B \-e, \-\-filter\-error Procesează fișierele cu erori ÃŽn \`check\` și \`fix\`. Procesează doar fișierele care au blocuri marcate cu erori silențioase sau de intrare/ieșire ÃŽn timpul \`sync\` și \`scrub\`, așa cum sunt listate ÃŽn \`status\`. Această opțiune poate fi utilizată doar cu \`check\` și \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Selectează planul de verificare (scrub). Dacă PERC este o valoare numerică de la 0 la 100, este interpretată ca procentul de blocuri de verificat. În loc de un procent, puteți specifica un plan: \`bad\` verifică blocurile defecte, \`new\` verifică blocurile care nu au fost ÃŽncă verificate, iar \`full\` verifică totul. Această opțiune poate fi utilizată doar cu \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Selectează cea mai veche parte a matricei de procesat ÃŽn \`scrub\`. DAYS este vÃĸrsta minimă ÃŽn zile pentru ca un bloc să fie verificat; valoarea implicită este 10. Blocurile marcate ca defecte sunt ÃŽntotdeauna verificate, indiferent de această opțiune. Această opțiune poate fi utilizată doar cu \`scrub\`. .TP .B \-a, \-\-audit\-only În \`check\`, verifică hash\-ul fișierelor fără a verifica datele de paritate. Dacă sunteți interesați doar de verificarea datelor fișierului, această opțiune poate accelera semnificativ procesul de verificare. Această opțiune poate fi utilizată doar cu \`check\`. .TP .B \-h, \-\-pre\-hash În \`sync\`, rulează o fază preliminară de hashing a tuturor datelor noi pentru o verificare suplimentară ÃŽnainte de calculul parității. De obicei, ÃŽn \`sync\`, nu se face hashing preliminar, iar datele noi sunt hash\-uite chiar ÃŽnainte de calculul parității, atunci cÃĸnd sunt citite pentru prima dată. Acest proces are loc atunci cÃĸnd sistemul este sub ÃŽncărcare mare, cu toate discurile rotindu\-se și un CPU ocupat. Aceasta este o condiție extremă pentru mașină și, dacă are o problemă hardware latentă, erorile silențioase pot trece nedetectate deoarece datele nu sunt ÃŽncă hash\-uite. Pentru a evita acest risc, puteți activa modul \`pre\-hash\` pentru a avea toate datele citite de două ori pentru a le asigura integritatea. Această opțiune verifică și fișierele mutate ÃŽn cadrul matricei pentru a se asigura că operațiunea de mutare a fost reușită și, dacă este necesar, vă permite să rulați o operațiune de reparare (fix) ÃŽnainte de a continua. Această opțiune poate fi utilizată doar cu \`sync\`. .TP .B \-i, \-\-import DIR Importă din directorul specificat orice fișiere șterse din matrice după ultima \`sync\`. Dacă mai aveți astfel de fișiere, ele pot fi utilizate de \`check\` și \`fix\` pentru a ÃŽmbunătăți procesul de recuperare. Fișierele sunt citite, inclusiv ÃŽn subdirectoare, și sunt identificate indiferent de numele lor. Această opțiune poate fi utilizată doar cu \`check\` și \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error La orice eroare, oprește (spin down) toate discurile gestionate ÃŽnainte de a ieși cu un cod de stare diferit de zero. Acest lucru ÃŽmpiedică unitățile să rămÃĸnă active și să se rotească după o operațiune ÃŽntreruptă, ajutÃĸnd la evitarea acumulării inutile de căldură și a consumului de energie. Utilizați această opțiune pentru a vă asigura că discurile sunt oprite ÃŽn siguranță chiar și atunci cÃĸnd o comandă eșuează. .TP .B \-w, \-\-bw\-limit RATE Aplică o limită globală de lățime de bandă pentru toate discurile. RATE este numărul de octeți pe secundă. Puteți specifica un multiplicator cum ar fi K, M sau G (de exemplu, \-\-bw\-limit 1G). .TP .B \-t, \-\-tail DIMENSIUNE Limitează listarea fișierelor la cele care nu utilizează mai mult de dimensiunea finală specificată a discurilor de paritate. Puteți utiliza multiplicatori precum K, M, G sau T (ex. \-\-tail 1G). Această opțiune este valabilă numai atunci cÃĸnd este utilizată ÃŽmpreună cu comanda \`locate\`. .TP .B \-A, \-\-stats Activează o vizualizare de stare extinsă care arată informații suplimentare. Ecranul afișează două grafice: Primul grafic arată numărul de dungi (stripes) tamponate pentru fiecare disc, ÃŽmpreună cu calea fișierului care este accesat ÃŽn prezent pe acel disc. În mod obișnuit, cel mai lent disc nu va avea tampon disponibil, ceea ce determină lățimea de bandă maximă realizabilă. Al doilea grafic arată procentul de timp petrecut așteptÃĸnd ÃŽn ultimele 100 de secunde. Este de așteptat ca cel mai lent disc să cauzeze cea mai mare parte a timpului de așteptare, ÃŽn timp ce alte discuri ar trebui să aibă puțin sau deloc timp de așteptare, deoarece ÃŽČ™i pot utiliza dungile tamponate. Acest grafic arată și timpul petrecut așteptÃĸnd calculele hash și calculele RAID. Toate calculele rulează ÃŽn paralel cu operațiunile de disc. Prin urmare, atÃĸta timp cÃĸt există timp de așteptare măsurabil pentru cel puțin un disc, indică faptul că CPU\-ul este suficient de rapid pentru a ține pasul cu sarcina de lucru. .TP .B \-Z, \-\-force\-zero Forțează operațiunea nesigură de sincronizare a unui fișier cu dimensiunea zero care era anterior non\-zero. Dacă SnapRAID detectează o astfel de condiție, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cu ușurință cÃĸnd, după o cădere de sistem, unele fișiere accesate au fost trunchiate. Aceasta este o condiție posibilă ÃŽn Linux cu sistemele de fișiere ext3/ext4. Această opțiune poate fi utilizată doar cu \`sync\`. .TP .B \-E, \-\-force\-empty Forțează operațiunea nesigură de sincronizare a unui disc cu toate fișierele originale lipsă. Dacă SnapRAID detectează că toate fișierele prezente inițial pe disc lipsesc sau au fost rescrise, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cu ușurință cÃĸnd un sistem de fișiere de date nu este montat. Este permis, totuși, să aveți o singură schimbare de UUID cu paritate simplă și mai multe cu paritate multiplă, deoarece acesta este cazul normal la ÃŽnlocuirea discurilor după o recuperare. Această opțiune poate fi utilizată doar cu \`sync\`, \`check\` sau \`fix\`. .TP .B \-U, \-\-force\-uuid Forțează operațiunea nesigură de sincronizare, verificare și reparare cu discuri care și\-au schimbat UUID\-ul. Dacă SnapRAID detectează că unele discuri și\-au schimbat UUID\-ul, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cÃĸnd discurile dvs. sunt montate la punctele de montare greșite. Este permis, totuși, să aveți o singură schimbare de UUID cu paritate simplă și mai multe cu paritate multiplă, deoarece acesta este cazul normal la ÃŽnlocuirea discurilor după o recuperare. Această opțiune poate fi utilizată doar cu \`sync\`, \`check\` sau \`fix\`. .TP .B \-D, \-\-force\-device Forțează operațiunea nesigură de reparare cu discuri inaccesibile sau cu discuri pe același dispozitiv fizic. De exemplu, dacă ați pierdut două discuri de date și aveți un disc de rezervă pentru a recupera doar primul, puteți ignora al doilea disc inaccesibil. Sau, dacă doriți să recuperați un disc ÃŽn spațiul liber rămas pe un disc deja utilizat, partajÃĸnd același dispozitiv fizic. Această opțiune poate fi utilizată doar cu \`fix\`. .TP .B \-N, \-\-force\-nocopy În \`sync\`, \`check\` și \`fix\`, dezactivează euristica de detectare a copiei. Fără această opțiune, SnapRAID presupune că fișierele cu aceleași atribute, cum ar fi numele, dimensiunea și marca temporală, sunt copii cu aceleași date. Acest lucru permite identificarea fișierelor copiate sau mutate de pe un disc pe altul și refolosirea informațiilor hash deja calculate pentru a detecta erori silențioase sau pentru a recupera fișiere lipsă. În unele cazuri rare, acest comportament poate duce la rezultate fals pozitive sau la un proces lent din cauza multor verificări hash, iar această opțiune vă permite să rezolvați astfel de probleme. Această opțiune poate fi utilizată doar cu \`sync\`, \`check\` și \`fix\`. .TP .B \-F, \-\-force\-full În \`sync\`, forțează o recalculare completă a parității. Această opțiune poate fi utilizată atunci cÃĸnd adăugați un nou nivel de paritate sau dacă ați revenit la un fișier de conținut vechi utilizÃĸnd date de paritate mai recente. În loc să recreați paritatea de la zero, aceasta vă permite să reutilizați hash\-urile prezente ÃŽn fișierul de conținut pentru a valida datele și a menține protecția datelor ÃŽn timpul procesului \`sync\` utilizÃĸnd datele de paritate existente. Această opțiune poate fi utilizată doar cu \`sync\`. .TP .B \-R, \-\-force\-realloc În \`sync\`, forțează o realocare completă a fișierelor și o reconstruire a parității. Această opțiune poate fi utilizată pentru a realoca complet toate fișierele, eliminÃĸnd fragmentarea, ÃŽn timp ce reutilizați hash\-urile prezente ÃŽn fișierul de conținut pentru a valida datele. Această opțiune poate fi utilizată doar cu \`sync\`. ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu o utilizați. NU aveți protecție a datelor ÃŽn timpul operațiunii \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail DIMENSIUNE Funcționează ca \-R, \-\-force\-realloc, dar limitat la porțiunea finală specificată (ultimii DIMENSIUNE octeți) ai fiecărui fișier de paritate. Forțează realocarea (mutarea) oricăror fragmente/blocuri de fișiere stocate ÃŽn prezent ÃŽn acea secțiune finală, permițÃĸndu\-le să fie plasate oriunde ÃŽn fișierul/fișierele de paritate unde este disponibil spațiu liber (inclusiv golurile existente). Scopul principal al acestei opțiuni este de a reduce dimensiunea pe disc a fișierului de paritate. Dacă realocarea eliberează cu succes ÃŽntreaga secțiune finală (nu mai rămÃĸn blocuri care să o utilizeze), fișierul de paritate este trunchiat, recuperÃĸnd spațiul final neutilizat. Puteți utiliza multiplicatori precum K, M, G sau T (ex. \-\-force\-realloc\-tail 1G). Puteți utiliza locate \-t, \-\-tail pentru a cunoaște ÃŽn avans fișierele afectate. AVERTIZARE! Această opțiune este doar pentru experți și se recomandă insistent să nu fie utilizată. NU beneficiați de protecție a datelor ÃŽn timpul operațiunii \`sync\` pentru fișierele afectate. .TP .B \-l, \-\-log FILE Scrie un jurnal detaliat ÃŽn fișierul specificat. Dacă această opțiune nu este specificată, erorile neașteptate sunt tipărite pe ecran, putÃĸnd rezulta o ieșire excesivă ÃŽn caz de multe erori. CÃĸnd \-l, \-\-log este specificat, doar erorile fatale care fac SnapRAID să se oprească sunt tipărite pe ecran. Dacă calea ÃŽncepe cu \`>>\`, fișierul este deschis ÃŽn modul de adăugare. Aparițiile de \`%D\` și \`%T\` ÃŽn nume sunt ÃŽnlocuite cu data și ora ÃŽn formatul YYYYMMDD și HHMMSS. În fișierele batch Windows, trebuie să dublați caracterul \`%\`, de exemplu, result\-%%D.log. Pentru a utiliza \`>>\`, trebuie să ÃŽnchideți numele ÃŽntre ghilimele, de exemplu, \`\[dq]>>result.log\[dq]\`. Pentru a scoate jurnalul la ieșirea standard sau la eroarea standard, puteți utiliza \`\[dq]>&1\[dq]\` și \`\[dq]>&2\[dq]\`, respectiv. Vedeți fișierul snapraid_log.txt sau pagina de manual pentru descrieri ale etichetelor jurnalului. .TP .B \-L, \-\-error\-limit NUMBER Setează o nouă limită de erori ÃŽnainte de a opri execuția. În mod implicit, SnapRAID se oprește dacă ÃŽntÃĸlnește mai mult de 100 de erori de intrare/ieșire, indicÃĸnd că un disc probabil eșuează. Această opțiune afectează \`sync\` și \`scrub\`, cărora li se permite să continue după primul set de erori de disc pentru a ÃŽncerca să ÃŽČ™i finalizeze operațiunile. Cu toate acestea, \`check\` și \`fix\` se opresc ÃŽntotdeauna la prima eroare. .TP .B \-S, \-\-start BLKSTART Începe procesarea de la numărul de bloc specificat. Acest lucru poate fi util pentru a reÃŽncerca verificarea sau repararea anumitor blocuri ÃŽn cazul unui disc deteriorat. Această opțiune este ÃŽn principal pentru recuperarea manuală avansată. .TP .B \-B, \-\-count BLKCOUNT Procesează doar numărul specificat de blocuri. Această opțiune este ÃŽn principal pentru recuperarea manuală avansată. .TP .B \-C, \-\-gen\-conf CONTENT Generează un fișier de configurare fictiv dintr\-un fișier de conținut existent. Fișierul de configurare este scris la ieșirea standard și nu suprascrie unul existent. Acest fișier de configurare conține și informațiile necesare pentru a reconstrui punctele de montare a discului ÃŽn cazul ÃŽn care pierdeți ÃŽntregul sistem. .TP .B \-v, \-\-verbose Tipărește mai multe informații pe ecran. Dacă este specificat o dată, tipărește fișierele excluse și statistici suplimentare. Această opțiune nu are niciun efect asupra fișierelor jurnal. .TP .B \-q, \-\-quiet Tipărește mai puține informații pe ecran. Dacă este specificat o dată, elimină bara de progres; de două ori, operațiunile ÃŽn curs; de trei ori, mesajele info ; de patru ori, mesajele de stare. Erorile fatale sunt ÃŽntotdeauna tipărite pe ecran. Această opțiune nu are niciun efect asupra fișierelor jurnal. .TP .B \-H, \-\-help Tipărește un ecran de ajutor scurt. .TP .B \-V, \-\-version Tipărește versiunea programului. .SH CONFIGURARE SnapRAID necesită un fișier de configurare pentru a ști unde se află matricea dvs. de discuri și unde să stocheze informațiile de paritate. .PP În Unix, utilizează fișierul \`/usr/local/etc/snapraid.conf\` dacă există, altfel \`/etc/snapraid.conf\`. În Windows, utilizează fișierul \`snapraid.conf\` din același director ca \`snapraid.exe\`. .PP Trebuie să conțină următoarele opțiuni (sensibile la majuscule/minuscule): .SS parity FILE [,FILE] ... Definește fișierele de utilizat pentru a stoca informațiile de paritate. Paritatea permite protecția ÃŽmpotriva unei singure defecțiuni de disc, similar cu RAID5. .PP Puteți specifica mai multe fișiere, care trebuie să fie pe discuri diferite. CÃĸnd un fișier nu mai poate crește, este utilizat următorul. Spațiul total disponibil trebuie să fie cel puțin la fel de mare ca cel mai mare disc de date din matrice. .PP Puteți adăuga fișiere de paritate suplimentare mai tÃĸrziu, dar nu le puteți reordona sau elimina. .PP Păstrarea discurilor de paritate rezervate pentru paritate asigură că nu devin fragmentate, ÃŽmbunătățind performanța. .PP În Windows, 256 MB sunt lăsați neutilizați pe fiecare disc pentru a evita avertismentul despre discuri pline. .PP Această opțiune este obligatorie și poate fi utilizată o singură dată. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... Definește fișierele de utilizat pentru a stoca informații de paritate suplimentare. .PP Pentru fiecare nivel de paritate specificat, este activat un nivel suplimentar de protecție: .PD 0 .IP \(bu 2\-parity activează paritatea dublă RAID6. .IP \(bu 3\-parity activează paritatea triplă. .IP \(bu 4\-parity activează paritatea quad (patru). .IP \(bu 5\-parity activează paritatea penta (cinci). .IP \(bu 6\-parity activează paritatea hexa (șase). .PD .PP Fiecare nivel de paritate necesită prezența tuturor nivelurilor de paritate anterioare. .PP Aceleași considerații ca pentru opțiunea \`parity\` se aplică. .PP Aceste opțiuni sunt opționale și pot fi utilizate o singură dată. .SS z\-parity FILE [,FILE] ... Definește un fișier și un format alternativ pentru a stoca paritatea triplă. .PP Această opțiune este o alternativă la \`3\-parity\`, destinată ÃŽn primul rÃĸnd CPU\-urilor low\-end precum ARM sau AMD Phenom, Athlon și Opteron care nu suportă setul de instrucțiuni SSSE3. În astfel de cazuri, oferă o performanță mai bună. .PP Acest format este similar, dar mai rapid decÃĸt cel utilizat de ZFS RAIDZ3. Ca și ZFS, nu funcționează dincolo de paritatea triplă. .PP CÃĸnd utilizați \`3\-parity\`, veți fi avertizați dacă este recomandat să utilizați formatul \`z\-parity\` pentru ÃŽmbunătățirea performanței. .PP Este posibil să convertiți de la un format la altul ajustÃĸnd fișierul de configurare cu fișierul z\-parity sau 3\-parity dorit și utilizÃĸnd \`fix\` pentru a\-l recrea. .SS content FILE Definește fișierul de utilizat pentru a stoca lista și sumele de control (checksums) a tuturor fișierelor prezente ÃŽn matricea dvs. de discuri. .PP Poate fi plasat pe un disc utilizat pentru date, paritate sau orice alt disc disponibil. Dacă utilizați un disc de date, acest fișier este automat exclus din procesul \`sync\`. .PP Această opțiune este obligatorie și poate fi utilizată de mai multe ori pentru a salva mai multe copii ale aceluiași fișier. .PP Trebuie să stocați cel puțin o copie pentru fiecare disc de paritate utilizat plus unul. Utilizarea de copii suplimentare nu dăunează. .SS data NAME DIR Definește numele și punctul de montare al discurilor de date din matrice. NAME este utilizat pentru a identifica discul și trebuie să fie unic. DIR este punctul de montare al discului ÃŽn sistemul de fișiere. .PP Puteți schimba punctul de montare după cum este necesar, atÃĸta timp cÃĸt păstrați NAME fix. .PP Ar trebui să utilizați o opțiune pentru fiecare disc de date din matrice. .PP Puteți redenumi un disc mai tÃĸrziu schimbÃĸnd NAME direct ÃŽn fișierul de configurare și apoi rulÃĸnd o comandă \`sync\`. În cazul redenumirii, asocierea se face utilizÃĸnd UUID\-ul stocat al discurilor. .SS extra NAME DIR Definește numele și punctul de montare al discurilor suplimentare care vor fi monitorizate cu comenzile \`smart\` și \`probe\`. .PP Acest lucru este util pentru monitorizarea discurilor care nu fac parte din matrice, dar sunt necesare pentru funcționarea sistemului, cum ar fi discul de pornire. .PP Rețineți că astfel de discuri nu sunt afectate de comenzile \`up\` și \`down\` deoarece se așteaptă ca acestea să se rotească mereu. .SS nohidden Exclude toate fișierele și directoarele ascunse. În Unix, fișierele ascunse sunt cele care ÃŽncep cu \`.\`. În Windows, sunt cele cu atributul ascuns. .SS exclude/include PATTERN Definește modelele de fișiere sau directoare de exclus sau inclus ÃŽn procesul de sincronizare. Toate modelele sunt procesate ÃŽn ordinea specificată. .PP Dacă primul model care se potrivește este un \`exclude\`, fișierul este exclus. Dacă este un \`include\`, fișierul este inclus. Dacă niciun model nu se potrivește, fișierul este exclus dacă ultimul model specificat este un \`include\`, sau inclus dacă ultimul model specificat este un \`exclude\`. .PP Vedeți secțiunea PATTERN pentru mai multe detalii despre specificațiile modelului. .PP Această opțiune poate fi utilizată de mai multe ori. .SS blocksize SIZE_IN_KIBIBYTES Definește dimensiunea de bază a blocului ÃŽn kibibytes pentru paritate. Un kibibyte este 1024 de octeți. .PP Dimensiunea implicită a blocului este 256, care ar trebui să funcționeze pentru majoritatea cazurilor. .PP ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu schimbați această valoare. Pentru a schimba această valoare ÃŽn viitor, va trebui să recreați ÃŽntreaga paritate! .PP Un motiv pentru a utiliza o dimensiune de bloc diferită este dacă aveți multe fișiere mici, de ordinul milioanelor. .PP Pentru fiecare fișier, chiar dacă are doar cÃĸțiva octeți, este alocat un bloc ÃŽntreg de paritate, iar cu multe fișiere, acest lucru poate duce la un spațiu de paritate neutilizat semnificativ. CÃĸnd umpleți complet discul de paritate, nu vi se permite să adăugați mai multe fișiere pe discurile de date. Cu toate acestea, paritatea irosită nu se acumulează pe discurile de date. Spațiul irosit rezultat dintr\-un număr mare de fișiere pe un disc de date limitează doar cantitatea de date de pe acel disc de date, nu pe celelalte. .PP Ca o aproximare, puteți presupune că jumătate din dimensiunea blocului este irosită pentru fiecare fișier. De exemplu, cu 100.000 de fișiere și o dimensiune de bloc de 256 KiB, veți irosi 12,8 GB de paritate, ceea ce poate duce la 12,8 GB mai puțin spațiu disponibil pe discul de date. .PP Puteți verifica cantitatea de spațiu irosit pe fiecare disc utilizÃĸnd \`status\`. Aceasta este cantitatea de spațiu pe care trebuie să o lăsați liberă pe discurile de date sau să o utilizați pentru fișiere care nu sunt incluse ÃŽn matrice. Dacă această valoare este negativă, ÃŽnseamnă că sunteți aproape de a umple paritatea și reprezintă spațiul pe care ÃŽl puteți irosi ÃŽncă. .PP Pentru a evita această problemă, puteți utiliza o partiție mai mare pentru paritate. De exemplu, dacă partiția de paritate este cu 12,8 GB mai mare decÃĸt discurile de date, aveți suficient spațiu suplimentar pentru a gestiona pÃĸnă la 100.000 de fișiere pe fiecare disc de date fără niciun spațiu irosit. .PP Un truc pentru a obține o partiție de paritate mai mare ÃŽn Linux este să o formatați cu comanda: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Acest lucru duce la aproximativ 1,5% spațiu suplimentar, aproximativ 60 GB pentru un disc de 4 TB, ceea ce permite aproximativ 460.000 de fișiere pe fiecare disc de date fără niciun spațiu irosit. .SS hashsize SIZE_IN_BYTES Definește dimensiunea hash\-ului ÃŽn octeți pentru blocurile salvate. .PP Dimensiunea implicită a hash\-ului este de 16 octeți (128 de biți), care ar trebui să funcționeze pentru majoritatea cazurilor. .PP ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu schimbați această valoare. Pentru a schimba această valoare ÃŽn viitor, va trebui să recreați ÃŽntreaga paritate! .PP Un motiv pentru a utiliza o dimensiune de hash diferită este dacă sistemul dvs. are memorie limitată. Ca regulă generală, SnapRAID necesită de obicei 1 GiB de RAM pentru fiecare 16 TB de date din matrice. .PP Mai exact, pentru a stoca hash\-urile datelor, SnapRAID necesită aproximativ TS*(1+HS)/BS octeți de RAM, unde TS este dimensiunea totală ÃŽn octeți a matricei dvs. de discuri, BS este dimensiunea blocului ÃŽn octeți, iar HS este dimensiunea hash\-ului ÃŽn octeți. .PP De exemplu, cu 8 discuri de 4 TB, o dimensiune de bloc de 256 KiB (1 KiB = 1024 octeți) și o dimensiune de hash de 16, obțineți: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB .PD 0 .PD .PP TrecÃĸnd la o dimensiune de hash de 8, obțineți: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB .PD 0 .PD .PP TrecÃĸnd la o dimensiune de bloc de 512, obțineți: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB .PD 0 .PD .PP TrecÃĸnd la ambele, o dimensiune de hash de 8 și o dimensiune de bloc de 512, obțineți: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES Salvează automat starea la sincronizare sau verificare după cantitatea specificată de GB procesați. Această opțiune este utilă pentru a evita repornirea comenzilor \`sync\` lungi de la zero dacă sunt ÃŽntrerupte de o cădere a mașinii sau de orice alt eveniment. .SS temp_limit TEMPERATURE_CELSIUS Setează temperatura maximă permisă a discului ÃŽn Celsius. CÃĸnd este specificată, SnapRAID verifică periodic temperatura tuturor discurilor utilizÃĸnd instrumentul smartctl. Temperaturile curente ale discurilor sunt afișate ÃŽn timp ce SnapRAID funcționează. Dacă un disc depășește această limită, toate operațiunile se opresc, iar discurile sunt oprite (puse ÃŽn standby) pentru durata definită de opțiunea \`temp_sleep\`. După perioada de așteptare, operațiunile reiau, putÃĸnd ÃŽntrerupe din nou dacă limita de temperatură este atinsă ÃŽncă o dată. .PP În timpul funcționării, SnapRAID analizează și curba de ÃŽncălzire a fiecărui disc și estimează temperatura constantă pe termen lung pe care se așteaptă să o atingă dacă activitatea continuă. Estimarea este efectuată numai după ce temperatura discului a crescut de patru ori, asigurÃĸndu\-se că sunt disponibile suficiente puncte de date pentru a stabili o tendință fiabilă. Această temperatură constantă prezisă este afișată ÃŽntre paranteze lÃĸngă valoarea curentă și ajută la evaluarea dacă răcirea sistemului este adecvată. Această temperatură estimată este doar ÃŽn scop informativ și nu are niciun efect asupra comportamentului SnapRAID. Acțiunile programului se bazează exclusiv pe temperaturile reale măsurate ale discurilor. .PP Pentru a efectua această analiză, SnapRAID are nevoie de o referință pentru temperatura sistemului. Încearcă mai ÃŽntÃĸi să o citească de la senzorii hardware disponibili. Dacă nu poate fi accesat niciun senzor de sistem, utilizează cea mai scăzută temperatură a discului măsurată la ÃŽnceputul rulării ca referință de rezervă. .PP În mod normal, SnapRAID arată doar temperatura celui mai fierbinte disc. Pentru a afișa temperatura tuturor discurilor, utilizați opțiunea \-A sau \-\-stats. .SS temp_sleep TIME_IN_MINUTES Setează timpul de așteptare (standby), ÃŽn minute, cÃĸnd limita de temperatură este atinsă. În această perioadă, discurile rămÃĸn oprite. Valoarea implicită este 5 minute. .SS pool DIR Definește directorul de pooling unde este creată vizualizarea virtuală a matricei de discuri utilizÃĸnd comanda \`pool\`. .PP Directorul trebuie să existe deja. .SS share UNC_DIR Definește calea UNC Windows necesară pentru a accesa discurile de la distanță. .PP Dacă această opțiune este specificată, link\-urile simbolice create ÃŽn directorul pool utilizează această cale UNC pentru a accesa discurile. Fără această opțiune, link\-urile simbolice generate utilizează doar căi locale, ceea ce nu permite partajarea directorului pool peste rețea. .PP Link\-urile simbolice sunt formate utilizÃĸnd calea UNC specificată, adăugÃĸnd numele discului specificat ÃŽn opțiunea \`data\` și, ÃŽn final, adăugÃĸnd directorul și numele fișierului. .PP Această opțiune este necesară doar pentru Windows. .SS smartctl DISK/PARITY OPTIONS... Definește opțiuni smartctl personalizate pentru a obține atributele SMART pentru fiecare disc. Acest lucru poate fi necesar pentru controlerele RAID și unele discuri USB care nu pot fi detectate automat. Substituția %s este ÃŽnlocuită de numele dispozitivului, dar este opțională pentru dispozitivele fixe, cum ar fi controlerele RAID. .PP DISK este același nume de disc specificat ÃŽn opțiunea \`data\`. PARITY este unul dintre numele de paritate: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` sau \`z\-parity\`. .PP În OPȚIUNILE specificate, șirul \`%s\` este ÃŽnlocuit de numele dispozitivului. Pentru controlerele RAID, dispozitivul este probabil fix și este posibil să nu fie nevoie să utilizați \`%s\`. .PP Consultați documentația smartmontools pentru opțiuni posibile: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP De exemplu: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignoră atributul SMART specificat la calcularea probabilității de eșec a discului. Această opțiune este utilă dacă un disc raportează valori neobișnuite sau ÃŽnșelătoare pentru un anumit atribut. .PP DISK este același nume de disc specificat ÃŽn opțiunea \`data\`. PARITY este unul dintre numele de paritate: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` sau \`z\-parity\`. Valoarea specială * poate fi utilizată pentru a ignora atributul pe toate discurile. .PP De exemplu, pentru a ignora atributul \`Current Pending Sector Count\` pe toate discurile: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Pentru a\-l ignora doar pe primul disc de paritate: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Exemple Un exemplu de configurare tipică pentru Unix este: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Un exemplu de configurare tipică pentru Windows este: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH MODEL (PATTERN) Modelele oferă o modalitate flexibilă de a filtra fișierele pentru includere sau excludere. Folosind caractere de tip globbing, puteți defini reguli care să se potrivească cu nume de fișiere specifice sau cu structuri ÃŽntregi de directoare fără a lista manual fiecare cale. .PP Semnul ÃŽntrebării \`?\` se potrivește cu orice caracter unic, cu excepția separatorului de directoare. Acest lucru ÃŽl face util pentru potrivirea numelor de fișiere cu caractere variabile, păstrÃĸnd ÃŽn același timp modelul limitat la un singur nivel de director. .PP Asteriscul simplu \`*\` se potrivește cu orice secvență de caractere, dar, la fel ca semnul ÃŽntrebării, nu trece niciodată de limitele directoarelor. Se oprește la slash\-ul ÃŽnainte, ceea ce ÃŽl face potrivit pentru potrivirea ÃŽn cadrul unei singure componente a căii. Acesta este comportamentul standard al metacaracterelor, familiar din shell globbing. .PP Asteriscul dublu \`**\` este mai puternic, se potrivește cu orice secvență de caractere, inclusiv separatori de directoare. Acest lucru permite modelelor să se potrivească pe mai multe niveluri de directoare. CÃĸnd \`**\` apare inserat direct ÃŽntr\-un model, se poate potrivi cu zero sau mai multe caractere, inclusiv slash\-uri ÃŽntre textul literal ÃŽnconjurător. .PP Cea mai importantă utilizare a lui \`**\` este ÃŽn forma specială \`/**/\`. Aceasta se potrivește cu zero sau mai multe niveluri complete de directoare, făcÃĸnd posibilă potrivirea fișierelor la orice adÃĸncime ÃŽntr\-un arbore de directoare fără a cunoaște structura exactă a căii. De exemplu, modelul \`src/**/main.js\` se potrivește cu \`src/main.js\` (sărind peste zero directoare), \`src/ui/main.js\` (sărind peste un director) și \`src/ui/components/main.js\` (sărind peste două directoare). .PP Clasele de caractere care utilizează paranteze pătrate \`[]\` se potrivesc cu un singur caracter dintr\-un set sau interval specificat. La fel ca și celelalte modele de un singur caracter, acestea nu se potrivesc cu separatorii de directoare. Clasele suportă intervale și negarea folosind un semn de exclamare. .PP Distincția fundamentală de reținut este că \`*\`, \`?\` și clasele de caractere respectă toate limitele directoarelor și se potrivesc doar ÃŽn cadrul unei singure componente a căii, ÃŽn timp ce \`**\` este singurul model care se poate potrivi peste separatorii de directoare. .PP Există patru tipuri diferite de modele: .TP .B FILE Selectează orice fișier cu numele FILE. Acest model se aplică numai fișierelor, nu și directoarelor. .TP .B DIR/ Selectează orice director cu numele DIR și tot ce se află ÃŽn interior. Acest model se aplică numai directoarelor, nu și fișierelor. .TP .B /PATH/FILE Selectează calea exactă a fișierului specificat. Acest model se aplică numai fișierelor, nu și directoarelor. .TP .B /PATH/DIR/ Selectează calea exactă a directorului specificat și tot ce se află ÃŽn interior. Acest model se aplică numai directoarelor, nu și fișierelor. .PP CÃĸnd specificați o cale absolută care ÃŽncepe cu /, aceasta este aplicată la directorul rădăcină al matricei, nu la directorul rădăcină al sistemului de fișiere local. .PP În Windows, puteți utiliza backslash\-ul \\ ÃŽn loc de slash\-ul /. Directoarele de sistem Windows, joncțiunile, punctele de montare și alte directoare speciale Windows sunt tratate ca fișiere, ceea ce ÃŽnseamnă că pentru a le exclude, trebuie să utilizați o regulă de fișier, nu una de director. .PP Dacă numele fișierului conține un caracter \`*\`, \`?\`, \`[\`, sau \`]\`, trebuie să ÃŽl escape\-ați pentru a evita să fie interpretat ca un caracter de globbing. În Unix, caracterul escape este \`\\\`; ÃŽn Windows, este \`^\`. CÃĸnd modelul este pe linia de comandă, trebuie să dublați caracterul escape pentru a evita ca acesta să fie interpretat de shell\-ul de comandă. .PP În fișierul de configurare, puteți utiliza diferite strategii pentru a filtra fișierele de procesat. Abordarea cea mai simplă este să utilizați doar reguli \`exclude\` pentru a elimina toate fișierele și directoarele pe care nu doriți să le procesați. De exemplu: .PP .RS 4 # Exclude orice fișier numit \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exclude directorul rădăcină \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Exclude orice subdirector numit \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP Abordarea opusă este să definiți doar fișierele pe care doriți să le procesați, utilizÃĸnd doar reguli \`include\`. De exemplu: .PP .RS 4 # Include doar unele directoare .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Abordarea finală este de a amesteca regulile \`exclude\` și \`include\`. În acest caz, ordinea regulilor este importantă. Regulile anterioare au precedență față de cele ulterioare. Pentru a simplifica, puteți lista toate regulile \`exclude\` mai ÃŽntÃĸi și apoi toate regulile \`include\`. De exemplu: .PP .RS 4 # Exclude orice fișier numit \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exclude orice subdirector numit \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Include doar unele directoare .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Pe linia de comandă, utilizÃĸnd opțiunea \-f, puteți utiliza doar modele \`include\`. De exemplu: .PP .RS 4 # Verifică doar fișierele .mp3. .PD 0 .PP .PD # În Unix, utilizați ghilimele pentru a evita expansiunea globbing de către shell. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP În Unix, cÃĸnd utilizați caractere globbing pe linia de comandă, trebuie să le citați pentru a ÃŽmpiedica shell\-ul să le extindă. .SH FIșIERE DE IGNORAT (IGNORE FILE) Pe lÃĸngă regulile globale din fișierul de configurare, puteți plasa fișiere \`.snapraidignore\` ÃŽn orice director din array pentru a defini reguli de excludere descentralizate. .PP Regulile definite ÃŽn \`.snapraidignore\` sunt aplicate după regulile din fișierul de configurare. Acest lucru ÃŽnseamnă că au o prioritate mai mare și pot fi utilizate pentru a exclude fișiere care au fost incluse anterior de configurația globală. Efectiv, dacă o regulă locală se potrivește, fișierul este exclus indiferent de setările globale de includere. .PP Logica modelelor ÃŽn \`.snapraidignore\` oglindește configurația globală, dar ancorează modelele de directorul ÃŽn care se află fișierul: .TP .B FILE Selectează orice fișier numit FILE ÃŽn acest director sau mai jos. Acesta urmează aceleași reguli de globbing ca modelul global. .TP .B DIR/ Selectează orice director numit DIR și tot ce se află ÃŽn interior, aflat ÃŽn acest director sau mai jos. .TP .B /PATH/FILE Selectează fișierul exact specificat raportat la locația fișierului \`.snapraidignore\`. .TP .B /PATH/DIR/ Selectează directorul exact specificat și tot ce se află ÃŽn interior, raportat la locația fișierului \`.snapraidignore\`. .PP Spre deosebire de configurația globală, fișierele \`.snapraidignore\` suportă doar reguli de excludere; nu puteți utiliza modele de \`include\` sau negația (!). .PP De exemplu, dacă aveți un \`.snapraidignore\` ÃŽn \`/mnt/disk1/projects/\`: .PP .RS 4 # Exclude DOAR /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Exclude orice director numit \`build\` ÃŽn interiorul projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Exclude orice fișier .tmp ÃŽn interiorul projects/ sau subfolderele sale .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONțINUT (CONTENT) SnapRAID stochează lista și sumele de control (checksums) ale fișierelor dvs. ÃŽn fișierul de conținut. .PP Este un fișier binar care listează toate fișierele prezente ÃŽn matricea dvs. de discuri, ÃŽmpreună cu toate sumele de control pentru a le verifica integritatea. .PP Acest fișier este citit și scris de comenzile \`sync\` și \`scrub\` și citit de comenzile \`fix\`, \`check\` și \`status\`. .SH PARITATE (PARITY) SnapRAID stochează informațiile de paritate ale matricei dvs. ÃŽn fișierele de paritate. .PP Acestea sunt fișiere binare care conțin paritatea calculată a tuturor blocurilor definite ÃŽn fișierul de \`content\`. .PP Aceste fișiere sunt citite și scrise de comenzile \`sync\` și \`fix\` și doar citite de comenzile \`scrub\` și \`check\`. .SH CODARE (ENCODING) SnapRAID ÃŽn Unix ignoră orice codare. Citește și stochează numele fișierelor cu aceeași codare utilizată de sistemul de fișiere. .PP În Windows, toate numele citite din sistemul de fișiere sunt convertite și procesate ÃŽn format UTF\-8. .PP Pentru a avea numele fișierelor tipărite corect, trebuie să setați consola Windows ÃŽn modul UTF\-8 cu comanda \`chcp 65001\` și să utilizați un font TrueType precum \`Lucida Console\` ca font al consolei. Acest lucru afectează doar numele de fișiere tipărite; dacă redirecționați ieșirea consolei către un fișier, fișierul rezultat este ÃŽntotdeauna ÃŽn format UTF\-8. .SH DREPT DE AUTOR (COPYRIGHT) Acest fișier este Copyright (C) 2025 Andrea Mazzoleni .SH VEZI șI (SEE ALSO) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ro.d000066400000000000000000002114471522717156100164210ustar00rootroot00000000000000Name{number} snapraid - SnapRAID Backup pentru Matrici de Discuri Sintaxă :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Descriere SnapRAID este un program de backup conceput pentru matrici de discuri, care stochează informații de paritate pentru recuperarea datelor ÃŽn cazul a pÃĸnă la șase defecte de disc. Destinat ÃŽn principal centrelor media de acasă cu fișiere mari, care se schimbă rar, SnapRAID oferă cÃĸteva caracteristici: * Puteți utiliza discuri deja pline cu fișiere fără nevoia de a le reformat, accesÃĸndu-le ca de obicei. * Toate datele dvs. sunt hash-uite pentru a asigura integritatea datelor și a preveni corupția silențioasă. * CÃĸnd numărul de discuri defecte depășește numărul de parități, pierderea de date este limitată la discurile afectate; datele de pe celelalte discuri rămÃĸn accesibile. * Dacă ștergeți accidental fișiere de pe un disc, recuperarea este posibilă. * Discurile pot avea dimensiuni diferite. * Puteți adăuga discuri ÃŽn orice moment. * SnapRAID nu vă blochează datele; puteți ÃŽnceta să-l utilizați oricÃĸnd fără a reforma sau muta date. * Pentru a accesa un fișier, este necesar să se rotească doar un singur disc, economisind energie și reducÃĸnd zgomotul. Pentru mai multe informații, vă rugăm să vizitați site-ul oficial SnapRAID: :https://www.snapraid.it/ Limitări SnapRAID este un hibrid ÃŽntre un program RAID și unul de backup, care urmărește să combine cele mai bune beneficii ale ambelor. Cu toate acestea, are unele limitări pe care ar trebui să le luați ÃŽn considerare ÃŽnainte de a-l utiliza. Principala limitare este că, dacă un disc se defectează și nu ați făcut recent o sincronizare, este posibil să nu puteți recupera complet. Mai exact, este posibil să nu puteți recupera pÃĸnă la dimensiunea fișierelor modificate sau șterse de la ultima operațiune de sincronizare. Acest lucru se ÃŽntÃĸmplă chiar dacă fișierele modificate sau șterse nu sunt pe discul defect. Acesta este motivul pentru care SnapRAID este mai potrivit pentru date care se schimbă rar. Pe de altă parte, fișierele nou adăugate nu ÃŽmpiedică recuperarea fișierelor deja existente. Veți pierde doar fișierele adăugate recent dacă acestea se află pe discul defect. Alte limitări ale SnapRAID sunt: * Cu SnapRAID, aveți ÃŽn continuare sisteme de fișiere separate pentru fiecare disc. Cu RAID, obțineți un singur sistem de fișiere mare. * SnapRAID nu face striping de date. Cu RAID, obțineți un spor de viteză prin striping. * SnapRAID nu suportă recuperarea ÃŽn timp real. Cu RAID, nu trebuie să vă opriți din lucru atunci cÃĸnd un disc se defectează. * SnapRAID poate recupera date doar dintr-un număr limitat de defecte de disc. Cu un backup, puteți recupera dintr-o defecțiune completă a ÃŽntregii matrici de discuri. * Sunt salvate doar numele fișierelor, mărcile temporale, symlink-urile și hardlink-urile. Permisiunile, proprietarul și atributele extinse nu sunt salvate. Noțiuni de Bază Pentru a utiliza SnapRAID, trebuie mai ÃŽntÃĸi să selectați un disc ÃŽn matricea dvs. de discuri pentru a-l dedica informațiilor de `paritate`. Cu un singur disc pentru paritate, veți putea recupera dintr-o singură defecțiune de disc, similar cu RAID5. Dacă doriți să recuperați din mai multe defecțiuni de disc, similar cu RAID6, trebuie să rezervați discuri suplimentare pentru paritate. Fiecare disc de paritate suplimentar permite recuperarea dintr-o defecțiune de disc ÃŽn plus. Ca discuri de paritate, trebuie să le alegeți pe cele mai mari din matrice, deoarece informațiile de paritate pot crește pÃĸnă la dimensiunea celui mai mare disc de date din matrice. Aceste discuri vor fi dedicate stocării fișierelor de `paritate`. Nu ar trebui să stocați datele dvs. pe ele. Apoi, trebuie să definiți discurile de `date` pe care doriți să le protejați cu SnapRAID. Protecția este mai eficientă dacă aceste discuri conțin date care se schimbă rar. Din acest motiv, este mai bine să NU includeți discul C:\ al Windows sau directoarele Unix /home, /var și /tmp. Lista de fișiere este salvată ÃŽn fișierele de `conținut`, de obicei stocate pe discurile de date, de paritate sau de boot. Acest fișier conține detaliile backup-ului dvs., inclusiv toate sumele de control (checksums) pentru a-i verifica integritatea. Fișierul de `conținut` este stocat ÃŽn mai multe copii, iar fiecare copie trebuie să fie pe un disc diferit pentru a se asigura că, chiar și ÃŽn cazul a multiple defecte de disc, cel puțin o copie este disponibilă. De exemplu, să presupunem că sunteți interesați doar de un singur nivel de paritate de protecție și discurile dvs. se află la: :/mnt/diskp <- discul selectat pentru paritate :/mnt/disk1 <- primul disc de protejat :/mnt/disk2 <- al doilea disc de protejat :/mnt/disk3 <- al treilea disc de protejat Trebuie să creați fișierul de configurare /etc/snapraid.conf cu următoarele opțiuni: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Dacă sunteți pe Windows, ar trebui să utilizați formatul de cale Windows, cu litere de unitate și backslash-uri ÃŽn loc de slash-uri. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Dacă aveți multe discuri și rămÃĸneți fără litere de unitate, puteți monta discurile direct ÃŽn subfoldere. Vedeți: :https://www.google.com/search?q=Windows+mount+point În acest moment, sunteți gata să rulați comanda `sync` pentru a construi informațiile de paritate. :snapraid sync Acest proces poate dura cÃĸteva ore prima dată, ÃŽn funcție de dimensiunea datelor deja prezente pe discuri. Dacă discurile sunt goale, procesul este imediat. Îl puteți opri oricÃĸnd apăsÃĸnd Ctrl+C, iar la următoarea rulare, va relua de unde a fost ÃŽntrerupt. CÃĸnd această comandă se finalizează, datele dvs. sunt ÎN SIGURANȚĂ. Acum puteți ÃŽncepe să utilizați matricea după cum doriți și să actualizați periodic informațiile de paritate rulÃĸnd comanda `sync`. Scrubbing (Verificare) Pentru a verifica periodic datele și paritatea pentru erori, puteți rula comanda `scrub`. :snapraid scrub Această comandă compară datele din matricea dvs. cu hash-ul calculat ÃŽn timpul comenzii `sync` pentru a verifica integritatea. Fiecare rulare a comenzii verifică aproximativ 8% din matrice, excluzÃĸnd datele deja verificate ÃŽn ultimele 10 zile. Puteți utiliza opțiunea -p, --plan pentru a specifica o cantitate diferită și opțiunea -o, --older-than pentru a specifica o vÃĸrstă diferită ÃŽn zile. De exemplu, pentru a verifica 5% din matrice pentru blocuri mai vechi de 20 de zile, utilizați: :snapraid -p 5 -o 20 scrub Dacă se găsesc erori silențioase sau de intrare/ieșire ÃŽn timpul procesului, blocurile corespunzătoare sunt marcate ca fiind defecte ÃŽn fișierul de `conținut` și listate ÃŽn comanda `status`. :snapraid status Pentru a le repara, puteți utiliza comanda `fix`, filtrÃĸnd pentru blocuri defecte cu opțiunea -e, --filter-error: :snapraid -e fix La următorul `scrub`, erorile vor dispărea din raportul `status` dacă sunt ÃŽntr-adevăr reparate. Pentru a face mai rapid, puteți utiliza -p bad pentru a verifica doar blocurile marcate ca defecte. :snapraid -p bad scrub Rularea `scrub` pe o matrice nesincronizată poate raporta erori cauzate de fișiere eliminate sau modificate. Aceste erori sunt raportate ÃŽn ieșirea `scrub`, dar blocurile aferente nu sunt marcate ca defecte. Pooling (Agregare) Notă: Funcționalitatea de pooling descrisă mai jos a fost ÃŽnlocuită de instrumentul mergerfs, care este acum opțiunea recomandată pentru utilizatorii Linux ÃŽn comunitatea SnapRAID. Mergefs oferă o modalitate mai flexibilă și eficientă de a agrega mai multe discuri ÃŽntr-un singur punct de montare unificat, permițÃĸnd accesul neÃŽntrerupt la fișiere pe toată matricea dvs. fără a se baza pe link-uri simbolice. Se integrează bine cu SnapRAID pentru protecția parității și este utilizat ÃŽn mod obișnuit ÃŽn configurații precum OpenMediaVault (OMV) sau configurații NAS personalizate. Pentru a avea toate fișierele din matricea dvs. afișate ÃŽn același arbore de directoare, puteți activa funcționalitatea de `pooling`. Aceasta creează o vizualizare virtuală doar ÃŽn citire a tuturor fișierelor din matricea dvs. folosind link-uri simbolice. Puteți configura directorul de `pooling` ÃŽn fișierul de configurare cu: :pool /pool sau, dacă sunteți pe Windows, cu: :pool C:\pool și apoi rulați comanda `pool` pentru a crea sau actualiza vizualizarea virtuală. :snapraid pool Dacă utilizați o platformă Unix și doriți să partajați acest director peste rețea către mașini Windows sau Unix, ar trebui să adăugați următoarele opțiuni la /etc/samba/smb.conf: :# În secțiunea global a smb.conf :unix extensions = no :# În secțiunea share a smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes În Windows, partajarea link-urilor simbolice peste o rețea necesită ca clienții să le rezolve de la distanță. Pentru a permite acest lucru, pe lÃĸngă partajarea directorului pool, trebuie să partajați și toate discurile ÃŽn mod independent, folosind numele discurilor definite ÃŽn fișierul de configurare ca puncte de partajare. De asemenea, trebuie să specificați ÃŽn opțiunea `share` din fișierul de configurare calea UNC Windows pe care clienții la distanță trebuie să o folosească pentru a accesa aceste discuri partajate. De exemplu, operÃĸnd de pe un server numit `darkstar`, puteți utiliza opțiunile: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar și partajați următoarele directoare peste rețea: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array pentru a permite clienților la distanță să acceseze toate fișierele la \\darkstar\pool. De asemenea, ar putea fi necesar să configurați clienții la distanță pentru a permite accesul la symlink-uri la distanță cu comanda: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting (Anulare Ștergere) SnapRAID funcționează mai mult ca un program de backup decÃĸt un sistem RAID și poate fi folosit pentru a restaura sau anula ștergerea fișierelor la starea lor anterioară utilizÃĸnd opțiunea -f, --filter: :snapraid fix -f FILE sau pentru un director: :snapraid fix -f DIR/ De asemenea, ÃŽl puteți utiliza pentru a recupera doar fișiere șterse accidental ÃŽn interiorul unui director folosind opțiunea -m, --filter-missing, care restaurează doar fișierele lipsă, lăsÃĸndu-le pe toate celelalte neatinse. :snapraid fix -m -f DIR/ Sau pentru a recupera toate fișierele șterse de pe toate unitățile cu: :snapraid fix -m Recuperare Cel mai rău s-a ÃŽntÃĸmplat și ați pierdut unul sau mai multe discuri! NU INTRAȚI ÎN PANICĂ! Veți putea să le recuperați! Primul lucru pe care trebuie să-l faceți este să evitați modificările ulterioare la matricea dvs. de discuri. Dezactivați orice conexiuni la distanță la aceasta și orice procese programate, inclusiv orice sincronizare sau verificare SnapRAID programată pe timp de noapte. Apoi continuați cu următorii pași. PASUL 1 -> Reconfigurare Aveți nevoie de spațiu pentru a recupera, ideal pe discuri de rezervă suplimentare, dar un disc USB extern sau un disc la distanță vor fi suficiente. Modificați fișierul de configurare SnapRAID pentru a face ca opțiunea `data` sau `parity` a discului defect să indice o locație cu suficient spațiu gol pentru a recupera fișierele. De exemplu, dacă discul `d1` a eșuat, schimbați de la: :data d1 /mnt/disk1/ la: :data d1 /mnt/new_spare_disk/ Dacă discul de recuperat este un disc de paritate, actualizați opțiunea `parity` corespunzătoare. Dacă aveți mai multe discuri defecte, actualizați toate opțiunile lor de configurare. PASUL 2 -> Reparare (Fix) Rulați comanda fix, stocÃĸnd jurnalul ÃŽntr-un fișier extern cu: :snapraid -d NAME -l fix.log fix Unde NAME este numele discului, cum ar fi `d1` ÃŽn exemplul nostru anterior. Dacă discul de recuperat este un disc de paritate, utilizați numele `parity`, `2-parity`, etc. Dacă aveți mai multe discuri defecte, utilizați mai multe opțiuni -d pentru a le specifica pe toate. Această comandă va dura mult timp. Asigurați-vă că aveți cÃĸțiva gigabytes liberi pentru a stoca fișierul fix.log. Rulați-l de pe un disc cu suficient spațiu liber. Acum ați recuperat tot ce este recuperabil. Dacă unele fișiere sunt parțial sau total nerecuperabile, vor fi redenumite adăugÃĸnd extensia `.unrecoverable`. Puteți găsi o listă detaliată a tuturor blocurilor nerecuperabile ÃŽn fișierul fix.log verificÃĸnd toate liniile care ÃŽncep cu `unrecoverable:`. Dacă nu sunteți mulțumit de recuperare, o puteți reÃŽncerca de cÃĸte ori doriți. De exemplu, dacă ați eliminat fișiere din matrice după ultima `sync`, acest lucru poate duce la nerecuperarea unor fișiere. În acest caz, puteți reÃŽncerca `fix`-ul utilizÃĸnd opțiunea -i, --import, specificÃĸnd unde se află acum aceste fișiere pentru a le include din nou ÃŽn procesul de recuperare. Dacă sunteți mulțumit de recuperare, puteți continua, dar rețineți că după sincronizare, nu mai puteți reÃŽncerca comanda `fix` deloc! PASUL 3 -> Verificare (Check) Ca o verificare prudentă, puteți rula acum o comandă `check` pentru a vă asigura că totul este corect pe discul recuperat. :snapraid -d NAME -a check Unde NAME este numele discului, cum ar fi `d1` ÃŽn exemplul nostru anterior. Opțiunile -d și -a spun SnapRAID să verifice doar discul specificat și să ignore toate datele de paritate. Această comandă va dura mult timp, dar dacă nu sunteți excesiv de prudent, o puteți sări. PASUL 4 -> Sincronizare (Sync) Rulați comanda `sync` pentru a resincroniza matricea cu noul disc. :snapraid sync Dacă totul este recuperat, această comandă este imediată. Comenzi SnapRAID oferă cÃĸteva comenzi simple care vă permit să: * Tipăriți starea matricei -> `status` * Controlați discurile -> `smart`, `probe`, `up`, `down` * Faceți un backup/snapshot -> `sync` * Verificați periodic datele -> `scrub` * Restaurați ultimul backup/snapshot -> `fix`. Comenzile trebuie scrise cu litere mici. status Tipărește un rezumat al stării matricei de discuri. Include informații despre fragmentarea parității, cÃĸt de vechi sunt blocurile fără verificare și toate erorile silențioase ÃŽnregistrate ÃŽntÃĸlnite ÃŽn timpul verificării (scrubbing). Informațiile prezentate se referă la ultima dată cÃĸnd ați rulat `sync`. Modificările ulterioare nu sunt luate ÃŽn considerare. Dacă au fost detectate blocuri defecte, numerele lor de bloc sunt listate. Pentru a le repara, puteți utiliza comanda `fix -e`. De asemenea, arată un grafic care reprezintă ultima dată cÃĸnd fiecare bloc a fost verificat (scrubbed) sau sincronizat. Blocurile verificate sunt afișate cu `*`, blocurile sincronizate, dar ÃŽncă neverificate, cu `o`. Nimic nu este modificat. smart Tipărește un raport SMART al tuturor discurilor din sistem. Include o estimare a probabilității de eșec ÃŽn anul următor, permițÃĸndu-vă să planificați ÃŽnlocuiri de ÃŽntreținere a discurilor care prezintă atribute suspecte. Această estimare a probabilității este obținută prin corelarea atributelor SMART ale discurilor cu datele Backblaze disponibile la: :https://www.backblaze.com/hard-drive-test-data.html Dacă SMART raportează că un disc este pe cale să eșueze, `FAIL` sau `PREFAIL` este tipărit pentru acel disc, iar SnapRAID returnează o eroare. În acest caz, ÃŽnlocuirea imediată a discului este puternic recomandată. Alte șiruri de stare posibile sunt: logfail - În trecut, unele atribute au fost mai mici decÃĸt pragul. logerr - Jurnalul de erori al dispozitivului conține erori. selferr - Jurnalul de auto-test al dispozitivului conține erori. Dacă opțiunea -v, --verbose este specificată, este furnizată o analiză statistică mai profundă. Această analiză vă poate ajuta să decideți dacă aveți nevoie de mai multă sau mai puțină paritate. Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea `smartctl -a` pe toate dispozitivele. Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica o comandă personalizată utilizÃĸnd opțiunea `smartctl` ÃŽn fișierul de configurare. Nimic nu este modificat. probe Tipărește starea de ALIMENTARE (POWER) a tuturor discurilor din sistem. `Standby` ÃŽnseamnă că discul nu se rotește. `Active` ÃŽnseamnă că discul se rotește. Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea `smartctl -n standby -i` pe toate dispozitivele. Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica o comandă personalizată utilizÃĸnd opțiunea `smartctl` ÃŽn fișierul de configurare. Nimic nu este modificat. up Pornirea tuturor discurilor din matrice. Puteți porni doar discuri specifice utilizÃĸnd opțiunea -d, --filter-disk. Pornirea tuturor discurilor ÃŽn același timp necesită multă energie. Asigurați-vă că sursa dvs. de alimentare o poate susține. Nimic nu este modificat. down Oprirea (spin down) tuturor discurilor din matrice. Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea `smartctl -s standby,now` pe toate dispozitivele. Puteți opri doar discuri specifice utilizÃĸnd opțiunea -d, --filter-disk. Pentru a opri automat la eroare, puteți utiliza opțiunea -s, --spin-down-on-error cu orice altă comandă, care este echivalentă cu rularea manuală a `down` atunci cÃĸnd apare o eroare. Nimic nu este modificat. diff Listează toate fișierele modificate de la ultima `sync` care trebuie să li se recalculeze datele de paritate. Această comandă nu verifică datele fișierului, ci doar marca temporală, dimensiunea și inodul fișierului. După listarea tuturor fișierelor modificate, este prezentat un rezumat al modificărilor, grupate după: equal - Fișiere neschimbate față de ÃŽnainte. added - Fișiere adăugate care nu erau prezente ÃŽnainte. removed - Fișiere eliminate. updated - Fișiere cu o dimensiune sau marcă temporală diferită, ceea ce ÃŽnseamnă că au fost modificate. moved - Fișiere mutate ÃŽntr-un director diferit pe același disc. Sunt identificate avÃĸnd același nume, dimensiune, marcă temporală și inod, dar un director diferit. copied - Fișiere copiate pe același disc sau pe un disc diferit unde fișierul original ÃŽncă există. Acestea sunt identificate prin faptul că au același nume, dimensiune și amprentă temporală. Dacă amprenta temporală sub-secundă este zero, calea completă trebuie să se potrivească pentru a fi identificate, nu doar numele. relocated - Fișiere mutate pe același disc sau pe un disc diferit unde originalul a dispărut. Acestea sunt identificate prin faptul că au același nume, dimensiune și amprentă temporală. Dacă amprenta temporală sub-secundă este zero, calea completă trebuie să se potrivească pentru a fi identificate. Spre deosebire de fișierele 'moved' de pe același disc, fișierele relocate au un inod diferit. restored - Fișiere cu un inod diferit, dar care se potrivesc ca director, nume, dimensiune și amprentă temporală. Acestea sunt de obicei fișiere restaurate după ce au fost șterse. Dacă este necesară o `sync`, codul de retur al procesului este 2, ÃŽn loc de cel implicit 0. Codul de retur 1 este utilizat pentru o condiție de eroare generică. Nimic nu este modificat. sync Actualizează informațiile de paritate. Toate fișierele modificate din matricea de discuri sunt citite și datele de paritate corespunzătoare sunt actualizate. Puteți opri acest proces ÃŽn orice moment apăsÃĸnd Ctrl+C, fără a pierde munca deja efectuată. La următoarea rulare, procesul `sync` va relua de unde a fost ÃŽntrerupt. Dacă se găsesc erori silențioase sau de intrare/ieșire ÃŽn timpul procesului, blocurile corespunzătoare sunt marcate ca defecte. Fișierele sunt identificate prin cale și/sau inod și verificate prin dimensiune și marcă temporală. Dacă dimensiunea sau marca temporală a fișierului diferă, datele de paritate sunt recalculate pentru ÃŽntregul fișier. Dacă fișierul este mutat sau redenumit pe același disc, păstrÃĸnd același inod, paritatea nu este recalculată. Dacă fișierul este mutat pe un alt disc, paritatea este recalculată, dar informațiile hash calculate anterior sunt păstrate. Fișierele de `content` și `parity` sunt modificate dacă este necesar. Fișierele din matrice NU sunt modificate. scrub Verifică (scrubs) matricea, căutÃĸnd erori silențioase sau de intrare/ieșire ÃŽn discurile de date și de paritate. Fiecare invocare verifică aproximativ 8% din matrice, excluzÃĸnd datele deja verificate ÃŽn ultimele 10 zile. Acest lucru ÃŽnseamnă că verificarea o dată pe săptămÃĸnă asigură că fiecare bit de date este verificat cel puțin o dată la trei luni. Puteți defini un plan de verificare sau o cantitate diferită utilizÃĸnd opțiunea -p, --plan, care acceptă: bad - Verifică blocurile marcate ca defecte. new - Verifică blocurile tocmai sincronizate care nu au fost ÃŽncă verificate. full - Verifică totul. 0-100 - Verifică procentul specificat de blocuri. Dacă specificați o valoare procentuală, puteți utiliza și opțiunea -o, --older-than pentru a defini cÃĸt de vechi ar trebui să fie blocul. Cele mai vechi blocuri sunt verificate primele, asigurÃĸnd o verificare optimă. Dacă doriți să verificați doar blocurile tocmai sincronizate care nu au fost ÃŽncă verificate, utilizați opțiunea `-p new`. Pentru a obține detalii despre starea verificării, utilizați comanda `status`. Pentru orice eroare silențioasă sau de intrare/ieșire găsită, blocurile corespunzătoare sunt marcate ca defecte ÃŽn fișierul de `content`. Aceste blocuri defecte sunt listate ÃŽn `status` și pot fi reparate cu `fix -e`. După reparare, la următorul scrub, vor fi reverificate, iar dacă se găsesc corectate, marca defectă va fi eliminată. Pentru a verifica doar blocurile defecte, puteți utiliza comanda `scrub -p bad`. Este recomandat să rulați `scrub` doar pe o matrice sincronizată pentru a evita erorile raportate cauzate de date nesincronizate. Aceste erori sunt recunoscute ca nefiind erori silențioase, iar blocurile nu sunt marcate ca defecte, dar astfel de erori sunt raportate ÃŽn ieșirea comenzii. Fișierul de `content` este modificat pentru a actualiza ora ultimei verificări pentru fiecare bloc și pentru a marca blocurile defecte. Fișierele de `parity` NU sunt modificate. Fișierele din matrice NU sunt modificate. fix Repară toate fișierele și datele de paritate. Toate fișierele și datele de paritate sunt comparate cu starea snapshot-ului salvată la ultima `sync`. Dacă se găsește o diferență, este readusă la snapshot-ul stocat. ATENȚIE! Comanda `fix` nu face diferența ÃŽntre erori și modificări intenționate. Ea revine necondiționat la starea fișierului de la ultima `sync`. Dacă nu este specificată nicio altă opțiune, ÃŽntreaga matrice este procesată. Utilizați opțiunile de filtrare pentru a selecta un subset de fișiere sau discuri de operat. Pentru a repara doar blocurile marcate ca defecte ÃŽn timpul `sync` și `scrub`, utilizați opțiunea -e, --filter-error. Spre deosebire de alte opțiuni de filtrare, aceasta aplică reparații doar fișierelor care sunt neschimbate de la ultima `sync`. SnapRAID redenumește toate fișierele care nu pot fi reparate adăugÃĸnd extensia `.unrecoverable`. Înainte de reparare, ÃŽntreaga matrice este scanată pentru a găsi orice fișiere mutate de la ultima operațiune `sync`. Aceste fișiere sunt identificate prin marca lor temporală, ignorÃĸnd numele și directorul lor și sunt utilizate ÃŽn procesul de recuperare dacă este necesar. Dacă ați mutat unele dintre ele ÃŽn afara matricei, puteți utiliza opțiunea -i, --import pentru a specifica directoare suplimentare de scanat. Fișierele sunt identificate doar prin cale, nu prin inod. Fișierul de `content` NU este modificat. Fișierele de `parity` sunt modificate dacă este necesar. Fișierele din matrice sunt modificate dacă este necesar. check Verifică toate fișierele și datele de paritate. Funcționează ca `fix`, dar simulează doar o recuperare și nu sunt scrise modificări ÃŽn matrice. Această comandă este destinată ÃŽn primul rÃĸnd verificării manuale, cum ar fi după un proces de recuperare sau ÃŽn alte condiții speciale. Pentru verificări periodice și programate, utilizați `scrub`. Dacă utilizați opțiunea -a, --audit-only, doar datele fișierului sunt verificate, iar datele de paritate sunt ignorate pentru o rulare mai rapidă. Fișierele sunt identificate doar prin cale, nu prin inod. Nimic nu este modificat. list Listează toate fișierele conținute ÃŽn matrice la momentul ultimei `sync`. Cu -v sau --verbose, este afișat și timpul sub-secundă. Nimic nu este modificat. dup Listează toate fișierele duplicate. Două fișiere sunt considerate egale dacă hash-urile lor se potrivesc. Datele fișierului nu sunt citite; sunt utilizate doar hash-urile precalculate. Nimic nu este modificat. pool Creează sau actualizează o vizualizare virtuală a tuturor fișierelor din matricea dvs. de discuri ÃŽn directorul de `pooling`. Fișierele nu sunt copiate, ci legate folosind link-uri simbolice. La actualizare, toate link-urile simbolice existente și subdirectoarele goale sunt șterse și ÃŽnlocuite cu noua vizualizare a matricei. Orice alte fișiere obișnuite sunt lăsate pe loc. Nimic nu este modificat ÃŽn afara directorului pool. devices Tipărește dispozitivele de nivel scăzut utilizate de matrice. Această comandă afișează asocierile de dispozitive din matrice și este destinată ÃŽn principal ca interfață de script. Primele două coloane sunt ID-ul și calea dispozitivului de nivel scăzut. Următoarele două coloane sunt ID-ul și calea dispozitivului de nivel ÃŽnalt. Ultima coloană este numele discului din matrice. În majoritatea cazurilor, aveți un dispozitiv de nivel scăzut pentru fiecare disc din matrice, dar ÃŽn unele configurații mai complexe, puteți avea mai multe dispozitive de nivel scăzut utilizate de un singur disc din matrice. Nimic nu este modificat. touch Setează o marcă temporală arbitrară sub-secundă pentru toate fișierele care o au setată la zero. Acest lucru ÃŽmbunătățește capacitatea SnapRAID de a recunoaște fișierele mutate și copiate, deoarece face ca marca temporală să fie aproape unică, reducÃĸnd posibilele duplicate. Mai exact, dacă marca temporală sub-secundă nu este zero, un fișier mutat sau copiat este identificat ca atare dacă se potrivește cu numele, dimensiunea și marca temporală. Dacă marca temporală sub-secundă este zero, este considerat o copie doar dacă calea completă, dimensiunea și marca temporală se potrivesc toate. Marca temporală cu precizie de secundă nu este modificată, deci toate datele și orele fișierelor dvs. vor fi păstrate. rehash Programează o rehash-uire a ÃŽntregii matrici. Această comandă schimbă tipul de hash utilizat, de obicei la actualizarea de la un sistem pe 32 de biți la unul pe 64 de biți, pentru a trece de la MurmurHash3 la SpookyHash, care este mai rapid. Dacă utilizați deja hash-ul optim, această comandă nu face nimic și vă informează că nu este necesară nicio acțiune. Rehash-ul nu este efectuat imediat, ci are loc progresiv ÃŽn timpul `sync` și `scrub`. Puteți verifica starea rehash-ului utilizÃĸnd `status`. În timpul rehash-ului, SnapRAID ÃŽČ™i menține funcționalitatea completă, cu singura excepție că `dup` nu poate detecta fișierele duplicate folosind un hash diferit. locate Localizează fișierele stocate pe discurile de paritate. Pentru fiecare fișier potrivit, afișează locația acestuia ÃŽn fișierul de paritate și numărul de fragmente pe care le ocupă. Puteți utiliza opțiunea -t, --tail pentru a restricționa operațiunea la fișierele care ocupă porțiunea finală specificată a parității. Dacă doriți să realocați aceste fișiere, puteți utiliza apoi opțiunea -W, --force-realloc-tail. Rețineți că astfel de fișiere nu vor fi protejate de paritate ÃŽn timpul procesului de realocare. Opțiuni SnapRAID oferă următoarele opțiuni: -c, --conf CONFIG Selectează fișierul de configurare de utilizat. Dacă nu este specificat, ÃŽn Unix utilizează fișierul `/usr/local/etc/snapraid.conf` dacă există, altfel `/etc/snapraid.conf`. În Windows, utilizează fișierul `snapraid.conf` din același director ca `snapraid.exe`. -f, --filter PATTERN Filtrează fișierele de procesat ÃŽn `check` și `fix`. Sunt procesate doar fișierele care se potrivesc cu modelul specificat. Această opțiune poate fi utilizată de mai multe ori. Vedeți secțiunea PATTERN pentru mai multe detalii despre specificațiile modelului. În Unix, asigurați-vă că caracterele globbing sunt citate dacă sunt utilizate. Această opțiune poate fi utilizată doar cu `check` și `fix`. Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. -d, --filter-disk NAME Filtrează discurile de procesat ÃŽn `check`, `fix`, `up` și `down`. Trebuie să specificați un nume de disc așa cum este definit ÃŽn fișierul de configurare. Puteți specifica și discurile de paritate cu numele: `parity`, `2-parity`, `3-parity`, etc., pentru a limita operațiunile la un anumit disc de paritate. Dacă combinați mai multe opțiuni --filter, --filter-disk și --filter-missing, sunt selectate doar fișierele care se potrivesc cu toate filtrele. Această opțiune poate fi utilizată de mai multe ori. Această opțiune poate fi utilizată doar cu `check`, `fix`, `up` și `down`. Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. -m, --filter-missing Filtrează fișierele de procesat ÃŽn `check` și `fix`. Sunt procesate doar fișierele lipsă sau șterse din matrice. CÃĸnd este utilizată cu `fix`, aceasta acționează ca o comandă de `undelete` (anulare ștergere). Dacă combinați mai multe opțiuni --filter, --filter-disk și --filter-missing, sunt selectate doar fișierele care se potrivesc cu toate filtrele. Această opțiune poate fi utilizată doar cu `check` și `fix`. Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. -e, --filter-error Procesează fișierele cu erori ÃŽn `check` și `fix`. Procesează doar fișierele care au blocuri marcate cu erori silențioase sau de intrare/ieșire ÃŽn timpul `sync` și `scrub`, așa cum sunt listate ÃŽn `status`. Această opțiune poate fi utilizată doar cu `check` și `fix`. -p, --plan PERC|bad|new|full Selectează planul de verificare (scrub). Dacă PERC este o valoare numerică de la 0 la 100, este interpretată ca procentul de blocuri de verificat. În loc de un procent, puteți specifica un plan: `bad` verifică blocurile defecte, `new` verifică blocurile care nu au fost ÃŽncă verificate, iar `full` verifică totul. Această opțiune poate fi utilizată doar cu `scrub`. -o, --older-than DAYS Selectează cea mai veche parte a matricei de procesat ÃŽn `scrub`. DAYS este vÃĸrsta minimă ÃŽn zile pentru ca un bloc să fie verificat; valoarea implicită este 10. Blocurile marcate ca defecte sunt ÃŽntotdeauna verificate, indiferent de această opțiune. Această opțiune poate fi utilizată doar cu `scrub`. -a, --audit-only În `check`, verifică hash-ul fișierelor fără a verifica datele de paritate. Dacă sunteți interesați doar de verificarea datelor fișierului, această opțiune poate accelera semnificativ procesul de verificare. Această opțiune poate fi utilizată doar cu `check`. -h, --pre-hash În `sync`, rulează o fază preliminară de hashing a tuturor datelor noi pentru o verificare suplimentară ÃŽnainte de calculul parității. De obicei, ÃŽn `sync`, nu se face hashing preliminar, iar datele noi sunt hash-uite chiar ÃŽnainte de calculul parității, atunci cÃĸnd sunt citite pentru prima dată. Acest proces are loc atunci cÃĸnd sistemul este sub ÃŽncărcare mare, cu toate discurile rotindu-se și un CPU ocupat. Aceasta este o condiție extremă pentru mașină și, dacă are o problemă hardware latentă, erorile silențioase pot trece nedetectate deoarece datele nu sunt ÃŽncă hash-uite. Pentru a evita acest risc, puteți activa modul `pre-hash` pentru a avea toate datele citite de două ori pentru a le asigura integritatea. Această opțiune verifică și fișierele mutate ÃŽn cadrul matricei pentru a se asigura că operațiunea de mutare a fost reușită și, dacă este necesar, vă permite să rulați o operațiune de reparare (fix) ÃŽnainte de a continua. Această opțiune poate fi utilizată doar cu `sync`. -i, --import DIR Importă din directorul specificat orice fișiere șterse din matrice după ultima `sync`. Dacă mai aveți astfel de fișiere, ele pot fi utilizate de `check` și `fix` pentru a ÃŽmbunătăți procesul de recuperare. Fișierele sunt citite, inclusiv ÃŽn subdirectoare, și sunt identificate indiferent de numele lor. Această opțiune poate fi utilizată doar cu `check` și `fix`. -s, --spin-down-on-error La orice eroare, oprește (spin down) toate discurile gestionate ÃŽnainte de a ieși cu un cod de stare diferit de zero. Acest lucru ÃŽmpiedică unitățile să rămÃĸnă active și să se rotească după o operațiune ÃŽntreruptă, ajutÃĸnd la evitarea acumulării inutile de căldură și a consumului de energie. Utilizați această opțiune pentru a vă asigura că discurile sunt oprite ÃŽn siguranță chiar și atunci cÃĸnd o comandă eșuează. -w, --bw-limit RATE Aplică o limită globală de lățime de bandă pentru toate discurile. RATE este numărul de octeți pe secundă. Puteți specifica un multiplicator cum ar fi K, M sau G (de exemplu, --bw-limit 1G). -t, --tail DIMENSIUNE Limitează listarea fișierelor la cele care nu utilizează mai mult de dimensiunea finală specificată a discurilor de paritate. Puteți utiliza multiplicatori precum K, M, G sau T (ex. --tail 1G). Această opțiune este valabilă numai atunci cÃĸnd este utilizată ÃŽmpreună cu comanda `locate`. -A, --stats Activează o vizualizare de stare extinsă care arată informații suplimentare. Ecranul afișează două grafice: Primul grafic arată numărul de dungi (stripes) tamponate pentru fiecare disc, ÃŽmpreună cu calea fișierului care este accesat ÃŽn prezent pe acel disc. În mod obișnuit, cel mai lent disc nu va avea tampon disponibil, ceea ce determină lățimea de bandă maximă realizabilă. Al doilea grafic arată procentul de timp petrecut așteptÃĸnd ÃŽn ultimele 100 de secunde. Este de așteptat ca cel mai lent disc să cauzeze cea mai mare parte a timpului de așteptare, ÃŽn timp ce alte discuri ar trebui să aibă puțin sau deloc timp de așteptare, deoarece ÃŽČ™i pot utiliza dungile tamponate. Acest grafic arată și timpul petrecut așteptÃĸnd calculele hash și calculele RAID. Toate calculele rulează ÃŽn paralel cu operațiunile de disc. Prin urmare, atÃĸta timp cÃĸt există timp de așteptare măsurabil pentru cel puțin un disc, indică faptul că CPU-ul este suficient de rapid pentru a ține pasul cu sarcina de lucru. -Z, --force-zero Forțează operațiunea nesigură de sincronizare a unui fișier cu dimensiunea zero care era anterior non-zero. Dacă SnapRAID detectează o astfel de condiție, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cu ușurință cÃĸnd, după o cădere de sistem, unele fișiere accesate au fost trunchiate. Aceasta este o condiție posibilă ÃŽn Linux cu sistemele de fișiere ext3/ext4. Această opțiune poate fi utilizată doar cu `sync`. -E, --force-empty Forțează operațiunea nesigură de sincronizare a unui disc cu toate fișierele originale lipsă. Dacă SnapRAID detectează că toate fișierele prezente inițial pe disc lipsesc sau au fost rescrise, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cu ușurință cÃĸnd un sistem de fișiere de date nu este montat. Este permis, totuși, să aveți o singură schimbare de UUID cu paritate simplă și mai multe cu paritate multiplă, deoarece acesta este cazul normal la ÃŽnlocuirea discurilor după o recuperare. Această opțiune poate fi utilizată doar cu `sync`, `check` sau `fix`. -U, --force-uuid Forțează operațiunea nesigură de sincronizare, verificare și reparare cu discuri care și-au schimbat UUID-ul. Dacă SnapRAID detectează că unele discuri și-au schimbat UUID-ul, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cÃĸnd discurile dvs. sunt montate la punctele de montare greșite. Este permis, totuși, să aveți o singură schimbare de UUID cu paritate simplă și mai multe cu paritate multiplă, deoarece acesta este cazul normal la ÃŽnlocuirea discurilor după o recuperare. Această opțiune poate fi utilizată doar cu `sync`, `check` sau `fix`. -D, --force-device Forțează operațiunea nesigură de reparare cu discuri inaccesibile sau cu discuri pe același dispozitiv fizic. De exemplu, dacă ați pierdut două discuri de date și aveți un disc de rezervă pentru a recupera doar primul, puteți ignora al doilea disc inaccesibil. Sau, dacă doriți să recuperați un disc ÃŽn spațiul liber rămas pe un disc deja utilizat, partajÃĸnd același dispozitiv fizic. Această opțiune poate fi utilizată doar cu `fix`. -N, --force-nocopy În `sync`, `check` și `fix`, dezactivează euristica de detectare a copiei. Fără această opțiune, SnapRAID presupune că fișierele cu aceleași atribute, cum ar fi numele, dimensiunea și marca temporală, sunt copii cu aceleași date. Acest lucru permite identificarea fișierelor copiate sau mutate de pe un disc pe altul și refolosirea informațiilor hash deja calculate pentru a detecta erori silențioase sau pentru a recupera fișiere lipsă. În unele cazuri rare, acest comportament poate duce la rezultate fals pozitive sau la un proces lent din cauza multor verificări hash, iar această opțiune vă permite să rezolvați astfel de probleme. Această opțiune poate fi utilizată doar cu `sync`, `check` și `fix`. -F, --force-full În `sync`, forțează o recalculare completă a parității. Această opțiune poate fi utilizată atunci cÃĸnd adăugați un nou nivel de paritate sau dacă ați revenit la un fișier de conținut vechi utilizÃĸnd date de paritate mai recente. În loc să recreați paritatea de la zero, aceasta vă permite să reutilizați hash-urile prezente ÃŽn fișierul de conținut pentru a valida datele și a menține protecția datelor ÃŽn timpul procesului `sync` utilizÃĸnd datele de paritate existente. Această opțiune poate fi utilizată doar cu `sync`. -R, --force-realloc În `sync`, forțează o realocare completă a fișierelor și o reconstruire a parității. Această opțiune poate fi utilizată pentru a realoca complet toate fișierele, eliminÃĸnd fragmentarea, ÃŽn timp ce reutilizați hash-urile prezente ÃŽn fișierul de conținut pentru a valida datele. Această opțiune poate fi utilizată doar cu `sync`. ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu o utilizați. NU aveți protecție a datelor ÃŽn timpul operațiunii `sync`. -W, --force-realloc-tail DIMENSIUNE Funcționează ca -R, --force-realloc, dar limitat la porțiunea finală specificată (ultimii DIMENSIUNE octeți) ai fiecărui fișier de paritate. Forțează realocarea (mutarea) oricăror fragmente/blocuri de fișiere stocate ÃŽn prezent ÃŽn acea secțiune finală, permițÃĸndu-le să fie plasate oriunde ÃŽn fișierul/fișierele de paritate unde este disponibil spațiu liber (inclusiv golurile existente). Scopul principal al acestei opțiuni este de a reduce dimensiunea pe disc a fișierului de paritate. Dacă realocarea eliberează cu succes ÃŽntreaga secțiune finală (nu mai rămÃĸn blocuri care să o utilizeze), fișierul de paritate este trunchiat, recuperÃĸnd spațiul final neutilizat. Puteți utiliza multiplicatori precum K, M, G sau T (ex. --force-realloc-tail 1G). Puteți utiliza locate -t, --tail pentru a cunoaște ÃŽn avans fișierele afectate. AVERTIZARE! Această opțiune este doar pentru experți și se recomandă insistent să nu fie utilizată. NU beneficiați de protecție a datelor ÃŽn timpul operațiunii `sync` pentru fișierele afectate. -l, --log FILE Scrie un jurnal detaliat ÃŽn fișierul specificat. Dacă această opțiune nu este specificată, erorile neașteptate sunt tipărite pe ecran, putÃĸnd rezulta o ieșire excesivă ÃŽn caz de multe erori. CÃĸnd -l, --log este specificat, doar erorile fatale care fac SnapRAID să se oprească sunt tipărite pe ecran. Dacă calea ÃŽncepe cu `>>`, fișierul este deschis ÃŽn modul de adăugare. Aparițiile de `%D` și `%T` ÃŽn nume sunt ÃŽnlocuite cu data și ora ÃŽn formatul YYYYMMDD și HHMMSS. În fișierele batch Windows, trebuie să dublați caracterul `%`, de exemplu, result-%%D.log. Pentru a utiliza `>>`, trebuie să ÃŽnchideți numele ÃŽntre ghilimele, de exemplu, `">>result.log"`. Pentru a scoate jurnalul la ieșirea standard sau la eroarea standard, puteți utiliza `">&1"` și `">&2"`, respectiv. Vedeți fișierul snapraid_log.txt sau pagina de manual pentru descrieri ale etichetelor jurnalului. -L, --error-limit NUMBER Setează o nouă limită de erori ÃŽnainte de a opri execuția. În mod implicit, SnapRAID se oprește dacă ÃŽntÃĸlnește mai mult de 100 de erori de intrare/ieșire, indicÃĸnd că un disc probabil eșuează. Această opțiune afectează `sync` și `scrub`, cărora li se permite să continue după primul set de erori de disc pentru a ÃŽncerca să ÃŽČ™i finalizeze operațiunile. Cu toate acestea, `check` și `fix` se opresc ÃŽntotdeauna la prima eroare. -S, --start BLKSTART Începe procesarea de la numărul de bloc specificat. Acest lucru poate fi util pentru a reÃŽncerca verificarea sau repararea anumitor blocuri ÃŽn cazul unui disc deteriorat. Această opțiune este ÃŽn principal pentru recuperarea manuală avansată. -B, --count BLKCOUNT Procesează doar numărul specificat de blocuri. Această opțiune este ÃŽn principal pentru recuperarea manuală avansată. -C, --gen-conf CONTENT Generează un fișier de configurare fictiv dintr-un fișier de conținut existent. Fișierul de configurare este scris la ieșirea standard și nu suprascrie unul existent. Acest fișier de configurare conține și informațiile necesare pentru a reconstrui punctele de montare a discului ÃŽn cazul ÃŽn care pierdeți ÃŽntregul sistem. -v, --verbose Tipărește mai multe informații pe ecran. Dacă este specificat o dată, tipărește fișierele excluse și statistici suplimentare. Această opțiune nu are niciun efect asupra fișierelor jurnal. -q, --quiet Tipărește mai puține informații pe ecran. Dacă este specificat o dată, elimină bara de progres; de două ori, operațiunile ÃŽn curs; de trei ori, mesajele info ; de patru ori, mesajele de stare. Erorile fatale sunt ÃŽntotdeauna tipărite pe ecran. Această opțiune nu are niciun efect asupra fișierelor jurnal. -H, --help Tipărește un ecran de ajutor scurt. -V, --version Tipărește versiunea programului. Configurare SnapRAID necesită un fișier de configurare pentru a ști unde se află matricea dvs. de discuri și unde să stocheze informațiile de paritate. În Unix, utilizează fișierul `/usr/local/etc/snapraid.conf` dacă există, altfel `/etc/snapraid.conf`. În Windows, utilizează fișierul `snapraid.conf` din același director ca `snapraid.exe`. Trebuie să conțină următoarele opțiuni (sensibile la majuscule/minuscule): parity FILE [,FILE] ... Definește fișierele de utilizat pentru a stoca informațiile de paritate. Paritatea permite protecția ÃŽmpotriva unei singure defecțiuni de disc, similar cu RAID5. Puteți specifica mai multe fișiere, care trebuie să fie pe discuri diferite. CÃĸnd un fișier nu mai poate crește, este utilizat următorul. Spațiul total disponibil trebuie să fie cel puțin la fel de mare ca cel mai mare disc de date din matrice. Puteți adăuga fișiere de paritate suplimentare mai tÃĸrziu, dar nu le puteți reordona sau elimina. Păstrarea discurilor de paritate rezervate pentru paritate asigură că nu devin fragmentate, ÃŽmbunătățind performanța. În Windows, 256 MB sunt lăsați neutilizați pe fiecare disc pentru a evita avertismentul despre discuri pline. Această opțiune este obligatorie și poate fi utilizată o singură dată. (2,3,4,5,6)-parity FILE [,FILE] ... Definește fișierele de utilizat pentru a stoca informații de paritate suplimentare. Pentru fiecare nivel de paritate specificat, este activat un nivel suplimentar de protecție: * 2-parity activează paritatea dublă RAID6. * 3-parity activează paritatea triplă. * 4-parity activează paritatea quad (patru). * 5-parity activează paritatea penta (cinci). * 6-parity activează paritatea hexa (șase). Fiecare nivel de paritate necesită prezența tuturor nivelurilor de paritate anterioare. Aceleași considerații ca pentru opțiunea `parity` se aplică. Aceste opțiuni sunt opționale și pot fi utilizate o singură dată. z-parity FILE [,FILE] ... Definește un fișier și un format alternativ pentru a stoca paritatea triplă. Această opțiune este o alternativă la `3-parity`, destinată ÃŽn primul rÃĸnd CPU-urilor low-end precum ARM sau AMD Phenom, Athlon și Opteron care nu suportă setul de instrucțiuni SSSE3. În astfel de cazuri, oferă o performanță mai bună. Acest format este similar, dar mai rapid decÃĸt cel utilizat de ZFS RAIDZ3. Ca și ZFS, nu funcționează dincolo de paritatea triplă. CÃĸnd utilizați `3-parity`, veți fi avertizați dacă este recomandat să utilizați formatul `z-parity` pentru ÃŽmbunătățirea performanței. Este posibil să convertiți de la un format la altul ajustÃĸnd fișierul de configurare cu fișierul z-parity sau 3-parity dorit și utilizÃĸnd `fix` pentru a-l recrea. content FILE Definește fișierul de utilizat pentru a stoca lista și sumele de control (checksums) a tuturor fișierelor prezente ÃŽn matricea dvs. de discuri. Poate fi plasat pe un disc utilizat pentru date, paritate sau orice alt disc disponibil. Dacă utilizați un disc de date, acest fișier este automat exclus din procesul `sync`. Această opțiune este obligatorie și poate fi utilizată de mai multe ori pentru a salva mai multe copii ale aceluiași fișier. Trebuie să stocați cel puțin o copie pentru fiecare disc de paritate utilizat plus unul. Utilizarea de copii suplimentare nu dăunează. data NAME DIR Definește numele și punctul de montare al discurilor de date din matrice. NAME este utilizat pentru a identifica discul și trebuie să fie unic. DIR este punctul de montare al discului ÃŽn sistemul de fișiere. Puteți schimba punctul de montare după cum este necesar, atÃĸta timp cÃĸt păstrați NAME fix. Ar trebui să utilizați o opțiune pentru fiecare disc de date din matrice. Puteți redenumi un disc mai tÃĸrziu schimbÃĸnd NAME direct ÃŽn fișierul de configurare și apoi rulÃĸnd o comandă `sync`. În cazul redenumirii, asocierea se face utilizÃĸnd UUID-ul stocat al discurilor. extra NAME DIR Definește numele și punctul de montare al discurilor suplimentare care vor fi monitorizate cu comenzile `smart` și `probe`. Acest lucru este util pentru monitorizarea discurilor care nu fac parte din matrice, dar sunt necesare pentru funcționarea sistemului, cum ar fi discul de pornire. Rețineți că astfel de discuri nu sunt afectate de comenzile `up` și `down` deoarece se așteaptă ca acestea să se rotească mereu. nohidden Exclude toate fișierele și directoarele ascunse. În Unix, fișierele ascunse sunt cele care ÃŽncep cu `.`. În Windows, sunt cele cu atributul ascuns. exclude/include PATTERN Definește modelele de fișiere sau directoare de exclus sau inclus ÃŽn procesul de sincronizare. Toate modelele sunt procesate ÃŽn ordinea specificată. Dacă primul model care se potrivește este un `exclude`, fișierul este exclus. Dacă este un `include`, fișierul este inclus. Dacă niciun model nu se potrivește, fișierul este exclus dacă ultimul model specificat este un `include`, sau inclus dacă ultimul model specificat este un `exclude`. Vedeți secțiunea PATTERN pentru mai multe detalii despre specificațiile modelului. Această opțiune poate fi utilizată de mai multe ori. blocksize SIZE_IN_KIBIBYTES Definește dimensiunea de bază a blocului ÃŽn kibibytes pentru paritate. Un kibibyte este 1024 de octeți. Dimensiunea implicită a blocului este 256, care ar trebui să funcționeze pentru majoritatea cazurilor. ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu schimbați această valoare. Pentru a schimba această valoare ÃŽn viitor, va trebui să recreați ÃŽntreaga paritate! Un motiv pentru a utiliza o dimensiune de bloc diferită este dacă aveți multe fișiere mici, de ordinul milioanelor. Pentru fiecare fișier, chiar dacă are doar cÃĸțiva octeți, este alocat un bloc ÃŽntreg de paritate, iar cu multe fișiere, acest lucru poate duce la un spațiu de paritate neutilizat semnificativ. CÃĸnd umpleți complet discul de paritate, nu vi se permite să adăugați mai multe fișiere pe discurile de date. Cu toate acestea, paritatea irosită nu se acumulează pe discurile de date. Spațiul irosit rezultat dintr-un număr mare de fișiere pe un disc de date limitează doar cantitatea de date de pe acel disc de date, nu pe celelalte. Ca o aproximare, puteți presupune că jumătate din dimensiunea blocului este irosită pentru fiecare fișier. De exemplu, cu 100.000 de fișiere și o dimensiune de bloc de 256 KiB, veți irosi 12,8 GB de paritate, ceea ce poate duce la 12,8 GB mai puțin spațiu disponibil pe discul de date. Puteți verifica cantitatea de spațiu irosit pe fiecare disc utilizÃĸnd `status`. Aceasta este cantitatea de spațiu pe care trebuie să o lăsați liberă pe discurile de date sau să o utilizați pentru fișiere care nu sunt incluse ÃŽn matrice. Dacă această valoare este negativă, ÃŽnseamnă că sunteți aproape de a umple paritatea și reprezintă spațiul pe care ÃŽl puteți irosi ÃŽncă. Pentru a evita această problemă, puteți utiliza o partiție mai mare pentru paritate. De exemplu, dacă partiția de paritate este cu 12,8 GB mai mare decÃĸt discurile de date, aveți suficient spațiu suplimentar pentru a gestiona pÃĸnă la 100.000 de fișiere pe fiecare disc de date fără niciun spațiu irosit. Un truc pentru a obține o partiție de paritate mai mare ÃŽn Linux este să o formatați cu comanda: :mkfs.ext4 -m 0 -T largefile4 DEVICE Acest lucru duce la aproximativ 1,5% spațiu suplimentar, aproximativ 60 GB pentru un disc de 4 TB, ceea ce permite aproximativ 460.000 de fișiere pe fiecare disc de date fără niciun spațiu irosit. hashsize SIZE_IN_BYTES Definește dimensiunea hash-ului ÃŽn octeți pentru blocurile salvate. Dimensiunea implicită a hash-ului este de 16 octeți (128 de biți), care ar trebui să funcționeze pentru majoritatea cazurilor. ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu schimbați această valoare. Pentru a schimba această valoare ÃŽn viitor, va trebui să recreați ÃŽntreaga paritate! Un motiv pentru a utiliza o dimensiune de hash diferită este dacă sistemul dvs. are memorie limitată. Ca regulă generală, SnapRAID necesită de obicei 1 GiB de RAM pentru fiecare 16 TB de date din matrice. Mai exact, pentru a stoca hash-urile datelor, SnapRAID necesită aproximativ TS*(1+HS)/BS octeți de RAM, unde TS este dimensiunea totală ÃŽn octeți a matricei dvs. de discuri, BS este dimensiunea blocului ÃŽn octeți, iar HS este dimensiunea hash-ului ÃŽn octeți. De exemplu, cu 8 discuri de 4 TB, o dimensiune de bloc de 256 KiB (1 KiB = 1024 octeți) și o dimensiune de hash de 16, obțineți: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB TrecÃĸnd la o dimensiune de hash de 8, obțineți: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB TrecÃĸnd la o dimensiune de bloc de 512, obțineți: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB TrecÃĸnd la ambele, o dimensiune de hash de 8 și o dimensiune de bloc de 512, obțineți: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB autosave SIZE_IN_GIGABYTES Salvează automat starea la sincronizare sau verificare după cantitatea specificată de GB procesați. Această opțiune este utilă pentru a evita repornirea comenzilor `sync` lungi de la zero dacă sunt ÃŽntrerupte de o cădere a mașinii sau de orice alt eveniment. temp_limit TEMPERATURE_CELSIUS Setează temperatura maximă permisă a discului ÃŽn Celsius. CÃĸnd este specificată, SnapRAID verifică periodic temperatura tuturor discurilor utilizÃĸnd instrumentul smartctl. Temperaturile curente ale discurilor sunt afișate ÃŽn timp ce SnapRAID funcționează. Dacă un disc depășește această limită, toate operațiunile se opresc, iar discurile sunt oprite (puse ÃŽn standby) pentru durata definită de opțiunea `temp_sleep`. După perioada de așteptare, operațiunile reiau, putÃĸnd ÃŽntrerupe din nou dacă limita de temperatură este atinsă ÃŽncă o dată. În timpul funcționării, SnapRAID analizează și curba de ÃŽncălzire a fiecărui disc și estimează temperatura constantă pe termen lung pe care se așteaptă să o atingă dacă activitatea continuă. Estimarea este efectuată numai după ce temperatura discului a crescut de patru ori, asigurÃĸndu-se că sunt disponibile suficiente puncte de date pentru a stabili o tendință fiabilă. Această temperatură constantă prezisă este afișată ÃŽntre paranteze lÃĸngă valoarea curentă și ajută la evaluarea dacă răcirea sistemului este adecvată. Această temperatură estimată este doar ÃŽn scop informativ și nu are niciun efect asupra comportamentului SnapRAID. Acțiunile programului se bazează exclusiv pe temperaturile reale măsurate ale discurilor. Pentru a efectua această analiză, SnapRAID are nevoie de o referință pentru temperatura sistemului. Încearcă mai ÃŽntÃĸi să o citească de la senzorii hardware disponibili. Dacă nu poate fi accesat niciun senzor de sistem, utilizează cea mai scăzută temperatură a discului măsurată la ÃŽnceputul rulării ca referință de rezervă. În mod normal, SnapRAID arată doar temperatura celui mai fierbinte disc. Pentru a afișa temperatura tuturor discurilor, utilizați opțiunea -A sau --stats. temp_sleep TIME_IN_MINUTES Setează timpul de așteptare (standby), ÃŽn minute, cÃĸnd limita de temperatură este atinsă. În această perioadă, discurile rămÃĸn oprite. Valoarea implicită este 5 minute. pool DIR Definește directorul de pooling unde este creată vizualizarea virtuală a matricei de discuri utilizÃĸnd comanda `pool`. Directorul trebuie să existe deja. share UNC_DIR Definește calea UNC Windows necesară pentru a accesa discurile de la distanță. Dacă această opțiune este specificată, link-urile simbolice create ÃŽn directorul pool utilizează această cale UNC pentru a accesa discurile. Fără această opțiune, link-urile simbolice generate utilizează doar căi locale, ceea ce nu permite partajarea directorului pool peste rețea. Link-urile simbolice sunt formate utilizÃĸnd calea UNC specificată, adăugÃĸnd numele discului specificat ÃŽn opțiunea `data` și, ÃŽn final, adăugÃĸnd directorul și numele fișierului. Această opțiune este necesară doar pentru Windows. smartctl DISK/PARITY OPTIONS... Definește opțiuni smartctl personalizate pentru a obține atributele SMART pentru fiecare disc. Acest lucru poate fi necesar pentru controlerele RAID și unele discuri USB care nu pot fi detectate automat. Substituția %s este ÃŽnlocuită de numele dispozitivului, dar este opțională pentru dispozitivele fixe, cum ar fi controlerele RAID. DISK este același nume de disc specificat ÃŽn opțiunea `data`. PARITY este unul dintre numele de paritate: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` sau `z-parity`. În OPȚIUNILE specificate, șirul `%s` este ÃŽnlocuit de numele dispozitivului. Pentru controlerele RAID, dispozitivul este probabil fix și este posibil să nu fie nevoie să utilizați `%s`. Consultați documentația smartmontools pentru opțiuni posibile: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices De exemplu: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignoră atributul SMART specificat la calcularea probabilității de eșec a discului. Această opțiune este utilă dacă un disc raportează valori neobișnuite sau ÃŽnșelătoare pentru un anumit atribut. DISK este același nume de disc specificat ÃŽn opțiunea `data`. PARITY este unul dintre numele de paritate: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` sau `z-parity`. Valoarea specială * poate fi utilizată pentru a ignora atributul pe toate discurile. De exemplu, pentru a ignora atributul `Current Pending Sector Count` pe toate discurile: :smartignore * 197 Pentru a-l ignora doar pe primul disc de paritate: :smartignore parity 197 Exemple Un exemplu de configurare tipică pentru Unix este: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Un exemplu de configurare tipică pentru Windows este: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Model (Pattern) Modelele oferă o modalitate flexibilă de a filtra fișierele pentru includere sau excludere. Folosind caractere de tip globbing, puteți defini reguli care să se potrivească cu nume de fișiere specifice sau cu structuri ÃŽntregi de directoare fără a lista manual fiecare cale. Semnul ÃŽntrebării `?` se potrivește cu orice caracter unic, cu excepția separatorului de directoare. Acest lucru ÃŽl face util pentru potrivirea numelor de fișiere cu caractere variabile, păstrÃĸnd ÃŽn același timp modelul limitat la un singur nivel de director. Asteriscul simplu `*` se potrivește cu orice secvență de caractere, dar, la fel ca semnul ÃŽntrebării, nu trece niciodată de limitele directoarelor. Se oprește la slash-ul ÃŽnainte, ceea ce ÃŽl face potrivit pentru potrivirea ÃŽn cadrul unei singure componente a căii. Acesta este comportamentul standard al metacaracterelor, familiar din shell globbing. Asteriscul dublu `**` este mai puternic, se potrivește cu orice secvență de caractere, inclusiv separatori de directoare. Acest lucru permite modelelor să se potrivească pe mai multe niveluri de directoare. CÃĸnd `**` apare inserat direct ÃŽntr-un model, se poate potrivi cu zero sau mai multe caractere, inclusiv slash-uri ÃŽntre textul literal ÃŽnconjurător. Cea mai importantă utilizare a lui `**` este ÃŽn forma specială `/**/`. Aceasta se potrivește cu zero sau mai multe niveluri complete de directoare, făcÃĸnd posibilă potrivirea fișierelor la orice adÃĸncime ÃŽntr-un arbore de directoare fără a cunoaște structura exactă a căii. De exemplu, modelul `src/**/main.js` se potrivește cu `src/main.js` (sărind peste zero directoare), `src/ui/main.js` (sărind peste un director) și `src/ui/components/main.js` (sărind peste două directoare). Clasele de caractere care utilizează paranteze pătrate `[]` se potrivesc cu un singur caracter dintr-un set sau interval specificat. La fel ca și celelalte modele de un singur caracter, acestea nu se potrivesc cu separatorii de directoare. Clasele suportă intervale și negarea folosind un semn de exclamare. Distincția fundamentală de reținut este că `*`, `?` și clasele de caractere respectă toate limitele directoarelor și se potrivesc doar ÃŽn cadrul unei singure componente a căii, ÃŽn timp ce `**` este singurul model care se poate potrivi peste separatorii de directoare. Există patru tipuri diferite de modele: =FILE Selectează orice fișier cu numele FILE. Acest model se aplică numai fișierelor, nu și directoarelor. =DIR/ Selectează orice director cu numele DIR și tot ce se află ÃŽn interior. Acest model se aplică numai directoarelor, nu și fișierelor. =/PATH/FILE Selectează calea exactă a fișierului specificat. Acest model se aplică numai fișierelor, nu și directoarelor. =/PATH/DIR/ Selectează calea exactă a directorului specificat și tot ce se află ÃŽn interior. Acest model se aplică numai directoarelor, nu și fișierelor. CÃĸnd specificați o cale absolută care ÃŽncepe cu /, aceasta este aplicată la directorul rădăcină al matricei, nu la directorul rădăcină al sistemului de fișiere local. În Windows, puteți utiliza backslash-ul \ ÃŽn loc de slash-ul /. Directoarele de sistem Windows, joncțiunile, punctele de montare și alte directoare speciale Windows sunt tratate ca fișiere, ceea ce ÃŽnseamnă că pentru a le exclude, trebuie să utilizați o regulă de fișier, nu una de director. Dacă numele fișierului conține un caracter `*`, `?`, `[`, sau `]`, trebuie să ÃŽl escape-ați pentru a evita să fie interpretat ca un caracter de globbing. În Unix, caracterul escape este `\`; ÃŽn Windows, este `^`. CÃĸnd modelul este pe linia de comandă, trebuie să dublați caracterul escape pentru a evita ca acesta să fie interpretat de shell-ul de comandă. În fișierul de configurare, puteți utiliza diferite strategii pentru a filtra fișierele de procesat. Abordarea cea mai simplă este să utilizați doar reguli `exclude` pentru a elimina toate fișierele și directoarele pe care nu doriți să le procesați. De exemplu: :# Exclude orice fișier numit `*.unrecoverable` :exclude *.unrecoverable :# Exclude directorul rădăcină `/lost+found` :exclude /lost+found/ :# Exclude orice subdirector numit `tmp` :exclude tmp/ Abordarea opusă este să definiți doar fișierele pe care doriți să le procesați, utilizÃĸnd doar reguli `include`. De exemplu: :# Include doar unele directoare :include /movies/ :include /musics/ :include /pictures/ Abordarea finală este de a amesteca regulile `exclude` și `include`. În acest caz, ordinea regulilor este importantă. Regulile anterioare au precedență față de cele ulterioare. Pentru a simplifica, puteți lista toate regulile `exclude` mai ÃŽntÃĸi și apoi toate regulile `include`. De exemplu: :# Exclude orice fișier numit `*.unrecoverable` :exclude *.unrecoverable :# Exclude orice subdirector numit `tmp` :exclude tmp/ :# Include doar unele directoare :include /movies/ :include /musics/ :include /pictures/ Pe linia de comandă, utilizÃĸnd opțiunea -f, puteți utiliza doar modele `include`. De exemplu: :# Verifică doar fișierele .mp3. :# În Unix, utilizați ghilimele pentru a evita expansiunea globbing de către shell. :snapraid -f "*.mp3" check În Unix, cÃĸnd utilizați caractere globbing pe linia de comandă, trebuie să le citați pentru a ÃŽmpiedica shell-ul să le extindă. Fișiere de Ignorat (Ignore File) Pe lÃĸngă regulile globale din fișierul de configurare, puteți plasa fișiere `.snapraidignore` ÃŽn orice director din array pentru a defini reguli de excludere descentralizate. Regulile definite ÃŽn `.snapraidignore` sunt aplicate după regulile din fișierul de configurare. Acest lucru ÃŽnseamnă că au o prioritate mai mare și pot fi utilizate pentru a exclude fișiere care au fost incluse anterior de configurația globală. Efectiv, dacă o regulă locală se potrivește, fișierul este exclus indiferent de setările globale de includere. Logica modelelor ÃŽn `.snapraidignore` oglindește configurația globală, dar ancorează modelele de directorul ÃŽn care se află fișierul: =FILE Selectează orice fișier numit FILE ÃŽn acest director sau mai jos. Acesta urmează aceleași reguli de globbing ca modelul global. =DIR/ Selectează orice director numit DIR și tot ce se află ÃŽn interior, aflat ÃŽn acest director sau mai jos. =/PATH/FILE Selectează fișierul exact specificat raportat la locația fișierului `.snapraidignore`. =/PATH/DIR/ Selectează directorul exact specificat și tot ce se află ÃŽn interior, raportat la locația fișierului `.snapraidignore`. Spre deosebire de configurația globală, fișierele `.snapraidignore` suportă doar reguli de excludere; nu puteți utiliza modele de `include` sau negația (!). De exemplu, dacă aveți un `.snapraidignore` ÃŽn `/mnt/disk1/projects/`: :# Exclude DOAR /mnt/disk1/projects/output.bin :/output.bin :# Exclude orice director numit `build` ÃŽn interiorul projects/ :build/ :# Exclude orice fișier .tmp ÃŽn interiorul projects/ sau subfolderele sale :*.tmp Conținut (Content) SnapRAID stochează lista și sumele de control (checksums) ale fișierelor dvs. ÃŽn fișierul de conținut. Este un fișier binar care listează toate fișierele prezente ÃŽn matricea dvs. de discuri, ÃŽmpreună cu toate sumele de control pentru a le verifica integritatea. Acest fișier este citit și scris de comenzile `sync` și `scrub` și citit de comenzile `fix`, `check` și `status`. Paritate (Parity) SnapRAID stochează informațiile de paritate ale matricei dvs. ÃŽn fișierele de paritate. Acestea sunt fișiere binare care conțin paritatea calculată a tuturor blocurilor definite ÃŽn fișierul de `content`. Aceste fișiere sunt citite și scrise de comenzile `sync` și `fix` și doar citite de comenzile `scrub` și `check`. Codare (Encoding) SnapRAID ÃŽn Unix ignoră orice codare. Citește și stochează numele fișierelor cu aceeași codare utilizată de sistemul de fișiere. În Windows, toate numele citite din sistemul de fișiere sunt convertite și procesate ÃŽn format UTF-8. Pentru a avea numele fișierelor tipărite corect, trebuie să setați consola Windows ÃŽn modul UTF-8 cu comanda `chcp 65001` și să utilizați un font TrueType precum `Lucida Console` ca font al consolei. Acest lucru afectează doar numele de fișiere tipărite; dacă redirecționați ieșirea consolei către un fișier, fișierul rezultat este ÃŽntotdeauna ÃŽn format UTF-8. Drept de Autor (Copyright) Acest fișier este Copyright (C) 2025 Andrea Mazzoleni Vezi și (See Also) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ro.txt000066400000000000000000002216071522717156100170140ustar00rootroot00000000000000 ========================================= SnapRAID Backup pentru Matrici de Discuri ========================================= 1 SINTAXă ========= snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIERE =========== SnapRAID este un program de backup conceput pentru matrici de discuri, care stochează informații de paritate pentru recuperarea datelor ÃŽn cazul a pÃĸnă la șase defecte de disc. Destinat ÃŽn principal centrelor media de acasă cu fișiere mari, care se schimbă rar, SnapRAID oferă cÃĸteva caracteristici: * Puteți utiliza discuri deja pline cu fișiere fără nevoia de a le reformat, accesÃĸndu-le ca de obicei. * Toate datele dvs. sunt hash-uite pentru a asigura integritatea datelor și a preveni corupția silențioasă. * CÃĸnd numărul de discuri defecte depășește numărul de parități, pierderea de date este limitată la discurile afectate; datele de pe celelalte discuri rămÃĸn accesibile. * Dacă ștergeți accidental fișiere de pe un disc, recuperarea este posibilă. * Discurile pot avea dimensiuni diferite. * Puteți adăuga discuri ÃŽn orice moment. * SnapRAID nu vă blochează datele; puteți ÃŽnceta să-l utilizați oricÃĸnd fără a reforma sau muta date. * Pentru a accesa un fișier, este necesar să se rotească doar un singur disc, economisind energie și reducÃĸnd zgomotul. Pentru mai multe informații, vă rugăm să vizitați site-ul oficial SnapRAID: https://www.snapraid.it/ 3 LIMITăRI ========== SnapRAID este un hibrid ÃŽntre un program RAID și unul de backup, care urmărește să combine cele mai bune beneficii ale ambelor. Cu toate acestea, are unele limitări pe care ar trebui să le luați ÃŽn considerare ÃŽnainte de a-l utiliza. Principala limitare este că, dacă un disc se defectează și nu ați făcut recent o sincronizare, este posibil să nu puteți recupera complet. Mai exact, este posibil să nu puteți recupera pÃĸnă la dimensiunea fișierelor modificate sau șterse de la ultima operațiune de sincronizare. Acest lucru se ÃŽntÃĸmplă chiar dacă fișierele modificate sau șterse nu sunt pe discul defect. Acesta este motivul pentru care SnapRAID este mai potrivit pentru date care se schimbă rar. Pe de altă parte, fișierele nou adăugate nu ÃŽmpiedică recuperarea fișierelor deja existente. Veți pierde doar fișierele adăugate recent dacă acestea se află pe discul defect. Alte limitări ale SnapRAID sunt: * Cu SnapRAID, aveți ÃŽn continuare sisteme de fișiere separate pentru fiecare disc. Cu RAID, obțineți un singur sistem de fișiere mare. * SnapRAID nu face striping de date. Cu RAID, obțineți un spor de viteză prin striping. * SnapRAID nu suportă recuperarea ÃŽn timp real. Cu RAID, nu trebuie să vă opriți din lucru atunci cÃĸnd un disc se defectează. * SnapRAID poate recupera date doar dintr-un număr limitat de defecte de disc. Cu un backup, puteți recupera dintr-o defecțiune completă a ÃŽntregii matrici de discuri. * Sunt salvate doar numele fișierelor, mărcile temporale, symlink-urile și hardlink-urile. Permisiunile, proprietarul și atributele extinse nu sunt salvate. 4 NOțIUNI DE BAZă ================= Pentru a utiliza SnapRAID, trebuie mai ÃŽntÃĸi să selectați un disc ÃŽn matricea dvs. de discuri pentru a-l dedica informațiilor de `paritate`. Cu un singur disc pentru paritate, veți putea recupera dintr-o singură defecțiune de disc, similar cu RAID5. Dacă doriți să recuperați din mai multe defecțiuni de disc, similar cu RAID6, trebuie să rezervați discuri suplimentare pentru paritate. Fiecare disc de paritate suplimentar permite recuperarea dintr-o defecțiune de disc ÃŽn plus. Ca discuri de paritate, trebuie să le alegeți pe cele mai mari din matrice, deoarece informațiile de paritate pot crește pÃĸnă la dimensiunea celui mai mare disc de date din matrice. Aceste discuri vor fi dedicate stocării fișierelor de `paritate`. Nu ar trebui să stocați datele dvs. pe ele. Apoi, trebuie să definiți discurile de `date` pe care doriți să le protejați cu SnapRAID. Protecția este mai eficientă dacă aceste discuri conțin date care se schimbă rar. Din acest motiv, este mai bine să NU includeți discul C:\ al Windows sau directoarele Unix /home, /var și /tmp. Lista de fișiere este salvată ÃŽn fișierele de `conținut`, de obicei stocate pe discurile de date, de paritate sau de boot. Acest fișier conține detaliile backup-ului dvs., inclusiv toate sumele de control (checksums) pentru a-i verifica integritatea. Fișierul de `conținut` este stocat ÃŽn mai multe copii, iar fiecare copie trebuie să fie pe un disc diferit pentru a se asigura că, chiar și ÃŽn cazul a multiple defecte de disc, cel puțin o copie este disponibilă. De exemplu, să presupunem că sunteți interesați doar de un singur nivel de paritate de protecție și discurile dvs. se află la: /mnt/diskp <- discul selectat pentru paritate /mnt/disk1 <- primul disc de protejat /mnt/disk2 <- al doilea disc de protejat /mnt/disk3 <- al treilea disc de protejat Trebuie să creați fișierul de configurare /etc/snapraid.conf cu următoarele opțiuni: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Dacă sunteți pe Windows, ar trebui să utilizați formatul de cale Windows, cu litere de unitate și backslash-uri ÃŽn loc de slash-uri. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Dacă aveți multe discuri și rămÃĸneți fără litere de unitate, puteți monta discurile direct ÃŽn subfoldere. Vedeți: https://www.google.com/search?q=Windows+mount+point În acest moment, sunteți gata să rulați comanda `sync` pentru a construi informațiile de paritate. snapraid sync Acest proces poate dura cÃĸteva ore prima dată, ÃŽn funcție de dimensiunea datelor deja prezente pe discuri. Dacă discurile sunt goale, procesul este imediat. Îl puteți opri oricÃĸnd apăsÃĸnd Ctrl+C, iar la următoarea rulare, va relua de unde a fost ÃŽntrerupt. CÃĸnd această comandă se finalizează, datele dvs. sunt ÎN SIGURANȚĂ. Acum puteți ÃŽncepe să utilizați matricea după cum doriți și să actualizați periodic informațiile de paritate rulÃĸnd comanda `sync`. 4.1 Scrubbing (Verificare) -------------------------- Pentru a verifica periodic datele și paritatea pentru erori, puteți rula comanda `scrub`. snapraid scrub Această comandă compară datele din matricea dvs. cu hash-ul calculat ÃŽn timpul comenzii `sync` pentru a verifica integritatea. Fiecare rulare a comenzii verifică aproximativ 8% din matrice, excluzÃĸnd datele deja verificate ÃŽn ultimele 10 zile. Puteți utiliza opțiunea -p, --plan pentru a specifica o cantitate diferită și opțiunea -o, --older-than pentru a specifica o vÃĸrstă diferită ÃŽn zile. De exemplu, pentru a verifica 5% din matrice pentru blocuri mai vechi de 20 de zile, utilizați: snapraid -p 5 -o 20 scrub Dacă se găsesc erori silențioase sau de intrare/ieșire ÃŽn timpul procesului, blocurile corespunzătoare sunt marcate ca fiind defecte ÃŽn fișierul de `conținut` și listate ÃŽn comanda `status`. snapraid status Pentru a le repara, puteți utiliza comanda `fix`, filtrÃĸnd pentru blocuri defecte cu opțiunea -e, --filter-error: snapraid -e fix La următorul `scrub`, erorile vor dispărea din raportul `status` dacă sunt ÃŽntr-adevăr reparate. Pentru a face mai rapid, puteți utiliza -p bad pentru a verifica doar blocurile marcate ca defecte. snapraid -p bad scrub Rularea `scrub` pe o matrice nesincronizată poate raporta erori cauzate de fișiere eliminate sau modificate. Aceste erori sunt raportate ÃŽn ieșirea `scrub`, dar blocurile aferente nu sunt marcate ca defecte. 4.2 Pooling (Agregare) ---------------------- Notă: Funcționalitatea de pooling descrisă mai jos a fost ÃŽnlocuită de instrumentul mergerfs, care este acum opțiunea recomandată pentru utilizatorii Linux ÃŽn comunitatea SnapRAID. Mergefs oferă o modalitate mai flexibilă și eficientă de a agrega mai multe discuri ÃŽntr-un singur punct de montare unificat, permițÃĸnd accesul neÃŽntrerupt la fișiere pe toată matricea dvs. fără a se baza pe link-uri simbolice. Se integrează bine cu SnapRAID pentru protecția parității și este utilizat ÃŽn mod obișnuit ÃŽn configurații precum OpenMediaVault (OMV) sau configurații NAS personalizate. Pentru a avea toate fișierele din matricea dvs. afișate ÃŽn același arbore de directoare, puteți activa funcționalitatea de `pooling`. Aceasta creează o vizualizare virtuală doar ÃŽn citire a tuturor fișierelor din matricea dvs. folosind link-uri simbolice. Puteți configura directorul de `pooling` ÃŽn fișierul de configurare cu: pool /pool sau, dacă sunteți pe Windows, cu: pool C:\pool și apoi rulați comanda `pool` pentru a crea sau actualiza vizualizarea virtuală. snapraid pool Dacă utilizați o platformă Unix și doriți să partajați acest director peste rețea către mașini Windows sau Unix, ar trebui să adăugați următoarele opțiuni la /etc/samba/smb.conf: # În secțiunea global a smb.conf unix extensions = no # În secțiunea share a smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes În Windows, partajarea link-urilor simbolice peste o rețea necesită ca clienții să le rezolve de la distanță. Pentru a permite acest lucru, pe lÃĸngă partajarea directorului pool, trebuie să partajați și toate discurile ÃŽn mod independent, folosind numele discurilor definite ÃŽn fișierul de configurare ca puncte de partajare. De asemenea, trebuie să specificați ÃŽn opțiunea `share` din fișierul de configurare calea UNC Windows pe care clienții la distanță trebuie să o folosească pentru a accesa aceste discuri partajate. De exemplu, operÃĸnd de pe un server numit `darkstar`, puteți utiliza opțiunile: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar și partajați următoarele directoare peste rețea: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array pentru a permite clienților la distanță să acceseze toate fișierele la \\darkstar\pool. De asemenea, ar putea fi necesar să configurați clienții la distanță pentru a permite accesul la symlink-uri la distanță cu comanda: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting (Anulare Ștergere) --------------------------------- SnapRAID funcționează mai mult ca un program de backup decÃĸt un sistem RAID și poate fi folosit pentru a restaura sau anula ștergerea fișierelor la starea lor anterioară utilizÃĸnd opțiunea -f, --filter: snapraid fix -f FILE sau pentru un director: snapraid fix -f DIR/ De asemenea, ÃŽl puteți utiliza pentru a recupera doar fișiere șterse accidental ÃŽn interiorul unui director folosind opțiunea -m, --filter-missing, care restaurează doar fișierele lipsă, lăsÃĸndu-le pe toate celelalte neatinse. snapraid fix -m -f DIR/ Sau pentru a recupera toate fișierele șterse de pe toate unitățile cu: snapraid fix -m 4.4 Recuperare -------------- Cel mai rău s-a ÃŽntÃĸmplat și ați pierdut unul sau mai multe discuri! NU INTRAȚI ÎN PANICĂ! Veți putea să le recuperați! Primul lucru pe care trebuie să-l faceți este să evitați modificările ulterioare la matricea dvs. de discuri. Dezactivați orice conexiuni la distanță la aceasta și orice procese programate, inclusiv orice sincronizare sau verificare SnapRAID programată pe timp de noapte. Apoi continuați cu următorii pași. ---- 4.4.1 PASUL 1 -> Reconfigurare ---- Aveți nevoie de spațiu pentru a recupera, ideal pe discuri de rezervă suplimentare, dar un disc USB extern sau un disc la distanță vor fi suficiente. Modificați fișierul de configurare SnapRAID pentru a face ca opțiunea `data` sau `parity` a discului defect să indice o locație cu suficient spațiu gol pentru a recupera fișierele. De exemplu, dacă discul `d1` a eșuat, schimbați de la: data d1 /mnt/disk1/ la: data d1 /mnt/new_spare_disk/ Dacă discul de recuperat este un disc de paritate, actualizați opțiunea `parity` corespunzătoare. Dacă aveți mai multe discuri defecte, actualizați toate opțiunile lor de configurare. ---- 4.4.2 PASUL 2 -> Reparare (Fix) ---- Rulați comanda fix, stocÃĸnd jurnalul ÃŽntr-un fișier extern cu: snapraid -d NAME -l fix.log fix Unde NAME este numele discului, cum ar fi `d1` ÃŽn exemplul nostru anterior. Dacă discul de recuperat este un disc de paritate, utilizați numele `parity`, `2-parity`, etc. Dacă aveți mai multe discuri defecte, utilizați mai multe opțiuni -d pentru a le specifica pe toate. Această comandă va dura mult timp. Asigurați-vă că aveți cÃĸțiva gigabytes liberi pentru a stoca fișierul fix.log. Rulați-l de pe un disc cu suficient spațiu liber. Acum ați recuperat tot ce este recuperabil. Dacă unele fișiere sunt parțial sau total nerecuperabile, vor fi redenumite adăugÃĸnd extensia `.unrecoverable`. Puteți găsi o listă detaliată a tuturor blocurilor nerecuperabile ÃŽn fișierul fix.log verificÃĸnd toate liniile care ÃŽncep cu `unrecoverable:`. Dacă nu sunteți mulțumit de recuperare, o puteți reÃŽncerca de cÃĸte ori doriți. De exemplu, dacă ați eliminat fișiere din matrice după ultima `sync`, acest lucru poate duce la nerecuperarea unor fișiere. În acest caz, puteți reÃŽncerca `fix`-ul utilizÃĸnd opțiunea -i, --import, specificÃĸnd unde se află acum aceste fișiere pentru a le include din nou ÃŽn procesul de recuperare. Dacă sunteți mulțumit de recuperare, puteți continua, dar rețineți că după sincronizare, nu mai puteți reÃŽncerca comanda `fix` deloc! ---- 4.4.3 PASUL 3 -> Verificare (Check) ---- Ca o verificare prudentă, puteți rula acum o comandă `check` pentru a vă asigura că totul este corect pe discul recuperat. snapraid -d NAME -a check Unde NAME este numele discului, cum ar fi `d1` ÃŽn exemplul nostru anterior. Opțiunile -d și -a spun SnapRAID să verifice doar discul specificat și să ignore toate datele de paritate. Această comandă va dura mult timp, dar dacă nu sunteți excesiv de prudent, o puteți sări. ---- 4.4.4 PASUL 4 -> Sincronizare (Sync) ---- Rulați comanda `sync` pentru a resincroniza matricea cu noul disc. snapraid sync Dacă totul este recuperat, această comandă este imediată. 5 COMENZI ========= SnapRAID oferă cÃĸteva comenzi simple care vă permit să: * Tipăriți starea matricei -> `status` * Controlați discurile -> `smart`, `probe`, `up`, `down` * Faceți un backup/snapshot -> `sync` * Verificați periodic datele -> `scrub` * Restaurați ultimul backup/snapshot -> `fix`. Comenzile trebuie scrise cu litere mici. 5.1 status ---------- Tipărește un rezumat al stării matricei de discuri. Include informații despre fragmentarea parității, cÃĸt de vechi sunt blocurile fără verificare și toate erorile silențioase ÃŽnregistrate ÃŽntÃĸlnite ÃŽn timpul verificării (scrubbing). Informațiile prezentate se referă la ultima dată cÃĸnd ați rulat `sync`. Modificările ulterioare nu sunt luate ÃŽn considerare. Dacă au fost detectate blocuri defecte, numerele lor de bloc sunt listate. Pentru a le repara, puteți utiliza comanda `fix -e`. De asemenea, arată un grafic care reprezintă ultima dată cÃĸnd fiecare bloc a fost verificat (scrubbed) sau sincronizat. Blocurile verificate sunt afișate cu `*`, blocurile sincronizate, dar ÃŽncă neverificate, cu `o`. Nimic nu este modificat. 5.2 smart --------- Tipărește un raport SMART al tuturor discurilor din sistem. Include o estimare a probabilității de eșec ÃŽn anul următor, permițÃĸndu-vă să planificați ÃŽnlocuiri de ÃŽntreținere a discurilor care prezintă atribute suspecte. Această estimare a probabilității este obținută prin corelarea atributelor SMART ale discurilor cu datele Backblaze disponibile la: https://www.backblaze.com/hard-drive-test-data.html Dacă SMART raportează că un disc este pe cale să eșueze, `FAIL` sau `PREFAIL` este tipărit pentru acel disc, iar SnapRAID returnează o eroare. În acest caz, ÃŽnlocuirea imediată a discului este puternic recomandată. Alte șiruri de stare posibile sunt: logfail - În trecut, unele atribute au fost mai mici decÃĸt pragul. logerr - Jurnalul de erori al dispozitivului conține erori. selferr - Jurnalul de auto-test al dispozitivului conține erori. Dacă opțiunea -v, --verbose este specificată, este furnizată o analiză statistică mai profundă. Această analiză vă poate ajuta să decideți dacă aveți nevoie de mai multă sau mai puțină paritate. Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea `smartctl -a` pe toate dispozitivele. Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica o comandă personalizată utilizÃĸnd opțiunea `smartctl` ÃŽn fișierul de configurare. Nimic nu este modificat. 5.3 probe --------- Tipărește starea de ALIMENTARE (POWER) a tuturor discurilor din sistem. `Standby` ÃŽnseamnă că discul nu se rotește. `Active` ÃŽnseamnă că discul se rotește. Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea `smartctl -n standby -i` pe toate dispozitivele. Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica o comandă personalizată utilizÃĸnd opțiunea `smartctl` ÃŽn fișierul de configurare. Nimic nu este modificat. 5.4 up ------ Pornirea tuturor discurilor din matrice. Puteți porni doar discuri specifice utilizÃĸnd opțiunea -d, --filter-disk. Pornirea tuturor discurilor ÃŽn același timp necesită multă energie. Asigurați-vă că sursa dvs. de alimentare o poate susține. Nimic nu este modificat. 5.5 down -------- Oprirea (spin down) tuturor discurilor din matrice. Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea `smartctl -s standby,now` pe toate dispozitivele. Puteți opri doar discuri specifice utilizÃĸnd opțiunea -d, --filter-disk. Pentru a opri automat la eroare, puteți utiliza opțiunea -s, --spin-down-on-error cu orice altă comandă, care este echivalentă cu rularea manuală a `down` atunci cÃĸnd apare o eroare. Nimic nu este modificat. 5.6 diff -------- Listează toate fișierele modificate de la ultima `sync` care trebuie să li se recalculeze datele de paritate. Această comandă nu verifică datele fișierului, ci doar marca temporală, dimensiunea și inodul fișierului. După listarea tuturor fișierelor modificate, este prezentat un rezumat al modificărilor, grupate după: equal - Fișiere neschimbate față de ÃŽnainte. added - Fișiere adăugate care nu erau prezente ÃŽnainte. removed - Fișiere eliminate. updated - Fișiere cu o dimensiune sau marcă temporală diferită, ceea ce ÃŽnseamnă că au fost modificate. moved - Fișiere mutate ÃŽntr-un director diferit pe același disc. Sunt identificate avÃĸnd același nume, dimensiune, marcă temporală și inod, dar un director diferit. copied - Fișiere copiate pe același disc sau pe un disc diferit unde fișierul original ÃŽncă există. Acestea sunt identificate prin faptul că au același nume, dimensiune și amprentă temporală. Dacă amprenta temporală sub-secundă este zero, calea completă trebuie să se potrivească pentru a fi identificate, nu doar numele. relocated - Fișiere mutate pe același disc sau pe un disc diferit unde originalul a dispărut. Acestea sunt identificate prin faptul că au același nume, dimensiune și amprentă temporală. Dacă amprenta temporală sub-secundă este zero, calea completă trebuie să se potrivească pentru a fi identificate. Spre deosebire de fișierele 'moved' de pe același disc, fișierele relocate au un inod diferit. restored - Fișiere cu un inod diferit, dar care se potrivesc ca director, nume, dimensiune și amprentă temporală. Acestea sunt de obicei fișiere restaurate după ce au fost șterse. Dacă este necesară o `sync`, codul de retur al procesului este 2, ÃŽn loc de cel implicit 0. Codul de retur 1 este utilizat pentru o condiție de eroare generică. Nimic nu este modificat. 5.7 sync -------- Actualizează informațiile de paritate. Toate fișierele modificate din matricea de discuri sunt citite și datele de paritate corespunzătoare sunt actualizate. Puteți opri acest proces ÃŽn orice moment apăsÃĸnd Ctrl+C, fără a pierde munca deja efectuată. La următoarea rulare, procesul `sync` va relua de unde a fost ÃŽntrerupt. Dacă se găsesc erori silențioase sau de intrare/ieșire ÃŽn timpul procesului, blocurile corespunzătoare sunt marcate ca defecte. Fișierele sunt identificate prin cale și/sau inod și verificate prin dimensiune și marcă temporală. Dacă dimensiunea sau marca temporală a fișierului diferă, datele de paritate sunt recalculate pentru ÃŽntregul fișier. Dacă fișierul este mutat sau redenumit pe același disc, păstrÃĸnd același inod, paritatea nu este recalculată. Dacă fișierul este mutat pe un alt disc, paritatea este recalculată, dar informațiile hash calculate anterior sunt păstrate. Fișierele de `content` și `parity` sunt modificate dacă este necesar. Fișierele din matrice NU sunt modificate. 5.8 scrub --------- Verifică (scrubs) matricea, căutÃĸnd erori silențioase sau de intrare/ieșire ÃŽn discurile de date și de paritate. Fiecare invocare verifică aproximativ 8% din matrice, excluzÃĸnd datele deja verificate ÃŽn ultimele 10 zile. Acest lucru ÃŽnseamnă că verificarea o dată pe săptămÃĸnă asigură că fiecare bit de date este verificat cel puțin o dată la trei luni. Puteți defini un plan de verificare sau o cantitate diferită utilizÃĸnd opțiunea -p, --plan, care acceptă: bad - Verifică blocurile marcate ca defecte. new - Verifică blocurile tocmai sincronizate care nu au fost ÃŽncă verificate. full - Verifică totul. 0-100 - Verifică procentul specificat de blocuri. Dacă specificați o valoare procentuală, puteți utiliza și opțiunea -o, --older-than pentru a defini cÃĸt de vechi ar trebui să fie blocul. Cele mai vechi blocuri sunt verificate primele, asigurÃĸnd o verificare optimă. Dacă doriți să verificați doar blocurile tocmai sincronizate care nu au fost ÃŽncă verificate, utilizați opțiunea `-p new`. Pentru a obține detalii despre starea verificării, utilizați comanda `status`. Pentru orice eroare silențioasă sau de intrare/ieșire găsită, blocurile corespunzătoare sunt marcate ca defecte ÃŽn fișierul de `content`. Aceste blocuri defecte sunt listate ÃŽn `status` și pot fi reparate cu `fix -e`. După reparare, la următorul scrub, vor fi reverificate, iar dacă se găsesc corectate, marca defectă va fi eliminată. Pentru a verifica doar blocurile defecte, puteți utiliza comanda `scrub -p bad`. Este recomandat să rulați `scrub` doar pe o matrice sincronizată pentru a evita erorile raportate cauzate de date nesincronizate. Aceste erori sunt recunoscute ca nefiind erori silențioase, iar blocurile nu sunt marcate ca defecte, dar astfel de erori sunt raportate ÃŽn ieșirea comenzii. Fișierul de `content` este modificat pentru a actualiza ora ultimei verificări pentru fiecare bloc și pentru a marca blocurile defecte. Fișierele de `parity` NU sunt modificate. Fișierele din matrice NU sunt modificate. 5.9 fix ------- Repară toate fișierele și datele de paritate. Toate fișierele și datele de paritate sunt comparate cu starea snapshot-ului salvată la ultima `sync`. Dacă se găsește o diferență, este readusă la snapshot-ul stocat. ATENȚIE! Comanda `fix` nu face diferența ÃŽntre erori și modificări intenționate. Ea revine necondiționat la starea fișierului de la ultima `sync`. Dacă nu este specificată nicio altă opțiune, ÃŽntreaga matrice este procesată. Utilizați opțiunile de filtrare pentru a selecta un subset de fișiere sau discuri de operat. Pentru a repara doar blocurile marcate ca defecte ÃŽn timpul `sync` și `scrub`, utilizați opțiunea -e, --filter-error. Spre deosebire de alte opțiuni de filtrare, aceasta aplică reparații doar fișierelor care sunt neschimbate de la ultima `sync`. SnapRAID redenumește toate fișierele care nu pot fi reparate adăugÃĸnd extensia `.unrecoverable`. Înainte de reparare, ÃŽntreaga matrice este scanată pentru a găsi orice fișiere mutate de la ultima operațiune `sync`. Aceste fișiere sunt identificate prin marca lor temporală, ignorÃĸnd numele și directorul lor și sunt utilizate ÃŽn procesul de recuperare dacă este necesar. Dacă ați mutat unele dintre ele ÃŽn afara matricei, puteți utiliza opțiunea -i, --import pentru a specifica directoare suplimentare de scanat. Fișierele sunt identificate doar prin cale, nu prin inod. Fișierul de `content` NU este modificat. Fișierele de `parity` sunt modificate dacă este necesar. Fișierele din matrice sunt modificate dacă este necesar. 5.10 check ---------- Verifică toate fișierele și datele de paritate. Funcționează ca `fix`, dar simulează doar o recuperare și nu sunt scrise modificări ÃŽn matrice. Această comandă este destinată ÃŽn primul rÃĸnd verificării manuale, cum ar fi după un proces de recuperare sau ÃŽn alte condiții speciale. Pentru verificări periodice și programate, utilizați `scrub`. Dacă utilizați opțiunea -a, --audit-only, doar datele fișierului sunt verificate, iar datele de paritate sunt ignorate pentru o rulare mai rapidă. Fișierele sunt identificate doar prin cale, nu prin inod. Nimic nu este modificat. 5.11 list --------- Listează toate fișierele conținute ÃŽn matrice la momentul ultimei `sync`. Cu -v sau --verbose, este afișat și timpul sub-secundă. Nimic nu este modificat. 5.12 dup -------- Listează toate fișierele duplicate. Două fișiere sunt considerate egale dacă hash-urile lor se potrivesc. Datele fișierului nu sunt citite; sunt utilizate doar hash-urile precalculate. Nimic nu este modificat. 5.13 pool --------- Creează sau actualizează o vizualizare virtuală a tuturor fișierelor din matricea dvs. de discuri ÃŽn directorul de `pooling`. Fișierele nu sunt copiate, ci legate folosind link-uri simbolice. La actualizare, toate link-urile simbolice existente și subdirectoarele goale sunt șterse și ÃŽnlocuite cu noua vizualizare a matricei. Orice alte fișiere obișnuite sunt lăsate pe loc. Nimic nu este modificat ÃŽn afara directorului pool. 5.14 devices ------------ Tipărește dispozitivele de nivel scăzut utilizate de matrice. Această comandă afișează asocierile de dispozitive din matrice și este destinată ÃŽn principal ca interfață de script. Primele două coloane sunt ID-ul și calea dispozitivului de nivel scăzut. Următoarele două coloane sunt ID-ul și calea dispozitivului de nivel ÃŽnalt. Ultima coloană este numele discului din matrice. În majoritatea cazurilor, aveți un dispozitiv de nivel scăzut pentru fiecare disc din matrice, dar ÃŽn unele configurații mai complexe, puteți avea mai multe dispozitive de nivel scăzut utilizate de un singur disc din matrice. Nimic nu este modificat. 5.15 touch ---------- Setează o marcă temporală arbitrară sub-secundă pentru toate fișierele care o au setată la zero. Acest lucru ÃŽmbunătățește capacitatea SnapRAID de a recunoaște fișierele mutate și copiate, deoarece face ca marca temporală să fie aproape unică, reducÃĸnd posibilele duplicate. Mai exact, dacă marca temporală sub-secundă nu este zero, un fișier mutat sau copiat este identificat ca atare dacă se potrivește cu numele, dimensiunea și marca temporală. Dacă marca temporală sub-secundă este zero, este considerat o copie doar dacă calea completă, dimensiunea și marca temporală se potrivesc toate. Marca temporală cu precizie de secundă nu este modificată, deci toate datele și orele fișierelor dvs. vor fi păstrate. 5.16 rehash ----------- Programează o rehash-uire a ÃŽntregii matrici. Această comandă schimbă tipul de hash utilizat, de obicei la actualizarea de la un sistem pe 32 de biți la unul pe 64 de biți, pentru a trece de la MurmurHash3 la SpookyHash, care este mai rapid. Dacă utilizați deja hash-ul optim, această comandă nu face nimic și vă informează că nu este necesară nicio acțiune. Rehash-ul nu este efectuat imediat, ci are loc progresiv ÃŽn timpul `sync` și `scrub`. Puteți verifica starea rehash-ului utilizÃĸnd `status`. În timpul rehash-ului, SnapRAID ÃŽČ™i menține funcționalitatea completă, cu singura excepție că `dup` nu poate detecta fișierele duplicate folosind un hash diferit. 5.17 locate ----------- Localizează fișierele stocate pe discurile de paritate. Pentru fiecare fișier potrivit, afișează locația acestuia ÃŽn fișierul de paritate și numărul de fragmente pe care le ocupă. Puteți utiliza opțiunea -t, --tail pentru a restricționa operațiunea la fișierele care ocupă porțiunea finală specificată a parității. Dacă doriți să realocați aceste fișiere, puteți utiliza apoi opțiunea -W, --force-realloc-tail. Rețineți că astfel de fișiere nu vor fi protejate de paritate ÃŽn timpul procesului de realocare. 6 OPțIUNI ========= SnapRAID oferă următoarele opțiuni: -c, --conf CONFIG Selectează fișierul de configurare de utilizat. Dacă nu este specificat, ÃŽn Unix utilizează fișierul `/usr/local/etc/snapraid.conf` dacă există, altfel `/etc/snapraid.conf`. În Windows, utilizează fișierul `snapraid.conf` din același director ca `snapraid.exe`. -f, --filter PATTERN Filtrează fișierele de procesat ÃŽn `check` și `fix`. Sunt procesate doar fișierele care se potrivesc cu modelul specificat. Această opțiune poate fi utilizată de mai multe ori. Vedeți secțiunea PATTERN pentru mai multe detalii despre specificațiile modelului. În Unix, asigurați-vă că caracterele globbing sunt citate dacă sunt utilizate. Această opțiune poate fi utilizată doar cu `check` și `fix`. Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. -d, --filter-disk NAME Filtrează discurile de procesat ÃŽn `check`, `fix`, `up` și `down`. Trebuie să specificați un nume de disc așa cum este definit ÃŽn fișierul de configurare. Puteți specifica și discurile de paritate cu numele: `parity`, `2-parity`, `3-parity`, etc., pentru a limita operațiunile la un anumit disc de paritate. Dacă combinați mai multe opțiuni --filter, --filter-disk și --filter-missing, sunt selectate doar fișierele care se potrivesc cu toate filtrele. Această opțiune poate fi utilizată de mai multe ori. Această opțiune poate fi utilizată doar cu `check`, `fix`, `up` și `down`. Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. -m, --filter-missing Filtrează fișierele de procesat ÃŽn `check` și `fix`. Sunt procesate doar fișierele lipsă sau șterse din matrice. CÃĸnd este utilizată cu `fix`, aceasta acționează ca o comandă de `undelete` (anulare ștergere). Dacă combinați mai multe opțiuni --filter, --filter-disk și --filter-missing, sunt selectate doar fișierele care se potrivesc cu toate filtrele. Această opțiune poate fi utilizată doar cu `check` și `fix`. Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea procesează ÃŽntotdeauna ÃŽntreaga matrice. -e, --filter-error Procesează fișierele cu erori ÃŽn `check` și `fix`. Procesează doar fișierele care au blocuri marcate cu erori silențioase sau de intrare/ieșire ÃŽn timpul `sync` și `scrub`, așa cum sunt listate ÃŽn `status`. Această opțiune poate fi utilizată doar cu `check` și `fix`. -p, --plan PERC|bad|new|full Selectează planul de verificare (scrub). Dacă PERC este o valoare numerică de la 0 la 100, este interpretată ca procentul de blocuri de verificat. În loc de un procent, puteți specifica un plan: `bad` verifică blocurile defecte, `new` verifică blocurile care nu au fost ÃŽncă verificate, iar `full` verifică totul. Această opțiune poate fi utilizată doar cu `scrub`. -o, --older-than DAYS Selectează cea mai veche parte a matricei de procesat ÃŽn `scrub`. DAYS este vÃĸrsta minimă ÃŽn zile pentru ca un bloc să fie verificat; valoarea implicită este 10. Blocurile marcate ca defecte sunt ÃŽntotdeauna verificate, indiferent de această opțiune. Această opțiune poate fi utilizată doar cu `scrub`. -a, --audit-only În `check`, verifică hash-ul fișierelor fără a verifica datele de paritate. Dacă sunteți interesați doar de verificarea datelor fișierului, această opțiune poate accelera semnificativ procesul de verificare. Această opțiune poate fi utilizată doar cu `check`. -h, --pre-hash În `sync`, rulează o fază preliminară de hashing a tuturor datelor noi pentru o verificare suplimentară ÃŽnainte de calculul parității. De obicei, ÃŽn `sync`, nu se face hashing preliminar, iar datele noi sunt hash-uite chiar ÃŽnainte de calculul parității, atunci cÃĸnd sunt citite pentru prima dată. Acest proces are loc atunci cÃĸnd sistemul este sub ÃŽncărcare mare, cu toate discurile rotindu-se și un CPU ocupat. Aceasta este o condiție extremă pentru mașină și, dacă are o problemă hardware latentă, erorile silențioase pot trece nedetectate deoarece datele nu sunt ÃŽncă hash-uite. Pentru a evita acest risc, puteți activa modul `pre-hash` pentru a avea toate datele citite de două ori pentru a le asigura integritatea. Această opțiune verifică și fișierele mutate ÃŽn cadrul matricei pentru a se asigura că operațiunea de mutare a fost reușită și, dacă este necesar, vă permite să rulați o operațiune de reparare (fix) ÃŽnainte de a continua. Această opțiune poate fi utilizată doar cu `sync`. -i, --import DIR Importă din directorul specificat orice fișiere șterse din matrice după ultima `sync`. Dacă mai aveți astfel de fișiere, ele pot fi utilizate de `check` și `fix` pentru a ÃŽmbunătăți procesul de recuperare. Fișierele sunt citite, inclusiv ÃŽn subdirectoare, și sunt identificate indiferent de numele lor. Această opțiune poate fi utilizată doar cu `check` și `fix`. -s, --spin-down-on-error La orice eroare, oprește (spin down) toate discurile gestionate ÃŽnainte de a ieși cu un cod de stare diferit de zero. Acest lucru ÃŽmpiedică unitățile să rămÃĸnă active și să se rotească după o operațiune ÃŽntreruptă, ajutÃĸnd la evitarea acumulării inutile de căldură și a consumului de energie. Utilizați această opțiune pentru a vă asigura că discurile sunt oprite ÃŽn siguranță chiar și atunci cÃĸnd o comandă eșuează. -w, --bw-limit RATE Aplică o limită globală de lățime de bandă pentru toate discurile. RATE este numărul de octeți pe secundă. Puteți specifica un multiplicator cum ar fi K, M sau G (de exemplu, --bw-limit 1G). -t, --tail DIMENSIUNE Limitează listarea fișierelor la cele care nu utilizează mai mult de dimensiunea finală specificată a discurilor de paritate. Puteți utiliza multiplicatori precum K, M, G sau T (ex. --tail 1G). Această opțiune este valabilă numai atunci cÃĸnd este utilizată ÃŽmpreună cu comanda `locate`. -A, --stats Activează o vizualizare de stare extinsă care arată informații suplimentare. Ecranul afișează două grafice: Primul grafic arată numărul de dungi (stripes) tamponate pentru fiecare disc, ÃŽmpreună cu calea fișierului care este accesat ÃŽn prezent pe acel disc. În mod obișnuit, cel mai lent disc nu va avea tampon disponibil, ceea ce determină lățimea de bandă maximă realizabilă. Al doilea grafic arată procentul de timp petrecut așteptÃĸnd ÃŽn ultimele 100 de secunde. Este de așteptat ca cel mai lent disc să cauzeze cea mai mare parte a timpului de așteptare, ÃŽn timp ce alte discuri ar trebui să aibă puțin sau deloc timp de așteptare, deoarece ÃŽČ™i pot utiliza dungile tamponate. Acest grafic arată și timpul petrecut așteptÃĸnd calculele hash și calculele RAID. Toate calculele rulează ÃŽn paralel cu operațiunile de disc. Prin urmare, atÃĸta timp cÃĸt există timp de așteptare măsurabil pentru cel puțin un disc, indică faptul că CPU-ul este suficient de rapid pentru a ține pasul cu sarcina de lucru. -Z, --force-zero Forțează operațiunea nesigură de sincronizare a unui fișier cu dimensiunea zero care era anterior non-zero. Dacă SnapRAID detectează o astfel de condiție, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cu ușurință cÃĸnd, după o cădere de sistem, unele fișiere accesate au fost trunchiate. Aceasta este o condiție posibilă ÃŽn Linux cu sistemele de fișiere ext3/ext4. Această opțiune poate fi utilizată doar cu `sync`. -E, --force-empty Forțează operațiunea nesigură de sincronizare a unui disc cu toate fișierele originale lipsă. Dacă SnapRAID detectează că toate fișierele prezente inițial pe disc lipsesc sau au fost rescrise, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cu ușurință cÃĸnd un sistem de fișiere de date nu este montat. Este permis, totuși, să aveți o singură schimbare de UUID cu paritate simplă și mai multe cu paritate multiplă, deoarece acesta este cazul normal la ÃŽnlocuirea discurilor după o recuperare. Această opțiune poate fi utilizată doar cu `sync`, `check` sau `fix`. -U, --force-uuid Forțează operațiunea nesigură de sincronizare, verificare și reparare cu discuri care și-au schimbat UUID-ul. Dacă SnapRAID detectează că unele discuri și-au schimbat UUID-ul, se oprește din a continua dacă nu specificați această opțiune. Acest lucru vă permite să detectați cÃĸnd discurile dvs. sunt montate la punctele de montare greșite. Este permis, totuși, să aveți o singură schimbare de UUID cu paritate simplă și mai multe cu paritate multiplă, deoarece acesta este cazul normal la ÃŽnlocuirea discurilor după o recuperare. Această opțiune poate fi utilizată doar cu `sync`, `check` sau `fix`. -D, --force-device Forțează operațiunea nesigură de reparare cu discuri inaccesibile sau cu discuri pe același dispozitiv fizic. De exemplu, dacă ați pierdut două discuri de date și aveți un disc de rezervă pentru a recupera doar primul, puteți ignora al doilea disc inaccesibil. Sau, dacă doriți să recuperați un disc ÃŽn spațiul liber rămas pe un disc deja utilizat, partajÃĸnd același dispozitiv fizic. Această opțiune poate fi utilizată doar cu `fix`. -N, --force-nocopy În `sync`, `check` și `fix`, dezactivează euristica de detectare a copiei. Fără această opțiune, SnapRAID presupune că fișierele cu aceleași atribute, cum ar fi numele, dimensiunea și marca temporală, sunt copii cu aceleași date. Acest lucru permite identificarea fișierelor copiate sau mutate de pe un disc pe altul și refolosirea informațiilor hash deja calculate pentru a detecta erori silențioase sau pentru a recupera fișiere lipsă. În unele cazuri rare, acest comportament poate duce la rezultate fals pozitive sau la un proces lent din cauza multor verificări hash, iar această opțiune vă permite să rezolvați astfel de probleme. Această opțiune poate fi utilizată doar cu `sync`, `check` și `fix`. -F, --force-full În `sync`, forțează o recalculare completă a parității. Această opțiune poate fi utilizată atunci cÃĸnd adăugați un nou nivel de paritate sau dacă ați revenit la un fișier de conținut vechi utilizÃĸnd date de paritate mai recente. În loc să recreați paritatea de la zero, aceasta vă permite să reutilizați hash-urile prezente ÃŽn fișierul de conținut pentru a valida datele și a menține protecția datelor ÃŽn timpul procesului `sync` utilizÃĸnd datele de paritate existente. Această opțiune poate fi utilizată doar cu `sync`. -R, --force-realloc În `sync`, forțează o realocare completă a fișierelor și o reconstruire a parității. Această opțiune poate fi utilizată pentru a realoca complet toate fișierele, eliminÃĸnd fragmentarea, ÃŽn timp ce reutilizați hash-urile prezente ÃŽn fișierul de conținut pentru a valida datele. Această opțiune poate fi utilizată doar cu `sync`. ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu o utilizați. NU aveți protecție a datelor ÃŽn timpul operațiunii `sync`. -W, --force-realloc-tail DIMENSIUNE Funcționează ca -R, --force-realloc, dar limitat la porțiunea finală specificată (ultimii DIMENSIUNE octeți) ai fiecărui fișier de paritate. Forțează realocarea (mutarea) oricăror fragmente/blocuri de fișiere stocate ÃŽn prezent ÃŽn acea secțiune finală, permițÃĸndu-le să fie plasate oriunde ÃŽn fișierul/fișierele de paritate unde este disponibil spațiu liber (inclusiv golurile existente). Scopul principal al acestei opțiuni este de a reduce dimensiunea pe disc a fișierului de paritate. Dacă realocarea eliberează cu succes ÃŽntreaga secțiune finală (nu mai rămÃĸn blocuri care să o utilizeze), fișierul de paritate este trunchiat, recuperÃĸnd spațiul final neutilizat. Puteți utiliza multiplicatori precum K, M, G sau T (ex. --force-realloc-tail 1G). Puteți utiliza locate -t, --tail pentru a cunoaște ÃŽn avans fișierele afectate. AVERTIZARE! Această opțiune este doar pentru experți și se recomandă insistent să nu fie utilizată. NU beneficiați de protecție a datelor ÃŽn timpul operațiunii `sync` pentru fișierele afectate. -l, --log FILE Scrie un jurnal detaliat ÃŽn fișierul specificat. Dacă această opțiune nu este specificată, erorile neașteptate sunt tipărite pe ecran, putÃĸnd rezulta o ieșire excesivă ÃŽn caz de multe erori. CÃĸnd -l, --log este specificat, doar erorile fatale care fac SnapRAID să se oprească sunt tipărite pe ecran. Dacă calea ÃŽncepe cu `>>`, fișierul este deschis ÃŽn modul de adăugare. Aparițiile de `%D` și `%T` ÃŽn nume sunt ÃŽnlocuite cu data și ora ÃŽn formatul YYYYMMDD și HHMMSS. În fișierele batch Windows, trebuie să dublați caracterul `%`, de exemplu, result-%%D.log. Pentru a utiliza `>>`, trebuie să ÃŽnchideți numele ÃŽntre ghilimele, de exemplu, `">>result.log"`. Pentru a scoate jurnalul la ieșirea standard sau la eroarea standard, puteți utiliza `">&1"` și `">&2"`, respectiv. Vedeți fișierul snapraid_log.txt sau pagina de manual pentru descrieri ale etichetelor jurnalului. -L, --error-limit NUMBER Setează o nouă limită de erori ÃŽnainte de a opri execuția. În mod implicit, SnapRAID se oprește dacă ÃŽntÃĸlnește mai mult de 100 de erori de intrare/ieșire, indicÃĸnd că un disc probabil eșuează. Această opțiune afectează `sync` și `scrub`, cărora li se permite să continue după primul set de erori de disc pentru a ÃŽncerca să ÃŽČ™i finalizeze operațiunile. Cu toate acestea, `check` și `fix` se opresc ÃŽntotdeauna la prima eroare. -S, --start BLKSTART Începe procesarea de la numărul de bloc specificat. Acest lucru poate fi util pentru a reÃŽncerca verificarea sau repararea anumitor blocuri ÃŽn cazul unui disc deteriorat. Această opțiune este ÃŽn principal pentru recuperarea manuală avansată. -B, --count BLKCOUNT Procesează doar numărul specificat de blocuri. Această opțiune este ÃŽn principal pentru recuperarea manuală avansată. -C, --gen-conf CONTENT Generează un fișier de configurare fictiv dintr-un fișier de conținut existent. Fișierul de configurare este scris la ieșirea standard și nu suprascrie unul existent. Acest fișier de configurare conține și informațiile necesare pentru a reconstrui punctele de montare a discului ÃŽn cazul ÃŽn care pierdeți ÃŽntregul sistem. -v, --verbose Tipărește mai multe informații pe ecran. Dacă este specificat o dată, tipărește fișierele excluse și statistici suplimentare. Această opțiune nu are niciun efect asupra fișierelor jurnal. -q, --quiet Tipărește mai puține informații pe ecran. Dacă este specificat o dată, elimină bara de progres; de două ori, operațiunile ÃŽn curs; de trei ori, mesajele info ; de patru ori, mesajele de stare. Erorile fatale sunt ÃŽntotdeauna tipărite pe ecran. Această opțiune nu are niciun efect asupra fișierelor jurnal. -H, --help Tipărește un ecran de ajutor scurt. -V, --version Tipărește versiunea programului. 7 CONFIGURARE ============= SnapRAID necesită un fișier de configurare pentru a ști unde se află matricea dvs. de discuri și unde să stocheze informațiile de paritate. În Unix, utilizează fișierul `/usr/local/etc/snapraid.conf` dacă există, altfel `/etc/snapraid.conf`. În Windows, utilizează fișierul `snapraid.conf` din același director ca `snapraid.exe`. Trebuie să conțină următoarele opțiuni (sensibile la majuscule/minuscule): 7.1 parity FILE [,FILE] ... --------------------------- Definește fișierele de utilizat pentru a stoca informațiile de paritate. Paritatea permite protecția ÃŽmpotriva unei singure defecțiuni de disc, similar cu RAID5. Puteți specifica mai multe fișiere, care trebuie să fie pe discuri diferite. CÃĸnd un fișier nu mai poate crește, este utilizat următorul. Spațiul total disponibil trebuie să fie cel puțin la fel de mare ca cel mai mare disc de date din matrice. Puteți adăuga fișiere de paritate suplimentare mai tÃĸrziu, dar nu le puteți reordona sau elimina. Păstrarea discurilor de paritate rezervate pentru paritate asigură că nu devin fragmentate, ÃŽmbunătățind performanța. În Windows, 256 MB sunt lăsați neutilizați pe fiecare disc pentru a evita avertismentul despre discuri pline. Această opțiune este obligatorie și poate fi utilizată o singură dată. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- Definește fișierele de utilizat pentru a stoca informații de paritate suplimentare. Pentru fiecare nivel de paritate specificat, este activat un nivel suplimentar de protecție: * 2-parity activează paritatea dublă RAID6. * 3-parity activează paritatea triplă. * 4-parity activează paritatea quad (patru). * 5-parity activează paritatea penta (cinci). * 6-parity activează paritatea hexa (șase). Fiecare nivel de paritate necesită prezența tuturor nivelurilor de paritate anterioare. Aceleași considerații ca pentru opțiunea `parity` se aplică. Aceste opțiuni sunt opționale și pot fi utilizate o singură dată. 7.3 z-parity FILE [,FILE] ... ----------------------------- Definește un fișier și un format alternativ pentru a stoca paritatea triplă. Această opțiune este o alternativă la `3-parity`, destinată ÃŽn primul rÃĸnd CPU-urilor low-end precum ARM sau AMD Phenom, Athlon și Opteron care nu suportă setul de instrucțiuni SSSE3. În astfel de cazuri, oferă o performanță mai bună. Acest format este similar, dar mai rapid decÃĸt cel utilizat de ZFS RAIDZ3. Ca și ZFS, nu funcționează dincolo de paritatea triplă. CÃĸnd utilizați `3-parity`, veți fi avertizați dacă este recomandat să utilizați formatul `z-parity` pentru ÃŽmbunătățirea performanței. Este posibil să convertiți de la un format la altul ajustÃĸnd fișierul de configurare cu fișierul z-parity sau 3-parity dorit și utilizÃĸnd `fix` pentru a-l recrea. 7.4 content FILE ---------------- Definește fișierul de utilizat pentru a stoca lista și sumele de control (checksums) a tuturor fișierelor prezente ÃŽn matricea dvs. de discuri. Poate fi plasat pe un disc utilizat pentru date, paritate sau orice alt disc disponibil. Dacă utilizați un disc de date, acest fișier este automat exclus din procesul `sync`. Această opțiune este obligatorie și poate fi utilizată de mai multe ori pentru a salva mai multe copii ale aceluiași fișier. Trebuie să stocați cel puțin o copie pentru fiecare disc de paritate utilizat plus unul. Utilizarea de copii suplimentare nu dăunează. 7.5 data NAME DIR ----------------- Definește numele și punctul de montare al discurilor de date din matrice. NAME este utilizat pentru a identifica discul și trebuie să fie unic. DIR este punctul de montare al discului ÃŽn sistemul de fișiere. Puteți schimba punctul de montare după cum este necesar, atÃĸta timp cÃĸt păstrați NAME fix. Ar trebui să utilizați o opțiune pentru fiecare disc de date din matrice. Puteți redenumi un disc mai tÃĸrziu schimbÃĸnd NAME direct ÃŽn fișierul de configurare și apoi rulÃĸnd o comandă `sync`. În cazul redenumirii, asocierea se face utilizÃĸnd UUID-ul stocat al discurilor. 7.6 extra NAME DIR ------------------ Definește numele și punctul de montare al discurilor suplimentare care vor fi monitorizate cu comenzile `smart` și `probe`. Acest lucru este util pentru monitorizarea discurilor care nu fac parte din matrice, dar sunt necesare pentru funcționarea sistemului, cum ar fi discul de pornire. Rețineți că astfel de discuri nu sunt afectate de comenzile `up` și `down` deoarece se așteaptă ca acestea să se rotească mereu. 7.7 nohidden ------------ Exclude toate fișierele și directoarele ascunse. În Unix, fișierele ascunse sunt cele care ÃŽncep cu `.`. În Windows, sunt cele cu atributul ascuns. 7.8 exclude/include PATTERN --------------------------- Definește modelele de fișiere sau directoare de exclus sau inclus ÃŽn procesul de sincronizare. Toate modelele sunt procesate ÃŽn ordinea specificată. Dacă primul model care se potrivește este un `exclude`, fișierul este exclus. Dacă este un `include`, fișierul este inclus. Dacă niciun model nu se potrivește, fișierul este exclus dacă ultimul model specificat este un `include`, sau inclus dacă ultimul model specificat este un `exclude`. Vedeți secțiunea PATTERN pentru mai multe detalii despre specificațiile modelului. Această opțiune poate fi utilizată de mai multe ori. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- Definește dimensiunea de bază a blocului ÃŽn kibibytes pentru paritate. Un kibibyte este 1024 de octeți. Dimensiunea implicită a blocului este 256, care ar trebui să funcționeze pentru majoritatea cazurilor. ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu schimbați această valoare. Pentru a schimba această valoare ÃŽn viitor, va trebui să recreați ÃŽntreaga paritate! Un motiv pentru a utiliza o dimensiune de bloc diferită este dacă aveți multe fișiere mici, de ordinul milioanelor. Pentru fiecare fișier, chiar dacă are doar cÃĸțiva octeți, este alocat un bloc ÃŽntreg de paritate, iar cu multe fișiere, acest lucru poate duce la un spațiu de paritate neutilizat semnificativ. CÃĸnd umpleți complet discul de paritate, nu vi se permite să adăugați mai multe fișiere pe discurile de date. Cu toate acestea, paritatea irosită nu se acumulează pe discurile de date. Spațiul irosit rezultat dintr-un număr mare de fișiere pe un disc de date limitează doar cantitatea de date de pe acel disc de date, nu pe celelalte. Ca o aproximare, puteți presupune că jumătate din dimensiunea blocului este irosită pentru fiecare fișier. De exemplu, cu 100.000 de fișiere și o dimensiune de bloc de 256 KiB, veți irosi 12,8 GB de paritate, ceea ce poate duce la 12,8 GB mai puțin spațiu disponibil pe discul de date. Puteți verifica cantitatea de spațiu irosit pe fiecare disc utilizÃĸnd `status`. Aceasta este cantitatea de spațiu pe care trebuie să o lăsați liberă pe discurile de date sau să o utilizați pentru fișiere care nu sunt incluse ÃŽn matrice. Dacă această valoare este negativă, ÃŽnseamnă că sunteți aproape de a umple paritatea și reprezintă spațiul pe care ÃŽl puteți irosi ÃŽncă. Pentru a evita această problemă, puteți utiliza o partiție mai mare pentru paritate. De exemplu, dacă partiția de paritate este cu 12,8 GB mai mare decÃĸt discurile de date, aveți suficient spațiu suplimentar pentru a gestiona pÃĸnă la 100.000 de fișiere pe fiecare disc de date fără niciun spațiu irosit. Un truc pentru a obține o partiție de paritate mai mare ÃŽn Linux este să o formatați cu comanda: mkfs.ext4 -m 0 -T largefile4 DEVICE Acest lucru duce la aproximativ 1,5% spațiu suplimentar, aproximativ 60 GB pentru un disc de 4 TB, ceea ce permite aproximativ 460.000 de fișiere pe fiecare disc de date fără niciun spațiu irosit. 7.10 hashsize SIZE_IN_BYTES --------------------------- Definește dimensiunea hash-ului ÃŽn octeți pentru blocurile salvate. Dimensiunea implicită a hash-ului este de 16 octeți (128 de biți), care ar trebui să funcționeze pentru majoritatea cazurilor. ATENȚIE! Această opțiune este doar pentru experți și este puternic recomandat să nu schimbați această valoare. Pentru a schimba această valoare ÃŽn viitor, va trebui să recreați ÃŽntreaga paritate! Un motiv pentru a utiliza o dimensiune de hash diferită este dacă sistemul dvs. are memorie limitată. Ca regulă generală, SnapRAID necesită de obicei 1 GiB de RAM pentru fiecare 16 TB de date din matrice. Mai exact, pentru a stoca hash-urile datelor, SnapRAID necesită aproximativ TS*(1+HS)/BS octeți de RAM, unde TS este dimensiunea totală ÃŽn octeți a matricei dvs. de discuri, BS este dimensiunea blocului ÃŽn octeți, iar HS este dimensiunea hash-ului ÃŽn octeți. De exemplu, cu 8 discuri de 4 TB, o dimensiune de bloc de 256 KiB (1 KiB = 1024 octeți) și o dimensiune de hash de 16, obțineți: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB TrecÃĸnd la o dimensiune de hash de 8, obțineți: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB TrecÃĸnd la o dimensiune de bloc de 512, obțineți: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB TrecÃĸnd la ambele, o dimensiune de hash de 8 și o dimensiune de bloc de 512, obțineți: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- Salvează automat starea la sincronizare sau verificare după cantitatea specificată de GB procesați. Această opțiune este utilă pentru a evita repornirea comenzilor `sync` lungi de la zero dacă sunt ÃŽntrerupte de o cădere a mașinii sau de orice alt eveniment. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Setează temperatura maximă permisă a discului ÃŽn Celsius. CÃĸnd este specificată, SnapRAID verifică periodic temperatura tuturor discurilor utilizÃĸnd instrumentul smartctl. Temperaturile curente ale discurilor sunt afișate ÃŽn timp ce SnapRAID funcționează. Dacă un disc depășește această limită, toate operațiunile se opresc, iar discurile sunt oprite (puse ÃŽn standby) pentru durata definită de opțiunea `temp_sleep`. După perioada de așteptare, operațiunile reiau, putÃĸnd ÃŽntrerupe din nou dacă limita de temperatură este atinsă ÃŽncă o dată. În timpul funcționării, SnapRAID analizează și curba de ÃŽncălzire a fiecărui disc și estimează temperatura constantă pe termen lung pe care se așteaptă să o atingă dacă activitatea continuă. Estimarea este efectuată numai după ce temperatura discului a crescut de patru ori, asigurÃĸndu-se că sunt disponibile suficiente puncte de date pentru a stabili o tendință fiabilă. Această temperatură constantă prezisă este afișată ÃŽntre paranteze lÃĸngă valoarea curentă și ajută la evaluarea dacă răcirea sistemului este adecvată. Această temperatură estimată este doar ÃŽn scop informativ și nu are niciun efect asupra comportamentului SnapRAID. Acțiunile programului se bazează exclusiv pe temperaturile reale măsurate ale discurilor. Pentru a efectua această analiză, SnapRAID are nevoie de o referință pentru temperatura sistemului. Încearcă mai ÃŽntÃĸi să o citească de la senzorii hardware disponibili. Dacă nu poate fi accesat niciun senzor de sistem, utilizează cea mai scăzută temperatură a discului măsurată la ÃŽnceputul rulării ca referință de rezervă. În mod normal, SnapRAID arată doar temperatura celui mai fierbinte disc. Pentru a afișa temperatura tuturor discurilor, utilizați opțiunea -A sau --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Setează timpul de așteptare (standby), ÃŽn minute, cÃĸnd limita de temperatură este atinsă. În această perioadă, discurile rămÃĸn oprite. Valoarea implicită este 5 minute. 7.14 pool DIR ------------- Definește directorul de pooling unde este creată vizualizarea virtuală a matricei de discuri utilizÃĸnd comanda `pool`. Directorul trebuie să existe deja. 7.15 share UNC_DIR ------------------ Definește calea UNC Windows necesară pentru a accesa discurile de la distanță. Dacă această opțiune este specificată, link-urile simbolice create ÃŽn directorul pool utilizează această cale UNC pentru a accesa discurile. Fără această opțiune, link-urile simbolice generate utilizează doar căi locale, ceea ce nu permite partajarea directorului pool peste rețea. Link-urile simbolice sunt formate utilizÃĸnd calea UNC specificată, adăugÃĸnd numele discului specificat ÃŽn opțiunea `data` și, ÃŽn final, adăugÃĸnd directorul și numele fișierului. Această opțiune este necesară doar pentru Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ Definește opțiuni smartctl personalizate pentru a obține atributele SMART pentru fiecare disc. Acest lucru poate fi necesar pentru controlerele RAID și unele discuri USB care nu pot fi detectate automat. Substituția %s este ÃŽnlocuită de numele dispozitivului, dar este opțională pentru dispozitivele fixe, cum ar fi controlerele RAID. DISK este același nume de disc specificat ÃŽn opțiunea `data`. PARITY este unul dintre numele de paritate: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` sau `z-parity`. În OPȚIUNILE specificate, șirul `%s` este ÃŽnlocuit de numele dispozitivului. Pentru controlerele RAID, dispozitivul este probabil fix și este posibil să nu fie nevoie să utilizați `%s`. Consultați documentația smartmontools pentru opțiuni posibile: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices De exemplu: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignoră atributul SMART specificat la calcularea probabilității de eșec a discului. Această opțiune este utilă dacă un disc raportează valori neobișnuite sau ÃŽnșelătoare pentru un anumit atribut. DISK este același nume de disc specificat ÃŽn opțiunea `data`. PARITY este unul dintre numele de paritate: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` sau `z-parity`. Valoarea specială * poate fi utilizată pentru a ignora atributul pe toate discurile. De exemplu, pentru a ignora atributul `Current Pending Sector Count` pe toate discurile: smartignore * 197 Pentru a-l ignora doar pe primul disc de paritate: smartignore parity 197 7.18 Exemple ------------ Un exemplu de configurare tipică pentru Unix este: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Un exemplu de configurare tipică pentru Windows este: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 MODEL (PATTERN) ================= Modelele oferă o modalitate flexibilă de a filtra fișierele pentru includere sau excludere. Folosind caractere de tip globbing, puteți defini reguli care să se potrivească cu nume de fișiere specifice sau cu structuri ÃŽntregi de directoare fără a lista manual fiecare cale. Semnul ÃŽntrebării `?` se potrivește cu orice caracter unic, cu excepția separatorului de directoare. Acest lucru ÃŽl face util pentru potrivirea numelor de fișiere cu caractere variabile, păstrÃĸnd ÃŽn același timp modelul limitat la un singur nivel de director. Asteriscul simplu `*` se potrivește cu orice secvență de caractere, dar, la fel ca semnul ÃŽntrebării, nu trece niciodată de limitele directoarelor. Se oprește la slash-ul ÃŽnainte, ceea ce ÃŽl face potrivit pentru potrivirea ÃŽn cadrul unei singure componente a căii. Acesta este comportamentul standard al metacaracterelor, familiar din shell globbing. Asteriscul dublu `**` este mai puternic, se potrivește cu orice secvență de caractere, inclusiv separatori de directoare. Acest lucru permite modelelor să se potrivească pe mai multe niveluri de directoare. CÃĸnd `**` apare inserat direct ÃŽntr-un model, se poate potrivi cu zero sau mai multe caractere, inclusiv slash-uri ÃŽntre textul literal ÃŽnconjurător. Cea mai importantă utilizare a lui `**` este ÃŽn forma specială `/**/`. Aceasta se potrivește cu zero sau mai multe niveluri complete de directoare, făcÃĸnd posibilă potrivirea fișierelor la orice adÃĸncime ÃŽntr-un arbore de directoare fără a cunoaște structura exactă a căii. De exemplu, modelul `src/**/main.js` se potrivește cu `src/main.js` (sărind peste zero directoare), `src/ui/main.js` (sărind peste un director) și `src/ui/components/main.js` (sărind peste două directoare). Clasele de caractere care utilizează paranteze pătrate `[]` se potrivesc cu un singur caracter dintr-un set sau interval specificat. La fel ca și celelalte modele de un singur caracter, acestea nu se potrivesc cu separatorii de directoare. Clasele suportă intervale și negarea folosind un semn de exclamare. Distincția fundamentală de reținut este că `*`, `?` și clasele de caractere respectă toate limitele directoarelor și se potrivesc doar ÃŽn cadrul unei singure componente a căii, ÃŽn timp ce `**` este singurul model care se poate potrivi peste separatorii de directoare. Există patru tipuri diferite de modele: FILE Selectează orice fișier cu numele FILE. Acest model se aplică numai fișierelor, nu și directoarelor. DIR/ Selectează orice director cu numele DIR și tot ce se află ÃŽn interior. Acest model se aplică numai directoarelor, nu și fișierelor. /PATH/FILE Selectează calea exactă a fișierului specificat. Acest model se aplică numai fișierelor, nu și directoarelor. /PATH/DIR/ Selectează calea exactă a directorului specificat și tot ce se află ÃŽn interior. Acest model se aplică numai directoarelor, nu și fișierelor. CÃĸnd specificați o cale absolută care ÃŽncepe cu /, aceasta este aplicată la directorul rădăcină al matricei, nu la directorul rădăcină al sistemului de fișiere local. În Windows, puteți utiliza backslash-ul \ ÃŽn loc de slash-ul /. Directoarele de sistem Windows, joncțiunile, punctele de montare și alte directoare speciale Windows sunt tratate ca fișiere, ceea ce ÃŽnseamnă că pentru a le exclude, trebuie să utilizați o regulă de fișier, nu una de director. Dacă numele fișierului conține un caracter `*`, `?`, `[`, sau `]`, trebuie să ÃŽl escape-ați pentru a evita să fie interpretat ca un caracter de globbing. În Unix, caracterul escape este `\`; ÃŽn Windows, este `^`. CÃĸnd modelul este pe linia de comandă, trebuie să dublați caracterul escape pentru a evita ca acesta să fie interpretat de shell-ul de comandă. În fișierul de configurare, puteți utiliza diferite strategii pentru a filtra fișierele de procesat. Abordarea cea mai simplă este să utilizați doar reguli `exclude` pentru a elimina toate fișierele și directoarele pe care nu doriți să le procesați. De exemplu: # Exclude orice fișier numit `*.unrecoverable` exclude *.unrecoverable # Exclude directorul rădăcină `/lost+found` exclude /lost+found/ # Exclude orice subdirector numit `tmp` exclude tmp/ Abordarea opusă este să definiți doar fișierele pe care doriți să le procesați, utilizÃĸnd doar reguli `include`. De exemplu: # Include doar unele directoare include /movies/ include /musics/ include /pictures/ Abordarea finală este de a amesteca regulile `exclude` și `include`. În acest caz, ordinea regulilor este importantă. Regulile anterioare au precedență față de cele ulterioare. Pentru a simplifica, puteți lista toate regulile `exclude` mai ÃŽntÃĸi și apoi toate regulile `include`. De exemplu: # Exclude orice fișier numit `*.unrecoverable` exclude *.unrecoverable # Exclude orice subdirector numit `tmp` exclude tmp/ # Include doar unele directoare include /movies/ include /musics/ include /pictures/ Pe linia de comandă, utilizÃĸnd opțiunea -f, puteți utiliza doar modele `include`. De exemplu: # Verifică doar fișierele .mp3. # În Unix, utilizați ghilimele pentru a evita expansiunea globbing de către shell. snapraid -f "*.mp3" check În Unix, cÃĸnd utilizați caractere globbing pe linia de comandă, trebuie să le citați pentru a ÃŽmpiedica shell-ul să le extindă. 9 FIșIERE DE IGNORAT (IGNORE FILE) ================================== Pe lÃĸngă regulile globale din fișierul de configurare, puteți plasa fișiere `.snapraidignore` ÃŽn orice director din array pentru a defini reguli de excludere descentralizate. Regulile definite ÃŽn `.snapraidignore` sunt aplicate după regulile din fișierul de configurare. Acest lucru ÃŽnseamnă că au o prioritate mai mare și pot fi utilizate pentru a exclude fișiere care au fost incluse anterior de configurația globală. Efectiv, dacă o regulă locală se potrivește, fișierul este exclus indiferent de setările globale de includere. Logica modelelor ÃŽn `.snapraidignore` oglindește configurația globală, dar ancorează modelele de directorul ÃŽn care se află fișierul: FILE Selectează orice fișier numit FILE ÃŽn acest director sau mai jos. Acesta urmează aceleași reguli de globbing ca modelul global. DIR/ Selectează orice director numit DIR și tot ce se află ÃŽn interior, aflat ÃŽn acest director sau mai jos. /PATH/FILE Selectează fișierul exact specificat raportat la locația fișierului `.snapraidignore`. /PATH/DIR/ Selectează directorul exact specificat și tot ce se află ÃŽn interior, raportat la locația fișierului `.snapraidignore`. Spre deosebire de configurația globală, fișierele `.snapraidignore` suportă doar reguli de excludere; nu puteți utiliza modele de `include` sau negația (!). De exemplu, dacă aveți un `.snapraidignore` ÃŽn `/mnt/disk1/projects/`: # Exclude DOAR /mnt/disk1/projects/output.bin /output.bin # Exclude orice director numit `build` ÃŽn interiorul projects/ build/ # Exclude orice fișier .tmp ÃŽn interiorul projects/ sau subfolderele sale *.tmp 10 CONțINUT (CONTENT) ===================== SnapRAID stochează lista și sumele de control (checksums) ale fișierelor dvs. ÃŽn fișierul de conținut. Este un fișier binar care listează toate fișierele prezente ÃŽn matricea dvs. de discuri, ÃŽmpreună cu toate sumele de control pentru a le verifica integritatea. Acest fișier este citit și scris de comenzile `sync` și `scrub` și citit de comenzile `fix`, `check` și `status`. 11 PARITATE (PARITY) ==================== SnapRAID stochează informațiile de paritate ale matricei dvs. ÃŽn fișierele de paritate. Acestea sunt fișiere binare care conțin paritatea calculată a tuturor blocurilor definite ÃŽn fișierul de `content`. Aceste fișiere sunt citite și scrise de comenzile `sync` și `fix` și doar citite de comenzile `scrub` și `check`. 12 CODARE (ENCODING) ==================== SnapRAID ÃŽn Unix ignoră orice codare. Citește și stochează numele fișierelor cu aceeași codare utilizată de sistemul de fișiere. În Windows, toate numele citite din sistemul de fișiere sunt convertite și procesate ÃŽn format UTF-8. Pentru a avea numele fișierelor tipărite corect, trebuie să setați consola Windows ÃŽn modul UTF-8 cu comanda `chcp 65001` și să utilizați un font TrueType precum `Lucida Console` ca font al consolei. Acest lucru afectează doar numele de fișiere tipărite; dacă redirecționați ieșirea consolei către un fișier, fișierul rezultat este ÃŽntotdeauna ÃŽn format UTF-8. 13 DREPT DE AUTOR (COPYRIGHT) ============================= Acest fișier este Copyright (C) 2025 Andrea Mazzoleni 14 VEZI șI (SEE ALSO) ===================== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ru.1000066400000000000000000003324621522717156100163450ustar00rootroot00000000000000.TH "Đ ĐĩСĐĩŅ€Đ˛ĐŊĐžĐĩ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ SnapRAID Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐ˛" 1 .SH NAME snapraid \- Đ ĐĩСĐĩŅ€Đ˛ĐŊĐžĐĩ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ SnapRAID Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐ˛ .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAID — ŅŅ‚Đž ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đ°ĐŊĐŊĐ°Ņ Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐ˛, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ даĐŊĐŊҋ҅ в ҁĐģŅƒŅ‡Đ°Đĩ ŅĐąĐžŅ Đ´Đž ҈ĐĩŅŅ‚Đ¸ Đ´Đ¸ŅĐēОв. .PP В ĐŋĐĩŅ€Đ˛ŅƒŅŽ ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŒ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊĐ°Ņ Đ´ĐģŅ Đ´ĐžĐŧĐ°ŅˆĐŊĐ¸Ņ… ĐŧĐĩĐ´Đ¸Đ°Ņ†ĐĩĐŊŅ‚Ņ€ĐžĐ˛ ҁ йОĐģŅŒŅˆĐ¸Đŧи, Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ Ņ„Đ°ĐšĐģаĐŧи, SnapRAID ĐŋŅ€ĐĩĐ´ĐģĐ°ĐŗĐ°ĐĩŅ‚ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ„ŅƒĐŊĐēŅ†Đ¸Đš: .PD 0 .IP \(bu Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи, ҃ĐļĐĩ СаĐŋĐžĐģĐŊĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģаĐŧи, ĐąĐĩС ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸ Đ¸Ņ… ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ĐŋĐžĐģŅƒŅ‡Đ°Ņ Đē ĐŊиĐŧ Đ´ĐžŅŅ‚ŅƒĐŋ ĐēаĐē ĐžĐąŅ‹Ņ‡ĐŊĐž. .IP \(bu Đ’ŅĐĩ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ Đ´ĐģŅ ОйĐĩҁĐŋĐĩ҇ĐĩĐŊĐ¸Ņ ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ даĐŊĐŊҋ҅ и ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰ĐĩĐŊĐ¸Ņ ҁĐēŅ€Ņ‹Ņ‚ĐžĐŗĐž ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐ¸Ņ. .IP \(bu ĐšĐžĐŗĐ´Đ° Ņ‡Đ¸ŅĐģĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ĐĩŅ‚ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐŋĐžŅ‚ĐĩŅ€Ņ даĐŊĐŊҋ҅ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đŧи Đ´Đ¸ŅĐēаĐŧи; даĐŊĐŊŅ‹Đĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ… ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи. .IP \(bu Đ•ŅĐģи Đ˛Ņ‹ ҁĐģŅƒŅ‡Đ°ĐšĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊа Đ´Đ¸ŅĐēĐĩ, вОСĐŧĐžĐļĐŊĐž Đ¸Ņ… Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ. .IP \(bu Đ”Đ¸ŅĐēи ĐŧĐžĐŗŅƒŅ‚ иĐŧĐĩŅ‚ŅŒ Ņ€Đ°ĐˇĐŊŅ‹Đĩ Ņ€Đ°ĐˇĐŧĐĩҀҋ. .IP \(bu Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ дОйавĐģŅŅ‚ŅŒ Đ´Đ¸ŅĐēи в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ. .IP \(bu SnapRAID ĐŊĐĩ ĐąĐģĐžĐēĐ¸Ņ€ŅƒĐĩŅ‚ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ; Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‚Đ¸Ņ‚ŅŒ ĐĩĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐąĐĩС ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ иĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐ¸Ņ даĐŊĐŊҋ҅. .IP \(bu ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Ņ„Đ°ĐšĐģ҃ Đ´ĐžĐģĐļĐĩĐŊ Ņ€Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Đ´Đ¸ŅĐē, Ņ‡Ņ‚Đž ŅĐēĐžĐŊĐžĐŧĐ¸Ņ‚ ŅĐŊĐĩŅ€ĐŗĐ¸ŅŽ и ҁĐŊиĐļаĐĩŅ‚ ҈҃Đŧ. .PD .PP ДĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸, ĐŋĐžĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģҌĐŊŅ‹Đš ŅĐ°ĐšŅ‚ SnapRAID: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID — ŅŅ‚Đž ĐŗĐ¸ĐąŅ€Đ¸Đ´ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ RAID и ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ҁ҂ҀĐĩĐŧŅŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ ĐģŅƒŅ‡ŅˆĐ¸Đĩ ĐŋŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đ° ОйĐĩĐ¸Ņ…. ОдĐŊаĐēĐž ҃ ĐŊĐĩĐŗĐž ĐĩŅŅ‚ŅŒ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ ŅƒŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ´ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ. .PP ĐžŅĐŊОвĐŊĐžĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ СаĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ в Ņ‚ĐžĐŧ, Ņ‡Ņ‚Đž ĐĩҁĐģи Đ´Đ¸ŅĐē Đ˛Ņ‹Ņ…ĐžĐ´Đ¸Ņ‚ иС ŅŅ‚Ņ€ĐžŅ, а Đ˛Ņ‹ ĐŊĐĩдавĐŊĐž ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŽ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ. В Ņ‡Đ°ŅŅ‚ĐŊĐžŅŅ‚Đ¸, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ в ĐžĐąŅŠĐĩĐŧĐĩ, Ņ€Đ°Đ˛ĐŊĐžĐŧ Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ иСĐŧĐĩĐŊĐĩĐŊĐŊҋ҅ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ­Ņ‚Đž ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚, даĐļĐĩ ĐĩҁĐģи иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ĐŊа ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŧ Đ´Đ¸ŅĐēĐĩ. Đ’ĐžŅ‚ ĐŋĐžŅ‡ĐĩĐŧ҃ SnapRAID ĐģŅƒŅ‡ŅˆĐĩ ĐŋĐžĐ´Ņ…ĐžĐ´Đ¸Ņ‚ Đ´ĐģŅ даĐŊĐŊҋ҅, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. .PP ĐĄ Đ´Ņ€ŅƒĐŗĐžĐš ŅŅ‚ĐžŅ€ĐžĐŊŅ‹, ĐŊĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐŋŅ€ĐĩĐŋŅŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸ŅŽ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… Ņ„Đ°ĐšĐģОв. Đ’Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐĩҁĐģи ĐžĐŊи ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ĐŊа ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŧ Đ´Đ¸ŅĐēĐĩ. .PP Đ”Ņ€ŅƒĐŗĐ¸Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ SnapRAID: .PD 0 .IP \(bu ĐĄĐž SnapRAID ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ Đĩ҉Đĩ ĐžŅ‚Đ´ĐĩĐģҌĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģĐžĐ˛Ņ‹Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĄ RAID Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ ĐĩдиĐŊŅƒŅŽ йОĐģŅŒŅˆŅƒŅŽ Ņ„Đ°ĐšĐģĐžĐ˛ŅƒŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. .IP \(bu SnapRAID ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ ҇ĐĩŅ€ĐĩдОваĐŊиĐĩ даĐŊĐŊҋ҅. ĐĄ RAID Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ ĐŋŅ€Đ¸Ņ€ĐžŅŅ‚ ҁĐēĐžŅ€ĐžŅŅ‚Đ¸ ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€Ņ ҇ĐĩŅ€ĐĩдОваĐŊĐ¸ŅŽ. .IP \(bu SnapRAID ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ в Ņ€ĐĩаĐģҌĐŊĐžĐŧ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐĄ RAID ваĐŧ ĐŊĐĩ ĐŊ҃ĐļĐŊĐž ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Ņƒ ĐŋŅ€Đ¸ ŅĐąĐžĐĩ Đ´Đ¸ŅĐēа. .IP \(bu SnapRAID ĐŧĐžĐļĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊĐžĐŧ Ņ‡Đ¸ŅĐģĐĩ ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв. ĐĄ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅ‹Đŧ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ ĐŋĐžĐģĐŊĐžĐŗĐž ŅĐąĐžŅ Đ˛ŅĐĩĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. .IP \(bu ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв, ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи и ĐļĐĩҁ҂ĐēиĐĩ ҁҁҋĐģĐēи. Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ, ĐŋŅ€Đ°Đ˛Đ° вĐģадĐĩĐŊĐ¸Ņ и Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹ ĐŊĐĩ ŅĐžŅ…Ņ€Đ°ĐŊŅŅŽŅ‚ŅŅ. .PD .SH GETTING STARTED Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ SnapRAID, ваĐŧ ĐŊ҃ĐļĐŊĐž ҁĐŊĐ°Ņ‡Đ°Đģа Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ОдиĐŊ Đ´Đ¸ŅĐē в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ Đ´ĐģŅ Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊĐ¸Ņ ĐŋОд иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ \`҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸\` (parity). ĐĄ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đ˛Ņ‹ ҁĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа, ĐŋОдОйĐŊĐž RAID5. .PP Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ йОĐģҌ҈ĐĩĐŗĐž Ņ‡Đ¸ŅĐģа ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв, ĐŋОдОйĐŊĐž RAID6, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đ´Đ¸ŅĐēи Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. КаĐļĐ´Ņ‹Đš Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš Đ´Đ¸ŅĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋОСвОĐģŅĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ Đĩ҉Đĩ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа. .PP В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ˛Ņ‹ĐąĐ¸Ņ€Đ°Ņ‚ŅŒ ŅĐ°ĐŧŅ‹Đĩ йОĐģŅŒŅˆĐ¸Đĩ Đ´Đ¸ŅĐēи в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, Ņ‚Đ°Đē ĐēаĐē иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŧĐžĐļĐĩŅ‚ Đ˛Ņ‹Ņ€Đ°ŅŅ‚Đ¸ Đ´Đž Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ŅĐ°ĐŧĐžĐŗĐž йОĐģŅŒŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. .PP Đ­Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐąŅƒĐ´ŅƒŅ‚ Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊŅ‹ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв \`҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸\`. Đ’Ņ‹ ĐŊĐĩ Đ´ĐžĐģĐļĐŊŅ‹ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐŊа ĐŊĐ¸Ņ… ŅĐ˛ĐžĐ¸ даĐŊĐŊŅ‹Đĩ. .PP Đ—Đ°Ņ‚ĐĩĐŧ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Đ´Đ¸ŅĐēи \`даĐŊĐŊҋ҅\`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚ŅŒ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ SnapRAID. Đ—Đ°Ņ‰Đ¸Ņ‚Đ° йОĐģĐĩĐĩ ŅŅ„Ņ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊа, ĐĩҁĐģи ŅŅ‚Đ¸ Đ´Đ¸ŅĐēи ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ даĐŊĐŊŅ‹Đĩ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. По ŅŅ‚ĐžĐš ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩ ĐģŅƒŅ‡ŅˆĐĩ НЕ вĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐē Windows C:\\ иĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Unix /home, /var и /tmp. .PP ĐĄĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģОв ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ŅŅ в Ņ„Đ°ĐšĐģĐ°Ņ… \`content\`, ĐžĐąŅ‹Ņ‡ĐŊĐž Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸Ņ…ŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅, ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ иĐģи ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžŅ‡ĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ Đ´ĐĩŅ‚Đ°Đģи Đ˛Đ°ŅˆĐĩĐŗĐž Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, вĐēĐģŅŽŅ‡Đ°Ņ Đ˛ŅĐĩ ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ ҁ҃ĐŧĐŧŅ‹ Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ĐĩĐŗĐž ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. ФаКĐģ \`content\` Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŅ в ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… ĐēĐžĐŋĐ¸ŅŅ…, и ĐēаĐļĐ´Đ°Ņ ĐēĐžĐŋĐ¸Ņ Đ´ĐžĐģĐļĐŊа ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐŊа ĐžŅ‚Đ´ĐĩĐģҌĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ, Ņ‡Ņ‚Đž даĐļĐĩ в ҁĐģŅƒŅ‡Đ°Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛ĐĩĐŊĐŊҋ҅ ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв, Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊа ĐēĐžĐŋĐ¸Ņ ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа. .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ, Ņ‡Ņ‚Đž Đ˛Ņ‹ СаиĐŊŅ‚ĐĩŅ€ĐĩŅĐžĐ˛Đ°ĐŊŅ‹ Ņ‚ĐžĐģҌĐēĐž в ОдĐŊĐžĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и Đ˛Đ°ŅˆĐ¸ Đ´Đ¸ŅĐēи Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊŅ‹ ĐŋĐž Đ°Đ´Ņ€ĐĩŅĐ°Đŧ: .PP .RS 4 /mnt/diskp <\- Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ .PD 0 .PP .PD /mnt/disk1 <\- ĐŋĐĩŅ€Đ˛Ņ‹Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ .PD 0 .PP .PD /mnt/disk2 <\- Đ˛Ņ‚ĐžŅ€ĐžĐš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ .PD 0 .PP .PD /mnt/disk3 <\- ҂ҀĐĩŅ‚Đ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ .PD 0 .PD .RE .PP Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ /etc/snapraid.conf ŅĐž ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧи ĐžĐŋŅ†Đ¸ŅĐŧи: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Windows, ваĐŧ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋŅƒŅ‚Đ¸ Windows, ҁ ĐąŅƒĐēваĐŧи Đ´Đ¸ŅĐēОв и ĐžĐąŅ€Đ°Ņ‚ĐŊŅ‹Đŧи ҁĐģĐĩŅˆĐ°Đŧи вĐŧĐĩŅŅ‚Đž ĐŋŅ€ŅĐŧҋ҅. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŧĐŊĐžĐŗĐž Đ´Đ¸ŅĐēОв и СаĐēаĐŊŅ‡Đ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐąŅƒĐēĐ˛Ņ‹ Đ´Đ¸ŅĐēОв, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в ĐŋОдĐŋаĐŋĐēи. ĐĄĐŧ.: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP На ŅŅ‚ĐžĐŧ ŅŅ‚Đ°ĐŋĐĩ Đ˛Ņ‹ ĐŗĐžŅ‚ĐžĐ˛Ņ‹ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\` Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Đ­Ņ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŧĐžĐļĐĩŅ‚ СаĐŊŅŅ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ‡Đ°ŅĐžĐ˛ в ĐŋĐĩŅ€Đ˛Ņ‹Đš Ņ€Đ°Đˇ, в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸ ĐžŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° даĐŊĐŊҋ҅, ҃ĐļĐĩ ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… ĐŊа Đ´Đ¸ŅĐēĐ°Ņ…. Đ•ŅĐģи Đ´Đ¸ŅĐēи ĐŋŅƒŅŅ‚Ņ‹Đĩ, ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐĩĐŗĐž в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐŊаĐļав Ctrl+C, и ĐŋŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ СаĐŋ҃ҁĐēĐĩ ĐžĐŊ вОСОйĐŊĐžĐ˛Đ¸Ņ‚ Ņ€Đ°ĐąĐžŅ‚Ņƒ ҁ Ņ‚ĐžĐŗĐž ĐŧĐĩŅŅ‚Đ°, ĐŗĐ´Đĩ ĐąŅ‹Đģ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊ. .PP ĐšĐžĐŗĐ´Đ° ŅŅ‚Đ° ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŅ, Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ ЗАЩИЩЕНĐĢ. .PP ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ˛ĐžĐš ĐŧĐ°ŅŅĐ¸Đ˛, ĐēаĐē ваĐŧ ŅƒĐŗĐžĐ´ĐŊĐž, и ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ОйĐŊОвĐģŅŅ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, СаĐŋ҃ҁĐēĐ°Ņ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\`. .SS Scrubbing ДĐģŅ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ и ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅˆĐ¸ĐąĐžĐē, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ŅŅ€Đ°Đ˛ĐŊиваĐĩŅ‚ даĐŊĐŊŅ‹Đĩ в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ҁ Ņ…ŅŅˆĐĩĐŧ, Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅ‹Đŧ вО Đ˛Ņ€ĐĩĐŧŅ ĐēĐžĐŧаĐŊĐ´Ņ‹ \`sync\`, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. .PP КаĐļĐ´Ņ‹Đš СаĐŋ҃ҁĐē ĐēĐžĐŧаĐŊĐ´Ņ‹ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 8% ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ даĐŊĐŊŅ‹Đĩ, ҃ĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ Са ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Đĩ 10 Đ´ĐŊĐĩĐš. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ \-p, \-\-plan, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž, и ĐžĐŋŅ†Đ¸ŅŽ \-o, \-\-older\-than, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Đ˛ĐžĐˇŅ€Đ°ŅŅ‚ в Đ´ĐŊŅŅ…. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи 5% ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ĐąĐģĐžĐēОв ŅŅ‚Đ°Ņ€ŅˆĐĩ 20 Đ´ĐŊĐĩĐš, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Đ•ŅĐģи вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ \`content\` и ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ в ĐēĐžĐŧаĐŊĐ´Đĩ \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Đ¸Ņ…, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`fix\`, Ņ„Đ¸ĐģŅŒŅ‚Ņ€ŅƒŅ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP ĐŸŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ \`scrub\` ĐžŅˆĐ¸ĐąĐēи Đ¸ŅŅ‡ĐĩСĐŊŅƒŅ‚ иС ĐžŅ‚Ņ‡ĐĩŅ‚Đ° \`status\`, ĐĩҁĐģи ĐžĐŊи Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹. Đ§Ņ‚ĐžĐąŅ‹ ҃ҁĐēĐžŅ€Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžŅ†Đĩҁҁ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ \-p bad Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Ņ‚ĐžĐģҌĐēĐž ĐąĐģĐžĐēОв, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊҋ҅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP ЗаĐŋ҃ҁĐē \`scrub\` ĐŊа ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžĐąŅ‰Đ¸Ņ‚ŅŒ Ой ĐžŅˆĐ¸ĐąĐēĐ°Ņ…, Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊĐŊҋ҅ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧи иĐģи иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đŧи Ņ„Đ°ĐšĐģаĐŧи. Đ­Ņ‚Đ¸ ĐžŅˆĐ¸ĐąĐēи ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‚ŅŅ в Đ˛Ņ‹Đ˛ĐžĐ´Đĩ \`scrub\`, ĐŊĐž ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŊĐĩ ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. .SS Pooling ĐŸŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊиĐĩ: Đ¤ŅƒĐŊĐēŅ†Đ¸Ņ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ (pooling), ĐžĐŋĐ¸ŅĐ°ĐŊĐŊĐ°Ņ ĐŊиĐļĐĩ, ĐąŅ‹Đģа СаĐŧĐĩĐŊĐĩĐŊа иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ĐžĐŧ mergerfs, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩĐŧŅ‹Đŧ Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚ĐžĐŧ Đ´ĐģŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš Linux в ŅĐžĐžĐąŅ‰ĐĩŅŅ‚Đ˛Đĩ SnapRAID. Mergefs ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ йОĐģĐĩĐĩ ĐŗĐ¸ĐąĐēиК и ŅŅ„Ņ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš ҁĐŋĐžŅĐžĐą ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… Đ´Đ¸ŅĐēОв в ĐĩдиĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°Ņ ĐąĐĩҁĐŋŅ€ĐĩĐŋŅŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē Ņ„Đ°ĐšĐģаĐŧ ĐŋĐž Đ˛ŅĐĩĐŧ҃ ĐŧĐ°ŅŅĐ¸Đ˛Ņƒ ĐąĐĩС ĐžĐŋĐžŅ€Ņ‹ ĐŊа ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи. ОĐŊ Ņ…ĐžŅ€ĐžŅˆĐž иĐŊŅ‚ĐĩĐŗŅ€Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ŅĐž SnapRAID Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ и ĐžĐąŅ‹Ņ‡ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ в ŅƒŅŅ‚Đ°ĐŊОвĐēĐ°Ņ…, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē OpenMediaVault (OMV) иĐģи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐ¸Ņ… ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŅ… NAS. .PP Đ§Ņ‚ĐžĐąŅ‹ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐģĐ¸ŅŅŒ в ОдĐŊĐžĐŧ Đ´ĐĩŅ€ĐĩвĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Đ¸ŅŽ \`pooling\`. ОĐŊа ŅĐžĐˇĐ´Đ°ĐĩŅ‚ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ \`pooling\` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP иĐģи, ĐĩҁĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Windows, ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP а ĐˇĐ°Ņ‚ĐĩĐŧ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`pool\` Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ иĐģи ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧ҃ Unix и Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅŅ‚ĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŋĐž ҁĐĩŅ‚Đ¸ ĐēаĐē Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊ Windows, Ņ‚Đ°Đē и Đ´ĐģŅ Unix, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸ в Đ˛Đ°Ņˆ /etc/samba/smb.conf: .PP .RS 4 # В ĐŗĐģОйаĐģҌĐŊĐžĐŧ Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # В Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ ĐžĐąŅ‰ĐĩĐŗĐž Ņ€ĐĩŅŅƒŅ€ŅĐ° smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP В Windows ŅĐžĐ˛ĐŧĐĩҁ҂ĐŊĐžĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēĐ¸Ņ… ҁҁҋĐģĐžĐē ĐŋĐž ҁĐĩŅ‚Đ¸ ҂ҀĐĩĐąŅƒĐĩŅ‚, Ņ‡Ņ‚ĐžĐąŅ‹ ĐēĐģиĐĩĐŊ҂ҋ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ°Đģи Đ¸Ņ… ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐž. Đ§Ņ‚ĐžĐąŅ‹ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅŅ‚Đž, ĐŋĐžĐŧиĐŧĐž ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐžĐąŅ‰ĐĩĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool, Đ˛Ņ‹ Ņ‚Đ°ĐēĐļĐĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ ĐēĐž Đ˛ŅĐĩĐŧ Đ´Đ¸ŅĐēаĐŧ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ иĐŧĐĩĐŊа Đ´Đ¸ŅĐēОв, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ‚ĐžŅ‡ĐĩĐē ĐžĐąŅ‰ĐĩĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа. Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ Đ´ĐžĐģĐļĐŊŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ в ĐžĐŋŅ†Đ¸Đ¸ \`share\` Ņ„Đ°ĐšĐģа ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ĐŋŅƒŅ‚ŅŒ UNC Windows, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐēĐģиĐĩĐŊ҂ҋ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅŅ‚Đ¸Đŧ ĐžĐąŅ‰Đ¸Đŧ Đ´Đ¸ŅĐēаĐŧ. .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Ņ€Đ°ĐąĐžŅ‚Đ°Ņ ҁ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ҁ иĐŧĐĩĐŊĐĩĐŧ \`darkstar\`, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸Đ¸: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP и ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°Đŧ ĐŋĐž ҁĐĩŅ‚Đ¸: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧ ĐēĐģиĐĩĐŊŅ‚Đ°Đŧ Đ´ĐžŅŅ‚ŅƒĐŋ ĐēĐž Đ˛ŅĐĩĐŧ Ņ„Đ°ĐšĐģаĐŧ ĐŋĐž Đ°Đ´Ņ€Đĩҁ҃ \\\\darkstar\\pool. .PP ВаĐŧ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐēĐģиĐĩĐŊ҂ҋ Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐŧ ҁҁҋĐģĐēаĐŧ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´Ņ‹: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAID Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊĐ¸Ņ€ŅƒĐĩŅ‚ ҁĐēĐžŅ€ĐĩĐĩ ĐēаĐē ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ҇ĐĩĐŧ ĐēаĐē ŅĐ¸ŅŅ‚ĐĩĐŧа RAID, и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ иĐģи ĐžŅ‚ĐŧĐĩĐŊŅ‹ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв Đ´Đž Đ¸Ņ… ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŗĐž ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP иĐģи Đ´ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž ҁĐģŅƒŅ‡Đ°ĐšĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв вĐŊŅƒŅ‚Ņ€Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ \-m, \-\-filter\-missing, ĐēĐžŅ‚ĐžŅ€Đ°Ņ Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐžŅŅ‚Đ°Đ˛ĐģŅŅ Đ˛ŅĐĩ ĐžŅŅ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐŊĐĩŅ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đŧи. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP ИĐģи Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ… ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering ĐĄĐģŅƒŅ‡Đ¸ĐģĐžŅŅŒ Ņ…ŅƒĐ´ŅˆĐĩĐĩ, и Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐģи ОдиĐŊ иĐģи ĐŊĐĩҁĐēĐžĐģҌĐēĐž Đ´Đ¸ŅĐēОв! .PP НЕ ĐŸĐĐĐ˜ĐšĐŖĐ™ĐĸЕ! Đ’Ņ‹ ҁĐŧĐžĐļĐĩŅ‚Đĩ Đ¸Ņ… Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ! .PP ПĐĩŅ€Đ˛ĐžĐĩ, Ņ‡Ņ‚Đž Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ, ŅŅ‚Đž иСйĐĩĐŗĐ°Ņ‚ŅŒ даĐģҌĐŊĐĩĐšŅˆĐ¸Ņ… иСĐŧĐĩĐŊĐĩĐŊиК в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ĐģŅŽĐąŅ‹Đĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐŋОдĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đē ĐŊĐĩĐŧ҃ и ĐģŅŽĐąŅ‹Đĩ СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŋŅ€ĐžŅ†Đĩҁҁҋ, вĐēĐģŅŽŅ‡Đ°Ņ ĐģŅŽĐąĐžĐĩ СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐĩ ĐŊĐžŅ‡ĐŊĐžĐĩ sync иĐģи scrub SnapRAID. .PP Đ—Đ°Ņ‚ĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐ°ĐšŅ‚Đĩ Đē ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ ŅˆĐ°ĐŗĐ°Đŧ. .SS STEP 1 \-> Reconfigure ВаĐŧ ĐŊ҃ĐļĐŊĐž ĐŧĐĩŅŅ‚Đž Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ, в идĐĩаĐģĐĩ ĐŊа Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ СаĐŋĐ°ŅĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…, ĐŊĐž вĐŊĐĩ҈ĐŊĐĩĐŗĐž USB\-Đ´Đ¸ŅĐēа иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž. .PP ИСĐŧĐĩĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ SnapRAID, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŋŅ†Đ¸Ņ \`data\` иĐģи \`parity\` ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŗĐž Đ´Đ¸ŅĐēа ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°Đģа ĐŊа ĐŧĐĩŅŅ‚Đž ҁ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊŅ‹Đŧ ĐŋŅƒŅŅ‚Ņ‹Đŧ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛ĐžĐŧ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв. .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ´Đ¸ŅĐē \`d1\` Đ˛Ņ‹ŅˆĐĩĐģ иС ŅŅ‚Ņ€ĐžŅ, иСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ҁ: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP ĐŊа: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Đ•ŅĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧŅ‹Đš Đ´Đ¸ŅĐē ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰ŅƒŅŽ ĐžĐŋŅ†Đ¸ŅŽ \`parity\`. Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ Đ˛ŅĐĩ Đ¸Ņ… ĐžĐŋŅ†Đ¸Đ¸ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. .SS STEP 2 \-> Fix ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ fix, ŅĐžŅ…Ņ€Đ°ĐŊŅŅ ĐļŅƒŅ€ĐŊаĐģ вО вĐŊĐĩ҈ĐŊĐĩĐŧ Ņ„Đ°ĐšĐģĐĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP ГдĐĩ NAME — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ \`d1\` в ĐŊĐ°ŅˆĐĩĐŧ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŧ ĐŋŅ€Đ¸ĐŧĐĩŅ€Đĩ. Đ•ŅĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧŅ‹Đš Đ´Đ¸ŅĐē ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ иĐŧĐĩĐŊа \`parity\`, \`2\-parity\` и Ņ‚. Đ´. Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš \-d, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ¸Ņ… Đ˛ŅĐĩ. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда СаКĐŧĐĩŅ‚ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи. .PP ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŗĐ¸ĐŗĐ°ĐąĐ°ĐšŅ‚ ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐŗĐž ĐŧĐĩŅŅ‚Đ° Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа fix.log. ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐĩĐĩ ҁ Đ´Đ¸ŅĐēа ҁ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊŅ‹Đŧ ŅĐ˛ĐžĐąĐžĐ´ĐŊŅ‹Đŧ ĐŧĐĩŅŅ‚ĐžĐŧ. .PP ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐģи Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŧĐžĐļĐŊĐž ĐąŅ‹ĐģĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ. Đ•ŅĐģи ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ Ņ‡Đ°ŅŅ‚Đ¸Ņ‡ĐŊĐž иĐģи ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ĐŊĐĩĐ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐŧŅ‹, ĐžĐŊи ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊŅ‹ ҁ дОйавĐģĐĩĐŊиĐĩĐŧ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ \`.unrecoverable\`. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°ĐšŅ‚Đ¸ ĐŋĐžĐ´Ņ€ĐžĐąĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Đ˛ŅĐĩŅ… ĐŊĐĩĐ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐŧҋ҅ ĐąĐģĐžĐēОв в Ņ„Đ°ĐšĐģĐĩ fix.log, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ Đ˛ŅĐĩ ŅŅ‚Ņ€ĐžĐēи, ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‰Đ¸ĐĩŅŅ ҁ \`unrecoverable:\`. .PP Đ•ŅĐģи Đ˛Ņ‹ ĐŊĐĩ ŅƒĐ´ĐžĐ˛ĐģĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩĐŧ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŅ‚ŅŒ ĐĩĐŗĐž ŅŅ‚ĐžĐģҌĐēĐž Ņ€Đ°Đˇ, ҁĐēĐžĐģҌĐēĐž ĐŋĐžĐļĐĩĐģаĐĩŅ‚Đĩ. .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ˛Ņ‹ ŅƒĐ´Đ°ĐģиĐģи Ņ„Đ°ĐšĐģŅ‹ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŋĐžŅĐģĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž \`sync\`, ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē Ņ‚ĐžĐŧ҃, Ņ‡Ņ‚Đž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ \`fix\`, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ \-i, \-\-import, ҃ĐēаСав, ĐŗĐ´Đĩ ŅŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ҁĐĩĐšŅ‡Đ°Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐŊОва вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐŋŅ€ĐžŅ†Đĩҁҁ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. .PP Đ•ŅĐģи Đ˛Ņ‹ ŅƒĐ´ĐžĐ˛ĐģĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩĐŧ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ, ĐŊĐž ŅƒŅ‡Ņ‚Đ¸Ņ‚Đĩ, Ņ‡Ņ‚Đž ĐŋĐžŅĐģĐĩ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Đ˛Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ҁĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`fix\`! .SS STEP 3 \-> Check В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐžŅŅ‚ĐžŅ€ĐžĐļĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ‚ĐĩĐŋĐĩŅ€ŅŒ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`check\`, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž Đ˛ŅĐĩ в ĐŋĐžŅ€ŅĐ´ĐēĐĩ ĐŊа Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP ГдĐĩ NAME — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ \`d1\` в ĐŊĐ°ŅˆĐĩĐŧ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŧ ĐŋŅ€Đ¸ĐŧĐĩŅ€Đĩ. .PP ОĐŋŅ†Đ¸Đ¸ \-d и \-a ĐŗĐžĐ˛ĐžŅ€ŅŅ‚ SnapRAID ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҃ĐēаСаĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē и Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда СаКĐŧĐĩŅ‚ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐŊĐž ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҇ҀĐĩСĐŧĐĩŅ€ĐŊĐž ĐžŅŅ‚ĐžŅ€ĐžĐļĐŊŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐĩĐĩ ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ. .SS STEP 4 \-> Sync ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\`, Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€ĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐ°ŅŅĐ¸Đ˛ ҁ ĐŊĐžĐ˛Ņ‹Đŧ Đ´Đ¸ŅĐēĐžĐŧ. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Đ•ŅĐģи Đ˛ŅĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž, ŅŅ‚Đ° ĐēĐžĐŧаĐŊда Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž. .SH COMMANDS SnapRAID ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŋŅ€ĐžŅŅ‚Ņ‹Ņ… ĐēĐžĐŧаĐŊĐ´, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋОСвОĐģŅŅŽŅ‚: .PD 0 .IP \(bu ПĐĩŅ‡Đ°Ņ‚Đ°Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŧĐ°ŅŅĐ¸Đ˛Đ° \-> \`status\` .IP \(bu ĐŖĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ Đ´Đ¸ŅĐēаĐŧи \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ/ҁĐŊиĐŧĐžĐē \-> \`sync\` .IP \(bu ПĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ‚ŅŒ даĐŊĐŊŅ‹Đĩ \-> \`scrub\` .IP \(bu Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŋĐžŅĐģĐĩĐ´ĐŊŅŽŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ/ҁĐŊиĐŧĐžĐē \-> \`fix\`. .PD .PP КоĐŧаĐŊĐ´Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ ĐŊаĐŋĐ¸ŅĐ°ĐŊŅ‹ ŅŅ‚Ņ€ĐžŅ‡ĐŊŅ‹Đŧи ĐąŅƒĐēваĐŧи. .SS status ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ŅĐ˛ĐžĐ´Đē҃ ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. .PP ОĐŊа вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Đž Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đž Ņ‚ĐžĐŧ, ĐŊĐ°ŅĐēĐžĐģҌĐēĐž ŅŅ‚Đ°Ņ€Ņ‹Đĩ ĐąĐģĐžĐēи ĐąĐĩС ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, и Đ˛ŅĐĩ СаĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đĩ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи, вОСĐŊиĐēŅˆĐ¸Đĩ вО Đ˛Ņ€ĐĩĐŧŅ scrubbing. .PP ĐŸŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ŅŅ Đē ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ СаĐŋ҃ҁĐēаĐģи \`sync\`. БоĐģĐĩĐĩ ĐŋОСдĐŊиĐĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ ŅƒŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ. .PP Đ•ŅĐģи ĐąŅ‹Đģи ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊŅ‹ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ Đ¸Ņ… ĐŊĐžĐŧĐĩŅ€Đ°. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Đ¸Ņ…, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`fix \-e\`. .PP ОĐŊ Ņ‚Đ°ĐēĐļĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŗŅ€Đ°Ņ„Đ¸Đē, ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅŽŅ‰Đ¸Đš ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐēĐžĐŗĐ´Đ° ĐēаĐļĐ´Ņ‹Đš ĐąĐģĐžĐē ĐąŅ‹Đģ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊ (\`scrubbed\`) иĐģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊ (\`synced\`). ĐŸŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи ОйОСĐŊĐ°Ņ‡ĐĩĐŊŅ‹ ŅĐ¸ĐŧвОĐģĐžĐŧ \`*\`, ĐąĐģĐžĐēи, ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ, ĐŊĐž Đĩ҉Đĩ ĐŊĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ, ŅĐ¸ĐŧвОĐģĐžĐŧ \`o\`. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS smart ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐžŅ‚Ņ‡ĐĩŅ‚ SMART Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. .PP ОĐŊ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐžŅ†ĐĩĐŊĐē҃ вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ŅĐąĐžŅ в ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ ĐŗĐžĐ´Ņƒ, ĐŋОСвОĐģŅŅ ĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐģаĐŊĐžĐ˛ŅƒŅŽ СаĐŧĐĩĐŊ҃ Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ŅŽŅ‚ ĐŋĐžĐ´ĐžĐˇŅ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹. .PP Đ­Ņ‚Đ° ĐžŅ†ĐĩĐŊĐēа вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊа ĐŋŅƒŅ‚ĐĩĐŧ ĐēĐžŅ€Ņ€ĐĩĐģŅŅ†Đ¸Đ¸ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ĐžĐ˛ SMART Đ´Đ¸ŅĐēОв ҁ даĐŊĐŊŅ‹Đŧи Backblaze, Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи ĐŋĐž Đ°Đ´Ņ€Đĩҁ҃: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Đ•ŅĐģи SMART ŅĐžĐžĐąŅ‰Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē Đ˛Ņ‹Ņ…ĐžĐ´Đ¸Ņ‚ иС ŅŅ‚Ņ€ĐžŅ, Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž Đ´Đ¸ŅĐēа Đ˛Ņ‹Đ˛ĐžĐ´Đ¸Ņ‚ŅŅ \`FAIL\` иĐģи \`PREFAIL\`, и SnapRAID Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐē҃. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐ°Ņ СаĐŧĐĩĐŊа Đ´Đ¸ŅĐēа ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ. .PP Đ”Ņ€ŅƒĐŗĐ¸Đĩ вОСĐŧĐžĐļĐŊŅ‹Đĩ ŅŅ‚Ņ€ĐžĐēи ŅŅ‚Đ°Ņ‚ŅƒŅĐ°: .RS 4 .PD 0 .HP 4 .I logfail В ĐŋŅ€ĐžŅˆĐģĐžĐŧ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹ ĐąŅ‹Đģи ĐŊиĐļĐĩ ĐŋĐžŅ€ĐžĐŗĐžĐ˛ĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ. .HP 4 .I logerr Đ–ŅƒŅ€ĐŊаĐģ ĐžŅˆĐ¸ĐąĐžĐē ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐēи. .HP 4 .I selferr Đ–ŅƒŅ€ĐŊаĐģ ŅĐ°ĐŧĐžŅ‚ĐĩŅŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐēи. .PD .RE .PP Đ•ŅĐģи ҃ĐēаСаĐŊа ĐžĐŋŅ†Đ¸Ņ \-v, \-\-verbose, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ йОĐģĐĩĐĩ ĐŗĐģŅƒĐąĐžĐēиК ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Ņ‡ĐĩҁĐēиК аĐŊаĐģиС. Đ­Ņ‚ĐžŅ‚ аĐŊаĐģиС ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŧĐžŅ‡ŅŒ ваĐŧ Ņ€ĐĩŅˆĐ¸Ņ‚ŅŒ, ĐŊ҃ĐļĐŊĐž Đģи ваĐŧ йОĐģҌ҈Đĩ иĐģи ĐŧĐĩĐŊҌ҈Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ \`smartctl\` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ \`smartctl \-a\` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. .PP Đ•ŅĐģи Đ˛Đ°ŅˆĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ĐŊĐĩ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēŅƒŅŽ ĐēĐžĐŧаĐŊĐ´Ņƒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ \`smartctl\` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS probe ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ POWER Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. .PP \`Standby\` ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē ĐŊĐĩ Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ. \`Active\` ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ \`smartctl\` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ \`smartctl \-n standby \-i\` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. .PP Đ•ŅĐģи Đ˛Đ°ŅˆĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ĐŊĐĩ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēŅƒŅŽ ĐēĐžĐŧаĐŊĐ´Ņƒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ \`smartctl\` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS up Đ Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ Đ˛ŅĐĩ Đ´Đ¸ŅĐēи ĐŧĐ°ŅŅĐ¸Đ˛Đ°. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€Đ°ŅĐēŅ€ŅƒŅ‚Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ Đ´Đ¸ŅĐēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ \-d, \-\-filter\-disk. .PP Đ Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ОдĐŊĐžĐ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŧĐŊĐžĐŗĐž ŅĐŊĐĩŅ€ĐŗĐ¸Đ¸. ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž Đ˛Đ°Ņˆ ĐąĐģĐžĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐ¸Ņ ĐŧĐžĐļĐĩŅ‚ ŅŅ‚Đž Đ˛Ņ‹Đ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS down ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ĐŧĐ°ŅŅĐ¸Đ˛Đ°. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ \`smartctl\` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ \`smartctl \-s standby,now\` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Ņ‚ĐžĐģҌĐēĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ \-d, \-\-filter\-disk. .PP Đ§Ņ‚ĐžĐąŅ‹ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐžŅˆĐ¸ĐąĐēĐĩ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ \-s, \-\-spin\-down\-on\-error ҁ ĐģŅŽĐąĐžĐš Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐžĐŧаĐŊдОК, Ņ‡Ņ‚Đž ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊĐž Ņ€ŅƒŅ‡ĐŊĐžĐŧ҃ СаĐŋ҃ҁĐē҃ \`down\` ĐŋŅ€Đ¸ вОСĐŊиĐēĐŊОвĐĩĐŊии ĐžŅˆĐ¸ĐąĐēи. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS diff ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž \`sync\`, Đ´ĐģŅ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ĐŊĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ даĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа, а Ņ‚ĐžĐģҌĐēĐž ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ„Đ°ĐšĐģа, Ņ€Đ°ĐˇĐŧĐĩŅ€ и inode. .PP ĐŸĐžŅĐģĐĩ ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… иСĐŧĐĩĐŊĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ ŅĐ˛ĐžĐ´Đēа иСĐŧĐĩĐŊĐĩĐŊиК, ŅĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐž: .RS 4 .PD 0 .HP 4 .I equal ФаКĐģŅ‹, ĐŊĐĩ иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ ĐŋĐž ŅŅ€Đ°Đ˛ĐŊĐĩĐŊĐ¸ŅŽ ҁ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Đŧ ŅĐžŅŅ‚ĐžŅĐŊиĐĩĐŧ. .HP 4 .I added ДобавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐŊĐĩ ĐąŅ‹ĐģĐž Ņ€Đ°ĐŊҌ҈Đĩ. .HP 4 .I removed ĐŖĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. .HP 4 .I updated ФаКĐģŅ‹ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧ Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ иĐģи ĐŧĐĩŅ‚ĐēОК Đ˛Ņ€ĐĩĐŧĐĩĐŊи, Ņ‡Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи ĐąŅ‹Đģи иСĐŧĐĩĐŊĐĩĐŊŅ‹. .HP 4 .I moved ФаКĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ в Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐēаĐē иĐŧĐĩŅŽŅ‰Đ¸Đĩ Ņ‚Đž ĐļĐĩ иĐŧŅ, Ņ€Đ°ĐˇĐŧĐĩŅ€, ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи и inode, ĐŊĐž Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ. .HP 4 .I copied Ņ„Đ°ĐšĐģŅ‹, ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŊа Ņ‚ĐžŅ‚ ĐļĐĩ иĐģи Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ĐŗĐ´Đĩ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ Đ˛ŅĐĩ Đĩ҉Đĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ŅĐžĐ˛ĐŋадĐĩĐŊĐ¸ŅŽ иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° и ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Đ´Ņ€ĐžĐąĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, а ĐŊĐĩ Ņ‚ĐžĐģҌĐēĐž иĐŧŅ. .HP 4 .I relocated Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ ĐŊа Ņ‚ĐžŅ‚ ĐļĐĩ иĐģи Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ĐŗĐ´Đĩ ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģ Đ¸ŅŅ‡ĐĩС. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ŅĐžĐ˛ĐŋадĐĩĐŊĐ¸ŅŽ иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° и ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Đ´Ņ€ĐžĐąĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ Ņ„Đ°ĐšĐģОв \'moved\' ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ иĐŧĐĩŅŽŅ‚ Đ´Ņ€ŅƒĐŗĐžĐš inode. .HP 4 .I restored Ņ„Đ°ĐšĐģŅ‹ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧ inode, ĐŊĐž ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‰Đ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐŧ, иĐŧĐĩĐŊĐĩĐŧ, Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ и ĐŧĐĩŅ‚ĐēОК Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐžĐąŅ‹Ņ‡ĐŊĐž ŅŅ‚Đž Ņ„Đ°ĐšĐģŅ‹, Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ‹Đĩ ĐŋĐžŅĐģĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ. .PD .RE .PP Đ•ŅĐģи ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ \`sync\`, ĐēОд Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚Đ° ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Ņ€Đ°Đ˛ĐĩĐŊ 2, а ĐŊĐĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 0. Код Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚Đ° 1 Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ ĐžĐąŅ‰ĐĩĐŗĐž ҃ҁĐģĐžĐ˛Đ¸Ņ ĐžŅˆĐ¸ĐąĐēи. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS sync ОбĐŊОвĐģŅĐĩŅ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ’ŅĐĩ иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ в Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ, и ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ОйĐŊОвĐģŅŅŽŅ‚ŅŅ. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐŊаĐļав Ctrl+C, ĐŊĐĩ Ņ‚ĐĩŅ€ŅŅ ҃ĐļĐĩ ĐŋŅ€ĐžĐ´ĐĩĐģаĐŊĐŊОК Ņ€Đ°ĐąĐžŅ‚Ņ‹. ĐŸŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ СаĐŋ҃ҁĐēĐĩ ĐŋŅ€ĐžŅ†Đĩҁҁ \`sync\` вОСОйĐŊĐžĐ˛Đ¸Ņ‚ŅŅ ҁ Ņ‚ĐžĐŗĐž ĐŧĐĩŅŅ‚Đ°, ĐŗĐ´Đĩ ĐąŅ‹Đģ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊ. .PP Đ•ŅĐģи вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. .PP ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ĐŋŅƒŅ‚Đ¸ и/иĐģи inode и ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ĐŋĐž Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ и ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ„Đ°ĐšĐģа иĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžŅ‚ĐģĐ¸Ņ‡Đ°ŅŽŅ‚ŅŅ, даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Đ´ĐģŅ Đ˛ŅĐĩĐŗĐž Ņ„Đ°ĐšĐģа. Đ•ŅĐģи Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊ иĐģи ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊ ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ, ŅĐžŅ…Ņ€Đ°ĐŊŅŅ Ņ‚ĐžŅ‚ ĐļĐĩ inode, ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊ ĐŊа Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ, ĐŊĐž Ņ€Đ°ĐŊĐĩĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Ņ…ŅŅˆĐ° ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ŅŅ. .PP ФаКĐģŅ‹ \`content\` и \`parity\` иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. .SS scrub ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŧĐ°ŅŅĐ¸Đ˛, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ҁĐēҀҋ҂ҋ҅ ĐžŅˆĐ¸ĐąĐžĐē иĐģи ĐžŅˆĐ¸ĐąĐžĐē ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅ и ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP КаĐļĐ´Ņ‹Đš Đ˛Ņ‹ĐˇĐžĐ˛ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 8% ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ даĐŊĐŊŅ‹Đĩ, ҃ĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ 10 Đ´ĐŊĐĩĐš. Đ­Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēа Ņ€Đ°Đˇ в ĐŊĐĩĐ´ĐĩĐģŅŽ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚, Ņ‡Ņ‚Đž ĐēаĐļĐ´Ņ‹Đš ĐąĐ¸Ņ‚ даĐŊĐŊҋ҅ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ŅŅ Ņ…ĐžŅ‚Ņ ĐąŅ‹ Ņ€Đ°Đˇ в Ņ‚Ņ€Đ¸ ĐŧĐĩŅŅŅ†Đ°. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš ĐŋĐģаĐŊ иĐģи ĐžĐąŅŠĐĩĐŧ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ \-p, \-\-plan, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚: bad \- ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐąĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. new \- ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ‡Ņ‚Đž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹. full \- ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ. 0\-100 \- ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐąĐģĐžĐēОв. .PP Đ•ŅĐģи Đ˛Ņ‹ ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚Đĩ ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ, Đ˛Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ \-o, \-\-older\-than, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ, ĐŊĐ°ŅĐēĐžĐģҌĐēĐž ŅŅ‚Đ°Ņ€Ņ‹Đŧ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ ĐąĐģĐžĐē. ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ŅĐ°ĐŧŅ‹Đĩ ŅŅ‚Đ°Ņ€Ņ‹Đĩ ĐąĐģĐžĐēи, ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°Ņ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊŅƒŅŽ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃. Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ‡Ņ‚Đž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ \`\-p new\`. .PP Đ§Ņ‚ĐžĐąŅ‹ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐŋĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Đž ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ \`status\`. .PP ĐŸŅ€Đ¸ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊии ĐģŅŽĐąĐžĐš ҁĐēŅ€Ņ‹Ņ‚ĐžĐš ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ \`content\`. Đ­Ņ‚Đ¸ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ в \`status\` и ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ \`fix \-e\`. ĐŸĐžŅĐģĐĩ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ scrub ĐžĐŊи ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, и ĐĩҁĐģи ОйĐŊĐ°Ņ€ŅƒĐļĐ°Ņ‚ŅŅ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ‹Đŧи, ĐŋĐģĐžŅ…Đ°Ņ ĐŧĐĩŅ‚Đēа ĐąŅƒĐ´ĐĩŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊа. Đ§Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`scrub \-p bad\`. .PP Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ СаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ \`scrub\` Ņ‚ĐžĐģҌĐēĐž ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊиК Ой ĐžŅˆĐ¸ĐąĐēĐ°Ņ…, Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊĐŊҋ҅ ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи даĐŊĐŊŅ‹Đŧи. Đ­Ņ‚Đ¸ ĐžŅˆĐ¸ĐąĐēи Ņ€Đ°ŅĐŋОСĐŊĐ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‰Đ¸ĐĩŅŅ ҁĐēҀҋ҂ҋĐŧи ĐžŅˆĐ¸ĐąĐēаĐŧи, и ĐąĐģĐžĐēи ĐŊĐĩ ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ, ĐŊĐž Ņ‚Đ°ĐēиĐĩ ĐžŅˆĐ¸ĐąĐēи ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‚ŅŅ в Đ˛Ņ‹Đ˛ĐžĐ´Đĩ ĐēĐžĐŧаĐŊĐ´Ņ‹. .PP ФаКĐģ \`content\` иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đ´ĐģŅ ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ĐąĐģĐžĐēа и Đ´ĐģŅ ĐŋĐžĐŧĐĩŅ‚Đēи ĐŋĐģĐžŅ…Đ¸Ņ… ĐąĐģĐžĐēОв. ФаКĐģŅ‹ \`parity\` НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. .SS fix Đ˜ŅĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP Đ’ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ŅŅ€Đ°Đ˛ĐŊĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁ ŅĐžŅŅ‚ĐžŅĐŊиĐĩĐŧ ҁĐŊиĐŧĐēа, ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ ĐŋŅ€Đ¸ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ \`sync\`. Đ•ŅĐģи ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐž Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ¸Đĩ, ĐžĐŊĐž Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ Đē ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊĐžĐŧ҃ ҁĐŊиĐŧĐē҃. .PP ВНИМАНИЕ! КоĐŧаĐŊда \`fix\` ĐŊĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐēи и ĐŋŅ€ĐĩĐ´ĐŊаĐŧĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ. ОĐŊа ĐąĐĩĐˇŅƒŅĐģОвĐŊĐž Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ Ņ„Đ°ĐšĐģа Đē ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ҃ \`sync\`. .PP Đ•ŅĐģи ĐŊĐĩ ҃ĐēаСаĐŊа Đ´Ņ€ŅƒĐŗĐ°Ņ ĐžĐŋŅ†Đ¸Ņ, ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸Đ¸ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐŋОдĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ„Đ°ĐšĐģОв иĐģи Đ´Đ¸ŅĐēОв Đ´ĐģŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹. .PP Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐąĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ вО Đ˛Ņ€ĐĩĐŧŅ \`sync\` и \`scrub\`, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ \-e, \-\-filter\-error. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ Đ´Ņ€ŅƒĐŗĐ¸Ņ… ĐžĐŋŅ†Đ¸Đš Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, ŅŅ‚Đ° ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐąŅ‹Đģи иСĐŧĐĩĐŊĐĩĐŊŅ‹ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž \`sync\`. .PP SnapRAID ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊĐžĐ˛Ņ‹Đ˛Đ°ĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹, дОйавĐģŅŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ \`.unrecoverable\`. .PP ПĐĩŅ€ĐĩĐ´ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩĐŧ ҁĐēаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ŅŅ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŊĐ°ĐšŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ \`sync\`. Đ­Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž Đ¸Ņ… ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒŅ Đ¸Ņ… иĐŧŅ и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ, и Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ в ĐŋŅ€ĐžŅ†ĐĩҁҁĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Đģи ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ иС ĐŊĐ¸Ņ… Са ĐŋŅ€ĐĩĐ´ĐĩĐģŅ‹ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ \-i, \-\-import, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Đ´ĐģŅ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. .PP ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐž ĐŋŅƒŅ‚Đ¸, а ĐŊĐĩ ĐŋĐž inode. .PP ФаКĐģ \`content\` НЕ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. ФаКĐģŅ‹ \`parity\` иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. .SS check ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP ОĐŊ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐēаĐē \`fix\`, ĐŊĐž Ņ‚ĐžĐģҌĐēĐž иĐŧĐ¸Ņ‚Đ¸Ņ€ŅƒĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ, и ĐŊиĐēаĐēиĐĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ СаĐŋĐ¸ŅŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ĐŧĐ°ŅŅĐ¸Đ˛. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€ŅƒŅ‡ĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋĐžŅĐģĐĩ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ иĐģи в Đ´Ņ€ŅƒĐŗĐ¸Ņ… ĐžŅĐžĐąŅ‹Ņ… ҃ҁĐģĐžĐ˛Đ¸ŅŅ…. ДĐģŅ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēĐ¸Ņ… и СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐžĐē Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ \`scrub\`. .PP Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ \-a, \-\-audit\-only, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž даĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа, а даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Đ´ĐģŅ йОĐģĐĩĐĩ ĐąŅ‹ŅŅ‚Ņ€ĐžĐŗĐž Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ. .PP ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐž ĐŋŅƒŅ‚Đ¸, а ĐŊĐĩ ĐŋĐž inode. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS list ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸ĐĩŅŅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐŊа ĐŧĐžĐŧĐĩĐŊŅ‚ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž \`sync\`. .PP ĐĄ \-v иĐģи \-\-verbose Ņ‚Đ°ĐēĐļĐĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ŅŅ Đ˛Ņ€ĐĩĐŧŅ ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS dup ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐĩŅŅ Ņ„Đ°ĐšĐģŅ‹. Два Ņ„Đ°ĐšĐģа ŅŅ‡Đ¸Ņ‚Đ°ŅŽŅ‚ŅŅ Ņ€Đ°Đ˛ĐŊŅ‹Đŧи, ĐĩҁĐģи Đ¸Ņ… Ņ…ŅŅˆĐ¸ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚. ДаĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа ĐŊĐĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ; Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐž Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS pool ХОСдаĐĩŅ‚ иĐģи ОйĐŊОвĐģŅĐĩŅ‚ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ в ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ \`pooling\`. .PP ФаКĐģŅ‹ ĐŊĐĩ ĐēĐžĐŋĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ, а ŅĐ˛ŅĐˇŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēĐ¸Ņ… ҁҁҋĐģĐžĐē. .PP ĐŸŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии Đ˛ŅĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи и ĐŋŅƒŅŅ‚Ņ‹Đĩ ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ ŅƒĐ´Đ°ĐģŅŅŽŅ‚ŅŅ и СаĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŊĐžĐ˛Ņ‹Đŧ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ›ŅŽĐąŅ‹Đĩ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ ĐŊа ĐŧĐĩҁ҂Đĩ. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Са ĐŋŅ€ĐĩĐ´ĐĩĐģаĐŧи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° pool. .SS devices ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đĩ ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐŧ. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ Đ°ŅŅĐžŅ†Đ¸Đ°Ņ†Đ¸Đ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ и в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа ĐēаĐē иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Đ´ĐģŅ ҁĐēŅ€Đ¸ĐŋŅ‚ĐžĐ˛. .PP ПĐĩŅ€Đ˛Ņ‹Đĩ два ŅŅ‚ĐžĐģĐąŅ†Đ° — ŅŅ‚Đž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° и ĐŋŅƒŅ‚ŅŒ. ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ два ŅŅ‚ĐžĐģĐąŅ†Đ° — ŅŅ‚Đž Đ˛Ņ‹ŅĐžĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° и ĐŋŅƒŅ‚ŅŒ. ĐŸĐžŅĐģĐĩĐ´ĐŊиК ŅŅ‚ĐžĐģĐąĐĩ҆ — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. .PP В йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ОдĐŊĐž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩвОĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, ĐŊĐž в ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… йОĐģĐĩĐĩ ҁĐģĐžĐļĐŊҋ҅ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŅ… ҃ Đ˛Đ°Ņ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Ņ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧҋ҅ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. .PP ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. .SS touch ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģҌĐŊŅƒŅŽ ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ Đ´ĐģŅ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐžĐŊа ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа в ĐŊĐžĐģҌ. .PP Đ­Ņ‚Đž ҃ĐģŅƒŅ‡ŅˆĐ°ĐĩŅ‚ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ SnapRAID Ņ€Đ°ŅĐŋОСĐŊĐ°Đ˛Đ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ и ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, Ņ‚Đ°Đē ĐēаĐē Đ´ĐĩĐģаĐĩŅ‚ ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐŋĐžŅ‡Ņ‚Đ¸ ҃ĐŊиĐēаĐģҌĐŊОК, ҃ĐŧĐĩĐŊŅŒŅˆĐ°Ņ вОСĐŧĐžĐļĐŊŅ‹Đĩ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹. .PP БоĐģĐĩĐĩ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐž, ĐĩҁĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ ĐŊĐĩ Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đš иĐģи ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ĐēаĐē Ņ‚Đ°ĐēОвОК, ĐĩҁĐģи ĐžĐŊ ŅĐžĐ˛ĐŋадаĐĩŅ‚ ĐŋĐž иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ и ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, ĐžĐŊ ŅŅ‡Đ¸Ņ‚Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŋиĐĩĐš Ņ‚ĐžĐģҌĐēĐž в Ņ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ, ĐĩҁĐģи ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, Ņ€Đ°ĐˇĐŧĐĩŅ€ и ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи. .PP МĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž ҁĐĩĐē҃ĐŊĐ´Ņ‹ ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ, ĐŋĐžŅŅ‚ĐžĐŧ҃ Đ˛ŅĐĩ Đ´Đ°Ņ‚Ņ‹ и Đ˛Ņ€ĐĩĐŧŅ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģОв ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹. .SS rehash ПĐģаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. .PP Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда иСĐŧĐĩĐŊŅĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đš Ņ‚Đ¸Đŋ Ņ…ŅŅˆĐ°, ĐžĐąŅ‹Ņ‡ĐŊĐž ĐŋŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии ҁ 32\-Ņ€Đ°ĐˇŅ€ŅĐ´ĐŊОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ ĐŊа 64\-Ņ€Đ°ĐˇŅ€ŅĐ´ĐŊŅƒŅŽ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ ҁ MurmurHash3 ĐŊа йОĐģĐĩĐĩ ĐąŅ‹ŅŅ‚Ņ€Ņ‹Đš SpookyHash. .PP Đ•ŅĐģи Đ˛Ņ‹ ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊŅ‹Đš Ņ…ŅŅˆ, ŅŅ‚Đ° ĐēĐžĐŧаĐŊда ĐŊĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ Đ´ĐĩĐģаĐĩŅ‚ и иĐŊŅ„ĐžŅ€ĐŧĐ¸Ņ€ŅƒĐĩŅ‚ Đ˛Đ°Ņ, Ņ‡Ņ‚Đž ĐŊиĐēаĐēиĐĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŊĐĩ ҂ҀĐĩĐąŅƒŅŽŅ‚ŅŅ. .PP ПĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž, а ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŋĐžŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž вО Đ˛Ņ€ĐĩĐŧŅ \`sync\` и \`scrub\`. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ \`status\`. .PP Во Đ˛Ņ€ĐĩĐŧŅ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ SnapRAID ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ ĐŋĐžĐģĐŊŅƒŅŽ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, Са ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đŧ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩĐŧ, Ņ‡Ņ‚Đž \`dup\` ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐĩŅŅ Ņ„Đ°ĐšĐģŅ‹, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‰Đ¸Đĩ Đ´Ņ€ŅƒĐŗĐžĐš Ņ…ŅŅˆ. .SS locate ĐĐ°Ņ…ĐžĐ´Đ¸Ņ‚ Ņ„Đ°ĐšĐģŅ‹, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸ĐĩŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ĐŊаКдĐĩĐŊĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģа Đ˛Ņ‹Đ˛ĐžĐ´Đ¸Ņ‚ŅŅ ĐĩĐŗĐž Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ вĐŊŅƒŅ‚Ņ€Đ¸ Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ и ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž СаĐŊиĐŧаĐĩĐŧҋ҅ иĐŧ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚ĐžĐ˛. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ \-t, \-\-tail, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Ņ„Đ°ĐšĐģаĐŧи, СаĐŊиĐŧĐ°ŅŽŅ‰Đ¸Đŧи ҃ĐēаСаĐŊĐŊŅƒŅŽ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ ŅŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ \-W, \-\-force\-realloc\-tail. ИĐŧĐĩĐšŅ‚Đĩ в Đ˛Đ¸Đ´Ņƒ, Ņ‡Ņ‚Đž Ņ‚Đ°ĐēиĐĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊŅ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ. .SH OPTIONS SnapRAID ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸: .TP .B \-c, \-\-conf CONFIG Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ. Đ•ŅĐģи ĐŊĐĩ ҃ĐēаСаĐŊ, в Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ \`/usr/local/etc/snapraid.conf\`, ĐĩҁĐģи ĐžĐŊ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚, в ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ \`/etc/snapraid.conf\`. В Windows Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ \`snapraid.conf\` в Ņ‚ĐžĐŧ ĐļĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ, Ņ‡Ņ‚Đž и \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в \`check\` и \`fix\`. ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ҃ĐēаСаĐŊĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ҃. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ Đž ҁĐŋĐĩŅ†Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŅ… ŅˆĐ°ĐąĐģĐžĐŊОв ҁĐŧ. в Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ PATTERN. В Unix ŅƒĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž ŅĐ¸ĐŧвОĐģŅ‹ ĐŗĐģОййиĐŊĐŗĐ° СаĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, ĐĩҁĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`check\` и \`fix\`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ \`sync\` и \`scrub\`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. .TP .B \-d, \-\-filter\-disk NAME ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в \`check\`, \`fix\`, \`up\` и \`down\`. Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ иĐŧŅ Đ´Đ¸ŅĐēа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ҁ иĐŧĐĩĐŊаĐŧи: \`parity\`, \`2\-parity\`, \`3\-parity\` и Ņ‚. Đ´., Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đŧ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ ĐēĐžĐŧйиĐŊĐ¸Ņ€ŅƒĐĩŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš \-\-filter, \-\-filter\-disk и \-\-filter\-missing, Đ˛Ņ‹ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Đ˛ŅĐĩĐŧ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Đŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`check\`, \`fix\`, \`up\` и \`down\`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ \`sync\` и \`scrub\`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. .TP .B \-m, \-\-filter\-missing ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в \`check\` и \`fix\`. ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ°. ĐŸŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ҁ \`fix\`, ŅŅ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐēаĐē ĐēĐžĐŧаĐŊда \`undelete\`. Đ•ŅĐģи Đ˛Ņ‹ ĐēĐžĐŧйиĐŊĐ¸Ņ€ŅƒĐĩŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš \-\-filter, \-\-filter\-disk и \-\-filter\-missing, Đ˛Ņ‹ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Đ˛ŅĐĩĐŧ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Đŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`check\` и \`fix\`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ \`sync\` и \`scrub\`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. .TP .B \-e, \-\-filter\-error ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ ҁ ĐžŅˆĐ¸ĐąĐēаĐŧи в \`check\` и \`fix\`. ОĐŊ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐąĐģĐžĐēи ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐŋĐžĐŧĐĩ҇ĐĩĐŊŅ‹ ҁĐēҀҋ҂ҋĐŧи ĐžŅˆĐ¸ĐąĐēаĐŧи иĐģи ĐžŅˆĐ¸ĐąĐēаĐŧи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° вО Đ˛Ņ€ĐĩĐŧŅ \`sync\` и \`scrub\`, ĐēаĐē ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐž в \`status\`. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`check\` и \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐŋĐģаĐŊ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи (\`scrub\`). Đ•ŅĐģи PERC — ŅŅ‚Đž Ņ‡Đ¸ŅĐģОвОĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐžŅ‚ 0 Đ´Đž 100, ĐžĐŊĐž иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ĐēаĐē ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐąĐģĐžĐēОв Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи. ВĐŧĐĩŅŅ‚Đž ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚Đ° Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐģаĐŊ: \`bad\` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, \`new\` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, и \`full\` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Đ˛ŅĐĩ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ŅĐ°ĐŧŅƒŅŽ ŅŅ‚Đ°Ņ€ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐ°ŅŅĐ¸Đ˛Đ° Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в \`scrub\`. DAYS — ŅŅ‚Đž ĐŧиĐŊиĐŧаĐģҌĐŊŅ‹Đš Đ˛ĐžĐˇŅ€Đ°ŅŅ‚ в Đ´ĐŊŅŅ… Đ´ĐģŅ ĐąĐģĐžĐēа, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊ; ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 10. БĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ, Đ˛ŅĐĩĐŗĐ´Đ° ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`scrub\`. .TP .B \-a, \-\-audit\-only В \`check\`, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ…ŅŅˆ Ņ„Đ°ĐšĐģОв ĐąĐĩС ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ СаиĐŊŅ‚ĐĩŅ€ĐĩŅĐžĐ˛Đ°ĐŊŅ‹ Ņ‚ĐžĐģҌĐēĐž в ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐĩ даĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģа, ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŧĐžĐļĐĩŅ‚ СĐŊĐ°Ņ‡Đ¸Ņ‚ĐĩĐģҌĐŊĐž ҃ҁĐēĐžŅ€Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`check\`. .TP .B \-h, \-\-pre\-hash В \`sync\`, СаĐŋ҃ҁĐēаĐĩŅ‚ ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ Ņ„Đ°ĐˇŅƒ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ĐŊĐžĐ˛Ņ‹Ņ… даĐŊĐŊҋ҅ Đ´ĐģŅ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиĐĩĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐžĐąŅ‹Ņ‡ĐŊĐž в \`sync\` ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ, и ĐŊĐžĐ˛Ņ‹Đĩ даĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиĐĩĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐēĐžĐŗĐ´Đ° ĐžĐŊи ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ĐŋĐĩŅ€Đ˛Ņ‹Đš Ņ€Đ°Đˇ. Đ­Ņ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚, ĐēĐžĐŗĐ´Đ° ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ ĐŋОд Ņ‚ŅĐļĐĩĐģОК ĐŊĐ°ĐŗŅ€ŅƒĐˇĐēОК, ŅĐž Đ˛ŅĐĩĐŧи Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ Đ´Đ¸ŅĐēаĐŧи и СаĐŊŅŅ‚Ņ‹Đŧ ĐŋŅ€ĐžŅ†ĐĩŅŅĐžŅ€ĐžĐŧ. Đ­Ņ‚Đž ŅĐēҁ҂ҀĐĩĐŧаĐģҌĐŊĐžĐĩ ҃ҁĐģОвиĐĩ Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊŅ‹, и ĐĩҁĐģи ҃ ĐŊĐĩĐĩ ĐĩŅŅ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Đ°Ņ аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊĐ°Ņ ĐŋŅ€ĐžĐąĐģĐĩĐŧа, ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи ĐŧĐžĐŗŅƒŅ‚ ĐžŅŅ‚Đ°Ņ‚ŅŒŅŅ ĐŊĐĩСаĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đŧи, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž даĐŊĐŊŅ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹. Đ§Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅŅ‚ĐžĐŗĐž Ņ€Đ¸ŅĐēа, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩĐļиĐŧ \`pre\-hash\`, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛ŅĐĩ даĐŊĐŊŅ‹Đĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐģĐ¸ŅŅŒ дваĐļĐ´Ņ‹ Đ´ĐģŅ ОйĐĩҁĐŋĐĩ҇ĐĩĐŊĐ¸Ņ Đ¸Ņ… ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ Ņ‚Đ°ĐēĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Ņ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžŅˆĐģа ҃ҁĐŋĐĩ҈ĐŊĐž, и, ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸, ĐŋОСвОĐģŅĐĩŅ‚ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ (\`fix\`) ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐĩĐŊиĐĩĐŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`sync\`. .TP .B \-i, \-\-import DIR ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩŅ‚ иС ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° ĐģŅŽĐąŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŋĐžŅĐģĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž \`sync\`. Đ•ŅĐģи ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ Đĩ҉Đĩ ĐĩŅŅ‚ŅŒ Ņ‚Đ°ĐēиĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐžĐŊи ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ \`check\` и \`fix\` Đ´ĐģŅ ҃ĐģŅƒŅ‡ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. ФаКĐģŅ‹ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ, вĐēĐģŅŽŅ‡Đ°Ņ ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸, и идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ Đ¸Ņ… иĐŧĐĩĐŊи. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`check\` и \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error ĐŸŅ€Đ¸ ĐģŅŽĐąĐžĐš ĐžŅˆĐ¸ĐąĐēĐĩ ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… ҃ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧҋ҅ Đ´Đ¸ŅĐēОв ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ…ĐžĐ´ĐžĐŧ ҁ ĐŊĐĩĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ ĐēОдОĐŧ ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ. Đ­Ņ‚Đž ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ´Đ¸ŅĐēОв аĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đŧи и Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ ĐŋĐžŅĐģĐĩ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊĐŊОК ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸, ĐŋĐžĐŧĐžĐŗĐ°Ņ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŊĐĩĐŊ҃ĐļĐŊĐžĐŗĐž ĐŊĐ°ĐŗŅ€Đĩва и ŅĐŊĐĩŅ€ĐŗĐžĐŋĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊĐ¸Ņ. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžŅŅ‚Đ°ĐŊОвĐē҃ Đ´Đ¸ŅĐēОв, даĐļĐĩ ĐēĐžĐŗĐ´Đ° ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ°ĐĩŅ‚ŅŅ ĐŊĐĩŅƒĐ´Đ°Ņ‡ĐĩĐš. .TP .B \-w, \-\-bw\-limit RATE ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ ĐŗĐģОйаĐģҌĐŊĐžĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊОК ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв. RATE — ŅŅ‚Đž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąĐ°ĐšŅ‚ĐžĐ˛ в ҁĐĩĐē҃ĐŊĐ´Ņƒ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģҌ, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ K, M иĐģи G (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, \-\-bw\-limit 1G). .TP .B \-t, \-\-tail РАЗМЕР ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ ҁĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģОв Ņ‚ĐĩĐŧи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ ĐŊĐĩ йОĐģĐĩĐĩ ҃ĐēаСаĐŊĐŊĐžĐŗĐž Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Ņ…Đ˛ĐžŅŅ‚Đ° Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. МоĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģи, Ņ‚Đ°ĐēиĐĩ ĐēаĐē K, M, G иĐģи T (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, \-\-tail 1G). Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии вĐŧĐĩҁ҂Đĩ ҁ ĐēĐžĐŧаĐŊдОК \`locate\`. .TP .B \-A, \-\-stats ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đš вид ŅŅ‚Đ°Ņ‚ŅƒŅĐ°, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ. На ŅĐēŅ€Đ°ĐŊĐĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŅ два ĐŗŅ€Đ°Ņ„Đ¸Đēа: ПĐĩŅ€Đ˛Ņ‹Đš ĐŗŅ€Đ°Ņ„Đ¸Đē ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐžĐģĐžŅ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа, а Ņ‚Đ°ĐēĐļĐĩ ĐŋŅƒŅ‚ŅŒ Đē Ņ„Đ°ĐšĐģ҃, Đē ĐēĐžŅ‚ĐžŅ€ĐžĐŧ҃ в даĐŊĐŊŅ‹Đš ĐŧĐžĐŧĐĩĐŊŅ‚ ĐžŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐģŅĐĩŅ‚ŅŅ Đ´ĐžŅŅ‚ŅƒĐŋ ĐŊа ŅŅ‚ĐžĐŧ Đ´Đ¸ŅĐēĐĩ. ĐžĐąŅ‹Ņ‡ĐŊĐž ŅĐ°ĐŧŅ‹Đš ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ иĐŧĐĩŅ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐąŅƒŅ„ĐĩŅ€Đ°, Ņ‡Ņ‚Đž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžŅŅ‚Đ¸ĐļиĐŧŅƒŅŽ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊŅƒŅŽ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ. Đ’Ņ‚ĐžŅ€ĐžĐš ĐŗŅ€Đ°Ņ„Đ¸Đē ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐŋĐžŅ‚Ņ€Đ°Ņ‡ĐĩĐŊĐŊĐžĐŗĐž ĐŊа ĐžĐļидаĐŊиĐĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ 100 ҁĐĩĐē҃ĐŊĐ´. ОĐļидаĐĩŅ‚ŅŅ, Ņ‡Ņ‚Đž ŅĐ°ĐŧŅ‹Đš ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē Đ˛Ņ‹ĐˇĐžĐ˛ĐĩŅ‚ йОĐģŅŒŅˆŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžĐļидаĐŊĐ¸Ņ, в Ņ‚Đž Đ˛Ņ€ĐĩĐŧŅ ĐēаĐē Đ´Ņ€ŅƒĐŗĐ¸Đĩ Đ´Đ¸ŅĐēи Đ´ĐžĐģĐļĐŊŅ‹ иĐŧĐĩŅ‚ŅŒ ĐŧаĐģĐž иĐģи ŅĐžĐ˛ŅĐĩĐŧ ĐŊĐĩ иĐŧĐĩŅ‚ŅŒ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžĐļидаĐŊĐ¸Ņ, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž ĐžĐŊи ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ˛ĐžĐ¸ ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŋĐžĐģĐžŅŅ‹. Đ­Ņ‚ĐžŅ‚ ĐŗŅ€Đ°Ņ„Đ¸Đē Ņ‚Đ°ĐēĐļĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Đ˛Ņ€ĐĩĐŧŅ, ĐŋĐžŅ‚Ņ€Đ°Ņ‡ĐĩĐŊĐŊĐžĐĩ ĐŊа ĐžĐļидаĐŊиĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиК Ņ…ŅŅˆĐ° и Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиК RAID. Đ’ŅĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅŽŅ‚ŅŅ ĐŋĐ°Ņ€Đ°ĐģĐģĐĩĐģҌĐŊĐž ҁ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Đŧи ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅĐŧи. ĐĄĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐž, ĐŋĐžĐēа ĐĩŅŅ‚ŅŒ иСĐŧĐĩŅ€Đ¸ĐŧĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐžĐļидаĐŊĐ¸Ņ Đ´ĐģŅ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ŅŅ‚Đž ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŊа Ņ‚Đž, Ņ‡Ņ‚Đž ĐĻП Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž ĐąŅ‹ŅŅ‚Ņ€, Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒŅŅ ҁ Ņ€Đ°ĐąĐžŅ‡ĐĩĐš ĐŊĐ°ĐŗŅ€ŅƒĐˇĐēОК. .TP .B \-Z, \-\-force\-zero Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģа ҁ ĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ€Đ°ĐŊĐĩĐĩ ĐąŅ‹Đģ ĐŊĐĩĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚ Ņ‚Đ°ĐēĐžĐĩ ҃ҁĐģОвиĐĩ, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐģĐĩĐŗĐēĐž ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° ĐŋĐžŅĐģĐĩ ŅĐąĐžŅ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐąŅ‹Đģи ҃ҁĐĩ҇ĐĩĐŊŅ‹. Đ­Ņ‚Đž вОСĐŧĐžĐļĐŊĐžĐĩ ҃ҁĐģОвиĐĩ в Linux ҁ Ņ„Đ°ĐšĐģĐžĐ˛Ņ‹Đŧи ŅĐ¸ŅŅ‚ĐĩĐŧаĐŧи ext3/ext4. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`sync\`. .TP .B \-E, \-\-force\-empty Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Đ´Đ¸ŅĐēа, ĐŊа ĐēĐžŅ‚ĐžŅ€ĐžĐŧ ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Đ˛ŅĐĩ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚, Ņ‡Ņ‚Đž Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, иСĐŊĐ°Ņ‡Đ°ĐģҌĐŊĐž ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐŊа Đ´Đ¸ŅĐēĐĩ, ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ иĐģи ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°ĐŊŅ‹, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐģĐĩĐŗĐēĐž ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Ņ„Đ°ĐšĐģĐžĐ˛Đ°Ņ ŅĐ¸ŅŅ‚ĐĩĐŧа даĐŊĐŊҋ҅ ĐŊĐĩ ҁĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊа. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`sync\`. .TP .B \-U, \-\-force\-uuid Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸, ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи и Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ҁ Đ´Đ¸ŅĐēаĐŧи, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… иСĐŧĐĩĐŊиĐģŅŅ UUID. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚, Ņ‡Ņ‚Đž ҃ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… Đ´Đ¸ŅĐēОв иСĐŧĐĩĐŊиĐģŅŅ UUID, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Đ˛Đ°ŅˆĐ¸ Đ´Đ¸ŅĐēи ҁĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹ в ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊҋ҅ Ņ‚ĐžŅ‡ĐēĐ°Ņ… ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. ОдĐŊаĐēĐž Đ´ĐžĐŋ҃ҁĐēаĐĩŅ‚ŅŅ ОдĐŊĐžĐēŅ€Đ°Ņ‚ĐŊĐžĐĩ иСĐŧĐĩĐŊĐĩĐŊиĐĩ UUID ҁ ОдиĐŊĐžŅ‡ĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ, и йОĐģҌ҈Đĩ ҁ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛ĐĩĐŊĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž ŅŅ‚Đž ĐŊĐžŅ€ĐŧаĐģҌĐŊŅ‹Đš ҁĐģŅƒŅ‡Đ°Đš ĐŋŅ€Đ¸ СаĐŧĐĩĐŊĐĩ Đ´Đ¸ŅĐēОв ĐŋĐžŅĐģĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`sync\`, \`check\` иĐģи \`fix\`. .TP .B \-D, \-\-force\-device Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ҁ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи Đ´Đ¸ŅĐēаĐŧи иĐģи ҁ Đ´Đ¸ŅĐēаĐŧи ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐžĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐģи два Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ и ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ СаĐŋĐ°ŅĐŊОК Đ´Đ¸ŅĐē Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž ĐŋĐĩŅ€Đ˛ĐžĐŗĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛Ņ‚ĐžŅ€ĐžĐš ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đš Đ´Đ¸ŅĐē. ИĐģи, ĐĩҁĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ´Đ¸ŅĐē в ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐĩ ĐŧĐĩŅŅ‚Đž, ĐžŅŅ‚Đ°Đ˛ŅˆĐĩĐĩŅŅ ĐŊа ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŧ Đ´Đ¸ŅĐēĐĩ, ŅĐžĐ˛ĐŧĐĩҁ҂ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‰ĐĩĐŧ Ņ‚Đž ĐļĐĩ Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐžĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`fix\`. .TP .B \-N, \-\-force\-nocopy В \`sync\`, \`check\` и \`fix\`, ĐžŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ŅĐ˛Ņ€Đ¸ŅŅ‚Đ¸Đē҃ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐ¸Ņ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. БĐĩС ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸ SnapRAID ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ‚, Ņ‡Ņ‚Đž Ņ„Đ°ĐšĐģŅ‹ ҁ ОдиĐŊаĐēĐžĐ˛Ņ‹Đŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ĐēаĐē иĐŧŅ, Ņ€Đ°ĐˇĐŧĐĩŅ€ и ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ĐēĐžĐŋĐ¸ŅĐŧи ҁ ОдиĐŊаĐēĐžĐ˛Ņ‹Đŧи даĐŊĐŊŅ‹Đŧи. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ иĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ҁ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŊа Đ´Ņ€ŅƒĐŗĐžĐš и ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҃ĐļĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Ņ…ŅŅˆĐ° Đ´ĐģŅ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐ¸Ņ ҁĐēҀҋ҂ҋ҅ ĐžŅˆĐ¸ĐąĐžĐē иĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… Ņ„Đ°ĐšĐģОв. В ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… Ņ€ĐĩĐ´ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… ŅŅ‚Đž ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ĐģĐžĐļĐŊŅ‹Đŧ ŅŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐŊĐ¸ŅĐŧ иĐģи СаĐŧĐĩĐ´ĐģĐĩĐŊĐ¸ŅŽ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° иС\-Са йОĐģŅŒŅˆĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐžĐē Ņ…ŅŅˆĐ°, и ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋОСвОĐģŅĐĩŅ‚ Ņ€ĐĩŅˆĐ¸Ņ‚ŅŒ Ņ‚Đ°ĐēиĐĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`sync\`, \`check\` и \`fix\`. .TP .B \-F, \-\-force\-full В \`sync\`, Ņ„ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐžĐģĐŊŅ‹Đš ĐŋĐĩŅ€Đĩҁ҇ĐĩŅ‚ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ дОйавĐģŅĐĩŅ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ иĐģи ĐĩҁĐģи Đ˛Ņ‹ вĐĩŅ€ĐŊ҃ĐģĐ¸ŅŅŒ Đē ŅŅ‚Đ°Ņ€ĐžĐŧ҃ Ņ„Đ°ĐšĐģ҃ content, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ йОĐģĐĩĐĩ ŅĐ˛ĐĩĐļиĐĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ВĐŧĐĩŅŅ‚Đž Ņ‚ĐžĐŗĐž Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ‚ŅŒ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ҁ ĐŊ҃ĐģŅ, ŅŅ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ…ŅŅˆĐ¸, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ content, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ и ĐŋОддĐĩŅ€ĐļаĐŊĐ¸Ņ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ даĐŊĐŊҋ҅ вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° \`sync\` ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… даĐŊĐŊҋ҅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`sync\`. .TP .B \-R, \-\-force\-realloc В \`sync\`, Ņ„ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐžĐģĐŊĐžĐĩ ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ Ņ„Đ°ĐšĐģОв и ĐŋĐĩŅ€ĐĩŅŅ‚Ņ€ĐžĐĩĐŊиĐĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ ĐŋĐžĐģĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸, ĐŋŅ€Đ¸ ŅŅ‚ĐžĐŧ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ Ņ…ŅŅˆĐ¸, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ content, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ \`sync\`. ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ ĐĩĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ. ĐŖ Đ˛Đ°Ņ НЕĐĸ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ даĐŊĐŊҋ҅ вО Đ˛Ņ€ĐĩĐŧŅ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail РАЗМЕР Đ Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐēаĐē \-R, \-\-force\-realloc, ĐŊĐž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ҃ĐēаСаĐŊĐŊОК Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐš Ņ‡Đ°ŅŅ‚ŅŒŅŽ (ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ РАЗМЕР ĐąĐ°ĐšŅ‚) ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐŸŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ (ĐŋĐĩŅ€ĐĩĐŧĐĩŅ‰Đ°ĐĩŅ‚) ĐģŅŽĐąŅ‹Đĩ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊ҂ҋ/ĐąĐģĐžĐēи Ņ„Đ°ĐšĐģОв, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸ĐĩŅŅ в даĐŊĐŊŅ‹Đš ĐŧĐžĐŧĐĩĐŊŅ‚ в ŅŅ‚ĐžĐš Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐš Ņ‡Đ°ŅŅ‚Đ¸, ĐŋОСвОĐģŅŅ Ņ€Đ°ĐˇĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐģŅŽĐąĐžĐŧ ĐŧĐĩҁ҂Đĩ Ņ„Đ°ĐšĐģа(Ов) ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐŗĐ´Đĩ ĐĩŅŅ‚ŅŒ ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐĩ ĐŧĐĩŅŅ‚Đž (вĐēĐģŅŽŅ‡Đ°Ņ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐŋŅƒŅŅ‚ĐžŅ‚Ņ‹). ĐžŅĐŊОвĐŊĐ°Ņ ҆ĐĩĐģҌ ŅŅ‚ĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° — ҃ĐŧĐĩĐŊŅŒŅˆĐ¸Ņ‚ŅŒ СаĐŊиĐŧаĐĩĐŧŅ‹Đš ĐŊа Đ´Đ¸ŅĐēĐĩ Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ Đ˛ŅŅŽ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ (в ĐŊĐĩĐš ĐŊĐĩ ĐžŅŅ‚Đ°ĐŊĐĩŅ‚ŅŅ ĐąĐģĐžĐēОв), Ņ„Đ°ĐšĐģ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐąŅƒĐ´ĐĩŅ‚ ĐžĐąŅ€ĐĩСаĐŊ, Đ˛Ņ‹ŅĐ˛ĐžĐąĐžĐļĐ´Đ°Ņ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐĩ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž. МоĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģи, Ņ‚Đ°ĐēиĐĩ ĐēаĐē K, M, G иĐģи T (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, \-\-force\-realloc\-tail 1G). Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ locate \-t, \-\-tail, Ņ‡Ņ‚ĐžĐąŅ‹ ĐˇĐ°Ņ€Đ°ĐŊĐĩĐĩ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. ВНИМАНИЕ! Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐĩĐŗĐž ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ. Во Đ˛Ņ€ĐĩĐŧŅ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ \`sync\` ĐˇĐ°Ņ‰Đ¸Ņ‚Đ° даĐŊĐŊҋ҅ Đ´ĐģŅ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Ņ… Ņ„Đ°ĐšĐģОв ОĐĸĐĄĐŖĐĸĐĄĐĸĐ’ĐŖĐ•Đĸ. .TP .B \-l, \-\-log FILE ЗаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ ĐŋĐžĐ´Ņ€ĐžĐąĐŊŅ‹Đš ĐļŅƒŅ€ĐŊаĐģ в ҃ĐēаСаĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ. Đ•ŅĐģи ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ ҃ĐēаСаĐŊа, ĐŊĐĩĐŋŅ€ĐĩдвидĐĩĐŊĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ ĐŊа ŅĐēŅ€Đ°ĐŊ, Ņ‡Ņ‚Đž ĐŋĐžŅ‚ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ҇ҀĐĩСĐŧĐĩŅ€ĐŊĐžĐŧ҃ Đ˛Ņ‹Đ˛ĐžĐ´Ņƒ в ҁĐģŅƒŅ‡Đ°Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đ° ĐžŅˆĐ¸ĐąĐžĐē. ĐšĐžĐŗĐ´Đ° ҃ĐēаСаĐŊа \-l, \-\-log, ĐŊа ŅĐēŅ€Đ°ĐŊ Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°Ņ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋŅ€Đ¸Đ˛ĐžĐ´ŅŅ‚ Đē ĐžŅŅ‚Đ°ĐŊОвĐēĐĩ SnapRAID. Đ•ŅĐģи ĐŋŅƒŅ‚ŅŒ ĐŊĐ°Ņ‡Đ¸ĐŊаĐĩŅ‚ŅŅ ҁ \`>>\`, Ņ„Đ°ĐšĐģ ĐžŅ‚ĐēŅ€Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ в Ņ€ĐĩĐļиĐŧĐĩ дОйавĐģĐĩĐŊĐ¸Ņ. Đ’Ņ…ĐžĐļĐ´ĐĩĐŊĐ¸Ņ \`%D\` и \`%T\` в иĐŧĐĩĐŊи СаĐŧĐĩĐŊŅŅŽŅ‚ŅŅ Đ´Đ°Ņ‚ĐžĐš и Đ˛Ņ€ĐĩĐŧĐĩĐŊĐĩĐŧ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ ГГГГММДД и ЧЧММСС. В ĐŋаĐēĐĩŅ‚ĐŊҋ҅ Ņ„Đ°ĐšĐģĐ°Ņ… Windows Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐ´Đ˛ĐžĐ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģ \`%\`, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, result\-%%D.log. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ \`>>\`, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ СаĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ иĐŧŅ в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, \`\[dq]>>result.log\[dq]\`. ДĐģŅ Đ˛Ņ‹Đ˛ĐžĐ´Đ° ĐļŅƒŅ€ĐŊаĐģа ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš Đ˛Ņ‹Đ˛ĐžĐ´ иĐģи ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅƒŅŽ ĐžŅˆĐ¸ĐąĐē҃, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ \`\[dq]>&1\[dq]\` и \`\[dq]>&2\[dq]\` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊĐž. ОĐŋĐ¸ŅĐ°ĐŊиĐĩ Ņ‚ĐĩĐŗĐžĐ˛ ĐļŅƒŅ€ĐŊаĐģа ҁĐŧ. в Ņ„Đ°ĐšĐģĐĩ snapraid_log.txt иĐģи man\-ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ. .TP .B \-L, \-\-error\-limit NUMBER ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŊĐžĐ˛Ņ‹Đš ĐģиĐŧĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐžĐē Đ´Đž ĐžŅŅ‚Đ°ĐŊОвĐēи Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ SnapRAID ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ŅŅ, ĐĩҁĐģи ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚ йОĐģĐĩĐĩ 100 ĐžŅˆĐ¸ĐąĐžĐē ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, Ņ‡Ņ‚Đž ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŊа вĐĩŅ€ĐžŅŅ‚ĐŊŅ‹Đš ŅĐąĐžĐš Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ вĐģĐ¸ŅĐĩŅ‚ ĐŊа \`sync\` и \`scrub\`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đŧ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ°Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Ņƒ ĐŋĐžŅĐģĐĩ ĐŋĐĩŅ€Đ˛ĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Đ° Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐžŅˆĐ¸ĐąĐžĐē, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐŋŅ‹Ņ‚Đ°Ņ‚ŅŒŅŅ СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒ ŅĐ˛ĐžĐ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸. ОдĐŊаĐēĐž \`check\` и \`fix\` Đ˛ŅĐĩĐŗĐ´Đ° ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŋĐĩŅ€Đ˛ĐžĐš ĐžŅˆĐ¸ĐąĐēĐĩ. .TP .B \-S, \-\-start BLKSTART ĐĐ°Ņ‡Đ¸ĐŊаĐĩŅ‚ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đē҃ ҁ ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐŊĐžĐŧĐĩŅ€Đ° ĐąĐģĐžĐēа. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊОК ĐŋĐžĐŋҋ҂Đēи ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ иĐģи Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đĩ ĐąĐģĐžĐēи в ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. .TP .B \-B, \-\-count BLKCOUNT ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ҃ĐēаСаĐŊĐŊĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąĐģĐžĐēОв. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. .TP .B \-C, \-\-gen\-conf CONTENT ГĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩŅ‚ Ņ„Đ¸ĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ иС ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐŗĐž Ņ„Đ°ĐšĐģа content. ФаКĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ СаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš Đ˛Ņ‹Đ˛ĐžĐ´ и ĐŊĐĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đš. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Ņ‚Đ°ĐēĐļĐĩ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅƒŅŽ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžŅ‡ĐĩĐē ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēОв в ҁĐģŅƒŅ‡Đ°Đĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ Đ˛ŅŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. .TP .B \-v, \-\-verbose ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ йОĐģҌ҈Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ•ŅĐģи ҃ĐēаСаĐŊа ОдиĐŊ Ņ€Đ°Đˇ, ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ и Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đē҃. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа Ņ„Đ°ĐšĐģŅ‹ ĐļŅƒŅ€ĐŊаĐģа. .TP .B \-q, \-\-quiet ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐŧĐĩĐŊҌ҈Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ•ŅĐģи ҃ĐēаСаĐŊа ОдиĐŊ Ņ€Đ°Đˇ, ŅƒĐ´Đ°ĐģŅĐĩŅ‚ иĐŊдиĐēĐ°Ņ‚ĐžŅ€ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ; дваĐļĐ´Ņ‹, Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸; Ņ‚Ņ€Đ¸ĐļĐ´Ņ‹, иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊŅ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ; ҇Đĩ҂ҋҀĐĩĐļĐ´Ņ‹, ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ Đž ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ. Đ¤Đ°Ņ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи Đ˛ŅĐĩĐŗĐ´Đ° Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа Ņ„Đ°ĐšĐģŅ‹ ĐļŅƒŅ€ĐŊаĐģа. .TP .B \-H, \-\-help ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐēŅ€Đ°Ņ‚ĐēиК ŅĐēŅ€Đ°ĐŊ ҁĐŋŅ€Đ°Đ˛Đēи. .TP .B \-V, \-\-version ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ вĐĩŅ€ŅĐ¸ŅŽ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹. .SH CONFIGURATION SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ СĐŊĐ°Ņ‚ŅŒ, ĐŗĐ´Đĩ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ Đ˛Đ°Ņˆ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Đš ĐŧĐ°ŅŅĐ¸Đ˛ и ĐŗĐ´Đĩ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP В Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ \`/usr/local/etc/snapraid.conf\`, ĐĩҁĐģи ĐžĐŊ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚, в ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ \`/etc/snapraid.conf\`. В Windows Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ \`snapraid.conf\` в Ņ‚ĐžĐŧ ĐļĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ, Ņ‡Ņ‚Đž и \`snapraid.exe\`. .PP ОĐŊ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸ (Ņ‡ŅƒĐ˛ŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đē Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Ņƒ): .SS parity FILE [,FILE] ... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ЧĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņƒ ĐžŅ‚ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа, ĐŋОдОйĐŊĐž RAID5. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ ĐŊа Ņ€Đ°ĐˇĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. ĐšĐžĐŗĐ´Đ° Ņ„Đ°ĐšĐģ йОĐģҌ҈Đĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ Ņ€Đ°ŅŅ‚Đ¸, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đš. ĐžĐąŅ‰ĐĩĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŋĐž ĐēŅ€Đ°ĐšĐŊĐĩĐš ĐŧĐĩŅ€Đĩ Ņ‚Đ°ĐēиĐŧ ĐļĐĩ йОĐģŅŒŅˆĐ¸Đŧ, ĐēаĐē ŅĐ°ĐŧŅ‹Đš йОĐģŅŒŅˆĐžĐš Đ´Đ¸ŅĐē даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋОСĐļĐĩ, ĐŊĐž Đ˛Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€Đĩ҃ĐŋĐžŅ€ŅĐ´ĐžŅ‡Đ¸Ņ‚ŅŒ иĐģи ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸Ņ…. .PP ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи ĐŊĐĩ ŅŅ‚Đ°ĐŊŅƒŅ‚ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи, ҃ĐģŅƒŅ‡ŅˆĐ°Ņ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ. .PP В Windows 256 МБ ĐžŅŅ‚Đ°ĐĩŅ‚ŅŅ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŋŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊĐ¸Ņ Đž ĐŋĐžĐģĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. .PP Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊОК и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Ņ€Đ°Đˇ. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ҃ĐēаСаĐŊĐŊĐžĐŗĐž ŅƒŅ€ĐžĐ˛ĐŊŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ ОдиĐŊ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹: .PD 0 .IP \(bu 2\-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ двОКĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ RAID6. .IP \(bu 3\-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚Ņ€ĐžĐšĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. .IP \(bu 4\-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ҇ĐĩŅ‚Đ˛ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. .IP \(bu 5\-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐŋŅŅ‚ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. .IP \(bu 6\-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ҈Đĩҁ҂ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. .PD .PP КаĐļĐ´Ņ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŊаĐģĐ¸Ņ‡Đ¸Ņ Đ˛ŅĐĩŅ… ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Ņ… ŅƒŅ€ĐžĐ˛ĐŊĐĩĐš ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP ĐŸŅ€Đ¸ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ Ņ‚Đĩ ĐļĐĩ ŅĐžĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ, Ņ‡Ņ‚Đž и Đ´ĐģŅ ĐžĐŋŅ†Đ¸Đ¸ \`parity\`. .PP Đ­Ņ‚Đ¸ ĐžĐŋŅ†Đ¸Đ¸ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ĐŊĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊŅ‹Đŧи и ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Ņ€Đ°Đˇ. .SS z\-parity FILE [,FILE] ... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ и Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚Ņ€ĐžĐšĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐžĐš \`3\-parity\`, в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊОК Đ´ĐģŅ ҁĐģĐ°ĐąŅ‹Ņ… ĐŋŅ€ĐžŅ†ĐĩŅŅĐžŅ€ĐžĐ˛, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ARM иĐģи AMD Phenom, Athlon и Opteron, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ ĐŊĐ°ĐąĐžŅ€ иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đš SSSE3. В Ņ‚Đ°ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… ĐžĐŊа ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ ĐģŅƒŅ‡ŅˆŅƒŅŽ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ. .PP Đ­Ņ‚ĐžŅ‚ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋĐžŅ…ĐžĐļ ĐŊа Ņ‚ĐžŅ‚, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ZFS RAIDZ3, ĐŊĐž ĐąŅ‹ŅŅ‚Ņ€ĐĩĐĩ. КаĐē и ZFS, ĐžĐŊ ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ Са ĐŋŅ€ĐĩĐ´ĐĩĐģаĐŧи Ņ‚Ņ€ĐžĐšĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. .PP ĐŸŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии \`3\-parity\` Đ˛Ņ‹ ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊŅ‹, ĐĩҁĐģи Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ \`z\-parity\` Đ´ĐģŅ ĐŋĐžĐ˛Ņ‹ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸. .PP ВозĐŧĐžĐļĐŊĐž ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиĐĩ иС ОдĐŊĐžĐŗĐž Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ° в Đ´Ņ€ŅƒĐŗĐžĐš ĐŋŅƒŅ‚ĐĩĐŧ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи Ņ„Đ°ĐšĐģа ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ҁ ĐļĐĩĐģаĐĩĐŧŅ‹Đŧ Ņ„Đ°ĐšĐģĐžĐŧ z\-parity иĐģи 3\-parity и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ \`fix\` Đ´ĐģŅ ĐĩĐŗĐž Đ˛ĐžŅŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ. .SS content FILE ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ҁĐŋĐ¸ŅĐēа и ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊҋ҅ ҁ҃ĐŧĐŧ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. .PP ОĐŊ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Ņ€Đ°ĐˇĐŧĐĩ҉ĐĩĐŊ ĐŊа Đ´Đ¸ŅĐēĐĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŧ Đ´ĐģŅ даĐŊĐŊҋ҅, ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, иĐģи ĐģŅŽĐąĐžĐŧ Đ´Ņ€ŅƒĐŗĐžĐŧ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ. Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Đ´Đ¸ŅĐē даĐŊĐŊҋ҅, ŅŅ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ иС ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° \`sync\`. .PP Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊОК и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ Đ´ĐģŅ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… ĐēĐžĐŋиК ОдĐŊĐžĐŗĐž и Ņ‚ĐžĐŗĐž ĐļĐĩ Ņ„Đ°ĐšĐģа. .PP Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐēаĐē ĐŧиĐŊиĐŧ҃Đŧ ОдĐŊ҃ ĐēĐžĐŋĐ¸ŅŽ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŗĐž Đ´Đ¸ŅĐēа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐģŅŽŅ ОдĐŊ҃. Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐēĐžĐŋиК ĐŊĐĩ ĐŋĐžĐ˛Ņ€ĐĩĐ´Đ¸Ņ‚. .SS data NAME DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ иĐŧŅ и Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēОв даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. NAME Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´Đ¸ŅĐēа и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ҃ĐŊиĐēаĐģҌĐŊŅ‹Đŧ. DIR — ŅŅ‚Đž Ņ‚ĐžŅ‡Đēа ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēа в Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ иСĐŧĐĩĐŊŅŅ‚ŅŒ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ĐŋĐž ĐŧĐĩŅ€Đĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸, ĐŋĐžĐēа Đ˛Ņ‹ ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚Đĩ NAME Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ. .PP Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ОдĐŊ҃ ĐžĐŋŅ†Đ¸ŅŽ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐē ĐŋОСĐļĐĩ, иСĐŧĐĩĐŊив NAME ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, а ĐˇĐ°Ņ‚ĐĩĐŧ СаĐŋŅƒŅŅ‚Đ¸Đ˛ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\`. В ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊĐ¸Ņ, Đ°ŅŅĐžŅ†Đ¸Đ°Ņ†Đ¸Ņ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊĐžĐŗĐž UUID Đ´Đ¸ŅĐēОв. .SS extra NAME DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ иĐŧŅ и Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ Đ´Đ¸ŅĐēОв Đ´ĐģŅ ĐŧĐžĐŊĐ¸Ņ‚ĐžŅ€Đ¸ĐŊĐŗĐ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´ \`smart\` и \`probe\`. .PP Đ­Ņ‚Đž ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ ĐŧĐžĐŊĐ¸Ņ‚ĐžŅ€Đ¸ĐŊĐŗĐ° Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ Ņ‡Đ°ŅŅ‚ŅŒŅŽ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, ĐŊĐž ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹ Đ´ĐģŅ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžŅ‡ĐŊŅ‹Đš Đ´Đ¸ŅĐē. .PP ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ вĐŊиĐŧаĐŊиĐĩ, Ņ‡Ņ‚Đž Ņ‚Đ°ĐēиĐĩ Đ´Đ¸ŅĐēи ĐŊĐĩ ĐˇĐ°Ņ‚Ņ€Đ°ĐŗĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`up\` и \`down\`, Ņ‚Đ°Đē ĐēаĐē ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ‚ŅŅ, Ņ‡Ņ‚Đž ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‚ŅŅ. .SS nohidden Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Đ˛ŅĐĩ ҁĐēҀҋ҂ҋĐĩ Ņ„Đ°ĐšĐģŅ‹ и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸. В Unix ҁĐēҀҋ҂ҋĐĩ Ņ„Đ°ĐšĐģŅ‹ — ŅŅ‚Đž Ņ‚Đĩ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŅ ҁ \`.\`. В Windows — ŅŅ‚Đž Ņ‚Đĩ, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐĩŅŅ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Ņ‹Đš Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚. .SS exclude/include PATTERN ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ Ņ„Đ°ĐšĐģОв иĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ Đ´ĐģŅ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ иĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ в ĐŋŅ€ĐžŅ†Đĩҁҁ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ’ŅĐĩ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ҃ĐēаСаĐŊĐŊĐžĐŧ ĐŋĐžŅ€ŅĐ´ĐēĐĩ. .PP Đ•ŅĐģи ĐŋĐĩŅ€Đ˛Ņ‹Đš ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‰Đ¸Đš ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž \`exclude\`, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи ŅŅ‚Đž \`include\`, Ņ„Đ°ĐšĐģ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи ĐŊи ОдиĐŊ ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐĩ ŅĐžĐ˛ĐŋадаĐĩŅ‚, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ, ĐĩҁĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ҃ĐēаСаĐŊĐŊŅ‹Đš ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž \`include\`, иĐģи вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ, ĐĩҁĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž \`exclude\`. .PP ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ Đž ҁĐŋĐĩŅ†Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŅ… ŅˆĐ°ĐąĐģĐžĐŊОв ҁĐŧ. в Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ PATTERN. .PP Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. .SS blocksize SIZE_IN_KIBIBYTES ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐąĐ°ĐˇĐžĐ˛Ņ‹Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа в ĐēĐ¸ĐąĐ¸ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ОдиĐŊ ĐēĐ¸ĐąĐ¸ĐąĐ°ĐšŅ‚ — ŅŅ‚Đž 1024 ĐąĐ°ĐšŅ‚Đ°. .PP РаСĐŧĐĩŅ€ ĐąĐģĐžĐēа ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 256, Ņ‡Ņ‚Đž Đ´ĐžĐģĐļĐŊĐž Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ в йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв. .PP ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ иСĐŧĐĩĐŊŅŅ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ. Đ§Ņ‚ĐžĐąŅ‹ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ в ĐąŅƒĐ´ŅƒŅ‰ĐĩĐŧ, ваĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Đ˛ŅŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ! .PP ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа — ĐĩҁĐģи ҃ Đ˛Đ°Ņ ĐŧĐŊĐžĐŗĐž ĐŧаĐģĐĩĐŊҌĐēĐ¸Ņ… Ņ„Đ°ĐšĐģОв, ĐŋĐžŅ€ŅĐ´Đēа ĐŧиĐģĐģиОĐŊОв. .PP ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа, даĐļĐĩ ĐĩҁĐģи Đ˛ŅĐĩĐŗĐž ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐąĐ°ĐšŅ‚ĐžĐ˛, Đ˛Ņ‹Đ´ĐĩĐģŅĐĩŅ‚ŅŅ ҆ĐĩĐģŅ‹Đš ĐąĐģĐžĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и ĐŋŅ€Đ¸ йОĐģŅŒŅˆĐžĐŧ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ„Đ°ĐšĐģОв ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē СĐŊĐ°Ņ‡Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đŧ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đŧ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°Đŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ СаĐŋĐžĐģĐŊĐ¸Ņ‚Đĩ Đ´Đ¸ŅĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ваĐŧ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž дОйавĐģŅŅ‚ŅŒ йОĐģҌ҈Đĩ Ņ„Đ°ĐšĐģОв ĐŊа Đ´Đ¸ŅĐēи даĐŊĐŊҋ҅. ОдĐŊаĐēĐž ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐ°Ņ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŊĐĩ ĐŊаĐēаĐŋĐģиваĐĩŅ‚ŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅. ĐŸĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž, вОСĐŊиĐēĐ°ŅŽŅ‰ĐĩĐĩ иС\-Са йОĐģŅŒŅˆĐžĐŗĐž Ņ‡Đ¸ŅĐģа Ņ„Đ°ĐšĐģОв ĐŊа Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅, ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐžĐąŅŠĐĩĐŧ даĐŊĐŊҋ҅ ĐŊа ŅŅ‚ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅, а ĐŊĐĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ…. .PP В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐŋŅ€Đ¸ĐąĐģиĐļĐĩĐŊĐ¸Ņ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļĐ¸Ņ‚ŅŒ, Ņ‡Ņ‚Đž ĐŋĐžĐģОвиĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐąĐģĐžĐēа Ņ‚ĐĩŅ€ŅĐĩŅ‚ŅŅ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€Đ¸ 100 000 Ņ„Đ°ĐšĐģОв и Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ ĐąĐģĐžĐēа 256 КиБ Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ 12,8 ГБ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Ņ‡Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ҃ĐŧĐĩĐŊҌ҈ĐĩĐŊĐ¸ŅŽ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° ĐŊа Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐŊа 12,8 ГБ. .PP Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ \`status\`. Đ­Ņ‚Đž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ŅĐ˛ĐžĐąĐžĐ´ĐŊŅ‹Đŧ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅ иĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ Ņ„Đ°ĐšĐģОв, ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛. Đ•ŅĐģи ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐžŅ‚Ņ€Đ¸Ņ†Đ°Ņ‚ĐĩĐģҌĐŊĐžĐĩ, ŅŅ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ˛Ņ‹ ĐąĐģиСĐēи Đē СаĐŋĐžĐģĐŊĐĩĐŊĐ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и ĐžĐŊĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ Đ˛ŅĐĩ Đĩ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅ‚ĐĩŅ€ŅŅ‚ŅŒ. .PP Đ§Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅŅ‚ĐžĐš ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ йОĐģŅŒŅˆĐ¸Đš Ņ€Đ°ĐˇĐ´ĐĩĐģ Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Ņ€Đ°ĐˇĐ´ĐĩĐģ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŊа 12,8 ГБ йОĐģҌ҈Đĩ, ҇ĐĩĐŧ Đ´Đ¸ŅĐēи даĐŊĐŊҋ҅, ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи Đ´Đž 100 000 Ņ„Đ°ĐšĐģОв ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐąĐĩС ĐēаĐēĐ¸Ņ…\-ĐģийО ĐŋĐžŅ‚ĐĩŅ€ŅŒ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°. .PP ĐĨĐ¸Ņ‚Ņ€ĐžŅŅ‚ŅŒ Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ йОĐģҌ҈ĐĩĐŗĐž Ņ€Đ°ĐˇĐ´ĐĩĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ в Linux — ĐžŅ‚Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž ĐēĐžĐŧаĐŊдОК: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Đ­Ņ‚Đž ĐŋŅ€Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ Đē ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 1,5% Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°, ĐŋŅ€Đ¸ĐąĐģĐ¸ĐˇĐ¸Ņ‚ĐĩĐģҌĐŊĐž 60 ГБ Đ´ĐģŅ Đ´Đ¸ŅĐēа 4 ĐĸБ, Ņ‡Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ ĐžĐēĐžĐģĐž 460 000 Ņ„Đ°ĐšĐģОв ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐąĐĩС ĐēаĐēĐ¸Ņ…\-ĐģийО ĐŋĐžŅ‚ĐĩŅ€ŅŒ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°. .SS hashsize SIZE_IN_BYTES ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊҋ҅ ĐąĐģĐžĐēОв. .PP РаСĐŧĐĩŅ€ Ņ…ŅŅˆĐ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 16 ĐąĐ°ĐšŅ‚ (128 ĐąĐ¸Ņ‚), Ņ‡Ņ‚Đž Đ´ĐžĐģĐļĐŊĐž Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ в йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв. .PP ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ иСĐŧĐĩĐŊŅŅ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ. Đ§Ņ‚ĐžĐąŅ‹ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ в ĐąŅƒĐ´ŅƒŅ‰ĐĩĐŧ, ваĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Đ˛ŅŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ! .PP ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° — ĐĩҁĐģи Đ˛Đ°ŅˆĐ° ŅĐ¸ŅŅ‚ĐĩĐŧа иĐŧĐĩĐĩŅ‚ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊŅƒŅŽ ĐŋаĐŧŅŅ‚ŅŒ. КаĐē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, SnapRAID ĐžĐąŅ‹Ņ‡ĐŊĐž ҂ҀĐĩĐąŅƒĐĩŅ‚ 1 ГиБ ĐžĐ—ĐŖ ĐŊа ĐēаĐļĐ´Ņ‹Đĩ 16 ĐĸБ даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. .PP В Ņ‡Đ°ŅŅ‚ĐŊĐžŅŅ‚Đ¸, Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ…ŅŅˆĐĩĐš даĐŊĐŊҋ҅ SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŋŅ€Đ¸ĐąĐģĐ¸ĐˇĐ¸Ņ‚ĐĩĐģҌĐŊĐž TS*(1+HS)/BS ĐąĐ°ĐšŅ‚ ĐžĐ—ĐŖ, ĐŗĐ´Đĩ TS — ŅŅ‚Đž ĐžĐąŅ‰Đ¸Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ˛Đ°ŅˆĐĩĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°, BS — Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа в ĐąĐ°ĐšŅ‚Đ°Ņ…, и HS — Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° в ĐąĐ°ĐšŅ‚Đ°Ņ…. .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€Đ¸ 8 Đ´Đ¸ŅĐēĐ°Ņ… ĐŋĐž 4 ĐĸБ, Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ ĐąĐģĐžĐēа 256 КиБ (1 КиБ = 1024 ĐąĐ°ĐšŅ‚Đ°) и Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ Ņ…ŅŅˆĐ° 16, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB .PD 0 .PD .PP ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° 8, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB .PD 0 .PD .PP ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа 512, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB .PD 0 .PD .PP ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐēаĐē ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° 8, Ņ‚Đ°Đē и ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа 512, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ĐŋŅ€Đ¸ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ иĐģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐĩ ĐŋĐžŅĐģĐĩ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° ГБ. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋĐžĐģĐĩСĐŊа, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐēа Đ´ĐģĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐēĐžĐŧаĐŊĐ´ \`sync\` ҁ ĐŊ҃ĐģŅ, ĐĩҁĐģи ĐžĐŊи ĐąŅ‹Đģи ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊŅ‹ ŅĐąĐžĐĩĐŧ ĐŧĐ°ŅˆĐ¸ĐŊŅ‹ иĐģи ĐģŅŽĐąŅ‹Đŧ Đ´Ņ€ŅƒĐŗĐ¸Đŧ ŅĐžĐąŅ‹Ņ‚Đ¸ĐĩĐŧ. .SS temp_limit TEMPERATURE_CELSIUS ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅƒŅŽ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа в ĐĻĐĩĐģŅŒŅĐ¸ŅŅ…. Đ•ŅĐģи ҃ĐēаСаĐŊĐž, SnapRAID ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ° smartctl. ĐĸĐĩĐēŅƒŅ‰Đ¸Đĩ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ Đ´Đ¸ŅĐēОв ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŅ вО Đ˛Ņ€ĐĩĐŧŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹ SnapRAID. Đ•ŅĐģи ĐēаĐēОК\-ĐģийО Đ´Đ¸ŅĐē ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ĐĩŅ‚ ŅŅ‚ĐžŅ‚ ĐģиĐŧĐ¸Ņ‚, Đ˛ŅĐĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ, и Đ´Đ¸ŅĐēи ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ (ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŅ‚ в Ņ€ĐĩĐļиĐŧ ĐžĐļидаĐŊĐ¸Ņ) ĐŊа Đ˛Ņ€ĐĩĐŧŅ, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ ĐžĐŋŅ†Đ¸ĐĩĐš \`temp_sleep\`. ĐŸĐžŅĐģĐĩ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ° ĐžĐļидаĐŊĐ¸Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ вОСОйĐŊОвĐģŅŅŽŅ‚ŅŅ, ĐŋĐžŅ‚ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐž ҁĐŊОва ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŅŅŒ, ĐĩҁĐģи ĐģиĐŧĐ¸Ņ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ Đ´ĐžŅŅ‚Đ¸ĐŗĐ°ĐĩŅ‚ŅŅ Đĩ҉Đĩ Ņ€Đ°Đˇ. .PP Во Đ˛Ņ€ĐĩĐŧŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹ SnapRAID Ņ‚Đ°ĐēĐļĐĩ аĐŊаĐģĐ¸ĐˇĐ¸Ņ€ŅƒĐĩŅ‚ ĐēŅ€Đ¸Đ˛ŅƒŅŽ ĐŊĐ°ĐŗŅ€Đĩва ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа и ĐžŅ†ĐĩĐŊиваĐĩŅ‚ Đ´ĐžĐģĐŗĐžŅŅ€ĐžŅ‡ĐŊŅƒŅŽ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆŅƒŅŽŅŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ, ĐēĐžŅ‚ĐžŅ€ŅƒŅŽ ĐžĐŊи, ĐēаĐē ĐžĐļидаĐĩŅ‚ŅŅ, Đ´ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚, ĐĩҁĐģи аĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŅ. ĐžŅ†ĐĩĐŊĐēа Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐžŅĐģĐĩ Ņ‚ĐžĐŗĐž, ĐēаĐē Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ´Đ¸ŅĐēа ŅƒĐ˛ĐĩĐģĐ¸Ņ‡Đ¸ĐģĐ°ŅŅŒ ҇Đĩ҂ҋҀĐĩ Ņ€Đ°ĐˇĐ°, Ņ‡Ņ‚Đž ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚ ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° даĐŊĐŊҋ҅ Đ´ĐģŅ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐŊадĐĩĐļĐŊОК Ņ‚ĐĩĐŊĐ´ĐĩĐŊŅ†Đ¸Đ¸. Đ­Ņ‚Đ° ĐŋŅ€ĐžĐŗĐŊĐžĐˇĐ¸Ņ€ŅƒĐĩĐŧĐ°Ņ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ°ŅŅŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ в ҁĐēОйĐēĐ°Ņ… Ņ€ŅĐ´ĐžĐŧ ҁ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đŧ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩĐŧ и ĐŋĐžĐŧĐžĐŗĐ°ĐĩŅ‚ ĐžŅ†ĐĩĐŊĐ¸Ņ‚ŅŒ, Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž Đģи ĐžŅ…ĐģаĐļĐ´ĐĩĐŊиĐĩ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. Đ­Ņ‚Đ° ĐžŅ†ĐĩĐŊĐžŅ‡ĐŊĐ°Ņ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ и ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ SnapRAID. ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ ĐžŅĐŊĐžĐ˛Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Đ¸ŅĐēĐģŅŽŅ‡Đ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŊа Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐĩҁĐēĐ¸Ņ… иСĐŧĐĩŅ€ĐĩĐŊĐŊҋ҅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ°Ņ… Đ´Đ¸ŅĐēОв. .PP ДĐģŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ŅŅ‚ĐžĐŗĐž аĐŊаĐģиСа SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ŅŅ‚Đ°ĐģĐžĐŊ Đ´ĐģŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐžĐŊ ĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ ĐĩĐŗĐž иС Đ´ĐžŅŅ‚ŅƒĐŋĐŊҋ҅ аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊҋ҅ Đ´Đ°Ņ‚Ņ‡Đ¸ĐēОв. Đ•ŅĐģи ĐŊи ОдиĐŊ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš Đ´Đ°Ņ‚Ņ‡Đ¸Đē ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ, ĐžĐŊ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ŅĐ°ĐŧŅƒŅŽ ĐŊиСĐēŅƒŅŽ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа, иСĐŧĐĩŅ€ĐĩĐŊĐŊŅƒŅŽ в ĐŊĐ°Ņ‡Đ°ĐģĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ŅŅ‚Đ°ĐģĐžĐŊа. .PP ĐžĐąŅ‹Ņ‡ĐŊĐž SnapRAID ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ŅĐ°ĐŧĐžĐŗĐž ĐŗĐžŅ€ŅŅ‡ĐĩĐŗĐž Đ´Đ¸ŅĐēа. Đ§Ņ‚ĐžĐąŅ‹ ĐžŅ‚ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚ŅŒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ \-A иĐģи \-\-stats. .SS temp_sleep TIME_IN_MINUTES ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€ĐĩĐŧŅ ĐžĐļидаĐŊĐ¸Ņ, в ĐŧиĐŊŅƒŅ‚Đ°Ņ…, ĐēĐžĐŗĐ´Đ° Đ´ĐžŅŅ‚Đ¸ĐŗĐ°ĐĩŅ‚ŅŅ ĐŋŅ€ĐĩĐ´ĐĩĐģ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹. В Ņ‚Đĩ҇ĐĩĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ĐŋĐĩŅ€Đ¸ĐžĐ´Đ° Đ´Đ¸ŅĐēи ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ‹Đŧи. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 5 ĐŧиĐŊŅƒŅ‚. .SS pool DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ (pooling), ĐŗĐ´Đĩ ŅĐžĐˇĐ´Đ°ĐĩŅ‚ŅŅ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´Ņ‹ \`pool\`. .PP ĐšĐ°Ņ‚Đ°ĐģĐžĐŗ Đ´ĐžĐģĐļĐĩĐŊ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ. .SS share UNC_DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŋŅƒŅ‚ŅŒ UNC Windows, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹Đš Đ´ĐģŅ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ´Đ¸ŅĐēаĐŧ. .PP Đ•ŅĐģи ҃ĐēаСаĐŊа ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ, ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи, ŅĐžĐˇĐ´Đ°ĐŊĐŊŅ‹Đĩ в ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ pool, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ ŅŅ‚ĐžŅ‚ ĐŋŅƒŅ‚ŅŒ UNC Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ´Đ¸ŅĐēаĐŧ. БĐĩС ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸ ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐģĐžĐēаĐģҌĐŊŅ‹Đĩ ĐŋŅƒŅ‚Đ¸, Ņ‡Ņ‚Đž ĐŊĐĩ ĐŋОСвОĐģŅĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅŅ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool ĐŋĐž ҁĐĩŅ‚Đ¸. .PP ХиĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи Ņ„ĐžŅ€ĐŧĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐŋŅƒŅ‚Đ¸ UNC, дОйавĐģĐĩĐŊиĐĩĐŧ иĐŧĐĩĐŊи Đ´Đ¸ŅĐēа, ĐēаĐē ҃ĐēаСаĐŊĐž в ĐžĐŋŅ†Đ¸Đ¸ \`data\`, и, ĐŊаĐēĐžĐŊĐĩ҆, дОйавĐģĐĩĐŊиĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° и иĐŧĐĩĐŊи Ņ„Đ°ĐšĐģа. .PP Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ Windows. .SS smartctl DISK/PARITY OPTIONS... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиĐĩ ĐžĐŋŅ†Đ¸Đ¸ smartctl Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ĐžĐ˛ SMART Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩŅ€ĐžĐ˛ RAID и ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… USB\-Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊŅ‹ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи. ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌ %s СаĐŧĐĩĐŊŅĐĩŅ‚ŅŅ иĐŧĐĩĐŊĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°, ĐŊĐž ĐžĐŊ ĐŊĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ Đ´ĐģŅ Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩҀҋ RAID. .PP DISK — ŅŅ‚Đž Ņ‚Đž ĐļĐĩ иĐŧŅ Đ´Đ¸ŅĐēа, ҃ĐēаСаĐŊĐŊĐžĐĩ в ĐžĐŋŅ†Đ¸Đ¸ \`data\`. PARITY — ŅŅ‚Đž ОдĐŊĐž иС иĐŧĐĩĐŊ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` иĐģи \`z\-parity\`. .PP В ҃ĐēаСаĐŊĐŊҋ҅ OPTIONS ŅŅ‚Ņ€ĐžĐēа \`%s\` СаĐŧĐĩĐŊŅĐĩŅ‚ŅŅ иĐŧĐĩĐŊĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°. ДĐģŅ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩŅ€ĐžĐ˛ RAID ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž, вĐĩŅ€ĐžŅŅ‚ĐŊĐž, Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž, и ваĐŧ ĐŧĐžĐļĐĩŅ‚ ĐŊĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ \`%s\`. .PP ВозĐŧĐžĐļĐŊŅ‹Đĩ ĐžĐŋŅ†Đ¸Đ¸ ҁĐŧ. в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ smartmontools: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒĐĩŅ‚ ҃ĐēаСаĐŊĐŊŅ‹Đš Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ SMART ĐŋŅ€Đ¸ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊии вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ŅĐąĐžŅ Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋĐžĐģĐĩСĐŊа, ĐĩҁĐģи Đ´Đ¸ŅĐē ŅĐžĐžĐąŅ‰Đ°ĐĩŅ‚ ĐŊĐĩĐžĐąŅ‹Ņ‡ĐŊŅ‹Đĩ иĐģи Đ˛Đ˛ĐžĐ´ŅŅ‰Đ¸Đĩ в СайĐģ҃ĐļĐ´ĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ Đ´ĐģŅ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°. .PP DISK — ŅŅ‚Đž Ņ‚Đž ĐļĐĩ иĐŧŅ Đ´Đ¸ŅĐēа, ҃ĐēаСаĐŊĐŊĐžĐĩ в ĐžĐŋŅ†Đ¸Đ¸ \`data\`. PARITY — ŅŅ‚Đž ОдĐŊĐž иС иĐŧĐĩĐŊ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` иĐģи \`z\-parity\`. ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ * ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ° ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ…. .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Ņ‡Ņ‚ĐžĐąŅ‹ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ \`Current Pending Sector Count\` ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ…: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP Đ§Ņ‚ĐžĐąŅ‹ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž Ņ‚ĐžĐģҌĐēĐž ĐŊа ĐŋĐĩŅ€Đ˛ĐžĐŧ Đ´Đ¸ŅĐēĐĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples ĐŸŅ€Đ¸ĐŧĐĩŅ€ Ņ‚Đ¸ĐŋĐ¸Ņ‡ĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Unix: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP ĐŸŅ€Đ¸ĐŧĐĩŅ€ Ņ‚Đ¸ĐŋĐ¸Ņ‡ĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Windows: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN ШайĐģĐžĐŊŅ‹ ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ŅŽŅ‚ ĐŗĐ¸ĐąĐēиК ҁĐŋĐžŅĐžĐą Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģОв Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ иĐģи Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅĐ¸ĐŧвОĐģŅ‹ ĐŋĐžĐ´ŅŅ‚Đ°ĐŊОвĐēи (globbing), Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸Đģа, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đŧ иĐŧĐĩĐŊаĐŧ Ņ„Đ°ĐšĐģОв иĐģи ҆ĐĩĐģŅ‹Đŧ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ°Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ ĐąĐĩС Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ ĐēаĐļĐ´ĐžĐŗĐž ĐŋŅƒŅ‚Đ¸. .PP ВоĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē \`?\` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐŧ҃ ОдиĐŊĐžŅ‡ĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃, ĐēŅ€ĐžĐŧĐĩ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. Đ­Ņ‚Đž Đ´ĐĩĐģаĐĩŅ‚ ĐĩĐŗĐž ĐŋĐžĐģĐĩСĐŊŅ‹Đŧ Đ´ĐģŅ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ иĐŧĐĩĐŊ Ņ„Đ°ĐšĐģОв ҁ ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đŧи ŅĐ¸ĐŧвОĐģаĐŧи, ĐŋŅ€Đ¸ ŅŅ‚ĐžĐŧ ŅˆĐ°ĐąĐģĐžĐŊ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ОдĐŊиĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°. .PP ОдиĐŊĐžŅ‡ĐŊĐ°Ņ СвĐĩĐˇĐ´ĐžŅ‡Đēа \`*\` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸ ŅĐ¸ĐŧвОĐģОв, ĐŊĐž, ĐēаĐē и вОĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē, ĐžĐŊа ĐŊиĐēĐžĐŗĐ´Đ° ĐŊĐĩ ĐŋĐĩŅ€ĐĩҁĐĩĐēаĐĩŅ‚ ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ОĐŊа ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ŅŅ ĐŊа ĐŋŅ€ŅĐŧОК ĐēĐžŅĐžĐš ҇ĐĩҀ҂Đĩ, Ņ‡Ņ‚Đž Đ´ĐĩĐģаĐĩŅ‚ ĐĩĐĩ ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰ĐĩĐš Đ´ĐģŅ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ вĐŊŅƒŅ‚Ņ€Đ¸ ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ĐŋŅƒŅ‚Đ¸. Đ­Ņ‚Đž ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐĩ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ ĐŋĐžĐ´ŅŅ‚Đ°ĐŊĐžĐ˛ĐžŅ‡ĐŊҋ҅ СĐŊаĐēОв, СĐŊаĐēĐžĐŧĐžĐĩ ĐŋĐž ОйОĐģĐžŅ‡ĐēĐĩ (shell). .PP ДвойĐŊĐ°Ņ СвĐĩĐˇĐ´ĐžŅ‡Đēа \`**\` йОĐģĐĩĐĩ ĐŧĐžŅ‰ĐŊĐ°Ņ, ĐžĐŊа ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸ ŅĐ¸ĐŧвОĐģОв, вĐēĐģŅŽŅ‡Đ°Ņ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊаĐŧ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēиĐŧ ŅƒŅ€ĐžĐ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ĐšĐžĐŗĐ´Đ° \`**\` ĐŋĐžŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в ŅˆĐ°ĐąĐģĐžĐŊĐĩ, ĐžĐŊа ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊ҃ĐģŅŽ иĐģи йОĐģĐĩĐĩ ŅĐ¸ĐŧвОĐģаĐŧ, вĐēĐģŅŽŅ‡Đ°Ņ ĐēĐžŅŅ‹Đĩ ҇ĐĩҀ҂ҋ ĐŧĐĩĐļĐ´Ņƒ ĐžĐēŅ€ŅƒĐļĐ°ŅŽŅ‰Đ¸Đŧ ĐąŅƒĐēваĐģҌĐŊŅ‹Đŧ Ņ‚ĐĩĐēŅŅ‚ĐžĐŧ. .PP НаибоĐģĐĩĐĩ ваĐļĐŊŅ‹Đŧ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ \`**\` ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊĐ°Ņ Ņ„ĐžŅ€Đŧа \`/**/\`. ОĐŊа ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐŊ҃ĐģŅŽ иĐģи йОĐģĐĩĐĩ ĐŋĐžĐģĐŊŅ‹Đŧ ŅƒŅ€ĐžĐ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, Ņ‡Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģŅŅ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ ĐŊа ĐģŅŽĐąĐžĐš ĐŗĐģŅƒĐąĐ¸ĐŊĐĩ в Đ´ĐĩŅ€ĐĩвĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, ĐŊĐĩ СĐŊĐ°Ņ Ņ‚ĐžŅ‡ĐŊОК ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Ņ‹ ĐŋŅƒŅ‚Đ¸. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ŅˆĐ°ĐąĐģĐžĐŊ \`src/**/main.js\` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ \`src/main.js\` (ĐŋŅ€ĐžĐŋ҃ҁĐē ĐŊĐžĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛), \`src/ui/main.js\` (ĐŋŅ€ĐžĐŋ҃ҁĐē ОдĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°) и \`src/ui/components/main.js\` (ĐŋŅ€ĐžĐŋ҃ҁĐē Đ´Đ˛ŅƒŅ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛). .PP КĐģĐ°ŅŅŅ‹ ŅĐ¸ĐŧвОĐģОв ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊҋ҅ ҁĐēОйОĐē \`[]\` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃ иС СадаĐŊĐŊĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Đ° иĐģи диаĐŋаСОĐŊа. КаĐē и Đ´Ņ€ŅƒĐŗĐ¸Đĩ ОдĐŊĐžŅĐ¸ĐŧвОĐģҌĐŊŅ‹Đĩ ŅˆĐ°ĐąĐģĐžĐŊŅ‹, ĐžĐŊи ĐŊĐĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. КĐģĐ°ŅŅŅ‹ ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ диаĐŋаСОĐŊŅ‹ и ĐžŅ‚Ņ€Đ¸Ņ†Đ°ĐŊиĐĩ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ Đ˛ĐžŅĐēĐģĐ¸Ņ†Đ°Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž СĐŊаĐēа. .PP Đ¤ŅƒĐŊдаĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊĐžĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ¸Đĩ, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ ĐŋĐžĐŧĐŊĐ¸Ņ‚ŅŒ, СаĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ в Ņ‚ĐžĐŧ, Ņ‡Ņ‚Đž \`*\`, \`?\` и ĐēĐģĐ°ŅŅŅ‹ ŅĐ¸ĐŧвОĐģОв ŅĐžĐąĐģŅŽĐ´Đ°ŅŽŅ‚ ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ и ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž вĐŊŅƒŅ‚Ņ€Đ¸ ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ĐŋŅƒŅ‚Đ¸, в Ņ‚Đž Đ˛Ņ€ĐĩĐŧŅ ĐēаĐē \`**\` — ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš ŅˆĐ°ĐąĐģĐžĐŊ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ҇ĐĩŅ€ĐĩС Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. .PP ĐĄŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚ ҇Đĩ҂ҋҀĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊҋ҅ Ņ‚Đ¸Đŋа ŅˆĐ°ĐąĐģĐžĐŊОв: .TP .B FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ FILE. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐŊĐž ĐŊĐĩ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ. .TP .B DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąŅƒŅŽ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅŽ ҁ иĐŧĐĩĐŊĐĩĐŧ DIR и Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŊĐĩĐĩ. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ, ĐŊĐž ĐŊĐĩ Đē Ņ„Đ°ĐšĐģаĐŧ. .TP .B /PATH/FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ Đē Ņ„Đ°ĐšĐģ҃. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐŊĐž ĐŊĐĩ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ. .TP .B /PATH/DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸Đ¸ и Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŊĐĩĐĩ. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ, ĐŊĐž ĐŊĐĩ Đē Ņ„Đ°ĐšĐģаĐŧ. .PP ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚Đĩ Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‰Đ¸ĐšŅŅ ҁ /, ĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đē ĐēĐžŅ€ĐŊĐĩвОĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, а ĐŊĐĩ Đē ĐēĐžŅ€ĐŊĐĩвОĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐģĐžĐēаĐģҌĐŊОК Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. .PP В Windows Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅ€Đ°Ņ‚ĐŊŅƒŅŽ ĐēĐžŅŅƒŅŽ ҇ĐĩŅ€Ņ‚Ņƒ \\ вĐŧĐĩŅŅ‚Đž ĐŋŅ€ŅĐŧОК /. ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows, Ņ‚ĐžŅ‡Đēи ŅĐžĐĩдиĐŊĐĩĐŊĐ¸Ņ, Ņ‚ĐžŅ‡Đēи ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ и Đ´Ņ€ŅƒĐŗĐ¸Đĩ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows Ņ€Đ°ŅŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐēаĐē Ņ„Đ°ĐšĐģŅ‹, Ņ‡Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´ĐģŅ Đ¸Ņ… Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ„Đ°ĐšĐģа, а ĐŊĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°. .PP Đ•ŅĐģи иĐŧŅ Ņ„Đ°ĐšĐģа ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ŅĐ¸ĐŧвОĐģŅ‹ \`*\`, \`?\`, \`[\`, иĐģи \`]\`, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ¸Ņ…, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ Đ¸Ņ… иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Đ¸Đ¸ ĐēаĐē ŅĐ¸ĐŧвОĐģОв ĐŗĐģОййиĐŊĐŗĐ°. В Unix ŅĐ¸ĐŧвОĐģĐžĐŧ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ \`\\\`; в Windows — \`^\`. ĐšĐžĐŗĐ´Đ° ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ в ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐ´Đ˛ĐžĐ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐĩĐŗĐž иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Đ¸Đ¸ ĐēĐžĐŧаĐŊĐ´ĐŊОК ОйОĐģĐžŅ‡ĐēОК. .PP В Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊŅ‹Đĩ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸Đ¸ Đ´ĐģŅ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģОв Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи. ХаĐŧŅ‹Đš ĐŋŅ€ĐžŅŅ‚ĐžĐš ĐŋĐžĐ´Ņ…ĐžĐ´ — Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа \`exclude\` Đ´ĐģŅ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ ĐŊĐĩ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: .PP .RS 4 # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐēĐžŅ€ĐŊĐĩвОК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP ĐŸŅ€ĐžŅ‚Đ¸Đ˛ĐžĐŋĐžĐģĐžĐļĐŊŅ‹Đš ĐŋĐžĐ´Ņ…ĐžĐ´ — ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа \`include\`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: .PP .RS 4 # ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP КоĐŊĐĩ҇ĐŊŅ‹Đš ĐŋĐžĐ´Ņ…ĐžĐ´ — ҁĐŧĐĩŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸Đģа \`exclude\` и \`include\`. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐžŅ€ŅĐ´ĐžĐē ĐŋŅ€Đ°Đ˛Đ¸Đģ ваĐļĐĩĐŊ. БоĐģĐĩĐĩ Ņ€Đ°ĐŊĐŊиĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа иĐŧĐĩŅŽŅ‚ ĐŋŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đž ĐŊад йОĐģĐĩĐĩ ĐŋОСдĐŊиĐŧи. ДĐģŅ ҃ĐŋŅ€ĐžŅ‰ĐĩĐŊĐ¸Ņ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐŊĐ°Ņ‡Đ°Đģа ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа \`exclude\`, а ĐˇĐ°Ņ‚ĐĩĐŧ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа \`include\`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: .PP .RS 4 # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP В ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ \-f, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ŅˆĐ°ĐąĐģĐžĐŊŅ‹ \`include\`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: .PP .RS 4 # ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹ .mp3. .PD 0 .PP .PD # В Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ ĐŗĐģОййиĐŊĐŗĐ° ОйОĐģĐžŅ‡ĐēОК. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP В Unix ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ŅĐ¸ĐŧвОĐģОв ĐŗĐģОййиĐŊĐŗĐ° в ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ СаĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚Đ¸Ņ‚ŅŒ Đ¸Ņ… Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ ОйОĐģĐžŅ‡ĐēОК. .SH IGNORE FILE В Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊиĐĩ Đē ĐŗĐģОйаĐģҌĐŊŅ‹Đŧ ĐŋŅ€Đ°Đ˛Đ¸ĐģаĐŧ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ‰Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ \`.snapraidignore\` в ĐģŅŽĐąĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŧĐ°ŅŅĐ¸Đ˛Đ° Đ´ĐģŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ´Đĩ҆ĐĩĐŊŅ‚Ņ€Đ°ĐģиСОваĐŊĐŊҋ҅ ĐŋŅ€Đ°Đ˛Đ¸Đģ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. .PP ĐŸŅ€Đ°Đ˛Đ¸Đģа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ в \`.snapraidignore\`, ĐŋŅ€Đ¸ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋĐžŅĐģĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģ в ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐžĐŊĐŊĐžĐŧ Ņ„Đ°ĐšĐģĐĩ. Đ­Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи иĐŧĐĩŅŽŅ‚ йОĐģĐĩĐĩ Đ˛Ņ‹ŅĐžĐēиК ĐŋŅ€Đ¸ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ и ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€Đ°ĐŊĐĩĐĩ ĐąŅ‹Đģи вĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ ĐŗĐģОйаĐģҌĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐĩĐš. ФаĐēŅ‚Đ¸Ņ‡ĐĩҁĐēи, ĐĩҁĐģи ĐģĐžĐēаĐģҌĐŊĐžĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ŅĐžĐ˛ĐŋадаĐĩŅ‚, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ ĐŗĐģОйаĐģҌĐŊҋ҅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐē вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. .PP Đ›ĐžĐŗĐ¸Đēа ŅˆĐ°ĐąĐģĐžĐŊОв в \`.snapraidignore\` ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅĐĩŅ‚ ĐŗĐģОйаĐģҌĐŊŅƒŅŽ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŽ, ĐŊĐž ĐŋŅ€Đ¸Đ˛ŅĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, в ĐēĐžŅ‚ĐžŅ€ĐžĐŧ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ Ņ„Đ°ĐšĐģ: .TP .B FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ FILE в ŅŅ‚ĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ иĐģи ĐŊиĐļĐĩ. ЗдĐĩҁҌ Đ´ĐĩĐšŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ‚Đĩ ĐļĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŋĐžĐ´ŅŅ‚Đ°ĐŊОвĐēи, Ņ‡Ņ‚Đž и в ĐŗĐģОйаĐģҌĐŊĐžĐŧ ŅˆĐ°ĐąĐģĐžĐŊĐĩ. .TP .B DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ DIR и Đ˛ŅĐĩ ĐĩĐŗĐž ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ, ĐŊĐ°Ņ…ĐžĐ´ŅŅ‰ĐĩĐĩŅŅ в ŅŅ‚ĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ иĐģи ĐŊиĐļĐĩ. .TP .B /PATH/FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа \`.snapraidignore\`. .TP .B /PATH/DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ и Đ˛ŅĐĩ ĐĩĐŗĐž ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа \`.snapraidignore\`. .PP В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ ĐŗĐģОйаĐģҌĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Ņ„Đ°ĐšĐģŅ‹ \`.snapraidignore\` ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ; Đ˛Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ \`include\` иĐģи ĐžŅ‚Ņ€Đ¸Ņ†Đ°ĐŊиĐĩ (!). .PP НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ \`.snapraidignore\` в \`/mnt/disk1/projects/\`: .PP .RS 4 # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐĸОЛĐŦКО /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ \`build\` вĐŊŅƒŅ‚Ņ€Đ¸ projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš .tmp Ņ„Đ°ĐšĐģ вĐŊŅƒŅ‚Ņ€Đ¸ projects/ иĐģи ĐĩĐŗĐž ĐŋОдĐŋаĐŋĐžĐē .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ ҁĐŋĐ¸ŅĐžĐē и ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ ҁ҃ĐŧĐŧŅ‹ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģОв в Ņ„Đ°ĐšĐģĐĩ content. .PP Đ­Ņ‚Đž йиĐŊĐ°Ņ€ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, вĐŧĐĩҁ҂Đĩ ŅĐž Đ˛ŅĐĩĐŧи ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đŧи ҁ҃ĐŧĐŧаĐŧи Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Đ¸Ņ… ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. .PP Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ и СаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`sync\` и \`scrub\` и ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`fix\`, \`check\` и \`status\`. .SH PARITY SnapRAID Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ˛Đ°ŅˆĐĩĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ° в Ņ„Đ°ĐšĐģĐ°Ņ… parity. .PP Đ­Ņ‚Đž йиĐŊĐ°Ņ€ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸Đĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ Đ˛ŅĐĩŅ… ĐąĐģĐžĐēОв, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ в Ņ„Đ°ĐšĐģĐĩ \`content\`. .PP Đ­Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ и СаĐŋĐ¸ŅŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`sync\` и \`fix\` и Ņ‚ĐžĐģҌĐēĐž ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`scrub\` и \`check\`. .SH ENCODING SnapRAID в Unix Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ. ОĐŊ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ и Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв ҁ Ņ‚ĐĩĐŧ ĐļĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧОК. .PP В Windows Đ˛ŅĐĩ иĐŧĐĩĐŊа, ŅŅ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ‹Đĩ иС Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹, ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒŅŽŅ‚ŅŅ и ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ UTF\-8. .PP Đ§Ņ‚ĐžĐąŅ‹ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐģĐ¸ŅŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐēĐžĐŊŅĐžĐģҌ Windows в Ņ€ĐĩĐļиĐŧ UTF\-8 ĐēĐžĐŧаĐŊдОК \`chcp 65001\` и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅˆŅ€Đ¸Ņ„Ņ‚ TrueType, Ņ‚Đ°ĐēОК ĐēаĐē \`Lucida Console\`, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ŅˆŅ€Đ¸Ņ„Ņ‚Đ° ĐēĐžĐŊŅĐžĐģи. Đ­Ņ‚Đž вĐģĐ¸ŅĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐĩĐŧŅ‹Đĩ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв; ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚Đĩ Đ˛Ņ‹Đ˛ĐžĐ´ ĐēĐžĐŊŅĐžĐģи в Ņ„Đ°ĐšĐģ, Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ¸Ņ€ŅƒŅŽŅ‰Đ¸Đš Ņ„Đ°ĐšĐģ Đ˛ŅĐĩĐŗĐ´Đ° в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ UTF\-8. .SH COPYRIGHT Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊ Đ°Đ˛Ņ‚ĐžŅ€ŅĐēиĐŧ ĐŋŅ€Đ°Đ˛ĐžĐŧ (C) 2025 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ru.d000066400000000000000000003244341522717156100164300ustar00rootroot00000000000000Name{number} snapraid - Đ ĐĩСĐĩŅ€Đ˛ĐŊĐžĐĩ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ SnapRAID Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐ˛ Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAID — ŅŅ‚Đž ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đ°ĐŊĐŊĐ°Ņ Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐ˛, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ даĐŊĐŊҋ҅ в ҁĐģŅƒŅ‡Đ°Đĩ ŅĐąĐžŅ Đ´Đž ҈ĐĩŅŅ‚Đ¸ Đ´Đ¸ŅĐēОв. В ĐŋĐĩŅ€Đ˛ŅƒŅŽ ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŒ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊĐ°Ņ Đ´ĐģŅ Đ´ĐžĐŧĐ°ŅˆĐŊĐ¸Ņ… ĐŧĐĩĐ´Đ¸Đ°Ņ†ĐĩĐŊŅ‚Ņ€ĐžĐ˛ ҁ йОĐģŅŒŅˆĐ¸Đŧи, Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ Ņ„Đ°ĐšĐģаĐŧи, SnapRAID ĐŋŅ€ĐĩĐ´ĐģĐ°ĐŗĐ°ĐĩŅ‚ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ„ŅƒĐŊĐēŅ†Đ¸Đš: * Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи, ҃ĐļĐĩ СаĐŋĐžĐģĐŊĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģаĐŧи, ĐąĐĩС ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸ Đ¸Ņ… ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ĐŋĐžĐģŅƒŅ‡Đ°Ņ Đē ĐŊиĐŧ Đ´ĐžŅŅ‚ŅƒĐŋ ĐēаĐē ĐžĐąŅ‹Ņ‡ĐŊĐž. * Đ’ŅĐĩ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ Đ´ĐģŅ ОйĐĩҁĐŋĐĩ҇ĐĩĐŊĐ¸Ņ ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ даĐŊĐŊҋ҅ и ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰ĐĩĐŊĐ¸Ņ ҁĐēŅ€Ņ‹Ņ‚ĐžĐŗĐž ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐ¸Ņ. * ĐšĐžĐŗĐ´Đ° Ņ‡Đ¸ŅĐģĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ĐĩŅ‚ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐŋĐžŅ‚ĐĩŅ€Ņ даĐŊĐŊҋ҅ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đŧи Đ´Đ¸ŅĐēаĐŧи; даĐŊĐŊŅ‹Đĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ… ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи. * Đ•ŅĐģи Đ˛Ņ‹ ҁĐģŅƒŅ‡Đ°ĐšĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊа Đ´Đ¸ŅĐēĐĩ, вОСĐŧĐžĐļĐŊĐž Đ¸Ņ… Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ. * Đ”Đ¸ŅĐēи ĐŧĐžĐŗŅƒŅ‚ иĐŧĐĩŅ‚ŅŒ Ņ€Đ°ĐˇĐŊŅ‹Đĩ Ņ€Đ°ĐˇĐŧĐĩҀҋ. * Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ дОйавĐģŅŅ‚ŅŒ Đ´Đ¸ŅĐēи в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ. * SnapRAID ĐŊĐĩ ĐąĐģĐžĐēĐ¸Ņ€ŅƒĐĩŅ‚ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ; Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‚Đ¸Ņ‚ŅŒ ĐĩĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐąĐĩС ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ иĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐ¸Ņ даĐŊĐŊҋ҅. * ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Ņ„Đ°ĐšĐģ҃ Đ´ĐžĐģĐļĐĩĐŊ Ņ€Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Đ´Đ¸ŅĐē, Ņ‡Ņ‚Đž ŅĐēĐžĐŊĐžĐŧĐ¸Ņ‚ ŅĐŊĐĩŅ€ĐŗĐ¸ŅŽ и ҁĐŊиĐļаĐĩŅ‚ ҈҃Đŧ. ДĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸, ĐŋĐžĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģҌĐŊŅ‹Đš ŅĐ°ĐšŅ‚ SnapRAID: :https://www.snapraid.it/ Limitations SnapRAID — ŅŅ‚Đž ĐŗĐ¸ĐąŅ€Đ¸Đ´ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ RAID и ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ҁ҂ҀĐĩĐŧŅŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ ĐģŅƒŅ‡ŅˆĐ¸Đĩ ĐŋŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đ° ОйĐĩĐ¸Ņ…. ОдĐŊаĐēĐž ҃ ĐŊĐĩĐŗĐž ĐĩŅŅ‚ŅŒ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ ŅƒŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ´ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ. ĐžŅĐŊОвĐŊĐžĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ СаĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ в Ņ‚ĐžĐŧ, Ņ‡Ņ‚Đž ĐĩҁĐģи Đ´Đ¸ŅĐē Đ˛Ņ‹Ņ…ĐžĐ´Đ¸Ņ‚ иС ŅŅ‚Ņ€ĐžŅ, а Đ˛Ņ‹ ĐŊĐĩдавĐŊĐž ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŽ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ. В Ņ‡Đ°ŅŅ‚ĐŊĐžŅŅ‚Đ¸, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ в ĐžĐąŅŠĐĩĐŧĐĩ, Ņ€Đ°Đ˛ĐŊĐžĐŧ Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ иСĐŧĐĩĐŊĐĩĐŊĐŊҋ҅ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ­Ņ‚Đž ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚, даĐļĐĩ ĐĩҁĐģи иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ĐŊа ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŧ Đ´Đ¸ŅĐēĐĩ. Đ’ĐžŅ‚ ĐŋĐžŅ‡ĐĩĐŧ҃ SnapRAID ĐģŅƒŅ‡ŅˆĐĩ ĐŋĐžĐ´Ņ…ĐžĐ´Đ¸Ņ‚ Đ´ĐģŅ даĐŊĐŊҋ҅, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. ĐĄ Đ´Ņ€ŅƒĐŗĐžĐš ŅŅ‚ĐžŅ€ĐžĐŊŅ‹, ĐŊĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐŋŅ€ĐĩĐŋŅŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸ŅŽ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… Ņ„Đ°ĐšĐģОв. Đ’Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐĩҁĐģи ĐžĐŊи ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ĐŊа ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŧ Đ´Đ¸ŅĐēĐĩ. Đ”Ņ€ŅƒĐŗĐ¸Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ SnapRAID: * ĐĄĐž SnapRAID ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ Đĩ҉Đĩ ĐžŅ‚Đ´ĐĩĐģҌĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģĐžĐ˛Ņ‹Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĄ RAID Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ ĐĩдиĐŊŅƒŅŽ йОĐģŅŒŅˆŅƒŅŽ Ņ„Đ°ĐšĐģĐžĐ˛ŅƒŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. * SnapRAID ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ ҇ĐĩŅ€ĐĩдОваĐŊиĐĩ даĐŊĐŊҋ҅. ĐĄ RAID Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ ĐŋŅ€Đ¸Ņ€ĐžŅŅ‚ ҁĐēĐžŅ€ĐžŅŅ‚Đ¸ ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€Ņ ҇ĐĩŅ€ĐĩдОваĐŊĐ¸ŅŽ. * SnapRAID ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ в Ņ€ĐĩаĐģҌĐŊĐžĐŧ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐĄ RAID ваĐŧ ĐŊĐĩ ĐŊ҃ĐļĐŊĐž ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Ņƒ ĐŋŅ€Đ¸ ŅĐąĐžĐĩ Đ´Đ¸ŅĐēа. * SnapRAID ĐŧĐžĐļĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊĐžĐŧ Ņ‡Đ¸ŅĐģĐĩ ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв. ĐĄ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅ‹Đŧ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ ĐŋĐžĐģĐŊĐžĐŗĐž ŅĐąĐžŅ Đ˛ŅĐĩĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. * ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв, ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи и ĐļĐĩҁ҂ĐēиĐĩ ҁҁҋĐģĐēи. Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ, ĐŋŅ€Đ°Đ˛Đ° вĐģадĐĩĐŊĐ¸Ņ и Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹ ĐŊĐĩ ŅĐžŅ…Ņ€Đ°ĐŊŅŅŽŅ‚ŅŅ. Getting Started Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ SnapRAID, ваĐŧ ĐŊ҃ĐļĐŊĐž ҁĐŊĐ°Ņ‡Đ°Đģа Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ОдиĐŊ Đ´Đ¸ŅĐē в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ Đ´ĐģŅ Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊĐ¸Ņ ĐŋОд иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ `҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸` (parity). ĐĄ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đ˛Ņ‹ ҁĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа, ĐŋОдОйĐŊĐž RAID5. Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ йОĐģҌ҈ĐĩĐŗĐž Ņ‡Đ¸ŅĐģа ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв, ĐŋОдОйĐŊĐž RAID6, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đ´Đ¸ŅĐēи Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. КаĐļĐ´Ņ‹Đš Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš Đ´Đ¸ŅĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋОСвОĐģŅĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ Đĩ҉Đĩ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа. В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ˛Ņ‹ĐąĐ¸Ņ€Đ°Ņ‚ŅŒ ŅĐ°ĐŧŅ‹Đĩ йОĐģŅŒŅˆĐ¸Đĩ Đ´Đ¸ŅĐēи в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, Ņ‚Đ°Đē ĐēаĐē иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŧĐžĐļĐĩŅ‚ Đ˛Ņ‹Ņ€Đ°ŅŅ‚Đ¸ Đ´Đž Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ŅĐ°ĐŧĐžĐŗĐž йОĐģŅŒŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. Đ­Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐąŅƒĐ´ŅƒŅ‚ Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊŅ‹ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв `҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸`. Đ’Ņ‹ ĐŊĐĩ Đ´ĐžĐģĐļĐŊŅ‹ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐŊа ĐŊĐ¸Ņ… ŅĐ˛ĐžĐ¸ даĐŊĐŊŅ‹Đĩ. Đ—Đ°Ņ‚ĐĩĐŧ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Đ´Đ¸ŅĐēи `даĐŊĐŊҋ҅`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚ŅŒ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ SnapRAID. Đ—Đ°Ņ‰Đ¸Ņ‚Đ° йОĐģĐĩĐĩ ŅŅ„Ņ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊа, ĐĩҁĐģи ŅŅ‚Đ¸ Đ´Đ¸ŅĐēи ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ даĐŊĐŊŅ‹Đĩ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. По ŅŅ‚ĐžĐš ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩ ĐģŅƒŅ‡ŅˆĐĩ НЕ вĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐē Windows C:\ иĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Unix /home, /var и /tmp. ĐĄĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģОв ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ŅŅ в Ņ„Đ°ĐšĐģĐ°Ņ… `content`, ĐžĐąŅ‹Ņ‡ĐŊĐž Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸Ņ…ŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅, ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ иĐģи ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžŅ‡ĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ Đ´ĐĩŅ‚Đ°Đģи Đ˛Đ°ŅˆĐĩĐŗĐž Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, вĐēĐģŅŽŅ‡Đ°Ņ Đ˛ŅĐĩ ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ ҁ҃ĐŧĐŧŅ‹ Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ĐĩĐŗĐž ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. ФаКĐģ `content` Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŅ в ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… ĐēĐžĐŋĐ¸ŅŅ…, и ĐēаĐļĐ´Đ°Ņ ĐēĐžĐŋĐ¸Ņ Đ´ĐžĐģĐļĐŊа ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐŊа ĐžŅ‚Đ´ĐĩĐģҌĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ, Ņ‡Ņ‚Đž даĐļĐĩ в ҁĐģŅƒŅ‡Đ°Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛ĐĩĐŊĐŊҋ҅ ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв, Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊа ĐēĐžĐŋĐ¸Ņ ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ, Ņ‡Ņ‚Đž Đ˛Ņ‹ СаиĐŊŅ‚ĐĩŅ€ĐĩŅĐžĐ˛Đ°ĐŊŅ‹ Ņ‚ĐžĐģҌĐēĐž в ОдĐŊĐžĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и Đ˛Đ°ŅˆĐ¸ Đ´Đ¸ŅĐēи Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊŅ‹ ĐŋĐž Đ°Đ´Ņ€ĐĩŅĐ°Đŧ: :/mnt/diskp <- Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ :/mnt/disk1 <- ĐŋĐĩŅ€Đ˛Ņ‹Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ :/mnt/disk2 <- Đ˛Ņ‚ĐžŅ€ĐžĐš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ :/mnt/disk3 <- ҂ҀĐĩŅ‚Đ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ /etc/snapraid.conf ŅĐž ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧи ĐžĐŋŅ†Đ¸ŅĐŧи: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Windows, ваĐŧ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋŅƒŅ‚Đ¸ Windows, ҁ ĐąŅƒĐēваĐŧи Đ´Đ¸ŅĐēОв и ĐžĐąŅ€Đ°Ņ‚ĐŊŅ‹Đŧи ҁĐģĐĩŅˆĐ°Đŧи вĐŧĐĩŅŅ‚Đž ĐŋŅ€ŅĐŧҋ҅. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŧĐŊĐžĐŗĐž Đ´Đ¸ŅĐēОв и СаĐēаĐŊŅ‡Đ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐąŅƒĐēĐ˛Ņ‹ Đ´Đ¸ŅĐēОв, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в ĐŋОдĐŋаĐŋĐēи. ĐĄĐŧ.: :https://www.google.com/search?q=Windows+mount+point На ŅŅ‚ĐžĐŧ ŅŅ‚Đ°ĐŋĐĩ Đ˛Ņ‹ ĐŗĐžŅ‚ĐžĐ˛Ņ‹ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync` Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. :snapraid sync Đ­Ņ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŧĐžĐļĐĩŅ‚ СаĐŊŅŅ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ‡Đ°ŅĐžĐ˛ в ĐŋĐĩŅ€Đ˛Ņ‹Đš Ņ€Đ°Đˇ, в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸ ĐžŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° даĐŊĐŊҋ҅, ҃ĐļĐĩ ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… ĐŊа Đ´Đ¸ŅĐēĐ°Ņ…. Đ•ŅĐģи Đ´Đ¸ŅĐēи ĐŋŅƒŅŅ‚Ņ‹Đĩ, ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐĩĐŗĐž в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐŊаĐļав Ctrl+C, и ĐŋŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ СаĐŋ҃ҁĐēĐĩ ĐžĐŊ вОСОйĐŊĐžĐ˛Đ¸Ņ‚ Ņ€Đ°ĐąĐžŅ‚Ņƒ ҁ Ņ‚ĐžĐŗĐž ĐŧĐĩŅŅ‚Đ°, ĐŗĐ´Đĩ ĐąŅ‹Đģ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊ. ĐšĐžĐŗĐ´Đ° ŅŅ‚Đ° ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŅ, Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ ЗАЩИЩЕНĐĢ. ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ˛ĐžĐš ĐŧĐ°ŅŅĐ¸Đ˛, ĐēаĐē ваĐŧ ŅƒĐŗĐžĐ´ĐŊĐž, и ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ОйĐŊОвĐģŅŅ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, СаĐŋ҃ҁĐēĐ°Ņ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. Scrubbing ДĐģŅ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ и ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅˆĐ¸ĐąĐžĐē, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub`. :snapraid scrub Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ŅŅ€Đ°Đ˛ĐŊиваĐĩŅ‚ даĐŊĐŊŅ‹Đĩ в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ҁ Ņ…ŅŅˆĐĩĐŧ, Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅ‹Đŧ вО Đ˛Ņ€ĐĩĐŧŅ ĐēĐžĐŧаĐŊĐ´Ņ‹ `sync`, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. КаĐļĐ´Ņ‹Đš СаĐŋ҃ҁĐē ĐēĐžĐŧаĐŊĐ´Ņ‹ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 8% ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ даĐŊĐŊŅ‹Đĩ, ҃ĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ Са ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Đĩ 10 Đ´ĐŊĐĩĐš. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -p, --plan, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž, и ĐžĐŋŅ†Đ¸ŅŽ -o, --older-than, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Đ˛ĐžĐˇŅ€Đ°ŅŅ‚ в Đ´ĐŊŅŅ…. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи 5% ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ĐąĐģĐžĐēОв ŅŅ‚Đ°Ņ€ŅˆĐĩ 20 Đ´ĐŊĐĩĐš, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ: :snapraid -p 5 -o 20 scrub Đ•ŅĐģи вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ `content` и ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ в ĐēĐžĐŧаĐŊĐ´Đĩ `status`. :snapraid status Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Đ¸Ņ…, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`, Ņ„Đ¸ĐģŅŒŅ‚Ņ€ŅƒŅ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ -e, --filter-error: :snapraid -e fix ĐŸŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ `scrub` ĐžŅˆĐ¸ĐąĐēи Đ¸ŅŅ‡ĐĩСĐŊŅƒŅ‚ иС ĐžŅ‚Ņ‡ĐĩŅ‚Đ° `status`, ĐĩҁĐģи ĐžĐŊи Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹. Đ§Ņ‚ĐžĐąŅ‹ ҃ҁĐēĐžŅ€Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžŅ†Đĩҁҁ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ -p bad Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Ņ‚ĐžĐģҌĐēĐž ĐąĐģĐžĐēОв, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊҋ҅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. :snapraid -p bad scrub ЗаĐŋ҃ҁĐē `scrub` ĐŊа ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžĐąŅ‰Đ¸Ņ‚ŅŒ Ой ĐžŅˆĐ¸ĐąĐēĐ°Ņ…, Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊĐŊҋ҅ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧи иĐģи иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đŧи Ņ„Đ°ĐšĐģаĐŧи. Đ­Ņ‚Đ¸ ĐžŅˆĐ¸ĐąĐēи ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‚ŅŅ в Đ˛Ņ‹Đ˛ĐžĐ´Đĩ `scrub`, ĐŊĐž ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŊĐĩ ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. Pooling ĐŸŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊиĐĩ: Đ¤ŅƒĐŊĐēŅ†Đ¸Ņ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ (pooling), ĐžĐŋĐ¸ŅĐ°ĐŊĐŊĐ°Ņ ĐŊиĐļĐĩ, ĐąŅ‹Đģа СаĐŧĐĩĐŊĐĩĐŊа иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ĐžĐŧ mergerfs, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩĐŧŅ‹Đŧ Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚ĐžĐŧ Đ´ĐģŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš Linux в ŅĐžĐžĐąŅ‰ĐĩŅŅ‚Đ˛Đĩ SnapRAID. Mergefs ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ йОĐģĐĩĐĩ ĐŗĐ¸ĐąĐēиК и ŅŅ„Ņ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš ҁĐŋĐžŅĐžĐą ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… Đ´Đ¸ŅĐēОв в ĐĩдиĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°Ņ ĐąĐĩҁĐŋŅ€ĐĩĐŋŅŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē Ņ„Đ°ĐšĐģаĐŧ ĐŋĐž Đ˛ŅĐĩĐŧ҃ ĐŧĐ°ŅŅĐ¸Đ˛Ņƒ ĐąĐĩС ĐžĐŋĐžŅ€Ņ‹ ĐŊа ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи. ОĐŊ Ņ…ĐžŅ€ĐžŅˆĐž иĐŊŅ‚ĐĩĐŗŅ€Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ŅĐž SnapRAID Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ и ĐžĐąŅ‹Ņ‡ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ в ŅƒŅŅ‚Đ°ĐŊОвĐēĐ°Ņ…, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē OpenMediaVault (OMV) иĐģи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐ¸Ņ… ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŅ… NAS. Đ§Ņ‚ĐžĐąŅ‹ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐģĐ¸ŅŅŒ в ОдĐŊĐžĐŧ Đ´ĐĩŅ€ĐĩвĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Đ¸ŅŽ `pooling`. ОĐŊа ŅĐžĐˇĐ´Đ°ĐĩŅ‚ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `pooling` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: :pool /pool иĐģи, ĐĩҁĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Windows, ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: :pool C:\pool а ĐˇĐ°Ņ‚ĐĩĐŧ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `pool` Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ иĐģи ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ. :snapraid pool Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧ҃ Unix и Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅŅ‚ĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŋĐž ҁĐĩŅ‚Đ¸ ĐēаĐē Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊ Windows, Ņ‚Đ°Đē и Đ´ĐģŅ Unix, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸ в Đ˛Đ°Ņˆ /etc/samba/smb.conf: :# В ĐŗĐģОйаĐģҌĐŊĐžĐŧ Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ smb.conf :unix extensions = no :# В Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ ĐžĐąŅ‰ĐĩĐŗĐž Ņ€ĐĩŅŅƒŅ€ŅĐ° smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes В Windows ŅĐžĐ˛ĐŧĐĩҁ҂ĐŊĐžĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēĐ¸Ņ… ҁҁҋĐģĐžĐē ĐŋĐž ҁĐĩŅ‚Đ¸ ҂ҀĐĩĐąŅƒĐĩŅ‚, Ņ‡Ņ‚ĐžĐąŅ‹ ĐēĐģиĐĩĐŊ҂ҋ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ°Đģи Đ¸Ņ… ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐž. Đ§Ņ‚ĐžĐąŅ‹ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅŅ‚Đž, ĐŋĐžĐŧиĐŧĐž ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐžĐąŅ‰ĐĩĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool, Đ˛Ņ‹ Ņ‚Đ°ĐēĐļĐĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ ĐēĐž Đ˛ŅĐĩĐŧ Đ´Đ¸ŅĐēаĐŧ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ иĐŧĐĩĐŊа Đ´Đ¸ŅĐēОв, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ‚ĐžŅ‡ĐĩĐē ĐžĐąŅ‰ĐĩĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа. Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ Đ´ĐžĐģĐļĐŊŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ в ĐžĐŋŅ†Đ¸Đ¸ `share` Ņ„Đ°ĐšĐģа ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ĐŋŅƒŅ‚ŅŒ UNC Windows, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐēĐģиĐĩĐŊ҂ҋ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅŅ‚Đ¸Đŧ ĐžĐąŅ‰Đ¸Đŧ Đ´Đ¸ŅĐēаĐŧ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Ņ€Đ°ĐąĐžŅ‚Đ°Ņ ҁ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ҁ иĐŧĐĩĐŊĐĩĐŧ `darkstar`, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸Đ¸: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar и ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°Đŧ ĐŋĐž ҁĐĩŅ‚Đ¸: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧ ĐēĐģиĐĩĐŊŅ‚Đ°Đŧ Đ´ĐžŅŅ‚ŅƒĐŋ ĐēĐž Đ˛ŅĐĩĐŧ Ņ„Đ°ĐšĐģаĐŧ ĐŋĐž Đ°Đ´Ņ€Đĩҁ҃ \\darkstar\pool. ВаĐŧ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐēĐģиĐĩĐŊ҂ҋ Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐŧ ҁҁҋĐģĐēаĐŧ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´Ņ‹: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAID Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊĐ¸Ņ€ŅƒĐĩŅ‚ ҁĐēĐžŅ€ĐĩĐĩ ĐēаĐē ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ҇ĐĩĐŧ ĐēаĐē ŅĐ¸ŅŅ‚ĐĩĐŧа RAID, и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ иĐģи ĐžŅ‚ĐŧĐĩĐŊŅ‹ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв Đ´Đž Đ¸Ņ… ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŗĐž ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ -f, --filter: :snapraid fix -f FILE иĐģи Đ´ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°: :snapraid fix -f DIR/ Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž ҁĐģŅƒŅ‡Đ°ĐšĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв вĐŊŅƒŅ‚Ņ€Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ -m, --filter-missing, ĐēĐžŅ‚ĐžŅ€Đ°Ņ Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐžŅŅ‚Đ°Đ˛ĐģŅŅ Đ˛ŅĐĩ ĐžŅŅ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐŊĐĩŅ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đŧи. :snapraid fix -m -f DIR/ ИĐģи Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ… ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: :snapraid fix -m Recovering ĐĄĐģŅƒŅ‡Đ¸ĐģĐžŅŅŒ Ņ…ŅƒĐ´ŅˆĐĩĐĩ, и Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐģи ОдиĐŊ иĐģи ĐŊĐĩҁĐēĐžĐģҌĐēĐž Đ´Đ¸ŅĐēОв! НЕ ĐŸĐĐĐ˜ĐšĐŖĐ™ĐĸЕ! Đ’Ņ‹ ҁĐŧĐžĐļĐĩŅ‚Đĩ Đ¸Ņ… Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ! ПĐĩŅ€Đ˛ĐžĐĩ, Ņ‡Ņ‚Đž Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ, ŅŅ‚Đž иСйĐĩĐŗĐ°Ņ‚ŅŒ даĐģҌĐŊĐĩĐšŅˆĐ¸Ņ… иСĐŧĐĩĐŊĐĩĐŊиК в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ĐģŅŽĐąŅ‹Đĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐŋОдĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đē ĐŊĐĩĐŧ҃ и ĐģŅŽĐąŅ‹Đĩ СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŋŅ€ĐžŅ†Đĩҁҁҋ, вĐēĐģŅŽŅ‡Đ°Ņ ĐģŅŽĐąĐžĐĩ СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐĩ ĐŊĐžŅ‡ĐŊĐžĐĩ sync иĐģи scrub SnapRAID. Đ—Đ°Ņ‚ĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐ°ĐšŅ‚Đĩ Đē ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ ŅˆĐ°ĐŗĐ°Đŧ. STEP 1 -> Reconfigure ВаĐŧ ĐŊ҃ĐļĐŊĐž ĐŧĐĩŅŅ‚Đž Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ, в идĐĩаĐģĐĩ ĐŊа Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ СаĐŋĐ°ŅĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…, ĐŊĐž вĐŊĐĩ҈ĐŊĐĩĐŗĐž USB-Đ´Đ¸ŅĐēа иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž. ИСĐŧĐĩĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ SnapRAID, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŋŅ†Đ¸Ņ `data` иĐģи `parity` ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŗĐž Đ´Đ¸ŅĐēа ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°Đģа ĐŊа ĐŧĐĩŅŅ‚Đž ҁ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊŅ‹Đŧ ĐŋŅƒŅŅ‚Ņ‹Đŧ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛ĐžĐŧ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ´Đ¸ŅĐē `d1` Đ˛Ņ‹ŅˆĐĩĐģ иС ŅŅ‚Ņ€ĐžŅ, иСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ҁ: :data d1 /mnt/disk1/ ĐŊа: :data d1 /mnt/new_spare_disk/ Đ•ŅĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧŅ‹Đš Đ´Đ¸ŅĐē ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰ŅƒŅŽ ĐžĐŋŅ†Đ¸ŅŽ `parity`. Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ Đ˛ŅĐĩ Đ¸Ņ… ĐžĐŋŅ†Đ¸Đ¸ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. STEP 2 -> Fix ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ fix, ŅĐžŅ…Ņ€Đ°ĐŊŅŅ ĐļŅƒŅ€ĐŊаĐģ вО вĐŊĐĩ҈ĐŊĐĩĐŧ Ņ„Đ°ĐšĐģĐĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: :snapraid -d NAME -l fix.log fix ГдĐĩ NAME — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ `d1` в ĐŊĐ°ŅˆĐĩĐŧ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŧ ĐŋŅ€Đ¸ĐŧĐĩŅ€Đĩ. Đ•ŅĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧŅ‹Đš Đ´Đ¸ŅĐē ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ иĐŧĐĩĐŊа `parity`, `2-parity` и Ņ‚. Đ´. Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš -d, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ¸Ņ… Đ˛ŅĐĩ. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда СаКĐŧĐĩŅ‚ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŗĐ¸ĐŗĐ°ĐąĐ°ĐšŅ‚ ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐŗĐž ĐŧĐĩŅŅ‚Đ° Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа fix.log. ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐĩĐĩ ҁ Đ´Đ¸ŅĐēа ҁ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊŅ‹Đŧ ŅĐ˛ĐžĐąĐžĐ´ĐŊŅ‹Đŧ ĐŧĐĩŅŅ‚ĐžĐŧ. ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐģи Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŧĐžĐļĐŊĐž ĐąŅ‹ĐģĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ. Đ•ŅĐģи ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ Ņ‡Đ°ŅŅ‚Đ¸Ņ‡ĐŊĐž иĐģи ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ĐŊĐĩĐ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐŧŅ‹, ĐžĐŊи ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊŅ‹ ҁ дОйавĐģĐĩĐŊиĐĩĐŧ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ `.unrecoverable`. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°ĐšŅ‚Đ¸ ĐŋĐžĐ´Ņ€ĐžĐąĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Đ˛ŅĐĩŅ… ĐŊĐĩĐ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐŧҋ҅ ĐąĐģĐžĐēОв в Ņ„Đ°ĐšĐģĐĩ fix.log, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ Đ˛ŅĐĩ ŅŅ‚Ņ€ĐžĐēи, ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‰Đ¸ĐĩŅŅ ҁ `unrecoverable:`. Đ•ŅĐģи Đ˛Ņ‹ ĐŊĐĩ ŅƒĐ´ĐžĐ˛ĐģĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩĐŧ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŅ‚ŅŒ ĐĩĐŗĐž ŅŅ‚ĐžĐģҌĐēĐž Ņ€Đ°Đˇ, ҁĐēĐžĐģҌĐēĐž ĐŋĐžĐļĐĩĐģаĐĩŅ‚Đĩ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ˛Ņ‹ ŅƒĐ´Đ°ĐģиĐģи Ņ„Đ°ĐšĐģŅ‹ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŋĐžŅĐģĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`, ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē Ņ‚ĐžĐŧ҃, Ņ‡Ņ‚Đž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ `fix`, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -i, --import, ҃ĐēаСав, ĐŗĐ´Đĩ ŅŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ҁĐĩĐšŅ‡Đ°Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐŊОва вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐŋŅ€ĐžŅ†Đĩҁҁ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. Đ•ŅĐģи Đ˛Ņ‹ ŅƒĐ´ĐžĐ˛ĐģĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩĐŧ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ, ĐŊĐž ŅƒŅ‡Ņ‚Đ¸Ņ‚Đĩ, Ņ‡Ņ‚Đž ĐŋĐžŅĐģĐĩ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Đ˛Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ҁĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`! STEP 3 -> Check В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐžŅŅ‚ĐžŅ€ĐžĐļĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ‚ĐĩĐŋĐĩŅ€ŅŒ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `check`, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž Đ˛ŅĐĩ в ĐŋĐžŅ€ŅĐ´ĐēĐĩ ĐŊа Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ. :snapraid -d NAME -a check ГдĐĩ NAME — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ `d1` в ĐŊĐ°ŅˆĐĩĐŧ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŧ ĐŋŅ€Đ¸ĐŧĐĩŅ€Đĩ. ОĐŋŅ†Đ¸Đ¸ -d и -a ĐŗĐžĐ˛ĐžŅ€ŅŅ‚ SnapRAID ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҃ĐēаСаĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē и Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда СаКĐŧĐĩŅ‚ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐŊĐž ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҇ҀĐĩСĐŧĐĩŅ€ĐŊĐž ĐžŅŅ‚ĐžŅ€ĐžĐļĐŊŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐĩĐĩ ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ. STEP 4 -> Sync ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`, Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€ĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐ°ŅŅĐ¸Đ˛ ҁ ĐŊĐžĐ˛Ņ‹Đŧ Đ´Đ¸ŅĐēĐžĐŧ. :snapraid sync Đ•ŅĐģи Đ˛ŅĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž, ŅŅ‚Đ° ĐēĐžĐŧаĐŊда Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž. Commands SnapRAID ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŋŅ€ĐžŅŅ‚Ņ‹Ņ… ĐēĐžĐŧаĐŊĐ´, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋОСвОĐģŅŅŽŅ‚: * ПĐĩŅ‡Đ°Ņ‚Đ°Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŧĐ°ŅŅĐ¸Đ˛Đ° -> `status` * ĐŖĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ Đ´Đ¸ŅĐēаĐŧи -> `smart`, `probe`, `up`, `down` * ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ/ҁĐŊиĐŧĐžĐē -> `sync` * ПĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ‚ŅŒ даĐŊĐŊŅ‹Đĩ -> `scrub` * Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŋĐžŅĐģĐĩĐ´ĐŊŅŽŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ/ҁĐŊиĐŧĐžĐē -> `fix`. КоĐŧаĐŊĐ´Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ ĐŊаĐŋĐ¸ŅĐ°ĐŊŅ‹ ŅŅ‚Ņ€ĐžŅ‡ĐŊŅ‹Đŧи ĐąŅƒĐēваĐŧи. status ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ŅĐ˛ĐžĐ´Đē҃ ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. ОĐŊа вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Đž Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đž Ņ‚ĐžĐŧ, ĐŊĐ°ŅĐēĐžĐģҌĐēĐž ŅŅ‚Đ°Ņ€Ņ‹Đĩ ĐąĐģĐžĐēи ĐąĐĩС ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, и Đ˛ŅĐĩ СаĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đĩ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи, вОСĐŊиĐēŅˆĐ¸Đĩ вО Đ˛Ņ€ĐĩĐŧŅ scrubbing. ĐŸŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ŅŅ Đē ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ СаĐŋ҃ҁĐēаĐģи `sync`. БоĐģĐĩĐĩ ĐŋОСдĐŊиĐĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ ŅƒŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ. Đ•ŅĐģи ĐąŅ‹Đģи ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊŅ‹ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ Đ¸Ņ… ĐŊĐžĐŧĐĩŅ€Đ°. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Đ¸Ņ…, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix -e`. ОĐŊ Ņ‚Đ°ĐēĐļĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŗŅ€Đ°Ņ„Đ¸Đē, ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅŽŅ‰Đ¸Đš ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐēĐžĐŗĐ´Đ° ĐēаĐļĐ´Ņ‹Đš ĐąĐģĐžĐē ĐąŅ‹Đģ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊ (`scrubbed`) иĐģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊ (`synced`). ĐŸŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи ОйОСĐŊĐ°Ņ‡ĐĩĐŊŅ‹ ŅĐ¸ĐŧвОĐģĐžĐŧ `*`, ĐąĐģĐžĐēи, ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ, ĐŊĐž Đĩ҉Đĩ ĐŊĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ, ŅĐ¸ĐŧвОĐģĐžĐŧ `o`. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. smart ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐžŅ‚Ņ‡ĐĩŅ‚ SMART Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. ОĐŊ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐžŅ†ĐĩĐŊĐē҃ вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ŅĐąĐžŅ в ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ ĐŗĐžĐ´Ņƒ, ĐŋОСвОĐģŅŅ ĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐģаĐŊĐžĐ˛ŅƒŅŽ СаĐŧĐĩĐŊ҃ Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ŅŽŅ‚ ĐŋĐžĐ´ĐžĐˇŅ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹. Đ­Ņ‚Đ° ĐžŅ†ĐĩĐŊĐēа вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊа ĐŋŅƒŅ‚ĐĩĐŧ ĐēĐžŅ€Ņ€ĐĩĐģŅŅ†Đ¸Đ¸ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ĐžĐ˛ SMART Đ´Đ¸ŅĐēОв ҁ даĐŊĐŊŅ‹Đŧи Backblaze, Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи ĐŋĐž Đ°Đ´Ņ€Đĩҁ҃: :https://www.backblaze.com/hard-drive-test-data.html Đ•ŅĐģи SMART ŅĐžĐžĐąŅ‰Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē Đ˛Ņ‹Ņ…ĐžĐ´Đ¸Ņ‚ иС ŅŅ‚Ņ€ĐžŅ, Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž Đ´Đ¸ŅĐēа Đ˛Ņ‹Đ˛ĐžĐ´Đ¸Ņ‚ŅŅ `FAIL` иĐģи `PREFAIL`, и SnapRAID Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐē҃. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐ°Ņ СаĐŧĐĩĐŊа Đ´Đ¸ŅĐēа ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ. Đ”Ņ€ŅƒĐŗĐ¸Đĩ вОСĐŧĐžĐļĐŊŅ‹Đĩ ŅŅ‚Ņ€ĐžĐēи ŅŅ‚Đ°Ņ‚ŅƒŅĐ°: logfail - В ĐŋŅ€ĐžŅˆĐģĐžĐŧ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹ ĐąŅ‹Đģи ĐŊиĐļĐĩ ĐŋĐžŅ€ĐžĐŗĐžĐ˛ĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ. logerr - Đ–ŅƒŅ€ĐŊаĐģ ĐžŅˆĐ¸ĐąĐžĐē ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐēи. selferr - Đ–ŅƒŅ€ĐŊаĐģ ŅĐ°ĐŧĐžŅ‚ĐĩŅŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐēи. Đ•ŅĐģи ҃ĐēаСаĐŊа ĐžĐŋŅ†Đ¸Ņ -v, --verbose, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ йОĐģĐĩĐĩ ĐŗĐģŅƒĐąĐžĐēиК ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Ņ‡ĐĩҁĐēиК аĐŊаĐģиС. Đ­Ņ‚ĐžŅ‚ аĐŊаĐģиС ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŧĐžŅ‡ŅŒ ваĐŧ Ņ€ĐĩŅˆĐ¸Ņ‚ŅŒ, ĐŊ҃ĐļĐŊĐž Đģи ваĐŧ йОĐģҌ҈Đĩ иĐģи ĐŧĐĩĐŊҌ҈Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -a` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. Đ•ŅĐģи Đ˛Đ°ŅˆĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ĐŊĐĩ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēŅƒŅŽ ĐēĐžĐŧаĐŊĐ´Ņƒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ `smartctl` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. probe ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ POWER Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. `Standby` ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē ĐŊĐĩ Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ. `Active` ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -n standby -i` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. Đ•ŅĐģи Đ˛Đ°ŅˆĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ĐŊĐĩ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēŅƒŅŽ ĐēĐžĐŧаĐŊĐ´Ņƒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ `smartctl` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. up Đ Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ Đ˛ŅĐĩ Đ´Đ¸ŅĐēи ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€Đ°ŅĐēŅ€ŅƒŅ‚Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ Đ´Đ¸ŅĐēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -d, --filter-disk. Đ Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ОдĐŊĐžĐ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŧĐŊĐžĐŗĐž ŅĐŊĐĩŅ€ĐŗĐ¸Đ¸. ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž Đ˛Đ°Ņˆ ĐąĐģĐžĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐ¸Ņ ĐŧĐžĐļĐĩŅ‚ ŅŅ‚Đž Đ˛Ņ‹Đ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. down ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -s standby,now` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Ņ‚ĐžĐģҌĐēĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -d, --filter-disk. Đ§Ņ‚ĐžĐąŅ‹ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐžŅˆĐ¸ĐąĐēĐĩ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -s, --spin-down-on-error ҁ ĐģŅŽĐąĐžĐš Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐžĐŧаĐŊдОК, Ņ‡Ņ‚Đž ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊĐž Ņ€ŅƒŅ‡ĐŊĐžĐŧ҃ СаĐŋ҃ҁĐē҃ `down` ĐŋŅ€Đ¸ вОСĐŊиĐēĐŊОвĐĩĐŊии ĐžŅˆĐ¸ĐąĐēи. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. diff ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`, Đ´ĐģŅ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ĐŊĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ даĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа, а Ņ‚ĐžĐģҌĐēĐž ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ„Đ°ĐšĐģа, Ņ€Đ°ĐˇĐŧĐĩŅ€ и inode. ĐŸĐžŅĐģĐĩ ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… иСĐŧĐĩĐŊĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ ŅĐ˛ĐžĐ´Đēа иСĐŧĐĩĐŊĐĩĐŊиК, ŅĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐž: equal - ФаКĐģŅ‹, ĐŊĐĩ иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ ĐŋĐž ŅŅ€Đ°Đ˛ĐŊĐĩĐŊĐ¸ŅŽ ҁ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Đŧ ŅĐžŅŅ‚ĐžŅĐŊиĐĩĐŧ. added - ДобавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐŊĐĩ ĐąŅ‹ĐģĐž Ņ€Đ°ĐŊҌ҈Đĩ. removed - ĐŖĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. updated - ФаКĐģŅ‹ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧ Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ иĐģи ĐŧĐĩŅ‚ĐēОК Đ˛Ņ€ĐĩĐŧĐĩĐŊи, Ņ‡Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи ĐąŅ‹Đģи иСĐŧĐĩĐŊĐĩĐŊŅ‹. moved - ФаКĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ в Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐēаĐē иĐŧĐĩŅŽŅ‰Đ¸Đĩ Ņ‚Đž ĐļĐĩ иĐŧŅ, Ņ€Đ°ĐˇĐŧĐĩŅ€, ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи и inode, ĐŊĐž Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ. copied - Ņ„Đ°ĐšĐģŅ‹, ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŊа Ņ‚ĐžŅ‚ ĐļĐĩ иĐģи Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ĐŗĐ´Đĩ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ Đ˛ŅĐĩ Đĩ҉Đĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ŅĐžĐ˛ĐŋадĐĩĐŊĐ¸ŅŽ иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° и ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Đ´Ņ€ĐžĐąĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, а ĐŊĐĩ Ņ‚ĐžĐģҌĐēĐž иĐŧŅ. relocated - Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ ĐŊа Ņ‚ĐžŅ‚ ĐļĐĩ иĐģи Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ĐŗĐ´Đĩ ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģ Đ¸ŅŅ‡ĐĩС. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ŅĐžĐ˛ĐŋадĐĩĐŊĐ¸ŅŽ иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° и ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Đ´Ņ€ĐžĐąĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ Ņ„Đ°ĐšĐģОв 'moved' ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ иĐŧĐĩŅŽŅ‚ Đ´Ņ€ŅƒĐŗĐžĐš inode. restored - Ņ„Đ°ĐšĐģŅ‹ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧ inode, ĐŊĐž ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‰Đ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐŧ, иĐŧĐĩĐŊĐĩĐŧ, Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ и ĐŧĐĩŅ‚ĐēОК Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐžĐąŅ‹Ņ‡ĐŊĐž ŅŅ‚Đž Ņ„Đ°ĐšĐģŅ‹, Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ‹Đĩ ĐŋĐžŅĐģĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ. Đ•ŅĐģи ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ `sync`, ĐēОд Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚Đ° ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Ņ€Đ°Đ˛ĐĩĐŊ 2, а ĐŊĐĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 0. Код Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚Đ° 1 Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ ĐžĐąŅ‰ĐĩĐŗĐž ҃ҁĐģĐžĐ˛Đ¸Ņ ĐžŅˆĐ¸ĐąĐēи. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. sync ОбĐŊОвĐģŅĐĩŅ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ’ŅĐĩ иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ в Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ, и ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ОйĐŊОвĐģŅŅŽŅ‚ŅŅ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐŊаĐļав Ctrl+C, ĐŊĐĩ Ņ‚ĐĩŅ€ŅŅ ҃ĐļĐĩ ĐŋŅ€ĐžĐ´ĐĩĐģаĐŊĐŊОК Ņ€Đ°ĐąĐžŅ‚Ņ‹. ĐŸŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ СаĐŋ҃ҁĐēĐĩ ĐŋŅ€ĐžŅ†Đĩҁҁ `sync` вОСОйĐŊĐžĐ˛Đ¸Ņ‚ŅŅ ҁ Ņ‚ĐžĐŗĐž ĐŧĐĩŅŅ‚Đ°, ĐŗĐ´Đĩ ĐąŅ‹Đģ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊ. Đ•ŅĐģи вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ĐŋŅƒŅ‚Đ¸ и/иĐģи inode и ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ĐŋĐž Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ и ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ„Đ°ĐšĐģа иĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžŅ‚ĐģĐ¸Ņ‡Đ°ŅŽŅ‚ŅŅ, даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Đ´ĐģŅ Đ˛ŅĐĩĐŗĐž Ņ„Đ°ĐšĐģа. Đ•ŅĐģи Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊ иĐģи ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊ ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ, ŅĐžŅ…Ņ€Đ°ĐŊŅŅ Ņ‚ĐžŅ‚ ĐļĐĩ inode, ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊ ĐŊа Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ, ĐŊĐž Ņ€Đ°ĐŊĐĩĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Ņ…ŅŅˆĐ° ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ŅŅ. ФаКĐģŅ‹ `content` и `parity` иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. scrub ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŧĐ°ŅŅĐ¸Đ˛, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ҁĐēҀҋ҂ҋ҅ ĐžŅˆĐ¸ĐąĐžĐē иĐģи ĐžŅˆĐ¸ĐąĐžĐē ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅ и ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. КаĐļĐ´Ņ‹Đš Đ˛Ņ‹ĐˇĐžĐ˛ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 8% ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ даĐŊĐŊŅ‹Đĩ, ҃ĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ 10 Đ´ĐŊĐĩĐš. Đ­Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēа Ņ€Đ°Đˇ в ĐŊĐĩĐ´ĐĩĐģŅŽ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚, Ņ‡Ņ‚Đž ĐēаĐļĐ´Ņ‹Đš ĐąĐ¸Ņ‚ даĐŊĐŊҋ҅ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ŅŅ Ņ…ĐžŅ‚Ņ ĐąŅ‹ Ņ€Đ°Đˇ в Ņ‚Ņ€Đ¸ ĐŧĐĩŅŅŅ†Đ°. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš ĐŋĐģаĐŊ иĐģи ĐžĐąŅŠĐĩĐŧ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -p, --plan, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚: bad - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐąĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. new - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ‡Ņ‚Đž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹. full - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ. 0-100 - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐąĐģĐžĐēОв. Đ•ŅĐģи Đ˛Ņ‹ ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚Đĩ ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ, Đ˛Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -o, --older-than, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ, ĐŊĐ°ŅĐēĐžĐģҌĐēĐž ŅŅ‚Đ°Ņ€Ņ‹Đŧ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ ĐąĐģĐžĐē. ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ŅĐ°ĐŧŅ‹Đĩ ŅŅ‚Đ°Ņ€Ņ‹Đĩ ĐąĐģĐžĐēи, ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°Ņ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊŅƒŅŽ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃. Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ‡Ņ‚Đž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ `-p new`. Đ§Ņ‚ĐžĐąŅ‹ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐŋĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Đž ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ `status`. ĐŸŅ€Đ¸ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊии ĐģŅŽĐąĐžĐš ҁĐēŅ€Ņ‹Ņ‚ĐžĐš ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ `content`. Đ­Ņ‚Đ¸ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ в `status` и ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `fix -e`. ĐŸĐžŅĐģĐĩ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ scrub ĐžĐŊи ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, и ĐĩҁĐģи ОйĐŊĐ°Ņ€ŅƒĐļĐ°Ņ‚ŅŅ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ‹Đŧи, ĐŋĐģĐžŅ…Đ°Ņ ĐŧĐĩŅ‚Đēа ĐąŅƒĐ´ĐĩŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊа. Đ§Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub -p bad`. Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ СаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ `scrub` Ņ‚ĐžĐģҌĐēĐž ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊиК Ой ĐžŅˆĐ¸ĐąĐēĐ°Ņ…, Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊĐŊҋ҅ ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи даĐŊĐŊŅ‹Đŧи. Đ­Ņ‚Đ¸ ĐžŅˆĐ¸ĐąĐēи Ņ€Đ°ŅĐŋОСĐŊĐ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‰Đ¸ĐĩŅŅ ҁĐēҀҋ҂ҋĐŧи ĐžŅˆĐ¸ĐąĐēаĐŧи, и ĐąĐģĐžĐēи ĐŊĐĩ ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ, ĐŊĐž Ņ‚Đ°ĐēиĐĩ ĐžŅˆĐ¸ĐąĐēи ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‚ŅŅ в Đ˛Ņ‹Đ˛ĐžĐ´Đĩ ĐēĐžĐŧаĐŊĐ´Ņ‹. ФаКĐģ `content` иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đ´ĐģŅ ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ĐąĐģĐžĐēа и Đ´ĐģŅ ĐŋĐžĐŧĐĩŅ‚Đēи ĐŋĐģĐžŅ…Đ¸Ņ… ĐąĐģĐžĐēОв. ФаКĐģŅ‹ `parity` НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. fix Đ˜ŅĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ’ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ŅŅ€Đ°Đ˛ĐŊĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁ ŅĐžŅŅ‚ĐžŅĐŊиĐĩĐŧ ҁĐŊиĐŧĐēа, ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ ĐŋŅ€Đ¸ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ `sync`. Đ•ŅĐģи ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐž Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ¸Đĩ, ĐžĐŊĐž Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ Đē ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊĐžĐŧ҃ ҁĐŊиĐŧĐē҃. ВНИМАНИЕ! КоĐŧаĐŊда `fix` ĐŊĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐēи и ĐŋŅ€ĐĩĐ´ĐŊаĐŧĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ. ОĐŊа ĐąĐĩĐˇŅƒŅĐģОвĐŊĐž Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ Ņ„Đ°ĐšĐģа Đē ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ҃ `sync`. Đ•ŅĐģи ĐŊĐĩ ҃ĐēаСаĐŊа Đ´Ņ€ŅƒĐŗĐ°Ņ ĐžĐŋŅ†Đ¸Ņ, ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸Đ¸ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐŋОдĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ„Đ°ĐšĐģОв иĐģи Đ´Đ¸ŅĐēОв Đ´ĐģŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐąĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ вО Đ˛Ņ€ĐĩĐŧŅ `sync` и `scrub`, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ -e, --filter-error. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ Đ´Ņ€ŅƒĐŗĐ¸Ņ… ĐžĐŋŅ†Đ¸Đš Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, ŅŅ‚Đ° ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐąŅ‹Đģи иСĐŧĐĩĐŊĐĩĐŊŅ‹ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`. SnapRAID ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊĐžĐ˛Ņ‹Đ˛Đ°ĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹, дОйавĐģŅŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ `.unrecoverable`. ПĐĩŅ€ĐĩĐ´ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩĐŧ ҁĐēаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ŅŅ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŊĐ°ĐšŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ `sync`. Đ­Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž Đ¸Ņ… ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒŅ Đ¸Ņ… иĐŧŅ и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ, и Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ в ĐŋŅ€ĐžŅ†ĐĩҁҁĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Đģи ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ иС ĐŊĐ¸Ņ… Са ĐŋŅ€ĐĩĐ´ĐĩĐģŅ‹ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -i, --import, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Đ´ĐģŅ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐž ĐŋŅƒŅ‚Đ¸, а ĐŊĐĩ ĐŋĐž inode. ФаКĐģ `content` НЕ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. ФаКĐģŅ‹ `parity` иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. check ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ОĐŊ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐēаĐē `fix`, ĐŊĐž Ņ‚ĐžĐģҌĐēĐž иĐŧĐ¸Ņ‚Đ¸Ņ€ŅƒĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ, и ĐŊиĐēаĐēиĐĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ СаĐŋĐ¸ŅŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ĐŧĐ°ŅŅĐ¸Đ˛. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€ŅƒŅ‡ĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋĐžŅĐģĐĩ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ иĐģи в Đ´Ņ€ŅƒĐŗĐ¸Ņ… ĐžŅĐžĐąŅ‹Ņ… ҃ҁĐģĐžĐ˛Đ¸ŅŅ…. ДĐģŅ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēĐ¸Ņ… и СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐžĐē Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ `scrub`. Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ -a, --audit-only, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž даĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа, а даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Đ´ĐģŅ йОĐģĐĩĐĩ ĐąŅ‹ŅŅ‚Ņ€ĐžĐŗĐž Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ. ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐž ĐŋŅƒŅ‚Đ¸, а ĐŊĐĩ ĐŋĐž inode. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. list ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸ĐĩŅŅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐŊа ĐŧĐžĐŧĐĩĐŊŅ‚ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`. ĐĄ -v иĐģи --verbose Ņ‚Đ°ĐēĐļĐĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ŅŅ Đ˛Ņ€ĐĩĐŧŅ ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. dup ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐĩŅŅ Ņ„Đ°ĐšĐģŅ‹. Два Ņ„Đ°ĐšĐģа ŅŅ‡Đ¸Ņ‚Đ°ŅŽŅ‚ŅŅ Ņ€Đ°Đ˛ĐŊŅ‹Đŧи, ĐĩҁĐģи Đ¸Ņ… Ņ…ŅŅˆĐ¸ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚. ДаĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа ĐŊĐĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ; Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐž Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. pool ХОСдаĐĩŅ‚ иĐģи ОйĐŊОвĐģŅĐĩŅ‚ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ в ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ `pooling`. ФаКĐģŅ‹ ĐŊĐĩ ĐēĐžĐŋĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ, а ŅĐ˛ŅĐˇŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēĐ¸Ņ… ҁҁҋĐģĐžĐē. ĐŸŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии Đ˛ŅĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи и ĐŋŅƒŅŅ‚Ņ‹Đĩ ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ ŅƒĐ´Đ°ĐģŅŅŽŅ‚ŅŅ и СаĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŊĐžĐ˛Ņ‹Đŧ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ›ŅŽĐąŅ‹Đĩ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ ĐŊа ĐŧĐĩҁ҂Đĩ. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Са ĐŋŅ€ĐĩĐ´ĐĩĐģаĐŧи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° pool. devices ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đĩ ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐŧ. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ Đ°ŅŅĐžŅ†Đ¸Đ°Ņ†Đ¸Đ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ и в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа ĐēаĐē иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Đ´ĐģŅ ҁĐēŅ€Đ¸ĐŋŅ‚ĐžĐ˛. ПĐĩŅ€Đ˛Ņ‹Đĩ два ŅŅ‚ĐžĐģĐąŅ†Đ° — ŅŅ‚Đž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° и ĐŋŅƒŅ‚ŅŒ. ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ два ŅŅ‚ĐžĐģĐąŅ†Đ° — ŅŅ‚Đž Đ˛Ņ‹ŅĐžĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° и ĐŋŅƒŅ‚ŅŒ. ĐŸĐžŅĐģĐĩĐ´ĐŊиК ŅŅ‚ĐžĐģĐąĐĩ҆ — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. В йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ОдĐŊĐž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩвОĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, ĐŊĐž в ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… йОĐģĐĩĐĩ ҁĐģĐžĐļĐŊҋ҅ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŅ… ҃ Đ˛Đ°Ņ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Ņ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧҋ҅ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. touch ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģҌĐŊŅƒŅŽ ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ Đ´ĐģŅ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐžĐŊа ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа в ĐŊĐžĐģҌ. Đ­Ņ‚Đž ҃ĐģŅƒŅ‡ŅˆĐ°ĐĩŅ‚ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ SnapRAID Ņ€Đ°ŅĐŋОСĐŊĐ°Đ˛Đ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ и ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, Ņ‚Đ°Đē ĐēаĐē Đ´ĐĩĐģаĐĩŅ‚ ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐŋĐžŅ‡Ņ‚Đ¸ ҃ĐŊиĐēаĐģҌĐŊОК, ҃ĐŧĐĩĐŊŅŒŅˆĐ°Ņ вОСĐŧĐžĐļĐŊŅ‹Đĩ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹. БоĐģĐĩĐĩ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐž, ĐĩҁĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ ĐŊĐĩ Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đš иĐģи ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ĐēаĐē Ņ‚Đ°ĐēОвОК, ĐĩҁĐģи ĐžĐŊ ŅĐžĐ˛ĐŋадаĐĩŅ‚ ĐŋĐž иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ и ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, ĐžĐŊ ŅŅ‡Đ¸Ņ‚Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŋиĐĩĐš Ņ‚ĐžĐģҌĐēĐž в Ņ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ, ĐĩҁĐģи ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, Ņ€Đ°ĐˇĐŧĐĩŅ€ и ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи. МĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž ҁĐĩĐē҃ĐŊĐ´Ņ‹ ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ, ĐŋĐžŅŅ‚ĐžĐŧ҃ Đ˛ŅĐĩ Đ´Đ°Ņ‚Ņ‹ и Đ˛Ņ€ĐĩĐŧŅ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģОв ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹. rehash ПĐģаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда иСĐŧĐĩĐŊŅĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đš Ņ‚Đ¸Đŋ Ņ…ŅŅˆĐ°, ĐžĐąŅ‹Ņ‡ĐŊĐž ĐŋŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии ҁ 32-Ņ€Đ°ĐˇŅ€ŅĐ´ĐŊОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ ĐŊа 64-Ņ€Đ°ĐˇŅ€ŅĐ´ĐŊŅƒŅŽ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ ҁ MurmurHash3 ĐŊа йОĐģĐĩĐĩ ĐąŅ‹ŅŅ‚Ņ€Ņ‹Đš SpookyHash. Đ•ŅĐģи Đ˛Ņ‹ ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊŅ‹Đš Ņ…ŅŅˆ, ŅŅ‚Đ° ĐēĐžĐŧаĐŊда ĐŊĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ Đ´ĐĩĐģаĐĩŅ‚ и иĐŊŅ„ĐžŅ€ĐŧĐ¸Ņ€ŅƒĐĩŅ‚ Đ˛Đ°Ņ, Ņ‡Ņ‚Đž ĐŊиĐēаĐēиĐĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŊĐĩ ҂ҀĐĩĐąŅƒŅŽŅ‚ŅŅ. ПĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž, а ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŋĐžŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž вО Đ˛Ņ€ĐĩĐŧŅ `sync` и `scrub`. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `status`. Во Đ˛Ņ€ĐĩĐŧŅ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ SnapRAID ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ ĐŋĐžĐģĐŊŅƒŅŽ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, Са ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đŧ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩĐŧ, Ņ‡Ņ‚Đž `dup` ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐĩŅŅ Ņ„Đ°ĐšĐģŅ‹, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‰Đ¸Đĩ Đ´Ņ€ŅƒĐŗĐžĐš Ņ…ŅŅˆ. locate ĐĐ°Ņ…ĐžĐ´Đ¸Ņ‚ Ņ„Đ°ĐšĐģŅ‹, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸ĐĩŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ĐŊаКдĐĩĐŊĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģа Đ˛Ņ‹Đ˛ĐžĐ´Đ¸Ņ‚ŅŅ ĐĩĐŗĐž Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ вĐŊŅƒŅ‚Ņ€Đ¸ Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ и ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž СаĐŊиĐŧаĐĩĐŧҋ҅ иĐŧ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚ĐžĐ˛. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ -t, --tail, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Ņ„Đ°ĐšĐģаĐŧи, СаĐŊиĐŧĐ°ŅŽŅ‰Đ¸Đŧи ҃ĐēаСаĐŊĐŊŅƒŅŽ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ ŅŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ -W, --force-realloc-tail. ИĐŧĐĩĐšŅ‚Đĩ в Đ˛Đ¸Đ´Ņƒ, Ņ‡Ņ‚Đž Ņ‚Đ°ĐēиĐĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊŅ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ. Options SnapRAID ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸: -c, --conf CONFIG Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ. Đ•ŅĐģи ĐŊĐĩ ҃ĐēаСаĐŊ, в Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ĐĩҁĐģи ĐžĐŊ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚, в ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ `/etc/snapraid.conf`. В Windows Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` в Ņ‚ĐžĐŧ ĐļĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ, Ņ‡Ņ‚Đž и `snapraid.exe`. -f, --filter PATTERN ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `check` и `fix`. ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ҃ĐēаСаĐŊĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ҃. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ Đž ҁĐŋĐĩŅ†Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŅ… ŅˆĐ°ĐąĐģĐžĐŊОв ҁĐŧ. в Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ PATTERN. В Unix ŅƒĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž ŅĐ¸ĐŧвОĐģŅ‹ ĐŗĐģОййиĐŊĐŗĐ° СаĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, ĐĩҁĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ `sync` и `scrub`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. -d, --filter-disk NAME ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `check`, `fix`, `up` и `down`. Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ иĐŧŅ Đ´Đ¸ŅĐēа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ҁ иĐŧĐĩĐŊаĐŧи: `parity`, `2-parity`, `3-parity` и Ņ‚. Đ´., Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đŧ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ ĐēĐžĐŧйиĐŊĐ¸Ņ€ŅƒĐĩŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš --filter, --filter-disk и --filter-missing, Đ˛Ņ‹ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Đ˛ŅĐĩĐŧ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Đŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check`, `fix`, `up` и `down`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ `sync` и `scrub`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. -m, --filter-missing ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `check` и `fix`. ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ°. ĐŸŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ҁ `fix`, ŅŅ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐēаĐē ĐēĐžĐŧаĐŊда `undelete`. Đ•ŅĐģи Đ˛Ņ‹ ĐēĐžĐŧйиĐŊĐ¸Ņ€ŅƒĐĩŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš --filter, --filter-disk и --filter-missing, Đ˛Ņ‹ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Đ˛ŅĐĩĐŧ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Đŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ `sync` и `scrub`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. -e, --filter-error ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ ҁ ĐžŅˆĐ¸ĐąĐēаĐŧи в `check` и `fix`. ОĐŊ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐąĐģĐžĐēи ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐŋĐžĐŧĐĩ҇ĐĩĐŊŅ‹ ҁĐēҀҋ҂ҋĐŧи ĐžŅˆĐ¸ĐąĐēаĐŧи иĐģи ĐžŅˆĐ¸ĐąĐēаĐŧи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° вО Đ˛Ņ€ĐĩĐŧŅ `sync` и `scrub`, ĐēаĐē ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐž в `status`. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. -p, --plan PERC|bad|new|full Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐŋĐģаĐŊ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи (`scrub`). Đ•ŅĐģи PERC — ŅŅ‚Đž Ņ‡Đ¸ŅĐģОвОĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐžŅ‚ 0 Đ´Đž 100, ĐžĐŊĐž иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ĐēаĐē ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐąĐģĐžĐēОв Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи. ВĐŧĐĩŅŅ‚Đž ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚Đ° Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐģаĐŊ: `bad` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, `new` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, и `full` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Đ˛ŅĐĩ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `scrub`. -o, --older-than DAYS Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ŅĐ°ĐŧŅƒŅŽ ŅŅ‚Đ°Ņ€ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐ°ŅŅĐ¸Đ˛Đ° Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `scrub`. DAYS — ŅŅ‚Đž ĐŧиĐŊиĐŧаĐģҌĐŊŅ‹Đš Đ˛ĐžĐˇŅ€Đ°ŅŅ‚ в Đ´ĐŊŅŅ… Đ´ĐģŅ ĐąĐģĐžĐēа, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊ; ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 10. БĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ, Đ˛ŅĐĩĐŗĐ´Đ° ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `scrub`. -a, --audit-only В `check`, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ…ŅŅˆ Ņ„Đ°ĐšĐģОв ĐąĐĩС ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ СаиĐŊŅ‚ĐĩŅ€ĐĩŅĐžĐ˛Đ°ĐŊŅ‹ Ņ‚ĐžĐģҌĐēĐž в ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐĩ даĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģа, ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŧĐžĐļĐĩŅ‚ СĐŊĐ°Ņ‡Đ¸Ņ‚ĐĩĐģҌĐŊĐž ҃ҁĐēĐžŅ€Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check`. -h, --pre-hash В `sync`, СаĐŋ҃ҁĐēаĐĩŅ‚ ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ Ņ„Đ°ĐˇŅƒ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ĐŊĐžĐ˛Ņ‹Ņ… даĐŊĐŊҋ҅ Đ´ĐģŅ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиĐĩĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐžĐąŅ‹Ņ‡ĐŊĐž в `sync` ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ, и ĐŊĐžĐ˛Ņ‹Đĩ даĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиĐĩĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐēĐžĐŗĐ´Đ° ĐžĐŊи ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ĐŋĐĩŅ€Đ˛Ņ‹Đš Ņ€Đ°Đˇ. Đ­Ņ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚, ĐēĐžĐŗĐ´Đ° ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ ĐŋОд Ņ‚ŅĐļĐĩĐģОК ĐŊĐ°ĐŗŅ€ŅƒĐˇĐēОК, ŅĐž Đ˛ŅĐĩĐŧи Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ Đ´Đ¸ŅĐēаĐŧи и СаĐŊŅŅ‚Ņ‹Đŧ ĐŋŅ€ĐžŅ†ĐĩŅŅĐžŅ€ĐžĐŧ. Đ­Ņ‚Đž ŅĐēҁ҂ҀĐĩĐŧаĐģҌĐŊĐžĐĩ ҃ҁĐģОвиĐĩ Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊŅ‹, и ĐĩҁĐģи ҃ ĐŊĐĩĐĩ ĐĩŅŅ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Đ°Ņ аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊĐ°Ņ ĐŋŅ€ĐžĐąĐģĐĩĐŧа, ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи ĐŧĐžĐŗŅƒŅ‚ ĐžŅŅ‚Đ°Ņ‚ŅŒŅŅ ĐŊĐĩСаĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đŧи, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž даĐŊĐŊŅ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹. Đ§Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅŅ‚ĐžĐŗĐž Ņ€Đ¸ŅĐēа, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩĐļиĐŧ `pre-hash`, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛ŅĐĩ даĐŊĐŊŅ‹Đĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐģĐ¸ŅŅŒ дваĐļĐ´Ņ‹ Đ´ĐģŅ ОйĐĩҁĐŋĐĩ҇ĐĩĐŊĐ¸Ņ Đ¸Ņ… ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ Ņ‚Đ°ĐēĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Ņ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžŅˆĐģа ҃ҁĐŋĐĩ҈ĐŊĐž, и, ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸, ĐŋОСвОĐģŅĐĩŅ‚ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ (`fix`) ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐĩĐŊиĐĩĐŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -i, --import DIR ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩŅ‚ иС ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° ĐģŅŽĐąŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŋĐžŅĐģĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`. Đ•ŅĐģи ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ Đĩ҉Đĩ ĐĩŅŅ‚ŅŒ Ņ‚Đ°ĐēиĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐžĐŊи ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ `check` и `fix` Đ´ĐģŅ ҃ĐģŅƒŅ‡ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. ФаКĐģŅ‹ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ, вĐēĐģŅŽŅ‡Đ°Ņ ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸, и идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ Đ¸Ņ… иĐŧĐĩĐŊи. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. -s, --spin-down-on-error ĐŸŅ€Đ¸ ĐģŅŽĐąĐžĐš ĐžŅˆĐ¸ĐąĐēĐĩ ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… ҃ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧҋ҅ Đ´Đ¸ŅĐēОв ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ…ĐžĐ´ĐžĐŧ ҁ ĐŊĐĩĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ ĐēОдОĐŧ ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ. Đ­Ņ‚Đž ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ´Đ¸ŅĐēОв аĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đŧи и Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ ĐŋĐžŅĐģĐĩ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊĐŊОК ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸, ĐŋĐžĐŧĐžĐŗĐ°Ņ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŊĐĩĐŊ҃ĐļĐŊĐžĐŗĐž ĐŊĐ°ĐŗŅ€Đĩва и ŅĐŊĐĩŅ€ĐŗĐžĐŋĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊĐ¸Ņ. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžŅŅ‚Đ°ĐŊОвĐē҃ Đ´Đ¸ŅĐēОв, даĐļĐĩ ĐēĐžĐŗĐ´Đ° ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ°ĐĩŅ‚ŅŅ ĐŊĐĩŅƒĐ´Đ°Ņ‡ĐĩĐš. -w, --bw-limit RATE ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ ĐŗĐģОйаĐģҌĐŊĐžĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊОК ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв. RATE — ŅŅ‚Đž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąĐ°ĐšŅ‚ĐžĐ˛ в ҁĐĩĐē҃ĐŊĐ´Ņƒ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģҌ, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ K, M иĐģи G (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, --bw-limit 1G). -t, --tail РАЗМЕР ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ ҁĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģОв Ņ‚ĐĩĐŧи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ ĐŊĐĩ йОĐģĐĩĐĩ ҃ĐēаСаĐŊĐŊĐžĐŗĐž Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Ņ…Đ˛ĐžŅŅ‚Đ° Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. МоĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģи, Ņ‚Đ°ĐēиĐĩ ĐēаĐē K, M, G иĐģи T (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, --tail 1G). Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии вĐŧĐĩҁ҂Đĩ ҁ ĐēĐžĐŧаĐŊдОК `locate`. -A, --stats ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đš вид ŅŅ‚Đ°Ņ‚ŅƒŅĐ°, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ. На ŅĐēŅ€Đ°ĐŊĐĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŅ два ĐŗŅ€Đ°Ņ„Đ¸Đēа: ПĐĩŅ€Đ˛Ņ‹Đš ĐŗŅ€Đ°Ņ„Đ¸Đē ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐžĐģĐžŅ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа, а Ņ‚Đ°ĐēĐļĐĩ ĐŋŅƒŅ‚ŅŒ Đē Ņ„Đ°ĐšĐģ҃, Đē ĐēĐžŅ‚ĐžŅ€ĐžĐŧ҃ в даĐŊĐŊŅ‹Đš ĐŧĐžĐŧĐĩĐŊŅ‚ ĐžŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐģŅĐĩŅ‚ŅŅ Đ´ĐžŅŅ‚ŅƒĐŋ ĐŊа ŅŅ‚ĐžĐŧ Đ´Đ¸ŅĐēĐĩ. ĐžĐąŅ‹Ņ‡ĐŊĐž ŅĐ°ĐŧŅ‹Đš ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ иĐŧĐĩŅ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐąŅƒŅ„ĐĩŅ€Đ°, Ņ‡Ņ‚Đž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžŅŅ‚Đ¸ĐļиĐŧŅƒŅŽ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊŅƒŅŽ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ. Đ’Ņ‚ĐžŅ€ĐžĐš ĐŗŅ€Đ°Ņ„Đ¸Đē ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐŋĐžŅ‚Ņ€Đ°Ņ‡ĐĩĐŊĐŊĐžĐŗĐž ĐŊа ĐžĐļидаĐŊиĐĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ 100 ҁĐĩĐē҃ĐŊĐ´. ОĐļидаĐĩŅ‚ŅŅ, Ņ‡Ņ‚Đž ŅĐ°ĐŧŅ‹Đš ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē Đ˛Ņ‹ĐˇĐžĐ˛ĐĩŅ‚ йОĐģŅŒŅˆŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžĐļидаĐŊĐ¸Ņ, в Ņ‚Đž Đ˛Ņ€ĐĩĐŧŅ ĐēаĐē Đ´Ņ€ŅƒĐŗĐ¸Đĩ Đ´Đ¸ŅĐēи Đ´ĐžĐģĐļĐŊŅ‹ иĐŧĐĩŅ‚ŅŒ ĐŧаĐģĐž иĐģи ŅĐžĐ˛ŅĐĩĐŧ ĐŊĐĩ иĐŧĐĩŅ‚ŅŒ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžĐļидаĐŊĐ¸Ņ, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž ĐžĐŊи ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ˛ĐžĐ¸ ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŋĐžĐģĐžŅŅ‹. Đ­Ņ‚ĐžŅ‚ ĐŗŅ€Đ°Ņ„Đ¸Đē Ņ‚Đ°ĐēĐļĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Đ˛Ņ€ĐĩĐŧŅ, ĐŋĐžŅ‚Ņ€Đ°Ņ‡ĐĩĐŊĐŊĐžĐĩ ĐŊа ĐžĐļидаĐŊиĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиК Ņ…ŅŅˆĐ° и Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиК RAID. Đ’ŅĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅŽŅ‚ŅŅ ĐŋĐ°Ņ€Đ°ĐģĐģĐĩĐģҌĐŊĐž ҁ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Đŧи ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅĐŧи. ĐĄĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐž, ĐŋĐžĐēа ĐĩŅŅ‚ŅŒ иСĐŧĐĩŅ€Đ¸ĐŧĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐžĐļидаĐŊĐ¸Ņ Đ´ĐģŅ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ŅŅ‚Đž ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŊа Ņ‚Đž, Ņ‡Ņ‚Đž ĐĻП Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž ĐąŅ‹ŅŅ‚Ņ€, Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒŅŅ ҁ Ņ€Đ°ĐąĐžŅ‡ĐĩĐš ĐŊĐ°ĐŗŅ€ŅƒĐˇĐēОК. -Z, --force-zero Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģа ҁ ĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ€Đ°ĐŊĐĩĐĩ ĐąŅ‹Đģ ĐŊĐĩĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚ Ņ‚Đ°ĐēĐžĐĩ ҃ҁĐģОвиĐĩ, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐģĐĩĐŗĐēĐž ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° ĐŋĐžŅĐģĐĩ ŅĐąĐžŅ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐąŅ‹Đģи ҃ҁĐĩ҇ĐĩĐŊŅ‹. Đ­Ņ‚Đž вОСĐŧĐžĐļĐŊĐžĐĩ ҃ҁĐģОвиĐĩ в Linux ҁ Ņ„Đ°ĐšĐģĐžĐ˛Ņ‹Đŧи ŅĐ¸ŅŅ‚ĐĩĐŧаĐŧи ext3/ext4. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -E, --force-empty Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Đ´Đ¸ŅĐēа, ĐŊа ĐēĐžŅ‚ĐžŅ€ĐžĐŧ ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Đ˛ŅĐĩ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚, Ņ‡Ņ‚Đž Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, иСĐŊĐ°Ņ‡Đ°ĐģҌĐŊĐž ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐŊа Đ´Đ¸ŅĐēĐĩ, ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ иĐģи ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°ĐŊŅ‹, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐģĐĩĐŗĐēĐž ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Ņ„Đ°ĐšĐģĐžĐ˛Đ°Ņ ŅĐ¸ŅŅ‚ĐĩĐŧа даĐŊĐŊҋ҅ ĐŊĐĩ ҁĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊа. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -U, --force-uuid Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸, ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи и Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ҁ Đ´Đ¸ŅĐēаĐŧи, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… иСĐŧĐĩĐŊиĐģŅŅ UUID. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚, Ņ‡Ņ‚Đž ҃ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… Đ´Đ¸ŅĐēОв иСĐŧĐĩĐŊиĐģŅŅ UUID, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Đ˛Đ°ŅˆĐ¸ Đ´Đ¸ŅĐēи ҁĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹ в ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊҋ҅ Ņ‚ĐžŅ‡ĐēĐ°Ņ… ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. ОдĐŊаĐēĐž Đ´ĐžĐŋ҃ҁĐēаĐĩŅ‚ŅŅ ОдĐŊĐžĐēŅ€Đ°Ņ‚ĐŊĐžĐĩ иСĐŧĐĩĐŊĐĩĐŊиĐĩ UUID ҁ ОдиĐŊĐžŅ‡ĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ, и йОĐģҌ҈Đĩ ҁ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛ĐĩĐŊĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž ŅŅ‚Đž ĐŊĐžŅ€ĐŧаĐģҌĐŊŅ‹Đš ҁĐģŅƒŅ‡Đ°Đš ĐŋŅ€Đ¸ СаĐŧĐĩĐŊĐĩ Đ´Đ¸ŅĐēОв ĐŋĐžŅĐģĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`, `check` иĐģи `fix`. -D, --force-device Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ҁ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи Đ´Đ¸ŅĐēаĐŧи иĐģи ҁ Đ´Đ¸ŅĐēаĐŧи ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐžĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐģи два Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ и ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ СаĐŋĐ°ŅĐŊОК Đ´Đ¸ŅĐē Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž ĐŋĐĩŅ€Đ˛ĐžĐŗĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛Ņ‚ĐžŅ€ĐžĐš ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đš Đ´Đ¸ŅĐē. ИĐģи, ĐĩҁĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ´Đ¸ŅĐē в ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐĩ ĐŧĐĩŅŅ‚Đž, ĐžŅŅ‚Đ°Đ˛ŅˆĐĩĐĩŅŅ ĐŊа ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŧ Đ´Đ¸ŅĐēĐĩ, ŅĐžĐ˛ĐŧĐĩҁ҂ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‰ĐĩĐŧ Ņ‚Đž ĐļĐĩ Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐžĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `fix`. -N, --force-nocopy В `sync`, `check` и `fix`, ĐžŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ŅĐ˛Ņ€Đ¸ŅŅ‚Đ¸Đē҃ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐ¸Ņ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. БĐĩС ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸ SnapRAID ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ‚, Ņ‡Ņ‚Đž Ņ„Đ°ĐšĐģŅ‹ ҁ ОдиĐŊаĐēĐžĐ˛Ņ‹Đŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ĐēаĐē иĐŧŅ, Ņ€Đ°ĐˇĐŧĐĩŅ€ и ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ĐēĐžĐŋĐ¸ŅĐŧи ҁ ОдиĐŊаĐēĐžĐ˛Ņ‹Đŧи даĐŊĐŊŅ‹Đŧи. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ иĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ҁ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŊа Đ´Ņ€ŅƒĐŗĐžĐš и ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҃ĐļĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Ņ…ŅŅˆĐ° Đ´ĐģŅ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐ¸Ņ ҁĐēҀҋ҂ҋ҅ ĐžŅˆĐ¸ĐąĐžĐē иĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… Ņ„Đ°ĐšĐģОв. В ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… Ņ€ĐĩĐ´ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… ŅŅ‚Đž ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ĐģĐžĐļĐŊŅ‹Đŧ ŅŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐŊĐ¸ŅĐŧ иĐģи СаĐŧĐĩĐ´ĐģĐĩĐŊĐ¸ŅŽ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° иС-Са йОĐģŅŒŅˆĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐžĐē Ņ…ŅŅˆĐ°, и ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋОСвОĐģŅĐĩŅ‚ Ņ€ĐĩŅˆĐ¸Ņ‚ŅŒ Ņ‚Đ°ĐēиĐĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`, `check` и `fix`. -F, --force-full В `sync`, Ņ„ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐžĐģĐŊŅ‹Đš ĐŋĐĩŅ€Đĩҁ҇ĐĩŅ‚ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ дОйавĐģŅĐĩŅ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ иĐģи ĐĩҁĐģи Đ˛Ņ‹ вĐĩŅ€ĐŊ҃ĐģĐ¸ŅŅŒ Đē ŅŅ‚Đ°Ņ€ĐžĐŧ҃ Ņ„Đ°ĐšĐģ҃ content, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ йОĐģĐĩĐĩ ŅĐ˛ĐĩĐļиĐĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ВĐŧĐĩŅŅ‚Đž Ņ‚ĐžĐŗĐž Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ‚ŅŒ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ҁ ĐŊ҃ĐģŅ, ŅŅ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ…ŅŅˆĐ¸, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ content, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ и ĐŋОддĐĩŅ€ĐļаĐŊĐ¸Ņ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ даĐŊĐŊҋ҅ вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° `sync` ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… даĐŊĐŊҋ҅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -R, --force-realloc В `sync`, Ņ„ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐžĐģĐŊĐžĐĩ ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ Ņ„Đ°ĐšĐģОв и ĐŋĐĩŅ€ĐĩŅŅ‚Ņ€ĐžĐĩĐŊиĐĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ ĐŋĐžĐģĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸, ĐŋŅ€Đ¸ ŅŅ‚ĐžĐŧ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ Ņ…ŅŅˆĐ¸, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ content, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ ĐĩĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ. ĐŖ Đ˛Đ°Ņ НЕĐĸ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ даĐŊĐŊҋ҅ вО Đ˛Ņ€ĐĩĐŧŅ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ `sync`. -W, --force-realloc-tail РАЗМЕР Đ Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐēаĐē -R, --force-realloc, ĐŊĐž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ҃ĐēаСаĐŊĐŊОК Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐš Ņ‡Đ°ŅŅ‚ŅŒŅŽ (ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ РАЗМЕР ĐąĐ°ĐšŅ‚) ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐŸŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ (ĐŋĐĩŅ€ĐĩĐŧĐĩŅ‰Đ°ĐĩŅ‚) ĐģŅŽĐąŅ‹Đĩ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊ҂ҋ/ĐąĐģĐžĐēи Ņ„Đ°ĐšĐģОв, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸ĐĩŅŅ в даĐŊĐŊŅ‹Đš ĐŧĐžĐŧĐĩĐŊŅ‚ в ŅŅ‚ĐžĐš Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐš Ņ‡Đ°ŅŅ‚Đ¸, ĐŋОСвОĐģŅŅ Ņ€Đ°ĐˇĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐģŅŽĐąĐžĐŧ ĐŧĐĩҁ҂Đĩ Ņ„Đ°ĐšĐģа(Ов) ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐŗĐ´Đĩ ĐĩŅŅ‚ŅŒ ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐĩ ĐŧĐĩŅŅ‚Đž (вĐēĐģŅŽŅ‡Đ°Ņ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐŋŅƒŅŅ‚ĐžŅ‚Ņ‹). ĐžŅĐŊОвĐŊĐ°Ņ ҆ĐĩĐģҌ ŅŅ‚ĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° — ҃ĐŧĐĩĐŊŅŒŅˆĐ¸Ņ‚ŅŒ СаĐŊиĐŧаĐĩĐŧŅ‹Đš ĐŊа Đ´Đ¸ŅĐēĐĩ Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ Đ˛ŅŅŽ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ (в ĐŊĐĩĐš ĐŊĐĩ ĐžŅŅ‚Đ°ĐŊĐĩŅ‚ŅŅ ĐąĐģĐžĐēОв), Ņ„Đ°ĐšĐģ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐąŅƒĐ´ĐĩŅ‚ ĐžĐąŅ€ĐĩСаĐŊ, Đ˛Ņ‹ŅĐ˛ĐžĐąĐžĐļĐ´Đ°Ņ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐĩ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž. МоĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģи, Ņ‚Đ°ĐēиĐĩ ĐēаĐē K, M, G иĐģи T (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, --force-realloc-tail 1G). Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ locate -t, --tail, Ņ‡Ņ‚ĐžĐąŅ‹ ĐˇĐ°Ņ€Đ°ĐŊĐĩĐĩ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. ВНИМАНИЕ! Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐĩĐŗĐž ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ. Во Đ˛Ņ€ĐĩĐŧŅ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ `sync` ĐˇĐ°Ņ‰Đ¸Ņ‚Đ° даĐŊĐŊҋ҅ Đ´ĐģŅ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Ņ… Ņ„Đ°ĐšĐģОв ОĐĸĐĄĐŖĐĸĐĄĐĸĐ’ĐŖĐ•Đĸ. -l, --log FILE ЗаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ ĐŋĐžĐ´Ņ€ĐžĐąĐŊŅ‹Đš ĐļŅƒŅ€ĐŊаĐģ в ҃ĐēаСаĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ. Đ•ŅĐģи ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ ҃ĐēаСаĐŊа, ĐŊĐĩĐŋŅ€ĐĩдвидĐĩĐŊĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ ĐŊа ŅĐēŅ€Đ°ĐŊ, Ņ‡Ņ‚Đž ĐŋĐžŅ‚ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ҇ҀĐĩСĐŧĐĩŅ€ĐŊĐžĐŧ҃ Đ˛Ņ‹Đ˛ĐžĐ´Ņƒ в ҁĐģŅƒŅ‡Đ°Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đ° ĐžŅˆĐ¸ĐąĐžĐē. ĐšĐžĐŗĐ´Đ° ҃ĐēаСаĐŊа -l, --log, ĐŊа ŅĐēŅ€Đ°ĐŊ Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°Ņ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋŅ€Đ¸Đ˛ĐžĐ´ŅŅ‚ Đē ĐžŅŅ‚Đ°ĐŊОвĐēĐĩ SnapRAID. Đ•ŅĐģи ĐŋŅƒŅ‚ŅŒ ĐŊĐ°Ņ‡Đ¸ĐŊаĐĩŅ‚ŅŅ ҁ `>>`, Ņ„Đ°ĐšĐģ ĐžŅ‚ĐēŅ€Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ в Ņ€ĐĩĐļиĐŧĐĩ дОйавĐģĐĩĐŊĐ¸Ņ. Đ’Ņ…ĐžĐļĐ´ĐĩĐŊĐ¸Ņ `%D` и `%T` в иĐŧĐĩĐŊи СаĐŧĐĩĐŊŅŅŽŅ‚ŅŅ Đ´Đ°Ņ‚ĐžĐš и Đ˛Ņ€ĐĩĐŧĐĩĐŊĐĩĐŧ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ ГГГГММДД и ЧЧММСС. В ĐŋаĐēĐĩŅ‚ĐŊҋ҅ Ņ„Đ°ĐšĐģĐ°Ņ… Windows Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐ´Đ˛ĐžĐ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģ `%`, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, result-%%D.log. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `>>`, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ СаĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ иĐŧŅ в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, `">>result.log"`. ДĐģŅ Đ˛Ņ‹Đ˛ĐžĐ´Đ° ĐļŅƒŅ€ĐŊаĐģа ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš Đ˛Ņ‹Đ˛ĐžĐ´ иĐģи ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅƒŅŽ ĐžŅˆĐ¸ĐąĐē҃, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `">&1"` и `">&2"` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊĐž. ОĐŋĐ¸ŅĐ°ĐŊиĐĩ Ņ‚ĐĩĐŗĐžĐ˛ ĐļŅƒŅ€ĐŊаĐģа ҁĐŧ. в Ņ„Đ°ĐšĐģĐĩ snapraid_log.txt иĐģи man-ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ. -L, --error-limit NUMBER ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŊĐžĐ˛Ņ‹Đš ĐģиĐŧĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐžĐē Đ´Đž ĐžŅŅ‚Đ°ĐŊОвĐēи Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ SnapRAID ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ŅŅ, ĐĩҁĐģи ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚ йОĐģĐĩĐĩ 100 ĐžŅˆĐ¸ĐąĐžĐē ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, Ņ‡Ņ‚Đž ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŊа вĐĩŅ€ĐžŅŅ‚ĐŊŅ‹Đš ŅĐąĐžĐš Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ вĐģĐ¸ŅĐĩŅ‚ ĐŊа `sync` и `scrub`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đŧ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ°Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Ņƒ ĐŋĐžŅĐģĐĩ ĐŋĐĩŅ€Đ˛ĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Đ° Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐžŅˆĐ¸ĐąĐžĐē, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐŋŅ‹Ņ‚Đ°Ņ‚ŅŒŅŅ СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒ ŅĐ˛ĐžĐ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸. ОдĐŊаĐēĐž `check` и `fix` Đ˛ŅĐĩĐŗĐ´Đ° ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŋĐĩŅ€Đ˛ĐžĐš ĐžŅˆĐ¸ĐąĐēĐĩ. -S, --start BLKSTART ĐĐ°Ņ‡Đ¸ĐŊаĐĩŅ‚ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đē҃ ҁ ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐŊĐžĐŧĐĩŅ€Đ° ĐąĐģĐžĐēа. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊОК ĐŋĐžĐŋҋ҂Đēи ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ иĐģи Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đĩ ĐąĐģĐžĐēи в ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. -B, --count BLKCOUNT ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ҃ĐēаСаĐŊĐŊĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąĐģĐžĐēОв. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. -C, --gen-conf CONTENT ГĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩŅ‚ Ņ„Đ¸ĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ иС ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐŗĐž Ņ„Đ°ĐšĐģа content. ФаКĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ СаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš Đ˛Ņ‹Đ˛ĐžĐ´ и ĐŊĐĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đš. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Ņ‚Đ°ĐēĐļĐĩ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅƒŅŽ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžŅ‡ĐĩĐē ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēОв в ҁĐģŅƒŅ‡Đ°Đĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ Đ˛ŅŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. -v, --verbose ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ йОĐģҌ҈Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ•ŅĐģи ҃ĐēаСаĐŊа ОдиĐŊ Ņ€Đ°Đˇ, ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ и Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đē҃. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа Ņ„Đ°ĐšĐģŅ‹ ĐļŅƒŅ€ĐŊаĐģа. -q, --quiet ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐŧĐĩĐŊҌ҈Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ•ŅĐģи ҃ĐēаСаĐŊа ОдиĐŊ Ņ€Đ°Đˇ, ŅƒĐ´Đ°ĐģŅĐĩŅ‚ иĐŊдиĐēĐ°Ņ‚ĐžŅ€ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ; дваĐļĐ´Ņ‹, Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸; Ņ‚Ņ€Đ¸ĐļĐ´Ņ‹, иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊŅ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ; ҇Đĩ҂ҋҀĐĩĐļĐ´Ņ‹, ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ Đž ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ. Đ¤Đ°Ņ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи Đ˛ŅĐĩĐŗĐ´Đ° Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа Ņ„Đ°ĐšĐģŅ‹ ĐļŅƒŅ€ĐŊаĐģа. -H, --help ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐēŅ€Đ°Ņ‚ĐēиК ŅĐēŅ€Đ°ĐŊ ҁĐŋŅ€Đ°Đ˛Đēи. -V, --version ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ вĐĩŅ€ŅĐ¸ŅŽ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹. Configuration SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ СĐŊĐ°Ņ‚ŅŒ, ĐŗĐ´Đĩ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ Đ˛Đ°Ņˆ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Đš ĐŧĐ°ŅŅĐ¸Đ˛ и ĐŗĐ´Đĩ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. В Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ĐĩҁĐģи ĐžĐŊ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚, в ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ `/etc/snapraid.conf`. В Windows Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` в Ņ‚ĐžĐŧ ĐļĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ, Ņ‡Ņ‚Đž и `snapraid.exe`. ОĐŊ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸ (Ņ‡ŅƒĐ˛ŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đē Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Ņƒ): parity FILE [,FILE] ... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ЧĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņƒ ĐžŅ‚ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа, ĐŋОдОйĐŊĐž RAID5. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ ĐŊа Ņ€Đ°ĐˇĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. ĐšĐžĐŗĐ´Đ° Ņ„Đ°ĐšĐģ йОĐģҌ҈Đĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ Ņ€Đ°ŅŅ‚Đ¸, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đš. ĐžĐąŅ‰ĐĩĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŋĐž ĐēŅ€Đ°ĐšĐŊĐĩĐš ĐŧĐĩŅ€Đĩ Ņ‚Đ°ĐēиĐŧ ĐļĐĩ йОĐģŅŒŅˆĐ¸Đŧ, ĐēаĐē ŅĐ°ĐŧŅ‹Đš йОĐģŅŒŅˆĐžĐš Đ´Đ¸ŅĐē даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋОСĐļĐĩ, ĐŊĐž Đ˛Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€Đĩ҃ĐŋĐžŅ€ŅĐ´ĐžŅ‡Đ¸Ņ‚ŅŒ иĐģи ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸Ņ…. ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи ĐŊĐĩ ŅŅ‚Đ°ĐŊŅƒŅ‚ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи, ҃ĐģŅƒŅ‡ŅˆĐ°Ņ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ. В Windows 256 МБ ĐžŅŅ‚Đ°ĐĩŅ‚ŅŅ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŋŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊĐ¸Ņ Đž ĐŋĐžĐģĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊОК и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Ņ€Đ°Đˇ. (2,3,4,5,6)-parity FILE [,FILE] ... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ҃ĐēаСаĐŊĐŊĐžĐŗĐž ŅƒŅ€ĐžĐ˛ĐŊŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ ОдиĐŊ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹: * 2-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ двОКĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ RAID6. * 3-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚Ņ€ĐžĐšĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. * 4-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ҇ĐĩŅ‚Đ˛ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. * 5-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐŋŅŅ‚ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. * 6-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ҈Đĩҁ҂ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. КаĐļĐ´Ņ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŊаĐģĐ¸Ņ‡Đ¸Ņ Đ˛ŅĐĩŅ… ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Ņ… ŅƒŅ€ĐžĐ˛ĐŊĐĩĐš ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ Ņ‚Đĩ ĐļĐĩ ŅĐžĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ, Ņ‡Ņ‚Đž и Đ´ĐģŅ ĐžĐŋŅ†Đ¸Đ¸ `parity`. Đ­Ņ‚Đ¸ ĐžĐŋŅ†Đ¸Đ¸ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ĐŊĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊŅ‹Đŧи и ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Ņ€Đ°Đˇ. z-parity FILE [,FILE] ... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ и Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚Ņ€ĐžĐšĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐžĐš `3-parity`, в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊОК Đ´ĐģŅ ҁĐģĐ°ĐąŅ‹Ņ… ĐŋŅ€ĐžŅ†ĐĩŅŅĐžŅ€ĐžĐ˛, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ARM иĐģи AMD Phenom, Athlon и Opteron, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ ĐŊĐ°ĐąĐžŅ€ иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đš SSSE3. В Ņ‚Đ°ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… ĐžĐŊа ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ ĐģŅƒŅ‡ŅˆŅƒŅŽ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ. Đ­Ņ‚ĐžŅ‚ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋĐžŅ…ĐžĐļ ĐŊа Ņ‚ĐžŅ‚, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ZFS RAIDZ3, ĐŊĐž ĐąŅ‹ŅŅ‚Ņ€ĐĩĐĩ. КаĐē и ZFS, ĐžĐŊ ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ Са ĐŋŅ€ĐĩĐ´ĐĩĐģаĐŧи Ņ‚Ņ€ĐžĐšĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐŸŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии `3-parity` Đ˛Ņ‹ ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊŅ‹, ĐĩҁĐģи Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ `z-parity` Đ´ĐģŅ ĐŋĐžĐ˛Ņ‹ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸. ВозĐŧĐžĐļĐŊĐž ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиĐĩ иС ОдĐŊĐžĐŗĐž Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ° в Đ´Ņ€ŅƒĐŗĐžĐš ĐŋŅƒŅ‚ĐĩĐŧ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи Ņ„Đ°ĐšĐģа ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ҁ ĐļĐĩĐģаĐĩĐŧŅ‹Đŧ Ņ„Đ°ĐšĐģĐžĐŧ z-parity иĐģи 3-parity и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ `fix` Đ´ĐģŅ ĐĩĐŗĐž Đ˛ĐžŅŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ. content FILE ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ҁĐŋĐ¸ŅĐēа и ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊҋ҅ ҁ҃ĐŧĐŧ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. ОĐŊ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Ņ€Đ°ĐˇĐŧĐĩ҉ĐĩĐŊ ĐŊа Đ´Đ¸ŅĐēĐĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŧ Đ´ĐģŅ даĐŊĐŊҋ҅, ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, иĐģи ĐģŅŽĐąĐžĐŧ Đ´Ņ€ŅƒĐŗĐžĐŧ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ. Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Đ´Đ¸ŅĐē даĐŊĐŊҋ҅, ŅŅ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ иС ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° `sync`. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊОК и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ Đ´ĐģŅ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… ĐēĐžĐŋиК ОдĐŊĐžĐŗĐž и Ņ‚ĐžĐŗĐž ĐļĐĩ Ņ„Đ°ĐšĐģа. Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐēаĐē ĐŧиĐŊиĐŧ҃Đŧ ОдĐŊ҃ ĐēĐžĐŋĐ¸ŅŽ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŗĐž Đ´Đ¸ŅĐēа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐģŅŽŅ ОдĐŊ҃. Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐēĐžĐŋиК ĐŊĐĩ ĐŋĐžĐ˛Ņ€ĐĩĐ´Đ¸Ņ‚. data NAME DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ иĐŧŅ и Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēОв даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. NAME Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´Đ¸ŅĐēа и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ҃ĐŊиĐēаĐģҌĐŊŅ‹Đŧ. DIR — ŅŅ‚Đž Ņ‚ĐžŅ‡Đēа ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēа в Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ иСĐŧĐĩĐŊŅŅ‚ŅŒ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ĐŋĐž ĐŧĐĩŅ€Đĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸, ĐŋĐžĐēа Đ˛Ņ‹ ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚Đĩ NAME Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ. Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ОдĐŊ҃ ĐžĐŋŅ†Đ¸ŅŽ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐē ĐŋОСĐļĐĩ, иСĐŧĐĩĐŊив NAME ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, а ĐˇĐ°Ņ‚ĐĩĐŧ СаĐŋŅƒŅŅ‚Đ¸Đ˛ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. В ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊĐ¸Ņ, Đ°ŅŅĐžŅ†Đ¸Đ°Ņ†Đ¸Ņ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊĐžĐŗĐž UUID Đ´Đ¸ŅĐēОв. extra NAME DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ иĐŧŅ и Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ Đ´Đ¸ŅĐēОв Đ´ĐģŅ ĐŧĐžĐŊĐ¸Ņ‚ĐžŅ€Đ¸ĐŊĐŗĐ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´ `smart` и `probe`. Đ­Ņ‚Đž ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ ĐŧĐžĐŊĐ¸Ņ‚ĐžŅ€Đ¸ĐŊĐŗĐ° Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ Ņ‡Đ°ŅŅ‚ŅŒŅŽ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, ĐŊĐž ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹ Đ´ĐģŅ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžŅ‡ĐŊŅ‹Đš Đ´Đ¸ŅĐē. ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ вĐŊиĐŧаĐŊиĐĩ, Ņ‡Ņ‚Đž Ņ‚Đ°ĐēиĐĩ Đ´Đ¸ŅĐēи ĐŊĐĩ ĐˇĐ°Ņ‚Ņ€Đ°ĐŗĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `up` и `down`, Ņ‚Đ°Đē ĐēаĐē ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ‚ŅŅ, Ņ‡Ņ‚Đž ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‚ŅŅ. nohidden Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Đ˛ŅĐĩ ҁĐēҀҋ҂ҋĐĩ Ņ„Đ°ĐšĐģŅ‹ и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸. В Unix ҁĐēҀҋ҂ҋĐĩ Ņ„Đ°ĐšĐģŅ‹ — ŅŅ‚Đž Ņ‚Đĩ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŅ ҁ `.`. В Windows — ŅŅ‚Đž Ņ‚Đĩ, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐĩŅŅ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Ņ‹Đš Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚. exclude/include PATTERN ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ Ņ„Đ°ĐšĐģОв иĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ Đ´ĐģŅ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ иĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ в ĐŋŅ€ĐžŅ†Đĩҁҁ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ’ŅĐĩ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ҃ĐēаСаĐŊĐŊĐžĐŧ ĐŋĐžŅ€ŅĐ´ĐēĐĩ. Đ•ŅĐģи ĐŋĐĩŅ€Đ˛Ņ‹Đš ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‰Đ¸Đš ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž `exclude`, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи ŅŅ‚Đž `include`, Ņ„Đ°ĐšĐģ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи ĐŊи ОдиĐŊ ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐĩ ŅĐžĐ˛ĐŋадаĐĩŅ‚, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ, ĐĩҁĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ҃ĐēаСаĐŊĐŊŅ‹Đš ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž `include`, иĐģи вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ, ĐĩҁĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž `exclude`. ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ Đž ҁĐŋĐĩŅ†Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŅ… ŅˆĐ°ĐąĐģĐžĐŊОв ҁĐŧ. в Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ PATTERN. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. blocksize SIZE_IN_KIBIBYTES ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐąĐ°ĐˇĐžĐ˛Ņ‹Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа в ĐēĐ¸ĐąĐ¸ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ОдиĐŊ ĐēĐ¸ĐąĐ¸ĐąĐ°ĐšŅ‚ — ŅŅ‚Đž 1024 ĐąĐ°ĐšŅ‚Đ°. РаСĐŧĐĩŅ€ ĐąĐģĐžĐēа ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 256, Ņ‡Ņ‚Đž Đ´ĐžĐģĐļĐŊĐž Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ в йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв. ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ иСĐŧĐĩĐŊŅŅ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ. Đ§Ņ‚ĐžĐąŅ‹ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ в ĐąŅƒĐ´ŅƒŅ‰ĐĩĐŧ, ваĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Đ˛ŅŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа — ĐĩҁĐģи ҃ Đ˛Đ°Ņ ĐŧĐŊĐžĐŗĐž ĐŧаĐģĐĩĐŊҌĐēĐ¸Ņ… Ņ„Đ°ĐšĐģОв, ĐŋĐžŅ€ŅĐ´Đēа ĐŧиĐģĐģиОĐŊОв. ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа, даĐļĐĩ ĐĩҁĐģи Đ˛ŅĐĩĐŗĐž ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐąĐ°ĐšŅ‚ĐžĐ˛, Đ˛Ņ‹Đ´ĐĩĐģŅĐĩŅ‚ŅŅ ҆ĐĩĐģŅ‹Đš ĐąĐģĐžĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и ĐŋŅ€Đ¸ йОĐģŅŒŅˆĐžĐŧ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ„Đ°ĐšĐģОв ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē СĐŊĐ°Ņ‡Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đŧ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đŧ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°Đŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ СаĐŋĐžĐģĐŊĐ¸Ņ‚Đĩ Đ´Đ¸ŅĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ваĐŧ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž дОйавĐģŅŅ‚ŅŒ йОĐģҌ҈Đĩ Ņ„Đ°ĐšĐģОв ĐŊа Đ´Đ¸ŅĐēи даĐŊĐŊҋ҅. ОдĐŊаĐēĐž ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐ°Ņ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŊĐĩ ĐŊаĐēаĐŋĐģиваĐĩŅ‚ŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅. ĐŸĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž, вОСĐŊиĐēĐ°ŅŽŅ‰ĐĩĐĩ иС-Са йОĐģŅŒŅˆĐžĐŗĐž Ņ‡Đ¸ŅĐģа Ņ„Đ°ĐšĐģОв ĐŊа Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅, ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐžĐąŅŠĐĩĐŧ даĐŊĐŊҋ҅ ĐŊа ŅŅ‚ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅, а ĐŊĐĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ…. В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐŋŅ€Đ¸ĐąĐģиĐļĐĩĐŊĐ¸Ņ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļĐ¸Ņ‚ŅŒ, Ņ‡Ņ‚Đž ĐŋĐžĐģОвиĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐąĐģĐžĐēа Ņ‚ĐĩŅ€ŅĐĩŅ‚ŅŅ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€Đ¸ 100 000 Ņ„Đ°ĐšĐģОв и Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ ĐąĐģĐžĐēа 256 КиБ Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ 12,8 ГБ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Ņ‡Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ҃ĐŧĐĩĐŊҌ҈ĐĩĐŊĐ¸ŅŽ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° ĐŊа Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐŊа 12,8 ГБ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `status`. Đ­Ņ‚Đž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ŅĐ˛ĐžĐąĐžĐ´ĐŊŅ‹Đŧ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅ иĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ Ņ„Đ°ĐšĐģОв, ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛. Đ•ŅĐģи ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐžŅ‚Ņ€Đ¸Ņ†Đ°Ņ‚ĐĩĐģҌĐŊĐžĐĩ, ŅŅ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ˛Ņ‹ ĐąĐģиСĐēи Đē СаĐŋĐžĐģĐŊĐĩĐŊĐ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и ĐžĐŊĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ Đ˛ŅĐĩ Đĩ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅ‚ĐĩŅ€ŅŅ‚ŅŒ. Đ§Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅŅ‚ĐžĐš ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ йОĐģŅŒŅˆĐ¸Đš Ņ€Đ°ĐˇĐ´ĐĩĐģ Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Ņ€Đ°ĐˇĐ´ĐĩĐģ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŊа 12,8 ГБ йОĐģҌ҈Đĩ, ҇ĐĩĐŧ Đ´Đ¸ŅĐēи даĐŊĐŊҋ҅, ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи Đ´Đž 100 000 Ņ„Đ°ĐšĐģОв ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐąĐĩС ĐēаĐēĐ¸Ņ…-ĐģийО ĐŋĐžŅ‚ĐĩŅ€ŅŒ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°. ĐĨĐ¸Ņ‚Ņ€ĐžŅŅ‚ŅŒ Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ йОĐģҌ҈ĐĩĐŗĐž Ņ€Đ°ĐˇĐ´ĐĩĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ в Linux — ĐžŅ‚Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž ĐēĐžĐŧаĐŊдОК: :mkfs.ext4 -m 0 -T largefile4 DEVICE Đ­Ņ‚Đž ĐŋŅ€Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ Đē ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 1,5% Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°, ĐŋŅ€Đ¸ĐąĐģĐ¸ĐˇĐ¸Ņ‚ĐĩĐģҌĐŊĐž 60 ГБ Đ´ĐģŅ Đ´Đ¸ŅĐēа 4 ĐĸБ, Ņ‡Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ ĐžĐēĐžĐģĐž 460 000 Ņ„Đ°ĐšĐģОв ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐąĐĩС ĐēаĐēĐ¸Ņ…-ĐģийО ĐŋĐžŅ‚ĐĩŅ€ŅŒ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°. hashsize SIZE_IN_BYTES ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊҋ҅ ĐąĐģĐžĐēОв. РаСĐŧĐĩŅ€ Ņ…ŅŅˆĐ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 16 ĐąĐ°ĐšŅ‚ (128 ĐąĐ¸Ņ‚), Ņ‡Ņ‚Đž Đ´ĐžĐģĐļĐŊĐž Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ в йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв. ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ иСĐŧĐĩĐŊŅŅ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ. Đ§Ņ‚ĐžĐąŅ‹ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ в ĐąŅƒĐ´ŅƒŅ‰ĐĩĐŧ, ваĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Đ˛ŅŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° — ĐĩҁĐģи Đ˛Đ°ŅˆĐ° ŅĐ¸ŅŅ‚ĐĩĐŧа иĐŧĐĩĐĩŅ‚ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊŅƒŅŽ ĐŋаĐŧŅŅ‚ŅŒ. КаĐē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, SnapRAID ĐžĐąŅ‹Ņ‡ĐŊĐž ҂ҀĐĩĐąŅƒĐĩŅ‚ 1 ГиБ ĐžĐ—ĐŖ ĐŊа ĐēаĐļĐ´Ņ‹Đĩ 16 ĐĸБ даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. В Ņ‡Đ°ŅŅ‚ĐŊĐžŅŅ‚Đ¸, Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ…ŅŅˆĐĩĐš даĐŊĐŊҋ҅ SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŋŅ€Đ¸ĐąĐģĐ¸ĐˇĐ¸Ņ‚ĐĩĐģҌĐŊĐž TS*(1+HS)/BS ĐąĐ°ĐšŅ‚ ĐžĐ—ĐŖ, ĐŗĐ´Đĩ TS — ŅŅ‚Đž ĐžĐąŅ‰Đ¸Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ˛Đ°ŅˆĐĩĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°, BS — Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа в ĐąĐ°ĐšŅ‚Đ°Ņ…, и HS — Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° в ĐąĐ°ĐšŅ‚Đ°Ņ…. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€Đ¸ 8 Đ´Đ¸ŅĐēĐ°Ņ… ĐŋĐž 4 ĐĸБ, Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ ĐąĐģĐžĐēа 256 КиБ (1 КиБ = 1024 ĐąĐ°ĐšŅ‚Đ°) и Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ Ņ…ŅŅˆĐ° 16, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° 8, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа 512, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐēаĐē ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° 8, Ņ‚Đ°Đē и ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа 512, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB autosave SIZE_IN_GIGABYTES ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ĐŋŅ€Đ¸ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ иĐģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐĩ ĐŋĐžŅĐģĐĩ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° ГБ. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋĐžĐģĐĩСĐŊа, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐēа Đ´ĐģĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐēĐžĐŧаĐŊĐ´ `sync` ҁ ĐŊ҃ĐģŅ, ĐĩҁĐģи ĐžĐŊи ĐąŅ‹Đģи ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊŅ‹ ŅĐąĐžĐĩĐŧ ĐŧĐ°ŅˆĐ¸ĐŊŅ‹ иĐģи ĐģŅŽĐąŅ‹Đŧ Đ´Ņ€ŅƒĐŗĐ¸Đŧ ŅĐžĐąŅ‹Ņ‚Đ¸ĐĩĐŧ. temp_limit TEMPERATURE_CELSIUS ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅƒŅŽ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа в ĐĻĐĩĐģŅŒŅĐ¸ŅŅ…. Đ•ŅĐģи ҃ĐēаСаĐŊĐž, SnapRAID ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ° smartctl. ĐĸĐĩĐēŅƒŅ‰Đ¸Đĩ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ Đ´Đ¸ŅĐēОв ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŅ вО Đ˛Ņ€ĐĩĐŧŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹ SnapRAID. Đ•ŅĐģи ĐēаĐēОК-ĐģийО Đ´Đ¸ŅĐē ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ĐĩŅ‚ ŅŅ‚ĐžŅ‚ ĐģиĐŧĐ¸Ņ‚, Đ˛ŅĐĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ, и Đ´Đ¸ŅĐēи ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ (ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŅ‚ в Ņ€ĐĩĐļиĐŧ ĐžĐļидаĐŊĐ¸Ņ) ĐŊа Đ˛Ņ€ĐĩĐŧŅ, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ ĐžĐŋŅ†Đ¸ĐĩĐš `temp_sleep`. ĐŸĐžŅĐģĐĩ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ° ĐžĐļидаĐŊĐ¸Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ вОСОйĐŊОвĐģŅŅŽŅ‚ŅŅ, ĐŋĐžŅ‚ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐž ҁĐŊОва ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŅŅŒ, ĐĩҁĐģи ĐģиĐŧĐ¸Ņ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ Đ´ĐžŅŅ‚Đ¸ĐŗĐ°ĐĩŅ‚ŅŅ Đĩ҉Đĩ Ņ€Đ°Đˇ. Во Đ˛Ņ€ĐĩĐŧŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹ SnapRAID Ņ‚Đ°ĐēĐļĐĩ аĐŊаĐģĐ¸ĐˇĐ¸Ņ€ŅƒĐĩŅ‚ ĐēŅ€Đ¸Đ˛ŅƒŅŽ ĐŊĐ°ĐŗŅ€Đĩва ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа и ĐžŅ†ĐĩĐŊиваĐĩŅ‚ Đ´ĐžĐģĐŗĐžŅŅ€ĐžŅ‡ĐŊŅƒŅŽ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆŅƒŅŽŅŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ, ĐēĐžŅ‚ĐžŅ€ŅƒŅŽ ĐžĐŊи, ĐēаĐē ĐžĐļидаĐĩŅ‚ŅŅ, Đ´ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚, ĐĩҁĐģи аĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŅ. ĐžŅ†ĐĩĐŊĐēа Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐžŅĐģĐĩ Ņ‚ĐžĐŗĐž, ĐēаĐē Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ´Đ¸ŅĐēа ŅƒĐ˛ĐĩĐģĐ¸Ņ‡Đ¸ĐģĐ°ŅŅŒ ҇Đĩ҂ҋҀĐĩ Ņ€Đ°ĐˇĐ°, Ņ‡Ņ‚Đž ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚ ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° даĐŊĐŊҋ҅ Đ´ĐģŅ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐŊадĐĩĐļĐŊОК Ņ‚ĐĩĐŊĐ´ĐĩĐŊŅ†Đ¸Đ¸. Đ­Ņ‚Đ° ĐŋŅ€ĐžĐŗĐŊĐžĐˇĐ¸Ņ€ŅƒĐĩĐŧĐ°Ņ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ°ŅŅŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ в ҁĐēОйĐēĐ°Ņ… Ņ€ŅĐ´ĐžĐŧ ҁ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đŧ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩĐŧ и ĐŋĐžĐŧĐžĐŗĐ°ĐĩŅ‚ ĐžŅ†ĐĩĐŊĐ¸Ņ‚ŅŒ, Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž Đģи ĐžŅ…ĐģаĐļĐ´ĐĩĐŊиĐĩ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. Đ­Ņ‚Đ° ĐžŅ†ĐĩĐŊĐžŅ‡ĐŊĐ°Ņ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ и ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ SnapRAID. ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ ĐžŅĐŊĐžĐ˛Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Đ¸ŅĐēĐģŅŽŅ‡Đ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŊа Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐĩҁĐēĐ¸Ņ… иСĐŧĐĩŅ€ĐĩĐŊĐŊҋ҅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ°Ņ… Đ´Đ¸ŅĐēОв. ДĐģŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ŅŅ‚ĐžĐŗĐž аĐŊаĐģиСа SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ŅŅ‚Đ°ĐģĐžĐŊ Đ´ĐģŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐžĐŊ ĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ ĐĩĐŗĐž иС Đ´ĐžŅŅ‚ŅƒĐŋĐŊҋ҅ аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊҋ҅ Đ´Đ°Ņ‚Ņ‡Đ¸ĐēОв. Đ•ŅĐģи ĐŊи ОдиĐŊ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš Đ´Đ°Ņ‚Ņ‡Đ¸Đē ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ, ĐžĐŊ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ŅĐ°ĐŧŅƒŅŽ ĐŊиСĐēŅƒŅŽ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа, иСĐŧĐĩŅ€ĐĩĐŊĐŊŅƒŅŽ в ĐŊĐ°Ņ‡Đ°ĐģĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ŅŅ‚Đ°ĐģĐžĐŊа. ĐžĐąŅ‹Ņ‡ĐŊĐž SnapRAID ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ŅĐ°ĐŧĐžĐŗĐž ĐŗĐžŅ€ŅŅ‡ĐĩĐŗĐž Đ´Đ¸ŅĐēа. Đ§Ņ‚ĐžĐąŅ‹ ĐžŅ‚ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚ŅŒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ -A иĐģи --stats. temp_sleep TIME_IN_MINUTES ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€ĐĩĐŧŅ ĐžĐļидаĐŊĐ¸Ņ, в ĐŧиĐŊŅƒŅ‚Đ°Ņ…, ĐēĐžĐŗĐ´Đ° Đ´ĐžŅŅ‚Đ¸ĐŗĐ°ĐĩŅ‚ŅŅ ĐŋŅ€ĐĩĐ´ĐĩĐģ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹. В Ņ‚Đĩ҇ĐĩĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ĐŋĐĩŅ€Đ¸ĐžĐ´Đ° Đ´Đ¸ŅĐēи ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ‹Đŧи. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 5 ĐŧиĐŊŅƒŅ‚. pool DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ (pooling), ĐŗĐ´Đĩ ŅĐžĐˇĐ´Đ°ĐĩŅ‚ŅŅ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´Ņ‹ `pool`. ĐšĐ°Ņ‚Đ°ĐģĐžĐŗ Đ´ĐžĐģĐļĐĩĐŊ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ. share UNC_DIR ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŋŅƒŅ‚ŅŒ UNC Windows, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹Đš Đ´ĐģŅ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ´Đ¸ŅĐēаĐŧ. Đ•ŅĐģи ҃ĐēаСаĐŊа ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ, ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи, ŅĐžĐˇĐ´Đ°ĐŊĐŊŅ‹Đĩ в ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ pool, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ ŅŅ‚ĐžŅ‚ ĐŋŅƒŅ‚ŅŒ UNC Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ´Đ¸ŅĐēаĐŧ. БĐĩС ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸ ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐģĐžĐēаĐģҌĐŊŅ‹Đĩ ĐŋŅƒŅ‚Đ¸, Ņ‡Ņ‚Đž ĐŊĐĩ ĐŋОСвОĐģŅĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅŅ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool ĐŋĐž ҁĐĩŅ‚Đ¸. ХиĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи Ņ„ĐžŅ€ĐŧĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐŋŅƒŅ‚Đ¸ UNC, дОйавĐģĐĩĐŊиĐĩĐŧ иĐŧĐĩĐŊи Đ´Đ¸ŅĐēа, ĐēаĐē ҃ĐēаСаĐŊĐž в ĐžĐŋŅ†Đ¸Đ¸ `data`, и, ĐŊаĐēĐžĐŊĐĩ҆, дОйавĐģĐĩĐŊиĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° и иĐŧĐĩĐŊи Ņ„Đ°ĐšĐģа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ Windows. smartctl DISK/PARITY OPTIONS... ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиĐĩ ĐžĐŋŅ†Đ¸Đ¸ smartctl Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ĐžĐ˛ SMART Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩŅ€ĐžĐ˛ RAID и ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… USB-Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊŅ‹ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи. ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌ %s СаĐŧĐĩĐŊŅĐĩŅ‚ŅŅ иĐŧĐĩĐŊĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°, ĐŊĐž ĐžĐŊ ĐŊĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ Đ´ĐģŅ Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩҀҋ RAID. DISK — ŅŅ‚Đž Ņ‚Đž ĐļĐĩ иĐŧŅ Đ´Đ¸ŅĐēа, ҃ĐēаСаĐŊĐŊĐžĐĩ в ĐžĐŋŅ†Đ¸Đ¸ `data`. PARITY — ŅŅ‚Đž ОдĐŊĐž иС иĐŧĐĩĐŊ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` иĐģи `z-parity`. В ҃ĐēаСаĐŊĐŊҋ҅ OPTIONS ŅŅ‚Ņ€ĐžĐēа `%s` СаĐŧĐĩĐŊŅĐĩŅ‚ŅŅ иĐŧĐĩĐŊĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°. ДĐģŅ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩŅ€ĐžĐ˛ RAID ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž, вĐĩŅ€ĐžŅŅ‚ĐŊĐž, Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž, и ваĐŧ ĐŧĐžĐļĐĩŅ‚ ĐŊĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `%s`. ВозĐŧĐžĐļĐŊŅ‹Đĩ ĐžĐŋŅ†Đ¸Đ¸ ҁĐŧ. в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ smartmontools: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices НаĐŋŅ€Đ¸ĐŧĐĩŅ€: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒĐĩŅ‚ ҃ĐēаСаĐŊĐŊŅ‹Đš Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ SMART ĐŋŅ€Đ¸ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊии вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ŅĐąĐžŅ Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋĐžĐģĐĩСĐŊа, ĐĩҁĐģи Đ´Đ¸ŅĐē ŅĐžĐžĐąŅ‰Đ°ĐĩŅ‚ ĐŊĐĩĐžĐąŅ‹Ņ‡ĐŊŅ‹Đĩ иĐģи Đ˛Đ˛ĐžĐ´ŅŅ‰Đ¸Đĩ в СайĐģ҃ĐļĐ´ĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ Đ´ĐģŅ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°. DISK — ŅŅ‚Đž Ņ‚Đž ĐļĐĩ иĐŧŅ Đ´Đ¸ŅĐēа, ҃ĐēаСаĐŊĐŊĐžĐĩ в ĐžĐŋŅ†Đ¸Đ¸ `data`. PARITY — ŅŅ‚Đž ОдĐŊĐž иС иĐŧĐĩĐŊ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` иĐģи `z-parity`. ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ * ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ° ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ…. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Ņ‡Ņ‚ĐžĐąŅ‹ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ `Current Pending Sector Count` ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ…: :smartignore * 197 Đ§Ņ‚ĐžĐąŅ‹ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž Ņ‚ĐžĐģҌĐēĐž ĐŊа ĐŋĐĩŅ€Đ˛ĐžĐŧ Đ´Đ¸ŅĐēĐĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: :smartignore parity 197 Examples ĐŸŅ€Đ¸ĐŧĐĩŅ€ Ņ‚Đ¸ĐŋĐ¸Ņ‡ĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Unix: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 ĐŸŅ€Đ¸ĐŧĐĩŅ€ Ņ‚Đ¸ĐŋĐ¸Ņ‡ĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Windows: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern ШайĐģĐžĐŊŅ‹ ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ŅŽŅ‚ ĐŗĐ¸ĐąĐēиК ҁĐŋĐžŅĐžĐą Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģОв Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ иĐģи Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅĐ¸ĐŧвОĐģŅ‹ ĐŋĐžĐ´ŅŅ‚Đ°ĐŊОвĐēи (globbing), Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸Đģа, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đŧ иĐŧĐĩĐŊаĐŧ Ņ„Đ°ĐšĐģОв иĐģи ҆ĐĩĐģŅ‹Đŧ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ°Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ ĐąĐĩС Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ ĐēаĐļĐ´ĐžĐŗĐž ĐŋŅƒŅ‚Đ¸. ВоĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē `?` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐŧ҃ ОдиĐŊĐžŅ‡ĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃, ĐēŅ€ĐžĐŧĐĩ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. Đ­Ņ‚Đž Đ´ĐĩĐģаĐĩŅ‚ ĐĩĐŗĐž ĐŋĐžĐģĐĩСĐŊŅ‹Đŧ Đ´ĐģŅ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ иĐŧĐĩĐŊ Ņ„Đ°ĐšĐģОв ҁ ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đŧи ŅĐ¸ĐŧвОĐģаĐŧи, ĐŋŅ€Đ¸ ŅŅ‚ĐžĐŧ ŅˆĐ°ĐąĐģĐžĐŊ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ОдĐŊиĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°. ОдиĐŊĐžŅ‡ĐŊĐ°Ņ СвĐĩĐˇĐ´ĐžŅ‡Đēа `*` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸ ŅĐ¸ĐŧвОĐģОв, ĐŊĐž, ĐēаĐē и вОĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē, ĐžĐŊа ĐŊиĐēĐžĐŗĐ´Đ° ĐŊĐĩ ĐŋĐĩŅ€ĐĩҁĐĩĐēаĐĩŅ‚ ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ОĐŊа ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ŅŅ ĐŊа ĐŋŅ€ŅĐŧОК ĐēĐžŅĐžĐš ҇ĐĩҀ҂Đĩ, Ņ‡Ņ‚Đž Đ´ĐĩĐģаĐĩŅ‚ ĐĩĐĩ ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰ĐĩĐš Đ´ĐģŅ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ вĐŊŅƒŅ‚Ņ€Đ¸ ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ĐŋŅƒŅ‚Đ¸. Đ­Ņ‚Đž ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐĩ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ ĐŋĐžĐ´ŅŅ‚Đ°ĐŊĐžĐ˛ĐžŅ‡ĐŊҋ҅ СĐŊаĐēОв, СĐŊаĐēĐžĐŧĐžĐĩ ĐŋĐž ОйОĐģĐžŅ‡ĐēĐĩ (shell). ДвойĐŊĐ°Ņ СвĐĩĐˇĐ´ĐžŅ‡Đēа `**` йОĐģĐĩĐĩ ĐŧĐžŅ‰ĐŊĐ°Ņ, ĐžĐŊа ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸ ŅĐ¸ĐŧвОĐģОв, вĐēĐģŅŽŅ‡Đ°Ņ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊаĐŧ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēиĐŧ ŅƒŅ€ĐžĐ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ĐšĐžĐŗĐ´Đ° `**` ĐŋĐžŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в ŅˆĐ°ĐąĐģĐžĐŊĐĩ, ĐžĐŊа ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊ҃ĐģŅŽ иĐģи йОĐģĐĩĐĩ ŅĐ¸ĐŧвОĐģаĐŧ, вĐēĐģŅŽŅ‡Đ°Ņ ĐēĐžŅŅ‹Đĩ ҇ĐĩҀ҂ҋ ĐŧĐĩĐļĐ´Ņƒ ĐžĐēŅ€ŅƒĐļĐ°ŅŽŅ‰Đ¸Đŧ ĐąŅƒĐēваĐģҌĐŊŅ‹Đŧ Ņ‚ĐĩĐēŅŅ‚ĐžĐŧ. НаибоĐģĐĩĐĩ ваĐļĐŊŅ‹Đŧ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ `**` ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊĐ°Ņ Ņ„ĐžŅ€Đŧа `/**/`. ОĐŊа ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐŊ҃ĐģŅŽ иĐģи йОĐģĐĩĐĩ ĐŋĐžĐģĐŊŅ‹Đŧ ŅƒŅ€ĐžĐ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, Ņ‡Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģŅŅ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ ĐŊа ĐģŅŽĐąĐžĐš ĐŗĐģŅƒĐąĐ¸ĐŊĐĩ в Đ´ĐĩŅ€ĐĩвĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, ĐŊĐĩ СĐŊĐ°Ņ Ņ‚ĐžŅ‡ĐŊОК ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Ņ‹ ĐŋŅƒŅ‚Đ¸. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ŅˆĐ°ĐąĐģĐžĐŊ `src/**/main.js` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ `src/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ĐŊĐžĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛), `src/ui/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ОдĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°) и `src/ui/components/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē Đ´Đ˛ŅƒŅ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛). КĐģĐ°ŅŅŅ‹ ŅĐ¸ĐŧвОĐģОв ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊҋ҅ ҁĐēОйОĐē `[]` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃ иС СадаĐŊĐŊĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Đ° иĐģи диаĐŋаСОĐŊа. КаĐē и Đ´Ņ€ŅƒĐŗĐ¸Đĩ ОдĐŊĐžŅĐ¸ĐŧвОĐģҌĐŊŅ‹Đĩ ŅˆĐ°ĐąĐģĐžĐŊŅ‹, ĐžĐŊи ĐŊĐĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. КĐģĐ°ŅŅŅ‹ ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ диаĐŋаСОĐŊŅ‹ и ĐžŅ‚Ņ€Đ¸Ņ†Đ°ĐŊиĐĩ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ Đ˛ĐžŅĐēĐģĐ¸Ņ†Đ°Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž СĐŊаĐēа. Đ¤ŅƒĐŊдаĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊĐžĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ¸Đĩ, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ ĐŋĐžĐŧĐŊĐ¸Ņ‚ŅŒ, СаĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ в Ņ‚ĐžĐŧ, Ņ‡Ņ‚Đž `*`, `?` и ĐēĐģĐ°ŅŅŅ‹ ŅĐ¸ĐŧвОĐģОв ŅĐžĐąĐģŅŽĐ´Đ°ŅŽŅ‚ ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ и ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž вĐŊŅƒŅ‚Ņ€Đ¸ ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ĐŋŅƒŅ‚Đ¸, в Ņ‚Đž Đ˛Ņ€ĐĩĐŧŅ ĐēаĐē `**` — ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš ŅˆĐ°ĐąĐģĐžĐŊ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ҇ĐĩŅ€ĐĩС Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ĐĄŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚ ҇Đĩ҂ҋҀĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊҋ҅ Ņ‚Đ¸Đŋа ŅˆĐ°ĐąĐģĐžĐŊОв: =FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ FILE. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐŊĐž ĐŊĐĩ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ. =DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąŅƒŅŽ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅŽ ҁ иĐŧĐĩĐŊĐĩĐŧ DIR и Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŊĐĩĐĩ. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ, ĐŊĐž ĐŊĐĩ Đē Ņ„Đ°ĐšĐģаĐŧ. =/PATH/FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ Đē Ņ„Đ°ĐšĐģ҃. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐŊĐž ĐŊĐĩ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ. =/PATH/DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸Đ¸ и Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŊĐĩĐĩ. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ, ĐŊĐž ĐŊĐĩ Đē Ņ„Đ°ĐšĐģаĐŧ. ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚Đĩ Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‰Đ¸ĐšŅŅ ҁ /, ĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đē ĐēĐžŅ€ĐŊĐĩвОĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, а ĐŊĐĩ Đē ĐēĐžŅ€ĐŊĐĩвОĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐģĐžĐēаĐģҌĐŊОК Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. В Windows Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅ€Đ°Ņ‚ĐŊŅƒŅŽ ĐēĐžŅŅƒŅŽ ҇ĐĩŅ€Ņ‚Ņƒ \ вĐŧĐĩŅŅ‚Đž ĐŋŅ€ŅĐŧОК /. ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows, Ņ‚ĐžŅ‡Đēи ŅĐžĐĩдиĐŊĐĩĐŊĐ¸Ņ, Ņ‚ĐžŅ‡Đēи ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ и Đ´Ņ€ŅƒĐŗĐ¸Đĩ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows Ņ€Đ°ŅŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐēаĐē Ņ„Đ°ĐšĐģŅ‹, Ņ‡Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´ĐģŅ Đ¸Ņ… Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ„Đ°ĐšĐģа, а ĐŊĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°. Đ•ŅĐģи иĐŧŅ Ņ„Đ°ĐšĐģа ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ŅĐ¸ĐŧвОĐģŅ‹ `*`, `?`, `[`, иĐģи `]`, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ¸Ņ…, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ Đ¸Ņ… иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Đ¸Đ¸ ĐēаĐē ŅĐ¸ĐŧвОĐģОв ĐŗĐģОййиĐŊĐŗĐ°. В Unix ŅĐ¸ĐŧвОĐģĐžĐŧ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ `\`; в Windows — `^`. ĐšĐžĐŗĐ´Đ° ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ в ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐ´Đ˛ĐžĐ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐĩĐŗĐž иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Đ¸Đ¸ ĐēĐžĐŧаĐŊĐ´ĐŊОК ОйОĐģĐžŅ‡ĐēОК. В Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊŅ‹Đĩ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸Đ¸ Đ´ĐģŅ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģОв Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи. ХаĐŧŅ‹Đš ĐŋŅ€ĐžŅŅ‚ĐžĐš ĐŋĐžĐ´Ņ…ĐžĐ´ — Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` Đ´ĐģŅ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ ĐŊĐĩ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` :exclude *.unrecoverable :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐēĐžŅ€ĐŊĐĩвОК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `/lost+found` :exclude /lost+found/ :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ `tmp` :exclude tmp/ ĐŸŅ€ĐžŅ‚Đ¸Đ˛ĐžĐŋĐžĐģĐžĐļĐŊŅ‹Đš ĐŋĐžĐ´Ņ…ĐžĐ´ — ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: :# ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ :include /movies/ :include /musics/ :include /pictures/ КоĐŊĐĩ҇ĐŊŅ‹Đš ĐŋĐžĐ´Ņ…ĐžĐ´ — ҁĐŧĐĩŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` и `include`. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐžŅ€ŅĐ´ĐžĐē ĐŋŅ€Đ°Đ˛Đ¸Đģ ваĐļĐĩĐŊ. БоĐģĐĩĐĩ Ņ€Đ°ĐŊĐŊиĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа иĐŧĐĩŅŽŅ‚ ĐŋŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đž ĐŊад йОĐģĐĩĐĩ ĐŋОСдĐŊиĐŧи. ДĐģŅ ҃ĐŋŅ€ĐžŅ‰ĐĩĐŊĐ¸Ņ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐŊĐ°Ņ‡Đ°Đģа ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude`, а ĐˇĐ°Ņ‚ĐĩĐŧ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` :exclude *.unrecoverable :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ `tmp` :exclude tmp/ :# ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ :include /movies/ :include /musics/ :include /pictures/ В ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -f, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ŅˆĐ°ĐąĐģĐžĐŊŅ‹ `include`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: :# ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹ .mp3. :# В Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ ĐŗĐģОййиĐŊĐŗĐ° ОйОĐģĐžŅ‡ĐēОК. :snapraid -f "*.mp3" check В Unix ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ŅĐ¸ĐŧвОĐģОв ĐŗĐģОййиĐŊĐŗĐ° в ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ СаĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚Đ¸Ņ‚ŅŒ Đ¸Ņ… Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ ОйОĐģĐžŅ‡ĐēОК. Ignore File В Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊиĐĩ Đē ĐŗĐģОйаĐģҌĐŊŅ‹Đŧ ĐŋŅ€Đ°Đ˛Đ¸ĐģаĐŧ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ‰Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ `.snapraidignore` в ĐģŅŽĐąĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŧĐ°ŅŅĐ¸Đ˛Đ° Đ´ĐģŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ´Đĩ҆ĐĩĐŊŅ‚Ņ€Đ°ĐģиСОваĐŊĐŊҋ҅ ĐŋŅ€Đ°Đ˛Đ¸Đģ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. ĐŸŅ€Đ°Đ˛Đ¸Đģа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ в `.snapraidignore`, ĐŋŅ€Đ¸ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋĐžŅĐģĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģ в ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐžĐŊĐŊĐžĐŧ Ņ„Đ°ĐšĐģĐĩ. Đ­Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи иĐŧĐĩŅŽŅ‚ йОĐģĐĩĐĩ Đ˛Ņ‹ŅĐžĐēиК ĐŋŅ€Đ¸ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ и ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€Đ°ĐŊĐĩĐĩ ĐąŅ‹Đģи вĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ ĐŗĐģОйаĐģҌĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐĩĐš. ФаĐēŅ‚Đ¸Ņ‡ĐĩҁĐēи, ĐĩҁĐģи ĐģĐžĐēаĐģҌĐŊĐžĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ŅĐžĐ˛ĐŋадаĐĩŅ‚, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ ĐŗĐģОйаĐģҌĐŊҋ҅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐē вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. Đ›ĐžĐŗĐ¸Đēа ŅˆĐ°ĐąĐģĐžĐŊОв в `.snapraidignore` ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅĐĩŅ‚ ĐŗĐģОйаĐģҌĐŊŅƒŅŽ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŽ, ĐŊĐž ĐŋŅ€Đ¸Đ˛ŅĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, в ĐēĐžŅ‚ĐžŅ€ĐžĐŧ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ Ņ„Đ°ĐšĐģ: =FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ FILE в ŅŅ‚ĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ иĐģи ĐŊиĐļĐĩ. ЗдĐĩҁҌ Đ´ĐĩĐšŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ‚Đĩ ĐļĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŋĐžĐ´ŅŅ‚Đ°ĐŊОвĐēи, Ņ‡Ņ‚Đž и в ĐŗĐģОйаĐģҌĐŊĐžĐŧ ŅˆĐ°ĐąĐģĐžĐŊĐĩ. =DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ DIR и Đ˛ŅĐĩ ĐĩĐŗĐž ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ, ĐŊĐ°Ņ…ĐžĐ´ŅŅ‰ĐĩĐĩŅŅ в ŅŅ‚ĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ иĐģи ĐŊиĐļĐĩ. =/PATH/FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа `.snapraidignore`. =/PATH/DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ и Đ˛ŅĐĩ ĐĩĐŗĐž ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа `.snapraidignore`. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ ĐŗĐģОйаĐģҌĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Ņ„Đ°ĐšĐģŅ‹ `.snapraidignore` ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ; Đ˛Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ `include` иĐģи ĐžŅ‚Ņ€Đ¸Ņ†Đ°ĐŊиĐĩ (!). НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ `.snapraidignore` в `/mnt/disk1/projects/`: :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐĸОЛĐŦКО /mnt/disk1/projects/output.bin :/output.bin :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ `build` вĐŊŅƒŅ‚Ņ€Đ¸ projects/ :build/ :# Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš .tmp Ņ„Đ°ĐšĐģ вĐŊŅƒŅ‚Ņ€Đ¸ projects/ иĐģи ĐĩĐŗĐž ĐŋОдĐŋаĐŋĐžĐē :*.tmp Content SnapRAID Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ ҁĐŋĐ¸ŅĐžĐē и ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ ҁ҃ĐŧĐŧŅ‹ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģОв в Ņ„Đ°ĐšĐģĐĩ content. Đ­Ņ‚Đž йиĐŊĐ°Ņ€ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, вĐŧĐĩҁ҂Đĩ ŅĐž Đ˛ŅĐĩĐŧи ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đŧи ҁ҃ĐŧĐŧаĐŧи Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Đ¸Ņ… ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ и СаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` и `scrub` и ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `fix`, `check` и `status`. Parity SnapRAID Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ˛Đ°ŅˆĐĩĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ° в Ņ„Đ°ĐšĐģĐ°Ņ… parity. Đ­Ņ‚Đž йиĐŊĐ°Ņ€ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸Đĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ Đ˛ŅĐĩŅ… ĐąĐģĐžĐēОв, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ в Ņ„Đ°ĐšĐģĐĩ `content`. Đ­Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ и СаĐŋĐ¸ŅŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` и `fix` и Ņ‚ĐžĐģҌĐēĐž ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `scrub` и `check`. Encoding SnapRAID в Unix Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ. ОĐŊ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ и Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв ҁ Ņ‚ĐĩĐŧ ĐļĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧОК. В Windows Đ˛ŅĐĩ иĐŧĐĩĐŊа, ŅŅ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ‹Đĩ иС Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹, ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒŅŽŅ‚ŅŅ и ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ UTF-8. Đ§Ņ‚ĐžĐąŅ‹ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐģĐ¸ŅŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐēĐžĐŊŅĐžĐģҌ Windows в Ņ€ĐĩĐļиĐŧ UTF-8 ĐēĐžĐŧаĐŊдОК `chcp 65001` и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅˆŅ€Đ¸Ņ„Ņ‚ TrueType, Ņ‚Đ°ĐēОК ĐēаĐē `Lucida Console`, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ŅˆŅ€Đ¸Ņ„Ņ‚Đ° ĐēĐžĐŊŅĐžĐģи. Đ­Ņ‚Đž вĐģĐ¸ŅĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐĩĐŧŅ‹Đĩ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв; ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚Đĩ Đ˛Ņ‹Đ˛ĐžĐ´ ĐēĐžĐŊŅĐžĐģи в Ņ„Đ°ĐšĐģ, Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ¸Ņ€ŅƒŅŽŅ‰Đ¸Đš Ņ„Đ°ĐšĐģ Đ˛ŅĐĩĐŗĐ´Đ° в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ UTF-8. Copyright Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊ Đ°Đ˛Ņ‚ĐžŅ€ŅĐēиĐŧ ĐŋŅ€Đ°Đ˛ĐžĐŧ (C) 2025 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-ru.txt000066400000000000000000003343661522717156100170310ustar00rootroot00000000000000 ==================================================== Đ ĐĩСĐĩŅ€Đ˛ĐŊĐžĐĩ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ SnapRAID Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐ˛ ==================================================== 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAID — ŅŅ‚Đž ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đ°ĐŊĐŊĐ°Ņ Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐ˛, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ даĐŊĐŊҋ҅ в ҁĐģŅƒŅ‡Đ°Đĩ ŅĐąĐžŅ Đ´Đž ҈ĐĩŅŅ‚Đ¸ Đ´Đ¸ŅĐēОв. В ĐŋĐĩŅ€Đ˛ŅƒŅŽ ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŒ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊĐ°Ņ Đ´ĐģŅ Đ´ĐžĐŧĐ°ŅˆĐŊĐ¸Ņ… ĐŧĐĩĐ´Đ¸Đ°Ņ†ĐĩĐŊŅ‚Ņ€ĐžĐ˛ ҁ йОĐģŅŒŅˆĐ¸Đŧи, Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ Ņ„Đ°ĐšĐģаĐŧи, SnapRAID ĐŋŅ€ĐĩĐ´ĐģĐ°ĐŗĐ°ĐĩŅ‚ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ„ŅƒĐŊĐēŅ†Đ¸Đš: * Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи, ҃ĐļĐĩ СаĐŋĐžĐģĐŊĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģаĐŧи, ĐąĐĩС ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸ Đ¸Ņ… ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ĐŋĐžĐģŅƒŅ‡Đ°Ņ Đē ĐŊиĐŧ Đ´ĐžŅŅ‚ŅƒĐŋ ĐēаĐē ĐžĐąŅ‹Ņ‡ĐŊĐž. * Đ’ŅĐĩ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ Đ´ĐģŅ ОйĐĩҁĐŋĐĩ҇ĐĩĐŊĐ¸Ņ ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ даĐŊĐŊҋ҅ и ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰ĐĩĐŊĐ¸Ņ ҁĐēŅ€Ņ‹Ņ‚ĐžĐŗĐž ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐ¸Ņ. * ĐšĐžĐŗĐ´Đ° Ņ‡Đ¸ŅĐģĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ĐĩŅ‚ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐŋĐžŅ‚ĐĩŅ€Ņ даĐŊĐŊҋ҅ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đŧи Đ´Đ¸ŅĐēаĐŧи; даĐŊĐŊŅ‹Đĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ… ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи. * Đ•ŅĐģи Đ˛Ņ‹ ҁĐģŅƒŅ‡Đ°ĐšĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊа Đ´Đ¸ŅĐēĐĩ, вОСĐŧĐžĐļĐŊĐž Đ¸Ņ… Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ. * Đ”Đ¸ŅĐēи ĐŧĐžĐŗŅƒŅ‚ иĐŧĐĩŅ‚ŅŒ Ņ€Đ°ĐˇĐŊŅ‹Đĩ Ņ€Đ°ĐˇĐŧĐĩҀҋ. * Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ дОйавĐģŅŅ‚ŅŒ Đ´Đ¸ŅĐēи в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ. * SnapRAID ĐŊĐĩ ĐąĐģĐžĐēĐ¸Ņ€ŅƒĐĩŅ‚ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ; Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‚Đ¸Ņ‚ŅŒ ĐĩĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐąĐĩС ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ иĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐ¸Ņ даĐŊĐŊҋ҅. * ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Ņ„Đ°ĐšĐģ҃ Đ´ĐžĐģĐļĐĩĐŊ Ņ€Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Đ´Đ¸ŅĐē, Ņ‡Ņ‚Đž ŅĐēĐžĐŊĐžĐŧĐ¸Ņ‚ ŅĐŊĐĩŅ€ĐŗĐ¸ŅŽ и ҁĐŊиĐļаĐĩŅ‚ ҈҃Đŧ. ДĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸, ĐŋĐžĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģҌĐŊŅ‹Đš ŅĐ°ĐšŅ‚ SnapRAID: https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID — ŅŅ‚Đž ĐŗĐ¸ĐąŅ€Đ¸Đ´ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ RAID и ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ҁ҂ҀĐĩĐŧŅŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ ĐģŅƒŅ‡ŅˆĐ¸Đĩ ĐŋŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đ° ОйĐĩĐ¸Ņ…. ОдĐŊаĐēĐž ҃ ĐŊĐĩĐŗĐž ĐĩŅŅ‚ŅŒ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ ŅƒŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ´ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ. ĐžŅĐŊОвĐŊĐžĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ СаĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ в Ņ‚ĐžĐŧ, Ņ‡Ņ‚Đž ĐĩҁĐģи Đ´Đ¸ŅĐē Đ˛Ņ‹Ņ…ĐžĐ´Đ¸Ņ‚ иС ŅŅ‚Ņ€ĐžŅ, а Đ˛Ņ‹ ĐŊĐĩдавĐŊĐž ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŽ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ. В Ņ‡Đ°ŅŅ‚ĐŊĐžŅŅ‚Đ¸, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ в ĐžĐąŅŠĐĩĐŧĐĩ, Ņ€Đ°Đ˛ĐŊĐžĐŧ Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ иСĐŧĐĩĐŊĐĩĐŊĐŊҋ҅ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ­Ņ‚Đž ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚, даĐļĐĩ ĐĩҁĐģи иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ĐŊа ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŧ Đ´Đ¸ŅĐēĐĩ. Đ’ĐžŅ‚ ĐŋĐžŅ‡ĐĩĐŧ҃ SnapRAID ĐģŅƒŅ‡ŅˆĐĩ ĐŋĐžĐ´Ņ…ĐžĐ´Đ¸Ņ‚ Đ´ĐģŅ даĐŊĐŊҋ҅, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. ĐĄ Đ´Ņ€ŅƒĐŗĐžĐš ŅŅ‚ĐžŅ€ĐžĐŊŅ‹, ĐŊĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐŋŅ€ĐĩĐŋŅŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸ŅŽ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… Ņ„Đ°ĐšĐģОв. Đ’Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐĩҁĐģи ĐžĐŊи ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ĐŊа ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŧ Đ´Đ¸ŅĐēĐĩ. Đ”Ņ€ŅƒĐŗĐ¸Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ SnapRAID: * ĐĄĐž SnapRAID ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ Đĩ҉Đĩ ĐžŅ‚Đ´ĐĩĐģҌĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģĐžĐ˛Ņ‹Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĄ RAID Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ ĐĩдиĐŊŅƒŅŽ йОĐģŅŒŅˆŅƒŅŽ Ņ„Đ°ĐšĐģĐžĐ˛ŅƒŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. * SnapRAID ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ ҇ĐĩŅ€ĐĩдОваĐŊиĐĩ даĐŊĐŊҋ҅. ĐĄ RAID Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ ĐŋŅ€Đ¸Ņ€ĐžŅŅ‚ ҁĐēĐžŅ€ĐžŅŅ‚Đ¸ ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€Ņ ҇ĐĩŅ€ĐĩдОваĐŊĐ¸ŅŽ. * SnapRAID ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ в Ņ€ĐĩаĐģҌĐŊĐžĐŧ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐĄ RAID ваĐŧ ĐŊĐĩ ĐŊ҃ĐļĐŊĐž ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Ņƒ ĐŋŅ€Đ¸ ŅĐąĐžĐĩ Đ´Đ¸ŅĐēа. * SnapRAID ĐŧĐžĐļĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊĐžĐŧ Ņ‡Đ¸ŅĐģĐĩ ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв. ĐĄ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅ‹Đŧ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ ĐŋĐžĐģĐŊĐžĐŗĐž ŅĐąĐžŅ Đ˛ŅĐĩĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. * ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв, ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи и ĐļĐĩҁ҂ĐēиĐĩ ҁҁҋĐģĐēи. Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ, ĐŋŅ€Đ°Đ˛Đ° вĐģадĐĩĐŊĐ¸Ņ и Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹ ĐŊĐĩ ŅĐžŅ…Ņ€Đ°ĐŊŅŅŽŅ‚ŅŅ. 4 GETTING STARTED ================= Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ SnapRAID, ваĐŧ ĐŊ҃ĐļĐŊĐž ҁĐŊĐ°Ņ‡Đ°Đģа Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ОдиĐŊ Đ´Đ¸ŅĐē в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ Đ´ĐģŅ Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊĐ¸Ņ ĐŋОд иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ `҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸` (parity). ĐĄ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đ˛Ņ‹ ҁĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа, ĐŋОдОйĐŊĐž RAID5. Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ йОĐģҌ҈ĐĩĐŗĐž Ņ‡Đ¸ŅĐģа ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв, ĐŋОдОйĐŊĐž RAID6, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đ´Đ¸ŅĐēи Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. КаĐļĐ´Ņ‹Đš Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš Đ´Đ¸ŅĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋОСвОĐģŅĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒŅŅ ĐŋĐžŅĐģĐĩ Đĩ҉Đĩ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа. В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ˛Ņ‹ĐąĐ¸Ņ€Đ°Ņ‚ŅŒ ŅĐ°ĐŧŅ‹Đĩ йОĐģŅŒŅˆĐ¸Đĩ Đ´Đ¸ŅĐēи в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, Ņ‚Đ°Đē ĐēаĐē иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŧĐžĐļĐĩŅ‚ Đ˛Ņ‹Ņ€Đ°ŅŅ‚Đ¸ Đ´Đž Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ŅĐ°ĐŧĐžĐŗĐž йОĐģŅŒŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. Đ­Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐąŅƒĐ´ŅƒŅ‚ Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊŅ‹ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв `҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸`. Đ’Ņ‹ ĐŊĐĩ Đ´ĐžĐģĐļĐŊŅ‹ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐŊа ĐŊĐ¸Ņ… ŅĐ˛ĐžĐ¸ даĐŊĐŊŅ‹Đĩ. Đ—Đ°Ņ‚ĐĩĐŧ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Đ´Đ¸ŅĐēи `даĐŊĐŊҋ҅`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚ŅŒ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ SnapRAID. Đ—Đ°Ņ‰Đ¸Ņ‚Đ° йОĐģĐĩĐĩ ŅŅ„Ņ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊа, ĐĩҁĐģи ŅŅ‚Đ¸ Đ´Đ¸ŅĐēи ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ даĐŊĐŊŅ‹Đĩ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€ĐĩĐ´ĐēĐž ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. По ŅŅ‚ĐžĐš ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩ ĐģŅƒŅ‡ŅˆĐĩ НЕ вĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐē Windows C:\ иĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Unix /home, /var и /tmp. ĐĄĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģОв ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ŅŅ в Ņ„Đ°ĐšĐģĐ°Ņ… `content`, ĐžĐąŅ‹Ņ‡ĐŊĐž Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸Ņ…ŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅, ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ иĐģи ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžŅ‡ĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ Đ´ĐĩŅ‚Đ°Đģи Đ˛Đ°ŅˆĐĩĐŗĐž Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, вĐēĐģŅŽŅ‡Đ°Ņ Đ˛ŅĐĩ ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ ҁ҃ĐŧĐŧŅ‹ Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ĐĩĐŗĐž ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. ФаКĐģ `content` Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŅ в ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… ĐēĐžĐŋĐ¸ŅŅ…, и ĐēаĐļĐ´Đ°Ņ ĐēĐžĐŋĐ¸Ņ Đ´ĐžĐģĐļĐŊа ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐŊа ĐžŅ‚Đ´ĐĩĐģҌĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ, Ņ‡Ņ‚Đž даĐļĐĩ в ҁĐģŅƒŅ‡Đ°Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛ĐĩĐŊĐŊҋ҅ ŅĐąĐžĐĩв Đ´Đ¸ŅĐēОв, Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊа ĐēĐžĐŋĐ¸Ņ ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļиĐŧ, Ņ‡Ņ‚Đž Đ˛Ņ‹ СаиĐŊŅ‚ĐĩŅ€ĐĩŅĐžĐ˛Đ°ĐŊŅ‹ Ņ‚ĐžĐģҌĐēĐž в ОдĐŊĐžĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и Đ˛Đ°ŅˆĐ¸ Đ´Đ¸ŅĐēи Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊŅ‹ ĐŋĐž Đ°Đ´Ņ€ĐĩŅĐ°Đŧ: /mnt/diskp <- Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ /mnt/disk1 <- ĐŋĐĩŅ€Đ˛Ņ‹Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ /mnt/disk2 <- Đ˛Ņ‚ĐžŅ€ĐžĐš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ /mnt/disk3 <- ҂ҀĐĩŅ‚Đ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ /etc/snapraid.conf ŅĐž ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧи ĐžĐŋŅ†Đ¸ŅĐŧи: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Windows, ваĐŧ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋŅƒŅ‚Đ¸ Windows, ҁ ĐąŅƒĐēваĐŧи Đ´Đ¸ŅĐēОв и ĐžĐąŅ€Đ°Ņ‚ĐŊŅ‹Đŧи ҁĐģĐĩŅˆĐ°Đŧи вĐŧĐĩŅŅ‚Đž ĐŋŅ€ŅĐŧҋ҅. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŧĐŊĐžĐŗĐž Đ´Đ¸ŅĐēОв и СаĐēаĐŊŅ‡Đ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐąŅƒĐēĐ˛Ņ‹ Đ´Đ¸ŅĐēОв, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в ĐŋОдĐŋаĐŋĐēи. ĐĄĐŧ.: https://www.google.com/search?q=Windows+mount+point На ŅŅ‚ĐžĐŧ ŅŅ‚Đ°ĐŋĐĩ Đ˛Ņ‹ ĐŗĐžŅ‚ĐžĐ˛Ņ‹ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync` Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. snapraid sync Đ­Ņ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŧĐžĐļĐĩŅ‚ СаĐŊŅŅ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ‡Đ°ŅĐžĐ˛ в ĐŋĐĩŅ€Đ˛Ņ‹Đš Ņ€Đ°Đˇ, в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸ ĐžŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° даĐŊĐŊҋ҅, ҃ĐļĐĩ ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… ĐŊа Đ´Đ¸ŅĐēĐ°Ņ…. Đ•ŅĐģи Đ´Đ¸ŅĐēи ĐŋŅƒŅŅ‚Ņ‹Đĩ, ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐĩĐŗĐž в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐŊаĐļав Ctrl+C, и ĐŋŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ СаĐŋ҃ҁĐēĐĩ ĐžĐŊ вОСОйĐŊĐžĐ˛Đ¸Ņ‚ Ņ€Đ°ĐąĐžŅ‚Ņƒ ҁ Ņ‚ĐžĐŗĐž ĐŧĐĩŅŅ‚Đ°, ĐŗĐ´Đĩ ĐąŅ‹Đģ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊ. ĐšĐžĐŗĐ´Đ° ŅŅ‚Đ° ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŅ, Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ ЗАЩИЩЕНĐĢ. ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ˛ĐžĐš ĐŧĐ°ŅŅĐ¸Đ˛, ĐēаĐē ваĐŧ ŅƒĐŗĐžĐ´ĐŊĐž, и ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ОйĐŊОвĐģŅŅ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, СаĐŋ҃ҁĐēĐ°Ņ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. 4.1 Scrubbing ------------- ДĐģŅ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ и ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅˆĐ¸ĐąĐžĐē, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub`. snapraid scrub Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ŅŅ€Đ°Đ˛ĐŊиваĐĩŅ‚ даĐŊĐŊŅ‹Đĩ в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ҁ Ņ…ŅŅˆĐĩĐŧ, Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅ‹Đŧ вО Đ˛Ņ€ĐĩĐŧŅ ĐēĐžĐŧаĐŊĐ´Ņ‹ `sync`, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. КаĐļĐ´Ņ‹Đš СаĐŋ҃ҁĐē ĐēĐžĐŧаĐŊĐ´Ņ‹ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 8% ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ даĐŊĐŊŅ‹Đĩ, ҃ĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ Са ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Đĩ 10 Đ´ĐŊĐĩĐš. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -p, --plan, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž, и ĐžĐŋŅ†Đ¸ŅŽ -o, --older-than, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Đ˛ĐžĐˇŅ€Đ°ŅŅ‚ в Đ´ĐŊŅŅ…. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи 5% ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ĐąĐģĐžĐēОв ŅŅ‚Đ°Ņ€ŅˆĐĩ 20 Đ´ĐŊĐĩĐš, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ: snapraid -p 5 -o 20 scrub Đ•ŅĐģи вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ `content` и ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ в ĐēĐžĐŧаĐŊĐ´Đĩ `status`. snapraid status Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Đ¸Ņ…, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`, Ņ„Đ¸ĐģŅŒŅ‚Ņ€ŅƒŅ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ -e, --filter-error: snapraid -e fix ĐŸŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ `scrub` ĐžŅˆĐ¸ĐąĐēи Đ¸ŅŅ‡ĐĩСĐŊŅƒŅ‚ иС ĐžŅ‚Ņ‡ĐĩŅ‚Đ° `status`, ĐĩҁĐģи ĐžĐŊи Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹. Đ§Ņ‚ĐžĐąŅ‹ ҃ҁĐēĐžŅ€Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžŅ†Đĩҁҁ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ -p bad Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Ņ‚ĐžĐģҌĐēĐž ĐąĐģĐžĐēОв, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊҋ҅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. snapraid -p bad scrub ЗаĐŋ҃ҁĐē `scrub` ĐŊа ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžĐąŅ‰Đ¸Ņ‚ŅŒ Ой ĐžŅˆĐ¸ĐąĐēĐ°Ņ…, Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊĐŊҋ҅ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧи иĐģи иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đŧи Ņ„Đ°ĐšĐģаĐŧи. Đ­Ņ‚Đ¸ ĐžŅˆĐ¸ĐąĐēи ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‚ŅŅ в Đ˛Ņ‹Đ˛ĐžĐ´Đĩ `scrub`, ĐŊĐž ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŊĐĩ ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. 4.2 Pooling ----------- ĐŸŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊиĐĩ: Đ¤ŅƒĐŊĐēŅ†Đ¸Ņ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ (pooling), ĐžĐŋĐ¸ŅĐ°ĐŊĐŊĐ°Ņ ĐŊиĐļĐĩ, ĐąŅ‹Đģа СаĐŧĐĩĐŊĐĩĐŊа иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ĐžĐŧ mergerfs, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩĐŧŅ‹Đŧ Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚ĐžĐŧ Đ´ĐģŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš Linux в ŅĐžĐžĐąŅ‰ĐĩŅŅ‚Đ˛Đĩ SnapRAID. Mergefs ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ йОĐģĐĩĐĩ ĐŗĐ¸ĐąĐēиК и ŅŅ„Ņ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš ҁĐŋĐžŅĐžĐą ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… Đ´Đ¸ŅĐēОв в ĐĩдиĐŊŅƒŅŽ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°Ņ ĐąĐĩҁĐŋŅ€ĐĩĐŋŅŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē Ņ„Đ°ĐšĐģаĐŧ ĐŋĐž Đ˛ŅĐĩĐŧ҃ ĐŧĐ°ŅŅĐ¸Đ˛Ņƒ ĐąĐĩС ĐžĐŋĐžŅ€Ņ‹ ĐŊа ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи. ОĐŊ Ņ…ĐžŅ€ĐžŅˆĐž иĐŊŅ‚ĐĩĐŗŅ€Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ŅĐž SnapRAID Đ´ĐģŅ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ и ĐžĐąŅ‹Ņ‡ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ в ŅƒŅŅ‚Đ°ĐŊОвĐēĐ°Ņ…, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē OpenMediaVault (OMV) иĐģи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐ¸Ņ… ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŅ… NAS. Đ§Ņ‚ĐžĐąŅ‹ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐģĐ¸ŅŅŒ в ОдĐŊĐžĐŧ Đ´ĐĩŅ€ĐĩвĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Đ¸ŅŽ `pooling`. ОĐŊа ŅĐžĐˇĐ´Đ°ĐĩŅ‚ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв в Đ˛Đ°ŅˆĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `pooling` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: pool /pool иĐģи, ĐĩҁĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Windows, ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: pool C:\pool а ĐˇĐ°Ņ‚ĐĩĐŧ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `pool` Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ иĐģи ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ. snapraid pool Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧ҃ Unix и Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅŅ‚ĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŋĐž ҁĐĩŅ‚Đ¸ ĐēаĐē Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊ Windows, Ņ‚Đ°Đē и Đ´ĐģŅ Unix, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸ в Đ˛Đ°Ņˆ /etc/samba/smb.conf: # В ĐŗĐģОйаĐģҌĐŊĐžĐŧ Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ smb.conf unix extensions = no # В Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ ĐžĐąŅ‰ĐĩĐŗĐž Ņ€ĐĩŅŅƒŅ€ŅĐ° smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes В Windows ŅĐžĐ˛ĐŧĐĩҁ҂ĐŊĐžĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēĐ¸Ņ… ҁҁҋĐģĐžĐē ĐŋĐž ҁĐĩŅ‚Đ¸ ҂ҀĐĩĐąŅƒĐĩŅ‚, Ņ‡Ņ‚ĐžĐąŅ‹ ĐēĐģиĐĩĐŊ҂ҋ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ°Đģи Đ¸Ņ… ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐž. Đ§Ņ‚ĐžĐąŅ‹ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅŅ‚Đž, ĐŋĐžĐŧиĐŧĐž ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐžĐąŅ‰ĐĩĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool, Đ˛Ņ‹ Ņ‚Đ°ĐēĐļĐĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ ĐēĐž Đ˛ŅĐĩĐŧ Đ´Đ¸ŅĐēаĐŧ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ иĐŧĐĩĐŊа Đ´Đ¸ŅĐēОв, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ‚ĐžŅ‡ĐĩĐē ĐžĐąŅ‰ĐĩĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа. Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ Đ´ĐžĐģĐļĐŊŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ в ĐžĐŋŅ†Đ¸Đ¸ `share` Ņ„Đ°ĐšĐģа ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ĐŋŅƒŅ‚ŅŒ UNC Windows, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐēĐģиĐĩĐŊ҂ҋ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅŅ‚Đ¸Đŧ ĐžĐąŅ‰Đ¸Đŧ Đ´Đ¸ŅĐēаĐŧ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Ņ€Đ°ĐąĐžŅ‚Đ°Ņ ҁ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ҁ иĐŧĐĩĐŊĐĩĐŧ `darkstar`, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸Đ¸: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar и ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°Đŧ ĐŋĐž ҁĐĩŅ‚Đ¸: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧ ĐēĐģиĐĩĐŊŅ‚Đ°Đŧ Đ´ĐžŅŅ‚ŅƒĐŋ ĐēĐž Đ˛ŅĐĩĐŧ Ņ„Đ°ĐšĐģаĐŧ ĐŋĐž Đ°Đ´Ņ€Đĩҁ҃ \\darkstar\pool. ВаĐŧ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐēĐģиĐĩĐŊ҂ҋ Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đŧ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐŧ ҁҁҋĐģĐēаĐŧ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´Ņ‹: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAID Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊĐ¸Ņ€ŅƒĐĩŅ‚ ҁĐēĐžŅ€ĐĩĐĩ ĐēаĐē ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, ҇ĐĩĐŧ ĐēаĐē ŅĐ¸ŅŅ‚ĐĩĐŧа RAID, и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ иĐģи ĐžŅ‚ĐŧĐĩĐŊŅ‹ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв Đ´Đž Đ¸Ņ… ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŗĐž ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ -f, --filter: snapraid fix -f FILE иĐģи Đ´ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°: snapraid fix -f DIR/ Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž ҁĐģŅƒŅ‡Đ°ĐšĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв вĐŊŅƒŅ‚Ņ€Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžĐŋŅ†Đ¸Đ¸ -m, --filter-missing, ĐēĐžŅ‚ĐžŅ€Đ°Ņ Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐžŅŅ‚Đ°Đ˛ĐģŅŅ Đ˛ŅĐĩ ĐžŅŅ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐŊĐĩŅ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đŧи. snapraid fix -m -f DIR/ ИĐģи Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ… ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: snapraid fix -m 4.4 Recovering -------------- ĐĄĐģŅƒŅ‡Đ¸ĐģĐžŅŅŒ Ņ…ŅƒĐ´ŅˆĐĩĐĩ, и Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐģи ОдиĐŊ иĐģи ĐŊĐĩҁĐēĐžĐģҌĐēĐž Đ´Đ¸ŅĐēОв! НЕ ĐŸĐĐĐ˜ĐšĐŖĐ™ĐĸЕ! Đ’Ņ‹ ҁĐŧĐžĐļĐĩŅ‚Đĩ Đ¸Ņ… Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ! ПĐĩŅ€Đ˛ĐžĐĩ, Ņ‡Ņ‚Đž Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ, ŅŅ‚Đž иСйĐĩĐŗĐ°Ņ‚ŅŒ даĐģҌĐŊĐĩĐšŅˆĐ¸Ņ… иСĐŧĐĩĐŊĐĩĐŊиК в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ĐģŅŽĐąŅ‹Đĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ ĐŋОдĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đē ĐŊĐĩĐŧ҃ и ĐģŅŽĐąŅ‹Đĩ СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŋŅ€ĐžŅ†Đĩҁҁҋ, вĐēĐģŅŽŅ‡Đ°Ņ ĐģŅŽĐąĐžĐĩ СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐĩ ĐŊĐžŅ‡ĐŊĐžĐĩ sync иĐģи scrub SnapRAID. Đ—Đ°Ņ‚ĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐ°ĐšŅ‚Đĩ Đē ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ ŅˆĐ°ĐŗĐ°Đŧ. ---- 4.4.1 STEP 1 -> Reconfigure ---- ВаĐŧ ĐŊ҃ĐļĐŊĐž ĐŧĐĩŅŅ‚Đž Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ, в идĐĩаĐģĐĩ ĐŊа Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ СаĐŋĐ°ŅĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…, ĐŊĐž вĐŊĐĩ҈ĐŊĐĩĐŗĐž USB-Đ´Đ¸ŅĐēа иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž. ИСĐŧĐĩĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ SnapRAID, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŋŅ†Đ¸Ņ `data` иĐģи `parity` ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐĩĐŗĐž Đ´Đ¸ŅĐēа ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°Đģа ĐŊа ĐŧĐĩŅŅ‚Đž ҁ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊŅ‹Đŧ ĐŋŅƒŅŅ‚Ņ‹Đŧ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛ĐžĐŧ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ´Đ¸ŅĐē `d1` Đ˛Ņ‹ŅˆĐĩĐģ иС ŅŅ‚Ņ€ĐžŅ, иСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ҁ: data d1 /mnt/disk1/ ĐŊа: data d1 /mnt/new_spare_disk/ Đ•ŅĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧŅ‹Đš Đ´Đ¸ŅĐē ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰ŅƒŅŽ ĐžĐŋŅ†Đ¸ŅŽ `parity`. Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ Đ˛ŅĐĩ Đ¸Ņ… ĐžĐŋŅ†Đ¸Đ¸ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. ---- 4.4.2 STEP 2 -> Fix ---- ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ fix, ŅĐžŅ…Ņ€Đ°ĐŊŅŅ ĐļŅƒŅ€ĐŊаĐģ вО вĐŊĐĩ҈ĐŊĐĩĐŧ Ņ„Đ°ĐšĐģĐĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ: snapraid -d NAME -l fix.log fix ГдĐĩ NAME — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ `d1` в ĐŊĐ°ŅˆĐĩĐŧ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŧ ĐŋŅ€Đ¸ĐŧĐĩŅ€Đĩ. Đ•ŅĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧŅ‹Đš Đ´Đ¸ŅĐē ŅĐ˛ĐģŅĐĩŅ‚ŅŅ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ иĐŧĐĩĐŊа `parity`, `2-parity` и Ņ‚. Đ´. Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžŅ‚ĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸Ņ… Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš -d, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ¸Ņ… Đ˛ŅĐĩ. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда СаКĐŧĐĩŅ‚ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŗĐ¸ĐŗĐ°ĐąĐ°ĐšŅ‚ ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐŗĐž ĐŧĐĩŅŅ‚Đ° Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа fix.log. ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐĩĐĩ ҁ Đ´Đ¸ŅĐēа ҁ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊŅ‹Đŧ ŅĐ˛ĐžĐąĐžĐ´ĐŊŅ‹Đŧ ĐŧĐĩŅŅ‚ĐžĐŧ. ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐģи Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŧĐžĐļĐŊĐž ĐąŅ‹ĐģĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ. Đ•ŅĐģи ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ Ņ‡Đ°ŅŅ‚Đ¸Ņ‡ĐŊĐž иĐģи ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ĐŊĐĩĐ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐŧŅ‹, ĐžĐŊи ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊŅ‹ ҁ дОйавĐģĐĩĐŊиĐĩĐŧ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ `.unrecoverable`. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°ĐšŅ‚Đ¸ ĐŋĐžĐ´Ņ€ĐžĐąĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Đ˛ŅĐĩŅ… ĐŊĐĩĐ˛ĐžŅŅŅ‚Đ°ĐŊОвиĐŧҋ҅ ĐąĐģĐžĐēОв в Ņ„Đ°ĐšĐģĐĩ fix.log, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ Đ˛ŅĐĩ ŅŅ‚Ņ€ĐžĐēи, ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‰Đ¸ĐĩŅŅ ҁ `unrecoverable:`. Đ•ŅĐģи Đ˛Ņ‹ ĐŊĐĩ ŅƒĐ´ĐžĐ˛ĐģĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩĐŧ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŅ‚ŅŒ ĐĩĐŗĐž ŅŅ‚ĐžĐģҌĐēĐž Ņ€Đ°Đˇ, ҁĐēĐžĐģҌĐēĐž ĐŋĐžĐļĐĩĐģаĐĩŅ‚Đĩ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ˛Ņ‹ ŅƒĐ´Đ°ĐģиĐģи Ņ„Đ°ĐšĐģŅ‹ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŋĐžŅĐģĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`, ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē Ņ‚ĐžĐŧ҃, Ņ‡Ņ‚Đž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ `fix`, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -i, --import, ҃ĐēаСав, ĐŗĐ´Đĩ ŅŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŅ ҁĐĩĐšŅ‡Đ°Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐŊОва вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐŋŅ€ĐžŅ†Đĩҁҁ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. Đ•ŅĐģи Đ˛Ņ‹ ŅƒĐ´ĐžĐ˛ĐģĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩĐŧ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ, ĐŊĐž ŅƒŅ‡Ņ‚Đ¸Ņ‚Đĩ, Ņ‡Ņ‚Đž ĐŋĐžŅĐģĐĩ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Đ˛Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ҁĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`! ---- 4.4.3 STEP 3 -> Check ---- В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐžŅŅ‚ĐžŅ€ĐžĐļĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ‚ĐĩĐŋĐĩŅ€ŅŒ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `check`, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž Đ˛ŅĐĩ в ĐŋĐžŅ€ŅĐ´ĐēĐĩ ĐŊа Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ. snapraid -d NAME -a check ГдĐĩ NAME — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ `d1` в ĐŊĐ°ŅˆĐĩĐŧ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐŧ ĐŋŅ€Đ¸ĐŧĐĩŅ€Đĩ. ОĐŋŅ†Đ¸Đ¸ -d и -a ĐŗĐžĐ˛ĐžŅ€ŅŅ‚ SnapRAID ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҃ĐēаСаĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē и Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда СаКĐŧĐĩŅ‚ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐŊĐž ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҇ҀĐĩСĐŧĐĩŅ€ĐŊĐž ĐžŅŅ‚ĐžŅ€ĐžĐļĐŊŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐĩĐĩ ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ. ---- 4.4.4 STEP 4 -> Sync ---- ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`, Ņ‡Ņ‚ĐžĐąŅ‹ Ņ€ĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐ°ŅŅĐ¸Đ˛ ҁ ĐŊĐžĐ˛Ņ‹Đŧ Đ´Đ¸ŅĐēĐžĐŧ. snapraid sync Đ•ŅĐģи Đ˛ŅĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž, ŅŅ‚Đ° ĐēĐžĐŧаĐŊда Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž. 5 COMMANDS ========== SnapRAID ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŋŅ€ĐžŅŅ‚Ņ‹Ņ… ĐēĐžĐŧаĐŊĐ´, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋОСвОĐģŅŅŽŅ‚: * ПĐĩŅ‡Đ°Ņ‚Đ°Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŧĐ°ŅŅĐ¸Đ˛Đ° -> `status` * ĐŖĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ Đ´Đ¸ŅĐēаĐŧи -> `smart`, `probe`, `up`, `down` * ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ/ҁĐŊиĐŧĐžĐē -> `sync` * ПĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ‚ŅŒ даĐŊĐŊŅ‹Đĩ -> `scrub` * Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŋĐžŅĐģĐĩĐ´ĐŊŅŽŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ/ҁĐŊиĐŧĐžĐē -> `fix`. КоĐŧаĐŊĐ´Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ ĐŊаĐŋĐ¸ŅĐ°ĐŊŅ‹ ŅŅ‚Ņ€ĐžŅ‡ĐŊŅ‹Đŧи ĐąŅƒĐēваĐŧи. 5.1 status ---------- ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ŅĐ˛ĐžĐ´Đē҃ ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. ОĐŊа вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Đž Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Đž Ņ‚ĐžĐŧ, ĐŊĐ°ŅĐēĐžĐģҌĐēĐž ŅŅ‚Đ°Ņ€Ņ‹Đĩ ĐąĐģĐžĐēи ĐąĐĩС ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, и Đ˛ŅĐĩ СаĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đĩ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи, вОСĐŊиĐēŅˆĐ¸Đĩ вО Đ˛Ņ€ĐĩĐŧŅ scrubbing. ĐŸŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ŅŅ Đē ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ СаĐŋ҃ҁĐēаĐģи `sync`. БоĐģĐĩĐĩ ĐŋОСдĐŊиĐĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ ŅƒŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ. Đ•ŅĐģи ĐąŅ‹Đģи ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊŅ‹ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ Đ¸Ņ… ĐŊĐžĐŧĐĩŅ€Đ°. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Đ¸Ņ…, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix -e`. ОĐŊ Ņ‚Đ°ĐēĐļĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŗŅ€Đ°Ņ„Đ¸Đē, ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅŽŅ‰Đ¸Đš ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐēĐžĐŗĐ´Đ° ĐēаĐļĐ´Ņ‹Đš ĐąĐģĐžĐē ĐąŅ‹Đģ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊ (`scrubbed`) иĐģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊ (`synced`). ĐŸŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи ОйОСĐŊĐ°Ņ‡ĐĩĐŊŅ‹ ŅĐ¸ĐŧвОĐģĐžĐŧ `*`, ĐąĐģĐžĐēи, ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ, ĐŊĐž Đĩ҉Đĩ ĐŊĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ, ŅĐ¸ĐŧвОĐģĐžĐŧ `o`. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.2 smart --------- ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐžŅ‚Ņ‡ĐĩŅ‚ SMART Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. ОĐŊ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐžŅ†ĐĩĐŊĐē҃ вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ŅĐąĐžŅ в ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ ĐŗĐžĐ´Ņƒ, ĐŋОСвОĐģŅŅ ĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐģаĐŊĐžĐ˛ŅƒŅŽ СаĐŧĐĩĐŊ҃ Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ŅŽŅ‚ ĐŋĐžĐ´ĐžĐˇŅ€Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹. Đ­Ņ‚Đ° ĐžŅ†ĐĩĐŊĐēа вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊа ĐŋŅƒŅ‚ĐĩĐŧ ĐēĐžŅ€Ņ€ĐĩĐģŅŅ†Đ¸Đ¸ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ĐžĐ˛ SMART Đ´Đ¸ŅĐēОв ҁ даĐŊĐŊŅ‹Đŧи Backblaze, Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи ĐŋĐž Đ°Đ´Ņ€Đĩҁ҃: https://www.backblaze.com/hard-drive-test-data.html Đ•ŅĐģи SMART ŅĐžĐžĐąŅ‰Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē Đ˛Ņ‹Ņ…ĐžĐ´Đ¸Ņ‚ иС ŅŅ‚Ņ€ĐžŅ, Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž Đ´Đ¸ŅĐēа Đ˛Ņ‹Đ˛ĐžĐ´Đ¸Ņ‚ŅŅ `FAIL` иĐģи `PREFAIL`, и SnapRAID Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐē҃. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐ°Ņ СаĐŧĐĩĐŊа Đ´Đ¸ŅĐēа ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ. Đ”Ņ€ŅƒĐŗĐ¸Đĩ вОСĐŧĐžĐļĐŊŅ‹Đĩ ŅŅ‚Ņ€ĐžĐēи ŅŅ‚Đ°Ņ‚ŅƒŅĐ°: logfail - В ĐŋŅ€ĐžŅˆĐģĐžĐŧ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ‹ ĐąŅ‹Đģи ĐŊиĐļĐĩ ĐŋĐžŅ€ĐžĐŗĐžĐ˛ĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ. logerr - Đ–ŅƒŅ€ĐŊаĐģ ĐžŅˆĐ¸ĐąĐžĐē ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐēи. selferr - Đ–ŅƒŅ€ĐŊаĐģ ŅĐ°ĐŧĐžŅ‚ĐĩŅŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐēи. Đ•ŅĐģи ҃ĐēаСаĐŊа ĐžĐŋŅ†Đ¸Ņ -v, --verbose, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ йОĐģĐĩĐĩ ĐŗĐģŅƒĐąĐžĐēиК ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Ņ‡ĐĩҁĐēиК аĐŊаĐģиС. Đ­Ņ‚ĐžŅ‚ аĐŊаĐģиС ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŧĐžŅ‡ŅŒ ваĐŧ Ņ€ĐĩŅˆĐ¸Ņ‚ŅŒ, ĐŊ҃ĐļĐŊĐž Đģи ваĐŧ йОĐģҌ҈Đĩ иĐģи ĐŧĐĩĐŊҌ҈Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -a` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. Đ•ŅĐģи Đ˛Đ°ŅˆĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ĐŊĐĩ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēŅƒŅŽ ĐēĐžĐŧаĐŊĐ´Ņƒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ `smartctl` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.3 probe --------- ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ POWER Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. `Standby` ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē ĐŊĐĩ Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ. `Active` ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´Đ¸ŅĐē Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -n standby -i` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. Đ•ŅĐģи Đ˛Đ°ŅˆĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ĐŊĐĩ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēŅƒŅŽ ĐēĐžĐŧаĐŊĐ´Ņƒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ `smartctl` в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.4 up ------ Đ Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ Đ˛ŅĐĩ Đ´Đ¸ŅĐēи ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€Đ°ŅĐēŅ€ŅƒŅ‚Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ Đ´Đ¸ŅĐēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -d, --filter-disk. Đ Đ°ŅĐēŅ€ŅƒŅ‡Đ¸Đ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ОдĐŊĐžĐ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŧĐŊĐžĐŗĐž ŅĐŊĐĩŅ€ĐŗĐ¸Đ¸. ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž Đ˛Đ°Ņˆ ĐąĐģĐžĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐ¸Ņ ĐŧĐžĐļĐĩŅ‚ ŅŅ‚Đž Đ˛Ņ‹Đ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.5 down -------- ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` и ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -s standby,now` ĐŊа Đ˛ŅĐĩŅ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ…. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Ņ‚ĐžĐģҌĐēĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -d, --filter-disk. Đ§Ņ‚ĐžĐąŅ‹ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐžŅˆĐ¸ĐąĐēĐĩ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -s, --spin-down-on-error ҁ ĐģŅŽĐąĐžĐš Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐžĐŧаĐŊдОК, Ņ‡Ņ‚Đž ŅĐēвиваĐģĐĩĐŊŅ‚ĐŊĐž Ņ€ŅƒŅ‡ĐŊĐžĐŧ҃ СаĐŋ҃ҁĐē҃ `down` ĐŋŅ€Đ¸ вОСĐŊиĐēĐŊОвĐĩĐŊии ĐžŅˆĐ¸ĐąĐēи. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.6 diff -------- ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`, Đ´ĐģŅ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ĐŊĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ даĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа, а Ņ‚ĐžĐģҌĐēĐž ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ„Đ°ĐšĐģа, Ņ€Đ°ĐˇĐŧĐĩŅ€ и inode. ĐŸĐžŅĐģĐĩ ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… иСĐŧĐĩĐŊĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ ŅĐ˛ĐžĐ´Đēа иСĐŧĐĩĐŊĐĩĐŊиК, ŅĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐž: equal - ФаКĐģŅ‹, ĐŊĐĩ иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ ĐŋĐž ŅŅ€Đ°Đ˛ĐŊĐĩĐŊĐ¸ŅŽ ҁ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Đŧ ŅĐžŅŅ‚ĐžŅĐŊиĐĩĐŧ. added - ДобавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐŊĐĩ ĐąŅ‹ĐģĐž Ņ€Đ°ĐŊҌ҈Đĩ. removed - ĐŖĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. updated - ФаКĐģŅ‹ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧ Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ иĐģи ĐŧĐĩŅ‚ĐēОК Đ˛Ņ€ĐĩĐŧĐĩĐŊи, Ņ‡Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи ĐąŅ‹Đģи иСĐŧĐĩĐŊĐĩĐŊŅ‹. moved - ФаКĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ в Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐēаĐē иĐŧĐĩŅŽŅ‰Đ¸Đĩ Ņ‚Đž ĐļĐĩ иĐŧŅ, Ņ€Đ°ĐˇĐŧĐĩŅ€, ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи и inode, ĐŊĐž Đ´Ņ€ŅƒĐŗĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ. copied - Ņ„Đ°ĐšĐģŅ‹, ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŊа Ņ‚ĐžŅ‚ ĐļĐĩ иĐģи Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ĐŗĐ´Đĩ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ Đ˛ŅĐĩ Đĩ҉Đĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ŅĐžĐ˛ĐŋадĐĩĐŊĐ¸ŅŽ иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° и ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Đ´Ņ€ĐžĐąĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, а ĐŊĐĩ Ņ‚ĐžĐģҌĐēĐž иĐŧŅ. relocated - Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ ĐŊа Ņ‚ĐžŅ‚ ĐļĐĩ иĐģи Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ĐŗĐ´Đĩ ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģ Đ¸ŅŅ‡ĐĩС. ОĐŊи идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ŅĐžĐ˛ĐŋадĐĩĐŊĐ¸ŅŽ иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° и ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Đ´Ņ€ĐžĐąĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐĩŅ‚Đēи Đ˛Ņ€ĐĩĐŧĐĩĐŊи Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ Ņ„Đ°ĐšĐģОв 'moved' ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ иĐŧĐĩŅŽŅ‚ Đ´Ņ€ŅƒĐŗĐžĐš inode. restored - Ņ„Đ°ĐšĐģŅ‹ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧ inode, ĐŊĐž ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‰Đ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐŧ, иĐŧĐĩĐŊĐĩĐŧ, Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ и ĐŧĐĩŅ‚ĐēОК Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ĐžĐąŅ‹Ņ‡ĐŊĐž ŅŅ‚Đž Ņ„Đ°ĐšĐģŅ‹, Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ‹Đĩ ĐŋĐžŅĐģĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ. Đ•ŅĐģи ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ `sync`, ĐēОд Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚Đ° ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Ņ€Đ°Đ˛ĐĩĐŊ 2, а ĐŊĐĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 0. Код Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚Đ° 1 Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ ĐžĐąŅ‰ĐĩĐŗĐž ҃ҁĐģĐžĐ˛Đ¸Ņ ĐžŅˆĐ¸ĐąĐēи. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.7 sync -------- ОбĐŊОвĐģŅĐĩŅ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ’ŅĐĩ иСĐŧĐĩĐŊĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ в Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ, и ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ОйĐŊОвĐģŅŅŽŅ‚ŅŅ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ, ĐŊаĐļав Ctrl+C, ĐŊĐĩ Ņ‚ĐĩŅ€ŅŅ ҃ĐļĐĩ ĐŋŅ€ĐžĐ´ĐĩĐģаĐŊĐŊОК Ņ€Đ°ĐąĐžŅ‚Ņ‹. ĐŸŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ СаĐŋ҃ҁĐēĐĩ ĐŋŅ€ĐžŅ†Đĩҁҁ `sync` вОСОйĐŊĐžĐ˛Đ¸Ņ‚ŅŅ ҁ Ņ‚ĐžĐŗĐž ĐŧĐĩŅŅ‚Đ°, ĐŗĐ´Đĩ ĐąŅ‹Đģ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊ. Đ•ŅĐģи вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž ĐŋŅƒŅ‚Đ¸ и/иĐģи inode и ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ĐŋĐž Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ и ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ„Đ°ĐšĐģа иĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžŅ‚ĐģĐ¸Ņ‡Đ°ŅŽŅ‚ŅŅ, даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Đ´ĐģŅ Đ˛ŅĐĩĐŗĐž Ņ„Đ°ĐšĐģа. Đ•ŅĐģи Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊ иĐģи ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊ ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Đ´Đ¸ŅĐēĐĩ, ŅĐžŅ…Ņ€Đ°ĐŊŅŅ Ņ‚ĐžŅ‚ ĐļĐĩ inode, ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊ ĐŊа Đ´Ņ€ŅƒĐŗĐžĐš Đ´Đ¸ŅĐē, ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ, ĐŊĐž Ņ€Đ°ĐŊĐĩĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Ņ…ŅŅˆĐ° ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ŅŅ. ФаКĐģŅ‹ `content` и `parity` иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. 5.8 scrub --------- ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŧĐ°ŅŅĐ¸Đ˛, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅ ĐŊа ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ ҁĐēҀҋ҂ҋ҅ ĐžŅˆĐ¸ĐąĐžĐē иĐģи ĐžŅˆĐ¸ĐąĐžĐē ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅ и ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. КаĐļĐ´Ņ‹Đš Đ˛Ņ‹ĐˇĐžĐ˛ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 8% ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ¸ŅĐēĐģŅŽŅ‡Đ°Ņ даĐŊĐŊŅ‹Đĩ, ҃ĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ 10 Đ´ĐŊĐĩĐš. Đ­Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēа Ņ€Đ°Đˇ в ĐŊĐĩĐ´ĐĩĐģŅŽ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚, Ņ‡Ņ‚Đž ĐēаĐļĐ´Ņ‹Đš ĐąĐ¸Ņ‚ даĐŊĐŊҋ҅ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ŅŅ Ņ…ĐžŅ‚Ņ ĐąŅ‹ Ņ€Đ°Đˇ в Ņ‚Ņ€Đ¸ ĐŧĐĩŅŅŅ†Đ°. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš ĐŋĐģаĐŊ иĐģи ĐžĐąŅŠĐĩĐŧ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -p, --plan, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚: bad - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐąĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ. new - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ‡Ņ‚Đž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹. full - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ. 0-100 - ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐąĐģĐžĐēОв. Đ•ŅĐģи Đ˛Ņ‹ ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚Đĩ ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ, Đ˛Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -o, --older-than, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ, ĐŊĐ°ŅĐēĐžĐģҌĐēĐž ŅŅ‚Đ°Ņ€Ņ‹Đŧ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ ĐąĐģĐžĐē. ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ŅĐ°ĐŧŅ‹Đĩ ŅŅ‚Đ°Ņ€Ņ‹Đĩ ĐąĐģĐžĐēи, ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°Ņ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊŅƒŅŽ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃. Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ‡Ņ‚Đž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ `-p new`. Đ§Ņ‚ĐžĐąŅ‹ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐŋĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Đž ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ `status`. ĐŸŅ€Đ¸ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊии ĐģŅŽĐąĐžĐš ҁĐēŅ€Ņ‹Ņ‚ĐžĐš ĐžŅˆĐ¸ĐąĐēи иĐģи ĐžŅˆĐ¸ĐąĐēи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ `content`. Đ­Ņ‚Đ¸ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅŅŽŅ‚ŅŅ в `status` и ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `fix -e`. ĐŸĐžŅĐģĐĩ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŧ scrub ĐžĐŊи ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, и ĐĩҁĐģи ОйĐŊĐ°Ņ€ŅƒĐļĐ°Ņ‚ŅŅ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ‹Đŧи, ĐŋĐģĐžŅ…Đ°Ņ ĐŧĐĩŅ‚Đēа ĐąŅƒĐ´ĐĩŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊа. Đ§Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub -p bad`. Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ СаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ `scrub` Ņ‚ĐžĐģҌĐēĐž ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊиК Ой ĐžŅˆĐ¸ĐąĐēĐ°Ņ…, Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊĐŊҋ҅ ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи даĐŊĐŊŅ‹Đŧи. Đ­Ņ‚Đ¸ ĐžŅˆĐ¸ĐąĐēи Ņ€Đ°ŅĐŋОСĐŊĐ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‰Đ¸ĐĩŅŅ ҁĐēҀҋ҂ҋĐŧи ĐžŅˆĐ¸ĐąĐēаĐŧи, и ĐąĐģĐžĐēи ĐŊĐĩ ĐŋĐžĐŧĐĩŅ‡Đ°ŅŽŅ‚ŅŅ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ, ĐŊĐž Ņ‚Đ°ĐēиĐĩ ĐžŅˆĐ¸ĐąĐēи ŅĐžĐžĐąŅ‰Đ°ŅŽŅ‚ŅŅ в Đ˛Ņ‹Đ˛ĐžĐ´Đĩ ĐēĐžĐŧаĐŊĐ´Ņ‹. ФаКĐģ `content` иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đ´ĐģŅ ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ĐąĐģĐžĐēа и Đ´ĐģŅ ĐŋĐžĐŧĐĩŅ‚Đēи ĐŋĐģĐžŅ…Đ¸Ņ… ĐąĐģĐžĐēОв. ФаКĐģŅ‹ `parity` НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ НЕ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ. 5.9 fix ------- Đ˜ŅĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ’ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ŅŅ€Đ°Đ˛ĐŊĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ҁ ŅĐžŅŅ‚ĐžŅĐŊиĐĩĐŧ ҁĐŊиĐŧĐēа, ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ ĐŋŅ€Đ¸ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ `sync`. Đ•ŅĐģи ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐž Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ¸Đĩ, ĐžĐŊĐž Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ŅŅ Đē ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊĐžĐŧ҃ ҁĐŊиĐŧĐē҃. ВНИМАНИЕ! КоĐŧаĐŊда `fix` ĐŊĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐēи и ĐŋŅ€ĐĩĐ´ĐŊаĐŧĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ. ОĐŊа ĐąĐĩĐˇŅƒŅĐģОвĐŊĐž Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ Ņ„Đ°ĐšĐģа Đē ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧ҃ `sync`. Đ•ŅĐģи ĐŊĐĩ ҃ĐēаСаĐŊа Đ´Ņ€ŅƒĐŗĐ°Ņ ĐžĐŋŅ†Đ¸Ņ, ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸Đ¸ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐŋОдĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ„Đ°ĐšĐģОв иĐģи Đ´Đ¸ŅĐēОв Đ´ĐģŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐąĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ вО Đ˛Ņ€ĐĩĐŧŅ `sync` и `scrub`, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ -e, --filter-error. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ Đ´Ņ€ŅƒĐŗĐ¸Ņ… ĐžĐŋŅ†Đ¸Đš Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, ŅŅ‚Đ° ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐąŅ‹Đģи иСĐŧĐĩĐŊĐĩĐŊŅ‹ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`. SnapRAID ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊĐžĐ˛Ņ‹Đ˛Đ°ĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹, дОйавĐģŅŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ `.unrecoverable`. ПĐĩŅ€ĐĩĐ´ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩĐŧ ҁĐēаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ŅŅ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŊĐ°ĐšŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ ҁ ĐŧĐžĐŧĐĩĐŊŅ‚Đ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ `sync`. Đ­Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŋĐž Đ¸Ņ… ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒŅ Đ¸Ņ… иĐŧŅ и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ, и Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ в ĐŋŅ€ĐžŅ†ĐĩҁҁĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Đģи ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ иС ĐŊĐ¸Ņ… Са ĐŋŅ€ĐĩĐ´ĐĩĐģŅ‹ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸ŅŽ -i, --import, Ņ‡Ņ‚ĐžĐąŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Đ´ĐģŅ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐž ĐŋŅƒŅ‚Đ¸, а ĐŊĐĩ ĐŋĐž inode. ФаКĐģ `content` НЕ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. ФаКĐģŅ‹ `parity` иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. ФаКĐģŅ‹ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ иСĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸. 5.10 check ---------- ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹ и даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ОĐŊ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐēаĐē `fix`, ĐŊĐž Ņ‚ĐžĐģҌĐēĐž иĐŧĐ¸Ņ‚Đ¸Ņ€ŅƒĐĩŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ, и ĐŊиĐēаĐēиĐĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ СаĐŋĐ¸ŅŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ĐŧĐ°ŅŅĐ¸Đ˛. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€ŅƒŅ‡ĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋĐžŅĐģĐĩ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ иĐģи в Đ´Ņ€ŅƒĐŗĐ¸Ņ… ĐžŅĐžĐąŅ‹Ņ… ҃ҁĐģĐžĐ˛Đ¸ŅŅ…. ДĐģŅ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēĐ¸Ņ… и СаĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐžĐē Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ `scrub`. Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ -a, --audit-only, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž даĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа, а даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Đ´ĐģŅ йОĐģĐĩĐĩ ĐąŅ‹ŅŅ‚Ņ€ĐžĐŗĐž Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ. ФаКĐģŅ‹ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐž ĐŋŅƒŅ‚Đ¸, а ĐŊĐĩ ĐŋĐž inode. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.11 list --------- ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸ĐĩŅŅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ ĐŊа ĐŧĐžĐŧĐĩĐŊŅ‚ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`. ĐĄ -v иĐģи --verbose Ņ‚Đ°ĐēĐļĐĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ŅŅ Đ˛Ņ€ĐĩĐŧŅ ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.12 dup -------- ПĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐĩŅŅ Ņ„Đ°ĐšĐģŅ‹. Два Ņ„Đ°ĐšĐģа ŅŅ‡Đ¸Ņ‚Đ°ŅŽŅ‚ŅŅ Ņ€Đ°Đ˛ĐŊŅ‹Đŧи, ĐĩҁĐģи Đ¸Ņ… Ņ…ŅŅˆĐ¸ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚. ДаĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģа ĐŊĐĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ; Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐž Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.13 pool --------- ХОСдаĐĩŅ‚ иĐģи ОйĐŊОвĐģŅĐĩŅ‚ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ в ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ `pooling`. ФаКĐģŅ‹ ĐŊĐĩ ĐēĐžĐŋĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ, а ŅĐ˛ŅĐˇŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēĐ¸Ņ… ҁҁҋĐģĐžĐē. ĐŸŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии Đ˛ŅĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи и ĐŋŅƒŅŅ‚Ņ‹Đĩ ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ ŅƒĐ´Đ°ĐģŅŅŽŅ‚ŅŅ и СаĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŊĐžĐ˛Ņ‹Đŧ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ›ŅŽĐąŅ‹Đĩ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ ĐŊа ĐŧĐĩҁ҂Đĩ. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Са ĐŋŅ€ĐĩĐ´ĐĩĐģаĐŧи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° pool. 5.14 devices ------------ ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đĩ ĐŧĐ°ŅŅĐ¸Đ˛ĐžĐŧ. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ Đ°ŅŅĐžŅ†Đ¸Đ°Ņ†Đ¸Đ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ и в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа ĐēаĐē иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Đ´ĐģŅ ҁĐēŅ€Đ¸ĐŋŅ‚ĐžĐ˛. ПĐĩŅ€Đ˛Ņ‹Đĩ два ŅŅ‚ĐžĐģĐąŅ†Đ° — ŅŅ‚Đž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° и ĐŋŅƒŅ‚ŅŒ. ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ два ŅŅ‚ĐžĐģĐąŅ†Đ° — ŅŅ‚Đž Đ˛Ņ‹ŅĐžĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° и ĐŋŅƒŅ‚ŅŒ. ĐŸĐžŅĐģĐĩĐ´ĐŊиК ŅŅ‚ĐžĐģĐąĐĩ҆ — ŅŅ‚Đž иĐŧŅ Đ´Đ¸ŅĐēа в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. В йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ОдĐŊĐž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩвОĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, ĐŊĐž в ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… йОĐģĐĩĐĩ ҁĐģĐžĐļĐŊҋ҅ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŅ… ҃ Đ˛Đ°Ņ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŊиСĐēĐžŅƒŅ€ĐžĐ˛ĐŊĐĩĐ˛Ņ‹Ņ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧҋ҅ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ. 5.15 touch ---------- ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģҌĐŊŅƒŅŽ ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ Đ´ĐģŅ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐžĐŊа ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа в ĐŊĐžĐģҌ. Đ­Ņ‚Đž ҃ĐģŅƒŅ‡ŅˆĐ°ĐĩŅ‚ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ SnapRAID Ņ€Đ°ŅĐŋОСĐŊĐ°Đ˛Đ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ и ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, Ņ‚Đ°Đē ĐēаĐē Đ´ĐĩĐģаĐĩŅ‚ ĐŧĐĩŅ‚Đē҃ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐŋĐžŅ‡Ņ‚Đ¸ ҃ĐŊиĐēаĐģҌĐŊОК, ҃ĐŧĐĩĐŊŅŒŅˆĐ°Ņ вОСĐŧĐžĐļĐŊŅ‹Đĩ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹. БоĐģĐĩĐĩ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐž, ĐĩҁĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ ĐŊĐĩ Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đš иĐģи ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ĐēаĐē Ņ‚Đ°ĐēОвОК, ĐĩҁĐģи ĐžĐŊ ŅĐžĐ˛ĐŋадаĐĩŅ‚ ĐŋĐž иĐŧĐĩĐŊи, Ņ€Đ°ĐˇĐŧĐĩŅ€Ņƒ и ĐŧĐĩŅ‚ĐēĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи. Đ•ŅĐģи ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž Đ´ĐžĐģи ҁĐĩĐē҃ĐŊĐ´Ņ‹ Ņ€Đ°Đ˛ĐŊа ĐŊ҃ĐģŅŽ, ĐžĐŊ ŅŅ‡Đ¸Ņ‚Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŋиĐĩĐš Ņ‚ĐžĐģҌĐēĐž в Ņ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ, ĐĩҁĐģи ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚ ĐŋĐžĐģĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, Ņ€Đ°ĐˇĐŧĐĩŅ€ и ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи. МĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи ҁ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚ŅŒŅŽ Đ´Đž ҁĐĩĐē҃ĐŊĐ´Ņ‹ ĐŊĐĩ иСĐŧĐĩĐŊŅĐĩŅ‚ŅŅ, ĐŋĐžŅŅ‚ĐžĐŧ҃ Đ˛ŅĐĩ Đ´Đ°Ņ‚Ņ‹ и Đ˛Ņ€ĐĩĐŧŅ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģОв ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹. 5.16 rehash ----------- ПĐģаĐŊĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Đ˛ŅĐĩĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°. Đ­Ņ‚Đ° ĐēĐžĐŧаĐŊда иСĐŧĐĩĐŊŅĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đš Ņ‚Đ¸Đŋ Ņ…ŅŅˆĐ°, ĐžĐąŅ‹Ņ‡ĐŊĐž ĐŋŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии ҁ 32-Ņ€Đ°ĐˇŅ€ŅĐ´ĐŊОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ ĐŊа 64-Ņ€Đ°ĐˇŅ€ŅĐ´ĐŊŅƒŅŽ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ ҁ MurmurHash3 ĐŊа йОĐģĐĩĐĩ ĐąŅ‹ŅŅ‚Ņ€Ņ‹Đš SpookyHash. Đ•ŅĐģи Đ˛Ņ‹ ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊŅ‹Đš Ņ…ŅŅˆ, ŅŅ‚Đ° ĐēĐžĐŧаĐŊда ĐŊĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ Đ´ĐĩĐģаĐĩŅ‚ и иĐŊŅ„ĐžŅ€ĐŧĐ¸Ņ€ŅƒĐĩŅ‚ Đ˛Đ°Ņ, Ņ‡Ņ‚Đž ĐŊиĐēаĐēиĐĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŊĐĩ ҂ҀĐĩĐąŅƒŅŽŅ‚ŅŅ. ПĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ĐŊĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž, а ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐŋĐžŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž вО Đ˛Ņ€ĐĩĐŧŅ `sync` и `scrub`. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `status`. Во Đ˛Ņ€ĐĩĐŧŅ ĐŋĐĩŅ€ĐĩŅ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ SnapRAID ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ ĐŋĐžĐģĐŊŅƒŅŽ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģҌĐŊĐžŅŅ‚ŅŒ, Са ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đŧ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩĐŧ, Ņ‡Ņ‚Đž `dup` ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐĩŅŅ Ņ„Đ°ĐšĐģŅ‹, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‰Đ¸Đĩ Đ´Ņ€ŅƒĐŗĐžĐš Ņ…ŅŅˆ. 5.17 locate ----------- ĐĐ°Ņ…ĐžĐ´Đ¸Ņ‚ Ņ„Đ°ĐšĐģŅ‹, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸ĐĩŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ĐŊаКдĐĩĐŊĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģа Đ˛Ņ‹Đ˛ĐžĐ´Đ¸Ņ‚ŅŅ ĐĩĐŗĐž Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ вĐŊŅƒŅ‚Ņ€Đ¸ Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ и ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž СаĐŊиĐŧаĐĩĐŧҋ҅ иĐŧ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚ĐžĐ˛. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ -t, --tail, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Ņ„Đ°ĐšĐģаĐŧи, СаĐŊиĐŧĐ°ŅŽŅ‰Đ¸Đŧи ҃ĐēаСаĐŊĐŊŅƒŅŽ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ ŅŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ -W, --force-realloc-tail. ИĐŧĐĩĐšŅ‚Đĩ в Đ˛Đ¸Đ´Ņƒ, Ņ‡Ņ‚Đž Ņ‚Đ°ĐēиĐĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊŅ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ. 6 OPTIONS ========= SnapRAID ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸: -c, --conf CONFIG Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ. Đ•ŅĐģи ĐŊĐĩ ҃ĐēаСаĐŊ, в Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ĐĩҁĐģи ĐžĐŊ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚, в ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ `/etc/snapraid.conf`. В Windows Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` в Ņ‚ĐžĐŧ ĐļĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ, Ņ‡Ņ‚Đž и `snapraid.exe`. -f, --filter PATTERN ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `check` и `fix`. ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ҃ĐēаСаĐŊĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ҃. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ Đž ҁĐŋĐĩŅ†Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŅ… ŅˆĐ°ĐąĐģĐžĐŊОв ҁĐŧ. в Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ PATTERN. В Unix ŅƒĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž ŅĐ¸ĐŧвОĐģŅ‹ ĐŗĐģОййиĐŊĐŗĐ° СаĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, ĐĩҁĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ `sync` и `scrub`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. -d, --filter-disk NAME ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `check`, `fix`, `up` и `down`. Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ иĐŧŅ Đ´Đ¸ŅĐēа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸. Đ’Ņ‹ Ņ‚Đ°ĐēĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ Đ´Đ¸ŅĐēи ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ҁ иĐŧĐĩĐŊаĐŧи: `parity`, `2-parity`, `3-parity` и Ņ‚. Đ´., Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đŧ Đ´Đ¸ŅĐēĐžĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ ĐēĐžĐŧйиĐŊĐ¸Ņ€ŅƒĐĩŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš --filter, --filter-disk и --filter-missing, Đ˛Ņ‹ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Đ˛ŅĐĩĐŧ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Đŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check`, `fix`, `up` и `down`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ `sync` и `scrub`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. -m, --filter-missing ФиĐģŅŒŅ‚Ņ€ŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `check` и `fix`. ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ иĐģи ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ°. ĐŸŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ҁ `fix`, ŅŅ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐēаĐē ĐēĐžĐŧаĐŊда `undelete`. Đ•ŅĐģи Đ˛Ņ‹ ĐēĐžĐŧйиĐŊĐ¸Ņ€ŅƒĐĩŅ‚Đĩ ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐžĐŋŅ†Đ¸Đš --filter, --filter-disk и --filter-missing, Đ˛Ņ‹ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Đ˛ŅĐĩĐŧ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Đŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. ЕĐĩ ĐŊĐĩĐģŅŒĐˇŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҁ `sync` и `scrub`, Ņ‚Đ°Đē ĐēаĐē ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ вĐĩҁҌ ĐŧĐ°ŅŅĐ¸Đ˛. -e, --filter-error ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ ҁ ĐžŅˆĐ¸ĐąĐēаĐŧи в `check` и `fix`. ОĐŊ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐąĐģĐžĐēи ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐŋĐžĐŧĐĩ҇ĐĩĐŊŅ‹ ҁĐēҀҋ҂ҋĐŧи ĐžŅˆĐ¸ĐąĐēаĐŧи иĐģи ĐžŅˆĐ¸ĐąĐēаĐŧи ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ° вО Đ˛Ņ€ĐĩĐŧŅ `sync` и `scrub`, ĐēаĐē ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐž в `status`. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. -p, --plan PERC|bad|new|full Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐŋĐģаĐŊ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи (`scrub`). Đ•ŅĐģи PERC — ŅŅ‚Đž Ņ‡Đ¸ŅĐģОвОĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐžŅ‚ 0 Đ´Đž 100, ĐžĐŊĐž иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ¸Ņ€ŅƒĐĩŅ‚ŅŅ ĐēаĐē ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐąĐģĐžĐēОв Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи. ВĐŧĐĩŅŅ‚Đž ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚Đ° Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐģаĐŊ: `bad` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐŋĐģĐžŅ…Đ¸Đĩ ĐąĐģĐžĐēи, `new` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ ĐąĐģĐžĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ ĐąŅ‹Đģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊŅ‹, и `full` ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Đ˛ŅĐĩ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `scrub`. -o, --older-than DAYS Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ŅĐ°ĐŧŅƒŅŽ ŅŅ‚Đ°Ņ€ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ ĐŧĐ°ŅŅĐ¸Đ˛Đ° Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи в `scrub`. DAYS — ŅŅ‚Đž ĐŧиĐŊиĐŧаĐģҌĐŊŅ‹Đš Đ˛ĐžĐˇŅ€Đ°ŅŅ‚ в Đ´ĐŊŅŅ… Đ´ĐģŅ ĐąĐģĐžĐēа, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊ; ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 10. БĐģĐžĐēи, ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đĩ ĐēаĐē ĐŋĐģĐžŅ…Đ¸Đĩ, Đ˛ŅĐĩĐŗĐ´Đ° ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `scrub`. -a, --audit-only В `check`, ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ…ŅŅˆ Ņ„Đ°ĐšĐģОв ĐąĐĩС ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи Đ˛Ņ‹ СаиĐŊŅ‚ĐĩŅ€ĐĩŅĐžĐ˛Đ°ĐŊŅ‹ Ņ‚ĐžĐģҌĐēĐž в ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐĩ даĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģа, ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŧĐžĐļĐĩŅ‚ СĐŊĐ°Ņ‡Đ¸Ņ‚ĐĩĐģҌĐŊĐž ҃ҁĐēĐžŅ€Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check`. -h, --pre-hash В `sync`, СаĐŋ҃ҁĐēаĐĩŅ‚ ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ Ņ„Đ°ĐˇŅƒ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛ŅĐĩŅ… ĐŊĐžĐ˛Ņ‹Ņ… даĐŊĐŊҋ҅ Đ´ĐģŅ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиĐĩĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐžĐąŅ‹Ņ‡ĐŊĐž в `sync` ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ, и ĐŊĐžĐ˛Ņ‹Đĩ даĐŊĐŊŅ‹Đĩ Ņ…ŅŅˆĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиĐĩĐŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐēĐžĐŗĐ´Đ° ĐžĐŊи ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ĐŋĐĩŅ€Đ˛Ņ‹Đš Ņ€Đ°Đˇ. Đ­Ņ‚ĐžŅ‚ ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚, ĐēĐžĐŗĐ´Đ° ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ ĐŋОд Ņ‚ŅĐļĐĩĐģОК ĐŊĐ°ĐŗŅ€ŅƒĐˇĐēОК, ŅĐž Đ˛ŅĐĩĐŧи Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ Đ´Đ¸ŅĐēаĐŧи и СаĐŊŅŅ‚Ņ‹Đŧ ĐŋŅ€ĐžŅ†ĐĩŅŅĐžŅ€ĐžĐŧ. Đ­Ņ‚Đž ŅĐēҁ҂ҀĐĩĐŧаĐģҌĐŊĐžĐĩ ҃ҁĐģОвиĐĩ Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊŅ‹, и ĐĩҁĐģи ҃ ĐŊĐĩĐĩ ĐĩŅŅ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Đ°Ņ аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊĐ°Ņ ĐŋŅ€ĐžĐąĐģĐĩĐŧа, ҁĐēҀҋ҂ҋĐĩ ĐžŅˆĐ¸ĐąĐēи ĐŧĐžĐŗŅƒŅ‚ ĐžŅŅ‚Đ°Ņ‚ŅŒŅŅ ĐŊĐĩСаĐŧĐĩ҇ĐĩĐŊĐŊŅ‹Đŧи, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž даĐŊĐŊŅ‹Đĩ Đĩ҉Đĩ ĐŊĐĩ Ņ…ŅŅˆĐ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹. Đ§Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅŅ‚ĐžĐŗĐž Ņ€Đ¸ŅĐēа, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩĐļиĐŧ `pre-hash`, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛ŅĐĩ даĐŊĐŊŅ‹Đĩ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐģĐ¸ŅŅŒ дваĐļĐ´Ņ‹ Đ´ĐģŅ ОйĐĩҁĐŋĐĩ҇ĐĩĐŊĐ¸Ņ Đ¸Ņ… ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ Ņ‚Đ°ĐēĐļĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹, ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Ņ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžŅˆĐģа ҃ҁĐŋĐĩ҈ĐŊĐž, и, ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸, ĐŋОСвОĐģŅĐĩŅ‚ СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ (`fix`) ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐĩĐŊиĐĩĐŧ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -i, --import DIR ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩŅ‚ иС ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° ĐģŅŽĐąŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đĩ иС ĐŧĐ°ŅŅĐ¸Đ˛Đ° ĐŋĐžŅĐģĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž `sync`. Đ•ŅĐģи ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ Đĩ҉Đĩ ĐĩŅŅ‚ŅŒ Ņ‚Đ°ĐēиĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐžĐŊи ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ `check` и `fix` Đ´ĐģŅ ҃ĐģŅƒŅ‡ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. ФаКĐģŅ‹ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ, вĐēĐģŅŽŅ‡Đ°Ņ ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸, и идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ŅƒŅŽŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ Đ¸Ņ… иĐŧĐĩĐŊи. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `check` и `fix`. -s, --spin-down-on-error ĐŸŅ€Đ¸ ĐģŅŽĐąĐžĐš ĐžŅˆĐ¸ĐąĐēĐĩ ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ Đ˛ŅĐĩŅ… ҃ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧҋ҅ Đ´Đ¸ŅĐēОв ĐŋĐĩŅ€ĐĩĐ´ Đ˛Ņ‹Ņ…ĐžĐ´ĐžĐŧ ҁ ĐŊĐĩĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ ĐēОдОĐŧ ŅĐžŅŅ‚ĐžŅĐŊĐ¸Ņ. Đ­Ņ‚Đž ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‰Đ°ĐĩŅ‚ ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ´Đ¸ŅĐēОв аĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đŧи и Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‰Đ¸ĐŧĐ¸ŅŅ ĐŋĐžŅĐģĐĩ ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊĐŊОК ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸, ĐŋĐžĐŧĐžĐŗĐ°Ņ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŊĐĩĐŊ҃ĐļĐŊĐžĐŗĐž ĐŊĐ°ĐŗŅ€Đĩва и ŅĐŊĐĩŅ€ĐŗĐžĐŋĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊĐ¸Ņ. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžŅŅ‚Đ°ĐŊОвĐē҃ Đ´Đ¸ŅĐēОв, даĐļĐĩ ĐēĐžĐŗĐ´Đ° ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ°ĐĩŅ‚ŅŅ ĐŊĐĩŅƒĐ´Đ°Ņ‡ĐĩĐš. -w, --bw-limit RATE ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ ĐŗĐģОйаĐģҌĐŊĐžĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊОК ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв. RATE — ŅŅ‚Đž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąĐ°ĐšŅ‚ĐžĐ˛ в ҁĐĩĐē҃ĐŊĐ´Ņƒ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģҌ, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ K, M иĐģи G (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, --bw-limit 1G). -t, --tail РАЗМЕР ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ ҁĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģОв Ņ‚ĐĩĐŧи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ ĐŊĐĩ йОĐģĐĩĐĩ ҃ĐēаСаĐŊĐŊĐžĐŗĐž Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Ņ…Đ˛ĐžŅŅ‚Đ° Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. МоĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģи, Ņ‚Đ°ĐēиĐĩ ĐēаĐē K, M, G иĐģи T (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, --tail 1G). Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии вĐŧĐĩҁ҂Đĩ ҁ ĐēĐžĐŧаĐŊдОК `locate`. -A, --stats ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đš вид ŅŅ‚Đ°Ņ‚ŅƒŅĐ°, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ. На ŅĐēŅ€Đ°ĐŊĐĩ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŅ два ĐŗŅ€Đ°Ņ„Đ¸Đēа: ПĐĩŅ€Đ˛Ņ‹Đš ĐŗŅ€Đ°Ņ„Đ¸Đē ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐžĐģĐžŅ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа, а Ņ‚Đ°ĐēĐļĐĩ ĐŋŅƒŅ‚ŅŒ Đē Ņ„Đ°ĐšĐģ҃, Đē ĐēĐžŅ‚ĐžŅ€ĐžĐŧ҃ в даĐŊĐŊŅ‹Đš ĐŧĐžĐŧĐĩĐŊŅ‚ ĐžŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐģŅĐĩŅ‚ŅŅ Đ´ĐžŅŅ‚ŅƒĐŋ ĐŊа ŅŅ‚ĐžĐŧ Đ´Đ¸ŅĐēĐĩ. ĐžĐąŅ‹Ņ‡ĐŊĐž ŅĐ°ĐŧŅ‹Đš ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ иĐŧĐĩŅ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐąŅƒŅ„ĐĩŅ€Đ°, Ņ‡Ņ‚Đž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžŅŅ‚Đ¸ĐļиĐŧŅƒŅŽ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊŅƒŅŽ ҁĐŋĐžŅĐžĐąĐŊĐžŅŅ‚ŅŒ. Đ’Ņ‚ĐžŅ€ĐžĐš ĐŗŅ€Đ°Ņ„Đ¸Đē ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚ Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ĐŋĐžŅ‚Ņ€Đ°Ņ‡ĐĩĐŊĐŊĐžĐŗĐž ĐŊа ĐžĐļидаĐŊиĐĩ Са ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ 100 ҁĐĩĐē҃ĐŊĐ´. ОĐļидаĐĩŅ‚ŅŅ, Ņ‡Ņ‚Đž ŅĐ°ĐŧŅ‹Đš ĐŧĐĩĐ´ĐģĐĩĐŊĐŊŅ‹Đš Đ´Đ¸ŅĐē Đ˛Ņ‹ĐˇĐžĐ˛ĐĩŅ‚ йОĐģŅŒŅˆŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžĐļидаĐŊĐ¸Ņ, в Ņ‚Đž Đ˛Ņ€ĐĩĐŧŅ ĐēаĐē Đ´Ņ€ŅƒĐŗĐ¸Đĩ Đ´Đ¸ŅĐēи Đ´ĐžĐģĐļĐŊŅ‹ иĐŧĐĩŅ‚ŅŒ ĐŧаĐģĐž иĐģи ŅĐžĐ˛ŅĐĩĐŧ ĐŊĐĩ иĐŧĐĩŅ‚ŅŒ Đ˛Ņ€ĐĩĐŧĐĩĐŊи ĐžĐļидаĐŊĐ¸Ņ, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž ĐžĐŊи ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ˛ĐžĐ¸ ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ĐŋĐžĐģĐžŅŅ‹. Đ­Ņ‚ĐžŅ‚ ĐŗŅ€Đ°Ņ„Đ¸Đē Ņ‚Đ°ĐēĐļĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Đ˛Ņ€ĐĩĐŧŅ, ĐŋĐžŅ‚Ņ€Đ°Ņ‡ĐĩĐŊĐŊĐžĐĩ ĐŊа ĐžĐļидаĐŊиĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиК Ņ…ŅŅˆĐ° и Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊиК RAID. Đ’ŅĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅŽŅ‚ŅŅ ĐŋĐ°Ņ€Đ°ĐģĐģĐĩĐģҌĐŊĐž ҁ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Đŧи ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅĐŧи. ĐĄĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐž, ĐŋĐžĐēа ĐĩŅŅ‚ŅŒ иСĐŧĐĩŅ€Đ¸ĐŧĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐžĐļидаĐŊĐ¸Ņ Đ´ĐģŅ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ŅŅ‚Đž ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŊа Ņ‚Đž, Ņ‡Ņ‚Đž ĐĻП Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž ĐąŅ‹ŅŅ‚Ņ€, Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒŅŅ ҁ Ņ€Đ°ĐąĐžŅ‡ĐĩĐš ĐŊĐ°ĐŗŅ€ŅƒĐˇĐēОК. -Z, --force-zero Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģа ҁ ĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ Ņ€Đ°ĐˇĐŧĐĩŅ€ĐžĐŧ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ€Đ°ĐŊĐĩĐĩ ĐąŅ‹Đģ ĐŊĐĩĐŊ҃ĐģĐĩĐ˛Ņ‹Đŧ. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚ Ņ‚Đ°ĐēĐžĐĩ ҃ҁĐģОвиĐĩ, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐģĐĩĐŗĐēĐž ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° ĐŋĐžŅĐģĐĩ ŅĐąĐžŅ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ĐąŅ‹Đģи ҃ҁĐĩ҇ĐĩĐŊŅ‹. Đ­Ņ‚Đž вОСĐŧĐžĐļĐŊĐžĐĩ ҃ҁĐģОвиĐĩ в Linux ҁ Ņ„Đ°ĐšĐģĐžĐ˛Ņ‹Đŧи ŅĐ¸ŅŅ‚ĐĩĐŧаĐŧи ext3/ext4. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -E, --force-empty Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ Đ´Đ¸ŅĐēа, ĐŊа ĐēĐžŅ‚ĐžŅ€ĐžĐŧ ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Đ˛ŅĐĩ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚, Ņ‡Ņ‚Đž Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, иСĐŊĐ°Ņ‡Đ°ĐģҌĐŊĐž ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐŊа Đ´Đ¸ŅĐēĐĩ, ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ иĐģи ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°ĐŊŅ‹, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐģĐĩĐŗĐēĐž ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Ņ„Đ°ĐšĐģĐžĐ˛Đ°Ņ ŅĐ¸ŅŅ‚ĐĩĐŧа даĐŊĐŊҋ҅ ĐŊĐĩ ҁĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊа. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -U, --force-uuid Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸, ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи и Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ҁ Đ´Đ¸ŅĐēаĐŧи, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… иСĐŧĐĩĐŊиĐģŅŅ UUID. Đ•ŅĐģи SnapRAID ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚, Ņ‡Ņ‚Đž ҃ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… Đ´Đ¸ŅĐēОв иСĐŧĐĩĐŊиĐģŅŅ UUID, ĐžĐŊ ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‰Đ°ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŊĐĩ ҃ĐēаĐļĐĩŅ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ОйĐŊĐ°Ņ€ŅƒĐļĐ¸Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Đ˛Đ°ŅˆĐ¸ Đ´Đ¸ŅĐēи ҁĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹ в ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊҋ҅ Ņ‚ĐžŅ‡ĐēĐ°Ņ… ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. ОдĐŊаĐēĐž Đ´ĐžĐŋ҃ҁĐēаĐĩŅ‚ŅŅ ОдĐŊĐžĐēŅ€Đ°Ņ‚ĐŊĐžĐĩ иСĐŧĐĩĐŊĐĩĐŊиĐĩ UUID ҁ ОдиĐŊĐžŅ‡ĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ, и йОĐģҌ҈Đĩ ҁ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛ĐĩĐŊĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒŅŽ, ĐŋĐžŅ‚ĐžĐŧ҃ Ņ‡Ņ‚Đž ŅŅ‚Đž ĐŊĐžŅ€ĐŧаĐģҌĐŊŅ‹Đš ҁĐģŅƒŅ‡Đ°Đš ĐŋŅ€Đ¸ СаĐŧĐĩĐŊĐĩ Đ´Đ¸ŅĐēОв ĐŋĐžŅĐģĐĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`, `check` иĐģи `fix`. -D, --force-device Đ¤ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŊĐĩĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ Đ¸ŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ҁ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи Đ´Đ¸ŅĐēаĐŧи иĐģи ҁ Đ´Đ¸ŅĐēаĐŧи ĐŊа Ņ‚ĐžĐŧ ĐļĐĩ Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐžĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐģи два Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ и ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ СаĐŋĐ°ŅĐŊОК Đ´Đ¸ŅĐē Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž ĐŋĐĩŅ€Đ˛ĐžĐŗĐž, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛Ņ‚ĐžŅ€ĐžĐš ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đš Đ´Đ¸ŅĐē. ИĐģи, ĐĩҁĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ´Đ¸ŅĐē в ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐĩ ĐŧĐĩŅŅ‚Đž, ĐžŅŅ‚Đ°Đ˛ŅˆĐĩĐĩŅŅ ĐŊа ҃ĐļĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŧ Đ´Đ¸ŅĐēĐĩ, ŅĐžĐ˛ĐŧĐĩҁ҂ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‰ĐĩĐŧ Ņ‚Đž ĐļĐĩ Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐžĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `fix`. -N, --force-nocopy В `sync`, `check` и `fix`, ĐžŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ŅĐ˛Ņ€Đ¸ŅŅ‚Đ¸Đē҃ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐ¸Ņ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ. БĐĩС ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸ SnapRAID ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ‚, Ņ‡Ņ‚Đž Ņ„Đ°ĐšĐģŅ‹ ҁ ОдиĐŊаĐēĐžĐ˛Ņ‹Đŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ĐēаĐē иĐŧŅ, Ņ€Đ°ĐˇĐŧĐĩŅ€ и ĐŧĐĩŅ‚Đēа Đ˛Ņ€ĐĩĐŧĐĩĐŊи, ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ĐēĐžĐŋĐ¸ŅĐŧи ҁ ОдиĐŊаĐēĐžĐ˛Ņ‹Đŧи даĐŊĐŊŅ‹Đŧи. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ иĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ҁ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŊа Đ´Ņ€ŅƒĐŗĐžĐš и ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ҃ĐļĐĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Ņ…ŅŅˆĐ° Đ´ĐģŅ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐ¸Ņ ҁĐēҀҋ҂ҋ҅ ĐžŅˆĐ¸ĐąĐžĐē иĐģи Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… Ņ„Đ°ĐšĐģОв. В ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… Ņ€ĐĩĐ´ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… ŅŅ‚Đž ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ĐģĐžĐļĐŊŅ‹Đŧ ŅŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐŊĐ¸ŅĐŧ иĐģи СаĐŧĐĩĐ´ĐģĐĩĐŊĐ¸ŅŽ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° иС-Са йОĐģŅŒŅˆĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐžĐē Ņ…ŅŅˆĐ°, и ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋОСвОĐģŅĐĩŅ‚ Ņ€ĐĩŅˆĐ¸Ņ‚ŅŒ Ņ‚Đ°ĐēиĐĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`, `check` и `fix`. -F, --force-full В `sync`, Ņ„ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐžĐģĐŊŅ‹Đš ĐŋĐĩŅ€Đĩҁ҇ĐĩŅ‚ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ, ĐēĐžĐŗĐ´Đ° Đ˛Ņ‹ дОйавĐģŅĐĩŅ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ иĐģи ĐĩҁĐģи Đ˛Ņ‹ вĐĩŅ€ĐŊ҃ĐģĐ¸ŅŅŒ Đē ŅŅ‚Đ°Ņ€ĐžĐŧ҃ Ņ„Đ°ĐšĐģ҃ content, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ йОĐģĐĩĐĩ ŅĐ˛ĐĩĐļиĐĩ даĐŊĐŊŅ‹Đĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ВĐŧĐĩŅŅ‚Đž Ņ‚ĐžĐŗĐž Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ‚ŅŒ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ҁ ĐŊ҃ĐģŅ, ŅŅ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ…ŅŅˆĐ¸, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ content, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅ и ĐŋОддĐĩŅ€ĐļаĐŊĐ¸Ņ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ даĐŊĐŊҋ҅ вО Đ˛Ņ€ĐĩĐŧŅ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° `sync` ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… даĐŊĐŊҋ҅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. -R, --force-realloc В `sync`, Ņ„ĐžŅ€ŅĐ¸Ņ€ŅƒĐĩŅ‚ ĐŋĐžĐģĐŊĐžĐĩ ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ Ņ„Đ°ĐšĐģОв и ĐŋĐĩŅ€ĐĩŅŅ‚Ņ€ĐžĐĩĐŊиĐĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ ĐŋĐžĐģĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸, ĐŋŅ€Đ¸ ŅŅ‚ĐžĐŧ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ Ņ…ŅŅˆĐ¸, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Ņ„Đ°ĐšĐģĐĩ content, Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи даĐŊĐŊҋ҅. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ҁ `sync`. ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ ĐĩĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ. ĐŖ Đ˛Đ°Ņ НЕĐĸ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹ даĐŊĐŊҋ҅ вО Đ˛Ņ€ĐĩĐŧŅ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ `sync`. -W, --force-realloc-tail РАЗМЕР Đ Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐēаĐē -R, --force-realloc, ĐŊĐž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ҃ĐēаСаĐŊĐŊОК Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐš Ņ‡Đ°ŅŅ‚ŅŒŅŽ (ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ РАЗМЕР ĐąĐ°ĐšŅ‚) ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐŸŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ (ĐŋĐĩŅ€ĐĩĐŧĐĩŅ‰Đ°ĐĩŅ‚) ĐģŅŽĐąŅ‹Đĩ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊ҂ҋ/ĐąĐģĐžĐēи Ņ„Đ°ĐšĐģОв, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸ĐĩŅŅ в даĐŊĐŊŅ‹Đš ĐŧĐžĐŧĐĩĐŊŅ‚ в ŅŅ‚ĐžĐš Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐš Ņ‡Đ°ŅŅ‚Đ¸, ĐŋОСвОĐģŅŅ Ņ€Đ°ĐˇĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐģŅŽĐąĐžĐŧ ĐŧĐĩҁ҂Đĩ Ņ„Đ°ĐšĐģа(Ов) ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ĐŗĐ´Đĩ ĐĩŅŅ‚ŅŒ ŅĐ˛ĐžĐąĐžĐ´ĐŊĐžĐĩ ĐŧĐĩŅŅ‚Đž (вĐēĐģŅŽŅ‡Đ°Ņ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐŋŅƒŅŅ‚ĐžŅ‚Ņ‹). ĐžŅĐŊОвĐŊĐ°Ņ ҆ĐĩĐģҌ ŅŅ‚ĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° — ҃ĐŧĐĩĐŊŅŒŅˆĐ¸Ņ‚ŅŒ СаĐŊиĐŧаĐĩĐŧŅ‹Đš ĐŊа Đ´Đ¸ŅĐēĐĩ Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ„Đ°ĐšĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ•ŅĐģи ĐŋĐĩŅ€ĐĩŅ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ Đ˛ŅŅŽ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ŅƒŅŽ Ņ‡Đ°ŅŅ‚ŅŒ (в ĐŊĐĩĐš ĐŊĐĩ ĐžŅŅ‚Đ°ĐŊĐĩŅ‚ŅŅ ĐąĐģĐžĐēОв), Ņ„Đ°ĐšĐģ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐąŅƒĐ´ĐĩŅ‚ ĐžĐąŅ€ĐĩСаĐŊ, Đ˛Ņ‹ŅĐ˛ĐžĐąĐžĐļĐ´Đ°Ņ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐĩ Ņ…Đ˛ĐžŅŅ‚ĐžĐ˛ĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž. МоĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐŊĐžĐļĐ¸Ņ‚ĐĩĐģи, Ņ‚Đ°ĐēиĐĩ ĐēаĐē K, M, G иĐģи T (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, --force-realloc-tail 1G). Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ locate -t, --tail, Ņ‡Ņ‚ĐžĐąŅ‹ ĐˇĐ°Ņ€Đ°ĐŊĐĩĐĩ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹. ВНИМАНИЕ! Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐĩĐŗĐž ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ. Во Đ˛Ņ€ĐĩĐŧŅ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ `sync` ĐˇĐ°Ņ‰Đ¸Ņ‚Đ° даĐŊĐŊҋ҅ Đ´ĐģŅ ĐˇĐ°Ņ‚Ņ€ĐžĐŊŅƒŅ‚Ņ‹Ņ… Ņ„Đ°ĐšĐģОв ОĐĸĐĄĐŖĐĸĐĄĐĸĐ’ĐŖĐ•Đĸ. -l, --log FILE ЗаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ ĐŋĐžĐ´Ņ€ĐžĐąĐŊŅ‹Đš ĐļŅƒŅ€ĐŊаĐģ в ҃ĐēаСаĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ. Đ•ŅĐģи ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ ҃ĐēаСаĐŊа, ĐŊĐĩĐŋŅ€ĐĩдвидĐĩĐŊĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ ĐŊа ŅĐēŅ€Đ°ĐŊ, Ņ‡Ņ‚Đž ĐŋĐžŅ‚ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ҇ҀĐĩСĐŧĐĩŅ€ĐŊĐžĐŧ҃ Đ˛Ņ‹Đ˛ĐžĐ´Ņƒ в ҁĐģŅƒŅ‡Đ°Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đ° ĐžŅˆĐ¸ĐąĐžĐē. ĐšĐžĐŗĐ´Đ° ҃ĐēаСаĐŊа -l, --log, ĐŊа ŅĐēŅ€Đ°ĐŊ Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°Ņ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŋŅ€Đ¸Đ˛ĐžĐ´ŅŅ‚ Đē ĐžŅŅ‚Đ°ĐŊОвĐēĐĩ SnapRAID. Đ•ŅĐģи ĐŋŅƒŅ‚ŅŒ ĐŊĐ°Ņ‡Đ¸ĐŊаĐĩŅ‚ŅŅ ҁ `>>`, Ņ„Đ°ĐšĐģ ĐžŅ‚ĐēŅ€Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ в Ņ€ĐĩĐļиĐŧĐĩ дОйавĐģĐĩĐŊĐ¸Ņ. Đ’Ņ…ĐžĐļĐ´ĐĩĐŊĐ¸Ņ `%D` и `%T` в иĐŧĐĩĐŊи СаĐŧĐĩĐŊŅŅŽŅ‚ŅŅ Đ´Đ°Ņ‚ĐžĐš и Đ˛Ņ€ĐĩĐŧĐĩĐŊĐĩĐŧ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ ГГГГММДД и ЧЧММСС. В ĐŋаĐēĐĩŅ‚ĐŊҋ҅ Ņ„Đ°ĐšĐģĐ°Ņ… Windows Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐ´Đ˛ĐžĐ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģ `%`, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, result-%%D.log. Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `>>`, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ СаĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ иĐŧŅ в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, `">>result.log"`. ДĐģŅ Đ˛Ņ‹Đ˛ĐžĐ´Đ° ĐļŅƒŅ€ĐŊаĐģа ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš Đ˛Ņ‹Đ˛ĐžĐ´ иĐģи ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅƒŅŽ ĐžŅˆĐ¸ĐąĐē҃, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `">&1"` и `">&2"` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊĐž. ОĐŋĐ¸ŅĐ°ĐŊиĐĩ Ņ‚ĐĩĐŗĐžĐ˛ ĐļŅƒŅ€ĐŊаĐģа ҁĐŧ. в Ņ„Đ°ĐšĐģĐĩ snapraid_log.txt иĐģи man-ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ. -L, --error-limit NUMBER ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŊĐžĐ˛Ņ‹Đš ĐģиĐŧĐ¸Ņ‚ ĐžŅˆĐ¸ĐąĐžĐē Đ´Đž ĐžŅŅ‚Đ°ĐŊОвĐēи Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ SnapRAID ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ŅŅ, ĐĩҁĐģи ОйĐŊĐ°Ņ€ŅƒĐļиваĐĩŅ‚ йОĐģĐĩĐĩ 100 ĐžŅˆĐ¸ĐąĐžĐē ввОда/Đ˛Ņ‹Đ˛ĐžĐ´Đ°, Ņ‡Ņ‚Đž ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ĐŊа вĐĩŅ€ĐžŅŅ‚ĐŊŅ‹Đš ŅĐąĐžĐš Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ вĐģĐ¸ŅĐĩŅ‚ ĐŊа `sync` и `scrub`, ĐēĐžŅ‚ĐžŅ€Ņ‹Đŧ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ°Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Ņƒ ĐŋĐžŅĐģĐĩ ĐŋĐĩŅ€Đ˛ĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Đ° Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Ņ… ĐžŅˆĐ¸ĐąĐžĐē, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐŋŅ‹Ņ‚Đ°Ņ‚ŅŒŅŅ СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒ ŅĐ˛ĐžĐ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸. ОдĐŊаĐēĐž `check` и `fix` Đ˛ŅĐĩĐŗĐ´Đ° ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐŋŅ€Đ¸ ĐŋĐĩŅ€Đ˛ĐžĐš ĐžŅˆĐ¸ĐąĐēĐĩ. -S, --start BLKSTART ĐĐ°Ņ‡Đ¸ĐŊаĐĩŅ‚ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đē҃ ҁ ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐŊĐžĐŧĐĩŅ€Đ° ĐąĐģĐžĐēа. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊОК ĐŋĐžĐŋҋ҂Đēи ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ иĐģи Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đĩ ĐąĐģĐžĐēи в ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. -B, --count BLKCOUNT ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ҃ĐēаСаĐŊĐŊĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐąĐģĐžĐēОв. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ. -C, --gen-conf CONTENT ГĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩŅ‚ Ņ„Đ¸ĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ иС ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐŗĐž Ņ„Đ°ĐšĐģа content. ФаКĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ СаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš Đ˛Ņ‹Đ˛ĐžĐ´ и ĐŊĐĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đš. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Ņ‚Đ°ĐēĐļĐĩ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅƒŅŽ Đ´ĐģŅ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžŅ‡ĐĩĐē ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēОв в ҁĐģŅƒŅ‡Đ°Đĩ, ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ Đ˛ŅŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. -v, --verbose ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ йОĐģҌ҈Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ•ŅĐģи ҃ĐēаСаĐŊа ОдиĐŊ Ņ€Đ°Đˇ, ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ и Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅƒŅŽ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đē҃. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа Ņ„Đ°ĐšĐģŅ‹ ĐļŅƒŅ€ĐŊаĐģа. -q, --quiet ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐŧĐĩĐŊҌ҈Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ•ŅĐģи ҃ĐēаСаĐŊа ОдиĐŊ Ņ€Đ°Đˇ, ŅƒĐ´Đ°ĐģŅĐĩŅ‚ иĐŊдиĐēĐ°Ņ‚ĐžŅ€ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ; дваĐļĐ´Ņ‹, Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸; Ņ‚Ņ€Đ¸ĐļĐ´Ņ‹, иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊŅ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ; ҇Đĩ҂ҋҀĐĩĐļĐ´Ņ‹, ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ Đž ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ. Đ¤Đ°Ņ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐžŅˆĐ¸ĐąĐēи Đ˛ŅĐĩĐŗĐ´Đ° Đ˛Ņ‹Đ˛ĐžĐ´ŅŅ‚ŅŅ ĐŊа ŅĐēŅ€Đ°ĐŊ. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа Ņ„Đ°ĐšĐģŅ‹ ĐļŅƒŅ€ĐŊаĐģа. -H, --help ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ ĐēŅ€Đ°Ņ‚ĐēиК ŅĐēŅ€Đ°ĐŊ ҁĐŋŅ€Đ°Đ˛Đēи. -V, --version ПĐĩŅ‡Đ°Ņ‚Đ°ĐĩŅ‚ вĐĩŅ€ŅĐ¸ŅŽ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹. 7 CONFIGURATION =============== SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Ņ‡Ņ‚ĐžĐąŅ‹ СĐŊĐ°Ņ‚ŅŒ, ĐŗĐ´Đĩ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ Đ˛Đ°Ņˆ Đ´Đ¸ŅĐēĐžĐ˛Ņ‹Đš ĐŧĐ°ŅŅĐ¸Đ˛ и ĐŗĐ´Đĩ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. В Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ĐĩҁĐģи ĐžĐŊ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚, в ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ `/etc/snapraid.conf`. В Windows Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` в Ņ‚ĐžĐŧ ĐļĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ, Ņ‡Ņ‚Đž и `snapraid.exe`. ОĐŊ Đ´ĐžĐģĐļĐĩĐŊ ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ŅŒ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐŋŅ†Đ¸Đ¸ (Ņ‡ŅƒĐ˛ŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Đē Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Ņƒ): 7.1 parity FILE [,FILE] ... --------------------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ЧĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņƒ ĐžŅ‚ ОдĐŊĐžĐŗĐž ŅĐąĐžŅ Đ´Đ¸ŅĐēа, ĐŋОдОйĐŊĐž RAID5. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐąŅ‹Ņ‚ŅŒ ĐŊа Ņ€Đ°ĐˇĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. ĐšĐžĐŗĐ´Đ° Ņ„Đ°ĐšĐģ йОĐģҌ҈Đĩ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ Ņ€Đ°ŅŅ‚Đ¸, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đš. ĐžĐąŅ‰ĐĩĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŋĐž ĐēŅ€Đ°ĐšĐŊĐĩĐš ĐŧĐĩŅ€Đĩ Ņ‚Đ°ĐēиĐŧ ĐļĐĩ йОĐģŅŒŅˆĐ¸Đŧ, ĐēаĐē ŅĐ°ĐŧŅ‹Đš йОĐģŅŒŅˆĐžĐš Đ´Đ¸ŅĐē даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋОСĐļĐĩ, ĐŊĐž Đ˛Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€Đĩ҃ĐŋĐžŅ€ŅĐ´ĐžŅ‡Đ¸Ņ‚ŅŒ иĐģи ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸Ņ…. ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ Đ´Đ¸ŅĐēОв ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи ĐŊĐĩ ŅŅ‚Đ°ĐŊŅƒŅ‚ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи, ҃ĐģŅƒŅ‡ŅˆĐ°Ņ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ. В Windows 256 МБ ĐžŅŅ‚Đ°ĐĩŅ‚ŅŅ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŋŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊĐ¸Ņ Đž ĐŋĐžĐģĐŊҋ҅ Đ´Đ¸ŅĐēĐ°Ņ…. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊОК и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Ņ€Đ°Đˇ. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž ҃ĐēаСаĐŊĐŊĐžĐŗĐž ŅƒŅ€ĐžĐ˛ĐŊŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ ОдиĐŊ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹: * 2-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ двОКĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ RAID6. * 3-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚Ņ€ĐžĐšĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. * 4-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ҇ĐĩŅ‚Đ˛ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. * 5-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐŋŅŅ‚ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. * 6-parity вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ҈Đĩҁ҂ĐĩŅ€ĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ. КаĐļĐ´Ņ‹Đš ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŊаĐģĐ¸Ņ‡Đ¸Ņ Đ˛ŅĐĩŅ… ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Ņ… ŅƒŅ€ĐžĐ˛ĐŊĐĩĐš ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ Ņ‚Đĩ ĐļĐĩ ŅĐžĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ, Ņ‡Ņ‚Đž и Đ´ĐģŅ ĐžĐŋŅ†Đ¸Đ¸ `parity`. Đ­Ņ‚Đ¸ ĐžĐŋŅ†Đ¸Đ¸ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ĐŊĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊŅ‹Đŧи и ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Ņ‚ĐžĐģҌĐēĐž ОдиĐŊ Ņ€Đ°Đˇ. 7.3 z-parity FILE [,FILE] ... ----------------------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ и Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ‚Ņ€ĐžĐšĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐžĐš `3-parity`, в ĐžŅĐŊОвĐŊĐžĐŧ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊОК Đ´ĐģŅ ҁĐģĐ°ĐąŅ‹Ņ… ĐŋŅ€ĐžŅ†ĐĩŅŅĐžŅ€ĐžĐ˛, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ARM иĐģи AMD Phenom, Athlon и Opteron, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ ĐŊĐ°ĐąĐžŅ€ иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đš SSSE3. В Ņ‚Đ°ĐēĐ¸Ņ… ҁĐģŅƒŅ‡Đ°ŅŅ… ĐžĐŊа ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ ĐģŅƒŅ‡ŅˆŅƒŅŽ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ. Đ­Ņ‚ĐžŅ‚ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋĐžŅ…ĐžĐļ ĐŊа Ņ‚ĐžŅ‚, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ZFS RAIDZ3, ĐŊĐž ĐąŅ‹ŅŅ‚Ņ€ĐĩĐĩ. КаĐē и ZFS, ĐžĐŊ ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ Са ĐŋŅ€ĐĩĐ´ĐĩĐģаĐŧи Ņ‚Ņ€ĐžĐšĐŊОК ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐŸŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии `3-parity` Đ˛Ņ‹ ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊŅ‹, ĐĩҁĐģи Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ `z-parity` Đ´ĐģŅ ĐŋĐžĐ˛Ņ‹ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸. ВозĐŧĐžĐļĐŊĐž ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиĐĩ иС ОдĐŊĐžĐŗĐž Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ° в Đ´Ņ€ŅƒĐŗĐžĐš ĐŋŅƒŅ‚ĐĩĐŧ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи Ņ„Đ°ĐšĐģа ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ҁ ĐļĐĩĐģаĐĩĐŧŅ‹Đŧ Ņ„Đ°ĐšĐģĐžĐŧ z-parity иĐģи 3-parity и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ `fix` Đ´ĐģŅ ĐĩĐŗĐž Đ˛ĐžŅŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ. 7.4 content FILE ---------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ„Đ°ĐšĐģ Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ҁĐŋĐ¸ŅĐēа и ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊҋ҅ ҁ҃ĐŧĐŧ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. ОĐŊ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Ņ€Đ°ĐˇĐŧĐĩ҉ĐĩĐŊ ĐŊа Đ´Đ¸ŅĐēĐĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŧ Đ´ĐģŅ даĐŊĐŊҋ҅, ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, иĐģи ĐģŅŽĐąĐžĐŧ Đ´Ņ€ŅƒĐŗĐžĐŧ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŧ Đ´Đ¸ŅĐēĐĩ. Đ•ŅĐģи Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Đ´Đ¸ŅĐē даĐŊĐŊҋ҅, ŅŅ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ иС ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° `sync`. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊОК и ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ Đ´ĐģŅ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩҁĐēĐžĐģҌĐēĐ¸Ņ… ĐēĐžĐŋиК ОдĐŊĐžĐŗĐž и Ņ‚ĐžĐŗĐž ĐļĐĩ Ņ„Đ°ĐšĐģа. Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐēаĐē ĐŧиĐŊиĐŧ҃Đŧ ОдĐŊ҃ ĐēĐžĐŋĐ¸ŅŽ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐžĐŗĐž Đ´Đ¸ŅĐēа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŋĐģŅŽŅ ОдĐŊ҃. Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐēĐžĐŋиК ĐŊĐĩ ĐŋĐžĐ˛Ņ€ĐĩĐ´Đ¸Ņ‚. 7.5 data NAME DIR ----------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ иĐŧŅ и Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēОв даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. NAME Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´Đ¸ŅĐēа и Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ҃ĐŊиĐēаĐģҌĐŊŅ‹Đŧ. DIR — ŅŅ‚Đž Ņ‚ĐžŅ‡Đēа ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´Đ¸ŅĐēа в Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ иСĐŧĐĩĐŊŅŅ‚ŅŒ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ĐŋĐž ĐŧĐĩŅ€Đĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸, ĐŋĐžĐēа Đ˛Ņ‹ ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚Đĩ NAME Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ. Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ОдĐŊ҃ ĐžĐŋŅ†Đ¸ŅŽ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ¸ŅĐē ĐŋОСĐļĐĩ, иСĐŧĐĩĐŊив NAME ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, а ĐˇĐ°Ņ‚ĐĩĐŧ СаĐŋŅƒŅŅ‚Đ¸Đ˛ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. В ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐĩŅ€ĐĩиĐŧĐĩĐŊОваĐŊĐ¸Ņ, Đ°ŅŅĐžŅ†Đ¸Đ°Ņ†Đ¸Ņ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊĐžĐŗĐž UUID Đ´Đ¸ŅĐēОв. 7.6 extra NAME DIR ------------------ ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ иĐŧŅ и Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ Đ´Đ¸ŅĐēОв Đ´ĐģŅ ĐŧĐžĐŊĐ¸Ņ‚ĐžŅ€Đ¸ĐŊĐŗĐ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´ `smart` и `probe`. Đ­Ņ‚Đž ĐŋĐžĐģĐĩСĐŊĐž Đ´ĐģŅ ĐŧĐžĐŊĐ¸Ņ‚ĐžŅ€Đ¸ĐŊĐŗĐ° Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ Ņ‡Đ°ŅŅ‚ŅŒŅŽ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, ĐŊĐž ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹ Đ´ĐģŅ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžŅ‡ĐŊŅ‹Đš Đ´Đ¸ŅĐē. ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ вĐŊиĐŧаĐŊиĐĩ, Ņ‡Ņ‚Đž Ņ‚Đ°ĐēиĐĩ Đ´Đ¸ŅĐēи ĐŊĐĩ ĐˇĐ°Ņ‚Ņ€Đ°ĐŗĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `up` и `down`, Ņ‚Đ°Đē ĐēаĐē ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩŅ‚ŅŅ, Ņ‡Ņ‚Đž ĐžĐŊи Đ˛ŅĐĩĐŗĐ´Đ° Đ˛Ņ€Đ°Ņ‰Đ°ŅŽŅ‚ŅŅ. 7.7 nohidden ------------ Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Đ˛ŅĐĩ ҁĐēҀҋ҂ҋĐĩ Ņ„Đ°ĐšĐģŅ‹ и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸. В Unix ҁĐēҀҋ҂ҋĐĩ Ņ„Đ°ĐšĐģŅ‹ — ŅŅ‚Đž Ņ‚Đĩ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŅ ҁ `.`. В Windows — ŅŅ‚Đž Ņ‚Đĩ, ҃ ĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐĩŅŅ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Ņ‹Đš Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚. 7.8 exclude/include PATTERN --------------------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ Ņ„Đ°ĐšĐģОв иĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ Đ´ĐģŅ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ иĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ в ĐŋŅ€ĐžŅ†Đĩҁҁ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ’ŅĐĩ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в ҃ĐēаСаĐŊĐŊĐžĐŧ ĐŋĐžŅ€ŅĐ´ĐēĐĩ. Đ•ŅĐģи ĐŋĐĩŅ€Đ˛Ņ‹Đš ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‰Đ¸Đš ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž `exclude`, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи ŅŅ‚Đž `include`, Ņ„Đ°ĐšĐģ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ. Đ•ŅĐģи ĐŊи ОдиĐŊ ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐĩ ŅĐžĐ˛ĐŋадаĐĩŅ‚, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ, ĐĩҁĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ҃ĐēаСаĐŊĐŊŅ‹Đš ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž `include`, иĐģи вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ, ĐĩҁĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ — ŅŅ‚Đž `exclude`. ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ Đž ҁĐŋĐĩŅ†Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŅ… ŅˆĐ°ĐąĐģĐžĐŊОв ҁĐŧ. в Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩ PATTERN. Đ­Ņ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēĐž Ņ€Đ°Đˇ. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐąĐ°ĐˇĐžĐ˛Ņ‹Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа в ĐēĐ¸ĐąĐ¸ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ОдиĐŊ ĐēĐ¸ĐąĐ¸ĐąĐ°ĐšŅ‚ — ŅŅ‚Đž 1024 ĐąĐ°ĐšŅ‚Đ°. РаСĐŧĐĩŅ€ ĐąĐģĐžĐēа ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 256, Ņ‡Ņ‚Đž Đ´ĐžĐģĐļĐŊĐž Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ в йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв. ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ иСĐŧĐĩĐŊŅŅ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ. Đ§Ņ‚ĐžĐąŅ‹ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ в ĐąŅƒĐ´ŅƒŅ‰ĐĩĐŧ, ваĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Đ˛ŅŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа — ĐĩҁĐģи ҃ Đ˛Đ°Ņ ĐŧĐŊĐžĐŗĐž ĐŧаĐģĐĩĐŊҌĐēĐ¸Ņ… Ņ„Đ°ĐšĐģОв, ĐŋĐžŅ€ŅĐ´Đēа ĐŧиĐģĐģиОĐŊОв. ДĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа, даĐļĐĩ ĐĩҁĐģи Đ˛ŅĐĩĐŗĐž ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐąĐ°ĐšŅ‚ĐžĐ˛, Đ˛Ņ‹Đ´ĐĩĐģŅĐĩŅ‚ŅŅ ҆ĐĩĐģŅ‹Đš ĐąĐģĐžĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и ĐŋŅ€Đ¸ йОĐģŅŒŅˆĐžĐŧ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ„Đ°ĐšĐģОв ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē СĐŊĐ°Ņ‡Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đŧ ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đŧ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°Đŧ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ СаĐŋĐžĐģĐŊĐ¸Ņ‚Đĩ Đ´Đ¸ŅĐē ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, ваĐŧ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž дОйавĐģŅŅ‚ŅŒ йОĐģҌ҈Đĩ Ņ„Đ°ĐšĐģОв ĐŊа Đ´Đ¸ŅĐēи даĐŊĐŊҋ҅. ОдĐŊаĐēĐž ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐ°Ņ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ ĐŊĐĩ ĐŊаĐēаĐŋĐģиваĐĩŅ‚ŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅. ĐŸĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž, вОСĐŊиĐēĐ°ŅŽŅ‰ĐĩĐĩ иС-Са йОĐģŅŒŅˆĐžĐŗĐž Ņ‡Đ¸ŅĐģа Ņ„Đ°ĐšĐģОв ĐŊа Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅, ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐžĐąŅŠĐĩĐŧ даĐŊĐŊҋ҅ ĐŊа ŅŅ‚ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅, а ĐŊĐĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ…. В ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐŋŅ€Đ¸ĐąĐģиĐļĐĩĐŊĐ¸Ņ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļĐ¸Ņ‚ŅŒ, Ņ‡Ņ‚Đž ĐŋĐžĐģОвиĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐąĐģĐžĐēа Ņ‚ĐĩŅ€ŅĐĩŅ‚ŅŅ Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Ņ„Đ°ĐšĐģа. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€Đ¸ 100 000 Ņ„Đ°ĐšĐģОв и Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ ĐąĐģĐžĐēа 256 КиБ Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ 12,8 ГБ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, Ņ‡Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ҃ĐŧĐĩĐŊҌ҈ĐĩĐŊĐ¸ŅŽ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° ĐŊа Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐŊа 12,8 ГБ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ `status`. Đ­Ņ‚Đž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ŅĐ˛ĐžĐąĐžĐ´ĐŊŅ‹Đŧ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐŊҋ҅ иĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ Ņ„Đ°ĐšĐģОв, ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛. Đ•ŅĐģи ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐžŅ‚Ņ€Đ¸Ņ†Đ°Ņ‚ĐĩĐģҌĐŊĐžĐĩ, ŅŅ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ˛Ņ‹ ĐąĐģиСĐēи Đē СаĐŋĐžĐģĐŊĐĩĐŊĐ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸, и ĐžĐŊĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ‹ Đ˛ŅĐĩ Đĩ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅ‚ĐĩŅ€ŅŅ‚ŅŒ. Đ§Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ŅŅ‚ĐžĐš ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ йОĐģŅŒŅˆĐ¸Đš Ņ€Đ°ĐˇĐ´ĐĩĐģ Đ´ĐģŅ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи Ņ€Đ°ĐˇĐ´ĐĩĐģ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ ĐŊа 12,8 ГБ йОĐģҌ҈Đĩ, ҇ĐĩĐŧ Đ´Đ¸ŅĐēи даĐŊĐŊҋ҅, ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ° Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи Đ´Đž 100 000 Ņ„Đ°ĐšĐģОв ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐąĐĩС ĐēаĐēĐ¸Ņ…-ĐģийО ĐŋĐžŅ‚ĐĩŅ€ŅŒ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°. ĐĨĐ¸Ņ‚Ņ€ĐžŅŅ‚ŅŒ Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ йОĐģҌ҈ĐĩĐŗĐž Ņ€Đ°ĐˇĐ´ĐĩĐģа ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ в Linux — ĐžŅ‚Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž ĐēĐžĐŧаĐŊдОК: mkfs.ext4 -m 0 -T largefile4 DEVICE Đ­Ņ‚Đž ĐŋŅ€Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ Đē ĐŋŅ€Đ¸ĐŧĐĩŅ€ĐŊĐž 1,5% Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°, ĐŋŅ€Đ¸ĐąĐģĐ¸ĐˇĐ¸Ņ‚ĐĩĐģҌĐŊĐž 60 ГБ Đ´ĐģŅ Đ´Đ¸ŅĐēа 4 ĐĸБ, Ņ‡Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ ĐžĐēĐžĐģĐž 460 000 Ņ„Đ°ĐšĐģОв ĐŊа ĐēаĐļĐ´ĐžĐŧ Đ´Đ¸ŅĐēĐĩ даĐŊĐŊҋ҅ ĐąĐĩС ĐēаĐēĐ¸Ņ…-ĐģийО ĐŋĐžŅ‚ĐĩŅ€ŅŒ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°. 7.10 hashsize SIZE_IN_BYTES --------------------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊҋ҅ ĐąĐģĐžĐēОв. РаСĐŧĐĩŅ€ Ņ…ŅŅˆĐ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 16 ĐąĐ°ĐšŅ‚ (128 ĐąĐ¸Ņ‚), Ņ‡Ņ‚Đž Đ´ĐžĐģĐļĐŊĐž Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ в йОĐģŅŒŅˆĐ¸ĐŊŅŅ‚Đ˛Đĩ ҁĐģŅƒŅ‡Đ°Đĩв. ВНИМАНИЕ! Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ŅĐēҁĐŋĐĩŅ€Ņ‚ĐžĐ˛, и ĐŊĐ°ŅŅ‚ĐžŅŅ‚ĐĩĐģҌĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ иСĐŧĐĩĐŊŅŅ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ. Đ§Ņ‚ĐžĐąŅ‹ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ в ĐąŅƒĐ´ŅƒŅ‰ĐĩĐŧ, ваĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ˛ĐžŅŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Đ˛ŅŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° — ĐĩҁĐģи Đ˛Đ°ŅˆĐ° ŅĐ¸ŅŅ‚ĐĩĐŧа иĐŧĐĩĐĩŅ‚ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊŅƒŅŽ ĐŋаĐŧŅŅ‚ŅŒ. КаĐē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, SnapRAID ĐžĐąŅ‹Ņ‡ĐŊĐž ҂ҀĐĩĐąŅƒĐĩŅ‚ 1 ГиБ ĐžĐ—ĐŖ ĐŊа ĐēаĐļĐ´Ņ‹Đĩ 16 ĐĸБ даĐŊĐŊҋ҅ в ĐŧĐ°ŅŅĐ¸Đ˛Đĩ. В Ņ‡Đ°ŅŅ‚ĐŊĐžŅŅ‚Đ¸, Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ…ŅŅˆĐĩĐš даĐŊĐŊҋ҅ SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ ĐŋŅ€Đ¸ĐąĐģĐ¸ĐˇĐ¸Ņ‚ĐĩĐģҌĐŊĐž TS*(1+HS)/BS ĐąĐ°ĐšŅ‚ ĐžĐ—ĐŖ, ĐŗĐ´Đĩ TS — ŅŅ‚Đž ĐžĐąŅ‰Đ¸Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ˛Đ°ŅˆĐĩĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ°, BS — Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа в ĐąĐ°ĐšŅ‚Đ°Ņ…, и HS — Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° в ĐąĐ°ĐšŅ‚Đ°Ņ…. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŋŅ€Đ¸ 8 Đ´Đ¸ŅĐēĐ°Ņ… ĐŋĐž 4 ĐĸБ, Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ ĐąĐģĐžĐēа 256 КиБ (1 КиБ = 1024 ĐąĐ°ĐšŅ‚Đ°) и Ņ€Đ°ĐˇĐŧĐĩŅ€Đĩ Ņ…ŅŅˆĐ° 16, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° 8, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа 512, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐēаĐē ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ…ŅŅˆĐ° 8, Ņ‚Đ°Đē и ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐąĐģĐžĐēа 512, Đ˛Ņ‹ ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚Đĩ: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩŅ‚ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ĐŋŅ€Đ¸ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ иĐģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐĩ ĐŋĐžŅĐģĐĩ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° ГБ. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋĐžĐģĐĩСĐŊа, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐēа Đ´ĐģĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐēĐžĐŧаĐŊĐ´ `sync` ҁ ĐŊ҃ĐģŅ, ĐĩҁĐģи ĐžĐŊи ĐąŅ‹Đģи ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊŅ‹ ŅĐąĐžĐĩĐŧ ĐŧĐ°ŅˆĐ¸ĐŊŅ‹ иĐģи ĐģŅŽĐąŅ‹Đŧ Đ´Ņ€ŅƒĐŗĐ¸Đŧ ŅĐžĐąŅ‹Ņ‚Đ¸ĐĩĐŧ. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅƒŅŽ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа в ĐĻĐĩĐģŅŒŅĐ¸ŅŅ…. Đ•ŅĐģи ҃ĐēаСаĐŊĐž, SnapRAID ĐŋĐĩŅ€Đ¸ĐžĐ´Đ¸Ņ‡ĐĩҁĐēи ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ° smartctl. ĐĸĐĩĐēŅƒŅ‰Đ¸Đĩ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ Đ´Đ¸ŅĐēОв ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŅ вО Đ˛Ņ€ĐĩĐŧŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹ SnapRAID. Đ•ŅĐģи ĐēаĐēОК-ĐģийО Đ´Đ¸ŅĐē ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ĐĩŅ‚ ŅŅ‚ĐžŅ‚ ĐģиĐŧĐ¸Ņ‚, Đ˛ŅĐĩ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŅ, и Đ´Đ¸ŅĐēи ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŽŅ‚ Đ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩ (ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŅ‚ в Ņ€ĐĩĐļиĐŧ ĐžĐļидаĐŊĐ¸Ņ) ĐŊа Đ˛Ņ€ĐĩĐŧŅ, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ ĐžĐŋŅ†Đ¸ĐĩĐš `temp_sleep`. ĐŸĐžŅĐģĐĩ ĐŋĐĩŅ€Đ¸ĐžĐ´Đ° ĐžĐļидаĐŊĐ¸Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ вОСОйĐŊОвĐģŅŅŽŅ‚ŅŅ, ĐŋĐžŅ‚ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐž ҁĐŊОва ĐŋŅ€Đ¸ĐžŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°ŅŅŅŒ, ĐĩҁĐģи ĐģиĐŧĐ¸Ņ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ Đ´ĐžŅŅ‚Đ¸ĐŗĐ°ĐĩŅ‚ŅŅ Đĩ҉Đĩ Ņ€Đ°Đˇ. Во Đ˛Ņ€ĐĩĐŧŅ Ņ€Đ°ĐąĐžŅ‚Ņ‹ SnapRAID Ņ‚Đ°ĐēĐļĐĩ аĐŊаĐģĐ¸ĐˇĐ¸Ņ€ŅƒĐĩŅ‚ ĐēŅ€Đ¸Đ˛ŅƒŅŽ ĐŊĐ°ĐŗŅ€Đĩва ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа и ĐžŅ†ĐĩĐŊиваĐĩŅ‚ Đ´ĐžĐģĐŗĐžŅŅ€ĐžŅ‡ĐŊŅƒŅŽ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆŅƒŅŽŅŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ, ĐēĐžŅ‚ĐžŅ€ŅƒŅŽ ĐžĐŊи, ĐēаĐē ĐžĐļидаĐĩŅ‚ŅŅ, Đ´ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚, ĐĩҁĐģи аĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŅ. ĐžŅ†ĐĩĐŊĐēа Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž ĐŋĐžŅĐģĐĩ Ņ‚ĐžĐŗĐž, ĐēаĐē Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ´Đ¸ŅĐēа ŅƒĐ˛ĐĩĐģĐ¸Ņ‡Đ¸ĐģĐ°ŅŅŒ ҇Đĩ҂ҋҀĐĩ Ņ€Đ°ĐˇĐ°, Ņ‡Ņ‚Đž ĐŗĐ°Ņ€Đ°ĐŊŅ‚Đ¸Ņ€ŅƒĐĩŅ‚ ĐŊаĐģĐ¸Ņ‡Đ¸Đĩ Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐžĐŗĐž ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đ° даĐŊĐŊҋ҅ Đ´ĐģŅ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ĐŊадĐĩĐļĐŊОК Ņ‚ĐĩĐŊĐ´ĐĩĐŊŅ†Đ¸Đ¸. Đ­Ņ‚Đ° ĐŋŅ€ĐžĐŗĐŊĐžĐˇĐ¸Ņ€ŅƒĐĩĐŧĐ°Ņ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ°ŅŅŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ в ҁĐēОйĐēĐ°Ņ… Ņ€ŅĐ´ĐžĐŧ ҁ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đŧ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩĐŧ и ĐŋĐžĐŧĐžĐŗĐ°ĐĩŅ‚ ĐžŅ†ĐĩĐŊĐ¸Ņ‚ŅŒ, Đ´ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž Đģи ĐžŅ…ĐģаĐļĐ´ĐĩĐŊиĐĩ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. Đ­Ņ‚Đ° ĐžŅ†ĐĩĐŊĐžŅ‡ĐŊĐ°Ņ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° ĐŋŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊа Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ и ĐŊĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ SnapRAID. ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ ĐžŅĐŊĐžĐ˛Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ Đ¸ŅĐēĐģŅŽŅ‡Đ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŊа Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐĩҁĐēĐ¸Ņ… иСĐŧĐĩŅ€ĐĩĐŊĐŊҋ҅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ°Ņ… Đ´Đ¸ŅĐēОв. ДĐģŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ŅŅ‚ĐžĐŗĐž аĐŊаĐģиСа SnapRAID ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ŅŅ‚Đ°ĐģĐžĐŊ Đ´ĐģŅ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐžĐŊ ĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ ĐĩĐŗĐž иС Đ´ĐžŅŅ‚ŅƒĐŋĐŊҋ҅ аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊҋ҅ Đ´Đ°Ņ‚Ņ‡Đ¸ĐēОв. Đ•ŅĐģи ĐŊи ОдиĐŊ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš Đ´Đ°Ņ‚Ņ‡Đ¸Đē ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ, ĐžĐŊ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ŅĐ°ĐŧŅƒŅŽ ĐŊиСĐēŅƒŅŽ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа, иСĐŧĐĩŅ€ĐĩĐŊĐŊŅƒŅŽ в ĐŊĐ°Ņ‡Đ°ĐģĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ŅŅ‚Đ°ĐģĐžĐŊа. ĐžĐąŅ‹Ņ‡ĐŊĐž SnapRAID ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ŅĐ°ĐŧĐžĐŗĐž ĐŗĐžŅ€ŅŅ‡ĐĩĐŗĐž Đ´Đ¸ŅĐēа. Đ§Ņ‚ĐžĐąŅ‹ ĐžŅ‚ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚ŅŒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēОв, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ -A иĐģи --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ Đ˛Ņ€ĐĩĐŧŅ ĐžĐļидаĐŊĐ¸Ņ, в ĐŧиĐŊŅƒŅ‚Đ°Ņ…, ĐēĐžĐŗĐ´Đ° Đ´ĐžŅŅ‚Đ¸ĐŗĐ°ĐĩŅ‚ŅŅ ĐŋŅ€ĐĩĐ´ĐĩĐģ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹. В Ņ‚Đĩ҇ĐĩĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ĐŋĐĩŅ€Đ¸ĐžĐ´Đ° Đ´Đ¸ŅĐēи ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ‹Đŧи. По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ — 5 ĐŧиĐŊŅƒŅ‚. 7.14 pool DIR ------------- ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐ¸Ņ (pooling), ĐŗĐ´Đĩ ŅĐžĐˇĐ´Đ°ĐĩŅ‚ŅŅ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊиĐĩ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ° ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐēĐžĐŧаĐŊĐ´Ņ‹ `pool`. ĐšĐ°Ņ‚Đ°ĐģĐžĐŗ Đ´ĐžĐģĐļĐĩĐŊ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ. 7.15 share UNC_DIR ------------------ ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŋŅƒŅ‚ŅŒ UNC Windows, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹Đš Đ´ĐģŅ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ´Đ¸ŅĐēаĐŧ. Đ•ŅĐģи ҃ĐēаСаĐŊа ŅŅ‚Đ° ĐžĐŋŅ†Đ¸Ņ, ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи, ŅĐžĐˇĐ´Đ°ĐŊĐŊŅ‹Đĩ в ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ pool, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ ŅŅ‚ĐžŅ‚ ĐŋŅƒŅ‚ŅŒ UNC Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ´Đ¸ŅĐēаĐŧ. БĐĩС ŅŅ‚ĐžĐš ĐžĐŋŅ†Đ¸Đ¸ ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐģĐžĐēаĐģҌĐŊŅ‹Đĩ ĐŋŅƒŅ‚Đ¸, Ņ‡Ņ‚Đž ĐŊĐĩ ĐŋОСвОĐģŅĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅŅ‚ŅŒ ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool ĐŋĐž ҁĐĩŅ‚Đ¸. ХиĐŧвОĐģĐ¸Ņ‡ĐĩҁĐēиĐĩ ҁҁҋĐģĐēи Ņ„ĐžŅ€ĐŧĐ¸Ņ€ŅƒŅŽŅ‚ŅŅ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ҃ĐēаСаĐŊĐŊĐžĐŗĐž ĐŋŅƒŅ‚Đ¸ UNC, дОйавĐģĐĩĐŊиĐĩĐŧ иĐŧĐĩĐŊи Đ´Đ¸ŅĐēа, ĐēаĐē ҃ĐēаСаĐŊĐž в ĐžĐŋŅ†Đ¸Đ¸ `data`, и, ĐŊаĐēĐžĐŊĐĩ҆, дОйавĐģĐĩĐŊиĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ° и иĐŧĐĩĐŊи Ņ„Đ°ĐšĐģа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ ОĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиĐĩ ĐžĐŋŅ†Đ¸Đ¸ smartctl Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ĐžĐ˛ SMART Đ´ĐģŅ ĐēаĐļĐ´ĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩŅ€ĐžĐ˛ RAID и ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… USB-Đ´Đ¸ŅĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊŅ‹ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи. ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌ %s СаĐŧĐĩĐŊŅĐĩŅ‚ŅŅ иĐŧĐĩĐŊĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°, ĐŊĐž ĐžĐŊ ĐŊĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģĐĩĐŊ Đ´ĐģŅ Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩҀҋ RAID. DISK — ŅŅ‚Đž Ņ‚Đž ĐļĐĩ иĐŧŅ Đ´Đ¸ŅĐēа, ҃ĐēаСаĐŊĐŊĐžĐĩ в ĐžĐŋŅ†Đ¸Đ¸ `data`. PARITY — ŅŅ‚Đž ОдĐŊĐž иС иĐŧĐĩĐŊ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` иĐģи `z-parity`. В ҃ĐēаСаĐŊĐŊҋ҅ OPTIONS ŅŅ‚Ņ€ĐžĐēа `%s` СаĐŧĐĩĐŊŅĐĩŅ‚ŅŅ иĐŧĐĩĐŊĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°. ДĐģŅ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐģĐĩŅ€ĐžĐ˛ RAID ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž, вĐĩŅ€ĐžŅŅ‚ĐŊĐž, Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž, и ваĐŧ ĐŧĐžĐļĐĩŅ‚ ĐŊĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ `%s`. ВозĐŧĐžĐļĐŊŅ‹Đĩ ĐžĐŋŅ†Đ¸Đ¸ ҁĐŧ. в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ smartmontools: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices НаĐŋŅ€Đ¸ĐŧĐĩŅ€: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒĐĩŅ‚ ҃ĐēаСаĐŊĐŊŅ‹Đš Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ SMART ĐŋŅ€Đ¸ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊии вĐĩŅ€ĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ ŅĐąĐžŅ Đ´Đ¸ŅĐēа. Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋĐžĐģĐĩСĐŊа, ĐĩҁĐģи Đ´Đ¸ŅĐē ŅĐžĐžĐąŅ‰Đ°ĐĩŅ‚ ĐŊĐĩĐžĐąŅ‹Ņ‡ĐŊŅ‹Đĩ иĐģи Đ˛Đ˛ĐžĐ´ŅŅ‰Đ¸Đĩ в СайĐģ҃ĐļĐ´ĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ Đ´ĐģŅ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°. DISK — ŅŅ‚Đž Ņ‚Đž ĐļĐĩ иĐŧŅ Đ´Đ¸ŅĐēа, ҃ĐēаСаĐŊĐŊĐžĐĩ в ĐžĐŋŅ†Đ¸Đ¸ `data`. PARITY — ŅŅ‚Đž ОдĐŊĐž иС иĐŧĐĩĐŊ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` иĐģи `z-parity`. ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ * ĐŧĐžĐļĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ° ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ…. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, Ņ‡Ņ‚ĐžĐąŅ‹ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ `Current Pending Sector Count` ĐŊа Đ˛ŅĐĩŅ… Đ´Đ¸ŅĐēĐ°Ņ…: smartignore * 197 Đ§Ņ‚ĐžĐąŅ‹ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐĩĐŗĐž Ņ‚ĐžĐģҌĐēĐž ĐŊа ĐŋĐĩŅ€Đ˛ĐžĐŧ Đ´Đ¸ŅĐēĐĩ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸: smartignore parity 197 7.18 Examples ------------- ĐŸŅ€Đ¸ĐŧĐĩŅ€ Ņ‚Đ¸ĐŋĐ¸Ņ‡ĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Unix: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 ĐŸŅ€Đ¸ĐŧĐĩŅ€ Ņ‚Đ¸ĐŋĐ¸Ņ‡ĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ Windows: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= ШайĐģĐžĐŊŅ‹ ОйĐĩҁĐŋĐĩŅ‡Đ¸Đ˛Đ°ŅŽŅ‚ ĐŗĐ¸ĐąĐēиК ҁĐŋĐžŅĐžĐą Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģОв Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ иĐģи Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅĐ¸ĐŧвОĐģŅ‹ ĐŋĐžĐ´ŅŅ‚Đ°ĐŊОвĐēи (globbing), Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸Đģа, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊŅ‹Đŧ иĐŧĐĩĐŊаĐŧ Ņ„Đ°ĐšĐģОв иĐģи ҆ĐĩĐģŅ‹Đŧ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ°Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ ĐąĐĩС Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐ¸Ņ ĐēаĐļĐ´ĐžĐŗĐž ĐŋŅƒŅ‚Đ¸. ВоĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē `?` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐŧ҃ ОдиĐŊĐžŅ‡ĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃, ĐēŅ€ĐžĐŧĐĩ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. Đ­Ņ‚Đž Đ´ĐĩĐģаĐĩŅ‚ ĐĩĐŗĐž ĐŋĐžĐģĐĩСĐŊŅ‹Đŧ Đ´ĐģŅ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ иĐŧĐĩĐŊ Ņ„Đ°ĐšĐģОв ҁ ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đŧи ŅĐ¸ĐŧвОĐģаĐŧи, ĐŋŅ€Đ¸ ŅŅ‚ĐžĐŧ ŅˆĐ°ĐąĐģĐžĐŊ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ОдĐŊиĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°. ОдиĐŊĐžŅ‡ĐŊĐ°Ņ СвĐĩĐˇĐ´ĐžŅ‡Đēа `*` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸ ŅĐ¸ĐŧвОĐģОв, ĐŊĐž, ĐēаĐē и вОĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē, ĐžĐŊа ĐŊиĐēĐžĐŗĐ´Đ° ĐŊĐĩ ĐŋĐĩŅ€ĐĩҁĐĩĐēаĐĩŅ‚ ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ОĐŊа ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ŅŅ ĐŊа ĐŋŅ€ŅĐŧОК ĐēĐžŅĐžĐš ҇ĐĩҀ҂Đĩ, Ņ‡Ņ‚Đž Đ´ĐĩĐģаĐĩŅ‚ ĐĩĐĩ ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰ĐĩĐš Đ´ĐģŅ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ вĐŊŅƒŅ‚Ņ€Đ¸ ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ĐŋŅƒŅ‚Đ¸. Đ­Ņ‚Đž ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐĩ ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ ĐŋĐžĐ´ŅŅ‚Đ°ĐŊĐžĐ˛ĐžŅ‡ĐŊҋ҅ СĐŊаĐēОв, СĐŊаĐēĐžĐŧĐžĐĩ ĐŋĐž ОйОĐģĐžŅ‡ĐēĐĩ (shell). ДвойĐŊĐ°Ņ СвĐĩĐˇĐ´ĐžŅ‡Đēа `**` йОĐģĐĩĐĩ ĐŧĐžŅ‰ĐŊĐ°Ņ, ĐžĐŊа ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚Đ¸ ŅĐ¸ĐŧвОĐģОв, вĐēĐģŅŽŅ‡Đ°Ņ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. Đ­Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊаĐŧ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐĩҁĐēĐžĐģҌĐēиĐŧ ŅƒŅ€ĐžĐ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ĐšĐžĐŗĐ´Đ° `**` ĐŋĐžŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž в ŅˆĐ°ĐąĐģĐžĐŊĐĩ, ĐžĐŊа ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊ҃ĐģŅŽ иĐģи йОĐģĐĩĐĩ ŅĐ¸ĐŧвОĐģаĐŧ, вĐēĐģŅŽŅ‡Đ°Ņ ĐēĐžŅŅ‹Đĩ ҇ĐĩҀ҂ҋ ĐŧĐĩĐļĐ´Ņƒ ĐžĐēŅ€ŅƒĐļĐ°ŅŽŅ‰Đ¸Đŧ ĐąŅƒĐēваĐģҌĐŊŅ‹Đŧ Ņ‚ĐĩĐēŅŅ‚ĐžĐŧ. НаибоĐģĐĩĐĩ ваĐļĐŊŅ‹Đŧ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ `**` ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊĐ°Ņ Ņ„ĐžŅ€Đŧа `/**/`. ОĐŊа ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐŊ҃ĐģŅŽ иĐģи йОĐģĐĩĐĩ ĐŋĐžĐģĐŊŅ‹Đŧ ŅƒŅ€ĐžĐ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, Ņ‡Ņ‚Đž ĐŋОСвОĐģŅĐĩŅ‚ ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģŅŅ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ ĐŊа ĐģŅŽĐąĐžĐš ĐŗĐģŅƒĐąĐ¸ĐŊĐĩ в Đ´ĐĩŅ€ĐĩвĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, ĐŊĐĩ СĐŊĐ°Ņ Ņ‚ĐžŅ‡ĐŊОК ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Ņ‹ ĐŋŅƒŅ‚Đ¸. НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ŅˆĐ°ĐąĐģĐžĐŊ `src/**/main.js` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ `src/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ĐŊĐžĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛), `src/ui/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ОдĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°) и `src/ui/components/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē Đ´Đ˛ŅƒŅ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛). КĐģĐ°ŅŅŅ‹ ŅĐ¸ĐŧвОĐģОв ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊҋ҅ ҁĐēОйОĐē `[]` ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃ иС СадаĐŊĐŊĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Đ° иĐģи диаĐŋаСОĐŊа. КаĐē и Đ´Ņ€ŅƒĐŗĐ¸Đĩ ОдĐŊĐžŅĐ¸ĐŧвОĐģҌĐŊŅ‹Đĩ ŅˆĐ°ĐąĐģĐžĐŊŅ‹, ĐžĐŊи ĐŊĐĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. КĐģĐ°ŅŅŅ‹ ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ диаĐŋаСОĐŊŅ‹ и ĐžŅ‚Ņ€Đ¸Ņ†Đ°ĐŊиĐĩ ҁ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ Đ˛ĐžŅĐēĐģĐ¸Ņ†Đ°Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž СĐŊаĐēа. Đ¤ŅƒĐŊдаĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊĐžĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡Đ¸Đĩ, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ ҁĐģĐĩĐ´ŅƒĐĩŅ‚ ĐŋĐžĐŧĐŊĐ¸Ņ‚ŅŒ, СаĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ в Ņ‚ĐžĐŧ, Ņ‡Ņ‚Đž `*`, `?` и ĐēĐģĐ°ŅŅŅ‹ ŅĐ¸ĐŧвОĐģОв ŅĐžĐąĐģŅŽĐ´Đ°ŅŽŅ‚ ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛ и ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž вĐŊŅƒŅ‚Ņ€Đ¸ ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ĐŋŅƒŅ‚Đ¸, в Ņ‚Đž Đ˛Ņ€ĐĩĐŧŅ ĐēаĐē `**` — ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đš ŅˆĐ°ĐąĐģĐžĐŊ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŧĐžĐļĐĩŅ‚ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐžĐ˛Đ°Ņ‚ŅŒ ҇ĐĩŅ€ĐĩС Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛. ĐĄŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚ ҇Đĩ҂ҋҀĐĩ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊҋ҅ Ņ‚Đ¸Đŋа ŅˆĐ°ĐąĐģĐžĐŊОв: FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ FILE. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐŊĐž ĐŊĐĩ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ. DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąŅƒŅŽ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅŽ ҁ иĐŧĐĩĐŊĐĩĐŧ DIR и Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŊĐĩĐĩ. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ, ĐŊĐž ĐŊĐĩ Đē Ņ„Đ°ĐšĐģаĐŧ. /PATH/FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ Đē Ņ„Đ°ĐšĐģ҃. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Ņ„Đ°ĐšĐģаĐŧ, ĐŊĐž ĐŊĐĩ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ. /PATH/DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸Đ¸ и Đ˛ŅĐĩ, Ņ‡Ņ‚Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŊĐĩĐĩ. Đ­Ņ‚ĐžŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Ņ‚ĐžĐģҌĐēĐž Đē Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅĐŧ, ĐŊĐž ĐŊĐĩ Đē Ņ„Đ°ĐšĐģаĐŧ. ĐšĐžĐŗĐ´Đ° Đ˛Ņ‹ ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚Đĩ Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊŅ‹Đš ĐŋŅƒŅ‚ŅŒ, ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‰Đ¸ĐšŅŅ ҁ /, ĐžĐŊ ĐŋŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đē ĐēĐžŅ€ĐŊĐĩвОĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŧĐ°ŅŅĐ¸Đ˛Đ°, а ĐŊĐĩ Đē ĐēĐžŅ€ĐŊĐĩвОĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐģĐžĐēаĐģҌĐŊОК Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹. В Windows Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅ€Đ°Ņ‚ĐŊŅƒŅŽ ĐēĐžŅŅƒŅŽ ҇ĐĩŅ€Ņ‚Ņƒ \ вĐŧĐĩŅŅ‚Đž ĐŋŅ€ŅĐŧОК /. ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows, Ņ‚ĐžŅ‡Đēи ŅĐžĐĩдиĐŊĐĩĐŊĐ¸Ņ, Ņ‚ĐžŅ‡Đēи ĐŧĐžĐŊŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ и Đ´Ņ€ŅƒĐŗĐ¸Đĩ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows Ņ€Đ°ŅŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°ŅŽŅ‚ŅŅ ĐēаĐē Ņ„Đ°ĐšĐģŅ‹, Ņ‡Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ´ĐģŅ Đ¸Ņ… Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ„Đ°ĐšĐģа, а ĐŊĐĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ°. Đ•ŅĐģи иĐŧŅ Ņ„Đ°ĐšĐģа ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ŅĐ¸ĐŧвОĐģŅ‹ `*`, `?`, `[`, иĐģи `]`, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ¸Ņ…, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ Đ¸Ņ… иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Đ¸Đ¸ ĐēаĐē ŅĐ¸ĐŧвОĐģОв ĐŗĐģОййиĐŊĐŗĐ°. В Unix ŅĐ¸ĐŧвОĐģĐžĐŧ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ `\`; в Windows — `^`. ĐšĐžĐŗĐ´Đ° ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ в ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐ´Đ˛ĐžĐ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģ ŅĐēŅ€Đ°ĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐĩĐŗĐž иĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Đ¸Đ¸ ĐēĐžĐŧаĐŊĐ´ĐŊОК ОйОĐģĐžŅ‡ĐēОК. В Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊŅ‹Đĩ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸Đ¸ Đ´ĐģŅ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ Ņ„Đ°ĐšĐģОв Đ´ĐģŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēи. ХаĐŧŅ‹Đš ĐŋŅ€ĐžŅŅ‚ĐžĐš ĐŋĐžĐ´Ņ…ĐžĐ´ — Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` Đ´ĐģŅ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Đ˛ŅĐĩŅ… Ņ„Đ°ĐšĐģОв и ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐ˛, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ ĐŊĐĩ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` exclude *.unrecoverable # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐēĐžŅ€ĐŊĐĩвОК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `/lost+found` exclude /lost+found/ # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ `tmp` exclude tmp/ ĐŸŅ€ĐžŅ‚Đ¸Đ˛ĐžĐŋĐžĐģĐžĐļĐŊŅ‹Đš ĐŋĐžĐ´Ņ…ĐžĐ´ — ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: # ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ include /movies/ include /musics/ include /pictures/ КоĐŊĐĩ҇ĐŊŅ‹Đš ĐŋĐžĐ´Ņ…ĐžĐ´ — ҁĐŧĐĩŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` и `include`. В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŋĐžŅ€ŅĐ´ĐžĐē ĐŋŅ€Đ°Đ˛Đ¸Đģ ваĐļĐĩĐŊ. БоĐģĐĩĐĩ Ņ€Đ°ĐŊĐŊиĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа иĐŧĐĩŅŽŅ‚ ĐŋŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đž ĐŊад йОĐģĐĩĐĩ ĐŋОСдĐŊиĐŧи. ДĐģŅ ҃ĐŋŅ€ĐžŅ‰ĐĩĐŊĐ¸Ņ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐŊĐ°Ņ‡Đ°Đģа ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude`, а ĐˇĐ°Ņ‚ĐĩĐŧ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` exclude *.unrecoverable # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐŋОдĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ `tmp` exclude tmp/ # ВĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ include /movies/ include /musics/ include /pictures/ В ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐžĐŋŅ†Đ¸ŅŽ -f, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ŅˆĐ°ĐąĐģĐžĐŊŅ‹ `include`. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: # ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ„Đ°ĐšĐģŅ‹ .mp3. # В Unix Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ ĐŗĐģОййиĐŊĐŗĐ° ОйОĐģĐžŅ‡ĐēОК. snapraid -f "*.mp3" check В Unix ĐŋŅ€Đ¸ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ŅĐ¸ĐŧвОĐģОв ĐŗĐģОййиĐŊĐŗĐ° в ĐēĐžĐŧаĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēĐĩ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ СаĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ¸Ņ… в ĐēĐ°Đ˛Ņ‹Ņ‡Đēи, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚Đ¸Ņ‚ŅŒ Đ¸Ņ… Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ ОйОĐģĐžŅ‡ĐēОК. 9 IGNORE FILE ============= В Đ´ĐžĐŋĐžĐģĐŊĐĩĐŊиĐĩ Đē ĐŗĐģОйаĐģҌĐŊŅ‹Đŧ ĐŋŅ€Đ°Đ˛Đ¸ĐģаĐŧ в Ņ„Đ°ĐšĐģĐĩ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ‰Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ `.snapraidignore` в ĐģŅŽĐąĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ вĐŊŅƒŅ‚Ņ€Đ¸ ĐŧĐ°ŅŅĐ¸Đ˛Đ° Đ´ĐģŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ Đ´Đĩ҆ĐĩĐŊŅ‚Ņ€Đ°ĐģиСОваĐŊĐŊҋ҅ ĐŋŅ€Đ°Đ˛Đ¸Đģ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. ĐŸŅ€Đ°Đ˛Đ¸Đģа, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Đĩ в `.snapraidignore`, ĐŋŅ€Đ¸ĐŧĐĩĐŊŅŅŽŅ‚ŅŅ ĐŋĐžŅĐģĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģ в ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐžĐŊĐŊĐžĐŧ Ņ„Đ°ĐšĐģĐĩ. Đ­Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž ĐžĐŊи иĐŧĐĩŅŽŅ‚ йОĐģĐĩĐĩ Đ˛Ņ‹ŅĐžĐēиК ĐŋŅ€Đ¸ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ и ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ€Đ°ĐŊĐĩĐĩ ĐąŅ‹Đģи вĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ ĐŗĐģОйаĐģҌĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ĐĩĐš. ФаĐēŅ‚Đ¸Ņ‡ĐĩҁĐēи, ĐĩҁĐģи ĐģĐžĐēаĐģҌĐŊĐžĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ŅĐžĐ˛ĐŋадаĐĩŅ‚, Ņ„Đ°ĐšĐģ Đ¸ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐž ĐžŅ‚ ĐŗĐģОйаĐģҌĐŊҋ҅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐē вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ. Đ›ĐžĐŗĐ¸Đēа ŅˆĐ°ĐąĐģĐžĐŊОв в `.snapraidignore` ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅĐĩŅ‚ ĐŗĐģОйаĐģҌĐŊŅƒŅŽ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŽ, ĐŊĐž ĐŋŅ€Đ¸Đ˛ŅĐˇŅ‹Đ˛Đ°ĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ Đē ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, в ĐēĐžŅ‚ĐžŅ€ĐžĐŧ ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŅ Ņ„Đ°ĐšĐģ: FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš Ņ„Đ°ĐšĐģ ҁ иĐŧĐĩĐŊĐĩĐŧ FILE в ŅŅ‚ĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ иĐģи ĐŊиĐļĐĩ. ЗдĐĩҁҌ Đ´ĐĩĐšŅŅ‚Đ˛ŅƒŅŽŅ‚ Ņ‚Đĩ ĐļĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŋĐžĐ´ŅŅ‚Đ°ĐŊОвĐēи, Ņ‡Ņ‚Đž и в ĐŗĐģОйаĐģҌĐŊĐžĐŧ ŅˆĐ°ĐąĐģĐžĐŊĐĩ. DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ DIR и Đ˛ŅĐĩ ĐĩĐŗĐž ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ, ĐŊĐ°Ņ…ĐžĐ´ŅŅ‰ĐĩĐĩŅŅ в ŅŅ‚ĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐĩ иĐģи ĐŊиĐļĐĩ. /PATH/FILE Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа `.snapraidignore`. /PATH/DIR/ Đ’Ņ‹ĐąĐ¸Ņ€Đ°ĐĩŅ‚ Ņ‚ĐžŅ‡ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ и Đ˛ŅĐĩ ĐĩĐŗĐž ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊĐž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģа `.snapraidignore`. В ĐžŅ‚ĐģĐ¸Ņ‡Đ¸Đĩ ĐžŅ‚ ĐŗĐģОйаĐģҌĐŊОК ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸, Ņ„Đ°ĐšĐģŅ‹ `.snapraidignore` ĐŋОддĐĩŅ€ĐļĐ¸Đ˛Đ°ŅŽŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ°Đ˛Đ¸Đģа Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ; Đ˛Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ `include` иĐģи ĐžŅ‚Ņ€Đ¸Ņ†Đ°ĐŊиĐĩ (!). НаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐĩҁĐģи ҃ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ `.snapraidignore` в `/mnt/disk1/projects/`: # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐĸОЛĐŦКО /mnt/disk1/projects/output.bin /output.bin # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ҁ иĐŧĐĩĐŊĐĩĐŧ `build` вĐŊŅƒŅ‚Ņ€Đ¸ projects/ build/ # Đ˜ŅĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ĐģŅŽĐąĐžĐš .tmp Ņ„Đ°ĐšĐģ вĐŊŅƒŅ‚Ņ€Đ¸ projects/ иĐģи ĐĩĐŗĐž ĐŋОдĐŋаĐŋĐžĐē *.tmp 10 CONTENT ========== SnapRAID Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ ҁĐŋĐ¸ŅĐžĐē и ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ ҁ҃ĐŧĐŧŅ‹ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģОв в Ņ„Đ°ĐšĐģĐĩ content. Đ­Ņ‚Đž йиĐŊĐ°Ņ€ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģŅĐĩŅ‚ Đ˛ŅĐĩ Ņ„Đ°ĐšĐģŅ‹, ĐŋŅ€Đ¸ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ в Đ˛Đ°ŅˆĐĩĐŧ Đ´Đ¸ŅĐēОвОĐŧ ĐŧĐ°ŅŅĐ¸Đ˛Đĩ, вĐŧĐĩҁ҂Đĩ ŅĐž Đ˛ŅĐĩĐŧи ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đŧи ҁ҃ĐŧĐŧаĐŧи Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Đ¸Ņ… ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸. Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ и СаĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` и `scrub` и ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `fix`, `check` и `status`. 11 PARITY ========= SnapRAID Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚Đ¸ Đ˛Đ°ŅˆĐĩĐŗĐž ĐŧĐ°ŅŅĐ¸Đ˛Đ° в Ņ„Đ°ĐšĐģĐ°Ņ… parity. Đ­Ņ‚Đž йиĐŊĐ°Ņ€ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸Đĩ Đ˛Ņ‹Ņ‡Đ¸ŅĐģĐĩĐŊĐŊŅƒŅŽ ҇ĐĩŅ‚ĐŊĐžŅŅ‚ŅŒ Đ˛ŅĐĩŅ… ĐąĐģĐžĐēОв, ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ в Ņ„Đ°ĐšĐģĐĩ `content`. Đ­Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ и СаĐŋĐ¸ŅŅ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` и `fix` и Ņ‚ĐžĐģҌĐēĐž ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ ĐēĐžĐŧаĐŊдаĐŧи `scrub` и `check`. 12 ENCODING =========== SnapRAID в Unix Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒĐĩŅ‚ ĐģŅŽĐąĐžĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ. ОĐŊ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ и Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв ҁ Ņ‚ĐĩĐŧ ĐļĐĩ ĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ, ĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧОК. В Windows Đ˛ŅĐĩ иĐŧĐĩĐŊа, ŅŅ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ‹Đĩ иС Ņ„Đ°ĐšĐģОвОК ŅĐ¸ŅŅ‚ĐĩĐŧŅ‹, ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒŅŽŅ‚ŅŅ и ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ŅŽŅ‚ŅŅ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ UTF-8. Đ§Ņ‚ĐžĐąŅ‹ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐģĐ¸ŅŅŒ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐēĐžĐŊŅĐžĐģҌ Windows в Ņ€ĐĩĐļиĐŧ UTF-8 ĐēĐžĐŧаĐŊдОК `chcp 65001` и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅˆŅ€Đ¸Ņ„Ņ‚ TrueType, Ņ‚Đ°ĐēОК ĐēаĐē `Lucida Console`, в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ŅˆŅ€Đ¸Ņ„Ņ‚Đ° ĐēĐžĐŊŅĐžĐģи. Đ­Ņ‚Đž вĐģĐ¸ŅĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚Đ°ĐĩĐŧŅ‹Đĩ иĐŧĐĩĐŊа Ņ„Đ°ĐšĐģОв; ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚Đĩ Đ˛Ņ‹Đ˛ĐžĐ´ ĐēĐžĐŊŅĐžĐģи в Ņ„Đ°ĐšĐģ, Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ¸Ņ€ŅƒŅŽŅ‰Đ¸Đš Ņ„Đ°ĐšĐģ Đ˛ŅĐĩĐŗĐ´Đ° в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ UTF-8. 13 COPYRIGHT ============ Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊ Đ°Đ˛Ņ‚ĐžŅ€ŅĐēиĐŧ ĐŋŅ€Đ°Đ˛ĐžĐŧ (C) 2025 Andrea Mazzoleni 14 SEE ALSO =========== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-sv.1000066400000000000000000002043611522717156100163430ustar00rootroot00000000000000.TH "SnapRAID Säkerhetskopiering fÃļr Disk\-arrayer" 1 .SH NAME snapraid \- SnapRAID Säkerhetskopiering fÃļr Disk\-arrayer .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH BESKRIVNING SnapRAID är ett säkerhetskopieringsprogram designat fÃļr disk\-arrayer, som lagrar paritetsinformation fÃļr dataÃĨterställning vid upp till sex diskfel. .PP SnapRAID är i fÃļrsta hand avsett fÃļr hemmamediabibliotek med stora, sällan ändrade filer, och erbjuder flera funktioner: .PD 0 .IP \(bu Du kan använda diskar som redan är fyllda med filer utan att behÃļva formatera om dem, och du fÃĨr ÃĨtkomst till dem som vanligt. .IP \(bu All din data hashberäknas fÃļr att säkerställa dataintegritet och fÃļrhindra tyst korruption. .IP \(bu När antalet felaktiga diskar Ãļverskrider paritetsantalet, begränsas datafÃļrlusten till de drabbade diskarna; data pÃĨ andra diskar fÃļrblir ÃĨtkomlig. .IP \(bu Om du oavsiktligt raderar filer pÃĨ en disk är ÃĨterställning mÃļjlig. .IP \(bu Diskar kan ha olika storlekar. .IP \(bu Du kan lägga till diskar när som helst. .IP \(bu SnapRAID lÃĨser inte in din data; du kan sluta använda det när som helst utan omformatering eller dataflytt. .IP \(bu FÃļr att fÃĨ ÃĨtkomst till en fil behÃļver endast en enda disk snurra, vilket sparar strÃļm och minskar buller. .PD .PP FÃļr mer information, besÃļk den officiella SnapRAID\-webbplatsen: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH BEGRäNSNINGAR SnapRAID är en hybrid mellan ett RAID\- och ett säkerhetskopieringsprogram, som syftar till att kombinera de bästa fÃļrdelarna med bÃĨda. Den har dock vissa begränsningar som du bÃļr Ãļverväga innan du använder den. .PP Huvudbegränsningen är att om en disk misslyckas och du inte nyligen har synkat, kanske du inte kan ÃĨterställa fullständigt. Mer specifikt, kanske du inte kan ÃĨterställa upp till storleken pÃĨ de ändrade eller raderade filerna sedan den senaste synkroniseringsoperationen. Detta inträffar även om de ändrade eller raderade filerna inte finns pÃĨ den felaktiga disken. Det är därfÃļr SnapRAID passar bättre fÃļr data som sällan ändras. .PP Å andra sidan fÃļrhindrar nyligen tillagda filer inte ÃĨterställning av redan befintliga filer. Du kommer bara att fÃļrlora de nyligen tillagda filerna om de finns pÃĨ den felaktiga disken. .PP Andra SnapRAID\-begränsningar är: .PD 0 .IP \(bu Med SnapRAID har du fortfarande separata filsystem fÃļr varje disk. Med RAID fÃĨr du ett enda stort filsystem. .IP \(bu SnapRAID stripas inte data. Med RAID fÃĨr du en hastighetsÃļkning med striping. .IP \(bu SnapRAID stÃļder inte ÃĨterställning i realtid. Med RAID behÃļver du inte sluta arbeta när en disk misslyckas. .IP \(bu SnapRAID kan bara ÃĨterställa data frÃĨn ett begränsat antal diskfel. Med en säkerhetskopia kan du ÃĨterställa frÃĨn ett fullständigt fel pÃĨ hela disk\-arrayen. .IP \(bu Endast filnamn, tidsstämplar, symboliska länkar och hÃĨrda länkar sparas. BehÃļrigheter, ägarskap och utÃļkade attribut sparas inte. .PD .SH KOM IGÃĨNG FÃļr att använda SnapRAID mÃĨste du fÃļrst välja en disk i din disk\-array som ska dediceras till \`parity\`\-information. Med en disk fÃļr paritet, kommer du att kunna ÃĨterställa frÃĨn ett enda diskfel, liknande RAID5. .PP Om du vill ÃĨterställa frÃĨn fler diskfel, liknande RAID6, mÃĨste du reservera ytterligare diskar fÃļr paritet. Varje ytterligare paritetsdisk mÃļjliggÃļr ÃĨterställning frÃĨn ett diskfel till. .PP Som paritetsdiskar mÃĨste du välja de stÃļrsta diskarna i arrayen, eftersom paritetsinformationen kan växa till storleken av den stÃļrsta datadisken i arrayen. .PP Dessa diskar kommer att dediceras till att lagra \`parity\`\-filerna. Du bÃļr inte lagra din data pÃĨ dem. .PP Sedan mÃĨste du definiera de \`data\`\-diskar som du vill skydda med SnapRAID. Skyddet är mer effektivt om dessa diskar innehÃĨller data som sällan ändras. Av denna anledning är det bäst att INTE inkludera Windows C:\\\-disken eller Unix /home, /var och /tmp katalogerna. .PP Listan Ãļver filer sparas i \`content\`\-filerna, som vanligtvis lagras pÃĨ data\-, paritets\- eller startdiskarna. Denna fil innehÃĨller detaljerna fÃļr din säkerhetskopia, inklusive alla checksummor fÃļr att verifiera dess integritet. \`content\`\-filen lagras i flera kopior, och varje kopia mÃĨste finnas pÃĨ en annan disk fÃļr att säkerställa att, även vid flera diskfel, minst en kopia är tillgänglig. .PP Anta till exempel att du bara är intresserad av en paritetsnivÃĨ av skydd, och dina diskar finns pÃĨ: .PP .RS 4 /mnt/diskp <\- vald disk fÃļr paritet .PD 0 .PP .PD /mnt/disk1 <\- fÃļrsta disken att skydda .PD 0 .PP .PD /mnt/disk2 <\- andra disken att skydda .PD 0 .PP .PD /mnt/disk3 <\- tredje disken att skydda .PD 0 .PD .RE .PP Du mÃĨste skapa konfigurationsfilen /etc/snapraid.conf med fÃļljande alternativ: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Om du använder Windows bÃļr du använda Windows sÃļkvägsformat, med enhetsbeteckningar och omvända snedstreck istället fÃļr snedstreck. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Om du har mÃĨnga diskar och fÃĨr slut pÃĨ enhetsbeteckningar kan du montera diskar direkt i undermappar. Se: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP Vid denna punkt är du redo att kÃļra kommandot \`sync\` fÃļr att bygga paritetsinformationen. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Denna process kan ta flera timmar fÃļrsta gÃĨngen, beroende pÃĨ storleken pÃĨ datan som redan finns pÃĨ diskarna. Om diskarna är tomma är processen omedelbar. .PP Du kan stoppa det när som helst genom att trycka Ctrl+C, och vid nästa kÃļrning ÃĨterupptas det där det avbrÃļts. .PP När detta kommando är klart är din data SÄKER. .PP Nu kan du bÃļrja använda din array som du vill och periodiskt uppdatera paritetsinformationen genom att kÃļra kommandot \`sync\`. .SS Skrubbning (Scrubbing) FÃļr att periodiskt kontrollera data och paritet fÃļr fel kan du kÃļra kommandot \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP Detta kommando jämfÃļr data i din array med den hash som beräknades under kommandot \`sync\` fÃļr att verifiera integriteten. .PP Varje kÃļrning av kommandot kontrollerar ungefär 8% av arrayen, exklusive data som redan skrubbats under de fÃļregÃĨende 10 dagarna. Du kan använda alternativet \-p, \-\-plan fÃļr att specificera en annan mängd och alternativet \-o, \-\-older\-than fÃļr att specificera en annan ÃĨlder i dagar. Till exempel, fÃļr att kontrollera 5% av arrayen fÃļr block äldre än 20 dagar, använd: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Om tysta eller input/output\-fel hittas under processen, markeras de motsvarande blocken som dÃĨliga i \`content\`\-filen och listas i kommandot \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP FÃļr att fixa dem kan du använda kommandot \`fix\`, filtrera efter dÃĨliga block med alternativet \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP Vid nästa \`scrub\` kommer felen att fÃļrsvinna frÃĨn \`status\`\-rapporten om de verkligen är fixade. FÃļr att gÃļra det snabbare kan du använda \-p bad fÃļr att skrubba endast block markerade som dÃĨliga. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP Att kÃļra \`scrub\` pÃĨ en osynkad array kan rapportera fel orsakade av borttagna eller modifierade filer. Dessa fel rapporteras i \`scrub\`\- utdata, men de relaterade blocken markeras inte som dÃĨliga. .SS Poolning Obs: Poolningsfunktionen som beskrivs nedan har ersatts av verktyget mergerfs, som nu är det rekommenderade alternativet fÃļr Linux\-användare i SnapRAID\-communityt. Mergefs ger ett mer flexibelt och effektivt sätt att poola flera enheter till en enda enhetlig monteringspunkt, vilket mÃļjliggÃļr sÃļmlÃļs ÃĨtkomst till filer Ãļver din array utan att fÃļrlita sig pÃĨ symboliska länkar. Det integreras väl med SnapRAID fÃļr paritetsskydd och används ofta i installationer som OpenMediaVault (OMV) eller anpassade NAS\-konfigurationer. .PP FÃļr att visa alla filer i din array i samma katalogträd, kan du aktivera funktionen \`pooling\`. Den skapar en skrivskyddad virtuell vy av alla filer i din array med hjälp av symboliska länkar. .PP Du kan konfigurera \`pooling\`\-katalogen i konfigurationsfilen med: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP eller, om du använder Windows, med: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP och kÃļr sedan kommandot \`pool\` fÃļr att skapa eller uppdatera den virtuella vyn. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Om du använder en Unix\-plattform och vill dela denna katalog Ãļver nätverket till antingen Windows\- eller Unix\-maskiner, bÃļr du lägga till fÃļljande alternativ till din /etc/samba/smb.conf: .PP .RS 4 # I den globala sektionen av smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # I delningssektionen av smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP I Windows kräver delning av symboliska länkar Ãļver ett nätverk att klienter lÃļser dem pÃĨ distans. FÃļr att aktivera detta mÃĨste du, fÃļrutom att dela pool\-katalogen, även dela alla diskar oberoende, med hjälp av de disk\-namn som definieras i konfigurationsfilen som delningspunkter. Du mÃĨste ocksÃĨ specificera i alternativet \`share\` i konfigurationsfilen den Windows UNC\-sÃļkväg som fjärrklienter behÃļver använda fÃļr att fÃĨ ÃĨtkomst till dessa delade diskar. .PP Till exempel, om du arbetar frÃĨn en server som heter \`darkstar\`, kan du använda alternativen: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP och dela fÃļljande kataloger Ãļver nätverket: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP fÃļr att tillÃĨta fjärrklienter att fÃĨ ÃĨtkomst till alla filer pÃĨ \\\\darkstar\\pool. .PP Du kan ocksÃĨ behÃļva konfigurera fjärrklienter fÃļr att mÃļjliggÃļra ÃĨtkomst till fjärrsymboliska länkar med kommandot: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Ångra radering (Undeleting) SnapRAID fungerar mer som ett säkerhetskopieringsprogram än ett RAID\-system, och det kan användas fÃļr att ÃĨterställa eller ÃĨngra radering av filer till deras tidigare tillstÃĨnd med hjälp av alternativet \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FIL .PD 0 .PD .RE .PP eller fÃļr en katalog: .PP .RS 4 snapraid fix \-f KATALOG/ .PD 0 .PD .RE .PP Du kan ocksÃĨ använda det fÃļr att ÃĨterställa endast oavsiktligt raderade filer inuti en katalog med hjälp av alternativet \-m, \-\-filter\-missing, som ÃĨterställer endast saknade filer, och lämnar alla andra orÃļrda. .PP .RS 4 snapraid fix \-m \-f KATALOG/ .PD 0 .PD .RE .PP Eller fÃļr att ÃĨterställa alla raderade filer pÃĨ alla enheter med: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Återställning Det värsta har hänt, och du har fÃļrlorat en eller flera diskar! .PP FÅ INTE PANIK! Du kommer att kunna ÃĨterställa dem! .PP Det fÃļrsta du mÃĨste gÃļra är att undvika ytterligare ändringar i din disk\-array. Inaktivera alla fjärranslutningar till den och alla schemalagda processer, inklusive alla schemalagda SnapRAID nattliga sync\- eller scrub\-kÃļrningar. .PP Fortsätt sedan med fÃļljande steg. .SS STEG 1 \-> Omkonfigurera Du behÃļver lite utrymme fÃļr att ÃĨterställa, helst pÃĨ ytterligare reservdiskar, men en extern USB\-disk eller fjärrdisk räcker. .PP Ändra SnapRAID\-konfigurationsfilen fÃļr att fÃĨ alternativet \`data\` eller \`parity\` fÃļr den felaktiga disken att peka pÃĨ en plats med tillräckligt tomt utrymme fÃļr att ÃĨterställa filerna. .PP Om till exempel disk \`d1\` har misslyckats, ändra frÃĨn: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP till: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Om disken som ska ÃĨterställas är en paritetsdisk, uppdatera det lämpliga \`parity\`\- alternativet. Om du har flera felaktiga diskar, uppdatera alla deras konfigurationsalternativ. .SS STEG 2 \-> Fixa KÃļr kommandot fix och lagra loggen i en extern fil med: .PP .RS 4 snapraid \-d NAMN \-l fix.log fix .PD 0 .PD .RE .PP Där NAMN är namnet pÃĨ disken, till exempel \`d1\` i vÃĨrt tidigare exempel. Om disken som ska ÃĨterställas är en paritetsdisk, använd namnen \`parity\`, \`2\-parity\`, etc. Om du har flera felaktiga diskar, använd flera \-d\-alternativ fÃļr att specificera alla av dem. .PP Detta kommando kommer att ta lÃĨng tid. .PP Se till att du har nÃĨgra gigabyte ledigt fÃļr att lagra fix.log\-filen. KÃļr den frÃĨn en disk med tillräckligt med ledigt utrymme. .PP Nu har du ÃĨterställt allt som är ÃĨterställningsbart. Om vissa filer är delvis eller helt icke\-ÃĨterställningsbara, kommer de att dÃļpas om genom att lägga till tillägget \`.unrecoverable\`. .PP Du kan hitta en detaljerad lista Ãļver alla icke\-ÃĨterställningsbara block i fix.log\-filen genom att kontrollera alla rader som bÃļrjar med \`unrecoverable:\`. .PP Om du inte är nÃļjd med ÃĨterställningen kan du fÃļrsÃļka igen hur mÃĨnga gÃĨnger du vill. .PP Om du till exempel har tagit bort filer frÃĨn arrayen efter den senaste \`sync\`, kan detta leda till att vissa filer inte ÃĨterställs. I detta fall kan du fÃļrsÃļka igen \`fix\` med alternativet \-i, \-\-import, specificera var dessa filer nu finns fÃļr att inkludera dem igen i ÃĨterställningsprocessen. .PP Om du är nÃļjd med ÃĨterställningen kan du fortsätta, men notera att efter synkronisering kan du inte fÃļrsÃļka igen kommandot \`fix\` längre! .SS STEG 3 \-> Kontrollera Som en fÃļrsiktighetsÃĨtgärd kan du nu kÃļra ett \`check\`\-kommando fÃļr att säkerställa att allt är korrekt pÃĨ den ÃĨterställda disken. .PP .RS 4 snapraid \-d NAMN \-a check .PD 0 .PD .RE .PP Där NAMN är namnet pÃĨ disken, till exempel \`d1\` i vÃĨrt tidigare exempel. .PP Alternativen \-d och \-a talar om fÃļr SnapRAID att endast kontrollera den specificerade disken och ignorera all paritetsdata. .PP Detta kommando kommer att ta lÃĨng tid, men om du inte är alltfÃļr fÃļrsiktig, kan du hoppa Ãļver det. .SS STEG 4 \-> Synkronisera KÃļr kommandot \`sync\` fÃļr att synkronisera arrayen igen med den nya disken. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Om allt är ÃĨterställt är detta kommando omedelbart. .SH KOMMANDON SnapRAID tillhandahÃĨller nÃĨgra enkla kommandon som lÃĨter dig: .PD 0 .IP \(bu Skriva ut statusen fÃļr arrayen \-> \`status\` .IP \(bu Kontrollera diskarna \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu GÃļra en säkerhetskopia/Ãļgonblicksbild \-> \`sync\` .IP \(bu Periodiskt kontrollera data \-> \`scrub\` .IP \(bu Återställa den senaste säkerhetskopian/Ãļgonblicksbilden \-> \`fix\`. .PD .PP Kommandon mÃĨste skrivas med gemener. .SS status Skriver ut en sammanfattning av tillstÃĨndet fÃļr disk\-arrayen. .PP Det inkluderar information om paritetsfragmentering, hur gamla blocken är utan kontroll, och alla registrerade tysta fel som pÃĨträffats under skrubbning. .PP Informationen som presenteras hänvisar till den senaste tidpunkten du kÃļrde \`sync\`. Senare modifieringar beaktas inte. .PP Om dÃĨliga block upptäcktes, listas deras blocknummer. FÃļr att fixa dem kan du använda kommandot \`fix \-e\`. .PP Det visar ocksÃĨ ett diagram som representerar den senaste tidpunkten dÃĨ varje block skrubbades eller synkroniserades. Skrubbade block visas med \`*\`, block synkroniserade men ännu inte skrubbade med \`o\`. .PP Inget ändras. .SS smart Skriver ut en SMART\-rapport Ãļver alla diskar i systemet. .PP Det inkluderar en uppskattning av sannolikheten fÃļr fel under det kommande ÃĨret, vilket gÃļr att du kan planera underhÃĨllsersättningar av diskar som visar misstänkta attribut. .PP Denna sannolikhetsuppskattning erhÃĨlls genom att korrelera SMART\-attributen fÃļr diskarna med Backblaze\-data som finns tillgänglig pÃĨ: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Om SMART rapporterar att en disk hÃĨller pÃĨ att misslyckas, skrivs \`FAIL\` eller \`PREFAIL\` ut fÃļr den disken, och SnapRAID returnerar med ett fel. I detta fall rekommenderas omedelbar ersättning av disken starkt. .PP Andra mÃļjliga statussträngar är: .RS 4 .PD 0 .HP 4 .I logfail Tidigare var vissa attribut lägre än trÃļskelvärdet. .HP 4 .I logerr Enhetens fellogg innehÃĨller fel. .HP 4 .I selferr Enhetens självtestlogg innehÃĨller fel. .PD .RE .PP Om alternativet \-v, \-\-verbose specificeras, tillhandahÃĨlls en djupare statistisk analys. Denna analys kan hjälpa dig att bestämma om du behÃļver mer eller mindre paritet. .PP Detta kommando använder verktyget \`smartctl\` och är ekvivalent med att kÃļra \`smartctl \-a\` pÃĨ alla enheter. .PP Om dina enheter inte upptäcks automatiskt korrekt kan du specificera ett anpassat kommando med hjälp av alternativet \`smartctl\` i konfigurations\- filen. .PP Inget ändras. .SS probe Skriver ut STRÖM\-tillstÃĨndet fÃļr alla diskar i systemet. .PP \`Standby\` betyder att disken inte snurrar. \`Active\` betyder att disken snurrar. .PP Detta kommando använder verktyget \`smartctl\` och är ekvivalent med att kÃļra \`smartctl \-n standby \-i\` pÃĨ alla enheter. .PP Om dina enheter inte upptäcks automatiskt korrekt kan du specificera ett anpassat kommando med hjälp av alternativet \`smartctl\` i konfigurations\- filen. .PP Inget ändras. .SS up Snurrar upp alla diskar i arrayen. .PP Du kan snurra upp endast specifika diskar med hjälp av alternativet \-d, \-\-filter\-disk. .PP Att snurra upp alla diskar samtidigt kräver mycket strÃļm. Se till att din strÃļmfÃļrsÃļrjning kan klara det. .PP Inget ändras. .SS down Snurrar ner alla diskar i arrayen. .PP Detta kommando använder verktyget \`smartctl\` och är ekvivalent med att kÃļra \`smartctl \-s standby,now\` pÃĨ alla enheter. .PP Du kan snurra ner endast specifika diskar med hjälp av alternativet \-d, \-\-filter\-disk alternativet. .PP FÃļr att automatiskt snurra ner vid fel kan du använda alternativet \-s, \-\-spin\-down\-on\-error med alla andra kommandon, vilket är ekvivalent med att kÃļra \`down\` manuellt när ett fel inträffar. .PP Inget ändras. .SS diff Listar alla filer som modifierats sedan den senaste \`sync\` och som behÃļver fÃĨ sin paritetsdata omberäknad. .PP Detta kommando kontrollerar inte filens data, utan endast filens tidsstämpel, storlek och inode. .PP Efter att ha listat alla ändrade filer presenteras en sammanfattning av ändringarna, grupperade efter: .RS 4 .PD 0 .HP 4 .I equal Filer ofÃļrändrade frÃĨn tidigare. .HP 4 .I added Filer tillagda som inte fanns tidigare. .HP 4 .I removed Filer borttagna. .HP 4 .I updated Filer med en annan storlek eller tidsstämpel, vilket innebär att de modifierades. .HP 4 .I moved Filer flyttade till en annan katalog pÃĨ samma disk. De identifieras genom att ha samma namn, storlek, tidsstämpel och inode, men en annan katalog. .HP 4 .I copied Filer som kopierats pÃĨ samma eller en annan disk där originalfilen fortfarande finns kvar. De identifieras genom att ha samma namn, storlek och tidsstämpel. Om tidsstämpeln fÃļr undersekunder är noll mÃĨste hela sÃļkvägen matcha fÃļr att identifieras, inte bara namnet. .HP 4 .I relocated Filer som flyttats pÃĨ samma eller en annan disk där originalet har fÃļrsvunnit. De identifieras genom att ha samma namn, storlek och tidsstämpel. Om tidsstämpeln fÃļr undersekunder är noll mÃĨste hela sÃļkvägen matcha fÃļr att identifieras. Till skillnad frÃĨn \'moved\' filer pÃĨ samma disk har omlokaliserade filer en annan inode. .HP 4 .I restored Filer med en annan inode men matchande katalog, namn, storlek och tidsstämpel. Dessa är vanligtvis filer som ÃĨterställts efter att ha raderats. .PD .RE .PP Om en \`sync\` krävs är processens returkod 2, istället fÃļr standard 0. Returkoden 1 används fÃļr ett generiskt feltillstÃĨnd. .PP Inget ändras. .SS sync Uppdaterar paritetsinformationen. Alla modifierade filer i disk\-arrayen läses, och motsvarande paritets\- data uppdateras. .PP Du kan stoppa denna process när som helst genom att trycka Ctrl+C, utan att fÃļrlora det arbete som redan utfÃļrts. Vid nästa kÃļrning kommer \`sync\`\-processen att ÃĨterupptas där den avbrÃļts. .PP Om tysta eller input/output\-fel hittas under processen, markeras de motsvarande blocken som dÃĨliga. .PP Filer identifieras med sÃļkväg och/eller inode och kontrolleras med storlek och tidsstämpel. Om filstorleken eller tidsstämpeln skiljer sig ÃĨt, beräknas paritetsdata om fÃļr hela filen. Om filen flyttas eller dÃļps om pÃĨ samma disk, samtidigt som samma inode behÃĨlls, beräknas inte pariteten om. Om filen flyttas till en annan disk, beräknas pariteten om, men den tidigare beräknade hash\-informationen behÃĨlls. .PP \`content\`\- och \`parity\`\-filerna modifieras vid behov. Filerna i arrayen modifieras INTE. .SS scrub Skrubbar arrayen och sÃļker efter tysta eller input/output\-fel i data\- och paritetsdiskar. .PP Varje anrop kontrollerar ungefär 8% av arrayen, exklusive data som redan skrubbats under de senaste 10 dagarna. Detta innebär att skrubbning en gÃĨng i veckan säkerställer att varje bit data kontrolleras minst en gÃĨng var tredje mÃĨnad. .PP Du kan definiera en annan skrubbplan eller mängd med hjälp av alternativet \-p, \-\-plan som accepterar: bad \- Skrubbar block markerade som dÃĨliga. new \- Skrubbar nyligen synkroniserade block som ännu inte skrubbats. full \- Skrubbar allt. 0\-100 \- Skrubbar den specificerade procentandelen av block. .PP Om du specificerar en procentsats kan du ocksÃĨ använda alternativet \-o, \-\-older\-than fÃļr att definiera hur gammalt blocket ska vara. De äldsta blocken skrubbas fÃļrst, vilket säkerställer en optimal kontroll. Om du bara vill skrubba de nyligen synkroniserade blocken som ännu inte skrubbats, använd alternativet \`\-p new\`. .PP FÃļr att fÃĨ detaljer om skrubbstatusen, använd kommandot \`status\`. .PP FÃļr alla tysta eller input/output\-fel som hittas, markeras de motsvarande blocken som dÃĨliga i \`content\`\-filen. Dessa dÃĨliga block listas i \`status\` och kan fixas med \`fix \-e\`. Efter fixningen, vid nästa skrubb, kommer de att kontrolleras igen, och om de befinns korrigerade, tas det dÃĨliga märket bort. FÃļr att skrubba endast de dÃĨliga blocken kan du använda kommandot \`scrub \-p bad\`. .PP Det rekommenderas att kÃļra \`scrub\` endast pÃĨ en synkroniserad array fÃļr att undvika rapporterade fel orsakade av osynkad data. Dessa fel känns igen som att de inte är tysta fel, och blocken markeras inte som dÃĨliga, men sÃĨdana fel rapporteras i kommandots utdata. .PP \`content\`\-filen modifieras fÃļr att uppdatera tiden fÃļr den senaste kontrollen fÃļr varje block och fÃļr att markera dÃĨliga block. \`parity\`\-filerna modifieras INTE. Filerna i arrayen modifieras INTE. .SS fix Fixar alla filer och paritetsdata. .PP Alla filer och paritetsdata jämfÃļrs med Ãļgonblicksbilds\- tillstÃĨndet som sparades i den senaste \`sync\`. Om en skillnad hittas, ÃĨterställs den till det lagrade ÃļgonblicksbildstillstÃĨndet. .PP VARNING! Kommandot \`fix\` skiljer inte mellan fel och avsiktliga modifieringar. Det ÃĨterställer ovillkorligen filtillstÃĨndet till den senaste \`sync\`. .PP Om inget annat alternativ specificeras, behandlas hela arrayen. Använd filteralternativen fÃļr att välja en delmängd av filer eller diskar att arbeta med. .PP FÃļr att fixa endast blocken markerade som dÃĨliga under \`sync\` och \`scrub\`, använd alternativet \-e, \-\-filter\-error. Till skillnad frÃĨn andra filteralternativ tillämpar detta fixar endast pÃĨ filer som är ofÃļrändrade sedan den senaste \`sync\`. .PP SnapRAID dÃļper om alla filer som inte kan fixas genom att lägga till tillägget \`.unrecoverable\`. .PP Innan fixningen skannas hela arrayen fÃļr att hitta alla filer som flyttats sedan den senaste \`sync\`\-operationen. Dessa filer identifieras av deras tidsstämpel, ignorera deras namn och katalog, och används i ÃĨterställningsprocessen vid behov. Om du flyttade nÃĨgra av dem utanfÃļr arrayen kan du använda alternativet \-i, \-\-import fÃļr att specificera ytterligare kataloger att skanna. .PP Filer identifieras endast med sÃļkväg, inte med inode. .PP \`content\`\-filen modifieras INTE. \`parity\`\-filerna modifieras vid behov. Filerna i arrayen modifieras vid behov. .SS check Verifierar alla filer och paritetsdata. .PP Det fungerar som \`fix\`, men det simulerar endast en ÃĨterställning och inga ändringar skrivs till arrayen. .PP Detta kommando är i fÃļrsta hand avsett fÃļr manuell verifiering, som efter en ÃĨterställningsprocess eller under andra speciella fÃļrhÃĨllanden. FÃļr periodiska och schemalagda kontroller, använd \`scrub\`. .PP Om du använder alternativet \-a, \-\-audit\-only, kontrolleras endast fil\- datan, och paritetsdatan ignoreras fÃļr en snabbare kÃļrning. .PP Filer identifieras endast med sÃļkväg, inte med inode. .PP Inget ändras. .SS list Listar alla filer som finns i arrayen vid tidpunkten fÃļr den senaste \`sync\`. .PP Med \-v eller \-\-verbose visas även undertiden. .PP Inget ändras. .SS dup Listar alla dubblettfiler. TvÃĨ filer antas vara lika om deras hashar matchar. Filens data läses inte; endast de fÃļrberäknade hasharna används. .PP Inget ändras. .SS pool Skapar eller uppdaterar en virtuell vy av alla filer i din disk\-array i \`pooling\`\-katalogen. .PP Filerna kopieras inte utan länkas med hjälp av symboliska länkar. .PP Vid uppdatering raderas alla befintliga symboliska länkar och tomma underkataloger och ersätts med den nya vyn av arrayen. Alla andra vanliga filer lämnas kvar. .PP Inget ändras utanfÃļr pool\-katalogen. .SS devices Skriver ut de lÃĨgnivÃĨenheter som används av arrayen. .PP Detta kommando visar enhetsassociationerna i arrayen och är främst avsett som ett skriptgränssnitt. .PP De tvÃĨ fÃļrsta kolumnerna är lÃĨgnivÃĨenhetens ID och sÃļkväg. De nästa tvÃĨ kolumnerna är hÃļgnivÃĨenhetens ID och sÃļkväg. Den sista kolumnen är diskens namn i arrayen. .PP I de flesta fall har du en lÃĨgnivÃĨenhet fÃļr varje disk i arrayen, men i vissa mer komplexa konfigurationer kan du ha flera lÃĨgnivÃĨenheter som används av en enda disk i arrayen. .PP Inget ändras. .SS touch Anger en godtycklig undertidsstämpel fÃļr alla filer som har den satt till noll. .PP Detta fÃļrbättrar SnapRAIDs fÃļrmÃĨga att känna igen flyttade och kopierade filer, eftersom det gÃļr tidsstämpeln nästan unik, vilket minskar mÃļjliga dubbletter. .PP Mer specifikt, om undertidsstämpeln inte är noll, identifieras en flyttad eller kopierad fil som sÃĨdan om den matchar namn, storlek och tidsstämpel. Om undertidsstämpeln är noll, betraktas den som en kopia endast om hela sÃļkvägen, storlek och tidsstämpel alla matchar. .PP Tidsstämpeln med sekundprecision modifieras inte, sÃĨ alla datum och tider fÃļr dina filer bevaras. .SS rehash Schemalägger en omhashning av hela arrayen. .PP Detta kommando ändrar den hash\-typ som används, vanligtvis vid uppgradering frÃĨn ett 32\-bitars system till ett 64\-bitars system, fÃļr att byta frÃĨn MurmurHash3 till den snabbare SpookyHash. .PP Om du redan använder den optimala hashen, gÃļr detta kommando ingenting och informerar dig om att ingen ÃĨtgärd behÃļvs. .PP Omhashningen utfÃļrs inte omedelbart utan sker progressivt under \`sync\` och \`scrub\`. .PP Du kan kontrollera omhashningstillstÃĨndet med hjälp av \`status\`. .PP Under omhashningen bibehÃĨller SnapRAID full funktionalitet, med det enda undantaget att \`dup\` inte kan upptäcka dubbletter med hjälp av en annan hash. .SS locate Lokaliserar filer som lagras pÃĨ paritetsdiskarna. FÃļr varje matchande fil skrivs dess plats i paritetsfilen och antalet fragment den upptar ut. .PP Du kan använda alternativet \-t, \-\-tail fÃļr att begränsa ÃĨtgärden till filer som upptar den angivna slutdelen (tail) av pariteten. .PP Om du vill omallokera dessa filer kan du använda alternativet \-W, \-\-force\-realloc\-tail. Var medveten om att sÃĨdana filer inte skyddas av paritet under omallokeringsprocessen. .SH ALTERNATIV SnapRAID tillhandahÃĨller fÃļljande alternativ: .TP .B \-c, \-\-conf CONFIG Väljer den konfigurationsfil som ska användas. Om den inte specificeras, i Unix används filen \`/usr/local/etc/snapraid.conf\` om den finns, annars \`/etc/snapraid.conf\`. I Windows används filen \`snapraid.conf\` i samma katalog som \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Filtrerar filerna att behandla i \`check\` och \`fix\`. Endast filerna som matchar det specificerade mÃļnstret behandlas. Detta alternativ kan användas flera gÃĨnger. Se avsnittet MÖNSTER fÃļr mer information om mÃļnsterspecifikationer. I Unix, se till att globbing\-tecken citeras om de används. Detta alternativ kan endast användas med \`check\` och \`fix\`. Det kan inte användas med \`sync\` och \`scrub\`, eftersom de alltid behandlar hela arrayen. .TP .B \-d, \-\-filter\-disk NAME Filtrerar diskarna att behandla i \`check\`, \`fix\`, \`up\` och \`down\`. Du mÃĨste specificera ett disk\-namn som definieras i konfigurations\- filen. Du kan ocksÃĨ specificera paritetsdiskar med namnen: \`parity\`, \`2\-parity\`, \`3\-parity\`, etc., fÃļr att begränsa operationer till en specifik paritetsdisk. Om du kombinerar flera \-\-filter, \-\-filter\-disk och \-\-filter\-missing alternativ, väljs endast filer som matchar alla filter. Detta alternativ kan användas flera gÃĨnger. Detta alternativ kan endast användas med \`check\`, \`fix\`, \`up\` och \`down\`. Det kan inte användas med \`sync\` och \`scrub\`, eftersom de alltid behandlar hela arrayen. .TP .B \-m, \-\-filter\-missing Filtrerar filerna att behandla i \`check\` och \`fix\`. Endast filerna som saknas eller har raderats frÃĨn arrayen behandlas. När det används med \`fix\`, fungerar detta som ett \`undelete\`\-kommando. Om du kombinerar flera \-\-filter, \-\-filter\-disk och \-\-filter\-missing alternativ, väljs endast filer som matchar alla filter. Detta alternativ kan endast användas med \`check\` och \`fix\`. Det kan inte användas med \`sync\` och \`scrub\`, eftersom de alltid behandlar hela arrayen. .TP .B \-e, \-\-filter\-error Behandlar filerna med fel i \`check\` och \`fix\`. Det behandlar endast filer som har block markerade med tysta eller input/output\-fel under \`sync\` och \`scrub\`, som listas i \`status\`. Detta alternativ kan endast användas med \`check\` och \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Väljer skrubbplanen. Om PERC är ett numeriskt värde frÃĨn 0 till 100, tolkas det som procentandelen av block som ska skrubbas. Istället fÃļr en procentsats kan du specificera en plan: \`bad\` skrubbar dÃĨliga block, \`new\` skrubbar block som ännu inte skrubbats, och \`full\` skrubbar allt. Detta alternativ kan endast användas med \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Väljer den äldsta delen av arrayen att behandla i \`scrub\`. DAYS är den minsta ÃĨldern i dagar fÃļr ett block att skrubbas; standard är 10. Block markerade som dÃĨliga skrubbas alltid oavsett detta alternativ. Detta alternativ kan endast användas med \`scrub\`. .TP .B \-a, \-\-audit\-only I \`check\`, verifierar hashen av filerna utan att kontrollera paritetsdata. Om du bara är intresserad av att kontrollera filens data, kan detta alternativ avsevärt pÃĨskynda kontrollprocessen. Detta alternativ kan endast användas med \`check\`. .TP .B \-h, \-\-pre\-hash I \`sync\`, kÃļr en preliminär hash\-fas av all ny data fÃļr ytterligare verifiering innan paritetsberäkningen. Vanligtvis gÃļrs ingen preliminär hashning i \`sync\`, och den nya datan hashberäknas precis innan paritetsberäkningen när den läses fÃļr fÃļrsta gÃĨngen. Denna process sker när systemet är under tung belastning, med alla diskar snurrande och en upptagen CPU. Detta är ett extremt tillstÃĨnd fÃļr maskinen, och om den har ett latent hÃĨrdvaruproblem, kan tysta fel gÃĨ obemärkt fÃļrbi eftersom datan ännu inte har hashberäknats. FÃļr att undvika denna risk kan du aktivera \`pre\-hash\`\-läget fÃļr att fÃĨ all data läst tvÃĨ gÃĨnger fÃļr att säkerställa dess integritet. Detta alternativ verifierar ocksÃĨ filer som flyttats inom arrayen fÃļr att säkerställa att flyttoperationen lyckades och, om nÃļdvändigt, lÃĨter dig kÃļra en fix\-operation innan du fortsätter. Detta alternativ kan endast användas med \`sync\`. .TP .B \-i, \-\-import DIR Importerar frÃĨn den specificerade katalogen alla filer som raderats frÃĨn arrayen efter den senaste \`sync\`. Om du fortfarande har sÃĨdana filer, kan de användas av \`check\` och \`fix\` fÃļr att fÃļrbättra ÃĨterställningsprocessen. Filerna läses, inklusive i underkataloger, och identifieras oavsett deras namn. Detta alternativ kan endast användas med \`check\` och \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error Vid nÃĨgot fel, snurrar ner alla hanterade diskar innan den avslutas med en statuskod som inte är noll. Detta fÃļrhindrar att enheterna fÃļrblir aktiva och snurrar efter en avbruten operation, vilket hjälper till att undvika onÃļdig värmeuppbyggnad och strÃļm\- fÃļrbrukning. Använd detta alternativ fÃļr att säkerställa att diskar stoppas säkert även när ett kommando misslyckas. .TP .B \-w, \-\-bw\-limit RATE Tillämpar en global bandbreddsbegränsning fÃļr alla diskar. RATE är antalet byte per sekund. Du kan specificera en multiplikator som K, M eller G (t.ex. \-\-bw\-limit 1G). .TP .B \-t, \-\-tail STORLEK Begränsa fillistan till de som inte använder mer än den angivna slutstorleken pÃĨ paritetsdiskarna. Du kan använda multiplikatorer som K, M, G eller T (t.ex. \-\-tail 1G). Detta alternativ är endast giltigt när det används tillsammans med kommandot \`locate\`. .TP .B \-A, \-\-stats Aktiverar en utÃļkad statusvy som visar ytterligare information. Skärmen visar tvÃĨ diagram: Det fÃļrsta diagrammet visar antalet buffrade strippar fÃļr varje disk, tillsammans med filsÃļkvägen fÃļr filen som fÃļr närvarande används pÃĨ den disken. Vanligtvis kommer den lÃĨngsammaste disken att ha ingen buffert tillgänglig, vilket bestämmer den maximalt uppnÃĨeliga bandbredden. Det andra diagrammet visar procentandelen tid som spenderats i väntan under de senaste 100 sekunderna. Den lÃĨngsammaste disken fÃļrväntas orsaka stÃļrre delen av väntetiden, medan andra diskar bÃļr ha liten eller ingen väntetid eftersom de kan använda sina buffrade strippar. Detta diagram visar ocksÃĨ den tid som spenderats i väntan pÃĨ hash\- beräkningar och RAID\-beräkningar. Alla beräkningar kÃļrs parallellt med diskoperationer. DärfÃļr, sÃĨ länge det finns mätbar väntetid fÃļr minst en disk, indikerar det att CPU:n är snabb nog att hÃĨlla jämna steg med arbetsbelastningen. .TP .B \-Z, \-\-force\-zero Tvingar den osäkra operationen att synkronisera en fil med noll storlek som tidigare var icke\-noll. Om SnapRAID upptäcker ett sÃĨdant tillstÃĨnd, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du enkelt kan upptäcka när, efter en systemkrasch, vissa filer som användes trunkerades. Detta är ett mÃļjligt tillstÃĨnd i Linux med filsystemen ext3/ext4. Detta alternativ kan endast användas med \`sync\`. .TP .B \-E, \-\-force\-empty Tvingar den osäkra operationen att synkronisera en disk där alla ursprungliga filer saknas. Om SnapRAID upptäcker att alla filer som ursprungligen fanns pÃĨ disken saknas eller har skrivits om, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du enkelt kan upptäcka när ett datafilsystem inte är monterat. Detta alternativ kan endast användas med \`sync\`. .TP .B \-U, \-\-force\-uuid Tvingar den osäkra operationen att synkronisera, kontrollera och fixa med diskar som har ändrat sin UUID. Om SnapRAID upptäcker att vissa diskar har ändrat UUID, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du kan upptäcka när dina diskar är monterade pÃĨ fel monteringspunkter. Det är dock tillÃĨtet att ha en enda UUID\-ändring med enkel paritet, och fler med multipel paritet, eftersom detta är det normala fallet när man byter ut diskar efter en ÃĨterställning. Detta alternativ kan endast användas med \`sync\`, \`check\` eller \`fix\`. .TP .B \-D, \-\-force\-device Tvingar den osäkra operationen att fixa med otillgängliga diskar eller med diskar pÃĨ samma fysiska enhet. Till exempel, om du fÃļrlorade tvÃĨ datadisker och har en reservdisk fÃļr att ÃĨterställa endast den fÃļrsta, kan du ignorera den andra otillgängliga disken. Eller, om du vill ÃĨterställa en disk i det lediga utrymme som finns kvar pÃĨ en redan använd disk, dela samma fysiska enhet. Detta alternativ kan endast användas med \`fix\`. .TP .B \-N, \-\-force\-nocopy I \`sync\`, \`check\` och \`fix\`, inaktiverar heuristiken fÃļr kopieringsdetektering. Utan detta alternativ antar SnapRAID att filer med samma attribut, sÃĨsom namn, storlek och tidsstämpel, är kopior med samma data. Detta mÃļjliggÃļr identifiering av kopierade eller flyttade filer frÃĨn en disk till en annan och ÃĨteranvänder den redan beräknade hash\-informationen fÃļr att upptäcka tysta fel eller fÃļr att ÃĨterställa saknade filer. I vissa sällsynta fall kan detta beteende leda till falska positiva eller en lÃĨngsam process pÃĨ grund av mÃĨnga hash\-verifieringar, och detta alternativ lÃĨter dig lÃļsa sÃĨdana problem. Detta alternativ kan endast användas med \`sync\`, \`check\` och \`fix\`. .TP .B \-F, \-\-force\-full I \`sync\`, tvingar en fullständig omberäkning av pariteten. Detta alternativ kan användas när du lägger till en ny paritetsnivÃĨ eller om du ÃĨtergick till en gammal content\-fil med mer aktuell paritetsdata. Istället fÃļr att ÃĨterskapa pariteten frÃĨn grunden lÃĨter detta dig ÃĨteranvända hasharna som finns i content\-filen fÃļr att validera data och bibehÃĨlla dataskyddet under \`sync\`\-processen med hjälp av den befintliga paritetsdatan. Detta alternativ kan endast användas med \`sync\`. .TP .B \-R, \-\-force\-realloc I \`sync\`, tvingar en fullständig omallokering av filer och ombyggnad av pariteten. Detta alternativ kan användas fÃļr att helt omallokera alla filer, ta bort fragmentering, samtidigt som hasharna som finns i content\- filen ÃĨteranvänds fÃļr att validera data. Detta alternativ kan endast användas med \`sync\`. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte använda det. Du HAR INGET dataskydd under \`sync\`\-operationen. .TP .B \-W, \-\-force\-realloc\-tail STORLEK Fungerar som \-R, \-\-force\-realloc, men begränsat till den angivna slutdelen (de sista STORLEK byten) av varje paritetsfil. Den tvingar omallokering (flytt) av alla filfragment/block som fÃļr närvarande lagras i den slutsektionen, vilket gÃļr att de kan placeras var som helst i paritetsfilen/filerna där ledigt utrymme finns (inklusive befintliga hÃĨl). Huvudsyftet med detta alternativ är att minska paritetsfilens storlek pÃĨ disken. Om omallokeringen lyckas rensa hela slutsektionen (inga block är kvar som använder den), trunkeras paritetsfilen och det oanvända slututrymmet ÃĨtertas. Du kan använda multiplikatorer som K, M, G eller T (t.ex. \-\-force\-realloc\-tail 1G). Du kan använda locate \-t, \-\-tail fÃļr att i fÃļrväg veta vilka filer som pÃĨverkas. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte använda det. Du har INGET dataskydd under \`sync\`\-ÃĨtgärden fÃļr de berÃļrda filerna. .TP .B \-l, \-\-log FILE Skriver en detaljerad logg till den specificerade filen. Om detta alternativ inte specificeras, skrivs oväntade fel ut pÃĨ skärmen, vilket potentiellt kan leda till Ãļverdriven utdata i händelse av mÃĨnga fel. När \-l, \-\-log specificeras, skrivs endast fatala fel som fÃĨr SnapRAID att stoppa ut pÃĨ skärmen. Om sÃļkvägen bÃļrjar med \`>>\`, Ãļppnas filen i tilläggsläge. FÃļrekomster av \`%D\` och \`%T\` i namnet ersätts med datum och tid i formatet YYYYMMDD respektive HHMMSS. I Windows batch\-filer mÃĨste du dubblera \`%\`\-tecknet, t.ex. result\-%%D.log. FÃļr att använda \`>>\` mÃĨste du omsluta namnet i citattecken, t.ex. \`\[dq]>>result.log\[dq]\`. FÃļr att skicka ut loggen till standardutdata eller standardfel, kan du använda \`\[dq]>&1\[dq]\` respektive \`\[dq]>&2\[dq]\`. Se filen snapraid_log.txt eller man\-sidan fÃļr beskrivningar av logg\-taggar. .TP .B \-L, \-\-error\-limit NUMBER Anger en ny felgräns innan kÃļrningen stoppas. Som standard stoppar SnapRAID om det stÃļter pÃĨ mer än 100 input/output\-fel, vilket indikerar att en disk troligen hÃĨller pÃĨ att misslyckas. Detta alternativ pÃĨverkar \`sync\` och \`scrub\`, som tillÃĨts att fortsätta efter den fÃļrsta uppsättningen diskfel fÃļr att fÃļrsÃļka slutfÃļra sina operationer. Däremot stoppar \`check\` och \`fix\` alltid vid det fÃļrsta felet. .TP .B \-S, \-\-start BLKSTART BÃļrjar behandlingen frÃĨn det specificerade blocknumret. Detta kan vara användbart fÃļr att fÃļrsÃļka igen att kontrollera eller fixa specifika block i händelse av en skadad disk. Detta alternativ är främst fÃļr avancerad manuell ÃĨterställning. .TP .B \-B, \-\-count BLKCOUNT Behandlar endast det specificerade antalet block. Detta alternativ är främst fÃļr avancerad manuell ÃĨterställning. .TP .B \-C, \-\-gen\-conf CONTENT Genererar en dummy\-konfigurationsfil frÃĨn en befintlig content\-fil. Konfigurationsfilen skrivs till standardutdata och skriver inte Ãļver en befintlig fil. Denna konfigurationsfil innehÃĨller ocksÃĨ den information som behÃļvs fÃļr att rekonstruera diskmonteringspunkterna om du fÃļrlorar hela systemet. .TP .B \-v, \-\-verbose Skriver ut mer information pÃĨ skärmen. Om det specificeras en gÃĨng, skrivs exkluderade filer och ytterligare statistik ut. Detta alternativ har ingen effekt pÃĨ loggfilerna. .TP .B \-q, \-\-quiet Skriver ut mindre information pÃĨ skärmen. Om det specificeras en gÃĨng, tas fÃļrloppsindikatorn bort; tvÃĨ gÃĨnger, de pÃĨgÃĨende operationerna; tre gÃĨnger, informations\- meddelandena; fyra gÃĨnger, statusmeddelandena. Fatala fel skrivs alltid ut pÃĨ skärmen. Detta alternativ har ingen effekt pÃĨ loggfilerna. .TP .B \-H, \-\-help Skriver ut en kort hjälpskärm. .TP .B \-V, \-\-version Skriver ut programversionen. .SH KONFIGURATION SnapRAID kräver en konfigurationsfil fÃļr att veta var din disk\-array finns och var paritetsinformationen ska lagras. .PP I Unix används filen \`/usr/local/etc/snapraid.conf\` om den finns, annars \`/etc/snapraid.conf\`. I Windows används filen \`snapraid.conf\` i samma katalog som \`snapraid.exe\`. .PP Den mÃĨste innehÃĨlla fÃļljande alternativ (skiftlägeskänsligt): .SS parity FIL [,FIL] ... Definierar de filer som ska användas fÃļr att lagra paritetsinformationen. Pariteten mÃļjliggÃļr skydd frÃĨn ett enda disk\- fel, liknande RAID5. .PP Du kan specificera flera filer, som mÃĨste finnas pÃĨ olika diskar. När en fil inte kan växa mer, används nästa fil. Det totala tillgängliga utrymmet mÃĨste vara minst lika stort som den stÃļrsta datadisken i arrayen. .PP Du kan lägga till ytterligare paritetsfiler senare, men du kan inte ändra ordning pÃĨ eller ta bort dem. .PP Att hÃĨlla paritetsdiskarna reserverade fÃļr paritet säkerställer att de inte blir fragmenterade, vilket fÃļrbättrar prestandan. .PP I Windows lämnas 256 MB oanvänt pÃĨ varje disk fÃļr att undvika varningen om fulla diskar. .PP Detta alternativ är obligatoriskt och kan endast användas en gÃĨng. .SS (2,3,4,5,6)\-parity FIL [,FIL] ... Definierar de filer som ska användas fÃļr att lagra extra paritetsinformation. .PP FÃļr varje paritetsnivÃĨ som specificeras aktiveras en ytterligare skyddsnivÃĨ: .PD 0 .IP \(bu 2\-parity mÃļjliggÃļr RAID6 dubbel paritet. .IP \(bu 3\-parity mÃļjliggÃļr trippel paritet. .IP \(bu 4\-parity mÃļjliggÃļr fyrdubbel (fyra) paritet. .IP \(bu 5\-parity mÃļjliggÃļr penta (fem) paritet. .IP \(bu 6\-parity mÃļjliggÃļr hexa (sex) paritet. .PD .PP Varje paritetsnivÃĨ kräver närvaro av alla fÃļregÃĨende paritets\- nivÃĨer. .PP Samma Ãļverväganden som fÃļr alternativet \`parity\` gäller. .PP Dessa alternativ är valfria och kan endast användas en gÃĨng. .SS z\-parity FIL [,FIL] ... Definierar en alternativ fil och ett format fÃļr att lagra trippel paritet. .PP Detta alternativ är ett alternativ till \`3\-parity\`, främst avsett fÃļr lÃĨgpresterande processorer som ARM eller AMD Phenom, Athlon och Opteron som inte stÃļder SSSE3\-instruktionsuppsättningen. I sÃĨdana fall ger det bättre prestanda. .PP Detta format liknar, men är snabbare än, det som används av ZFS RAIDZ3. Liksom ZFS fungerar det inte utÃļver trippel paritet. .PP När du använder \`3\-parity\` kommer du att varnas om det rekommenderas att använda formatet \`z\-parity\` fÃļr prestandafÃļrbättring. .PP Det är mÃļjligt att konvertera frÃĨn ett format till ett annat genom att justera konfigurationsfilen med Ãļnskad z\-parity eller 3\-parity fil och använda \`fix\` fÃļr att ÃĨterskapa den. .SS content FIL Definierar den fil som ska användas fÃļr att lagra listan och checksummorna fÃļr alla filer som finns i din disk\-array. .PP Den kan placeras pÃĨ en disk som används fÃļr data, paritet eller nÃĨgon annan tillgänglig disk. Om du använder en datadisk exkluderas denna fil automatiskt frÃĨn \`sync\`\-processen. .PP Detta alternativ är obligatoriskt och kan användas flera gÃĨnger fÃļr att spara flera kopior av samma fil. .PP Du mÃĨste lagra minst en kopia fÃļr varje paritetsdisk som används plus en. Att använda ytterligare kopior skadar inte. .SS data NAMN KATALOG Definierar namnet och monteringspunkten fÃļr datadiskarna i arrayen. NAMN används fÃļr att identifiera disken och mÃĨste vara unikt. KATALOG är monteringspunkten fÃļr disken i filsystemet. .PP Du kan ändra monteringspunkten vid behov, sÃĨ länge du behÃĨller NAMN fixerat. .PP Du bÃļr använda ett alternativ fÃļr varje datadisk i arrayen. .PP Du kan byta namn pÃĨ en disk senare genom att ändra NAMN direkt i konfigurationsfilen och sedan kÃļra ett \`sync\`\-kommando. I händelse av namnbyte gÃļrs associationen med hjälp av den lagrade UUID:n fÃļr diskarna. .SS extra NAME DIR Definierar namn och monteringspunkt fÃļr ytterligare diskar som ska Ãļvervakas med kommandona \`smart\` och \`probe\`. .PP Detta är användbart fÃļr att Ãļvervaka diskar som inte ingÃĨr i arrayen men som krävs fÃļr att systemet ska fungera, till exempel startdisken. .PP Observera att sÃĨdana diskar inte pÃĨverkas av kommandona \`up\` och \`down\` eftersom de fÃļrväntas alltid snurra. .SS nohidden Exkluderar alla dolda filer och kataloger. I Unix är dolda filer de som bÃļrjar med \`.\`. I Windows är de de med det dolda attributet. .SS exclude/include MÖNSTER Definierar fil\- eller katalogmÃļnstren att exkludera eller inkludera i sync\-processen. Alla mÃļnster behandlas i den specificerade ordningen. .PP Om det fÃļrsta mÃļnstret som matchar är ett \`exclude\`\-mÃļnster, exkluderas filen. Om det är ett \`include\`\-mÃļnster, inkluderas filen. Om inget mÃļnster matchar, exkluderas filen om det sista mÃļnstret som specificerats är ett \`include\`\-mÃļnster, eller inkluderas om det sista mÃļnstret som specificerats är ett \`exclude\`\-mÃļnster. .PP Se avsnittet MÖNSTER fÃļr mer information om mÃļnster\- specifikationer. .PP Detta alternativ kan användas flera gÃĨnger. .SS blocksize STORLEK_I_KIBIBYTES Definierar den grundläggande blockstorleken i kibibytes fÃļr pariteten. En kibibyte är 1024 byte. .PP Standard blockstorlek är 256, vilket bÃļr fungera fÃļr de flesta fall. .PP VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte ändra detta värde. FÃļr att ändra detta värde i framtiden, kommer du att behÃļva ÃĨterskapa hela pariteten! .PP En anledning att använda en annan blockstorlek är om du har mÃĨnga smÃĨ filer, i storleksordningen miljoner. .PP FÃļr varje fil, även om den bara är nÃĨgra byte, allokeras ett helt block paritet, och med mÃĨnga filer kan detta leda till betydande oanvänt paritetsutrymme. När du helt fyller paritetsdisken, är du inte tillÃĨten att lägga till fler filer pÃĨ datadiskarna. Det bortkastade paritetsutrymmet ackumuleras dock inte Ãļver datadiskar. Bortkastat utrymme som härrÃļr frÃĨn ett hÃļgt antal filer pÃĨ en datadisk begränsar endast mängden data pÃĨ den datadisken, inte andra. .PP Som en approximation kan du anta att hälften av blockstorleken är bortkastad fÃļr varje fil. Till exempel, med 100 000 filer och en 256 KiB blockstorlek, kommer du att slÃļsa 12,8 GB paritet, vilket kan resultera i 12,8 GB mindre utrymme tillgängligt pÃĨ datadisken. .PP Du kan kontrollera mängden bortkastat utrymme pÃĨ varje disk med hjälp av \`status\`. Detta är mängden utrymme du mÃĨste lämna ledigt pÃĨ data\- diskarna eller använda fÃļr filer som inte ingÃĨr i arrayen. Om detta värde är negativt betyder det att du är nära att fylla pariteten, och det representerar det utrymme du fortfarande kan slÃļsa. .PP FÃļr att undvika detta problem kan du använda en stÃļrre partition fÃļr paritet. Om till exempel paritetspartitionen är 12,8 GB stÃļrre än datadiskarna, har du tillräckligt med extra utrymme fÃļr att hantera upp till 100 000 filer pÃĨ varje datadisk utan nÃĨgot bortkastat utrymme. .PP Ett trick fÃļr att fÃĨ en stÃļrre paritetspartition i Linux är att formatera den med kommandot: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP Detta resulterar i cirka 1,5% extra utrymme, ungefär 60 GB fÃļr en 4 TB\-disk, vilket mÃļjliggÃļr cirka 460 000 filer pÃĨ varje datadisk utan nÃĨgot bortkastat utrymme. .SS hashsize STORLEK_I_BYTE Definierar hash\-storleken i byte fÃļr de sparade blocken. .PP Standard hash\-storlek är 16 byte (128 bitar), vilket bÃļr fungera fÃļr de flesta fall. .PP VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte ändra detta värde. FÃļr att ändra detta värde i framtiden, kommer du att behÃļva ÃĨterskapa hela pariteten! .PP En anledning att använda en annan hash\-storlek är om ditt system har begränsat minne. Som en tumregel kräver SnapRAID vanligtvis 1 GiB RAM fÃļr varje 16 TB data i arrayen. .PP Specifikt, fÃļr att lagra hasharna av datan, kräver SnapRAID ungefär TS*(1+HS)/BS byte RAM, där TS är den totala storleken i byte av din disk\-array, BS är blockstorleken i byte och HS är hash\-storleken i byte. .PP Till exempel, med 8 diskar pÃĨ 4 TB, en blockstorlek pÃĨ 256 KiB (1 KiB = 1024 byte) och en hash\-storlek pÃĨ 16, fÃĨr du: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB .PD 0 .PD .PP Om du byter till en hash\-storlek pÃĨ 8 fÃĨr du: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB .PD 0 .PD .PP Om du byter till en blockstorlek pÃĨ 512 fÃĨr du: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB .PD 0 .PD .PP Om du byter till bÃĨde en hash\-storlek pÃĨ 8 och en blockstorlek pÃĨ 512 fÃĨr du: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB .PD 0 .PD .SS autosave STORLEK_I_GIGABYTES Sparar automatiskt tillstÃĨndet vid synkronisering eller skrubbning efter att den specificerade mängden GB har behandlats. Detta alternativ är användbart fÃļr att undvika att starta om lÃĨnga \`sync\`\- kommandon frÃĨn bÃļrjan om de avbryts av en maskinkrasch eller nÃĨgon annan händelse. .SS temp_limit TEMPERATUR_CELSIUS Anger den maximalt tillÃĨtna disk\-temperaturen i Celsius. När den specificeras, kontrollerar SnapRAID periodiskt temperaturen pÃĨ alla diskar med hjälp av verktyget smartctl. De aktuella disk\-temperaturerna visas medan SnapRAID är igÃĨng. Om nÃĨgon disk Ãļverskrider denna gräns, stoppas alla operationer och diskarna snurras ner (sätts i standby) under den tid som definieras av alternativet \`temp_sleep\`. Efter viloperioden ÃĨterupptas operationerna, och kan potentiellt pausas igen om temperaturgränsen nÃĨs ännu en gÃĨng. .PP Under drift analyserar SnapRAID ocksÃĨ värmekurvan fÃļr varje disk och uppskattar den lÃĨngsiktiga stabila temperaturen de fÃļrväntas nÃĨ om aktiviteten fortsätter. Uppskattningen utfÃļrs fÃļrst efter att disk\-temperaturen har Ãļkat fyra gÃĨnger, vilket säkerställer att tillräckligt med datapoäng finns tillgängliga fÃļr att fastställa en pÃĨlitlig trend. Denna fÃļrutsagda stabila temperatur visas inom parentes bredvid den aktuella värdet och hjälper till att bedÃļma om systemets kylning är tillräcklig. Denna uppskattade temperatur är endast fÃļr informationssyfte och har ingen effekt pÃĨ SnapRAIDs beteende. Programmens ÃĨtgärder baseras enbart pÃĨ de faktiska uppmätta disk\-temperaturerna. .PP FÃļr att utfÃļra denna analys behÃļver SnapRAID en referens fÃļr system\- temperaturen. Det fÃļrsÃļker fÃļrst läsa den frÃĨn tillgängliga hÃĨrdvaru\- sensorer. Om ingen system\-sensor kan nÃĨs, används den lägsta disk\- temperaturen som mättes vid start av kÃļrningen som en reservreferens. .PP Normalt visar SnapRAID endast temperaturen pÃĨ den hetaste disken. FÃļr att visa temperaturen pÃĨ alla diskar, använd alternativet \-A eller \-\-stats. .SS temp_sleep TID_I_MINUTER Anger standby\-tiden, i minuter, när temperaturgränsen har nÃĨtts. Under denna period fÃļrblir diskarna nedsnurrade. Standard är 5 minuter. .SS pool KATALOG Definierar poolningskatalogen där den virtuella vyn av disk\- arrayen skapas med hjälp av kommandot \`pool\`. .PP Katalogen mÃĨste redan existera. .SS share UNC_KATALOG Definierar Windows UNC\-sÃļkvägen som krävs fÃļr att fÃĨ ÃĨtkomst till diskarna pÃĨ distans. .PP Om detta alternativ specificeras, använder de symboliska länkarna som skapats i pool\- katalogen denna UNC\-sÃļkväg fÃļr att fÃĨ ÃĨtkomst till diskarna. Utan detta alternativ använder de genererade symboliska länkarna endast lokala sÃļkvägar, vilket inte tillÃĨter delning av pool\-katalogen Ãļver nätverket. .PP De symboliska länkarna bildas med hjälp av den specificerade UNC\-sÃļkvägen, lägger till disk\-namnet som specificeras i \`data\`\-alternativet, och lägger slutligen till filens katalog och namn. .PP Detta alternativ krävs endast fÃļr Windows. .SS smartctl DISK/PARITY ALTERNATIV... Definierar anpassade smartctl\-alternativ fÃļr att fÃĨ SMART\-attributen fÃļr varje disk. Detta kan krävas fÃļr RAID\-kontroller och vissa USB\- diskar som inte kan upptäckas automatiskt. Platsinnehavaren %s ersätts av enhetens namn, men är valfri fÃļr fixerade enheter som RAID\-kontroller. .PP DISK är samma disk\-namn som specificeras i \`data\`\-alternativet. PARITY är ett av paritetsnamnen: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` eller \`z\-parity\`. .PP I de specificerade ALTERNATIVEN ersätts strängen \`%s\` med enhetens namn. FÃļr RAID\-kontroller är enheten sannolikt fixerad, och du kanske inte behÃļver använda \`%s\`. .PP Se smartmontools dokumentation fÃļr mÃļjliga alternativ: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP Till exempel: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignorerar det specificerade SMART\-attributet vid beräkning av sannolikheten fÃļr diskfel. Detta alternativ är användbart om en disk rapporterar ovanliga eller vilseledande värden fÃļr ett visst attribut. .PP DISK är samma disk\-namn som specificeras i \`data\`\-alternativet. PARITY är ett av paritetsnamnen: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` eller \`z\-parity\`. Det speciella värdet * kan användas fÃļr att ignorera attributet pÃĨ alla diskar. .PP Till exempel, fÃļr att ignorera attributet \`Current Pending Sector Count\` pÃĨ alla diskar: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP FÃļr att ignorera det endast pÃĨ den fÃļrsta paritetsdisken: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Exempel Ett exempel pÃĨ en typisk konfiguration fÃļr Unix är: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Ett exempel pÃĨ en typisk konfiguration fÃļr Windows är: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH MÃļNSTER (PATTERN) MÃļnster ger ett flexibelt sätt att filtrera filer fÃļr inkludering eller exkludering. Genom att använda jokertecken kan du definiera regler som matchar specifika filnamn eller hela katalogstrukturer utan att lista varje sÃļkväg manuellt. .PP FrÃĨgetecknet \`?\` matchar valfritt enskilt tecken utom katalogavgränsaren. Detta gÃļr det användbart fÃļr att matcha filnamn med variabla tecken samtidigt som mÃļnstret hÃĨlls begränsat till en enda katalognivÃĨ. .PP Den enkla stjärnan \`*\` matchar valfri teckensekvens, men precis som frÃĨgetecknet korsar den aldrig kataloggränser. Den stannar vid snedstrecket, vilket gÃļr den lämplig fÃļr matchning inom en enskild sÃļkvägskomponent. Detta är det standardbeteende fÃļr jokertecken som är bekant frÃĨn skal\-globbing. .PP Den dubbla stjärnan \`**\` är mer kraftfull; den matchar valfri teckensekvens inklusive katalogavgränsare. Detta gÃļr att mÃļnster kan matcha Ãļver flera katalognivÃĨer. När \`**\` fÃļrekommer direkt i ett mÃļnster kan det matcha noll eller fler tecken inklusive snedstreck mellan den omkringliggande bokstavliga texten. .PP Den viktigaste användningen av \`**\` är i den speciella formen \`/**/\`. Detta matchar noll eller flera kompletta katalognivÃĨer, vilket gÃļr det mÃļjligt att matcha filer pÃĨ valfritt djup i ett katalogträd utan att känna till den exakta sÃļkvägsstrukturen. Till exempel matchar mÃļnstret \`src/**/main.js\` filerna \`src/main.js\` (hoppar Ãļver noll kataloger), \`src/ui/main.js\` (hoppar Ãļver en katalog) och \`src/ui/components/main.js\` (hoppar Ãļver tvÃĨ kataloger). .PP Teckenklasser som använder hakparenteser \`[]\` matchar ett enskilt tecken frÃĨn en angiven uppsättning eller ett intervall. Precis som de andra mÃļnstren fÃļr enskilda tecken matchar de inte katalogavgränsare. Klasser stÃļder intervall och negering med ett utropstecken. .PP Den grundläggande skillnaden att komma ihÃĨg är att \`*\`, \`?\` och teckenklasser alla respekterar kataloggränser och endast matchar inom en enskild sÃļkvägskomponent, medan \`**\` är det enda mÃļnstret som kan matcha Ãļver katalogavgränsare. .PP Det finns fyra olika typer av mÃļnster: .TP .B FILE Väljer valfri fil med namnet FILE. Detta mÃļnster gäller endast filer, inte kataloger. .TP .B DIR/ Väljer valfri katalog med namnet DIR och allt innehÃĨll. Detta mÃļnster gäller endast kataloger, inte filer. .TP .B /PATH/FILE Väljer den exakt angivna filsÃļkvägen. Detta mÃļnster gäller endast filer, inte kataloger. .TP .B /PATH/DIR/ Väljer den exakt angivna katalogsÃļkvägen och allt innehÃĨll. Detta mÃļnster gäller endast kataloger, inte filer. .PP När du specificerar en absolut sÃļkväg som bÃļrjar med /, tillämpas den vid array\-rotkatalogen, inte den lokala filsystemets rotkatalog. .PP I Windows kan du använda bakÃĨtsnedstrecket \\ istället fÃļr framÃĨtsnedstrecket /. Windows systemkataloger, junction points, monteringspunkter och andra Windows speciella kataloger behandlas som filer, vilket innebär att fÃļr att exkludera dem mÃĨste du använda en fil\-regel, inte en katalog\-regel. .PP Om filnamnet innehÃĨller tecknet \`*\`, \`?\`, \`[\`, eller \`]\`, mÃĨste du undvika det fÃļr att fÃļrhindra att det tolkas som ett globbing\-tecken. I Unix är undvikande\-tecknet \`\\\`; i Windows är det \`^\`. När mÃļnstret är pÃĨ kommandoraden mÃĨste du dubbla undvikande\- tecknet fÃļr att fÃļrhindra att det tolkas av kommandoskalet. .PP I konfigurationsfilen kan du använda olika strategier fÃļr att filtrera filerna som ska behandlas. Det enklaste tillvägagÃĨngssättet är att endast använda \`exclude\`\-regler fÃļr att ta bort alla filer och kataloger du inte vill behandla. Till exempel: .PP .RS 4 # Exkluderar alla filer som heter \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exkluderar rotkatalogen \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Exkluderar alla underkataloger som heter \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP Det motsatta tillvägagÃĨngssättet är att definiera endast de filer du vill behandla, med endast \`include\`\-regler. Till exempel: .PP .RS 4 # Inkluderar endast vissa kataloger .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP Det sista tillvägagÃĨngssättet är att blanda \`exclude\`\- och \`include\`\-regler. I detta fall är ordningen pÃĨ reglerna viktig. Tidigare regler har fÃļreträde framfÃļr senare. FÃļr att fÃļrenkla kan du lista alla \`exclude\`\-regler fÃļrst och sedan alla \`include\`\-regler. Till exempel: .PP .RS 4 # Exkluderar alla filer som heter \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Exkluderar alla underkataloger som heter \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Inkluderar endast vissa kataloger .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP PÃĨ kommandoraden, med hjälp av alternativet \-f, kan du bara använda \`include\`\- mÃļnster. Till exempel: .PP .RS 4 # Kontrollerar endast .mp3\-filerna. .PD 0 .PP .PD # I Unix, använd citattecken fÃļr att undvika globbing\-expansion av skalet. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP I Unix, när du använder globbing\-tecken pÃĨ kommandoraden, mÃĨste du citattecken dem fÃļr att fÃļrhindra att skalet expanderar dem. .SH IGNORERA FILER (IGNORE FILE) UtÃļver de globala reglerna i konfigurationsfilen kan du placera \`.snapraidignore\`\-filer i vilken katalog som helst i arrayen fÃļr att definiera decentraliserade exkluderingsregler. .PP Regler som definieras i \`.snapraidignore\` tillämpas efter reglerna i konfigurationsfilen. Detta innebär att de har hÃļgre prioritet och kan användas fÃļr att exkludera filer som tidigare inkluderats av den globala konfigurationen. I praktiken innebär det att om en lokal regel matchar, sÃĨ exkluderas filen oavsett de globala inkluderingsinställningarna. .PP MÃļnsterlogiken i \`.snapraidignore\` speglar den globala konfigurationen men fÃļrankrar mÃļnstren till den katalog där filen finns: .TP .B FILE Väljer alla filer med namnet FILE i denna katalog eller under. Detta fÃļljer samma globbing\-regler som det globala mÃļnstret. .TP .B DIR/ Väljer alla kataloger med namnet DIR och allt innehÃĨll, som finns i denna katalog eller under. .TP .B /PATH/FILE Väljer den exakt angivna filen relativt platsen fÃļr \`.snapraidignore\`\-filen. .TP .B /PATH/DIR/ Väljer den exakt angivna katalogen och allt innehÃĨll, relativt platsen fÃļr \`.snapraidignore\`\-filen. .PP Till skillnad frÃĨn den globala konfigurationen stÃļder \`.snapraidignore\`\-filer endast exkluderingsregler; du kan inte använda \`include\`\-mÃļnster eller negation (!). .PP Till exempel, om du har en \`.snapraidignore\` i \`/mnt/disk1/projects/\`: .PP .RS 4 # Exkluderar ENDAST /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Exkluderar alla kataloger med namnet \`build\` inuti projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Exkluderar alla .tmp\-filer inuti projects/ eller dess undermappar .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH INNEHÃĨLL (CONTENT) SnapRAID lagrar listan och checksummorna fÃļr dina filer i content\-filen. .PP Det är en binär fil som listar alla filer som finns i din disk\-array, tillsammans med alla checksummor fÃļr att verifiera deras integritet. .PP Denna fil läses och skrivs av kommandona \`sync\` och \`scrub\` och läses av kommandona \`fix\`, \`check\` och \`status\`. .SH PARITET (PARITY) SnapRAID lagrar paritetsinformationen fÃļr din array i parity\- filerna. .PP Dessa är binära filer som innehÃĨller den beräknade pariteten fÃļr alla block definierade i \`content\`\-filen. .PP Dessa filer läses och skrivs av kommandona \`sync\` och \`fix\` och läses endast av kommandona \`scrub\` och \`check\`. .SH KODNING SnapRAID i Unix ignorerar all kodning. Det läser och lagrar filnamnen med samma kodning som används av filsystemet. .PP I Windows konverteras alla namn som läses frÃĨn filsystemet och behandlas i UTF\-8\-format. .PP FÃļr att fÃĨ filnamn utskrivna korrekt mÃĨste du ställa in Windows\- konsolen till UTF\-8\-läge med kommandot \`chcp 65001\` och använda ett TrueType\-typsnitt som \`Lucida Console\` som konsoltypsnitt. Detta pÃĨverkar endast de utskrivna filnamnen; om du omdirigerar konsolutdata till en fil, är den resulterande filen alltid i UTF\-8\-format. .SH UPPHOVSRäTT (COPYRIGHT) Denna fil är Copyright (C) 2025 Andrea Mazzoleni .SH SE ÄVEN (SEE ALSO) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-sv.d000066400000000000000000001761351522717156100164350ustar00rootroot00000000000000Name{number} snapraid - SnapRAID Säkerhetskopiering fÃļr Disk-arrayer Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Beskrivning SnapRAID är ett säkerhetskopieringsprogram designat fÃļr disk-arrayer, som lagrar paritetsinformation fÃļr dataÃĨterställning vid upp till sex diskfel. SnapRAID är i fÃļrsta hand avsett fÃļr hemmamediabibliotek med stora, sällan ändrade filer, och erbjuder flera funktioner: * Du kan använda diskar som redan är fyllda med filer utan att behÃļva formatera om dem, och du fÃĨr ÃĨtkomst till dem som vanligt. * All din data hashberäknas fÃļr att säkerställa dataintegritet och fÃļrhindra tyst korruption. * När antalet felaktiga diskar Ãļverskrider paritetsantalet, begränsas datafÃļrlusten till de drabbade diskarna; data pÃĨ andra diskar fÃļrblir ÃĨtkomlig. * Om du oavsiktligt raderar filer pÃĨ en disk är ÃĨterställning mÃļjlig. * Diskar kan ha olika storlekar. * Du kan lägga till diskar när som helst. * SnapRAID lÃĨser inte in din data; du kan sluta använda det när som helst utan omformatering eller dataflytt. * FÃļr att fÃĨ ÃĨtkomst till en fil behÃļver endast en enda disk snurra, vilket sparar strÃļm och minskar buller. FÃļr mer information, besÃļk den officiella SnapRAID-webbplatsen: :https://www.snapraid.it/ Begränsningar SnapRAID är en hybrid mellan ett RAID- och ett säkerhetskopieringsprogram, som syftar till att kombinera de bästa fÃļrdelarna med bÃĨda. Den har dock vissa begränsningar som du bÃļr Ãļverväga innan du använder den. Huvudbegränsningen är att om en disk misslyckas och du inte nyligen har synkat, kanske du inte kan ÃĨterställa fullständigt. Mer specifikt, kanske du inte kan ÃĨterställa upp till storleken pÃĨ de ändrade eller raderade filerna sedan den senaste synkroniseringsoperationen. Detta inträffar även om de ändrade eller raderade filerna inte finns pÃĨ den felaktiga disken. Det är därfÃļr SnapRAID passar bättre fÃļr data som sällan ändras. Å andra sidan fÃļrhindrar nyligen tillagda filer inte ÃĨterställning av redan befintliga filer. Du kommer bara att fÃļrlora de nyligen tillagda filerna om de finns pÃĨ den felaktiga disken. Andra SnapRAID-begränsningar är: * Med SnapRAID har du fortfarande separata filsystem fÃļr varje disk. Med RAID fÃĨr du ett enda stort filsystem. * SnapRAID stripas inte data. Med RAID fÃĨr du en hastighetsÃļkning med striping. * SnapRAID stÃļder inte ÃĨterställning i realtid. Med RAID behÃļver du inte sluta arbeta när en disk misslyckas. * SnapRAID kan bara ÃĨterställa data frÃĨn ett begränsat antal diskfel. Med en säkerhetskopia kan du ÃĨterställa frÃĨn ett fullständigt fel pÃĨ hela disk-arrayen. * Endast filnamn, tidsstämplar, symboliska länkar och hÃĨrda länkar sparas. BehÃļrigheter, ägarskap och utÃļkade attribut sparas inte. Kom igÃĨng FÃļr att använda SnapRAID mÃĨste du fÃļrst välja en disk i din disk-array som ska dediceras till `parity`-information. Med en disk fÃļr paritet, kommer du att kunna ÃĨterställa frÃĨn ett enda diskfel, liknande RAID5. Om du vill ÃĨterställa frÃĨn fler diskfel, liknande RAID6, mÃĨste du reservera ytterligare diskar fÃļr paritet. Varje ytterligare paritetsdisk mÃļjliggÃļr ÃĨterställning frÃĨn ett diskfel till. Som paritetsdiskar mÃĨste du välja de stÃļrsta diskarna i arrayen, eftersom paritetsinformationen kan växa till storleken av den stÃļrsta datadisken i arrayen. Dessa diskar kommer att dediceras till att lagra `parity`-filerna. Du bÃļr inte lagra din data pÃĨ dem. Sedan mÃĨste du definiera de `data`-diskar som du vill skydda med SnapRAID. Skyddet är mer effektivt om dessa diskar innehÃĨller data som sällan ändras. Av denna anledning är det bäst att INTE inkludera Windows C:\-disken eller Unix /home, /var och /tmp katalogerna. Listan Ãļver filer sparas i `content`-filerna, som vanligtvis lagras pÃĨ data-, paritets- eller startdiskarna. Denna fil innehÃĨller detaljerna fÃļr din säkerhetskopia, inklusive alla checksummor fÃļr att verifiera dess integritet. `content`-filen lagras i flera kopior, och varje kopia mÃĨste finnas pÃĨ en annan disk fÃļr att säkerställa att, även vid flera diskfel, minst en kopia är tillgänglig. Anta till exempel att du bara är intresserad av en paritetsnivÃĨ av skydd, och dina diskar finns pÃĨ: :/mnt/diskp <- vald disk fÃļr paritet :/mnt/disk1 <- fÃļrsta disken att skydda :/mnt/disk2 <- andra disken att skydda :/mnt/disk3 <- tredje disken att skydda Du mÃĨste skapa konfigurationsfilen /etc/snapraid.conf med fÃļljande alternativ: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Om du använder Windows bÃļr du använda Windows sÃļkvägsformat, med enhetsbeteckningar och omvända snedstreck istället fÃļr snedstreck. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Om du har mÃĨnga diskar och fÃĨr slut pÃĨ enhetsbeteckningar kan du montera diskar direkt i undermappar. Se: :https://www.google.com/search?q=Windows+mount+point Vid denna punkt är du redo att kÃļra kommandot `sync` fÃļr att bygga paritetsinformationen. :snapraid sync Denna process kan ta flera timmar fÃļrsta gÃĨngen, beroende pÃĨ storleken pÃĨ datan som redan finns pÃĨ diskarna. Om diskarna är tomma är processen omedelbar. Du kan stoppa det när som helst genom att trycka Ctrl+C, och vid nästa kÃļrning ÃĨterupptas det där det avbrÃļts. När detta kommando är klart är din data SÄKER. Nu kan du bÃļrja använda din array som du vill och periodiskt uppdatera paritetsinformationen genom att kÃļra kommandot `sync`. Skrubbning (Scrubbing) FÃļr att periodiskt kontrollera data och paritet fÃļr fel kan du kÃļra kommandot `scrub`. :snapraid scrub Detta kommando jämfÃļr data i din array med den hash som beräknades under kommandot `sync` fÃļr att verifiera integriteten. Varje kÃļrning av kommandot kontrollerar ungefär 8% av arrayen, exklusive data som redan skrubbats under de fÃļregÃĨende 10 dagarna. Du kan använda alternativet -p, --plan fÃļr att specificera en annan mängd och alternativet -o, --older-than fÃļr att specificera en annan ÃĨlder i dagar. Till exempel, fÃļr att kontrollera 5% av arrayen fÃļr block äldre än 20 dagar, använd: :snapraid -p 5 -o 20 scrub Om tysta eller input/output-fel hittas under processen, markeras de motsvarande blocken som dÃĨliga i `content`-filen och listas i kommandot `status`. :snapraid status FÃļr att fixa dem kan du använda kommandot `fix`, filtrera efter dÃĨliga block med alternativet -e, --filter-error: :snapraid -e fix Vid nästa `scrub` kommer felen att fÃļrsvinna frÃĨn `status`-rapporten om de verkligen är fixade. FÃļr att gÃļra det snabbare kan du använda -p bad fÃļr att skrubba endast block markerade som dÃĨliga. :snapraid -p bad scrub Att kÃļra `scrub` pÃĨ en osynkad array kan rapportera fel orsakade av borttagna eller modifierade filer. Dessa fel rapporteras i `scrub`- utdata, men de relaterade blocken markeras inte som dÃĨliga. Poolning Obs: Poolningsfunktionen som beskrivs nedan har ersatts av verktyget mergerfs, som nu är det rekommenderade alternativet fÃļr Linux-användare i SnapRAID-communityt. Mergefs ger ett mer flexibelt och effektivt sätt att poola flera enheter till en enda enhetlig monteringspunkt, vilket mÃļjliggÃļr sÃļmlÃļs ÃĨtkomst till filer Ãļver din array utan att fÃļrlita sig pÃĨ symboliska länkar. Det integreras väl med SnapRAID fÃļr paritetsskydd och används ofta i installationer som OpenMediaVault (OMV) eller anpassade NAS-konfigurationer. FÃļr att visa alla filer i din array i samma katalogträd, kan du aktivera funktionen `pooling`. Den skapar en skrivskyddad virtuell vy av alla filer i din array med hjälp av symboliska länkar. Du kan konfigurera `pooling`-katalogen i konfigurationsfilen med: :pool /pool eller, om du använder Windows, med: :pool C:\pool och kÃļr sedan kommandot `pool` fÃļr att skapa eller uppdatera den virtuella vyn. :snapraid pool Om du använder en Unix-plattform och vill dela denna katalog Ãļver nätverket till antingen Windows- eller Unix-maskiner, bÃļr du lägga till fÃļljande alternativ till din /etc/samba/smb.conf: :# I den globala sektionen av smb.conf :unix extensions = no :# I delningssektionen av smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes I Windows kräver delning av symboliska länkar Ãļver ett nätverk att klienter lÃļser dem pÃĨ distans. FÃļr att aktivera detta mÃĨste du, fÃļrutom att dela pool-katalogen, även dela alla diskar oberoende, med hjälp av de disk-namn som definieras i konfigurationsfilen som delningspunkter. Du mÃĨste ocksÃĨ specificera i alternativet `share` i konfigurationsfilen den Windows UNC-sÃļkväg som fjärrklienter behÃļver använda fÃļr att fÃĨ ÃĨtkomst till dessa delade diskar. Till exempel, om du arbetar frÃĨn en server som heter `darkstar`, kan du använda alternativen: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar och dela fÃļljande kataloger Ãļver nätverket: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array fÃļr att tillÃĨta fjärrklienter att fÃĨ ÃĨtkomst till alla filer pÃĨ \\darkstar\pool. Du kan ocksÃĨ behÃļva konfigurera fjärrklienter fÃļr att mÃļjliggÃļra ÃĨtkomst till fjärrsymboliska länkar med kommandot: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Ångra radering (Undeleting) SnapRAID fungerar mer som ett säkerhetskopieringsprogram än ett RAID-system, och det kan användas fÃļr att ÃĨterställa eller ÃĨngra radering av filer till deras tidigare tillstÃĨnd med hjälp av alternativet -f, --filter: :snapraid fix -f FIL eller fÃļr en katalog: :snapraid fix -f KATALOG/ Du kan ocksÃĨ använda det fÃļr att ÃĨterställa endast oavsiktligt raderade filer inuti en katalog med hjälp av alternativet -m, --filter-missing, som ÃĨterställer endast saknade filer, och lämnar alla andra orÃļrda. :snapraid fix -m -f KATALOG/ Eller fÃļr att ÃĨterställa alla raderade filer pÃĨ alla enheter med: :snapraid fix -m Återställning Det värsta har hänt, och du har fÃļrlorat en eller flera diskar! FÅ INTE PANIK! Du kommer att kunna ÃĨterställa dem! Det fÃļrsta du mÃĨste gÃļra är att undvika ytterligare ändringar i din disk-array. Inaktivera alla fjärranslutningar till den och alla schemalagda processer, inklusive alla schemalagda SnapRAID nattliga sync- eller scrub-kÃļrningar. Fortsätt sedan med fÃļljande steg. STEG 1 -> Omkonfigurera Du behÃļver lite utrymme fÃļr att ÃĨterställa, helst pÃĨ ytterligare reservdiskar, men en extern USB-disk eller fjärrdisk räcker. Ändra SnapRAID-konfigurationsfilen fÃļr att fÃĨ alternativet `data` eller `parity` fÃļr den felaktiga disken att peka pÃĨ en plats med tillräckligt tomt utrymme fÃļr att ÃĨterställa filerna. Om till exempel disk `d1` har misslyckats, ändra frÃĨn: :data d1 /mnt/disk1/ till: :data d1 /mnt/new_spare_disk/ Om disken som ska ÃĨterställas är en paritetsdisk, uppdatera det lämpliga `parity`- alternativet. Om du har flera felaktiga diskar, uppdatera alla deras konfigurationsalternativ. STEG 2 -> Fixa KÃļr kommandot fix och lagra loggen i en extern fil med: :snapraid -d NAMN -l fix.log fix Där NAMN är namnet pÃĨ disken, till exempel `d1` i vÃĨrt tidigare exempel. Om disken som ska ÃĨterställas är en paritetsdisk, använd namnen `parity`, `2-parity`, etc. Om du har flera felaktiga diskar, använd flera -d-alternativ fÃļr att specificera alla av dem. Detta kommando kommer att ta lÃĨng tid. Se till att du har nÃĨgra gigabyte ledigt fÃļr att lagra fix.log-filen. KÃļr den frÃĨn en disk med tillräckligt med ledigt utrymme. Nu har du ÃĨterställt allt som är ÃĨterställningsbart. Om vissa filer är delvis eller helt icke-ÃĨterställningsbara, kommer de att dÃļpas om genom att lägga till tillägget `.unrecoverable`. Du kan hitta en detaljerad lista Ãļver alla icke-ÃĨterställningsbara block i fix.log-filen genom att kontrollera alla rader som bÃļrjar med `unrecoverable:`. Om du inte är nÃļjd med ÃĨterställningen kan du fÃļrsÃļka igen hur mÃĨnga gÃĨnger du vill. Om du till exempel har tagit bort filer frÃĨn arrayen efter den senaste `sync`, kan detta leda till att vissa filer inte ÃĨterställs. I detta fall kan du fÃļrsÃļka igen `fix` med alternativet -i, --import, specificera var dessa filer nu finns fÃļr att inkludera dem igen i ÃĨterställningsprocessen. Om du är nÃļjd med ÃĨterställningen kan du fortsätta, men notera att efter synkronisering kan du inte fÃļrsÃļka igen kommandot `fix` längre! STEG 3 -> Kontrollera Som en fÃļrsiktighetsÃĨtgärd kan du nu kÃļra ett `check`-kommando fÃļr att säkerställa att allt är korrekt pÃĨ den ÃĨterställda disken. :snapraid -d NAMN -a check Där NAMN är namnet pÃĨ disken, till exempel `d1` i vÃĨrt tidigare exempel. Alternativen -d och -a talar om fÃļr SnapRAID att endast kontrollera den specificerade disken och ignorera all paritetsdata. Detta kommando kommer att ta lÃĨng tid, men om du inte är alltfÃļr fÃļrsiktig, kan du hoppa Ãļver det. STEG 4 -> Synkronisera KÃļr kommandot `sync` fÃļr att synkronisera arrayen igen med den nya disken. :snapraid sync Om allt är ÃĨterställt är detta kommando omedelbart. Kommandon SnapRAID tillhandahÃĨller nÃĨgra enkla kommandon som lÃĨter dig: * Skriva ut statusen fÃļr arrayen -> `status` * Kontrollera diskarna -> `smart`, `probe`, `up`, `down` * GÃļra en säkerhetskopia/Ãļgonblicksbild -> `sync` * Periodiskt kontrollera data -> `scrub` * Återställa den senaste säkerhetskopian/Ãļgonblicksbilden -> `fix`. Kommandon mÃĨste skrivas med gemener. status Skriver ut en sammanfattning av tillstÃĨndet fÃļr disk-arrayen. Det inkluderar information om paritetsfragmentering, hur gamla blocken är utan kontroll, och alla registrerade tysta fel som pÃĨträffats under skrubbning. Informationen som presenteras hänvisar till den senaste tidpunkten du kÃļrde `sync`. Senare modifieringar beaktas inte. Om dÃĨliga block upptäcktes, listas deras blocknummer. FÃļr att fixa dem kan du använda kommandot `fix -e`. Det visar ocksÃĨ ett diagram som representerar den senaste tidpunkten dÃĨ varje block skrubbades eller synkroniserades. Skrubbade block visas med `*`, block synkroniserade men ännu inte skrubbade med `o`. Inget ändras. smart Skriver ut en SMART-rapport Ãļver alla diskar i systemet. Det inkluderar en uppskattning av sannolikheten fÃļr fel under det kommande ÃĨret, vilket gÃļr att du kan planera underhÃĨllsersättningar av diskar som visar misstänkta attribut. Denna sannolikhetsuppskattning erhÃĨlls genom att korrelera SMART-attributen fÃļr diskarna med Backblaze-data som finns tillgänglig pÃĨ: :https://www.backblaze.com/hard-drive-test-data.html Om SMART rapporterar att en disk hÃĨller pÃĨ att misslyckas, skrivs `FAIL` eller `PREFAIL` ut fÃļr den disken, och SnapRAID returnerar med ett fel. I detta fall rekommenderas omedelbar ersättning av disken starkt. Andra mÃļjliga statussträngar är: logfail - Tidigare var vissa attribut lägre än trÃļskelvärdet. logerr - Enhetens fellogg innehÃĨller fel. selferr - Enhetens självtestlogg innehÃĨller fel. Om alternativet -v, --verbose specificeras, tillhandahÃĨlls en djupare statistisk analys. Denna analys kan hjälpa dig att bestämma om du behÃļver mer eller mindre paritet. Detta kommando använder verktyget `smartctl` och är ekvivalent med att kÃļra `smartctl -a` pÃĨ alla enheter. Om dina enheter inte upptäcks automatiskt korrekt kan du specificera ett anpassat kommando med hjälp av alternativet `smartctl` i konfigurations- filen. Inget ändras. probe Skriver ut STRÖM-tillstÃĨndet fÃļr alla diskar i systemet. `Standby` betyder att disken inte snurrar. `Active` betyder att disken snurrar. Detta kommando använder verktyget `smartctl` och är ekvivalent med att kÃļra `smartctl -n standby -i` pÃĨ alla enheter. Om dina enheter inte upptäcks automatiskt korrekt kan du specificera ett anpassat kommando med hjälp av alternativet `smartctl` i konfigurations- filen. Inget ändras. up Snurrar upp alla diskar i arrayen. Du kan snurra upp endast specifika diskar med hjälp av alternativet -d, --filter-disk. Att snurra upp alla diskar samtidigt kräver mycket strÃļm. Se till att din strÃļmfÃļrsÃļrjning kan klara det. Inget ändras. down Snurrar ner alla diskar i arrayen. Detta kommando använder verktyget `smartctl` och är ekvivalent med att kÃļra `smartctl -s standby,now` pÃĨ alla enheter. Du kan snurra ner endast specifika diskar med hjälp av alternativet -d, --filter-disk alternativet. FÃļr att automatiskt snurra ner vid fel kan du använda alternativet -s, --spin-down-on-error med alla andra kommandon, vilket är ekvivalent med att kÃļra `down` manuellt när ett fel inträffar. Inget ändras. diff Listar alla filer som modifierats sedan den senaste `sync` och som behÃļver fÃĨ sin paritetsdata omberäknad. Detta kommando kontrollerar inte filens data, utan endast filens tidsstämpel, storlek och inode. Efter att ha listat alla ändrade filer presenteras en sammanfattning av ändringarna, grupperade efter: equal - Filer ofÃļrändrade frÃĨn tidigare. added - Filer tillagda som inte fanns tidigare. removed - Filer borttagna. updated - Filer med en annan storlek eller tidsstämpel, vilket innebär att de modifierades. moved - Filer flyttade till en annan katalog pÃĨ samma disk. De identifieras genom att ha samma namn, storlek, tidsstämpel och inode, men en annan katalog. copied - Filer som kopierats pÃĨ samma eller en annan disk där originalfilen fortfarande finns kvar. De identifieras genom att ha samma namn, storlek och tidsstämpel. Om tidsstämpeln fÃļr undersekunder är noll mÃĨste hela sÃļkvägen matcha fÃļr att identifieras, inte bara namnet. relocated - Filer som flyttats pÃĨ samma eller en annan disk där originalet har fÃļrsvunnit. De identifieras genom att ha samma namn, storlek och tidsstämpel. Om tidsstämpeln fÃļr undersekunder är noll mÃĨste hela sÃļkvägen matcha fÃļr att identifieras. Till skillnad frÃĨn 'moved' filer pÃĨ samma disk har omlokaliserade filer en annan inode. restored - Filer med en annan inode men matchande katalog, namn, storlek och tidsstämpel. Dessa är vanligtvis filer som ÃĨterställts efter att ha raderats. Om en `sync` krävs är processens returkod 2, istället fÃļr standard 0. Returkoden 1 används fÃļr ett generiskt feltillstÃĨnd. Inget ändras. sync Uppdaterar paritetsinformationen. Alla modifierade filer i disk-arrayen läses, och motsvarande paritets- data uppdateras. Du kan stoppa denna process när som helst genom att trycka Ctrl+C, utan att fÃļrlora det arbete som redan utfÃļrts. Vid nästa kÃļrning kommer `sync`-processen att ÃĨterupptas där den avbrÃļts. Om tysta eller input/output-fel hittas under processen, markeras de motsvarande blocken som dÃĨliga. Filer identifieras med sÃļkväg och/eller inode och kontrolleras med storlek och tidsstämpel. Om filstorleken eller tidsstämpeln skiljer sig ÃĨt, beräknas paritetsdata om fÃļr hela filen. Om filen flyttas eller dÃļps om pÃĨ samma disk, samtidigt som samma inode behÃĨlls, beräknas inte pariteten om. Om filen flyttas till en annan disk, beräknas pariteten om, men den tidigare beräknade hash-informationen behÃĨlls. `content`- och `parity`-filerna modifieras vid behov. Filerna i arrayen modifieras INTE. scrub Skrubbar arrayen och sÃļker efter tysta eller input/output-fel i data- och paritetsdiskar. Varje anrop kontrollerar ungefär 8% av arrayen, exklusive data som redan skrubbats under de senaste 10 dagarna. Detta innebär att skrubbning en gÃĨng i veckan säkerställer att varje bit data kontrolleras minst en gÃĨng var tredje mÃĨnad. Du kan definiera en annan skrubbplan eller mängd med hjälp av alternativet -p, --plan som accepterar: bad - Skrubbar block markerade som dÃĨliga. new - Skrubbar nyligen synkroniserade block som ännu inte skrubbats. full - Skrubbar allt. 0-100 - Skrubbar den specificerade procentandelen av block. Om du specificerar en procentsats kan du ocksÃĨ använda alternativet -o, --older-than fÃļr att definiera hur gammalt blocket ska vara. De äldsta blocken skrubbas fÃļrst, vilket säkerställer en optimal kontroll. Om du bara vill skrubba de nyligen synkroniserade blocken som ännu inte skrubbats, använd alternativet `-p new`. FÃļr att fÃĨ detaljer om skrubbstatusen, använd kommandot `status`. FÃļr alla tysta eller input/output-fel som hittas, markeras de motsvarande blocken som dÃĨliga i `content`-filen. Dessa dÃĨliga block listas i `status` och kan fixas med `fix -e`. Efter fixningen, vid nästa skrubb, kommer de att kontrolleras igen, och om de befinns korrigerade, tas det dÃĨliga märket bort. FÃļr att skrubba endast de dÃĨliga blocken kan du använda kommandot `scrub -p bad`. Det rekommenderas att kÃļra `scrub` endast pÃĨ en synkroniserad array fÃļr att undvika rapporterade fel orsakade av osynkad data. Dessa fel känns igen som att de inte är tysta fel, och blocken markeras inte som dÃĨliga, men sÃĨdana fel rapporteras i kommandots utdata. `content`-filen modifieras fÃļr att uppdatera tiden fÃļr den senaste kontrollen fÃļr varje block och fÃļr att markera dÃĨliga block. `parity`-filerna modifieras INTE. Filerna i arrayen modifieras INTE. fix Fixar alla filer och paritetsdata. Alla filer och paritetsdata jämfÃļrs med Ãļgonblicksbilds- tillstÃĨndet som sparades i den senaste `sync`. Om en skillnad hittas, ÃĨterställs den till det lagrade ÃļgonblicksbildstillstÃĨndet. VARNING! Kommandot `fix` skiljer inte mellan fel och avsiktliga modifieringar. Det ÃĨterställer ovillkorligen filtillstÃĨndet till den senaste `sync`. Om inget annat alternativ specificeras, behandlas hela arrayen. Använd filteralternativen fÃļr att välja en delmängd av filer eller diskar att arbeta med. FÃļr att fixa endast blocken markerade som dÃĨliga under `sync` och `scrub`, använd alternativet -e, --filter-error. Till skillnad frÃĨn andra filteralternativ tillämpar detta fixar endast pÃĨ filer som är ofÃļrändrade sedan den senaste `sync`. SnapRAID dÃļper om alla filer som inte kan fixas genom att lägga till tillägget `.unrecoverable`. Innan fixningen skannas hela arrayen fÃļr att hitta alla filer som flyttats sedan den senaste `sync`-operationen. Dessa filer identifieras av deras tidsstämpel, ignorera deras namn och katalog, och används i ÃĨterställningsprocessen vid behov. Om du flyttade nÃĨgra av dem utanfÃļr arrayen kan du använda alternativet -i, --import fÃļr att specificera ytterligare kataloger att skanna. Filer identifieras endast med sÃļkväg, inte med inode. `content`-filen modifieras INTE. `parity`-filerna modifieras vid behov. Filerna i arrayen modifieras vid behov. check Verifierar alla filer och paritetsdata. Det fungerar som `fix`, men det simulerar endast en ÃĨterställning och inga ändringar skrivs till arrayen. Detta kommando är i fÃļrsta hand avsett fÃļr manuell verifiering, som efter en ÃĨterställningsprocess eller under andra speciella fÃļrhÃĨllanden. FÃļr periodiska och schemalagda kontroller, använd `scrub`. Om du använder alternativet -a, --audit-only, kontrolleras endast fil- datan, och paritetsdatan ignoreras fÃļr en snabbare kÃļrning. Filer identifieras endast med sÃļkväg, inte med inode. Inget ändras. list Listar alla filer som finns i arrayen vid tidpunkten fÃļr den senaste `sync`. Med -v eller --verbose visas även undertiden. Inget ändras. dup Listar alla dubblettfiler. TvÃĨ filer antas vara lika om deras hashar matchar. Filens data läses inte; endast de fÃļrberäknade hasharna används. Inget ändras. pool Skapar eller uppdaterar en virtuell vy av alla filer i din disk-array i `pooling`-katalogen. Filerna kopieras inte utan länkas med hjälp av symboliska länkar. Vid uppdatering raderas alla befintliga symboliska länkar och tomma underkataloger och ersätts med den nya vyn av arrayen. Alla andra vanliga filer lämnas kvar. Inget ändras utanfÃļr pool-katalogen. devices Skriver ut de lÃĨgnivÃĨenheter som används av arrayen. Detta kommando visar enhetsassociationerna i arrayen och är främst avsett som ett skriptgränssnitt. De tvÃĨ fÃļrsta kolumnerna är lÃĨgnivÃĨenhetens ID och sÃļkväg. De nästa tvÃĨ kolumnerna är hÃļgnivÃĨenhetens ID och sÃļkväg. Den sista kolumnen är diskens namn i arrayen. I de flesta fall har du en lÃĨgnivÃĨenhet fÃļr varje disk i arrayen, men i vissa mer komplexa konfigurationer kan du ha flera lÃĨgnivÃĨenheter som används av en enda disk i arrayen. Inget ändras. touch Anger en godtycklig undertidsstämpel fÃļr alla filer som har den satt till noll. Detta fÃļrbättrar SnapRAIDs fÃļrmÃĨga att känna igen flyttade och kopierade filer, eftersom det gÃļr tidsstämpeln nästan unik, vilket minskar mÃļjliga dubbletter. Mer specifikt, om undertidsstämpeln inte är noll, identifieras en flyttad eller kopierad fil som sÃĨdan om den matchar namn, storlek och tidsstämpel. Om undertidsstämpeln är noll, betraktas den som en kopia endast om hela sÃļkvägen, storlek och tidsstämpel alla matchar. Tidsstämpeln med sekundprecision modifieras inte, sÃĨ alla datum och tider fÃļr dina filer bevaras. rehash Schemalägger en omhashning av hela arrayen. Detta kommando ändrar den hash-typ som används, vanligtvis vid uppgradering frÃĨn ett 32-bitars system till ett 64-bitars system, fÃļr att byta frÃĨn MurmurHash3 till den snabbare SpookyHash. Om du redan använder den optimala hashen, gÃļr detta kommando ingenting och informerar dig om att ingen ÃĨtgärd behÃļvs. Omhashningen utfÃļrs inte omedelbart utan sker progressivt under `sync` och `scrub`. Du kan kontrollera omhashningstillstÃĨndet med hjälp av `status`. Under omhashningen bibehÃĨller SnapRAID full funktionalitet, med det enda undantaget att `dup` inte kan upptäcka dubbletter med hjälp av en annan hash. locate Lokaliserar filer som lagras pÃĨ paritetsdiskarna. FÃļr varje matchande fil skrivs dess plats i paritetsfilen och antalet fragment den upptar ut. Du kan använda alternativet -t, --tail fÃļr att begränsa ÃĨtgärden till filer som upptar den angivna slutdelen (tail) av pariteten. Om du vill omallokera dessa filer kan du använda alternativet -W, --force-realloc-tail. Var medveten om att sÃĨdana filer inte skyddas av paritet under omallokeringsprocessen. Alternativ SnapRAID tillhandahÃĨller fÃļljande alternativ: -c, --conf CONFIG Väljer den konfigurationsfil som ska användas. Om den inte specificeras, i Unix används filen `/usr/local/etc/snapraid.conf` om den finns, annars `/etc/snapraid.conf`. I Windows används filen `snapraid.conf` i samma katalog som `snapraid.exe`. -f, --filter PATTERN Filtrerar filerna att behandla i `check` och `fix`. Endast filerna som matchar det specificerade mÃļnstret behandlas. Detta alternativ kan användas flera gÃĨnger. Se avsnittet MÖNSTER fÃļr mer information om mÃļnsterspecifikationer. I Unix, se till att globbing-tecken citeras om de används. Detta alternativ kan endast användas med `check` och `fix`. Det kan inte användas med `sync` och `scrub`, eftersom de alltid behandlar hela arrayen. -d, --filter-disk NAME Filtrerar diskarna att behandla i `check`, `fix`, `up` och `down`. Du mÃĨste specificera ett disk-namn som definieras i konfigurations- filen. Du kan ocksÃĨ specificera paritetsdiskar med namnen: `parity`, `2-parity`, `3-parity`, etc., fÃļr att begränsa operationer till en specifik paritetsdisk. Om du kombinerar flera --filter, --filter-disk och --filter-missing alternativ, väljs endast filer som matchar alla filter. Detta alternativ kan användas flera gÃĨnger. Detta alternativ kan endast användas med `check`, `fix`, `up` och `down`. Det kan inte användas med `sync` och `scrub`, eftersom de alltid behandlar hela arrayen. -m, --filter-missing Filtrerar filerna att behandla i `check` och `fix`. Endast filerna som saknas eller har raderats frÃĨn arrayen behandlas. När det används med `fix`, fungerar detta som ett `undelete`-kommando. Om du kombinerar flera --filter, --filter-disk och --filter-missing alternativ, väljs endast filer som matchar alla filter. Detta alternativ kan endast användas med `check` och `fix`. Det kan inte användas med `sync` och `scrub`, eftersom de alltid behandlar hela arrayen. -e, --filter-error Behandlar filerna med fel i `check` och `fix`. Det behandlar endast filer som har block markerade med tysta eller input/output-fel under `sync` och `scrub`, som listas i `status`. Detta alternativ kan endast användas med `check` och `fix`. -p, --plan PERC|bad|new|full Väljer skrubbplanen. Om PERC är ett numeriskt värde frÃĨn 0 till 100, tolkas det som procentandelen av block som ska skrubbas. Istället fÃļr en procentsats kan du specificera en plan: `bad` skrubbar dÃĨliga block, `new` skrubbar block som ännu inte skrubbats, och `full` skrubbar allt. Detta alternativ kan endast användas med `scrub`. -o, --older-than DAYS Väljer den äldsta delen av arrayen att behandla i `scrub`. DAYS är den minsta ÃĨldern i dagar fÃļr ett block att skrubbas; standard är 10. Block markerade som dÃĨliga skrubbas alltid oavsett detta alternativ. Detta alternativ kan endast användas med `scrub`. -a, --audit-only I `check`, verifierar hashen av filerna utan att kontrollera paritetsdata. Om du bara är intresserad av att kontrollera filens data, kan detta alternativ avsevärt pÃĨskynda kontrollprocessen. Detta alternativ kan endast användas med `check`. -h, --pre-hash I `sync`, kÃļr en preliminär hash-fas av all ny data fÃļr ytterligare verifiering innan paritetsberäkningen. Vanligtvis gÃļrs ingen preliminär hashning i `sync`, och den nya datan hashberäknas precis innan paritetsberäkningen när den läses fÃļr fÃļrsta gÃĨngen. Denna process sker när systemet är under tung belastning, med alla diskar snurrande och en upptagen CPU. Detta är ett extremt tillstÃĨnd fÃļr maskinen, och om den har ett latent hÃĨrdvaruproblem, kan tysta fel gÃĨ obemärkt fÃļrbi eftersom datan ännu inte har hashberäknats. FÃļr att undvika denna risk kan du aktivera `pre-hash`-läget fÃļr att fÃĨ all data läst tvÃĨ gÃĨnger fÃļr att säkerställa dess integritet. Detta alternativ verifierar ocksÃĨ filer som flyttats inom arrayen fÃļr att säkerställa att flyttoperationen lyckades och, om nÃļdvändigt, lÃĨter dig kÃļra en fix-operation innan du fortsätter. Detta alternativ kan endast användas med `sync`. -i, --import DIR Importerar frÃĨn den specificerade katalogen alla filer som raderats frÃĨn arrayen efter den senaste `sync`. Om du fortfarande har sÃĨdana filer, kan de användas av `check` och `fix` fÃļr att fÃļrbättra ÃĨterställningsprocessen. Filerna läses, inklusive i underkataloger, och identifieras oavsett deras namn. Detta alternativ kan endast användas med `check` och `fix`. -s, --spin-down-on-error Vid nÃĨgot fel, snurrar ner alla hanterade diskar innan den avslutas med en statuskod som inte är noll. Detta fÃļrhindrar att enheterna fÃļrblir aktiva och snurrar efter en avbruten operation, vilket hjälper till att undvika onÃļdig värmeuppbyggnad och strÃļm- fÃļrbrukning. Använd detta alternativ fÃļr att säkerställa att diskar stoppas säkert även när ett kommando misslyckas. -w, --bw-limit RATE Tillämpar en global bandbreddsbegränsning fÃļr alla diskar. RATE är antalet byte per sekund. Du kan specificera en multiplikator som K, M eller G (t.ex. --bw-limit 1G). -t, --tail STORLEK Begränsa fillistan till de som inte använder mer än den angivna slutstorleken pÃĨ paritetsdiskarna. Du kan använda multiplikatorer som K, M, G eller T (t.ex. --tail 1G). Detta alternativ är endast giltigt när det används tillsammans med kommandot `locate`. -A, --stats Aktiverar en utÃļkad statusvy som visar ytterligare information. Skärmen visar tvÃĨ diagram: Det fÃļrsta diagrammet visar antalet buffrade strippar fÃļr varje disk, tillsammans med filsÃļkvägen fÃļr filen som fÃļr närvarande används pÃĨ den disken. Vanligtvis kommer den lÃĨngsammaste disken att ha ingen buffert tillgänglig, vilket bestämmer den maximalt uppnÃĨeliga bandbredden. Det andra diagrammet visar procentandelen tid som spenderats i väntan under de senaste 100 sekunderna. Den lÃĨngsammaste disken fÃļrväntas orsaka stÃļrre delen av väntetiden, medan andra diskar bÃļr ha liten eller ingen väntetid eftersom de kan använda sina buffrade strippar. Detta diagram visar ocksÃĨ den tid som spenderats i väntan pÃĨ hash- beräkningar och RAID-beräkningar. Alla beräkningar kÃļrs parallellt med diskoperationer. DärfÃļr, sÃĨ länge det finns mätbar väntetid fÃļr minst en disk, indikerar det att CPU:n är snabb nog att hÃĨlla jämna steg med arbetsbelastningen. -Z, --force-zero Tvingar den osäkra operationen att synkronisera en fil med noll storlek som tidigare var icke-noll. Om SnapRAID upptäcker ett sÃĨdant tillstÃĨnd, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du enkelt kan upptäcka när, efter en systemkrasch, vissa filer som användes trunkerades. Detta är ett mÃļjligt tillstÃĨnd i Linux med filsystemen ext3/ext4. Detta alternativ kan endast användas med `sync`. -E, --force-empty Tvingar den osäkra operationen att synkronisera en disk där alla ursprungliga filer saknas. Om SnapRAID upptäcker att alla filer som ursprungligen fanns pÃĨ disken saknas eller har skrivits om, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du enkelt kan upptäcka när ett datafilsystem inte är monterat. Detta alternativ kan endast användas med `sync`. -U, --force-uuid Tvingar den osäkra operationen att synkronisera, kontrollera och fixa med diskar som har ändrat sin UUID. Om SnapRAID upptäcker att vissa diskar har ändrat UUID, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du kan upptäcka när dina diskar är monterade pÃĨ fel monteringspunkter. Det är dock tillÃĨtet att ha en enda UUID-ändring med enkel paritet, och fler med multipel paritet, eftersom detta är det normala fallet när man byter ut diskar efter en ÃĨterställning. Detta alternativ kan endast användas med `sync`, `check` eller `fix`. -D, --force-device Tvingar den osäkra operationen att fixa med otillgängliga diskar eller med diskar pÃĨ samma fysiska enhet. Till exempel, om du fÃļrlorade tvÃĨ datadisker och har en reservdisk fÃļr att ÃĨterställa endast den fÃļrsta, kan du ignorera den andra otillgängliga disken. Eller, om du vill ÃĨterställa en disk i det lediga utrymme som finns kvar pÃĨ en redan använd disk, dela samma fysiska enhet. Detta alternativ kan endast användas med `fix`. -N, --force-nocopy I `sync`, `check` och `fix`, inaktiverar heuristiken fÃļr kopieringsdetektering. Utan detta alternativ antar SnapRAID att filer med samma attribut, sÃĨsom namn, storlek och tidsstämpel, är kopior med samma data. Detta mÃļjliggÃļr identifiering av kopierade eller flyttade filer frÃĨn en disk till en annan och ÃĨteranvänder den redan beräknade hash-informationen fÃļr att upptäcka tysta fel eller fÃļr att ÃĨterställa saknade filer. I vissa sällsynta fall kan detta beteende leda till falska positiva eller en lÃĨngsam process pÃĨ grund av mÃĨnga hash-verifieringar, och detta alternativ lÃĨter dig lÃļsa sÃĨdana problem. Detta alternativ kan endast användas med `sync`, `check` och `fix`. -F, --force-full I `sync`, tvingar en fullständig omberäkning av pariteten. Detta alternativ kan användas när du lägger till en ny paritetsnivÃĨ eller om du ÃĨtergick till en gammal content-fil med mer aktuell paritetsdata. Istället fÃļr att ÃĨterskapa pariteten frÃĨn grunden lÃĨter detta dig ÃĨteranvända hasharna som finns i content-filen fÃļr att validera data och bibehÃĨlla dataskyddet under `sync`-processen med hjälp av den befintliga paritetsdatan. Detta alternativ kan endast användas med `sync`. -R, --force-realloc I `sync`, tvingar en fullständig omallokering av filer och ombyggnad av pariteten. Detta alternativ kan användas fÃļr att helt omallokera alla filer, ta bort fragmentering, samtidigt som hasharna som finns i content- filen ÃĨteranvänds fÃļr att validera data. Detta alternativ kan endast användas med `sync`. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte använda det. Du HAR INGET dataskydd under `sync`-operationen. -W, --force-realloc-tail STORLEK Fungerar som -R, --force-realloc, men begränsat till den angivna slutdelen (de sista STORLEK byten) av varje paritetsfil. Den tvingar omallokering (flytt) av alla filfragment/block som fÃļr närvarande lagras i den slutsektionen, vilket gÃļr att de kan placeras var som helst i paritetsfilen/filerna där ledigt utrymme finns (inklusive befintliga hÃĨl). Huvudsyftet med detta alternativ är att minska paritetsfilens storlek pÃĨ disken. Om omallokeringen lyckas rensa hela slutsektionen (inga block är kvar som använder den), trunkeras paritetsfilen och det oanvända slututrymmet ÃĨtertas. Du kan använda multiplikatorer som K, M, G eller T (t.ex. --force-realloc-tail 1G). Du kan använda locate -t, --tail fÃļr att i fÃļrväg veta vilka filer som pÃĨverkas. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte använda det. Du har INGET dataskydd under `sync`-ÃĨtgärden fÃļr de berÃļrda filerna. -l, --log FILE Skriver en detaljerad logg till den specificerade filen. Om detta alternativ inte specificeras, skrivs oväntade fel ut pÃĨ skärmen, vilket potentiellt kan leda till Ãļverdriven utdata i händelse av mÃĨnga fel. När -l, --log specificeras, skrivs endast fatala fel som fÃĨr SnapRAID att stoppa ut pÃĨ skärmen. Om sÃļkvägen bÃļrjar med `>>`, Ãļppnas filen i tilläggsläge. FÃļrekomster av `%D` och `%T` i namnet ersätts med datum och tid i formatet YYYYMMDD respektive HHMMSS. I Windows batch-filer mÃĨste du dubblera `%`-tecknet, t.ex. result-%%D.log. FÃļr att använda `>>` mÃĨste du omsluta namnet i citattecken, t.ex. `">>result.log"`. FÃļr att skicka ut loggen till standardutdata eller standardfel, kan du använda `">&1"` respektive `">&2"`. Se filen snapraid_log.txt eller man-sidan fÃļr beskrivningar av logg-taggar. -L, --error-limit NUMBER Anger en ny felgräns innan kÃļrningen stoppas. Som standard stoppar SnapRAID om det stÃļter pÃĨ mer än 100 input/output-fel, vilket indikerar att en disk troligen hÃĨller pÃĨ att misslyckas. Detta alternativ pÃĨverkar `sync` och `scrub`, som tillÃĨts att fortsätta efter den fÃļrsta uppsättningen diskfel fÃļr att fÃļrsÃļka slutfÃļra sina operationer. Däremot stoppar `check` och `fix` alltid vid det fÃļrsta felet. -S, --start BLKSTART BÃļrjar behandlingen frÃĨn det specificerade blocknumret. Detta kan vara användbart fÃļr att fÃļrsÃļka igen att kontrollera eller fixa specifika block i händelse av en skadad disk. Detta alternativ är främst fÃļr avancerad manuell ÃĨterställning. -B, --count BLKCOUNT Behandlar endast det specificerade antalet block. Detta alternativ är främst fÃļr avancerad manuell ÃĨterställning. -C, --gen-conf CONTENT Genererar en dummy-konfigurationsfil frÃĨn en befintlig content-fil. Konfigurationsfilen skrivs till standardutdata och skriver inte Ãļver en befintlig fil. Denna konfigurationsfil innehÃĨller ocksÃĨ den information som behÃļvs fÃļr att rekonstruera diskmonteringspunkterna om du fÃļrlorar hela systemet. -v, --verbose Skriver ut mer information pÃĨ skärmen. Om det specificeras en gÃĨng, skrivs exkluderade filer och ytterligare statistik ut. Detta alternativ har ingen effekt pÃĨ loggfilerna. -q, --quiet Skriver ut mindre information pÃĨ skärmen. Om det specificeras en gÃĨng, tas fÃļrloppsindikatorn bort; tvÃĨ gÃĨnger, de pÃĨgÃĨende operationerna; tre gÃĨnger, informations- meddelandena; fyra gÃĨnger, statusmeddelandena. Fatala fel skrivs alltid ut pÃĨ skärmen. Detta alternativ har ingen effekt pÃĨ loggfilerna. -H, --help Skriver ut en kort hjälpskärm. -V, --version Skriver ut programversionen. Konfiguration SnapRAID kräver en konfigurationsfil fÃļr att veta var din disk-array finns och var paritetsinformationen ska lagras. I Unix används filen `/usr/local/etc/snapraid.conf` om den finns, annars `/etc/snapraid.conf`. I Windows används filen `snapraid.conf` i samma katalog som `snapraid.exe`. Den mÃĨste innehÃĨlla fÃļljande alternativ (skiftlägeskänsligt): parity FIL [,FIL] ... Definierar de filer som ska användas fÃļr att lagra paritetsinformationen. Pariteten mÃļjliggÃļr skydd frÃĨn ett enda disk- fel, liknande RAID5. Du kan specificera flera filer, som mÃĨste finnas pÃĨ olika diskar. När en fil inte kan växa mer, används nästa fil. Det totala tillgängliga utrymmet mÃĨste vara minst lika stort som den stÃļrsta datadisken i arrayen. Du kan lägga till ytterligare paritetsfiler senare, men du kan inte ändra ordning pÃĨ eller ta bort dem. Att hÃĨlla paritetsdiskarna reserverade fÃļr paritet säkerställer att de inte blir fragmenterade, vilket fÃļrbättrar prestandan. I Windows lämnas 256 MB oanvänt pÃĨ varje disk fÃļr att undvika varningen om fulla diskar. Detta alternativ är obligatoriskt och kan endast användas en gÃĨng. (2,3,4,5,6)-parity FIL [,FIL] ... Definierar de filer som ska användas fÃļr att lagra extra paritetsinformation. FÃļr varje paritetsnivÃĨ som specificeras aktiveras en ytterligare skyddsnivÃĨ: * 2-parity mÃļjliggÃļr RAID6 dubbel paritet. * 3-parity mÃļjliggÃļr trippel paritet. * 4-parity mÃļjliggÃļr fyrdubbel (fyra) paritet. * 5-parity mÃļjliggÃļr penta (fem) paritet. * 6-parity mÃļjliggÃļr hexa (sex) paritet. Varje paritetsnivÃĨ kräver närvaro av alla fÃļregÃĨende paritets- nivÃĨer. Samma Ãļverväganden som fÃļr alternativet `parity` gäller. Dessa alternativ är valfria och kan endast användas en gÃĨng. z-parity FIL [,FIL] ... Definierar en alternativ fil och ett format fÃļr att lagra trippel paritet. Detta alternativ är ett alternativ till `3-parity`, främst avsett fÃļr lÃĨgpresterande processorer som ARM eller AMD Phenom, Athlon och Opteron som inte stÃļder SSSE3-instruktionsuppsättningen. I sÃĨdana fall ger det bättre prestanda. Detta format liknar, men är snabbare än, det som används av ZFS RAIDZ3. Liksom ZFS fungerar det inte utÃļver trippel paritet. När du använder `3-parity` kommer du att varnas om det rekommenderas att använda formatet `z-parity` fÃļr prestandafÃļrbättring. Det är mÃļjligt att konvertera frÃĨn ett format till ett annat genom att justera konfigurationsfilen med Ãļnskad z-parity eller 3-parity fil och använda `fix` fÃļr att ÃĨterskapa den. content FIL Definierar den fil som ska användas fÃļr att lagra listan och checksummorna fÃļr alla filer som finns i din disk-array. Den kan placeras pÃĨ en disk som används fÃļr data, paritet eller nÃĨgon annan tillgänglig disk. Om du använder en datadisk exkluderas denna fil automatiskt frÃĨn `sync`-processen. Detta alternativ är obligatoriskt och kan användas flera gÃĨnger fÃļr att spara flera kopior av samma fil. Du mÃĨste lagra minst en kopia fÃļr varje paritetsdisk som används plus en. Att använda ytterligare kopior skadar inte. data NAMN KATALOG Definierar namnet och monteringspunkten fÃļr datadiskarna i arrayen. NAMN används fÃļr att identifiera disken och mÃĨste vara unikt. KATALOG är monteringspunkten fÃļr disken i filsystemet. Du kan ändra monteringspunkten vid behov, sÃĨ länge du behÃĨller NAMN fixerat. Du bÃļr använda ett alternativ fÃļr varje datadisk i arrayen. Du kan byta namn pÃĨ en disk senare genom att ändra NAMN direkt i konfigurationsfilen och sedan kÃļra ett `sync`-kommando. I händelse av namnbyte gÃļrs associationen med hjälp av den lagrade UUID:n fÃļr diskarna. extra NAME DIR Definierar namn och monteringspunkt fÃļr ytterligare diskar som ska Ãļvervakas med kommandona `smart` och `probe`. Detta är användbart fÃļr att Ãļvervaka diskar som inte ingÃĨr i arrayen men som krävs fÃļr att systemet ska fungera, till exempel startdisken. Observera att sÃĨdana diskar inte pÃĨverkas av kommandona `up` och `down` eftersom de fÃļrväntas alltid snurra. nohidden Exkluderar alla dolda filer och kataloger. I Unix är dolda filer de som bÃļrjar med `.`. I Windows är de de med det dolda attributet. exclude/include MÖNSTER Definierar fil- eller katalogmÃļnstren att exkludera eller inkludera i sync-processen. Alla mÃļnster behandlas i den specificerade ordningen. Om det fÃļrsta mÃļnstret som matchar är ett `exclude`-mÃļnster, exkluderas filen. Om det är ett `include`-mÃļnster, inkluderas filen. Om inget mÃļnster matchar, exkluderas filen om det sista mÃļnstret som specificerats är ett `include`-mÃļnster, eller inkluderas om det sista mÃļnstret som specificerats är ett `exclude`-mÃļnster. Se avsnittet MÖNSTER fÃļr mer information om mÃļnster- specifikationer. Detta alternativ kan användas flera gÃĨnger. blocksize STORLEK_I_KIBIBYTES Definierar den grundläggande blockstorleken i kibibytes fÃļr pariteten. En kibibyte är 1024 byte. Standard blockstorlek är 256, vilket bÃļr fungera fÃļr de flesta fall. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte ändra detta värde. FÃļr att ändra detta värde i framtiden, kommer du att behÃļva ÃĨterskapa hela pariteten! En anledning att använda en annan blockstorlek är om du har mÃĨnga smÃĨ filer, i storleksordningen miljoner. FÃļr varje fil, även om den bara är nÃĨgra byte, allokeras ett helt block paritet, och med mÃĨnga filer kan detta leda till betydande oanvänt paritetsutrymme. När du helt fyller paritetsdisken, är du inte tillÃĨten att lägga till fler filer pÃĨ datadiskarna. Det bortkastade paritetsutrymmet ackumuleras dock inte Ãļver datadiskar. Bortkastat utrymme som härrÃļr frÃĨn ett hÃļgt antal filer pÃĨ en datadisk begränsar endast mängden data pÃĨ den datadisken, inte andra. Som en approximation kan du anta att hälften av blockstorleken är bortkastad fÃļr varje fil. Till exempel, med 100 000 filer och en 256 KiB blockstorlek, kommer du att slÃļsa 12,8 GB paritet, vilket kan resultera i 12,8 GB mindre utrymme tillgängligt pÃĨ datadisken. Du kan kontrollera mängden bortkastat utrymme pÃĨ varje disk med hjälp av `status`. Detta är mängden utrymme du mÃĨste lämna ledigt pÃĨ data- diskarna eller använda fÃļr filer som inte ingÃĨr i arrayen. Om detta värde är negativt betyder det att du är nära att fylla pariteten, och det representerar det utrymme du fortfarande kan slÃļsa. FÃļr att undvika detta problem kan du använda en stÃļrre partition fÃļr paritet. Om till exempel paritetspartitionen är 12,8 GB stÃļrre än datadiskarna, har du tillräckligt med extra utrymme fÃļr att hantera upp till 100 000 filer pÃĨ varje datadisk utan nÃĨgot bortkastat utrymme. Ett trick fÃļr att fÃĨ en stÃļrre paritetspartition i Linux är att formatera den med kommandot: :mkfs.ext4 -m 0 -T largefile4 DEVICE Detta resulterar i cirka 1,5% extra utrymme, ungefär 60 GB fÃļr en 4 TB-disk, vilket mÃļjliggÃļr cirka 460 000 filer pÃĨ varje datadisk utan nÃĨgot bortkastat utrymme. hashsize STORLEK_I_BYTE Definierar hash-storleken i byte fÃļr de sparade blocken. Standard hash-storlek är 16 byte (128 bitar), vilket bÃļr fungera fÃļr de flesta fall. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte ändra detta värde. FÃļr att ändra detta värde i framtiden, kommer du att behÃļva ÃĨterskapa hela pariteten! En anledning att använda en annan hash-storlek är om ditt system har begränsat minne. Som en tumregel kräver SnapRAID vanligtvis 1 GiB RAM fÃļr varje 16 TB data i arrayen. Specifikt, fÃļr att lagra hasharna av datan, kräver SnapRAID ungefär TS*(1+HS)/BS byte RAM, där TS är den totala storleken i byte av din disk-array, BS är blockstorleken i byte och HS är hash-storleken i byte. Till exempel, med 8 diskar pÃĨ 4 TB, en blockstorlek pÃĨ 256 KiB (1 KiB = 1024 byte) och en hash-storlek pÃĨ 16, fÃĨr du: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB Om du byter till en hash-storlek pÃĨ 8 fÃĨr du: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB Om du byter till en blockstorlek pÃĨ 512 fÃĨr du: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB Om du byter till bÃĨde en hash-storlek pÃĨ 8 och en blockstorlek pÃĨ 512 fÃĨr du: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB autosave STORLEK_I_GIGABYTES Sparar automatiskt tillstÃĨndet vid synkronisering eller skrubbning efter att den specificerade mängden GB har behandlats. Detta alternativ är användbart fÃļr att undvika att starta om lÃĨnga `sync`- kommandon frÃĨn bÃļrjan om de avbryts av en maskinkrasch eller nÃĨgon annan händelse. temp_limit TEMPERATUR_CELSIUS Anger den maximalt tillÃĨtna disk-temperaturen i Celsius. När den specificeras, kontrollerar SnapRAID periodiskt temperaturen pÃĨ alla diskar med hjälp av verktyget smartctl. De aktuella disk-temperaturerna visas medan SnapRAID är igÃĨng. Om nÃĨgon disk Ãļverskrider denna gräns, stoppas alla operationer och diskarna snurras ner (sätts i standby) under den tid som definieras av alternativet `temp_sleep`. Efter viloperioden ÃĨterupptas operationerna, och kan potentiellt pausas igen om temperaturgränsen nÃĨs ännu en gÃĨng. Under drift analyserar SnapRAID ocksÃĨ värmekurvan fÃļr varje disk och uppskattar den lÃĨngsiktiga stabila temperaturen de fÃļrväntas nÃĨ om aktiviteten fortsätter. Uppskattningen utfÃļrs fÃļrst efter att disk-temperaturen har Ãļkat fyra gÃĨnger, vilket säkerställer att tillräckligt med datapoäng finns tillgängliga fÃļr att fastställa en pÃĨlitlig trend. Denna fÃļrutsagda stabila temperatur visas inom parentes bredvid den aktuella värdet och hjälper till att bedÃļma om systemets kylning är tillräcklig. Denna uppskattade temperatur är endast fÃļr informationssyfte och har ingen effekt pÃĨ SnapRAIDs beteende. Programmens ÃĨtgärder baseras enbart pÃĨ de faktiska uppmätta disk-temperaturerna. FÃļr att utfÃļra denna analys behÃļver SnapRAID en referens fÃļr system- temperaturen. Det fÃļrsÃļker fÃļrst läsa den frÃĨn tillgängliga hÃĨrdvaru- sensorer. Om ingen system-sensor kan nÃĨs, används den lägsta disk- temperaturen som mättes vid start av kÃļrningen som en reservreferens. Normalt visar SnapRAID endast temperaturen pÃĨ den hetaste disken. FÃļr att visa temperaturen pÃĨ alla diskar, använd alternativet -A eller --stats. temp_sleep TID_I_MINUTER Anger standby-tiden, i minuter, när temperaturgränsen har nÃĨtts. Under denna period fÃļrblir diskarna nedsnurrade. Standard är 5 minuter. pool KATALOG Definierar poolningskatalogen där den virtuella vyn av disk- arrayen skapas med hjälp av kommandot `pool`. Katalogen mÃĨste redan existera. share UNC_KATALOG Definierar Windows UNC-sÃļkvägen som krävs fÃļr att fÃĨ ÃĨtkomst till diskarna pÃĨ distans. Om detta alternativ specificeras, använder de symboliska länkarna som skapats i pool- katalogen denna UNC-sÃļkväg fÃļr att fÃĨ ÃĨtkomst till diskarna. Utan detta alternativ använder de genererade symboliska länkarna endast lokala sÃļkvägar, vilket inte tillÃĨter delning av pool-katalogen Ãļver nätverket. De symboliska länkarna bildas med hjälp av den specificerade UNC-sÃļkvägen, lägger till disk-namnet som specificeras i `data`-alternativet, och lägger slutligen till filens katalog och namn. Detta alternativ krävs endast fÃļr Windows. smartctl DISK/PARITY ALTERNATIV... Definierar anpassade smartctl-alternativ fÃļr att fÃĨ SMART-attributen fÃļr varje disk. Detta kan krävas fÃļr RAID-kontroller och vissa USB- diskar som inte kan upptäckas automatiskt. Platsinnehavaren %s ersätts av enhetens namn, men är valfri fÃļr fixerade enheter som RAID-kontroller. DISK är samma disk-namn som specificeras i `data`-alternativet. PARITY är ett av paritetsnamnen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` eller `z-parity`. I de specificerade ALTERNATIVEN ersätts strängen `%s` med enhetens namn. FÃļr RAID-kontroller är enheten sannolikt fixerad, och du kanske inte behÃļver använda `%s`. Se smartmontools dokumentation fÃļr mÃļjliga alternativ: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices Till exempel: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignorerar det specificerade SMART-attributet vid beräkning av sannolikheten fÃļr diskfel. Detta alternativ är användbart om en disk rapporterar ovanliga eller vilseledande värden fÃļr ett visst attribut. DISK är samma disk-namn som specificeras i `data`-alternativet. PARITY är ett av paritetsnamnen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` eller `z-parity`. Det speciella värdet * kan användas fÃļr att ignorera attributet pÃĨ alla diskar. Till exempel, fÃļr att ignorera attributet `Current Pending Sector Count` pÃĨ alla diskar: :smartignore * 197 FÃļr att ignorera det endast pÃĨ den fÃļrsta paritetsdisken: :smartignore parity 197 Exempel Ett exempel pÃĨ en typisk konfiguration fÃļr Unix är: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Ett exempel pÃĨ en typisk konfiguration fÃļr Windows är: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 MÃļnster (Pattern) MÃļnster ger ett flexibelt sätt att filtrera filer fÃļr inkludering eller exkludering. Genom att använda jokertecken kan du definiera regler som matchar specifika filnamn eller hela katalogstrukturer utan att lista varje sÃļkväg manuellt. FrÃĨgetecknet `?` matchar valfritt enskilt tecken utom katalogavgränsaren. Detta gÃļr det användbart fÃļr att matcha filnamn med variabla tecken samtidigt som mÃļnstret hÃĨlls begränsat till en enda katalognivÃĨ. Den enkla stjärnan `*` matchar valfri teckensekvens, men precis som frÃĨgetecknet korsar den aldrig kataloggränser. Den stannar vid snedstrecket, vilket gÃļr den lämplig fÃļr matchning inom en enskild sÃļkvägskomponent. Detta är det standardbeteende fÃļr jokertecken som är bekant frÃĨn skal-globbing. Den dubbla stjärnan `**` är mer kraftfull; den matchar valfri teckensekvens inklusive katalogavgränsare. Detta gÃļr att mÃļnster kan matcha Ãļver flera katalognivÃĨer. När `**` fÃļrekommer direkt i ett mÃļnster kan det matcha noll eller fler tecken inklusive snedstreck mellan den omkringliggande bokstavliga texten. Den viktigaste användningen av `**` är i den speciella formen `/**/`. Detta matchar noll eller flera kompletta katalognivÃĨer, vilket gÃļr det mÃļjligt att matcha filer pÃĨ valfritt djup i ett katalogträd utan att känna till den exakta sÃļkvägsstrukturen. Till exempel matchar mÃļnstret `src/**/main.js` filerna `src/main.js` (hoppar Ãļver noll kataloger), `src/ui/main.js` (hoppar Ãļver en katalog) och `src/ui/components/main.js` (hoppar Ãļver tvÃĨ kataloger). Teckenklasser som använder hakparenteser `[]` matchar ett enskilt tecken frÃĨn en angiven uppsättning eller ett intervall. Precis som de andra mÃļnstren fÃļr enskilda tecken matchar de inte katalogavgränsare. Klasser stÃļder intervall och negering med ett utropstecken. Den grundläggande skillnaden att komma ihÃĨg är att `*`, `?` och teckenklasser alla respekterar kataloggränser och endast matchar inom en enskild sÃļkvägskomponent, medan `**` är det enda mÃļnstret som kan matcha Ãļver katalogavgränsare. Det finns fyra olika typer av mÃļnster: =FILE Väljer valfri fil med namnet FILE. Detta mÃļnster gäller endast filer, inte kataloger. =DIR/ Väljer valfri katalog med namnet DIR och allt innehÃĨll. Detta mÃļnster gäller endast kataloger, inte filer. =/PATH/FILE Väljer den exakt angivna filsÃļkvägen. Detta mÃļnster gäller endast filer, inte kataloger. =/PATH/DIR/ Väljer den exakt angivna katalogsÃļkvägen och allt innehÃĨll. Detta mÃļnster gäller endast kataloger, inte filer. När du specificerar en absolut sÃļkväg som bÃļrjar med /, tillämpas den vid array-rotkatalogen, inte den lokala filsystemets rotkatalog. I Windows kan du använda bakÃĨtsnedstrecket \ istället fÃļr framÃĨtsnedstrecket /. Windows systemkataloger, junction points, monteringspunkter och andra Windows speciella kataloger behandlas som filer, vilket innebär att fÃļr att exkludera dem mÃĨste du använda en fil-regel, inte en katalog-regel. Om filnamnet innehÃĨller tecknet `*`, `?`, `[`, eller `]`, mÃĨste du undvika det fÃļr att fÃļrhindra att det tolkas som ett globbing-tecken. I Unix är undvikande-tecknet `\`; i Windows är det `^`. När mÃļnstret är pÃĨ kommandoraden mÃĨste du dubbla undvikande- tecknet fÃļr att fÃļrhindra att det tolkas av kommandoskalet. I konfigurationsfilen kan du använda olika strategier fÃļr att filtrera filerna som ska behandlas. Det enklaste tillvägagÃĨngssättet är att endast använda `exclude`-regler fÃļr att ta bort alla filer och kataloger du inte vill behandla. Till exempel: :# Exkluderar alla filer som heter `*.unrecoverable` :exclude *.unrecoverable :# Exkluderar rotkatalogen `/lost+found` :exclude /lost+found/ :# Exkluderar alla underkataloger som heter `tmp` :exclude tmp/ Det motsatta tillvägagÃĨngssättet är att definiera endast de filer du vill behandla, med endast `include`-regler. Till exempel: :# Inkluderar endast vissa kataloger :include /movies/ :include /musics/ :include /pictures/ Det sista tillvägagÃĨngssättet är att blanda `exclude`- och `include`-regler. I detta fall är ordningen pÃĨ reglerna viktig. Tidigare regler har fÃļreträde framfÃļr senare. FÃļr att fÃļrenkla kan du lista alla `exclude`-regler fÃļrst och sedan alla `include`-regler. Till exempel: :# Exkluderar alla filer som heter `*.unrecoverable` :exclude *.unrecoverable :# Exkluderar alla underkataloger som heter `tmp` :exclude tmp/ :# Inkluderar endast vissa kataloger :include /movies/ :include /musics/ :include /pictures/ PÃĨ kommandoraden, med hjälp av alternativet -f, kan du bara använda `include`- mÃļnster. Till exempel: :# Kontrollerar endast .mp3-filerna. :# I Unix, använd citattecken fÃļr att undvika globbing-expansion av skalet. :snapraid -f "*.mp3" check I Unix, när du använder globbing-tecken pÃĨ kommandoraden, mÃĨste du citattecken dem fÃļr att fÃļrhindra att skalet expanderar dem. Ignorera filer (Ignore File) UtÃļver de globala reglerna i konfigurationsfilen kan du placera `.snapraidignore`-filer i vilken katalog som helst i arrayen fÃļr att definiera decentraliserade exkluderingsregler. Regler som definieras i `.snapraidignore` tillämpas efter reglerna i konfigurationsfilen. Detta innebär att de har hÃļgre prioritet och kan användas fÃļr att exkludera filer som tidigare inkluderats av den globala konfigurationen. I praktiken innebär det att om en lokal regel matchar, sÃĨ exkluderas filen oavsett de globala inkluderingsinställningarna. MÃļnsterlogiken i `.snapraidignore` speglar den globala konfigurationen men fÃļrankrar mÃļnstren till den katalog där filen finns: =FILE Väljer alla filer med namnet FILE i denna katalog eller under. Detta fÃļljer samma globbing-regler som det globala mÃļnstret. =DIR/ Väljer alla kataloger med namnet DIR och allt innehÃĨll, som finns i denna katalog eller under. =/PATH/FILE Väljer den exakt angivna filen relativt platsen fÃļr `.snapraidignore`-filen. =/PATH/DIR/ Väljer den exakt angivna katalogen och allt innehÃĨll, relativt platsen fÃļr `.snapraidignore`-filen. Till skillnad frÃĨn den globala konfigurationen stÃļder `.snapraidignore`-filer endast exkluderingsregler; du kan inte använda `include`-mÃļnster eller negation (!). Till exempel, om du har en `.snapraidignore` i `/mnt/disk1/projects/`: :# Exkluderar ENDAST /mnt/disk1/projects/output.bin :/output.bin :# Exkluderar alla kataloger med namnet `build` inuti projects/ :build/ :# Exkluderar alla .tmp-filer inuti projects/ eller dess undermappar :*.tmp InnehÃĨll (Content) SnapRAID lagrar listan och checksummorna fÃļr dina filer i content-filen. Det är en binär fil som listar alla filer som finns i din disk-array, tillsammans med alla checksummor fÃļr att verifiera deras integritet. Denna fil läses och skrivs av kommandona `sync` och `scrub` och läses av kommandona `fix`, `check` och `status`. Paritet (Parity) SnapRAID lagrar paritetsinformationen fÃļr din array i parity- filerna. Dessa är binära filer som innehÃĨller den beräknade pariteten fÃļr alla block definierade i `content`-filen. Dessa filer läses och skrivs av kommandona `sync` och `fix` och läses endast av kommandona `scrub` och `check`. Kodning SnapRAID i Unix ignorerar all kodning. Det läser och lagrar filnamnen med samma kodning som används av filsystemet. I Windows konverteras alla namn som läses frÃĨn filsystemet och behandlas i UTF-8-format. FÃļr att fÃĨ filnamn utskrivna korrekt mÃĨste du ställa in Windows- konsolen till UTF-8-läge med kommandot `chcp 65001` och använda ett TrueType-typsnitt som `Lucida Console` som konsoltypsnitt. Detta pÃĨverkar endast de utskrivna filnamnen; om du omdirigerar konsolutdata till en fil, är den resulterande filen alltid i UTF-8-format. Upphovsrätt (Copyright) Denna fil är Copyright (C) 2025 Andrea Mazzoleni Se Även (See Also) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-sv.txt000066400000000000000000002062371522717156100170260ustar00rootroot00000000000000 ============================================ SnapRAID Säkerhetskopiering fÃļr Disk-arrayer ============================================ 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 BESKRIVNING ============= SnapRAID är ett säkerhetskopieringsprogram designat fÃļr disk-arrayer, som lagrar paritetsinformation fÃļr dataÃĨterställning vid upp till sex diskfel. SnapRAID är i fÃļrsta hand avsett fÃļr hemmamediabibliotek med stora, sällan ändrade filer, och erbjuder flera funktioner: * Du kan använda diskar som redan är fyllda med filer utan att behÃļva formatera om dem, och du fÃĨr ÃĨtkomst till dem som vanligt. * All din data hashberäknas fÃļr att säkerställa dataintegritet och fÃļrhindra tyst korruption. * När antalet felaktiga diskar Ãļverskrider paritetsantalet, begränsas datafÃļrlusten till de drabbade diskarna; data pÃĨ andra diskar fÃļrblir ÃĨtkomlig. * Om du oavsiktligt raderar filer pÃĨ en disk är ÃĨterställning mÃļjlig. * Diskar kan ha olika storlekar. * Du kan lägga till diskar när som helst. * SnapRAID lÃĨser inte in din data; du kan sluta använda det när som helst utan omformatering eller dataflytt. * FÃļr att fÃĨ ÃĨtkomst till en fil behÃļver endast en enda disk snurra, vilket sparar strÃļm och minskar buller. FÃļr mer information, besÃļk den officiella SnapRAID-webbplatsen: https://www.snapraid.it/ 3 BEGRäNSNINGAR =============== SnapRAID är en hybrid mellan ett RAID- och ett säkerhetskopieringsprogram, som syftar till att kombinera de bästa fÃļrdelarna med bÃĨda. Den har dock vissa begränsningar som du bÃļr Ãļverväga innan du använder den. Huvudbegränsningen är att om en disk misslyckas och du inte nyligen har synkat, kanske du inte kan ÃĨterställa fullständigt. Mer specifikt, kanske du inte kan ÃĨterställa upp till storleken pÃĨ de ändrade eller raderade filerna sedan den senaste synkroniseringsoperationen. Detta inträffar även om de ändrade eller raderade filerna inte finns pÃĨ den felaktiga disken. Det är därfÃļr SnapRAID passar bättre fÃļr data som sällan ändras. Å andra sidan fÃļrhindrar nyligen tillagda filer inte ÃĨterställning av redan befintliga filer. Du kommer bara att fÃļrlora de nyligen tillagda filerna om de finns pÃĨ den felaktiga disken. Andra SnapRAID-begränsningar är: * Med SnapRAID har du fortfarande separata filsystem fÃļr varje disk. Med RAID fÃĨr du ett enda stort filsystem. * SnapRAID stripas inte data. Med RAID fÃĨr du en hastighetsÃļkning med striping. * SnapRAID stÃļder inte ÃĨterställning i realtid. Med RAID behÃļver du inte sluta arbeta när en disk misslyckas. * SnapRAID kan bara ÃĨterställa data frÃĨn ett begränsat antal diskfel. Med en säkerhetskopia kan du ÃĨterställa frÃĨn ett fullständigt fel pÃĨ hela disk-arrayen. * Endast filnamn, tidsstämplar, symboliska länkar och hÃĨrda länkar sparas. BehÃļrigheter, ägarskap och utÃļkade attribut sparas inte. 4 KOM IGÃĨNG =========== FÃļr att använda SnapRAID mÃĨste du fÃļrst välja en disk i din disk-array som ska dediceras till `parity`-information. Med en disk fÃļr paritet, kommer du att kunna ÃĨterställa frÃĨn ett enda diskfel, liknande RAID5. Om du vill ÃĨterställa frÃĨn fler diskfel, liknande RAID6, mÃĨste du reservera ytterligare diskar fÃļr paritet. Varje ytterligare paritetsdisk mÃļjliggÃļr ÃĨterställning frÃĨn ett diskfel till. Som paritetsdiskar mÃĨste du välja de stÃļrsta diskarna i arrayen, eftersom paritetsinformationen kan växa till storleken av den stÃļrsta datadisken i arrayen. Dessa diskar kommer att dediceras till att lagra `parity`-filerna. Du bÃļr inte lagra din data pÃĨ dem. Sedan mÃĨste du definiera de `data`-diskar som du vill skydda med SnapRAID. Skyddet är mer effektivt om dessa diskar innehÃĨller data som sällan ändras. Av denna anledning är det bäst att INTE inkludera Windows C:\-disken eller Unix /home, /var och /tmp katalogerna. Listan Ãļver filer sparas i `content`-filerna, som vanligtvis lagras pÃĨ data-, paritets- eller startdiskarna. Denna fil innehÃĨller detaljerna fÃļr din säkerhetskopia, inklusive alla checksummor fÃļr att verifiera dess integritet. `content`-filen lagras i flera kopior, och varje kopia mÃĨste finnas pÃĨ en annan disk fÃļr att säkerställa att, även vid flera diskfel, minst en kopia är tillgänglig. Anta till exempel att du bara är intresserad av en paritetsnivÃĨ av skydd, och dina diskar finns pÃĨ: /mnt/diskp <- vald disk fÃļr paritet /mnt/disk1 <- fÃļrsta disken att skydda /mnt/disk2 <- andra disken att skydda /mnt/disk3 <- tredje disken att skydda Du mÃĨste skapa konfigurationsfilen /etc/snapraid.conf med fÃļljande alternativ: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Om du använder Windows bÃļr du använda Windows sÃļkvägsformat, med enhetsbeteckningar och omvända snedstreck istället fÃļr snedstreck. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Om du har mÃĨnga diskar och fÃĨr slut pÃĨ enhetsbeteckningar kan du montera diskar direkt i undermappar. Se: https://www.google.com/search?q=Windows+mount+point Vid denna punkt är du redo att kÃļra kommandot `sync` fÃļr att bygga paritetsinformationen. snapraid sync Denna process kan ta flera timmar fÃļrsta gÃĨngen, beroende pÃĨ storleken pÃĨ datan som redan finns pÃĨ diskarna. Om diskarna är tomma är processen omedelbar. Du kan stoppa det när som helst genom att trycka Ctrl+C, och vid nästa kÃļrning ÃĨterupptas det där det avbrÃļts. När detta kommando är klart är din data SÄKER. Nu kan du bÃļrja använda din array som du vill och periodiskt uppdatera paritetsinformationen genom att kÃļra kommandot `sync`. 4.1 Skrubbning (Scrubbing) -------------------------- FÃļr att periodiskt kontrollera data och paritet fÃļr fel kan du kÃļra kommandot `scrub`. snapraid scrub Detta kommando jämfÃļr data i din array med den hash som beräknades under kommandot `sync` fÃļr att verifiera integriteten. Varje kÃļrning av kommandot kontrollerar ungefär 8% av arrayen, exklusive data som redan skrubbats under de fÃļregÃĨende 10 dagarna. Du kan använda alternativet -p, --plan fÃļr att specificera en annan mängd och alternativet -o, --older-than fÃļr att specificera en annan ÃĨlder i dagar. Till exempel, fÃļr att kontrollera 5% av arrayen fÃļr block äldre än 20 dagar, använd: snapraid -p 5 -o 20 scrub Om tysta eller input/output-fel hittas under processen, markeras de motsvarande blocken som dÃĨliga i `content`-filen och listas i kommandot `status`. snapraid status FÃļr att fixa dem kan du använda kommandot `fix`, filtrera efter dÃĨliga block med alternativet -e, --filter-error: snapraid -e fix Vid nästa `scrub` kommer felen att fÃļrsvinna frÃĨn `status`-rapporten om de verkligen är fixade. FÃļr att gÃļra det snabbare kan du använda -p bad fÃļr att skrubba endast block markerade som dÃĨliga. snapraid -p bad scrub Att kÃļra `scrub` pÃĨ en osynkad array kan rapportera fel orsakade av borttagna eller modifierade filer. Dessa fel rapporteras i `scrub`- utdata, men de relaterade blocken markeras inte som dÃĨliga. 4.2 Poolning ------------ Obs: Poolningsfunktionen som beskrivs nedan har ersatts av verktyget mergerfs, som nu är det rekommenderade alternativet fÃļr Linux-användare i SnapRAID-communityt. Mergefs ger ett mer flexibelt och effektivt sätt att poola flera enheter till en enda enhetlig monteringspunkt, vilket mÃļjliggÃļr sÃļmlÃļs ÃĨtkomst till filer Ãļver din array utan att fÃļrlita sig pÃĨ symboliska länkar. Det integreras väl med SnapRAID fÃļr paritetsskydd och används ofta i installationer som OpenMediaVault (OMV) eller anpassade NAS-konfigurationer. FÃļr att visa alla filer i din array i samma katalogträd, kan du aktivera funktionen `pooling`. Den skapar en skrivskyddad virtuell vy av alla filer i din array med hjälp av symboliska länkar. Du kan konfigurera `pooling`-katalogen i konfigurationsfilen med: pool /pool eller, om du använder Windows, med: pool C:\pool och kÃļr sedan kommandot `pool` fÃļr att skapa eller uppdatera den virtuella vyn. snapraid pool Om du använder en Unix-plattform och vill dela denna katalog Ãļver nätverket till antingen Windows- eller Unix-maskiner, bÃļr du lägga till fÃļljande alternativ till din /etc/samba/smb.conf: # I den globala sektionen av smb.conf unix extensions = no # I delningssektionen av smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes I Windows kräver delning av symboliska länkar Ãļver ett nätverk att klienter lÃļser dem pÃĨ distans. FÃļr att aktivera detta mÃĨste du, fÃļrutom att dela pool-katalogen, även dela alla diskar oberoende, med hjälp av de disk-namn som definieras i konfigurationsfilen som delningspunkter. Du mÃĨste ocksÃĨ specificera i alternativet `share` i konfigurationsfilen den Windows UNC-sÃļkväg som fjärrklienter behÃļver använda fÃļr att fÃĨ ÃĨtkomst till dessa delade diskar. Till exempel, om du arbetar frÃĨn en server som heter `darkstar`, kan du använda alternativen: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar och dela fÃļljande kataloger Ãļver nätverket: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array fÃļr att tillÃĨta fjärrklienter att fÃĨ ÃĨtkomst till alla filer pÃĨ \\darkstar\pool. Du kan ocksÃĨ behÃļva konfigurera fjärrklienter fÃļr att mÃļjliggÃļra ÃĨtkomst till fjärrsymboliska länkar med kommandot: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Ångra radering (Undeleting) ------------------------------- SnapRAID fungerar mer som ett säkerhetskopieringsprogram än ett RAID-system, och det kan användas fÃļr att ÃĨterställa eller ÃĨngra radering av filer till deras tidigare tillstÃĨnd med hjälp av alternativet -f, --filter: snapraid fix -f FIL eller fÃļr en katalog: snapraid fix -f KATALOG/ Du kan ocksÃĨ använda det fÃļr att ÃĨterställa endast oavsiktligt raderade filer inuti en katalog med hjälp av alternativet -m, --filter-missing, som ÃĨterställer endast saknade filer, och lämnar alla andra orÃļrda. snapraid fix -m -f KATALOG/ Eller fÃļr att ÃĨterställa alla raderade filer pÃĨ alla enheter med: snapraid fix -m 4.4 Återställning ----------------- Det värsta har hänt, och du har fÃļrlorat en eller flera diskar! FÅ INTE PANIK! Du kommer att kunna ÃĨterställa dem! Det fÃļrsta du mÃĨste gÃļra är att undvika ytterligare ändringar i din disk-array. Inaktivera alla fjärranslutningar till den och alla schemalagda processer, inklusive alla schemalagda SnapRAID nattliga sync- eller scrub-kÃļrningar. Fortsätt sedan med fÃļljande steg. ---- 4.4.1 STEG 1 -> Omkonfigurera ---- Du behÃļver lite utrymme fÃļr att ÃĨterställa, helst pÃĨ ytterligare reservdiskar, men en extern USB-disk eller fjärrdisk räcker. Ändra SnapRAID-konfigurationsfilen fÃļr att fÃĨ alternativet `data` eller `parity` fÃļr den felaktiga disken att peka pÃĨ en plats med tillräckligt tomt utrymme fÃļr att ÃĨterställa filerna. Om till exempel disk `d1` har misslyckats, ändra frÃĨn: data d1 /mnt/disk1/ till: data d1 /mnt/new_spare_disk/ Om disken som ska ÃĨterställas är en paritetsdisk, uppdatera det lämpliga `parity`- alternativet. Om du har flera felaktiga diskar, uppdatera alla deras konfigurationsalternativ. ---- 4.4.2 STEG 2 -> Fixa ---- KÃļr kommandot fix och lagra loggen i en extern fil med: snapraid -d NAMN -l fix.log fix Där NAMN är namnet pÃĨ disken, till exempel `d1` i vÃĨrt tidigare exempel. Om disken som ska ÃĨterställas är en paritetsdisk, använd namnen `parity`, `2-parity`, etc. Om du har flera felaktiga diskar, använd flera -d-alternativ fÃļr att specificera alla av dem. Detta kommando kommer att ta lÃĨng tid. Se till att du har nÃĨgra gigabyte ledigt fÃļr att lagra fix.log-filen. KÃļr den frÃĨn en disk med tillräckligt med ledigt utrymme. Nu har du ÃĨterställt allt som är ÃĨterställningsbart. Om vissa filer är delvis eller helt icke-ÃĨterställningsbara, kommer de att dÃļpas om genom att lägga till tillägget `.unrecoverable`. Du kan hitta en detaljerad lista Ãļver alla icke-ÃĨterställningsbara block i fix.log-filen genom att kontrollera alla rader som bÃļrjar med `unrecoverable:`. Om du inte är nÃļjd med ÃĨterställningen kan du fÃļrsÃļka igen hur mÃĨnga gÃĨnger du vill. Om du till exempel har tagit bort filer frÃĨn arrayen efter den senaste `sync`, kan detta leda till att vissa filer inte ÃĨterställs. I detta fall kan du fÃļrsÃļka igen `fix` med alternativet -i, --import, specificera var dessa filer nu finns fÃļr att inkludera dem igen i ÃĨterställningsprocessen. Om du är nÃļjd med ÃĨterställningen kan du fortsätta, men notera att efter synkronisering kan du inte fÃļrsÃļka igen kommandot `fix` längre! ---- 4.4.3 STEG 3 -> Kontrollera ---- Som en fÃļrsiktighetsÃĨtgärd kan du nu kÃļra ett `check`-kommando fÃļr att säkerställa att allt är korrekt pÃĨ den ÃĨterställda disken. snapraid -d NAMN -a check Där NAMN är namnet pÃĨ disken, till exempel `d1` i vÃĨrt tidigare exempel. Alternativen -d och -a talar om fÃļr SnapRAID att endast kontrollera den specificerade disken och ignorera all paritetsdata. Detta kommando kommer att ta lÃĨng tid, men om du inte är alltfÃļr fÃļrsiktig, kan du hoppa Ãļver det. ---- 4.4.4 STEG 4 -> Synkronisera ---- KÃļr kommandot `sync` fÃļr att synkronisera arrayen igen med den nya disken. snapraid sync Om allt är ÃĨterställt är detta kommando omedelbart. 5 KOMMANDON =========== SnapRAID tillhandahÃĨller nÃĨgra enkla kommandon som lÃĨter dig: * Skriva ut statusen fÃļr arrayen -> `status` * Kontrollera diskarna -> `smart`, `probe`, `up`, `down` * GÃļra en säkerhetskopia/Ãļgonblicksbild -> `sync` * Periodiskt kontrollera data -> `scrub` * Återställa den senaste säkerhetskopian/Ãļgonblicksbilden -> `fix`. Kommandon mÃĨste skrivas med gemener. 5.1 status ---------- Skriver ut en sammanfattning av tillstÃĨndet fÃļr disk-arrayen. Det inkluderar information om paritetsfragmentering, hur gamla blocken är utan kontroll, och alla registrerade tysta fel som pÃĨträffats under skrubbning. Informationen som presenteras hänvisar till den senaste tidpunkten du kÃļrde `sync`. Senare modifieringar beaktas inte. Om dÃĨliga block upptäcktes, listas deras blocknummer. FÃļr att fixa dem kan du använda kommandot `fix -e`. Det visar ocksÃĨ ett diagram som representerar den senaste tidpunkten dÃĨ varje block skrubbades eller synkroniserades. Skrubbade block visas med `*`, block synkroniserade men ännu inte skrubbade med `o`. Inget ändras. 5.2 smart --------- Skriver ut en SMART-rapport Ãļver alla diskar i systemet. Det inkluderar en uppskattning av sannolikheten fÃļr fel under det kommande ÃĨret, vilket gÃļr att du kan planera underhÃĨllsersättningar av diskar som visar misstänkta attribut. Denna sannolikhetsuppskattning erhÃĨlls genom att korrelera SMART-attributen fÃļr diskarna med Backblaze-data som finns tillgänglig pÃĨ: https://www.backblaze.com/hard-drive-test-data.html Om SMART rapporterar att en disk hÃĨller pÃĨ att misslyckas, skrivs `FAIL` eller `PREFAIL` ut fÃļr den disken, och SnapRAID returnerar med ett fel. I detta fall rekommenderas omedelbar ersättning av disken starkt. Andra mÃļjliga statussträngar är: logfail - Tidigare var vissa attribut lägre än trÃļskelvärdet. logerr - Enhetens fellogg innehÃĨller fel. selferr - Enhetens självtestlogg innehÃĨller fel. Om alternativet -v, --verbose specificeras, tillhandahÃĨlls en djupare statistisk analys. Denna analys kan hjälpa dig att bestämma om du behÃļver mer eller mindre paritet. Detta kommando använder verktyget `smartctl` och är ekvivalent med att kÃļra `smartctl -a` pÃĨ alla enheter. Om dina enheter inte upptäcks automatiskt korrekt kan du specificera ett anpassat kommando med hjälp av alternativet `smartctl` i konfigurations- filen. Inget ändras. 5.3 probe --------- Skriver ut STRÖM-tillstÃĨndet fÃļr alla diskar i systemet. `Standby` betyder att disken inte snurrar. `Active` betyder att disken snurrar. Detta kommando använder verktyget `smartctl` och är ekvivalent med att kÃļra `smartctl -n standby -i` pÃĨ alla enheter. Om dina enheter inte upptäcks automatiskt korrekt kan du specificera ett anpassat kommando med hjälp av alternativet `smartctl` i konfigurations- filen. Inget ändras. 5.4 up ------ Snurrar upp alla diskar i arrayen. Du kan snurra upp endast specifika diskar med hjälp av alternativet -d, --filter-disk. Att snurra upp alla diskar samtidigt kräver mycket strÃļm. Se till att din strÃļmfÃļrsÃļrjning kan klara det. Inget ändras. 5.5 down -------- Snurrar ner alla diskar i arrayen. Detta kommando använder verktyget `smartctl` och är ekvivalent med att kÃļra `smartctl -s standby,now` pÃĨ alla enheter. Du kan snurra ner endast specifika diskar med hjälp av alternativet -d, --filter-disk alternativet. FÃļr att automatiskt snurra ner vid fel kan du använda alternativet -s, --spin-down-on-error med alla andra kommandon, vilket är ekvivalent med att kÃļra `down` manuellt när ett fel inträffar. Inget ändras. 5.6 diff -------- Listar alla filer som modifierats sedan den senaste `sync` och som behÃļver fÃĨ sin paritetsdata omberäknad. Detta kommando kontrollerar inte filens data, utan endast filens tidsstämpel, storlek och inode. Efter att ha listat alla ändrade filer presenteras en sammanfattning av ändringarna, grupperade efter: equal - Filer ofÃļrändrade frÃĨn tidigare. added - Filer tillagda som inte fanns tidigare. removed - Filer borttagna. updated - Filer med en annan storlek eller tidsstämpel, vilket innebär att de modifierades. moved - Filer flyttade till en annan katalog pÃĨ samma disk. De identifieras genom att ha samma namn, storlek, tidsstämpel och inode, men en annan katalog. copied - Filer som kopierats pÃĨ samma eller en annan disk där originalfilen fortfarande finns kvar. De identifieras genom att ha samma namn, storlek och tidsstämpel. Om tidsstämpeln fÃļr undersekunder är noll mÃĨste hela sÃļkvägen matcha fÃļr att identifieras, inte bara namnet. relocated - Filer som flyttats pÃĨ samma eller en annan disk där originalet har fÃļrsvunnit. De identifieras genom att ha samma namn, storlek och tidsstämpel. Om tidsstämpeln fÃļr undersekunder är noll mÃĨste hela sÃļkvägen matcha fÃļr att identifieras. Till skillnad frÃĨn 'moved' filer pÃĨ samma disk har omlokaliserade filer en annan inode. restored - Filer med en annan inode men matchande katalog, namn, storlek och tidsstämpel. Dessa är vanligtvis filer som ÃĨterställts efter att ha raderats. Om en `sync` krävs är processens returkod 2, istället fÃļr standard 0. Returkoden 1 används fÃļr ett generiskt feltillstÃĨnd. Inget ändras. 5.7 sync -------- Uppdaterar paritetsinformationen. Alla modifierade filer i disk-arrayen läses, och motsvarande paritets- data uppdateras. Du kan stoppa denna process när som helst genom att trycka Ctrl+C, utan att fÃļrlora det arbete som redan utfÃļrts. Vid nästa kÃļrning kommer `sync`-processen att ÃĨterupptas där den avbrÃļts. Om tysta eller input/output-fel hittas under processen, markeras de motsvarande blocken som dÃĨliga. Filer identifieras med sÃļkväg och/eller inode och kontrolleras med storlek och tidsstämpel. Om filstorleken eller tidsstämpeln skiljer sig ÃĨt, beräknas paritetsdata om fÃļr hela filen. Om filen flyttas eller dÃļps om pÃĨ samma disk, samtidigt som samma inode behÃĨlls, beräknas inte pariteten om. Om filen flyttas till en annan disk, beräknas pariteten om, men den tidigare beräknade hash-informationen behÃĨlls. `content`- och `parity`-filerna modifieras vid behov. Filerna i arrayen modifieras INTE. 5.8 scrub --------- Skrubbar arrayen och sÃļker efter tysta eller input/output-fel i data- och paritetsdiskar. Varje anrop kontrollerar ungefär 8% av arrayen, exklusive data som redan skrubbats under de senaste 10 dagarna. Detta innebär att skrubbning en gÃĨng i veckan säkerställer att varje bit data kontrolleras minst en gÃĨng var tredje mÃĨnad. Du kan definiera en annan skrubbplan eller mängd med hjälp av alternativet -p, --plan som accepterar: bad - Skrubbar block markerade som dÃĨliga. new - Skrubbar nyligen synkroniserade block som ännu inte skrubbats. full - Skrubbar allt. 0-100 - Skrubbar den specificerade procentandelen av block. Om du specificerar en procentsats kan du ocksÃĨ använda alternativet -o, --older-than fÃļr att definiera hur gammalt blocket ska vara. De äldsta blocken skrubbas fÃļrst, vilket säkerställer en optimal kontroll. Om du bara vill skrubba de nyligen synkroniserade blocken som ännu inte skrubbats, använd alternativet `-p new`. FÃļr att fÃĨ detaljer om skrubbstatusen, använd kommandot `status`. FÃļr alla tysta eller input/output-fel som hittas, markeras de motsvarande blocken som dÃĨliga i `content`-filen. Dessa dÃĨliga block listas i `status` och kan fixas med `fix -e`. Efter fixningen, vid nästa skrubb, kommer de att kontrolleras igen, och om de befinns korrigerade, tas det dÃĨliga märket bort. FÃļr att skrubba endast de dÃĨliga blocken kan du använda kommandot `scrub -p bad`. Det rekommenderas att kÃļra `scrub` endast pÃĨ en synkroniserad array fÃļr att undvika rapporterade fel orsakade av osynkad data. Dessa fel känns igen som att de inte är tysta fel, och blocken markeras inte som dÃĨliga, men sÃĨdana fel rapporteras i kommandots utdata. `content`-filen modifieras fÃļr att uppdatera tiden fÃļr den senaste kontrollen fÃļr varje block och fÃļr att markera dÃĨliga block. `parity`-filerna modifieras INTE. Filerna i arrayen modifieras INTE. 5.9 fix ------- Fixar alla filer och paritetsdata. Alla filer och paritetsdata jämfÃļrs med Ãļgonblicksbilds- tillstÃĨndet som sparades i den senaste `sync`. Om en skillnad hittas, ÃĨterställs den till det lagrade ÃļgonblicksbildstillstÃĨndet. VARNING! Kommandot `fix` skiljer inte mellan fel och avsiktliga modifieringar. Det ÃĨterställer ovillkorligen filtillstÃĨndet till den senaste `sync`. Om inget annat alternativ specificeras, behandlas hela arrayen. Använd filteralternativen fÃļr att välja en delmängd av filer eller diskar att arbeta med. FÃļr att fixa endast blocken markerade som dÃĨliga under `sync` och `scrub`, använd alternativet -e, --filter-error. Till skillnad frÃĨn andra filteralternativ tillämpar detta fixar endast pÃĨ filer som är ofÃļrändrade sedan den senaste `sync`. SnapRAID dÃļper om alla filer som inte kan fixas genom att lägga till tillägget `.unrecoverable`. Innan fixningen skannas hela arrayen fÃļr att hitta alla filer som flyttats sedan den senaste `sync`-operationen. Dessa filer identifieras av deras tidsstämpel, ignorera deras namn och katalog, och används i ÃĨterställningsprocessen vid behov. Om du flyttade nÃĨgra av dem utanfÃļr arrayen kan du använda alternativet -i, --import fÃļr att specificera ytterligare kataloger att skanna. Filer identifieras endast med sÃļkväg, inte med inode. `content`-filen modifieras INTE. `parity`-filerna modifieras vid behov. Filerna i arrayen modifieras vid behov. 5.10 check ---------- Verifierar alla filer och paritetsdata. Det fungerar som `fix`, men det simulerar endast en ÃĨterställning och inga ändringar skrivs till arrayen. Detta kommando är i fÃļrsta hand avsett fÃļr manuell verifiering, som efter en ÃĨterställningsprocess eller under andra speciella fÃļrhÃĨllanden. FÃļr periodiska och schemalagda kontroller, använd `scrub`. Om du använder alternativet -a, --audit-only, kontrolleras endast fil- datan, och paritetsdatan ignoreras fÃļr en snabbare kÃļrning. Filer identifieras endast med sÃļkväg, inte med inode. Inget ändras. 5.11 list --------- Listar alla filer som finns i arrayen vid tidpunkten fÃļr den senaste `sync`. Med -v eller --verbose visas även undertiden. Inget ändras. 5.12 dup -------- Listar alla dubblettfiler. TvÃĨ filer antas vara lika om deras hashar matchar. Filens data läses inte; endast de fÃļrberäknade hasharna används. Inget ändras. 5.13 pool --------- Skapar eller uppdaterar en virtuell vy av alla filer i din disk-array i `pooling`-katalogen. Filerna kopieras inte utan länkas med hjälp av symboliska länkar. Vid uppdatering raderas alla befintliga symboliska länkar och tomma underkataloger och ersätts med den nya vyn av arrayen. Alla andra vanliga filer lämnas kvar. Inget ändras utanfÃļr pool-katalogen. 5.14 devices ------------ Skriver ut de lÃĨgnivÃĨenheter som används av arrayen. Detta kommando visar enhetsassociationerna i arrayen och är främst avsett som ett skriptgränssnitt. De tvÃĨ fÃļrsta kolumnerna är lÃĨgnivÃĨenhetens ID och sÃļkväg. De nästa tvÃĨ kolumnerna är hÃļgnivÃĨenhetens ID och sÃļkväg. Den sista kolumnen är diskens namn i arrayen. I de flesta fall har du en lÃĨgnivÃĨenhet fÃļr varje disk i arrayen, men i vissa mer komplexa konfigurationer kan du ha flera lÃĨgnivÃĨenheter som används av en enda disk i arrayen. Inget ändras. 5.15 touch ---------- Anger en godtycklig undertidsstämpel fÃļr alla filer som har den satt till noll. Detta fÃļrbättrar SnapRAIDs fÃļrmÃĨga att känna igen flyttade och kopierade filer, eftersom det gÃļr tidsstämpeln nästan unik, vilket minskar mÃļjliga dubbletter. Mer specifikt, om undertidsstämpeln inte är noll, identifieras en flyttad eller kopierad fil som sÃĨdan om den matchar namn, storlek och tidsstämpel. Om undertidsstämpeln är noll, betraktas den som en kopia endast om hela sÃļkvägen, storlek och tidsstämpel alla matchar. Tidsstämpeln med sekundprecision modifieras inte, sÃĨ alla datum och tider fÃļr dina filer bevaras. 5.16 rehash ----------- Schemalägger en omhashning av hela arrayen. Detta kommando ändrar den hash-typ som används, vanligtvis vid uppgradering frÃĨn ett 32-bitars system till ett 64-bitars system, fÃļr att byta frÃĨn MurmurHash3 till den snabbare SpookyHash. Om du redan använder den optimala hashen, gÃļr detta kommando ingenting och informerar dig om att ingen ÃĨtgärd behÃļvs. Omhashningen utfÃļrs inte omedelbart utan sker progressivt under `sync` och `scrub`. Du kan kontrollera omhashningstillstÃĨndet med hjälp av `status`. Under omhashningen bibehÃĨller SnapRAID full funktionalitet, med det enda undantaget att `dup` inte kan upptäcka dubbletter med hjälp av en annan hash. 5.17 locate ----------- Lokaliserar filer som lagras pÃĨ paritetsdiskarna. FÃļr varje matchande fil skrivs dess plats i paritetsfilen och antalet fragment den upptar ut. Du kan använda alternativet -t, --tail fÃļr att begränsa ÃĨtgärden till filer som upptar den angivna slutdelen (tail) av pariteten. Om du vill omallokera dessa filer kan du använda alternativet -W, --force-realloc-tail. Var medveten om att sÃĨdana filer inte skyddas av paritet under omallokeringsprocessen. 6 ALTERNATIV ============ SnapRAID tillhandahÃĨller fÃļljande alternativ: -c, --conf CONFIG Väljer den konfigurationsfil som ska användas. Om den inte specificeras, i Unix används filen `/usr/local/etc/snapraid.conf` om den finns, annars `/etc/snapraid.conf`. I Windows används filen `snapraid.conf` i samma katalog som `snapraid.exe`. -f, --filter PATTERN Filtrerar filerna att behandla i `check` och `fix`. Endast filerna som matchar det specificerade mÃļnstret behandlas. Detta alternativ kan användas flera gÃĨnger. Se avsnittet MÖNSTER fÃļr mer information om mÃļnsterspecifikationer. I Unix, se till att globbing-tecken citeras om de används. Detta alternativ kan endast användas med `check` och `fix`. Det kan inte användas med `sync` och `scrub`, eftersom de alltid behandlar hela arrayen. -d, --filter-disk NAME Filtrerar diskarna att behandla i `check`, `fix`, `up` och `down`. Du mÃĨste specificera ett disk-namn som definieras i konfigurations- filen. Du kan ocksÃĨ specificera paritetsdiskar med namnen: `parity`, `2-parity`, `3-parity`, etc., fÃļr att begränsa operationer till en specifik paritetsdisk. Om du kombinerar flera --filter, --filter-disk och --filter-missing alternativ, väljs endast filer som matchar alla filter. Detta alternativ kan användas flera gÃĨnger. Detta alternativ kan endast användas med `check`, `fix`, `up` och `down`. Det kan inte användas med `sync` och `scrub`, eftersom de alltid behandlar hela arrayen. -m, --filter-missing Filtrerar filerna att behandla i `check` och `fix`. Endast filerna som saknas eller har raderats frÃĨn arrayen behandlas. När det används med `fix`, fungerar detta som ett `undelete`-kommando. Om du kombinerar flera --filter, --filter-disk och --filter-missing alternativ, väljs endast filer som matchar alla filter. Detta alternativ kan endast användas med `check` och `fix`. Det kan inte användas med `sync` och `scrub`, eftersom de alltid behandlar hela arrayen. -e, --filter-error Behandlar filerna med fel i `check` och `fix`. Det behandlar endast filer som har block markerade med tysta eller input/output-fel under `sync` och `scrub`, som listas i `status`. Detta alternativ kan endast användas med `check` och `fix`. -p, --plan PERC|bad|new|full Väljer skrubbplanen. Om PERC är ett numeriskt värde frÃĨn 0 till 100, tolkas det som procentandelen av block som ska skrubbas. Istället fÃļr en procentsats kan du specificera en plan: `bad` skrubbar dÃĨliga block, `new` skrubbar block som ännu inte skrubbats, och `full` skrubbar allt. Detta alternativ kan endast användas med `scrub`. -o, --older-than DAYS Väljer den äldsta delen av arrayen att behandla i `scrub`. DAYS är den minsta ÃĨldern i dagar fÃļr ett block att skrubbas; standard är 10. Block markerade som dÃĨliga skrubbas alltid oavsett detta alternativ. Detta alternativ kan endast användas med `scrub`. -a, --audit-only I `check`, verifierar hashen av filerna utan att kontrollera paritetsdata. Om du bara är intresserad av att kontrollera filens data, kan detta alternativ avsevärt pÃĨskynda kontrollprocessen. Detta alternativ kan endast användas med `check`. -h, --pre-hash I `sync`, kÃļr en preliminär hash-fas av all ny data fÃļr ytterligare verifiering innan paritetsberäkningen. Vanligtvis gÃļrs ingen preliminär hashning i `sync`, och den nya datan hashberäknas precis innan paritetsberäkningen när den läses fÃļr fÃļrsta gÃĨngen. Denna process sker när systemet är under tung belastning, med alla diskar snurrande och en upptagen CPU. Detta är ett extremt tillstÃĨnd fÃļr maskinen, och om den har ett latent hÃĨrdvaruproblem, kan tysta fel gÃĨ obemärkt fÃļrbi eftersom datan ännu inte har hashberäknats. FÃļr att undvika denna risk kan du aktivera `pre-hash`-läget fÃļr att fÃĨ all data läst tvÃĨ gÃĨnger fÃļr att säkerställa dess integritet. Detta alternativ verifierar ocksÃĨ filer som flyttats inom arrayen fÃļr att säkerställa att flyttoperationen lyckades och, om nÃļdvändigt, lÃĨter dig kÃļra en fix-operation innan du fortsätter. Detta alternativ kan endast användas med `sync`. -i, --import DIR Importerar frÃĨn den specificerade katalogen alla filer som raderats frÃĨn arrayen efter den senaste `sync`. Om du fortfarande har sÃĨdana filer, kan de användas av `check` och `fix` fÃļr att fÃļrbättra ÃĨterställningsprocessen. Filerna läses, inklusive i underkataloger, och identifieras oavsett deras namn. Detta alternativ kan endast användas med `check` och `fix`. -s, --spin-down-on-error Vid nÃĨgot fel, snurrar ner alla hanterade diskar innan den avslutas med en statuskod som inte är noll. Detta fÃļrhindrar att enheterna fÃļrblir aktiva och snurrar efter en avbruten operation, vilket hjälper till att undvika onÃļdig värmeuppbyggnad och strÃļm- fÃļrbrukning. Använd detta alternativ fÃļr att säkerställa att diskar stoppas säkert även när ett kommando misslyckas. -w, --bw-limit RATE Tillämpar en global bandbreddsbegränsning fÃļr alla diskar. RATE är antalet byte per sekund. Du kan specificera en multiplikator som K, M eller G (t.ex. --bw-limit 1G). -t, --tail STORLEK Begränsa fillistan till de som inte använder mer än den angivna slutstorleken pÃĨ paritetsdiskarna. Du kan använda multiplikatorer som K, M, G eller T (t.ex. --tail 1G). Detta alternativ är endast giltigt när det används tillsammans med kommandot `locate`. -A, --stats Aktiverar en utÃļkad statusvy som visar ytterligare information. Skärmen visar tvÃĨ diagram: Det fÃļrsta diagrammet visar antalet buffrade strippar fÃļr varje disk, tillsammans med filsÃļkvägen fÃļr filen som fÃļr närvarande används pÃĨ den disken. Vanligtvis kommer den lÃĨngsammaste disken att ha ingen buffert tillgänglig, vilket bestämmer den maximalt uppnÃĨeliga bandbredden. Det andra diagrammet visar procentandelen tid som spenderats i väntan under de senaste 100 sekunderna. Den lÃĨngsammaste disken fÃļrväntas orsaka stÃļrre delen av väntetiden, medan andra diskar bÃļr ha liten eller ingen väntetid eftersom de kan använda sina buffrade strippar. Detta diagram visar ocksÃĨ den tid som spenderats i väntan pÃĨ hash- beräkningar och RAID-beräkningar. Alla beräkningar kÃļrs parallellt med diskoperationer. DärfÃļr, sÃĨ länge det finns mätbar väntetid fÃļr minst en disk, indikerar det att CPU:n är snabb nog att hÃĨlla jämna steg med arbetsbelastningen. -Z, --force-zero Tvingar den osäkra operationen att synkronisera en fil med noll storlek som tidigare var icke-noll. Om SnapRAID upptäcker ett sÃĨdant tillstÃĨnd, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du enkelt kan upptäcka när, efter en systemkrasch, vissa filer som användes trunkerades. Detta är ett mÃļjligt tillstÃĨnd i Linux med filsystemen ext3/ext4. Detta alternativ kan endast användas med `sync`. -E, --force-empty Tvingar den osäkra operationen att synkronisera en disk där alla ursprungliga filer saknas. Om SnapRAID upptäcker att alla filer som ursprungligen fanns pÃĨ disken saknas eller har skrivits om, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du enkelt kan upptäcka när ett datafilsystem inte är monterat. Detta alternativ kan endast användas med `sync`. -U, --force-uuid Tvingar den osäkra operationen att synkronisera, kontrollera och fixa med diskar som har ändrat sin UUID. Om SnapRAID upptäcker att vissa diskar har ändrat UUID, stoppar det att fortsätta om du inte specificerar detta alternativ. Detta gÃļr att du kan upptäcka när dina diskar är monterade pÃĨ fel monteringspunkter. Det är dock tillÃĨtet att ha en enda UUID-ändring med enkel paritet, och fler med multipel paritet, eftersom detta är det normala fallet när man byter ut diskar efter en ÃĨterställning. Detta alternativ kan endast användas med `sync`, `check` eller `fix`. -D, --force-device Tvingar den osäkra operationen att fixa med otillgängliga diskar eller med diskar pÃĨ samma fysiska enhet. Till exempel, om du fÃļrlorade tvÃĨ datadisker och har en reservdisk fÃļr att ÃĨterställa endast den fÃļrsta, kan du ignorera den andra otillgängliga disken. Eller, om du vill ÃĨterställa en disk i det lediga utrymme som finns kvar pÃĨ en redan använd disk, dela samma fysiska enhet. Detta alternativ kan endast användas med `fix`. -N, --force-nocopy I `sync`, `check` och `fix`, inaktiverar heuristiken fÃļr kopieringsdetektering. Utan detta alternativ antar SnapRAID att filer med samma attribut, sÃĨsom namn, storlek och tidsstämpel, är kopior med samma data. Detta mÃļjliggÃļr identifiering av kopierade eller flyttade filer frÃĨn en disk till en annan och ÃĨteranvänder den redan beräknade hash-informationen fÃļr att upptäcka tysta fel eller fÃļr att ÃĨterställa saknade filer. I vissa sällsynta fall kan detta beteende leda till falska positiva eller en lÃĨngsam process pÃĨ grund av mÃĨnga hash-verifieringar, och detta alternativ lÃĨter dig lÃļsa sÃĨdana problem. Detta alternativ kan endast användas med `sync`, `check` och `fix`. -F, --force-full I `sync`, tvingar en fullständig omberäkning av pariteten. Detta alternativ kan användas när du lägger till en ny paritetsnivÃĨ eller om du ÃĨtergick till en gammal content-fil med mer aktuell paritetsdata. Istället fÃļr att ÃĨterskapa pariteten frÃĨn grunden lÃĨter detta dig ÃĨteranvända hasharna som finns i content-filen fÃļr att validera data och bibehÃĨlla dataskyddet under `sync`-processen med hjälp av den befintliga paritetsdatan. Detta alternativ kan endast användas med `sync`. -R, --force-realloc I `sync`, tvingar en fullständig omallokering av filer och ombyggnad av pariteten. Detta alternativ kan användas fÃļr att helt omallokera alla filer, ta bort fragmentering, samtidigt som hasharna som finns i content- filen ÃĨteranvänds fÃļr att validera data. Detta alternativ kan endast användas med `sync`. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte använda det. Du HAR INGET dataskydd under `sync`-operationen. -W, --force-realloc-tail STORLEK Fungerar som -R, --force-realloc, men begränsat till den angivna slutdelen (de sista STORLEK byten) av varje paritetsfil. Den tvingar omallokering (flytt) av alla filfragment/block som fÃļr närvarande lagras i den slutsektionen, vilket gÃļr att de kan placeras var som helst i paritetsfilen/filerna där ledigt utrymme finns (inklusive befintliga hÃĨl). Huvudsyftet med detta alternativ är att minska paritetsfilens storlek pÃĨ disken. Om omallokeringen lyckas rensa hela slutsektionen (inga block är kvar som använder den), trunkeras paritetsfilen och det oanvända slututrymmet ÃĨtertas. Du kan använda multiplikatorer som K, M, G eller T (t.ex. --force-realloc-tail 1G). Du kan använda locate -t, --tail fÃļr att i fÃļrväg veta vilka filer som pÃĨverkas. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte använda det. Du har INGET dataskydd under `sync`-ÃĨtgärden fÃļr de berÃļrda filerna. -l, --log FILE Skriver en detaljerad logg till den specificerade filen. Om detta alternativ inte specificeras, skrivs oväntade fel ut pÃĨ skärmen, vilket potentiellt kan leda till Ãļverdriven utdata i händelse av mÃĨnga fel. När -l, --log specificeras, skrivs endast fatala fel som fÃĨr SnapRAID att stoppa ut pÃĨ skärmen. Om sÃļkvägen bÃļrjar med `>>`, Ãļppnas filen i tilläggsläge. FÃļrekomster av `%D` och `%T` i namnet ersätts med datum och tid i formatet YYYYMMDD respektive HHMMSS. I Windows batch-filer mÃĨste du dubblera `%`-tecknet, t.ex. result-%%D.log. FÃļr att använda `>>` mÃĨste du omsluta namnet i citattecken, t.ex. `">>result.log"`. FÃļr att skicka ut loggen till standardutdata eller standardfel, kan du använda `">&1"` respektive `">&2"`. Se filen snapraid_log.txt eller man-sidan fÃļr beskrivningar av logg-taggar. -L, --error-limit NUMBER Anger en ny felgräns innan kÃļrningen stoppas. Som standard stoppar SnapRAID om det stÃļter pÃĨ mer än 100 input/output-fel, vilket indikerar att en disk troligen hÃĨller pÃĨ att misslyckas. Detta alternativ pÃĨverkar `sync` och `scrub`, som tillÃĨts att fortsätta efter den fÃļrsta uppsättningen diskfel fÃļr att fÃļrsÃļka slutfÃļra sina operationer. Däremot stoppar `check` och `fix` alltid vid det fÃļrsta felet. -S, --start BLKSTART BÃļrjar behandlingen frÃĨn det specificerade blocknumret. Detta kan vara användbart fÃļr att fÃļrsÃļka igen att kontrollera eller fixa specifika block i händelse av en skadad disk. Detta alternativ är främst fÃļr avancerad manuell ÃĨterställning. -B, --count BLKCOUNT Behandlar endast det specificerade antalet block. Detta alternativ är främst fÃļr avancerad manuell ÃĨterställning. -C, --gen-conf CONTENT Genererar en dummy-konfigurationsfil frÃĨn en befintlig content-fil. Konfigurationsfilen skrivs till standardutdata och skriver inte Ãļver en befintlig fil. Denna konfigurationsfil innehÃĨller ocksÃĨ den information som behÃļvs fÃļr att rekonstruera diskmonteringspunkterna om du fÃļrlorar hela systemet. -v, --verbose Skriver ut mer information pÃĨ skärmen. Om det specificeras en gÃĨng, skrivs exkluderade filer och ytterligare statistik ut. Detta alternativ har ingen effekt pÃĨ loggfilerna. -q, --quiet Skriver ut mindre information pÃĨ skärmen. Om det specificeras en gÃĨng, tas fÃļrloppsindikatorn bort; tvÃĨ gÃĨnger, de pÃĨgÃĨende operationerna; tre gÃĨnger, informations- meddelandena; fyra gÃĨnger, statusmeddelandena. Fatala fel skrivs alltid ut pÃĨ skärmen. Detta alternativ har ingen effekt pÃĨ loggfilerna. -H, --help Skriver ut en kort hjälpskärm. -V, --version Skriver ut programversionen. 7 KONFIGURATION =============== SnapRAID kräver en konfigurationsfil fÃļr att veta var din disk-array finns och var paritetsinformationen ska lagras. I Unix används filen `/usr/local/etc/snapraid.conf` om den finns, annars `/etc/snapraid.conf`. I Windows används filen `snapraid.conf` i samma katalog som `snapraid.exe`. Den mÃĨste innehÃĨlla fÃļljande alternativ (skiftlägeskänsligt): 7.1 parity FIL [,FIL] ... ------------------------- Definierar de filer som ska användas fÃļr att lagra paritetsinformationen. Pariteten mÃļjliggÃļr skydd frÃĨn ett enda disk- fel, liknande RAID5. Du kan specificera flera filer, som mÃĨste finnas pÃĨ olika diskar. När en fil inte kan växa mer, används nästa fil. Det totala tillgängliga utrymmet mÃĨste vara minst lika stort som den stÃļrsta datadisken i arrayen. Du kan lägga till ytterligare paritetsfiler senare, men du kan inte ändra ordning pÃĨ eller ta bort dem. Att hÃĨlla paritetsdiskarna reserverade fÃļr paritet säkerställer att de inte blir fragmenterade, vilket fÃļrbättrar prestandan. I Windows lämnas 256 MB oanvänt pÃĨ varje disk fÃļr att undvika varningen om fulla diskar. Detta alternativ är obligatoriskt och kan endast användas en gÃĨng. 7.2 (2,3,4,5,6)-parity FIL [,FIL] ... ------------------------------------- Definierar de filer som ska användas fÃļr att lagra extra paritetsinformation. FÃļr varje paritetsnivÃĨ som specificeras aktiveras en ytterligare skyddsnivÃĨ: * 2-parity mÃļjliggÃļr RAID6 dubbel paritet. * 3-parity mÃļjliggÃļr trippel paritet. * 4-parity mÃļjliggÃļr fyrdubbel (fyra) paritet. * 5-parity mÃļjliggÃļr penta (fem) paritet. * 6-parity mÃļjliggÃļr hexa (sex) paritet. Varje paritetsnivÃĨ kräver närvaro av alla fÃļregÃĨende paritets- nivÃĨer. Samma Ãļverväganden som fÃļr alternativet `parity` gäller. Dessa alternativ är valfria och kan endast användas en gÃĨng. 7.3 z-parity FIL [,FIL] ... --------------------------- Definierar en alternativ fil och ett format fÃļr att lagra trippel paritet. Detta alternativ är ett alternativ till `3-parity`, främst avsett fÃļr lÃĨgpresterande processorer som ARM eller AMD Phenom, Athlon och Opteron som inte stÃļder SSSE3-instruktionsuppsättningen. I sÃĨdana fall ger det bättre prestanda. Detta format liknar, men är snabbare än, det som används av ZFS RAIDZ3. Liksom ZFS fungerar det inte utÃļver trippel paritet. När du använder `3-parity` kommer du att varnas om det rekommenderas att använda formatet `z-parity` fÃļr prestandafÃļrbättring. Det är mÃļjligt att konvertera frÃĨn ett format till ett annat genom att justera konfigurationsfilen med Ãļnskad z-parity eller 3-parity fil och använda `fix` fÃļr att ÃĨterskapa den. 7.4 content FIL --------------- Definierar den fil som ska användas fÃļr att lagra listan och checksummorna fÃļr alla filer som finns i din disk-array. Den kan placeras pÃĨ en disk som används fÃļr data, paritet eller nÃĨgon annan tillgänglig disk. Om du använder en datadisk exkluderas denna fil automatiskt frÃĨn `sync`-processen. Detta alternativ är obligatoriskt och kan användas flera gÃĨnger fÃļr att spara flera kopior av samma fil. Du mÃĨste lagra minst en kopia fÃļr varje paritetsdisk som används plus en. Att använda ytterligare kopior skadar inte. 7.5 data NAMN KATALOG --------------------- Definierar namnet och monteringspunkten fÃļr datadiskarna i arrayen. NAMN används fÃļr att identifiera disken och mÃĨste vara unikt. KATALOG är monteringspunkten fÃļr disken i filsystemet. Du kan ändra monteringspunkten vid behov, sÃĨ länge du behÃĨller NAMN fixerat. Du bÃļr använda ett alternativ fÃļr varje datadisk i arrayen. Du kan byta namn pÃĨ en disk senare genom att ändra NAMN direkt i konfigurationsfilen och sedan kÃļra ett `sync`-kommando. I händelse av namnbyte gÃļrs associationen med hjälp av den lagrade UUID:n fÃļr diskarna. 7.6 extra NAME DIR ------------------ Definierar namn och monteringspunkt fÃļr ytterligare diskar som ska Ãļvervakas med kommandona `smart` och `probe`. Detta är användbart fÃļr att Ãļvervaka diskar som inte ingÃĨr i arrayen men som krävs fÃļr att systemet ska fungera, till exempel startdisken. Observera att sÃĨdana diskar inte pÃĨverkas av kommandona `up` och `down` eftersom de fÃļrväntas alltid snurra. 7.7 nohidden ------------ Exkluderar alla dolda filer och kataloger. I Unix är dolda filer de som bÃļrjar med `.`. I Windows är de de med det dolda attributet. 7.8 exclude/include MÖNSTER --------------------------- Definierar fil- eller katalogmÃļnstren att exkludera eller inkludera i sync-processen. Alla mÃļnster behandlas i den specificerade ordningen. Om det fÃļrsta mÃļnstret som matchar är ett `exclude`-mÃļnster, exkluderas filen. Om det är ett `include`-mÃļnster, inkluderas filen. Om inget mÃļnster matchar, exkluderas filen om det sista mÃļnstret som specificerats är ett `include`-mÃļnster, eller inkluderas om det sista mÃļnstret som specificerats är ett `exclude`-mÃļnster. Se avsnittet MÖNSTER fÃļr mer information om mÃļnster- specifikationer. Detta alternativ kan användas flera gÃĨnger. 7.9 blocksize STORLEK_I_KIBIBYTES --------------------------------- Definierar den grundläggande blockstorleken i kibibytes fÃļr pariteten. En kibibyte är 1024 byte. Standard blockstorlek är 256, vilket bÃļr fungera fÃļr de flesta fall. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte ändra detta värde. FÃļr att ändra detta värde i framtiden, kommer du att behÃļva ÃĨterskapa hela pariteten! En anledning att använda en annan blockstorlek är om du har mÃĨnga smÃĨ filer, i storleksordningen miljoner. FÃļr varje fil, även om den bara är nÃĨgra byte, allokeras ett helt block paritet, och med mÃĨnga filer kan detta leda till betydande oanvänt paritetsutrymme. När du helt fyller paritetsdisken, är du inte tillÃĨten att lägga till fler filer pÃĨ datadiskarna. Det bortkastade paritetsutrymmet ackumuleras dock inte Ãļver datadiskar. Bortkastat utrymme som härrÃļr frÃĨn ett hÃļgt antal filer pÃĨ en datadisk begränsar endast mängden data pÃĨ den datadisken, inte andra. Som en approximation kan du anta att hälften av blockstorleken är bortkastad fÃļr varje fil. Till exempel, med 100 000 filer och en 256 KiB blockstorlek, kommer du att slÃļsa 12,8 GB paritet, vilket kan resultera i 12,8 GB mindre utrymme tillgängligt pÃĨ datadisken. Du kan kontrollera mängden bortkastat utrymme pÃĨ varje disk med hjälp av `status`. Detta är mängden utrymme du mÃĨste lämna ledigt pÃĨ data- diskarna eller använda fÃļr filer som inte ingÃĨr i arrayen. Om detta värde är negativt betyder det att du är nära att fylla pariteten, och det representerar det utrymme du fortfarande kan slÃļsa. FÃļr att undvika detta problem kan du använda en stÃļrre partition fÃļr paritet. Om till exempel paritetspartitionen är 12,8 GB stÃļrre än datadiskarna, har du tillräckligt med extra utrymme fÃļr att hantera upp till 100 000 filer pÃĨ varje datadisk utan nÃĨgot bortkastat utrymme. Ett trick fÃļr att fÃĨ en stÃļrre paritetspartition i Linux är att formatera den med kommandot: mkfs.ext4 -m 0 -T largefile4 DEVICE Detta resulterar i cirka 1,5% extra utrymme, ungefär 60 GB fÃļr en 4 TB-disk, vilket mÃļjliggÃļr cirka 460 000 filer pÃĨ varje datadisk utan nÃĨgot bortkastat utrymme. 7.10 hashsize STORLEK_I_BYTE ---------------------------- Definierar hash-storleken i byte fÃļr de sparade blocken. Standard hash-storlek är 16 byte (128 bitar), vilket bÃļr fungera fÃļr de flesta fall. VARNING! Detta alternativ är endast fÃļr experter, och det rekommenderas starkt att inte ändra detta värde. FÃļr att ändra detta värde i framtiden, kommer du att behÃļva ÃĨterskapa hela pariteten! En anledning att använda en annan hash-storlek är om ditt system har begränsat minne. Som en tumregel kräver SnapRAID vanligtvis 1 GiB RAM fÃļr varje 16 TB data i arrayen. Specifikt, fÃļr att lagra hasharna av datan, kräver SnapRAID ungefär TS*(1+HS)/BS byte RAM, där TS är den totala storleken i byte av din disk-array, BS är blockstorleken i byte och HS är hash-storleken i byte. Till exempel, med 8 diskar pÃĨ 4 TB, en blockstorlek pÃĨ 256 KiB (1 KiB = 1024 byte) och en hash-storlek pÃĨ 16, fÃĨr du: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB Om du byter till en hash-storlek pÃĨ 8 fÃĨr du: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB Om du byter till en blockstorlek pÃĨ 512 fÃĨr du: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB Om du byter till bÃĨde en hash-storlek pÃĨ 8 och en blockstorlek pÃĨ 512 fÃĨr du: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB 7.11 autosave STORLEK_I_GIGABYTES --------------------------------- Sparar automatiskt tillstÃĨndet vid synkronisering eller skrubbning efter att den specificerade mängden GB har behandlats. Detta alternativ är användbart fÃļr att undvika att starta om lÃĨnga `sync`- kommandon frÃĨn bÃļrjan om de avbryts av en maskinkrasch eller nÃĨgon annan händelse. 7.12 temp_limit TEMPERATUR_CELSIUS ---------------------------------- Anger den maximalt tillÃĨtna disk-temperaturen i Celsius. När den specificeras, kontrollerar SnapRAID periodiskt temperaturen pÃĨ alla diskar med hjälp av verktyget smartctl. De aktuella disk-temperaturerna visas medan SnapRAID är igÃĨng. Om nÃĨgon disk Ãļverskrider denna gräns, stoppas alla operationer och diskarna snurras ner (sätts i standby) under den tid som definieras av alternativet `temp_sleep`. Efter viloperioden ÃĨterupptas operationerna, och kan potentiellt pausas igen om temperaturgränsen nÃĨs ännu en gÃĨng. Under drift analyserar SnapRAID ocksÃĨ värmekurvan fÃļr varje disk och uppskattar den lÃĨngsiktiga stabila temperaturen de fÃļrväntas nÃĨ om aktiviteten fortsätter. Uppskattningen utfÃļrs fÃļrst efter att disk-temperaturen har Ãļkat fyra gÃĨnger, vilket säkerställer att tillräckligt med datapoäng finns tillgängliga fÃļr att fastställa en pÃĨlitlig trend. Denna fÃļrutsagda stabila temperatur visas inom parentes bredvid den aktuella värdet och hjälper till att bedÃļma om systemets kylning är tillräcklig. Denna uppskattade temperatur är endast fÃļr informationssyfte och har ingen effekt pÃĨ SnapRAIDs beteende. Programmens ÃĨtgärder baseras enbart pÃĨ de faktiska uppmätta disk-temperaturerna. FÃļr att utfÃļra denna analys behÃļver SnapRAID en referens fÃļr system- temperaturen. Det fÃļrsÃļker fÃļrst läsa den frÃĨn tillgängliga hÃĨrdvaru- sensorer. Om ingen system-sensor kan nÃĨs, används den lägsta disk- temperaturen som mättes vid start av kÃļrningen som en reservreferens. Normalt visar SnapRAID endast temperaturen pÃĨ den hetaste disken. FÃļr att visa temperaturen pÃĨ alla diskar, använd alternativet -A eller --stats. 7.13 temp_sleep TID_I_MINUTER ----------------------------- Anger standby-tiden, i minuter, när temperaturgränsen har nÃĨtts. Under denna period fÃļrblir diskarna nedsnurrade. Standard är 5 minuter. 7.14 pool KATALOG ----------------- Definierar poolningskatalogen där den virtuella vyn av disk- arrayen skapas med hjälp av kommandot `pool`. Katalogen mÃĨste redan existera. 7.15 share UNC_KATALOG ---------------------- Definierar Windows UNC-sÃļkvägen som krävs fÃļr att fÃĨ ÃĨtkomst till diskarna pÃĨ distans. Om detta alternativ specificeras, använder de symboliska länkarna som skapats i pool- katalogen denna UNC-sÃļkväg fÃļr att fÃĨ ÃĨtkomst till diskarna. Utan detta alternativ använder de genererade symboliska länkarna endast lokala sÃļkvägar, vilket inte tillÃĨter delning av pool-katalogen Ãļver nätverket. De symboliska länkarna bildas med hjälp av den specificerade UNC-sÃļkvägen, lägger till disk-namnet som specificeras i `data`-alternativet, och lägger slutligen till filens katalog och namn. Detta alternativ krävs endast fÃļr Windows. 7.16 smartctl DISK/PARITY ALTERNATIV... --------------------------------------- Definierar anpassade smartctl-alternativ fÃļr att fÃĨ SMART-attributen fÃļr varje disk. Detta kan krävas fÃļr RAID-kontroller och vissa USB- diskar som inte kan upptäckas automatiskt. Platsinnehavaren %s ersätts av enhetens namn, men är valfri fÃļr fixerade enheter som RAID-kontroller. DISK är samma disk-namn som specificeras i `data`-alternativet. PARITY är ett av paritetsnamnen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` eller `z-parity`. I de specificerade ALTERNATIVEN ersätts strängen `%s` med enhetens namn. FÃļr RAID-kontroller är enheten sannolikt fixerad, och du kanske inte behÃļver använda `%s`. Se smartmontools dokumentation fÃļr mÃļjliga alternativ: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices Till exempel: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignorerar det specificerade SMART-attributet vid beräkning av sannolikheten fÃļr diskfel. Detta alternativ är användbart om en disk rapporterar ovanliga eller vilseledande värden fÃļr ett visst attribut. DISK är samma disk-namn som specificeras i `data`-alternativet. PARITY är ett av paritetsnamnen: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` eller `z-parity`. Det speciella värdet * kan användas fÃļr att ignorera attributet pÃĨ alla diskar. Till exempel, fÃļr att ignorera attributet `Current Pending Sector Count` pÃĨ alla diskar: smartignore * 197 FÃļr att ignorera det endast pÃĨ den fÃļrsta paritetsdisken: smartignore parity 197 7.18 Exempel ------------ Ett exempel pÃĨ en typisk konfiguration fÃļr Unix är: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Ett exempel pÃĨ en typisk konfiguration fÃļr Windows är: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 MÃļNSTER (PATTERN) =================== MÃļnster ger ett flexibelt sätt att filtrera filer fÃļr inkludering eller exkludering. Genom att använda jokertecken kan du definiera regler som matchar specifika filnamn eller hela katalogstrukturer utan att lista varje sÃļkväg manuellt. FrÃĨgetecknet `?` matchar valfritt enskilt tecken utom katalogavgränsaren. Detta gÃļr det användbart fÃļr att matcha filnamn med variabla tecken samtidigt som mÃļnstret hÃĨlls begränsat till en enda katalognivÃĨ. Den enkla stjärnan `*` matchar valfri teckensekvens, men precis som frÃĨgetecknet korsar den aldrig kataloggränser. Den stannar vid snedstrecket, vilket gÃļr den lämplig fÃļr matchning inom en enskild sÃļkvägskomponent. Detta är det standardbeteende fÃļr jokertecken som är bekant frÃĨn skal-globbing. Den dubbla stjärnan `**` är mer kraftfull; den matchar valfri teckensekvens inklusive katalogavgränsare. Detta gÃļr att mÃļnster kan matcha Ãļver flera katalognivÃĨer. När `**` fÃļrekommer direkt i ett mÃļnster kan det matcha noll eller fler tecken inklusive snedstreck mellan den omkringliggande bokstavliga texten. Den viktigaste användningen av `**` är i den speciella formen `/**/`. Detta matchar noll eller flera kompletta katalognivÃĨer, vilket gÃļr det mÃļjligt att matcha filer pÃĨ valfritt djup i ett katalogträd utan att känna till den exakta sÃļkvägsstrukturen. Till exempel matchar mÃļnstret `src/**/main.js` filerna `src/main.js` (hoppar Ãļver noll kataloger), `src/ui/main.js` (hoppar Ãļver en katalog) och `src/ui/components/main.js` (hoppar Ãļver tvÃĨ kataloger). Teckenklasser som använder hakparenteser `[]` matchar ett enskilt tecken frÃĨn en angiven uppsättning eller ett intervall. Precis som de andra mÃļnstren fÃļr enskilda tecken matchar de inte katalogavgränsare. Klasser stÃļder intervall och negering med ett utropstecken. Den grundläggande skillnaden att komma ihÃĨg är att `*`, `?` och teckenklasser alla respekterar kataloggränser och endast matchar inom en enskild sÃļkvägskomponent, medan `**` är det enda mÃļnstret som kan matcha Ãļver katalogavgränsare. Det finns fyra olika typer av mÃļnster: FILE Väljer valfri fil med namnet FILE. Detta mÃļnster gäller endast filer, inte kataloger. DIR/ Väljer valfri katalog med namnet DIR och allt innehÃĨll. Detta mÃļnster gäller endast kataloger, inte filer. /PATH/FILE Väljer den exakt angivna filsÃļkvägen. Detta mÃļnster gäller endast filer, inte kataloger. /PATH/DIR/ Väljer den exakt angivna katalogsÃļkvägen och allt innehÃĨll. Detta mÃļnster gäller endast kataloger, inte filer. När du specificerar en absolut sÃļkväg som bÃļrjar med /, tillämpas den vid array-rotkatalogen, inte den lokala filsystemets rotkatalog. I Windows kan du använda bakÃĨtsnedstrecket \ istället fÃļr framÃĨtsnedstrecket /. Windows systemkataloger, junction points, monteringspunkter och andra Windows speciella kataloger behandlas som filer, vilket innebär att fÃļr att exkludera dem mÃĨste du använda en fil-regel, inte en katalog-regel. Om filnamnet innehÃĨller tecknet `*`, `?`, `[`, eller `]`, mÃĨste du undvika det fÃļr att fÃļrhindra att det tolkas som ett globbing-tecken. I Unix är undvikande-tecknet `\`; i Windows är det `^`. När mÃļnstret är pÃĨ kommandoraden mÃĨste du dubbla undvikande- tecknet fÃļr att fÃļrhindra att det tolkas av kommandoskalet. I konfigurationsfilen kan du använda olika strategier fÃļr att filtrera filerna som ska behandlas. Det enklaste tillvägagÃĨngssättet är att endast använda `exclude`-regler fÃļr att ta bort alla filer och kataloger du inte vill behandla. Till exempel: # Exkluderar alla filer som heter `*.unrecoverable` exclude *.unrecoverable # Exkluderar rotkatalogen `/lost+found` exclude /lost+found/ # Exkluderar alla underkataloger som heter `tmp` exclude tmp/ Det motsatta tillvägagÃĨngssättet är att definiera endast de filer du vill behandla, med endast `include`-regler. Till exempel: # Inkluderar endast vissa kataloger include /movies/ include /musics/ include /pictures/ Det sista tillvägagÃĨngssättet är att blanda `exclude`- och `include`-regler. I detta fall är ordningen pÃĨ reglerna viktig. Tidigare regler har fÃļreträde framfÃļr senare. FÃļr att fÃļrenkla kan du lista alla `exclude`-regler fÃļrst och sedan alla `include`-regler. Till exempel: # Exkluderar alla filer som heter `*.unrecoverable` exclude *.unrecoverable # Exkluderar alla underkataloger som heter `tmp` exclude tmp/ # Inkluderar endast vissa kataloger include /movies/ include /musics/ include /pictures/ PÃĨ kommandoraden, med hjälp av alternativet -f, kan du bara använda `include`- mÃļnster. Till exempel: # Kontrollerar endast .mp3-filerna. # I Unix, använd citattecken fÃļr att undvika globbing-expansion av skalet. snapraid -f "*.mp3" check I Unix, när du använder globbing-tecken pÃĨ kommandoraden, mÃĨste du citattecken dem fÃļr att fÃļrhindra att skalet expanderar dem. 9 IGNORERA FILER (IGNORE FILE) ============================== UtÃļver de globala reglerna i konfigurationsfilen kan du placera `.snapraidignore`-filer i vilken katalog som helst i arrayen fÃļr att definiera decentraliserade exkluderingsregler. Regler som definieras i `.snapraidignore` tillämpas efter reglerna i konfigurationsfilen. Detta innebär att de har hÃļgre prioritet och kan användas fÃļr att exkludera filer som tidigare inkluderats av den globala konfigurationen. I praktiken innebär det att om en lokal regel matchar, sÃĨ exkluderas filen oavsett de globala inkluderingsinställningarna. MÃļnsterlogiken i `.snapraidignore` speglar den globala konfigurationen men fÃļrankrar mÃļnstren till den katalog där filen finns: FILE Väljer alla filer med namnet FILE i denna katalog eller under. Detta fÃļljer samma globbing-regler som det globala mÃļnstret. DIR/ Väljer alla kataloger med namnet DIR och allt innehÃĨll, som finns i denna katalog eller under. /PATH/FILE Väljer den exakt angivna filen relativt platsen fÃļr `.snapraidignore`-filen. /PATH/DIR/ Väljer den exakt angivna katalogen och allt innehÃĨll, relativt platsen fÃļr `.snapraidignore`-filen. Till skillnad frÃĨn den globala konfigurationen stÃļder `.snapraidignore`-filer endast exkluderingsregler; du kan inte använda `include`-mÃļnster eller negation (!). Till exempel, om du har en `.snapraidignore` i `/mnt/disk1/projects/`: # Exkluderar ENDAST /mnt/disk1/projects/output.bin /output.bin # Exkluderar alla kataloger med namnet `build` inuti projects/ build/ # Exkluderar alla .tmp-filer inuti projects/ eller dess undermappar *.tmp 10 INNEHÃĨLL (CONTENT) ===================== SnapRAID lagrar listan och checksummorna fÃļr dina filer i content-filen. Det är en binär fil som listar alla filer som finns i din disk-array, tillsammans med alla checksummor fÃļr att verifiera deras integritet. Denna fil läses och skrivs av kommandona `sync` och `scrub` och läses av kommandona `fix`, `check` och `status`. 11 PARITET (PARITY) =================== SnapRAID lagrar paritetsinformationen fÃļr din array i parity- filerna. Dessa är binära filer som innehÃĨller den beräknade pariteten fÃļr alla block definierade i `content`-filen. Dessa filer läses och skrivs av kommandona `sync` och `fix` och läses endast av kommandona `scrub` och `check`. 12 KODNING ========== SnapRAID i Unix ignorerar all kodning. Det läser och lagrar filnamnen med samma kodning som används av filsystemet. I Windows konverteras alla namn som läses frÃĨn filsystemet och behandlas i UTF-8-format. FÃļr att fÃĨ filnamn utskrivna korrekt mÃĨste du ställa in Windows- konsolen till UTF-8-läge med kommandot `chcp 65001` och använda ett TrueType-typsnitt som `Lucida Console` som konsoltypsnitt. Detta pÃĨverkar endast de utskrivna filnamnen; om du omdirigerar konsolutdata till en fil, är den resulterande filen alltid i UTF-8-format. 13 UPPHOVSRäTT (COPYRIGHT) ========================== Denna fil är Copyright (C) 2025 Andrea Mazzoleni 14 SE ÄVEN (SEE ALSO) ===================== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-uk.1000066400000000000000000003262301522717156100163320ustar00rootroot00000000000000.TH "SnapRAID Đ ĐĩСĐĩŅ€Đ˛ĐŊĐĩ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Đ¸Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņ–Đ˛" 1 .SH NAME snapraid \- SnapRAID Đ ĐĩСĐĩŅ€Đ˛ĐŊĐĩ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Đ¸Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņ–Đ˛ .SH ĐšĐžŅ€ĐžŅ‚ĐēиК ĐžĐŋĐ¸Ņ snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH ОĐŋĐ¸Ņ SnapRAID — ҆Đĩ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, Ņ€ĐžĐˇŅ€ĐžĐąĐģĐĩĐŊа Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Đ¸Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņ–Đ˛, ŅĐēа СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… ҃ виĐŋадĐē҃ Đ˛Ņ–Đ´ĐŧОви Đ´Đž ҈ĐĩŅŅ‚Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛. .PP В ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Đ´ĐžĐŧĐ°ŅˆĐŊŅ–Ņ… ĐŧĐĩĐ´Ņ–Đ°Ņ†ĐĩĐŊŅ‚Ņ€Ņ–Đ˛ С вĐĩĐģиĐēиĐŧи Ņ„Đ°ĐšĐģаĐŧи, Ņ‰Đž Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ, SnapRAID ĐŋŅ€ĐžĐŋĐžĐŊŅƒŅ” ĐēŅ–ĐģҌĐēа Ņ„ŅƒĐŊĐēŅ†Ņ–Đš: .PD 0 .IP \(bu Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи, вĐļĐĩ СаĐŋОвĐŊĐĩĐŊŅ– Ņ„Đ°ĐšĐģаĐŧи, ĐąĐĩС ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐžŅŅ‚Ņ– Ņ—Ņ… ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‡Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ĐŊĐ¸Ņ… ŅĐē ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš. .IP \(bu ĐŖŅŅ– Đ˛Đ°ŅˆŅ– даĐŊŅ– Ņ…ĐĩŅˆŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ– даĐŊĐ¸Ņ… Ņ‚Đ° СаĐŋĐžĐąŅ–ĐŗĐ°ĐŊĐŊŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐŊŅŽ. .IP \(bu КоĐģи ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Ņ–Đ´ĐŧОвиĐģи, ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ˛Ņ‚Ņ€Đ°Ņ‚Đ° даĐŊĐ¸Ņ… ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đ¸ŅĐēаĐŧи, Ņ‰Đž ĐŋĐžŅŅ‚Ņ€Đ°ĐļдаĐģи; даĐŊŅ– ĐŊа Ņ–ĐŊŅˆĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ… СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи. .IP \(bu Đ¯ĐēŅ‰Đž ви виĐŋадĐēОвО видаĐģиĐģи Ņ„Đ°ĐšĐģи ĐŊа Đ´Đ¸ŅĐē҃, ĐŧĐžĐļĐģивĐĩ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. .IP \(bu Đ”Đ¸ŅĐēи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŧĐ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€. .IP \(bu Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи в ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ‡Đ°Ņ. .IP \(bu SnapRAID ĐŊĐĩ ĐąĐģĐžĐēŅƒŅ” Đ˛Đ°ŅˆŅ– даĐŊŅ–; ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸ĐŋиĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ в ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ‡Đ°Ņ ĐąĐĩС ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐŊŅ даĐŊĐ¸Ņ…. .IP \(bu ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ„Đ°ĐšĐģ҃ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Ņ€ĐžĐˇĐēŅ€ŅƒŅ‚Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ОдиĐŊ Đ´Đ¸ŅĐē, Ņ‰Đž ĐˇĐ°ĐžŅ‰Đ°Đ´ĐļŅƒŅ” ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐĩĐŊĐĩŅ€ĐŗŅ–ŅŽ Ņ‚Đ° СĐŧĐĩĐŊŅˆŅƒŅ” ҈҃Đŧ. .PD .PP ДĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— Đ˛Ņ–Đ´Đ˛Ņ–Đ´Đ°ĐšŅ‚Đĩ ĐžŅ„Ņ–Ņ†Ņ–ĐšĐŊиК ŅĐ°ĐšŅ‚ SnapRAID: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH ОбĐŧĐĩĐļĐĩĐŊĐŊŅ SnapRAID Ņ” ĐŗŅ–ĐąŅ€Đ¸Đ´ĐžĐŧ ĐŧŅ–Đļ RAID Ņ‚Đ° ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐžŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, ĐŋŅ€Đ°ĐŗĐŊŅƒŅ‡Đ¸ ĐŋĐžŅ”Đ´ĐŊĐ°Ņ‚Đ¸ ĐŊаКĐēŅ€Đ°Ņ‰Ņ– ĐŋĐĩŅ€ĐĩĐ˛Đ°ĐŗĐ¸ ĐžĐąĐžŅ…. ОдĐŊаĐē, Đ˛Ņ–ĐŊ ĐŧĐ°Ņ” Đ´ĐĩŅĐēŅ– ОйĐŧĐĩĐļĐĩĐŊĐŊŅ, ŅĐēŅ– ҁĐģŅ–Đ´ Đ˛Ņ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐĩŅ€ĐĩĐ´ ĐšĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ. .PP ĐžŅĐŊОвĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰Đž ŅĐēŅ‰Đž Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ, а ви ĐŊĐĩŅ‰ĐžĐ´Đ°Đ˛ĐŊĐž ĐŊĐĩ виĐēĐžĐŊŅƒĐ˛Đ°Đģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ СĐŧĐžĐŗŅ‚Đ¸ ĐŋОвĐŊŅ–ŅŅ‚ŅŽ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ–. КоĐŊĐēŅ€ĐĩŅ‚ĐŊŅ–ŅˆĐĩ, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… ĐžĐąŅŅĐŗĐžĐŧ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… айО видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐĻĐĩ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž СĐŧŅ–ĐŊĐĩĐŊŅ– айО видаĐģĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ. ĐžŅŅŒ Ņ‡ĐžĐŧ҃ SnapRAID ĐēŅ€Đ°Ņ‰Đĩ ĐŋŅ–Đ´Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Đ´ĐģŅ даĐŊĐ¸Ņ…, ŅĐēŅ– Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. .PP З Ņ–ĐŊŅˆĐžĐŗĐž йОĐē҃, Ņ‰ĐžĐšĐŊĐž дОдаĐŊŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐŋĐĩŅ€Đĩ҈ĐēОдĐļĐ°ŅŽŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅŽ вĐļĐĩ ҖҁĐŊŅƒŅŽŅ‡Đ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛. Ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ ĐģĐ¸ŅˆĐĩ ĐŊĐĩŅ‰ĐžĐ´Đ°Đ˛ĐŊĐž дОдаĐŊŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ‰Đž вОĐŊи СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ. .PP ІĐŊŅˆŅ– ОйĐŧĐĩĐļĐĩĐŊĐŊŅ SnapRAID: .PD 0 .IP \(bu З SnapRAID ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ ҉Đĩ Ņ” ĐžĐēŅ€ĐĩĐŧŅ– Ņ„Đ°ĐšĐģĐžĐ˛Ņ– ŅĐ¸ŅŅ‚ĐĩĐŧи Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. З RAID ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ОдĐŊ҃ вĐĩĐģиĐē҃ Ņ„Đ°ĐšĐģĐžĐ˛Ņƒ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. .IP \(bu SnapRAID ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ҇ĐĩŅ€ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ (striping) даĐŊĐ¸Ņ…. З RAID ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ ĐˇĐ°Đ˛Đ´ŅĐēи ҇ĐĩŅ€ĐŗŅƒĐ˛Đ°ĐŊĐŊŅŽ. .IP \(bu SnapRAID ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ в Ņ€ĐĩаĐģҌĐŊĐžĐŧ҃ Ņ‡Đ°ŅŅ–. З RAID ваĐŧ ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋŅ€Đ¸ĐŋиĐŊŅŅ‚Đ¸ Ņ€ĐžĐąĐžŅ‚Ņƒ, ĐēĐžĐģи Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ. .IP \(bu SnapRAID ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŊОвĐģŅŽĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– ĐģĐ¸ŅˆĐĩ С ОйĐŧĐĩĐļĐĩĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ. З Ņ€ĐĩСĐĩŅ€Đ˛ĐŊиĐŧ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅĐŧ ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐŋҖҁĐģŅ ĐŋОвĐŊĐžŅ— Đ˛Ņ–Đ´ĐŧОви Đ˛ŅŅŒĐžĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. .IP \(bu ЗбĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‡Đ°ŅĐžĐ˛Ņ– ĐŧŅ–Ņ‚Đēи, ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– Ņ‚Đ° ĐļĐžŅ€ŅŅ‚ĐēŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ. ĐŸŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋ҃, вĐģĐ°ŅĐŊŅ–ŅŅ‚ŅŒ Ņ‚Đ° Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐŊĐĩ СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. .PD .SH ĐŸĐžŅ‡Đ°Ņ‚ĐžĐē Ņ€ĐžĐąĐžŅ‚Đ¸ ЊОй виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ SnapRAID, ҁĐŋĐĩŅ€ŅˆŅƒ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ОдиĐŊ Đ´Đ¸ŅĐē ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ‰ĐžĐą ĐŋŅ€Đ¸ŅĐ˛ŅŅ‚Đ¸Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— \`ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–\`. З ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ви СĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŧОви ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID5. .PP Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Ņ–Đ´ĐŧОвиĐģи, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID6, ви ĐŋОвиĐŊĐŊŅ– ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐļĐĩĐŊ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК Đ´Đ¸ŅĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– дОСвОĐģŅŅ” Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŧОви ҉Đĩ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. .PP Đ¯Đē Đ´Đ¸ŅĐēи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ви ĐŋОвиĐŊĐŊŅ– Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆŅ– Đ´Đ¸ŅĐēи в ĐŧĐ°ŅĐ¸Đ˛Ņ–, ĐžŅĐēŅ–ĐģҌĐēи Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŧĐžĐļĐĩ ĐˇŅ€ĐžŅŅ‚Đ¸ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. .PP ĐĻŅ– Đ´Đ¸ŅĐēи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋŅ€Đ¸ŅĐ˛ŅŅ‡ĐĩĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅŽ Ņ„Đ°ĐšĐģŅ–Đ˛ \`ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–\`. Ви ĐŊĐĩ ĐŋОвиĐŊĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ĐŊа ĐŊĐ¸Ņ… ŅĐ˛ĐžŅ— даĐŊŅ–. .PP ĐŸĐžŅ‚Ņ–Đŧ ви ĐŋОвиĐŊĐŊŅ– виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Đ´Đ¸ŅĐēи \`даĐŊĐ¸Ņ…\`, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ SnapRAID. Đ—Đ°Ņ…Đ¸ŅŅ‚ Ņ” ĐąŅ–ĐģҌ҈ ĐĩŅ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊиĐŧ, ŅĐēŅ‰Đž ҆Җ Đ´Đ¸ŅĐēи ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ даĐŊŅ–, Ņ‰Đž Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. З ҆ҖҔҗ ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊи ĐēŅ€Đ°Ņ‰Đĩ НЕ вĐēĐģŅŽŅ‡Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐē Windows C:\\ айО ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Unix /home, /var Ņ‚Đ° /tmp. .PP ĐĄĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģŅ–Đ˛ СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ ҃ Ņ„Đ°ĐšĐģĐ°Ņ… \`content\` (вĐŧҖҁ҂), ŅĐēŅ– ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ…, ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°ĐģҌĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ Đ´ĐĩŅ‚Đ°ĐģŅ– Đ˛Đ°ŅˆĐžŅ— Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžŅ— ĐēĐžĐŋŅ–Ņ—, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Đ˛ŅŅ– ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ– ҁ҃Đŧи Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ—Ņ— ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ФаКĐģ \`content\` СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ в ĐēŅ–ĐģҌĐēĐžŅ… ĐēĐžĐŋŅ–ŅŅ…, Ņ– ĐēĐžĐļĐŊа ĐēĐžĐŋŅ–Ņ ĐŋОвиĐŊĐŊа ĐąŅƒŅ‚Đ¸ ĐŊа ĐžĐēŅ€ĐĩĐŧĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰ĐžĐą ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸, Ņ‰Đž ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ҃ Ņ€Đ°ĐˇŅ– Đ˛Ņ–Đ´ĐŧОви ĐēŅ–ĐģҌĐēĐžŅ… Đ´Đ¸ŅĐēŅ–Đ˛, ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊа ĐēĐžĐŋŅ–Ņ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа. .PP НаĐŋŅ€Đ¸ĐēĐģад, ĐŋŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸ĐŧĐž, Đ˛Đ°Ņ ҆ҖĐēĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, а Đ˛Đ°ŅˆŅ– Đ´Đ¸ŅĐēи Ņ€ĐžĐˇŅ‚Đ°ŅˆĐžĐ˛Đ°ĐŊŅ– Са Đ°Đ´Ņ€ĐĩŅĐ°Đŧи: .PP .RS 4 /mnt/diskp <\- Đ˛Đ¸ĐąŅ€Đ°ĐŊиК Đ´Đ¸ŅĐē Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– .PD 0 .PP .PD /mnt/disk1 <\- ĐŋĐĩŅ€ŅˆĐ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ .PD 0 .PP .PD /mnt/disk2 <\- Đ´Ņ€ŅƒĐŗĐ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ .PD 0 .PP .PD /mnt/disk3 <\- ҂ҀĐĩŅ‚Ņ–Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ .PD 0 .PD .RE .PP Ви ĐŋОвиĐŊĐŊŅ– ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ /etc/snapraid.conf С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиĐŧи ĐžĐŋŅ†Ņ–ŅĐŧи: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP Đ¯ĐēŅ‰Đž ви ĐŋŅ€Đ°Ņ†ŅŽŅ”Ņ‚Đĩ в Windows, ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ҈ĐģŅŅ…Ņƒ Windows, С ĐģŅ–Ņ‚ĐĩŅ€Đ°Đŧи Đ´Đ¸ŅĐēŅ–Đ˛ Ņ‚Đ° ĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐŧи ҁĐēҖҁĐŊиĐŧи Ņ€Đ¸ŅĐēаĐŧи СаĐŧŅ–ŅŅ‚ŅŒ ĐŋŅ€ŅĐŧĐ¸Ņ…. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐąĐ°ĐŗĐ°Ņ‚Đž Đ´Đ¸ŅĐēŅ–Đ˛ Ņ– СаĐēŅ–ĐŊŅ‡Đ¸ĐģĐ¸ŅŅ ĐģŅ–Ņ‚ĐĩŅ€Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ вĐēĐģадĐĩĐŊŅ– ĐŋаĐŋĐēи. Див: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP На Ņ†ŅŒĐžĐŧ҃ ĐĩŅ‚Đ°ĐŋŅ– ви ĐŗĐžŅ‚ĐžĐ˛Ņ– СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\` Đ´ĐģŅ ĐŋĐžĐąŅƒĐ´ĐžĐ˛Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP ĐĻĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ ĐŧĐžĐļĐĩ СаКĐŊŅŅ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŗĐžĐ´Đ¸ĐŊ вĐŋĐĩŅ€ŅˆĐĩ, СаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ даĐŊĐ¸Ņ…, ŅĐēŅ– вĐļĐĩ Ņ” ĐŊа Đ´Đ¸ŅĐēĐ°Ņ…. Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐēи ĐŋĐžŅ€ĐžĐļĐŊŅ–, ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ ĐŧĐ¸Ņ‚Ņ‚Ņ”Đ˛Đž. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž в ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ‡Đ°Ņ, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ Ctrl+C, Ņ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž СаĐŋ҃ҁĐē҃ Đ˛Ņ–ĐŊ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Ņƒ С ĐŧŅ–ŅŅ†Ņ, Đ´Đĩ ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊиК. .PP КоĐģи Ņ†Ņ ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒŅŅ, Đ˛Đ°ŅˆŅ– даĐŊŅ– БЕЗПЕЧНІ. .PP ĐĸĐĩĐŋĐĩŅ€ ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅ‡Đ°Ņ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅĐ˛Ņ–Đš ĐŧĐ°ŅĐ¸Đ˛ ŅĐē ваĐŧ ĐŋĐžĐ´ĐžĐąĐ°Ņ”Ņ‚ŅŒŅŅ Ņ– ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐžĐŊОвĐģŅŽĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, СаĐŋ҃ҁĐēĐ°ŅŽŅ‡Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\`. .SS ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ (Scrubbing) ЊОй ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ даĐŊŅ– Ņ‚Đ° ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊа ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋĐžĐŧиĐģĐžĐē, ви ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`scrub\`. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP ĐĻŅ ĐēĐžĐŧаĐŊда ĐŋĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” даĐŊŅ– ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– С Ņ…Đĩ҈ĐĩĐŧ, ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊиĐŧ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐēĐžĐŧаĐŊди \`sync\`, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. .PP КоĐļĐĩĐŊ СаĐŋ҃ҁĐē ĐēĐžĐŧаĐŊди ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 8% ĐŧĐ°ŅĐ¸Đ˛Ņƒ, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ даĐŊŅ–, ŅĐēŅ– вĐļĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Ņ… 10 Đ´ĐŊŅ–Đ˛. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-p, \-\-plan, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–ĐŊ҈҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ, Ņ– ĐžĐŋŅ†Ņ–ŅŽ \-o, \-\-older\-than, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Đ˛Ņ–Đē ҃ Đ´ĐŊŅŅ…. НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ 5% ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŊа ĐąĐģĐžĐēи ŅŅ‚Đ°Ņ€ŅˆŅ– Са 20 Đ´ĐŊŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP Đ¯ĐēŅ‰Đž ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– \`content\` Ņ– ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҃ ĐēĐžĐŧаĐŊĐ´Ņ– \`status\`. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP ЊОй Ņ—Ņ… виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`fix\`, ҄ҖĐģŅŒŅ‚Ņ€ŅƒŅŽŅ‡Đ¸ ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ \-e, \-\-filter\-error: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž \`scrub\` ĐŋĐžĐŧиĐģĐēи СĐŊиĐēĐŊŅƒŅ‚ŅŒ ĐˇŅ– ĐˇĐ˛Ņ–Ņ‚Ņƒ \`status\`, ŅĐēŅ‰Đž вОĐŊи ҁĐŋŅ€Đ°Đ˛Đ´Ņ– виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–. ЊОй ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ ҆Đĩ ŅˆĐ˛Đ¸Đ´ŅˆĐĩ, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ \-p bad, Ņ‰ĐžĐą ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP ЗаĐŋ҃ҁĐē \`scrub\` ĐŊа ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐŧĐžĐļĐĩ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚Đ¸ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐēи, ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊŅ– видаĐģĐĩĐŊиĐŧи айО СĐŧŅ–ĐŊĐĩĐŊиĐŧи Ņ„Đ°ĐšĐģаĐŧи. ĐĻŅ– ĐŋĐžĐŧиĐģĐēи Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ ҃ вивĐĩĐ´ĐĩĐŊĐŊŅ– \`scrub\`, аĐģĐĩ ĐŋОв\'ŅĐˇĐ°ĐŊŅ– ĐąĐģĐžĐēи ĐŊĐĩ ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. .SS Об\'Ņ”Đ´ĐŊаĐŊĐŊŅ (Pooling) ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа: Đ¤ŅƒĐŊĐēŅ†Ņ–Ņ Ой\'Ņ”Đ´ĐŊаĐŊĐŊŅ, ĐžĐŋĐ¸ŅĐ°ĐŊа ĐŊиĐļ҇Đĩ, ĐąŅƒĐģа СаĐŧŅ–ĐŊĐĩĐŊа Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ĐžĐŧ mergerfs, ŅĐēиК Ņ‚ĐĩĐŋĐĩŅ€ Ņ” Ņ€ĐĩĐēĐžĐŧĐĩĐŊдОваĐŊĐžŅŽ ĐžĐŋŅ†Ņ–Ņ”ŅŽ Đ´ĐģŅ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ Linux ҃ ҁĐŋŅ–ĐģҌĐŊĐžŅ‚Ņ– SnapRAID. Mergefs СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐąŅ–ĐģҌ҈ ĐŗĐŊŅƒŅ‡ĐēиК Ņ‚Đ° ĐĩŅ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊиК ҁĐŋĐžŅŅ–Đą Ой\'Ņ”Đ´ĐŊаĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… Đ´Đ¸ŅĐēŅ–Đ˛ в Ņ”Đ´Đ¸ĐŊ҃ ҃ĐŊҖ҄ҖĐēОваĐŊ҃ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, дОСвОĐģŅŅŽŅ‡Đ¸ ĐąĐĩСĐŋĐĩŅ€Đĩ҈ĐēОдĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐąĐĩС виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ. Đ’Ņ–ĐŊ Đ´ĐžĐąŅ€Đĩ Ņ–ĐŊŅ‚ĐĩĐŗŅ€ŅƒŅ”Ņ‚ŅŒŅŅ С SnapRAID Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ– ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ…, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē OpenMediaVault (OMV) айО ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēĐ¸Ņ… ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŅ… NAS. .PP ЊОй Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ Đ˛ŅŅ– Ņ„Đ°ĐšĐģи ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– в ОдĐŊĐžĐŧ҃ Đ´ĐĩŅ€ĐĩĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ \`pooling\` (Ой\'Ņ”Đ´ĐŊаĐŊĐŊŅ). ВоĐŊа ŅŅ‚Đ˛ĐžŅ€ŅŽŅ” Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ \`pooling\` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP айО, ŅĐēŅ‰Đž ви ĐŋŅ€Đ°Ņ†ŅŽŅ”Ņ‚Đĩ в Windows, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP а ĐŋĐžŅ‚Ņ–Đŧ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`pool\` Đ´ĐģŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ айО ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧ҃ Unix Ņ– Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Ņ†ŅŒĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃ Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊ Windows айО Unix, ви ĐŋОвиĐŊĐŊŅ– Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ Đ´Đž Đ˛Đ°ŅˆĐžĐŗĐž /etc/samba/smb.conf: .PP .RS 4 # ĐŖ ĐŗĐģОйаĐģҌĐŊĐžĐŧ҃ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # ĐŖ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP ĐŖ Windows ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃ виĐŧĐ°ĐŗĐ°Ņ” Đ˛Ņ–Đ´ ĐēĐģŅ–Ņ”ĐŊŅ‚Ņ–Đ˛ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐžĐŗĐž Ņ—Ņ… Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊаваĐŊĐŊŅ. ЊОй ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ҆Đĩ, ĐžĐēҀҖĐŧ ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool, ви Ņ‚Đ°ĐēĐžĐļ ĐŋОвиĐŊĐŊŅ– ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ĐŊĐĩСаĐģĐĩĐļĐŊĐž, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ–ĐŧĐĩĐŊа Đ´Đ¸ŅĐēŅ–Đ˛, виСĐŊĐ°Ņ‡ĐĩĐŊŅ– ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–, ŅĐē Ņ‚ĐžŅ‡Đēи ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃. Ви Ņ‚Đ°ĐēĐžĐļ ĐŋОвиĐŊĐŊŅ– вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ҃ ĐžĐŋ҆Җҗ \`share\` ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ ҈ĐģŅŅ… Windows UNC, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиĐŧ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°Đŧ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ†Đ¸Ņ… ҁĐŋŅ–ĐģҌĐŊĐ¸Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. .PP НаĐŋŅ€Đ¸ĐēĐģад, ĐŋŅ€Đ°Ņ†ŅŽŅŽŅ‡Đ¸ С ҁĐĩŅ€Đ˛ĐĩŅ€Đ° С Ņ–ĐŧĐĩĐŊĐĩĐŧ \`darkstar\`, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋ҆Җҗ: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP Ņ– ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP Ņ‰ĐžĐą дОСвОĐģĐ¸Ņ‚Đ¸ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиĐŧ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°Đŧ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ \\\\darkstar\\pool. .PP ВаĐŧ Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊŅ– ĐēĐģŅ–Ņ”ĐŊŅ‚Đ¸, Ņ‰ĐžĐą ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Đ’Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ (Undeleting) SnapRAID Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊŅƒŅ” ĐąŅ–ĐģҌ҈Đĩ ŅĐē ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, ĐŊŅ–Đļ ŅĐ¸ŅŅ‚ĐĩĐŧа RAID, Ņ– ĐšĐžĐŗĐž ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ айО ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ Đ´Đž Ņ—Ņ… ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ŅŅ‚Đ°ĐŊ҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ \-f, \-\-filter: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP айО Đ´ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ виĐŋадĐēОвО видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ҁĐĩŅ€ĐĩдиĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ \-m, \-\-filter\-missing, ŅĐēа Đ˛Ņ–Đ´ĐŊОвĐģŅŽŅ” ĐģĐ¸ŅˆĐĩ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– Ņ„Đ°ĐšĐģи, СаĐģĐ¸ŅˆĐ°ŅŽŅ‡Đ¸ Đ˛ŅŅ– Ņ–ĐŊŅˆŅ– ĐŊĐĩĐ´ĐžŅ‚ĐžŅ€ĐēаĐŊиĐŧи. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP АйО Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ… Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Đ’Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ (Recovering) ĐĄŅ‚Đ°ĐģĐžŅŅ ĐŊĐ°ĐšĐŗŅ–Ņ€ŅˆĐĩ, Ņ– ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Đģи ОдиĐŊ айО ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛! .PP НЕ ĐŸĐĐĐ†ĐšĐŖĐ™ĐĸЕ! Ви СĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ… Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸! .PP ПĐĩŅ€ŅˆĐĩ, Ņ‰Đž ви ĐŋОвиĐŊĐŊŅ– ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸, ҆Đĩ ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋОдаĐģŅŒŅˆĐ¸Ņ… СĐŧŅ–ĐŊ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ ĐąŅƒĐ´ŅŒ\-ŅĐēŅ– Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊŅ– ĐŋŅ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Đ´Đž ĐŊŅŒĐžĐŗĐž Ņ‚Đ° ĐąŅƒĐ´ŅŒ\-ŅĐēŅ– СаĐŋĐģаĐŊОваĐŊŅ– ĐŋŅ€ĐžŅ†ĐĩŅĐ¸, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐąŅƒĐ´ŅŒ\-ŅĐē҃ СаĐŋĐģаĐŊОваĐŊ҃ ĐŊҖ҇ĐŊ҃ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ айО ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ SnapRAID. .PP ĐŸĐžŅ‚Ņ–Đŧ виĐēĐžĐŊĐ°ĐšŅ‚Đĩ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐēŅ€ĐžĐēи. .SS КРОК 1 \-> ПĐĩŅ€ĐĩĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Đ´ĐĩŅĐēиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, в Ņ–Đ´ĐĩаĐģŅ– ĐŊа Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ°ŅĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…, аĐģĐĩ СОвĐŊŅ–ŅˆĐŊŅ–Đš USB\-Đ´Đ¸ŅĐē айО Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиК Đ´Đ¸ŅĐē ĐŋŅ–Đ´Ņ–ĐšĐ´Đĩ. .PP ЗĐŧŅ–ĐŊŅ–Ņ‚ŅŒ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ SnapRAID, Ņ‰ĐžĐą ĐžĐŋŅ†Ņ–Ņ \`data\` айО \`parity\` Đ´Đ¸ŅĐēа, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ, вĐēĐ°ĐˇŅƒĐ˛Đ°Đģа ĐŊа ĐŧҖҁ҆Đĩ Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ С Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅŽ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛. .PP НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž Đ´Đ¸ŅĐē \`d1\` Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ, СĐŧŅ–ĐŊŅ–Ņ‚ŅŒ С: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP ĐŊа: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐē, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, Ņ” Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊ҃ ĐžĐŋŅ†Ņ–ŅŽ \`parity\`. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ, ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ŅƒŅŅ– Ņ—Ņ…ĐŊŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊŅ– ĐžĐŋ҆Җҗ. .SS КРОК 2 \-> ВиĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ (Fix) ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ fix, СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‡Đ¸ ĐļŅƒŅ€ĐŊаĐģ ҃ СОвĐŊŅ–ŅˆĐŊŅŒĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP ДĐĩ NAME — ҆Đĩ Ņ–Đŧ\'Ņ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐēĐģад \`d1\` ҃ ĐŊĐ°ŅˆĐžĐŧ҃ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–. Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐē, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, Ņ” Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ–ĐŧĐĩĐŊа \`parity\`, \`2\-parity\`, Ņ‚ĐžŅ‰Đž. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš \-d, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ—Ņ… ŅƒŅŅ–. .PP ĐĻŅ ĐēĐžĐŧаĐŊда СаКĐŧĐĩ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ‡Đ°ŅŅƒ. .PP ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž ҃ Đ˛Đ°Ņ Ņ” ĐēŅ–ĐģҌĐēа ĐŗŅ–ĐŗĐ°ĐąĐ°ĐšŅ‚ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ fix.log. ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Ņ—Ņ— С Đ´Đ¸ŅĐēа С Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅŽ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. .PP ĐĸĐĩĐŋĐĩŅ€ ви Đ˛Ņ–Đ´ĐŊОвиĐģи Đ˛ŅĐĩ, Ņ‰Đž ĐŧĐžĐļĐŊа Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸. Đ¯ĐēŅ‰Đž Đ´ĐĩŅĐēŅ– Ņ„Đ°ĐšĐģи Ņ‡Đ°ŅŅ‚ĐēОвО айО ĐŋОвĐŊŅ–ŅŅ‚ŅŽ ĐŊĐĩĐŧĐžĐļĐģивО Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊŅ– С дОдаваĐŊĐŊŅĐŧ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ \`.unrecoverable\`. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŊĐ°ĐšŅ‚Đ¸ Đ´ĐĩŅ‚Đ°ĐģҌĐŊиК ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… ĐŊĐĩĐ˛Ņ–Đ´ĐŊОвĐģŅŽĐ˛Đ°ĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛ ҃ Ņ„Đ°ĐšĐģŅ– fix.log, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Đ˛ŅˆĐ¸ Đ˛ŅŅ– Ņ€ŅĐ´Đēи, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŒŅŅ С \`unrecoverable:\`. .PP Đ¯ĐēŅ‰Đž ви ĐŊĐĩ СадОвОĐģĐĩĐŊŅ– Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅĐŧ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ ĐšĐžĐŗĐž ҁ҂ҖĐģҌĐēи Ņ€Đ°ĐˇŅ–Đ˛, ҁĐēŅ–ĐģҌĐēи СайаĐļĐ°Ņ”Ņ‚Đĩ. .PP НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ви видаĐģиĐģи Ņ„Đ°ĐšĐģи С ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŋҖҁĐģŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`, ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ‚ĐžĐŗĐž, Ņ‰Đž Đ´ĐĩŅĐēŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊŅ–. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ \`fix\`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-i, \-\-import, вĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸, Đ´Đĩ ҆Җ Ņ„Đ°ĐšĐģи СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐˇĐ°Ņ€Đ°Đˇ, Ņ‰ĐžĐą СĐŊĐžĐ˛Ņƒ вĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ Ņ—Ņ… ҃ ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. .PP Đ¯ĐēŅ‰Đž ви СадОвОĐģĐĩĐŊŅ– Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅĐŧ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸, аĐģĐĩ ĐˇĐ°ŅƒĐ˛Đ°ĐļŅ‚Đĩ, Ņ‰Đž ĐŋҖҁĐģŅ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ СĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`fix\`! .SS КРОК 3 \-> ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа (Check) Đ¯Đē ОйĐĩŅ€ĐĩĐļĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ‚ĐĩĐŋĐĩŅ€ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`check\`, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž ĐŊа Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP ДĐĩ NAME — ҆Đĩ Ņ–Đŧ\'Ņ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐēĐģад \`d1\` ҃ ĐŊĐ°ŅˆĐžĐŧ҃ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–. .PP ОĐŋ҆Җҗ \-d Ņ‚Đ° \-a вĐēĐ°ĐˇŅƒŅŽŅ‚ŅŒ SnapRAID ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ ĐģĐ¸ŅˆĐĩ вĐēаСаĐŊиК Đ´Đ¸ŅĐē Ņ‚Đ° Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ĐĻŅ ĐēĐžĐŧаĐŊда СаКĐŧĐĩ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ‡Đ°ŅŅƒ, аĐģĐĩ ŅĐēŅ‰Đž ви ĐŊĐĩ ĐŊĐ°Đ´Ņ‚Đž ОйĐĩŅ€ĐĩĐļĐŊŅ–, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ— ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸. .SS КРОК 4 \-> ХиĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ (Sync) ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\`, Ņ‰ĐžĐą ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐ°ŅĐ¸Đ˛ С ĐŊОвиĐŧ Đ´Đ¸ŅĐēĐžĐŧ. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP Đ¯ĐēŅ‰Đž Đ˛ŅĐĩ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐž, Ņ†Ņ ĐēĐžĐŧаĐŊда виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŧĐ¸Ņ‚Ņ‚Ņ”Đ˛Đž. .SH КоĐŧаĐŊди SnapRAID ĐŊĐ°Đ´Đ°Ņ” ĐēŅ–ĐģҌĐēа ĐŋŅ€ĐžŅŅ‚Đ¸Ņ… ĐēĐžĐŧаĐŊĐ´, ŅĐēŅ– дОСвОĐģŅŅŽŅ‚ŅŒ: .PD 0 .IP \(bu ВивĐĩŅŅ‚Đ¸ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŧĐ°ŅĐ¸Đ˛Ņƒ \-> \`status\` .IP \(bu КĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēаĐŧи \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu ĐĄŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ ĐēĐžĐŋŅ–ŅŽ/СĐŊŅ–ĐŧĐžĐē \-> \`sync\` .IP \(bu ПĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ даĐŊŅ– \-> \`scrub\` .IP \(bu Đ’Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐžŅŅ‚Đ°ĐŊĐŊŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ ĐēĐžĐŋŅ–ŅŽ/СĐŊŅ–ĐŧĐžĐē \-> \`fix\`. .PD .PP КоĐŧаĐŊди ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ ĐŊаĐŋĐ¸ŅĐ°ĐŊŅ– ĐŧаĐģиĐŧи ĐģŅ–Ņ‚ĐĩŅ€Đ°Đŧи. .SS status Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ СвĐĩĐ´ĐĩĐŊĐŊŅ ŅŅ‚Đ°ĐŊ҃ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. .PP ВĐēĐģŅŽŅ‡Đ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋŅ€Đž Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ˛Ņ–Đē ĐąĐģĐžĐēŅ–Đ˛ ĐąĐĩС ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° Đ˛ŅŅ– СаĐŋĐ¸ŅĐ°ĐŊŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи, Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. .PP ĐŸŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ŅŅ‚ĐžŅŅƒŅ”Ņ‚ŅŒŅŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžĐŗĐž Ņ‡Đ°ŅŅƒ, ĐēĐžĐģи ви СаĐŋŅƒŅŅ‚Đ¸Đģи \`sync\`. ĐŸŅ–ĐˇĐŊŅ–ŅˆŅ– ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŊĐĩ Đ˛Ņ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ. .PP Đ¯ĐēŅ‰Đž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Ņ—Ņ…ĐŊŅ– ĐŊĐžĐŧĐĩŅ€Đ¸ ĐąĐģĐžĐēŅ–Đ˛. ЊОй Ņ—Ņ… виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`fix \-e\`. .PP ĐĸаĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐŗŅ€Đ°Ņ„Ņ–Đē, Ņ‰Đž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ” ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš Ņ‡Đ°Ņ, ĐēĐžĐģи ĐēĐžĐļĐĩĐŊ ĐąĐģĐžĐē ĐąŅƒĐ˛ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊиК айО ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊиК. ĐĄĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐ¸ĐŧвОĐģĐžĐŧ \`*\`, ĐąĐģĐžĐēи, ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ–, аĐģĐĩ ҉Đĩ ĐŊĐĩ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, \- \`o\`. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS smart Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐˇĐ˛Ņ–Ņ‚ SMART ŅƒŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ҃ ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. .PP ВĐēĐģŅŽŅ‡Đ°Ņ” ĐžŅ†Ņ–ĐŊĐē҃ ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ĐŧОви ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž Ņ€ĐžĐē҃, дОСвОĐģŅŅŽŅ‡Đ¸ ваĐŧ ĐŋĐģаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐģаĐŊĐžĐ˛Ņƒ СаĐŧŅ–ĐŊ҃ Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒ ĐŋŅ–Đ´ĐžĐˇŅ€Ņ–ĐģŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸. .PP ĐĻŅ ĐžŅ†Ņ–ĐŊĐēа ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– ĐžŅ‚Ņ€Đ¸ĐŧаĐŊа ҈ĐģŅŅ…ĐžĐŧ ĐēĐžŅ€ĐĩĐģŅŅ†Ņ–Ņ— Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛ SMART Đ´Đ¸ŅĐēŅ–Đ˛ С даĐŊиĐŧи Backblaze, Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP Đ¯ĐēŅ‰Đž SMART ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”, Ņ‰Đž Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ, Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž Đ´Đ¸ŅĐēа Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒŅŅ \`FAIL\` айО \`PREFAIL\`, Ņ– SnapRAID ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ĐŋĐžĐŧиĐģĐē҃. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐĩĐŗĐ°ĐšĐŊа СаĐŧŅ–ĐŊа Đ´Đ¸ŅĐēа. .PP ІĐŊŅˆŅ– ĐŧĐžĐļĐģĐ¸Đ˛Ņ– Ņ€ŅĐ´Đēи ŅŅ‚Đ°ĐŊ҃: .RS 4 .PD 0 .HP 4 .I logfail ĐŖ ĐŧиĐŊ҃ĐģĐžĐŧ҃ Đ´ĐĩŅĐēŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐąŅƒĐģи ĐŊиĐļŅ‡Đ¸Đŧи Са ĐŋĐžŅ€Ņ–Đŗ. .HP 4 .I logerr Đ–ŅƒŅ€ĐŊаĐģ ĐŋĐžĐŧиĐģĐžĐē ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐžĐŧиĐģĐēи. .HP 4 .I selferr Đ–ŅƒŅ€ĐŊаĐģ ŅĐ°ĐŧĐžŅ‚ĐĩŅŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐžĐŧиĐģĐēи. .PD .RE .PP Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ĐžĐŋŅ†Ņ–ŅŽ \-v, \-\-verbose, ĐŊĐ°Đ´Đ°Ņ”Ņ‚ŅŒŅŅ ĐŗĐģĐ¸ĐąŅˆĐ¸Đš ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Ņ‡ĐŊиК аĐŊаĐģŅ–Đˇ. ĐĻĐĩĐš аĐŊаĐģŅ–Đˇ ĐŧĐžĐļĐĩ Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸ ваĐŧ Đ˛Đ¸Ņ€Ņ–ŅˆĐ¸Ņ‚Đ¸, Ņ‡Đ¸ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ваĐŧ ĐąŅ–ĐģŅŒŅˆĐ° айО ĐŧĐĩĐŊŅˆĐ° ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. .PP ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ \`smartctl\` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ \`smartctl \-a\` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. .PP Đ¯ĐēŅ‰Đž Đ˛Đ°ŅˆŅ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ— ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐē҃ ĐēĐžĐŧаĐŊĐ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \`smartctl\` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS probe Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ŅŅ‚Đ°ĐŊ Đ–Đ˜Đ’Đ›Đ•ĐĐĐ¯ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ҃ ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. .PP \`Standby\` ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´Đ¸ŅĐē ĐŊĐĩ ОйĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ. \`Active\` ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´Đ¸ŅĐē ОйĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ. .PP ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ \`smartctl\` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ \`smartctl \-n standby \-i\` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. .PP Đ¯ĐēŅ‰Đž Đ˛Đ°ŅˆŅ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ— ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐē҃ ĐēĐžĐŧаĐŊĐ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \`smartctl\` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS up РОСĐēŅ€ŅƒŅ‡ŅƒŅ” Đ˛ŅŅ– Đ´Đ¸ŅĐēи ĐŧĐ°ŅĐ¸Đ˛Ņƒ. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€ĐžĐˇĐēŅ€ŅƒŅ‚Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐĩвĐŊŅ– Đ´Đ¸ŅĐēи, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-d, \-\-filter\-disk. .PP ОдĐŊĐžŅ‡Đ°ŅĐŊĐĩ Ņ€ĐžĐˇĐēŅ€ŅƒŅ‡ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ виĐŧĐ°ĐŗĐ°Ņ” ĐąĐ°ĐŗĐ°Ņ‚Đž ĐĩĐŊĐĩŅ€ĐŗŅ–Ņ—. ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž Đ˛Đ°Ņˆ ĐąĐģĐžĐē ĐļивĐģĐĩĐŊĐŊŅ ĐŧĐžĐļĐĩ ҆Đĩ Đ˛Đ¸Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS down Đ—ŅƒĐŋиĐŊŅŅ” Đ˛ŅŅ– Đ´Đ¸ŅĐēи ĐŧĐ°ŅĐ¸Đ˛Ņƒ. .PP ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ \`smartctl\` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ \`smartctl \-s standby,now\` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐĩвĐŊŅ– Đ´Đ¸ŅĐēи, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-d, \-\-filter\-disk. .PP ДĐģŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ— ĐˇŅƒĐŋиĐŊĐēи ĐŋŅ€Đ¸ ĐŋĐžĐŧиĐģ҆Җ ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-s, \-\-spin\-down\-on\-error С ĐąŅƒĐ´ŅŒ\-ŅĐēĐžŅŽ Ņ–ĐŊŅˆĐžŅŽ ĐēĐžĐŧаĐŊĐ´ĐžŅŽ, Ņ‰Đž ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊĐž Ņ€ŅƒŅ‡ĐŊĐžĐŧ҃ СаĐŋ҃ҁĐē҃ \`down\` ĐŋŅ€Đ¸ виĐŊиĐēĐŊĐĩĐŊĐŊŅ– ĐŋĐžĐŧиĐģĐēи. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS diff Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`, Đ´ĐģŅ ŅĐēĐ¸Ņ… ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ĐĻŅ ĐēĐžĐŧаĐŊда ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” даĐŊŅ– Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐģĐ¸ŅˆĐĩ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ Ņ„Đ°ĐšĐģ҃, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° inode. .PP ĐŸŅ–ŅĐģŅ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ”Ņ‚ŅŒŅŅ СвĐĩĐ´ĐĩĐŊĐŊŅ СĐŧŅ–ĐŊ, ĐˇĐŗŅ€ŅƒĐŋОваĐŊĐĩ Са: .RS 4 .PD 0 .HP 4 .I equal (Ņ€Ņ–Đ˛ĐŊŅ–) ФаКĐģи, ĐŊĐĩСĐŧŅ–ĐŊĐĩĐŊŅ– С ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ŅŅ‚Đ°ĐŊ҃. .HP 4 .I added (дОдаĐŊŅ–) ФаКĐģи, дОдаĐŊŅ–, ŅĐēĐ¸Ņ… ĐŊĐĩ ĐąŅƒĐģĐž Ņ€Đ°ĐŊŅ–ŅˆĐĩ. .HP 4 .I removed (видаĐģĐĩĐŊŅ–) ФаКĐģи, видаĐģĐĩĐŊŅ–. .HP 4 .I updated (ĐžĐŊОвĐģĐĩĐŊŅ–) ФаКĐģи С Ņ–ĐŊŅˆĐ¸Đŧ Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ айО Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž вОĐŊи ĐąŅƒĐģи СĐŧŅ–ĐŊĐĩĐŊŅ–. .HP 4 .I moved (ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ–) ФаКĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– в Ņ–ĐŊŅˆĐ¸Đš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са Ņ‚Đ¸Đŧ ĐļĐĩ Ņ–ĐŧĐĩĐŊĐĩĐŧ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ, Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‚Đ° inode, аĐģĐĩ Ņ–ĐŊŅˆĐ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐŧ. .HP 4 .I copied Ņ„Đ°ĐšĐģи, ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– ĐŊа Ņ‚ĐžĐš ŅĐ°ĐŧиК айО Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, Đ´Đĩ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊиК Ņ„Đ°ĐšĐģ Đ˛ŅĐĩ ҉Đĩ ҖҁĐŊŅƒŅ”. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ОдĐŊаĐēĐžĐ˛ĐžŅŽ ĐŊĐ°ĐˇĐ˛ĐžŅŽ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‡Đ°ŅŅƒ. Đ¯ĐēŅ‰Đž ĐŧŅ–Ņ‚Đēа Ņ‡Đ°ŅŅƒ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Ņ‡Đ°ŅŅ‚ĐžĐē ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŧĐ°Ņ” ĐˇĐąŅ–ĐŗĐ°Ņ‚Đ¸ŅŅ ĐŋОвĐŊиК ҈ĐģŅŅ…, а ĐŊĐĩ ĐģĐ¸ŅˆĐĩ ĐŊаСва. .HP 4 .I relocated Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– ĐŊа Ņ‚ĐžĐš ŅĐ°ĐŧиК айО Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, Đ´Đĩ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģ СĐŊиĐē. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ОдĐŊаĐēĐžĐ˛ĐžŅŽ ĐŊĐ°ĐˇĐ˛ĐžŅŽ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‡Đ°ŅŅƒ. Đ¯ĐēŅ‰Đž ĐŧŅ–Ņ‚Đēа Ņ‡Đ°ŅŅƒ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Ņ‡Đ°ŅŅ‚ĐžĐē ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŧĐ°Ņ” ĐˇĐąŅ–ĐŗĐ°Ņ‚Đ¸ŅŅ ĐŋОвĐŊиК ҈ĐģŅŅ…. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ Ņ„Đ°ĐšĐģŅ–Đ˛ \'moved\' ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ĐŧĐ°ŅŽŅ‚ŅŒ Ņ–ĐŊŅˆĐ¸Đš inode. .HP 4 .I restored Ņ„Đ°ĐšĐģи С Ņ–ĐŊŅˆĐ¸Đŧ inode, аĐģĐĩ ĐˇŅ– ĐˇĐąŅ–ĐŗĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, ĐŊаСви, Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ‚Đ° ĐŧŅ–Ņ‚Đēи Ņ‡Đ°ŅŅƒ. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҆Đĩ Ņ„Đ°ĐšĐģи, Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊŅ– ĐŋҖҁĐģŅ видаĐģĐĩĐŊĐŊŅ. .PD .RE .PP Đ¯ĐēŅ‰Đž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа \`sync\`, ĐēОд ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” 2, СаĐŧŅ–ŅŅ‚ŅŒ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐŗĐž 0. Код ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ 1 виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐˇĐ°ĐŗĐ°ĐģҌĐŊĐžŅ— ҃ĐŧОви ĐŋĐžĐŧиĐģĐēи. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS sync ОĐŊОвĐģŅŽŅ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ’ŅŅ– СĐŧŅ–ĐŊĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ, Ņ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐžĐŊОвĐģŅŽŅŽŅ‚ŅŒŅŅ. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ҆ĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ ҃ ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ‡Đ°Ņ, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ Ctrl+C, ĐŊĐĩ Đ˛Ņ‚Ņ€Đ°Ņ‡Đ°ŅŽŅ‡Đ¸ вĐļĐĩ виĐēĐžĐŊаĐŊ҃ Ņ€ĐžĐąĐžŅ‚Ņƒ. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž СаĐŋ҃ҁĐē҃ ĐŋŅ€ĐžŅ†Đĩҁ \`sync\` Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Ņƒ С ĐŧŅ–ŅŅ†Ņ, Đ´Đĩ ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊиК. .PP Đ¯ĐēŅ‰Đž ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. .PP ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ҈ĐģŅŅ…ĐžĐŧ Ņ‚Đ°/айО inode Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅŽŅ‚ŅŒŅŅ Са Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ. Đ¯ĐēŅ‰Đž Ņ€ĐžĐˇĐŧŅ–Ņ€ айО Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа Ņ„Đ°ĐšĐģ҃ Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅŽŅ‚ŅŒŅŅ, даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅŒĐžĐŗĐž Ņ„Đ°ĐšĐģ҃. Đ¯ĐēŅ‰Đž Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž айО ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊĐž ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃, СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‡Đ¸ Ņ‚ĐžĐš ŅĐ°ĐŧиК inode, ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž ĐŊа Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, аĐģĐĩ Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ Ņ…Đĩ҈҃ СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ. .PP ФаКĐģи \`content\` Ņ‚Đ° \`parity\` СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. .SS scrub ĐĄĐēŅ€Đ°ĐąŅƒŅ” ĐŧĐ°ŅĐ¸Đ˛, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅŽŅ‡Đ¸ ĐŊа ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē айО ĐŋĐžĐŧиĐģĐžĐē ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ… Ņ‚Đ° ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP КоĐļĐĩĐŊ виĐēĐģиĐē ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 8% ĐŧĐ°ŅĐ¸Đ˛Ņƒ, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ даĐŊŅ–, ŅĐēŅ– вĐļĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐžŅŅ‚Đ°ĐŊĐŊŅ–Ņ… 10 Đ´ĐŊŅ–Đ˛. ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ Ņ€Đ°Đˇ ĐŊа Ņ‚Đ¸ĐļĐ´ĐĩĐŊҌ СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ ĐēĐžĐļĐŊĐžĐŗĐž ĐąŅ–Ņ‚Đ° даĐŊĐ¸Ņ… ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Ņ€Đ°Đˇ ĐŊа Ņ‚Ņ€Đ¸ ĐŧŅ–ŅŅŅ†Ņ–. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš ĐŋĐģаĐŊ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ \-p, \-\-plan, ŅĐēа ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ”: bad \- ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. new \- ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‰ĐžĐšĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи .PP .RS 4 ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–. .RE .RS 0 .PD 0 .HP 4 .I full ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅĐĩ. .HP 4 .I 0\-100 ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ вĐēаСаĐŊиК Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąĐģĐžĐēŅ–Đ˛. .PD .RE .PP Đ¯ĐēŅ‰Đž ви вĐēĐ°ĐˇŅƒŅ”Ņ‚Đĩ Đ˛Ņ–Đ´ŅĐžŅ‚ĐēОвĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-o, \-\-older\-than, Ņ‰ĐžĐą виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸, ŅĐēиĐŧ ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ Đ˛Ņ–Đē ĐąĐģĐžĐē҃. ĐĐ°ĐšŅŅ‚Đ°Ņ€Ņ–ŅˆŅ– ĐąĐģĐžĐēи ҁĐēŅ€Đ°ĐąŅƒŅŽŅ‚ŅŒŅŅ ĐŋĐĩŅ€ŅˆĐ¸Đŧи, СайĐĩСĐŋĐĩŅ‡ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃. Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ Ņ‰ĐžĐšĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ \`\-p new\`. .PP ЊОй ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐĩŅ‚Đ°ĐģŅ– ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ \`status\`. .PP ДĐģŅ ĐąŅƒĐ´ŅŒ\-ŅĐēĐžŅ— СĐŊаКдĐĩĐŊĐžŅ— ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐžŅ— ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– \`content\`. ĐĻŅ– ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҃ \`status\` Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ \`fix \-e\`. ĐŸŅ–ŅĐģŅ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ, ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ, вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐĩĐŊŅ–, Ņ– ŅĐēŅ‰Đž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚ŅŒŅŅ, Ņ‰Đž вОĐŊи виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–, ĐŋОСĐŊĐ°Ņ‡Đēа \[dq]ĐŋĐžĐŗĐ°ĐŊиК\[dq] ĐąŅƒĐ´Đĩ видаĐģĐĩĐŊа. ЊОй ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`scrub \-p bad\`. .PP Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СаĐŋ҃ҁĐēĐ°Ņ‚Đ¸ \`scrub\` ĐģĐ¸ŅˆĐĩ ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊҌ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐēи, ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊŅ– ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊиĐŧи даĐŊиĐŧи. ĐĻŅ– ĐŋĐžĐŧиĐģĐēи Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊĐ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŊĐĩ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи, Ņ– ĐąĐģĐžĐēи ĐŊĐĩ ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–, аĐģĐĩ Ņ‚Đ°ĐēŅ– ĐŋĐžĐŧиĐģĐēи ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅŽŅ‚ŅŒŅŅ ҃ вивĐĩĐ´ĐĩĐŊĐŊŅ– ĐēĐžĐŧаĐŊди. .PP ФаКĐģ \`content\` СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Ņ‡Đ°ŅŅƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ĐąĐģĐžĐē҃ Ņ‚Đ° Đ´ĐģŅ ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŋĐžĐŗĐ°ĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛. ФаКĐģи \`parity\` НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. .SS fix ВиĐŋŅ€Đ°Đ˛ĐģŅŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ĐŖŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐžŅ€Ņ–Đ˛ĐŊŅŽŅŽŅ‚ŅŒŅŅ ĐˇŅ– ŅŅ‚Đ°ĐŊĐžĐŧ СĐŊŅ–ĐŧĐēа, СйĐĩŅ€ĐĩĐļĐĩĐŊиĐŧ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`. Đ¯ĐēŅ‰Đž СĐŊаКдĐĩĐŊĐž Ņ€Ņ–ĐˇĐŊĐ¸Ņ†ŅŽ, вОĐŊа ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ Đ´Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐžĐŗĐž СĐŊŅ–ĐŧĐēа. .PP ĐŖĐ’ĐĐ“Đ! КоĐŧаĐŊда \`fix\` ĐŊĐĩ Ņ€ĐžĐˇŅ€Ņ–ĐˇĐŊŅŅ” ĐŋĐžĐŧиĐģĐēи Ņ‚Đ° ĐŊавĐŧĐ¸ŅĐŊŅ– ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—. ВоĐŊа ĐąĐĩĐˇŅƒĐŧОвĐŊĐž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ŅŅ‚Đ°ĐŊ Ņ„Đ°ĐšĐģ҃ Đ´Đž ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`. .PP Đ¯ĐēŅ‰Đž ĐŊĐĩ вĐēаСаĐŊĐž ĐļОдĐŊĐžŅ— Ņ–ĐŊŅˆĐžŅ— ĐžĐŋ҆Җҗ, ĐžĐąŅ€ĐžĐąĐģŅŅ”Ņ‚ŅŒŅŅ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋ҆Җҗ ҄ҖĐģŅŒŅ‚Ņ€Đ°, Ņ‰ĐžĐą Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ĐŧĐŊĐžĐļиĐŊ҃ Ņ„Đ°ĐšĐģŅ–Đ˛ айО Đ´Đ¸ŅĐēŅ–Đ˛ Đ´ĐģŅ Ņ€ĐžĐąĐžŅ‚Đ¸. .PP ЊОй виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ \`sync\` Ņ‚Đ° \`scrub\`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ \-e, \-\-filter\-error. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ Ņ–ĐŊŅˆĐ¸Ņ… ĐžĐŋŅ†Ņ–Đš ҄ҖĐģŅŒŅ‚Ņ€Đ°, Ņ†Ņ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ” виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ СĐŧŅ–ĐŊиĐģĐ¸ŅŅ С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`. .PP SnapRAID ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊĐžĐ˛ŅƒŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ \`.unrecoverable\`. .PP ПĐĩŅ€ĐĩĐ´ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅĐŧ ҁĐēаĐŊŅƒŅ”Ņ‚ŅŒŅŅ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛, Ņ‰ĐžĐą СĐŊĐ°ĐšŅ‚Đ¸ ĐąŅƒĐ´ŅŒ\-ŅĐēŅ– Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`. ĐĻŅ– Ņ„Đ°ĐšĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са Ņ—Ņ…ĐŊŅŒĐžŅŽ Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ, Ņ–ĐŗĐŊĐžŅ€ŅƒŅŽŅ‡Đ¸ Ņ—Ņ…ĐŊŅ” Ņ–Đŧ\'Ņ Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ, Ņ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ в ĐŋŅ€ĐžŅ†ĐĩҁҖ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ҆Đĩ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž. Đ¯ĐēŅ‰Đž ви ĐŋĐĩŅ€ĐĩĐŧŅ–ŅŅ‚Đ¸Đģи Đ´ĐĩŅĐēŅ– С ĐŊĐ¸Ņ… Са ĐŧĐĩĐļŅ– ĐŧĐ°ŅĐ¸Đ˛Ņƒ, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-i, \-\-import, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Đ´ĐģŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ. .PP ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Са ҈ĐģŅŅ…ĐžĐŧ, а ĐŊĐĩ Са inode. .PP ФаКĐģ \`content\` НЕ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. ФаКĐģи \`parity\` СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. .SS check ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ĐŸŅ€Đ°Ņ†ŅŽŅ” ŅĐē \`fix\`, аĐģĐĩ ĐģĐ¸ŅˆĐĩ Ņ–ĐŧŅ–Ņ‚ŅƒŅ” Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, Ņ– ĐļОдĐŊŅ– СĐŧŅ–ĐŊи ĐŊĐĩ СаĐŋĐ¸ŅŅƒŅŽŅ‚ŅŒŅŅ в ĐŧĐ°ŅĐ¸Đ˛. .PP ĐĻŅ ĐēĐžĐŧаĐŊда в ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€ŅƒŅ‡ĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŋҖҁĐģŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ айО в Ņ–ĐŊŅˆĐ¸Ņ… ĐžŅĐžĐąĐģĐ¸Đ˛Đ¸Ņ… ҃ĐŧĐžĐ˛Đ°Ņ…. ДĐģŅ ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐ¸Ņ… Ņ‚Đ° СаĐŋĐģаĐŊОваĐŊĐ¸Ņ… ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ \`scrub\`. .PP Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ \-a, \-\-audit\-only, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ”Ņ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ…Đĩ҈ Ņ„Đ°ĐšĐģŅ–Đ˛, а даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ–ĐŗĐŊĐžŅ€ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ ŅˆĐ˛Đ¸Đ´ŅˆĐžĐŗĐž СаĐŋ҃ҁĐē҃. .PP ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Са ҈ĐģŅŅ…ĐžĐŧ, а ĐŊĐĩ Са inode. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS list Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒŅŅ в ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐŊа ĐŧĐžĐŧĐĩĐŊŅ‚ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`. .PP З \-v айО \-\-verbose Ņ‚Đ°ĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ”Ņ‚ŅŒŅŅ Ņ‡Đ°Ņ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS dup Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Ņ–Đ˛ Ņ„Đ°ĐšĐģŅ–Đ˛. Два Ņ„Đ°ĐšĐģи вваĐļĐ°ŅŽŅ‚ŅŒŅŅ Ņ€Ņ–Đ˛ĐŊиĐŧи, ŅĐēŅ‰Đž Ņ—Ņ…ĐŊŅ– Ņ…ĐĩŅˆŅ– ĐˇĐąŅ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. ДаĐŊŅ– Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊĐĩ ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ; виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊŅ– Ņ…ĐĩŅˆŅ–. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS pool ĐĄŅ‚Đ˛ĐžŅ€ŅŽŅ” айО ĐžĐŊОвĐģŅŽŅ” Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– в ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– \`pooling\`. .PP ФаКĐģи ĐŊĐĩ ĐēĐžĐŋŅ–ŅŽŅŽŅ‚ŅŒŅŅ, а ĐŋОв\'ŅĐˇŅƒŅŽŅ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ. .PP ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đ˛ŅŅ– ҖҁĐŊŅƒŅŽŅ‡Ņ– ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ Ņ‚Đ° ĐŋĐžŅ€ĐžĐļĐŊŅ– ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ видаĐģŅŅŽŅ‚ŅŒŅŅ Ņ‚Đ° СаĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ ĐŊОвиĐŧ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅĐŧ ĐŧĐ°ŅĐ¸Đ˛Ņƒ. Đ‘ŅƒĐ´ŅŒ\-ŅĐēŅ– Ņ–ĐŊŅˆŅ– ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊŅ– Ņ„Đ°ĐšĐģи СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа ĐŧҖҁ҆Җ. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Са ĐŧĐĩĐļаĐŧи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool. .SS devices Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩĐ˛Ņ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐŧĐ°ŅĐ¸Đ˛ĐžĐŧ. .PP ĐĻŅ ĐēĐžĐŧаĐŊда Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ” Đ°ŅĐžŅ†Ņ–Đ°Ņ†Ņ–Ņ— ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛ ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– Ņ– в ĐžŅĐŊОвĐŊĐžĐŧ҃ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа ŅĐē Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Đ´ĐģŅ ҁ҆ĐĩĐŊĐ°Ņ€Ņ–Ņ—Đ˛. .PP ПĐĩŅ€ŅˆŅ– два ŅŅ‚ĐžĐ˛Đŋ҆Җ — ҆Đĩ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ Ņ‚Đ° ҈ĐģŅŅ…. ĐĐ°ŅŅ‚ŅƒĐŋĐŊŅ– два ŅŅ‚ĐžĐ˛Đŋ҆Җ — ҆Đĩ Đ˛Đ¸ŅĐžĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ Ņ‚Đ° ҈ĐģŅŅ…. ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš ŅŅ‚ĐžĐ˛ĐŋĐĩŅ†ŅŒ — ҆Đĩ Ņ–Đŧ\'Ņ Đ´Đ¸ŅĐēа в ĐŧĐ°ŅĐ¸Đ˛Ņ–. .PP ĐŖ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛ ҃ Đ˛Đ°Ņ Ņ” ОдиĐŊ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа в ĐŧĐ°ŅĐ¸Đ˛Ņ–, аĐģĐĩ в Đ´ĐĩŅĐēĐ¸Ņ… ҁĐēĐģадĐŊŅ–ŅˆĐ¸Ņ… ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŅ… ҃ Đ˛Đ°Ņ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩĐ˛Đ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. .PP ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. .SS touch Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” Đ´ĐžĐ˛Ņ–ĐģҌĐŊ҃ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди Đ´ĐģŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ҃ ŅĐēĐ¸Ņ… вОĐŊа Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа ĐŊа ĐŊ҃ĐģҌ. .PP ĐĻĐĩ ĐŋĐžĐēŅ€Đ°Ņ‰ŅƒŅ” ĐˇĐ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŒ SnapRAID Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊĐ°Đ˛Đ°Ņ‚Đ¸ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ‚Đ° ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи, ĐžŅĐēŅ–ĐģҌĐēи Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ ĐŧаКĐļĐĩ ҃ĐŊŅ–ĐēаĐģҌĐŊĐžŅŽ, СĐŧĐĩĐŊŅˆŅƒŅŽŅ‡Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ– Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ¸. .PP ЗоĐēŅ€ĐĩĐŧа, ŅĐēŅ‰Đž Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди ĐŊĐĩ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊиК айО ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊиК Ņ„Đ°ĐšĐģ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ ŅĐē Ņ‚Đ°ĐēиК, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ С Ņ–ĐŧĐĩĐŊĐĩĐŧ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ. Đ¯ĐēŅ‰Đž Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ˛Ņ–ĐŊ вваĐļĐ°Ņ”Ņ‚ŅŒŅŅ ĐēĐžĐŋŅ–Ņ”ŅŽ, ĐģĐ¸ŅˆĐĩ ŅĐēŅ‰Đž ĐŋОвĐŊиК ҈ĐģŅŅ…, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа ĐˇĐąŅ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. .PP Đ§Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž ҁĐĩĐē҃ĐŊди ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ, Ņ‚ĐžĐŧ҃ Đ˛ŅŅ– Đ´Đ°Ņ‚Đ¸ Ņ‚Đ° Ņ‡Đ°Ņ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐąŅƒĐ´ŅƒŅ‚ŅŒ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ–. .SS rehash ПĐģаĐŊŅƒŅ” ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅŒĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. .PP ĐĻŅ ĐēĐžĐŧаĐŊда СĐŧŅ–ĐŊŅŽŅ” Ņ‚Đ¸Đŋ Ņ…Đĩ҈҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, ŅĐē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, ĐŋŅ€Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ– С 32\-Ņ€ĐžĐˇŅ€ŅĐ´ĐŊĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи ĐŊа 64\-Ņ€ĐžĐˇŅ€ŅĐ´ĐŊ҃, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ŅŅ С MurmurHash3 ĐŊа ŅˆĐ˛Đ¸Đ´ŅˆĐ¸Đš SpookyHash. .PP Đ¯ĐēŅ‰Đž ви вĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊиК Ņ…Đĩ҈, Ņ†Ņ ĐēĐžĐŧаĐŊда ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ– ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”, Ņ‰Đž ĐļОдĐŊĐ¸Ņ… Đ´Ņ–Đš ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž. .PP ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐĩ виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐĩĐŗĐ°ĐšĐŊĐž, а Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ ĐŋĐžŅŅ‚ŅƒĐŋОвО ĐŋŅ–Đ´ Ņ‡Đ°Ņ \`sync\` Ņ‚Đ° \`scrub\`. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ŅŅ‚Đ°ĐŊ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžĐŗĐž Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ \`status\`. .PP ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžĐŗĐž Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ĐŋОвĐŊ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊаĐģҌĐŊŅ–ŅŅ‚ŅŒ, Са Ņ”Đ´Đ¸ĐŊиĐŧ виĐŊŅŅ‚ĐēĐžĐŧ, Ņ‰Đž \`dup\` ĐŊĐĩ ĐŧĐžĐļĐĩ Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸ Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ…Đĩ҈. .SS locate ЗĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģи, Ņ‰Đž СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž СĐŊаКдĐĩĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐšĐžĐŗĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ‚Đ° ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Ņ–Đ˛, ŅĐēŅ– Đ˛Ņ–ĐŊ СаКĐŧĐ°Ņ”. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ \-t, \-\-tail, Ņ‰ĐžĐą ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ Ņ„Đ°ĐšĐģаĐŧи, Ņ‰Đž СаКĐŧĐ°ŅŽŅ‚ŅŒ СаСĐŊĐ°Ņ‡ĐĩĐŊ҃ ĐēŅ–ĐŊ҆ĐĩĐ˛Ņƒ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ (Ņ…Đ˛Ņ–ŅŅ‚) ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ ҆Җ Ņ„Đ°ĐšĐģи, ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ \-W, \-\-force\-realloc\-tail. ĐœĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž Ņ‚Đ°ĐēŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊŅ– ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ҃. .SH ОĐŋ҆Җҗ SnapRAID ĐŊĐ°Đ´Đ°Ņ” ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ: .TP .B \-c, \-\-conf CONFIG Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ Đ´ĐģŅ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ. Đ¯ĐēŅ‰Đž ĐŊĐĩ вĐēаСаĐŊĐž, в Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ \`/usr/local/etc/snapraid.conf\`, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ҖҁĐŊŅƒŅ”, Ņ–ĐŊаĐē҈Đĩ \`/etc/snapraid.conf\`. ĐŖ Windows виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ \`snapraid.conf\` ҃ Ņ‚ĐžĐŧ҃ ŅĐ°ĐŧĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ–, Ņ‰Đž Đš \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Ņ„Đ°ĐšĐģи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ \`check\` Ņ‚Đ° \`fix\`. ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ вĐēаСаĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ҃. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ€ĐžĐˇĐ´Ņ–Đģ PATTERN Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛. В Unix ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž ŅĐ¸ĐŧвОĐģи ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ Đ˛ĐˇŅŅ‚Ņ– в ĐģаĐŋĐēи, ŅĐēŅ‰Đž вОĐŊи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`check\` Ņ‚Đ° \`fix\`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С \`sync\` Ņ‚Đ° \`scrub\`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. .TP .B \-d, \-\-filter\-disk NAME Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ \`check\`, \`fix\`, \`up\` Ņ‚Đ° \`down\`. Ви ĐŋОвиĐŊĐŊŅ– вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–Đŧ\'Ņ Đ´Đ¸ŅĐēа, ŅĐē виСĐŊĐ°Ņ‡ĐĩĐŊĐž ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– С Ņ–ĐŧĐĩĐŊаĐŧи: \`parity\`, \`2\-parity\`, \`3\-parity\`, Ņ‚ĐžŅ‰Đž, Ņ‰ĐžĐą ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐŋĐĩвĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž ви ĐŋĐžŅ”Đ´ĐŊŅƒŅ”Ņ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš \-\-filter, \-\-filter\-disk Ņ‚Đ° \-\-filter\-missing, Đ˛Đ¸ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ŅƒŅŅ–Đŧ ҄ҖĐģŅŒŅ‚Ņ€Đ°Đŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`check\`, \`fix\`, \`up\` Ņ‚Đ° \`down\`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С \`sync\` Ņ‚Đ° \`scrub\`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. .TP .B \-m, \-\-filter\-missing Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Ņ„Đ°ĐšĐģи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ \`check\` Ņ‚Đ° \`fix\`. ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– айО видаĐģĐĩĐŊŅ– С ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ĐŸŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– С \`fix\` ҆Đĩ Đ´Ņ–Ņ” ŅĐē ĐēĐžĐŧаĐŊда \`undelete\` (Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛). Đ¯ĐēŅ‰Đž ви ĐŋĐžŅ”Đ´ĐŊŅƒŅ”Ņ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš \-\-filter, \-\-filter\-disk Ņ‚Đ° \-\-filter\-missing, Đ˛Đ¸ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ŅƒŅŅ–Đŧ ҄ҖĐģŅŒŅ‚Ņ€Đ°Đŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`check\` Ņ‚Đ° \`fix\`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С \`sync\` Ņ‚Đ° \`scrub\`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. .TP .B \-e, \-\-filter\-error ĐžĐąŅ€ĐžĐąĐģŅŅ” Ņ„Đ°ĐšĐģи С ĐŋĐžĐŧиĐģĐēаĐŧи ҃ \`check\` Ņ‚Đ° \`fix\`. ĐžĐąŅ€ĐžĐąĐģŅŅ” ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŧĐ°ŅŽŅ‚ŅŒ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊиĐŧи ĐŋĐžĐŧиĐģĐēаĐŧи айО ĐŋĐžĐŧиĐģĐēаĐŧи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ \`sync\` Ņ‚Đ° \`scrub\`, ŅĐē СаСĐŊĐ°Ņ‡ĐĩĐŊĐž ҃ \`status\`. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`check\` Ņ‚Đ° \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐŋĐģаĐŊ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. Đ¯ĐēŅ‰Đž PERC Ņ” Ņ‡Đ¸ŅĐģОвиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Đ˛Ņ–Đ´ 0 Đ´Đž 100, вОĐŊĐž Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚ŅƒŅ”Ņ‚ŅŒŅŅ ŅĐē Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąĐģĐžĐēŅ–Đ˛ Đ´ĐģŅ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. ЗаĐŧŅ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´ŅĐžŅ‚Đēа ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŋĐģаĐŊ: \`bad\` ҁĐēŅ€Đ°ĐąŅƒŅ” ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, \`new\` ҁĐēŅ€Đ°ĐąŅƒŅ” ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, Ņ– \`full\` ҁĐēŅ€Đ°ĐąŅƒŅ” Đ˛ŅĐĩ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐŊĐ°ĐšŅŅ‚Đ°Ņ€Ņ–ŅˆŅƒ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ ĐŧĐ°ŅĐ¸Đ˛Ņƒ Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ \`scrub\`. DAYS — ҆Đĩ ĐŧŅ–ĐŊŅ–ĐŧаĐģҌĐŊиК Đ˛Ņ–Đē ҃ Đ´ĐŊŅŅ… Đ´ĐģŅ ĐąĐģĐžĐē҃, ŅĐēиК ĐŋОвиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊиК; Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ 10. БĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–, СавĐļди ҁĐēŅ€Đ°ĐąŅƒŅŽŅ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ ҆ҖҔҗ ĐžĐŋ҆Җҗ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`scrub\`. .TP .B \-a, \-\-audit\-only ĐŖ \`check\` ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ…Đĩ҈ Ņ„Đ°ĐšĐģŅ–Đ˛ ĐąĐĩС ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž Đ˛Đ°Ņ ҆ҖĐēĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа даĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ ĐŧĐžĐļĐĩ СĐŊĐ°Ņ‡ĐŊĐž ĐŋŅ€Đ¸ŅĐēĐžŅ€Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžŅ†Đĩҁ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`check\`. .TP .B \-h, \-\-pre\-hash ĐŖ \`sync\` СаĐŋ҃ҁĐēĐ°Ņ” ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŽ Ņ„Đ°ĐˇŅƒ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… ĐŊĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ… Đ´ĐģŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи ĐŋĐĩŅ€ĐĩĐ´ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҃ \`sync\` ĐŊĐĩ виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ” Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ, а ĐŊĐžĐ˛Ņ– даĐŊŅ– Ņ…ĐĩŅˆŅƒŅŽŅ‚ŅŒŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐŋĐĩŅ€ĐĩĐ´ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ĐēĐžĐģи вОĐŊи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ вĐŋĐĩŅ€ŅˆĐĩ. ĐĻĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ, ĐēĐžĐģи ŅĐ¸ŅŅ‚ĐĩĐŧа СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐŋŅ–Đ´ вĐĩĐģиĐēиĐŧ ĐŊаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅĐŧ, ŅƒŅŅ– Đ´Đ¸ŅĐēи ОйĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒŅŅ Ņ‚Đ° ĐĻП СаКĐŊŅŅ‚Đ¸Đš. ĐĻĐĩ ĐĩĐēҁ҂ҀĐĩĐŧаĐģҌĐŊа ҃ĐŧОва Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊи, Ņ– ŅĐēŅ‰Đž вОĐŊа ĐŧĐ°Ņ” ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊ҃ аĐŋĐ°Ņ€Đ°Ņ‚ĐŊ҃ ĐŋŅ€ĐžĐąĐģĐĩĐŧ҃, ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи ĐŧĐžĐļŅƒŅ‚ŅŒ СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ŅŅ ĐŊĐĩĐ˛Đ¸ŅĐ˛ĐģĐĩĐŊиĐŧи, ĐžŅĐēŅ–ĐģҌĐēи даĐŊŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи Ņ…ĐĩŅˆĐžĐ˛Đ°ĐŊŅ–. ЊОй ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ Ņ†ŅŒĐžĐŗĐž Ņ€Đ¸ĐˇĐ¸Đē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ€ĐĩĐļиĐŧ \`pre\-hash\`, Ņ‰ĐžĐą ŅƒŅŅ– даĐŊŅ– ĐąŅƒĐģи ĐˇŅ‡Đ¸Ņ‚Đ°ĐŊŅ– Đ´Đ˛Ņ–Ņ‡Ņ– Đ´ĐģŅ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ Ņ—Ņ… ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ‚Đ°ĐēĐžĐļ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– в ĐŧĐĩĐļĐ°Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņƒ, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐŊŅ ĐąŅƒĐģа ҃ҁĐŋŅ–ŅˆĐŊĐžŅŽ, Ņ–, ŅĐēŅ‰Đž ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž, дОСвОĐģŅŅ” СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅĐŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`sync\`. .TP .B \-i, \-\-import DIR ІĐŧĐŋĐžŅ€Ņ‚ŅƒŅ” С вĐēаСаĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐąŅƒĐ´ŅŒ\-ŅĐēŅ– Ņ„Đ°ĐšĐģи, видаĐģĐĩĐŊŅ– С ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŋҖҁĐģŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— \`sync\`. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ ҉Đĩ Ņ” Ņ‚Đ°ĐēŅ– Ņ„Đ°ĐšĐģи, вОĐŊи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– \`check\` Ņ‚Đ° \`fix\` Đ´ĐģŅ ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. ФаКĐģи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸, Ņ‚Đ° Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ Ņ—Ņ…ĐŊŅŒĐžĐŗĐž Ņ–ĐŧĐĩĐŊŅ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`check\` Ņ‚Đ° \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error ĐŸŅ€Đ¸ ĐąŅƒĐ´ŅŒ\-ŅĐēŅ–Đš ĐŋĐžĐŧиĐģ҆Җ ĐˇŅƒĐŋиĐŊŅŅ” Đ˛ŅŅ– ĐēĐĩŅ€ĐžĐ˛Đ°ĐŊŅ– Đ´Đ¸ŅĐēи ĐŋĐĩŅ€ĐĩĐ´ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅĐŧ С ĐŊĐĩĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ ĐēОдОĐŧ ŅŅ‚Đ°ĐŊ҃. ĐĻĐĩ СаĐŋĐžĐąŅ–ĐŗĐ°Ņ” Ņ‚ĐžĐŧ҃, Ņ‰ĐžĐą Đ´Đ¸ŅĐēи СаĐģĐ¸ŅˆĐ°ĐģĐ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧи Ņ‚Đ° ОйĐĩŅ€Ņ‚Đ°ĐģĐ¸ŅŅ ĐŋҖҁĐģŅ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—, Đ´ĐžĐŋĐžĐŧĐ°ĐŗĐ°ŅŽŅ‡Đ¸ ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐˇĐ°ĐšĐ˛ĐžĐŗĐž ĐŊĐ°ĐŗŅ€Ņ–Đ˛Đ°ĐŊĐŊŅ Ņ‚Đ° ҁĐŋĐžĐļиваĐŊĐŊŅ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐĩĐŊĐĩŅ€ĐŗŅ–Ņ—. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ, Ņ‰ĐžĐą СайĐĩСĐŋĐĩŅ‡Đ¸Ņ‚Đ¸ ĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐˇŅƒĐŋиĐŊĐē҃ Đ´Đ¸ŅĐēŅ–Đ˛, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐēĐžĐģи ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžĐŧиĐģĐēĐžŅŽ. .TP .B \-w, \-\-bw\-limit RATE Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ” ĐŗĐģОйаĐģҌĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊĐžŅ— ĐˇĐ´Đ°Ņ‚ĐŊĐžŅŅ‚Ņ– Đ´ĐģŅ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. RATE — ҆Đĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąĐ°ĐšŅ‚Ņ–Đ˛ ĐŊа ҁĐĩĐē҃ĐŊĐ´Ņƒ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐē, Ņ‚Đ°ĐēиК ŅĐē K, M айО G (ĐŊаĐŋŅ€Đ¸ĐēĐģад, \-\-bw\-limit 1G). .TP .B \-t, \-\-tail РОЗМІР ОбĐŧĐĩĐļŅƒŅ” ҁĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ¸Đŧи, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐŊĐĩ ĐąŅ–ĐģҌ҈Đĩ СаСĐŊĐ°Ņ‡ĐĩĐŊĐžĐŗĐž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đ˛ĐžŅŅ‚Đ° Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. МоĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐēи, Ņ‚Đ°ĐēŅ– ŅĐē K, M, G айО T (ĐŊаĐŋŅ€Đ¸ĐēĐģад, \-\-tail 1G). ĐĻĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Đ´Ņ–ĐšŅĐŊиК ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– Ņ€Đ°ĐˇĐžĐŧ Ņ–Đˇ ĐēĐžĐŧаĐŊĐ´ĐžŅŽ \`locate\`. .TP .B \-A, \-\-stats ВĐŧиĐēĐ°Ņ” Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊиК ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´ ŅŅ‚Đ°ĐŊ҃, ŅĐēиК ĐŋĐžĐēĐ°ĐˇŅƒŅ” Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ. На ĐĩĐēŅ€Đ°ĐŊŅ– Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ два ĐŗŅ€Đ°Ņ„Ņ–Đēи: ПĐĩŅ€ŅˆĐ¸Đš ĐŗŅ€Đ°Ņ„Ņ–Đē ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ… ҁĐŧŅƒĐŗ (stripes) Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, Ņ€Đ°ĐˇĐžĐŧ ĐˇŅ– ҈ĐģŅŅ…ĐžĐŧ Đ´Đž Ņ„Đ°ĐšĐģ҃, Đ´Đž ŅĐēĐžĐŗĐž ĐŊĐ°Ņ€Đ°ĐˇŅ– ĐˇĐ´Ņ–ĐšŅĐŊŅŽŅ”Ņ‚ŅŒŅŅ Đ´ĐžŅŅ‚ŅƒĐŋ ĐŊа Ņ†ŅŒĐžĐŧ҃ Đ´Đ¸ŅĐē҃. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ĐŊаКĐŋĐžĐ˛Ņ–ĐģҌĐŊŅ–ŅˆĐ¸Đš Đ´Đ¸ŅĐē ĐŊĐĩ ĐŧĐ°Ņ‚Đ¸ĐŧĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐąŅƒŅ„ĐĩŅ€Đ°, Ņ‰Đž виСĐŊĐ°Ņ‡Đ°Ņ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžŅŅĐļĐŊ҃ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊ҃ ĐˇĐ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŒ. Đ”Ņ€ŅƒĐŗĐ¸Đš ĐŗŅ€Đ°Ņ„Ņ–Đē ĐŋĐžĐēĐ°ĐˇŅƒŅ” Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē Ņ‡Đ°ŅŅƒ, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŊа ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Са ĐžŅŅ‚Đ°ĐŊĐŊŅ– 100 ҁĐĩĐē҃ĐŊĐ´. ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‰Đž ĐŊаКĐŋĐžĐ˛Ņ–ĐģҌĐŊŅ–ŅˆĐ¸Đš Đ´Đ¸ŅĐē ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐ¸Ņ‚ŅŒ ĐąŅ–ĐģҌ҈҃ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‚ĐžĐ´Ņ– ŅĐē Ņ–ĐŊŅˆŅ– Đ´Đ¸ŅĐēи ĐŋОвиĐŊĐŊŅ– ĐŧĐ°Ņ‚Đ¸ ĐŊĐĩвĐĩĐģиĐēиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐˇĐžĐ˛ŅŅ–Đŧ ĐšĐžĐŗĐž ĐŊĐĩ ĐŧĐ°Ņ‚Đ¸, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи ĐŧĐžĐļŅƒŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅĐ˛ĐžŅ— ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊŅ– ҁĐŧŅƒĐŗĐ¸. ĐĻĐĩĐš ĐŗŅ€Đ°Ņ„Ņ–Đē Ņ‚Đ°ĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ” Ņ‡Đ°Ņ, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊиК ĐŊа ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ Ņ…Đĩ҈҃ Ņ‚Đ° ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊҌ RAID. ĐŖŅŅ– ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ виĐēĐžĐŊŅƒŅŽŅ‚ŅŒŅŅ ĐŋĐ°Ņ€Đ°ĐģĐĩĐģҌĐŊĐž С ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅĐŧи Đ´Đ¸ŅĐēа. ĐĸĐžĐŧ҃, Đ´ĐžĐēи Ņ” виĐŧŅ–Ņ€ŅŽĐ˛Đ°ĐŊиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Đ´ĐģŅ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ҆Đĩ вĐēĐ°ĐˇŅƒŅ” ĐŊа Ņ‚Đĩ, Ņ‰Đž ĐĻП Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž ŅˆĐ˛Đ¸Đ´ĐēиК, Ņ‰ĐžĐą ҁĐŋŅ€Đ°Đ˛ĐģŅŅ‚Đ¸ŅŅ С Ņ€ĐžĐąĐžŅ‡Đ¸Đŧ ĐŊаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅĐŧ. .TP .B \-Z, \-\-force\-zero Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģ҃ С ĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ, ŅĐēиК Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐąŅƒĐ˛ ĐŊĐĩĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ” Ņ‚Đ°Đē҃ ҃ĐŧĐžĐ˛Ņƒ, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” ĐģĐĩĐŗĐēĐž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи ĐŋҖҁĐģŅ ĐˇĐąĐžŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧи Đ´ĐĩŅĐēŅ– Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ– Ņ„Đ°ĐšĐģи ĐąŅƒĐģи ĐžĐąŅ€Ņ–ĐˇĐ°ĐŊŅ–. ĐĻĐĩ ĐŧĐžĐļĐģива ҃ĐŧОва в Linux С Ņ„Đ°ĐšĐģОвиĐŧи ŅĐ¸ŅŅ‚ĐĩĐŧаĐŧи ext3/ext4. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`sync\`. .TP .B \-E, \-\-force\-empty Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Đ´Đ¸ŅĐēа, ĐŊа ŅĐēĐžĐŧ҃ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– Đ˛ŅŅ– ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊŅ– Ņ„Đ°ĐšĐģи. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ”, Ņ‰Đž Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ– ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐąŅƒĐģи ĐŊа Đ´Đ¸ŅĐē҃, Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– айО ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°ĐŊŅ–, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” ĐģĐĩĐŗĐēĐž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи Ņ„Đ°ĐšĐģОва ŅĐ¸ŅŅ‚ĐĩĐŧа даĐŊĐ¸Ņ… ĐŊĐĩ СĐŧĐžĐŊŅ‚ĐžĐ˛Đ°ĐŊа. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`sync\`. .TP .B \-U, \-\-force\-uuid Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ С Đ´Đ¸ŅĐēаĐŧи, ŅĐēŅ– СĐŧŅ–ĐŊиĐģи ŅĐ˛Ņ–Đš UUID. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ”, Ņ‰Đž Đ´ĐĩŅĐēŅ– Đ´Đ¸ŅĐēи СĐŧŅ–ĐŊиĐģи UUID, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи Đ˛Đ°ŅˆŅ– Đ´Đ¸ŅĐēи СĐŧĐžĐŊŅ‚ĐžĐ˛Đ°ĐŊŅ– в ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐ¸Ņ… Ņ‚ĐžŅ‡ĐēĐ°Ņ… ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ. ОдĐŊаĐē, дОСвОĐģĐĩĐŊĐž ĐŧĐ°Ņ‚Đ¸ ОдĐŊ҃ СĐŧŅ–ĐŊ҃ UUID С ОдĐŊŅ–Ņ”ŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ Ņ– ĐąŅ–ĐģҌ҈Đĩ С ĐŧĐŊĐžĐļиĐŊĐŊĐžŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ, ĐžŅĐēŅ–ĐģҌĐēи ҆Đĩ ĐŊĐžŅ€ĐŧаĐģҌĐŊиК виĐŋадОĐē ĐŋŅ€Đ¸ СаĐŧŅ–ĐŊŅ– Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`sync\`, \`check\` айО \`fix\`. .TP .B \-D, \-\-force\-device Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ С ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи Đ´Đ¸ŅĐēаĐŧи айО С Đ´Đ¸ŅĐēаĐŧи ĐŊа Ņ‚ĐžĐŧ҃ Đļ Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊĐžĐŧ҃ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Đģи два Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ… Ņ– ĐŧĐ°Ņ”Ņ‚Đĩ СаĐŋĐ°ŅĐŊиК Đ´Đ¸ŅĐē Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ ĐŋĐĩŅ€ŅˆĐžĐŗĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Ņ€ŅƒĐŗĐ¸Đš ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиК Đ´Đ¸ŅĐē. АйО, ŅĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Đ´Đ¸ŅĐē ҃ Đ˛Ņ–ĐģҌĐŊĐžĐŧ҃ ĐŧҖҁ҆Җ, СаĐģĐ¸ŅˆĐĩĐŊĐžĐŧ҃ ĐŊа вĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°ĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ‚ĐžĐš ŅĐ°ĐŧиК Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`fix\`. .TP .B \-N, \-\-force\-nocopy ĐŖ \`sync\`, \`check\` Ņ‚Đ° \`fix\` виĐŧиĐēĐ°Ņ” ĐĩĐ˛Ņ€Đ¸ŅŅ‚Đ¸Đē҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐēĐžĐŋŅ–Đš. БĐĩС ҆ҖҔҗ ĐžĐŋ҆Җҗ SnapRAID ĐŋŅ€Đ¸Đŋ҃ҁĐēĐ°Ņ”, Ņ‰Đž Ņ„Đ°ĐšĐģи С ОдĐŊаĐēОвиĐŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ŅĐē Ņ–Đŧ\'Ņ, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа, Ņ” ĐēĐžĐŋŅ–ŅĐŧи С Ņ‚Đ¸Đŧи Đļ даĐŊиĐŧи. ĐĻĐĩ дОСвОĐģŅŅ” Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒĐ˛Đ°Ņ‚Đ¸ ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– айО ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи С ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŊа Ņ–ĐŊŅˆĐ¸Đš Ņ– ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” вĐļĐĩ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊ҃ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ Ņ…Đĩ҈҃ Đ´ĐģŅ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē айО Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛. ĐŖ Đ´ĐĩŅĐēĐ¸Ņ… Ņ€Ņ–Đ´ĐēҖҁĐŊĐ¸Ņ… виĐŋадĐēĐ°Ņ… Ņ†Ņ ĐŋОвĐĩĐ´Ņ–ĐŊĐēа ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ…Đ¸ĐąĐŊĐ¸Ņ… ҁĐŋŅ€Đ°Ņ†ŅŒĐžĐ˛ŅƒĐ˛Đ°ĐŊҌ айО ĐŋĐžĐ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅ†Đĩҁ҃ ҇ĐĩŅ€ĐĩС ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē Ņ…Đĩ҈҃, Ņ– Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ дОСвОĐģŅŅ” Đ˛Đ¸Ņ€Ņ–ŅˆĐ¸Ņ‚Đ¸ Ņ‚Đ°ĐēŅ– ĐŋŅ€ĐžĐąĐģĐĩĐŧи. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`sync\`, \`check\` Ņ‚Đ° \`fix\`. .TP .B \-F, \-\-force\-full ĐŖ \`sync\` Ņ„ĐžŅ€ŅŅƒŅ” ĐŋОвĐŊĐĩ ĐŋĐĩŅ€ĐĩĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸, ĐēĐžĐģи ви Đ´ĐžĐ´Đ°Ņ”Ņ‚Đĩ ĐŊОвиК Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО ŅĐēŅ‰Đž ви ĐŋОвĐĩŅ€ĐŊ҃ĐģĐ¸ŅŅ Đ´Đž ŅŅ‚Đ°Ņ€ĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ вĐŧŅ–ŅŅ‚Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐąŅ–ĐģҌ҈ ĐŊĐžĐ˛Ņ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ЗаĐŧŅ–ŅŅ‚ŅŒ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– С ĐŊ҃ĐģŅ, ҆Đĩ дОСвОĐģŅŅ” ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ…ĐĩŅˆŅ–, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ… Ņ‚Đ° ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēи ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ \`sync\`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ҖҁĐŊŅƒŅŽŅ‡Ņ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`sync\`. .TP .B \-R, \-\-force\-realloc ĐŖ \`sync\` Ņ„ĐžŅ€ŅŅƒŅ” ĐŋОвĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐąŅƒĐ´ĐžĐ˛Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐŋОвĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ҃ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ŅƒŅŅƒĐ˛Đ°ŅŽŅ‡Đ¸ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ…ĐĩŅˆŅ–, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ…. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С \`sync\`. ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ Ņ—Ņ— виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. Ви НЕ ĐŧĐ°Ņ”Ņ‚Đĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— \`sync\`. .TP .B \-W, \-\-force\-realloc\-tail РОЗМІР ĐŸŅ€Đ°Ņ†ŅŽŅ” ŅĐē \-R, \-\-force\-realloc, аĐģĐĩ ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ вĐēаСаĐŊĐžŅŽ ĐēŅ–ĐŊ҆ĐĩĐ˛ĐžŅŽ Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ (ĐžŅŅ‚Đ°ĐŊĐŊŅ– РОЗМІР ĐąĐ°ĐšŅ‚) ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģŅŅ” (ĐŋĐĩŅ€ĐĩĐŧŅ–Ņ‰ŅƒŅ”) ĐąŅƒĐ´ŅŒ\-ŅĐēŅ– Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ¸/ĐąĐģĐžĐēи Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‰Đž ĐŊĐ°Ņ€Đ°ĐˇŅ– СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ в Ņ†Ņ–Đš ĐēŅ–ĐŊ҆ĐĩĐ˛Ņ–Đš ҁĐĩĐē҆Җҗ, дОСвОĐģŅŅŽŅ‡Đ¸ Ņ€ĐžĐˇĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Ņ—Ņ… ĐąŅƒĐ´ŅŒ\-Đ´Đĩ ҃ Ņ„Đ°ĐšĐģŅ–(Đ°Ņ…) ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ´Đĩ Ņ” Đ˛Ņ–ĐģҌĐŊĐĩ ĐŧҖҁ҆Đĩ (вĐēĐģŅŽŅ‡ĐŊĐž С ĐŊĐ°ŅĐ˛ĐŊиĐŧи ĐŋŅƒŅŅ‚ĐžŅ‚Đ°Đŧи). ĐžŅĐŊОвĐŊа ĐŧĐĩŅ‚Đ° Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° — СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŊа Đ´Đ¸ŅĐē҃. Đ¯ĐēŅ‰Đž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ ҃ҁĐŋŅ–ŅˆĐŊĐž ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Đ˛ŅŅŽ ĐēŅ–ĐŊ҆ĐĩĐ˛Ņƒ ҁĐĩĐēŅ†Ņ–ŅŽ (҃ ĐŊŅ–Đš ĐŊĐĩ СаĐģĐ¸ŅˆĐ¸Ņ‚ŅŒŅŅ ĐąĐģĐžĐēŅ–Đ˛), Ņ„Đ°ĐšĐģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐąŅƒĐ´Đĩ ĐžĐąŅ€Ņ–ĐˇĐ°ĐŊиК, Đ˛Đ¸Đ˛Ņ–ĐģҌĐŊŅŅŽŅ‡Đ¸ ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ Ņ…Đ˛ĐžŅŅ‚Đ°. МоĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐēи, Ņ‚Đ°ĐēŅ– ŅĐē K, M, G айО T (ĐŊаĐŋŅ€Đ¸ĐēĐģад, \-\-force\-realloc\-tail 1G). Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ locate \-t, \-\-tail, Ņ‰ĐžĐą СаСдаĐģĐĩĐŗŅ–Đ´ŅŒ Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐŋŅ€Đž ĐˇĐ°Ņ‡ĐĩĐŋĐģĐĩĐŊŅ– Ņ„Đ°ĐšĐģи. ĐŖĐ’ĐĐ“Đ! ĐĻĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊиК ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐšĐžĐŗĐž ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— \`sync\` ĐˇĐ°Ņ…Đ¸ŅŅ‚ даĐŊĐ¸Ņ… Đ´ĐģŅ ĐˇĐ°Ņ‡ĐĩĐŋĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Đ’Đ†Đ”ĐĄĐŖĐĸНІЙ. .TP .B \-l, \-\-log FILE ЗаĐŋĐ¸ŅŅƒŅ” Đ´ĐĩŅ‚Đ°ĐģҌĐŊиК ĐļŅƒŅ€ĐŊаĐģ ҃ вĐēаСаĐŊиК Ņ„Đ°ĐšĐģ. Đ¯ĐēŅ‰Đž Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐēаСаĐŊа, ĐŊĐĩҁĐŋĐžĐ´Ņ–Đ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа ĐĩĐēŅ€Đ°ĐŊ, Ņ‰Đž ĐŋĐžŅ‚ĐĩĐŊŅ†Ņ–ĐšĐŊĐž ĐŋŅ€Đ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž ĐŊадĐŧŅ–Ņ€ĐŊĐžĐŗĐž вивĐĩĐ´ĐĩĐŊĐŊŅ ҃ виĐŋадĐē҃ ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐžŅ… ĐŋĐžĐŧиĐģĐžĐē. КоĐģи вĐēаСаĐŊĐž \-l, \-\-log, ĐŊа ĐĩĐēŅ€Đ°ĐŊ Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°Ņ‚Đ°ĐģҌĐŊŅ– ĐŋĐžĐŧиĐģĐēи, ŅĐēŅ– ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊŅŅŽŅ‚ŅŒ ĐˇŅƒĐŋиĐŊĐē҃ SnapRAID. Đ¯ĐēŅ‰Đž ҈ĐģŅŅ… ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ С \`>>\`, Ņ„Đ°ĐšĐģ Đ˛Ņ–Đ´ĐēŅ€Đ¸Đ˛Đ°Ņ”Ņ‚ŅŒŅŅ ҃ Ņ€ĐĩĐļиĐŧŅ– Đ´ĐžĐŋОвĐŊĐĩĐŊĐŊŅ. Đ’Ņ…ĐžĐ´ĐļĐĩĐŊĐŊŅ \`%D\` Ņ‚Đ° \`%T\` в Ņ–ĐŧĐĩĐŊŅ– СаĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Đ´Đ°Ņ‚ĐžŅŽ Ņ‚Đ° Ņ‡Đ°ŅĐžĐŧ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– YYYYMMDD Ņ‚Đ° HHMMSS. ĐŖ ĐŋаĐēĐĩŅ‚ĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģĐ°Ņ… Windows ви ĐŋОвиĐŊĐŊŅ– ĐŋĐžĐ´Đ˛ĐžŅ—Ņ‚Đ¸ ŅĐ¸ĐŧвОĐģ \`%\`, ĐŊаĐŋŅ€Đ¸ĐēĐģад, result\-%%D.log. ЊОй виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ \`>>\`, ви ĐŋОвиĐŊĐŊŅ– Đ˛ĐˇŅŅ‚Đ¸ Ņ–Đŧ\'Ņ в ĐģаĐŋĐēи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, \`\[dq]>>result.log\[dq]\`. ЊОй вивĐĩŅŅ‚Đ¸ ĐļŅƒŅ€ĐŊаĐģ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Đ˛Đ¸Đ˛Ņ–Đ´ айО ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊ҃ ĐŋĐžĐŧиĐģĐē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ \`\[dq]>&1\[dq]\` Ņ‚Đ° \`\[dq]>&2\[dq]\` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐž. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ snapraid_log.txt айО man\-ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ Đ´ĐģŅ ĐžĐŋĐ¸ŅŅ–Đ˛ Ņ‚ĐĩĐŗŅ–Đ˛ ĐļŅƒŅ€ĐŊаĐģ҃. .TP .B \-L, \-\-error\-limit NUMBER Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” ĐŊОвиК ĐģŅ–ĐŧŅ–Ņ‚ ĐŋĐžĐŧиĐģĐžĐē ĐŋĐĩŅ€ĐĩĐ´ ĐˇŅƒĐŋиĐŊĐēĐžŅŽ виĐēĐžĐŊаĐŊĐŊŅ. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ SnapRAID ĐˇŅƒĐŋиĐŊŅŅ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐˇŅƒŅŅ‚Ņ€Ņ–Ņ‡Đ°Ņ” ĐąŅ–ĐģҌ҈Đĩ 100 ĐŋĐžĐŧиĐģĐžĐē ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Ņ‰Đž вĐēĐ°ĐˇŅƒŅ” ĐŊа ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊ҃ Đ˛Ņ–Đ´ĐŧĐžĐ˛Ņƒ Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа \`sync\` Ņ‚Đ° \`scrub\`, ŅĐēиĐŧ дОСвОĐģĐĩĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋҖҁĐģŅ ĐŋĐĩŅ€ŅˆĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Ņƒ ĐŋĐžĐŧиĐģĐžĐē Đ´Đ¸ŅĐēа, Ņ‰ĐžĐą ҁĐŋŅ€ĐžĐąŅƒĐ˛Đ°Ņ‚Đ¸ СавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ ŅĐ˛ĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—. ОдĐŊаĐē \`check\` Ņ‚Đ° \`fix\` СавĐļди ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ ĐŋŅ€Đ¸ ĐŋĐĩŅ€ŅˆŅ–Đš ĐŋĐžĐŧиĐģ҆Җ. .TP .B \-S, \-\-start BLKSTART ĐŸĐžŅ‡Đ¸ĐŊĐ°Ņ” ĐžĐąŅ€ĐžĐąĐē҃ С вĐēаСаĐŊĐžĐŗĐž ĐŊĐžĐŧĐĩŅ€Đ° ĐąĐģĐžĐē҃. ĐĻĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžŅ— ҁĐŋŅ€ĐžĐąĐ¸ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи айО виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐŋĐĩвĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛ ҃ виĐŋадĐē҃ ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ в ĐžŅĐŊОвĐŊĐžĐŧ҃ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. .TP .B \-B, \-\-count BLKCOUNT ĐžĐąŅ€ĐžĐąĐģŅŅ” ĐģĐ¸ŅˆĐĩ вĐēаСаĐŊ҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąĐģĐžĐēŅ–Đ˛. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ в ĐžŅĐŊОвĐŊĐžĐŧ҃ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. .TP .B \-C, \-\-gen\-conf CONTENT ГĐĩĐŊĐĩŅ€ŅƒŅ” ҄ҖĐēŅ‚Đ¸Đ˛ĐŊиК ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ С ҖҁĐŊŅƒŅŽŅ‡ĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ вĐŧŅ–ŅŅ‚Ņƒ. КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ СаĐŋĐ¸ŅŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Đ˛Đ¸Đ˛Ņ–Đ´ Ņ– ĐŊĐĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅƒŅ” ҖҁĐŊŅƒŅŽŅ‡Đ¸Đš. ĐĻĐĩĐš ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ Ņ‚Đ°ĐēĐžĐļ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊ҃ Đ´ĐģŅ Ņ€ĐĩĐēĐžĐŊŅŅ‚Ņ€ŅƒĐē҆Җҗ Ņ‚ĐžŅ‡ĐžĐē ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēа ҃ виĐŋадĐē҃ Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸ Đ˛ŅŅ–Ņ”Ņ— ŅĐ¸ŅŅ‚ĐĩĐŧи. .TP .B \-v, \-\-verbose Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐąŅ–ĐģҌ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŊа ĐĩĐēŅ€Đ°ĐŊ. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ОдиĐŊ Ņ€Đ°Đˇ, Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ виĐēĐģŅŽŅ‡ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đē҃. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа Ņ„Đ°ĐšĐģи ĐļŅƒŅ€ĐŊаĐģ҃. .TP .B \-q, \-\-quiet Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐŧĐĩĐŊ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŊа ĐĩĐēŅ€Đ°ĐŊ. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ОдиĐŊ Ņ€Đ°Đˇ, видаĐģŅŅ” Ņ–ĐŊдиĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€ĐžĐŗŅ€Đĩҁ҃; Đ´Đ˛Ņ–Ņ‡Ņ– — ĐŋĐžŅ‚ĐžŅ‡ĐŊŅ– ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—; Ņ‚Ņ€Đ¸Ņ‡Ņ– — Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊŅ– ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ; Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Đ°ĐˇĐ¸ — ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ ĐŋŅ€Đž ŅŅ‚Đ°Ņ‚ŅƒŅ. Đ¤Đ°Ņ‚Đ°ĐģҌĐŊŅ– ĐŋĐžĐŧиĐģĐēи СавĐļди Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа ĐĩĐēŅ€Đ°ĐŊ. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа Ņ„Đ°ĐšĐģи ĐļŅƒŅ€ĐŊаĐģ҃. .TP .B \-H, \-\-help Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐēĐžŅ€ĐžŅ‚ĐēиК Đ´ĐžĐ˛Ņ–Đ´ĐēОвиК ĐĩĐēŅ€Đ°ĐŊ. .TP .B \-V, \-\-version Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ вĐĩŅ€ŅŅ–ŅŽ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи. .SH КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ SnapRAID виĐŧĐ°ĐŗĐ°Ņ” ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ, Ņ‰ĐžĐą СĐŊĐ°Ņ‚Đ¸, Đ´Đĩ Ņ€ĐžĐˇŅ‚Đ°ŅˆĐžĐ˛Đ°ĐŊиК Đ˛Đ°Ņˆ Đ´Đ¸ŅĐēОвиК ĐŧĐ°ŅĐ¸Đ˛ Ņ– Đ´Đĩ СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP В Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ \`/usr/local/etc/snapraid.conf\`, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ҖҁĐŊŅƒŅ”, Ņ–ĐŊаĐē҈Đĩ \`/etc/snapraid.conf\`. ĐŖ Windows виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ \`snapraid.conf\` ҃ Ņ‚ĐžĐŧ҃ ŅĐ°ĐŧĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ–, Ņ‰Đž Đš \`snapraid.exe\`. .PP Đ’Ņ–ĐŊ ĐŋОвиĐŊĐĩĐŊ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ (Ņ‡ŅƒŅ‚ĐģĐ¸Đ˛Ņ– Đ´Đž Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€Ņƒ): .SS parity FILE [,FILE] ... ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐˇĐ°Ņ…Đ¸ŅŅ‚ Đ˛Ņ–Đ´ Đ˛Ņ–Đ´ĐŧОви ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID5. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ ĐŊа Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. КоĐģи Ņ„Đ°ĐšĐģ ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ ĐŧĐžĐļĐĩ ĐˇŅ€ĐžŅŅ‚Đ°Ņ‚Đ¸, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиК. Đ—Đ°ĐŗĐ°ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋĐŊиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ ĐŋОвиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Ņ‚Đ°ĐēиĐŧ ĐļĐĩ вĐĩĐģиĐēиĐŧ, ŅĐē ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆĐ¸Đš Đ´Đ¸ŅĐē даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– Ņ„Đ°ĐšĐģи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ, аĐģĐĩ ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ… ĐŋĐĩŅ€Đĩ҃ĐŋĐžŅ€ŅĐ´ĐēĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ айО видаĐģŅŅ‚Đ¸. .PP ЗбĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛ĐžĐ˛Đ°ĐŊиĐŧи Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– СайĐĩСĐŋĐĩŅ‡ŅƒŅ”, Ņ‰Đž вОĐŊи ĐŊĐĩ ŅŅ‚Đ°ŅŽŅ‚ŅŒ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚ĐžĐ˛Đ°ĐŊиĐŧи, ĐŋĐžĐēŅ€Đ°Ņ‰ŅƒŅŽŅ‡Đ¸ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ. .PP ĐŖ Windows 256 МБ СаĐģĐ¸ŅˆĐ°Ņ”Ņ‚ŅŒŅŅ ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊиĐŧи ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž ĐŋОвĐŊŅ– Đ´Đ¸ŅĐēи. .PP ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” ОйОв\'ŅĐˇĐēĐžĐ˛ĐžŅŽ Ņ– ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊа ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Đ°Đˇ. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž вĐēаСаĐŊĐžĐŗĐž Ņ€Ņ–Đ˛ĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– вĐŧиĐēĐ°Ņ”Ņ‚ŅŒŅŅ ОдиĐŊ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ: .PD 0 .IP \(bu 2\-parity вĐŧиĐēĐ°Ņ” ĐŋĐžĐ´Đ˛Ņ–ĐšĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ RAID6. .IP \(bu 3\-parity вĐŧиĐēĐ°Ņ” ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. .IP \(bu 4\-parity вĐŧиĐēĐ°Ņ” ҇ĐĩŅ‚Đ˛ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. .IP \(bu 5\-parity вĐŧиĐēĐ°Ņ” Đŋ\'ŅŅ‚ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. .IP \(bu 6\-parity вĐŧиĐēĐ°Ņ” ҈Đĩҁ҂ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. .PD .PP КоĐļĐĩĐŊ Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– виĐŧĐ°ĐŗĐ°Ņ” ĐŊĐ°ŅĐ˛ĐŊĐžŅŅ‚Ņ– Đ˛ŅŅ–Ņ… ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Ņ… Ņ€Ņ–Đ˛ĐŊŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҂Җ ŅĐ°ĐŧŅ– ĐŧŅ–Ņ€ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰Đž Đš Đ´ĐģŅ ĐžĐŋ҆Җҗ \`parity\`. .PP ĐĻŅ– ĐžĐŋ҆Җҗ Ņ” ĐŊĐĩОйОв\'ŅĐˇĐēОвиĐŧи Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Đ°Đˇ. .SS z\-parity FILE [,FILE] ... ВизĐŊĐ°Ņ‡Đ°Ņ” аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊиК Ņ„Đ°ĐšĐģ Ņ‚Đ° Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊĐžŅ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐžŅŽ \`3\-parity\`, в ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ ĐĻП ĐŊĐ¸ĐˇŅŒĐēĐžĐŗĐž ĐēĐģĐ°ŅŅƒ, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē ARM айО AMD Phenom, Athlon Ņ‚Đ° Opteron, ŅĐēŅ– ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ ĐŊĐ°ĐąŅ–Ņ€ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐēŅ†Ņ–Đš SSSE3. ĐŖ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēĐ°Ņ… вОĐŊа СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐēŅ€Đ°Ņ‰Ņƒ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ. .PP ĐĻĐĩĐš Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ŅŅ…ĐžĐļиК, аĐģĐĩ ŅˆĐ˛Đ¸Đ´ŅˆĐ¸Đš, ĐŊŅ–Đļ Ņ‚ĐžĐš, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ZFS RAIDZ3. Đ¯Đē Ņ– ZFS, Đ˛Ņ–ĐŊ ĐŊĐĩ ĐŋŅ€Đ°Ņ†ŅŽŅ” даĐģŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊĐžŅ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ĐŸŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– \`3\-parity\` ви ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊŅ–, ŅĐēŅ‰Đž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ \`z\-parity\` Đ´ĐģŅ ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚Ņ–. .PP МоĐļĐŊа ĐēĐžĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ С ОдĐŊĐžĐŗĐž Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņƒ в Ņ–ĐŊŅˆĐ¸Đš, ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Đ˛ŅˆĐ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ С йаĐļаĐŊиĐŧ Ņ„Đ°ĐšĐģĐžĐŧ z\-parity айО 3\-parity Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ \`fix\` Đ´ĐģŅ ĐšĐžĐŗĐž Đ˛Ņ–Đ´Ņ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ. .SS content FILE ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģ, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ҁĐŋĐ¸ŅĐē҃ Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊĐ¸Ņ… ҁ҃Đŧ ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ–Ņ… ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. .PP Đ’Ņ–ĐŊ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ Ņ€ĐžĐˇĐŧҖ҉ĐĩĐŊиК ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ даĐŊĐ¸Ņ…, ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО ĐąŅƒĐ´ŅŒ\-ŅĐēĐžĐŧ҃ Ņ–ĐŊŅˆĐžĐŧ҃ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃. Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ Đ´Đ¸ŅĐē даĐŊĐ¸Ņ…, ҆ĐĩĐš Ņ„Đ°ĐšĐģ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ С ĐŋŅ€ĐžŅ†Đĩҁ҃ \`sync\`. .PP ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” ОйОв\'ŅĐˇĐēĐžĐ˛ĐžŅŽ Ņ– ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊа ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛ Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… ĐēĐžĐŋŅ–Đš ОдĐŊĐžĐŗĐž Ņ– Ņ‚ĐžĐŗĐž Đļ Ņ„Đ°ĐšĐģ҃. .PP Ви ĐŋОвиĐŊĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊ҃ ĐēĐžĐŋŅ–ŅŽ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐģŅŽŅ ОдĐŊ҃. ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ĐēĐžĐŋŅ–Đš ĐŊĐĩ ĐˇĐ°ŅˆĐēĐžĐ´Đ¸Ņ‚ŅŒ. .SS data NAME DIR ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ–Đŧ\'Ņ Ņ‚Đ° Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēŅ–Đ˛ даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. NAME виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— Đ´Đ¸ŅĐēа Ņ– ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ҃ĐŊŅ–ĐēаĐģҌĐŊиĐŧ. DIR — ҆Đĩ Ņ‚ĐžŅ‡Đēа ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēа ҃ Ņ„Đ°ĐšĐģĐžĐ˛Ņ–Đš ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Са ĐŋĐžŅ‚Ņ€Đĩйи, ĐŋĐžĐēи ви СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚Đĩ NAME ҄ҖĐēŅĐžĐ˛Đ°ĐŊиĐŧ. .PP Ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ОдĐŊ҃ ĐžĐŋŅ†Ņ–ŅŽ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐē ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ, СĐŧŅ–ĐŊĐ¸Đ˛ŅˆĐ¸ NAME ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–, а ĐŋĐžŅ‚Ņ–Đŧ СаĐŋŅƒŅŅ‚Đ¸Đ˛ŅˆĐ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ \`sync\`. ĐŖ виĐŋадĐē҃ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Đ°ŅĐžŅ†Ņ–Đ°Ņ†Ņ–Ņ ĐˇĐ´Ņ–ĐšŅĐŊŅŽŅ”Ņ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ СйĐĩŅ€ĐĩĐļĐĩĐŊĐžĐŗĐž UUID Đ´Đ¸ŅĐēŅ–Đ˛. .SS extra NAME DIR ВизĐŊĐ°Ņ‡Đ°Ņ” ĐŊĐ°ĐˇĐ˛Ņƒ Ņ‚Đ° Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ Đ´ĐģŅ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊĐ´ \`smart\` Ņ‚Đ° \`probe\`. .PP ĐĻĐĩ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ Ņ” Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ ĐŧĐ°ŅĐ¸Đ˛Ņƒ, аĐģĐĩ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊŅ– Đ´ĐģŅ Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊŅƒĐ˛Đ°ĐŊĐŊŅ ŅĐ¸ŅŅ‚ĐĩĐŧи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°ĐģҌĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. .PP ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž ĐŊа Ņ‚Đ°ĐēŅ– Đ´Đ¸ŅĐēи ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŒ ĐēĐžĐŧаĐŊди \`up\` Ņ‚Đ° \`down\`, ĐžŅĐēŅ–ĐģҌĐēи ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‰Đž вОĐŊи СавĐļди ОйĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒŅŅ. .SS nohidden ВиĐēĐģŅŽŅ‡Đ°Ņ” Đ˛ŅŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸. В Unix ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи — ҆Đĩ ҂Җ, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŒŅŅ С \`.\`. ĐŖ Windows ҆Đĩ ҂Җ, Ņ‰Đž ĐŧĐ°ŅŽŅ‚ŅŒ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊиК Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚. .SS exclude/include PATTERN ВизĐŊĐ°Ņ‡Đ°Ņ” ŅˆĐ°ĐąĐģĐžĐŊи Ņ„Đ°ĐšĐģŅ–Đ˛ айО ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ Đ´ĐģŅ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ айО вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ ҃ ĐŋŅ€ĐžŅ†Đĩҁ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐŖŅŅ– ŅˆĐ°ĐąĐģĐžĐŊи ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ҃ вĐēаСаĐŊĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃. .PP Đ¯ĐēŅ‰Đž ĐŋĐĩŅ€ŅˆĐ¸Đš ŅˆĐ°ĐąĐģĐžĐŊ, ŅĐēиК ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ” \`exclude\` (виĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸), Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Đ˛Ņ–ĐŊ Ņ” \`include\` (вĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸), Ņ„Đ°ĐšĐģ вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž ĐļОдĐĩĐŊ ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐĩ ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš вĐēаСаĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ Ņ” \`include\`, айО вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš вĐēаСаĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ Ņ” \`exclude\`. .PP Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ€ĐžĐˇĐ´Ņ–Đģ PATTERN Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛. .PP ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. .SS blocksize SIZE_IN_KIBIBYTES ВизĐŊĐ°Ņ‡Đ°Ņ” ĐžŅĐŊОвĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ в ĐēŅ–ĐąŅ–ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ОдиĐŊ ĐēŅ–ĐąŅ–ĐąĐ°ĐšŅ‚ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” 1024 ĐąĐ°ĐšŅ‚Đ°Đŧ. .PP РОСĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ 256, Ņ‰Đž ĐŧĐ°Ņ” ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛. .PP ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. ЊОй СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅŒĐžĐŧ҃, ваĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ! .PP ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, ŅĐēŅ‰Đž ҃ Đ˛Đ°Ņ Ņ” ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŊĐĩвĐĩĐģиĐēĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŋĐžŅ€ŅĐ´Đē҃ ĐŧŅ–ĐģŅŒĐšĐžĐŊŅ–Đ˛. .PP ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž ҆Đĩ ĐģĐ¸ŅˆĐĩ ĐēŅ–ĐģҌĐēа ĐąĐ°ĐšŅ‚Ņ–Đ˛, Đ˛Đ¸Đ´Ņ–ĐģŅŅ”Ņ‚ŅŒŅŅ ҆ҖĐģиК ĐąĐģĐžĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ– С ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐŧа Ņ„Đ°ĐšĐģаĐŧи ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž СĐŊĐ°Ņ‡ĐŊĐžĐŗĐž ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐģи ви ĐŋОвĐŊŅ–ŅŅ‚ŅŽ СаĐŋОвĐŊŅŽŅ”Ņ‚Đĩ Đ´Đ¸ŅĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ваĐŧ ĐŊĐĩ дОСвОĐģŅŅ”Ņ‚ŅŒŅŅ Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐģҌ҈Đĩ Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ…. ОдĐŊаĐē, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊа ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊĐĩ ĐŊаĐēĐžĐŋĐ¸Ņ‡ŅƒŅ”Ņ‚ŅŒŅŅ ĐŧŅ–Đļ Đ´Đ¸ŅĐēаĐŧи даĐŊĐ¸Ņ…. Đ’Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐĩ ĐŧҖҁ҆Đĩ вĐŊĐ°ŅĐģŅ–Đ´ĐžĐē вĐĩĐģиĐēĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ОйĐŧĐĩĐļŅƒŅ” ĐģĐ¸ŅˆĐĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ даĐŊĐ¸Ņ… ĐŊа Ņ†ŅŒĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ…, а ĐŊĐĩ ĐŊа Ņ–ĐŊŅˆĐ¸Ņ…. .PP Đ¯Đē ĐŊайĐģиĐļĐĩĐŊĐŊŅ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸, Ņ‰Đž ĐŋĐžĐģОвиĐŊа Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡Đ°Ņ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃. НаĐŋŅ€Đ¸ĐēĐģад, ĐˇŅ– 100 000 Ņ„Đ°ĐšĐģаĐŧи Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ ĐąĐģĐžĐē҃ 256 ĐšŅ–Đ‘ ви Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ 12,8 ГБ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ‰Đž ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ‚ĐžĐŗĐž, Ņ‰Đž ĐŊа Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąŅƒĐ´Đĩ ĐŊа 12,8 ГБ ĐŧĐĩĐŊ҈Đĩ ĐŧŅ–ŅŅ†Ņ. .PP Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ \`status\`. ĐĻĐĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŧŅ–ŅŅ†Ņ, ŅĐē҃ ви ĐŋОвиĐŊĐŊŅ– СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ Đ˛Ņ–ĐģҌĐŊĐžŅŽ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ… айО виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛. Đ¯ĐēŅ‰Đž ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ˛Ņ–Đ´\'Ņ”ĐŧĐŊĐĩ, ҆Đĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ви ĐŊайĐģиĐļĐ°Ņ”Ņ‚ĐĩŅŅ Đ´Đž СаĐŋОвĐŊĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ– вОĐŊĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ” ĐŧҖҁ҆Đĩ, ŅĐēĐĩ ви ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đ¸. .PP ЊОй ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ҆ҖҔҗ ĐŋŅ€ĐžĐąĐģĐĩĐŧи, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Ņ€ĐžĐˇĐ´Ņ–Đģ Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž Ņ€ĐžĐˇĐ´Ņ–Đģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŊа 12,8 ГБ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Са Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ…, ҃ Đ˛Đ°Ņ Ņ” Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи Đ´Đž 100 000 Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąĐĩС ĐąŅƒĐ´ŅŒ\-ŅĐēĐžĐŗĐž Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. .PP ĐĨĐ¸Ņ‚Ņ€Ņ–ŅŅ‚ŅŒ, Ņ‰ĐžĐą ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Ņ€ĐžĐˇĐ´Ņ–Đģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– в Linux, ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰ĐžĐą Đ˛Ņ–Đ´Ņ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ĐēĐžĐŧаĐŊĐ´ĐžŅŽ: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP ĐĻĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 1,5% Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ, ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 60 ГБ Đ´ĐģŅ Đ´Đ¸ŅĐēа 4 ĐĸБ, Ņ‰Đž дОСвОĐģŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 460 000 Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąĐĩС ĐąŅƒĐ´ŅŒ\-ŅĐēĐžĐŗĐž Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. .SS hashsize SIZE_IN_BYTES ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛. .PP РОСĐŧŅ–Ņ€ Ņ…Đĩ҈҃ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ 16 ĐąĐ°ĐšŅ‚Ņ–Đ˛ (128 ĐąŅ–Ņ‚), Ņ‰Đž ĐŧĐ°Ņ” ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛. .PP ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. ЊОй СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅŒĐžĐŧ҃, ваĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ! .PP ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, ŅĐēŅ‰Đž Đ˛Đ°ŅˆĐ° ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŧĐ°Ņ” ОйĐŧĐĩĐļĐĩĐŊ҃ ĐŋаĐŧ\'ŅŅ‚ŅŒ. Đ¯Đē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, SnapRAID ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš виĐŧĐ°ĐŗĐ°Ņ” 1 Đ“Ņ–Đ‘ ОЗП ĐŊа ĐēĐžĐļĐŊŅ– 16 ĐĸБ даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. .PP ЗоĐēŅ€ĐĩĐŧа, Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ…ĐĩŅˆŅ–Đ˛ даĐŊĐ¸Ņ… SnapRAID виĐŧĐ°ĐŗĐ°Ņ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž $TS \\times (1+HS) / BS$ ĐąĐ°ĐšŅ‚Ņ–Đ˛ ОЗП, Đ´Đĩ TS — ĐˇĐ°ĐŗĐ°ĐģҌĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ Đ˛Đ°ŅˆĐžĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…, BS — Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…, а HS — Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…. .PP НаĐŋŅ€Đ¸ĐēĐģад, С 8 Đ´Đ¸ŅĐēаĐŧи ĐŋĐž 4 ĐĸБ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ ĐąĐģĐžĐē҃ 256 ĐšŅ–Đ‘ (1 ĐšŅ–Đ‘ = 1024 ĐąĐ°ĐšŅ‚Đ°) Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ…Đĩ҈҃ 16, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: .PP RAM = $(8 \\times 4 \\times 10^{12}) \\times (1+16) / (256 \\times 2^{10}) = 1.93$ Đ“Ņ–Đ‘ .PD 0 .PD .PP ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đĩ҈҃ 8, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: .PP RAM = $(8 \\times 4 \\times 10^{12}) \\times (1+8) / (256 \\times 2^{10}) = 1.02$ Đ“Ņ–Đ‘ .PD 0 .PD .PP ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ 512, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: .PP RAM = $(8 \\times 4 \\times 10^{12}) \\times (1+16) / (512 \\times 2^{10}) = 0.96$ Đ“Ņ–Đ‘ .PD 0 .PD .PP ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đĩ҈҃ 8 Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ 512, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: .PP RAM = $(8 \\times 4 \\times 10^{12}) \\times (1+8) / (512 \\times 2^{10}) = 0.51$ Đ“Ņ–Đ‘ .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ŅŅ‚Đ°ĐŊ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— айО ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋҖҁĐģŅ ĐžĐąŅ€ĐžĐąĐēи вĐēаСаĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– ГБ. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐēĐžŅ€Đ¸ŅĐŊа, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ Đ´ĐžĐ˛ĐŗĐ¸Ņ… ĐēĐžĐŧаĐŊĐ´ \`sync\` С ĐŊ҃ĐģŅ, ŅĐēŅ‰Đž вОĐŊи ĐąŅƒĐģи ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊŅ– ĐˇĐąĐžŅ”Đŧ ĐŧĐ°ŅˆĐ¸ĐŊи айО ĐąŅƒĐ´ŅŒ\-ŅĐēĐžŅŽ Ņ–ĐŊŅˆĐžŅŽ ĐŋĐžĐ´Ņ–Ņ”ŅŽ. .SS temp_limit TEMPERATURE_CELSIUS Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊ҃ дОСвОĐģĐĩĐŊ҃ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа в ĐĻĐĩĐģŅŒŅŅ–ŅŅ…. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž, SnapRAID ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņƒ smartctl. ĐŸĐžŅ‚ĐžŅ‡ĐŊŅ– Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐąĐžŅ‚Đ¸ SnapRAID. Đ¯ĐēŅ‰Đž ĐąŅƒĐ´ŅŒ\-ŅĐēиК Đ´Đ¸ŅĐē ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” ҆ĐĩĐš ĐģŅ–ĐŧŅ–Ņ‚, ŅƒŅŅ– ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ, Ņ– Đ´Đ¸ŅĐēи ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ (ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŅ‚ŅŒ ҃ Ņ€ĐĩĐļиĐŧ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ) ĐŊа Ņ‡Đ°Ņ, виСĐŊĐ°Ņ‡ĐĩĐŊиК ĐžĐŋŅ†Ņ–Ņ”ŅŽ \`temp_sleep\`. ĐŸŅ–ŅĐģŅ ĐŋĐĩŅ€Ņ–ĐžĐ´Ņƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— Đ˛Ņ–Đ´ĐŊОвĐģŅŽŅŽŅ‚ŅŒŅŅ, ĐŋĐžŅ‚ĐĩĐŊŅ†Ņ–ĐšĐŊĐž СĐŊĐžĐ˛Ņƒ ĐŋŅ€Đ¸ĐˇŅƒĐŋиĐŊŅŅŽŅ‡Đ¸ŅŅŒ, ŅĐēŅ‰Đž ĐģŅ–ĐŧŅ–Ņ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸ СĐŊĐžĐ˛Ņƒ Đ´ĐžŅŅĐŗĐŊŅƒŅ‚Đ¸Đš. .PP ĐŸŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐąĐžŅ‚Đ¸ SnapRAID Ņ‚Đ°ĐēĐžĐļ аĐŊаĐģŅ–ĐˇŅƒŅ” ĐēŅ€Đ¸Đ˛Ņƒ ĐŊĐ°ĐŗŅ€Ņ–Đ˛Đ°ĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа Ņ‚Đ° ĐžŅ†Ņ–ĐŊŅŽŅ” Đ´ĐžĐ˛ĐŗĐžŅŅ‚Ņ€ĐžĐēĐžĐ˛Ņƒ ŅŅ‚Đ°ĐąŅ–ĐģҌĐŊ҃ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ, ŅĐēĐžŅ— вОĐŊи, ŅĐē ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Đ´ĐžŅŅĐŗĐŊŅƒŅ‚ŅŒ, ŅĐēŅ‰Đž аĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚ŅŒŅŅ. ĐžŅ†Ņ–ĐŊĐēа виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ ĐŋҖҁĐģŅ Ņ‚ĐžĐŗĐž, ŅĐē Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ´Đ¸ŅĐēа ĐŋŅ–Đ´Đ˛Đ¸Ņ‰Đ¸ĐģĐ°ŅŅ Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Đ°ĐˇĐ¸, Ņ‰Đž ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒŅ” ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– даĐŊĐ¸Ņ… Đ´ĐģŅ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ ĐŊĐ°Đ´Ņ–ĐšĐŊĐžĐŗĐž ҂ҀĐĩĐŊĐ´Ņƒ. ĐĻŅ ĐŋŅ€ĐžĐŗĐŊОСОваĐŊа ŅŅ‚Đ°ĐąŅ–ĐģҌĐŊа Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ”Ņ‚ŅŒŅŅ в Đ´ŅƒĐļĐēĐ°Ņ… ĐŋĐžŅ€ŅƒŅ‡ Ņ–Đˇ ĐŋĐžŅ‚ĐžŅ‡ĐŊиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Ņ– Đ´ĐžĐŋĐžĐŧĐ°ĐŗĐ°Ņ” ĐžŅ†Ņ–ĐŊĐ¸Ņ‚Đ¸, Ņ‡Đ¸ Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅ” ĐžŅ…ĐžĐģОдĐļĐĩĐŊĐŊŅ ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐĻŅ ĐžŅ†Ņ–ĐŊŅŽĐ˛Đ°ĐŊа Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Ņ” ĐģĐ¸ŅˆĐĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊĐžŅŽ Ņ– ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ SnapRAID. Đ”Ņ–Ņ— ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи ĐąĐ°ĐˇŅƒŅŽŅ‚ŅŒŅŅ виĐēĐģŅŽŅ‡ĐŊĐž ĐŊа Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊĐž виĐŧŅ–Ņ€ŅĐŊĐ¸Ņ… Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ°Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. .PP ДĐģŅ виĐēĐžĐŊаĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž аĐŊаĐģŅ–ĐˇŅƒ SnapRAID ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа Đ´ĐžĐ˛Ņ–Đ´ĐēОва Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐĄĐŋĐžŅ‡Đ°Ņ‚Đē҃ Đ˛Ņ–ĐŊ ĐŊаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ ĐˇŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ Ņ—Ņ— С Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… аĐŋĐ°Ņ€Đ°Ņ‚ĐŊĐ¸Ņ… Đ´Đ°Ņ‚Ņ‡Đ¸ĐēŅ–Đ˛. Đ¯ĐēŅ‰Đž Đ´Đž ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐžĐŗĐž Đ´Đ°Ņ‚Ņ‡Đ¸Đēа ĐŊĐĩĐŧĐžĐļĐģивО ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ, Đ˛Ņ–ĐŊ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ĐŊаКĐŊиĐļŅ‡Ņƒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа, виĐŧŅ–Ņ€ŅĐŊ҃ ĐŊа ĐŋĐžŅ‡Đ°Ņ‚Đē҃ СаĐŋ҃ҁĐē҃, ŅĐē Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ Đ´ĐžĐ˛Ņ–Đ´ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ. .PP Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš SnapRAID ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐģĐ¸ŅˆĐĩ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ĐŊĐ°ĐšĐŗĐ°Ņ€ŅŅ‡Ņ–ŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа. ЊОй Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ \-A айО \-\-stats. .SS temp_sleep TIME_IN_MINUTES Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, ҃ Ņ…Đ˛Đ¸ĐģиĐŊĐ°Ņ…, ĐēĐžĐģи Đ´ĐžŅŅĐŗĐŊŅƒŅ‚Đž ĐģŅ–ĐŧŅ–Ņ‚Ņƒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸. ĐŸŅ€ĐžŅ‚ŅĐŗĐžĐŧ Ņ†ŅŒĐžĐŗĐž ĐŋĐĩŅ€Ņ–ĐžĐ´Ņƒ Đ´Đ¸ŅĐēи СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ ĐˇŅƒĐŋиĐŊĐĩĐŊиĐŧи. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ 5 Ņ…Đ˛Đ¸ĐģиĐŊ. .SS pool DIR ВизĐŊĐ°Ņ‡Đ°Ņ” ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ой\'Ņ”Đ´ĐŊаĐŊĐŊŅ, Đ´Đĩ ŅŅ‚Đ˛ĐžŅ€ŅŽŅ”Ņ‚ŅŒŅŅ Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди \`pool\`. .PP ĐšĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŋОвиĐŊĐĩĐŊ вĐļĐĩ ҖҁĐŊŅƒĐ˛Đ°Ņ‚Đ¸. .SS share UNC_DIR ВизĐŊĐ°Ņ‡Đ°Ņ” ҈ĐģŅŅ… Windows UNC, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊиК Đ´ĐģŅ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ´Đ¸ŅĐēŅ–Đ˛. .PP Đ¯ĐēŅ‰Đž Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ вĐēаСаĐŊа, ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ, ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ– в ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– pool, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ҆ĐĩĐš ҈ĐģŅŅ… UNC Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ´Đ¸ŅĐēŅ–Đ˛. БĐĩС ҆ҖҔҗ ĐžĐŋ҆Җҗ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊŅ– ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐģĐžĐēаĐģҌĐŊŅ– ҈ĐģŅŅ…Đ¸, Ņ‰Đž ĐŊĐĩ дОСвОĐģŅŅ” ҁĐŋŅ–ĐģҌĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ pool ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃. .PP ХиĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ Ņ„ĐžŅ€ĐŧŅƒŅŽŅ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ вĐēаСаĐŊĐžĐŗĐž ҈ĐģŅŅ…Ņƒ UNC, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ Ņ–Đŧ\'Ņ Đ´Đ¸ŅĐēа, ŅĐē СаСĐŊĐ°Ņ‡ĐĩĐŊĐž в ĐžĐŋ҆Җҗ \`data\`, Ņ–, ĐŊĐ°Ņ€ĐĩŅˆŅ‚Ņ–, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ‚Đ° Ņ–Đŧ\'Ņ Ņ„Đ°ĐšĐģ҃. .PP ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Windows. .SS smartctl DISK/PARITY OPTIONS... ВизĐŊĐ°Ņ‡Đ°Ņ” ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēŅ– ĐžĐŋ҆Җҗ smartctl Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛ SMART Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĻĐĩ ĐŧĐžĐļĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ Đ´ĐģŅ RAID\-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Ņ–Đ˛ Ņ‚Đ° Đ´ĐĩŅĐēĐ¸Ņ… USB\-Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ–. ЗаĐŋОвĐŊŅŽĐ˛Đ°Ņ‡ %s СаĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Ņ–ĐŧĐĩĐŊĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ, аĐģĐĩ Đ˛Ņ–ĐŊ ĐŊĐĩОйОв\'ŅĐˇĐēОвиК Đ´ĐģŅ ҄ҖĐēŅĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē RAID\-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Đ¸. .PP DISK — ҆Đĩ Ņ‚Đĩ ŅĐ°ĐŧĐĩ Ņ–Đŧ\'Ņ Đ´Đ¸ŅĐēа, вĐēаСаĐŊĐĩ в ĐžĐŋ҆Җҗ \`data\`. PARITY — ҆Đĩ ОдĐŊĐĩ С Ņ–ĐŧĐĩĐŊ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` айО \`z\-parity\`. .PP ĐŖ вĐēаСаĐŊĐ¸Ņ… OPTIONS Ņ€ŅĐ´ĐžĐē \`%s\` СаĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Ņ–ĐŧĐĩĐŊĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ. ДĐģŅ RAID\-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Ņ–Đ˛ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž ҄ҖĐēŅĐžĐ˛Đ°ĐŊиК, Ņ– ваĐŧ ĐŧĐžĐļĐĩ ĐŊĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ \`%s\`. .PP ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ Đ´Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— smartmontools Đ´ĐģŅ ĐŧĐžĐļĐģĐ¸Đ˛Đ¸Ņ… ĐžĐŋŅ†Ņ–Đš: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP НаĐŋŅ€Đ¸ĐēĐģад: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Đ†ĐŗĐŊĐžŅ€ŅƒŅ” вĐēаСаĐŊиК Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ SMART ĐŋŅ€Đ¸ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ– ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ĐŧОви Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐēĐžŅ€Đ¸ŅĐŊа, ŅĐēŅ‰Đž Đ´Đ¸ŅĐē ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ” ĐŊĐĩĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊŅ– айО ĐžĐŧаĐŊĐģĐ¸Đ˛Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŋĐĩвĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°. .PP DISK — ҆Đĩ Ņ‚Đĩ ŅĐ°ĐŧĐĩ Ņ–Đŧ\'Ņ Đ´Đ¸ŅĐēа, вĐēаСаĐŊĐĩ в ĐžĐŋ҆Җҗ \`data\`. PARITY — ҆Đĩ ОдĐŊĐĩ С Ņ–ĐŧĐĩĐŊ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\` айО \`z\-parity\`. ĐĄĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ * ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ° ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. .PP НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ \`Current Pending Sector Count\` ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ…: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP ЊОй Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ĐģĐ¸ŅˆĐĩ ĐŊа ĐŋĐĩŅ€ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐē҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS ĐŸŅ€Đ¸ĐēĐģади ĐŸŅ€Đ¸ĐēĐģад Ņ‚Đ¸ĐŋĐžĐ˛ĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ Unix: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP ĐŸŅ€Đ¸ĐēĐģад Ņ‚Đ¸ĐŋĐžĐ˛ĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ Windows: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH ШайĐģĐžĐŊ (PATTERN) ШайĐģĐžĐŊи СайĐĩСĐŋĐĩŅ‡ŅƒŅŽŅ‚ŅŒ ĐŗĐŊŅƒŅ‡ĐēиК ҁĐŋĐžŅŅ–Đą ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģŅ–Đ˛ Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ айО виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ŅĐ¸ĐŧвОĐģи ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊОвĐēи (globbing), ви ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸Đģа, ŅĐēŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊиĐŧ Ņ–ĐŧĐĩĐŊаĐŧ Ņ„Đ°ĐšĐģŅ–Đ˛ айО ҆ҖĐģиĐŧ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ°Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ ĐąĐĩС Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž ҈ĐģŅŅ…Ņƒ. .PP ЗĐŊаĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ \`?\` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēĐžĐŧ҃ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃, ĐēҀҖĐŧ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēа ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ĐĻĐĩ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ ĐšĐžĐŗĐž ĐēĐžŅ€Đ¸ŅĐŊиĐŧ Đ´ĐģŅ ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ–ĐŧĐĩĐŊ Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ–Đˇ СĐŧŅ–ĐŊĐŊиĐŧи ŅĐ¸ĐŧвОĐģаĐŧи, ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ ОдĐŊиĐŧ Ņ€Ņ–Đ˛ĐŊĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ. .PP ОдиĐŊĐ°Ņ€ĐŊа ĐˇŅ–Ņ€ĐžŅ‡Đēа \`*\` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēŅ–Đš ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊĐžŅŅ‚Ņ– ŅĐ¸ĐŧвОĐģŅ–Đ˛, аĐģĐĩ, ŅĐē Ņ– СĐŊаĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ, вОĐŊа ĐŊŅ–ĐēĐžĐģи ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ‚Đ¸ĐŊĐ°Ņ” ĐŧĐĩĐļŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ВоĐŊа ĐˇŅƒĐŋиĐŊŅŅ”Ņ‚ŅŒŅŅ ĐŊа ĐŋŅ€ŅĐŧŅ–Đš ĐēĐžŅŅ–Đš Ņ€Đ¸ŅŅ†Ņ–, Ņ‰Đž Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ—Ņ— ĐŋŅ€Đ¸Đ´Đ°Ņ‚ĐŊĐžŅŽ Đ´ĐģŅ ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ҈ĐģŅŅ…Ņƒ. ĐĻĐĩ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊа ĐŋОвĐĩĐ´Ņ–ĐŊĐēа ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊĐžĐ˛ĐžŅ‡ĐŊĐ¸Ņ… СĐŊаĐēŅ–Đ˛, СĐŊаКОĐŧа С ĐēĐžĐŧаĐŊĐ´ĐŊĐžŅ— ОйОĐģĐžĐŊĐēи (shell globbing). .PP ĐŸĐžĐ´Đ˛Ņ–ĐšĐŊа ĐˇŅ–Ņ€ĐžŅ‡Đēа \`**\` Ņ” ĐŋĐžŅ‚ŅƒĐļĐŊŅ–ŅˆĐžŅŽ, вОĐŊа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēŅ–Đš ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊĐžŅŅ‚Ņ– ŅĐ¸ĐŧвОĐģŅ–Đ˛, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ĐĻĐĩ дОСвОĐģŅŅ” ŅˆĐ°ĐąĐģĐžĐŊаĐŧ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēĐžĐŧ Ņ€Ņ–Đ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. КоĐģи \`**\` С\'ŅĐ˛ĐģŅŅ”Ņ‚ŅŒŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž в ŅˆĐ°ĐąĐģĐžĐŊŅ–, вОĐŊа ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐŊ҃ĐģŅŽ айО ĐąŅ–ĐģҌ҈Đĩ ŅĐ¸ĐŧвОĐģаĐŧ, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐēĐžŅŅ– Ņ€Đ¸ŅĐēи ĐŧŅ–Đļ ĐžŅ‚ĐžŅ‡ŅƒŅŽŅ‡Đ¸Đŧ ĐģŅ–Ņ‚ĐĩŅ€Đ°ĐģҌĐŊиĐŧ Ņ‚ĐĩĐēŅŅ‚ĐžĐŧ. .PP НайваĐļĐģĐ¸Đ˛Ņ–ŅˆĐ¸Đŧ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ \`**\` Ņ” ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊа Ņ„ĐžŅ€Đŧа \`/**/\`. ВоĐŊа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐŊ҃ĐģŅŽ айО ĐąŅ–ĐģҌ҈Đĩ ĐŋОвĐŊиĐŧ Ņ€Ņ–Đ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, Ņ‰Đž дОСвОĐģŅŅ” ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģŅŅ‚Đ¸ Ņ„Đ°ĐšĐģи ĐŊа ĐąŅƒĐ´ŅŒ\-ŅĐēŅ–Đš ĐŗĐģийиĐŊŅ– в Đ´ĐĩŅ€ĐĩĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ĐŊĐĩ СĐŊĐ°ŅŽŅ‡Đ¸ Ņ‚ĐžŅ‡ĐŊĐžŅ— ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ¸ ҈ĐģŅŅ…Ņƒ. НаĐŋŅ€Đ¸ĐēĐģад, ŅˆĐ°ĐąĐģĐžĐŊ \`src/**/main.js\` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” \`src/main.js\` (ĐŋŅ€ĐžĐŋ҃ҁĐē ĐŊ҃ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛), \`src/ui/main.js\` (ĐŋŅ€ĐžĐŋ҃ҁĐē ОдĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ) Ņ‚Đ° \`src/ui/components/main.js\` (ĐŋŅ€ĐžĐŋ҃ҁĐē Đ´Đ˛ĐžŅ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛). .PP КĐģĐ°ŅĐ¸ ŅĐ¸ĐŧвОĐģŅ–Đ˛ Ņ–Đˇ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊĐ¸Ņ… Đ´ŅƒĐļĐžĐē \`[]\` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃ С виСĐŊĐ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Ņƒ айО Đ´Ņ–Đ°ĐŋаСОĐŊ҃. Đ¯Đē Ņ– Ņ–ĐŊŅˆŅ– ОдĐŊĐžŅĐ¸ĐŧвОĐģҌĐŊŅ– ŅˆĐ°ĐąĐģĐžĐŊи, вОĐŊи ĐŊĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēаĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. КĐģĐ°ŅĐ¸ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ Đ´Ņ–Đ°ĐŋаСОĐŊи Ņ‚Đ° СаĐŋĐĩŅ€Đĩ҇ĐĩĐŊĐŊŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ СĐŊаĐē҃ ĐžĐēĐģиĐē҃. .PP Đ¤ŅƒĐŊдаĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊа Đ˛Ņ–Đ´ĐŧŅ–ĐŊĐŊŅ–ŅŅ‚ŅŒ, ŅĐē҃ ҁĐģŅ–Đ´ ĐŋаĐŧ\'ŅŅ‚Đ°Ņ‚Đ¸, ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰Đž \`*\`, \`?\` Ņ‚Đ° ĐēĐģĐ°ŅĐ¸ ŅĐ¸ĐŧвОĐģŅ–Đ˛ ŅƒŅŅ– Đ´ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ ĐŧĐĩĐļ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ Ņ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ в ĐŧĐĩĐļĐ°Ņ… ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ҈ĐģŅŅ…Ņƒ, Ņ‚ĐžĐ´Ņ– ŅĐē \`**\` — Ņ”Đ´Đ¸ĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ, ŅĐēиК ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ҇ĐĩŅ€ĐĩС Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. .PP Đ†ŅĐŊŅƒŅ” Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Ņ–ĐˇĐŊŅ– Ņ‚Đ¸Đŋи ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛: .TP .B FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–Đŧ\'ŅĐŧ FILE. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐŊĐĩ Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš. .TP .B DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐē҃ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–ŅŽ С Ņ–Đŧ\'ŅĐŧ DIR Ņ– Đ˛ŅĐĩ, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ–. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš, а ĐŊĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛. .TP .B /PATH/FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ҈ĐģŅŅ… Đ´Đž Ņ„Đ°ĐšĐģ҃. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐŊĐĩ Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš. .TP .B /PATH/DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ҈ĐģŅŅ… Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Ņ— Ņ– Đ˛ŅĐĩ, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ–. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš, а ĐŊĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛. .PP КоĐģи ви вĐēĐ°ĐˇŅƒŅ”Ņ‚Đĩ Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊиК ҈ĐģŅŅ…, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ С /, Đ˛Ņ–ĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž ĐēĐžŅ€ĐĩĐŊĐĩĐ˛ĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŧĐ°ŅĐ¸Đ˛Ņƒ, а ĐŊĐĩ Đ´Đž ĐēĐžŅ€ĐĩĐŊĐĩĐ˛ĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐģĐžĐēаĐģҌĐŊĐžŅ— Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи. .PP ĐŖ Windows ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊ҃ ҁĐēҖҁĐŊ҃ Ņ€Đ¸ŅĐē҃ \\ СаĐŧŅ–ŅŅ‚ŅŒ ĐŋŅ€ŅĐŧĐžŅ— ҁĐēҖҁĐŊĐžŅ— Ņ€Đ¸ŅĐēи /. ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows, С\'Ņ”Đ´ĐŊаĐŊĐŊŅ, Ņ‚ĐžŅ‡Đēи ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Ņ–ĐŊŅˆŅ– ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows Ņ€ĐžĐˇĐŗĐģŅĐ´Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē Ņ„Đ°ĐšĐģи, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´ĐģŅ Ņ—Ņ… виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ„Đ°ĐšĐģ҃, а ĐŊĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ. .PP Đ¯ĐēŅ‰Đž Ņ–Đŧ\'Ņ Ņ„Đ°ĐšĐģ҃ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģи \`*\`, \`?\`, \`[\`, айО \`]\`, ви ĐŋОвиĐŊĐŊŅ– ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ…, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ Ņ—Ņ… Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Ņ–Ņ— ŅĐē ŅĐ¸ĐŧвОĐģ҃ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ. В Unix ŅĐ¸ĐŧвОĐģĐžĐŧ ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ” \`\\\`; ҃ Windows — \`^\`. КоĐģи ŅˆĐ°ĐąĐģĐžĐŊ СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ в ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, ви ĐŋОвиĐŊĐŊŅ– ĐŋĐžĐ´Đ˛ĐžŅ—Ņ‚Đ¸ ŅĐ¸ĐŧвОĐģ ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą СаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐšĐžĐŗĐž Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Ņ–Ņ— ĐēĐžĐŧаĐŊĐ´ĐŊĐžŅŽ ОйОĐģĐžĐŊĐēĐžŅŽ. .PP ĐŖ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊŅ– ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗŅ–Ņ— Đ´ĐģŅ ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸. НайĐŋŅ€ĐžŅŅ‚Ņ–ŅˆĐ¸Đš ĐŋŅ–Đ´Ņ…Ņ–Đ´ — виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа \`exclude\` Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ŅĐēŅ– ви ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐģŅŅ‚Đ¸. НаĐŋŅ€Đ¸ĐēĐģад: .PP .RS 4 # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–ĐŧĐĩĐŊĐĩĐŧ \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐēĐžŅ€ĐĩĐŊĐĩвиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ С Ņ–ĐŧĐĩĐŊĐĩĐŧ \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP ĐŸŅ€ĐžŅ‚Đ¸ĐģĐĩĐļĐŊиК ĐŋŅ–Đ´Ņ…Ņ–Đ´ — виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа \`include\`. НаĐŋŅ€Đ¸ĐēĐģад: .PP .RS 4 # ВĐēĐģŅŽŅ‡Đ°Ņ” ĐģĐ¸ŅˆĐĩ Đ´ĐĩŅĐēŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš ĐŋŅ–Đ´Ņ…Ņ–Đ´ — СĐŧŅ–ŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸Đģа \`exclude\` Ņ‚Đ° \`include\`. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ĐŋĐžŅ€ŅĐ´ĐžĐē ĐŋŅ€Đ°Đ˛Đ¸Đģ ваĐļĐģивиК. РаĐŊŅ–ŅˆŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŧĐ°ŅŽŅ‚ŅŒ ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ ĐŊад ĐŋŅ–ĐˇĐŊŅ–ŅˆĐ¸Đŧи. ДĐģŅ ҁĐŋŅ€ĐžŅ‰ĐĩĐŊĐŊŅ ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа \`exclude\`, а ĐŋĐžŅ‚Ņ–Đŧ ŅƒŅŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа \`include\`. НаĐŋŅ€Đ¸ĐēĐģад: .PP .RS 4 # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–ĐŧĐĩĐŊĐĩĐŧ \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ С Ņ–ĐŧĐĩĐŊĐĩĐŧ \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # ВĐēĐģŅŽŅ‡Đ°Ņ” ĐģĐ¸ŅˆĐĩ Đ´ĐĩŅĐēŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP ĐŖ ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ \-f, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ŅˆĐ°ĐąĐģĐžĐŊи \`include\`. НаĐŋŅ€Đ¸ĐēĐģад: .PP .RS 4 # ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи .mp3. .PD 0 .PP .PD # В Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐģаĐŋĐēи, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ .PD 0 .PP .PD # Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ ОйОĐģĐžĐŊĐēĐžŅŽ. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP В Unix, ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– ŅĐ¸ĐŧвОĐģŅ–Đ˛ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ в ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, ви ĐŋОвиĐŊĐŊŅ– Đ˛ĐˇŅŅ‚Đ¸ Ņ—Ņ… ҃ ĐģаĐŋĐēи, Ņ‰ĐžĐą СаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ Ņ—Ņ… Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅŽ ОйОĐģĐžĐŊĐēĐžŅŽ. .SH Đ†ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ (IGNORE FILE) На Đ´ĐžĐ´Đ°Ņ‚ĐžĐē Đ´Đž ĐŗĐģОйаĐģҌĐŊĐ¸Ņ… ĐŋŅ€Đ°Đ˛Đ¸Đģ ҃ Ņ„Đ°ĐšĐģŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€ĐžĐˇĐŧŅ–Ņ‰ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģи \`.snapraidignore\` в ĐąŅƒĐ´ŅŒ\-ŅĐēĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ĐŧĐ°ŅĐ¸Đ˛Ņƒ Đ´ĐģŅ виСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´Đĩ҆ĐĩĐŊŅ‚Ņ€Đ°ĐģŅ–ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋŅ€Đ°Đ˛Đ¸Đģ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. .PP ĐŸŅ€Đ°Đ˛Đ¸Đģа, виСĐŊĐ°Ņ‡ĐĩĐŊŅ– в \`.snapraidignore\`, ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐŋҖҁĐģŅ ĐŋŅ€Đ°Đ˛Đ¸Đģ ҃ Ņ„Đ°ĐšĐģŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—. ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž вОĐŊи ĐŧĐ°ŅŽŅ‚ŅŒ Đ˛Đ¸Ņ‰Đ¸Đš ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– Đ´ĐģŅ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐąŅƒĐģи вĐēĐģŅŽŅ‡ĐĩĐŊŅ– ĐŗĐģОйаĐģҌĐŊĐžŅŽ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ”ŅŽ. ФаĐēŅ‚Đ¸Ņ‡ĐŊĐž, ŅĐēŅ‰Đž ĐģĐžĐēаĐģҌĐŊĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ ĐŗĐģОйаĐģҌĐŊĐ¸Ņ… ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. .PP Đ›ĐžĐŗŅ–Đēа ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛ ҃ \`.snapraidignore\` ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŽŅ” ĐŗĐģОйаĐģҌĐŊ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŽ, аĐģĐĩ ĐŋŅ€Đ¸Đ˛\'ŅĐˇŅƒŅ” ŅˆĐ°ĐąĐģĐžĐŊи Đ´Đž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, в ŅĐēĐžĐŧ҃ СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ: .TP .B FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК Ņ„Đ°ĐšĐģ Ņ–Đˇ Ņ–Đŧ\'ŅĐŧ FILE ҃ Ņ†ŅŒĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– айО ĐŊиĐļ҇Đĩ. ĐĻĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” Ņ‚Đ¸Đŧ ŅĐ°ĐŧиĐŧ ĐŋŅ€Đ°Đ˛Đ¸ĐģаĐŧ ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊОвĐēи, Ņ‰Đž Ņ– в ĐŗĐģОйаĐģҌĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊŅ–. .TP .B DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ–Đˇ Ņ–Đŧ\'ŅĐŧ DIR Ņ‚Đ° вĐĩҁҌ ĐšĐžĐŗĐž вĐŧҖҁ҂, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ в Ņ†ŅŒĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– айО ĐŊиĐļ҇Đĩ. .TP .B /PATH/FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК Ņ„Đ°ĐšĐģ Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ \`.snapraidignore\`. .TP .B /PATH/DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ‚Đ° вĐĩҁҌ ĐšĐžĐŗĐž вĐŧҖҁ҂ Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ \`.snapraidignore\`. .PP На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ ĐŗĐģОйаĐģҌĐŊĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—, Ņ„Đ°ĐšĐģи \`.snapraidignore\` ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ; ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅˆĐ°ĐąĐģĐžĐŊи \`include\` айО СаĐŋĐĩŅ€Đĩ҇ĐĩĐŊĐŊŅ (!). .PP НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ҃ Đ˛Đ°Ņ Ņ” \`.snapraidignore\` ҃ \`/mnt/disk1/projects/\`: .PP .RS 4 # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐĸІЛĐŦКИ /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ–Đˇ ĐŊĐ°ĐˇĐ˛ĐžŅŽ \`build\` Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ\-ŅĐēиК .tmp Ņ„Đ°ĐšĐģ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– projects/ айО ĐšĐžĐŗĐž ĐŋŅ–Đ´ĐŋаĐŋĐžĐē .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH ВĐŧҖҁ҂ (CONTENT) SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ҁĐŋĐ¸ŅĐžĐē Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ– ҁ҃Đŧи Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ. .PP ĐĻĐĩ ĐąŅ–ĐŊĐ°Ņ€ĐŊиК Ņ„Đ°ĐšĐģ, ŅĐēиК ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ€Đ°ĐˇĐžĐŧ С ŅƒŅŅ–Đŧа ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊиĐŧи ҁ҃ĐŧаĐŧи Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ—Ņ… ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. .PP ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇŅ‡Đ¸Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ Ņ‚Đ° СаĐŋĐ¸ŅŅƒŅ”Ņ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`sync\` Ņ‚Đ° \`scrub\` Ņ‚Đ° ĐˇŅ‡Đ¸Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`fix\`, \`check\` Ņ‚Đ° \`status\`. .SH ĐŸĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ (PARITY) SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Đ°ŅˆĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ ҃ Ņ„Đ°ĐšĐģĐ°Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. .PP ĐĻĐĩ ĐąŅ–ĐŊĐ°Ņ€ĐŊŅ– Ņ„Đ°ĐšĐģи, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ŅƒŅŅ–Ņ… ĐąĐģĐžĐēŅ–Đ˛, виСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ… ҃ Ņ„Đ°ĐšĐģŅ– \`content\`. .PP ĐĻŅ– Ņ„Đ°ĐšĐģи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ Ņ‚Đ° СаĐŋĐ¸ŅŅƒŅŽŅ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`sync\` Ņ‚Đ° \`fix\` Ņ– ĐģĐ¸ŅˆĐĩ ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи \`scrub\` Ņ‚Đ° \`check\`. .SH ĐšĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ (ENCODING) SnapRAID в Unix Ņ–ĐŗĐŊĐžŅ€ŅƒŅ” ĐąŅƒĐ´ŅŒ\-ŅĐēĐĩ ĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ. Đ’Ņ–ĐŊ ĐˇŅ‡Đ¸Ņ‚ŅƒŅ” Ņ‚Đ° СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛ С Ņ‚Đ¸Đŧ ŅĐ°ĐŧиĐŧ ĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧĐžŅŽ. .PP ĐŖ Windows ŅƒŅŅ– Ņ–ĐŧĐĩĐŊа, ĐˇŅ‡Đ¸Ņ‚Đ°ĐŊŅ– С Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи, ĐēĐžĐŊвĐĩŅ€Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ Ņ‚Đ° ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– UTF\-8. .PP ЊОй Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļаĐģĐ¸ŅŅ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŋОвиĐŊĐŊŅ– Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐēĐžĐŊŅĐžĐģҌ Windows ҃ Ņ€ĐĩĐļиĐŧ UTF\-8 Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди \`chcp 65001\` Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅˆŅ€Đ¸Ņ„Ņ‚ TrueType, Ņ‚Đ°ĐēиК ŅĐē \`Lucida Console\`, ŅĐē ŅˆŅ€Đ¸Ņ„Ņ‚ ĐēĐžĐŊŅĐžĐģŅ–. ĐĻĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐģĐ¸ŅˆĐĩ ĐŊа ĐŊĐ°Đ´Ņ€ŅƒĐēОваĐŊŅ– Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛; ŅĐēŅ‰Đž ви ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģŅŅ”Ņ‚Đĩ Đ˛Đ¸Đ˛Ņ–Đ´ ĐēĐžĐŊŅĐžĐģŅ– ҃ Ņ„Đ°ĐšĐģ, ĐžŅ‚Ņ€Đ¸ĐŧаĐŊиК Ņ„Đ°ĐšĐģ СавĐļди ĐąŅƒĐ´Đĩ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– UTF\-8. .SH ĐĐ˛Ņ‚ĐžŅ€ŅŅŒĐēĐĩ ĐŋŅ€Đ°Đ˛Đž (COPYRIGHT) ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊиК Đ°Đ˛Ņ‚ĐžŅ€ŅŅŒĐēиĐŧ ĐŋŅ€Đ°Đ˛ĐžĐŧ (C) 2025 Andrea Mazzoleni .SH Див. Ņ‚Đ°ĐēĐžĐļ (SEE ALSO) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-uk.d000066400000000000000000003203461522717156100164170ustar00rootroot00000000000000Name{number} snapraid - SnapRAID Đ ĐĩСĐĩŅ€Đ˛ĐŊĐĩ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Đ¸Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņ–Đ˛ ĐšĐžŅ€ĐžŅ‚ĐēиК ĐžĐŋĐ¸Ņ :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] ОĐŋĐ¸Ņ SnapRAID — ҆Đĩ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, Ņ€ĐžĐˇŅ€ĐžĐąĐģĐĩĐŊа Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Đ¸Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņ–Đ˛, ŅĐēа СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… ҃ виĐŋадĐē҃ Đ˛Ņ–Đ´ĐŧОви Đ´Đž ҈ĐĩŅŅ‚Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛. В ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Đ´ĐžĐŧĐ°ŅˆĐŊŅ–Ņ… ĐŧĐĩĐ´Ņ–Đ°Ņ†ĐĩĐŊŅ‚Ņ€Ņ–Đ˛ С вĐĩĐģиĐēиĐŧи Ņ„Đ°ĐšĐģаĐŧи, Ņ‰Đž Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ, SnapRAID ĐŋŅ€ĐžĐŋĐžĐŊŅƒŅ” ĐēŅ–ĐģҌĐēа Ņ„ŅƒĐŊĐēŅ†Ņ–Đš: * Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи, вĐļĐĩ СаĐŋОвĐŊĐĩĐŊŅ– Ņ„Đ°ĐšĐģаĐŧи, ĐąĐĩС ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐžŅŅ‚Ņ– Ņ—Ņ… ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‡Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ĐŊĐ¸Ņ… ŅĐē ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš. * ĐŖŅŅ– Đ˛Đ°ŅˆŅ– даĐŊŅ– Ņ…ĐĩŅˆŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ– даĐŊĐ¸Ņ… Ņ‚Đ° СаĐŋĐžĐąŅ–ĐŗĐ°ĐŊĐŊŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐŊŅŽ. * КоĐģи ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Ņ–Đ´ĐŧОвиĐģи, ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ˛Ņ‚Ņ€Đ°Ņ‚Đ° даĐŊĐ¸Ņ… ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đ¸ŅĐēаĐŧи, Ņ‰Đž ĐŋĐžŅŅ‚Ņ€Đ°ĐļдаĐģи; даĐŊŅ– ĐŊа Ņ–ĐŊŅˆĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ… СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи. * Đ¯ĐēŅ‰Đž ви виĐŋадĐēОвО видаĐģиĐģи Ņ„Đ°ĐšĐģи ĐŊа Đ´Đ¸ŅĐē҃, ĐŧĐžĐļĐģивĐĩ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. * Đ”Đ¸ŅĐēи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŧĐ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€. * Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи в ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ. * SnapRAID ĐŊĐĩ ĐąĐģĐžĐēŅƒŅ” Đ˛Đ°ŅˆŅ– даĐŊŅ–; ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸ĐŋиĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ в ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ ĐąĐĩС ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐŊŅ даĐŊĐ¸Ņ…. * ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ„Đ°ĐšĐģ҃ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Ņ€ĐžĐˇĐēŅ€ŅƒŅ‚Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ОдиĐŊ Đ´Đ¸ŅĐē, Ņ‰Đž ĐˇĐ°ĐžŅ‰Đ°Đ´ĐļŅƒŅ” ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐĩĐŊĐĩŅ€ĐŗŅ–ŅŽ Ņ‚Đ° СĐŧĐĩĐŊŅˆŅƒŅ” ҈҃Đŧ. ДĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— Đ˛Ņ–Đ´Đ˛Ņ–Đ´Đ°ĐšŅ‚Đĩ ĐžŅ„Ņ–Ņ†Ņ–ĐšĐŊиК ŅĐ°ĐšŅ‚ SnapRAID: :https://www.snapraid.it/ ОбĐŧĐĩĐļĐĩĐŊĐŊŅ SnapRAID Ņ” ĐŗŅ–ĐąŅ€Đ¸Đ´ĐžĐŧ ĐŧŅ–Đļ RAID Ņ‚Đ° ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐžŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, ĐŋŅ€Đ°ĐŗĐŊŅƒŅ‡Đ¸ ĐŋĐžŅ”Đ´ĐŊĐ°Ņ‚Đ¸ ĐŊаКĐēŅ€Đ°Ņ‰Ņ– ĐŋĐĩŅ€ĐĩĐ˛Đ°ĐŗĐ¸ ĐžĐąĐžŅ…. ОдĐŊаĐē, Đ˛Ņ–ĐŊ ĐŧĐ°Ņ” Đ´ĐĩŅĐēŅ– ОйĐŧĐĩĐļĐĩĐŊĐŊŅ, ŅĐēŅ– ҁĐģŅ–Đ´ Đ˛Ņ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐĩŅ€ĐĩĐ´ ĐšĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ. ĐžŅĐŊОвĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰Đž ŅĐēŅ‰Đž Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ, а ви ĐŊĐĩŅ‰ĐžĐ´Đ°Đ˛ĐŊĐž ĐŊĐĩ виĐēĐžĐŊŅƒĐ˛Đ°Đģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ СĐŧĐžĐŗŅ‚Đ¸ ĐŋОвĐŊŅ–ŅŅ‚ŅŽ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ–. КоĐŊĐēŅ€ĐĩŅ‚ĐŊŅ–ŅˆĐĩ, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… ĐžĐąŅŅĐŗĐžĐŧ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… айО видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐĻĐĩ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž СĐŧŅ–ĐŊĐĩĐŊŅ– айО видаĐģĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ. ĐžŅŅŒ Ņ‡ĐžĐŧ҃ SnapRAID ĐēŅ€Đ°Ņ‰Đĩ ĐŋŅ–Đ´Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Đ´ĐģŅ даĐŊĐ¸Ņ…, ŅĐēŅ– Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. З Ņ–ĐŊŅˆĐžĐŗĐž йОĐē҃, Ņ‰ĐžĐšĐŊĐž дОдаĐŊŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐŋĐĩŅ€Đĩ҈ĐēОдĐļĐ°ŅŽŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅŽ вĐļĐĩ ҖҁĐŊŅƒŅŽŅ‡Đ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛. Ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ ĐģĐ¸ŅˆĐĩ ĐŊĐĩŅ‰ĐžĐ´Đ°Đ˛ĐŊĐž дОдаĐŊŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ‰Đž вОĐŊи СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ. ІĐŊŅˆŅ– ОйĐŧĐĩĐļĐĩĐŊĐŊŅ SnapRAID: * З SnapRAID ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ ҉Đĩ Ņ” ĐžĐēŅ€ĐĩĐŧŅ– Ņ„Đ°ĐšĐģĐžĐ˛Ņ– ŅĐ¸ŅŅ‚ĐĩĐŧи Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. З RAID ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ОдĐŊ҃ вĐĩĐģиĐē҃ Ņ„Đ°ĐšĐģĐžĐ˛Ņƒ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. * SnapRAID ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ҇ĐĩŅ€ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ (striping) даĐŊĐ¸Ņ…. З RAID ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ ĐˇĐ°Đ˛Đ´ŅĐēи ҇ĐĩŅ€ĐŗŅƒĐ˛Đ°ĐŊĐŊŅŽ. * SnapRAID ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ в Ņ€ĐĩаĐģҌĐŊĐžĐŧ҃ Ņ‡Đ°ŅŅ–. З RAID ваĐŧ ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋŅ€Đ¸ĐŋиĐŊŅŅ‚Đ¸ Ņ€ĐžĐąĐžŅ‚Ņƒ, ĐēĐžĐģи Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ. * SnapRAID ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŊОвĐģŅŽĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– ĐģĐ¸ŅˆĐĩ С ОйĐŧĐĩĐļĐĩĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ. З Ņ€ĐĩСĐĩŅ€Đ˛ĐŊиĐŧ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅĐŧ ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐŋҖҁĐģŅ ĐŋОвĐŊĐžŅ— Đ˛Ņ–Đ´ĐŧОви Đ˛ŅŅŒĐžĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. * ЗбĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‡Đ°ŅĐžĐ˛Ņ– ĐŧŅ–Ņ‚Đēи, ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– Ņ‚Đ° ĐļĐžŅ€ŅŅ‚ĐēŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ. ĐŸŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋ҃, вĐģĐ°ŅĐŊŅ–ŅŅ‚ŅŒ Ņ‚Đ° Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐŊĐĩ СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. ĐŸĐžŅ‡Đ°Ņ‚ĐžĐē Ņ€ĐžĐąĐžŅ‚Đ¸ ЊОй виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ SnapRAID, ҁĐŋĐĩŅ€ŅˆŅƒ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ОдиĐŊ Đ´Đ¸ŅĐē ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ‰ĐžĐą ĐŋŅ€Đ¸ŅĐ˛ŅŅ‚Đ¸Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— `ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–`. З ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ви СĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŧОви ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID5. Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Ņ–Đ´ĐŧОвиĐģи, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID6, ви ĐŋОвиĐŊĐŊŅ– ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐļĐĩĐŊ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК Đ´Đ¸ŅĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– дОСвОĐģŅŅ” Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŧОви ҉Đĩ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ¯Đē Đ´Đ¸ŅĐēи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ви ĐŋОвиĐŊĐŊŅ– Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆŅ– Đ´Đ¸ŅĐēи в ĐŧĐ°ŅĐ¸Đ˛Ņ–, ĐžŅĐēŅ–ĐģҌĐēи Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŧĐžĐļĐĩ ĐˇŅ€ĐžŅŅ‚Đ¸ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ĐĻŅ– Đ´Đ¸ŅĐēи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋŅ€Đ¸ŅĐ˛ŅŅ‡ĐĩĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅŽ Ņ„Đ°ĐšĐģŅ–Đ˛ `ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–`. Ви ĐŊĐĩ ĐŋОвиĐŊĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ĐŊа ĐŊĐ¸Ņ… ŅĐ˛ĐžŅ— даĐŊŅ–. ĐŸĐžŅ‚Ņ–Đŧ ви ĐŋОвиĐŊĐŊŅ– виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Đ´Đ¸ŅĐēи `даĐŊĐ¸Ņ…`, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ SnapRAID. Đ—Đ°Ņ…Đ¸ŅŅ‚ Ņ” ĐąŅ–ĐģҌ҈ ĐĩŅ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊиĐŧ, ŅĐēŅ‰Đž ҆Җ Đ´Đ¸ŅĐēи ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ даĐŊŅ–, Ņ‰Đž Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. З ҆ҖҔҗ ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊи ĐēŅ€Đ°Ņ‰Đĩ НЕ вĐēĐģŅŽŅ‡Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐē Windows C:\ айО ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Unix /home, /var Ņ‚Đ° /tmp. ĐĄĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģŅ–Đ˛ СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ ҃ Ņ„Đ°ĐšĐģĐ°Ņ… `content` (вĐŧҖҁ҂), ŅĐēŅ– ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ…, ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°ĐģҌĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ Đ´ĐĩŅ‚Đ°ĐģŅ– Đ˛Đ°ŅˆĐžŅ— Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžŅ— ĐēĐžĐŋŅ–Ņ—, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Đ˛ŅŅ– ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ– ҁ҃Đŧи Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ—Ņ— ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ФаКĐģ `content` СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ в ĐēŅ–ĐģҌĐēĐžŅ… ĐēĐžĐŋŅ–ŅŅ…, Ņ– ĐēĐžĐļĐŊа ĐēĐžĐŋŅ–Ņ ĐŋОвиĐŊĐŊа ĐąŅƒŅ‚Đ¸ ĐŊа ĐžĐēŅ€ĐĩĐŧĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰ĐžĐą ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸, Ņ‰Đž ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ҃ Ņ€Đ°ĐˇŅ– Đ˛Ņ–Đ´ĐŧОви ĐēŅ–ĐģҌĐēĐžŅ… Đ´Đ¸ŅĐēŅ–Đ˛, ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊа ĐēĐžĐŋŅ–Ņ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа. НаĐŋŅ€Đ¸ĐēĐģад, ĐŋŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸ĐŧĐž, Đ˛Đ°Ņ ҆ҖĐēĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, а Đ˛Đ°ŅˆŅ– Đ´Đ¸ŅĐēи Ņ€ĐžĐˇŅ‚Đ°ŅˆĐžĐ˛Đ°ĐŊŅ– Са Đ°Đ´Ņ€ĐĩŅĐ°Đŧи: :/mnt/diskp <- Đ˛Đ¸ĐąŅ€Đ°ĐŊиК Đ´Đ¸ŅĐē Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– :/mnt/disk1 <- ĐŋĐĩŅ€ŅˆĐ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ :/mnt/disk2 <- Đ´Ņ€ŅƒĐŗĐ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ :/mnt/disk3 <- ҂ҀĐĩŅ‚Ņ–Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ Ви ĐŋОвиĐŊĐŊŅ– ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ /etc/snapraid.conf С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиĐŧи ĐžĐŋŅ†Ņ–ŅĐŧи: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ Đ¯ĐēŅ‰Đž ви ĐŋŅ€Đ°Ņ†ŅŽŅ”Ņ‚Đĩ в Windows, ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ҈ĐģŅŅ…Ņƒ Windows, С ĐģŅ–Ņ‚ĐĩŅ€Đ°Đŧи Đ´Đ¸ŅĐēŅ–Đ˛ Ņ‚Đ° ĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐŧи ҁĐēҖҁĐŊиĐŧи Ņ€Đ¸ŅĐēаĐŧи СаĐŧŅ–ŅŅ‚ŅŒ ĐŋŅ€ŅĐŧĐ¸Ņ…. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐąĐ°ĐŗĐ°Ņ‚Đž Đ´Đ¸ŅĐēŅ–Đ˛ Ņ– СаĐēŅ–ĐŊŅ‡Đ¸ĐģĐ¸ŅŅ ĐģŅ–Ņ‚ĐĩŅ€Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ вĐēĐģадĐĩĐŊŅ– ĐŋаĐŋĐēи. Див: :https://www.google.com/search?q=Windows+mount+point На Ņ†ŅŒĐžĐŧ҃ ĐĩŅ‚Đ°ĐŋŅ– ви ĐŗĐžŅ‚ĐžĐ˛Ņ– СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync` Đ´ĐģŅ ĐŋĐžĐąŅƒĐ´ĐžĐ˛Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. :snapraid sync ĐĻĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ ĐŧĐžĐļĐĩ СаКĐŊŅŅ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŗĐžĐ´Đ¸ĐŊ вĐŋĐĩŅ€ŅˆĐĩ, СаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ даĐŊĐ¸Ņ…, ŅĐēŅ– вĐļĐĩ Ņ” ĐŊа Đ´Đ¸ŅĐēĐ°Ņ…. Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐēи ĐŋĐžŅ€ĐžĐļĐŊŅ–, ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ ĐŧĐ¸Ņ‚Ņ‚Ņ”Đ˛Đž. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž в ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ Ctrl+C, Ņ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž СаĐŋ҃ҁĐē҃ Đ˛Ņ–ĐŊ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Ņƒ С ĐŧŅ–ŅŅ†Ņ, Đ´Đĩ ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊиК. КоĐģи Ņ†Ņ ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒŅŅ, Đ˛Đ°ŅˆŅ– даĐŊŅ– БЕЗПЕЧНІ. ĐĸĐĩĐŋĐĩŅ€ ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅ‡Đ°Ņ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅĐ˛Ņ–Đš ĐŧĐ°ŅĐ¸Đ˛ ŅĐē ваĐŧ ĐŋĐžĐ´ĐžĐąĐ°Ņ”Ņ‚ŅŒŅŅ Ņ– ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐžĐŊОвĐģŅŽĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, СаĐŋ҃ҁĐēĐ°ŅŽŅ‡Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ (Scrubbing) ЊОй ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ даĐŊŅ– Ņ‚Đ° ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊа ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋĐžĐŧиĐģĐžĐē, ви ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub`. :snapraid scrub ĐĻŅ ĐēĐžĐŧаĐŊда ĐŋĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” даĐŊŅ– ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– С Ņ…Đĩ҈ĐĩĐŧ, ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊиĐŧ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐēĐžĐŧаĐŊди `sync`, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. КоĐļĐĩĐŊ СаĐŋ҃ҁĐē ĐēĐžĐŧаĐŊди ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 8% ĐŧĐ°ŅĐ¸Đ˛Ņƒ, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ даĐŊŅ–, ŅĐēŅ– вĐļĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Ņ… 10 Đ´ĐŊŅ–Đ˛. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -p, --plan, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–ĐŊ҈҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ, Ņ– ĐžĐŋŅ†Ņ–ŅŽ -o, --older-than, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Đ˛Ņ–Đē ҃ Đ´ĐŊŅŅ…. НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ 5% ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŊа ĐąĐģĐžĐēи ŅŅ‚Đ°Ņ€ŅˆŅ– Са 20 Đ´ĐŊŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ: :snapraid -p 5 -o 20 scrub Đ¯ĐēŅ‰Đž ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– `content` Ņ– ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҃ ĐēĐžĐŧаĐŊĐ´Ņ– `status`. :snapraid status ЊОй Ņ—Ņ… виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`, ҄ҖĐģŅŒŅ‚Ņ€ŅƒŅŽŅ‡Đ¸ ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -e, --filter-error: :snapraid -e fix ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž `scrub` ĐŋĐžĐŧиĐģĐēи СĐŊиĐēĐŊŅƒŅ‚ŅŒ ĐˇŅ– ĐˇĐ˛Ņ–Ņ‚Ņƒ `status`, ŅĐēŅ‰Đž вОĐŊи ҁĐŋŅ€Đ°Đ˛Đ´Ņ– виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–. ЊОй ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ ҆Đĩ ŅˆĐ˛Đ¸Đ´ŅˆĐĩ, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ -p bad, Ņ‰ĐžĐą ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. :snapraid -p bad scrub ЗаĐŋ҃ҁĐē `scrub` ĐŊа ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐŧĐžĐļĐĩ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚Đ¸ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐēи, ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊŅ– видаĐģĐĩĐŊиĐŧи айО СĐŧŅ–ĐŊĐĩĐŊиĐŧи Ņ„Đ°ĐšĐģаĐŧи. ĐĻŅ– ĐŋĐžĐŧиĐģĐēи Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ ҃ вивĐĩĐ´ĐĩĐŊĐŊŅ– `scrub`, аĐģĐĩ ĐŋОв'ŅĐˇĐ°ĐŊŅ– ĐąĐģĐžĐēи ĐŊĐĩ ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. Об'Ņ”Đ´ĐŊаĐŊĐŊŅ (Pooling) ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа: Đ¤ŅƒĐŊĐēŅ†Ņ–Ņ Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ, ĐžĐŋĐ¸ŅĐ°ĐŊа ĐŊиĐļ҇Đĩ, ĐąŅƒĐģа СаĐŧŅ–ĐŊĐĩĐŊа Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ĐžĐŧ mergerfs, ŅĐēиК Ņ‚ĐĩĐŋĐĩŅ€ Ņ” Ņ€ĐĩĐēĐžĐŧĐĩĐŊдОваĐŊĐžŅŽ ĐžĐŋŅ†Ņ–Ņ”ŅŽ Đ´ĐģŅ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ Linux ҃ ҁĐŋŅ–ĐģҌĐŊĐžŅ‚Ņ– SnapRAID. Mergefs СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐąŅ–ĐģҌ҈ ĐŗĐŊŅƒŅ‡ĐēиК Ņ‚Đ° ĐĩŅ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊиК ҁĐŋĐžŅŅ–Đą Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… Đ´Đ¸ŅĐēŅ–Đ˛ в Ņ”Đ´Đ¸ĐŊ҃ ҃ĐŊҖ҄ҖĐēОваĐŊ҃ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, дОСвОĐģŅŅŽŅ‡Đ¸ ĐąĐĩСĐŋĐĩŅ€Đĩ҈ĐēОдĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐąĐĩС виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ. Đ’Ņ–ĐŊ Đ´ĐžĐąŅ€Đĩ Ņ–ĐŊŅ‚ĐĩĐŗŅ€ŅƒŅ”Ņ‚ŅŒŅŅ С SnapRAID Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ– ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ…, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē OpenMediaVault (OMV) айО ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēĐ¸Ņ… ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŅ… NAS. ЊОй Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ Đ˛ŅŅ– Ņ„Đ°ĐšĐģи ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– в ОдĐŊĐžĐŧ҃ Đ´ĐĩŅ€ĐĩĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ `pooling` (Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ). ВоĐŊа ŅŅ‚Đ˛ĐžŅ€ŅŽŅ” Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `pooling` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: :pool /pool айО, ŅĐēŅ‰Đž ви ĐŋŅ€Đ°Ņ†ŅŽŅ”Ņ‚Đĩ в Windows, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: :pool C:\pool а ĐŋĐžŅ‚Ņ–Đŧ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `pool` Đ´ĐģŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ айО ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ. :snapraid pool Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧ҃ Unix Ņ– Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Ņ†ŅŒĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃ Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊ Windows айО Unix, ви ĐŋОвиĐŊĐŊŅ– Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ Đ´Đž Đ˛Đ°ŅˆĐžĐŗĐž /etc/samba/smb.conf: :# ĐŖ ĐŗĐģОйаĐģҌĐŊĐžĐŧ҃ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– smb.conf :unix extensions = no :# ĐŖ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes ĐŖ Windows ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃ виĐŧĐ°ĐŗĐ°Ņ” Đ˛Ņ–Đ´ ĐēĐģŅ–Ņ”ĐŊŅ‚Ņ–Đ˛ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐžĐŗĐž Ņ—Ņ… Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊаваĐŊĐŊŅ. ЊОй ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ҆Đĩ, ĐžĐēҀҖĐŧ ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool, ви Ņ‚Đ°ĐēĐžĐļ ĐŋОвиĐŊĐŊŅ– ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ĐŊĐĩСаĐģĐĩĐļĐŊĐž, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ–ĐŧĐĩĐŊа Đ´Đ¸ŅĐēŅ–Đ˛, виСĐŊĐ°Ņ‡ĐĩĐŊŅ– ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–, ŅĐē Ņ‚ĐžŅ‡Đēи ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃. Ви Ņ‚Đ°ĐēĐžĐļ ĐŋОвиĐŊĐŊŅ– вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ҃ ĐžĐŋ҆Җҗ `share` ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ ҈ĐģŅŅ… Windows UNC, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиĐŧ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°Đŧ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ†Đ¸Ņ… ҁĐŋŅ–ĐģҌĐŊĐ¸Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. НаĐŋŅ€Đ¸ĐēĐģад, ĐŋŅ€Đ°Ņ†ŅŽŅŽŅ‡Đ¸ С ҁĐĩŅ€Đ˛ĐĩŅ€Đ° С Ņ–ĐŧĐĩĐŊĐĩĐŧ `darkstar`, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋ҆Җҗ: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar Ņ– ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array Ņ‰ĐžĐą дОСвОĐģĐ¸Ņ‚Đ¸ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиĐŧ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°Đŧ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ \\darkstar\pool. ВаĐŧ Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊŅ– ĐēĐģŅ–Ņ”ĐŊŅ‚Đ¸, Ņ‰ĐžĐą ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Đ’Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ (Undeleting) SnapRAID Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊŅƒŅ” ĐąŅ–ĐģҌ҈Đĩ ŅĐē ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, ĐŊŅ–Đļ ŅĐ¸ŅŅ‚ĐĩĐŧа RAID, Ņ– ĐšĐžĐŗĐž ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ айО ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ Đ´Đž Ņ—Ņ… ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ŅŅ‚Đ°ĐŊ҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -f, --filter: :snapraid fix -f FILE айО Đ´ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ: :snapraid fix -f DIR/ Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ виĐŋадĐēОвО видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ҁĐĩŅ€ĐĩдиĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -m, --filter-missing, ŅĐēа Đ˛Ņ–Đ´ĐŊОвĐģŅŽŅ” ĐģĐ¸ŅˆĐĩ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– Ņ„Đ°ĐšĐģи, СаĐģĐ¸ŅˆĐ°ŅŽŅ‡Đ¸ Đ˛ŅŅ– Ņ–ĐŊŅˆŅ– ĐŊĐĩĐ´ĐžŅ‚ĐžŅ€ĐēаĐŊиĐŧи. :snapraid fix -m -f DIR/ АйО Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ… Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: :snapraid fix -m Đ’Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ (Recovering) ĐĄŅ‚Đ°ĐģĐžŅŅ ĐŊĐ°ĐšĐŗŅ–Ņ€ŅˆĐĩ, Ņ– ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Đģи ОдиĐŊ айО ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛! НЕ ĐŸĐĐĐ†ĐšĐŖĐ™ĐĸЕ! Ви СĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ… Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸! ПĐĩŅ€ŅˆĐĩ, Ņ‰Đž ви ĐŋОвиĐŊĐŊŅ– ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸, ҆Đĩ ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋОдаĐģŅŒŅˆĐ¸Ņ… СĐŧŅ–ĐŊ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊŅ– ĐŋŅ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Đ´Đž ĐŊŅŒĐžĐŗĐž Ņ‚Đ° ĐąŅƒĐ´ŅŒ-ŅĐēŅ– СаĐŋĐģаĐŊОваĐŊŅ– ĐŋŅ€ĐžŅ†ĐĩŅĐ¸, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐē҃ СаĐŋĐģаĐŊОваĐŊ҃ ĐŊҖ҇ĐŊ҃ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ айО ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ SnapRAID. ĐŸĐžŅ‚Ņ–Đŧ виĐēĐžĐŊĐ°ĐšŅ‚Đĩ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐēŅ€ĐžĐēи. КРОК 1 -> ПĐĩŅ€ĐĩĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Đ´ĐĩŅĐēиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, в Ņ–Đ´ĐĩаĐģŅ– ĐŊа Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ°ŅĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…, аĐģĐĩ СОвĐŊŅ–ŅˆĐŊŅ–Đš USB-Đ´Đ¸ŅĐē айО Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиК Đ´Đ¸ŅĐē ĐŋŅ–Đ´Ņ–ĐšĐ´Đĩ. ЗĐŧŅ–ĐŊŅ–Ņ‚ŅŒ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ SnapRAID, Ņ‰ĐžĐą ĐžĐŋŅ†Ņ–Ņ `data` айО `parity` Đ´Đ¸ŅĐēа, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ, вĐēĐ°ĐˇŅƒĐ˛Đ°Đģа ĐŊа ĐŧҖҁ҆Đĩ Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ С Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅŽ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž Đ´Đ¸ŅĐē `d1` Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ, СĐŧŅ–ĐŊŅ–Ņ‚ŅŒ С: :data d1 /mnt/disk1/ ĐŊа: :data d1 /mnt/new_spare_disk/ Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐē, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, Ņ” Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊ҃ ĐžĐŋŅ†Ņ–ŅŽ `parity`. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ, ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ŅƒŅŅ– Ņ—Ņ…ĐŊŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊŅ– ĐžĐŋ҆Җҗ. КРОК 2 -> ВиĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ (Fix) ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ fix, СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‡Đ¸ ĐļŅƒŅ€ĐŊаĐģ ҃ СОвĐŊŅ–ŅˆĐŊŅŒĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: :snapraid -d NAME -l fix.log fix ДĐĩ NAME — ҆Đĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐēĐģад `d1` ҃ ĐŊĐ°ŅˆĐžĐŧ҃ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–. Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐē, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, Ņ” Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ–ĐŧĐĩĐŊа `parity`, `2-parity`, Ņ‚ĐžŅ‰Đž. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš -d, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ—Ņ… ŅƒŅŅ–. ĐĻŅ ĐēĐžĐŧаĐŊда СаКĐŧĐĩ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ‡Đ°ŅŅƒ. ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž ҃ Đ˛Đ°Ņ Ņ” ĐēŅ–ĐģҌĐēа ĐŗŅ–ĐŗĐ°ĐąĐ°ĐšŅ‚ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ fix.log. ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Ņ—Ņ— С Đ´Đ¸ŅĐēа С Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅŽ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. ĐĸĐĩĐŋĐĩŅ€ ви Đ˛Ņ–Đ´ĐŊОвиĐģи Đ˛ŅĐĩ, Ņ‰Đž ĐŧĐžĐļĐŊа Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸. Đ¯ĐēŅ‰Đž Đ´ĐĩŅĐēŅ– Ņ„Đ°ĐšĐģи Ņ‡Đ°ŅŅ‚ĐēОвО айО ĐŋОвĐŊŅ–ŅŅ‚ŅŽ ĐŊĐĩĐŧĐžĐļĐģивО Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊŅ– С дОдаваĐŊĐŊŅĐŧ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ `.unrecoverable`. Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŊĐ°ĐšŅ‚Đ¸ Đ´ĐĩŅ‚Đ°ĐģҌĐŊиК ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… ĐŊĐĩĐ˛Ņ–Đ´ĐŊОвĐģŅŽĐ˛Đ°ĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛ ҃ Ņ„Đ°ĐšĐģŅ– fix.log, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Đ˛ŅˆĐ¸ Đ˛ŅŅ– Ņ€ŅĐ´Đēи, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŒŅŅ С `unrecoverable:`. Đ¯ĐēŅ‰Đž ви ĐŊĐĩ СадОвОĐģĐĩĐŊŅ– Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅĐŧ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ ĐšĐžĐŗĐž ҁ҂ҖĐģҌĐēи Ņ€Đ°ĐˇŅ–Đ˛, ҁĐēŅ–ĐģҌĐēи СайаĐļĐ°Ņ”Ņ‚Đĩ. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ви видаĐģиĐģи Ņ„Đ°ĐšĐģи С ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŋҖҁĐģŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`, ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ‚ĐžĐŗĐž, Ņ‰Đž Đ´ĐĩŅĐēŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊŅ–. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ `fix`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -i, --import, вĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸, Đ´Đĩ ҆Җ Ņ„Đ°ĐšĐģи СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐˇĐ°Ņ€Đ°Đˇ, Ņ‰ĐžĐą СĐŊĐžĐ˛Ņƒ вĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ Ņ—Ņ… ҃ ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. Đ¯ĐēŅ‰Đž ви СадОвОĐģĐĩĐŊŅ– Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅĐŧ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸, аĐģĐĩ ĐˇĐ°ŅƒĐ˛Đ°ĐļŅ‚Đĩ, Ņ‰Đž ĐŋҖҁĐģŅ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ СĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`! КРОК 3 -> ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа (Check) Đ¯Đē ОйĐĩŅ€ĐĩĐļĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ‚ĐĩĐŋĐĩŅ€ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `check`, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž ĐŊа Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž. :snapraid -d NAME -a check ДĐĩ NAME — ҆Đĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐēĐģад `d1` ҃ ĐŊĐ°ŅˆĐžĐŧ҃ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–. ОĐŋ҆Җҗ -d Ņ‚Đ° -a вĐēĐ°ĐˇŅƒŅŽŅ‚ŅŒ SnapRAID ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ ĐģĐ¸ŅˆĐĩ вĐēаСаĐŊиК Đ´Đ¸ŅĐē Ņ‚Đ° Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐēĐžĐŧаĐŊда СаКĐŧĐĩ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ‡Đ°ŅŅƒ, аĐģĐĩ ŅĐēŅ‰Đž ви ĐŊĐĩ ĐŊĐ°Đ´Ņ‚Đž ОйĐĩŅ€ĐĩĐļĐŊŅ–, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ— ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸. КРОК 4 -> ХиĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ (Sync) ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`, Ņ‰ĐžĐą ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐ°ŅĐ¸Đ˛ С ĐŊОвиĐŧ Đ´Đ¸ŅĐēĐžĐŧ. :snapraid sync Đ¯ĐēŅ‰Đž Đ˛ŅĐĩ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐž, Ņ†Ņ ĐēĐžĐŧаĐŊда виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŧĐ¸Ņ‚Ņ‚Ņ”Đ˛Đž. КоĐŧаĐŊди SnapRAID ĐŊĐ°Đ´Đ°Ņ” ĐēŅ–ĐģҌĐēа ĐŋŅ€ĐžŅŅ‚Đ¸Ņ… ĐēĐžĐŧаĐŊĐ´, ŅĐēŅ– дОСвОĐģŅŅŽŅ‚ŅŒ: * ВивĐĩŅŅ‚Đ¸ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŧĐ°ŅĐ¸Đ˛Ņƒ -> `status` * КĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēаĐŧи -> `smart`, `probe`, `up`, `down` * ĐĄŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ ĐēĐžĐŋŅ–ŅŽ/СĐŊŅ–ĐŧĐžĐē -> `sync` * ПĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ даĐŊŅ– -> `scrub` * Đ’Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐžŅŅ‚Đ°ĐŊĐŊŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ ĐēĐžĐŋŅ–ŅŽ/СĐŊŅ–ĐŧĐžĐē -> `fix`. КоĐŧаĐŊди ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ ĐŊаĐŋĐ¸ŅĐ°ĐŊŅ– ĐŧаĐģиĐŧи ĐģŅ–Ņ‚ĐĩŅ€Đ°Đŧи. status Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ СвĐĩĐ´ĐĩĐŊĐŊŅ ŅŅ‚Đ°ĐŊ҃ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ВĐēĐģŅŽŅ‡Đ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋŅ€Đž Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ˛Ņ–Đē ĐąĐģĐžĐēŅ–Đ˛ ĐąĐĩС ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° Đ˛ŅŅ– СаĐŋĐ¸ŅĐ°ĐŊŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи, Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. ĐŸŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ŅŅ‚ĐžŅŅƒŅ”Ņ‚ŅŒŅŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžĐŗĐž Ņ‡Đ°ŅŅƒ, ĐēĐžĐģи ви СаĐŋŅƒŅŅ‚Đ¸Đģи `sync`. ĐŸŅ–ĐˇĐŊŅ–ŅˆŅ– ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŊĐĩ Đ˛Ņ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Ņ—Ņ…ĐŊŅ– ĐŊĐžĐŧĐĩŅ€Đ¸ ĐąĐģĐžĐēŅ–Đ˛. ЊОй Ņ—Ņ… виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix -e`. ĐĸаĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐŗŅ€Đ°Ņ„Ņ–Đē, Ņ‰Đž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ” ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš Ņ‡Đ°Ņ, ĐēĐžĐģи ĐēĐžĐļĐĩĐŊ ĐąĐģĐžĐē ĐąŅƒĐ˛ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊиК айО ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊиК. ĐĄĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐ¸ĐŧвОĐģĐžĐŧ `*`, ĐąĐģĐžĐēи, ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ–, аĐģĐĩ ҉Đĩ ĐŊĐĩ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, - `o`. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. smart Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐˇĐ˛Ņ–Ņ‚ SMART ŅƒŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ҃ ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. ВĐēĐģŅŽŅ‡Đ°Ņ” ĐžŅ†Ņ–ĐŊĐē҃ ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ĐŧОви ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž Ņ€ĐžĐē҃, дОСвОĐģŅŅŽŅ‡Đ¸ ваĐŧ ĐŋĐģаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐģаĐŊĐžĐ˛Ņƒ СаĐŧŅ–ĐŊ҃ Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒ ĐŋŅ–Đ´ĐžĐˇŅ€Ņ–ĐģŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸. ĐĻŅ ĐžŅ†Ņ–ĐŊĐēа ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– ĐžŅ‚Ņ€Đ¸ĐŧаĐŊа ҈ĐģŅŅ…ĐžĐŧ ĐēĐžŅ€ĐĩĐģŅŅ†Ņ–Ņ— Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛ SMART Đ´Đ¸ŅĐēŅ–Đ˛ С даĐŊиĐŧи Backblaze, Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ: :https://www.backblaze.com/hard-drive-test-data.html Đ¯ĐēŅ‰Đž SMART ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”, Ņ‰Đž Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ, Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž Đ´Đ¸ŅĐēа Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒŅŅ `FAIL` айО `PREFAIL`, Ņ– SnapRAID ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ĐŋĐžĐŧиĐģĐē҃. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐĩĐŗĐ°ĐšĐŊа СаĐŧŅ–ĐŊа Đ´Đ¸ŅĐēа. ІĐŊŅˆŅ– ĐŧĐžĐļĐģĐ¸Đ˛Ņ– Ņ€ŅĐ´Đēи ŅŅ‚Đ°ĐŊ҃: logfail - ĐŖ ĐŧиĐŊ҃ĐģĐžĐŧ҃ Đ´ĐĩŅĐēŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐąŅƒĐģи ĐŊиĐļŅ‡Đ¸Đŧи Са ĐŋĐžŅ€Ņ–Đŗ. logerr - Đ–ŅƒŅ€ĐŊаĐģ ĐŋĐžĐŧиĐģĐžĐē ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐžĐŧиĐģĐēи. selferr - Đ–ŅƒŅ€ĐŊаĐģ ŅĐ°ĐŧĐžŅ‚ĐĩŅŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐžĐŧиĐģĐēи. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ĐžĐŋŅ†Ņ–ŅŽ -v, --verbose, ĐŊĐ°Đ´Đ°Ņ”Ņ‚ŅŒŅŅ ĐŗĐģĐ¸ĐąŅˆĐ¸Đš ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Ņ‡ĐŊиК аĐŊаĐģŅ–Đˇ. ĐĻĐĩĐš аĐŊаĐģŅ–Đˇ ĐŧĐžĐļĐĩ Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸ ваĐŧ Đ˛Đ¸Ņ€Ņ–ŅˆĐ¸Ņ‚Đ¸, Ņ‡Đ¸ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ваĐŧ ĐąŅ–ĐģŅŒŅˆĐ° айО ĐŧĐĩĐŊŅˆĐ° ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -a` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. Đ¯ĐēŅ‰Đž Đ˛Đ°ŅˆŅ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ— ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐē҃ ĐēĐžĐŧаĐŊĐ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ `smartctl` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. probe Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ŅŅ‚Đ°ĐŊ Đ–Đ˜Đ’Đ›Đ•ĐĐĐ¯ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ҃ ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. `Standby` ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´Đ¸ŅĐē ĐŊĐĩ ОйĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ. `Active` ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´Đ¸ŅĐē ОйĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ. ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -n standby -i` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. Đ¯ĐēŅ‰Đž Đ˛Đ°ŅˆŅ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ— ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐē҃ ĐēĐžĐŧаĐŊĐ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ `smartctl` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. up РОСĐēŅ€ŅƒŅ‡ŅƒŅ” Đ˛ŅŅ– Đ´Đ¸ŅĐēи ĐŧĐ°ŅĐ¸Đ˛Ņƒ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€ĐžĐˇĐēŅ€ŅƒŅ‚Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐĩвĐŊŅ– Đ´Đ¸ŅĐēи, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -d, --filter-disk. ОдĐŊĐžŅ‡Đ°ŅĐŊĐĩ Ņ€ĐžĐˇĐēŅ€ŅƒŅ‡ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ виĐŧĐ°ĐŗĐ°Ņ” ĐąĐ°ĐŗĐ°Ņ‚Đž ĐĩĐŊĐĩŅ€ĐŗŅ–Ņ—. ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž Đ˛Đ°Ņˆ ĐąĐģĐžĐē ĐļивĐģĐĩĐŊĐŊŅ ĐŧĐžĐļĐĩ ҆Đĩ Đ˛Đ¸Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. down Đ—ŅƒĐŋиĐŊŅŅ” Đ˛ŅŅ– Đ´Đ¸ŅĐēи ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -s standby,now` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐĩвĐŊŅ– Đ´Đ¸ŅĐēи, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -d, --filter-disk. ДĐģŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ— ĐˇŅƒĐŋиĐŊĐēи ĐŋŅ€Đ¸ ĐŋĐžĐŧиĐģ҆Җ ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -s, --spin-down-on-error С ĐąŅƒĐ´ŅŒ-ŅĐēĐžŅŽ Ņ–ĐŊŅˆĐžŅŽ ĐēĐžĐŧаĐŊĐ´ĐžŅŽ, Ņ‰Đž ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊĐž Ņ€ŅƒŅ‡ĐŊĐžĐŧ҃ СаĐŋ҃ҁĐē҃ `down` ĐŋŅ€Đ¸ виĐŊиĐēĐŊĐĩĐŊĐŊŅ– ĐŋĐžĐŧиĐģĐēи. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. diff Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`, Đ´ĐģŅ ŅĐēĐ¸Ņ… ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐēĐžĐŧаĐŊда ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” даĐŊŅ– Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐģĐ¸ŅˆĐĩ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ Ņ„Đ°ĐšĐģ҃, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° inode. ĐŸŅ–ŅĐģŅ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ”Ņ‚ŅŒŅŅ СвĐĩĐ´ĐĩĐŊĐŊŅ СĐŧŅ–ĐŊ, ĐˇĐŗŅ€ŅƒĐŋОваĐŊĐĩ Са: equal (Ņ€Ņ–Đ˛ĐŊŅ–) - ФаКĐģи, ĐŊĐĩСĐŧŅ–ĐŊĐĩĐŊŅ– С ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ŅŅ‚Đ°ĐŊ҃. added (дОдаĐŊŅ–) - ФаКĐģи, дОдаĐŊŅ–, ŅĐēĐ¸Ņ… ĐŊĐĩ ĐąŅƒĐģĐž Ņ€Đ°ĐŊŅ–ŅˆĐĩ. removed (видаĐģĐĩĐŊŅ–) - ФаКĐģи, видаĐģĐĩĐŊŅ–. updated (ĐžĐŊОвĐģĐĩĐŊŅ–) - ФаКĐģи С Ņ–ĐŊŅˆĐ¸Đŧ Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ айО Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž вОĐŊи ĐąŅƒĐģи СĐŧŅ–ĐŊĐĩĐŊŅ–. moved (ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ–) - ФаКĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– в Ņ–ĐŊŅˆĐ¸Đš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са Ņ‚Đ¸Đŧ ĐļĐĩ Ņ–ĐŧĐĩĐŊĐĩĐŧ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ, Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‚Đ° inode, аĐģĐĩ Ņ–ĐŊŅˆĐ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐŧ. copied - Ņ„Đ°ĐšĐģи, ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– ĐŊа Ņ‚ĐžĐš ŅĐ°ĐŧиК айО Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, Đ´Đĩ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊиК Ņ„Đ°ĐšĐģ Đ˛ŅĐĩ ҉Đĩ ҖҁĐŊŅƒŅ”. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ОдĐŊаĐēĐžĐ˛ĐžŅŽ ĐŊĐ°ĐˇĐ˛ĐžŅŽ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‡Đ°ŅŅƒ. Đ¯ĐēŅ‰Đž ĐŧŅ–Ņ‚Đēа Ņ‡Đ°ŅŅƒ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Ņ‡Đ°ŅŅ‚ĐžĐē ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŧĐ°Ņ” ĐˇĐąŅ–ĐŗĐ°Ņ‚Đ¸ŅŅ ĐŋОвĐŊиК ҈ĐģŅŅ…, а ĐŊĐĩ ĐģĐ¸ŅˆĐĩ ĐŊаСва. relocated - Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– ĐŊа Ņ‚ĐžĐš ŅĐ°ĐŧиК айО Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, Đ´Đĩ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģ СĐŊиĐē. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ОдĐŊаĐēĐžĐ˛ĐžŅŽ ĐŊĐ°ĐˇĐ˛ĐžŅŽ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‡Đ°ŅŅƒ. Đ¯ĐēŅ‰Đž ĐŧŅ–Ņ‚Đēа Ņ‡Đ°ŅŅƒ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Ņ‡Đ°ŅŅ‚ĐžĐē ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŧĐ°Ņ” ĐˇĐąŅ–ĐŗĐ°Ņ‚Đ¸ŅŅ ĐŋОвĐŊиК ҈ĐģŅŅ…. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ Ņ„Đ°ĐšĐģŅ–Đ˛ 'moved' ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ĐŧĐ°ŅŽŅ‚ŅŒ Ņ–ĐŊŅˆĐ¸Đš inode. restored - Ņ„Đ°ĐšĐģи С Ņ–ĐŊŅˆĐ¸Đŧ inode, аĐģĐĩ ĐˇŅ– ĐˇĐąŅ–ĐŗĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, ĐŊаСви, Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ‚Đ° ĐŧŅ–Ņ‚Đēи Ņ‡Đ°ŅŅƒ. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҆Đĩ Ņ„Đ°ĐšĐģи, Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊŅ– ĐŋҖҁĐģŅ видаĐģĐĩĐŊĐŊŅ. Đ¯ĐēŅ‰Đž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа `sync`, ĐēОд ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” 2, СаĐŧŅ–ŅŅ‚ŅŒ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐŗĐž 0. Код ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ 1 виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐˇĐ°ĐŗĐ°ĐģҌĐŊĐžŅ— ҃ĐŧОви ĐŋĐžĐŧиĐģĐēи. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. sync ОĐŊОвĐģŅŽŅ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ’ŅŅ– СĐŧŅ–ĐŊĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ, Ņ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐžĐŊОвĐģŅŽŅŽŅ‚ŅŒŅŅ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ҆ĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ ҃ ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ Ctrl+C, ĐŊĐĩ Đ˛Ņ‚Ņ€Đ°Ņ‡Đ°ŅŽŅ‡Đ¸ вĐļĐĩ виĐēĐžĐŊаĐŊ҃ Ņ€ĐžĐąĐžŅ‚Ņƒ. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž СаĐŋ҃ҁĐē҃ ĐŋŅ€ĐžŅ†Đĩҁ `sync` Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Ņƒ С ĐŧŅ–ŅŅ†Ņ, Đ´Đĩ ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊиК. Đ¯ĐēŅ‰Đž ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ҈ĐģŅŅ…ĐžĐŧ Ņ‚Đ°/айО inode Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅŽŅ‚ŅŒŅŅ Са Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ. Đ¯ĐēŅ‰Đž Ņ€ĐžĐˇĐŧŅ–Ņ€ айО Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа Ņ„Đ°ĐšĐģ҃ Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅŽŅ‚ŅŒŅŅ, даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅŒĐžĐŗĐž Ņ„Đ°ĐšĐģ҃. Đ¯ĐēŅ‰Đž Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž айО ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊĐž ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃, СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‡Đ¸ Ņ‚ĐžĐš ŅĐ°ĐŧиК inode, ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž ĐŊа Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, аĐģĐĩ Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ Ņ…Đĩ҈҃ СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ. ФаКĐģи `content` Ņ‚Đ° `parity` СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. scrub ĐĄĐēŅ€Đ°ĐąŅƒŅ” ĐŧĐ°ŅĐ¸Đ˛, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅŽŅ‡Đ¸ ĐŊа ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē айО ĐŋĐžĐŧиĐģĐžĐē ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ… Ņ‚Đ° ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐļĐĩĐŊ виĐēĐģиĐē ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 8% ĐŧĐ°ŅĐ¸Đ˛Ņƒ, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ даĐŊŅ–, ŅĐēŅ– вĐļĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐžŅŅ‚Đ°ĐŊĐŊŅ–Ņ… 10 Đ´ĐŊŅ–Đ˛. ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ Ņ€Đ°Đˇ ĐŊа Ņ‚Đ¸ĐļĐ´ĐĩĐŊҌ СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ ĐēĐžĐļĐŊĐžĐŗĐž ĐąŅ–Ņ‚Đ° даĐŊĐ¸Ņ… ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Ņ€Đ°Đˇ ĐŊа Ņ‚Ņ€Đ¸ ĐŧŅ–ŅŅŅ†Ņ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš ĐŋĐģаĐŊ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -p, --plan, ŅĐēа ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ”: bad - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. new - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‰ĐžĐšĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–. full - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅĐĩ. 0-100 - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ вĐēаСаĐŊиК Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąĐģĐžĐēŅ–Đ˛. Đ¯ĐēŅ‰Đž ви вĐēĐ°ĐˇŅƒŅ”Ņ‚Đĩ Đ˛Ņ–Đ´ŅĐžŅ‚ĐēОвĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -o, --older-than, Ņ‰ĐžĐą виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸, ŅĐēиĐŧ ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ Đ˛Ņ–Đē ĐąĐģĐžĐē҃. ĐĐ°ĐšŅŅ‚Đ°Ņ€Ņ–ŅˆŅ– ĐąĐģĐžĐēи ҁĐēŅ€Đ°ĐąŅƒŅŽŅ‚ŅŒŅŅ ĐŋĐĩŅ€ŅˆĐ¸Đŧи, СайĐĩСĐŋĐĩŅ‡ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃. Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ Ņ‰ĐžĐšĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ `-p new`. ЊОй ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐĩŅ‚Đ°ĐģŅ– ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ `status`. ДĐģŅ ĐąŅƒĐ´ŅŒ-ŅĐēĐžŅ— СĐŊаКдĐĩĐŊĐžŅ— ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐžŅ— ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– `content`. ĐĻŅ– ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҃ `status` Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `fix -e`. ĐŸŅ–ŅĐģŅ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ, ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ, вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐĩĐŊŅ–, Ņ– ŅĐēŅ‰Đž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚ŅŒŅŅ, Ņ‰Đž вОĐŊи виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–, ĐŋОСĐŊĐ°Ņ‡Đēа "ĐŋĐžĐŗĐ°ĐŊиК" ĐąŅƒĐ´Đĩ видаĐģĐĩĐŊа. ЊОй ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub -p bad`. Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СаĐŋ҃ҁĐēĐ°Ņ‚Đ¸ `scrub` ĐģĐ¸ŅˆĐĩ ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊҌ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐēи, ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊŅ– ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊиĐŧи даĐŊиĐŧи. ĐĻŅ– ĐŋĐžĐŧиĐģĐēи Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊĐ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŊĐĩ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи, Ņ– ĐąĐģĐžĐēи ĐŊĐĩ ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–, аĐģĐĩ Ņ‚Đ°ĐēŅ– ĐŋĐžĐŧиĐģĐēи ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅŽŅ‚ŅŒŅŅ ҃ вивĐĩĐ´ĐĩĐŊĐŊŅ– ĐēĐžĐŧаĐŊди. ФаКĐģ `content` СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Ņ‡Đ°ŅŅƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ĐąĐģĐžĐē҃ Ņ‚Đ° Đ´ĐģŅ ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŋĐžĐŗĐ°ĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛. ФаКĐģи `parity` НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. fix ВиĐŋŅ€Đ°Đ˛ĐģŅŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŖŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐžŅ€Ņ–Đ˛ĐŊŅŽŅŽŅ‚ŅŒŅŅ ĐˇŅ– ŅŅ‚Đ°ĐŊĐžĐŧ СĐŊŅ–ĐŧĐēа, СйĐĩŅ€ĐĩĐļĐĩĐŊиĐŧ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. Đ¯ĐēŅ‰Đž СĐŊаКдĐĩĐŊĐž Ņ€Ņ–ĐˇĐŊĐ¸Ņ†ŅŽ, вОĐŊа ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ Đ´Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐžĐŗĐž СĐŊŅ–ĐŧĐēа. ĐŖĐ’ĐĐ“Đ! КоĐŧаĐŊда `fix` ĐŊĐĩ Ņ€ĐžĐˇŅ€Ņ–ĐˇĐŊŅŅ” ĐŋĐžĐŧиĐģĐēи Ņ‚Đ° ĐŊавĐŧĐ¸ŅĐŊŅ– ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—. ВоĐŊа ĐąĐĩĐˇŅƒĐŧОвĐŊĐž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ŅŅ‚Đ°ĐŊ Ņ„Đ°ĐšĐģ҃ Đ´Đž ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. Đ¯ĐēŅ‰Đž ĐŊĐĩ вĐēаСаĐŊĐž ĐļОдĐŊĐžŅ— Ņ–ĐŊŅˆĐžŅ— ĐžĐŋ҆Җҗ, ĐžĐąŅ€ĐžĐąĐģŅŅ”Ņ‚ŅŒŅŅ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋ҆Җҗ ҄ҖĐģŅŒŅ‚Ņ€Đ°, Ņ‰ĐžĐą Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ĐŧĐŊĐžĐļиĐŊ҃ Ņ„Đ°ĐšĐģŅ–Đ˛ айО Đ´Đ¸ŅĐēŅ–Đ˛ Đ´ĐģŅ Ņ€ĐžĐąĐžŅ‚Đ¸. ЊОй виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ `sync` Ņ‚Đ° `scrub`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ -e, --filter-error. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ Ņ–ĐŊŅˆĐ¸Ņ… ĐžĐŋŅ†Ņ–Đš ҄ҖĐģŅŒŅ‚Ņ€Đ°, Ņ†Ņ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ” виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ СĐŧŅ–ĐŊиĐģĐ¸ŅŅ С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. SnapRAID ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊĐžĐ˛ŅƒŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ `.unrecoverable`. ПĐĩŅ€ĐĩĐ´ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅĐŧ ҁĐēаĐŊŅƒŅ”Ņ‚ŅŒŅŅ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛, Ņ‰ĐžĐą СĐŊĐ°ĐšŅ‚Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. ĐĻŅ– Ņ„Đ°ĐšĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са Ņ—Ņ…ĐŊŅŒĐžŅŽ Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ, Ņ–ĐŗĐŊĐžŅ€ŅƒŅŽŅ‡Đ¸ Ņ—Ņ…ĐŊŅ” Ņ–Đŧ'Ņ Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ, Ņ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ в ĐŋŅ€ĐžŅ†ĐĩҁҖ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ҆Đĩ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž. Đ¯ĐēŅ‰Đž ви ĐŋĐĩŅ€ĐĩĐŧŅ–ŅŅ‚Đ¸Đģи Đ´ĐĩŅĐēŅ– С ĐŊĐ¸Ņ… Са ĐŧĐĩĐļŅ– ĐŧĐ°ŅĐ¸Đ˛Ņƒ, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -i, --import, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Đ´ĐģŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ. ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Са ҈ĐģŅŅ…ĐžĐŧ, а ĐŊĐĩ Са inode. ФаКĐģ `content` НЕ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. ФаКĐģи `parity` СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. check ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸŅ€Đ°Ņ†ŅŽŅ” ŅĐē `fix`, аĐģĐĩ ĐģĐ¸ŅˆĐĩ Ņ–ĐŧŅ–Ņ‚ŅƒŅ” Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, Ņ– ĐļОдĐŊŅ– СĐŧŅ–ĐŊи ĐŊĐĩ СаĐŋĐ¸ŅŅƒŅŽŅ‚ŅŒŅŅ в ĐŧĐ°ŅĐ¸Đ˛. ĐĻŅ ĐēĐžĐŧаĐŊда в ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€ŅƒŅ‡ĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŋҖҁĐģŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ айО в Ņ–ĐŊŅˆĐ¸Ņ… ĐžŅĐžĐąĐģĐ¸Đ˛Đ¸Ņ… ҃ĐŧĐžĐ˛Đ°Ņ…. ДĐģŅ ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐ¸Ņ… Ņ‚Đ° СаĐŋĐģаĐŊОваĐŊĐ¸Ņ… ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ `scrub`. Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ -a, --audit-only, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ”Ņ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ…Đĩ҈ Ņ„Đ°ĐšĐģŅ–Đ˛, а даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ–ĐŗĐŊĐžŅ€ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ ŅˆĐ˛Đ¸Đ´ŅˆĐžĐŗĐž СаĐŋ҃ҁĐē҃. ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Са ҈ĐģŅŅ…ĐžĐŧ, а ĐŊĐĩ Са inode. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. list Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒŅŅ в ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐŊа ĐŧĐžĐŧĐĩĐŊŅ‚ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. З -v айО --verbose Ņ‚Đ°ĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ”Ņ‚ŅŒŅŅ Ņ‡Đ°Ņ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. dup Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Ņ–Đ˛ Ņ„Đ°ĐšĐģŅ–Đ˛. Два Ņ„Đ°ĐšĐģи вваĐļĐ°ŅŽŅ‚ŅŒŅŅ Ņ€Ņ–Đ˛ĐŊиĐŧи, ŅĐēŅ‰Đž Ņ—Ņ…ĐŊŅ– Ņ…ĐĩŅˆŅ– ĐˇĐąŅ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. ДаĐŊŅ– Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊĐĩ ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ; виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊŅ– Ņ…ĐĩŅˆŅ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. pool ĐĄŅ‚Đ˛ĐžŅ€ŅŽŅ” айО ĐžĐŊОвĐģŅŽŅ” Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– в ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– `pooling`. ФаКĐģи ĐŊĐĩ ĐēĐžĐŋŅ–ŅŽŅŽŅ‚ŅŒŅŅ, а ĐŋОв'ŅĐˇŅƒŅŽŅ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đ˛ŅŅ– ҖҁĐŊŅƒŅŽŅ‡Ņ– ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ Ņ‚Đ° ĐŋĐžŅ€ĐžĐļĐŊŅ– ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ видаĐģŅŅŽŅ‚ŅŒŅŅ Ņ‚Đ° СаĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ ĐŊОвиĐŧ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅĐŧ ĐŧĐ°ŅĐ¸Đ˛Ņƒ. Đ‘ŅƒĐ´ŅŒ-ŅĐēŅ– Ņ–ĐŊŅˆŅ– ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊŅ– Ņ„Đ°ĐšĐģи СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа ĐŧҖҁ҆Җ. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Са ĐŧĐĩĐļаĐŧи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool. devices Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩĐ˛Ņ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐŧĐ°ŅĐ¸Đ˛ĐžĐŧ. ĐĻŅ ĐēĐžĐŧаĐŊда Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ” Đ°ŅĐžŅ†Ņ–Đ°Ņ†Ņ–Ņ— ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛ ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– Ņ– в ĐžŅĐŊОвĐŊĐžĐŧ҃ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа ŅĐē Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Đ´ĐģŅ ҁ҆ĐĩĐŊĐ°Ņ€Ņ–Ņ—Đ˛. ПĐĩŅ€ŅˆŅ– два ŅŅ‚ĐžĐ˛Đŋ҆Җ — ҆Đĩ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ Ņ‚Đ° ҈ĐģŅŅ…. ĐĐ°ŅŅ‚ŅƒĐŋĐŊŅ– два ŅŅ‚ĐžĐ˛Đŋ҆Җ — ҆Đĩ Đ˛Đ¸ŅĐžĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ Ņ‚Đ° ҈ĐģŅŅ…. ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš ŅŅ‚ĐžĐ˛ĐŋĐĩŅ†ŅŒ — ҆Đĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа в ĐŧĐ°ŅĐ¸Đ˛Ņ–. ĐŖ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛ ҃ Đ˛Đ°Ņ Ņ” ОдиĐŊ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа в ĐŧĐ°ŅĐ¸Đ˛Ņ–, аĐģĐĩ в Đ´ĐĩŅĐēĐ¸Ņ… ҁĐēĐģадĐŊŅ–ŅˆĐ¸Ņ… ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŅ… ҃ Đ˛Đ°Ņ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩĐ˛Đ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. touch Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” Đ´ĐžĐ˛Ņ–ĐģҌĐŊ҃ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди Đ´ĐģŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ҃ ŅĐēĐ¸Ņ… вОĐŊа Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа ĐŊа ĐŊ҃ĐģҌ. ĐĻĐĩ ĐŋĐžĐēŅ€Đ°Ņ‰ŅƒŅ” ĐˇĐ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŒ SnapRAID Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊĐ°Đ˛Đ°Ņ‚Đ¸ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ‚Đ° ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи, ĐžŅĐēŅ–ĐģҌĐēи Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ ĐŧаКĐļĐĩ ҃ĐŊŅ–ĐēаĐģҌĐŊĐžŅŽ, СĐŧĐĩĐŊŅˆŅƒŅŽŅ‡Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ– Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ¸. ЗоĐēŅ€ĐĩĐŧа, ŅĐēŅ‰Đž Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди ĐŊĐĩ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊиК айО ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊиК Ņ„Đ°ĐšĐģ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ ŅĐē Ņ‚Đ°ĐēиК, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ С Ņ–ĐŧĐĩĐŊĐĩĐŧ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ. Đ¯ĐēŅ‰Đž Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ˛Ņ–ĐŊ вваĐļĐ°Ņ”Ņ‚ŅŒŅŅ ĐēĐžĐŋŅ–Ņ”ŅŽ, ĐģĐ¸ŅˆĐĩ ŅĐēŅ‰Đž ĐŋОвĐŊиК ҈ĐģŅŅ…, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа ĐˇĐąŅ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. Đ§Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž ҁĐĩĐē҃ĐŊди ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ, Ņ‚ĐžĐŧ҃ Đ˛ŅŅ– Đ´Đ°Ņ‚Đ¸ Ņ‚Đ° Ņ‡Đ°Ņ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐąŅƒĐ´ŅƒŅ‚ŅŒ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ–. rehash ПĐģаĐŊŅƒŅ” ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅŒĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ĐĻŅ ĐēĐžĐŧаĐŊда СĐŧŅ–ĐŊŅŽŅ” Ņ‚Đ¸Đŋ Ņ…Đĩ҈҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, ŅĐē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, ĐŋŅ€Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ– С 32-Ņ€ĐžĐˇŅ€ŅĐ´ĐŊĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи ĐŊа 64-Ņ€ĐžĐˇŅ€ŅĐ´ĐŊ҃, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ŅŅ С MurmurHash3 ĐŊа ŅˆĐ˛Đ¸Đ´ŅˆĐ¸Đš SpookyHash. Đ¯ĐēŅ‰Đž ви вĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊиК Ņ…Đĩ҈, Ņ†Ņ ĐēĐžĐŧаĐŊда ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ– ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”, Ņ‰Đž ĐļОдĐŊĐ¸Ņ… Đ´Ņ–Đš ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž. ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐĩ виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐĩĐŗĐ°ĐšĐŊĐž, а Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ ĐŋĐžŅŅ‚ŅƒĐŋОвО ĐŋŅ–Đ´ Ņ‡Đ°Ņ `sync` Ņ‚Đ° `scrub`. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ŅŅ‚Đ°ĐŊ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžĐŗĐž Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `status`. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžĐŗĐž Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ĐŋОвĐŊ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊаĐģҌĐŊŅ–ŅŅ‚ŅŒ, Са Ņ”Đ´Đ¸ĐŊиĐŧ виĐŊŅŅ‚ĐēĐžĐŧ, Ņ‰Đž `dup` ĐŊĐĩ ĐŧĐžĐļĐĩ Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸ Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ…Đĩ҈. locate ЗĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģи, Ņ‰Đž СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž СĐŊаКдĐĩĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐšĐžĐŗĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ‚Đ° ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Ņ–Đ˛, ŅĐēŅ– Đ˛Ņ–ĐŊ СаКĐŧĐ°Ņ”. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ -t, --tail, Ņ‰ĐžĐą ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ Ņ„Đ°ĐšĐģаĐŧи, Ņ‰Đž СаКĐŧĐ°ŅŽŅ‚ŅŒ СаСĐŊĐ°Ņ‡ĐĩĐŊ҃ ĐēŅ–ĐŊ҆ĐĩĐ˛Ņƒ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ (Ņ…Đ˛Ņ–ŅŅ‚) ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ ҆Җ Ņ„Đ°ĐšĐģи, ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ -W, --force-realloc-tail. ĐœĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž Ņ‚Đ°ĐēŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊŅ– ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ҃. ОĐŋ҆Җҗ SnapRAID ĐŊĐ°Đ´Đ°Ņ” ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ: -c, --conf CONFIG Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ Đ´ĐģŅ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ. Đ¯ĐēŅ‰Đž ĐŊĐĩ вĐēаСаĐŊĐž, в Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ҖҁĐŊŅƒŅ”, Ņ–ĐŊаĐē҈Đĩ `/etc/snapraid.conf`. ĐŖ Windows виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` ҃ Ņ‚ĐžĐŧ҃ ŅĐ°ĐŧĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ–, Ņ‰Đž Đš `snapraid.exe`. -f, --filter PATTERN Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Ņ„Đ°ĐšĐģи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `check` Ņ‚Đ° `fix`. ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ вĐēаСаĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ҃. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ€ĐžĐˇĐ´Ņ–Đģ PATTERN Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛. В Unix ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž ŅĐ¸ĐŧвОĐģи ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ Đ˛ĐˇŅŅ‚Ņ– в ĐģаĐŋĐēи, ŅĐēŅ‰Đž вОĐŊи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С `sync` Ņ‚Đ° `scrub`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. -d, --filter-disk NAME Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `check`, `fix`, `up` Ņ‚Đ° `down`. Ви ĐŋОвиĐŊĐŊŅ– вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ŅĐē виСĐŊĐ°Ņ‡ĐĩĐŊĐž ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– С Ņ–ĐŧĐĩĐŊаĐŧи: `parity`, `2-parity`, `3-parity`, Ņ‚ĐžŅ‰Đž, Ņ‰ĐžĐą ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐŋĐĩвĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž ви ĐŋĐžŅ”Đ´ĐŊŅƒŅ”Ņ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš --filter, --filter-disk Ņ‚Đ° --filter-missing, Đ˛Đ¸ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ŅƒŅŅ–Đŧ ҄ҖĐģŅŒŅ‚Ņ€Đ°Đŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check`, `fix`, `up` Ņ‚Đ° `down`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С `sync` Ņ‚Đ° `scrub`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. -m, --filter-missing Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Ņ„Đ°ĐšĐģи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `check` Ņ‚Đ° `fix`. ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– айО видаĐģĐĩĐŊŅ– С ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ĐŸŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– С `fix` ҆Đĩ Đ´Ņ–Ņ” ŅĐē ĐēĐžĐŧаĐŊда `undelete` (Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛). Đ¯ĐēŅ‰Đž ви ĐŋĐžŅ”Đ´ĐŊŅƒŅ”Ņ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš --filter, --filter-disk Ņ‚Đ° --filter-missing, Đ˛Đ¸ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ŅƒŅŅ–Đŧ ҄ҖĐģŅŒŅ‚Ņ€Đ°Đŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С `sync` Ņ‚Đ° `scrub`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. -e, --filter-error ĐžĐąŅ€ĐžĐąĐģŅŅ” Ņ„Đ°ĐšĐģи С ĐŋĐžĐŧиĐģĐēаĐŧи ҃ `check` Ņ‚Đ° `fix`. ĐžĐąŅ€ĐžĐąĐģŅŅ” ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŧĐ°ŅŽŅ‚ŅŒ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊиĐŧи ĐŋĐžĐŧиĐģĐēаĐŧи айО ĐŋĐžĐŧиĐģĐēаĐŧи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ `sync` Ņ‚Đ° `scrub`, ŅĐē СаСĐŊĐ°Ņ‡ĐĩĐŊĐž ҃ `status`. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. -p, --plan PERC|bad|new|full Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐŋĐģаĐŊ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. Đ¯ĐēŅ‰Đž PERC Ņ” Ņ‡Đ¸ŅĐģОвиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Đ˛Ņ–Đ´ 0 Đ´Đž 100, вОĐŊĐž Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚ŅƒŅ”Ņ‚ŅŒŅŅ ŅĐē Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąĐģĐžĐēŅ–Đ˛ Đ´ĐģŅ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. ЗаĐŧŅ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´ŅĐžŅ‚Đēа ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŋĐģаĐŊ: `bad` ҁĐēŅ€Đ°ĐąŅƒŅ” ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, `new` ҁĐēŅ€Đ°ĐąŅƒŅ” ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, Ņ– `full` ҁĐēŅ€Đ°ĐąŅƒŅ” Đ˛ŅĐĩ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `scrub`. -o, --older-than DAYS Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐŊĐ°ĐšŅŅ‚Đ°Ņ€Ņ–ŅˆŅƒ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ ĐŧĐ°ŅĐ¸Đ˛Ņƒ Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `scrub`. DAYS — ҆Đĩ ĐŧŅ–ĐŊŅ–ĐŧаĐģҌĐŊиК Đ˛Ņ–Đē ҃ Đ´ĐŊŅŅ… Đ´ĐģŅ ĐąĐģĐžĐē҃, ŅĐēиК ĐŋОвиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊиК; Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ 10. БĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–, СавĐļди ҁĐēŅ€Đ°ĐąŅƒŅŽŅ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ ҆ҖҔҗ ĐžĐŋ҆Җҗ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `scrub`. -a, --audit-only ĐŖ `check` ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ…Đĩ҈ Ņ„Đ°ĐšĐģŅ–Đ˛ ĐąĐĩС ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž Đ˛Đ°Ņ ҆ҖĐēĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа даĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ ĐŧĐžĐļĐĩ СĐŊĐ°Ņ‡ĐŊĐž ĐŋŅ€Đ¸ŅĐēĐžŅ€Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžŅ†Đĩҁ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check`. -h, --pre-hash ĐŖ `sync` СаĐŋ҃ҁĐēĐ°Ņ” ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŽ Ņ„Đ°ĐˇŅƒ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… ĐŊĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ… Đ´ĐģŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи ĐŋĐĩŅ€ĐĩĐ´ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҃ `sync` ĐŊĐĩ виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ” Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ, а ĐŊĐžĐ˛Ņ– даĐŊŅ– Ņ…ĐĩŅˆŅƒŅŽŅ‚ŅŒŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐŋĐĩŅ€ĐĩĐ´ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ĐēĐžĐģи вОĐŊи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ вĐŋĐĩŅ€ŅˆĐĩ. ĐĻĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ, ĐēĐžĐģи ŅĐ¸ŅŅ‚ĐĩĐŧа СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐŋŅ–Đ´ вĐĩĐģиĐēиĐŧ ĐŊаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅĐŧ, ŅƒŅŅ– Đ´Đ¸ŅĐēи ОйĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒŅŅ Ņ‚Đ° ĐĻП СаКĐŊŅŅ‚Đ¸Đš. ĐĻĐĩ ĐĩĐēҁ҂ҀĐĩĐŧаĐģҌĐŊа ҃ĐŧОва Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊи, Ņ– ŅĐēŅ‰Đž вОĐŊа ĐŧĐ°Ņ” ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊ҃ аĐŋĐ°Ņ€Đ°Ņ‚ĐŊ҃ ĐŋŅ€ĐžĐąĐģĐĩĐŧ҃, ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи ĐŧĐžĐļŅƒŅ‚ŅŒ СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ŅŅ ĐŊĐĩĐ˛Đ¸ŅĐ˛ĐģĐĩĐŊиĐŧи, ĐžŅĐēŅ–ĐģҌĐēи даĐŊŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи Ņ…ĐĩŅˆĐžĐ˛Đ°ĐŊŅ–. ЊОй ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ Ņ†ŅŒĐžĐŗĐž Ņ€Đ¸ĐˇĐ¸Đē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ€ĐĩĐļиĐŧ `pre-hash`, Ņ‰ĐžĐą ŅƒŅŅ– даĐŊŅ– ĐąŅƒĐģи ĐˇŅ‡Đ¸Ņ‚Đ°ĐŊŅ– Đ´Đ˛Ņ–Ņ‡Ņ– Đ´ĐģŅ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ Ņ—Ņ… ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ‚Đ°ĐēĐžĐļ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– в ĐŧĐĩĐļĐ°Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņƒ, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐŊŅ ĐąŅƒĐģа ҃ҁĐŋŅ–ŅˆĐŊĐžŅŽ, Ņ–, ŅĐēŅ‰Đž ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž, дОСвОĐģŅŅ” СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅĐŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -i, --import DIR ІĐŧĐŋĐžŅ€Ņ‚ŅƒŅ” С вĐēаСаĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Ņ„Đ°ĐšĐģи, видаĐģĐĩĐŊŅ– С ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŋҖҁĐģŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ ҉Đĩ Ņ” Ņ‚Đ°ĐēŅ– Ņ„Đ°ĐšĐģи, вОĐŊи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– `check` Ņ‚Đ° `fix` Đ´ĐģŅ ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. ФаКĐģи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸, Ņ‚Đ° Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ Ņ—Ņ…ĐŊŅŒĐžĐŗĐž Ņ–ĐŧĐĩĐŊŅ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. -s, --spin-down-on-error ĐŸŅ€Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŋĐžĐŧиĐģ҆Җ ĐˇŅƒĐŋиĐŊŅŅ” Đ˛ŅŅ– ĐēĐĩŅ€ĐžĐ˛Đ°ĐŊŅ– Đ´Đ¸ŅĐēи ĐŋĐĩŅ€ĐĩĐ´ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅĐŧ С ĐŊĐĩĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ ĐēОдОĐŧ ŅŅ‚Đ°ĐŊ҃. ĐĻĐĩ СаĐŋĐžĐąŅ–ĐŗĐ°Ņ” Ņ‚ĐžĐŧ҃, Ņ‰ĐžĐą Đ´Đ¸ŅĐēи СаĐģĐ¸ŅˆĐ°ĐģĐ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧи Ņ‚Đ° ОйĐĩŅ€Ņ‚Đ°ĐģĐ¸ŅŅ ĐŋҖҁĐģŅ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—, Đ´ĐžĐŋĐžĐŧĐ°ĐŗĐ°ŅŽŅ‡Đ¸ ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐˇĐ°ĐšĐ˛ĐžĐŗĐž ĐŊĐ°ĐŗŅ€Ņ–Đ˛Đ°ĐŊĐŊŅ Ņ‚Đ° ҁĐŋĐžĐļиваĐŊĐŊŅ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐĩĐŊĐĩŅ€ĐŗŅ–Ņ—. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ, Ņ‰ĐžĐą СайĐĩСĐŋĐĩŅ‡Đ¸Ņ‚Đ¸ ĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐˇŅƒĐŋиĐŊĐē҃ Đ´Đ¸ŅĐēŅ–Đ˛, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐēĐžĐģи ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžĐŧиĐģĐēĐžŅŽ. -w, --bw-limit RATE Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ” ĐŗĐģОйаĐģҌĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊĐžŅ— ĐˇĐ´Đ°Ņ‚ĐŊĐžŅŅ‚Ņ– Đ´ĐģŅ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. RATE — ҆Đĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąĐ°ĐšŅ‚Ņ–Đ˛ ĐŊа ҁĐĩĐē҃ĐŊĐ´Ņƒ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐē, Ņ‚Đ°ĐēиК ŅĐē K, M айО G (ĐŊаĐŋŅ€Đ¸ĐēĐģад, --bw-limit 1G). -t, --tail РОЗМІР ОбĐŧĐĩĐļŅƒŅ” ҁĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ¸Đŧи, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐŊĐĩ ĐąŅ–ĐģҌ҈Đĩ СаСĐŊĐ°Ņ‡ĐĩĐŊĐžĐŗĐž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đ˛ĐžŅŅ‚Đ° Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. МоĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐēи, Ņ‚Đ°ĐēŅ– ŅĐē K, M, G айО T (ĐŊаĐŋŅ€Đ¸ĐēĐģад, --tail 1G). ĐĻĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Đ´Ņ–ĐšŅĐŊиК ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– Ņ€Đ°ĐˇĐžĐŧ Ņ–Đˇ ĐēĐžĐŧаĐŊĐ´ĐžŅŽ `locate`. -A, --stats ВĐŧиĐēĐ°Ņ” Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊиК ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´ ŅŅ‚Đ°ĐŊ҃, ŅĐēиК ĐŋĐžĐēĐ°ĐˇŅƒŅ” Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ. На ĐĩĐēŅ€Đ°ĐŊŅ– Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ два ĐŗŅ€Đ°Ņ„Ņ–Đēи: ПĐĩŅ€ŅˆĐ¸Đš ĐŗŅ€Đ°Ņ„Ņ–Đē ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ… ҁĐŧŅƒĐŗ (stripes) Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, Ņ€Đ°ĐˇĐžĐŧ ĐˇŅ– ҈ĐģŅŅ…ĐžĐŧ Đ´Đž Ņ„Đ°ĐšĐģ҃, Đ´Đž ŅĐēĐžĐŗĐž ĐŊĐ°Ņ€Đ°ĐˇŅ– ĐˇĐ´Ņ–ĐšŅĐŊŅŽŅ”Ņ‚ŅŒŅŅ Đ´ĐžŅŅ‚ŅƒĐŋ ĐŊа Ņ†ŅŒĐžĐŧ҃ Đ´Đ¸ŅĐē҃. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ĐŊаКĐŋĐžĐ˛Ņ–ĐģҌĐŊŅ–ŅˆĐ¸Đš Đ´Đ¸ŅĐē ĐŊĐĩ ĐŧĐ°Ņ‚Đ¸ĐŧĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐąŅƒŅ„ĐĩŅ€Đ°, Ņ‰Đž виСĐŊĐ°Ņ‡Đ°Ņ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžŅŅĐļĐŊ҃ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊ҃ ĐˇĐ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŒ. Đ”Ņ€ŅƒĐŗĐ¸Đš ĐŗŅ€Đ°Ņ„Ņ–Đē ĐŋĐžĐēĐ°ĐˇŅƒŅ” Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē Ņ‡Đ°ŅŅƒ, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŊа ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Са ĐžŅŅ‚Đ°ĐŊĐŊŅ– 100 ҁĐĩĐē҃ĐŊĐ´. ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‰Đž ĐŊаКĐŋĐžĐ˛Ņ–ĐģҌĐŊŅ–ŅˆĐ¸Đš Đ´Đ¸ŅĐē ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐ¸Ņ‚ŅŒ ĐąŅ–ĐģҌ҈҃ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‚ĐžĐ´Ņ– ŅĐē Ņ–ĐŊŅˆŅ– Đ´Đ¸ŅĐēи ĐŋОвиĐŊĐŊŅ– ĐŧĐ°Ņ‚Đ¸ ĐŊĐĩвĐĩĐģиĐēиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐˇĐžĐ˛ŅŅ–Đŧ ĐšĐžĐŗĐž ĐŊĐĩ ĐŧĐ°Ņ‚Đ¸, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи ĐŧĐžĐļŅƒŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅĐ˛ĐžŅ— ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊŅ– ҁĐŧŅƒĐŗĐ¸. ĐĻĐĩĐš ĐŗŅ€Đ°Ņ„Ņ–Đē Ņ‚Đ°ĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ” Ņ‡Đ°Ņ, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊиК ĐŊа ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ Ņ…Đĩ҈҃ Ņ‚Đ° ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊҌ RAID. ĐŖŅŅ– ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ виĐēĐžĐŊŅƒŅŽŅ‚ŅŒŅŅ ĐŋĐ°Ņ€Đ°ĐģĐĩĐģҌĐŊĐž С ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅĐŧи Đ´Đ¸ŅĐēа. ĐĸĐžĐŧ҃, Đ´ĐžĐēи Ņ” виĐŧŅ–Ņ€ŅŽĐ˛Đ°ĐŊиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Đ´ĐģŅ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ҆Đĩ вĐēĐ°ĐˇŅƒŅ” ĐŊа Ņ‚Đĩ, Ņ‰Đž ĐĻП Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž ŅˆĐ˛Đ¸Đ´ĐēиК, Ņ‰ĐžĐą ҁĐŋŅ€Đ°Đ˛ĐģŅŅ‚Đ¸ŅŅ С Ņ€ĐžĐąĐžŅ‡Đ¸Đŧ ĐŊаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅĐŧ. -Z, --force-zero Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģ҃ С ĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ, ŅĐēиК Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐąŅƒĐ˛ ĐŊĐĩĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ” Ņ‚Đ°Đē҃ ҃ĐŧĐžĐ˛Ņƒ, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” ĐģĐĩĐŗĐēĐž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи ĐŋҖҁĐģŅ ĐˇĐąĐžŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧи Đ´ĐĩŅĐēŅ– Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ– Ņ„Đ°ĐšĐģи ĐąŅƒĐģи ĐžĐąŅ€Ņ–ĐˇĐ°ĐŊŅ–. ĐĻĐĩ ĐŧĐžĐļĐģива ҃ĐŧОва в Linux С Ņ„Đ°ĐšĐģОвиĐŧи ŅĐ¸ŅŅ‚ĐĩĐŧаĐŧи ext3/ext4. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -E, --force-empty Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Đ´Đ¸ŅĐēа, ĐŊа ŅĐēĐžĐŧ҃ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– Đ˛ŅŅ– ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊŅ– Ņ„Đ°ĐšĐģи. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ”, Ņ‰Đž Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ– ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐąŅƒĐģи ĐŊа Đ´Đ¸ŅĐē҃, Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– айО ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°ĐŊŅ–, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” ĐģĐĩĐŗĐēĐž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи Ņ„Đ°ĐšĐģОва ŅĐ¸ŅŅ‚ĐĩĐŧа даĐŊĐ¸Ņ… ĐŊĐĩ СĐŧĐžĐŊŅ‚ĐžĐ˛Đ°ĐŊа. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -U, --force-uuid Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ С Đ´Đ¸ŅĐēаĐŧи, ŅĐēŅ– СĐŧŅ–ĐŊиĐģи ŅĐ˛Ņ–Đš UUID. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ”, Ņ‰Đž Đ´ĐĩŅĐēŅ– Đ´Đ¸ŅĐēи СĐŧŅ–ĐŊиĐģи UUID, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи Đ˛Đ°ŅˆŅ– Đ´Đ¸ŅĐēи СĐŧĐžĐŊŅ‚ĐžĐ˛Đ°ĐŊŅ– в ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐ¸Ņ… Ņ‚ĐžŅ‡ĐēĐ°Ņ… ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ. ОдĐŊаĐē, дОСвОĐģĐĩĐŊĐž ĐŧĐ°Ņ‚Đ¸ ОдĐŊ҃ СĐŧŅ–ĐŊ҃ UUID С ОдĐŊŅ–Ņ”ŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ Ņ– ĐąŅ–ĐģҌ҈Đĩ С ĐŧĐŊĐžĐļиĐŊĐŊĐžŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ, ĐžŅĐēŅ–ĐģҌĐēи ҆Đĩ ĐŊĐžŅ€ĐŧаĐģҌĐŊиК виĐŋадОĐē ĐŋŅ€Đ¸ СаĐŧŅ–ĐŊŅ– Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`, `check` айО `fix`. -D, --force-device Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ С ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи Đ´Đ¸ŅĐēаĐŧи айО С Đ´Đ¸ŅĐēаĐŧи ĐŊа Ņ‚ĐžĐŧ҃ Đļ Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊĐžĐŧ҃ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Đģи два Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ… Ņ– ĐŧĐ°Ņ”Ņ‚Đĩ СаĐŋĐ°ŅĐŊиК Đ´Đ¸ŅĐē Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ ĐŋĐĩŅ€ŅˆĐžĐŗĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Ņ€ŅƒĐŗĐ¸Đš ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиК Đ´Đ¸ŅĐē. АйО, ŅĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Đ´Đ¸ŅĐē ҃ Đ˛Ņ–ĐģҌĐŊĐžĐŧ҃ ĐŧҖҁ҆Җ, СаĐģĐ¸ŅˆĐĩĐŊĐžĐŧ҃ ĐŊа вĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°ĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ‚ĐžĐš ŅĐ°ĐŧиК Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `fix`. -N, --force-nocopy ĐŖ `sync`, `check` Ņ‚Đ° `fix` виĐŧиĐēĐ°Ņ” ĐĩĐ˛Ņ€Đ¸ŅŅ‚Đ¸Đē҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐēĐžĐŋŅ–Đš. БĐĩС ҆ҖҔҗ ĐžĐŋ҆Җҗ SnapRAID ĐŋŅ€Đ¸Đŋ҃ҁĐēĐ°Ņ”, Ņ‰Đž Ņ„Đ°ĐšĐģи С ОдĐŊаĐēОвиĐŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ŅĐē Ņ–Đŧ'Ņ, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа, Ņ” ĐēĐžĐŋŅ–ŅĐŧи С Ņ‚Đ¸Đŧи Đļ даĐŊиĐŧи. ĐĻĐĩ дОСвОĐģŅŅ” Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒĐ˛Đ°Ņ‚Đ¸ ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– айО ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи С ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŊа Ņ–ĐŊŅˆĐ¸Đš Ņ– ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” вĐļĐĩ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊ҃ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ Ņ…Đĩ҈҃ Đ´ĐģŅ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē айО Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛. ĐŖ Đ´ĐĩŅĐēĐ¸Ņ… Ņ€Ņ–Đ´ĐēҖҁĐŊĐ¸Ņ… виĐŋадĐēĐ°Ņ… Ņ†Ņ ĐŋОвĐĩĐ´Ņ–ĐŊĐēа ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ…Đ¸ĐąĐŊĐ¸Ņ… ҁĐŋŅ€Đ°Ņ†ŅŒĐžĐ˛ŅƒĐ˛Đ°ĐŊҌ айО ĐŋĐžĐ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅ†Đĩҁ҃ ҇ĐĩŅ€ĐĩС ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē Ņ…Đĩ҈҃, Ņ– Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ дОСвОĐģŅŅ” Đ˛Đ¸Ņ€Ņ–ŅˆĐ¸Ņ‚Đ¸ Ņ‚Đ°ĐēŅ– ĐŋŅ€ĐžĐąĐģĐĩĐŧи. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`, `check` Ņ‚Đ° `fix`. -F, --force-full ĐŖ `sync` Ņ„ĐžŅ€ŅŅƒŅ” ĐŋОвĐŊĐĩ ĐŋĐĩŅ€ĐĩĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸, ĐēĐžĐģи ви Đ´ĐžĐ´Đ°Ņ”Ņ‚Đĩ ĐŊОвиК Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО ŅĐēŅ‰Đž ви ĐŋОвĐĩŅ€ĐŊ҃ĐģĐ¸ŅŅ Đ´Đž ŅŅ‚Đ°Ņ€ĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ вĐŧŅ–ŅŅ‚Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐąŅ–ĐģҌ҈ ĐŊĐžĐ˛Ņ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ЗаĐŧŅ–ŅŅ‚ŅŒ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– С ĐŊ҃ĐģŅ, ҆Đĩ дОСвОĐģŅŅ” ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ…ĐĩŅˆŅ–, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ… Ņ‚Đ° ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēи ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ `sync`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ҖҁĐŊŅƒŅŽŅ‡Ņ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -R, --force-realloc ĐŖ `sync` Ņ„ĐžŅ€ŅŅƒŅ” ĐŋОвĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐąŅƒĐ´ĐžĐ˛Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐŋОвĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ҃ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ŅƒŅŅƒĐ˛Đ°ŅŽŅ‡Đ¸ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ…ĐĩŅˆŅ–, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ…. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ Ņ—Ņ— виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. Ви НЕ ĐŧĐ°Ņ”Ņ‚Đĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— `sync`. -W, --force-realloc-tail РОЗМІР ĐŸŅ€Đ°Ņ†ŅŽŅ” ŅĐē -R, --force-realloc, аĐģĐĩ ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ вĐēаСаĐŊĐžŅŽ ĐēŅ–ĐŊ҆ĐĩĐ˛ĐžŅŽ Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ (ĐžŅŅ‚Đ°ĐŊĐŊŅ– РОЗМІР ĐąĐ°ĐšŅ‚) ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģŅŅ” (ĐŋĐĩŅ€ĐĩĐŧŅ–Ņ‰ŅƒŅ”) ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ¸/ĐąĐģĐžĐēи Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‰Đž ĐŊĐ°Ņ€Đ°ĐˇŅ– СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ в Ņ†Ņ–Đš ĐēŅ–ĐŊ҆ĐĩĐ˛Ņ–Đš ҁĐĩĐē҆Җҗ, дОСвОĐģŅŅŽŅ‡Đ¸ Ņ€ĐžĐˇĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Ņ—Ņ… ĐąŅƒĐ´ŅŒ-Đ´Đĩ ҃ Ņ„Đ°ĐšĐģŅ–(Đ°Ņ…) ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ´Đĩ Ņ” Đ˛Ņ–ĐģҌĐŊĐĩ ĐŧҖҁ҆Đĩ (вĐēĐģŅŽŅ‡ĐŊĐž С ĐŊĐ°ŅĐ˛ĐŊиĐŧи ĐŋŅƒŅŅ‚ĐžŅ‚Đ°Đŧи). ĐžŅĐŊОвĐŊа ĐŧĐĩŅ‚Đ° Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° — СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŊа Đ´Đ¸ŅĐē҃. Đ¯ĐēŅ‰Đž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ ҃ҁĐŋŅ–ŅˆĐŊĐž ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Đ˛ŅŅŽ ĐēŅ–ĐŊ҆ĐĩĐ˛Ņƒ ҁĐĩĐēŅ†Ņ–ŅŽ (҃ ĐŊŅ–Đš ĐŊĐĩ СаĐģĐ¸ŅˆĐ¸Ņ‚ŅŒŅŅ ĐąĐģĐžĐēŅ–Đ˛), Ņ„Đ°ĐšĐģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐąŅƒĐ´Đĩ ĐžĐąŅ€Ņ–ĐˇĐ°ĐŊиК, Đ˛Đ¸Đ˛Ņ–ĐģҌĐŊŅŅŽŅ‡Đ¸ ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ Ņ…Đ˛ĐžŅŅ‚Đ°. МоĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐēи, Ņ‚Đ°ĐēŅ– ŅĐē K, M, G айО T (ĐŊаĐŋŅ€Đ¸ĐēĐģад, --force-realloc-tail 1G). Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ locate -t, --tail, Ņ‰ĐžĐą СаСдаĐģĐĩĐŗŅ–Đ´ŅŒ Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐŋŅ€Đž ĐˇĐ°Ņ‡ĐĩĐŋĐģĐĩĐŊŅ– Ņ„Đ°ĐšĐģи. ĐŖĐ’ĐĐ“Đ! ĐĻĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊиК ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐšĐžĐŗĐž ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— `sync` ĐˇĐ°Ņ…Đ¸ŅŅ‚ даĐŊĐ¸Ņ… Đ´ĐģŅ ĐˇĐ°Ņ‡ĐĩĐŋĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Đ’Đ†Đ”ĐĄĐŖĐĸНІЙ. -l, --log FILE ЗаĐŋĐ¸ŅŅƒŅ” Đ´ĐĩŅ‚Đ°ĐģҌĐŊиК ĐļŅƒŅ€ĐŊаĐģ ҃ вĐēаСаĐŊиК Ņ„Đ°ĐšĐģ. Đ¯ĐēŅ‰Đž Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐēаСаĐŊа, ĐŊĐĩҁĐŋĐžĐ´Ņ–Đ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа ĐĩĐēŅ€Đ°ĐŊ, Ņ‰Đž ĐŋĐžŅ‚ĐĩĐŊŅ†Ņ–ĐšĐŊĐž ĐŋŅ€Đ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž ĐŊадĐŧŅ–Ņ€ĐŊĐžĐŗĐž вивĐĩĐ´ĐĩĐŊĐŊŅ ҃ виĐŋадĐē҃ ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐžŅ… ĐŋĐžĐŧиĐģĐžĐē. КоĐģи вĐēаСаĐŊĐž -l, --log, ĐŊа ĐĩĐēŅ€Đ°ĐŊ Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°Ņ‚Đ°ĐģҌĐŊŅ– ĐŋĐžĐŧиĐģĐēи, ŅĐēŅ– ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊŅŅŽŅ‚ŅŒ ĐˇŅƒĐŋиĐŊĐē҃ SnapRAID. Đ¯ĐēŅ‰Đž ҈ĐģŅŅ… ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ С `>>`, Ņ„Đ°ĐšĐģ Đ˛Ņ–Đ´ĐēŅ€Đ¸Đ˛Đ°Ņ”Ņ‚ŅŒŅŅ ҃ Ņ€ĐĩĐļиĐŧŅ– Đ´ĐžĐŋОвĐŊĐĩĐŊĐŊŅ. Đ’Ņ…ĐžĐ´ĐļĐĩĐŊĐŊŅ `%D` Ņ‚Đ° `%T` в Ņ–ĐŧĐĩĐŊŅ– СаĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Đ´Đ°Ņ‚ĐžŅŽ Ņ‚Đ° Ņ‡Đ°ŅĐžĐŧ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– YYYYMMDD Ņ‚Đ° HHMMSS. ĐŖ ĐŋаĐēĐĩŅ‚ĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģĐ°Ņ… Windows ви ĐŋОвиĐŊĐŊŅ– ĐŋĐžĐ´Đ˛ĐžŅ—Ņ‚Đ¸ ŅĐ¸ĐŧвОĐģ `%`, ĐŊаĐŋŅ€Đ¸ĐēĐģад, result-%%D.log. ЊОй виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `>>`, ви ĐŋОвиĐŊĐŊŅ– Đ˛ĐˇŅŅ‚Đ¸ Ņ–Đŧ'Ņ в ĐģаĐŋĐēи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, `">>result.log"`. ЊОй вивĐĩŅŅ‚Đ¸ ĐļŅƒŅ€ĐŊаĐģ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Đ˛Đ¸Đ˛Ņ–Đ´ айО ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊ҃ ĐŋĐžĐŧиĐģĐē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `">&1"` Ņ‚Đ° `">&2"` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐž. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ snapraid_log.txt айО man-ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ Đ´ĐģŅ ĐžĐŋĐ¸ŅŅ–Đ˛ Ņ‚ĐĩĐŗŅ–Đ˛ ĐļŅƒŅ€ĐŊаĐģ҃. -L, --error-limit NUMBER Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” ĐŊОвиК ĐģŅ–ĐŧŅ–Ņ‚ ĐŋĐžĐŧиĐģĐžĐē ĐŋĐĩŅ€ĐĩĐ´ ĐˇŅƒĐŋиĐŊĐēĐžŅŽ виĐēĐžĐŊаĐŊĐŊŅ. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ SnapRAID ĐˇŅƒĐŋиĐŊŅŅ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐˇŅƒŅŅ‚Ņ€Ņ–Ņ‡Đ°Ņ” ĐąŅ–ĐģҌ҈Đĩ 100 ĐŋĐžĐŧиĐģĐžĐē ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Ņ‰Đž вĐēĐ°ĐˇŅƒŅ” ĐŊа ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊ҃ Đ˛Ņ–Đ´ĐŧĐžĐ˛Ņƒ Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа `sync` Ņ‚Đ° `scrub`, ŅĐēиĐŧ дОСвОĐģĐĩĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋҖҁĐģŅ ĐŋĐĩŅ€ŅˆĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Ņƒ ĐŋĐžĐŧиĐģĐžĐē Đ´Đ¸ŅĐēа, Ņ‰ĐžĐą ҁĐŋŅ€ĐžĐąŅƒĐ˛Đ°Ņ‚Đ¸ СавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ ŅĐ˛ĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—. ОдĐŊаĐē `check` Ņ‚Đ° `fix` СавĐļди ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ ĐŋŅ€Đ¸ ĐŋĐĩŅ€ŅˆŅ–Đš ĐŋĐžĐŧиĐģ҆Җ. -S, --start BLKSTART ĐŸĐžŅ‡Đ¸ĐŊĐ°Ņ” ĐžĐąŅ€ĐžĐąĐē҃ С вĐēаСаĐŊĐžĐŗĐž ĐŊĐžĐŧĐĩŅ€Đ° ĐąĐģĐžĐē҃. ĐĻĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžŅ— ҁĐŋŅ€ĐžĐąĐ¸ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи айО виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐŋĐĩвĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛ ҃ виĐŋадĐē҃ ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ в ĐžŅĐŊОвĐŊĐžĐŧ҃ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. -B, --count BLKCOUNT ĐžĐąŅ€ĐžĐąĐģŅŅ” ĐģĐ¸ŅˆĐĩ вĐēаСаĐŊ҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąĐģĐžĐēŅ–Đ˛. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ в ĐžŅĐŊОвĐŊĐžĐŧ҃ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. -C, --gen-conf CONTENT ГĐĩĐŊĐĩŅ€ŅƒŅ” ҄ҖĐēŅ‚Đ¸Đ˛ĐŊиК ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ С ҖҁĐŊŅƒŅŽŅ‡ĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ вĐŧŅ–ŅŅ‚Ņƒ. КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ СаĐŋĐ¸ŅŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Đ˛Đ¸Đ˛Ņ–Đ´ Ņ– ĐŊĐĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅƒŅ” ҖҁĐŊŅƒŅŽŅ‡Đ¸Đš. ĐĻĐĩĐš ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ Ņ‚Đ°ĐēĐžĐļ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊ҃ Đ´ĐģŅ Ņ€ĐĩĐēĐžĐŊŅŅ‚Ņ€ŅƒĐē҆Җҗ Ņ‚ĐžŅ‡ĐžĐē ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēа ҃ виĐŋадĐē҃ Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸ Đ˛ŅŅ–Ņ”Ņ— ŅĐ¸ŅŅ‚ĐĩĐŧи. -v, --verbose Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐąŅ–ĐģҌ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŊа ĐĩĐēŅ€Đ°ĐŊ. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ОдиĐŊ Ņ€Đ°Đˇ, Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ виĐēĐģŅŽŅ‡ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đē҃. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа Ņ„Đ°ĐšĐģи ĐļŅƒŅ€ĐŊаĐģ҃. -q, --quiet Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐŧĐĩĐŊ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŊа ĐĩĐēŅ€Đ°ĐŊ. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ОдиĐŊ Ņ€Đ°Đˇ, видаĐģŅŅ” Ņ–ĐŊдиĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€ĐžĐŗŅ€Đĩҁ҃; Đ´Đ˛Ņ–Ņ‡Ņ– — ĐŋĐžŅ‚ĐžŅ‡ĐŊŅ– ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—; Ņ‚Ņ€Đ¸Ņ‡Ņ– — Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊŅ– ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ; Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Đ°ĐˇĐ¸ — ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ ĐŋŅ€Đž ŅŅ‚Đ°Ņ‚ŅƒŅ. Đ¤Đ°Ņ‚Đ°ĐģҌĐŊŅ– ĐŋĐžĐŧиĐģĐēи СавĐļди Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа ĐĩĐēŅ€Đ°ĐŊ. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа Ņ„Đ°ĐšĐģи ĐļŅƒŅ€ĐŊаĐģ҃. -H, --help Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐēĐžŅ€ĐžŅ‚ĐēиК Đ´ĐžĐ˛Ņ–Đ´ĐēОвиК ĐĩĐēŅ€Đ°ĐŊ. -V, --version Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ вĐĩŅ€ŅŅ–ŅŽ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи. КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ SnapRAID виĐŧĐ°ĐŗĐ°Ņ” ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ, Ņ‰ĐžĐą СĐŊĐ°Ņ‚Đ¸, Đ´Đĩ Ņ€ĐžĐˇŅ‚Đ°ŅˆĐžĐ˛Đ°ĐŊиК Đ˛Đ°Ņˆ Đ´Đ¸ŅĐēОвиК ĐŧĐ°ŅĐ¸Đ˛ Ņ– Đ´Đĩ СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. В Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ҖҁĐŊŅƒŅ”, Ņ–ĐŊаĐē҈Đĩ `/etc/snapraid.conf`. ĐŖ Windows виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` ҃ Ņ‚ĐžĐŧ҃ ŅĐ°ĐŧĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ–, Ņ‰Đž Đš `snapraid.exe`. Đ’Ņ–ĐŊ ĐŋОвиĐŊĐĩĐŊ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ (Ņ‡ŅƒŅ‚ĐģĐ¸Đ˛Ņ– Đ´Đž Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€Ņƒ): parity FILE [,FILE] ... ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐˇĐ°Ņ…Đ¸ŅŅ‚ Đ˛Ņ–Đ´ Đ˛Ņ–Đ´ĐŧОви ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID5. Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ ĐŊа Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. КоĐģи Ņ„Đ°ĐšĐģ ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ ĐŧĐžĐļĐĩ ĐˇŅ€ĐžŅŅ‚Đ°Ņ‚Đ¸, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиК. Đ—Đ°ĐŗĐ°ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋĐŊиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ ĐŋОвиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Ņ‚Đ°ĐēиĐŧ ĐļĐĩ вĐĩĐģиĐēиĐŧ, ŅĐē ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆĐ¸Đš Đ´Đ¸ŅĐē даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– Ņ„Đ°ĐšĐģи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ, аĐģĐĩ ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ… ĐŋĐĩŅ€Đĩ҃ĐŋĐžŅ€ŅĐ´ĐēĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ айО видаĐģŅŅ‚Đ¸. ЗбĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛ĐžĐ˛Đ°ĐŊиĐŧи Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– СайĐĩСĐŋĐĩŅ‡ŅƒŅ”, Ņ‰Đž вОĐŊи ĐŊĐĩ ŅŅ‚Đ°ŅŽŅ‚ŅŒ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚ĐžĐ˛Đ°ĐŊиĐŧи, ĐŋĐžĐēŅ€Đ°Ņ‰ŅƒŅŽŅ‡Đ¸ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ. ĐŖ Windows 256 МБ СаĐģĐ¸ŅˆĐ°Ņ”Ņ‚ŅŒŅŅ ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊиĐŧи ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž ĐŋОвĐŊŅ– Đ´Đ¸ŅĐēи. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” ОйОв'ŅĐˇĐēĐžĐ˛ĐžŅŽ Ņ– ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊа ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Đ°Đˇ. (2,3,4,5,6)-parity FILE [,FILE] ... ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž вĐēаСаĐŊĐžĐŗĐž Ņ€Ņ–Đ˛ĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– вĐŧиĐēĐ°Ņ”Ņ‚ŅŒŅŅ ОдиĐŊ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ: * 2-parity вĐŧиĐēĐ°Ņ” ĐŋĐžĐ´Đ˛Ņ–ĐšĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ RAID6. * 3-parity вĐŧиĐēĐ°Ņ” ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. * 4-parity вĐŧиĐēĐ°Ņ” ҇ĐĩŅ‚Đ˛ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. * 5-parity вĐŧиĐēĐ°Ņ” Đŋ'ŅŅ‚ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. * 6-parity вĐŧиĐēĐ°Ņ” ҈Đĩҁ҂ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. КоĐļĐĩĐŊ Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– виĐŧĐ°ĐŗĐ°Ņ” ĐŊĐ°ŅĐ˛ĐŊĐžŅŅ‚Ņ– Đ˛ŅŅ–Ņ… ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Ņ… Ņ€Ņ–Đ˛ĐŊŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҂Җ ŅĐ°ĐŧŅ– ĐŧŅ–Ņ€ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰Đž Đš Đ´ĐģŅ ĐžĐŋ҆Җҗ `parity`. ĐĻŅ– ĐžĐŋ҆Җҗ Ņ” ĐŊĐĩОйОв'ŅĐˇĐēОвиĐŧи Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Đ°Đˇ. z-parity FILE [,FILE] ... ВизĐŊĐ°Ņ‡Đ°Ņ” аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊиК Ņ„Đ°ĐšĐģ Ņ‚Đ° Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊĐžŅ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐžŅŽ `3-parity`, в ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ ĐĻП ĐŊĐ¸ĐˇŅŒĐēĐžĐŗĐž ĐēĐģĐ°ŅŅƒ, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē ARM айО AMD Phenom, Athlon Ņ‚Đ° Opteron, ŅĐēŅ– ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ ĐŊĐ°ĐąŅ–Ņ€ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐēŅ†Ņ–Đš SSSE3. ĐŖ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēĐ°Ņ… вОĐŊа СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐēŅ€Đ°Ņ‰Ņƒ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ. ĐĻĐĩĐš Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ŅŅ…ĐžĐļиК, аĐģĐĩ ŅˆĐ˛Đ¸Đ´ŅˆĐ¸Đš, ĐŊŅ–Đļ Ņ‚ĐžĐš, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ZFS RAIDZ3. Đ¯Đē Ņ– ZFS, Đ˛Ņ–ĐŊ ĐŊĐĩ ĐŋŅ€Đ°Ņ†ŅŽŅ” даĐģŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊĐžŅ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– `3-parity` ви ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊŅ–, ŅĐēŅ‰Đž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ `z-parity` Đ´ĐģŅ ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚Ņ–. МоĐļĐŊа ĐēĐžĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ С ОдĐŊĐžĐŗĐž Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņƒ в Ņ–ĐŊŅˆĐ¸Đš, ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Đ˛ŅˆĐ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ С йаĐļаĐŊиĐŧ Ņ„Đ°ĐšĐģĐžĐŧ z-parity айО 3-parity Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `fix` Đ´ĐģŅ ĐšĐžĐŗĐž Đ˛Ņ–Đ´Ņ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ. content FILE ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģ, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ҁĐŋĐ¸ŅĐē҃ Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊĐ¸Ņ… ҁ҃Đŧ ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ–Ņ… ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. Đ’Ņ–ĐŊ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ Ņ€ĐžĐˇĐŧҖ҉ĐĩĐŊиК ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ даĐŊĐ¸Ņ…, ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ Ņ–ĐŊŅˆĐžĐŧ҃ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃. Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ Đ´Đ¸ŅĐē даĐŊĐ¸Ņ…, ҆ĐĩĐš Ņ„Đ°ĐšĐģ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ С ĐŋŅ€ĐžŅ†Đĩҁ҃ `sync`. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” ОйОв'ŅĐˇĐēĐžĐ˛ĐžŅŽ Ņ– ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊа ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛ Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… ĐēĐžĐŋŅ–Đš ОдĐŊĐžĐŗĐž Ņ– Ņ‚ĐžĐŗĐž Đļ Ņ„Đ°ĐšĐģ҃. Ви ĐŋОвиĐŊĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊ҃ ĐēĐžĐŋŅ–ŅŽ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐģŅŽŅ ОдĐŊ҃. ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ĐēĐžĐŋŅ–Đš ĐŊĐĩ ĐˇĐ°ŅˆĐēĐžĐ´Đ¸Ņ‚ŅŒ. data NAME DIR ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ–Đŧ'Ņ Ņ‚Đ° Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēŅ–Đ˛ даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. NAME виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— Đ´Đ¸ŅĐēа Ņ– ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ҃ĐŊŅ–ĐēаĐģҌĐŊиĐŧ. DIR — ҆Đĩ Ņ‚ĐžŅ‡Đēа ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēа ҃ Ņ„Đ°ĐšĐģĐžĐ˛Ņ–Đš ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Са ĐŋĐžŅ‚Ņ€Đĩйи, ĐŋĐžĐēи ви СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚Đĩ NAME ҄ҖĐēŅĐžĐ˛Đ°ĐŊиĐŧ. Ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ОдĐŊ҃ ĐžĐŋŅ†Ņ–ŅŽ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐē ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ, СĐŧŅ–ĐŊĐ¸Đ˛ŅˆĐ¸ NAME ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–, а ĐŋĐžŅ‚Ņ–Đŧ СаĐŋŅƒŅŅ‚Đ¸Đ˛ŅˆĐ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. ĐŖ виĐŋадĐē҃ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Đ°ŅĐžŅ†Ņ–Đ°Ņ†Ņ–Ņ ĐˇĐ´Ņ–ĐšŅĐŊŅŽŅ”Ņ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ СйĐĩŅ€ĐĩĐļĐĩĐŊĐžĐŗĐž UUID Đ´Đ¸ŅĐēŅ–Đ˛. extra NAME DIR ВизĐŊĐ°Ņ‡Đ°Ņ” ĐŊĐ°ĐˇĐ˛Ņƒ Ņ‚Đ° Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ Đ´ĐģŅ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊĐ´ `smart` Ņ‚Đ° `probe`. ĐĻĐĩ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ Ņ” Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ ĐŧĐ°ŅĐ¸Đ˛Ņƒ, аĐģĐĩ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊŅ– Đ´ĐģŅ Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊŅƒĐ˛Đ°ĐŊĐŊŅ ŅĐ¸ŅŅ‚ĐĩĐŧи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°ĐģҌĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž ĐŊа Ņ‚Đ°ĐēŅ– Đ´Đ¸ŅĐēи ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŒ ĐēĐžĐŧаĐŊди `up` Ņ‚Đ° `down`, ĐžŅĐēŅ–ĐģҌĐēи ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‰Đž вОĐŊи СавĐļди ОйĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒŅŅ. nohidden ВиĐēĐģŅŽŅ‡Đ°Ņ” Đ˛ŅŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸. В Unix ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи — ҆Đĩ ҂Җ, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŒŅŅ С `.`. ĐŖ Windows ҆Đĩ ҂Җ, Ņ‰Đž ĐŧĐ°ŅŽŅ‚ŅŒ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊиК Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚. exclude/include PATTERN ВизĐŊĐ°Ņ‡Đ°Ņ” ŅˆĐ°ĐąĐģĐžĐŊи Ņ„Đ°ĐšĐģŅ–Đ˛ айО ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ Đ´ĐģŅ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ айО вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ ҃ ĐŋŅ€ĐžŅ†Đĩҁ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐŖŅŅ– ŅˆĐ°ĐąĐģĐžĐŊи ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ҃ вĐēаСаĐŊĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃. Đ¯ĐēŅ‰Đž ĐŋĐĩŅ€ŅˆĐ¸Đš ŅˆĐ°ĐąĐģĐžĐŊ, ŅĐēиК ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ” `exclude` (виĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸), Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Đ˛Ņ–ĐŊ Ņ” `include` (вĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸), Ņ„Đ°ĐšĐģ вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž ĐļОдĐĩĐŊ ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐĩ ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš вĐēаСаĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ Ņ” `include`, айО вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš вĐēаСаĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ Ņ” `exclude`. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ€ĐžĐˇĐ´Ņ–Đģ PATTERN Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. blocksize SIZE_IN_KIBIBYTES ВизĐŊĐ°Ņ‡Đ°Ņ” ĐžŅĐŊОвĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ в ĐēŅ–ĐąŅ–ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ОдиĐŊ ĐēŅ–ĐąŅ–ĐąĐ°ĐšŅ‚ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” 1024 ĐąĐ°ĐšŅ‚Đ°Đŧ. РОСĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ 256, Ņ‰Đž ĐŧĐ°Ņ” ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛. ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. ЊОй СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅŒĐžĐŧ҃, ваĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, ŅĐēŅ‰Đž ҃ Đ˛Đ°Ņ Ņ” ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŊĐĩвĐĩĐģиĐēĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŋĐžŅ€ŅĐ´Đē҃ ĐŧŅ–ĐģŅŒĐšĐžĐŊŅ–Đ˛. ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž ҆Đĩ ĐģĐ¸ŅˆĐĩ ĐēŅ–ĐģҌĐēа ĐąĐ°ĐšŅ‚Ņ–Đ˛, Đ˛Đ¸Đ´Ņ–ĐģŅŅ”Ņ‚ŅŒŅŅ ҆ҖĐģиК ĐąĐģĐžĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ– С ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐŧа Ņ„Đ°ĐšĐģаĐŧи ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž СĐŊĐ°Ņ‡ĐŊĐžĐŗĐž ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐģи ви ĐŋОвĐŊŅ–ŅŅ‚ŅŽ СаĐŋОвĐŊŅŽŅ”Ņ‚Đĩ Đ´Đ¸ŅĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ваĐŧ ĐŊĐĩ дОСвОĐģŅŅ”Ņ‚ŅŒŅŅ Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐģҌ҈Đĩ Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ…. ОдĐŊаĐē, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊа ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊĐĩ ĐŊаĐēĐžĐŋĐ¸Ņ‡ŅƒŅ”Ņ‚ŅŒŅŅ ĐŧŅ–Đļ Đ´Đ¸ŅĐēаĐŧи даĐŊĐ¸Ņ…. Đ’Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐĩ ĐŧҖҁ҆Đĩ вĐŊĐ°ŅĐģŅ–Đ´ĐžĐē вĐĩĐģиĐēĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ОйĐŧĐĩĐļŅƒŅ” ĐģĐ¸ŅˆĐĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ даĐŊĐ¸Ņ… ĐŊа Ņ†ŅŒĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ…, а ĐŊĐĩ ĐŊа Ņ–ĐŊŅˆĐ¸Ņ…. Đ¯Đē ĐŊайĐģиĐļĐĩĐŊĐŊŅ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸, Ņ‰Đž ĐŋĐžĐģОвиĐŊа Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡Đ°Ņ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃. НаĐŋŅ€Đ¸ĐēĐģад, ĐˇŅ– 100 000 Ņ„Đ°ĐšĐģаĐŧи Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ ĐąĐģĐžĐē҃ 256 ĐšŅ–Đ‘ ви Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ 12,8 ГБ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ‰Đž ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ‚ĐžĐŗĐž, Ņ‰Đž ĐŊа Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąŅƒĐ´Đĩ ĐŊа 12,8 ГБ ĐŧĐĩĐŊ҈Đĩ ĐŧŅ–ŅŅ†Ņ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `status`. ĐĻĐĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŧŅ–ŅŅ†Ņ, ŅĐē҃ ви ĐŋОвиĐŊĐŊŅ– СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ Đ˛Ņ–ĐģҌĐŊĐžŅŽ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ… айО виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛. Đ¯ĐēŅ‰Đž ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ˛Ņ–Đ´'Ņ”ĐŧĐŊĐĩ, ҆Đĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ви ĐŊайĐģиĐļĐ°Ņ”Ņ‚ĐĩŅŅ Đ´Đž СаĐŋОвĐŊĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ– вОĐŊĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ” ĐŧҖҁ҆Đĩ, ŅĐēĐĩ ви ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đ¸. ЊОй ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ҆ҖҔҗ ĐŋŅ€ĐžĐąĐģĐĩĐŧи, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Ņ€ĐžĐˇĐ´Ņ–Đģ Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž Ņ€ĐžĐˇĐ´Ņ–Đģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŊа 12,8 ГБ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Са Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ…, ҃ Đ˛Đ°Ņ Ņ” Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи Đ´Đž 100 000 Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąĐĩС ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. ĐĨĐ¸Ņ‚Ņ€Ņ–ŅŅ‚ŅŒ, Ņ‰ĐžĐą ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Ņ€ĐžĐˇĐ´Ņ–Đģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– в Linux, ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰ĐžĐą Đ˛Ņ–Đ´Ņ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ĐēĐžĐŧаĐŊĐ´ĐžŅŽ: :mkfs.ext4 -m 0 -T largefile4 DEVICE ĐĻĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 1,5% Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ, ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 60 ГБ Đ´ĐģŅ Đ´Đ¸ŅĐēа 4 ĐĸБ, Ņ‰Đž дОСвОĐģŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 460 000 Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąĐĩС ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. hashsize SIZE_IN_BYTES ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛. РОСĐŧŅ–Ņ€ Ņ…Đĩ҈҃ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ 16 ĐąĐ°ĐšŅ‚Ņ–Đ˛ (128 ĐąŅ–Ņ‚), Ņ‰Đž ĐŧĐ°Ņ” ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛. ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. ЊОй СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅŒĐžĐŧ҃, ваĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, ŅĐēŅ‰Đž Đ˛Đ°ŅˆĐ° ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŧĐ°Ņ” ОйĐŧĐĩĐļĐĩĐŊ҃ ĐŋаĐŧ'ŅŅ‚ŅŒ. Đ¯Đē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, SnapRAID ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš виĐŧĐ°ĐŗĐ°Ņ” 1 Đ“Ņ–Đ‘ ОЗП ĐŊа ĐēĐžĐļĐŊŅ– 16 ĐĸБ даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ЗоĐēŅ€ĐĩĐŧа, Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ…ĐĩŅˆŅ–Đ˛ даĐŊĐ¸Ņ… SnapRAID виĐŧĐ°ĐŗĐ°Ņ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž $TS \times (1+HS) / BS$ ĐąĐ°ĐšŅ‚Ņ–Đ˛ ОЗП, Đ´Đĩ TS — ĐˇĐ°ĐŗĐ°ĐģҌĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ Đ˛Đ°ŅˆĐžĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…, BS — Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…, а HS — Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…. НаĐŋŅ€Đ¸ĐēĐģад, С 8 Đ´Đ¸ŅĐēаĐŧи ĐŋĐž 4 ĐĸБ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ ĐąĐģĐžĐē҃ 256 ĐšŅ–Đ‘ (1 ĐšŅ–Đ‘ = 1024 ĐąĐ°ĐšŅ‚Đ°) Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ…Đĩ҈҃ 16, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: :RAM = $(8 \times 4 \times 10^{12}) \times (1+16) / (256 \times 2^{10}) = 1.93$ Đ“Ņ–Đ‘ ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đĩ҈҃ 8, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: :RAM = $(8 \times 4 \times 10^{12}) \times (1+8) / (256 \times 2^{10}) = 1.02$ Đ“Ņ–Đ‘ ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ 512, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: :RAM = $(8 \times 4 \times 10^{12}) \times (1+16) / (512 \times 2^{10}) = 0.96$ Đ“Ņ–Đ‘ ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đĩ҈҃ 8 Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ 512, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: :RAM = $(8 \times 4 \times 10^{12}) \times (1+8) / (512 \times 2^{10}) = 0.51$ Đ“Ņ–Đ‘ autosave SIZE_IN_GIGABYTES ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ŅŅ‚Đ°ĐŊ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— айО ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋҖҁĐģŅ ĐžĐąŅ€ĐžĐąĐēи вĐēаСаĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– ГБ. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐēĐžŅ€Đ¸ŅĐŊа, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ Đ´ĐžĐ˛ĐŗĐ¸Ņ… ĐēĐžĐŧаĐŊĐ´ `sync` С ĐŊ҃ĐģŅ, ŅĐēŅ‰Đž вОĐŊи ĐąŅƒĐģи ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊŅ– ĐˇĐąĐžŅ”Đŧ ĐŧĐ°ŅˆĐ¸ĐŊи айО ĐąŅƒĐ´ŅŒ-ŅĐēĐžŅŽ Ņ–ĐŊŅˆĐžŅŽ ĐŋĐžĐ´Ņ–Ņ”ŅŽ. temp_limit TEMPERATURE_CELSIUS Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊ҃ дОСвОĐģĐĩĐŊ҃ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа в ĐĻĐĩĐģŅŒŅŅ–ŅŅ…. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž, SnapRAID ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņƒ smartctl. ĐŸĐžŅ‚ĐžŅ‡ĐŊŅ– Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐąĐžŅ‚Đ¸ SnapRAID. Đ¯ĐēŅ‰Đž ĐąŅƒĐ´ŅŒ-ŅĐēиК Đ´Đ¸ŅĐē ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” ҆ĐĩĐš ĐģŅ–ĐŧŅ–Ņ‚, ŅƒŅŅ– ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ, Ņ– Đ´Đ¸ŅĐēи ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ (ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŅ‚ŅŒ ҃ Ņ€ĐĩĐļиĐŧ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ) ĐŊа Ņ‡Đ°Ņ, виСĐŊĐ°Ņ‡ĐĩĐŊиК ĐžĐŋŅ†Ņ–Ņ”ŅŽ `temp_sleep`. ĐŸŅ–ŅĐģŅ ĐŋĐĩŅ€Ņ–ĐžĐ´Ņƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— Đ˛Ņ–Đ´ĐŊОвĐģŅŽŅŽŅ‚ŅŒŅŅ, ĐŋĐžŅ‚ĐĩĐŊŅ†Ņ–ĐšĐŊĐž СĐŊĐžĐ˛Ņƒ ĐŋŅ€Đ¸ĐˇŅƒĐŋиĐŊŅŅŽŅ‡Đ¸ŅŅŒ, ŅĐēŅ‰Đž ĐģŅ–ĐŧŅ–Ņ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸ СĐŊĐžĐ˛Ņƒ Đ´ĐžŅŅĐŗĐŊŅƒŅ‚Đ¸Đš. ĐŸŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐąĐžŅ‚Đ¸ SnapRAID Ņ‚Đ°ĐēĐžĐļ аĐŊаĐģŅ–ĐˇŅƒŅ” ĐēŅ€Đ¸Đ˛Ņƒ ĐŊĐ°ĐŗŅ€Ņ–Đ˛Đ°ĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа Ņ‚Đ° ĐžŅ†Ņ–ĐŊŅŽŅ” Đ´ĐžĐ˛ĐŗĐžŅŅ‚Ņ€ĐžĐēĐžĐ˛Ņƒ ŅŅ‚Đ°ĐąŅ–ĐģҌĐŊ҃ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ, ŅĐēĐžŅ— вОĐŊи, ŅĐē ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Đ´ĐžŅŅĐŗĐŊŅƒŅ‚ŅŒ, ŅĐēŅ‰Đž аĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚ŅŒŅŅ. ĐžŅ†Ņ–ĐŊĐēа виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ ĐŋҖҁĐģŅ Ņ‚ĐžĐŗĐž, ŅĐē Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ´Đ¸ŅĐēа ĐŋŅ–Đ´Đ˛Đ¸Ņ‰Đ¸ĐģĐ°ŅŅ Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Đ°ĐˇĐ¸, Ņ‰Đž ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒŅ” ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– даĐŊĐ¸Ņ… Đ´ĐģŅ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ ĐŊĐ°Đ´Ņ–ĐšĐŊĐžĐŗĐž ҂ҀĐĩĐŊĐ´Ņƒ. ĐĻŅ ĐŋŅ€ĐžĐŗĐŊОСОваĐŊа ŅŅ‚Đ°ĐąŅ–ĐģҌĐŊа Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ”Ņ‚ŅŒŅŅ в Đ´ŅƒĐļĐēĐ°Ņ… ĐŋĐžŅ€ŅƒŅ‡ Ņ–Đˇ ĐŋĐžŅ‚ĐžŅ‡ĐŊиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Ņ– Đ´ĐžĐŋĐžĐŧĐ°ĐŗĐ°Ņ” ĐžŅ†Ņ–ĐŊĐ¸Ņ‚Đ¸, Ņ‡Đ¸ Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅ” ĐžŅ…ĐžĐģОдĐļĐĩĐŊĐŊŅ ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐĻŅ ĐžŅ†Ņ–ĐŊŅŽĐ˛Đ°ĐŊа Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Ņ” ĐģĐ¸ŅˆĐĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊĐžŅŽ Ņ– ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ SnapRAID. Đ”Ņ–Ņ— ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи ĐąĐ°ĐˇŅƒŅŽŅ‚ŅŒŅŅ виĐēĐģŅŽŅ‡ĐŊĐž ĐŊа Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊĐž виĐŧŅ–Ņ€ŅĐŊĐ¸Ņ… Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ°Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. ДĐģŅ виĐēĐžĐŊаĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž аĐŊаĐģŅ–ĐˇŅƒ SnapRAID ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа Đ´ĐžĐ˛Ņ–Đ´ĐēОва Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐĄĐŋĐžŅ‡Đ°Ņ‚Đē҃ Đ˛Ņ–ĐŊ ĐŊаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ ĐˇŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ Ņ—Ņ— С Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… аĐŋĐ°Ņ€Đ°Ņ‚ĐŊĐ¸Ņ… Đ´Đ°Ņ‚Ņ‡Đ¸ĐēŅ–Đ˛. Đ¯ĐēŅ‰Đž Đ´Đž ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐžĐŗĐž Đ´Đ°Ņ‚Ņ‡Đ¸Đēа ĐŊĐĩĐŧĐžĐļĐģивО ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ, Đ˛Ņ–ĐŊ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ĐŊаКĐŊиĐļŅ‡Ņƒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа, виĐŧŅ–Ņ€ŅĐŊ҃ ĐŊа ĐŋĐžŅ‡Đ°Ņ‚Đē҃ СаĐŋ҃ҁĐē҃, ŅĐē Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ Đ´ĐžĐ˛Ņ–Đ´ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš SnapRAID ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐģĐ¸ŅˆĐĩ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ĐŊĐ°ĐšĐŗĐ°Ņ€ŅŅ‡Ņ–ŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа. ЊОй Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ -A айО --stats. temp_sleep TIME_IN_MINUTES Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, ҃ Ņ…Đ˛Đ¸ĐģиĐŊĐ°Ņ…, ĐēĐžĐģи Đ´ĐžŅŅĐŗĐŊŅƒŅ‚Đž ĐģŅ–ĐŧŅ–Ņ‚Ņƒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸. ĐŸŅ€ĐžŅ‚ŅĐŗĐžĐŧ Ņ†ŅŒĐžĐŗĐž ĐŋĐĩŅ€Ņ–ĐžĐ´Ņƒ Đ´Đ¸ŅĐēи СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ ĐˇŅƒĐŋиĐŊĐĩĐŊиĐŧи. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ 5 Ņ…Đ˛Đ¸ĐģиĐŊ. pool DIR ВизĐŊĐ°Ņ‡Đ°Ņ” ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ, Đ´Đĩ ŅŅ‚Đ˛ĐžŅ€ŅŽŅ”Ņ‚ŅŒŅŅ Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди `pool`. ĐšĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŋОвиĐŊĐĩĐŊ вĐļĐĩ ҖҁĐŊŅƒĐ˛Đ°Ņ‚Đ¸. share UNC_DIR ВизĐŊĐ°Ņ‡Đ°Ņ” ҈ĐģŅŅ… Windows UNC, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊиК Đ´ĐģŅ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ´Đ¸ŅĐēŅ–Đ˛. Đ¯ĐēŅ‰Đž Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ вĐēаСаĐŊа, ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ, ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ– в ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– pool, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ҆ĐĩĐš ҈ĐģŅŅ… UNC Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ´Đ¸ŅĐēŅ–Đ˛. БĐĩС ҆ҖҔҗ ĐžĐŋ҆Җҗ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊŅ– ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐģĐžĐēаĐģҌĐŊŅ– ҈ĐģŅŅ…Đ¸, Ņ‰Đž ĐŊĐĩ дОСвОĐģŅŅ” ҁĐŋŅ–ĐģҌĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ pool ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃. ХиĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ Ņ„ĐžŅ€ĐŧŅƒŅŽŅ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ вĐēаСаĐŊĐžĐŗĐž ҈ĐģŅŅ…Ņƒ UNC, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ŅĐē СаСĐŊĐ°Ņ‡ĐĩĐŊĐž в ĐžĐŋ҆Җҗ `data`, Ņ–, ĐŊĐ°Ņ€ĐĩŅˆŅ‚Ņ–, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ‚Đ° Ņ–Đŧ'Ņ Ņ„Đ°ĐšĐģ҃. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Windows. smartctl DISK/PARITY OPTIONS... ВизĐŊĐ°Ņ‡Đ°Ņ” ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēŅ– ĐžĐŋ҆Җҗ smartctl Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛ SMART Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĻĐĩ ĐŧĐžĐļĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ Đ´ĐģŅ RAID-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Ņ–Đ˛ Ņ‚Đ° Đ´ĐĩŅĐēĐ¸Ņ… USB-Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ–. ЗаĐŋОвĐŊŅŽĐ˛Đ°Ņ‡ %s СаĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Ņ–ĐŧĐĩĐŊĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ, аĐģĐĩ Đ˛Ņ–ĐŊ ĐŊĐĩОйОв'ŅĐˇĐēОвиК Đ´ĐģŅ ҄ҖĐēŅĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē RAID-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Đ¸. DISK — ҆Đĩ Ņ‚Đĩ ŅĐ°ĐŧĐĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, вĐēаСаĐŊĐĩ в ĐžĐŋ҆Җҗ `data`. PARITY — ҆Đĩ ОдĐŊĐĩ С Ņ–ĐŧĐĩĐŊ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` айО `z-parity`. ĐŖ вĐēаСаĐŊĐ¸Ņ… OPTIONS Ņ€ŅĐ´ĐžĐē `%s` СаĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Ņ–ĐŧĐĩĐŊĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ. ДĐģŅ RAID-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Ņ–Đ˛ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž ҄ҖĐēŅĐžĐ˛Đ°ĐŊиК, Ņ– ваĐŧ ĐŧĐžĐļĐĩ ĐŊĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `%s`. ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ Đ´Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— smartmontools Đ´ĐģŅ ĐŧĐžĐļĐģĐ¸Đ˛Đ¸Ņ… ĐžĐŋŅ†Ņ–Đš: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices НаĐŋŅ€Đ¸ĐēĐģад: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Đ†ĐŗĐŊĐžŅ€ŅƒŅ” вĐēаСаĐŊиК Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ SMART ĐŋŅ€Đ¸ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ– ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ĐŧОви Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐēĐžŅ€Đ¸ŅĐŊа, ŅĐēŅ‰Đž Đ´Đ¸ŅĐē ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ” ĐŊĐĩĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊŅ– айО ĐžĐŧаĐŊĐģĐ¸Đ˛Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŋĐĩвĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°. DISK — ҆Đĩ Ņ‚Đĩ ŅĐ°ĐŧĐĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, вĐēаСаĐŊĐĩ в ĐžĐŋ҆Җҗ `data`. PARITY — ҆Đĩ ОдĐŊĐĩ С Ņ–ĐŧĐĩĐŊ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` айО `z-parity`. ĐĄĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ * ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ° ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ `Current Pending Sector Count` ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ…: :smartignore * 197 ЊОй Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ĐģĐ¸ŅˆĐĩ ĐŊа ĐŋĐĩŅ€ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐē҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: :smartignore parity 197 ĐŸŅ€Đ¸ĐēĐģади ĐŸŅ€Đ¸ĐēĐģад Ņ‚Đ¸ĐŋĐžĐ˛ĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ Unix: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 ĐŸŅ€Đ¸ĐēĐģад Ņ‚Đ¸ĐŋĐžĐ˛ĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ Windows: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 ШайĐģĐžĐŊ (Pattern) ШайĐģĐžĐŊи СайĐĩСĐŋĐĩŅ‡ŅƒŅŽŅ‚ŅŒ ĐŗĐŊŅƒŅ‡ĐēиК ҁĐŋĐžŅŅ–Đą ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģŅ–Đ˛ Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ айО виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ŅĐ¸ĐŧвОĐģи ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊОвĐēи (globbing), ви ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸Đģа, ŅĐēŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊиĐŧ Ņ–ĐŧĐĩĐŊаĐŧ Ņ„Đ°ĐšĐģŅ–Đ˛ айО ҆ҖĐģиĐŧ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ°Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ ĐąĐĩС Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž ҈ĐģŅŅ…Ņƒ. ЗĐŊаĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ `?` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃, ĐēҀҖĐŧ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēа ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ĐĻĐĩ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ ĐšĐžĐŗĐž ĐēĐžŅ€Đ¸ŅĐŊиĐŧ Đ´ĐģŅ ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ–ĐŧĐĩĐŊ Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ–Đˇ СĐŧŅ–ĐŊĐŊиĐŧи ŅĐ¸ĐŧвОĐģаĐŧи, ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ ОдĐŊиĐŧ Ņ€Ņ–Đ˛ĐŊĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ. ОдиĐŊĐ°Ņ€ĐŊа ĐˇŅ–Ņ€ĐžŅ‡Đēа `*` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊĐžŅŅ‚Ņ– ŅĐ¸ĐŧвОĐģŅ–Đ˛, аĐģĐĩ, ŅĐē Ņ– СĐŊаĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ, вОĐŊа ĐŊŅ–ĐēĐžĐģи ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ‚Đ¸ĐŊĐ°Ņ” ĐŧĐĩĐļŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ВоĐŊа ĐˇŅƒĐŋиĐŊŅŅ”Ņ‚ŅŒŅŅ ĐŊа ĐŋŅ€ŅĐŧŅ–Đš ĐēĐžŅŅ–Đš Ņ€Đ¸ŅŅ†Ņ–, Ņ‰Đž Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ—Ņ— ĐŋŅ€Đ¸Đ´Đ°Ņ‚ĐŊĐžŅŽ Đ´ĐģŅ ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ҈ĐģŅŅ…Ņƒ. ĐĻĐĩ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊа ĐŋОвĐĩĐ´Ņ–ĐŊĐēа ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊĐžĐ˛ĐžŅ‡ĐŊĐ¸Ņ… СĐŊаĐēŅ–Đ˛, СĐŊаКОĐŧа С ĐēĐžĐŧаĐŊĐ´ĐŊĐžŅ— ОйОĐģĐžĐŊĐēи (shell globbing). ĐŸĐžĐ´Đ˛Ņ–ĐšĐŊа ĐˇŅ–Ņ€ĐžŅ‡Đēа `**` Ņ” ĐŋĐžŅ‚ŅƒĐļĐŊŅ–ŅˆĐžŅŽ, вОĐŊа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊĐžŅŅ‚Ņ– ŅĐ¸ĐŧвОĐģŅ–Đ˛, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ĐĻĐĩ дОСвОĐģŅŅ” ŅˆĐ°ĐąĐģĐžĐŊаĐŧ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēĐžĐŧ Ņ€Ņ–Đ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. КоĐģи `**` С'ŅĐ˛ĐģŅŅ”Ņ‚ŅŒŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž в ŅˆĐ°ĐąĐģĐžĐŊŅ–, вОĐŊа ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐŊ҃ĐģŅŽ айО ĐąŅ–ĐģҌ҈Đĩ ŅĐ¸ĐŧвОĐģаĐŧ, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐēĐžŅŅ– Ņ€Đ¸ŅĐēи ĐŧŅ–Đļ ĐžŅ‚ĐžŅ‡ŅƒŅŽŅ‡Đ¸Đŧ ĐģŅ–Ņ‚ĐĩŅ€Đ°ĐģҌĐŊиĐŧ Ņ‚ĐĩĐēŅŅ‚ĐžĐŧ. НайваĐļĐģĐ¸Đ˛Ņ–ŅˆĐ¸Đŧ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ `**` Ņ” ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊа Ņ„ĐžŅ€Đŧа `/**/`. ВоĐŊа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐŊ҃ĐģŅŽ айО ĐąŅ–ĐģҌ҈Đĩ ĐŋОвĐŊиĐŧ Ņ€Ņ–Đ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, Ņ‰Đž дОСвОĐģŅŅ” ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģŅŅ‚Đ¸ Ņ„Đ°ĐšĐģи ĐŊа ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŗĐģийиĐŊŅ– в Đ´ĐĩŅ€ĐĩĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ĐŊĐĩ СĐŊĐ°ŅŽŅ‡Đ¸ Ņ‚ĐžŅ‡ĐŊĐžŅ— ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ¸ ҈ĐģŅŅ…Ņƒ. НаĐŋŅ€Đ¸ĐēĐģад, ŅˆĐ°ĐąĐģĐžĐŊ `src/**/main.js` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” `src/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ĐŊ҃ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛), `src/ui/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ОдĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ) Ņ‚Đ° `src/ui/components/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē Đ´Đ˛ĐžŅ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛). КĐģĐ°ŅĐ¸ ŅĐ¸ĐŧвОĐģŅ–Đ˛ Ņ–Đˇ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊĐ¸Ņ… Đ´ŅƒĐļĐžĐē `[]` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃ С виСĐŊĐ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Ņƒ айО Đ´Ņ–Đ°ĐŋаСОĐŊ҃. Đ¯Đē Ņ– Ņ–ĐŊŅˆŅ– ОдĐŊĐžŅĐ¸ĐŧвОĐģҌĐŊŅ– ŅˆĐ°ĐąĐģĐžĐŊи, вОĐŊи ĐŊĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēаĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. КĐģĐ°ŅĐ¸ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ Đ´Ņ–Đ°ĐŋаСОĐŊи Ņ‚Đ° СаĐŋĐĩŅ€Đĩ҇ĐĩĐŊĐŊŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ СĐŊаĐē҃ ĐžĐēĐģиĐē҃. Đ¤ŅƒĐŊдаĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊа Đ˛Ņ–Đ´ĐŧŅ–ĐŊĐŊŅ–ŅŅ‚ŅŒ, ŅĐē҃ ҁĐģŅ–Đ´ ĐŋаĐŧ'ŅŅ‚Đ°Ņ‚Đ¸, ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰Đž `*`, `?` Ņ‚Đ° ĐēĐģĐ°ŅĐ¸ ŅĐ¸ĐŧвОĐģŅ–Đ˛ ŅƒŅŅ– Đ´ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ ĐŧĐĩĐļ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ Ņ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ в ĐŧĐĩĐļĐ°Ņ… ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ҈ĐģŅŅ…Ņƒ, Ņ‚ĐžĐ´Ņ– ŅĐē `**` — Ņ”Đ´Đ¸ĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ, ŅĐēиК ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ҇ĐĩŅ€ĐĩС Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. Đ†ŅĐŊŅƒŅ” Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Ņ–ĐˇĐŊŅ– Ņ‚Đ¸Đŋи ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛: =FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–Đŧ'ŅĐŧ FILE. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐŊĐĩ Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš. =DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐē҃ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–ŅŽ С Ņ–Đŧ'ŅĐŧ DIR Ņ– Đ˛ŅĐĩ, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ–. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš, а ĐŊĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛. =/PATH/FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ҈ĐģŅŅ… Đ´Đž Ņ„Đ°ĐšĐģ҃. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐŊĐĩ Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš. =/PATH/DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ҈ĐģŅŅ… Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Ņ— Ņ– Đ˛ŅĐĩ, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ–. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš, а ĐŊĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛. КоĐģи ви вĐēĐ°ĐˇŅƒŅ”Ņ‚Đĩ Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊиК ҈ĐģŅŅ…, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ С /, Đ˛Ņ–ĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž ĐēĐžŅ€ĐĩĐŊĐĩĐ˛ĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŧĐ°ŅĐ¸Đ˛Ņƒ, а ĐŊĐĩ Đ´Đž ĐēĐžŅ€ĐĩĐŊĐĩĐ˛ĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐģĐžĐēаĐģҌĐŊĐžŅ— Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐŖ Windows ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊ҃ ҁĐēҖҁĐŊ҃ Ņ€Đ¸ŅĐē҃ \ СаĐŧŅ–ŅŅ‚ŅŒ ĐŋŅ€ŅĐŧĐžŅ— ҁĐēҖҁĐŊĐžŅ— Ņ€Đ¸ŅĐēи /. ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows, С'Ņ”Đ´ĐŊаĐŊĐŊŅ, Ņ‚ĐžŅ‡Đēи ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Ņ–ĐŊŅˆŅ– ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows Ņ€ĐžĐˇĐŗĐģŅĐ´Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē Ņ„Đ°ĐšĐģи, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´ĐģŅ Ņ—Ņ… виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ„Đ°ĐšĐģ҃, а ĐŊĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ. Đ¯ĐēŅ‰Đž Ņ–Đŧ'Ņ Ņ„Đ°ĐšĐģ҃ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģи `*`, `?`, `[`, айО `]`, ви ĐŋОвиĐŊĐŊŅ– ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ…, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ Ņ—Ņ… Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Ņ–Ņ— ŅĐē ŅĐ¸ĐŧвОĐģ҃ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ. В Unix ŅĐ¸ĐŧвОĐģĐžĐŧ ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ” `\`; ҃ Windows — `^`. КоĐģи ŅˆĐ°ĐąĐģĐžĐŊ СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ в ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, ви ĐŋОвиĐŊĐŊŅ– ĐŋĐžĐ´Đ˛ĐžŅ—Ņ‚Đ¸ ŅĐ¸ĐŧвОĐģ ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą СаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐšĐžĐŗĐž Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Ņ–Ņ— ĐēĐžĐŧаĐŊĐ´ĐŊĐžŅŽ ОйОĐģĐžĐŊĐēĐžŅŽ. ĐŖ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊŅ– ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗŅ–Ņ— Đ´ĐģŅ ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸. НайĐŋŅ€ĐžŅŅ‚Ņ–ŅˆĐ¸Đš ĐŋŅ–Đ´Ņ…Ņ–Đ´ — виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ŅĐēŅ– ви ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐģŅŅ‚Đ¸. НаĐŋŅ€Đ¸ĐēĐģад: :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` :exclude *.unrecoverable :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐēĐžŅ€ĐĩĐŊĐĩвиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `/lost+found` :exclude /lost+found/ :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `tmp` :exclude tmp/ ĐŸŅ€ĐžŅ‚Đ¸ĐģĐĩĐļĐŊиК ĐŋŅ–Đ´Ņ…Ņ–Đ´ — виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐēĐģад: :# ВĐēĐģŅŽŅ‡Đ°Ņ” ĐģĐ¸ŅˆĐĩ Đ´ĐĩŅĐēŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ :include /movies/ :include /musics/ :include /pictures/ ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš ĐŋŅ–Đ´Ņ…Ņ–Đ´ — СĐŧŅ–ŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` Ņ‚Đ° `include`. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ĐŋĐžŅ€ŅĐ´ĐžĐē ĐŋŅ€Đ°Đ˛Đ¸Đģ ваĐļĐģивиК. РаĐŊŅ–ŅˆŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŧĐ°ŅŽŅ‚ŅŒ ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ ĐŊад ĐŋŅ–ĐˇĐŊŅ–ŅˆĐ¸Đŧи. ДĐģŅ ҁĐŋŅ€ĐžŅ‰ĐĩĐŊĐŊŅ ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude`, а ĐŋĐžŅ‚Ņ–Đŧ ŅƒŅŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐēĐģад: :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` :exclude *.unrecoverable :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `tmp` :exclude tmp/ :# ВĐēĐģŅŽŅ‡Đ°Ņ” ĐģĐ¸ŅˆĐĩ Đ´ĐĩŅĐēŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ :include /movies/ :include /musics/ :include /pictures/ ĐŖ ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -f, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ŅˆĐ°ĐąĐģĐžĐŊи `include`. НаĐŋŅ€Đ¸ĐēĐģад: :# ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи .mp3. :# В Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐģаĐŋĐēи, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ :# Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ ОйОĐģĐžĐŊĐēĐžŅŽ. :snapraid -f "*.mp3" check В Unix, ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– ŅĐ¸ĐŧвОĐģŅ–Đ˛ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ в ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, ви ĐŋОвиĐŊĐŊŅ– Đ˛ĐˇŅŅ‚Đ¸ Ņ—Ņ… ҃ ĐģаĐŋĐēи, Ņ‰ĐžĐą СаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ Ņ—Ņ… Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅŽ ОйОĐģĐžĐŊĐēĐžŅŽ. Đ†ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ (Ignore File) На Đ´ĐžĐ´Đ°Ņ‚ĐžĐē Đ´Đž ĐŗĐģОйаĐģҌĐŊĐ¸Ņ… ĐŋŅ€Đ°Đ˛Đ¸Đģ ҃ Ņ„Đ°ĐšĐģŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€ĐžĐˇĐŧŅ–Ņ‰ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģи `.snapraidignore` в ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ĐŧĐ°ŅĐ¸Đ˛Ņƒ Đ´ĐģŅ виСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´Đĩ҆ĐĩĐŊŅ‚Ņ€Đ°ĐģŅ–ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋŅ€Đ°Đ˛Đ¸Đģ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. ĐŸŅ€Đ°Đ˛Đ¸Đģа, виСĐŊĐ°Ņ‡ĐĩĐŊŅ– в `.snapraidignore`, ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐŋҖҁĐģŅ ĐŋŅ€Đ°Đ˛Đ¸Đģ ҃ Ņ„Đ°ĐšĐģŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—. ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž вОĐŊи ĐŧĐ°ŅŽŅ‚ŅŒ Đ˛Đ¸Ņ‰Đ¸Đš ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– Đ´ĐģŅ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐąŅƒĐģи вĐēĐģŅŽŅ‡ĐĩĐŊŅ– ĐŗĐģОйаĐģҌĐŊĐžŅŽ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ”ŅŽ. ФаĐēŅ‚Đ¸Ņ‡ĐŊĐž, ŅĐēŅ‰Đž ĐģĐžĐēаĐģҌĐŊĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ ĐŗĐģОйаĐģҌĐŊĐ¸Ņ… ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. Đ›ĐžĐŗŅ–Đēа ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛ ҃ `.snapraidignore` ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŽŅ” ĐŗĐģОйаĐģҌĐŊ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŽ, аĐģĐĩ ĐŋŅ€Đ¸Đ˛'ŅĐˇŅƒŅ” ŅˆĐ°ĐąĐģĐžĐŊи Đ´Đž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, в ŅĐēĐžĐŧ҃ СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ: =FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ Ņ–Đˇ Ņ–Đŧ'ŅĐŧ FILE ҃ Ņ†ŅŒĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– айО ĐŊиĐļ҇Đĩ. ĐĻĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” Ņ‚Đ¸Đŧ ŅĐ°ĐŧиĐŧ ĐŋŅ€Đ°Đ˛Đ¸ĐģаĐŧ ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊОвĐēи, Ņ‰Đž Ņ– в ĐŗĐģОйаĐģҌĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊŅ–. =DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ–Đˇ Ņ–Đŧ'ŅĐŧ DIR Ņ‚Đ° вĐĩҁҌ ĐšĐžĐŗĐž вĐŧҖҁ҂, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ в Ņ†ŅŒĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– айО ĐŊиĐļ҇Đĩ. =/PATH/FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК Ņ„Đ°ĐšĐģ Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ `.snapraidignore`. =/PATH/DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ‚Đ° вĐĩҁҌ ĐšĐžĐŗĐž вĐŧҖҁ҂ Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ `.snapraidignore`. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ ĐŗĐģОйаĐģҌĐŊĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—, Ņ„Đ°ĐšĐģи `.snapraidignore` ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ; ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅˆĐ°ĐąĐģĐžĐŊи `include` айО СаĐŋĐĩŅ€Đĩ҇ĐĩĐŊĐŊŅ (!). НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ҃ Đ˛Đ°Ņ Ņ” `.snapraidignore` ҃ `/mnt/disk1/projects/`: :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐĸІЛĐŦКИ /mnt/disk1/projects/output.bin :/output.bin :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ–Đˇ ĐŊĐ°ĐˇĐ˛ĐžŅŽ `build` Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– projects/ :build/ :# ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК .tmp Ņ„Đ°ĐšĐģ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– projects/ айО ĐšĐžĐŗĐž ĐŋŅ–Đ´ĐŋаĐŋĐžĐē :*.tmp ВĐŧҖҁ҂ (Content) SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ҁĐŋĐ¸ŅĐžĐē Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ– ҁ҃Đŧи Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ. ĐĻĐĩ ĐąŅ–ĐŊĐ°Ņ€ĐŊиК Ņ„Đ°ĐšĐģ, ŅĐēиК ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ€Đ°ĐˇĐžĐŧ С ŅƒŅŅ–Đŧа ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊиĐŧи ҁ҃ĐŧаĐŧи Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ—Ņ… ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇŅ‡Đ¸Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ Ņ‚Đ° СаĐŋĐ¸ŅŅƒŅ”Ņ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` Ņ‚Đ° `scrub` Ņ‚Đ° ĐˇŅ‡Đ¸Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `fix`, `check` Ņ‚Đ° `status`. ĐŸĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ (Parity) SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Đ°ŅˆĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ ҃ Ņ„Đ°ĐšĐģĐ°Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻĐĩ ĐąŅ–ĐŊĐ°Ņ€ĐŊŅ– Ņ„Đ°ĐšĐģи, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ŅƒŅŅ–Ņ… ĐąĐģĐžĐēŅ–Đ˛, виСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ… ҃ Ņ„Đ°ĐšĐģŅ– `content`. ĐĻŅ– Ņ„Đ°ĐšĐģи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ Ņ‚Đ° СаĐŋĐ¸ŅŅƒŅŽŅ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` Ņ‚Đ° `fix` Ņ– ĐģĐ¸ŅˆĐĩ ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `scrub` Ņ‚Đ° `check`. ĐšĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ (Encoding) SnapRAID в Unix Ņ–ĐŗĐŊĐžŅ€ŅƒŅ” ĐąŅƒĐ´ŅŒ-ŅĐēĐĩ ĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ. Đ’Ņ–ĐŊ ĐˇŅ‡Đ¸Ņ‚ŅƒŅ” Ņ‚Đ° СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛ С Ņ‚Đ¸Đŧ ŅĐ°ĐŧиĐŧ ĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧĐžŅŽ. ĐŖ Windows ŅƒŅŅ– Ņ–ĐŧĐĩĐŊа, ĐˇŅ‡Đ¸Ņ‚Đ°ĐŊŅ– С Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи, ĐēĐžĐŊвĐĩŅ€Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ Ņ‚Đ° ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– UTF-8. ЊОй Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļаĐģĐ¸ŅŅ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŋОвиĐŊĐŊŅ– Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐēĐžĐŊŅĐžĐģҌ Windows ҃ Ņ€ĐĩĐļиĐŧ UTF-8 Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди `chcp 65001` Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅˆŅ€Đ¸Ņ„Ņ‚ TrueType, Ņ‚Đ°ĐēиК ŅĐē `Lucida Console`, ŅĐē ŅˆŅ€Đ¸Ņ„Ņ‚ ĐēĐžĐŊŅĐžĐģŅ–. ĐĻĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐģĐ¸ŅˆĐĩ ĐŊа ĐŊĐ°Đ´Ņ€ŅƒĐēОваĐŊŅ– Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛; ŅĐēŅ‰Đž ви ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģŅŅ”Ņ‚Đĩ Đ˛Đ¸Đ˛Ņ–Đ´ ĐēĐžĐŊŅĐžĐģŅ– ҃ Ņ„Đ°ĐšĐģ, ĐžŅ‚Ņ€Đ¸ĐŧаĐŊиК Ņ„Đ°ĐšĐģ СавĐļди ĐąŅƒĐ´Đĩ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– UTF-8. ĐĐ˛Ņ‚ĐžŅ€ŅŅŒĐēĐĩ ĐŋŅ€Đ°Đ˛Đž (Copyright) ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊиК Đ°Đ˛Ņ‚ĐžŅ€ŅŅŒĐēиĐŧ ĐŋŅ€Đ°Đ˛ĐžĐŧ (C) 2025 Andrea Mazzoleni Див. Ņ‚Đ°ĐēĐžĐļ (See Also) snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-uk.txt000066400000000000000000003311461522717156100170130ustar00rootroot00000000000000 ================================================= SnapRAID Đ ĐĩСĐĩŅ€Đ˛ĐŊĐĩ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Đ¸Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņ–Đ˛ ================================================= 1 ĐšĐžŅ€ĐžŅ‚ĐēиК ĐžĐŋĐ¸Ņ =============== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 ОĐŋĐ¸Ņ ====== SnapRAID — ҆Đĩ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, Ņ€ĐžĐˇŅ€ĐžĐąĐģĐĩĐŊа Đ´ĐģŅ Đ´Đ¸ŅĐēĐžĐ˛Đ¸Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņ–Đ˛, ŅĐēа СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… ҃ виĐŋадĐē҃ Đ˛Ņ–Đ´ĐŧОви Đ´Đž ҈ĐĩŅŅ‚Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛. В ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Đ´ĐžĐŧĐ°ŅˆĐŊŅ–Ņ… ĐŧĐĩĐ´Ņ–Đ°Ņ†ĐĩĐŊŅ‚Ņ€Ņ–Đ˛ С вĐĩĐģиĐēиĐŧи Ņ„Đ°ĐšĐģаĐŧи, Ņ‰Đž Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ, SnapRAID ĐŋŅ€ĐžĐŋĐžĐŊŅƒŅ” ĐēŅ–ĐģҌĐēа Ņ„ŅƒĐŊĐēŅ†Ņ–Đš: * Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи, вĐļĐĩ СаĐŋОвĐŊĐĩĐŊŅ– Ņ„Đ°ĐšĐģаĐŧи, ĐąĐĩС ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐžŅŅ‚Ņ– Ņ—Ņ… ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‡Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ĐŊĐ¸Ņ… ŅĐē ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš. * ĐŖŅŅ– Đ˛Đ°ŅˆŅ– даĐŊŅ– Ņ…ĐĩŅˆŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ– даĐŊĐ¸Ņ… Ņ‚Đ° СаĐŋĐžĐąŅ–ĐŗĐ°ĐŊĐŊŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐŊŅŽ. * КоĐģи ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Ņ–Đ´ĐŧОвиĐģи, ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ˛Ņ‚Ņ€Đ°Ņ‚Đ° даĐŊĐ¸Ņ… ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đ¸ŅĐēаĐŧи, Ņ‰Đž ĐŋĐžŅŅ‚Ņ€Đ°ĐļдаĐģи; даĐŊŅ– ĐŊа Ņ–ĐŊŅˆĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ… СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи. * Đ¯ĐēŅ‰Đž ви виĐŋадĐēОвО видаĐģиĐģи Ņ„Đ°ĐšĐģи ĐŊа Đ´Đ¸ŅĐē҃, ĐŧĐžĐļĐģивĐĩ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. * Đ”Đ¸ŅĐēи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŧĐ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€. * Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи в ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ. * SnapRAID ĐŊĐĩ ĐąĐģĐžĐēŅƒŅ” Đ˛Đ°ŅˆŅ– даĐŊŅ–; ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸ĐŋиĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ в ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ ĐąĐĩС ĐŋĐĩŅ€ĐĩŅ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐŊŅ даĐŊĐ¸Ņ…. * ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ„Đ°ĐšĐģ҃ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Ņ€ĐžĐˇĐēŅ€ŅƒŅ‚Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ОдиĐŊ Đ´Đ¸ŅĐē, Ņ‰Đž ĐˇĐ°ĐžŅ‰Đ°Đ´ĐļŅƒŅ” ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐĩĐŊĐĩŅ€ĐŗŅ–ŅŽ Ņ‚Đ° СĐŧĐĩĐŊŅˆŅƒŅ” ҈҃Đŧ. ДĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— Đ˛Ņ–Đ´Đ˛Ņ–Đ´Đ°ĐšŅ‚Đĩ ĐžŅ„Ņ–Ņ†Ņ–ĐšĐŊиК ŅĐ°ĐšŅ‚ SnapRAID: https://www.snapraid.it/ 3 ОбĐŧĐĩĐļĐĩĐŊĐŊŅ =========== SnapRAID Ņ” ĐŗŅ–ĐąŅ€Đ¸Đ´ĐžĐŧ ĐŧŅ–Đļ RAID Ņ‚Đ° ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐžŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, ĐŋŅ€Đ°ĐŗĐŊŅƒŅ‡Đ¸ ĐŋĐžŅ”Đ´ĐŊĐ°Ņ‚Đ¸ ĐŊаКĐēŅ€Đ°Ņ‰Ņ– ĐŋĐĩŅ€ĐĩĐ˛Đ°ĐŗĐ¸ ĐžĐąĐžŅ…. ОдĐŊаĐē, Đ˛Ņ–ĐŊ ĐŧĐ°Ņ” Đ´ĐĩŅĐēŅ– ОйĐŧĐĩĐļĐĩĐŊĐŊŅ, ŅĐēŅ– ҁĐģŅ–Đ´ Đ˛Ņ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐĩŅ€ĐĩĐ´ ĐšĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ. ĐžŅĐŊОвĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰Đž ŅĐēŅ‰Đž Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ, а ви ĐŊĐĩŅ‰ĐžĐ´Đ°Đ˛ĐŊĐž ĐŊĐĩ виĐēĐžĐŊŅƒĐ˛Đ°Đģи ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐĩ СĐŧĐžĐŗŅ‚Đ¸ ĐŋОвĐŊŅ–ŅŅ‚ŅŽ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ–. КоĐŊĐēŅ€ĐĩŅ‚ĐŊŅ–ŅˆĐĩ, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… ĐžĐąŅŅĐŗĐžĐŧ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… айО видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐĻĐĩ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž СĐŧŅ–ĐŊĐĩĐŊŅ– айО видаĐģĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ. ĐžŅŅŒ Ņ‡ĐžĐŧ҃ SnapRAID ĐēŅ€Đ°Ņ‰Đĩ ĐŋŅ–Đ´Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Đ´ĐģŅ даĐŊĐ¸Ņ…, ŅĐēŅ– Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. З Ņ–ĐŊŅˆĐžĐŗĐž йОĐē҃, Ņ‰ĐžĐšĐŊĐž дОдаĐŊŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐŋĐĩŅ€Đĩ҈ĐēОдĐļĐ°ŅŽŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅŽ вĐļĐĩ ҖҁĐŊŅƒŅŽŅ‡Đ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛. Ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ ĐģĐ¸ŅˆĐĩ ĐŊĐĩŅ‰ĐžĐ´Đ°Đ˛ĐŊĐž дОдаĐŊŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ‰Đž вОĐŊи СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ. ІĐŊŅˆŅ– ОйĐŧĐĩĐļĐĩĐŊĐŊŅ SnapRAID: * З SnapRAID ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ ҉Đĩ Ņ” ĐžĐēŅ€ĐĩĐŧŅ– Ņ„Đ°ĐšĐģĐžĐ˛Ņ– ŅĐ¸ŅŅ‚ĐĩĐŧи Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. З RAID ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ОдĐŊ҃ вĐĩĐģиĐē҃ Ņ„Đ°ĐšĐģĐžĐ˛Ņƒ ŅĐ¸ŅŅ‚ĐĩĐŧ҃. * SnapRAID ĐŊĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ҇ĐĩŅ€ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ (striping) даĐŊĐ¸Ņ…. З RAID ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ ĐˇĐ°Đ˛Đ´ŅĐēи ҇ĐĩŅ€ĐŗŅƒĐ˛Đ°ĐŊĐŊŅŽ. * SnapRAID ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ в Ņ€ĐĩаĐģҌĐŊĐžĐŧ҃ Ņ‡Đ°ŅŅ–. З RAID ваĐŧ ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐŋŅ€Đ¸ĐŋиĐŊŅŅ‚Đ¸ Ņ€ĐžĐąĐžŅ‚Ņƒ, ĐēĐžĐģи Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ. * SnapRAID ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŊОвĐģŅŽĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– ĐģĐ¸ŅˆĐĩ С ОйĐŧĐĩĐļĐĩĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ. З Ņ€ĐĩСĐĩŅ€Đ˛ĐŊиĐŧ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅĐŧ ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐŋҖҁĐģŅ ĐŋОвĐŊĐžŅ— Đ˛Ņ–Đ´ĐŧОви Đ˛ŅŅŒĐžĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. * ЗбĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‡Đ°ŅĐžĐ˛Ņ– ĐŧŅ–Ņ‚Đēи, ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– Ņ‚Đ° ĐļĐžŅ€ŅŅ‚ĐēŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ. ĐŸŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋ҃, вĐģĐ°ŅĐŊŅ–ŅŅ‚ŅŒ Ņ‚Đ° Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐŊĐĩ СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. 4 ĐŸĐžŅ‡Đ°Ņ‚ĐžĐē Ņ€ĐžĐąĐžŅ‚Đ¸ ================ ЊОй виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ SnapRAID, ҁĐŋĐĩŅ€ŅˆŅƒ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ОдиĐŊ Đ´Đ¸ŅĐē ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ‰ĐžĐą ĐŋŅ€Đ¸ŅĐ˛ŅŅ‚Đ¸Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— `ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–`. З ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ви СĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŧОви ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID5. Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Ņ–Đ´ĐŧОвиĐģи, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID6, ви ĐŋОвиĐŊĐŊŅ– ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐļĐĩĐŊ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК Đ´Đ¸ŅĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– дОСвОĐģŅŅ” Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ даĐŊŅ– ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŧОви ҉Đĩ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. Đ¯Đē Đ´Đ¸ŅĐēи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ви ĐŋОвиĐŊĐŊŅ– Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆŅ– Đ´Đ¸ŅĐēи в ĐŧĐ°ŅĐ¸Đ˛Ņ–, ĐžŅĐēŅ–ĐģҌĐēи Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŧĐžĐļĐĩ ĐˇŅ€ĐžŅŅ‚Đ¸ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ĐĻŅ– Đ´Đ¸ŅĐēи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋŅ€Đ¸ŅĐ˛ŅŅ‡ĐĩĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅŽ Ņ„Đ°ĐšĐģŅ–Đ˛ `ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–`. Ви ĐŊĐĩ ĐŋОвиĐŊĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ĐŊа ĐŊĐ¸Ņ… ŅĐ˛ĐžŅ— даĐŊŅ–. ĐŸĐžŅ‚Ņ–Đŧ ви ĐŋОвиĐŊĐŊŅ– виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Đ´Đ¸ŅĐēи `даĐŊĐ¸Ņ…`, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ SnapRAID. Đ—Đ°Ņ…Đ¸ŅŅ‚ Ņ” ĐąŅ–ĐģҌ҈ ĐĩŅ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊиĐŧ, ŅĐēŅ‰Đž ҆Җ Đ´Đ¸ŅĐēи ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ даĐŊŅ–, Ņ‰Đž Ņ€Ņ–Đ´ĐēĐž СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. З ҆ҖҔҗ ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊи ĐēŅ€Đ°Ņ‰Đĩ НЕ вĐēĐģŅŽŅ‡Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐē Windows C:\ айО ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Unix /home, /var Ņ‚Đ° /tmp. ĐĄĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģŅ–Đ˛ СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ ҃ Ņ„Đ°ĐšĐģĐ°Ņ… `content` (вĐŧҖҁ҂), ŅĐēŅ– ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ…, ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°ĐģҌĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ Đ´ĐĩŅ‚Đ°ĐģŅ– Đ˛Đ°ŅˆĐžŅ— Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžŅ— ĐēĐžĐŋŅ–Ņ—, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Đ˛ŅŅ– ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ– ҁ҃Đŧи Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ—Ņ— ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ФаКĐģ `content` СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ в ĐēŅ–ĐģҌĐēĐžŅ… ĐēĐžĐŋŅ–ŅŅ…, Ņ– ĐēĐžĐļĐŊа ĐēĐžĐŋŅ–Ņ ĐŋОвиĐŊĐŊа ĐąŅƒŅ‚Đ¸ ĐŊа ĐžĐēŅ€ĐĩĐŧĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰ĐžĐą ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸, Ņ‰Đž ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ҃ Ņ€Đ°ĐˇŅ– Đ˛Ņ–Đ´ĐŧОви ĐēŅ–ĐģҌĐēĐžŅ… Đ´Đ¸ŅĐēŅ–Đ˛, ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊа ĐēĐžĐŋŅ–Ņ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа. НаĐŋŅ€Đ¸ĐēĐģад, ĐŋŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸ĐŧĐž, Đ˛Đ°Ņ ҆ҖĐēĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, а Đ˛Đ°ŅˆŅ– Đ´Đ¸ŅĐēи Ņ€ĐžĐˇŅ‚Đ°ŅˆĐžĐ˛Đ°ĐŊŅ– Са Đ°Đ´Ņ€ĐĩŅĐ°Đŧи: /mnt/diskp <- Đ˛Đ¸ĐąŅ€Đ°ĐŊиК Đ´Đ¸ŅĐē Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– /mnt/disk1 <- ĐŋĐĩŅ€ŅˆĐ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ /mnt/disk2 <- Đ´Ņ€ŅƒĐŗĐ¸Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ /mnt/disk3 <- ҂ҀĐĩŅ‚Ņ–Đš Đ´Đ¸ŅĐē Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ Ви ĐŋОвиĐŊĐŊŅ– ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ /etc/snapraid.conf С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиĐŧи ĐžĐŋŅ†Ņ–ŅĐŧи: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ Đ¯ĐēŅ‰Đž ви ĐŋŅ€Đ°Ņ†ŅŽŅ”Ņ‚Đĩ в Windows, ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ҈ĐģŅŅ…Ņƒ Windows, С ĐģŅ–Ņ‚ĐĩŅ€Đ°Đŧи Đ´Đ¸ŅĐēŅ–Đ˛ Ņ‚Đ° ĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐŧи ҁĐēҖҁĐŊиĐŧи Ņ€Đ¸ŅĐēаĐŧи СаĐŧŅ–ŅŅ‚ŅŒ ĐŋŅ€ŅĐŧĐ¸Ņ…. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐąĐ°ĐŗĐ°Ņ‚Đž Đ´Đ¸ŅĐēŅ–Đ˛ Ņ– СаĐēŅ–ĐŊŅ‡Đ¸ĐģĐ¸ŅŅ ĐģŅ–Ņ‚ĐĩŅ€Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ вĐēĐģадĐĩĐŊŅ– ĐŋаĐŋĐēи. Див: https://www.google.com/search?q=Windows+mount+point На Ņ†ŅŒĐžĐŧ҃ ĐĩŅ‚Đ°ĐŋŅ– ви ĐŗĐžŅ‚ĐžĐ˛Ņ– СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync` Đ´ĐģŅ ĐŋĐžĐąŅƒĐ´ĐžĐ˛Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. snapraid sync ĐĻĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ ĐŧĐžĐļĐĩ СаКĐŊŅŅ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŗĐžĐ´Đ¸ĐŊ вĐŋĐĩŅ€ŅˆĐĩ, СаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ даĐŊĐ¸Ņ…, ŅĐēŅ– вĐļĐĩ Ņ” ĐŊа Đ´Đ¸ŅĐēĐ°Ņ…. Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐēи ĐŋĐžŅ€ĐžĐļĐŊŅ–, ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ ĐŧĐ¸Ņ‚Ņ‚Ņ”Đ˛Đž. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž в ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ Ctrl+C, Ņ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž СаĐŋ҃ҁĐē҃ Đ˛Ņ–ĐŊ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Ņƒ С ĐŧŅ–ŅŅ†Ņ, Đ´Đĩ ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊиК. КоĐģи Ņ†Ņ ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆĐ¸Ņ‚ŅŒŅŅ, Đ˛Đ°ŅˆŅ– даĐŊŅ– БЕЗПЕЧНІ. ĐĸĐĩĐŋĐĩŅ€ ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžŅ‡Đ°Ņ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅĐ˛Ņ–Đš ĐŧĐ°ŅĐ¸Đ˛ ŅĐē ваĐŧ ĐŋĐžĐ´ĐžĐąĐ°Ņ”Ņ‚ŅŒŅŅ Ņ– ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐžĐŊОвĐģŅŽĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, СаĐŋ҃ҁĐēĐ°ŅŽŅ‡Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. 4.1 ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ (Scrubbing) --------------------------- ЊОй ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ даĐŊŅ– Ņ‚Đ° ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊа ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋĐžĐŧиĐģĐžĐē, ви ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub`. snapraid scrub ĐĻŅ ĐēĐžĐŧаĐŊда ĐŋĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” даĐŊŅ– ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– С Ņ…Đĩ҈ĐĩĐŧ, ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊиĐŧ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐēĐžĐŧаĐŊди `sync`, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. КоĐļĐĩĐŊ СаĐŋ҃ҁĐē ĐēĐžĐŧаĐŊди ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 8% ĐŧĐ°ŅĐ¸Đ˛Ņƒ, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ даĐŊŅ–, ŅĐēŅ– вĐļĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Ņ… 10 Đ´ĐŊŅ–Đ˛. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -p, --plan, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–ĐŊ҈҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ, Ņ– ĐžĐŋŅ†Ņ–ŅŽ -o, --older-than, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Đ˛Ņ–Đē ҃ Đ´ĐŊŅŅ…. НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ 5% ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŊа ĐąĐģĐžĐēи ŅŅ‚Đ°Ņ€ŅˆŅ– Са 20 Đ´ĐŊŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ: snapraid -p 5 -o 20 scrub Đ¯ĐēŅ‰Đž ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– `content` Ņ– ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҃ ĐēĐžĐŧаĐŊĐ´Ņ– `status`. snapraid status ЊОй Ņ—Ņ… виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`, ҄ҖĐģŅŒŅ‚Ņ€ŅƒŅŽŅ‡Đ¸ ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -e, --filter-error: snapraid -e fix ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž `scrub` ĐŋĐžĐŧиĐģĐēи СĐŊиĐēĐŊŅƒŅ‚ŅŒ ĐˇŅ– ĐˇĐ˛Ņ–Ņ‚Ņƒ `status`, ŅĐēŅ‰Đž вОĐŊи ҁĐŋŅ€Đ°Đ˛Đ´Ņ– виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–. ЊОй ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ ҆Đĩ ŅˆĐ˛Đ¸Đ´ŅˆĐĩ, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ -p bad, Ņ‰ĐžĐą ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. snapraid -p bad scrub ЗаĐŋ҃ҁĐē `scrub` ĐŊа ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐŧĐžĐļĐĩ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐ¸Ņ‚Đ¸ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐēи, ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊŅ– видаĐģĐĩĐŊиĐŧи айО СĐŧŅ–ĐŊĐĩĐŊиĐŧи Ņ„Đ°ĐšĐģаĐŧи. ĐĻŅ– ĐŋĐžĐŧиĐģĐēи Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ ҃ вивĐĩĐ´ĐĩĐŊĐŊŅ– `scrub`, аĐģĐĩ ĐŋОв'ŅĐˇĐ°ĐŊŅ– ĐąĐģĐžĐēи ĐŊĐĩ ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. 4.2 Об'Ņ”Đ´ĐŊаĐŊĐŊŅ (Pooling) ------------------------ ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа: Đ¤ŅƒĐŊĐēŅ†Ņ–Ņ Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ, ĐžĐŋĐ¸ŅĐ°ĐŊа ĐŊиĐļ҇Đĩ, ĐąŅƒĐģа СаĐŧŅ–ĐŊĐĩĐŊа Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ĐžĐŧ mergerfs, ŅĐēиК Ņ‚ĐĩĐŋĐĩŅ€ Ņ” Ņ€ĐĩĐēĐžĐŧĐĩĐŊдОваĐŊĐžŅŽ ĐžĐŋŅ†Ņ–Ņ”ŅŽ Đ´ĐģŅ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ Linux ҃ ҁĐŋŅ–ĐģҌĐŊĐžŅ‚Ņ– SnapRAID. Mergefs СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐąŅ–ĐģҌ҈ ĐŗĐŊŅƒŅ‡ĐēиК Ņ‚Đ° ĐĩŅ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊиК ҁĐŋĐžŅŅ–Đą Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… Đ´Đ¸ŅĐēŅ–Đ˛ в Ņ”Đ´Đ¸ĐŊ҃ ҃ĐŊҖ҄ҖĐēОваĐŊ҃ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, дОСвОĐģŅŅŽŅ‡Đ¸ ĐąĐĩСĐŋĐĩŅ€Đĩ҈ĐēОдĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐąĐĩС виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ. Đ’Ņ–ĐŊ Đ´ĐžĐąŅ€Đĩ Ņ–ĐŊŅ‚ĐĩĐŗŅ€ŅƒŅ”Ņ‚ŅŒŅŅ С SnapRAID Đ´ĐģŅ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ– ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ…, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē OpenMediaVault (OMV) айО ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēĐ¸Ņ… ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŅ… NAS. ЊОй Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ Đ˛ŅŅ– Ņ„Đ°ĐšĐģи ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– в ОдĐŊĐžĐŧ҃ Đ´ĐĩŅ€ĐĩĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ `pooling` (Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ). ВоĐŊа ŅŅ‚Đ˛ĐžŅ€ŅŽŅ” Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `pooling` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: pool /pool айО, ŅĐēŅ‰Đž ви ĐŋŅ€Đ°Ņ†ŅŽŅ”Ņ‚Đĩ в Windows, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: pool C:\pool а ĐŋĐžŅ‚Ņ–Đŧ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `pool` Đ´ĐģŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ айО ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ. snapraid pool Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧ҃ Unix Ņ– Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Ņ†ŅŒĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃ Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊ Windows айО Unix, ви ĐŋОвиĐŊĐŊŅ– Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ Đ´Đž Đ˛Đ°ŅˆĐžĐŗĐž /etc/samba/smb.conf: # ĐŖ ĐŗĐģОйаĐģҌĐŊĐžĐŧ҃ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– smb.conf unix extensions = no # ĐŖ Ņ€ĐžĐˇĐ´Ņ–ĐģŅ– ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes ĐŖ Windows ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃ виĐŧĐ°ĐŗĐ°Ņ” Đ˛Ņ–Đ´ ĐēĐģŅ–Ņ”ĐŊŅ‚Ņ–Đ˛ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐžĐŗĐž Ņ—Ņ… Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊаваĐŊĐŊŅ. ЊОй ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ҆Đĩ, ĐžĐēҀҖĐŧ ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool, ви Ņ‚Đ°ĐēĐžĐļ ĐŋОвиĐŊĐŊŅ– ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ĐŊĐĩСаĐģĐĩĐļĐŊĐž, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ–ĐŧĐĩĐŊа Đ´Đ¸ŅĐēŅ–Đ˛, виСĐŊĐ°Ņ‡ĐĩĐŊŅ– ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–, ŅĐē Ņ‚ĐžŅ‡Đēи ҁĐŋŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃. Ви Ņ‚Đ°ĐēĐžĐļ ĐŋОвиĐŊĐŊŅ– вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ҃ ĐžĐŋ҆Җҗ `share` ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ ҈ĐģŅŅ… Windows UNC, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиĐŧ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°Đŧ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ†Đ¸Ņ… ҁĐŋŅ–ĐģҌĐŊĐ¸Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. НаĐŋŅ€Đ¸ĐēĐģад, ĐŋŅ€Đ°Ņ†ŅŽŅŽŅ‡Đ¸ С ҁĐĩŅ€Đ˛ĐĩŅ€Đ° С Ņ–ĐŧĐĩĐŊĐĩĐŧ `darkstar`, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋ҆Җҗ: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar Ņ– ĐŊĐ°Đ´Đ°Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array Ņ‰ĐžĐą дОСвОĐģĐ¸Ņ‚Đ¸ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиĐŧ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°Đŧ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ \\darkstar\pool. ВаĐŧ Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊŅ– ĐēĐģŅ–Ņ”ĐŊŅ‚Đ¸, Ņ‰ĐžĐą ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Đ’Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ (Undeleting) --------------------------------------------- SnapRAID Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊŅƒŅ” ĐąŅ–ĐģҌ҈Đĩ ŅĐē ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŗĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ, ĐŊŅ–Đļ ŅĐ¸ŅŅ‚ĐĩĐŧа RAID, Ņ– ĐšĐžĐŗĐž ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ айО ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ Đ´Đž Ņ—Ņ… ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ŅŅ‚Đ°ĐŊ҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -f, --filter: snapraid fix -f FILE айО Đ´ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ: snapraid fix -f DIR/ Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ виĐŋадĐēОвО видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ҁĐĩŅ€ĐĩдиĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -m, --filter-missing, ŅĐēа Đ˛Ņ–Đ´ĐŊОвĐģŅŽŅ” ĐģĐ¸ŅˆĐĩ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– Ņ„Đ°ĐšĐģи, СаĐģĐ¸ŅˆĐ°ŅŽŅ‡Đ¸ Đ˛ŅŅ– Ņ–ĐŊŅˆŅ– ĐŊĐĩĐ´ĐžŅ‚ĐžŅ€ĐēаĐŊиĐŧи. snapraid fix -m -f DIR/ АйО Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ… Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: snapraid fix -m 4.4 Đ’Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ (Recovering) ---------------------------- ĐĄŅ‚Đ°ĐģĐžŅŅ ĐŊĐ°ĐšĐŗŅ–Ņ€ŅˆĐĩ, Ņ– ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Đģи ОдиĐŊ айО ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛! НЕ ĐŸĐĐĐ†ĐšĐŖĐ™ĐĸЕ! Ви СĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ… Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸! ПĐĩŅ€ŅˆĐĩ, Ņ‰Đž ви ĐŋОвиĐŊĐŊŅ– ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸, ҆Đĩ ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋОдаĐģŅŒŅˆĐ¸Ņ… СĐŧŅ–ĐŊ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊŅ– ĐŋŅ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Đ´Đž ĐŊŅŒĐžĐŗĐž Ņ‚Đ° ĐąŅƒĐ´ŅŒ-ŅĐēŅ– СаĐŋĐģаĐŊОваĐŊŅ– ĐŋŅ€ĐžŅ†ĐĩŅĐ¸, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐē҃ СаĐŋĐģаĐŊОваĐŊ҃ ĐŊҖ҇ĐŊ҃ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ айО ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ SnapRAID. ĐŸĐžŅ‚Ņ–Đŧ виĐēĐžĐŊĐ°ĐšŅ‚Đĩ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐēŅ€ĐžĐēи. ---- 4.4.1 КРОК 1 -> ПĐĩŅ€ĐĩĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ---- ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Đ´ĐĩŅĐēиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, в Ņ–Đ´ĐĩаĐģŅ– ĐŊа Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ°ŅĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…, аĐģĐĩ СОвĐŊŅ–ŅˆĐŊŅ–Đš USB-Đ´Đ¸ŅĐē айО Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиК Đ´Đ¸ŅĐē ĐŋŅ–Đ´Ņ–ĐšĐ´Đĩ. ЗĐŧŅ–ĐŊŅ–Ņ‚ŅŒ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ SnapRAID, Ņ‰ĐžĐą ĐžĐŋŅ†Ņ–Ņ `data` айО `parity` Đ´Đ¸ŅĐēа, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ, вĐēĐ°ĐˇŅƒĐ˛Đ°Đģа ĐŊа ĐŧҖҁ҆Đĩ Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ С Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅŽ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž Đ´Đ¸ŅĐē `d1` Đ˛Đ¸ĐšŅˆĐžĐ˛ С ĐģĐ°Đ´Ņƒ, СĐŧŅ–ĐŊŅ–Ņ‚ŅŒ С: data d1 /mnt/disk1/ ĐŊа: data d1 /mnt/new_spare_disk/ Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐē, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, Ņ” Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊ҃ ĐžĐŋŅ†Ņ–ŅŽ `parity`. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ, ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ŅƒŅŅ– Ņ—Ņ…ĐŊŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊŅ– ĐžĐŋ҆Җҗ. ---- 4.4.2 КРОК 2 -> ВиĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ (Fix) ---- ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ fix, СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‡Đ¸ ĐļŅƒŅ€ĐŊаĐģ ҃ СОвĐŊŅ–ŅˆĐŊŅŒĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ: snapraid -d NAME -l fix.log fix ДĐĩ NAME — ҆Đĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐēĐģад `d1` ҃ ĐŊĐ°ŅˆĐžĐŧ҃ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–. Đ¯ĐēŅ‰Đž Đ´Đ¸ŅĐē, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, Ņ” Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ–ĐŧĐĩĐŊа `parity`, `2-parity`, Ņ‚ĐžŅ‰Đž. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ ĐēŅ–ĐģҌĐēа Đ´Đ¸ŅĐēŅ–Đ˛, Ņ‰Đž Đ˛Đ¸ĐšŅˆĐģи С ĐģĐ°Đ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš -d, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ—Ņ… ŅƒŅŅ–. ĐĻŅ ĐēĐžĐŧаĐŊда СаКĐŧĐĩ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ‡Đ°ŅŅƒ. ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž ҃ Đ˛Đ°Ņ Ņ” ĐēŅ–ĐģҌĐēа ĐŗŅ–ĐŗĐ°ĐąĐ°ĐšŅ‚ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ fix.log. ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Ņ—Ņ— С Đ´Đ¸ŅĐēа С Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅŽ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ Đ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. ĐĸĐĩĐŋĐĩŅ€ ви Đ˛Ņ–Đ´ĐŊОвиĐģи Đ˛ŅĐĩ, Ņ‰Đž ĐŧĐžĐļĐŊа Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸. Đ¯ĐēŅ‰Đž Đ´ĐĩŅĐēŅ– Ņ„Đ°ĐšĐģи Ņ‡Đ°ŅŅ‚ĐēОвО айО ĐŋОвĐŊŅ–ŅŅ‚ŅŽ ĐŊĐĩĐŧĐžĐļĐģивО Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊŅ– С дОдаваĐŊĐŊŅĐŧ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ `.unrecoverable`. Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŊĐ°ĐšŅ‚Đ¸ Đ´ĐĩŅ‚Đ°ĐģҌĐŊиК ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… ĐŊĐĩĐ˛Ņ–Đ´ĐŊОвĐģŅŽĐ˛Đ°ĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛ ҃ Ņ„Đ°ĐšĐģŅ– fix.log, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Đ˛ŅˆĐ¸ Đ˛ŅŅ– Ņ€ŅĐ´Đēи, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŒŅŅ С `unrecoverable:`. Đ¯ĐēŅ‰Đž ви ĐŊĐĩ СадОвОĐģĐĩĐŊŅ– Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅĐŧ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ ĐšĐžĐŗĐž ҁ҂ҖĐģҌĐēи Ņ€Đ°ĐˇŅ–Đ˛, ҁĐēŅ–ĐģҌĐēи СайаĐļĐ°Ņ”Ņ‚Đĩ. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ви видаĐģиĐģи Ņ„Đ°ĐšĐģи С ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŋҖҁĐģŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`, ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ‚ĐžĐŗĐž, Ņ‰Đž Đ´ĐĩŅĐēŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊŅ–. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ `fix`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -i, --import, вĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸, Đ´Đĩ ҆Җ Ņ„Đ°ĐšĐģи СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ ĐˇĐ°Ņ€Đ°Đˇ, Ņ‰ĐžĐą СĐŊĐžĐ˛Ņƒ вĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ Ņ—Ņ… ҃ ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. Đ¯ĐēŅ‰Đž ви СадОвОĐģĐĩĐŊŅ– Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅĐŧ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸, аĐģĐĩ ĐˇĐ°ŅƒĐ˛Đ°ĐļŅ‚Đĩ, Ņ‰Đž ĐŋҖҁĐģŅ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ СĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix`! ---- 4.4.3 КРОК 3 -> ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа (Check) ---- Đ¯Đē ОйĐĩŅ€ĐĩĐļĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ‚ĐĩĐŋĐĩŅ€ СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `check`, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž ĐŊа Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ Đ˛ŅĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž. snapraid -d NAME -a check ДĐĩ NAME — ҆Đĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ĐŊаĐŋŅ€Đ¸ĐēĐģад `d1` ҃ ĐŊĐ°ŅˆĐžĐŧ҃ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ĐēĐģĐ°Đ´Ņ–. ОĐŋ҆Җҗ -d Ņ‚Đ° -a вĐēĐ°ĐˇŅƒŅŽŅ‚ŅŒ SnapRAID ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ ĐģĐ¸ŅˆĐĩ вĐēаСаĐŊиК Đ´Đ¸ŅĐē Ņ‚Đ° Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐēĐžĐŧаĐŊда СаКĐŧĐĩ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ‡Đ°ŅŅƒ, аĐģĐĩ ŅĐēŅ‰Đž ви ĐŊĐĩ ĐŊĐ°Đ´Ņ‚Đž ОйĐĩŅ€ĐĩĐļĐŊŅ–, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ— ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸. ---- 4.4.4 КРОК 4 -> ХиĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ (Sync) ---- ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`, Ņ‰ĐžĐą ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐ°ŅĐ¸Đ˛ С ĐŊОвиĐŧ Đ´Đ¸ŅĐēĐžĐŧ. snapraid sync Đ¯ĐēŅ‰Đž Đ˛ŅĐĩ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐž, Ņ†Ņ ĐēĐžĐŧаĐŊда виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŧĐ¸Ņ‚Ņ‚Ņ”Đ˛Đž. 5 КоĐŧаĐŊди ========= SnapRAID ĐŊĐ°Đ´Đ°Ņ” ĐēŅ–ĐģҌĐēа ĐŋŅ€ĐžŅŅ‚Đ¸Ņ… ĐēĐžĐŧаĐŊĐ´, ŅĐēŅ– дОСвОĐģŅŅŽŅ‚ŅŒ: * ВивĐĩŅŅ‚Đ¸ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŧĐ°ŅĐ¸Đ˛Ņƒ -> `status` * КĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐēаĐŧи -> `smart`, `probe`, `up`, `down` * ĐĄŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ ĐēĐžĐŋŅ–ŅŽ/СĐŊŅ–ĐŧĐžĐē -> `sync` * ПĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ‚Đ¸ даĐŊŅ– -> `scrub` * Đ’Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐžŅŅ‚Đ°ĐŊĐŊŅŽ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ ĐēĐžĐŋŅ–ŅŽ/СĐŊŅ–ĐŧĐžĐē -> `fix`. КоĐŧаĐŊди ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ ĐŊаĐŋĐ¸ŅĐ°ĐŊŅ– ĐŧаĐģиĐŧи ĐģŅ–Ņ‚ĐĩŅ€Đ°Đŧи. 5.1 status ---------- Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ СвĐĩĐ´ĐĩĐŊĐŊŅ ŅŅ‚Đ°ĐŊ҃ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ВĐēĐģŅŽŅ‡Đ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋŅ€Đž Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ˛Ņ–Đē ĐąĐģĐžĐēŅ–Đ˛ ĐąĐĩС ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° Đ˛ŅŅ– СаĐŋĐ¸ŅĐ°ĐŊŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи, Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. ĐŸŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ŅŅ‚ĐžŅŅƒŅ”Ņ‚ŅŒŅŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžĐŗĐž Ņ‡Đ°ŅŅƒ, ĐēĐžĐģи ви СаĐŋŅƒŅŅ‚Đ¸Đģи `sync`. ĐŸŅ–ĐˇĐŊŅ–ŅˆŅ– ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŊĐĩ Đ˛Ņ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Ņ—Ņ…ĐŊŅ– ĐŊĐžĐŧĐĩŅ€Đ¸ ĐąĐģĐžĐēŅ–Đ˛. ЊОй Ņ—Ņ… виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `fix -e`. ĐĸаĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐŗŅ€Đ°Ņ„Ņ–Đē, Ņ‰Đž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ” ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš Ņ‡Đ°Ņ, ĐēĐžĐģи ĐēĐžĐļĐĩĐŊ ĐąĐģĐžĐē ĐąŅƒĐ˛ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊиК айО ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊиК. ĐĄĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐ¸ĐŧвОĐģĐžĐŧ `*`, ĐąĐģĐžĐēи, ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ–, аĐģĐĩ ҉Đĩ ĐŊĐĩ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, - `o`. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.2 smart --------- Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐˇĐ˛Ņ–Ņ‚ SMART ŅƒŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ҃ ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. ВĐēĐģŅŽŅ‡Đ°Ņ” ĐžŅ†Ņ–ĐŊĐē҃ ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ĐŧОви ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž Ņ€ĐžĐē҃, дОСвОĐģŅŅŽŅ‡Đ¸ ваĐŧ ĐŋĐģаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐģаĐŊĐžĐ˛Ņƒ СаĐŧŅ–ĐŊ҃ Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒ ĐŋŅ–Đ´ĐžĐˇŅ€Ņ–ĐģŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸. ĐĻŅ ĐžŅ†Ņ–ĐŊĐēа ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– ĐžŅ‚Ņ€Đ¸ĐŧаĐŊа ҈ĐģŅŅ…ĐžĐŧ ĐēĐžŅ€ĐĩĐģŅŅ†Ņ–Ņ— Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛ SMART Đ´Đ¸ŅĐēŅ–Đ˛ С даĐŊиĐŧи Backblaze, Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи Са Đ°Đ´Ņ€ĐĩŅĐžŅŽ: https://www.backblaze.com/hard-drive-test-data.html Đ¯ĐēŅ‰Đž SMART ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”, Ņ‰Đž Đ´Đ¸ŅĐē Đ˛Đ¸Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ С ĐģĐ°Đ´Ņƒ, Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž Đ´Đ¸ŅĐēа Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒŅŅ `FAIL` айО `PREFAIL`, Ņ– SnapRAID ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ĐŋĐžĐŧиĐģĐē҃. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐĩĐŗĐ°ĐšĐŊа СаĐŧŅ–ĐŊа Đ´Đ¸ŅĐēа. ІĐŊŅˆŅ– ĐŧĐžĐļĐģĐ¸Đ˛Ņ– Ņ€ŅĐ´Đēи ŅŅ‚Đ°ĐŊ҃: logfail - ĐŖ ĐŧиĐŊ҃ĐģĐžĐŧ҃ Đ´ĐĩŅĐēŅ– Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸ ĐąŅƒĐģи ĐŊиĐļŅ‡Đ¸Đŧи Са ĐŋĐžŅ€Ņ–Đŗ. logerr - Đ–ŅƒŅ€ĐŊаĐģ ĐŋĐžĐŧиĐģĐžĐē ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐžĐŧиĐģĐēи. selferr - Đ–ŅƒŅ€ĐŊаĐģ ŅĐ°ĐŧĐžŅ‚ĐĩŅŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋĐžĐŧиĐģĐēи. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ĐžĐŋŅ†Ņ–ŅŽ -v, --verbose, ĐŊĐ°Đ´Đ°Ņ”Ņ‚ŅŒŅŅ ĐŗĐģĐ¸ĐąŅˆĐ¸Đš ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Ņ‡ĐŊиК аĐŊаĐģŅ–Đˇ. ĐĻĐĩĐš аĐŊаĐģŅ–Đˇ ĐŧĐžĐļĐĩ Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸ ваĐŧ Đ˛Đ¸Ņ€Ņ–ŅˆĐ¸Ņ‚Đ¸, Ņ‡Đ¸ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ваĐŧ ĐąŅ–ĐģŅŒŅˆĐ° айО ĐŧĐĩĐŊŅˆĐ° ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -a` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. Đ¯ĐēŅ‰Đž Đ˛Đ°ŅˆŅ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ— ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐē҃ ĐēĐžĐŧаĐŊĐ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ `smartctl` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.3 probe --------- Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ŅŅ‚Đ°ĐŊ Đ–Đ˜Đ’Đ›Đ•ĐĐĐ¯ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ ҃ ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. `Standby` ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´Đ¸ŅĐē ĐŊĐĩ ОйĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ. `Active` ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´Đ¸ŅĐē ОйĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ. ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -n standby -i` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. Đ¯ĐēŅ‰Đž Đ˛Đ°ŅˆŅ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ— ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģŅŅŽŅ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐē҃ ĐēĐžĐŧаĐŊĐ´Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ `smartctl` ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.4 up ------ РОСĐēŅ€ŅƒŅ‡ŅƒŅ” Đ˛ŅŅ– Đ´Đ¸ŅĐēи ĐŧĐ°ŅĐ¸Đ˛Ņƒ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€ĐžĐˇĐēŅ€ŅƒŅ‚Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐĩвĐŊŅ– Đ´Đ¸ŅĐēи, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -d, --filter-disk. ОдĐŊĐžŅ‡Đ°ŅĐŊĐĩ Ņ€ĐžĐˇĐēŅ€ŅƒŅ‡ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ виĐŧĐ°ĐŗĐ°Ņ” ĐąĐ°ĐŗĐ°Ņ‚Đž ĐĩĐŊĐĩŅ€ĐŗŅ–Ņ—. ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž Đ˛Đ°Ņˆ ĐąĐģĐžĐē ĐļивĐģĐĩĐŊĐŊŅ ĐŧĐžĐļĐĩ ҆Đĩ Đ˛Đ¸Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.5 down -------- Đ—ŅƒĐŋиĐŊŅŅ” Đ˛ŅŅ– Đ´Đ¸ŅĐēи ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ĐĻŅ ĐēĐžĐŧаĐŊда виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ `smartctl` Ņ– ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊа СаĐŋ҃ҁĐē҃ `smartctl -s standby,now` ĐŊа Đ˛ŅŅ–Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ…. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐĩвĐŊŅ– Đ´Đ¸ŅĐēи, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -d, --filter-disk. ДĐģŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ— ĐˇŅƒĐŋиĐŊĐēи ĐŋŅ€Đ¸ ĐŋĐžĐŧиĐģ҆Җ ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -s, --spin-down-on-error С ĐąŅƒĐ´ŅŒ-ŅĐēĐžŅŽ Ņ–ĐŊŅˆĐžŅŽ ĐēĐžĐŧаĐŊĐ´ĐžŅŽ, Ņ‰Đž ĐĩĐēĐ˛Ņ–Đ˛Đ°ĐģĐĩĐŊŅ‚ĐŊĐž Ņ€ŅƒŅ‡ĐŊĐžĐŧ҃ СаĐŋ҃ҁĐē҃ `down` ĐŋŅ€Đ¸ виĐŊиĐēĐŊĐĩĐŊĐŊŅ– ĐŋĐžĐŧиĐģĐēи. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.6 diff -------- Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`, Đ´ĐģŅ ŅĐēĐ¸Ņ… ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐēĐžĐŧаĐŊда ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” даĐŊŅ– Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐģĐ¸ŅˆĐĩ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ Ņ„Đ°ĐšĐģ҃, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° inode. ĐŸŅ–ŅĐģŅ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… СĐŧŅ–ĐŊĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ”Ņ‚ŅŒŅŅ СвĐĩĐ´ĐĩĐŊĐŊŅ СĐŧŅ–ĐŊ, ĐˇĐŗŅ€ŅƒĐŋОваĐŊĐĩ Са: equal (Ņ€Ņ–Đ˛ĐŊŅ–) - ФаКĐģи, ĐŊĐĩСĐŧŅ–ĐŊĐĩĐŊŅ– С ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž ŅŅ‚Đ°ĐŊ҃. added (дОдаĐŊŅ–) - ФаКĐģи, дОдаĐŊŅ–, ŅĐēĐ¸Ņ… ĐŊĐĩ ĐąŅƒĐģĐž Ņ€Đ°ĐŊŅ–ŅˆĐĩ. removed (видаĐģĐĩĐŊŅ–) - ФаКĐģи, видаĐģĐĩĐŊŅ–. updated (ĐžĐŊОвĐģĐĩĐŊŅ–) - ФаКĐģи С Ņ–ĐŊŅˆĐ¸Đŧ Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ айО Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž вОĐŊи ĐąŅƒĐģи СĐŧŅ–ĐŊĐĩĐŊŅ–. moved (ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ–) - ФаКĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– в Ņ–ĐŊŅˆĐ¸Đš ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са Ņ‚Đ¸Đŧ ĐļĐĩ Ņ–ĐŧĐĩĐŊĐĩĐŧ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ, Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‚Đ° inode, аĐģĐĩ Ņ–ĐŊŅˆĐ¸Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐžĐŧ. copied - Ņ„Đ°ĐšĐģи, ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– ĐŊа Ņ‚ĐžĐš ŅĐ°ĐŧиК айО Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, Đ´Đĩ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊиК Ņ„Đ°ĐšĐģ Đ˛ŅĐĩ ҉Đĩ ҖҁĐŊŅƒŅ”. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ОдĐŊаĐēĐžĐ˛ĐžŅŽ ĐŊĐ°ĐˇĐ˛ĐžŅŽ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‡Đ°ŅŅƒ. Đ¯ĐēŅ‰Đž ĐŧŅ–Ņ‚Đēа Ņ‡Đ°ŅŅƒ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Ņ‡Đ°ŅŅ‚ĐžĐē ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŧĐ°Ņ” ĐˇĐąŅ–ĐŗĐ°Ņ‚Đ¸ŅŅ ĐŋОвĐŊиК ҈ĐģŅŅ…, а ĐŊĐĩ ĐģĐ¸ŅˆĐĩ ĐŊаСва. relocated - Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– ĐŊа Ņ‚ĐžĐš ŅĐ°ĐŧиК айО Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, Đ´Đĩ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģ СĐŊиĐē. ВоĐŊи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ОдĐŊаĐēĐžĐ˛ĐžŅŽ ĐŊĐ°ĐˇĐ˛ĐžŅŽ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° ĐŧŅ–Ņ‚ĐēĐžŅŽ Ņ‡Đ°ŅŅƒ. Đ¯ĐēŅ‰Đž ĐŧŅ–Ņ‚Đēа Ņ‡Đ°ŅŅƒ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Ņ‡Đ°ŅŅ‚ĐžĐē ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ĐŧĐ°Ņ” ĐˇĐąŅ–ĐŗĐ°Ņ‚Đ¸ŅŅ ĐŋОвĐŊиК ҈ĐģŅŅ…. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ Ņ„Đ°ĐšĐģŅ–Đ˛ 'moved' ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ĐŧĐ°ŅŽŅ‚ŅŒ Ņ–ĐŊŅˆĐ¸Đš inode. restored - Ņ„Đ°ĐšĐģи С Ņ–ĐŊŅˆĐ¸Đŧ inode, аĐģĐĩ ĐˇŅ– ĐˇĐąŅ–ĐŗĐžĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, ĐŊаСви, Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ‚Đ° ĐŧŅ–Ņ‚Đēи Ņ‡Đ°ŅŅƒ. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҆Đĩ Ņ„Đ°ĐšĐģи, Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊŅ– ĐŋҖҁĐģŅ видаĐģĐĩĐŊĐŊŅ. Đ¯ĐēŅ‰Đž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа `sync`, ĐēОд ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” 2, СаĐŧŅ–ŅŅ‚ŅŒ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐŗĐž 0. Код ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅ 1 виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐˇĐ°ĐŗĐ°ĐģҌĐŊĐžŅ— ҃ĐŧОви ĐŋĐžĐŧиĐģĐēи. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.7 sync -------- ОĐŊОвĐģŅŽŅ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ’ŅŅ– СĐŧŅ–ĐŊĐĩĐŊŅ– Ņ„Đ°ĐšĐģи ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ, Ņ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐžĐŊОвĐģŅŽŅŽŅ‚ŅŒŅŅ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ҆ĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ ҃ ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ‡Đ°Ņ, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ Ctrl+C, ĐŊĐĩ Đ˛Ņ‚Ņ€Đ°Ņ‡Đ°ŅŽŅ‡Đ¸ вĐļĐĩ виĐēĐžĐŊаĐŊ҃ Ņ€ĐžĐąĐžŅ‚Ņƒ. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž СаĐŋ҃ҁĐē҃ ĐŋŅ€ĐžŅ†Đĩҁ `sync` Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Ņƒ С ĐŧŅ–ŅŅ†Ņ, Đ´Đĩ ĐąŅƒĐ˛ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊиК. Đ¯ĐēŅ‰Đž ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са ҈ĐģŅŅ…ĐžĐŧ Ņ‚Đ°/айО inode Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅŽŅ‚ŅŒŅŅ Са Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ. Đ¯ĐēŅ‰Đž Ņ€ĐžĐˇĐŧŅ–Ņ€ айО Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа Ņ„Đ°ĐšĐģ҃ Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅŽŅ‚ŅŒŅŅ, даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅŒĐžĐŗĐž Ņ„Đ°ĐšĐģ҃. Đ¯ĐēŅ‰Đž Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž айО ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊОваĐŊĐž ĐŊа Ņ‚ĐžĐŧ҃ Đļ Đ´Đ¸ŅĐē҃, СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‡Đ¸ Ņ‚ĐžĐš ŅĐ°ĐŧиК inode, ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Ņ„Đ°ĐšĐģ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž ĐŊа Ņ–ĐŊŅˆĐ¸Đš Đ´Đ¸ŅĐē, ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, аĐģĐĩ Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ Ņ…Đĩ҈҃ СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ. ФаКĐģи `content` Ņ‚Đ° `parity` СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. 5.8 scrub --------- ĐĄĐēŅ€Đ°ĐąŅƒŅ” ĐŧĐ°ŅĐ¸Đ˛, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅŽŅ‡Đ¸ ĐŊа ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē айО ĐŋĐžĐŧиĐģĐžĐē ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ… Ņ‚Đ° ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐļĐĩĐŊ виĐēĐģиĐē ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 8% ĐŧĐ°ŅĐ¸Đ˛Ņƒ, виĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ даĐŊŅ–, ŅĐēŅ– вĐļĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ– ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ĐžŅŅ‚Đ°ĐŊĐŊŅ–Ņ… 10 Đ´ĐŊŅ–Đ˛. ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ Ņ€Đ°Đˇ ĐŊа Ņ‚Đ¸ĐļĐ´ĐĩĐŊҌ СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ ĐēĐžĐļĐŊĐžĐŗĐž ĐąŅ–Ņ‚Đ° даĐŊĐ¸Ņ… ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Ņ€Đ°Đˇ ĐŊа Ņ‚Ņ€Đ¸ ĐŧŅ–ŅŅŅ†Ņ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš ĐŋĐģаĐŊ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžĐŋ҆Җҗ -p, --plan, ŅĐēа ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ”: bad - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–. new - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‰ĐžĐšĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–. full - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅĐĩ. 0-100 - ĐĄĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ вĐēаСаĐŊиК Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąĐģĐžĐēŅ–Đ˛. Đ¯ĐēŅ‰Đž ви вĐēĐ°ĐˇŅƒŅ”Ņ‚Đĩ Đ˛Ņ–Đ´ŅĐžŅ‚ĐēОвĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -o, --older-than, Ņ‰ĐžĐą виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸, ŅĐēиĐŧ ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ Đ˛Ņ–Đē ĐąĐģĐžĐē҃. ĐĐ°ĐšŅŅ‚Đ°Ņ€Ņ–ŅˆŅ– ĐąĐģĐžĐēи ҁĐēŅ€Đ°ĐąŅƒŅŽŅ‚ŅŒŅŅ ĐŋĐĩŅ€ŅˆĐ¸Đŧи, СайĐĩСĐŋĐĩŅ‡ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃. Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ Ņ‰ĐžĐšĐŊĐž ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊŅ– ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ `-p new`. ЊОй ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐĩŅ‚Đ°ĐģŅ– ŅŅ‚Đ°Ņ‚ŅƒŅŅƒ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēĐžĐŧаĐŊĐ´Ņƒ `status`. ДĐģŅ ĐąŅƒĐ´ŅŒ-ŅĐēĐžŅ— СĐŊаКдĐĩĐŊĐžŅ— ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐžŅ— ĐŋĐžĐŧиĐģĐēи айО ĐŋĐžĐŧиĐģĐēи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– ĐąĐģĐžĐēи ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– `content`. ĐĻŅ– ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҃ `status` Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ– Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `fix -e`. ĐŸŅ–ŅĐģŅ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ, ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ, вОĐŊи ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐĩĐŊŅ–, Ņ– ŅĐēŅ‰Đž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚ŅŒŅŅ, Ņ‰Đž вОĐŊи виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–, ĐŋОСĐŊĐ°Ņ‡Đēа "ĐŋĐžĐŗĐ°ĐŊиК" ĐąŅƒĐ´Đĩ видаĐģĐĩĐŊа. ЊОй ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `scrub -p bad`. Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СаĐŋ҃ҁĐēĐ°Ņ‚Đ¸ `scrub` ĐģĐ¸ŅˆĐĩ ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊĐžĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊҌ ĐŋŅ€Đž ĐŋĐžĐŧиĐģĐēи, ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊŅ– ĐŊĐĩŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐžĐ˛Đ°ĐŊиĐŧи даĐŊиĐŧи. ĐĻŅ– ĐŋĐžĐŧиĐģĐēи Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊĐ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŊĐĩ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи, Ņ– ĐąĐģĐžĐēи ĐŊĐĩ ĐŋОСĐŊĐ°Ņ‡Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–, аĐģĐĩ Ņ‚Đ°ĐēŅ– ĐŋĐžĐŧиĐģĐēи ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅŽŅ‚ŅŒŅŅ ҃ вивĐĩĐ´ĐĩĐŊĐŊŅ– ĐēĐžĐŧаĐŊди. ФаКĐģ `content` СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Ņ‡Đ°ŅŅƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž ĐąĐģĐžĐē҃ Ņ‚Đ° Đ´ĐģŅ ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŋĐžĐŗĐ°ĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛. ФаКĐģи `parity` НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– НЕ СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ. 5.9 fix ------- ВиĐŋŅ€Đ°Đ˛ĐģŅŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŖŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐžŅ€Ņ–Đ˛ĐŊŅŽŅŽŅ‚ŅŒŅŅ ĐˇŅ– ŅŅ‚Đ°ĐŊĐžĐŧ СĐŊŅ–ĐŧĐēа, СйĐĩŅ€ĐĩĐļĐĩĐŊиĐŧ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. Đ¯ĐēŅ‰Đž СĐŊаКдĐĩĐŊĐž Ņ€Ņ–ĐˇĐŊĐ¸Ņ†ŅŽ, вОĐŊа ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ Đ´Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐžĐŗĐž СĐŊŅ–ĐŧĐēа. ĐŖĐ’ĐĐ“Đ! КоĐŧаĐŊда `fix` ĐŊĐĩ Ņ€ĐžĐˇŅ€Ņ–ĐˇĐŊŅŅ” ĐŋĐžĐŧиĐģĐēи Ņ‚Đ° ĐŊавĐŧĐ¸ŅĐŊŅ– ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—. ВоĐŊа ĐąĐĩĐˇŅƒĐŧОвĐŊĐž ĐŋОвĐĩŅ€Ņ‚Đ°Ņ” ŅŅ‚Đ°ĐŊ Ņ„Đ°ĐšĐģ҃ Đ´Đž ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. Đ¯ĐēŅ‰Đž ĐŊĐĩ вĐēаСаĐŊĐž ĐļОдĐŊĐžŅ— Ņ–ĐŊŅˆĐžŅ— ĐžĐŋ҆Җҗ, ĐžĐąŅ€ĐžĐąĐģŅŅ”Ņ‚ŅŒŅŅ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋ҆Җҗ ҄ҖĐģŅŒŅ‚Ņ€Đ°, Ņ‰ĐžĐą Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ĐŧĐŊĐžĐļиĐŊ҃ Ņ„Đ°ĐšĐģŅ–Đ˛ айО Đ´Đ¸ŅĐēŅ–Đ˛ Đ´ĐģŅ Ņ€ĐžĐąĐžŅ‚Đ¸. ЊОй виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ– ĐŋŅ–Đ´ Ņ‡Đ°Ņ `sync` Ņ‚Đ° `scrub`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ -e, --filter-error. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ Ņ–ĐŊŅˆĐ¸Ņ… ĐžĐŋŅ†Ņ–Đš ҄ҖĐģŅŒŅ‚Ņ€Đ°, Ņ†Ņ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ” виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ СĐŧŅ–ĐŊиĐģĐ¸ŅŅ С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. SnapRAID ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊĐžĐ˛ŅƒŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ–, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ `.unrecoverable`. ПĐĩŅ€ĐĩĐ´ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅĐŧ ҁĐēаĐŊŅƒŅ”Ņ‚ŅŒŅŅ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛, Ņ‰ĐžĐą СĐŊĐ°ĐšŅ‚Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– С ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. ĐĻŅ– Ņ„Đ°ĐšĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ Са Ņ—Ņ…ĐŊŅŒĐžŅŽ Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ, Ņ–ĐŗĐŊĐžŅ€ŅƒŅŽŅ‡Đ¸ Ņ—Ņ…ĐŊŅ” Ņ–Đŧ'Ņ Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ, Ņ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ в ĐŋŅ€ĐžŅ†ĐĩҁҖ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ҆Đĩ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž. Đ¯ĐēŅ‰Đž ви ĐŋĐĩŅ€ĐĩĐŧŅ–ŅŅ‚Đ¸Đģи Đ´ĐĩŅĐēŅ– С ĐŊĐ¸Ņ… Са ĐŧĐĩĐļŅ– ĐŧĐ°ŅĐ¸Đ˛Ņƒ, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -i, --import, Ņ‰ĐžĐą вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Đ´ĐģŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ. ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Са ҈ĐģŅŅ…ĐžĐŧ, а ĐŊĐĩ Са inode. ФаКĐģ `content` НЕ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. ФаКĐģи `parity` СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. ФаКĐģи в ĐŧĐ°ŅĐ¸Đ˛Ņ– СĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Са ĐŋĐžŅ‚Ņ€Đĩйи. 5.10 check ---------- ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸŅ€Đ°Ņ†ŅŽŅ” ŅĐē `fix`, аĐģĐĩ ĐģĐ¸ŅˆĐĩ Ņ–ĐŧŅ–Ņ‚ŅƒŅ” Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ, Ņ– ĐļОдĐŊŅ– СĐŧŅ–ĐŊи ĐŊĐĩ СаĐŋĐ¸ŅŅƒŅŽŅ‚ŅŒŅŅ в ĐŧĐ°ŅĐ¸Đ˛. ĐĻŅ ĐēĐžĐŧаĐŊда в ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ Ņ€ŅƒŅ‡ĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŋҖҁĐģŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ айО в Ņ–ĐŊŅˆĐ¸Ņ… ĐžŅĐžĐąĐģĐ¸Đ˛Đ¸Ņ… ҃ĐŧĐžĐ˛Đ°Ņ…. ДĐģŅ ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐ¸Ņ… Ņ‚Đ° СаĐŋĐģаĐŊОваĐŊĐ¸Ņ… ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ `scrub`. Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ -a, --audit-only, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ”Ņ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ…Đĩ҈ Ņ„Đ°ĐšĐģŅ–Đ˛, а даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ–ĐŗĐŊĐžŅ€ŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ ŅˆĐ˛Đ¸Đ´ŅˆĐžĐŗĐž СаĐŋ҃ҁĐē҃. ФаКĐģи Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Са ҈ĐģŅŅ…ĐžĐŧ, а ĐŊĐĩ Са inode. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.11 list --------- Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒŅŅ в ĐŧĐ°ŅĐ¸Đ˛Ņ– ĐŊа ĐŧĐžĐŧĐĩĐŊŅ‚ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. З -v айО --verbose Ņ‚Đ°ĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ”Ņ‚ŅŒŅŅ Ņ‡Đ°Ņ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.12 dup -------- Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ŅƒŅŅ–Ņ… Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Ņ–Đ˛ Ņ„Đ°ĐšĐģŅ–Đ˛. Два Ņ„Đ°ĐšĐģи вваĐļĐ°ŅŽŅ‚ŅŒŅŅ Ņ€Ņ–Đ˛ĐŊиĐŧи, ŅĐēŅ‰Đž Ņ—Ņ…ĐŊŅ– Ņ…ĐĩŅˆŅ– ĐˇĐąŅ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. ДаĐŊŅ– Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊĐĩ ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ; виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊŅ– Ņ…ĐĩŅˆŅ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.13 pool --------- ĐĄŅ‚Đ˛ĐžŅ€ŅŽŅ” айО ĐžĐŊОвĐģŅŽŅ” Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– в ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– `pooling`. ФаКĐģи ĐŊĐĩ ĐēĐžĐŋŅ–ŅŽŅŽŅ‚ŅŒŅŅ, а ĐŋОв'ŅĐˇŅƒŅŽŅ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ŅĐ¸ĐŧвОĐģҖ҇ĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Đ˛ŅŅ– ҖҁĐŊŅƒŅŽŅ‡Ņ– ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ Ņ‚Đ° ĐŋĐžŅ€ĐžĐļĐŊŅ– ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ видаĐģŅŅŽŅ‚ŅŒŅŅ Ņ‚Đ° СаĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ ĐŊОвиĐŧ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅĐŧ ĐŧĐ°ŅĐ¸Đ˛Ņƒ. Đ‘ŅƒĐ´ŅŒ-ŅĐēŅ– Ņ–ĐŊŅˆŅ– ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊŅ– Ņ„Đ°ĐšĐģи СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа ĐŧҖҁ҆Җ. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Са ĐŧĐĩĐļаĐŧи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ pool. 5.14 devices ------------ Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩĐ˛Ņ– ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐŧĐ°ŅĐ¸Đ˛ĐžĐŧ. ĐĻŅ ĐēĐžĐŧаĐŊда Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ” Đ°ŅĐžŅ†Ņ–Đ°Ņ†Ņ–Ņ— ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛ ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ– Ņ– в ĐžŅĐŊОвĐŊĐžĐŧ҃ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа ŅĐē Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Đ´ĐģŅ ҁ҆ĐĩĐŊĐ°Ņ€Ņ–Ņ—Đ˛. ПĐĩŅ€ŅˆŅ– два ŅŅ‚ĐžĐ˛Đŋ҆Җ — ҆Đĩ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ Ņ‚Đ° ҈ĐģŅŅ…. ĐĐ°ŅŅ‚ŅƒĐŋĐŊŅ– два ŅŅ‚ĐžĐ˛Đŋ҆Җ — ҆Đĩ Đ˛Đ¸ŅĐžĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ Ņ‚Đ° ҈ĐģŅŅ…. ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš ŅŅ‚ĐžĐ˛ĐŋĐĩŅ†ŅŒ — ҆Đĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа в ĐŧĐ°ŅĐ¸Đ˛Ņ–. ĐŖ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛ ҃ Đ˛Đ°Ņ Ņ” ОдиĐŊ ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩвиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа в ĐŧĐ°ŅĐ¸Đ˛Ņ–, аĐģĐĩ в Đ´ĐĩŅĐēĐ¸Ņ… ҁĐēĐģадĐŊŅ–ŅˆĐ¸Ņ… ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŅ… ҃ Đ˛Đ°Ņ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐēŅ–ĐģҌĐēа ĐŊĐ¸ĐˇŅŒĐēĐžŅ€Ņ–Đ˛ĐŊĐĩĐ˛Đ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛, ŅĐēŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ОдĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ. 5.15 touch ---------- Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” Đ´ĐžĐ˛Ņ–ĐģҌĐŊ҃ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди Đ´ĐģŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ҃ ŅĐēĐ¸Ņ… вОĐŊа Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа ĐŊа ĐŊ҃ĐģҌ. ĐĻĐĩ ĐŋĐžĐēŅ€Đ°Ņ‰ŅƒŅ” ĐˇĐ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŒ SnapRAID Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊĐ°Đ˛Đ°Ņ‚Đ¸ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ‚Đ° ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи, ĐžŅĐēŅ–ĐģҌĐēи Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ‡Đ°ŅĐžĐ˛Ņƒ ĐŧŅ–Ņ‚Đē҃ ĐŧаКĐļĐĩ ҃ĐŊŅ–ĐēаĐģҌĐŊĐžŅŽ, СĐŧĐĩĐŊŅˆŅƒŅŽŅ‡Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ– Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ¸. ЗоĐēŅ€ĐĩĐŧа, ŅĐēŅ‰Đž Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди ĐŊĐĩ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊиК айО ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊиК Ņ„Đ°ĐšĐģ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ ŅĐē Ņ‚Đ°ĐēиК, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ С Ņ–ĐŧĐĩĐŊĐĩĐŧ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛ĐžŅŽ ĐŧŅ–Ņ‚ĐēĐžŅŽ. Đ¯ĐēŅ‰Đž Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž Đ´ĐžĐģŅ– ҁĐĩĐē҃ĐŊди Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” ĐŊ҃ĐģŅŽ, Đ˛Ņ–ĐŊ вваĐļĐ°Ņ”Ņ‚ŅŒŅŅ ĐēĐžĐŋŅ–Ņ”ŅŽ, ĐģĐ¸ŅˆĐĩ ŅĐēŅ‰Đž ĐŋОвĐŊиК ҈ĐģŅŅ…, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа ĐˇĐąŅ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ. Đ§Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа С Ņ‚ĐžŅ‡ĐŊŅ–ŅŅ‚ŅŽ Đ´Đž ҁĐĩĐē҃ĐŊди ĐŊĐĩ СĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ, Ņ‚ĐžĐŧ҃ Đ˛ŅŅ– Đ´Đ°Ņ‚Đ¸ Ņ‚Đ° Ņ‡Đ°Ņ Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ĐąŅƒĐ´ŅƒŅ‚ŅŒ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ–. 5.16 rehash ----------- ПĐģаĐŊŅƒŅ” ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅŒĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ĐĻŅ ĐēĐžĐŧаĐŊда СĐŧŅ–ĐŊŅŽŅ” Ņ‚Đ¸Đŋ Ņ…Đĩ҈҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ, ŅĐē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, ĐŋŅ€Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ– С 32-Ņ€ĐžĐˇŅ€ŅĐ´ĐŊĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи ĐŊа 64-Ņ€ĐžĐˇŅ€ŅĐ´ĐŊ҃, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ŅŅ С MurmurHash3 ĐŊа ŅˆĐ˛Đ¸Đ´ŅˆĐ¸Đš SpookyHash. Đ¯ĐēŅ‰Đž ви вĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ ĐžĐŋŅ‚Đ¸ĐŧаĐģҌĐŊиК Ņ…Đĩ҈, Ņ†Ņ ĐēĐžĐŧаĐŊда ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ– ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”, Ņ‰Đž ĐļОдĐŊĐ¸Ņ… Đ´Ņ–Đš ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž. ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐĩ виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐĩĐŗĐ°ĐšĐŊĐž, а Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ ĐŋĐžŅŅ‚ŅƒĐŋОвО ĐŋŅ–Đ´ Ņ‡Đ°Ņ `sync` Ņ‚Đ° `scrub`. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ŅŅ‚Đ°ĐŊ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžĐŗĐž Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `status`. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžĐŗĐž Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ĐŋОвĐŊ҃ Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊаĐģҌĐŊŅ–ŅŅ‚ŅŒ, Са Ņ”Đ´Đ¸ĐŊиĐŧ виĐŊŅŅ‚ĐēĐžĐŧ, Ņ‰Đž `dup` ĐŊĐĩ ĐŧĐžĐļĐĩ Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸ Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ…Đĩ҈. 5.17 locate ----------- ЗĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģи, Ņ‰Đž СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž СĐŊаКдĐĩĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐšĐžĐŗĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Ņ‚Đ° ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Ņ–Đ˛, ŅĐēŅ– Đ˛Ņ–ĐŊ СаКĐŧĐ°Ņ”. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ -t, --tail, Ņ‰ĐžĐą ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ Ņ„Đ°ĐšĐģаĐŧи, Ņ‰Đž СаКĐŧĐ°ŅŽŅ‚ŅŒ СаСĐŊĐ°Ņ‡ĐĩĐŊ҃ ĐēŅ–ĐŊ҆ĐĩĐ˛Ņƒ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ (Ņ…Đ˛Ņ–ŅŅ‚) ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ ҆Җ Ņ„Đ°ĐšĐģи, ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐŧ -W, --force-realloc-tail. ĐœĐ°ĐšŅ‚Đĩ ĐŊа ŅƒĐ˛Đ°ĐˇŅ–, Ņ‰Đž Ņ‚Đ°ĐēŅ– Ņ„Đ°ĐšĐģи ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊŅ– ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ҃. 6 ОĐŋ҆Җҗ ======= SnapRAID ĐŊĐ°Đ´Đ°Ņ” ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ: -c, --conf CONFIG Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ Đ´ĐģŅ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ. Đ¯ĐēŅ‰Đž ĐŊĐĩ вĐēаСаĐŊĐž, в Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ҖҁĐŊŅƒŅ”, Ņ–ĐŊаĐē҈Đĩ `/etc/snapraid.conf`. ĐŖ Windows виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` ҃ Ņ‚ĐžĐŧ҃ ŅĐ°ĐŧĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ–, Ņ‰Đž Đš `snapraid.exe`. -f, --filter PATTERN Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Ņ„Đ°ĐšĐģи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `check` Ņ‚Đ° `fix`. ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ вĐēаСаĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ҃. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ€ĐžĐˇĐ´Ņ–Đģ PATTERN Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛. В Unix ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž ŅĐ¸ĐŧвОĐģи ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ Đ˛ĐˇŅŅ‚Ņ– в ĐģаĐŋĐēи, ŅĐēŅ‰Đž вОĐŊи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С `sync` Ņ‚Đ° `scrub`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. -d, --filter-disk NAME Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Đ´Đ¸ŅĐēи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `check`, `fix`, `up` Ņ‚Đ° `down`. Ви ĐŋОвиĐŊĐŊŅ– вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ŅĐē виСĐŊĐ°Ņ‡ĐĩĐŊĐž ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–. Ви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ´Đ¸ŅĐēи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– С Ņ–ĐŧĐĩĐŊаĐŧи: `parity`, `2-parity`, `3-parity`, Ņ‚ĐžŅ‰Đž, Ņ‰ĐžĐą ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐŋĐĩвĐŊиĐŧ Đ´Đ¸ŅĐēĐžĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž ви ĐŋĐžŅ”Đ´ĐŊŅƒŅ”Ņ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš --filter, --filter-disk Ņ‚Đ° --filter-missing, Đ˛Đ¸ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ŅƒŅŅ–Đŧ ҄ҖĐģŅŒŅ‚Ņ€Đ°Đŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check`, `fix`, `up` Ņ‚Đ° `down`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С `sync` Ņ‚Đ° `scrub`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. -m, --filter-missing Đ¤Ņ–ĐģŅŒŅ‚Ņ€ŅƒŅ” Ņ„Đ°ĐšĐģи Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `check` Ņ‚Đ° `fix`. ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– айО видаĐģĐĩĐŊŅ– С ĐŧĐ°ŅĐ¸Đ˛Ņƒ. ĐŸŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– С `fix` ҆Đĩ Đ´Ņ–Ņ” ŅĐē ĐēĐžĐŧаĐŊда `undelete` (Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ видаĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛). Đ¯ĐēŅ‰Đž ви ĐŋĐžŅ”Đ´ĐŊŅƒŅ”Ņ‚Đĩ ĐēŅ–ĐģҌĐēа ĐžĐŋŅ†Ņ–Đš --filter, --filter-disk Ņ‚Đ° --filter-missing, Đ˛Đ¸ĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, Ņ‰Đž Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ŅƒŅŅ–Đŧ ҄ҖĐģŅŒŅ‚Ņ€Đ°Đŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. Đ‡Ņ— ĐŊĐĩ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ С `sync` Ņ‚Đ° `scrub`, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи СавĐļди ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒ вĐĩҁҌ ĐŧĐ°ŅĐ¸Đ˛. -e, --filter-error ĐžĐąŅ€ĐžĐąĐģŅŅ” Ņ„Đ°ĐšĐģи С ĐŋĐžĐŧиĐģĐēаĐŧи ҃ `check` Ņ‚Đ° `fix`. ĐžĐąŅ€ĐžĐąĐģŅŅ” ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŧĐ°ŅŽŅ‚ŅŒ ĐąĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊиĐŧи ĐŋĐžĐŧиĐģĐēаĐŧи айО ĐŋĐžĐŧиĐģĐēаĐŧи ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ `sync` Ņ‚Đ° `scrub`, ŅĐē СаСĐŊĐ°Ņ‡ĐĩĐŊĐž ҃ `status`. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. -p, --plan PERC|bad|new|full Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐŋĐģаĐŊ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. Đ¯ĐēŅ‰Đž PERC Ņ” Ņ‡Đ¸ŅĐģОвиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Đ˛Ņ–Đ´ 0 Đ´Đž 100, вОĐŊĐž Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚ŅƒŅ”Ņ‚ŅŒŅŅ ŅĐē Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąĐģĐžĐēŅ–Đ˛ Đ´ĐģŅ ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ. ЗаĐŧŅ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´ŅĐžŅ‚Đēа ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŋĐģаĐŊ: `bad` ҁĐēŅ€Đ°ĐąŅƒŅ” ĐŋĐžĐŗĐ°ĐŊŅ– ĐąĐģĐžĐēи, `new` ҁĐēŅ€Đ°ĐąŅƒŅ” ĐąĐģĐžĐēи, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊŅ–, Ņ– `full` ҁĐēŅ€Đ°ĐąŅƒŅ” Đ˛ŅĐĩ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `scrub`. -o, --older-than DAYS Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐŊĐ°ĐšŅŅ‚Đ°Ņ€Ņ–ŅˆŅƒ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ ĐŧĐ°ŅĐ¸Đ˛Ņƒ Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи ҃ `scrub`. DAYS — ҆Đĩ ĐŧŅ–ĐŊŅ–ĐŧаĐģҌĐŊиК Đ˛Ņ–Đē ҃ Đ´ĐŊŅŅ… Đ´ĐģŅ ĐąĐģĐžĐē҃, ŅĐēиК ĐŋОвиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ҁĐēŅ€Đ°ĐąĐžĐ˛Đ°ĐŊиК; Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ 10. БĐģĐžĐēи, ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊŅ– ŅĐē ĐŋĐžĐŗĐ°ĐŊŅ–, СавĐļди ҁĐēŅ€Đ°ĐąŅƒŅŽŅ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ ҆ҖҔҗ ĐžĐŋ҆Җҗ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `scrub`. -a, --audit-only ĐŖ `check` ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ…Đĩ҈ Ņ„Đ°ĐšĐģŅ–Đ˛ ĐąĐĩС ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ¯ĐēŅ‰Đž Đ˛Đ°Ņ ҆ҖĐēĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа даĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ ĐŧĐžĐļĐĩ СĐŊĐ°Ņ‡ĐŊĐž ĐŋŅ€Đ¸ŅĐēĐžŅ€Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžŅ†Đĩҁ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check`. -h, --pre-hash ĐŖ `sync` СаĐŋ҃ҁĐēĐ°Ņ” ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅŽ Ņ„Đ°ĐˇŅƒ Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛ŅŅ–Ņ… ĐŊĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ… Đ´ĐģŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи ĐŋĐĩŅ€ĐĩĐ´ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ҃ `sync` ĐŊĐĩ виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ” Ņ…ĐĩŅˆŅƒĐ˛Đ°ĐŊĐŊŅ, а ĐŊĐžĐ˛Ņ– даĐŊŅ– Ņ…ĐĩŅˆŅƒŅŽŅ‚ŅŒŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐŋĐĩŅ€ĐĩĐ´ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅĐŧ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ĐēĐžĐģи вОĐŊи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ вĐŋĐĩŅ€ŅˆĐĩ. ĐĻĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ Đ˛Ņ–Đ´ĐąŅƒĐ˛Đ°Ņ”Ņ‚ŅŒŅŅ, ĐēĐžĐģи ŅĐ¸ŅŅ‚ĐĩĐŧа СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ ĐŋŅ–Đ´ вĐĩĐģиĐēиĐŧ ĐŊаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅĐŧ, ŅƒŅŅ– Đ´Đ¸ŅĐēи ОйĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒŅŅ Ņ‚Đ° ĐĻП СаКĐŊŅŅ‚Đ¸Đš. ĐĻĐĩ ĐĩĐēҁ҂ҀĐĩĐŧаĐģҌĐŊа ҃ĐŧОва Đ´ĐģŅ ĐŧĐ°ŅˆĐ¸ĐŊи, Ņ– ŅĐēŅ‰Đž вОĐŊа ĐŧĐ°Ņ” ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊ҃ аĐŋĐ°Ņ€Đ°Ņ‚ĐŊ҃ ĐŋŅ€ĐžĐąĐģĐĩĐŧ҃, ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи ĐŧĐžĐļŅƒŅ‚ŅŒ СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ŅŅ ĐŊĐĩĐ˛Đ¸ŅĐ˛ĐģĐĩĐŊиĐŧи, ĐžŅĐēŅ–ĐģҌĐēи даĐŊŅ– ҉Đĩ ĐŊĐĩ ĐąŅƒĐģи Ņ…ĐĩŅˆĐžĐ˛Đ°ĐŊŅ–. ЊОй ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ Ņ†ŅŒĐžĐŗĐž Ņ€Đ¸ĐˇĐ¸Đē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ€ĐĩĐļиĐŧ `pre-hash`, Ņ‰ĐžĐą ŅƒŅŅ– даĐŊŅ– ĐąŅƒĐģи ĐˇŅ‡Đ¸Ņ‚Đ°ĐŊŅ– Đ´Đ˛Ņ–Ņ‡Ņ– Đ´ĐģŅ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ Ņ—Ņ… ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ‚Đ°ĐēĐžĐļ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ„Đ°ĐšĐģи, ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– в ĐŧĐĩĐļĐ°Ņ… ĐŧĐ°ŅĐ¸Đ˛Ņƒ, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐŊŅ ĐąŅƒĐģа ҃ҁĐŋŅ–ŅˆĐŊĐžŅŽ, Ņ–, ŅĐēŅ‰Đž ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž, дОСвОĐģŅŅ” СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅĐŧ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -i, --import DIR ІĐŧĐŋĐžŅ€Ņ‚ŅƒŅ” С вĐēаСаĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Ņ„Đ°ĐšĐģи, видаĐģĐĩĐŊŅ– С ĐŧĐ°ŅĐ¸Đ˛Ņƒ ĐŋҖҁĐģŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— `sync`. Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ Đ˛ŅĐĩ ҉Đĩ Ņ” Ņ‚Đ°ĐēŅ– Ņ„Đ°ĐšĐģи, вОĐŊи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– `check` Ņ‚Đ° `fix` Đ´ĐģŅ ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€ĐžŅ†Đĩҁ҃ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. ФаКĐģи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸, Ņ‚Đ° Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒŅŽŅ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ Ņ—Ņ…ĐŊŅŒĐžĐŗĐž Ņ–ĐŧĐĩĐŊŅ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `check` Ņ‚Đ° `fix`. -s, --spin-down-on-error ĐŸŅ€Đ¸ ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŋĐžĐŧиĐģ҆Җ ĐˇŅƒĐŋиĐŊŅŅ” Đ˛ŅŅ– ĐēĐĩŅ€ĐžĐ˛Đ°ĐŊŅ– Đ´Đ¸ŅĐēи ĐŋĐĩŅ€ĐĩĐ´ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅĐŧ С ĐŊĐĩĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ ĐēОдОĐŧ ŅŅ‚Đ°ĐŊ҃. ĐĻĐĩ СаĐŋĐžĐąŅ–ĐŗĐ°Ņ” Ņ‚ĐžĐŧ҃, Ņ‰ĐžĐą Đ´Đ¸ŅĐēи СаĐģĐ¸ŅˆĐ°ĐģĐ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧи Ņ‚Đ° ОйĐĩŅ€Ņ‚Đ°ĐģĐ¸ŅŅ ĐŋҖҁĐģŅ ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—, Đ´ĐžĐŋĐžĐŧĐ°ĐŗĐ°ŅŽŅ‡Đ¸ ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐˇĐ°ĐšĐ˛ĐžĐŗĐž ĐŊĐ°ĐŗŅ€Ņ–Đ˛Đ°ĐŊĐŊŅ Ņ‚Đ° ҁĐŋĐžĐļиваĐŊĐŊŅ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐĩĐŊĐĩŅ€ĐŗŅ–Ņ—. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ, Ņ‰ĐžĐą СайĐĩСĐŋĐĩŅ‡Đ¸Ņ‚Đ¸ ĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐˇŅƒĐŋиĐŊĐē҃ Đ´Đ¸ŅĐēŅ–Đ˛, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐēĐžĐģи ĐēĐžĐŧаĐŊда СавĐĩŅ€ŅˆŅƒŅ”Ņ‚ŅŒŅŅ ĐŋĐžĐŧиĐģĐēĐžŅŽ. -w, --bw-limit RATE Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ” ĐŗĐģОйаĐģҌĐŊĐĩ ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊĐžŅ— ĐˇĐ´Đ°Ņ‚ĐŊĐžŅŅ‚Ņ– Đ´ĐģŅ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. RATE — ҆Đĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąĐ°ĐšŅ‚Ņ–Đ˛ ĐŊа ҁĐĩĐē҃ĐŊĐ´Ņƒ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐē, Ņ‚Đ°ĐēиК ŅĐē K, M айО G (ĐŊаĐŋŅ€Đ¸ĐēĐģад, --bw-limit 1G). -t, --tail РОЗМІР ОбĐŧĐĩĐļŅƒŅ” ҁĐŋĐ¸ŅĐžĐē Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ¸Đŧи, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐŊĐĩ ĐąŅ–ĐģҌ҈Đĩ СаСĐŊĐ°Ņ‡ĐĩĐŊĐžĐŗĐž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đ˛ĐžŅŅ‚Đ° Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. МоĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐēи, Ņ‚Đ°ĐēŅ– ŅĐē K, M, G айО T (ĐŊаĐŋŅ€Đ¸ĐēĐģад, --tail 1G). ĐĻĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ Đ´Ņ–ĐšŅĐŊиК ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– Ņ€Đ°ĐˇĐžĐŧ Ņ–Đˇ ĐēĐžĐŧаĐŊĐ´ĐžŅŽ `locate`. -A, --stats ВĐŧиĐēĐ°Ņ” Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊиК ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´ ŅŅ‚Đ°ĐŊ҃, ŅĐēиК ĐŋĐžĐēĐ°ĐˇŅƒŅ” Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ. На ĐĩĐēŅ€Đ°ĐŊŅ– Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ два ĐŗŅ€Đ°Ņ„Ņ–Đēи: ПĐĩŅ€ŅˆĐ¸Đš ĐŗŅ€Đ°Ņ„Ņ–Đē ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ… ҁĐŧŅƒĐŗ (stripes) Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, Ņ€Đ°ĐˇĐžĐŧ ĐˇŅ– ҈ĐģŅŅ…ĐžĐŧ Đ´Đž Ņ„Đ°ĐšĐģ҃, Đ´Đž ŅĐēĐžĐŗĐž ĐŊĐ°Ņ€Đ°ĐˇŅ– ĐˇĐ´Ņ–ĐšŅĐŊŅŽŅ”Ņ‚ŅŒŅŅ Đ´ĐžŅŅ‚ŅƒĐŋ ĐŊа Ņ†ŅŒĐžĐŧ҃ Đ´Đ¸ŅĐē҃. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ĐŊаКĐŋĐžĐ˛Ņ–ĐģҌĐŊŅ–ŅˆĐ¸Đš Đ´Đ¸ŅĐē ĐŊĐĩ ĐŧĐ°Ņ‚Đ¸ĐŧĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž ĐąŅƒŅ„ĐĩŅ€Đ°, Ņ‰Đž виСĐŊĐ°Ņ‡Đ°Ņ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžŅŅĐļĐŊ҃ ĐŋŅ€ĐžĐŋ҃ҁĐēĐŊ҃ ĐˇĐ´Đ°Ņ‚ĐŊŅ–ŅŅ‚ŅŒ. Đ”Ņ€ŅƒĐŗĐ¸Đš ĐŗŅ€Đ°Ņ„Ņ–Đē ĐŋĐžĐēĐ°ĐˇŅƒŅ” Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē Ņ‡Đ°ŅŅƒ, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŊа ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Са ĐžŅŅ‚Đ°ĐŊĐŊŅ– 100 ҁĐĩĐē҃ĐŊĐ´. ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‰Đž ĐŊаКĐŋĐžĐ˛Ņ–ĐģҌĐŊŅ–ŅˆĐ¸Đš Đ´Đ¸ŅĐē ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐ¸Ņ‚ŅŒ ĐąŅ–ĐģҌ҈҃ Ņ‡Đ°ŅŅ‚Đ¸ĐŊ҃ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‚ĐžĐ´Ņ– ŅĐē Ņ–ĐŊŅˆŅ– Đ´Đ¸ŅĐēи ĐŋОвиĐŊĐŊŅ– ĐŧĐ°Ņ‚Đ¸ ĐŊĐĩвĐĩĐģиĐēиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ айО ĐˇĐžĐ˛ŅŅ–Đŧ ĐšĐžĐŗĐž ĐŊĐĩ ĐŧĐ°Ņ‚Đ¸, ĐžŅĐēŅ–ĐģҌĐēи вОĐŊи ĐŧĐžĐļŅƒŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅĐ˛ĐžŅ— ĐąŅƒŅ„ĐĩŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊŅ– ҁĐŧŅƒĐŗĐ¸. ĐĻĐĩĐš ĐŗŅ€Đ°Ņ„Ņ–Đē Ņ‚Đ°ĐēĐžĐļ ĐŋĐžĐēĐ°ĐˇŅƒŅ” Ņ‡Đ°Ņ, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊиК ĐŊа ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ Ņ…Đĩ҈҃ Ņ‚Đ° ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊҌ RAID. ĐŖŅŅ– ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ виĐēĐžĐŊŅƒŅŽŅ‚ŅŒŅŅ ĐŋĐ°Ņ€Đ°ĐģĐĩĐģҌĐŊĐž С ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅĐŧи Đ´Đ¸ŅĐēа. ĐĸĐžĐŧ҃, Đ´ĐžĐēи Ņ” виĐŧŅ–Ņ€ŅŽĐ˛Đ°ĐŊиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Đ´ĐģŅ ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ҆Đĩ вĐēĐ°ĐˇŅƒŅ” ĐŊа Ņ‚Đĩ, Ņ‰Đž ĐĻП Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž ŅˆĐ˛Đ¸Đ´ĐēиК, Ņ‰ĐžĐą ҁĐŋŅ€Đ°Đ˛ĐģŅŅ‚Đ¸ŅŅ С Ņ€ĐžĐąĐžŅ‡Đ¸Đŧ ĐŊаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅĐŧ. -Z, --force-zero Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģ҃ С ĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ, ŅĐēиК Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐąŅƒĐ˛ ĐŊĐĩĐŊ҃ĐģŅŒĐžĐ˛Đ¸Đŧ. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ” Ņ‚Đ°Đē҃ ҃ĐŧĐžĐ˛Ņƒ, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” ĐģĐĩĐŗĐēĐž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи ĐŋҖҁĐģŅ ĐˇĐąĐžŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧи Đ´ĐĩŅĐēŅ– Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ– Ņ„Đ°ĐšĐģи ĐąŅƒĐģи ĐžĐąŅ€Ņ–ĐˇĐ°ĐŊŅ–. ĐĻĐĩ ĐŧĐžĐļĐģива ҃ĐŧОва в Linux С Ņ„Đ°ĐšĐģОвиĐŧи ŅĐ¸ŅŅ‚ĐĩĐŧаĐŧи ext3/ext4. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -E, --force-empty Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Đ´Đ¸ŅĐēа, ĐŊа ŅĐēĐžĐŧ҃ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– Đ˛ŅŅ– ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊŅ– Ņ„Đ°ĐšĐģи. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ”, Ņ‰Đž Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ŅĐēŅ– ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐąŅƒĐģи ĐŊа Đ´Đ¸ŅĐē҃, Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ– айО ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°ĐŊŅ–, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” ĐģĐĩĐŗĐēĐž Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи Ņ„Đ°ĐšĐģОва ŅĐ¸ŅŅ‚ĐĩĐŧа даĐŊĐ¸Ņ… ĐŊĐĩ СĐŧĐžĐŊŅ‚ĐžĐ˛Đ°ĐŊа. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -U, --force-uuid Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ‚Đ° виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ С Đ´Đ¸ŅĐēаĐŧи, ŅĐēŅ– СĐŧŅ–ĐŊиĐģи ŅĐ˛Ņ–Đš UUID. Đ¯ĐēŅ‰Đž SnapRAID Đ˛Đ¸ŅĐ˛ĐģŅŅ”, Ņ‰Đž Đ´ĐĩŅĐēŅ– Đ´Đ¸ŅĐēи СĐŧŅ–ĐŊиĐģи UUID, Đ˛Ņ–ĐŊ ĐŋŅ€Đ¸ĐŋиĐŊŅŅ” ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ, ŅĐēŅ‰Đž ви ĐŊĐĩ вĐēаĐļĐĩŅ‚Đĩ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ. ĐĻĐĩ дОСвОĐģŅŅ” Đ˛Đ¸ŅĐ˛Đ¸Ņ‚Đ¸, ĐēĐžĐģи Đ˛Đ°ŅˆŅ– Đ´Đ¸ŅĐēи СĐŧĐžĐŊŅ‚ĐžĐ˛Đ°ĐŊŅ– в ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐ¸Ņ… Ņ‚ĐžŅ‡ĐēĐ°Ņ… ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ. ОдĐŊаĐē, дОСвОĐģĐĩĐŊĐž ĐŧĐ°Ņ‚Đ¸ ОдĐŊ҃ СĐŧŅ–ĐŊ҃ UUID С ОдĐŊŅ–Ņ”ŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ Ņ– ĐąŅ–ĐģҌ҈Đĩ С ĐŧĐŊĐžĐļиĐŊĐŊĐžŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŽ, ĐžŅĐēŅ–ĐģҌĐēи ҆Đĩ ĐŊĐžŅ€ĐŧаĐģҌĐŊиК виĐŋадОĐē ĐŋŅ€Đ¸ СаĐŧŅ–ĐŊŅ– Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`, `check` айО `fix`. -D, --force-device Đ¤ĐžŅ€ŅŅƒŅ” ĐŊĐĩĐąĐĩСĐŋĐĩ҇ĐŊ҃ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–ŅŽ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ С ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧи Đ´Đ¸ŅĐēаĐŧи айО С Đ´Đ¸ŅĐēаĐŧи ĐŊа Ņ‚ĐžĐŧ҃ Đļ Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊĐžĐŧ҃ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ви Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Đģи два Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ… Ņ– ĐŧĐ°Ņ”Ņ‚Đĩ СаĐŋĐ°ŅĐŊиК Đ´Đ¸ŅĐē Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ ĐŋĐĩŅ€ŅˆĐžĐŗĐž, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Ņ€ŅƒĐŗĐ¸Đš ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиК Đ´Đ¸ŅĐē. АйО, ŅĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Đ´Đ¸ŅĐē ҃ Đ˛Ņ–ĐģҌĐŊĐžĐŧ҃ ĐŧҖҁ҆Җ, СаĐģĐ¸ŅˆĐĩĐŊĐžĐŧ҃ ĐŊа вĐļĐĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°ĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Ņ‚ĐžĐš ŅĐ°ĐŧиК Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `fix`. -N, --force-nocopy ĐŖ `sync`, `check` Ņ‚Đ° `fix` виĐŧиĐēĐ°Ņ” ĐĩĐ˛Ņ€Đ¸ŅŅ‚Đ¸Đē҃ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐēĐžĐŋŅ–Đš. БĐĩС ҆ҖҔҗ ĐžĐŋ҆Җҗ SnapRAID ĐŋŅ€Đ¸Đŋ҃ҁĐēĐ°Ņ”, Ņ‰Đž Ņ„Đ°ĐšĐģи С ОдĐŊаĐēОвиĐŧи Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°Đŧи, Ņ‚Đ°ĐēиĐŧи ŅĐē Ņ–Đŧ'Ņ, Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ‚Đ° Ņ‡Đ°ŅĐžĐ˛Đ° ĐŧŅ–Ņ‚Đēа, Ņ” ĐēĐžĐŋŅ–ŅĐŧи С Ņ‚Đ¸Đŧи Đļ даĐŊиĐŧи. ĐĻĐĩ дОСвОĐģŅŅ” Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēŅƒĐ˛Đ°Ņ‚Đ¸ ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊŅ– айО ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи С ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŊа Ņ–ĐŊŅˆĐ¸Đš Ņ– ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” вĐļĐĩ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊ҃ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ Ņ…Đĩ҈҃ Đ´ĐģŅ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋĐžĐŧиĐģĐžĐē айО Đ´ĐģŅ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛. ĐŖ Đ´ĐĩŅĐēĐ¸Ņ… Ņ€Ņ–Đ´ĐēҖҁĐŊĐ¸Ņ… виĐŋадĐēĐ°Ņ… Ņ†Ņ ĐŋОвĐĩĐ´Ņ–ĐŊĐēа ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ…Đ¸ĐąĐŊĐ¸Ņ… ҁĐŋŅ€Đ°Ņ†ŅŒĐžĐ˛ŅƒĐ˛Đ°ĐŊҌ айО ĐŋĐžĐ˛Ņ–ĐģҌĐŊĐžĐŗĐž ĐŋŅ€ĐžŅ†Đĩҁ҃ ҇ĐĩŅ€ĐĩС ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐžĐē Ņ…Đĩ҈҃, Ņ– Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ дОСвОĐģŅŅ” Đ˛Đ¸Ņ€Ņ–ŅˆĐ¸Ņ‚Đ¸ Ņ‚Đ°ĐēŅ– ĐŋŅ€ĐžĐąĐģĐĩĐŧи. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`, `check` Ņ‚Đ° `fix`. -F, --force-full ĐŖ `sync` Ņ„ĐžŅ€ŅŅƒŅ” ĐŋОвĐŊĐĩ ĐŋĐĩŅ€ĐĩĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸, ĐēĐžĐģи ви Đ´ĐžĐ´Đ°Ņ”Ņ‚Đĩ ĐŊОвиК Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО ŅĐēŅ‰Đž ви ĐŋОвĐĩŅ€ĐŊ҃ĐģĐ¸ŅŅ Đ´Đž ŅŅ‚Đ°Ņ€ĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ вĐŧŅ–ŅŅ‚Ņƒ, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐąŅ–ĐģҌ҈ ĐŊĐžĐ˛Ņ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ЗаĐŧŅ–ŅŅ‚ŅŒ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– С ĐŊ҃ĐģŅ, ҆Đĩ дОСвОĐģŅŅ” ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ…ĐĩŅˆŅ–, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ… Ņ‚Đ° ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēи ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ€ĐžŅ†Đĩҁ҃ `sync`, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ҖҁĐŊŅƒŅŽŅ‡Ņ– даĐŊŅ– ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. -R, --force-realloc ĐŖ `sync` Ņ„ĐžŅ€ŅŅƒŅ” ĐŋОвĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ° ĐŋĐĩŅ€ĐĩĐąŅƒĐ´ĐžĐ˛Ņƒ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐŋОвĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ҃ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ŅƒŅŅƒĐ˛Đ°ŅŽŅ‡Đ¸ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ, ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ…ĐĩŅˆŅ–, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ, Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи даĐŊĐ¸Ņ…. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ С `sync`. ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ Ņ—Ņ— виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. Ви НЕ ĐŧĐ°Ņ”Ņ‚Đĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— `sync`. -W, --force-realloc-tail РОЗМІР ĐŸŅ€Đ°Ņ†ŅŽŅ” ŅĐē -R, --force-realloc, аĐģĐĩ ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ вĐēаСаĐŊĐžŅŽ ĐēŅ–ĐŊ҆ĐĩĐ˛ĐžŅŽ Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ (ĐžŅŅ‚Đ°ĐŊĐŊŅ– РОЗМІР ĐąĐ°ĐšŅ‚) ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–ĐģŅŅ” (ĐŋĐĩŅ€ĐĩĐŧŅ–Ņ‰ŅƒŅ”) ĐąŅƒĐ´ŅŒ-ŅĐēŅ– Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ¸/ĐąĐģĐžĐēи Ņ„Đ°ĐšĐģŅ–Đ˛, Ņ‰Đž ĐŊĐ°Ņ€Đ°ĐˇŅ– СйĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‚ŅŒŅŅ в Ņ†Ņ–Đš ĐēŅ–ĐŊ҆ĐĩĐ˛Ņ–Đš ҁĐĩĐē҆Җҗ, дОСвОĐģŅŅŽŅ‡Đ¸ Ņ€ĐžĐˇĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Ņ—Ņ… ĐąŅƒĐ´ŅŒ-Đ´Đĩ ҃ Ņ„Đ°ĐšĐģŅ–(Đ°Ņ…) ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Đ´Đĩ Ņ” Đ˛Ņ–ĐģҌĐŊĐĩ ĐŧҖҁ҆Đĩ (вĐēĐģŅŽŅ‡ĐŊĐž С ĐŊĐ°ŅĐ˛ĐŊиĐŧи ĐŋŅƒŅŅ‚ĐžŅ‚Đ°Đŧи). ĐžŅĐŊОвĐŊа ĐŧĐĩŅ‚Đ° Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° — СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŊа Đ´Đ¸ŅĐē҃. Đ¯ĐēŅ‰Đž ĐŋĐĩŅ€ĐĩŅ€ĐžĐˇĐŋĐžĐ´Ņ–Đģ ҃ҁĐŋŅ–ŅˆĐŊĐž ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Đ˛ŅŅŽ ĐēŅ–ĐŊ҆ĐĩĐ˛Ņƒ ҁĐĩĐēŅ†Ņ–ŅŽ (҃ ĐŊŅ–Đš ĐŊĐĩ СаĐģĐ¸ŅˆĐ¸Ņ‚ŅŒŅŅ ĐąĐģĐžĐēŅ–Đ˛), Ņ„Đ°ĐšĐģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐąŅƒĐ´Đĩ ĐžĐąŅ€Ņ–ĐˇĐ°ĐŊиК, Đ˛Đ¸Đ˛Ņ–ĐģҌĐŊŅŅŽŅ‡Đ¸ ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ Ņ…Đ˛ĐžŅŅ‚Đ°. МоĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐŊиĐēи, Ņ‚Đ°ĐēŅ– ŅĐē K, M, G айО T (ĐŊаĐŋŅ€Đ¸ĐēĐģад, --force-realloc-tail 1G). Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ locate -t, --tail, Ņ‰ĐžĐą СаСдаĐģĐĩĐŗŅ–Đ´ŅŒ Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐŋŅ€Đž ĐˇĐ°Ņ‡ĐĩĐŋĐģĐĩĐŊŅ– Ņ„Đ°ĐšĐģи. ĐŖĐ’ĐĐ“Đ! ĐĻĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊиК ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐšĐžĐŗĐž ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸. ĐŸŅ–Đ´ Ņ‡Đ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— `sync` ĐˇĐ°Ņ…Đ¸ŅŅ‚ даĐŊĐ¸Ņ… Đ´ĐģŅ ĐˇĐ°Ņ‡ĐĩĐŋĐģĐĩĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Đ’Đ†Đ”ĐĄĐŖĐĸНІЙ. -l, --log FILE ЗаĐŋĐ¸ŅŅƒŅ” Đ´ĐĩŅ‚Đ°ĐģҌĐŊиК ĐļŅƒŅ€ĐŊаĐģ ҃ вĐēаСаĐŊиК Ņ„Đ°ĐšĐģ. Đ¯ĐēŅ‰Đž Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐēаСаĐŊа, ĐŊĐĩҁĐŋĐžĐ´Ņ–Đ˛Đ°ĐŊŅ– ĐŋĐžĐŧиĐģĐēи Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа ĐĩĐēŅ€Đ°ĐŊ, Ņ‰Đž ĐŋĐžŅ‚ĐĩĐŊŅ†Ņ–ĐšĐŊĐž ĐŋŅ€Đ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž ĐŊадĐŧŅ–Ņ€ĐŊĐžĐŗĐž вивĐĩĐ´ĐĩĐŊĐŊŅ ҃ виĐŋадĐē҃ ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐžŅ… ĐŋĐžĐŧиĐģĐžĐē. КоĐģи вĐēаСаĐŊĐž -l, --log, ĐŊа ĐĩĐēŅ€Đ°ĐŊ Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ„Đ°Ņ‚Đ°ĐģҌĐŊŅ– ĐŋĐžĐŧиĐģĐēи, ŅĐēŅ– ҁĐŋŅ€Đ¸Ņ‡Đ¸ĐŊŅŅŽŅ‚ŅŒ ĐˇŅƒĐŋиĐŊĐē҃ SnapRAID. Đ¯ĐēŅ‰Đž ҈ĐģŅŅ… ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ С `>>`, Ņ„Đ°ĐšĐģ Đ˛Ņ–Đ´ĐēŅ€Đ¸Đ˛Đ°Ņ”Ņ‚ŅŒŅŅ ҃ Ņ€ĐĩĐļиĐŧŅ– Đ´ĐžĐŋОвĐŊĐĩĐŊĐŊŅ. Đ’Ņ…ĐžĐ´ĐļĐĩĐŊĐŊŅ `%D` Ņ‚Đ° `%T` в Ņ–ĐŧĐĩĐŊŅ– СаĐŧŅ–ĐŊŅŽŅŽŅ‚ŅŒŅŅ Đ´Đ°Ņ‚ĐžŅŽ Ņ‚Đ° Ņ‡Đ°ŅĐžĐŧ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– YYYYMMDD Ņ‚Đ° HHMMSS. ĐŖ ĐŋаĐēĐĩŅ‚ĐŊĐ¸Ņ… Ņ„Đ°ĐšĐģĐ°Ņ… Windows ви ĐŋОвиĐŊĐŊŅ– ĐŋĐžĐ´Đ˛ĐžŅ—Ņ‚Đ¸ ŅĐ¸ĐŧвОĐģ `%`, ĐŊаĐŋŅ€Đ¸ĐēĐģад, result-%%D.log. ЊОй виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `>>`, ви ĐŋОвиĐŊĐŊŅ– Đ˛ĐˇŅŅ‚Đ¸ Ņ–Đŧ'Ņ в ĐģаĐŋĐēи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, `">>result.log"`. ЊОй вивĐĩŅŅ‚Đ¸ ĐļŅƒŅ€ĐŊаĐģ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Đ˛Đ¸Đ˛Ņ–Đ´ айО ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊ҃ ĐŋĐžĐŧиĐģĐē҃, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `">&1"` Ņ‚Đ° `">&2"` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐž. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ snapraid_log.txt айО man-ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ Đ´ĐģŅ ĐžĐŋĐ¸ŅŅ–Đ˛ Ņ‚ĐĩĐŗŅ–Đ˛ ĐļŅƒŅ€ĐŊаĐģ҃. -L, --error-limit NUMBER Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” ĐŊОвиК ĐģŅ–ĐŧŅ–Ņ‚ ĐŋĐžĐŧиĐģĐžĐē ĐŋĐĩŅ€ĐĩĐ´ ĐˇŅƒĐŋиĐŊĐēĐžŅŽ виĐēĐžĐŊаĐŊĐŊŅ. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ SnapRAID ĐˇŅƒĐŋиĐŊŅŅ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐˇŅƒŅŅ‚Ņ€Ņ–Ņ‡Đ°Ņ” ĐąŅ–ĐģҌ҈Đĩ 100 ĐŋĐžĐŧиĐģĐžĐē ввĐĩĐ´ĐĩĐŊĐŊŅ/вивĐĩĐ´ĐĩĐŊĐŊŅ, Ņ‰Đž вĐēĐ°ĐˇŅƒŅ” ĐŊа ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊ҃ Đ˛Ņ–Đ´ĐŧĐžĐ˛Ņƒ Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа `sync` Ņ‚Đ° `scrub`, ŅĐēиĐŧ дОСвОĐģĐĩĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋҖҁĐģŅ ĐŋĐĩŅ€ŅˆĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Ņƒ ĐŋĐžĐŧиĐģĐžĐē Đ´Đ¸ŅĐēа, Ņ‰ĐžĐą ҁĐŋŅ€ĐžĐąŅƒĐ˛Đ°Ņ‚Đ¸ СавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ ŅĐ˛ĐžŅ— ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—. ОдĐŊаĐē `check` Ņ‚Đ° `fix` СавĐļди ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ ĐŋŅ€Đ¸ ĐŋĐĩŅ€ŅˆŅ–Đš ĐŋĐžĐŧиĐģ҆Җ. -S, --start BLKSTART ĐŸĐžŅ‡Đ¸ĐŊĐ°Ņ” ĐžĐąŅ€ĐžĐąĐē҃ С вĐēаСаĐŊĐžĐŗĐž ĐŊĐžĐŧĐĩŅ€Đ° ĐąĐģĐžĐē҃. ĐĻĐĩ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžŅ— ҁĐŋŅ€ĐžĐąĐ¸ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи айО виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐŋĐĩвĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛ ҃ виĐŋадĐē҃ ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ в ĐžŅĐŊОвĐŊĐžĐŧ҃ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. -B, --count BLKCOUNT ĐžĐąŅ€ĐžĐąĐģŅŅ” ĐģĐ¸ŅˆĐĩ вĐēаСаĐŊ҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐąĐģĐžĐēŅ–Đ˛. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ в ĐžŅĐŊОвĐŊĐžĐŧ҃ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐžĐŗĐž Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ. -C, --gen-conf CONTENT ГĐĩĐŊĐĩŅ€ŅƒŅ” ҄ҖĐēŅ‚Đ¸Đ˛ĐŊиК ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ С ҖҁĐŊŅƒŅŽŅ‡ĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ вĐŧŅ–ŅŅ‚Ņƒ. КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ СаĐŋĐ¸ŅŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Đ˛Đ¸Đ˛Ņ–Đ´ Ņ– ĐŊĐĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅŅƒŅ” ҖҁĐŊŅƒŅŽŅ‡Đ¸Đš. ĐĻĐĩĐš ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ Ņ‚Đ°ĐēĐžĐļ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊ҃ Đ´ĐģŅ Ņ€ĐĩĐēĐžĐŊŅŅ‚Ņ€ŅƒĐē҆Җҗ Ņ‚ĐžŅ‡ĐžĐē ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēа ҃ виĐŋадĐē҃ Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸ Đ˛ŅŅ–Ņ”Ņ— ŅĐ¸ŅŅ‚ĐĩĐŧи. -v, --verbose Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐąŅ–ĐģҌ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŊа ĐĩĐēŅ€Đ°ĐŊ. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ОдиĐŊ Ņ€Đ°Đˇ, Đ˛Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ виĐēĐģŅŽŅ‡ĐĩĐŊŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņƒ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đē҃. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа Ņ„Đ°ĐšĐģи ĐļŅƒŅ€ĐŊаĐģ҃. -q, --quiet Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐŧĐĩĐŊ҈Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŊа ĐĩĐēŅ€Đ°ĐŊ. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž ОдиĐŊ Ņ€Đ°Đˇ, видаĐģŅŅ” Ņ–ĐŊдиĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€ĐžĐŗŅ€Đĩҁ҃; Đ´Đ˛Ņ–Ņ‡Ņ– — ĐŋĐžŅ‚ĐžŅ‡ĐŊŅ– ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ—; Ņ‚Ņ€Đ¸Ņ‡Ņ– — Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊŅ– ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ; Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Đ°ĐˇĐ¸ — ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ ĐŋŅ€Đž ŅŅ‚Đ°Ņ‚ŅƒŅ. Đ¤Đ°Ņ‚Đ°ĐģҌĐŊŅ– ĐŋĐžĐŧиĐģĐēи СавĐļди Đ˛Đ¸Đ˛ĐžĐ´ŅŅ‚ŅŒŅŅ ĐŊа ĐĩĐēŅ€Đ°ĐŊ. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа Ņ„Đ°ĐšĐģи ĐļŅƒŅ€ĐŊаĐģ҃. -H, --help Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐēĐžŅ€ĐžŅ‚ĐēиК Đ´ĐžĐ˛Ņ–Đ´ĐēОвиК ĐĩĐēŅ€Đ°ĐŊ. -V, --version Đ’Đ¸Đ˛ĐžĐ´Đ¸Ņ‚ŅŒ вĐĩŅ€ŅŅ–ŅŽ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи. 7 КоĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ ============== SnapRAID виĐŧĐ°ĐŗĐ°Ņ” ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ, Ņ‰ĐžĐą СĐŊĐ°Ņ‚Đ¸, Đ´Đĩ Ņ€ĐžĐˇŅ‚Đ°ŅˆĐžĐ˛Đ°ĐŊиК Đ˛Đ°Ņˆ Đ´Đ¸ŅĐēОвиК ĐŧĐ°ŅĐ¸Đ˛ Ņ– Đ´Đĩ СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. В Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `/usr/local/etc/snapraid.conf`, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ҖҁĐŊŅƒŅ”, Ņ–ĐŊаĐē҈Đĩ `/etc/snapraid.conf`. ĐŖ Windows виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ `snapraid.conf` ҃ Ņ‚ĐžĐŧ҃ ŅĐ°ĐŧĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ–, Ņ‰Đž Đš `snapraid.exe`. Đ’Ņ–ĐŊ ĐŋОвиĐŊĐĩĐŊ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– ĐžĐŋ҆Җҗ (Ņ‡ŅƒŅ‚ĐģĐ¸Đ˛Ņ– Đ´Đž Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€Ņƒ): 7.1 parity FILE [,FILE] ... --------------------------- ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐˇĐ°Ņ…Đ¸ŅŅ‚ Đ˛Ņ–Đ´ Đ˛Ņ–Đ´ĐŧОви ОдĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа, ĐŋĐžĐ´Ņ–ĐąĐŊĐž Đ´Đž RAID5. Ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ ĐŊа Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. КоĐģи Ņ„Đ°ĐšĐģ ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ ĐŧĐžĐļĐĩ ĐˇŅ€ĐžŅŅ‚Đ°Ņ‚Đ¸, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊиК. Đ—Đ°ĐŗĐ°ĐģҌĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋĐŊиК ĐŋŅ€ĐžŅŅ‚Ņ–Ņ€ ĐŋОвиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– Ņ‚Đ°ĐēиĐŧ ĐļĐĩ вĐĩĐģиĐēиĐŧ, ŅĐē ĐŊĐ°ĐšĐąŅ–ĐģŅŒŅˆĐ¸Đš Đ´Đ¸ŅĐē даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– Ņ„Đ°ĐšĐģи ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ, аĐģĐĩ ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Ņ—Ņ… ĐŋĐĩŅ€Đĩ҃ĐŋĐžŅ€ŅĐ´ĐēĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ айО видаĐģŅŅ‚Đ¸. ЗбĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ Đ´Đ¸ŅĐēŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐˇĐ°Ņ€ĐĩСĐĩŅ€Đ˛ĐžĐ˛Đ°ĐŊиĐŧи Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– СайĐĩСĐŋĐĩŅ‡ŅƒŅ”, Ņ‰Đž вОĐŊи ĐŊĐĩ ŅŅ‚Đ°ŅŽŅ‚ŅŒ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚ĐžĐ˛Đ°ĐŊиĐŧи, ĐŋĐžĐēŅ€Đ°Ņ‰ŅƒŅŽŅ‡Đ¸ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ. ĐŖ Windows 256 МБ СаĐģĐ¸ŅˆĐ°Ņ”Ņ‚ŅŒŅŅ ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊиĐŧи ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž ĐŋОвĐŊŅ– Đ´Đ¸ŅĐēи. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” ОйОв'ŅĐˇĐēĐžĐ˛ĐžŅŽ Ņ– ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊа ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Đ°Đˇ. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģи, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž вĐēаСаĐŊĐžĐŗĐž Ņ€Ņ–Đ˛ĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– вĐŧиĐēĐ°Ņ”Ņ‚ŅŒŅŅ ОдиĐŊ Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ: * 2-parity вĐŧиĐēĐ°Ņ” ĐŋĐžĐ´Đ˛Ņ–ĐšĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ RAID6. * 3-parity вĐŧиĐēĐ°Ņ” ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. * 4-parity вĐŧиĐēĐ°Ņ” ҇ĐĩŅ‚Đ˛ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. * 5-parity вĐŧиĐēĐ°Ņ” Đŋ'ŅŅ‚ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. * 6-parity вĐŧиĐēĐ°Ņ” ҈Đĩҁ҂ĐĩŅ€ĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ. КоĐļĐĩĐŊ Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– виĐŧĐ°ĐŗĐ°Ņ” ĐŊĐ°ŅĐ˛ĐŊĐžŅŅ‚Ņ– Đ˛ŅŅ–Ņ… ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ–Ņ… Ņ€Ņ–Đ˛ĐŊŅ–Đ˛ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ҂Җ ŅĐ°ĐŧŅ– ĐŧŅ–Ņ€ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰Đž Đš Đ´ĐģŅ ĐžĐŋ҆Җҗ `parity`. ĐĻŅ– ĐžĐŋ҆Җҗ Ņ” ĐŊĐĩОйОв'ŅĐˇĐēОвиĐŧи Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– ĐģĐ¸ŅˆĐĩ ОдиĐŊ Ņ€Đ°Đˇ. 7.3 z-parity FILE [,FILE] ... ----------------------------- ВизĐŊĐ°Ņ‡Đ°Ņ” аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊиК Ņ„Đ°ĐšĐģ Ņ‚Đ° Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊĐžŅ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” аĐģŅŒŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐžŅŽ `3-parity`, в ĐŋĐĩŅ€ŅˆŅƒ ҇ĐĩŅ€ĐŗŅƒ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊа Đ´ĐģŅ ĐĻП ĐŊĐ¸ĐˇŅŒĐēĐžĐŗĐž ĐēĐģĐ°ŅŅƒ, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē ARM айО AMD Phenom, Athlon Ņ‚Đ° Opteron, ŅĐēŅ– ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ ĐŊĐ°ĐąŅ–Ņ€ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐēŅ†Ņ–Đš SSSE3. ĐŖ Ņ‚Đ°ĐēĐ¸Ņ… виĐŋадĐēĐ°Ņ… вОĐŊа СайĐĩСĐŋĐĩŅ‡ŅƒŅ” ĐēŅ€Đ°Ņ‰Ņƒ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ. ĐĻĐĩĐš Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ŅŅ…ĐžĐļиК, аĐģĐĩ ŅˆĐ˛Đ¸Đ´ŅˆĐ¸Đš, ĐŊŅ–Đļ Ņ‚ĐžĐš, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ZFS RAIDZ3. Đ¯Đē Ņ– ZFS, Đ˛Ņ–ĐŊ ĐŊĐĩ ĐŋŅ€Đ°Ņ†ŅŽŅ” даĐģŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐšĐŊĐžŅ— ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐŸŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– `3-parity` ви ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊŅ–, ŅĐēŅ‰Đž Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ `z-parity` Đ´ĐģŅ ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚Ņ–. МоĐļĐŊа ĐēĐžĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ С ОдĐŊĐžĐŗĐž Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņƒ в Ņ–ĐŊŅˆĐ¸Đš, ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Đ˛ŅˆĐ¸ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊиК Ņ„Đ°ĐšĐģ С йаĐļаĐŊиĐŧ Ņ„Đ°ĐšĐģĐžĐŧ z-parity айО 3-parity Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ `fix` Đ´ĐģŅ ĐšĐžĐŗĐž Đ˛Ņ–Đ´Ņ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ. 7.4 content FILE ---------------- ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ„Đ°ĐšĐģ, ŅĐēиК ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ҁĐŋĐ¸ŅĐē҃ Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊĐ¸Ņ… ҁ҃Đŧ ŅƒŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ–Ņ… ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. Đ’Ņ–ĐŊ ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ Ņ€ĐžĐˇĐŧҖ҉ĐĩĐŊиК ĐŊа Đ´Đ¸ŅĐē҃, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ даĐŊĐ¸Ņ…, ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– айО ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ Ņ–ĐŊŅˆĐžĐŧ҃ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃. Đ¯ĐēŅ‰Đž ви виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚Đĩ Đ´Đ¸ŅĐē даĐŊĐ¸Ņ…, ҆ĐĩĐš Ņ„Đ°ĐšĐģ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ С ĐŋŅ€ĐžŅ†Đĩҁ҃ `sync`. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ Ņ” ОйОв'ŅĐˇĐēĐžĐ˛ĐžŅŽ Ņ– ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊа ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛ Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… ĐēĐžĐŋŅ–Đš ОдĐŊĐžĐŗĐž Ņ– Ņ‚ĐžĐŗĐž Đļ Ņ„Đ°ĐšĐģ҃. Ви ĐŋОвиĐŊĐŊŅ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊ҃ ĐēĐžĐŋŅ–ŅŽ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŋĐģŅŽŅ ОдĐŊ҃. ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… ĐēĐžĐŋŅ–Đš ĐŊĐĩ ĐˇĐ°ŅˆĐēĐžĐ´Đ¸Ņ‚ŅŒ. 7.5 data NAME DIR ----------------- ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ–Đŧ'Ņ Ņ‚Đ° Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēŅ–Đ˛ даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. NAME виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— Đ´Đ¸ŅĐēа Ņ– ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ҃ĐŊŅ–ĐēаĐģҌĐŊиĐŧ. DIR — ҆Đĩ Ņ‚ĐžŅ‡Đēа ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´Đ¸ŅĐēа ҃ Ņ„Đ°ĐšĐģĐžĐ˛Ņ–Đš ŅĐ¸ŅŅ‚ĐĩĐŧŅ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Са ĐŋĐžŅ‚Ņ€Đĩйи, ĐŋĐžĐēи ви СйĐĩŅ€Ņ–ĐŗĐ°Ņ”Ņ‚Đĩ NAME ҄ҖĐēŅĐžĐ˛Đ°ĐŊиĐŧ. Ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ОдĐŊ҃ ĐžĐŋŅ†Ņ–ŅŽ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đ¸ŅĐē ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ, СĐŧŅ–ĐŊĐ¸Đ˛ŅˆĐ¸ NAME ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–, а ĐŋĐžŅ‚Ņ–Đŧ СаĐŋŅƒŅŅ‚Đ¸Đ˛ŅˆĐ¸ ĐēĐžĐŧаĐŊĐ´Ņƒ `sync`. ĐŖ виĐŋадĐē҃ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Đ°ŅĐžŅ†Ņ–Đ°Ņ†Ņ–Ņ ĐˇĐ´Ņ–ĐšŅĐŊŅŽŅ”Ņ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ СйĐĩŅ€ĐĩĐļĐĩĐŊĐžĐŗĐž UUID Đ´Đ¸ŅĐēŅ–Đ˛. 7.6 extra NAME DIR ------------------ ВизĐŊĐ°Ņ‡Đ°Ņ” ĐŊĐ°ĐˇĐ˛Ņƒ Ņ‚Đ° Ņ‚ĐžŅ‡Đē҃ ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Đ¸Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ Đ´ĐģŅ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊĐ´ `smart` Ņ‚Đ° `probe`. ĐĻĐĩ ĐēĐžŅ€Đ¸ŅĐŊĐž Đ´ĐģŅ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ Ņ” Ņ‡Đ°ŅŅ‚Đ¸ĐŊĐžŅŽ ĐŧĐ°ŅĐ¸Đ˛Ņƒ, аĐģĐĩ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊŅ– Đ´ĐģŅ Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊŅƒĐ˛Đ°ĐŊĐŊŅ ŅĐ¸ŅŅ‚ĐĩĐŧи, ĐŊаĐŋŅ€Đ¸ĐēĐģад, СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°ĐģҌĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒ ŅƒĐ˛Đ°ĐŗŅƒ, Ņ‰Đž ĐŊа Ņ‚Đ°ĐēŅ– Đ´Đ¸ŅĐēи ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŒ ĐēĐžĐŧаĐŊди `up` Ņ‚Đ° `down`, ĐžŅĐēŅ–ĐģҌĐēи ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‰Đž вОĐŊи СавĐļди ОйĐĩŅ€Ņ‚Đ°ŅŽŅ‚ŅŒŅŅ. 7.7 nohidden ------------ ВиĐēĐģŅŽŅ‡Đ°Ņ” Đ˛ŅŅ– ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸. В Unix ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– Ņ„Đ°ĐšĐģи — ҆Đĩ ҂Җ, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŒŅŅ С `.`. ĐŖ Windows ҆Đĩ ҂Җ, Ņ‰Đž ĐŧĐ°ŅŽŅ‚ŅŒ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊиК Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚. 7.8 exclude/include PATTERN --------------------------- ВизĐŊĐ°Ņ‡Đ°Ņ” ŅˆĐ°ĐąĐģĐžĐŊи Ņ„Đ°ĐšĐģŅ–Đ˛ айО ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ Đ´ĐģŅ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ айО вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ ҃ ĐŋŅ€ĐžŅ†Đĩҁ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐŖŅŅ– ŅˆĐ°ĐąĐģĐžĐŊи ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ҃ вĐēаСаĐŊĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃. Đ¯ĐēŅ‰Đž ĐŋĐĩŅ€ŅˆĐ¸Đš ŅˆĐ°ĐąĐģĐžĐŊ, ŅĐēиК ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ” `exclude` (виĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸), Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž Đ˛Ņ–ĐŊ Ņ” `include` (вĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸), Ņ„Đ°ĐšĐģ вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ. Đ¯ĐēŅ‰Đž ĐļОдĐĩĐŊ ŅˆĐ°ĐąĐģĐžĐŊ ĐŊĐĩ ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš вĐēаСаĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ Ņ” `include`, айО вĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ, ŅĐēŅ‰Đž ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš вĐēаСаĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ Ņ” `exclude`. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ Ņ€ĐžĐˇĐ´Ņ–Đģ PATTERN Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž ҁĐŋĐĩŅ†Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛. ĐĻŅŽ ĐžĐŋŅ†Ņ–ŅŽ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēа Ņ€Đ°ĐˇŅ–Đ˛. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- ВизĐŊĐ°Ņ‡Đ°Ņ” ĐžŅĐŊОвĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ в ĐēŅ–ĐąŅ–ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ОдиĐŊ ĐēŅ–ĐąŅ–ĐąĐ°ĐšŅ‚ Đ´ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” 1024 ĐąĐ°ĐšŅ‚Đ°Đŧ. РОСĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ 256, Ņ‰Đž ĐŧĐ°Ņ” ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛. ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. ЊОй СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅŒĐžĐŧ҃, ваĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, ŅĐēŅ‰Đž ҃ Đ˛Đ°Ņ Ņ” ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŊĐĩвĐĩĐģиĐēĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŋĐžŅ€ŅĐ´Đē҃ ĐŧŅ–ĐģŅŒĐšĐžĐŊŅ–Đ˛. ДĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ŅĐēŅ‰Đž ҆Đĩ ĐģĐ¸ŅˆĐĩ ĐēŅ–ĐģҌĐēа ĐąĐ°ĐšŅ‚Ņ–Đ˛, Đ˛Đ¸Đ´Ņ–ĐģŅŅ”Ņ‚ŅŒŅŅ ҆ҖĐģиК ĐąĐģĐžĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ– С ĐąĐ°ĐŗĐ°Ņ‚ŅŒĐŧа Ņ„Đ°ĐšĐģаĐŧи ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž СĐŊĐ°Ņ‡ĐŊĐžĐŗĐž ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. КоĐģи ви ĐŋОвĐŊŅ–ŅŅ‚ŅŽ СаĐŋОвĐŊŅŽŅ”Ņ‚Đĩ Đ´Đ¸ŅĐē ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, ваĐŧ ĐŊĐĩ дОСвОĐģŅŅ”Ņ‚ŅŒŅŅ Đ´ĐžĐ´Đ°Đ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐģҌ҈Đĩ Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ…. ОдĐŊаĐē, Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊа ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ĐŊĐĩ ĐŊаĐēĐžĐŋĐ¸Ņ‡ŅƒŅ”Ņ‚ŅŒŅŅ ĐŧŅ–Đļ Đ´Đ¸ŅĐēаĐŧи даĐŊĐ¸Ņ…. Đ’Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐĩ ĐŧҖҁ҆Đĩ вĐŊĐ°ŅĐģŅ–Đ´ĐžĐē вĐĩĐģиĐēĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ОйĐŧĐĩĐļŅƒŅ” ĐģĐ¸ŅˆĐĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ даĐŊĐ¸Ņ… ĐŊа Ņ†ŅŒĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ…, а ĐŊĐĩ ĐŊа Ņ–ĐŊŅˆĐ¸Ņ…. Đ¯Đē ĐŊайĐģиĐļĐĩĐŊĐŊŅ, ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸ĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸, Ņ‰Đž ĐŋĐžĐģОвиĐŊа Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡Đ°Ņ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃. НаĐŋŅ€Đ¸ĐēĐģад, ĐˇŅ– 100 000 Ņ„Đ°ĐšĐģаĐŧи Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ ĐąĐģĐžĐē҃ 256 ĐšŅ–Đ‘ ви Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ 12,8 ГБ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ‰Đž ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž Ņ‚ĐžĐŗĐž, Ņ‰Đž ĐŊа Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąŅƒĐ´Đĩ ĐŊа 12,8 ГБ ĐŧĐĩĐŊ҈Đĩ ĐŧŅ–ŅŅ†Ņ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ `status`. ĐĻĐĩ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŧŅ–ŅŅ†Ņ, ŅĐē҃ ви ĐŋОвиĐŊĐŊŅ– СаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ Đ˛Ņ–ĐģҌĐŊĐžŅŽ ĐŊа Đ´Đ¸ŅĐēĐ°Ņ… даĐŊĐ¸Ņ… айО виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Ņ„Đ°ĐšĐģŅ–Đ˛, ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛. Đ¯ĐēŅ‰Đž ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ˛Ņ–Đ´'Ņ”ĐŧĐŊĐĩ, ҆Đĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž ви ĐŊайĐģиĐļĐ°Ņ”Ņ‚ĐĩŅŅ Đ´Đž СаĐŋОвĐŊĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–, Ņ– вОĐŊĐž ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģŅŅ” ĐŧҖҁ҆Đĩ, ŅĐēĐĩ ви ҉Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đ¸. ЊОй ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ҆ҖҔҗ ĐŋŅ€ĐžĐąĐģĐĩĐŧи, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Ņ€ĐžĐˇĐ´Ņ–Đģ Đ´ĐģŅ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž Ņ€ĐžĐˇĐ´Ņ–Đģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– ĐŊа 12,8 ГБ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Са Đ´Đ¸ŅĐēи даĐŊĐ¸Ņ…, ҃ Đ˛Đ°Ņ Ņ” Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐž Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ Đ´ĐģŅ ĐžĐąŅ€ĐžĐąĐēи Đ´Đž 100 000 Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąĐĩС ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. ĐĨĐ¸Ņ‚Ņ€Ņ–ŅŅ‚ŅŒ, Ņ‰ĐžĐą ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐąŅ–ĐģŅŒŅˆĐ¸Đš Ņ€ĐžĐˇĐ´Ņ–Đģ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– в Linux, ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰ĐžĐą Đ˛Ņ–Đ´Ņ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ĐēĐžĐŧаĐŊĐ´ĐžŅŽ: mkfs.ext4 -m 0 -T largefile4 DEVICE ĐĻĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ Đ´Đž ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 1,5% Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ, ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 60 ГБ Đ´ĐģŅ Đ´Đ¸ŅĐēа 4 ĐĸБ, Ņ‰Đž дОСвОĐģŅŅ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž 460 000 Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐēĐžĐļĐŊĐžĐŧ҃ Đ´Đ¸ŅĐē҃ даĐŊĐ¸Ņ… ĐąĐĩС ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž Đ˛Đ¸Ņ‚Ņ€Đ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ. 7.10 hashsize SIZE_IN_BYTES --------------------------- ВизĐŊĐ°Ņ‡Đ°Ņ” Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ в ĐąĐ°ĐšŅ‚Đ°Ņ… Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… ĐąĐģĐžĐēŅ–Đ˛. РОСĐŧŅ–Ņ€ Ņ…Đĩ҈҃ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ 16 ĐąĐ°ĐšŅ‚Ņ–Đ˛ (128 ĐąŅ–Ņ‚), Ņ‰Đž ĐŧĐ°Ņ” ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ ĐąŅ–ĐģŅŒŅˆĐžŅŅ‚Ņ– виĐŋадĐēŅ–Đ˛. ĐŖĐ’ĐĐ“Đ! ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ ĐĩĐēҁĐŋĐĩŅ€Ņ‚Ņ–Đ˛, Ņ– ĐŊĐ°ŅŅ‚Ņ–ĐšĐŊĐž ĐŊĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ. ЊОй СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅŒĐžĐŧ҃, ваĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐĩŅ€ĐĩŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅŽ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ! ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, ŅĐēŅ‰Đž Đ˛Đ°ŅˆĐ° ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŧĐ°Ņ” ОйĐŧĐĩĐļĐĩĐŊ҃ ĐŋаĐŧ'ŅŅ‚ŅŒ. Đ¯Đē ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž, SnapRAID ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš виĐŧĐ°ĐŗĐ°Ņ” 1 Đ“Ņ–Đ‘ ОЗП ĐŊа ĐēĐžĐļĐŊŅ– 16 ĐĸБ даĐŊĐ¸Ņ… ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–. ЗоĐēŅ€ĐĩĐŧа, Đ´ĐģŅ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ Ņ…ĐĩŅˆŅ–Đ˛ даĐŊĐ¸Ņ… SnapRAID виĐŧĐ°ĐŗĐ°Ņ” ĐŋŅ€Đ¸ĐąĐģиСĐŊĐž $TS \times (1+HS) / BS$ ĐąĐ°ĐšŅ‚Ņ–Đ˛ ОЗП, Đ´Đĩ TS — ĐˇĐ°ĐŗĐ°ĐģҌĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ Đ˛Đ°ŅˆĐžĐŗĐž Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…, BS — Ņ€ĐžĐˇĐŧŅ–Ņ€ ĐąĐģĐžĐē҃ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…, а HS — Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ…Đĩ҈҃ ҃ ĐąĐ°ĐšŅ‚Đ°Ņ…. НаĐŋŅ€Đ¸ĐēĐģад, С 8 Đ´Đ¸ŅĐēаĐŧи ĐŋĐž 4 ĐĸБ, Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ ĐąĐģĐžĐē҃ 256 ĐšŅ–Đ‘ (1 ĐšŅ–Đ‘ = 1024 ĐąĐ°ĐšŅ‚Đ°) Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ Ņ…Đĩ҈҃ 16, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: RAM = $(8 \times 4 \times 10^{12}) \times (1+16) / (256 \times 2^{10}) = 1.93$ Đ“Ņ–Đ‘ ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đĩ҈҃ 8, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: RAM = $(8 \times 4 \times 10^{12}) \times (1+8) / (256 \times 2^{10}) = 1.02$ Đ“Ņ–Đ‘ ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ 512, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: RAM = $(8 \times 4 \times 10^{12}) \times (1+16) / (512 \times 2^{10}) = 0.96$ Đ“Ņ–Đ‘ ПĐĩŅ€ĐĩŅ…Ņ–Đ´ Đ´Đž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ…Đĩ҈҃ 8 Ņ‚Đ° Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ ĐąĐģĐžĐē҃ 512, ви ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚Đĩ: RAM = $(8 \times 4 \times 10^{12}) \times (1+8) / (512 \times 2^{10}) = 0.51$ Đ“Ņ–Đ‘ 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ŅŅ‚Đ°ĐŊ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— айО ҁĐēŅ€Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋҖҁĐģŅ ĐžĐąŅ€ĐžĐąĐēи вĐēаСаĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– ГБ. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐēĐžŅ€Đ¸ŅĐŊа, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ Đ´ĐžĐ˛ĐŗĐ¸Ņ… ĐēĐžĐŧаĐŊĐ´ `sync` С ĐŊ҃ĐģŅ, ŅĐēŅ‰Đž вОĐŊи ĐąŅƒĐģи ĐŋĐĩŅ€ĐĩŅ€Đ˛Đ°ĐŊŅ– ĐˇĐąĐžŅ”Đŧ ĐŧĐ°ŅˆĐ¸ĐŊи айО ĐąŅƒĐ´ŅŒ-ŅĐēĐžŅŽ Ņ–ĐŊŅˆĐžŅŽ ĐŋĐžĐ´Ņ–Ņ”ŅŽ. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊ҃ дОСвОĐģĐĩĐŊ҃ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа в ĐĻĐĩĐģŅŒŅŅ–ŅŅ…. Đ¯ĐēŅ‰Đž вĐēаСаĐŊĐž, SnapRAID ĐŋĐĩŅ€Ņ–ĐžĐ´Đ¸Ņ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Ņƒ smartctl. ĐŸĐžŅ‚ĐžŅ‡ĐŊŅ– Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸ Đ´Đ¸ŅĐēŅ–Đ˛ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°ŅŽŅ‚ŅŒŅŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐąĐžŅ‚Đ¸ SnapRAID. Đ¯ĐēŅ‰Đž ĐąŅƒĐ´ŅŒ-ŅĐēиК Đ´Đ¸ŅĐē ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” ҆ĐĩĐš ĐģŅ–ĐŧŅ–Ņ‚, ŅƒŅŅ– ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ, Ņ– Đ´Đ¸ŅĐēи ĐˇŅƒĐŋиĐŊŅŅŽŅ‚ŅŒŅŅ (ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ŅŅ‚ŅŒ ҃ Ņ€ĐĩĐļиĐŧ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ) ĐŊа Ņ‡Đ°Ņ, виСĐŊĐ°Ņ‡ĐĩĐŊиК ĐžĐŋŅ†Ņ–Ņ”ŅŽ `temp_sleep`. ĐŸŅ–ŅĐģŅ ĐŋĐĩŅ€Ņ–ĐžĐ´Ņƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— Đ˛Ņ–Đ´ĐŊОвĐģŅŽŅŽŅ‚ŅŒŅŅ, ĐŋĐžŅ‚ĐĩĐŊŅ†Ņ–ĐšĐŊĐž СĐŊĐžĐ˛Ņƒ ĐŋŅ€Đ¸ĐˇŅƒĐŋиĐŊŅŅŽŅ‡Đ¸ŅŅŒ, ŅĐēŅ‰Đž ĐģŅ–ĐŧŅ–Ņ‚ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸ СĐŊĐžĐ˛Ņƒ Đ´ĐžŅŅĐŗĐŊŅƒŅ‚Đ¸Đš. ĐŸŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐąĐžŅ‚Đ¸ SnapRAID Ņ‚Đ°ĐēĐžĐļ аĐŊаĐģŅ–ĐˇŅƒŅ” ĐēŅ€Đ¸Đ˛Ņƒ ĐŊĐ°ĐŗŅ€Ņ–Đ˛Đ°ĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа Ņ‚Đ° ĐžŅ†Ņ–ĐŊŅŽŅ” Đ´ĐžĐ˛ĐŗĐžŅŅ‚Ņ€ĐžĐēĐžĐ˛Ņƒ ŅŅ‚Đ°ĐąŅ–ĐģҌĐŊ҃ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ, ŅĐēĐžŅ— вОĐŊи, ŅĐē ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ, Đ´ĐžŅŅĐŗĐŊŅƒŅ‚ŅŒ, ŅĐēŅ‰Đž аĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚ŅŒŅŅ. ĐžŅ†Ņ–ĐŊĐēа виĐēĐžĐŊŅƒŅ”Ņ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ ĐŋҖҁĐģŅ Ņ‚ĐžĐŗĐž, ŅĐē Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ´Đ¸ŅĐēа ĐŋŅ–Đ´Đ˛Đ¸Ņ‰Đ¸ĐģĐ°ŅŅ Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Đ°ĐˇĐ¸, Ņ‰Đž ĐŗĐ°Ņ€Đ°ĐŊŅ‚ŅƒŅ” ĐŊĐ°ŅĐ˛ĐŊŅ–ŅŅ‚ŅŒ Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅŒĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– даĐŊĐ¸Ņ… Đ´ĐģŅ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ ĐŊĐ°Đ´Ņ–ĐšĐŊĐžĐŗĐž ҂ҀĐĩĐŊĐ´Ņƒ. ĐĻŅ ĐŋŅ€ĐžĐŗĐŊОСОваĐŊа ŅŅ‚Đ°ĐąŅ–ĐģҌĐŊа Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ”Ņ‚ŅŒŅŅ в Đ´ŅƒĐļĐēĐ°Ņ… ĐŋĐžŅ€ŅƒŅ‡ Ņ–Đˇ ĐŋĐžŅ‚ĐžŅ‡ĐŊиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ Ņ– Đ´ĐžĐŋĐžĐŧĐ°ĐŗĐ°Ņ” ĐžŅ†Ņ–ĐŊĐ¸Ņ‚Đ¸, Ņ‡Đ¸ Đ´ĐžŅŅ‚Đ°Ņ‚ĐŊŅ” ĐžŅ…ĐžĐģОдĐļĐĩĐŊĐŊŅ ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐĻŅ ĐžŅ†Ņ–ĐŊŅŽĐ˛Đ°ĐŊа Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ° Ņ” ĐģĐ¸ŅˆĐĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ĐšĐŊĐžŅŽ Ņ– ĐŊĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ SnapRAID. Đ”Ņ–Ņ— ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи ĐąĐ°ĐˇŅƒŅŽŅ‚ŅŒŅŅ виĐēĐģŅŽŅ‡ĐŊĐž ĐŊа Ņ„Đ°ĐēŅ‚Đ¸Ņ‡ĐŊĐž виĐŧŅ–Ņ€ŅĐŊĐ¸Ņ… Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ°Ņ… Đ´Đ¸ŅĐēŅ–Đ˛. ДĐģŅ виĐēĐžĐŊаĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž аĐŊаĐģŅ–ĐˇŅƒ SnapRAID ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа Đ´ĐžĐ˛Ņ–Đ´ĐēОва Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐĄĐŋĐžŅ‡Đ°Ņ‚Đē҃ Đ˛Ņ–ĐŊ ĐŊаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ ĐˇŅ‡Đ¸Ņ‚Đ°Ņ‚Đ¸ Ņ—Ņ— С Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… аĐŋĐ°Ņ€Đ°Ņ‚ĐŊĐ¸Ņ… Đ´Đ°Ņ‚Ņ‡Đ¸ĐēŅ–Đ˛. Đ¯ĐēŅ‰Đž Đ´Đž ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐžĐŗĐž Đ´Đ°Ņ‚Ņ‡Đ¸Đēа ĐŊĐĩĐŧĐžĐļĐģивО ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ, Đ˛Ņ–ĐŊ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” ĐŊаКĐŊиĐļŅ‡Ņƒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ´Đ¸ŅĐēа, виĐŧŅ–Ņ€ŅĐŊ҃ ĐŊа ĐŋĐžŅ‡Đ°Ņ‚Đē҃ СаĐŋ҃ҁĐē҃, ŅĐē Ņ€ĐĩСĐĩŅ€Đ˛ĐŊ҃ Đ´ĐžĐ˛Ņ–Đ´ĐēĐžĐ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ. Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš SnapRAID ĐŋĐžĐēĐ°ĐˇŅƒŅ” ĐģĐ¸ŅˆĐĩ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ ĐŊĐ°ĐšĐŗĐ°Ņ€ŅŅ‡Ņ–ŅˆĐžĐŗĐž Đ´Đ¸ŅĐēа. ЊОй Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐˇĐ¸Ņ‚Đ¸ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņƒ Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēŅ–Đ˛, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ -A айО --stats. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Đ’ŅŅ‚Đ°ĐŊОвĐģŅŽŅ” Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ, ҃ Ņ…Đ˛Đ¸ĐģиĐŊĐ°Ņ…, ĐēĐžĐģи Đ´ĐžŅŅĐŗĐŊŅƒŅ‚Đž ĐģŅ–ĐŧŅ–Ņ‚Ņƒ Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ¸. ĐŸŅ€ĐžŅ‚ŅĐŗĐžĐŧ Ņ†ŅŒĐžĐŗĐž ĐŋĐĩŅ€Ņ–ĐžĐ´Ņƒ Đ´Đ¸ŅĐēи СаĐģĐ¸ŅˆĐ°ŅŽŅ‚ŅŒŅŅ ĐˇŅƒĐŋиĐŊĐĩĐŊиĐŧи. За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ 5 Ņ…Đ˛Đ¸ĐģиĐŊ. 7.14 pool DIR ------------- ВизĐŊĐ°Ņ‡Đ°Ņ” ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ, Đ´Đĩ ŅŅ‚Đ˛ĐžŅ€ŅŽŅ”Ņ‚ŅŒŅŅ Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ´Đ¸ŅĐēĐžĐ˛ĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди `pool`. ĐšĐ°Ņ‚Đ°ĐģĐžĐŗ ĐŋОвиĐŊĐĩĐŊ вĐļĐĩ ҖҁĐŊŅƒĐ˛Đ°Ņ‚Đ¸. 7.15 share UNC_DIR ------------------ ВизĐŊĐ°Ņ‡Đ°Ņ” ҈ĐģŅŅ… Windows UNC, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊиК Đ´ĐģŅ Đ˛Ņ–Đ´Đ´Đ°ĐģĐĩĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ´Đ¸ŅĐēŅ–Đ˛. Đ¯ĐēŅ‰Đž Ņ†Ņ ĐžĐŋŅ†Ņ–Ņ вĐēаСаĐŊа, ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ, ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊŅ– в ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– pool, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ҆ĐĩĐš ҈ĐģŅŅ… UNC Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ´Đ¸ŅĐēŅ–Đ˛. БĐĩС ҆ҖҔҗ ĐžĐŋ҆Җҗ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊŅ– ŅĐ¸ĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐģĐžĐēаĐģҌĐŊŅ– ҈ĐģŅŅ…Đ¸, Ņ‰Đž ĐŊĐĩ дОСвОĐģŅŅ” ҁĐŋŅ–ĐģҌĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ pool ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃. ХиĐŧвОĐģҖ҇ĐŊŅ– ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ Ņ„ĐžŅ€ĐŧŅƒŅŽŅ‚ŅŒŅŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ вĐēаСаĐŊĐžĐŗĐž ҈ĐģŅŅ…Ņƒ UNC, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, ŅĐē СаСĐŊĐ°Ņ‡ĐĩĐŊĐž в ĐžĐŋ҆Җҗ `data`, Ņ–, ĐŊĐ°Ņ€ĐĩŅˆŅ‚Ņ–, Đ´ĐžĐ´Đ°ŅŽŅ‡Đ¸ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ‚Đ° Ņ–Đŧ'Ņ Ņ„Đ°ĐšĐģ҃. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ĐģĐ¸ŅˆĐĩ Đ´ĐģŅ Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ ВизĐŊĐ°Ņ‡Đ°Ņ” ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēŅ– ĐžĐŋ҆Җҗ smartctl Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Ņ–Đ˛ SMART Đ´ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž Đ´Đ¸ŅĐēа. ĐĻĐĩ ĐŧĐžĐļĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ Đ´ĐģŅ RAID-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Ņ–Đ˛ Ņ‚Đ° Đ´ĐĩŅĐēĐ¸Ņ… USB-Đ´Đ¸ŅĐēŅ–Đ˛, ŅĐēŅ– ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ–. ЗаĐŋОвĐŊŅŽĐ˛Đ°Ņ‡ %s СаĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Ņ–ĐŧĐĩĐŊĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ, аĐģĐĩ Đ˛Ņ–ĐŊ ĐŊĐĩОйОв'ŅĐˇĐēОвиК Đ´ĐģŅ ҄ҖĐēŅĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē RAID-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Đ¸. DISK — ҆Đĩ Ņ‚Đĩ ŅĐ°ĐŧĐĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, вĐēаСаĐŊĐĩ в ĐžĐŋ҆Җҗ `data`. PARITY — ҆Đĩ ОдĐŊĐĩ С Ņ–ĐŧĐĩĐŊ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` айО `z-parity`. ĐŖ вĐēаСаĐŊĐ¸Ņ… OPTIONS Ņ€ŅĐ´ĐžĐē `%s` СаĐŧŅ–ĐŊŅŽŅ”Ņ‚ŅŒŅŅ Ņ–ĐŧĐĩĐŊĐĩĐŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ. ДĐģŅ RAID-ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐĩŅ€Ņ–Đ˛ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐž ҄ҖĐēŅĐžĐ˛Đ°ĐŊиК, Ņ– ваĐŧ ĐŧĐžĐļĐĩ ĐŊĐĩ СĐŊĐ°Đ´ĐžĐąĐ¸Ņ‚Đ¸ŅŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ `%s`. ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ Đ´Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ— smartmontools Đ´ĐģŅ ĐŧĐžĐļĐģĐ¸Đ˛Đ¸Ņ… ĐžĐŋŅ†Ņ–Đš: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices НаĐŋŅ€Đ¸ĐēĐģад: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Đ†ĐŗĐŊĐžŅ€ŅƒŅ” вĐēаСаĐŊиК Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ SMART ĐŋŅ€Đ¸ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ– ĐšĐŧĐžĐ˛Ņ–Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ĐŧОви Đ´Đ¸ŅĐēа. ĐĻŅ ĐžĐŋŅ†Ņ–Ņ ĐēĐžŅ€Đ¸ŅĐŊа, ŅĐēŅ‰Đž Đ´Đ¸ŅĐē ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ” ĐŊĐĩĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊŅ– айО ĐžĐŧаĐŊĐģĐ¸Đ˛Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŋĐĩвĐŊĐžĐŗĐž Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ°. DISK — ҆Đĩ Ņ‚Đĩ ŅĐ°ĐŧĐĩ Ņ–Đŧ'Ņ Đ´Đ¸ŅĐēа, вĐēаСаĐŊĐĩ в ĐžĐŋ҆Җҗ `data`. PARITY — ҆Đĩ ОдĐŊĐĩ С Ņ–ĐŧĐĩĐŊ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity` айО `z-parity`. ĐĄĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ * ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐģŅ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ° ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ…. НаĐŋŅ€Đ¸ĐēĐģад, Ņ‰ĐžĐą Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚ `Current Pending Sector Count` ĐŊа Đ˛ŅŅ–Ņ… Đ´Đ¸ŅĐēĐ°Ņ…: smartignore * 197 ЊОй Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ĐģĐ¸ŅˆĐĩ ĐŊа ĐŋĐĩŅ€ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐē҃ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–: smartignore parity 197 7.18 ĐŸŅ€Đ¸ĐēĐģади ------------- ĐŸŅ€Đ¸ĐēĐģад Ņ‚Đ¸ĐŋĐžĐ˛ĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ Unix: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 ĐŸŅ€Đ¸ĐēĐģад Ņ‚Đ¸ĐŋĐžĐ˛ĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— Đ´ĐģŅ Windows: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 ШайĐģĐžĐŊ (PATTERN) ================== ШайĐģĐžĐŊи СайĐĩСĐŋĐĩŅ‡ŅƒŅŽŅ‚ŅŒ ĐŗĐŊŅƒŅ‡ĐēиК ҁĐŋĐžŅŅ–Đą ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģŅ–Đ˛ Đ´ĐģŅ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ айО виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ŅĐ¸ĐŧвОĐģи ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊОвĐēи (globbing), ви ĐŧĐžĐļĐĩŅ‚Đĩ виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸Đģа, ŅĐēŅ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊиĐŧ Ņ–ĐŧĐĩĐŊаĐŧ Ņ„Đ°ĐšĐģŅ–Đ˛ айО ҆ҖĐģиĐŧ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ°Đŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ ĐąĐĩС Ņ€ŅƒŅ‡ĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐļĐŊĐžĐŗĐž ҈ĐģŅŅ…Ņƒ. ЗĐŊаĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ `?` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃, ĐēҀҖĐŧ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēа ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ĐĻĐĩ Ņ€ĐžĐąĐ¸Ņ‚ŅŒ ĐšĐžĐŗĐž ĐēĐžŅ€Đ¸ŅĐŊиĐŧ Đ´ĐģŅ ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ–ĐŧĐĩĐŊ Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ–Đˇ СĐŧŅ–ĐŊĐŊиĐŧи ŅĐ¸ĐŧвОĐģаĐŧи, ĐŋŅ€Đ¸ Ņ†ŅŒĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊ ОйĐŧĐĩĐļŅƒŅ”Ņ‚ŅŒŅŅ ОдĐŊиĐŧ Ņ€Ņ–Đ˛ĐŊĐĩĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ. ОдиĐŊĐ°Ņ€ĐŊа ĐˇŅ–Ņ€ĐžŅ‡Đēа `*` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊĐžŅŅ‚Ņ– ŅĐ¸ĐŧвОĐģŅ–Đ˛, аĐģĐĩ, ŅĐē Ņ– СĐŊаĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ, вОĐŊа ĐŊŅ–ĐēĐžĐģи ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ‚Đ¸ĐŊĐ°Ņ” ĐŧĐĩĐļŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ВоĐŊа ĐˇŅƒĐŋиĐŊŅŅ”Ņ‚ŅŒŅŅ ĐŊа ĐŋŅ€ŅĐŧŅ–Đš ĐēĐžŅŅ–Đš Ņ€Đ¸ŅŅ†Ņ–, Ņ‰Đž Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ—Ņ— ĐŋŅ€Đ¸Đ´Đ°Ņ‚ĐŊĐžŅŽ Đ´ĐģŅ ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐŊŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ҈ĐģŅŅ…Ņƒ. ĐĻĐĩ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊа ĐŋОвĐĩĐ´Ņ–ĐŊĐēа ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊĐžĐ˛ĐžŅ‡ĐŊĐ¸Ņ… СĐŊаĐēŅ–Đ˛, СĐŊаКОĐŧа С ĐēĐžĐŧаĐŊĐ´ĐŊĐžŅ— ОйОĐģĐžĐŊĐēи (shell globbing). ĐŸĐžĐ´Đ˛Ņ–ĐšĐŊа ĐˇŅ–Ņ€ĐžŅ‡Đēа `**` Ņ” ĐŋĐžŅ‚ŅƒĐļĐŊŅ–ŅˆĐžŅŽ, вОĐŊа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊĐžŅŅ‚Ņ– ŅĐ¸ĐŧвОĐģŅ–Đ˛, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. ĐĻĐĩ дОСвОĐģŅŅ” ŅˆĐ°ĐąĐģĐžĐŊаĐŧ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēĐžĐŧ Ņ€Ņ–Đ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. КоĐģи `**` С'ŅĐ˛ĐģŅŅ”Ņ‚ŅŒŅŅ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž в ŅˆĐ°ĐąĐģĐžĐŊŅ–, вОĐŊа ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐŊ҃ĐģŅŽ айО ĐąŅ–ĐģҌ҈Đĩ ŅĐ¸ĐŧвОĐģаĐŧ, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ ĐēĐžŅŅ– Ņ€Đ¸ŅĐēи ĐŧŅ–Đļ ĐžŅ‚ĐžŅ‡ŅƒŅŽŅ‡Đ¸Đŧ ĐģŅ–Ņ‚ĐĩŅ€Đ°ĐģҌĐŊиĐŧ Ņ‚ĐĩĐēŅŅ‚ĐžĐŧ. НайваĐļĐģĐ¸Đ˛Ņ–ŅˆĐ¸Đŧ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ `**` Ņ” ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊа Ņ„ĐžŅ€Đŧа `/**/`. ВоĐŊа Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ĐŊ҃ĐģŅŽ айО ĐąŅ–ĐģҌ҈Đĩ ĐŋОвĐŊиĐŧ Ņ€Ņ–Đ˛ĐŊŅĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, Ņ‰Đž дОСвОĐģŅŅ” ĐˇŅ–ŅŅ‚Đ°Đ˛ĐģŅŅ‚Đ¸ Ņ„Đ°ĐšĐģи ĐŊа ĐąŅƒĐ´ŅŒ-ŅĐēŅ–Đš ĐŗĐģийиĐŊŅ– в Đ´ĐĩŅ€ĐĩĐ˛Ņ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ĐŊĐĩ СĐŊĐ°ŅŽŅ‡Đ¸ Ņ‚ĐžŅ‡ĐŊĐžŅ— ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ¸ ҈ĐģŅŅ…Ņƒ. НаĐŋŅ€Đ¸ĐēĐģад, ŅˆĐ°ĐąĐģĐžĐŊ `src/**/main.js` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” `src/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ĐŊ҃ĐģŅ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛), `src/ui/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē ОдĐŊĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ) Ņ‚Đ° `src/ui/components/main.js` (ĐŋŅ€ĐžĐŋ҃ҁĐē Đ´Đ˛ĐžŅ… ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛). КĐģĐ°ŅĐ¸ ŅĐ¸ĐŧвОĐģŅ–Đ˛ Ņ–Đˇ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊĐ¸Ņ… Đ´ŅƒĐļĐžĐē `[]` Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ОдĐŊĐžĐŧ҃ ŅĐ¸ĐŧвОĐģ҃ С виСĐŊĐ°Ņ‡ĐĩĐŊĐžĐŗĐž ĐŊĐ°ĐąĐžŅ€Ņƒ айО Đ´Ņ–Đ°ĐŋаСОĐŊ҃. Đ¯Đē Ņ– Ņ–ĐŊŅˆŅ– ОдĐŊĐžŅĐ¸ĐŧвОĐģҌĐŊŅ– ŅˆĐ°ĐąĐģĐžĐŊи, вОĐŊи ĐŊĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēаĐŧ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. КĐģĐ°ŅĐ¸ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ Đ´Ņ–Đ°ĐŋаСОĐŊи Ņ‚Đ° СаĐŋĐĩŅ€Đĩ҇ĐĩĐŊĐŊŅ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ СĐŊаĐē҃ ĐžĐēĐģиĐē҃. Đ¤ŅƒĐŊдаĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊа Đ˛Ņ–Đ´ĐŧŅ–ĐŊĐŊŅ–ŅŅ‚ŅŒ, ŅĐē҃ ҁĐģŅ–Đ´ ĐŋаĐŧ'ŅŅ‚Đ°Ņ‚Đ¸, ĐŋĐžĐģŅĐŗĐ°Ņ” в Ņ‚ĐžĐŧ҃, Ņ‰Đž `*`, `?` Ņ‚Đ° ĐēĐģĐ°ŅĐ¸ ŅĐ¸ĐŧвОĐģŅ–Đ˛ ŅƒŅŅ– Đ´ĐžŅ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ ĐŧĐĩĐļ ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛ Ņ– Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°ŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ в ĐŧĐĩĐļĐ°Ņ… ОдĐŊĐžĐŗĐž ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ° ҈ĐģŅŅ…Ņƒ, Ņ‚ĐžĐ´Ņ– ŅĐē `**` — Ņ”Đ´Đ¸ĐŊиК ŅˆĐ°ĐąĐģĐžĐŊ, ŅĐēиК ĐŧĐžĐļĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ‚Đ¸ ҇ĐĩŅ€ĐĩС Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēи ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛. Đ†ŅĐŊŅƒŅ” Ņ‡ĐžŅ‚Đ¸Ņ€Đ¸ Ņ€Ņ–ĐˇĐŊŅ– Ņ‚Đ¸Đŋи ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛: FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–Đŧ'ŅĐŧ FILE. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐŊĐĩ Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš. DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐē҃ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–ŅŽ С Ņ–Đŧ'ŅĐŧ DIR Ņ– Đ˛ŅĐĩ, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ–. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš, а ĐŊĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛. /PATH/FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ҈ĐģŅŅ… Đ´Đž Ņ„Đ°ĐšĐģ҃. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛, а ĐŊĐĩ Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš. /PATH/DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ҈ĐģŅŅ… Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Ņ— Ņ– Đ˛ŅĐĩ, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ–. ĐĻĐĩĐš ŅˆĐ°ĐąĐģĐžĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ҂ҖĐģҌĐēи Đ´Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Đš, а ĐŊĐĩ Đ´Đž Ņ„Đ°ĐšĐģŅ–Đ˛. КоĐģи ви вĐēĐ°ĐˇŅƒŅ”Ņ‚Đĩ Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊиК ҈ĐģŅŅ…, Ņ‰Đž ĐŋĐžŅ‡Đ¸ĐŊĐ°Ņ”Ņ‚ŅŒŅŅ С /, Đ˛Ņ–ĐŊ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž ĐēĐžŅ€ĐĩĐŊĐĩĐ˛ĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐŧĐ°ŅĐ¸Đ˛Ņƒ, а ĐŊĐĩ Đ´Đž ĐēĐžŅ€ĐĩĐŊĐĩĐ˛ĐžĐŗĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ ĐģĐžĐēаĐģҌĐŊĐžŅ— Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи. ĐŖ Windows ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊ҃ ҁĐēҖҁĐŊ҃ Ņ€Đ¸ŅĐē҃ \ СаĐŧŅ–ŅŅ‚ŅŒ ĐŋŅ€ŅĐŧĐžŅ— ҁĐēҖҁĐŊĐžŅ— Ņ€Đ¸ŅĐēи /. ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows, С'Ņ”Đ´ĐŊаĐŊĐŊŅ, Ņ‚ĐžŅ‡Đēи ĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Ņ–ĐŊŅˆŅ– ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ Windows Ņ€ĐžĐˇĐŗĐģŅĐ´Đ°ŅŽŅ‚ŅŒŅŅ ŅĐē Ņ„Đ°ĐšĐģи, Ņ‰Đž ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž Đ´ĐģŅ Ņ—Ņ… виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ ви ĐŋОвиĐŊĐŊŅ– виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž Ņ„Đ°ĐšĐģ҃, а ĐŊĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ. Đ¯ĐēŅ‰Đž Ņ–Đŧ'Ņ Ņ„Đ°ĐšĐģ҃ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ŅĐ¸ĐŧвОĐģи `*`, `?`, `[`, айО `]`, ви ĐŋОвиĐŊĐŊŅ– ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ…, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ Ņ—Ņ… Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Ņ–Ņ— ŅĐē ŅĐ¸ĐŧвОĐģ҃ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ. В Unix ŅĐ¸ĐŧвОĐģĐžĐŧ ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ” `\`; ҃ Windows — `^`. КоĐģи ŅˆĐ°ĐąĐģĐžĐŊ СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ в ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, ви ĐŋОвиĐŊĐŊŅ– ĐŋĐžĐ´Đ˛ĐžŅ—Ņ‚Đ¸ ŅĐ¸ĐŧвОĐģ ĐĩĐēŅ€Đ°ĐŊŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą СаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐšĐžĐŗĐž Ņ–ĐŊŅ‚ĐĩŅ€ĐŋŅ€ĐĩŅ‚Đ°Ņ†Ņ–Ņ— ĐēĐžĐŧаĐŊĐ´ĐŊĐžŅŽ ОйОĐģĐžĐŊĐēĐžŅŽ. ĐŖ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ĐšĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€Ņ–ĐˇĐŊŅ– ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗŅ–Ņ— Đ´ĐģŅ ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ–Ņ— Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸. НайĐŋŅ€ĐžŅŅ‚Ņ–ŅˆĐ¸Đš ĐŋŅ–Đ´Ņ…Ņ–Đ´ — виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ Ņ‚Đ° ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅ–Đ˛, ŅĐēŅ– ви ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐģŅŅ‚Đ¸. НаĐŋŅ€Đ¸ĐēĐģад: # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` exclude *.unrecoverable # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐēĐžŅ€ĐĩĐŊĐĩвиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ `/lost+found` exclude /lost+found/ # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `tmp` exclude tmp/ ĐŸŅ€ĐžŅ‚Đ¸ĐģĐĩĐļĐŊиК ĐŋŅ–Đ´Ņ…Ņ–Đ´ — виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐąŅ€ĐžĐąĐ¸Ņ‚Đ¸, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐēĐģад: # ВĐēĐģŅŽŅ‡Đ°Ņ” ĐģĐ¸ŅˆĐĩ Đ´ĐĩŅĐēŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ include /movies/ include /musics/ include /pictures/ ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš ĐŋŅ–Đ´Ņ…Ņ–Đ´ — СĐŧŅ–ŅˆŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude` Ņ‚Đ° `include`. ĐŖ Ņ†ŅŒĐžĐŧ҃ виĐŋадĐē҃ ĐŋĐžŅ€ŅĐ´ĐžĐē ĐŋŅ€Đ°Đ˛Đ¸Đģ ваĐļĐģивиК. РаĐŊŅ–ŅˆŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа ĐŧĐ°ŅŽŅ‚ŅŒ ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ ĐŊад ĐŋŅ–ĐˇĐŊŅ–ŅˆĐ¸Đŧи. ДĐģŅ ҁĐŋŅ€ĐžŅ‰ĐĩĐŊĐŊŅ ви ĐŧĐžĐļĐĩŅ‚Đĩ ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа `exclude`, а ĐŋĐžŅ‚Ņ–Đŧ ŅƒŅŅ– ĐŋŅ€Đ°Đ˛Đ¸Đģа `include`. НаĐŋŅ€Đ¸ĐēĐģад: # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `*.unrecoverable` exclude *.unrecoverable # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐŋŅ–Đ´ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ С Ņ–ĐŧĐĩĐŊĐĩĐŧ `tmp` exclude tmp/ # ВĐēĐģŅŽŅ‡Đ°Ņ” ĐģĐ¸ŅˆĐĩ Đ´ĐĩŅĐēŅ– ĐēĐ°Ņ‚Đ°ĐģĐžĐŗĐ¸ include /movies/ include /musics/ include /pictures/ ĐŖ ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ĐžĐŋŅ†Ņ–ŅŽ -f, ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ ŅˆĐ°ĐąĐģĐžĐŊи `include`. НаĐŋŅ€Đ¸ĐēĐģад: # ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ” ĐģĐ¸ŅˆĐĩ Ņ„Đ°ĐšĐģи .mp3. # В Unix виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐģаĐŋĐēи, Ņ‰ĐžĐą ҃ĐŊиĐēĐŊŅƒŅ‚Đ¸ # Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ ОйОĐģĐžĐŊĐēĐžŅŽ. snapraid -f "*.mp3" check В Unix, ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– ŅĐ¸ĐŧвОĐģŅ–Đ˛ ĐŗĐģĐžĐąĐąŅ–ĐŊĐŗŅƒ в ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŧ҃ Ņ€ŅĐ´Đē҃, ви ĐŋОвиĐŊĐŊŅ– Đ˛ĐˇŅŅ‚Đ¸ Ņ—Ņ… ҃ ĐģаĐŋĐēи, Ņ‰ĐžĐą СаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ Ņ—Ņ… Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅŽ ОйОĐģĐžĐŊĐēĐžŅŽ. 9 Đ†ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ (IGNORE FILE) ================================== На Đ´ĐžĐ´Đ°Ņ‚ĐžĐē Đ´Đž ĐŗĐģОйаĐģҌĐŊĐ¸Ņ… ĐŋŅ€Đ°Đ˛Đ¸Đģ ҃ Ņ„Đ°ĐšĐģŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—, ви ĐŧĐžĐļĐĩŅ‚Đĩ Ņ€ĐžĐˇĐŧŅ–Ņ‰ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģи `.snapraidignore` в ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– ĐŧĐ°ŅĐ¸Đ˛Ņƒ Đ´ĐģŅ виСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Đ´Đĩ҆ĐĩĐŊŅ‚Ņ€Đ°ĐģŅ–ĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋŅ€Đ°Đ˛Đ¸Đģ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. ĐŸŅ€Đ°Đ˛Đ¸Đģа, виСĐŊĐ°Ņ‡ĐĩĐŊŅ– в `.snapraidignore`, ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅŽŅ‚ŅŒŅŅ ĐŋҖҁĐģŅ ĐŋŅ€Đ°Đ˛Đ¸Đģ ҃ Ņ„Đ°ĐšĐģŅ– ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—. ĐĻĐĩ ОСĐŊĐ°Ņ‡Đ°Ņ”, Ņ‰Đž вОĐŊи ĐŧĐ°ŅŽŅ‚ŅŒ Đ˛Đ¸Ņ‰Đ¸Đš ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ Ņ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊŅ– Đ´ĐģŅ виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛, ŅĐēŅ– Ņ€Đ°ĐŊŅ–ŅˆĐĩ ĐąŅƒĐģи вĐēĐģŅŽŅ‡ĐĩĐŊŅ– ĐŗĐģОйаĐģҌĐŊĐžŅŽ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ”ŅŽ. ФаĐēŅ‚Đ¸Ņ‡ĐŊĐž, ŅĐēŅ‰Đž ĐģĐžĐēаĐģҌĐŊĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐž ĐˇĐąŅ–ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ, Ņ„Đ°ĐšĐģ виĐēĐģŅŽŅ‡Đ°Ņ”Ņ‚ŅŒŅŅ ĐŊĐĩСаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ ĐŗĐģОйаĐģҌĐŊĐ¸Ņ… ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ вĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ. Đ›ĐžĐŗŅ–Đēа ŅˆĐ°ĐąĐģĐžĐŊŅ–Đ˛ ҃ `.snapraidignore` ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŽŅ” ĐŗĐģОйаĐģҌĐŊ҃ ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–ŅŽ, аĐģĐĩ ĐŋŅ€Đ¸Đ˛'ŅĐˇŅƒŅ” ŅˆĐ°ĐąĐģĐžĐŊи Đ´Đž ĐēĐ°Ņ‚Đ°ĐģĐžĐŗŅƒ, в ŅĐēĐžĐŧ҃ СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģ: FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ Ņ–Đˇ Ņ–Đŧ'ŅĐŧ FILE ҃ Ņ†ŅŒĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– айО ĐŊиĐļ҇Đĩ. ĐĻĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” Ņ‚Đ¸Đŧ ŅĐ°ĐŧиĐŧ ĐŋŅ€Đ°Đ˛Đ¸ĐģаĐŧ ĐŋŅ–Đ´ŅŅ‚Đ°ĐŊОвĐēи, Ņ‰Đž Ņ– в ĐŗĐģОйаĐģҌĐŊĐžĐŧ҃ ŅˆĐ°ĐąĐģĐžĐŊŅ–. DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ–Đˇ Ņ–Đŧ'ŅĐŧ DIR Ņ‚Đ° вĐĩҁҌ ĐšĐžĐŗĐž вĐŧҖҁ҂, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ в Ņ†ŅŒĐžĐŧ҃ ĐēĐ°Ņ‚Đ°ĐģĐžĐˇŅ– айО ĐŊиĐļ҇Đĩ. /PATH/FILE Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК Ņ„Đ°ĐšĐģ Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ `.snapraidignore`. /PATH/DIR/ Đ’Đ¸ĐąĐ¸Ņ€Đ°Ņ” Ņ‚ĐžŅ‡ĐŊĐž вĐēаСаĐŊиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ‚Đ° вĐĩҁҌ ĐšĐžĐŗĐž вĐŧҖҁ҂ Đ˛Ņ–Đ´ĐŊĐžŅĐŊĐž Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ `.snapraidignore`. На Đ˛Ņ–Đ´ĐŧŅ–ĐŊ҃ Đ˛Ņ–Đ´ ĐŗĐģОйаĐģҌĐŊĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ—, Ņ„Đ°ĐšĐģи `.snapraidignore` ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒ ĐģĐ¸ŅˆĐĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа виĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ; ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅˆĐ°ĐąĐģĐžĐŊи `include` айО СаĐŋĐĩŅ€Đĩ҇ĐĩĐŊĐŊŅ (!). НаĐŋŅ€Đ¸ĐēĐģад, ŅĐēŅ‰Đž ҃ Đ˛Đ°Ņ Ņ” `.snapraidignore` ҃ `/mnt/disk1/projects/`: # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐĸІЛĐŦКИ /mnt/disk1/projects/output.bin /output.bin # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК ĐēĐ°Ņ‚Đ°ĐģĐžĐŗ Ņ–Đˇ ĐŊĐ°ĐˇĐ˛ĐžŅŽ `build` Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– projects/ build/ # ВиĐēĐģŅŽŅ‡Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК .tmp Ņ„Đ°ĐšĐģ Đ˛ŅĐĩŅ€ĐĩдиĐŊŅ– projects/ айО ĐšĐžĐŗĐž ĐŋŅ–Đ´ĐŋаĐŋĐžĐē *.tmp 10 ВĐŧҖҁ҂ (CONTENT) ================== SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” ҁĐŋĐ¸ŅĐžĐē Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ– ҁ҃Đŧи Đ˛Đ°ŅˆĐ¸Ņ… Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ Ņ„Đ°ĐšĐģŅ– вĐŧŅ–ŅŅ‚Ņƒ. ĐĻĐĩ ĐąŅ–ĐŊĐ°Ņ€ĐŊиК Ņ„Đ°ĐšĐģ, ŅĐēиК ĐŋĐĩŅ€ĐĩŅ€Đ°Ņ…ĐžĐ˛ŅƒŅ” Đ˛ŅŅ– Ņ„Đ°ĐšĐģи, ĐŋŅ€Đ¸ŅŅƒŅ‚ĐŊŅ– ҃ Đ˛Đ°ŅˆĐžĐŧ҃ Đ´Đ¸ŅĐēОвОĐŧ҃ ĐŧĐ°ŅĐ¸Đ˛Ņ–, Ņ€Đ°ĐˇĐžĐŧ С ŅƒŅŅ–Đŧа ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊиĐŧи ҁ҃ĐŧаĐŧи Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи Ņ—Ņ… ҆ҖĐģҖҁĐŊĐžŅŅ‚Ņ–. ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇŅ‡Đ¸Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ Ņ‚Đ° СаĐŋĐ¸ŅŅƒŅ”Ņ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` Ņ‚Đ° `scrub` Ņ‚Đ° ĐˇŅ‡Đ¸Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `fix`, `check` Ņ‚Đ° `status`. 11 ĐŸĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ (PARITY) ==================== SnapRAID СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ– Đ˛Đ°ŅˆĐžĐŗĐž ĐŧĐ°ŅĐ¸Đ˛Ņƒ ҃ Ņ„Đ°ĐšĐģĐ°Ņ… ĐŋĐ°Ņ€ĐŊĐžŅŅ‚Ņ–. ĐĻĐĩ ĐąŅ–ĐŊĐ°Ņ€ĐŊŅ– Ņ„Đ°ĐšĐģи, Ņ‰Đž ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒ ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊ҃ ĐŋĐ°Ņ€ĐŊŅ–ŅŅ‚ŅŒ ŅƒŅŅ–Ņ… ĐąĐģĐžĐēŅ–Đ˛, виСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ… ҃ Ņ„Đ°ĐšĐģŅ– `content`. ĐĻŅ– Ņ„Đ°ĐšĐģи ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ Ņ‚Đ° СаĐŋĐ¸ŅŅƒŅŽŅ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `sync` Ņ‚Đ° `fix` Ņ– ĐģĐ¸ŅˆĐĩ ĐˇŅ‡Đ¸Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ ĐēĐžĐŧаĐŊдаĐŧи `scrub` Ņ‚Đ° `check`. 12 ĐšĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ (ENCODING) ======================= SnapRAID в Unix Ņ–ĐŗĐŊĐžŅ€ŅƒŅ” ĐąŅƒĐ´ŅŒ-ŅĐēĐĩ ĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅ. Đ’Ņ–ĐŊ ĐˇŅ‡Đ¸Ņ‚ŅƒŅ” Ņ‚Đ° СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛ С Ņ‚Đ¸Đŧ ŅĐ°ĐŧиĐŧ ĐēĐžĐ´ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, Ņ‰Đž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅŽ ŅĐ¸ŅŅ‚ĐĩĐŧĐžŅŽ. ĐŖ Windows ŅƒŅŅ– Ņ–ĐŧĐĩĐŊа, ĐˇŅ‡Đ¸Ņ‚Đ°ĐŊŅ– С Ņ„Đ°ĐšĐģĐžĐ˛ĐžŅ— ŅĐ¸ŅŅ‚ĐĩĐŧи, ĐēĐžĐŊвĐĩŅ€Ņ‚ŅƒŅŽŅ‚ŅŒŅŅ Ņ‚Đ° ĐžĐąŅ€ĐžĐąĐģŅŅŽŅ‚ŅŒŅŅ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– UTF-8. ЊОй Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛ Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļаĐģĐ¸ŅŅ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐž, ви ĐŋОвиĐŊĐŊŅ– Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐēĐžĐŊŅĐžĐģҌ Windows ҃ Ņ€ĐĩĐļиĐŧ UTF-8 Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐŧаĐŊди `chcp 65001` Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ŅˆŅ€Đ¸Ņ„Ņ‚ TrueType, Ņ‚Đ°ĐēиК ŅĐē `Lucida Console`, ŅĐē ŅˆŅ€Đ¸Ņ„Ņ‚ ĐēĐžĐŊŅĐžĐģŅ–. ĐĻĐĩ вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐģĐ¸ŅˆĐĩ ĐŊа ĐŊĐ°Đ´Ņ€ŅƒĐēОваĐŊŅ– Ņ–ĐŧĐĩĐŊа Ņ„Đ°ĐšĐģŅ–Đ˛; ŅĐēŅ‰Đž ви ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģŅŅ”Ņ‚Đĩ Đ˛Đ¸Đ˛Ņ–Đ´ ĐēĐžĐŊŅĐžĐģŅ– ҃ Ņ„Đ°ĐšĐģ, ĐžŅ‚Ņ€Đ¸ĐŧаĐŊиК Ņ„Đ°ĐšĐģ СавĐļди ĐąŅƒĐ´Đĩ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– UTF-8. 13 ĐĐ˛Ņ‚ĐžŅ€ŅŅŒĐēĐĩ ĐŋŅ€Đ°Đ˛Đž (COPYRIGHT) ============================== ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊиК Đ°Đ˛Ņ‚ĐžŅ€ŅŅŒĐēиĐŧ ĐŋŅ€Đ°Đ˛ĐžĐŧ (C) 2025 Andrea Mazzoleni 14 Див. Ņ‚Đ°ĐēĐžĐļ (SEE ALSO) ======================== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-zh.1000066400000000000000000001641521522717156100163370ustar00rootroot00000000000000.TH "įŖį›˜é˜ĩåˆ—įš„ SnapRAID 备äģŊ" 1 .SH NAME snapraid \- įŖį›˜é˜ĩåˆ—įš„ SnapRAID 备äģŊ .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAID 是一æŦžä¸“ä¸ēįŖį›˜é˜ĩåˆ—čŽžčŽĄįš„å¤‡äģŊፋåēīŧŒåŽƒå­˜å‚¨åĨ‡åļæ ĄénjäŋĄæ¯īŧŒ äģĨ在最多六ä¸ĒįŖį›˜å‘į”Ÿæ•…éšœæ—ļčŋ›čĄŒæ•°æŽæĸ复。 .PP SnapRAID ä¸ģčρéĸ向æ‹Ĩ有大型、不常更攚文äģļįš„åŽļåē­åĒ’äŊ“中åŋƒīŧŒæäž›äģĨä¸‹į‰šæ€§īŧš .PD 0 .IP \(bu 您可äģĨäŊŋᔍ厞åĄĢ充文äģļįš„įŖį›˜īŧŒæ— éœ€é‡æ–°æ ŧåŧåŒ–īŧŒåšļåƒåž€å¸¸ä¸€æ ˇčŽŋ闎厃äģŦ。 .IP \(bu æ‚¨įš„æ‰€æœ‰æ•°æŽéƒŊäŧščĸĢæ•Ŗåˆ—īŧŒäģĨįĄŽäŋå­˜å‚¨åŽŒæ•´æ€§åšļ防æ­ĸ静é옿Ÿåã€‚ .IP \(bu åŊ“æ•…éšœįŖį›˜æ•°é‡čļ…čŋ‡åĨ‡åļæ ĄéĒŒæ•°æ—ļīŧŒæ•°æŽä¸ĸå¤ąäģ…限äēŽå—åŊąå“įš„įŖį›˜īŧ› å…ļäģ–įŖį›˜ä¸Šįš„æ•°æŽäģį„ļ可čŽŋ闎。 .IP \(bu åĻ‚æžœæ‚¨ä¸å°åŋƒåˆ é™¤äē†įŖį›˜ä¸Šįš„æ–‡äģļīŧŒå¯äģĨčŋ›čĄŒæĸ复。 .IP \(bu įŖį›˜å¯äģĨæœ‰ä¸åŒįš„å°ē寸。 .IP \(bu 您可äģĨ随æ—ᅫģåŠ įŖį›˜ã€‚ .IP \(bu SnapRAID 不äŧšé”åŽšæ‚¨įš„æ•°æŽīŧ›æ‚¨å¯äģĨ随æ—ļ停æ­ĸäŊŋį”¨åŽƒīŧŒæ— éœ€é‡æ–°æ ŧåŧåŒ–或į§ģ动数捎。 .IP \(bu čŽŋé—Žæ–‡äģļæ—ļīŧŒåĒ需一ä¸ĒįŖį›˜čŊŦ动īŧŒäģŽč€ŒčŠ‚įœį”ĩ力åšļ降äŊŽå™ĒéŸŗã€‚ .PD .PP æŦ˛äē†č§Ŗæ›´å¤šäŋĄæ¯īŧŒč¯ˇčŽŋ问 SnapRAID 厘斚įŊ‘įĢ™īŧš .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID 是 RAID 和备äģŊፋåēäš‹é—´įš„æˇˇåˆäŊ“īŧŒæ—¨åœ¨įģ“åˆä¸¤č€…įš„äŧ˜į‚šã€‚ į„ļ而īŧŒåœ¨äŊŋį”¨åŽƒäš‹å‰īŧŒæ‚¨åē”č¯Ĩ考虑一äē›é™åˆļ。 .PP ä¸ģčĻįš„é™åˆļ是īŧŒåĻ‚æžœä¸€ä¸ĒįŖį›˜å‘į”Ÿæ•…éšœč€Œæ‚¨æœ€čŋ‘æ˛Ąæœ‰čŋ›čĄŒåŒæ­Ĩīŧˆsyncīŧ‰īŧŒ 您可čƒŊæ— æŗ•åŽŒå…¨æĸ复。 æ›´å…ˇäŊ“åœ°č¯´īŧŒæ‚¨å¯čƒŊæ— æŗ•æĸ复č‡Ē上æŦĄåŒæ­Ĩ操äŊœäģĨæĨåˇ˛æ›´æ”šæˆ–åˇ˛åˆ é™¤æ–‡äģļįš„ 大小所寚åē”įš„éƒ¨åˆ†ã€‚ åŗäŊŋæ›´æ”šæˆ–åˆ é™¤įš„æ–‡äģļä¸åœ¨å‘į”Ÿæ•…éšœįš„įŖį›˜ä¸ŠīŧŒäšŸäŧšå‘į”Ÿčŋ™į§æƒ…å†ĩ。 čŋ™å°ąæ˜¯ä¸ēäģ€äšˆ SnapRAID æ›´é€‚į”¨äēŽåžˆå°‘æ›´æ”šįš„æ•°æŽã€‚ .PP åĻ一斚éĸīŧŒæ–°æˇģåŠ įš„æ–‡äģļ不äŧšé˜ģæ­ĸå¯šåˇ˛æœ‰æ–‡äģļįš„æĸ复。 您åĒäŧšä¸ĸå¤ąäŊäēŽå‘į”Ÿæ•…éšœįŖį›˜ä¸Šįš„æœ€čŋ‘æˇģåŠ įš„æ–‡äģļ。 .PP SnapRAID įš„å…ļäģ–限åˆļ包æ‹Ŧīŧš .PD 0 .IP \(bu äŊŋᔍ SnapRAIDīŧŒæ¯ä¸ĒįŖį›˜äģį„ļ有单į‹Ŧįš„æ–‡äģļįŗģįģŸã€‚ äŊŋᔍ RAIDīŧŒæ‚¨å¯äģĨčŽˇåž—ä¸€ä¸Ēå•ä¸€įš„å¤§åž‹æ–‡äģļįŗģįģŸã€‚ .IP \(bu SnapRAID 不čŋ›čĄŒæ•°æŽæĄå¸Ļ化。 äŊŋᔍ RAIDīŧŒæ‚¨å¯äģĨ通čŋ‡æĄå¸ĻåŒ–čŽˇåž—é€ŸåēĻæå‡ã€‚ .IP \(bu SnapRAID 不支持厞æ—￁ĸ复。 äŊŋᔍ RAIDīŧŒåŊ“įŖį›˜å‘į”Ÿæ•…éšœæ—ļīŧŒæ‚¨ä¸åŋ…停æ­ĸåˇĨäŊœã€‚ .IP \(bu SnapRAID åĒčƒŊäģŽæœ‰é™æ•°é‡įš„įŖį›˜æ•…éšœä¸­æĸ复数捎。 äŊŋᔍ备äģŊīŧŒæ‚¨å¯äģĨäģŽæ•´ä¸ĒįŖį›˜é˜ĩåˆ—įš„åŽŒå…¨æ•…éšœä¸­æĸ复。 .IP \(bu äģ…äŋå­˜æ–‡äģļ名、æ—ļé—´æˆŗã€įŦĻåˇé“žæŽĨ和įĄŦ链æŽĨ。 不äŋå­˜æƒé™ã€æ‰€æœ‰æƒå’Œæ‰Šåą•åąžæ€§ã€‚ .PD .SH GETTING STARTED čρäŊŋᔍ SnapRAIDīŧŒæ‚¨éœ€čρéĻ–å…ˆé€‰æ‹ŠįŖį›˜é˜ĩåˆ—ä¸­įš„ä¸€ä¸ĒįŖį›˜ä¸“į”¨äēŽ \`parity\`īŧˆåĨ‡åļæ Ąénjīŧ‰äŋĄæ¯ã€‚äŊŋᔍ䏀ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒ 您将čƒŊ够äģŽå•įŖį›˜æ•…éšœä¸­æĸ复īŧŒįąģäŧŧäēŽ RAID5。 .PP åĻ‚æžœæ‚¨æƒŗäģŽæ›´å¤šįš„įŖį›˜æ•…éšœä¸­æĸ复īŧŒįąģäŧŧäēŽ RAID6īŧŒ 您åŋ…éĄģéĸ„į•™éĸå¤–įš„įŖį›˜į”¨äēŽåĨ‡åļæ ĄéĒŒã€‚æ¯åĸžåР䏀ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒ å°ąå¯äģĨ多æĸ复一ä¸ĒįŖį›˜æ•…éšœã€‚ .PP äŊœä¸ēåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒæ‚¨åŋ…éĄģ选拊é˜ĩåˆ—ä¸­æœ€å¤§įš„įŖį›˜īŧŒ 因ä¸ēåĨ‡åļæ ĄénjäŋĄæ¯å¯čƒŊäŧšåĸžé•ŋ到é˜ĩåˆ—ä¸­æœ€å¤§įš„æ•°æŽįŖį›˜įš„å¤§å°ã€‚ .PP čŋ™äē›įŖį›˜å°†ä¸“闍ᔍäēŽå­˜å‚¨ \`parity\` 文äģļ。 您不åē”č¯Ĩ在厃äģŦ上éĸå­˜å‚¨æ‚¨įš„æ•°æŽã€‚ .PP į„ļ后īŧŒæ‚¨åŋ…éĄģ厚䚉čρäŊŋᔍ SnapRAID äŋæŠ¤įš„ \`data\`īŧˆæ•°æŽīŧ‰įŖį›˜ã€‚ åĻ‚æžœčŋ™äē›įŖį›˜åŒ…åĢåžˆå°‘æ›´æ”šįš„æ•°æŽīŧŒäŋæŠ¤äŧšæ›´æœ‰æ•ˆã€‚å› æ­¤īŧŒ 最åĨŊ**不čρ**包åĢ Windows C:\\ įŖį›˜æˆ– Unix įš„ /home、/var 和 /tmp į›ŽåŊ•。 .PP 文äģļåˆ—čĄ¨äŋå­˜åœ¨ \`content\`īŧˆå†…厚īŧ‰æ–‡äģļ中īŧŒé€šå¸¸å­˜å‚¨åœ¨æ•°æŽã€åĨ‡åļæ ĄéĒŒæˆ– åŧ•å¯ŧįŖį›˜ä¸Šã€‚ č¯Ĩ文äģļ包åĢ备äģŊįš„č¯Ļįģ†äŋĄæ¯īŧŒåŒ…æ‹Ŧæ‰€æœ‰į”¨äēŽénj蝁å…ļåŽŒæ•´æ€§įš„æ ĄéĒŒå’Œã€‚ \`content\` 文äģļ存储有多ä¸Ē副æœŦīŧŒæ¯ä¸Ē副æœŦåŋ…éĄģäŊäēŽä¸åŒįš„įŖį›˜ä¸ŠīŧŒ äģĨįĄŽäŋå­˜å‚¨æœ‰å¤šä¸ĒįŖį›˜æ•…éšœæ—ļīŧŒč‡ŗå°‘有一ä¸Ē副æœŦå¯į”¨ã€‚ .PP 例åĻ‚īŧŒå‡čŽžæ‚¨åĒ寚一ä¸ĒåĨ‡åļæ ĄénjäŋæŠ¤įē§åˆĢ感兴čļŖīŧŒåšļä¸”æ‚¨įš„įŖį›˜äŊäēŽīŧš .PP .RS 4 /mnt/diskp <\- é€‰åŽšįš„åĨ‡åļæ ĄéĒŒįŖį›˜ .PD 0 .PP .PD /mnt/disk1 <\- įŦŦ一ä¸ĒčρäŋæŠ¤įš„įŖį›˜ .PD 0 .PP .PD /mnt/disk2 <\- įŦŦäēŒä¸ĒčρäŋæŠ¤įš„įŖį›˜ .PD 0 .PP .PD /mnt/disk3 <\- įŦŦ三ä¸ĒčρäŋæŠ¤įš„įŖį›˜ .PD 0 .PD .RE .PP 您åŋ…éĄģ创åģē配įŊŽæ–‡äģļ /etc/snapraid.confīŧŒåšļ包åĢäģĨ下选项īŧš .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP åĻ‚æžœæ‚¨äŊŋᔍ WindowsīŧŒæ‚¨åē”č¯ĨäŊŋᔍ Windows čˇ¯åž„æ ŧåŧīŧŒ į”¨éŠąåŠ¨å™¨åˇå’Œåæ–œæ äģŖæ›ŋ斜杠。 .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP åĻ‚æžœæ‚¨æœ‰čŽ¸å¤šįŖį›˜ä¸”éŠąåŠ¨å™¨åˇį”¨å°ŊīŧŒæ‚¨å¯äģĨå°†įŖį›˜į›´æŽĨ挂čŊŊ到子文äģļå¤šä¸­ã€‚č¯ˇå‚é˜…īŧš .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP æ­¤æ—ļīŧŒæ‚¨åˇ˛å‡†å¤‡åĨŊčŋčĄŒ \`sync\` å‘Ŋä줿Ĩ构åģēåĨ‡åļæ ĄénjäŋĄæ¯ã€‚ .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP įŦŦ一æŦĄčŋčĄŒæ­¤čŋ‡į¨‹å¯čƒŊ需čρ几ä¸Ē小æ—ļīŧŒå…ˇäŊ“å–å†ŗäēŽįŖį›˜ä¸Šåˇ˛å­˜åœ¨æ•°æŽįš„大小。 åĻ‚æžœįŖį›˜æ˜¯įŠēįš„īŧŒåˆ™čŋ‡į¨‹æ˜¯åŗæ—ļįš„ã€‚ .PP 您可äģĨ随æ—ļ按 Ctrl+C 停æ­ĸ厃īŧŒåœ¨ä¸‹æŦĄčŋčĄŒæ—ļīŧŒåŽƒå°†äģŽä¸­æ–­įš„地斚æĸ复。 .PP åŊ“æ­¤å‘Ŋäģ¤åŽŒæˆæ—ļīŧŒæ‚¨įš„æ•°æŽæ˜¯**åŽ‰å…¨įš„**。 .PP įŽ°åœ¨æ‚¨å¯äģĨåŧ€å§‹éšæ„äŊŋį”¨æ‚¨įš„é˜ĩ列īŧŒåšļ厚期čŋčĄŒ \`sync\` å‘Ŋä줿›´æ–°åĨ‡åļæ ĄénjäŋĄæ¯ã€‚ .SS Scrubbing čĻåŽšæœŸæŖ€æŸĨ数捎和åĨ‡åļæ ĄéĒŒįš„é”™č¯¯īŧŒæ‚¨å¯äģĨčŋčĄŒ \`scrub\` å‘Ŋäģ¤ã€‚ .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP æ­¤å‘Ŋäģ¤å°†é˜ĩåˆ—ä¸­įš„æ•°æŽä¸Ž \`sync\` å‘Ŋä줿œŸé—´čŽĄįŽ—įš„æ•Ŗåˆ—čŋ›čĄŒæ¯”čžƒīŧŒ äģĨéĒŒč¯åŽŒæ•´æ€§ã€‚ .PP 每æŦĄčŋčĄŒč¯Ĩå‘Ŋäģ¤äŧšæŖ€æŸĨ大įēĻ 8% įš„é˜ĩ列īŧŒæŽ’除在čŋ‡åŽģ 10 夊内 厞čĸĢ scrub įš„æ•°æŽã€‚ 您可äģĨäŊŋᔍ \-p, \-\-plan 选项æĨæŒ‡åŽšä¸åŒįš„é‡īŧŒ åšļäŊŋᔍ \-o, \-\-older\-than 选项æĨæŒ‡åŽšä¸åŒįš„å¤Šæ•°ã€‚ 例åĻ‚īŧŒčĻæŖ€æŸĨ 20 夊äģĨä¸Šå—įš„ 5% é˜ĩ列īŧŒč¯ˇäŊŋᔍīŧš .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP åĻ‚æžœåœ¨čŋ‡į¨‹ä¸­å‘įŽ°é™éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒ ᛏåē”įš„å—äŧšåœ¨ \`content\` 文äģļ中čĸĢæ ‡čްä¸ē坏块īŧŒåšļ列在 \`status\` å‘Ŋäģ¤ä¸­ã€‚ .PP .RS 4 snapraid status .PD 0 .PD .RE .PP čρäŋŽå¤åރäģŦīŧŒæ‚¨å¯äģĨäŊŋᔍ \`fix\` å‘Ŋäģ¤īŧŒäŊŋᔍ \-e, \-\-filter\-error 选项čŋ‡æģ¤åå—īŧš .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP 在下æŦĄ \`scrub\` æ—ļīŧŒåĻ‚æžœåŽƒäģŦįĄŽåŽžčĸĢäŋŽå¤äē†īŧŒé”™č¯¯å°†äģŽ \`status\` æŠĨ告中æļˆå¤ąã€‚ ä¸ēä熿›´åŋĢīŧŒæ‚¨å¯äģĨäŊŋᔍ \-p bad æĨäģ… scrub æ ‡čŽ°ä¸ēåå—įš„å—ã€‚ .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP 在æœĒ同æ­Ĩįš„é˜ĩ列上čŋčĄŒ \`scrub\` 可čƒŊäŧšæŠĨå‘Šį”ąåˇ˛åˆ é™¤æˆ–åˇ˛äŋŽæ”šæ–‡äģļåŧ•čĩˇįš„é”™č¯¯ã€‚ čŋ™äē›é”™č¯¯äŧšåœ¨ \`scrub\` 输å‡ē中æŠĨ告īŧŒäŊ†į›¸å…ŗå—不äŧščĸĢæ ‡čްä¸ē坏块。 .SS Pooling æŗ¨æ„īŧšä¸‹éĸ描čŋ°įš„ pooling 功čƒŊ厞čĸĢ mergerfs åˇĨå…ˇå–äģŖīŧŒ mergerfs įŽ°åœ¨æ˜¯ SnapRAID į¤žåŒēæŽ¨čįš„ Linux į”¨æˆˇé€‰éĄšã€‚ Mergefs 提䞛äē†ä¸€į§æ›´įĩæ´ģ、更éĢ˜æ•ˆįš„æ–šåŧīŧŒå°†å¤šä¸ĒéŠąåŠ¨å™¨æą‡é›†åˆ°ä¸€ä¸Ē įģŸä¸€įš„æŒ‚čŊŊį‚šä¸­īŧŒå…čޏ莍é˜ĩ列无įŧčŽŋé—Žæ–‡äģļīŧŒč€Œæ— éœ€äžčĩ–įŦĻåˇé“žæŽĨ。 厃与 SnapRAID 垈åĨŊ地集成äģĨ提䞛åĨ‡åļæ ĄénjäŋæŠ¤īŧŒå¸¸į”¨äēŽ OpenMediaVault (OMV) 或č‡Ē厚䚉 NAS 配įŊŽį­‰čŽžįŊŽä¸­ã€‚ .PP čρäŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰æ–‡äģ￘žį¤ē在同一ä¸Ēį›ŽåŊ•树中īŧŒ 您可äģĨ吝ᔍ \`pooling\` 功čƒŊ。厃äŊŋᔍįŦĻåˇé“žæŽĨ创åģēäē†ä¸€ä¸Ē é˜ĩ列中所有文äģļįš„åĒč¯ģč™šæ‹Ÿč§†å›žã€‚ .PP 您可äģĨ在配įŊŽæ–‡äģļ中äŊŋᔍäģĨ下选项配įŊŽ \`pooling\` į›ŽåŊ•īŧš .PP .RS 4 pool /pool .PD 0 .PD .RE .PP æˆ–č€…īŧŒåĻ‚æžœæ‚¨äŊŋᔍ WindowsīŧŒåˆ™äŊŋᔍīŧš .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP į„ļ后čŋčĄŒ \`pool\` å‘Ŋäģ¤åˆ›åģ翈–æ›´æ–°č™šæ‹Ÿč§†å›žã€‚ .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP åĻ‚æžœæ‚¨äŊŋᔍ Unix åšŗå°åšļ希望通čŋ‡įŊ‘įģœå°†æ­¤į›ŽåŊ•å…ąäēĢįģ™ Windows 或 Unix æœē器īŧŒ 您åē”č¯Ĩ在 /etc/samba/smb.conf 中æˇģ加äģĨ下选项īŧš .PP .RS 4 # 在 smb.conf įš„å…¨åą€éƒ¨åˆ† .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # 在 smb.conf įš„å…ąäēĢ部分 .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP 在 Windows 中īŧŒé€ščŋ‡įŊ‘įģœå…ąäēĢįŦĻåˇé“žæŽĨ需čρåŽĸæˆˇį̝čŋœį¨‹č§ŖæžåރäģŦ。 čĻå¯į”¨æ­¤åŠŸčƒŊīŧŒé™¤äē†å…ąäēĢ pool į›ŽåŊ•䚋外īŧŒæ‚¨čŋ˜åŋ…éĄģį‹ŦįĢ‹å…ąäēĢæ‰€æœ‰įŖį›˜īŧŒ äŊŋį”¨é…įŊŽæ–‡äģļä¸­åŽšäš‰įš„įŖį›˜åį§°äŊœä¸ēå…ąäēĢį‚šã€‚ 您čŋ˜åŋ…éĄģ在配įŊŽæ–‡äģļįš„ \`share\` é€‰éĄšä¸­æŒ‡åŽščŋœį¨‹åŽĸæˆˇį̝čŽŋ问čŋ™äē› å…ąäēĢįŖį›˜æ‰€éœ€įš„ Windows UNC čˇ¯åž„ã€‚ .PP 例åĻ‚īŧŒåœ¨åä¸ē \`darkstar\` įš„æœåŠĄå™¨ä¸Šæ“äŊœīŧŒæ‚¨å¯äģĨäŊŋᔍäģĨ下选项īŧš .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP åšļ通čŋ‡įŊ‘įģœå…ąäēĢäģĨä¸‹į›ŽåŊ•īŧš .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP äģĨå…čŽ¸čŋœį¨‹åŽĸæˆˇį̝čŽŋ问 \\\\darkstar\\pool å¤„įš„æ‰€æœ‰æ–‡äģļ。 .PP 您可čƒŊčŋ˜éœ€čĻé…įŊŽčŋœį¨‹åŽĸæˆˇį̝īŧŒäŊŋᔍäģĨ下å‘Ŋäģ¤å¯į”¨å¯ščŋœį¨‹įŦĻåˇé“žæŽĨįš„čŽŋ问īŧš .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAID įš„åŠŸčƒŊ更像一ä¸Ē备äģŊፋåēč€Œä¸æ˜¯ RAID įŗģįģŸīŧŒ 厃可äģĨäŊŋᔍ \-f, \-\-filter 选项æĨæĸ复或取æļˆåˆ é™¤æ–‡äģļ到å…ļäģĨå‰įš„įŠļ态īŧš .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP æˆ–č€…å¯šäēŽä¸€ä¸Ēį›ŽåŊ•īŧš .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP 您䚟可äģĨäŊŋᔍ \-m, \-\-filter\-missing 选项æĨäģ…æĸå¤į›ŽåŊ•å†…æ„å¤–åˆ é™¤įš„æ–‡äģļīŧŒ č¯Ĩ选项äģ…æĸ复ä¸ĸå¤ąįš„æ–‡äģļīŧŒäŋæŒæ‰€æœ‰å…ļäģ–æ–‡äģļ不变。 .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP æˆ–č€…äŊŋᔍäģĨ下å‘Ŋä줿ĸå¤æ‰€æœ‰éŠąåŠ¨å™¨ä¸Šæ‰€æœ‰åˇ˛åˆ é™¤įš„æ–‡äģļīŧš .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering æœ€įŗŸįŗ•įš„æƒ…å†ĩå‘į”Ÿäē†īŧŒæ‚¨ä¸ĸå¤ąäē†ä¸€ä¸Ē或多ä¸ĒįŖį›˜īŧ .PP **不čĻæƒŠæ…Œīŧ** 您将čƒŊ够æĸ复厃äģŦīŧ .PP 您åŋ…éĄģåšįš„įŦŦ一äģļä狿˜¯éŋå…å¯šįŖį›˜é˜ĩ列čŋ›čĄŒčŋ›ä¸€æ­Ĩįš„æ›´æ”šã€‚ įĻį”¨å¯šå…ļįš„äģģäŊ•čŋœį¨‹čŋžæŽĨäģĨ及äģģäŊ•čŽĄåˆ’įš„čŋ›į¨‹īŧŒåŒ…æ‹ŦäģģäŊ•čŽĄåˆ’įš„ SnapRAID 夜间同æ­Ĩ或 scrub。 .PP į„ļ后įģ§įģ­æ‰§čĄŒäģĨ下æ­ĨéĒ¤ã€‚ .SS STEP 1 \-> 重新配įŊŽ æ‚¨éœ€čρ䏀äē›įŠē间æĨæĸ复īŧŒį†æƒŗæƒ…å†ĩ下是在éĸå¤–įš„å¤‡į”¨įŖį›˜ä¸ŠīŧŒ äŊ†å¤–部 USB įŖį›˜æˆ–čŋœį¨‹įŖį›˜äšŸčļŗå¤Ÿã€‚ .PP äŋŽæ”š SnapRAID 配įŊŽæ–‡äģļīŧŒäŊŋæ•…éšœįŖį›˜įš„ \`data\` 或 \`parity\` é€‰éĄšæŒ‡å‘ 一ä¸Ēå…ˇæœ‰čļŗå¤ŸįŠē闲įŠē间æĨæĸ复文äģļįš„äŊįŊŽã€‚ .PP 例åĻ‚īŧŒåĻ‚æžœįŖį›˜ \`d1\` å‘į”Ÿæ•…éšœīŧŒåˆ™äģŽīŧš .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP 更攚ä¸ēīŧš .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP åĻ‚æžœéœ€čρæĸå¤įš„įŖį›˜æ˜¯åĨ‡åļæ ĄéĒŒįŖį›˜īŧŒč¯ˇæ›´æ–°į›¸åē”įš„ \`parity\` é€‰éĄšã€‚ åĻ‚æžœæ‚¨æœ‰å¤šä¸Ēæ•…éšœįŖį›˜īŧŒč¯ˇæ›´æ–°æ‰€æœ‰åރäģŦįš„é…įŊŽé€‰éĄšã€‚ .SS STEP 2 \-> äŋŽå¤ čŋčĄŒ fix å‘Ŋäģ¤īŧŒåšļ将æ—Ĩåŋ—存储在外部文äģļ中īŧš .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP å…ļ中 NAME æ˜¯įŖį›˜įš„åį§°īŧŒäž‹åĻ‚æˆ‘äģŦ前éĸäž‹å­ä¸­įš„ \`d1\`。 åĻ‚æžœéœ€čρæĸå¤įš„įŖį›˜æ˜¯åĨ‡åļæ ĄéĒŒįŖį›˜īŧŒč¯ˇäŊŋį”¨åį§° \`parity\`、\`2\-parity\` į­‰ã€‚ åĻ‚æžœæ‚¨æœ‰å¤šä¸Ēæ•…éšœįŖį›˜īŧŒč¯ˇäŊŋį”¨å¤šä¸Ē \-d 选项æĨ指厚所有厃äģŦ。 .PP æ­¤å‘Ŋäģ¤å°†čŠąč´šåžˆé•ŋæ—ļ间。 .PP įĄŽäŋæ‚¨æœ‰å‡  GB įš„å¯į”¨įŠē间æĨ存储 fix.log 文äģļ。 在有čļŗå¤Ÿå¯į”¨įŠēé—´įš„įŖį›˜ä¸ŠčŋčĄŒåŽƒã€‚ .PP įŽ°åœ¨æ‚¨åˇ˛įģæĸ复ä熿‰€æœ‰å¯æĸå¤įš„å†…åŽšã€‚åĻ‚æžœæœ‰ä盿–‡äģļ部分或厌全不可æĸ复īŧŒ 厃äģŦ将čĸĢ重å‘Ŋ名åšļæˇģ加 \`.unrecoverable\` æ‰Šåą•åã€‚ .PP 您可äģĨ通čŋ‡æŖ€æŸĨ所有äģĨ \`unrecoverable:\` åŧ€å¤´įš„čĄŒīŧŒåœ¨ fix.log 文äģļ中 扞到所有不可æĸå¤å—įš„č¯Ļįģ†åˆ—čĄ¨ã€‚ .PP åĻ‚æžœæ‚¨å¯šæĸ复不æģĄæ„īŧŒæ‚¨å¯äģĨ栚捎需čĻé‡č¯•å¤šæŦĄã€‚ .PP 例åĻ‚īŧŒåĻ‚æžœæ‚¨åœ¨ä¸ŠæŦĄ \`sync\` 䚋后äģŽé˜ĩ列中删除ä熿–‡äģļīŧŒ čŋ™å¯čƒŊå¯ŧč‡´æŸä盿–‡äģļæ— æŗ•æĸ复。 在čŋ™į§æƒ…å†ĩ下īŧŒæ‚¨å¯äģĨäŊŋᔍ \-i, \-\-import é€‰éĄšé‡č¯• \`fix\`īŧŒ 指厚čŋ™ä盿–‡äģļįŽ°åœ¨åœ¨å“Ē里īŧŒäģĨäžŋ将厃äģŦ再æŦĄåŒ…åĢ在æĸ复čŋ‡į¨‹ä¸­ã€‚ .PP åĻ‚æžœæ‚¨å¯šæĸ复感到æģĄæ„īŧŒæ‚¨å¯äģĨįģ§įģ­čŋ›čĄŒīŧŒ äŊ†č¯ˇæŗ¨æ„īŧŒåœ¨åŒæ­Ĩ䚋后īŧŒæ‚¨ä¸čƒŊå†é‡č¯• \`fix\` å‘Ŋäģ¤äē†īŧ .SS STEP 3 \-> æŖ€æŸĨ äŊœä¸ēä¸€éĄšč°¨æ…Žįš„æŖ€æŸĨīŧŒæ‚¨įŽ°åœ¨å¯äģĨčŋčĄŒ \`check\` å‘Ŋäģ¤īŧŒäģĨįĄŽäŋ æĸå¤įš„įŖį›˜ä¸Šįš„ä¸€åˆ‡éƒŊæ˜¯æ­ŖįĄŽįš„ã€‚ .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP å…ļ中 NAME æ˜¯įŖį›˜įš„åį§°īŧŒäž‹åĻ‚æˆ‘äģŦ前éĸäž‹å­ä¸­įš„ \`d1\`。 .TP .B \-d 和 \-a é€‰éĄšå‘Šč¯‰ SnapRAID åĒæŖ€æŸĨæŒ‡åŽšįš„įŖį›˜åšļåŋŊį•Ĩ所有åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ .PP æ­¤å‘Ŋäģ¤å°†čŠąč´šåžˆé•ŋæ—ļ间īŧŒäŊ†åĻ‚æžœæ‚¨ä¸æ˜¯čŋ‡äēŽč°¨æ…ŽīŧŒå¯äģĨ莺čŋ‡åŽƒã€‚ .SS STEP 4 \-> 同æ­Ĩ čŋčĄŒ \`sync\` å‘Ŋäģ¤äģĨ将é˜ĩåˆ—ä¸Žæ–°įŖį›˜é‡æ–°åŒæ­Ĩ。 .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP åĻ‚æžœæ‰€æœ‰å†…åŽšéƒŊ厞æĸ复īŧŒæ­¤å‘Ŋä줿˜¯åŗæ—ļįš„ã€‚ .SH COMMANDS SnapRAID 提䞛äē†ä¸€äē›įŽ€å•įš„å‘Ŋäģ¤īŧŒå…čŽ¸æ‚¨īŧš .PD 0 .IP \(bu 打印é˜ĩåˆ—įš„įŠļ态 \-> \`status\` .IP \(bu 控åˆļįŖį›˜ \-> \`smart\`、\`probe\`、\`up\`、\`down\` .IP \(bu čŋ›čĄŒå¤‡äģŊ/åŋĢį…§ \-> \`sync\` .IP \(bu åŽšæœŸæŖ€æŸĨ数捎 \-> \`scrub\` .IP \(bu æĸ复上æŦĄå¤‡äģŊ/åŋĢį…§ \-> \`fix\`。 .PD .PP å‘Ŋäģ¤åŋ…éĄģį”¨å°å†™å­—æ¯äšĻ写。 .SS status æ‰“å°įŖį›˜é˜ĩ列įŠļæ€įš„æ‘˜čĻã€‚ .PP 厃包æ‹Ŧæœ‰å…ŗåĨ‡åļæ ĄénjįĸŽį‰‡ã€å—æœĒįģæŖ€æŸĨ有多䚅īŧŒäģĨ及在 scrubbing æœŸé—´é‡åˆ°įš„æ‰€æœ‰čŽ°åŊ•įš„é™éģ˜é”™č¯¯įš„äŋĄæ¯ã€‚ .PP æ‰€æäž›įš„äŋĄæ¯æŒ‡įš„æ˜¯æ‚¨ä¸ŠæŦĄčŋčĄŒ \`sync\` įš„æ—ļ间。 ä¸č€ƒč™‘åŽæĨįš„äŋŽæ”šã€‚ .PP åĻ‚æžœæŖ€æĩ‹åˆ°åå—īŧŒåˆ™äŧšåˆ—å‡ē厃äģŦįš„å—åˇã€‚ čρäŋŽå¤åރäģŦīŧŒæ‚¨å¯äģĨäŊŋᔍ \`fix \-e\` å‘Ŋäģ¤ã€‚ .PP 厃čŋ˜äŧšæ˜žį¤ē一ä¸Ēå›žčĄ¨īŧŒčĄ¨į¤ē每ä¸Ē块上æŦĄčĸĢ scrub 或 sync įš„æ—ļ间。 čĸĢ scrub įš„å—æ˜žį¤ēä¸ē \`*\`īŧŒåˇ˛åŒæ­ĨäŊ†å°šæœĒ scrub įš„å—æ˜žį¤ēä¸ē \`o\`。 .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS smart 打印įŗģįģŸä¸­æ‰€æœ‰įŖį›˜įš„ SMART æŠĨ告。 .PP 厃包æ‹Ŧ寚明嚴故障æĻ‚įŽ‡įš„äŧ°čŽĄīŧŒå…čŽ¸æ‚¨čŽĄåˆ’æ›´æĸ昞į¤ē å¯į–‘åąžæ€§įš„įŖį›˜čŋ›čĄŒįģ´æŠ¤ã€‚ .PP æ­¤æĻ‚įŽ‡äŧ°čŽĄæ˜¯é€ščŋ‡å°†įŖį›˜įš„ SMART åąžæ€§ä¸Ž Backblaze æäž›įš„äģĨ下数捎čŋ›čĄŒå…ŗč”čŽˇåž—įš„īŧš .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP åĻ‚æžœ SMART æŠĨå‘ŠįŖį›˜æ­Ŗåœ¨å‘į”Ÿæ•…éšœīŧŒåˆ™äŧšä¸ēč¯ĨįŖį›˜æ‰“å° \`FAIL\` 或 \`PREFAIL\`īŧŒ åšļ且 SnapRAID čŋ”å›žé”™č¯¯ã€‚ 在čŋ™į§æƒ…å†ĩ下īŧŒ**åŧē჈åģē莎**įĢ‹åŗæ›´æĸįŖį›˜ã€‚ .PP å…ļäģ–可čƒŊįš„įŠļ态字įŦĻä¸˛æœ‰īŧš .RS 4 .PD 0 .HP 4 .I logfail čŋ‡åŽģīŧŒæŸäē›åąžæ€§äŊŽäēŽé˜ˆå€ŧ。 .HP 4 .I logerr čŽžå¤‡é”™č¯¯æ—Ĩåŋ—包åĢé”™č¯¯ã€‚ .HP 4 .I selferr čŽžå¤‡č‡ĒæŖ€æ—Ĩåŋ—包åĢé”™č¯¯ã€‚ .PD .RE .PP åĻ‚æžœæŒ‡åŽšäē† \-v, \-\-verbose 选项īŧŒåˆ™äŧšæäž›æ›´æˇąå…Ĩįš„įģŸčŽĄåˆ†æžã€‚ 此分析可äģĨå¸ŽåŠŠæ‚¨å†ŗåŽšæ˜¯åĻ需čĻæ›´å¤šæˆ–æ›´å°‘įš„åĨ‡åļæ ĄéĒŒã€‚ .PP æ­¤å‘Ŋäģ¤äŊŋᔍ \`smartctl\` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ \`smartctl \-a\`。 .PP åĻ‚æžœæ‚¨įš„čŽžå¤‡æœĒæ­ŖįĄŽč‡ĒåŠ¨æŖ€æĩ‹īŧŒæ‚¨å¯äģĨäŊŋį”¨é…įŊŽ æ–‡äģļä¸­įš„ \`smartctl\` é€‰éĄšæŒ‡åŽšč‡Ē厚䚉å‘Ŋäģ¤ã€‚ .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS probe 打印įŗģįģŸä¸­æ‰€æœ‰įŖį›˜įš„**į”ĩæē**įŠļ态。 .PP \`Standby\`īŧˆåž…æœēīŧ‰čĄ¨į¤ēįŖį›˜æœĒčŊŦ动。\`Active\`īŧˆæ´ģ动īŧ‰čĄ¨į¤ē įŖį›˜æ­Ŗåœ¨čŊŦ动。 .PP æ­¤å‘Ŋäģ¤äŊŋᔍ \`smartctl\` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ \`smartctl \-n standby \-i\`。 .PP åĻ‚æžœæ‚¨įš„čŽžå¤‡æœĒæ­ŖįĄŽč‡ĒåŠ¨æŖ€æĩ‹īŧŒæ‚¨å¯äģĨäŊŋį”¨é…įŊŽ æ–‡äģļä¸­įš„ \`smartctl\` é€‰éĄšæŒ‡åŽšč‡Ē厚䚉å‘Ŋäģ¤ã€‚ .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS up äŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰įŖį›˜čŊŦ动čĩˇæĨ。 .PP 您可äģĨäŊŋᔍ \-d, \-\-filter\-disk 选项åĒå¯åŠ¨į‰šåŽšįš„įŖį›˜ã€‚ .PP 同æ—ļå¯åŠ¨æ‰€æœ‰įŖį›˜éœ€čĻå¤§é‡įš„į”ĩ力。 įĄŽäŋæ‚¨įš„į”ĩæēčƒŊ够æ‰ŋ受。 .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS down äŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰įŖį›˜åœčŊŦ。 .PP æ­¤å‘Ŋäģ¤äŊŋᔍ \`smartctl\` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ \`smartctl \-s standby,now\`。 .PP 您可äģĨäŊŋᔍ \-d, \-\-filter\-disk 选项åĒ停čŊŦį‰šåŽšįš„įŖį›˜ã€‚ .PP čĻåœ¨å‘į”Ÿé”™č¯¯æ—ļč‡Ē动停čŊŦīŧŒæ‚¨å¯äģĨ将 \-s, \-\-spin\-down\-on\-error 选项与äģģäŊ•å…ļäģ–å‘Ŋäģ¤ä¸€čĩˇäŊŋᔍīŧŒčŋ™į›¸åŊ“äēŽåœ¨å‘į”Ÿé”™č¯¯æ—ļ手动čŋčĄŒ \`down\`。 .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS diff 列å‡ēč‡Ē上æŦĄ \`sync\` äģĨæĨæ‰€æœ‰åˇ˛äŋŽæ”šã€éœ€čĻé‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒæ•°æŽįš„ 文äģļ。 .PP æ­¤å‘Ŋäģ¤ä¸æŖ€æŸĨ文äģļæ•°æŽīŧŒäģ…æŖ€æŸĨ文äģļæ—ļé—´æˆŗã€å¤§å°å’Œ inode。 .PP 列å‡ēæ‰€æœ‰æ›´æ”šįš„æ–‡äģļ后īŧŒäŧšæ˜žį¤ēæ›´æ”šįš„æ‘˜čρīŧŒæŒ‰äģĨ下斚åŧåˆ†įģ„īŧš .RS 4 .PD 0 .HP 4 .I equal 文äģļä¸Žäš‹å‰į›¸æ¯”æœĒ更攚。 .HP 4 .I added äš‹å‰ä¸å­˜åœ¨ã€åˇ˛æˇģåŠ įš„æ–‡äģļ。 .HP 4 .I removed åˇ˛åˆ é™¤įš„æ–‡äģļ。 .HP 4 .I updated 大小或æ—ļé—´æˆŗä¸åŒįš„æ–‡äģļīŧŒčĄ¨į¤ē厃äģŦ厞čĸĢäŋŽæ”šã€‚ .HP 4 .I moved åœ¨åŒä¸€įŖį›˜ä¸Šį§ģåŠ¨åˆ°ä¸åŒį›ŽåŊ•įš„æ–‡äģļ。 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°ã€æ—ļé—´æˆŗå’Œ inodeīŧŒäŊ†į›ŽåŊ•不同æĨ蝆åˆĢ。 .HP 4 .I copied åœ¨į›¸åŒæˆ–ä¸åŒįŖį›˜ä¸Šå¤åˆļįš„æ–‡äģļīŧŒä¸”原始文äģļäģį„ļ存在。 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗčŋ›čĄŒč¯†åˆĢ。 åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™åŋ…éĄģåŽŒæ•´čˇ¯åž„åŒšé…æ‰čƒŊ蝆åˆĢīŧŒč€Œä¸äģ…äģ…æ˜¯å į§°ã€‚ .HP 4 .I relocated åœ¨į›¸åŒæˆ–ä¸åŒįŖį›˜ä¸Šį§ģåŠ¨įš„æ–‡äģļīŧŒä¸”原始文äģļ厞æļˆå¤ąã€‚ 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗčŋ›čĄŒč¯†åˆĢ。 åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™åŋ…éĄģåŽŒæ•´čˇ¯åž„åŒšé…æ‰čƒŊ蝆åˆĢ。 ä¸ŽåŒä¸€įŖį›˜ä¸Šįš„ \'moved\' 文äģļ不同īŧŒé‡åޚäŊįš„æ–‡äģļå…ˇæœ‰ä¸åŒįš„ inode。 .HP 4 .I restored inode 不同äŊ†į›ŽåŊ•ã€åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗåŒšé…įš„æ–‡äģļ。 čŋ™äē›é€šå¸¸æ˜¯åˆ é™¤åŽæĸå¤įš„æ–‡äģļ。 .PD .RE .PP åĻ‚æžœéœ€čρ \`sync\`īŧŒčŋ›į¨‹čŋ”å›žį ä¸ē 2īŧŒč€Œä¸æ˜¯éģ˜čŽ¤įš„ 0。 čŋ”å›žį  1 ᔍäēŽä¸€čˆŦé”™č¯¯æƒ…å†ĩ。 .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS sync 更新åĨ‡åļæ ĄénjäŋĄæ¯ã€‚č¯ģå–įŖį›˜é˜ĩåˆ—ä¸­æ‰€æœ‰åˇ˛äŋŽæ”šįš„æ–‡äģļīŧŒ åšļæ›´æ–°į›¸åē”įš„åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ .PP 您可äģĨ随æ—ļ按 Ctrl+C 停æ­ĸæ­¤čŋ‡į¨‹īŧŒč€Œä¸äŧšä¸ĸå¤ąåˇ˛åŽŒæˆįš„åˇĨäŊœã€‚ 在下æŦĄčŋčĄŒæ—ļīŧŒ\`sync\` čŋ‡į¨‹å°†äģŽä¸­æ–­įš„地斚æĸ复。 .PP åĻ‚æžœåœ¨čŋ‡į¨‹ä¸­å‘įŽ°é™éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒ ᛏåē”įš„å—äŧščĸĢæ ‡čްä¸ē坏块。 .PP 文äģļ通čŋ‡čˇ¯åž„å’Œ/或 inode 蝆åˆĢīŧŒåšļæŖ€æŸĨ大小和æ—ļé—´æˆŗã€‚ åĻ‚æžœæ–‡äģļ大小或æ—ļé—´æˆŗä¸åŒīŧŒåˆ™äŧšä¸ē整ä¸Ē文äģļé‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åĻ‚æžœæ–‡äģļåœ¨åŒä¸€įŖį›˜ä¸ŠčĸĢį§ģ动或重å‘Ŋ名īŧŒäŋæŒį›¸åŒįš„ inodeīŧŒåˆ™ä¸é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ åĻ‚æžœæ–‡äģļį§ģ动到åĻ一ä¸ĒįŖį›˜īŧŒåˆ™é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄénjīŧŒ äŊ†äŋį•™äģĨå‰čŽĄįŽ—įš„æ•Ŗåˆ—äŋĄæ¯ã€‚ .PP åĻ‚æžœéœ€čρīŧŒäŧšäŋŽæ”š \`content\` 和 \`parity\` 文äģļ。 é˜ĩåˆ—ä¸­įš„æ–‡äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ .SS scrub Scrub é˜ĩ列īŧŒæŖ€æŸĨ数捎和åĨ‡åļæ ĄéĒŒįŖį›˜ä¸­įš„é™é옿ˆ–čž“å…Ĩ/输å‡ēé”™č¯¯ã€‚ .PP 每æŦĄč°ƒį”¨æŖ€æŸĨ大įēĻ 8% įš„é˜ĩ列īŧŒæŽ’除在čŋ‡åŽģ 10 夊内 厞čĸĢ scrub įš„æ•°æŽã€‚ čŋ™æ„å‘ŗį€æ¯å‘¨ scrub 一æŦĄå¯įĄŽäŋæ¯éš”三ä¸Ēæœˆč‡ŗå°‘æŖ€æŸĨ一æŦĄæ•°æŽįš„æ¯ä¸€äŊã€‚ .PP 您可äģĨäŊŋᔍ \-p, \-\-plan é€‰éĄšåŽšäš‰ä¸åŒįš„ scrub čŽĄåˆ’æˆ–æ•°é‡īŧŒ č¯Ĩ选项æŽĨ受īŧš bad \- Scrub æ ‡čŽ°ä¸ēåå—įš„å—ã€‚ new \- Scrub 刚刚同æ­ĨäŊ†å°šæœĒ scrub įš„å—ã€‚ full \- Scrub 所有内厚。 0\-100 \- Scrub æŒ‡åŽšį™žåˆ†æ¯”įš„å—ã€‚ .PP åĻ‚æžœæŒ‡åŽšäē†į™žåˆ†æ¯”数量īŧŒæ‚¨čŋ˜å¯äģĨäŊŋᔍ \-o, \-\-older\-than 选项æĨ厚䚉块åē”č¯Ĩ有多旧。 æœ€æ—§įš„å—éĻ–å…ˆčĸĢ scrubīŧŒįĄŽäŋæœ€äŊŗæŖ€æŸĨ。 åĻ‚æžœæ‚¨åĒæƒŗ scrub 刚刚同æ­ĨäŊ†å°šæœĒ scrub įš„å—īŧŒ 蝎äŊŋᔍ \`\-p new\` é€‰éĄšã€‚ .PP čĻčŽˇå– scrub įŠļæ€įš„č¯Ļįģ†äŋĄæ¯īŧŒč¯ˇäŊŋᔍ \`status\` å‘Ŋäģ¤ã€‚ .PP 寚äēŽå‘įŽ°įš„äģģäŊ•静éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒį›¸åē”įš„å— äŧšåœ¨ \`content\` 文äģļ中čĸĢæ ‡čްä¸ē坏块。 čŋ™äē›åå—列在 \`status\` 中īŧŒå¯äģĨäŊŋᔍ \`fix \-e\` äŋŽå¤ã€‚ äŋŽå¤åŽīŧŒåœ¨ä¸‹æŦĄ scrub æ—ļīŧŒåރäģŦ将čĸĢé‡æ–°æŖ€æŸĨīŧŒåĻ‚æžœå‘įŽ°åˇ˛æ›´æ­ŖīŧŒ 则äŧšåˆ é™¤åå—æ ‡čŽ°ã€‚ čρäģ… scrub 坏块īŧŒæ‚¨å¯äģĨäŊŋᔍ \`scrub \-p bad\` å‘Ŋäģ¤ã€‚ .PP åģē莎äģ…åœ¨åˇ˛åŒæ­Ĩįš„é˜ĩ列上čŋčĄŒ \`scrub\`īŧŒäģĨéŋ免 į”ąæœĒ同æ­Ĩ数捎åŧ•čĩˇįš„æŠĨå‘Šé”™č¯¯ã€‚čŋ™äē›é”™č¯¯čĸĢ蝆åˆĢä¸ē不是静éģ˜é”™č¯¯īŧŒ åšļ且块不äŧščĸĢæ ‡čްä¸ē坏块īŧŒäŊ†æ­¤įąģ错蝝äŧšåœ¨å‘Ŋäģ¤įš„čž“å‡ē中æŠĨ告。 .PP \`content\` 文äģļäŧščĸĢäŋŽæ”šäģĨ更新每ä¸Ē块上æŦĄæŖ€æŸĨįš„æ—ļ间 åšļæ ‡čŽ°åå—ã€‚ \`parity\` 文äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ é˜ĩåˆ—ä¸­įš„æ–‡äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ .SS fix äŋŽå¤æ‰€æœ‰æ–‡äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ .PP 所有文äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽéƒŊ与上æŦĄ \`sync\` 中äŋå­˜įš„åŋĢį…§ įŠļ态čŋ›čĄŒæ¯”čžƒã€‚ åĻ‚æžœå‘įŽ°åˇŽåŧ‚īŧŒåˆ™å°†å…￁ĸå¤åˆ°å­˜å‚¨įš„åŋĢį…§ã€‚ .PP **č­Ļ告īŧ** \`fix\` å‘Ŋäģ¤ä¸åŒēåˆ†é”™č¯¯å’Œ 故意äŋŽæ”šã€‚åރ**æ— æĄäģļ地**将文äģļįŠļ态æĸ复到上æŦĄ \`sync\`。 .PP åĻ‚æžœæœĒ指厚å…ļäģ–选饚īŧŒåˆ™å¤„į†æ•´ä¸Ēé˜ĩ列。 äŊŋᔍčŋ‡æģ¤é€‰éĄšé€‰æ‹ŠčĻæ“äŊœįš„æ–‡äģ￈–įŖį›˜įš„å­é›†ã€‚ .PP čρäģ…äŋŽå¤åœ¨ \`sync\` 和 \`scrub\` æœŸé—´æ ‡čŽ°ä¸ēåå—įš„å—īŧŒ 蝎äŊŋᔍ \-e, \-\-filter\-error é€‰éĄšã€‚ 与å…ļäģ–čŋ‡æģ¤é€‰éĄšä¸åŒīŧŒæ­¤é€‰éĄšäģ…寚č‡Ē上æŦĄ \`sync\` äģĨæĨæœĒæ›´æ”šįš„ 文äģļåē”ᔍäŋŽå¤ã€‚ .PP SnapRAID äŧšé‡å‘Ŋåæ‰€æœ‰æ— æŗ•äŋŽå¤įš„æ–‡äģļīŧŒåšļæˇģ加 \`.unrecoverable\` æ‰Šåą•åã€‚ .PP 在äŋŽå¤äš‹å‰īŧŒäŧšæ‰Ģ描整ä¸Ēé˜ĩ列äģĨæŸĨ扞č‡Ē上æŦĄ \`sync\` 操äŊœäģĨæĨį§ģåŠ¨įš„äģģäŊ•æ–‡äģļ。 čŋ™ä盿–‡äģļ通čŋ‡åރäģŦįš„æ—ļé—´æˆŗč¯†åˆĢīŧŒåŋŊį•Ĩ厃äģŦįš„åį§° å’Œį›ŽåŊ•īŧŒåšļ在åŋ…čρæ—ļᔍäēŽæĸ复čŋ‡į¨‹ã€‚ åĻ‚æžœæ‚¨å°†å…ļ中一äē›į§ģ到äē†é˜ĩ列䚋外īŧŒæ‚¨å¯äģĨäŊŋᔍ \-i, \-\-import é€‰éĄšæŒ‡åŽšéĸå¤–įš„į›ŽåŊ•čŋ›čĄŒæ‰Ģ描。 .PP 文äģļäģ…通čŋ‡čˇ¯åž„蝆åˆĢīŧŒč€Œä¸é€ščŋ‡ inode 蝆åˆĢ。 .PP \`content\` 文äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ åĻ‚æžœéœ€čρīŧŒ\`parity\` 文äģļäŧščĸĢäŋŽæ”šã€‚ åĻ‚æžœéœ€čρīŧŒé˜ĩåˆ—ä¸­įš„æ–‡äģļäŧščĸĢäŋŽæ”šã€‚ .SS check éĒŒč¯æ‰€æœ‰æ–‡äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ .PP åŽƒįš„åˇĨäŊœæ–šåŧįąģäŧŧäēŽ \`fix\`īŧŒäŊ†åރåĒæ¨Ąæ‹Ÿæĸ复īŧŒ**不äŧš**寚é˜ĩ列 写å…ĨäģģäŊ•更攚。 .PP æ­¤å‘Ŋäģ¤ä¸ģčρᔍäēŽæ‰‹åЍénj蝁īŧŒ 例åĻ‚åœ¨æĸ复čŋ‡į¨‹äš‹åŽæˆ–在å…ļäģ–į‰šæŽŠæĄäģļ下。 寚äēŽåŽšæœŸå’ŒčŽĄåˆ’įš„æŖ€æŸĨīŧŒč¯ˇäŊŋᔍ \`scrub\`。 .PP åĻ‚æžœæ‚¨äŊŋᔍ \-a, \-\-audit\-only 选项īŧŒåˆ™äģ…æŖ€æŸĨ文äģļ æ•°æŽæ•Ŗåˆ—īŧŒč€ŒåŋŊį•ĨåĨ‡åļæ ĄéĒŒæ•°æŽīŧŒäģĨ加åŋĢčŋčĄŒé€ŸåēĻ。 .PP 文äģļäģ…通čŋ‡čˇ¯åž„蝆åˆĢīŧŒč€Œä¸é€ščŋ‡ inode 蝆åˆĢ。 .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS list 列å‡ē上æŦĄ \`sync\` æ—ļé˜ĩ列中包åĢįš„æ‰€æœ‰æ–‡äģļ。 .PP äŊŋᔍ \-v 或 \-\-verboseīŧŒčŋ˜äŧšæ˜žį¤ēäēšį§’įē§æ—ļ间。 .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS dup 列å‡ē所有重复文äģļ。åĻ‚æžœä¸¤ä¸Ē文äģļįš„æ•Ŗåˆ—åŒšé…īŧŒåˆ™čޤä¸ē厃äģŦį›¸į­‰ã€‚ 不č¯ģ取文äģļæ•°æŽīŧ›äģ…äŊŋᔍéĸ„å…ˆčŽĄįŽ—įš„æ•Ŗåˆ—ã€‚ .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS pool 在 \`pooling\` į›ŽåŊ•中创åģ翈–æ›´æ–°įŖį›˜é˜ĩ列中所有文äģļ įš„č™šæ‹Ÿč§†å›žã€‚ .PP 文äģļ不äŧščĸĢ复åˆļīŧŒč€Œæ˜¯äŊŋᔍįŦĻåˇé“žæŽĨčŋžæŽĨ。 .PP 更新æ—ļīŧŒæ‰€æœ‰įŽ°æœ‰įš„įŦĻåˇé“žæŽĨ和įŠē å­į›ŽåŊ•éƒŊäŧščĸĢ删除īŧŒåšļæ›ŋæĸä¸ēé˜ĩåˆ—įš„æ–°č§†å›žã€‚ äģģäŊ•å…ļäģ–å¸¸č§„æ–‡äģļäŋį•™åœ¨åŽŸäŊã€‚ .PP 不äŧšäŋŽæ”š pool į›ŽåŊ•äš‹å¤–įš„äģģäŊ•内厚。 .SS devices 打印é˜ĩ列äŊŋį”¨įš„äŊŽįē§čŽžå¤‡ã€‚ .PP æ­¤å‘Ŋä줿˜žį¤ēé˜ĩåˆ—ä¸­įš„čŽžå¤‡å…ŗč”īŧŒä¸ģčρᔍäŊœč„šæœŦæŽĨåŖã€‚ .PP 前两列是äŊŽįē§čŽžå¤‡ ID å’Œčˇ¯åž„ã€‚ æŽĨ下æĨįš„ä¸¤åˆ—æ˜¯é̘įē§čŽžå¤‡ ID å’Œčˇ¯åž„ã€‚ 最后一列是é˜ĩåˆ—ä¸­įš„įŖį›˜åį§°ã€‚ .PP 在大多数情å†ĩ下īŧŒé˜ĩåˆ—ä¸­įš„æ¯ä¸ĒįŖį›˜éƒŊ有一ä¸ĒäŊŽįē§čŽžå¤‡īŧŒ äŊ†åœ¨ä¸€ä盿›´å¤æ‚įš„é…įŊŽä¸­īŧŒå•ä¸Ēé˜ĩåˆ—įŖį›˜å¯čƒŊäŧšäŊŋį”¨å¤šä¸Ē äŊŽįē§čŽžå¤‡ã€‚ .PP 不äŧšäŋŽæ”šäģģäŊ•内厚。 .SS touch ä¸ē所有äēšį§’įē§æ—ļé—´æˆŗčŽžįŊŽä¸ēé›ļįš„æ–‡äģļ莞įŊŽä¸€ä¸Ēäģģæ„įš„ äēšį§’įē§æ—ļé—´æˆŗã€‚ .PP čŋ™æé̘äē† SnapRAID 蝆åˆĢį§ģ动和复åˆļ文äģļįš„čƒŊ力īŧŒ 因ä¸ē厃äŊŋæ—ļé—´æˆŗå‡ äšŽį‹Ŧ一无äēŒīŧŒå‡å°‘äē†å¯čƒŊįš„é‡å¤ã€‚ .PP æ›´å…ˇäŊ“åœ°č¯´īŧŒåĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ä¸ēé›ļīŧŒ 则į§ģ动或复åˆļįš„æ–‡äģļåœ¨åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗåŒšé…æ—ļčĸĢ蝆åˆĢä¸ē æ­¤įąģ。åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™äģ…åŊ“åŽŒæ•´čˇ¯åž„ã€ 大小和æ—ļé—´æˆŗéƒŊ匚配æ—ļ才čĸĢ视ä¸ē副æœŦ。 .PP 不äŧšäŋŽæ”šį§’į˛žåēĻæ—ļé—´æˆŗīŧŒ 因此äŧšäŋį•™æ–‡äģļįš„æ‰€æœ‰æ—Ĩ期和æ—ļ间。 .SS rehash 厉排寚整ä¸Ēé˜ĩ列čŋ›čĄŒé‡æ–°æ•Ŗåˆ—。 .PP æ­¤å‘Ŋä줿›´æ”šäŊŋį”¨įš„æ•Ŗåˆ—įąģ型īŧŒé€šå¸¸æ˜¯åœ¨äģŽ 32 äŊįŗģįģŸå‡įē§åˆ° 64 äŊįŗģį쟿—ļīŧŒ äģĨäģŽ MurmurHash3 切æĸ到更åŋĢįš„ SpookyHash。 .PP åĻ‚æžœæ‚¨åˇ˛įģåœ¨äŊŋį”¨æœ€äŊŗæ•Ŗåˆ—īŧŒåˆ™æ­¤å‘Ŋäģ¤ä¸æ‰§čĄŒäģģäŊ•操äŊœīŧŒ åšļ通įŸĨæ‚¨æ— éœ€æ‰§čĄŒäģģäŊ•操äŊœã€‚ .PP é‡æ–°æ•Ŗåˆ—ä¸äŧšįĢ‹åŗæ‰§čĄŒīŧŒč€Œæ˜¯åœ¨ \`sync\` 和 \`scrub\` 期间 逐æ­Ĩčŋ›čĄŒã€‚ .PP 您可äģĨäŊŋᔍ \`status\` æŖ€æŸĨé‡æ–°æ•Ŗåˆ—įŠļ态。 .PP åœ¨é‡æ–°æ•Ŗåˆ—æœŸé—´īŧŒSnapRAID äŋæŒåŽŒå…¨åŠŸčƒŊīŧŒ å”¯ä¸€įš„äž‹å¤–æ˜¯ \`dup\` æ— æŗ•äŊŋį”¨ä¸åŒįš„æ•Ŗåˆ—æŖ€æĩ‹é‡å¤įš„æ–‡äģļ。 .SS locate æŸĨæ‰žå­˜å‚¨åœ¨æ ĄéĒŒį›˜ä¸­įš„æ–‡äģļ。寚äēŽæ¯ä¸ĒåŒšé…įš„æ–‡äģļīŧŒåރäŧšæ‰“å°å…ļåœ¨æ ĄéĒŒæ–‡äģļä¸­įš„äŊįŊŽ äģĨåŠå į”¨įš„åˆ†į‰‡æ•°é‡ã€‚ .PP 您可äģĨäŊŋᔍ \-t, \-\-tail é€‰éĄšå°†æ“äŊœé™åˆļåœ¨å į”¨æ ĄéĒŒį›˜æŒ‡åŽšå°žéƒ¨éƒ¨åˆ†įš„ 文äģļ上。 .PP åĻ‚æžœæ‚¨æƒŗé‡æ–°åˆ†é…čŋ™ä盿–‡äģļīŧŒå¯äģĨäŊŋᔍ \-W, \-\-force\-realloc\-tail é€‰éĄšã€‚ č¯ˇæŗ¨æ„īŧŒåœ¨é‡æ–°åˆ†é…čŋ‡į¨‹ä¸­īŧŒæ­¤įąģ文äģļå°†ä¸å—æ ĄénjäŋæŠ¤ã€‚ .SH OPTIONS SnapRAID 提䞛äģĨ下选项īŧš .TP .B \-c, \-\-conf CONFIG 选拊čρäŊŋį”¨įš„é…įŊŽæ–‡äģļ。åĻ‚æžœæœĒ指厚īŧŒåœ¨ Unix 中īŧŒ åĻ‚æžœå­˜åœ¨īŧŒåˆ™äŊŋį”¨æ–‡äģļ \`/usr/local/etc/snapraid.conf\`īŧŒ åĻ则äŊŋᔍ \`/etc/snapraid.conf\`。 在 Windows 中īŧŒåރäŊŋį”¨ä¸Ž \`snapraid.exe\` į›¸åŒįš„į›ŽåŊ•ä¸­įš„æ–‡äģļ \`snapraid.conf\`。 .TP .B \-f, \-\-filter PATTERN čŋ‡æģ¤čρ圍 \`check\` 和 \`fix\` ä¸­å¤„į†įš„æ–‡äģļ。 äģ…å¤„į†ä¸ŽæŒ‡åŽšæ¨ĄåŧåŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ æœ‰å…ŗæ¨Ąåŧč§„čŒƒįš„æ›´å¤šč¯Ļįģ†äŋĄæ¯īŧŒč¯ˇå‚阅 PATTERN 部分。 在 Unix 中īŧŒåĻ‚æžœäŊŋᔍ globbing 字įŦĻīŧŒč¯ˇįĄŽäŋåރäģŦčĸĢåŧ•į”¨ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`check\` 和 \`fix\` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 \`sync\` 和 \`scrub\` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 .TP .B \-d, \-\-filter\-disk NAME čŋ‡æģ¤čρ圍 \`check\`、\`fix\`、\`up\` 和 \`down\` ä¸­å¤„į†įš„įŖį›˜ã€‚ 您åŋ…éĄģ指厚配įŊŽæ–‡äģļä¸­åŽšäš‰įš„įŖį›˜åį§°ã€‚ 您䚟可äģĨ指厚åĨ‡åļæ ĄéĒŒįŖį›˜įš„åį§°īŧš\`parity\`、\`2\-parity\`、 \`3\-parity\` į­‰īŧŒäģĨ将操äŊœé™åˆļåˆ°į‰šåŽšįš„åĨ‡åļæ ĄéĒŒįŖį›˜ã€‚ åĻ‚æžœæ‚¨įģ„合äŊŋį”¨å¤šä¸Ē \-\-filter、\-\-filter\-disk 和 \-\-filter\-missing 选项īŧŒ 则äģ…选拊与所有čŋ‡æģ¤å™¨åŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`check\`、\`fix\`、\`up\` 和 \`down\` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 \`sync\` 和 \`scrub\` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 .TP .B \-m, \-\-filter\-missing čŋ‡æģ¤čρ圍 \`check\` 和 \`fix\` ä¸­å¤„į†įš„æ–‡äģļ。 äģ…处ᐆé˜ĩ列中ä¸ĸå¤ąæˆ–åˇ˛åˆ é™¤įš„æ–‡äģļ。 与 \`fix\` 一čĩˇäŊŋᔍæ—ļīŧŒæ­¤é€‰éĄšå……åŊ“ \`undelete\` å‘Ŋäģ¤ã€‚ åĻ‚æžœæ‚¨įģ„合äŊŋį”¨å¤šä¸Ē \-\-filter、\-\-filter\-disk 和 \-\-filter\-missing 选项īŧŒ 则äģ…选拊与所有čŋ‡æģ¤å™¨åŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšåĒčƒŊ与 \`check\` 和 \`fix\` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 \`sync\` 和 \`scrub\` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 .TP .B \-e, \-\-filter\-error 处ᐆ \`check\` 和 \`fix\` ä¸­æœ‰é”™č¯¯įš„æ–‡äģļ。 厃äģ…å¤„į†åœ¨ \`sync\` 和 \`scrub\` 期间块čĸĢæ ‡čްä¸ē静é옿ˆ–čž“å…Ĩ/输å‡ēé”™č¯¯įš„ 文äģļīŧŒåĻ‚ \`status\` 中所列。 æ­¤é€‰éĄšåĒčƒŊ与 \`check\` 和 \`fix\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-p, \-\-plan PERC|bad|new|full 选拊 scrub čŽĄåˆ’ã€‚åĻ‚æžœ PERC 是一ä¸Ēäģ‹äēŽ 0 到 100 äš‹é—´įš„æ•°å€ŧīŧŒ 则将å…ļč§Ŗé‡Šä¸ēčρ scrub įš„å—įš„į™žåˆ†æ¯”ã€‚ 除äē†į™žåˆ†æ¯”īŧŒæ‚¨čŋ˜å¯äģĨ指厚一ä¸ĒčŽĄåˆ’īŧš \`bad\` scrub 坏块īŧŒ\`new\` scrub 尚æœĒ scrub įš„å—īŧŒ \`full\` scrub 所有内厚。 æ­¤é€‰éĄšåĒčƒŊ与 \`scrub\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-o, \-\-older\-than DAYS 选拊čρ圍 \`scrub\` ä¸­å¤„į†įš„é˜ĩåˆ—įš„æœ€æ—§éƒ¨åˆ†ã€‚ DAYS 是块čĸĢ scrub įš„æœ€å°å¤Šæ•°īŧ›éģ˜čޤå€ŧä¸ē 10。 无čŽēæ­¤é€‰éĄšåĻ‚äŊ•īŧŒæ ‡čްä¸ēåå—įš„å—å§‹įģˆäŧščĸĢ scrub。 æ­¤é€‰éĄšåĒčƒŊ与 \`scrub\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-a, \-\-audit\-only 在 \`check\` 中īŧŒéĒŒč¯æ–‡äģļįš„æ•Ŗåˆ—č€Œä¸ æŖ€æŸĨåĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åĻ‚æžœæ‚¨åĒå¯šæŖ€æŸĨ文äģļæ•°æŽæ„Ÿå…´čļŖīŧŒæ­¤é€‰éĄšå¯äģĨæ˜žč‘—åŠ åŋĢ æŖ€æŸĨčŋ‡į¨‹ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`check\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-h, \-\-pre\-hash 在 \`sync\` 中īŧŒčŋčĄŒæ‰€æœ‰æ–°æ•°æŽįš„初æ­Ĩæ•Ŗåˆ—é˜ļæŽĩīŧŒ äģĨäžŋ在åĨ‡åļæ ĄéĒŒčŽĄįŽ—äš‹å‰čŋ›čĄŒéĸå¤–éĒŒč¯ã€‚ 通常īŧŒåœ¨ \`sync\` 中īŧŒä¸čŋ›čĄŒåˆæ­Ĩæ•Ŗåˆ—īŧŒåšļ且新 数捎äģ…在éĻ–æŦĄč¯ģ取čŋ›čĄŒåĨ‡åļæ ĄéĒŒčŽĄįŽ—äš‹å‰æ•Ŗåˆ—ã€‚ æ­¤čŋ‡į¨‹åœ¨įŗģįģŸå¤„äēŽ é‡č´ŸčŊŊä¸‹å‘į”ŸīŧŒæ‰€æœ‰įŖį›˜éƒŊ在čŊŦ动īŧŒCPU 䚟垈åŋ™ã€‚ čŋ™å¯šæœē器æĨč¯´æ˜¯ä¸€į§æžįĢ¯æƒ…å†ĩīŧŒåĻ‚æžœåŽƒæœ‰æŊœåœ¨įš„įĄŦäģļ问éĸ˜īŧŒ 静éģ˜é”™č¯¯å¯čƒŊæ— æŗ•čĸĢæŖ€æĩ‹åˆ°īŧŒå› ä¸ē数捎尚æœĒæ•Ŗåˆ—ã€‚ ä¸ēéŋå…æ­¤éŖŽé™ŠīŧŒæ‚¨å¯äģĨ吝ᔍ \`pre\-hash\` æ¨ĄåŧīŧŒå°† 所有数捎č¯ģ取两æŦĄäģĨįĄŽäŋå…ļ厌整性。 æ­¤é€‰éĄščŋ˜äŧšénj蝁é˜ĩ列内į§ģåŠ¨įš„æ–‡äģļīŧŒ äģĨįĄŽäŋį§ģ动操äŊœæˆåŠŸīŧŒåšļ在åŋ…čρæ—ļ å…čŽ¸æ‚¨åœ¨įģ§įģ­äš‹å‰čŋčĄŒ fix 操äŊœã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`sync\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-i, \-\-import DIR äģŽæŒ‡åŽšį›ŽåŊ•å¯ŧå…Ĩč‡Ē上æŦĄ \`sync\` äģĨæĨäģŽé˜ĩåˆ—ä¸­åˆ é™¤įš„äģģäŊ•æ–‡äģļ。 åĻ‚æžœæ‚¨äģį„ļæ‹Ĩ有此įąģ文äģļīŧŒåރäģŦå¯į”¨äēŽ \`check\` 和 \`fix\` äģĨ攚čŋ›æĸ复čŋ‡į¨‹ã€‚ č¯ģ取文äģļīŧŒåŒ…æ‹Ŧåœ¨å­į›ŽåŊ•中īŧŒåšļ且无čŽēå…ļåį§°åĻ‚äŊ•éƒŊäŧščĸĢ蝆åˆĢ。 æ­¤é€‰éĄšåĒčƒŊ与 \`check\` 和 \`fix\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-s, \-\-spin\-down\-on\-error 在äģģäŊ•é”™č¯¯å‘į”Ÿæ—ļīŧŒåœ¨é€€å‡ēåšļå¸Ļ有非é›ļįŠļæ€į äš‹å‰īŧŒ å°†æ‰€æœ‰æ‰˜įŽĄįš„įŖį›˜åœčŊŦ。čŋ™å¯äģĨ防æ­ĸéŠąåŠ¨å™¨åœ¨ä¸­æ­ĸ操äŊœåŽ äŋæŒæ´ģ动和čŊŦ动īŧŒæœ‰åŠŠäēŽéŋ免不åŋ…čĻįš„įƒ­é‡į§¯čšå’ŒåŠŸč€—ã€‚ äŊŋį”¨æ­¤é€‰éĄšå¯įĄŽäŋåŗäŊŋå‘Ŋäģ¤å¤ąč´ĨīŧŒįŖį›˜äšŸčƒŊ厉全停æ­ĸ。 .TP .B \-w, \-\-bw\-limit RATE å¯šæ‰€æœ‰įŖį›˜åē”į”¨å…¨åą€å¸ĻåŽŊ限åˆļ。RATE 是 æ¯į§’įš„å­—čŠ‚æ•°ã€‚æ‚¨å¯äģĨ指厚䚘数īŧŒäž‹åĻ‚ K、M 或 G īŧˆäž‹åĻ‚īŧŒ\-\-bw\-limit 1Gīŧ‰ã€‚ .TP .B \-t, \-\-tail 大小 将文äģļåˆ—čĄ¨é™åˆļä¸ē邪äē›äŊŋį”¨æ ĄéĒŒį›˜æŒ‡åŽšå°žéƒ¨å¤§å°äģĨå†…įš„æ–‡äģļ。 您可äģĨäŊŋį”¨äš˜æ•°īŧŒåĻ‚ K、M、G 或 Tīŧˆäž‹åĻ‚ \-\-tail 1Gīŧ‰ã€‚ æ­¤é€‰éĄšäģ…在与 \`locate\` å‘Ŋäģ¤é…åˆäŊŋᔍæ—ļ有效。 .TP .B \-A, \-\-stats å¯į”¨æ‰Šåą•įŠļæ€č§†å›žīŧŒæ˜žį¤ē附加äŋĄæ¯ã€‚ åąåš•æ˜žį¤ē两ä¸Ēå›žčĄ¨īŧš įŦŦ一ä¸Ēå›žčĄ¨æ˜žį¤ē每ä¸ĒįŖį›˜įš„įŧ“å†˛æĄå¸Ļ数īŧŒäģĨ及 åŊ“å‰æ­Ŗåœ¨č¯ĨįŖį›˜ä¸ŠčŽŋé—Žįš„æ–‡äģļįš„æ–‡äģļčˇ¯åž„ã€‚ 通常īŧŒæœ€æ…ĸįš„įŖį›˜å°†æ˛Ąæœ‰å¯į”¨įŧ“冞åŒēīŧŒ čŋ™å†ŗåޚäē†å¯čžžåˆ°įš„æœ€å¤§å¸ĻåŽŊ。 įŦŦäēŒä¸Ēå›žčĄ¨æ˜žį¤ē在čŋ‡åŽģ 100 į§’å†…į­‰åž…æ‰€čŠąč´šįš„æ—ļé—´į™žåˆ†æ¯”ã€‚ éĸ„čŽĄæœ€æ…ĸįš„įŖį›˜äŧšå¯ŧč‡´å¤§éƒ¨åˆ†į­‰åž…æ—ļ间īŧŒ 而å…ļäģ–įŖį›˜åē”č¯ĨåĒæœ‰åžˆå°‘æˆ–æ˛Ąæœ‰į­‰åž…æ—ļ间īŧŒ 因ä¸ē厃äģŦ可äģĨäŊŋᔍįŧ“å†˛æĄå¸Ļ。 æ­¤å›žčĄ¨čŋ˜æ˜žį¤ēäē†į­‰åž…æ•Ŗåˆ—čŽĄįŽ—å’Œ RAID čŽĄįŽ—æ‰€čŠąč´šįš„æ—ļ间。 æ‰€æœ‰čŽĄįŽ—éƒŊä¸ŽįŖį›˜æ“äŊœåšļ行čŋčĄŒã€‚ 因此īŧŒåĒčρ臺少䏀ä¸ĒįŖį›˜æœ‰å¯æĩ‹é‡įš„į­‰åž…æ—ļ间īŧŒ å°ąčĄ¨æ˜Ž CPU čļŗå¤ŸåŋĢīŧŒčƒŊ够莟䏊åˇĨäŊœč´ŸčŊŊ。 .TP .B \-Z, \-\-force\-zero åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩ操äŊœīŧšåŒæ­Ĩ大小ä¸ēé›ļäŊ†äģĨ前非é›ļįš„æ–‡äģļ。 åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°čŋ™į§æƒ…å†ĩīŧŒåރäŧšåœæ­ĸčŋ›čĄŒīŧŒ é™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨčŊģæžæŖ€æĩ‹åˆ°åœ¨įŗģįģŸå´ŠæēƒåŽīŧŒ 某äē›čŽŋé—Žįš„æ–‡äģļčĸĢæˆĒæ–­įš„æƒ…å†ĩ。 čŋ™åœ¨å¸Ļ有 ext3/ext4 文äģļįŗģįģŸįš„ Linux ä¸­æ˜¯ä¸€į§å¯čƒŊįš„æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 \`sync\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-E, \-\-force\-empty åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩ操äŊœīŧšåŒæ­Ĩ所有原始文äģļä¸ĸå¤ąįš„įŖį›˜ã€‚ åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°įŖį›˜ä¸Šæœ€åˆå­˜åœ¨įš„æ‰€æœ‰æ–‡äģļéƒŊä¸ĸå¤ąæˆ–čĸĢ重写īŧŒ 厃äŧšåœæ­ĸčŋ›čĄŒīŧŒé™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨčŊģæžæŖ€æĩ‹åˆ°æ•°æŽæ–‡äģļįŗģį쟿œĒ挂čŊŊįš„æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 \`sync\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-U, \-\-force\-uuid åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩã€æŖ€æŸĨ和äŋŽå¤æ“äŊœīŧŒåŊ“įŖį›˜æ›´æ”šäē†åރäģŦįš„ UUID æ—ļ。 åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°æŸäē›įŖį›˜æ›´æ”šäē† UUIDīŧŒ 厃äŧšåœæ­ĸčŋ›čĄŒīŧŒé™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨæŖ€æĩ‹åˆ°æ‚¨įš„įŖį›˜čĸĢæŒ‚čŊŊ在 é”™č¯¯įš„æŒ‚čŊŊį‚šįš„æƒ…å†ĩ。 äŊ†æ˜¯īŧŒå…čŽ¸åœ¨å•åĨ‡åļæ ĄéĒŒä¸‹čŋ›čĄŒå•ä¸Ē UUID 更攚īŧŒ 在多åĨ‡åļæ ĄéĒŒä¸‹čŋ›čĄŒæ›´å¤šæ›´æ”šīŧŒå› ä¸ēčŋ™æ˜¯æĸ复后更æĸįŖį›˜æ—ļįš„æ­Ŗå¸¸æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 \`sync\`、\`check\` 或 \`fix\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-D, \-\-force\-device åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„äŋŽå¤æ“äŊœīŧŒåŊ“įŖį›˜æ— æŗ•čŽŋ闎或äŊäēŽåŒä¸€į‰Šį†čŽžå¤‡ä¸Šæ—ļ。 例åĻ‚īŧŒåĻ‚æžœæ‚¨ä¸ĸå¤ąäē†ä¸¤ä¸Ēæ•°æŽįŖį›˜īŧŒåšļ且有一ä¸Ēå¤‡į”¨įŖį›˜ åĒčƒŊæĸ复įŦŦ一ä¸ĒīŧŒæ‚¨å¯äģĨåŋŊį•ĨįŦŦäēŒä¸Ēæ— æŗ•čŽŋé—Žįš„įŖį›˜ã€‚ æˆ–č€…īŧŒåĻ‚æžœæ‚¨æƒŗåœ¨åˇ˛äŊŋį”¨įš„įŖį›˜ä¸Šå‰ŠäŊ™įš„å¯į”¨įŠē间中æĸ复一ä¸ĒįŖį›˜īŧŒ å…ąäēĢåŒä¸€į‰Šį†čŽžå¤‡ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`fix\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-N, \-\-force\-nocopy 在 \`sync\`、\`check\` 和 \`fix\` 中īŧŒįĻį”¨å¤åˆļæŖ€æĩ‹å¯å‘åŧã€‚ åĻ‚æžœæ˛Ąæœ‰æ­¤é€‰éĄšīŧŒSnapRAID å‡åŽšå…ˇæœ‰į›¸åŒåąžæ€§īŧˆäž‹åĻ‚åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗīŧ‰ įš„æ–‡äģ￘¯å…ˇæœ‰į›¸åŒæ•°æŽįš„副æœŦ。 čŋ™å…čޏ蝆åˆĢäģŽä¸€ä¸ĒįŖį›˜į§ģ动到åĻ一ä¸ĒįŖį›˜įš„å¤åˆļ或į§ģåŠ¨įš„æ–‡äģļīŧŒ åšļé‡į”¨åˇ˛čŽĄįŽ—įš„æ•Ŗåˆ—äŋĄæ¯äģĨæŖ€æĩ‹é™éģ˜é”™č¯¯æˆ–æĸ复ä¸ĸå¤ąįš„æ–‡äģļ。 在某äē›įŊ•č§įš„æƒ…å†ĩ下īŧŒæ­¤čĄŒä¸ē可čƒŊå¯ŧ致蝝æŠĨ æˆ–į”ąäēŽčŽ¸å¤šæ•Ŗåˆ—éĒŒč¯č€Œå¯ŧ致čŋ‡į¨‹įŧ“æ…ĸīŧŒæ­¤é€‰éĄšå…čŽ¸æ‚¨č§Ŗå†ŗæ­¤įąģ问éĸ˜ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`sync\`、\`check\` 和 \`fix\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-F, \-\-force\-full 在 \`sync\` 中īŧŒåŧēåˆļåŽŒå…¨é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ åŊ“您æˇģåŠ æ–°įš„åĨ‡åļæ Ąénjįē§åˆĢ或åĻ‚æžœäŊŋį”¨čžƒæ–°įš„åĨ‡åļæ ĄéĒŒæ•°æŽæĸå¤åˆ°æ—§įš„å†…åŽšæ–‡äģļæ—ļīŧŒ 可äģĨäŊŋį”¨æ­¤é€‰éĄšã€‚ čŋ™å…čŽ¸æ‚¨é‡į”¨å†…åŽšæ–‡äģļä¸­å­˜åœ¨įš„æ•Ŗåˆ—æĨéĒŒč¯æ•°æŽīŧŒ åšļäŊŋį”¨įŽ°æœ‰åĨ‡åļæ ĄéĒŒæ•°æŽåœ¨ \`sync\` čŋ‡į¨‹ä¸­äŋæŒæ•°æŽäŋæŠ¤īŧŒ č€Œä¸æ˜¯äģŽå¤´åŧ€å§‹é‡æ–°åˆ›åģēåĨ‡åļæ ĄéĒŒã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`sync\` 一čĩˇäŊŋį”¨ã€‚ .TP .B \-R, \-\-force\-realloc 在 \`sync\` 中īŧŒåŧēåˆļ厌全重新分配文äģļåšļ重åģēåĨ‡åļæ ĄéĒŒã€‚ æ­¤é€‰éĄšå¯į”¨äēŽåŽŒå…¨é‡æ–°åˆ†é…æ‰€æœ‰æ–‡äģļīŧŒ æļˆé™¤įĸŽį‰‡īŧŒåŒæ—ļé‡į”¨å†…åŽšæ–‡äģļä¸­å­˜åœ¨įš„æ•Ŗåˆ—æĨéĒŒč¯æ•°æŽã€‚ æ­¤é€‰éĄšåĒčƒŊ与 \`sync\` 一čĩˇäŊŋį”¨ã€‚ **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čρäŊŋį”¨åŽƒã€‚ 在 \`sync\` 操äŊœæœŸé—´īŧŒæ‚¨**æ˛Ąæœ‰**数捎äŋæŠ¤ã€‚ .TP .B \-W, \-\-force\-realloc\-tail 大小 åˇĨäŊœæ–šåŧįąģäŧŧäēŽ \-R, \-\-force\-reallocīŧŒäŊ†äģ…限äēŽæ¯ä¸Ēæ ĄéĒŒæ–‡äģļįš„ 指厚尞部部分īŧˆæœ€åŽâ€œå¤§å°â€å­—节īŧ‰ã€‚ 厃äŧšåŧēåˆļ重新分配īŧˆį§ģ动īŧ‰åŊ“前存储在č¯Ĩå°žéƒ¨éƒ¨åˆ†įš„äģģäŊ•æ–‡äģļåˆ†į‰‡/块īŧŒ å…čŽ¸åŽƒäģŦčĸĢæ”žįŊŽåœ¨æ ĄéĒŒæ–‡äģļ中äģģäŊ•æœ‰å¯į”¨įŠēé—´įš„åœ°æ–šīŧˆåŒ…æ‹ŦįŽ°æœ‰įš„ įŠē隙īŧ‰ã€‚ æ­¤é€‰éĄšįš„ä¸ģčĻį›Žįš„æ˜¯įŧŠå°æ ĄéĒŒæ–‡äģļįš„įŖį›˜å į”¨å¤§å°ã€‚ åĻ‚æžœé‡æ–°åˆ†é…æˆåŠŸæ¸…įŠēä熿•´ä¸Ē尞部åŒē域īŧˆæ˛Ąæœ‰å—įģ§įģ­äŊŋį”¨åŽƒīŧ‰īŧŒ åˆ™æ ĄéĒŒæ–‡äģļ将čĸĢæˆĒ断īŧŒå›žæ”ļæœĒäŊŋį”¨įš„å°žéƒ¨įŠē间。 您可äģĨäŊŋį”¨äš˜æ•°īŧŒåĻ‚ K、M、G 或 Tīŧˆäž‹åĻ‚ \-\-force\-realloc\-tail 1Gīŧ‰ã€‚ 您可äģĨäŊŋᔍ locate \-t, \-\-tail 提前äē†č§Ŗå—åŊąå“įš„æ–‡äģļ。 č­Ļ告īŧ æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čρäŊŋį”¨ã€‚ åœ¨æ‰§čĄŒ \`sync\` 操äŊœæœŸé—´īŧŒå—åŊąå“įš„æ–‡äģļå°†æ˛Ąæœ‰æ•°æŽäŋæŠ¤ã€‚ .TP .B \-l, \-\-log FILE 将č¯Ļį솿—Ĩåŋ—写å…Ĩ指厚文äģļ。 åĻ‚æžœæœĒæŒ‡åŽšæ­¤é€‰éĄšīŧŒåˆ™äŧšå°†æ„å¤–é”™č¯¯æ‰“å°åˆ°åąåš•īŧŒ 在å‡ēįŽ°čŽ¸å¤šé”™č¯¯įš„æƒ…å†ĩ下īŧŒå¯čƒŊå¯ŧ致输å‡ēčŋ‡å¤šã€‚ 指厚 \-l, \-\-log æ—ļīŧŒäģ…å°†å¯ŧ致 SnapRAID 停æ­ĸįš„**致å‘Ŋ错蝝**打印到 åąåš•ã€‚ åĻ‚æžœčˇ¯åž„äģĨ \`>>\` åŧ€å¤´īŧŒåˆ™æ–‡äģļäģĨčŋŊåŠ æ¨Ąåŧæ‰“åŧ€ã€‚ åį§°ä¸­įš„ \`%D\` 和 \`%T\` å‡ēįŽ°äŧščĸĢæ›ŋæĸä¸ēæ—Ĩ期和æ—ļ间īŧŒæ ŧåŧåˆ†åˆĢä¸ē YYYYMMDD 和 HHMMSS。在 Windows æ‰šå¤„į†æ–‡äģļ中īŧŒæ‚¨åŋ…éĄģ双写 \`%\` 字įŦĻīŧŒ 例åĻ‚ result\-%%D.log。čρäŊŋᔍ \`>>\`īŧŒæ‚¨åŋ…éĄģå°†åį§°æ‹Ŧ在åŧ•åˇä¸­īŧŒ 例åĻ‚ \`\[dq]>>result.log\[dq]\`。 čρ将æ—Ĩåŋ—čž“å‡ēåˆ°æ ‡å‡†čž“å‡ēæˆ–æ ‡å‡†é”™č¯¯īŧŒ 您可äģĨäŊŋᔍ \`\[dq]>&1\[dq]\` 和 \`\[dq]>&2\[dq]\`。 æœ‰å…ŗæ—Ĩåŋ—æ ‡į­žæčŋ°īŧŒč¯ˇå‚阅 snapraid_log.txt 文äģ￈– man éĄĩéĸ。 .TP .B \-L, \-\-error\-limit NUMBER 莞įŊŽåœæ­ĸæ‰§čĄŒå‰įš„æ–°é”™č¯¯é™åˆļ。 éģ˜čŽ¤æƒ…å†ĩ下īŧŒåĻ‚æžœ SnapRAID 遇到čļ…čŋ‡ 100 ä¸Ē 输å…Ĩ/输å‡ē错蝝īŧŒåރäŧšåœæ­ĸīŧŒčĄ¨æ˜ŽįŖį›˜å¯čƒŊæ­Ŗåœ¨å‘į”Ÿæ•…éšœã€‚ æ­¤é€‰éĄšåŊąå“ \`sync\` 和 \`scrub\`īŧŒåރäģŦčĸĢå…čŽ¸åœ¨įŦŦ一įģ„ įŖį›˜é”™č¯¯åŽįģ§įģ­īŧŒäģĨå°č¯•åŽŒæˆå…ļ操äŊœã€‚ äŊ†æ˜¯īŧŒ\`check\` 和 \`fix\` æ€ģ是äŧšåœ¨įŦŦ一æŦĄé”™č¯¯æ—ļ停æ­ĸ。 .TP .B \-S, \-\-start BLKSTART äģŽæŒ‡åŽšįš„å—åˇåŧ€å§‹å¤„į†ã€‚ åœ¨įŖį›˜æŸåįš„æƒ…å†ĩ下īŧŒčŋ™å¯šäēŽé‡č¯•æŖ€æŸĨ或äŋŽå¤į‰šåŽšå—å¯čƒŊåžˆæœ‰į”¨ã€‚ æ­¤é€‰éĄšä¸ģčρᔍäēŽé̘įē§æ‰‹åЍæĸ复。 .TP .B \-B, \-\-count BLKCOUNT äģ…å¤„į†æŒ‡åŽšæ•°é‡įš„å—ã€‚ æ­¤é€‰éĄšä¸ģčρᔍäēŽé̘įē§æ‰‹åЍæĸ复。 .TP .B \-C, \-\-gen\-conf CONTENT äģŽįŽ°æœ‰å†…åŽšæ–‡äģļį”Ÿæˆä¸€ä¸Ēč™šæ‹Ÿé…įŊŽæ–‡äģļ。 配įŊŽæ–‡äģļ写å…Ĩæ ‡å‡†čž“å‡ēīŧŒä¸äŧščĻ†į›–įŽ°æœ‰æ–‡äģļ。 此配įŊŽæ–‡äģļčŋ˜åŒ…åĢ在您ä¸ĸå¤ąæ•´ä¸ĒįŗģįģŸįš„æƒ…å†ĩ下 重åģēįŖį›˜æŒ‚čŊŊį‚šæ‰€éœ€įš„äŋĄæ¯ã€‚ .TP .B \-v, \-\-verbose å‘åąåš•æ‰“å°æ›´å¤šäŋĄæ¯ã€‚ åĻ‚æžœæŒ‡åŽšä¸€æŦĄīŧŒåރäŧšæ‰“å°æŽ’é™¤įš„æ–‡äģļ 和附加įģŸčŽĄäŋĄæ¯ã€‚ æ­¤é€‰éĄšå¯šæ—Ĩåŋ—æ–‡äģ￞Ąæœ‰åŊąå“ã€‚ .TP .B \-q, \-\-quiet å‘åąåš•æ‰“å°æ›´å°‘äŋĄæ¯ã€‚ åĻ‚æžœæŒ‡åŽšä¸€æŦĄīŧŒåރäŧšåˆ é™¤čŋ›åēĻæĄīŧ›ä¸¤æŦĄīŧŒ æ­Ŗåœ¨čŋčĄŒįš„æ“äŊœīŧ›ä¸‰æŦĄīŧŒäŋĄæ¯ æļˆæ¯īŧ›å››æŦĄīŧŒįŠļ态æļˆæ¯ã€‚ 致å‘Ŋ错蝝始įģˆäŧšæ‰“å°åˆ°åąåš•ã€‚ æ­¤é€‰éĄšå¯šæ—Ĩåŋ—æ–‡äģ￞Ąæœ‰åŊąå“ã€‚ .TP .B \-H, \-\-help æ‰“å°įŽ€įŸ­įš„å¸ŽåŠŠåąåš•ã€‚ .TP .B \-V, \-\-version æ‰“å°į¨‹åēį‰ˆæœŦ。 .SH CONFIGURATION SnapRAID 需čρ䏀ä¸Ē配įŊŽæ–‡äģļæĨäē†č§Ŗæ‚¨įš„įŖį›˜é˜ĩ列 äŊäēŽäŊ•处äģĨ及在å“Ē里存储åĨ‡åļæ ĄénjäŋĄæ¯ã€‚ .PP 在 Unix 中īŧŒåĻ‚æžœå­˜åœ¨īŧŒåރäŊŋį”¨æ–‡äģļ \`/usr/local/etc/snapraid.conf\`īŧŒ åĻ则äŊŋᔍ \`/etc/snapraid.conf\`。 在 Windows 中īŧŒåރäŊŋį”¨ä¸Ž \`snapraid.exe\` į›¸åŒįš„į›ŽåŊ•ä¸­įš„æ–‡äģļ \`snapraid.conf\`。 .PP 厃åŋ…éĄģ包åĢäģĨ下选项īŧˆåŒē分大小写īŧ‰īŧš .SS parity FILE [,FILE] ... åŽšäš‰į”¨äēŽå­˜å‚¨åĨ‡åļæ ĄénjäŋĄæ¯įš„æ–‡äģļ。 åĨ‡åļæ ĄéĒŒå¯åŽžįŽ°é’ˆå¯šå•ä¸ĒįŖį›˜ æ•…éšœįš„äŋæŠ¤īŧŒįąģäŧŧäēŽ RAID5。 .PP 您可äģĨ指厚多ä¸Ē文äģļīŧŒåރäģŦåŋ…éĄģäŊäēŽä¸åŒįš„įŖį›˜ä¸Šã€‚ åŊ“一ä¸Ē文äģļ不čƒŊ再åĸžé•ŋæ—ļīŧŒäŊŋᔍ䏋䏀ä¸Ē文äģļ。 æ€ģå¯į”¨įŠē间åŋ…éĄģč‡ŗå°‘ä¸Žé˜ĩåˆ—ä¸­æœ€å¤§įš„æ•°æŽįŖį›˜ä¸€æ ˇå¤§ã€‚ .PP 您可äģĨį¨åŽæˇģ加éĸå¤–įš„åĨ‡åļæ ĄéĒŒæ–‡äģļīŧŒäŊ†æ˜¯æ‚¨ 不čƒŊ重新排åēæˆ–删除åރäģŦ。 .PP 将åĨ‡åļæ ĄéĒŒįŖį›˜äŋį•™į”¨äēŽåĨ‡åļæ ĄéĒŒå¯įĄŽäŋåރäģŦ不äŧšįĸŽį‰‡åŒ–īŧŒäģŽč€ŒæéĢ˜æ€§čƒŊ。 .PP 在 Windows 中īŧŒæ¯ä¸ĒįŖį›˜äŧšį•™ä¸‹ 256 MB æœĒäŊŋᔍįŠē间īŧŒäģĨéŋ免 æœ‰å…ŗįŖį›˜åˇ˛æģĄįš„č­Ļ告。 .PP æ­¤é€‰éĄšæ˜¯åŧēåˆļæ€§įš„īŧŒåšļ且åĒčƒŊäŊŋᔍ䏀æŦĄã€‚ .SS (2,3,4,5,6)\-parity FILE [,FILE] ... åŽšäš‰į”¨äēŽå­˜å‚¨éĸå¤–åĨ‡åļæ ĄénjäŋĄæ¯įš„æ–‡äģļ。 .PP ä¸ēæŒ‡åŽšįš„æ¯ä¸ĒåĨ‡åļæ Ąénjįē§åˆĢ吝ᔍ䏀ä¸Ēéĸå¤–įš„äŋæŠ¤įē§åˆĢīŧš .PD 0 .IP \(bu 2\-parity 吝ᔍ RAID6 双åĨ‡åļæ ĄéĒŒã€‚ .IP \(bu 3\-parity 吝ᔍ䏉åĨ‡åļæ ĄéĒŒã€‚ .IP \(bu 4\-parity 吝ᔍ四åĨ‡åļæ ĄéĒŒã€‚ .IP \(bu 5\-parity 吝ᔍäē”åĨ‡åļæ ĄéĒŒã€‚ .IP \(bu 6\-parity 吝ᔍ六åĨ‡åļæ ĄéĒŒã€‚ .PD .PP 每ä¸ĒåĨ‡åļæ Ąénjįē§åˆĢéƒŊ需čĻå­˜åœ¨æ‰€æœ‰å…ˆå‰įš„åĨ‡åļæ Ąénjįē§åˆĢ。 .PP 与 \`parity\` é€‰éĄšį›¸åŒįš„æŗ¨æ„äē‹éĄšé€‚į”¨ã€‚ .PP čŋ™äē›é€‰éĄšæ˜¯å¯é€‰įš„īŧŒåšļ且åĒčƒŊäŊŋᔍ䏀æŦĄã€‚ .SS z\-parity FILE [,FILE] ... åŽšäš‰į”¨äēŽå­˜å‚¨ä¸‰åĨ‡åļæ ĄéĒŒįš„å¤‡į”¨æ–‡äģļ和æ ŧåŧã€‚ .PP æ­¤é€‰éĄšæ˜¯ \`3\-parity\` įš„æ›ŋäģŖæ–šæĄˆīŧŒä¸ģčρéĸ向不支持 SSSE3 指äģ¤é›†įš„äŊŽį̝ CPUīŧŒåĻ‚ ARM 或 AMD Phenom、Athlon 和 Opteron。 在čŋ™į§æƒ…å†ĩ下īŧŒåŽƒæäž›ä熿›´åĨŊįš„æ€§čƒŊ。 .PP æ­¤æ ŧåŧįąģäŧŧäēŽ ZFS RAIDZ3 äŊŋį”¨įš„æ ŧåŧīŧŒäŊ†æ›´åŋĢ。 与 ZFS ä¸€æ ˇīŧŒåŽƒåœ¨ä¸‰åĨ‡åļæ ĄéĒŒäš‹å¤–ä¸čĩˇäŊœį”¨ã€‚ .PP åŊ“äŊŋᔍ \`3\-parity\` æ—ļīŧŒåĻ‚æžœåģē莎äŊŋᔍ \`z\-parity\` æ ŧåŧäģĨ提éĢ˜æ€§čƒŊīŧŒ 您将æ”ļ到č­Ļ告。 .PP 可äģĨ通čŋ‡č°ƒæ•´é…įŊŽæ–‡äģļä¸­įš„æ‰€éœ€ z\-parity 或 3\-parity 文äģļīŧŒ åšļäŊŋᔍ \`fix\` 重新创åģē厃īŧŒäģŽä¸€į§æ ŧåŧčŊŦæĸä¸ēåĻä¸€į§æ ŧåŧã€‚ .SS content FILE åŽšäš‰į”¨äēŽå­˜å‚¨įŖį›˜é˜ĩ列中所有文äģļįš„åˆ—čĄ¨å’Œæ ĄéĒŒå’Œįš„æ–‡äģļ。 .PP 厃可äģĨ攞įŊŽåœ¨į”¨äēŽæ•°æŽã€åĨ‡åļæ ĄéĒŒæˆ– äģģäŊ•å…ļäģ–å¯į”¨įŖį›˜ä¸Šã€‚ åĻ‚æžœæ‚¨äŊŋį”¨æ•°æŽįŖį›˜īŧŒæ­¤æ–‡äģļäŧšč‡Ē动äģŽ \`sync\` čŋ‡į¨‹ä¸­æŽ’除。 .PP æ­¤é€‰éĄšæ˜¯åŧēåˆļæ€§įš„īŧŒåšļ且可äģĨ多æŦĄäŊŋᔍäģĨäŋå­˜ 同一文äģļįš„å¤šä¸Ē副æœŦ。 .PP 您åŋ…éĄģä¸ēäŊŋį”¨įš„æ¯ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜å­˜å‚¨č‡ŗå°‘ä¸€ä¸Ē副æœŦīŧŒ 再加上一ä¸Ē。äŊŋᔍéĸå¤–įš„å‰¯æœŦ不äŧšæœ‰åŽŗã€‚ .SS data NAME DIR 厚䚉é˜ĩåˆ—ä¸­æ•°æŽįŖį›˜įš„åį§°å’ŒæŒ‚čŊŊį‚šã€‚ NAME ᔍäēŽæ ‡č¯†įŖį›˜īŧŒåšļ且åŋ…éĄģæ˜¯å”¯ä¸€įš„ã€‚ DIR æ˜¯įŖį›˜åœ¨æ–‡äģļįŗģįģŸä¸­įš„æŒ‚čŊŊį‚šã€‚ .PP 您可äģĨ栚捎需čĻæ›´æ”šæŒ‚čŊŊį‚šīŧŒåĒčρäŋæŒ NAME å›ēåŽšåŗå¯ã€‚ .PP 您åē”č¯Ĩä¸ēé˜ĩåˆ—ä¸­įš„æ¯ä¸Ēæ•°æŽįŖį›˜äŊŋᔍ䏀ä¸Ēé€‰éĄšã€‚ .PP 您可äģĨ通čŋ‡į›´æŽĨ在配įŊŽæ–‡äģļ中更攚 NAMEīŧŒį„ļ后čŋčĄŒ \`sync\` å‘Ŋä줿Ĩ į¨åŽé‡å‘ŊåįŖį›˜ã€‚ 在重å‘Ŋåįš„æƒ…å†ĩ下īŧŒå…ŗč”是äŊŋį”¨å­˜å‚¨įš„įŖį›˜ UUID åŽŒæˆįš„ã€‚ .SS extra NAME DIR 厚䚉čĻé€ščŋ‡ \`smart\` 和 \`probe\` å‘Ŋäģ¤į›‘æŽ§įš„éĸå¤–įŖį›˜įš„åį§°å’ŒæŒ‚čŊŊį‚šã€‚ .PP čŋ™å¯šäēŽį›‘æŽ§ä¸åąžäēŽé˜ĩ列äŊ†įŗģįģŸčŋčĄŒæ‰€åŋ…éœ€įš„įŖį›˜īŧˆäž‹åĻ‚å¯åŠ¨į›˜īŧ‰éžå¸¸æœ‰į”¨ã€‚ .PP č¯ˇæŗ¨æ„īŧŒæ­¤įąģįŖį›˜ä¸å— \`up\` 和 \`down\` å‘Ŋäģ¤įš„åŊąå“īŧŒå› ä¸ē厃äģŦčĸĢéĸ„期始įģˆå¤„äēŽ æ—‹čŊŦįŠļ态。 .SS nohidden æŽ’é™¤æ‰€æœ‰éšč—æ–‡äģļå’Œį›ŽåŊ•。 在 Unix 中īŧŒéšč—æ–‡äģ￘¯äģĨ \`.\` åŧ€å¤´įš„æ–‡äģļ。 在 Windows 中īŧŒåރäģŦæ˜¯å…ˇæœ‰éšč—åąžæ€§įš„æ–‡äģļ。 .SS exclude/include PATTERN 厚䚉čρäģŽåŒæ­Ĩčŋ‡į¨‹ä¸­æŽ’除或包åĢįš„æ–‡äģ￈–į›ŽåŊ•æ¨Ąåŧã€‚ æ‰€æœ‰æ¨ĄåŧéƒŊæŒ‰æŒ‡åŽšįš„éĄēåēå¤„į†ã€‚ .PP åĻ‚æžœåŒšé…įš„įŦŦ一ä¸Ēæ¨Ąåŧæ˜¯ \`exclude\` æ¨ĄåŧīŧŒåˆ™æŽ’除č¯Ĩ文äģļ。 åĻ‚æžœåŽƒæ˜¯ \`include\` æ¨ĄåŧīŧŒåˆ™åŒ…åĢč¯Ĩ文äģļ。 åĻ‚æžœæ˛Ąæœ‰æ¨ĄåŧåŒšé…īŧŒåˆ™åĻ‚æžœæŒ‡åŽšįš„æœ€åŽä¸€ä¸Ēæ¨Ąåŧæ˜¯ \`include\`īŧŒåˆ™æŽ’除č¯Ĩ文äģļīŧŒ æˆ–č€…åĻ‚æžœæŒ‡åŽšįš„æœ€åŽä¸€ä¸Ēæ¨Ąåŧæ˜¯ \`exclude\`īŧŒåˆ™åŒ…åĢč¯Ĩ文äģļ。 .PP æœ‰å…ŗæ¨Ąåŧč§„čŒƒįš„æ›´å¤šč¯Ļįģ†äŋĄæ¯īŧŒč¯ˇå‚阅 PATTERN 部分。 .PP æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ .SS blocksize SIZE_IN_KIBIBYTES 厚䚉åĨ‡åļæ ĄéĒŒįš„åŸēæœŦ块大小īŧˆäģĨ KiB ä¸ē单äŊīŧ‰ã€‚ 一 KiB 是 1024 å­—čŠ‚ã€‚ .PP éģ˜čŽ¤įš„ blocksize 是 256īŧŒčŋ™åē”č¯Ĩ适ᔍäēŽå¤§å¤šæ•°æƒ…å†ĩ。 .PP **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čĻæ›´æ”šæ­¤å€ŧ。 将æĨčĻæ›´æ”šæ­¤å€ŧīŧŒæ‚¨å°†éœ€čĻé‡æ–°åˆ›åģēæ•´ä¸ĒåĨ‡åļæ Ąénjīŧ .PP äŊŋį”¨ä¸åŒ blocksize įš„ä¸€ä¸Ē原因是īŧŒåĻ‚æžœæ‚¨æœ‰čŽ¸å¤šå°åž‹æ–‡äģļīŧŒ 数量įē§ä¸ēæ•°į™žä¸‡ã€‚ .PP 寚äēŽæ¯ä¸Ē文äģļīŧŒåŗäŊŋåĒ有几ä¸Ēå­—čŠ‚īŧŒäšŸäŧšåˆ†é…ä¸€ä¸ĒåŽŒæ•´įš„åĨ‡åļæ ĄéĒŒå—īŧŒ åšļ且寚äēŽčŽ¸å¤šæ–‡äģļīŧŒčŋ™å¯čƒŊå¯ŧč‡´å¤§é‡įš„æœĒäŊŋᔍåĨ‡åļæ ĄénjįŠē间。 åŊ“您厌全åĄĢæģĄåĨ‡åļæ ĄéĒŒįŖį›˜æ—ļīŧŒä¸å…čŽ¸å‘æ•°æŽįŖį›˜ æˇģ加更多文äģļ。 äŊ†æ˜¯īŧŒæĩĒč´šįš„åĨ‡åļæ ĄéĒŒä¸äŧščˇ¨æ•°æŽįŖį›˜į´¯į§¯ã€‚ æ•°æŽįŖį›˜ä¸Šå¤§é‡æ–‡äģļå¯ŧč‡´įš„æĩĒč´šįŠē间äģ…限åˆļč¯Ĩæ•°æŽįŖį›˜ä¸Šįš„æ•°æŽé‡īŧŒ 而不限åˆļå…ļäģ–įŖį›˜ä¸Šįš„æ•°æŽé‡ã€‚ .PP äŊœä¸ē一ä¸Ēčŋ‘äŧŧå€ŧīŧŒæ‚¨å¯äģĨå‡čŽžæ¯ä¸Ē文äģļæĩĒč´šäē†åŠä¸Ēå—å¤§å°įš„įŠē间。 例åĻ‚īŧŒå¯šäēŽ 100,000 ä¸Ē文äģļ和 256 KiB įš„å—å¤§å°īŧŒæ‚¨å°†æĩĒč´š 12.8 GB įš„åĨ‡åļæ ĄénjįŠē间īŧŒ čŋ™å¯čƒŊå¯ŧč‡´æ•°æŽįŖį›˜ä¸Šå°‘ 12.8 GB įš„å¯į”¨įŠē间。 .PP 您可äģĨäŊŋᔍ \`status\` æŖ€æŸĨ每ä¸ĒįŖį›˜ä¸ŠæĩĒč´šįš„įŠē间量。 čŋ™æ˜¯æ‚¨åŋ…éĄģåœ¨æ•°æŽįŖį›˜ä¸Šį•™å‡ēįš„įŠē闲įŠē间量īŧŒ æˆ–į”¨äēŽä¸åŒ…åĢ在é˜ĩåˆ—ä¸­įš„æ–‡äģļįš„įŠē间量。 åĻ‚æžœæ­¤å€ŧä¸ē负īŧŒåˆ™čĄ¨į¤ēæ‚¨åŗå°†åĄĢæģĄåĨ‡åļæ ĄénjįŠē间īŧŒ åŽƒčĄ¨į¤ē您äģį„ļ可äģĨæĩĒč´šįš„įŠē间。 .PP ä¸ēéŋ免此闎éĸ˜īŧŒæ‚¨å¯äģĨä¸ēåĨ‡åļæ ĄénjäŊŋį”¨æ›´å¤§įš„åˆ†åŒē。 例åĻ‚īŧŒåĻ‚æžœåĨ‡åļæ ĄéĒŒåˆ†åŒēæ¯”æ•°æŽįŖį›˜å¤§ 12.8 GBīŧŒ 则您有čļŗå¤Ÿįš„éĸå¤–įŠē间æĨå¤„į†æ¯ä¸Ēæ•°æŽįŖį›˜ä¸Šå¤ščžž 100,000 ä¸Ē 文äģļ而不äŧšæĩĒč´šäģģäŊ•įŠē间。 .PP 在 Linux ä¸­čŽˇåž—æ›´å¤§įš„åĨ‡åļæ ĄéĒŒåˆ†åŒēįš„ä¸€ä¸ĒæŠ€åˇ§æ˜¯äŊŋᔍäģĨ下å‘Ŋä줿 ŧåŧåŒ–åރīŧš .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP čŋ™äŧšå¯ŧ致大įēĻ 1.5% įš„éĸå¤–įŠē间īŧŒå¯šäēŽ 4 TB įŖį›˜įēĻä¸ē 60 GBīŧŒ čŋ™å…čŽ¸æ¯ä¸Ēæ•°æŽįŖį›˜ä¸Šå¤§įēĻ 460,000 ä¸Ē文äģļ而不äŧšæĩĒč´šäģģäŊ•įŠē间。 .SS hashsize SIZE_IN_BYTES 厚䚉äŋå­˜å—įš„æ•Ŗåˆ—å¤§å°īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰ã€‚ .PP éģ˜čŽ¤įš„ hashsize 是 16 å­—čŠ‚īŧˆ128 äŊīŧ‰īŧŒčŋ™åē”č¯Ĩ适ᔍäēŽå¤§å¤šæ•°æƒ…å†ĩ。 .PP **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čĻæ›´æ”šæ­¤å€ŧ。 将æĨčĻæ›´æ”šæ­¤å€ŧīŧŒæ‚¨å°†éœ€čĻé‡æ–°åˆ›åģēæ•´ä¸ĒåĨ‡åļæ Ąénjīŧ .PP äŊŋį”¨ä¸åŒ hashsize įš„ä¸€ä¸Ē原因是īŧŒåĻ‚æžœæ‚¨įš„įŗģįģŸå†…存有限。 栚捎įģénjīŧŒSnapRAID 通常每 16 TB įš„é˜ĩ列数捎需čρ 1 GiB įš„ RAM。 .PP å…ˇäŊ“æĨ蝴īŧŒä¸ēäē†å­˜å‚¨æ•°æŽįš„æ•Ŗåˆ—īŧŒSnapRAID 大įēĻ需čρ $TS*(1+HS)/BS$ å­—čŠ‚įš„ RAMīŧŒ å…ļ中 $TS$ æ˜¯æ‚¨įš„įŖį›˜é˜ĩåˆ—įš„æ€ģ大小īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰īŧŒ$BS$ 是块大小īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰īŧŒ $HS$ æ˜¯æ•Ŗåˆ—å¤§å°īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰ã€‚ .PP 例åĻ‚īŧŒå¯šäēŽ 8 ä¸Ē 4 TB įŖį›˜īŧŒå—大小ä¸ē 256 KiB īŧˆ1 KiB = 1024 å­—čŠ‚īŧ‰īŧŒæ•Ŗåˆ—大小ä¸ē 16īŧŒæ‚¨å°†čŽˇåž—īŧš .PP RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93$ GiB .PD 0 .PD .PP 切æĸåˆ°æ•Ŗåˆ—å¤§å°ä¸ē 8īŧŒæ‚¨å°†čŽˇåž—īŧš .PP RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02$ GiB .PD 0 .PD .PP 切æĸ到块大小ä¸ē 512īŧŒæ‚¨å°†čŽˇåž—īŧš .PP RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96$ GiB .PD 0 .PD .PP 切æĸåˆ°æ•Ŗåˆ—å¤§å°ä¸ē 8 和块大小ä¸ē 512īŧŒæ‚¨å°†čŽˇåž—īŧš .PP RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51$ GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES 在同æ­Ĩ或 scrub 䚋后īŧŒå¤„į†æŒ‡åŽšæ•°é‡įš„ GB 后īŧŒč‡Ē动äŋå­˜įŠļ态。 æ­¤é€‰éĄšæœ‰åŠŠäēŽéŋ免在æœē器崊æēƒæˆ–äģģäŊ•å…ļäģ–äē‹äģļ中断æ—ļīŧŒ äģŽå¤´åŧ€å§‹é‡æ–°å¯åЍé•ŋæ—ļé—´įš„ \`sync\` å‘Ŋäģ¤ã€‚ .SS temp_limit TEMPERATURE_CELSIUS 莞įŊŽå…čŽ¸įš„æœ€éĢ˜įŖį›˜æ¸ŠåēĻīŧˆæ‘„氏åēĻīŧ‰ã€‚指厚后īŧŒ SnapRAID äŧšäŊŋᔍ smartctl åˇĨå…ˇåŽšæœŸæŖ€æŸĨæ‰€æœ‰įŖį›˜įš„æ¸ŠåēĻ。 SnapRAID čŋčĄŒæ—ļäŧšæ˜žį¤ēåŊ“å‰įŖį›˜æ¸ŠåēĻ。 åĻ‚æžœäģģäŊ•įŖį›˜čļ…čŋ‡æ­¤é™åˆļīŧŒæ‰€æœ‰æ“äŊœéƒŊäŧšåœæ­ĸīŧŒ åšļ在 \`temp_sleep\` é€‰éĄšåŽšäš‰įš„æŒįģ­æ—ļé—´å†…å°†įŖį›˜åœčŊŦīŧˆįŊŽäēŽåž…æœēįŠļ态īŧ‰ã€‚ 在äŧ‘įœ æœŸčŋ‡åŽīŧŒæ“äŊœæĸ复īŧŒåĻ‚æžœæ¸ŠåēĻ限åˆļ再æŦĄčžžåˆ°īŧŒ 可čƒŊäŧšå†æŦĄæš‚停。 .PP 在操äŊœæœŸé—´īŧŒSnapRAID čŋ˜äŧšåˆ†æžæ¯ä¸ĒįŖį›˜įš„åŠ įƒ­æ›˛įēŋīŧŒ åšļäŧ°čŽĄåĻ‚æžœæ´ģ动įģ§įģ­īŧŒåރäģŦéĸ„čŽĄå°†čžžåˆ°įš„é•ŋæœŸį¨ŗåŽšæ¸ŠåēĻ。 äģ…åœ¨įŖį›˜æ¸ŠåēĻåĸžåŠ äē†å››æŦĄåŽæ‰æ‰§čĄŒäŧ°čŽĄīŧŒ äģĨįĄŽäŋæœ‰čļŗå¤Ÿįš„æ•°æŽį‚šæĨåģēįĢ‹å¯é įš„čļ‹åŠŋ。 æ­¤éĸ„æĩ‹įš„į¨ŗåŽšæ¸ŠåēĻæ˜žį¤ē在åŊ“前å€ŧæ—čžšįš„æ‹Ŧåˇä¸­īŧŒ 有劊äēŽč¯„äŧ°įŗģįģŸįš„å†ˇå´æ˜¯åĻčļŗå¤Ÿã€‚ æ­¤äŧ°čŽĄæ¸ŠåēĻäģ…äž›å‚č€ƒīŧŒå¯š SnapRAID įš„čĄŒä¸ēæ˛Ąæœ‰åŊąå“ã€‚ ፋåēįš„动äŊœäģ…åŸēäēŽåŽžé™…æĩ‹é‡įš„įŖį›˜æ¸ŠåēĻ。 .PP čĻæ‰§čĄŒæ­¤åˆ†æžīŧŒSnapRAID 需čρ䏀ä¸Ēįŗģį쟿¸ŠåēĻįš„å‚č€ƒã€‚ 厃éĻ–å…ˆå°č¯•äģŽå¯į”¨įš„įĄŦäģļäŧ æ„Ÿå™¨č¯ģ取。 åĻ‚æžœæ— æŗ•čŽŋ问įŗģįģŸäŧ æ„Ÿå™¨īŧŒåރäŧšäŊŋᔍčŋčĄŒæ—ļæĩ‹é‡įš„æœ€äŊŽįŖį›˜æ¸ŠåēĻ äŊœä¸ēå¤‡į”¨å‚č€ƒã€‚ .PP 通常īŧŒSnapRAID åĒ昞į¤ēæœ€įƒ­įŖį›˜įš„æ¸ŠåēĻ。 čĻæ˜žį¤ēæ‰€æœ‰įŖį›˜įš„æ¸ŠåēĻīŧŒč¯ˇäŊŋᔍ \-A 或 \-\-stats é€‰éĄšã€‚ .SS temp_sleep TIME_IN_MINUTES 莞įŊŽčžžåˆ°æ¸ŠåēĻ限åˆļæ—ļįš„åž…æœēæ—ļ间īŧˆäģĨ分钟ä¸ē单äŊīŧ‰ã€‚ 在此期间īŧŒįŖį›˜äŋæŒåœčŊŦįŠļ态。éģ˜čޤå€ŧä¸ē 5 分钟。 .SS pool DIR 厚䚉 \`pooling\` į›ŽåŊ•īŧŒå…ļ中äŊŋᔍ \`pool\` å‘Ŋäģ¤åˆ›åģēįŖį›˜ é˜ĩåˆ—įš„č™šæ‹Ÿč§†å›žã€‚ .PP į›ŽåŊ•åŋ…éĄģ厞įģå­˜åœ¨ã€‚ .SS share UNC_DIR 厚䚉čŋœį¨‹čŽŋé—ŽįŖį›˜æ‰€éœ€įš„ Windows UNC čˇ¯åž„ã€‚ .PP åĻ‚æžœæŒ‡åŽšä熿­¤é€‰éĄšīŧŒåˆ™åœ¨ pool į›ŽåŊ•中创åģēįš„įŦĻåˇé“žæŽĨäŧšäŊŋį”¨æ­¤ UNC čˇ¯åž„ æĨčŽŋé—ŽįŖį›˜ã€‚ åĻ‚æžœæ˛Ąæœ‰æ­¤é€‰éĄšīŧŒåˆ™į”Ÿæˆįš„įŦĻåˇé“žæŽĨäģ…äŊŋᔍæœŦåœ°čˇ¯åž„īŧŒ čŋ™ä¸å…čŽ¸é€ščŋ‡įŊ‘įģœå…ąäēĢ pool į›ŽåŊ•。 .PP įŦĻåˇé“žæŽĨ是äŊŋį”¨æŒ‡åŽšįš„ UNC čˇ¯åž„īŧŒæˇģ加在 \`data\` é€‰éĄšä¸­æŒ‡åŽšįš„ įŖį›˜åį§°īŧŒæœ€åŽæˇģ加文äģļį›ŽåŊ•å’Œåį§°åŊĸæˆįš„ã€‚ .PP æ­¤é€‰éĄšäģ…在 Windows 中需čĻã€‚ .SS smartctl DISK/PARITY OPTIONS... 厚䚉č‡Ē厚䚉 smartctl 选项äģĨčŽˇå–æ¯ä¸ĒįŖį›˜įš„ SMART åąžæ€§ã€‚ čŋ™å¯šäēŽ RAID 控åˆļ器和一ä盿— æŗ•č‡ĒåŠ¨æŖ€æĩ‹įš„ USB įŖį›˜å¯čƒŊ需čĻã€‚%s 占äŊįŦĻäŧščĸĢčŽžå¤‡åį§°æ›ŋæĸīŧŒ äŊ†å¯šäēŽå›ēåŽšįš„čŽžå¤‡īŧˆåĻ‚ RAID 控åˆļ器īŧ‰æ˜¯å¯é€‰įš„。 .PP DISK 是在 \`data\` é€‰éĄšä¸­æŒ‡åŽšįš„į›¸åŒįŖį›˜åį§°ã€‚ PARITY 是åĨ‡åļæ ĄéĒŒåį§°äš‹ä¸€īŧš\`parity\`、\`2\-parity\`、\`3\-parity\`、 \`4\-parity\`、\`5\-parity\`、\`6\-parity\` 或 \`z\-parity\`。 .PP åœ¨æŒ‡åŽšįš„ OPTIONS 中īŧŒå­—įŦĻ串 \`%s\` čĸĢčŽžå¤‡åį§°æ›ŋæĸ。 寚äēŽ RAID 控åˆļ器īŧŒčŽžå¤‡å¯čƒŊ是å›ēåŽšįš„īŧŒ 您可čƒŊ不需čρäŊŋᔍ \`%s\`。 .PP č¯ˇå‚é˜… smartmontools æ–‡æĄŖäģĨäē†č§Ŗå¯čƒŊįš„é€‰éĄšīŧš .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP 例åĻ‚īŧš .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] åœ¨čŽĄįŽ—įŖį›˜æ•…éšœæĻ‚įŽ‡æ—ļåŋŊį•ĨæŒ‡åŽšįš„ SMART åąžæ€§ã€‚ åĻ‚æžœįŖį›˜æŠĨ告äē†į‰šåŽšåąžæ€§įš„ä¸å¯ģå¸¸æˆ–č¯¯å¯ŧå€ŧīŧŒæ­¤é€‰éĄšåžˆæœ‰į”¨ã€‚ .PP DISK 是在 \`data\` é€‰éĄšä¸­æŒ‡åŽšįš„į›¸åŒįŖį›˜åį§°ã€‚ PARITY 是åĨ‡åļæ ĄéĒŒåį§°äš‹ä¸€īŧš\`parity\`、\`2\-parity\`、\`3\-parity\`、 \`4\-parity\`、\`5\-parity\`、\`6\-parity\` 或 \`z\-parity\`。 į‰šæŽŠå€ŧ * å¯į”¨äēŽåœ¨æ‰€æœ‰įŖį›˜ä¸ŠåŋŊį•Ĩč¯Ĩåąžæ€§ã€‚ .PP 例åĻ‚īŧŒčĻåœ¨æ‰€æœ‰įŖį›˜ä¸ŠåŋŊį•Ĩ \`Current Pending Sector Count\` åąžæ€§īŧš .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP čρäģ…在įŦŦ一ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜ä¸ŠåŋŊį•Ĩ厃īŧš .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples Unix įš„å…¸åž‹é…įŊŽį¤ē例åς䏋īŧš .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP Windows įš„å…¸åž‹é…įŊŽį¤ē例åς䏋īŧš .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN æ¨Ąåŧæäž›äē†ä¸€į§įĩæ´ģįš„æ–šæŗ•æĨčŋ‡æģ¤čĻåŒ…åĢæˆ–æŽ’é™¤įš„æ–‡äģļ。通čŋ‡äŊŋį”¨é€šé…įŦĻīŧˆglobbingīŧ‰īŧŒ 您可äģĨåŽšäš‰åŒšé…į‰šåŽšæ–‡äģļ名或整ä¸Ēį›ŽåŊ•į쓿ž„įš„č§„åˆ™īŧŒč€Œæ— éœ€æ‰‹åŠ¨åˆ—å‡ē每ä¸Ēčˇ¯åž„ã€‚ .PP é—Žåˇ \`?\` åŒšé…é™¤į›ŽåŊ•分隔įŦĻäģĨå¤–įš„äģģäŊ•单ä¸Ē字įŦĻ。čŋ™äŊŋåž—åŽƒåœ¨åŒšé…å…ˇæœ‰å˜é‡å­—įŦĻ įš„æ–‡äģļ名æ—ļéžå¸¸æœ‰į”¨īŧŒåŒæ—ļå°†æ¨Ąåŧé™åˆļ在单ä¸Ēį›ŽåŊ•åą‚įē§å†…。 .PP å•æ˜Ÿåˇ \`*\` 匚配äģģäŊ•å­—įŦĻåēåˆ—īŧŒäŊ†ä¸Žé—Žåˇä¸€æ ˇīŧŒåރįģä¸äŧščˇ¨čļŠį›ŽåŊ•čžšį•Œã€‚ åŽƒåœ¨æ­Ŗæ–œæ å¤„åœæ­ĸīŧŒå› æ­¤é€‚ᔍäēŽåŒšé…å•ä¸Ēčˇ¯åž„įģ„äģļå†…įš„å†…åŽšã€‚ čŋ™æ˜¯ Shell 通配įŦĻä¸­å¸¸č§įš„æ ‡å‡†čĄŒä¸ē。 .PP åŒæ˜Ÿåˇ \`**\` 功čƒŊ更åŧē大īŧŒåŽƒå¯äģĨ匚配äģģäŊ•å­—įŦĻåēåˆ—īŧŒåŒ…æ‹Ŧį›ŽåŊ•分隔įŦĻ。 čŋ™å…čŽ¸æ¨ĄåŧåŒšé…čˇ¨čļŠå¤šä¸Ēį›ŽåŊ•åą‚įē§ã€‚åŊ“ \`**\` į›´æŽĨåĩŒå…Ĩåœ¨æ¨Ąåŧä¸­æ—ļīŧŒ 厃可äģĨ匚配é›ļä¸Ē或多ä¸Ē字įŦĻīŧŒåŒ…æ‹Ŧ周围文字文æœŦäš‹é—´įš„æ–œæ ã€‚ .PP \`**\` 最重čĻįš„į”¨æŗ•æ˜¯į‰šæŽŠåŊĸåŧ \`/**/\`。厃可äģĨ匚配é›ļä¸Ē或多ä¸ĒåŽŒæ•´įš„į›ŽåŊ•åą‚įē§īŧŒ äģŽč€Œå¯äģĨ在不įŸĨé“įĄŽåˆ‡čˇ¯åž„į쓿ž„įš„æƒ…å†ĩ下īŧŒåŒšé…į›ŽåŊ•树中äģģäŊ•æˇąåēĻįš„æ–‡äģļ。 例åĻ‚īŧŒæ¨Ąåŧ \`src/**/main.js\` 匚配 \`src/main.js\`īŧˆčˇŗčŋ‡é›ļä¸Ēį›ŽåŊ•īŧ‰ã€ \`src/ui/main.js\`īŧˆčˇŗčŋ‡ä¸€ä¸Ēį›ŽåŊ•īŧ‰äģĨ及 \`src/ui/components/main.js\` īŧˆčˇŗčŋ‡ä¸¤ä¸Ēį›ŽåŊ•īŧ‰ã€‚ .PP äŊŋį”¨æ–šæ‹Ŧåˇ \`[]\` įš„å­—įŦĻįąģåŒšé…æŒ‡åŽšé›†åˆæˆ–čŒƒå›´å†…įš„å•ä¸Ē字įŦĻ。 与å…ļäģ–单字įŦĻæ¨Ąåŧä¸€æ ˇīŧŒåރäģŦä¸åŒšé…į›ŽåŊ•分隔įŦĻ。字įŦĻįąģ支持äŊŋᔍ æ„Ÿåšåˇčŋ›čĄŒčŒƒå›´æŒ‡åŽšå’ŒåĻ厚。 .PP 需čĻčŽ°äŊįš„æ šæœŦåŒēåˆĢ是īŧŒ\`*\`、\`?\` 和字įŦĻįąģéƒŊéĩåžĒį›ŽåŊ•čžšį•ŒīŧŒ åšļ且äģ…在单ä¸Ēčˇ¯åž„įģ„äģļ内匚配īŧŒč€Œ \`**\` 是唯一可äģĨ表čļŠį›ŽåŊ•分隔įŦĻåŒšé…įš„æ¨Ąåŧã€‚ .PP æœ‰å››į§ä¸åŒįąģåž‹įš„æ¨Ąåŧīŧš .TP .B FILE 选拊äģģäŊ•名ä¸ē FILE įš„æ–‡äģļ。 æ­¤æ¨Ąåŧäģ…适ᔍäēŽæ–‡äģļīŧŒä¸é€‚ᔍäēŽį›ŽåŊ•。 .TP .B DIR/ 选拊äģģäŊ•名ä¸ē DIR įš„į›ŽåŊ•及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚ æ­¤æ¨Ąåŧäģ…适ᔍäēŽį›ŽåŊ•īŧŒä¸é€‚ᔍäēŽæ–‡äģļ。 .TP .B /PATH/FILE é€‰æ‹ŠæŒ‡åŽšįš„įĄŽåˆ‡æ–‡äģļčˇ¯åž„ã€‚æ­¤æ¨Ąåŧäģ…适ᔍäēŽæ–‡äģļīŧŒä¸é€‚ᔍäēŽį›ŽåŊ•。 .TP .B /PATH/DIR/ é€‰æ‹ŠæŒ‡åŽšįš„įĄŽåˆ‡į›ŽåŊ•čˇ¯åž„åŠå…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚æ­¤æ¨Ąåŧäģ…适ᔍäēŽį›ŽåŊ•īŧŒ ä¸é€‚į”¨äēŽæ–‡äģļ。 .PP åŊ“您指åޚäģĨ / åŧ€å¤´įš„įģå¯ščˇ¯åž„æ—ļīŧŒåރåē”ᔍäēŽé˜ĩ列**æ šį›ŽåŊ•**īŧŒ č€Œä¸æ˜¯æœŦ地文äģļįŗģį쟿 šį›ŽåŊ•。 .PP 在 Windows 中īŧŒæ‚¨å¯äģĨäŊŋį”¨åæ–œæ  \\ äģŖæ›ŋæ­Ŗæ–œæ  /。 Windows įŗģįģŸį›ŽåŊ•、čŋžæŽĨį‚šã€æŒ‚čŊŊį‚šå’Œå…ļäģ– Windows į‰šæŽŠį›ŽåŊ•čĸĢ视ä¸ē文äģļīŧŒčŋ™æ„å‘ŗį€čĻæŽ’é™¤åŽƒäģŦīŧŒ 您åŋ…éĄģäŊŋį”¨æ–‡äģļč§„åˆ™īŧŒč€Œä¸æ˜¯į›ŽåŊ•č§„åˆ™ã€‚ .PP åĻ‚æžœæ–‡äģļ名包åĢ \`*\`、\`?\`、\`[\` 或 \`]\` 字įŦĻīŧŒæ‚¨åŋ…éĄģ寚å…ļčŋ›čĄŒčŊŦ义īŧŒäģĨéŋ免将å…ļč§Ŗé‡Šä¸ē globbing 字įŦĻ。在 Unix 中īŧŒčŊŦ䚉字įŦĻæ˜¯ \`\\\`īŧ›åœ¨ Windows 中īŧŒåŽƒæ˜¯ \`^\`。 åŊ“æ¨Ąåŧåœ¨å‘Ŋäģ¤čĄŒä¸Šæ—ļīŧŒæ‚¨åŋ…éĄģ双写čŊŦ义 字įŦĻīŧŒäģĨéŋ免å‘Ŋäģ¤ shell 寚å…ļčŋ›čĄŒč§Ŗé‡Šã€‚ .PP 在配įŊŽæ–‡äģļ中īŧŒæ‚¨å¯äģĨäŊŋį”¨ä¸åŒįš„į­–į•ĨæĨčŋ‡æģ¤čĻå¤„į†įš„æ–‡äģļ。 æœ€įŽ€å•įš„æ–šæŗ•æ˜¯äģ…äŊŋᔍ \`exclude\` č§„åˆ™æĨåˆ é™¤æ‰€æœ‰æ‚¨ä¸æƒŗå¤„į†įš„ 文äģļå’Œį›ŽåŊ•。䞋åĻ‚īŧš .PP .RS 4 # 排除äģģäŊ•名ä¸ē \`*.unrecoverable\` įš„æ–‡äģļ .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # æŽ’é™¤æ šį›ŽåŊ• \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # 排除äģģäŊ•名ä¸ē \`tmp\` įš„å­į›ŽåŊ• .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP į›¸åįš„æ–šæŗ•æ˜¯äģ…åŽšäš‰æ‚¨æƒŗčĻå¤„į†įš„æ–‡äģļīŧŒäģ…äŊŋᔍ \`include\` č§„åˆ™ã€‚äž‹åĻ‚īŧš .PP .RS 4 # äģ…包åĢ一äē›į›ŽåŊ• .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP æœ€åŽįš„æ–šæŗ•æ˜¯æˇˇåˆäŊŋᔍ \`exclude\` 和 \`include\` č§„åˆ™ã€‚åœ¨čŋ™į§æƒ…å†ĩ下īŧŒ č§„åˆ™įš„éĄēåēåžˆé‡čĻã€‚čžƒæ—Šįš„č§„åˆ™äŧ˜å…ˆäēŽ čžƒæ™šįš„č§„åˆ™ã€‚ ä¸ēäē†įŽ€åŒ–īŧŒæ‚¨å¯äģĨ先列å‡ē所有 \`exclude\` č§„åˆ™īŧŒį„ļ后 列å‡ē所有 \`include\` č§„åˆ™ã€‚äž‹åĻ‚īŧš .PP .RS 4 # 排除äģģäŊ•名ä¸ē \`*.unrecoverable\` įš„æ–‡äģļ .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # 排除äģģäŊ•名ä¸ē \`tmp\` įš„å­į›ŽåŊ• .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # äģ…包åĢ一äē›į›ŽåŊ• .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP 在å‘Ŋäģ¤čĄŒä¸ŠīŧŒäŊŋᔍ \-f 选项īŧŒæ‚¨åĒčƒŊäŊŋᔍ \`include\` æ¨Ąåŧã€‚äž‹åĻ‚īŧš .PP .RS 4 # äģ…æŖ€æŸĨ .mp3 文äģļ。 .PD 0 .PP .PD # 在 Unix 中īŧŒäŊŋᔍåŧ•åˇäģĨéŋ免 shell æ‰Šåą• globbing。 .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP 在 Unix 中īŧŒåœ¨å‘Ŋäģ¤čĄŒä¸ŠäŊŋᔍ globbing 字įŦĻæ—ļīŧŒåŋ…éĄģ åŧ•ᔍåރäģŦäģĨ防æ­ĸ shell æ‰Šåą•åŽƒäģŦ。 .SH IGNORE FILE 除äē†é…įŊŽæ–‡äģļä¸­įš„å…¨åą€č§„åˆ™å¤–īŧŒæ‚¨čŋ˜å¯äģĨ在é˜ĩåˆ—å†…įš„äģģäŊ•į›ŽåŊ•中攞įŊŽ \`.snapraidignore\` 文äģļīŧŒäģĨåŽšäš‰åˆ†æ•Ŗįš„æŽ’é™¤č§„åˆ™ã€‚ .PP 在 \`.snapraidignore\` ä¸­åŽšäš‰įš„č§„åˆ™äŧšåœ¨é…įŊŽæ–‡äģļä¸­įš„č§„åˆ™äš‹åŽåē”į”¨ã€‚ čŋ™æ„å‘ŗį€åރäģŦå…ˇæœ‰æ›´éĢ˜įš„äŧ˜å…ˆįē§īŧŒå¯į”¨äēŽæŽ’é™¤å…ˆå‰į”ąå…¨åą€é…įŊŽåŒ…åĢįš„æ–‡äģļ。 厞际上īŧŒåĻ‚æžœæœŦåœ°č§„åˆ™åŒšé…īŧŒåˆ™æ— čŽēå…¨åą€åŒ…åĢ莞įŊŽåĻ‚äŊ•īŧŒč¯Ĩ文äģļéƒŊäŧščĸĢæŽ’é™¤ã€‚ .PP \`.snapraidignore\` ä¸­įš„æ¨Ąåŧé€ģčž‘ä¸Žå…¨åą€é…įŊŽį›¸åŒīŧŒäŊ†æ¨Ąåŧé”šåޚ圍 č¯Ĩ文äģ￉€åœ¨įš„į›ŽåŊ•īŧš .TP .B FILE é€‰æ‹Šæ­¤į›ŽåŊ•或å…ļ下斚äģģäŊ•名ä¸ē FILE įš„æ–‡äģļ。 čŋ™éĩåžĒä¸Žå…¨åą€æ¨Ąåŧį›¸åŒįš„通配įŦĻč§„åˆ™ã€‚ .TP .B DIR/ 选拊äģģäŊ•名ä¸ē DIR įš„į›ŽåŊ•及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšīŧŒ äŊäēŽæ­¤į›ŽåŊ•或å…ļ下斚。 .TP .B /PATH/FILE é€‰æ‹Šį›¸å¯šäēŽ \`.snapraidignore\` 文äģļäŊįŊŽæŒ‡åŽšįš„į˛žįĄŽæ–‡äģļ。 .TP .B /PATH/DIR/ é€‰æ‹Šį›¸å¯šäēŽ \`.snapraidignore\` 文äģļäŊįŊŽæŒ‡åŽšįš„į˛žįĄŽį›ŽåŊ• 及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚ .PP ä¸Žå…¨åą€é…įŊŽä¸åŒīŧŒ\`.snapraidignore\` 文äģļäģ…æ”¯æŒæŽ’é™¤č§„åˆ™īŧ› 您不čƒŊäŊŋᔍ \`include\` æ¨Ąåŧæˆ–åĻ厚įŦĻåˇ (!)。 .PP 例åĻ‚īŧŒåĻ‚æžœæ‚¨åœ¨ \`/mnt/disk1/projects/\` 中有一ä¸Ē \`.snapraidignore\`īŧš .PP .RS 4 # ä셿ޒ除 /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # 排除 projects/ 中äģģäŊ•名ä¸ē \`build\` įš„į›ŽåŊ• .PD 0 .PP .PD build/ .PD 0 .PP .PD # 排除 projects/ 或å…ļ子文äģļ多中äģģäŊ• .tmp 文äģļ .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID 将文äģļåˆ—čĄ¨å’Œæ ĄéĒŒå’Œå­˜å‚¨åœ¨ content 文äģļ中。 .PP 厃是一ä¸ĒäēŒčŋ›åˆļ文äģļīŧŒåˆ—å‡ēäē†įŖį›˜é˜ĩåˆ—ä¸­å­˜åœ¨įš„æ‰€æœ‰æ–‡äģļīŧŒ äģĨåŠį”¨äēŽénj蝁å…ļåŽŒæ•´æ€§įš„æ‰€æœ‰æ ĄéĒŒå’Œã€‚ .PP 此文äģļį”ą \`sync\` 和 \`scrub\` å‘Ŋäģ¤č¯ģ取和写å…ĨīŧŒåšļį”ą \`fix\`、\`check\` 和 \`status\` å‘Ŋäģ¤č¯ģ取。 .SH PARITY SnapRAID 将é˜ĩåˆ—įš„åĨ‡åļæ ĄénjäŋĄæ¯å­˜å‚¨åœ¨ parity 文äģļ中。 .PP čŋ™ä盿˜¯äēŒčŋ›åˆļ文äģļīŧŒåŒ…åĢ \`content\` 文äģļä¸­åŽšäš‰įš„æ‰€æœ‰ å—įš„čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ .PP čŋ™ä盿–‡äģļį”ą \`sync\` 和 \`fix\` å‘Ŋäģ¤č¯ģ取和写å…ĨīŧŒ åšļ且äģ…į”ą \`scrub\` 和 \`check\` å‘Ŋäģ¤č¯ģ取。 .SH ENCODING SnapRAID 在 Unix 中åŋŊį•ĨäģģäŊ•įŧ–į ã€‚åރč¯ģ取åšļ存储 文äģļįŗģįģŸäŊŋį”¨įš„į›¸åŒįŧ–į įš„æ–‡äģļ名。 .PP 在 Windows 中īŧŒäģŽæ–‡äģļįŗģįģŸč¯ģå–įš„æ‰€æœ‰åį§°éƒŊäŧščĸĢčŊŦæĸåšļ äģĨ UTF\-8 æ ŧåŧå¤„į†ã€‚ .PP čρäŊŋ文äģļåæ­ŖįĄŽæ‰“å°īŧŒæ‚¨åŋ…éĄģäŊŋᔍå‘Ŋäģ¤ \`chcp 65001\` 将 Windows 控åˆļå°čŽžįŊŽä¸ē UTF\-8 æ¨ĄåŧīŧŒåšļäŊŋᔍ TrueType 字äŊ“īŧŒåĻ‚ \`Lucida Console\`īŧŒ äŊœä¸ē控åˆļ台字äŊ“。čŋ™äģ…åŊąå“æ‰“å°įš„æ–‡äģļ名īŧ›åĻ‚æžœ 您将控åˆļå°čž“å‡ē重厚向到文äģļīŧŒåˆ™į”Ÿæˆįš„æ–‡äģļ始įģˆ é‡‡į”¨ UTF\-8 æ ŧåŧã€‚ .SH COPYRIGHT 此文äģļį‰ˆæƒæ‰€æœ‰ (C) 2025 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-zh.d000066400000000000000000001556351522717156100164300ustar00rootroot00000000000000Name{number} snapraid - įŖį›˜é˜ĩåˆ—įš„ SnapRAID 备äģŊ Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAID 是一æŦžä¸“ä¸ēįŖį›˜é˜ĩåˆ—čŽžčŽĄįš„å¤‡äģŊፋåēīŧŒåŽƒå­˜å‚¨åĨ‡åļæ ĄénjäŋĄæ¯īŧŒ äģĨ在最多六ä¸ĒįŖį›˜å‘į”Ÿæ•…éšœæ—ļčŋ›čĄŒæ•°æŽæĸ复。 SnapRAID ä¸ģčρéĸ向æ‹Ĩ有大型、不常更攚文äģļįš„åŽļåē­åĒ’äŊ“中åŋƒīŧŒæäž›äģĨä¸‹į‰šæ€§īŧš * 您可äģĨäŊŋᔍ厞åĄĢ充文äģļįš„įŖį›˜īŧŒæ— éœ€é‡æ–°æ ŧåŧåŒ–īŧŒåšļåƒåž€å¸¸ä¸€æ ˇčŽŋ闎厃äģŦ。 * æ‚¨įš„æ‰€æœ‰æ•°æŽéƒŊäŧščĸĢæ•Ŗåˆ—īŧŒäģĨįĄŽäŋå­˜å‚¨åŽŒæ•´æ€§åšļ防æ­ĸ静é옿Ÿåã€‚ * åŊ“æ•…éšœįŖį›˜æ•°é‡čļ…čŋ‡åĨ‡åļæ ĄéĒŒæ•°æ—ļīŧŒæ•°æŽä¸ĸå¤ąäģ…限äēŽå—åŊąå“įš„įŖį›˜īŧ› å…ļäģ–įŖį›˜ä¸Šįš„æ•°æŽäģį„ļ可čŽŋ闎。 * åĻ‚æžœæ‚¨ä¸å°åŋƒåˆ é™¤äē†įŖį›˜ä¸Šįš„æ–‡äģļīŧŒå¯äģĨčŋ›čĄŒæĸ复。 * įŖį›˜å¯äģĨæœ‰ä¸åŒįš„å°ē寸。 * 您可äģĨ随æ—ᅫģåŠ įŖį›˜ã€‚ * SnapRAID 不äŧšé”åŽšæ‚¨įš„æ•°æŽīŧ›æ‚¨å¯äģĨ随æ—ļ停æ­ĸäŊŋį”¨åŽƒīŧŒæ— éœ€é‡æ–°æ ŧåŧåŒ–或į§ģ动数捎。 * čŽŋé—Žæ–‡äģļæ—ļīŧŒåĒ需一ä¸ĒįŖį›˜čŊŦ动īŧŒäģŽč€ŒčŠ‚įœį”ĩ力åšļ降äŊŽå™ĒéŸŗã€‚ æŦ˛äē†č§Ŗæ›´å¤šäŋĄæ¯īŧŒč¯ˇčŽŋ问 SnapRAID 厘斚įŊ‘įĢ™īŧš :https://www.snapraid.it/ Limitations SnapRAID 是 RAID 和备äģŊፋåēäš‹é—´įš„æˇˇåˆäŊ“īŧŒæ—¨åœ¨įģ“åˆä¸¤č€…įš„äŧ˜į‚šã€‚ į„ļ而īŧŒåœ¨äŊŋį”¨åŽƒäš‹å‰īŧŒæ‚¨åē”č¯Ĩ考虑一äē›é™åˆļ。 ä¸ģčĻįš„é™åˆļ是īŧŒåĻ‚æžœä¸€ä¸ĒįŖį›˜å‘į”Ÿæ•…éšœč€Œæ‚¨æœ€čŋ‘æ˛Ąæœ‰čŋ›čĄŒåŒæ­Ĩīŧˆsyncīŧ‰īŧŒ 您可čƒŊæ— æŗ•åŽŒå…¨æĸ复。 æ›´å…ˇäŊ“åœ°č¯´īŧŒæ‚¨å¯čƒŊæ— æŗ•æĸ复č‡Ē上æŦĄåŒæ­Ĩ操äŊœäģĨæĨåˇ˛æ›´æ”šæˆ–åˇ˛åˆ é™¤æ–‡äģļįš„ 大小所寚åē”įš„éƒ¨åˆ†ã€‚ åŗäŊŋæ›´æ”šæˆ–åˆ é™¤įš„æ–‡äģļä¸åœ¨å‘į”Ÿæ•…éšœįš„įŖį›˜ä¸ŠīŧŒäšŸäŧšå‘į”Ÿčŋ™į§æƒ…å†ĩ。 čŋ™å°ąæ˜¯ä¸ēäģ€äšˆ SnapRAID æ›´é€‚į”¨äēŽåžˆå°‘æ›´æ”šįš„æ•°æŽã€‚ åĻ一斚éĸīŧŒæ–°æˇģåŠ įš„æ–‡äģļ不äŧšé˜ģæ­ĸå¯šåˇ˛æœ‰æ–‡äģļįš„æĸ复。 您åĒäŧšä¸ĸå¤ąäŊäēŽå‘į”Ÿæ•…éšœįŖį›˜ä¸Šįš„æœ€čŋ‘æˇģåŠ įš„æ–‡äģļ。 SnapRAID įš„å…ļäģ–限åˆļ包æ‹Ŧīŧš * äŊŋᔍ SnapRAIDīŧŒæ¯ä¸ĒįŖį›˜äģį„ļ有单į‹Ŧįš„æ–‡äģļįŗģįģŸã€‚ äŊŋᔍ RAIDīŧŒæ‚¨å¯äģĨčŽˇåž—ä¸€ä¸Ēå•ä¸€įš„å¤§åž‹æ–‡äģļįŗģįģŸã€‚ * SnapRAID 不čŋ›čĄŒæ•°æŽæĄå¸Ļ化。 äŊŋᔍ RAIDīŧŒæ‚¨å¯äģĨ通čŋ‡æĄå¸ĻåŒ–čŽˇåž—é€ŸåēĻæå‡ã€‚ * SnapRAID 不支持厞æ—￁ĸ复。 äŊŋᔍ RAIDīŧŒåŊ“įŖį›˜å‘į”Ÿæ•…éšœæ—ļīŧŒæ‚¨ä¸åŋ…停æ­ĸåˇĨäŊœã€‚ * SnapRAID åĒčƒŊäģŽæœ‰é™æ•°é‡įš„įŖį›˜æ•…éšœä¸­æĸ复数捎。 äŊŋᔍ备äģŊīŧŒæ‚¨å¯äģĨäģŽæ•´ä¸ĒįŖį›˜é˜ĩåˆ—įš„åŽŒå…¨æ•…éšœä¸­æĸ复。 * äģ…äŋå­˜æ–‡äģļ名、æ—ļé—´æˆŗã€įŦĻåˇé“žæŽĨ和įĄŦ链æŽĨ。 不äŋå­˜æƒé™ã€æ‰€æœ‰æƒå’Œæ‰Šåą•åąžæ€§ã€‚ Getting Started čρäŊŋᔍ SnapRAIDīŧŒæ‚¨éœ€čρéĻ–å…ˆé€‰æ‹ŠįŖį›˜é˜ĩåˆ—ä¸­įš„ä¸€ä¸ĒįŖį›˜ä¸“į”¨äēŽ `parity`īŧˆåĨ‡åļæ Ąénjīŧ‰äŋĄæ¯ã€‚äŊŋᔍ䏀ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒ 您将čƒŊ够äģŽå•įŖį›˜æ•…éšœä¸­æĸ复īŧŒįąģäŧŧäēŽ RAID5。 åĻ‚æžœæ‚¨æƒŗäģŽæ›´å¤šįš„įŖį›˜æ•…éšœä¸­æĸ复īŧŒįąģäŧŧäēŽ RAID6īŧŒ 您åŋ…éĄģéĸ„į•™éĸå¤–įš„įŖį›˜į”¨äēŽåĨ‡åļæ ĄéĒŒã€‚æ¯åĸžåР䏀ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒ å°ąå¯äģĨ多æĸ复一ä¸ĒįŖį›˜æ•…éšœã€‚ äŊœä¸ēåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒæ‚¨åŋ…éĄģ选拊é˜ĩåˆ—ä¸­æœ€å¤§įš„įŖį›˜īŧŒ 因ä¸ēåĨ‡åļæ ĄénjäŋĄæ¯å¯čƒŊäŧšåĸžé•ŋ到é˜ĩåˆ—ä¸­æœ€å¤§įš„æ•°æŽįŖį›˜įš„å¤§å°ã€‚ čŋ™äē›įŖį›˜å°†ä¸“闍ᔍäēŽå­˜å‚¨ `parity` 文äģļ。 您不åē”č¯Ĩ在厃äģŦ上éĸå­˜å‚¨æ‚¨įš„æ•°æŽã€‚ į„ļ后īŧŒæ‚¨åŋ…éĄģ厚䚉čρäŊŋᔍ SnapRAID äŋæŠ¤įš„ `data`īŧˆæ•°æŽīŧ‰įŖį›˜ã€‚ åĻ‚æžœčŋ™äē›įŖį›˜åŒ…åĢåžˆå°‘æ›´æ”šįš„æ•°æŽīŧŒäŋæŠ¤äŧšæ›´æœ‰æ•ˆã€‚å› æ­¤īŧŒ 最åĨŊ**不čρ**包åĢ Windows C:\ įŖį›˜æˆ– Unix įš„ /home、/var 和 /tmp į›ŽåŊ•。 文äģļåˆ—čĄ¨äŋå­˜åœ¨ `content`īŧˆå†…厚īŧ‰æ–‡äģļ中īŧŒé€šå¸¸å­˜å‚¨åœ¨æ•°æŽã€åĨ‡åļæ ĄéĒŒæˆ– åŧ•å¯ŧįŖį›˜ä¸Šã€‚ č¯Ĩ文äģļ包åĢ备äģŊįš„č¯Ļįģ†äŋĄæ¯īŧŒåŒ…æ‹Ŧæ‰€æœ‰į”¨äēŽénj蝁å…ļåŽŒæ•´æ€§įš„æ ĄéĒŒå’Œã€‚ `content` 文äģļ存储有多ä¸Ē副æœŦīŧŒæ¯ä¸Ē副æœŦåŋ…éĄģäŊäēŽä¸åŒįš„įŖį›˜ä¸ŠīŧŒ äģĨįĄŽäŋå­˜å‚¨æœ‰å¤šä¸ĒįŖį›˜æ•…éšœæ—ļīŧŒč‡ŗå°‘有一ä¸Ē副æœŦå¯į”¨ã€‚ 例åĻ‚īŧŒå‡čŽžæ‚¨åĒ寚一ä¸ĒåĨ‡åļæ ĄénjäŋæŠ¤įē§åˆĢ感兴čļŖīŧŒåšļä¸”æ‚¨įš„įŖį›˜äŊäēŽīŧš :/mnt/diskp <- é€‰åŽšįš„åĨ‡åļæ ĄéĒŒįŖį›˜ :/mnt/disk1 <- įŦŦ一ä¸ĒčρäŋæŠ¤įš„įŖį›˜ :/mnt/disk2 <- įŦŦäēŒä¸ĒčρäŋæŠ¤įš„įŖį›˜ :/mnt/disk3 <- įŦŦ三ä¸ĒčρäŋæŠ¤įš„įŖį›˜ 您åŋ…éĄģ创åģē配įŊŽæ–‡äģļ /etc/snapraid.confīŧŒåšļ包åĢäģĨ下选项īŧš :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ åĻ‚æžœæ‚¨äŊŋᔍ WindowsīŧŒæ‚¨åē”č¯ĨäŊŋᔍ Windows čˇ¯åž„æ ŧåŧīŧŒ į”¨éŠąåŠ¨å™¨åˇå’Œåæ–œæ äģŖæ›ŋ斜杠。 :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ åĻ‚æžœæ‚¨æœ‰čŽ¸å¤šįŖį›˜ä¸”éŠąåŠ¨å™¨åˇį”¨å°ŊīŧŒæ‚¨å¯äģĨå°†įŖį›˜į›´æŽĨ挂čŊŊ到子文äģļå¤šä¸­ã€‚č¯ˇå‚é˜…īŧš :https://www.google.com/search?q=Windows+mount+point æ­¤æ—ļīŧŒæ‚¨åˇ˛å‡†å¤‡åĨŊčŋčĄŒ `sync` å‘Ŋä줿Ĩ构åģēåĨ‡åļæ ĄénjäŋĄæ¯ã€‚ :snapraid sync įŦŦ一æŦĄčŋčĄŒæ­¤čŋ‡į¨‹å¯čƒŊ需čρ几ä¸Ē小æ—ļīŧŒå…ˇäŊ“å–å†ŗäēŽįŖį›˜ä¸Šåˇ˛å­˜åœ¨æ•°æŽįš„大小。 åĻ‚æžœįŖį›˜æ˜¯įŠēįš„īŧŒåˆ™čŋ‡į¨‹æ˜¯åŗæ—ļįš„ã€‚ 您可äģĨ随æ—ļ按 Ctrl+C 停æ­ĸ厃īŧŒåœ¨ä¸‹æŦĄčŋčĄŒæ—ļīŧŒåŽƒå°†äģŽä¸­æ–­įš„地斚æĸ复。 åŊ“æ­¤å‘Ŋäģ¤åŽŒæˆæ—ļīŧŒæ‚¨įš„æ•°æŽæ˜¯**åŽ‰å…¨įš„**。 įŽ°åœ¨æ‚¨å¯äģĨåŧ€å§‹éšæ„äŊŋį”¨æ‚¨įš„é˜ĩ列īŧŒåšļ厚期čŋčĄŒ `sync` å‘Ŋä줿›´æ–°åĨ‡åļæ ĄénjäŋĄæ¯ã€‚ Scrubbing čĻåŽšæœŸæŖ€æŸĨ数捎和åĨ‡åļæ ĄéĒŒįš„é”™č¯¯īŧŒæ‚¨å¯äģĨčŋčĄŒ `scrub` å‘Ŋäģ¤ã€‚ :snapraid scrub æ­¤å‘Ŋäģ¤å°†é˜ĩåˆ—ä¸­įš„æ•°æŽä¸Ž `sync` å‘Ŋä줿œŸé—´čŽĄįŽ—įš„æ•Ŗåˆ—čŋ›čĄŒæ¯”čžƒīŧŒ äģĨéĒŒč¯åŽŒæ•´æ€§ã€‚ 每æŦĄčŋčĄŒč¯Ĩå‘Ŋäģ¤äŧšæŖ€æŸĨ大įēĻ 8% įš„é˜ĩ列īŧŒæŽ’除在čŋ‡åŽģ 10 夊内 厞čĸĢ scrub įš„æ•°æŽã€‚ 您可äģĨäŊŋᔍ -p, --plan 选项æĨæŒ‡åŽšä¸åŒįš„é‡īŧŒ åšļäŊŋᔍ -o, --older-than 选项æĨæŒ‡åŽšä¸åŒįš„å¤Šæ•°ã€‚ 例åĻ‚īŧŒčĻæŖ€æŸĨ 20 夊äģĨä¸Šå—įš„ 5% é˜ĩ列īŧŒč¯ˇäŊŋᔍīŧš :snapraid -p 5 -o 20 scrub åĻ‚æžœåœ¨čŋ‡į¨‹ä¸­å‘įŽ°é™éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒ ᛏåē”įš„å—äŧšåœ¨ `content` 文äģļ中čĸĢæ ‡čްä¸ē坏块īŧŒåšļ列在 `status` å‘Ŋäģ¤ä¸­ã€‚ :snapraid status čρäŋŽå¤åރäģŦīŧŒæ‚¨å¯äģĨäŊŋᔍ `fix` å‘Ŋäģ¤īŧŒäŊŋᔍ -e, --filter-error 选项čŋ‡æģ¤åå—īŧš :snapraid -e fix 在下æŦĄ `scrub` æ—ļīŧŒåĻ‚æžœåŽƒäģŦįĄŽåŽžčĸĢäŋŽå¤äē†īŧŒé”™č¯¯å°†äģŽ `status` æŠĨ告中æļˆå¤ąã€‚ ä¸ēä熿›´åŋĢīŧŒæ‚¨å¯äģĨäŊŋᔍ -p bad æĨäģ… scrub æ ‡čŽ°ä¸ēåå—įš„å—ã€‚ :snapraid -p bad scrub 在æœĒ同æ­Ĩįš„é˜ĩ列上čŋčĄŒ `scrub` 可čƒŊäŧšæŠĨå‘Šį”ąåˇ˛åˆ é™¤æˆ–åˇ˛äŋŽæ”šæ–‡äģļåŧ•čĩˇįš„é”™č¯¯ã€‚ čŋ™äē›é”™č¯¯äŧšåœ¨ `scrub` 输å‡ē中æŠĨ告īŧŒäŊ†į›¸å…ŗå—不äŧščĸĢæ ‡čްä¸ē坏块。 Pooling æŗ¨æ„īŧšä¸‹éĸ描čŋ°įš„ pooling 功čƒŊ厞čĸĢ mergerfs åˇĨå…ˇå–äģŖīŧŒ mergerfs įŽ°åœ¨æ˜¯ SnapRAID į¤žåŒēæŽ¨čįš„ Linux į”¨æˆˇé€‰éĄšã€‚ Mergefs 提䞛äē†ä¸€į§æ›´įĩæ´ģ、更éĢ˜æ•ˆįš„æ–šåŧīŧŒå°†å¤šä¸ĒéŠąåŠ¨å™¨æą‡é›†åˆ°ä¸€ä¸Ē įģŸä¸€įš„æŒ‚čŊŊį‚šä¸­īŧŒå…čޏ莍é˜ĩ列无įŧčŽŋé—Žæ–‡äģļīŧŒč€Œæ— éœ€äžčĩ–įŦĻåˇé“žæŽĨ。 厃与 SnapRAID 垈åĨŊ地集成äģĨ提䞛åĨ‡åļæ ĄénjäŋæŠ¤īŧŒå¸¸į”¨äēŽ OpenMediaVault (OMV) 或č‡Ē厚䚉 NAS 配įŊŽį­‰čŽžįŊŽä¸­ã€‚ čρäŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰æ–‡äģ￘žį¤ē在同一ä¸Ēį›ŽåŊ•树中īŧŒ 您可äģĨ吝ᔍ `pooling` 功čƒŊ。厃äŊŋᔍįŦĻåˇé“žæŽĨ创åģēäē†ä¸€ä¸Ē é˜ĩ列中所有文äģļįš„åĒč¯ģč™šæ‹Ÿč§†å›žã€‚ 您可äģĨ在配įŊŽæ–‡äģļ中äŊŋᔍäģĨ下选项配įŊŽ `pooling` į›ŽåŊ•īŧš :pool /pool æˆ–č€…īŧŒåĻ‚æžœæ‚¨äŊŋᔍ WindowsīŧŒåˆ™äŊŋᔍīŧš :pool C:\pool į„ļ后čŋčĄŒ `pool` å‘Ŋäģ¤åˆ›åģ翈–æ›´æ–°č™šæ‹Ÿč§†å›žã€‚ :snapraid pool åĻ‚æžœæ‚¨äŊŋᔍ Unix åšŗå°åšļ希望通čŋ‡įŊ‘įģœå°†æ­¤į›ŽåŊ•å…ąäēĢįģ™ Windows 或 Unix æœē器īŧŒ 您åē”č¯Ĩ在 /etc/samba/smb.conf 中æˇģ加äģĨ下选项īŧš :# 在 smb.conf įš„å…¨åą€éƒ¨åˆ† :unix extensions = no :# 在 smb.conf įš„å…ąäēĢ部分 :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes 在 Windows 中īŧŒé€ščŋ‡įŊ‘įģœå…ąäēĢįŦĻåˇé“žæŽĨ需čρåŽĸæˆˇį̝čŋœį¨‹č§ŖæžåރäģŦ。 čĻå¯į”¨æ­¤åŠŸčƒŊīŧŒé™¤äē†å…ąäēĢ pool į›ŽåŊ•䚋外īŧŒæ‚¨čŋ˜åŋ…éĄģį‹ŦįĢ‹å…ąäēĢæ‰€æœ‰įŖį›˜īŧŒ äŊŋį”¨é…įŊŽæ–‡äģļä¸­åŽšäš‰įš„įŖį›˜åį§°äŊœä¸ēå…ąäēĢį‚šã€‚ 您čŋ˜åŋ…éĄģ在配įŊŽæ–‡äģļįš„ `share` é€‰éĄšä¸­æŒ‡åŽščŋœį¨‹åŽĸæˆˇį̝čŽŋ问čŋ™äē› å…ąäēĢįŖį›˜æ‰€éœ€įš„ Windows UNC čˇ¯åž„ã€‚ 例åĻ‚īŧŒåœ¨åä¸ē `darkstar` įš„æœåŠĄå™¨ä¸Šæ“äŊœīŧŒæ‚¨å¯äģĨäŊŋᔍäģĨ下选项īŧš :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar åšļ通čŋ‡įŊ‘įģœå…ąäēĢäģĨä¸‹į›ŽåŊ•īŧš :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array äģĨå…čŽ¸čŋœį¨‹åŽĸæˆˇį̝čŽŋ问 \\darkstar\pool å¤„įš„æ‰€æœ‰æ–‡äģļ。 您可čƒŊčŋ˜éœ€čĻé…įŊŽčŋœį¨‹åŽĸæˆˇį̝īŧŒäŊŋᔍäģĨ下å‘Ŋäģ¤å¯į”¨å¯ščŋœį¨‹įŦĻåˇé“žæŽĨįš„čŽŋ问īŧš :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAID įš„åŠŸčƒŊ更像一ä¸Ē备äģŊፋåēč€Œä¸æ˜¯ RAID įŗģįģŸīŧŒ 厃可äģĨäŊŋᔍ -f, --filter 选项æĨæĸ复或取æļˆåˆ é™¤æ–‡äģļ到å…ļäģĨå‰įš„įŠļ态īŧš :snapraid fix -f FILE æˆ–č€…å¯šäēŽä¸€ä¸Ēį›ŽåŊ•īŧš :snapraid fix -f DIR/ 您䚟可äģĨäŊŋᔍ -m, --filter-missing 选项æĨäģ…æĸå¤į›ŽåŊ•å†…æ„å¤–åˆ é™¤įš„æ–‡äģļīŧŒ č¯Ĩ选项äģ…æĸ复ä¸ĸå¤ąįš„æ–‡äģļīŧŒäŋæŒæ‰€æœ‰å…ļäģ–æ–‡äģļ不变。 :snapraid fix -m -f DIR/ æˆ–č€…äŊŋᔍäģĨ下å‘Ŋä줿ĸå¤æ‰€æœ‰éŠąåŠ¨å™¨ä¸Šæ‰€æœ‰åˇ˛åˆ é™¤įš„æ–‡äģļīŧš :snapraid fix -m Recovering æœ€įŗŸįŗ•įš„æƒ…å†ĩå‘į”Ÿäē†īŧŒæ‚¨ä¸ĸå¤ąäē†ä¸€ä¸Ē或多ä¸ĒįŖį›˜īŧ **不čĻæƒŠæ…Œīŧ** 您将čƒŊ够æĸ复厃äģŦīŧ 您åŋ…éĄģåšįš„įŦŦ一äģļä狿˜¯éŋå…å¯šįŖį›˜é˜ĩ列čŋ›čĄŒčŋ›ä¸€æ­Ĩįš„æ›´æ”šã€‚ įĻį”¨å¯šå…ļįš„äģģäŊ•čŋœį¨‹čŋžæŽĨäģĨ及äģģäŊ•čŽĄåˆ’įš„čŋ›į¨‹īŧŒåŒ…æ‹ŦäģģäŊ•čŽĄåˆ’įš„ SnapRAID 夜间同æ­Ĩ或 scrub。 į„ļ后įģ§įģ­æ‰§čĄŒäģĨ下æ­ĨéĒ¤ã€‚ STEP 1 -> 重新配įŊŽ æ‚¨éœ€čρ䏀äē›įŠē间æĨæĸ复īŧŒį†æƒŗæƒ…å†ĩ下是在éĸå¤–įš„å¤‡į”¨įŖį›˜ä¸ŠīŧŒ äŊ†å¤–部 USB įŖį›˜æˆ–čŋœį¨‹įŖį›˜äšŸčļŗå¤Ÿã€‚ äŋŽæ”š SnapRAID 配įŊŽæ–‡äģļīŧŒäŊŋæ•…éšœįŖį›˜įš„ `data` 或 `parity` é€‰éĄšæŒ‡å‘ 一ä¸Ēå…ˇæœ‰čļŗå¤ŸįŠē闲įŠē间æĨæĸ复文äģļįš„äŊįŊŽã€‚ 例åĻ‚īŧŒåĻ‚æžœįŖį›˜ `d1` å‘į”Ÿæ•…éšœīŧŒåˆ™äģŽīŧš :data d1 /mnt/disk1/ 更攚ä¸ēīŧš :data d1 /mnt/new_spare_disk/ åĻ‚æžœéœ€čρæĸå¤įš„įŖį›˜æ˜¯åĨ‡åļæ ĄéĒŒįŖį›˜īŧŒč¯ˇæ›´æ–°į›¸åē”įš„ `parity` é€‰éĄšã€‚ åĻ‚æžœæ‚¨æœ‰å¤šä¸Ēæ•…éšœįŖį›˜īŧŒč¯ˇæ›´æ–°æ‰€æœ‰åރäģŦįš„é…įŊŽé€‰éĄšã€‚ STEP 2 -> äŋŽå¤ čŋčĄŒ fix å‘Ŋäģ¤īŧŒåšļ将æ—Ĩåŋ—存储在外部文äģļ中īŧš :snapraid -d NAME -l fix.log fix å…ļ中 NAME æ˜¯įŖį›˜įš„åį§°īŧŒäž‹åĻ‚æˆ‘äģŦ前éĸäž‹å­ä¸­įš„ `d1`。 åĻ‚æžœéœ€čρæĸå¤įš„įŖį›˜æ˜¯åĨ‡åļæ ĄéĒŒįŖį›˜īŧŒč¯ˇäŊŋį”¨åį§° `parity`、`2-parity` į­‰ã€‚ åĻ‚æžœæ‚¨æœ‰å¤šä¸Ēæ•…éšœįŖį›˜īŧŒč¯ˇäŊŋį”¨å¤šä¸Ē -d 选项æĨ指厚所有厃äģŦ。 æ­¤å‘Ŋäģ¤å°†čŠąč´šåžˆé•ŋæ—ļ间。 įĄŽäŋæ‚¨æœ‰å‡  GB įš„å¯į”¨įŠē间æĨ存储 fix.log 文äģļ。 在有čļŗå¤Ÿå¯į”¨įŠēé—´įš„įŖį›˜ä¸ŠčŋčĄŒåŽƒã€‚ įŽ°åœ¨æ‚¨åˇ˛įģæĸ复ä熿‰€æœ‰å¯æĸå¤įš„å†…åŽšã€‚åĻ‚æžœæœ‰ä盿–‡äģļ部分或厌全不可æĸ复īŧŒ 厃äģŦ将čĸĢ重å‘Ŋ名åšļæˇģ加 `.unrecoverable` æ‰Šåą•åã€‚ 您可äģĨ通čŋ‡æŖ€æŸĨ所有äģĨ `unrecoverable:` åŧ€å¤´įš„čĄŒīŧŒåœ¨ fix.log 文äģļ中 扞到所有不可æĸå¤å—įš„č¯Ļįģ†åˆ—čĄ¨ã€‚ åĻ‚æžœæ‚¨å¯šæĸ复不æģĄæ„īŧŒæ‚¨å¯äģĨ栚捎需čĻé‡č¯•å¤šæŦĄã€‚ 例åĻ‚īŧŒåĻ‚æžœæ‚¨åœ¨ä¸ŠæŦĄ `sync` 䚋后äģŽé˜ĩ列中删除ä熿–‡äģļīŧŒ čŋ™å¯čƒŊå¯ŧč‡´æŸä盿–‡äģļæ— æŗ•æĸ复。 在čŋ™į§æƒ…å†ĩ下īŧŒæ‚¨å¯äģĨäŊŋᔍ -i, --import é€‰éĄšé‡č¯• `fix`īŧŒ 指厚čŋ™ä盿–‡äģļįŽ°åœ¨åœ¨å“Ē里īŧŒäģĨäžŋ将厃äģŦ再æŦĄåŒ…åĢ在æĸ复čŋ‡į¨‹ä¸­ã€‚ åĻ‚æžœæ‚¨å¯šæĸ复感到æģĄæ„īŧŒæ‚¨å¯äģĨįģ§įģ­čŋ›čĄŒīŧŒ äŊ†č¯ˇæŗ¨æ„īŧŒåœ¨åŒæ­Ĩ䚋后īŧŒæ‚¨ä¸čƒŊå†é‡č¯• `fix` å‘Ŋäģ¤äē†īŧ STEP 3 -> æŖ€æŸĨ äŊœä¸ēä¸€éĄšč°¨æ…Žįš„æŖ€æŸĨīŧŒæ‚¨įŽ°åœ¨å¯äģĨčŋčĄŒ `check` å‘Ŋäģ¤īŧŒäģĨįĄŽäŋ æĸå¤įš„įŖį›˜ä¸Šįš„ä¸€åˆ‡éƒŊæ˜¯æ­ŖįĄŽįš„ã€‚ :snapraid -d NAME -a check å…ļ中 NAME æ˜¯įŖį›˜įš„åį§°īŧŒäž‹åĻ‚æˆ‘äģŦ前éĸäž‹å­ä¸­įš„ `d1`。 -d 和 -a é€‰éĄšå‘Šč¯‰ SnapRAID åĒæŖ€æŸĨæŒ‡åŽšįš„įŖį›˜åšļåŋŊį•Ĩ所有åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ æ­¤å‘Ŋäģ¤å°†čŠąč´šåžˆé•ŋæ—ļ间īŧŒäŊ†åĻ‚æžœæ‚¨ä¸æ˜¯čŋ‡äēŽč°¨æ…ŽīŧŒå¯äģĨ莺čŋ‡åŽƒã€‚ STEP 4 -> 同æ­Ĩ čŋčĄŒ `sync` å‘Ŋäģ¤äģĨ将é˜ĩåˆ—ä¸Žæ–°įŖį›˜é‡æ–°åŒæ­Ĩ。 :snapraid sync åĻ‚æžœæ‰€æœ‰å†…åŽšéƒŊ厞æĸ复īŧŒæ­¤å‘Ŋä줿˜¯åŗæ—ļįš„ã€‚ Commands SnapRAID 提䞛äē†ä¸€äē›įŽ€å•įš„å‘Ŋäģ¤īŧŒå…čŽ¸æ‚¨īŧš * 打印é˜ĩåˆ—įš„įŠļ态 -> `status` * 控åˆļįŖį›˜ -> `smart`、`probe`、`up`、`down` * čŋ›čĄŒå¤‡äģŊ/åŋĢį…§ -> `sync` * åŽšæœŸæŖ€æŸĨ数捎 -> `scrub` * æĸ复上æŦĄå¤‡äģŊ/åŋĢį…§ -> `fix`。 å‘Ŋäģ¤åŋ…éĄģį”¨å°å†™å­—æ¯äšĻ写。 status æ‰“å°įŖį›˜é˜ĩ列įŠļæ€įš„æ‘˜čĻã€‚ 厃包æ‹Ŧæœ‰å…ŗåĨ‡åļæ ĄénjįĸŽį‰‡ã€å—æœĒįģæŖ€æŸĨ有多䚅īŧŒäģĨ及在 scrubbing æœŸé—´é‡åˆ°įš„æ‰€æœ‰čŽ°åŊ•įš„é™éģ˜é”™č¯¯įš„äŋĄæ¯ã€‚ æ‰€æäž›įš„äŋĄæ¯æŒ‡įš„æ˜¯æ‚¨ä¸ŠæŦĄčŋčĄŒ `sync` įš„æ—ļ间。 ä¸č€ƒč™‘åŽæĨįš„äŋŽæ”šã€‚ åĻ‚æžœæŖ€æĩ‹åˆ°åå—īŧŒåˆ™äŧšåˆ—å‡ē厃äģŦįš„å—åˇã€‚ čρäŋŽå¤åރäģŦīŧŒæ‚¨å¯äģĨäŊŋᔍ `fix -e` å‘Ŋäģ¤ã€‚ 厃čŋ˜äŧšæ˜žį¤ē一ä¸Ēå›žčĄ¨īŧŒčĄ¨į¤ē每ä¸Ē块上æŦĄčĸĢ scrub 或 sync įš„æ—ļ间。 čĸĢ scrub įš„å—æ˜žį¤ēä¸ē `*`īŧŒåˇ˛åŒæ­ĨäŊ†å°šæœĒ scrub įš„å—æ˜žį¤ēä¸ē `o`。 不äŧšäŋŽæ”šäģģäŊ•内厚。 smart 打印įŗģįģŸä¸­æ‰€æœ‰įŖį›˜įš„ SMART æŠĨ告。 厃包æ‹Ŧ寚明嚴故障æĻ‚įŽ‡įš„äŧ°čŽĄīŧŒå…čŽ¸æ‚¨čŽĄåˆ’æ›´æĸ昞į¤ē å¯į–‘åąžæ€§įš„įŖį›˜čŋ›čĄŒįģ´æŠ¤ã€‚ æ­¤æĻ‚įŽ‡äŧ°čŽĄæ˜¯é€ščŋ‡å°†įŖį›˜įš„ SMART åąžæ€§ä¸Ž Backblaze æäž›įš„äģĨ下数捎čŋ›čĄŒå…ŗč”čŽˇåž—įš„īŧš :https://www.backblaze.com/hard-drive-test-data.html åĻ‚æžœ SMART æŠĨå‘ŠįŖį›˜æ­Ŗåœ¨å‘į”Ÿæ•…éšœīŧŒåˆ™äŧšä¸ēč¯ĨįŖį›˜æ‰“å° `FAIL` 或 `PREFAIL`īŧŒ åšļ且 SnapRAID čŋ”å›žé”™č¯¯ã€‚ 在čŋ™į§æƒ…å†ĩ下īŧŒ**åŧē჈åģē莎**įĢ‹åŗæ›´æĸįŖį›˜ã€‚ å…ļäģ–可čƒŊįš„įŠļ态字įŦĻä¸˛æœ‰īŧš logfail - čŋ‡åŽģīŧŒæŸäē›åąžæ€§äŊŽäēŽé˜ˆå€ŧ。 logerr - čŽžå¤‡é”™č¯¯æ—Ĩåŋ—包åĢé”™č¯¯ã€‚ selferr - čŽžå¤‡č‡ĒæŖ€æ—Ĩåŋ—包åĢé”™č¯¯ã€‚ åĻ‚æžœæŒ‡åŽšäē† -v, --verbose 选项īŧŒåˆ™äŧšæäž›æ›´æˇąå…Ĩįš„įģŸčŽĄåˆ†æžã€‚ 此分析可äģĨå¸ŽåŠŠæ‚¨å†ŗåŽšæ˜¯åĻ需čĻæ›´å¤šæˆ–æ›´å°‘įš„åĨ‡åļæ ĄéĒŒã€‚ æ­¤å‘Ŋäģ¤äŊŋᔍ `smartctl` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ `smartctl -a`。 åĻ‚æžœæ‚¨įš„čŽžå¤‡æœĒæ­ŖįĄŽč‡ĒåŠ¨æŖ€æĩ‹īŧŒæ‚¨å¯äģĨäŊŋį”¨é…įŊŽ æ–‡äģļä¸­įš„ `smartctl` é€‰éĄšæŒ‡åŽšč‡Ē厚䚉å‘Ŋäģ¤ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 probe 打印įŗģįģŸä¸­æ‰€æœ‰įŖį›˜įš„**į”ĩæē**įŠļ态。 `Standby`īŧˆåž…æœēīŧ‰čĄ¨į¤ēįŖį›˜æœĒčŊŦ动。`Active`īŧˆæ´ģ动īŧ‰čĄ¨į¤ē įŖį›˜æ­Ŗåœ¨čŊŦ动。 æ­¤å‘Ŋäģ¤äŊŋᔍ `smartctl` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ `smartctl -n standby -i`。 åĻ‚æžœæ‚¨įš„čŽžå¤‡æœĒæ­ŖįĄŽč‡ĒåŠ¨æŖ€æĩ‹īŧŒæ‚¨å¯äģĨäŊŋį”¨é…įŊŽ æ–‡äģļä¸­įš„ `smartctl` é€‰éĄšæŒ‡åŽšč‡Ē厚䚉å‘Ŋäģ¤ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 up äŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰įŖį›˜čŊŦ动čĩˇæĨ。 您可äģĨäŊŋᔍ -d, --filter-disk 选项åĒå¯åŠ¨į‰šåŽšįš„įŖį›˜ã€‚ 同æ—ļå¯åŠ¨æ‰€æœ‰įŖį›˜éœ€čĻå¤§é‡įš„į”ĩ力。 įĄŽäŋæ‚¨įš„į”ĩæēčƒŊ够æ‰ŋ受。 不äŧšäŋŽæ”šäģģäŊ•内厚。 down äŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰įŖį›˜åœčŊŦ。 æ­¤å‘Ŋäģ¤äŊŋᔍ `smartctl` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ `smartctl -s standby,now`。 您可äģĨäŊŋᔍ -d, --filter-disk 选项åĒ停čŊŦį‰šåŽšįš„įŖį›˜ã€‚ čĻåœ¨å‘į”Ÿé”™č¯¯æ—ļč‡Ē动停čŊŦīŧŒæ‚¨å¯äģĨ将 -s, --spin-down-on-error 选项与äģģäŊ•å…ļäģ–å‘Ŋäģ¤ä¸€čĩˇäŊŋᔍīŧŒčŋ™į›¸åŊ“äēŽåœ¨å‘į”Ÿé”™č¯¯æ—ļ手动čŋčĄŒ `down`。 不äŧšäŋŽæ”šäģģäŊ•内厚。 diff 列å‡ēč‡Ē上æŦĄ `sync` äģĨæĨæ‰€æœ‰åˇ˛äŋŽæ”šã€éœ€čĻé‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒæ•°æŽįš„ 文äģļ。 æ­¤å‘Ŋäģ¤ä¸æŖ€æŸĨ文äģļæ•°æŽīŧŒäģ…æŖ€æŸĨ文äģļæ—ļé—´æˆŗã€å¤§å°å’Œ inode。 列å‡ēæ‰€æœ‰æ›´æ”šįš„æ–‡äģļ后īŧŒäŧšæ˜žį¤ēæ›´æ”šįš„æ‘˜čρīŧŒæŒ‰äģĨ下斚åŧåˆ†įģ„īŧš equal - 文äģļä¸Žäš‹å‰į›¸æ¯”æœĒ更攚。 added - äš‹å‰ä¸å­˜åœ¨ã€åˇ˛æˇģåŠ įš„æ–‡äģļ。 removed - åˇ˛åˆ é™¤įš„æ–‡äģļ。 updated - 大小或æ—ļé—´æˆŗä¸åŒįš„æ–‡äģļīŧŒčĄ¨į¤ē厃äģŦ厞čĸĢäŋŽæ”šã€‚ moved - åœ¨åŒä¸€įŖį›˜ä¸Šį§ģåŠ¨åˆ°ä¸åŒį›ŽåŊ•įš„æ–‡äģļ。 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°ã€æ—ļé—´æˆŗå’Œ inodeīŧŒäŊ†į›ŽåŊ•不同æĨ蝆åˆĢ。 copied - åœ¨į›¸åŒæˆ–ä¸åŒįŖį›˜ä¸Šå¤åˆļįš„æ–‡äģļīŧŒä¸”原始文äģļäģį„ļ存在。 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗčŋ›čĄŒč¯†åˆĢ。 åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™åŋ…éĄģåŽŒæ•´čˇ¯åž„åŒšé…æ‰čƒŊ蝆åˆĢīŧŒč€Œä¸äģ…äģ…æ˜¯å į§°ã€‚ relocated - åœ¨į›¸åŒæˆ–ä¸åŒįŖį›˜ä¸Šį§ģåŠ¨įš„æ–‡äģļīŧŒä¸”原始文äģļ厞æļˆå¤ąã€‚ 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗčŋ›čĄŒč¯†åˆĢ。 åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™åŋ…éĄģåŽŒæ•´čˇ¯åž„åŒšé…æ‰čƒŊ蝆åˆĢ。 ä¸ŽåŒä¸€įŖį›˜ä¸Šįš„ 'moved' 文äģļ不同īŧŒé‡åޚäŊįš„æ–‡äģļå…ˇæœ‰ä¸åŒįš„ inode。 restored - inode 不同äŊ†į›ŽåŊ•ã€åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗåŒšé…įš„æ–‡äģļ。 čŋ™äē›é€šå¸¸æ˜¯åˆ é™¤åŽæĸå¤įš„æ–‡äģļ。 åĻ‚æžœéœ€čρ `sync`īŧŒčŋ›į¨‹čŋ”å›žį ä¸ē 2īŧŒč€Œä¸æ˜¯éģ˜čŽ¤įš„ 0。 čŋ”å›žį  1 ᔍäēŽä¸€čˆŦé”™č¯¯æƒ…å†ĩ。 不äŧšäŋŽæ”šäģģäŊ•内厚。 sync 更新åĨ‡åļæ ĄénjäŋĄæ¯ã€‚č¯ģå–įŖį›˜é˜ĩåˆ—ä¸­æ‰€æœ‰åˇ˛äŋŽæ”šįš„æ–‡äģļīŧŒ åšļæ›´æ–°į›¸åē”įš„åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ 您可äģĨ随æ—ļ按 Ctrl+C 停æ­ĸæ­¤čŋ‡į¨‹īŧŒč€Œä¸äŧšä¸ĸå¤ąåˇ˛åŽŒæˆįš„åˇĨäŊœã€‚ 在下æŦĄčŋčĄŒæ—ļīŧŒ`sync` čŋ‡į¨‹å°†äģŽä¸­æ–­įš„地斚æĸ复。 åĻ‚æžœåœ¨čŋ‡į¨‹ä¸­å‘įŽ°é™éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒ ᛏåē”įš„å—äŧščĸĢæ ‡čްä¸ē坏块。 文äģļ通čŋ‡čˇ¯åž„å’Œ/或 inode 蝆åˆĢīŧŒåšļæŖ€æŸĨ大小和æ—ļé—´æˆŗã€‚ åĻ‚æžœæ–‡äģļ大小或æ—ļé—´æˆŗä¸åŒīŧŒåˆ™äŧšä¸ē整ä¸Ē文äģļé‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åĻ‚æžœæ–‡äģļåœ¨åŒä¸€įŖį›˜ä¸ŠčĸĢį§ģ动或重å‘Ŋ名īŧŒäŋæŒį›¸åŒįš„ inodeīŧŒåˆ™ä¸é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ åĻ‚æžœæ–‡äģļį§ģ动到åĻ一ä¸ĒįŖį›˜īŧŒåˆ™é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄénjīŧŒ äŊ†äŋį•™äģĨå‰čŽĄįŽ—įš„æ•Ŗåˆ—äŋĄæ¯ã€‚ åĻ‚æžœéœ€čρīŧŒäŧšäŋŽæ”š `content` 和 `parity` 文äģļ。 é˜ĩåˆ—ä¸­įš„æ–‡äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ scrub Scrub é˜ĩ列īŧŒæŖ€æŸĨ数捎和åĨ‡åļæ ĄéĒŒįŖį›˜ä¸­įš„é™é옿ˆ–čž“å…Ĩ/输å‡ēé”™č¯¯ã€‚ 每æŦĄč°ƒį”¨æŖ€æŸĨ大įēĻ 8% įš„é˜ĩ列īŧŒæŽ’除在čŋ‡åŽģ 10 夊内 厞čĸĢ scrub įš„æ•°æŽã€‚ čŋ™æ„å‘ŗį€æ¯å‘¨ scrub 一æŦĄå¯įĄŽäŋæ¯éš”三ä¸Ēæœˆč‡ŗå°‘æŖ€æŸĨ一æŦĄæ•°æŽįš„æ¯ä¸€äŊã€‚ 您可äģĨäŊŋᔍ -p, --plan é€‰éĄšåŽšäš‰ä¸åŒįš„ scrub čŽĄåˆ’æˆ–æ•°é‡īŧŒ č¯Ĩ选项æŽĨ受īŧš bad - Scrub æ ‡čŽ°ä¸ēåå—įš„å—ã€‚ new - Scrub 刚刚同æ­ĨäŊ†å°šæœĒ scrub įš„å—ã€‚ full - Scrub 所有内厚。 0-100 - Scrub æŒ‡åŽšį™žåˆ†æ¯”įš„å—ã€‚ åĻ‚æžœæŒ‡åŽšäē†į™žåˆ†æ¯”数量īŧŒæ‚¨čŋ˜å¯äģĨäŊŋᔍ -o, --older-than 选项æĨ厚䚉块åē”č¯Ĩ有多旧。 æœ€æ—§įš„å—éĻ–å…ˆčĸĢ scrubīŧŒįĄŽäŋæœ€äŊŗæŖ€æŸĨ。 åĻ‚æžœæ‚¨åĒæƒŗ scrub 刚刚同æ­ĨäŊ†å°šæœĒ scrub įš„å—īŧŒ 蝎äŊŋᔍ `-p new` é€‰éĄšã€‚ čĻčŽˇå– scrub įŠļæ€įš„č¯Ļįģ†äŋĄæ¯īŧŒč¯ˇäŊŋᔍ `status` å‘Ŋäģ¤ã€‚ 寚äēŽå‘įŽ°įš„äģģäŊ•静éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒį›¸åē”įš„å— äŧšåœ¨ `content` 文äģļ中čĸĢæ ‡čްä¸ē坏块。 čŋ™äē›åå—列在 `status` 中īŧŒå¯äģĨäŊŋᔍ `fix -e` äŋŽå¤ã€‚ äŋŽå¤åŽīŧŒåœ¨ä¸‹æŦĄ scrub æ—ļīŧŒåރäģŦ将čĸĢé‡æ–°æŖ€æŸĨīŧŒåĻ‚æžœå‘įŽ°åˇ˛æ›´æ­ŖīŧŒ 则äŧšåˆ é™¤åå—æ ‡čŽ°ã€‚ čρäģ… scrub 坏块īŧŒæ‚¨å¯äģĨäŊŋᔍ `scrub -p bad` å‘Ŋäģ¤ã€‚ åģē莎äģ…åœ¨åˇ˛åŒæ­Ĩįš„é˜ĩ列上čŋčĄŒ `scrub`īŧŒäģĨéŋ免 į”ąæœĒ同æ­Ĩ数捎åŧ•čĩˇįš„æŠĨå‘Šé”™č¯¯ã€‚čŋ™äē›é”™č¯¯čĸĢ蝆åˆĢä¸ē不是静éģ˜é”™č¯¯īŧŒ åšļ且块不äŧščĸĢæ ‡čްä¸ē坏块īŧŒäŊ†æ­¤įąģ错蝝äŧšåœ¨å‘Ŋäģ¤įš„čž“å‡ē中æŠĨ告。 `content` 文äģļäŧščĸĢäŋŽæ”šäģĨ更新每ä¸Ē块上æŦĄæŖ€æŸĨįš„æ—ļ间 åšļæ ‡čŽ°åå—ã€‚ `parity` 文äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ é˜ĩåˆ—ä¸­įš„æ–‡äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ fix äŋŽå¤æ‰€æœ‰æ–‡äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ 所有文äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽéƒŊ与上æŦĄ `sync` 中äŋå­˜įš„åŋĢį…§ įŠļ态čŋ›čĄŒæ¯”čžƒã€‚ åĻ‚æžœå‘įŽ°åˇŽåŧ‚īŧŒåˆ™å°†å…￁ĸå¤åˆ°å­˜å‚¨įš„åŋĢį…§ã€‚ **č­Ļ告īŧ** `fix` å‘Ŋäģ¤ä¸åŒēåˆ†é”™č¯¯å’Œ 故意äŋŽæ”šã€‚åރ**æ— æĄäģļ地**将文äģļįŠļ态æĸ复到上æŦĄ `sync`。 åĻ‚æžœæœĒ指厚å…ļäģ–选饚īŧŒåˆ™å¤„į†æ•´ä¸Ēé˜ĩ列。 äŊŋᔍčŋ‡æģ¤é€‰éĄšé€‰æ‹ŠčĻæ“äŊœįš„æ–‡äģ￈–įŖį›˜įš„å­é›†ã€‚ čρäģ…äŋŽå¤åœ¨ `sync` 和 `scrub` æœŸé—´æ ‡čŽ°ä¸ēåå—įš„å—īŧŒ 蝎äŊŋᔍ -e, --filter-error é€‰éĄšã€‚ 与å…ļäģ–čŋ‡æģ¤é€‰éĄšä¸åŒīŧŒæ­¤é€‰éĄšäģ…寚č‡Ē上æŦĄ `sync` äģĨæĨæœĒæ›´æ”šįš„ 文äģļåē”ᔍäŋŽå¤ã€‚ SnapRAID äŧšé‡å‘Ŋåæ‰€æœ‰æ— æŗ•äŋŽå¤įš„æ–‡äģļīŧŒåšļæˇģ加 `.unrecoverable` æ‰Šåą•åã€‚ 在äŋŽå¤äš‹å‰īŧŒäŧšæ‰Ģ描整ä¸Ēé˜ĩ列äģĨæŸĨ扞č‡Ē上æŦĄ `sync` 操äŊœäģĨæĨį§ģåŠ¨įš„äģģäŊ•æ–‡äģļ。 čŋ™ä盿–‡äģļ通čŋ‡åރäģŦįš„æ—ļé—´æˆŗč¯†åˆĢīŧŒåŋŊį•Ĩ厃äģŦįš„åį§° å’Œį›ŽåŊ•īŧŒåšļ在åŋ…čρæ—ļᔍäēŽæĸ复čŋ‡į¨‹ã€‚ åĻ‚æžœæ‚¨å°†å…ļ中一äē›į§ģ到äē†é˜ĩ列䚋外īŧŒæ‚¨å¯äģĨäŊŋᔍ -i, --import é€‰éĄšæŒ‡åŽšéĸå¤–įš„į›ŽåŊ•čŋ›čĄŒæ‰Ģ描。 文äģļäģ…通čŋ‡čˇ¯åž„蝆åˆĢīŧŒč€Œä¸é€ščŋ‡ inode 蝆åˆĢ。 `content` 文äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ åĻ‚æžœéœ€čρīŧŒ`parity` 文äģļäŧščĸĢäŋŽæ”šã€‚ åĻ‚æžœéœ€čρīŧŒé˜ĩåˆ—ä¸­įš„æ–‡äģļäŧščĸĢäŋŽæ”šã€‚ check éĒŒč¯æ‰€æœ‰æ–‡äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åŽƒįš„åˇĨäŊœæ–šåŧįąģäŧŧäēŽ `fix`īŧŒäŊ†åރåĒæ¨Ąæ‹Ÿæĸ复īŧŒ**不äŧš**寚é˜ĩ列 写å…ĨäģģäŊ•更攚。 æ­¤å‘Ŋäģ¤ä¸ģčρᔍäēŽæ‰‹åЍénj蝁īŧŒ 例åĻ‚åœ¨æĸ复čŋ‡į¨‹äš‹åŽæˆ–在å…ļäģ–į‰šæŽŠæĄäģļ下。 寚äēŽåŽšæœŸå’ŒčŽĄåˆ’įš„æŖ€æŸĨīŧŒč¯ˇäŊŋᔍ `scrub`。 åĻ‚æžœæ‚¨äŊŋᔍ -a, --audit-only 选项īŧŒåˆ™äģ…æŖ€æŸĨ文äģļ æ•°æŽæ•Ŗåˆ—īŧŒč€ŒåŋŊį•ĨåĨ‡åļæ ĄéĒŒæ•°æŽīŧŒäģĨ加åŋĢčŋčĄŒé€ŸåēĻ。 文äģļäģ…通čŋ‡čˇ¯åž„蝆åˆĢīŧŒč€Œä¸é€ščŋ‡ inode 蝆åˆĢ。 不äŧšäŋŽæ”šäģģäŊ•内厚。 list 列å‡ē上æŦĄ `sync` æ—ļé˜ĩ列中包åĢįš„æ‰€æœ‰æ–‡äģļ。 äŊŋᔍ -v 或 --verboseīŧŒčŋ˜äŧšæ˜žį¤ēäēšį§’įē§æ—ļ间。 不äŧšäŋŽæ”šäģģäŊ•内厚。 dup 列å‡ē所有重复文äģļ。åĻ‚æžœä¸¤ä¸Ē文äģļįš„æ•Ŗåˆ—åŒšé…īŧŒåˆ™čޤä¸ē厃äģŦį›¸į­‰ã€‚ 不č¯ģ取文äģļæ•°æŽīŧ›äģ…äŊŋᔍéĸ„å…ˆčŽĄįŽ—įš„æ•Ŗåˆ—ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 pool 在 `pooling` į›ŽåŊ•中创åģ翈–æ›´æ–°įŖį›˜é˜ĩ列中所有文äģļ įš„č™šæ‹Ÿč§†å›žã€‚ 文äģļ不äŧščĸĢ复åˆļīŧŒč€Œæ˜¯äŊŋᔍįŦĻåˇé“žæŽĨčŋžæŽĨ。 更新æ—ļīŧŒæ‰€æœ‰įŽ°æœ‰įš„įŦĻåˇé“žæŽĨ和įŠē å­į›ŽåŊ•éƒŊäŧščĸĢ删除īŧŒåšļæ›ŋæĸä¸ēé˜ĩåˆ—įš„æ–°č§†å›žã€‚ äģģäŊ•å…ļäģ–å¸¸č§„æ–‡äģļäŋį•™åœ¨åŽŸäŊã€‚ 不äŧšäŋŽæ”š pool į›ŽåŊ•äš‹å¤–įš„äģģäŊ•内厚。 devices 打印é˜ĩ列äŊŋį”¨įš„äŊŽįē§čŽžå¤‡ã€‚ æ­¤å‘Ŋä줿˜žį¤ēé˜ĩåˆ—ä¸­įš„čŽžå¤‡å…ŗč”īŧŒä¸ģčρᔍäŊœč„šæœŦæŽĨåŖã€‚ 前两列是äŊŽįē§čŽžå¤‡ ID å’Œčˇ¯åž„ã€‚ æŽĨ下æĨįš„ä¸¤åˆ—æ˜¯é̘įē§čŽžå¤‡ ID å’Œčˇ¯åž„ã€‚ 最后一列是é˜ĩåˆ—ä¸­įš„įŖį›˜åį§°ã€‚ 在大多数情å†ĩ下īŧŒé˜ĩåˆ—ä¸­įš„æ¯ä¸ĒįŖį›˜éƒŊ有一ä¸ĒäŊŽįē§čŽžå¤‡īŧŒ äŊ†åœ¨ä¸€ä盿›´å¤æ‚įš„é…įŊŽä¸­īŧŒå•ä¸Ēé˜ĩåˆ—įŖį›˜å¯čƒŊäŧšäŊŋį”¨å¤šä¸Ē äŊŽįē§čŽžå¤‡ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 touch ä¸ē所有äēšį§’įē§æ—ļé—´æˆŗčŽžįŊŽä¸ēé›ļįš„æ–‡äģļ莞įŊŽä¸€ä¸Ēäģģæ„įš„ äēšį§’įē§æ—ļé—´æˆŗã€‚ čŋ™æé̘äē† SnapRAID 蝆åˆĢį§ģ动和复åˆļ文äģļįš„čƒŊ力īŧŒ 因ä¸ē厃äŊŋæ—ļé—´æˆŗå‡ äšŽį‹Ŧ一无äēŒīŧŒå‡å°‘äē†å¯čƒŊįš„é‡å¤ã€‚ æ›´å…ˇäŊ“åœ°č¯´īŧŒåĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ä¸ēé›ļīŧŒ 则į§ģ动或复åˆļįš„æ–‡äģļåœ¨åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗåŒšé…æ—ļčĸĢ蝆åˆĢä¸ē æ­¤įąģ。åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™äģ…åŊ“åŽŒæ•´čˇ¯åž„ã€ 大小和æ—ļé—´æˆŗéƒŊ匚配æ—ļ才čĸĢ视ä¸ē副æœŦ。 不äŧšäŋŽæ”šį§’į˛žåēĻæ—ļé—´æˆŗīŧŒ 因此äŧšäŋį•™æ–‡äģļįš„æ‰€æœ‰æ—Ĩ期和æ—ļ间。 rehash 厉排寚整ä¸Ēé˜ĩ列čŋ›čĄŒé‡æ–°æ•Ŗåˆ—。 æ­¤å‘Ŋä줿›´æ”šäŊŋį”¨įš„æ•Ŗåˆ—įąģ型īŧŒé€šå¸¸æ˜¯åœ¨äģŽ 32 äŊįŗģįģŸå‡įē§åˆ° 64 äŊįŗģį쟿—ļīŧŒ äģĨäģŽ MurmurHash3 切æĸ到更åŋĢįš„ SpookyHash。 åĻ‚æžœæ‚¨åˇ˛įģåœ¨äŊŋį”¨æœ€äŊŗæ•Ŗåˆ—īŧŒåˆ™æ­¤å‘Ŋäģ¤ä¸æ‰§čĄŒäģģäŊ•操äŊœīŧŒ åšļ通įŸĨæ‚¨æ— éœ€æ‰§čĄŒäģģäŊ•操äŊœã€‚ é‡æ–°æ•Ŗåˆ—ä¸äŧšįĢ‹åŗæ‰§čĄŒīŧŒč€Œæ˜¯åœ¨ `sync` 和 `scrub` 期间 逐æ­Ĩčŋ›čĄŒã€‚ 您可äģĨäŊŋᔍ `status` æŖ€æŸĨé‡æ–°æ•Ŗåˆ—įŠļ态。 åœ¨é‡æ–°æ•Ŗåˆ—æœŸé—´īŧŒSnapRAID äŋæŒåŽŒå…¨åŠŸčƒŊīŧŒ å”¯ä¸€įš„äž‹å¤–æ˜¯ `dup` æ— æŗ•äŊŋį”¨ä¸åŒįš„æ•Ŗåˆ—æŖ€æĩ‹é‡å¤įš„æ–‡äģļ。 locate æŸĨæ‰žå­˜å‚¨åœ¨æ ĄéĒŒį›˜ä¸­įš„æ–‡äģļ。寚äēŽæ¯ä¸ĒåŒšé…įš„æ–‡äģļīŧŒåރäŧšæ‰“å°å…ļåœ¨æ ĄéĒŒæ–‡äģļä¸­įš„äŊįŊŽ äģĨåŠå į”¨įš„åˆ†į‰‡æ•°é‡ã€‚ 您可äģĨäŊŋᔍ -t, --tail é€‰éĄšå°†æ“äŊœé™åˆļåœ¨å į”¨æ ĄéĒŒį›˜æŒ‡åŽšå°žéƒ¨éƒ¨åˆ†įš„ 文äģļ上。 åĻ‚æžœæ‚¨æƒŗé‡æ–°åˆ†é…čŋ™ä盿–‡äģļīŧŒå¯äģĨäŊŋᔍ -W, --force-realloc-tail é€‰éĄšã€‚ č¯ˇæŗ¨æ„īŧŒåœ¨é‡æ–°åˆ†é…čŋ‡į¨‹ä¸­īŧŒæ­¤įąģ文äģļå°†ä¸å—æ ĄénjäŋæŠ¤ã€‚ Options SnapRAID 提䞛äģĨ下选项īŧš -c, --conf CONFIG 选拊čρäŊŋį”¨įš„é…įŊŽæ–‡äģļ。åĻ‚æžœæœĒ指厚īŧŒåœ¨ Unix 中īŧŒ åĻ‚æžœå­˜åœ¨īŧŒåˆ™äŊŋį”¨æ–‡äģļ `/usr/local/etc/snapraid.conf`īŧŒ åĻ则äŊŋᔍ `/etc/snapraid.conf`。 在 Windows 中īŧŒåރäŊŋį”¨ä¸Ž `snapraid.exe` į›¸åŒįš„į›ŽåŊ•ä¸­įš„æ–‡äģļ `snapraid.conf`。 -f, --filter PATTERN čŋ‡æģ¤čρ圍 `check` 和 `fix` ä¸­å¤„į†įš„æ–‡äģļ。 äģ…å¤„į†ä¸ŽæŒ‡åŽšæ¨ĄåŧåŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ æœ‰å…ŗæ¨Ąåŧč§„čŒƒįš„æ›´å¤šč¯Ļįģ†äŋĄæ¯īŧŒč¯ˇå‚阅 PATTERN 部分。 在 Unix 中īŧŒåĻ‚æžœäŊŋᔍ globbing 字įŦĻīŧŒč¯ˇįĄŽäŋåރäģŦčĸĢåŧ•į”¨ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 `sync` 和 `scrub` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 -d, --filter-disk NAME čŋ‡æģ¤čρ圍 `check`、`fix`、`up` 和 `down` ä¸­å¤„į†įš„įŖį›˜ã€‚ 您åŋ…éĄģ指厚配įŊŽæ–‡äģļä¸­åŽšäš‰įš„įŖį›˜åį§°ã€‚ 您䚟可äģĨ指厚åĨ‡åļæ ĄéĒŒįŖį›˜įš„åį§°īŧš`parity`、`2-parity`、 `3-parity` į­‰īŧŒäģĨ将操äŊœé™åˆļåˆ°į‰šåŽšįš„åĨ‡åļæ ĄéĒŒįŖį›˜ã€‚ åĻ‚æžœæ‚¨įģ„合äŊŋį”¨å¤šä¸Ē --filter、--filter-disk 和 --filter-missing 选项īŧŒ 则äģ…选拊与所有čŋ‡æģ¤å™¨åŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `check`、`fix`、`up` 和 `down` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 `sync` 和 `scrub` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 -m, --filter-missing čŋ‡æģ¤čρ圍 `check` 和 `fix` ä¸­å¤„į†įš„æ–‡äģļ。 äģ…处ᐆé˜ĩ列中ä¸ĸå¤ąæˆ–åˇ˛åˆ é™¤įš„æ–‡äģļ。 与 `fix` 一čĩˇäŊŋᔍæ—ļīŧŒæ­¤é€‰éĄšå……åŊ“ `undelete` å‘Ŋäģ¤ã€‚ åĻ‚æžœæ‚¨įģ„合äŊŋį”¨å¤šä¸Ē --filter、--filter-disk 和 --filter-missing 选项īŧŒ 则äģ…选拊与所有čŋ‡æģ¤å™¨åŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 `sync` 和 `scrub` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 -e, --filter-error 处ᐆ `check` 和 `fix` ä¸­æœ‰é”™č¯¯įš„æ–‡äģļ。 厃äģ…å¤„į†åœ¨ `sync` 和 `scrub` 期间块čĸĢæ ‡čްä¸ē静é옿ˆ–čž“å…Ĩ/输å‡ēé”™č¯¯įš„ 文äģļīŧŒåĻ‚ `status` 中所列。 æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ -p, --plan PERC|bad|new|full 选拊 scrub čŽĄåˆ’ã€‚åĻ‚æžœ PERC 是一ä¸Ēäģ‹äēŽ 0 到 100 äš‹é—´įš„æ•°å€ŧīŧŒ 则将å…ļč§Ŗé‡Šä¸ēčρ scrub įš„å—įš„į™žåˆ†æ¯”ã€‚ 除äē†į™žåˆ†æ¯”īŧŒæ‚¨čŋ˜å¯äģĨ指厚一ä¸ĒčŽĄåˆ’īŧš `bad` scrub 坏块īŧŒ`new` scrub 尚æœĒ scrub įš„å—īŧŒ `full` scrub 所有内厚。 æ­¤é€‰éĄšåĒčƒŊ与 `scrub` 一čĩˇäŊŋį”¨ã€‚ -o, --older-than DAYS 选拊čρ圍 `scrub` ä¸­å¤„į†įš„é˜ĩåˆ—įš„æœ€æ—§éƒ¨åˆ†ã€‚ DAYS 是块čĸĢ scrub įš„æœ€å°å¤Šæ•°īŧ›éģ˜čޤå€ŧä¸ē 10。 无čŽēæ­¤é€‰éĄšåĻ‚äŊ•īŧŒæ ‡čްä¸ēåå—įš„å—å§‹įģˆäŧščĸĢ scrub。 æ­¤é€‰éĄšåĒčƒŊ与 `scrub` 一čĩˇäŊŋį”¨ã€‚ -a, --audit-only 在 `check` 中īŧŒéĒŒč¯æ–‡äģļįš„æ•Ŗåˆ—č€Œä¸ æŖ€æŸĨåĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åĻ‚æžœæ‚¨åĒå¯šæŖ€æŸĨ文äģļæ•°æŽæ„Ÿå…´čļŖīŧŒæ­¤é€‰éĄšå¯äģĨæ˜žč‘—åŠ åŋĢ æŖ€æŸĨčŋ‡į¨‹ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `check` 一čĩˇäŊŋį”¨ã€‚ -h, --pre-hash 在 `sync` 中īŧŒčŋčĄŒæ‰€æœ‰æ–°æ•°æŽįš„初æ­Ĩæ•Ŗåˆ—é˜ļæŽĩīŧŒ äģĨäžŋ在åĨ‡åļæ ĄéĒŒčŽĄįŽ—äš‹å‰čŋ›čĄŒéĸå¤–éĒŒč¯ã€‚ 通常īŧŒåœ¨ `sync` 中īŧŒä¸čŋ›čĄŒåˆæ­Ĩæ•Ŗåˆ—īŧŒåšļ且新 数捎äģ…在éĻ–æŦĄč¯ģ取čŋ›čĄŒåĨ‡åļæ ĄéĒŒčŽĄįŽ—äš‹å‰æ•Ŗåˆ—ã€‚ æ­¤čŋ‡į¨‹åœ¨įŗģįģŸå¤„äēŽ é‡č´ŸčŊŊä¸‹å‘į”ŸīŧŒæ‰€æœ‰įŖį›˜éƒŊ在čŊŦ动īŧŒCPU 䚟垈åŋ™ã€‚ čŋ™å¯šæœē器æĨč¯´æ˜¯ä¸€į§æžįĢ¯æƒ…å†ĩīŧŒåĻ‚æžœåŽƒæœ‰æŊœåœ¨įš„įĄŦäģļ问éĸ˜īŧŒ 静éģ˜é”™č¯¯å¯čƒŊæ— æŗ•čĸĢæŖ€æĩ‹åˆ°īŧŒå› ä¸ē数捎尚æœĒæ•Ŗåˆ—ã€‚ ä¸ēéŋå…æ­¤éŖŽé™ŠīŧŒæ‚¨å¯äģĨ吝ᔍ `pre-hash` æ¨ĄåŧīŧŒå°† 所有数捎č¯ģ取两æŦĄäģĨįĄŽäŋå…ļ厌整性。 æ­¤é€‰éĄščŋ˜äŧšénj蝁é˜ĩ列内į§ģåŠ¨įš„æ–‡äģļīŧŒ äģĨįĄŽäŋį§ģ动操äŊœæˆåŠŸīŧŒåšļ在åŋ…čρæ—ļ å…čŽ¸æ‚¨åœ¨įģ§įģ­äš‹å‰čŋčĄŒ fix 操äŊœã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -i, --import DIR äģŽæŒ‡åŽšį›ŽåŊ•å¯ŧå…Ĩč‡Ē上æŦĄ `sync` äģĨæĨäģŽé˜ĩåˆ—ä¸­åˆ é™¤įš„äģģäŊ•æ–‡äģļ。 åĻ‚æžœæ‚¨äģį„ļæ‹Ĩ有此įąģ文äģļīŧŒåރäģŦå¯į”¨äēŽ `check` 和 `fix` äģĨ攚čŋ›æĸ复čŋ‡į¨‹ã€‚ č¯ģ取文äģļīŧŒåŒ…æ‹Ŧåœ¨å­į›ŽåŊ•中īŧŒåšļ且无čŽēå…ļåį§°åĻ‚äŊ•éƒŊäŧščĸĢ蝆åˆĢ。 æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ -s, --spin-down-on-error 在äģģäŊ•é”™č¯¯å‘į”Ÿæ—ļīŧŒåœ¨é€€å‡ēåšļå¸Ļ有非é›ļįŠļæ€į äš‹å‰īŧŒ å°†æ‰€æœ‰æ‰˜įŽĄįš„įŖį›˜åœčŊŦ。čŋ™å¯äģĨ防æ­ĸéŠąåŠ¨å™¨åœ¨ä¸­æ­ĸ操äŊœåŽ äŋæŒæ´ģ动和čŊŦ动īŧŒæœ‰åŠŠäēŽéŋ免不åŋ…čĻįš„įƒ­é‡į§¯čšå’ŒåŠŸč€—ã€‚ äŊŋį”¨æ­¤é€‰éĄšå¯įĄŽäŋåŗäŊŋå‘Ŋäģ¤å¤ąč´ĨīŧŒįŖį›˜äšŸčƒŊ厉全停æ­ĸ。 -w, --bw-limit RATE å¯šæ‰€æœ‰įŖį›˜åē”į”¨å…¨åą€å¸ĻåŽŊ限åˆļ。RATE 是 æ¯į§’įš„å­—čŠ‚æ•°ã€‚æ‚¨å¯äģĨ指厚䚘数īŧŒäž‹åĻ‚ K、M 或 G īŧˆäž‹åĻ‚īŧŒ--bw-limit 1Gīŧ‰ã€‚ -t, --tail 大小 将文äģļåˆ—čĄ¨é™åˆļä¸ē邪äē›äŊŋį”¨æ ĄéĒŒį›˜æŒ‡åŽšå°žéƒ¨å¤§å°äģĨå†…įš„æ–‡äģļ。 您可äģĨäŊŋį”¨äš˜æ•°īŧŒåĻ‚ K、M、G 或 Tīŧˆäž‹åĻ‚ --tail 1Gīŧ‰ã€‚ æ­¤é€‰éĄšäģ…在与 `locate` å‘Ŋäģ¤é…åˆäŊŋᔍæ—ļ有效。 -A, --stats å¯į”¨æ‰Šåą•įŠļæ€č§†å›žīŧŒæ˜žį¤ē附加äŋĄæ¯ã€‚ åąåš•æ˜žį¤ē两ä¸Ēå›žčĄ¨īŧš įŦŦ一ä¸Ēå›žčĄ¨æ˜žį¤ē每ä¸ĒįŖį›˜įš„įŧ“å†˛æĄå¸Ļ数īŧŒäģĨ及 åŊ“å‰æ­Ŗåœ¨č¯ĨįŖį›˜ä¸ŠčŽŋé—Žįš„æ–‡äģļįš„æ–‡äģļčˇ¯åž„ã€‚ 通常īŧŒæœ€æ…ĸįš„įŖį›˜å°†æ˛Ąæœ‰å¯į”¨įŧ“冞åŒēīŧŒ čŋ™å†ŗåޚäē†å¯čžžåˆ°įš„æœ€å¤§å¸ĻåŽŊ。 įŦŦäēŒä¸Ēå›žčĄ¨æ˜žį¤ē在čŋ‡åŽģ 100 į§’å†…į­‰åž…æ‰€čŠąč´šįš„æ—ļé—´į™žåˆ†æ¯”ã€‚ éĸ„čŽĄæœ€æ…ĸįš„įŖį›˜äŧšå¯ŧč‡´å¤§éƒ¨åˆ†į­‰åž…æ—ļ间īŧŒ 而å…ļäģ–įŖį›˜åē”č¯ĨåĒæœ‰åžˆå°‘æˆ–æ˛Ąæœ‰į­‰åž…æ—ļ间īŧŒ 因ä¸ē厃äģŦ可äģĨäŊŋᔍįŧ“å†˛æĄå¸Ļ。 æ­¤å›žčĄ¨čŋ˜æ˜žį¤ēäē†į­‰åž…æ•Ŗåˆ—čŽĄįŽ—å’Œ RAID čŽĄįŽ—æ‰€čŠąč´šįš„æ—ļ间。 æ‰€æœ‰čŽĄįŽ—éƒŊä¸ŽįŖį›˜æ“äŊœåšļ行čŋčĄŒã€‚ 因此īŧŒåĒčρ臺少䏀ä¸ĒįŖį›˜æœ‰å¯æĩ‹é‡įš„į­‰åž…æ—ļ间īŧŒ å°ąčĄ¨æ˜Ž CPU čļŗå¤ŸåŋĢīŧŒčƒŊ够莟䏊åˇĨäŊœč´ŸčŊŊ。 -Z, --force-zero åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩ操äŊœīŧšåŒæ­Ĩ大小ä¸ēé›ļäŊ†äģĨ前非é›ļįš„æ–‡äģļ。 åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°čŋ™į§æƒ…å†ĩīŧŒåރäŧšåœæ­ĸčŋ›čĄŒīŧŒ é™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨčŊģæžæŖ€æĩ‹åˆ°åœ¨įŗģįģŸå´ŠæēƒåŽīŧŒ 某äē›čŽŋé—Žįš„æ–‡äģļčĸĢæˆĒæ–­įš„æƒ…å†ĩ。 čŋ™åœ¨å¸Ļ有 ext3/ext4 文äģļįŗģįģŸįš„ Linux ä¸­æ˜¯ä¸€į§å¯čƒŊįš„æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -E, --force-empty åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩ操äŊœīŧšåŒæ­Ĩ所有原始文äģļä¸ĸå¤ąįš„įŖį›˜ã€‚ åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°įŖį›˜ä¸Šæœ€åˆå­˜åœ¨įš„æ‰€æœ‰æ–‡äģļéƒŊä¸ĸå¤ąæˆ–čĸĢ重写īŧŒ 厃äŧšåœæ­ĸčŋ›čĄŒīŧŒé™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨčŊģæžæŖ€æĩ‹åˆ°æ•°æŽæ–‡äģļįŗģį쟿œĒ挂čŊŊįš„æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -U, --force-uuid åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩã€æŖ€æŸĨ和äŋŽå¤æ“äŊœīŧŒåŊ“įŖį›˜æ›´æ”šäē†åރäģŦįš„ UUID æ—ļ。 åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°æŸäē›įŖį›˜æ›´æ”šäē† UUIDīŧŒ 厃äŧšåœæ­ĸčŋ›čĄŒīŧŒé™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨæŖ€æĩ‹åˆ°æ‚¨įš„įŖį›˜čĸĢæŒ‚čŊŊ在 é”™č¯¯įš„æŒ‚čŊŊį‚šįš„æƒ…å†ĩ。 äŊ†æ˜¯īŧŒå…čŽ¸åœ¨å•åĨ‡åļæ ĄéĒŒä¸‹čŋ›čĄŒå•ä¸Ē UUID 更攚īŧŒ 在多åĨ‡åļæ ĄéĒŒä¸‹čŋ›čĄŒæ›´å¤šæ›´æ”šīŧŒå› ä¸ēčŋ™æ˜¯æĸ复后更æĸįŖį›˜æ—ļįš„æ­Ŗå¸¸æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 `sync`、`check` 或 `fix` 一čĩˇäŊŋį”¨ã€‚ -D, --force-device åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„äŋŽå¤æ“äŊœīŧŒåŊ“įŖį›˜æ— æŗ•čŽŋ闎或äŊäēŽåŒä¸€į‰Šį†čŽžå¤‡ä¸Šæ—ļ。 例åĻ‚īŧŒåĻ‚æžœæ‚¨ä¸ĸå¤ąäē†ä¸¤ä¸Ēæ•°æŽįŖį›˜īŧŒåšļ且有一ä¸Ēå¤‡į”¨įŖį›˜ åĒčƒŊæĸ复įŦŦ一ä¸ĒīŧŒæ‚¨å¯äģĨåŋŊį•ĨįŦŦäēŒä¸Ēæ— æŗ•čŽŋé—Žįš„įŖį›˜ã€‚ æˆ–č€…īŧŒåĻ‚æžœæ‚¨æƒŗåœ¨åˇ˛äŊŋį”¨įš„įŖį›˜ä¸Šå‰ŠäŊ™įš„å¯į”¨įŠē间中æĸ复一ä¸ĒįŖį›˜īŧŒ å…ąäēĢåŒä¸€į‰Šį†čŽžå¤‡ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `fix` 一čĩˇäŊŋį”¨ã€‚ -N, --force-nocopy 在 `sync`、`check` 和 `fix` 中īŧŒįĻį”¨å¤åˆļæŖ€æĩ‹å¯å‘åŧã€‚ åĻ‚æžœæ˛Ąæœ‰æ­¤é€‰éĄšīŧŒSnapRAID å‡åŽšå…ˇæœ‰į›¸åŒåąžæ€§īŧˆäž‹åĻ‚åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗīŧ‰ įš„æ–‡äģ￘¯å…ˇæœ‰į›¸åŒæ•°æŽįš„副æœŦ。 čŋ™å…čޏ蝆åˆĢäģŽä¸€ä¸ĒįŖį›˜į§ģ动到åĻ一ä¸ĒįŖį›˜įš„å¤åˆļ或į§ģåŠ¨įš„æ–‡äģļīŧŒ åšļé‡į”¨åˇ˛čŽĄįŽ—įš„æ•Ŗåˆ—äŋĄæ¯äģĨæŖ€æĩ‹é™éģ˜é”™č¯¯æˆ–æĸ复ä¸ĸå¤ąįš„æ–‡äģļ。 在某äē›įŊ•č§įš„æƒ…å†ĩ下īŧŒæ­¤čĄŒä¸ē可čƒŊå¯ŧ致蝝æŠĨ æˆ–į”ąäēŽčŽ¸å¤šæ•Ŗåˆ—éĒŒč¯č€Œå¯ŧ致čŋ‡į¨‹įŧ“æ…ĸīŧŒæ­¤é€‰éĄšå…čŽ¸æ‚¨č§Ŗå†ŗæ­¤įąģ问éĸ˜ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync`、`check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ -F, --force-full 在 `sync` 中īŧŒåŧēåˆļåŽŒå…¨é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ åŊ“您æˇģåŠ æ–°įš„åĨ‡åļæ Ąénjįē§åˆĢ或åĻ‚æžœäŊŋį”¨čžƒæ–°įš„åĨ‡åļæ ĄéĒŒæ•°æŽæĸå¤åˆ°æ—§įš„å†…åŽšæ–‡äģļæ—ļīŧŒ 可äģĨäŊŋį”¨æ­¤é€‰éĄšã€‚ čŋ™å…čŽ¸æ‚¨é‡į”¨å†…åŽšæ–‡äģļä¸­å­˜åœ¨įš„æ•Ŗåˆ—æĨéĒŒč¯æ•°æŽīŧŒ åšļäŊŋį”¨įŽ°æœ‰åĨ‡åļæ ĄéĒŒæ•°æŽåœ¨ `sync` čŋ‡į¨‹ä¸­äŋæŒæ•°æŽäŋæŠ¤īŧŒ č€Œä¸æ˜¯äģŽå¤´åŧ€å§‹é‡æ–°åˆ›åģēåĨ‡åļæ ĄéĒŒã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -R, --force-realloc 在 `sync` 中īŧŒåŧēåˆļ厌全重新分配文äģļåšļ重åģēåĨ‡åļæ ĄéĒŒã€‚ æ­¤é€‰éĄšå¯į”¨äēŽåŽŒå…¨é‡æ–°åˆ†é…æ‰€æœ‰æ–‡äģļīŧŒ æļˆé™¤įĸŽį‰‡īŧŒåŒæ—ļé‡į”¨å†…åŽšæ–‡äģļä¸­å­˜åœ¨įš„æ•Ŗåˆ—æĨéĒŒč¯æ•°æŽã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čρäŊŋį”¨åŽƒã€‚ 在 `sync` 操äŊœæœŸé—´īŧŒæ‚¨**æ˛Ąæœ‰**数捎äŋæŠ¤ã€‚ -W, --force-realloc-tail 大小 åˇĨäŊœæ–šåŧįąģäŧŧäēŽ -R, --force-reallocīŧŒäŊ†äģ…限äēŽæ¯ä¸Ēæ ĄéĒŒæ–‡äģļįš„ 指厚尞部部分īŧˆæœ€åŽâ€œå¤§å°â€å­—节īŧ‰ã€‚ 厃äŧšåŧēåˆļ重新分配īŧˆį§ģ动īŧ‰åŊ“前存储在č¯Ĩå°žéƒ¨éƒ¨åˆ†įš„äģģäŊ•æ–‡äģļåˆ†į‰‡/块īŧŒ å…čŽ¸åŽƒäģŦčĸĢæ”žįŊŽåœ¨æ ĄéĒŒæ–‡äģļ中äģģäŊ•æœ‰å¯į”¨įŠēé—´įš„åœ°æ–šīŧˆåŒ…æ‹ŦįŽ°æœ‰įš„ įŠē隙īŧ‰ã€‚ æ­¤é€‰éĄšįš„ä¸ģčĻį›Žįš„æ˜¯įŧŠå°æ ĄéĒŒæ–‡äģļįš„įŖį›˜å į”¨å¤§å°ã€‚ åĻ‚æžœé‡æ–°åˆ†é…æˆåŠŸæ¸…įŠēä熿•´ä¸Ē尞部åŒē域īŧˆæ˛Ąæœ‰å—įģ§įģ­äŊŋį”¨åŽƒīŧ‰īŧŒ åˆ™æ ĄéĒŒæ–‡äģļ将čĸĢæˆĒ断īŧŒå›žæ”ļæœĒäŊŋį”¨įš„å°žéƒ¨įŠē间。 您可äģĨäŊŋį”¨äš˜æ•°īŧŒåĻ‚ K、M、G 或 Tīŧˆäž‹åĻ‚ --force-realloc-tail 1Gīŧ‰ã€‚ 您可äģĨäŊŋᔍ locate -t, --tail 提前äē†č§Ŗå—åŊąå“įš„æ–‡äģļ。 č­Ļ告īŧ æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čρäŊŋį”¨ã€‚ åœ¨æ‰§čĄŒ `sync` 操äŊœæœŸé—´īŧŒå—åŊąå“įš„æ–‡äģļå°†æ˛Ąæœ‰æ•°æŽäŋæŠ¤ã€‚ -l, --log FILE 将č¯Ļį솿—Ĩåŋ—写å…Ĩ指厚文äģļ。 åĻ‚æžœæœĒæŒ‡åŽšæ­¤é€‰éĄšīŧŒåˆ™äŧšå°†æ„å¤–é”™č¯¯æ‰“å°åˆ°åąåš•īŧŒ 在å‡ēįŽ°čŽ¸å¤šé”™č¯¯įš„æƒ…å†ĩ下īŧŒå¯čƒŊå¯ŧ致输å‡ēčŋ‡å¤šã€‚ 指厚 -l, --log æ—ļīŧŒäģ…å°†å¯ŧ致 SnapRAID 停æ­ĸįš„**致å‘Ŋ错蝝**打印到 åąåš•ã€‚ åĻ‚æžœčˇ¯åž„äģĨ `>>` åŧ€å¤´īŧŒåˆ™æ–‡äģļäģĨčŋŊåŠ æ¨Ąåŧæ‰“åŧ€ã€‚ åį§°ä¸­įš„ `%D` 和 `%T` å‡ēįŽ°äŧščĸĢæ›ŋæĸä¸ēæ—Ĩ期和æ—ļ间īŧŒæ ŧåŧåˆ†åˆĢä¸ē YYYYMMDD 和 HHMMSS。在 Windows æ‰šå¤„į†æ–‡äģļ中īŧŒæ‚¨åŋ…éĄģ双写 `%` 字įŦĻīŧŒ 例åĻ‚ result-%%D.log。čρäŊŋᔍ `>>`īŧŒæ‚¨åŋ…éĄģå°†åį§°æ‹Ŧ在åŧ•åˇä¸­īŧŒ 例åĻ‚ `">>result.log"`。 čρ将æ—Ĩåŋ—čž“å‡ēåˆ°æ ‡å‡†čž“å‡ēæˆ–æ ‡å‡†é”™č¯¯īŧŒ 您可äģĨäŊŋᔍ `">&1"` 和 `">&2"`。 æœ‰å…ŗæ—Ĩåŋ—æ ‡į­žæčŋ°īŧŒč¯ˇå‚阅 snapraid_log.txt 文äģ￈– man éĄĩéĸ。 -L, --error-limit NUMBER 莞įŊŽåœæ­ĸæ‰§čĄŒå‰įš„æ–°é”™č¯¯é™åˆļ。 éģ˜čŽ¤æƒ…å†ĩ下īŧŒåĻ‚æžœ SnapRAID 遇到čļ…čŋ‡ 100 ä¸Ē 输å…Ĩ/输å‡ē错蝝īŧŒåރäŧšåœæ­ĸīŧŒčĄ¨æ˜ŽįŖį›˜å¯čƒŊæ­Ŗåœ¨å‘į”Ÿæ•…éšœã€‚ æ­¤é€‰éĄšåŊąå“ `sync` 和 `scrub`īŧŒåރäģŦčĸĢå…čŽ¸åœ¨įŦŦ一įģ„ įŖį›˜é”™č¯¯åŽįģ§įģ­īŧŒäģĨå°č¯•åŽŒæˆå…ļ操äŊœã€‚ äŊ†æ˜¯īŧŒ`check` 和 `fix` æ€ģ是äŧšåœ¨įŦŦ一æŦĄé”™č¯¯æ—ļ停æ­ĸ。 -S, --start BLKSTART äģŽæŒ‡åŽšįš„å—åˇåŧ€å§‹å¤„į†ã€‚ åœ¨įŖį›˜æŸåįš„æƒ…å†ĩ下īŧŒčŋ™å¯šäēŽé‡č¯•æŖ€æŸĨ或äŋŽå¤į‰šåŽšå—å¯čƒŊåžˆæœ‰į”¨ã€‚ æ­¤é€‰éĄšä¸ģčρᔍäēŽé̘įē§æ‰‹åЍæĸ复。 -B, --count BLKCOUNT äģ…å¤„į†æŒ‡åŽšæ•°é‡įš„å—ã€‚ æ­¤é€‰éĄšä¸ģčρᔍäēŽé̘įē§æ‰‹åЍæĸ复。 -C, --gen-conf CONTENT äģŽįŽ°æœ‰å†…åŽšæ–‡äģļį”Ÿæˆä¸€ä¸Ēč™šæ‹Ÿé…įŊŽæ–‡äģļ。 配įŊŽæ–‡äģļ写å…Ĩæ ‡å‡†čž“å‡ēīŧŒä¸äŧščĻ†į›–įŽ°æœ‰æ–‡äģļ。 此配įŊŽæ–‡äģļčŋ˜åŒ…åĢ在您ä¸ĸå¤ąæ•´ä¸ĒįŗģįģŸįš„æƒ…å†ĩ下 重åģēįŖį›˜æŒ‚čŊŊį‚šæ‰€éœ€įš„äŋĄæ¯ã€‚ -v, --verbose å‘åąåš•æ‰“å°æ›´å¤šäŋĄæ¯ã€‚ åĻ‚æžœæŒ‡åŽšä¸€æŦĄīŧŒåރäŧšæ‰“å°æŽ’é™¤įš„æ–‡äģļ 和附加įģŸčŽĄäŋĄæ¯ã€‚ æ­¤é€‰éĄšå¯šæ—Ĩåŋ—æ–‡äģ￞Ąæœ‰åŊąå“ã€‚ -q, --quiet å‘åąåš•æ‰“å°æ›´å°‘äŋĄæ¯ã€‚ åĻ‚æžœæŒ‡åŽšä¸€æŦĄīŧŒåރäŧšåˆ é™¤čŋ›åēĻæĄīŧ›ä¸¤æŦĄīŧŒ æ­Ŗåœ¨čŋčĄŒįš„æ“äŊœīŧ›ä¸‰æŦĄīŧŒäŋĄæ¯ æļˆæ¯īŧ›å››æŦĄīŧŒįŠļ态æļˆæ¯ã€‚ 致å‘Ŋ错蝝始įģˆäŧšæ‰“å°åˆ°åąåš•ã€‚ æ­¤é€‰éĄšå¯šæ—Ĩåŋ—æ–‡äģ￞Ąæœ‰åŊąå“ã€‚ -H, --help æ‰“å°įŽ€įŸ­įš„å¸ŽåŠŠåąåš•ã€‚ -V, --version æ‰“å°į¨‹åēį‰ˆæœŦ。 Configuration SnapRAID 需čρ䏀ä¸Ē配įŊŽæ–‡äģļæĨäē†č§Ŗæ‚¨įš„įŖį›˜é˜ĩ列 äŊäēŽäŊ•处äģĨ及在å“Ē里存储åĨ‡åļæ ĄénjäŋĄæ¯ã€‚ 在 Unix 中īŧŒåĻ‚æžœå­˜åœ¨īŧŒåރäŊŋį”¨æ–‡äģļ `/usr/local/etc/snapraid.conf`īŧŒ åĻ则äŊŋᔍ `/etc/snapraid.conf`。 在 Windows 中īŧŒåރäŊŋį”¨ä¸Ž `snapraid.exe` į›¸åŒįš„į›ŽåŊ•ä¸­įš„æ–‡äģļ `snapraid.conf`。 厃åŋ…éĄģ包åĢäģĨ下选项īŧˆåŒē分大小写īŧ‰īŧš parity FILE [,FILE] ... åŽšäš‰į”¨äēŽå­˜å‚¨åĨ‡åļæ ĄénjäŋĄæ¯įš„æ–‡äģļ。 åĨ‡åļæ ĄéĒŒå¯åŽžįŽ°é’ˆå¯šå•ä¸ĒįŖį›˜ æ•…éšœįš„äŋæŠ¤īŧŒįąģäŧŧäēŽ RAID5。 您可äģĨ指厚多ä¸Ē文äģļīŧŒåރäģŦåŋ…éĄģäŊäēŽä¸åŒįš„įŖį›˜ä¸Šã€‚ åŊ“一ä¸Ē文äģļ不čƒŊ再åĸžé•ŋæ—ļīŧŒäŊŋᔍ䏋䏀ä¸Ē文äģļ。 æ€ģå¯į”¨įŠē间åŋ…éĄģč‡ŗå°‘ä¸Žé˜ĩåˆ—ä¸­æœ€å¤§įš„æ•°æŽįŖį›˜ä¸€æ ˇå¤§ã€‚ 您可äģĨį¨åŽæˇģ加éĸå¤–įš„åĨ‡åļæ ĄéĒŒæ–‡äģļīŧŒäŊ†æ˜¯æ‚¨ 不čƒŊ重新排åēæˆ–删除åރäģŦ。 将åĨ‡åļæ ĄéĒŒįŖį›˜äŋį•™į”¨äēŽåĨ‡åļæ ĄéĒŒå¯įĄŽäŋåރäģŦ不äŧšįĸŽį‰‡åŒ–īŧŒäģŽč€ŒæéĢ˜æ€§čƒŊ。 在 Windows 中īŧŒæ¯ä¸ĒįŖį›˜äŧšį•™ä¸‹ 256 MB æœĒäŊŋᔍįŠē间īŧŒäģĨéŋ免 æœ‰å…ŗįŖį›˜åˇ˛æģĄįš„č­Ļ告。 æ­¤é€‰éĄšæ˜¯åŧēåˆļæ€§įš„īŧŒåšļ且åĒčƒŊäŊŋᔍ䏀æŦĄã€‚ (2,3,4,5,6)-parity FILE [,FILE] ... åŽšäš‰į”¨äēŽå­˜å‚¨éĸå¤–åĨ‡åļæ ĄénjäŋĄæ¯įš„æ–‡äģļ。 ä¸ēæŒ‡åŽšįš„æ¯ä¸ĒåĨ‡åļæ Ąénjįē§åˆĢ吝ᔍ䏀ä¸Ēéĸå¤–įš„äŋæŠ¤įē§åˆĢīŧš * 2-parity 吝ᔍ RAID6 双åĨ‡åļæ ĄéĒŒã€‚ * 3-parity 吝ᔍ䏉åĨ‡åļæ ĄéĒŒã€‚ * 4-parity 吝ᔍ四åĨ‡åļæ ĄéĒŒã€‚ * 5-parity 吝ᔍäē”åĨ‡åļæ ĄéĒŒã€‚ * 6-parity 吝ᔍ六åĨ‡åļæ ĄéĒŒã€‚ 每ä¸ĒåĨ‡åļæ Ąénjįē§åˆĢéƒŊ需čĻå­˜åœ¨æ‰€æœ‰å…ˆå‰įš„åĨ‡åļæ Ąénjįē§åˆĢ。 与 `parity` é€‰éĄšį›¸åŒįš„æŗ¨æ„äē‹éĄšé€‚į”¨ã€‚ čŋ™äē›é€‰éĄšæ˜¯å¯é€‰įš„īŧŒåšļ且åĒčƒŊäŊŋᔍ䏀æŦĄã€‚ z-parity FILE [,FILE] ... åŽšäš‰į”¨äēŽå­˜å‚¨ä¸‰åĨ‡åļæ ĄéĒŒįš„å¤‡į”¨æ–‡äģļ和æ ŧåŧã€‚ æ­¤é€‰éĄšæ˜¯ `3-parity` įš„æ›ŋäģŖæ–šæĄˆīŧŒä¸ģčρéĸ向不支持 SSSE3 指äģ¤é›†įš„äŊŽį̝ CPUīŧŒåĻ‚ ARM 或 AMD Phenom、Athlon 和 Opteron。 在čŋ™į§æƒ…å†ĩ下īŧŒåŽƒæäž›ä熿›´åĨŊįš„æ€§čƒŊ。 æ­¤æ ŧåŧįąģäŧŧäēŽ ZFS RAIDZ3 äŊŋį”¨įš„æ ŧåŧīŧŒäŊ†æ›´åŋĢ。 与 ZFS ä¸€æ ˇīŧŒåŽƒåœ¨ä¸‰åĨ‡åļæ ĄéĒŒäš‹å¤–ä¸čĩˇäŊœį”¨ã€‚ åŊ“äŊŋᔍ `3-parity` æ—ļīŧŒåĻ‚æžœåģē莎äŊŋᔍ `z-parity` æ ŧåŧäģĨ提éĢ˜æ€§čƒŊīŧŒ 您将æ”ļ到č­Ļ告。 可äģĨ通čŋ‡č°ƒæ•´é…įŊŽæ–‡äģļä¸­įš„æ‰€éœ€ z-parity 或 3-parity 文äģļīŧŒ åšļäŊŋᔍ `fix` 重新创åģē厃īŧŒäģŽä¸€į§æ ŧåŧčŊŦæĸä¸ēåĻä¸€į§æ ŧåŧã€‚ content FILE åŽšäš‰į”¨äēŽå­˜å‚¨įŖį›˜é˜ĩ列中所有文äģļįš„åˆ—čĄ¨å’Œæ ĄéĒŒå’Œįš„æ–‡äģļ。 厃可äģĨ攞įŊŽåœ¨į”¨äēŽæ•°æŽã€åĨ‡åļæ ĄéĒŒæˆ– äģģäŊ•å…ļäģ–å¯į”¨įŖį›˜ä¸Šã€‚ åĻ‚æžœæ‚¨äŊŋį”¨æ•°æŽįŖį›˜īŧŒæ­¤æ–‡äģļäŧšč‡Ē动äģŽ `sync` čŋ‡į¨‹ä¸­æŽ’除。 æ­¤é€‰éĄšæ˜¯åŧēåˆļæ€§įš„īŧŒåšļ且可äģĨ多æŦĄäŊŋᔍäģĨäŋå­˜ 同一文äģļįš„å¤šä¸Ē副æœŦ。 您åŋ…éĄģä¸ēäŊŋį”¨įš„æ¯ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜å­˜å‚¨č‡ŗå°‘ä¸€ä¸Ē副æœŦīŧŒ 再加上一ä¸Ē。äŊŋᔍéĸå¤–įš„å‰¯æœŦ不äŧšæœ‰åŽŗã€‚ data NAME DIR 厚䚉é˜ĩåˆ—ä¸­æ•°æŽįŖį›˜įš„åį§°å’ŒæŒ‚čŊŊį‚šã€‚ NAME ᔍäēŽæ ‡č¯†įŖį›˜īŧŒåšļ且åŋ…éĄģæ˜¯å”¯ä¸€įš„ã€‚ DIR æ˜¯įŖį›˜åœ¨æ–‡äģļįŗģįģŸä¸­įš„æŒ‚čŊŊį‚šã€‚ 您可äģĨ栚捎需čĻæ›´æ”šæŒ‚čŊŊį‚šīŧŒåĒčρäŋæŒ NAME å›ēåŽšåŗå¯ã€‚ 您åē”č¯Ĩä¸ēé˜ĩåˆ—ä¸­įš„æ¯ä¸Ēæ•°æŽįŖį›˜äŊŋᔍ䏀ä¸Ēé€‰éĄšã€‚ 您可äģĨ通čŋ‡į›´æŽĨ在配įŊŽæ–‡äģļ中更攚 NAMEīŧŒį„ļ后čŋčĄŒ `sync` å‘Ŋä줿Ĩ į¨åŽé‡å‘ŊåįŖį›˜ã€‚ 在重å‘Ŋåįš„æƒ…å†ĩ下īŧŒå…ŗč”是äŊŋį”¨å­˜å‚¨įš„įŖį›˜ UUID åŽŒæˆįš„ã€‚ extra NAME DIR 厚䚉čĻé€ščŋ‡ `smart` 和 `probe` å‘Ŋäģ¤į›‘æŽ§įš„éĸå¤–įŖį›˜įš„åį§°å’ŒæŒ‚čŊŊį‚šã€‚ čŋ™å¯šäēŽį›‘æŽ§ä¸åąžäēŽé˜ĩ列äŊ†įŗģįģŸčŋčĄŒæ‰€åŋ…éœ€įš„įŖį›˜īŧˆäž‹åĻ‚å¯åŠ¨į›˜īŧ‰éžå¸¸æœ‰į”¨ã€‚ č¯ˇæŗ¨æ„īŧŒæ­¤įąģįŖį›˜ä¸å— `up` 和 `down` å‘Ŋäģ¤įš„åŊąå“īŧŒå› ä¸ē厃äģŦčĸĢéĸ„期始įģˆå¤„äēŽ æ—‹čŊŦįŠļ态。 nohidden æŽ’é™¤æ‰€æœ‰éšč—æ–‡äģļå’Œį›ŽåŊ•。 在 Unix 中īŧŒéšč—æ–‡äģ￘¯äģĨ `.` åŧ€å¤´įš„æ–‡äģļ。 在 Windows 中īŧŒåރäģŦæ˜¯å…ˇæœ‰éšč—åąžæ€§įš„æ–‡äģļ。 exclude/include PATTERN 厚䚉čρäģŽåŒæ­Ĩčŋ‡į¨‹ä¸­æŽ’除或包åĢįš„æ–‡äģ￈–į›ŽåŊ•æ¨Ąåŧã€‚ æ‰€æœ‰æ¨ĄåŧéƒŊæŒ‰æŒ‡åŽšįš„éĄēåēå¤„į†ã€‚ åĻ‚æžœåŒšé…įš„įŦŦ一ä¸Ēæ¨Ąåŧæ˜¯ `exclude` æ¨ĄåŧīŧŒåˆ™æŽ’除č¯Ĩ文äģļ。 åĻ‚æžœåŽƒæ˜¯ `include` æ¨ĄåŧīŧŒåˆ™åŒ…åĢč¯Ĩ文äģļ。 åĻ‚æžœæ˛Ąæœ‰æ¨ĄåŧåŒšé…īŧŒåˆ™åĻ‚æžœæŒ‡åŽšįš„æœ€åŽä¸€ä¸Ēæ¨Ąåŧæ˜¯ `include`īŧŒåˆ™æŽ’除č¯Ĩ文äģļīŧŒ æˆ–č€…åĻ‚æžœæŒ‡åŽšįš„æœ€åŽä¸€ä¸Ēæ¨Ąåŧæ˜¯ `exclude`īŧŒåˆ™åŒ…åĢč¯Ĩ文äģļ。 æœ‰å…ŗæ¨Ąåŧč§„čŒƒįš„æ›´å¤šč¯Ļįģ†äŋĄæ¯īŧŒč¯ˇå‚阅 PATTERN 部分。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ blocksize SIZE_IN_KIBIBYTES 厚䚉åĨ‡åļæ ĄéĒŒįš„åŸēæœŦ块大小īŧˆäģĨ KiB ä¸ē单äŊīŧ‰ã€‚ 一 KiB 是 1024 å­—čŠ‚ã€‚ éģ˜čŽ¤įš„ blocksize 是 256īŧŒčŋ™åē”č¯Ĩ适ᔍäēŽå¤§å¤šæ•°æƒ…å†ĩ。 **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čĻæ›´æ”šæ­¤å€ŧ。 将æĨčĻæ›´æ”šæ­¤å€ŧīŧŒæ‚¨å°†éœ€čĻé‡æ–°åˆ›åģēæ•´ä¸ĒåĨ‡åļæ Ąénjīŧ äŊŋį”¨ä¸åŒ blocksize įš„ä¸€ä¸Ē原因是īŧŒåĻ‚æžœæ‚¨æœ‰čŽ¸å¤šå°åž‹æ–‡äģļīŧŒ 数量įē§ä¸ēæ•°į™žä¸‡ã€‚ 寚äēŽæ¯ä¸Ē文äģļīŧŒåŗäŊŋåĒ有几ä¸Ēå­—čŠ‚īŧŒäšŸäŧšåˆ†é…ä¸€ä¸ĒåŽŒæ•´įš„åĨ‡åļæ ĄéĒŒå—īŧŒ åšļ且寚äēŽčŽ¸å¤šæ–‡äģļīŧŒčŋ™å¯čƒŊå¯ŧč‡´å¤§é‡įš„æœĒäŊŋᔍåĨ‡åļæ ĄénjįŠē间。 åŊ“您厌全åĄĢæģĄåĨ‡åļæ ĄéĒŒįŖį›˜æ—ļīŧŒä¸å…čŽ¸å‘æ•°æŽįŖį›˜ æˇģ加更多文äģļ。 äŊ†æ˜¯īŧŒæĩĒč´šįš„åĨ‡åļæ ĄéĒŒä¸äŧščˇ¨æ•°æŽįŖį›˜į´¯į§¯ã€‚ æ•°æŽįŖį›˜ä¸Šå¤§é‡æ–‡äģļå¯ŧč‡´įš„æĩĒč´šįŠē间äģ…限åˆļč¯Ĩæ•°æŽįŖį›˜ä¸Šįš„æ•°æŽé‡īŧŒ 而不限åˆļå…ļäģ–įŖį›˜ä¸Šįš„æ•°æŽé‡ã€‚ äŊœä¸ē一ä¸Ēčŋ‘äŧŧå€ŧīŧŒæ‚¨å¯äģĨå‡čŽžæ¯ä¸Ē文äģļæĩĒč´šäē†åŠä¸Ēå—å¤§å°įš„įŠē间。 例åĻ‚īŧŒå¯šäēŽ 100,000 ä¸Ē文äģļ和 256 KiB įš„å—å¤§å°īŧŒæ‚¨å°†æĩĒč´š 12.8 GB įš„åĨ‡åļæ ĄénjįŠē间īŧŒ čŋ™å¯čƒŊå¯ŧč‡´æ•°æŽįŖį›˜ä¸Šå°‘ 12.8 GB įš„å¯į”¨įŠē间。 您可äģĨäŊŋᔍ `status` æŖ€æŸĨ每ä¸ĒįŖį›˜ä¸ŠæĩĒč´šįš„įŠē间量。 čŋ™æ˜¯æ‚¨åŋ…éĄģåœ¨æ•°æŽįŖį›˜ä¸Šį•™å‡ēįš„įŠē闲įŠē间量īŧŒ æˆ–į”¨äēŽä¸åŒ…åĢ在é˜ĩåˆ—ä¸­įš„æ–‡äģļįš„įŠē间量。 åĻ‚æžœæ­¤å€ŧä¸ē负īŧŒåˆ™čĄ¨į¤ēæ‚¨åŗå°†åĄĢæģĄåĨ‡åļæ ĄénjįŠē间īŧŒ åŽƒčĄ¨į¤ē您äģį„ļ可äģĨæĩĒč´šįš„įŠē间。 ä¸ēéŋ免此闎éĸ˜īŧŒæ‚¨å¯äģĨä¸ēåĨ‡åļæ ĄénjäŊŋį”¨æ›´å¤§įš„åˆ†åŒē。 例åĻ‚īŧŒåĻ‚æžœåĨ‡åļæ ĄéĒŒåˆ†åŒēæ¯”æ•°æŽįŖį›˜å¤§ 12.8 GBīŧŒ 则您有čļŗå¤Ÿįš„éĸå¤–įŠē间æĨå¤„į†æ¯ä¸Ēæ•°æŽįŖį›˜ä¸Šå¤ščžž 100,000 ä¸Ē 文äģļ而不äŧšæĩĒč´šäģģäŊ•įŠē间。 在 Linux ä¸­čŽˇåž—æ›´å¤§įš„åĨ‡åļæ ĄéĒŒåˆ†åŒēįš„ä¸€ä¸ĒæŠ€åˇ§æ˜¯äŊŋᔍäģĨ下å‘Ŋä줿 ŧåŧåŒ–åރīŧš :mkfs.ext4 -m 0 -T largefile4 DEVICE čŋ™äŧšå¯ŧ致大įēĻ 1.5% įš„éĸå¤–įŠē间īŧŒå¯šäēŽ 4 TB įŖį›˜įēĻä¸ē 60 GBīŧŒ čŋ™å…čŽ¸æ¯ä¸Ēæ•°æŽįŖį›˜ä¸Šå¤§įēĻ 460,000 ä¸Ē文äģļ而不äŧšæĩĒč´šäģģäŊ•įŠē间。 hashsize SIZE_IN_BYTES 厚䚉äŋå­˜å—įš„æ•Ŗåˆ—å¤§å°īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰ã€‚ éģ˜čŽ¤įš„ hashsize 是 16 å­—čŠ‚īŧˆ128 äŊīŧ‰īŧŒčŋ™åē”č¯Ĩ适ᔍäēŽå¤§å¤šæ•°æƒ…å†ĩ。 **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čĻæ›´æ”šæ­¤å€ŧ。 将æĨčĻæ›´æ”šæ­¤å€ŧīŧŒæ‚¨å°†éœ€čĻé‡æ–°åˆ›åģēæ•´ä¸ĒåĨ‡åļæ Ąénjīŧ äŊŋį”¨ä¸åŒ hashsize įš„ä¸€ä¸Ē原因是īŧŒåĻ‚æžœæ‚¨įš„įŗģįģŸå†…存有限。 栚捎įģénjīŧŒSnapRAID 通常每 16 TB įš„é˜ĩ列数捎需čρ 1 GiB įš„ RAM。 å…ˇäŊ“æĨ蝴īŧŒä¸ēäē†å­˜å‚¨æ•°æŽįš„æ•Ŗåˆ—īŧŒSnapRAID 大įēĻ需čρ $TS*(1+HS)/BS$ å­—čŠ‚įš„ RAMīŧŒ å…ļ中 $TS$ æ˜¯æ‚¨įš„įŖį›˜é˜ĩåˆ—įš„æ€ģ大小īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰īŧŒ$BS$ 是块大小īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰īŧŒ $HS$ æ˜¯æ•Ŗåˆ—å¤§å°īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰ã€‚ 例åĻ‚īŧŒå¯šäēŽ 8 ä¸Ē 4 TB įŖį›˜īŧŒå—大小ä¸ē 256 KiB īŧˆ1 KiB = 1024 å­—čŠ‚īŧ‰īŧŒæ•Ŗåˆ—大小ä¸ē 16īŧŒæ‚¨å°†čŽˇåž—īŧš :RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93$ GiB 切æĸåˆ°æ•Ŗåˆ—å¤§å°ä¸ē 8īŧŒæ‚¨å°†čŽˇåž—īŧš :RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02$ GiB 切æĸ到块大小ä¸ē 512īŧŒæ‚¨å°†čŽˇåž—īŧš :RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96$ GiB 切æĸåˆ°æ•Ŗåˆ—å¤§å°ä¸ē 8 和块大小ä¸ē 512īŧŒæ‚¨å°†čŽˇåž—īŧš :RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51$ GiB autosave SIZE_IN_GIGABYTES 在同æ­Ĩ或 scrub 䚋后īŧŒå¤„į†æŒ‡åŽšæ•°é‡įš„ GB 后īŧŒč‡Ē动äŋå­˜įŠļ态。 æ­¤é€‰éĄšæœ‰åŠŠäēŽéŋ免在æœē器崊æēƒæˆ–äģģäŊ•å…ļäģ–äē‹äģļ中断æ—ļīŧŒ äģŽå¤´åŧ€å§‹é‡æ–°å¯åЍé•ŋæ—ļé—´įš„ `sync` å‘Ŋäģ¤ã€‚ temp_limit TEMPERATURE_CELSIUS 莞įŊŽå…čŽ¸įš„æœ€éĢ˜įŖį›˜æ¸ŠåēĻīŧˆæ‘„氏åēĻīŧ‰ã€‚指厚后īŧŒ SnapRAID äŧšäŊŋᔍ smartctl åˇĨå…ˇåŽšæœŸæŖ€æŸĨæ‰€æœ‰įŖį›˜įš„æ¸ŠåēĻ。 SnapRAID čŋčĄŒæ—ļäŧšæ˜žį¤ēåŊ“å‰įŖį›˜æ¸ŠåēĻ。 åĻ‚æžœäģģäŊ•įŖį›˜čļ…čŋ‡æ­¤é™åˆļīŧŒæ‰€æœ‰æ“äŊœéƒŊäŧšåœæ­ĸīŧŒ åšļ在 `temp_sleep` é€‰éĄšåŽšäš‰įš„æŒįģ­æ—ļé—´å†…å°†įŖį›˜åœčŊŦīŧˆįŊŽäēŽåž…æœēįŠļ态īŧ‰ã€‚ 在äŧ‘įœ æœŸčŋ‡åŽīŧŒæ“äŊœæĸ复īŧŒåĻ‚æžœæ¸ŠåēĻ限åˆļ再æŦĄčžžåˆ°īŧŒ 可čƒŊäŧšå†æŦĄæš‚停。 在操äŊœæœŸé—´īŧŒSnapRAID čŋ˜äŧšåˆ†æžæ¯ä¸ĒįŖį›˜įš„åŠ įƒ­æ›˛įēŋīŧŒ åšļäŧ°čŽĄåĻ‚æžœæ´ģ动įģ§įģ­īŧŒåރäģŦéĸ„čŽĄå°†čžžåˆ°įš„é•ŋæœŸį¨ŗåŽšæ¸ŠåēĻ。 äģ…åœ¨įŖį›˜æ¸ŠåēĻåĸžåŠ äē†å››æŦĄåŽæ‰æ‰§čĄŒäŧ°čŽĄīŧŒ äģĨįĄŽäŋæœ‰čļŗå¤Ÿįš„æ•°æŽį‚šæĨåģēįĢ‹å¯é įš„čļ‹åŠŋ。 æ­¤éĸ„æĩ‹įš„į¨ŗåŽšæ¸ŠåēĻæ˜žį¤ē在åŊ“前å€ŧæ—čžšįš„æ‹Ŧåˇä¸­īŧŒ 有劊äēŽč¯„äŧ°įŗģįģŸįš„å†ˇå´æ˜¯åĻčļŗå¤Ÿã€‚ æ­¤äŧ°čŽĄæ¸ŠåēĻäģ…äž›å‚č€ƒīŧŒå¯š SnapRAID įš„čĄŒä¸ēæ˛Ąæœ‰åŊąå“ã€‚ ፋåēįš„动äŊœäģ…åŸēäēŽåŽžé™…æĩ‹é‡įš„įŖį›˜æ¸ŠåēĻ。 čĻæ‰§čĄŒæ­¤åˆ†æžīŧŒSnapRAID 需čρ䏀ä¸Ēįŗģį쟿¸ŠåēĻįš„å‚č€ƒã€‚ 厃éĻ–å…ˆå°č¯•äģŽå¯į”¨įš„įĄŦäģļäŧ æ„Ÿå™¨č¯ģ取。 åĻ‚æžœæ— æŗ•čŽŋ问įŗģįģŸäŧ æ„Ÿå™¨īŧŒåރäŧšäŊŋᔍčŋčĄŒæ—ļæĩ‹é‡įš„æœ€äŊŽįŖį›˜æ¸ŠåēĻ äŊœä¸ēå¤‡į”¨å‚č€ƒã€‚ 通常īŧŒSnapRAID åĒ昞į¤ēæœ€įƒ­įŖį›˜įš„æ¸ŠåēĻ。 čĻæ˜žį¤ēæ‰€æœ‰įŖį›˜įš„æ¸ŠåēĻīŧŒč¯ˇäŊŋᔍ -A 或 --stats é€‰éĄšã€‚ temp_sleep TIME_IN_MINUTES 莞įŊŽčžžåˆ°æ¸ŠåēĻ限åˆļæ—ļįš„åž…æœēæ—ļ间īŧˆäģĨ分钟ä¸ē单äŊīŧ‰ã€‚ 在此期间īŧŒįŖį›˜äŋæŒåœčŊŦįŠļ态。éģ˜čޤå€ŧä¸ē 5 分钟。 pool DIR 厚䚉 `pooling` į›ŽåŊ•īŧŒå…ļ中äŊŋᔍ `pool` å‘Ŋäģ¤åˆ›åģēįŖį›˜ é˜ĩåˆ—įš„č™šæ‹Ÿč§†å›žã€‚ į›ŽåŊ•åŋ…éĄģ厞įģå­˜åœ¨ã€‚ share UNC_DIR 厚䚉čŋœį¨‹čŽŋé—ŽįŖį›˜æ‰€éœ€įš„ Windows UNC čˇ¯åž„ã€‚ åĻ‚æžœæŒ‡åŽšä熿­¤é€‰éĄšīŧŒåˆ™åœ¨ pool į›ŽåŊ•中创åģēįš„įŦĻåˇé“žæŽĨäŧšäŊŋį”¨æ­¤ UNC čˇ¯åž„ æĨčŽŋé—ŽįŖį›˜ã€‚ åĻ‚æžœæ˛Ąæœ‰æ­¤é€‰éĄšīŧŒåˆ™į”Ÿæˆįš„įŦĻåˇé“žæŽĨäģ…äŊŋᔍæœŦåœ°čˇ¯åž„īŧŒ čŋ™ä¸å…čŽ¸é€ščŋ‡įŊ‘įģœå…ąäēĢ pool į›ŽåŊ•。 įŦĻåˇé“žæŽĨ是äŊŋį”¨æŒ‡åŽšįš„ UNC čˇ¯åž„īŧŒæˇģ加在 `data` é€‰éĄšä¸­æŒ‡åŽšįš„ įŖį›˜åį§°īŧŒæœ€åŽæˇģ加文äģļį›ŽåŊ•å’Œåį§°åŊĸæˆįš„ã€‚ æ­¤é€‰éĄšäģ…在 Windows 中需čĻã€‚ smartctl DISK/PARITY OPTIONS... 厚䚉č‡Ē厚䚉 smartctl 选项äģĨčŽˇå–æ¯ä¸ĒįŖį›˜įš„ SMART åąžæ€§ã€‚ čŋ™å¯šäēŽ RAID 控åˆļ器和一ä盿— æŗ•č‡ĒåŠ¨æŖ€æĩ‹įš„ USB įŖį›˜å¯čƒŊ需čĻã€‚%s 占äŊįŦĻäŧščĸĢčŽžå¤‡åį§°æ›ŋæĸīŧŒ äŊ†å¯šäēŽå›ēåŽšįš„čŽžå¤‡īŧˆåĻ‚ RAID 控åˆļ器īŧ‰æ˜¯å¯é€‰įš„。 DISK 是在 `data` é€‰éĄšä¸­æŒ‡åŽšįš„į›¸åŒįŖį›˜åį§°ã€‚ PARITY 是åĨ‡åļæ ĄéĒŒåį§°äš‹ä¸€īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity` 或 `z-parity`。 åœ¨æŒ‡åŽšįš„ OPTIONS 中īŧŒå­—įŦĻ串 `%s` čĸĢčŽžå¤‡åį§°æ›ŋæĸ。 寚äēŽ RAID 控åˆļ器īŧŒčŽžå¤‡å¯čƒŊ是å›ēåŽšįš„īŧŒ 您可čƒŊ不需čρäŊŋᔍ `%s`。 č¯ˇå‚é˜… smartmontools æ–‡æĄŖäģĨäē†č§Ŗå¯čƒŊįš„é€‰éĄšīŧš :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices 例åĻ‚īŧš :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] åœ¨čŽĄįŽ—įŖį›˜æ•…éšœæĻ‚įŽ‡æ—ļåŋŊį•ĨæŒ‡åŽšįš„ SMART åąžæ€§ã€‚ åĻ‚æžœįŖį›˜æŠĨ告äē†į‰šåŽšåąžæ€§įš„ä¸å¯ģå¸¸æˆ–č¯¯å¯ŧå€ŧīŧŒæ­¤é€‰éĄšåžˆæœ‰į”¨ã€‚ DISK 是在 `data` é€‰éĄšä¸­æŒ‡åŽšįš„į›¸åŒįŖį›˜åį§°ã€‚ PARITY 是åĨ‡åļæ ĄéĒŒåį§°äš‹ä¸€īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity` 或 `z-parity`。 į‰šæŽŠå€ŧ * å¯į”¨äēŽåœ¨æ‰€æœ‰įŖį›˜ä¸ŠåŋŊį•Ĩč¯Ĩåąžæ€§ã€‚ 例åĻ‚īŧŒčĻåœ¨æ‰€æœ‰įŖį›˜ä¸ŠåŋŊį•Ĩ `Current Pending Sector Count` åąžæ€§īŧš :smartignore * 197 čρäģ…在įŦŦ一ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜ä¸ŠåŋŊį•Ĩ厃īŧš :smartignore parity 197 Examples Unix įš„å…¸åž‹é…įŊŽį¤ē例åς䏋īŧš :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 Windows įš„å…¸åž‹é…įŊŽį¤ē例åς䏋īŧš :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern æ¨Ąåŧæäž›äē†ä¸€į§įĩæ´ģįš„æ–šæŗ•æĨčŋ‡æģ¤čĻåŒ…åĢæˆ–æŽ’é™¤įš„æ–‡äģļ。通čŋ‡äŊŋį”¨é€šé…įŦĻīŧˆglobbingīŧ‰īŧŒ 您可äģĨåŽšäš‰åŒšé…į‰šåŽšæ–‡äģļ名或整ä¸Ēį›ŽåŊ•į쓿ž„įš„č§„åˆ™īŧŒč€Œæ— éœ€æ‰‹åŠ¨åˆ—å‡ē每ä¸Ēčˇ¯åž„ã€‚ é—Žåˇ `?` åŒšé…é™¤į›ŽåŊ•分隔įŦĻäģĨå¤–įš„äģģäŊ•单ä¸Ē字įŦĻ。čŋ™äŊŋåž—åŽƒåœ¨åŒšé…å…ˇæœ‰å˜é‡å­—įŦĻ įš„æ–‡äģļ名æ—ļéžå¸¸æœ‰į”¨īŧŒåŒæ—ļå°†æ¨Ąåŧé™åˆļ在单ä¸Ēį›ŽåŊ•åą‚įē§å†…。 å•æ˜Ÿåˇ `*` 匚配äģģäŊ•å­—įŦĻåēåˆ—īŧŒäŊ†ä¸Žé—Žåˇä¸€æ ˇīŧŒåރįģä¸äŧščˇ¨čļŠį›ŽåŊ•čžšį•Œã€‚ åŽƒåœ¨æ­Ŗæ–œæ å¤„åœæ­ĸīŧŒå› æ­¤é€‚ᔍäēŽåŒšé…å•ä¸Ēčˇ¯åž„įģ„äģļå†…įš„å†…åŽšã€‚ čŋ™æ˜¯ Shell 通配įŦĻä¸­å¸¸č§įš„æ ‡å‡†čĄŒä¸ē。 åŒæ˜Ÿåˇ `**` 功čƒŊ更åŧē大īŧŒåŽƒå¯äģĨ匚配äģģäŊ•å­—įŦĻåēåˆ—īŧŒåŒ…æ‹Ŧį›ŽåŊ•分隔įŦĻ。 čŋ™å…čŽ¸æ¨ĄåŧåŒšé…čˇ¨čļŠå¤šä¸Ēį›ŽåŊ•åą‚įē§ã€‚åŊ“ `**` į›´æŽĨåĩŒå…Ĩåœ¨æ¨Ąåŧä¸­æ—ļīŧŒ 厃可äģĨ匚配é›ļä¸Ē或多ä¸Ē字įŦĻīŧŒåŒ…æ‹Ŧ周围文字文æœŦäš‹é—´įš„æ–œæ ã€‚ `**` 最重čĻįš„į”¨æŗ•æ˜¯į‰šæŽŠåŊĸåŧ `/**/`。厃可äģĨ匚配é›ļä¸Ē或多ä¸ĒåŽŒæ•´įš„į›ŽåŊ•åą‚įē§īŧŒ äģŽč€Œå¯äģĨ在不įŸĨé“įĄŽåˆ‡čˇ¯åž„į쓿ž„įš„æƒ…å†ĩ下īŧŒåŒšé…į›ŽåŊ•树中äģģäŊ•æˇąåēĻįš„æ–‡äģļ。 例åĻ‚īŧŒæ¨Ąåŧ `src/**/main.js` 匚配 `src/main.js`īŧˆčˇŗčŋ‡é›ļä¸Ēį›ŽåŊ•īŧ‰ã€ `src/ui/main.js`īŧˆčˇŗčŋ‡ä¸€ä¸Ēį›ŽåŊ•īŧ‰äģĨ及 `src/ui/components/main.js` īŧˆčˇŗčŋ‡ä¸¤ä¸Ēį›ŽåŊ•īŧ‰ã€‚ äŊŋį”¨æ–šæ‹Ŧåˇ `[]` įš„å­—įŦĻįąģåŒšé…æŒ‡åŽšé›†åˆæˆ–čŒƒå›´å†…įš„å•ä¸Ē字įŦĻ。 与å…ļäģ–单字įŦĻæ¨Ąåŧä¸€æ ˇīŧŒåރäģŦä¸åŒšé…į›ŽåŊ•分隔įŦĻ。字įŦĻįąģ支持äŊŋᔍ æ„Ÿåšåˇčŋ›čĄŒčŒƒå›´æŒ‡åŽšå’ŒåĻ厚。 需čĻčŽ°äŊįš„æ šæœŦåŒēåˆĢ是īŧŒ`*`、`?` 和字įŦĻįąģéƒŊéĩåžĒį›ŽåŊ•čžšį•ŒīŧŒ åšļ且äģ…在单ä¸Ēčˇ¯åž„įģ„äģļ内匚配īŧŒč€Œ `**` 是唯一可äģĨ表čļŠį›ŽåŊ•分隔įŦĻåŒšé…įš„æ¨Ąåŧã€‚ æœ‰å››į§ä¸åŒįąģåž‹įš„æ¨Ąåŧīŧš =FILE 选拊äģģäŊ•名ä¸ē FILE įš„æ–‡äģļ。 æ­¤æ¨Ąåŧäģ…适ᔍäēŽæ–‡äģļīŧŒä¸é€‚ᔍäēŽį›ŽåŊ•。 =DIR/ 选拊äģģäŊ•名ä¸ē DIR įš„į›ŽåŊ•及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚ æ­¤æ¨Ąåŧäģ…适ᔍäēŽį›ŽåŊ•īŧŒä¸é€‚ᔍäēŽæ–‡äģļ。 =/PATH/FILE é€‰æ‹ŠæŒ‡åŽšįš„įĄŽåˆ‡æ–‡äģļčˇ¯åž„ã€‚æ­¤æ¨Ąåŧäģ…适ᔍäēŽæ–‡äģļīŧŒä¸é€‚ᔍäēŽį›ŽåŊ•。 =/PATH/DIR/ é€‰æ‹ŠæŒ‡åŽšįš„įĄŽåˆ‡į›ŽåŊ•čˇ¯åž„åŠå…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚æ­¤æ¨Ąåŧäģ…适ᔍäēŽį›ŽåŊ•īŧŒ ä¸é€‚į”¨äēŽæ–‡äģļ。 åŊ“您指åޚäģĨ / åŧ€å¤´įš„įģå¯ščˇ¯åž„æ—ļīŧŒåރåē”ᔍäēŽé˜ĩ列**æ šį›ŽåŊ•**īŧŒ č€Œä¸æ˜¯æœŦ地文äģļįŗģį쟿 šį›ŽåŊ•。 在 Windows 中īŧŒæ‚¨å¯äģĨäŊŋį”¨åæ–œæ  \ äģŖæ›ŋæ­Ŗæ–œæ  /。 Windows įŗģįģŸį›ŽåŊ•、čŋžæŽĨį‚šã€æŒ‚čŊŊį‚šå’Œå…ļäģ– Windows į‰šæŽŠį›ŽåŊ•čĸĢ视ä¸ē文äģļīŧŒčŋ™æ„å‘ŗį€čĻæŽ’é™¤åŽƒäģŦīŧŒ 您åŋ…éĄģäŊŋį”¨æ–‡äģļč§„åˆ™īŧŒč€Œä¸æ˜¯į›ŽåŊ•č§„åˆ™ã€‚ åĻ‚æžœæ–‡äģļ名包åĢ `*`、`?`、`[` 或 `]` 字įŦĻīŧŒæ‚¨åŋ…éĄģ寚å…ļčŋ›čĄŒčŊŦ义īŧŒäģĨéŋ免将å…ļč§Ŗé‡Šä¸ē globbing 字įŦĻ。在 Unix 中īŧŒčŊŦ䚉字įŦĻæ˜¯ `\`īŧ›åœ¨ Windows 中īŧŒåŽƒæ˜¯ `^`。 åŊ“æ¨Ąåŧåœ¨å‘Ŋäģ¤čĄŒä¸Šæ—ļīŧŒæ‚¨åŋ…éĄģ双写čŊŦ义 字įŦĻīŧŒäģĨéŋ免å‘Ŋäģ¤ shell 寚å…ļčŋ›čĄŒč§Ŗé‡Šã€‚ 在配įŊŽæ–‡äģļ中īŧŒæ‚¨å¯äģĨäŊŋį”¨ä¸åŒįš„į­–į•ĨæĨčŋ‡æģ¤čĻå¤„į†įš„æ–‡äģļ。 æœ€įŽ€å•įš„æ–šæŗ•æ˜¯äģ…äŊŋᔍ `exclude` č§„åˆ™æĨåˆ é™¤æ‰€æœ‰æ‚¨ä¸æƒŗå¤„į†įš„ 文äģļå’Œį›ŽåŊ•。䞋åĻ‚īŧš :# 排除äģģäŊ•名ä¸ē `*.unrecoverable` įš„æ–‡äģļ :exclude *.unrecoverable :# æŽ’é™¤æ šį›ŽåŊ• `/lost+found` :exclude /lost+found/ :# 排除äģģäŊ•名ä¸ē `tmp` įš„å­į›ŽåŊ• :exclude tmp/ į›¸åįš„æ–šæŗ•æ˜¯äģ…åŽšäš‰æ‚¨æƒŗčĻå¤„į†įš„æ–‡äģļīŧŒäģ…äŊŋᔍ `include` č§„åˆ™ã€‚äž‹åĻ‚īŧš :# äģ…包åĢ一äē›į›ŽåŊ• :include /movies/ :include /musics/ :include /pictures/ æœ€åŽįš„æ–šæŗ•æ˜¯æˇˇåˆäŊŋᔍ `exclude` 和 `include` č§„åˆ™ã€‚åœ¨čŋ™į§æƒ…å†ĩ下īŧŒ č§„åˆ™įš„éĄēåēåžˆé‡čĻã€‚čžƒæ—Šįš„č§„åˆ™äŧ˜å…ˆäēŽ čžƒæ™šįš„č§„åˆ™ã€‚ ä¸ēäē†įŽ€åŒ–īŧŒæ‚¨å¯äģĨ先列å‡ē所有 `exclude` č§„åˆ™īŧŒį„ļ后 列å‡ē所有 `include` č§„åˆ™ã€‚äž‹åĻ‚īŧš :# 排除äģģäŊ•名ä¸ē `*.unrecoverable` įš„æ–‡äģļ :exclude *.unrecoverable :# 排除äģģäŊ•名ä¸ē `tmp` įš„å­į›ŽåŊ• :exclude tmp/ :# äģ…包åĢ一äē›į›ŽåŊ• :include /movies/ :include /musics/ :include /pictures/ 在å‘Ŋäģ¤čĄŒä¸ŠīŧŒäŊŋᔍ -f 选项īŧŒæ‚¨åĒčƒŊäŊŋᔍ `include` æ¨Ąåŧã€‚äž‹åĻ‚īŧš :# äģ…æŖ€æŸĨ .mp3 文äģļ。 :# 在 Unix 中īŧŒäŊŋᔍåŧ•åˇäģĨéŋ免 shell æ‰Šåą• globbing。 :snapraid -f "*.mp3" check 在 Unix 中īŧŒåœ¨å‘Ŋäģ¤čĄŒä¸ŠäŊŋᔍ globbing 字įŦĻæ—ļīŧŒåŋ…éĄģ åŧ•ᔍåރäģŦäģĨ防æ­ĸ shell æ‰Šåą•åŽƒäģŦ。 Ignore File 除äē†é…įŊŽæ–‡äģļä¸­įš„å…¨åą€č§„åˆ™å¤–īŧŒæ‚¨čŋ˜å¯äģĨ在é˜ĩåˆ—å†…įš„äģģäŊ•į›ŽåŊ•中攞įŊŽ `.snapraidignore` 文äģļīŧŒäģĨåŽšäš‰åˆ†æ•Ŗįš„æŽ’é™¤č§„åˆ™ã€‚ 在 `.snapraidignore` ä¸­åŽšäš‰įš„č§„åˆ™äŧšåœ¨é…įŊŽæ–‡äģļä¸­įš„č§„åˆ™äš‹åŽåē”į”¨ã€‚ čŋ™æ„å‘ŗį€åރäģŦå…ˇæœ‰æ›´éĢ˜įš„äŧ˜å…ˆįē§īŧŒå¯į”¨äēŽæŽ’é™¤å…ˆå‰į”ąå…¨åą€é…įŊŽåŒ…åĢįš„æ–‡äģļ。 厞际上īŧŒåĻ‚æžœæœŦåœ°č§„åˆ™åŒšé…īŧŒåˆ™æ— čŽēå…¨åą€åŒ…åĢ莞įŊŽåĻ‚äŊ•īŧŒč¯Ĩ文äģļéƒŊäŧščĸĢæŽ’é™¤ã€‚ `.snapraidignore` ä¸­įš„æ¨Ąåŧé€ģčž‘ä¸Žå…¨åą€é…įŊŽį›¸åŒīŧŒäŊ†æ¨Ąåŧé”šåޚ圍 č¯Ĩ文äģ￉€åœ¨įš„į›ŽåŊ•īŧš =FILE é€‰æ‹Šæ­¤į›ŽåŊ•或å…ļ下斚äģģäŊ•名ä¸ē FILE įš„æ–‡äģļ。 čŋ™éĩåžĒä¸Žå…¨åą€æ¨Ąåŧį›¸åŒįš„通配įŦĻč§„åˆ™ã€‚ =DIR/ 选拊äģģäŊ•名ä¸ē DIR įš„į›ŽåŊ•及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšīŧŒ äŊäēŽæ­¤į›ŽåŊ•或å…ļ下斚。 =/PATH/FILE é€‰æ‹Šį›¸å¯šäēŽ `.snapraidignore` 文äģļäŊįŊŽæŒ‡åŽšįš„į˛žįĄŽæ–‡äģļ。 =/PATH/DIR/ é€‰æ‹Šį›¸å¯šäēŽ `.snapraidignore` 文äģļäŊįŊŽæŒ‡åŽšįš„į˛žįĄŽį›ŽåŊ• 及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚ ä¸Žå…¨åą€é…įŊŽä¸åŒīŧŒ`.snapraidignore` 文äģļäģ…æ”¯æŒæŽ’é™¤č§„åˆ™īŧ› 您不čƒŊäŊŋᔍ `include` æ¨Ąåŧæˆ–åĻ厚įŦĻåˇ (!)。 例åĻ‚īŧŒåĻ‚æžœæ‚¨åœ¨ `/mnt/disk1/projects/` 中有一ä¸Ē `.snapraidignore`īŧš :# ä셿ޒ除 /mnt/disk1/projects/output.bin :/output.bin :# 排除 projects/ 中äģģäŊ•名ä¸ē `build` įš„į›ŽåŊ• :build/ :# 排除 projects/ 或å…ļ子文äģļ多中äģģäŊ• .tmp 文äģļ :*.tmp Content SnapRAID 将文äģļåˆ—čĄ¨å’Œæ ĄéĒŒå’Œå­˜å‚¨åœ¨ content 文äģļ中。 厃是一ä¸ĒäēŒčŋ›åˆļ文äģļīŧŒåˆ—å‡ēäē†įŖį›˜é˜ĩåˆ—ä¸­å­˜åœ¨įš„æ‰€æœ‰æ–‡äģļīŧŒ äģĨåŠį”¨äēŽénj蝁å…ļåŽŒæ•´æ€§įš„æ‰€æœ‰æ ĄéĒŒå’Œã€‚ 此文äģļį”ą `sync` 和 `scrub` å‘Ŋäģ¤č¯ģ取和写å…ĨīŧŒåšļį”ą `fix`、`check` 和 `status` å‘Ŋäģ¤č¯ģ取。 Parity SnapRAID 将é˜ĩåˆ—įš„åĨ‡åļæ ĄénjäŋĄæ¯å­˜å‚¨åœ¨ parity 文äģļ中。 čŋ™ä盿˜¯äēŒčŋ›åˆļ文äģļīŧŒåŒ…åĢ `content` 文äģļä¸­åŽšäš‰įš„æ‰€æœ‰ å—įš„čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ čŋ™ä盿–‡äģļį”ą `sync` 和 `fix` å‘Ŋäģ¤č¯ģ取和写å…ĨīŧŒ åšļ且äģ…į”ą `scrub` 和 `check` å‘Ŋäģ¤č¯ģ取。 Encoding SnapRAID 在 Unix 中åŋŊį•ĨäģģäŊ•įŧ–į ã€‚åރč¯ģ取åšļ存储 文äģļįŗģįģŸäŊŋį”¨įš„į›¸åŒįŧ–į įš„æ–‡äģļ名。 在 Windows 中īŧŒäģŽæ–‡äģļįŗģįģŸč¯ģå–įš„æ‰€æœ‰åį§°éƒŊäŧščĸĢčŊŦæĸåšļ äģĨ UTF-8 æ ŧåŧå¤„į†ã€‚ čρäŊŋ文äģļåæ­ŖįĄŽæ‰“å°īŧŒæ‚¨åŋ…éĄģäŊŋᔍå‘Ŋäģ¤ `chcp 65001` 将 Windows 控åˆļå°čŽžįŊŽä¸ē UTF-8 æ¨ĄåŧīŧŒåšļäŊŋᔍ TrueType 字äŊ“īŧŒåĻ‚ `Lucida Console`īŧŒ äŊœä¸ē控åˆļ台字äŊ“。čŋ™äģ…åŊąå“æ‰“å°įš„æ–‡äģļ名īŧ›åĻ‚æžœ 您将控åˆļå°čž“å‡ē重厚向到文äģļīŧŒåˆ™į”Ÿæˆįš„æ–‡äģļ始įģˆ é‡‡į”¨ UTF-8 æ ŧåŧã€‚ Copyright 此文äģļį‰ˆæƒæ‰€æœ‰ (C) 2025 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid-zh.txt000066400000000000000000001647441522717156100170250ustar00rootroot00000000000000 ================= įŖį›˜é˜ĩåˆ—įš„ SnapRAID 备äģŊ ================= 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAID 是一æŦžä¸“ä¸ēįŖį›˜é˜ĩåˆ—čŽžčŽĄįš„å¤‡äģŊፋåēīŧŒåŽƒå­˜å‚¨åĨ‡åļæ ĄénjäŋĄæ¯īŧŒ äģĨ在最多六ä¸ĒįŖį›˜å‘į”Ÿæ•…éšœæ—ļčŋ›čĄŒæ•°æŽæĸ复。 SnapRAID ä¸ģčρéĸ向æ‹Ĩ有大型、不常更攚文äģļįš„åŽļåē­åĒ’äŊ“中åŋƒīŧŒæäž›äģĨä¸‹į‰šæ€§īŧš * 您可äģĨäŊŋᔍ厞åĄĢ充文äģļįš„įŖį›˜īŧŒæ— éœ€é‡æ–°æ ŧåŧåŒ–īŧŒåšļåƒåž€å¸¸ä¸€æ ˇčŽŋ闎厃äģŦ。 * æ‚¨įš„æ‰€æœ‰æ•°æŽéƒŊäŧščĸĢæ•Ŗåˆ—īŧŒäģĨįĄŽäŋå­˜å‚¨åŽŒæ•´æ€§åšļ防æ­ĸ静é옿Ÿåã€‚ * åŊ“æ•…éšœįŖį›˜æ•°é‡čļ…čŋ‡åĨ‡åļæ ĄéĒŒæ•°æ—ļīŧŒæ•°æŽä¸ĸå¤ąäģ…限äēŽå—åŊąå“įš„įŖį›˜īŧ› å…ļäģ–įŖį›˜ä¸Šįš„æ•°æŽäģį„ļ可čŽŋ闎。 * åĻ‚æžœæ‚¨ä¸å°åŋƒåˆ é™¤äē†įŖį›˜ä¸Šįš„æ–‡äģļīŧŒå¯äģĨčŋ›čĄŒæĸ复。 * įŖį›˜å¯äģĨæœ‰ä¸åŒįš„å°ē寸。 * 您可äģĨ随æ—ᅫģåŠ įŖį›˜ã€‚ * SnapRAID 不äŧšé”åŽšæ‚¨įš„æ•°æŽīŧ›æ‚¨å¯äģĨ随æ—ļ停æ­ĸäŊŋį”¨åŽƒīŧŒæ— éœ€é‡æ–°æ ŧåŧåŒ–或į§ģ动数捎。 * čŽŋé—Žæ–‡äģļæ—ļīŧŒåĒ需一ä¸ĒįŖį›˜čŊŦ动īŧŒäģŽč€ŒčŠ‚įœį”ĩ力åšļ降äŊŽå™ĒéŸŗã€‚ æŦ˛äē†č§Ŗæ›´å¤šäŋĄæ¯īŧŒč¯ˇčŽŋ问 SnapRAID 厘斚įŊ‘įĢ™īŧš https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID 是 RAID 和备äģŊፋåēäš‹é—´įš„æˇˇåˆäŊ“īŧŒæ—¨åœ¨įģ“åˆä¸¤č€…įš„äŧ˜į‚šã€‚ į„ļ而īŧŒåœ¨äŊŋį”¨åŽƒäš‹å‰īŧŒæ‚¨åē”č¯Ĩ考虑一äē›é™åˆļ。 ä¸ģčĻįš„é™åˆļ是īŧŒåĻ‚æžœä¸€ä¸ĒįŖį›˜å‘į”Ÿæ•…éšœč€Œæ‚¨æœ€čŋ‘æ˛Ąæœ‰čŋ›čĄŒåŒæ­Ĩīŧˆsyncīŧ‰īŧŒ 您可čƒŊæ— æŗ•åŽŒå…¨æĸ复。 æ›´å…ˇäŊ“åœ°č¯´īŧŒæ‚¨å¯čƒŊæ— æŗ•æĸ复č‡Ē上æŦĄåŒæ­Ĩ操äŊœäģĨæĨåˇ˛æ›´æ”šæˆ–åˇ˛åˆ é™¤æ–‡äģļįš„ 大小所寚åē”įš„éƒ¨åˆ†ã€‚ åŗäŊŋæ›´æ”šæˆ–åˆ é™¤įš„æ–‡äģļä¸åœ¨å‘į”Ÿæ•…éšœįš„įŖį›˜ä¸ŠīŧŒäšŸäŧšå‘į”Ÿčŋ™į§æƒ…å†ĩ。 čŋ™å°ąæ˜¯ä¸ēäģ€äšˆ SnapRAID æ›´é€‚į”¨äēŽåžˆå°‘æ›´æ”šįš„æ•°æŽã€‚ åĻ一斚éĸīŧŒæ–°æˇģåŠ įš„æ–‡äģļ不äŧšé˜ģæ­ĸå¯šåˇ˛æœ‰æ–‡äģļįš„æĸ复。 您åĒäŧšä¸ĸå¤ąäŊäēŽå‘į”Ÿæ•…éšœįŖį›˜ä¸Šįš„æœ€čŋ‘æˇģåŠ įš„æ–‡äģļ。 SnapRAID įš„å…ļäģ–限åˆļ包æ‹Ŧīŧš * äŊŋᔍ SnapRAIDīŧŒæ¯ä¸ĒįŖį›˜äģį„ļ有单į‹Ŧįš„æ–‡äģļįŗģįģŸã€‚ äŊŋᔍ RAIDīŧŒæ‚¨å¯äģĨčŽˇåž—ä¸€ä¸Ēå•ä¸€įš„å¤§åž‹æ–‡äģļįŗģįģŸã€‚ * SnapRAID 不čŋ›čĄŒæ•°æŽæĄå¸Ļ化。 äŊŋᔍ RAIDīŧŒæ‚¨å¯äģĨ通čŋ‡æĄå¸ĻåŒ–čŽˇåž—é€ŸåēĻæå‡ã€‚ * SnapRAID 不支持厞æ—￁ĸ复。 äŊŋᔍ RAIDīŧŒåŊ“įŖį›˜å‘į”Ÿæ•…éšœæ—ļīŧŒæ‚¨ä¸åŋ…停æ­ĸåˇĨäŊœã€‚ * SnapRAID åĒčƒŊäģŽæœ‰é™æ•°é‡įš„įŖį›˜æ•…éšœä¸­æĸ复数捎。 äŊŋᔍ备äģŊīŧŒæ‚¨å¯äģĨäģŽæ•´ä¸ĒįŖį›˜é˜ĩåˆ—įš„åŽŒå…¨æ•…éšœä¸­æĸ复。 * äģ…äŋå­˜æ–‡äģļ名、æ—ļé—´æˆŗã€įŦĻåˇé“žæŽĨ和įĄŦ链æŽĨ。 不äŋå­˜æƒé™ã€æ‰€æœ‰æƒå’Œæ‰Šåą•åąžæ€§ã€‚ 4 GETTING STARTED ================= čρäŊŋᔍ SnapRAIDīŧŒæ‚¨éœ€čρéĻ–å…ˆé€‰æ‹ŠįŖį›˜é˜ĩåˆ—ä¸­įš„ä¸€ä¸ĒįŖį›˜ä¸“į”¨äēŽ `parity`īŧˆåĨ‡åļæ Ąénjīŧ‰äŋĄæ¯ã€‚äŊŋᔍ䏀ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒ 您将čƒŊ够äģŽå•įŖį›˜æ•…éšœä¸­æĸ复īŧŒįąģäŧŧäēŽ RAID5。 åĻ‚æžœæ‚¨æƒŗäģŽæ›´å¤šįš„įŖį›˜æ•…éšœä¸­æĸ复īŧŒįąģäŧŧäēŽ RAID6īŧŒ 您åŋ…éĄģéĸ„į•™éĸå¤–įš„įŖį›˜į”¨äēŽåĨ‡åļæ ĄéĒŒã€‚æ¯åĸžåР䏀ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒ å°ąå¯äģĨ多æĸ复一ä¸ĒįŖį›˜æ•…éšœã€‚ äŊœä¸ēåĨ‡åļæ ĄéĒŒįŖį›˜īŧŒæ‚¨åŋ…éĄģ选拊é˜ĩåˆ—ä¸­æœ€å¤§įš„įŖį›˜īŧŒ 因ä¸ēåĨ‡åļæ ĄénjäŋĄæ¯å¯čƒŊäŧšåĸžé•ŋ到é˜ĩåˆ—ä¸­æœ€å¤§įš„æ•°æŽįŖį›˜įš„å¤§å°ã€‚ čŋ™äē›įŖį›˜å°†ä¸“闍ᔍäēŽå­˜å‚¨ `parity` 文äģļ。 您不åē”č¯Ĩ在厃äģŦ上éĸå­˜å‚¨æ‚¨įš„æ•°æŽã€‚ į„ļ后īŧŒæ‚¨åŋ…éĄģ厚䚉čρäŊŋᔍ SnapRAID äŋæŠ¤įš„ `data`īŧˆæ•°æŽīŧ‰įŖį›˜ã€‚ åĻ‚æžœčŋ™äē›įŖį›˜åŒ…åĢåžˆå°‘æ›´æ”šįš„æ•°æŽīŧŒäŋæŠ¤äŧšæ›´æœ‰æ•ˆã€‚å› æ­¤īŧŒ 最åĨŊ**不čρ**包åĢ Windows C:\ įŖį›˜æˆ– Unix įš„ /home、/var 和 /tmp į›ŽåŊ•。 文äģļåˆ—čĄ¨äŋå­˜åœ¨ `content`īŧˆå†…厚īŧ‰æ–‡äģļ中īŧŒé€šå¸¸å­˜å‚¨åœ¨æ•°æŽã€åĨ‡åļæ ĄéĒŒæˆ– åŧ•å¯ŧįŖį›˜ä¸Šã€‚ č¯Ĩ文äģļ包åĢ备äģŊįš„č¯Ļįģ†äŋĄæ¯īŧŒåŒ…æ‹Ŧæ‰€æœ‰į”¨äēŽénj蝁å…ļåŽŒæ•´æ€§įš„æ ĄéĒŒå’Œã€‚ `content` 文äģļ存储有多ä¸Ē副æœŦīŧŒæ¯ä¸Ē副æœŦåŋ…éĄģäŊäēŽä¸åŒįš„įŖį›˜ä¸ŠīŧŒ äģĨįĄŽäŋå­˜å‚¨æœ‰å¤šä¸ĒįŖį›˜æ•…éšœæ—ļīŧŒč‡ŗå°‘有一ä¸Ē副æœŦå¯į”¨ã€‚ 例åĻ‚īŧŒå‡čŽžæ‚¨åĒ寚一ä¸ĒåĨ‡åļæ ĄénjäŋæŠ¤įē§åˆĢ感兴čļŖīŧŒåšļä¸”æ‚¨įš„įŖį›˜äŊäēŽīŧš /mnt/diskp <- é€‰åŽšįš„åĨ‡åļæ ĄéĒŒįŖį›˜ /mnt/disk1 <- įŦŦ一ä¸ĒčρäŋæŠ¤įš„įŖį›˜ /mnt/disk2 <- įŦŦäēŒä¸ĒčρäŋæŠ¤įš„įŖį›˜ /mnt/disk3 <- įŦŦ三ä¸ĒčρäŋæŠ¤įš„įŖį›˜ 您åŋ…éĄģ创åģē配įŊŽæ–‡äģļ /etc/snapraid.confīŧŒåšļ包åĢäģĨ下选项īŧš parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ åĻ‚æžœæ‚¨äŊŋᔍ WindowsīŧŒæ‚¨åē”č¯ĨäŊŋᔍ Windows čˇ¯åž„æ ŧåŧīŧŒ į”¨éŠąåŠ¨å™¨åˇå’Œåæ–œæ äģŖæ›ŋ斜杠。 parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ åĻ‚æžœæ‚¨æœ‰čŽ¸å¤šįŖį›˜ä¸”éŠąåŠ¨å™¨åˇį”¨å°ŊīŧŒæ‚¨å¯äģĨå°†įŖį›˜į›´æŽĨ挂čŊŊ到子文äģļå¤šä¸­ã€‚č¯ˇå‚é˜…īŧš https://www.google.com/search?q=Windows+mount+point æ­¤æ—ļīŧŒæ‚¨åˇ˛å‡†å¤‡åĨŊčŋčĄŒ `sync` å‘Ŋä줿Ĩ构åģēåĨ‡åļæ ĄénjäŋĄæ¯ã€‚ snapraid sync įŦŦ一æŦĄčŋčĄŒæ­¤čŋ‡į¨‹å¯čƒŊ需čρ几ä¸Ē小æ—ļīŧŒå…ˇäŊ“å–å†ŗäēŽįŖį›˜ä¸Šåˇ˛å­˜åœ¨æ•°æŽįš„大小。 åĻ‚æžœįŖį›˜æ˜¯įŠēįš„īŧŒåˆ™čŋ‡į¨‹æ˜¯åŗæ—ļįš„ã€‚ 您可äģĨ随æ—ļ按 Ctrl+C 停æ­ĸ厃īŧŒåœ¨ä¸‹æŦĄčŋčĄŒæ—ļīŧŒåŽƒå°†äģŽä¸­æ–­įš„地斚æĸ复。 åŊ“æ­¤å‘Ŋäģ¤åŽŒæˆæ—ļīŧŒæ‚¨įš„æ•°æŽæ˜¯**åŽ‰å…¨įš„**。 įŽ°åœ¨æ‚¨å¯äģĨåŧ€å§‹éšæ„äŊŋį”¨æ‚¨įš„é˜ĩ列īŧŒåšļ厚期čŋčĄŒ `sync` å‘Ŋä줿›´æ–°åĨ‡åļæ ĄénjäŋĄæ¯ã€‚ 4.1 Scrubbing ------------- čĻåŽšæœŸæŖ€æŸĨ数捎和åĨ‡åļæ ĄéĒŒįš„é”™č¯¯īŧŒæ‚¨å¯äģĨčŋčĄŒ `scrub` å‘Ŋäģ¤ã€‚ snapraid scrub æ­¤å‘Ŋäģ¤å°†é˜ĩåˆ—ä¸­įš„æ•°æŽä¸Ž `sync` å‘Ŋä줿œŸé—´čŽĄįŽ—įš„æ•Ŗåˆ—čŋ›čĄŒæ¯”čžƒīŧŒ äģĨéĒŒč¯åŽŒæ•´æ€§ã€‚ 每æŦĄčŋčĄŒč¯Ĩå‘Ŋäģ¤äŧšæŖ€æŸĨ大įēĻ 8% įš„é˜ĩ列īŧŒæŽ’除在čŋ‡åŽģ 10 夊内 厞čĸĢ scrub įš„æ•°æŽã€‚ 您可äģĨäŊŋᔍ -p, --plan 选项æĨæŒ‡åŽšä¸åŒįš„é‡īŧŒ åšļäŊŋᔍ -o, --older-than 选项æĨæŒ‡åŽšä¸åŒįš„å¤Šæ•°ã€‚ 例åĻ‚īŧŒčĻæŖ€æŸĨ 20 夊äģĨä¸Šå—įš„ 5% é˜ĩ列īŧŒč¯ˇäŊŋᔍīŧš snapraid -p 5 -o 20 scrub åĻ‚æžœåœ¨čŋ‡į¨‹ä¸­å‘įŽ°é™éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒ ᛏåē”įš„å—äŧšåœ¨ `content` 文äģļ中čĸĢæ ‡čްä¸ē坏块īŧŒåšļ列在 `status` å‘Ŋäģ¤ä¸­ã€‚ snapraid status čρäŋŽå¤åރäģŦīŧŒæ‚¨å¯äģĨäŊŋᔍ `fix` å‘Ŋäģ¤īŧŒäŊŋᔍ -e, --filter-error 选项čŋ‡æģ¤åå—īŧš snapraid -e fix 在下æŦĄ `scrub` æ—ļīŧŒåĻ‚æžœåŽƒäģŦįĄŽåŽžčĸĢäŋŽå¤äē†īŧŒé”™č¯¯å°†äģŽ `status` æŠĨ告中æļˆå¤ąã€‚ ä¸ēä熿›´åŋĢīŧŒæ‚¨å¯äģĨäŊŋᔍ -p bad æĨäģ… scrub æ ‡čŽ°ä¸ēåå—įš„å—ã€‚ snapraid -p bad scrub 在æœĒ同æ­Ĩįš„é˜ĩ列上čŋčĄŒ `scrub` 可čƒŊäŧšæŠĨå‘Šį”ąåˇ˛åˆ é™¤æˆ–åˇ˛äŋŽæ”šæ–‡äģļåŧ•čĩˇįš„é”™č¯¯ã€‚ čŋ™äē›é”™č¯¯äŧšåœ¨ `scrub` 输å‡ē中æŠĨ告īŧŒäŊ†į›¸å…ŗå—不äŧščĸĢæ ‡čްä¸ē坏块。 4.2 Pooling ----------- æŗ¨æ„īŧšä¸‹éĸ描čŋ°įš„ pooling 功čƒŊ厞čĸĢ mergerfs åˇĨå…ˇå–äģŖīŧŒ mergerfs įŽ°åœ¨æ˜¯ SnapRAID į¤žåŒēæŽ¨čįš„ Linux į”¨æˆˇé€‰éĄšã€‚ Mergefs 提䞛äē†ä¸€į§æ›´įĩæ´ģ、更éĢ˜æ•ˆįš„æ–šåŧīŧŒå°†å¤šä¸ĒéŠąåŠ¨å™¨æą‡é›†åˆ°ä¸€ä¸Ē įģŸä¸€įš„æŒ‚čŊŊį‚šä¸­īŧŒå…čޏ莍é˜ĩ列无įŧčŽŋé—Žæ–‡äģļīŧŒč€Œæ— éœ€äžčĩ–įŦĻåˇé“žæŽĨ。 厃与 SnapRAID 垈åĨŊ地集成äģĨ提䞛åĨ‡åļæ ĄénjäŋæŠ¤īŧŒå¸¸į”¨äēŽ OpenMediaVault (OMV) 或č‡Ē厚䚉 NAS 配įŊŽį­‰čŽžįŊŽä¸­ã€‚ čρäŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰æ–‡äģ￘žį¤ē在同一ä¸Ēį›ŽåŊ•树中īŧŒ 您可äģĨ吝ᔍ `pooling` 功čƒŊ。厃äŊŋᔍįŦĻåˇé“žæŽĨ创åģēäē†ä¸€ä¸Ē é˜ĩ列中所有文äģļįš„åĒč¯ģč™šæ‹Ÿč§†å›žã€‚ 您可äģĨ在配įŊŽæ–‡äģļ中äŊŋᔍäģĨ下选项配įŊŽ `pooling` į›ŽåŊ•īŧš pool /pool æˆ–č€…īŧŒåĻ‚æžœæ‚¨äŊŋᔍ WindowsīŧŒåˆ™äŊŋᔍīŧš pool C:\pool į„ļ后čŋčĄŒ `pool` å‘Ŋäģ¤åˆ›åģ翈–æ›´æ–°č™šæ‹Ÿč§†å›žã€‚ snapraid pool åĻ‚æžœæ‚¨äŊŋᔍ Unix åšŗå°åšļ希望通čŋ‡įŊ‘įģœå°†æ­¤į›ŽåŊ•å…ąäēĢįģ™ Windows 或 Unix æœē器īŧŒ 您åē”č¯Ĩ在 /etc/samba/smb.conf 中æˇģ加äģĨ下选项īŧš # 在 smb.conf įš„å…¨åą€éƒ¨åˆ† unix extensions = no # 在 smb.conf įš„å…ąäēĢ部分 [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes 在 Windows 中īŧŒé€ščŋ‡įŊ‘įģœå…ąäēĢįŦĻåˇé“žæŽĨ需čρåŽĸæˆˇį̝čŋœį¨‹č§ŖæžåރäģŦ。 čĻå¯į”¨æ­¤åŠŸčƒŊīŧŒé™¤äē†å…ąäēĢ pool į›ŽåŊ•䚋外īŧŒæ‚¨čŋ˜åŋ…éĄģį‹ŦįĢ‹å…ąäēĢæ‰€æœ‰įŖį›˜īŧŒ äŊŋį”¨é…įŊŽæ–‡äģļä¸­åŽšäš‰įš„įŖį›˜åį§°äŊœä¸ēå…ąäēĢį‚šã€‚ 您čŋ˜åŋ…éĄģ在配įŊŽæ–‡äģļįš„ `share` é€‰éĄšä¸­æŒ‡åŽščŋœį¨‹åŽĸæˆˇį̝čŽŋ问čŋ™äē› å…ąäēĢįŖį›˜æ‰€éœ€įš„ Windows UNC čˇ¯åž„ã€‚ 例åĻ‚īŧŒåœ¨åä¸ē `darkstar` įš„æœåŠĄå™¨ä¸Šæ“äŊœīŧŒæ‚¨å¯äģĨäŊŋᔍäģĨ下选项īŧš data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar åšļ通čŋ‡įŊ‘įģœå…ąäēĢäģĨä¸‹į›ŽåŊ•īŧš \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array äģĨå…čŽ¸čŋœį¨‹åŽĸæˆˇį̝čŽŋ问 \\darkstar\pool å¤„įš„æ‰€æœ‰æ–‡äģļ。 您可čƒŊčŋ˜éœ€čĻé…įŊŽčŋœį¨‹åŽĸæˆˇį̝īŧŒäŊŋᔍäģĨ下å‘Ŋäģ¤å¯į”¨å¯ščŋœį¨‹įŦĻåˇé“žæŽĨįš„čŽŋ问īŧš fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAID įš„åŠŸčƒŊ更像一ä¸Ē备äģŊፋåēč€Œä¸æ˜¯ RAID įŗģįģŸīŧŒ 厃可äģĨäŊŋᔍ -f, --filter 选项æĨæĸ复或取æļˆåˆ é™¤æ–‡äģļ到å…ļäģĨå‰įš„įŠļ态īŧš snapraid fix -f FILE æˆ–č€…å¯šäēŽä¸€ä¸Ēį›ŽåŊ•īŧš snapraid fix -f DIR/ 您䚟可äģĨäŊŋᔍ -m, --filter-missing 选项æĨäģ…æĸå¤į›ŽåŊ•å†…æ„å¤–åˆ é™¤įš„æ–‡äģļīŧŒ č¯Ĩ选项äģ…æĸ复ä¸ĸå¤ąįš„æ–‡äģļīŧŒäŋæŒæ‰€æœ‰å…ļäģ–æ–‡äģļ不变。 snapraid fix -m -f DIR/ æˆ–č€…äŊŋᔍäģĨ下å‘Ŋä줿ĸå¤æ‰€æœ‰éŠąåŠ¨å™¨ä¸Šæ‰€æœ‰åˇ˛åˆ é™¤įš„æ–‡äģļīŧš snapraid fix -m 4.4 Recovering -------------- æœ€įŗŸįŗ•įš„æƒ…å†ĩå‘į”Ÿäē†īŧŒæ‚¨ä¸ĸå¤ąäē†ä¸€ä¸Ē或多ä¸ĒįŖį›˜īŧ **不čĻæƒŠæ…Œīŧ** 您将čƒŊ够æĸ复厃äģŦīŧ 您åŋ…éĄģåšįš„įŦŦ一äģļä狿˜¯éŋå…å¯šįŖį›˜é˜ĩ列čŋ›čĄŒčŋ›ä¸€æ­Ĩįš„æ›´æ”šã€‚ įĻį”¨å¯šå…ļįš„äģģäŊ•čŋœį¨‹čŋžæŽĨäģĨ及äģģäŊ•čŽĄåˆ’įš„čŋ›į¨‹īŧŒåŒ…æ‹ŦäģģäŊ•čŽĄåˆ’įš„ SnapRAID 夜间同æ­Ĩ或 scrub。 į„ļ后įģ§įģ­æ‰§čĄŒäģĨ下æ­ĨéĒ¤ã€‚ ---- 4.4.1 STEP 1 -> 重新配įŊŽ ---- 您需čρ䏀äē›įŠē间æĨæĸ复īŧŒį†æƒŗæƒ…å†ĩ下是在éĸå¤–įš„å¤‡į”¨įŖį›˜ä¸ŠīŧŒ äŊ†å¤–部 USB įŖį›˜æˆ–čŋœį¨‹įŖį›˜äšŸčļŗå¤Ÿã€‚ äŋŽæ”š SnapRAID 配įŊŽæ–‡äģļīŧŒäŊŋæ•…éšœįŖį›˜įš„ `data` 或 `parity` é€‰éĄšæŒ‡å‘ 一ä¸Ēå…ˇæœ‰čļŗå¤ŸįŠē闲įŠē间æĨæĸ复文äģļįš„äŊįŊŽã€‚ 例åĻ‚īŧŒåĻ‚æžœįŖį›˜ `d1` å‘į”Ÿæ•…éšœīŧŒåˆ™äģŽīŧš data d1 /mnt/disk1/ 更攚ä¸ēīŧš data d1 /mnt/new_spare_disk/ åĻ‚æžœéœ€čρæĸå¤įš„įŖį›˜æ˜¯åĨ‡åļæ ĄéĒŒįŖį›˜īŧŒč¯ˇæ›´æ–°į›¸åē”įš„ `parity` é€‰éĄšã€‚ åĻ‚æžœæ‚¨æœ‰å¤šä¸Ēæ•…éšœįŖį›˜īŧŒč¯ˇæ›´æ–°æ‰€æœ‰åރäģŦįš„é…įŊŽé€‰éĄšã€‚ ---- 4.4.2 STEP 2 -> äŋŽå¤ ---- čŋčĄŒ fix å‘Ŋäģ¤īŧŒåšļ将æ—Ĩåŋ—存储在外部文äģļ中īŧš snapraid -d NAME -l fix.log fix å…ļ中 NAME æ˜¯įŖį›˜įš„åį§°īŧŒäž‹åĻ‚æˆ‘äģŦ前éĸäž‹å­ä¸­įš„ `d1`。 åĻ‚æžœéœ€čρæĸå¤įš„įŖį›˜æ˜¯åĨ‡åļæ ĄéĒŒįŖį›˜īŧŒč¯ˇäŊŋį”¨åį§° `parity`、`2-parity` į­‰ã€‚ åĻ‚æžœæ‚¨æœ‰å¤šä¸Ēæ•…éšœįŖį›˜īŧŒč¯ˇäŊŋį”¨å¤šä¸Ē -d 选项æĨ指厚所有厃äģŦ。 æ­¤å‘Ŋäģ¤å°†čŠąč´šåžˆé•ŋæ—ļ间。 įĄŽäŋæ‚¨æœ‰å‡  GB įš„å¯į”¨įŠē间æĨ存储 fix.log 文äģļ。 在有čļŗå¤Ÿå¯į”¨įŠēé—´įš„įŖį›˜ä¸ŠčŋčĄŒåŽƒã€‚ įŽ°åœ¨æ‚¨åˇ˛įģæĸ复ä熿‰€æœ‰å¯æĸå¤įš„å†…åŽšã€‚åĻ‚æžœæœ‰ä盿–‡äģļ部分或厌全不可æĸ复īŧŒ 厃äģŦ将čĸĢ重å‘Ŋ名åšļæˇģ加 `.unrecoverable` æ‰Šåą•åã€‚ 您可äģĨ通čŋ‡æŖ€æŸĨ所有äģĨ `unrecoverable:` åŧ€å¤´įš„čĄŒīŧŒåœ¨ fix.log 文äģļ中 扞到所有不可æĸå¤å—įš„č¯Ļįģ†åˆ—čĄ¨ã€‚ åĻ‚æžœæ‚¨å¯šæĸ复不æģĄæ„īŧŒæ‚¨å¯äģĨ栚捎需čĻé‡č¯•å¤šæŦĄã€‚ 例åĻ‚īŧŒåĻ‚æžœæ‚¨åœ¨ä¸ŠæŦĄ `sync` 䚋后äģŽé˜ĩ列中删除ä熿–‡äģļīŧŒ čŋ™å¯čƒŊå¯ŧč‡´æŸä盿–‡äģļæ— æŗ•æĸ复。 在čŋ™į§æƒ…å†ĩ下īŧŒæ‚¨å¯äģĨäŊŋᔍ -i, --import é€‰éĄšé‡č¯• `fix`īŧŒ 指厚čŋ™ä盿–‡äģļįŽ°åœ¨åœ¨å“Ē里īŧŒäģĨäžŋ将厃äģŦ再æŦĄåŒ…åĢ在æĸ复čŋ‡į¨‹ä¸­ã€‚ åĻ‚æžœæ‚¨å¯šæĸ复感到æģĄæ„īŧŒæ‚¨å¯äģĨįģ§įģ­čŋ›čĄŒīŧŒ äŊ†č¯ˇæŗ¨æ„īŧŒåœ¨åŒæ­Ĩ䚋后īŧŒæ‚¨ä¸čƒŊå†é‡č¯• `fix` å‘Ŋäģ¤äē†īŧ ---- 4.4.3 STEP 3 -> æŖ€æŸĨ ---- äŊœä¸ēä¸€éĄšč°¨æ…Žįš„æŖ€æŸĨīŧŒæ‚¨įŽ°åœ¨å¯äģĨčŋčĄŒ `check` å‘Ŋäģ¤īŧŒäģĨįĄŽäŋ æĸå¤įš„įŖį›˜ä¸Šįš„ä¸€åˆ‡éƒŊæ˜¯æ­ŖįĄŽįš„ã€‚ snapraid -d NAME -a check å…ļ中 NAME æ˜¯įŖį›˜įš„åį§°īŧŒäž‹åĻ‚æˆ‘äģŦ前éĸäž‹å­ä¸­įš„ `d1`。 -d 和 -a é€‰éĄšå‘Šč¯‰ SnapRAID åĒæŖ€æŸĨæŒ‡åŽšįš„įŖį›˜åšļåŋŊį•Ĩ所有åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ æ­¤å‘Ŋäģ¤å°†čŠąč´šåžˆé•ŋæ—ļ间īŧŒäŊ†åĻ‚æžœæ‚¨ä¸æ˜¯čŋ‡äēŽč°¨æ…ŽīŧŒå¯äģĨ莺čŋ‡åŽƒã€‚ ---- 4.4.4 STEP 4 -> 同æ­Ĩ ---- čŋčĄŒ `sync` å‘Ŋäģ¤äģĨ将é˜ĩåˆ—ä¸Žæ–°įŖį›˜é‡æ–°åŒæ­Ĩ。 snapraid sync åĻ‚æžœæ‰€æœ‰å†…åŽšéƒŊ厞æĸ复īŧŒæ­¤å‘Ŋä줿˜¯åŗæ—ļįš„ã€‚ 5 COMMANDS ========== SnapRAID 提䞛äē†ä¸€äē›įŽ€å•įš„å‘Ŋäģ¤īŧŒå…čŽ¸æ‚¨īŧš * 打印é˜ĩåˆ—įš„įŠļ态 -> `status` * 控åˆļįŖį›˜ -> `smart`、`probe`、`up`、`down` * čŋ›čĄŒå¤‡äģŊ/åŋĢį…§ -> `sync` * åŽšæœŸæŖ€æŸĨ数捎 -> `scrub` * æĸ复上æŦĄå¤‡äģŊ/åŋĢį…§ -> `fix`。 å‘Ŋäģ¤åŋ…éĄģį”¨å°å†™å­—æ¯äšĻ写。 5.1 status ---------- æ‰“å°įŖį›˜é˜ĩ列įŠļæ€įš„æ‘˜čĻã€‚ 厃包æ‹Ŧæœ‰å…ŗåĨ‡åļæ ĄénjįĸŽį‰‡ã€å—æœĒįģæŖ€æŸĨ有多䚅īŧŒäģĨ及在 scrubbing æœŸé—´é‡åˆ°įš„æ‰€æœ‰čŽ°åŊ•įš„é™éģ˜é”™č¯¯įš„äŋĄæ¯ã€‚ æ‰€æäž›įš„äŋĄæ¯æŒ‡įš„æ˜¯æ‚¨ä¸ŠæŦĄčŋčĄŒ `sync` įš„æ—ļ间。 ä¸č€ƒč™‘åŽæĨįš„äŋŽæ”šã€‚ åĻ‚æžœæŖ€æĩ‹åˆ°åå—īŧŒåˆ™äŧšåˆ—å‡ē厃äģŦįš„å—åˇã€‚ čρäŋŽå¤åރäģŦīŧŒæ‚¨å¯äģĨäŊŋᔍ `fix -e` å‘Ŋäģ¤ã€‚ 厃čŋ˜äŧšæ˜žį¤ē一ä¸Ēå›žčĄ¨īŧŒčĄ¨į¤ē每ä¸Ē块上æŦĄčĸĢ scrub 或 sync įš„æ—ļ间。 čĸĢ scrub įš„å—æ˜žį¤ēä¸ē `*`īŧŒåˇ˛åŒæ­ĨäŊ†å°šæœĒ scrub įš„å—æ˜žį¤ēä¸ē `o`。 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.2 smart --------- 打印įŗģįģŸä¸­æ‰€æœ‰įŖį›˜įš„ SMART æŠĨ告。 厃包æ‹Ŧ寚明嚴故障æĻ‚įŽ‡įš„äŧ°čŽĄīŧŒå…čŽ¸æ‚¨čŽĄåˆ’æ›´æĸ昞į¤ē å¯į–‘åąžæ€§įš„įŖį›˜čŋ›čĄŒįģ´æŠ¤ã€‚ æ­¤æĻ‚įŽ‡äŧ°čŽĄæ˜¯é€ščŋ‡å°†įŖį›˜įš„ SMART åąžæ€§ä¸Ž Backblaze æäž›įš„äģĨ下数捎čŋ›čĄŒå…ŗč”čŽˇåž—įš„īŧš https://www.backblaze.com/hard-drive-test-data.html åĻ‚æžœ SMART æŠĨå‘ŠįŖį›˜æ­Ŗåœ¨å‘į”Ÿæ•…éšœīŧŒåˆ™äŧšä¸ēč¯ĨįŖį›˜æ‰“å° `FAIL` 或 `PREFAIL`īŧŒ åšļ且 SnapRAID čŋ”å›žé”™č¯¯ã€‚ 在čŋ™į§æƒ…å†ĩ下īŧŒ**åŧē჈åģē莎**įĢ‹åŗæ›´æĸįŖį›˜ã€‚ å…ļäģ–可čƒŊįš„įŠļ态字įŦĻä¸˛æœ‰īŧš logfail - čŋ‡åŽģīŧŒæŸäē›åąžæ€§äŊŽäēŽé˜ˆå€ŧ。 logerr - čŽžå¤‡é”™č¯¯æ—Ĩåŋ—包åĢé”™č¯¯ã€‚ selferr - čŽžå¤‡č‡ĒæŖ€æ—Ĩåŋ—包åĢé”™č¯¯ã€‚ åĻ‚æžœæŒ‡åŽšäē† -v, --verbose 选项īŧŒåˆ™äŧšæäž›æ›´æˇąå…Ĩįš„įģŸčŽĄåˆ†æžã€‚ 此分析可äģĨå¸ŽåŠŠæ‚¨å†ŗåŽšæ˜¯åĻ需čĻæ›´å¤šæˆ–æ›´å°‘įš„åĨ‡åļæ ĄéĒŒã€‚ æ­¤å‘Ŋäģ¤äŊŋᔍ `smartctl` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ `smartctl -a`。 åĻ‚æžœæ‚¨įš„čŽžå¤‡æœĒæ­ŖįĄŽč‡ĒåŠ¨æŖ€æĩ‹īŧŒæ‚¨å¯äģĨäŊŋį”¨é…įŊŽ æ–‡äģļä¸­įš„ `smartctl` é€‰éĄšæŒ‡åŽšč‡Ē厚䚉å‘Ŋäģ¤ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.3 probe --------- 打印įŗģįģŸä¸­æ‰€æœ‰įŖį›˜įš„**į”ĩæē**įŠļ态。 `Standby`īŧˆåž…æœēīŧ‰čĄ¨į¤ēįŖį›˜æœĒčŊŦ动。`Active`īŧˆæ´ģ动īŧ‰čĄ¨į¤ē įŖį›˜æ­Ŗåœ¨čŊŦ动。 æ­¤å‘Ŋäģ¤äŊŋᔍ `smartctl` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ `smartctl -n standby -i`。 åĻ‚æžœæ‚¨įš„čŽžå¤‡æœĒæ­ŖįĄŽč‡ĒåŠ¨æŖ€æĩ‹īŧŒæ‚¨å¯äģĨäŊŋį”¨é…įŊŽ æ–‡äģļä¸­įš„ `smartctl` é€‰éĄšæŒ‡åŽšč‡Ē厚䚉å‘Ŋäģ¤ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.4 up ------ äŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰įŖį›˜čŊŦ动čĩˇæĨ。 您可äģĨäŊŋᔍ -d, --filter-disk 选项åĒå¯åŠ¨į‰šåŽšįš„įŖį›˜ã€‚ 同æ—ļå¯åŠ¨æ‰€æœ‰įŖį›˜éœ€čĻå¤§é‡įš„į”ĩ力。 įĄŽäŋæ‚¨įš„į”ĩæēčƒŊ够æ‰ŋ受。 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.5 down -------- äŊŋé˜ĩåˆ—ä¸­įš„æ‰€æœ‰įŖį›˜åœčŊŦ。 æ­¤å‘Ŋäģ¤äŊŋᔍ `smartctl` åˇĨå…ˇīŧŒį›¸åŊ“äēŽåœ¨æ‰€æœ‰čŽžå¤‡ä¸ŠčŋčĄŒ `smartctl -s standby,now`。 您可äģĨäŊŋᔍ -d, --filter-disk 选项åĒ停čŊŦį‰šåŽšįš„įŖį›˜ã€‚ čĻåœ¨å‘į”Ÿé”™č¯¯æ—ļč‡Ē动停čŊŦīŧŒæ‚¨å¯äģĨ将 -s, --spin-down-on-error 选项与äģģäŊ•å…ļäģ–å‘Ŋäģ¤ä¸€čĩˇäŊŋᔍīŧŒčŋ™į›¸åŊ“äēŽåœ¨å‘į”Ÿé”™č¯¯æ—ļ手动čŋčĄŒ `down`。 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.6 diff -------- 列å‡ēč‡Ē上æŦĄ `sync` äģĨæĨæ‰€æœ‰åˇ˛äŋŽæ”šã€éœ€čĻé‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒæ•°æŽįš„ 文äģļ。 æ­¤å‘Ŋäģ¤ä¸æŖ€æŸĨ文äģļæ•°æŽīŧŒäģ…æŖ€æŸĨ文äģļæ—ļé—´æˆŗã€å¤§å°å’Œ inode。 列å‡ēæ‰€æœ‰æ›´æ”šįš„æ–‡äģļ后īŧŒäŧšæ˜žį¤ēæ›´æ”šįš„æ‘˜čρīŧŒæŒ‰äģĨ下斚åŧåˆ†įģ„īŧš equal - 文äģļä¸Žäš‹å‰į›¸æ¯”æœĒ更攚。 added - äš‹å‰ä¸å­˜åœ¨ã€åˇ˛æˇģåŠ įš„æ–‡äģļ。 removed - åˇ˛åˆ é™¤įš„æ–‡äģļ。 updated - 大小或æ—ļé—´æˆŗä¸åŒįš„æ–‡äģļīŧŒčĄ¨į¤ē厃äģŦ厞čĸĢäŋŽæ”šã€‚ moved - åœ¨åŒä¸€įŖį›˜ä¸Šį§ģåŠ¨åˆ°ä¸åŒį›ŽåŊ•įš„æ–‡äģļ。 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°ã€æ—ļé—´æˆŗå’Œ inodeīŧŒäŊ†į›ŽåŊ•不同æĨ蝆åˆĢ。 copied - åœ¨į›¸åŒæˆ–ä¸åŒįŖį›˜ä¸Šå¤åˆļįš„æ–‡äģļīŧŒä¸”原始文äģļäģį„ļ存在。 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗčŋ›čĄŒč¯†åˆĢ。 åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™åŋ…éĄģåŽŒæ•´čˇ¯åž„åŒšé…æ‰čƒŊ蝆åˆĢīŧŒč€Œä¸äģ…äģ…æ˜¯å į§°ã€‚ relocated - åœ¨į›¸åŒæˆ–ä¸åŒįŖį›˜ä¸Šį§ģåŠ¨įš„æ–‡äģļīŧŒä¸”原始文äģļ厞æļˆå¤ąã€‚ 厃äģŦ通čŋ‡å…ˇæœ‰į›¸åŒįš„åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗčŋ›čĄŒč¯†åˆĢ。 åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™åŋ…éĄģåŽŒæ•´čˇ¯åž„åŒšé…æ‰čƒŊ蝆åˆĢ。 ä¸ŽåŒä¸€įŖį›˜ä¸Šįš„ 'moved' 文äģļ不同īŧŒé‡åޚäŊįš„æ–‡äģļå…ˇæœ‰ä¸åŒįš„ inode。 restored - inode 不同äŊ†į›ŽåŊ•ã€åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗåŒšé…įš„æ–‡äģļ。 čŋ™äē›é€šå¸¸æ˜¯åˆ é™¤åŽæĸå¤įš„æ–‡äģļ。 åĻ‚æžœéœ€čρ `sync`īŧŒčŋ›į¨‹čŋ”å›žį ä¸ē 2īŧŒč€Œä¸æ˜¯éģ˜čŽ¤įš„ 0。 čŋ”å›žį  1 ᔍäēŽä¸€čˆŦé”™č¯¯æƒ…å†ĩ。 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.7 sync -------- 更新åĨ‡åļæ ĄénjäŋĄæ¯ã€‚č¯ģå–įŖį›˜é˜ĩåˆ—ä¸­æ‰€æœ‰åˇ˛äŋŽæ”šįš„æ–‡äģļīŧŒ åšļæ›´æ–°į›¸åē”įš„åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ 您可äģĨ随æ—ļ按 Ctrl+C 停æ­ĸæ­¤čŋ‡į¨‹īŧŒč€Œä¸äŧšä¸ĸå¤ąåˇ˛åŽŒæˆįš„åˇĨäŊœã€‚ 在下æŦĄčŋčĄŒæ—ļīŧŒ`sync` čŋ‡į¨‹å°†äģŽä¸­æ–­įš„地斚æĸ复。 åĻ‚æžœåœ¨čŋ‡į¨‹ä¸­å‘įŽ°é™éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒ ᛏåē”įš„å—äŧščĸĢæ ‡čްä¸ē坏块。 文äģļ通čŋ‡čˇ¯åž„å’Œ/或 inode 蝆åˆĢīŧŒåšļæŖ€æŸĨ大小和æ—ļé—´æˆŗã€‚ åĻ‚æžœæ–‡äģļ大小或æ—ļé—´æˆŗä¸åŒīŧŒåˆ™äŧšä¸ē整ä¸Ē文äģļé‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åĻ‚æžœæ–‡äģļåœ¨åŒä¸€įŖį›˜ä¸ŠčĸĢį§ģ动或重å‘Ŋ名īŧŒäŋæŒį›¸åŒįš„ inodeīŧŒåˆ™ä¸é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ åĻ‚æžœæ–‡äģļį§ģ动到åĻ一ä¸ĒįŖį›˜īŧŒåˆ™é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄénjīŧŒ äŊ†äŋį•™äģĨå‰čŽĄįŽ—įš„æ•Ŗåˆ—äŋĄæ¯ã€‚ åĻ‚æžœéœ€čρīŧŒäŧšäŋŽæ”š `content` 和 `parity` 文äģļ。 é˜ĩåˆ—ä¸­įš„æ–‡äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ 5.8 scrub --------- Scrub é˜ĩ列īŧŒæŖ€æŸĨ数捎和åĨ‡åļæ ĄéĒŒįŖį›˜ä¸­įš„é™é옿ˆ–čž“å…Ĩ/输å‡ēé”™č¯¯ã€‚ 每æŦĄč°ƒį”¨æŖ€æŸĨ大įēĻ 8% įš„é˜ĩ列īŧŒæŽ’除在čŋ‡åŽģ 10 夊内 厞čĸĢ scrub įš„æ•°æŽã€‚ čŋ™æ„å‘ŗį€æ¯å‘¨ scrub 一æŦĄå¯įĄŽäŋæ¯éš”三ä¸Ēæœˆč‡ŗå°‘æŖ€æŸĨ一æŦĄæ•°æŽįš„æ¯ä¸€äŊã€‚ 您可äģĨäŊŋᔍ -p, --plan é€‰éĄšåŽšäš‰ä¸åŒįš„ scrub čŽĄåˆ’æˆ–æ•°é‡īŧŒ č¯Ĩ选项æŽĨ受īŧš bad - Scrub æ ‡čŽ°ä¸ēåå—įš„å—ã€‚ new - Scrub 刚刚同æ­ĨäŊ†å°šæœĒ scrub įš„å—ã€‚ full - Scrub 所有内厚。 0-100 - Scrub æŒ‡åŽšį™žåˆ†æ¯”įš„å—ã€‚ åĻ‚æžœæŒ‡åŽšäē†į™žåˆ†æ¯”数量īŧŒæ‚¨čŋ˜å¯äģĨäŊŋᔍ -o, --older-than 选项æĨ厚䚉块åē”č¯Ĩ有多旧。 æœ€æ—§įš„å—éĻ–å…ˆčĸĢ scrubīŧŒįĄŽäŋæœ€äŊŗæŖ€æŸĨ。 åĻ‚æžœæ‚¨åĒæƒŗ scrub 刚刚同æ­ĨäŊ†å°šæœĒ scrub įš„å—īŧŒ 蝎äŊŋᔍ `-p new` é€‰éĄšã€‚ čĻčŽˇå– scrub įŠļæ€įš„č¯Ļįģ†äŋĄæ¯īŧŒč¯ˇäŊŋᔍ `status` å‘Ŋäģ¤ã€‚ 寚äēŽå‘įŽ°įš„äģģäŊ•静éģ˜é”™č¯¯æˆ–čž“å…Ĩ/输å‡ē错蝝īŧŒį›¸åē”įš„å— äŧšåœ¨ `content` 文äģļ中čĸĢæ ‡čްä¸ē坏块。 čŋ™äē›åå—列在 `status` 中īŧŒå¯äģĨäŊŋᔍ `fix -e` äŋŽå¤ã€‚ äŋŽå¤åŽīŧŒåœ¨ä¸‹æŦĄ scrub æ—ļīŧŒåރäģŦ将čĸĢé‡æ–°æŖ€æŸĨīŧŒåĻ‚æžœå‘įŽ°åˇ˛æ›´æ­ŖīŧŒ 则äŧšåˆ é™¤åå—æ ‡čŽ°ã€‚ čρäģ… scrub 坏块īŧŒæ‚¨å¯äģĨäŊŋᔍ `scrub -p bad` å‘Ŋäģ¤ã€‚ åģē莎äģ…åœ¨åˇ˛åŒæ­Ĩįš„é˜ĩ列上čŋčĄŒ `scrub`īŧŒäģĨéŋ免 į”ąæœĒ同æ­Ĩ数捎åŧ•čĩˇįš„æŠĨå‘Šé”™č¯¯ã€‚čŋ™äē›é”™č¯¯čĸĢ蝆åˆĢä¸ē不是静éģ˜é”™č¯¯īŧŒ åšļ且块不äŧščĸĢæ ‡čްä¸ē坏块īŧŒäŊ†æ­¤įąģ错蝝äŧšåœ¨å‘Ŋäģ¤įš„čž“å‡ē中æŠĨ告。 `content` 文äģļäŧščĸĢäŋŽæ”šäģĨ更新每ä¸Ē块上æŦĄæŖ€æŸĨįš„æ—ļ间 åšļæ ‡čŽ°åå—ã€‚ `parity` 文äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ é˜ĩåˆ—ä¸­įš„æ–‡äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ 5.9 fix ------- äŋŽå¤æ‰€æœ‰æ–‡äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ 所有文äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽéƒŊ与上æŦĄ `sync` 中äŋå­˜įš„åŋĢį…§ įŠļ态čŋ›čĄŒæ¯”čžƒã€‚ åĻ‚æžœå‘įŽ°åˇŽåŧ‚īŧŒåˆ™å°†å…￁ĸå¤åˆ°å­˜å‚¨įš„åŋĢį…§ã€‚ **č­Ļ告īŧ** `fix` å‘Ŋäģ¤ä¸åŒēåˆ†é”™č¯¯å’Œ 故意äŋŽæ”šã€‚åރ**æ— æĄäģļ地**将文äģļįŠļ态æĸ复到上æŦĄ `sync`。 åĻ‚æžœæœĒ指厚å…ļäģ–选饚īŧŒåˆ™å¤„į†æ•´ä¸Ēé˜ĩ列。 äŊŋᔍčŋ‡æģ¤é€‰éĄšé€‰æ‹ŠčĻæ“äŊœįš„æ–‡äģ￈–įŖį›˜įš„å­é›†ã€‚ čρäģ…äŋŽå¤åœ¨ `sync` 和 `scrub` æœŸé—´æ ‡čŽ°ä¸ēåå—įš„å—īŧŒ 蝎äŊŋᔍ -e, --filter-error é€‰éĄšã€‚ 与å…ļäģ–čŋ‡æģ¤é€‰éĄšä¸åŒīŧŒæ­¤é€‰éĄšäģ…寚č‡Ē上æŦĄ `sync` äģĨæĨæœĒæ›´æ”šįš„ 文äģļåē”ᔍäŋŽå¤ã€‚ SnapRAID äŧšé‡å‘Ŋåæ‰€æœ‰æ— æŗ•äŋŽå¤įš„æ–‡äģļīŧŒåšļæˇģ加 `.unrecoverable` æ‰Šåą•åã€‚ 在äŋŽå¤äš‹å‰īŧŒäŧšæ‰Ģ描整ä¸Ēé˜ĩ列äģĨæŸĨ扞č‡Ē上æŦĄ `sync` 操äŊœäģĨæĨį§ģåŠ¨įš„äģģäŊ•æ–‡äģļ。 čŋ™ä盿–‡äģļ通čŋ‡åރäģŦįš„æ—ļé—´æˆŗč¯†åˆĢīŧŒåŋŊį•Ĩ厃äģŦįš„åį§° å’Œį›ŽåŊ•īŧŒåšļ在åŋ…čρæ—ļᔍäēŽæĸ复čŋ‡į¨‹ã€‚ åĻ‚æžœæ‚¨å°†å…ļ中一äē›į§ģ到äē†é˜ĩ列䚋外īŧŒæ‚¨å¯äģĨäŊŋᔍ -i, --import é€‰éĄšæŒ‡åŽšéĸå¤–įš„į›ŽåŊ•čŋ›čĄŒæ‰Ģ描。 文äģļäģ…通čŋ‡čˇ¯åž„蝆åˆĢīŧŒč€Œä¸é€ščŋ‡ inode 蝆åˆĢ。 `content` 文äģļ**不äŧš**čĸĢäŋŽæ”šã€‚ åĻ‚æžœéœ€čρīŧŒ`parity` 文äģļäŧščĸĢäŋŽæ”šã€‚ åĻ‚æžœéœ€čρīŧŒé˜ĩåˆ—ä¸­įš„æ–‡äģļäŧščĸĢäŋŽæ”šã€‚ 5.10 check ---------- éĒŒč¯æ‰€æœ‰æ–‡äģļ和åĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åŽƒįš„åˇĨäŊœæ–šåŧįąģäŧŧäēŽ `fix`īŧŒäŊ†åރåĒæ¨Ąæ‹Ÿæĸ复īŧŒ**不äŧš**寚é˜ĩ列 写å…ĨäģģäŊ•更攚。 æ­¤å‘Ŋäģ¤ä¸ģčρᔍäēŽæ‰‹åЍénj蝁īŧŒ 例åĻ‚åœ¨æĸ复čŋ‡į¨‹äš‹åŽæˆ–在å…ļäģ–į‰šæŽŠæĄäģļ下。 寚äēŽåŽšæœŸå’ŒčŽĄåˆ’įš„æŖ€æŸĨīŧŒč¯ˇäŊŋᔍ `scrub`。 åĻ‚æžœæ‚¨äŊŋᔍ -a, --audit-only 选项īŧŒåˆ™äģ…æŖ€æŸĨ文äģļ æ•°æŽæ•Ŗåˆ—īŧŒč€ŒåŋŊį•ĨåĨ‡åļæ ĄéĒŒæ•°æŽīŧŒäģĨ加åŋĢčŋčĄŒé€ŸåēĻ。 文äģļäģ…通čŋ‡čˇ¯åž„蝆åˆĢīŧŒč€Œä¸é€ščŋ‡ inode 蝆åˆĢ。 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.11 list --------- 列å‡ē上æŦĄ `sync` æ—ļé˜ĩ列中包åĢįš„æ‰€æœ‰æ–‡äģļ。 äŊŋᔍ -v 或 --verboseīŧŒčŋ˜äŧšæ˜žį¤ēäēšį§’įē§æ—ļ间。 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.12 dup -------- 列å‡ē所有重复文äģļ。åĻ‚æžœä¸¤ä¸Ē文äģļįš„æ•Ŗåˆ—åŒšé…īŧŒåˆ™čޤä¸ē厃äģŦį›¸į­‰ã€‚ 不č¯ģ取文äģļæ•°æŽīŧ›äģ…äŊŋᔍéĸ„å…ˆčŽĄįŽ—įš„æ•Ŗåˆ—ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.13 pool --------- 在 `pooling` į›ŽåŊ•中创åģ翈–æ›´æ–°įŖį›˜é˜ĩ列中所有文äģļ įš„č™šæ‹Ÿč§†å›žã€‚ 文äģļ不äŧščĸĢ复åˆļīŧŒč€Œæ˜¯äŊŋᔍįŦĻåˇé“žæŽĨčŋžæŽĨ。 更新æ—ļīŧŒæ‰€æœ‰įŽ°æœ‰įš„įŦĻåˇé“žæŽĨ和įŠē å­į›ŽåŊ•éƒŊäŧščĸĢ删除īŧŒåšļæ›ŋæĸä¸ēé˜ĩåˆ—įš„æ–°č§†å›žã€‚ äģģäŊ•å…ļäģ–å¸¸č§„æ–‡äģļäŋį•™åœ¨åŽŸäŊã€‚ 不äŧšäŋŽæ”š pool į›ŽåŊ•äš‹å¤–įš„äģģäŊ•内厚。 5.14 devices ------------ 打印é˜ĩ列äŊŋį”¨įš„äŊŽįē§čŽžå¤‡ã€‚ æ­¤å‘Ŋä줿˜žį¤ēé˜ĩåˆ—ä¸­įš„čŽžå¤‡å…ŗč”īŧŒä¸ģčρᔍäŊœč„šæœŦæŽĨåŖã€‚ 前两列是äŊŽįē§čŽžå¤‡ ID å’Œčˇ¯åž„ã€‚ æŽĨ下æĨįš„ä¸¤åˆ—æ˜¯é̘įē§čŽžå¤‡ ID å’Œčˇ¯åž„ã€‚ 最后一列是é˜ĩåˆ—ä¸­įš„įŖį›˜åį§°ã€‚ 在大多数情å†ĩ下īŧŒé˜ĩåˆ—ä¸­įš„æ¯ä¸ĒįŖį›˜éƒŊ有一ä¸ĒäŊŽįē§čŽžå¤‡īŧŒ äŊ†åœ¨ä¸€ä盿›´å¤æ‚įš„é…įŊŽä¸­īŧŒå•ä¸Ēé˜ĩåˆ—įŖį›˜å¯čƒŊäŧšäŊŋį”¨å¤šä¸Ē äŊŽįē§čŽžå¤‡ã€‚ 不äŧšäŋŽæ”šäģģäŊ•内厚。 5.15 touch ---------- ä¸ē所有äēšį§’įē§æ—ļé—´æˆŗčŽžįŊŽä¸ēé›ļįš„æ–‡äģļ莞įŊŽä¸€ä¸Ēäģģæ„įš„ äēšį§’įē§æ—ļé—´æˆŗã€‚ čŋ™æé̘äē† SnapRAID 蝆åˆĢį§ģ动和复åˆļ文äģļįš„čƒŊ力īŧŒ 因ä¸ē厃äŊŋæ—ļé—´æˆŗå‡ äšŽį‹Ŧ一无äēŒīŧŒå‡å°‘äē†å¯čƒŊįš„é‡å¤ã€‚ æ›´å…ˇäŊ“åœ°č¯´īŧŒåĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ä¸ēé›ļīŧŒ 则į§ģ动或复åˆļįš„æ–‡äģļåœ¨åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗåŒšé…æ—ļčĸĢ蝆åˆĢä¸ē æ­¤įąģ。åĻ‚æžœäēšį§’įē§æ—ļé—´æˆŗä¸ēé›ļīŧŒåˆ™äģ…åŊ“åŽŒæ•´čˇ¯åž„ã€ 大小和æ—ļé—´æˆŗéƒŊ匚配æ—ļ才čĸĢ视ä¸ē副æœŦ。 不äŧšäŋŽæ”šį§’į˛žåēĻæ—ļé—´æˆŗīŧŒ 因此äŧšäŋį•™æ–‡äģļįš„æ‰€æœ‰æ—Ĩ期和æ—ļ间。 5.16 rehash ----------- 厉排寚整ä¸Ēé˜ĩ列čŋ›čĄŒé‡æ–°æ•Ŗåˆ—。 æ­¤å‘Ŋä줿›´æ”šäŊŋį”¨įš„æ•Ŗåˆ—įąģ型īŧŒé€šå¸¸æ˜¯åœ¨äģŽ 32 äŊįŗģįģŸå‡įē§åˆ° 64 äŊįŗģį쟿—ļīŧŒ äģĨäģŽ MurmurHash3 切æĸ到更åŋĢįš„ SpookyHash。 åĻ‚æžœæ‚¨åˇ˛įģåœ¨äŊŋį”¨æœ€äŊŗæ•Ŗåˆ—īŧŒåˆ™æ­¤å‘Ŋäģ¤ä¸æ‰§čĄŒäģģäŊ•操äŊœīŧŒ åšļ通įŸĨæ‚¨æ— éœ€æ‰§čĄŒäģģäŊ•操äŊœã€‚ é‡æ–°æ•Ŗåˆ—ä¸äŧšįĢ‹åŗæ‰§čĄŒīŧŒč€Œæ˜¯åœ¨ `sync` 和 `scrub` 期间 逐æ­Ĩčŋ›čĄŒã€‚ 您可äģĨäŊŋᔍ `status` æŖ€æŸĨé‡æ–°æ•Ŗåˆ—įŠļ态。 åœ¨é‡æ–°æ•Ŗåˆ—æœŸé—´īŧŒSnapRAID äŋæŒåŽŒå…¨åŠŸčƒŊīŧŒ å”¯ä¸€įš„äž‹å¤–æ˜¯ `dup` æ— æŗ•äŊŋį”¨ä¸åŒįš„æ•Ŗåˆ—æŖ€æĩ‹é‡å¤įš„æ–‡äģļ。 5.17 locate ----------- æŸĨæ‰žå­˜å‚¨åœ¨æ ĄéĒŒį›˜ä¸­įš„æ–‡äģļ。寚äēŽæ¯ä¸ĒåŒšé…įš„æ–‡äģļīŧŒåރäŧšæ‰“å°å…ļåœ¨æ ĄéĒŒæ–‡äģļä¸­įš„äŊįŊŽ äģĨåŠå į”¨įš„åˆ†į‰‡æ•°é‡ã€‚ 您可äģĨäŊŋᔍ -t, --tail é€‰éĄšå°†æ“äŊœé™åˆļåœ¨å į”¨æ ĄéĒŒį›˜æŒ‡åŽšå°žéƒ¨éƒ¨åˆ†įš„ 文äģļ上。 åĻ‚æžœæ‚¨æƒŗé‡æ–°åˆ†é…čŋ™ä盿–‡äģļīŧŒå¯äģĨäŊŋᔍ -W, --force-realloc-tail é€‰éĄšã€‚ č¯ˇæŗ¨æ„īŧŒåœ¨é‡æ–°åˆ†é…čŋ‡į¨‹ä¸­īŧŒæ­¤įąģ文äģļå°†ä¸å—æ ĄénjäŋæŠ¤ã€‚ 6 OPTIONS ========= SnapRAID 提䞛äģĨ下选项īŧš -c, --conf CONFIG 选拊čρäŊŋį”¨įš„é…įŊŽæ–‡äģļ。åĻ‚æžœæœĒ指厚īŧŒåœ¨ Unix 中īŧŒ åĻ‚æžœå­˜åœ¨īŧŒåˆ™äŊŋį”¨æ–‡äģļ `/usr/local/etc/snapraid.conf`īŧŒ åĻ则äŊŋᔍ `/etc/snapraid.conf`。 在 Windows 中īŧŒåރäŊŋį”¨ä¸Ž `snapraid.exe` į›¸åŒįš„į›ŽåŊ•ä¸­įš„æ–‡äģļ `snapraid.conf`。 -f, --filter PATTERN čŋ‡æģ¤čρ圍 `check` 和 `fix` ä¸­å¤„į†įš„æ–‡äģļ。 äģ…å¤„į†ä¸ŽæŒ‡åŽšæ¨ĄåŧåŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ æœ‰å…ŗæ¨Ąåŧč§„čŒƒįš„æ›´å¤šč¯Ļįģ†äŋĄæ¯īŧŒč¯ˇå‚阅 PATTERN 部分。 在 Unix 中īŧŒåĻ‚æžœäŊŋᔍ globbing 字įŦĻīŧŒč¯ˇįĄŽäŋåރäģŦčĸĢåŧ•į”¨ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 `sync` 和 `scrub` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 -d, --filter-disk NAME čŋ‡æģ¤čρ圍 `check`、`fix`、`up` 和 `down` ä¸­å¤„į†įš„įŖį›˜ã€‚ 您åŋ…éĄģ指厚配įŊŽæ–‡äģļä¸­åŽšäš‰įš„įŖį›˜åį§°ã€‚ 您䚟可äģĨ指厚åĨ‡åļæ ĄéĒŒįŖį›˜įš„åį§°īŧš`parity`、`2-parity`、 `3-parity` į­‰īŧŒäģĨ将操äŊœé™åˆļåˆ°į‰šåŽšįš„åĨ‡åļæ ĄéĒŒįŖį›˜ã€‚ åĻ‚æžœæ‚¨įģ„合äŊŋį”¨å¤šä¸Ē --filter、--filter-disk 和 --filter-missing 选项īŧŒ 则äģ…选拊与所有čŋ‡æģ¤å™¨åŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `check`、`fix`、`up` 和 `down` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 `sync` 和 `scrub` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 -m, --filter-missing čŋ‡æģ¤čρ圍 `check` 和 `fix` ä¸­å¤„į†įš„æ–‡äģļ。 äģ…处ᐆé˜ĩ列中ä¸ĸå¤ąæˆ–åˇ˛åˆ é™¤įš„æ–‡äģļ。 与 `fix` 一čĩˇäŊŋᔍæ—ļīŧŒæ­¤é€‰éĄšå……åŊ“ `undelete` å‘Ŋäģ¤ã€‚ åĻ‚æžœæ‚¨įģ„合äŊŋį”¨å¤šä¸Ē --filter、--filter-disk 和 --filter-missing 选项īŧŒ 则äģ…选拊与所有čŋ‡æģ¤å™¨åŒšé…įš„æ–‡äģļ。 æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ 不čƒŊ与 `sync` 和 `scrub` 一čĩˇäŊŋᔍīŧŒå› ä¸ē厃äģŦæ€ģæ˜¯å¤„į†æ•´ä¸Ēé˜ĩ列。 -e, --filter-error 处ᐆ `check` 和 `fix` ä¸­æœ‰é”™č¯¯įš„æ–‡äģļ。 厃äģ…å¤„į†åœ¨ `sync` 和 `scrub` 期间块čĸĢæ ‡čްä¸ē静é옿ˆ–čž“å…Ĩ/输å‡ēé”™č¯¯įš„ 文äģļīŧŒåĻ‚ `status` 中所列。 æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ -p, --plan PERC|bad|new|full 选拊 scrub čŽĄåˆ’ã€‚åĻ‚æžœ PERC 是一ä¸Ēäģ‹äēŽ 0 到 100 äš‹é—´įš„æ•°å€ŧīŧŒ 则将å…ļč§Ŗé‡Šä¸ēčρ scrub įš„å—įš„į™žåˆ†æ¯”ã€‚ 除äē†į™žåˆ†æ¯”īŧŒæ‚¨čŋ˜å¯äģĨ指厚一ä¸ĒčŽĄåˆ’īŧš `bad` scrub 坏块īŧŒ`new` scrub 尚æœĒ scrub įš„å—īŧŒ `full` scrub 所有内厚。 æ­¤é€‰éĄšåĒčƒŊ与 `scrub` 一čĩˇäŊŋį”¨ã€‚ -o, --older-than DAYS 选拊čρ圍 `scrub` ä¸­å¤„į†įš„é˜ĩåˆ—įš„æœ€æ—§éƒ¨åˆ†ã€‚ DAYS 是块čĸĢ scrub įš„æœ€å°å¤Šæ•°īŧ›éģ˜čޤå€ŧä¸ē 10。 无čŽēæ­¤é€‰éĄšåĻ‚äŊ•īŧŒæ ‡čްä¸ēåå—įš„å—å§‹įģˆäŧščĸĢ scrub。 æ­¤é€‰éĄšåĒčƒŊ与 `scrub` 一čĩˇäŊŋį”¨ã€‚ -a, --audit-only 在 `check` 中īŧŒéĒŒč¯æ–‡äģļįš„æ•Ŗåˆ—č€Œä¸ æŖ€æŸĨåĨ‡åļæ ĄéĒŒæ•°æŽã€‚ åĻ‚æžœæ‚¨åĒå¯šæŖ€æŸĨ文äģļæ•°æŽæ„Ÿå…´čļŖīŧŒæ­¤é€‰éĄšå¯äģĨæ˜žč‘—åŠ åŋĢ æŖ€æŸĨčŋ‡į¨‹ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `check` 一čĩˇäŊŋį”¨ã€‚ -h, --pre-hash 在 `sync` 中īŧŒčŋčĄŒæ‰€æœ‰æ–°æ•°æŽįš„初æ­Ĩæ•Ŗåˆ—é˜ļæŽĩīŧŒ äģĨäžŋ在åĨ‡åļæ ĄéĒŒčŽĄįŽ—äš‹å‰čŋ›čĄŒéĸå¤–éĒŒč¯ã€‚ 通常īŧŒåœ¨ `sync` 中īŧŒä¸čŋ›čĄŒåˆæ­Ĩæ•Ŗåˆ—īŧŒåšļ且新 数捎äģ…在éĻ–æŦĄč¯ģ取čŋ›čĄŒåĨ‡åļæ ĄéĒŒčŽĄįŽ—äš‹å‰æ•Ŗåˆ—ã€‚ æ­¤čŋ‡į¨‹åœ¨įŗģįģŸå¤„äēŽ é‡č´ŸčŊŊä¸‹å‘į”ŸīŧŒæ‰€æœ‰įŖį›˜éƒŊ在čŊŦ动īŧŒCPU 䚟垈åŋ™ã€‚ čŋ™å¯šæœē器æĨč¯´æ˜¯ä¸€į§æžįĢ¯æƒ…å†ĩīŧŒåĻ‚æžœåŽƒæœ‰æŊœåœ¨įš„įĄŦäģļ问éĸ˜īŧŒ 静éģ˜é”™č¯¯å¯čƒŊæ— æŗ•čĸĢæŖ€æĩ‹åˆ°īŧŒå› ä¸ē数捎尚æœĒæ•Ŗåˆ—ã€‚ ä¸ēéŋå…æ­¤éŖŽé™ŠīŧŒæ‚¨å¯äģĨ吝ᔍ `pre-hash` æ¨ĄåŧīŧŒå°† 所有数捎č¯ģ取两æŦĄäģĨįĄŽäŋå…ļ厌整性。 æ­¤é€‰éĄščŋ˜äŧšénj蝁é˜ĩ列内į§ģåŠ¨įš„æ–‡äģļīŧŒ äģĨįĄŽäŋį§ģ动操äŊœæˆåŠŸīŧŒåšļ在åŋ…čρæ—ļ å…čŽ¸æ‚¨åœ¨įģ§įģ­äš‹å‰čŋčĄŒ fix 操äŊœã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -i, --import DIR äģŽæŒ‡åŽšį›ŽåŊ•å¯ŧå…Ĩč‡Ē上æŦĄ `sync` äģĨæĨäģŽé˜ĩåˆ—ä¸­åˆ é™¤įš„äģģäŊ•æ–‡äģļ。 åĻ‚æžœæ‚¨äģį„ļæ‹Ĩ有此įąģ文äģļīŧŒåރäģŦå¯į”¨äēŽ `check` 和 `fix` äģĨ攚čŋ›æĸ复čŋ‡į¨‹ã€‚ č¯ģ取文äģļīŧŒåŒ…æ‹Ŧåœ¨å­į›ŽåŊ•中īŧŒåšļ且无čŽēå…ļåį§°åĻ‚äŊ•éƒŊäŧščĸĢ蝆åˆĢ。 æ­¤é€‰éĄšåĒčƒŊ与 `check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ -s, --spin-down-on-error 在äģģäŊ•é”™č¯¯å‘į”Ÿæ—ļīŧŒåœ¨é€€å‡ēåšļå¸Ļ有非é›ļįŠļæ€į äš‹å‰īŧŒ å°†æ‰€æœ‰æ‰˜įŽĄįš„įŖį›˜åœčŊŦ。čŋ™å¯äģĨ防æ­ĸéŠąåŠ¨å™¨åœ¨ä¸­æ­ĸ操äŊœåŽ äŋæŒæ´ģ动和čŊŦ动īŧŒæœ‰åŠŠäēŽéŋ免不åŋ…čĻįš„įƒ­é‡į§¯čšå’ŒåŠŸč€—ã€‚ äŊŋį”¨æ­¤é€‰éĄšå¯įĄŽäŋåŗäŊŋå‘Ŋäģ¤å¤ąč´ĨīŧŒįŖį›˜äšŸčƒŊ厉全停æ­ĸ。 -w, --bw-limit RATE å¯šæ‰€æœ‰įŖį›˜åē”į”¨å…¨åą€å¸ĻåŽŊ限åˆļ。RATE 是 æ¯į§’įš„å­—čŠ‚æ•°ã€‚æ‚¨å¯äģĨ指厚䚘数īŧŒäž‹åĻ‚ K、M 或 G īŧˆäž‹åĻ‚īŧŒ--bw-limit 1Gīŧ‰ã€‚ -t, --tail 大小 将文äģļåˆ—čĄ¨é™åˆļä¸ē邪äē›äŊŋį”¨æ ĄéĒŒį›˜æŒ‡åŽšå°žéƒ¨å¤§å°äģĨå†…įš„æ–‡äģļ。 您可äģĨäŊŋį”¨äš˜æ•°īŧŒåĻ‚ K、M、G 或 Tīŧˆäž‹åĻ‚ --tail 1Gīŧ‰ã€‚ æ­¤é€‰éĄšäģ…在与 `locate` å‘Ŋäģ¤é…åˆäŊŋᔍæ—ļ有效。 -A, --stats å¯į”¨æ‰Šåą•įŠļæ€č§†å›žīŧŒæ˜žį¤ē附加äŋĄæ¯ã€‚ åąåš•æ˜žį¤ē两ä¸Ēå›žčĄ¨īŧš įŦŦ一ä¸Ēå›žčĄ¨æ˜žį¤ē每ä¸ĒįŖį›˜įš„įŧ“å†˛æĄå¸Ļ数īŧŒäģĨ及 åŊ“å‰æ­Ŗåœ¨č¯ĨįŖį›˜ä¸ŠčŽŋé—Žįš„æ–‡äģļįš„æ–‡äģļčˇ¯åž„ã€‚ 通常īŧŒæœ€æ…ĸįš„įŖį›˜å°†æ˛Ąæœ‰å¯į”¨įŧ“冞åŒēīŧŒ čŋ™å†ŗåޚäē†å¯čžžåˆ°įš„æœ€å¤§å¸ĻåŽŊ。 įŦŦäēŒä¸Ēå›žčĄ¨æ˜žį¤ē在čŋ‡åŽģ 100 į§’å†…į­‰åž…æ‰€čŠąč´šįš„æ—ļé—´į™žåˆ†æ¯”ã€‚ éĸ„čŽĄæœ€æ…ĸįš„įŖį›˜äŧšå¯ŧč‡´å¤§éƒ¨åˆ†į­‰åž…æ—ļ间īŧŒ 而å…ļäģ–įŖį›˜åē”č¯ĨåĒæœ‰åžˆå°‘æˆ–æ˛Ąæœ‰į­‰åž…æ—ļ间īŧŒ 因ä¸ē厃äģŦ可äģĨäŊŋᔍįŧ“å†˛æĄå¸Ļ。 æ­¤å›žčĄ¨čŋ˜æ˜žį¤ēäē†į­‰åž…æ•Ŗåˆ—čŽĄįŽ—å’Œ RAID čŽĄįŽ—æ‰€čŠąč´šįš„æ—ļ间。 æ‰€æœ‰čŽĄįŽ—éƒŊä¸ŽįŖį›˜æ“äŊœåšļ行čŋčĄŒã€‚ 因此īŧŒåĒčρ臺少䏀ä¸ĒįŖį›˜æœ‰å¯æĩ‹é‡įš„į­‰åž…æ—ļ间īŧŒ å°ąčĄ¨æ˜Ž CPU čļŗå¤ŸåŋĢīŧŒčƒŊ够莟䏊åˇĨäŊœč´ŸčŊŊ。 -Z, --force-zero åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩ操äŊœīŧšåŒæ­Ĩ大小ä¸ēé›ļäŊ†äģĨ前非é›ļįš„æ–‡äģļ。 åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°čŋ™į§æƒ…å†ĩīŧŒåރäŧšåœæ­ĸčŋ›čĄŒīŧŒ é™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨčŊģæžæŖ€æĩ‹åˆ°åœ¨įŗģįģŸå´ŠæēƒåŽīŧŒ 某äē›čŽŋé—Žįš„æ–‡äģļčĸĢæˆĒæ–­įš„æƒ…å†ĩ。 čŋ™åœ¨å¸Ļ有 ext3/ext4 文äģļįŗģįģŸįš„ Linux ä¸­æ˜¯ä¸€į§å¯čƒŊįš„æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -E, --force-empty åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩ操äŊœīŧšåŒæ­Ĩ所有原始文äģļä¸ĸå¤ąįš„įŖį›˜ã€‚ åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°įŖį›˜ä¸Šæœ€åˆå­˜åœ¨įš„æ‰€æœ‰æ–‡äģļéƒŊä¸ĸå¤ąæˆ–čĸĢ重写īŧŒ 厃äŧšåœæ­ĸčŋ›čĄŒīŧŒé™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨčŊģæžæŖ€æĩ‹åˆ°æ•°æŽæ–‡äģļįŗģį쟿œĒ挂čŊŊįš„æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -U, --force-uuid åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„åŒæ­Ĩã€æŖ€æŸĨ和äŋŽå¤æ“äŊœīŧŒåŊ“įŖį›˜æ›´æ”šäē†åރäģŦįš„ UUID æ—ļ。 åĻ‚æžœ SnapRAID æŖ€æĩ‹åˆ°æŸäē›įŖį›˜æ›´æ”šäē† UUIDīŧŒ 厃äŧšåœæ­ĸčŋ›čĄŒīŧŒé™¤éžæ‚¨æŒ‡åŽšæ­¤é€‰éĄšã€‚ čŋ™äŊŋ您可äģĨæŖ€æĩ‹åˆ°æ‚¨įš„įŖį›˜čĸĢæŒ‚čŊŊ在 é”™č¯¯įš„æŒ‚čŊŊį‚šįš„æƒ…å†ĩ。 äŊ†æ˜¯īŧŒå…čŽ¸åœ¨å•åĨ‡åļæ ĄéĒŒä¸‹čŋ›čĄŒå•ä¸Ē UUID 更攚īŧŒ 在多åĨ‡åļæ ĄéĒŒä¸‹čŋ›čĄŒæ›´å¤šæ›´æ”šīŧŒå› ä¸ēčŋ™æ˜¯æĸ复后更æĸįŖį›˜æ—ļįš„æ­Ŗå¸¸æƒ…å†ĩ。 æ­¤é€‰éĄšåĒčƒŊ与 `sync`、`check` 或 `fix` 一čĩˇäŊŋį”¨ã€‚ -D, --force-device åŧēåˆļæ‰§čĄŒä¸åŽ‰å…¨įš„äŋŽå¤æ“äŊœīŧŒåŊ“įŖį›˜æ— æŗ•čŽŋ闎或äŊäēŽåŒä¸€į‰Šį†čŽžå¤‡ä¸Šæ—ļ。 例åĻ‚īŧŒåĻ‚æžœæ‚¨ä¸ĸå¤ąäē†ä¸¤ä¸Ēæ•°æŽįŖį›˜īŧŒåšļ且有一ä¸Ēå¤‡į”¨įŖį›˜ åĒčƒŊæĸ复įŦŦ一ä¸ĒīŧŒæ‚¨å¯äģĨåŋŊį•ĨįŦŦäēŒä¸Ēæ— æŗ•čŽŋé—Žįš„įŖį›˜ã€‚ æˆ–č€…īŧŒåĻ‚æžœæ‚¨æƒŗåœ¨åˇ˛äŊŋį”¨įš„įŖį›˜ä¸Šå‰ŠäŊ™įš„å¯į”¨įŠē间中æĸ复一ä¸ĒįŖį›˜īŧŒ å…ąäēĢåŒä¸€į‰Šį†čŽžå¤‡ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `fix` 一čĩˇäŊŋį”¨ã€‚ -N, --force-nocopy 在 `sync`、`check` 和 `fix` 中īŧŒįĻį”¨å¤åˆļæŖ€æĩ‹å¯å‘åŧã€‚ åĻ‚æžœæ˛Ąæœ‰æ­¤é€‰éĄšīŧŒSnapRAID å‡åŽšå…ˇæœ‰į›¸åŒåąžæ€§īŧˆäž‹åĻ‚åį§°ã€å¤§å°å’Œæ—ļé—´æˆŗīŧ‰ įš„æ–‡äģ￘¯å…ˇæœ‰į›¸åŒæ•°æŽįš„副æœŦ。 čŋ™å…čޏ蝆åˆĢäģŽä¸€ä¸ĒįŖį›˜į§ģ动到åĻ一ä¸ĒįŖį›˜įš„å¤åˆļ或į§ģåŠ¨įš„æ–‡äģļīŧŒ åšļé‡į”¨åˇ˛čŽĄįŽ—įš„æ•Ŗåˆ—äŋĄæ¯äģĨæŖ€æĩ‹é™éģ˜é”™č¯¯æˆ–æĸ复ä¸ĸå¤ąįš„æ–‡äģļ。 在某äē›įŊ•č§įš„æƒ…å†ĩ下īŧŒæ­¤čĄŒä¸ē可čƒŊå¯ŧ致蝝æŠĨ æˆ–į”ąäēŽčŽ¸å¤šæ•Ŗåˆ—éĒŒč¯č€Œå¯ŧ致čŋ‡į¨‹įŧ“æ…ĸīŧŒæ­¤é€‰éĄšå…čŽ¸æ‚¨č§Ŗå†ŗæ­¤įąģ问éĸ˜ã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync`、`check` 和 `fix` 一čĩˇäŊŋį”¨ã€‚ -F, --force-full 在 `sync` 中īŧŒåŧēåˆļåŽŒå…¨é‡æ–°čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ åŊ“您æˇģåŠ æ–°įš„åĨ‡åļæ Ąénjįē§åˆĢ或åĻ‚æžœäŊŋį”¨čžƒæ–°įš„åĨ‡åļæ ĄéĒŒæ•°æŽæĸå¤åˆ°æ—§įš„å†…åŽšæ–‡äģļæ—ļīŧŒ 可äģĨäŊŋį”¨æ­¤é€‰éĄšã€‚ čŋ™å…čŽ¸æ‚¨é‡į”¨å†…åŽšæ–‡äģļä¸­å­˜åœ¨įš„æ•Ŗåˆ—æĨéĒŒč¯æ•°æŽīŧŒ åšļäŊŋį”¨įŽ°æœ‰åĨ‡åļæ ĄéĒŒæ•°æŽåœ¨ `sync` čŋ‡į¨‹ä¸­äŋæŒæ•°æŽäŋæŠ¤īŧŒ č€Œä¸æ˜¯äģŽå¤´åŧ€å§‹é‡æ–°åˆ›åģēåĨ‡åļæ ĄéĒŒã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ -R, --force-realloc 在 `sync` 中īŧŒåŧēåˆļ厌全重新分配文äģļåšļ重åģēåĨ‡åļæ ĄéĒŒã€‚ æ­¤é€‰éĄšå¯į”¨äēŽåŽŒå…¨é‡æ–°åˆ†é…æ‰€æœ‰æ–‡äģļīŧŒ æļˆé™¤įĸŽį‰‡īŧŒåŒæ—ļé‡į”¨å†…åŽšæ–‡äģļä¸­å­˜åœ¨įš„æ•Ŗåˆ—æĨéĒŒč¯æ•°æŽã€‚ æ­¤é€‰éĄšåĒčƒŊ与 `sync` 一čĩˇäŊŋį”¨ã€‚ **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čρäŊŋį”¨åŽƒã€‚ 在 `sync` 操äŊœæœŸé—´īŧŒæ‚¨**æ˛Ąæœ‰**数捎äŋæŠ¤ã€‚ -W, --force-realloc-tail 大小 åˇĨäŊœæ–šåŧįąģäŧŧäēŽ -R, --force-reallocīŧŒäŊ†äģ…限äēŽæ¯ä¸Ēæ ĄéĒŒæ–‡äģļįš„ 指厚尞部部分īŧˆæœ€åŽâ€œå¤§å°â€å­—节īŧ‰ã€‚ 厃äŧšåŧēåˆļ重新分配īŧˆį§ģ动īŧ‰åŊ“前存储在č¯Ĩå°žéƒ¨éƒ¨åˆ†įš„äģģäŊ•æ–‡äģļåˆ†į‰‡/块īŧŒ å…čŽ¸åŽƒäģŦčĸĢæ”žįŊŽåœ¨æ ĄéĒŒæ–‡äģļ中äģģäŊ•æœ‰å¯į”¨įŠēé—´įš„åœ°æ–šīŧˆåŒ…æ‹ŦįŽ°æœ‰įš„ įŠē隙īŧ‰ã€‚ æ­¤é€‰éĄšįš„ä¸ģčĻį›Žįš„æ˜¯įŧŠå°æ ĄéĒŒæ–‡äģļįš„įŖį›˜å į”¨å¤§å°ã€‚ åĻ‚æžœé‡æ–°åˆ†é…æˆåŠŸæ¸…įŠēä熿•´ä¸Ē尞部åŒē域īŧˆæ˛Ąæœ‰å—įģ§įģ­äŊŋį”¨åŽƒīŧ‰īŧŒ åˆ™æ ĄéĒŒæ–‡äģļ将čĸĢæˆĒ断īŧŒå›žæ”ļæœĒäŊŋį”¨įš„å°žéƒ¨įŠē间。 您可äģĨäŊŋį”¨äš˜æ•°īŧŒåĻ‚ K、M、G 或 Tīŧˆäž‹åĻ‚ --force-realloc-tail 1Gīŧ‰ã€‚ 您可äģĨäŊŋᔍ locate -t, --tail 提前äē†č§Ŗå—åŊąå“įš„æ–‡äģļ。 č­Ļ告īŧ æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čρäŊŋį”¨ã€‚ åœ¨æ‰§čĄŒ `sync` 操äŊœæœŸé—´īŧŒå—åŊąå“įš„æ–‡äģļå°†æ˛Ąæœ‰æ•°æŽäŋæŠ¤ã€‚ -l, --log FILE 将č¯Ļį솿—Ĩåŋ—写å…Ĩ指厚文äģļ。 åĻ‚æžœæœĒæŒ‡åŽšæ­¤é€‰éĄšīŧŒåˆ™äŧšå°†æ„å¤–é”™č¯¯æ‰“å°åˆ°åąåš•īŧŒ 在å‡ēįŽ°čŽ¸å¤šé”™č¯¯įš„æƒ…å†ĩ下īŧŒå¯čƒŊå¯ŧ致输å‡ēčŋ‡å¤šã€‚ 指厚 -l, --log æ—ļīŧŒäģ…å°†å¯ŧ致 SnapRAID 停æ­ĸįš„**致å‘Ŋ错蝝**打印到 åąåš•ã€‚ åĻ‚æžœčˇ¯åž„äģĨ `>>` åŧ€å¤´īŧŒåˆ™æ–‡äģļäģĨčŋŊåŠ æ¨Ąåŧæ‰“åŧ€ã€‚ åį§°ä¸­įš„ `%D` 和 `%T` å‡ēįŽ°äŧščĸĢæ›ŋæĸä¸ēæ—Ĩ期和æ—ļ间īŧŒæ ŧåŧåˆ†åˆĢä¸ē YYYYMMDD 和 HHMMSS。在 Windows æ‰šå¤„į†æ–‡äģļ中īŧŒæ‚¨åŋ…éĄģ双写 `%` 字įŦĻīŧŒ 例åĻ‚ result-%%D.log。čρäŊŋᔍ `>>`īŧŒæ‚¨åŋ…éĄģå°†åį§°æ‹Ŧ在åŧ•åˇä¸­īŧŒ 例åĻ‚ `">>result.log"`。 čρ将æ—Ĩåŋ—čž“å‡ēåˆ°æ ‡å‡†čž“å‡ēæˆ–æ ‡å‡†é”™č¯¯īŧŒ 您可äģĨäŊŋᔍ `">&1"` 和 `">&2"`。 æœ‰å…ŗæ—Ĩåŋ—æ ‡į­žæčŋ°īŧŒč¯ˇå‚阅 snapraid_log.txt 文äģ￈– man éĄĩéĸ。 -L, --error-limit NUMBER 莞įŊŽåœæ­ĸæ‰§čĄŒå‰įš„æ–°é”™č¯¯é™åˆļ。 éģ˜čŽ¤æƒ…å†ĩ下īŧŒåĻ‚æžœ SnapRAID 遇到čļ…čŋ‡ 100 ä¸Ē 输å…Ĩ/输å‡ē错蝝īŧŒåރäŧšåœæ­ĸīŧŒčĄ¨æ˜ŽįŖį›˜å¯čƒŊæ­Ŗåœ¨å‘į”Ÿæ•…éšœã€‚ æ­¤é€‰éĄšåŊąå“ `sync` 和 `scrub`īŧŒåރäģŦčĸĢå…čŽ¸åœ¨įŦŦ一įģ„ įŖį›˜é”™č¯¯åŽįģ§įģ­īŧŒäģĨå°č¯•åŽŒæˆå…ļ操äŊœã€‚ äŊ†æ˜¯īŧŒ`check` 和 `fix` æ€ģ是äŧšåœ¨įŦŦ一æŦĄé”™č¯¯æ—ļ停æ­ĸ。 -S, --start BLKSTART äģŽæŒ‡åŽšįš„å—åˇåŧ€å§‹å¤„į†ã€‚ åœ¨įŖį›˜æŸåįš„æƒ…å†ĩ下īŧŒčŋ™å¯šäēŽé‡č¯•æŖ€æŸĨ或äŋŽå¤į‰šåŽšå—å¯čƒŊåžˆæœ‰į”¨ã€‚ æ­¤é€‰éĄšä¸ģčρᔍäēŽé̘įē§æ‰‹åЍæĸ复。 -B, --count BLKCOUNT äģ…å¤„į†æŒ‡åŽšæ•°é‡įš„å—ã€‚ æ­¤é€‰éĄšä¸ģčρᔍäēŽé̘įē§æ‰‹åЍæĸ复。 -C, --gen-conf CONTENT äģŽįŽ°æœ‰å†…åŽšæ–‡äģļį”Ÿæˆä¸€ä¸Ēč™šæ‹Ÿé…įŊŽæ–‡äģļ。 配įŊŽæ–‡äģļ写å…Ĩæ ‡å‡†čž“å‡ēīŧŒä¸äŧščĻ†į›–įŽ°æœ‰æ–‡äģļ。 此配įŊŽæ–‡äģļčŋ˜åŒ…åĢ在您ä¸ĸå¤ąæ•´ä¸ĒįŗģįģŸįš„æƒ…å†ĩ下 重åģēįŖį›˜æŒ‚čŊŊį‚šæ‰€éœ€įš„äŋĄæ¯ã€‚ -v, --verbose å‘åąåš•æ‰“å°æ›´å¤šäŋĄæ¯ã€‚ åĻ‚æžœæŒ‡åŽšä¸€æŦĄīŧŒåރäŧšæ‰“å°æŽ’é™¤įš„æ–‡äģļ 和附加įģŸčŽĄäŋĄæ¯ã€‚ æ­¤é€‰éĄšå¯šæ—Ĩåŋ—æ–‡äģ￞Ąæœ‰åŊąå“ã€‚ -q, --quiet å‘åąåš•æ‰“å°æ›´å°‘äŋĄæ¯ã€‚ åĻ‚æžœæŒ‡åŽšä¸€æŦĄīŧŒåރäŧšåˆ é™¤čŋ›åēĻæĄīŧ›ä¸¤æŦĄīŧŒ æ­Ŗåœ¨čŋčĄŒįš„æ“äŊœīŧ›ä¸‰æŦĄīŧŒäŋĄæ¯ æļˆæ¯īŧ›å››æŦĄīŧŒįŠļ态æļˆæ¯ã€‚ 致å‘Ŋ错蝝始įģˆäŧšæ‰“å°åˆ°åąåš•ã€‚ æ­¤é€‰éĄšå¯šæ—Ĩåŋ—æ–‡äģ￞Ąæœ‰åŊąå“ã€‚ -H, --help æ‰“å°įŽ€įŸ­įš„å¸ŽåŠŠåąåš•ã€‚ -V, --version æ‰“å°į¨‹åēį‰ˆæœŦ。 7 CONFIGURATION =============== SnapRAID 需čρ䏀ä¸Ē配įŊŽæ–‡äģļæĨäē†č§Ŗæ‚¨įš„įŖį›˜é˜ĩ列 äŊäēŽäŊ•处äģĨ及在å“Ē里存储åĨ‡åļæ ĄénjäŋĄæ¯ã€‚ 在 Unix 中īŧŒåĻ‚æžœå­˜åœ¨īŧŒåރäŊŋį”¨æ–‡äģļ `/usr/local/etc/snapraid.conf`īŧŒ åĻ则äŊŋᔍ `/etc/snapraid.conf`。 在 Windows 中īŧŒåރäŊŋį”¨ä¸Ž `snapraid.exe` į›¸åŒįš„į›ŽåŊ•ä¸­įš„æ–‡äģļ `snapraid.conf`。 厃åŋ…éĄģ包åĢäģĨ下选项īŧˆåŒē分大小写īŧ‰īŧš 7.1 parity FILE [,FILE] ... --------------------------- åŽšäš‰į”¨äēŽå­˜å‚¨åĨ‡åļæ ĄénjäŋĄæ¯įš„æ–‡äģļ。 åĨ‡åļæ ĄéĒŒå¯åŽžįŽ°é’ˆå¯šå•ä¸ĒįŖį›˜ æ•…éšœįš„äŋæŠ¤īŧŒįąģäŧŧäēŽ RAID5。 您可äģĨ指厚多ä¸Ē文äģļīŧŒåރäģŦåŋ…éĄģäŊäēŽä¸åŒįš„įŖį›˜ä¸Šã€‚ åŊ“一ä¸Ē文äģļ不čƒŊ再åĸžé•ŋæ—ļīŧŒäŊŋᔍ䏋䏀ä¸Ē文äģļ。 æ€ģå¯į”¨įŠē间åŋ…éĄģč‡ŗå°‘ä¸Žé˜ĩåˆ—ä¸­æœ€å¤§įš„æ•°æŽįŖį›˜ä¸€æ ˇå¤§ã€‚ 您可äģĨį¨åŽæˇģ加éĸå¤–įš„åĨ‡åļæ ĄéĒŒæ–‡äģļīŧŒäŊ†æ˜¯æ‚¨ 不čƒŊ重新排åēæˆ–删除åރäģŦ。 将åĨ‡åļæ ĄéĒŒįŖį›˜äŋį•™į”¨äēŽåĨ‡åļæ ĄéĒŒå¯įĄŽäŋåރäģŦ不äŧšįĸŽį‰‡åŒ–īŧŒäģŽč€ŒæéĢ˜æ€§čƒŊ。 在 Windows 中īŧŒæ¯ä¸ĒįŖį›˜äŧšį•™ä¸‹ 256 MB æœĒäŊŋᔍįŠē间īŧŒäģĨéŋ免 æœ‰å…ŗįŖį›˜åˇ˛æģĄįš„č­Ļ告。 æ­¤é€‰éĄšæ˜¯åŧēåˆļæ€§įš„īŧŒåšļ且åĒčƒŊäŊŋᔍ䏀æŦĄã€‚ 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- åŽšäš‰į”¨äēŽå­˜å‚¨éĸå¤–åĨ‡åļæ ĄénjäŋĄæ¯įš„æ–‡äģļ。 ä¸ēæŒ‡åŽšįš„æ¯ä¸ĒåĨ‡åļæ Ąénjįē§åˆĢ吝ᔍ䏀ä¸Ēéĸå¤–įš„äŋæŠ¤įē§åˆĢīŧš * 2-parity 吝ᔍ RAID6 双åĨ‡åļæ ĄéĒŒã€‚ * 3-parity 吝ᔍ䏉åĨ‡åļæ ĄéĒŒã€‚ * 4-parity 吝ᔍ四åĨ‡åļæ ĄéĒŒã€‚ * 5-parity 吝ᔍäē”åĨ‡åļæ ĄéĒŒã€‚ * 6-parity 吝ᔍ六åĨ‡åļæ ĄéĒŒã€‚ 每ä¸ĒåĨ‡åļæ Ąénjįē§åˆĢéƒŊ需čĻå­˜åœ¨æ‰€æœ‰å…ˆå‰įš„åĨ‡åļæ Ąénjįē§åˆĢ。 与 `parity` é€‰éĄšį›¸åŒįš„æŗ¨æ„äē‹éĄšé€‚į”¨ã€‚ čŋ™äē›é€‰éĄšæ˜¯å¯é€‰įš„īŧŒåšļ且åĒčƒŊäŊŋᔍ䏀æŦĄã€‚ 7.3 z-parity FILE [,FILE] ... ----------------------------- åŽšäš‰į”¨äēŽå­˜å‚¨ä¸‰åĨ‡åļæ ĄéĒŒįš„å¤‡į”¨æ–‡äģļ和æ ŧåŧã€‚ æ­¤é€‰éĄšæ˜¯ `3-parity` įš„æ›ŋäģŖæ–šæĄˆīŧŒä¸ģčρéĸ向不支持 SSSE3 指äģ¤é›†įš„äŊŽį̝ CPUīŧŒåĻ‚ ARM 或 AMD Phenom、Athlon 和 Opteron。 在čŋ™į§æƒ…å†ĩ下īŧŒåŽƒæäž›ä熿›´åĨŊįš„æ€§čƒŊ。 æ­¤æ ŧåŧįąģäŧŧäēŽ ZFS RAIDZ3 äŊŋį”¨įš„æ ŧåŧīŧŒäŊ†æ›´åŋĢ。 与 ZFS ä¸€æ ˇīŧŒåŽƒåœ¨ä¸‰åĨ‡åļæ ĄéĒŒäš‹å¤–ä¸čĩˇäŊœį”¨ã€‚ åŊ“äŊŋᔍ `3-parity` æ—ļīŧŒåĻ‚æžœåģē莎äŊŋᔍ `z-parity` æ ŧåŧäģĨ提éĢ˜æ€§čƒŊīŧŒ 您将æ”ļ到č­Ļ告。 可äģĨ通čŋ‡č°ƒæ•´é…įŊŽæ–‡äģļä¸­įš„æ‰€éœ€ z-parity 或 3-parity 文äģļīŧŒ åšļäŊŋᔍ `fix` 重新创åģē厃īŧŒäģŽä¸€į§æ ŧåŧčŊŦæĸä¸ēåĻä¸€į§æ ŧåŧã€‚ 7.4 content FILE ---------------- åŽšäš‰į”¨äēŽå­˜å‚¨įŖį›˜é˜ĩ列中所有文äģļįš„åˆ—čĄ¨å’Œæ ĄéĒŒå’Œįš„æ–‡äģļ。 厃可äģĨ攞įŊŽåœ¨į”¨äēŽæ•°æŽã€åĨ‡åļæ ĄéĒŒæˆ– äģģäŊ•å…ļäģ–å¯į”¨įŖį›˜ä¸Šã€‚ åĻ‚æžœæ‚¨äŊŋį”¨æ•°æŽįŖį›˜īŧŒæ­¤æ–‡äģļäŧšč‡Ē动äģŽ `sync` čŋ‡į¨‹ä¸­æŽ’除。 æ­¤é€‰éĄšæ˜¯åŧēåˆļæ€§įš„īŧŒåšļ且可äģĨ多æŦĄäŊŋᔍäģĨäŋå­˜ 同一文äģļįš„å¤šä¸Ē副æœŦ。 您åŋ…éĄģä¸ēäŊŋį”¨įš„æ¯ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜å­˜å‚¨č‡ŗå°‘ä¸€ä¸Ē副æœŦīŧŒ 再加上一ä¸Ē。äŊŋᔍéĸå¤–įš„å‰¯æœŦ不äŧšæœ‰åŽŗã€‚ 7.5 data NAME DIR ----------------- 厚䚉é˜ĩåˆ—ä¸­æ•°æŽįŖį›˜įš„åį§°å’ŒæŒ‚čŊŊį‚šã€‚ NAME ᔍäēŽæ ‡č¯†įŖį›˜īŧŒåšļ且åŋ…éĄģæ˜¯å”¯ä¸€įš„ã€‚ DIR æ˜¯įŖį›˜åœ¨æ–‡äģļįŗģįģŸä¸­įš„æŒ‚čŊŊį‚šã€‚ 您可äģĨ栚捎需čĻæ›´æ”šæŒ‚čŊŊį‚šīŧŒåĒčρäŋæŒ NAME å›ēåŽšåŗå¯ã€‚ 您åē”č¯Ĩä¸ēé˜ĩåˆ—ä¸­įš„æ¯ä¸Ēæ•°æŽįŖį›˜äŊŋᔍ䏀ä¸Ēé€‰éĄšã€‚ 您可äģĨ通čŋ‡į›´æŽĨ在配įŊŽæ–‡äģļ中更攚 NAMEīŧŒį„ļ后čŋčĄŒ `sync` å‘Ŋä줿Ĩ į¨åŽé‡å‘ŊåįŖį›˜ã€‚ 在重å‘Ŋåįš„æƒ…å†ĩ下īŧŒå…ŗč”是äŊŋį”¨å­˜å‚¨įš„įŖį›˜ UUID åŽŒæˆįš„ã€‚ 7.6 extra NAME DIR ------------------ 厚䚉čĻé€ščŋ‡ `smart` 和 `probe` å‘Ŋäģ¤į›‘æŽ§įš„éĸå¤–įŖį›˜įš„åį§°å’ŒæŒ‚čŊŊį‚šã€‚ čŋ™å¯šäēŽį›‘æŽ§ä¸åąžäēŽé˜ĩ列äŊ†įŗģįģŸčŋčĄŒæ‰€åŋ…éœ€įš„įŖį›˜īŧˆäž‹åĻ‚å¯åŠ¨į›˜īŧ‰éžå¸¸æœ‰į”¨ã€‚ č¯ˇæŗ¨æ„īŧŒæ­¤įąģįŖį›˜ä¸å— `up` 和 `down` å‘Ŋäģ¤įš„åŊąå“īŧŒå› ä¸ē厃äģŦčĸĢéĸ„期始įģˆå¤„äēŽ æ—‹čŊŦįŠļ态。 7.7 nohidden ------------ æŽ’é™¤æ‰€æœ‰éšč—æ–‡äģļå’Œį›ŽåŊ•。 在 Unix 中īŧŒéšč—æ–‡äģ￘¯äģĨ `.` åŧ€å¤´įš„æ–‡äģļ。 在 Windows 中īŧŒåރäģŦæ˜¯å…ˇæœ‰éšč—åąžæ€§įš„æ–‡äģļ。 7.8 exclude/include PATTERN --------------------------- 厚䚉čρäģŽåŒæ­Ĩčŋ‡į¨‹ä¸­æŽ’除或包åĢįš„æ–‡äģ￈–į›ŽåŊ•æ¨Ąåŧã€‚ æ‰€æœ‰æ¨ĄåŧéƒŊæŒ‰æŒ‡åŽšįš„éĄēåēå¤„į†ã€‚ åĻ‚æžœåŒšé…įš„įŦŦ一ä¸Ēæ¨Ąåŧæ˜¯ `exclude` æ¨ĄåŧīŧŒåˆ™æŽ’除č¯Ĩ文äģļ。 åĻ‚æžœåŽƒæ˜¯ `include` æ¨ĄåŧīŧŒåˆ™åŒ…åĢč¯Ĩ文äģļ。 åĻ‚æžœæ˛Ąæœ‰æ¨ĄåŧåŒšé…īŧŒåˆ™åĻ‚æžœæŒ‡åŽšįš„æœ€åŽä¸€ä¸Ēæ¨Ąåŧæ˜¯ `include`īŧŒåˆ™æŽ’除č¯Ĩ文äģļīŧŒ æˆ–č€…åĻ‚æžœæŒ‡åŽšįš„æœ€åŽä¸€ä¸Ēæ¨Ąåŧæ˜¯ `exclude`īŧŒåˆ™åŒ…åĢč¯Ĩ文äģļ。 æœ‰å…ŗæ¨Ąåŧč§„čŒƒįš„æ›´å¤šč¯Ļįģ†äŋĄæ¯īŧŒč¯ˇå‚阅 PATTERN 部分。 æ­¤é€‰éĄšå¯äģĨ多æŦĄäŊŋį”¨ã€‚ 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- 厚䚉åĨ‡åļæ ĄéĒŒįš„åŸēæœŦ块大小īŧˆäģĨ KiB ä¸ē单äŊīŧ‰ã€‚ 一 KiB 是 1024 å­—čŠ‚ã€‚ éģ˜čŽ¤įš„ blocksize 是 256īŧŒčŋ™åē”č¯Ĩ适ᔍäēŽå¤§å¤šæ•°æƒ…å†ĩ。 **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čĻæ›´æ”šæ­¤å€ŧ。 将æĨčĻæ›´æ”šæ­¤å€ŧīŧŒæ‚¨å°†éœ€čĻé‡æ–°åˆ›åģēæ•´ä¸ĒåĨ‡åļæ Ąénjīŧ äŊŋį”¨ä¸åŒ blocksize įš„ä¸€ä¸Ē原因是īŧŒåĻ‚æžœæ‚¨æœ‰čŽ¸å¤šå°åž‹æ–‡äģļīŧŒ 数量įē§ä¸ēæ•°į™žä¸‡ã€‚ 寚äēŽæ¯ä¸Ē文äģļīŧŒåŗäŊŋåĒ有几ä¸Ēå­—čŠ‚īŧŒäšŸäŧšåˆ†é…ä¸€ä¸ĒåŽŒæ•´įš„åĨ‡åļæ ĄéĒŒå—īŧŒ åšļ且寚äēŽčŽ¸å¤šæ–‡äģļīŧŒčŋ™å¯čƒŊå¯ŧč‡´å¤§é‡įš„æœĒäŊŋᔍåĨ‡åļæ ĄénjįŠē间。 åŊ“您厌全åĄĢæģĄåĨ‡åļæ ĄéĒŒįŖį›˜æ—ļīŧŒä¸å…čŽ¸å‘æ•°æŽįŖį›˜ æˇģ加更多文äģļ。 äŊ†æ˜¯īŧŒæĩĒč´šįš„åĨ‡åļæ ĄéĒŒä¸äŧščˇ¨æ•°æŽįŖį›˜į´¯į§¯ã€‚ æ•°æŽįŖį›˜ä¸Šå¤§é‡æ–‡äģļå¯ŧč‡´įš„æĩĒč´šįŠē间äģ…限åˆļč¯Ĩæ•°æŽįŖį›˜ä¸Šįš„æ•°æŽé‡īŧŒ 而不限åˆļå…ļäģ–įŖį›˜ä¸Šįš„æ•°æŽé‡ã€‚ äŊœä¸ē一ä¸Ēčŋ‘äŧŧå€ŧīŧŒæ‚¨å¯äģĨå‡čŽžæ¯ä¸Ē文äģļæĩĒč´šäē†åŠä¸Ēå—å¤§å°įš„įŠē间。 例åĻ‚īŧŒå¯šäēŽ 100,000 ä¸Ē文äģļ和 256 KiB įš„å—å¤§å°īŧŒæ‚¨å°†æĩĒč´š 12.8 GB įš„åĨ‡åļæ ĄénjįŠē间īŧŒ čŋ™å¯čƒŊå¯ŧč‡´æ•°æŽįŖį›˜ä¸Šå°‘ 12.8 GB įš„å¯į”¨įŠē间。 您可äģĨäŊŋᔍ `status` æŖ€æŸĨ每ä¸ĒįŖį›˜ä¸ŠæĩĒč´šįš„įŠē间量。 čŋ™æ˜¯æ‚¨åŋ…éĄģåœ¨æ•°æŽįŖį›˜ä¸Šį•™å‡ēįš„įŠē闲įŠē间量īŧŒ æˆ–į”¨äēŽä¸åŒ…åĢ在é˜ĩåˆ—ä¸­įš„æ–‡äģļįš„įŠē间量。 åĻ‚æžœæ­¤å€ŧä¸ē负īŧŒåˆ™čĄ¨į¤ēæ‚¨åŗå°†åĄĢæģĄåĨ‡åļæ ĄénjįŠē间īŧŒ åŽƒčĄ¨į¤ē您äģį„ļ可äģĨæĩĒč´šįš„įŠē间。 ä¸ēéŋ免此闎éĸ˜īŧŒæ‚¨å¯äģĨä¸ēåĨ‡åļæ ĄénjäŊŋį”¨æ›´å¤§įš„åˆ†åŒē。 例åĻ‚īŧŒåĻ‚æžœåĨ‡åļæ ĄéĒŒåˆ†åŒēæ¯”æ•°æŽįŖį›˜å¤§ 12.8 GBīŧŒ 则您有čļŗå¤Ÿįš„éĸå¤–įŠē间æĨå¤„į†æ¯ä¸Ēæ•°æŽįŖį›˜ä¸Šå¤ščžž 100,000 ä¸Ē 文äģļ而不äŧšæĩĒč´šäģģäŊ•įŠē间。 在 Linux ä¸­čŽˇåž—æ›´å¤§įš„åĨ‡åļæ ĄéĒŒåˆ†åŒēįš„ä¸€ä¸ĒæŠ€åˇ§æ˜¯äŊŋᔍäģĨ下å‘Ŋä줿 ŧåŧåŒ–åރīŧš mkfs.ext4 -m 0 -T largefile4 DEVICE čŋ™äŧšå¯ŧ致大įēĻ 1.5% įš„éĸå¤–įŠē间īŧŒå¯šäēŽ 4 TB įŖį›˜įēĻä¸ē 60 GBīŧŒ čŋ™å…čŽ¸æ¯ä¸Ēæ•°æŽįŖį›˜ä¸Šå¤§įēĻ 460,000 ä¸Ē文äģļ而不äŧšæĩĒč´šäģģäŊ•įŠē间。 7.10 hashsize SIZE_IN_BYTES --------------------------- 厚䚉äŋå­˜å—įš„æ•Ŗåˆ—å¤§å°īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰ã€‚ éģ˜čŽ¤įš„ hashsize 是 16 å­—čŠ‚īŧˆ128 äŊīŧ‰īŧŒčŋ™åē”č¯Ĩ适ᔍäēŽå¤§å¤šæ•°æƒ…å†ĩ。 **č­Ļ告īŧ** æ­¤é€‰éĄšäģ…䞛专åŽļäŊŋᔍīŧŒåŧē჈åģē议不čĻæ›´æ”šæ­¤å€ŧ。 将æĨčĻæ›´æ”šæ­¤å€ŧīŧŒæ‚¨å°†éœ€čĻé‡æ–°åˆ›åģēæ•´ä¸ĒåĨ‡åļæ Ąénjīŧ äŊŋį”¨ä¸åŒ hashsize įš„ä¸€ä¸Ē原因是īŧŒåĻ‚æžœæ‚¨įš„įŗģįģŸå†…存有限。 栚捎įģénjīŧŒSnapRAID 通常每 16 TB įš„é˜ĩ列数捎需čρ 1 GiB įš„ RAM。 å…ˇäŊ“æĨ蝴īŧŒä¸ēäē†å­˜å‚¨æ•°æŽįš„æ•Ŗåˆ—īŧŒSnapRAID 大įēĻ需čρ $TS*(1+HS)/BS$ å­—čŠ‚įš„ RAMīŧŒ å…ļ中 $TS$ æ˜¯æ‚¨įš„įŖį›˜é˜ĩåˆ—įš„æ€ģ大小īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰īŧŒ$BS$ 是块大小īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰īŧŒ $HS$ æ˜¯æ•Ŗåˆ—å¤§å°īŧˆäģĨå­—čŠ‚ä¸ē单äŊīŧ‰ã€‚ 例åĻ‚īŧŒå¯šäēŽ 8 ä¸Ē 4 TB įŖį›˜īŧŒå—大小ä¸ē 256 KiB īŧˆ1 KiB = 1024 å­—čŠ‚īŧ‰īŧŒæ•Ŗåˆ—大小ä¸ē 16īŧŒæ‚¨å°†čŽˇåž—īŧš RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93$ GiB 切æĸåˆ°æ•Ŗåˆ—å¤§å°ä¸ē 8īŧŒæ‚¨å°†čŽˇåž—īŧš RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02$ GiB 切æĸ到块大小ä¸ē 512īŧŒæ‚¨å°†čŽˇåž—īŧš RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96$ GiB 切æĸåˆ°æ•Ŗåˆ—å¤§å°ä¸ē 8 和块大小ä¸ē 512īŧŒæ‚¨å°†čŽˇåž—īŧš RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51$ GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- 在同æ­Ĩ或 scrub 䚋后īŧŒå¤„į†æŒ‡åŽšæ•°é‡įš„ GB 后īŧŒč‡Ē动äŋå­˜įŠļ态。 æ­¤é€‰éĄšæœ‰åŠŠäēŽéŋ免在æœē器崊æēƒæˆ–äģģäŊ•å…ļäģ–äē‹äģļ中断æ—ļīŧŒ äģŽå¤´åŧ€å§‹é‡æ–°å¯åЍé•ŋæ—ļé—´įš„ `sync` å‘Ŋäģ¤ã€‚ 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- 莞įŊŽå…čŽ¸įš„æœ€éĢ˜įŖį›˜æ¸ŠåēĻīŧˆæ‘„氏åēĻīŧ‰ã€‚指厚后īŧŒ SnapRAID äŧšäŊŋᔍ smartctl åˇĨå…ˇåŽšæœŸæŖ€æŸĨæ‰€æœ‰įŖį›˜įš„æ¸ŠåēĻ。 SnapRAID čŋčĄŒæ—ļäŧšæ˜žį¤ēåŊ“å‰įŖį›˜æ¸ŠåēĻ。 åĻ‚æžœäģģäŊ•įŖį›˜čļ…čŋ‡æ­¤é™åˆļīŧŒæ‰€æœ‰æ“äŊœéƒŊäŧšåœæ­ĸīŧŒ åšļ在 `temp_sleep` é€‰éĄšåŽšäš‰įš„æŒįģ­æ—ļé—´å†…å°†įŖį›˜åœčŊŦīŧˆįŊŽäēŽåž…æœēįŠļ态īŧ‰ã€‚ 在äŧ‘įœ æœŸčŋ‡åŽīŧŒæ“äŊœæĸ复īŧŒåĻ‚æžœæ¸ŠåēĻ限åˆļ再æŦĄčžžåˆ°īŧŒ 可čƒŊäŧšå†æŦĄæš‚停。 在操äŊœæœŸé—´īŧŒSnapRAID čŋ˜äŧšåˆ†æžæ¯ä¸ĒįŖį›˜įš„åŠ įƒ­æ›˛įēŋīŧŒ åšļäŧ°čŽĄåĻ‚æžœæ´ģ动įģ§įģ­īŧŒåރäģŦéĸ„čŽĄå°†čžžåˆ°įš„é•ŋæœŸį¨ŗåŽšæ¸ŠåēĻ。 äģ…åœ¨įŖį›˜æ¸ŠåēĻåĸžåŠ äē†å››æŦĄåŽæ‰æ‰§čĄŒäŧ°čŽĄīŧŒ äģĨįĄŽäŋæœ‰čļŗå¤Ÿįš„æ•°æŽį‚šæĨåģēįĢ‹å¯é įš„čļ‹åŠŋ。 æ­¤éĸ„æĩ‹įš„į¨ŗåŽšæ¸ŠåēĻæ˜žį¤ē在åŊ“前å€ŧæ—čžšįš„æ‹Ŧåˇä¸­īŧŒ 有劊äēŽč¯„äŧ°įŗģįģŸįš„å†ˇå´æ˜¯åĻčļŗå¤Ÿã€‚ æ­¤äŧ°čŽĄæ¸ŠåēĻäģ…äž›å‚č€ƒīŧŒå¯š SnapRAID įš„čĄŒä¸ēæ˛Ąæœ‰åŊąå“ã€‚ ፋåēįš„动äŊœäģ…åŸēäēŽåŽžé™…æĩ‹é‡įš„įŖį›˜æ¸ŠåēĻ。 čĻæ‰§čĄŒæ­¤åˆ†æžīŧŒSnapRAID 需čρ䏀ä¸Ēįŗģį쟿¸ŠåēĻįš„å‚č€ƒã€‚ 厃éĻ–å…ˆå°č¯•äģŽå¯į”¨įš„įĄŦäģļäŧ æ„Ÿå™¨č¯ģ取。 åĻ‚æžœæ— æŗ•čŽŋ问įŗģįģŸäŧ æ„Ÿå™¨īŧŒåރäŧšäŊŋᔍčŋčĄŒæ—ļæĩ‹é‡įš„æœ€äŊŽįŖį›˜æ¸ŠåēĻ äŊœä¸ēå¤‡į”¨å‚č€ƒã€‚ 通常īŧŒSnapRAID åĒ昞į¤ēæœ€įƒ­įŖį›˜įš„æ¸ŠåēĻ。 čĻæ˜žį¤ēæ‰€æœ‰įŖį›˜įš„æ¸ŠåēĻīŧŒč¯ˇäŊŋᔍ -A 或 --stats é€‰éĄšã€‚ 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- 莞įŊŽčžžåˆ°æ¸ŠåēĻ限åˆļæ—ļįš„åž…æœēæ—ļ间īŧˆäģĨ分钟ä¸ē单äŊīŧ‰ã€‚ 在此期间īŧŒįŖį›˜äŋæŒåœčŊŦįŠļ态。éģ˜čޤå€ŧä¸ē 5 分钟。 7.14 pool DIR ------------- 厚䚉 `pooling` į›ŽåŊ•īŧŒå…ļ中äŊŋᔍ `pool` å‘Ŋäģ¤åˆ›åģēįŖį›˜ é˜ĩåˆ—įš„č™šæ‹Ÿč§†å›žã€‚ į›ŽåŊ•åŋ…éĄģ厞įģå­˜åœ¨ã€‚ 7.15 share UNC_DIR ------------------ 厚䚉čŋœį¨‹čŽŋé—ŽįŖį›˜æ‰€éœ€įš„ Windows UNC čˇ¯åž„ã€‚ åĻ‚æžœæŒ‡åŽšä熿­¤é€‰éĄšīŧŒåˆ™åœ¨ pool į›ŽåŊ•中创åģēįš„įŦĻåˇé“žæŽĨäŧšäŊŋį”¨æ­¤ UNC čˇ¯åž„ æĨčŽŋé—ŽįŖį›˜ã€‚ åĻ‚æžœæ˛Ąæœ‰æ­¤é€‰éĄšīŧŒåˆ™į”Ÿæˆįš„įŦĻåˇé“žæŽĨäģ…äŊŋᔍæœŦåœ°čˇ¯åž„īŧŒ čŋ™ä¸å…čŽ¸é€ščŋ‡įŊ‘įģœå…ąäēĢ pool į›ŽåŊ•。 įŦĻåˇé“žæŽĨ是äŊŋį”¨æŒ‡åŽšįš„ UNC čˇ¯åž„īŧŒæˇģ加在 `data` é€‰éĄšä¸­æŒ‡åŽšįš„ įŖį›˜åį§°īŧŒæœ€åŽæˇģ加文äģļį›ŽåŊ•å’Œåį§°åŊĸæˆįš„ã€‚ æ­¤é€‰éĄšäģ…在 Windows 中需čĻã€‚ 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ 厚䚉č‡Ē厚䚉 smartctl 选项äģĨčŽˇå–æ¯ä¸ĒįŖį›˜įš„ SMART åąžæ€§ã€‚ čŋ™å¯šäēŽ RAID 控åˆļ器和一ä盿— æŗ•č‡ĒåŠ¨æŖ€æĩ‹įš„ USB įŖį›˜å¯čƒŊ需čĻã€‚%s 占äŊįŦĻäŧščĸĢčŽžå¤‡åį§°æ›ŋæĸīŧŒ äŊ†å¯šäēŽå›ēåŽšįš„čŽžå¤‡īŧˆåĻ‚ RAID 控åˆļ器īŧ‰æ˜¯å¯é€‰įš„。 DISK 是在 `data` é€‰éĄšä¸­æŒ‡åŽšįš„į›¸åŒįŖį›˜åį§°ã€‚ PARITY 是åĨ‡åļæ ĄéĒŒåį§°äš‹ä¸€īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity` 或 `z-parity`。 åœ¨æŒ‡åŽšįš„ OPTIONS 中īŧŒå­—įŦĻ串 `%s` čĸĢčŽžå¤‡åį§°æ›ŋæĸ。 寚äēŽ RAID 控åˆļ器īŧŒčŽžå¤‡å¯čƒŊ是å›ēåŽšįš„īŧŒ 您可čƒŊ不需čρäŊŋᔍ `%s`。 č¯ˇå‚é˜… smartmontools æ–‡æĄŖäģĨäē†č§Ŗå¯čƒŊįš„é€‰éĄšīŧš https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices 例åĻ‚īŧš smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- åœ¨čŽĄįŽ—įŖį›˜æ•…éšœæĻ‚įŽ‡æ—ļåŋŊį•ĨæŒ‡åŽšįš„ SMART åąžæ€§ã€‚ åĻ‚æžœįŖį›˜æŠĨ告äē†į‰šåŽšåąžæ€§įš„ä¸å¯ģå¸¸æˆ–č¯¯å¯ŧå€ŧīŧŒæ­¤é€‰éĄšåžˆæœ‰į”¨ã€‚ DISK 是在 `data` é€‰éĄšä¸­æŒ‡åŽšįš„į›¸åŒįŖį›˜åį§°ã€‚ PARITY 是åĨ‡åļæ ĄéĒŒåį§°äš‹ä¸€īŧš`parity`、`2-parity`、`3-parity`、 `4-parity`、`5-parity`、`6-parity` 或 `z-parity`。 į‰šæŽŠå€ŧ * å¯į”¨äēŽåœ¨æ‰€æœ‰įŖį›˜ä¸ŠåŋŊį•Ĩč¯Ĩåąžæ€§ã€‚ 例åĻ‚īŧŒčĻåœ¨æ‰€æœ‰įŖį›˜ä¸ŠåŋŊį•Ĩ `Current Pending Sector Count` åąžæ€§īŧš smartignore * 197 čρäģ…在įŦŦ一ä¸ĒåĨ‡åļæ ĄéĒŒįŖį›˜ä¸ŠåŋŊį•Ĩ厃īŧš smartignore parity 197 7.18 Examples ------------- Unix įš„å…¸åž‹é…įŊŽį¤ē例åς䏋īŧš parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 Windows įš„å…¸åž‹é…įŊŽį¤ē例åς䏋īŧš parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= æ¨Ąåŧæäž›äē†ä¸€į§įĩæ´ģįš„æ–šæŗ•æĨčŋ‡æģ¤čĻåŒ…åĢæˆ–æŽ’é™¤įš„æ–‡äģļ。通čŋ‡äŊŋį”¨é€šé…įŦĻīŧˆglobbingīŧ‰īŧŒ 您可äģĨåŽšäš‰åŒšé…į‰šåŽšæ–‡äģļ名或整ä¸Ēį›ŽåŊ•į쓿ž„įš„č§„åˆ™īŧŒč€Œæ— éœ€æ‰‹åŠ¨åˆ—å‡ē每ä¸Ēčˇ¯åž„ã€‚ é—Žåˇ `?` åŒšé…é™¤į›ŽåŊ•分隔įŦĻäģĨå¤–įš„äģģäŊ•单ä¸Ē字įŦĻ。čŋ™äŊŋåž—åŽƒåœ¨åŒšé…å…ˇæœ‰å˜é‡å­—įŦĻ įš„æ–‡äģļ名æ—ļéžå¸¸æœ‰į”¨īŧŒåŒæ—ļå°†æ¨Ąåŧé™åˆļ在单ä¸Ēį›ŽåŊ•åą‚įē§å†…。 å•æ˜Ÿåˇ `*` 匚配äģģäŊ•å­—įŦĻåēåˆ—īŧŒäŊ†ä¸Žé—Žåˇä¸€æ ˇīŧŒåރįģä¸äŧščˇ¨čļŠį›ŽåŊ•čžšį•Œã€‚ åŽƒåœ¨æ­Ŗæ–œæ å¤„åœæ­ĸīŧŒå› æ­¤é€‚ᔍäēŽåŒšé…å•ä¸Ēčˇ¯åž„įģ„äģļå†…įš„å†…åŽšã€‚ čŋ™æ˜¯ Shell 通配įŦĻä¸­å¸¸č§įš„æ ‡å‡†čĄŒä¸ē。 åŒæ˜Ÿåˇ `**` 功čƒŊ更åŧē大īŧŒåŽƒå¯äģĨ匚配äģģäŊ•å­—įŦĻåēåˆ—īŧŒåŒ…æ‹Ŧį›ŽåŊ•分隔įŦĻ。 čŋ™å…čŽ¸æ¨ĄåŧåŒšé…čˇ¨čļŠå¤šä¸Ēį›ŽåŊ•åą‚įē§ã€‚åŊ“ `**` į›´æŽĨåĩŒå…Ĩåœ¨æ¨Ąåŧä¸­æ—ļīŧŒ 厃可äģĨ匚配é›ļä¸Ē或多ä¸Ē字įŦĻīŧŒåŒ…æ‹Ŧ周围文字文æœŦäš‹é—´įš„æ–œæ ã€‚ `**` 最重čĻįš„į”¨æŗ•æ˜¯į‰šæŽŠåŊĸåŧ `/**/`。厃可äģĨ匚配é›ļä¸Ē或多ä¸ĒåŽŒæ•´įš„į›ŽåŊ•åą‚įē§īŧŒ äģŽč€Œå¯äģĨ在不įŸĨé“įĄŽåˆ‡čˇ¯åž„į쓿ž„įš„æƒ…å†ĩ下īŧŒåŒšé…į›ŽåŊ•树中äģģäŊ•æˇąåēĻįš„æ–‡äģļ。 例åĻ‚īŧŒæ¨Ąåŧ `src/**/main.js` 匚配 `src/main.js`īŧˆčˇŗčŋ‡é›ļä¸Ēį›ŽåŊ•īŧ‰ã€ `src/ui/main.js`īŧˆčˇŗčŋ‡ä¸€ä¸Ēį›ŽåŊ•īŧ‰äģĨ及 `src/ui/components/main.js` īŧˆčˇŗčŋ‡ä¸¤ä¸Ēį›ŽåŊ•īŧ‰ã€‚ äŊŋį”¨æ–šæ‹Ŧåˇ `[]` įš„å­—įŦĻįąģåŒšé…æŒ‡åŽšé›†åˆæˆ–čŒƒå›´å†…įš„å•ä¸Ē字įŦĻ。 与å…ļäģ–单字įŦĻæ¨Ąåŧä¸€æ ˇīŧŒåރäģŦä¸åŒšé…į›ŽåŊ•分隔įŦĻ。字įŦĻįąģ支持äŊŋᔍ æ„Ÿåšåˇčŋ›čĄŒčŒƒå›´æŒ‡åŽšå’ŒåĻ厚。 需čĻčŽ°äŊįš„æ šæœŦåŒēåˆĢ是īŧŒ`*`、`?` 和字įŦĻįąģéƒŊéĩåžĒį›ŽåŊ•čžšį•ŒīŧŒ åšļ且äģ…在单ä¸Ēčˇ¯åž„įģ„äģļ内匚配īŧŒč€Œ `**` 是唯一可äģĨ表čļŠį›ŽåŊ•分隔įŦĻåŒšé…įš„æ¨Ąåŧã€‚ æœ‰å››į§ä¸åŒįąģåž‹įš„æ¨Ąåŧīŧš FILE 选拊äģģäŊ•名ä¸ē FILE įš„æ–‡äģļ。 æ­¤æ¨Ąåŧäģ…适ᔍäēŽæ–‡äģļīŧŒä¸é€‚ᔍäēŽį›ŽåŊ•。 DIR/ 选拊äģģäŊ•名ä¸ē DIR įš„į›ŽåŊ•及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚ æ­¤æ¨Ąåŧäģ…适ᔍäēŽį›ŽåŊ•īŧŒä¸é€‚ᔍäēŽæ–‡äģļ。 /PATH/FILE é€‰æ‹ŠæŒ‡åŽšįš„įĄŽåˆ‡æ–‡äģļčˇ¯åž„ã€‚æ­¤æ¨Ąåŧäģ…适ᔍäēŽæ–‡äģļīŧŒä¸é€‚ᔍäēŽį›ŽåŊ•。 /PATH/DIR/ é€‰æ‹ŠæŒ‡åŽšįš„įĄŽåˆ‡į›ŽåŊ•čˇ¯åž„åŠå…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚æ­¤æ¨Ąåŧäģ…适ᔍäēŽį›ŽåŊ•īŧŒ ä¸é€‚į”¨äēŽæ–‡äģļ。 åŊ“您指åޚäģĨ / åŧ€å¤´įš„įģå¯ščˇ¯åž„æ—ļīŧŒåރåē”ᔍäēŽé˜ĩ列**æ šį›ŽåŊ•**īŧŒ č€Œä¸æ˜¯æœŦ地文äģļįŗģį쟿 šį›ŽåŊ•。 在 Windows 中īŧŒæ‚¨å¯äģĨäŊŋį”¨åæ–œæ  \ äģŖæ›ŋæ­Ŗæ–œæ  /。 Windows įŗģįģŸį›ŽåŊ•、čŋžæŽĨį‚šã€æŒ‚čŊŊį‚šå’Œå…ļäģ– Windows į‰šæŽŠį›ŽåŊ•čĸĢ视ä¸ē文äģļīŧŒčŋ™æ„å‘ŗį€čĻæŽ’é™¤åŽƒäģŦīŧŒ 您åŋ…éĄģäŊŋį”¨æ–‡äģļč§„åˆ™īŧŒč€Œä¸æ˜¯į›ŽåŊ•č§„åˆ™ã€‚ åĻ‚æžœæ–‡äģļ名包åĢ `*`、`?`、`[` 或 `]` 字įŦĻīŧŒæ‚¨åŋ…éĄģ寚å…ļčŋ›čĄŒčŊŦ义īŧŒäģĨéŋ免将å…ļč§Ŗé‡Šä¸ē globbing 字įŦĻ。在 Unix 中īŧŒčŊŦ䚉字įŦĻæ˜¯ `\`īŧ›åœ¨ Windows 中īŧŒåŽƒæ˜¯ `^`。 åŊ“æ¨Ąåŧåœ¨å‘Ŋäģ¤čĄŒä¸Šæ—ļīŧŒæ‚¨åŋ…éĄģ双写čŊŦ义 字įŦĻīŧŒäģĨéŋ免å‘Ŋäģ¤ shell 寚å…ļčŋ›čĄŒč§Ŗé‡Šã€‚ 在配įŊŽæ–‡äģļ中īŧŒæ‚¨å¯äģĨäŊŋį”¨ä¸åŒįš„į­–į•ĨæĨčŋ‡æģ¤čĻå¤„į†įš„æ–‡äģļ。 æœ€įŽ€å•įš„æ–šæŗ•æ˜¯äģ…äŊŋᔍ `exclude` č§„åˆ™æĨåˆ é™¤æ‰€æœ‰æ‚¨ä¸æƒŗå¤„į†įš„ 文äģļå’Œį›ŽåŊ•。䞋åĻ‚īŧš # 排除äģģäŊ•名ä¸ē `*.unrecoverable` įš„æ–‡äģļ exclude *.unrecoverable # æŽ’é™¤æ šį›ŽåŊ• `/lost+found` exclude /lost+found/ # 排除äģģäŊ•名ä¸ē `tmp` įš„å­į›ŽåŊ• exclude tmp/ į›¸åįš„æ–šæŗ•æ˜¯äģ…åŽšäš‰æ‚¨æƒŗčĻå¤„į†įš„æ–‡äģļīŧŒäģ…äŊŋᔍ `include` č§„åˆ™ã€‚äž‹åĻ‚īŧš # äģ…包åĢ一äē›į›ŽåŊ• include /movies/ include /musics/ include /pictures/ æœ€åŽįš„æ–šæŗ•æ˜¯æˇˇåˆäŊŋᔍ `exclude` 和 `include` č§„åˆ™ã€‚åœ¨čŋ™į§æƒ…å†ĩ下īŧŒ č§„åˆ™įš„éĄēåēåžˆé‡čĻã€‚čžƒæ—Šįš„č§„åˆ™äŧ˜å…ˆäēŽ čžƒæ™šįš„č§„åˆ™ã€‚ ä¸ēäē†įŽ€åŒ–īŧŒæ‚¨å¯äģĨ先列å‡ē所有 `exclude` č§„åˆ™īŧŒį„ļ后 列å‡ē所有 `include` č§„åˆ™ã€‚äž‹åĻ‚īŧš # 排除äģģäŊ•名ä¸ē `*.unrecoverable` įš„æ–‡äģļ exclude *.unrecoverable # 排除äģģäŊ•名ä¸ē `tmp` įš„å­į›ŽåŊ• exclude tmp/ # äģ…包åĢ一äē›į›ŽåŊ• include /movies/ include /musics/ include /pictures/ 在å‘Ŋäģ¤čĄŒä¸ŠīŧŒäŊŋᔍ -f 选项īŧŒæ‚¨åĒčƒŊäŊŋᔍ `include` æ¨Ąåŧã€‚äž‹åĻ‚īŧš # äģ…æŖ€æŸĨ .mp3 文äģļ。 # 在 Unix 中īŧŒäŊŋᔍåŧ•åˇäģĨéŋ免 shell æ‰Šåą• globbing。 snapraid -f "*.mp3" check 在 Unix 中īŧŒåœ¨å‘Ŋäģ¤čĄŒä¸ŠäŊŋᔍ globbing 字įŦĻæ—ļīŧŒåŋ…éĄģ åŧ•ᔍåރäģŦäģĨ防æ­ĸ shell æ‰Šåą•åŽƒäģŦ。 9 IGNORE FILE ============= 除äē†é…įŊŽæ–‡äģļä¸­įš„å…¨åą€č§„åˆ™å¤–īŧŒæ‚¨čŋ˜å¯äģĨ在é˜ĩåˆ—å†…įš„äģģäŊ•į›ŽåŊ•中攞įŊŽ `.snapraidignore` 文äģļīŧŒäģĨåŽšäš‰åˆ†æ•Ŗįš„æŽ’é™¤č§„åˆ™ã€‚ 在 `.snapraidignore` ä¸­åŽšäš‰įš„č§„åˆ™äŧšåœ¨é…įŊŽæ–‡äģļä¸­įš„č§„åˆ™äš‹åŽåē”į”¨ã€‚ čŋ™æ„å‘ŗį€åރäģŦå…ˇæœ‰æ›´éĢ˜įš„äŧ˜å…ˆįē§īŧŒå¯į”¨äēŽæŽ’é™¤å…ˆå‰į”ąå…¨åą€é…įŊŽåŒ…åĢįš„æ–‡äģļ。 厞际上īŧŒåĻ‚æžœæœŦåœ°č§„åˆ™åŒšé…īŧŒåˆ™æ— čŽēå…¨åą€åŒ…åĢ莞įŊŽåĻ‚äŊ•īŧŒč¯Ĩ文äģļéƒŊäŧščĸĢæŽ’é™¤ã€‚ `.snapraidignore` ä¸­įš„æ¨Ąåŧé€ģčž‘ä¸Žå…¨åą€é…įŊŽį›¸åŒīŧŒäŊ†æ¨Ąåŧé”šåޚ圍 č¯Ĩ文äģ￉€åœ¨įš„į›ŽåŊ•īŧš FILE é€‰æ‹Šæ­¤į›ŽåŊ•或å…ļ下斚äģģäŊ•名ä¸ē FILE įš„æ–‡äģļ。 čŋ™éĩåžĒä¸Žå…¨åą€æ¨Ąåŧį›¸åŒįš„通配įŦĻč§„åˆ™ã€‚ DIR/ 选拊äģģäŊ•名ä¸ē DIR įš„į›ŽåŊ•及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšīŧŒ äŊäēŽæ­¤į›ŽåŊ•或å…ļ下斚。 /PATH/FILE é€‰æ‹Šį›¸å¯šäēŽ `.snapraidignore` 文äģļäŊįŊŽæŒ‡åŽšįš„į˛žįĄŽæ–‡äģļ。 /PATH/DIR/ é€‰æ‹Šį›¸å¯šäēŽ `.snapraidignore` 文äģļäŊįŊŽæŒ‡åŽšįš„į˛žįĄŽį›ŽåŊ• 及å…ļå†…éƒ¨įš„æ‰€æœ‰å†…åŽšã€‚ ä¸Žå…¨åą€é…įŊŽä¸åŒīŧŒ`.snapraidignore` 文äģļäģ…æ”¯æŒæŽ’é™¤č§„åˆ™īŧ› 您不čƒŊäŊŋᔍ `include` æ¨Ąåŧæˆ–åĻ厚įŦĻåˇ (!)。 例åĻ‚īŧŒåĻ‚æžœæ‚¨åœ¨ `/mnt/disk1/projects/` 中有一ä¸Ē `.snapraidignore`īŧš # ä셿ޒ除 /mnt/disk1/projects/output.bin /output.bin # 排除 projects/ 中äģģäŊ•名ä¸ē `build` įš„į›ŽåŊ• build/ # 排除 projects/ 或å…ļ子文äģļ多中äģģäŊ• .tmp 文äģļ *.tmp 10 CONTENT ========== SnapRAID 将文äģļåˆ—čĄ¨å’Œæ ĄéĒŒå’Œå­˜å‚¨åœ¨ content 文äģļ中。 厃是一ä¸ĒäēŒčŋ›åˆļ文äģļīŧŒåˆ—å‡ēäē†įŖį›˜é˜ĩåˆ—ä¸­å­˜åœ¨įš„æ‰€æœ‰æ–‡äģļīŧŒ äģĨåŠį”¨äēŽénj蝁å…ļåŽŒæ•´æ€§įš„æ‰€æœ‰æ ĄéĒŒå’Œã€‚ 此文äģļį”ą `sync` 和 `scrub` å‘Ŋäģ¤č¯ģ取和写å…ĨīŧŒåšļį”ą `fix`、`check` 和 `status` å‘Ŋäģ¤č¯ģ取。 11 PARITY ========= SnapRAID 将é˜ĩåˆ—įš„åĨ‡åļæ ĄénjäŋĄæ¯å­˜å‚¨åœ¨ parity 文äģļ中。 čŋ™ä盿˜¯äēŒčŋ›åˆļ文äģļīŧŒåŒ…åĢ `content` 文äģļä¸­åŽšäš‰įš„æ‰€æœ‰ å—įš„čŽĄįŽ—åĨ‡åļæ ĄéĒŒã€‚ čŋ™ä盿–‡äģļį”ą `sync` 和 `fix` å‘Ŋäģ¤č¯ģ取和写å…ĨīŧŒ åšļ且äģ…į”ą `scrub` 和 `check` å‘Ŋäģ¤č¯ģ取。 12 ENCODING =========== SnapRAID 在 Unix 中åŋŊį•ĨäģģäŊ•įŧ–į ã€‚åރč¯ģ取åšļ存储 文äģļįŗģįģŸäŊŋį”¨įš„į›¸åŒįŧ–į įš„æ–‡äģļ名。 在 Windows 中īŧŒäģŽæ–‡äģļįŗģįģŸč¯ģå–įš„æ‰€æœ‰åį§°éƒŊäŧščĸĢčŊŦæĸåšļ äģĨ UTF-8 æ ŧåŧå¤„į†ã€‚ čρäŊŋ文äģļåæ­ŖįĄŽæ‰“å°īŧŒæ‚¨åŋ…éĄģäŊŋᔍå‘Ŋäģ¤ `chcp 65001` 将 Windows 控åˆļå°čŽžįŊŽä¸ē UTF-8 æ¨ĄåŧīŧŒåšļäŊŋᔍ TrueType 字äŊ“īŧŒåĻ‚ `Lucida Console`īŧŒ äŊœä¸ē控åˆļ台字äŊ“。čŋ™äģ…åŊąå“æ‰“å°įš„æ–‡äģļ名īŧ›åĻ‚æžœ 您将控åˆļå°čž“å‡ē重厚向到文äģļīŧŒåˆ™į”Ÿæˆįš„æ–‡äģļ始įģˆ é‡‡į”¨ UTF-8 æ ŧåŧã€‚ 13 COPYRIGHT ============ 此文äģļį‰ˆæƒæ‰€æœ‰ (C) 2025 Andrea Mazzoleni 14 SEE ALSO =========== snapraid_log(1), snapraidd(1) snapraid-14.9/doc/snapraid.1000066400000000000000000001725711522717156100157240ustar00rootroot00000000000000.TH "SnapRAID Backup for Disk Arrays" 1 .SH NAME snapraid \- SnapRAID Backup for Disk Arrays .SH SYNOPSIS snapraid [\-c, \-\-conf CONFIG] .PD 0 .PP .PD [\-f, \-\-filter PATTERN] [\-d, \-\-filter\-disk NAME] .PD 0 .PP .PD [\-m, \-\-filter\-missing] [\-e, \-\-filter\-error] .PD 0 .PP .PD [\-a, \-\-audit\-only] [\-h, \-\-pre\-hash] [\-i, \-\-import DIR] .PD 0 .PP .PD [\-p, \-\-plan PERC|bad|new|full] .PD 0 .PP .PD [\-o, \-\-older\-than DAYS] [\-l, \-\-log FILE] .PD 0 .PP .PD [\-s, \-\-spin\-down\-on\-error] [\-w, \-\-bw\-limit RATE] .PD 0 .PP .PD [\-t, \-\-tail] .PD 0 .PP .PD [\-Z, \-\-force\-zero] [\-E, \-\-force\-empty] .PD 0 .PP .PD [\-U, \-\-force\-uuid] [\-D, \-\-force\-device] .PD 0 .PP .PD [\-N, \-\-force\-nocopy] [\-F, \-\-force\-full] .PD 0 .PP .PD [\-R, \-\-force\-realloc] [\-W, \-\-force\-realloc\-tail] .PD 0 .PP .PD [\-S, \-\-start BLKSTART] [\-B, \-\-count BLKCOUNT] .PD 0 .PP .PD [\-L, \-\-error\-limit NUMBER] .PD 0 .PP .PD [\-A, \-\-stats] .PD 0 .PP .PD [\-v, \-\-verbose] [\-q, \-\-quiet] .PD 0 .PP .PD status|smart|probe|up|down|diff|sync|scrub|fix|check .PD 0 .PP .PD |list|dup|pool|devices|touch|rehash|locate .PD 0 .PD .PP snapraid [\-V, \-\-version] [\-H, \-\-help] [\-C, \-\-gen\-conf CONTENT] .PD 0 .PD .SH DESCRIPTION SnapRAID is a backup program designed for disk arrays, storing parity information for data recovery in the event of up to six disk failures. .PP Primarily intended for home media centers with large, infrequently changing files, SnapRAID offers several features: .PD 0 .IP \(bu You can utilize disks already filled with files without the need to reformat them, accessing them as usual. .IP \(bu All your data is hashed to ensure data integrity and prevent silent corruption. .IP \(bu When the number of failed disks exceeds the parity count, data loss is confined to the affected disks; data on other disks remains accessible. .IP \(bu If you accidentally delete files on a disk, recovery is possible. .IP \(bu Disks can have different sizes. .IP \(bu You can add disks at any time. .IP \(bu SnapRAID doesn\'t lock in your data; you can stop using it anytime without reformatting or moving data. .IP \(bu To access a file, only a single disk needs to spin, saving power and reducing noise. .PD .PP For more information, please visit the official SnapRAID site: .PP .RS 4 https://www.snapraid.it/ .PD 0 .PD .RE .SH LIMITATIONS SnapRAID is a hybrid between a RAID and a backup program, aiming to combine the best benefits of both. However, it has some limitations that you should consider before using it. .PP The main limitation is that if a disk fails and you haven\'t recently synced, you may not be able to fully recover. More specifically, you may be unable to recover up to the size of the changed or deleted files since the last sync operation. This occurs even if the changed or deleted files are not on the failed disk. This is why SnapRAID is better suited for data that rarely changes. .PP On the other hand, newly added files don\'t prevent recovery of already existing files. You will only lose the recently added files if they are on the failed disk. .PP Other SnapRAID limitations are: .PD 0 .IP \(bu With SnapRAID, you still have separate file systems for each disk. With RAID, you get a single large file system. .IP \(bu SnapRAID doesn\'t stripe data. With RAID, you get a speed boost with striping. .IP \(bu SnapRAID doesn\'t support real\-time recovery. With RAID, you do not have to stop working when a disk fails. .IP \(bu SnapRAID can recover data only from a limited number of disk failures. With a backup, you can recover from a complete failure of the entire disk array. .IP \(bu Only file names, timestamps, symlinks, and hardlinks are saved. Permissions, ownership, and extended attributes are not saved. .PD .SH GETTING STARTED To use SnapRAID, you need to first select one disk in your disk array to dedicate to \`parity\` information. With one disk for parity, you will be able to recover from a single disk failure, similar to RAID5. .PP If you want to recover from more disk failures, similar to RAID6, you must reserve additional disks for parity. Each additional parity disk allows recovery from one more disk failure. .PP As parity disks, you must pick the largest disks in the array, as the parity information may grow to the size of the largest data disk in the array. .PP These disks will be dedicated to storing the \`parity\` files. You should not store your data on them. .PP Then, you must define the \`data\` disks that you want to protect with SnapRAID. The protection is more effective if these disks contain data that rarely changes. For this reason, it\'s better to NOT include the Windows C:\\ disk or the Unix /home, /var, and /tmp directories. .PP The list of files is saved in the \`content\` files, usually stored on the data, parity, or boot disks. This file contains the details of your backup, including all the checksums to verify its integrity. The \`content\` file is stored in multiple copies, and each copy must be on a different disk to ensure that, even in case of multiple disk failures, at least one copy is available. .PP For example, suppose you are interested in only one parity level of protection, and your disks are located at: .PP .RS 4 /mnt/diskp <\- selected disk for parity .PD 0 .PP .PD /mnt/disk1 <\- first disk to protect .PD 0 .PP .PD /mnt/disk2 <\- second disk to protect .PD 0 .PP .PD /mnt/disk3 <\- third disk to protect .PD 0 .PD .RE .PP You must create the configuration file /etc/snapraid.conf with the following options: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD content /mnt/disk1/snapraid.content .PD 0 .PP .PD content /mnt/disk2/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PD .RE .PP If you are on Windows, you should use the Windows path format, with drive letters and backslashes instead of slashes. .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD content F:\\array\\snapraid.content .PD 0 .PP .PD content G:\\array\\snapraid.content .PD 0 .PP .PD data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PD .RE .PP If you have many disks and run out of drive letters, you can mount disks directly in subfolders. See: .PP .RS 4 https://www.google.com/search?q=Windows+mount+point .PD 0 .PD .RE .PP At this point, you are ready to run the \`sync\` command to build the parity information. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP This process may take several hours the first time, depending on the size of the data already present on the disks. If the disks are empty, the process is immediate. .PP You can stop it at any time by pressing Ctrl+C, and at the next run, it will resume where it was interrupted. .PP When this command completes, your data is SAFE. .PP Now you can start using your array as you like and periodically update the parity information by running the \`sync\` command. .SS Scrubbing To periodically check the data and parity for errors, you can run the \`scrub\` command. .PP .RS 4 snapraid scrub .PD 0 .PD .RE .PP This command compares the data in your array with the hash computed during the \`sync\` command to verify integrity. .PP Each run of the command checks approximately 8% of the array, excluding data already scrubbed in the previous 10 days. You can use the \-p, \-\-plan option to specify a different amount and the \-o, \-\-older\-than option to specify a different age in days. For example, to check 5% of the array for blocks older than 20 days, use: .PP .RS 4 snapraid \-p 5 \-o 20 scrub .PD 0 .PD .RE .PP If silent or input/output errors are found during the process, the corresponding blocks are marked as bad in the \`content\` file and listed in the \`status\` command. .PP .RS 4 snapraid status .PD 0 .PD .RE .PP To fix them, you can use the \`fix\` command, filtering for bad blocks with the \-e, \-\-filter\-error option: .PP .RS 4 snapraid \-e fix .PD 0 .PD .RE .PP At the next \`scrub\`, the errors will disappear from the \`status\` report if they are truly fixed. To make it faster, you can use \-p bad to scrub only blocks marked as bad. .PP .RS 4 snapraid \-p bad scrub .PD 0 .PD .RE .PP Running \`scrub\` on an unsynced array may report errors caused by removed or modified files. These errors are reported in the \`scrub\` output, but the related blocks are not marked as bad. .SS Pooling Note: The pooling feature described below has been superseded by the mergerfs tool, which is now the recommended option for Linux users in the SnapRAID community. Mergefs provides a more flexible and efficient way to pool multiple drives into a single unified mount point, allowing seamless access to files across your array without relying on symbolic links. It integrates well with SnapRAID for parity protection and is commonly used in setups like OpenMediaVault (OMV) or custom NAS configurations. .PP To have all the files in your array shown in the same directory tree, you can enable the \`pooling\` feature. It creates a read\-only virtual view of all the files in your array using symbolic links. .PP You can configure the \`pooling\` directory in the configuration file with: .PP .RS 4 pool /pool .PD 0 .PD .RE .PP or, if you are on Windows, with: .PP .RS 4 pool C:\\pool .PD 0 .PD .RE .PP and then run the \`pool\` command to create or update the virtual view. .PP .RS 4 snapraid pool .PD 0 .PD .RE .PP If you are using a Unix platform and want to share this directory over the network to either Windows or Unix machines, you should add the following options to your /etc/samba/smb.conf: .PP .RS 4 # In the global section of smb.conf .PD 0 .PP .PD unix extensions = no .PD 0 .PD .RE .PP .RS 4 # In the share section of smb.conf .PD 0 .PP .PD [pool] .PD 0 .PP .PD comment = Pool .PD 0 .PP .PD path = /pool .PD 0 .PP .PD read only = yes .PD 0 .PP .PD guest ok = yes .PD 0 .PP .PD wide links = yes .PD 0 .PP .PD follow symlinks = yes .PD 0 .PD .RE .PP In Windows, sharing symbolic links over a network requires clients to resolve them remotely. To enable this, besides sharing the pool directory, you must also share all the disks independently, using the disk names defined in the configuration file as share points. You must also specify in the \`share\` option of the configuration file the Windows UNC path that remote clients need to use to access these shared disks. .PP For example, operating from a server named \`darkstar\`, you can use the options: .PP .RS 4 data d1 F:\\array\\ .PD 0 .PP .PD data d2 G:\\array\\ .PD 0 .PP .PD data d3 H:\\array\\ .PD 0 .PP .PD pool C:\\pool .PD 0 .PP .PD share \\\\darkstar .PD 0 .PD .RE .PP and share the following directories over the network: .PP .RS 4 \\\\darkstar\\pool \-> C:\\pool .PD 0 .PP .PD \\\\darkstar\\d1 \-> F:\\array .PD 0 .PP .PD \\\\darkstar\\d2 \-> G:\\array .PD 0 .PP .PD \\\\darkstar\\d3 \-> H:\\array .PD 0 .PD .RE .PP to allow remote clients to access all the files at \\\\darkstar\\pool. .PP You may also need to configure remote clients to enable access to remote symlinks with the command: .PP .RS 4 fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 .PD 0 .PD .RE .SS Undeleting SnapRAID functions more like a backup program than a RAID system, and it can be used to restore or undelete files to their previous state using the \-f, \-\-filter option: .PP .RS 4 snapraid fix \-f FILE .PD 0 .PD .RE .PP or for a directory: .PP .RS 4 snapraid fix \-f DIR/ .PD 0 .PD .RE .PP You can also use it to recover only accidentally deleted files inside a directory using the \-m, \-\-filter\-missing option, which restores only missing files, leaving all others untouched. .PP .RS 4 snapraid fix \-m \-f DIR/ .PD 0 .PD .RE .PP Or to recover all the deleted files on all drives with: .PP .RS 4 snapraid fix \-m .PD 0 .PD .RE .SS Recovering The worst has happened, and you have lost one or more disks! .PP DO NOT PANIC! You will be able to recover them! .PP The first thing you must do is avoid further changes to your disk array. Disable any remote connections to it and any scheduled processes, including any scheduled SnapRAID nightly sync or scrub. .PP Then proceed with the following steps. .SS STEP 1 \-> Reconfigure You need some space to recover, ideally on additional spare disks, but an external USB disk or remote disk will suffice. .PP Modify the SnapRAID configuration file to make the \`data\` or \`parity\` option of the failed disk point to a location with enough empty space to recover the files. .PP For example, if disk \`d1\` has failed, change from: .PP .RS 4 data d1 /mnt/disk1/ .PD 0 .PD .RE .PP to: .PP .RS 4 data d1 /mnt/new_spare_disk/ .PD 0 .PD .RE .PP If the disk to recover is a parity disk, update the appropriate \`parity\` option. If you have multiple failed disks, update all their configuration options. .SS STEP 2 \-> Fix Run the fix command, storing the log in an external file with: .PP .RS 4 snapraid \-d NAME \-l fix.log fix .PD 0 .PD .RE .PP Where NAME is the name of the disk, such as \`d1\` in our previous example. If the disk to recover is a parity disk, use the names \`parity\`, \`2\-parity\`, etc. If you have multiple failed disks, use multiple \-d options to specify all of them. .PP This command will take a long time. .PP Ensure you have a few gigabytes free to store the fix.log file. Run it from a disk with sufficient free space. .PP Now you have recovered all that is recoverable. If some files are partially or totally unrecoverable, they will be renamed by adding the \`.unrecoverable\` extension. .PP You can find a detailed list of all unrecoverable blocks in the fix.log file by checking all lines starting with \`unrecoverable:\`. .PP If you are not satisfied with the recovery, you can retry it as many times as you wish. .PP For example, if you have removed files from the array after the last \`sync\`, this may result in some files not being recovered. In this case, you can retry the \`fix\` using the \-i, \-\-import option, specifying where these files are now to include them again in the recovery process. .PP If you are satisfied with the recovery, you can proceed further, but note that after syncing, you cannot retry the \`fix\` command anymore! .SS STEP 3 \-> Check As a cautious check, you can now run a \`check\` command to ensure that everything is correct on the recovered disk. .PP .RS 4 snapraid \-d NAME \-a check .PD 0 .PD .RE .PP Where NAME is the name of the disk, such as \`d1\` in our previous example. .PP The \-d and \-a options tell SnapRAID to check only the specified disk and ignore all parity data. .PP This command will take a long time, but if you are not overly cautious, you can skip it. .SS STEP 4 \-> Sync Run the \`sync\` command to resynchronize the array with the new disk. .PP .RS 4 snapraid sync .PD 0 .PD .RE .PP If everything is recovered, this command is immediate. .SH COMMANDS SnapRAID provides a few simple commands that allow you to: .PD 0 .IP \(bu Print the status of the array \-> \`status\` .IP \(bu Control the disks \-> \`smart\`, \`probe\`, \`up\`, \`down\` .IP \(bu Make a backup/snapshot \-> \`sync\` .IP \(bu Periodically check data \-> \`scrub\` .IP \(bu Restore the last backup/snapshot \-> \`fix\`. .PD .PP Commands must be written in lowercase. .SS status Prints a summary of the state of the disk array. .PP It includes information about parity fragmentation, how old the blocks are without checking, and all recorded silent errors encountered while scrubbing. .PP The information presented refers to the latest time you ran \`sync\`. Later modifications are not taken into account. .PP If bad blocks were detected, their block numbers are listed. To fix them, you can use the \`fix \-e\` command. .PP It also shows a graph representing the last time each block was scrubbed or synced. Scrubbed blocks are shown with \`*\`, blocks synced but not yet scrubbed with \`o\`. .PP Nothing is modified. .SS smart Prints a SMART report of all the disks in the system. .PP It includes an estimation of the probability of failure in the next year, allowing you to plan maintenance replacements of disks that show suspicious attributes. .PP This probability estimation is obtained by correlating the SMART attributes of the disks with the Backblaze data available at: .PP .RS 4 https://www.backblaze.com/hard\-drive\-test\-data.html .PD 0 .PD .RE .PP If SMART reports that a disk is failing, \`FAIL\` or \`PREFAIL\` is printed for that disk, and SnapRAID returns with an error. In this case, immediate replacement of the disk is highly recommended. .PP Other possible status strings are: .RS 4 .PD 0 .HP 4 .I logfail In the past, some attributes were lower than the threshold. .HP 4 .I logerr The device error log contains errors. .HP 4 .I selferr The device self\-test log contains errors. .PD .RE .PP If the \-v, \-\-verbose option is specified, a deeper statistical analysis is provided. This analysis can help you decide if you need more or less parity. .PP This command uses the \`smartctl\` tool and is equivalent to running \`smartctl \-a\` on all devices. .PP If your devices are not auto\-detected correctly, you can specify a custom command using the \`smartctl\` option in the configuration file. .PP Nothing is modified. .SS probe Prints the POWER state of all disks in the system. .PP \`Standby\` means the disk is not spinning. \`Active\` means the disk is spinning. .PP This command uses the \`smartctl\` tool and is equivalent to running \`smartctl \-n standby \-i\` on all devices. .PP If your devices are not auto\-detected correctly, you can specify a custom command using the \`smartctl\` option in the configuration file. .PP Nothing is modified. .SS up Spins up all the disks of the array. .PP You can spin up only specific disks using the \-d, \-\-filter\-disk option. .PP Spinning up all the disks at the same time requires a lot of power. Ensure that your power supply can sustain it. .PP Nothing is modified. .SS down Spins down all the disks of the array. .PP This command uses the \`smartctl\` tool and is equivalent to running \`smartctl \-s standby,now\` on all devices. .PP You can spin down only specific disks using the \-d, \-\-filter\-disk option. .PP To automatically spin down on error, you can use the \-s, \-\-spin\-down\-on\-error option with any other command, which is equivalent to running \`down\` manually when an error occurs. .PP Nothing is modified. .SS diff Lists all the files modified since the last \`sync\` that need to have their parity data recomputed. .PP This command doesn\'t check the file data, but only the file timestamp, size, and inode. .PP After listing all changed files, a summary of the changes is presented, grouped by: .RS 4 .PD 0 .HP 4 .I equal Files unchanged from before. .HP 4 .I added Files added that were not present before. .HP 4 .I removed Files removed. .HP 4 .I updated Files with a different size or timestamp, meaning they were modified. .HP 4 .I moved Files moved to a different directory on the same disk. They are identified by having the same name, size, timestamp, and inode, but a different directory. .HP 4 .I copied Files copied on the same or a different disk where the original file still exists. They are identified by having the same name, size, and timestamp. If the sub\-second timestamp is zero, the full path must match to be identified, not just the name. .HP 4 .I relocated Files moved on the same or a different disk where the original has disappeared. They are identified by having the same name, size, and timestamp. If the sub\-second timestamp is zero, the full path must match to be identified. Unlike \'moved\' files on the same disk, relocated files have a different inode. .HP 4 .I restored Files with a different inode but matching directory, name, size, and timestamp. These are usually files restored after being deleted. .PD .RE .PP If a \`sync\` is required, the process return code is 2, instead of the default 0. The return code 1 is used for a generic error condition. .PP Nothing is modified. .SS sync Updates the parity information. All modified files in the disk array are read, and the corresponding parity data is updated. .PP You can stop this process at any time by pressing Ctrl+C, without losing the work already done. At the next run, the \`sync\` process will resume where it was interrupted. .PP If silent or input/output errors are found during the process, the corresponding blocks are marked as bad. .PP Files are identified by path and/or inode and checked by size and timestamp. If the file size or timestamp differs, the parity data is recomputed for the entire file. If the file is moved or renamed on the same disk, keeping the same inode, the parity is not recomputed. If the file is moved to another disk, the parity is recomputed, but the previously computed hash information is retained. .PP The \`content\` and \`parity\` files are modified if necessary. The files in the array are NOT modified. .SS scrub Scrubs the array, checking for silent or input/output errors in data and parity disks. .PP Each invocation checks approximately 8% of the array, excluding data already scrubbed in the last 10 days. This means that scrubbing once a week ensures every bit of data is checked at least once every three months. .PP You can define a different scrub plan or amount using the \-p, \-\-plan option, which accepts: bad \- Scrub blocks marked bad. new \- Scrub just\-synced blocks not yet scrubbed. full \- Scrub everything. 0\-100 \- Scrub the specified percentage of blocks. .PP If you specify a percentage amount, you can also use the \-o, \-\-older\-than option to define how old the block should be. The oldest blocks are scrubbed first, ensuring an optimal check. If you want to scrub only the just\-synced blocks not yet scrubbed, use the \`\-p new\` option. .PP To get details of the scrub status, use the \`status\` command. .PP For any silent or input/output error found, the corresponding blocks are marked as bad in the \`content\` file. These bad blocks are listed in \`status\` and can be fixed with \`fix \-e\`. After the fix, at the next scrub, they will be rechecked, and if found corrected, the bad mark will be removed. To scrub only the bad blocks, you can use the \`scrub \-p bad\` command. .PP It\'s recommended to run \`scrub\` only on a synced array to avoid reported errors caused by unsynced data. These errors are recognized as not being silent errors, and the blocks are not marked as bad, but such errors are reported in the output of the command. .PP The \`content\` file is modified to update the time of the last check for each block and to mark bad blocks. The \`parity\` files are NOT modified. The files in the array are NOT modified. .SS fix Fixes all the files and the parity data. .PP All files and parity data are compared with the snapshot state saved in the last \`sync\`. If a difference is found, it is reverted to the stored snapshot. .PP WARNING! The \`fix\` command does not differentiate between errors and intentional modifications. It unconditionally reverts the file state to the last \`sync\`. .PP If no other option is specified, the entire array is processed. Use the filter options to select a subset of files or disks to operate on. .PP To fix only the blocks marked bad during \`sync\` and \`scrub\`, use the \-e, \-\-filter\-error option. Unlike other filter options, this one applies fixes only to files that are unchanged since the latest \`sync\`. .PP SnapRAID renames all files that cannot be fixed by adding the \`.unrecoverable\` extension. .PP Before fixing, the entire array is scanned to find any files moved since the last \`sync\` operation. These files are identified by their timestamp, ignoring their name and directory, and are used in the recovery process if necessary. If you moved some of them outside the array, you can use the \-i, \-\-import option to specify additional directories to scan. .PP Files are identified only by path, not by inode. .PP The \`content\` file is NOT modified. The \`parity\` files are modified if necessary. The files in the array are modified if necessary. .SS check Verifies all the files and the parity data. .PP It works like \`fix\`, but it only simulates a recovery and no changes are written to the array. .PP This command is primarily intended for manual verification, such as after a recovery process or in other special conditions. For periodic and scheduled checks, use \`scrub\`. .PP If you use the \-a, \-\-audit\-only option, only the file data is checked, and the parity data is ignored for a faster run. .PP Files are identified only by path, not by inode. .PP Nothing is modified. .SS list Lists all the files contained in the array at the time of the last \`sync\`. .PP With \-v or \-\-verbose, the subsecond time is also shown. .PP Nothing is modified. .SS dup Lists all duplicate files. Two files are assumed equal if their hashes match. The file data is not read; only the precomputed hashes are used. .PP Nothing is modified. .SS pool Creates or updates a virtual view of all the files in your disk array in the \`pooling\` directory. .PP The files are not copied but linked using symbolic links. .PP When updating, all existing symbolic links and empty subdirectories are deleted and replaced with the new view of the array. Any other regular files are left in place. .PP Nothing is modified outside the pool directory. .SS devices Prints the low\-level devices used by the array. .PP This command displays the device associations in the array and is mainly intended as a script interface. .PP The first two columns are the low\-level device ID and path. The next two columns are the high\-level device ID and path. The last column is the disk name in the array. .PP In most cases, you have one low\-level device for each disk in the array, but in some more complex configurations, you may have multiple low\-level devices used by a single disk in the array. .PP Nothing is modified. .SS touch Sets an arbitrary sub\-second timestamp for all files that have it set to zero. .PP This improves SnapRAID\'s ability to recognize moved and copied files, as it makes the timestamp almost unique, reducing possible duplicates. .PP More specifically, if the sub\-second timestamp is not zero, a moved or copied file is identified as such if it matches the name, size, and timestamp. If the sub\-second timestamp is zero, it is considered a copy only if the full path, size, and timestamp all match. .PP The second\-precision timestamp is not modified, so all the dates and times of your files will be preserved. .SS rehash Schedules a rehash of the entire array. .PP This command changes the hash kind used, typically when upgrading from a 32\-bit system to a 64\-bit one, to switch from MurmurHash3 to the faster SpookyHash. .PP If you are already using the optimal hash, this command does nothing and informs you that no action is needed. .PP The rehash is not performed immediately but takes place progressively during \`sync\` and \`scrub\`. .PP You can check the rehash state using \`status\`. .PP During the rehash, SnapRAID maintains full functionality, with the only exception that \`dup\` cannot detect duplicated files using a different hash. .SS locate Locate files stored in the parity disks. For each matching file, it prints its location within the parity file and the number of fragments it occupies. .PP You can use the \-t, \-\-tail option to restrict the operation to files occupying the specified tail portion of the parity. .PP If you want to reallocate these files, you can then use the \-W, \-\-force\-realloc\-tail option. Be aware that such files will not be protected by parity during the reallocation process. .SH OPTIONS SnapRAID provides the following options: .TP .B \-c, \-\-conf CONFIG Selects the configuration file to use. If not specified, in Unix it uses the file \`/usr/local/etc/snapraid.conf\` if it exists, otherwise \`/etc/snapraid.conf\`. In Windows, it uses the file \`snapraid.conf\` in the same directory as \`snapraid.exe\`. .TP .B \-f, \-\-filter PATTERN Filters the files to process in \`check\` and \`fix\`. Only the files matching the specified pattern are processed. This option can be used multiple times. See the PATTERN section for more details on pattern specifications. In Unix, ensure globbing characters are quoted if used. This option can be used only with \`check\` and \`fix\`. It cannot be used with \`sync\` and \`scrub\`, as they always process the entire array. .TP .B \-d, \-\-filter\-disk NAME Filters the disks to process in \`check\`, \`fix\`, \`up\`, and \`down\`. You must specify a disk name as defined in the configuration file. You can also specify parity disks with the names: \`parity\`, \`2\-parity\`, \`3\-parity\`, etc., to limit operations to a specific parity disk. If you combine multiple \-\-filter, \-\-filter\-disk, and \-\-filter\-missing options, only files matching all the filters are selected. This option can be used multiple times. This option can be used only with \`check\`, \`fix\`, \`up\`, and \`down\`. It cannot be used with \`sync\` and \`scrub\`, as they always process the entire array. .TP .B \-m, \-\-filter\-missing Filters the files to process in \`check\` and \`fix\`. Only the files missing or deleted from the array are processed. When used with \`fix\`, this acts as an \`undelete\` command. If you combine multiple \-\-filter, \-\-filter\-disk, and \-\-filter\-missing options, only files matching all the filters are selected. This option can be used only with \`check\` and \`fix\`. It cannot be used with \`sync\` and \`scrub\`, as they always process the entire array. .TP .B \-e, \-\-filter\-error Processes the files with errors in \`check\` and \`fix\`. It processes only files that have blocks marked with silent or input/output errors during \`sync\` and \`scrub\`, as listed in \`status\`. This option can be used only with \`check\` and \`fix\`. .TP .B \-p, \-\-plan PERC|bad|new|full Selects the scrub plan. If PERC is a numeric value from 0 to 100, it is interpreted as the percentage of blocks to scrub. Instead of a percentage, you can specify a plan: \`bad\` scrubs bad blocks, \`new\` scrubs blocks not yet scrubbed, and \`full\` scrubs everything. This option can be used only with \`scrub\`. .TP .B \-o, \-\-older\-than DAYS Selects the oldest part of the array to process in \`scrub\`. DAYS is the minimum age in days for a block to be scrubbed; the default is 10. Blocks marked as bad are always scrubbed regardless of this option. This option can be used only with \`scrub\`. .TP .B \-a, \-\-audit\-only In \`check\`, verifies the hash of the files without checking the parity data. If you are interested only in checking the file data, this option can significantly speed up the checking process. This option can be used only with \`check\`. .TP .B \-h, \-\-pre\-hash In \`sync\`, runs a preliminary hashing phase of all new data for additional verification before the parity computation. Usually, in \`sync\`, no preliminary hashing is done, and the new data is hashed just before the parity computation when it is read for the first time. This process occurs when the system is under heavy load, with all disks spinning and a busy CPU. This is an extreme condition for the machine, and if it has a latent hardware problem, silent errors may go undetected because the data is not yet hashed. To avoid this risk, you can enable the \`pre\-hash\` mode to have all the data read twice to ensure its integrity. This option also verifies files moved within the array to ensure the move operation was successful and, if necessary, allows you to run a fix operation before proceeding. This option can be used only with \`sync\`. .TP .B \-i, \-\-import DIR Imports from the specified directory any files deleted from the array after the last \`sync\`. If you still have such files, they can be used by \`check\` and \`fix\` to improve the recovery process. The files are read, including in subdirectories, and are identified regardless of their name. This option can be used only with \`check\` and \`fix\`. .TP .B \-s, \-\-spin\-down\-on\-error On any error, spins down all managed disks before exiting with a non\-zero status code. This prevents the drives from remaining active and spinning after an aborted operation, helping to avoid unnecessary heat buildup and power consumption. Use this option to ensure disks are safely stopped even when a command fails. .TP .B \-w, \-\-bw\-limit RATE Applies a global bandwidth limit for all disks. The RATE is the number of bytes per second. You can specify a multiplier such as K, M, G, or T (e.g., \-\-bw\-limit 1G). .TP .B \-t, \-\-tail SIZE Limit file listing to those using no more than the specified tail size of the parity disks. You can use multipliers such as K, M, G, or T (e.g. \-\-tail 1G). This option is only valid when used together with the \`locate\` command. .TP .B \-A, \-\-stats Enables an extended status view that shows additional information. The screen displays two graphs: The first graph shows the number of buffered stripes for each disk, along with the file path of the file currently being accessed on that disk. Typically, the slowest disk will have no buffer available, which determines the maximum achievable bandwidth. The second graph shows the percentage of time spent waiting over the past 100 seconds. The slowest disk is expected to cause most of the wait time, while other disks should have little or no wait time because they can use their buffered stripes. This graph also shows the time spent waiting for hash calculations and RAID computations. All computations run in parallel with disk operations. Therefore, as long as there is measurable wait time for at least one disk, it indicates that the CPU is fast enough to keep up with the workload. .TP .B \-Z, \-\-force\-zero Forces the insecure operation of syncing a file with zero size that was previously non\-zero. If SnapRAID detects such a condition, it stops proceeding unless you specify this option. This allows you to easily detect when, after a system crash, some accessed files were truncated. This is a possible condition in Linux with the ext3/ext4 file systems. This option can be used only with \`sync\`. .TP .B \-E, \-\-force\-empty Forces the insecure operation of syncing a disk with all the original files missing. If SnapRAID detects that all the files originally present on the disk are missing or rewritten, it stops proceeding unless you specify this option. This allows you to easily detect when a data file system is not mounted. This option can be used only with \`sync\`. .TP .B \-U, \-\-force\-uuid Forces the insecure operation of syncing, checking, and fixing with disks that have changed their UUID. If SnapRAID detects that some disks have changed UUID, it stops proceeding unless you specify this option. This allows you to detect when your disks are mounted at the wrong mount points. It is, however, allowed to have a single UUID change with single parity, and more with multiple parity, because this is the normal case when replacing disks after a recovery. This option can be used only with \`sync\`, \`check\`, or \`fix\`. .TP .B \-D, \-\-force\-device Forces the insecure operation of fixing with inaccessible disks or with disks on the same physical device. For example, if you lost two data disks and have a spare disk to recover only the first one, you can ignore the second inaccessible disk. Or, if you want to recover a disk in the free space left on an already used disk, sharing the same physical device. This option can be used only with \`fix\`. .TP .B \-N, \-\-force\-nocopy In \`sync\`, \`check\`, and \`fix\`, disables the copy detection heuristic. Without this option, SnapRAID assumes that files with the same attributes, such as name, size, and timestamp, are copies with the same data. This allows identification of copied or moved files from one disk to another and reuses the already computed hash information to detect silent errors or to recover missing files. In some rare cases, this behavior may result in false positives or a slow process due to many hash verifications, and this option allows you to resolve such issues. This option can be used only with \`sync\`, \`check\`, and \`fix\`. .TP .B \-F, \-\-force\-full In \`sync\`, forces a full recomputation of the parity. This option can be used when you add a new parity level or if you reverted to an old content file using more recent parity data. Instead of recreating the parity from scratch, this allows you to reuse the hashes present in the content file to validate data and maintain data protection during the \`sync\` process using the existing parity data. This option can be used only with \`sync\`. .TP .B \-R, \-\-force\-realloc In \`sync\`, forces a full reallocation of files and rebuild of the parity. This option can be used to completely reallocate all files, removing fragmentation, while reusing the hashes present in the content file to validate data. This option can be used only with \`sync\`. WARNING! This option is for experts only, and it is highly recommended not to use it. You DO NOT have data protection during the \`sync\` operation. .TP .B \-W, \-\-force\-realloc\-tail SIZE Works like \-R, \-\-force\-realloc, but limited to the specified tail portion (last SIZE bytes) of each parity file. It forces reallocation (movement) of any file fragments/blocks currently stored in that tail section, allowing them to be placed anywhere in the parity file(s) where free space is available (including existing holes). The main purpose of this option is to shrink the on\-disk size of the parity file. If the reallocation successfully clears the entire tail section (no blocks remain using it), the parity file is truncated, reclaiming the unused tail space. You can use multipliers such as K, M, G, or T (e.g. \-\-force\-realloc\-tail 1G). You can use locate \-t, \-\-tail to know in advance the affected files. WARNING! This option is for experts only, and it is highly recommended not to use it. You DO NOT have data protection during the \`sync\` operation for the affected files. .TP .B \-l, \-\-log FILE Writes a detailed log to the specified file. If this option is not specified, unexpected errors are printed to the screen, potentially resulting in excessive output in case of many errors. When \-l, \-\-log is specified, only fatal errors that cause SnapRAID to stop are printed to the screen. If the path starts with \`>>\`, the file is opened in append mode. Occurrences of \`%D\` and \`%T\` in the name are replaced with the date and time in the format YYYYMMDD and HHMMSS. In Windows batch files, you must double the \`%\` character, e.g., result\-%%D.log. To use \`>>\`, you must enclose the name in quotes, e.g., \`\[dq]>>result.log\[dq]\`. To output the log to standard output or standard error, you can use \`\[dq]>&1\[dq]\` and \`\[dq]>&2\[dq]\`, respectively. See the snapraid_log.txt file or man page for log tag descriptions. .TP .B \-L, \-\-error\-limit NUMBER Sets a new error limit before stopping execution. By default, SnapRAID stops if it encounters more than 100 input/output errors, indicating that a disk is likely failing. This option affects \`sync\` and \`scrub\`, which are allowed to continue after the first set of disk errors to try to complete their operations. However, \`check\` and \`fix\` always stop at the first error. .TP .B \-S, \-\-start BLKSTART Starts processing from the specified block number. This can be useful for retrying to check or fix specific blocks in case of a damaged disk. This option is mainly for advanced manual recovery. .TP .B \-B, \-\-count BLKCOUNT Processes only the specified number of blocks. This option is mainly for advanced manual recovery. .TP .B \-C, \-\-gen\-conf CONTENT Generates a dummy configuration file from an existing content file. The configuration file is written to standard output and does not overwrite an existing one. This configuration file also contains the information needed to reconstruct the disk mount points in case you lose the entire system. .TP .B \-v, \-\-verbose Prints more information to the screen. If specified once, it prints excluded files and additional statistics. This option has no effect on the log files. .TP .B \-q, \-\-quiet Prints less information to the screen. If specified once, it removes the progress bar; twice, the running operations; three times, the info messages; four times, the status messages. Fatal errors are always printed to the screen. This option has no effect on the log files. .TP .B \-H, \-\-help Prints a short help screen. .TP .B \-V, \-\-version Prints the program version. .SH CONFIGURATION SnapRAID requires a configuration file to know where your disk array is located and where to store the parity information. .PP In Unix, it uses the file \`/usr/local/etc/snapraid.conf\` if it exists, otherwise \`/etc/snapraid.conf\`. In Windows, it uses the file \`snapraid.conf\` in the same directory as \`snapraid.exe\`. .PP It must contain the following options (case\-sensitive): .SS parity FILE [,FILE] ... Defines the files to use to store the parity information. The parity enables protection from a single disk failure, similar to RAID5. .PP You can specify multiple files, which must be on different disks. When a file cannot grow anymore, the next one is used. The total space available must be at least as large as the largest data disk in the array. .PP You can add additional parity files later, but you cannot reorder or remove them. .PP Keeping the parity disks reserved for parity ensures that they do not become fragmented, improving performance. .PP In Windows, 256 MB is left unused on each disk to avoid the warning about full disks. .PP This option is mandatory and can be used only once. .SS (2,3,4,5,6)\-parity FILE [,FILE] ... Defines the files to use to store extra parity information. .PP For each parity level specified, one additional level of protection is enabled: .PD 0 .IP \(bu 2\-parity enables RAID6 dual parity. .IP \(bu 3\-parity enables triple parity. .IP \(bu 4\-parity enables quad (four) parity. .IP \(bu 5\-parity enables penta (five) parity. .IP \(bu 6\-parity enables hexa (six) parity. .PD .PP Each parity level requires the presence of all previous parity levels. .PP The same considerations as for the \`parity\` option apply. .PP These options are optional and can be used only once. .SS z\-parity FILE [,FILE] ... Defines an alternate file and format to store triple parity. .PP This option is an alternative to \`3\-parity\`, primarily intended for low\-end CPUs like ARM or AMD Phenom, Athlon, and Opteron that do not support the SSSE3 instruction set. In such cases, it provides better performance. .PP This format is similar to but faster than the one used by ZFS RAIDZ3. Like ZFS, it does not work beyond triple parity. .PP When using \`3\-parity\`, you will be warned if it is recommended to use the \`z\-parity\` format for performance improvement. .PP It is possible to convert from one format to another by adjusting the configuration file with the desired z\-parity or 3\-parity file and using \`fix\` to recreate it. .SS content FILE Defines the file to use to store the list and checksums of all the files present in your disk array. .PP It can be placed on a disk used for data, parity, or any other disk available. If you use a data disk, this file is automatically excluded from the \`sync\` process. .PP This option is mandatory and can be used multiple times to save multiple copies of the same file. .PP You must store at least one copy for each parity disk used plus one. Using additional copies does not hurt. .SS data NAME DIR Defines the name and mount point of the data disks in the array. NAME is used to identify the disk and must be unique. DIR is the mount point of the disk in the file system. .PP You can change the mount point as needed, as long as you keep the NAME fixed. .PP You should use one option for each data disk in the array. .PP You can rename a disk later by changing the NAME directly in the configuration file and then running a \`sync\` command. In the case of renaming, the association is done using the stored UUID of the disks. .SS extra NAME DIR Defines the name and mount point of additional disks to monitor with the \`smart\` and \`probe\` commands. .PP This is useful for monitoring disks that are not part of the array but are required for the system to function, such as the boot disk. .PP Note that such disks are not affected by the \`up\` and \`down\` commands because they are expected to be always spinning. .SS nohidden Excludes all hidden files and directories. In Unix, hidden files are those starting with \`.\`. In Windows, they are those with the hidden attribute. .SS exclude/include PATTERN Defines the file or directory patterns to exclude or include in the sync process. All patterns are processed in the specified order. .PP If the first pattern that matches is an \`exclude\` one, the file is excluded. If it is an \`include\` one, the file is included. If no pattern matches, the file is excluded if the last pattern specified is an \`include\`, or included if the last pattern specified is an \`exclude\`. .PP See the PATTERN section for more details on pattern specifications. .PP This option can be used multiple times. .SS blocksize SIZE_IN_KIBIBYTES Defines the basic block size in kibibytes for the parity. One kibibyte is 1024 bytes. .PP The default blocksize is 256, which should work for most cases. .PP WARNING! This option is for experts only, and it is highly recommended not to change this value. To change this value in the future, you will need to recreate the entire parity! .PP A reason to use a different blocksize is if you have many small files, on the order of millions. .PP For each file, even if only a few bytes, an entire block of parity is allocated, and with many files, this may result in significant unused parity space. When you completely fill the parity disk, you are not allowed to add more files to the data disks. However, the wasted parity does not accumulate across data disks. Wasted space resulting from a high number of files on a data disk limits only the amount of data on that data disk, not others. .PP As an approximation, you can assume that half of the block size is wasted for each file. For example, with 100,000 files and a 256 KiB block size, you will waste 12.8 GB of parity, which may result in 12.8 GB less space available on the data disk. .PP You can check the amount of wasted space on each disk using \`status\`. This is the amount of space you must leave free on the data disks or use for files not included in the array. If this value is negative, it means you are close to filling the parity, and it represents the space you can still waste. .PP To avoid this issue, you can use a larger partition for parity. For example, if the parity partition is 12.8 GB larger than the data disks, you have enough extra space to handle up to 100,000 files on each data disk without any wasted space. .PP A trick to get a larger parity partition in Linux is to format it with the command: .PP .RS 4 mkfs.ext4 \-m 0 \-T largefile4 DEVICE .PD 0 .PD .RE .PP This results in about 1.5% extra space, approximately 60 GB for a 4 TB disk, which allows about 460,000 files on each data disk without any wasted space. .SS hashsize SIZE_IN_BYTES Defines the hash size in bytes for the saved blocks. .PP The default hashsize is 16 bytes (128 bits), which should work for most cases. .PP WARNING! This option is for experts only, and it is highly recommended not to change this value. To change this value in the future, you will need to recreate the entire parity! .PP A reason to use a different hashsize is if your system has limited memory. As a rule of thumb, SnapRAID typically requires 1 GiB of RAM for each 16 TB of data in the array. .PP Specifically, to store the hashes of the data, SnapRAID requires approximately TS*(1+HS)/BS bytes of RAM, where TS is the total size in bytes of your disk array, BS is the block size in bytes, and HS is the hash size in bytes. .PP For example, with 8 disks of 4 TB, a block size of 256 KiB (1 KiB = 1024 bytes), and a hash size of 16, you get: .PP RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB .PD 0 .PD .PP Switching to a hash size of 8, you get: .PP RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB .PD 0 .PD .PP Switching to a block size of 512, you get: .PP RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB .PD 0 .PD .PP Switching to both a hash size of 8 and a block size of 512, you get: .PP RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB .PD 0 .PD .SS autosave SIZE_IN_GIGABYTES Automatically saves the state when syncing or scrubbing after the specified amount of GB processed. This option is useful to avoid restarting long \`sync\` commands from scratch if interrupted by a machine crash or any other event. .SS temp_limit TEMPERATURE_CELSIUS Sets the maximum allowed disk temperature in Celsius. When specified, SnapRAID periodically checks the temperature of all disks using the smartctl tool. The current disk temperatures are displayed while SnapRAID is operating. If any disk exceeds this limit, all operations stop, and the disks are spun down (put into standby) for the duration defined by the \`temp_sleep\` option. After the sleep period, operations resume, potentially pausing again if the temperature limit is reached once more. .PP During operation, SnapRAID also analyzes the heating curve of each disk and estimates the long\-term steady temperature they are expected to reach if activity continues. The estimation is performed only after the disk temperature has increased four times, ensuring that enough data points are available to establish a reliable trend. This predicted steady temperature is shown in parentheses next to the current value and helps assess whether the system\'s cooling is adequate. This estimated temperature is for informational purposes only and has no effect on the behavior of SnapRAID. The program\'s actions are based solely on the actual measured disk temperatures. .PP To perform this analysis, SnapRAID needs a reference for the system temperature. It first attempts to read it from available hardware sensors. If no system sensor can be accessed, it uses the lowest disk temperature measured at the start of the run as a fallback reference. .PP Normally, SnapRAID shows only the temperature of the hottest disk. To display the temperature of all disks, use the \-A or \-\-stats option. .SS temp_sleep TIME_IN_MINUTES Sets the standby time, in minutes, when the temperature limit is reached. During this period, the disks remain spun down. The default is 5 minutes. .SS pool DIR Defines the pooling directory where the virtual view of the disk array is created using the \`pool\` command. .PP The directory must already exist. .SS share UNC_DIR Defines the Windows UNC path required to access the disks remotely. .PP If this option is specified, the symbolic links created in the pool directory use this UNC path to access the disks. Without this option, the symbolic links generated use only local paths, which does not allow sharing the pool directory over the network. .PP The symbolic links are formed using the specified UNC path, adding the disk name as specified in the \`data\` option, and finally adding the file directory and name. .PP This option is required only for Windows. .SS smartctl DISK/PARITY OPTIONS... Defines custom smartctl options to obtain the SMART attributes for each disk. This may be required for RAID controllers and some USB disks that cannot be auto\-detected. The %s placeholder is replaced by the device name, but it is optional for fixed devices like RAID controllers. .PP DISK is the same disk name specified in the \`data\` option. PARITY is one of the parity names: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\`, or \`z\-parity\`. .PP In the specified OPTIONS, the \`%s\` string is replaced by the device name. For RAID controllers, the device is likely fixed, and you may not need to use \`%s\`. .PP Refer to the smartmontools documentation for possible options: .PP .RS 4 https://www.smartmontools.org/wiki/Supported_RAID\-Controllers .PD 0 .PP .PD https://www.smartmontools.org/wiki/Supported_USB\-Devices .PD 0 .PD .RE .PP For example: .PP .RS 4 smartctl parity \-d sat %s .PD 0 .PD .RE .SS smartignore DISK/PARITY ATTR [ATTR...] Ignores the specified SMART attribute when computing the probability of disk failure. This option is useful if a disk reports unusual or misleading values for a particular attribute. .PP DISK is the same disk name specified in the \`data\` option. PARITY is one of the parity names: \`parity\`, \`2\-parity\`, \`3\-parity\`, \`4\-parity\`, \`5\-parity\`, \`6\-parity\`, or \`z\-parity\`. The special value * can be used to ignore the attribute on all disks. .PP For example, to ignore the \`Current Pending Sector Count\` attribute on all disks: .PP .RS 4 smartignore * 197 .PD 0 .PD .RE .PP To ignore it only on the first parity disk: .PP .RS 4 smartignore parity 197 .PD 0 .PD .RE .SS Examples An example of a typical configuration for Unix is: .PP .RS 4 parity /mnt/diskp/snapraid.parity .PD 0 .PP .PD content /mnt/diskp/snapraid.content .PD 0 .PP .PD content /var/snapraid/snapraid.content .PD 0 .PP .PD data d1 /mnt/disk1/ .PD 0 .PP .PD data d2 /mnt/disk2/ .PD 0 .PP .PD data d3 /mnt/disk3/ .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD exclude /tmp/ .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/sg0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/sg0 .PD 0 .PD .RE .PP An example of a typical configuration for Windows is: .PP .RS 4 parity E:\\snapraid.parity .PD 0 .PP .PD content E:\\snapraid.content .PD 0 .PP .PD content C:\\snapraid\\snapraid.content .PD 0 .PP .PD data d1 G:\\array\\ .PD 0 .PP .PD data d2 H:\\array\\ .PD 0 .PP .PD data d3 I:\\array\\ .PD 0 .PP .PD exclude Thumbs.db .PD 0 .PP .PD exclude \\$RECYCLE.BIN .PD 0 .PP .PD exclude \\System Volume Information .PD 0 .PP .PD smartctl d1 \-d sat %s .PD 0 .PP .PD smartctl d2 \-d usbjmicron %s .PD 0 .PP .PD smartctl parity \-d areca,1/1 /dev/arcmsr0 .PD 0 .PP .PD smartctl 2\-parity \-d areca,2/1 /dev/arcmsr0 .PD 0 .PD .RE .SH PATTERN Patterns are used to select a subset of files to exclude or include in the process. Globbing characters can be used to match files and paths in a flexible way. .PP The question mark \`?\` matches any single character except the directory separator. This makes it useful for matching filenames with variable characters while keeping the pattern confined to a single directory level. .PP The single star \`*\` matches any sequence of characters, but like the question mark, it never crosses directory boundaries. It stops at the forward slash, making it suitable for matching within a single path component. This is the standard wildcard behavior familiar from shell globbing. .PP The double star \`**\` is more powerful, it matches any sequence of characters including directory separators. This allows patterns to match across multiple directory levels. When \`**\` appears embedded directly in a pattern, it can match zero or more characters including slashes between the surrounding literal text. .PP The most important use of \`**\` is in the special form \`/**/\`. This matches zero or more complete directory levels, making it possible to match files at any depth in a directory tree without knowing the exact path structure. For example, the pattern \`src/**/main.js\` matches \`src/main.js\` (skipping zero directories), \`src/ui/main.js\` (skipping one directory), and \`src/ui/components/main.js\` (skipping two directories). .PP Character classes using square brackets match a single character from a specified set or range. Like the other single character patterns, they do not match directory separators. Classes support ranges and negation using an exclamation mark. .PP The fundamental distinction to remember is that \`*\`, \`?\`, and character classes all respect directory boundaries and only match within a single path component, while \`**\` is the only pattern that can match across directory separators. .PP There are four different types of patterns: .TP .B FILE Selects any file named FILE. This pattern applies only to files, not directories. .TP .B DIR/ Selects any directory named DIR and everything inside. This pattern applies only to directories, not files. .TP .B /PATH/FILE Selects the exact specified file path. This pattern applies only to files, not directories. .TP .B /PATH/DIR/ Selects the exact specified directory path and everything inside. This pattern applies only to directories, not files. .PP When you specify an absolute path starting with /, it is applied at the array root directory, not the local file system root directory. .PP In Windows, you can use the backslash \\ instead of the forward slash /. Windows system directories, junctions, mount points, and other Windows special directories are treated as files, meaning that to exclude them, you must use a file rule, not a directory one. .PP If the file name contains a \`*\`, \`?\`, \`[\`, or \`]\` character, you must escape it to avoid having it interpreted as a globbing character. In Unix, the escape character is \`\\\`; in Windows, it is \`^\`. When the pattern is on the command line, you must double the escape character to avoid having it interpreted by the command shell. .PP In the configuration file, you can use different strategies to filter the files to process. The simplest approach is to use only \`exclude\` rules to remove all the files and directories you do not want to process. For example: .PP .RS 4 # Excludes any file named \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Excludes the root directory \`/lost+found\` .PD 0 .PP .PD exclude /lost+found/ .PD 0 .PP .PD # Excludes any subdirectory named \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PD .RE .PP The opposite approach is to define only the files you want to process, using only \`include\` rules. For example: .PP .RS 4 # Includes only some directories .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP The final approach is to mix \`exclude\` and \`include\` rules. In this case, the order of rules is important. Earlier rules take precedence over later ones. To simplify, you can list all the \`exclude\` rules first and then all the \`include\` rules. For example: .PP .RS 4 # Excludes any file named \`*.unrecoverable\` .PD 0 .PP .PD exclude *.unrecoverable .PD 0 .PP .PD # Excludes any subdirectory named \`tmp\` .PD 0 .PP .PD exclude tmp/ .PD 0 .PP .PD # Includes only some directories .PD 0 .PP .PD include /movies/ .PD 0 .PP .PD include /musics/ .PD 0 .PP .PD include /pictures/ .PD 0 .PD .RE .PP On the command line, using the \-f option, you can only use \`include\` patterns. For example: .PP .RS 4 # Checks only the .mp3 files. .PD 0 .PP .PD # In Unix, use quotes to avoid globbing expansion by the shell. .PD 0 .PP .PD snapraid \-f \[dq]*.mp3\[dq] check .PD 0 .PD .RE .PP In Unix, when using globbing characters on the command line, you must quote them to prevent the shell from expanding them. .SH IGNORE FILE In addition to the global rules in the configuration file, you can place \`.snapraidignore\` files in any directory within the array to define decentralized exclusion rules. .PP Rules defined in \`.snapraidignore\` are applied after the rules in the configuration file. This means they have a higher priority and can be used to exclude files that were previously included by the global configuration. Effectively, if a local rule matches, the file is excluded regardless of the global include settings. .PP The pattern logic in \`.snapraidignore\` mirrors the global configuration but anchors patterns to the directory where the file is located: .TP .B FILE Selects any file named FILE in this directory or below. This follows the same globbing rules as the global pattern. .TP .B DIR/ Selects any directory named DIR and everything inside, residing in this directory or below. .TP .B /PATH/FILE Selects the exact specified file relative to the location of the \`.snapraidignore\` file. .TP .B /PATH/DIR/ Selects the exact specified directory and everything inside, relative to the location of the \`.snapraidignore\` file. .PP Unlike the global configuration, \`.snapraidignore\` files only support exclusion rules; you cannot use \`include\` patterns or negation (!). .PP For example, if you have a \`.snapraidignore\` in \`/mnt/disk1/projects/\`: .PP .RS 4 # Excludes ONLY /mnt/disk1/projects/output.bin .PD 0 .PP .PD /output.bin .PD 0 .PP .PD # Excludes any directory named \`build\` inside projects/ .PD 0 .PP .PD build/ .PD 0 .PP .PD # Excludes any .tmp file inside projects/ or its subfolders .PD 0 .PP .PD *.tmp .PD 0 .PD .RE .SH CONTENT SnapRAID stores the list and checksums of your files in the content file. .PP It is a binary file that lists all the files present in your disk array, along with all the checksums to verify their integrity. .PP This file is read and written by the \`sync\` and \`scrub\` commands and read by the \`fix\`, \`check\`, and \`status\` commands. .SH PARITY SnapRAID stores the parity information of your array in the parity files. .PP These are binary files containing the computed parity of all the blocks defined in the \`content\` file. .PP These files are read and written by the \`sync\` and \`fix\` commands and only read by the \`scrub\` and \`check\` commands. .SH ENCODING SnapRAID in Unix ignores any encoding. It reads and stores the file names with the same encoding used by the file system. .PP In Windows, all names read from the file system are converted and processed in UTF\-8 format. .PP To have file names printed correctly, you must set the Windows console to UTF\-8 mode with the command \`chcp 65001\` and use a TrueType font like \`Lucida Console\` as the console font. This affects only the printed file names; if you redirect the console output to a file, the resulting file is always in UTF\-8 format. .SH EXIT CODE SnapRAID terminates with the following error codes: .RS 0 .PD 0 .HP 4 .I 0 Everything OK. .HP 4 .I 1 The command encountered some errors. .HP 4 .I 2 The \`diff\` command found everything is OK, but a \`sync\` is needed. .PD .RE .SH COPYRIGHT This file is Copyright (C) 2026 Andrea Mazzoleni .SH SEE ALSO snapraid_log(1), snapraidd(1), rsync(1) snapraid-14.9/doc/snapraid.d000066400000000000000000001645751522717156100160140ustar00rootroot00000000000000Name{number} snapraid - SnapRAID Backup for Disk Arrays Synopsis :snapraid [-c, --conf CONFIG] : [-f, --filter PATTERN] [-d, --filter-disk NAME] : [-m, --filter-missing] [-e, --filter-error] : [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] : [-p, --plan PERC|bad|new|full] : [-o, --older-than DAYS] [-l, --log FILE] : [-s, --spin-down-on-error] [-w, --bw-limit RATE] : [-t, --tail] : [-Z, --force-zero] [-E, --force-empty] : [-U, --force-uuid] [-D, --force-device] : [-N, --force-nocopy] [-F, --force-full] : [-R, --force-realloc] [-W, --force-realloc-tail] : [-S, --start BLKSTART] [-B, --count BLKCOUNT] : [-L, --error-limit NUMBER] : [-A, --stats] : [-v, --verbose] [-q, --quiet] : status|smart|probe|up|down|diff|sync|scrub|fix|check : |list|dup|pool|devices|touch|rehash|locate :snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] Description SnapRAID is a backup program designed for disk arrays, storing parity information for data recovery in the event of up to six disk failures. Primarily intended for home media centers with large, infrequently changing files, SnapRAID offers several features: * You can utilize disks already filled with files without the need to reformat them, accessing them as usual. * All your data is hashed to ensure data integrity and prevent silent corruption. * When the number of failed disks exceeds the parity count, data loss is confined to the affected disks; data on other disks remains accessible. * If you accidentally delete files on a disk, recovery is possible. * Disks can have different sizes. * You can add disks at any time. * SnapRAID doesn't lock in your data; you can stop using it anytime without reformatting or moving data. * To access a file, only a single disk needs to spin, saving power and reducing noise. For more information, please visit the official SnapRAID site: :https://www.snapraid.it/ Limitations SnapRAID is a hybrid between a RAID and a backup program, aiming to combine the best benefits of both. However, it has some limitations that you should consider before using it. The main limitation is that if a disk fails and you haven't recently synced, you may not be able to fully recover. More specifically, you may be unable to recover up to the size of the changed or deleted files since the last sync operation. This occurs even if the changed or deleted files are not on the failed disk. This is why SnapRAID is better suited for data that rarely changes. On the other hand, newly added files don't prevent recovery of already existing files. You will only lose the recently added files if they are on the failed disk. Other SnapRAID limitations are: * With SnapRAID, you still have separate file systems for each disk. With RAID, you get a single large file system. * SnapRAID doesn't stripe data. With RAID, you get a speed boost with striping. * SnapRAID doesn't support real-time recovery. With RAID, you do not have to stop working when a disk fails. * SnapRAID can recover data only from a limited number of disk failures. With a backup, you can recover from a complete failure of the entire disk array. * Only file names, timestamps, symlinks, and hardlinks are saved. Permissions, ownership, and extended attributes are not saved. Getting Started To use SnapRAID, you need to first select one disk in your disk array to dedicate to `parity` information. With one disk for parity, you will be able to recover from a single disk failure, similar to RAID5. If you want to recover from more disk failures, similar to RAID6, you must reserve additional disks for parity. Each additional parity disk allows recovery from one more disk failure. As parity disks, you must pick the largest disks in the array, as the parity information may grow to the size of the largest data disk in the array. These disks will be dedicated to storing the `parity` files. You should not store your data on them. Then, you must define the `data` disks that you want to protect with SnapRAID. The protection is more effective if these disks contain data that rarely changes. For this reason, it's better to NOT include the Windows C:\ disk or the Unix /home, /var, and /tmp directories. The list of files is saved in the `content` files, usually stored on the data, parity, or boot disks. This file contains the details of your backup, including all the checksums to verify its integrity. The `content` file is stored in multiple copies, and each copy must be on a different disk to ensure that, even in case of multiple disk failures, at least one copy is available. For example, suppose you are interested in only one parity level of protection, and your disks are located at: :/mnt/diskp <- selected disk for parity :/mnt/disk1 <- first disk to protect :/mnt/disk2 <- second disk to protect :/mnt/disk3 <- third disk to protect You must create the configuration file /etc/snapraid.conf with the following options: :parity /mnt/diskp/snapraid.parity :content /var/snapraid/snapraid.content :content /mnt/disk1/snapraid.content :content /mnt/disk2/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ If you are on Windows, you should use the Windows path format, with drive letters and backslashes instead of slashes. :parity E:\snapraid.parity :content C:\snapraid\snapraid.content :content F:\array\snapraid.content :content G:\array\snapraid.content :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ If you have many disks and run out of drive letters, you can mount disks directly in subfolders. See: :https://www.google.com/search?q=Windows+mount+point At this point, you are ready to run the `sync` command to build the parity information. :snapraid sync This process may take several hours the first time, depending on the size of the data already present on the disks. If the disks are empty, the process is immediate. You can stop it at any time by pressing Ctrl+C, and at the next run, it will resume where it was interrupted. When this command completes, your data is SAFE. Now you can start using your array as you like and periodically update the parity information by running the `sync` command. Scrubbing To periodically check the data and parity for errors, you can run the `scrub` command. :snapraid scrub This command compares the data in your array with the hash computed during the `sync` command to verify integrity. Each run of the command checks approximately 8% of the array, excluding data already scrubbed in the previous 10 days. You can use the -p, --plan option to specify a different amount and the -o, --older-than option to specify a different age in days. For example, to check 5% of the array for blocks older than 20 days, use: :snapraid -p 5 -o 20 scrub If silent or input/output errors are found during the process, the corresponding blocks are marked as bad in the `content` file and listed in the `status` command. :snapraid status To fix them, you can use the `fix` command, filtering for bad blocks with the -e, --filter-error option: :snapraid -e fix At the next `scrub`, the errors will disappear from the `status` report if they are truly fixed. To make it faster, you can use -p bad to scrub only blocks marked as bad. :snapraid -p bad scrub Running `scrub` on an unsynced array may report errors caused by removed or modified files. These errors are reported in the `scrub` output, but the related blocks are not marked as bad. Pooling Note: The pooling feature described below has been superseded by the mergerfs tool, which is now the recommended option for Linux users in the SnapRAID community. Mergefs provides a more flexible and efficient way to pool multiple drives into a single unified mount point, allowing seamless access to files across your array without relying on symbolic links. It integrates well with SnapRAID for parity protection and is commonly used in setups like OpenMediaVault (OMV) or custom NAS configurations. To have all the files in your array shown in the same directory tree, you can enable the `pooling` feature. It creates a read-only virtual view of all the files in your array using symbolic links. You can configure the `pooling` directory in the configuration file with: :pool /pool or, if you are on Windows, with: :pool C:\pool and then run the `pool` command to create or update the virtual view. :snapraid pool If you are using a Unix platform and want to share this directory over the network to either Windows or Unix machines, you should add the following options to your /etc/samba/smb.conf: :# In the global section of smb.conf :unix extensions = no :# In the share section of smb.conf :[pool] :comment = Pool :path = /pool :read only = yes :guest ok = yes :wide links = yes :follow symlinks = yes In Windows, sharing symbolic links over a network requires clients to resolve them remotely. To enable this, besides sharing the pool directory, you must also share all the disks independently, using the disk names defined in the configuration file as share points. You must also specify in the `share` option of the configuration file the Windows UNC path that remote clients need to use to access these shared disks. For example, operating from a server named `darkstar`, you can use the options: :data d1 F:\array\ :data d2 G:\array\ :data d3 H:\array\ :pool C:\pool :share \\darkstar and share the following directories over the network: :\\darkstar\pool -> C:\pool :\\darkstar\d1 -> F:\array :\\darkstar\d2 -> G:\array :\\darkstar\d3 -> H:\array to allow remote clients to access all the files at \\darkstar\pool. You may also need to configure remote clients to enable access to remote symlinks with the command: :fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 Undeleting SnapRAID functions more like a backup program than a RAID system, and it can be used to restore or undelete files to their previous state using the -f, --filter option: :snapraid fix -f FILE or for a directory: :snapraid fix -f DIR/ You can also use it to recover only accidentally deleted files inside a directory using the -m, --filter-missing option, which restores only missing files, leaving all others untouched. :snapraid fix -m -f DIR/ Or to recover all the deleted files on all drives with: :snapraid fix -m Recovering The worst has happened, and you have lost one or more disks! DO NOT PANIC! You will be able to recover them! The first thing you must do is avoid further changes to your disk array. Disable any remote connections to it and any scheduled processes, including any scheduled SnapRAID nightly sync or scrub. Then proceed with the following steps. STEP 1 -> Reconfigure You need some space to recover, ideally on additional spare disks, but an external USB disk or remote disk will suffice. Modify the SnapRAID configuration file to make the `data` or `parity` option of the failed disk point to a location with enough empty space to recover the files. For example, if disk `d1` has failed, change from: :data d1 /mnt/disk1/ to: :data d1 /mnt/new_spare_disk/ If the disk to recover is a parity disk, update the appropriate `parity` option. If you have multiple failed disks, update all their configuration options. STEP 2 -> Fix Run the fix command, storing the log in an external file with: :snapraid -d NAME -l fix.log fix Where NAME is the name of the disk, such as `d1` in our previous example. If the disk to recover is a parity disk, use the names `parity`, `2-parity`, etc. If you have multiple failed disks, use multiple -d options to specify all of them. This command will take a long time. Ensure you have a few gigabytes free to store the fix.log file. Run it from a disk with sufficient free space. Now you have recovered all that is recoverable. If some files are partially or totally unrecoverable, they will be renamed by adding the `.unrecoverable` extension. You can find a detailed list of all unrecoverable blocks in the fix.log file by checking all lines starting with `unrecoverable:`. If you are not satisfied with the recovery, you can retry it as many times as you wish. For example, if you have removed files from the array after the last `sync`, this may result in some files not being recovered. In this case, you can retry the `fix` using the -i, --import option, specifying where these files are now to include them again in the recovery process. If you are satisfied with the recovery, you can proceed further, but note that after syncing, you cannot retry the `fix` command anymore! STEP 3 -> Check As a cautious check, you can now run a `check` command to ensure that everything is correct on the recovered disk. :snapraid -d NAME -a check Where NAME is the name of the disk, such as `d1` in our previous example. The -d and -a options tell SnapRAID to check only the specified disk and ignore all parity data. This command will take a long time, but if you are not overly cautious, you can skip it. STEP 4 -> Sync Run the `sync` command to resynchronize the array with the new disk. :snapraid sync If everything is recovered, this command is immediate. Commands SnapRAID provides a few simple commands that allow you to: * Print the status of the array -> `status` * Control the disks -> `smart`, `probe`, `up`, `down` * Make a backup/snapshot -> `sync` * Periodically check data -> `scrub` * Restore the last backup/snapshot -> `fix`. Commands must be written in lowercase. status Prints a summary of the state of the disk array. It includes information about parity fragmentation, how old the blocks are without checking, and all recorded silent errors encountered while scrubbing. The information presented refers to the latest time you ran `sync`. Later modifications are not taken into account. If bad blocks were detected, their block numbers are listed. To fix them, you can use the `fix -e` command. It also shows a graph representing the last time each block was scrubbed or synced. Scrubbed blocks are shown with `*`, blocks synced but not yet scrubbed with `o`. Nothing is modified. smart Prints a SMART report of all the disks in the system. It includes an estimation of the probability of failure in the next year, allowing you to plan maintenance replacements of disks that show suspicious attributes. This probability estimation is obtained by correlating the SMART attributes of the disks with the Backblaze data available at: :https://www.backblaze.com/hard-drive-test-data.html If SMART reports that a disk is failing, `FAIL` or `PREFAIL` is printed for that disk, and SnapRAID returns with an error. In this case, immediate replacement of the disk is highly recommended. Other possible status strings are: logfail - In the past, some attributes were lower than the threshold. logerr - The device error log contains errors. selferr - The device self-test log contains errors. If the -v, --verbose option is specified, a deeper statistical analysis is provided. This analysis can help you decide if you need more or less parity. This command uses the `smartctl` tool and is equivalent to running `smartctl -a` on all devices. If your devices are not auto-detected correctly, you can specify a custom command using the `smartctl` option in the configuration file. Nothing is modified. probe Prints the POWER state of all disks in the system. `Standby` means the disk is not spinning. `Active` means the disk is spinning. This command uses the `smartctl` tool and is equivalent to running `smartctl -n standby -i` on all devices. If your devices are not auto-detected correctly, you can specify a custom command using the `smartctl` option in the configuration file. Nothing is modified. up Spins up all the disks of the array. You can spin up only specific disks using the -d, --filter-disk option. Spinning up all the disks at the same time requires a lot of power. Ensure that your power supply can sustain it. Nothing is modified. down Spins down all the disks of the array. This command uses the `smartctl` tool and is equivalent to running `smartctl -s standby,now` on all devices. You can spin down only specific disks using the -d, --filter-disk option. To automatically spin down on error, you can use the -s, --spin-down-on-error option with any other command, which is equivalent to running `down` manually when an error occurs. Nothing is modified. diff Lists all the files modified since the last `sync` that need to have their parity data recomputed. This command doesn't check the file data, but only the file timestamp, size, and inode. After listing all changed files, a summary of the changes is presented, grouped by: equal - Files unchanged from before. added - Files added that were not present before. removed - Files removed. updated - Files with a different size or timestamp, meaning they were modified. moved - Files moved to a different directory on the same disk. They are identified by having the same name, size, timestamp, and inode, but a different directory. copied - Files copied on the same or a different disk where the original file still exists. They are identified by having the same name, size, and timestamp. If the sub-second timestamp is zero, the full path must match to be identified, not just the name. relocated - Files moved on the same or a different disk where the original has disappeared. They are identified by having the same name, size, and timestamp. If the sub-second timestamp is zero, the full path must match to be identified. Unlike 'moved' files on the same disk, relocated files have a different inode. restored - Files with a different inode but matching directory, name, size, and timestamp. These are usually files restored after being deleted. If a `sync` is required, the process return code is 2, instead of the default 0. The return code 1 is used for a generic error condition. Nothing is modified. sync Updates the parity information. All modified files in the disk array are read, and the corresponding parity data is updated. You can stop this process at any time by pressing Ctrl+C, without losing the work already done. At the next run, the `sync` process will resume where it was interrupted. If silent or input/output errors are found during the process, the corresponding blocks are marked as bad. Files are identified by path and/or inode and checked by size and timestamp. If the file size or timestamp differs, the parity data is recomputed for the entire file. If the file is moved or renamed on the same disk, keeping the same inode, the parity is not recomputed. If the file is moved to another disk, the parity is recomputed, but the previously computed hash information is retained. The `content` and `parity` files are modified if necessary. The files in the array are NOT modified. scrub Scrubs the array, checking for silent or input/output errors in data and parity disks. Each invocation checks approximately 8% of the array, excluding data already scrubbed in the last 10 days. This means that scrubbing once a week ensures every bit of data is checked at least once every three months. You can define a different scrub plan or amount using the -p, --plan option, which accepts: bad - Scrub blocks marked bad. new - Scrub just-synced blocks not yet scrubbed. full - Scrub everything. 0-100 - Scrub the specified percentage of blocks. If you specify a percentage amount, you can also use the -o, --older-than option to define how old the block should be. The oldest blocks are scrubbed first, ensuring an optimal check. If you want to scrub only the just-synced blocks not yet scrubbed, use the `-p new` option. To get details of the scrub status, use the `status` command. For any silent or input/output error found, the corresponding blocks are marked as bad in the `content` file. These bad blocks are listed in `status` and can be fixed with `fix -e`. After the fix, at the next scrub, they will be rechecked, and if found corrected, the bad mark will be removed. To scrub only the bad blocks, you can use the `scrub -p bad` command. It's recommended to run `scrub` only on a synced array to avoid reported errors caused by unsynced data. These errors are recognized as not being silent errors, and the blocks are not marked as bad, but such errors are reported in the output of the command. The `content` file is modified to update the time of the last check for each block and to mark bad blocks. The `parity` files are NOT modified. The files in the array are NOT modified. fix Fixes all the files and the parity data. All files and parity data are compared with the snapshot state saved in the last `sync`. If a difference is found, it is reverted to the stored snapshot. WARNING! The `fix` command does not differentiate between errors and intentional modifications. It unconditionally reverts the file state to the last `sync`. If no other option is specified, the entire array is processed. Use the filter options to select a subset of files or disks to operate on. To fix only the blocks marked bad during `sync` and `scrub`, use the -e, --filter-error option. Unlike other filter options, this one applies fixes only to files that are unchanged since the latest `sync`. SnapRAID renames all files that cannot be fixed by adding the `.unrecoverable` extension. Before fixing, the entire array is scanned to find any files moved since the last `sync` operation. These files are identified by their timestamp, ignoring their name and directory, and are used in the recovery process if necessary. If you moved some of them outside the array, you can use the -i, --import option to specify additional directories to scan. Files are identified only by path, not by inode. The `content` file is NOT modified. The `parity` files are modified if necessary. The files in the array are modified if necessary. check Verifies all the files and the parity data. It works like `fix`, but it only simulates a recovery and no changes are written to the array. This command is primarily intended for manual verification, such as after a recovery process or in other special conditions. For periodic and scheduled checks, use `scrub`. If you use the -a, --audit-only option, only the file data is checked, and the parity data is ignored for a faster run. Files are identified only by path, not by inode. Nothing is modified. list Lists all the files contained in the array at the time of the last `sync`. With -v or --verbose, the subsecond time is also shown. Nothing is modified. dup Lists all duplicate files. Two files are assumed equal if their hashes match. The file data is not read; only the precomputed hashes are used. Nothing is modified. pool Creates or updates a virtual view of all the files in your disk array in the `pooling` directory. The files are not copied but linked using symbolic links. When updating, all existing symbolic links and empty subdirectories are deleted and replaced with the new view of the array. Any other regular files are left in place. Nothing is modified outside the pool directory. devices Prints the low-level devices used by the array. This command displays the device associations in the array and is mainly intended as a script interface. The first two columns are the low-level device ID and path. The next two columns are the high-level device ID and path. The last column is the disk name in the array. In most cases, you have one low-level device for each disk in the array, but in some more complex configurations, you may have multiple low-level devices used by a single disk in the array. Nothing is modified. touch Sets an arbitrary sub-second timestamp for all files that have it set to zero. This improves SnapRAID's ability to recognize moved and copied files, as it makes the timestamp almost unique, reducing possible duplicates. More specifically, if the sub-second timestamp is not zero, a moved or copied file is identified as such if it matches the name, size, and timestamp. If the sub-second timestamp is zero, it is considered a copy only if the full path, size, and timestamp all match. The second-precision timestamp is not modified, so all the dates and times of your files will be preserved. rehash Schedules a rehash of the entire array. This command changes the hash kind used, typically when upgrading from a 32-bit system to a 64-bit one, to switch from MurmurHash3 to the faster SpookyHash. If you are already using the optimal hash, this command does nothing and informs you that no action is needed. The rehash is not performed immediately but takes place progressively during `sync` and `scrub`. You can check the rehash state using `status`. During the rehash, SnapRAID maintains full functionality, with the only exception that `dup` cannot detect duplicated files using a different hash. locate Locate files stored in the parity disks. For each matching file, it prints its location within the parity file and the number of fragments it occupies. You can use the -t, --tail option to restrict the operation to files occupying the specified tail portion of the parity. If you want to reallocate these files, you can then use the -W, --force-realloc-tail option. Be aware that such files will not be protected by parity during the reallocation process. Options SnapRAID provides the following options: -c, --conf CONFIG Selects the configuration file to use. If not specified, in Unix it uses the file `/usr/local/etc/snapraid.conf` if it exists, otherwise `/etc/snapraid.conf`. In Windows, it uses the file `snapraid.conf` in the same directory as `snapraid.exe`. -f, --filter PATTERN Filters the files to process in `check` and `fix`. Only the files matching the specified pattern are processed. This option can be used multiple times. See the PATTERN section for more details on pattern specifications. In Unix, ensure globbing characters are quoted if used. This option can be used only with `check` and `fix`. It cannot be used with `sync` and `scrub`, as they always process the entire array. -d, --filter-disk NAME Filters the disks to process in `check`, `fix`, `up`, and `down`. You must specify a disk name as defined in the configuration file. You can also specify parity disks with the names: `parity`, `2-parity`, `3-parity`, etc., to limit operations to a specific parity disk. If you combine multiple --filter, --filter-disk, and --filter-missing options, only files matching all the filters are selected. This option can be used multiple times. This option can be used only with `check`, `fix`, `up`, and `down`. It cannot be used with `sync` and `scrub`, as they always process the entire array. -m, --filter-missing Filters the files to process in `check` and `fix`. Only the files missing or deleted from the array are processed. When used with `fix`, this acts as an `undelete` command. If you combine multiple --filter, --filter-disk, and --filter-missing options, only files matching all the filters are selected. This option can be used only with `check` and `fix`. It cannot be used with `sync` and `scrub`, as they always process the entire array. -e, --filter-error Processes the files with errors in `check` and `fix`. It processes only files that have blocks marked with silent or input/output errors during `sync` and `scrub`, as listed in `status`. This option can be used only with `check` and `fix`. -p, --plan PERC|bad|new|full Selects the scrub plan. If PERC is a numeric value from 0 to 100, it is interpreted as the percentage of blocks to scrub. Instead of a percentage, you can specify a plan: `bad` scrubs bad blocks, `new` scrubs blocks not yet scrubbed, and `full` scrubs everything. This option can be used only with `scrub`. -o, --older-than DAYS Selects the oldest part of the array to process in `scrub`. DAYS is the minimum age in days for a block to be scrubbed; the default is 10. Blocks marked as bad are always scrubbed regardless of this option. This option can be used only with `scrub`. -a, --audit-only In `check`, verifies the hash of the files without checking the parity data. If you are interested only in checking the file data, this option can significantly speed up the checking process. This option can be used only with `check`. -h, --pre-hash In `sync`, runs a preliminary hashing phase of all new data for additional verification before the parity computation. Usually, in `sync`, no preliminary hashing is done, and the new data is hashed just before the parity computation when it is read for the first time. This process occurs when the system is under heavy load, with all disks spinning and a busy CPU. This is an extreme condition for the machine, and if it has a latent hardware problem, silent errors may go undetected because the data is not yet hashed. To avoid this risk, you can enable the `pre-hash` mode to have all the data read twice to ensure its integrity. This option also verifies files moved within the array to ensure the move operation was successful and, if necessary, allows you to run a fix operation before proceeding. This option can be used only with `sync`. -i, --import DIR Imports from the specified directory any files deleted from the array after the last `sync`. If you still have such files, they can be used by `check` and `fix` to improve the recovery process. The files are read, including in subdirectories, and are identified regardless of their name. This option can be used only with `check` and `fix`. -s, --spin-down-on-error On any error, spins down all managed disks before exiting with a non-zero status code. This prevents the drives from remaining active and spinning after an aborted operation, helping to avoid unnecessary heat buildup and power consumption. Use this option to ensure disks are safely stopped even when a command fails. -w, --bw-limit RATE Applies a global bandwidth limit for all disks. The RATE is the number of bytes per second. You can specify a multiplier such as K, M, G, or T (e.g., --bw-limit 1G). -t, --tail SIZE Limit file listing to those using no more than the specified tail size of the parity disks. You can use multipliers such as K, M, G, or T (e.g. --tail 1G). This option is only valid when used together with the `locate` command. -A, --stats Enables an extended status view that shows additional information. The screen displays two graphs: The first graph shows the number of buffered stripes for each disk, along with the file path of the file currently being accessed on that disk. Typically, the slowest disk will have no buffer available, which determines the maximum achievable bandwidth. The second graph shows the percentage of time spent waiting over the past 100 seconds. The slowest disk is expected to cause most of the wait time, while other disks should have little or no wait time because they can use their buffered stripes. This graph also shows the time spent waiting for hash calculations and RAID computations. All computations run in parallel with disk operations. Therefore, as long as there is measurable wait time for at least one disk, it indicates that the CPU is fast enough to keep up with the workload. -Z, --force-zero Forces the insecure operation of syncing a file with zero size that was previously non-zero. If SnapRAID detects such a condition, it stops proceeding unless you specify this option. This allows you to easily detect when, after a system crash, some accessed files were truncated. This is a possible condition in Linux with the ext3/ext4 file systems. This option can be used only with `sync`. -E, --force-empty Forces the insecure operation of syncing a disk with all the original files missing. If SnapRAID detects that all the files originally present on the disk are missing or rewritten, it stops proceeding unless you specify this option. This allows you to easily detect when a data file system is not mounted. This option can be used only with `sync`. -U, --force-uuid Forces the insecure operation of syncing, checking, and fixing with disks that have changed their UUID. If SnapRAID detects that some disks have changed UUID, it stops proceeding unless you specify this option. This allows you to detect when your disks are mounted at the wrong mount points. It is, however, allowed to have a single UUID change with single parity, and more with multiple parity, because this is the normal case when replacing disks after a recovery. This option can be used only with `sync`, `check`, or `fix`. -D, --force-device Forces the insecure operation of fixing with inaccessible disks or with disks on the same physical device. For example, if you lost two data disks and have a spare disk to recover only the first one, you can ignore the second inaccessible disk. Or, if you want to recover a disk in the free space left on an already used disk, sharing the same physical device. This option can be used only with `fix`. -N, --force-nocopy In `sync`, `check`, and `fix`, disables the copy detection heuristic. Without this option, SnapRAID assumes that files with the same attributes, such as name, size, and timestamp, are copies with the same data. This allows identification of copied or moved files from one disk to another and reuses the already computed hash information to detect silent errors or to recover missing files. In some rare cases, this behavior may result in false positives or a slow process due to many hash verifications, and this option allows you to resolve such issues. This option can be used only with `sync`, `check`, and `fix`. -F, --force-full In `sync`, forces a full recomputation of the parity. This option can be used when you add a new parity level or if you reverted to an old content file using more recent parity data. Instead of recreating the parity from scratch, this allows you to reuse the hashes present in the content file to validate data and maintain data protection during the `sync` process using the existing parity data. This option can be used only with `sync`. -R, --force-realloc In `sync`, forces a full reallocation of files and rebuild of the parity. This option can be used to completely reallocate all files, removing fragmentation, while reusing the hashes present in the content file to validate data. This option can be used only with `sync`. WARNING! This option is for experts only, and it is highly recommended not to use it. You DO NOT have data protection during the `sync` operation. -W, --force-realloc-tail SIZE Works like -R, --force-realloc, but limited to the specified tail portion (last SIZE bytes) of each parity file. It forces reallocation (movement) of any file fragments/blocks currently stored in that tail section, allowing them to be placed anywhere in the parity file(s) where free space is available (including existing holes). The main purpose of this option is to shrink the on-disk size of the parity file. If the reallocation successfully clears the entire tail section (no blocks remain using it), the parity file is truncated, reclaiming the unused tail space. You can use multipliers such as K, M, G, or T (e.g. --force-realloc-tail 1G). You can use locate -t, --tail to know in advance the affected files. WARNING! This option is for experts only, and it is highly recommended not to use it. You DO NOT have data protection during the `sync` operation for the affected files. -l, --log FILE Writes a detailed log to the specified file. If this option is not specified, unexpected errors are printed to the screen, potentially resulting in excessive output in case of many errors. When -l, --log is specified, only fatal errors that cause SnapRAID to stop are printed to the screen. If the path starts with `>>`, the file is opened in append mode. Occurrences of `%D` and `%T` in the name are replaced with the date and time in the format YYYYMMDD and HHMMSS. In Windows batch files, you must double the `%` character, e.g., result-%%D.log. To use `>>`, you must enclose the name in quotes, e.g., `">>result.log"`. To output the log to standard output or standard error, you can use `">&1"` and `">&2"`, respectively. See the snapraid_log.txt file or man page for log tag descriptions. -L, --error-limit NUMBER Sets a new error limit before stopping execution. By default, SnapRAID stops if it encounters more than 100 input/output errors, indicating that a disk is likely failing. This option affects `sync` and `scrub`, which are allowed to continue after the first set of disk errors to try to complete their operations. However, `check` and `fix` always stop at the first error. -S, --start BLKSTART Starts processing from the specified block number. This can be useful for retrying to check or fix specific blocks in case of a damaged disk. This option is mainly for advanced manual recovery. -B, --count BLKCOUNT Processes only the specified number of blocks. This option is mainly for advanced manual recovery. -C, --gen-conf CONTENT Generates a dummy configuration file from an existing content file. The configuration file is written to standard output and does not overwrite an existing one. This configuration file also contains the information needed to reconstruct the disk mount points in case you lose the entire system. -v, --verbose Prints more information to the screen. If specified once, it prints excluded files and additional statistics. This option has no effect on the log files. -q, --quiet Prints less information to the screen. If specified once, it removes the progress bar; twice, the running operations; three times, the info messages; four times, the status messages. Fatal errors are always printed to the screen. This option has no effect on the log files. -H, --help Prints a short help screen. -V, --version Prints the program version. Configuration SnapRAID requires a configuration file to know where your disk array is located and where to store the parity information. In Unix, it uses the file `/usr/local/etc/snapraid.conf` if it exists, otherwise `/etc/snapraid.conf`. In Windows, it uses the file `snapraid.conf` in the same directory as `snapraid.exe`. It must contain the following options (case-sensitive): parity FILE [,FILE] ... Defines the files to use to store the parity information. The parity enables protection from a single disk failure, similar to RAID5. You can specify multiple files, which must be on different disks. When a file cannot grow anymore, the next one is used. The total space available must be at least as large as the largest data disk in the array. You can add additional parity files later, but you cannot reorder or remove them. Keeping the parity disks reserved for parity ensures that they do not become fragmented, improving performance. In Windows, 256 MB is left unused on each disk to avoid the warning about full disks. This option is mandatory and can be used only once. (2,3,4,5,6)-parity FILE [,FILE] ... Defines the files to use to store extra parity information. For each parity level specified, one additional level of protection is enabled: * 2-parity enables RAID6 dual parity. * 3-parity enables triple parity. * 4-parity enables quad (four) parity. * 5-parity enables penta (five) parity. * 6-parity enables hexa (six) parity. Each parity level requires the presence of all previous parity levels. The same considerations as for the `parity` option apply. These options are optional and can be used only once. z-parity FILE [,FILE] ... Defines an alternate file and format to store triple parity. This option is an alternative to `3-parity`, primarily intended for low-end CPUs like ARM or AMD Phenom, Athlon, and Opteron that do not support the SSSE3 instruction set. In such cases, it provides better performance. This format is similar to but faster than the one used by ZFS RAIDZ3. Like ZFS, it does not work beyond triple parity. When using `3-parity`, you will be warned if it is recommended to use the `z-parity` format for performance improvement. It is possible to convert from one format to another by adjusting the configuration file with the desired z-parity or 3-parity file and using `fix` to recreate it. content FILE Defines the file to use to store the list and checksums of all the files present in your disk array. It can be placed on a disk used for data, parity, or any other disk available. If you use a data disk, this file is automatically excluded from the `sync` process. This option is mandatory and can be used multiple times to save multiple copies of the same file. You must store at least one copy for each parity disk used plus one. Using additional copies does not hurt. data NAME DIR Defines the name and mount point of the data disks in the array. NAME is used to identify the disk and must be unique. DIR is the mount point of the disk in the file system. You can change the mount point as needed, as long as you keep the NAME fixed. You should use one option for each data disk in the array. You can rename a disk later by changing the NAME directly in the configuration file and then running a `sync` command. In the case of renaming, the association is done using the stored UUID of the disks. extra NAME DIR Defines the name and mount point of additional disks to monitor with the `smart` and `probe` commands. This is useful for monitoring disks that are not part of the array but are required for the system to function, such as the boot disk. Note that such disks are not affected by the `up` and `down` commands because they are expected to be always spinning. nohidden Excludes all hidden files and directories. In Unix, hidden files are those starting with `.`. In Windows, they are those with the hidden attribute. exclude/include PATTERN Defines the file or directory patterns to exclude or include in the sync process. All patterns are processed in the specified order. If the first pattern that matches is an `exclude` one, the file is excluded. If it is an `include` one, the file is included. If no pattern matches, the file is excluded if the last pattern specified is an `include`, or included if the last pattern specified is an `exclude`. See the PATTERN section for more details on pattern specifications. This option can be used multiple times. blocksize SIZE_IN_KIBIBYTES Defines the basic block size in kibibytes for the parity. One kibibyte is 1024 bytes. The default blocksize is 256, which should work for most cases. WARNING! This option is for experts only, and it is highly recommended not to change this value. To change this value in the future, you will need to recreate the entire parity! A reason to use a different blocksize is if you have many small files, on the order of millions. For each file, even if only a few bytes, an entire block of parity is allocated, and with many files, this may result in significant unused parity space. When you completely fill the parity disk, you are not allowed to add more files to the data disks. However, the wasted parity does not accumulate across data disks. Wasted space resulting from a high number of files on a data disk limits only the amount of data on that data disk, not others. As an approximation, you can assume that half of the block size is wasted for each file. For example, with 100,000 files and a 256 KiB block size, you will waste 12.8 GB of parity, which may result in 12.8 GB less space available on the data disk. You can check the amount of wasted space on each disk using `status`. This is the amount of space you must leave free on the data disks or use for files not included in the array. If this value is negative, it means you are close to filling the parity, and it represents the space you can still waste. To avoid this issue, you can use a larger partition for parity. For example, if the parity partition is 12.8 GB larger than the data disks, you have enough extra space to handle up to 100,000 files on each data disk without any wasted space. A trick to get a larger parity partition in Linux is to format it with the command: :mkfs.ext4 -m 0 -T largefile4 DEVICE This results in about 1.5% extra space, approximately 60 GB for a 4 TB disk, which allows about 460,000 files on each data disk without any wasted space. hashsize SIZE_IN_BYTES Defines the hash size in bytes for the saved blocks. The default hashsize is 16 bytes (128 bits), which should work for most cases. WARNING! This option is for experts only, and it is highly recommended not to change this value. To change this value in the future, you will need to recreate the entire parity! A reason to use a different hashsize is if your system has limited memory. As a rule of thumb, SnapRAID typically requires 1 GiB of RAM for each 16 TB of data in the array. Specifically, to store the hashes of the data, SnapRAID requires approximately TS*(1+HS)/BS bytes of RAM, where TS is the total size in bytes of your disk array, BS is the block size in bytes, and HS is the hash size in bytes. For example, with 8 disks of 4 TB, a block size of 256 KiB (1 KiB = 1024 bytes), and a hash size of 16, you get: :RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Switching to a hash size of 8, you get: :RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Switching to a block size of 512, you get: :RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Switching to both a hash size of 8 and a block size of 512, you get: :RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB autosave SIZE_IN_GIGABYTES Automatically saves the state when syncing or scrubbing after the specified amount of GB processed. This option is useful to avoid restarting long `sync` commands from scratch if interrupted by a machine crash or any other event. temp_limit TEMPERATURE_CELSIUS Sets the maximum allowed disk temperature in Celsius. When specified, SnapRAID periodically checks the temperature of all disks using the smartctl tool. The current disk temperatures are displayed while SnapRAID is operating. If any disk exceeds this limit, all operations stop, and the disks are spun down (put into standby) for the duration defined by the `temp_sleep` option. After the sleep period, operations resume, potentially pausing again if the temperature limit is reached once more. During operation, SnapRAID also analyzes the heating curve of each disk and estimates the long-term steady temperature they are expected to reach if activity continues. The estimation is performed only after the disk temperature has increased four times, ensuring that enough data points are available to establish a reliable trend. This predicted steady temperature is shown in parentheses next to the current value and helps assess whether the system's cooling is adequate. This estimated temperature is for informational purposes only and has no effect on the behavior of SnapRAID. The program's actions are based solely on the actual measured disk temperatures. To perform this analysis, SnapRAID needs a reference for the system temperature. It first attempts to read it from available hardware sensors. If no system sensor can be accessed, it uses the lowest disk temperature measured at the start of the run as a fallback reference. Normally, SnapRAID shows only the temperature of the hottest disk. To display the temperature of all disks, use the -A or --stats option. temp_sleep TIME_IN_MINUTES Sets the standby time, in minutes, when the temperature limit is reached. During this period, the disks remain spun down. The default is 5 minutes. pool DIR Defines the pooling directory where the virtual view of the disk array is created using the `pool` command. The directory must already exist. share UNC_DIR Defines the Windows UNC path required to access the disks remotely. If this option is specified, the symbolic links created in the pool directory use this UNC path to access the disks. Without this option, the symbolic links generated use only local paths, which does not allow sharing the pool directory over the network. The symbolic links are formed using the specified UNC path, adding the disk name as specified in the `data` option, and finally adding the file directory and name. This option is required only for Windows. smartctl DISK/PARITY OPTIONS... Defines custom smartctl options to obtain the SMART attributes for each disk. This may be required for RAID controllers and some USB disks that cannot be auto-detected. The %s placeholder is replaced by the device name, but it is optional for fixed devices like RAID controllers. DISK is the same disk name specified in the `data` option. PARITY is one of the parity names: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, or `z-parity`. In the specified OPTIONS, the `%s` string is replaced by the device name. For RAID controllers, the device is likely fixed, and you may not need to use `%s`. Refer to the smartmontools documentation for possible options: :https://www.smartmontools.org/wiki/Supported_RAID-Controllers :https://www.smartmontools.org/wiki/Supported_USB-Devices For example: :smartctl parity -d sat %s smartignore DISK/PARITY ATTR [ATTR...] Ignores the specified SMART attribute when computing the probability of disk failure. This option is useful if a disk reports unusual or misleading values for a particular attribute. DISK is the same disk name specified in the `data` option. PARITY is one of the parity names: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, or `z-parity`. The special value * can be used to ignore the attribute on all disks. For example, to ignore the `Current Pending Sector Count` attribute on all disks: :smartignore * 197 To ignore it only on the first parity disk: :smartignore parity 197 Examples An example of a typical configuration for Unix is: :parity /mnt/diskp/snapraid.parity :content /mnt/diskp/snapraid.content :content /var/snapraid/snapraid.content :data d1 /mnt/disk1/ :data d2 /mnt/disk2/ :data d3 /mnt/disk3/ :exclude /lost+found/ :exclude /tmp/ :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/sg0 :smartctl 2-parity -d areca,2/1 /dev/sg0 An example of a typical configuration for Windows is: :parity E:\snapraid.parity :content E:\snapraid.content :content C:\snapraid\snapraid.content :data d1 G:\array\ :data d2 H:\array\ :data d3 I:\array\ :exclude Thumbs.db :exclude \$RECYCLE.BIN :exclude \System Volume Information :smartctl d1 -d sat %s :smartctl d2 -d usbjmicron %s :smartctl parity -d areca,1/1 /dev/arcmsr0 :smartctl 2-parity -d areca,2/1 /dev/arcmsr0 Pattern Patterns are used to select a subset of files to exclude or include in the process. Globbing characters can be used to match files and paths in a flexible way. The question mark `?` matches any single character except the directory separator. This makes it useful for matching filenames with variable characters while keeping the pattern confined to a single directory level. The single star `*` matches any sequence of characters, but like the question mark, it never crosses directory boundaries. It stops at the forward slash, making it suitable for matching within a single path component. This is the standard wildcard behavior familiar from shell globbing. The double star `**` is more powerful, it matches any sequence of characters including directory separators. This allows patterns to match across multiple directory levels. When `**` appears embedded directly in a pattern, it can match zero or more characters including slashes between the surrounding literal text. The most important use of `**` is in the special form `/**/`. This matches zero or more complete directory levels, making it possible to match files at any depth in a directory tree without knowing the exact path structure. For example, the pattern `src/**/main.js` matches `src/main.js` (skipping zero directories), `src/ui/main.js` (skipping one directory), and `src/ui/components/main.js` (skipping two directories). Character classes using square brackets match a single character from a specified set or range. Like the other single character patterns, they do not match directory separators. Classes support ranges and negation using an exclamation mark. The fundamental distinction to remember is that `*`, `?`, and character classes all respect directory boundaries and only match within a single path component, while `**` is the only pattern that can match across directory separators. There are four different types of patterns: =FILE Selects any file named FILE. This pattern applies only to files, not directories. =DIR/ Selects any directory named DIR and everything inside. This pattern applies only to directories, not files. =/PATH/FILE Selects the exact specified file path. This pattern applies only to files, not directories. =/PATH/DIR/ Selects the exact specified directory path and everything inside. This pattern applies only to directories, not files. When you specify an absolute path starting with /, it is applied at the array root directory, not the local file system root directory. In Windows, you can use the backslash \ instead of the forward slash /. Windows system directories, junctions, mount points, and other Windows special directories are treated as files, meaning that to exclude them, you must use a file rule, not a directory one. If the file name contains a `*`, `?`, `[`, or `]` character, you must escape it to avoid having it interpreted as a globbing character. In Unix, the escape character is `\`; in Windows, it is `^`. When the pattern is on the command line, you must double the escape character to avoid having it interpreted by the command shell. In the configuration file, you can use different strategies to filter the files to process. The simplest approach is to use only `exclude` rules to remove all the files and directories you do not want to process. For example: :# Excludes any file named `*.unrecoverable` :exclude *.unrecoverable :# Excludes the root directory `/lost+found` :exclude /lost+found/ :# Excludes any subdirectory named `tmp` :exclude tmp/ The opposite approach is to define only the files you want to process, using only `include` rules. For example: :# Includes only some directories :include /movies/ :include /musics/ :include /pictures/ The final approach is to mix `exclude` and `include` rules. In this case, the order of rules is important. Earlier rules take precedence over later ones. To simplify, you can list all the `exclude` rules first and then all the `include` rules. For example: :# Excludes any file named `*.unrecoverable` :exclude *.unrecoverable :# Excludes any subdirectory named `tmp` :exclude tmp/ :# Includes only some directories :include /movies/ :include /musics/ :include /pictures/ On the command line, using the -f option, you can only use `include` patterns. For example: :# Checks only the .mp3 files. :# In Unix, use quotes to avoid globbing expansion by the shell. :snapraid -f "*.mp3" check In Unix, when using globbing characters on the command line, you must quote them to prevent the shell from expanding them. Ignore File In addition to the global rules in the configuration file, you can place `.snapraidignore` files in any directory within the array to define decentralized exclusion rules. Rules defined in `.snapraidignore` are applied after the rules in the configuration file. This means they have a higher priority and can be used to exclude files that were previously included by the global configuration. Effectively, if a local rule matches, the file is excluded regardless of the global include settings. The pattern logic in `.snapraidignore` mirrors the global configuration but anchors patterns to the directory where the file is located: =FILE Selects any file named FILE in this directory or below. This follows the same globbing rules as the global pattern. =DIR/ Selects any directory named DIR and everything inside, residing in this directory or below. =/PATH/FILE Selects the exact specified file relative to the location of the `.snapraidignore` file. =/PATH/DIR/ Selects the exact specified directory and everything inside, relative to the location of the `.snapraidignore` file. Unlike the global configuration, `.snapraidignore` files only support exclusion rules; you cannot use `include` patterns or negation (!). For example, if you have a `.snapraidignore` in `/mnt/disk1/projects/`: :# Excludes ONLY /mnt/disk1/projects/output.bin :/output.bin :# Excludes any directory named `build` inside projects/ :build/ :# Excludes any .tmp file inside projects/ or its subfolders :*.tmp Content SnapRAID stores the list and checksums of your files in the content file. It is a binary file that lists all the files present in your disk array, along with all the checksums to verify their integrity. This file is read and written by the `sync` and `scrub` commands and read by the `fix`, `check`, and `status` commands. Parity SnapRAID stores the parity information of your array in the parity files. These are binary files containing the computed parity of all the blocks defined in the `content` file. These files are read and written by the `sync` and `fix` commands and only read by the `scrub` and `check` commands. Encoding SnapRAID in Unix ignores any encoding. It reads and stores the file names with the same encoding used by the file system. In Windows, all names read from the file system are converted and processed in UTF-8 format. To have file names printed correctly, you must set the Windows console to UTF-8 mode with the command `chcp 65001` and use a TrueType font like `Lucida Console` as the console font. This affects only the printed file names; if you redirect the console output to a file, the resulting file is always in UTF-8 format. Exit Code SnapRAID terminates with the following error codes: 0 - Everything OK. 1 - The command encountered some errors. 2 - The `diff` command found everything is OK, but a `sync` is needed. Copyright This file is Copyright (C) 2026 Andrea Mazzoleni See Also snapraid_log(1), snapraidd(1), rsync(1) snapraid-14.9/doc/snapraid.txt000066400000000000000000001744531522717156100164040ustar00rootroot00000000000000 =============================== SnapRAID Backup for Disk Arrays =============================== 1 SYNOPSIS ========== snapraid [-c, --conf CONFIG] [-f, --filter PATTERN] [-d, --filter-disk NAME] [-m, --filter-missing] [-e, --filter-error] [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR] [-p, --plan PERC|bad|new|full] [-o, --older-than DAYS] [-l, --log FILE] [-s, --spin-down-on-error] [-w, --bw-limit RATE] [-t, --tail] [-Z, --force-zero] [-E, --force-empty] [-U, --force-uuid] [-D, --force-device] [-N, --force-nocopy] [-F, --force-full] [-R, --force-realloc] [-W, --force-realloc-tail] [-S, --start BLKSTART] [-B, --count BLKCOUNT] [-L, --error-limit NUMBER] [-A, --stats] [-v, --verbose] [-q, --quiet] status|smart|probe|up|down|diff|sync|scrub|fix|check |list|dup|pool|devices|touch|rehash|locate snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT] 2 DESCRIPTION ============= SnapRAID is a backup program designed for disk arrays, storing parity information for data recovery in the event of up to six disk failures. Primarily intended for home media centers with large, infrequently changing files, SnapRAID offers several features: * You can utilize disks already filled with files without the need to reformat them, accessing them as usual. * All your data is hashed to ensure data integrity and prevent silent corruption. * When the number of failed disks exceeds the parity count, data loss is confined to the affected disks; data on other disks remains accessible. * If you accidentally delete files on a disk, recovery is possible. * Disks can have different sizes. * You can add disks at any time. * SnapRAID doesn't lock in your data; you can stop using it anytime without reformatting or moving data. * To access a file, only a single disk needs to spin, saving power and reducing noise. For more information, please visit the official SnapRAID site: https://www.snapraid.it/ 3 LIMITATIONS ============= SnapRAID is a hybrid between a RAID and a backup program, aiming to combine the best benefits of both. However, it has some limitations that you should consider before using it. The main limitation is that if a disk fails and you haven't recently synced, you may not be able to fully recover. More specifically, you may be unable to recover up to the size of the changed or deleted files since the last sync operation. This occurs even if the changed or deleted files are not on the failed disk. This is why SnapRAID is better suited for data that rarely changes. On the other hand, newly added files don't prevent recovery of already existing files. You will only lose the recently added files if they are on the failed disk. Other SnapRAID limitations are: * With SnapRAID, you still have separate file systems for each disk. With RAID, you get a single large file system. * SnapRAID doesn't stripe data. With RAID, you get a speed boost with striping. * SnapRAID doesn't support real-time recovery. With RAID, you do not have to stop working when a disk fails. * SnapRAID can recover data only from a limited number of disk failures. With a backup, you can recover from a complete failure of the entire disk array. * Only file names, timestamps, symlinks, and hardlinks are saved. Permissions, ownership, and extended attributes are not saved. 4 GETTING STARTED ================= To use SnapRAID, you need to first select one disk in your disk array to dedicate to `parity` information. With one disk for parity, you will be able to recover from a single disk failure, similar to RAID5. If you want to recover from more disk failures, similar to RAID6, you must reserve additional disks for parity. Each additional parity disk allows recovery from one more disk failure. As parity disks, you must pick the largest disks in the array, as the parity information may grow to the size of the largest data disk in the array. These disks will be dedicated to storing the `parity` files. You should not store your data on them. Then, you must define the `data` disks that you want to protect with SnapRAID. The protection is more effective if these disks contain data that rarely changes. For this reason, it's better to NOT include the Windows C:\ disk or the Unix /home, /var, and /tmp directories. The list of files is saved in the `content` files, usually stored on the data, parity, or boot disks. This file contains the details of your backup, including all the checksums to verify its integrity. The `content` file is stored in multiple copies, and each copy must be on a different disk to ensure that, even in case of multiple disk failures, at least one copy is available. For example, suppose you are interested in only one parity level of protection, and your disks are located at: /mnt/diskp <- selected disk for parity /mnt/disk1 <- first disk to protect /mnt/disk2 <- second disk to protect /mnt/disk3 <- third disk to protect You must create the configuration file /etc/snapraid.conf with the following options: parity /mnt/diskp/snapraid.parity content /var/snapraid/snapraid.content content /mnt/disk1/snapraid.content content /mnt/disk2/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ If you are on Windows, you should use the Windows path format, with drive letters and backslashes instead of slashes. parity E:\snapraid.parity content C:\snapraid\snapraid.content content F:\array\snapraid.content content G:\array\snapraid.content data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ If you have many disks and run out of drive letters, you can mount disks directly in subfolders. See: https://www.google.com/search?q=Windows+mount+point At this point, you are ready to run the `sync` command to build the parity information. snapraid sync This process may take several hours the first time, depending on the size of the data already present on the disks. If the disks are empty, the process is immediate. You can stop it at any time by pressing Ctrl+C, and at the next run, it will resume where it was interrupted. When this command completes, your data is SAFE. Now you can start using your array as you like and periodically update the parity information by running the `sync` command. 4.1 Scrubbing ------------- To periodically check the data and parity for errors, you can run the `scrub` command. snapraid scrub This command compares the data in your array with the hash computed during the `sync` command to verify integrity. Each run of the command checks approximately 8% of the array, excluding data already scrubbed in the previous 10 days. You can use the -p, --plan option to specify a different amount and the -o, --older-than option to specify a different age in days. For example, to check 5% of the array for blocks older than 20 days, use: snapraid -p 5 -o 20 scrub If silent or input/output errors are found during the process, the corresponding blocks are marked as bad in the `content` file and listed in the `status` command. snapraid status To fix them, you can use the `fix` command, filtering for bad blocks with the -e, --filter-error option: snapraid -e fix At the next `scrub`, the errors will disappear from the `status` report if they are truly fixed. To make it faster, you can use -p bad to scrub only blocks marked as bad. snapraid -p bad scrub Running `scrub` on an unsynced array may report errors caused by removed or modified files. These errors are reported in the `scrub` output, but the related blocks are not marked as bad. 4.2 Pooling ----------- Note: The pooling feature described below has been superseded by the mergerfs tool, which is now the recommended option for Linux users in the SnapRAID community. Mergefs provides a more flexible and efficient way to pool multiple drives into a single unified mount point, allowing seamless access to files across your array without relying on symbolic links. It integrates well with SnapRAID for parity protection and is commonly used in setups like OpenMediaVault (OMV) or custom NAS configurations. To have all the files in your array shown in the same directory tree, you can enable the `pooling` feature. It creates a read-only virtual view of all the files in your array using symbolic links. You can configure the `pooling` directory in the configuration file with: pool /pool or, if you are on Windows, with: pool C:\pool and then run the `pool` command to create or update the virtual view. snapraid pool If you are using a Unix platform and want to share this directory over the network to either Windows or Unix machines, you should add the following options to your /etc/samba/smb.conf: # In the global section of smb.conf unix extensions = no # In the share section of smb.conf [pool] comment = Pool path = /pool read only = yes guest ok = yes wide links = yes follow symlinks = yes In Windows, sharing symbolic links over a network requires clients to resolve them remotely. To enable this, besides sharing the pool directory, you must also share all the disks independently, using the disk names defined in the configuration file as share points. You must also specify in the `share` option of the configuration file the Windows UNC path that remote clients need to use to access these shared disks. For example, operating from a server named `darkstar`, you can use the options: data d1 F:\array\ data d2 G:\array\ data d3 H:\array\ pool C:\pool share \\darkstar and share the following directories over the network: \\darkstar\pool -> C:\pool \\darkstar\d1 -> F:\array \\darkstar\d2 -> G:\array \\darkstar\d3 -> H:\array to allow remote clients to access all the files at \\darkstar\pool. You may also need to configure remote clients to enable access to remote symlinks with the command: fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1 4.3 Undeleting -------------- SnapRAID functions more like a backup program than a RAID system, and it can be used to restore or undelete files to their previous state using the -f, --filter option: snapraid fix -f FILE or for a directory: snapraid fix -f DIR/ You can also use it to recover only accidentally deleted files inside a directory using the -m, --filter-missing option, which restores only missing files, leaving all others untouched. snapraid fix -m -f DIR/ Or to recover all the deleted files on all drives with: snapraid fix -m 4.4 Recovering -------------- The worst has happened, and you have lost one or more disks! DO NOT PANIC! You will be able to recover them! The first thing you must do is avoid further changes to your disk array. Disable any remote connections to it and any scheduled processes, including any scheduled SnapRAID nightly sync or scrub. Then proceed with the following steps. ---- 4.4.1 STEP 1 -> Reconfigure ---- You need some space to recover, ideally on additional spare disks, but an external USB disk or remote disk will suffice. Modify the SnapRAID configuration file to make the `data` or `parity` option of the failed disk point to a location with enough empty space to recover the files. For example, if disk `d1` has failed, change from: data d1 /mnt/disk1/ to: data d1 /mnt/new_spare_disk/ If the disk to recover is a parity disk, update the appropriate `parity` option. If you have multiple failed disks, update all their configuration options. ---- 4.4.2 STEP 2 -> Fix ---- Run the fix command, storing the log in an external file with: snapraid -d NAME -l fix.log fix Where NAME is the name of the disk, such as `d1` in our previous example. If the disk to recover is a parity disk, use the names `parity`, `2-parity`, etc. If you have multiple failed disks, use multiple -d options to specify all of them. This command will take a long time. Ensure you have a few gigabytes free to store the fix.log file. Run it from a disk with sufficient free space. Now you have recovered all that is recoverable. If some files are partially or totally unrecoverable, they will be renamed by adding the `.unrecoverable` extension. You can find a detailed list of all unrecoverable blocks in the fix.log file by checking all lines starting with `unrecoverable:`. If you are not satisfied with the recovery, you can retry it as many times as you wish. For example, if you have removed files from the array after the last `sync`, this may result in some files not being recovered. In this case, you can retry the `fix` using the -i, --import option, specifying where these files are now to include them again in the recovery process. If you are satisfied with the recovery, you can proceed further, but note that after syncing, you cannot retry the `fix` command anymore! ---- 4.4.3 STEP 3 -> Check ---- As a cautious check, you can now run a `check` command to ensure that everything is correct on the recovered disk. snapraid -d NAME -a check Where NAME is the name of the disk, such as `d1` in our previous example. The -d and -a options tell SnapRAID to check only the specified disk and ignore all parity data. This command will take a long time, but if you are not overly cautious, you can skip it. ---- 4.4.4 STEP 4 -> Sync ---- Run the `sync` command to resynchronize the array with the new disk. snapraid sync If everything is recovered, this command is immediate. 5 COMMANDS ========== SnapRAID provides a few simple commands that allow you to: * Print the status of the array -> `status` * Control the disks -> `smart`, `probe`, `up`, `down` * Make a backup/snapshot -> `sync` * Periodically check data -> `scrub` * Restore the last backup/snapshot -> `fix`. Commands must be written in lowercase. 5.1 status ---------- Prints a summary of the state of the disk array. It includes information about parity fragmentation, how old the blocks are without checking, and all recorded silent errors encountered while scrubbing. The information presented refers to the latest time you ran `sync`. Later modifications are not taken into account. If bad blocks were detected, their block numbers are listed. To fix them, you can use the `fix -e` command. It also shows a graph representing the last time each block was scrubbed or synced. Scrubbed blocks are shown with `*`, blocks synced but not yet scrubbed with `o`. Nothing is modified. 5.2 smart --------- Prints a SMART report of all the disks in the system. It includes an estimation of the probability of failure in the next year, allowing you to plan maintenance replacements of disks that show suspicious attributes. This probability estimation is obtained by correlating the SMART attributes of the disks with the Backblaze data available at: https://www.backblaze.com/hard-drive-test-data.html If SMART reports that a disk is failing, `FAIL` or `PREFAIL` is printed for that disk, and SnapRAID returns with an error. In this case, immediate replacement of the disk is highly recommended. Other possible status strings are: logfail - In the past, some attributes were lower than the threshold. logerr - The device error log contains errors. selferr - The device self-test log contains errors. If the -v, --verbose option is specified, a deeper statistical analysis is provided. This analysis can help you decide if you need more or less parity. This command uses the `smartctl` tool and is equivalent to running `smartctl -a` on all devices. If your devices are not auto-detected correctly, you can specify a custom command using the `smartctl` option in the configuration file. Nothing is modified. 5.3 probe --------- Prints the POWER state of all disks in the system. `Standby` means the disk is not spinning. `Active` means the disk is spinning. This command uses the `smartctl` tool and is equivalent to running `smartctl -n standby -i` on all devices. If your devices are not auto-detected correctly, you can specify a custom command using the `smartctl` option in the configuration file. Nothing is modified. 5.4 up ------ Spins up all the disks of the array. You can spin up only specific disks using the -d, --filter-disk option. Spinning up all the disks at the same time requires a lot of power. Ensure that your power supply can sustain it. Nothing is modified. 5.5 down -------- Spins down all the disks of the array. This command uses the `smartctl` tool and is equivalent to running `smartctl -s standby,now` on all devices. You can spin down only specific disks using the -d, --filter-disk option. To automatically spin down on error, you can use the -s, --spin-down-on-error option with any other command, which is equivalent to running `down` manually when an error occurs. Nothing is modified. 5.6 diff -------- Lists all the files modified since the last `sync` that need to have their parity data recomputed. This command doesn't check the file data, but only the file timestamp, size, and inode. After listing all changed files, a summary of the changes is presented, grouped by: equal - Files unchanged from before. added - Files added that were not present before. removed - Files removed. updated - Files with a different size or timestamp, meaning they were modified. moved - Files moved to a different directory on the same disk. They are identified by having the same name, size, timestamp, and inode, but a different directory. copied - Files copied on the same or a different disk where the original file still exists. They are identified by having the same name, size, and timestamp. If the sub-second timestamp is zero, the full path must match to be identified, not just the name. relocated - Files moved on the same or a different disk where the original has disappeared. They are identified by having the same name, size, and timestamp. If the sub-second timestamp is zero, the full path must match to be identified. Unlike 'moved' files on the same disk, relocated files have a different inode. restored - Files with a different inode but matching directory, name, size, and timestamp. These are usually files restored after being deleted. If a `sync` is required, the process return code is 2, instead of the default 0. The return code 1 is used for a generic error condition. Nothing is modified. 5.7 sync -------- Updates the parity information. All modified files in the disk array are read, and the corresponding parity data is updated. You can stop this process at any time by pressing Ctrl+C, without losing the work already done. At the next run, the `sync` process will resume where it was interrupted. If silent or input/output errors are found during the process, the corresponding blocks are marked as bad. Files are identified by path and/or inode and checked by size and timestamp. If the file size or timestamp differs, the parity data is recomputed for the entire file. If the file is moved or renamed on the same disk, keeping the same inode, the parity is not recomputed. If the file is moved to another disk, the parity is recomputed, but the previously computed hash information is retained. The `content` and `parity` files are modified if necessary. The files in the array are NOT modified. 5.8 scrub --------- Scrubs the array, checking for silent or input/output errors in data and parity disks. Each invocation checks approximately 8% of the array, excluding data already scrubbed in the last 10 days. This means that scrubbing once a week ensures every bit of data is checked at least once every three months. You can define a different scrub plan or amount using the -p, --plan option, which accepts: bad - Scrub blocks marked bad. new - Scrub just-synced blocks not yet scrubbed. full - Scrub everything. 0-100 - Scrub the specified percentage of blocks. If you specify a percentage amount, you can also use the -o, --older-than option to define how old the block should be. The oldest blocks are scrubbed first, ensuring an optimal check. If you want to scrub only the just-synced blocks not yet scrubbed, use the `-p new` option. To get details of the scrub status, use the `status` command. For any silent or input/output error found, the corresponding blocks are marked as bad in the `content` file. These bad blocks are listed in `status` and can be fixed with `fix -e`. After the fix, at the next scrub, they will be rechecked, and if found corrected, the bad mark will be removed. To scrub only the bad blocks, you can use the `scrub -p bad` command. It's recommended to run `scrub` only on a synced array to avoid reported errors caused by unsynced data. These errors are recognized as not being silent errors, and the blocks are not marked as bad, but such errors are reported in the output of the command. The `content` file is modified to update the time of the last check for each block and to mark bad blocks. The `parity` files are NOT modified. The files in the array are NOT modified. 5.9 fix ------- Fixes all the files and the parity data. All files and parity data are compared with the snapshot state saved in the last `sync`. If a difference is found, it is reverted to the stored snapshot. WARNING! The `fix` command does not differentiate between errors and intentional modifications. It unconditionally reverts the file state to the last `sync`. If no other option is specified, the entire array is processed. Use the filter options to select a subset of files or disks to operate on. To fix only the blocks marked bad during `sync` and `scrub`, use the -e, --filter-error option. Unlike other filter options, this one applies fixes only to files that are unchanged since the latest `sync`. SnapRAID renames all files that cannot be fixed by adding the `.unrecoverable` extension. Before fixing, the entire array is scanned to find any files moved since the last `sync` operation. These files are identified by their timestamp, ignoring their name and directory, and are used in the recovery process if necessary. If you moved some of them outside the array, you can use the -i, --import option to specify additional directories to scan. Files are identified only by path, not by inode. The `content` file is NOT modified. The `parity` files are modified if necessary. The files in the array are modified if necessary. 5.10 check ---------- Verifies all the files and the parity data. It works like `fix`, but it only simulates a recovery and no changes are written to the array. This command is primarily intended for manual verification, such as after a recovery process or in other special conditions. For periodic and scheduled checks, use `scrub`. If you use the -a, --audit-only option, only the file data is checked, and the parity data is ignored for a faster run. Files are identified only by path, not by inode. Nothing is modified. 5.11 list --------- Lists all the files contained in the array at the time of the last `sync`. With -v or --verbose, the subsecond time is also shown. Nothing is modified. 5.12 dup -------- Lists all duplicate files. Two files are assumed equal if their hashes match. The file data is not read; only the precomputed hashes are used. Nothing is modified. 5.13 pool --------- Creates or updates a virtual view of all the files in your disk array in the `pooling` directory. The files are not copied but linked using symbolic links. When updating, all existing symbolic links and empty subdirectories are deleted and replaced with the new view of the array. Any other regular files are left in place. Nothing is modified outside the pool directory. 5.14 devices ------------ Prints the low-level devices used by the array. This command displays the device associations in the array and is mainly intended as a script interface. The first two columns are the low-level device ID and path. The next two columns are the high-level device ID and path. The last column is the disk name in the array. In most cases, you have one low-level device for each disk in the array, but in some more complex configurations, you may have multiple low-level devices used by a single disk in the array. Nothing is modified. 5.15 touch ---------- Sets an arbitrary sub-second timestamp for all files that have it set to zero. This improves SnapRAID's ability to recognize moved and copied files, as it makes the timestamp almost unique, reducing possible duplicates. More specifically, if the sub-second timestamp is not zero, a moved or copied file is identified as such if it matches the name, size, and timestamp. If the sub-second timestamp is zero, it is considered a copy only if the full path, size, and timestamp all match. The second-precision timestamp is not modified, so all the dates and times of your files will be preserved. 5.16 rehash ----------- Schedules a rehash of the entire array. This command changes the hash kind used, typically when upgrading from a 32-bit system to a 64-bit one, to switch from MurmurHash3 to the faster SpookyHash. If you are already using the optimal hash, this command does nothing and informs you that no action is needed. The rehash is not performed immediately but takes place progressively during `sync` and `scrub`. You can check the rehash state using `status`. During the rehash, SnapRAID maintains full functionality, with the only exception that `dup` cannot detect duplicated files using a different hash. 5.17 locate ----------- Locate files stored in the parity disks. For each matching file, it prints its location within the parity file and the number of fragments it occupies. You can use the -t, --tail option to restrict the operation to files occupying the specified tail portion of the parity. If you want to reallocate these files, you can then use the -W, --force-realloc-tail option. Be aware that such files will not be protected by parity during the reallocation process. 6 OPTIONS ========= SnapRAID provides the following options: -c, --conf CONFIG Selects the configuration file to use. If not specified, in Unix it uses the file `/usr/local/etc/snapraid.conf` if it exists, otherwise `/etc/snapraid.conf`. In Windows, it uses the file `snapraid.conf` in the same directory as `snapraid.exe`. -f, --filter PATTERN Filters the files to process in `check` and `fix`. Only the files matching the specified pattern are processed. This option can be used multiple times. See the PATTERN section for more details on pattern specifications. In Unix, ensure globbing characters are quoted if used. This option can be used only with `check` and `fix`. It cannot be used with `sync` and `scrub`, as they always process the entire array. -d, --filter-disk NAME Filters the disks to process in `check`, `fix`, `up`, and `down`. You must specify a disk name as defined in the configuration file. You can also specify parity disks with the names: `parity`, `2-parity`, `3-parity`, etc., to limit operations to a specific parity disk. If you combine multiple --filter, --filter-disk, and --filter-missing options, only files matching all the filters are selected. This option can be used multiple times. This option can be used only with `check`, `fix`, `up`, and `down`. It cannot be used with `sync` and `scrub`, as they always process the entire array. -m, --filter-missing Filters the files to process in `check` and `fix`. Only the files missing or deleted from the array are processed. When used with `fix`, this acts as an `undelete` command. If you combine multiple --filter, --filter-disk, and --filter-missing options, only files matching all the filters are selected. This option can be used only with `check` and `fix`. It cannot be used with `sync` and `scrub`, as they always process the entire array. -e, --filter-error Processes the files with errors in `check` and `fix`. It processes only files that have blocks marked with silent or input/output errors during `sync` and `scrub`, as listed in `status`. This option can be used only with `check` and `fix`. -p, --plan PERC|bad|new|full Selects the scrub plan. If PERC is a numeric value from 0 to 100, it is interpreted as the percentage of blocks to scrub. Instead of a percentage, you can specify a plan: `bad` scrubs bad blocks, `new` scrubs blocks not yet scrubbed, and `full` scrubs everything. This option can be used only with `scrub`. -o, --older-than DAYS Selects the oldest part of the array to process in `scrub`. DAYS is the minimum age in days for a block to be scrubbed; the default is 10. Blocks marked as bad are always scrubbed regardless of this option. This option can be used only with `scrub`. -a, --audit-only In `check`, verifies the hash of the files without checking the parity data. If you are interested only in checking the file data, this option can significantly speed up the checking process. This option can be used only with `check`. -h, --pre-hash In `sync`, runs a preliminary hashing phase of all new data for additional verification before the parity computation. Usually, in `sync`, no preliminary hashing is done, and the new data is hashed just before the parity computation when it is read for the first time. This process occurs when the system is under heavy load, with all disks spinning and a busy CPU. This is an extreme condition for the machine, and if it has a latent hardware problem, silent errors may go undetected because the data is not yet hashed. To avoid this risk, you can enable the `pre-hash` mode to have all the data read twice to ensure its integrity. This option also verifies files moved within the array to ensure the move operation was successful and, if necessary, allows you to run a fix operation before proceeding. This option can be used only with `sync`. -i, --import DIR Imports from the specified directory any files deleted from the array after the last `sync`. If you still have such files, they can be used by `check` and `fix` to improve the recovery process. The files are read, including in subdirectories, and are identified regardless of their name. This option can be used only with `check` and `fix`. -s, --spin-down-on-error On any error, spins down all managed disks before exiting with a non-zero status code. This prevents the drives from remaining active and spinning after an aborted operation, helping to avoid unnecessary heat buildup and power consumption. Use this option to ensure disks are safely stopped even when a command fails. -w, --bw-limit RATE Applies a global bandwidth limit for all disks. The RATE is the number of bytes per second. You can specify a multiplier such as K, M, G, or T (e.g., --bw-limit 1G). -t, --tail SIZE Limit file listing to those using no more than the specified tail size of the parity disks. You can use multipliers such as K, M, G, or T (e.g. --tail 1G). This option is only valid when used together with the `locate` command. -A, --stats Enables an extended status view that shows additional information. The screen displays two graphs: The first graph shows the number of buffered stripes for each disk, along with the file path of the file currently being accessed on that disk. Typically, the slowest disk will have no buffer available, which determines the maximum achievable bandwidth. The second graph shows the percentage of time spent waiting over the past 100 seconds. The slowest disk is expected to cause most of the wait time, while other disks should have little or no wait time because they can use their buffered stripes. This graph also shows the time spent waiting for hash calculations and RAID computations. All computations run in parallel with disk operations. Therefore, as long as there is measurable wait time for at least one disk, it indicates that the CPU is fast enough to keep up with the workload. -Z, --force-zero Forces the insecure operation of syncing a file with zero size that was previously non-zero. If SnapRAID detects such a condition, it stops proceeding unless you specify this option. This allows you to easily detect when, after a system crash, some accessed files were truncated. This is a possible condition in Linux with the ext3/ext4 file systems. This option can be used only with `sync`. -E, --force-empty Forces the insecure operation of syncing a disk with all the original files missing. If SnapRAID detects that all the files originally present on the disk are missing or rewritten, it stops proceeding unless you specify this option. This allows you to easily detect when a data file system is not mounted. This option can be used only with `sync`. -U, --force-uuid Forces the insecure operation of syncing, checking, and fixing with disks that have changed their UUID. If SnapRAID detects that some disks have changed UUID, it stops proceeding unless you specify this option. This allows you to detect when your disks are mounted at the wrong mount points. It is, however, allowed to have a single UUID change with single parity, and more with multiple parity, because this is the normal case when replacing disks after a recovery. This option can be used only with `sync`, `check`, or `fix`. -D, --force-device Forces the insecure operation of fixing with inaccessible disks or with disks on the same physical device. For example, if you lost two data disks and have a spare disk to recover only the first one, you can ignore the second inaccessible disk. Or, if you want to recover a disk in the free space left on an already used disk, sharing the same physical device. This option can be used only with `fix`. -N, --force-nocopy In `sync`, `check`, and `fix`, disables the copy detection heuristic. Without this option, SnapRAID assumes that files with the same attributes, such as name, size, and timestamp, are copies with the same data. This allows identification of copied or moved files from one disk to another and reuses the already computed hash information to detect silent errors or to recover missing files. In some rare cases, this behavior may result in false positives or a slow process due to many hash verifications, and this option allows you to resolve such issues. This option can be used only with `sync`, `check`, and `fix`. -F, --force-full In `sync`, forces a full recomputation of the parity. This option can be used when you add a new parity level or if you reverted to an old content file using more recent parity data. Instead of recreating the parity from scratch, this allows you to reuse the hashes present in the content file to validate data and maintain data protection during the `sync` process using the existing parity data. This option can be used only with `sync`. -R, --force-realloc In `sync`, forces a full reallocation of files and rebuild of the parity. This option can be used to completely reallocate all files, removing fragmentation, while reusing the hashes present in the content file to validate data. This option can be used only with `sync`. WARNING! This option is for experts only, and it is highly recommended not to use it. You DO NOT have data protection during the `sync` operation. -W, --force-realloc-tail SIZE Works like -R, --force-realloc, but limited to the specified tail portion (last SIZE bytes) of each parity file. It forces reallocation (movement) of any file fragments/blocks currently stored in that tail section, allowing them to be placed anywhere in the parity file(s) where free space is available (including existing holes). The main purpose of this option is to shrink the on-disk size of the parity file. If the reallocation successfully clears the entire tail section (no blocks remain using it), the parity file is truncated, reclaiming the unused tail space. You can use multipliers such as K, M, G, or T (e.g. --force-realloc-tail 1G). You can use locate -t, --tail to know in advance the affected files. WARNING! This option is for experts only, and it is highly recommended not to use it. You DO NOT have data protection during the `sync` operation for the affected files. -l, --log FILE Writes a detailed log to the specified file. If this option is not specified, unexpected errors are printed to the screen, potentially resulting in excessive output in case of many errors. When -l, --log is specified, only fatal errors that cause SnapRAID to stop are printed to the screen. If the path starts with `>>`, the file is opened in append mode. Occurrences of `%D` and `%T` in the name are replaced with the date and time in the format YYYYMMDD and HHMMSS. In Windows batch files, you must double the `%` character, e.g., result-%%D.log. To use `>>`, you must enclose the name in quotes, e.g., `">>result.log"`. To output the log to standard output or standard error, you can use `">&1"` and `">&2"`, respectively. See the snapraid_log.txt file or man page for log tag descriptions. -L, --error-limit NUMBER Sets a new error limit before stopping execution. By default, SnapRAID stops if it encounters more than 100 input/output errors, indicating that a disk is likely failing. This option affects `sync` and `scrub`, which are allowed to continue after the first set of disk errors to try to complete their operations. However, `check` and `fix` always stop at the first error. -S, --start BLKSTART Starts processing from the specified block number. This can be useful for retrying to check or fix specific blocks in case of a damaged disk. This option is mainly for advanced manual recovery. -B, --count BLKCOUNT Processes only the specified number of blocks. This option is mainly for advanced manual recovery. -C, --gen-conf CONTENT Generates a dummy configuration file from an existing content file. The configuration file is written to standard output and does not overwrite an existing one. This configuration file also contains the information needed to reconstruct the disk mount points in case you lose the entire system. -v, --verbose Prints more information to the screen. If specified once, it prints excluded files and additional statistics. This option has no effect on the log files. -q, --quiet Prints less information to the screen. If specified once, it removes the progress bar; twice, the running operations; three times, the info messages; four times, the status messages. Fatal errors are always printed to the screen. This option has no effect on the log files. -H, --help Prints a short help screen. -V, --version Prints the program version. 7 CONFIGURATION =============== SnapRAID requires a configuration file to know where your disk array is located and where to store the parity information. In Unix, it uses the file `/usr/local/etc/snapraid.conf` if it exists, otherwise `/etc/snapraid.conf`. In Windows, it uses the file `snapraid.conf` in the same directory as `snapraid.exe`. It must contain the following options (case-sensitive): 7.1 parity FILE [,FILE] ... --------------------------- Defines the files to use to store the parity information. The parity enables protection from a single disk failure, similar to RAID5. You can specify multiple files, which must be on different disks. When a file cannot grow anymore, the next one is used. The total space available must be at least as large as the largest data disk in the array. You can add additional parity files later, but you cannot reorder or remove them. Keeping the parity disks reserved for parity ensures that they do not become fragmented, improving performance. In Windows, 256 MB is left unused on each disk to avoid the warning about full disks. This option is mandatory and can be used only once. 7.2 (2,3,4,5,6)-parity FILE [,FILE] ... --------------------------------------- Defines the files to use to store extra parity information. For each parity level specified, one additional level of protection is enabled: * 2-parity enables RAID6 dual parity. * 3-parity enables triple parity. * 4-parity enables quad (four) parity. * 5-parity enables penta (five) parity. * 6-parity enables hexa (six) parity. Each parity level requires the presence of all previous parity levels. The same considerations as for the `parity` option apply. These options are optional and can be used only once. 7.3 z-parity FILE [,FILE] ... ----------------------------- Defines an alternate file and format to store triple parity. This option is an alternative to `3-parity`, primarily intended for low-end CPUs like ARM or AMD Phenom, Athlon, and Opteron that do not support the SSSE3 instruction set. In such cases, it provides better performance. This format is similar to but faster than the one used by ZFS RAIDZ3. Like ZFS, it does not work beyond triple parity. When using `3-parity`, you will be warned if it is recommended to use the `z-parity` format for performance improvement. It is possible to convert from one format to another by adjusting the configuration file with the desired z-parity or 3-parity file and using `fix` to recreate it. 7.4 content FILE ---------------- Defines the file to use to store the list and checksums of all the files present in your disk array. It can be placed on a disk used for data, parity, or any other disk available. If you use a data disk, this file is automatically excluded from the `sync` process. This option is mandatory and can be used multiple times to save multiple copies of the same file. You must store at least one copy for each parity disk used plus one. Using additional copies does not hurt. 7.5 data NAME DIR ----------------- Defines the name and mount point of the data disks in the array. NAME is used to identify the disk and must be unique. DIR is the mount point of the disk in the file system. You can change the mount point as needed, as long as you keep the NAME fixed. You should use one option for each data disk in the array. You can rename a disk later by changing the NAME directly in the configuration file and then running a `sync` command. In the case of renaming, the association is done using the stored UUID of the disks. 7.6 extra NAME DIR ------------------ Defines the name and mount point of additional disks to monitor with the `smart` and `probe` commands. This is useful for monitoring disks that are not part of the array but are required for the system to function, such as the boot disk. Note that such disks are not affected by the `up` and `down` commands because they are expected to be always spinning. 7.7 nohidden ------------ Excludes all hidden files and directories. In Unix, hidden files are those starting with `.`. In Windows, they are those with the hidden attribute. 7.8 exclude/include PATTERN --------------------------- Defines the file or directory patterns to exclude or include in the sync process. All patterns are processed in the specified order. If the first pattern that matches is an `exclude` one, the file is excluded. If it is an `include` one, the file is included. If no pattern matches, the file is excluded if the last pattern specified is an `include`, or included if the last pattern specified is an `exclude`. See the PATTERN section for more details on pattern specifications. This option can be used multiple times. 7.9 blocksize SIZE_IN_KIBIBYTES ------------------------------- Defines the basic block size in kibibytes for the parity. One kibibyte is 1024 bytes. The default blocksize is 256, which should work for most cases. WARNING! This option is for experts only, and it is highly recommended not to change this value. To change this value in the future, you will need to recreate the entire parity! A reason to use a different blocksize is if you have many small files, on the order of millions. For each file, even if only a few bytes, an entire block of parity is allocated, and with many files, this may result in significant unused parity space. When you completely fill the parity disk, you are not allowed to add more files to the data disks. However, the wasted parity does not accumulate across data disks. Wasted space resulting from a high number of files on a data disk limits only the amount of data on that data disk, not others. As an approximation, you can assume that half of the block size is wasted for each file. For example, with 100,000 files and a 256 KiB block size, you will waste 12.8 GB of parity, which may result in 12.8 GB less space available on the data disk. You can check the amount of wasted space on each disk using `status`. This is the amount of space you must leave free on the data disks or use for files not included in the array. If this value is negative, it means you are close to filling the parity, and it represents the space you can still waste. To avoid this issue, you can use a larger partition for parity. For example, if the parity partition is 12.8 GB larger than the data disks, you have enough extra space to handle up to 100,000 files on each data disk without any wasted space. A trick to get a larger parity partition in Linux is to format it with the command: mkfs.ext4 -m 0 -T largefile4 DEVICE This results in about 1.5% extra space, approximately 60 GB for a 4 TB disk, which allows about 460,000 files on each data disk without any wasted space. 7.10 hashsize SIZE_IN_BYTES --------------------------- Defines the hash size in bytes for the saved blocks. The default hashsize is 16 bytes (128 bits), which should work for most cases. WARNING! This option is for experts only, and it is highly recommended not to change this value. To change this value in the future, you will need to recreate the entire parity! A reason to use a different hashsize is if your system has limited memory. As a rule of thumb, SnapRAID typically requires 1 GiB of RAM for each 16 TB of data in the array. Specifically, to store the hashes of the data, SnapRAID requires approximately TS*(1+HS)/BS bytes of RAM, where TS is the total size in bytes of your disk array, BS is the block size in bytes, and HS is the hash size in bytes. For example, with 8 disks of 4 TB, a block size of 256 KiB (1 KiB = 1024 bytes), and a hash size of 16, you get: RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB Switching to a hash size of 8, you get: RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB Switching to a block size of 512, you get: RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB Switching to both a hash size of 8 and a block size of 512, you get: RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB 7.11 autosave SIZE_IN_GIGABYTES ------------------------------- Automatically saves the state when syncing or scrubbing after the specified amount of GB processed. This option is useful to avoid restarting long `sync` commands from scratch if interrupted by a machine crash or any other event. 7.12 temp_limit TEMPERATURE_CELSIUS ----------------------------------- Sets the maximum allowed disk temperature in Celsius. When specified, SnapRAID periodically checks the temperature of all disks using the smartctl tool. The current disk temperatures are displayed while SnapRAID is operating. If any disk exceeds this limit, all operations stop, and the disks are spun down (put into standby) for the duration defined by the `temp_sleep` option. After the sleep period, operations resume, potentially pausing again if the temperature limit is reached once more. During operation, SnapRAID also analyzes the heating curve of each disk and estimates the long-term steady temperature they are expected to reach if activity continues. The estimation is performed only after the disk temperature has increased four times, ensuring that enough data points are available to establish a reliable trend. This predicted steady temperature is shown in parentheses next to the current value and helps assess whether the system's cooling is adequate. This estimated temperature is for informational purposes only and has no effect on the behavior of SnapRAID. The program's actions are based solely on the actual measured disk temperatures. To perform this analysis, SnapRAID needs a reference for the system temperature. It first attempts to read it from available hardware sensors. If no system sensor can be accessed, it uses the lowest disk temperature measured at the start of the run as a fallback reference. Normally, SnapRAID shows only the temperature of the hottest disk. To display the temperature of all disks, use the -A or --stats option. 7.13 temp_sleep TIME_IN_MINUTES ------------------------------- Sets the standby time, in minutes, when the temperature limit is reached. During this period, the disks remain spun down. The default is 5 minutes. 7.14 pool DIR ------------- Defines the pooling directory where the virtual view of the disk array is created using the `pool` command. The directory must already exist. 7.15 share UNC_DIR ------------------ Defines the Windows UNC path required to access the disks remotely. If this option is specified, the symbolic links created in the pool directory use this UNC path to access the disks. Without this option, the symbolic links generated use only local paths, which does not allow sharing the pool directory over the network. The symbolic links are formed using the specified UNC path, adding the disk name as specified in the `data` option, and finally adding the file directory and name. This option is required only for Windows. 7.16 smartctl DISK/PARITY OPTIONS... ------------------------------------ Defines custom smartctl options to obtain the SMART attributes for each disk. This may be required for RAID controllers and some USB disks that cannot be auto-detected. The %s placeholder is replaced by the device name, but it is optional for fixed devices like RAID controllers. DISK is the same disk name specified in the `data` option. PARITY is one of the parity names: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, or `z-parity`. In the specified OPTIONS, the `%s` string is replaced by the device name. For RAID controllers, the device is likely fixed, and you may not need to use `%s`. Refer to the smartmontools documentation for possible options: https://www.smartmontools.org/wiki/Supported_RAID-Controllers https://www.smartmontools.org/wiki/Supported_USB-Devices For example: smartctl parity -d sat %s 7.17 smartignore DISK/PARITY ATTR [ATTR...] ------------------------------------------- Ignores the specified SMART attribute when computing the probability of disk failure. This option is useful if a disk reports unusual or misleading values for a particular attribute. DISK is the same disk name specified in the `data` option. PARITY is one of the parity names: `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, `6-parity`, or `z-parity`. The special value * can be used to ignore the attribute on all disks. For example, to ignore the `Current Pending Sector Count` attribute on all disks: smartignore * 197 To ignore it only on the first parity disk: smartignore parity 197 7.18 Examples ------------- An example of a typical configuration for Unix is: parity /mnt/diskp/snapraid.parity content /mnt/diskp/snapraid.content content /var/snapraid/snapraid.content data d1 /mnt/disk1/ data d2 /mnt/disk2/ data d3 /mnt/disk3/ exclude /lost+found/ exclude /tmp/ smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/sg0 smartctl 2-parity -d areca,2/1 /dev/sg0 An example of a typical configuration for Windows is: parity E:\snapraid.parity content E:\snapraid.content content C:\snapraid\snapraid.content data d1 G:\array\ data d2 H:\array\ data d3 I:\array\ exclude Thumbs.db exclude \$RECYCLE.BIN exclude \System Volume Information smartctl d1 -d sat %s smartctl d2 -d usbjmicron %s smartctl parity -d areca,1/1 /dev/arcmsr0 smartctl 2-parity -d areca,2/1 /dev/arcmsr0 8 PATTERN ========= Patterns are used to select a subset of files to exclude or include in the process. Globbing characters can be used to match files and paths in a flexible way. The question mark `?` matches any single character except the directory separator. This makes it useful for matching filenames with variable characters while keeping the pattern confined to a single directory level. The single star `*` matches any sequence of characters, but like the question mark, it never crosses directory boundaries. It stops at the forward slash, making it suitable for matching within a single path component. This is the standard wildcard behavior familiar from shell globbing. The double star `**` is more powerful, it matches any sequence of characters including directory separators. This allows patterns to match across multiple directory levels. When `**` appears embedded directly in a pattern, it can match zero or more characters including slashes between the surrounding literal text. The most important use of `**` is in the special form `/**/`. This matches zero or more complete directory levels, making it possible to match files at any depth in a directory tree without knowing the exact path structure. For example, the pattern `src/**/main.js` matches `src/main.js` (skipping zero directories), `src/ui/main.js` (skipping one directory), and `src/ui/components/main.js` (skipping two directories). Character classes using square brackets match a single character from a specified set or range. Like the other single character patterns, they do not match directory separators. Classes support ranges and negation using an exclamation mark. The fundamental distinction to remember is that `*`, `?`, and character classes all respect directory boundaries and only match within a single path component, while `**` is the only pattern that can match across directory separators. There are four different types of patterns: FILE Selects any file named FILE. This pattern applies only to files, not directories. DIR/ Selects any directory named DIR and everything inside. This pattern applies only to directories, not files. /PATH/FILE Selects the exact specified file path. This pattern applies only to files, not directories. /PATH/DIR/ Selects the exact specified directory path and everything inside. This pattern applies only to directories, not files. When you specify an absolute path starting with /, it is applied at the array root directory, not the local file system root directory. In Windows, you can use the backslash \ instead of the forward slash /. Windows system directories, junctions, mount points, and other Windows special directories are treated as files, meaning that to exclude them, you must use a file rule, not a directory one. If the file name contains a `*`, `?`, `[`, or `]` character, you must escape it to avoid having it interpreted as a globbing character. In Unix, the escape character is `\`; in Windows, it is `^`. When the pattern is on the command line, you must double the escape character to avoid having it interpreted by the command shell. In the configuration file, you can use different strategies to filter the files to process. The simplest approach is to use only `exclude` rules to remove all the files and directories you do not want to process. For example: # Excludes any file named `*.unrecoverable` exclude *.unrecoverable # Excludes the root directory `/lost+found` exclude /lost+found/ # Excludes any subdirectory named `tmp` exclude tmp/ The opposite approach is to define only the files you want to process, using only `include` rules. For example: # Includes only some directories include /movies/ include /musics/ include /pictures/ The final approach is to mix `exclude` and `include` rules. In this case, the order of rules is important. Earlier rules take precedence over later ones. To simplify, you can list all the `exclude` rules first and then all the `include` rules. For example: # Excludes any file named `*.unrecoverable` exclude *.unrecoverable # Excludes any subdirectory named `tmp` exclude tmp/ # Includes only some directories include /movies/ include /musics/ include /pictures/ On the command line, using the -f option, you can only use `include` patterns. For example: # Checks only the .mp3 files. # In Unix, use quotes to avoid globbing expansion by the shell. snapraid -f "*.mp3" check In Unix, when using globbing characters on the command line, you must quote them to prevent the shell from expanding them. 9 IGNORE FILE ============= In addition to the global rules in the configuration file, you can place `.snapraidignore` files in any directory within the array to define decentralized exclusion rules. Rules defined in `.snapraidignore` are applied after the rules in the configuration file. This means they have a higher priority and can be used to exclude files that were previously included by the global configuration. Effectively, if a local rule matches, the file is excluded regardless of the global include settings. The pattern logic in `.snapraidignore` mirrors the global configuration but anchors patterns to the directory where the file is located: FILE Selects any file named FILE in this directory or below. This follows the same globbing rules as the global pattern. DIR/ Selects any directory named DIR and everything inside, residing in this directory or below. /PATH/FILE Selects the exact specified file relative to the location of the `.snapraidignore` file. /PATH/DIR/ Selects the exact specified directory and everything inside, relative to the location of the `.snapraidignore` file. Unlike the global configuration, `.snapraidignore` files only support exclusion rules; you cannot use `include` patterns or negation (!). For example, if you have a `.snapraidignore` in `/mnt/disk1/projects/`: # Excludes ONLY /mnt/disk1/projects/output.bin /output.bin # Excludes any directory named `build` inside projects/ build/ # Excludes any .tmp file inside projects/ or its subfolders *.tmp 10 CONTENT ========== SnapRAID stores the list and checksums of your files in the content file. It is a binary file that lists all the files present in your disk array, along with all the checksums to verify their integrity. This file is read and written by the `sync` and `scrub` commands and read by the `fix`, `check`, and `status` commands. 11 PARITY ========= SnapRAID stores the parity information of your array in the parity files. These are binary files containing the computed parity of all the blocks defined in the `content` file. These files are read and written by the `sync` and `fix` commands and only read by the `scrub` and `check` commands. 12 ENCODING =========== SnapRAID in Unix ignores any encoding. It reads and stores the file names with the same encoding used by the file system. In Windows, all names read from the file system are converted and processed in UTF-8 format. To have file names printed correctly, you must set the Windows console to UTF-8 mode with the command `chcp 65001` and use a TrueType font like `Lucida Console` as the console font. This affects only the printed file names; if you redirect the console output to a file, the resulting file is always in UTF-8 format. 13 EXIT CODE ============ SnapRAID terminates with the following error codes: 0 - Everything OK. 1 - The command encountered some errors. 2 - The `diff` command found everything is OK, but a `sync` is needed. 14 COPYRIGHT ============ This file is Copyright (C) 2026 Andrea Mazzoleni 15 SEE ALSO =========== snapraid_log(1), snapraidd(1), rsync(1) snapraid-14.9/doc/snapraid_log.1000066400000000000000000001476701522717156100165670ustar00rootroot00000000000000.TH "SnapRAID Log Format" 1 .SH NAME snapraid_log \- SnapRAID Log Format .SH DESCRIPTION This document describes the structured log tags output by SnapRAID, which are designed to be used by tools monitoring the SnapRAID processing state. The tags provide information in an easy\-to\-parse format, ideal for automation and integration. .PP To capture these structured log tags, you must use the \`\-\-log\` option with SnapRAID. .PP You can direct the output to a specific file, or force the output to the standard output or standard error using the special arguments \`>&1\` or \`>&2\`. Note that these arguments often need to be quoted on the command line to prevent the shell from interpreting them. .PP Example: .PP .RS 4 snapraid status \-\-log \[dq]>&2\[dq] .PD 0 .PD .RE .PP The output tags strictly adhere to the following format: .PP NAME:VALUE:VALUE:VALUE... .PD 0 .PD .TP .B NAME This is the primary tag identifier, always a lowercase string without spaces (e.g., \`summary\`, \`block\`). .TP .B VALUE Following the \`NAME\`, these can be additional sub\-identifiers, descriptive names (like a disk name), or numeric/string data values. They are separated by a colon \`:\`. .TP .B Each tag is terminated by an end\-of\-line character. .PP This document provides a summary of the tags generated by SnapRAID. For the most detailed and up\-to\-date information regarding the meaning and context of the values, it is recommended to check the source code\'s \`log_tag()\` statements. .PP When a path is output, it is always escaped using a backslash (\\) as the escape character. .PP The following characters are escaped into sequences: .RS 4 .PD 0 .HP 4 .I The colon is escaped to \\d. .HP 4 .I The newline is escaped to \\n. .HP 4 .I The carriage return is escaped to \\r. .HP 4 .I The backslash is escaped to \\\\. .PD .RE .PP Some tags are output only when the \`\-\-gui\` or \`\-\-gui\-verbose\` option is used. They provide extra verbose state and runtime progress only useful for a GUI interface. .PP Integer values are marked as \`uint\` when they are unsigned and as \`int\` when they are signed. However, for practical purposes you can treat all of them as signed integers. All integer values should be assumed to be 64 bits wide, regardless of the signed/unsigned marker. Floating point values are marked as \`float\`. .SH CONFIGURATION TAGS These tags report the memory usage and global configuration. .TP .B conf:file: Configuration file loaded (escaped). .TP .B conf:missing: Operating without a configuration file. .TP .B blocksize: The configured block size in bytes (uint). .TP .B data::: The data disks as defined in the configuration file. .RS 4 .PD 0 .HP 4 .I The assigned name of the disk. .HP 4 .I The directory entry point of the disk. .HP 4 .I The UUID of the filesystem containing the dir. .PD .RE .TP .B mode: The RAID mode used. One of \`par1\`, \`par2\`, \`par3\`, \`par4\`, \`par5\`, \`par6\` or \`parz\`. The number indicates the maximum number of simultaneous disk failures the array can withstand. .TP .B [/]:: The parity files as defined in the configuration file. .RS 4 .PD 0 .HP 4 .I [/] One of \`parity\`, \`2\-parity\`, ..., \`6\-parity\`. This corresponds to the level of redundancy. In case of split parity, the parity name is followed by \`/N\` to indicate the split index, where N starts from 0. The \`/0\` is always omitted. .HP 4 .I The path (escaped). .HP 4 .I The UUID of the filesystem containing the path. .PD .RE .TP .B fsinfo_data::: The filesystem information of the specified data disk. .RS 4 .PD 0 .HP 4 .I The size of the data disk (uint). .HP 4 .I The free size in the data disk (uint). .PD .RE .TP .B fsinfo_parity::: The filesystem information of the specified parity disk. In case of multiple splits this is the sum of the sizes of all splits. .RS 4 .PD 0 .HP 4 .I The size of the parity disk (uint). .HP 4 .I The free size in the parity disk (uint). .PD .RE .TP .B fsinfo_data_split:::::