1. 写一段脚本,或者一个验证过程来证明如果linux系统达到最大文件打开数后,无法打开新的文件。思考下如何找到现在正在打开的文件是哪些,有多少? ```bash

    查看资源限制

    chaos-MacBook-Pro:~ chao$ ulimit -a
    core file size (blocks, -c) 0 # core 文件大小 data seg size (kbytes, -d) unlimited # 程序数据节区的最大值 file size (blocks, -f) unlimited # 文件大小 max locked memory (kbytes, -l) unlimited # 最大锁住的内存大小 max memory size (kbytes, -m) unlimited # 最大的内存限制 open files (-n) 256 # 同时可打开的文件数 pipe size (512 bytes, -p) 1 # 缓冲区大小 stack size (kbytes, -s) 8192 # 栈大小 cpu time (seconds, -t) unlimited # cpu使用时间上限 max user processes (-u) 709 # 程序数目 virtual memory (kbytes, -v) unlimited # 虚拟内存

临时调整同时可打开的文件数,方便实验

chaos-MacBook-Pro:~ chao$ ulimit -n 10 # 设置同时最大可以打开10个文件

创建20个文件

chaos-MacBook-Pro:file_test chao$ touch file{1..20}.txt

合并多个文件

chaos-MacBook-Pro:file_test chao$ paste file{1..20}.txt paste: file8.txt: Too many open files

查看当前打开的文件

chaos-MacBook-Pro:file_test chao$ lsof | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME loginwind 92 chao cwd DIR 1,4 1224 2 / loginwind 92 chao txt REG 1,4 1259472 13121894 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow loginwind 92 chao txt REG 1,4 26771408 3454717 /usr/share/icu/icudt59l.dat loginwind 92 chao txt REG 1,4 115856 13135229 /System/Library/LoginPlugins/DisplayServices.loginPlugin/Contents/MacOS/DisplayServices loginwind 92 chao txt REG 1,4 114224 3434490 /System/Library/LoginPlugins/FSDisconnect.loginPlugin/Contents/MacOS/FSDisconnect loginwind 92 chao txt REG 1,4 239648 12468709 /private/var/db/timezone/tz/2019c.1.0/icutz/icutz44l.dat loginwind 92 chao txt REG 1,4 4411240 3422183 /System/Library/CoreServices/SystemAppearance.bundle/Contents/Resources/SystemAppearance.car loginwind 92 chao txt REG 1,4 359744 13135221 /System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/MacOS/BezelServices loginwind 92 chao txt REG 1,4 258352 13125082 /System/Library/Extensions/IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin/Contents/MacOS/IOHIDLib

计算当前打开的文件数量

chaos-MacBook-Pro:file_test chao$ lsof | wc -l
6680

  1. 2. 实现从一台机器rsync一个文件到另一个文件不需要输入密码的功能。如何创造两台主机,如果有困难的可以找我们要一台云主机,助教这边分配一个临时的账号。实现这个功能。
  2. 方法一、在客户端通过设置RSYNC_PASSWORD实现自动登陆<br />服务端准备工作
  3. ```bash
  4. # 添加同步账号
  5. [root@localhost ~]# useradd rsync -s /sbin/nologin -M
  6. # 创建同步数据目录
  7. [root@localhost ~]# mkdir /backup
  8. # 给目录添加rsync账号权限
  9. [root@localhost ~]# chown rsync.rsync /backup
  10. # 启动rsync
  11. [root@localhost ~]# rsync -daemon

在服务端修改或创建 /etc/rsyncd.conf 内容如下

  1. uid = rsync # 运行rsync守护进程的用户
  2. gid = rsync # 运行rsync守护进程的用户组
  3. use chroot = no # 不实用chroot
  4. max connections = 4 #最大连接数为4
  5. pid file = /var/run/rsyncd.pid #
  6. lock file = /var/run/rsync.lock
  7. log file = /var/log/rsyncd.log
  8. ignore errors
  9. read only = false
  10. exclude = lost+found/
  11. transfer logging = yes
  12. timeout = 900
  13. ignore nonreadable = yes
  14. dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
  15. auth users = rsync_backup # 认证的用户名
  16. secrets file = /etc/rsync.password # 认证的密码
  17. [backup] # 认证模块名,在client端需要指定
  18. path = /root/backup # 模块指定的镜像目录
  19. comment = backup export area # 注释

