用go写一个docker(3)-linux的proc

​proc是虚拟文件系统,放在内存里面。

root@xxg_txy:~# ls /proc/
1      1114   13     15     18922  22     27     30153  35    435   78    8638       consoles     interrupts   kpageflags    partitions     sysvipc
10     1130   1303   16     18923  22846  270    3020   36    436   79    8639       cpuinfo      iomem        loadavg       sched_debug    thread-self
1018   1136   13219  166    18924  23     2709   30220  3669  437   7973  89         crypto       ioports      locks         schedstat      timer_list
10220  1137   13947  17     18925  23080  27712  30499  3693  438   8     9          devices      irq          mdstat        scsi           tty
1030   116    14     1768   18926  24     28     308    3695  439   80    979        diskstats    kallsyms     meminfo       self           uptime
1045   11748  14156  18     18927  24012  28662  3262   3696  441   81    98         dma          kcore        misc          slabinfo       version
1046   12     14162  18247  18928  24014  28912  327    3697  6     82    acpi       driver       keys         modules       softirqs       version_signature
1056   12150  14163  18908  19     24015  29     328    3698  7     83    buddyinfo  execdomains  key-users    mounts        stat           vmallocinfo
1061   12152  14209  18919  2      24401  2955   3312   3699  7388  8623  bus        fb           kmsg         mtrr          swaps          vmstat
1073   12153  14281  18920  20     25     2996   3327   3700  7463  8628  cgroups    filesystems  kpagecgroup  net           sys            zoneinfo
11     1299   14314  18921  21     26     30     34     4     7571  8636  cmdline    fs           kpagecount   pagetypeinfo  sysrq-trigger

数字对应进程id,里面存放的是一些进程信息,比如这里的1137:

root@xxg_txy:~# ls /proc/1137
attr       clear_refs       cpuset   fd       limits     mem         net        oom_score      personality  schedstat  smaps_rollup  status   timerslack_ns
autogroup  cmdline          cwd      fdinfo   loginuid   mountinfo   ns         oom_score_adj  projid_map   sessionid  stack         syscall  uid_map
auxv       comm             environ  gid_map  map_files  mounts      numa_maps  pagemap        root         setgroups  stat          task     wchan
cgroup     coredump_filter  exe      io       maps       mountstats  oom_adj    patch_state    sched        smaps      statm         timers

exe是进程的执行文件,可以看到1137是一个nginx:

root@xxg_txy:~# ll /proc/1137/exe 
lrwxrwxrwx 1 root root 0 Nov 27 15:19 /proc/1137/exe -> /usr/sbin/nginx*

用ps看下:

root@xxg_txy:~# ps aux | grep 1137
root      1137  0.0  0.1  33472  2060 ?        Ss   Oct19   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;

可以看到确实是nginx。

这里把proc的文件目录分为以下几部分:

1.进程信息,用数字命名的目录

2.硬件信息,只读,如cpuinfo,devices

3.内核,如interrupts,存放的是中断信息

进程信息

进程长什么样,全部都在这下面了。重点介绍下面几个:

cgroup
net
ns

cgroup

root@xxg_txy:/proc# cat 1137/cgroup 
12:perf_event:/
11:hugetlb:/
10:devices:/system.slice/nginx.service
9:net_cls,net_prio:/
8:rdma:/
7:cpuset:/
6:cpu,cpuacct:/system.slice/nginx.service
5:pids:/system.slice/nginx.service
4:blkio:/system.slice/nginx.service
3:freezer:/
2:memory:/system.slice/nginx.service
1:name=systemd:/system.slice/nginx.service
0::/system.slice/nginx.service

cgroup后面会单独介绍一篇,这里先简单说一下。
进程下的cgroup文件记录了进程所属的cgroup信息,每行内容分三部分,用:隔开。
第一列是所属的cgroup树的id

第二列是和 cgroup 树绑定的所有 subsystem

第三列是进程在 cgroup 树中的路径

net

