linux inode 简单理解

Inode是 linux 操作系统中的一种数据结构,包含了各文件相关的一些重要信息。在创建文件系统时,就会同时创建大量的inode,一般inode表会占用文件系统磁盘空间的1%,inode的中文译名为”索引节点”。

我们对一个文件进行操作,如vi编辑,系统在inode表中找到inode编号(inumber),才允许我们打开该inode。

当文件的inode分派给一个用户时,另一个用户如果要操作这个文件时,就要等该inode释放了才可以操作。

查看

ls -i # 看文件inode节点号

df -i # 查看硬盘分区的inode总数和已使用情况

特点

inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode的大小,一般是128字节或256字节。通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数。inode总数在格式化的时候就确定了。

由于inode号码与文件名分离,导致一些Unix/Linux系统具备以下几种特有的现象。

  1. 文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用,
find ./* -inum 节点号 -delete
  1. 移动文件或重命名文件,只是改变文件名,不影响inode号。
  2. 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。

这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

inode耗尽故障

由于每个文件必须有一个inode,因此就有可能发生inode节点用光,但硬盘空间还剩不少,却无法创建新文件的情况。

参考资料


Linux下使用 PDFtk 进行命令行操作pdf

Linux下的一些操作,第一时间想到的还是命令行。

最近要对pdf进行操作,便找到了、这个工具——PDFtk: the pdf tool kit,简单易用。这篇文章做个记录。

功能

PDFtk 目前分为三个版本:

  • PDFtk Server:命令行工具。支持 windows、Linux、Mac。
  • PDFtk Free:图形界面基础免费版;仅限 windows 用户;功能仅限于 PDF 合并和分割;
  • PDFtk Pro:图形界面专业收费版;仅限 windows 用户,可以对 PDF 文档进行合并、分割、旋转、加水印、加邮戳、加密。

对于 Linux 用户,唯一的选择是免费的 PDFtk Server,功能与收费 PDFtk Pro 完全相同。

  • 合并 PDF;
  • 分割 PDF 页面;
  • 旋转 PDF 页面;
  • PDF 带密码访问;
  • PDF 填加密码;
  • 用 X/FDF 填写 PDF 表格;
  • 从 PDF 表格中生成 PDF Data Stencils;
  • 加背景水印或前景印章;
  • 报告 PDF Metrics,书签和元数据;
  • 增加 / 更新 PDF 书签或元数据;
  • 给 PDF 页面或文档加附件;
  • 解压 PDF 附件;
  • 分解 PDF 文档为多个单页;
  • 解压缩和重压缩页面流;
  • 修复受损的 PDF 文档;

安装

Linux上安装:

$ sudo apt-get install pdftk # Debian/Ubuntu
$ sudo yum install pdftk # CentOS

Mac上安装:

$ brew install https://raw.githubusercontent.com/turforlag/homebrew-cervezas/master/pdftk.rb

用法示例

具体选项看这里: http://www.pdflabs.com/docs/pdftk-man-page/,

#提取1-15页为一个文件
$ pdftk input.pdf cat 1-15 output new.pdf

#提取第1至3,第5,第6至10页,并合并为一个pdf文件
$ pdftk input.pdf cat 1-3 5 6-10 output combined.pdf

#合并(concatenate) 前面所有的pdf为output.pdf
$ pdftk file1.pdf file2.pdf ... cat output new.pdf

#拆分PDF的每一页为一个新文件 并按照指定格式设定文件名
$ pdftk input.pdf burst output new_%d.pdf

#按照通配符,合并大量PDF文件
$ pdftk *.pdf cat output combined.pdf

#去除第 13 页,其余的保存为新PDF
$ pdftk in.pdf cat 1-12 14-end output out1.pdf

#扫描一本书,odd.pdf 为书的全部奇数页,even.pdf 为书的全部偶数页,下面的命令可以将两个 pdf 合并成页码正常的书
$ pdftk A=odd.pdf B=even.pdf shuffle A B output collated.pdf

#按180°旋转所有页面
$ pdftk input.pdf cat 1-endsouth output output.pdf

#按顺时针90°旋转第三页,其他页不变
$ pdftk input.pdf cat 1-2 3east 4-end output output.pdf

#输入密码转换成无密码PDF
pdftk secured.pdf input_pw foopass output unsecured.pdf

例子原文,一些翻译如下:

加密 PDF:

pdftk secured.pdf input_pw foopass output unsecured.pdf

PDF 128 位加密,保留全部权限:

pdftk 1.pdf output 1.128.pdf owner_pw foopass

PDF 128 位加密,保留全部权限,打开文档需输入密码 “baz”:

pdftk 1.pdf output 1.128.pdf owner_pw foo user_pw baz

PDF 128 位加密,打开文档需输入密码 “baz”,保留打印之外的其他权限:

pdftk 1.pdf output 1.128.pdf owner_pw foo user_pw baz allow printing

合并 in1.pdf 和 in2.pdf 到新 PDF 中:

pdftk in1.pdf in2.pdf cat output out1.pdf
pdftk *.pdf cat output combined.pdf

去除 in1.pdf 中的第 13 页,并创建 out1.pdf:

pdftk in.pdf cat 1-12 14-end output out1.pdf

对输出进行 40 位加密,撤销所有权限,设置 owner 密码为 foopass:

pdftk 1.pdf 2.pdf cat output 3.pdf encrypt_40bit owner_pw foopass

解压 PDF 页面流,然后就可以在文本编辑器中编辑 PDF 文件:

pdftk doc.pdf output doc.unc.pdf uncompress

压缩 PDF:

pdftk mydoc.pdf output mydoc.clear.pdf compress

修复破损的 PDF:

pdftk broken.pdf output fixed.pdf

将一个 PDF 文档分割成一页一个文档:

pdftk in.pdf burst

将一个 PDF 文档分割成一页一个文档,并加密,允许低质量的打印:

pdftk in.pdf burst owner_pw foopass allow DegradedPrinting

获取 PDF 问的元数据和书签信息:

pdftk in.pdf dump_data output report.txt

将 PDF 第一页顺时针旋转 90 度:

pdftk in.pdf cat 1east 2-end output out.pdf

将整个 PDF 文档旋转 180 度:

pdftk in.pdf cat 1-endsouth output out.pdf

修改目录

  • 提取PDF的目录结构为一个txt文件
  • 手动修改txt文件中的目录结构
  • 将txt文件重新加载到PDF中并生成一个新文件
# 提取信息
$ pdftk sample.pdf dump_data output info.txt

# 修改信息
# ...

# 把更改的信息加载回PDF
$ pdftk sample.pdf update_info info.txt output sample2.pdf

参考资料


docker 运行 mysql 客户端 phpmyadmin

我喜欢 navicat 这个客户端。但毕竟是收费的,总是用着破解版也不是个办法,还要去找源。

我平时使用的多是 postgresql,用的官方的 pgadmin,也是容器化部署。

Mysql的最有名的还是 phpmyadmin ,简单记录一下yaml文件。

version: "3.1"

services:
  phpmyadmin:
    image: phpmyadmin
    container_name: pma
    network_mode: bridge
    ports:
      - 13306:80
    environment:
      - PMA_HOST=10.19.0.230
      - PMA_PORT=13306
      - PMA_ARBITRARY=1
      - PMA_USER=user
      - PMA_PASSWORD=password

更多变量参数可直接参考官方:https://hub.docker.com/_/phpmyadmin


非插件生成jekyll的 sitemap

网上搜到的jekyll生成网站地图 sitemap 大多是使用插件的,而我懒得研究插件,按照 sitemap 格式生成也并不复杂,使用 {% for post in site.posts %}{% for page in site.pages %} 遍历,自个儿生成即可。

一、sitemap

sitemap.xml文件是严格按照xml语言编写的网站地图,用来引导搜索蜘蛛对本站点文章等内容的索引,它是由google提出来的概念。

sitemap的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://blog.kelu.org/tech/2021/12/25/git-config-list.html</loc>
        <lastmod>2021-12-25T00:00:00+08:00</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>

语法简单。

  • 首尾格式

    <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    ...
    </urlset>
    
  • <loc></loc>

    必填。格式为: http://www.xxx.com/xxx,此网址应以协议开始(例如:http)并以斜线结尾。此值应少于 2048 个字符。

  • <lastmod>

    可选标签 标签含义:该文件上次修改的日期。此日期应采用 W3C Datetime 格式。

    如果需要的话,此格式允许省略时间部分,而仅使用 YYYY-MM-DD。

  • <changefreq>

    可选标签 标签含义:页面可能发生更改的频率。此值为搜索引擎提供一般性信息,与搜索引擎抓取页面的频率不完全相关。有效值为:

    always 
    hourly 
    daily 
    weekly 
    monthly 
    yearly 
    never
    
  • <priority>

    可选标签 有效值范围从 0.0 到 1.0。标签含义: 告诉搜索引擎您认为您的那个网页最重要,从而它们对您页面的抓取可以按照您最喜欢的方式进 行排序。

  • changefreq则是指内容更新的频率。

有了这些设置,等于告诉搜索引擎机器人,网站的更新情况如何,以及希望搜索引擎优先收录哪些内容。

二、创建文件

  1. jekyll 环境变量设置为 production

    参考:https://jekyllrb.com/news/2016/10/06/jekyll-3-3-is-here/#3-siteurl-is-set-by-the-development-server

    我是容器启动的,所以增加类似的变量:

    services:
      blog:
        command: jekyll serve
        image: jekyll/jekyll:latest
        container_name: blog
        restart: always
        volumes:
          - ./:/srv/jekyll
        environment:
          JEKYLL_UID: 0
          JEKYLL_GID: 0
          JEKYLL_ENV: production
        ports:
          - '4000:4000'
    
  2. 配置文件_config.yml增加域名信息。

    参考: https://jekyllrb.com/docs/variables/

    例如我的:

    url: https://blog.kelu.org
    
  3. 在目录下创建 sitemap.xml 文件。

    以下是我根据自己个人情况的写法,供参考。

    一些变量和表达式可以参考:

    ---
    ---
    <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        {% for post in site.posts %}
        <url>
            <loc>{{ site.url }}{{ post.url | remove: 'index.html' }}</loc> {% if post.sitemap.lastmod %}
            <lastmod>{{ post.sitemap.lastmod | date: "%Y-%m-%d" }}</lastmod> {% elsif post.date %}
            <lastmod>{{ post.date | date_to_xmlschema }}</lastmod> {% else %}
            <lastmod>{{ site.time | date_to_xmlschema }}</lastmod> {% endif %}
            <changefreq>weekly</changefreq>
            <priority>0.7</priority>
        </url> {% endfor %}
        {% for page in site.pages %} {% if page.layout != nil %} {% if page.layout != 'redirect' %}
        <url>
            <loc>{{ site.url }}{{ page.url | remove: 'index.html' }}</loc> {% if page.sitemap.lastmod %}
            <lastmod>{{ page.sitemap.lastmod | date: "%Y-%m-%d" }}</lastmod> {% elsif page.date %}
            <lastmod>{{ page.date | date_to_xmlschema }}</lastmod> {% else %}
            <lastmod>{{ site.time | date_to_xmlschema }}</lastmod> {% endif %}
            <changefreq>weekly</changefreq> {% assign uri_array = page.url | remove: 'index.html' | split: "/" %}{% assign cata1 = uri_array.last | slice: 0,4 %} {% assign cata2 = uri_array.last | slice: -4,4 %} {% if page.url == '/' %}
            <priority>1</priority> {% elsif uri_array.size > 2 %}
            <priority>0.2</priority> {% elsif cata1 == 'page' %}
            <priority>0.1</priority> {% elsif cata2 == 'html' %}
            <priority>1</priority> {% else %}
            <priority>0.3</priority> {% endif %}
        </url> {% endif %} {% endif %} {% endfor %}
    </urlset>
    

三、生成

jekyll serve

参考链接