局域网cups共享打印机

https://www.cups.org/doc/sharing.html

Printer Sharing

This document discusses several ways to configure printer sharing.

The Basics

A “server” is any machine that communicates directly to a printer. A “client” is any machine that sends print jobs to a server for final printing. Clients can also be servers if they communicate directly with any printers of their own.

By default, CUPS uses the Internet Printing Protocol (IPP) to send jobs from a client to a server. When printing to legacy print servers you may also use the Line Printer Daemon (LPD) protocol when printing to older UNIX-based servers or Server Message Block (SMB) when printing to Windows® servers.

Clients can automatically discover and access shared printers via DNS Service Discovery (DNS-SD a.k.a. Bonjour®). SMB browsing can also be used to manually discover and access shared printers when Samba is installed.

Configuring the Server

You must enable printer sharing on the server before clients can print through it. The simplest way to do this is to use the cupsctl(8) command on the server:

cupsctl --share-printers

By default, the above command will allow printing from other clients on the same subnet as your server. To allow printing from any subnet, use the following command instead:

cupsctl --share-printers --remote-any

How to force fsck to check filesystem after system reboot on Linux

原文:https://linuxconfig.org/how-to-force-fsck-to-check-filesystem-after-system-reboot-on-linux

This article will explain a procedure on how to force fsck to perform a filesystem check on the next system reboot or force filesystem check for any desired number of system reboots whether it is root or non-root mount point.

Let’s start with discussion about some tools which can be used to obtain filesystem information and configurations which control filesystem check after system reboot. The tool which we are going to discuss is tune2fs filesystem managing utility. Using tune2fs we can export some important information related to filesystem health check. The following linux command will tell as when was the last time the filesystem /dev/sdX was checked:

# tune2fs -l /dev/sdbX | grep Last\ c
Last checked:             Sun Dec 13 09:14:22 2015

Anther useful information which can be retrieved by tune2fs command relates to how many times our /dev/sdX filesystem was mounted:

# tune2fs -l /dev/sdbX | grep Mount
Mount count:              157

 

and lastly how many mounts are allowed to pass before filesystem check is forced:

# tune2fs -l /dev/sdbX | grep Max
Maximum mount count:      -1

From the above outputs we can establish the following information summary. The /dev/sdbX filesystem was last checked on Sun Dec 13 09:14:22 2015. Since the last check, this filesystem was mounted 157 times and maximum amount of mounts before next filesystem fsck check. In the above case the value -1 means that fsck is disabled.



Now, that we have learned about some tune2fs basics let’s discuss PASS system configuration option found in /etc/fstab file containing all on boot mountable partitions and their relevant mount options.

# blkid | grep sdb1
/dev/sdb1: UUID="c6e22f63-e63c-40ed-bf9b-bb4a10f2db66" TYPE="ext2"
# grep c6e22f63-e63c-40ed-bf9b-bb4a10f2db66 /etc/fstab
UUID=c6e22f63-e63c-40ed-bf9b-bb4a10f2db66 /mnt            ext2    errors=remount-ro 0      0

We have used blkid command to retrieve UUID for a given partition and then used the retrieved partition UUID to get a relevant information related to /dev/sdb1 partition from /etc/fstbab.
The last column that is a column 6, aka fsck PASS column is used by fsck to determine whether fsck should check filesystem before it is mounted and in which order given partitions in /etc/fstab should be checked. Possible entries for fstab PASS column are 0,1 and 2.

  1. 0 – disabled, that is do not check filesystem
  2. 1 – partition with this PASS value has a higher priority and is check first. This value is usually set to root / partition
  3. 2 – partitions with this PASS value will be checked last

The connection between fstab PASS value, last checked value and number of mounts value is as follows:
During the system boot the first value which is checked is fstab PASS value. If this value is 0 that not other values are checked ( exemption .. see “Force fsck for root partition” below ) and the fsck will NOT perform filesystem check. If the PASS value found in /etc/fstab is any other than 0, that is 1 or 2 then values of maximum mounts and total mounts are checked. If the value of maximum mounts is greater or equal to total number of mounts value then fsck’s filesytem check will be performed. Few examples:

