The small linux problem thread

I don’t think it’s great that all three of the drives in this pool have write errors. This doesn’t mean it’s the drive, it could be cable - or a HBA.

1 Like

That is what the error means.

But as exovert mentioned, errors on several disks, may point to a deeper issue.
Could be hardware, and the faulted drive may be good, but a cable to a backplane, or a power rail or something may be bad

With 16tb drives, you might want to look at a higher redundancy than z1, as another drive might pop while resilvering…

(I like the masking of serial numbers; bad actors can start RMA’s with “advance replacements” if they get the serial numbers)

I would personally reseat the drives/cables zpool clear, unmount all the datasets, then start a scrub.
If it begins spitting errors on just the one drive, order another drive and personally not use the pool to reduce stress in the other drives, as it would have no redundancy.

If errors on multiple devices, then see if there is another controller you can attach then to?

If the pool has two z1 vdevs, and the drives on the other z1 are error free, perhaps just switching the six data cables before the zpool clear&scrub?

Thanks, i guess all 3 drives have issues and its very unlikely they all broke at the same time.

I was just copying stuff over to it from my old server, so all the data is still safe. The ssd pool has no errors, so probably not a memory issue? The 2 ssd’s have the same sata cables and the smart data of the 3 drives have no issues. the 2 ssd’s are on a different controller.

I’m not at home at the moment. so i’ll just leave it running. but i’m think it’s an issue with the motherboard (these are connected to sata ports on the chipset) or a power issue. I’ll switch them around and do a memory test when i get back. of those are not the issue i’ll put in a new power supply.

After scrubbing i have checksum errors. it shows on 2 because the 3rd has already been faulted and is not being used anymore.
image

First time Ubuntu’s software updater got stuck after multiple reboots and retries:

A snippet of output of ps -ef --forest
root        3643       1  4 13:43 ?        00:01:27 /usr/bin/python3 /usr/sbin/aptd
root      643225    3643  0 14:12 pts/2    00:00:00  \_ /usr/bin/python3 /usr/sbin/aptd
root      644605  643225  0 14:12 pts/3    00:00:00      \_ /usr/bin/dpkg --status-fd 60 --configure --pending
root      644606  644605  3 14:12 pts/3    00:00:01          \_ /usr/bin/perl -w /usr/share/debconf/frontend /var/lib/dpkg/info/grub-efi-amd64-signed.postinst configure 1.192+2.06-2ubuntu16
root      644624  644606  0 14:12 pts/3    00:00:00              \_ /bin/sh /var/lib/dpkg/info/grub-efi-amd64-signed.postinst configure 1.192+2.06-2ubuntu16
root      644630  644624  1 14:12 pts/3    00:00:00                  \_ /bin/bash /usr/lib/grub/grub-multi-install --target=x86_64-efi
root      745852  644630  0 14:12 pts/3    00:00:00                      \_ /bin/bash /usr/lib/grub/grub-multi-install --target=x86_64-efi
root      745853  745852  0 14:12 pts/3    00:00:00                          \_ /bin/bash /usr/lib/grub/grub-multi-install --target=x86_64-efi
root      745854  745852  0 14:12 pts/3    00:00:00                          \_ sort -t: -k2 -u


It’s just on an endless stream of “Use of uninitialized value $_[1] in join or string at /usr/share/perl5/Debconf/DbDriver/Stack.pm line 111, line (insert_integer_here)”.

So I went to check out that file referenced by the error message…

Stack.pm
#!/usr/bin/perl -w
# This file was preprocessed, do not edit!


package Debconf::DbDriver::Stack;
use strict;
use Debconf::Log qw{:all};
use Debconf::Iterator;
use base 'Debconf::DbDriver::Copy';



use fields qw(stack stack_change_errors);


sub init {
	my $this=shift;

	if (! ref $this->{stack}) {
		my @stack;
		foreach my $name (split(/\s*,\s/, $this->{stack})) {
			my $driver=$this->driver($name);
			unless (defined $driver) {
				$this->error("could not find a db named \"$name\" to use in the stack (it should be defined before the stack in the config file)");
				next;
			}
			push @stack, $driver;
		}
		$this->{stack}=[@stack];
	}

	$this->error("no stack set") if ! ref $this->{stack};
	$this->error("stack is empty") if ! @{$this->{stack}};
}


