One way to think about this problem is to look at components that people thought were useful in an operating system and then think about what a distributed version might look like.
E.g. for an OS we have:
filesystem
scheduler
cron
Then you can go look at the history of these primitives so the same lessons don't have to be relearned. For example, the Linux kernel has gone through many iterations of its scheduler with cgroups, cfs etc. Why did they do that? Why were previous incarnations not good enough? etc.