FSCK DISABLED
fstab PASS: 1
Maximum mount count:      -1
Mount count:              157
----
FSCK DISABLED
fstab PASS: 0
Maximum mount count:      -1
Mount count:              157
----
FSCK ON NEXT REBOOT
fstab PASS: 1 or 2
Maximum mount count:      1
Mount count:              157
----
FSCK DISABLED
fstab PASS: 0
Maximum mount count:      1
Mount count:              1
----
FSCK ON NEXT REBOOT
fstab PASS: 1 or 2
Maximum mount count:      1
Mount count:              1
----
NO FSCK ON NEXT REBOOT
fstab PASS: 1 or 2
Maximum mount count:      200
Mount count:              157


Force fsck for root partition

The simplest way to force fsck filesystem check on a root partition eg. /dev/sda1 is to create an empty file called forcefsck in the partition’s root directory.

# touch /forcefsck

This empty file will temporarily override any other settings and force fsck to check the filesystem on the next system reboot. Once the filesystem is checked the forcefsck file will be removed thus next time you reboot your filesystem will NOT be checked again. To enable more permanent solution and force filesystem check on every reboot we need to manipulate filesystem’s “Maximum mount count” parameter. The following linux command will ensure that filesystem /dev/sdb1 is checked every time your Linux system reboots. Please note that for this to happen the fsck’s PASS value in /etc/fstab must be set to a positive integer as discussed above.

# tune2fs -c 1 /dev/sdb1

alternatively we can set fsck after every 10 reboots:

# tune2fs -c 10 /dev/sdb1

Force fsck for all other non-root partitions

As oppose to root partition creating empty forcefsck file will NOT trigger partition check on reboot. The only way to force fsck on all other non-root partitions is to manipulate filesystem’s “Maximum mount count” parameter and PASS value within /etc/fstab configuration file. To force filesystem check on non-root partition change fsck’s PASS value in /etc/fstab to value 2. For example:

UUID=c6e22f63-e63c-40ed-bf9b-bb4a10f2db66 /mnt            ext2    errors=remount-ro 0      2

and change maximum mounts filesystem parameter to a positive integer, depending on how many times you wish to allow a specified filesystem to be mounted without being checked. Force fsck on every reboot:

# tune2fs -c 1 /dev/sdb1

alternatively we can set fsck to check filesystem after every 5 reboots:

# tune2fs -c 5 /dev/sdb1

To disable fsck run:

# tune2fs -c 0 /dev/sdb1
OR
# tune2fs -c -1 /dev/sdb1

Which will set the filesystem’s “Maximum mount count” parameter to -1

.bashrc不起作用与bash初始化文件执行顺序

原文:https://finisky.github.io/2020/03/29/bashstartupfiles/

.bashrc不起作用

按习惯在HOME中添加了.bashrc文件,定义一些alias和PS1,结果发现putty登录之后并未生效,还须手动source .bashrc,在~/目录增加.bash_profile或.profile解决:

 ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

但问题的根源在于.bash_profile .bashrc .bash_login .profile几个文件的执行顺序。

.bash_profile .bashrc .bash_login .profile执行顺序

bash startup文件执行顺序

man是个好东西,man bash:

When bash is invoked as an interactive login shell, or as a non-interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The –noprofile option may be used when the shell is started to inhibit this behavior.

可见这些文件的执行顺序如下:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

但同时需要注意前提条件是bash是interactive login shell,那什么是interactive shell,什么是login shell?

interactive shell和login shell

A login shell is one whose first character of argument zero is a -, or one started with the –login option.

An interactive shell is one started without non-option arguments (unless -s is specified) and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.

上面的定义虽然字字都能看懂,但按字面理解起来比较困难。通俗地来说,interactive shell就是需要人机交互的,比如执行一个脚本就不需要人机交互。login shell就是是否需要登录,比如本地再开一个terminal就不需要再次登录。

参考如下实例对二者排列组合: # Differentiate Interactive login and non-interactive non-login shell

  • interactive login shell: 远程登录,如ssh
  • interactive non-login shell: 本地起一个bash
  • non-interactive non-login shell: 运行脚本
  • non-interactive login shell: 少见

可以用如下命令测试当前环境是什么样的bash:

~$: echo $-; shopt login_shell
himBHs
login_shell     on

第一行中如果含有字母i则是iteractive shell;第二行显而易见。上述执行结果是ssh,可见ssh是iteractive login shell。

 

.bashrc又在什么时候被调用?

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist.

好了,因为putty通过ssh登录,因此它是iteractive login shell,所以不会调用.bashrc,因此开头增加.bash_profile或.profile文件的目的就是调用.bashrc。

