2,897 karma · joined August 7, 2013
Its biggest Achilles heel IMO is the need to always compile everything from scratch with no possibility of caching. Also the fact that incremental rebuilds after changing config options isn't guaranteed to work unless you manually know to know which packages to force nuke and force to recompile (this is intentional design choice for implementation simplicity and well documented). Also having two different boards that inherit from common shared config isn't really supported, everyone just rolls their own custom config splicer at that point.
Yocto fixes those issues, but IMO the most other things are much less ergonomic. While buildroot is extremely simple, yocto is total opposite to that, an architecture astronaut's dream. There is custom language to learn, ton of functionality, config and documentation split in tiny files in different repositories. Of which everyone using slightly different subset to accomplish almost the same thing.
I can't wait to have apps and services crash and burn left and right due to accidentally (or maliciously) created non-UTF8 filenames in world readable directories.
> Also, I really didn't want yet another thing with [...] code to debug (there comes a time in every programmer's life when they can't face debugging yet another thing that should be simple and just work)
... when two paragraphs later comes the code to generate a SVG :)
Case in point, the situation with our flaky/unstable test got so bad that quarter of them are now to set ignore any failures. Pretty much zero interest in fixing.
Meanwhile, the rewrite of a service that had no outstanding bugs (but was originally written by other team but handed to us) is still not done after 4 months...
But I agree I wouldn't extrapolate too much from one such brain fart
Embedded/mobile projects don't tend to use bleeding-edge kernels and stuck on one version regardless of closed source modules anyway.
int (*link) (struct dentry *,struct inode *,struct dentry *);
Let's then look at the ext4 implementation of the link() operation: static int ext4_link(struct dentry *old_dentry,
struct inode *dir, struct dentry *dentry)
{
...
if ((ext4_test_inode_flag(dir, EXT4_INODE_PROJINHERIT)) &&
(!projid_eq(EXT4_I(dir)->i_projid,
EXT4_I(old_dentry->d_inode)->i_projid)))
return -EXDEV;
....
In particular that calls EXT4_I(): static inline struct ext4_inode_info *EXT4_I(struct inode *inode)
{
return container_of(inode, struct ext4_inode_info, vfs_inode);
}
Which is basically just direct unchecked pointer type conversion. So, calling ext4_link() on any non-ext4 created struct inode will blow up badly.Is that something that could be added to modprobe.conf to have it work right without any modprobe calls?
> Huh, onehsot services are listed as stopped even though they've run. Do some research, find out I need the `RemainAfterExit` keyword yet. Sure, dependencies are working.
Yeah I've also been burned not having RemainAfterExit=y in a oneshot unit. What's worse, such an unit can get started multiple times.
> Well looking around at dmesg it looks like the problem is that networkmanager is trying to do something with the device at the same time I am. Looks like it's enumerating device capabilities at the same time I'm trying to create a new device?
To be fair such race condition could have happened in any init system.
> Oh well, I'll just add the retry keyword to my service.
Perhaps having a dependency to start your service before network-manager would have solved this.
> Long story short I ended up just writing a traditional shell-script based init script. Maybe I'm thinking about systemd wrong or something.
It's perfectly fine IMO to have small shell script services for such stuff.
Probably some of the problems are due to network-manager being mostly designed/used for desktop use cases. It also likes to take complete control of all the interfaces so calling iw/ifconfig behind it's back will cause tears (as you found out).
I do agree that race conditions caused by parallel service startup really suck in embedded devices. Systemd really could use a "please be as deterministic as possible" mode for embedded (if it already doesn't have).
Yocto is definitely more flexible, which can be a curse as it gives architecture astronauts more chances to split up all the stuff it several repos and dozens of files.
Besides, even if the database is single-file it's still necessary to use filesystem snapshotting for live backup, or it's likely to get an inconsistent copy.