分类 Linux 相关 下的文章

tmp 目录文件无法执行, 报 Permission denied

今天在执行 aysnc-profiler 的时候, 遇到无法执行的问题: 为了方便文件清除, 把解压后的文件放到了 /tmp 目录, 然后把 owner 和 权限都加好, 之后切换java 进程的用户去执行, 报 Permission denied.

mkdir /tmp/profiler
tar -C /tmp/profiler -xvf async-profiler-1.7.1-linux-x64.tar.gz
sudo chmod -R 755 /tmp/profiler/*
sudo chown -R appuser /tmp/profiler
sudo su appuser
/tmp/profiler/profile.sh -d 60 -o tree -e cpu -f profile0717.log.html 
/tmp/profile/profiler.sh: Permission denied

如果使用 bash 去执行, 则报:

bash /tmp/profiler/profile.sh -d 60 -o tree -e cpu -f profile0717.log.html 
/tmp/profile/profiler.sh: line 67: /tmp/profile/build/jattach: Permission denied

既然文件 owner 和 读和执行权限都加好了, 为什么还报错呢?
原来在 /tmp 目录的挂载方式:

appsuer@test-host:/home/appuser$ mount | grep /tmp
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec)

它设置了 noexec 属性. 所以问题就知道出在那里了, 既然这样, 换个目录就解决了.

Linux namespaces

namespace 表示一种对全局资源使用的隔离方式, 同一 namespace 下的进程能看到一样的资源, 不同的 namespace 不能看到其他 namespace 的变动.
ls -l /proc/<pid>/ns/
UTS IPC PID User Net Cgroup Mount Time

  1. UTS (Unix Time Sharing) namespace
    隔离跟主机名称相关的数据, 其内容包括: hostname, domain name, OS name, OS version, kernel 版本, 处理器信息等信息. 隔离之后使用 uname 这个系统调用就返回不同的值. 参看 uname 系统条用和 Linux uname 命令

    ~$ uname --help
    Usage: uname [OPTION]...
    Print certain system information.  With no OPTION, same as -s.
    
    -a, --all                print all information, in the following order,
    except omit -p and -i if unknown:
    -s, --kernel-name        print the kernel name
    -n, --nodename           print the network node hostname
    -r, --kernel-release     print the kernel release
    -v, --kernel-version     print the kernel version
    -m, --machine            print the machine hardware name
    -p, --processor          print the processor type (non-portable)
    -i, --hardware-platform  print the hardware platform (non-portable)
    -o, --operating-system   print the operating system
        --help     display this help and exit
        --version  output version information and exit
  2. IPC
    隔离跟 IPC 相关的资源: System V IPC objects & POSIX message queue. 每个 IPC namespace 都有自己的 System V IPC identifiers 和它自己的 POSIX message queue filesystem. 系统必须设置 CONFIG_IPC_NS选项.
  3. PID
    用来隔离 PID 数字的命名空间, 不同 PID 的进程号可以重复, 新的 PID namespace 的进程号从 1 开始.
  4. User
  5. Net
  6. Time

参考:

  1. https://www.kernel.org/doc/html/latest/admin-guide/namespaces/compatibility-list.html
  2. https://windsock.io/uts-namespace/
  3. https://www.informit.com/articles/article.aspx?p=23618&seqNum=16#:~:text=The%20uname%20system%20call%20fills,h%3E%20if%20you%20use%20uname.
  4. http://www.linfo.org/uname.html
  5. https://man7.org/linux/man-pages/man7/namespaces.7.html
  6. https://man7.org/linux/man-pages/man7/pid_namespaces.7.html

Linux 模块学习笔记

  1. 使用 lsmod 命令查看已经load 的内核模块, 它其实读取的是 /proc/modules 的信息
  2. 当系统需要某个内核模块的功能的时候, 如果该模块还么有加载, 作为 daemon 的 kmod 进程就会使用 modprobe 命令去加载该模块;
  3. modprobe 可以接受模块的名称, 如: softdog, 或者该模块的别名, 如: char-major-10-30. 标准名称和别名的映射在文件 /etc/modprobe.conf 中, 如: alias char-major-10-30 softdog;
  4. 模块的依赖关系在 /lib/modules/version/modules.dep 中;
  5. depmod 会创建新的依赖关系;

以上内容可能过时, 来源: https://tldp.org/LDP/lkmpg/2.6/html/x44.html

Linux kprobes & uprobes, static tracepoint knowledge links

  1. Kernel Probes: https://www.kernel.org/doc/Documentation/kprobes.txt#:~:text=Kprobes%20enables%20you%20to%20dynamically,when%20the%20breakpoint%20is%20hit.
  2. Uprobe: https://www.kernel.org/doc/Documentation/trace/uprobetracer.txt
  3. https://kernelnewbies.org/Linux_3.5#Uprobes:_userspace_probes
  4. https://lwn.net/Articles/499190/
  5. static tracepoint and how it works: https://www.kernel.org/doc/Documentation/trace/tracepoints.txt

Linux /dev/ 目录下的一些特殊文件目录

总结一些 /dev 目录下的特殊文件或目录

  1. /dev/null
    空文件, 可以往里面丢任何不想要的东西, 从里面读只能对到一个空
  2. /dev/zero
    空文件, 可以往里面丢任何不想要的东西, 从里面读能返回一个一直有空值的流, 一直返回空值
  3. /dev/shm
    shm = shared memory, 是个目录, 在内存里面开辟的tmpfs文件系统, 所以操作极快. 往里面填文件, 很快占满内存.
  4. /dev/random /dev/urandom /dev/arandom
    通过搜集系统驱动和其它源的信息, 产生伪随机数. 上述三个有区别, 比如在是不是 block 操作;