Tips: Linux中有许多不同版本的shell,如sh、csh、tcsh、zsh等。它们之间有一定的继承和渊源,有兴趣可以了解一下。只不过bash在当前的发行版中最为常见。

virtualbox 6.1安装windows xp

系统安装

1.安装系统;

2.重启->F8进入安全模式;

3.安装virtualbox guest additions驱动

4.正常启动至系统。

4k设置

在虚拟机参数设置中

displayer TAB

Scal Fact设置为200%

 

解决杂音问题

将音频输出改为alsa

 

 

ubuntu设置环境变量

将环境变量写入.profile

以设置golang环境变量为例

 

#GOROOT is the location where Go package is installed on your system.
export GOROOT=/usr/local/go 
#GOPATH is the location of your work directory. For example my project directory is ~/Projects/Proj1 .
export GOPATH=$HOME/Projects/Proj1 
#Now set the PATH variable to access go binary system wide.
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

将上述变量写入.profile

使环境变量生效

$ source ~/.profile

 

fstab (简体中文)

原文:https://wiki.archlinux.org/index.php/Fstab_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

 

fstab(5)文件可用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统。

每个文件系统在一个单独的行中描述。这些定义将在引导时动态地转换为系统挂载单元,并在系统管理器的配置重新加载时转换。在启动需要挂载的服务之前,默认设置会自动fsck和挂载文件系统。例如,systemd会自动确保远程文件系统挂载(如NFSSamba)仅在网络设置完成后启动。因此,在/etc/fstab中指定的本地和远程文件系统挂载应该是开箱即用的。有关详细信息,请参阅 systemd.mount(5) 。

mount命令将使用fstab,如果仅给出其中一个目录或设备,则填充其他参数的值。 这样做时,也将使用fstab中列出的挂载选项。

文件示例

一个简单的 /etc/fstab,使用内核名称标识磁盘:

/etc/fstab
# <file system>        <dir>         <type>    <options>             <dump> <pass>
tmpfs                  /tmp          tmpfs     nodev,nosuid          0      0
/dev/sda1              /             ext4      defaults,noatime      0      1
/dev/sda2              none          swap      defaults              0      0
/dev/sda3              /home         ext4      defaults,noatime      0      2

字段定义

/etc/fstab 文件包含了如下字段,通过空格或 Tab 分隔:

<file system>	<dir>	<type>	<options>	<dump>	<pass>
  • <file systems> – 要挂载的分区或存储设备.
  • <dir> – <file systems>的挂载位置。
  • <type> – 要挂载设备或是分区的文件系统类型,支持许多种不同的文件系统:ext2ext3ext4reiserfsxfsjfssmbfsiso9660vfatntfsswap 及 auto。 设置成auto类型,mount 命令会猜测使用的文件系统类型,对 CDROM 和 DVD 等移动设备是非常有用的。
  • <options> – 挂载时使用的参数,注意有些 参数是特定文件系统才有的。一些比较常用的参数有 (mount(8)):
  • auto – 在启动时或键入了 mount -a 命令时自动挂载。
  • noauto – 只在你的命令下被挂载。
  • exec – 允许执行此分区的二进制文件。
  • noexec – 不允许执行此文件系统上的二进制文件。
  • ro – 以只读模式挂载文件系统。
  • rw – 以读写模式挂载文件系统。
  • user – 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexecnosuidnodev 参数。
  • users – 允许所有 users 组中的用户挂载文件系统.
  • nouser – 只能被 root 挂载。
  • owner – 允许设备所有者挂载.
  • sync – I/O 同步进行。
  • async – I/O 异步进行。
  • dev – 解析文件系统上的块特殊设备。
  • nodev – 不解析文件系统上的块特殊设备。
  • suid – 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。
  • nosuid – 禁止 suid 操作和设定 sgid 位。
  • noatime – 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。
  • nodiratime – 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。
  • relatime – 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。
  • flush – vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。
  • defaults – 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rwsuiddevexecautonouserasync.
  • <dump> dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 <dump> 应设为 0。
  • <pass> fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。

文件系统标识

在 /etc/fstab配置文件中你可以以三种不同的方法表示文件系统:内核名称、UUID 或者 label。使用 UUID 或是 label 的好处在于它们与磁盘顺序无关。如果你在 BIOS 中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些 BIOS 可能会随机地改变存储设备的顺序,那么用 UUID 或是 label 来表示将更有效。参见 持久化块设备名称 。

要显示分区的基本信息请运行:

$ lsblk -f
NAME   FSTYPE LABEL      UUID                                 MOUNTPOINT
sda                                                         
├─sda1 ext4   Arch_Linux 978e3e81-8048-4ae1-8a06-aa727458e8ff /
├─sda2 ntfs   Windows    6C1093E61093B594                     
└─sda3 ext4   Storage    f838b24e-3a66-4d02-86f4-a2e73e454336 /media/Storage
sdb                                                           
├─sdb1 ntfs   Games      9E68F00568EFD9D3                     
└─sdb2 ext4   Backup     14d50a6c-e083-42f2-b9c4-bc8bae38d274 /media/Backup
sdc                                                           
└─sdc1 vfat   Camera     47FA-4071                            /media/Camera

内核名称

你可以使用 fdisk -l 来获得内核名称,前缀是 dev.

标签

注意: 使用这一方法,每一个标签必须是唯一的.

添加标签的工具和方法位于 这里。要显示所有设备的标签,可以使用 lsblk -f 命令。在 /etc/fstab 中使用 LABEL= 作为设备名的开头 :

/etc/fstab
# <file system>        <dir>         <type>    <options>             <dump> <pass>

tmpfs                  /tmp          tmpfs     nodev,nosuid   0      0
 
LABEL=Arch_Linux       /             ext4      defaults,noatime      0      1
LABEL=Arch_Swap        none          swap      defaults              0      0

UUID

所有分区和设备都有唯一的 UUID。它们由文件系统生成工具 (mkfs.*) 在创建文件系统时生成。

lsblk -f 命令将显示所有设备的 UUID 值。/etc/fstab 中使用 UUID= 前缀:

/etc/fstab
# <file system>                           <dir>         <type>    <options>             <dump> <pass>

tmpfs                                     /tmp          tmpfs     nodev,nosuid          0      0
 
UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26 /     ext4              defaults,noatime      0      1
UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff /home ext4              defaults,noatime      0      2
UUID=4209c845-f495-4c43-8a03-5363dd433153 none  swap              defaults              0      0

提示和技巧

自动挂载

  • 如果 /home 分区较大,可以让不依赖 /home 分区的服务先启动。把下面的参数添加到 /etc/fstab 文件中 /home 项目的参数部分即可:
noauto,x-systemd.automount

这样 /home 分区只有需要访问时才会被挂载。内核会缓存所有的文件操作,直到 /home 分区准备完成。

注意: 这样做会使 /home 的文件系统类型被识别为 autofs,造成 mlocate 查询时忽略该目录。实际加速效果因配置而异,所以请自己权衡是否需要。
  • 挂载远程文件系统也是同理。如果你仅想在需要的时候才挂载,也可以添加 noauto,x-systemd.automount 参数。另外,可以设置 x-systemd.device-timeout=# 参数,设置超时时间,以防止网络资源不能访问的时候浪费时间。
  • 如果你的加密文件系统需要密钥,则需要添加 noauto 参数到 /etc/crypttab 文件中的对应位置。systemd 开机的时候就不会打开这个加密设备,会一直等待到设备被访问时再使用密钥文件挂载。比如在使用加密RAID设备的时候可以节省一定的时间,因为 systemd 不必等到设备可用后才能访问。例如:
/etc/crypttab
data /dev/md0 /root/key noauto

交换分区 UUID

如果交换分区没有 UUID,可以手动加入。如果使用 lsblk -f 命令没有列出交换分区的 UUID 就说明发生了这种情况。下面是为交换分区指定 UUID 的步骤:

确定交换分区:

# swapon -s

禁用交换分区:

# swapoff /dev/sda7

用新 UUID 重新创建交换分区:

# mkswap -U random /dev/sda7

激活交换分区:

# swapon /dev/sda7

路径名有空格

如果挂载的路径中有空格,可以使用 “\040” 转义字符来表示空格(以三位八进制数来进行表示)

/etc/fstab
UUID=47FA-4071     /home/username/Camera\040Pictures   vfat  defaults,noatime      0  2
/dev/sda7          /media/100\040GB\040(Storage)       ext4  defaults,noatime,user  0  0

外部设备

外部设备在插入时挂载,在未插入时忽略。这需要 nofail 选项,可以在启动时若设备不存在直接忽略它而不报错.

/etc/fstab
 /dev/sdg1    /media/backup    jfs    defaults,nofail    0  2

atime 参数