rsync.password 中的内容

  1. [root@localhost ~]# cat /etc/rsync.password
  2. rsync_backup:abc123

在客户端保存密码

  1. chaos-MacBook-Pro:file_test chao$ export RSYNC_PASSWORD=abc123

测试在客户端上传文件到服务端

  1. chaos-MacBook-Pro:file_test chao$ rsync file2.txt rsync_backup@192.168.183.136::backup

rsync file2.txt ``rsync_backup``@192.168.183.136::``backup。其中rsync_backup 是用户名,
backup 是认证模块名

方法二、使用ssh实现免密登陆
客户端配置

  1. # 生成ssh公钥
  2. chaos-MacBook-Pro:file_test chao$ ssh-keygen
  3. # 将公钥下发送给服务端
  4. chaos-MacBook-Pro:file_test chao$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.183.134

服务端配置

  1. # 修改sshconf,添加以下代码
  2. [root@localhost ~]# vim /etc/ssh/ssh_config
  3. Host *
  4. PasswordAuthentication yes
  5. GSSAPIAuthentication yes
  6. RSAAuthentication yes
  7. PubkeyAuthentication yes
  8. AuthorizedKeysFile /root/.ssh/authorized_keys
  9. # 重启 ssh 服务
  10. [root@localhost ~]# service sshd restart

