Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
f7f4680
feat: nsproxy core - ProcessData migration, sys_unshare, clone, user …
fzg-23 May 26, 2026
ab73628
feat: IPC ns isolation, network ns filtering, and mount fs extensions
fzg-23 May 27, 2026
87d3242
fix: sys_getppid PID namespace translation, LazyLock unification, rem…
fzg-23 May 28, 2026
ddf3f0a
fix: replace deprecated spin::Lazy with spin::LazyLock
fzg-23 May 28, 2026
2106c64
fix: update pid.rs and test CMakeLists, remove temp file
fzg-23 May 28, 2026
8f869b4
feat(starry-kernel): add overlay filesystem support
fzg-23 Jun 9, 2026
d32bc38
fix(starry-kernel): honor overlay whiteout lookup semantics
fzg-23 Jun 11, 2026
eb12498
ci: trigger rebuild
fzg-23 Jun 17, 2026
7055d13
ci: trigger rebuild
fzg-23 Jun 17, 2026
e0ceed8
ci: trigger rebuild
fzg-23 Jun 17, 2026
e0bac26
fix(starry): support basic runc container execution
fzg-23 Jun 24, 2026
bd4c5fb
test(starry): add runc basic qemu coverage
fzg-23 Jun 24, 2026
5008cc1
docs(starry): update mount namespace notes
fzg-23 Jun 24, 2026
3059e65
ci: trigger rebuild
fzg-23 Jun 24, 2026
6fe3500
ci: trigger rebuild
fzg-23 Jun 24, 2026
a2cc6d5
ci: trigger rebuild
fzg-23 Jun 24, 2026
cdd87db
ci: trigger rebuild
fzg-23 Jun 24, 2026
1171683
ci: trigger rebuild
fzg-23 Jun 24, 2026
a9223d1
ci: trigger rebuild
fzg-23 Jun 24, 2026
30b5444
fix(starry): correct named FIFO open semantics
fzg-23 Jun 25, 2026
eb88e11
fix(starry): stabilize pidfd and proc memory tests
fzg-23 Jun 25, 2026
30356fd
fix(starry-kernel): report synced proc rss stats
fzg-23 Jun 25, 2026
754991a
changed
fzg-23 Jun 26, 2026
210fb92
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
fc2a40f
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
2dcf77a
test(starry): harden aarch64 system tests
fzg-23 Jun 26, 2026
9062c4e
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
e1c3564
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
e5d56c9
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
80e0e2b
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
c1726fe
test(starry): drain build-script wave output
fzg-23 Jun 26, 2026
053a780
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
0788ca9
fix(axbuild): throttle QEMU shell init input
fzg-23 Jun 26, 2026
368438e
fix(axbuild): slow QEMU shell init bursts
fzg-23 Jun 26, 2026
64d63e8
ci: rerun Starry aarch64 qemu
fzg-23 Jun 26, 2026
ba84f32
Add files via upload
fzg-23 Jun 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added StarryOS_项目阶段汇报.pptx
Binary file not shown.
655 changes: 533 additions & 122 deletions components/axfs-ng-vfs/src/mount.rs

Large diffs are not rendered by default.