使用 noatimenodiratime 或 relatime 可以提升 ext2, ext3 及 ext4 格式磁盘的性能。 Linux 在默认情况下使用atime选项,每次在磁盘上读取(或写入)数据时都会产生一个记录。这是为服务器设计的,在桌面使用中意义不大。默认的 atime 选项最大的问题在于即使从页面缓存读取文件(从内存而不是磁盘读取),也会产生磁盘写操作!

使用 noatime 选项阻止了读文件时的写操作。大部分应用程序都能很好工作。只有少数程序如 Mutt 需要这些信息。Mutt 的用户应该使用 relatime 选项。使用 relatime 选项后,只有文件被修改时才会产生文件访问时间写操作。nodiratime 选项仅对目录禁用了文件访问时间。relatime 是比较好的折衷,Mutt 等程序还能工作,但是仍然能够通过减少访问时间更新提升系统性能。

注意: noatime 已经包含了 nodiratime。不需要同时指定。

tmpfs

tmpfs 是一个临时文件系统,驻留于你的交换分区或是内存中(取决于你的使用情况)。使用它可以提高文件访问速度,并能保证重启时会自动清除这些文件。

经常使用 tmpfs 的目录有 /tmp/var/lock and /var/run. 不要将之使用于 /var/tmp, 因为这一目录中的临时文件在重启过程中需要被保留。使用 tmpfs /run 目录,/var/run 和 /var/lock 是为了兼容老版本建立的链接。默认 /etc/fstab中的的/tmp也是 tmpfs.

默认情况下, tmpfs 分区被设置为你总的内存的一半,当然你可以自由设定这一值。注意实际中内存和交换分区的使用情况取决于你的使用情况,而 tmpfs 分区在其真正使用前是不会占用存储空间的。

要将 /tmp 放到 tmpfs,将下行加入 /etc/fstab

/etc/fstab
.....
tmpfs /tmp      tmpfs nodev,nosuid                 0 0
.....

可以指定大小,但不要修改 mode 选项,以保证文件具有正确的访问权限(1777)。在上例中 /tmp 将最多使用一半内存,要指定最大空间,使用 size 挂载选项:

/etc/fstab
.....
tmpfs /tmp      tmpfs nodev,nosuid,size=2G          0 0
.....

这里有一个更高级的例子,展示如何为用户添加 tmpfs 挂载。这对于网站、mysql 临时文件, ~/.vim/, 和其他情况很有用。尝试并获得理想的挂载选项来完成目标是很重要的。目标是尽量采用安全的策略来防止滥用。限制大小,同时指定 uid 和 gid 加上 mode 是非常安全的。更多信息[断开的链接:无效的部分].

/etc/fstab
tmpfs /www/cache tmpfs rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=648,gid=648,mode=1700 0 0

参阅 mount 命令 man 手册以获得更多的内容。

重启后方能生效。注意不要直接执行 mount -a 命令,因为可能造成无法访问当前目录中的文件(比如你应该保证 lockfiles 的正常存在)。然而,如果它们都是空的,那么就可以直接执行 mount -a 而不必重启电脑。

应用更改后,可以通过 findmnt 检查是否生效:

$ findmnt --target /tmp
TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw,nosuid,nodev,relatime

使用

一般需要大量读写操作的程序在使用 tmpfs 时都会提升性能。有些程序把共享内存放到 tmpfs 上时性能会大幅提升,例如将 Firefox Profile 文件夹放到内存后,Firefox 性能大幅提升。

Note: tmpfs 目录(/tmp) 挂载时需要去掉 noexec 参数,否则有些编译程序无法执行,此外,tmpfs 的默认大小是内存的一半,可能会产生空间不够的问题。

下面命令可以让makepkg在tmpfs目录进行编辑,也可以在在/etc/makepkg.conf中进行设置:

$ BUILDDIR=/tmp/makepkg makepkg

普通用户读写 FAT32

为了取得对 FAT32 分区的写权限,你必须修改/etc/fstab文件。

/etc/fstab
/dev/sdxY    /mnt/some_folder  vfat   user,rw,umask=000              0  0

“users”标签的意思是任何用户(甚至非 root 用户)都可以挂载或卸载分区 ‘/dev/sdX’。“rw”标签则分配读写的使用权。但我不知道“umask”标签的意义(umask 是权限掩码命令 umask=000 指任何人没有特权,且权限为777,即所有人都可以读、写、执行)。我曾试图在“man mount”中查询,但是没有什么结果。