sub iterator {
	my $this=shift;

	my %seen;
	my @iterators = map { $_->iterator } @{$this->{stack}};
	my $i = pop @iterators;
	my $iterator=Debconf::Iterator->new(callback => sub {
		for (;;) {
			while (my $ret = $i->iterate) {
				next if $seen{$ret};
				$seen{$ret}=1;
				return $ret;
			}
			$i = pop @iterators;
			return undef unless defined $i;
		}
	});
}


sub shutdown {
	my $this=shift;

	my $ret=1;
	foreach my $driver (@{$this->{stack}}) {
		$ret=undef if not defined $driver->shutdown(@_);
	}

	if ($this->{stack_change_errors}) {
		$this->error("unable to save changes to: ".
			join(" ", @{$this->{stack_change_errors}}));
		$ret=undef;
	}

	return $ret;
}


sub exists {
	my $this=shift;

	foreach my $driver (@{$this->{stack}}) {
		return 1 if $driver->exists(@_);
	}
	return 0;
}

sub _query {
	my $this=shift;
	my $command=shift;
	shift; # this again
	
	debug "db $this->{name}" => "trying to $command(@_) ..";
	foreach my $driver (@{$this->{stack}}) {
		if (wantarray) {
			my @ret=$driver->$command(@_);
			debug "db $this->{name}" => "$command done by $driver->{name}" if @ret;
			return @ret if @ret;
		}
		else {
			my $ret=$driver->$command(@_);
			debug "db $this->{name}" => "$command done by $driver->{name}" if defined $ret;
			return $ret if defined $ret;
		}
	}
	return; # failure
}

sub _change {
	my $this=shift;
	my $command=shift;
	shift; # this again
	my $item=shift;

	debug "db $this->{name}" => "trying to $command($item @_) ..";

	foreach my $driver (@{$this->{stack}}) {
		if ($driver->exists($item)) {
			last if $driver->{readonly}; # nope, hit a readonly one
			debug "db $this->{name}" => "passing to $driver->{name} ..";
			return $driver->$command($item, @_);
		}
	}

	my $src=0;

	foreach my $driver (@{$this->{stack}}) {
		if ($driver->exists($item)) {
			my $ret=$this->_nochange($driver, $command, $item, @_);
			if (defined $ret) {
				debug "db $this->{name}" => "skipped $command($item) as it would have no effect";
				return $ret;
			}

			$src=$driver;
			last
		}
	}

	my $writer;
	foreach my $driver (@{$this->{stack}}) {
		if ($driver == $src) {
			push @{$this->{stack_change_errors}}, $item;
			return;
		}
		if (! $driver->{readonly}) {
			if ($command eq 'addowner') {
				if ($driver->accept($item, $_[1])) {
					$writer=$driver;
					last;
				}
			}
			elsif ($driver->accept($item)) {
				$writer=$driver;
				last;
			}
		}
	}
	
	unless ($writer) {
		debug "db $this->{name}" => "FAILED $command";
		return;
	}

	if ($src) {		
		$this->copy($item, $src, $writer);
	}

	debug "db $this->{name}" => "passing to $writer->{name} ..";
	return $writer->$command($item, @_);
}

sub _nochange {
	my $this=shift;
	my $driver=shift;
	my $command=shift;
	my $item=shift;

	if ($command eq 'addowner') {
		my $value=shift;
		foreach my $owner ($driver->owners($item)) {
			return $value if $owner eq $value;
		}
		return;
	}
	elsif ($command eq 'removeowner') {
		my $value=shift;
		
		foreach my $owner ($driver->owners($item)) {
			return if $owner eq $value;
		}
		return $value; # no change
	}
	elsif ($command eq 'removefield') {
		my $value=shift;
		
		foreach my $field ($driver->fields($item)) {
			return if $field eq $value;
		}
		return $value; # no change
	}

	my @list;
	my $get;
	if ($command eq 'setfield') {
		@list=$driver->fields($item);
		$get='getfield';
	}
	elsif ($command eq 'setflag') {
		@list=$driver->flags($item);
		$get='getflag';
	}
	elsif ($command eq 'setvariable') {
		@list=$driver->variables($item);
		$get='getvariable';
	}
	else {
		$this->error("internal error; bad command: $command");
	}

	my $thing=shift;
	my $value=shift;
	my $currentvalue=$driver->$get($item, $thing);
	
	my $exists=0;
	foreach my $i (@list) {
		$exists=1, last if $thing eq $i;
	}
	return $currentvalue unless $exists;

	return $currentvalue if $currentvalue eq $value;
	return undef;
}