root@xxg_txy:/proc# ls 1137/net/
anycast6   dev_snmp6     if_inet6       ip6_mr_vif         ip_tables_targets  netlink    ptype      rt_acct   sockstat6     udp       wireless
arp        fib_trie      igmp           ip_mr_cache        ipv6_route         netstat    raw        rt_cache  softnet_stat  udp6      xfrm_stat
connector  fib_triestat  igmp6          ip_mr_vif          mcfilter           packet     raw6       snmp      stat          udplite
dev        icmp          ip6_flowlabel  ip_tables_matches  mcfilter6          protocols  route      snmp6     tcp           udplite6
dev_mcast  icmp6         ip6_mr_cache   ip_tables_names    netfilter          psched     rt6_stats  sockstat  tcp6          unix

顾名思义,net下存放的就是进程的网络信息。如果学了计算机网络,看到这些文件名称就很亲切了:各种协议的数据信息。比如ARP协议:

root@xxg_txy:/proc# cat 1137/net/arp 
IP address       HW type     Flags       HW address            Mask     Device
172.16.0.1       0x1         0x2         fe:ee:80:9f:32:47     *        eth0

之后介绍docker网络时会涉及到。

ns

ns是namespace的简写,记录了进程所属的namespace信息。namespace后面也会单独拿一篇来介绍。

root@xxg_txy:/proc# ll 1137/ns
total 0
dr-x--x--x 2 root root 0 Dec 25 02:09 ./
dr-xr-xr-x 9 root root 0 Nov 27 15:18 ../
lrwxrwxrwx 1 root root 0 Dec 25 02:53 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 net -> 'net:[4026531993]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 uts -> 'uts:[4026531838]'

硬件信息

标识了系统的硬件信息,只读。这里简单介绍几个:

/proc/cpuinfo cpu的信息
/proc/meminfo 内存信息
/proc/devices 已经加载的设备
/proc/diskstats 硬盘信息
/proc/mounts 挂载信息
/proc/scsi/scsi SCSI设备信息

内核信息

还有一些文件是直接和内核打交道的,这里把它归类为内核信息。其中的一些文件是只读的,还有一些是可写的,即时生效。

比如/proc/sys下的文件是可修改的,修改后在整个系统的生命周期内都是有效的(除非重启),与之对应的命令是sysctl。

/proc/self/exe

这个文件是执行自己,用它可以实现一些特定的需求,看下面的例子:

package main
​
import (
  "os/exec"
  "syscall"
  "os"
  "fmt"
  "time"
)
​
func main() {
  if os.Args[0] == "/proc/self/exe" {
    pid := syscall.Getpid()
    fmt.Println("current 2 pid ", pid)
    return
  }
​
  cmd := exec.Command("/proc/self/exe")
  cmd.Stdout = os.Stdout
  pid := syscall.Getpid()
  fmt.Println("current 1 pid ", pid)
  if err := cmd.Start(); err != nil {
    fmt.Println(err)
  }
  time.Sleep(time.Second * 1)
}

运行后输出如下:

current 1 pid  14668
current 2 pid  14676

proc的介绍就到这里,谢谢阅读。

要下载docker-compose-linux-aarch64,你可以按照以下步骤进行操作: 1. 打开终端并通过命令行登录到你的Linux aarch64服务器。 2. 访问docker官方的GitHub仓库,你可以通过以下链接找到适合你的平台:https://github.com/docker/compose/releases。 3. 在该页面中,找到最新的docker-compose版本,并在列表里找到以docker-compose-Linux-aarch64开头的文件。点击该文件以查看其下载链接。 4. 复制下载链接,并在终端中使用wget命令来下载文件。例如,使用以下命令进行下载: wget [下载链接] 在命令中要替换[下载链接]为你从GitHub仓库中复制的链接地址。 5. 下载完成后,你将在当前目录下找到一个docker-compose开头的文件。通过运行以下命令,给予该文件执行权限: chmod +x docker-compose 6. 现在,你可以将docker-compose文件移动到你想要存放的位置,例如/usr/local/bin/目录。可以使用以下命令进行移动操作: sudo mv docker-compose /usr/local/bin/ 7. 最后,你可以通过运行docker-compose版本检查命令来验证下载是否成功。使用以下命令进行检查: docker-compose --version 如果成功安装,命令行将显示docker-compose的版本信息。 通过按照以上步骤进行操作,你将能够成功下载并安装docker-compose-linux-aarch64。请注意,确保你的Linux服务器是基于aarch64架构的,否则可能会导致下载的文件不可用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值