比如你的 FAT32 分区在 ‘/dev/sda9’,你想将其挂载到 ‘/mnt/fat32’,那么你需要输入并运行

/etc/fstab
/dev/sda9    /mnt/fat32        vfat   user,rw,umask=111,dmask=000    0  0

Ubuntu HDMI输出声音

Ubuntu无法通过HDMI输出声音且设置中输出设备无HDMI的解决办法

https://blog.csdn.net/ZehShin/article/details/105859388

30/10/2020 Update

It seems like the problem is fixed in Ubuntu 20.04. If there still exits the problem, this method works anyway.

问题背景

Ubuntu系统经常出现没有声音的情况,大部分问题都可以在目前的中文网络上找到相对应的文章并进行解决。其中HDMI无法输出声音的问题,通常都可以通过:在“Settings-Sounds”切换输出设备、安装pavucontrol切换配置文件、运行alsamixer取消mute,这几个方法进行解决。

但是,笔者17年购入了目前所使用的Thinkpad P51(i7+M1200,联想官方声称该机型通过了ubuntu认证)并安装了Ubuntu 16.04,就遇到了通过HDMI接口外接显示器(或电视)后,无法通过显示器(或电视)端的声音设备输出声音的问题,且在尝试上述的三种解决方法时都无法找到切换为HDMI的选项,HDMI的声音输出选项仿佛在电脑中消失了。系统更新为18.04后该问题依然存在。

该问题长期悬而未决,终于近日(3年后的昨天)让笔者在Nvidia的开发者社区和freedesktop上找到了解决方法,记录在此供将来重装系统参考。

问题描述

事实上,这个问题14年就在freedesktop上被报告🔗,报告者用的是一台Dell XPS 15(GT 540M显卡),在Windows下正常使用,在Ubuntu下无法识别HDMI声音设备。1

17年9月再次出现在Nvidia的开发者社区🔗,这次报告者用的一块GTX1080显卡。同样是无法通过HDMI输出声音。2

可以通过下列三种方式来共同查看该问题的特征。

查看声卡

命令:

aplay -l

 

输出:

**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC298 Analog [ALC298 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

 

只有PCH [HDA Intel PCH]一种,找不到NVidia相关信息。

查看音频相关的pci设备

命令:

lspci | grep -i audio

 

输出:

00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31)

 

同样找不到NVIDIA相关信息。

直接硬件访问再次查看音频相关的pci设备

命令:

sudo lspci -H1| grep -i audio

 

输出:

00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31)
01:00.1 Audio device: NVIDIA Corporation Device 0fbc (rev a1)

 

这次有了NVIDIA相关信息了,说明并没有硬件问题。

解决方法

经笔者个人测试,方法一、二欠佳,可只看方法三。

方法一:重新扫描声卡

在freedesktop的帖子🔗中,报告者自己尝试了去解决这个问题。经过他的检查,发现重新扫描后可以检测到声卡。1

  • Start the system, and stop the display manager (lightdm/gdm)
  • Load the nouveau module
  • Remove the Nvidia card from the PCI bus (echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove)
  • Rescan the PCI bus (echo “1” > /sys/bus/pci/rescan)

这个方法比较繁琐,不适合笔者这样的小白,而且并不能一劳永逸。

方法二:编写重扫脚本

Nvidia的开发者社区中帖子的2楼🔗提供了一个重扫脚本2

setpci -s 01:00.0 0x488.l=0x2000000:0x2000000
rmmod nvidia-drm nvidia-modeset nvidia
echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove
echo 1 > /sys/bus/pci/devices/0000:00:01.0/rescan
modprobe nvidia-drm
xinit -- -retro

 

略简单,但仍然不够自动化,且电脑每次开机或从睡眠、待机中恢复时仍需要重新运行。

方法三:安装控制模块

在freedesktop的帖子的36楼🔗,一位叫Maik Freudenberg的大神将参考了这个解决思路写成了一个模块,并发布在了GitHub上,项目名为nvhda🔗。这个模块以C编写,使用方法在README.md中写的很明确了。3

笔者使用的是Ubuntu 18.04,使用过程如下。

安装模块

命令:

git clone git://github.com/hhfeuer/nvhda.git
cd nvhda
make
sudo make install

 

加载模块

命令:

sudo modprobe nvhda

 

打开HDMI声卡

命令:

sudo tee /proc/acpi/nvhda <<<ON

 

这时,如果再运行此前的aplay -llspci | grep -i audio应该都可以看到NVIDIA的相关信息了。在Settings-Sounds中也可以看到以HDMI为声音输出的选项了。