测试在客户端免密同步文件

  1. chaos-MacBook-Pro:file_test chao$ rsync -avL file12.txt root@192.168.183.134:/backup
  1. 如何证明自己配置的114.114.114.114这个dns是正确工作的? ```bash

    安装 bind-utils 包

    [root@localhost ~]# yum install bind-utils

修改 /etc/resolv.conf 内容,指定 dns 服务器为114.114.114.114

[root@localhost ~]# cat /etc/resolv.conf

Generated by NetworkManager

search localdomain

nameserver 192.168.183.2

nameserver 114.114.114.114

使用 nsloopup 查看baidu的地址

[root@localhost ~]# nslookup www.baidu.com Server: 114.114.114.114 # 使用的dns服务器 Address: 114.114.114.114#53

Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 182.61.200.6 Name: www.a.shifen.com Address: 182.61.200.7

使用 dig 查看baidu的地址

[root@localhost ~]# dig www.baidu.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> www.baidu.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23013 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.baidu.com. IN A

;; ANSWER SECTION: www.baidu.com. 53 IN CNAME www.a.shifen.com. www.a.shifen.com. 56 IN A 182.61.200.7 www.a.shifen.com. 56 IN A 182.61.200.6

;; AUTHORITY SECTION: shifen.com. 69637 IN NS ns2.baidu.com. shifen.com. 69637 IN NS ns3.baidu.com. shifen.com. 69637 IN NS ns4.baidu.com. shifen.com. 69637 IN NS dns.baidu.com.

;; ADDITIONAL SECTION: ns2.baidu.com. 67384 IN A 220.181.33.31 ns3.baidu.com. 67361 IN A 112.80.248.64 ns4.baidu.com. 67411 IN A 14.215.178.80

;; Query time: 7 msec ;; SERVER: 114.114.114.114#53(114.114.114.114) # 使用的dns服务器 ;; WHEN: Sat Apr 25 03:45:27 EDT 2020 ;; MSG SIZE rcvd: 221

  1. 4. github上创建一个自己的账号,创建一个自己的项目data。并实现如果动作
  2. - 假定项目当前目录是/data,将这个项目创建在/data目录下。在data下创建一个目录work(/data/work),在work目录下创建一个文件readme,并在这个文件中写入 readme version1.0
  3. ```bash
  4. chaos-MacBook-Pro:data chao$ mkdir work && cd work
  5. chaos-MacBook-Pro:work chao$ echo "readme version1.0" >> readme
  6. chaos-MacBook-Pro:work chao$ cat readme
  7. readme version1.0
  • 创建一个目录src,在src目录下创建一个文件 hello_world.c,并在这个文件中写入src version1.0

    1. chaos-MacBook-Pro:work chao$ mkdir src
    2. chaos-MacBook-Pro:work chao$ echo "src version1.0" >> src/hello_world.c
    3. chaos-MacBook-Pro:work chao$ cat src/hello_world.c
    4. src version1.0
  • 写完后,对整个项目打一个tag 1.0 ```bash

    初始化git项目

    chaos-MacBook-Pro:work chao$ git init

    设置远程仓库地址

    chaos-MacBook-Pro:work chao$ git remote add origin git@github.com:liuchao233/data.git

提交代码

chaos-MacBook-Pro:work chao$ git add . chaos-MacBook-Pro:work chao$ git commit -m “first commit” [master (root-commit) 8ee4f4a] first commit 2 files changed, 2 insertions(+) create mode 100644 readme create mode 100644 src/hello_world.c chaos-MacBook-Pro:work chao$ git push -u origin master

添加标签 1.0

chaos-MacBook-Pro:work chao$ git tag 1.0
chaos-MacBook-Pro:work chao$ git tag
1.0

提交本地的标签

chaos-MacBook-Pro:work chao$ git push —tags Total 0 (delta 0), reused 0 (delta 0) To github.com:liuchao233/data.git

  • [new tag] 1.0 -> 1.0
  1. - 修改hello_world.c 并在文件中把 src version1.0 改为 src version 2.0
  2. ```bash
  3. chaos-MacBook-Pro:work chao$ echo "src version 2.0" > src/hello_world.c
  4. chaos-MacBook-Pro:work chao$ cat src/hello_world.c
  5. src version 2.0
  • 将hello_world.c check in 到主分支(master)上。

    1. chaos-MacBook-Pro:work chao$ git add .
    2. chaos-MacBook-Pro:work chao$ git commit -m "update src/hello_world version"
    3. chaos-MacBook-Pro:work chao$ git push
  • 此时从另外一个机器,或者本机另一个目录取(/test)当前主分支的文件,看看readme和hello_world.c里面都是什么? ```bash chaos-MacBook-Pro:work chao$ cd .. chaos-MacBook-Pro:data chao$ git clone git@github.com:liuchao233/data.git test
    Cloning into ‘test’… remote: Enumerating objects: 9, done. remote: Counting objects: 100% (9/9), done. remote: Compressing objects: 100% (4/4), done. remote: Total 9 (delta 0), reused 9 (delta 0), pack-reused 0 Receiving objects: 100% (9/9), done. chaos-MacBook-Pro:data chao$ cd test

查看文件内容

chaos-MacBook-Pro:test chao$ cat readme
readme version1.0 chaos-MacBook-Pro:test chao$ cat src/hello_world.c
src version 2.0

  1. - 在/test/目录下取tag1.0,看看readmehello_world.c都是什么内容,理解tag的含义
  2. ```bash
  3. # 查看 tag 信息
  4. chaos-MacBook-Pro:test chao$ git tag
  5. 1.0
  6. # 切换到tag 1.0
  7. chaos-MacBook-Pro:test chao$ git checkout 1.0
  8. Note: checking out '1.0'.
  9. You are in 'detached HEAD' state. You can look around, make experimental
  10. changes and commit them, and you can discard any commits you make in this
  11. state without impacting any branches by performing another checkout.
  12. If you want to create a new branch to retain commits you create, you may
  13. do so (now or later) by using -b with the checkout command again. Example:
  14. git checkout -b <new-branch-name>
  15. HEAD is now at 8ee4f4a first commit
  16. # 查看文件内容
  17. chaos-MacBook-Pro:test chao$ cat readme
  18. readme version1.0
  19. chaos-MacBook-Pro:test chao$ cat src/hello_world.c
  20. src version1.0
  21. # tag的意义在于为某个提交历史起别名,以示重要
  • 新创建一个目录例如叫 /work2/ 在这个目录下clone整个项目,并且修改readme的内容为 readme version3.0 (原来的内容删掉) ,并且check in 到主分支。 ```bash chaos-MacBook-Pro:test chao$ cd .. chaos-MacBook-Pro:data chao$ git clone git@github.com:liuchao233/data.git work2
    Cloning into ‘work2’… remote: Enumerating objects: 9, done. remote: Counting objects: 100% (9/9), done. remote: Compressing objects: 100% (4/4), done. remote: Total 9 (delta 0), reused 9 (delta 0), pack-reused 0 Receiving objects: 100% (9/9), done.

修改文件内容

chaos-MacBook-Pro:data chao$ cd work2 chaos-MacBook-Pro:work2 chao$ echo “readme version3.0” > readme
chaos-MacBook-Pro:work2 chao$ cat readme readme version3.0

提交代码

chaos-MacBook-Pro:work2 chao$ git add . chaos-MacBook-Pro:work2 chao$ git commit -m “update readme version to 3.0” [master cdb2b9c] update readme version to 3.0 1 file changed, 1 insertion(+), 1 deletion(-)

chaos-MacBook-Pro:work2 chao$ git push
Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 294 bytes | 294.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To github.com:liuchao233/data.git b4ac364..cdb2b9c master -> master

  1. - 然后在之前目录 /data/ 下修改readme的内容为readme version2.0 (原来的内容删掉),并且 check in 都主分支,此时会发生什么情况?如何解决冲突?
  2. ```bash
  3. # 修改文件内容
  4. chaos-MacBook-Pro:work2 chao$ cd ../work
  5. chaos-MacBook-Pro:work chao$ echo "readme version2.0" > readme
  6. # 提交代码
  7. chaos-MacBook-Pro:work chao$ git add .
  8. chaos-MacBook-Pro:work chao$ git commit -m "update readme to version2.0"
  9. [master 20803d1] update readme to version2.0
  10. 1 file changed, 1 insertion(+), 1 deletion(-)
  11. chaos-MacBook-Pro:work chao$ git push
  12. To github.com:liuchao233/data.git
  13. ! [rejected] master -> master (fetch first)
  14. error: failed to push some refs to 'git@github.com:liuchao233/data.git'
  15. hint: Updates were rejected because the remote contains work that you do
  16. hint: not have locally. This is usually caused by another repository pushing
  17. hint: to the same ref. You may want to first integrate the remote changes
  18. hint: (e.g., 'git pull ...') before pushing again.
  19. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决冲突(手动)

  1. # 1. 创建临时分支 temp 内容和远程主分支相同
  2. chaos-MacBook-Pro:work chao$ git fetch origin master:temp
  3. From github.com:liuchao233/data
  4. * [new branch] master -> temp
  5. # 合并本地master分支和temp分支
  6. chaos-MacBook-Pro:work chao$ git merge temp
  7. Auto-merging readme
  8. CONFLICT (content): Merge conflict in readme
  9. Automatic merge failed; fix conflicts and then commit the result.
  10. # 查看当前分支状态,显示readme文件存在冲突
  11. chaos-MacBook-Pro:work chao$ git status
  12. On branch master
  13. Your branch and 'origin/master' have diverged,
  14. and have 1 and 1 different commits each, respectively.
  15. (use "git pull" to merge the remote branch into yours)
  16. You have unmerged paths.
  17. (fix conflicts and run "git commit")
  18. (use "git merge --abort" to abort the merge)
  19. Unmerged paths:
  20. (use "git add <file>..." to mark resolution)
  21. both modified: readme
  22. no changes added to commit (use "git add" and/or "git commit -a")
  23. 查看readme文件内容, HEAD 中是当前分支修改的内容,下面是其他分支修改的内容
  24. chaos-MacBook-Pro:work chao$ cat readme
  25. <<<<<<< HEAD
  26. readme version2.0
  27. =======
  28. readme version3.0
  29. >>>>>>> temp
  30. # 只保留当前分支的修改,删除冲突内容
  31. chaos-MacBook-Pro:work chao$ echo "readme version2.0" > readme
  32. # 提交代码
  33. chaos-MacBook-Pro:work chao$ git add readme
  34. chaos-MacBook-Pro:work chao$ git commit -m "conflict fixed"
  35. [master f2a9fec] conflict fixed
  36. chaos-MacBook-Pro:work chao$ git push
  37. Enumerating objects: 8, done.
  38. Counting objects: 100% (8/8), done.
  39. Delta compression using up to 4 threads
  40. Compressing objects: 100% (3/3), done.
  41. Writing objects: 100% (4/4), 472 bytes | 39.00 KiB/s, done.
  42. Total 4 (delta 0), reused 0 (delta 0)
  43. To github.com:liuchao233/data.git
  44. cdb2b9c..f2a9fec master -> master
  45. # 删除临时分支
  46. chaos-MacBook-Pro:work chao$ git branch -D temp
  47. Deleted branch temp (was cdb2b9c).