sub addowner	{ $_[0]->_change('addowner', @_)	}
sub removeowner { $_[0]->_change('removeowner', @_)	}
sub owners	{ $_[0]->_query('owners', @_)		}
sub getfield	{ $_[0]->_query('getfield', @_)		}
sub setfield	{ $_[0]->_change('setfield', @_)	}
sub removefield { $_[0]->_change('removefield', @_)	}
sub fields	{ $_[0]->_query('fields', @_)		}
sub getflag	{ $_[0]->_query('getflag', @_)		}
sub setflag	{ $_[0]->_change('setflag', @_)		}
sub flags	{ $_[0]->_query('flags', @_)		}
sub getvariable { $_[0]->_query('getvariable', @_)	}
sub setvariable { $_[0]->_change('setvariable', @_)	}
sub variables	{ $_[0]->_query('variables', @_)	}


1

I have neither read nor written a line of Perl prior to this day in my life. But I can tell that line of code puts me at a starting point that is deep in the rabbit hole. :neutral_face:

To find my way up, I’ve been trying to recursively determine all the dependencies on that code.

  1. The problem line referenced in the error message is a debug statement at the top of the _change subroutine within the package Debconf::DbDriver::Stack. At the very bottom of the same file are 12 subroutines that depend on sub _change. (Their names match the regular expression (add|remove)(field|flag|owner|variable).)
  2. package Debconf::Db depends on the stuff in package Debconf::DbDriver. It has a sub makedriver, which I believe is responsible for initializing an instance of one of the packages under the Debconf::DbDriver namespace.
  3. There are three packages that call sub makedriver, but only package Debconf::Config calls it with driver => "Stack". But no matter, where is the input data that feeds the subroutines? There is a curious line in package Debconf::Db that reads die "driver type not specified (perhaps you need to re-read debconf.conf(5))".
  4. Reading debconf.conf(5) takes me to the file /etc/debconf.conf which references “Stack” exactly once:
    Name: configdb
    Driver: Stack
    Stack: config, passwords
    
  5. The “Stack” driver is supposed to act as a collection of of sorts. Looking for the definition of “config” and “passwords” leads me to the files /var/cache/debconf/config.dat and /var/cache/debconf/passwords.dat respectively.

Currently trying to inspect the state of the variables at the point of the error message to determine the offending entry…

EDIT: Ah… weird. After killing perl a few times, the Software Updater says my system is “up to date.” Hmm… suspicious.

Software on this computer is up to date.

I have this feeling that Ubuntu just swept a problem under the rug.

1 Like

Fascinating!

You sir, make me wish I took a computer related path. While I do not really understand what is going on, I do appreciate tinkering and looking under the hood.

Hush now… its burned and incinerated every 6 months anyway :laughing:

1 Like

Probably so. “Has anyone talked to about our lord and savior Debian GNU/Linux Unstable?”

2 Likes

On steam deck when building a project. Application not able to play audio:

[ALSOFT] (EE) Failed to set real-time priority for thread: Operation not permitted (1)
ALSA lib ../../pulse/pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused

Note: I get the ALSOFT real-time priotity warning on my other machine but audio works fine. Only on the deck it’s failing with ALSA lib error.

Tried all the obvious things like updates and rebooting.

So I was going to restart just the pulseaudio service with verbose mode -v

deck@steamdeck ~> systemctl --user restart pulseaudio
Failed to restart pulseaudio.service: Unit pulseaudio.service not found.

wut?

deck@steamdeck ~ [127]> pulseaudio --check
fish: Unknown command: pulseaudio

Error tells me pulseaudio refused connection yet there seems to be no pulseaudio service or instance running? clearly the service exists I think?

I checked logs with jounralctl -r Nothing helpful there.

check pactl info | grep "Server Name". There is a very high chance the Steamdeck is on Pipewire so it won’t find a pulseaudio service, if anything it would be pipewire-pulse.

1 Like
(130)(deck@steamdeck ~)$ pactl info | grep "Server Name"
Server Name: PulseAudio (on PipeWire 0.3.59)

Thanks. Seems to be running PulseAudio “on” PipeWire?

hunting for pipewire logs…

Yes it’s the Pulse implementation for PipeWire, aka pipewire-pulse.

For people to adopt PipeWire over time they needed the backward compatibility with what it was supposed to replace (i.e. Pulse and JACK among other things), so they have their own implementation of each. Otherwise it would have been