配置模块自动加载及声卡自动开启

此时声音已经可以通过HDMI设备输出,但每次重启后或从睡眠、待机中恢复,都需要重新加载模块、打开声卡。如想开机自启动或从睡眠、待机中恢复时仍然保持的话,仍需一些其他步骤:

自动加载模块

将模块名称nvhda贴入/etc/modules文件即可。
命令:

sudo gedit /etc/modules

 

贴入内容:

nvhda

 

自动开启声卡

大神已经也已在scripts中提供了自动开启的相关脚本,只需要将相关脚本复制进/etc/systemd/system并设置其启动就可以了。

命令:

sudo cp /scripts/nvhda-start.service /etc/systemd/system
sudo systemctl enable nvhda-start
sudo cp /scripts/nvhda-resume.service /etc/systemd/system
sudo systemctl enable nvhda-resume

 

查看声卡状态

命令:

cat /proc/acpi/nvhda

 

ON为开启,OFF为关闭

关闭HDMI声卡

如果需要关闭HDMI声卡,则命令为:

sudo tee /proc/acpi/nvhda <<<OFF
  • 1

问题原因

Nvidia的开发者社区中帖子的2楼🔗提到,这是因为一些笔记本在启动时禁用了 GPU的PCI音频设备。2

For some reason, a lot of recent laptops are set up to boot with the GPU’s PCI audio function disabled. I haven’t done much investigation, but you can turn on the audio function and make the kernel see it by setting the appropriate PCI configuration bit and then telling the kernel to rescan the PCI bus on the PCI bridge the GPU is connected to.
Unfortunately, the kernel won’t see the audio function unless you remove the graphics function first, which temporarily breaks the console. Because of that, it works best if you write a script to do it so you don’t have to SSH into the system or try to type the commands into the console blind. Obviously, you have to stop the X server first so that you can unload the NVIDIA drivers.

 

通过两个或多个输出/设备播放声音

https://qastack.cn/ubuntu/78174/play-sound-through-two-or-more-outputs-devices

有了paprefs你有机会获得一个虚拟的输出设备,使同时输出到所有连接声卡/设备:

sudo apt install paprefs 

然后在终端运行中paprefs,选择“同步输出”选项卡,然后选中“添加虚拟输出以在所有本地声卡上同时输出”。

纸浆

可以从Pulseaudio声音首选项菜单的“输出”选项卡中选择另外创建的用于同时输出的音频输出设备:

在此处输入图片说明

在此示例中,它显示为HDMI设备,但是一旦您的蓝牙设备被识别,它也将可用于同时输出。

更改可能需要重新启动Pulseaudio才能通过注销并重新登录到会话或pulseaudio -k在终端中运行来生效。

 

在Kubuntu 18.04中,paprefs不需要Plasma 5.12 ,因为已经存在类似的设置:

在此处输入图片说明

重新启动后,应该会提供一个新的输出选项,称为“同步输出”。

在此处输入图片说明

或在pavucontrol

在此处输入图片说明


在等离子5.13.5的18.10中,“同步输出”选项已被删除,因此aprefs是必需的。

 

为了补充Takkat的出色回答,我发现为新设备提供的默认名称过长,并且扭曲了“声音设置”对话框。为了简化该名称,我不得不另外执行以下命令:

gconftool --set --type string /system/pulseaudio/modules/combine/args0 sink_properties=device.description=Combined

组合设备的声音设置

 

由于需要用HDMI外接音频设备,故想要改变电脑输出,本人用的为Ubuntu14.04,开始在网上搜寻怎么更改,查到需在声音设置里面更改音频输出为HDMI,可当我打开声音设置,嗯?怎么我的这么简单,我以为是我安装的问题,又看了其他同学的电脑包括Ubuntu16.04的,也是这个样子,没有什么HDMI输出的选项(有知道为什么的求告知),于是放弃了,然后找到了另外一个特别简单实用的方法。

 

Ubuntu 安装 Sound Switcher Indicator

https://blog.csdn.net/qq_30460905/article/details/79031699?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf

通过命令行安装Sound Switcher Indicator,这 是一款选择 Ubuntu 声音输入/输出的面板应用小程序。可以实现耳机、扬声器和 HDMI 音效输出之间切换,无需进入系统设置>声音来改变多种音效装置之间切换。打开终端输入下面几行命令即可,安装完重启电脑,就会在界面右上角发现一个天线的标志,那就OK了!

 