47 changes: 40 additions & 7 deletions net/ax-net/src/unix/dgram.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ impl Bind {
pub struct DgramTransport {
/// Receiver installed when the socket is bound or paired.
data_rx: Mutex<Option<(async_channel::Receiver<Packet>, Arc<PollSet>)>>,
/// Datagram retained by `MSG_PEEK` until a consuming receive.
peeked: Mutex<Option<Packet>>,
/// Direct peer channel for connected datagram sockets.
connected: RwLock<Option<Channel>>,
/// Address reported as sender on outgoing datagrams.
Expand All @@ -88,6 +90,7 @@ impl DgramTransport {
pub fn new(pid: u32) -> Self {
DgramTransport {
data_rx: Mutex::new(None),
peeked: Mutex::new(None),
connected: RwLock::new(None),
local_addr: RwLock::new(UnixSocketAddr::Unnamed),
poll_state: Arc::default(),
Expand All @@ -103,6 +106,7 @@ impl DgramTransport {
) -> Self {
DgramTransport {
data_rx: Mutex::new(Some(data_rx)),
peeked: Mutex::new(None),
connected: RwLock::new(Some(connected)),
local_addr: RwLock::new(UnixSocketAddr::Unnamed),
poll_state: Arc::default(),
Expand Down Expand Up @@ -265,18 +269,46 @@ impl TransportOps for DgramTransport {
fn recv(&self, mut dst: impl Write, mut options: RecvOptions) -> AxResult<usize> {
let extra_nb = options.flags.contains(RecvFlags::DONTWAIT);
self.general.recv_poller_with(self, extra_nb, move || {
let mut peeked = self.peeked.lock();
let mut guard = self.data_rx.lock();
let Some((rx, _)) = guard.as_mut() else {
return Err(AxError::NotConnected);
};

let Packet { data, cmsg, sender } = match rx.try_recv() {
Ok(packet) => packet,
Err(TryRecvError::Empty) => {
return Err(AxError::WouldBlock);
if options.flags.contains(RecvFlags::PEEK) {
if peeked.is_none() {
*peeked = Some(match rx.try_recv() {
Ok(packet) => packet,
Err(TryRecvError::Empty) => return Err(AxError::WouldBlock),
Err(TryRecvError::Closed) => return Ok(0),
});
}
Err(TryRecvError::Closed) => {
return Ok(0);
let packet = peeked.as_ref().unwrap();
let count = dst.write(&packet.data)?;
if count < packet.data.len() {
warn!(
"UDP message truncated: {} -> {} bytes",
packet.data.len(),
count
);
}
if let Some(from) = options.from.as_mut() {
**from = SocketAddrEx::Unix(packet.sender.clone());
}
return Ok(if options.flags.contains(RecvFlags::TRUNCATE) {
packet.data.len()
} else {
count
});
}

let Packet { data, cmsg, sender } = if let Some(packet) = peeked.take() {
packet
} else {
match rx.try_recv() {
Ok(packet) => packet,
Err(TryRecvError::Empty) => return Err(AxError::WouldBlock),
Err(TryRecvError::Closed) => return Ok(0),
}
};
let count = dst.write(&data)?;
Expand All @@ -303,8 +335,9 @@ impl TransportOps for DgramTransport {
impl Pollable for DgramTransport {
fn poll(&self) -> IoEvents {
let mut events = IoEvents::OUT;
let has_peeked = self.peeked.lock().is_some();
if let Some((rx, _)) = self.data_rx.lock().as_ref() {
events.set(IoEvents::IN, !rx.is_empty());
events.set(IoEvents::IN, has_peeked || !rx.is_empty());
}
events
}
Expand Down
22 changes: 17 additions & 5 deletions os/StarryOS/axnsproxy/src/mnt.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use alloc::sync::Arc;
use core::ffi::c_char;
use core::{
ffi::c_char,
sync::atomic::{AtomicU64, Ordering},
};

use ax_kspin::SpinNoIrq;

Expand All @@ -8,6 +11,8 @@ use ax_kspin::SpinNoIrq;
pub static ROOT_MNT_NS: spin::LazyLock<Arc<SpinNoIrq<MntNamespace>>> =
spin::LazyLock::new(|| Arc::new(SpinNoIrq::new(MntNamespace::new_root())));

static NEXT_MNT_NS_ID: AtomicU64 = AtomicU64::new(2);

const fn pad_mnt_root(root: &str) -> [c_char; 256] {
let mut data: [c_char; 256] = [0; 256];
unsafe {
Expand All @@ -16,21 +21,28 @@ const fn pad_mnt_root(root: &str) -> [c_char; 256] {
data
}

/// Per-process mount namespace.
/// Isolates the set of filesystem mount points seen by a process.
/// In the root namespace `root` starts as `"/"`.
/// Mount namespace identity metadata.
///
/// The namespace-local mount tree is owned by `ax-fs-ng`'s `FsContext`;
/// this object supplies the stable identity shared by nsproxy and namespace
/// file descriptors.
pub struct MntNamespace {
pub ns_id: u64,
pub root: [c_char; 256],
}

impl MntNamespace {
pub fn new_root() -> Self {
Self {
ns_id: 1,
root: pad_mnt_root("/"),
}
}

pub fn clone_ns(&self) -> Self {
Self { root: self.root }
Self {
ns_id: NEXT_MNT_NS_ID.fetch_add(1, Ordering::Relaxed),
root: self.root,
}
}
}
13 changes: 9 additions & 4 deletions os/StarryOS/docs/mount-umount2-linux-compat.md
Original file line number Diff line number Diff line change
Expand Up @@ -662,10 +662,11 @@ pub fn detach(self: &Arc<Self>) -> VfsResult<()> {
|---|---|---|
| `MS_SHARED | MS_PRIVATE` | `EINVAL` | 已支持 |
| `MS_SHARED | MS_BIND` | `EINVAL` | 已支持 |
| `MS_PRIVATE` | 修改已有 mount 的传播属性 | 已支持当前测试覆盖的 private 语义 |
| `MS_SHARED` | 修改已有 mount 的传播属性 | 已支持当前测试覆盖的 shared peer 传播语义 |
| `MS_SLAVE` | 修改已有 mount 的传播属性 | 已支持当前测试覆盖的 slave 单向传播语义 |
| `MS_PRIVATE` | 修改已有 mount 的传播属性 | 已支持当前测试覆盖的 private 语义,停止后续传播 |
| `MS_SHARED` | 修改已有 mount 的传播属性 | 已支持当前测试覆盖的 shared peer 双向传播语义 |
| `MS_SLAVE` | 修改已有 mount 的传播属性 | 已支持当前测试覆盖的 master → slave 单向传播语义 |
| `MS_UNBINDABLE` | 修改已有 mount 的传播属性 | 已支持 bind 禁止与 recursive bind prune |
| propagation flag + `MS_REC` | 递归修改 mount subtree | 已支持 |
| `MS_BIND` | 普通 bind,不带 nested submount | 已支持 |
| `MS_BIND` on subdirectory | bind mount 内部子目录 | 已支持 |
| `MS_BIND|MS_REC` | recursive bind,带 nested submount | 已支持 |
Expand Down Expand Up @@ -715,11 +716,15 @@ pub fn detach(self: &Arc<Self>) -> VfsResult<()> {

## 8. 当前仍未覆盖或未完全实现的点

虽然这次 `util-linux` 测试已经全绿,但仍有一些 Linux mount/namespace 语义没有在本轮实现:
虽然 shared subtree 的核心传播路径已经实现,但仍有一些更深层 Linux
mount/namespace 语义没有完全覆盖:

- 更完整的 shared subtree propagation corner case
- 更复杂 namespace 拓扑下的传播行为
- 真实 peer group 生命周期管理
- 复杂多级 shared+slave 拓扑中的 `propagate_from` 展示与边界行为
- `MS_MOVE` 在 shared subtree 中的全部 Linux 限制和传播规则
- detached mount、过挂载堆栈和传播失败时的完整事务回滚
- 其他普通 mount flags,如 `MS_NODEV`、`MS_NOSUID`、`MS_NOEXEC` 等
- `MNT_FORCE` 的真实强制卸载语义

Expand Down
Loading
Loading