image

3 Likes

I can get some info on pipewire with:
systemctl --user status pipewire pipewire-pulse

Summary
● pipewire.service - PipeWire Multimedia Service
     Loaded: loaded (/usr/lib/systemd/user/pipewire.service; disabled; preset: enabled)
     Active: active (running) since Wed 2023-10-18 00:37:56 MDT; 20h ago
TriggeredBy: ● pipewire.socket
   Main PID: 1242 (pipewire)
      Tasks: 2 (limit: 17686)
     Memory: 29.5M
        CPU: 681ms
     CGroup: /user.slice/user-1000.slice/[email protected]/session.slice/pipewire.service
             └─1242 /usr/bin/pipewire

Oct 18 00:37:56 steamdeck systemd[1074]: Started PipeWire Multimedia Service.
Oct 18 00:37:56 steamdeck pipewire[1242]: mod.rt: Can't find xdg-portal: (null)
Oct 18 00:37:56 steamdeck pipewire[1242]: mod.rt: found session bus but no portal

● pipewire-pulse.service - PipeWire PulseAudio
     Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.service; disabled; preset: enabled)
     Active: active (running) since Wed 2023-10-18 00:38:01 MDT; 20h ago
TriggeredBy: ● pipewire-pulse.socket
   Main PID: 1718 (pipewire-pulse)
      Tasks: 2 (limit: 17686)
     Memory: 13.7M
        CPU: 915ms
     CGroup: /user.slice/user-1000.slice/[email protected]/session.slice/pipewire-pulse.service
             └─1718 /usr/bin/pipewire-pulse

Oct 18 00:38:01 steamdeck systemd[1074]: Started PipeWire PulseAudio.
Oct 18 00:38:01 steamdeck pipewire-pulse[1718]: mod.rt: RTKit error: org.freedesktop.DBus.Error.Failed
Oct 18 00:38:01 steamdeck pipewire-pulse[1718]: mod.rt: could not set nice-level to -11: Input/output error

pw-dump > dump.txt spits out about 5700 lines of json config, doesnt look useful in there.

One guide suggested adding user to audio group for RTKit:

(1)(deck@steamdeck ~)$ groups deck
wheel deck
(deck@steamdeck ~)$ sudo usermod -a -G audio deck
[sudo] password for deck: 
(deck@steamdeck ~)$ groups deck
wheel audio deck

rebooted. same error.

Still digging…

And checking wpctl status:

Summary
(deck@steamdeck ~)$ wpctl status
PipeWire 'pipewire-0' [0.3.59, deck@steamdeck, cookie:1558823201]
 └─ Clients:
        32. Plasma PA                           [0.3.59, deck@steamdeck, pid:2436]
        33. pipewire                            [0.3.59, deck@steamdeck, pid:1241]
        34. WirePlumber                         [0.3.59, deck@steamdeck, pid:1242]
        35. WirePlumber [export]                [0.3.59, deck@steamdeck, pid:1242]
        37. wpctl                               [0.3.59, deck@steamdeck, pid:4979]
        62. xdg-desktop-portal                  [0.3.59, deck@steamdeck, pid:2355]
        63. QPulse                              [0.3.59, deck@steamdeck, pid:2574]
        64. pipewire                            [0.3.59, deck@steamdeck, pid:1717]
        77. Steam                               [0.3.59, deck@steamdeck, pid:2895]
        78. Steam Voice Settings                [0.3.59, deck@steamdeck, pid:2895]

Audio
 ├─ Devices:
 │      45. Rembrandt Radeon High Definition Audio Controller [alsa]
 │      46. ACP/ACP3X/ACP6x Audio Coprocessor   [alsa]
 │  
 ├─ Sinks:
 │  *   49. ACP/ACP3X/ACP6x Audio Coprocessor Speaker [vol: 0.61]
 │      50. ACP/ACP3X/ACP6x Audio Coprocessor Headphones [vol: 1.00]
 │  
 ├─ Sink endpoints:
 │  
 ├─ Sources:
 │      39. Filter Chain Source                 [vol: 1.00]
 │  *   51. ACP/ACP3X/ACP6x Audio Coprocessor Headset Microphone + Internal Microphone [vol: 0.67]
 │  
 ├─ Source endpoints:
 │  
 └─ Streams:
        38. filter-chain-capture                                        
             73. input_FL       
             74. monitor_FL     
             75. input_FR       
             76. monitor_FR     