sudo apt-add-repository ppa:yktooo/ppa
sudo apt-get update
sudo apt-get install indicator-sound-switcher

界面如下,可随时切换 

图像魔术:ImageMagick轻松转换PDF和图片

来源:http://www.mintos.org/soft/convert-picpdf.html

ImageMagick 是一套开源的图像处理工具,主要用于命令行和其他图形软件后台调用,其功能非常强大。当然,对于 Linux 桌面用户而言,尤其是新手朋友,可能对命令行望而生畏。其实,只要掌握 ImageMagick 最常用、也是最简单的两条命令就可以了。

薄荷君本文主要介绍的是如何使用 ImageMagick 工具中的命令把 JPG、PNG 等图片转换为一个连续页面的 PDF 文档,以及如何使用 ImageMagick 工具中的命令将 PDF 文档转换成单独的多张图片。

其实 Ubuntu 及其衍生版(LinuxMint/PopOS/ZorinOS 等)中一般均预装了 ImageMagick,可以直接使用。如果没有安装的,请在终端中使用如下命令安装:
sudo apt install imagemagick

PART A:图片合并为 PDF
在图片所在的文件夹中打开终端,使用如下命令,将多张图片连续地整合成一个 PDF 文档(1.pdf,输出文档名可以自己设置)。注意:默认情况下是按照图片文件名排序进行合并,同时最好是同样大小的图片,这样输出的 PDF 更美观。
将当前文件夹下所有 JPG 图片合并为一个 PDF 文档:convert *.jpg 1.pdf
将当前文件夹下指定的图片合并为一个 PDF 文档:conert 01.jpg 02.png 1.pdf

可能有些发行版在使用 ImageMagick 工具的 convert 命令时会出现没有权限的错误,如图所示。

这时候需要使用如下命令修改一下 ImageMagick 的配置文件:
sudo gedit /etc/ImageMagick-6/policy.xml

将 PDF 那一行权限中的 none 修改为 read|write,同时在该行下面增加一行:

<policy domain="coder" rights="read|write" pattern="LABEL" />

保存后,再次使用 convert 命令就没问题了。

PART B:PDF 分解为图片
如果要将一个 PDF 文档分解为多张单独的图片,也是非常简单,只要反用 convert 命令就行了:

convert 1.pdf 11.jpg

但是这样分解出来的图片分辨率很低,基本上没啥价值。因此,我们需要为命令添加 2 个参数,让分解输出的图片质量更好。

convert -density 300 -trim 1.pdf -quality 95 11.jpg



density:设定 DPI
trim:修剪边缘
quality:设定输出图片质量

注意:
1.对于分辨率很高的图片,建议先用 gThumb 或 Pix 批量调低后再合并,以控制 PDF 文档大小。
2.如果 convert 合并大量图片时出错,推荐使用 graphicsmagick。graphicsmagick 是源于 ImageMagick 的一个同类工具,用法非常相似。

安装:sudo apt install graphicsmagick
合并:gm convert 1.jpg 1.pdf

小结:对于批量处理图片和合并图片为 PDF 文档,使用 gThumb+ImageMagick 是非常高效的,强烈推荐有需要的朋友使用!

解决wps for linux 中文输入法光标不跟随的问题

原文:https://www.cnblogs.com/xianzhedeyu/p/3187991.html

需要安装qt4-qtconfig和ibus-qt4,安装ibus-qt4之后才能在qt4-qtconfig“界面”选项卡默认输入法选项中看到ibus,选定它,然后设置XIM输入风格为光标跟随风格,保存设置,ibus即可在wps中实现鼠标跟随。
命令:sudo apt-get install qt4-qtconfig
sudo apt-get install ibus-qt4

$qtconfig-qt4

此外,ibus默认设置不能使用键盘+,-上下翻页,可以通过终端调出ibus隐藏的设置,输入指令/usr/lib/ibus-sunpinyin/ibus-setup-sunpinyin ,然后会弹出一
个ibus设置的框,打开它第二个选项卡是一个键盘的选项 ,有“-/=” 把他挑上就可设置+,-上下翻页了,此外还可用它设置半角全角切换等

如果打不开sunpinyin的设置界面,需要手动下载python-ibus_1.5.5-1ubuntu3.2_all.deb

https://launchpad.net/ubuntu/trusty/amd64/python-ibus/1.5.5-1ubuntu3.2