使用rebase 解决冲突

  1. # 1. 创建临时分支 temp 内容和远程主分支相同
  2. chaos-MacBook-Pro:work chao$ git fetch origin master:temp
  3. From github.com:liuchao233/data
  4. * [new branch] master -> temp
  5. # rebase temp分支到 master分支
  6. chaos-MacBook-Pro:work chao$ git rebase temp
  7. First, rewinding head to replay your work on top of it...
  8. Applying: update readme
  9. Using index info to reconstruct a base tree...
  10. M readme
  11. Falling back to patching base and 3-way merge...
  12. Auto-merging readme
  13. CONFLICT (content): Merge conflict in readme
  14. error: Failed to merge in the changes.
  15. Patch failed at 0001 update readme
  16. hint: Use 'git am --show-current-patch' to see the failed patch
  17. Resolve all conflicts manually, mark them as resolved with
  18. "git add/rm <conflicted_files>", then run "git rebase --continue".
  19. You can instead skip this commit: run "git rebase --skip".
  20. To abort and get back to the state before "git rebase", run "git rebase --abort".
  21. # 查看冲突内容
  22. chaos-MacBook-Pro:work chao$ git diff
  23. diff --cc readme
  24. index 72d1aee,51a2ba0..0000000
  25. --- a/readme
  26. +++ b/readme
  27. @@@ -1,1 -1,1 +1,5 @@@
  28. ++<<<<<<< HEAD
  29. +readme version2.0
  30. ++=======
  31. + readme version4.0
  32. ++>>>>>>> update readme
  33. chaos-MacBook-Pro:work2 chao$ git checkout --theirs readme
  34. chaos-MacBook-Pro:work2 chao$ git add readme
  35. chaos-MacBook-Pro:work2 chao$ git rebase --continue
  36. Applying: update readme
  37. # 查看提交信息,可以看到rebase 合并代码不会产生新的分支,merge合并代码会产生分支
  38. chaos-MacBook-Pro:work2 chao$ git log --graph --pretty=oneline --abbrev-commit
  39. * 901e648 (HEAD -> master, origin/master, origin/HEAD) update readme
  40. * de51fe4 (temp) update to 2
  41. * e9542c9 update readme version to 3.0
  42. * dda3198 add pub_content/pub_icon
  43. * f2a9fec conflict fixed
  44. |\
  45. | * cdb2b9c update readme version to 3.0
  46. * | 20803d1 update readme to version2.0
  47. |/
  48. * b4ac364 update src/hello_world version
  49. * 8ee4f4a (tag: 1.0) first commit
  • 创建一个名为pub的分支(pub是发布的意思),切换到该分支,然后创建一个目录 pub_content,在这个目录下创建一个空文件 pub_icon,并提交到pub分支。 ```bash

    创建新的分支

    chaos-MacBook-Pro:work chao$ git checkout -b pub Switched to a new branch ‘pub’

添加文件

chaos-MacBook-Pro:work chao$ mkdir pub_content chaos-MacBook-Pro:work chao$ touch pub_content/pub_icon

提交代码

chaos-MacBook-Pro:work chao$ git add . chaos-MacBook-Pro:work chao$ git commit -m “add pub_content/pub_icon” [pub dda3198] add pub_content/pub_icon 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pub_content/pub_icon

chaos-MacBook-Pro:work chao$ git push -u origin pub
Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (4/4), 355 bytes | 355.00 KiB/s, done. Total 4 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for ‘pub’ on GitHub by visiting: remote: https://github.com/liuchao233/data/pull/new/pub remote: To github.com:liuchao233/data.git

  • [new branch] pub -> pub Branch ‘pub’ set up to track remote branch ‘pub’ from ‘origin’. ```

    • 回到主分支。看到之前的目录是否可见。 ```bash

      切换到主分支

      chaos-MacBook-Pro:work chao$ git checkout master
      Switched to branch ‘master’ Your branch is up to date with ‘origin/master’.

查看当前分支项目文件

chaos-MacBook-Pro:work chao$ ls -al
total 8 drwxr-xr-x 5 chao staff 170 Apr 25 17:12 . drwxr-xr-x 5 chao staff 170 Apr 25 16:24 .. drwxr-xr-x 14 chao staff 476 Apr 25 17:12 .git -rw-r—r— 1 chao staff 18 Apr 25 16:55 readme drwxr-xr-x 3 chao staff 102 Apr 25 15:54 src

  1. - 如何将pub分支合并到主分支(merge)? 使得在主分支也能看到pub_content和里面的文件。
  2. ```bash
  3. chaos-MacBook-Pro:work chao$ git merge pub
  4. Updating f2a9fec..dda3198
  5. Fast-forward
  6. pub_content/pub_icon | 0
  7. 1 file changed, 0 insertions(+), 0 deletions(-)
  8. create mode 100644 pub_content/pub_icon
  9. chaos-MacBook-Pro:work chao$ ls -al
  10. total 8
  11. drwxr-xr-x 6 chao staff 204 Apr 25 17:14 .
  12. drwxr-xr-x 5 chao staff 170 Apr 25 16:24 ..
  13. drwxr-xr-x 14 chao staff 476 Apr 25 17:14 .git
  14. drwxr-xr-x 3 chao staff 102 Apr 25 17:14 pub_content
  15. -rw-r--r-- 1 chao staff 18 Apr 25 16:55 readme
  16. drwxr-xr-x 3 chao staff 102 Apr 25 15:54 src
  17. chaos-MacBook-Pro:work chao$ git push
  18. Total 0 (delta 0), reused 0 (delta 0)
  19. To github.com:liuchao233/data.git
  20. f2a9fec..dda3198 master -> master
  • 在/data/目录下将文件readme 内容改成了xxx,但是又后悔了,需要重取新的readme,放弃此次修改,该怎么办?尝试你的想法,并试图找到最好的方法。 ```bash

    只是修改了文件但是没有执行 git add

    chaos-MacBook-Pro:work chao$ echo “xxx” > readme
    chaos-MacBook-Pro:work chao$ git checkout — readme
    chaos-MacBook-Pro:work chao$ cat readme
    readme version2.0

修改了文件,且执行了 git add

chaos-MacBook-Pro:work chao$ echo “xxx” > readme
chaos-MacBook-Pro:work chao$ git add readme
chaos-MacBook-Pro:work chao$ git reset HEAD readme
Unstaged changes after reset: M readme chaos-MacBook-Pro:work chao$ git checkout — readme
chaos-MacBook-Pro:work chao$ cat readme
readme version2.0

```