Video
 ├─ Devices:
 │  
 ├─ Sinks:
 │  
 ├─ Sink endpoints:
 │  
 ├─ Sources:
 │  
 ├─ Source endpoints:
 │  
 └─ Streams:

Settings
 └─ Default Configured Node Names:

Found the origin of the message in ALSA lib …/…/pulse/pulse.c:242:(pulse_connect)

Trying to follow it, not sure why its returning connection refused

I don’t know to be honest. I guess it’s possible that Valve built their ALSA and/or PipeWire without support for Real Time or something? Or has other restrictions in place… not sure.

TL;DR: How the hell do I (properly) apply ACLs recursively?

I have a problem/question with permissions…
So I set up a TrueNAS Scale box recently and still trying things out. Currently tinkering around with Permissions.
I have a dataset that the built-in Apps use. With Jellyfin being one of those Apps obviously I need to put some files into it. When setting up Apps the ownership of the dataset automatically goes to a built-in “apps” user. So far so good, not a big deal.
To actually be able to put something in it I added an ACL and added my user with RWX permissions:
image

But I kept getting various errors regarding needing this entry and this other entry and that entry and well, I ended up with this monstrosity:
image

I clearly have no clue about ACLs so I’m wondering is that the right thing to do?
I guess more specifically I’m wondering what the hell is the different between a “normal” and a Default ACL? And why do I need the Default to apply the normal ones recursively :thinking:

setfacl -R -m u:${USER}:rwx ${DIR} sorry I have no idea how to use GUIs.

From what I remember of TrueNAS the UI was often more trouble than it was worth when dealing with ACLs anyway.

Thanks for that, although I got it running as noted above. I was just wondering if that’s the right way to do it :smile:

I didn’t really understand the difference between regular and default ACL entries. However, I got some time earlier and read it up in the ACL man page:

In addition, a directory may have an associated ACL that governs the initial access ACL for objects created within that directory; this ACL is referred to as a default ACL.

So if I’m understanding this right this is just the permissions that new files (or directories) are created with? i.e. if I have a user with a rwx permissions and a default ACL for that user with just rx permissions, they can create a file but then not alter it further or delete it. Is that a reasonable assumption?

I didn’t have any issues with it other then it not being totally clear why it wanted the entries the messages were throwing at me. But to be fair the UI is tailored for sys admins that know about these requirements already.
That said, it seems to be very specific in what needs to be set explicitely. Looking at the manual the setfacl assumes some values for the default ACLs if none are provided, but the UI wants them explicitely.

That’s kind of what I mean. I always felt like this area of the GUI enforced it’s own kind of strange incantations instead of removing the need for such things as a good GUI should, but maybe that’s just me.

1 Like

more fighting with the steam deck, new issue…

trying to install packages fail with:
error: libwebsockets: signature from "David Runge <[email protected]>" is unknown trust

first we disable readonly and populate keyring as usual

sudo steamos-readonly disable
pacman-key --init 
pacman-key --populate archlinux

attempt to install package:
sudo pacman -Syu libwebsockets

(1)(deck@steamdeck ~)$ sudo pacman -Syu libwebsockets
:: Synchronizing package databases...
 jupiter-rel is up to date
 holo-rel is up to date
 core-rel is up to date
 extra-rel is up to date
 community-rel is up to date
 multilib-rel is up to date
:: Starting full system upgrade...
resolving dependencies...
looking for conflicting packages...

Packages (3) libev-4.33-1  libuv-1.44.2-1  libwebsockets-4.3.2-2

Total Download Size:   0.43 MiB
Total Installed Size:  2.19 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages...
 libwebsockets-4.3.2-2-x86_64                                     444.5 KiB   165 KiB/s 00:03 [#######################################################] 100%
(3/3) checking keys in keyring                                                                [#######################################################] 100%
(3/3) checking package integrity                                                              [#######################################################] 100%
error: libwebsockets: signature from "David Runge <[email protected]>" is unknown trust
:: File /var/cache/pacman/pkg/libwebsockets-4.3.2-2-x86_64.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Do you want to delete it? [Y/n] n
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occurred, no packages were upgraded.

i tried also
pacman-key --refresh-keys
this did not work.

edit: tried also starting fresh by deleting gnupg from /etc/pacman.d then re-ran --init and --populate.

I’ve successfully installed packages before with this method, but today seems to not trust anything