• 练习 22:文件系统:移动数据,tardd
    • 这样做
    • 你会看到什么
    • 解释
    • 附加题

    练习 22:文件系统:移动数据,tardd

    原文:Exercise 22. Filesystems: moving data around: tar, dd

    译者:飞龙

    协议:CC BY-NC-SA 4.0

    自豪地采用谷歌翻译

    现在是时候自己看看了,Linux 中的所有东西只是一个文件。

    这个练习是一个很大的练习,但是看看你学到了什么。完成之后,在man中查看所有故意不解释的程序参数,,并试图自己解释每个命令的作用。

    现在你将学习如何玩转数据。

    这样做

    1. 1: tar -czvf root.tgz /opt/root/
    2. 2: tar -tzvf root.tgz
    3. 3: cd /tmp
    4. 4: tar -zxvf ~/root.tgz
    5. 5: ls -al
    6. 6: dd_if=$(mount | grep /tmp | cut -d ' ' -f 1) && echo $dd_if
    7. 7: sudo dd if=$dd_if of=~/tmp.img bs=10M
    8. 8: cd && ls -alh
    9. 9: sudo losetup /dev/loop1 ~/tmp.img && sudo mount /dev/loop1 /mnt/
    10. 10: ls -al /mnt
    11. 11: sudo umount /mnt && sudo losetup -d /dev/loop1
    12. 12: sudo umount $dd_if && sudo mkfs.ext3 $dd_if
    13. 13: new_uuid=$(sudo tune2fs -l $dd_if | awk '/UUID/{print $3}') && echo $new_uuid
    14. 14: grep '/tmp' /etc/fstab
    15. 15: sed "s/^UUID=.*\/tmp\s\+ext3\s\+defaults\s\+[0-9]\s\+[0-9]\s\?/UUID=$new_uuid \/tmp ext3 defaults 0 2/" /etc/fstab

    现在使用sudo tune2fs -lsudo blkid检查输出。如果/etc/fstab中的 UUID 替换看起来正常,执行实际的替换。

    1. 16: sudo sed -i'.bak' "s/^UUID=.*\/tmp\s\+ext3\s\+defaults\s\+[0-9]\s\+[0-9]\s\?/UUID=$new_uuid \/tmp ext3 defaults 0 2/" /etc/fstab
    2. 17: sudo mount -a && ls /tmp
    3. 18: sudo umount /tmp && pv ~/tmp.img | sudo dd of=$dd_if bs=10M
    4. 19: new_uuid=$(sudo tune2fs -l $dd_if | awk '/UUID/{print $3}') && echo $new_uuid
    5. 20: sudo sed -i'.bak' "s/^UUID=.*\/tmp\s\+ext3\s\+defaults\s\+[0-9]\s\+[0-9]\s\?/UUID=$new_uuid \/tmp ext3 defaults 0 2/" /etc/fstab
    6. 21: sudo mount -a
    7. 22: rm -v tmp.img

    输入y并按下<ENTER>

    你会看到什么

    1. user1@vm1:~$ tar -czvf root.tgz /opt/root/
    2. tar: Removing leading '/' from member names
    3. /opt/root/
    4. /opt/root/bin/
    5. /opt/root/bin/bash
    6. /opt/root/lib64/
    7. /opt/root/lib64/ld-linux-x86-64.so.2
    8. /opt/root/lib/
    9. /opt/root/lib/libdl.so.2
    10. /opt/root/lib/libncurses.so.5
    11. /opt/root/lib/libc.so.6
    12. user1@vm1:~$ tar -tzvf root.tgz
    13. drwxr-xr-x root/root 0 2012-07-05 03:14 opt/root/
    14. drwxr-xr-x root/root 0 2012-07-05 03:14 opt/root/bin/
    15. -rwxr-xr-x root/root 926536 2012-07-05 03:14 opt/root/bin/bash
    16. drwxr-xr-x root/root 0 2012-07-05 03:14 opt/root/lib64/
    17. -rwxr-xr-x root/root 128744 2012-07-05 03:14 opt/root/lib64/ld-linux-x86-64.so.2
    18. drwxr-xr-x root/root 0 2012-07-05 03:14 opt/root/lib/
    19. -rw-r--r-- root/root 14696 2012-07-05 03:14 opt/root/lib/libdl.so.2
    20. -rw-r--r-- root/root 286776 2012-07-05 03:14 opt/root/lib/libncurses.so.5
    21. -rwxr-xr-x root/root 1437064 2012-07-05 03:14 opt/root/lib/libc.so.6
    22. user1@vm1:~$ cd /tmp
    23. user1@vm1:/tmp$ tar -zxvf ~/root.tgz
    24. opt/root/
    25. opt/root/bin/
    26. opt/root/bin/bash
    27. opt/root/lib64/
    28. opt/root/lib64/ld-linux-x86-64.so.2
    29. opt/root/lib/
    30. opt/root/lib/libdl.so.2
    31. opt/root/lib/libncurses.so.5
    32. opt/root/lib/libc.so.6
    33. user1@vm1:/tmp$ ls -al
    34. total 19
    35. drwxrwxrwt 6 root root 1024 Jul 5 04:17 .
    36. drwxr-xr-x 22 root root 1024 Jul 3 08:29 ..
    37. drwxrwxrwt 2 root root 1024 Jul 3 08:41 .ICE-unix
    38. drwx------ 2 root root 12288 Jul 3 07:47 lost+found
    39. drwxr-xr-x 3 user1 user1 1024 Jul 5 03:24 opt
    40. -rw-r--r-- 1 root root 489 Jul 3 10:14 sources.list
    41. -r--r----- 1 root root 491 Jul 3 10:21 sudoers
    42. drwxrwxrwt 2 root root 1024 Jul 3 08:41 .X11-unix
    43. user1@vm1:/tmp$ dd_if=$(mount | grep /tmp | cut -d ' ' -f 1) && echo $dd_if
    44. /dev/sda8
    45. user1@vm1:~$ cd && ls -alh
    46. total 243M
    47. drwxr-xr-x 3 user1 user1 4.0K Jul 5 04:27 .
    48. drwxr-xr-x 4 root root 4.0K Jul 3 08:39 ..
    49. -rw------- 1 user1 user1 22 Jul 3 10:45 .bash_history
    50. -rw-r--r-- 1 user1 user1 220 Jul 3 08:39 .bash_logout
    51. -rw-r--r-- 1 user1 user1 3.2K Jul 3 08:39 .bashrc
    52. -rw------- 1 user1 user1 52 Jul 5 04:12 .lesshst
    53. drwxr-xr-x 3 user1 user1 4.0K Jul 5 03:23 opt
    54. -rw-r--r-- 1 user1 user1 675 Jul 3 08:39 .profile
    55. -rw-r--r-- 1 user1 user1 1.3M Jul 5 04:25 root.tgz
    56. -rw-r--r-- 1 root root 241M Jul 5 04:36 tmp.img
    57. user1@vm1:~$ sudo losetup /dev/loop1 ~/tmp.img && sudo mount /dev/loop1 /mnt/
    58. user1@vm1:~$ ls -al /mnt
    59. total 19
    60. drwxrwxrwt 6 root root 1024 Jul 5 04:17 .
    61. drwxr-xr-x 22 root root 1024 Jul 3 08:29 ..
    62. drwxrwxrwt 2 root root 1024 Jul 3 08:41 .ICE-unix
    63. drwx------ 2 root root 12288 Jul 3 07:47 lost+found
    64. drwxr-xr-x 3 user1 user1 1024 Jul 5 03:24 opt
    65. -rw-r--r-- 1 root root 489 Jul 3 10:14 sources.list
    66. -r--r----- 1 root root 491 Jul 3 10:21 sudoers
    67. drwxrwxrwt 2 root root 1024 Jul 3 08:41 .X11-unix
    68. user1@vm1:~$ sudo umount /mnt && sudo losetup -d /dev/loop1
    69. user1@vm1:~$ sudo umount $dd_if && sudo mkfs.ext3 $dd_if
    70. mke2fs 1.41.12 (17-May-2010)
    71. Filesystem label=
    72. OS type: Linux
    73. Block size=1024 (log=0)
    74. Fragment size=1024 (log=0)
    75. Stride=0 blocks, Stripe width=0 blocks
    76. 61752 inodes, 246784 blocks
    77. 12339 blocks (5.00%) reserved for the super user
    78. First data block=1
    79. Maximum filesystem blocks=67371008
    80. 31 block groups
    81. 8192 blocks per group, 8192 fragments per group
    82. 1992 inodes per group
    83. Superblock backups stored on blocks:
    84. 8193, 24577, 40961, 57345, 73729, 204801, 221185
    85. Writing inode tables: done
    86. Creating journal (4096 blocks): done
    87. Writing superblocks and filesystem accounting information: done
    88. This filesystem will be automatically checked every 27 mounts or
    89. 180 days, whichever comes first. Use tune2fs -c or -i to override.
    90. user1@vm1:~$ new_uuid=$(sudo tune2fs -l $dd_if | awk '/UUID/{print $3}') && echo $new_uuid
    91. f8288adc-3ef9-4a6e-aab2-92624276b8ba
    92. user1@vm1:~$ grep '/tmp' /etc/fstab
    93. # /tmp was on /dev/sda8 during installation
    94. UUID=011b4530-e4a9-4d13-926b-48d9e33b64bf /tmp ext3 defaults 0 2
    95. user1@vm1:~$ sed "s/^UUID=.*\/tmp\s\+ext3\s\+defaults\s\+[0-9]\s\+[0-9]\s\?/UUID=$new_uuid \/tmp ext3 defaults 0 2/" /etc/fstab
    96. # /etc/fstab: static file system information.
    97. #
    98. # Use 'blkid' to print the universally unique identifier for a
    99. # device; this may be used with UUID= as a more robust way to name devices
    100. # that works even if disks are added and removed. See fstab(5).
    101. #
    102. # <file system> <mount point> <type> <options> <dump> <pass>
    103. proc /proc proc defaults 0 0
    104. # / was on /dev/sda1 during installation
    105. UUID=91aacf33-0b35-474c-9c61-311e04b0bed1 / ext3 errors=remount-ro 0 1
    106. # /home was on /dev/sda9 during installation
    107. UUID=e27b0efb-8cf0-439c-9ebe-d59c927dd590 /home ext3 defaults 0 2
    108. # /tmp was on /dev/sda8 during installation
    109. UUID=f8288adc-3ef9-4a6e-aab2-92624276b8ba /tmp ext3 defaults 0 2
    110. # /usr was on /dev/sda5 during installation
    111. UUID=9f49821b-7f94-4915-b9a9-ed9f12bb6847 /usr ext3 defaults 0 2
    112. # /var was on /dev/sda6 during installation
    113. UUID=b7e908a1-a1cd-4d5c-bc79-c3a99d003e7c /var ext3 defaults 0 2
    114. # swap was on /dev/sda7 during installation
    115. UUID=292981d7-5a17-488f-8d9a-176b65f45d46 none swap sw 0 0
    116. /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
    117. sudo sed -i'.bak' "s/^UUID=.*\/tmp\s\+ext3\s\+defaults\s\+[0-9]\s\+[0-9]\s\?/UUID=$new_uuid \/tmp ext3 defaults 0 2/" /etc/fstab
    118. sudo mount -a && ls /tmp
    119. user1@vm1:~$ sudo umount /tmp && pv ~/tmp.img | sudo dd of=$dd_if bs=10M
    120. 241MB 0:00:04 [54.2MB/s] [===============================================================================================================>] 100%
    121. 0+1928 records in
    122. 0+1928 records out
    123. 252706816 bytes (253 MB) copied, 5.52494 s, 45.7 MB/s
    124. user1@vm1:~$ rm -v tmp.img
    125. rm: remove write-protected regular file `tmp.img'? y
    126. removed `tmp.img'
    127. user1@vm1:~$

    解释

    1. 在你的主目录中创建归档或/opt/root/。归档文件的扩展名是.tgz,因为这个归档实际上由两部分组成,就像是俄罗斯套娃。第一部分由字母t指定,是一个大文件,其中所有归档文件由程序tar合并。第二部分由字母gz指定 ,意味着tar调用gzip程序来压缩它。
    2. 测试这个归档。
    3. 将目录更改为/tmp
    4. 解压你的归档。
    5. 打印目录内容。
    6. 提取挂载在/tmp上的分区的名称,将其存储在dd_if变量中,如果提取成功,打印出dd_if值。if代表输入文件。
    7. 将整个分区复制到你的主目录中的tmp.img。dd 使用超级用户调用,因为你正在访问代表你的分区的文件/dev/sda8,该分区对普通用户不可访问。
    8. 将目录更改为你的主目录并打印出其内容。
    9. 告诉 Linux 将tmp.img文件用作(一种)物理分区并挂载它。
    10. 打印出tmp.img的内容。你可以看到它真的是/tmp的精确副本 。
    11. 解除挂载tmp.img,并告诉 Linux 停止将其看做分区。
    12. 解除挂载/tmp并在那里创建新的文件系统,删除该过程中的所有东西。
    13. 提取你的新/tmp文件系统的UUID ,将其存储在new_uuid中,并打印出来。
    14. /etc/fstab中打印描述旧的/tmp分区的一行。
    15. 向你展示,修改后的/etc/fstab如何工作。通过使用正则表达式来完成,这个表达式用作掩码,定义了这一行:

      1. UUID=f8288adc-3ef9-4a6e-aab2-92624276b8ba /tmp ext3 defaults 0 2

      完成这本书后,我会给你一个链接,让你学习如何创建这样的正则表达式。

    16. 使用新的 UUID 实际替换/tmp旧的 UUID。
    17. 挂载/etc/fstab中描述的所有文件系统,并列出新/tmp的内容
    18. 解除挂载新的/tmp并从tmp.img恢复旧/tmp
    19. 获取旧/tmp的 UUID,它实际上与创建新文件系统之前相同,因为tmp.img是旧的/ tmp的完美副本。
    20. /etc/fstab中用旧的 UUID 替换新的 UUID 。
    21. /etc/fstab挂载所有文件系统。如果此命令不会导致错误,你可能一切正常。恭喜。
    22. 从你的主目录中删除tmp.img

    附加题

    • 尝试详细解释每个命令的作用。拿出一张纸,把它全部写出来。在man中查找在所有不能很好理解的命令和参数。
    • 这个有些过早了,但为什么你能作为user1来发出删除命令,从你的主目录中删除tmp.img,考虑到tmp.img由 root 创建?